プログラミング所感 - 前へ 目次 次へ


15/01/05(月)

今野先生をまねして、ORの7カ条を 書いてみた。
  1. プロフェッショナルとして自覚しよう
  2. 真摯に行動しよう
  3. 目的をはっきりさせよう
  4. モデルはシンプルにしよう
  5. バランスに気をつけよう
  6. 結果からモデルを見つめ直そう
  7. 効果を生み出そう
http://www.power-lecture.com/koushi_ka/2011/konno-hiroshi11-07-02.html

15/01/06(火)

正月、 パズルが舞い込み、テレビ見ながら解いてみた。 http://aial.shiroyagi.co.jp/2015/01/angel/ ちなみに、メールで回答を送ったのは、朝4時だったが、すぐに返事来てた。

15/01/22(木)

IISでPython。 コンパネの「プログラムと機能」でWindowsの機能の有効化または無効化を選ぶ。 インターネットインフォメーションサービスをチェック。 また、その中のWorld Wide Webサービス、アプリケーション開発機能、CGIをチェックしOK。 「C:\inetpub\wwwroot\test」ディレクトリを作成し、test.pyを後述のように作成。 コンパネの管理ツールを開き、「インターネット インフォメーション サービス (IIS) マネージャー」を起動。testフォルダをアプリケーションに変換。 testアプリケーションのハンドラーマッピングで、スクリプトマップの追加。 要求パスを「*.py」、実行可能ファイルを「python.exeのパス %s %s」、名前を「Python CGI」としOK。
def Rule(rule, size=16):
    a, d = [1], {7 - i:int(c == '1') for i, c in enumerate('{:8b}'.format(rule))}
    for i in range(size):
        print('%*s%s' % (size - i, '', ''.join('.#'[j] for j in a)))
        a = [d[sum(x * y for x, y in zip([4, 2, 1],
            ([0, 0] + a + [0, 0])[j:]))] for j in range(2 * i + 3)]

print('Status: 200 OK')
print('Content-type: text/html')
print()
print('<HTML><HEAD><TITLE>Python Sample CGI</TITLE></HEAD>')
print('<BODY>')
print('<H1>Rule 90</H1>')
print('<pre>')
Rule(90)
print('</pre>')
print('</BODY>')

15/02/04(水)

プログラマが知るべき97のことが、 プログラマが知るべき97のこと.comで読める。

15/02/10(火)

娘が英検準1級の1次 受かったら、モニタの案内が来た。 モニタは、英検の試験の合格点を補正する目的で行うようだ。

考えてみると、そもそもモニタを別に行う必要はない。 通常の試験問題とモニタ用の問題を混ぜて試験を行えばよい。 受験者には、どちらかわからないようにする。モニタ用の問題は採点対象としない。とすればよいだろう。


15/02/19(木)

Pythonのはまりどころ。
if (1, 2 == 1, 2): print('same')
実行できて、期待通りに動く。しかし、数字が異なっても条件を満たす。 これは、要素が3つのタプルを評価しているからだ。正しくは、次のようになる。
if (1, 2) == (1, 2): print('same')

15/03/08(日)

Puzzleを数理最適化で解く 一番のメリットは、簡単ということだ。問題を定義さえすれば、汎用ソルバーが使えるから。 もう1つのメリットは、解がユニークだということを簡単に確認できることだろう。

一例を示そう。
http://nbviewer.ipython.org/gist/Tsutomu-KKE/33d43ab18ddc57d364bb

要は一度解いて出てきた解を禁止する制約を追加してもう一度解けばよい。 解がなければユニークだ。


15/03/18(水)

IPython3(Jupyter)にしてから matplotlibオプションが使えないので、グラフを書く前にマジックコマンドを書かないといけない。 いいかげん、面倒なので、下記のようにした。

まず、「ipython profile create」で %HOMEPATH%\.ipython\profile_default にconfigファイルを作る。 その中の「ipython_config.py」の「c=」の次に下記を追加。
c.IPKernelApp.matplotlib = 'inline'
c.InteractiveShellApp.exec_lines = [
    'import pandas as pd',
    'import numpy as np',
    'import matplotlib.pyplot as plt',
]


15/03/19(木)

pulpを用いた定式化で はまった。

空の制約式(例:c = LpConstraint(0, LpConstraintLE))を作って、 後から項を追加していくようにしていた。

1つめは、空の状態でaddConstraintしていたのだが、項を追加してからaddConstraintしないとダメであった。

2つめは、項の追加を、「c += 項」としていたのだが、cオブジェクトが別物になっていた。 別途リスト管理しているものが古いままで反映されなくなっていた。「+=」でなく、「addTerm」すればOKとなる。

3つめは、制約式が不要の場合に「c = None」としていて、「if c:」でチェックしていたが効いていなかった。 この箇所では、LpConstraint.__bool__がよばれ、変数がなくかつ右辺(RHS)が0の場合は、Falseとなる。 つまり、これでは空の制約式は引っかからない。 ちなみに(c = LpConstraint(非零, LpConstraintLE))では引っかかる。

その後「if c != None:」で比較していた。これは、not LpConstraint.__bool__(c - None)となる。 「c - None」は「c」と同じである。「if c != None:」と書くのと「if not c:」は等しい。 つまり、RHSが非零だとNoneと判断される!

結局、「if c is not None:」もしくは「if isinstance(c, LpConstraint)」ならばOKだ。

尚、Python2では、__bool__がよばれないので、上記のことは起こらない。


15/04/02(木)

Windowsタブレット買った。 Diginnos DG-D08IWB 32GBとBluetoothのマウスとキーボード。

http://www.dospara.co.jp/5shopping/detail_prime.php?mc=5182&sn=0
http://www.amazon.co.jp/dp/B00502F0BW
http://www.amazon.co.jp/dp/B00AF0MR3S/

ちょっと試しただけだが、HDMIでディスプレイにつながるし、普通のPCのように使える。 全部上着のポケットに入る。


15/04/10(金)

日本語の形態素解析が 簡単になった。 「pip install janome」ですぐ使える。
http://mocobeta.github.io/janome/

15/04/13(月)

Pythonだと、 「0.0 == -0.0」がTrueではあるが、0.0と-0.0は別のものだ。 どういう設計思想だったのだろうか。

15/04/30(木)

Juliaだと Ipoptがあっさりインストールできた。

15/05/01(金)

M/M/1待ち行列を SimJuliaでやってみたが、simpyより遅くなった。simpyより行数も若干多い。

15/05/15(金)

子供の SSHの海外派遣(短期留学)が内定。めでたしめでたし。

15/05/22(金)

PyCon申込んだら、 公開されている。
https://pycon.jp/2015/ja/proposals/vote/8/

15/05/24(日)

最適化の仕事で Pythonを使うようになって、最適化以外にもいろいろできることを知り、 「面白い。みんなにも紹介しよう」と、セミナーを開催した。 https://kke.smartseminar.jp/public/seminar/view/1014
https://kke.smartseminar.jp/public/seminar/view/1023
なかなか好評なので、その後も学会や講演などを続けて約1年で16件になる。
  1. 2014年7月 KKE主催「Pythonによるデータ分析および最適化ハンズオン無料セミナー」
  2. 2014年8月 KKE主催「Pythonによるデータ分析および最適化ハンズオン無料セミナー」
  3. 2014年8月 日本OR学会 2012年秋期研究発表会「数理最適化によるパズルの解法」
  4. 2014年9月 PyCon2014「数理最適化によるパズルの解法」
  5. 2014年9月 東京海洋大学主催「Pythonによるデータ分析および最適化」
  6. 2014年10月 データサイエンティスト協会主催「Pythonによるデータ分析および最適化」
  7. 2014年10月 成蹊大学 特別講義「数理最適化によるパズルの解法」
  8. 2014年11月 メーカー(F)様向け「Pythonによるデータ分析および最適化」
  9. 2014年12月 東京海洋大学主催「Pythonによるデータ分析および最適化」
  10. 2015年2月 メーカー(P)様向け「Pythonによるデータ分析および最適化」
  11. 2015年3月 日本OR学会 2015年春期研究発表会「Pythonによるデータ分析と最適化」
  12. 2015年5月 『Python言語によるプログラミング・イントロダクション』出版記念 Python活用セミナー
  13. 2015年5月 東京海洋大学 Pythonによるビジネス・アナリティクス・セミナー
  14. 2015年6月 日本応用数理学会誌 「Pythonとオペレーションズ・リサーチ - データ分析、機械学習、数理最適化について」
  15. 2015年6月 九州大学 大規模データに対する最大フロー求解アルゴリズムの実装技術の構築
  16. 2015年7月 LOG OPT主催 Pythonによるビジネス・アナリティクス・セミナー
2015年6月22日発売の「今日から使える!組合せ最適化 離散問題ガイドブック」(講談社)でも、Pythonの勧めを書いた。

最適化のしきいが下がってきたので、Pythonを通じて普及させていきたい。


15/06/18(木)

2040年の若年女性推計人口
http://www.policycouncil.jp/pdf/prop03/prop03_2_1.pdf
日本やばい。地方はもっとやばい。マンションばっか建ててる場合じゃない。

15/06/25(木)

数理最適化は覚える価値がある。
数理最適化を解く手法の基礎は50年以上前に考えられたものであるが、 ここ最近になって、実務で使えるようになってきたと思う。 ソルバーの性能が上がったこともあるが、実行するためのしきいが下がってきたことにもよる。 「使える」とは、あなたが、数理モデルを容易に作れるようになってきたということだ。

あなたが、解くべき問題が1つだけだったなら、お金を払って誰かに頼むのがいいだろう。 あなたが、いくつかの課題を抱えているのなら、「数理最適化を覚える」ことは、投資対効果が大きい。 なぜならば、1つの方法を覚えるだけで、多種多様な問題を扱えるからだ。 その方法とは数式を用いた数理モデルの記述の仕方だ。 特に整数変数を用いた、離散最適化は、現実の様々な問題を扱うことができる。 ただし、離散最適化は、連続最適化に比べると難しい。 昔は、実務で扱うためには、問題の特性を考慮し、問題ごとにアルゴリズムを開発する必要があった。 今では、汎用ソルバの性能が上がってきたので、問題を数式で表現するだけで解けるようになってきた。 (もちろん、昔に比べれば解ける問題は増えてきたが、解けない問題もたくさん残っている)

あなたが、抱えている問題は、実は、他の誰かが抱えている問題でもある。 多くの人が抱えている問題は、標準問題という形で類型化されており、より容易に扱えるようになっている。 さらに、数理問題としてとらえれば、標準問題の枠組みを超えて、より複雑になった場合でも扱えるのだ。


15/07/21(火)

Windowsでnumpyをインストールする方法は、 3通りある。 3種類ともコンパイル済みのexeを使ってインストールする方法になる。 pipではソースからコンパイルさせるが、(相当がんばらないと)うまくいかないので、この中には入れていない。
  • sourceforgeを使う方法。
  • gohlkeを使う方法。
  • Anaconda(あるいはPython(x,y)など)を使う方法。
まず、sourceforgeには、32ビット版しかない。ある計算を64ビットOSで32ビット版Pythonと64ビット版Pythonで 比較したら、32ビット版で10倍以上遅かった。 64ビットOSでは64ビット版を使うべきなので、64ビット版がないsourceforgeは却下。

次に、gohlkeを使うのは可能である。しかし、他にも入れようと思うと手間がかかる。

おすすめは、Anacondaを使う方法だ。他にも類似のはあるが、Python3への対応の早さを考えるとAnacondaが一番よい。

最初、gohlkeを使ってしばらくやっていたのだが、その後で、Anacondaを使うようになったが楽だ。 初心者には、間違いなくAnacondaを勧める。(覚えることは増えるが、しょうがない)


15/07/27(月)

PyPIの登録数が6万3千超えている。 どういう風に増えているか、検索しても見つからなかったので、自分で記録を取ることにした。 ここ1週間だと、1日約50件づつ増えている。

15/08/27(木)

pulpの変数をpandas.DataFrameで 管理している。便利。

PyCon2015トークセッション採択された。


15/09/03(木)

定式化とPythonを なるべく一致させるために。
  • 定式化でもクラス(組込とユーザー定義)を扱えるものとする。
  • 定式化でもforやifも使えるものとする。
  • 定式化でも関数定義ができるものとする。
こうすると、定式化とPythonプログラムがかなり近くなるので、変数名も統一しよう。 また、利用しない一時変数は、「_」とする。

15/09/29(火)

去年のPyConの発表資料。

数理最適化によるパズルの解法
http://nbviewer.ipython.org/gist/Tsutomu-KKE/1b526ed7ef2ab111c829 下記が必要
pip install pulp
pip install unionfind


15/09/30(水)

OR学会誌、 最新号がwebで見れる。http://www.orsj.or.jp/e-library/elcorsj.html

15/10/01(木)

変換で キャッシュすると早くなるかもしれない。
from functools import lru_cache
@lru_cache(1024)
def to_datetime(s):
    return pd.to_datetime(s)
t = [pd.datetime(np.random.randint(2015, 2016), np.random.randint(1, 13),
                 np.random.randint(1, 29)).strftime('%Y/%m/%d') for _ in range(10000)]
a = pd.DataFrame(t, columns=['dt'])
%time a.dt = a.dt.apply(pd.to_datetime)
a = pd.DataFrame(t, columns=['dt'])
%time a.dt = a.dt.apply(to_datetime)
>>>
Wall time: 792 ms
Wall time: 40 ms

15/10/02(金)

IPythonのグラフ表示で、 後ろに「;None」って書いていたけど、「;」だけでいいのか。 http://yag.xyz/blog/2015/06/21/ipython-notebook-suppress-output/

15/10/03(土)

VS2015で PTVSのインストールが失敗していたのだが、VSの最初のインストールで選べばいいだけだった。

15/10/05(月)

seabornのパレット https://dl.dropboxusercontent.com/u/35689878/pdf/pal.pdf

15/10/09(金)

ドント方式の計算
n = 9 # 議席数
rt = [120, 90, 60] # 投票数

from __future__ import division
import heapq
r = [[-j, i, 0] for i, j in enumerate(rt)]
heapq.heapify(r)
while n > 0:
    n -= 1
    p = heapq.heappop(r)
    p[2] += 1
    p[0] *= p[2] / (p[2] + 1)
    heapq.heappush(r, p)
r = sorted(r, key=lambda x: x[1])
print([i[2] for i in r])
>>>
[4, 3, 2]

15/10/13(火)

PyConJP2015の 発表資料。
http://www.slideshare.net/SaitoTsutomu/python-pycon-2015

PyConJP2015は600人超の参加で盛況でした。来年も楽しみ。


15/10/23(金)

pythonのインデントは、 いくつでもいいようだ。下記も普通に実行できる。
for i in (1,):
_for j in (2,):
___for k in (3,):
_________print(i,j,k)
_for k in (4,):
_______print(i,j,k)
for i in (2,):
___print(i)

15/11/04(水)

flake8の main.pyの49行目に「sys.stderr.write('%.3f\n' % (report.total_errors / len(report.lines))」を入れて、 --countつきで実行すると行あたりの数が出る。

15/11/11(水)

ブログ歴19年目突入。 Docker勉強している。advent2015にPythonとアルゴリズムで申込んだ。

15/12/03(木)

Gurobiセミナーに参加した。
advent書いた。 http://qiita.com/Tsutomu-KKE@github/items/29414e2d4f30b2bc94ae
http://qiita.com/Tsutomu-KKE@github/items/a172137e80593a3005b3

15/12/08(火)

5MBしかないlinuxのalpineに python3.4とnumpy,scipy,matplotlib,jupyter,...入れることができた。 https://github.com/catholabs/docker-alpineを参考にBLASとLAPACKをいれる。 下記を実行。
apk add --update musl python3 python3-dev alpine-sdk gfortran freetype freetype-dev
sh ./blas.sh
sh ./lapack.sh
BLAS=~/src/BLAS/libfblas.a
LAPACK=~/src/lapack-3.5.0/liblapack.a
export BLAS
export LAPACK
pip3 install -U pip
pip3 install numpy==1.9.3 scipy matplotlib jupyter ...

15/12/11(金)

pandas.DataFrameやpulp.LpProblemを pickel形式でファイルでやりとりできる。 LpProblemは、_variables.clear()を呼んでからdumpしないと、load時に変数が倍になる。

15/12/21(月)

下記を参考に無限docker。
https://orih.io/2015/12/we-should-think-twice-about-using-docker-in-docker/

ubuntu14.04で確認
sudo cp /usr/bin/docker /usr/local/bin/
sudo cp /usr/lib/x86_64-linux-gnu/libapparmor.so.1.1.0 /usr/local/bin
sudo cat << eof > /usr/local/bin/matr
docker run -it --rm --volumes-from tmp debian sh -c \
  "LD_LIBRARY_PATH=/usr/local/bin; export LD_LIBRARY_PATH; bash"
eof
sudo chmod +x /usr/local/bin/matr
docker run -d --name tmp -v /var/run/docker.sock:/var/run/docker.sock \
  -v /usr/local/bin:/usr/local/bin busybox
あとは、matrとやるたびにdockerが起動する。


15/12/30(水)

DockerfileをUTF-8 にするとAutomateで失敗するかも。

簡単に形態素解析。
docker run --rm tsutomu7/janome すもももももももものうち
"-v /etc/localtime:/etc/localtime:ro"を付けると、コンテナ内で時刻がちゃんとなる。


プログラミング所感 - 前へ 目次 次へ