Hatena::ブログ(Diary)

bonlife このページをアンテナに追加 RSSフィード

言及ISBN/ASIN
  • Ringo EXPO 08 [DVD]
  • 三文ゴシップ
  • my way
  • ビジネスパーソンのための話し方入門 (日経文庫)
  • ザ・グーグルウェイ グーグルを成功へ導いた型破りな戦略
  • 考え・書き・話す3つの魔法
  • 自分の答えのつくりかた―INDEPENDENT MIND

2015-11-30

Pythonで指定したディレクトリ配下のディレクトリ名とファイル名を取得する(改定案)

http://statsbeginner.hatenablog.com/entry/2015/11/26/134250

import os

def gen_filelists(path, abspath=False, sysfile=False):
    # 指定ディレクトリの配下にあるディレクトリやファイルをたどる
    for dirpath, dirnames, files in os.walk(path):
        # sysfile=False の場合、システムディレクトリ(.ではじまるもの)を対象外にする
        for dir in dirnames:
            if sysfile==False:
                if dir.startswith('.'):
                    dirnames.remove(dir)                
        for file in files:
            # sysfile=False の場合、システムファイル(.ではじまるもの)を無視
            if sysfile==False:
                if file.startswith('.'):
                    pass
                else:
                   # フルパスを出力するかどうかで処理を分岐
                    if abspath==True:
                        yield os.path.abspath(file)
                    else:
                        yield file
            # 下記パートが重複している点、カッコ悪いので改善が必要…
            else:
                if abspath==True:
                    yield os.path.abspath(file)
                else:
                    yield file

if __name__ == "__main__":
    print("abspath:False / sysfile:False")
    print([ file for file in gen_filelists('.', abspath=False, sysfile=False) ])
    # sysfile=True にした場合、Windowsでは os.path.abspath() が . で始まるフォルダを上手く扱えない?
    print("abspath:False / sysfile:True")
    print([ file for file in gen_filelists('.', abspath=False, sysfile=True ) ])
    print("abspath:True  / sysfile:False")
    print([ file for file in gen_filelists('.', abspath=True,  sysfile=False) ])
    print("abspath:True  / sysfile:True")
    print([ file for file in gen_filelists('.', abspath=True,  sysfile=True ) ])

2009-03-18 中山寺がかなり混んでました。

Windows XPにJIS2004互換フォント入れた後、削除できなくて苦労した時のメモ

bonlifeです。妻の実家のPCを整理していたところ、OSがあるCドライブ(10GB)の空き容量が200MB程度とかなり厳しい状況になっていました。My Documentsやインターネット一時ファイルを別ドライブに移動したりしても、1GBちょっとしか空かない。使わなそうなプログラムファイルを次々と削除しても空き容量はほとんど増えず。これじゃデフラグも厳しいぜ、という悲劇的な状況です。

大事な(?)ファイルを削除

DriveAnalyzerで調べてみると、Windowsフォルダが5GBくらいになってる!仕方がないのでService Packを当てた時のバックアップをまるっと削除することに。

ここを参考にしながら、ファイルを削除。色々と当ててきた細かいパッチもどうせ戻すことないし、ということでWindowsフォルダの下の $ で始まるフォルダエイヤっ!と削除しちゃいました。なんとか2GBくらいの空き容量が出来てホッと一息。

JIS2004互換フォントが気持ち悪いけど、削除できない罠

動作には問題ないかな、と思いながら操作をしていると、なんだかものすごく気持ち悪い。よく見るとタイトルバーの英数字が全角になってるのです。「あ!」と思い出したのがJIS2004互換フォント。前、自分PCにもこれ入れて気持ち悪くなったんだよな。その時は「プログラムの追加と削除」からアンインストールしたっけ。ということで、アンインストールしようとして残念な事実に気づきました。Windowsフォルダの下にあった $ で始まるフォルダアンインストール用の情報が入ってたんです。ダメ元で「プログラムの追加と削除」からアンインストールを試みるも、予想通りエラーに…。

力技でフォントを戻す!のに失敗

もう力技でやってやる!ということで、調査開始。どうやら、 msgoth04.ttc と msmin04.ttc ってフォントをなんとかして msgothic.ttc と msmincho.ttc に戻せば良さそう。さらに調べるとWindowsフォルダの下にあるi386フォルダに msgothic.tt_ と msmincho.tt_ があって、これを expand してあげると msgothic.ttc と msmincho.ttc が出てくるらしい。(参考にした答えてねっとの投稿) 見えたぜ!と喜び勇んで msgothic.ttc と msmincho.ttc を用意してFontsフォルダドラッグ…してもエラー。すでにその名前のフォントはあるので、ゴメンナサイ的なことを言われてガッカリ。

困った時はセーフモード (XPの場合、F8長押し)

困った時はセーフモードで起動。セーフモードならなんとかなるんじゃないの。ということでチャレンジ。コマンドプロンプトで C:\Windows\Fonts で dir ms* とかしてみてビックリ!なんと、すでにそこには msgothic.ttc と msmincho.ttc があったのです。これはひょっとして msgoth04.ttc と msmin04.ttc を削除すれば自動的に元のフォントが有効になるかな、と思って del しようとすると、エラー。msgoth04.ttc にはアクセスできません。そりゃそうよね。UIで使ってるもの。(確か msmin04.ttc は削除できた気がします。メモを取ってなかったのでアヤシイですが。)

レジストリをゴニョゴニョ

ここで思いついたのがレジストリ。regeditですよ。おそらく、どこかに msgoth04.ttc ってのがあって、それを msgothic.ttc に変えれば万事解決するはず。msgoth04.ttc で検索してみると、それっぽいのが出てくる!その値を msgothic.ttc に書き換え。その後、念のために再起動。恐る恐るブラウザを開いて、タイトルバーを見てみると無事に元通りになってました!!ってことはどこからも参照されなくなった msgoth04.ttc も手動で削除できるかな、と思ってコマンドプロンプトで試してみると普通に DEL できました。ホッ。これで(おそらく)元通り。

教訓

今回の教訓ですが、意味も分からず勢いでファイルを削除しまくるのはアウト。迷ったら安全な方に倒さないとダメですね。今回はなんとかなりましたが、この調子だといつか取り返しのつかないミスをしそうな予感。プライベートだからって手を抜きすぎてはいけませんね(>_<)

2009-01-31 明日は義妹の結婚式です。

Pythonでctypesやらwin32apiを使ってドライブの空き容量を調べるサンプル

bonlifeです。久しぶりにPythonに触れてみました。

コピーするフォルダーの容量は、os.walkを使って取得できました が、ドライブの空き容量の求め方がわかりません。仕方がないので、dirコマンドの出力を正規表現で切り出してみました。日本語の正規表現がわからないので、dos窓を英語モードにしてからdirコマンドを発行しています。

ドライブの残り容量を調べるpythonスクリプト ? lights on zope

なんだかあんまりスマートじゃないやり方…。こういうことは、Windowsに直接語りかければ答えが返ってくるはず!ということで調べてみると、GetDiskFreeSpaceExというものがありました。以下のような関数らしい。lpDirectoryName を指定して実行するとアレコレ情報が取得できるみたい。

BOOL GetDiskFreeSpaceEx(
  LPCTSTR lpDirectoryName,                 // ディレクトリ名
  PULARGE_INTEGER lpFreeBytesAvailable,    // 呼び出し側が利用できるバイト数
  PULARGE_INTEGER lpTotalNumberOfBytes,    // ディスク全体のバイト数
  PULARGE_INTEGER lpTotalNumberOfFreeBytes // ディスク全体の空きバイト数
);

ctypesを使ってみる

こういうのはctypes使うと良いってどこかで見かけたことがあったので、ctypesとGetDiskFreeSpaceExを元にGoogle先生にお伺いをたてたところ、まさにッ!なページを発見。

http://www.python-forum.org/pythonforum/viewtopic.php?f=18&t=9461#p43424

このままだとドライブを指定できなかったり、戻り値が ctypes.c_ulonglong で扱いづらかったりするので、少しだけ修正してみました。(失敗した場合の処理は省略。)

>>> from ctypes import *
>>> def free_disk_space(drive=None):
	free_bytes_available       = c_ulonglong()
	total_number_of_bytes      = c_ulonglong()
	total_number_of_free_bytes = c_ulonglong()
	a = windll.kernel32.GetDiskFreeSpaceExA(
		drive,
		byref(free_bytes_available),
		byref(total_number_of_bytes),
		byref(total_number_of_free_bytes)
	)
	return free_bytes_available.value, total_number_of_bytes.value, total_number_of_free_bytes.value

>>> free_disk_space('C:')
(397914681344L, 483934597120L, 397914681344L)
>>> free_disk_space()
(397914681344L, 483934597120L, 397914681344L)
>>> for i in free_disk_space('C:'):
	print i / (1024 ** 3), "GB"

370 GB
450 GB
370 GB

win32apiを使ってみる

ただ、pywin32をインストールしてwin32apiを使うと遥かに簡単に同じことが出来ちゃいます。

>>> import win32api
>>> win32api.GetDiskFreeSpaceEx('C:')
(397914681344L, 483934597120L, 397914681344L)
>>> for i in win32api.GetDiskFreeSpaceEx():
	print i / (1024 ** 3), "GB"

	
370 GB
450 GB
370 GB

楽過ぎる。pywin32は今日インストールしてはじめて使ってみましたが、IDLEでの補完も利くし、色々と遊べそうですね。

まとめ

スクレイピング的な処理をせずに情報を取得できないか調べてみたことで、bonlifeの視界が広がりましたとさ。Windowsの操作で何か困った時、今回の経験が活きますように。

2008-12-14 焼きたてのパンは美味しい。

WebSphere sMashの研修を受けて、刺激を受けた

bonlifeです。金曜日、先輩社員のお誘いでIBMに行ってWebSphere sMashのハンズオン研修を受けてきました。sMashってのはWeb2.0でマッシュアップなアレです。Enterpriseマッシュアップ基盤とかなんとか。

社内のデータが比較的加工しやすい状態(SOA)で提供されている場合、間にsMashを挟むことで情報共有を加速させることが出来るっぽい。

D

特徴は以下の通り。

  • Java SEで動く (シンプルでコンパクト)
  • 開発にはGroovy、PHPを使う
  • Webベースの開発ツール"App Builder"がなかなか使える (Yahoo! Pipesっぽい)
  • RESTful

Herokuが出た時にもビックリしましたが、ブラウザベースの開発って案外実用的なレベルになってるのかもしれませんね。Groovyはなかなかクールで柔軟な言語っぽいです。興味持った方はITアーキテクトの記事を読んで、試してみてください。結構面白いかも!

ただ、現実には連携させたいEnterpriseなデータはOracleやDB2に独自のルールでゴロゴロと詰め込まれているので、「CoC(設定より規約 or 設定の上に規約)」の考え方がそのまま適用できず、使いやすいAPIにするためにどこかで泥臭いことをしなきゃいけなくなるんですよね。 (適当な固定長のデータを生成するPGを作って、HULFTでデータ連携させる、とか。) ここを支援する仕組みが出来てくるとSOAももっと浸透すると思うんだけどなぁ…。

この研修内容自体は事前に予習した内容と同レベルだったので、特に発見もなかったんですけど、講師(id:nobusueさん)が印象的でした。Groovyに惚れ込み、仕事以外の時間で翻訳活動に参加してしまうというエネルギー!就業後と土日だけで洋書の翻訳ですよ。スゴイ。刺激を受けましたよ。なんか頑張らなきゃ!と思いました。仕事でGroovyを使う予定なんてありませんが、この本買ってみようかな。

2008-10-28 何が正しいのかが分からなくなってきました。

timeitで計測

bonlifeです。PowerPointでの資料作りに嫌気がさしたので、久しぶりにPythonに触れてみました。

宿題として、華麗にTimerを使いこなせるようになる事が追加されました。

Pythonでスクレイピングに最適なライブラリはlxmlな気がした。時間的な意味で - a2c.get.diary

ちょっと違うかもしれないけど、こういうことかしら。(って普通過ぎるTimerの使い方ですね…。華麗ではない。)

In [1]: from time import sleep

In [2]: from timeit import Timer

In [3]: def hoge():
   ...:     sleep(0.01)
   ...:
   ...:

In [4]: def fuga():
   ...:     sleep(0.02)
   ...:
   ...:

In [5]: def piyo():
   ...:     sleep(0.03)
   ...:
   ...:

In [6]: t1 = Timer(setup='from __main__ import hoge', stmt='hoge()')

In [7]: t2 = Timer(setup='from __main__ import fuga', stmt='fuga()')

In [8]: t3 = Timer(setup='from __main__ import piyo', stmt='piyo()')

In [9]: for i in (t1, t2, t3):
  ....:     i.timeit(100) / 100
  ....:
  ....:
Out[9]: 0.010735489802108589
Out[9]: 0.020498639798942123
Out[9]: 0.030266023705639498

t1, t2, t3を生成する部分を関数にしたりすれば!とか思いましたが、馬鹿馬鹿しいのでやめましたとさ。