Home

Katapad Design

TextFieldから文字列が溢れたときに「…」ってするやつのasを少し高速化

  • 2009-01-06 (火)
  • ̃Gg[͂ĂȃubN}[Nɒlj

TextFieldから文字列がはみ出した時の処理 – blog.nium.jpを読んでいて、高速化できそうだと思ったのでほんの少しいじくりました。

ソースだけ必要な人もいると思うのでいきなりソース!適当なクラスのstaticにでも置いてください。

public static function trimmingText(textField:TextField, endText:String = "...", defaultFontSize:Number = 12):void
{
	textField.wordWrap = false;
	if (textField.maxScrollH <= 0)
		return;
	textField.appendText(endText);
	var text:String = textField.text;

	//ループの回数を減らす
	if (textField.maxScrollH > defaultFontSize * 1.5);
		textField.text = text.slice(0, text.length - endText.length - 1 - Math.ceil(textField.maxScrollH / defaultFontSize)) + endText;
	while (textField.maxScrollH > 0)
	{
		text = textField.text;
		textField.text = text.slice(0, text.length - endText.length - 1) + endText;
	}
}
//こうやって使う
var unko_txt:TextField = addChild(new TextField()) as TextField;
unko_txt.width = 100;
unko_txt.autoSize = TextFieldAutoSize.LEFT;
unko_txt.text = "君、ウンコくさいね。すごく臭うからしたよね?ね?ね?君が好き。"
Hogehoge.trimmingText(unko_txt);

本家でのソースの流れ

本題に入る前に、本家ではどういう処理をしてるかを少し説明します。

  1. 水平スクロールがあれば
  2. テキストフィールドの最後に”…”をつける
  3. 水平スクロールがなくなるまで↓をループする
  4. 1文字ずつ削除していく

以下高速化をした点

テキストをトリミングする方法を配列じゃなくて、Stringをいじくる方法に変えた

配列はnewして、中身を入れるときがずいぶん重いらしいので、普通のStringをいじくる方法にしてみた。5~10%高速化。

//配列を作ってspliceして、joinするという、配列生成+操作が重そうだったので
//var words:Array = textField.text.split( "" );
//words.splice( words.length - 4, 1);
//textField.text = words.join( "" );
 textField.text = text.slice(0, text.length - endText.length - 1) + endText;

whileループの回数を減らすために、if分をひとつ挟んで、がっつり削除する

1文字ずつ削除するのがもったいない気がするので、ある程度がっつり削除する方向にしてみた。文字数にもよるけれど、80%高速化

 if (textField.maxScrollH > defaultFontSize * 1.5);
 	textField.text = text.slice(0, text.length - endText.length - 1 - Math.ceil(textField.maxScrollH / defaultFontSize)) + endText;

whileループ前に一枚かませます。あふれた文字数をフォントサイズから割り出してがっつり削除します。半角文字などが大量にあると一発では消えませんが、それでもかなりの量の文字を一気に消せます。

図にするとこんな感じです。

(textField.getTextFormat().sizeからフォントサイズを取得できますが、ここでいちいち取得してると重くなるので引数にしています)

結果 45ms → 5ms

計測方法は

  • 以下の文章が入ったTextFieldを5つ用意してまわしました。
    □□□□■□□□□1□□□□■□□□□2□□□□■□□□□3□□□□■□□□□4□□□□■□□□□5□□□□■□□□□6□□□□■□□□□7□□□□■□□□□8□□□□■□□□□9□□□□■□□□□10
  • TextFieldのwidthは200にしました。

for文で10万回まわしたとかじゃないですよ。日常的に使う場面っぽくしてみました。

ちっさいところとは言えど、ループ回数が多いのと、描画に関わるところなので若干の高速化ができました。

デザイナー上がりのFlasher1年生が読んだ19冊の本を、これほどかというほどに感想を書きます。だいたい3行だけど。

  • 2008-12-31 (水)
  • ̃Gg[͂ĂȃubN}[Nɒlj

Flasherになって1年が経ちました。この1年いろいろと勉強さしてもらいました。

大掃除で本の片付けついでに、今年買ったFlash技術周辺本のレビューでもしましょう。

途中までしか読んでない本が大半ですが、まったく読まなかった本もあります。
ここでは最低でも50ページは読んだ本19冊を選抜しました。Flash本9冊、それ以外10冊です。

ずらずらと並べた19冊の感想を読むのはつらいと思うので、1冊だけ「ムツゴロウさんの動物王国のナレーション」のモノマネをしながら書いています。

2008-01月~03月に読んだ本

01.ActionScript 3.0 アニメーション

★★★★★。オススメ。3か月で全ページ読破しようと思ってた。

結局、最後の100ページは流し読みをしたけれど、初心者にはかなりいい内容。とりあえず大量のモノを動かして、ある程度の高速化を意識して…という基本がわかればええと思う。

02.UMLモデリングレッスン-21の基本パターンでわかる要求モデルの作り方

★★★☆☆。例がFlashと無縁なので忍耐が必要。

UMLでも勉強しようと思って買った。この手の本に共通して言えるのが、例がよくわからんのだ。会員が何かを購買した情報を分類したり、従業員の種類を気にしたり、顧客の種類を気にしたり、といった「Flashではない向こう側のプログラミング」の例だらけだ。このような例に耐えられる、もしくはそんなん気にせず本質を読み取れるならいい本じゃないかと思う。UML、つまりオブジェクト指向の表現の幅が広がるはず。

03.リファクタリング―プログラムの体質改善テクニック

★★★★★。オススメ。ビューティフルなコードを書くための本。

第3章まで読めとamazonに書いてあったけど、そこまで読めたら全部読める。コードの不吉な匂いがわかればよし。優秀な人のソースも読めるようになる。
ただ、このままFlashに適応させると大変な目にあうので注意!律儀に書くとコードの実行が遅くなるので、この辺のバランス感覚は経験が必要になってくる。

04.モーション・タイポグラフィ

★★★☆☆。古い。中古で買ったら間の4ページくらいが破られてた。

モーション・タイポグラフィの歴史とか見方とかその辺を意識できるようになった気がする。とりあえず、映画のオープニングはしっかり見ようと思った。

05.ActionScript3.0 ビジュアル・リファレンス

辞書は1冊あればいいだろう。Flashのヘルプで事足りるので不要かもしれない。1か月に1度開くと知らん機能を発見できたりする。

06.Advanced ActionScript 3 with Design Patterns

★☆☆☆☆。Flashでのデザインパターンはどのようにして行われるのか、そういった疑問を持ち、英語の本に手をだした。

しかし、単に他言語の教育用デザインパターンをActionScriptで書きました的内容なのがとても気になってしまった。AbstractGameのサブクラスにFootBallGameやで。どこで使うねん。Flashのために書かれたとは思えない内容で残念。

2008-04~06月に読んだ本

07.Webデザインの「プロだから考えること」

★★★☆☆。一流の人たちの作り方がほんの少しわかる

個人的には電通の中村洋基氏とimaginativeの水藤祐之氏・深澤 洋介氏の話が印象に残ってる。みんなクオリティを高めるために死に物狂いなんやなー。そらぁ、僕みたいな底辺が太刀打ちできるはずもない。そういうことを実感できただけでもありがたや。

08.FLASH OOP (AS2のやつ)

★★★★☆。オススメ。のちにAS3版がでるけど、こっちのがいい。

なにがいいかというと、Flash以外のことが書いてある。すなわち、Flash以外の本を読め!と書いてあるのと同義だ(と思う)。これを見てプログラミングの世界の広さを垣間見れたし、興味の対象も広がった。

09.Learning Actionscript 3.0

★★★☆☆。のちに和訳が出たのでこいつ(原著)は買う必要がない。和訳はこっち初めてのActionScript 3.0 Flashユーザーのためのステップアップガイド

内容は実にわかりやすい。わかりやすすぎる。コードもわかりやすいし、サンプルも興味をそそるものが多い。あと、AS3でつまづきやすいところと基礎的なところに絞られていて、無理なく読めた。デザイナ上がりで大重さんの本を読んだら次はこれか。

10.Production Studio マスター After Effects

★★★☆☆。高い。高いけど、サンプル素材がすごいらしい。

内容は初心者向け。エフェクトの一覧があるので、やさしい。Flashばかりに頼ってたら死ぬ状況もあるので、AfterEffectsは絶対覚えとかないといけないし、表現の幅も広がる。

11.Flashデザインラボ -プロに学ぶ、一生枯れない永久不滅テクニック

★★★☆☆。初心者向けだけど、むらけん氏とTeamLabがずば抜けてる。

むらけん氏とTeamLabの2つはつくりがきれいだし、解説も豊富。Flashの実践的な作り方をきちんと書いてある本はほとんどないので、それだけで買う価値はある。

12.FLASH OOP for ActionScript 3.0

★★★☆☆。OOPとは少し違う。

AS版と比べて、OOPに比重が置かれていない。初心者には難しいだろうし、上級者ならすぐわかるだろうし…といった中途半端感が目立つ。もうすこしページがあってもいいのではないか。値段も高いんだから。

2008-07~09月に読んだ本

13.Adobe Flash CS3 詳細! ActionScript3.0入門ノート2

★★☆☆☆。入門ノート1の続編。

入門ノート1がかなりわかりやすかったので買ってみた。内容はそれほど高度なことや必要性のあることでもない(FLVのキャプションはそんなに必要ないだろう)。こちらは立ち読みをして購買の検討をすればいいと思う。

14.ゲーム開発のための数学・物理学入門

★★★☆☆。最近はAS3の数学・物理学本も出たみたいなので、そっち読めばいいのではないか。僕も今買った。

この本は説明をかなりはしょるけれど、公式は暗記すればいいのでそんなのでもいいかもしれない。高校数学どまりでも読めるけど、わけわからないぜ!これを乗り切らないと野たれ死ぬだけなので頑張ろう。

15.実例で学ぶゲームAIプログラミング

★★★★☆。ゲームの世界に衝撃を受けた。

ゲーム業界のノウハウはすごい。こんな膨大な知識が埋まっているとは。

内容は単純なステートパターンから探索行動まで、きっちり書かれてる。もうここまでくるとデザイナ上がりのFlasherは太刀打ちできないレベル。しかし、ここを理解できないとそのうち野たれ死ぬだろう。ノード探索とかはしっかり覚えたいところ。

16.増補改訂版Java言語で学ぶデザインパターン入門

★★★★★。オススメ。日本人のデザパタ本。読みやすくわかりやすい。

デザパタ本はずーっとGoF本と周辺本を読んでたけど、ぜんぜんわからん。ごめん言い過ぎた、なんとなくはわかる。でも「えっ?デザインパターン?ああ、となりのクラスの?」という顔見知りレベルを脱却できない。つまりなんにも使えないのだ。

しかし、この本は相当わかりやすい。わかりやすすぎて、Decoratorパターンはそんなに使う必要がないこともなんとなくわかる。抽象化して思考することを嫌というほど叩き込んでくれるので、パターンやOOPの本質を理解できるし、どのように応用すべきかもなんとなくわかる。デザパタ本ってそういうところが重要なんだわ。

2008-10~12月に読んだ本

17.達人プログラマー―システム開発の職人から名匠への道

★★★★★。オススメ。達人がなんたるかをなんとなく理解できる。

Web業界の歴史は浅いので、なかなか達人や師匠に巡り合えない。また、Flashなんて大抵1人で開発が終了するから、技を盗むことも至難だ。Web業界における「達人から盗む」という作業は、「他の業界の達人」から盗んだ方が効率がいい。この本は徹底した達人の姿勢を教えてくれる。個人的には「割れ窓理論」がマジウケるんだけど~!

18.ゲームプログラマになる前に覚えておきたい技術

★★★★★★★★★★。超オススメ。通称セガ本。セガの偉い人が新人教育用に書いた本。

これはすごい。どうしてこういう作りの戦略をとるか、最適化を行うかなどなどありったけのノウハウを詰め込んでる。まったくノウハウがない新人に教える感覚なので、Flasherみたいな独学大王たちはこの本からものすごくたくさんのことを学べるはずだ。まじで(僕のamazonリンクから)買えばいいと思う。

19.詳説 ActionScript 3.0

★★★★☆。せめて半年前に読みたかった。もうFlash10が来てるんだぜ!

広大なアメリカ大陸から西へ西へと遥々やってきたコリンムックさんの本。さあ、ここにはいったいどんな動物がムツゴロウさんを待ち構えているんでしょうか?

ムツゴロウ「いや~かわいいですね~、これを見てください。表紙をみてください。アメリカサンゴヘビですね~。アメリカサンゴヘビは毒を持っていて、この毒が獲物の体に回るまで噛みついたまま離さないんですね~」

まとめると…「Flasher1年生は2学期からFlashの本を読むな」

みなさんお気づきの通り、ムツゴロウさんのナレーションは間違いなく不要でしたね。高枝切りバサミに付いてくる普通のハサミと同じくらい不要ですね。

それはさておき、これらを一言でまとめると

「Flasher1年生は2学期からFlashの本を読むな」

ということです。いまのところFlash本でかっちりとした構築ノウハウを提供してくれる本はあまり見かけません。それならいっそのこと他の分野からノウハウを移植したほうが効率的です。

最初の4~6ヵ月でASの基礎を固めておいて、あとはデザインパターンや数学など、他分野から吸収したほうがよさげです。

特にゲームはFlashと近いところにいます。uiがあって、ローディングがあって、動的に画面が遷移して…と、かなり似ています。衝突判定やAI、画像処理など山のようにノウハウが蓄積されています。僕は今後がっつりこっちの本を読もうと思っています。

それと、あと1冊で20冊というキリのいい数字なのにどうして19冊なのか?そう思いますよね。いや、読んでるんです。50ページ以上ね。読んでるんです。なんだったら2周読んでます。でもね、その1冊が通学路で拾ったエロ本だったんです。

よいお年を~!!

まさか!「小林章の欧文タイプ・セミナー 2008」に小林章が出てた!という感想を書くよ!

  • 2008-11-07 (金)
  • ̃Gg[͂ĂȃubN}[Nɒlj

2008-10-25に「小林章の欧文タイプ・セミナー 2008」に行ってきました。

欧文書体」「欧文書体2」の著者であり、ヒラギノの欧文やAXISフォントの欧文の作者である小林章氏のセミナーが大阪でありました。

畑違いではありますが、非常に有意義なセミナーでした。

以下、印象深かったところをメモ代わりに残しておきます。

文字の「M」は横幅が広く、「E」「S」は狭い。これが古典的なローマ字。

  • 古典的ということはそれだけで格調ある雰囲気を出せる
  • Trajan」がローマの碑文を元に作ってある。ローマの碑文が源流みたいな感じ。
  • そのあとに「Garamondがそれを受け継いだ感じ
  • Times New Roman」や「Century OldStyle」までくるとインダストリアルな感覚がする

ローマ碑文が源流の書体たちの変遷

タイプデザイナーは単語デザイナーである

  • よみやすく、雰囲気のある文章・単語にするために調整を行っている

白と黒のバランスを意識することが上達の近道

黒い部分で形を視認するのだが、逆に白の部分で認識させることも重要。橘流の寄席文字はほぼ真っ黒。白い部分で形が見えてくる。

欧文フォントのバランスはカーニングだけじゃなくって、「O」や「n」の真ん中の空き具合(懐?)による

  • 和文書体だと正方形なのでギッチギチにカーニングしたりするけれど、そういうことはしない

これから残るフォントは「Meta」と「The Sans」

以下の2つ。「欧文書体2」にも載っけてる。

Meta
http://www.myfonts.com/fonts/fontfont/ff-meta/
The Sans
http://www.fonts.com/findfonts/detail.htm?pid=413684

和欧混殖の場合は欧文フォントを使う

  • 和文にも従属欧文が入っているが、欧文には欧文フォントを使ったほうがきれい
    • 従属欧文は「x軸」「y座標」など記号として用いるのが望ましい。

サイン(標識)なんかは字間が広いくらいがちょうどいい

  • 飛行場や駅の案内なんかは、どの角度からも読みやすくするために字間をとるようにする
  • 長体かけて、ギチギチにカーニングなんかはもってのほか

和文フォントと欧文フォントの違いは、字間

  • 和文は正方形なので、それと釣り合うように字間をあけている
  • 欧文はプロポーショナルなので、和文よりかは詰まる

これだけはやめて!

  • ピリオドのあとの全角スペース
  • 「fi」「fl」などは合字を使おう
  • リバー(リザード)にならないように気をつける
    • 単語と単語の間が河のようにつながらないように。

ですから奥さん、FlashDevelopにちょっとうれしいプラグイン3つなんです

  • 2008-07-27 (日)
  • ̃Gg[͂ĂȃubN}[Nɒlj

2008-09-14追記 すみません!「trace文をショートカットキーで書いてくれる便利なヤツ」のurl間違えてました!

PCの操作で不便に感じることがあれば真っ先に思うのが、「誰かが作ってくれてるやろ」ですね。だからwindowsはやめられない。そんなことで、FlashDevelop回りで調べたら見つかったプラグイン3つです。

以下、すべてFlashDevelop3.0.0 beta7での設定です。

1. as3・as2でASDocを吐き出してくれるやつ

5分もかけずにas3のASDocを吐き出すらしい

厳密にはプラグインではありませんが、コマンドラインを勝手に叩いてくれます。

http://www.flashdevelop.org/community/viewtopic.php?t=918

  1. FlashDevelopを起動。
  2. 「tools」→「Custom Arguments」でkeyとvalue を設定します
    • name → "ASDoc",
    • value → flexのpath\bin\asdoc.exe,
  3. ツールバーに「ASDocを作成」するボタンを追加します。ソースは上記リンク先で。

FlashCS3用のプロジェクトだと、結構失敗します。コンポーネントとかはうまいこと指定しないとできないかもしれません。

2分くらいでas2でのASDoc(as2api)

デフォルトで入っていました。しかもGUIで。

  1. 「tools」→「Flash Tolls」→「AS2API GUI」
  2. 必要項目を入力
    • pagetitleはhtmlのタイトルとか
    • packageはASDoc化したいパッケージ。「com.katapad.*」みたいに書く。
    • Outputとclasspathはそのまんまなので適当に入力
  3. 「Generato Documentation」ボタンを押してできあがり!…って文字化けしてるじゃねーか!
    • 文字コードがiso-8859-1で書き出されるので文字化けします。ちょこっといじくる必要ありです。

      1. 「tools」→「Application Files」でエクスプローラが開くので「Tools/as2api」 を開く
      2. as2apigui.bat をテキストエディタで開きます。iso-8859-1と書かれてるとこをutf-8に変更して保存
      3. as2apigui.batを実行すると、ようやく文字化けが直ります。

文字化けがうざいですが、それでもかなりの時間短縮になりますね。

2. trace文をショートカットキーで書いてくれる便利なヤツ

andrewlucking.com � fdtracer
FlashDevelop Trace Plugin
http://www.andrewlucking.com/archives/category/fdtracer/
http://www.double-quotes.com/flashdevelop/trace-plugin/
  1. ダウンロードしたら「tools」→「Application Files」→pluginディレクトリにぶち込む
  2. FlashDevelop再起動

変数とかを選択して「ctrl + 0」もしくは「ctrl + shift + 0」でtraceがきれいな形で!スニペットのtracethisと組み合わせたら、かなりの量のtraceを自分で書かずにすみます。

2-1 trace文をのぞき見するplugin

間違えて上のtraceのプラグインとこに書いてたurlのプラグインです。

こいつはブラウザで見たswfのtrace文を拾ったりしてくれます。要debug playerです。

andrewlucking.com � fdtracer
http://www.andrewlucking.com/archives/category/fdtracer/
  1. ダウンロードしたらpluginディレクトリにぶち込みます
  2. F10押して設定を開きます。
  3. FDTracerの項目でflashplayerのlogファイルへのパスを設定({user}と書いてあるところをpcのユーザ名に)します
    • mm.cfgというテキストファイルを新規作成して、Cドライブ直下に置きます。中身は以下

      TraceOutputFileEnable=1
      ErrorReportingEnable=1
      TraceOutputFileName=C:Documents and Settingsユーザ名Application DataMacromediaFlash PlayerLogsflashlog.txt
  4. debugplayerを使ってその辺のサイトを見る。FlashDevelopのFDTracerパネルにたくさんtraceされてるはずです。マァ、いやらしい。

3. addEventListenerのrollOverHandlerとかをrollOutHandlerに勝手に書き換えてくれたりする、今回紹介する最強のplugin

以下にムービー付きで紹介されてます。今日は徹夜なのにブログを書く気にさせてくれるほど、ものすごい便利です。

FlashDevelop Duplicate Plugin
http://jde.name/duplicate/
mc.addEventListener(MouseEvent.ROLL_OVER, rollOverHandler);

と書いた文を複製すると

mc.addEventListener(MouseEvent.ROLL_OUT, rollOutHandler);

Eventのtypeとハンドラまで「out」に書き換えて複製してくれます。まだ続けて複製するとclick、doubleClickまで書いてくれます。ヤッベー。ヤッベヤッベ。

mc.addEventListener(MouseEvent.CLICK, clickHandler);
mc.addEventListener(MouseEvent.DOUBLE_CLICK, doubleclickHandler);

他にもtrue→falseを切り替えたり、連番を自動で振ったりとかなり便利です。ありがとう、神様。

us-katapadという名のhtml・cssフレームワーク?を公開した愛されゆる巻き系の俺

  • 2008-06-06 (金)
  • ̃Gg[͂ĂȃubN}[Nɒlj

「とりあえず」とか「それなりに」とか「そのうち」クオリティのus-katapadフレームワークを公開しました

ながらくタンスのこやしにしてたので、とりあえずsvnに突っ込みました。

http://us-katapad.googlecode.com/svn/trunk/

どうやったらtag打ったりリリースしたりするのかわからんかったので、とりあえずtrunkを公開しておきます。tortoiseSVNかそこらでダウンロードしてみてください。TortoiseSVNのインストールと設定

中身

  • html
  • dwt
  • cssセット
    • リセットはまだ現役で使えるかな?全称セレクタ使ってるけど。safariとIEでline-heightより小さいimgを使うときは個別対処ですが、それ以外はピッタリしてくれるはず。
  • js

ドキュメント類はそのうち…

同梱してある_guideline/index.htmlあたりにちらっと書いてありますが、まだ準備してません。

以前、pukiwiki形式で20ページくらいしたためておいたのですが、googleのwikiの使い方がよくわからんのでしばらく放置状態になります。

ドキュメントがあったらかなりおもしろいと思うんやけどねー。とりあえずdwtはそれなりにいじっているので、それなりに使えると思います。bodyclassとかpagetitleとか。

AS2で遅くなる書き方を研究しようか

  • 2008-05-28 (水)
  • ̃Gg[͂ĂȃubN}[Nɒlj

上条さんとこで、AS2でOOPをやると遅くなる可能性があると書いてあって泣いた。

AS3 で動的言語のススメ

AS2 における型の使用は、オーサリング時の ”生産性向上のベストプラクティス” としての位置づけ以上ではないわけです。実際 OOP をまじめに追求するほど AS2 のアプリケーションは遅くなる傾向を持っています。

気になったので、単純なカウントアップでベンチマークをとった。

試したところは以下

  • タイムラインに書くかクラスに書くか
  • 型宣言の有無
  • 処理をfunctionにくるむかどうか

AS2でタイムラインに書く。型宣言はなし

//型宣言なし
var startTime = getTimer();
var trialNum = 100000;
var cnt = 0;

for (var i:Number = 0; i < trialNum; i++) {
	cnt++;
}
benchmark();

function benchmark()
{
	var endTime = getTimer();
	trace("time: " + (endTime - startTime));
}
//だいたい228

AS2でタイムラインに書く。型宣言あり・カウントアップは生で書く

//型宣言あり
var startTime:Number = getTimer();
var trialNum:Number = 100000;
var cnt:Number = 0;

for (var i:Number = 0; i < trialNum; i++) {
	cnt++
}

benchmark();

function benchmark()
{
	var endTime:Number = getTimer();
	trace("time: " + (endTime - startTime));
}

//だいたい230

AS2でタイムラインに書く。型宣言あり・カウントアップはfunctionにくるむ

リファクタリングの本やOOPの本を読んでいると、できるだけ細かいfunctionに分けるべきだ、と書いてある。確かにそのほうがやりやすいが、やればやるほど遅くなる気はしていた。

//型宣言あり,function
var startTime:Number = getTimer();
var trialNum:Number = 100000;
var cnt:Number = 0;

for (var i:Number = 0; i < trialNum; i++) {
	countUp();
}

benchmark();

function countUp():Void
{
	cnt++;
}

function benchmark():Void
{
	var endTime:Number = getTimer();
	trace("time: " + (endTime - startTime));
}

//だいたい709

クラスに書く

クラスに書いてみた。やってる中身は上とほとんど一緒。試したのは以下。

  • 型あり
  • 型あり・function
  • 型あり・別クラスstatic function
  • 型あり・別クラスを参照static function
    「型あり・別クラスstatic function」は

    for (var i:Number = 0; i < trialNum; i++) {
    	cnt = sandbox.BenchTest.countUp(cnt);
    }

「型あり・別クラスstatic function」は

var test:BenchTest = BenchTest;
for (var i:Number = 0; i < trialNum; i++) {
	cnt = test.countUp(cnt);
}

AS2速度まとめ

型なし 型あり 型あり・function 型あり・別クラスstatic function 型あり・別クラスを参照static function
タイムライン 228 230 708 455
クラス 102 101 245 313 227

ループ処理だけでの単純な比較なので、あまりあてにならない。

実際のところどっちが速いのかよくわからん、という結果になった。とりあえず、タイムラインでのfunctionがやたら遅いということがわかった。アクティベーションオブジェクトのせいだろうか。

でも、OOPにのっとってめちゃくちゃ細かく分割すると、遅くなることは事実だろう。わりと、お茶濁しな結果に!

AS3とAS2での差はクラスのメンバにあるかどうかでかなり変わる

AS3では

var point:Point = new Point(x,y)
point.x++;

と書くとめちゃくちゃ早い。メンバ変数であるかどうかがかなりの違いの模様。

これを単なるオブジェクトとして扱うとめちゃんこ遅くなる。ハッシュがどうのこうのらしい。配列はそこそこ早い。
PointとArrayで速度比較

var obj:Object = new Object();
obj.x = 1;
obj.x++;

AS2ではどれをやってもほとんど同じ速度だった。

さっさとAS3に全部移りたいぜ!

//var point:Point = new Point(1, 1);
//var obj:Object = new Object();
//obj.x = 1;
var array:Array = [1];
for (var i:Number = 0; i < trialNum; i++) {
	//point.x++;
	//obj.x++;
	array[0]++;
}
AS2でメンバとかの速度
point.x++; obj.x++; array[0]++;
94 93 106

いつか使いたかったコードハイライト表示プラグインはpukiwikiプラグインと相性が悪かったので、またいつかにしよう

  • 2008-05-27 (火)
  • ̃Gg[͂ĂȃubN}[Nɒlj

コードのハイライト表示をしてくれるプラグインを突っ込んだら、pukiwikiプラグインと相性がよくありませんでした。

pukiwikiプラグインとハイライトプラグインは適用箇所をくくることが必要になります。

しかし、以下のような混ぜ混ぜするやりかたは[as]の部分がこのまま出力されるだけでNGでした。
[pukiwiki]
pukiwiki記法
[as]
 public function get unko(food:Food):Feed {
    return _unko;
}
[/as]
[/pukiwiki]
こっちなら動くけど…
[pukiwiki]
pukiwiki記法
[/pukiwiki]
[as]
 public function get unko(food:Food):Feed {
    return _unko;
}
[/as]

これはめんどくさい。pukiwikiやりもって、asに切り替えて…というループ処理は人間には向いてません。

さらに悪いことに、[/pukiwiki]と[as]の区切りの間に空の<p>が紛れるという事態に。もういいや。やーめた!

コードハイライトプラグインの文書は以下がよくまとまっている上にAS3まで対応してはりました。

iG:Syntax HiliterでActionScript 3.0をハイライト

いまさらDelegate.createを理解しようと思ったけれど、謎が深まった愛され系の俺

  • 2008-05-25 (日)
  • ̃Gg[͂ĂȃubN}[Nɒlj

長らくAS2でお世話になっているおまじない、Delegate.create。ただなんとなしに使うのではなく、そろそろ理解しようと思い調べてみました。

理解するためには2つ必要でした。

  1. argumentsオブジェクトの理解
  2. Functionクラスの理解

argumentsオブジェクトの理解

argumentsオブジェクトは引数オブジェクトのことです。アクセスするには配列演算子を用いますが、単なる配列とは異なるようです。

argumentsオブジェクトにはcallerとcalleeプロパティが存在します。

arguments.caller

現在実行中の関数を呼び出した関数への参照となります。関数オブジェクトはdynamicクラスなので、あとからいくらでもプロパティを追加できるので、実際に参照しているのかテストしてみましょう。

function firstStep(){
	secondStep();
}
firstStep._x = 1;

function secondStep(){
	trace(arguments.caller._x);
	arguments.caller._x++;
}
firstStep();   //1が出力される
firstStep();   //2が出力される
firstStep();   //3が出力される

arguments.callee

現在実行中の関数への参照となります。

Functionクラスの理解

Function.apply()

Function.apply(scope:Object, [argArray: Array ]) :Void

functionオブジェクトのthisを置き換えるのがこのapplyメソッド。
これをうまく使えばmc.onReleaseなどのthisが変わるめんどくささから解放されます。

以上を踏まえて、mx.utils.Delegate.create()では何をしているのかというと

まずはmx.utils.Delegate.create()のコードを見てみましょう。

static function create(obj:Object, func:Function):Function
{
	var f = function()
	{
		var target = arguments.callee.target;
		var func = arguments.callee.func;
		return func.apply(target, arguments);
	};

	f.target = obj;
	f.func = func;
	return f;
}
  1. functionオブジェクト(var f)を作成
  2. functionオブジェクトに匿名関数を参照させる
  3. functionオブジェクトはdynamicクラスなので、追加プロパティを作れる
    • scopeとなるobjectと関数を保持させる
  4. 匿名関数内で、arguments.calleeを使って、自身(現在の関数)を参照し、
    • 先ほど保持したscopeと関数を拾う。
    • func.apply()で意図したscopeにfuncを割り当てる(thisを変える)

だいたいこんな感じでした。しかしながら、func.apply()には同時に引数も渡せるはずです。なので、ちょっと付け足してみました。

static function createWithArgs(obj:Object, func:Function, args:Array):Function
{
	var f = function()
	{
		var target = arguments.callee.target;
		var func = arguments.callee.func;
		return func.apply(target, arguments.callee.args.concat()); //ここを追加
	};

	f.target = obj;
	f.func = func;
	f.args = args; //ここを追加
	return f;
}

applyメソッドの第2引数にarguments.callee.args.concat()を追加するとうまく引数を登録できます。
引数の配列となるargsはconcatしないとうまく動作しません。

このあたりがさっぱりわからなかったので、ググってみましたがめぼしいものは見つからずさらに謎の動作まで見つけてしまいました。

http://library.sfug.ch/trac/browser/trunk/doc/as2/examples/sfug_as2lib/ch/sfug/utils/Delegate.as

ここはarguments.shift()でscopeとfuncを定義してるあたりがおもしろいですね。concat(arguments)でさらにdelegateした後で呼び出したときの引数も定義しています。なぜargumentsが使えるのかがなんとなくでしかわからないので、完全なる理解にはしばらく時間がかかりそうです。

新しい会社に移りました。

  • 2008-05-17 (土)
  • ̃Gg[͂ĂȃubN}[Nɒlj

4月末で前職を退職し、5月より新しい会社で働くことになりました。Flashやる人です。

まだ2週間しか働いてませんが、かなりカルチャーショックです。いままでの底辺付近のヤバいやり方とぜんぜん違います。めちゃくちゃクオリティを求められますし、会社全体の空気がそうなってます

これからじっくり腰をすえてがんばろうと思います。本当にがんばってますよ!まだunkoって1回しか言ってないからね!

そんなunkoちゃんの僕は、すぐunkoに逃げてしまうので、ToDoとNotToDoリストを書いておこう。

さっさとやらないといけないリスト

上から優先度高い

  1. 早寝早起き
  2. motionグラフィックの基礎・引き出し増やす
  3. as3
  4. デザインパターン
  5. CoreserverでSubversion
  6. blogをFlashのことだけ書く
  7. asライブラリを作って公開
  8. プログラミングのノウハウ的なこと・UMLとかそのへんの周辺知識
  9. お笑い(いつも思いつきやから、クオリティとか緩急とかつけたい)
  10. ui
  11. Design

(できれば)やらないリスト。ある意味、そのうちやりたいことリスト

  • 正規表現
  • ruby・php・sqlとかサーバサイド
  • ruby on railsとかのフレームワーク
  • Processing(しまった。今日amazonで本買うてもうた)
  • IA
  • PM(これも本買ってもうた)
  • ファミコン
  • HTML

WordPressでPukiWIKI記法を使いたい!そんな貴女の希望をかなえるのが、このplugin!

  • 2008-05-03 (土)
  • ̃Gg[͂ĂȃubN}[Nɒlj

pukiwiki記法でblogが書けたら、ずいぶんはやく書けるし、自分用メモからの転載もはかどるのでplugin入れてみました。

おおまかな流れ

  1. Xoopsのpluginを拝借
  2. WordPress用PukiWIKI pluginを設定
  3. 全部utf-8(BOMなし)で保存しなおす
  4. 細かい設定

1~2のおおまかなところはこちらが参考になるので割愛します。
http://blog.absolute-zero.info/?p=88

全部utf-8(BOMなし)で保存しなおす

  1. アップロードしたファイルすべてをUTF-8(BOMなし)に保存しなおします。
  2. modPukiWiki/PukiWiki.phpの8行目を以下に変更
    if (!defined('MOD_PUKI_SOURCE_ENCODING')) define('MOD_PUKI_SOURCE_ENCODING','UTF-8');

こまかいところ

ulなどに勝手につくstyle属性をなくす設定

ulの入れ子をしたりすると、かなりstyle属性を入れられるので、消す。かなり物量が多いので、簡単なところだけ消しときます。(ホンマはmarginの計算処理部分も消したいけど、多くて断念)

config/default.php

  • 80行目
  • style="~~と書かれているとこを消す
    • これを

      $_settings['_list_pad_str'] = ' class="'.$_settings['style_prefix'].'list%d" style="padding-left:%dpx;margin-left:%dpx"';
    • これに変更
      $_settings['_list_pad_str'] = "";

一応、勝手に付与されるmargin、paddinの値も0にしとく

class/PukiWikiElement.php

  • 263行目付近のclass PukiWikiListContainerのfunction PukiWikiListContainerを変更

    • これを

      $this->margin = PukiWikiConfig::getParam($var_margin);
      $this->left_margin = PukiWikiConfig::getParam($var_left_margin);
    • 以下のようにmarginとpaddingの値を0に変更する
      $this->margin = "";
      $this->left_margin = "";

h1は使わないので、一つずつ見出しレベルを下げる

  • 「*」はh1じゃなくて、h2になってほしいので変更する

class/PukiWikiElement.php

  • headingまわりの修正
  • 207行目付近、PukiWikiHeadingのfunction PukiWikiHeadingの中
    • これを

      $this->level  = min(6, strspn($text, '*'));
    • これに変更
      $this->level  = min(6, strspn($text, '*') + 1 );
      

あわせて「#contents」の挙動も変更する

  • ulが2つしか入れ子になってくれないので、変更する
  • さっきheadingでlevelを変更したのでそれを直すのと、ulの入れ子を増やします。

class/PukiWikiElement.php

  • 1188行目付近のfunction Contents_UListに一行追加

    • $level -= 1;
  • 278行目付近のfunction PukiWikiListContainerを変更する
    • これを

      $this->level = min(3, strspn($text, $head));
    • これに変更
      $this->level = min(5, strspn($text, $head));
      

あとアンカーがおかしいことになってるので変更

class/PukiWikiElement.php

  • 1142行目付近のfunction getAnchorを変更

    • これを

      $id = "content_{$this->id}_{$this->count}";
    • これに変更
      $id = "content_{$level}_{$this->count}";

実際に使った感想。

  • h6まで見出しを作れる
  • 入れ子<ul>・<ol>は通常通り3個まで
    • 入れ子<li>の挙動がおかしい。入れ子<li>の中にブロック要素を入れると、そのブロック要素の直前に「</p>」を無理やり生成される
  • #contentsの目次生成は便利だけど、topやrssには不要なので、その辺をどうにかしたい。
    • topに置くと、id名が重複する可能性が高い?どうなんかな。

      • →ひとまずis_single()で個別記事だけ表示するように変更した。
      • 個別記事ID発行のthe_ID()を使ってid名に含ませようとしたが、ぜんぜんうまく動かなかった

しかしながら、これでめっちゃくちゃ楽になるぜ!まあ、wordpress止めてpukiwikiに移行しろとかは言わないでください。

Home


Search
Feeds
Meta

Return to page top