忍者ブログ
物理学者(ポスドク)による日々の研究生活のメモ書きです ( python/emacs/html/Japascript/シェルスクリプト/TeX/Mac/C言語/Linux/git/tmux/R/ポケモンGO)
最近csvをちょいちょい触ることがある
とりあえずMacなのでNumberでちょいちょいデータを見る

平均値と標準偏差は、そのセルをマウスで範囲選択すれば、一番下のstatus berっぽいところに表示される
標準偏差はてっきりstdevだと思ってたけど違った




(2022/04/08 追記)

疲れてた色々とごっちゃになってる
上に書いてるのは逆です




stdevpの結果は標準偏差
n個のサンプルの平均値と各サンプルの差の二乗和をnで割って、ルートを取る

stdevの結果は不偏標準偏差
n個のサンプルの平均値と各サンプルの差の二乗和を(n-1)で割って、ルートを取る

1, 2, 3のn=3サンプルで計算すると
stdevp=sqrt(2/3)=0.816...
stdev=sqrt(2/2)=1

になった(Numbersでは)






PR

元BOSSが使ってるのをちらっと見て、便利だなぁ〜と思ったので情報収集してみた

■ 参考 : Version History (Testing Channel) @MacDown

Mac Downのページでv0.7.3をインストールすれば、Mermaidはそのまま使えるた
ただ、2020年1月で更新が止まってるのでセキュリティ的に問題があったりとかは怖い・・・(が、わからないのでまぁいいでしょう)

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

環境設定を開いて、Mermaidと書いてあるところにチェックを入れれば描画されるはず





mermaidの表記ルールは以下を参照

■ 参考 : mermaid.jsのフローチャートの書き方

■ 参考 : Diagrams as Code: Mermaid







from csv import writer

csvname="hoge.csv"
csvline=[a, b, c]

# only for the first time
if not os.path.exists(csvname):
 csvline_header=["a_value", "b_value", "c_value"]
 with open(csvname, 'a', newline='') as f:
  writer_object = writer(f, lineterminator='\n')
  writer_object.writerow(csvline_header)
  f.close()

with open(csvname, 'a', newline='') as f:
 writer_object = writer(f, lineterminator='\n')
 writer_object.writerow(csvline)
 f.close()
こんな感じで良いらしい
1回目はヘッダーを書き出すために、1度だけ実行する
2度目以降はファイルがあるので実行しない

a, b, cとかに書き出したい値を入れればOK







(2023/01/06 追記)

f.close()はwithで開いているので不要だと思う





(2023/08/28 追記)

書き出したcsvファイルの行末に、 ^M$ みたいなものがつくときがある
これは、CRLFというのが改行コードになっているから

■ 参考 : Pythonのcsvモジュールで出力されるファイルの改行コードをLFにする

↑のコードを一部修正して、lineterminator='\n'を追加した
writer_object = writer(f, lineterminator='\n')







import shutil
shutil.copy('dir1/hoge.txt', ''dir2/hoge.txt')

みたいな感じであるディレクトリの同じ名前のファイルをコピーしたい。

けどこのcopyさんはファイルの中身が同じだと、エラーを出してしまう(そんなチェックいらんやろ・・・)



ググった感じ、お手軽な解決方法はなかった。
オプションを1つ追加するとかでなんとかなるかな〜と思ったけど、tryとexceptとかなんでコピーするだけでそんなことをしないといけないのかw

■ 参考 : Disable SameFileError exception in shutil.copy





めんどくさかったので、シェルを呼び出してcpを呼び出した
import subprocess
cmd='cp dir1/hoge.txt dir2/hoge2.txt /dev/null 2>&1'
subprocess.run(cmd, shell=True)







(タイトルにDebian8って付いてるのは今回触ったサーバーがDebian8だったからです。おそらくDebian10でもそのまま動くと思われる)


■ inofity-toolsのインストール
% sudo apt install inotify-tools
■ あるディレクトリを監視する
% inotifywait -m -e "ATTRIB" --format '%T %w%f (%e)' --timefmt '%F %T' -r ./
この例ではカレントディレクトリ以下を再帰的に監視する
そこにのファイルがアクセス件やタイムスタンプなどのメタデータが変更されたときに、画面に表示される
touch hoge.txt
とかでテストできる


-rオプション
再帰的にディレクトリを調べる

-mを付けると、監視をずっと継続してくれる(おそらくmonitorの略)
これを付けないと1度画面表示したら終了してしまう

--formatは画面表示の形式を選べる
--timefmtは時間の表示形式
(今回はこれらはログとして残すだけなのであんまり関係ない)

-eで選べるイベントはヘルプによると
Events:
access file or directory contents were read
modify file or directory contents were written
attrib file or directory attributes changed
close_write file or directory closed, after being opened in
writable mode
close_nowrite file or directory closed, after being opened in
read-only mode
close file or directory closed, regardless of read/write mode
open file or directory opened
moved_to file or directory moved to watched directory
moved_from file or directory moved from watched directory
move file or directory moved to or from watched directory
create file or directory created within watched directory
delete file or directory deleted within watched directory
delete_self file or directory was deleted
unmount file system containing file or directory unmounted
日本語の説明↓
使うのは
modify : ファイルが修正されたとき
create : ファイルが新規作成されたとき
くらいかな?

■ 参考 : inotify-toolsでファイルやディレクトリを監視する


さらに-oでファイルを指定すると、inotifyで出力されるログの出力先を指定できる
とりあえず /tmp/inotify.log とかでいいか?
-o /tmp/inotify.log

-qオプション
イベントのみを画面に表示したいとき



■ 監視ファイルの上限数

■ 参考 : NASのバックアップ対象ディレクトリをinotifyで監視して更新されたディレクトリのみをrsyncでミラーリング

自分の環境では8192ファイルになっていた
一応、上限は上げておいたほうが良いかも


本番環境ではなぜか65536になっていた・・・
これならまぁ十分でしょう




■ ファイルの拡張子に応じて動作を変更したい
inotifywaitのオプションにはそれらしきものはなかったので、ファイル名からそれを取り出して対応する
#!/bin/bash -e

LOGFILE=/tmp/inotify.log
DIR_WATCH=hoge

/usr/bin/inotifywait -m -r -e "ATTRIB" --format '%T %w%f (%e)' --timefmt '%F %T' $DIR_WATCH |
while read line; do
 echo "one event was detected." >> $LOGFILE 2>&1
 echo "$line" >> $LOGFILE 2>&1
 fname=`echo $line | awk '{print $3}'`
 extension=${fname##*.}

 [[ "$extension" == "png" ]] && {
 echo "process started.">> ${LOGFILE} 2>&1
 hogehoge.py $fname >> ${LOGFILE} 2>&1
 echo "process finished.">> ${LOGFILE} 2>&1
||{
 echo "$extension is out of support." >> ${LOGFILE} 2>&1
}
done
みたいな感じでよいのだろうか?

これをこの後サービス化するので、変なファイルを食わせたりしてエラーがきちんと起こるかどうかテストしてた
エラーが起こった時にプロセスが無限ループに入って、トラブらないかが問題

■ 参考 : 特定のフォルダに画像を保存するだけで、予め設定した縦横ピクセル数や画質の画像をオンデマンドで自動的に出力する処理をbashで書いてみる


■ 参考 : inotify-tools/inotify-tools (github)




■ サービス化

バックグラウンドで動かすには nohupと&を付けたら良さそう
けど、常時立ち上がってて、かつプロセスが死んだ時は勝手に立ち上がってほしい

(たぶんそういうのをサービス化とかデーモン化と言うんだろう、と理解してるが合ってるんだろうか?)

調べた感じ、inotifyにはその機能はデフォルトで入ってて、 -dを付けて走らせればいいと書いてあるがそれをやってもうまく行かない
よくわからないので、シェルスクリプトの中でinotifywaitを使って、それをサービスとして登録することにする


■ 参考 : systemdでデーモン化

■ 参考 : 今回のお題 - inotify でディレクトリを監視してみる

(どうでもいいけど、2つめの記事は2009年の記事らしい。内容の密度が半端ない。それに対して最近のアドセンスで稼ごうとしてる記事たちの内容の希薄さよ・・・)


一般的なsystemd関連のページ

■ 参考 : 自作したシェルスクリプトを Linux の systemd サービスとして起動する方法


(このあとsystemdのことをあれこれ調べて書いたけど、間違って消してしまったぁああああああああああ)

/etc/systemd/system 以下にサービスを作成する
ファイル名はサービス名.serviceにしておく
[Unit]
Description="serivice of monitoring directory and launching something"
Documentation=
# After=

[Service]
Type=simple
User=controls
Group=controls
Restart=on-failure
#Restart=always
RestartSec=2s
ExecStart=/home/hoge/run.sh

StandardOutput = syslog
StandardError = syslog
SyslogIdentifier = hogehoge

[Install]
WantedBy = multi-user.target
■ サービスの起動などのコマンドメモ
# サービスが認識されているかのチェック
systemctl list-unit-files --type=service

# サービスの自動起動をオンにする
sudo systemctl enable hoge

# サービスの状態を確認する
sudo systemctl status hoge

# サービスを止める
sudo systemctl stop hoge

# サービスを開始
sudo systemctl start hoge
なんかトラブルが起こってそうなら、statusの画面で一番下にエラーメッセージが表示される





(2022/10/17 追記)

サービスの設定ファイルを修正したときは

sudo systemctl restart hoge

ではダメ
Warning: Unit file of hoge.service changed on disk, 'systemctl daemon-reload' recommended.
みたいな警告が出ているはず

このときは警告に従って
sudo systemctl daemon-reload
とすればOK






■ (code=exited, status=217/USER)というエラーが出たら、これはサービスのファイル中のUserがおかしいとき

困ったら、sudo tail /var/log/syslog を見てみる





■ (code=exited, status=203/EXEC) というエラーが出たら、

これはpermissionの問題なので、
cd /etc/systemd/system
chmod 644 hoge.service
これを744にすると、systemdから
Please remove executable permission bits. Proceeding anyway.
のようなエラーが出てきた





(2023/02/15 追記)

rsyncでコピーしたファイルに対して、inotifyを使おうとしたがpermissionなどを含めてコピーする必要があった

crontabでrsyncすると、sudo権限が使えない

rsync -rlOtcv ....
みたいなオプションを使ったら解決した

■ 参考 : Jenkinsで成果物(artifact)をrsyncでコピーしようと思ったらエラーでJOBが失敗






■ 参考 : Pythonで深い階層のディレクトリを再帰的に作成するmakedirs
# 出力するフォルダを作成
if not os.path.exists(outdirname):
 os.makedirs(outdirname)

os.mkdir()だと、同じ階層にしかディレクトリが作れないが、os.makedirs()だと再帰的に作ってくれる

コマンドラインのmkdir -p みたいなもん








sudo chown -Rh username:username new_dir

みたいな感じ

-Rは再帰的に変更する
-hはシンボリックリンクは、シンボリックリンクのみを変更する(なしだとシンボリックリンクをたどった先も変更する)

username:usernameは ユーザー名:グループ名
ls -ltとかで確認できる







はじめて画像解析をpythonのopen cvを使ってやることになったのでそのメモ


■ パッケージのインストール
conda install opencv
■ 初学者向けの使えそうなリンクメモ

■ 参考 : 【OpenCV/Python】OpenCVで細胞の画像解析をやってみた

■ 参考 : Python, OpenCVで画像ファイルの読み込み、保存(imread, imwrite)

■ 参考 : Python, OpenCV, NumPyで画像を二値化(しきい値処理)

しきい値のいろいろなオプション↓

■ 参考 : 画像のしきい値処理



■ ピクセルの取得

読み込んだ画像は2次元のピクセルへの通し番号とそのピクセルでの色の値が書かれている
ここでは、gray scaleにしてから解析するので、RGBの色情報を0~255に変換してから使う

読み込んだ画像の幅や高さは以下から

参考までに2822x4144の画像で10~22MBだった

■ 参考 : Python, OpenCV, Pillow(PIL)で画像サイズ(幅、高さ)を取得

画像のピクセルは(0, 0)から(height, width)まであるとすると、
(0, 0)の点は画像の左上
左下が(height, 0)
右下が(height, width)
右上が(0, width)
なことに注意

最後にプロットするときは少し反転などを加えないといけない
matplotlibのオプションで、xlimとylimを入れ替えれば良さそう


(2022/09/21 追記)

pngやtiffファイルをカラーで読み込んだ場合は、返り値は3つ
白黒として読み込んだら、返り値は2つ
height, width, _ = img.shape



■ 円を書きたいなら
cv2.circle(img, (190, 35), 15, (255, 255, 255), thickness=-1)
最後のticknessは-1なら塗りつぶし、0より大きい数字ならその太さの線になる
(190, 35) が円の中心
15が円の半径
単位はピクセル

長方形とかの場合は以下から

■ 参考 : Python, OpenCVで図形描画(線、長方形、円、矢印、文字など)




■ 円形のドーナツ型のフィルターを作って黒く塗りつぶしたい

良い例があった

■ 参考 :リング型のマスク画像を作る方法



■ 輪郭を取得する

■ 参考 :Python: OpenCVで画像から輪郭を検出する


■ 参考 :Python, OpenCVで輪郭検出をしてみる


■ 画像に文字を追加する

■ 参考 :画像処理 「OpenCV 4」で文字を描画してみる


■ opencvの色について

open cv上では色は
(255, 255, 255)が白
(0, 0, 0)が黒
(255, 0, 255)がマゼンタ
(255 , 0, 0)が青

cv2で画像を読み込むと色はBGRになっている(普通はRGB)
matplotlibではRGBなので注意が必要
それを踏まえて、matplotlibで表示するときは以下のような換算が必要
img_orig = cv2.cvtColor(img_orig, cv2.COLOR_BGR2RGB)

■ 参考 :Python, OpenCVでBGRとRGBを変換するcvtColor

















(2022/06/06 追記)

やっと必要になって、使ったので追記します
めちゃくちゃ大変でした・・・





まずはcsvから日付の部分を読み込む
日付データは 2022/03/28 というフォーマットになっている
これをdatetime型で読み込めば良さそうだけど、他の部分が実数で読み込まないといけないのでこういう実装にしてる

データを読み込んで文字列にする

/ を - に置換

datetime型として読み込む
本当はこのあとnumpyに戻したかったけど、そうするとdatetime型じゃなくなるので
しょうがないので、リストで扱うことに(ここでハマった。)
fname="hoge.csv"
if os.path.exists(fname):
a = np.loadtxt(fname, unpack=True, dtype="unicode", delimiter=',', skiprows=1)

mmdd=[]
data["date"] = a[1].astype(str)
tmp = np.char.replace(data["date"], "/", "-")
for (i, x) in enumerate(tmp):
mmdd.append(datetime.strptime(x, '%Y-%m-%d'))
# 時間要素があればここを書き換えれば良いと思う・・・

data["T"] = a[2].astype(np.float64)
これさえできればあとは
plt.plot(mmdd, data1)
みたいな感じでプロットすれば良いと思う



1週間ごとに点をx軸に打ちたいときは
plt.gca().xaxis.set_major_locator(mdates.DayLocator(interval=7))
plt.gca().xaxis.set_major_formatter(mdates.DateFormatter("%m-%d"))



datetime64
という型もあるらしくて、そっちで読み込もうとしてみたが、読み込んだあとの取り回しがまったくわからずに諦めた・・・




(ここから元のメモ)
from matplotlib.dates import DateFormatter

set_major_locator(mdates.DayLocator(bymonthday=(range(5, 28, 7))))
set_major_formatter(mdates.DateFormatter("%Y-%m-%d"))


set_major_formatter(DateFormatter('%m/%d\n%H:%M'))
とりあえずこのまま動かんけど、メモだけしとく

bymonthday=(range(5, 28, 7)
は、5~28を1週間ずつメモリを打つ

bymonthday=(range(7)
だと1, 8, 15, 22, 29とかになると思う





(2022/03/12 追記)

関係ありそうな記事を一応メモしておく

■ 参考 : matplotlib.datesで時系列データのグラフの軸目盛の設定をする

■ 参考 : matplotlibでx軸の時刻情報をフォーマットする

■ 参考 : matplotlib.dates










(2023/6/15 追記)

x軸の日付を範囲指定してプロットする範囲を制限したい時
from datetime import datetime

xmin='2022-03-28'
xmax='2022-06-01'
xmin = datetime.strptime(xmin, '%Y-%m-%d')
xmax = datetime.strptime(xmax, '%Y-%m-%d')
plt.xlim([xmin,xmax])









■ 参考 : matplotlib エラーバー付きのグラフを描く

errorbarという関数を使う
xとyにデータを入れて、yerrに縦軸方向のエラーの値を入れる
y_minが下側のエラー、y_maxが上側のエラー
from matplotlib import pyplot as plt
plt.figure(figsize=(10,7))
plt.errorbar(x, y, yerr = [y_min, y_max], capsize=5, fmt='o', markersize=10, ecolor='black', markeredgecolor = "black", color='w')





(2022/03/12 追記)

関係ありそうな記事を追記

■ 参考 :matplotlibで信頼区間(エラーバー)を描画

■ 参考 : Matplotlibで日付データをplot(グラフ)表示




■ 参考 : How to convert an array of strings to an array of floats in numpy?
import numpy as np

fname="hoge.txt"
a = np.loadtxt(fname, unpack=True, dtype=str)

y = a["x"].astype(np.float)
hoge.txtというテキストファイルを読み込む
このときdtypeで指定できる型は1種類のみ、何もしないとfloat64になるはず
これを文字列にすると、aの中身はすべて文字列のarrayになる

aの中のxという要素は実は文字列じゃなくて、数字なのでそれをastypeでfloatに変換して取り出せる






csvデータの読み込みに、import csvとかやっていたが使いにくい・・・
csvの1行目を辞書型のkeyにして、縦方向に読み込むものだと、思っていたら
csvというパッケージではすべて横方向に読み込んでしまうらしい

あれこれやり方を調べていたら、numpyのloadtxtはcsv読み込みにも使えるらしい
import numpy as np

fname="hoge.csv"
a = np.loadtxt(fname, unpack=True, dtype=str, dtype="unicode", delimiter=',', skiprows=1)

これだと、1行目は無視することになってる
たいがいcsvの1行目は、列の説明だと思うので(dateとかtemperatureとか)

本当はそれを辞書型のkeyにして読み込みたかったけどやり方がわからない










とりあえず補間ならなんでもいいけど、スプライン補間とかではなくてできるだけシンプルなのでOK

なので線形補間

■ 参考 : Scipy.interpolate を使った様々な補間法


コード例
from scipy import interpolate # to interpolate

x_out = np.linspace(min(x_in), max(x_in), n_samples)
fit_curve = interpolate.interp1d(x_in, y_in)
y_out = fit_curve(x_out)

x_inとy_inというデータがあるとする
それをx_inの最小値から最大値までn_samplesで等間隔に分けた点で補完する

fit_curveが補間の関数
これにx_outを食わせれば、そのx_outでのyの値がわかる

補間前のデータとの重ね合わせプロットなどは↑の記事を参照











ざっくり調べた感じ2つ方法がある

1つは japanize-matplotlib を使う方法

三重大学の奥村さんが記事にしてる

■ 参考 : プロット

ただし、このパッケージはpipでしかインストールできない
conda-forgeで探したけどない

なのでパス




もう1つは日本語fontを指定する方法

labelに日本語を使いたいときは、

■ 参考 : matplotlib.pyplotの日本語化


この記事のコマンドをpython上で走らせると、matplotlibで使える日本語フォントが表示される
自分のMacで実行してみた結果は以下
from matplotlib import font_manager
for i in font_manager.fontManager.ttflist:
 if ".ttc" in i.fname:
   print(i)
<Font 'PT Serif Caption' (PTSerifCaption.ttc) normal normal 400 normal>
<Font 'Chalkboard' (Chalkboard.ttc) normal normal 400 normal>
<Font 'Avenir' (Avenir.ttc) normal normal book normal>
<Font 'Marker Felt' (MarkerFelt.ttc) normal normal 400 normal>
<Font 'Iowan Old Style' (Iowan Old Style.ttc) normal normal roman normal>
<Font 'Gurmukhi MN' (Gurmukhi MN.ttc) normal normal 400 normal>
<Font 'Palatino' (Palatino.ttc) normal normal 400 normal>
<Font 'Malayalam Sangam MN' (Malayalam Sangam MN.ttc) normal normal 400 normal>
<Font 'Hiragino Sans' (ヒラギノ角ゴシック W8.ttc) normal normal 700 normal>
<Font 'American Typewriter' (AmericanTypewriter.ttc) normal normal 400 normal>
<Font 'Sinhala Sangam MN' (Sinhala Sangam MN.ttc) normal normal 400 normal>
<Font 'Bangla Sangam MN' (Bangla Sangam MN.ttc) normal normal 400 normal>
<Font 'Kefa' (Kefa.ttc) normal normal regular normal>
<Font 'Hoefler Text' (Hoefler Text.ttc) normal normal 400 normal>
<Font 'Menlo' (Menlo.ttc) normal normal regular normal>
<Font 'Didot' (Didot.ttc) normal normal 400 normal>
<Font 'KufiStandardGK' (KufiStandardGK.ttc) normal normal regular normal>
<Font 'PT Serif' (PTSerif.ttc) normal normal 400 normal>
<Font 'Cochin' (Cochin.ttc) normal normal 400 normal>
<Font 'Myanmar MN' (Myanmar MN.ttc) normal normal 400 normal>
<Font 'Hiragino Sans' (ヒラギノ角ゴシック W2.ttc) normal normal 400 normal>
<Font 'Bodoni 72 Oldstyle' (Bodoni 72 OS.ttc) normal normal book normal>
<Font 'Raanana' (Raanana.ttc) normal normal 400 normal>
<Font 'Kohinoor Telugu' (KohinoorTelugu.ttc) normal normal 400 normal>
<Font 'Sana' (Sana.ttc) normal normal regular normal>
<Font 'Hiragino Sans' (ヒラギノ角ゴシック W0.ttc) normal normal 400 normal>
<Font 'Kannada Sangam MN' (Kannada Sangam MN.ttc) normal normal 400 normal>
<Font 'Athelas' (Athelas.ttc) normal normal regular normal>
<Font 'SignPainter' (SignPainter.ttc) normal normal 400 normal>
<Font 'Helvetica Neue' (HelveticaNeue.ttc) normal normal 400 normal>
<Font 'Shree Devanagari 714' (Shree714.ttc) normal normal 400 normal>
<Font 'Times' (Times.ttc) normal normal roman normal>
<Font '.Helvetica Neue DeskInterface' (HelveticaNeueDeskInterface.ttc) normal normal regular normal>
<Font 'Muna' (Muna.ttc) normal normal regular normal>
<Font 'Thonburi' (Thonburi.ttc) normal normal 400 normal>
<Font 'Mshtakan' (Mshtakan.ttc) normal normal 400 normal>
<Font 'Devanagari Sangam MN' (Devanagari Sangam MN.ttc) normal normal 400 normal>
<Font 'InaiMathi' (InaiMathi-MN.ttc) normal normal 400 normal>
<Font 'New Peninim MT' (NewPeninimMT.ttc) normal normal 400 normal>
<Font 'Noteworthy' (Noteworthy.ttc) normal normal light normal>
<Font 'Oriya MN' (Oriya MN.ttc) normal normal 400 normal>
<Font 'Geeza Pro' (GeezaPro.ttc) normal normal regular normal>
<Font 'Savoye LET' (Savoye LET.ttc) normal normal 400 normal>
<Font 'Hiragino Sans' (ヒラギノ角ゴシック W3.ttc) normal normal 400 normal>
<Font 'Superclarendon' (SuperClarendon.ttc) normal normal regular normal>
<Font 'Tamil Sangam MN' (Tamil Sangam MN.ttc) normal normal 400 normal>
<Font 'Khmer MN' (Khmer MN.ttc) normal normal 400 normal>
<Font 'Helvetica' (Helvetica.ttc) normal normal 400 normal>
<Font 'Hiragino Sans GB' (Hiragino Sans GB.ttc) normal normal 400 normal>
<Font 'Bodoni 72' (Bodoni 72.ttc) normal normal book normal>
<Font 'Waseem' (Waseem.ttc) normal normal regular normal>
<Font 'Bangla MN' (Bangla MN.ttc) normal normal 400 normal>
<Font 'PT Sans' (PTSans.ttc) normal normal 400 normal>
<Font 'Hiragino Sans' (ヒラギノ角ゴシック W7.ttc) normal normal 700 normal>
<Font 'Hiragino Maru Gothic Pro' (ヒラギノ丸ゴ ProN W4.ttc) normal normal 400 normal>
<Font 'Chalkboard SE' (ChalkboardSE.ttc) normal normal light normal>
<Font '.Arabic UI Text' (ArabicUIText.ttc) normal normal regular normal>
<Font 'Kannada MN' (Kannada MN.ttc) normal normal 400 normal>
<Font 'Lucida Grande' (LucidaGrande.ttc) normal normal 400 normal>
<Font 'Copperplate' (Copperplate.ttc) normal normal 400 normal>
<Font 'Papyrus' (Papyrus.ttc) normal normal 400 condensed>
<Font 'Al Nile' (Al Nile.ttc) normal normal 400 normal>
<Font 'Lao MN' (Lao MN.ttc) normal normal 400 normal>
<Font 'Baskerville' (Baskerville.ttc) normal normal 400 normal>
<Font 'Sukhumvit Set' (SukhumvitSet.ttc) normal normal 400 normal>
<Font 'Hiragino Sans' (ヒラギノ角ゴシック W4.ttc) normal normal 400 normal>
<Font 'Nadeem' (Nadeem.ttc) normal normal regular normal>
<Font 'Arial Hebrew' (ArialHB.ttc) normal normal 400 normal>
<Font 'Hiragino Sans' (ヒラギノ角ゴシック W1.ttc) normal normal 400 normal>
<Font '.Aqua Kana' (AquaKana.ttc) normal normal 400 normal>
<Font 'Noto Nastaliq Urdu' (NotoNastaliq.ttc) normal normal 400 normal>
<Font 'Hiragino Sans' (ヒラギノ角ゴシック W5.ttc) normal normal 700 normal>
<Font 'Gurmukhi Sangam MN' (Gurmukhi Sangam MN.ttc) normal normal 400 normal>
<Font 'Gujarati MT' (GujaratiMT.ttc) normal normal 400 normal>
<Font 'Kohinoor Devanagari' (Kohinoor.ttc) normal normal regular normal>
<Font 'Gujarati Sangam MN' (Gujarati Sangam MN.ttc) normal normal 400 normal>
<Font 'Hiragino Sans' (ヒラギノ角ゴシック W9.ttc) normal normal 700 normal>
<Font 'Corsiva Hebrew' (Corsiva.ttc) normal normal 400 normal>
<Font 'PT Mono' (PTMono.ttc) normal normal bold normal>
<Font 'Marion' (Marion.ttc) normal normal regular normal>
<Font 'Snell Roundhand' (SnellRoundhand.ttc) normal normal 400 normal>
<Font 'Heiti TC' (STHeiti Light.ttc) normal normal light normal>
<Font 'Hiragino Mincho ProN' (ヒラギノ明朝 ProN.ttc) normal normal 400 normal>
<Font 'Beirut' (Beirut.ttc) normal normal regular normal>
<Font 'Devanagari MT' (DevanagariMT.ttc) normal normal 400 normal>
<Font 'Kohinoor Bangla' (KohinoorBangla.ttc) normal normal 400 normal>
<Font 'Heiti TC' (STHeiti Medium.ttc) normal normal medium normal>
<Font 'Futura' (Futura.ttc) normal normal medium normal>
<Font 'Phosphate' (Phosphate.ttc) normal normal 400 normal>
<Font 'Oriya Sangam MN' (Oriya Sangam MN.ttc) normal normal 400 normal>
<Font 'Seravek' (Seravek.ttc) normal normal 400 normal>
<Font 'Charter' (Charter.ttc) normal normal roman normal>
<Font 'Telugu MN' (Telugu MN.ttc) normal normal 400 normal>
<Font 'Diwan Kufi' (Diwan Kufi.ttc) normal normal regular normal>
<Font 'Songti SC' (Songti.ttc) normal normal black normal>
<Font 'Kailasa' (Kailasa.ttc) normal normal regular normal>
<Font 'Avenir Next Condensed' (Avenir Next Condensed.ttc) normal normal bold condensed>
<Font 'Malayalam MN' (Malayalam MN.ttc) normal normal 400 normal>
<Font 'Damascus' (Damascus.ttc) normal normal regular normal>
<Font 'PingFang HK' (PingFang.ttc) normal normal regular normal>
<Font 'Avenir Next' (Avenir Next.ttc) normal normal bold normal>
<Font 'Euphemia UCAS' (EuphemiaCAS.ttc) normal normal 400 normal>
<Font 'Myanmar Sangam MN' (Myanmar Sangam MN.ttc) normal normal 400 normal>
<Font 'Hiragino Sans' (ヒラギノ角ゴシック W6.ttc) normal normal 700 normal>
<Font 'Sinhala MN' (Sinhala MN.ttc) normal normal 400 normal>
<Font 'ITF Devanagari' (ITFDevanagari.ttc) normal normal book normal>
<Font 'Al Bayan' (AlBayan.ttc) normal normal 400 normal>
<Font '.Arabic UI Display' (ArabicUIDisplay.ttc) normal normal black normal>
<Font 'DecoType Naskh' (DecoTypeNaskh.ttc) normal normal regular normal>
<Font 'Gill Sans' (GillSans.ttc) normal normal 400 normal>
<Font 'Telugu Sangam MN' (Telugu Sangam MN.ttc) normal normal 400 normal>
<Font 'Optima' (Optima.ttc) normal normal regular normal>
<Font 'Tamil MN' (Tamil MN.ttc) normal normal 400 normal>
<Font 'Apple SD Gothic Neo' (AppleSDGothicNeo.ttc) normal normal regular normal>
<Font 'Farah' (Farah.ttc) normal normal regular normal>
<Font 'Baghdad' (Baghdad.ttc) normal normal regular normal>
<Font 'Al Tarikh' (Al Tarikh.ttc) normal normal regular normal>
いっぱい表示されるけど、日本語っぽいのはヒラギノくらいだった
色々と試したけど、Herveticaとヒラギノくらいしか成功しなかった・・・・


これをコードの上の方に書いておけばOK
import matplotlib as mpl
mpl.rc('font', family='Hiragino Sans')
(mpl.rcParams['font.family] のように書いてもいけるらしい)

(自分はなぜかこれを書かなくても日本語が表示されるようになってしまってよくわからないことになった・・・)

または
pylab.ylabel(r"あああああああ",fontsize=30, fontname='Hiragino Sans')
と必要なところだけ書いても良い







labelじゃなくてlegendの場合は、
pylab.legend(loc='upper right', prop={"family" :'Hiragino Sans'})
のように指定する、少し特殊





(2022/03/11 追記)

師匠からコメントをもらったので追記
最近は別のサーバーでjupyter noterbookを立ち上げて使うことがほとんどだから自分にはあまり関係がないけど、Macユーザーの場合は1度書いておけば楽ですね
自分の環境にも ~/.matplotlib というディレクトリはあることは確認
# matplotlibの日本語
macは ~/.matplotlib/matplotlibrc に書いときゃOK

cd ~/.matplotlib
echo "font.family : Hiragino sans" >> matplotlibrc





探してもすぐに出てこなかった・・・

javascriptに以下のような関数を書いておく
function clickBtn_search_channel(){
hoge_link = document.getElementById("hoge").value;
url= "http://somwehere?arg1=" + hoge_link;
window.open(url, "_self")
}


htmlにはボタンを押したときにその関数が実行されるようにしておく
<input type="button" value="search for channel" onclick="clickBtn_search_channel()">

今回は、フォームに代入された値(hoge)を元に、urlを開くのでこの方式で実装した







ndarrayに文字列のリストが詰まっている
その文字列の中にあるキーフレーズが含まれているかどうかを検索して、そのindexを取得して、
その文字列を取り出し、必要な部分のみ切り出したい

最初は1度リストに変換してから、inを使って判定してたけど
ndarrayの検索機能を使ったほうが早いのでは?と思い直した

ndarrayの検索機能といえば、np.whereだな・・・と思ったけど、inは使えないっぽい
==とか大小関係なら使えるが、今回は文字列のndarrayだからだめなのかな?(なんかこういうことは前にもあったような・・・)






■ 参考 : numpy.char.find

numpy.char.findを使えば良さそう

aが文字列のndarray
a_keyが検索するキーワードとして、
b = a[np.char.find(a, a_key) != -1]

これで、bにa_keyが入っているリストができる
あとは思いのままに処理してください。
a_keyが入っている最初の要素がほしいならb[0]で良い

!= -1としているのは、a_keyが入っていない要素には、-1が返ってくるから(a_keyが入ってると0だったと思う)









awkのセパレーターはデフォルトでは スペース になってるはず
それを他のに変えるには、
awk -F- 'print $2'
みたいな感じで -F オプションを使う

2つ以上指定したいときは | で分ける
この例だとaとbがセパレーターになってる。これは鬼便利そう
1文字ずつじゃなくて、文字列でも指定できる。その場合は | で分けないとだめ
awk -F'a|b' 'print $2'
または
awk -F'[ab]' 'print $2'
みたいな感じで -F オプションを使う

-Fの引数は、2文字以上だと正規表現として認識されるらしい








■ 参考 : シェルスクリプトでファイルに特定の文字が含まれているかどうかを高速に判定する方法

if grep 99 test.txt >/dev/null; then
echo EXIST.
fi

または

grep -q 99 test.txt && echo EXIST.

grep -qのほうが早いと↑の記事には書いてあった

とりあえずメモ




基本的にバッファローに従っておけばOK

■ 参考 : 外付けハードディスク/SSDのフォーマット手順(Mac)


ディスクユーティリティで、初期化(フォーマット)をする
名前は適当につける
フォーマットは 「Mac OS 拡張(ジャーナル)」
方式 「GUIDパーティションマップ」

完了したら、TimeMachineのバックアップディスクとして選択すればOK

昔は、パーティションを分けたりしてたけど、そこまで外付けとして使わないしいいや・・・という結論に達した





(2022/0/3/11 追記)

師匠からありがたいコメントをもらったので追記
# Macの外付けドライブ
BigSur以降なら、APFSでフォーマットするとTimeMachine爆速に変わるよ。
特にSSD。






jqをインストールすれば楽だけど、共有マシンの場合はかんたんにインストールできない

一応、conda環境にインストールするという手もあるが・・・・




ワンライナーで
cat hoge.json | python -m json.tool
jsonファイルに改行やスペースが追加されてて見やすい


とりあえずaliasに登録しといた
alias jq='python -m json.tool'





ただ、jqはjqで便利そうなんだよなぁ・・・
個別の要素を表示したり、要素数を取り出したり・・・

けど、そこまでやるならpythonでやったほうが楽じゃない? という説はある
あと、↑のワンライナーにawkの合せ技で同じことをできるやろうし

■ 参考 : jqコマンド(jsonデータの加工, 整形)の使い方








https://coffeepote.tumblr.com/post/676752320763232256
わーい

■ 過去記事 : 【祝】20万アクセスありがとうございます

20万は1/2だったので、1ヶ月半くらいか





javascriptで、フォームの入力をトリガーになにかすることができるっぽい

フォームの入力が変更されたときの挙動はinputとchangeの2種類がある
inputは入力中随時、それに応答する
changeは入力が完了してフォーカスが外れたり、エンターが押されたときに応答する

■ 参考 : フォームが入力されたタイミングで処理を実行する


実際のコードは以下を参照

■ 参考 : 値の変更イベント

コードは↑から借りた
const inputText = document.contactForm.inputText;

inputText.addEventListener("change", () => {
console.log("値が変更された");
})

inputText.addEventListener("input", () => {
console.log("キーが押された");
})
document.contactFormのcontactForm自分で書いたformのnameなので、それに応じて変更する

document.contactForm.inputTextのinputTextは、フォーム全体の中のどの入力フォームかを指定するもの、入力のnameを書く

やりたいのは、フォームに値が入力されたとき、それを他のフォームにもコピー
中括弧の中にやりたいことを書く
inputText.addEventListener("change", () => {
 console.log("Updated value");
 document.form1.date_end.value = document.form1.date_beg.value;
 document.form1.hour_end.value = document.form1.hour_beg.value;
 document.form1.min_end.value = Number(document.form1.min_beg.value) + 2;
})

自分の場合、時刻のフォームが2つあって、
最初の開始時刻のフォームに書かれたものを終了時刻のフォームにコピーする
ただし、分は2分後
Number はjavascriptの仕様的に、文字列を数字に変換してから四則演算しないといけないので必要





OSは、mac OS Monterey 12.2.1

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


環境設定 → キーボード → キーボード → 「地球マークを押して:」を修正








数年前から株や投資信託を始めてる

投資信託は積立しとけば、勝手にいい塩梅でやってくれるのでありがたい
下がってたら、手で買い増ししたりしてやってる

株は、長期目線でで何個か保有してる
夢の配当で年100万円もらえる生活とかしてみたかったけど、そう簡単にはいかないね・・・・
一応理論的には利回り5%で2000万円分の株を変えば毎年100万もらえるんだが、景気が良くないからねえw

株で出した損失は、3年間繰越して、税金をへらせる。
そのために確定申告を今年もやった。


基本的にこの動画の通りにやればOK
米株の配当とかをもらってる場合は、日本の税金(20%)とアメリカの税金(10%)が掛かるけど、
確定申告すれば、なんかお得になるとかだったはず
今年は自分は米株は買ってなかったので関係ないけどあとこの動画では、書類を印刷して郵送する方式でやってたけど
そのまま電子申請もできる

本人確認はマイナンバーカードでできる。
Macのsafariで申請を進めていくと、2次元コードが出てくるので、
それをiPhoneで読み込む→マイナポータルというアプリ+マイナンバーカードで本人確認

なんという便利な時代になったんでしょう・・・申請完了したとおもったら、口座情報がおかしかったらしい
たぶんUFJの銀行名を古いのにしたせいかな?
その場で確認してくれたらいいのに・・・後日修正予定


株以外に確定申告が関係あるのは
・ふるさと納税
・非常勤講師

ふるさと納税は↑の動画中に説明があるので、そのとおりにすればOK

非常勤講師は20万円超えていなければ申告不要(なはず)

■ 参考 : 【雑記】本業に加えて非常勤講師をしていてる場合は確定申告が必要かどうか





(2022/04/15 追記)

書くの忘れてたけど、還付金は2~3週間ですぐに振り込まれた〜
大した金額ではなかったけど・・・





datetime型の変数 d があるとして、そこから、日時だけを取り出したいとき
返り値は文字列なので注意
base_dir = "/home/hogehoge/public_html/hoge/%s/" % (d.strftime("%Y%m%d"))

■ 関係してそうな記事

■ 参考 : Pythonのdatetimeで日付や時間と文字列を変換(strftime, strptime)


datetimeで取り回す時間は基本的にUTCだけど、それを日本時間に直したいときは↓を参照

■ 過去記事 : 【python3, datetime】現在の日付を取得する + UTCから日本時間(JST)に変換したい














■ X軸の桁数を2桁にしたいとき
plt.gca().xaxis.set_major_formatter(plt.FormatStrFormatter('%.2f'))

■ Y軸の桁数を2桁にしたいとき
plt.gca().yaxis.set_major_formatter(plt.FormatStrFormatter('%.2f'))


■ 参考 : [Python] matplotlib: 論文用に図の体裁を整える


他にも軸にオフセットを付けたりもできるらしい
が、自動的にオフセットの桁数を指定できないという情報を見かけた (ほんとに?)
とりあえず使ったらまた追記





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

print "先月子供が産まれました!"

# 最終更新 2022/10/25
カウンター
カウンター カウンター
ブログ内検索
ツイートするボタン
リンク
相互リンク募集中です (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]