CapsLockなんて死んでしまえばいいのに
Windows7は、Vistaと違って結構ちゃんと動くので嫌いではないのですが、Windows系OSは使いはじめに一番いろいろやらなければならず、もっとも重要なのは、やはりCtrlキーとCapsLockキーの入れ替えです。
なんだかんだいっておきながら、いつも人に頼って申し訳ないのですが、ここによい情報がありました。
Microsoft TechNetのCtrl2Caps V2.0というソフトをこのページからダウンロードして、コマンドプロンプトを管理者権限で立ち上げ、インストールします。

再起動後、よしよしうまくいったと思っていましたが、どうやら私の環境では、CapsLockとCtrlが入れ替わるのではなく、CapsLockキーがCtrlキーに変化しました。もとのCtrlキーもそのまま使えるので、つまりCapsLockキーがなくなってしまったことになります。まあ日ごろから、この記事のタイトルのように、CapsLockキーなんて死んでしまえばいいと思っていたので、むしろ歓迎です。タイプライター時代のなごりらしいですが、いつまで引きずるつもりなんですかねー。
【2010/01/30 17:12】 | PC設定 | トラックバック(0) | コメント(0) | page top↑
generator関数を使う
たとえば、4桁の0と1の並びを考えます。0000とか0101とか1111などですが、全部で2の4乗で16通りあります。これらすべての組合せについて、羅列してくれるコードをPythonで書きたいと思ったときは、generator関数が便利です。

# python2.6 or higher
def bernoulli_str(upto):
 startat = 0
 endto = 2 ** upto - 1
 while startat <= endto:
  yield format(startat,'b').zfill(upto)
  startat += 1

if __name__ == '__main__':
 for v in bernoulli_str(4):
  print(v)

出力
0000
0001
0010
0011
0100
0101
0110
0111
1000
1001
1010
1011
1100
1101
1110
1111

桁数を増やすとあっという間に組合せ爆発を起こすので、yieldを使ったgeneratorを使うことで、メモリに入り切らなくなってしまう事態を回避できます。桁数がそろった方が見栄えがいいので、zfillで0詰めしています。
やっぱり、Pythonはとっても便利で使いやすいと実感しますが、GoogleがGoを出したり、iPhoneのおかげでObjective-Cの人気があがったりと、プログラミング言語界も相変わらず活況です。お正月先輩からきた年賀状には、「とりあえず今年はScalaから」と書いてありましたが、浮気はせずしばらくPythonがいいかなーと思うところです。

テーマ:プログラミング - ジャンル:コンピュータ

【2010/01/17 20:53】 | Python | トラックバック(0) | コメント(0) | page top↑
Gmailは添付ファイルの中身も検索している?
少なくとも、半角英数字で構成されるtxtファイルの中身は検索しくれているようです。
お、すごいなーと思って日本語が入ったPDFを試してみましたが、どうやら見てくれていない模様。MS-Wordの文章とかも最近は「Googleドキュメントとして開く」ことができるので、ついでだから中身も検索対象にしてくれると便利かもしれません。
と、ここまで書いて、もしかしたらBase64エンコードされた文字列をそのまま検索しているだけなのでは?と思い、適当な日本語を書いたtxtファイルを添付して、Base64エンコードした文字列で検索してみましたが、だめだったので、仮説は否定されました。残念。というか、もしこの仮説が正しいと、半角英数字もBase64では違う文字列になるはずだから、最初の事実があり得なくなってしまいます。なんか背理法みたいな感じに・・・。というわけで、そもそも仮説がおかしいことに気がつきました。アホでした。
何ごとも、実行する前に少し考えてみるって重要かもしれません。

テーマ:Webサービス - ジャンル:コンピュータ

【2010/01/13 19:18】 | Webサービス | トラックバック(0) | コメント(0) | page top↑
MacOSXのインテルコンパイラでOpenMP
折角たくさんコアがあるけど、並列プログラミングは面倒だという方に指示されているのかどうか解りませんが、OpenMPを使ったときのメモを。

#ifdef _OPENMP
#pragma omp parallel
#endif
 for( int i = 0; i < permu_cnt; ++i){
...
などとすると、マルチコア化されるという魔法のような話です。
スレッド数は環境変数OMP_NUM_THREADSで設定できます。GNU g++は4.2からOpenMPに正式対応したということですが、手元にIntel C++ Compiler11.0があったので、これでコンパイルしました。
言われたとおり、
-openmp
ってつけたらコンパイルは出来たのに、実行すると、
dyld: Library not loaded: libiomp5.dylib
Referenced from: /Users/***呼び出し元のバイナリ***
Reason: image not found
Trace/BPT trap
というエラーが・・・
/opt/intel/Compiler/11.0/056/lib
に、libiomp5.dylibがあったので、LD_LIBRARY_PATHに追加すればいいのか?と思ってやってみるも失敗。
あり?と少し悩みましたが、iccのコンパイルオプションに、
-static-intel
を追加すればOKです。
なんか、とりあえずマルチスレッドで動いてます。8コアMacProなので、5コアくらい使って5倍になったらいいかなというところです。


【2009/11/25 20:12】 | C++ | トラックバック(0) | コメント(0) | page top↑
PyCXXの簡単な例
MacOSX10.5のPython2.6で動かせる簡単なPyCXXの例を、貼り付けておきます。

test.cxx

#ifdef _MSC_VER
// disable warning C4786: symbol greater than 255 character,
// nessesary to ignore as <map> causes lots of warning
#pragma warning(disable: 4786)
#endif

#include "CXX/Objects.hxx"
#include "CXX/Extensions.hxx"

class test_module : public Py::ExtensionModule<test_module>{
public:
test_module():Py::ExtensionModule<test_module>( "test" ){
add_varargs_method("func", &test_module::func2, "test function2");
initialize( "this is the test module" );
}

virtual ~test_module()
{}

private:

Py::Object func2 (const Py::Tuple &args){
Py::List res = args[0];
res.append(Py::Float(args[1]));
std::cout << res[-1] << std::endl;
return res;
}

};

extern "C" void inittest()
{
#if defined(PY_WIN32_DELAYLOAD_PYTHON_DLL)
Py::InitialisePythonIndirectPy::Interface();
#endif

static test_module* test = new test_module;
}

// symbol required for the debug version
extern "C" void inittest_d()
{ inittest(); }


mac_py26.mak

#
# Build the example on Mac OS X for version 2.6
#
CC=gcc -arch i386
CCC=g++ -arch i386
CCCFLAGS=-c -g -fPIC -I/Library/Frameworks/Python.framework/Versions/2.6/include/python2.6 -I.
LDSHARED=$(CCC) -bundle -g -u _PyMac_Error -F/Library/Frameworks -framework System \
/Library/Frameworks/Python.framework/Versions/2.6/Python
LDLIBS=
PYTHON=/Library/Frameworks/Python.framework/Versions/2.6/Resources/Python.app/Contents/MacOS/Python

COMMON_OBJECTS=cxxsupport.o cxx_extensions.o cxxextensions.o IndirectPythonInterface.o
MY_OBJECTS=test.o

all: test.so

#
# my object
#
test.so: $(MY_OBJECTS) $(COMMON_OBJECTS)
$(LDSHARED) -o $@ $(MY_OBJECTS) $(COMMON_OBJECTS) $(LDLIBS)

test.o: test.cxx
$(CCC) $(CCCFLAGS) -o $@ $<

#
# common objects
#
cxxsupport.o: Src/cxxsupport.cxx
$(CCC) $(CCCFLAGS) -o $@ $<

cxx_extensions.o: Src/cxx_extensions.cxx
$(CCC) $(CCCFLAGS) -o $@ $<

cxxextensions.o: Src/cxxextensions.c
$(CC) -c $(CCCFLAGS) -o $@ $<

IndirectPythonInterface.o: Src/IndirectPythonInterface.cxx
$(CCC) $(CCCFLAGS) -o $@ $<

#
# Clean rule
#
clean:
rm -f *.o
rm -f test.so

どちらも、サンプルファイルをちょっと変更してわかりやすくしただけですが、これだけで結構Py::Listの動きなどよくわかると思います。

~/pycxx-6.1.1$ make -f mac_py26.mak

で、test.soができていることを確認して、インタラクティブシェルを起動します。

~/pycxx-6.1.1$ python
Python 2.6.3 (r263:75184, Oct  2 2009, 07:56:03)
[GCC 4.0.1 (Apple Inc. build 5493)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>> import test
>>> l = test.func(range(3),10)
10.0
>>> l
[0, 1, 2, 10.0]
>>> type(l)
<type 'list'>
>>>

という具合に使えます。
C++でコードを書くとき、ラッパーオブジェクトをどのあたりまで使ったらいいのかとか、本格的なプログラミングには、すこし考えが必要ですかね。

テーマ:プログラミング - ジャンル:コンピュータ

【2009/10/27 17:58】 | Python | トラックバック(0) | コメント(0) | page top↑
| ホーム | 次ページ