みろりHP


緑色さんの多目的ブログ
みろりえいちぴー(旧)
引っ越し先 みろりHP: https://www.mrrhp.com
| カテゴリ:- |
スポンサーサイト

一定期間更新がないため広告を表示しています

| スポンサードリンク | - | - |
| カテゴリ:感想文 |
小森陽一『村上春樹論』



この本は村上春樹『海辺のカフカ』に対する分析書だ。『海辺のカフカ』は9.11事件の一年後に出版され、世界中で売れに売れ、読者の多数は「癒やしと救い」を感じたという。その「癒やしと救い」の正体は何なのか、そしてそれはイイコトなのか? というのがこの本のメインテーゼだ。
何を隠そう俺も村上春樹好きで、『海辺のカフカ』は数回読んだことがある。そんなわけで『カフカ』を精読していくこの本は楽しめたぜ。いつもどおりサマリと感想を書く。



「癒やしと救い」の正体は、9.11以降人々の心を覆っていた罪障感の解消である
  • 『カフカ』主人公のカフカくんは、「いつか父を殺し母と姉を犯す」という呪いを受けている。親殺しと近親相姦は人類のタブーだ。カフカくんはそんなタブーを、最終的には、擬似的にだが犯してしまう。だがその罪は「いたしかたない」とされる。
  • なぜかといえば、カフカくんは幼いころ母に捨てられた辛い過去をもつ少年だからだ。そのせいでカフカくんはずっと、「自分には母に愛される資格がなかったんじゃないか」「自分は生まれつき汚れをもつ人間なんじゃないか」という問題を反芻し続けることになっている。これだけ深いトラウマを負えば、タブーを犯してしまっても「いたしかたない」という論理である。
  • しかしその許容は間違いだ。カフカくんの人生の問題となっている上記の問いは、実は人間なら全員が経験していることなのである。それは幼少の頃の肛門期と呼ばれる期間のことだ。小さい頃はみんな、排泄物を垂れ流しにしても周囲の大人たちが甲斐甲斐しく面倒を見てくれるものだが、あるときを境にそれは許されなくなる。便意を感じたらそれを言うよう強制され、垂れ流すと叱られる。これは子供にしてみれば相当に理不尽で恐るべき体験である。そのとき子供は母に愛されていないのではないか、という疑問を抱くようになる。まさにカフカくんが抱いている問題だ。彼は幼いころ母を失っているため、その体験が遅れ、あるいは長引いてしまっているだけなのである。
  • つまり『カフカ』という小説は、表面上には「特別な問題を抱えた人間はタブーを犯しても『いたしかたない』」と言いつつ、内実「みんなタブーを犯しても『いたしかたない』」と読者に伝達しているのである。出版当時、人類は9.11によって、人間社会全体として大きなタブーを犯したという罪障感をもっていた。それを「いたしかたない」とされることで、人々は「癒やしと救い」を感じたのである。

「癒やしと救い」のもうひとつの正体はこの小説が、歴史認識が空虚であっても構わないという許しを与えるからである
  • 『カフカ』の中では、擬似的に処刑されるふたりの女性がいる。ナカタさんの昔の先生である岡持先生と、カフカくんが図書館で出会った佐伯さんだ。この二名は著者いわく、ミソジニーを下敷きにしたまったく不当な罪で処刑されている。
  • 『カフカ』では、ナカタさんとカフカくんがそれぞれ損なわれた要因が、女性が女性として、自らの性的欲望の主体となったというところに帰着させられている。岡持先生は夫との激しい性交の夢をみたことが遠因となりナカタさんを損ない、佐伯さんが「いろんなものをあるべきかたちからずらしてしまった」こととカフカ少年と交わったことが、作中に登場する邪悪なものをもたらしたとされているのだ。だがそれらはまったく不当なことで、性欲を抱く女性に対するミソジニーがこの小説に強く宿っていることがわかる。
  • 岡持先生の「罪」にまつわることはほとんど戦時中であることからきた不幸で、もとをたどっていけば昭和天皇ヒロヒトに責任が帰着するはずだ。佐伯さんがいろんなものをずらしてしまったとしても、彼女は戦後の学生運動中の内ゲバで恋人を亡くした過去があり、むしろ被害者にも相当する。しかし『カフカ』では、岡持先生の生きた戦中と、佐伯さんの生きた戦後の日本社会の歴史性は、彼女たちが自ら「罪状認知」して責任の所在を隠すことで否認されて消去されているのである。
  • こうした構成で、すべての責任を女たちになすりつけ、歴史認識を空虚にするのが『カフカ』という小説。
  • 『カフカ』出版当時20代だった読者は、中高で従軍慰安婦問題を知った世代である。その事実を知ったときのトラウマと向かい合わなくてもいい、とすることが「癒やしと救い」のもうひとつの要因である。

著者の意見
  • タブーを犯すことをいたしかたないこととして容認したり、内省行動を捨てることは、言葉を操る生き物としての人間の、最も要にある能力を冒涜する行為である。
  • 逆に、言葉を操る生き物として他者への共感を創りだしていきたいと思うのなら、トラウマと繰り返し向かい合いながら対話を続けていくべきである。



『カフカ』に登場する書物は、『カフカ』の物語と対応している
  • 『バートン版千夜一夜物語』。これは「女性の性的放縦は罪だ」というミソジニー的イメージを形成している。とくにバートン版が選ばれていることが重要で、バートン版はヨーロッパ列強によるアラブ・イスラム地域に対する植民地支配のためのツールであった。明らかな特徴として、エロチックな箇所を誇大に表現し、原作にはない文章まで加筆しており、アラブ・イスラム地域の人々をことに「性的放縦」に描いているという点がある。これはヨーロッパ人が、キリスト教徒の自分たちは彼らと対比して禁欲的であるという自己像を形成することにつながる。「性的放縦」の強調により、『千夜一夜物語』の枠物語であるシェヘラザードの物語がバートン版ではクローズアップされている。シェヘラザードの物語とは、妻の性的放縦によって裏切られた男たちの物語であり、つまりミソジニーだ。なお『千夜一夜物語』には、ミソジニーに取り憑かれた男を女が言葉の力によって改心させるという要素もあるのだが、それは『カフカ』がこれをモチーフ化する際には無視されている。
  • 『流刑地にて』。処刑機械が罪人の体に罪状を彫り込み、最後には処刑する話。これは「暴力ではなく言葉が人を処刑する」というイメージを形成している。『カフカ』においては、佐伯さんが自らの過去をしたためた文章がそのまま罪状となり、擬似的に処刑される部分にそれが現れている。
  • 『坑夫』。「目の前に出てくるものをただだらだら眺め、そのまま受け入れてるだけ」な主人公の話。主人公の立場は無性格論だと言われる。無性格論とは、人間の性格や人格は一瞬一瞬で変わり、それどころか矛盾することもあるという理論だ。しかしその一方でこの主人公は、自分の性格や人格への分析を一貫して行っており、逆にきわめて確固とした内省的自我の存在を読者に印象づけてくる。これは「表面的には受け身だがその実めちゃめちゃ内省的」「記憶の連続性」というイメージを形成している。このイメージは対称的なかたちで『カフカ』に現れる。『カフカ』の主人公たち、ナカタさんとカフカくんは、「表面的には積極的だが実際はめちゃ受け身で内省ができない」「記憶が途切れる」という人たちである。
  • 『虞美人草』。決められた相手以外と結ばれようとした女性が処刑される話。ミソジニーのイメージ。
  • 以上の書物は『カフカ』の各所にモチーフを送り込んでいるだけでなく、物語の流れにも呼応している。
    • カフカくんと大島さんが『千夜一夜物語』(ミソジニー)の話をしてると『流刑地にて』(処刑)に話が移る
    • 『坑夫』(記憶の連続性)を読み終わったところでカフカくんの記憶は途切れる
    • 擬似的父殺しが終わったとき『虞美人草』(処刑)を読んでいる
  • 『カフカ』の大筋をつくる「いつか父を殺し母と姉を犯す」という呪いもオイディプス王の物語を下敷きにしている。「お前は息子の手で殺される」という呪いを受けたライオス王はそれを恐れ、生まれた息子を山に捨てるが、拾われて隣国のポリュポス王の子となってオイディプスという名をもらい、風が吹いて桶屋が儲かり、オイディプスはライオスを、実の父親だと知らないまま殺してしまうという物語だ。



構成が深いなー!! 村上春樹の本ってのは Easy to read, hard to understand の典型だ。俺は村上春樹の文章がとっても清潔で好きなだけなので、 Easy to read の部分だけで満足してたんだが、きっちり紐解いて understand しようとするとこういうことになるのか! ほんとうに楽しく読めた一冊だった。なるほどねえ、村上春樹の小説ってのはこんなふうに読み解けばいいのか、ってのがすこし分かったよ。つまり、作中の意味不明な出来事はいつも何かをメタフォライズしており、その手がかりとして作中に登場する実在の事件、人物が用意されてるって感じだろうか。『カフカ』でいうならば、女性たちの意味不明な死はミソジニーを下敷きとした歴史認識の棄却をメタフォライズしており、その手がかりとして戦争に関する話題や書物についての会話が用意されているってところだ。


| 緑色 | 感想文 | comments(0) |
| カテゴリ:プログラミング |
Python 複数バージョンを併用する技



一流の格闘家が両利きに矯正するように、パイソニスタを志すものはpython2とpython3の併用をするべきであろう! つーかその方カッコイイであろう! と思いついたのでやってみた。いや、こないだsublime text3で上での切り替えを試みて以来、バージョン切り替えにハマってるんですね緑さんは。python2を久々にいじったんでちょっとハシャいでいるわけよ。3はとっても便利なんだけど、俺は2でプログラミングを始めたんでなんとなく思い入れがあるのだよ。
というわけで暑苦しく始まりました、「1日1python」のお時間です。(ただし隔週放送)



# 2.7なら
py -2.7 module.py

# 3.4なら
py -3.4 module.py


コンソールにこんなん打てばバージョンを使い分けて実行することができる。py.exeってのはこれはpython3.3から実装された新機能だ。っか〜! イカしてるな〜pyてょんは! 痒いところに手がとどくな〜! っか〜!

なお画像の例で実行してるpyファイルは上述のsublime text記事に載せたやつ。しかしアレな、画像を見てもらうとわかるけど、実行ファイル名ってクォーテーションで囲んでも囲わなくてもよいのな。知らなかったよ。


| 緑色 | プログラミング | comments(0) |
| カテゴリ:みろりHP |
一日一食の実践結果



結論からいうと、やめることにした。



身長体重体脂肪率
175cm、60kg、9%。
普段の俺の食事と運動リズム
AMの間はものを食べない。12時すぎに昼食。16時くらいまでは気分次第でお菓子をつまむ。夜にジョギングと筋トレ。20-21時くらいに夕食。
夕食以外食べなかった(一日一食)結果
運動時に力が出ない。
お菓子と夕食をとった結果
空腹時にお菓子をつまんだことで、典型的な低血糖の症状が出る(動悸、蒼白感、冷や汗)。運動時のエネルギーは回復した。
お菓子じゃなくて昼に菜食し、夕食もとった結果
低血糖症状は出ず。運動時のエネルギーも良好。
つーかここまで来たらお菓子もつまんじゃおう
もとのリズムに戻ってんじゃねーか!

ネックとなったのはまず夕食前の運動だ。ジョギングは明らかにタイムが落ちた。これは以前炭水化物抜きダイエットを試したときにも経験した症状で、俺は運動は気持ちよくやりたいのでそんなのはアウト。それと、俺はお菓子が大好きなことだ。どか食いは論外だが、お昼にちょっとつまみたくなったとき低血糖症状を警戒してしまうのは気分がよくなかった。つーか低血糖になっちゃうってことは栄養が足りてないってことなんじゃねーか? だから結局、俺が一日で消費するエネルギーは一食ではまかないきれないってことになるのかもしれない。まあ、自分を実験台にしていろいろ試すのは好きなので楽しかったよ。明らかな低血糖症状を経験できたのも貴重な機会だった。あれはなかなか不愉快な感覚だったぜ。


| 緑色 | みろりHP | comments(0) |
| カテゴリ:プログラミング |
Python RSSリーダを作る



「RSSぅ? アレだろ、ブログの新着記事一覧が表示されるツールみたいなやつ」
違った。表示されるツールはRSSリーダであって、RSSはRSSリーダが読む文書のフォーマットのことだ。RSSは各ブログ、サイトが配信しており、たとえばうちのRSSは http://guild-elf.jugem.jp/?mode=rss から見ることができる。し、知らなかった。ともかくこれは特定のフォーマットに従って書かれておるので、それをパース(整理)することで新着記事の情報を取得できるって寸法だ。今回作ったリーダの機能はこんな感じ。

  • 拾ってきたRSSをjson形式でDB保存し、キャッシュとする
  • 前回のキャッシュが6時間ならそのキャッシュを使う
  • 前回のキャッシュが6時間以上前なら新たにRSSを拾ってきて保存する
  • キャッシュからhtmlを作って新着記事のリストをブラウザで表示する


実行すると、バシッとブラウザが開いてこんな風に表示されるよ。今回はとくに咬まれたところはなかったんで、気楽に、スクリプトのスニペットを並べていく。スクリプトはアップローダに置いたんでお好きにどうぞ。

みろりHPのファイル置き場



DB接続の仕方。俺はsqliteが好きなのでそれを使ってるぜ。しかもpythonにはデフォルトでsqlite3に接続するモジュールがあるのだ。使うっきゃないだろ。
import sqlite3
conn   = sqlite3.connect("example.sqlite3")
cursor = conn.cursor()
query  = "SELECT name,sex FROM tableName WHERE id=?;"
cursor.execute(query, (1,))
trash  = cursor.fetchall()
cursor.close()
conn.close()
executeメソッド実行の行で値のバインドを行っているが、バインドする項目が1つでもきちんとタプル化しないといけないのが注意すべき点だ。じつは (1) はタプルにはならないんだよな。(1,) こうしないとタプルにはならない。オライリーを読んでいなければ詰まってたと思う。
このモジュールには気に食わない点があって、SELECTクエリで返ってくるリストにはカラム名の情報が含まれていないのだよ。だからいちいち手動でディクショナリ化しないとカラム名で値を取り出すということができない。そのくらい処理オプションでつけてくれてもんじゃないの、pythonの旦那? つーわけで俺は以下のような関数をよく使ってる。
# cursor.fetchall() で返ってくるリスト
trash = [('なまえ', 'せいべつ')]

def assoc(trash, columns):
    rows = []
    for i in range(len(trash)):
        rows.append({})
        for j in range(len(trash[i])):
            rows[i][columns[j]] = trash[i][j]
    return rows

# 結果(ディクショナリ化したリスト)
print(assoc(trash, ["name", "sex"]))
# [{'name': 'なまえ', 'sex': 'せいべつ'}]

「今の時間が前の時間と何秒差か」求める方法。
import datetime
timeNow    = datetime.datetime.today()
timeBefore = datetime.datetime(2016, 3, 1, 0, 0)    # 2016.3.1. 00:00
delta      = round((timeNow - timeBefore).total_seconds())
年、月、日、時、秒の順番でdatetime.datetime()メソッドに渡すと、その時間のオブジェクトを作ってくれるのだ。

本日の主役feedparserの使い方。
import feedparser
original = feedparser.parse("http://guild-elf.jugem.jp/?mode=rss")
cacheDic = {}
cacheDic["siteTitle"]  = original.feed.title    # サイトのタイトル
cacheDic["siteUrl"]    = original.feed.link     # サイトのurl
cacheDic["articleNum"] = len(original.entries)
for i in range(len(original.entries)):          # エントリー配列が入った配列
    entry = original.entries[i]
    date  = entry.updated_parsed                # 更新日付
    month = "{0:02d}".format(date.tm_mon)       # 更新日付から月を取り出す
    day   = "{0:02d}".format(date.tm_mday)      # 更新日付から日を取り出す
    cacheDic["article" + str(i)] = {
        "title":entry.title,                    # エントリのタイトル
        "url"  :entry.link,                     # エントリのurl
        "date" :"%s/%s/%s" % (date.tm_year, month, day)
        }
いや何がステキって、feedparserって読むRSSがRSS1.0だろーがRSS2.0だろーがAtomだろーが同じ形式の配列にパースしてくれるんだよ。おかげでパース前にそのRSSがどの書式なのか判別する作業をこちらでやらずに済む。

最後に、影の主役webbrowserの使い方。
import webbrowser, os
realPath = os.path.realpath("html/example.html")
webbrowser.open(realPath)
これはローカルのhtmlファイルを開く方法だ。いやローカルのファイルパスなんて手打ちするわいって思うかもしんないが、os.path.realpath()通すと確実ですよ。それと、これはマジで面白いと思ったことなんだけど、webbrowser.open()ってさ、ブラウザを開く関数じゃないんだよ。具体的には、指定したパスのファイルを、個人で設定してる規定のプログラムで開く関数なのだよ。俺の環境だと.txtファイルのパスを与えたらsublime text3が開くし、.sqlite3ファイルのパスを与えたらDB Browser for SQLiteが開くってわけ。何を投げようとブラウザで開く機能なんだと思ってたから、.htmlファイル投げてsublime text3が開いたときはびっくりしたよ(俺はhtmlファイルはsublime text3と紐づけてる)。 これは絶対、ほかのとこでも使えるぜ。…このモジュールにwebbrowserという名前をつけた奴は何を考えてんだ、ほんで。


| 緑色 | プログラミング | comments(0) |
| カテゴリ:感想文 |
宮部みゆき『ICO』



図書館でふと見かけたので読んだ。ICOは俺がプレステ2で最初に遊んだゲームでなあ。そのころのことをちょっと思い出せてよかったよ。いつも通りサマリと感想を書く。



主人公のイコくんは生まれながらに角をもち、とっても頑丈に健康に生まれた。しかしそれは霧の城に捧げられるニエの証であった。彼は大きくなると霧の城へ送られてしまうが、いつものニエと違うところがひとつ。偶然発見された、光輝の書なる光のパワーアイテムの力を秘めた御印をイコは持参することになったのだ。その御印の力で、彼は霧の城に送られ石棺に閉じ込められても脱出することができた。さて霧の城から出てしまおうというところで彼は、霧の城の女王の娘が幽閉されているのを救助する。なんとこの子、ヨルダに触れると霧の城の過去の様子を幻影として観ることができるのである。
過去、この城の女王は魔神の手下という顔を隠し、国を繁栄させていた。が、諸外国は女王の闇の顔に気付き、戦争を仕掛けたのだ。その折、女王の娘たるヨルダは女王に反目、ともに霧の城を滅ぼす手伝いをしたのだが、最後の最後で情にほだされ女王を生き延びさせてしまう。諸外国は女王の魔法のパワーで手痛い攻撃をくらってしまい、恐慌に陥る。彼らはヨルダを責め、彼女を霧の城へ送り返し、彼女を媒体として時を止める魔法を城にかけ女王を閉じ込めることにより、難を逃れようとした。ニエのシステムが生み出されたのはそのときで、実はニエというのは女王を閉じ込めるというよりは、ヨルダを封じ込めるために使われるものだったのである。最初のニエには、その際ヨルダと仲の良かった、角をもった異国の騎士がすることになった。自分と自分の子孫がヨルダを見守り続けましょう、と言って。それがイコがここにいる理由だったのだ。
過去をしったイコに、女王は言う。私がこの封印を唯々諾々と受け入れたのは、拒否する必要がないからだと。もともと自分は魔神への供物をつくるためガンガンやっていたが、同じ人間に犠牲のニエをつまみ出し、異形の姿に変えて海のかなたに封じ込め、代償にひとときの平和を享受する、人の子が進んでそのような罪を犯す、この地上はすでに魔神への供物たりえているのだと。イコを殺さないのも、その必要がないからだと。イコをニエとしているのは女王ではなく、外の世界の人々だったのだ。だがもしイコが本当に討つべき敵、偽りの歴史をでっちあげ、イコの血族に過酷な義務をかしてきた者たちへの怒りに立ち上がるならば、女王が守護となり、その力を与えんと女王は提示する。
煩悶するイコであったがついには女王を討つ覚悟を決め、光輝の書の力を秘めた封印の剣でもって女王を倒し、霧の城を滅ぼすことに成功したのだった。



一番の見どころのひとつである、真実をしったイコがどの道を選ぶのか煩悶するシーンだけど、そこで打倒女王を選ぶ部分の描写が気に入らない。そのシーンでイコは、「女王そのものである霧の城内にいたら奴の思惑の中だから、とりあえず外に出よう」と海にダイブし、封印の剣が外の世界の情景を見せてくれたことで唐突に目覚め、なすべき事は何か理解する、そうなんだけど、意味がわからんよ。「女王の思惑に囚われた状態」と「封印の剣に目覚めさせられる」のって同じようなものじゃねーかな。どっちもマインドコントロールだよ。
なぜ「目が覚めて」打倒女王になるのかといえば、まあ、イコの血族はもともと光のほうの出身だからだろう。だからもともとイコに選択権なんてないんだよな。そしてイコは、これまで帝都の言われるままニエとして扱われてきたように、光の世界に闇を倒す道具として扱われることになる。「従っている意識がなくても無意識に従ってしまっている相手」が帝都から神とか運命にスライドするだけだ。イコが女王に「もう騙されない!」と毅然とした言葉を投げるシーンがあるけれど、そこなんかは典型的な傀儡っぷりだ。帝都のほうもイコを騙してるんだからな。むしろ女王のほうが彼に嘘をついた度合いは少ないんじゃねーか。
そのへんのなんやかんやが、聞こえのいい描写でふわっと流されているのがあまり気に入らなかった。

まあでも、霧の城内で得た情報がまるきりすべて嘘だったという線もあるかな。霧の城はすべて女王の思惑に支配されてるわけだから、そういうこともありえるかもしれん。エピローグで、砂浜に打ち上げられたイコが同じく打ち上げられたヨルダと再会するシーンがある。そこで、ヨルダが、今まで得てきたのとまったく違う本当の真実を伝える……なんてことがあったら面白いかもしんない。


| 緑色 | 感想文 | comments(0) |
| カテゴリ:プログラミング |
Sublime Text3のPythonビルドで日本語出力できない問題と、Python2、3ビルド切り替え



俺の愛用するSublime Text3のビルド機能だけど、pythonをビルドしたとき日本語が表示されない問題がある。以前のST3初期設定記事で書いたとおりpython3に関しては解決した話なんだけど、パイソニスタの末席を汚しまくるものとしてはやっぱりpython2もカバーしとかんとなと思ってまとめてみたぜ。今回の内容は以下。

  • Python2ビルドとPython3ビルドの切り替えをできるようにする
  • 2をビルドするとき日本語が表示されるようにする
  • 3をビルドするとき日本語が表示されるようにする



切り替えがしたいときは、2と3のpythonビルドシステムを新たに追加すればよい。ツール->ビルドシステム->ビルドシステム追加 から以下の sublime-build ファイルを作ってそれぞれの名前で保存。場所はデフォルト(C:/Users/ユーザ名/AppData/Roaming/Sublime Text 3/Packages/User)のところ。

// Python2.7.sublime-build の名前で保存(Python2.7の名前で表示される)
{
    "cmd": ["python", "-u", "$file"],
    "file_regex": "^[ ]*File ¥"(...*?)¥", line ([0-9]*)",
    "selector": "source.python",

    "windows":
    {
        "encoding": "cp932",
        "path"    : "C:/Python27"
    }
}

// Python3.4.sublime-build の名前で保存(Python3.4の名前で表示される)
{
    "cmd": ["python", "-u", "$file"],
    "file_regex": "^[ ]*File ¥"(...*?)¥", line ([0-9]*)",
    "selector": "source.python",

    "windows":
    {
        "encoding": "cp932",
        "path"    : "C:/Python34"
    }
}

例によって丸コピペするとバックスラッシュ部分が円マークになっちまうんで適宜バックスラッシュに直すこと。これで ツール->ビルドシステム に上のふたつが追加されるので、チェックを入れることで2と3がそれぞれ実行できる。なお俺は普通ビルドシステムは「自動」にチェックを入れてるのだけど、そのとき実行されるのはいま追加した「Python2.7」でも「Python3.4」でもなく、デフォルトの「Python」だ。「Python」に対応しているのはパスで先に指定しているほうだ。俺は基本的には3を使うので
C:¥Python34¥;C:¥Python27¥;
の順番に指定してある。



2のビルドで日本語出力を有効にするのは、出来たことは出来たが、ちと納得いってない。とりあえず手順は以下。

  • 上記にある「自動」あるいは「Python」で実行する場合は……
    • C:/Users/ユーザ名/AppData/Roaming/Sublime Text 3/Packages に Python というフォルダを作る
    • その中に、上に書いた Python2.7.sublime-build のビルドファイルを入れる
  • 上記にある「Python2.7」で実行する場合↑は必要ない
  • 実行するpyファイルに以下のコードを加える
    import codecs, sys
    sys.stdout = codecs.getwriter("cp932")(sys.stdout)
    

ST3で実行するためだけにコードを足すというのはどうも気持ちが悪いので他の方法を見つけなかったんだけど、見つからなかった残念。いつか見つかるといいんだけれども。



3のビルドで日本語出力を有効にするのは容易だ。2のやり方とだいたい同じ。

  • 上記にある「自動」あるいは「Python」で実行する場合は……
    • C:/Users/ユーザ名/AppData/Roaming/Sublime Text 3/Packages に Python というフォルダを作る
    • その中に、上に書いた Python3.4.sublime-build のビルドファイルを入れる
  • 上記にある「Python3.4」で実行する場合↑は必要ない



長らくpython2をいじってなかったんで、久々に文字コード問題とガチバトルを繰り広げてしまったぜ。プログラミングやり始めた頃の俺はよくメゲなかったものだよ。 付録として、バージョン切り替え、日本語出力テスト用に使ってたコードを添えておく。

# !/usr/bin/env python
# coding: utf-8

# ==============================
# python2.7で通るコードだよ
# ==============================

# これを書くことでsublime text3でも日本語がほいほい出るようになる
import codecs, sys
sys.stdout = codecs.getwriter("cp932")(sys.stdout)

print sys.version_info
print u"aあ" + u"あa"
print u"い"
print "b"


# 以下のようになればOK
# sys.version_info(major=2, minor=7, micro=11, releaselevel='final', serial=0)
# aああa
# い
# b

# !/usr/bin/env python
# coding: utf-8

# ==============================
# python3.4で通るコードだよ
# ==============================

import sys

print(sys.version_info)
print("aああa")
print("い")
print("b")


# 以下のようになればOK
# sys.version_info(major=3, minor=4, micro=3, releaselevel='final', serial=0)
# aああa
# い
# b


| 緑色 | プログラミング | comments(0) |
| カテゴリ:プログラミング |
Python クラスの使いみち



今日もやってまいりました、「1日1python」のお時間です。(ただし隔週放送)
初心者にとってクラスがよく分からない理由の、もっとも大きなものは「どんなとき、何に使うものなのか分からん」だと思う。ソースは俺。いやマジわかんねーんだって。そこで、クラスの使いみちをひとつ紹介しておこうと思う。実はこないだ作ったコンソールゲーム『一石二鳥』はクラスの修行も兼ねていたので、どうでもいいところにまでクラス、インスタンスを使いまくっていたんだけど、ひとつだけ「お、こりゃクラスを使って大正解なんじゃないかな」と思った部分があったのだ。そこを書く。



作るのは、ゲームのコマンド入力システムだ。『一石二鳥』のシステムでは、フィールドにいるときはだいたい「wで前進」「sで後退」「cでメニューを開く」「saveでセーブ」ができる。それを実現するためにはこんな感じのを書けばよい。

while 1:
    print("w,s,c,saveのどれかを押してね")
    key = input()
    if   key == "w":
        print("前に進んだぜ")
    elif key == "s":
        print("後ろに戻ったぜ")
    elif key == "c":
        print("メニューを開くぜ")
    elif key == "save":
        print("セーブします")
    else:
        print("無効なコマンドです")

うんオーケイだ。でもさあ、フィールドはいっこじゃないし、メニュー画面でだってコマンド入力する場面があるし、そもそも毎回if文を書きまくるのって面倒くさいし見栄えがよくない。面倒くさいから関数化しようぜ!

# フィールドのファイルではこんな感じ
def inputW():
    print("前に進んだぜ")
def inputS():
    print("後ろに戻ったぜ")
def inputC():
    print("メニューを開くぜ")
def inputSAVE():
    print("セーブします")

while 1:
    print("w,s,c,saveのどれかを押してね")
    key = input()
    if key in ["w","s","c","save"]:
        eval("input" + key.upper())()
    else:
        print("無効なコマンドです")

# メニューのファイルではこんな感じ
def inputW():
    print("メニューの上の項目へ移動するよ")
def inputS():
    print("メニューの下の項目へ移動するよ")
def inputZ():
    print("その項目を選択するよ")
def inputSAVE():
    print("セーブします")

while 1:
    print("w,s,z,saveのどれかを押してね")
    key = input()
    if key in ["w","s","z","save"]:
        eval("input" + key.upper())()
    else:
        print("無効なコマンドです")

こういう書き方をすれば、新しいファイルを作るたびに毎回if文を書かなくて済むぜ。まあそのぶん毎回関数を書くハメになっちゃうんだけど、個人的にはif文を書きまくるよりいいと思う。if文を書きまくる奴はひとつのメソッドが長くなっちゃうからね。オライリー本様も、ひとつの関数は画面に収まるくらいが良いと申しておった。
でもさあ、wとかsを入力した時の挙動は場面ごとに違うからこれでいいけれど、saveを入力したときの挙動はつねにセーブなのですよ。なのに毎度セーブのぶんの関数を書くのは面倒だし、何か書きミスがあったとき「あ、この場面でのセーブだけちょっとバグってるじゃん」ってなるし、テストプレイするときsaveを押したときの挙動をテストするのに全場面でsaveを押さないといけないし、「あそうだ、save押したときに『セーブしますよ』っていうメッセージ入れたい」って思ったとき全場面のinputSAVE()に書き加えないといけなくなるじゃん? 面倒じゃん? そこでクラスの登場ですよ。

# これをスーパークラスとする
class Command:
    def foo(self, key, acceptList):
        if key in acceptList:
            eval("self.input" + key.upper())()
        else:
            print("無効なコマンドです")

    def inputW(self):
        pass
    def inputS(self):
        pass
    def inputC(self):
        pass
    def inputZ(self):
        pass
    def inputSAVE(self):
        print("セーブします")

# フィールドのファイルはこうなる
class Field(Command):
    def main(self):
        while 1:
            print("w,s,c,saveのどれかを押してね")
            key = input()
            self.foo(key, ["w","s","c","save"])

    def inputW(self):
        print("前に進んだぜ")
    def inputS(self):
        print("後ろに戻ったぜ")
    def inputC(self):
        print("メニューを開くぜ")

# メニューのファイルはこうなる
class Menu(Command):
    def main(self):
        while 1:
            print("w,s,z,saveのどれかを押してね")
            key = input()
            self.foo(key, ["w","s","z","save"])

    def inputW(self):
        print("メニューの上の項目へ移動するよ")
    def inputS(self):
        print("メニューの下の項目へ移動するよ")
    def inputZ(self):
        print("その項目を選択するよ")

これが今回使った構成だ。サブクラスであるFieldとMenuの中から、入力キーによって振り分けを行うfoo()メソッドを呼び出す。これはスーパークラスCommandにあり、foo()からはCommand内のそれぞれのinputなんちゃらメソッドを呼び出す。だけどそれぞれのサブクラスで、そのサブクラス内で使うinputなんちゃらメソッドは上書きをしてあるので、実行されるのはサブクラス内のinputなんちゃらメソッドのほうだ。saveを入力したときは、サブクラスでは上書きしていないので、スーパークラス内のinputSAVE()メソッドが実行される。上で「inputSAVE()を毎回書くのはヤだな」と言っていた問題はこれで解決する。

ちなみにだけど、上のみっつのクラスは別々のファイルに書くみたいな風に言ってるけども、ひとつのファイルに書いてもふつうに動く。動作を見たい場合は、以下のスニペットを最後に足せば見ることができるぜ。

instance = Field() # あるいはMenu()
instance.main()



以上が、今回クラスを使いまくってみて、とくに「これはクラス使って正解だったんじゃないかな」と思った部分だ。
本文内で何度も「面倒じゃん?」と言っているけども、まさにそれが「クラスってどんなときに使うもんなの」の答えじゃないかと俺は思う。ぶっちゃけクラス使わなくても良いわけですよ。一番最初のif文の構成でも良いわけですよ。でも、面倒じゃんいろいろと? その面倒さを感じるときになったときがクラスに手を出す瞬間なんだと思う。
どうして最近緑の野郎はやたらとクラスの話題ばっかし書きまくってんのかというと、そろそろ「クラスが分からないレベル」を抜け出せそうなんで、つまり、「クラスが分からないレベル」の頃の気持ちが分かるのは今だけだからだ。今のうちに「クラスが分からないレベル」の人にも分かるクラス説明をなるたけ量産しておこうと思って。説明をするとき致命的なのは、説明する側が「なんでコイツは理解できてねーのか」理解できないことだからな。


| 緑色 | プログラミング | comments(0) |
| カテゴリ:感想文 |
南雲吉則『「空腹」が人を健康にする』



この本は一日一食を推奨し、その効果を科学的な方向と経験談的な方向から書いている。知り合いが「緑ってこういうの好きでしょ」と紹介してくれたのだ。よくわかってんな。



参考になったのは以下のような箇所。

  • あらゆる動物実験において飽食状態よりも小食であるほうが生存期間が延びることがわかっている。エサの量を40%カットすることで寿命が1.5倍ほど延びるという結果が出たこともある。飽食の猿は毛が抜けて顔の皮膚がたるみ、老化が進んだという。デブが醜いのは実体験で知っている。
  • 糖尿病はあらゆる捕食器官が退化していく病気であり、進化の証ともいえる。飽食に慣れた身体に手足や感覚器官は必要ないので糖尿病性壊疽や糖尿病性網膜症というかたちで退化していくのである。つまり、飽食という急激な環境変化に対する適応と言える。
  • 生命力遺伝子のひとつであるサーチュイン遺伝子は空腹状態において活性化し、体内の遺伝子をすべてスキャンし、壊れたり傷ついたりしている遺伝子を修復する。主にコイツが一日一食推奨の根拠になっているようだ。
    • 我々の身体は飢えに強いが満腹には適していない。17万年に及ぶ人類の歴史はつねに飢えと寒さとの戦いであり、お腹いっぱい食べることができた時期はわずか100年にも満たない。遺伝子の最適化は長い進化の過程を経る必要がある。
    • 寒さの中においては内臓脂肪が燃焼する。内臓脂肪は1gが燃焼すると9kcalの熱を生産できる。ただし内臓脂肪が燃焼する際にはアディポサイトカインなる、自己と外敵の区別がつかない免疫物質が発生し、血管の内皮細胞を傷つけてしまう。これが原因で動脈硬化が起こる。内臓脂肪の多いメタボが動脈硬化をおこしやすいのは、燃える内臓脂肪が多く、それに比例してアディポサイトカインが多いため。
    • 男性は内臓脂肪型であるのに対し女性は皮下脂肪型である。皮下脂肪型である女性が寒さに耐える方法は、内臓脂肪の塊である赤ちゃんである。飢えや寒さという危機状態における妊娠率はとても高いため、動物のメスは冬眠時にも生き延びることができる。このメカニズムが、先進国の出生率が低く、発展途上国で人口爆発が起こる理由。
    • 脳細胞が復活しないというのは定説だが、シナプスは新たに作られることがある。ただしそれは飢えと寒さに晒されたとき、つまり危機の状態におかれたときに限られる。
    • 脳が疲れたとき糖分を摂るという言説があるが、そもそも脳が疲れることはない。むしろ、お腹が空いているとき脳はもっとも活発に働く。
    • 脳が糖分しか利用できないのは確かだが、脂肪もタンパク質もデンプンも、体の中ではブドウ糖に変わり、脳に届けられるようになっている。甘いモノを食べなくても血糖値は十分上がるので、脳のためにわざわざ糖分を摂る必要はない。
    • 胃潰瘍で入院すると絶食と点滴をなされるが、これは点滴で潰瘍を治しているのではなく、絶食によって身体の治癒力を引き出しているのである。
    • <お腹が鳴るのは空腹を知らせるサインだが、そのときこそサーチュイン遺伝子が発現している状態である。つまり、腹の鳴っているのが体中の壊れた箇所が修復され若返り健康になっている期間の証といえる。こうしたイメージの付与は俺みたいなタイプには非常に有効だ。
  • ……と、散々飢えの素晴らしさを並べたが、実際に飢餓状態になるわけでなく、適度な飢餓を身体に与えるのが一日一食である。
    • 一食は夕食にするのがおすすめ。食事をとると血糖値が上がり眠くなる。眠くなったら眠るのが自然な姿である。昼間眠れない人は昼食を避けるのが自然。
    • がつがつ食べる必要はない。生命力遺伝子のひとつである倹約遺伝子は飢餓状態においてよく働き、栄養効率を非常によくする。
    • バランスの取れた食物とは、我々の身体を構成している栄養素と同じ種類の栄養素が、同じ比率で含まれているものといえる。こういう考え方を「一物全体」という。牛や豚を一頭まるごと食べるのがよいということだがそれは非現実的なので、魚をまるごと一尾、皮ごと骨ごと頭ごと食べるのがよい。野菜についても一物全体の考え方は同じで、葉ごと皮ごと根っこごと食べるものである。かつての日本人は誰もがこうした完全栄養を意識することなく取り入れており、庶民の当たり前の食事であった。そして江戸時代元禄期以前の日本の食事は、アメリカ政府の調査したマクガバン・レポートによって高く評価されたことがある。
    • 魚がよい理由としては、サイズの他に脂の性質がある。牛や豚など恒温動物の脂肪は室温ではラードになり固まってしまう。そうした脂は動脈硬化の原因となる。一方変温動物である魚の脂は冷たい海水の中でも固まらないので血管内で固まる心配はない。それどころか血管を詰まらせる悪玉コレストロールと置き換わることができる。こうした脂肪はとくに青魚に多く含まれる。
    • 完全栄養食品の例としては、ミルク、卵がある。赤ちゃんがミルクだけで育つことができるのはミルクが完全栄養であるからだし、卵一個の中には鶏一羽ぶんのもとになるあらゆる栄養素が含まれている。また、それらを原材料としたクッキーも完全栄養食品といえる。著者は干しブドウやナッツの入っている、全粒粉の甘みを控えたクッキーが気に入りだそうだ。
    • 果物の皮には傷を治す創傷治癒作用と抗酸化作用があるので、林檎や梨、柿、ブドウなどは皮ごと食べるもの。
    • 骨中のカルシウムを増やすには、運動によって骨に負荷をかければよい。宇宙飛行士が我々の何倍もカルシウムを摂っているにもかかわらず骨粗鬆症になるのは、重力の影響下で運動していないためである。なお老人の骨がもろくなるのは、骨を強くして筋肉をたくましくするタンパク同化作用をもつ性ホルモンの分泌が減少するからである。
    • カフェインはアルカロイドの一種である。アルカロイドとはニコチンやコカイン、モルヒネなどにも含まれている麻薬成分で、副交感神経に対して刺激作用がある。お茶に含まれるタンニンも毒といえる。革をなめすのに使われることもあり、つまり頑丈なタンパク質を変性させる性質があるからである。食後にお茶を飲むと満腹感がやわらげられるのは、タンニンが消化管の粘膜を変性させて消化吸収障害が起こるからである。烏龍茶が油っこい中華料理によくあったり、お酒と一緒に飲むのも同様の理由。
    • いっぽう麦茶やごぼう茶はカフェインが入っていない。ゴボウのポリフェノールはあらゆる植物の中で最強のもので、すぐれた抗酸化作用をもつ。しかもゴボウにはカフェインのような中毒性もない。
    • ごぼう茶の作り方は、1.ゴボウを水洗いして皮付きのままささがきにする。2.そのまま新聞紙の上に広げて半日天日干しにする。3.フライパンで油を使わずから煎りする。4.煙の出る寸前で止め、急須にいれて沸騰した湯を注ぐ。
  • お腹が鳴る原因は空腹期収縮である。いつまでも食事がこないと、小腸の入り口にある食べ物センサーがモチリンという消化ホルモンを出し、胃を収縮させる。これは胃の中に残っているかもしれない食べ物を小腸に送ろうとする作用のことで、この動きがお腹グーグーの正体である。
    • モチリンで胃を絞っても食べ物が流れてこなければ、胃袋がグレリンというホルモンを出す。グレリンは脳の視床下部に働いて食欲を出させ、同時に下垂体に働き成長ホルモンを分泌させる。この成長ホルモンは若返りホルモンともいい、つまり、腹がグーグー言っているとき我々の体は若返っているといえる。前述したサーチュイン遺伝子もこのとき効果を発揮しており、体中の遺伝子をコイツがスキャンし損傷箇所を修復している。
    • それでも食事が入ってこないと体は内臓脂肪を分解して栄養に変えてくれる。なお運動したとき優先的に使われるのは内臓脂肪ではなく筋肉内のグリコーゲンなのでスポーツのあとは低血糖になてお腹がすく。
    • 食事をとって満腹になってくるとレプチンが分泌される。食欲を抑える働きからやせホルモンとも呼ばれる。ダイエットのリバウンド現象というのは、満腹状態が常態化しレプチンの効きが悪くなった人が突然ダイエットし、レプチンの分泌量が急激に減って食欲が抑えきれなくなることをいう。
  • いわゆる「おやじ臭」はノネナールという。肉食やメタボの人に多い皮脂が酸化することで発生する。肉食をやめると体臭がなくなるのは実体験で知っている。
  • 体臭、皮脂、ニキビの主な原因はアンドロゲンという男性ホルモンの一種である。性ホルモンはコレステロールからできるので、一日一食で血中コレステロールが減るとアンドロゲンも減って肌はキレイになり体臭はなくなる。
  • ストレスがあると毛がぬけるのは、ストレスによって多くなったアンドロゲン量が転換酵素で薄毛ホルモンに変わり、結果として大量の薄毛ホルモンが現れるからである。それの元となるアンドロゲンが減ると薄毛も予防される。
  • 日本では、戦後のある時期までは、旧厚生省が健康優良児制度を施行し太っている子供を表彰してきた歴史がある。近年は小児肥満を助長することになるという理由で廃止された。知らなかったが、ドン引きものの制度だな。
  • 本来、食事は空腹でお腹がグーッと鳴ったら食べればよい。ところがお腹がすいていなくても、時間がくれば習慣で食べているという人が、圧倒的に多いのでは。
  • 肉食の動物が獲ったウサギに塩をふって食べることはないし、草食の動物が草を食べるときに、ドレッシングをかけることはない。なぜか。自然に存在する動植物に含まれている塩分だけで、十分に体を維持できるからである。



といった感じで参考にできた点の多い本だったけど、参考にしなかった点もまた多い。たとえば著者は甘いお菓子の摂取に厳しく警鐘を鳴らしているが、俺はお菓子が大好きなのであまり見向きしなかった。俺は、こういった本……広義の啓蒙本といえると思うが、そういうタイプの本は自分が好きなことをさらに気持ちよく行うために使うことにしており、自分が好きなことをやめるためには使わない。今回のケースでは、俺は節食という行為が好きなので、節食に関するポジティブな知識を得ることでそれをさらに気分よく行うために使った。逆に自分にとってあまり嬉しくない情報については流し読みをしておいた。自分にとって良くないことは何かといえば、人に「良くない」と言われたことではなく、自分が「良くない」と身を持って感じたことだ。

最後にこの本で気に食わなかった部分をすこし。一日一食を推奨する理由やメカニズムに関してはとてもよく書かれていたのだが、本の後半を占めている、食事外の生活に関する部分は蛇足だろう。一日一食に関する箇所は淡々とデータや解説を並べる構成になっているのに後半は妙に押し付けがましい。これがなければ一日一食推奨のメーンテキストという扱いができただろうが、これじゃあな。


| 緑色 | 感想文 | comments(0) |
| カテゴリ:ゲーム |
フリーゲーム「Reincarnation」



HPはここ
なんかよくわからん閉鎖空間で、意味不明な案内役に導かれ戦闘に明け暮れ、謎の少女たちを仲間に加えながら閉鎖空間の深奥まで突き進んでいくお話。たぶんラスボスまでクリアーしたんで、以下にサマリと所感を書く。クリア時間は8時間くらいだった。



いじめられんぼの子が自分の世界に閉じこもって夢をみている。夢の中にはその子が創ったキャラクターたちが大勢おり、みんなその子が目覚めるのを祈っている。あるときひとりのキャラクターが他のキャラクターたちを総動員し、その子を叩き起こすべく暴れだす。少女の心の中にあるトラウマを叩きのめし、散らばっている希望をかき集め、しょんぼりしている主様にお渡しし、主様は現実世界に戻ってめでたしめでたし。って感じだろうか。

いや、なんで自分が作ったキャラクターが自分の中で暴れまわってんのよ。と思ったが、考えて見るに、OPで最初に選んだキャラには主様自身が入っているんじゃなかろうか? ストーリー内でしきりに「彼女は君みたいになりたかった」と言われているのと、周回のたびに訊かれる「君は誰だ?」という選択肢が根拠。つまりこの話は、自分の世界に閉じこもってしまったものの、一念発起し理想のキャラクターというアバターを使いトラウマと戦うものなのだ。

  • 戦闘がサクサクでよい。
  • フィールド画面の上のレイヤで戦闘画面が展開するのはウディタのデフォルト機能だけど、これはとても好きだ。
  • 周回がサクサクでよい。
  • 10人以上の仲間たちに経験値を振るのがややしんどい。最初は均等に振っていたんだけれど、ついにメゲて戦いやすいメンバを固定パーティとし進めた。まあreadmeにも「少女それぞれに出来ることはあっても、その少女にしかできないことはほとんど無い」と書かれており、つまり、それぞれちょっとずつ触り、好みのキャラクターでパーティを組むのが正解ってことでいいんだろう。
  • 周回していくと話の裏側がわかっていく構成になってる。
  • シンボルエンカウントではあることだし周回はやりやすいようになっているが、どうしても2周目以降ただ走り抜けるだけの道中が長く感じてしまう。
  • 雰囲気はあまり好みじゃない。だが、この世界を創った主がいじめられっ子なんで、地に足の着かないような世界観になってしまうのはまあ仕方ないよな。

固定パーティは以下。名づけて「クララが立ってる限り無敵」。
    イルガ
    最初に選んだキャラを最後まで使用。戦闘前半は不意打ちとクララへの活性針で態勢を整える。あとはひたすら気が狂ったように「手が滑った」を連打。「手が滑った」を覚えるまでは通常攻撃を連打していた。さらにクララが倒れたときには「おはやし」で仮の盾を作り、戦況をリセットできる。
    リオ
    破壊の衝動のセルフバフからの乱れ撃ちで暴れる独立戦闘マシーン。
    コーデリア
    バフとアイテム係。このPTには回復役がいないので、アイテムはヘヴィーに使うことになる。
    クララ
    PTの要。つーか固有スキルの「ひきつける」が壊れ性能だ。つまりはデコイスキルなんだけど、他メンバ単体攻撃を引き受けるばかりか、全体攻撃(4撃)を単体攻撃(1撃)に変えるという驚愕の能力。コイツを敵に回したら、全体攻撃はそのアイデンティティを一切失うと言っていいだろう。これを貫通する攻撃は存在しないようなので、あとはいかにクララを生存させ続けるかという問題になる。まあ問題というか、装備でHPと防御、精神を上げるだけなので、ボスごとの戦術などはほとんど不要だった。

唯撃破時のレベルは50だった。


| 緑色 | ゲーム | comments(0) |
| カテゴリ:プログラミング |
Python コンソールプログラムのexe化



最近つくったコンソールゲーム、『一石二鳥』を実行ファイル化したときの話。相変わらず趣味レベルなのに断定口調で書きまくるが、確証はないのであしからず。これまでもcx_freezeを使ってpythonスクリプトをexe化したことはあったんだけど、今回のスクリプトはちょっと以前のと作りが違ったわけですよ。具体的には次のような部分。

以前の
  • GUIにpygameやtkinterなどpythonのGUIモジュールを使う
  • スクリプト内で使うモジュールは標準モジュールか、同階層に存在する自作モジュール
今回の
  • GUIにシェルを使う
  • スクリプト内で標準モジュールと自作モジュールを併用しており、それらは階層化したディレクトリに偏在している
同じところ
  • 外部の静的ファイル(画像とかDBファイルとか)を使っている

それにともないcx_freezeの実行スクリプトを書き換える必要があった。

import sys, os
from cx_Freeze import setup, Executable

# ==============================
# 全ディレクトリをsys.pathに登録する ここから…
# ==============================
def makeDirs():
    dirs = []
    dirs.append(os.getcwd())
    for directory in dirs:
        files = os.listdir(directory)
        for f in files:
            path = directory + "¥¥" + f
            if os.path.isdir(path):
                dirs.append(path)
    return dirs

def makePaths():
    dirs = makeDirs()
    for directory in dirs:
        if directory in sys.path:
            pass
        else:
            sys.path.insert(0, directory)

makePaths()
# ==============================
# …ここまで
# ==============================

exe = Executable(
    script = "KillBirds.py",   # ファイル名
    icon   = "python.ico",     # アイコン
    base   = "Console")        # デフォルトが"Console"なんでNoneでもよい

setup(
    name        = 'MyPython',
    version     = '1.0',
    description = 'application',
    executables = [exe],
    options     = {
        "build_exe":{"includes":[], "excludes":[], "packages":[]}
        },
    ) 

GUIに関連するのが base = "Console" の部分で、自作モジュールの偏在に関連するのが「ここから…」「…ここまで」の部分だ。前者はともかく後者で何をやっているのかというと、俺が命名するところの「奥義:相対インポートなんていーらない」ですね。すなわち、別階層の自作モジュールをインポートするためには本来トップレベルファイルから相対インポートをするのだが、相対パスを毎度書くのが面倒くさいので、モジュール読み込みディレクトリの候補が格納されているsys.pathに、使用予定の全ディレクトリパスを書き加えちまおうという技である。いやー、これは相対インポートレポートの調査をしているときに発見したものだったが、やっぱり自分で発見した技が実際に役立つというのは嬉しいものだ。
けど実はこの処理って、スクリプトにもう書いてあるものなんだよなー。どうしてcx_freeze実行ファイルのほうにも必要なのかはわからん。まあともかく、これを実行すればexeファイルの入ったビルドフォルダが出来上がる。もちろんそのフォルダには静的ファイルは入っていないんで、それを加えたら完成だ。



さて今回のスクリプトはすでに述べたようコンソール上で動作するゲームなので、完成したexeファイルを実行するとコマンドプロンプトが立ち上がる(いや正しくいうと base = "Console" って指定したからなのだけども)。しかし、プログラムがエラーを吐くとコマンドプロンプトが消えちまう。不便だ。それはこの形で立ち上がったコマンドプロンプトには /C なるオプションが設定されているからである。これは指定されたコマンドを実行したあと、コマンドプロンプトを終了するというオプションで、そりゃ、エラーが起きてプログラムが終了したら消えますわって話だ。まあ、仲間に遊ばせるとき内部エラーが見えたら恥ずかしいのでさっさと消えてもらった方がいい、というなら別なんだけど、そんなことはないので、プログラム終了後もコマンドプロンプトが消えないオプション /K を設定する方法をとる。他にもやりようはあると思うんだけど、今回俺が見つけた方法は以下。

  • 作ったexeファイル(/Cで立ち上がるファイル)のショートカットを作る
  • そのショートカットのプロパティから、リンク先の内容を cmd /K exeファイルの名前 という風に書き換える
  • exeファイルの実行はショートカットのほうから行う

こうすると「まず/Kでcmdが立ち上がり」「その中でexeファイルが/Cで立ち上がる」ということになる。これならexeファイルの/Cのcmdが終了しちまっても、それを実行している/Kのcmdは終了しないのでエラー内容を見ることができるって寸法だ。うん、まあ俺の環境ではそれでオーケイだった。



これまでのexe化関連記事をまとめとく。

Python exe化 cx_Freeze (2015.08.03.)
Python pygameスクリプトのexe化 (2015.08.10.)


| 緑色 | プログラミング | comments(0) |
     12
3456789
10111213141516
17181920212223
24252627282930
<< April 2016 >>
+ みろりHP内検索
+ 閲覧記事
+ 過去記事アーカイブ
+ 年月選択
  • 2019年 02月 (1)
  • 2019年 01月 (2)
  • 2018年 12月 (6)
  • 2018年 11月 (6)
  • 2018年 10月 (3)
  • 2018年 09月 (8)
  • 2018年 08月 (4)
  • 2018年 07月 (6)
  • 2018年 06月 (5)
  • 2018年 05月 (4)
  • 2018年 04月 (7)
  • 2018年 03月 (6)
  • 2018年 02月 (6)
  • 2018年 01月 (8)
  • 2017年 12月 (9)
  • 2017年 11月 (9)
  • 2017年 10月 (4)
  • 2017年 09月 (6)
  • 2017年 08月 (6)
  • 2017年 07月 (8)
  • 2017年 06月 (4)
  • 2017年 05月 (7)
  • 2017年 04月 (8)
  • 2017年 03月 (7)
  • 2017年 02月 (10)
  • 2017年 01月 (6)
  • 2016年 12月 (8)
  • 2016年 11月 (8)
  • 2016年 10月 (5)
  • 2016年 09月 (5)
  • 2016年 08月 (7)
  • 2016年 07月 (9)
  • 2016年 06月 (6)
  • 2016年 05月 (8)
  • 2016年 04月 (10)
  • 2016年 03月 (10)
  • 2016年 02月 (8)
  • 2016年 01月 (10)
  • 2015年 12月 (9)
  • 2015年 11月 (6)
  • 2015年 10月 (5)
  • 2015年 09月 (4)
  • 2015年 08月 (8)
  • 2015年 07月 (5)
  • 2015年 06月 (3)
  • 2015年 05月 (7)
  • 2015年 04月 (8)
  • 2015年 03月 (12)
  • 2015年 02月 (8)
  • 2015年 01月 (4)
  • 2014年 12月 (5)
  • 2014年 11月 (5)
  • 2014年 10月 (7)
  • 2014年 09月 (4)
  • 2014年 08月 (7)
  • 2014年 07月 (6)
  • 2014年 06月 (4)
  • 2014年 05月 (12)
  • 2014年 04月 (9)
  • 2014年 03月 (6)
  • 2014年 02月 (6)
  • 2014年 01月 (8)
  • 2013年 12月 (7)
  • 2013年 11月 (10)
  • 2013年 10月 (10)
  • 2013年 09月 (9)
  • 2013年 08月 (11)
  • 2013年 07月 (10)
  • 2013年 06月 (9)
  • 2013年 05月 (15)
  • 2013年 04月 (11)
  • 2013年 03月 (5)
  • 2013年 02月 (7)
  • 2013年 01月 (6)
  • 2012年 12月 (9)
  • 2012年 11月 (10)
  • 2012年 10月 (10)
  • 2012年 09月 (4)
  • 2012年 08月 (2)
  • 2012年 07月 (7)
  • 2012年 06月 (13)
  • 2012年 05月 (13)
  • 2012年 04月 (15)
  • 2012年 03月 (4)
  • 2012年 02月 (12)
  • 2012年 01月 (9)
  • 2011年 12月 (5)
  • 2011年 11月 (13)
  • 2011年 10月 (2)
  • 2011年 09月 (2)
  • 2011年 08月 (1)
  • 2011年 06月 (1)
  • 2011年 05月 (4)
  • 2011年 04月 (10)
  • 2011年 03月 (8)
  • 2011年 02月 (11)
  • 2011年 01月 (14)
  • 2010年 12月 (14)
  • 2010年 11月 (17)
  • 2010年 10月 (17)
  • 2010年 09月 (19)
  • 2010年 08月 (22)
  • 2010年 07月 (18)
  • 2010年 06月 (16)
  • 2010年 05月 (19)
  • 2010年 04月 (15)
  • 2010年 03月 (22)
  • 2010年 02月 (18)
  • 2010年 01月 (18)
  • 2009年 06月 (2)
  • 2007年 12月 (10)
  • 2007年 11月 (7)
  • 2007年 10月 (9)
  • 2007年 09月 (4)
  • 2007年 07月 (5)
  • 2007年 06月 (11)
  • 2007年 05月 (6)
  • 2007年 04月 (4)
  • 2007年 03月 (1)
  • 2006年 01月 (21)
  • + カテゴリ
    + ブックマーク
    + 最近のコメント
    + アクセスカウンター
    全体(since 2010.02.03.)
    今日… 昨日…