MacBook Pro 2018 へ移行後、VirtualBoxでvagrant up できなかった話
MacBook Pro 2018 へ移行した際に、vagrant upができなかったが、アプリ再インストールして解決することができた。
vagrant up したときのエラーメッセージがこちら。
CLIからパッケージの参照先を調べてみたところまるっとデータがなくなっていたため
アプリを再インストールすることにした。
Downloads – Oracle VM VirtualBox
公式サイトから、OS X用をダウンロード。
により、セキュリティレベルがあがったためインストールしたアプリを
システム環境設定 > セキュリティとプライバシー
右下の鍵マークをアンロックしパスワード入力後許可をクリック。
一旦、既存のVirtualBoxを削除したいため
ダウンロードしたVirtualBoxから、VirtualBox_Uninstall.tool を起動。
プロセスが完了したメッセージを確認後、VirtualBox.pkg を起動、インストール。
無事にvagrant up することができた。
editorconfig の設定をしているのに、ctpファイルでスペースタブが統一されなくて、設定方法を見直した
PhpStorm でeditorConfigをつかってて、設定しているのにタブやスペースが混ざっていたので、設定を見直したら、Editor -> Code Style で、
「Enable EditorConfig support」にチェックをいれると有効になったというmemo。
第30回シェル芸勉強会:福岡サテライト レポート
シェル芸 ver.30 勉強会Report
第30回危念シェル芸 5周年おめでとうございます。久しぶり参加しました。 総じて楽しかったです。内容は午前の部と午後の部と2部構成でした。
午前の部
- やりたい文字列と正規表現があって、その間を記号で繋げる
- 正規表現自身に、SLASHが入るときは、Bracketを使うと見やすい
- 変数展開でさまざまな文字列を指定文字列に変換できる* RubyはPerlのを参考にして作られた言語
- iをつけると、大文字小文字を区別しない
- s/ / /s シングルラインモード
- コンテキストの概念が重要(スカラーコンテキスト or リストコンテキスト)
- ^もキャレットアンカー、$もドルアンカーっていう言い方をするらしい
- クラシックなPerl文字class
- クラシック文字クラスは大文字にすると否定
- echo 1 2 3 4 5 | perl -pe ’s/\d+/sin($&)/eg' eg でperlとして実行できる
- Unicode属性 InとIsがある
- アンカー 単語境界
- クロイスタ パターンを無効化
- ルックアラウンドアサーション 先読みと後読みで達人の領域らしい
Perlの正規表現第2回めでしたが、スライド進む度だんだん難易度が上がってる気がしてて 難しく感じたのもありましたが、スライドとターミナルと交互に実行結果などで 説明頂きました。Youtureに残していただいてるのであとから見直すことも出来ありがたかったです。
午後の部
- 案件ネタ(html、ネットワーク)
- パズル(脳みそに電極)
Q1
$ tree posts posts ├── 20170806_check_of_webhook │ └── main.md ├── 20170810_negi │ ├── green_negi.jpg │ ├── main.md │ ├── white_negi.jpg │ └── ねぎ.pdf ├── 20170810_negistagram │ └── main.md ├── 20170812_work ├── 20170812_working │ └── main.md ├── 20170814_layout │ └── main.md ├── 20170818_bash │ └── main.md ├── 20170820_bootstrap │ └── main.md ├── 20170820_injection │ └── main.md └── template └── main.md
- この中の、各main.mdは次のようなヘッダ付きのマークダウンです。
$ cat posts/20170818_bash/main.md --- Keywords: 嫌がらせ Copyright: (C) 2017 Ryuichi Ueda --- # 検索機能への嫌がらせ Keywords: ワッショイ Keywords: ワッショイ Keywords: ワッショイ
- これらのファイルから、次のような出力を作ってください。なお、Keywordsの行は各ファイルで最初にある行しか抽出しないこととします。
20170806_check_of_webhook Keywords: Webhook 20170810_negi Keywords: ネギ 20170810_negistagram Keywords: Twitter, Instagram, ネギ 20170812_working Keywords: 働けども働けども, bashcms2 20170814_layout Keywords: table, 雑 20170818_bash Keywords: 嫌がらせ 20170820_bootstrap Keywords: Bootstrap 20170820_injection Keywords: injection template Keywords:
$ ggrep -nr ‘Keyword’ ./ | ggrep ‘/main.md:2:’ | gsed ’s;./posts/;;‘ | gsed ’s;/main.md:2:; ;’
2行目がコメントだったので、grep -n オプションを使用 grep -m 1 で1行表示することもできるということを知った。grep 奥が深いなと感じました。
Q2
- 次のHTMLファイルurl.htmlについて、リンクが相対パスになっているものについては頭に/files/をつけて、/から始まっているものとhttpやhttpsから始まっているものはそのままにしてください。できる人は変なところに改行があるものなどに対応できるように、なるべく一般解に近づけましょう。
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> </head> <body> <ul> <li><a href="./hoge.html">ほげ</a></li> <li><img src="ayasii.jpg" alt="怪しい" /></li> <li><a href="https://blog.ueda.tech/">クソブログ</a><a href="huge.html">ふげ</a></li> <li><a href="/root.jpg"></a>これはそのまま</li> <li><a href="http://www.usptomo.com/">更新してない</a></li> </ul> </body> </html>
$ cat url.html | sed -r ’s;(img src=“|a href=”);&/files/;g' | sed -r ’s;(href=“|src=”)/files//;\1/;‘ | sed -r ’s;(href=“|src=”)/files/(https://|http://);\1\2;g’ | sed ’s;/./;/;g'
sed で頑張って変える感じでした。sed -r のバックスラッシュが省略がしらなかった sedの使い方がスマートでした。
Q2 できたけど、文字数制限のかべが。。。 #シェル芸 #福岡
— wataru kashii (@kecy_) 2017年8月26日
Q3
次のファイルについて、
$ cat list * 妬み * 嫉み * 僻み
次のようにHTMLにして、頭にHTTPヘッダをつけてください。インデントは不要ですがタグは1行1個でお願いします。
Content-Type: text/html <!DOCTYPE html> <html> <head> <meta charset="utf-8"> </head> <body> <ul> <li>妬み</li> <li>嫉み</li> <li>僻み</li> </ul> </body> </html>
すぐできて退屈な人は、インターネット上のサーバでこのHTMLファイルを送信するサーバをワンライナーで立ててください。
$ pandoc list -t html5 -s | sed ‘5,12d’ | sed ‘1iContent-Type: text/html\n’
知らなかった、「pandoc」コマンド。めちゃくちゃいい。 今までhtml5はテンプレートを予めsnippetとかで作ってたので、今後はそんな手間もなくなりそう。 その他にも色んな種類があるので、使い分けていきたい。
htmlファイルを送信するサーバをワンライナーで立てるということで、nc コマンドを教わった。 オプションが充実しててスゴイ役立ちそうな印象。
Q4
&&や;でコマンドを繋いだワンライナーで、GitHubにリポジトリを作ってそこにテキストファイルを一つ置いてください。
mkdir hoge && cd hoge && git init && echo aho > aho.txt && git add -A && git commit -m “aho” && hub create ryuichiueda/hoge && git push origin master
&& でワンライナーで別々のコマンド叩けるんだなぁという印象。hubコマンド便利
Q5
次のファイルの1行目の複素数と2行目の複素数をかけ算してください。
$ cat complex 1 + 4*i 3 - 2*i
$ cat complex | sed ’s/^/(/‘ | sed ’s/$/)/’ | sed ‘2,$i*’ | xargs | tr -d ‘ ’ | xargs -I@ perl -e ‘{use Math::Complex;print(@);print “\n”}’ 11+10i
TwitterのTLでは、いろんなのをくぐらせて答えを出していて、用途は様々だなと見てて楽しかったです。
cat complex | awk ‘BEGIN{FS=“ ”}/1/{a=$1;b=$2 $3};/2/{c=$1;d=$2 $3};END{r=ac-bd;i=ad+bc;print r (i<0?“-”:“+”) i “i” }’
Q6
フィボナッチ数列で、6765の4つ前の数を出力してください。
$ echo a | awk ‘BEGIN{a=1;b=1}{while(1){print a;c=b;b+=a;a=c}}’ | grep -m 1 -B4 6765 | head -n 1 987
Q7
次の数字の列について、00, 01, 02,…,99の数字2つ並びのうち、含まれないものを抽出してください。できる人はループを使わないで抽出してください。
$ seq -w 0 99 | while read n ; do grep -q $n nums || echo $n ; done
Q8
次のアルファベットの区間のうち、間に含まれるアルファベットが一番多いものはどれでしょうか。出力は何行目に書いてある区間かを数字で出せば良いこととします。
$ cat alphabet a-g e-q z-v r-y
$ cat alphabet | awk ‘{a=$1;gsub(/-/,“..”,a);print “echo”,$1,“{"a”}“}’ | bash | awk ‘{print $1,NF}’ | sort -k2,2n | tail -n 1 | awk ‘{print $1}’
午後の部おわって
福岡では、コマンドを使ってて出た疑問について質問しました。
コマンドの文字列長に制限があるから、大量のファイルを処理するときにどう扱えばいいのか?
OSのヘッダーファイルにかかれていて、設定がある
問題点
- 処理できる長さ制限
解決策
- xargs を使うと、kernelができるところまでやって、オーバーしそうになったら次に行くように進める
xargs で問題なるところ
- 時刻別で並び替えたいときの問題
xargs のオプションでなれておくこと
-I@ で指定の場所に標準入力の出力結果を@ でおくことができる
-P background処理
-n 1 ひとつずつ実行(コマンドによって、単一ファイル前提)
以下のテクニックは知っておいてすごく便利だなと使って思ったので、使いこなしたいなと思いました。また機会があれば参加したいです。 ありがとうございました。
pandoc cat - <(seq 1 10) nc
コマンドラインで作成したファイルを実行する
※Laravel 5.3 で検証しております。バージョンによって書き方が異なる場合がありますので、確認が必要がと思われます。
$ php artisan --version
Laravel Framework version 5.3.31
ターミナルで、まとまった処理を実行するときにコマンドがあると便利ですね。
作成するのにartisan コマンドを使用します。
php artisan だけで実行すると、コマンドの説明が表示されます。
make に関するコマンドはこれだけあります。
make:auth Scaffold basic login and registration views and routes
make:bindings Add repository bindings to service provider.
make:command Create a new Artisan command
make:controller Create a new controller class
make:criteria Create a new criteria.
make:entity Create a new entity.
make:event Create a new event class
make:job Create a new job class
make:listener Create a new event listener class
make:mail Create a new email class
make:middleware Create a new middleware class
make:migration Create a new migration file
make:model Create a new Eloquent model class
make:notification Create a new notification class
make:policy Create a new policy class
make:presenter Create a new presenter.
make:provider Create a new service provider class
make:repository Create a new repository.
make:request Create a new form request class
make:resource Create a new RESTfull controller.
make:seeder Create a new seeder class
make:test Create a new test class
make:transformer Create a new transformer.
make:validator Create a new validator.
作成後、Kernel.phpに登録します。
laravel/app/Console/Kernel.php
/**
* アプリケーションで提供するArtisanコマンド
*
* @var array
*/
protected $commands = [
Commands\ClassName::class,
];
laravel/app/Console/Commands/ClassName.php
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'classname:register';
好きな名前をつけて下さい。
修正したら、コマンド実行
php artisan classname:register
修正がうまくいくと、php artisan で一覧に表示されます。
jsonbの部分更新
json のスキーマはpostgreSQL9.2 から取り扱えるようになり多様なデータ構造を持つことが出来るようになりました。key value のセットでデータ保存しますが
# select version();
version
----------------------------------------------------------------------------------------------------------
PostgreSQL 9.6.1 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-17), 64-bit
(1 row)
データの部分更新をしたいときですが、value がstring かnumber で更新方法が違いました。例えばこうゆうデータがあって
# select id, json_contents from notifications limit 1;
-[ RECORD 1 ]-+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
id | 1
json_contents | {"offer_id": 4333}-[ RECORD 2 ]-+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
id | 2
json_contents | {"offer_id": "4333"}
number と string で定義されたoffer_id があります。この場合だと
select * from notifications where json_contents = jsonb_set(json_contents, '{"offer_id"}', '4333');
で、1件しかとれません。(id:1 のほう)
なので、整合性のため、データを揃えます。
update table_name set col = default || 'hohfeofe' の発想です。
一旦空のデータを作ってから、元コンテンツをmergeして、offer_id に対して、元データをstring -> integer -> jsonb にキャストしてます。
この場合だと、jsonのvalue string -> integer , integer -> string でもいけると思います。
特定のフォルダ以下でのディスク容量
そもそもの始まりは
dir1から4まであって、 find ./dir1 -type f | wc -c で調べて26240973 と出てbyte だと理解してるけど、ディレクトリ1〜4の合算結果がdf -h のused より大きくなるんだけど計算どこが違うんだろ。。
— wataru kashii (@kecy_) 2017年7月27日
という自分のTweet。
どうも実行結果が計算合わない。。
現在のサーバを、どの程度ディスク容量使っているのかを調べるのに自分はよく
$ df -h
を使います。
このdf コマンドは実バイトを返さないということを知ったので詳細なデータを知りたい場合、例えば画像フォルダが何十万とあるフォルダ以下のバイト数を調べるにはどうしたらいいのか。
1. find DIR -type f | wc -c
自分が最初に行ったパターンです。明らかに違いました。この場合だと、参照先のファイル名の長さの総和に確かになってました。。
find dir -type f | wc -c ですが、ちと落ち着いてやってることを見てみましょう。これってファイル名の長さの総和を計算してることに・・・なってない?
— ぱぴろんちゃん👓 (@papiron) 2017年7月27日
2. find DIR -type f | xargs ls -l | awk '{sum+=$5}END{print sum}'
このパターンは、Twitterで教えていただきました。この場合うまくいきました。この場合だと、ls -l で隠しファイルを含めないので純粋に画像のバイト数の総和を出すことが出来ました。
3. find DIR -type f | xargs wc -c | grep total | awk '{sum+=$1}END{print sum}'
wc -c でバイト数を計算する方法です。ただ、grep total | awk '{sum+=$1}END{print sum}' をつけないとwc -c | tail -n 1 の場合だと、うまくいかなかったのですがこちらに関しても教えてくださいました。
xargsは大量のデータを受けた時に、コマンド最大長制限いっぱいで区切って実行しているのを忘れていました。この記事と同じ現象が起きているということです。 https://t.co/YwSApV04is
— ぱぴろんちゃん👓 (@papiron) 2017年7月28日
4. du -sh DIR
こちらの場合ですと、隠しフォルダのバイト数も含まって純粋な画像データとしては出せませんがシンプルという意味では使えるかなと思いました。
コマンドを扱う場合にオーバーフローが起こる可能性や、コマンド最大長があるということも知っていい勉強になりました。