blog.kotamiyake.me

為せば成る、為さねば成らぬ何事も

真偽値

Elixirではtrue とfalse という値が存在します。

iex(1)> true
true
iex(2)> false
false
iex(3)> true == true
true
iex(4)> true == false
false

また真偽値であることを判定するis_boolean 関数があります。

iex(5)> is_boolean(true)
true
iex(6)> is_boolean(false)
true
iex(7)> is_boolean("true")
false

Atom(Symbol)

AtomはRubyで言うところのSymbolと同じです。

また、こちらもAtomであることを判定するis_atom 関数があります。

iex(1)> :atom
:atom
iex(2)> is_atom(:atom)
true

実はtrue とfalse はAtomらしいです。

iex(3)> true == :true
true
iex(4)> is_atom(true)
true
iex(5)> is_atom(false)
true

 

数値

基本的な四則演算、2進数、8進数、16進数の表現はRubyと変わりなさそうです。

ひとつRubyと違うところが、割り算の結果。

Elixir

iex(1)> 10 / 2
5.0

Ruby

irb(main):001:0> 10 /2
=> 5

Elixirでは割り算の結果はfloatで返るようです。

ただdiv関数を使えばintegerで結果が返ってきます。

iex(2)> div(10, 2)
5

 

Ruby, JavaScript以外に何か新しい言語を勉強しようと思い立ち、以前から気になっていたElixirを触ってみることにました。

インストール

$ brew install elixir
$ elixir -v
Erlang/OTP 18 [erts-7.3] [source] [64-bit] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false] [dtrace]

Elixir 1.3.1

チュートリアル

$ iex
iex(1)> 40 + 2
42
iex(2)> "Hello" <> " World"
"Hello World"
$ vim simple.exs
IO.puts "Hello world from Elixir"
$ elixir simple.exs
Hello world from Elixir

vimでシンタックスハイライト

elixir-lang/vim-elixir: Vim configuration files for Elixir

感想

homebrewのおかげでインストールは楽ちんでした。

IO.putsのあたりがrubyに似てるなと感じました。

特定のバージョンをインストール

$ gem install rails -v 5.0.0.beta4

特定のバージョンでアプリを作成

$ rails _5.0.0.beta4_ new sample

 

定期的にこのブログのデータベースのバックアップを取ることにしたので、その時の手順をメモ代わりに投稿します。こちらで使用しているスクリプトは自己責任で使用してください。

環境

$ lsb_release -a
No LSB modules are available.
Distributor ID:	Ubuntu
Description:	Ubuntu 14.04.3 LTS
Release:	14.04
Codename:	trusty
$ mysql --version
mysql  Ver 14.14 Distrib 5.5.49, for debian-linux-gnu (x86_64) using readline 6.3

スクリプト

#!/bin/sh

umask 0077

USERNAME='username'
PASSWORD='password'

PERIOD=7
BACKUP_DIR='/var/www/mysql-backups'
DATABASE_NAME=database_name
DATE=`date +%Y%m%d`

mysqldump -u$USERNAME -p$PASSWORD $DATABASE_NAME | gzip > $BACKUP_DIR/$DATABASE_NAME-$DATE.sql.gz

OLD_DATE=`date --date "$PERIOD days ago" +%Y%m%d`
rm -f $BACKUP_DIR/$DATABASE_NAME-$OLD_DATE.sql.gz

解説

umask 0077 の部分で新規に作成されたファイルを他のユーザーが読み取れないようにしています。

PERIOD はバックアップの周期を指定しています。ここでは7日周期で古いバックアップを削除しています。

$ sudo chmod 700 backup.sh

スクリプト自体も他のユーザーから読み込めないようにしましょう。

cronの設定

0 3 * * * sh /var/www/mysql-backups/backup.sh

これで毎日AM 3:00にデータベースのバックアップが実行されるようになりました。

参考

広島に来て以来、何かWeb技術関連の勉強会はないかと探していたのですが、たまたまAngularJSハンズオン(初心者向け) in 広島というイベントを見つけたので参加してみました。

ちなみに私はrubyエンジニアで、主にはサーバーサイドの方をメインにコードを書いています。フロント側の方もコードを書くことはあるのですが、jQueryを使って書くことが殆どで、以前にBackbone.jsを触ったことがある程度です。

今日の課題は初心者向けということで、AngularJSの基本的な機能を使って、よくあるチュートリアル的な感じでTODOアプリを作るという比較的軽めの内容でした。

 

今日はPythonを使って簡易Webサーバーを立ち上げたのですが、rubyだと以下のようにしてワンライナーで書けるらしいです。

ruby -rwebrick -e 'WEBrick::HTTPServer.new(:DocumentRoot => "./", :Port => 8000).start'

ワンライナーWebサーバを集めてみた – Qiita

成果物

https://github.com/kmiyake/ng_model

感想

ハンズオン自体の内容は正直自分個人としては物足りない内容でしたが、元々初心者向けということだったので、イベントの趣旨から言うと妥当だったのかなと思います。

ただ途中で詳しくは調べてみてください、という説明があったのですが、初心者向けということであれば、どの辺りの情報を見るべきかということを紹介してあげると親切なのかなと思いました。

単純に検索しただけだと、情報が古かったり、内容が不適切なものもあったりするので。。。(自分も気をつけなければ。。。

今回のイベントではAngular Japan User Groupのメンバーの方が二人来られていて、AngularJSの今後の動きやJavascript自体の過去、現在、それから今後の流れなどについての話を聞けたのは面白かったです。

それ以外にもハンズオンの最中にTemplate stringsというJavascript自体に組み込まれた機能についても知ることができ、こういう知識の共有ができるところが勉強会の良い所なのかなと感じました。

最後に

参加者の方々に話を聞くと、やはりSIerっぽい?人が多かった印象。既にAngularJSを使って仕事をしているという人は、ほとんど見受けられなかったように思いました。

やはり東京と比べると地方はそういったトレンドの技術を使った仕事というのは少ないのかもしれません。

今後、こういった勉強会をキッカケにして広島でもWeb開発の動きが活発化していったらいいなと思いました。

給与などの機密性の高い情報を保存する際に、データを暗号化する必要があります。

そこでrailsで暗号化する方法について勉強しました。

そもそも暗号化にも2種類あり、一つは可逆暗号化、もう一つは不可逆暗号化です。

その名前が示す通り、可逆であれば暗号化、復号化ができますが、不可逆であれば復号化することができない(または難しい)暗号方式です。

今回は暗号化した給与を再度復号化して使用できる必要があるので、可逆暗号化を採用します。

Railsでデータを可逆暗号で保存する – Qiitaを参考に数値を暗号化してみました。

pry(main)> salery = 10000
=> 10000

pry(main)> secret = SecureRandom.hex(128)
=> "45a38d86c8fefd22fe45a699fc5067d5725fd76a62f62dec456e8163c68d34070960498b3389b991d154d3747e572ef334a5b4c621863719b6534fee0d1385c9057e24f72f6f16fa23669c514d90157ee61e600d3ed17c9d5243e500fecc97559a7719103a21fef52430391d3472a7fdb5d414c64d23e9c6585ba0faf40cc6d4"

pry(main)> encryptor = ::ActiveSupport::MessageEncryptor.new(secret)
=> #<ActiveSupport::MessageEncryptor:0x007fa51018f198
 @cipher="aes-256-cbc",
 @secret=
  "45a38d86c8fefd22fe45a699fc5067d5725fd76a62f62dec456e8163c68d34070960498b3389b991d154d3747e572ef334a5b4c621863719b6534fee0d1385c9057e24f72f6f16fa23669c514d90157ee61e600d3ed17c9d5243e500fecc97559a7719103a21fef52430391d3472a7fdb5d414c64d23e9c6585ba0faf40cc6d4",
 @serializer=Marshal,
 @sign_secret=nil,
 @verifier=
  #<ActiveSupport::MessageVerifier:0x007fa51018efe0
   @digest="SHA1",
   @secret=
    "45a38d86c8fefd22fe45a699fc5067d5725fd76a62f62dec456e8163c68d34070960498b3389b991d154d3747e572ef334a5b4c621863719b6534fee0d1385c9057e24f72f6f16fa23669c514d90157ee61e600d3ed17c9d5243e500fecc97559a7719103a21fef52430391d3472a7fdb5d414c64d23e9c6585ba0faf40cc6d4",
   @serializer=ActiveSupport::MessageEncryptor::NullSerializer>>

# 暗号化
pry(main)> encrypt_salery = encryptor.encrypt_and_sign(salery)
=> "VjluWVpTWDlyZGhjSG5Qa010R3pGdz09LS03WnFtaldELzJ0bmRDYXU0Y3Z2bTBBPT0=--7a581d06340ff60294a66f47db4bfaa75c480482"

# 復号化
pry(main)> encryptor.decrypt_and_verify(encrypt_salery)
=> 10000

無事暗号化できました。

 

 

VirtualBoxのインストール

https://www.virtualbox.org/wiki/Downloadsからダウンロード、インストールします。

Vagrantのインストール

http://www.vagrantup.com/downloadsからダウンロード、インストールします。

仮想マシンの作成

$ vagrant init --minimal ubuntu/trust64
$ vagrant up

rbenv、ruby-buildのインストール

$ vagrant ssh
$ sudo apt-get install git
$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
$ git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build

rubyのインストール

$ rbenv install 2.2.3
Downloading ruby-2.2.3.tar.gz...
-> https://dqw8nmjcqpjn7.cloudfront.net/df795f2f99860745a416092a4004b016ccf77e8b82dec956b120f18bdc71edce
Installing ruby-2.2.3...

BUILD FAILED (Ubuntu 14.04 using ruby-build 20151028-21-gd65e2d1)

Inspect or clean up the working tree at /tmp/ruby-build.20151205161434.4919
Results logged to /tmp/ruby-build.20151205161434.4919.log

Last 10 log lines:
The Ruby openssl extension was not compiled.
The Ruby readline extension was not compiled.
The Ruby zlib extension was not compiled.
ERROR: Ruby install aborted due to missing extensions
Try running `apt-get install -y libssl-dev libreadline-dev zlib1g-dev` to fetch missing dependencies.

Configure options used:
  --prefix=/home/vagrant/.rbenv/versions/2.2.3
  LDFLAGS=-L/home/vagrant/.rbenv/versions/2.2.3/lib 
  CPPFLAGS=-I/home/vagrant/.rbenv/versions/2.2.3/include

ライブラリが足りないということでインストールに失敗しました。

$ sudo apt-get install -y libssl-dev libreadline-dev zlib1g-dev
$ rbenv install 2.2.3
$ rbenv global 2.2.3
$ ruby -v
ruby 2.2.3p173 (2015-08-18 revision 51636) [x86_64-linux]

railsのインストール

$ gem install rails

これでvagrant上にRuby on Railsの開発環境ができました。

 

 

 

articleタグとsectionタグの違いがよく理解できていなかったので、自分で調べて学んだことをまとめてみました。

HTML5では文書のアウトラインを明確にすることが重要になります。なので闇雲にこれらのタグを使用するのではなく、文章の構造を意識してマークアップすることが大切です。

そこで新たに追加された要素がarticlesectionです。もちろんこの他にもいくつかのタグが追加されています。そちらの意味についてはまたの機会に。

W3Cの文書には以下のように書かれています。

article

article要素は、文書、ページ、アプリケーション、またはサイトの中で完全もしくは自己完結した構造を表す。

http://momdo.github.io/html5/sections.html#the-article-element

section

section要素は、文書またはアプリケーションの一般的セクションを表す。

http://momdo.github.io/html5/sections.html#the-section-element

つまり、articleはブログの一つの記事を、sectionは一つの記事の中の章や節のまとまりを表現するときに使用します。

またsectionの項では、

各sectionの主題は、section要素の子として見出し(h1-h6要素)を含むことによって一般に識別されるべきである。

と書かれており、section要素の中には見出しを持つべきだということのようです。

以下の記事がわかりやすいかと思いますので、適宜参照してください。

brew updateしようとしたら以下の様なエラーが発生しました。

$ brew update
error: unable to unlink old 'bin/brew' (Permission denied)
Error: Failure while executing: git pull --ff --no-rebase --quiet origin refs/heads/master:refs/remotes/origin/master

https://github.com/Homebrew/homebrew/issues/3247#issuecomment-548941 を参考にして権限を変更してから実行したら、またエラーが発生してしまいました。

$ brew update
...
...
...
Could not restore untracked files from stash
Error: Failure while executing: git stash pop --quiet

今度はbrew doctorしてみました。そこで出てた警告を解決してみます。

Warning: Xcode 7 lacks the 10.10 SDK which can cause some builds to fail.

We recommend installing the Command Line Tools with:

  xcode-select --install

to resolve this issue.

こちらを実行してみたら、なぜかxcodeのcommand line toolsがないからインストールしてくださいと言われたのでインストールしました。

それから再度brew updateしてみたら問題なく正常終了しました。

原因は何かの拍子にxcodeのcommand line toolsがアンインストールされてしまったことだったようです。