コンソールスクリプトが別ウィンドウで実行される

OSを再インスコして気づいたけど、PythonみたいなスクリプトファイルをPowerShellから直接実行しようとすると別ウィンドウに表示されるのな。

f:id:itasuke:20171127144630p:plain

一方で py hello.py とか python hello.py とかやると、ちゃんとコンソールウィンドウを引き継いでくれる。

f:id:itasuke:20171127144219p:plain

この動作は普通なのかなと思って、ちょっとググってみるが、どうやらそうっぽい。

PATHEXT に .py を追加しておくと、従来のコマンドプロンプトと同じ動作になる。

f:id:itasuke:20171127144216p:plain

毎回コンソールを立ち上げるたびに手動で PATHEXT を変更するのは面倒なので、大元の環境変数を変更しておくとよい。

f:id:itasuke:20171127145632p:plain

PATHEXTの意味

PATHEXT の本来の目的は、拡張子の指定を省略することにある。.exe をつけなくても py.exe や ipconfig.exe が起動するのはそういう理由による。

PATHEXT に .py が追加されると、このように拡張子を省略してもファイルが実行されるようになる。

f:id:itasuke:20171127144209p:plain

コマンドラインからEvernoteのバックアップをとる

Windows版のEvernoteクライアントにはENScriptというコマンドラインユーティリティが付属してくる。これを使うとノートのバックアップが簡単にとれる。

# デフォルトならENScriptはここに入っているはず
cd ${env:ProgramFiles(x86)}\Evernote
# ヘルプの表示
.\ENScript.exe /?

f:id:itasuke:20171123222148p:plain

見ての通り色々な機能があるけど、バックアップに使うのは 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

f:id:itasuke:20171123222144p:plain

こうして書き出したenexファイルからノートを復元するには、「ファイル→インポート→Evernote エクスポートファイル」からできる。

f:id:itasuke:20171123222141p:plain

参考

PowerShellでエイリアスの逆引き

あるコマンドレットにどんなエイリアスが設定されているのか見たいことってあるわな。

例えば、Get-ChildItem にどんなエイリアスが設定されているのか調べるにはこうする。

Get-Alias -Definition Get-ChildItem

f:id:itasuke:20171121125402p:plain

端的に言うと Get-Alias に -Definition を付けるとエイリアスを、付けないとエイリアス名を調べるということです。

f:id:itasuke:20171121125400p:plain

ちなみに、デフォルトで一番多くエイリアスを持っていたのは Remove-Item でした。

Get-Alias | Group-Object -Property Definition  | Sort-Object -Property Count | Select-Object -Last 10

f:id:itasuke:20171121130024p:plain

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.clientsocket は既に国際化ドメインに対応してます。

しかし、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 に戻りたいなーと思った。キーボード派に転向するのもいいかな。