読者です 読者をやめる 読者になる 読者になる

Rails / Laravel の埋め込みの違い

忘れるのでメモ

Rails ( Embedded Ruby )

出力なし

<% ... %>

出力あり

<%= ... %>

使い所

<% provide(:hoge, "HOGE" %>

<p><%= yield(:hoge) %></p>

Laravel

出力なし

<?php ... ?>

出力あり

{{ ... }}

使い所

<?php $hoge='hoge' ?>

<p>{{ $hoge }}</p>

調べなくては

Laravel で Rails の provide に当たるヘルパーはないのか?
そもそもモデルで書けと思うところだが。

ライトコートエブリデーる

タイトルで言いたい事はすべて言ってしまっているが、補足も兼ねて今やっている事を。

Write Code Everyday

  • 日々何かしらのコードを書き、Commit する。GitHubに草を生やす
  • 2015年もやっていたが、51days くらいで止まった
    • 当時は妻が実家に帰省していた かつ、子どもに使って欲しいとアプリのコードを書くモチベーションがあった

現在

  • ちょうど 3weeks を超えたところ
  • 少し癖になってきたので、次の(たぶん 3ヶ月)ポイントまでの目標と今考えている事のまとめ

f:id:tbrhdys:20170321145550p:plain

なぜ始めたか

  • こんな事書き始めたら Wantedly みたいだ
  • いろいろな不安と戦う為に前に進んでいる感覚が欲しい
  • 家族との時間を大切にしたいので、週末にまとめて一気に時間を確保するという事を避けたい
  • 前回の51days を超えたい
  • 少しでも新しい事を始めたい
  • 昨年末に参加したBuilderscon の mattn さんの言葉
    • Q いつ時間を作るんですか? A とにかく頑張るしかない
    • Q なぜ頑張るか A 若い人たちに勢いだけは負けたくない
  • 実際にBTCのアプリ(かなり雑な感じだが)は、日々触る事で少しずつ形になった
  • 作りたいアプリはあるが、なかなか自分に言い訳をして進められていない

試したこと

  • BitCoinRails アプリ
  • Electron + Vue.js
  • Vue.js + Laravel のサンプル RSS リーダを触った
  • Vimrc をちょこちょこ

次に書く内容

  • 3ヶ月たってみてどうか?
    • その頃には51days を超えているので、自己最長になっているはず
  • commit の粒度は今と変わっているか?
    • 今はhack的に Readme を書き換える commit をしたり
    • string -> here document に書き換えたり といった事をしている
  • 作りたい、触りたい事を触れるようになっているか?

現時点の反省点

  • 23:00 - 24:00 の間くらいに commit する事が多い
  • 07:00 - 09:00 の出社前に一日の commit を済ませておきたい
    • 夜は飲みが入ったり、疲れて眠ってしまう事もあるので

(11分で書いた。ネタだしはノートに10分。計20分)

BitCoinを自動売買するアプリ

作ろうと思ったきっかけ

  • Ruby / Rails 使ってなんか作りたい(前から思ってる)
  • BitCoin の値動きが気になる (BitFlyer社のアカウントあり)
  • あわよくばドリンクやランチ代くらい稼げないか
  • お金に関わる事だから、飽きずに進められそう

急に2017年2月くらいにBitCoinの自動売買を試してみようと思い、アカウントのあるBitFlyer社のAPI説明ページを読み始める。PHPでかけばもっとサクッと行けたと思うけど、動機の1つにRailsを触るという事があったので、少し調べて実装の繰り返し。

github.com

作った仕組み

  • Batch を毎10分で実行し、ログから"買い時"と判断したら、買いと売り注文を出す
  • Log も毎10分で実行し、過去数時間経過した注文の結果を取得し、結果モデルを作成
  • Result は1日1回実行し、結果を集計し、メールで結果を知らせる
  • Gabage は Heroku の Free プランの上限を超えないよう PostgreSql のレコードを削除する
  • 概要はこんな感じ f:id:tbrhdys:20170320000435j:plain

現在の結果

  • 2017/¾ - 20173/19 時点の結果。
  • 752 戦中 317 勝 435 敗 (金額は少額の取引を行っているので、1000円 - 2000円 くらいマイナスじゃないか)
    • 基本的には1取引 0.01BTC (約1300円〜1450円)で行っている

毎朝届くメール (3/21のresult)

  • 実際は 1/100 で取引しているので、day_sum 35円くらいのイメージ
total_count => 853

day_count => 42

day_sum => 3547.0

day_lose => -6219.0

day_lose_count => 20

day_win => 9766.0

day_win_count => 22

1BTCの値動き

  • 130000 - 145000 くらいの間で動いていた。
  • 3/18 - 3/19 に 大きく動き 119000 くらいまで下がった。

やっていて感じる事、これからやっていきたい事

  • “買い時"の判断材料不足なので、データを解析して、"買い"タイミングの精度をあげていきたい。
    • 以前は毎10分のログで、過去10回の金額が+xxx円だったら買いという風に仕込んでいた。
      • これだと買いのタイミングが遅いと判断したので、過去2回の差額が+50円だと買いにした。
        • この結果、勝ちの数(買った時の金額より、売りの時の金額が高い) が増えた。
        • 買いの件数も増えて、取引量が増えた。
  • データを解析をし、勝ち・負けの精度をあげたい
    • 実際のログと、売買結果の差が起きていないか(以下の勝ち、負けが単純にログを見ただけで分析出来ていない)
      • 買い注文時に、同時に+ / - の子注文を同時に行っている。
      • この時に買い注文より高く売れたら “勝ち” / 低く売れたら"負け" と評価している
  • ソースはただ、スケジュールからバッチを叩いているだけなので、Viewで処理結果などを参照出来るようにしたい
    • Rails というよりは、 ActiveRecord を使った処理を書いただけ。という印象
    • ActiveRecordRails 側から簡単に扱えるので、使っていて楽しい
  • GitHub の Readme にいろいろ追記しなくては
    • ENV

雑感

  • 少額の取引なので、50円くらいの勝ち負けは頻繁に発生しているので、元でを増やしたいという欲を抑えながらやっている
    • FXには走りたくない
  • お金に関わる事で興味が強いのか、飽きずに続けられている
    • 時間はかかっているが、ちょこちょこ実装を進められている
  • まだまだ Ruby / Rails らしからぬコードをたくさん書いているので、お作法を覚えながらやっていきたい
  • 他にも作りたい思いのアプリがあるので、第二弾、第三弾と続けて行きたい(Ruby / Rails 面白い)
  • Google 図形で処理を描いてみたけど、結構ポチポチ時間がかかった。Keynote とかで作った方が速そう。

(この記事は画像作成込みで90分くらいで書いた)

平日のレコーディングワーク

最近はブログに想いというよりは何かのログを書くことが増えているので、 現時点で思っている事を書こうと思う。

2月の頭から朝に時間を作ろうと考え、飲み会を控え、朝に20分、長いときは50分くらいの
時間を設けるようにしている。

会社近くで時間を設けるのは、会社近くで時間を作る事で電車遅延の影響などを受けないようにするためだ。 この記事も朝の出社前に書いている。

なぜ朝に時間を作ろうと思ったか?

最近は週末も12時頃まで眠る事が多い。その理由は、何かしら手を動かしたい、動かさねばという衝動があり、 寝る前にいろいろ触るようにしている。その結果、夜中の2時や3時まで起きてしまい、結果として土日のお昼頃まで寝ている。 息子は大体AM11時頃に散歩に出かけるスタイルなので、一緒に散歩に行くことすら出来ていなかった。

この生活が2016/12 - 2017/1 頃まで続いていたので、自身の中でもこれではいかんと考えるようになった。 2016/12 の時点では、仕事も慣れてくるので2017/1月頃には元に戻るだろうと考えていたが。結果は何も変わらず。

そこで考えたのが、週末に行っている事を平日の内に少しでもアウトプット、インプットを継続して行える習慣を作りたいと考えたから。

実際に試した事

出退勤の時間のような感覚で、家を出る時間、家に帰って来た時間をログとして残すようにした。 0645 出発 2100 帰宅 外出時間 1415 という記録だ。 これが、現時点で3週間分溜まり、今週書けば1ヶ月のログになる。 実際にレコーディングしてみて驚いた事は、外出時間の長さだ。 8時間労働+1時間の休憩で、計9時間しか労働していないはずだが、外出時間が14時間を下回る事は稀で、 飲み会がある日などは17時間という記録もあった。

改善に向けて

15時間を超えるケースは、飲み会(送別会含む)、残業の2点だ。 例えば、定時退社してそのまま家に帰れば一体何時間になるのだろう。 この数字こそが、実際の通勤(往復) + 労働時間 となる。

飲み会に関しては、現在考えている1ヶ月に2回までというルールを継続したい。 今月は、エンジニア(パートナーとなる可能性がある人)との会食1件、月末に同期飲みがある。 残業に関しては、出来る限りしないように、早めに手を打つようにしていく。 来月頭にリリースがあるプロジェクトに関しては、フォーカスを絞り、範囲、担当を明確にする。 忙しい今だからこそ、逆に残業してしまわないように心がける週とする。

次に書きたい事

ここ2ヶ月くらいやっているポモドーロの実践結果
日々のTodo管理表見直し

とあるブロガーを真似て

(この記事は23分で書いた)

追記(ログがたまったので)

  • 意思、想いではなく、事実を事実として捉えて原因追求→次のアクションに落とし込みたい
  • start / end は意図的に描いてない
  • 出勤前に20分から50分くらいの時間を設けているので、往復通勤+勤務時間+休憩時間+朝の時間を入れると、13時間くらいが最短
曜日 時間 理由
13:45
15:40 残業
16:08 残業
14:10
16:45 残業
17:05 飲み送別会
16:40 飲み送別会
13:55
14:10
14:10
14:30
14:00
15:05 本屋に寄った
15:43 残業
16:10 残業
15:07 外食
15:35
13:50 歯医者
14:30
19:25 残業+飲み

npm run dev で cronss-env.js のError

発生タイミング

  • Laravel5.3 で Vue.js のアプリ生成時に npm run dev でタスク実行

発生したError

> node node_modules/cross-env/bin/cross-env.js NODE_ENV=development node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js

module.js:457
    throw err;
    ^

Error: Cannot find module '/path/to/laravel-src/node_modules/cross-env/bin/cross-env.js'
    at Function.Module._resolveFilename (module.js:455:15)
    at Function.Module._load (module.js:403:25)
    at Module.runMain (module.js:590:10)

修正箇所

  • package.json の cross-env.js のpath を変更

  • 変更後 は cross-env/bin/cross-env.js -> cross-env/dist/bin/cross-env.js

  "scripts": {
    "dev": "node node_modules/cross-env/dist/bin/cross-env.js NODE_ENV=development node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js",
    "watch": "node node_modules/cross-env/dist/bin/cross-env.js NODE_ENV=development node_modules/webpack/bin/webpack.js --watch --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js",
    "watch-poll": "node node_modules/cross-env/dist/bin/cross-env.js NODE_ENV=development node_modules/webpack/bin/webpack.js --watch --watch-poll --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js",
    "hot": "node node_modules/cross-env/dist/bin/cross-env.js NODE_ENV=development node_modules/webpack-dev-server/bin/webpack-dev-server.js --inline --hot --config=node_modules/laravel-mix/setup/webpack.config.js",
    "production": "node node_modules/cross-env/dist/bin/cross-env.js NODE_ENV=production node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js"
  },
 

参考URL

github.com

余談

  • Laravel を個人Pjで使いたいなーと思いながら放置していたので、触りたかったVue.js と併せて遊び中
  • あと最近はErrorを書くだけのブログになっている。想いとか、今考えている事とか書きたい。
  • 今日からモバイルルーターを使い始めるので、家 && 夜中 以外の条件でもブログ書けそう。

Rails Task で uninitialized constant Error

これが設定より規約 CoC(Convention over Configuration) というやつなのか。

Taskである処理の結果をResult モデルに入れようとしていて、
インスタンスを作る所でexception 発生。
原因はつかめてないが、class 名がぶつかったのか?
この辺りの理解(Rubyの書き方)が全く出来ていない。このあたりはこれからの課題。
今回はResult->Log に変え class Tasks::Log に変更。

class Tasks::Result
  def self.execute
      begin
        logger.info("start")
        r = Result.new <--- ここでException発生
        r. xxxx
        r.save
      rescue => e
        logger.error("#{e} : #{e.backtrace.inject(result = "") { |result, stack| result += "from:#{stack}\n" }}")
      ensure
        logger.info("end")
      end
  end 
end

で発生したエラーログは

uninitialized constant Tasks::Result::Result 

雑感

今回Railsで実装する上で作りたい機能をベースに調べながら作っている。
今までは体系的な学習を意識していたが、いつまでたっても作りたい物が作れなかったので、
今回はあえて、作る物→必要な実装を調べる。という流れで進めている。
ただ、こうやって実装で詰まる事が出てきたので、そろそろRubyのパーフェクトRubyとか 目を通しておこうと思い始めてきた。

追記予定

今後内容を理解したら原因と理由を追記

ActiveRecordを使って生sqlを書く場合

Base.connection.select_all あたりは細かく知りたい

hash = ActiveRecord::Base.connection.select_all("select sum(sub1.diff) from (select diff from differences order by created_at desc limit 5) sub1").to_hash
puts hash[0]["diff"]