2009年09月17日 Thu.
秀丸がPythonに対応していた
OSをWindows 7に入れ替えたついでに、秀丸を新バージョン(Ver 8.00 Beta)に入れ替えたらPythonの色分けと強調表示に対応していた。
以前は設定をいじらないと複数行文字列とかまともに色分けされなかったよね。
2009年05月27日 Wed.
バズワードとWikipedia
先日とある方からこんなことを聞かれた。
「SaaSをご存知ですか?」
GoogleドキュメントみたいなWebアプリケーション?といったぐらいの認識しかなかったが、こう答えてみた。
「まぁ大体は…。」
この返答を聞いたその人は『こいつ知らないな』と思ったのか知らないが、こう続けてきた。
「Salesforceという企業を知ってますか?」
「いえ、知りません。」(…そこ関連の仕事の話だろうか?)
で、その人はこう続けてきた。
「SaaSとは、そのSalesforceという企業が提唱したサービスの形態で、うんたらかんたら…。」
「はぁ…。」
なにそれトリビア?そんなの知ってどうすんの?と思いつつも、中身のない説明がダラダラと続いた。
で、その日帰ってからググってみると、その説明が、Wikipediaに書いてることと同じだった。
ああ、こいつ、わかってないんだな、っつーことがよく分かった。
後日、また別の方からこういうことを言われた。
「ブログやSNSのようなサービスを作りたい。」
そんなノウハウどこにあるんだろうと思いながらも、こう聞き返してみた。
「具体的にいうとどういったものですか?」
「だから、ブログやSNSのようなものだ。」
「…ブログやSNSがどんなものかご存知ですか?」
「そんなことは知っている。」
でも、よくよく話を聞いてみると、その人は自分でブログを書いてるわけでも、ブログ巡回をやってるわけでもない。ましてや、mixiを使ったことがあるわけでもない。
思ったとおり、Wikipediaやらのネットで仕入れた程度の表面的な知識しかなかった。
「分かってる人から見ると、『ブログやSNS』だの連呼する人は、『こいつアホか』と思われかねないのでやめたほうがいいですよ。」
とは忠告してみたものの、どうしたもんだろうか。
Wikipediaなどで情報を仕入れること自体は全く悪くないんだけど、それだけで分かったつもりになるのはなんだかなあ。
しかし、往々にして、そういった方々が決定権を持つことがあるのでタチが悪い。
2009年03月13日 Fri.
楽な仕事ですね
とある案件における某代理店様とのやりとり。
- 旧バージョンにあった★★★という機能が消えている。どういうことだ?
- これこれこういう理由で、使い物にならない(使う人なんていないと思われる)ので外しています。っていうか、この機能は外すということは以前説明して了解もらってますよね?
- 前のバージョンにあって新しいバージョンにない(機能が減る)のは顧客に説明つかない。実装して頂きたい。
- …。
後日。
- ★★★を実行したら▲▲▲になった。これはバグだと思います。
- ★★★は、そもそも▲▲▲にするための機能なんですが…。
疲れる…。
こうやって、世間のソフトウェアの不要な機能ってのが量産されていくんですね。
2009年03月06日 Fri.
Windows 7 からIEが消せるようになるかもしれない?
- Windows 7ではIEが削除可能? - Build 7048でIE8がオプション扱いに | エンタープライズ | マイナビニュース
- Windows 7では、IE 8がオプションに - ITmedia ニュース
おそらく "iexplorer.exe" を削除するだけで、お茶を濁すのでしょう。
さすがに、IEコンポーネントまで削除すると .NET とかいろんなものが成り立たなくなります。
いくら「選択の自由」という主張があるとはいえ、ここまでやらせると偏執的過ぎるように思えたり…。
果たしてこれがエンドユーザの利益になるのか?
問題になりそうなこと
それはさておき、ついこないだ実際にあったやり取りです。
後輩が作った、(とあるWindowsアプリで)ボタンを押すとあるURLが開く機能をチェックしたときのこと。
※ 若干脚色はしてますw
私『(デフォルトブラウザはFirefoxなのに)なんでIEが開くの?馬鹿なの?死ぬの?』
後輩「やり方がわかりません。」
私『どうやってIEを開いてるの?』
後輩「ShellExecute() の第3引数に "iexplorer.exe" を指定して(ry」
私『その第3引数にURL書いてみろ!』
この例に違わず、デフォルトブラウザを無視してIEを開くふざけたアプリはたまに見ます。
問題にならなければいいですね。
2009年02月10日 Tue.
boost 1.38.0
boost 1.38.0がリリースされたそうな。
ついこないだ前のバージョンが出たばっかりのような気がするんですが(といっても半年前)、早いですね。
数日前にstringのメモリ使用量について書きましたが、Flyweightを使えば使用メモリの節約ができるみたいです。
なんとタイムリーな。
2009年02月09日 Mon.
Python 3.0を(まだ)使うべきではないたった一つの理由
↓
…!
……!
………!
…………!
……………!
|;:;:_:;:_:;:_:;:_;:;_:;:l:;_;:_:;:_:;:_:;:_;:_;|
|______|_____|
| 三| _ _ |三 !
| 三| 三シ ヾ三 |三 |
| 三′ .._ _,,.. i三 |
ト、ニ| <でiンヽ ;'i"ィでiン |三.| パイパイもなしにプログラミングとな!?
', iヽ! 、 ‐' / !、 ーシ |シ,イ
i,ヽリ ,' : !. |f ノ
ヾ! i ,、 ,..、ヽ lノ
| _ _ イ l
l ,ィチ‐-‐ヽ i /、
゙i、 ゝ、二フ′ ノ/'"\
| \ ー一 / / _,ン'゙\
,ィ|、 \ /_,、-'" _,.-''´ `丶、__
_, イ | ヽ_ 二=''" _,. -''´ """""´´ ``ー
補足?
パイパイ(PyPi)とは言わずと知れたPython Package Indexのことです。
easy_install(setuptools)やIPythonなんかがないと、でっかい困ります。
2009年02月07日 Sat.
VC++のstringの罠
Visual C++のSTLのstring/wstringは意外と(?)メモリ食いだったりします。
確認してみる
試しに次のようなコードを書いてみて、string/wstringクラスのサイズを求めてみます。
#include <string> #include <iostream> using namespace std; int main() { cout << "std::string -> " << sizeof(string) << endl; cout << "std::wstring -> " << sizeof(wstring) << endl; return 0; }
手元のVC++ 2005だと結果は下のようになりました。
(最新版のVC++ 2008ではどうなるかは知りません。でも変わったという話は聞かないから同じでしょう。)
std::string -> 28 std::wstring -> 28
ちなみに、Ubuntuのgcc 4.3.2で試した場合はこうなります。
std::string -> 4 std::wstring -> 4
gccはよく知らないのでこれ以上述べません。
何が問題か?
要するに「VC++でstringを使うと文字列の長さに関係なく最低28バイト使うよ」ということです。
たとえ長さ0の文字列であっても28バイト消費します。
データ保持のために、クラスや構造体のメンバとしてstringを使うケースはよくあります。所詮28バイトといっても、それがウン百万・ウン千万と積もれば山となります。
とある膨大なデータをロードするとメモリ消費量がとんでもないことになった、なぜだろう?と思って調べたらこれが原因だったことが過去にありました。
(そもそも設計が悪いんですが、それはさておきます)
大量データ保持を行う(可能性がある)場合はstringよりboost::scoped_array<char>などを使ったほうがまだマシでしょう。 *1
実装について
VC++のSTLのbasic_stringの実装を見ると固定長16バイト分のバッファを持ってるっぽいです。
15文字(wstringを使う場合は7文字)以下の文字列を扱う場合にはアクセスが早くなるというメリットがあるんでしょう。
あと、人から聞いた話ですが最近のVC++のstringでは参照カウント方式を使っていないそうな。
マルチスレッドが全盛の昨今では、参照カウント方式だとロックだのなんだのでオーバーヘッドが大きくなってしまうので、それを避けるために使ってないんだとか。
なので、同じ文字列を複数あちこちで持ってたとしても、メモリ的にはお得にはならないです。
2009年02月02日 Mon.
Python 2.6でpy2exe 0.6.9を使ったときの問題
(2012年03月追記 この記事の内容は古い上、誤った情報が含まれています!)
py2exeとは、Pythonスクリプトをexeにするツールです。
小物スクリプトを作ってPythonをインストールしていないマシンで動かす時に便利。
使い方はこちらのページにお任せするとして、これをPython 2.6で使用した場合にいくつか問題が出てきます。
作ったexeを他のマシンに持っていったとき、エラーを出して動かないことがある
このアプリケーションの構成が正しくないため、アプリケーションを開始できま(ry
というエラーが出る場合のこと。
原因はDLLが足りないから。Python2.6からWindows版オフシャルビルドはVisual Studio 2008になったので、それ用のDLLが必要になります。
Pythonや最近のソフトをインストーラから入れた場合にはこれらのDLLがマシンに入っていることがありますが、OSに最初からあるDLLではないのでどのマシンにもあるわけではありません。
ない場合は、Microsoftが配布している『Visual C++ 2008 SP1 再頒布可能パッケージ』というランタイムを入れたら動くようになります。
でも、Pythonをインストールするのが面倒なのでexeに変換したのに、わざわざ別のものインストールさせたら手間かわんねーじゃん?
と思うのですが、DLLを探してきて単純にフォルダにコピーするだけではダメっぽいです。
Python 2.5の時は、VC++2003だったのでDLLをコピーする方法が使えました。ところが、最近のVC++(2005から?)では方式が変わり、WinSxS形式のDLLを使うようになりこれまでの方法ではいかなくなったようです。
なにかいい手はないものでしょうか?
wxPythonを使っているスクリプトのexe化がうまくいかない
error: MSVCP90.dll: No such file or directory
こんなエラーが出ます。
この3つのDLLを"python.exe"のあるフォルダにコピペすればおkらしい。
- msvcm90.dll
- msvcp90.dll
- msvcr90.dll
DLLは、"C:\Windows\WinSxS" をファイルの検索を使って探す。"C:\Windows\System32"の下ではありません。
同じ名前のファイルが複数個出てくる場合がありますが、その場合はフォルダの名前(バージョン)で判断して一番新しいものを選べばいいんじゃないでしょうか。(多分)
なお、3つのDLLは同じフォルダから持ってくるように。
2009年01月28日 Wed.
PythonでGoogle AJAX Language APIを使って文字列の翻訳を行う
いろいろ便利なので作ってみた。
Python2.5以下だとsimplejsonが必要なので、easy_installなどで入れてください。
#!/usr/bin/env python # -*- coding: utf8 -*- import urllib try: import json except ImportError: import simplejson as json def translation(text, f="en", t="ja"): """Translate input string by `Google AJAX Language API`_. .. _Google AJAX Language API: http://code.google.com/apis/ajaxlanguage/documentation/reference.html >>> translation(u"Hello.") u'\\u3053\\u3093\\u306b\\u3061\\u306f\\u3002' >>> translation(u"\\u3053\\u3093\\u306b\\u3061\\u306f\\u3002", f="ja", t="en") u'Hello.' >>> translation(u"Hello.", "foo", "bar") Traceback (most recent call last): ... IOError: invalid translation language pair >>> """ # unicode -> string (utf8) # urlencode does not allow unicode. if isinstance(text, unicode): text = text.encode("utf8") # Access to Translation API data = { "q": text, "v": "1.0", "hl": "ja", "langpair": "%s|%s" % (f, t), } f = urllib.urlopen("http://ajax.googleapis.com/ajax/services/language/translate", urllib.urlencode(data)) # Result ret = json.loads(f.read()) if ret["responseStatus"] != 200: raise IOError(ret.get("responseDetails", "")) return ret["responseData"]["translatedText"] def main(): try: while True: text = raw_input() if text: print "-->", translation(text) except KeyboardInterrupt: pass if __name__ == "__main__": #import doctest #doctest.testmod() main()


