addictionwhite’s diary

考え中のことを整理と忘備録のために綴ります。ここに書かれている考えは翌日には変わる可能性があります

カリー化と部分適用の違い

以下の記事とtwitterで頂いたコメントから自分なりに整理 (自分が悩んでいるときコメント頂けるのとても助かります。ありがとうございます)

参考にした記事 weblike-curtaincall.ssl-lolipop.jp

頂いたコメント抜粋

カリー化が fun f(x: X, y: Y): Z を fun f(x: X): Y -> Z に変換することで、部分適用はこの前者または後者にXを適用することです🙆

val x: X = 何か val g: Y -> Z = f(x) // 部分適用

つまるところ、カリー化は「Xを適用する」という意味を持たない……みたいな!

-

例えばレキシカルクロージャを使えば部分適用は実現できるんじゃないですかね。boostのbindとかもカリー化はしてないけど部分適用していたような。 どっちかというとカリー化の方が実現は困難と思いますけどね。言語によっては実現できないので。

自分の理解

  • カリー化は部分適用可能な状態に関数を定義すること
  • カリー化を用いなくても部分適用自体はやろうと思えばできる(bindなどを使用して)

部分適用自体の恩恵はまだよく見えていない。 たとえば引数を全部用意しなくても部分的に適用して使えるようなオブジェクトを用意するときに適用すればいいのだろうか

ECS触った際の雑記

雑多メモ

 

・docker-composeでビルドしても、生成されるイメージはそれぞれDockerfile分生成される

・ECSはdocker-composeみたいなもの?(というかTaskDefinitionがそう?)

https://qiita.com/HiromuMasuda0228/items/2170032142ae1c33adcc

 

・ecs-cli使えばdocker-compose.yamlオーケストレーションをそのまま使える?

https://qiita.com/furu8ma/items/6a7bd4d85617ef55f2c6

https://qiita.com/toshihirock/items/824a86da51015350a051

(試したがエラーが出て休み中に進められなかった)

 

・ECRとDockerhub、すでにAWSで運用しているならECRのほうがいいか

https://tracpath.com/works/devops/docker_hub_and_amazon_ec2_container_registry/

 ・ただまだ仕組みがわかっていないがecs-cliでdocker-compose.yamlを利用できるならそれが一番楽そう

 

・ECSのクラスタ消せない(タイムアウトするときがある)

 ・クラスタ内のタスクをすべて停止する

 ・(VPC消すと消せるようになるケースがある?以前VPCが影響してクラスタ作れないケースがあったので何かしら影響している可能性がある。クラスタで使ってるインスタンスと関係している?)

・ECSクラスタ消して、同名で作ったあとに ecs-cli ls叩くともとのサービスが表示される(なぜ?)

AWSの問い合わせでどこまで聞いていいのか(聞けるのか)よくわからない

 ・「これ使ってないと思うのだけどなんで料金かかっているのか」の質問に微妙な回答が来たため

 ちょっと読んだほうがいいかも

 https://aws.amazon.com/jp/premiumsupport/faqs/

 

・ecs-cli もっとちゃんとドキュメント読みたい

https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/ECS_CLI_reference.html

 

・これさわってみたい

http://www.mpon.me/entry/2018/03/29/200000

 

この図わかりやすい

http://www.mpon.me/entry/2017/11/19/200000

シェルスクリプト備忘録


環境構築用のシェルスクリプトを組んだ際の備忘録。
実施した内容は基本的にgithubリポジトリやdockerコンテナの準備、設定ファイルのとりまわし。
どこかのサーバに何かをインストールする、みたいなものは行っていないので(それはすでにDockerで用意されている)冪等性を保つのが楽だった
(リポジトリやコンテナの破棄が楽なため)。

軽くハマったところは
sedコマンドの仕様(macの場合は-iオプションでバックアップをとらなくてはいけない)
curl叩く際にエラー。()でコマンドをくくらなければいけない
・Docekrの同期したディレクトリを削除してつくりなおしたら同期先のディレクトリがない的なエラーが出た
(一度docker落として立ち上げ直さないといけない)

 

その他

コマンドが成功したかを成果物(ディレクトリが存在しているかなど)で見ようとしていたが、
$?のステータスコード見れば済むことを忘れていた
(厳密にチェックしたい場合などでは二重に見てもいいかもしれない)
(ただバックで動いてプロセスチェックするような処理はループしてチェックみたいな処理が必要そう)

 

sedの区切り文字は/でなくてもよい(なんでもいいらしい。なので/を置換したいときなどは@など使えばいい(sedで覚えたことはvimでも使えるので嬉しい)

  

以下参考にした記事

--

Bashの便利な構文だがよく忘れてしまうものの備忘録
https://qiita.com/Ping/items/57fd75465dfada76e633
連結するには演算子などは必要なく、つなげれば良い。
ダブルクォーテーションマークで囲んだ文字列では、式が展開される5。


`curl -i`の出力結果(レスポンスヘッダ)をシェルスクリプトの変数に代入したい
https://teratail.com/questions/67052


bash】現在の日付時刻 がファイル名
https://qiita.com/moonsubaru/items/7e51446db8b570e21c65

bashコーディング規約
https://qiita.com/mashumashu/items/f5b5ff62fef8af0859c5
#!/bin/shは実行環境によって様々なシェルにシンボリックリンクになっているので、bashなら#!/bin/bashと明示しよう
インデントは半角スペース2つ

Googleの肩に乗ってShellコーディングしちゃおう
https://qiita.com/laqiiz/items/5f72ca668f1c58176644
小さいツールやスクリプト実行時のラップ程度にShellの利用を抑えること。
100行超えるとPythonとか他の言語を使おうこと。


MacLinuxでは、sedの動作が異なるので注意
https://it-ojisan.tokyo/mac-linux-sed/
Macsedのmanにも説明があるのですが、Macsedの場合は、-iオプションの後に、必ずバックアップ用の拡張子をつける必要があります。
そこで、下記のように-iオプションの後に拡張子をつけると、実行できます。


sedで指定行(特定の行)だけ置換する、指定行(特定の行)に文字列挿入する
https://qiita.com/nii_yan/items/c93ab315f78a069f988d

docker exec を使いこなす
https://unicorn.limited/jp/item/347
VPS仮想マシンと同様の使い方をしたい場合にコンテナログインは直感的ですが、コンテナ上のコマンドを実行するには単にdocker execに直接コマンドを指定するだけで足りるため、ログインしないオペレーションに慣れた方が良いでしょう。

bashでファイルやディレクトリの存在確認方法まとめ
https://qiita.com/nii_yan/items/73f4caacdc2ca6f45135


コマンドラインで文字色をつける? シェルスクリプトで文字色を変えて表示
https://shell-script.info/show-color-text/

何もしない組み込みコマンド ":" (コロン)の使い道
https://qiita.com/xtetsuji/items/381dc17241bda548045d


スクリプト中で実行しているコマンドを表示する
http://sig9.hatenablog.com/entry/2015/12/15/220312
#!/bin/sh -x
これを実行すると以下の結果になります。結果だけで無く、実行しているコマンドも表示されているのが分かります

 

ポケットがチケットでいっぱい

http://fukuchiharuki.me/wiki/index.php?%E3%82%B7%E3%82%A7%E3%83%AB/sed%E3%81%A7%E3%82%B9%E3%83%A9%E3%83%83%E3%82%B7%E3%83%A5%E3%82%92%E5%8F%96%E3%82%8A%E6%89%B1%E3%81%86

エスケープすることもできるが、別の文字で正規表現を書いてもいい。

sed -e "s%hoge/moge%foo/bar%g"

再ansible

ansible触ろうとvagrantを立ち上げようとしたらまた同じようなエラーが出た http://addictionwhite.hatenablog.com/entry/2018/08/05/191236

というかずいぶん前から出続けていて、合間に対応試みたのだけど全然直らないでいた。

結果いうとvagrantプラグイン全部消したらなおった。

エラーで検索してもあまりヒットせず、自分の以前書いた記事が上の方にくると嫌気がさす。
vagrantvirtualbox再インストールなど試行錯誤の結果エラー文言にpluginとか書いていたので思い至った
エラーはnfs_exportあたりばかり見ていてplugin云々はパスだったので無視していた

ひとまず上のエラーが消えたところで気を取り直し、
本を参考に最低限のplaybookを用意してvagrantにむけてレシピを叩いてみるのだけど以下のエラー(一部抜粋)

$ansible-playbook -i hosts site.yml 

fatal: [vagrant-machine]: UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh: Warning: Permanently added '[127.0.0.1]:2222' (RSA) to the list of known hosts.

.ssh/configや.ssh/known_hostsあたりをいじってみたけど、以下のように--ask-passのオプションを指定してパスワードを聞くようにすれば通るようになった

ansible-playbook -i hosts site.yml --ask-pass

でエラーが変わって以下のようになった

fatal: [vagrant-machine]: UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh:  省略 WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     

環境変数指定して解決

$export ANSIBLE_HOST_KEY_CHECKING=False

$ansible-playbook -i hosts site.yml --ask-pass
SSH password:

PLAY [playbook_tutorial] *******************************************************************************************************************************

TASK [Gathering Facts] *********************************************************************************************************************************
ok: [vagrant-machine]

PLAY RECAP *********************************************************************************************************************************************
vagrant-machine            : ok=1    changed=0    unreachable=0    failed=0

ansibleというか、ssh周りの知識が疎くてはまってしまった感。

ただこれに関しては.ansible.cfgファイルで明示していたと思うので効いていなかったように見える(配置場所が悪かった?)
なんかまた何かの拍子に壊れそうで怖いなと感じる。

参考

qiita.com

www.tanchallenge-glory40.com

qiita.com

MySQLのexplainメモ

MySQLのExplain叩くたび指標を忘れてしまうのでメモ。
ほとんど引用文です(一番下の参考参照)。まず自分の頭に定着させたいものを抜擢した感じです。

とりあえずexplainしたときに見る列

  • type
  • rows
  • extra

type:

ALL: フルテーブルスキャンされているので最高に遅い。
index: 一見するとインデックスが使われているような感じがする値だが、実はフルインデックススキャンされているということ。

rows:

行数が少ないほどいい

extra:

Using where: indexだけではwhereを解決できないことを示している
Using temporary: テンポラリーテーブルを作成することを示している。あまり良くない
Using filesort: レコードがクイックソートされていることを示す かなり良くない

もちろん後になればなるほど処理が重くなるので、出来るだけそのようなクエリはさけて1番目や2番目の実行計画になるようにすると良いわけである。
1番目や2番目の実行計画になるようにするには、次のような点に注意しなければいけない。
最も大切なことはWHERE句における検索条件とソートする対象のカラムを一つのテーブルに集中させることである。

表示されているとステキな値
Using index


他にも考慮すべきところ多々あると思うのですが、
少しずつ積み上げていこうと思います(毎度一気に詰め込もうとして結局全て流れてしまうので)

参考(引用元)

MySQLのexplainとかについてしらべたときのメモ
https://qiita.com/lastcat_/items/de7b530a94fbcf9ba646

explainした時の重要ポイント(実例つき)
http://www.24w.jp/blog/?p=250

漢(オトコ)のコンピュータ道
http://nippondanji.blogspot.com/2009/03/using-filesort.html

vimの使い方見直し

vimの復習
奇しくもvimconf当日(狙ったわけではない)

定期的に使い方は見直しているのだけど、繰り返さないと忘れたりして元の習慣に戻ってしまうので、
見直したいもの一旦整理

正規表現 

vim正規表現はややこしそうなので回避していたが、
vi使っているとき困ったので反省として(とはいっても自分はガッツリ正規表現する機会はあまりない。。)

# オプションの確認 (デフォルトはmagic)
:set magic?
/\(foo\|bar\)

# \v以降がvery magicとして扱われる (vary magicを使うとパターン検索が楽になる)
/\v(foo|bar)

nnoremap /  /\v

参考: Vimでパターン検索するなら知っておいたほうがいいこと
http://deris.hatenablog.jp/entry/2013/05/15/024932

ctrlSF

sublimeライクのgrep機能。

https://github.com/dyng/ctrlsf.vim

もともと入れていれていながら、以前試した際にあまり速度が出ずに使用を止めていたのだけど
最近試してみたらとても早い(gitに管理されているファイルを見ていたりする?マシンスペック?)
ので積極的に使っていきたい
(厳しかったら:ggrep 使おう)

特定の単語を数えたい( n:置換コマンドに置換させないオプション)

:%s/hoge//gn

参考 https://blog.kawa-xxx.jp/entry/20140511/1399818512

helpを積極的に読む

とはいっても用意されたhelpを闇雲に見るまでは今の所したくないので

参考: おすすめの :helpまとめ
http://cohama.hateblo.jp/entry/2013/07/28/235823

折りたたみ機能

自分はあまり使わないと思っていたけど
プラグインのhelpで使われているものあったので(開けなくて読めない)

za : 折りたたみの開閉

参考: vim標準機能の折りたたみを駆使して、.vimrcを整理しよう
https://qiita.com/jiro4989/items/12a41fb58cc42287092f

ブックマーク機能

以下のプラグインを使わせて頂いているのだけど
https://github.com/MattesGroeger/vim-bookmarks

ただ、このプラグインでマークしているのはよく使用しているファイル(たとえばconfigなど)で
作業中に一時的にマークしたい(たとえばサービス、モデルとかを往復するときなど)に使いづらかった
(一時的にマークしたいものと長期的にマークしたいものが混ざるので)。
のでvimのデフォルトのマークも併用して使用する(プラグインの方どうなっているかわからないけど挙動だけみるにかぶってなさそう)。
自分の用途的に基本的にグローバルでマークする形にしそう[A-Z]
かつ作業終わったら定期的に消していく

# mark一覧を表示する
:marks

# カーソル位置をmarkする
# m[a-zA-Z]

# マークを全消し
:delmarks!

参考 Vimのマーク機能、使い方まとめ
https://qiita.com/syui/items/442fd0905a1f2005c10e
TODO ここらへんいい感じにmap定義したい

map noremap

vimrcに定義しているのに説明できない(パクってきたものなので)のはよくないと思い
基本noremapでよさげ(プラグインで定義されたものはmap)

参考: 【図解Vim】mapとnoremap
https://cocopon.me/blog/2013/10/vim-map-noremap/

set nu 入れる

何かの記事を見て意図的に行数を表示していなかったのだけど以下の理由で設定変更
・helpがどれくらいあるか把握できる
・エラーの位置に飛びたい
・カウントするとき位置を把握できる(:%s/hoge//gn でそれぞれの位置の行数が把握できる。なんとなく把握しておきたい)

TODO (気が向いたときに調べる)

先読み後読み

http://d.hatena.ne.jp/unk_pizza/20140311/p1 https://qiita.com/mochizukikotaro/items/84f3ab2740b8efbe0dc6

クリップボード

たまに挙動で混乱する。どういうときに困るか忘れた。困ったときにまた確認 http://labs.timedia.co.jp/2014/09/learn-about-vim-in-the-workplace.html