数学とは、何か。
数学の世界には偶然はひとつもなく、ヒトはその世界で、ほかの分野とは比べものにならない集中と正確さをもって自分の頭脳を訓練することができる。(中略)数学は信じられないくらい有益が、その実益は、頭脳を訓練したことの副作用として生じているに過ぎないのだ。
1から学ぶ大人の数学(ジェイソン・ウィルクス)
数学とは、何か。
数学の世界には偶然はひとつもなく、ヒトはその世界で、ほかの分野とは比べものにならない集中と正確さをもって自分の頭脳を訓練することができる。(中略)数学は信じられないくらい有益が、その実益は、頭脳を訓練したことの副作用として生じているに過ぎないのだ。
1から学ぶ大人の数学(ジェイソン・ウィルクス)
とてつもなく大きなものを捉えるのほとんど唯一の方法は周期性を見つけることです。ではどうしらら周期性をはじめとする規則性を見つけられるようになるでしょうか?それはずばり書いてみることです。
伝説の入試良問(永野裕之)
2019年2月の読書メーター
読んだ本の数:6冊
読んだページ数:1765ページ
ナイス数:170ナイス
https://bookmeter.com/users/45484/summary/monthly
■超軽っ! 日本史―原始時代~安土桃山時代編―
タイトルほどには軽くはない。「応仁の乱」と同じく人物が多すぎて歴史の大きな流れを捉えきれない。語り口は面白いのだけれどもっと「流れ」の面白さに重きを置いて欲しかったかな。
読了日:02月28日 著者:浮世博史
https://bookmeter.com/books/5522166
■写楽殺人事件 (講談社文庫)
再読。歴史ミステリは楽しい。想像力をたくましくして楽しめる。特に、高橋さんの歴史(特に浮世絵もの)は緻密で「これで謎が解けた!」感が半端ない。
読了日:02月18日 著者:高橋 克彦
https://bookmeter.com/books/480306
■Pythonからはじめる数学入門
数学、pythonどちらのとっかかりとしても良書。本書と数学ガールを併読したらきっと楽しい。ずっと購入を迷っていたけどもっと早く購入すれば良かった。
読了日:02月13日 著者:Amit Saha
https://bookmeter.com/books/10932525
■あなたが消えた夜に (毎日文庫)
ミステリなのか何なのか?独白という形式が好きになれない僕にとってはツライ1冊だった。残念ながら、好きにはなれませんでした。
読了日:02月12日 著者:中村 文則
https://bookmeter.com/books/13192237
■東大教授がおしえる やばい日本史
面白かった。息子のために買ったけど先に読んでしまった。名だたる偉人が並ぶけど皆人間くさいね。
ザビエルのやばい話で、坊さんの台詞に腹を抱えた。後、与謝野晶子が後に戦争賛成の歌を詠んだなんて衝撃。
読了日:02月09日 著者:
https://bookmeter.com/books/12884897
■雨はこれから(4): モーターマガジンムック
1巻が気に入ったので2巻を買いに行ったのだが4巻しかなかったので飛ばして購入。ダートやりたくなった。
読了日:02月03日 著者:東本昌平
https://bookmeter.com/books/13529082
▼読書メーター
https://bookmeter.com/
ググれば簡単にサンプルは入手できるけど、僕の環境では小さいエラーがでてなんだか苦労したので、うまくいったサンプルパタンを挙げておく。
import smtplib
import email.encoders
from email.header import Header
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email.mime.multipart import MIMEMultipart
あちこちのサンプルではimportの時点でエラーとなるものがあった。Python3系と2系の違いだろうか?僕のsampleはPython3.6。
charset = 'ISO-2022-JP'
msg = MIMEMultipart()
msg['Subject'] = Header('これはテストです'.encode(charset),charset)
msg['From'] = ['foo@example.com']
msg['To'] = 'var@example.com'
body = MIMEText('これはテストです')
msg.attach(body)
attachment = MIMEBase('application','vnd.ms-excel')
f = open('sample.xlsx','rb')
attachment.set_payload(f.read())
f.close()
email.encoders.encode_base64(attachment)
msg.attach(attachment)
attachment.add_header('Content-Disposition','attachment',filename='sample.xlsx')
つまんな事だけど、open関数のところバイナリで指定がないサンプルがたくさんあった。僕の環境では明にバイナリ指定しないとエラーでした。
あと、email.encoders.encode_base64()の書き方も諸説あり?かな。僕が初心者すぎるのかも。
smtp = smtplib.SMTP('smtp.example.com')
smtp.ehlo()
smtp.sendmail(from_address,['var@example.com'],msg.as_string())
smtp.quit()
いずれにしてもこれまでメールの自動配信はperlで書いていたけど今後はpyhtonに移行する。
pandasで色々できるようになってきたのでデータは直接DBからロードしたほうが楽な場面が増えてきた。
import mysql.connector
conn = mysql.connector.connect(
user='root',password='mysql',host='localhost',database='test',charset='utf8')
自宅のmacだと文字コードの指定がなくともOKだったが、職場の環境では指定しないとエラーとなった。いずれにしてもアクセス先のDB環境に合わせ常に指定するほうがいいのだろうと思う。
cur = conn.cursor()
query = 'select * from t_test where age > %s;'
cur.execute(query,[30])
cur.fetchall()
#> [( 1, 'foo', 34, '0120-222-456'), ( 3, 'zoo', 44, '0120-444-000')]
本来の目的であるpandasでは、csvなんかど同様read_sql()で直接読み込める。プリペアステートメントの書式が少しだけ違う。
Pandas read_sql with parameters によればread_sql()のパラメータの書式自体にもリスト・タプル・ディクショナリが指定できるようでどれを使うかはそのときの状況次第なのかな?辞書にするのが個人的には分かりやすいように感じた。
query = 'select * from t_test where age > %(age)s;'
df = pd.read_sql(query,conn,params={'age':21},index_col='id')
DataFrame化してからごにょごにょするか、DB内である程度やれることはやっておくのか?後は、そのとき次第。
cur.close()
conn.close()
2019年1月の読書メーター
読んだ本の数:7冊
読んだページ数:1679ページ
ナイス数:253ナイス
https://bookmeter.com/users/45484/summary/monthly
■雨は これから vol.1 (Motor Magazine Mook)
書店でたまたま見かけて購入。SRってとこがシビれる。良かったです。
読了日:01月30日 著者:東本昌平
https://bookmeter.com/books/11193225
■福家警部補の再訪 (創元推理文庫)
前作からはインパクトに欠けるかな?警部補、良い味だしてるんだけどちょっと影が薄い気がする。やっぱり、映像向きなのかな?テレビドラマだったら(コロンボや古畑の二番煎じだとしても)面白いかも。
読了日:01月28日 著者:大倉 崇裕
https://bookmeter.com/books/6878499
■セキュリティのためのログ分析入門 サイバー攻撃の痕跡を見つける技術 (Software Design plusシリーズ)
キモは6章か。とかく技術面ばかりに目がいくけれど、実際の現場では時間も金もないのが冷たい現実。とにかく、運用がうまくまわらないと話にならないので自動化や可視化は必須だろう。
読了日:01月18日 著者:折原 慎吾,鐘本 楊,神谷 和憲,松橋 亜希子,阿部 慎司,永井 信弘,羽田 大樹,朝倉 浩志,田辺 英昭
https://bookmeter.com/books/13083112
■才能の正体 (NewsPicks Book)
なぜベルギー戦に負けたのか?W杯における日本代表の考察には感心しました。
自分の持っている本来の力を伸ばせるよう色んな面で考え直したいと思える1冊でした。中立的なフィードバックは難しいとは思うけれどまずは自分自身に向けて発してみたい。
読了日:01月16日 著者:坪田 信貴
https://bookmeter.com/books/13115532
■ホンダジェット: 開発リーダーが語る30年の全軌跡
自分の仕事に対する情熱、これがすべて。業種は違っても同じ技術系ということで共感できる箇所が多々あった。後半はリーダーシップ論としても読むことができそう。マルチスペシャリストという言葉ははじめて聞いた。口先ばっかのソフトウェア業界の自称プロジェクトリーダーに読ませたいな。
読了日:01月07日 著者:前間 孝則
https://bookmeter.com/books/9837543
■日本再興戦略 (NewsPicks Book)
テクノロジーにより生活が加速度的に変化を続ける時代においては、「この道ウン十年」みたいなやり口では取り残される。会社という唯一のコミュニティだけで生きていくは非常に危険で、常に変化に気を配り職業のポートフォリオをマネジメントしていくしかない。
非常にためになりました。
読了日:01月03日 著者:落合 陽一
https://bookmeter.com/books/12484734
■テニスの王子様 全42巻 完結セット (ジャンプ・コミックス)
息子がブックオフで買ってきたので拝借。結構、面白い。
読了日:01月02日 著者:許斐 剛
https://bookmeter.com/books/3016972
▼読書メーター
https://bookmeter.com/
このところpandasの便利さに惹かれ業務関連のレポート作成をPerlからPythonに移行している。データそのものはpandasのto_excel()で出力しても書式設定が面倒。PerlではAutofitが一発だったのにopenpyxlには見当たらない。Stack Overflowでみつけたやり方だと日本語が含まれるCellがあるとうまくない。要するに英語圏と違い、全角半角混在する環境では文字数のカウントだけでは幅がせまくなりすぎるのだ。
unicodedata.east_asian_width
(chr)を使い「全角かな(W)」「全角英数(A)」「特殊文字(F)」は倍の幅としてカウントすることで望みどおりの結果を得ることができる。
def as_text(value):
if value is None:
return ""
return str(value)
def get_east_asian_width_count(text):
count = 0
for c in text:
if unicodedata.east_asian_width(c) in 'FWA':
count += 2
else:
count += 1
return count
for column_cells in worksheet.columns:
length = max(get_east_asian_width_count(as_text(cell.value)) for cell in column_cells)
worksheet.column_dimensions[column_cells[0].column].width = (length+2)*1.3
*1.3はただの調整マージンで意味はない。
長いこと使っているけど知らなかったコマンド
grep結果の数え上げ。ほとんど、wc -lで対応してた。
grep -c
ヒットしないものをgrep
grep -v
Process Substitution この言葉自体を知らなかった。ほとんどの人がパイプ(|)で代用しているのでは?
diff <(sort file1) <(sort file2)
DOSコマンドのfindstrの存在も知らなかった。正規表現も使えるらしい。perl形式だとうれしい。
と、知らなかったコマンドの知識も収穫だけれど本当の読みどころは第6章。運用まわりのことは実際に経験してみないわからないことだらけだから、この章だけでも読み応えはある。特に自動化と可視化(この部分はPythonでやってもいいだろう)については、高価なツールなど望むべくもない「一人情シス」的なポジションでがんばってる人には助けになるはず。
5章の秘書問題が面白かったので実際にpythonで確認してみた。
import random
from statistics import mean
def select(n,r):
applicants = [random.randint(0, 100) for x in range(n)]
candicate = max(applicants[0:r-1])
if candicate == max(applicants):
return 0
selected = [s for s in applicants[r:] if s > candicate]
if (len(selected) > 0) and (selected[0] == max(applicants)) :
return 1
else:
return 0
print(mean([select(100,50) for i in range(10000)]))
成功確率は0.295くらいで本よりやや低い。選ぶ数のバラツキが大きければ(例えば、randint(0,1000)とか)成功確率は上がって0.34前後。
rを1から変化させながら成功率を取得する。
def r_means(n,r):
return (r-1,mean([select(n,r) for i in range(2000)]))
rm = [r_means(100,i) for i in range(2,100)]
plt.scatter([x[0] for x in rm],[y[1] for y in rm])
plt.show()
本とはやや違い概ね28~33あたりにピークがある。僕のコードでは30%程度を見送ることで最適の解が得られるという結果。
その問題、数理モデルが解決します(浜田宏)
テクノロジーにより生活が加速度的に変化を続ける時代においては、「この道ウン十年」みたいなやり口では取り残される。会社という唯一のコミュニティだけで生きていくは非常に危険で、常に変化に気を配り職業のポートフォリオをマネジメントしていくしかない。
頭でっかちにグダグダ批評ばかりするのではなく、今できることをまずやってみる。そこから少しずつ間口を広げていくしかないのだろう。
日本再興戦略(落合陽一)