2009-07-31
今週のオススメ嫁曲:【初音ミク】 Dharma(ダルマ) 修正版【オリジナル曲】
やべぇw忙しさのあまり,今週の分,更新するの忘れるところだった.
アンダーグラウンド・カタログ聴いてたら,とても良さげな曲を発見.
音割れがあるのが残念な点ではあるけど,
それを差し引いてもいい曲.
ychさんの曲をもう1曲.
こっちもいい感じ.
2009-07-25
【AIR】XMLを非同期に読み書きする【FileStream】
都合上,XMLを自由に読み書きする必要が出てきた.
そこで,FileStreamクラス(AIRで追加されたファイルの読み書き用クラス)を使い,
XMLのメソッド1つで,非同期に読み書きをするXMLManagerクラスを作ってみた.
FileStreamクラスのファイルオープンには,openメソッド,openAsyncメソッドの2つがある.
openメソッドを使うと,それ以降のFileStreamの処理は,その行の処理が終わるまで次の行を実行しない.
でも,それだと,ロード対象のサイズが大きくなった場合などに遅延が起きてしまう.
それを避けたいのなら,openAsyncメソッドでファイルオープンする.
openAsyncにすると,各処理ごとにイベントを発行する.
つまり,FileStreamのオブジェクトにaddEventListenerしとけば,読み込み終わりとか判定できるわけです.
そこで,上記のXMLManagerでは,各イベントを利用してMXLの読み書きを行い,さらにカスタムイベントを配信する.
EventDispatcherを継承したのはこのため.
これ,作るときに気づいたんだが,
READモードだとcompleteイベント発生するのに,WRITEモードではcompleteイベント発生しないんだね.
最初気づかずにWRITEモードでもcompleteでファイルクローズしてたから,
イベント自体が発生してないからクローズされていないってことで,
上書き時にエラー出て散々ハマりましたw
しょうがないんで,OutputProgressイベント(出力中に定期的に発生するイベント)を使って,
bytesPending(残りの書き込みバイト数)がゼロになったときにクローズするようにしてみた.
そこで,FileStreamクラス(AIRで追加されたファイルの読み書き用クラス)を使い,
XMLのメソッド1つで,非同期に読み書きをするXMLManagerクラスを作ってみた.
package { import flash.events.EventDispatcher; import flash.events.OutputProgressEvent; import flash.events.Event; import flash.filesystem.File; import flash.filesystem.FileMode; import flash.filesystem.FileStream; /** XML用クラス * @auther kusamochi * @extend EventDispatcher */ public class XMLManager extends EventDispatcher { public static const READ_COMPLETE:String = "read_complete"; public static const READ_CLOSE:String = "read_close"; public static const WRITE_PROGLESS:String = "write_progress"; public static const WRITE_CLOSE:String = "write_close"; private var _xml:XML; // [read]xmlファイルの実体 private var fileStream:FileStream; private var _mode:String; //コンストラクタ public function XMLManager() { _mode = "NormalMode"; } // 明示的な参照解除メソッド public function deleteReference():void { if(fileStream) { if(_mode == "ReadMode") { fileStream.removeEventListener(Event.COMPLETE, readStreamCompleteHandler); fileStream.removeEventListener(Event.CLOSE, readStreamCloseHandler); } else if(_mode == "WriteMode") { fileStream.removeEventListener(OutputProgressEvent.OUTPUT_PROGRESS, writeStreamOutputProgressHandler); fileStream.removeEventListener(Event.CLOSE, writeStreamCloseHandler); } } } // ファイル読み込み public function readXML(file:File):void { trace("XMLManager::readXML"); trace("Reading : " + file.nativePath); _mode = "ReadMode"; fileStream = new FileStream(); fileStream.addEventListener(Event.COMPLETE, readStreamCompleteHandler); fileStream.addEventListener(Event.CLOSE, readStreamCloseHandler); fileStream.openAsync(file, FileMode.READ); } // ファイル出力 public function writeXML(file:File):void { trace("XMLManager::writeXML"); trace("Writing : " + file.nativePath); _mode = "WriteMode"; fileStream = new FileStream(); fileStream.addEventListener(OutputProgressEvent.OUTPUT_PROGRESS, writeStreamOutputProgressHandler); fileStream.addEventListener(Event.CLOSE, writeStreamCloseHandler); fileStream.openAsync(file, FileMode.WRITE); fileStream.writeMultiByte(_xml.toXMLString(), File.systemCharset); } public function printXML():void { trace(_xml.toXMLString()); } // EventHandler /////////////////////////////////////////////////////////// // Read ---------------------------------------- // Readストリームがクローズ private function readStreamCloseHandler(event:Event):void { trace("XMLManager::readStreamCloseHandler"); fileStream.removeEventListener(Event.COMPLETE, readStreamCompleteHandler); fileStream.removeEventListener(Event.CLOSE, readStreamCloseHandler); _mode = "NormalMode"; // カスタムイベントを配信する super.dispatchEvent(new Event(READ_CLOSE)); } // 読み込み完了 private function readStreamCompleteHandler(event:Event):void { trace("XMLManager::readStreamCompleteHandler"); var tmpStr:String = fileStream.readMultiByte(fileStream.bytesAvailable, File.systemCharset); fileStream.close(); _xml = new XML(tmpStr); // カスタムイベントを配信する dispatchEvent(new Event(READ_COMPLETE)); } // write -------------------------------------- // Writeストリームがクローズ private function writeStreamCloseHandler(event:Event):void { trace("XMLManager::writeStreamCloseHandler"); fileStream.removeEventListener(OutputProgressEvent.OUTPUT_PROGRESS, writeStreamOutputProgressHandler); fileStream.removeEventListener(Event.CLOSE, writeStreamCloseHandler); _mode = "NormalMode"; // カスタムイベントを配信する super.dispatchEvent(new Event(WRITE_CLOSE)); } // Write進行中 private function writeStreamOutputProgressHandler(event:OutputProgressEvent):void { trace("XMLManager::writeStreamOutputProgressHandler"); if(event.bytesPending == 0){ fileStream.close(); } // カスタムイベントを配信する super.dispatchEvent(new OutputProgressEvent(WRITE_PROGLESS)); } // getter //////////////////////////////////////////////////// // XMLオブジェクトを返す(他のクラスからのアクセスに対応) public function get xml():XML { return _xml; } // mode public function get mode():String { return _mode; } // setter ////////////////////////////////////////////// public function set xml(setXML:XML) { _xml = setXML; } } }
FileStreamクラスのファイルオープンには,openメソッド,openAsyncメソッドの2つがある.
openメソッドを使うと,それ以降のFileStreamの処理は,その行の処理が終わるまで次の行を実行しない.
でも,それだと,ロード対象のサイズが大きくなった場合などに遅延が起きてしまう.
それを避けたいのなら,openAsyncメソッドでファイルオープンする.
openAsyncにすると,各処理ごとにイベントを発行する.
つまり,FileStreamのオブジェクトにaddEventListenerしとけば,読み込み終わりとか判定できるわけです.
そこで,上記のXMLManagerでは,各イベントを利用してMXLの読み書きを行い,さらにカスタムイベントを配信する.
EventDispatcherを継承したのはこのため.
これ,作るときに気づいたんだが,
READモードだとcompleteイベント発生するのに,WRITEモードではcompleteイベント発生しないんだね.
最初気づかずにWRITEモードでもcompleteでファイルクローズしてたから,
イベント自体が発生してないからクローズされていないってことで,
上書き時にエラー出て散々ハマりましたw
しょうがないんで,OutputProgressイベント(出力中に定期的に発生するイベント)を使って,
bytesPending(残りの書き込みバイト数)がゼロになったときにクローズするようにしてみた.
2009-07-24
【初音ミクZ4】第2期個人スポンサー特典届いたお
2009-07-23
【AIR】applicationDirectoryのセキュリティエラー【Fileクラス】
Fileクラスは,AIRで追加された,一括したファイル・ディレクトリ管理ができる万能クラス.
便利なのはいいんだけど,セキュリティーエラーにハマっちゃって・・・.
ハマった割にはたいしたこと無かったけど,知らなかったら解決しない問題なのでメモしておく.
以下,プログラムの構成.
静的プロパティFile.applicationDirectoryはアプリケーションのインストール先を指すFileオブジェクト.
さらに,resolvePathメソッドでpd.iniというファイルパスを作成し,ファイルの保存先(oldPlayData)とする.
さらに,File.createTempFileメソッドで一時保存先(newPlayData)を確保.
oldPlayDataから更新内容があった場合,一時保存先に更新内容を記録しておく.
このへんのプログラムは本題でないので省略.
ウインドウを閉じる時,
一時保存先からコピーしてpd.iniに書き込んだのち,一時保存先のファイルを削除する.
これだけのプログラムなのに,何故か最初のtryで「SecurityError: fileWriteResource」
どーなってんのってググってみたら,
どうやら,applicationDirectoryにおいて,ファイルを作成・書き込みすることはセキュリティ上認められていないらしい.
( ´゚д゚`)エー
その抜け道として,コピー前に,
というように,一度nativePath(絶対パスのString)からFileクラスを再宣言すると,
セキュリティエラーから抜けられるとか.
でもそのかわり,
・AIRアプリケーションアンインストール時に自分で作成したファイルは削除されない
・作成したファイルが残っている状態で再インストールしようとするとエラーが発生
引用: applicationDirectory配下のファイルにアクセスする方法 - Fores Labs
あーだめだこれw
素直に,
とするのが妥当かな.
これだと,applicationStorageDirectoryは,実際のディレクトリ位置がOSによって,
となるので,上記のresolvePathでpd.iniを指定した場合は,
となる.
どうやら,このディレクトリはアンインストールと同時に消去されるらしい.
結論:
applicationDirectoryはファイルの書き込みには使用しない
��使うなら読み込み時.事前にパッケージしたswfとか画像データとかを読み込むのに使えばいい)
便利なのはいいんだけど,セキュリティーエラーにハマっちゃって・・・.
ハマった割にはたいしたこと無かったけど,知らなかったら解決しない問題なのでメモしておく.
// 保存先
var oldPlayData:File = (File.applicationDirectory).resolvePath("pd.ini");
// 一時保存先
var newPlayData:File = File.createTempFile();
// どこかでoldPlayDataの内容を読み込み
// どこかでoldPlayDataから更新された内容をnewPlayDataに一時的に保存
// 以下,ウインドウを閉じるときに
// newPlayDataが存在するか確認
if(newPlayData.exists) {
try {
// newPlayDataの内容をoldPlayDataにコピー
newPlayData.copyTo(oldPlayData, true);
}
catch(error:Error) {
trace(error.message);
}
try {
// newPlayDataを削除
newPlayData.deleteFile();
}
catch(error:Error) {
trace(error.message);
}
}
以下,プログラムの構成.
静的プロパティFile.applicationDirectoryはアプリケーションのインストール先を指すFileオブジェクト.
さらに,resolvePathメソッドでpd.iniというファイルパスを作成し,ファイルの保存先(oldPlayData)とする.
さらに,File.createTempFileメソッドで一時保存先(newPlayData)を確保.
oldPlayDataから更新内容があった場合,一時保存先に更新内容を記録しておく.
このへんのプログラムは本題でないので省略.
ウインドウを閉じる時,
一時保存先からコピーしてpd.iniに書き込んだのち,一時保存先のファイルを削除する.
これだけのプログラムなのに,何故か最初のtryで「SecurityError: fileWriteResource」
どーなってんのってググってみたら,
どうやら,applicationDirectoryにおいて,ファイルを作成・書き込みすることはセキュリティ上認められていないらしい.
( ´゚д゚`)エー
その抜け道として,コピー前に,
oldPlayData = new File(oldPlayData.nativePath);
というように,一度nativePath(絶対パスのString)からFileクラスを再宣言すると,
セキュリティエラーから抜けられるとか.
でもそのかわり,
・AIRアプリケーションアンインストール時に自分で作成したファイルは削除されない
・作成したファイルが残っている状態で再インストールしようとするとエラーが発生
引用: applicationDirectory配下のファイルにアクセスする方法 - Fores Labs
あーだめだこれw
素直に,
// アプリケーションのプライベート記憶領域を指定
var oldPlayDataFile:File = (File. applicationStorageDirectory).resolvePath("pd.ini");
とするのが妥当かな.
これだと,applicationStorageDirectoryは,実際のディレクトリ位置がOSによって,
・Windowsの場合
C:\Documents and Settings\[ユーザ名]\Application Data\[AIRアプリID]
\Local Store
・Macの場合
HD/Users/[ユーザー名]/Library/Preferences/[AIRアプリID]/Local Store/
となるので,上記のresolvePathでpd.iniを指定した場合は,
・Windowsの場合
C:\Documents and Settings\[ユーザ名]\Application Data\[AIRアプリID]
\Local Store\pd.ini
・Macの場合
HD/Users/[ユーザー名]/Library/Preferences/[AIRアプリID]/Local Store/pd.ini
となる.
どうやら,このディレクトリはアンインストールと同時に消去されるらしい.
結論:
applicationDirectoryはファイルの書き込みには使用しない
��使うなら読み込み時.事前にパッケージしたswfとか画像データとかを読み込むのに使えばいい)
2009-07-22
今週のオススメ嫁曲:【神威がくぽと鏡音レン】LABOLABO【オリジナル曲】
LABOとLOVEをかけた素敵ソング.
ネタと韻の踏み方が絶妙.
しかも,強調がスゲェ━━━━━━ヽ(゚Д゚)ノ━━━━━━!!!!
PVも非常に良い感じです.
作ったの誰だろ?って思ってたら・・・あー民Pw
この人の曲,大好きだわ.
ん?すでにがくぽとレンの時点で「嫁」曲じゃないって?
いやいや.
がくぽとレンだってオレのよ・・・
アッー!
2009-07-21
【Java Script】SyntaxHighlighter【コード整理】
世の中こんな便利なものがあるということで.
コード表示用のJava Script.
このブログって,みくみくしているわりには,
プログラムソース貼ること多いので,
これあったほうがいいかと思って.
cssファイル,jsファイルをアップロードして,ヘッダーに少しタグ書くだけでできます.
こちらのサイトを参考にさせて頂きました.
Sun Limited Mt. - ブログにコードを表示するときに便利な dp.SyntaxHighlighter
以下,表示確認用テスト.
XMLをpreで
さらに!
なんと,SyntaxHighlighterでAS3対応版を作ってくれた人が!
yourpalmark - AS3 Syntax Highlighting (with SyntaxHighlighter)
これはありがたい.
早速テスト,サンプルにAIRのNativeWindowの使用例.
・・・あ,コード自体はパブリッシュしてないので,
エラー出るかもね.
なんか,ずいぶん,技術ブログっぽくなっちゃったな・・・つまらん.
・・・実は,この緑のストライプ.
ミクの縞パンをイメージし(ry
はい,自重自重w
これで,自分のブログらしくなったな)
コード表示用のJava Script.
このブログって,みくみくしているわりには,
プログラムソース貼ること多いので,
これあったほうがいいかと思って.
cssファイル,jsファイルをアップロードして,ヘッダーに少しタグ書くだけでできます.
こちらのサイトを参考にさせて頂きました.
Sun Limited Mt. - ブログにコードを表示するときに便利な dp.SyntaxHighlighter
以下,表示確認用テスト.
XMLをpreで
<?xml version="1.0" encoding="Shift_JIS"?> <vocaloid> <crypton> <engine ver="1"> <loid>KAITO</loid> <loid>MEIKO</loid> </engine> <engine ver="2"> <loid no="01">初音ミク</loid> <loid no="02">鏡音リン</loid> <loid no="02">鏡音レン</loid> <loid no="03">巡音ルカ</loid> </engine> </crypton> <internet> <engine ver="2"> <loid>がくっぽいど</loid> <loid>Megpoid</loid> </engine> </internet> </vocaloid>
さらに!
なんと,SyntaxHighlighterでAS3対応版を作ってくれた人が!
yourpalmark - AS3 Syntax Highlighting (with SyntaxHighlighter)
これはありがたい.
早速テスト,サンプルにAIRのNativeWindowの使用例.
・・・あ,コード自体はパブリッシュしてないので,
エラー出るかもね.
package { import flash.events.MouseEvent; import flash.display.NativeWindow; import flash.display.NativeWindowType; import flash.display.NativeWindowInitOptions; import flash.display.NativeWindowSystemChrome; import flash.display.StageScaleMode; import flash.display.StageAlign; import flash.display.Sprite; public class SubWindow extends NativeWindow { var base:Sprite; public function SubWindow(initX:int, initY:int, initTitle:String, initSprite:Sprite) { base = initSprite; var nwOptions:NativeWindowInitOptions = new NativeWindowInitOptions(); nwOptions.type = NativeWindowType.LIGHTWEIGHT; nwOptions.systemChrome = NativeWindowSystemChrome.NONE; nwOptions.transparent = true; nwOptions.minimizable = true; nwOptions.maximizable = false; super(nwOptions); super.x = initX; super.y = initY; super.width = base.width; super.height = base.heihgt; super.title = initTitle; super.stage.scaleMode = StageScaleMode.NO_SCALE; super.stage.align = StageAlign.TOP_LEFT; super.visible = false; base.addEventListener(MouseEvent.MOUSE_DOWN, widnowMouseDownHandler); super.addChild(base); } // ウインドウを閉じる public override function close():void { base.addEventListener(MouseEvent.MOUSE_DOWN, widnowMouseDownHandler); super.addChild(base); super.close(); } // Event Handler ///////////////////////////////////////////////////////// private function widnowMouseDownHandler(event:MouseEvent):void { super.startMove(); } } }
なんか,ずいぶん,技術ブログっぽくなっちゃったな・・・つまらん.
・・・実は,この緑のストライプ.
ミクの縞パンをイメージし(ry
はい,自重自重w
これで,自分のブログらしくなったな)
2009-07-19
【オープニングライブ】kengo.ThreadFlowVI feat.巡音ルカ
初音ミクみく
http://vocaloid.blog120.fc2.com/blog-entry-3878.html
ITmedia
http://www.itmedia.co.jp/news/articles/0907/10/news078.html
などで取り上げられている,クリプトン主催のJassコンペ「EARTH MIX」.
そのオープニングライブが,今日18:30から札幌Apple Storeで行われるということで,
早速,札幌在住のボカロ廃が行ってきましたよっとw
一応,普通の客を装って時間までiPodとMacBook見てました.
MacBookほしいなぁ・・・.
iPod touchをいじって遊んでたら,なにやらライブ関係者らしき人からビラを渡されました.
▲今回のコンペのビラとクリプトンの商品チラシ
ん?あれ?ビラ配りしてたあの人.
どこかで・・・って,ちょwwwクリ☆ケンさんではありませんか!
それからして,まもなくして,ミニライブが始まりました.
最初の紹介でいきなり「弊社のマスコット」とか振られて紹介されてたクリ☆ケンさんw
当の本人は録画用の機材チェックしてただけだったのにwww
��ヒャ━━━━━━ヽ(゚Д゚)ノ━━━━━━!!!!
かっこええ.自分がここにいることが場違いな気がして(ry
バンドの方は,ボーカロイド=萌え的な要素を少し払拭したかった的なことを仰ってました.
うん.確かに,こんなにクールなルカさんは,今まであんまり聴かなかったかも.
どこかのジャズクラブで歌ってそうな,そんな空気のある曲に全体がまとまっている.
「kengo.ThreadFlowVI feat.巡音ルカ」
ベース以外のドラムとサックス,ピアノ,ボーカル(巡音ルカ)は全てヴァーチャル.
だから,目の前で演奏しているにも関わらず,音はスピーカーから出てくる.
でも,音の遅延とかはないし,本当にその楽器から生で音が出ているかと錯覚するほどリアルなサウンドなので,
とても不思議な印象を受けた.
肝心のルカさんは,機材トラブルがあったようで,最初はなかなか曲が始まらず・・・
ツン全開のルカさんw
サックスは,ウインドコントローラーなる管楽器感覚でMIDI音源が演奏できる代物.
それで本物のサックス(しかもプロ演奏)の音が自然と出てくるんだからすごい.
吹き込んだ息の流量とか計算して,音量決めてたりするんだろうか?
自分理系なもんで,なんかもう,機材見るだけで+(0゚・∀・) + ワクテカ +
ちなみに,今回,ルカさんボーカルの曲は2曲あったんだけど,
そのうちの1曲はなんとすでにiTunes Storeで公開されているそうな.
1曲無料カードまで貰っちゃったし,これは買いにいかなければ!
クリックでiTMSへ
kengo.ThreadFlowVI - Speak Low (feat. Megurine Luka)
http://vocaloid.blog120.fc2.com/blog-entry-3878.html
ITmedia
http://www.itmedia.co.jp/news/articles/0907/10/news078.html
などで取り上げられている,クリプトン主催のJassコンペ「EARTH MIX」.
そのオープニングライブが,今日18:30から札幌Apple Storeで行われるということで,
早速,札幌在住のボカロ廃が行ってきましたよっとw
一応,普通の客を装って時間までiPodとMacBook見てました.
MacBookほしいなぁ・・・.
iPod touchをいじって遊んでたら,なにやらライブ関係者らしき人からビラを渡されました.
▲今回のコンペのビラとクリプトンの商品チラシ
ん?あれ?ビラ配りしてたあの人.
どこかで・・・って,ちょwwwクリ☆ケンさんではありませんか!
それからして,まもなくして,ミニライブが始まりました.
最初の紹介でいきなり「弊社のマスコット」とか振られて紹介されてたクリ☆ケンさんw
当の本人は録画用の機材チェックしてただけだったのにwww
��ヒャ━━━━━━ヽ(゚Д゚)ノ━━━━━━!!!!
かっこええ.自分がここにいることが場違いな気がして(ry
バンドの方は,ボーカロイド=萌え的な要素を少し払拭したかった的なことを仰ってました.
うん.確かに,こんなにクールなルカさんは,今まであんまり聴かなかったかも.
どこかのジャズクラブで歌ってそうな,そんな空気のある曲に全体がまとまっている.
「kengo.ThreadFlowVI feat.巡音ルカ」
ベース以外のドラムとサックス,ピアノ,ボーカル(巡音ルカ)は全てヴァーチャル.
だから,目の前で演奏しているにも関わらず,音はスピーカーから出てくる.
でも,音の遅延とかはないし,本当にその楽器から生で音が出ているかと錯覚するほどリアルなサウンドなので,
とても不思議な印象を受けた.
肝心のルカさんは,機材トラブルがあったようで,最初はなかなか曲が始まらず・・・
ツン全開のルカさんw
サックスは,ウインドコントローラーなる管楽器感覚でMIDI音源が演奏できる代物.
それで本物のサックス(しかもプロ演奏)の音が自然と出てくるんだからすごい.
吹き込んだ息の流量とか計算して,音量決めてたりするんだろうか?
自分理系なもんで,なんかもう,機材見るだけで+(0゚・∀・) + ワクテカ +
ちなみに,今回,ルカさんボーカルの曲は2曲あったんだけど,
そのうちの1曲はなんとすでにiTunes Storeで公開されているそうな.
1曲無料カードまで貰っちゃったし,これは買いにいかなければ!
クリックでiTMSへ
kengo.ThreadFlowVI - Speak Low (feat. Megurine Luka)
( ´ー`)フゥー...とりあえずは、ひと段落?
今回は、なんか、すごく勉強になった。
Flash(AIR) + PHP + SQL
だったからなぁ。
PHPでは、
・そもそもPHP自体の勉強
・PEARやSmartyなどのライブラリの使用
・SQL操作
・セッション周りとか認証処理関係
・PHPのセキュリティの基本
などなど。
Flash(AIR)では、
・Fileクラスを使ったファイル制御全般
・XMLの作成・読み書き
・FlashからPHPへデータ送ったり、逆に結果を受け取ったり(しかもXMLごと)
・カスタムイベントの有効活用
まあ、正直一番つらかったのは、
データベースの正規化とSQL構文
だっだんですけど(;´∀`)
SQLを扱うPHPファイルだけで1500行オーバーってどうゆうこと?
あまりにも見にくいもんだから、便宜的にファイル3,4つに分けちゃったよw
正規化も計画的に。
あとで、技術系のネタで記事かいとこ。
Flash(AIR) + PHP + SQL
だったからなぁ。
PHPでは、
・そもそもPHP自体の勉強
・PEARやSmartyなどのライブラリの使用
・SQL操作
・セッション周りとか認証処理関係
・PHPのセキュリティの基本
などなど。
Flash(AIR)では、
・Fileクラスを使ったファイル制御全般
・XMLの作成・読み書き
・FlashからPHPへデータ送ったり、逆に結果を受け取ったり(しかもXMLごと)
・カスタムイベントの有効活用
まあ、正直一番つらかったのは、
データベースの正規化とSQL構文
だっだんですけど(;´∀`)
SQLを扱うPHPファイルだけで1500行オーバーってどうゆうこと?
あまりにも見にくいもんだから、便宜的にファイル3,4つに分けちゃったよw
正規化も計画的に。
あとで、技術系のネタで記事かいとこ。
2009-07-16
今週のオススメ嫁曲:【初音ミク】 はいぽせしす
今週,すこぶる忙しいんだが・・・この記事の更新だけはやめないw
この曲を作ったよよPことDenkitribeさんは,ミク以前にすでにネット上では有名な方なんだけど,
こんな曲も作っていたことに最近知った.
とりあえず,1度コメなしで視聴することをオススメする.
歌詞に込められた意味を考えると非常に面白い.
というか,ミクかわいすぎだろw
繰り返しの動きがポップンのキャラに見えてしまって,よけいかわいく見えるw
歌詞は「僕」視点.
仮説A:君は僕が嫌い
仮説Aとなる理由:人として当たり前のこと
→ 「君」から見て「僕」はどう思われているか本当は分からない
→ だから「僕」側の内容は確実に全て正しいものを挙げておく
仮説B:僕も君が嫌い
仮説Bとなる理由:僕から見た君のこと
→ 実は「僕」から見て「君」が全部好きなところ
→ 「僕」から見たことなので,「君」側の内容は全て正しい
僕の仮説が正しければ.
→ 仮説AもBも間違っている.
→ 君も僕も好きなんだから付き合えるよねという僕の思い
ということで,「僕」の片思いソング?みたいな.
2009-07-08
今週のオススメ嫁曲:雨がひどいのです【初音ミクオリジナル】
▲このてるてるミクさんほしいんですけどw
なんか,こう,かわいくて,ゆるーい感じの作風がこたつPが作る曲の特徴.
そもそもこたつPと呼ばれるようになった元ネタの曲がもうそんな感じ.
▲「ここが,ぬくい,でない」のフレーズが好き
( ´ー`)フゥー...ホントなごむわ.
そんな,こたつPの最新曲はこちら.
▲対位法だって.音楽知識がない自分には分からん・・・.
・・・うん,やっぱり,かわいい.
野菜食べたくなってきた.
2009-07-07
【Flash】Tweener1.32.74→1.33.74
今、あるサイトに運営において必要なFlash(正確にはAIR)を制作中.
Tweenerの最新バージョンが気になったので調べてみた.
どうやら最近,ちょっとしたごたごたがあったみたい.
TweenerはFlashを記述するAction Script 2.0,3.0のライブラリ.
オブジェクトを動きを簡単にかつ詳細に設定できる万能ライブラリで,かなり多くの人に使われている.
というか,普通にプロも使ってそう.
Google Codeで配布されてます.
http://code.google.com/p/tweener/
現状の最新版は1.33.74.
その前バージョン1.32.74において, 「Tweenerの上書き」の設定について不評があり,1.33.74ではそれが修正されている.
同じオブジェクトに対してTweenを連続で設定したとき,以前のバージョンまでは自動で上書きされてていた.
▲実行結果
x座標を連続で設定したmySquareは,後に書いた方に上書きされていることが確認できる.
Tweenの上書きをオプション扱いにする.その際,デフォルトではfalse(無効).
なので,上のコードをver.1.32.74で実行すると,
▲ver.1.32.74で実行
mySquareの設定が上書きされなくなる.
そのかわり,オプションに,
とoverwriteオプションを追加することで,前バージョンと同様に上書きされる.
しかし,前バージョンのライブラリを使っていた人にとっては,バージョンアップによって動作に問題が生ずる可能性がある.
そこで,現最新バージョンでは,Tweenの上書き設定をする静的プロパティ「autoOverwrite」を追加し,上書き設定のデフォルトをtrueとした.
これにより,前バージョンまで使っていたASであっても正常に動作し,かつ上書きの有無を設定できるようになった.
つまり,上書きをしたかったら,今まで通りそのままでおk.
上書きしたくないのなら,上記ver.1.32.74のようにオプションで1つ1つ設定するか,以下のようにして設定する.
ver.1.32.74で上書き設定をデフォルトでfalseにした理由は,その処理速度の問題から.
Flashはしばしばというか,かなりの場合,処理速度が重要なキーとなる.
まあ,スクリプト言語だし,C言語に比べれば計算速度自体かなり遅い.
だから,できるだけ速くする努力は必要.
今回の「上書き設定」は,上書きしないことがわかっているなら,最初からfalseにしといたほうがコストが少なくすむ.
例のFlashの実行結果からように,以前のバージョンのTweenerでは,同じオブジェクトがTweenを設定されたとき,まず,同じプロパティがあるかどうかを探索する.
同じプロパティがあった場合は,その設定を上書きして,ない場合はそのまま設定を追加する.
・・・ということは,今まで作った自分のプログラムもfalseにした方が効率上がるのかな?
どこかで上書きしてたら困るけども.
どれくらい速くなるかは要検証.
Tweenerの最新バージョンが気になったので調べてみた.
どうやら最近,ちょっとしたごたごたがあったみたい.
TweenerはFlashを記述するAction Script 2.0,3.0のライブラリ.
オブジェクトを動きを簡単にかつ詳細に設定できる万能ライブラリで,かなり多くの人に使われている.
というか,普通にプロも使ってそう.
Google Codeで配布されてます.
http://code.google.com/p/tweener/
現状の最新版は1.33.74.
その前バージョン1.32.74において, 「Tweenerの上書き」の設定について不評があり,1.33.74ではそれが修正されている.
そもそもTweenerの上書きって?
同じオブジェクトに対してTweenを連続で設定したとき,以前のバージョンまでは自動で上書きされてていた.
var mySquare:MySquare = new MySquare(); // 正方形
var myCircle:MyCircle = new MyCircle(); // 円
mySquare.x = 20;
mySquare.y = 20;
stage.addChild(mySquare);
myCircle.x = 20;
myCircle.y = 20;
stage.addChild(myCircle);
Tweener.addTween(mySquare, {x:160, time:4, transition:"linear"});
Tweener.addTween(mySquare, {x:160, time:2, transition:"linear"});
Tweener.addTween(myCircle, {x:160, time:4, transition:"linear"});
Tweener.addTween(myCircle, {y:160, time:2, transition:"linear"});
▲実行結果
x座標を連続で設定したmySquareは,後に書いた方に上書きされていることが確認できる.
ver.1.32.74の変更点
Tweenの上書きをオプション扱いにする.その際,デフォルトではfalse(無効).
なので,上のコードをver.1.32.74で実行すると,
▲ver.1.32.74で実行
mySquareの設定が上書きされなくなる.
そのかわり,オプションに,
Tweener.addTween(mySquare, {x:160, time:4, transition:"linear"});
Tweener.addTween(mySquare, {x:160, time:2, transition:"linear", overwrite:true});
とoverwriteオプションを追加することで,前バージョンと同様に上書きされる.
しかし,前バージョンのライブラリを使っていた人にとっては,バージョンアップによって動作に問題が生ずる可能性がある.
ver.1.33.74の変更点
そこで,現最新バージョンでは,Tweenの上書き設定をする静的プロパティ「autoOverwrite」を追加し,上書き設定のデフォルトをtrueとした.
これにより,前バージョンまで使っていたASであっても正常に動作し,かつ上書きの有無を設定できるようになった.
つまり,上書きをしたかったら,今まで通りそのままでおk.
上書きしたくないのなら,上記ver.1.32.74のようにオプションで1つ1つ設定するか,以下のようにして設定する.
Tweener.autoOverwrite = false;
Tweener.addTween(mySquare, {x:160, time:4, transition:"linear"});
Tweener.addTween(mySquare, {x:160, time:2, transition:"linear"});
ver.1.32.74で上書き設定をデフォルトでfalseにした理由は,その処理速度の問題から.
Flashはしばしばというか,かなりの場合,処理速度が重要なキーとなる.
まあ,スクリプト言語だし,C言語に比べれば計算速度自体かなり遅い.
だから,できるだけ速くする努力は必要.
今回の「上書き設定」は,上書きしないことがわかっているなら,最初からfalseにしといたほうがコストが少なくすむ.
例のFlashの実行結果からように,以前のバージョンのTweenerでは,同じオブジェクトがTweenを設定されたとき,まず,同じプロパティがあるかどうかを探索する.
同じプロパティがあった場合は,その設定を上書きして,ない場合はそのまま設定を追加する.
・・・ということは,今まで作った自分のプログラムもfalseにした方が効率上がるのかな?
どこかで上書きしてたら困るけども.
どれくらい速くなるかは要検証.
2009-07-06
くさもちはStudie GLAD Racingを応援しています
というわけで,実は個人スポンサーです.
��個人スポンサーの皆様
http://stgt.jp/sponsor_personal/
「くさもち 様」でかなーり下の方に小さく.
8053人とか多すぎワロタw
おまえらミクRQフィギュアに釣られすぎ・・・
って,それ,まさに自分だった(ノ∀`)アチャー
つーか,自分のHNの上に自分の本名と同じ名字あるんですけどw
うちの名字そんなにないほうだと思っていたので,間違われたかと思って焦った.
��ググると意外とあるみたいだ.(株)○○,○○商会,○○寺とかあるんだw知らんかった.)
「Studie GLAD Racing」とは,カーレースのチーム名.
知っている人は知っている,SuperGTに初音ミクの痛車で殴り込みをかけたというすごいチーム.
車はBMW Z4 M Coupe.
エンジンはV型8気筒.
そして何より,
このマシンの最大の特徴は「究極の痛車」
との公式宣言w
前は公式画だけだったんだが・・・
・・・すごく,ミクです.
2009-07-05
PSP大活躍な件
・アイマスSP
・Project DIVA
音楽プレイヤーと化していたのに、現在2本同時進行。
電力足りねぇ。
コンセントつなぎっ放しで、すでに携帯ゲームではないw
えーもう、どっちもプロデュース大変ですよ。
アイマスは今日中にまたやるって約束してる。
��ゲームをやめるときに次回プロデュースを決めるイベントがある)
亜美真美もうちょっとで終わりそうだし。
次は、やっとB→AのIU。
��IVAは終わりが見えない。
モジュール(コスチューム)の出現条件がなかなか大変。
とりあえず、メイコ姉さん、ハク、ルカは出したんだけども。
お前たちは俺の翼だ!
・・・どこかの二股主人公になってしまったw
・Project DIVA
音楽プレイヤーと化していたのに、現在2本同時進行。
電力足りねぇ。
コンセントつなぎっ放しで、すでに携帯ゲームではないw
えーもう、どっちもプロデュース大変ですよ。
アイマスは今日中にまたやるって約束してる。
��ゲームをやめるときに次回プロデュースを決めるイベントがある)
亜美真美もうちょっとで終わりそうだし。
次は、やっとB→AのIU。
��IVAは終わりが見えない。
モジュール(コスチューム)の出現条件がなかなか大変。
とりあえず、メイコ姉さん、ハク、ルカは出したんだけども。
お前たちは俺の翼だ!
・・・どこかの二股主人公になってしまったw
2009-07-03
今週のオススメ嫁曲:【MEIKO】Moonlight children
浮気しましたwごめんなさいor2
いや,つーかMEIKOも嫁だし!(開き直り)
この作品,「MEIKOの本気」タグがついているほどの神調教.
ボーカロイドでも,ここまで力強い歌い方をさせる(またはそう感じさせる)とは!
個人的にミクで替え歌作った経験はあったのだけれど.
そのとき,どうしてもパワー不足が目立った(ミクの特性でもあるかもしれない).
まあ,DTMのDすら知らんかったので,あのときはいくら頑張っても音割れしてた・・・.
だから,こういう曲が作れる人って技術持ってるなぁと毎度感心する.
曲は,Furture Jazz系.
・・・っていってもタグについていたからそういっただけで,自分は詳しくないのでよく分かりませんw
とにかく,かっこいい曲ってことでいいジャマイカ!
なのに,全く評価されていない.
映像はないのが原因なんだろうか?
映像なしでも十分評価された作品だってあるのに.
ということで,勝手に宣伝w
この際,ここで紹介したところで・・・っていうのはおいておいて.
作品を作った方は,microgrooverさん・・・でいいのかな?
そもそも,最初に発表してる曲がmicrogrooverという曲.
しかもLOLA!
か,かっこいい・・・(´∀`*)
ミクの曲も2曲作っている.
▲どちらかというと,楽器的にミクを使ってる感じ
▲ロボ声がかっこいいMikuHouse
ニコ動からはMySpaceのリンクあったけど,どうやらピアプロにもいらっしゃるようです.
MySpace
ピアプロ
これからは,なるべく埋もれている曲を紹介しようかな.
有名すぎるの紹介してもつまらんし.
くさもちは全世界のPを応援します
むろん,これはボーカロイドのPだけとは言ってない!
2009-07-01
【PHP】Smartyのススメ
SmartyはPHPによるテンプレートエンジン.
- Smartyの考え方 -
WebページってHTMLとかPHPとかSQLとかいろんな言語が1つのファイルに書いてあってカオスwww
つーか,デザイン担当とロジック担当が違ったら大変すぎるよな.
・・・じゃあ,最初からデザインとロジックでファイルを分けりゃいいんだ!
こんな感じ.
Smartyの実体はPHPによって書かれたクラスファイル.
よって,PHPが使える環境であればどこでも使える.
レン鯖であっても,
公式:http://www.smarty.net/
のdownloadからDLしたディレクトリを丸ごとうpすればいい.
しかし,その場合,セキュリティ対策は必要.
以下に例.
▼owata.php
▼owata.tpl
▼実行結果(owata.phpにブラウザからアクセス)
owata.phpにアクセスすると,
で,テンプレートファイルowata.tplを読み出して中のHTMLを表示する.
そのとき,予め,
で,設定しておいた中身の置き換えを行う.
ここでは,owata.tpl中の{$owata}を「そうだ!樹海に行こう!」に置き換える.
ちなみに,テンプレートファイルのディレクトリ位置は,
で設定したディレクトリ位置となる.
これが非常に便利だと考えられるのは,PHPの処理次第でテンプレートを変更できることにある.
例えば,PHPでありがちな,「エントリー」→「内容確認」→「完了」.
<input>タグのaction属性を自分にしておき,ボタンを押したときのPOSTで判断して処理を変える場合,
といった感じに,状況に応じてテンプレートファイルを変更することが可能.
- Smartyの考え方 -
WebページってHTMLとかPHPとかSQLとかいろんな言語が1つのファイルに書いてあってカオスwww
つーか,デザイン担当とロジック担当が違ったら大変すぎるよな.
・・・じゃあ,最初からデザインとロジックでファイルを分けりゃいいんだ!
こんな感じ.
Smartyの実体はPHPによって書かれたクラスファイル.
よって,PHPが使える環境であればどこでも使える.
レン鯖であっても,
公式:http://www.smarty.net/
のdownloadからDLしたディレクトリを丸ごとうpすればいい.
しかし,その場合,セキュリティ対策は必要.
以下に例.
▼owata.php
<?php
require_once 'config/config.inc.php'; // ここにディレクトリ場所とかdefineされてる
require_once _DIR_SMARTY_LIBS . 'Smarty.class.php';
$smarty->Smarty();
// Smartyのディレクトリ設定
$smarty->template_dir = _DIR_SMARTY_TEMPLATES; // templeteディレクトリ
$smarty->compile_dir = _DIR_SMARTY_COMPILE; // completeディレクトリ
$smarty->config_dir = _DIR_SMARTY_CONFIG; // configディレクトリ
$smarty->cache_dir = _DIR_SMARTY_CACHE; // cacheディレクトリ
$smarty->assign('owata', 'そうだ!樹海に行こう!');
$smarty->display("owata.tpl");
?>
▼owata.tpl
<html>
<body>
ニートの提案「{$owata}」
</body>
</html>
▼実行結果(owata.phpにブラウザからアクセス)
ニートの提案「そうだ!樹海に行こう!」
owata.phpにアクセスすると,
$smarty->display("owata.tpl");
で,テンプレートファイルowata.tplを読み出して中のHTMLを表示する.
そのとき,予め,
$smarty->assign();
で,設定しておいた中身の置き換えを行う.
ここでは,owata.tpl中の{$owata}を「そうだ!樹海に行こう!」に置き換える.
ちなみに,テンプレートファイルのディレクトリ位置は,
$smarty->template_dir
で設定したディレクトリ位置となる.
これが非常に便利だと考えられるのは,PHPの処理次第でテンプレートを変更できることにある.
例えば,PHPでありがちな,「エントリー」→「内容確認」→「完了」.
<input>タグのaction属性を自分にしておき,ボタンを押したときのPOSTで判断して処理を変える場合,
if(isset($_POST["entrySubmit"])) {
// ~ここにいろいろ処理~
// エントリー内容の確認
$smarty->display("confirm.tpl");
}
else if($isset(_POST["confirmSubmit"])) {
// ~DBに登録とかいろいろ処理~
// 登録内容の表示
$smarty->display("entryResult.tpl");
}
else {
// 通常の表示(エントリーページ)
$smarty->display("entry.tpl");
}
といった感じに,状況に応じてテンプレートファイルを変更することが可能.
登録:
投稿 (Atom)