スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

canvasのglobalCompositeOperationの計算式らしきもの

(5/13追記あり)

canvas(HTML5)のglobalCompositeOperationがどういう計算をしているか気になったので調べた。

以下は、webkitのソースをGoogleコードサーチで検索した結果。

globalCompositeOperationはCanvasRenderingContext2D#setGlobalCompositeOperationで実装されていると思われる。ここからGraphicsContext#setCompositeOperationが呼ばれているが、GraphicsContextは各プラットフォーム毎に実装されるものらしく#if PLATFORM(xxx)が沢山並ぶなんとも面倒そうな感じ。とりあえずAndroidで使われているskiaというライブラリを使う実装を見るとglobalCompositeOperationの値とskiaの合成モードの変換表とskiaの合成モードでの変換式をコメント中に発見

きれいに整形したり、転載するのはめんどうなので、知りたい方は上記リンクを確認してください。

続きを読む

ActionScript1.0のif文の展開

知っている人には有名な話(自分用メモ)。

ActionScript1.0(Flash Lite 1.1)でif文を書くとき、&&や||をつかうと、非常にいけてないバイトコードに展開される。
例えば A && Bとした場合、「Aが真じゃないとBは評価さえされない」というのを実現したかったんだと思うんだが、もう少しなんとかして欲しい…

ActionScriptバイトコード
if(A) {
ST
}
	push	A
not
if goto X
ST
X: end
if(A && B) {
ST
}
	push	A
push A
not
if goto X
pop
push B
X: not
if goto Y
ST
Y: end
if(A && B && C) {
ST
}
	push	A
push A
not
if goto X
pop
push B
X: push A
push A
not
if goto Y
pop
push B
not
Y: if goto Z
pop
push C
not
if goto W
ST
W: end
if(A||B) {
ST
}
	push	A
push A
if goto X
pop
push B
X: not
if goto Y
ST
Y: end
if(A || B || C) {
ST
}
	push	A
push A
if goto X
pop
push B
X: push A
push A
if goto Y
pop
push B
Y: if goto Z:
pop
push C
Z: not
if goto W:
ST
W: end


ちなみに、上記では条件式を簡単にAと書いているが、もしvar1==var2みたいな文だったら、Aの「すべて」の場所に
	push	"var1"
getVariable
push "var2"
getVariable
equals
なんてコードが展開されてしまう。

Railsで、1対多のmodelを、Ajaxを使ったフォームで保存する方法

1対多の親子関係のモデルをWebから入力する際に、1つのフォーム(nested object formsと呼ぶらしい)で済ませたい場面がある。例えば請求書の入力画面みたいなやつ。
そういう場合はaccepts_nested_attributes_forとfields_forを使えばできるよ~、というサンプルはWeb上にたくさん見つかる。

しかし、ほとんどは子の入力欄の数が固定のものばかり(追加したい分だけ事前にコントローラーで子のモデルをbuildしておく必要がある)で、JavaScriptつかって入力欄を増減させたりするサンプルはなかなか見つからない。あるにはあるけど、トリッキーなコードだったり冗長だったりする。FormBuilderの取り回しやaccepts_nested_attributes_forの受け付けるパラメータの形式などを考慮すると、シンプルに書くのはけっこう難しい。

で、ようやく見つけたのがこれ。
http://railscasts.com/episodes/197-nested-model-form-part-1
http://railscasts.com/episodes/197-nested-model-form-part-2
ただし、Rails 3 の場合、ApplicationHelper#link_to_add_fieldsの最後のlink_to_functionの第2引数のhはとる必要がある(3 からデフォルトでescapeされるので2重にかかってしまう)。

[Android]ImageViewの表示サイズの決まり方(リライト)

# http://fchiba.blog114.fc2.com/blog-entry-35.html をもう少しわかりやすく書きなおした。
# レイアウト計算の詳細を知らなくても読めるようになったはず。


ImageViewの表示サイズは、以下の要素によって決まります。

1. layout_width / layout_heightのパラメータ
2. Drawableの画像サイズ(IntrinsicWidth/Height)
3. minWidth / minHeight
4. maxWidth / maxHeight
5. BackgroundDrawable の画像サイズ(IntrinsicWidth/Height)
6. adjustViewBounds
7. padding
8. matrix
9. scaleType
10. cropToPadding

このうち、1.~7.によってImageViewの大きさが決まります。
8.~10.は、ImageViewの大きさが所与のものとして、その中でDrawableがどのように描画されるかを決めるパラメータです。

以下では話を簡単にするために、
・親ViewGroupがLinearLayoutで、orientaion=vertical, layout_width=fill_parent, layout_height=fill_parent
・ImageViewは、layout_width/layout_height に wrap_content か fill_parent のどちらかを指定(ピクセル指定しない)、padding=0
を仮定しています。


■View自体の大きさの決まり方

A. adjustViewBounds = true かつ layout_width/layout_height のどちらかにwrap_content が指定されている場合、
 A-1) width/heightをDrawableのIntrinsicWidth/Heightで仮ぎめ
 A-2) layout_width/layout_heightに、fill_parentが指定されていれば、親Viewの値で上書き
 A-3) layout_width/layout_heightに、wrap_contentが指定されていれば、親Viewより小さくなるようにする
    (ここで決めた値以上になることはない)
 A-4) layout_width が wrap_content の場合、layout_heightを固定のまま、Drawableのアスペクト比とおなじになるように layout_width を変更。
    (変更の結果 layout_width が元の値より大きくなってしまう場合はそのまま)
 A-5) A-4) で調整ができず layout_height が wrap_content の場合、
    layout_widthを固定のまま、Drawableのアスペクト比とおなじになるように layout_height を変更。
    (変更の結果 layout_height が元の値より大きくなってしまう場合はそのまま)

 注: A. の場合、minWidth / minHeight と BackgroundDrawableのIntrinsicWidth/Height は考慮されません。

B. A.以外の場合、
 B-1) fill_parent が指定されていれば、その値
 B-2) fill_parent が指定されていない場合、Drawableのwidth/heightを下記の順で調整する
    (i) minWidth / minHeight 以上
    (ii) BackgroundDrawableのIntrinsicWidth/Height 以上
    (iii) maxWidth / maxHeight 以下


■描画のされ方
scaleTypeの値によってDrawableが表示される位置と拡大率が決まります。

・fitXY
 ImageViewの大きさにぴったりあうように表示
・matrix
 setImageMatrixで指定したMatrixをそのまま使う
・center
 Drawableを中央に配置する。拡大率は1(オリジナル画像のまま)
・center_crop
 Drawableを、アスペクト比を維持しつつ隙間がなくなるように拡大・縮小して中央に配置するように描画
・center_inside
 Drawableを、アスペクト比を維持しつつ全てが収まるように拡大・縮小して中央に配置するように描画
・fitStart, fitEnd, fitCenter
 Matrix.ScaleToFit(http://developer.android.com/intl/ja/reference/android/graphics/Matrix.ScaleToFit.html)におまかせ

Drawableの描画がImageViewの大きさからはみ出す場合、cropToPaddingの値により、paddingの処理が変わります。
具体的には、CropToPaddingがfalse(デフォルト)の場合は、はみ出した箇所にはpaddingが表示されません(paddingの領域にもDrawableが描画される)が、
trueだと常にpaddingが表示されます。

[Android]TextViewにリンクを設定して他のActivityを設定する方法

TextViewに表示されているテキストからURL、@user、#hashなどの文字列を抽出してリンクにし、他のActivityを起動したい。(いわゆるTwitterクライアント)

この辺を参考に(特に2つ目)した。
http://developer.android.com/intl/ja/resources/articles/wikinotes-linkify.html
http://developer.android.com/intl/ja/resources/articles/wikinotes-intents.html
http://developer.android.com/intl/ja/guide/topics/intents/intents-filters.html

1. リンク作成
まず、Linkifyクラスで、該当の文字列を抜き出してリンクにする。
httpで始まる単純なURLは、そのままの文字列で暗黙のIntentを発行。
@userや#hashなどは、Linkify.TransformFilterを使って、content://で始まるURIに変換する。
URIのサーバー名に当たる部分(Authorityという)は、パッケージ名などを元にユニークな名前にする。
 例:net.fchiba.sampleapp など。
パスに当たる部分は、アプリごとに適当に設計する(RESTな感じで)。
 例: /user/(id) とか。

2. ContentResolverの作成
URIからMIMEタイプを求めるクラスを作成する。ContentResolverを継承したクラスを作成し、getTypeをオーバーロードする。サンプルを参考にして、getTypeのみ実装。
MIMEタイプは、image/jpegなど決められているもの以外の場合、vndで始まりユニークになるように決める。
 例: @id なら vnd.net.fchiba.sampleapp.twitter/user、
    #hash なら vnd.net.fchiba.sampleapp.twitter/search とか
作ったクラスをAndroidManifest.xmlに登録。
 <provider android:name="(クラス名)" android:authorities="net.fchiba.sampleapps" />

3. 処理を受け取るActivityを作成
1.で発行されるのは暗黙のintentなので、intent-filterで受け取る必要がある。
発行されるActionは android.intent.action.VIEW。2.で決めたMIMEタイプで受け取るActivityを振り分ける。
ユーザーを処理する Activityなら、
 <intent-filter>
  <action android:name="android.intent.action.VIEW" />
  <category android:name="android.intent.category.DEFAULT" />
  <data android:mimeType="vnd.net.fchiba.sampleapp.twitter/user" />
 </intent-filter>
など。


TODO
・ユーザー名やハッシュタグを抜き出す正規表現を洗練させる。
・リンククリック時にメニューなどを表示させる方法を調べる。シングルクリックでデフォルトアクション、ロングクリックでメニュー選択がいいよね。android.intent.category.ALTERNATIVEなどが怪しげ。
プロフィール

fchiba

Author:fchiba
FC2ブログへようこそ!

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QRコード
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。