忍者ブログ
日々の研究生活のメモ書きなど

■ 参考 : scpの使い方 -l オプション (帯域制限)

■ 参考 : rsync, wget, curl, scp に速度制限をかける方法まとめ

scp -l 8192 hoge.txt name@where:

単位は [Kbit/s]

メモ
2MB ~ 16000Kbit
1MB ~ 8000Kbit
500KB ~ 4000Kbit
100KB ~ 800Kbit









PR

設定ファイルが読めない状況でファイル修正をしないといけなくて、やむを得ずviを使った
:qが終了なことは覚えてたけど(覚えてないと詰む)、今回は修正をしないといけなかった

修正はiで編集モード変更に切り替えて行うっぽい
モードを閲覧モードに帰るときはESC

:q セーブせずに終了
:q セーブせずに強制終了
:w セーブするが終了しない
:wq セーブして終了

検索や置き換えが簡単にできそう

今はずっとemacsを使ってるけど、正直emacsを使いこなしてるわけではないからviでもいいのかもしれん
最近はそんなにコードを書けていないから、もっと頑張らねば

■ 参考 : viエディタの使い方








めちゃくちゃ便利だわ、xargs




■ 参考 : xargsコマンドで覚えておきたい使い方・組み合わせ7個(+1個)

基本的には
コマンド1 | xargs コマンド2

パイプと似てる
パイプだと ls *.txt | wc とかみたいに左のコマンドの結果をより右に渡して実行される
xargsも同じような感じだけど、それにいろいろとオプションをつけてさらに高度なことができる



自分的に便利だと思ったのは

xargs -p : 実行するか毎回確認できる

xargs -P 2 : 同時にプロセスを複数走らせられる、この場合は2

xargs -d区切り文字 : デフォルトだとスペースになってる、これをアンダーバーとかにできる


ひとまずメモ










ただのメモ
echo "hogehoge" 1>&2







このブログで初めてcrontabのことを書く〜
crontabは定期的になんらかのコマンドを走らせるときに便利、ということは度々聞いてたけど
今回始めて使うことになってしまった・・・・

今までどうしてたかというと
sleep 3600; echo "hoge"
みたいな感じで手作業で待機させて走らせていた・・・
アナログ人間的発想って感じだ・・・ 別の言い方をすると発想がおじいちゃん






自分が走らせたかったのはただのシェルスクリプト
自分のシェルで動くことは確認済

crontabを走らせる設定は以下のコマンドで書く
crontab -e
EDITORという変数を設定していないと、viとかで編集することになるので設定しておく
setenv EDITOR "emacs -nw"

まずは動作テスト
次のようにcrontabe -eで設定する
* * * * * echo "hoge" > ~/hoge.txt
これで、1分ごとにhoge.txtが更新されるはず
ls -ltなどでhoge.txtの最終更新日が確認できる


現在の設定は
crontabe -l
で表示できる

左から
[分, 0~59] [時, 0~23] [日, 1~31] [月, 1~12] [曜日, 0~7, 0=7=日曜, またはsun~satでも指定できる] [コマンド]
に対応する

コメントアウトをしたかったら、#でそのジョブを止めれる


この次に、自分のシェルスクリプトを使って動作テストをする
が、うまく動いてくれない

何が原因で動いてくれないのかはエラー出力や標準出力がないからわかりにくい
そこで、
* * * * * echo “hoge" >>~/log1.txt 2>> ~/log2.txt
のようにして、標準出力と標準エラーをファイルに書き出す
これでエラーメッセージが読めるようになる


このあとでトラブったのがPATHやLD_LIBRARY_PATHなどの環境変数の設定
crontabを実行するときは、PATHなどがすべてリセットされてほとんど空の状態になる
シェルスクリプトを動かすのに必要なのはPATHやLD_LIBRARY_PATHくらいなのでそれをセットする
セットする方法は以下のページに何種類も提案されてる

■ 参考 : cronジョブを作るのにいつものやり方でいいんですか?

■ 参考 : cron実行時の環境変数を設定

■ 参考 : シェル上だと動くのに、CRONに登録したら動かない!!!なんでだぁー!!!を解決する為の記事です。


自分はcrontabにそのまま直書きする方法にした
50 10 * * * PATH=/usr/local/bin:/usr/bin:/bin:$HOME/bin:. LD_LIBRARY_PATH=/usr/local/lib/:$HOME/local/lib/ hoge.sh >>~/log1.txt 2>> ~/log2.txt

これで動いた














カレンダーを英語で表示するには、
% env LC_TIME=C cal

June 2018
Su Mo Tu We Th Fr Sa
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30


今の言語環境とかを引き継いで起動する場合は
% cal

6月 2018
日 月 火 水 木 金 土
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30





■ calコマンドのオプション

cal -y
今年の1年分のカレンダーを表示する

cal -3
先月、今月、来月の3ヶ月分を表示する

cal 6 2019
2019年6月のカレンダーを表示

cal 29 6 2019
はダメだった








■ 過去記事 : 【多段ssh】するときに楽な方法を2つ紹介

まず、4年前の自分へ
「2つめは ~/.ssh/configを活用する方法
最後まで書ききる元気がなくなったので参考リンクだけ残しておきます」
と書いていますが、今はそれをガッツリ使っています
一歩ずつではあるが着実に成長してるでぇ〜





今回はパスワードなしでssh(scp)する方法についてメモしときます

■ 過去記事 : sshの設定(passwordなしでsshログイン(scp)する)

ここが一番分かりやすいです
% ssh-keygen -t rsa

鍵の保管場所を聞かれる
デフォルトは~/.ssh/id_rsaなのでそのままenterを押して許可

パスフレーズを要求されるが、今はこれをなしにしたいのでEnterを押す
再度確認されるのでEnter
鍵が~/.ssh以下にできる

このうち公開鍵(public key)をssh先も転送する
% ssh-copy-id -i ~/.ssh/id_rsa.pub yourname@hoge.co.jp:

ログイン先にログインして、 ~/.ssh/authorized_keys というファイルがあればOK
実際に
ssh -Y yourname@hoge.co.jp
でログインできることも確認する


追加で他の人からファイルが見えないようにする設定がいるかと思ったけどいらなかった
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys




(2018/07/11 追記)

もし複数の秘密鍵を持っておきたい場合は
% ssh-keygen -t rsa -f ~/.ssh/id_rsa.hoge
のようにして出力ファイル名を指定できる

このとき、デフォルトでは~/.ssh/id_rsaの秘密鍵が読み込まれるようなので、秘密鍵を接続先に応じて使い分けたい場合は ~/.ssh/configに次のように秘密鍵の場所を指定しておくと良い
IdentityFile ~/.ssh/id_rsa.home







% [[ `echo 'AAAAAAA' | grep 'B'` ]] && echo "with B" || echo "without B"
without B
% [[ `echo 'AAAAAAAB' | grep 'B'` ]] && echo "with B" || echo "without B"
with B
■ 参考 : 文字列Aに文字列Bが含まれるか











ちょいちょい出力が違うけどメモ
sh-4.2$ ls -F fig | grep /
12113/
12114/
12115/
12116/
12118/
12134/
 

sh-4.2$ ls -l fig | grep ^d
drwxr-xr-x 2 usename hoge 4096 Jun 21 05:23 12113
drwxr-xr-x 2 usename hoge 131072 Jun 21 09:05 12114
drwxr-xr-x 2 usename hoge 4096 Jun 21 08:01 12115
drwxr-xr-x 2 usename hoge 131072 Jun 21 05:54 12116
drwxr-xr-x 2 usename hoge 131072 Jun 21 13:15 12118
drwxr-xr-x 2 usename hoge 4096 Jun 21 13:24 12134

sh-4.2$ ls -l fig | grep ^d | awk '{print $9}'
12113
12114
12115
12116
12118
12134

sh-4.2$ find fig -maxdepth 1 -type d
fig
fig/12114
fig/12118
fig/12134
fig/12116
fig/12113
fig/12115
ディレクトリじゃなくてファイルが知りたいときは
find fig -maxdepth 2 -type f






■ 指定した深さのディレクトリorファイルのみを一覧する

-depthというオプションもあったので、それでいけるかと思ったけどダメ
しょうがないのでmindepthとmaxdepthの合わせ技で・・・・・
find fig -maxdepth 2 -mindepth 1 -type d | sort -r

find fig -maxdepth 2 -mindepth 1 -type f | sort -r









実行ファイルが foo/hoge.txt というファイルを読み込んで解析をするとする
このとき、実行ファイルにfoo/hoge.txtと直書きして実行するとファイルが見つからないとエラーが出る

おそらくcondorが実行されるときに、実行ファイルを別の場所にそのままコピーして実行するので
カレントディレクトリで実行されるわけではないからこういうエラーが起こってる
じゃあ、foo/hoge.txt も一緒にコピーしてもらえばいいのではと思って少し調べた



以下のページに説明があった
■ 参考 : 2.5 Submitting a Job3
transfer_input_files = foo/hoge.txt

これでfoo/hoge.txtも転送されて解析されるかと思ったけど、ダメ


あとはサブミットファイルの中で
Initialdir = [今のでぃれくとり]

のようにもしてみたが、同じだった

結局、foo/hoge.txt を絶対PATHで書くことで解決した








quick lookで見れなくてイラッとした

まずはechoで本当に思ってるファイルがリストされてるのか確認
そのあと、mv で実際にリネームすればOK
#!/bin/sh
for i in `find . -name "*dat"`
do
mv $i ${i%.dat}.txt
#echo $i
done










以前書いた記事のおさらい+まとめみたいな感じ

■ 参考 : 【シェルスクリプト】2の累乗をfor文で回す

■ 参考 : 【シェルスクリプト】exprを使わずにより早いfor文を書く







$(())という書き方は実はもっと色々とできるっぽい
↓の記事に詳しくまとめられている

■ 参考 : bashで四則演算( -×÷)や割り算のあまり(剰余)を求めるような簡単な計算をする

・四則演算
・余りを求める $(( 5 % 3 )) とか(今回はこれが使いたかった)
・累乗を求める
・偶奇の判定、$(( なんか & 1 ))で返り値が1なら奇数、0なら偶数


ただし、$(())の最大のデメリットは整数しか扱えないこと

小数を使いたい場合はbcコマンドを使う
またはawkとかでもOKか

■ 参考 : 【シェルスクリプト】bcコマンド








まず終了ステータスについて

■ 参考 : exitコマンド(シェルを終了する)

シェルスクリプトの最後に
exit [n]
と書いた場合はnが終了コード
nを書かない場合は最後に実行したコマンドの終了コードを引き継いで正常終了する
nに数字以外を書くとエラー終了

nは0から255の数字を入れる
1のみエラー終了、それ以外は正常終了






■ 参考 : 終了ステータスを設定
終了ステータスは $? というシェル変数に代入されているので、その値を見て処理を分岐させればOK


ただし、そんな処理分岐をしなくても
command1が成功したら、command2を実行するという風に処理を進めたい場合は次のように書けばOK
command1 && command2 && command3


コマンドが失敗した場合のみ進めるというのもあるが、こっちは使いみちがあんまりわからん
代替手段をcommand2とcommand3に書いておくのかな?
command1 || command2 || command3


rm -f の終了ステータスは常に0になる
他のユーザのファイルを削除しようとした場合は1になる
とりあえずrm -f の終了ステータスは信用しないようにする







話は変わって、シェルスクリプトのset -eについて

■ 参考 : シェルスクリプトを書くときはset -euしておく

この記事ではset -euと書いてあるけど、自分が使いたいのはひとまず set -e
これはシェルスクリプトの中で、正常終了しないコマンドがあった場合はそこでシェルスクリプトの処理が止まる

set -uは未定義の変数を使おうとしたときに打ち止めしてくれるオプション
ある処理がうまくいってなくて、その結果未定義な変数があるときにちゃんと処理を止めてくれるという優れもの


ある処理1からある処理2まではset -eのオプションの機能を止めたい場合は
set +e
# ここからset -eを止めてる
#
#
#
set -e
# ここからset -eが機能してる
#
みたいにset +eを使えばOK












条件分にコロンを使う
while :
do
# なんかする
done

条件分にtrueを使う
while true
do
# なんかする
done









最近何かのことを調べていて以下のブログにたどり着いた
色々とページを見てたら、目からウロコが落ちた
■ 参考 : 最近覚えたシェルスクリプトの小ネタ


「testコマンドを使うとフォークしてしまって大量に叩くとパフォーマンス悪い」らしい
つまり、if [ ]; thenのこと

その代用に挙げられていたのが
[[ "$a" = "hoge" ]] && echo "hoge" || echo "fuga"


これを使って・・・・

ファイルがあるかどうかで分岐
[[ -f $file ]] && echo "file aru" || echo "file nai"

ディレクトリがあるかどうかで分岐
[[ -d $dir ]] && echo "dir aru" || echo "dir nai"

[[ ]]と中身は絶対に半角スペースを開けないとエラーになるので注意

判定を反転させたいときは ! を -dとか-fの前につければいい

あと&&とか||の後の処理を複数行に分けて書きたいときは{ } でくくればOK











新しい計算機にログインして、ふいにcontrol+Dを押してしまいログアウトしてしまった・・・
.cshrcをまだ用意していないのが原因だった

.cshrcに
set ignoreeof
と書いておけばOK

というか書いてある.cshrcをscpしていなかったからこうなっただけだった
何も知らずに偉い人の.cshrcを一部コピペしたりして使ってたけど、やはり先人は偉大だった


bashの場合は
IGNOREEOF=100
とかでcontrol+Dを100回まで無視するとか設定するらしい





わかりやすくcontrol+Dについてまとめられているページ↓

■ 参考 : Ctrl-D の話










自分のログインパスワードを変更する時にchpasswdと打って、sudo権限いるやんけ〜〜〜
とか言ってたアフォおる?(私だ)



passwd は自分のアカウントのパスワードを変更するときに使う
chpasswd は管理者が一括で複数のユーザーのパスワードを変更するときに使うコマンド(つまりsudo権限は必要)

■ 参考 : 【 passwd 】 ユーザーのパスワードを変更する

■ 参考 : Linuxで一括でユーザーのパスワード設定を行う方法








chsh -s /bin/tcsh



新しいMacを手に入れました
ログインシェルがbashになってることに気づかず、あれ?あれ?と右往左往して原因に気づきました

terminalの環境設定からたぶん変えられるけど、chshってコマンドじゃなかった?
と思って使ってみたら、viの知識必須だったみたいで心が折れました・・・

ググったらchsh -s 〜〜〜でいけると知ったのでメモメモ






(2018/02/15 追記)
場合によってはsudoいるかも
その後再起動する
sudo chsh -s /bin/tcsh









昨年の作業ディレクトリを整理しててちょっと困った・・・
ls -lで見ると年が表示されないので2016年のディレクトリなのか2017年のディレクトリなのか判別できない
調べてみると
ls --full-time
でいけるっぽい
一時的に
alias ll 'ls --full-time'
としてaliasに登録しておいて作業・・・

他にもlsは色んな時刻の表示形式に対応している

■ 外部リンク : ls -l コマンドで年を表示したり、ファイルの日付の表示形式を変えるには。











■ 参考 : 統計屋のためのAWK入門

ここの「AWKでなんか色々統計処理をやってみた」というsectionにワンライナーでコマンドがまとめられてる

以前から使ってる別のワンライナーコマンドをまとめたページも貼ろうと思ったけど、
記事が別の場所に移動して怪しかったのでやめた

分散と標準偏差が便利
ダブルコーテーションじゃなくてバッククオートじゃないといけなかった
# 平均
awk '{sum+=$1}END{print sum/NR}' hoge.txt

# 分散
awk '{d[NR]=$1;avg+=$1}END{a=avg/NR;for(i in d)s+=(d[i]-a)^2;print s/(NR-1)}' hoge.txt

# 標準偏差
awk '{d[NR]=$1;avg+=$1}END{a=avg/NR;for(i in d)s+=(d[i]-a)^2;print sqrt(s/(NR-1))}' hoge.txt

あとで気づいたけど、これ"あんちべ"さんだ・・・






別の記事に艦これの加賀さんが出て来ていたのでメモメモ

■ 面白い記事 : 自然言語処理の最新手法"word2vec"で艦これ加賀さんから乳を引いてみる





(2017/09/04 追記)

# シャッフルを用いた重複なしランダムサンプリング
awk 'BEGIN{srand()} {line[NR] = $0} END{for(;i<100000;i++){r=1+int(rand()*NR);s=1+int(rand()*NR);tmp=line[r];line[r]=line[s];line[s]=tmp};for(t in line)print line[t]}' hoge.txt | awk "NR <= 100"

これで100000回並べ替えを行って、そこから先頭の100個のデータを抽出できる
元のソースコードは上記と同じリンク

srandは現在の時刻から初期シードを生成して、乱数生成を行うので
1秒以内に同じコードを実行するとまったく同じ結果になってしまう

この処理を何度も行うときはsleep 2とかを間に挟んだ方が良い







次の3枚の画像を1枚の画像としてまとめたい

poissonrayleighgaussian


やり方は
1. Macのプレビューで全部開く -> 印刷画面 -> レイアウト -> ページ数/枚を4枚とかに変更 -> 左下のPDFボタンから画像出力する
2. montageコマンドを用いて1枚にする


1の方法は書いてある文章の通り

2の方法のコマンドはこんな感じ
montage -tile 3x1 -geometry 1080x720 *.png hoge_3x1.png

hoge_3x1
montage -tile 1x3 -geometry 1080x720 *.png hoge_1x3.png
hoge_1x3
montage -tile 3x2 -geometry 1080x720 *.png *.png hoge_3x2.png
hoge_3x2■ コマンドの簡単な説明
montage [オプション] 入力画像の名前(複数) 出力画像の名前
というのが使い方

-tileは何枚ずつ並べるかを指定できる
上のを見てもらうとわかるように [横に何枚か] x [縦に何枚か] で指定

*.pngというようにワイルドカードも使える
ワイルドカードを使わないなら、hoge1.png hoge2.png hoge3.pngのように並べて書く
1x3の場合は並べる画像のファイルを3つ指定した後のファイル名が出力ファイルになる
今回はhoge.png

-geometry 1080x720は出力する画像のサイズを決められる

入力画像のサイズは統一しておくと便利
また、画像のサイズを知りたいときはidentifyコマンドで
% identify rayleigh.png
rayleigh.png PNG 1080x720 1080x720+0+0 8-bit sRGB 22.6KB 0.000u 0:00.000





他にはImageMagic関連のconvertコマンドのメモは以下から

■ 過去記事 : 【convert】png画像からgif画像を作るには
















こんな感じでOK
[ ]の中はすべて半角スペースで区切る
[ と !の間にスペース、$FILEのEと]の間のスペースを忘れるとエラーで怒られる
if [ ! -s $FILE ]; then
# ファイルサイズが0のとき
fi





似たようなのでこんな記事もある

■ 参考 : 【シェルコマンド】ファイルサイズが0のファイルを削除する














よくアクセス解析をしてると、URLの中身が%に置き換わってたりして何書いてるのか全然わからないことがある・・・

そういうときは、以下のページに入力すると変換して見やすくなる


■ 参考サイト : URLエンコード・デコードフォーム

例として、この記事のURLは次のように変換される
http://coffee.guhaw.com/Entry/697/
  ↑
  ↓
http%3a%2f%2fcoffee%2eguhaw%2ecom%2fEntry%2f697%2f





ググったら、これはnkfコマンドとかを使えば同等のことができるっぽい
echo 'http://coffee.guhaw.com/Entry/697/' | nkf -WwMQ | tr = %
  ↓
http%3A%2F%2Fcoffee%2Eguhaw%2Ecom%2FEntry%2F697%2F

また、逆は、
echo 'http%3a%2F%2Fcoffee%2Eguhaw%2Ecom%2FEntry%2F697%2F' | nkf -w --url-input
  ↓
http://coffee.guhaw.com/Entry/697/









condorに関する過去記事

■ 過去記事 : 【condor】について調べたのでメモ


■ 過去記事 : 【condor】shared libraryを使ったプログラムをジョブに渡すとき





condor_rmのヘルプを見るとタイトルと関係あるオプションを見つけてしまった
(スペースとタブが潰れたので見にくい・・・)
Usage: condor_rm [options] [constraints]
 where [options] is zero or more of:
  -help Display this message and exit
  -version Display version information and exit
  -long Display full result classad
  -totals Display success/failure totals
  -name schedd_name Connect to the given schedd
  -pool hostname Use the given central manager to find daemons
  -addr Connect directly to the given "sinful string"
  -reason reason Use the given RemoveReason
  -forcex Force the immediate local removal of jobs in the X state
     (only affects jobs already being removed)
 and where [constraints] is one of:
  cluster.proc Remove the given job
  cluster Remove the given cluster of jobs
  user Remove all jobs owned by user
  -constraint expr Remove all jobs matching the boolean expression
  -all Remove all jobs (cannot be used with other constraints)


単体のジョブを消すときは、
condor_rm [ID]

自分が投下したジョブをすべて止めるときは、
condor_rm [user name]
 または
condor_rm -all


condor_rm -constraint
で、条件文を書いてそれにmatchしたジョブだけを取り消せるらしい
ちなみに-constraintは-constと省略することもできるっぽい

条件文は、
condor_rm -const 'ClusterId > 3880'
な感じで書く
condor_qで表示されるジョブIDはClusterIdと呼ばれるらしい(CとIは大文字)

この変数名を探すのにかなり苦労したが、
condor_q -long | grep "3571"
みたいな感じで調べた
他にもやたら変数がセットされてるっぽいので、それらも使えるかもしれない(試してないけど)






















sshログインしてたら、次のようなエラーがログイン時に表示されるようになった
/usr/bin/xauth: error in locking authority file /somewhere/.Xauthority
/somewhereは自分のホームディレクトリ

rm ~/.Xauthority-c
:> .Xauthority
chmod 600 ~/.Xauthority
で、エラーはでなくなった
何が原因で起こったんだ?
















プロフィール
HN:coffee
職業:物理屋(自称)
趣味:映画鑑賞、登山
出身:大阪府の南の田舎
自己紹介:
import MyProfile
import coffee_pote from TWITTER
import amazonのほしい物リスト from WISH_LIST

print "python versionにしてみた"
print "python 勉強中"

print "猿でもわかるgnuplot を執筆中"

# 最終更新 2018/11/14
カウンター
ブログ内検索
ツイートするボタン
リンク
相互リンク募集中です (Twitterにてお知らせください)

Demo scripts for gnuplot version 5
(gnuplotのさまざまなデモ画像と作り方がまとめられている、眺めているだけでできるようになった気分になれる)

gnuplotスクリプトの解説
(米澤進吾さんの個人ページ、gnuplotと言えばこのかた)

gnuplot のページ
(Takeno Lab、うちのブログがリンクされていたのでリンク返し)

とある物理の院生日誌~院生は社会へ旅立った~
(研究室の先輩の個人ブログ)

英語例文を見て自然に英語・英会話を学ぶ
(楠本慶ニさんの個人ページ、様々な情報の密度の高さに感動)

Twitterから映画の評価が分かる & 映画の鑑賞記録が残せる coco
(映画の感想をまとめられるサイト、いつもお世話になっています)

Astronomy Picture of the Day Archive
(天文や宇宙関連の最新の話題について画像とともにNASAが説明しているページ)

今日のほしぞら
(任意の時刻の空で見える星を表示してくれる、国立天文台が管理している)

GNUPLOTとアニメーション
(応用の項目の「見せてあげよう!ラピュタの雷を!!」あたりからすごすぎる)

読書メーター
(読んだ本をリストできる便利なサイト)

Flickr

Template "simple02" by Emile*Emilie
忍者ブログ [PR]