Rails x nginxでサブディレクトリでアプリケーションを動かす

早速本題。必要なのは以下2点

  1. nginxの設定
  2. config.ruの設定

nginxの設定について

nginxには以下のように記述する。

client_max_body_size 2G;

upstream app_server {
  server unix:/var/www/#{ app directory }/tmp/sockets/unicorn.sock fail_timeout=0; 
}

server {
  listen 80;
  server_name xxx.xx.xx.xxx;
  keepalive_timeout 5;
  try_files $uri/index.html $uri.html $uri @app;
  
  location /#{ sub directory name}/ { #ここ
    error_log  /var/log/#{ app directory }/nginx/nginx.error.log;
    access_log /var/log/#{ app directory }/nginx/nginx.access.log;
    root /var/www/#{ app directory }/public;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_redirect off;
    proxy_pass http://app_server; #ここ ※2
  }

  error_page 500 502 503 504 /500.html;
  location = /500.html {
    root /var/www/#{ app directory }/public; 
  }
}

※2 ここで末尾に「/」を入れないのが肝

rails_app/config.ruの設定について

RAILS_RELATIVE_URL_ROOT='/#{ sub directory name }' # ここは環境変数などにしたほうがよい?

require_relative 'config/environment'


if RAILS_RELATIVE_URL_ROOT then
  map RAILS_RELATIVE_URL_ROOT do
    run Rails.application
  end
else
  run Rails.application
end

以上、簡単にサブディレクトリ切れます。 素敵なサブディレクトリライフを!

【インド】乗り物の料金交渉のコツについて

恐らく他の国でもそうだが、インドではリキシャやタクシーなどの乗り物について、料金交渉を上手にしないと相場以上の料金を支払わされたりすることがある。

またタクシーなどは勝手に別の目的地に連れて行かれ、最悪の場合は提携している(?)店に連れて行かれて高額な買い物を強要されることがある。

そうした、トラブルを防ぐハックを紹介する。

料金交渉のハック

how match? を言わない

まず大事なのは料金を聞かないことだ。最初に料金を聞いてしまうと相場よりはるかな値段をふっかけられ、そこからの値段交渉となり完全に相手のペースとなってしまう。

そのため、 相場を事前にリサーチし、こちらから最初に目的地と値段を言ってしまう ことが重要だ。

例えばインドのデリー・グルガオンでは、大体1人あたり10Rs/kmが相場となっているため、先ず目的地までの距離を調べ、計算をして、目的地を伝えると同時に料金をこちらかさ先に言ってしまう。

なお料金相場は2017年11月12日時点のものだ。

値上げしようとする場合は容赦なく「No」と言って立ち去る潔さが大事だ。

ただし混んでいるから等、妥当な理由でいくらかあげてくる場合、いい合意だと言える範囲で私はその条件をのんでいる。

また距離を調べる際には、wifi環境下に要る内にgoogle mapをオフラインで使用できるようマップのダウンロードを事前に行うことをすすめる。

着いたら降りながら料金を支払い足早に去る

私はまだ到着後にいちゃもんをつけられたことはないが、そうしたことがあるという話をよく聞く。

そのため、乗っている間に ちょうど料金を準備し降りながら払う ことが大事だろう。一切交渉の余地を相手に与えず、事前に合意した金額を支払い足早に去るのだ。

料金は一桁づつ確認する。

例えば15と50等、とても似ていてわかりにくい表現があったり、500のことをただ「ファイブ」といったりしている場合がある。 これはとても危険で、お互いが誤解してしまってトラブルのもとになる場合がある。 さらに相手が悪いと、料金の曖昧な表現は相手に付け入る隙を与えることになる。

そのため 料金は一桁づついう ことが大事だ。

例えば500の場合、「ファイブ ゼロ ゼロ」。350の場合、「スリー ファイブ ゼロ」等だ。

相手に急かされようと、しっかり自分のペースを守り値段をしつこく確認しよう。

交渉で使える表現

実際に便利だった表現を幾つか紹介する。交渉の際は 毅然とした態度 でいることが重要だ。また 相手のペースにのらず 、変に笑顔で対応したり下手に仲良くしようとしたりせず、相手も商売なので 商売関係としてただ合意を履行しようという割り切った態度 が大事だろう。

日本人は相手の気にふれないように気を使いすぎてしまう傾向があるが、割り切って、しっかり 自分の利益を守る態度を示す ことが大事だ。

また普段怒る機会が少ない人は多いだろうが、しっかりと怒りを示すことも大事だ。

I get off here(ここで降りる)

タクシー等で変な場所に連れて行かれそうになった場合や、事前に言っていたことと違った場合には強くこのように主張しよう。

It's not my bussiness(俺には関係ない)

「俺は貧乏なんだ。金がないんだ」など言われた際には強く主張しよう。同情すれば付け入る隙をあたえてしまう。

just do (ただ ~ してくれ)

justは非常に便利だ。例えばタクシーにのり他の場所に連れて行くと言われた場合はしっかり怒りを示し、「You just go to the statino!」と言おう。

justを強く言うのが大事だ。

以上コツをいくつか紹介したが、大事なのはやはり態度だ。 相手に気を使いすぎず、下手に仲良くしようとしたり、いい顔をしようとせず、下手なことをしてきたり言ってきた場合ははっきり態度で示し、強く主張する必要がある場合はしっかり主張することが大事だ。

デング熱及び媒介蚊の生態について

インドに来て生活をしていくのに調べたことまとめ。※技術ブログ

はじめに重要なポイントだと思うのは以下。

  1. 長袖、長ズボン、靴下履いて蚊除けクリーム等でとにかく刺されることをさける。蚊除けは現地のものが効果が高い。
  2. 感染が疑われる場合は通常の解熱剤や風邪薬など使用せず「アセトアミノフェン」を使用する。
  3. 感染後の発症確率、また重症化確率は高くはないし死亡率もインフルエンザより低く、過剰に恐れる必要はない。

以下本文

デング熱について

感染経路

デング熱を疑う目安

発熱、かつ以下所見の2つ以上を認める場合

  1. 発疹
  2. 悪心、嘔吐
  3. 頭痛、関節痛、筋肉痛
  4. 血小板減少
  5. 白血球減少
  6. ターニケットテスト陽性*
  7. 重症化サイン

ターニケットテストとは

上腕に駆血帯(くけつたい)を巻き、5分間圧迫後に2.5cmx2.5cmあたり10以上の点状出血が診られた場合陽性

2 ~ 14日(通常3~7日)の潜伏期間後、2~4割の人が38~40℃の熱と共に発症。

症状について

突然の高熱で発症し、頭痛、眼(か)痛、顔面紅潮、結膜充血を伴い、発熱は2~7日間持続(二峰性であることが多い)。初期症状に続き、全身の筋肉痛、骨関節痛、全身倦怠感を呈する。発症後3~4日後、胸部、体幹から始まる発疹が出現し、四肢、顔面に広がる。症状は1週間程度で回復。

なお、ごくまれに一部の患者において、発熱2~7日後、血漿漏出に伴うショックと出血傾向を主な症状とする致死的病態が出現することがある。

特徴

  • 死に至る危険は少ない。
  • 3~5日で解熱し、解熱とともに発疹が現れる。発疹は治りかけたときに出現する。
  • デング熱を引き起こすウイルスは4種類。同じ型のウイルスに再び感染した場合は免疫により軽症で済むが、異なる型に感染すると免疫が過剰に働き重症化することがある。重症化したものはデング熱出血熱、デングショック症候群と呼ばれ、稀に死亡する。
  • 感染後の発症率: 20~50%, 内重症化確率: 数%, 内死亡確率: 数%。
  • インフルエンザより致死率がかなり低い。

治療について

  • 治療法は対処療法のみ。対処療法とは主要な症状の軽減のための治療を行い、自然治癒能力を高め、治癒を促進させる療法。
  • もし血漿漏出(けっしょうろうしゅつ)が起きた場合は輸液により循環血液量の現象を補うことが大事。生理食塩水以上のスペックのドリンクが必要になることもある。
  • 血小板が低下し、出血を起こしやすくなりとても危険なため、通常使用される風邪薬、鎮痛剤、解熱剤は控えるべき。
  • 風邪かどうか判別がつかない場合は上記薬は避け、デング熱に安全な薬を飲むべき。
  • 具体的な薬としては小児にも使用されるアセトアミノフェン(パラセタモール)が使用される。
  • 体内からウイルスが消失すると症状が消失する予後は比較的良好な感染症

予防について

  • ワクチンなどはなく、対処療法のみ。虫除けに徹することが1番の予防。
  • 長袖、長ズボン、靴下の着用が重要かつ効果的。

感染後について

  • さらなる感染拡大を防ぐため、デング熱に罹患した場合は蚊に刺されないようにすることが大事。

インド北部では8月末~11月頃に人口の密集した大都市を中心に流行

参考

媒介蚊について

ネッタイシマカについて

繁殖について

実験的には幼虫の発育が可能な最低温度は10℃付近。 人の生活に密接に関係した生態を持ち、人家の周辺で生活している。幼虫は"屋内外"の水を満たした状態でしばらく放置されるような人工容器に発生する。東南アジアの近代的都市のひとつであるシンガポールでも、徹底した媒介蚊対策にもかかわらず、いまだにネッタイシマカの根絶には成功しておらず、コンクリートジャングルのような無機的な環境でも生息できる。

生態について

昼間吸血性で吸血活動には日周リズムがあるが、日中であればほとんどいつでも吸血のために飛来し、薄明・薄暮あるいは昼により多く吸血に来る。 潜んで、人が近づくのを待ち伏せるタイプの蚊である。ヒトスジシマカに比べて、動作が素早く捕獲するのが難しい。 飛来した個体を何度追い払っても、しつこく吸血に来る。知らないうちに首筋や耳の後ろ、腕の後側など気がつきづらいところを吸血されている。

ヒトスジシマカについて

繁殖について

幼虫は屋内の容器には発生しないのが普通。

生態について

成虫は樹木の木陰や潅木、低木の茂みなど、いわゆる藪に潜んで吸血のチャンスを待つ、待ち伏せ型の行動を示す。ネッタイシマカとは異なってコンクリートジャングルのような無機的な環境には生活できない。林縁部、木立に囲まれた墓地や公園、樹木の植えられた庭などが典型的な吸血場所である。 昼間吸血性で吸血活動には日周リズムがあり、薄明と薄暮に吸血飛来数が多くなる2山型である。ただし、状況によっては夜間でも吸血に来ることがある。吸血のために屋内に侵入することもあるが、多くの場合、庭仕事や公園の散歩、ハイキングなどの野外活動中に吸血される。 成虫が吸血のために直射日光の当たる場所に出てくることはまれであるので、吸血を避けるには藪に近づかないのが一番である。 植物の葉の裏などで待ち伏せしている成虫が、人の接近を察知できる距離はおよそ4~5mと推定されている。

【Rails x Linux x RDS】日本時間に設定

dbに保存されたときにcreated_atが一生日本時間にならなかったときのイラツキが高じて環境周り総JST化した話。

LinuxJST

やることは以下

  • シンボリック貼り
ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
  • /etc/sysconfig/clockの変更
ZONE="Asia/Tokyo" 
UTC=false
  • dateコマンドで確認(出力結果例)
Thu Oct 26 18:23:12 JST 2017

RDSのJST

  • パラメータグループのtimezoneを「Asia/Tokyo」に変更

※変更に若干時間かかる

RailsJST

config/application.rbにて

config.time_zone = "Asia/Tokyo" 
config.active_record.default_timezone = :local

以上。

【Ruby x Linux】Gem kakasiのインストール方法

ec2(linux os)でkakasirubyで使えるようにするgem、kakasi_ffiインストールするときに結構詰まったのでその解決方法。

kakasiとは

漢字とかひらがな、それら混じったものとかを一括でカタカナ、ひらがな、ローマ字などに直してくれます。

以下公式サイト説明

kakasi公式サイト引用

KAKASI は、 漢字かなまじり文をひらがな文やローマ字文に変換することを目的として 作成したプログラムと辞書の総称です。

kakasi_ffiについて

A Ruby binding for KAKASI implemented with Fiddle/DL/FFI

問題点

local(Mac Siera)では公式サイトの手順に従えばすんなりいくが、Linux上で同じようにすると、kakasiのインストールはうまくいくが、gem kakasiのインストールがうまくいかない。

以下エラーログ。

Building native extensions.  This could take a while...
ERROR:  Error installing kakasi:
    ERROR: Failed to build gem native extension.

    current directory: /home/***/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/gems/kakasi-1.0.2/ext/kakasi-config
/home/***/.rbenv/versions/2.4.0/bin/ruby -r ./siteconf20170624-20059-1n6555o.rb extconf.rb
checking fiddle... yes
checking for kakasi... failed -- libkakasi is not found
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers.  Check the mkmf.log file for more details.  You may
need configuration options.

Provided configuration options:
    --with-opt-dir
    --without-opt-dir
    --with-opt-include
    --without-opt-include=${opt-dir}/include
    --with-opt-lib
    --without-opt-lib=${opt-dir}/lib
    --with-make-prog
    --without-make-prog
    --srcdir=.
    --curdir
    --ruby=/home/***/.rbenv/versions/2.4.0/bin/$(RUBY_BASE_NAME)
    --with-kakasi-dir
    --without-kakasi-dir
    --with-kakasi-include
    --without-kakasi-include=${kakasi-dir}/include
    --with-kakasi-lib
    --without-kakasi-lib=${kakasi-dir}/lib

extconf failed, exit code 1

libkakasi is not found ?(怒)

解決方法

問題は、/usr/local/libにパスが通っていなかったため。

kakasiはインストール後、/user/local/lib配下に入るが、パスが通っていないためアクセスできなかった。

以下のように解決した。

  1. vi /etc/ld.so.conf
  2. /usr/local/lib と追記
  3. ldconfigでライブラリキャッシュをクリア

ld.so.confについて

システム全体でライブラリパスを設定したい場合は、/etc/ld.so.confファイルにライブラリへのパスを追記します。

linux 共有ライブラリについて

【HTML/CSS】LINEのグループラインサムネイルの作り方【初心者向け】

LINEのグループの、複数アカウントの画像がランダム(?)に複合されたアイコンの作り方。かなりシンプルだが、発想が無いと意外と困るかもしれない。

完成イメージ

f:id:kentarohorie:20170624152725p:plain

サンプルコード

<div class="hoge_images">
  <img src="http://www.newsweekjapan.jp/stories/assets_c/2016/11/webw161109-trumpelect-thumb-720xauto.jpg">
  <img src="http://img.huffingtonpost.com/asset/crop_0_183_3156_1692,scalefit_630_noupscale/586fed3f1b00002c006e5f8c.jpeg?cache=pkmfo3u6l3">
  <img src="http://livedoor.blogimg.jp/ryokun_2525-ag/imgs/6/f/6fb8d7f4-s.jpg">
  <img src="https://nekogazou.com/wp-content/uploads/2013/01/55270573c8c1630b9b2901f4da9989c7.jpg">
</div>

<style type="text/css">
.hoge_images {
  width: 100px;
  height: 100px;
  border-radius: 50%;
  overflow: hidden;
}

img {
  width: 50px;
  height: 50px;
  float: left;
  border: 1px white solid;
  box-sizing: border-box;
}
</style>

</style

※画像引用

ドナルド・トランプが米既成政治に逆転勝利 | ワールド | 最新記事 | ニューズウィーク日本版 オフィシャルサイト

「プーチン大統領がサイバー攻撃指示」情報機関が報告書を公表、トランプ氏も認識

安倍晋三って歴代総理の中で一番良くないか? : おぷねら速報

猫の種類まるわかり猫図鑑! - 猫画像どっと 猫ブログ

解説

まず最初のゴールは画像を横並び、かつ上下2つずつに配置することになる。 以下の手順だ。

  1. 親タグのwidth, heightを同じ大きさで設定(後に円にするため)
  2. 親タグ内のimgを、親タグのwidth, hegithの1/2に設定し、floatさせる。

そして、少し発想がいるのが円にするところだが、

border-radius: 50%;

までは何の発想もいらないが、ここで

overflow: hidden;

とすることではみ出した分を見えなくし、円に見えるようにする。

overflowは子要素がfloatしてる場合に、親要素に高さを持たせる際などにも、非常に重宝するし、かなり多くの場面で使用するため、しっかり理解する必要があるだろう。 ここを参考にするといい。

【Linux】swap領域を作る方法

t2.microインスタンスを使用していて、メモリ不足でプロセスが死んでプロダクトが止まる、ということがあったので、スワップ領域の確保を行った際に調べたことまとめ。

swap領域とは?

コンピュータ・システムの動作中に,メイン・メモリー実メモリー)を使い切りそうになり,空き容量が不足した場合,実メモリーから使用中の内容の一部を取り出して退避するためのハード・ディスク上の領域です。

参考

実メモリ(一般にスペックを話す際に言ってる「メモリ」のこと。RAM)が不足した際に、仮想メモリ(swap領域をROMに作る)があると、そこに処理の一部を逃して、RAMを空けることができる。

反対に、仮想メモリがない状態で実メモリがいっぱいになると、Linuxごと動かなくなるのを避けるためにランダムにプロセスが強制終了されてしまう。

例えば僕の例でいうと、unicornプロセスがメモリを食い実メモリが圧迫されたことで、unicornプロセスが強制終了されてプロダクトが止まってしまったということがあった。

ただし、swap領域へのアクセスや処理速度は実メモリと比べてかなり遅く、頻繁にswap領域にアクセスしなければいけない状態はパフォーマンスがかなり悪くなるので、十分な実メモリを積んでいることが最も望ましい。

そのため、swap領域は「保険」のように使用すべきだ。

linuxでのswap領域の作り方

swap file作成

dd if=/dev/zero of=/swapfile bs=1M count=1024

パーミッション変更

chmod 600 /swapfile

作成したスワップファイルをSwap領域用にフォーマット

mkswap /swapfile

スワップファイルを有効化してSwap領域のサイズを増やす

swapon swapfile

swapを開放するには

swapoff swapfile

ちなみにswap領域が作られたかどうかはtop, freeコマンドなどで確認できる。