bashのちょっと変態っぽい感じの文法メモ
変態そうで変態じゃない、少し変態なbash。
最近bashでシェルスクリプトをよく書くんですが、結構奇っ怪な文法で便利なのがあるので自分用にメモ。
もうbashちゃんがいないと生きていられないよお…。
csh? zsh? ハッ。ていうこのスタンス。*1
二重かっこで囲って演算子を使う
$ bash << 'EOF' > a=10 > b=20 > hoge=$((a+b)) > echo $((a/5)) > echo ${hoge} > EOF 2 30
expr使うよりもbash組み込みのこちらの方が環境依存がなく良いらしい。(参考: bashでexprを使わずにインクリメント処理する。 - 0xDB)
exprでは演算子との間にスペース必須だったがこれはスペースがあってもなくてもどちらでも良い。
インクリメントもできるのでだいぶコードがすっきりする。
hoge=`expr $hoge + 1` # exprを使うパターン hoge=$((hoge++)) # bashの記法を使うパターン
なお、今までの例でわかるとおり二重かっこ中では変数に$マークはつけなくて良い。
Man page of BASHの算術式評価の項目を丸写しだが、以下の演算子を(個人的に)よく使う。
演算子 | 効果 |
---|---|
parameter++, parameter-- ++parameter, --parameter |
インクリメント、デクリメント。後ろだと評価のあとに演算、前だと演算のあとに評価。 |
+, - | 足し算、引き算 |
*, /, % | かけ算、割り算、剰余(あまり) |
** | 指数(べき乗) |
for文をCとかperlみたいに書く
普通shだとseqなどを使って
for i in `seq 0 100` do echo "now: $i" done
みたいな書き方をするが、bashの2重かっこを使うとCとかperlとか俗に言うfor文っぽいforが書ける。
for ((i=0; i<=100; ++i)) do echo "now: $i" done
seqだけでは対応できないループなども手軽にできるから便利。
二重かっこ内は前述の二重かっこと同様に演算子が使える。
先の項目で書かなかったけど条件判断などに便利そうな演算子は以下のようなものがある。
演算子 | 効果 |
---|---|
<, > | より大きい、未満 |
<=, >= | 以下、以上 |
! | 論理否定 |
&& | AND |
|| | OR |
=, *=, /=, %=, +=, -= | 代入、演算子付きのものは元の変数に演算して代入 |
正規表現を使う
二重丸括弧ではbash独自の式の評価ができたが、testコマンドのような条件式の評価でbash独自の仕様を使うには二重カギ括弧を使う。
bash独自の文法では正規表現を使うことができる。
$ bash << 'EOF' > a="hogehoge" > [[ "$a" =~ [0-9] ]] && echo "\"$a\" has num." > a="123hoge" > [[ "$a" =~ [0-9] ]] && echo "\"$a\" has num." > EOF "123hoge" has num.
なお、正規表現をクオートなどで囲むと正常に動かない。(参考: bashの正規表現マッチングの使い方 - adsaria mood)
また、¥dみたいなのは使えない模様*2。
testコマンドとbashの二重カギ括弧では終了ステータスが違うとかそういう感じのをどこかで見た気がするが、見つけられなかった…。
追記(2014/05/15): 見つかりました!
if 文と test コマンド - UNIX & Linux コマンド・シェルスクリプト リファレンス
こちらに書いてあるとおり、testコマンドである[は条件内の変数が空になるとエラーを吐いたりしますが、bash組み込みである[[(二重かぎかっこ)ではエラーが出ないようです。
変数に小細工をして使う
参考: bashで変数を簡単に制御するための演算子: 小粋空間
というか上のページがわかりやすいので書く必要ないかも。
一応まとめの表でも作るかー。
記法 | 効果 |
---|---|
${name:-foo} | 変数nameが未定義の時デフォルト値fooを使う。 |
${name:=foo} | 変数nameが未定義の時デフォルト値fooを代入する。 |
${name:+foo} | 変数nameに値がセットされているときデフォルト値fooを使う。 |
${name:?hogehoge} | 変数nameが未定義の時"hogehoge"を出力してスクリプトを終了する。 |
そのほかにもあるみたい。使いどころは限られそうだけど便利そう。
記法 | 効果 |
---|---|
${parameter:offset} | 文字列をoffset文字目から使う。offsetは0から始まる。 |
${parameter:offset:length} | 文字列をoffset文字目からlength文字使う。 |
${!prefix*} または ${!prefix@} | prefixから始まる変数名を持つ変数すべてを使う。 |
${#parameter} | 格納された文字数を使う。 |
${parameter#word}, ${parameter##word} | 先頭からの最短一致パターン(#)と最長一致パターン(##)を取り除く。 先頭とマッチしないと取り除かれないので注意。 |
${parameter%word}, ${parameter%%word} | ↑の後方一致パターンバージョン。末尾からマッチさせる。 |
${parameter/pattern/string} | patternにマッチした部分をstringで置換して使う。 /(スラッシュ)が一つだと一度だけ置換、二つだと繰り返し置換される。 削除の場合は最後の/は省略できる。 |
web上のmanに書いてある大文字小文字変換は自分のmac mountain lion上のbashのmanには無かったし使えなかった。
∧_∧ ┌──────────── ◯( ´∀` )◯ < 僕は、Bashちゃん! \ / └──────────── _/ __ \_ (_/ \_)
参考: Man page of BASH
有頂天家族(アニメ)のキャラデザ
どうしても気に入らない。見なきゃ良いじゃんって感じだけど、原作は好きだからなんだかもどかしい。というかアニメはあまりちゃんと見ていない。1〜2話は録画をし損ねて見ていない。
※引用を行っているため、ネタばれを極端に嫌う人は見ない方が良いかもしれない。
- 矢三郎
顔がかわいらしすぎる。まだSteins;Gateの岡部倫太郎の方がキャラデザとして合っている気がするほどプリティーすぎる。格好も、冴えない男子大学生と言うよりは大学デビューした男子大学生。賀茂大橋の袂に出るとき、私の姿は小さくて可憐な乙女から、髪をぼさぼさにのばした冴えない男子大学生に変じていた。それは私が人間界をうろつく際の日常的なイデタチであり、それゆえに私は「腐れ大学生」という通り名を持つ。
- 赤玉先生
もっと汚らしくないとダメだと思う。すこしさっぱりしすぎている。古今無双の風呂嫌い
- 淀川教授
もう少し太っているはず。公式サイト上の画像だからはっきりとはわからないが、アングルが違うと太っているんだろうか?「布袋」のイメージも薄い。私や弁天と一緒に鍋をつついている男は「布袋」である。すばらしい勢いで鍋の中身を平らげてぽっこりした腹に収める健啖家であり、弁天が「先生」と呼んでいるのは彼の職業が大学教授だからである。
狭い高架道路を頼りない足取りで歩いてくるのは、宴席で熱弁をふるってその迸る狸への愛で我らを圧倒した大学教授である。髪を振り乱して腹を揺らし、薄汚れた背広と大きな鞄を胸に抱えて、一生懸命歩いてくる。ふうふう言って、汗みどろであった。
以下は自分の勝手なイメージをたっぷり含む。
- 母
「黒服の王子」姿の時は良いが、通常時の姿がきれいすぎるように思う。くたばれと叫ぶ「肝っ玉母上」というイメージから離れるし、通常時と黒服の王子姿のギャップがあるから面白いのではないかと思う。ただし原作中には母の姿の描写は黒服の王子以外あまり書かれていない。- 矢一郎
これは超個人的な感想だけど「若旦那風」には見えない。特に髪型がきまじめで律儀な矢一郎の性格に合っていないように思う。- 弁天
もともとは「それなりにかわいい田舎の女子に過ぎなかった」鈴木聡美=弁天があんなにどぎついのだろうか。ちょっとつり目過ぎないか。女は化粧があるからわからないけど…。そして弁天は黒髪のはず。まあ、アニメでは髪の毛の色でキャラを区別するというのもあるし「アニメ上の表現」というやつかも知れないが白の強い薄紫とは少し色が薄くないだろうか。黒髪をなでて、弁天はタクシーへ乗り込んだ。
全体的にかわいすぎるかきれいすぎる印象。
そのほかにもイメージに合わないものはあるが、それらは文中に描写されているわけではなく会話などから脳内で作り出されたキャラクターイメージなので「イメージと違う」と言って怒る筋合いはない。
かえるの矢二郎と弟の矢四郎はイメージ通りだ。金閣銀閣ももう少し太ってても良いかと思うけどなかなか。
矢四郎についてはキャラデザではなくアニメ中の描写で気にくわないところはあったが尺の関係もあるのだろう。
(弁天が風神雷神の扇をふるい鯨のしっぽを捕まえるところで原作では弟は恐怖のあまりたぬき姿に戻りドーナツを吐いてしまう。アニメでは人間姿のまましっぽすらでていない。
あのシーンは弟としては相当怖いだろうし、弁天の奇っ怪な部分が出ているところ。
「尻尾丸出し君」のあだ名をもつくらいだしせめてしっぽくらいはだしても良かったのでは…)
まあすべての読者の脳内イメージを壊さないというのは無理だからしょうがないことだけど、自分のイメージとは違うので個人的に残念。
あまりキャラデザが叩かれていないところを見ると、原作を読んだ人も自分ほど違和感を覚えてないのかもしれないし、勝手ないちゃもんである。
この時点ではまだマシだったのになあ。それでもかわいすぎるけど。
久米田康治の絵自体は結構好きだから、作品と切り離したキャラ単体とかオリジナルキャラだったら何とも思わないんだけどね。
ペンギンハイウェイも大好きだけど、アレも映像化はあまりして欲しくない。
わしは妄想の中でキャラを育てるのが大好きなんじゃよ。正直言うと挿絵も基本的に好きじゃない。
幼い頃から物語を読むのが好きだった人は妄想の中でキャラを作り上げてしまうスキルを自然に発動してしまうため、原作厨になりやすい。…たぶん。
※元々匿名ダイアリーの方に書いてたけど、これアフィ張れる(ゲス顔)ってなったので加筆した上で自分のブログに書き直すことにしました。
そういうわけで文庫本のアフィ張っておきますねー^^ アフィ嫌いな人はここから買わないように。どうせこんな零細ブログでアフィ張ってもクリックすらされないんですがね。
ていうかいつの間にかアニメ絵の表紙になってた。前の狸の絵の方が手に取りやすかったし、内容の雰囲気にも合ってたと思う。少なくとも自分ならこの表紙じゃ手に取らない。
ちなみに前の表紙は著者ご本人のブログに掲載されていました。2010-08-03 - この門をくぐる者は一切の高望みを捨てよ
はてなブログはトラックバックがないんで、たぶんリンク張っても著者ご本人に知れることはないよね(ちょっと恥ずかしい)
ついでに件のアニメのBlu-rayも。
電子書籍で数式が読みづらい
電子書籍っていってもkoboしか使ったことがないのですが。kindleでも同じなんじゃないかなあと予想して。
kobo touchとipadで時々電子書籍を読みます。と言っても娯楽ですが。
で、娯楽ばかりじゃなく勉強にも使えんものかと思って数式の入った洋書をサンプルダウンロードしてみました。
ちなみに研究室のゼミで使っているザボの『新しい量子化学』の原著です。洋書の電子書籍の充実具合は半端ない。
ところがこれが全然使いたいという気分にならない。数式がべらぼうにぼんやりしている。
(そのままipadのスクショ載せちゃったけど大丈夫かな。まあ、サンプルだし、引用の範囲になってる…よね?ていうかスクショとれるんだ。)
添え字のαが非常に苦しい…です…。この先も添え字やら変な記号やらがばんばん飛び出してくる本なので、とても¥1657(2013/07/15現在。ちなみにkindleだともうちょっと安い。)で購入には至りません。
おそらく数式が画像化されていて、しかも低画質なんでしょう。たしかePub3はsvg形式のベクトルデータが使えたはずなので、そういうのに入れ替えて欲しいなあ。
でもたぶんこういう本ってすごく需要が低くて、しかも洋書なんで電子書籍化したのは海外の会社だろうから、なかなかこういう部分の改善ってされないのだろうなあと思います。残念(´・_・`)
OpenMP難しすぎ
OpenMP @Fortran で並列化する作業を最近やっているのだが、これが全然速くならないという愚痴。
昔ちょこっとしたプログラムでやったときはスレッド数に反比例するようにすごくうまく効いたんだが、今やっているやや大規模なプログラムだと全然ダメ。
一応、
- gprofを使ったホットスポットの特定。
- 小さなdoループなどを闇雲に並列化しない。
- 大きな配列のprivate指示を避ける。
- スレッド取得(!$omp parallel)しすぎない。
ここらへんはやった。が、ダメ。
一体何が律速になっているのかすらわからないというていたらく。というのも、並列化した部分についてgprofでの結果を見ると呼んでいるサブルーチン以外の部分が大半を占めている。しかしそんなに時間のかかりそうな部分がぱっと見見つからない…。
今そのソースコードのなかにomp_get_wtimeを仕込んでいるけど正直とてもめんどくさい。
こんなこと書くと「そのくらいやらないで並列化なんて甘い」と怒られそうだけどw
そもそもなぜOpenMPは配列のreductionができないのか不思議でしょうがない。それさえできればもっと並列化簡単なのに!
大規模な数値計算って大抵大きな配列がコア部分にあるだろうし、需要はあるはず。
OpenMPを見限ってMPIにした方が楽なんだろうか。
検索するとOpenMP全然ダメ、MPIの方が断然速いですぜという声ばかり…
でもそうするとシングルコアバージョンとマルチコアバージョンを分ける必要がありそうでちょっと尻込みしている。(研究室のユーザーに使い分けを周知するのがめんどくさい…。)
moshを非rootで入れようとしたが無理だった。
最近なんか流行ってて便利そうだったんでmosh入れようと思ったんです。もっしゅもっしゅ。
そしたらなんかサーバーサイドにもインストールしなきゃいけないじゃないですか。で、自分がsuになれるマシンだったらいいんですけど、そうじゃないので非rootでprefix設定してインストールしてみたんですよ。
インストールも結構大変だったんですよ。でもちゃんと動くところまでは持っていった。がんばった。
でも結局UDPポートのファイアーウォールでできませんでした。ちゃんちゃこちゃん。
途中で詰んだとこ
.bash_profileに環境変数のexportを書いていたが、それだとうまくいかなかった。.bashrcに書かないといけない。こうやって書くと一行でおわってしまうけど非力な脳みそをお持ちの私はどうにも気づくのに時間がかかりました。
書いたのはこんな感じ。たぶんLD_LIBRARY_PATHの/usr/local/libいらないと思う。インストール先は$HOME。
PATH=$PATH:$HOME/bin LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$HOME/lib:/usr/local/lib export PATH export LD_LIBRARY_PATH export PKG_CONFIG_PATH=$HOME/lib/pkgconfig
ちなみに.bash_profileに書くとこんなふうになる。
/home/hogehoge/bin/mosh-server: error while loading shared libraries: libprotobuf.so.7: cannot open shared object file: No such file or directory Connection to foo.bar.jp closed. /usr/local/bin/mosh: Did not find mosh server startup message.
悲しき画面。
結局サーバー管理側に浸透するまでは、ユーザーが気軽に使う感じにはならなさそうですなあ。
自分がsuとれるやつだけで使うことにするか…。残念。
もっしゅもっしゅ。
keynote使ってみて思ったこと
修論発表をkeynote '09でやりました。ごめんなさい嘘ですまだでした。数日後に発表です。
3年間の集大成みたいなものだと思うんですが、イマイチ実感がわかないなあ。
さてkeynoteの話。
大まかな感想は、「パワポでおk」。
でも、ちょっとした発表のためにぱぱっとスライド作りたいときにはいいかもしれない。
修論発表や学術発表みたいながっつり内容盛り込むことが要求されるスライドにはむかないと思う。
appleはそろそろアップグレードするべき。何様だ。
便利だと思った点
- あんまりいじらなくてもそれなりの形になってくれる。
- 基本のテンプレが文字大きめ真ん中にどーん!って感じなので、簡単にジョブズ気分に浸ることができる(笑)
- スライド遷移のエフェクトの一つ「マジックムーブ」について。これは遷移後のスライドに同じ図や文章のオブジェクトがあると自動でなめらかに移動・拡大縮小・回転するアニメーションをつけてくれる機能。
- マジックムーブ使うとスライド作成中にスライドが見やすい。アニメーションでできるけど、アニメーション使うとスライドの編集画面がごちゃめちゃになるからこれは良い。
- マジックムーブの動きがカッコイイ。結構みんなびっくりしてくれる。しかし少々派手な演出になるため使いどころと頻度は考えるべし。あまりこういう演出を喜ばないお堅い人もいるようなので(自分の研究室がこういうのいやがらないでくれるところで良かったー)。
- グラフは簡単きれい。しかし、不便に思った点に書くが難点も多々あり。
- インスペクタでの設定はOfficeのリボンインターフェースよりも横長画面を有効に使えるように思う。
- 図形に手書き風の線を使える。無機質になりがちなスライドがすこし柔らかになる(?)
- iCloud使える。
- 画面の構成がシンプルですっきりしている。わかりやすいかというと怪しい…。初見では戸惑う。慣れればなかなか。
- 安くダウンロードで買える。また、同じアカウントであれば複数マシンにインストールできる点も良し。ただし、(おそらくiCloud対応のため)OSX 10.7(Lion)以降が要求される。'09のくせに!
不便だと思った点
- シンプルすぎていじれない。総評すればこれに尽きる。かえって操作や手順が煩雑になることもしばしば。
- 非表示スライドが本当にほとんど表示されない。どういうことかというと、非表示にすると編集画面でもスライドのサムネイルが消え、横棒になる。そのためどんな中身だったかを確認することが一目ではできない。関連する補足スライドを非表示にして使う用途にはむずかしい。
- スライドへのハイパーリンク機能だが、非表示スライドに使えない。これでは補足資料用に非表示スライドを作っておいて、必要になったらリンクで飛ぶ、というような使い方ができない。
- スライド番号がすこぶる使いづらい。まず番号を飛ばすスライドを作ることができない。またパワポでいうところのフィールドが存在しないため、総スライド数は手打ちしなければならない。スライド数が変わってしまったら打ち直すという作業が必要になる。
- 画像のフィルタがない。パワポでは画像の色合いを変えたり、飾り縁をつけること、質感を変えることが出来るがそういったことはできない。「背景を透明にする」は「アルファ」という名前で存在するがこのアイコンとアルファで伝わる人はどのくらいいるのだろうか…。
- 表のテンプレートがないため、自分でいじらなければいけない。まあ、背景色変えるだけでそこそこ見栄えのする表にはなるけど、パワポの方が楽。
- グラフについていろいろ。
- グラフとしてありえないところがある。x軸が数値として扱えない。そのため0, 45, 75, 90といった等間隔でないxの値が等間隔に軸として並び、怖い人たちに怒られそうで怖い。
- グラフの系統をアニメーションで表示する場合に各系統のタイミングを設定できるが、複数系統を同時に表示させることができない。そのためプレゼンがもたつく。
- 値を入力するところが使いづらい。小さいし、既存のデータをインポートできないのですべて改めて打ち込まなければいけない。スペース刻みならコピペで貼り付けられるかな?と思ったらそんなことは無く、やはり手打ちしなければいけない。
- Finder上でiCloud上の.keyファイルが見当たらない…。Dropboxのほうが便利な気がする。
- 数式エディタが付属しない。そのため外部のアプリを使う必要がある。
昔はmac版Officeの安定性やら起動速度やら機能やらは貧弱そのものだったのですが、最近はかなり使いやすくなりました。さっきパワポとkeynoteの起動速度比べてみたら大して変わりませんでした。スプラッシュ画面が出る分パワポの方が安心感すらあるかもしれない。
発表者画面も昔はkeynoteの利点だったわけですがぱくr…パワポにも取り入れられて全く使い心地は変わらないです。
iPadとかiPhoneの連携は端末を持っていないので試せないのですが、これがkeynoteの一番の利点になるのかもしれないですね。
そういうわけだからappleの偉い人改善よろしこ〜w
全くコネも何にもないしこんな辺境のブログなんて見ないなんて知ってますからツッコミはいらないです。
あ、ツッコミくれる人もいない…か…。
エヌ氏はそう気づいてしばらく呆然としたあと、また思い出したかのように何もない空間に向かってぶつぶつとつぶやき続けるのだった。
~Fin~
実行中のPIDとパスとその他を表示するスクリプト作った
修論のために計算するのは良いんだけど,鶏頭故に今動かしてるものが何かわからなくなっちゃうことが頻発したので作りました.
ついでにメモリ使用量とCPU%と経過時間も取得できるようにしました.
コード
正規表現に一部不完全な部分があったので修正
#!/bin/bash getop=0 while getopts "t" opts do case $opts in t) getop=1 ;; esac done procid=`ps xr | awk '!/( ps |PID| top )/ {print $1}'` if [ $getop == 1 ] ; then status=`top -b -n 1` printf "%7s%5s%8s%13s PATH\n" "PID" "Mem" "CPU%" "TIME" else printf "%6s PATH\n" "PID" fi for p in ${procid[@]}; do printf "\033[32m%6d\033[0m: " $p if [ $getop == 1 ] ; then echo "$status" | awk "/^ *$p / {printf(\"%5s%8s%13s \",\$6,\$9,\$11)}" fi ls -l /proc/$p/cwd | awk '{print $11}' done
あれ?はてな記法でスーパープレ記法使ってるのにプレビューでシンタックスハイライトされない….
シェルスクリプトのシンタックスハイライトshはあるけどbash単体のハイライトはないことに気づいた.
表示例
$ pidpath PID PATH 2515: /home/hoge/foo 8030: /home/hoge/bar 8060: /home/hoge/fugafuga 8103: /home/hoge/gonyo
$ pidpath -t PID Mem CPU% TIME PATH 2515: 2.5g 100.0 1711:43 /home/hoge/foo 8030: 484m 100.0 21:38.22 /home/hoge/bar 8060: 484m 100.0 21:34.03 /home/hoge/fugafuga 8103: 484m 100.0 20:59.18 /home/hoge/gonyo