Pythonでsortedなset

Pythonでsetを書くときに困ったのでメモ。

setはC++では赤黒木実装でsortedなので、Pythonでもそうだと思っていたら違ったようです。。。

公式ドキュメント http://docs.python.jp/2/library/sets.html より一部抜粋

>>> from sets import Set
>>> engineers = Set(['John', 'Jane', 'Jack', 'Janice'])
>>> engineers.add('Marvin')                                  # add element
>>> print engineers 
Set(['Jane', 'Marvin', 'Janice', 'John', 'Jack'])

はい。ソートされていませんね。

どういう内部実装なのか調べていないのでわからないですが、set([4,3,2,1])などは[1,2,3,4]とソートされているように見えるので誤解を招きやすいですね。。。

まぁ公式に実装されてなければ誰かが実装しているものですね。

SortedContainers http://www.grantjenks.com/docs/sortedcontainers/

このパッケージを使いましょう。

pipではいってくれます。

pip install sortedcontainers

早速実験

ipdb> from sortedcontainers import SortedSet
ipdb> set([234,4,3453,6545,23,3426756,657856,4,345])
set([657856, 3426756, 234, 6545, 23, 4, 3453, 345])
ipdb> SortedSet([234,4,3453,6545,23,3426756,657856,4,345])
SortedSet([4, 23, 234, 345, 3453, 6545, 657856, 3426756], key=None, load=1000)

はい、いい感じですね。 内部実装は赤黒木ではなく、B-Treeに似たsegmented-list data structure(引用)らしいですが、ベンチマーク見る限り速いですし良さそうです。

DEATH NOTE Light up the NEW world 考察

DEATH NOTEの新劇場版が公開されましたね。

一緒に見に行っていた人とあまりにも意見が食い違っていたので考察を残しておきます。

一度しか見ていないので間違えてたらすみませんw

以下多大なネタバレ


















まず第一に、新Lである竜崎は三島(新キラ)に操られていた可能性が高いです。

最後にLの後継者として新キラを指名したのはノートによる操作によってであります。

その根拠の前に、少し登場人物の整理を行っておきます。

旧キラ→月

新キラ→三島

新L→新井

旧L→L=Lawlight

と区別します。

キラの目的の整理

核心をここで整理しておきます。

旧キラの目的・・・後継者探しおよびその後継者によるノートを用いた治安維持

新キラの目的・・・新Lというやっかいな存在を消しつつ、その存在と入れ替わり戸籍上存在せずキラ調査の最も権力のある人物で居続け、キラとしての活動を続けること

根拠

この説の根拠となるものは二つあると考えられます。

  1. 終盤の新Lと新キラの異常な仲の良さ
  2. 最後の旧キラの計画通りだという台詞

一つ目 ですが、最後の異常な仲の良さはノートによる操作で旧キラを守るようにとも指示されていたと考えると自然です。

Twitterなどを見ているとホモじゃないかという投稿が多くありますが、そんなことはないでしょうwww

新キラを死から守るために新Lががんばっていて、それを新キラはそれをわかっているため新Lを助けていたのです。

最後に君が新しいLだと言って、ノートを渡していましたが、私はあのノートは表紙を換えたDEATH NOTEであると考えてます。

二つ目 ですが、これはやや根拠としては弱いですが、最後の新キラが新しいLに襲名されることを予期して、計画通りと発言したと考えられます。

この発言だけでは、旧キラの筋書き通りに、新キラが知ることなく進んでいったという可能性もありますが、根拠1とともに考えるとこの説はなさそうです。


これを前提とすると誰が死の操作として操られていたのか気になりますよね。

新キラは、新Lと同様に外出前はキラ、外出先はただの刑事として振る舞っていたと考えられます。

となると直近まで操作を行うことができたと考えられるので、警視庁の上司や、総理大臣(最後の突入は国策として総理大臣の命令で動いてていたはずです)も操作の対象となっていた可能性も大いにあります。

感想

このようにしてみると意外と見応えのある映画だったと思います。

ネタバレを食らって最初からキラが誰かを知って見ていたためいろいろと考察できて面白かったです。

気が向けば二回目行くかもです。

いい加減Chocolatey使いませんか?【パッケージ管理】

皆さんいい加減Chocolateyを使いませんか?

ChocolateyはWindowsで動く、homebrewpacmanaptなどと同じような非常に優秀なパッケージ管理ソフトです。

それなのに

知名度が低い!!!!

元々Windowsで開発をしている人が少ないのもありますが、ITの人に聞いてもまぁ知られていない。

挙げ句Windowsはパッケージ管理がないから開発に向かないなど言われる始末...

というわけで

今回は、Windowsの優秀なパッケージ管理ソフトである、Chocolateyを紹介したいと思います。

インストール

cmdを管理者権限で起動して、(Windowsボタン押し→cmd→Ctrl + Enterで起動)

Chocolatey公式のインストールページにあるように、下記のコマンドを入れてEnterを押す。

@powershell -NoProfile -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))" && SET "PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin"

はい、これでインストールはおしまい。

基本的にPowerShellによるCUIの操作になるので、GUIがいいのであればcinst ChocolateyGUIGUIをインストールできます。

ソフトのインストール

ChocolateyでインストールできるPackageの選択は、ここから可能です。

PowerShellを管理者権限で起動して、(Windowsボタン押し→powershell→Ctrl + Enterで起動)

cinst PACKAGE_NAME

でインストール可能。

複数パッケージも一度にインストールでき、インストール途中の確認も-yでスキップできるので、

cinst -y googlechrome anaconda2 r.studio curl wget

など実行しておいておけば勝手に環境ができあがります。

そのほかのコマンド

パッケージ管理というからには、アップデートや現在インストールしているもののリストも必要です。

コマンド 内容([]付きの表記はオプション)
choco list [PACKAGE_NAME] Packageのリスト表示。引数なしですべてのPackage
choco list -l [PACKAGE_NAME] インストール済みのPackageのリスト表示。引数なしですべてのインストール済みPackage
cup Chocolatey本体のアップデート
cup PACKAGE_NAME Packageのアップデート
cup all 全てのアップデート
cuninst PACKAGE_NAME アンインストール

さしあたり知っておく必要があることは以上です。

それではWindowsでよいパッケージ管理ライフを!

【DirectWrite】MacType v1.2016.830.0リリースと検証

遂に!数年ぶりの本家MacTypeの更新がありました!

そこで今回はこれまでのものとの検証を行いたいと思います。

まずはリンクは下記の通りです。

https://github.com/snowie2000/mactype/releases

901と902が新たにリリースされました(09/03追記)

変更点

(以下gitのだいたい日本語訳)

MacType v1.2016.830.0

  • Windows 8/8.1/10 対応
  • Directwrite対応(使用の際は[GENERAL]カテゴリにDirectWrite=1を追加すること)
  • freetypeのバージョンを2.6.5に変更とそれに伴うレンダリングのされ方の変化
  • MacTunerとMacTrayのHiDPI対応
  • MacType wizardのプロファイル画面でのフォルダ機能サポート
  • 言語変更時のエフェクトの最適化
  • Chromeとの互換性向上。これで文字が欠けたり変なレンダリングにならないように(なったらいいな)
  • Metroアプリへの対応(ただし、program filesへのインストールが必須)
  • FireFoxでの縦書きおよびそのほかの問題の修正(silightさんへ感謝)
  • clipboxのパラメータが不必要に(silightさんへ再びの感謝、本当にいい開発者です)
  • プログラムがより多くのOSを識別できるように

MacType v1.2016.901.0

830を使っている人はアップグレードすること

  • Windows7が起動しないバグの修正
  • Edgeがクラッシュしたり動作が遅くなっていた問題の修正
  • clipboxを無効化するための手段の追加([experimental@exename.exe] clipboxfix=0とプロファイルに記入)

MacType v1.2016.902.1

  • 起動時に長く停止してしまう問題の修正
  • clipboxをtasking effectが妨げていたことの修正

MacType v1.2016.904.0

  • Chrome関連で起こるクラッシュの修正
  • GammaValueDWというパラメータの追加。このパラメータがない場合はこれまでと同様の振る舞いに。
  • インスト-ル時にfile not foundというエラーが出ないように。

検証

今回は、

  1. MacTypeなし
  2. MacType 2012_1022 + Patch 1.1
  3. MacType 20160830(Patch置き換えはなし)

の三つで検証を行いました。

Edge

f:id:admjgptw1357:20160831225942p:plain

Chrome 52

f:id:admjgptw1357:20160831225947p:plain

Firefox

f:id:admjgptw1357:20160831225944p:plain

このような感じになります。

全体的に最新版の方が細くなる印象があります。

まぁほとんど違いないと言えば違いはないですが。。。

設定ファイルの移行

これまでの設定ファイルを流用したいときは、設定ファイルiniの[General]DirectWrite=1を付け足しましょう。

以下のような感じです。

[General]
Name=Default
Icon=..\mactray.exe.ico,0

DirectWrite=1 ;これを追加

;【自动挂钩子进程】
;[0:Disable]  1:Enable
HookChildProcesses=1

新しいプロファイルには設定必要ないです。

まとめ

待ちに待った公式の新バージョンを検証してみました。

20160830にPatchを適応した方が安定するという説もあるようですが今回は検証してません。

MacType Patchの制作者(しらいとさん)の方より20160830以降ではPatchを当てないようにとの発表がありました。詳しくはこちら(09/03追記)

Patch1.18において、MacType v1.2016.830.0以降でも安定して動くように変更がありました。(10/15追記

文字が欠けたりだとか、Edgeに効かないだとかまだ少し不安定なところがあるようなので、もう少し安定したら過去のMacTypeまとめにマージしたいと思います。

admjgptw1357.hatenablog.com

【DirectWrite】MacTypeまとめ(2016/11/17更新)【Window10】

MacTypeWindowsの絶望的なフォントレンダリングを改善するソフトです。

このソフトは、2013年のビルドから更新が止まっており、DirectWriteを使用するソフトで使えないなどの仕様がありました。

ChromeとかVivaldiとかSlackとかDirectWriteで描画しているソフトに効かないのは困りますよね...

更新履歴

11/17追記Patch ver1.19がリリース
8/31追記MacType 20160830リリースに対応
7/23追記 Chrome52でMacTypeが効かない方がいらっしゃるようですが、私の環境ではdev + Patch 1.11、サービスモード起動で効果があることを確認してます。
リンク張りミスっていたのを改善

MacType本家の最新版が出ました

まだ不安定なところがあるようなのでマージはしてません。 私の環境(Win10 + 64bit)では、20160904+Patch1.18でウィンドウの描画が異常に遅くなる現象に見舞われたので、安定している下記の方法を一番においておきます。

導入方法は下記の導入方法1と一緒です。 admjgptw1357.hatenablog.com

更新情報ココマデ


さらに、8/4以降に正式リリース予定の、Windows10 RS1(build1607)以降は、エクスプローラーが落ちるなどの症状があるようです。

しかし

最近MacTypeに大きな動きが出てきたので、ここらでいったんまとめておこうと思います。 その大きな動きは主に以下の二つです。

  1. MacTypePatchによるDirectWriteとWin10対応
  2. MacTypeオープンソース

下記の手順を踏むことで、いかなる不具合が出た場合も自己責任でお願いします。

今回の記事は、dev版のものを使用します。自分で直せる知識がある人以外は、待っておいた方が賢明かもしれません。

MacTypePatchによるDirectWriteとWin10対応

2chMacTypeスレの雄志により、DirectWriteに対応したりWin10にdll(ライブラリ)を対応させるパッチが開発されました。

いい機会なのでMacTypeの導入から最新版まで持って行くまでの手順を記しておきます。

MacType最新版への道

下記の手順を踏むことで下のようになります!

VivaldiChromiumベースのブラウザ)でのBefore/After f:id:admjgptw1357:20160717215004p:plain

MSゴシックの絶望的なジャギーがなめらかになってますね。細かいところは調整可能で好みによりますが、きれいですよね。

この最新版までの道は、三つのステップを踏みます。

  1. MacType_2013_1231の導入
  2. MacType dev 20160216の導入(dll入れ替え)
  3. MacTypePatchの導入(dll入れ替え)

1. MacType_2013_1231の導入

下のリンクからMacType_2013_1231をダウンロード・インストールする

MacType_2013_1231(直リンク注意)

2. MacType dev 20160216の導入

右のリンクからMacType dev 20160216をダウンロード。 MacType dev 20160216

ダウンロードができたら、展開する。

中身は、MacType.dllMacType64.dllなのでこのファイルを、C:\Program Files (x86)\MacTypeにコピーして上書きをする。

dllを右クリック→プロパティ→ブロックの解除を行っておいてください。

3.MacTypePatchの導入

下記のサイトより、 MacTypePatchの最新版をダウンロードする。(現在の最新版はMacTypePatch_1.19.zipsilight.hatenablog.jp

解凍すると、EasyHK32.dllEasyHK64.dllなどが出てくるので、上記サイトのREADME通りに、

  1. MacTypeに含まれるEasyHK32.dllとEasyHK64.dll(64bit版のみ)は不要なのでリネームまたは削除する。
  2. UserParams.iniをMacTypeのフォルダに入れる。
  3. zipに含まれるDLLを「MacTypeのフォルダ」と「システムフォルダ(下記の通り)」の「両方」に入れる。
    32bit
    C:\Windows\System32\EasyHK32.dll
    64bit
    C:\Windows\System32\EasyHK64.dll
    C:\Windows\SysWOW64\EasyHK32.dll

と設定する。

こちらもdllを右クリック→プロパティ→ブロックの解除を忘れなきよう。

これで設定完了です。あとは、サービスモードやレジストリモードで起動すれば反映されるはずです。個人的にはサービスモードが互換性も高く安定している気がします。

うまくいかない場合

これらの手順で反映されない場合は、MacType2012.1022.0(外部リンク)で試してみてください。

これによってSlackとかVivaldiに効くようになりました。やったね!

ChromeVivaldiを使う場合は、

Chromeのアドオンである。Stylishで改善可能です。

スタイルに以下を追記しましょう。

*{
    -webkit-text-stroke-width: 0.15px;
}

0.15pxは好みで変えてみてください。Font Rendering Enhancerによっても改善可能ですが、レンダリング速度が遅いので個人的にはいやです...

MacTypeオープンソース

長らくMacTypeはGitにレポジトリだけある状態が続いていましたが、このたびGitにソースコードがあげられました。

https://github.com/snowie2000/mactype

まだ依存関係が足りずにビルドできない用ですが、コア部分のソースはあげられているようで大きな進歩です。 開発が再開・別branchが発展することを期待してます。

終わりに

de:code2016で日本MSの方が、フォントレンダリングへの苦情は知っていてもうちょっと待って欲しいという旨の発言をしてましたが、待ちきれない方は自己責任でやってみてはいかがでしょうか。

MacTypeの発展を望みつつも、デフォルトで改善されることに期待を寄せています。

文献管理ソフトPapers 3をDropboxで同期させたい【Windows、iOS】

文献管理ソフトにはいろいろなものがあります。

Zotero、Mendeley、ReadCube、Papresなどなど

その中で私が欲しかったのは以下の機能です。

  • Dorpboxなどで同期可能
  • アプリ内PDFプレビューアー
  • 有料でもいいが月額課金はいや
  • (携帯)

Papersはこれらを満たしていて、Black Fridayによる25%offがあったために購入しました。

調べてみたら日本語周りは割と弱いと書かれていますが、私は日本語の論文をほぼ扱わないですし、メモには日本語を使用可能なので特に問題ありません。

mac版は分からないですが、Windows版やiPadの同期にはいろいろと癖があるようなので(使い方分かってないだけかも)その対策をメモしておきます。

Windows

同期問題

初回起動時に、どこにライブラリを置くのか聞かれ、そのときにDropboxにおいておけば同期されますよと書いてあったためおいてみたが、どうも同期できていない

新しいファイル追加したり削除してもどうにも同期されないのである。

挙動を見るにどうやらデータベースは同期されていないようである。(これで同期してるとうたい文句を言っていいのだろうか)

f:id:admjgptw1357:20151130004818p:plain

上記の画像の通り、

ファイル名 内容
CompressedCheckpoint データベースの差分バックアップ
Files PDFなどの実態
papersonline papers onlineのコンテンツ
Patches なぞ
papers-library.json ライブラリの指定ファイル

というようにデータベースそのものが更新されてはいないようである。

一番上のデータベースの差分ファイルが仕事をしてくれるのかも知れないがどうも動いていない。

そこでデータベースを同期させようというのが今回の話

解決法

要するにデータベースファイルを見つけてあげてそれをシンボリックリンクで実体をDropboxに置けば動く

シンボリックリンクはショートカットみたいなもんで、実体はそこにはないが、普通のファイルと同じようにアクセスできるようにするものである(だいたいね)

その肝心のデータベースのパスだが、C:\Users\USER_NAME\AppData\Roaming\Mekentosj\Papers3\Localをとりあえず開いてほしい

人によるだろうが、styleフォルダと、CurrentLiberaly.json以外に複数のフォルダがあるかも知れない。

そのときは、CurrentLiberaly.jsonを開いて今参照しているデータベースのフォルダを特定する。

次に、そのフォルダを開くと、起動してないときなら Database.papersdbpapers.ftsPublicationStyle.queuedbの三つのファイルがある。

これらが今回同期したいデータベースファイルである。

下準備として、これらの三つのファイルを、同期したいDorpboxの特定のフォルダの中に入れておく

シンボリックリンク作成

Linuxではlnを用いるが、windowsでは、mklinkというコマンドを使う。

mklink リンク ターゲット

という順序で使います。

Linuxになれている人は違和感を覚えるかも知れないですね。mklinklnとはsourceとdestinationが逆になっているので注意

Dropboxのどのフォルダに入れるかは人によるだろうが、参考として記しておきます(windows10環境)。

mklink /D C:\Users\USER_NAME\AppData\Roaming\Mekentosj\Papers3\Local\<i>LIBRARY_FOLDER</i>\Database.papersdb C:\Users\USER_NAME\Dropbox\Papers3\Database.papersdb

というコマンドを、papers.ftsPublicationStyle.queuedbに対しても実行すれば良い。

これで晴れてデータベースを共有できたので、完全な同期が出来るようになりましたとさ。

iOS

これはまだ正直よく分かっていません。

おそらく、データベースの差分ファイルをみて、更新を取得しているようなので、

  • 最初にある記事3つはDropboxアンリンクすると二度と戻らない
  • htmlだけのものは同期しない
  • iOS側で削除すると元には戻らない

というような特徴があることが推察されます。。。

Papersは便利なソフトなんですが、他にもvirtual diskがまともに動かなかったりと、いろいろと癖があるようですね

めんどうな