昨日の15日に、Eclipseプラグイン開発のための勉強会「EclipSKY」に参加してきました。
竹添さん著のEclipseプラグイン開発本である「Eclipse 3.4 プラグイン開発徹底攻略(青本) 」を持参することが参加の条件でした(半分ホント)。もちろん全員持参してきました。

テーマとして、OpenSocialアプリケーションの開発環境であるOpenSocial Development Environment(OSDE)の紹介と、OSDEの中で「ここは便利」「ここはイケてない」という箇所を、ソースコードを実際に見ながら議論しました。
[イケてる箇所]
・MasterDetailsBlockの利用
[イケてない箇所]
・例外発生を防ぐための、時間差ILaunch実行(timerExec()で3秒待つ、とか)。
・MultiPageEditorでのページ間の編集内容の同期方法(EditorInputの実装をサボった結果、dirtyフラグ見て自前で同期、とか)
残りのテーマは、ここで紹介されていますので、そちらをどうぞ。
最後に話していたこととして、Eclipseプラグイン開発はやっぱり難しいよね、Ajaxアプリの方がリッチに作れちゃうよね、とか、Eclipseで作ることの意義をどう探していくかが課題なのかなぁ、と。開発環境以外で、結局Eclipseベースでアプリケーションを作る利点って何なんだろう、と考えさせられます。特にユーザエクスペリエンスがいいわけでもないし。。。
次回は「プラグイン開発で困ったことを付箋で貼っていって、みんなで解決!」「AIR開発環境の紹介」がテーマとなりそうです。いつ開催されるかわかりませんが、もしEclipseプラグイン開発に興味があれば、ぜひ次回参加してみてください。
- Posted:
- 02.16.2009
- Category:
- Eclipse

Eclipse Plug-in開発に関する勉強会「EclipSKY」が、明日開催されます。
EclipSKY200902 〜OSDEとかのソースコードからプラグインのコードのおいかけ方を学ぼう
http://atnd.org/events/351
テーマとして、OpenSocialアプリケーションの開発環境である「OpenSocial Development Environment」のコードを見て頂きながら、Eclipse Plug-inの開発に関する知見を参加者の間で共有したいと思っています。
http://www.eisbahn.jp/trac/osde
もしEclipse Plug-in開発に興味がある方は、ぜひご参加ください。
- Posted:
- 02.14.2009
- Category:
- Eclipse

Developers Summit 2009にて「OpenSocialパネルディスカッション」が行われました。僕もパネラーの一人として参加してきました。以下は、その時に使用した資料です。
内容としては、他では聞くことができない、非常に濃いものだったと思います。参加した僕でさえ、非常に興味深い話題の連続でした。
来場頂いた方々には、深く感謝いたします。ありがとうございました。
それにしても、来場してくれた方々の8割以上がOpenSocial入門本を購入していただいているとは。。。涙が出るほど嬉しいのと同時に、改めてOpenSocialについて今まで以上に真剣に取り組まなければ、と決意をした瞬間でした。
明日は、デブサミ版OpenSocial Hachathonが行われます。興味のある方は、ぜひHackathon会場にいらして頂き、雰囲気を感じてくださると嬉しいです。
- Posted:
- 02.12.2009
- Category:
- OpenSocial

先月出版させていただいたOpenSocial入門本ですが、Sun Developer Connectionにて紹介していただきました。
Book Review
OpenSocial入門 ~ソーシャルアプリケーションの実践開発
http://sdc.sun.co.jp/news/2009/02/bookreview.html
著者の自分よりも、的確に紹介していただけています。OpenSocialは成功者になれるチャンスが誰にでも平等にあります。OpenSocialの世界に興味のある方には、ぜひOpenSocial本を手にして頂ければ、と思います。
- Posted:
- 02.12.2009
- Category:
- OpenSocial

OpenSocialコンテナを搭載した「Project SocialSite」をテーマに連載を担当させて頂いた「Project SocialSiteで実現するWebのソーシャル化」の最終回が公開されました。
Project SocialSiteで実現するWebのソーシャル化 – Sun Developer Connection
http://sdc.sun.co.jp/java/series/socialsite/index.html
JavaEEの認証機構とソーシャルグラフの統合、そしてOpenSocialアプリケーションの作成と配置まで説明しています。ぜひお読みください!
- Posted:
- 02.12.2009
- Category:
- OpenSocial

2月12日、13日に今年もDevelopers Summit 2009が目黒雅叙園にて開催されます。
OpenSocialに関係するセッションとして、「OpenSocialパネルディスカッション」が注目です。
—
OpenSocialパネルディスカッション 2009年、OpenSocial普及元年に「これから」を大予言
お茶の間から世界へ、そんなことがソフトウェア開発の現場でも実現する時代が来ました。今まで、世界で使われるソフトウェアを作るために必要だった前提条件が、OpenSocialが世の中に広がっていくことで、個人や中小のソフトハウスでも、いきなり世界デビューが可能です。そんな夢のようなプラットフォームを自由に乗りこなすために、何の前提条件が必要か、コンテナベンダ、デベロッパー、それぞれの立場の有識者に、語っていただきます。
—
パネリストは以下の方々です。
[モデレータ]
川崎 有亮(リクルート)
[パネラー]
石原 直樹(Google)
小山 浩之(mixi)
北村 英志(NTTレゾナント)
白石 俊平(あゆた)
矢野 りん
田中 洋一郎
gooホームやmixi、OpenPNEを始め、今年は複数のOpenSocial環境が整う、言わば日本のOpenSocial元年です。OpenSocialに関して、マーケティング面、技術面、デザイン面、収益化など、OpenSocialが今後インターネット上でどのような役割を担っていくか、そして開発者はどう接していくべきか、などを議論する予定です。
ご興味のある方は是非ご参加ください。参加申し込みは以下のサイトから行うことが可能です。
参加登録 | Developers Summit 2009
http://codezine.jp/devsumi/2009/touroku/
では当日皆さまとお会いできるのを楽しみにしております。
- Posted:
- 02.06.2009
- Category:
- OpenSocial

OpenSocialでは、SNSが持つ会員の情報を扱うために、予め情報の項目が規定されています。その項目群は、いくつかの主要SNSを調査した結果から最大公約数的に選ばれた項目によって定義されています。その項目数は、かなりの数となります。
その多さは、以下のコードを見れば実感することができるでしょう。このコードは、ある一人の会員情報をJavaにて構築する例です。このコードは、OSDE内で利用されています。
private Person createCanonicalPerson() {
Person canonical = new PersonImpl();
canonical.setId("canonical");
canonical.setAboutMe("I have an example of every piece of data");
canonical.setActivities(Arrays.asList("Coding Shindig"));
Address address = new AddressImpl();
address.setCountry("US");
address.setLatitude(28.3043f);
address.setLongitude(143.0859f);
address.setLocality("who knows");
address.setPostalCode("12345");
address.setRegion("Apache, CA");
address.setStreetAddress("1 OpenStandards Way");
address.setType("home");
address.setFormatted("PoBox 3565, 1 OpenStandards Way, Apache CA");
canonical.setAddresses(Arrays.asList(address));
canonical.setAge(33);
BodyType bodyType = new BodyTypeImpl();
bodyType.setBuild("svelte");
bodyType.setEyeColor("blue");
bodyType.setHairColor("black");
bodyType.setHeight(1.84f);
bodyType.setWeight(74f);
canonical.setBodyType(bodyType);
canonical.setBooks(Arrays.asList("The Cathedral & the Bazaar", "Catch 22"));
canonical.setCars(Arrays.asList("beetle", "prius"));
canonical.setChildren("3");
Address currentLocation = new AddressImpl();
currentLocation.setLatitude(48.858193f);
currentLocation.setLongitude(2.29419f);
canonical.setCurrentLocation(currentLocation);
canonical.setBirthday(Gadgets.getDate(1975, 0, 1));
canonical.setDisplayName("Shin Digg");
canonical.setDrinker(new DrinkerImpl(Drinker.SOCIALLY, "Socially"));
ListField email = new EmailImpl();
email.setValue("shindig-dev@incubator.apache.org");
email.setType("work");
canonical.setEmails(Arrays.asList(email));
canonical.setEthnicity("developer");
canonical.setFashion("t-shirts");
canonical.setFood(Arrays.asList("sushi", "burgers"));
canonical.setGender(Gender.male);
canonical.setHappiestWhen("coding");
canonical.setHasApp(true);
canonical.setHeroes(Arrays.asList("Doug Crockford", "Charles Babbage"));
canonical.setHumor("none to speak of");
canonical.setInterests(Arrays.asList("PHP", "Java"));
canonical.setJobInterests("will work for beer");
Organization organization1 = new OrganizationImpl();
address = new AddressImpl();
address.setFormatted("1 Shindig Drive");
organization1.setAddress(address);
organization1.setDescription("lots of coding");
organization1.setEndDate(Gadgets.getDate(2010, 9, 10));
organization1.setField("Software Engineering");
organization1.setName("Apache.com");
organization1.setSalary("$1000000000");
organization1.setStartDate(Gadgets.getDate(1995, 0, 1));
organization1.setSubField("Development");
organization1.setTitle("Grand PooBah");
organization1.setWebpage("http://incubator.apache.org/projects/shindig.html");
organization1.setType("job");
Organization organization2 = new OrganizationImpl();
address = new AddressImpl();
address.setFormatted("1 Skid Row");
organization2.setAddress(address);
organization2.setDescription("");
organization2.setEndDate(Gadgets.getDate(1995, 0, 1));
organization2.setField("College");
organization2.setName("School of hard knocks");
organization2.setSalary("$100");
organization2.setStartDate(Gadgets.getDate(1991, 0, 1));
organization2.setSubField("Lab Tech");
organization2.setTitle("Gopher");
organization2.setWebpage("");
organization2.setType("job");
canonical.setOrganizations(Arrays.asList(organization1, organization2));
canonical.setLanguagesSpoken(Arrays.asList("English", "Dutch", "Esperanto"));
canonical.setUpdated(Gadgets.getDate(2006, 5, 6, 12, 12, 12));
canonical.setLivingArrangement("in a house");
Enum lookingFor1 = new LookingForImpl();
lookingFor1.setValue(LookingFor.RANDOM);
lookingFor1.setDisplayValue("Random");
Enum lookingFor2 = new LookingForImpl();
lookingFor2.setValue(LookingFor.NETWORKING);
lookingFor2.setDisplayValue("Networking");
canonical.setLookingFor(Arrays.asList(lookingFor1, lookingFor2));
canonical.setMovies(Arrays.asList("Iron Man", "Nosferatu"));
canonical.setMusic(Arrays.asList("Chieftains", "Beck"));
Name name = new NameImpl();
name.setAdditionalName("H");
name.setFamilyName("Digg");
name.setGivenName("Shin");
name.setHonorificPrefix("Sir");
name.setHonorificSuffix("Social Butterfly");
name.setUnstructured("Sir Shin H. Digg Social Butterfly");
canonical.setName(name);
canonical.setNetworkPresence(new NetworkPresenceImpl(NetworkPresence.ONLINE, "Online"));
canonical.setNickname("diggy");
canonical.setPets("dog,cat");
PhoneNumberImpl phone1 = new PhoneNumberImpl();
phone1.setValue("111-111-111");
phone1.setType("work");
PhoneNumberImpl phone2 = new PhoneNumberImpl();
phone2.setValue("999-999-999");
phone2.setType("mobile");
canonical.setPhoneNumbers(Arrays.asList((ListField)phone1, (ListField)phone2));
canonical.setPoliticalViews("open leaning");
UrlImpl profileSong = new UrlImpl();
profileSong.setValue("http://www.example.org/songs/OnlyTheLonely.mp3");
profileSong.setLinkText("Feelin' blue");
profileSong.setType("road");
canonical.setProfileSong(profileSong);
canonical.setProfileUrl("http://www.example.org/?id=1");
UrlImpl profileVideo = new UrlImpl();
profileVideo.setValue("http://www.example.org/videos/Thriller.flv");
profileVideo.setLinkText("Thriller");
profileVideo.setType("video");
canonical.setProfileVideo(profileVideo);
canonical.setQuotes(Arrays.asList("I am therfore I code", "Doh!"));
canonical.setRelationshipStatus("married to my job");
canonical.setReligion("druidic");
canonical.setRomance("twice a year");
canonical.setScaredOf("COBOL");
canonical.setSexualOrientation("north");
canonical.setSmoker(new SmokerImpl(Smoker.NO, "No"));
canonical.setSports(Arrays.asList("frisbee", "rugby"));
canonical.setStatus("happy");
canonical.setTags(Arrays.asList("C#", "JSON", "template"));
canonical.setThumbnailUrl("http://www.example.org/pic/?id=1");
canonical.setUtcOffset(-8l);
canonical.setTurnOffs(Arrays.asList("lack of unit tests", "cabbage"));
canonical.setTurnOns(Arrays.asList("well document code"));
canonical.setTvShows(Arrays.asList("House", "Battlestart Galactica"));
UrlImpl url1 = new UrlImpl();
url1.setValue("http://www.example.org/?id=1");
url1.setLinkText("my profile");
url1.setType("profile");
UrlImpl url2 = new UrlImpl();
url2.setValue("http://www.example.org/pic/?id=1");
url2.setLinkText("my awesome picture");
url2.setType("thumbnail");
canonical.setUrls(Arrays.asList((Url)url1, (Url)url2));
return canonical;
}
もちろん、この全ての項目をサポートするSNSは現実的にはありません。どの項目をサポートするかは、個々のSNSのポリシーに依存します。
- Posted:
- 02.01.2009
- Category:
- OpenSocial
