Programming」カテゴリーアーカイブ

create_small_image Nautilus-Script

次の覚書は GtkUIManager を利用してツールバーに独自画像を。
とやりたかったけどストック以外を指定する方法が無いみたい。
一旦個別に抜きだしして割り当てるならできそうだけどどうしよう。

ところで

gtk.gdk.Pixbuf

GDK-PixBuf には save というメソッドがあるんだね。
これは…上手く使えそう。

たとえば blog に使う大きな画像へのリンク用の小さな画像作りなんかに。
これを Nautilus スクリプトにしてしまえばそのためだけに Gimp を利用する手間が省ける。
ということで試しに書いてみる。
生成する画像の名前は WordPress が付ける名前に合わせサイズを付加する例。

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

"""
    create_small_image Nautilus-Script
    written in Python.
"""

import gtk
import os

path_array = os.environ["NAUTILUS_SCRIPT_SELECTED_FILE_PATHS"].split("\n")
for picfile in path_array:
    try:
        pixbuf = gtk.gdk.pixbuf_new_from_file(picfile)
    except:
        continue
    # Under 300*300 image
    d_width = 300
    d_height = 300
    # GdkPixbuf size
    p_width = pixbuf.get_width()
    p_height = pixbuf.get_height()
    # Calculated to fit the smaller
    width = 0
    height = 0
    if (d_width * p_height) > (d_height * p_width):
        width = p_width * d_height / p_height
        height = d_height
    else:
        width = d_width
        height = p_height * d_width / p_width
    # Create Resizeing GtkPixbuf
    small_image = pixbuf.scale_simple(width, height, gtk.gdk.INTERP_BILINEAR)
    # Create small_image Name
    pos = picfile.rindex(".")
    image_name = "%s-%dx%d.png" % (picfile[:pos], width, height)
    small_image.save(image_name, "png")

で、Nautilus script に登録する。
Nautilus で画像を選択状態にして右クリックメニューからスクリプトを選択。

sclipt_menu

で、画像があるディレクトリに縮小された画像が生成されているはず。
てかおいおい、こんな簡単にスモール画像が作れちゃったよ。
今まで書いたスクリプトを組み合わせただけなので製作時間 15 分。

さてコレを覚書ページに…どこに入れればいいのだ?
よく解らないから blog に書いてみた。

追記

また script を sclipt と書いていた…ので書き換えておます。

Enjoy!

Python getter, setter

Python は 2.6 以降の property でゲッターセッターが使えるらしい。
IronPython 2.6 でも使えるのかな?両方で実験。

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

class Engine(object):
    """
        over 2.6 property getter,setter test
    """
    @property
    def name(self):
        return self._name

    @name.setter
    def name(self, value):
        self._name = value
        print "(%s) get!" % value

    @name.getter
    def name(self):
        print "out"
        return "name as %s" % self._name

if __name__ == "__main__":
    # static test
    #Engine.name = "Toyota"
    #print Engine.name
    # instance test
    eg = Engine()
    eg.name = "Honda"
    print eg.name

getset

static でも property はアクセスできるけどセッターやゲッターは無視される。
オブジェクト生成を行ったのであれば普通にセッターやゲッターとして使える。
IronPython でも 2.6 なら有効なのが嬉しいですね、まだ 2.6 はベータですが。

getter は書かなくても良い、普通は setter 時に何か event を起こすのに使うものですし。
C# と違い実体は書く必要は無いようです、しかしイマイチ解りにくい書き方ですよね。

これを利用して IronPython で ObservableCollection を作って ListView を…
とやっているんだけーが上手くいかないのでまたこんど。
PropertyChanged は IronPython ではどう書けばいい???

第2章 ListView 1/1 – 続・ひよ子のきもち

こんな強烈な IronPython 屋さんが日本にいたんだ。
今まで検索に引っかからなかったのは何故だろう、探し方が悪いのか?
とにかく参考にさせてもらおう、メモメモ。

Enjoy!

more WPF

Planet Python

私の blog はおもくそ日本語なのにまた見つけられちゃった。
IronPython でこんなことをやっているのは世界中で私しかいないからだろうけど。
本当はスパム対策で日本から以外のアクセスは遮断したいんですけど。

mojibake

しかし日本からのアクセスだと utf-8 でも化けてリンク先にアクセスできないんですね。
Error 404 – Not Found になってしまう、多分英語圏でないところは全部ダメだと思う。

今後タイトルくらいは英語にしておいたほうがよさそう、日本人が到達できないのでは困る。
ロクな語学力が無いけどソースコードのコメントもなるべく英語にするべぇ、それで十分だろう。
今回から練習、ありがちな Enjoy! というサフィックスも無意味に入れて。

しかし世界中探しても WindowsForm ばかり…

次期Visual Studio 2010と.NET Framework 4.0の新機能 ? @IT

Visual Studio 2010 は UI が WPF 製になるんだ、もはや完全なる .NET Framework の世界。
開発環境本体が WPF で WindowsForm を使う人はまずいないだろう。
WindowsForm って Windows SDK の単なるラッパーですよ、既に過去の遺物。
みんな早々に WPF に移行しませう、IronPython で(それはもしや私だけ…

WPF = 豪華なグラフィックス

な偏見はそろそろヤメようよ、この記事を書いた人もそれっぽいし。
PyGtk みたく普通の GUI 部品として使ってはいけないなんて MS も言っていないわけで。
GTK+ なり Swing なりを知っている人ならもっと WPF のレイアウトに興味を持とう、楽しいよ。

だいいち VirtualBox のゲストで動かす人もいるんだからエフェクトに凝られても困る。
グラフィック関係は味付け程度に考えればいいと思う。

でも Windows 7 に .NET Framework 4.0 が入り DLR が標準ならもう VS は不要のような…
IronPython 等が流行するならだけど、フリーな XAML デザイナが今後出てくるような気が。
MS は VS より .NET Framework を広めたいはずだから自社で出す戦略もアリ。

既に VC++ は API の追加によるヘッダの提供くらいしかやることが無いだろう。
WPF の開発が可能になった VS 2008 の時と比べてかなーり製品として魅力が薄い感じ。
IDE の親切機能自体は強化されているだろうし C# 4.0 がやりたい人にはいいかも。

*****

ついでに、 Ubuntu の PrintScreen でマウスカーソルは全部矢印になると解った。
書くまでもなく上の画像を撮影した時はリンクを示す手のカーソルになっていたのにこうなった。
マウスカーソルは本当は画像化できないので書き足しているというのがよく理解できます。

Windows のネタなのに全部ホストの Ubuntu + gedit でネタを作っている私であった。

Enjoy!

.NET framework ゴミ箱

ファイルをごみ箱に削除する – IronPython

こんな方法があったのか。
てかそれって static なんだからインスタンスは作成しなくてもいいんだけど。

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

import clr

clr.AddReferenceByPartialName("PresentationCore")
clr.AddReferenceByPartialName("PresentationFramework")
clr.AddReferenceByPartialName("WindowsBase")
# namespace Microsoft は PresentationCore にあるけど…
clr.AddReference("Microsoft.VisualBasic")

from System import *
from System.Windows import *
from Microsoft.VisualBasic.FileIO import *

class SendToRecycleBin(Window):
    """
        ファイルをドロップするとゴミ箱へ移動させる WPF Window
    """
    def __init__(self):
        self.Width = 320
        self.Height = 240
        self.Title = "SendToRecycleBin"
        self.AllowDrop = True
        self.Drop += self.on_drop

    def on_drop(self, sender, e):
        files = e.Data.GetData(DataFormats.FileDrop)
        for file in files:
            FileSystem.DeleteFile(  file,
                                    UIOption.OnlyErrorDialogs,
                                    RecycleOption.SendToRecycleBin )

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

つまりこれでいい。
しかし何故その名前空間なんだ?意味不明だし今までみつからないわけだ。
普通なら

.NET framework ゴミ箱

なんてなキーワードで探すもん。
他の言語ではできないしみたいじゃん。
○B 屋って必ず「○B で」って書くからね。

しかし Microsoft 名前空間といえば

import Microsoft

def on_open(sender, e):
    dlg = Microsoft.Win32.OpenFileDialog()
    if dlg.ShowDialog(self):
        MessageBox.Show("push ok")

openfiledlg7

と、せっかく用意した機能なのに… PresentationFramework.dll 内にあるというのに…
フックがあるので仕様により古いダイアログになるという Microsoft 側の大失敗があるし。
しかもフックを排除する方法が無い、Windows 7 でコレはないだろう。
のイメージがあって利用する気にもならんかった。

.NET Framework クラス ライブラリ

○B だけやたら豊富に揃っているね、どうしてもこの言語を残したいらしい。
ま、利用できるモンは利用すればいいだけさ。

参考までに以前書いた Linux (GNOME 限定)でのやりかた
ぱぇぽぃ2 ? Blog Archive ? g_file_trash ってのがあった

DLR は Silverlight に同梱でした

IronPython が Windows 7 RC で使っていて妙に遅い原因が判明した。
Silverlight をインストールしていなかったからだ。
というか Silverlight に含まれている DLR がインストールされていなかったというわけ。

Windows 7 RC には初期状態で DLR が入っていると思い込んでいたよ。
.NET Framework 4.0 の目玉の一つなはずだから多分正式版には存在…
Silverlight はいらないんだけど単体な DLR をインストールするのも…ついでに。

仮想で動かしている Windows で Silverlight を動かすなんて厳しすぎ。
それより Opera では動かないので今までダイアログが出ても拒否していたわけです。

マイクロソフト – ホーム

に IE で行くと下記ダイアログがでる、もちろん Opera じゃ無理。
「インストール」ボタンを押してただひたすら指示に従う、再起動は不要。

silver

それだけで今までの激遅 ipy.exe がウソみたく快適に、バカみたいに早い!
でも初期化はやっぱり遅い、これだけはあきらめるしかない。

IronPython ではインタラクティブシェルはあんまり使わないわけですが。
Linux で Python は dir() と pydoc を使いまくるので bash は必須ですけど。
IronPython じゃ pydoc は無いし、それより MSDN を見たほうがわかり安い。