vanhuyz's notes

Posts

January 22, 2016

Testing Rails

Some useful tips from “Testing Rails” book by thoughtbot
January 18, 2016

Coursera 機械学習 - プログラミング課題1解答例

課題のページ https://www.coursera.org/learn/machine-learning/programming/8f3qT/linear-regression プログラミング課題はちょっと重いので今回の解答例を上げます。 わからないことや別の解答がありましたらコメントをお願いします。 必須課題 1. Computing Cost (for One Variable) Gradient DescentのCost function $J(\theta)$ は以下の通り $$ J(\theta) = \frac{1}{2m}\sum_ {i=1}^m (h_ \theta(x^{(i)}) - y^{(i)} )^2 $$ ここで、仮定関数 $ h_ \theta(x) $は $$ h_ \theta(x) = \theta^T x = \theta_ 0 + \theta_ 1x_ 1 $$ それで、 $$ J(\theta) = \frac{1}{2m}\sum_ {i=1}^m (\theta^T x^{(i)} - y^{(i)} )^2 $$ 注意したいのは $\theta$ と $x^{(i)}$ はベクトルで、$ y^{(i)} $は実数です。 課題はこの関数をOctaveで書くことです。以下は解答例です。 function J = computeCost(X, y, theta) m = length(y); % number of training examples % 97 examplesがあるのでここで m == 97 % size(X) == [97 2] % size(y) == [97 1] % size(theta) == [2 1] % Xは97x2行列。1行は1つのtraining example [x0 x1] (x0はいつも1) % yは97次元ベクトル % thetaは2次元ベクトル J = 0; % まずは和の部分を計算します for i = 1:m J += (theta' * X(i,:)' - y(i))^2; end % X(i,:)は1つの行、つまりtraining exampleです。ベクトルに変換するので転置を取りました。 % 最後に2mを割るだけです J = J / (2*m); end 実行した結果、cost functionの値は32.
November 20, 2015

Using Backbone.js on Rails

My simple demo to show how to integrate Backbone.js with Rails! Source code can be found here: https://github.com/vanhuyz/rails-with-backbonejs-example
October 22, 2015

Getting Started with Ansible

Today I had a small talk at work about Ansible!
August 29, 2015

メンテナンス本格入門のまとめ

メンテナンスは必要? メンテナンスなんてない方がよい それでも行う必要があるとき 歴史的かつ技術的な負債 作業難度のトレードオフ メンテナンスの種類 計画メンテナンス 事前に計画し、ユーザー告知を行って作業を行う。これに当たる主だった作業としては ハードウェアの保留/入れ替え データベースの設定変更 ネットワークの保留 手順: 作業手順作成 事前準備:Sorryサーバーの準備 テスト環境での予行演習 作業実施:作業チェック、問題発生時の対処 確認作業:モニタリング、作業の振り返り 緊急メンテナンス 障害が発生した場合などに原因を解決/追求品ケラバサービス継続が難しい場合などに行う。内容は 障害復旧 障害の現状保存 障害の詳細調査 手順 障害検知 原因調査 メンテナンス判断 作業実施 確認作業 振り返り・ノウハウ化 その他:ユーザーへ告知、補償 メンテナンスの手法 全停止メンテナンス 一部停止メンテナンス 無停止メンテナンス メンテフリーへのアプローチ メンテフリーとはサビースを停止せずメンテナンスを行う。そのためには、設計、構築、運用のすべての段階で「いかにSPOFをなくし、システム停止せずに作業できるか」を考え続ける必要がある。アプローチは様々あるが、弊社に適したものは以下にあげられる。 Webサーバー、アプリケーションサーバー ロードバランサによって複数のサーバーにアクセスを振り分け、2台以上用意する。Apache/Nginx・アプリケーションサーバーの設定変更や再起動といった作業でユーザーに影響があるシステム構成いなっているものは好ましくない データベース設計: スキーマ変更の頻度高いサービスはMongoDBへ RDBの場合はマスタスレーブ構成やマスタ分割、スキーマ変更のコストを下げる。MySQLの場合はオンラインスキーマ変更がある リリース: ロードバランサ切り離しによるリリース:ロードバランサからアプリケーションサーバーを分離し、1台ずつアプリケーションを入れ替えていく。Jenkinsなどでサーバーに順次デプロイしていくと良い 系切り替えによるリリース:稼働系と待機系の2系統を準備し、ロードバランサでクライアントの向き先を切り替えてリリースする ホットデプロイによる動的リリース:アプリケーションを再起動せずにモジュールを更新する機能。UnicornやPumaなどはこの機能がある(と書いてある) カナリアリリース:一部のユーザーから徐々に新バージョンのアプリケーションを適用していく手法。FacebookやGoogleの大規模サービスはこの方法でデプロイされている 結論 サービスの種類・規模や原因によって様々なパータンがある。いつ起こるのもわからない。そのため、監視ツールを導入や毎日心構えが必要である(エンジニアの辛い道)
May 21, 2015

Fluentd導入してからエラーログを全部Slackに通知する

やりたいこと サーバーが落ちるときすぐ管理者に通知する 設計イメージ Fluentdで全部のエラーログをまとめてSlackに送信する。 Fluentd導入 Fluentdとは ログ収集ミドルウェアである。Fluentdにインプットされた、すべてのログをJSONに変換し、アウトプットする。 Fluentdのインストール (Ubuntu 14.04) 事前準備 ntpをインストールする $ sudo apt-get install ntp ファイルディスクリプタの上限を増やす 現在のファイルディスクリプタ数を確認 $ ulimit -n 1024 もし1024なら不十分なので上限を増やす。/etc/security/limits.conf に以下の行を追加する root soft nofile 65536 root hard nofile 65536 * soft nofile 65536 * hard nofile 65536 編集終わったらマシン再起動 $ sudo reboot もう一度確認 $ ulimit -n 65536 Fluentdのインストール $ curl -L http://toolbelt.treasuredata.com/sh/install-ubuntu-trusty-td-agent2.sh | sh 起動するときFluentd(td-agent)を自動に起動 $ sudo update-rc.d td-agent defaults Slackへ連帯 FluentdのSlackプラグインをインストールする $ sudo /opt/td-agent/embedded/bin/fluent-gem install fluent-plugin-slack SlackのWebhookを登録 https://yourteam.
March 19, 2015

nginxの紹介

最近Apacheからnginxに乗り換えたので、nginxの紹介について発表しました!
February 13, 2015

Railsで論理削除を考慮するunique制約のかけ方

使用バージョン Rails 4.2.0 Ruby 2.2.0 MySQL 5.6 論理削除のgem: paranoia 2.1.0 目的 例えばこういうuserモデルがあります # 20150119070756_create_users.rb class CreateUsers < ActiveRecord::Migration def change create_table :users do |t| t.string :name, :limit => 20 t.datetime :deleted_at # <- 論理削除 t.timestamps null: false end end end 注意したいのはdeleted_atコラムは削除した日付です。デフォルトだと、 非削除レコードはdeleted_at IS NULL 削除済みレコードはdeleted_at IS NOT NULL 問題: もしnameをunique制約をかけると、削除済みレコードはそのままデータベースに残るので同じnameのレコードを追加することができません。 目的: 非削除レコードの中でnameをunique制約したい。 ネットで調べるとハマる人が少なくないようです。 今回はデータベースレベルとアプリケーションレベルの両方設定します。 作業内容 まずdeleted_atはNULLだとunique複合キーを設定するのも意味ないのでNULLを避けます。 設定ファイルparanoia.rbを作る # config/initializers/paranoia.rb Paranoia.default_sentinel_value = DateTime.new(0) 以上の1行だけで、 非削除レコードはdeleted_at = '0000-01-01 00:00:00' 削除済みレコードはdeleted_at != '0000-01-01 00:00:00' になります。これで、unique複合キーを設定することができます。
February 3, 2015

MySQLで大量のデータを挿入して、SELECTパーフォマンスを比較する

大量のデータを扱う機会があるため、データが非常に多いときMySQLのパフォーマンスはどうなるかを検討した。 検討するテーブル: 検討したいquery: SELECT * FROM activity_records WHERE date BETWEEN '2014-01-01' AND '2014-04-10'; なのでdateコラムにindexをつけた。このテーブルに5億ぐらいのレコードがあるとき、レスポンス時間はどのぐらいなのか検討したい。 環境: SSD: 256GB テーブルに5億レコードを挿入する この記事は大変参考になりました:Mass inserting data in Rails without killing your performance 単純の(5*10**8).times { Model.create(options) }なら20日間がかかるのに対し、1つのINSERTを大量のデータをまとめ(bulk insertと呼ばれる)すると10時間しかかからない。 最終のrakeタスクのコードは以下となる # insert_data.rake namespace :insert_data do desc "Insert dummy activity records" task run: :environment do TOTAL_RECORDS = 500000000 RECORDS_PER_TIME = 50000 CONN = ActiveRecord::Base.connection start_time = Time.now (TOTAL_RECORDS/RECORDS_PER_TIME).times do |i| inserts = Array.new RECORDS_PER_TIME.times do |j| date = (Time.
January 30, 2015

API開発用必要なGemのまとめ(2015/08更新)

初めてRailsプロジェクトに入ったとき、Gemfileを見ても全くわからなかった。Rails初心者のため必要なGemをまとめました。良いGemを発見したらどんどん更新していこうと思います。 2015/08/13時点 データベース関連 mysql2 MySQLアダプタ MySQLを使うなら必須 redis Ruby client library for Redis cache, session保存用 ar-octopus レプリケーション (master+slave管理) switch_point (※ 2015/08/13追加) ar-octopusの代替。機能はar-octopusまで高くないが、master+slave切り替えぐらいなら十分 paranoia 論理削除 API grape REST API生成 grape-entity grapeのサーポート レスポンス(json)を簡単に記述できる grape-swagger grapeのサーポート Swaggerドキュメントを生成する kramdown grape-swaggerのサーポート markdownパーサー rack-cors Cross-Origin Resource Sharing (CORS)をハンドリング Swaggerを別のサーバーに置く場合はこれが必須 kaminariまたはgrape-kaminari APIのページネーション テスト rspec-rails テストフレームワーク capybara (※ 2015/08/13追加) Websiteのテストフレームワーク shoulda-matchers (※ 2015/08/13追加) モデルテストに便利 spork-rails テストの実行時間を短縮してくれる factory_girl_rails テストデータを用意する database_cleaner FactoryGirlにて作成するテストデータを、テストを実行する度に消去する turnip (※ 2015/08/13追加) Rspecの中にCucumber風コードを書ける capybara-screenshot (※ 2015/08/13追加) Capybaraのテストが失敗したら自動的にスクリーンショートを撮る ユーザ認証 devise ユーザ登録・ログインまで全てやってくれる 管理画面 activeadmin 10分で作れる管理画面 Push通知 houston iOSデバイスにpush通知を送る定番のgem invalid tokenが混じると通知が届かないバグがある(2014/12) parse-ruby-client (※ 2015/08/13追加) Parseと連携 バックグラウンド処理 sidekiq バックグラウンドworkerの定番 sucker_punch (※ 2015/08/13追加) Sidekiqはredisが必須なのでインフラコストが上がる。メールをバックグラウンドで送るぐらいならsucker_punchの方が軽い whenever Cron jobs管理 画像関連 carrierwave 画像アップロードの定番 paperclip (※ 2015/08/13追加) これも画像アップロードの定番 fog carrierwaveのサーポート S3にアップロード rmagick 画像処理(サイズ調整、角丸など)に便利 デプロイ用 unicorn 本番用のWebサーバー 設定は面倒 capistrano 有名なデプロイツール capistrano-rails db migrateとassets compileタスクを用意する capistrano-rbenv デプロイ先にrbenv使ったらこれが必要 capistrano3-unicorn デプロイした後unicornを再起動してくれる Ubuntu14.
  • ««
  • «
  • 2
  • 3
  • 4
  • 5
  • 6
  • »
  • »»
© vanhuyz's notes 2025