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

短時間勉強会のススメ

最近社内で短時間勉強会を行っている。 特徴としては、 1時間〜1時間半くらいで終わる 参加者、主催者が特に事前準備をしない ことがあげられる。 たとえば"他事業部のサービスのソースコードを読む会"をやったときは、 30分間他事業部のサービスのソースコ…

ネストしたHashからOpenStructを作る

HashからOpenStructを作成する場合、 pry(main)> OpenStruct.new({hoge: 1}) => #<OpenStruct hoge=1> pry(main)> OpenStruct.new({hoge: 1}).hoge => 1 のようにすればよい。 しかしネストしたHashだと以下のようになる。 pry(main)> OpenStruct.new({hoge: {fuga: 2}}) => #<OpenStruct hoge={:fuga=>2}</openstruct></openstruct>…

FactoryGirlで Hashを定義

FactoryGirlでARではなくhashのモックデータを返してほしいときがある。 そういう場合は以下のようにすればよい。 FactoryGirl.define do factory :dog, class: Hash do id 1 name 'john' color 'black' initialize_with { attributes } end end initialize_…

Capybaraで非表示要素を対象とする

Capybaraで非表示(style="display: none;")になっている要素を検索対象にできないか調べたら、 visibleオプションが使えることが分かった。 例えば、以下のような感じだ find("#hoeg", visible: false) have_selector('.hoge', visible: false) have_css('#h…

Slimのスタイルガイド

テンプレートエンジンのSlimのスタイルガイドはないものかと探していたら見つけた。 https://github.com/idmean/slim-style-guide Slimはシンプルなのでそんなにどう書くか決めなくても大丈夫なんだけど、いくつかは迷うときがある。 例えば属性の定義は以下…

API BlueprintについてLTをした

エンジニア飲み会があったので、ちょうど調べていたAPI BlueprintについてLTをした。 スライド↓ API Blueprintとその周辺ツール API Blueprintは読み書きしやすいのが特徴だ。 JSON SchemaはAPIドキュメントとしてはそのままだと読みにくいし、Swaggerはなん…

rack-attack gemでユーザごとにアクセス数を数える

http://shepherdmaster.hateblo.jp/entry/2016/08/21/000115 でも紹介しましたが、 https://github.com/kickstarter/rack-attack という便利なgemがあります。 n秒間にn回アクセスされたらアクセスを弾くThrottles機能を使う場合、 IP単位でアクセス数を数え…

rack-attack gemで保存先にRedisを指定する

https://github.com/kickstarter/rack-attack という便利なgemがあります。 特定のアクセスのみを許可するSafelists機能や、特定のアクセスを弾くBlocklist機能や n秒間にn回アクセスされたらアクセスを弾くThrottles機能、特定のアクセスを記録するTracks機…

factory_girlでmethodという名前のフィールドをもっているモデルを定義しようとするとエラーになる

method 'GET' みたいに定義するとエラーになる。 その場合は、 add_attribute :method, 'GET' のようにadd_attribute を使うと回避できる。 またmethod以外にもエラーになる名前があって、以下がそのリスト。 __send__ __id__ nil? send object_id extend in…

朝早く出社するようになった

先週くらいから朝8時くらいに出社するようになった。 きっかけとなったのは以下の記事だ。http://kitak.hatenablog.jp/entry/2016/07/04/182403 なんで朝早く出社しようと思い立ったかというと、 ・今の会社は10時出社で昼が12時からなので午前が2時間しかな…

Railsで生のSQLにテーブル名やカラム名を動的に埋め込みたい場合はquoteメソッドを使おう

Railsでアプリケーション開発をしていると、深淵なる理由で生のSQLにテーブル名やカラム名を動的に埋め込みたいケースが出てくる。 その場合安全だと分かっていてもサニタイズしないでSQLに文字列を埋め込むのは気が引ける。 そういう場合は、 ActiveRecord:…

Railsで未実行のmigrationを調べたい時はrake db:migrate:statusを使うとよい

本番環境でrake db:migrateを実行する場合、はたしてどのmigrationが実行されるのか確認したくなる場合がある。 その場合、rake db:migrate:statusを実行すると未実行のmigrationが表示されて便利だ。 たとえば、以下のような場合downとなっているのが未実行…

RSpec Mocksで既存メソッドを上書く

RSpecで既存のとあるメソッドが呼びだされたら特定の値を返したい場合、 allow(model).to receive(:foo).and_return(14) みたいにant_returnすればよい。これは有名。 しかし深淵なる理由でメソッドを上書きたい場合がでてくる。テスト中に特定の値を返すの…

Railsでtrimするたった一つの冴えたやり方

trimしたいという欲求はアプリケーションを作る上で必ず出てくる。 そしてすぐにString#stripではダメだと気付く。全角スペースが削除されないからだ。 で、独自の正規表現を書いたりするんだけど、ActiveSupport内に便利な定数があるのでそれを使うと楽。 s…

Railsで複数DBのmigration

大規模なRailsアプリケーションだったり、旧来のシステムをRailsに置き換えたりしてると、どうしても複数DBを扱いたくなってくる。 その場合は例えば、以下のようなlib/tasks/database_foo.rakeを作成します。 namespace :foo do desc 'Configure the variab…

mail gemで、Content-Type: multipart/mixedとしたいけどならないときの対処法

mail gem使って、multipartメールでかつファイルが添付されたメールを送信したら、 Content-Type: multipart/mixedではなくContent-Type: multipart/alternativeになってしまい、 Thunderbirdでは添付ファイルが認識されず、MacのメーラーではHTML本文が表示…

mail gemで、「Non US-ASCII detected and no charset defined. Defaulting to UTF-8, set your own if this is incorrect.」と出た場合

mail gemを使っていて Non US-ASCII detected and no charset defined. Defaulting to UTF-8, set your own if this is incorrect. の様な警告が出る場合は、 mail.text_part do body 'あああ' content_type 'text/plain; charset=UTF-8' end mail.html_part…

perfectqueueを動かしてみる

Fluentdの作者の古橋さんが作って、Treasure Dataで使われているというメッセージキュー、 perfectqueue。 動かしてみようと思ったら全然ネットに資料がなかったので頑張って動かしてみました。 大きな特徴としてはMySQL上でキューイングシステムを構築する…

MIMEエンコードされたメールのデコード方法

メール本文のデコード まずgmailの"メッセージのソースを表示する"をクリックする。 encodingがbase64でcharsetがUTF-8の場合 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: base64 pbpaste | nkf -mB encodingが7bitで、charsetIS…

telnetからSMTPを使ってメール送信

yahooのメールにtelnetからSMTPを使ってメール送信してみます。 $ telnet smtp.mail.yahoo.co.jp 25 Trying 183.79.29.237... telnet: connect to address 183.79.29.237: Connection refused telnet: Unable to connect to remote host はい。Connection re…

RedisClusterにslaveを追加したとき、masterとslaveでキーの数が違う

以前、Redis Clusterにslaveを追加したときmasterとslaveでキーの数が違う現象に合いました。 masterの方がキーが多くslaveの方がキーが少ない。 その時はどうしてそんなことになるのか分からなかったのですが、調査して分かりました。 結論は、 slaveを追加…

MySQLで外部キー作成時には外部キー先にindexを定義してかつデータ型と長さを合わせないとエラーになる

MySQLで外部キー作成時以下のエラーがでた。 Cannot add foreign key constraint もちろん外部キー先にはindexを張っている。 で、いろいろググッて迷走した結果、以下のページを見つけた。 http://sigisi.hatenablog.com/entry/20111129 参照カラムと被参照…

switch_pointを使った際に複数モデルの更新にトランザクションをかける

switch_pointを使った際に複数モデルの更新にトランザクションをかけるのに少しハマった。 最初以下のように書いた。 ActiveRecord::Base.transaction do ModelA.with_writable do save! modelB.save! end end ただこれだとrollbackされない。 以下でもダメ…

テストのときだけswitch_pointを無効にしたい

Railsのgemで複数DBを扱うためのswitch_pointというものがあります。 https://github.com/eagletmt/switch_point 簡単にslaveとmasterへのアクセスを切り替えられて便利なのですが、RSpec実行時にはswitch_pointを無効にしたくなります。 FactoryGirlを使っ…

Railsのgretelでproductionだとリンクが2重エスケープされる

Railsにはgretelというパンくずをスマートに管理するためのgemがあります。 https://github.com/lassebunk/gretel このgemを使っていたんですが、テンプレートエンジンにSlimを使用してproductionモードで動かすとリンクが2重エスケープされる現象に遭遇しま…

RedisClusterで"Redis::CommandError: CLUSTERDOWN The cluster is down"エラーが頻発する場合はcluster-node-timeoutが短いせいかも

RedisClusterでアプリケーション側で"Redis::CommandError: CLUSTERDOWN The cluster is down"エラーがでたけど Redisのログにはcluster downのログがはかれていなくて、原因が分からなかった。 あとたまに、Redisのログにごく短い間隔で Cluster state chan…

Redis Clusterへのデータ移行

Redis Clusterはマスターがダウンしたら自動でfailoverしてくれるためとても便利です。 通常の、つまりMaster/Slave構成のRedisから、Redis Clusterへ移行したい人もいるかと思います。 しかし通常のRedisインスタンスからRedis Clusterへデータ移行するには…

Redis Clusterで出来ないこと

Redis Clusterを触ってて、おおお…マジか…と思ったことがいくつかあった。 スレーブからGETできない 通常のRedis のレプリケーションだとスレーブからGETできますが、 Redis Clusterだとできません。マスターからGETしろとメッセージがでます。 これはおそら…

Redis Clusterの操作を簡単にするredis-trib.rbの使い方

Redisは3.0から Redis Cluster というクラスタが組める機能が追加されました。 コマンドにも"cluster"から始まるコマンドが追加されています。 http://redis.io/commands#cluster これらのコマンドを使えばクラスタの操作ができるわけなんですが、 今日はred…

転職しました

5月1日から新しい会社に入りました。 4ヶ月の無職期間とも涙のお別れです。転職活動の顛末は色々あって詳しく書けないけど(詳しくは飲みの席で)、 いい会社に入れたと思う。 システムは最新鋭の技術が使われているというわけではなく、むしろレガシーなんだ…

gvmを入れるとzaw-cdrが動かない

gvmを入れると、zaw-src-cdr:2: closing brace expectedと表示されてzaw-cdrが動かない。。 gvmを入れると .zshrcの最後に #THIS MUST BE AT THE END OF THE FILE FOR GVM TO WORK!!! [[ -s "/Users/xxx/.gvm/bin/gvm-init.sh" ]] && source "/Users/xxx/.gv…

「体系的に学ぶ安全なWebアプリケーションの作り方」を読んだ

体系的に学ぶ 安全なWebアプリケーションの作り方 脆弱性が生まれる原理と対策の実践作者: 徳丸浩出版社/メーカー: ソフトバンククリエイティブ発売日: 2011/03/03メディア: 大型本購入: 119人 クリック: 4,283回この商品を含むブログ (144件) を見る 読もう…

デザインパターンを復習した

増補改訂版Java言語で学ぶデザインパターン入門作者: 結城浩出版社/メーカー: ソフトバンククリエイティブ発売日: 2004/06/19メディア: 大型本購入: 51人 クリック: 762回この商品を含むブログ (400件) を見る エンジニアになって一年目くらいに読んできり、…

SQLアンチパターン読みなおした

SQL

復習のために読みなおした。 SQLアンチパターン作者: Bill Karwin,和田卓人(監訳),和田省二(監訳),児島修出版社/メーカー: オライリージャパン発売日: 2013/01/26メディア: 大型本購入: 9人 クリック: 698回この商品を含むブログ (40件) を見る エンジニア歴…

Go言語とTypeScriptでTodoWebアプリを作った

Go言語とTypeScriptの勉強がてらにTodoWebアプリケーションを作った。 Github : https://github.com/akira-kuriyama/todo-app--golang-and-typescript デモ: http://demo.todo.st-marron.info/ 使った技術 サーバーサイド Go言語(フレームワークは使ってな…

Semantic UIのテーマを変える

css

CSSフレームワークとして人気のSemantic UIですが、 ガンガンバージョンアップ中なのかテーマを変える機構はあるのですが、自分でbuildしないといけません。(2015/02/05 現在) 多分、しばらくするともっと簡単にテーマを変えられるようになると思いますが。…

IntelliJ IDEAでgolang pluginを使いたいけどSDKの設定がうまく出来なくてウワーってなっている方へ

Go

golang pluginの正式名称はgo-lang-idea-pluginですが、 version1.0.0からSDKの設定がうまくできない問題が解決されているもよう。(あとGOPATHも自動設定されるようになったっぽい) しかしversion1.0.0はまだリリースされていないので、以下のページから、Go…

UglifyJS2で多段SourceMapを生成する

Minifyされたファイルの元ファイルを見るのにSourceMapは便利です。 しかしAltJS等からJavaScriptへ変換し、そのJavaScriptファイルをMinifyしたとき、 AltJSで書かれた元ファイルをSourceMapを通して見れるかというのが疑問に思ったので調べました。 上記の…

「インフラ/ネットワークエンジニアのためのネットワーク技術&設計入門」を読んだ

インフラ/ネットワークのことが知りたかったので、 「インフラ/ネットワークエンジニアのためのネットワーク技術&設計入門」を読んだ。インフラ/ネットワークエンジニアのためのネットワーク技術&設計入門作者: みやたひろし出版社/メーカー: SBクリエイティ…

アークヒルズライブラリーの会員になった

退職してどこか勉強できる場所が必要になったので前々から気になっていたアークヒルズライブラリーの会員になることにした。 最初は六本木ライブラリーにしようかとおもっていたのだが、 アークヒルズライブラリーは六本木一丁目にありそっちのほうが家から…

退職しました

2014/12/22が最終出社日で、1月末まで有給消化です。 SIerからWeb企業に転職し、約三年間働きました。 あっというまでした。 退職する際はスッ…と去りたかったんですけど、 いざ送別会が開催されたり寄せ書きもらったりすると中々感動的ですね。 別れの場面…

「ツイッター創業物語」読んだ

「ツイッター創業物語」読んだ。ツイッター創業物語 金と権力、友情、そして裏切り作者: ニック・ビルトン,伏見威蕃出版社/メーカー: 日本経済新聞出版社発売日: 2014/04/24メディア: 単行本(ソフトカバー)この商品を含むブログ (9件) を見る以下、ネタバ…

grunt-styleguideを使った時のREADME.mdの置き場所

StyleDoccoを使ってスタイルガイドを出力すると、index.htmlにREADME.mdの内容が反映される。 ただどの場所にあるREADME.mdを読み込むのかよくわからなかったので調べた。 (特にgrunt-styleguideを使った場合によく分からなかったので)まずStyleDoccoのソー…

foremanを使ってUpstart設定ファイルを自動作成する

foremanを使っていると、つい、起動するサービスをどんどん追加してしまう。 そこでforemanを使ってUpstart設定ファイルを自動生成して、 サービスをUpstartで起動するようにしてみよう。まず、以下のようなProcfileがあるとする。 $ cat Procfile apache: /…

村上春樹の「色彩を持たない多崎つくると、彼の巡礼の年」を読んだ

読みかけだった、「色彩を持たない多崎つくると、彼の巡礼の年」を読んだ。 最初はつまんないなと思ったけど、途中から段々面白くなった。 深い傷と向かい合う流れは味わい深くもあるし愛おしくもある。 小説内で解決されないことはあるけれど、人生はそうい…

Vagrant環境にElasticsearchのCluster構成を作る

Vagrant環境に複数台VMを立ち上げて、ElasticsearchのCluster構成を作ってみたので、メモとして残しておく。 設定 Vagrantfileは以下。 VAGRANTFILE_API_VERSION = "2" Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| # boxファイルは適当に用意す…

Fluentdのtypesオプションで型指定をする

Fluentdのin_tail機能を使っていると数値として扱ってほしいのに フィールドの値が文字列になってしまって、 fluent-plugin-typecastを使うことがあると思います。しかし、version 0.10.42以上のFluentdであれば、 in_tailにtypesオプションという型が指定で…

Upstartでプロセスが停止しない?

Upstartを使っていると停止させた時にプロセスが死なないことがあることに気づいた。 それは特定の条件、たぶん2回以上プロセスがforkされると、孫プロセスが死なないというものだ。 ※Linuxの正常な動作っぽいが。たとえば、 start on runlevel [2345] stop …

Upstartを使ってイベントに応じてジョブを起動/停止させてみる

SysVinitのようなinitデーモンの代替となるUpstart。 書いてみたら凄く簡単だった。 initデーモンのスクリプトは書くの面倒だもんね。。Upstartの基本的な書き方は、 ハートビーツさんの、「Upstart を使ってお手軽 daemon 化」の記事を参照するといい。 htt…

MongoDBユーザを作成するChefレシピ

MongoDBユーザを作成するレシピを書こうとしたら手こずった。 公式レシピではユーザを作成するようなリソースはないようだ。 なのでしょうがないくbashリソースを使って作成することにした。 それが以下だ。 bash 'create MongoDB user' do user 'vagrant' g…