WordPress だけ?の小ネタ。
三点リーダー → …
を入力するのに「てん」等から変換している人いるかな。
半角でピリオドを三つ連続打ち込むだけで … に変換してくれます。
もうすぐ WordPress も v3 になるけど同じかな?
WordPress だけ?の小ネタ。
三点リーダー → …
を入力するのに「てん」等から変換している人いるかな。
半角でピリオドを三つ連続打ち込むだけで … に変換してくれます。
もうすぐ WordPress も v3 になるけど同じかな?
仕事関連でドタバタしており Blog の更新が止まりがちになっています。
今月は落ち着きそうな希望が少々持てるのでちょっぴりがんばってみる予定。
ということで
の自然順ソート仕様で我が Y901x のリストアップを色々試していた。
サボっていたのではなく地味にテストはしていた、とにかく解ったのは問題だらけ!
最大の問題は aa.mp4 aa1.mp4 等というファイルがあったとき。
Nautilus では aa.mp4 が当然のように上になる、前々回の関数では逆になってしまう。
原因が解らなくてしばらく悩んだけど解ってしまえば単純。
前々回のコードではドットは単なる文字列の一部としか認識しないからだ。
分離され整数変換された値とドットという文字列を比較ならば当然ドットのほうが大きな値と認識する。
結果 aa.mp4 のほうが aa1.mp4 より大きいと認識するファイル名になってしまう。
なんだそれ…
これじゃ拡張子が付いたファイル名では全部同じようになってしまう。
いや Linux の場合はそれだけじゃない、ドットファイルという文化があるのだから。
以下のようなファイル名を用意してテスト、nautilus は隠しファイルを表示設定に。
Python の文字列比較は先頭から一文字単位で照合しているだけ、当然の結果。
整数文字列の比較は確かに行っているけどこうなってしまう、落とし穴が深すぎだった。
Windows の Explorer 名前順ではドットファイルは先頭になるが Nautilus は日本語より下。
同じ自然順ソートでもドットをどう扱うかが違うようで。
とにかくファイル名の場合は前々回のソート関数では Nautilus とは同じにはならない。
というかドットファイルどころかバックアップファイルにも無考慮だと今頃気がつく私であった。
後日に続く(終わりカヨ!
Visual Studio 2010 はこんな優待パッケージがあるのね。
今日現在 33,390 円にて予約受付中。
たしかにアップグレード版との比較なら超お買い得なんだが、正直微妙な値段設定だ。
Standard Edition ライセンス保持者対象だなんてありえない、挫折者九割越えが目に見えているのに。
VC6 の時一度挫折した人間は思う、Delphi 5 がこの世に出なかったら今の私は確実に只のオッサン。
開発に興味を持つ若い人の意識が当時と全然変わっていないなんて Blog 検索をすれば解る。
大げさに書くと統合開発環境を手に入れれば魔法のようにアプリが作れると思い込むとかね。
.NET Framework のメジャー更新毎に六万円を支払うことに疑問を持った人達を引き止めたいのかも。
それだったら一万円代が限界かと…
とはいえコッチより全然安い。
一旦 Std 版を手に入れ安上がりに Pro 版を仕入れたいなら面倒だけどこんなルートがある。
VS2008 Pro を持っている私には関係なかったりするんですけど。
少なくとも公開するアプリを作りたいなら正規のライセンスを持っていないと後が怖い。
さて私はどうしよう?
minipoli のメンテを続けるだけなら VS2008 のままでイケるわけで。
C# で SeeMe 以外を作りたくなったら、それまで待つと売り切れの可能性。
しかしその頃には別の販促バージョンが出るような、これは迷う。
IronPython つか DLR の初期化がもう少し早ければ笑い飛ばせるんだが…
と、Ubuntu Linux の Gedit で書いている現実では説得力の欠片もありゃしねぇ。
Python の List で sort() しても Nautilus のファイル名順にならない。
Windows XP の時のように数値優先な自然順ソートをしなければならない。
我がアプリ Y901x のリストはデフォルトのソートをしているだけ。
気にしていたけど無名なのをいいことに今まで知らん顔していた(ぉい!
Windows XP には shlwapi に StrCmpLogicalW という API 関数があったんだが…
Linux なら glib や gio に関数がありそうなんだけどな…
見つからないし。
Nautilus のソースも落としたけど何が何やらサッパリワカンネ。
自力で自然順ソート関数を作っている人のコードを参考にしてみよう。
コレやったらとりあえずうまくいった。
コッチは isdigit を使っている、その手もあるか。
というか整数の正規表現ってこのどっちでもいいんだなとか変な発見。
return [ tryint(c) for c in re.split('([0-9]+)', s) ] or return [ tryint(c) for c in re.split(r'(\d+)', s) ]
しかしコレで完全に Nautilus と同じになるのだろうか?
とりあえず自分でもう少し試してみる。
それと playbin2 化したらよく落ちるようになったなぁ…
切り替え事の gtk.main_iteration を消したらかなり良くなったけどこれでいいのかな…
Part III. GTK+ Widgets and Objects
何か Linux とか GTK+ とかで新しいプログラミングのネタは無いものか…
なんて考えながら上記ををポッケーと眺めていた。
いきなり見つかったぞ、GtkInfoBar って何?
調べてみると例えば Gedit に動画ファイルをドロップしたエラーで出るあの少し大きなバー。
やれば解るので細かいことは書かないけど、ソレをわざわざ GTK+ 部品の一つにしたようだ。
GTK+ – Wikipedia, the free encyclopedia
GTK+ 2.18 で追加されたようだけど PyGtk から使えるのかな?
自前環境にて PyGtk から使えるか調べてみる。
Mandriva 2010.0 の GTK+ 2.20.0 と PyGtk 2.16 では使えない。
Ubuntu 10.04 の GTK+ 2.21.1 と PyGtk 2.17 では使える。
こっちには今現在はマニュアルは無い、てかまだ version 2.15.2 のままのようで。
ドキュメントが遅れるのは Linux ではしかたがない、商売でやっている MSDN とは違うのだから。
しかしこの程度のインフォメーション表示バーなんて自作しても別に難しくない。
でも GTK+ 自体は GUI 部品の見た目統一を目指しているはずだし(違ったかな?
テーマ切り替え時の追従なんかも期待できる、Opera がまったく追従しないのが気になって…
とにかくせっかくベンダーが用意してくれたものだから使ってみよう。
GtkDialog の vbox アトリビュートのようなものは存在しない。
これ自体が GtkHBox サブクラスであらかじめボタン配置用スペースを予約しているみたい。
とりあえずボタンを押すと InfoBar が出てレスポンスでボタン文字を変更する例を。
#!/usr/bin/env python #-*- coding:utf-8 -*- import gtk class InfoBarTest(gtk.Window): """ GtkInfoBar Test PyGtk 2.17 or later. """ def __init__(self): gtk.Window.__init__(self) vbox = gtk.VBox() vbox.show() self.button = gtk.Button("Click!") self.button.show() # GtkInfoBar self.infobar = gtk.InfoBar() self.infobar.pack_start(gtk.Label("Hi!\nButton Click")) self.infobar.add_button("_Cancel", gtk.RESPONSE_CANCEL) self.infobar.add_button(gtk.STOCK_OK, gtk.RESPONSE_ACCEPT) # Signal self.infobar.connect("response", self.on_infobar_response) self.button.connect("button-press-event", self.on_click) self.connect("delete-event", gtk.main_quit) # append vbox.pack_start(self.infobar, False) vbox.pack_start(self.button) self.add(vbox) self.resize(300, 300) self.show() def on_click(self, widget, event=None): self.infobar.show_all() def on_infobar_response(self, widget, response_id): if response_id == gtk.RESPONSE_ACCEPT: self.button.set_label("OK!") else: self.button.set_label("Cancel...") self.infobar.hide() if __name__ == "__main__": w = InfoBarTest() gtk.main()
バインディングは他の GTK+ 部品と同様みたい、これなら得にマニュアルは不要か。
後はチマチマ弄くってみればもっと見た目とかもよくなると思う。
うん、StatusBar や TitleBar では面積が足りない場合なんかに有効だ。
上手く使えば Debug にも利用できそう、自作すればいいとはいわない。
というか自作すればいいというのなら GtkMessageDialog なんかもいらないわけで。
「ナンデモアリ」を徹底的にやった結果として複雑怪奇になった WPF は見習ってほしいよ。