wolfmasa's blog

フロンターレとプログラミング関係の話題を、気が向いたときにつぶやくブログです。

DeNA TechCon 2017

techcon.dena.com

楽しみにしていたDeNAのイベントに行ってきた。

サーバサイド、モバイルなどはもちろん、テストエンジニアの話なども聞ける貴重な機会ではあったのだが、子供のお迎えが発生し、途中で泣く泣く帰宅。。。

昨年同様、ほとんどのセッションは後で動画で見れるようなので、見逃したやつは後で絶対に見るぞ!

Opening

執行役員の木村さんの挨拶。

Perlハッカーで有名な人だが、挨拶だけなので、全体の概要的な話に終始。

多少緊張していたのか、癖なのか、手がモジモジしていたのが、どうも気になって仕方なかった(何

基調講演―実世界の人工知能

Preferred Networksの岡野原さん

機械学習やDeepLearningのこれまでの流れや、利用方法などの全体的な紹介。

また、Preferred Networksで取り組んでいる課題や解決に向けたアプローチなどの紹介。

Deep Learningの技術紹介自体は、だいたい知っているもので時に目新しいものはなかったが、その応用例の紹介については、いくつか新しい取り組みもあって、興味深かった。

ふーんって聞いていたけど、最後の方で、Preferred Networksの開発者の一人が、DeepLearningで有名なライブラリChainerの作者であることを聞いて、思わず声をあげそうになるくらいびっくりした。そんなにすごい会社だとは知りませんでした。。。

その後のDeNAネイティブアプリ開発

執行役員の池田さんの講演。ずっとゲームを開発してきており、現在もゲーム開発を統括する立場で、根っからのゲームエンジニアという印象。

“その後"とついているように、昨年度の発表の延長を紹介。

正直、昨年の資料の振り返りが多く、私は見たことがなかったのでまだ良かったけど、少し期待外れであったことは否めない。

後半は、DeNAという会社が、Webアプリ・サービス開発から、ネイティブ・バックエンドサーバ開発にシフトするにあたり、組織として色々難しい課題があって、1つ1つクリアしてきたという話。

特に、JSをはじめとしたWebプログラミングと、C/C++から続くクライアントアプリ開発では、確かにリソースや非同期の考え方など、マインドチェンジが必要なのはよくわかる。また、サーバ側だけ見ても、似ているようで求められるスキルセットが違うので、どうしてもオーバーヘッドがかかってしまうという話は印象的だった。

強化学習を利用した自律型GameAIの取り組み ~高速自動プレイによるステージ設計支援~

AIを使って、ゲームを自動プレイし、QAに用いたり、ユーザの対戦相手(NPC)に利用できないかという取り組み。

ターゲットはFinal Fantasy Record Keeperというアプリで、戦闘シーンをAIがプレイするというものだった。

結論から言えば、学習時間が長いのを置いておけば、一般の人と遜色ないレベルまではプレイできるようになるが、ランダム要素や補助魔法などの評価などにまだ課題があるとのこと。

聞いている側からすれば、なぜいかにも難しそうなゲームをいきなり対象にしたのか?という疑問はあった。

古いマリオを機械学習でクリアしたという実験もあったし、もっと入出力、そして評価(報酬)がわかりやすいものから取り組んだ方が良かったのではないか、と思った。

また、ゲームをAIでプレイするためには、時間がかかりすぎるので、シミュレータなどで効率的に試行できる環境を整えた方が良いというアドバイスは印象に残った。

こういう取り組みは面白いので、もっとやってほしい。

サービスの成長を支えるフロントエンド開発

JS界隈の技術動向と、最近流行っている技術の紹介。

前半は、いかにJS界隈が毎年のようにいろんなライブラリやフレームワークが出てきては消えていくのかを紹介し、その中で開発当時のトレンドがその後の運用不可に博打的な影響を与えてしまう可能性があるという点を確認。

たかだか、HTMLとCSSJavascriptを生成するだけなのに、なんでこんなにいろんなツールが必要で、それがまた時代とともに大きく入れ替わっていくのか、という素朴な疑問が印象的だった。

主に、React + Reduxの紹介と、Vue.jsの紹介をしていたが、それを動かすのはRuby on Railsの上で動かしているのはちょっと変な感じ。

Vue.jsは確かに最近聞くようになった気がしていたけど、その人気急上昇っぷりを再確認。

おまけ

会場に早く着いたので、置いてあったノベルティをいくつか貰うことができた。

期待通り楽しかったので、来年はもっとゆっくり参加したいな。

GitLabメモ

GitLabについて、まだまだ情報が少ない気がしたので、ざっとメモを残しておきます。

設定に困ったら、まずはgitlab.rbを見るべし

GitLab、特にomnibusの場合には、いろいろなモジュールが含まれており、それぞれの設定を管理する必要があります。

そのためにまず覚えるべきは、gitlab.rbの存在です。基本的には/etc/gitlab/gitlab.rbとかにあるはずなので、開いて設定しましょう。

gitlab.rbは様々なGitLabに含まれる設定項目を1まとめにしたものですが、変更するだけでは反映されないので、コマンドを実行し、各モジュールに反映させてあげる必要があります。

sudo gitlab-ctl recofigure
sudo gitlab-ctl restart

注意としては、gitlab.rbを使わずに直接モジュールの設定を変更している場合には、その設定が上書きされて消えてしまう可能性があります。以前、コード中に固定値で格納されていたあるMax値を直接変更していた際に、recofigureをした瞬間に上書きされて消えたということがありました。

GitLabはRailsである

忘れがちですが、GitLabはRailsアプリです。そのため、基本的にはRailsの知識がほぼ同じように使えます。

例えば、rake routesは、GitLabコマンドに置き換えられていて

sudo gitlab-rake routes

になるだけです。サーバ全体のコントロールはgitlab-ctlですし、rakeを使う場合にはgitlab-rakeです。

デバッグしたい時

うまく動かなくてデバッグしたい時もあるでしょう。(普通ないかな?)

その際には、rails consoleではなく、

sudo gitlab-rails console

をすればirbが起動して、サーバの中で動いているコードをデバッグすることができます。

ちなみに、起動後の問題であればirbで良いのですが、何かのエラーで起動しない場合には

sudo gitlab-ctl tail

を実行することで、ログを見ることができます。もし対象のモジュールが分かっている場合には、

sudo gitlab-ctl tail unicorn

などとすることで、フィルタリングできるようです。

バックアップ・リストアをマスターすべし

サーバとして運用する上で、バックアップとリストアの機能は必要不可欠です。

定常的にバックアップを保存するのであれば、gitlab.rbのバックアップの項目を設定するべきです。

何かの事情で、手動でバックアップを実行する場合には、

sudo gitlab-rake gitlab:backup:create

とすれば、保存されたフォルダにバックアップ作ることができます。その場合でも、出力フォルダをgitlab.rbを参照して確認するべきでしょう。もちろん、編集したらrecofigureを忘れずに。

SKIPオプションを設定すれば、db以外とか設定も可能ですが、通常の用途ではあまり使わないような気がします。

リストアするときは、バックアップしたtarファイルを保存先フォルダに格納しておきます。

その上で、ファイル名ではなく、ファイル名中のタグを使って、リストア対象を指定します。

sudo gitlab-rake gitlab:backup:restore BACKUP=1393513186_2014_02_27

困ったら、だいたいここに書いてあります。 https://gitlab.com/gitlab-org/gitlab-ce/blob/master/doc/raketasks/backup_restore.md

インストール、アップデートは簡単

2、3年前は、非常に手間のかかる作業だったものが、最近は一発でインストール、アップデートできるようになりました。

# install GitLab Community Edition
sudo apt-get install gitlab-ce

# update
sudo apt-get update

これじゃ、何も言うことはありません。素晴らしい。

Apple Watch アプリを作る WKInterfaceTimer編

はじめに

Apple Watch用のアプリを作ってみようと思います。

まずは手始めに簡単なタイマーアプリを作ってみます。

準備

とりあえずiOSアプリと同じような準備が必要です。

MacXcodeが必要なのは周知の事実です。私が使っているのは2013年モデルということもあり、Xcodeが重い重い・・・特にシミュレータの起動が遅いので困っていますが、それでもなんとか開発はできています。(気長にいきましょう)

開発をしていると、当然実機でうごかしたい、動かす必要があるので、Apple Watch本体や、本体にデプロイするためのDeveloperアカウント(有料)が必要です。

確か、最近のiOS開発では、無料のアカウントでもiPhoneで動かすことができると聞いた気がしますが、私の調べた範囲ではWatchは無理らしいです。らしい、と書いたのは、記事の書かれた時期や、そのiPhone開発者に向けた権限の変更をふまえてもWatchは無料ではできない言及している記事が見つからなかったためです。

Story Board

まずStory Boardをいじってみます。

基本的にいつものiOS開発と同じですが、Viewの制約が思っていた以上に大きい。

特に、ボタンやラベル並べようとすると、サイズを小さくしても縦方向にしか追加できず、横に並べるやり方がわからなくて少し困った。

幸い、調べたらGroupというオブジェクト?を使って、サイズを小さくする事で横にはならんだけど、それでも3つ以上のボタンを並べたりはできないらしい。

Timerの表示

タイマーを作成するのにうってつけのViewがあります。

WKInterfaceTimerというもので、配置すれば"59:59"のようないかにも時間が表示されるようなViewがあらわれます。

あとは、このWKInterfaceTimerをコードから制御すればよいだけです。

(もちろん制御するためのボタンも追加しましょう)

Timerの制御

これから私の書いたサンプルをベースに、制御の仕方を簡単に紹介します。

@IBOutlet var timerView: WKInterfaceTimer!

WKInterfaceController(UIKitで言う所のViewController)でこのように定義しておくことにします。

スタート

timerView.start()

これだけ、あら簡単。これでカウントアップが開始されます。

カウントダウン

カウントダウンするためには、カウントする時間をセットする必要があります。

セットするためにはsetDateを使うのですが、引数はDate型なので、それを作ってあげる必要があります。

var countDownSecond: int = 30
timerView.start()
timerView.setDate(Date(timeIntervalSinceNow: TimeInterval(countDownSecond+1)))

ここで注意なのは、スタートしてからセットしないと秒数が飛んだように見えるということです。

あとは、時間をセットするためにDateが必要で、そのDateを作るためにさらにTimeIntervalが必要になるということくらいでしょうか。あとTimeIntervalの引数も0はじまりなのか、1ずれるので加算しています。

ストップ

timerView.stop()

基本的にはこれで止まります。あら、かんたん。

が、

問題はここからです。

表示上は止まっているのですが、実はこれ表示の更新を止めているだけ。

もう一度スタートを実行をすると、止まったところからではなく、ずっと裏で動いていた時間分だけ先に進んだ表示になります。

これは少し考えればわかりますが、Dateを指定しているということは、目標の日時を設定しているため、現在の日時との差分をただ表示するという動作になっているからです。

なので、stopをじっこうしても、目標の日時は変わらないので、再度startをした際に飛んで動き出すような表示になってしまいます。

一時停止

そのままstart/stopを読んでも一時停止にはならないので、一時停止をしたい場合には自分で実装してあげる必要があります。

正しい方針はわかりませんが、とりあえず私はシンプルな方法を試しました。

  • stopされたときに、残りの時間を記憶しておく
  • startされたときに、残りの時間と今の時間との差分(止まっている間に消費した時間)計算し、差分を目標時間に加算する

という感じです。

func stopTimer(){
  suspendedTime = targetDate.timeIntervalSinceNow
  timeView.stop()
}

func startTimer(){
  timeView.start()
  if(suspendedTime != nil){
    targetDate = targetDate.addingTimeInterval(suspendedTime! - targetDate.timeIntervalSinceNow)
    suspndedTime = nil
  }else{
    targetDate = Date(timeIntervalSinceNow: TimeInterval(targetSec))
  }
  timerView.setDate(targetDate)
}

サンプルなので一部省略していますが、基本的にはこの流れで一時停止っぽいことができました。

まずはめでたしめでたし。

SOFT SKILLS ソフトウェア開発者の人生マニュアル

SOFT SKILLS ソフトウェア開発者の人生マニュアル

SOFT SKILLS ソフトウェア開発者の人生マニュアル

全体を通して

ソフトウェアエンジニアの生き方みたいな本はいくつも出ているし、ほとんどが海外の話なのはちょっと残念ではあるけど、例えば情熱プログラマーみたいな本かなと思って読み始めた。

情熱プログラマー ソフトウェア開発者の幸せな生き方

情熱プログラマー ソフトウェア開発者の幸せな生き方

読んでみると、確かにそういう部分はあるのだが、それ以外の部分、例えば筋トレとか健康とか、本当に過不足なく体系的によくまとまっているような気がした。

matzが書いているように、お金の話や仕事の話は、ある程度アメリカで書かれた本ということを鑑みて読む必要はあるが、それ以外は十分今後の人生の参考にしたい本の1つだ。

キャリアを築こう

キャリアをどう考えるかという話。

自分のキャリアパスは、まず目標を決めて、それに向かって仕事を選ぶべし、という流れ。

会社での社交術、スタートアップの起業や、フリーランサーになること、仕事を辞めることなど、幅広く取り上げられているのがすごい。

こういう話は、ある程度抽象的にならざるを得ないので、参考として聞いておく他ない。

自分を売り込め!

情熱プログラマーとかでも言われている通り、自分をブランドとして確立させるためにブログやポッドキャスト!?を通して、日頃から活動すべし、などがある。

確かにその通りなんだけど、なかなか実行できないので、それだけで差別化になるという話。

これもそうだけど、ブログはどうしても埋もれやすいので、質と量を追求していかないと難しい気がしているし、ポッドキャストも続けるためにはゲストの問題など、難しい側面がある。

とはいえ、できることを1つ1つやることが、きっと次につながっていくので、やはり今年はアウトプットを意識的にしなきゃなと思う。

学ぶことを学ぼう

新しいことを学ぶことは良いことだ。

ただそれで終わらずに、どうやって新しい技術を学んでいくべきか紹介している。

とても参考になったので、簡単に紹介しよう。

  1. 全体像をつかむ
  2. スコープを決める
  3. 成功の基準を決める
  4. 参考資料を見つける
  5. 学習プランを決める
  6. リソースをフィルターにかける
  7. 使い始められるようにする方法を学ぶ
  8. 遊びまわる
  9. 役立つことができるところまで学ぶ
  10. 教える

1−6までが最初に行う準備のステップで、7−10が繰り返して学んでいくステップだ。

新しいことを学び始める時って、なんとなく本を読んだり、サンプルをダウンロードしたりして始めるけど、その後詰まってしまうことがある。その理由はいろいろあるけど、学びがスピードに乗ってきたときに、再度資料を探したり、どこまでやれば終わりかわからずにマンネリ化してしまったりする。それを避けるために、まずステップを決めて、それに乗って準備をして、その後の学習のプロセスをスムーズに、そして過不足なく進めることができる。

繰り返し学んでいくステップでは、よく言われることではあるけど、まず遊んで使ってみて、最終的には人に教えることでわからないところを埋めていく。自分なりに発見だったのは、9の役立つことができるところまで学ぶという、ゴールを意識して学びを繰り返していくところだ。どうしても言語のを学ぼうとすると、例えばGO言語やJavascriptなど最近の言語であれば、できることは際限なく、やっている中で自分を見失いがちだ。それを、自分が必要としているところから逆算することで、達成基準を明確にし、達成感を得られるという心理的効果も含めて、とても良いことのように思える。

生産性を高めよう

このあたりから徐々にエモい話になってくる。生産性を高めるツールや考え方の話。特にハードワークをしろ!という根性論が印象的だった。

ポモドーロなどは、その筋では有名な集中のためのツールではあるが、それ以外にもルーチンを決めることや、習慣を作るために必要なことなど、ソフトウェアエンジニアに限らない、一般的な生産性を高める話がある。

アジャイルな時間管理術 ポモドーロテクニック入門

アジャイルな時間管理術 ポモドーロテクニック入門

個人的にはこういう自己啓発のような話は参考になるし、結構好きだ。最近、AppleWatchを使ってポモドーロもやっているし、この本を読んでいきちんとルーチンワークを管理し始めたところだ。

自分を動かすということは難しいことだが、生涯使える技術なので、やっておいて損はない。

お金に強くなろう

エンジニアといえどもお金は重要だ。著者が、不動産運営を副業で行なっていたため、30代で現役を引退するほど資産を貯めることができたということに由来し、お金についてきちんと考えることの重要性と、その手法を説明している。

とはいえ、読んでいてとても違和感があるのは、前提としてアメリカ、特に西海岸では、ソフトウェアエンジニアの給料はとても高いということにある。

ソフトウェアエンジニアは給料をたくさんもらっているので、その給料を運用することで、より安定した人生を送ることができる、というロジックは理解できても、前提の給与水準については日本はむしろ逆のことが多いので、あまり参考にならない。

人月産業、よくSIerと呼ばれる産業ではなく、アメリカのようなきちんとエンジニアが評価される社会であれば、どんなに生きやすいことかと考えることは、1度や2度ではないと思う。

やっぱり、体が大事

健康は重要という章だが、ほとんどを筋トレやトレーニングの話が占めている。

ダイエットの話も出ているし、知識としては参考になるが、今の自分からしたらあまりすぐ実践するようなものではない。

ただ、運動することは重要だと思うし、少し意識が弱かった木がするので、時間があれば走ったりしようかなと思っている。

負けない心を鍛えよう

体だけじゃなくて、心も大事だ、ということはよくわかる。

おそらく、ナポレオン・ヒルの思考は現実化するという本に大きく影響を受けたようで、プラス思考でいくことの重要性を説き、そのためにどういうマインドでいるべきかを説明している。

個人的には、この本はあまり刺さらなかったというか、強い思いを持つことで、それが結果的に実現するという内容だが、それをひたすらにたくさんのページで説明しているだけの本のように思えて、いい思い出はない。

ただ、思いの持つ重要性というものは、価値を再認識しても良いとこれを読んで感じたので、そこのところについてはもう少し意識的にプラス思考で行こうと思っている。

最後に

この本はお勧めできる本か?と言われれば、間違いなくYESと答える。

細かい章立てで、幅広い話題に言及しているし、内容に関しても偏りは少ない方(こういう本の大体は自説を主張しすぎる気がする)だと思う。

あとは、ポモドーロのような手法に言及したり、ハードワークが大事だと根性論を持ち出したり、お金の話をして現実に引き戻したり、変化にも飛んでいる。

気になるのは、どうしてもそのページ数が多いので、全てを読もうとすると結構タフだということだ。それさえ気にしなければ、とても良い本だと思う。

ゼロから作るDeep Learning

ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装

GitHub - oreilly-japan/deep-learning-from-scratch: 『ゼロから作る Deep Learning』のリポジトリ

飛ぶように売れているというDeep Learning本を読んでみた。

Rebuild.fmでもnaoyaさんが絶賛していたけど、その前評判?を裏切らないわかりやすさ。

GitHubリポジトリを見ながら少し写経とかして見たら、たちまちわかった気になれた(笑

難しい内容ではあったが、説明が丁寧でわかりやすいので、詰まることなく読めたので、好評なのも頷ける。

Python入門

インストール方法などを丁寧に解説。この辺が初心者向けっぽくてほのぼのしている感じ。

パーセプトロン

パーセプトロンの基本的な考え方の解説。確かに、画像処理のブロック図と似ているし、自分のバックグラウンドからするととてもわかりやすい。

ニューラルネットワーク

いよいよ、ニューラルネットワークの構築が始まる。多分、一番重要な章ではないか。ここを理解すれば、半分は理解できたと同じ。

ニューラルネットワークの登場人物の説明だけでなく、自分の書いたコードで、実際にMNISTを使って手書き文字の認識ができてしまうのが、地味に感動する。達成感大事。

ニューラルネットワークの学習

ニューラルネットワークを使って、どう学習していくかという基本的な考え方。その後の話につながるもう一つの柱。

勾配法とか、概念は分かっていたけど、改めて実装してみると、こちらもなんだか分かった気になってしまう。

誤差伝搬法

徐々に、どうやって効率的に学習を進めるかという現実的な話になる。

誤差伝搬法の考え方は、ちょっと難易度が上がる気がしたので、繰り返し読んでようやく概要がわかった気がする。

全体を通して、説明が丁寧で素晴らしい。特に数学的な説明を丁寧に行うので、それだけでも精神的に嬉しい。

学習に関するテクニック

いかに学習を早く終わらせるか、という課題の続き。いくつかの方法を提案。

だんだん、理論でスッキリ説明というよりも、実際に動かしてみるとうまくいく、的な話が増えてくる。おそらく内容が難しいので説明しきれないと思うので、その辺のさじ加減も筆者はよく考えていると思う。

畳み込みニューラルネットワーク

ニューラルネットワークと言っても、基本的には今までの考え方と同じだが、pythonのライブラリなどの話を交えつつ、畳み込み計算に持ち込むことでより高速に実行する話を加えてある。どこまでが汎用的(python以外でも同じ)で、どこからがpython独自の話なのか、ちょっとわかりにくかったような気がする。

ただ、事例はよくありそうな話だし、CNNの解説もわかりやすかったので、なんとか話についていくことができた。

ディープラーニング

hotな話題を、軽く流す。

歴史的な話や、今取り組まれている課題など、ディープラーニングにまつわる雑学をまとめた感じ。

ある種、エピローグ的で、おまけ的なので、気軽に読むことができた。

2017年の抱負

2017年になって、いくつか目標を立ててみようと思います。

  • 毎日英語に触れる
  • 毎週ブログを書く
  • 毎月1冊以上技術書を読む

きちんと技術を勉強して、それをブログで情報発信すること。

そして、自分の幅を広げるためにも、もう一回り英語の力をアップしていく、ということが目標。

さて、毎日頑張りましょう。

2017年の抱負

2017年になって、いくつか目標を立ててみようと思います。

  • 毎日英語に触れる
  • 毎週ブログを書く
  • 毎月1冊以上技術書を読む

きちんと技術を勉強して、それをブログで情報発信すること。

そして、自分の幅を広げるためにも、もう一回り英語の力をアップしていく、ということが目標。

さて、毎日頑張りましょう。