2018年10月19日金曜日

CoreDataでExternal Storage使ってたら死んだ話

久しぶりの投稿です。

問題発生

仕事でiOSアプリの受託開発をしているのですが、顧客から「iOS 12にアップデートしたらアプリが動かなくなった」と指摘がありました。
クラッシュダンプを見ていると、CoreDataにExternal Storageとして保存していたNSData?をForce Unwrapしたところ、nilになっているためFatal Errorという状態でした。

2017年5月26日金曜日

なるべくクリーンにrails newする

rbenv等でインストールしたてのまっさらなRuby環境に、なるべく無駄なgemを入れずにrails newを叩くための備忘録

2016年9月28日水曜日

ChainerでMNISTするまで

1. なるべく最新のPythonを用意する
2. pip install chainerする
3. 以下を実行

import chainer
from chainer import functions as F
from chainer import links as L
from chainer import training
from chainer.training import extensions
BATCH_SIZE = 50
EPOCH = 10
class MLP(chainer.Chain):
def __init__(self):
super(MLP, self).__init__(
l1 = L.Linear(784, 1000),
l2 = L.Linear(1000, 1000),
l3 = L.Linear(1000, 10)
)
def __call__(self, x):
h = F.dropout(F.relu(self.l1(x)), ratio=0.3)
h = F.dropout(F.relu(self.l2(h)), ratio=0.3)
return self.l3(h)
model = L.Classifier(MLP())
optimizer = chainer.optimizers.Adam()
optimizer.setup(model)
train, test = chainer.datasets.get_mnist()
train_iter = chainer.iterators.SerialIterator(train, batch_size=BATCH_SIZE)
test_iter = chainer.iterators.SerialIterator(test, batch_size=BATCH_SIZE, repeat=False, shuffle=False)
updater = training.StandardUpdater(train_iter, optimizer)
trainer = training.Trainer(updater, (EPOCH, 'epoch'), out='result')
trainer.extend(extensions.Evaluator(test_iter, model))
trainer.extend(extensions.LogReport())
trainer.extend(extensions.PrintReport(['epoch', 'main/loss', 'main/accuracy', 'validation/main/loss', 'validation/main/accuracy']))
trainer.extend(extensions.ProgressBar())
trainer.run()
view raw short-mnist.py hosted with ❤ by GitHub


以前Chainer使ったときは学習の設定とかなんだかんだ面倒くさいところがあったけど、
MNISTはデータを直接取りに行ける + trainer使うと学習の部分を簡単にかけるので、こういうMNISTとかはかなり簡単にかけるようになった印象。

30行もあればMNISTの学習ができてしまうというのは、デモンストレーションとかでは非常に良いのでは?

2015年12月27日日曜日

ご注文はPythonですか??

Pythonを書くことになった。


理由

元々機械学習には興味があったが、最近Chainer然りTensorFlow然り、深層学習のライブラリが軒並みPythonで実装されているので、これらを利用するためにPythonを学ばなければいけなくなった。

Pythonに対する印象

最初見た時は、メソッドを書くときにいちいちselfとか書かないといけないのが辛かったけど、変数と関数の名前空間が同じなのは良い。強力なスクリプト言語の一つなので、これまでちょっと使っていたRubyと同様に、色々な作業をさせられそう。ただ、モジュールシステムが割りと複雑な印象を受けた。パッと見。

今後の方針

とりあえず本を数冊読みたい。「パーフェクトPython」とか、最近出た「実践Python3」あたり。
あとはGithubでトレンドに入っているソースを読んで勉強していきたい。

2015年4月12日日曜日

Javaの書きたくなさ

業務でおそらくAndroidアプリを書くことになるっぽいので、重い腰を上げてJavaを勉強し始めようかと思った。

なんというか、型推論が無いとかそういう部分も置いといて、検査例外とかそういうシステムのせいもあるけども、全体的に冗長な記法になりやすいような気がします。入出力とかでもBufferdReaderとかScannerとか出てきて、もっと簡単に書けないのかよっていう。

その点、JVMで動くJavaじゃない言語とかも割りと多い印象。

Java

JVMの基本、Java。Java8あたりではラムダ式とかも取り込んで入るけど、やはり後方互換を意識しているためか、言語そのものが書きやすい方向には変化していないような気がする。環境によっては他の言語とかも動かないことがあるらしいので、その点ではJavaが一番安定?

Scala

JVMで関数型プログラミング言語と言えばScala。Scalaは関数型プログラミング言語ではないという議論はさておき。型推論とかあるし、Haskellに比べると弱いかもしれないけど、関数型プログラミングの機能もある程度充実しているし、オブジェクト指向っぽくも書けるので、割りとやってみたさはある。コップ本は持ってるし。

Clojure

Lisp on JVM。イミュータブルなデータとSTMなんかの機能が特徴?とりあえず勉強中ではあるけど、Javaのエコシステムあまり詳しくなかったりとか、ビルドシステムがよく分かっていないので、あまり進んでいない。

Groovy

この言語、実はClojure、Scalaよりもあとに知ったんだけど、JVM上で動く動的型言語として有名らしい。Gradleという最近のJavaのビルドシステムとかでも使われているらしく、Javaのプロジェクトに携わるならやっておいて損はなさそう。

JRuby, Jython

RubyやPythonのJVM実装。それぞれの言語を利用していて、かつJava系のツールとかが必要になった時に。

Kotlin

最近知ったんだけど、Intellijで有名なJetBrainsが作った言語らしく、静的型の言語で、Javaよりも書きやすそう。Android開発にも普通に使えるらしいので、もしJavaが嫌いだけどAndroidやることになったときにいいかもしれない。

AltJavaと言われる言語は多いけども、結局はJavaのライブラリやJVM周りの知識とかは必要になってくると思うので、そういう点でJava自体もある程度勉強していきたい。

2015年3月27日金曜日

2015年3月14日土曜日

自分をダメにするのをやめよう

というタイトルの自己啓発とか誰かが書いていそうだけども。

これは今後の人生を作っていくにあたっての戒めであって、決意表明です。

 これまでの人生で、一体どれだけの時間を無駄にしてきたかと考えると、やはり恐ろしい物がある。小学生の頃は勉強せず遊んでいたし、中学の頃は勉強せず引きこもってたし、高校の頃はやはり勉強せず遊んでいた。高校の時に情報系の道を志した割には、5年経って(まともにプログラミングやり始めてからは2〜3年程度だけど)未だにまともにプログラムを作ったりしていないし、最後に完成させたソフトウェアって多分SDL使って作ったテトリスだったりする。去年のやつ。
 プログラマのバイトを初めて、情報系では実務の経験を積んでいるように見えるけれども、あまり会社で得られている経験が大きいものとも思えないし、バイトを初めてからめっきりブログもgistも書かなくなって、これは非常にまずい。
 最近37signalsに感化されて、単にエンジニアリングだけで勝負するよりも、一人のプログラマとして現実の問題を相手にビジネスしていかないといけないとは思ってはいるけど、そもそも自分の理想のエンジニア像っていうのは、何らかの分野で高い技術力を持っていて、常人の何倍もの生産性で仕事を片付けてさっさと帰るような人であって、今の自分がそこまで技術を深く習得出来る気がしない。
 ここ最近、というか高校のころからだけど、あまり計算機科学だったりITだったりに熱中したことがなくて、周りの人たちはハックに熱中してる分どんどん伸びていって、年下の人にも追い越されたりして、その部分がコンプレックスであったりはするんだけど、

 やっぱり面白いことは面白いんだよね。Ruby on Railsでどうやってアプリケーションを高速に開発するのかとか、豪華になったJavaScript周りの環境でフロントエンドをどう構築するかとか、どうやったら高速で快適なLinux環境を構築できるのかとか、どうやって立体形状とその名前を結びつけるのかとか。興味のある対象はあって、ただそれに払う情熱が足りていない。

 情熱が足りていないというのは知的好奇心が何か別のリソースに対して払われているということ。体力が何か他のことに使われているということ。何か本当はどうでもいいはずのことのせいで疲れているということ。反省してみると、さして意味はないけども惰性で続けていることというのは思いの外多くて、振り返ってみるとただネット見てたり、ただゲームしてたり、ただテレビ見てたりしている。時間の浪費はやめるべき。ゲームするのを悪いとは思わないけど、それが惰性で行っていることなら続けるべきではない。なんとなくやっていることを続けるよりは、今明確にやるべきだと思えることに注意を払いたい。

 自分をダメにするのはやめよう。(戒め)




それはそうと、最近ブログ書かなすぎなのでは…… 対外的に発表することがモチベーションにつながったりするので、なるべくブログを書く頻度を上げていきたい。
あとWinタブが欲しい。