今までは、プライベートなタスク管理に Producteev を使っていたのですが、最近Asanaに変えました。 という内容の記事です。

プライベートでのタスク管理は、1年くらい前に始めました。
それまではタスク的なこともiOSのメモ帳やReminderに書いておくだけだったのですが、仕事以外にもコミケやその他趣味でのタスクが増えてきて、つらくなってきたのでタスク管理ツールを使うようになった感じです。

Producteevは、高機能な割にUIがシンプル かつ 無料で使える機能が多かったので使っていました。

で、なぜAsanaに移行したかというと、大きな理由があるわけじゃないです(おい)。ProducteevのUIに飽きてしまったというか、AsanaのiOSアプリを使って見たらいい感じのUIだったので、頻繁に使うんだったらUIがいけてる方がいいよねという気持ちでAsanaに移行しました。

移行する際にProducteevのタスクのタスクの状態をそのままAsanaに反映したかったため、両者のAPIを叩いて移行できるツールを作りました。

https://github.com/rb-de0/Hibari

誰得ツールなんだろう…。

ちなみにHibariという名前は、「あんハピ」の「雲雀丘 瑠璃」から取ってきたものです。

これからはAsana使って行くぞー。

前ぐだぐだ書いたけど、具体的な目標書いてなかった気がするので書いておきます。

普通自転車免許を取得する

お金と時間さえあればなんとかできそうですが、両方ともないです…。とりあえず2018年になるまでには取りたいです。幸い近くに自動車学校あるので…。ただ東京で運転するの怖いですねぇ。

自炊をする

自炊するする詐欺しかしてなかったので今年はちゃんと自炊したいです…。前の家より自炊しやすい感じするので頑張ります。ただプロジェクトの関係で帰りが遅くなった時とかは仕方ないことにしたい。

運動する

運動もするする詐欺しかしてなかったので頑張りたいですね。具体的に何するかは決めてませんが…。体重は平均くらいですがおそらく体脂肪がやばいので落としたいですね。

早起きする

裁量労働制バンザーイ!ですが、さすがに最近起きるの遅すぎるので、10時…いや10時半くらいには出社したいですね。今までだと早く起きるようになってもすぐに戻っちゃっていたのでどうにかして習慣化したいです。何かいい方法ないですかね。

休日なるべく外に出る

休日は引きこもってばかりだったのですが、今年は土日片方は外に出て、何かしたいと思っています。どんなことするかとかは気分で切るしかないかなぁ。特にアウトドアな趣味ないんですよね。

自宅の環境を良くする

PC周りの環境ですね。ディスプレイとかマウス、キーボードあたりをいっぺんに買い換えたいです。ただこれに関してはまとまったお金ができないとダメなので、最悪来年に回してもいいかなと思っています。ただ、環境がしっかりしてるとプログラミングとかも捗るんですよね。

ブログを書く

私、気がついたんです。ブログ書かないと何もやらないなということに!自分でやろうと思っていることとか実際にやって思っていることとかかける場所が無いと何もやらないんですよね。ということで、どんなに小さなことでもいいのでどんどんブログに書いて行こうと思います。

Goをもう少しちゃんと書けるようにする

SwiftとGoが書ければ困らないよと誰かが言っていたのでそれを信じてGoをもう少しかけるようになりたいです。が、何をどうするかは決めてません。

スペシャリストの試験に合格する

一応 2016年は応用情報合格できたのでスペシャリストの試験に合格したいなと思っています。今の所、ネットワークかセキュリティにしようかなと思っています。セキュリティのほうはかなり強い友人がいるので、色々教えてもらえそう()。

全部パーフェクトは目指してない?

自炊、運動、早起きは、今めちゃくちゃになってる生活習慣を改善しようという目標です。生活習慣改善すれば、今無気力だったりやりたいことわからなかったりするのが解消するんじゃないかなぁと思っています。

あと上に書いてないこととかは今まで通りでいいかなと思っています。アニメ見るのやめませんしライブ行くのもやめません。

今の自分からしたら結構ハードルの高い目標ばかり設定してしまいましたが全部パーフェクトじゃなくてもいいかなと思っています。少しずつでいいので頑張りたいです。気をぬくと一気に元に戻りそうなのが怖いところですが、頑張ります!

どうめもいいですが、この記事はiPhoneで書きました。フリック入力疲れた…。

1プログラマーの2016年を振り返って思うこと

去年に投稿するつもりが、年末・正月と食べたり飲んだりしていたら年が明けてしまいました。

一昨年書いた 1プログラマーの2015年を振り返って思うこと のようなものを今年もやっておこうかと思いまして。一昨年こんな真面目な記事書きましたっけ・・・?何があったんだろう一昨年・・・。

とりあえず

  • 仕事
  • 技術面
  • 趣味
  • その他

みたいな分類で振り返ってみようかなと思います。

仕事

社会人2年目です。特に新しいことしていないので書くことはあまりないですが、Swift&iOS自体はそれなりに慣れてきたので、技術的なことで困ることはほとんどなくなってきた気がしています(気がしているだけ)。前半はほとんど保守のようなことをちまちまやっており、後半?というか最近は新規で色々やっていますが、そこまでゴリゴリコード書いていないです。ちゃんと振り返ってみると去年は仕事であまりコード書いていないかもしれません。

書くことないぞー?

あれかー、モチベーションですかー。
散々去年給料に関して一人で文句たらたらつぶやいていたと思いますが、改善されたというか、私の年齢からしたら別に少なくないくらいはもらっているのでもうグダグダ言うのは止めました(本当はもっと欲しいけど、欲しいならそれなりのことしないとダメですよね。でもやる気出んのですよね)。

何をしたら評価されるとか給料が上がるとか考えるのすら面倒くさくなってきて・・・、完全に受け身状態。ただ、別にやりたいこともはっきりとしていないので、ただ言われたことやってお給料もらっているサラリーマンと化しています(言われたことすらちゃんとできているか怪しいですが)。たまに自分から発信することもありますが、完全に気まぐれです。

仕事に関しては振り返ってみると・・・あまり大きなことはしていないですね・・・。

技術面

技術面は、結構成長があったかなーと個人的には思っています。別に何か大きなこと成し遂げたわけではないですが・・・。

去年もやっぱりSwiftの年でしたね。というか最近Swiftしか触っていなくてSwift以外の言語を書くことができなくなっていそうで怖いです。

去年は確かGoで色々書いていたような気がしますが、去年はほとんど書いていません!なんということでしょう。その代わり、色々あってPythonを少しだけ書いたり。

サーバーサイドSwift

個人的に去年一番盛り上がったのは「サーバーサイドSwift」です。触り始めたのはGWあたりですね。C90のネタで何かいいのないかなーと探していたところサーバーサイドSwiftがそれなりに使えるようになってきているらしいので調べて使ってみたら、結構簡単だったので色々触ってみたという感じです。

C90で頒布した本でも紹介しましたが、Swiftでサーバーサイドアプリケーションを簡単にかけるようになったので、いろいろなことができるようになりました。何か趣味でアプリ作ろうってなった時は、SwiftでAPIサーバーを書いてみようかなと思っていますが、そんな時は来るのだろうか。

一応Vaporを使って開発した簡易CMSで構築されたサイトを公開中です。

tech.reb-dev.com

まだ不安定かつデザインば微妙ですが、それなりに形はしっかりしているんじゃないかなと思っています。

Kituraも最近少し触ってみましたが軽量でいいですね。Vaporよりは依存しているパッケージが少ないのでコンパイル時間も短くて良いと思います!そのうちBluemix使って簡単なアプリケーションを開発してみようと思います。

iOSとか

iOSアプリは、趣味でほとんど作っていないので特に成長があったかどうかと言われると怪しい。設計に関しては、最近はやりの「Clean Architecture」を少し調べてみてプロダクトに導入してみているところですが、まだよくわかっていないのでアウトプットはないです。そのうち、サンプルアプリケーションか何かを作ってみて「オレオレClean Architecture」を紹介したいですが、時間がないです。

Githubにライブラリを公開してスターもらいたい!と思っていたこともありましたが、そもそもアプリ開発に関するモチベーションがそこまでないからか作りたいライブラリが特にない、かつ技術力もないので特に何も作っていません。欲しいと思ったら作ると思うので、欲しいと思うまでは特に何もしないと思います。

勉強会

去年は勉強会にたくさん行きました!「去年は」って書いてありますが、行き始めたのは去年なので勉強会デビューですねー。最初はコミュ障全開だったのですが、最近では慣れてきました。

いろいろな勉強会にお邪魔させていただきましたが、多いのはiOS関連ですかねー?というか「Tokyo Server Side Swift Meetup」以外はiOS関連の勉強会ですね。

勉強会は単純に技術的なことだけでなくいろいろなお話を聞くことができるのでいい場だと思います。ただ最近は、得た情報をその場で完結させてしまっていて、勉強会に行くことが目的みたいになってしまっているので、どうにかしたいです。よくよく考えると、そもそも何のために勉強会っているのか分からないですね。ただ知識を得たいだけなのか、ただで美味しいもの食べたいだけなのか、おしゃべりしたいだけなのか・・・。

知識を得たいだけだったら、最近はスライドを公開してくれる方が多いのでそれを見るだけで完結しちゃいそうですもんねー。勉強会に行くことの意義が分からなくなってきてます。でもとりあえずなんだか楽しいので行っています。楽しむために行っているのかもしれませんね。

趣味とか

趣味はプログラミング!と言いたいところですが、プログラミングしてるよりゲームしたりアニメ見ている方が楽しいので、プログラマーに向いていないかもしれません。

ゲーム

去年も色々やったような気がしますが、振り返ってみると数は多くないんですよね。

  • イース8
  • BF1
  • ポケモン ムーン
  • ポケモンGo

おそらくちゃんとやったのはこれだけだと思います。イース8に関してはちゃんとやっているか怪しいですが(まだクリアしてない)。

ポケモンGoは、一時期めちゃくちゃハマっていましたが最近は全くやっていないですね。起動すらしていないです。ハマっていた時期は、近く?の公園まで自転車で行ったり、都内を歩いたりしていましたね。最近はアップデートで結構色々な要素が追加されたようですが・・・あまりやる気は起きないですねぇ。

ポケモン ムーンですが、とても良かったです。殿堂入りするまで結構時間がかかってしまったのですが、久しぶりのポケモンとても楽しかったです。今作はストーリーが魅力的でしたね。ただ、今までの作品のように冒険している感じはあまりありませんでしたね。目的地も表示されちゃっていますし。

あとはBF1ですねー。BF1は終わりとかないので今後もちまちまやって行くと思いますが、推奨スペックが・・・。一応GPUだけはGTX 1070に変えることができたので問題はないのですが、CPUがi5 3470なので辛いんですよね。常に4コア100%張り付きなのでどうにかしたいです。もうすぐIntelさんが新しいアーキテクチャのCPUを発表するようなので期待ですね。そうしたらマザーボードとケースも買い換えようかな。

ライブ行ったり

去年もライブに結構行った気がしますが、去年ほどは行ってないようですね。

  • 2月14日 i☆Ris&Wake Up, Girls!バレンタインLIVE 昼&夜
  • 3月31日 ラブライブ!μ’s Final LoveLive!〜μ’sic Forever♪♪♪♪♪♪♪♪♪〜
  • 5月12日 i☆Ris 2nd Live Tour 2016 Tokyo
  • 7月9日 i☆Ris 結成4周年記念Live
  • 7月17日 Wake Up, Girls! 3rd LIVE TOUR「あっちこっち行くけどごめんね!」 千葉
  • 8月28日 Wake Up, Girls! 3rd LIVE TOUR「あっちこっち行くけどごめんね!」 東京
  • 11月25日 i☆Ris 4th Anniversary Live
  • 12月18日 Yu Serizawa Birthday Live ~Present Box

去年もi☆Risちゃんの年だったなーと思います。今年もおそらくi☆Risちゃんの年になる予定です(ツアー3箇所と、わぐりすのチケットはゲットしています)。

そういえばラブライブ!がありましたねー。懐かしいです。

なんだかんだライブ行かなくなるんじゃないかなぁと自分で思っていたのですが、なんだかんだ募集が始まったら応募して行っちゃうんですよねー。やっぱりライブ楽しいです!

そしてそして、去年は何と言っても「i☆Ris 武道館」が一番でしたねー。念願の武道館、おめでとうございます!!ファンクラブ先行チケットだったからか結構良い席を確保することができたので本当に良かったです。解散するんじゃないの?とかよく分からない噂が流れたりもしていますが今年も応援しているから頑張って!!

そして、芹澤優ちゃんのソロデビュー!実は誕生日記念ライブに行っていたのですが曲が全然分からなく、少し悲しい思いをしてしまったので今勉強中です!ソロでの活動もしていくようなので応援したいです(推しはひみたすです)。

その他

去年は旅行に何箇所か行ったような気がしましたが、2箇所しか行っていないですね。大洗と広島。

広島の大久野島にいった記事は書いているのでそちらをどうぞ

大久野島いってきました + おまけ

あとは引っ越しですねー。去年目標?にしていた引っ越しを無事行うことができました。引っ越しに関する記事も別に書いているのでそちらをどうぞ

引っ越しました

今年はどうするかー

最近何がしたいのか分からなくなってきてしまっているのでどうしようかと。そもそもプログラミング自体はそこまで好きじゃないんじゃないかなという気がしているんですよねー。でもプログラミングしか仕事にできないので仕方なく勉強したり自体に取り残されないように情報集めている感じです。

いやでも結局プログラマとしてやって行くしかないのでそこらへんは割り切ってやるしかないですよねー。なので本音言うとやりがいとかではなく単純に待遇いいところに行って趣味に生きていたい・・・。

仕事

上記のことを踏まえて。

うーん、難しいですね。給料が3倍くらいになれば楽しめるんですかね()。とりあえず今担当しているプロジェクトもめちゃくちゃ大きく、そしてなぜか入社2年目なのに開発リーダーポジになっているので、どうにかしないとダメなんですよね〜。そこらへんはケジメつけていい感じに終わらせたいです。それ以外にやりたいこと・・・なし!!

おそらく終わったところで地道にSI続けて行くだけなので、それ自体に楽しみとかやりがいをみつけないと行きていけないんですよね。やりがいとは。

転職も視野に入れていないわけではないですが、会社変えたところでどうなんだろ?おそらく仕事内容か待遇が大きく変わらないと何も変わらない気がしているんですよね。

なんかこう考えてみると仕事だけが問題じゃない気がしてきました。そもそもの生きるモチベーションがない。

趣味とか

ライブはいつ行っても楽しいので継続ー。i☆Risちゃんが卒業?解散?してしまうまでは行き続けるんじゃないかなぁと言う感じです。他のアーティストについてですが、分からないですねぇ。Aqoursのライブにも行きたかったのですがチケット当たる気がしないのでおそらく一生行けないでしょうね。

アニメについてですが、去年の前半に録画サーバーを作ったので快適です。といってもまだまだ改善できるところはあると思います。とりあえずはエンコードは自動化して、HTTPで動画配信できる(プログレッシブダウンロード)環境は整えたので、iOSのAVPlayerから視聴できるようにはしています。ただアプリはまだまだ微妙な感じなので、もう少しちゃんと作りたいです。あと動画視聴用のiPad miniが欲しいですねぇ。こういう自分のためにプログラミングするのは好きなんですけどねぇ。

PC周りの環境もいい感じにしたいですね。とりあえず今使っているPCデスクだとディスプレイを2枚置くのは厳しいので新しいPCデスクをそのうち買おうと思います。ただこう考えると部屋はやっぱり広い方がいいですよねぇ。今住んでいるところも前住んでいたところとほぼ同じ広さなので、微妙なんですよねぇ。

その他

引っ越したんですが、もう既に引っ越したくなってきている件について。

場所はいいんですがねぇ。建物が結構音が響く構造のようで。前住んでいたところも私が2階に住んでいたから気がつかなっただけで響いていたんですかねぇ。

今度はもう少し、広くてちゃんとしたRCのマンションに引っ越そうかなと思っています。ただ都心だと厳しいですよねぇ。探しても今の所の家賃 + 3万以上は払わないと厳しそうです。いい場所ないですか、いい場所。

こういうテキトーに決めちゃうところが悪いところですねぇ。次はもう少し時間をかけて決めたい(そう思っているだけでやらないパターン・・・)。

あと旅行ですね。今年こそは海外行きたいですねぇ。とりあえず4月に富山に温泉旅行に行く予定が入っているので楽しみです。前回は電車で行ったのですが今回は車で行くらしいです。私は免許持っていないので去年中に取りたいなと考えています。

そうそう免許ですよね〜。都内だと車はほぼ使わないと思いますが持っておきたいですよね。今住んでいるところかそれなりに近いところに公認の教習所があるのでそこに行こうかなと思っています。ただお金と時間がですね・・・。時間に関しては今働いているところが裁量労働なので、午前中は教習所に行くとかはできそうです(ということはそれまでは転職しない方が良いってことですね)。お金は・・・どうなんでしょう。全く貯金していないので、そこまで無いんですよねー。引っ越しで結構使ってしまったし。辛いです。

そうそう貯金!今まで割とテキトーな感じに貯金してきていたのですが、どうなんでしょう?なんかそこまでお金に余裕あるわけじゃ無いので貯金しなくてもいいかなーと思い始めていて、貯金ばかりしてやりたいことできないってなんか悲しい気がするし、今年はあまり貯金意識しなくていいかなーと思っています。貯金したくなったら転職する?

もう何がしたいの分からんですね。

まとめ

概ねまとめられたと思いますが、社会人ももうすぐで3年目になるわけですし、いろいろ今後のこと決めないとダメかもしれないですね。

ではでは

久しぶりの更新、「引っ越しをした」、というどうでもいい感じの内容となっております。

1年と8ヶ月くらい住んでいた場所を離れました。引っ越ししたのはつい先日です。

引っ越した理由なのですが、交通の便が悪かったからというのと、雰囲気があまり好きではなかったからという二つです(よくよく考えると、そこまででもなかった気もする)

新居の場所はまあ割と都心というか交通の便はかなり良い場所です。少し家賃は上がりましたが・・・。何より良かったと思ったのが、満員電車に乗らなくて済むということですかね・・・。たかが10分程度でも満員電車って乗るとめちゃくちゃストレスなんですよね・・・。そこから解放されたのはかなり大きいです。

まだ引っ越してきたばかりで部屋の中がダンボールだらけなのですが、少しずつ片付けていけたらいいなと思っています。とりあえず、インターネットが使えてBF1ができる環境は整えたので、あとはゆっくりでもいいかな・・・。

住んでいる場所って結構、生きるモチベーションにか変わっていると思うんですよね。住んでいる場所が変わるだけで、心持ち?って結構変わるなぁ思います。ただ、新しい場所に来たということに新鮮味を覚えているだけで、慣れてきたら戻りそうですが・・・。

何はともあれ、やっと引っ越しできて良かった!

次は何か大きなことがない限りは引っ越しはしないかなと思っています。引っ越しって結構お金かかるし、やらないといけないことも多いし大変ですよね。でも当日の引っ越し作業に関しては業者の方がほとんどやってくれたので助かりました! 大きなことってなんでしょうね・・・。今のところあまり不満はありませんが、そのうち出てくるかもしれないですし、いろいろあって転職したりするかもしれないですしね!

ではでは

コミックマーケット90お疲れ様でした!

といっても、コミケが終わってから結構経ってしまっているのですが・・・。
iOSDCの記事よりは先に投稿しようと思っていたのですが、間違えました。

サークル参加

今回も前回同様、2日目は友人のお手伝いのためにサークル参加、3日目は自分のサークルのためにサークル参加しました。

頒布物はこんな感じです。

今回も、50部印刷しましたが、売れ残ってしまいました。前回は50部刷って、昼過ぎには完売していたので少し残念ですが、当時になんでだろーなーと思っています。
(売れ残った本は、会社の人が買ってくれました! 感謝!)

買ったもの

3日目はラブライブ関連の本が多かったため、サンシャイン関連の本を幾つか購入しました。津島善子ちゃんかわいい。

今回はまとめる時間がなかったので公開しません。

次回

C91も申し込みしました!

Swift関連の本を書こうかと思っていたのですがネタがないので困っています。冬までは時間もないので・・・どうしようかなと。
一応、案は少し考えています。

  • SwiftのTipsをまとめた本
  • AppleTV(tvOS)関連の本
  • HomeKitとか・・・(怪しい)
  • ラブライブ!・・・

考えておきます。

iOSDC Japan 2016 に 参加してきたので感想等を書こうと思います。

iOSDC Japan 2016 とは

https://iosdc.jp/2016/

公式曰く 「iOSエンジニアのお祭り」 だそうです。
iOSに関する話題を持ち合い、様々なトークが繰り広げました。

会場について

会場は「練馬区立区民・産業プラザ Coconeriホール」

行ったことなかったので、最初は「これどこなんだ・・・」って感じでしたね。乗り換えが少し面倒臭かったのですが、池袋からはとても近かったのでそこまで大変でもなかったです。練馬って産業プラザとは反対側の方に店がたくさんあるんですね。駅から出たとき「練馬、なんもないやんけ!」とか思っていました、すみません。

トークについて

会場はTrack AとTrack Bに分かれており、トークは並行して行われました。「両方聞きたい!」という場面もたくさんあったのですが、トークのスライドをスピーカーの方が公開してくださっていたので、あとでみることができました。圧倒的感謝!!

ここでは特に印象的だったトークを取り上げます。

RxSwiftは開発をどう変えたか? @_ishkawa

@_ishkawa さんの RxSwiftのお話です。

まず驚きだったのがRxSwiftを使ったことがある人が結構いたことです。みんな使ってるんですね〜。

Rxを使った実装のパターンと、Rxを使わない既存の実装パターンの比較がとてもわかりやすかったです。
私も個人的に、RxSwiftを使ってみてはいるんですが、オペレーターを使いこなしたり、Rxっぽい書き方はまだ全然できないので参考になりました。

ただ、RxSwiftを実際に仕事で使うとなると、チームメンバーがある程度Rxの概念や使い方を理解していないとダメな気がしていて難しいですね。
あとRxゴリゴリで書かれたコードって、私にとっては、とても読みにくいし辛い。PublishSubjectとかVariable、Driverあたりをちょこちょこっと使うくらいなら読みやすいんですけどね・・・。

@_ishkawa さんのようにRxの世界の住人になるしかないのか。

Swiftのこれまでの動向のまとめと今後のさらなる発展の期待 @_mono

@_mono さんのSwiftのお話です。

Swiftがこれまでどのように変化してきたのか、今後どのように変化していくのかを聞くことができました。

私もSwiftは1.1から使い始めていたので、少し懐かしい感じで聞いていました。

そして Swift 3.0!

もうすぐ リリースですね。 「Swift 3.0 は最後の破壊的な変更」ということで、ある程度覚悟はしておかなくてはいけません (((;゚Д゚)))

そのあとは・・・広報互換性どうにかなってくれるらしいので期待です。 Swift 3.0からが本当のSwiftかもしれません。

Xcode で快適なデバッグライフを追い求める @dealforest

Xcodeでのデバッグのお話です。

普段、「てきとーにprintしてみるかー」とか「ここらへんにブレイクポイント追加しとこ」 って感じのてきとーなデバッグしかしていなかった私にとっては、新鮮な情報ばかりだったので大変ためになりました。

今度から 「Symbolic Breakpoint with Action」 とか使ってみるかな〜。

Xcode 8からプラグインが使えなくなる話。 私はプラグインを結構使っているので、辛いですね。 VVDocumenterが使えなくなるのは少し辛いかもしれません・・・。

英語が苦手すぎて財布を店員に渡して会計を任せる僕が、ATS必須化についてAppleのエンジニアに英語で聞いてきた生存戦略 @dealforest

面白かったです。

iOSの話というよりは、英語のお話でした。

質問の準備の方法がとてもわかりやすかったです。

英語できなくてもなんとかなりそう! とうい考えになりました。でも英語できた方が良いですよね。

懇親会

懇親会にも参加しました!
とても楽しかったです。

懇親会に参加している方に知り合いの方は誰もいなかったのです・・・が、色々な方とお話できたので良かったのでよかったです。

一番驚いたのは、中学の頃の部活の先輩がいたことですかね・・・。フォロワーさんだったのですが、話してみたら偶然にも地元が同じで中学校も同じでそして部活も同じという・・・なんという偶然でしょう。

そして、前夜祭でサーバーサイドSwiftについてお話していた方ともお話することができました! サーバーサイドSwift良いですよね!

「Tokyo Server-Side Swift Meetup」というものがあるらしいので、今度参加してみようと思います。

まとめ

スタッフの皆様、スピーカーの皆様、スポンサーの皆様、快適なWIFI環境を提供してくださったCONBU様、本当に有難うございました。

iosdc 楽しかったです! また行きたいです!

今度は会社の人とか誘ってみようかな。

色々書いておく場所を用意した

コミックマーケット90 お疲れ様でした。
当日、お会いした方、スペースにかいに来ていただいた方、本当にありがとうございます。そしてお疲れ様でした!
コミケ関連の記事は、また別でまとめようと思います。このエントリのテーマは違うので・・・。

技術的な内容を別サイトへ

コミケで頒布した本の内容ともかぶりますが、Swiftで簡易CMSを作成して、公開する段階まで行けたので、技術的な内容は次からそちらに書こうかなと思っています。

URL:https://tech.reb-dev.com
リポジトリ:https://github.com/rb-de0/swift-cms-server

githubで公開しているコードをコンパイルして、ほぼそのまま実行しているだけです。一部(DBの設定等)変更はしてあります。

Vapor + SwiftでHTTPサーバーのルーティングやコントローラーのロジックを書いています。詳しくはコミケで頒布した本に記載されている通りです。

ただし、SSLに対応したいという考えから、フロントにはApacheを置いていて、証明書等の設定はApacheのconfに記述しています。ApacheのリバースプロキシでSwiftのサーバーに飛ばしている感じですね。
VaporにもSSL/TLSのProviderが用意されているようですが使ってみてはいないです。余裕ができたら使ってみようと思います。

サーバーは、このWordpressが置かれているサーバーと同じです。サーバーにメモリを1GBしか積んでいない & apacheも動いているのでメモリの空きが心配でしたが、今の所は問題なさそうです。

ということで、ここらへんで。

tech.reb-dev.comのAboutをかかねば。。。

お久しぶりです。

6月中旬からつい最近まで何かと忙しくて更新できていなかったのですが、落ち着いてきたので更新したいと思います。

6月の25から27にかけて、旅行に行ってきました。旅行先は広島です。
広島といっても、行ったのは「大久野島」というところと呉です。

大久野島・・・聞いたことがある方もいるかと思いますが、通称「うさぎ島」と呼ばれている島で、野生のうさぎがたくさん生存している島なのです!

ということで、今回は大久野島いってきたぞ!という内容の記事になります。
(そんなに写真ないです)

簡単に経緯を

うさぎ島、ずっと行きたかったのです。もちろん、死ぬまでに行っておきたい場所リストに入っていました。
どれくらい前から行きたかったのかはあまり覚えていませんが、高専のときは行きたいなぁと思っていたようなきがします。
ネットで「うさぎ島行ったきた!」のような記事を見るたびに、「行きたい!」と思っていました。

で、5月に友人から「うさぎ島いこう!」と突然誘われたので、「よっしゃ行くか!」という感じで行くことに。
ちなみにメンバーは私含めて4人でした。高専自体からの友人で、たまにPS4とかでゲームしています(最近私はしていませんが・・・)

いざ広島へ

いろいろあって24日の夜の友人宅に寝袋を持っていき、泊まらせてもらい、25日の朝に、新幹線で関東から広島の方まで向かいました。

福山で一回乗り換えて、三原まで自由席、そして三原に到着。ここまでは特に問題はありませんでした。

が・・・、三原から乗る予定のJR呉線が土砂崩れの影響で運転見合わせ・・・。しかもすぐに再開するめどは立っていませんでした。「まじかよ呉線!」。

振替のバスで行こうか、レンタカーで行こうか、タクシーで行こうか、と悩んだ結果、タクシーでフェリー乗り場の近くまで行くことになりました。4人で割り勘したので、大きな出費ではなかったです。

三原で昼食とりました ↓

フェリー乗り場の最寄駅である、忠海駅近くのスーパー?でうさぎさんにあげる餌(ほうれん草等)を購入し、フェリーを待つことに・・・。

そしてうさぎ島へ

フェリーに乗って、うさぎ島へ向かいました。

ここからうさぎさんの画像です。もっと撮ればよかった!また来よう。

ほうれん草をむしゃむしゃするうさぎさん

餌に群がるうさぎさんたち(生存競争!厳しい!)

日陰で休憩するうさぎさん

がんばれ仔うさぎ!

落ち着けお前ら

大人うさぎにうばわれないように人参を食べる仔うさぎ

その葉っぱ食べて大丈夫なんか?うさぎさん

こんな感じです。

そして夕食

タコが美味しかった。

そして呉へ

2日目(26日)は、呉の大和ミュージアムに行きました。



写真は載せません(加工が面倒くさかった)。行けば凄さがわかります!

いろいろあって昼食

ここでもビール。

士官カレーと護衛艦さみだれカレー、ラムネとビールを一人ずつ頼むという、もうなんだかよくわからない行動をとった私たち

とても美味しかったです。

そしてお隣さんへ

そしてサンライズ瀬戸へ

シャワーカード。これでシャワー浴びれます。

そして仕事へ・・・

27日の朝、東京駅でサンライズ瀬戸から降りて、一旦家に帰って、少し寝て、会社に行きましたとさ。めでたしめでたし。

また行きたい

社会人になってから、旅行行ってなかったなーということを思い出しました(社員旅行除く)。旅行いいですよね〜。いつも住んでいるところは全然違った雰囲気のところに行くと楽しいですよね。

国内もまだまだ行ったことがないところがたくさんあるので、行きたいです。生きている間には47都道府県、全部行きたいと思っています。

そして海外。海外はまだ行ったことがないんですよね・・・。アメリカとかシンガポールとか行きたい・・・。

旅行はいいぞ

おまけ

「i☆Ris 結成 4周年記念 ライブ」

「Wake Up, Girls! 3rd LIVE TOUR「あっちこっち行くけどごめんね!」の千葉公演」

に行ってきましたよ!

i☆Risは、行くのが大変でした。本当はJTBのバスで行くつもりだったのですが、人数が集まらず中止に・・・悲しい。
仕方なく、電車で行ったのですが、遠かった・・・。富士急行ってなんなんだ・・・。

ライブは文句なしに最高でしたよ!!武道館楽しみにしてます!

WUGちゃんは、久しぶりのライブでした。12月の幕張以来でしょうか。WUGはまだまだ新参者なので、たまにコールわからなくておろおろしてたけど、WUGちゃんの元気で可愛いパフォーマンスを見ることができたので良かったです!

そうそう、WUGちゃん舞台化するんですよ!キャストはWUGちゃんですよ!これは行くしかないです。

ってな感じで、楽しんでます。

ではではー。

どうも。

Swiftのお話です。

今回はAPIKitのエラーハンドリングについて書こうと思います。APIKitは、Swiftっぽさを前面に出した素晴らしいAPIクライアントライブラリです。非常に簡単に使えます。バージョンアップによってエラーハンドリングが少し強化されたっぽいので、まとめてみたいとおもいます。

APIのエラーのハンドリングについて

APIを叩いて様々なことをするアプリを開発することは多いと思いますが、問題となるのがエラーのハンドリングです。経験があまりないので詳しいことはわからないのですが、ステータスコード見たり、レスポンスの内容を見たりして、適切な処理をしないといけないですよね・・・。APIから返却されるエラーの情報に統一性があったり、エラーハンドリングの仕様がある程度統一されていれば、苦労はしないと思うのですが、アプリで色々なAPIを叩いて、APIごとにエラーの内容が違ったり、処理内容が違ったりすると少し面倒くさいです。

しかし、APIKitを使えば、簡単なはず・・・。

interceptObjectとresponseFromObject

APIKitでは、レスポンスを処理するフローが、RequestTypeプロトコルのExtensionで定義されています。デフォルトでは、

public func parseData(data: NSData, URLResponse: NSHTTPURLResponse) throws -> Response {
    let parsedObject = try dataParser.parseData(data)
    let passedObject = try interceptObject(parsedObject, URLResponse: URLResponse)
    return try responseFromObject(passedObject, URLResponse: URLResponse)
}

こんな感じです。

  1. Parserでパースできるかチェック(デフォルトのパーサーはJSONDataParserです)
  2. レスポンスとObjectの状態をチェック
  3. Objectをレスポンスクラスに変換

という流れになっていることが分かると思います。

まず、「try dataParser.parseData(data)」ですが、DataParserTypeに適合しているクラス・構造体ならば自分でカスタマイズして実装可能です。

DataParserTypeですが、

public protocol DataParserType {
    var contentType: String? { get }
    func parseData(data: NSData) throws -> AnyObject
}

こんな感じで定義されています。contentTypeは、HTTPのAcceptヘッダーに指定する文字列です。クライアントで処理するデータのタイプをリクエストします。parseDataは、データをパースする処理です。パースできなければErrorTypeに適合した何かを投げてください。

次に、「interceptObject」です。interceptObjectは、APIKit 2より追加されたメソッドだそうで、レスポンスを横取りして、エラーのハンドリングが可能です。

参考:http://blog.ishkawa.org/2016/05/23/1463585002/

HTTPのステータスコードごとに、異なるエラーを投げることが可能になります。ライブラリ作者さんの例では、Github APIのエラーハンドリングで、ステータスコードが400と422のときはGitHubErrorをthrowするようにしていますね。

ちなみに、interceptObjectは、Protocol Extensionによるデフォルトの実装でステータスコードが200..<300以外の時は「ResponseError.UnacceptableStatusCode」を投げるように実装されてます。

次に「responseFromObject」です。responseFromObjectは、もともとあるメソッドなのですが、バージョン2から例外をthrowする方式に変更されました。Swift2.0からthrowやcatchができるようになったので、それに合わせるようなエラー処理方式に書き換えたのだと思います。

responseFromObjectでは、interceptObjectをパスしてきたオブジェクトをRequestTypeのResponseに指定された型に変換します。変換できなかった場合は、エラーを投げるようにします。また、変換はできたが、レスポンスの中身に問題があった場合もエラーを投げるといいかもしれません。この実装は、ステータスコードは常に200を返すので、JSONの内容を見てエラーかどうか判断しなければいけない時に活用できます。

ちなみに、JSONのパーサーに「Himotoki」を使っている場合は、Himotokiのデコードメソッドがエラーを投げてくれるので、実装が非常に楽です。

RequestTypeの継承

RequestTypeを継承して、色々なデフォルト実装を持ったRequestTypeが作ろうというお話です。先ほど、紹介した「interceptObject」「responseFromObject」ですが、両方ともRequestTypeのメソッドです。つまるところ、RequestTypeに適合したクラス・構造体に実装するか、デフォルトの実装を使うことになります。おそらく、リクエストごとに実装するのは面倒臭いので、ほとんどの場合デフォルトの実装を使うことになります。

デフォルトの実装を使う場合、何のデフォルト実装にするかということが重要になります。RequestTypeを拡張しても良いですが、それだと複数の種類のエラーハンドリングができなくなってしまうので、RequestTypeを継承したプロトコルのデフォルト実装すると良いです。

例えば、AというサービスのAPIとBというサービスのAPIがあったとして、RequestTypeAとRequestTypeBを作って、両者ともRequestTypeを継承させます。そして、それぞれのextensionでbaseURLやエラーハンドリングのメソッドを実装するのです。

まとめ

APIKitはいいぞ。

※ Alamofireもいいけど、API叩くだけだったらAPIKitでいいよね。RequestTypeに適合させたクラス・構造体作っててきとーにほげほげするだけで簡単にAPIが叩けるのでよい。あと、ライブラリの実装が複雑じゃないので困ったときに調べやすい。
※ 今回取り上げたAPIKitのバージョンは2.0.1です。

巷で話題の「fizz buzz in tensorflow」のソースコードを見てみたのでなんとなく理解してみようと思います。

ソースコード: https://github.com/joelgrus/fizz-buzz-tensorflow

元記事:http://joelgrus.com/2016/05/23/fizz-buzz-in-tensorflow/

ちなみに機械学習とかニューラルネットの知識はほぼありません。高専の頃に授業でパーセプトロンとかバックプロパゲーションとか少しだけやりましたがあまり理解していませんでした…。なのでこの記事を書くにあたって少しだけ勉強しました。

なんとなく理解してみただけなので内容がふわっとしています。なので、なんとなく理解したい人向けの記事となっています。

さらっと概要

fizzbuzzとは、これですね

「1, 2, fizz, 4, buzz, fizz, …. , 14, fizzbuzz, 16, … n」

Wikipedia曰く

このゲームをコンピュータ画面に表示させるプログラムとして作成させることで、コードが書けないプログラマ志願者を見分ける手法をJeff AtwoodがFizzBuzz問題 (FizzBuzz Question) として提唱した。その提唱はインターネットの様々な場所で議論の対象になっている。

(Wikipedia「Fizz_Buzz」より)

どうやるのか

ニューラルネットに、fizzbuzzの法則を学習させます。

簡単に流れを書くと

  1. 入力層、中間層、出力層のニューロンを用意し、適当な結合係数を初期値として設定する。
  2. 入力層のニューロンに入力値を与える。
  3. 出力層から出力される値と答えとなる値が最小となるように結合係数を修正する。
  4. 2に戻る

2から4の流れを何ループかすると、入力値に対して答えとなる値が極力小さくなるようなニューラルネットが構成されます。実際には入力値に対してニューロンの出力はシグモイド関数とかソフトマックス関数などの活性化関数を使います。fizzbuzzだと、中間層ニューロンの活性化関数にReLUを出力層の活性化関数にソフトマックスを使っているっぽい。

コードを見る

学習用に入力と出力の組を用意する

NUM_DIGITS = 10

def binary_encode(i, num_digits):
    return np.array([i >> d & 1 for d in range(num_digits)])

def fizz_buzz_encode(i):
    if   i % 15 == 0: return np.array([0, 0, 0, 1])
    elif i % 5  == 0: return np.array([0, 0, 1, 0])
    elif i % 3  == 0: return np.array([0, 1, 0, 0])
    else:             return np.array([1, 0, 0, 0])

trX = np.array([binary_encode(i, NUM_DIGITS) for i in range(101, 2 ** NUM_DIGITS)])
trY = np.array([fizz_buzz_encode(i)          for i in range(101, 2 ** NUM_DIGITS)])

binary_encode関数で入力の組を用意して、fizz_buzz_encode関数で出力の組を用意します。入力も出力も2ビットで表現しています。入力は101から1024まで、出力もそれに対応した分だけ用意します。

入力用と出力用のニューロンを用意する

X = tf.placeholder("float", [None, NUM_DIGITS])
Y = tf.placeholder("float", [None, 4])

入力はNUM_DIGITSの数だけ、出力は4ビット分用意します。

結合係数(重み)を初期化する

def init_weights(shape):
    return tf.Variable(tf.random_normal(shape, stddev=0.01))

NUM_HIDDEN = 100

# Initialize the weights.
w_h = init_weights([NUM_DIGITS, NUM_HIDDEN])
w_o = init_weights([NUM_HIDDEN, 4])

NUM_HIDDENは中間層のニューロンの数です。w_hは入力層と中間層の結合係数、w_oは中間層と出力層の結合係数を表しています。

モデルを定義する

def model(X, w_h, w_o):
    h = tf.nn.relu(tf.matmul(X, w_h))
    return tf.matmul(h, w_o)

py_x = model(X, w_h, w_o)

matmulは行列演算、中間層の活性化関数にランプ関数(ReLU)を使っているけれど何故かは不明です。ReLUだと学習回数少なくて済むとかどこかで見たけど分からんです。

コスト関数を定義する

cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(py_x, Y))
train_op = tf.train.GradientDescentOptimizer(0.05).minimize(cost)

predict_op = tf.argmax(py_x, 1)

出力層のニューロンの活性化関数にソフトマックスを利用して、その出力と答えとの交差エントロピーを計算して全ての出力(
バッチごと)の平均を取っているという感じでしょうか(たぶん間違ってる)。また、最急降下法を使ってコストを最小化する方向で、重みを更新するように定義していると思われます。softmax_cross_entropyはソフトマックスで正規化(0から1の間にする)して交差エントロピーを計算するところまで担保してくれているのかなと思っています。

predict_opはあとででてきます。

学習させる

BATCH_SIZE = 128

with tf.Session() as sess:
    tf.initialize_all_variables().run()

    for epoch in range(10000):
        p = np.random.permutation(range(len(trX)))
        trX, trY = trX[p], trY[p]

        for start in range(0, len(trX), BATCH_SIZE):
            end = start + BATCH_SIZE
            sess.run(train_op, feed_dict={X: trX[start:end], Y: trY[start:end]})

        print(epoch, np.mean(np.argmax(trY, axis=1) ==
                             sess.run(predict_op, feed_dict={X: trX, Y: trY})))

forで1万回ループさせて学習させています。1度で128組を学習させているようです。printでは学習の度合いを出力しています。実際には出力と答えの一致具合(True or False)のTrueの割合の平均値を出力しています。最終的には1.0になるとおもいます。

結果の出力

def fizz_buzz(i, prediction):
    return [str(i), "fizz", "buzz", "fizzbuzz"][prediction]

    numbers = np.arange(1, 101)
    teX = np.transpose(binary_encode(numbers, NUM_DIGITS))
    teY = sess.run(predict_op, feed_dict={X: teX})
    output = np.vectorize(fizz_buzz)(numbers, teY)

    print(output)

最後に結果を出力して終わりです。

おわりに

Tensorflow初めて使ってみましたがまだよくわかりません。Tensorflowで何かしようと思っているわけでもないので今後触るかわからないですけど、機械学習楽しいですね。学習している時にMacのCPUファンがガンガン回って数字が1.0に近づいていくのを見ていると楽しいです。

次はSwift関連の記事書こうかなと思っています。