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

CarrierWave で画像の exif 情報を削除する [Rails]

メモ Rails

Carrierwave は Rails 用の画像アップローダで、元々のファイルに exif 情報が含まれていた場合はそのまま保存してしまう。
多くの人に公開する画像ならば、なるべくこれらの情報は削除しておくべきだ。
mini_magick の gem をインストールした後、下のように strip メソッドを追加する。

# app/uploaders/image_uploader.rb
class ImageUploader < CarrierWave::Uploader::Base
  include CarrierWave::MiniMagick
  process :strip

  def strip
    manipulate! do |img|
      img.strip
      img = yield(img) if block_given?
      img
    end
  end
end

参考: http://stackoverflow.com/questions/4753408/how-to-remove-exif-camera-data-from-image-with-carrierwave

Web API: The Good Parts [読書メモ]

読書メモ

Web API: The Good Parts

Web API: The Good Parts


これまでそれほど Web API に関心があったわけではないが、最近 OpenStack 辺りの http ベースのサービスを触る機会が多かったので何となく手に取った。
表紙を見たときは Java 辺りでサーバサイドのプログラムを延々と書き連ねてあるような内容を想像したが、実際はその逆だった。
ありがちなプログラムコードやサーバソフトウェアの設定法などは全くなく、API の設計それ自体に焦点を当てていて、現在主流のウェブサービスの例も豊富に紹介されている。
運営の違いによる設計の違いとその理由、著者の考えや推奨などが詳しく書いてあり、分かりやすい内容となっている。
適切な url の命名、パスの構造、セキュアで堅牢な運用方法などは Web API に限らず Web サービス全般で重要なことで、これまで曖昧なままでやってきたことを詳細に知ることが出来た。
少し前に Rails を使っていてパスとクエリパラメータどちらにしようかを悩んだことがあってちょうどその辺りも詳しく書いてあって非常に参考になった。
それほど厚くなく、値段も技術書にしては手軽だ。

ただ本書はプログラミングやサーバソフトウェアについての本ではない。
これだけ読めば直ちに Web API が作れるわけではないし、そう言う意味では全くの初心者向けの本とは言えないだろう。
すでに Web API を作っているがいまいち確信が持てないままに運用している人や、Web サービスを運用していて API が有った方が良いと思いつつも何をしたらいいのか分からない、といった人にうってつけだろうと思う。
結果的に API を作ることがなかったとしても、堅牢な Web サービスを作る上で大いに役立つだろう。

良い本だと思う。

ルーティングで文字列をモデルのパスに使用する[Rails]

メモ Rails プログラミング

rails で resources を使うと自動でパスと関連したメソッドが作られる。
例えば name 要素を持つ User モデルを作ったとして、

# config/routes.rb
...
  resources :users
...

のようにすると、id が 1 の User のパスは、
www.example.com/users/1
のようになる。
これは分かりやすくて良いのだけれど、少々不格好でスクレイピングのコントロールもしにくい。
理想としては
www.example.com/example_user
のように、モデル名を無くして、ユーザ名でアクセス出来るようにしたい。
有名どころだと TwitterGithub はこのようにしているようだ。

まずは routes.rb を書き換える。

# config/routes.rb
...
  get '/:id', to: 'users#show'
...

デフォルトの id は整数なので、to_param メソッドをオーバーライドして name を使うようにする。

# app/model/user.rb
...
  def to_param
    name
  end
...

user_path メソッドもオーバーライドする。

# app/helper/application_helper.rb
...
  def user_path(user)
    "/#{user.name}"
  end
...

test を使うときは test_helper でもオーバーライドする必要があるだろう。
とりあえず show だけだが、edit や destroy も同様に出来る。
文字列をパスに使う場合は一意性が必要になるので、インデックスは必須だ。
また、デフォルトの id を使う場合に比べて検索のパフォーマンスも低下するだろう。

Ruby の管理に rbenv を導入する

メモ Ruby Mac

環境: macOS Sierra, Ubuntu 16.04

rbenv は ruby のバージョン管理ソフトで、変化の速い ruby 界隈では必須と言えるだろう。
まずはインストール。

brew install rbenv

このままだとパスが通っていないので、.bash_profile に追加する。

# .bash_profile
export PATH="$HOME/.rbenv/shims:$PATH"
# バージョン一覧
rbenv install -l
# バージョンを指定してインストール
rbenv install 2.4.0
# global で使うバージョンを指定する
rbenv global 2.4.0
ruby -v

でバージョンを確認して、問題なし。
参考 : http://qiita.com/Chrowa3/items/34904262f7589a60aead

  • 追記- 17/2/4

Ubuntu だと若干違う

sudo aptitude install rbenv

で rbenv をインストールできるが、このままだと ruby のインストールリストは空っぽだ。

git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build

ruby-build をインストールすると、一覧が得られる。
あとは Mac と同様に

rbenv install 2.4.0

から設定できる。

参考:
https://github.com/rbenv/ruby-build

Webサイトを作ったときの評価ツール

メモ

web サイトを作ったときに、効率的なレスポンスやセキュリティ、SEO などがきちんと出来ているかを調べるツール。

PageSpeed Insights
アクセスする際の効率性を調べてくれる。
リクエスト最適化やファイルの圧縮、キャッシュの利用などが出来ているか。

SSL Server Test (Powered by Qualys SSL Labs)
セキュリティをチェック。
最高スコアにするのは結構大変。
nginx ならばここが参考になる。
NginxでHTTPS : ゼロから始めてSSLの評価をA+にするまで Part 1 | インフラ・ミドルウェア | POSTD

Website Grader
パフォーマンスやセキュリティ、SEO 全て調べてくれるが、上記のサイトに比べて評価が甘め。

どのサイトもアドレスを入力するだけでよく手軽で、改善方法もある程度教えてくれる。

Bitcoin-Core のブロックサイズを削減する

メモ 暗号通貨

Bitcoin のデフォルトウォレットである Bitcoin-Core はフルノードのウォレットで、ブロックチェーンのサイズは永遠に増え続ける。参考: ビットコインチャート - Blockchain.info
ナカモト論文にもあった pruning (枝刈) 機能が実装されていたので使ってみる。
参考:Bitcoin Core version 0.12.0 released, Running Bitcoin - Bitcoin Wiki
bitcoin ディレクトリ内部の conf ファイルに書き加える。

# bitcoin.conf
# ...
prune=20000 # ブロックの保存容量、MB 単位、 550 以上

上の場合20 GB を超えたブロックは古い方から削除される。
当然大きいほど安全になる。
削除されたブロックは参照できないので、外部からウォレットやアドレスをインポートすることは出来なくなる。

クラウドにサーバを立てた時の ssh, ufw の設定[Ubuntu]

メモ Linux

環境: ubuntu 16.04

AWSVPS サービスでクラウドサーバを立てた時に安全に使うための一連の流れ。

まずは root でリモートにログイン。
パスワードか公開鍵かはサービスによる。

ssh root@example.com

普段使うユーザを作成する。基本的にこれ以降 root は使わない。
ユーザ名をローカルとそろえておくと一々名前を指定しなくてもよくなる。
パスワード以外は空でも良い。

adduser username

作成したユーザに sudo 権限を付与

gpasswd -a username sudo

一度ログアウトし、作成したユーザでログイン

logout
ssh example.com

ログインできることと、 sudo 権限を確認。

sudo aptitude update
sudo aptitude upgrade

ユーザのホームディレクトリに ssh 用のフォルダを作成。

mkdir .ssh

.ssh/authorized_keys
にローカルの cat .ssh/id_rsa.pub の内容をコピペ。
ログアウトし、パスワード無しでログイン出来ることを確認。
ssh の設定ファイルを書き換える。

# /etc/ssh/sshd_conf
PasswordAuthentication no
# パスワード認証を禁止
UsePAM no
# PAM の使用を禁止
PermitRootLogin no
# root へのログインを禁止

ssh やその他アップグレードの設定を反映させるため再起動する。

sudo reboot

一応 root ではじかれるかチェック

ssh root@example.com
# -> Permission denied (publickey).

ssh 設定はここまで。
ポートは基本的に ssh だけ開けておき、それ以外は使う都度に開けておくのがよい。

sudo ufw enable
# アクティブ化
sudo ufw default DENY
# デフォルトは拒否
sudo ufw allow 22
# ssh を許可
sudo ufw status
# 設定を確認
sudo ufw reload
# 設定を反映

一応ローカルからおかしなポートがあいていないか確認。

nmap -Pn example.com

参考