はてなブックマーク - Fusic Advent Calendar 2010開始します
    このエントリーをはてなブックマークに追加

    今日はお湯割りを呑もうかなと思っている小山です。

    今年も技術系Advent Calendarの季節がやってきましたね。
    「技術系Advent Calendarって何?」という方はこちらをどうぞ。

    PerlRuby、そしてEmacsなどいろいろあります。
    (CakePHPも行うそうです)

    どこの会社でも同じでしょうが、弊社Fusicでもご多分にもれず「師走」なわけですが(想像にお任せいたします)、「なぜか」FusicでもAdvent Calendarをやってみようということになりました。こういうアグレッシブにつっこんでいくのはほんとFusicらしいです。

    参加者

    参加者の呼びかけの時点は任意だったのですが、話の流れというか勢いでなんと社長、副社長を含む技術チーム全員が参加することに。
    「勢い」って怖いです。
    普段Blogに出てこないメンバーも参加するなかなか面白い25日になりそうです。

    ルール

    技術チーム全員が同じ確率で、当日朝にルーレットスクリプトを実行して、その日の担当者を決定するというかなり怖いルールになりました。

    1回当たった人は確率が1/2になりますが、確率が0になることはありません。
    連続して当たった人の顔が目に浮かびます。

    社長、副社長はレアということで確率を下げています。(が、まあ、25日付近まで当たっていなかったら「アタックチャンス」とでも称して確率を10倍にでもします)

    というわけで

    明日12月1日から毎日更新されるブログになると思いますので、お楽しみに!

      はてなブックマーク - ZENPRE for Android Galleryとintent-filter
      このエントリーをはてなブックマークに追加

      3連続出しゃばってすみません。
      山本です。

      プレゼン配信サービス「ZENPRE」では、スライドの切り替えを手軽に行えるように、スマートフォン向けアプリも配布しております。
      iPhone用とAndroid用をリリースしておりますが、私はAndroidアプリを担当しました。

      アプリを開発するにあたって、スライドの切り替えをどのような操作で行うかいろいろ考えました。
      スタンダード、というか、スマホの醍醐味的な操作で言えば、指でスライドさせるフリック操作ですね。
      ただ、その仕様だと1ページずつしかめくれないのと、次のスライドはどんなものだったっけ、というときに確認できません。

      そこで、AndroidにあるGalleryクラスに注目しました。
      これは、画像を横一列に羅列することができます。
      フリック操作で左右に移動でき、クリックイベントも取得できるということで、
      フリック操作でスライドの移動を行い、クリックすることでページを確定するという仕様にすることにしました。

      その際に書いたソースコードを一部公開します。

      まずは、galleryを定義したビューxml

      <LinearLayout
      	android:layout_width="fill_parent"
      	android:layout_height="wrap_content"
      	android:layout_weight="4">
      	<ImageView
      		android:id="@+id/selectedImageView"
      		android:layout_width="fill_parent"
      		android:layout_height="fill_parent"
      		android:adjustViewBounds="true"
      		android:scaleType="centerInside" >
      	</ImageView>
      </LinearLayout>
      <LinearLayout
      	android:layout_width="fill_parent"
      	android:layout_height="wrap_content"
      	android:layout_weight="1"
      	android:padding="5px">
      	<Gallery
      		android:id="@+id/imageGallery"
      		android:layout_width="fill_parent"
      		android:layout_height="wrap_content">
      	</Gallery>
      </LinearLayout>

      画面上部に選択したスライド画像。
      下部に登録しているスライド画像のgalleryを配置します。

      処理を行うActivityクラスには以下のように書きました。

      public void onCreate(Bundle savedInstanceState) {
      	 // galleryから選択した画像を表示するImageView
      	ImageView selectedImageView = (ImageView) findViewById(R.id.selectedImageView);
       
      	 // gallery定義
      	Gallery gallery = (Gallery) findViewById(R.id.imageGallery);
      	PresenImageAdapter presenImageAdapter = new PresenImageAdapter(this);
       
      	// galleryに表示したい分だけ、bitmap形式のオブジェクトを追加する
      	// presenImageAdapter.addBitmap(bitmap);
      	// presenImageAdapter.addBitmap(bitmap);
       
      	// adapterのセット
      	gallery.setAdapter(presenImageAdapter);
       
       
      	// 画像クリックでサムネイル表示
      	gallery.setOnItemClickListener(new AdapterView.OnItemClickListener(){
      		public void onItemClick(AdapterView<?> adapterView, View parent, int position, long id) {
      			// 選択された画像をイメージビューに表示
      			Bitmap selectedBitmap = HttpClient.getImage("クリックされた部分にヒットする画像のURL");
      			selectedImageView.setImageBitmap(selectedBitmap);
      		}
      	});
      }

      galleryと接続するアダプタークラスは、Android DevelopersサイトにあるBaseAdapterを拡張したものを使用しました。

      public class PresenImageAdapter extends BaseAdapter {
      	// bitmapのリスト
      	private List<Bitmap> imageItems;
       
      	public PresenImageAdapter(Context context) {
      		......
      		imageItems = new ArrayList<Bitmap>();
      	}
       
      	// bitmapのリストに画像を追加
      	public void addBitmap(Bitmap image) {
      		imageItems.add(image);
      	}
       
      	// 画像の取得
      	public Object getItem(int position) {
      		return imageItems.get(position);
      	}
      	....
      	....
      	public View getView(int position, View view, ViewGroup parent) {
      		// 表示する画像
      		Bitmap bitmap = (Bitmap) getItem(position);
      		imageView.setImageBitmap(bitmap);
      		.......
      		return imageView;
      	}
      }

      これにより、画面下部には画像のgallery、そのgalleryにある画像をクリックすることで、上部にその画像が表示されます。
      さらに、クリックイベントの中に、ページ情報を送信する処理を書いてますので、プレゼンを見ている人に情報がブロードキャストされるようにしてます。
      これで基本形の完成です。

      あと、余談なのですが、AndroidManifest.xmlを以下のように書いたらどうなると思いますか。

      <?xml version="1.0" encoding="utf-8"?>
      <manifest xmlns:android="http://schemas.android.com/apk/res/android"
       package="jp.zenpre"
       android:versionCode="1"
       android:versionName="1.0">
      	<uses-sdk android:minSdkVersion="4" />
      	<application android:icon="@drawable/icon" android:label="@string/app_name" android:debuggable="false">
      		<activity android:name=".SplashActivity" android:screenOrientation="portrait" android:label="@string/app_name">
      			<intent-filter>
      				<action android:name="android.intent.action.MAIN" />
      				<category android:name="android.intent.category.LAUNCHER" />
      			</intent-filter>
      		</activity>
      		<activity android:name=".HomeZenpreActivity" android:label="@string/app_name">
      			<intent-filter>
      				<action android:name="android.intent.action.MAIN" />
      				<category android:name="android.intent.category.LAUNCHER" />
      			</intent-filter>
      		</activity>
      	</application>
      </manifest>

      この、宣言を2つしてしまった状態でインストールを行うと、

      のように、同じアプリが2つ表示できてしまいます。
      片方は”SplashActivity”で定義した画面が立ち上がり、もう片方は”HomeZenpreActivity”で定義した画面が立ち上がります。
      とくにエラーは起きません。しかも、この状態で、マーケットに登録までできます。

      ただし、マーケットからダウンロードして、マーケットアプリ上で開こうとすると、

      マーケット(com.android.vending)が予期せず停止しました。やり直してください。

      The application Market (process com.android.vending)has stopped unexpectedly.Please try again.

      と表示されて開けません。
      たぶん、どっちのアプリを開けばいいのか分からないのでしょう。
      ホーム画面からアプリを直接指定すると開けますが。
      何を隠そう、これをアップしてしまい、ちょっと混乱してしまった経緯があります。
      たぶん、誰もやらないと思いますが、ご注意を。。。

      というわけで、携帯端末でプレゼンの操作ができる、このAndroidアプリをぜひご利用してください。
      AndroidMarketで「ZENPRE」と検索すればヒットします。
      そして、いろいろとご意見頂ければ幸いです。

        はてなブックマーク - ZENPREで過去の勉強会をいつでも視聴
        このエントリーをはてなブックマークに追加

        こんにちは。
        ヤマモトです。

        本日(11/25)の15:00に、弊社小山による「TitaniumMobile勉強会」を行いました。
        TitaniumMobileとは、端的に申しますとJavaScriptでiPhoneアプリが作れるツールです。
        アプリとして魅力の多いiPhoneアプリですが、その開発にはObjective-Cという言語を習得する必要があります。
        どれでもそうだと思いますが、新たな言語を習得するのはなかなか骨が折れますね。
        慣れ親しんだ言語でプロダクトができれば、何て素敵なことだろうと思います。
        そのためのアプローチは方方で進んでいて、TitaniumMobileはその中の1つですね。

        弊社でも生粋のJavaScript使いである小山は、先日のエントリで書いたように、
        PHPMatsuriにてユニットホスティング賞を受賞しiPodTouchの贈呈を受けました。
        そしてそれ以来、その魅力にどっぷり浸かり、TitaniumMobileを知ってから短期間でiPhoneアプリを何と2本も開発しました。
        短期間とは1ヶ月位だったと思います。そんな短い期間で、しかも空いた時間で開発してしまいました。

        そんなTitaniumMobileに、ひいてはJavaScriptに興味を持ってもらいたく本日の勉強会を開催し、その模様は「ZENPRE」にて配信しました。

        と、ここまでは経緯について書かせていただきました。

        そんな、何とも魅力のあるTitaniumMobileの勉強会を見てみたかったという方。
        ZENPRE」のサイトへ来てみませんか?
        当然ながら勉強会は終了しているのですが、その模様をZENPRE上であればいつでも見ることができます。

        本日、ZENPREに「プレゼン同期録画機能」を新たにリリースしました。
        これは、動画と同期してスライドも切り替わり、動画だけのプレゼンに比べて飛躍的に表現力を向上させたZENPREでのプレゼンを、
        いつでも堪能できるようになります。

        配信したスライドの操作は記録されるようになり、録画されたUstreamの映像と併せて保存されますので、
        過去に配信されたプレゼンは、いつでも視聴できるようになります。
        生での配信を見ていた方は、「あの時何と言っていたっけ?」と振り返るために、
        見逃した方も、後で時間にゆとりのある時にじっくり見ることができます。

        本日配信した、TitaniumMobile勉強会も以下のアドレスからいつでも視聴できます。
        zenpre.net/p/yBxMn
        いつでもありますから、今日にでも、興味の湧いたときにでも、ぜひご覧ください。

        また、勉強会やセミナーを発信していこうとされている方も、
        無料で利用できるZENPREを使ってみませんか?
        映像のみに比べ表現力が向上し、遠方で見ている方にも伝わりやすくなります。
        また、ストレージの役割ももっていますので、自分が作ったスライド資料もウェブ上ですぐ確認できます。
        配信したプレゼンテーションは記録されますので、自分の活動の履歴にもなります。

        本日リリースを終えて一段落しておりますが、
        まずは使っていただいて、利用者の声をお寄せいただけたらと思います。
        実際に勉強会等で利用してみたという声をぜひとも聞かせてください。
        利用をたくさんされることでしか、このサービスは成長していかないと思います。

        ぜひとも、よろしくお願いします。