os.path.join() は理由がある

#!/usr/bin/env python
#-*- coding:utf-8 -*-

import os

# コレだとカレントディレクトリの場合は空文字になる
print os.path.dirname(__file__) + "/put.txt"
# 正確に行う方法
print os.path.abspath(os.path.dirname(__file__)) + "/put.txt"

output

今頃知った。
ま、実用上は絶対パスにしなくても得に問題は…ある!

このままだとファイル名の先頭がパス区切り文字になる場合があるってことじゃないの。
os.path.join() で合体しろと強調する理由はコレだったのね。
単純にパス区切り文字を振り分けというくだらない理由だけじゃなくて。

それよりこうやって Linux と Windows での表示を比べると…
せめて PowerShell だけでも Windows の標準カレントディレクトリをなんとかしてほしいわ。
変更できるのは解っているけど最初から C:\ユーザー名 でいいじゃないか。

GtkMenu.popup で左右両ボタン認識は簡単だった

今日はこのページを作っていたのだが

ドロップされた画像を表示させる

ここで今まで右クリックメニューを出すコードに右ボタンを指定を忘れていたことに気がつく。
ごまかす為に以前のページを書き換えていたのだが

if event.button == 3:
    self.popup_menu.popup(None, None, None, event.button, event.time)

event.button を何故二回も使っていたのだろう。
Devhelp を改めて見直すと popup の四番目引数はボタンの指定だ。
つまりメニューアイテムの選択を確定させるボタンということである。

あぁだからポップアップの入れ子は右ボタン(つまり 3 )しか反応しないのか。
ここに左を示す 1 を含めた値…int なんだから 4 になって全然違うボタンの指定になってまうし…
だったらゼロにするとどうなる?

if event.button == 3:
    self.popup_menu.popup(None, None, None, 0, event.time)

コレであんなに悩んだ入れ子メニュークリックでの左右両ボタンでの確定がアッサリ解決…
何故こんな単純なことに今まで気がつかなかったのだろうか…
これだけで Y901x を更新するのもアレなので今度まとめてにしよう。

IronPython は親クラスの __init__() がいらない

.NET Framework について何を今頃知ったのだが…
StreamWriter はエンコード指定をしなければ BOM 無し UTF-8 になるらしい。

ま、元々 Opera は付けていたのでSeeme for Linux の場合は問題無いのだが。
UTF-8 を指定すると BOM が付いて困ることがあったので理解しておかなきゃ。

てなわけで実際そうなのか実験コードを IronPython と WPF で書いてみたのだが…
突っ込みどころ満載になってしまった。

# -*- coding: UTF-8 -*-

import clr
#import nt

# 最小限下記ライブラリ(dll)が必要
clr.AddReferenceByPartialName("PresentationCore")
clr.AddReferenceByPartialName("PresentationFramework")
clr.AddReferenceByPartialName("WindowsBase")

from System import *
from System.Windows import *
from System.Windows.Controls import *
from System.Windows.Media import *
from System.IO import *

class UTF8Writer(Window):
    """
        System.IO.StreamWriter の実験
        何も指定せず書き込みすると BOM 無し UTF-8 になる
    """
    def __init__(self):
        """
            IronPython では Window.__init__(self) はいらないようです
            書いても例外にならないけど
        """
        self.Title = "UTF-8 書き込みの実験"
        self.textbox = TextBox()
        self.textbox.TextWrapping = TextWrapping.Wrap
        self.textbox.AcceptsReturn = True
        self.textbox.FontFamily = FontFamily("MS ゴシック")
        # ボタン作成及びクリックハンドラ登録
        button = Button()
        button.Content = "書き込み"
        button.Click += self.onClick
        # StackPanel だとサイズ連動ができないので DocPanel を使う
        # けど何故 static なんだ!
        DockPanel.SetDock(button, Dock.Top)
        # レイアウタを作成してこれらをセット
        dp = DockPanel()
        dp.Children.Add(button)
        dp.Children.Add(self.textbox)
        # レイアウタを Window にセット
        self.Content = dp
        self.Width = 320
        self.Height = 240

    def onClick(self, sender, e):
        """
            流石に以下はできない、nt.path が無い…
            sw = StreamWriter(nt.path.dirname( __file__ ) + "\\put.txt")
        """
        sw = StreamWriter("put.txt")
        try:
            buf = self.textbox.Text
            sw.Write(buf)
        except Exception, ex:
            MessageBox.Show(ex.Message)
        finally:
            sw.Close()

class UTF8WriterCopy(UTF8Writer):
        """
            自作クラスでもコレでイケる、なんか変
        """
        pass

if __name__=="__main__":
    a = Application()
    a.Run(UTF8WriterCopy())

writer

なるほど、BOM 無し UTF-8 になることは確認できた。
XP 用の WPF にはフォントにアンチエイリアスを掛けるのをヤメてくんないかなぁ。

つーかナンジャコレ。

今まで気がつかなかったよ、親クラスの __init__ はいらないんだ。
Python じゃ無いヤン、コンストラクタになっているってことだよね。
それとも CLI の仕様なのかな?

更に気がつかなかったけど DockPanel へのレイアウトは static なんだ。
XAML で書いていると普通に見えるけどコードで書くと違和感がたっぷり。
GTK+ とは違ってパッキング情報は子オブジェクト側が持っているということか。

やりにくいのでコンテナの継承をして pack_start みたいなのを作ろうかな?
と思ったけど要求が StackPanel と DockPanel に分かれているし無理っぽい。
WPF は XAML で書くのを強要しているってことだろう多分。

os モジュールのクローン nt を作ったのなら nt.path も用意してくれよみたいな。

まだ気がついていないところってありそうだ。
IronPython は Python クローンだと思って書くと痛い目に遭いそう。
しかし例外の書き方なんかはまったく同じだ、逆に変な気分になった。

テンプレートとスクリプト

nanikore

Nautilus にあるこのテンプレートって何だろうと気になった。
多分よく使うテンプレートをコピーして新規作成してくれる機能だと思う。
私だったら当然

#!/usr/bin/env python
#-*- coding:utf-8 -*-

とかかな、「 py 」って打って Tab キーを押すだけでスニペットが挿入してくれるけど。
それでもあったほうが便利かなと思うので使い方を探す、が見つからないんですけど。
せっかく堂々とメニューに乗っているのに誰も使っていないのかな?

でも調べているうちにスクリプトで Nautilus が拡張できると知った(今頃…
面白そうと思って早速作ってみた、これで端末のお世話になる時間が減りそうだ。

Nautilus をスクリプトで拡張

しかし gedit といい Nautilus といい gimp といい Eye of GNOME といい…
Opera と自作以外は標準アプリしか使っていないのを思い知る。

しかし他のモンをあんまりインストールしていないので私の 9.04 は超安定しています。

Shift-JIS で読み直しする gedit pligin

Windows から持ってきた Shift-JIS なテキストファイルを gEdit にドロップで開くと文字化け。
Cinema や minipoli のコードを「俺どう書いたっけ?」と自分で参考にする時が結構あるのよ。
もう慣れてしまったけど毎回毎回読み直しするのも面倒になってきた。

Gedit/PythonPluginHowTo – GNOME Live!

一旦破棄して gedit.Encoding 指定で読み込めばプラグインで作れそうだ。
create_tab_from_uri の引数で行ジャンプまで指定できるんだ、これは面白そう。

ということでさっき Shift-JIS で読み直しするプラグインをこさえて本サイト更新!
製作時間は一時間、あぁプラグインは楽でいい。

EUC-JP も考慮しようかと思ったけど私は現在 EUC-JP なファイルを持っていない…
それより意図的に私が作らないほうが「作ってみようかな?」という人が出てくるかも。
なんて思ったので Shift-JIS のみで公開することにした、手抜きじゃないですよ。

それと gEdit プラグインの応用 1 なんてページを増やした。
カーソル位置の GtkTextIter 取得方法くらいは解説しなきゃ誰も始められないかなと。
こんなのをチビチビ作っているが需要は微妙である。

次はサイドバーとかを使いたいんだが…アイデアが浮かばない。