堀犬

商売 x エンジニアリングを武器に食いたいやつのブログ

【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コマンドなどで確認できる。

【Ruby】includeとextendの違いについて

はじめに

railsでmoduleを使用する際に出て来るincludeとかextend 何が違うねんってのを調べたときの調査結果。

結論

結論1

includeでモジュールを取り込むとモジュール内に定義したメソッドはインスタンスメソッドになり、 extendでモジュールを取り込むとモジュール内に定義したメソッドはクラスメソッドになる。

結論2

module内でselfを使用したときに、includeの場合、インスタンスを指し、extendの場合はクラスを指す。

検証

以下、実際の検証コードと結果。

検証1

module Hoge
  def puts_hoge
    puts "hoge"
  end
end

class Piyo
  include Hoge
end

piyo = Piyo.new
piyo.puts_hoge
# => hoge
Piyo.puts_hoge
# => hoge.rb:12:in `<main>': undefined method `puts_hoge' for Piyo:Class (NoMethodError)

module Hoge
  def puts_hoge
    puts "hoge"
  end
end

class Piyo
  extend Hoge
end

piyo = Piyo.new
piyo.puts_hoge
# => hoge.rb:12:in `<main>': undefined method `puts_hoge' for #<Piyo:0x007fb8f90272b8> (NoMethodError)
Piyo.puts_hoge
# => hoge

検証2

module Hoge
  def puts_self
    puts self
  end
end

class Piyo
  include Hoge
end

piyo = Piyo.new
piyo.puts_self
# => #<Piyo:0x007faf030275d8>

module Hoge
  def puts_self
    puts self
  end
end

class Piyo
  extend Hoge
end

Piyo.puts_self
# => Piyo