2010年9月27日月曜日

AS3 継承でのオーバーライドの書き方

ファンクションをオーバーライドするには、
オーバーライドすぐ子クラス側にoverride指定子をつけてやる必要がある

------------
親クラス側
(オーバーライドされたいファンクションをpublicで書く)
------------
public class Parent
{
//略
public function getName():String{
//
}
//略
}


------------
子クラス側
(オーバーライドするファンクションのpublicの後にoverrideと書く)
------------
public class Child extends Parent
{
//略
public override function getName():String{
return "My Name!!"
}
//略
}


このように明示的にオーバーライドすることで、
書き手のファンクションの書き間違いが少なくなる、らしい。

2010年9月24日金曜日

説明会という名の檻

説明会という名の檻を作ってしまったことに反省。
事前のフォローが足りなかった。
  • 何故、その相手に向かって説明会を開いたのかを最初に語るべきだったのに、そのフェーズがなかった。
  • 説明会後に、相手がどうなるのか。相手に対する要求を明確化していなかった。
オブザーバーとして参加してくれたM2がすごくフォローしてくれて助かった。
本当にありがたい。

けど一度、リハーサルをしておくべきだったのも事実。
時間をケチったのが敗因。
反省。

2010年9月21日火曜日

MacでPDFのサイズを削減する

ずっとずっと、Acrobat Proffesionalが必要と信じてたのに。。。

MacでPDFのファイルサイズを軽くするには、Previewでいけることを知り、軽くショック。
手順は以下の通り。

  1. Previewで該当PDFを開く
  2. 別名で保存をクリック
  3. Quartzフィルタで「Reduce File Size」を選択
  4. そのまま保存する

2.0MBのファイルが一気に1.3MBになってしまった…!
さらにファイルサイズを下げたいなら、Quartzフィルタを編集すれば良い。
これはMacのColorSyncアプリケーションから操作可能。

  1. アプリケーション >> ユーティリティ >> ColorSyncを開く
  2. ウィンドウ上部に並んだボタンからフィルタをクリック
  3. Reduce File Sizeの右の方にある下向き三角ボタンをクリックし、「複製」を選択
  4. Reduce File Sizeのコピーが作成されるので、そちらの設定を適当にいじる

ここで作成されたQuartzフィルタはやはりPreviewから見ることが出来る。
これを使うと、さらに0.1MBファイルサイズが減った。


ただ、これでファイルサイズを削減した場合、図がちょっとおかしいことになったりするので、保存したPDFは要チェック。

2010年9月20日月曜日

Illustrator で ピクセル画像を作成

研究の関係でちょっと特殊な画像を作る必要が会った。

 * 画像中のある色をしたピクセルを、プログラムで指定した色で置き換える *

多分、もっと良いやり方はあるんだろうけど、とりあえず読み込んだbmp画像から、ピクセルの色を判定して、必要な部分だけ別の色に着色するっていうのがしたい。

そのための画像をIllusteratorで作っていた訳だが、思ったより手間取った。
というのも、以下のような問題が山積しているからだ。

・基本Illusteratorで扱う画像はミリメートル指定なので、ピクセル単位で見るとそこかしこがぼやける。
・アンチエイリアスがかかって余計にぼやける。

とりあえず、調べてみた結果、Illustratorではピクセル単位の画像を作るときは専用の環境設定を行う必要があるらしいことが分かった。
以下に必要事項をリストアップ。

  • ピクセル単位で画像を作成するように環境設定を変更
環境設定 >> 一般 >> キー入力 ->1px

環境設定 >> 一般 >> 単位 -> ピクセル


環境設定 >> 一般 >> スマートガイド >> 整列ガイド -> オフ


ドキュメント設定 >> アートボードの大きさ -> ピクセル単位
  • 表示も変更
表示 >> ピクセルプレビュー
  • 全てのオブジェクトを選択し、サイズ調整などを行うビューで、ピクセル整合にチェックを入れる

あとものすごく重要なのが、bmpで書き出す際に、アンチエイリアスをかけない。
これをしないと、ここまでの作業が確実に無意味。
実はこれに気づくのに時間がかかったというアホが私。。。

2010年9月19日日曜日

MacOS 10.6 で右クリックで新規ファイルを作成する

元々Windowsユーザなので、Macでは右クリックでファイルが作れないという仕様に未だに驚きを覚えてしまう。
なんでApple側はこれに対応しないんだろう。便利なのになー。

とりあえず、最初はNuFileを導入したが、動かず。
どうやらセキュリティの関係で、10.6以降はコンテキストメニューをカスタマイズする類のソフトウェアが使えなくなっているらしい。

代替手段としてAutomaterが使えるという情報をゲットしたが、いまいち使い方が分からず苦心した。
上手く行った方法をメモしておく。
あるパスに置いたテンプレートファイルを、今選択しているディレクトリにコピーするという仕様。

1. Automaterをクリックして立ち上げる。


2. 最初の選択画面で「サービス」を選択する。


3. 右のゾーンにワークフローを作っていく

  3-1. "サービス"が受け取る選択項目を「ファイルまたはフォルダ」にする

  3-2. 検索対象を「Finder.app」にする


  3-3. 左カラムの「ライブラリ >> ユーティリティ >> 変数の値を設定」を右ゾーンにドラッグ&ドロップ。

  変数名は適当に付けてしまう。「コピー先」とか。


  3-4. 左カラムの「ライブラリ >> ファイルとフォルダ >> 指定されたFinder項目を取得」を、右ゾーンにドラッグ&ドロップ

  ここがポイントで、テンプレートにしたいテキストファイルを予め作成して、適当なディレクトリに放り込んでおく。

  テキストファイルなら空でもいいけど、HTMLファイルにゃ自分のテンプレート作っておきたいしねー。

  この取得のワークフローの中の「追加」ボタンを押して、そのテンプレートファイルを選択。


3-5. 左カラムの「ライブラリ >> ファイルとフォルダ >> Finder項目をコピーを選択」を右ゾーンにドラッグ&ドロップ。

  「保存先」として、3-3で付けた変数名を入れる。

  おそらく右ゾーンの下に変数のリストが並んでいるので、
  そこからドラッグ&ドロップすればOK



4. ツールバーの「編集 >> 保存する」をクリックして、作成したワークフローを保存。
  ここで付けたサービス名がコンテキストメニューに出てくる!
  保存先は「/Users/自分のユーザ名/Library/Services」になってる。

  もし、ワークフローを書き換えたければここを開けば良い。


ちなみに出来るとこんな感じ↓↓


以上で終了。
すぐに反映されなければFinder.appを再起動すれば、多分反映されるはず。
ターミナルから、以下のコマンドを打てばFinderの再起動がかかる。
  $ killall Finder

作ったサービスを表示するか否かは、Finderの「Finder >> サービス >> サービス環境設定」から調整できる。
ここの左カラムのサービスを選択すると、右カラムのずっと下の方にファイルとフォルダの項目がある。
そこに作ったサービス名が表示されているはずなので、そいつをのチェックを外せば表示されなくなる!

2010年9月17日金曜日

LaTeX でキャプションの中に脚注をいれる

LaTeXで図や表のタイトルの中に脚注をいれたい場合、通常の ¥footnote{脚注中身...} は使えない。
¥footnotemark と ¥footnotetext{脚注中身...} の組み合わせを使えという情報はあったが、一応コンパイルは通るものの、

! Argument of \@caption has an extra }.

みたいな気持ち悪いWarningがでる。

だから正解はコレ。

¥begin{figure}[htbp]
  ¥centering
  ¥includegraphics[scale=0.8,keepaspectratio]{img/test.eps}
  ¥caption{図のタイトル ¥protect ¥footnotemark}
  ¥label{fig:test}
¥end{figure}
¥footnotetext{ 脚注中身... }

¥protectを¥footnotemarkの前に入れておくと警告が出ずに済む。
すっきりした。

2010年9月9日木曜日

Pythonの関数に辞書型の引数を用いる

いわゆるキーワード引数のこと。タプルを使う場合もあるが、今回は単純に

>>> a = getAge(1985, month = 8)

みたいな使い方について述べる。

関数側の定義は以下のようになる。


nowYear = 2010
nowMonth = 9

def getAge(year, **keys):
"""
年齢を返す
"""
if keys.has_key("month"):
month = keys['month']
else:
month = nowMonth

age = nowYear - year
if month - nowMonth > 0: # まだ生まれ月じゃない
age -= 1
return age



辞書がそのキーワードを持っているかはhas_keyメソッドで確認できる。
これで色々とパラメータを調整できるようになって楽だな。

2010年9月3日金曜日

PILを用いて画像の特定の色を別の色に変換する

Python Image Libraryを用いて色を変換。
これがやりたかった。

画像を開く
>>> img1 = Image.open("test.jpg")

RGB値のバンドを持つ画像オブジェクトに変換
>>> img1.convert("RGB")

画像のピクセルサイズを取得(タプル型)
>>> pixelSizeTuple = img1.size

新しい画像オブジェクトを用意する
ここではアルファ値を持つ、img1と同じサイズの画像を用意
>>> img2 = Image.new('RGBA', img1.size)

各ピクセルからgetpixelメソッドで色情報を取得し、特定の条件に基づいてputpixelメソッドで別の色を入れる。
ここでは、RGBの内、赤と青が220以上の値をとるピクセルを赤で塗り替える。
getpixel(ピクセル位置をタプルで指定)
putpixel(ピクセル位置をタプルで指定, RGBAをタプルで指定)
>>> for i in range(pixelSizeTuple[0]):
>>> for j in range(pixelSizeTuple[1]):
>>> r,g,b = img1.getpixel((i,j))
>>> if r > 220 and b > 220:
>>> img2.putpixel((i,j), (255,0,0,0)) # 真っ赤に!
>>> else:
>>> img2.putpixel((i,j), (r,g,b,0)) # 元の色

画像を保存
>>> img2.save("test_new.jpg")

ちなみに実行時間を計測した結果、100*100ピクセルの画像で
0.06908秒程度。わお。
別の画像では0.066095秒だった。
ちなみにMacBookProでメモリは2GB。
これだったらImageMagick出動しなくても大丈夫そう。

以下、ビフォーアフター。
元画像
生成画像


ちなみに、特定色がピンポイントである場合は、ImageMagickのconvertコマンドの方が早いかもしれない。

convert -fill '置換後の色' -opaque '置換対象の色' 変換前画像ファイル 変換後ファイル名
convert -fuzz 50% -fill '#00ff00' -opaque '#ff0000' icons.png i.png

参考:アグレッシブエンジニア: ImageMagickのconvertコマンドで特定の色を置換する
http://blog.tanarky.com/2009/08/imagemagickconvert_19.html

PILを用いたRGBのバンドの変更

Python Image Libraryで画像をRGBA(Aは透過を示すアルファ値のこと)に分解し、それぞれのバンド別に処理を行う。

画像を開く
>>> img1 = Image.open("../test.png")

RGBAをそれぞれ抽出する
>>> r,g,b,a = img1.split()

特定色のバンドを255諧調で変更 (例えば r2 = r.point(lambda i:255)とかでも良い)
>>> r2 = r.point(lambda i:i*0.1)

マージする
>>> img2 = Image.merge("RGBA", (r2,g,b,a))

保存する
>>> img2.save("../test_new2.png", 'PNG')

以下、ビフォーアフター。

元画像
生成画像

2010年9月2日木曜日

PILを用いた画像の重ね合わせ

Python Image Libraryを使って、少し画像処理をしてみた。
透過画像(png)を読み込んで、透過部分を維持したまま、重ね合わせる。

まずはimport
>>> import Image

画像を開く
>>> img1 = Image.open("../test.png")

重ね合わせる画像(透過png)を用意する。
※ここではimg1を180度回転させただけのもの。
>>> img2 = img1.rotate(180)

alpha値情報を用いた状態に変換しておく
>>> img3 = img2.convert("RGBA")

重ね合わせ。paste(Image型の重ねる画像, img1のどの位置に左上を合わせるか, マスク)
マスクはまだよく分かっていないけど、img3を同じく指定しておけば問題ない
>>> img1.paste(img3, (0,0), img3)

保存
>>> img1.save("../test_new.png", 'PNG')

以下、ビフォーアフター。

元画像


処理後