brew instal したときの /usr/local/share/man/manN is not writable っていうエラーの対応方法メモ
brew install
したときに/usr/local/share/man/man7 is not writable
っていうエラーがでてきたから、その対処法を書いておく
cd /usr/local/share/man sudo chown -R $USER man7 brew link --force xxxxxx
graphvizをインストールしたときの対応
$ brew install graphviz ... Error: The `brew link` step did not complete successfully The formula built, but is not symlinked into /usr/local Could not symlink share/man/man7/graphviz.7 /usr/local/share/man/man7 is not writable. You can try again using: brew link graphviz
言われたとおり、brew link graphviz
をしてみる
エラーが出た
$ brew link graphviz Linking /usr/local/Cellar/graphviz/2.40.1... Error: Could not symlink share/man/man7/graphviz.7 /usr/local/share/man/man7 is not writable.
シンボリックリンクが作れませんでしたってエラーらしい
man7の所有権を変更して、シンボリックリンクの作成
cd /usr/local/share/man sudo chown -R $USER man7 brew link --force graphviz
成功したっぽい!
Linking /usr/local/Cellar/graphviz/2.40.1... 108 symlinks created
参考文献
連想配列(alist) - Lisp
Lispには連想リストというものがある
連想リスト(association list)、また、alistと呼ばれる。carがキー、cdrが値となる。
carがキー、cdrが値って考え方スッキリしてて好き
> (defparameter *alist* '((hoge (1 2 3)) (fuga (4 5 6)) (piyo (7 8 9)))) *ALIST* > *alist* ((HOGE (1 2 3)) (FUGA (6 7 8)) (PIYO (9 1 2)))
要素の追加にはconsを使う
> *alist* ((HOGE (1 2 3)) (FUGA (4 5 6)) (PIYO (7 8 9))) > (cons (cons 'hogera '(10 11 12)) *alist*) ((HOGERA 10 11 12) (HOGE (1 2 3)) (FUGA (4 5 6)) (PIYO (7 8 9)))
先頭に追加のときはpush
を使うのが楽かも
> *alist* ((HOGE (1 2 3)) (FUGA (4 5 6)) (PIYO (7 8 9))) > (push '(foo (a b c)) *alist*) ((FOO (A B C)) (HOGE (1 2 3)) (FUGA (4 5 6)) (PIYO (7 8 9)))
キーを指定して値を取得
assoc
関数を使うことで指定したキーに一致するリストが取得できる
> (assoc 'hoge *alist*) (HOGE (1 2 3))
値のみ取得したい場合
> (cadr (assoc 'hoge *alist*)) (1 2 3)
assocとpushで値を更新したように見せかける
assocは見つかった最初の要素を返すため、pushすると(最初の要素に追加)、値を更新したことと同じになる。最初、何言ってるのかわかんなくて全然理解できなかった。
> (defparameter *fruits* '((apple (100 red)) (banana (150 yellow)) (peach (300 pink)))) *FRUITS* > *fruits* ((APPLE (100 RED)) (BANANA (150 YELLOW)) (PEACH (300 PINK))) > (assoc 'peach *fruits*) (PEACH (300 PINK)) ;;; 最初の要素に追加 > (push '(peach (500 pink)) *fruits*) ((PEACH (500 PINK)) (APPLE (100 RED)) (BANANA (150 YELLOW)) (PEACH (300 PINK))) ;;; あたかも更新されてるみたいになる! > (assoc 'peach *fruits*) (PEACH (500 PINK))
更新されてるみたいになる。理解できた気がする!!
Land of Lispの説明文を引用
assocコマンドは常に、見つかった最初のエントリを返す。したがってpushコマンドを使うと、assocにとってはそのオブジェクトに対する場所が更新されたのと同じ効果を持つわけだ。pushとassocを使って、以前の値を残したまま、alistの値が変更されたかのように見せることができる。
参考文献
- 作者: M.D. ConradBarski,Conrad Barski,川合史朗
- 出版社/メーカー: オライリージャパン
- 発売日: 2013/02/23
- メディア: 大型本
- 購入: 1人 クリック: 18回
- この商品を含むブログ (19件) を見る
四則演算 - Lisp
コンスセルとconsとcarとcdr
Lispはすべてリストでできている。また、リストとリストを繋ぐ役目にコンスセルというものがある。これはすごい面白い考え方だと思った
コンスセルは2つの部屋(セル)でできている。1つ目のセル(CARと呼ばれる)にはデータなどを指し、2つ目のセル(CDRと呼ばれる)には別のコンスセルやnil
というリストの終わりを示す特別なシンボルを指すことができる。
また、データそのものが入るわけではなく、データの参照を指し示すようになっている。ポインタみたいな?
Lispではコンスセルの連なりとリストは全く同じものとして扱われる。
コンスセルについてはAbout Cons Cellsがわかりやすかった
Lispのプログラムからコンスセルを扱うにはcons
関数を使う。ほかにもcar
とcdr
がある。
cons関数
> (cons 1 2) (1 . 2)
これは、1と2をコンスセルで繋いでいますよっていうこと。リストと区別するために、.
が入っている
> (cons 1 'nil) (1)
第2引数にリストの終りを示す'nil
を渡すと、通常のリストのような表示になる。(1 . 'nil)
と同じ意味。Lispはできるだけ、コンスセルではなくリストとして見せてくれている!
> (cons 1 ()) (1)
Common Lispでは、空のリスト()
とシンボル'nil
は同じ意味となっている。そのためこのようにも書ける。
「空のリストに1を追加したら、1だけのリストになる」と考えればしっくりきた。
どんなリストもコンスセルで表せる!
> '(1 2 3) (1 2 3) > (cons 1 (cons 2 (cons 3 'nil))) (1 2 3) > (cons 1 (cons 2 (cons 3 ()))) (1 2 3)
car関数とcdr関数
コンスセルを扱うための関数であるcar(カー)とcdr(クダー)。それぞれ、コンスセルの部屋の構造と一致している。
car
で1つ目のコンスセルのCARセル。cdr
で1つ目のコンスセルに紐づくデータが取得できる。
> (car '(dog cat chicken)) DOG > (cdr '(dog cat chicken)) (CAT CHICKEN) > (cdr (cons 'b 'nil)) NIL
組み合わせることで取得したい場所を取得できる。ちょっと複雑になるけど。。。
例)2番目の要素を取得する
> (car (cdr '(dog cat chicken))) CAT
cdr
で2番目以降の要素を取得し、それに対してcar
で1番目の要素(2番目)を取得する
一度に取得できる関数も用意されている
> (cadr '(dog cat chicken)) CAT > (cadr '(dog cat chicken)) CAT > (cddr '(dog cat chicken)) (CHICKEN) > (caddr '(dog cat chicken)) CHICKEN > (cdddr '(dog cat chicken)) NIL
各順番のとおりにa
かd
を書けばいいのかも。(car (cdr '(...)))
だから、(cadr '(...))
みたいに。
最後のコンスセルにはnilが入っていることを忘れずに!!!
cdadadr
をやろうとしたら、そんなの無いよ!!!っていわれた。最大4つまでらしい。
> (cdadadr '((peas carrots tomatoes) (pork beef chicken))) *** - EVAL: undefined function CDADADR
list関数
list関数を使うと簡単にリストが作れる。
以下の3つは同じ意味!!
> (list 'dog 'cat 'chicken) (DOG CAT CHICKEN) > '(dog cat chicken) (DOG CAT CHICKEN) > (cons 'dog (cons 'cat (cons 'chicken ()))) (DOG CAT CHICKEN)
nilを含まないデータでcdrを使うと
なんかおもしろいと思った。
> (cons 'a (cons 'b 'c)) (A B . C) > (cdr (cons 'a (cons 'b 'c))) (B . C) > (cddr (cons 'a (cons 'b 'c))) C
.
は要素なのかな!?って思ってみたけど、そんなことはなかった。。。
listとクオートの快適さを実感した
複雑なリストを作るときにちょっと手こずった。
> (cons (cons 'peas (cons 'carrots (cons 'tomatoes ()))) (cons 'pork (cons 'beef (cons 'chicken ())))) ((PEAS CARROTS TOMATOES) PORK BEEF CHICKEN)
((PEAS CARROTS TOMATOES) (PORK BEEF CHICKEN))
ってなってほしい!!
> (cons (cons 'peas (cons 'carrots (cons 'tomatoes ()))) (cons (cons 'pork (cons 'beef (cons 'chicken ()))) ())) ((PEAS CARROTS TOMATOES) (PORK BEEF CHICKEN))
できたけど、ややこしいよ!!!!!!
これをやったあとにlist
やクオートを使うとなんと楽なことか
> (list (list 'peas 'carrots 'tomatoes) (list 'pork 'beef 'chicken)) ((PEAS CARROTS TOMATOES) (PORK BEEF CHICKEN)) > '((peas carrots tomatoes) (pork beef chicken)) ((PEAS CARROTS TOMATOES) (PORK BEEF CHICKEN))
あぁ、楽すぎる...まじでやばい
Lispを始める
Lispになぜか興味を持ってしまい、本まで買ってしまった。
Lispの魅力は
たぶん、もっとあった気がする
Lispの種類
ANSI Common LispとSchemeというのが有名らしい。最近見たのはClojureっていう言語も有名かも?
clispをインストールする
clispというCommon Lispで書かれたコンパイラを使って、書いていく
CLISP - an ANSI Common Lisp Implementation
brew install clisp
clisp --version
さぁ!Lispをはじめるぞ!!
roswellっていうのもあるらしいけど、とりあえず、最初はclispでやってみる。基礎がわかってきたらroswellでやってみよう。
インストール完了時に出てきた文字がちょっと気になった
==> clisp Emacs Lisp files have been installed to: /usr/local/share/emacs/site-lisp/clisp
Emacs!?なんですと!?emacs
とコマンドを打ってみたら、Emacsが起動した。終了の仕方わからなくておどおどしてた。C-x C-c
で終了できた
参考文献
gzipモジュールを使った圧縮と展開 - Python
vcrpyでは、レスポンスの量が多い場合、圧縮されて(バイナリになって)カセットに格納される。どうやって圧縮されたデータを扱うのか調べてみたら標準モジュールのgzipモジュールでできそうだったため、メモしておく
圧縮にはgzip.compress()
メソッド。展開にはgzip.decompress()
メソッド。それぞれ、バイト配列を扱う。
文字列を圧縮して、展開して、取得してみた
>>> import gzip >>> t_bytes = bytes('あいう123abc', 'utf-8') >>> t_bytes b'\xe3\x81\x82\xe3\x81\x84\xe3\x81\x86123abc' >>> compressed_bytes = gzip.compress(t_bytes) # 圧縮 >>> compressed_bytes b'\x1f\x8b\x08\x00G::[\x02\xff{\xdc\xd8\xf4\xb8\xb1\xe5qc\x9b\xa1\x91qbR2\x00\xe1\xc7\x079\x0f\x00\x00\x00' >>> decompressed_bytes = gzip.decompress(compressed_bytes) # 展開 >>> decompressed_bytes b'\xe3\x81\x82\xe3\x81\x84\xe3\x81\x86123abc' >>> decompressed_bytes.decode('utf-8') 'あいう123abc'
gzip.compress()
にはバイト配列(bytes)を渡さないといけないため、bytes(str, 'utf-8')
でバイト配列を作成する
gzip.compress()
に作成したバイト配列を渡して、圧縮する。
展開にはgzip.decompress()
を使う。圧縮されているバイト配列を渡すことで、展開してくれる
展開したバイト配列をbytes.decode()
で文字列に変換し、終了
これで、一応、圧縮と展開ができるようになった
参考文献
mypyとjedi-vimで補完を強くする - Vim
Pythonで型アノテーションを使いたくなって、どうせならVimでも補完できるようにしたいと思って、やってみた
Python3が有効になっているか確認
まずはVimでPython3が有効になっているか確認する
もし有効になっていない場合、ここを参考にして、有効にする
$ pip3 install -U flake8 mypy-lang jedi
neomakeを入れる
非同期で型、スタイルチェックを行うにはneomakeを使う
neomake/neomake: Asynchronous linting and make framework for Neovim/Vim
call dein#add('neomake/neomake') ... let g:neomake_python_enabled_makers = ['python', 'flake8', 'mypy'] autocmd FileType python setlocal omnifunc=jedi#completions if !exists('g:neocomplete#force_omni_input_patterns') let g:neocomplete#force_omni_input_patterns = {} endif let g:neocomplete#force_omni_input_patterns.python = '\%([^. \t]\.\|^\s*@\|^\s*from\s.\+import \|^\s*from \|^\s*import \)\w*'
syntasticを入れる
なんとなくsyntasticも入れた
vim-syntastic/syntastic: Syntax checking hacks for vim
call dein#add('scrooloose/syntastic') ... let g:syntastic_check_on_open = 1 let g:syntastic_python_checkers = ['flake8', 'pep257', 'mypy'] let g:syntastic_python_flake8_args = '--max-line-length=120'
入れるときにエラーとかのメモ
以下の記述を書かないとエラーになった
if !exists('g:neocomplete#force_omni_input_patterns') let g:neocomplete#force_omni_input_patterns = {} endif
こんなエラー
E121: Undefined variable: g:neocomplete#force_omni_input_patterns
あと、無効にしていたから、動作しなくて焦った
let g:jedi#completions_enabled = 0
jedi#completetions_enabled
は、jedi-vimの補完を有効にするかどうかってことらしい。deoplete-jediを使うときにはこれを無効(0)にするらしい