2009/07/31

[Objective-C]BOOLについて

よくtrue or falseを表すものとして、bool型がありますが、当然のごとくObjective-Cにもあり、サンプルソースを参考にしてみると、true場合はYES、falseの場合は、NOと大文字なんですよね。

JavaScript、PHP、Javaとやってきて、確か、どれも小文字でtrue or falseだったので、ちょっと新鮮に感じました。

まぁーサンプルソースにも、大文字で書かれていたので、特段気にする必要もないと思うのですが、第4回 変数のデータ型や文字列の扱いを理解しようを参考にする限り、大文字でいけるみたいです。

2009/07/30

[C]typedefって何??

リファレンスを見ていると、よく、「typedef」という文字をよく目にします。

これってなんだろーっと思い調べてみることに。

typedefは、C言語で使われているだろうことは、すぐに推測がつきました。

クラス型は、クラス型としてはっきり宣言されているので(例えば、UIViewは、UIResponder型を継承しています⇒厳密ではないがUIResponder型でもある)、あきらかにそれとは違う何かだとプンプン臭ったのでC言語だろーと予測。

案の定、google先生に聞いてみると、的中しました。

■型定義(Type Definition)

typedef T my_type;

識別子my_type が型T を意味することになります。

via:12. 型定義 typedef

というわけで、2つ目に注目すれば、いいわけですね。

これで、身構えることなく、さらにリファレンスがきちんと読めるようになりそうです。

2009/07/29

[Objective-C][iPhone sdk]UITouchのreleaseについて

UIViewは、UIResponderクラスを継承しているので、自動的に下記のメソッドを使うことができます。

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
}

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{
}

-(void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event{
}

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
}

そこで、各メソッドの中で
UITouch *touch = [touches anyObject];
と記述し、メソッドの最後に、
[touch release];
と書いて実行してみると、起動時は、うまくいくものの、一度、ホームに戻って再度、アプリを立ち上げると、異常終了となってしまいます。

おそらく実装上のミスなのですが、理由がちょっとわかりません。
宣言時に初期化を行っていないからなのかなーっと思っていますが。
(ex UITouch * touch = [[UITouch alloc] init];)

あまり気にしてしまうと、先に進まないので、とりあえず、releaseメソッドを書かずに、先に進んでいきます。

PS:そーいえば、サンプルアプリをいくつか見ていて、この記述がなかったので、やはり、書かない方が返っていいのかなーっと思っています。
メモリ管理も大変です。。。

2009/07/28

[Objective-C][iPhone sdk]imageの位置指定して表示

画像をUIImageViewを使って表示するのですが、表示位置が変更できないのかと思い、色々試したあげく結構、苦戦してしまったので、やりかたをまとめてみたいと思います。

まず最初に、思いついたのは、UIImageクラスのdrawAtPointメソッドを使って、画像の表示位置を変更する方法

UIView *contentView = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];

UIImage *image = [UIImage imageNamed:@"hoge.jpg"];
[image drawAtPoint:CGPointMake(50,100)];

ImageView *imageView = [[UIImageView alloc] initWithImage:image];
[contentView addSubview:imageView];

[window addSubview:contentView];
[window makeKeyAndVisible];

これを実行してみたところ、画像の位置は変更されませんでした。

リファレンスを参照したところ、確かに、drawAtPointメソッドは、引数の位置で表示すると書かれていたのに。。。

次に下の方法で試してみる。

UIView *contentView = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];

UIImage *image = [UIImage imageNamed:@"hoge.jpg"];

ImageView *imageView = [[UIImageView alloc] initWithImage:image];
[imageView.image drawAtPoint:CGPointMake(50,100)];
[contentView addSubview:imageView];

[window addSubview:contentView];
[window makeKeyAndVisible];

上との違いは、imageプロパティを経由して、drawAtPointを使っているところ。
でも、やはりこれも表示されず。。。

そこでgoogle先生に聞いてみたところ、同じような事例が
UIViewに座標を指定してImageを表示する。

【iPhone】UIImageとUIView
にありました。

参考にしながら、ソースに変更を加えていくと、最終的に下のソースで位置を変更することができました。
UIView *contentView = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];

UIImage *image = [UIImage imageNamed:@"hoge.jpg"];
ImageView *imageView = [[UIImageView alloc] initWithImage:image];
imageView.frame = CGRectMake(20, 100, image.size.width,image.size.height);

[contentView addSubview:imageView];

[window addSubview:contentView];
[window makeKeyAndVisible];

ここで問題なのが、drawAtPointメソッドを使わなくても、CGRectMakeファンクションで設定ができてしまうところ。

このやり方は、もともとわかっていたのですが、肝心の表示領域(位置ではなく)にあたる、第三引数と第四引数の設定がすぐに思いつかなくて、時間がかかってしまいました。

ようは、自分自身の横幅と高さを表示領域にしますよーと設定することによって、100%(1倍)の大きさに表示されるということ。

最初、これが閃いたときは、「ニヤリ」としてしまいました。

今は、iPod touch(iPhone)を触った時に、画像が動的に変更されるようにする方法について、試行錯誤中です。

2009/07/27

[mac]無線LAN接続

ちょっと前まで、T.Sato君と、無線LANの購入及び、飲み(お疲れさまでした!!楽しかったぜ♪)がありました。

で、この無線LANを選んでくれました。



まず何よりも素晴らしいのが、mac book、iPod touchともに、ドライバをインストールせずに、無線で接続できてしまったこと。

ドライバをいれるのが大の苦手なので、ものすごく助かりました。

10分たらずで、接続できちゃいました。

パスワードをもとめずに接続できちゃったんだけど、そこは設定しだいで、パスワードをもとめるように変更できるので、セキュリティ面もばっちり。

これで、iPod touchのネットワークを使った実機テストもできそうです。

いやーそれにしても実にいい

2009/07/26

[Objective-C][iPhone sdk]imageをプロジェクトに移動

日曜でも、嫁が遊びに行っている一方で、プログラミングをしている今日このごろですが、皆さんはいかがおすごしでしょうか?

UIImageクラスを使って画像を表示したい場合、finderからXcodeのプロジェクト上に画像をドラッグすると、下のようなものが表示されました。

Photobucket
一番上の、デスティネーショングループのフォルダに項目をコピーするには、問題なくチェックをいれたのですが、疑問に思ったのが、次のラジオボタンのところ

「追加したフォルダに再帰的にグループを作成する」

「追加したフォルダにフォルダ参照を作成する」
の違い。

結果的にどちらにつけても、画像が表示されたのですが、どう違うのかわからん。

Xcodeのリファレンスを読まないとわからないものだろうか??

2009/07/25

[Objective-C][iPhone sdk]navigationバーのtitleを表示

昨日のエントリーでは、表示されない現象について書きました。

で今日は、その続きからで、表示する方法について。

結果から言うと、下の図のようになります。

Photobucket

肝心のソースコードですが、下のようにすることで、表示できるようになりました。

UIViewController *contentViewController = [[UIViewController alloc] init];
contentViewController.title = @"hoge";

UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:contentViewController];

[window addSubview:[navigationController view]];
[window makeKeyAndVisible];

で、どうしてできるようになったかというのは、ここのスレッドを読んでできるようになったと思う。

前回と違う点は、最初に、UIViewController型のインスタンス変数を宣言し、そっちにタイトルを設定したこと。

次に宣言したインスタンス変数を初期値とする、UINavigationControllerのインスタンス変数を作りだし、それをUIWindowに貼付けました。

これでも違いがよくわからないので、図で表現してみたいと思います。

昨日の場合、オブジェクトを図にしてみるとこんな感じになるのではないかと。

Photobucket
この場合、UIWindow(iPhone上では実態のないwindowで表示されない。)に貼り付いているのは、ヘッダーを設定したUINavigationController型の中にセットされているview(肌色の部分)なのでタイトルがでてこないのかなーっと。

逆に今日のソースは、

Photobucket
となり、あらかじめベースとなるインスタンス変数(UIViewController)をもとに、UINavigationController型のインスタンス変数を作り出したので、UINavigationController型のインスタンスのviewはあらかじめヘッダーのついているviewとなっており、結果として、無事にタイトルが出力されたのではないかと。

話は変わりすが、上の図、mac用のエクセルで作ったのですが、図形がめちゃくちゃかっこいい。

windowsのoffice2003とは大違いだ。
office2007もこんな感じなのかな??

たいして違いがないかもしれないけど、ちょっとしたおもてなしで、こうも創作意欲が変わってくるから、物作りってホント奥深いなーっとシミジミ思うのであった。

2009/07/24

[Objective-C][iPhone sdk]navigationバーのtitleが表示されない

今、navigationバーにタイトルだけ表示したいのですが、navigationは表示されるのに、なぜか、titleが表示されませんでした。

現象として下のイメージのようになりました。
Photobucket

結果的に、原因というか、表示できるようになったのですが、とりあえず、現象が再現できるソースを記しておき、次のエントリーで表示されるプログラムをのせたいと思います。

UINavigationController *contentViewController = [[UINavigationController alloc] init];
contentViewController.title = @"hoge";
[window addSubview:[contentViewController view]];
[window makeKeyAndVisible];

2009/07/23

[objective-c]CGFloat型について

夜中に、CoreGraphicsフレームワークのCGRectMake関数を使う機会があったのですが、その中で、コールする際の引数の型が、CGFloat型と記載されていたのですが、おそらくfloat型だと思うんだけど、もし違っていたら、とか、本当にfloat型なのかと疑ってしまうと、どーしても気になってしまい(本当は気にしなくてもいいかもしれないのだが)、どのような型なのか気になって、ぐぐってみたところ、プログラマメモ2: CGPointとか。あとNSLogとか。で、「float型」と記載されていました。

ただ上のリンクは、どこからfloat型と判断したのかが記載されていなくて、もうちょいぐぐってみると、こちらのサイトで「CGGeometry Reference」に書いてあり、実際にリファレンスを当たってみると、きちんとした定義がやはりない。

おそらく、判断された理由として、同リファレンスの最後の
CGFLOAT_MIN
CGFLOAT_MAX
CGFLOAT_IS_DOUBLE
の定数定義(厳密に言えば、C言語のマクロなのですが)があるのですが、その定義を読まれて判断されたのではないかと推測。

いずれにせよ、2件、float型となっているので、ちょっとまだ気持ち悪いがfloat型と判断して、アプリ開発をすすませていきたい。

2009/07/22

[mac]DropFixインストール

ちょっとiPhoneのアプリ制作で、画像を取り扱いたかったので、一括で画像の大きさを変換できるソフトを探していたら、ベクターDropFixというフリーソフトを発見しました。

さっそくインストールしてみたのですが、ものすごく便利です♪

2009/07/21

[mac]アプリケーションの起動方法

今更ながらなのですが、実は、アプリケーションを起動する時、下のサイドバーを使っていたのですが、Finderからの起動方法がようやくわかりました。

「アプリケーション」フォルダの中に、アプリケーションのアイコンがいっぱいあるので、その中から起動させたいアプリケーションをダブルクリックすればいいんですね。

[mac]Office 2008 for Mac ファミリー&アカデミックゲット

ついにゲットしました。



購入理由として、macでプレゼンテーションシートを作ってみたり、ドキュメントを作ってみたりしたかったからです。

しかも、2008と最新版!!

価格.comで比較するとamazonが一番安かったので、初めてamazonでPCソフトを購入。

普通にインストールできましたし、起動してみたところ、それぞれちゃんと使えました。

しかし、wordとexcelとパワポだけほしかったのですが、なぜか、messangerがついてきていて、さらにentourageというわけのわからんソフトまで付属していました。

messangerをつかっていないので、そっこーでショートカットから削除したのですが、このEntourageは、hatenaで調べてみると、mac版のoutlookとか。

あと、ちょっと気になったのですが、windows office製品と比べて価格が若干安いのは気のせいだろうか??

本来ならofficeよりも高くてもいいような気がするのですが。

やはり本家より安くしないと、誰も買わないというマイクロソフトの戦略なのだろうか?

そもそも、office2007は、最近、パソコンを買ったら、初期インストールされているから、そことの折り合いでこの価格帯になったのか。

うーん、ちょっと気になるところではありますが。
そこばかり気にしてもしょーがいないので。

これで、iPhoneのアプリケーションの設計書やらDB定義書がクライアントで奇麗にかけるぞと。

2009/07/20

[本]詳解 Objective-C 2.0

読了しました。



CAPTER01:オブジェクトに基づくソフトウェアの作成
CAPTER02:Objective-Cのプログラム
CAPTER03:継承とクラス
CAPTER04:オブジェクトの型と動的結合
CAPTER05:リファレンスカウンタを用いたメモリ管理方式
CAPTER06:ガーベジコレクション
CAPTER07:NSObjectクラスとランタイムシステム
CAPTER08:Foundationフレームワークの重要なクラス
CAPTER09:カテゴリ
CAPTER10:抽象クラスとクラスクラスタ
CAPTER11:プロトコル
CAPTER12:宣言プロパティとアクセサ
CAPTER13:オブジェクトのコピーと保存
CAPTER14:メッセージ送信のパターン
CAPTER15:アプリケーションの構造
CAPTER16:例題: 簡易画像ビューア
CAPTER17:例外とエラー
CAPTER18:スレッド
CAPTER19:分散オブジェクト
CAPTER20:キー値コーディング

via:目次


本書は、objective-cをあますところなく網羅した現在入手できる中で最もバイブル的な存在といえる作品。

objective-cの入門書としても最適ともいえる。

がしかし、本書は、後半になるとちょっとコードの誤植が多いように思える。
後、サイトを見に行ったのですが、正誤表が見当たらなかったのは、調査不足なのだろうか?

後、本書は、「objective-c」の入門書であって、決して、「プログラミング」んの入門書ではないことに注意したい。

読む上に当たって、「C言語」の知識は必須である。

わざわざ、「int型」は・・・
とか、
関数定義の方法やら
は残念ながらでてこない。

C言語に加えて、Javaも少しかじっているとさらに理解しやすいかもしれない。
同じオブジェクト指向の言語なので、「Javaでいうところの○○○だ」と脳内変換しながら読むことができるからである。

ただJavaよりも若干難しいようにも思えるかもしれない。
(実際に、そう思った。)
というのも、メモリ管理が登場するからである。
(メモリ管理だけで判断するのも、どうかと思うのだが)

後、propertyの概念もJavaになかったような気がしたので。

Java++の++部分が、ものすごく濃厚なんですよね。

そういった技術的なことに加え、オブジェクト指向を使った代表的なデザインモデルも登場するからなおさらである。
delegate
MVC
など。。。

それにしても、本書を読んで、改めてC言語の大切さを思い知らされました。

しかも、Javaと同様にObjective-Cでは多重継承を許してないのですが、それを許してしまっているC++ってどうなっているんだよ?と改めて言語としての難しいさを認識することになりました。

大学の時に、C言語をやったのですが、宿題をほぼ友達にまかせっきりだったので、こうなるんだったら、もっとちゃんとやっておけばよかったといまさらながらに後悔しました。

2009/07/19

[objective-c]書籍の漏れ その3

また抜けを発見してしまった。



Chapter19の分散オブジェクトで、List19-7はUroView.hのソースコードが記載されているのだが、これをそのまま書いただけだとコンパイルエラーになってしまいます。

それを回避するには、2行目に、

#import "type.h"

がいります。

いやーこれをぬかすってどうよー??

2009/07/18

ドラクエとマックがコラボ

これマックの株主として、また、ドラクエ好きとしてものすごく気になる。

最大手ハンバーガーチェーン店のマクドナルドが7月11日に発売されたスクウェア・エニックスの人気シリーズの最新作「ドラゴンクエストIX 星空の守り人」とコラボレートした企画として、店頭でオリジナルコンテンツの配信を行うことが明らかになりました。

via:マクドナルドが店頭でドラクエ9のオリジナルゲームを配信、ハンバーガー無料券も

いいねー。

なんといっても素晴らしいのは、ドラクエをもっていなくてもチャレンジできること。

5回チャレンジするとハンバーガーの無料券がくれるというマジパネエ。

ワイアレスゲートに入会しているので、ちょーどwifiも使えるし、いいねー♪

今度、マック行った時にやってみたいなーっと。

2009/07/17

[life hack]数学って意外と使える??

ずーっと大学の勉強なんて意味がねーって思っていたのですが、最近、そうでもないかもーって思う局面がありました。

Googleのページランクにも使われているマルコフ連鎖を利用して文章を要約、もしくは意味不明にする「マルコフ連鎖ジェネレーター」という記事を読んで、なんと、googleのpage rankはマルコフ連鎖が使われているんですって。

「マルコフ連鎖って大学の内容じゃん」っと思った次第であります。
(高校では、マルコフ連鎖はやりません。)

マルコフ連鎖って、前の事象によって、次の事象が制限されてしまう現象なんですけど、例えば、今日、カレーを食べたとします。

そしたら、たいていの場合、次の日、カレーを食べようとはあまり思わないでしょう。
(かならず当てはまるというわけではありませんが。)

これは、カレーを食べなかったら決して発生しなかった事象であって、前の事象、つまり、今日、カレーを食べてしまったがために次の日の食事内容が制限されてしまったということを示した一例です。

たまーに、仕事で数学の話を持ちかけると、きょとん顔をされてしまうのですが、ことIT業界において、数学は大事なんじゃないかなーっと思うのですが、いかがでしょう?

もちろんIT業界以外の人と会話をするときには、数学は持ち出しませんが。

同様にシミュレーションなんかは物理も大事なんじゃないかと。

こうやって裏付けのある記事が紹介されると本当にうれしい。

ちなみに、一番最初に数学を仕事で使うんじゃーないのかなーっと思ったのは鍵の話を知った時でした。

なんかまとまりのない締めになってしまった。

2009/07/16

[objective-c]書籍の漏れ その2

昨日に引き続き、今日も誤りを発見したので、追記しておく。



chapter17は例外処理の項目なのだが、List17-1のソースで下記のような記述がある。

if(argv == 1){

これは間違い。

コンパイル自体は警告のみで、実行もできるのだが、欲しい結果は得られない。

ただしいソースはこれだ。
if(argc == 1){

たった一文字違うだけでも、どえらい違いである。

まー人が作ったものだから完璧なんてなく、間違いは当然あるものなんだけど。。。

うーーーん。

2009/07/15

[objective-c]書籍に一部不具合(漏れ)あり

今、この書籍に仕掛かり中なのですが、、、



Chapter16でサンプルアプリケーションを作る際に、ソースが記述されているのですが、一部、漏れがありました。

というのも、そこが漏れていると100%コンパイルできないからです。

webページからサンプルコードをダウンロードして、確認したところやはり書籍の漏れでした。

具体的には、p382ページの「WinCtrl.h」ファイルのインスタン変数の宣言部に下記の部分を追加する必要があります。

NSUndoManager *undoManager;

この部分がないと、コンパイルができません。

おかげで、まるまる2日以上かかってしまった。

今週中には、本書籍を読了しないなと思っています。

2009/07/14

[gadget]tabを作成する

今回、tabの仕様変更も入ってしまったので、ちょっと確認してみる。

ざっと作ってみた感じこのようになった。

<?xml version="1.0" encoding="UTF-8" ?>
<Module>
<ModulePrefs title="test"
directory_title=""
title_url=""
description=""
author="maito.kuwahara"
author_email="mai.musicfactory+gadgetfactory@gmail.com"
author_affiliation=""
author_location="japan"
screenshot=""
thumbnail=""
height="200"
author_photo=""
author_aboutme=""
author_link="http://temping-amagramer.blogspot.com/"
author_quote=""
>
<Require feature="opensocial-0.8"/>
<Require feature="dynamic-height"/>
<!-- タブを追加することを宣言する -->
<Require feature="tabs"/>
</ModulePrefs>
<!-- 最後に選択されたタブはどこか情報を格納しておく変数 -->
<UserPref name="selectedTab" datatype="hidden"/>
<!-- home view -->
<Content type="html" view="home">
<![CDATA[
<script type="text/javascript">
//tabオブジェクトを新規に作成
var tabs = new gadgets.TabSet(__MODULE_ID__);
//tabオブジェクトにtabを追加する(tabの名前はone)
var one_id = tabs.addTab("One");
//tabオブジェクトにtabを追加する(tabの名前はtwo)
var two_id = tabs.addTab("two");
//作成したoneタブにコンテンツを追加する
document.getElementById(one_id).innerHTML = "Content for tab One.";
//作成したtwoタブにコンテンツを追加する
document.getElementById(two_id).innerHTML = "Content for tab two.";

//gadgets.window.adjustHeight();
</script>
]]>
</Content>
<!-- canvas view -->
<Content type="html" view="canvas">
<![CDATA[
canvas viewです。
<script type="text/javascript">
gadgets.window.adjustHeight();
</script>
]]>
</Content>
<!-- home、canvas viewに対応していない場合 -->
<Content type="html">
<![CDATA[
<script type="text/javascript">
//tabオブジェクトを新規に作成
var tabs = new _IG_Tabs(__MODULE_ID__);
//tabオブジェクトにtabを追加する(tabの名前はone)
var one_id = tabs.addTab("One");
//tabオブジェクトにtabを追加する(tabの名前はtwo)
var two_id = tabs.addTab("two");
//作成したoneタブにコンテンツを追加する
document.getElementById(one_id).innerHTML = "Content for tab One.";
//作成したtwoタブにコンテンツを追加する
document.getElementById(two_id).innerHTML = "Content for tab two.";

//_IG_AdjustIFrameHeight();
</script>
]]>
</Content>
</Module>

まず最初に、Requireタグのfeature="tabs"が必要。

次に、最後に選択されたタブの情報を残しておくのに、UserPrefタグを追加しました。

で、実際の作り方ですが、new gadgets.TabSet(__MODULE_ID__)で新規にオブジェクトを作ります。

これだけだと、ただオブジェクトを作っただけで、タブは表示されません。

表示するには、addTabメソッドを使って追加していきます。
addTabメソッドの引数の数は、いくつかありますが、最初の引数はtabの名前です。

返り値が、どうやら、htmlのid属性に相当するものなので、document.getElementByIdを使ってコンテンツをセットします。

ここまでで重要なことは、open socialバージョンのiGoogleと非対応のiGoogleガジェットでは、オブジェクトの作成方法が若干違うところ。

非対応の場合だと、new _IG_Tabs(__MODULE_ID__)と書かなくちゃーいけないんですね。

最後に上のソースの実行結果を、載せておきます。

Photobucket

Photobucket

昔のgadgetの仕様書では、一つ一つ画像がついていて、すっげーわかりやすかったのですが、最近の仕様書は、めっきり画像がなくなってしまい、直感的にわからなくなってきたなー。

ちょっとこの点について不親切かなと思います。

2009/07/13

[gadget]動的に高さを変更する

ガジェットのコンテンツが次々に変更されていく中で、どうしても高さを変更したくなる時があります。

そんな時は、下のようにタグ及び関数を追加すれば可能となります。

<?xml version="1.0" encoding="UTF-8" ?> 
<Module>
<ModulePrefs title="test"
directory_title=""
title_url=""
description=""
author="maito.kuwahara"
author_email="mai.musicfactory+gadgetfactory@gmail.com"
author_affiliation=""
author_location="japan"
screenshot=""
thumbnail=""
height="200"
author_photo=""
author_aboutme=""
author_link="http://temping-amagramer.blogspot.com/"
author_quote=""
>
<Require feature="opensocial-0.8"/>
<!-- このタグは必須 -->
<Require feature="dynamic-height"/>
</ModulePrefs>
<!-- home view -->
<Content type="html" view="home">
<![CDATA[
home viewです。
<script type="text/javascript">
//この関数を呼び出すと高さが変更される
gadgets.window.adjustHeight();
</script>
]]>
</Content>
<!-- canvas view -->
<Content type="html" view="canvas">
<![CDATA[
canvas viewです。
<script type="text/javascript">
//この関数を呼び出すと高さが変更される
gadgets.window.adjustHeight();
</script>
]]>
</Content>
<!-- home、canvas viewに対応していない場合 -->
<Content type="html">
<![CDATA[
defualtのviewです。
<script type="text/javascript">
//この関数を呼び出すと高さが変更される
_IG_AdjustIFrameHeight();
</script>
]]>
</Content>
</Module>

一番最後だけ、_IG_AdjustIFrameHeight();となっているのは、open socialに準拠していないiGoogle gadgetに対応させるためです。

後、Requireタグ自体は、特に悪さをしないので、ファンクションを呼び出さなくても書いておいたほうが後で使う場合もあるかもしれないので便利かなーと思います。

2009/07/12

[24]すでにレンタルが始まっていた

そうだ、既にレンタルが始まっていたんだ。

7月に始まると思っていたんだけど、3日だったとは。

どうして気がついたかというと、こちらのブログを拝見して↓
超局所的シネマレビュー: キャラクターを深く知ればドラマも深く『24 シーズンVII』

5で死んでいたと思われていたトニーが生きていたのですが、果たしてどうなることやら



2009/07/11

ドラゴンクエスト発売!!

今日、やっと新作のドラゴンクエストが発売しました。

amzonレビューをちょっと読むと、どうやらギャル妖精がウザイみたいです。

2009/07/10

明日は、ドラゴンクエスト9

の発売日だー。

なんかわくわくするなー♪



しかも、今、テレビゲーム部門で1位だ。

[gadget]各viewにhello world

昨日、viewの紹介をしたので、今日は、実装方法について。

まず、単純に各viewに対して、文字を表示してみたいと思います。

基本的にはgadgetには、決まった約束があるのですが、ファイル形式はxmlです。

<?xml version="1.0" encoding="UTF-8" ?> 
<Module>
<ModulePrefs title="test"
directory_title=""
title_url=""
description=""
author="maito.kuwahara"
author_email="mai.musicfactory+gadgetfactory@gmail.com"
author_location="japan"
screenshot=""
thumbnail=""
height="200"
author_photo=""
author_aboutme=""
author_link="http://temping-amagramer.blogspot.com/"
author_quote=""
>
<Require feature="opensocial-0.8"/>
</ModulePrefs>
<!-- home view -->
<Content type="html" view="home">
<![CDATA[
home viewです。
]]>
</Content>
<!-- canvas view -->
<Content type="html" view="canvas">
<![CDATA[
canvas viewです。
]]>
</Content>
<!-- home、canvas viewに対応していない場合 -->
<Content type="html">
<![CDATA[
defualtのviewです。
]]>
</Content>
</Module>

xmlは大元となるタグが存在するのですが、それはModuleタグが担っています。

次に、ModulePrefsタグの属性をそれぞれ解説していくと、
title="ガジェット上に表示されるタイトル"
directory_title="iGoogle gadgetの検索結果に表示される時のタイトル"
title_url="タイトルをクリックした時に遷移されるurl"
description="gadgetの詳細"
author="gadgetの作者"
author_email="gadget作者のメールアドレス"
screenshot="gadgetの詳細画面に表示される画像(280ピクセルでpngが望ましい。)"
thumbnail="gadgetの検索結果時に表示される画像(120x60ピクセルでpngが望ましい。)"
author_affiliation="gadget作者が所属している"
author_location="gadget作者が住んでいるところ"
author_photo="gadget作者の写真(70x100ピクセルでpngが望ましい)"
author_aboutme="gadget作者に関して500文字以内で"
author_link="任意のurl"
author_quote="引用したい言葉300文字以内で"
author_affiliation="gadget作者の所属"
height="gadgetの高さ(後で、動的に変更ができる)"
ってな具合になっていると思う。
(see also:Gadgets XML Reference)

author_XXXで始まるのは、authorページで表示されるものを設定しています。

もし、自分が作ったgadgetが超人気になった場合、上位ページに表示されるので、その場合に備えて記入しておいた方がいいと思います。

次に、Requireタグですが、いくつかあって、今回は、feature="opensocial-0.8"を書いています。

これは、open socialを意識したgadgetを作成しますよーっと意思表示したタグです。

次に、Contentタグですが、

view属性の値が

home

canvas

何もない

と3つのバリエーションがあります。
(いずれもtype="html"です。)

基本的にtypeはhtmlでよくて、他にもurlという属性値があるのですが、今回はしょーりゃく。

で、上の3つの違いですが、これは昨日、紹介したとおり、3種類のviewをあらわしています。

homeは、home view

canvasは、canvas view

何もないのは、
home viewとcanvas viewに
対応していないview
とまさにそのまんまですね。

各viewに表示するコンテンツは、
<![CDATA[から]>までの部分に記述します。
htmlタグ、headタグ、titleタグ、metaタグなどは必要なく、bodyタグ内に記述するものをそのまま書けばオッケーです。
もちろん、scriptタグを書いて、javascriptを実行したり、styleタグを使って、cssの設定することも可能です。

後は細かいjsのファンクションを覚えていくだけなので、楽勝ですね。

2009/07/09

[gadget]viewの定義

最近、iGoogleのみでなく、mixiもopen socialに準拠したgadgetをサポートしはじめたので、view(実際に画面に表示されるウィンドウ)について改めて確認してみたいと思う。

今回、iGoogleとmixiで確認してみる。

まず、トップページに表示されるのが、home viewです。

iGoogle
Photobucket

mixi
Photobucket

iGoogleの場合、おそらく普段使っている画面とはちょっと違うと思います。
これは、open socialに準拠した開発者専用のsandboxバージョンで、普通にiGoogleを開いただけでは表示されません。

sandboxのログイン方法は別途書きたいと思っています。

mixiの場合は、そのままトップページの右側のサイドバーに表示されるのが、home viewとなります。

canvas view

iGoogle
Photobucket

mixi
Photobucket

iGoogleの場合、左側のサイドバーに表示されたgadgetの名前をクリックした時に表示される、gadgetメインページです。

選択されたgadgetがデカデカと表示されます。

mixiの場合は、home viewで表示されたgadgetのタイトルをクリックすれば、canvas viewに遷移します。

あと、おまけでiGoogleの場合は、上記の2つ以外のページがあります。
Photobucket
現在、iGoogleで正式に運用されているのが、上の画面で、open socialを意識した作りになる前はこのようになっていました。

他にもviewがあるのかもしれませんが、これぐらい把握しておけば、開発する際には、困らないぞと。

2009/07/08

[iPod]OS 3.0にバージョンアップ

しました。

ずっとどうしようかなーっと悩んでいたのですが、知り合いとメールをしていて、バージョンアップに踏み切ることにしました。

だって、バージョンアップをするのに1200円かかるんですよ。

ちょっと高いと思いませんか??

どちらにしよ、sdkでアプリを開発している以上、しなければならないのですが。

バージョンアップして最初に思ったことですが、ボイスレコーダーって使えるのでしょうか?
iPod touchの場合、音声入力できないような気がするのですが。。。

2009/07/06

[coldfusion]バージョンナンバーごとに処理を分ける

たまたま、CFのバージョンナンバーを取得する方法がわかったので、バージョン毎に処理をわける方法について考えてみる。

といっても、↓のプログラムを貼り付けただけなんだけどね。

<cfset cf_version_number = Server.ColdFusion.ProductVersion>
<cfset cf_version_number = left(cf_version_number,1)>

<cfswitch expression="#cf_version_number#">
<cfcase value="7">
foo
</cfcase>
<cfcase value="8">
hoge
</cfcase>

</cfswitch>

Server.ColdFusion.ProductVersionで、バージョン番号が取得できるんですね。

リファレンスに書いてありました。

ただ、これだと少数点以下の数字ももれなくついてきちゃうので、left関数で、大元の番号を取得し、後は、cfswitchに流し込むだけ。

すっきり書くことができました。

2009/07/02

[coldfusion]タグのコメントについて

こう書いてもばぐらないらしい。

<!cfset hoge = "" >

どうやらCF君は、自分のタグではないと認識するみたいです。

はじめて知った。

2009/07/01

[coldfusion]version8について

さっき、8についてちょっと書いたので。

8でまず目についたのは、img系操作のタグないし関数が増えたかなと。

これもjavaでオブジェクトを作成した上で、バイナリファイルをいじる必要があったので、その手間が省けていいのかなーっと。

この点では、完全に、phpに負けていましたね。

後、ajax関連のタグ・関数が増えていますが、特段、普段から使っている人にとっては、今更感があるのかなと。

[coldfusion]createobjectの属性が追加された

どうやら8から属性が追加されてみたいです。

追加された属性は、主に、プロキシ関連なのですが、おそらく、restやsoap通信をプロキシを通して行う際に、ネイティブにjavaのオブジェクトを作る必要があったので、問い合わせが多かったんじゃーないのかなーっと思っています。

リファレンスはこちらから