TakayukiKoyama Geek Blog

Create, Entertain, Experience

TensorFlow Android サンプルアプリ ビルドエラー Unable to find source java class: 'xxxx/Constant.java'

機械学習で話題の TensorFlow ですが、Androidアプリを試してみたくてセットアップしていたらドキュメントに書いてないエラーが発生したのでメモ。

Andorid Studioによる基本的なセットアップは下記のリンクの通り。

Building TensorFlow on Android  |  TensorFlow

しかし、そのままビルドしようとすると以下のようなエラーが出る。

Unable to find source java class: '<git cloneしたディレクトリパス>/tensorflow/tensorflow/java/src/main/java/org/tensorflow/op/core/Constant.java'

Github issuesに解決方法が書かれていた。

Unable to find source java class: '/Users/vinay.garg/AndroidStudioProjects/tensorflow/tensorflow/java/src/main/java/org/tensorflow/op/core/Constant.java' · Issue #15785 · tensorflow/tensorflow · GitHub

"Build -> Rebuild Project" すれば良いとのこと。

ただし、一回ビルドしてしまうと別のエラーがでることがあったが、そのときは "Build -> Clean Project" で解決した。

TensorFlowではじめるDeepLearning実装入門 (impress top gear)

TensorFlowではじめるDeepLearning実装入門 (impress top gear)

RubyKaigi2018の学び

 RubyKaigiで学んだことをまとめてみる。2019に行くときになった場合のための備忘録。かなり初心者(初参加)目線で書いてるので予めご了承を。

rubykaigi.org

RubyKaigi2018参加時の自分の状態

  • Ruby2.1 Goldを取得する程度の知識
  • Ruby on Rails のお仕事は計1.5年ぐらい
  • メタプログラミングRubyRuby部分は読んだ
  • RubyKaigiは初参加
  • 英語にあまり触れていなかったので英語セッションはあまり理解できていない

RubyKaigiに対する主観

 Rubyを改善したお話などはC言語レベルのお話しなのでCRubyを理解する必要がある。C自体は理解しているものの、CRubyはコードを読まないと話しについていけない。最新版Ruby(今年は2.6)に導入される機能や改善、mruby、gemなどのお話が多い印象。Railsのセッションはナシ、セッションに関連してRailsの話しをすることはある。

自分が分かってなかった用語

AST : Abstract syntax tree

 ソースコードをパースするための抽象構文木

parse.y

 ASTにも関連するが、Rubyコードの構文木構築や意味解析をしている。

https://github.com/ruby/ruby/blob/trunk/parse.y

Ripper

 RubyRubyコードをパースする。

 参考:Rubyの標準添付ライブラリripperでRubyのソースをパースする -- ぺけみさお

style, lint の違い

  • style は潜在的なバグを含まないコード記述
  • lint は潜在的なバグを含む直さなければならないコード記述

ISeq

 RubyVM::InstructionSequence。Rubyコードから VM の命令シーケンスを取得できる。RubyVM上 でどのような動きをするか確認したいときに使える。

 参考:class RubyVM::InstructionSequence (Ruby 2.5.0)

brainf*ck

 ISeqに関連して話題になる用語。

 8つの命令 ><+-.,[] だけで動くプログラミング言語。開発者は Urban Müllerコンパイラのサイズはわずか123バイト、インタプリタは98バイト。

 以下、 Hello World が出力されるソースコード。なぜこれで Hello World になるのか...

+++++++++[>++++++++>+++++++++++>+++++<<<-]>.>++.+++++++..+
++.>-.------------.<++++++++.--------.+++.------.--------.>+.

 参考:Brainfuckとは (ブレインファックとは) [単語記事] - ニコニコ大百科

ruby3x3

 Ruby3.0は2.0より3倍早くするということらしい。

 参考:Ruby 3x3: Ruby 3 will be 3 times faster — Appfolio Engineering

JITコンパイラ

 プログラムの実行時に、予め用意された中間コードを プログラムの実行時機械語コンパイルすることである。

 Ruby2.6では @k0kubun 氏が実装してPreview版に組み込まれている。

 Ruby 2.6にJITコンパイラをマージしました - k0kubun's blog

 ちなみにC/C++はAOTコンパイラ

Guild

 今までのスレッドの並列処理はかなり限定的だったが、 @_ko1 氏が Guild というプロジェクトで今よりもCPUコアを有効活用できるように実装を目指している。

 参考:もしOSに断絶があればRubyは死んでいた可能性が高い、まつもと氏がRuby25周年で講演 - SideCI Blog

$SAFE

 プログラムをセキュアに保つため、汚染されたオブジェクトを使わないように制限する変数。通常は 0。1にするとKernel系のメソッドに制限がかかる。メソッドを実行しようとするとSecurityErrorになる。

$ irb
irb(main):001:0> p $SAFE
0
=> 0

 参考:ルービー3分クッキング「今日はオブジェクトを汚染していきます」

autoload

 Rubyの資格本で勉強したけど、使わないので振り返り。

 requireはファイル実行時に読み込まれるが、使用しない場合はメモリのコストになるので、クラスやモジュールを使用するときに初めて読み込まれるようにしたいときに使う。

 参考:autoload (Module) - Rubyリファレンス

Kubernetes

Kubernetesは、コンテナ化されたアプリケーションの展開、スケーリング、および管理を自動化するためのオープンソースシステムです。コンテナアプリケーションのワークロードを自動化することで、開発の生産性を向上させ、柔軟な運用を容易にします。

 Webアプリを運用してスケールさせたいときに便利そう。

 参考:Kubernetesを始めよう! - DMM inside

trick2018

GitHub - tric/trick2018

 超絶技巧 Ruby 意味不明コンテスト。なぜそのコードが動くのかを理解するのが難しい。

 ちなみに1位のソースコード

alias    BEGIN    for      unless   def      class
super    true     or       return   defined? next
break    while    begin    undef    do       end
rescue   then     retry    else     undef    module
nil      ensure   case     if       yield    __LINE__
self     and      redo     elsif    not      __FILE__
alias    END      in       end      when     __ENCODING__
end      until    false    end

 Ruby予約語は。。。

BEGIN    class    ensure   nil      self     when
END      def      false    not      super    while
alias    defined? for      or       then     yield
and      do       if       redo     true     __LINE__
begin    else     in       rescue   undef    __FILE__
break    elsif    module   retry    unless   __ENCODING__
case     end      next     return   until

 すごく似ててすごい(特に __XXX__ 系)

Rubocop issues

 Rubocopのバグ報告を日本語で行える場所。

 参考:GitHub - rubocop-hq/rubocop-jp

RubyGem3,4に関する話

 @hsbt 氏が各Rubyバージョンで正常に動くように苦労して作っていることを知った。お世話になっております。

www.slideshare.net

RubyKaigiの流行り

 RubyKaigiで流行っているっぽいことについて

  • 長いコードを上へスライドアニメーションして「ね?簡単でしょ?」って言う。
  • Rubyをキメると気持ちいい(?)
  • Rubyは何度も死ぬ。C言語も死んだ。

今後の主なスケジュール

  • RubyKaigi2019:4/18-20(木-土)、福岡
  • Ruby2.6.0:クリスマスプレゼント

今後やろうと思っていること

  • Rubyのしくみを読もう
  • 英語セッション聞き取れるレベルまで英語力戻そう

f:id:tkoyama1988:20180603230028j:plain:w400

Rubyのしくみ -Ruby Under a Microscope-

Rubyのしくみ -Ruby Under a Microscope-

RubyでつくるRuby ゼロから学びなおすプログラミング言語入門

RubyでつくるRuby ゼロから学びなおすプログラミング言語入門

その他、資料関連

Rubyソースコード完全解説

github.com

懲戒処分は民間企業も適用できる

本題

 お世話になっている税理士さんから届いた請求書と一緒にチラシが入っていたので、ざっくり読んでみた。内容を読むと、 懲戒処分 は公務員だけではなく民間企業でも適用できると書いてあった。懲戒には種類があり、戒告〜懲戒解雇まであり、懲戒解雇が一番重い。

 ただし、民間企業が懲戒処分を適用するには就業規則に規定を記載する必要があるそうだ。まあ、自分は自営業の延長なので今いまは関係ない話しではあるが、将来人をたくさん雇うときには参考になるかもしれないので、記憶の片隅に入れておきたい。

 「中小企業の小学減価償却(略)の特例」によると中小企業の条件を満たせば、30万円未満の資産を固定資産ではなく経費にもできるらしい。上限は300万円。20万円ぐらいのPCも固定資産ではなく、経費にできたのだろうか。

S3サイト を CloudFront + ACM + Route53 でSSL化する方法

目的

  1. 会社サイト ( http://geeken.jp ) をいい加減SSL対応しなきゃ
  2. AWSACM(AWS Certificate Manager)が無料らしい?
  3. ちゃんと設定しないと「保護されていない通信」扱いされるのでメモ

前提

  1. お名前.comで買ったドメインをRoute53のDNSサーバに丸投げ
  2. WordPressを静的ファイルに変換してS3に置いてドメインをS3に指している

Amazon Web Servicesではじめる新米プログラマのためのクラウド超入門

Amazon Web Servicesではじめる新米プログラマのためのクラウド超入門

ACMSSL証明書を作る

  • ※ リージョンを「米国東部(バージニア北部)」にする
    • us-east じゃないと CroundFront で ACM を選択できない
  • 証明書リクエスト:「パブリック証明書のリクエスト」
  • ドメイン名の追加
続きを読む

Ruby Gold の資格を取った話

目的

 Ruby Gold を取る過程を備忘録として残していく。それにしても持ってる資格が増えすぎた。

 ベンダー系より、そろそろ一つスペシャリストを取りたい。。

資格の目的

 RubyKaigi2018に行く前にRubyの理解を深めたい。

 Ruby on Rails の仕事が増えたから、今後の役に立つかなと思ったので。

やったこと

 まずは恒例のAmazon参考書レビューチェックとQiita、ブログチェック。これでだいたい何をすれば効率が良いか分かる。

 その後は本を読みながら、コードを実際に実行した。

[改訂2版]Ruby技術者認定試験合格教本(Silver/Gold対応) Ruby公式資格教科書

[改訂2版]Ruby技術者認定試験合格教本(Silver/Gold対応) Ruby公式資格教科書

 上の初版でGoldの範囲と演習問題を2週した。初版は誤字脱字などの正誤表があまりにも多すぎるので、これから買うなら絶対最新版がいい。

 正誤表:http://image.gihyo.co.jp/assets/files/book/2015/978-4-7741-7567-6/download/9784774175676_errata.pdf

メタプログラミングRuby 第2版

メタプログラミングRuby 第2版

 メタプログラミングを最初〜7章まで1週した。クラス、モジュール、Procなどの理解がだいぶ深まった。

1回目:不合格

f:id:tkoyama1988:20180521221847j:plain:w400

 得点 66点 / 合格 75点 / 満点 100点

 油断した。回答したときも5問ぐらい分からない問題があったが、大丈夫だと思ってサクサク終了してしまった。恥ずかしい限り。

 よく分からなかった問題はすぐに忘れそうなので、帰ってすぐに実行/本で確認した。

2回目:合格

 10日後ぐらいに再受験。

f:id:tkoyama1988:20180520172706j:plain:w400

 得点 82点 / 合格 75点 / 満点 100点

 90点ぐらいいけるかなと思ったけど、駄目だった。50問で100点だからだいたい9問間違えている。何を間違えたのか分からないのが、こういう試験の良くないところだと思う。理解を深めるのが受験の目的なので。Javaみたいにどの分野が何%できてるとか表示してくれないだろうか。。

最後に

 少しRubyに対する理解が深まったので、来週のRubyKaigiは有意義に過ごせるといいな。

 facebookでは1回目については特に触れず、合格のキャプチャだけ貼って1発で合格した感を出しておいた。

自社のビジネスモデルを図解してみた。

目的

 以下の記事の続き。まずは自社のビジネスモデルを図解してみることにした。

ビジネスモデルを組み立てる方法を考える - TakayukiKoyama Geek Blog

Geekenのビジネスモデル

 ただのSES/受託会社なので、ありきたりなビジネスモデル。ただ、これを作っておくと会社の説明が楽になりそう。

f:id:tkoyama1988:20180515103435p:plain

 一応、このビジネスモデルで1年目の決算は無事に黒字を迎えました。

今後

 経営計画の資料を作ってアイデア練り練りしてたら方向性を変えていきたいと思うようになったので、新しいビジネスモデル作って経営計画を立てようと思う今日この頃。

Ruby Thread.currentについて

目的

 Ruby 技術者認定試験合格教本の p312 に書いてあるカレントスレッドのコード例が良くない気がしたので、別の書き方を提案してみる。

コード例

> Thread.main
=> #<Thread:0x107c71278 run>
> t = Thread.new { sleep 100 }
=> #<Thread:0x107f838d0 sleep>
> Thread.current
=> #<Thread:0x107c71278 run>

 おそらく、このコードからは Thread.main でメインスレッドが表示され、 Thread.current を実行しているのもメインスレッドだから object_id (正確には、 object_id を '%x' % (t.object_id << 1) したやつ)が同じになるよね。と言いたいのかなと。

 ただ、これだと main と current の結果が同じで用途が伝わりにくい気がするので、 current を書く場所を変えたほうが良さそうに思いました。

提案

 ファイル実行の方が可読性が高くていいので、ファイル実行で記述。

$ vim sample.rb
t = Thread.new do
  p Thread.main
  p Thread.current
end

p Thread.list
p Thread.main


$ ruby sample.rb
[#<Thread:0x007fb0af8cb7e0 run>, #<Thread:0x007fb0b097dca0 run>]
#<Thread:0x007fb0b097dca0 run> # run or sleep
#<Thread:0x007fb0b097dca0 run>
#<Thread:0x007fb0af8cb7e0 run>

 これで main と current がどう変わるのかが分かりやすいのかなと。まあ紙面の都合もあると思うので、備忘録的な感じ。