2017年の目標

あけましておめでとうございます。本年もよろしくお願いいたします。

技術目標

  • Android開発経験をさらに深める
    • 2016年はAndroidにガッツリ関われた年だったので、引き続き2017年も継続したい。幸いなことに当面の仕事もAndroid関係で進められそう。
  • DDDの理解を深める・社内勉強会を開く
    • プライベートはこれかなと。良いアプリケーションを作る術を身につける一年にしたい。
  • Python/Djangoの勉強
    • なんかウェブアプリ作れって言われたら基本これでやりたい。管理画面使いやすすぎてもう離れられない…
  • 機械学習ディープラーニングをちょいとやる
    • とは言ったものの、どこから手をつけて何をするか…pix2pixとかは趣味の絵描きの色ぬりに使えるかも?

生活目標

  • プライベートを頑張る
    • あまり詳細は書けないが、2016年はプライベートも結構激変があった年だった。
    • このままいくと本当にまるで想定していなかった人生を送ることになる可能性もある。人生とは面白いものだと改めて感じた。
  • 肉体改造
    • 体は資本、どんな仕事をするにしても屈強な肉体は役に立つ。
  • 絵の練習
    • 優先度低いが、余裕があればデッサン教室などに通い真面目に習ってみたい。

以上本年の目標です。どれもパッと思いついたものではなく、2016年にやったことを踏まえてこうしたいと思って掲げたものです。2017年も頑張っていきましょう!

2016年の振り返り

2016年は全然ブログを書かない年でした。それに年初にやろうと思っていたこともあまりできなかった年です。

軽くメモ的に2016年を振り返っておきます。

今年1年やったこと

  • 1月から3月
    • 去年からの続きの仕事、アプリ運営(あとインフラ管理)
  • 3月から4月
    • スポット的な仕事、やや転職活動をして見た時期(結局転職はしていない)
  • 4月から7月
    • Reactを使った仕事、フロントエンドをがっつりやった
  • 7月から現在
    • ひたすらAndroidをスクラッチから開発
    • とても良い経験を積めていると思う

1年やったことの総括

  • やりたいと思っていたフロントエンドをがっつりできた1年だった
  • 自分の開発力を今一度静かに受け止めることができたと思う
    • 別に自信が無くなったとかそういう話ではない
  • アプリ開発に関しては、最終的にDDDに関心が行ったのでちょいちょいEric Evansの本は読んでいる
    • とはいえやっぱ分厚い…
  • フロントエンドをがっつりできたので、僕の中ではようやく一通りの開発経験が積めたと感じている

年初の目標の振り返り

  • 閉塞感の解消
    • 解消はまだできていないが、一通りの開発経験が積めたのでこれからかなと思っている
  • 仕事と個人の能力向上の両立
    • フロントがやりたい年だったので、特にプライベートを削ってがっつりやる必要はない年だった
  • もう深く踏み込めない領域に対する未練を断ち切ろう
    • いや、断ち切らなくて良い
  • 機械学習
    • やります(宣言) 特にモバイルと組み合わせる機械学習に興味がある
  • テストコード
  • インフラ
    • 今年は本当に全くインフラを触らなかった。それほど知識が抜けた感はないが、手は動かなくなってるかも
    • ちょっとそこらへんのリカバリーはしていきたい

下書きはチラチラ書いていたのですが、2016年内に公開できませんでした。

2016/09/28 #potatotips #33 のレポート(Android視点)

potatotips #33 に参加してきました。初参加です!

あまりレポートになれていないので、至らない部分があると思いますが、ご了承ください。

iOS発表

facebookやslackのタイムラインで、オフライン時に上から出てくるバーを作る

teruto_yamasaki

  • オフライン時に表示されるバー
  • タイムライン系のアプリに実装されている事が多い
  • UINavigationBarを拡張できないか
    • 拡張できるが、実際にはUIControllerにビューが追加されている
    • demo

大で小を兼ねるな

takasek

  • 日付を管理するときの型
  • Date型は便利だけど、ただ日付が欲しいならstructで良いんじゃないの

(仮)Firebaseでインスタグラム風アプリを作った話

motokiee

  • Firebaseで作るオリジナル結婚式アプリ
  • 世の中iOS
  • 配布はDeploygate
    • 人による運用でカバー
  • バックエンド
    • Firebase
    • フリープラン
  • リリース日(結婚式)厳守
  • tips
    • 嫁にデプロイ作業・push通知をお願いした

UITableViewのスクロールに合わせてUIViewControllerを縦方向にページングする

marty-suzuki

  • HoverControllerView
  • 説明しづらい

Xcode8のCI事情

nafu003

  • Xcode8のCI事情
  • CI対応事情

BPGの話

がんじー

  • WebPは時代遅れ?
  • BPG … 画像形式のひとつ
  • 容量が小さい割に高画質
  • HCImage+BPG
  • WebPに比べてデコード・エンコードはすごく遅い
  • 採用事例、特になし
  • 特許を何か侵害してる可能性あり
  • WebPでいいんじゃねという結論

使いたくないStoryboardを使わないでよくする為には

satomiretriever

  • Storyboardを使わない方向性
  • Storyboardを使う理由
    • 初速が出る
    • 画面遷移をおいやすい

最近のCoreDataについて

Noritaka Kamiya

  • iOS10でCoreData変わった
  • NSPersistentContainer
    • 一番話したかったところ
    • ちょーかんたん

Android発表

Battery Historian v2

futabooo

  • Battery Historian v2
  • eureka
  • バッテリーヒストリアンとは?
    • Google I/O 2014で発表されたもの
    • Android端末のバッテリー使用状況を可視化するもの
    • adbでログを出力→historian.pyでhtml可視化
  • v2について
    • 機能は変わってない
    • GoとJavascriptで書き直した
    • ブラウザUIが追加された(ログをブラウザからアップロードできる)
    • 倍ぐらい項目増えた
    • サービスの動きも見れる

Ormaのハマリポイント

lVlA0805

  • eureka
  • parisでOrma使用
  • Ormaではまったこと
  • Upserter == INSERT OR REPLACE
    • Conflict時はDELETEしてからINSERT
    • ON CASCADE DELETE
    • 外部キーあるとレコード消える
    • 対処
      • UPDATE件数を見てINSERT
      • OnConfig.FAILで例外キャッチ
  • 外部キー制約付きカラム
    • 外部キーのカラム型がINTEGERからBLOGに変わってる
    • WHEREに外部キーが絡むとバグる
    • 対策
      • storageTypeに
      • INTEGERを指定

gRPC(仮)

mootoh

  • Realm Mobile Platformの話
  • Dropbox Paper的なものを試しに作る
  • Realm使ってたなら特に違和感なくsync処理をかける
  • tips
    • Androidのサンプルだとそのまま動かない
    • keychain sharing onで動く
    • ローカルサーバーはnodejs

yuyakaid

  • ページングの状態管理から開放されたい
  • ページング = 追加読み込み
  • RecyclerViewでデータを取得
  • 普通にやると読み込みがたくさん走る
  • 読み込み中フラグを持とう
  • どこに持つ?
    • Activiy/Fragmentに持たせるのは嫌なので、クロージャに持たせる

Activity Transition Animation

bina1204

  • RecyclerViewからViewPagerへのActivity Transition Animation
  • アニメーションを遅延すれば色々できる
    • postponeEnterTransition

WebSocket for Android v3(仮)

kaelaela

  • okhttpでweb socketをつなぐ
  • okhttp3.5のsnapshotを使う

(仮)ヌガー対応

hashimoto

  • Android7.0
  • ヌガー対応
  • 更新するとRecyclerViewの画面が白くなる
    • notifyItemInsertedが原因だった
    • Handlerでpostしろ
  • ダイアログが白くなる
    • スタイルの問題
  • 早めのN対応おすすめ

Firebase Test Lab 5つのtips

horief1024

  • Firebase Test Lab
    • I/O 2016で公開されたもの
    • Android用のクラウドテスト環境
    • テスト結果動画で見れる
  • Roboテスト
    • Monkey Testと何が違う
      • ランダムな操作が毎回行われるわけではない
      • Roboテストで実行できる操作は限られる
    • 実行環境
      • サインインやログイン画面は突破できない
    • yamlでテスト実行環境を整備できる

僕が面白いなと個人的に感じたのはlVlA0805さんのOrmaのハマリポイントでした。最近プライベートでOrma使っていたので。

最後に会場で提供されていた軽食の写真です。サクッと食べることが出来て、なおかつとても美味しかったです。ありがとうございました。

f:id:lycaon_mk2:20161002031406j:plain

2016年最初のメモ

メモ的なもの。

  • 閉塞感の解消
    • 何か専門分野(これは人に負けない、というもの)を見つけたい
    • 去年1年を振り返って、「プログラミング言語」に対する興味は持続していた
    • プログラミング言語の興味を拡大させ、もっと一般的な「言語」に対する興味にできる?
    • それとももっと理論的な分野(形式言語・パーサージェネレータ等)を強めるべき?
    • 正規表現エンジンとかはちょっと作ってみたいかなと思っていないこともないこともないこともない
    • ドメイン駆動開発はちゃんと本を読もう
    • アプリエンジニアとして成長した先に何があるのかを知りたい
    • 抽象的な興味を具体的な目標に落とす能力がほしい
  • 仕事と個人の能力向上の両立
    • 仕事ではマニーにつながることが要求される
    • 個人の能力向上はマニーに直結しない(ことが多い)
    • あれ、どうにもできなくね…
  • もう深く踏み込めない領域に対する未練を断ち切ろう
    • データ分析、今から統計をイチから学ぶのは無謀だね、世の中にはそういう未知を極めたPh.D持ちがうようよいる
    • 機械学習、なんとも言えない、頑張るべきだとも感じている
    • アニメ(業界)に対する漠然とした興味・羨望
      • 最近3Dのアニメ流行ってるし、そこらへん頑張れば関係した世界に飛び込めるんじゃないかという思い
      • ガルパン劇場版のエンドロールにも「システムマネージャ」みたいな人がいたし、でもそれはそこまでモチベーションにならないよね

個別分野の取組方法

  • 機械学習
    • やっぱ逃げちゃだめだ
    • いやでも一人でどうやって勉強するの
    • 勉強会とかあるのかな…
  • テストコード
    • Serverサイドは書こう、特にLambda使う場合は非常に書きやすい
    • クライアントは…
    • クライアント側はある程度大規模にならないと書くモチベーションが生まれない
  • インフラ
    • へんじがないただのしかばねのようだ、でも何か頑張れる気はしている
    • Lambdaは頑張れる
    • Dockerは馬鹿でも使えるようになって、かつDockerによってどのくらい数字のインパクトが出るのか、という記事がいっぱい出てきたらやる(というかまぁそうなったら皆やらざるを得ないという話か…)

2015年の棚卸し

振り返るのも大事だなと思ったので。

月ごと

1月

あまり記憶にないけど、多分DevOps周りの何かをやろうとしてもがいてた。Puppetとか触って満足していた頃。

2月

多分Goを触り始めた時期。仕事はサービスのリリース時期で非常に辛かった。あと初めてデブサミに行った。

3月

勤め先でUnityの開発合宿がある。フロントもいいな〜と思う。ただこれ以降Unityに触れることは一度もなかった。

4月

仕事の環境が変わり、Javaのバックエンドを中心に触る。相変わらずGoいいなーと思っていたけど、勤め先のチームのリーダーから色々ツッコミを受ける(Goがジェネリック持ってないとことか、言語設計が古いこととか)

5月

Node.jsでサービス運用のためのツールを作る。Nodeいいなーと思う。

6月

確かこの頃からNode学園にチラチラ参加するようになった…気がする。

7月

仕事でAndroid側もやることになり(ネイティブアプリのサービス)、色々と世界が開ける。

この頃から、できるだけ仕事はフロント(というか非インフラ)な部分をやりたいと思い始める。サーバーレスという単語も最近出てきたけど、僕は全面的にその方向性を支持している。

8月

Androidフィーバー中。Rustに少しだけニアミスするタイミングがあったが、難しさにギブアップ。

Goでインフラ管理用のツールを書いた。(プログラムを長期稼働させた際のメモリリークが問題になっていたので、そこら辺をクリアするために色々と頑張った)。

9月

相変わらずJavaでバックエンド&AndroidScalaもちょっとやってみる。

10月

相変わらずJavaでバックエンド&AndroidAndroidのことが少し分かり始める。

11月

ほぼAndroidだけ。やっぱりフロントは慣れないと色々難しい。(アニメーションとThreadはサーバーサイドからやってきたエンジニアにはなかなか難しかった)

あとGoで簡単な言語実装を行う。

github.com

12月

Androidとインフラ少し。AWS Lambdaを使う機会があって、サーバーレスの魅力を存分に感じることができた。

まとめ

プライベートは仕事とは全然別のことやってやる!と思ったけど、やっぱり仕事に追われてなかなか出来なかった。特に今の職場環境では自分のスキルアップも評価の項目に入るので、思うように取り組めず(スキルアップするためには結局自分のプライベートな時間も使うしかない、でもそれ仕事の評価にも関係するんだ、と思うとなんかモチベを上げられなかった)

この1年で把握できた自分の癖は、

  • あらかじめ「〇〇やる!」と宣言して取り組む → 絶対にできない、やる宣言した時点でやれた気になっちゃってるのかもしれない
  • 流行ってるからやる → これも以外と無理だった、最初取り組めるけど長続きできない
  • 自分が興味が強いからやる → これはギリギリ継続できるかもしれないと思えた、特に言語実装とかは自分のペースでできるから良い。ただ他人からの評価が貰いづらい(特に仕事との兼ね合いが…)

という感じで、とにかく自分の興味を伸ばす方向で何かをやるしかないなと思った。当たり前といえば当たり前なんだけど。

ただ一口に「興味」と言っても難しいと思うので、僕はより「一般化した興味」を考えるようにした。つまり個別具体的な技術じゃなくて、もっと目的に近い(例えば「〇〇を使って何かする」、じゃなくて「何かをしたいから、そのために〇〇を使う・作る」というような)ことを考えた。で、今の自分がどういう一般化された興味を持っているというと、

  • インフラ管理が必要ないアプリ開発の実現
    • Lambdaはやっぱり良いと思えるし、FirebaseやParseも気になる。Meterorも。
  • 分散したインフラ環境を用意に扱える環境の実現
    • yonでやりたいこと。
  • モバイル端末をもっとプログラマティカルにする
    • 言語実装への興味の派生系、Smalltalk的な環境を自分で作ってみたい。あと、電車内で立ちながらサクッと何かアルゴリズムの勉強(コーディング)ができたらいいな〜と思っている。
  • テストコード、どうしよう
    • 色々とテストコードとの向き合い方について考え直す必要があるなと感じている。自分が一から書くテストコードならパラメトリックにしたりしてメンテナンス性をある程度考えてモチベを保てるけど、そうでないベタ書きのテストコードを前にしてにあまりにモチベを保てない自分に驚きを感じたので。

というような感じ。

逆に興味の度合いがやや減ったのは、

  • 機械学習
    • このビッグウェーブに乗り遅れるちゃダメだ!と思ってたんだけど、やっぱりそれほどやる必要はないかなと思った。多分そのうち頭が良い人たちがAPI化してくれて、仕組みを知らなくてもそれなりに使えるようになると思う。

という感じで、流行りから目を背けようとしている感じが辛い。でも強い興味を持続できないから技術を自分のものにできない可能性が高いので、やらないという選択肢も大事なのではないかと思う。

とにかくこの1年は、個別具体的な技術に触れて満足していた自分からの脱却を図る(図りたい)という点につきた。まだそれを自分が納得いくレベルで実践できていないと思うけど、できるだけその方向性で取り組めれば良いと思う。(曖昧な言葉を使うのは、その言葉で自分を縛りたくないから)

SerfをAWSで使った

serfとは

serfdom.io

クラスタ管理用のツールです。クラスタ全体にメッセージ送信を行ったり、クエリーを実行することで各ノードの色々な情報を収集したりすることが出来ます。

serfの持っている機能としては、

  • クラスター形成機能
  • ノードに対するイベント通知機能
  • ノードに対するクエリー実行機能(クエリーを実行すると、各ノードにイベントが通知され、なおかつそのイベントの実行結果を収集することができます)

といったものがあります。

今回やりたかったこと

あるアプリケーションの動作に問題が発生していました。

  • 問題の動作
    • アプリケーションがメモリリークを起こしており、long runningさせると一定時間経過後(350時間経過後)ランダムにOutOfMemoryを起こしてアプリケーションが終了してしまう
  • 期待する動作
    • (A) アプリケーションがOutOfMemoryを起こす前に再起動させ、メモリリークをリフレッシュする
    • (B) アプリケーションは複数のサーバーで動いていて、それぞれのアプリケーションは排他的に再起動する

期待する動作Aは何かしらのプロセス監視ツールで実現できますが、Bはよくあるツール(例えばcron)でやろうとすると非常に手間がかかります。今回は上記のBをシンプルに実現するため、また技術的な興味からserfを使うことにしました。

続きを読む