11月 12

Kindle(Amazonの電子ブックプラットフォーム)のPC版を使ってみた。
kindle for pc
Kindle for PC(for Windows7, VISTA and XP)のダウンロード
使い勝手は至ってシンプル、早い話がPDFを閲覧してる感覚です、但しコピペが出来ない等のPDFより不便です(書籍にコピペは不要と言われればそれまでですが)。
そして米アマゾンで Kindle for iPhone が公開されているので、そちらも使ってみました、PC版と比べちゃうとかなり使いづらいですね、PC版とiPhone版はページシンクの機能がついているので、iPhoneで読み終った場所をPC版で読み始めるなんてことは簡単にできます。
iPhone版にはハイライト(ラインマーカー的)機能と挿絵や単語に対するメモ機能がついていますが、これはPC版と共有できないようです。

さて電子書籍の購入方法ですが、11月11日現在では日本のAmazonのアカウントからは購入できません、米国Amazonの Books|Kindle Books (またはKindleを起動すると右上に[Shop in Kindle Store]という米国Amazonへのリンクがある)て購入して下さい、もちろん米国Amazonへのキャッシュカード登録が必要になります。

Kindle for PCの画面イメージ
KindlePage1KindlePage2KindlePage3
KindlePage4KindlePage5KindlePage6
Kindle for iPhoneの画面イメージ
Kindle_iPhone_Page1Kindle_iPhone_Page2Kindle_iPhone_Page3Kindle_iPhone_Page4Kindle_iPhone_Page5Kindle_iPhone_Page6

iPhone版はテキストや図表に対してのメモの挿入やマーキングが可能です。

Kindle_iPhone_edit1Kindle_iPhone_edit1aKindle_iPhone_Edit2

参考リンク
[ITmedia News]Amazon、「Kindle for PC」提供開始
[CNET Japan]アマゾン、「Kindle for PC」アプリケーションを正式公開
[なるいのDRM進化論]さっそく、Kindle for PCを試した、ちょっとがっかり。

Tagged with:
11月 05

広瀬香美さんがJ-POP CAFEでTwitterコンサートを開きます。

  • 日時 : 11/13(金) 19:00開演
  • 場所 : J-POP CAFE (渋谷)
  • チケット : ¥140-(ドリンク別)
  • 参加応募方法 : 本日(2009/11/05)21:00まで、twitter上で募集!
持ってくる物
・PC
・i-phoneなどのモバイル
(ご持参いただかなくても、大丈夫です。)
コンサートの特徴
・リアルタイムでtwitterを使って実況中継をしながらのコンサートです。
・広瀬本人もステージ上からtwitterします。
・参加できないユーザーの皆さんも、当日はTwitterを通して、リアルタイムでコンサートを楽しむことができます。
参加方法
Twitter上で@live1113をフォローします、これが参加希望という意味でこの中から抽選が行われます、当選者はDMが届くそうなのでそれに返信することで参加確定。

告知もTwitter、ライブもTwitterしながら、「持ってくる物」って笑いますよね、普通持ってきたらダメでしょ?w と次から次へと新しい企画を繰り出す広瀬さん、やはり彼女はタダモノではありません。
Kohmi Hirose twitter live
http://twitter.com/kohmi/status/5431201869

只今絶賛募集中!(2009/11/05 21:00マデ)

関連記事
広瀬香美が「Twitterコンサート」 実況推奨、本人もTwitter中継 応募もTwitterで
広瀬香美、twitter単独コンサート開催
ひと言もしゃべらないのに、距離が近い 広瀬香美さんが“Twitterライブ”
MC の代わりにすべて Tweet に徹した、広瀬香美さんの Twitter コンサート
広瀬香美Twitterコンサートに行ってきた [2009年11月14日(土)]

Tagged with:
7月 20

iPhone 3GSでAugmented Reality(拡張現実)対応のアプリが公開されるようです、日本の地下鉄にも対応できるのかな?

Tagged with:
5月 01

携帯絵文字+CIのお勉強ということで、BBSっぽいモノを作ってみた。
エラーチェック(文字数制限、連続投稿防止とかも)等々まったく組み込んでません、今回は一通りの機能を使ってみて携帯電話の扱いとCIに慣れるという目的なので。
emoji paddocomoiphone1iphone2
http://hiro.oneoctave.jp/cibbs/

一応、i-modeからも絵文字使えるみたいです(PC絵文字との相関テーブルを定義していのでPC絵文字はBBCODE形式で表示されてしまいます)。
一応、iPhoneからも機能の半分くらい使えます、2画面くらいしか作っていないのでFile not found 出まくります。。。

このプログラム自体は、まったく実用には耐えられないけど、何となくCIが見えてきた感じです。

つぎは密かにDJangoに手をつけ。。。(汗

Tagged with:
4月 22

またもやmixi stationのマネッコなのですが。(^^;
iTunesで現在聴いている曲の情報を取得してみました。
blogやSNSへ投稿する部分は真面目に頑張ればできると思いますが(今回はメンドウないのでやりません)、興味の先は一体『外部プログラムで iTunes にどうやってアクセスするのだろうか?』の部分です、調べてみたところ Windowsの場合iTunesAPI はCOMコンポーネントになっているので、VBやC#、Javascript、等からとても手軽に扱えるということがわかりました。
色々調べながらここまで作るのに約2~3時間くらいかな(VS2003/C#)。。。
iTunes API
単純に現在再生中の曲名を取得するだけなら30分もかからないでしょう、ブログに書くにあたって体裁を整えたり、余計な(プログレスバーとか。w)付けたりの方が時間かかりました。笑

iTunesLibを登録

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using iTunesLib;

iTunesAppClass のインスタンスをクラスメンバitunesとします

namespace iTunesTest
{
	/// <summary>
	/// Form1 の概要の説明です。
	/// </summary>
	public class Form1 : System.Windows.Forms.Form
	{
		private System.Windows.Forms.ListView listView1;
		private System.ComponentModel.IContainer components;
		private System.Windows.Forms.ProgressBar progressBar1;
		private System.Windows.Forms.Timer timer1;

		private iTunesApp itunes;

メインフォーム

		public Form1()
		{
			//
			// Windows フォーム デザイナ サポートに必要です。
			//
			InitializeComponent();

			//
			// TODO: InitializeComponent 呼び出しの後に、コンストラクタ コードを追加してください。
			//

			// リストビューの準備
			listView1.FullRowSelect = true;
			listView1.GridLines = true;
			listView1.View  = View.Details;
			listView1.HeaderStyle = ColumnHeaderStyle.Nonclickable;
			listView1.Columns.Add("項目", 140, HorizontalAlignment.Left);
			listView1.Columns.Add("値",   250, HorizontalAlignment.Left);

			// iTunesAppClassインスタンス生成
			itunes = new iTunesAppClass();

			// カレントトラック情報
			IITTrack track = itunes.CurrentTrack;
			if (track!=null)
			{
				ViewInfo(track);	//トラックが選択されているので情報表示
			}

			// イベントハンドラ登録
			itunes.OnPlayerPlayEvent +=
new _IiTunesEvents_OnPlayerPlayEventEventHandler(OnPlayerPlay_Event);
			itunes.OnPlayerStopEvent +=
new _IiTunesEvents_OnPlayerStopEventEventHandler(OnPlayerStop_Event);
			itunes.OnAboutToPromptUserToQuitEvent +=
new _IiTunesEvents_OnAboutToPromptUserToQuitEventEventHandler(OnAboutToPromptUserToQuitEvent);

			// プログレスバー設定
			progressBar1.Maximum = 100;
			progressBar1.Value = 0;
			timer1.Interval = 1000 * 1;	// 監視間隔設定(ミリ秒)
			timer1.Start();	// 監視タイマー開始
		}

イベントハンドラー:再生が停止した

		void OnPlayerStop_Event(object iTrack)
		{
		}

イベントハンドラー:再生が開始された

		void OnPlayerPlay_Event(object iTrack)
		{
			// 情報更新
			ViewInfo((IITTrack)iTrack);
		}

イベントハンドラー:iTunesが終了

		// iTunesが終了してしまった場合(自分も終了しないとエラーになる)
		void OnAboutToPromptUserToQuitEvent()
		{
			this.Close();
		}

イベントハンドラー:タイマーイベント

		private void timer1_Tick(object sender, System.EventArgs e)
		{
			// カレントトラック情報
			IITTrack track = itunes.CurrentTrack;

			// プログレスを百分率で計算-
			int nowPos = (int)((double)itunes.PlayerPosition / (double)track.Duration*100.0);
			progressBar1.Value = nowPos;
			// ウインドウタイトルに再生中の曲名にする
			string strTime = itunes.PlayerPosition/60 + ":"+ itunes.PlayerPosition%60;
			this.Text = track.Name + " " + strTime;
		}

トラック情報を表示するファンクション

		void ViewInfo( IITTrack iTrack )
		{
			// ウインドウタイトルに再生中の曲名にする
			this.Text = iTrack.Name;

			// リストビューへ表示
			listView1.Items.Clear();	// 初期化
			listView1.Items.Add(new ListViewItem(new string[]{"Track.Name",            iTrack.Name}) );
			listView1.Items.Add(new ListViewItem(new string[]{"Track.Time",            iTrack.Time}) );
			listView1.Items.Add(new ListViewItem(new string[]{"Track.Duration(sec)",   iTrack.Duration.ToString()}) );
			listView1.Items.Add(new ListViewItem(new string[]{"Track.Album",           iTrack.Album}) );
			listView1.Items.Add(new ListViewItem(new string[]{"Track.Artist",          iTrack.Artist}) );
			listView1.Items.Add(new ListViewItem(new string[]{"Track.Genre",           iTrack.Genre}) );
			listView1.Items.Add(new ListViewItem(new string[]{"Track.SampleRate(Hz)",  iTrack.SampleRate.ToString()}) );
			listView1.Items.Add(new ListViewItem(new string[]{"Track.BitRate(bit)",    iTrack.BitRate.ToString()}) );
			listView1.Items.Add(new ListViewItem(new string[]{"Track.Kind",            iTrack.KindAsString}) );
			listView1.Items.Add(new ListViewItem(new string[]{"iTunesApp.SoundVolume", itunes.SoundVolume.ToString()}) );
			listView1.Items.Add(new ListViewItem(new string[]{"iTunesApp.Version",     itunes.Version}) );
		}

説明するまでもなく上のソースを見て頂ければ理解できると思いますが、

iTunesApp tunes = new iTunesAppClass();
IITTrack track = itunes.CurrentTrack;
if (track!=null)
{
	// トラックが選択されている時の処理を書く
}

これで、再生中のトラックオブジェクトが取得できますので後は煮るなり焼くなりして下さい。

注意

HRESULT _IiTunesEvents::OnPlayerPlayingTrackChangedEvent ( [in] VARIANT iTrack )
このイベントが紛らわしいです。再生中トラックが変わった(次の曲へ移動した)時に発生するのかと思いましたが全く違います、再生中の曲の情報(曲名など)が編集された時に発生します。
(This event is fired when the user changes information about the currently playing track (e.g. the name of the track).)
では再生トラックが変わった時をどうやって知るのかといいますと、STOP,PLAYイベントが連続して発生するだけです(それだけで十分ですね)。

Tagged with:
12月 22

mixi stationが中々便利なので、OpenPNE Stationを作ってみました。
タスクトレイに収めるクライアントアプリですが、多分最も簡単なのは.NetFrameWorkでしょう、ただ.NetFrameWork2はVista以上でないとデフォルトでインストールされていないので.NetFrameWork1.1かなぁ。。。?などと考えつつも、これしきのアプリにドットネットかよ!って感じで結局WinMainで作ってみました。笑
実は途中でMFCに逃げたのですが、何とかWinMainに戻ってこれました。汗
OpenPNE Station

仕組みはとてもシンプルで、サーバー(OpenPNE)側にXML-RPCサーバーを仕込んであります、それをクライアント(タスクトレイアプリ)が定期的にユーザIDとパスワードで認証しログを覗いて自分のログインタイムよりも新しいアクセスログを見つけて収拾しているだけです、未実装ですが新着メッセージや日記への書き込みなんかも簡単に取れそうですね(これはもうSQLさえ書ければクライアントは表示するだけなので)。

ただしこのバージョン(まだプロトタイプ版です)大きな問題(欠陥)があります!
トレイアイコンのツールチップへ情報を表示してもらうための配列がなんと256バイト固定なのです!、途中で気が付いて。マママジ?( ̄□ ̄;)。。。

typedef struct _NOTIFYICONDATA {
  DWORD cbSize;
  HWND hWnd;
  UINT uID, uFlags, uCallbackMessage;
  HICON hIcon;
#if (_WIN32_IE < 0x0500)
  TCHAR szTip[64];
#else
  TCHAR szTip[128];
#endif
#if (_WIN32_IE >= 0×0500)
  DWORD dwState, dwStateMask;
  TCHAR szInfo[256];
  union {
    UINT uTimeout, uVersion;
  } DUMMYUNIONNAME;
  TCHAR szInfoTitle[64];
  DWORD dwInfoFlags;
#endif
#if (_WIN32_IE >= 0×600)
  GUID guidItem;
#endif
} NOTIFYICONDATA, *PNOTIFYICONDATA;

まぁトレイアイコン用ツールチップですから、大きな情報を表示する用途は想定していないのでしょうけど、ToolTipのバルーン表示に頼らず自前でウインドウを書かないといけないみたいです、ふぅー凹。

2008/12/25 加筆

TrayICONの機能ではなくて、汎用的ツールチップでは文字数256バイトの制限はないようです、でもこのコントロールは何か別のコントロール(例えばボタン)と結びつけて使うのが前提なようで、ボタン上にマウスポインターがホバーしたら自動で表示させるような使い方は簡単なのですが、単独で任意の位置に好き勝手なタイミングで表示したりすることが上手くできないです。
やはり自前で。。。

Tagged with:
9月 13

外部ログインページだけですが、iPhone用のお手軽カスタマイズ方法。

処理の流れ

  • 全てのアクセスを外部ページ(index2.php)で受ける
  • iPhone以外からのアクセスは通常のログインページへ
  • iPhoneからのアクセスは外部ページで処理

管理画面|SNS設定

index2.php

最小構成はこんな感じ


<?php
$ua = $_SERVER['HTTP_USER_AGENT'];

if (ereg("iPhone",$ua)) {
  //iPhone用の処理
  ・・・ 省略 ・・・
  exit;
}
//iPhone以外(標準のログインへとばす)
header('Location:http://OPENPNE_URL/?m=pc&a=page_o_login');
?>

※iPhone以外のエージェントと判定された場合index.phpへ飛ばすとループしてしまうため注意。

本体の向き(縦横)でスタイルシートを切り替えてみました


<?php
$ua = $_SERVER['HTTP_USER_AGENT'];

if (ereg("iPhone",$ua)) {
print <<<EOD
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  <head>
  <meta name="viewport" content="width=device-width; initial-scale=1.0; maximum-scale=1.0;">
  <title>My iPhone Page</title>
  <link rel="apple-touch-icon" href="iphone/images/myiphone_ico.png"/>
  <link rel="StyleSheet" href="./iphone/css/iphone_portrait.css" type="text/css"  media="screen" id="orient_css">
  </head>
  <body onorientationchange="orient();">
  <form action="http://OPENPNE_URL/" method="post">
    <div id="wrap">
      <div id="header"></div>
      <div id="content">
      <p>Member Sign In</p>
      <p>Please enter your ID and Password.</p>
      <input type="hidden" name="m" value="pc" />
      <input type="hidden" name="a" value="do_o_login" />

      <ul>
      <li class="myLabel">Email:</li>
      <li><input type="text" name="username" id="username" value="" tabindex="1"></li>
      </ul>

      <ul>
      <li class="myLabel">Password:</li>
      <li><input type="password" name="password" id="password" tabindex="2"></li>
      </ul>

      <p><input type="checkbox" name="is_save" id="is_save" value="1" tabindex="3"><label for="is_save">次回から自動的にログイン</label></p>
      <p><input type="submit" value="Sign In" tabindex="4"></p>
      </div>
      <div id="bottom"></div>
    </div>
  </form>
  </body>
</html>

<script type="text/javascript">
function orient()
{
  switch(window.orientation){
  case   0:  document.getElementById("orient_css").href="./iphone/css/iphone_port.css";  break;
  case -90:  document.getElementById("orient_css").href="./iphone/css/iphone_land.css";  break;
  case  90:  document.getElementById("orient_css").href="./iphone/css/iphone_land.css";  break;
  }
}
window.onload = orient();
</script>
EOD;
  exit;
}

header('Location:http://OPENPNE_URL/?m=pc&a=page_o_login');
?>

※ OPENPNE_URL は各自自分のサイトURLに読み換えて下さい。

スタイルシート例

iphone_land.css(横用レイアウト)


body
{
	background-color:#333;
	margin:0;
}

#wrap
{
	overflow:auto;
	width:480px;
	height:350px;
}

#header
{
	background:url(../images/header_land.jpg);
	background-repeat:no-repeat;
	height:100px;
}

#content
{
	background:url(../images/middle_land.jpg);
	background-repeat:repeat-y;
	margin-top:-5px;
}

p
{
	margin:5px;
	padding-left:25px;
	width:370px;
}

#bottom
{
	background:url(../images/bottom_land.jpg);
	background-repeat:no-repeat;
	height:30px;
	margin-top:-5px;
}

ul{
	margin:5px;
	padding-left:25px;
	list-style:none; inside;
}

li.myLabel{
	width:80px;
	float:left;
	text-align:right;
}

iphone_land.css(縦用レイアウト)


body
{
	background-color:#333;
	margin:0;
	padding:0;
	font-size:12px;
}

#wrap
{
	overflow:auto;
	width:320px;
	height:480px;
}

#header
{
	background:url(../images/header_port.jpg);
	background-repeat:no-repeat;
	height:100px;
}

#content
{
	background:url(../images/middle_port.jpg);
	background-repeat:repeat-y;
	margin-top:-5px;
}

p
{
	margin:5px;
	padding-left:25px;
	width:270px;
}

#bottom
{
	background:url(../images/bottom_port.jpg);
	background-repeat:no-repeat;
	height:30px;
	margin-top:-5px;
}

ul{
	margin:5px;
	padding-left:25px;
	list-style:none; inside;
}

画像

header

body

bottom

[public_html]
  index.html
  index2.html(今回追加したコード)
  [iphone](以下今回追加したファイル)
    [css]
        iphone_land.css
        iphone_port.css
    [images]
        header_land.jpg
        header_port.jpg
        middle_land.jpg
        middle_port.jpg
        bottom_land.jpg
        bottom_port.jpg

Tagged with:
9月 02

最近iPodの音が悪い、音圧が出ないし特に低域があまり聴こえない。iPod本体には、購入時から1年間のメーカー保障が付いていることは知っていたが、なんと付属アクセサリーにも適応されると聞いて即連絡!。数日後にはヤマト急便の人が、交換のため新品のイヤホンを持って来てくれました。
毎日使用していると大体一年前後で壊れます、自分の場合はこれで3個目、最初の2個は保障の事など頭に無くて自腹で購入、使えているうちは余り気にしないものの、いざ自分で選んで買うとなるとやはり高性能のものが欲しくなって一万円くらいの出費になります。(下手したら本体より高くつく!)
そして修理(交換)の手続きはWebから簡単に行えます。
オンライン修理サービス

Docomo携帯のバッテリーも「プレミアム会員(無料)」に入っていると2年以上から無料交換の対象です、自分の場合1年半くらいでも無料で交換してもらいました。

preload preload preload