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

環境変数の対応リストを作る

Windows では os.environ[“HOME”] が例外になってしまった。
環境変数が違うようだ、Windows が用意しているのってどんなのがあるのだろう?
C++ では Windows SDK に個別取得する関数があるのであまり気にしていなかった。

今後のプログラム用に環境変数の対応リストが作りたい。

ということで environ のキーと値を書き出す簡易スクリプト。
Windows でも Linux でも動きます、一応 Windows 版は Python 3.0 で試した。
print でリダイレクトしたほうが今の私は早いけど Python だけでやってみよう。

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

# 環境変数の書き出し

import os

keys = os.environ.keys()
result = ""
for key in keys:
	result += key + "\n" + os.environ[key] + "\n\n"

f = open("env.txt", "w")
f.write(result)
f.close()

ちなみに私の環境ではこうなった(合体しています)

env.txt

同じモンがありゃしねぇ、こりゃ環境変数を利用したコードの共有は無理だ。
どうでもいいけど Windows 用 Python での \n は CRLF になるんだね。

ちなみに IronPython では下記の要領で同じことができます。

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

import System

# IronPython は clr なので \n では LF 固定になってしまう
nn = System.Environment.NewLine

# IDictionary が返る
dic = System.Environment.GetEnvironmentVariables()
result = ""
# DictionaryEntry に展開
for ent in dic:
	result += ent.Key + nn + ent.Value + nn + nn

sr = System.IO.StreamWriter("env.txt")
sr.Write(result)
sr.Close()

なんか Python らしくないコードだ、なんたって値取得に括弧が付いていない。
プロパティから取得する部分には当然括弧は付かないわけでこうなってしまう。
大文字が多いのはしかたがないが CPython コードとの見分けになると思えば…

#! /usr/bin/env python は言うまでもなく書いてはいけません。
つーか *.py は Windows での振り分けにはどうしよう?関連づけは CPython だし。

なんて解説をしているのでもう解ると思うけどこのコードは mono でも動きます。
Ubuntu 8.10 デフォルト状態でも IronPython 1.1.2 ならそのまま動かせる。

linux_ipy

とはいえ Linux で IronPython というのは凄く無駄を感じますけど。
動かせるとはいえ実用となると今後もビミョーとしか言いようがない。

一応書くと Mac は全然解りません。

アクティブ以外全部閉じる

gEdit のタブ右クリックメニューの name 属性名が知りたい。
いやぁ gEdit のソースコードを見たけど全然解らないや!

gedit

ココの GNOME ftp site って所から ftp で落とせる。
想像していたより小さくて驚いた、まぁ Gtk+ 自体が部品のようなアプリだが。
しかし C でよくぞここまで綺麗に、Windows では考えられない。

でも結局タブの name 属性は解らないまま。
日本語版じゃどうせ解らないから最初からメリケンの Google で探しまくる。
それでもやはり解らない、みんなこういうカスタマイズに興味はないのか?

てゆーか他人が書いたコードをそのまんま貼っている人って以外に多いんだなぁ。
一部日本人だけの特徴だとずっと思っていたよ。

ふと思いついてキーワードから gEdit を外して探してみた。

http://www.tortall.net/mu/wiki/EpiphanyExtensions/tab-menu-close.py?raw

なんか全然関係なさそうだけどコレってもしかして…

ui_str = """<ui>
    <popup name="NotebookPopup">
        <separator/>
        <menuitem name="but_active" action="but_active"/>
    </popup>
</ui>
"""

で gEdit のタブ右クリックメニューに追加できた!
コレさえ解れば簡単だ、ということで [アクティブ以外全部閉じる] 完成。
本サイトにて公開中、以上自己宣伝検索の技でした。

しかしプラグインはたったの百行以下でも成立するからイイね。
これなら結構頻繁に本サイトも更新できるようになりそうだ。

ui_manager

EyeOfGnome – SunagaLab

Gnome 標準の「画像ビューア」も Python でプラグイン拡張ができるんだ。
知らなかった、しかし需要が恐ろしく微妙だ…
何か作ってみようと思ったけど今は全然思いつかない。

しかし同じように get_ui_manager メソッドでわりと楽に UI の取得ができるようで。
調べてみると Totem も当然のように、いや俺はコレについて書くわけには…
よく解らないんだが GtkBuilder は関係あるのかな?

GtkBuilderとGladeについてと、PyGTK上での使用について(概要) – 試験運用中なLinux備忘録

今唐突に思いついたが gEdit のタブ右メニューに「このタブ以外を閉じる」が欲しいぞ。
タブ右メニューの name は…ソースを見るしかない臭いんだが、あまりやりたくないけど。

ところで Gnome 標準なら全部こうなのかな?と思って検索したけどそうでもないや。
まあそりゃ Tomboy なんかは mono だし当然 C# になるわな。
mono やりたい人はこんなのから始めるといいかもよ。

Tomboy/HowToCreateAddins – GNOME Live!

私は Tomboy は使っていないけど…

SyntaxHighlighter 2.0 は textarea もイケた

SyntaxHighlighter 2.0 に詳しいサイトを見つけた。

SyntaxHighlighter2.0の使い方 – ShanaBrian Official WebSite

textarea のままイケたんだ orz
pre に全書き換えしたあの苦労はいったい…

まぁおかげでいつかやろうと思っていた徹底的な整理が終わったけど。
ヘッダとフッタは require_once で読み込んでソコから又色々読み込んで
てなわけでテンプレートはこんなに小さくなった。

<?php $title = ""; require_once("../_header.php"); ?>

<h2></h2>
<div class="entry">
</div>

<!--
<h2></h2>
<div class="entry">
</div>
<pre class="brush: py"></pre>
-->

<?php require_once("../_footer.php"); ?>

もう Bluefish はいらないや、で削除と。

後 pre 変更するのに困ったのが HTML のエンティティ化。
textarea は < とかはそのまんま書けたけど pre は変換しなきゃ駄目。
コレ C++ でやると泣く、山括弧を使いまくる言語だもの。

しかたがないので一度 Windows にもっていき秀丸のマクロでやったり…
それも面倒なので HTML エスケープの gEdit のプラグインを作ってみた。

HTML エスケープ
少し改造しました、トップページ(上のリンクの本サイトのとこ)からどうぞ。

もう少し試して解説ページを作ります。

起動している自ウインドウを見つける

多重起動防止でまだ詰まっております。
C 言語での方法はボチボチ見つかるけど Python に書き換えると上手くいかない。

色々調べると wnck なんていうモジュールがあることが解った。

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

import wnck

# デスクトップ取得
w = wnck.screen_get_default()

# ディスプレイサイズ

print "ディスプレイ幅",w.get_width()

print "ディスプレイ高さ",w.get_height()

なんてコトができるというのが解った。
が PyGtk のヘルプにも Python のヘルプにも wnck の項目が見つからない…

GNOME Library – 開発者

Gnome のヘルプ内で Libwnck というのがやっと見つかった。
Opera のページ内検索は便利だね、ドットを押すだけだし。
いや、肝心の検索バーが Linux 版はたまに入力不能になるので…まあこれはいい。
後は man と dir(wnck) と USA Google を使って地味に調べてみた。

PyGTK FAQ Entry

ほーこんなことができるんだ。
ということは

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

import gtk
import wnck

screen = wnck.screen_get_default()

while gtk.events_pending():
    gtk.main_iteration()

for window in screen.get_windows():
    name = window.get_name()
    if name.endswith("Y901x"):
        print "起動しています"
        break

なんてコードで現在 Y901x が起動しているかどうかは確認できるわけだ。
同じ名前が存在していたら困るけどまず無いだろう。
とはいえいつのまにか全然違うコードになるかもしれないんだけど…

とにかく後はウインドウに URI を渡す処理だけだ、もう少し。