Fallout3 に出てくるゲイリーの元ネタ?
住人が全員ゲイリーという名前のクローン人間ばかりになっている核シェルターが Fallout 3 に登場する。
先日、本を読んでいたら、このゲイリーの元ネタっぽいものを見つけた。本のタイトルは「平均思考は捨てなさい」(原題:THE END OF AVERAGE)だ。
子供たちを組織化して教育を施し、工場での仕事を「完璧に」こなす労働者に仕立て上げるため、テイラー主義者は科学的管理法の中心的な教義に従って教育制度全体の構造の見直しに取り組んだ。すなわち、平均を使ってあらゆるものを標準化したのだ。例えば、全米の学校が「ゲイリー・プラン」を採用する。これはインディアナ州の工業都市ゲイリーに由来するもので、(以下略)
(Googleブックスの立ち読みページより問題部分を太字にして引用。)
なんとなく、この社会思想には覚えがあるなと思っていたら、Falloutの世界観にそっくりじゃん。しかもゲイリー・プランって。
すぐに英語版ウィキペディアで詳細を調べてみたのだが、そうしたら William Wirt (ウィリアム・ワート?)なる教育家が出てきた。
「ゲイリー!ゲイリーなのか?」
なんか、この人、ゲイリーに似てない? 目の下の皺とか、髪型とか、眉毛の角度とかが一致してるように見えるんだけど。
画一的な労働者に画一的な作業をさせて最高の生産性を実現しようというテーラー主義の夢は、ひょっとしたらひょっとして、Falloutの世界でクローン技術と出会い、そして無残にも失敗した、ということになっているのかもしれない。
以上が小生の推測なんだけど、確証を求めて色々思い当たる所を英語で検索してみたのだが、この件について言及しているところは1つもなかった。というわけで真相はよくわからん。
コンソールスクリプトが別ウィンドウで実行される
OSを再インスコして気づいたけど、PythonみたいなスクリプトファイルをPowerShellから直接実行しようとすると別ウィンドウに表示されるのな。
一方で py hello.py
とか python hello.py
とかやると、ちゃんとコンソールウィンドウを引き継いでくれる。
この動作は普通なのかなと思って、ちょっとググってみるが、どうやらそうっぽい。
- powershell - Run python programs without opening a separate shell - Stack Overflow
- windows - Run Python scripts in PowerShell directly - Super User
PATHEXT に .py を追加しておくと、従来のコマンドプロンプトと同じ動作になる。
毎回コンソールを立ち上げるたびに手動で PATHEXT を変更するのは面倒なので、大元の環境変数を変更しておくとよい。
PATHEXTの意味
PATHEXT の本来の目的は、拡張子の指定を省略することにある。.exe をつけなくても py.exe や ipconfig.exe が起動するのはそういう理由による。
PATHEXT に .py が追加されると、このように拡張子を省略してもファイルが実行されるようになる。
コマンドラインからEvernoteのバックアップをとる
Windows版のEvernoteクライアントにはENScriptというコマンドラインユーティリティが付属してくる。これを使うとノートのバックアップが簡単にとれる。
# デフォルトならENScriptはここに入っているはず cd ${env:ProgramFiles(x86)}\Evernote # ヘルプの表示 .\ENScript.exe /?
見ての通り色々な機能があるけど、バックアップに使うのは exportNotes という(サブ)コマンド。こいつを使うとenex形式でファイルを出力できる。
# 全部保存するなら "any:" 指定 .\ENScript.exe exportNotes /q 'any:' /f $env:temp\full.enex # 3日以内に更新されたノートだけでいいなら "updated:day-3" を指定 .\ENScript.exe exportNotes /q 'updated:day-3' /f $env:temp\within3days.enex
こうして書き出したenexファイルからノートを復元するには、「ファイル→インポート→Evernote エクスポートファイル」からできる。
参考
- Control Evernote from the command line - ENScriptの使い方
- All things Evernote search - /q 引数に指定するクエリーの詳細
PowerShellでエイリアスの逆引き
あるコマンドレットにどんなエイリアスが設定されているのか見たいことってあるわな。
例えば、Get-ChildItem にどんなエイリアスが設定されているのか調べるにはこうする。
Get-Alias -Definition Get-ChildItem
端的に言うと Get-Alias に -Definition を付けるとエイリアス先を、付けないとエイリアス名を調べるということです。
ちなみに、デフォルトで一番多くエイリアスを持っていたのは Remove-Item でした。
Get-Alias | Group-Object -Property Definition | Sort-Object -Property Count | Select-Object -Last 10
urllib.requestを使って日本語ドメインを含むURLを取得しようとするとエラーになる
# Python 3.6.1 import urllib.request res = urllib.request.urlopen('http://日本語.jp/about/') # UnicodeEncodeError: 'latin-1' codec can't encode characters in position 0-2: ordinal not in range(256)
urllibの手足である http.client と socket は既に国際化ドメインに対応してます。
しかし、urllib が punycode で符号化せずに Host ヘッダーをくっつけているので、エラーになっている模様。
回避策① 手動でHostヘッダーを設定する
import urllib.request req = urllib.request.Request('http://日本語.jp/about/') req.add_header('Host', req.host.encode('idna')) # これ! res = urllib.request.urlopen(req) # あとは通常どおり print(res.status, res.reason) content = res.read() print(repr(content[:1000]))
回避策② 他のライブラリを使う
たまに使われているのを見かけるrequests、こちらは国際化ドメインに対応してました。
しかし、標準ライブラリに入っていないので別途インストールが必要です。依存ライブラリが多いのでWindowsでもpipを使ってインストールした方がいいでしょう。コマンドラインから python -m pip install requests
みたにやると一発で入ります。
import requests res = requests.get('http://日本語.jp/about/') print(res.status_code, res.reason) print(repr(res.content[:1000]))
punycodeとidnaエンコーディングの違い
文字列をpunycode化するには、こうしますが、
print('abc日本語def'.encode('punycode').decode('ascii')) # abcdef-rl2mm8fl32k
ドメインの場合は各階層ごとにpunyる必要があるので、idnaを使います。
print('あいう.abc.日本語.jp'.encode('idna').decode('ascii')) # xn--l8jeg.abc.xn--wgv71a119e.jp
以上です。
参考
- encodings.idna — アプリケーションにおける国際化ドメイン名 (IDNA)
- idnaコーデックの説明。使うべき場所やドメインの正規化について軽く触れている。
- Requests: HTTP for Humans
- requestsの使い方。ドキュメントが充実している。やや古いけど日本語の翻訳もある。