より長続きするブログ

続けていきたい気持ち。

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

第4章 Elixirの基礎

Elixirの組み込みの型

値型
システム型
  • PIDとポート(port)

  • リファレンス(reference)

コレクション型
  • タプル(tuple)
  • リスト(list)
  • マップ(map)
  • バイナリ(binary)

 

 整数

10進法、16進法、8進法、2進法で書くことができる。

10進数はアンダースコア(_)を含むことができる。3桁で区切って可読性を上げたりできる。

整数には決まった最大値はない。その数に合った内部表現が使われる。

 

浮動小数点数

精度はIEEE754の倍精度。

 

アトム

ある何かのなまえを表現する定数で、コロン(:)から始める。

Rubyのシンボル的な感じかな。

 

範囲

start..endと書いて表す。

 

正規表現

~r{regexp} や ~r{regexp}opts のように書いて表す。

 

PIDとポート

PIDはローカル、あるいはリモートのプロセスへの参照。

ポートは読み書きするリソースへの参照。

 

リファレンス

make_ref関数で生成する。グローバルで一意。

 

タプル

順序を持ったコレクション。

波括弧{}で要素を囲う。

2〜4個の要素をもつが、それ以上になる場合はマップか構造体を使ったらいいらしい。

 

リスト

連結データ構造。で要素を囲う。

 

キーワードリスト

[name: "Dave", city: "Dallas", likes: "Programming"]

[{:name, "Dave"}, {:city, "Dallas"}, {:likes, "Programming"}]

 

関数呼び出しの最後がキーワードリストなら、を省略できる。

 

マップ

 キーとバリューのコレクション。

%{key => value, key => value}

キーはタプルやアトムでも良い。マップ内でキーの型はバラバラでもいい。

 

バイナリ

<<と>>で囲う

 

演算子

「a === b」とかできる。動的言語だ。

 

プログラミング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通りメモします。

続きを読む