忍者ブログ
日々の研究生活のメモ書きなど
前記事で書いたツールの中で非常に多岐に渡るオプションを取り回す必要があった
具体的にはプロットタイプ1~9に対して、プロットの範囲[xmin, xmax][ymin, ymax]
全部で36個ある・・・
もしプロットタイプが増えたらさらに増える

これを全部関数の引数にして渡すのはやばすぎる!!!

と数ヶ月前の自分も思ったらしく、どう実装したかというと
xmin, xmax, ymin, ymaxを全部のプロットタイプで同じものを採用するという・・・

プロットの範囲を辞書型のリストにしておけば、関数の引数に渡すのは1つで済むから楽じゃね?
と思い至ったのでそれを実装してみた
この記事は辞書型のメモ

(一応約2年前にpythonの本を1から全部読んで、そのときのメモに辞書型のことは書いてあった
読んでみたら、こいつ全然辞書型わかってねーなー・・・と笑ってしまった)








■ 参考 : とっても便利なPythonの辞書型について覚え書き
# 空の辞書を作成、これに追加していく
dic_range = {}
dic_range["xmin_plottype1"] = 0
dic_range["xmax_plottype1"] = 5
dic_range["ymin_plottype1"] = 10
dic_range["ymax_plottype1"] = 40
みたいな感じ
これをplottypeの分だけ全部回して、さらに例外処理もすればOK


辞書の要素を取り出すときは辞書にキーを代入すればOK
xmin = dic_range["xmin_plottype1"]
本当は辞書のキーに取り出したい要素のものがあるか調べたほうが安全だと思う
if "xmin_plottype1" in dic_range.keys():
 xmin = dic_range["xmin_plottype1"]
else:
# なんかデフォルトの代入するとか
 xmin = ...
ただ今回は事前に例外処理はしてるので、キーがxmin_plottype1の要素には何かしらの値が入ってるのでしなくても大丈夫











PR

前にも出た記憶はあるけどなぜか記事にしてなかったのでメモ

原因は簡単で、自分が定義した関数の引数の順番がまずいという話
引数の順番で、デフォルト値付きの引数は一番うしろに固めて置かないといけない
def func(a, b=100, c)

みたいなのがだめ
def func(a, c, b=100)
はOK


■ 参考 : python3 SyntaxError: non-default argument follows default argumentはなぜ起こるのか













cgiからpythonを動かして色々とやるツールを少し前からちょこちょこ作ってる
その中で不特定多数のユーザーが走らせたコマンドを記録したくなった
いつ走らせたか、どんなオプションを使ったか
これをログに残しておく

そこで走らせた日付を知りたい

■ 参考 : Pythonで現在時刻・日付・日時を取得

import datetime
d_today = datetime.date.today()
print(d_today)
# 2019-02-04

とか
時間入りで日付を知りたいときはnowを使う

dt_now = datetime.datetime.now()

print(dt_now)
# 2019-02-04 21:04:15.412854


取得した日付をファイルに書き込むときはこれを文字列に変換すればOK
file.write(str(today) + "\n")







これまではc-x h で全体選択をして
M-x replace-stringで文字の置換をやってた

これだと一気に全部の文字置換をできて便利だけど、逐一確認しながら置換をやりたいときが出てきた
(9年くらいやっててこれが初めてだったらしい、というのもアナログな人間なので、手で全部やればええんちゃん? って思って実際やってみてそれが原因でバグるという。それが私です)


■ 参考 : 文字列検索・置換

調べてみたらめちゃくちゃ簡単で M-% でいける
自分の場合Metaはoptionキーで%はシフトキーと5を同時押し (すぐに忘れそう・・・)

置換モードに入ったら
Query-replace:
と下のミニバーに表示されるので、置換元を入力してエンター
Query-replace int with:
と表示されるので、置換先を入力してエンター

これで最初の候補に移動するので、そこで
y か space: 置換する
n : 置換しない
enter : 終了






(記事を書いた後で)

2013年にすでにこのコマンドを使った形跡があったw
やっぱり記憶から消えてるやん・・・


■ 過去記事 : 【Emacs】文字の置換










ln -s /home/foo/hoge.txt .

みたいな感じで、fooさんが作ったhoge.txtを間借りして使ってた
ただ、hoge.txtは頻繁に更新されるし、安定して動くversionを自分のリポジトリに追加しておくと
あとでトラブったときに復旧が楽

で、このhoge.txtをgitに追加しようとすると、シンボリックリンクのまま追加されてしまう
自分がやってほしいのはリンク先まで見に行ってその内容をgitにアップしてほしいのだが・・・
そういうオプションがあると思って調べてみたがなさそう


■ 参考 : symbolic link - シンボリックリンクされたフォルダにgitコミットファイルを作成するにはどうすればよいですか


■ 参考 : version control - Gitはシンボリックリンクをどのように処理しますか?

gitの代わりにGitBSLRというコマンドをインストールして使うとかファイルの場所をgit内に移すとかが提案されてる


シンボリックリンクじゃなくて、ハードリンクを貼れば解決する?
と思って
ln /home/foo/hoge.txt .
としてみたけど、なぜかオリジナルのhoge.txtが更新されても手元にhoge.txtは更新されない・・・
ハードリンクは別のアカウントが作ったファイルだと機能しないのか?
それとも何か勘違いしてるのかも

(未解決)







■ 参考 : スラッシュを置換してみる

によると、#を区切り文字に使えばいいらしい
そうすると s/aaa/bbb/g が s#aaa#bbb#g と書ける
aaaの中に/が入ってても動くようになる
echo "/123/" | sed "s#/#abc#g"
abc123abc






■ 参考 : 他大学で非常勤講師をすると確定申告が必要|提出締切は3月15日

によると、「A大学での非常勤講師給与が15万円の場合」は確定申告は不要
ただ、気になるのはこれは2018年の記事ということ・・・
国税局への外部リンクも古くてなくなってるので、念の為裏取りしておく






■ 参考 : No.1900 給与所得者で確定申告が必要な人

国税局のQ&Aがまとめられていた
2か所以上から給与の支払を受けている人で、主たる給与以外の給与の収入金額と給与所得及び退職所得以外の所得の金額の合計額が20万円を超える人

とあるので、非常勤講師の給与が20万円以下なら大丈夫だと思う
自分の場合は (時給) x 2 x 16 なので余裕で大丈夫だった

しかも後期だけなはずなので、まだ3ヶ月分しか給与をもらってないしなおさら大丈夫






■ おまけ

税金に関してのツイートをメモする場所




















ただの自分用のメモなので、合ってるかは保証できません
各自で調べて使ってください


net force : 合力

全微分 : total derivative, total differential

operator : 演算子

保存力 : conservative force

hydrostatic equilibrium : 静水圧平衡
hydrostatic equation : 静水圧方程式

differential equation : 微分方程式









rm(list=ls())

■ 参考 : Rで使わない変数を消す





1. 機内持ち込みできるサイズのスーツケース

使ってる色はロイヤルブルーってやつ
大きさ, 耐久性, 色, 軽さ どれをとっても素晴らしかったです
ちなみに1年前の11月に買って、今年の11月ぶ取っ手の部分がぶっ壊れました
当時キャンペーンで3600円ほどで買えたので元は取れたかなと満足

またおんなじのをリピート購入して使ってるところ

■ 外部リンク : スーツケース【 Sサイズ 】1日~3泊 TS…



2. Twelve South PlugBug Duo

https://coffeepote.tumblr.com/post/189941812138

Macbookの電源アダプタに、USBの充電器を2箇所も増設できるアダプター
壁のコンセントに刺さる部分が日本だけじゃなくて世界中のタイプが同封されてる(タイプA, B, C, BFとか)

前者だけでもお得なのに、後者のおまけのおかげで変換ケーブルなしで海外出張しても
Macbookの電源ケーブルからiPhoneやモバイルバッテリーの充電ができる

無敵である。

自分が買ったときは6400円だったけど、今は7000円になってるっぽい
appleの公式サイトでも取り扱いしてる


■ 外部リンク :
TWELVESOUTH
Twelve South PlugBug Duo MacBook iPad 海外用コンセント対応 拡張電源アダプタ








3. エドウィンのジーンズ

5年くらい(?)履いてたジーンズの股の部分に穴が空いてるのに気づいて新調することに
ジーンズの名前を見てみるとEDWIN
502zと書いてあった

どこで買ったか覚えてねぇ〜

こんなに長く履けるんだから丈夫なんだろう・・・と思って、エドウィンのジーンズを2本ネットで買ってみることに
裾上げは自分で測定して伝えると無料でしてくれるけど
もしサイズが違ってちょんちょんになった場合目も当てられないので
裾上げなしで送ってもらってこっちでやることに (+2500円)

買ったモデルは503と402
どっちも紺色

とても良い買い物をした
もう一生エドウィン買うわ



4. アリメツ

https://coffeepote.tumblr.com/post/189941815838


言わずとしれた蟻抹殺用アイテム
パッケージに「理想的殺蟻剤」と書いてある
実際、そのとおりだから困る

蟻に困った際はこれをベランダに少し垂らしておくと、本当に蟻がいなくなる

■ 外部リンク :
【 送料無料 】 アリメツ 殺虫剤 アリ 蟻 不害虫 駆除 巣 全滅 殺虫剤



なぜこのアリメツが必要になったかは以下を参考にどうぞ


■ 過去記事 : 【雑記】とあるポスドクのアリ討伐記録 その1



5. コンバース CHUCK TAYLORモデル

ここ10年ほどはずっとコンバースを使ってる
青, 黒, 灰色みたいなクラシックモデルを交互に買って1年ほどで穴が空いて・・・
ってのを繰り返してたけど、新しいモデルを見つけた

■ 外部リンク : CHUCK TAYLOR - CONVERSE


色の種類がとても豊富
インソールがクラシックモデルのものとはちょっと違って弾力性がある
なので、足が少し楽
ただ、分厚いソールなので本来買ってるサイズよりも1つ大きいサイズを買う必要があった




6. 【アサヒ ウィルキンソン タンサン】250ml缶

2019年は家でハイボールをたまに飲むことがあった
そのときに、500mlの炭酸を買って使ってては余って困る・・・
なので、250mlの缶が割と便利でオススメ

ただ、最近は炭酸をそのまま飲むことに何の抵抗もなくなってきたので
500mlを買ってきて余ったら水代わりに飲むのもアリかなと思ってる・・・

まぁ使い切れるサイズなのはかなり便利
スーパーやドンキではめったに見つからないのでネットで買っておくと吉



7. ワールドトリガー

高校のときの友達と上野で飲んでたときに「これまじでオススメやから読め」と言われて買ってみた

面白すぎた・・・

FPSとかTPSのVCありクラン戦をやったことある人には超オススメ
今月21巻が発売されました(発売日に同じ友人と偶然飲んでてその場で電子書籍で注文した。)







ffmpeg -i input.mp3 -vn -af "atempo=1.2" output.mp3

で1.2倍




(Cの話なのでCカテゴリで)




■ 状況
1. ~/local/lib/以下にhogeというライブラリがインストールされている
2. ~/local_foo/lib以下にhogeというライブラリがインストールされている
3. PKG_CONFIG_PATHが~/local/libに通っているのが問題かと思って
PKG_CONFiG_PATHを空にして(unsetenv PKG_CONFiG_PATHしても)
コンパイルオプションに
LDFLAGS = -L/home/myname/local_foo/lib -lhoge
を追記してもダメ
どうやってるのかわからんが勝手に~/local_foo/libにあるhogeライブラリを見つけて来てしまう
ちなみに、実際にリンクされてるライブラリは
ldd [実行ファイル]
で調べられる

Macなら
otool -L [実行ファイル]

今回解決方法がわかったのでメモ

コンパイル時に
LDFLAGS="-L/home/myname/local_foo/lib -Wl,-rpath /home/myname/local_foo/lib"
を追加すればOK
ダブルコーテーションはなくても動いた

コンパイル後にlddでちゃんと正しい方にリンクされていれば成功



■ 参考 : Linux: ライブラリの動的リンクでエラーが出た場合の対処方法







try :
 なんか処理
except :
 エラーが起こったときの対応
って書く

exceptのときに何が起こったのかエラーメッセージを取り出したい
ちなみにexceptのあとにエラーの種類によって細かく処理を分けることも可能
except IOError:
とか



exceptに分岐したときのエラーメッセージを知りたいときはsysかtracebackを使えばいい
import sys
try :
 なんか処理
except :
 print(sys.exc_info())
とか
import traceback
try :
 なんか処理
except :
 traceback.print_exc()
とか

後者のtracebackはなんかうまくいかなかった・・・







(2020/05/07 追記)

さらに詳しいエラーメッセージを出したいときは
except Exception as e:
 t, v, tb = sys.exc_info()
 print(traceback.format_exception(t,v,tb))
 print(traceback.format_tb(e.__traceback__))
って感じにする


■ 参考 : PythonのException発生時のTracebackを綺麗に見る











■ 参考 : 2. 文字列をリストに変換|split()メソッド
>>> hoge="AAA,BBB,CCC"
>>> hoge.split(",")
['AAA', 'BBB', 'CCC']

みたいな感じ
これで、htmlのフォームから渡されたオプションを区切って、pythonで使える









■ 参考 : クリックすると展開表示する"折りたたみメニュー"を簡単に作る方法


<div onclick="obj=document.getElementById('open').style; obj.display=(obj.display=='none')?'block':'none';">
<a style="cursor: pointer;">▼ クリックで展開</div>


<div id="open" style="display: none; clear: both;">
ここが折りたたまれてるところ
</div>

openと書いてあるIDはそれぞれ一致したものを使う
もしこの折りたたみを1つのhtmlで何個も用意するなら、別のIDを用いること
でないと変な箇所に展開されてしまう・・・











■ 参考 : 【Javascript】追記:input="date"に現在の日付(今日の日付)を設定


■ 参考 : テキストフィールドに現在の時刻を表示する
var date = new Date(); // 現在時刻を取得

var yyyy = date.getFullYear(); // 年だけを取得 getYear()よりもこっちの方がいいらしい
var mm = ("0"+(date.getMonth()+1)).slice(-2);
var dd = ("0"+date.getDate()).slice(-2);

var hour = date.getHours();
var min = date.getMinutes();
var sec = date.getSeconds();

// こっちでも動くのかもしれないけど、未テスト
// document.getElementById("today").value=yyyy+'-'+mm+'-'+dd;

document.form1.date_beg.value = yyyy+'-'+mm+'-'+dd;
document.form1.hour_beg.value = hour;
document.form1.min_beg.value = min;
document.form1.sec_beg.value = sec;

new Date()で現在時刻を取得
そっから必要な要素だけ抜き出してくる
最後にdocument.form1.xxx.value = yyy
でxxxというフォームにyyyという値を代入している






次はこれを現在時刻じゃなくて、3分前の時刻でやってみる
めんどくさいのは
現在時刻が13:02とかだと単純にmin-3をするだけではだめなこと
なので、ちゃんとDateの決まりに従ってやっていく


■ 参考 : [javascript]5分前の日時を取得する

によると、
var now = new Date();
var unix1 = now.getTime() - 5*60*000; // [ms]
var date1 = new Date(uni1);
このあとは上のコードと合流するので省略
みたいな感じ
(単位がミリ秒なので、1000掛ける必要がある)








↓にやりたいことがすべて書いてあった

■ 参考 : GET送信によるパラメータの受け渡し
<script type="text/javascript">
function getdata(){
if(window.location.search){
/* URLの「?」以降のパラメータを変数nに代入 */
var n=window.location.search.substring(1,window.location.search.length);
/* テキストボックスにパラメータを表示 */
document.form3.elements["getpram"].value=n;
}
}
/* オンロード時に実行 */
window.onload=getdata;


取得したパラメータ:


URLの?以下をそのまま全部取ってきてしまうので注意

name="getparam"

name="form3"
を自分の環境に置き換えればそのままで使えるはず

URLから複数のパラメーターを取り出したい場合は、もうちょっと他のこともしないといけないっっぽい





そのうち使うかもしれないのでメモ

■ 参考 : PythonのURLとクエリパラメータのパースまとめ












最初にやってた書き方
error_message = "This is failed. time ( " + str(gps_time +" ) should be smaller than...."
みたいな感じの書き方をしていた
gps_timeがint型だとすると、文字列に変換しないといけないので
str()を使う必要がある

この方法の欠点は、書き方が込みってしまうので
サクッと内容が理解できないこと






後々もっと便利な書き方があると知った

■ 参考 : Python3 文字列中に変数展開したい

print( 'Hello %s!' % 'World' )

area = 3.14 * 5 * 5
print("area is %f" % area )

hoge = 3
foo = 6
print( hogehoge = %d, foo = %f' % (cat, dog) )

って感じで、%を使う
%s : 文字列
%f : 浮動小数点(doubleとかfloat)
%d : 整数
%% : %を表示する
(%x : 16進法、%o : 8進法)

これらの代わりに最後にある変数を代入してくれる
2つ以上変数がある場合は( )で囲ってカンマで区切ればOK









いずれastropyを触ることがあったら、また詰まると思うのでメモしておく

■ 参考 : Quantity

astropy.units のドキュメント



こんな感じで物理の単位と数字をセットで取り回せる
>>> 1.25 / u.s
< Quantity 1.25 1 / s >
>>> [1, 2, 3] * u.m
< Quantity [1., 2., 3.] m> >
数字だけ、単位だけほしいときは、unitとvalueというメソッドを使えばいい
ずっとint()とかfloat()を使ってエラーが出て困ってた・・・・
>>> q = 2.5 * u.m / u.s
>>> q.unit
Unit("m / s")
>>> q.value
2.5
使いこなせば便利そうではある・・・柄こなせれば・・・・



■ 参考 : Astropyで宇宙論的な計算を行う

astropyでできることの日本語での説明
わかりやすい






(2020/02/27 追記)

またこの問題に遭遇したので大事な部分を赤字にしとく





import cgi
import cgitb
form = cgi.FieldStorage()
print('Content-Type: text/html; charset=UTF-8\n')
でhtmlフォームからの入力を取り出すことができる
すべての入力はformに入っている

printの行はとりあえず書いておく必要があるらしい





python2では
if formdata.has_key("op"):
 op = formdata['op'].value
else:
 print "op not found"
 show()
 sys.exit(1)

みたいにして書いていたらしい
has_key()ってめっちゃ簡単やんと思ってた調べてたけど、古い情報だったらしい

■ 参考 : cgi.FieldStorage() and .has_key() in Python3







同じページにやりたいことが書いてあったけど、
form = cgi.FieldStorage()
if 'hoge' in form:
 val_hoge = form['hoge'].value

みたいな感じでいいらしい

ただここで2時間ほどハマったのが、
formの内容が["hogehoge", "foo"]のときに"hoge"があると判断されてしまうということ・・・

print("hoge" in "hogehoge")
True
↑みたいに in は部分一致かを調べる

先頭の部分が一致してるかどうかを調べるには
import re
で re.match を使えばいいらしい
今回はそのまま in を工夫して使ってトラブル解決した










# local変数があるかの確認には
if 'myVar' in locals():
# myVar exists.

# グルーバル変数があるかの確認には
if 'myVar' in globals():
# myVar exists.





■ 参考 : GAS(Google Apps Sprict)でスクリプトエディタが開けない時の対処法(現在、ファイルを開くことができません)

複数のアカウントでログインしてるときにこうなるらしい
スプレッドシートの所有者のアカウントをデフォルトにする必要があるらしい

めんどくさいので、シークレットモードでブラウザを開いてスクリプトエディタを編集すればOK









2つのテキストファイルを結合する必要があった
コマンドラインでいうところのcat

そんなに重いファイルじゃないから、cat hoge1.txt hoge2.txt > merged.txt みたいな感じのコマンドをシェルを呼び出す関数で実行しようと思ってた

が、いくらやってもうまく行かない・・・

■ 参考 : シェルコマンドを実行する

subprocess.call('cat hoge1.txt hoge2.txt > merged.txt ')でいけるかと思ってました

が、subprocessでリダイレクトとかパイプを使うのは大変っぽい


一応、subprocessだけでもできるらしい・・・
■ 参考 : subprocessモジュールでリダイレクト(>, >>)を実現する


しょうがないので、2つのテキストを開いて、1つにまとめる方法でやる。

■ 参考 : Pythonはテキストファイルを連結する


filenames = ["hoge1.txt"', "hoge2.txt"]
with open("merged.txt", 'w') as outfile:
for line in itertools.chain.from_iterable(itertools.imap(open, filnames)):
outfile.write(line)

これで一応うまくいった
■ 参考 : Pythonでのグローバル(global)変数の宣言方法
var = 1
def add_ten(x):
global var
var = 10
print var + x

add_ten(2) # 12
print var # 10
↑のリンクから借りてきました

1. 関数の外で変数を使う
2. 関数の中でglobalをつけて変数を宣言する
3. 関数の中で変数を使う
4. 関数の外でもその値が代入されてる











ここに書かれていた方法で解決できた

■ 参考 : 【LIVA】【Ubuntu server14.04】apt-getでエラー発生(post-installationスクリプトエラー)

エラーの内容の確認
sudo dpkg --audit

--configureで実行してみる(どのパッケージが原因か大体わかる)
sudo dpkg --configure squid3

/var/lib/dpkg/info配下の関係するファイルを削除(どのファイルを消すべきかわからんけど、参考リンクでは以下の3種類の拡張子を消していた)
rm squid3.postinst
rm squid3.prerm
rm squid3.postrm

sudo rm -fr squid3.postinst squid3.postrm squid3.prerm

もう一度configureをしてみる
sudo dpkg --configure squid3


これでエラーメッセージが変わってるはず







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

print "生きてます"
print "コロナのせいで15万くらい損失出してますが、生きてます"

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

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

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

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

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

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

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

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

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

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

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

flickr難民の写真置き場
(20XX年、flickrは有料化の炎に包まれた。あらゆるflickr無料ユーザーは絶滅したかに見えた。 しかし、tumblr移住民は死に絶えてはいなかった。)

教授でもできるMac OS X へのLaTeX, X11, gccのインストレーションと環境設定
(阪大の山中卓さんのwebページ、タイトルにセンスが溢れている、内容は超充実してる、特にTeX関連、学振DCとかPDの申請書類作成時にはお世話になっております)

英語論文執筆用の例文検索サービス
(とんでもないものを見つけてしまった・・・・ arXivに収録されている 811,761報の 英語論文から,例文を検索するための検索エンジン)


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