2008年1月アーカイブ

Movable Typeを4.1にアップデートした。
今回の新機能で注目すべきなのは、何といってもカスタムフィールド。
待ちに待っていた標準機能。

フィールドを自分なりにカスタムするには、今まではrightfieldcustomfieldsなどを使うしかなかったが、これが標準装備されたことになる。

使い勝手もなかなかよさそうなので、後日ポキールを復活させる予定。

FlashからXMLやphpなどのデータを取得する場合、おなじみクロスドメインが必要。
書き方はこんな感じ


<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy >
<allow-access-from domain="*.yourflashpage.co.jp" secure="false"/>
</cross-domain-policy>

普通のクロスドメインと違うところは、
secure="false"
が必要だという点。

O'REILLY出版「Mind Hacks」を読んでいる。URLがたくさん出てくるので、
http://www.oreilly.co.jp/books/4873112710/links.html
から引用。さらに自分用にカスタムしていく予定。











あまり意識して考えたことがなかったけど、メタ認知について。
仕事(プログラミング・ウェブデザイン)をしていると必ず問題にぶちあたる。そしてパターンがる。

1. 小さな問題(~10分)
2. 前にも似たような経験をした問題(~1時間)
3. ハマる問題(1時間~)

1は比較的短時間で解決できてしまう、すぐに解決法が思い浮かぶ問題。
2は作業しているうちに、「ああこういうのは前にもぶちあたった」と思い出すので、
そのうち解けるだろうとなんとなくわかる問題。
3は、2かと思いきや見事に裏切られて原因の憶測すら困難な問題。

経験の積み重ねで、3だったものがどんどん1のほうへシフトしていき、1に堆積するイメージ。
不思議なのは、3を解決する瞬間というのは、だいたいが休憩を入れた直後だということ。

それはなんでか?と自問自答してみた。

だいたいの場合、1と2の延長で3をやっているので、完全に解決法がパターン化されてしまっている。すでに発想が出尽くしているのにもかかわらず、そこに執着し続けている。2のパターンに違いないと信じて、これでもか、これでもか、と頑張って本当に2ならいいのだが、それでもダメなときは「もうだめだー」と言って休憩する。実はこれが今までの方法には見切りをつけようという合図。休憩中は同じ回路に信号を流さないので、ちょっとRAMがクリアされる。そして再開したとき、「2の中に答えはないから3へ旅をはじめよう。」と要点をある程度客観視できる。そこにそれまでと大きな違いがある。重要なのは、それまでのフローをいかに忘れているかどうか。

絵を描いていたときのことを思い出す。描いた絵はひっくりかえしたり、顔を傾けてみてみたり、遠くからながめてみたり。
作曲をしていたときのことを思い出す。一度つくりあげたものを壊すと、全く新しい聴こえ方になるのが楽しくてしょうがなかったり。

何をするときも同じだと思った。3の前に妥協するという技術が一般的なのかもしれないが、それを解決したときの快感はこの上ないからやめられない。
そして、小さな単位で毎日それの繰り返しなのだが、生き方においてもっと休憩が必要だなと思う今日このごろ。
人間の、「忘れる」という能力はすばらしいと思う。

*追記
そういえば2や3で、人に相談すると自己解決するパターンもある。人に説明しているうちに勝手に要点がまとまって、まだ試していない選択肢が思い浮かぶからだ。

任意のアルバムアートワーク画像の探し方を探していたら、みつかったのでメモ。

http://forums.macosxhints.com/showthread.php?p=325382
こちらから引用:


These are Persistent IDs, which you can find in iTunes Music Library.xml and folder structure is like this:

Library Persistent ID -> decimal value of last hex digit in tracks persistent ID -> dec value of before last hex digit -> dec value of 3rd hex digit from the end -> Library persistent ID - Track persistent ID .itc


まず、XMLの先頭にあるLibrary Persistent IDという部分がある:


<key>Library Persistent ID</key><string>B77A88149B472EF5</string>

そしてそれぞれのトラックは下記のように、ひとまとまりのエレメントになっている。


<key>142</key>
<dict>
<key>Track ID</key><integer>142</integer>
<key>Name</key><string>ハニー・ムーン</string>
<key>Artist</key><string>Tei Towa + Natural Calamity</string>
<key>Composer</key><string>細野晴臣</string>
<key>Album</key><string>細野晴臣トリビュート・アルバム Tribute to Haruomi Hosono [Disc 1]</string>
<key>Genre</key><string>Pop</string>
<key>Kind</key><string>AAC オーディオファイル</string>
<key>Size</key><integer>4811001</integer>
<key>Total Time</key><integer>294293</integer>
<key>Disc Number</key><integer>1</integer>
<key>Disc Count</key><integer>2</integer>
<key>Track Number</key><integer>9</integer>
<key>Track Count</key><integer>11</integer>
<key>Year</key><integer>2007</integer>
<key>Date Modified</key><date>2007-12-11T16:21:09Z</date>
<key>Date Added</key><date>2007-11-18T07:02:11Z</date>
<key>Bit Rate</key><integer>128</integer>
<key>Sample Rate</key><integer>44100</integer>
<key>Rating</key><integer>20</integer>
<key>Album Rating</key><integer>40</integer>
<key>Album Rating Computed</key><true/>
<key>Compilation</key><true/>
<key>Artwork Count</key><integer>1</integer>
<key>Persistent ID</key><string>34B5886AA718721C</string>
<key>Track Type</key><string>File</string>
<key>Location</key><string>file://localhost/L:/stage/nanmaci/%E3%83%8D%E3%82%BF/1-09%20%E3%83%8F%E3%83%8B%E3%83%BC%E3%83%BB%E3%83%A0%E3%83%BC%E3%83%B3.m4a</string>
<key>File Folder Count</key><integer>-1</integer>
<key>Library Folder Count</key><integer>-1</integer>
</dict>

その中の、<key>Persistent ID</key><string>34B5886AA718721C</string>という部分を使う。

これらを組み合わせて下記のように解析できる。
Library Persistent IDが
B77A88149B472EF5
Persistent IDが
34B5886AA718721C
の場合、
Persistent IDの
下1の桁の値「C」を10進数にして13
10の桁の値「1」を10進数にして01
100の桁の値「2」を10進数にして02
なので、

アートワークがiTunesで自動的にダウンロードされたものなら、
iTunes > Album Artwork > Download > B77A88149B472EF5 > 13 > 01 > 02 > B77A88149B472EF5-34B5886AA718721C.itc

アートワークが自分で追加したものなら、
iTunes > Album Artwork > Local > B77A88149B472EF5 > 13 > 01 > 02 > B77A88149B472EF5-34B5886AA718721C.itc

という感じ。とりあえず今回はiTunes7.5.0.20、Windows XP環境でのチェックのみだったのでMacでのフォルダ構造については不明。この複雑な仕組みは、別ソフトなどで画像を簡単に利用されないようにアップルが工夫したものな気がする。なのでiTunesのバージョンアップで変わる可能性がおおいにあり。

*ただし、アルバム単位で画像を決めている場合、トラックごとに画像が保存されているわけではなく、共有画像として動いているらしいが、その仕組みはよくわからない。

*以前はjpgで保存されていた気がするが、今はitcという拡張子になっている。itcファイルに関してはここここを参考。


<div id="A">
<p><a>something link</a&></p>
</div>

となっているときに、<a>タグが効かないことがあった。
その場合、
#A {position:static;}
とすると動くようになった。もともとrelativeだった。理由はよくわからないけど、iepngfixが絡んでいる可能性あり。

husen.jpg
Think ITのこちらの記事を読みながら、オンライン付箋を実際に作ってみたものの、RoRとAIRのバージョンがあがっていてうまく動作しなかったり、最後までできたけどスクリプト中途半端だっりしたたので、ある程度動くものに改造してみた。

とはいうものの、
ActionScript2は結構さわっていたけど、AS3は今回はじめて。
AIRもはじめて。
Ruby on Railsもはじめて。
コマンドプロンプトなんていうのもよくわからない。
と新年早々初めて三昧気味だったので、全体的にやっつけ感もあるけど、まぁ最初はこんなもんだ。

以下覚えている注意点

Ruby on Rails (Rails v2.0.2, ruby v1.6.8) :

●「scaffold_resource」は「scaffold」になった(参考

●database.yamlでsyntax エラーが発生する(参考
adapter: mysql
encoding: utf8
database: stickes_development
username: root
password: *********
host: localhost
というかんじで「:」のあとにスペースが必要。
それぞれの項目の前にタブをいれてもエラーになった。

●InvalidAuthenticityTokenというエラーが出る(参考
protect_from_forgeryというので解決。


AIR (beta3):
●<rootContent>というタグはなくなったので<initialWindow>の中に<content>として入れる(参考

●xmlns="http://ns.adobe.com/air/application/1.0.M6"

あとの仕様の変更はたくさんありすぎて、覚えていない。
そういうのを調べつつ、記事を読みながら完成させたが、ちょっとご本人もお忙しかったのか、あまり良い出来のものではなかった。

そこでカスタムし、


  • アプリケーションを立ち上げると自動で付箋を読み込む

  • 付箋を移動すると、自動保存

  • テキストエリアに書き込むと、自動保存

  • xボタンを押すと、削除


と、ある程度実用的なものにしてみた。
(RoR側の変更はなし。)


stickies-app.xml


<?xml version="1.0" encoding="utf-8" ?>
<application xmlns="http://ns.adobe.com/air/application/1.0.M6" minimumPatchLevel="1047">
<id>jp.onlinehusen</id>
<version>1.0</version >
<filename>オンライン付箋</filename>
<name>オンライン付箋</name>
<description>Ruby on RailsとAdobe AIRでデスクトップアプリを作るデモ</description>
<copyright>Copyright 2006</copyright>
<installFolder>Adobe/Examples</installFolder>
<programMenuFolder>Adobe/Examples</programMenuFolder>
<initialWindow>
<content>menu.swf</content>
<title>online husen</title>
<systemChrome>standard</systemChrome>
<transparent>false</transparent>
<visible>true</visible>
<width>60</width>
<height>20</height>
<x>250</x>
<y>0</y>
<minSize>10 10</minSize>
<maxSize>100 100</maxSize>
<minimizable>true</minimizable>
<maximizable>false</maximizable>
<resizable>false</resizable>
</initialWindow>
<icon>
</icon>
<customUpdateUI>false</customUpdateUI>
<allowBrowserInvocation>false</allowBrowserInvocation>
</application>


menu.mxml


<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" width="100" height="20" creationComplete="load();" closing="onClosing(event);" >
<mx:Script>
<![CDATA[
public var stickies:Array = new Array();
public var stickNum:Number = new Number();
public function create():void {
var sticky:Sticky = new Sticky();
stickNum++;
sticky.id = stickNum;
var request:URLRequest;
request = new URLRequest("http://localhost:3000/stickies.xml");
request.method = 'POST';

var variables : URLVariables = new URLVariables ();
variables['sticky[x]'] = sticky.window.x ;// Capabilities.screenResolutionX;
variables['sticky[y]'] = sticky.window.y ;// Capabilities.screenResolutionY;
variables['sticky[width]'] = sticky.window.width;
variables['sticky[height]'] = sticky.window.height;
variables['sticky[body]'] = sticky.editor.text;
request.data = variables;

var loader:URLLoader = new URLLoader();
loader.load(request);
sticky.show();
stickies.push(sticky);
}
public function load():void {
var request:URLRequest = new URLRequest("http://localhost:3000/stickies.xml");
request.method = 'GET';
var loader:URLLoader = new URLLoader();
loader.addEventListener(Event.COMPLETE, function(e:Event):void {
var xml:XML = new XML(e.target.data);
var sL:Number = xml.sticky.length();
for each(var element:Object in xml.sticky){
var sticky:Sticky = new Sticky();
sticky.createNew = new Boolean(false);
sticky.id = element.id;
sticky.editor.text = element.body;
sticky.window.x = element.x; //* Capabilities.screenResolutionX;
sticky.window.y = element.y; //* Capabilities.screenResolutionY;
sticky.window.width = element.width;
sticky.window.height = element.height;
sticky.show();
stickNum = sticky.id;
stickies.push(sticky);
}
});
loader.load(request);
}

private function onClosing(event:Event):void {
for each (var sticky:Sticky in stickies) {
if(sticky){
sticky.window.close();
}}
}
]]>
</mx:Script>
<mx:Button left="10" top="10" label="new" id="new_btn" click="create();" />
<!--<mx:Button right="60" top="10" label="load" id="load_btn" click="load();" /> -->
<!-- <mx:Button right="10" top="10" label="save" id="save_btn" /> click="save();" -->
<!--<mx:TextArea right="10" top="40" left="10" bottom="10" id="messages" />-->
</mx:WindowedApplication>


menu.mxml


package {
import flash.text.*;
import flash.display.*;
import flash.events.*;
import flash.system.*;
import mx.controls.*;
import flash.net.*;
import flash.utils.Timer;

public class Sticky extends Sprite{
public var window:NativeWindow;
public var editor:TextField;
public var id:Number;
public var createNew:Boolean;
public var button:SimpleButton = new SimpleButton( );
public var timer:Timer = new Timer(1000,1);
public static var RESIZE_HANDLE_SIZE:int = 20;

public function Sticky():void {
timer.addEventListener(TimerEvent.TIMER,onTick);
var initOptions:NativeWindowInitOptions = new NativeWindowInitOptions();
initOptions.systemChrome = NativeWindowSystemChrome.NONE;
initOptions.transparent = false;
initOptions.type = NativeWindowType.LIGHTWEIGHT;
window = new NativeWindow(initOptions);
window.stage.align = StageAlign.TOP_LEFT;
window.stage.scaleMode = StageScaleMode.NO_SCALE;
editor = new TextField();
editor.x = editor.y = 0;
editor.selectable = true;
editor.border = false;
editor.type = TextFieldType.INPUT;
editor.multiline = true;
editor.background = true;
editor.wordWrap = true;
editor.backgroundColor = 0xE6E082;
window.stage.addChild(editor);
window.width = editor.width = 300;
window.height = editor.height = 100;

window.stage.addEventListener(Event.RESIZE, function(evt:Event):void {
resized();
});

window.stage.addEventListener(MouseEvent.MOUSE_DOWN,
function(evt:MouseEvent):void {
var x:Number = evt.stageX;
var y:Number = evt.stageY;
if (y > window.height - RESIZE_HANDLE_SIZE && x > window.width - RESIZE_HANDLE_SIZE) {
window.startResize(NativeWindowResize.BOTTOM_RIGHT);
}
else {
window.startMove();
}
}
);
window.stage.addEventListener(MouseEvent.MOUSE_UP,
function(evt:MouseEvent):void {
save();
}
);
editor.addEventListener(TextEvent.TEXT_INPUT,
function(evt:TextEvent):void {
if(timer){
timer.stop();
}
timerSave();
}
);
} // end of function Sticky

public function show():void {
window.visible = true;
//閉じるボタンの生成
button.x = window.width-15;
button.y = 5;
button.upState = createBox( 0xE6E082, 10 ,0.3);
button.overState = createBox( 0xE6E082, 10 ,1);
button.downState = createBox( 0xCCCCCC, 10 ,1);
button.hitTestState = button.upState;
button.addEventListener( MouseEvent.CLICK, onMouseDown );
window.stage.addChild( button );
}

public function resized():void {
editor.width = window.width;
editor.height = window.height;
button.x = window.width-15;
button.y = 5;
save();
}
public function save():void {
var request:URLRequest;
request = new URLRequest("http://localhost:3000/stickies/"+id+".xml");
request.method = 'PUT';
var variables : URLVariables = new URLVariables ();
variables['sticky[x]'] = window.x ;// Capabilities.screenResolutionX;
variables['sticky[y]'] = window.y ;// Capabilities.screenResolutionY;
variables['sticky[width]'] = window.width;
variables['sticky[height]'] = window.height;
variables['sticky[body]'] = editor.text;
request.data = variables;
var loader:URLLoader = new URLLoader();
loader.load(request);
}
private function onMouseDown(e:MouseEvent):void{
trace("onMouseDown");
var requ:URLRequest = new URLRequest("http://localhost:3000/stickies/"+id+".xml");
requ.method = 'DELETE';
var loader:URLLoader = new URLLoader();
loader.load(requ);
window.close();
}
private function createBox( color:uint, radius:Number ,vis:Number):Shape {
var xShape:Shape = new Shape( );
xShape.graphics.lineStyle( 1, 0x000000 );
xShape.graphics.beginFill( color );
xShape.graphics.drawRect( 0, 0, radius ,radius);
xShape.graphics.moveTo( 0, radius );
xShape.graphics.lineTo( radius, 0);
xShape.graphics.moveTo( radius, radius );
xShape.graphics.lineTo( 0, 0);
xShape.graphics.endFill( );
xShape.alpha = vis;
return xShape;
}
public function timerSave():void{
timer.start();
}
public function onTick (evt:TimerEvent):void {
timer.stop();
save();
}

} // end of class Sticky

} // end of package

ロリポップのサーバがこわれてデータが全部消えたので、mt4にしてみた。
rightfieldsがまだmt4に対応していないので、それまでpokeal playerは復活できません。
最近はflashにとどまらず、Ruby on RailsやAirのお勉強もしているので、そのへんのよしなしごとをメモしていきます。

このアーカイブについて

このページには、2008年1月に書かれたブログ記事が新しい順に公開されています。

次のアーカイブは2008年2月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

Powered by Movable Type 4.1