Somurie Engineer's Blog

動的型付言語と静的型付言語

背景 今までJavaの開発が多く、Javaは静的型付言語であった。最近Railsの開発に携わっており、静的型付言語と動的型付言語の違いを実感することがあったため雑ですが今思うことを以下に備忘メモとして残しました。 静的と動的型付言語の違い Rubyは動的型付言語であり、開発時にカルチャーショックを受けることが多い。 簡単な書き方であれば困ることはあまりないが、メタプログラミング要素を含む書き方になると調査難易度が格段に上がる。 現場で感じた動的型付言語のメリット・デメリットは以下の通り。 大規模になればなるほどメリデメは顕著に現れるように思える。現に現在参画している案件は大規模のため、以下の特徴を強く感じている。 静的型付言語のメリット (慣れると)開発生産性(メンテナンス性含む)は高い 静的型付言語のデメリット 慣れない間は遅い Ruby初学者 可読性が低い 静的コードチェックができないため、メソッド呼び出し可否が不明確 プロジェクト新規参入者の学習コストがかかる 影響範囲調査に時間がかかる(対応箇所の検討は付くが、裏取りに時間がかかる。CircleCIなど自動的に回帰テストを行える環境が整っていると良い) (雑な言い方だが)頭が良くないときつい。抽象的思考能力と大きめの脳内キャッシュ(短期記憶能力)があると良い プログラマの使い方を制限しないため空気を読んだコーディングが必須(コードレビューは必須) 最後に RubyはDDDと相性が良いように思える。 ドメインを明確に決めることで役割が明確化し、可読性、メンテナンス性が高まる。(デグレも起きにくい) Rubyの設計スキルを上げるためにDDDを学ぶ必要がある。 Railsの場合、ControllerとModelが確実に分割されるが、Modelが複雑化した時の書き方は追って学習する必要がある(ActiveRecord::Concernやmix-in、他にもある?) 大規模のプロジェクトでRails(動的型付言語)を使っている場合は序盤は全体構成の理解に徹するべき。 SOAによるサービス単位での分割など、大規模になりすぎないようにシステムを分割することを検討した方が良い。

Rubyのよく使う定義メソッド確認コード

よく使うメソッドの確認方法をまとめました。 クラスメソッドとインスタンスメソッドを両方出力するメソッドは見当たらないです。欲しかった・・・ class Test class << self def class_method1 end end def instance_method1 end end puts "--- class ---" t = Test.new p Test.methods # クラスメソッドのみ p Test.methods(false) # クラスメソッドのみ(親クラスを除外) p Test.public_methods(false) # publicなクラスメソッドのみ(親クラスを除外) p Test.instance_methods # インスタンスメソッドのみ p Test.instance_methods(false) # インスタンスメソッドのみ(親クラスを除外) puts "--- instance ---" p t.methods(true) # インスタンスメソッドのみ p t.methods(false) # インスタンスメソッドのみ p t.method(:instance_method1).source_location p t.methods(true).grep(/method1/)

AWS Lambda&Rails5.2.3で格安サーバレス運用をする

背景 RailsでWebシステムを公開したい時、どこのレンタルサーバを使用していますか? Railsが動作する前提で探すと(PHPと比較して)どうしても高くなってしまい、遊び程度のシステムを作成するにはどうも気が引けます。 簡単なWebサービスであればAWSのサーバレスアーキテクチャがかなり安く運用できそうなので、簡単な運用費計算と簡単な動作確認までを記事にまとめました。 環境 MacOS Mojave 10.14.4 Homebrew 2.1.0-27 Ruby 2.5.3p105 Rails 5.2.3 作業日 2019/4/14 運用費計算 王道ですが以下3つの構成から成る簡単なWebアプリを作成するとします。大まかな料金表は以下の通り。 Route53 ホストゾーンの登録 0.5USD/Month 標準クエリ100万件毎 0.4USD/Month (日割りされるみたい。少なければ0USD?) S3 ストレージ料金 最初の 50 TB/月 0.023USD/GB リクエスト料金 S3 Select によって返されたデータ 0.0007USD/GB lambdac 1,000,000 件のリクエストか400 GB-秒まで 超ざっくりですが、皮算用は0.5USD/月程度です。内訳は以下の通り。 Route53 1万アクセス/月の場合、登録料0.5USD+0.004USD S3 0.5GBのコンテンツの場合、0.00000023USD -20GBのリクエストの場合 (1アクセス2MB×1万アクセス)、0.014USD/GB lambda 無料 安すぎるけど計算間違えてないかな・・・。 既に計算している人を見ると、やや違うけど、とんでもない金額にはならなそうなのでとりあえず進みます。 AWS SAM CLIのインストール $ brew tap aws/tap $ brew install aws-sam-cli $ sam --version SAM CLI, version 0.

Docker+Railsコンテナ構築時のUnknown MySQL server host ‘mysql’エラー

Docker+Railsコンテナ構築時にUnknown MySQL server host ‘mysql’エラーが発生してなかなか解決しなかったので備忘として解決までの流れを記載する。 Contents 1 環境 2 解決までに試したこと 3 解決方法 4 まとめ 環境 今回は以下環境にて開発を行った。 MacOS Mojave 10.14.3 Docker 18.09.1 Ruby 2.5.3 Rails 5.2.2 MySQL 5.7.10 解決までに試したこと docker-composeでappとdb(両方サービス名)のリンク・リンク名の見直し。(以下URL参照) https://qiita.com/merochiyo/items/14dde59e960c0b35d8a0 dbのコンテナが立ってからappが起動及びdb:createすること。 http://otiai10.hatenablog.com/entry/2016/02/04/160515 解決方法 明確な原因はわからなかったのですが、以下コマンドを使うことで解決しました。恐らくですが、Dockerの古いイメージが残ってしまい、そちらを参照し続けてしまったことなどが原因かと思います。(直前にMySQLのバージョンを8に変更し、認証プラグインがcaching_sha2_passwordになってエラーになり、バージョンを5.7.10に戻したりしていたので、その際のキャッシュなどを使っていたのかなと推測) 以下コマンドでは、可動していないものも含め全てのDockerイメージを削除します。 $ docker stop $(docker ps -q) $ docker rm $(docker ps -aq) $ docker rmi $(docker images -q) まとめ Dockerがどうやってもうまく動かない時は可動しているイメージを削除するだけでなく古いイメージを削

Ruby環境の構築(MacOS Mojave)

はじめに Mac上にruby環境を整えたため、手順を残しておく。 環境 MacOS Mojave 10.14.1 Homebrew 1.8.4 rbenv 1.1.1 gem 2.7.6 bundle 1.17.1 ruby 2.5.3 作業日 2018/12/1 手順 Homebrewのインストール。HomebrewはMacOS上のパッケージ管理ソフトウェアです。2行目は正常にインストールされたかの確認です。 (brew -vでも可) $ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" $ brew doctor rbenvを最新版に更新する。 $ brew upgrade rbenv ruby-build 動作確認兼異インストールできるrubyバージョンを確認。2018/12/1時点では2.5.3が最新安定版であるため、2.5.3をインストールする。 $ rbenv install --list rbenvでrubyをインストールする。 $ rbenv install 2.5.3 インストールしたバージョンのrubyを使うよう、設定を切り替え。(下記は環境全体。globalではなくlocalオプションを使うとプロジェクト限定が可能) $ rbenv global 2.5.3` 反映されたかの確認。2.5.3の左側に*がついていればOK。 $ rbenv versions 新たにインストールしたrubyにgemをインストール。(rubyのバージョンごとにgemのインストールが必要)。 $ gem install bundler 新たにインストールしたbundlerの実行ファイルに対してrubyの実行フォルダから参照する際のシンボリックリンクをリフレッシュ