2010/11/28

python-notify(pynotify)をもっと簡単に使えるようにするモジュール

「Python Recipes」に戻る

Release:1.3
Date:November 28, 2010
テスト環境
OS: Ubuntu10.10
Python2.6.6

epynotifyを大幅に書き直しました。

前のコードよりはよくなっていると思います。pynotify.Notification のクラスを継承したのでpynotify
のメソッドがすべて使えるようになりました。

時間があったらもっと機能を増やしたいと思います。

使い方

まだすべてを試したわけではありませんが、epynotifyは [/usr/share/icons] にあるアイコンは
アイコン名を入力すれば使えるようです。(Ubuntuに登録されているアイコン?だけかもしれません)

ということで、自分の使いたいアイコンを検索できるように、find_icon() という関数を書きました。


find_icon(key[, size])
[/usr/share/icons] にあるアイコンをkeyとsizeで指定して、検索し、パスを表示します。

key は、何も入力しないと"dialog"で指定しています。
size は省略可能です。省略したら48x48のアイコンを検索します。

使い方は

$ python -c "import epynotify; epynotify.find_icon('emacs')"

/usr/share/icons/hicolor/48x48/apps/emacs.png
/usr/share/icons/hicolor/48x48/apps/emacs23.png


とすればアイコンのパスが表示されます。

$ python -c "import epynotify; epynotify.epynotify('title', image='emacs')"

で表示されるか確認してみてください。


epynotify(title[, message[, image]])
Notificationを表示します。



title は、何も入力しないと”Hello, World!”になっていて省略可能ですが、何か記入してください。
message は省略可能です。省略すると何も表示されません。
image は省略可能です、省略するとアイコンは表示されません。

imageは番号で指定できます。 ex) image=0
私が指定しているアイコンは
{0: "dialog-information", 1: "distributor-logo", 2: "un-reboot", 3: "dialog-error", 4: "gnome-run"}
ですが、ここは好きなように書き換えてください。

[/usr/share/icons]にあるアイコンはアイコン名だけで表示が可能です。
ex) image="emacs"

epynotifyと同じディレクトリにあるアイコンは拡張子をつけてください。
ex) image="attention.png"

これら以外のアイコンを使う場合は絶対パスを指定してください。
ex) image="/home/user/Pictures/icons/function.png"

残りの関数は前と同じで、新しいepynotifyの関数を参考にしてください。





以下は古い内容です。

汚いコードなので誰か修正してもらえると嬉しいです。

pynotifyをもっと簡単に使いたいなぁと思ってつくりました。
コードはめちゃくちゃ汚いので、誰か間違いを指摘していただけるととても嬉しいです。
コメントは全部英語で書こうと思ったのですが、私の英語力の低さに断念しました。
ライセンスはpython-notifyに準じると思うのですが、そうでない場合は 改変なりなんなり好き勝手に
使ってください。ここの記事へのリンクをしていただけると私がかってに喜びます。

使い方

まずは、ダウンロードしましょう。
ここ からダウンロードしてください。
テストができるようにしてあるので、まずは実行してみてください。
tar.gz を展開してできたディレクトリにはいって、下記を実行します。
$ python epynotify.py
すると、

このような感じで表示されます。
使いたいときは、Pythonのパスの通ったディレクトリに入れてください。
例えば、 /usr/lib/python2.6/ などです。
ちなみにPythonスクリプトと同じディレクトリに入れていても使えます。
私は .zshrc
#Add my modules
export PYTHONPATH=$PYTHONPATH:/home/iyori/Works/python/mymodules
と書いてパスを通しています。
それぞれの機能

epynotify(title[, message[, image]])
Notificationを表示します。

Note
title は、何も入力しないと”Hello, World!”になっていて省略可能ですが、何か記入してください。
message は省略可能です。省略したら何も表示されません。
image は省略可能で、デフォルトでは epynotify ディレクトリの”attention.png”が表示されます。
他のアイコンを使いたいときは絶対パスを記入してください。

gnotify(title[, message[, image]])
Notificationを表示します。

Note
title は、何も入力しないと”Hello, World!”になっていて省略可能ですが、何か記入してください。
message は省略可能です。省略したら何も表示されません。
image は省略可能で、デフォルトでは /usr/share/icons/gnome/48x48/actions/
“gnome-run.png”が表示されます。 /usr/share/icons/gnome/48x48/actions/
ない場合は、何も表示されません。いろいろ自分好みに書き換えてみてください。

messages(title[, message[, image]])
Notificationとコンソールにメッセージと現在時刻を表示します。

Note
title は、 Notificationとコンソールに表示したいタイトルを記入してください。
message は省略可能です。省略したら何も表示されません。
image は省略可能で、デフォルトでは epynotify ディレクトリの”attention.png”が表示されます。
他のアイコンを使いたいときは絶対パスを記入してください。
1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#-*- coding:utf-8 -*-
 # Author: Iyori Komiyama
 # Contact: hazimarino@gmail.co.jp
 """\
 pynotifyを簡単に使えるようにするモジュール

 Classes:
     _EPYNotify
     _GPYNotify

 Functions:
     epynotify(title='Hello, World', message='test', image='attention.png')
     -> None

     gnotify(title='Hello, World', message='test,
     image='/usr/share/icons/gnome/48x48/actions/gnome-run.png') -> None

     messages(title, message='test', image='attention.png') -> None
 """
 import os.path
 import datetime
 try:
     import pynotify
     if not pynotify.init('test'):
         raise
 except ImportError as e:
     print("{0} : Please install pynotify".format(e))
 except:
     ERROR = "there was a problem initializing the pynotify module"
     print(ERROR)

 __all__ = ['epynotify', 'gnotify', 'messages']

 __version__ = '0.0.1'

 DEFAULT_TITLE = 'Hello, World!'
 DEFAULT_MESSAGE = ''
 DEFAULT_IMAGE = None

 class _EPYNotify(object):
     """ EPYNotify(title, message='', image='attention.png') return None

     title -> pynotifyに表示するタイトル
     message -> メッセージを表示(省略可)
     image -> デフォルトでは、緑のアテンションアイコンが表示されます。
     """
     def __init__(self, title, message='', image=None):
         self.title = title
         self.message = message
         self.image = image

     def show(self):
         """ show Notification """
         if not self.image:
             mddir = os.path.dirname(os.path.abspath(__file__))
             self.image = '{0}/attention.png'.format(mddir)
         pynotify.init(self.title)
         n = pynotify.Notification(self.title, self.message, self.image)
         n.show()

 class _GPYNotify(_EPYNotify):
     def show(self):
         """ show ubuntu icons that (/usr/share/icons/hicolor/48x48/apps/)

         Default icon is gnome-run.png.
         You choices (/usr/share/icons/gnome/48x48/actions) image.
         """
         if not self.image:
             self.image = "gnome-run.png"
         self.image = "/usr/share/icons/gnome/48x48/actions/{0}".format(self.image)
         pynotify.init(self.title)
         n = pynotify.Notification(self.title, self.message, self.image)
         n.show()

 def epynotify(title='', message='', image=None):
     """epynotify([string[, string[, absolute-icon-path]]])

     return to EPYNotify().show()
     title=''   default string is 'Hello, World!'
     message=''   notify's message
     image=None   default icon is attention.png.
     """
     if not title:
         title = DEFAULT_TITLE
         message = DEFAULT_MESSAGE
         image = DEFAULT_IMAGE
         return _EPYNotify(title, message, image).show()
     else:
         return _EPYNotify(title, message, image).show()

 def gnotify(title='', message='', image=None):
     """\
     gnomeのアイコンをいろいろ使えるepynotify
     """
     if not title:
         title = DEFAULT_TITLE
         message = DEFAULT_MESSAGE
         image = DEFAULT_IMAGE
         return _GPYNotify(title, message, image).show()
     else:
         return _GPYNotify(title, message, image).show()

 def messages(title, message='', image=None):
     """\
     Notification と一緒に、consoleにメッセージと時間を表示する。
     """
     dt = datetime.datetime.now()
     if not message:
         message = DEFAULT_MESSAGE
         image = DEFAULT_IMAGE
         epynotify(title)
         print('*' * 80)
         print('\t{0}\n'.format(title))
     else:
         epynotify(title, message, image)
         print('*' * 80)
         print('\t{0}\n\t{1}\n'.format(title, message))
     print('{year}/{month:#02d}/{day:#02d} '
           '[{hour:#02d}:{minute:#02d}:{second:#02d}]'.format(
               year=dt.year, month=dt.month, day=dt.day, hour=dt.hour,
              minute=dt.minute, second=dt.second))
     print('*' * 80)

 def demo():
     from time import sleep
     # test
     epynotify('Hello, World!', 'test')
     sleep(10)
     gnotify('Hello, World!', 'test')
     sleep(10)
     messages('test', 'test')

 if __name__ == '__main__':
     demo()

最後に

以上で、説明的な内容は終わりですが、classを使う必要ないんじゃない??
とか、つっこみどころ満載なので、twitterやコメントにてご指摘を受け付けています。

参考・引用

Note
■ Pythonスクリプトでオリジナルのメッセージを通知する方法 - 独学Linux

「Python Recipes」に戻る

2010/11/24

Emacs設定ファイルのディレクトリを取得し、変数に入れる(ファイル自身のディレクトリ名を取得)

「Emacsのtips的なもの」に戻る

Release:1.0
Date:November 24, 2010
テスト環境
OS: Ubuntu10.10

GNU Emacs 23.1.1 (i486-pc-linux-gnu, GTK+ Version 2.20.0)

はじめに

私がemacsを使い始めた頃(といってもまだ4ヶ月ですが)、 emacs-starter-kit を入れて使っていました。
今は半分も使っていませんが、とにかくそのコードに
(setq dotfiles-dir (file-name-directory
                    (or (buffer-file-name) load-file-name)))
というものがあり、Emacsを勉強している最中なので、このコードはいったいどういう
働きをするもんなんだ? と思ったのです。
調べてみたところ、「ファイル自身のディレクトリ名を取得するもの」だとわかり、
便利だなぁと思ったので、ブログに設定をメモしておきます。


load-file-name と file-name-directory

■load-file-name

これは「自分自身のファイル名を取得する」ものだそうです。(マクロ?)

詳細は blog::2310 さんのサイトにをご覧ください。

Note

(setq this-file-name load-file-name)
–> this-file-nameには’/home/hoge/hoge.el’が代入される

■file-name-directory

これは「ファイル名のディレクトリ部分を返す」という関数です。

詳細は、 GNU Emacs Lispリファレンスマニュアル に書いてありました。

Note

(file-name-directory “lewis/foo”) ; UNIXの例
=> “lewis/”

結果

これらを統合した自分のelispは下記になります。

;; .emacs.d/init.d のパスをditfiles-dirに格納
;;■参考
;;(shell-command "x-www-browser http://www.geocities.co.jp/SiliconValley-Bay/9285/ELISP-JA/elisp_383.html")
;;(shell-command "x-www-browser http://blog.2310.net/archives/94")
;;■引用
;;(shell-command "x-www-browser https://github.com/zahardzhan/emacs-starter-kit/blob/master/init.el")
(setq dotfiles-dir (file-name-directory (or load-file-name (buffer-file-name))))

;; それぞれのディレクトリに変数を代入
(setq package-user-dir (concat dotfiles-dir "elpa/"))
(setq init-dir (concat dotfiles-dir "initialize/"))
(setq vendor-dir (concat dotfiles-dir "vendor/"))

;; pathを通す
(add-to-list 'load-path dotfiles-dir)
(add-to-list 'load-path init-dir)
(add-to-list 'load-path vendor-dir)

使い方は、簡単で、

(add-to-list 'load-path (concat vendor-dir "auto-complete"))

などとして、concatで結合してあげれば、見やすく間違いの少ないコードになったような気がします。

参考・引用

Note

blog::2310: http://blog.2310.net/archives/94
GNU Emacs Lispリファレンスマニュアル:
Emacsテクニックバイブル ~作業効率をカイゼンする200の技~
Emacsテクニックバイブル ~作業効率をカイゼンする200の技~るびきち

技術評論社 2010-08-03
売り上げランキング : 13403


Amazonで詳しく見る

「Emacsのtips的なもの」に戻る

2010/11/22

素数かどうかを判定し、素数でなかったらどの数で分解できるのか表示する

「Python Recipes」に戻る

Release:1.0
Date:November 22, 2010
テスト環境
OS: Ubuntu10.10

Python2.6.6

はじめに

素数をどれだけ速く導き出せるかに挑戦したかったのですが、途中で挫折しました。
人の作ったアルゴリズムを使うので精一杯です。
xrange(2, 10000)

のところと

if 0 not in (x % y for y in xrange(2, x))

を工夫できればもっと速くなりますきっと。

これに気づかれたsuztomoさんはとてもすごいです。自分ももっと頑張ろう。

また時間ができたら書き直します。

1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#!/usr/bin/env python
 #-*- coding:utf-8 -*-
 # Author: Iyori Komiyama
 # Contact: hazimarino@gmail.co.jp
 # site: http://hazimarino.blogspot.com/
 """\
 素数かどうかを判定し、素数でなかったらどの数で分解できるのか表示する
 9973 の素数で分解できる範囲まで。
 """
 from __future__ import unicode_literals

 def enter():
     while True:
         try:
             digits = int(raw_input('Please input a number>> '))
             if digits < 0: raise
         except ValueError:
             print("正の整数を入力してください")
         else: return digits

 def primes(value):
     p_nums = (x for x in xrange(2, 10000)
               if 0 not in (x % y for y in xrange(2, x)))
     if (value == 1) or (value == 0):
         print("{0} は素数ではありません".format(value))
         return
     for p in p_nums:
         if value == p:
             print("{0} は素数です".format(value))
             return
         elif not value % p:
             print("{0} は素数ではありません: " \
                   "{1} x {2}".format(value, value / p, p))
             return
     else:
         print("数値が大きすぎます")

 def main():
     print('素数かどうかを判定します')
     print('*' * 80)
     num = enter()
     print('*' * 80)
     primes(num)

 if __name__ == '__main__':
     main()

gist


参考・引用

suztomoの日記 –pythonのリスト内包で素数のリストを作る

「Python Recipes」に戻る

2010/11/21

C言語の基礎早めくり

「C言語まとめ」に戻る

Release:1.0
Date:November 21, 2010
テスト環境
OS: Ubuntu10.10
gcc version 4.4.5 (Ubuntu/Linaro 4.4.4-14ubuntu5)

はじめに

自分用に書いた、C言語の基礎をぱぱっと見れるようにしたものです。
人に見せられるようなものではないのですが、一応メモがわりということで。

■行の継続

\ を使う。
#include <std\
io.h>

■データの終わり

EOFNULL
while ((c=getchar()) != EOF){
      ...
}
とか、
while (gets(st) != NULL){
      ...
}
  • getchar() は入力終了で EOF を返す。
  • get() は入力終了で NULL を返す。
  • fopen はオープン失敗で NULL を返す。

■文字列の内部表現

char str[6] = "HELLO";
これは、内部的には
char str[6] = { 'H','E','L','L','O','\0' };
となっている。
文字列の終わりにはかならず \0 がつくので、文字列を格納するときには
「文字列の長さ + 1」とする。

■文字列リテラルの連結

char ss[] = "ABCD" "1234" "abcd";

printf("%s\n", ss);   /* ABCD1234abcd と出力される  */
printf("aaaa" "bbbb" "\n");   /* aaaabbbb と出力される  */

■コメント

/* コメント開始

C言語のコメント

コメント終わり */

■予約語

Note
autodoubleintstruct
breakelselongswitch
caseenumregistertypedef
charexternreturnunion
constfloatshortunsigned
continueforsignedvoid
defaultgotosizeofvolatile
doifstaticwhile

■関数、変数の名前について

▼使用できる文字
[a-z][A-Z][0-9] と _ (アンダーバー)
▼命名規則
* 先頭文字には英大小文字または _ (アンダーバー)
* 長さは31文字まで。
* 予約後をつかってはいけない。

■空文

for (i=0; i<=10000; i++)
      ;
while (*p1++ = *p2++)
      ;

■定数

▼整数定数
区別説明
8進数先頭に「0」をつけて表記(077など)
10進数通常の10進数と同じ表記(0以外ではじまる)
16進数先頭に「0x」をつけて表記(0x41, 0x1a, 0xAB03など)
▼定数の型を指定する整数定数
区別説明
unsigned 型定数文字 「 u 」 または 「 U 」 を後ろに付ける(12300Uなど)
long 型定数文字 「 l 」 または 「 L 」 を後ろに付ける(0Lなど)
unsigned long 型定数文字 「 ul 」 または 「 UL 」(34UL)
▼浮動小数点定数
区別説明
小数点形式ピリオドを使って表記(12.5, 2.45, .3など)
指数形式「 e 」 または 「 E 」 を使って表記 (3.456e2=345.6, 6.78e-3=0.00678など)
▼定数の方を指定する浮動小数点定数定数
区別説明
float 型定数「 f 」 または 「 F 」 を後ろに付ける(1.4142f, 1.0e-3fなど)
long double 型定数「 l 」 または 「 L 」 を後ろに付ける(10.43L, 5.23e-5Lなど)
▼文字定数
「’ ‘」で囲む。文字コードはASCII。
char = 'a'
▼文字列定数
「” “」で囲む。
char[] = "こんにちは"

■エスケープシーケンス

文字列機能
\aベル文字(内蔵ベルを鳴らす)
\bバックスペース
\f改頁(クリア)
\n改行
\r復帰(同じ行の先頭に戻る)
\t水平タブ
\v垂直タブ
\\\を表示
\'シングルクォーテーション(')を表示
\"ダブルクォーテーション(")を表示
\??を表示(3文字表記対策)
\0NUL(終端文字)
\ooo8進数
\xhh16進数
●16進数の桁数が3桁以上になると、警告・エラーになる問題
printf("\x1b" "3")
文字列結合を使って回避。(「printf(“x1b3”)」ではエラーになる)

■データ型

データ型説明 表現範囲 byte(bit)
char1文字、または256種類の数値を保存-128〜1271(8)
signed char符号付きのchar型文字を保存-128〜1271(8)
unsigned char符号なしのchar型文字を保存0〜2551(8)
データ型説明 表現範囲 byte(bit)
short intint は省略可能。整数を保存する-32768〜327672(16)
signed short int符号付のshort型整数を保存-32768〜327672(16)
unsigned short int符号無しのshort型整数を保存0〜655352(16)
データ型説明 表現範囲 byte(bit)
int整数の保存-2147483648〜21474836474(32)
signed int符号付きのint型整数の保存-2147483648〜21474836474(32)
unsigned int符号無しのint型整数の保存0〜42949672954(32)
データ型説明 表現範囲 byte(bit)
long intlong型整数の保存-2147483648〜21474836474(32)
signed long int符号付きのlong型整数の保存-2147483648〜21474836474(32)
unsigned long int符号無しのlong型整数の保存0〜42949672954(32)
データ型説明 表現範囲 byte(bit)
float浮動小数点を保存。実数型で最も最小約10e-39〜10e374(32)
double浮動小数点を保存。floatよりも大きなサイズを確保する約10e-309〜10e3078(64)
long double浮動小数点を保存。doubleよりも大きなサイズを確保する約10e-4933〜10e493112(96)
※環境によって数値は異なります
sizeof() で調べてみてください。
#include <stdio.h>

int main(void)
{
    int a = 1;
    int b = 0;

    printf("char型のサイズは%dバイトです。\n", sizeof(char));
    printf("signed char型のサイズは%dバイトです。\n", sizeof(signed char));
    printf("unsigned char型のサイズは%dバイトです。\n", sizeof(unsigned char));
    printf("short int型のサイズは%dバイトです。\n", sizeof(short int));
    printf("signed short int型のサイズは%dバイトです。\n", sizeof(signed short int));
    printf("unsigned short int型のサイズは%dバイトです。\n", sizeof(unsigned short int));
    printf("int型のサイズは%dバイトです。\n", sizeof(int));
    printf("signed int型のサイズは%dバイトです。\n", sizeof(signed int));
    printf("unsigned int型のサイズは%dバイトです。\n", sizeof(unsigned int));
    printf("long int型のサイズは%dバイトです。\n", sizeof(long int));
    printf("signed long int型のサイズは%dバイトです。\n", sizeof(signed long int));
    printf("unsigned long int型のサイズは%dバイトです。\n", sizeof(unsigned long int));
    printf("float型のサイズは%dバイトです。\n", sizeof(float));
    printf("double型のサイズは%dバイトです。\n", sizeof(double));
    printf("long double型のサイズは%dバイトです。\n", sizeof(long double));
    printf("変数aのサイズは%dバイトです。\n", sizeof(a));
    printf("式a+bのサイズは%dバイトです。\n", sizeof(a + b));

    return 0;
}

■標準入龍津力関数(コンソール入出力関数)

▼printf()
Note
% フラグ フィールド幅 .精度 変換装飾子 変換指定子
●フラグ(省略可能)
-左詰めで出力する(デフォルトでは右詰め)
+数値の前に + / - の符号を付ける(デフォルトでは - のみ)
空白正数の場合に先頭に空白を出力して負の場合と位置を揃える
0数値出力のときに先頭を0で埋める。ゼロバンディング
#数値データ型に対応する別の出力形式を自動的に付加するようにする

対応する変換指定子により以下のとおり効果が変わる

対応変換指定子#の効果
o8進数のデータの先頭に0を付ける
x, X16進数のデータの先頭に0xまたは0Xを付ける
e, E, f出力に必ず小数点を付ける
g, G同上、さらに小数点に続く0を省略しない
printf("デフォルト[%d]\n", 123);
/* デフォルト[123] */
printf("8スペースを確保する[%8d]\n", 123);
/* 8スペースを確保する[     123] */
printf("左詰め[%-8d]\n", 123);
/* 左詰め[123     ] */
printf("8スペースを確保し0で埋める[%08d]\n", 123);
/* 8スペースを確保し0で埋める[00000123] */
printf("8進数にする[%#o]\n", 123);
/* 8進数にする[0173] */
printf("16進数にする[%#x]\n", 123);
/* 16進数にする[0x7b] */
●精度(省略可能)
数値出力の幅を指定する
*対応する引数の値を数値指定とする
int num = 123; n = 10;
printf("n引数で幅を指定する[%*d]\n", n, num);
/* n引数で幅を指定する[       123] */
●フィールド幅(省略可能)
.数値小数点以下の桁数、または最大表示数値を指定する。

対応する変換指定子により以下のとおり効果が変わる

対応変換指定子効果(n=数値)
d, i, o, u, x, X少なくともn個の数字を書く

数字が足りないときは先頭を0で埋める
e, E, f小数点のあとにn個の数字を書く
g, G有効数字を最大n行とする
s最大表示文字数をnとする
.0小数点以下の数字を表示しない(切り捨て)
.同上
.*対応する引数の値を数値をする
double num = 1.4142;
printf("デフォルト[%f]\n", num);
/* デフォルト[1.414200] */
printf("小数点以下3桁まで表示[%.3f]\n", num);
/* 小数点以下3桁まで表示[1.414] */
char ss[] = "abcdefghij";
printf("最大5文字表示[%.5s]\n", ss);
/* 最大5文字表示[abcde] */
●変換修飾子(省略可能)
h変換指定子がd, i, o, u, x, Xのとき対応する引数がshort型または

unsigned shrot型であることを示す。変換指定子がnのとき対応する引数が

short型へのポインタであることを示す。
l変換指定子がd, i, o, u, x, Xのとき対応する引数がlong型または

unsigned long型であることを示す。以下同文。
L変換指定子がe, E, f, g, Gのとき対応する引数がlong double型

であることを示す。
short int sh = 1234;
printf("short int型を表示する[%hd]\n", sh);
/* short int型を表示する[1234] */

●変換指定子

o8進数で出力する
d, i10進数で出力する
x, X16進数で出力する。xは小文字、Xは大文字で出力
u符号無し10進数で出力する
c文字を出力する
s文字列を出力する
f浮動小数点として出力する(float, double共)。標準の精度は6桁。

変換のとき適切な桁数にするための値の丸めを行う。
e, E指数形式で出力する。eは小文字、Eは大文字で出力。標準の精度は6桁。

g, Gf変換を適切な形式で行う。有効精度以上のときなど。
pポインタとして出力する。表示形式は環境依存。
n%nがくるまでに出力された文字の数を対応するint*型引数に書き込む。
%%自信。%%と書く
double num = 3.14;
printf("適切な桁に丸める[%g]\n", num);
/* 適切な桁に丸める[3.14] */
Note
%c char 1文字を出力する “%c”
%s char * 文字列を出力する “%8s”, “%-10s”
%d int, short 整数を10進で出力する “%-2d”,”%03d”
%u unsigned int, unsigned short 符号なし整数を10進で出力する “%2u”,”%02u”
%o int, short,
unsigned int, unsigned short 整数を8進で出力する “%06o”,”%03o”
%x int, short,
unsigned int, unsigned short 整数を16進で出力する “%04x”
%f float 実数を出力する “%5.2f”
%e float 実数を指数表示で出力する “%5.3e”
%g float 実数を最適な形式で出力する “%g”
%ld long 倍精度整数を10進で出力する “%-10ld”
%lu unsigned long 符号なし倍精度整数を10進で出力する “%10lu”
%lo long, unsigned long 倍精度整数を8進で出力する “%12lo”
%lx long, unsigned long 倍精度整数を16進で出力する “%08lx”
%lf double 倍精度実数を出力する “%8.3lf”

つづく?

詳しくは以下の参考文献を参照。

参考・引用

Note
C言語入門

初心者のためのポイント学習C言語

若葉プログラミング塾 ワンポイントTips
下の本から多用しました。不都合などがありましたら、ご連絡ください。
新・C言語入門 シニア編 (C言語実用マスターシリーズ)(林 晴比古さん)
新・C言語入門 シニア編 (C言語実用マスターシリーズ)

「C言語まとめ」に戻る

2010/11/19

Pythonでファイルを圧縮する(tar.bz2, tar.gz, zip)

「Python Recipes」に戻る

Release:1.0
Date:November 19, 2010

テスト環境
OS: Ubuntu10.10

Python2.6.6

使い勝手悪いかもしれません。

Pythonでファイルを圧縮したくてつくりました。

取り敢えず、コメントを見てもらえれば使い方はわかると思います。

スクリプトファイルとして実行するときは、

$ chmod +x pycompress.py
$ ./pycompress.py 圧縮したいファイル (bz2, gz, zip)のうちから1つ

とすれば、簡単に圧縮できるようになっています。

まだ未完成な部分があるので、バグがあったら教えてください。

1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#!/usr/bin/env python
 #-*- coding:utf-8 -*-
 # Author: Iyori Komiyama
 # Contact: hazimarino@gmail.co.jp
 # site: http://hazimarino.blogspot.com/
 """\
 ファイルをtar.bz2, tar.gz または zip で圧縮します。
 """
 import os
 import tarfile
 import zipfile
 from fnmatch import fnmatch

 exts = ['*.lzh', '*.zip', '*.rar', '*.gz', '*.bz2', '*.xz', '*.?[gbx]z']

 def pycompress(cmpfile, types="bz2", min_size=16):
     """\
     pycompress(cmpfile[, types[, min_size]]) -> None

     cmpfile      圧縮したいファイル名を入力してください。\
                  (スクリプファイルと同じフォルダでない場合は、絶対パスを入力してください)
     types        bz2, gz, zip のいずれかの圧縮タイプを入力してください。
     min_size     圧縮したくない場合の最低サイズを入力してください。
     """
     if os.stat(cmpfile).st_size > min_size:
         if not any(fnmatch(cmpfile.lower(), p) for p in exts):
             if types == "zip":
                 zp = zipfile.ZipFile("{0}.zip".format(cmpfile),
                                      'w', zipfile.ZIP_DEFLATED)
                 zp.write(cmpfile)
                 zp.close()
             else:
                 tar = tarfile.open('{0}.tar.{1}'.format(cmpfile, types),
                                    'w:{0}'.format(types))
                 tar.add(cmpfile)
                 tar.close()
         else:
             print(u"すでに圧縮ファイルです。".encode('utf8'))
     else:
         print(u"ファイルが小さすぎます。".encode('utf8'))

 if __name__ == '__main__':
     import sys
     try:
         if sys.argv[2] == "bz2":
             pycompress(sys.argv[1], 'bz2')
         elif sys.argv[2] == "gz":
             pycompress(sys.argv[1], 'gz')
         elif sys.argv[2] == "zip":
             pycompress(sys.argv[1], 'zip')
         else:
             raise
     except (IndexError, TypeError):
         print("適切なタイプ(bz2, gz, zip)を入力してください。")
 '''
 Created on 2010-11-13
 @author Iyori Komiyama
 '''

gist


参考・引用

くだすれPython(超初心者用) その8

「Python Recipes」に戻る

2010/11/11

エスケープシーケンスで、コンソール制御(メーターと残り時間と顔文字)

「Python Recipes」に戻る

テスト環境
OS: Ubuntu10.10
Python2.6.6
Python2.5.2
Python3.1.2:

エスケープシーケンスで、コンソール制御(メーターと残り時間と顔文字)



エスケープシーケンスで、コンソールを制御してアニメーションをさせようというものです。
Windows 2000 以外の MS-DOS プロンプトや Linux で使えるらしいです。(引用元によると)
Pythonで書いたらこうなるんではないかなぁというコードなので汚くてすみません。
詳しくは下記のサイトを参照してください。
Note
引用・参考
C言語-コンソールでプログレス表示(アニメーション)(3) – 碧色工房-blue studio-
#!/usr/bin/env python
#-*- coding:utf-8 -*-
# Author: Iyori Komiyama
# Contact: hazimarino@gmail.co.jp
"""\
メーターと残り時間と顔文字を表示する
"""
from __future__ import unicode_literals
import sys
from time import sleep

def stdwrite(msg):
    try:
        sys.stdout.write(msg.encode('utf8'))
    except TypeError:
        sys.stdout.write(msg)
    finally:
        sys.stdout.flush()

ani = ("(^_^)", "(-_-)", "(*x*)")
# エスケープシーケンスをつかってカーソルを上に持っていく
anf = lambda x: " {0}\n\x1b[2A".format(ani[x])

def main(time):
    time = time * 100
    for i in range(1, time + 1):
        rate = i * 71 // time
        times = ((time + 1) - i) // 100
        meter = "\r|{0}{1}| {2}%\n".format(
            ("=" * rate), (' ' * (71 - rate)), i * 100 // time)
        timer = "\r残り {0:#02d} 秒".format(times)
        if  times % 2 == 0:
            anime = anf(1)
        elif times % 3 == 0:
            anime = anf(2)
        elif times % 5 == 0 and times % 7 == 0:
            anime = anf(3)
        else:
            anime = anf(0)
        stdwrite(meter)
        stdwrite(timer)
        stdwrite(anime)
        sleep(0.01)
    # 終了する前にカーソルを下に持っていく
    sys.stderr.write('\x1b[2B')


if __name__ == "__main__":
    main(20)

「Python Recipes」に戻る

2010/11/07

コンソール(ターミナル・シェル)上で改行をさせずに文字を表示する方法(タイマーを作ってみた)

「Python Recipes」に戻る

Release:1.0
Date:November 07, 2010
  テスト環境
  OS: Ubuntu10.10

  Python2.6.6
  Python2.5.2
  Python3.1.2

コンソール(ターミナル・シェルなど)上で改行をさせずに文字を表示する

apt-getやbzrの待ち時間を表すものなどは、コンソール(ターミナル・シェル)上では改行されないで、
表示されています。
これを実現するためには sys.stdout.write()sys.stdout.flush()
使います。
まずは、下のコードを走らせてみましょう。

■Pyrhon2.5とPython2.6
import sys
from time import sleep

wait_time = 1
strings = u"いろはにほへと"

for num, strs  in enumerate(strings):
    disply = "\r%d番目 -->  %s" % (num + 1, strs.encode('utf8'))
    sys.stdout.write(disply)
    sys.stdout.flush()
    sleep(wait_time)
sys.stderr.write('\n')
■Python3.1
import sys
from time import sleep

wait_time = 1
strings = "いろはにほへと"

for num, strs  in enumerate(strings):
    disply = "\r{0}番目 -->  {1}".format(num + 1, strs)
    sys.stdout.write(disply)
    sys.stdout.flush()
    sleep(wait_time)
sys.stderr.write('\n')
「1番目 –> い」 〜 「7番目 –> と」までが、コンソール上で改行されずに表示されたはずです。
もし flush() をしなければ、コンソールにはなにも表示されません。
flush() を使ってきちんと書き出しをしましょう。(※自分もよくわかっていません)

コンソール上で改行させずに1行で表示するコード(タイマー風・メーター付き)

今度は、メーター風の文字を表示させながら残り時間を表示するコードです。

■Python2.6 Python3.1
import sys
from time import sleep

rng_time = 10
wait_time = 1

for i in range(1, rng_time + 1):
    rate = i * 71 // rng_time
    meter = "\r|{0}{1}| {2}秒".format("=" * rate, ' ' * (71 - rate), (rng_time - i))
    sys.stdout.write(meter)
    sys.stdout.flush()
    sleep(wait_time)
sys.stderr.write('\n')
■Python2.5
import sys
from time import sleep

rng_time = 10
wait_time = 1

for i in range(1, rng_time + 1):
    rate = i * 71 / rng_time
    meter = "\r|%s%s| %d秒" % ("=" * rate, ' ' * (71 - rate), (rng_time - i))
    sys.stdout.write(meter)
    sys.stdout.flush()
    sleep(wait_time)
sys.stderr.write('\n')
表示されるのは、
|=======                                                                | 8秒
から、
|=======================================================================| 0秒
のような感じで、改行されずに表示されます。

最終的なコード

待ち時間を受け付けて、上記のコードを足した最終的なコードを見てみましょう。
汚くてすみません、、、
■Python2.6
#!/usr/bin/env python
#-*- coding:utf-8 -*-
#from __future__ import unicode_literals
import sys
import datetime
from time import sleep

def msgs(msg):
    print('*' * 80)
    print(msg)
    dt = datetime.datetime.now()
    print('{year}/{month:#02d}/{day:#02d} '
          '[{hour:#02d}:{minute:#02d}:{second:#02d}]'.format(
              year=dt.year, month=dt.month, day=dt.day, hour=dt.hour,
              minute=dt.minute, second=dt.second))
    print('*' * 80)
    print('\n')

msgs("\tタイマーを作動させます。\n\t時間を入力してください。\n")
print("秒単位で入力してください。\n何秒にセットしますか?\n")
times = int(raw_input("Please input number.\n>> "))
print('\n')
msgs('\t{0}秒にセットされました。\n\t現在時刻は↓ なので時間を見て戻ってきてください。\n'.format(times))

# 残り時間を1行に表示するコード
for i in range(1, times + 1):
    rate = i * 71 / times
    meter = "\r|{0}{1}| {2}秒".format("=" * rate, ' ' * (71 - rate), (times - i))
    sys.stdout.write(meter)
    sys.stdout.flush()
    sleep(1)
sys.stderr.write('\n')

print('\n')
msgs('\t{0}秒経ちました。時間ですよ!!\n'.format(times))

'''
Created on 2010-11-03
@author Iyori Komiyama
'''
下記のように表示されます。
********************************************************************************
    タイマーを作動させます。
        時間を入力してください。

2010/11/07 [23:27:25]
********************************************************************************


秒単位で入力してください。
何秒にセットしますか?

Please input number.
>> 8


********************************************************************************
    8秒にセットされました。
        現在時刻は↓ なので時間を見て戻ってきてください。

2010/11/07 [23:27:28]
********************************************************************************


|=======================================================================| 0秒


********************************************************************************
    8秒経ちました。時間ですよ!!

2010/11/07 [23:27:36]
********************************************************************************

参考・引用・謝辞

Note
■参考・引用:
・ mercurialのkeepalive.py
・ [Python-ml-jp 5061] Re: コンソールに重ね打ちする方法ご存知の方、教えて下さい。
■助けていただいた方たち
ありがとうございました!!感謝です!!

「Python Recipes」に戻る