サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
大谷翔平
blog.freedom-man.com
5ヶ月間ほど3回目の転職活動していたので備忘として雑に残しておく。 関連する退職エントリはこちら。 利用した転職媒体など Forkwell, Findy, LAPRAS, 転職ドラフトなどの転職媒体や知人からのリファラルで転職活動をした。媒体内での企業検索は行わずスカウトを主に利用したが、スカウト起点だと最低限のフィルタリングは通っている(と思いたい)のでミスマッチが多少防げるかなと思っている。スカウトが少なければ検索も利用しようと思ったが、これらの媒体で220社以上からスカウトが来ており、検討する会社としては十分だったためスカウトのみの利用となった。 ちなみに、会社や事業の面白さ・ワクワク感を大事にしていたので、スカウトの文面に関してはパーソナライズされているかどうかはそこまで気にならなかった。もちろんパーソナライズしないと見てくれない層もいると思うしパーソナライズされたスカウトは第一印
Litestream というSQLite3をレプリケーションするOSSを調べてみました インストール macだと以下でインストールできます $ brew install benbjohnson/litestream/litestream 使い方 レプリケーション先は同一ホストの任意のパスやAmazon S3を利用できます。 今回はS3と互換性のあるオブジェクトストレージの MinIO を使って検証してみました。 MinIOの起動 $ docker run -p 9000:9000 minio/minio server /data 起動後は http://localhost:9000 でクレデンシャルに minioadmin を指定してログインし、適当なバケットを作成します。 今回は mybkt というバケットを作成しています。 Litestream起動前にsqlite3で適当なDBを作って
Formオブジェクトを使って、ActiveRecord経由でDBにレコードを保存する場合、エラー内容を適切にマージする必要があるよーということの備忘録。 例えば、以下のようなActiveRecordのUserクラスとFormオブジェクトであるUserRegisterFormクラスがあるとする。 class UserRegisterForm include ::ActiveModel::Model attr_accessor :email def save return false if invalid? # snip... user = User.new(email: email) return false if user.invalid? # snip... end end class User < ActiveRecord::Base # snip... validates :emai
BetterErrorsのコードリーディングをしました。 基本的にはRackミドルウェアでエラーハンドリングをして、エラーのバックトレースを表示。binding_of_callerがある場合はWeb上からirbでデバッグできるようにJSからRackミドルウェア向けにAPIを叩いてコマンドを実行・結果出力する、という感じです。 エラー表示するまで Railtieでは、productionではなくconsider_all_requests_localがtrueの場合のみBetterErrors::Middlewareを差し込みます。 module BetterErrors # @private class Railtie < Rails::Railtie initializer "better_errors.configure_rails_initialization" do if use_b
OAuth2.0 Providerを実装したく、OSSを色々と巡ってみて bshaffer/oauth2-server-phpが使いやすそうだったので触ってみましたー。 今回はAuthorization Code Grantのフローを実装してみました。 構成は以下のとおり。 Platform: heroku Database: postgres(Heroku Postgres) Language: php(5.6.11) Web server: Apache(2.4.10) 参考URL→Step-By-Step Walkthrough インストール composer.jsonにbshaffer/oauth2-server-phpを追加 { "require": { "bshaffer/oauth2-server-php": "~1.7" } } で、インストール。 $ composer i
zipファイルのデータは以下の3領域に分類されます。 各ファイルのローカルファイルヘッダとファイルのデータが交互に並ぶ領域 セントラルディレクトリヘッダがファイル分並ぶ領域 セントラルディレクトリヘッダの終端領域(ファイル数、データ数などのZIP全体の情報が格納される) 構造に関してはwikipediaの画像がわかりやすいです。 セントラルディレクトリの終端領域にはセントラルディレクトリヘッダの開始オフセットを格納しており、セントラルディレクトリヘッダには各ファイルのローカルファイルヘッダの開始オフセットが入っています。よって解凍する場合もこの順番で辿っていくことになります。 golang標準ライブラリを読む(読み込み) archive/zipがgoのzipライブラリになります。以下のようにしてzipファイルを読み込み、展開することができます。 r, err := zip.NewReade
N+1クエリの検出ツールとして有名なBulletのコードリーディングをしました。バージョンは5.9.0です。 コードリーディングの過程で、False Negative, False Positiveなケースを発見したのでそれも併せて紹介します。 ※この記事はRuby on Rails Advent Calendar 2018の19日目の記事です。 処理の概要 BulletのRackミドルウェアを差し込む 使っているORMに対してモジュールをprependやらextendやらで拡張。 これによってORMのメソッド呼び出しをフックしてBulletの処理をすることができる モジュールのメソッドでN+1クエリの集計をして、Rackミドルウェアを使って結果を表示する 使い方ざっくり config/environments/development.rb とかに以下のような記述を入れればOK Bulle
ecs-deployのコードリーディングをしました。バージョンは3.4.0です。 以下のパターンで追ってみます。/ecs-deployのシェルスクリプトが実体になります。 $ ecs-deploy -c {cluster_name} -n {service_name} -i {image_uri} 最初の方は定数とメソッドが定義されていて、最後にメインの処理が書かれています。 if [ "$BASH_SOURCE" == "$0" ]; then # ... # Check for AWS, AWS Command Line Interface require aws # Check for jq, Command-line JSON processor require jq # Loop through arguments, two at a time for key and value
実務では絶対に使わないけどrails/jbuilderのpartialレンダリングを無理矢理早くする方法。 partialでviewを使いまわしたい場合、特に1件のときはオブジェクト、複数件は配列を返したい場合、通常は以下のように書きます。 json.hoge do json.partial! 'api/hoge/record', collection: @records, as: :record end が、これはN+1 partial renderingが発生します。100件くらいの数値配列を出すだけでも遅いです。ログは以下のようにRenderedがたくさん表示されます。 ... Rendered api/hoge/_record.json.jbuilder (0.2ms) Rendered api/hoge/_record.json.jbuilder (0.1ms) Rendered
RailsのCSRF周りのコードリーディングをしました。 コードリーディングをする前に使い方を復習すると、protect_from_forgeryメソッドをコントローラで呼んで、csrf_meta_tagsのヘルパーでmetaタグを埋め込めばOKです。 <!DOCTYPE html> <html> <head> <title>BasicRails</title> <%= csrf_meta_tags %> ActionController::RequestForgeryProtection::ClassMethods#protect_from_forgeryは以下のようになっています。 module ActionController #:nodoc: module RequestForgeryProtection module ClassMethods def protect_from_f
RailsでActiveRecord::NoEnvironmentInSchemaErrorが出たときの原因と対応方法の備忘録。Railsのバージョンは5.1.5です。 開発環境でDBを作り直す際、db:setupではなくdb:migrateを使ってマイグレーションをする場合、以下のコマンドでDBのセットアップを行っていました。 $ bundle exec rake db:drop db:create db:migrate このとき、db:migrateでコケて、マイグレーションファイルを修正後に再度上記のコマンドを叩くと以下のように、ActiveRecord::NoEnvironmentInSchemaErrorが発生します。 rake aborted! ActiveRecord::NoEnvironmentInSchemaError: Environment data not foun
開発中のエラーでよく出てくるActiveRecord::PendingMigrationErrorについて調べてみました。Railsのバージョンは5.1.5です。 開発環境のエラー画面でPendingMigrationErrorが発生するのは以下の設定がされていることが条件です。 config.active_record.migration_error = :page_load ActiveRecord::RailtieのinitializerでRackミドルウェアにActiveRecord::Migration::CheckPendingを設定します。 module ActiveRecord class Railtie < Rails::Railtie # :nodoc: initializer "active_record.migration_error" do if config.a
lex/yaccでプログラミング言語を作るにはC言語を使う必要があるため、メモリ管理等の面でなかなか敷居が高いです。一方、PythonではPLYというlex/yaccのPython実装のライブラリが存在し、簡単にプログラミング言語を作成することができます。ということで、PLYを使ってプログラミング言語を作ってみました。 今回は以下の機能を作っていきます。サンプルコードはこちら。 ステートメントの順次実行 四則演算 グローバル変数のセット ちなみにプログラミング言語作成に関してはドシロートなので色々ご了承ください。 PLYの利点 PLYを使う利点は以下になります。 トークン保持に関する共用体の定義を省略できる 処理内容をPythonで書け、文法上のメリットがある+メモリ管理をしなくて良い lex/yaccではトークンの情報を共用体を使って保持する必要があります。PLYはPythonの動的型付
rails/springのコードリーディングをしましたー。ということで備忘録。 概要 Springはサーバ、アプリケーション、クライアントに分かれて処理を行います。サーバはクライアントからの接続を受け取り、アプリケーションにコマンド処理を委譲します。アプリケーションはRailsアプリケーションを先に読み込んでおいて、クライアントのリクエストが来たときにコマンドを実行する、ということをやっています。 サーバ側 まずはサーバ側の spring server を叩いたときの動きをコードから追ってみます。bin/springではSpring::Client.runを実行しています。 require 'spring/client' Spring::Client.run(ARGV) Spring::Client.runはサブコマンドに応じたクラスをインスタンス化し、callメソッドを呼び出します。se
omniauthのコードリーディングをしてみたので備忘録。 omniauthはRackミドルウェアとして提供されており、 /auth/:provider や /auth/:provider/callback のパスへのアクセスをフックしてIdPへのAuthorization RequestやCallback時の処理を定義することで、ソーシャルログインを実現しています。 OmniAuth::Builderについて omniauthの設定はOmniAuth::BuilderをRackミドルウェアとして設定しつつ、ブロックで各プロバイダの設定をします Rails.application.config.middleware.use OmniAuth::Builder do provider :facebook, ENV['FACEBOOK_KEY'], ENV['FACEBOOK_SECRET']
RoutingErrorやRack::QueryParser::InvalidParameterErrorが発生した場合にはRackミドルウェアベースでエラーハンドリングされます。今回はこのエラーハンドリングの処理についてコードリーディングしていきます。Railsのバージョンは5.1.5です。 ミドルウェアはこんな感じの並びで ActionDispatch::DebugExceptions, ActionDispatch::ShowExceptionsのRackミドルウェアがエラーハンドリングします。 $ bin/rake middleware ... use ActionDispatch::ShowExceptions use WebConsole::Middleware use ActionDispatch::DebugExceptions ... run BasicRails::Ap
SAMLのSPとなるようなアプリケーションが簡単に作れるかどうか、という技術検証で onelogin/php-samlを触ったので使い方をメモってみましたー。 今回はSalesforceをIdP、phpのアプリをSP(ローカル環境)として ソースに付随されているサンプルのアプリを動かしてみます。 1. インストール php使いの人にはお馴染みのComposerを使ってインストールします。 Windowsの場合はChocolateyだと何故か上手く行かなかったので、 本家からインストーラでインストールした方が良いかもしれないです。 $ composer init からの composer.jsonに”onelogin/php-saml”: “master-dev” を追加 { "name": "hoge/php", "authors": [ { "name": "hoge", "email
少しハマったので備忘録。公式のRubyのDockerイメージを使うとbundler経由でインストールしたものをボリューム用コンテナで永続化しても二回目以降の起動時でうまく反映されない事象が起きました。 具体的には以下の手順でエラーが発生しました。 コンテナを立ち上げてコンテナ内に入り、bundle install –path=vendor/bundle で依存ライブラリをインストール。vendor/bundleはボリュームコンテナで永続化している。 bin/rails sでサーバ起動できることを確認 コンテナを再起動し再度コンテナ内に入り、bin/rails sでサーバ起動する。vendor/bundleはボリュームコンテナで永続化しているはずなのでbin/rails sを叩けば起動できるはず… が、エラーで落ちる Dockerfileとdocker-compose.ymlはこんな感じです
Railsのsessionがどうやって設定されるのかをコードリーディングをして追ってみました。Railsのバージョンは5.1.4です。 今回はセッションストアにRedis(redis-store)を使ったケースを追ってみます。 ActionController::Metal#sessionはActionDispatch::Request#sessionにdelegateし、Rack::Request::Env#session(Rack::Request::HelpersやRack::Request::Envなどをinclude)を呼び出します。 module Rack class Request module Env def fetch_header(name, &block) @env.fetch(name, &block) end module Helpers def session
よくある秘密鍵生成のコマンドまとめ なお、OpenSSLのコマンドの使い方はサブコマンドのmanページを見るのが手っ取り早いです。 秘密鍵・公開鍵関連 パスなし秘密鍵を作成 $ openssl genrsa 2048 -out private_key_nopass.pem パス有り(暗号化)秘密鍵を作成 $ openssl genrsa 2048 -aes256 -out private_key.pem 秘密鍵のパスワード(暗号化)の解除 $ openssl rsa -in private_key.pem -out private_key_nopass.pem 秘密鍵のパスワードの変更 $ openssl rsa -in private_key.pem -out private_key.pem -aes256 秘密鍵から公開鍵を作成する $ openssl rsa -in private_
Ruby on Rails Advent Calendar 2017 19日目の記事です。 RailsでAPI開発するときのJSONレスポンスの生成方法についてまとめてみました。 JSONレスポンスの生成方法について RailsのHTTPレスポンスをJSONで生成する方法は以下の2つに分類されます renderメソッドにjson引数を指定する(モデル方式) templateハンドラでレンダリングする(ビュー方式) ライブラリでいうとactive_model_serializersは1のモデル方式、jbuilderやjbは2のビュー方式になります。 モデル方式はrenderメソッドにjson引数が指定されているとActionController::Renderers#_render_with_renderer_json が呼び出され、指定したオブジェクトのto_jsonメソッドが呼び出される
Ruby Advent Calendar 2017 13日目の記事になります。 使っているRubyGemの挙動や仕組みを理解するためによくコードを読んでいるのですが、今回はコードリーディグについて記事を書いていこうと思います。 RubyGemのコードを読む利点 Rubyのコードの書き方の勉強になる RubyGemの書き方の勉強になる モノによるが、gemのアップグレードなどでgemが動かなくなってもメンテナンスできるという安心感を手に入れることができる ブラックボックスではなくなるので、技術選定のハードルが下がる 使っているライブラリの中身を知ることが出来るので、納得感を持ってそのgemを使うことができる。コードベースで把握しているので使い方も忘れにくい 仕組みをストックしておくことで、他言語・他環境への横展開ができる 不具合や欲しい機能があればプルリク送ってマージされるかもしれない とい
表題の通り、WEBrickはシングルスレッドなアプリサーバではなくマルチスレッドです。 にも関わらず、Web上にはWEBrickがシングルスレッドであるかのような記事が多く、Wikipediaでも Unlike most of the servers that are used in production, WEBrick is not scalable since it is a single threaded web server by default. と記載があり、とても誤解をまねきやすいです(デフォルトで、と言っているので完全に間違っているとは言い難いけど) 今回は、WEBrickがマルチスレッドサーバである根拠と、なぜシングルスレッドと誤解されているのかをRailsのバージョンの話も交えて書いていきます。 WEBrickがマルチスレッドである根拠 どのバージョンを見ても、acc
RubyでPostgreSQLのレコードをCSV出力したときの備忘録。PostgreSQLの場合、psqlでCOPY文を投げればCSV化してくれますが、一部を変数に置き換えたり、条件を柔軟に切り替えたり、自動化するにはやはりプログラムからSQLを投げるのが良かったりします。 ということで、今回はRubyのpgライブラリを利用してCSV出力してみました。ActiveRecordだとちょっと大掛かりになってしまうのと、SQLを直接書かない場合はSQLが見えづらく、直接書く場合は旨味が無いので利用を見送りました。 コードはこんな感じ #!/usr/bin/env ruby require 'pg' require 'settingslogic' require 'erb' class Settings < Settingslogic source "application.yml" namesp
Salesforceの導入支援とかしてると、VBAを使ってSalesforceのAPIを叩きたくなることは多々あります。 Excelでちょっとデータ加工してExcelから直でデータインポートしたいんだよなー、とか Excelで作ったオブジェクト定義書からSalesforceにオブジェクト作りたいんだよなー、とか ちょっとデータ見たいんだけど、データローダ使ってCSVインポートして…てやってられるか!とか プロトタイプでガーってオブジェクト作ったけどオブジェクト定義書作ってない!Salesforceから一気に定義書作れたら良いのに!とか Excel内でやりたいこと、色々ありすぎて困ります。 業務用のツールとか作れば社内でモテること間違いなし! ということで今回はVBAからSalesforceのAPI叩いてみることにします。 ちなみにForce.com Office Toolkitが有りますが
業務でS3を使うことが多くなったが、 S3自体の耐久性は99.999999999%(イレブンナイン)なので問題無いとしても プログラムやAWSコンソール画面で”うっかり削除しちゃった”系のミスがあったときに バケットごとバックアップする機能があったら便利だなーと思って AWS CLIのS3のサブコマンド見てたらあったので紹介! 詳細はこちらから。 1. S3のバケット内のオブジェクトをローカルPCにバックアップ #aws s3 sync [s3 path] [local path] aws s3 sync s3://mybucket /home/user/s3backup 用途としてはバックアップというよりは、 “S3からデータを一括で引っ張ってきて加工して再アップロード” みたいなことをするときに便利。 オブジェクトキーのセパレータがスラッシュ(/)の場合は自動的にディレクトリを作って階
ActiveModelをインクルードしたクラスでvalidationでエラーにする場合、項目の名前をconfig/locales/**.ymlに設定してあげないとキーの値がそのまま出てしまう(正確にはアンダースコアがスペースに置換される) 例えばこんな感じで検索用のモデルを作成して module Tasks class Search include ActiveModel::Model attr_accessor :created_at_from, :created_at_to validate :created_at def created_at errors.add(:created_at_from, 'が不正です!') if created_at_from.blank? errors.add(:created_at_to, 'が不正です!!') if created_at_to.bl
5分でRailsでRackミドルウェアを試した備忘録。 こんな感じなミドルウェアなクラスを作る。 # lib/hoge.rb class Hoge def initialize(app) @app = app end def call(env) Rails.logger.info("-- start -- hogehoge") res = @app.call(env) Rails.logger.info("-- end -- hogehoge") res end end # lib/fuga.rb class Fuga def initialize(app) @app = app end def call(env) Rails.logger.info("-- start -- fugafuga") res = @app.call(env) Rails.logger.info("-- end
Railtieのサブクラスで呼び出したinitializerブロックが読み込まれる仕組みをコードを読んで紐解いてみました。Railsは5.1.2です Railtieでのinitializer呼び出し initializerメソッドはRails::Initializableモジュールに定義されています。Rails::Initializable.initializerメソッドではInitializerのインスタンスを作ってCollectionに追加します。opts[:after]の行はTSortによるソート用に定義しており、基本的にはinitializerが呼び出された順にブロックの処理が走るようになっています。 require "tsort" module Rails module Initializable module ClassMethods ... def initializers
次のページ
このページを最初にブックマークしてみませんか?
『freedom-man.com』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く