0-1ナップザック問題解いた
この記事は PMOB Advent Calendar 2015 の 15 日目の記事です.
この前授業の課題で0-1ナップザック問題をソルバで解いてねって感じの問題が出たのでサッと書きました。
pythonにpulpとかいうglpk使って解けるモジュール?(よくわからない)あったので、それを使ったらあっさりでした。
以下コード
#! /usr/bin/python # encoding: utf-8 import pulp # コンストラクタ prob = pulp.LpProblem('knapsack', pulp.LpMaximize) # 詰める荷物の数 print('num of obj: ', end='') n = int(input()) a = [pulp.LpVariable('baggage{0}'.format( i), cat=pulp.LpBinary) for i in range(n)] v = [] s = [] for i in range(n): print('[{0}]'.format(i)) # 荷物の価値 print('value: ', end='') v.append(int(input())) # 荷物のサイズ print('size: ', end='') s.append(int(input())) # ナップザックの容量 print('knapsack capasity: ', end='') b = int(input()) # 目的関数 prob += pulp.lpDot(v, a) # 制約条件 prob += pulp.lpDot(s, a) <= b # 問題も表示しておく print() print(prob) prob.solve() # 結果 print("Result:") for i in range(n): print(a[i].getName(), int(a[i].value()))
lpDotとかいうリストの内積求めてくれる奴がめっちゃ便利でした。
ていうかソルバ神か
トイレカウントbotを作った話
この記事は PMOB Advent Calendar 2015 の 6 日目の記事です.
最近こんなのを作りました。
github: https://github.com/asatake/toilet_count
Twitter: https://twitter.com/toiletcount
すごくしょうもないTwitterBotです。
これに関してちょっと話そうかと。
なぜこんなアホなもの作ったのか
しょっちゅうトイレ行くしトイレ行きたいってツイートする友人がある日
「トイレってカウントして欲しい」
的なこと言ってたので、まあいい勉強になるだろうと思い、つくりました。
構想
以前にupdate_nameを作ってたので、それを応用すれば作れるでしょ、みたいな甘い考えではじめました。
累計カウント数と一日の回数をそれぞれ覚えておきたいなあと思い、
んじゃなんか外部ファイルに記憶しておこうと考えました。
最初CSVにしようとしたら、しゃみそん君にいやそれ遅いでしょ、と言われたので、
dbファイルにSQLで〜みたいな雰囲気をやることにしました。
苦労したこと
そもそもちゃんとDBやったことない!
ということでささっとググッて何回もエラー出しました。
本当は「toilet」もカウントしたかった
botのアカウントIDが@toiletcountで、それと被る!
@toiletcountはカウントしないで、toiletはカウントする、みたいな正規表現書けなかった。
デプロイが一番きつい
Herokuだと時間制限があるから、じゃあ借りてるサーバに置いとこうと思ったらこれが大変でした。
既にupdate_nameを動かしてあるので、それと一緒に動かすためにシェルスクリプト書いて、
それをsystemdのserviceで管理する、という方法を取ったのですが…
なんかいっぱいエラーでちゃった…。
python3系で書いてるのですが、指定してるのになぜかpython2で実行しようとしたり、
dbファイルがなぜかreadonlyになってたり…。
もうやけくそで、強引に解決しましたので、今は多分ちゃんと動いてるはずです。
最後に
Twitterのbot作るの、やっぱり楽しいです。
コーディングはとても苦手なので、いっぱい叩かれそうですが…。
みなさんもぜひ、自分のオリジナルのTwitterBotを作ってみましょう!
flaskで作ったサイトをherokuにデプロイした
環境構築
今回はpython3.4を使用しました
使用OSはAntergos(Arch Linuxとほぼ同じ)
pythonz+direnv
あらかじめこの辺入れときます
build-essential
zlib1g-dev
libbz2-dev
libssl-dev
libreadline-dev
libncurses5-dev
libsqlite3-dev
libgdbm-dev
libdb-dev
libexpat-dev
libpcap-dev
liblzma-dev
libpcre3-dev
curl
python-pip
pythonzをインストールします
次のコマンドをシェルで打っときます
$ curl -kL https://raw.github.com/saghul/pythonz/master/pythonz-install | bash $ echo [[ -s $HOME/.pythonz/etc/bashrc ]] && source $HOME/.pythonz/etc/bashrc' >> $HOME/.bashrc $ exec $SHELL
zsh使ってる人は出力先を.zshrcにしましょう(その前のbashrcは直さない)
virtualenvをインストールします
direnvに必要です
$ sudo pip install virtualenv
direnvをインストールします
$ curl -L -o direnv https://github.com/zimbatm/direnv/releases/download/v2.5.0/direnv.linux-amd64 $ sudo install direnv /usr/local/bin $ echo 'type direnv > /dev/null 2>&1 && eval ") "$(direnv hook bash)" ' >> $HOME/.bashrc $ exec $SHELL
zsh使ってる人はbashって書いてあるところをzshに直しましょう
pythonzでpythonインストール
$ pythonz install 3.4.3
これでpythonのインストールもオッケーです
プロジェクト作成
プロジェクトを作りたいディレクトリに移動して、mkdirでフォルダを作ります
ここでは仮に「flasktest」というフォルダを作ったことにします
direnvに必要な.envrcを作ります
$ echo 'layout python $(pythonz locate 3.4.3)' > flasktest/.envrc $ direnv allow flasktest
この後、$ cd flasktest でディレクトリに入ると、開発環境の初期化が行われます
終わったら、一応pythonインタプリタを実行して、バージョンを確認してみてください
そうしたら、ディレクトリ移動をしないで、ライブラリをインストールします
$ pwd /home/flasktest $ pip install Flask
開発
あとは頑張って開発です
pycharm使うと便利です
pycharmとかを使う場合は使うインタプリタを開発環境のものにしてください
場所は
$ pythonz locate 3.4.3
でわかります
私の作った奴はこちらです
asatale/flasktest
Herokuにデプロイ
まずはherokuの登録
公式サイトからユーザ作っときます
次にheroku-toolbeltというのを入れます
apt-getとかyaourtで簡単に入ります
必要なものを入れます
$ pip install gunicorn
Procfileやその他諸々必要な書類作成
$ echo 'web: gunicorn flasktest:app --log-file=-' > Procfile $ pip freeze > requirements.txt $ echo 'python-3.4.3' > runtime.txt
.gitgnore作ります
direnv *.pyc
gitで管理します
$ git init $ git add .gitignore $ git add . $ git commit -m 'first commit'
Herokuにデプロイします
$ heroku login $ heroku create $ git push heroku master
確認します
$ heroku ps:scale web=1 $ heroku ps
これでcrushとか書いてなければオッケー
$ heroku open
これでページを確認できます
なにか問題がありそうなら、
$ heroku local
とやるとローカル環境でページを確認できます
感想
思ってたより簡単だった。
flaskは軽量なのでサッとテストできていい感じ。
herokuの設定に手こずったけどなんとか動いてるっぽい。
asataken
参考文献
益川敏英先生の講演会に参加しました
先日、2008年にノーベル物理学賞を受賞された益川敏英先生の講演会に参加しました。
その内容と感想を簡単に書いていこうと思います。
益川先生とこの講演会について
一応ざっと略歴が紹介されました。
この講演会は論理物理学には一切触れず、
若い研究者に向けて伝えたいことをお話されていた
益川先生のお話の概要
益川先生の今のお仕事
研究の他に大学で講義をしている
生徒に「先生はニコニコ喋ってて面白そうだけど、話してることが全くわからない」と言われたとか。大学はカリキュラムに書いてある講義だけではない
「夜を徹して議論せよ」
->それくらい議論していくと色んなことが見えてくる
先生も議論のライバルの持ってる本を、表面上見栄を張りながら内心うらやましく思い、急いで購入、すぐに読破したとか。
学生の学習について
- 先輩から得る知識というのは確かに習得が早い
しかし、議論をして長く時間を掛けると、他人との接触によりとても刺激を得られる
大学の先生に「これがわからない」と聞いてみたところ、
「こんなこと急に聞かれてわかるか!」と言われたとか。
だから自分で調べたとか。
- 勉強は自分たちでするもの
- 先生は勉強のための基本的なことを教えてくれるだけ
- 「学問自体に対して個性がある」
「自由とは何か」
益川先生がこのような講義をする際、必ずこの話をするそうです。
- 自由だけど程度を越したら怒られちゃうよ!
- 「自由とは必然性の洞察だ」
何かの偉い本に書いてあったとてもむずかしい言葉。
これを益川流にいうと…- レバーが2つあって、左側を引くと100万円が当たる、逆側は自分が死んでしまう
-> これは自由に見えて自由ではないよね(選択肢がないから)
- レバーが2つあって、左側を引くと100万円が当たる、逆側は自分が死んでしまう
ここで、研究の面白話として、ファーブルと蚕の話、アインシュタインの話などが紹介されました。
科学とは
基本的なことが発見されてから100年位経って初めて人の役に立つようになる
最後に先生から
先生は本屋の立ち読みとかで知識を得ることも多いらしいです。
日本人は、自分の専門はこれだ!と決めつけてしまう傾向がある
-> 面白いこと、興味あることにはどんどん手を出していこう!
たとえ文学や哲学などであっても積極的に
向いてないな〜と思ったらやめちゃってもいい!今欲しい物は?
「税金ください!」
会場大爆笑。
僭越ながら私も質問しました。
- 先生の研究がもし何か役に立つとしたらどんなことに役に立って欲しいですか?
「役に立つことは絶対無いし、何に役に立つとか、どのくらいお金がもらえる、みたいな話は考えたことがない」
さらに高校生からこんな質問も。
- 先生にとって物理とは?
「私にとって物理とは飯のタネです」
会場大爆笑。
感想
噂に違わず、とても面白いお話をされる方だなというのが第一印象でした。
そして、研究者として、また何かを学ぶ者として、という心構えの一つを教わったように感じます。
特に、学問自体に対して個性がある、どんどん色んな分野に手を出そう、というのは非常に心に残りました。
非常にためになる、貴重な講演会でした。
益川先生、本当にありがとうございました。
Arch Linuxにtexstudioをインストール
ぼくはAntergosですが
実行環境
- yaourt使えるようにしてある
- texlive 2015
- 日本語入力は fcitx-mozc
- fcitx-qt4, fcitx-qt5を導入しとく
- エディタのフォントは日本語対応のものにする
入れるもの
全部AURにあるはず
- texlive(執筆当時は2015)
- texlive-langcjk
- poppler-data
- texstudio
texstudioの設定
「高度なオプションの表示」にチェックをする。
コマンド
ビルド
- ビルド&表示: dvi-pdf-chain
詳細なエディタ設定
ハック/回避策
- 「最適なオプションの自動選択」のチェックを外す
- 「描画モード」をQtに