スポンサーサイト

.-- -- スポンサー広告 comment(-) trackback(-)
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Python備忘録

.15 2013 Python comment(0) trackback(0)
最近Pythonをいじる機会が増えた。とはいってもそんなに頻繁にPythonいじるわけではない。
そんなわけで「よく使うメソッド」とかその他細々した書き方とかすぐ忘れて毎回調べてるのでいい加減まとめようと思う。

header
	#!/usr/bin/env python
	# -*- coding: UTF-8 -*-
	
自分の用途ではこれに続いてsys、osあたりをimportすることが多い。


ファイル
たとえばテキストファイルのcpならこんな感じ
	f = open(fsrc, 'rb')
	f2 = open(fdest, 'wb')
	for line in f:
		f2.write(line)
	
モードでbを指定しないと環境によって\nだったり\r\nだったりしてトラブルのもと。
特に理由がない限り'b'を指定した方が無難かも。


関数
	def func(args):
		return ret
	


for文
	for i in range(5):
	
これでi = 0, 1, 2, 3, 4が実行される。 range(5) == [0, 1, 2, 3, 4] というリストを生成する関数。


文字列分割
	if string.split()[0] == "hoge":
	
普通は要素数とか確認してから使う。splitは区切り文字を指定することもできるが指定しない事のほうが多い気がする。
	"a, b,c d".split(", ") == ["a", "b,c d"]
	
区切り文字(列)は一種類しか指定できない模様。


切り出した文字列からゴミを消す
	string.strip()
	
消す文字を指定してもよいが、指定しないか1文字しか指定しない(","とか)ことが多い。


文字列比較
==でよい。実体が同じがどうかの判定はisとかいう比較演算子を使う


文字列 - 数値
int(string), str(number)


配列
	arr = [1] * 4
	arr[0] = 0
	arr = [0, 1, 1, 1]

	arr = [[]] * 4
	arr[0].append(1)
	arr == [[1], [1], [1], [1]]

	arr = []
	for i in range(4):
		arr.append([])
	arr[0].append(1)
	arr = [[1], [], [], []]
	
[] * nという書き方は[]の中身の値をコピペするので配列を指定した場合配列のポインタが複製される模様。
多次元配列定義のラクな書き方無いのかね?
参考までにlistよりarrayのほうが若干早いようなので整数だけのリストを使いたい時はarrayのほうがよいかもしれない。


スポンサーサイト

デバッグメッセージ

.01 2011 C言語 comment(0) trackback(0)
開発中のデバッグメッセージは最終的には消したいものですが、完成後バグが見つかった時などはデバッグメッセージを消したことを後悔する…なんてことがよくあります。
そんなときに便利な方法。

#include <stdarg.h>
void
dbg(const char *format, ...)
{
#ifdef DEBUG
	va_list args;
	fprintf(stdout, "[Debug] ");
	va_start(args, format);
	vfprintf(stdout, format, args);
	va_end(args);
#endif
}
この例ではifdefでやっていますが、起動時の引数を見てデバッグモードならデバッグメッセージを表示するとかいろいろ方法はあります。

C言語備忘録

.12 2011 C言語 comment(0) trackback(0)

  • 引数分解 → getopt
  • uint32_tなど → stdint.h
  • sys/stat.h使うならその前にsys/types.hをincludeするのが正しい
  • remove syscallは内部的に「dir → rmdir, file → unlink」を呼んでいる
  • dir関連のsyscall → opendir, readdir, closedir, mkdirなど

環境依存でもいいのでとにかく色付き文字を表示したい!
というときはとりあえずprintf中とかで\x1b[%dmを使う。%dには数字を入れる。
4なら下線、41なら赤、42なら緑などなど。複数指定するときは\x1b[4;41mみたいに指定する。

備忘録終わり。以下近況。

そろそろSystemCなんかはじめてみようかと思ったり。でSystemCはC++にライブラリとかつけたものなので結局C++を使いこなせないとダメ。
そんなわけで今更ながらC++を勉強してみたり。

SystemCってのはハードウェア記述をVHDLとかVerilogとかよりもう一段抽象化して考える言語。
ムーアの法則でチップ上のトランジスタの数が指数関数的に増えているのでVHDLですべてを書くのはそのうち限界になる…と予想されます。

コンピュータができて最初の頃はアセンブリで全部書いていて、結構最近でも「速度が必要な部分だけはアセンブリ」という感じだったのが今ではシステム関連でもほとんど全部Cです。
ある本によれば、かの天才クヌース氏も「Cで書くのは非効率だ。アセンブリで書くのが当然」と言っていたそうですが、今ではコンパイラの最適化技術の進歩、ハードウェアアーキテクチャの進歩などにより、効率的なコードがCから簡単に生成され、ハンドアセンブルした場合とほぼ同じ速度が出ます。

# もちろんこれはある程度大規模なシステムでの話であって、クヌースがこの発言をした当時と同じ規模のシステム、つまりマイコンとかで性能を出したい場合にはアセンブリで書くべきです。

VHDL, VerilogからSystemCへの移行はこれと同じくらい画期的なもので、現在ではまだVHDL, Verilogが「当たり前」ですが、そのうち「基本的にはSystemCで、必要ならVHDLで最適化」という時代が来ると思われます。
そんなわけで近い将来SystemCが必要な時代がくると考えています。まさか?と思うようなことが平気で起こるのがこの業界です。

さて、C++勉強しますか。あと院試ではC, JAVAのコードが出されることがあるらしいのでJAVAも勉強しないと。

TODO:
  • 分散並列関連(ハードウェア的にもソフトウェア的にも)の勉強
  • JAVA
  • C++
  • SystemC
  • 簡易OS自作
  • 遠征

# いつも忘れるVIMコマンド:ctrl + d/uで半画面スクロール。スクロール系は半画面程度が自分にはあってる気がする。あとz.でカーソル位置を画面中央とかも便利だけどいつも忘れるなー
# mouse=aにしてるせいでH, M, Lとかの基本的なカーソル移動コマンドも全然使わないからなかなかvim使いになれなくて残念。

ActionScript最初の一歩(3)

.06 2010 ActionScript comment(0) trackback(0)
無事情報数学の試験も終わって今日からしばらく開発に専念できそうです。

とかいいつつも今日はあんまりやる気が起きないんですね~

やる気がないときはActionScriptみたいに開発環境からデバッグ環境から何から何まで整備されているもので遊んで何かを作った気分になっているのが一番幸せなんだろうな~ というわけで今日はActionScriptで遊びます。

あ~ゆとり世代はこれだからw

今日の目標はキーボードの状態を取得すること。マウスは…必要になったらそのときに調べます。
キーボードに関してFlashが普通のWindowプログラミングと違うところは「キーボードの状態を取得する関数」が用意されていないことです。
Win32APIには確かGetAsyncKeyStateみたいな関数があって、それを呼び出せばその時点でのキーの状態を取得できました。
が、ActionScriptでは、キーが押されたときと離されたときにイベントハンドラが呼ばれるように設定して、キーの状態を格納する変数の値を書き換える必要があります。面倒ですね。
さらに面倒なのはFlashはフォーカスを失うとキーが離されてもイベントハンドラが呼ばれないため、フォーカスを失ったときにキーが離されたことにしないとずっと押しっぱなしになっているように見えてしまうことです。
そんなわけでキーボードの処理に必要なコードはこんな感じ。
/* 変数、定数 */
	private const KBD_NUM: int		= 1;
	private const KBD_RIGHT: int	= 0;
	private var keyState: Vector.<int>	= new Vector.<int>(KBD_NUM, true);
	
/* initに記述 */
	stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownProc);
	stage.addEventListener(KeyboardEvent.KEY_UP, keyUpProc);
	stage.addEventListener(Event.DEACTIVATE, deactiveProc);

/* Event Handler */
private function keyDownProc(event: KeyboardEvent): void
{
	if (event.keyCode == Keyboard.RIGHT) {	// right
		keyState[KBD_RIGHT] = 1;
	}
}

private function keyUpProc(event: KeyboardEvent): void
{
	if (event.keyCode == Keyboard.RIGHT) {	// right
		keyState[KBD_RIGHT] = 0;
	}
}

private function deactiveProc(event: Event): void
{
	// clear all key state
	for (var i: int = 0; i < KBD_NUM - 1; i++) {
		keyState[i] = 0;
	}
}

ArrayよりもVectorの方が高速ってことで今回はVectorを使ってみました。が、VectorはFlashのバージョンが10以上でないとサポートされていないとかで普通にコンパイルしようとしたら文句言われました。
なのでFlashDevelopの設定でオプションに
-target-player=10
ってのをつければctrl + F6でいけるはず…なのですが、
良く分からないけどエラーが消えなかったです。
なので諦めてコマンドプロンプトから
mxmlc -target-player=10 test_timer.as

さすがにこれなら文句はないようです。
というわけでキーボードがらみの使い方が分かりました。今日は以上。

土日はもう少しましなことをやります。

ActionScript最初の一歩(2)

.03 2010 ActionScript comment(0) trackback(0)
今回はタイマーです。
タイマー処理の方法はいくつかあるようですが、一般的なのはTimerイベントを使う方法。ただし、この方法はあまり良くないようです。理由は次の通り。
  • 実際に呼び出される間隔は (Timerで指定した時間) + (イベントハンドラで処理にかかった時間) になる。
  • 実際に描画される間隔(画面が更新されるタイミング)はフレームレートによって決まる。すなわちWindowsのInvalidateRect的なもので強制的に再描画させることはできない。
そうするとフレームレートにあわせて呼んでくれたらなーと思うわけです。
そんな時の強い味方ENTER_FRAMEイベント。
コンストラクタに
addEventListener(ENTER_FRAME, func);
と書くだけでフレーム毎にfuncを呼んでくれます。
フレームレートは先日紹介した方法で指定できます:
	[SWF(width="300", height="200", backgroundColor="0xFFCC00", frameRate="24")]
早速タイマー処理を使って簡単なフラッシュを作ってみました。
test_timer
それではスキー行ってきます。
 HOME 
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。