より長続きするブログ

続けていきたい気持ち。

プログラミングElixir読書メモ 第3章

第3章 不変性

関数プログラミングでは、データは一度作られたら変更されない。

Elixirでも同様。

 

不変性の概要

Elixirでは[1, 2, 3]というリストを一度参照したら、もう一度変数を束縛し直すまで、いつも同じ値のリストを参照する。

リストの各要素に100を足したくなった場合は、新しい値を持つ、元のリストのコピーを生成する。

 

元のリストは変わらず残り、100を足すという動作は、元のリストへの参照を持った他のコードへ影響を与えない。

 

性能への影響

データを更新するごとにコピーを作っているので、非効率であることが想像される。

しかし実際は逆。

 

例えば、あるリストを元に新しいリストを生成するとき、下記のようなコードを書く。

list1 = [ 3, 2, 1 ]

list2 = [ 4 | list1 ] # [4, 3, 2, 1]となる

 

ほとんどの言語では、list2を構築するとき、4, 3, 2, 1が入っている新しいリストを作る。

Elixirでは、list1が変更されないことがわかっているので、先頭に4、末尾にlist1をもつリストを作るだけ。

 

ガーベージコレクション

Elixirでは、それぞれのプロセスが自分のヒープをもっている。

それぞれ個別のヒープは全てのデータをひとつのヒープで扱うよりずっとずっと小さいので、ガーベージコレクションが速く走る。ヒープがいっぱいになる前にプロセスが終了すれば、プロセスと共にヒープも破棄されるので、ガーベージコレクションは必要ない。

 

プログラミングElixir読書メモ 第2章

第2章 パターンマッチ

「あなたの考える代入は、私の考える代入ではない」

 Elixirにおける等号はマッチ演算子であって、いわゆる「代入」じゃない。

左辺と右辺が同じものであるという「表明」のようなもの。

 

マッチ演算子(=)

マッチ演算子によってパターンマッチを行い、マッチすれば表明が成功し、

マッチしなければ表明できずエラーになる。

 

同じ構造をもっていれば、= で結ぶとパターンマッチにより両辺を同じにできる。

 

変数に値がセットされたら、そのパターンマッチ中では変更不可能。

次のパターンマッチでは変更OK。例としては以下の様な感じ。

a = 1 # OK

1 = a # OK

2 = a # エラー

a = 2 # OK

 

アンダースコア(_)

アンダースコア(_)はパターンマッチの中のワイルドカード

変数として値を補足しなくていいなら、これを使うと良い。

[1, _, _] = [1, 2, 3] # OK

 

ピン演算子(^)

Elixirでは変数の束縛の期限が短くて、次のマッチのときには新しい値に束縛し直せる(Erlangではできないみたい)。

現在の変数の値でパターンマッチをしたい場合には、ピン演算子(^)を使う。

a = 1 # OK

a = 2 # OK

^a = 1 # エラー!

 

最初は、初回の変数の表明時にピン演算子を使って、変更不可にするのかと思ったけどそうではなかった。一度表明した変数に対してピン演算子を使って、以前の値を束縛する。

 

プログラミングElixir読書メモ 第1章

第1章 赤いカプセルをとれ

イントロダクションの章。

インストール方法

Ubuntu16.04LTSにインストールした。
Ubuntu 12.04 and 14.04 / Debian 7」の部分の通りにやれば問題なかった。
wget https://packages.erlang-solutions.com/erlang-solutions_1.0_all.deb && sudo dpkg -i erlang-solutions_1.0_all.deb
sudo apt update
sudo apt install esl-erlang elixir 
 

実行

iexの使用例が載っている。インストールが完了できているので、そのまま実行できた。
iexのヘルパー関数の解説。便利そう。
カスタマイズもできるみたいだけど、今のところは手を付けず。
 

コンパイルと実行

Elixirのコードファイルは拡張子の2種類ある。
コンパイルして実行するものは.ex, ソースレベルで解釈・実行するものは.exs。
具体的な使い分けとしては、アプリケーションコードは.exとし、テストコードは.exsを使うらしい。
(テストのコンパイル済みコードを置いておく必要はないため)
 
ここでHelloWorldするので、超簡単にコーディング環境を作った。
普段使っているAtomlanguage-elixirautocomplete-elixirをインストールした。
パッケージ検索すると、色々便利なのがありそうなので、探ると楽しそう。
 
サンプルのhelloworld.exsを作って、
elixirコマンドでも、iex内からでも実行できることを確認した。
 

Think Different(ly)

プログラミングについての考え方を変えるとのこと。
 

プログラミングElixir読書メモ

今日買いに行ってきた。
関数型言語は一種類くらい、何となく使えるレベルで理解しておきたいと思っていたものの、手を付けられないまま時間が経っていた。
そんなところに、今月Elixirの良書が翻訳されたと話題になっていたので、これに乗じて読んでみようと思った次第。

そして、Elixirは仕事ですぐに使えたりはしないと思うので、アウトプットとして読書メモだけでも書いておこうと決めて、これを書いている。

 

以下、章ごとのメモ (逐次更新できればいいな)

続きを読む

Tumblrで画像付きブログを投稿する方法

  • Tumblrテンプレート作ってます
  • その1 Photo投稿
  • その2 Text投稿
  • 2つの投稿方法、どちらを使えばいいの?
    • Photo投稿の特徴
    • Text投稿の特徴
  • 締め

Tumblrテンプレート作ってます

とあるご縁があり、WebデザインをTumblrテンプレートに
落とし込む作業を行っております。
画像+文章の、シンプルなブログスタイルです。

ところで、Tumblrは画像をText投稿からも入力できたりして、以外とややこしい。
ですので、自分が調べた、画像+文章をTumblrの投稿する方法について、
基本的な部分を2通りメモします。

続きを読む

PostgreSQLのconcat()関数についての備忘録

文字列結合をするときは、||演算子を使って行うのがSQL的ではあるが、
こいつはNullが入ると結果文字列もNullになってしまう。
その方がいい場合もあると思うが、大抵の場合はNullは空文字と見做して欲しい。
そういうときはconcat()を使うとそのように計らってくれる。

MySQLのときは両方とも結合結果はNullだったので、
どちらにせよcoalesce()でNull排除して使う必要があったはずだけど、
Postgreでは関数一つで対応されている。

ただし対応バージョンは9.1以降らしい(9.1からドキュメントに登場する)。
まあ4年前にリリースされたバージョンなのだから、使えることの方が多いでしょう。

以上、concat()使えない仕事をしながらの発見でした。

参考URL
PostgreSQL: Documentation: 9.1: String Functions and Operators

PostgreSQL: Documentation: 9.0: String Functions and Operators

MySQL :: MySQL 5.7 Reference Manual :: 12.5 String Functions

 

Tomcatの再起動についてのメモ

 Tomcatの起動/終了について検索すると、「Tomcatを起動してからApacheを起動すること」というような説明をしているサイトが出てくるけれど、それはかなり古い情報で順序は特に関係ないそうだ。公式サイトのFAQにもそのような記載があった。


At boot, is order of start up (Apache vs Tomcat) important?     
(マシン起動するときってさ、ApacheTomcatが立ち上がる順序が大事じゃん?)    
        
No. This way - either apache or tomcat can be restarted at any time independent of one another.
(いや、大事じゃないから。Apachetomcatもいつでもそれぞれ再起動できるだろ。)   

ずっと順序気にしまくってたのでショックだったというお話。

 

参考URL

tomcatの起動と停止

Tomcat5の自動起動について − Java Solution − @IT

FAQ/Connectors - Tomcat Wiki