Herokuでrails runner が実行されない

local の develop 環境では動いているがheroku(production)では実行されない

結論

  • Rails5 では production 環境の autoload で lib を対象としない
  • application.rb に eager_load を指定し、lib を対象とするようにした

やろうとしていた事

  • rails runner で lib/tasks/xxx.rb の実行
  • xxx.rb の中では puts “debug!” のような処理
  • heroku logs には 以下のログがあり、exit 0 にならない
2017-02-11T17:51:30.739318+00:00 heroku[run.7502]: Awaiting client
2017-02-11T17:51:30.766742+00:00 heroku[run.7502]: Starting process with command `rails runner Tasks::Batch.execute`
2017-02-11T17:51:30.959538+00:00 heroku[run.7502]: State changed from starting to up
2017-02-11T17:51:37.230180+00:00 heroku[run.7502]: Process exited with status 1
2017-02-11T17:51:37.277912+00:00 heroku[run.7502]: State changed from up to complete

試した事

  • develop では 正常に処理が走る
    • rails runner Tasks::Batch.execute
  • production では NG
    • heroku run rails runner Tasks::Batch.execute
  • app の lib ではない directory に配置したファイルであれば、実行出来る
  • puts なども叩ける
    • heroku run rails runner -e production “p\(1\)”
Please specify a valid ruby command or the path of a script to run.
Run 'bin/rails runner -h' for help.

雑感

少しずつ切り分けをしてproduction だけで発生する事から環境依存という事はつかめていたが、
application.rb や config したのファイルをキーにググる事数時間。

参照

Rails runnerを使ってファイルを実行しました - Qiita

rails runnerを使ってみた - Qiita

Railsでlib以下を読み込ませる方法とその注意点 〜名前重複の死を避けるために〜 - Qiita

Rails5: production環境でのAutoloadの廃止 - Qiita

Heroku で bin/rails: No such file or directory

こんな事にハマる人はどこにも居ないと思うが、いつかの自分の為に。

結論

  • ~/.gitignore に /bin/ の記載があり、/bin 以下のファイルがheroku に push されていなかった

HerokuでRailsを起動したら

Application error
An error occurred in the application and your page could not be served. If you are the application owner, check your logs for details.

Heroku のログを見る

$ heroku logs -t 

2017-02-04T06:51:56.618341+00:00 heroku[web.1]: State changed from crashed to starting
2017-02-04T06:51:58.524827+00:00 heroku[web.1]: Starting process with command `bin/rails server -p 29792 -e production`
2017-02-04T06:52:00.050294+00:00 app[web.1]: bash: bin/rails: No such file or directory
2017-02-04T06:52:00.122536+00:00 heroku[web.1]: State changed from starting to crashed
2017-02-04T06:52:00.116558+00:00 heroku[web.1]: Process exited with status 127

bin/rails がないようだ

なぜか.gitignore に /bin/ の記載が。。。

  • コメントには Intelli J と書いてある。
  • global にしたい気持ちはわかるが、今後はプロジェクトの.gitignore に書くようにする

気を取り直して、再度 heroku push まで

bundle install
git commit -am "xxx"
git push heroku master

雑感

さくっとrails を使おうと思ったら、まさかこんな所で。

2016振り返りと2017目標

毎年恒例になってきた。
2015振り返りと2016目標

Run

  • 目標
    • 600km ( 月50km )
  • 結果
    • 274km ( 月50km達成は1ヶ月 )
    • 昨年との差3.1km
      • もしかしたら、270kmくらいが自身の限界なのか?!
    • 4月にジムに入会し、出社前にトレッドミルのランに挑戦したが3ヶ月目で失速
      • 出社前にジムにいくという習慣を2ヶ月くらい続けられたのは楽しかった

Learn ( TOEIC )

  • 目標
    • over 600
  • 結果
    • 520どまり

Learn ( Other )

  • 目標と結果 ( 2015のブログから )
    • ハミガキ習慣の更新
      • なんだそのアプリという状態
    • Lomdの開発を進めたい
      • 特に理由はないが、進めるモチベーションがゼロだった
    • 実装方法、種類を学ぶ
      • OOP / UML
        • OOPに関してはPHPの復習とデザインパターンの理解
        • UMLについては、特に意識しては取り組んでいない。パターンの説明で確認したくらい
      • Write Code Everyday
        • 特に意識せずで、10月半ばくらいから11月にかけて少々
        • 2016 のGithubでは141Contributions(PublicRepo)
        • BitBucketにも少々
  • 目標にない部分
    • AppleWatchアプリの実装
      • Swift3 + Kanna + Alamofireを利用してWatchアプリで遊んでみた
    • Ruby関係
      • Railsチュートリアルを進めた(未完走)
        • Rails5Verになったので、今年再度試してみる
      • TokyoRubyKaigi, RubyKaigi(京都)に初参加
        • Ruby書いてないのに、結婚後初の1人旅行の言い訳?として京都に行ってきた

他に年始に考えていた事

  • 環境変化
    • 2016/7に引っ越し
    • 2016/11より新しい職場への転職
  • 家族
    • 育休は取得せずに退職し、新しい仕事までの間に意図的に多くの休みを挟んだ
    • 目的は2つ
      • 育休のような期間を作り、少しでも家族との時間を作りたかった
        • 両実家に帰省し、多くの時間と思い出を作る事が出来た
      • 前々から時間をかけて学びたかったフレームワークや、テストとCI、実装方法を理解する

2017目標

  • 追記予定

雑感

いろいろ考えながら振り返ってたら考えがまとまらず時間オーバー
続きは近日

今年の書き初めはPHPでした

昨年はJavaで書いたと思うが、今年はPHP

PHP5.4から利用できるTrait(Scalaでも同名)とInterfaceを利用した場合、 お作法としてTraitとInterfaceはセットで定義しておく。

理由としては、Traitは型宣言に利用できない(タイプヒント出来ない)為、 メソッドが特定の型を要求する場合は、タイプヒントする為にInterfaceを定義しておく必要がある。 (独習PHP10.5.4より参照で、この文の意味が理解不足)

・型を継承するインターフェース
・実装を継承するトレイト

この違いは理解したと思うが、メソッドが特定の型を要求する場合の為にInterfaceを定義しておくという 説明についてはコードレベルで理解出来ていない。

<?php

// 型を定義
interface IFax {
    function send();
}

interface IPrinter {
    function printer();
}

// 実装を定義
trait FaxTrait {
    public function send() {
        print 'sending Fax...sended!';
    }
}

trait PrinterTrait {
    public function printer() {
        print 'printing ... complete!';
    }
}

class FaxPrinter implements IFax, IPrinter {
    use FaxTrait, PrinterTrait;

}

$fp = new FaxPrinter();
$fp->send();
$fp->printer();

AppleWatchを活かしたい

ただそれだけ。

最近は完全にSuica端末になりきっているAppleWatch。
走っているときはRunkeeperの子機として十分に役立つが、日常生活では?

完全にFitbitが一枚上手。なぜかといえばバッテリーライフの関係から、睡眠中もつけていられる。
そうなると、睡眠時間のデータもFitbitに入るため、つけない訳にはいかなくなる。

そんな中、社内LTを行うという事があり、これはチャンスと実装をした。
家の近くのバス停に到着するバスの時間を、Webページから取得しWatchに表示するだけの機能。

実際にやってみるといろいろハマった。

ハマったこと

  • そもそもiOS / watch OSと複数のターゲットが存在する(CodeSigning)
  • table view とラベルの紐付け
  • watch OSのデバッグは(process を atach する必要がある)
  • Cocoa Pods を利用する場合は、xxx.xcodeproj -> xxx.xcworkspace を利用する
  • Httpクライアント(Alamofire)の利用方法
  • HTML parser(Kanna)の利用方法
  • 取得したいページがhttpなので、ATS無効
  • 実機で確認する為のXcode + iPhone + Apple Watchの設定というかデバッグする為の設定
  • Apple Watch のイベント(awake -> willActive -> didDiactive)

このあたりは細かくブログに書きたいが、今日はクリスマスという事で家族との時間に充てる。

AppleWatchが認識されない

Xcode8 WatchOS3.1

error 内容

  • Xcode の実機選択で + (paired device unavailable for development)と表示される

対応

このあたりの手順で改善した。 なぜかたまに起こるが、いつのまにか直っている事がおおい。

参考記事