findコマンドメモ
findコマンドたまにしか使わないけど、たまに遭遇するとやってることの意味がわからなくて毎回ググるのでよく使いそうなところだけメモ。ほぼmanすればわかることだが。
使い方
パス内のファイルを再帰的に列挙するコマンド。
find <パス> <オプション>
-typeオプション
検索するファイルのタイプを指定する。
例)
カレントディレクトリ以下の普通のファイルを全部列挙する
find . -type f
find . -type d
ブロックデバイスファイルとかキャラクタデバイスファイルとかってなんだろうと思ったけど、 ここに解説が載っていた。
-maxdepthオプション
検索する階層の深さを指定する
例)
find foo -type d -maxdepth 2
-nameオプション
検索するファイル名で絞り込みをする
例)
カレントディレクトリ以下のファイルの中で'bar'という文字を含む名前のファイルを列挙する
find . -name '*bar*'
まあでも「〇〇.phpどこあったっけ?」みたいな使い方であればlocate *.php | grep ◯◯
ってやったほうが速い。
-execオプション
-execのあとにコマンド名を入力することで、findの結果をそのコマンドに引数として渡すことができる
例)
カレントディレクトリのファイル名出力全部の先頭に「おやつたべたい」を追加する
find ./* -type f -maxdepth 0 -exec echo 'おやつたべたい{}' ';'
-execで渡せるコマンドは複数可で、最後に';'か'+'を渡すことがコマンド終了の合図になってるらしい。{}
はfindコマンドの結果。
vimでPHPファイル開いたときにインデントがおかしくなる問題
setlocal shiftwidth=4
に設定してても実際ファイル編集するときに
set shiftwidth?
すると2
になっててここ最近本当にムカついてた。
賢いプラグイン様が色々やってくれているから設定ファイルのキャッシュとかが残ってるのか? と疑ったりしたが、どうも違うらしい。(プラグインのディレクトリ全部消してvimそのものをビルドし直したりしたがダメだった)
原因は、PHPファイルだと一度~/.vim/ftplugin/php.vim
が読まれたあとに~/.vim/ftplugin/html.vim
が読まれてしまうことだった。
先人のためになる記事が既にあったので解決できた。
PHP書くときは素直にPHPStorm買ったほうが良いのだと思う。。。
シンボリックリンクの実体のパスを出力する
シンボリックリンクの実体のパスを調べようとしてreadlinkというコマンドがあるらしいのでmanしてみたらstatというコマンド使えるよと書いてあった。
$ stat -f "%N: %HT%SY" /tmp/*
fは出力をフォーマットするの意。 各フォーマット指定子の意味
- N: ファイル名
- T: ファイルのタイプ
- H: Tの前につけるとファイルのタイプを言葉で出力 (つけなければ/とか@とか*とかの出力になる)
- Y: 実体のパス
- S: 特殊な文字で、Yの前につけた場合は" -> “を出力してくれる。見やすい
PHPのmkdir
自分用のメモ。
<?php function makeDir($upload_directory, $newdir) { $dir = __DIR__; $absolute_path = "{$dir}/{$upload_directory}/{$newdir}"; if (file_exists($absolute_path)) { if (!is_dir($absolute_path)) { error_log("file exists already"); exit("NG"); } } else { if (!mkdir("{$upload_directory}/{$newdir}", 0777, true)) { error_log("failed to make directory"); exit("NG"); } else { error_log("created directory"); } } }
userNotificationCenter:willPresentNotification:withCompletionHandler:が呼ばれないとき
Firebaseに渡すcontent_availableというパラメータがtrueになっていないかを確認する。
iOS では、このフィールドを使用して APNs ペイロードで content-available を表します。通知やメッセージの送信時にこのフィールドが true に設定されている場合、アクティブでないクライアント アプリのスリープ状態が解除されます。Android では、既定でデータ メッセージによってアプリのスリープ状態が解除されます。Chrome では現在サポートされていません。
上記の記述からして一見フォアグラウンド通知とは関係なさそうだが、実際の挙動を確認してみると、これがtrueの場合はアプリがフォアグラウンドだろうがバックグラウンドだろうが同じメソッドが呼ばれるということのようだ。
で、なぜかデフォルトのwillPresentNotification…ではなく、iOS10ではバックグラウンド通知時に呼ばれるdidReceivedNotificationResponse…がフォアグラウンドでも呼ばれてしまう。willPresentNotification…は呼ばれない。
content_availableをfalseにしたら無事willPresentNotification…が動いた。
ものすごく分かりにくい。これのせいで丸一日くらい悩んだ。
しかもcontent_availableをfalseにしても普通にスリープ中でも通知が表示されるし。。何のためのパラメータなのかわからない。
expectの使い方メモ
ftpしか使えないサーバーがあって、しかもユーザー名に@が入ってたりとかパスワードに:が入ってたりとかして嫌がらせのように一行のエイリアスが作れなかった。もしかしたら一行で接続する方法あるのかもしれないが知識不足でできなかった。ので、expectを書くことにした。
#!/usr/bin/expect set NAME "hogehoge@hogehoge" set PASSWORD "fugafuga:piyopiyo" set timeout 5 spawn env LANG=C ftp example.com expect { "Name" { send ${NAME}\n exp_continue } "Password:" { send ${PASSWORD}\n exp_continue } } expect { "ftp>" { interact exit 0 } }
シェルでexpectごとスクリプト化して書く方法もあるみたいだけど、複数のプロンプトだと途中で何故かとまる。書き方が悪いのだろう。
結局expectで書いて解決した。
env LANG=C というのはプロンプトをデフォルトの言語(英語)で出させるという意味らしい。