hoomin.kani

KANISAN WEB

インフラ・サーバーサイドを頑張るカニが学んだあれこれ。

結局、REPLって何なの?

f:id:hoominkani:20190623185058p:plain

当たり前のように言うけどさ

「さぁ〜て、REPL使ってサクッと動かしてみるか」

そんな言葉を耳にする機会がたまにありますが、そもそもREPLって何なのか、ちゃんと説明できるか、自分の胸に問いかけたことはありますか?

そもそもREPLってなんて読むのか分からない人もいると思います。かつての私です。

おまけにインタープリタと何が違うのか?なんて聞かれると、頭の中はもうパニック。

横文字に強いエンジニアになるべく、ここでサクッとおさらいしておこうと思います。

REPLとは、ループのことである

嘘、と思った人、嘘じゃないですよ。だってREPLのLはLoopのLですから。

REPL(リプル)とは、Read-Eval-Print Loop、つまり

入力・評価・出力のループ

のことを指します。

wikipediaによると

REPL (Read-Eval-Print Loop) とは、入力・評価・出力のループのこと。主にインタプリタ言語において、ユーザーとインタプリタが対話的にコードを実行する。

……だそうです。

実務では、対話型評価環境のことを指して使われることが多いですね。

インタープリタと何が違うのさ

まずはインタープリタの定義をwikiで調べると……

インタプリタ(英: interpreter)とは、プログラミング言語で書かれたソースコードないし中間表現を逐次解釈しながら実行(英語版)するプログラムのこと。「インタープリタ」「インタープリター」などと表記することもある。

この時点でREPLとは大きく違うことが分かりますね。

要するに、インタープリタ(プログラム)がRead-Eval-Print Loop(ループ)を行う、ということです。

さらにいうと、インタープリタが実行するのはREPLだけではありません。

例えば、pythonでファイルを実行する際によく見るこれは

python main.py

REPLではなく非対話型の実行です。

最後に

いかがだったでしょうか?

この知識を元に、明日から自信いっぱいにREPLを使っていきましょう!

Elixirのイミュータブルなデータ構造って?

f:id:hoominkani:20190530182301j:plain

イミュータブルとは?

あの言語はイミュータブルで、あっちはミュータブルで……という話をちらほら聞くことがありますが、そもそもイミュータブルとは何でしょうか?

直訳すると、

immutable = 不変の、変わらない

という意味になります。

プログラミングの世界では、オブジェクトが変更可能であることを「ミュータブルである」と定義し、それとは逆にオブジェクトへの破壊的変更が不可能である状態を「イミュータブルである」と定義しています。


Elixirにおけるイミュータブル

Elixirについて解説する多くのサイトでは

「Elixirはイミュータブルなデータ構造を持つ」

と述べられていますが、具体的にはどういうことなのでしょうか?

実際の例をみていきましょう。

まずは下記のコードをご覧ください。

iex(1)> i = 20
20
iex(2)> age = fn -> i end
#Function<20.128620087/0 in :erl_eval.expr/5>
iex(3)> age.()            # iは20とマッチしている
20
iex(4)> i = 30            # iに30を再束縛
30
iex(5)> i                 # iは30とマッチしている
30
iex(6)> age.()            #iは元の20を参照している
20

iが20とマッチした後、iに30が再代入されたかのように見えますが、Elixirの場合はそうではありません。

4行目で行われているのは、いわゆる再束縛(再バインド)と呼ばれ、イメージとしては「同じ名前で別の変数を作成している」処理になります。 ※ ちなみにErlangでは再束縛はできません。

そのおかげで、6行目で再び既存の関数を呼び出した際にはきちんと元の変数が参照されています。

このように、再束縛を行いながらも常に構造が保持されているため、Elixirのデータ構造はイミュータブルであると言えます。


再束縛を禁止したい場合

コードを書いていると、再束縛をするのではなく、単にパターンマッチを行いたい場合が出てくると思います。

そういった際はピン演算子を使い、以下のようにパターンマッチを行うことができます。

iex(1)> i = 1
1
iex(2)> ^i = 2
** (MatchError) no match of right hand side value: 2


最後に: Elixir的イミュータブルのメリット

イミュータブルであることにより破壊的変更を阻止することができるため、プログラムのバグを防ぎ、実装する際に「これの変数iって今どうなってるんだっけ?」といちいち確認する時間を大幅にカットすることができます。

しかし、イミュータブルであることによってPythonJavaScriptではできていたような処理ができなくなる、というのは一部エンジニアにとっては非常に不便と捉えられることもあるでしょう。

Elixirのイミュータブルでかつ再束縛可能なデータ構造は、その2つのメリットをうまく共存させたものだと言えそうです。

【解決】Dockerの時刻設定、/etc/localtime:/etc/localtime:ro でCannot start service XXX: Mounts denied:のエラー

f:id:hoominkani:20190429125632p:plain

docker-compose upでマウントエラー

現象

以下のような設定のdocker-compose.ymlを使い、docker-compose up -dを行ったところ

volumes:
      - /etc/localtime:/etc/localtime:ro

このようなエラーが出た。

ERROR: for XXX Cannot start service XXX: b'Mounts denied: \r\nThe path /etc/localtime\r\nis not shared from OS X and is not known to Docker.\r\nYou can configure shared paths from Docker -> Preferences... -> File Sharing.\r\nSee https://docs.docker.com/docker-for-mac/osxfs/#namespaces for more info.\r\n.'
ERROR: Encountered errors while bringing up the project.

解決方法

どうやらenvironmentのようでこのような設定をする必要があるそうだ。

environment:
      - TZ=`ls -la /etc/localtime | cut -d/ -f8-9`

これで無事に動いた。

Dockerのコンテナ、イメージ、ボリューム、ネットワーク、全部を削除するコマンド

Dockerのリソース、全部消したくなったら。

f:id:hoominkani:20190413120421j:plain

  • もう何が必要で何が不必要なのかも分からない。
  • このPCの不要なリソース全部消したい。

生きていると、こんなこともあると思います。

そんな時に大活躍するのがdocker pruneコマンドです。


便利コマンド集


とにかくDockerの何もかもを消したい時


docker system prune --volumes

これで全てがスッキリ消えてくれます。

もう既存リソースを使うことは決してない、と自信が持てるときだけ実行しましょう。


コンテナだけを消したい時


docker container prune

停止中(exited)のContainerが削除されます。


イメージだけを消したい時


docker image prune

現在Runningになっているコンテナに依存関係のないImageだけが削除されます。


ネットワークだけを消したい時


docker network prune

未使用のNetworkを全て削除します。


ボリューム以外(コンテナ、イメージ、ネットワーク)を全部消したい時


docker system prune

起動中でなく、かつ依存関係もないContainer, Image, Networkを削除します。

注意点

docker pruneコマンドを使う際はyes/noの確認が必要とはいえ、一度消すと顔が真っ青になるリソースもある可能性があります。

prune実行前には、必ずdocker lsやdocker psで既存リソースの確認を行うようにしましょう。

【解決】25歳エンジニアだけどぎっくり腰になった

f:id:hoominkani:20181218114025j:plain

ぎっくり腰になったきっかけ

ぎっくり腰は突然に

それは突然のことだった……。


🦀「へ……へ……」


🦀「ぶえーーーっくしょい!!」(壮大なくしゃみ)


🐧(またやってる……)


🦀「痛ぁああああああ!!!!」


🐧「 !?」

そう、ある朝くしゃみをしたら、今までに感じたことがない激痛が走った……。


立ち上がれない


🐧「 大丈夫??」


🦀「あのな」


🦀「もうな……」


🦀「痛すぎて立ち上がれな……いったァァァァ!!」


🐧「 ぎっくり腰じゃん」


もう完全にぎっくり腰だった。

しかもくしゃみでぎっくり腰って……おじいちゃんか!?


若くてもぎっくり腰になることはある


🦀「ウッウッ」


🦀「まだ25歳なのに……」


🦀「フィジカルには自信があったのに……😭」


🐧💻 カタカタ……


🐧「若くてもエンジニアみたいに長時間同じ姿勢をとる、運動不足みたいな状態が続くと、ぎっくり腰にないやすいらしいよ」


🦀「そうなの……」


確かにこの頃、昼休憩中もPCをカタカタしたりしていた。

通勤以外に運動していない。

思い当たるところしかない……。


普段の仕事

私のスペック

  • 25歳
  • 女性
  • フィジカルの強さには自信あり、運動はそこそこできる方で滅多に風邪をひかない

こんな人間でもある朝突然ぎっくり腰を発症することもあるので、油断ならない


お仕事

  • エンジニア
  • サーバーサイドやインフラなど
  • ほとんど1日中椅子に座っている
  • 姿勢には気をつけていたが、忙しくて席を立たないことも多い

通勤も電車でほとんど1日中座りっぱなし。

運動、本当に大事ですね……。


解決方法

ネットで色々検索してみた


🐧「なんか良さそうな動画あったよ(youtubeの画面)」


🦀「セカンドオピニオン! セカンドオピニオン!!」


🐧(この患者、手間がかかるな……)


🐧「分かった分かった」


🐧💻 カタカタ……


🐧「他にも動画あったけど、一番最初に教えたやつが圧倒的に評価高いよ」


🦀「1個目のやる!!」


リグイス体操

やってみたのは、「リグイス体操」というもの。

要は腕を立てながら、上半身と下半身を連動させて動かし、腰の筋肉を緩めるということらしい。

半信半疑ではあったが、とにかく痛みをどうにかしたくてやってみた。


めちゃくちゃ効果あり


🦀 ユラユラ……


🦀 ユラユラ……


🐧(なんだこの光景)


🦀 「おっ!!」


🐧「どうよ」


🦀 「すごい楽になった!」


体を動かすたびに「痛ァアアア!!」と絶叫していたのが、「オォウ……」くらいになった。

コツをつかむまでちょっと時間がかかったけど、しばらくユラユラしているだけでかなり楽に。

リグイス体操、侮れない。


まとめ

今回は体操のおかげで一時的に回復したが、根本的な原因である

  • 仕事柄、長時間椅子に座りっぱなし
  • 忙しくて席を立てないことも
  • PCを見るため、やや前かがみ
  • 慢性的な運動不足

という状態は改善できていない。

ひとまずは安静にしつつ「こまめに席を立つ」「視線を高く」「家で筋トレ」を実践していこうと思う。

ぎっくり腰の先輩がいたらアドバイスお願いします。