Get MIME Type

ファイル情報取得で MIME Type を取得したい。
mimetypes モジュールでは拡張子判別しかできないみたいですけど。
Nautilus は拡張子が優先だけど無くても取得できているじゃないか。
ということで地味に方法を探してみる。

ファイルの MIME タイプの検出 (GNOME 2.2 システム管理 (Linux 版)) – Sun Microsystems

/etc/gnome-vfs-mime-magic
/etc/mime.types

のファイルが元ということになっているみたいなんだが Ubuntu では

ubuntuで対応しているMIME Typeを調べるには:Linux つれづれ日記:So-net blog

/usr/share/mime 以下なのか。
xdg-mime は MIME Types のインストール関連に使うものだがどっちに登録するのかな?

つーか Nautilus が取得できているんだから絶対にシェルから取得できるはずだ。
色々調べていたらこんなのを見つけた。

Nautilus File Manager Scripts: File Information Querying Scripts

file コマンドだけでこんなことができるのか。

$ file --help

で調べると –mime-type オプションがあるらしい、それならこうしてみよう。

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

import gtk
import urllib
import os.path
import commands

class MimeWin(gtk.Window):
    """
        Showing MIME Type of Dropped file
    """
    def __init__(self):
        gtk.Window.__init__(self)
        dnd_list = [("text/uri-list", 0, 0)]
        self.drag_dest_set( gtk.DEST_DEFAULT_MOTION |
                            gtk.DEST_DEFAULT_HIGHLIGHT |
                            gtk.DEST_DEFAULT_DROP,
                            dnd_list, gtk.gdk.ACTION_MOVE )
        self.connect("drag_data_received", self.on_drop)
        self.label = gtk.Label("Drop")
        self.add(self.label)
        self.connect("delete-event", gtk.main_quit)
        self.resize(320, 150)
        self.show_all()

    def on_drop(self, widget, context, x, y, selection_data, info, time):
        drops = selection_data.data.split("\n")
        for drop in drops:
            name = urllib.unquote(drop)[7:-1]
            if os.path.isfile(name):
                # Get MIME Type
                mime = commands.getoutput("file --mime-type %s" % name)
                self.label.set_text(mime)

if __name__ == "__main__":
    w = MimeWin()
    gtk.main()

ext_non

おお、しっかり取得してくれているじゃないか。
しかし Python Script では

ext_py

text/x-java …
text/x-python のはずなのに、ダメだこりゃ。

mime = mimetypes.guess_type(name)[0]
if mime:
    self.label.set_text(mime)
else:
    self.label.set_text("Non Extension")

ならキチンと text/x-python になる、しかし拡張子が無いなら None になる。
んーどっちも使えない、もうちょっと調べます。

Enjoy!

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!

Who wants to program

Pythonの’,’.join()がキモいと思ってた時代が僕にもありました – by edvakf in hatena

そういえば join なんて一度も使ったことがないや。
というか join なんて実用アプリを作るのに必要な場面があるのだろうか?
リストにしたデータを全部くっつけるという場面が思い浮かばなくて困った。

オタクをピクっとさせる10の発言 | WIRED VISION

第10位の PHP を否定って意味すら解らない。
PHP は HTML 中に書け拡張子を php にして実効パーミッションを与えるだけで動かせんだよ。
だからココまで広まったし私も利用している、私はそんなにヲタクでは無かったようだ。

Ubuntu日本語フォーラム / PythonのIDEを教えてください

Python がやりたいの? IDE が使いたいの?みたいな。
IronPython Studio に至っては検索すると皆「インストールしました」で終わっている。
俺 Ubuntu では Gedit、Windows では EmEditor Professional ですけど。
ココで Emacs といかないからやっぱりヲタクにはなれない。

以前から思っていたけど趣味でプログラミングをする人は大きく分けて二種類いる。

とにかく何かアプリケーションが作りたいからプログラミングをやっている人。
それとプログラミングがやりたいからプログラミングをやっている人。

IDE がどうとかって完全にプログラミングがやりたい人でしょ。
アプリケーションが作りたい人は適材適所で言語を選んでいるだけなわけで。
文法がどうとかマジどうでもいい、所詮他人が作った言語なので従うのみ。
言語は作品を作る道具としてしか見ていないわけで。

んでアプリケーション作りで覚える必要が無いことには興味も持たない。
ラムダ式とかって普通に関数を書けばいいだけだし利用する気にもならん。

「こんなことができないかな?」
とはいつも思うが
「こんな書き方ができないかな?」
なんて思ったことなんか私は色々な言語で十年やっているけど一度も無いんですけど。

私は Python が気に入ったのではなく PyGtk が気に入ったわけだから。
Gtk+ や WPF を利用する道具として Python, IronPython を選んでいるだけ。
きっと日本の Python マニアから見ると変な人なんだろう。
ま、元々が Windows のオンラインソフト作者だもので。

Python is doing in Linux

ぱぇぽぃ2 ? Blog Archive ? ラジオメニューとトグルボタンの同期

をもう少しまともに解説、やはり実際に使えるコードでないと動作を実感しないだろうから。

GtkRadioAction でラヂオメニューとツールバーを同期させる

しかし GtkRadioActionEntry の value 引数に直接値を入れたのは我ながらナイス。
ついでにココも大幅に追記、これも以前 Blog のほうで書いたコードだったりする。

テキストや図形を描写する

思いつきを Blog でやって覚書ページにまとめると決めていたがサボってばかりだ。
しかし自分で書いたコードを探すのに自分の Blog を検索するのって何か変な気分。

しばらく IronPython ばかりやっていたのですがやはり Linux で PyGtk のほうが面白いです。
なんたってすぐに起動できる、簡単に書けるようにバインディングされている、端末操作も楽。
なにより、メソッドの先頭が大文字という違和感が PyGtk には無いのが一番嬉しい。
.NET Framework はクラス名なのかメソッドなのかプロパティなのか解りにくい。

というか… .NET Framework は単純なものを作る場合は短いコードで住ませられるんだけど。
少し凝ったことをしようとすると嫌がらせとしか思えないほど面倒になってタマラン。
.NET Framework とは仮想マシンであり Windows では無いのが少し解ってきた今日この頃。
要求する新たな知識がハンパないので新参プログラマーはカワイソウ。

Devhelp を見て
「ならば PyGtk ではこう書けばイケるだろう」
が通用する PyGtk って楽だなぁと感じた今日この頃。
SDK Help はこう作って欲しいです、MSDN 様。

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!