いろいろ

社会人2年目

去年の振り返り

業務と業務外のこと。

業務

  • Rails API + Sinatra でWebアプリケーション開発
  • Vue.js
    • 管理画面(Sinatra)を Vue.jsにリプレイスしてた
  • 画面+機能設計した
  • テスト
    • テスト仕様書を作ったりスマホアプリ、Webアプリの動作確認したり

触ったもの

続きを読む

esa.ioの記事を取得して別のesa.ioにインポートするスクリプトを書いてた

docs.esa.io


ソース

github.com

用途

foo.esa.io の記事を取得して bar.esa.io に記事を移す。

使い方

  • 各種Configに値を設定した上で以下を実行する。
bundle exec ruby import_and_export.rb


※アクセストークンは esa.io の SETTINGS > Applicationsから Personal access token を generate できる。


作った理由

foo.esa.io から bar.esa.io に記事を移したくなったため。
# foo.esa.io のadmin権限がなく記事zipが取得できなかったので、Export処理を書く必要があった。

余談

Revisionsを見ればわかる通り、最初はクラスを分けずペライチで書いてた。
途中でクラス/モジュールを使うように書き直したけど、定数の置き場所がしっくりきていない。(素直にYAML書いた方が良さげだけど別ファイル用意したくない…)
全体的にもうちょっとうまくできなかったのか感があるし、パラメータの抽出を Exporter に置いているのも気になる。
あと、そのまま記事をインポートするとesaにアップロードしている画像URLやesa記事リンクは元のesaを参照してしまうので、そのあたり置き換える処理も必要かなって今思った。

色々どうかと思うけど、どういう書き方がベターなのか調べてるうちに一日が余裕で潰れたので一旦これで。
この程度のスクリプトはシュッと書けるようになりたい。。

定期的に見てるサイト

るびま

定期的にアーカイブを読んでる気がする
技術的な記事は正直レベル感が合わないかな? でもRuby コードの感想戦 【第 1 回】 WikiRは面白かった
よく読むのはインタビュー記事

r/programming

どういう話題があるかをチェックしてるだけで中身を読むことは少ない

r/programming_jp

こっちの方をよく読む
自分が見始めた時はRustの読書会をしていた

Qiitaの殿堂

タイトル一覧を見て満足する

室長のひとりごち

週6で見てる

サーバがステートレスとは

Webを支える技術を読んでいてよくわからなかったところを整理。
ステートフル/ステートレスはハンバーガーのたとえが有名。



セッション(ステート)の保存先はいくつかある。Railsだと、

  • CookieStore(デフォルト)
  • CacheStore
  • ActiveRecordStore
  • FileStore
  • RedisStore
  • DalliStore


たとえば、DBをセッションストアにする。この時、クライアントからサーバにリクエストした際、サーバはリクエストに応じた状態データを返却する。

この時、サーバはステートフルな(状態を持ってる)んじゃないのって思うけど、そこはシステム単位で見るか個々のサーバ単位で見るか、スコープによって変わってくる。
雑に書くとこんな感じ。

f:id:igrc:20181006170450p:plain


アプリケーションサーバの役目はクライアントからのリクエストに応じた処理を行うことで、状態は保持していない。
保持しているのはDBサーバなので、

APサーバ:ステートレス
DBサーバ:ステートフル

サーバ単位で見たらステートレスなサーバとステートフルなサーバに分けられ、システム全体はステートフルな振る舞いになる。
システム全体でステートレスにしたいなら、クライアントにCookie等で状態データを全て保持させて、リクエストの度に必要な状態データを送ればいい・・・と思う。(ステートレスにする必要があるかはともかく)
ここのコメントも参照


Sinatra pry(irb)でメソッドを呼び出す

コンソールでメソッド呼びたかったけど結構つまづいたのでメモ代わりにまとめ。

Pry起動

# Gemfile: gem 'pry'
$ bundle exec pry -r 'app.rb'

Helper呼び出し

 pry(main)> MyApp.new.helpers.hoge
=> 'hoge'

github.com
でWrapperにhelpersが定義されていて、ヘルパーメソッドは上記のように呼び出すことができる。

躓いたのがヘルパー以外の、クラス内に定義されてるメソッド呼び出しで、newしても上手くいかなくて困ってたけどこの記事*1を参考にしたら解決した。
Sinatra::Baseに限らずミドルウェアを継承させているクラスでは、エイリアスのnew!を使う必要がある(allocateでもいい)


インスタンスメソッド呼び出し

 pry(main)> my_app = MyApp.new!
 pry(main)> my_app.fuga
=> 'fuga'

private メソッド呼び出し

 pry(main)> my_app = MyApp.new!
 pry(main)> my_app.send(piyo)
=> 'piyo'

addEventListener() のリスナーでreturn falseしてもイベントはキャンセルできない

Target.addEventListener('submit', function(){
  // 処理
  return false
});

↑みたいなコードを書いてもsubmitイベントはキャンセルできない。
jQueryのリスナーであれば、return falseでキャンセルできる。↓(イベントのキャンセルおよびイベント伝搬が停止する)

.on() | jQuery API Documentation

Returning false from an event handler will automatically call event.stopPropagation() and event.preventDefault().

なのでaddEventListener()を使う時は、

Target.addEventListener('submit', function(event){
  // イベント伝搬の停止
  event.stopPropagation();
  // イベントキャンセル
  event.preventDefault();
});

で、jQueryのリスナーでreturn falseした場合と同じ挙動になる。

jQuery使ってる人ほど引っかかりそう。
(return falseすればキャンセルできるんだーくらいの理解度だったので引っかかった)

Ruby技術者認定試験Silver 合格しました

84点で合格しました。
90点くらい取れてるかなーと思ってたのでちょっとショック。
例外とFileの扱い、演算子の優先順あたりで点を落としたのかなーと思ってます。

ちなみに私のプログラミング歴は1年程度で、Rubyは1年弱ほど業務で扱っています。
Silverを受けた感想としては、1年弱Ruby使ってたけどなにも知らなかったなーと。
一応、今回Silver試験の勉強をしたことである程度の知識は得られたかなと思ってます。もちろんまだまだ知らないことだらけですが。

テキスト

gihyo.jp 通読を3回くらい。後は問題解いてる時にリファレンス的にぺらぺらめくる程度。
旧版では誤植が多いという話でしたが、二版のSilverの範囲では些細な誤植しか見当たりませんでした。

正規表現はテキストだけではちょっとわからなかったため、@jnchito さんのQiita記事を参考にしました。

qiita.com

問題集

参考書とgithubに公開されてる問題はミスが無くなるまで繰り返して、RExでは90点以上が安定するまで解き続けました。
あと、動作がよくわかってないメソッドについてはRuby2.1の環境をVagrant上に作って、2.1のリファレンス見ながら実行したりしてました。

例題と似てる問題がかなり出るので、参考書を通読するより、ひたすら問題を解き続けてれば効率よく受かりそう。
(私はダラダラやってたのでだいぶかかりました…)

組み込みライブラリに関しては破壊的・非破壊的、レシーバーの返り値、String, Array, Hashに複数存在する同名メソッドの
挙動を抑えておけば問題ないと思います。
File,IOクラスはIO#seekのwhenceとか、openのパーミッションあたりとか。