22時に寝ようと思って2時に寝る。

備忘録や日記を書いてます。きょうは早く寝よう。

いわてアプリコンテスト2015で大賞をいただきました。

f:id:azuuun:20160202234637j:plain

先日、1月30日に行われた岩手県主催のいわてアプリコンテスト2015に出場し、アプリケーション部門大賞とモバイルファクトリー賞をいただきました。

今回は、同じ学部の3人の友人と組んだチームyurueとして応募しました。 ちなみに、ややこしく読み間違われやすいのですが、ゆる良いものを作りたいという意味からyurue(ゆるいー)と読みます。上の写真だと、僕はそばっちの隣の真ん中のやつです。みんな、そばっちのポーズです。

応募から、発表まで何をしたのか、ブログでまとめておこうと思います。

応募まで

いわてアプリコンテスト2015が行われることは知っていたものの、開催時期が期末試験と重なってしまっていたので、正直、かなり迷っていました。応募締切まで一週間に迫ったあたりで、yurueの一人から「アプコン出ないん?」と持ちかけられて、「ん〜〜〜〜〜」と悩んだ末、「よし、やろうか!」と一念発起しました。同時に期末試験はあきらめました。(学生として非常によくない)

やるからには中途半端はなし、ということで、その日から毎日話し合いの機会を設けてアプリ案を書類にまとめる作業、同時進行で、Androidアプリ開発勉強会を行いました。

この時点のメンバーのスキルとして、自分以外はJavaは書けるがAndroidアプリ開発は初めてという状況でした。自分も、Androidアプリ開発は入門レベルしかなく、しょっぱなから"本当に実現できるのだろうか"、という危機感がありました。

応募の方は、問題なく完了しました。この時点で12/18。

激動の1ヶ月半が始まりました(大袈裟)

開発

我ながらコンテスト1ヶ月半前の時点でAndroidアプリ開発を学び始めるのはかなり無謀のように思いました。でも、やるしかない、後に引けない、ということで地道にやっていくことにしました。

最初の10日間

https://gyazo.com/331dc54a67814273d5dbd3a593c1d890

まずは、やさしいAndroidプログラミングの写経から始めました。

やさしいAndroidプログラミング 第3版 (「やさしい」シリーズ)

やさしいAndroidプログラミング 第3版 (「やさしい」シリーズ)

ドキュメント共有サービスのesa.ioを使って、

  • 必要と思われる部分のコードを写経しコードが実行できることを確認し記事にしてメンバーに共有
  • その記事を読みメンバーが写経し、理解。

この繰り返しで、入門レベルの部分を10日ほどでクリアしました。自分が写経し、動いたという保証があるコードをメンバーに写経してもらうことで、変なところで躓くことを防ぐことができました。 躓いたとしても、動くことは保証されているので「俺もそのエラー解決出来ない…」みたいな共倒れは起きませんでした。

調べまくる

入門レベルをクリアしたところで、さっそく先が見えない状況になりました。

「xxxな機能を実装したい」

どうしたらいいんだろう。わからない。

Google先生に聞きまくる。答えが見つかる→実装できる。先人たちの備忘録が本当にありがたかったです。

結局発表の前日まで、Google先生に聞きまくって、やっとのおもいで実装する、その繰り返しでした。

この時点で、周りのメンバーはなかなか厳しい状況になっていて、タスクを割り振っても、しばらくして、進捗を確認すると「出来ない」との返事で、3日後ふたたび確認しても「出来ない」という感じでした。

参考になりそうなサイトや技術書を探して教えてあげるなど、自分なりのサポートをしてみたものの、思うように捗らないようでした。実装できないことで自信をなくしていくのが目に見える感じで、徐々にチーム全体の士気が下がっていきました。この辺、わりと自分も精神的にきつかったです。

自分も力量不足で目の前にあるタスクでいっぱいいっぱいで、メンバーへ教示してあげるという時間も割くことができませんでした。結果、この時点で自分のみコードを書くことになりました。

メンバーには、データベースの入力作業、フリー画像素材の収集などのタスクをお願いすることになりました。

なんだかんだで、かたちになった前日。

https://gyazo.com/4eea6816dcd7039d820fd28770a70956

一週間前にやっと、それっぽい、かたちになってきました。 データベースのデータを乗せて動作確認、「おぉ、動く。スゴイ。」みたいな。

この時、当日発表する資料も同時並行で作っていました。応募した時点で仕様として書いていた機能のいくつかが未だに実装できてない状態だったので、コンテスト三日前に提出しなくてはならない発表資料にもその機能を実装した前提で書いてもいいものだろうか。もし実装できなかったら、その発表資料はどう説明したらいいのか。。。とか考えましたが、結局書きました。

その懸念していた実装は発表前日に完了できたので、結果オーライということになりました。

発表当日

お腹の調子が優れないなどのトラブルがありましたが、なんとか無事に発表することが出来ました。

内容については以下のスライドを用いて発表しました。


発表は思ったよりも会場の反応が良くて、ところどころで軽い笑いが起きたので、「笑いもあるプレゼンをしよう」という目標は達成できました。

他のエントリーした方々のアプリはどれもレベルがとても高くて驚きつつ、内容が面白く、この日はかなり刺激を受けました。

その後、昼にはブース型の説明コーナーがあり、プレゼンを聞いて興味を持ってくれた人がアプリを触りに来てくれたのは、非常にうれしかったです。 この時間に、たくさんの方からフィードバックを得ることが出来ました。 ここでの話は、とても印象的で、充実していて、これまで頑張ってきた一ヶ月が報われた感がありました。

審査結果

f:id:azuuun:20160202234632j:plain

大賞とモバイルファクトリー賞をいただきました。賞金も!

モバイルファクトリー賞では、駅メモのTシャツやぬいぐるみを頂きました。とても、かわいい。 さっそく懇親会でみんな揃って駅メモTシャツを着てました。

まとめ

  • あきらめないで最後までやり遂げられた達成感。
  • 発表したアプリ、Rootersを実際にリリースする段階まで頑張りたい。
  • yurueとしてさらにもっと頑張りたい。
  • 期末試験もベストを尽くした(と思う)

追記

大学で所属しているデジタル手芸サークルの「DH LTM Ver 1.2.6(LT会)」にて報告させて頂きました。 そのときの資料を貼っておきます。

DH LTM Ver 1.2.6 | Facebook

SQLiteでno such columnが出た

Androidアプリ開発でSQLiteを扱っていてno such columnというエラーが出た。

今回は、Androidアプリ外(sqliteBrowserなど)で作成したデータベース(hoge.db)をassetsにコピーして読み込み、活用しているパターンです。

発生したタイミング

  • データベースの内容を更新し、assets内にある古いデータベースから新しいデータベースに入れ替えた。
  • 中身だけ更新しているのでデータベース名は一緒。
  • エミュレータで実行。
  • 「おめーの定義したcolumnねぇから!!」

原因

  • 通常デバッグするときは、エミュレータ内に既にインストールされている開発中のアプリにさらに上書きする形だが、データベース自体は上書きされていないことがある。
  • 名前が一緒だと更新されないで再利用される?
  • ということなので、更新して新しいSQL文に書き換えても古いデータベースを参照し「存在しないカラムがある」というエラーが出た。

解決方法

  • 一度、エミュレータ内にインストールされた開発中のアプリをアンインストールし、再度デバッグを実行する。

実は、no such columnエラーは二度目で、ずっとSQL文とにらめっこしていた。

猫のコンテンツ力の高さ

2016年初めての記事です。

もうすっかり明けてしまいましたが、あけましておめでとうございます。 去年受けた自己分析診断テストの結果が返ってきて、

身軽にテキパキと動き回るほうではなく、腰が重たい印象を持たれているようです。

というコメントがありました。主にネットワーク上を動き回っているので、現実ではこういう印象を持たれてしまうのですね。今年はもっと”現実で”動けるところ、動いていきたいと思います。よろしくお願いします。

年末年始は北海道の実家に帰省し、寒いというより寒さを超えた向こう側、"皮膚が痛い"という感覚を久しぶりに味わいました。あと、成人式や同窓会に出席しました。楽しかったです。

実家の猫のツイートしたらバズった

帰省したら「実家システム、ご飯も出てくるし暖かいし快適すぎるのでは~」という感じになるのは恒例で、わんこ、ぬこ、亀なども飼っているので、メンタル的にも癒やされます。

1日、夜に階段で何気ない一場面をスマホで撮ったものをTwitterに投稿したら物凄いスピードで拡散されました。

自分のアカウントをフォローしていない友人のアカウントのTLにも猫のツイートが何度か流れたよ、と言われたときは「マジか~!」と驚きました。

リプライがたくさんきた

このツイートにはたくさんのリプライを貰いました。「かわいい」「癒されました」「うちの猫と握手してきました」「シーバ(一般的に高級キャットフード)何個で握手できますか?」

意外とこういった感想リプライが嬉しかったです。

最近のTwitterでは相互フォロー関係にない場合はリプライに「フォロー外から失礼します」的なフレーズを付けないと失礼、みたいな文化も出てきたみたいですが…。

内容によりますが、直接感想をダイレクトに伝えるのも大事だなと思いました。

記事になった

いろいろ記事にしてもらったので、ここにまとめておきたいと思います。

news.biglobe.ne.jp

irorio.jp

実家に帰ったら、階段が「ぬこ握手会場」になっていた【4枚+1】 – grape [グレープ] – 心に響く動画メディア

「犬みたいに気安くお手はしない!」気まぐれ猫の握手会が、どこかのアイドルみたい! | CuRAZY [クレイジー]

2015年を振り返る

1年間を適当に振り返ってみる。

  • 1月
    • コンビニでバイトし始める
  • 2月
    • なにもせず :(
  • 3月
    • なにもせず :(
  • 4月
  • 5月
  • 6月
    • HTML/CSSを勉強する
  • 7月
    • 二十歳になった
    • 原付に乗り始める
    • レスポンシブデザインとか勉強してた
  • 8月
    • Gitを使いはじめる
      • Githubをなんとなく理解する
    • Androidアプリ開発を勉強しはじめる
    • 短期インターンに行く
      • Androidアプリ開発を学んだ
      • プレッシャーの中で学ぶと学習効率が上がって良い
      • ちょっとした追い込み大事
      • やっぱしコミュ力大事だなぁという知見
  • 9月
    • チームでウェブサイト制作をし始める(〜現在)
      • 楽しい
      • 複数人でもモチベ上げるのってつらい
      • なかなか完成しない
  • 10月
  • 11月
    • MacBookAirを手に入れる
      • 軽いから持ち運びが格段に楽になった
      • モチベ上がる
    • ラズパイを手に入れる
  • 12月
    • ラズパイをいじる
      • NASを作ったりした
      • 来年はもっといじりたい
    • アプリコンテストに応募した
      • 一次審査待ち
      • 現在Androidアプリ開発中
      • わからないことだらけでつらい

総括

2015年はいろいろ学べた一年だったと思う。 なにより2014年より忙しかった、というか充実していた気がする。

よくなかったところとしては、ただ学ぶだけでアウトプット的な、成果物がほとんどなかった。 正確には、完成までモチベが保てず、中途半端なことが多かった。

あと、他人のコードを読むのは大切だよ、的な話をよく聞いていたからいろんなコードを読んで勉強しようと思ってはいたけど、実際全然読めなかった。 読んでも、何がどうなってるんだろう。。。となるので、理解する前に諦めがちだった。来年はがんばって読んでみよう。

他にもいろいろ反省点はあるとは思うけど、こんな感じで締めたいと思う。

便座とIoT

RaspberryPi2とHDDがあったら、NASを構築しよう!

NASのある暮らし

この土日でRaspberryPi2と外付けHDDを使って、NASを作った。

qiita.com

作って1日もたってないのでまだ「便利だな〜」という実感はないです。あと、さっそくVPN接続が出来て、外出先からNASにアクセスできたらいいなと思ってる。それもそのうち時間あればやるつもり。

自分でNASを構築してから、Sonyの最強HDDレコーダーでお馴染みのnasne(ナスネ)™のネーミングって、NASからきているという単純なことにいまさら気づきました。「nasne」の最後の「ne」はtorneから取ってきた説が濃厚っぽい。なるほど〜!って感じ。

今回のNAS構築は、大したことしていないんですが割と調べる事が多くて、作業自体丸一日かかった気がします。あとQiitaって下手なこと書いたら技術力スゴイ人たちがコメントで優しくご教示してくださる印象がある。それが結構プレッシャー。じゃあ個人ブログに書けばいいじゃんって感じなんだけど、地道にQiita力(Contributions)を身に着けたいな〜〜〜って思って。Qiita力とかってある程度の領域に達すると武器になると信じているので。

「Qiita力、1000超えです。(ボソ)」

「はぇ〜。(貢献度が)すっごい大きい。」

みたいな。ないか。

といっても、現状(2015/12/6)、「Qiita 力…たったの14か…ゴミめ…」という感じだからまずは100を目指そう。

あと、記事を書く上での適度なプレッシャーが、より丁寧に調べることにつながって、結果いつもより勉強になる感じがある。なので、なるべくQiitaに記事を書いていきたい。

そろそろ、RaspberryPiの環境も落ち着いてきたので、RaspberryPiの醍醐味である電子工作のほうの勉強も始めたいなと思います。

RaspberryPi2をWLI-UC-GNM2で無線LAN接続する

f:id:azuuun:20151203174016j:plain

RaspberryPi2で無線LAN接続

とりあえずRaspberryPi2につながっている有線デバイスを出来るだけ少なくしたい。 そのために、無線LAN子機を接続し設定します。手順はわりとかんたんですが、一応備忘録を残しておきます。

また今回の無線LAN設定はRaspberyyPi2に限った話ではなく、Unix系OSでWPA-PSK(AES) 方式で無線LAN接続したい時の手順と同じっぽいです。覚えておいて損はなさそう。

動作環境

事前準備

事前に以下の環境構築手順を済ませています。

azunobu.hatenablog.com

設定方法

無線LAN子機をRaspberryPi2に接続する

まず有線LAN接続を接続しているRaspberryPi2にWLI-UC-GNM2を接続する。

下記コマンドをシェルに打ち込み、USBに接続されていることを確認。

azunobu@raspi2:~ $ lsusb
Bus 001 Device 006: ID 0411:01ee BUFFALO INC. (formerly MelCo., Inc.) WLI-UC-GNM2 Wireless LAN Adapter [Ralink RT3070]
Bus 001 Device 005: ID 046d:c52f Logitech, Inc. Unifying Receiver
Bus 001 Device 004: ID 0853:0200 Topre Corporation
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. SMSC9512/9514 Fast Ethernet Adapter
Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

この場合だと、Device06にてBAFFALOの無線LAN子機が無事認識されていることが確認できます。

RaspberryPi2のWPA設定を行う

次にWPAを設定していきます。WPAとは以下のとおりです。

WPAとはWi-Fi Protected Accessの略で、 Wi-Fi Allianceが発表した、 無線LANの暗号化方式です。

WPAとは - JPNIC

事前に接続するルータのSSIDとパスワードを控えておきます。

ここからの大まかな手順としては、

  1. wpa_passphraseコマンドでSSIDとパスワードからwpa_supplicant.confに書き込む設定値を生成
  2. /etc/wpa_supplicant/wpa_supplicant.confへ 1.で生成した設定値を書き込む
  3. 有線LANケーブルを取り外し、再起動
  4. 起動後、無線LAN接続される

という感じ。

1. SSID, パスワード(passphrase) から wpa_supplicant.conf に書き込む設定値を作成する

下記のコマンドをシェルに打ち込むと、wpa_supplicant.confに書き込む設定値を生成してくれます。SSIDとpassphraseは任意のものに。

azunobu@raspi2:~ $ wpa_passphrase [SSID] [passphrase]
network={
    ssid="[SSID]"
    #psk="[passphrase]"
    psk=c0454a9f3decab5ff12ca1fd2d46e15c7bc9b2ebc85ab5ccb8dfff5af88331a6
}

2. 設定値を/etc/wpa_supplicant/wpa_supplicant.confに書き込む

1.で生成した設定値をコピーしてvimなどで直接wpa_supplicant.confを開いて書き込む、という手順でも問題無いですが、次のコマンドで一発です。

sudo sh -c "wpa_passphrase [SSID] [passphrase] >> /etc/wpa_supplicant/wpa_supplicant.conf"

一応、中身を確認します。

azunobu@raspi2:~ $ sudo cat /etc/wpa_supplicant/wpa_supplicant.conf
network={
    ssid="[SSID]"
    #psk="passphrase"
    psk=c0454a9f3decab5ff12ca1fd2d46e15c7bc9b2ebc85ab5ccb8dfff5af88331a6
}

こんな感じになってると、おそらく問題ないです。

3. シャットダウンして有線LANケーブルを取り外し、再び起動させる

まず、RaspberryPiをシャットダウンさせる。

azunobu@raspi2:~ $ sudo shutdown -h now

シャットダウンを確認したら、有線LANケーブルを取り外し、無線LAN子機のみ接続された状態にし、再び電源を入れる。

4. 起動したらSSH接続なり何なりでネットワークに接続できているか確認する

無事設定が完了する。

できていなかった場合、SSIDパスフレーズが正しくない、wpa_supplicant.confに正しく設定値を書き込めていない、などが原因だと思う。

RaspberryPi2周辺の見た目がすっきりした

RaspberryPiは元がとても小さいために、太いHDMIケーブルや電源用やマウス、キーボードのUSBケーブル、有線LANケーブルなどを接続するとケーブリングがスパゲッティみたいになって見た目がアレな感じになりがちですが、SSH接続で作業端末を別にしてネットワークも無線化してしまえば、電源供給用のUSB接続のみなのでとってもすっきりします。

これから電子工作とかやり始めると、結局ぐちゃぐちゃになるのかもしれないけどそれでもケーブル数は少ないほうが管理が楽です。

参考