コンソールスクリプトが別ウィンドウで実行される
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の使い方。ドキュメントが充実している。やや古いけど日本語の翻訳もある。
はてなブログを少し使ってみる
はてなブログを少し使ってみる
せっかくなので「はてなブログをはじめよう!新春キャンペーン」とやらに応募してみようと思う。新しい「はてなブログ」の使い勝手にも興味あったし。
1. Drobo drobo S3.0
1つ目はこれ。今はバックアップや古いデータの保管用に古いIDEのHDDをUSB化して使っている。裸のまま使っているのでさすがに取り回しが悪いし、いくつかあるHDDを差し替えるのも面倒くさいので1つにまとめたい。古いHDDの用途がなくなるか。
2. CanoScan LiDE210
2つ目はスキャナ。古いメモとかノートとかが棚の1階を占領している。どうせ二度と見ないんだろうけど捨てるに忍びない。そこで全部デジタル化して忘れたいなーと前から思っていたんだ。ちなみにスキャナなんて買ったことがないので、Amazonの1ページ目から評判のいいものを適当に選んだ。
2. Logitech M510
3つ目はマウス。自分は Logitech のマウスを気に入ってるのだが、地元の店舗ではなぜかいつも売り切れていることが多い。代わりに大安売りしていた Microsoft の Wireless Mobile Mouse 4000 を買ってみたのだが全然馴染めなかった。たぶん設計思想や想定ユーザーが全然違うのだろう。というわけで Logitech に戻りたいなーと思った。キーボード派に転向するのもいいかな。