ラベル Twitter の投稿を表示しています。 すべての投稿を表示
ラベル Twitter の投稿を表示しています。 すべての投稿を表示

2012年8月3日金曜日

Googleアカウントへ接続を許可したアプリを調べる

Googleアカウントへ接続を許可したアプリを調べる方法が、意外に面倒くさいので忘備録としてメモ。

1. 「アカウント設定」をクリック
GoogleのトップページなどGoogle内のサイトへ移動して、画面上のアカウントアイコンをクリックする。続いて、その中の「アカウント設定」をクリックする。


2.「セキュリティ」をクリック
画面左の「セキュリティ」をクリックする。


3.「編集」をクリック
「アプリケーションとサイトを認証する」の右側「編集」をクリックする。


これでようやく、Googleアカウントに許可されたアクセスの一覧が表示される。


アプリ名 ー アクセスが許可されたGoogleのサービス アクセスを取り消すボタン」という順で出力される。

ただし、Androidのアカウントマネージャーでアカウントが管理されている場合は、アプリ名の部分が「Android」とまとめられて、どのアプリで許可したアクセスかがわかりづらくなる・・・。


Twitterでは、連携アプリの一覧の表示の中に、サムネイルや許可した日時、アプリの紹介文などが入っていて視覚的に分かりやすい。


Googleもこのような表示にしてくれればいいのに。

2011年8月16日火曜日

アニメーションGIFとPNGのアップロードに対応していないTwitter対応フォトストレージはどこ?

Twitter対応フォトストレージの中には、アニメーションGIFやPNG画像をアップロードすると自動的にJPG画像へ変換するなどして、オリジナルそのもののアップロードには対応していないものがある。どこが対応していて、どこが対応していないのか、一覧表にまとめてみた。

Twitter対応
フォトストレージ
アニメーションGIF PNG
Twitpic
Yfrog ×
GIFだがフレーム情報が無くなる
ついっぷるフォト
img.ly
Lockerz
(但し画像サイズが小さい場合は拡大される)
MobyPicture ×
jpg画像へ変換される
×
jpg画像へ変換される
Posterous
Twitgoo


まとめ

Twitpic、ついっぷるフォト、img.ly、Posterous、Twitgooでは、アニメーションGIFでもPNGでも、オリジナル画像と変わらない状態でアップロードされることを確認した。

2011年8月11日木曜日

Twitterへ直接画像をアップロードできるようになった。その使用感とポイントのまとめ。

Twitterへ直接画像をアップロードできるようになった。

Twitter ヘルプセンター | Twitterでの画像アップロードについて



詳しい説明をクリックすると、ヘルプページが表示される。以下、ヘルプページのポイントをまとめてみる。


何MBまでアップ可能?
  • 3MB以下まで

アップするとどうなる?
  • 画像は自動的にリサイズされる
  • 画像付きで投稿したツイートに画像パスが含まれる
  • 画像パスは「http://twitter.com/#!/ユーザー名/status/ステータス番号/photo/ユーザーがアップした写真数」(例)「http://twitter.com/#!/misahot/status/101471770070093824/photo/1」
  • サードパーティのTwitterクライアントで見ると、上記画像パスはt.coで短縮されている
  • Twitterのサイトでは上記画像パスは「pic.twitter.com」ドメイン下であるように表示される


  • また、Twitterのサイトでは、画像は「Photobucketによる提供」と表示される

他の画像共有サービスへのサポートは?
  • Flickr、Twitpic、yFrog などの画像共有サービスへのサポートは継続する

Exif データは?
  • 消された上でアップロードされる

画像を削除するには?
  • ツイートそのものを消すしか無い

アップした画像は検索対象?
  • 公開アカウントにて共有された画像は、検索結果に表示される
  • 非公開アカウントで共有された画像は、検索結果には表示されない
  • ツイートを消すと、画像も検索対象から外れる

Twitterへ直接画像をアップするAPIの提供は?
  • サードパーティ開発者の利用はこれから。全てのユーザーにこの機能が提供された段階で、画像API へのアクセスが可能になる予定


使ってみたところ、画像のアップロードスピードがとても速い印象。

今回、試しに1MB程度の画像をアップしてみたが、アップ時間をほとんど意識しなかった。TwitpicやyFrogなどのサイトの場合は、明らかにアップしているなと感じられる時間が数秒発生するのだが、Twitterへ直接アップした場合にはそれがない。

ただし、画像が自動的にリサイズされて実サイズではない点には注意が必要だ。ピッタリ待ち受けサイズでアップしたい場合など、実サイズにこだわる時には用途に向かない


近い将来、恐らく数週間後には、ユーザーの投稿した画像のギャラリーも追加されるようだ。

こうなってくると、Twitterへ画像をアップすることをメインにしていたサービスは生存が難しくなってくるなあ。


※2011.08.16 追記
写真サービスAPIがサードパーティ開発者へ開放された。但し、アニメーションGIFは非サポートとのこと。
TechCrunch「Twitter、写真サービスAPIをサードパーティーに開放」

2011年7月25日月曜日

OAuth認証時にTwitter側で表示される画面が変わった。ユーザーのクリック数は減ったものの分かりづらくなった印象。

TwitterのOAuth認証時に呼び出すAuthentication URLで表示される画面デザインが、いつの間にか変わっていた。

<Before>

今年2月の時点では、ユーザーがログインしていなければ、まずはログインが要求され、


続いて、アプリ連携が許可されていなければ、許可を確認する画面が表示されるという流れだった。



<After>

しかし、今年7月の時点では、「ログイン=ログイン&アプリ連携許可」という設計に変わっている。


画面上では「ログイン」となっているが、ログインすると、同時にアプリ連携も許可される。

確かに、二度の確認が一度で済むようになり、簡略化されたともいえるが、個人的には、今何が行われているのかが分かりにくくなったように感じる。


Twitterへログイン済みの場合は、以下の画面になる。


Twitterへログイン済みなのに、ボタンのラベル名は「ログイン」。う~ん、わかりづらい。


上記画面で「キャンセル」をクリックすると、こんな画面が表示される。
アプリ連携をキャンセルしたのに、「ログインしていません」と表示されるのはいかがなものか。



ちなみに、YfrogやTwitpicで実装されている「Log on(Sign in) with Twitter」ボタン。


Twitterログイン済みで、これをクリックした場合は、「ログイン」ではなく「連携アプリを認証」というボタンラベルになる。


しかも、既にアプリ連携を許可していたとしても、何度も「連携アプリを認証」を求められる。

ふむぅ、全般的に動作が分かりづらくなった印象。

MobypictureでAPIキーを取得して自サイトから画像をアップロードする

Mobypictureへサイトをを登録し、APIキーを取得する。取得したAPIキーを使うと、自サイトからMobypictureへ画像をアップロードできる。

まずは、Mobypictureの登録ページから、自サイトを登録する。



登録が完了すると、マイページにデベロッパーキー情報が表示されている。画像アップロード時は、そのキー情報を共に送る。



Twitter4Jを使った場合は以下のようなコードになる。
private String upload(twitter4j.auth.AccessToken accessToken, String photoStorage) throws twitter4j.TwitterException, ServletException{

  String url = "";
  try {

    中略

    //アップロードする画像ファイルを取得する
    java.io.File imgFile = new java.io.File(imgFilePath);

    //Confifgを設定する
    twitter4j.conf.ConfigurationBuilder cb = new twitter4j.conf.ConfigurationBuilder();
    cb.setOAuthAccessToken(accessToken.getToken());
    cb.setOAuthAccessTokenSecret(accessToken.getTokenSecret());
   
    if(photoStorage != null ){
      if(photoStorage.equals("mobypicture")){
        //アップロード先にMobypictureを指定しAPIキーを設定する
        cb.setMediaProvider("MOBYPICTURE");
        cb.setMediaProviderAPIKey(MobypictureのAPIキー);
      }else if(){

        中略

      }
    }
    twitter4j.conf.Configuration conf = cb.build();
    twitter4j.media.ImageUpload imageUpload = new twitter4j.media.ImageUploadFactory(conf).getInstance();

    //アップロードを実行しURLを取得する
    url = imageUpload .upload(imgFile);

  } catch (java.io.IOException e) {
    //エラー処理
  }
  return url;
}

LockerzでAPIキーを取得して自サイトから画像をアップロードする

Lockerz(旧Plixi)へサイトをを登録し、APIキーを取得する。取得したAPIキーを使うと、自サイトからLockerzへ画像をアップロードできる。

まずは、LockerzのAdmin Siteから、自サイトを登録する。



登録完了ページ内に「API Key」が表示されている。画像アップロード時は、そのキー情報を共に送る。



Twitter4Jを使った場合は以下のようなコードになる。
private String upload(twitter4j.auth.AccessToken accessToken, String photoStorage) throws twitter4j.TwitterException, ServletException{

  String url = "";
  try {

    中略

    //アップロードする画像ファイルを取得する
    java.io.File imgFile = new java.io.File(imgFilePath);

    //Confifgを設定する
    twitter4j.conf.ConfigurationBuilder cb = new twitter4j.conf.ConfigurationBuilder();
    cb.setOAuthAccessToken(accessToken.getToken());
    cb.setOAuthAccessTokenSecret(accessToken.getTokenSecret());
   
    if(photoStorage != null ){
      if(photoStorage.equals("lockerz")){
        //アップロード先にLockerzを指定しAPIキーを設定する
        cb.setMediaProvider("LOCKERZ");
        cb.setMediaProviderAPIKey(LockerzのAPIキー);
      }else if(){

        中略

      }
    }
    twitter4j.conf.Configuration conf = cb.build();
    twitter4j.media.ImageUpload imageUpload = new twitter4j.media.ImageUploadFactory(conf).getInstance();

    //アップロードを実行しURLを取得する
    url = imageUpload .upload(imgFile);

  } catch (java.io.IOException e) {
    //エラー処理
  }
  return url;
}

2011年7月4日月曜日

BloggerのHTML/JavaScriptガジェットでTweet、いいね!、Google+1(Google Plus One)ボタンをつけてみた

Bloggerのブログ記事に対してではなく、ブログサイトそのものに対して、ツイートや、いいね!、+1をクリックできるように、Bloggerのブログ右脇にガジェットを追加してみた。


1.「HTML/JavaScript」ガジェットを追加

Bloggerの管理ページで「デザイン」>「ページ要素」>「ガジェットを追加」>「HTML/JavaScript」の+記号をクリック。


2.ソースコードを編集

「HTML/JavaScript」右下の「編集」をクリック。コンテンツ欄に以下のコードを貼り付ける。

ボタンサイズは全て65pxレベルの大きなものを選択。
<iframe allowtransparency='true' src='http://platform.twitter.com/widgets/tweet_button.html?url=ブログのURL&text=ブログのタイトル&related=Twitterのアカウント&lang=ja&count=vertical' frameborder='0' scrolling='no' style='border:none; vertical-align:top; overflow:hidden; width:110px; height:65px;'></iframe>
<iframe allowtransparency='true' frameborder='0' scrolling='no' style='width:100px; height:65px; border:none; overflow:hidden; vertical-align:top;' src='http://www.facebook.com/plugins/like.php?href=URLエンコードしたブログのURL(例:http%3a%2f%2fxxxx.blogspot.com%2f)&amp;layout=box_count&amp;show_faces=false&amp;width=100px&amp;action=like&amp;colorscheme=light&amp;height=65px'></iframe>
<g:plusone size="tall" href="ブログのURL"></g:plusone>
ガジェットのコンテンツ欄では、expr:タグが解釈されず、そのまま文字列として表示されてしまうようだ。そのため、ブログのURLやタイトルも直接入力せざるを得なかった。

何かやり方があるのかな?

Bloggerブログ記事のTweetボタンをiframe版にしてみた

Bloggerのブログ記事のテンプレートに追加していたTwitterのTweetボタン。
これをiframeを使ったバージョンへ移行した。

これまでのコードは以下。
<a class='twitter-share-button' data-count='horizontal' data-lang='ja' data-via='Twitterのアカウント' expr:data-text='data:title + &quot;: &quot;+ data:post.title' expr:data-url='data:post.url' href='http://twitter.com/share'>Tweet</a><script src='http://platform.twitter.com/widgets.js' type='text/javascript'/>

これを、以下のiframe版のコードへ変更。
<iframe allowtransparency='true' expr:src='&quot;http://platform.twitter.com/widgets/tweet_button.html?url=&quot; + data:post.url + &quot;&amp;text=&quot; + data:title + &quot;: &quot; + data:post.title + &quot;&amp;related=Twitterのアカウント&amp;lang=ja&amp;count=horizontal&quot;' frameborder='0' scrolling='no' style='width:130px; height:20px;'/>
iframe版ではsrc属性のみexprを使用。


「ブログタイトル:投稿記事のタイトル」という書式は変えていないが、同じことを表現するのに、以前は、
expr:data-text='data:title + &quot;: &quot;+ data:post.title'
としていたが、それを以下のように変更する必要があった。
text=&quot; + data:title + &quot;: &quot; + data:post.title + &quot;
&quot; が複雑につながるので注意深く編集しなくてはならない。


ちなみに、現在のブログ記事フッターのソースコード一覧は以下。
<div class='post-body entry-content'>
  <data:post.body/>
  <div style='clear: both;'/> <!-- clear for photos floats -->

  <!-- Tweet Buttonなど -->
  <div style='float: left; margin-top:2.0em;'>
    <table border='0' cellpadding='0' cellspacing='0'>
      <tr>
        <td align='left' width='130'><iframe allowtransparency='true' expr:src='&quot;http://platform.twitter.com/widgets/tweet_button.html?url=&quot; + data:post.url + &quot;&amp;text=&quot; + data:title + &quot;: &quot; + data:post.title + &quot;&amp;related=Twitterのアカウント&amp;lang=ja&amp;count=horizontal&quot;' frameborder='0' scrolling='no' style='width:130px; height:20px;'/></td>
        <td align='left' width='110'><iframe allowTransparency='true' expr:src='&quot;http://www.facebook.com/plugins/like.php?href=&quot; + data:post.url + &quot;&amp;layout=button_count&amp;show_faces=false&amp;width=90&amp;action=like&amp;colorscheme=light&amp;height=21&quot;' frameborder='0' scrolling='no' style='border:none; overflow:hidden; width:100px; height:21px;'/></td>
        <td align='left' width='90'><g:plusone expr:href='data:post.url' size='medium'/></td>
      </tr>
    </table>
  </div>
  <div style='clear: both;'/>
</div>

2011年2月14日月曜日

TwitterでOAuth認証。後編:OAuth認証を経由してTwitpicへ画像をアップロードする。

TwitterでOAuth認証。前編:デベロッパーページでアプリケーションを登録する。」の続き。

Twitter APIへのライブラリとして、Twitter4Jを使わせていただいた。まずは、Twitter4Jの環境を設定する。


3.Twitter4Jの環境設定

Twitter4J - A Java library for the Twitter API

2011年2月14日段階で最新のバイナリは2.1.11。圧縮ファイルをダウンロードして展開する。展開後、libフォルダ内にある以下2つのjarを、Webアプリケーションのライブラリパスに設定する。
  • twitter4j-core-2.1.11.jar
  • twitter4j-media-support-2.1.11.jar

Twitter4Jでは設定ファイルを作成することが出来る。クラスパスが通っている場所へ、Twitter4Jの設定ファイル「twitter4j.properties」を作成。中身には、Twitterへのアプリケーション登録後に発行された、
  • Consumer key
  • Consumer secret
を設定する()。
 twitter4j.propertiesには、TwitpicのAPI Keyも設定可能なようだが、自分の場合は、設定しても有効にならなかった(・・;。


4.TwitterでOAuth認証

はじめに、TwitterのOAuth認証の流れを軽くおさえておくとよい。以下のTwitterのページでは、比較的分かりやすくOAuth認証の流れが説明されている。オススメ。

Overview of "Sign in with Twitter" | dev.twitter.com


4.1 Authentication URLへリダイレクト

OAuth認証の第一段階。

<ポイント>
1. 認証リクエスト時には毎回ユニークなRequest Tokenを作成し、TwitterのAuthentication URLへ認証のリクエストを発行する。

以下、サンプルコード。
StringBuffer callbackURL = request.getRequestURL();
int index = callbackURL.lastIndexOf("/");
callbackURL.replace(index, callbackURL.length(), "").append("/twitterCallback.jsp");

twitter4j.Twitter twitter = new twitter4j.TwitterFactory().getInstance();
twitter4j.http.RequestToken requestToken = twitter.getOAuthRequestToken(callbackURL.toString());
request.getSession().setAttribute("twitter", twitter);
request.getSession().setAttribute("requestToken", requestToken);

response.sendRedirect(requestToken.getAuthenticationURL());

ここから先はTwitter側の処理となる。


4.2 ユーザーによるログイン&接続許可

ユーザーがログインしていなければ、まずはログインが要求される。


続いて、自分のアプリケーションからTwitterアカウントへ、ユーザーが初めて接続する場合は、接続を許可するかどうか確認する画面が表示される。ユーザーが「許可する」をクリックすると、Callback URLとして指定したページへ、Twitter側からレスポンスが返ってくる。



ログインをキャンセルしたり、アプリケーションの接続を拒否したら、アクセスを許否したメッセージがユーザーへ表示される。



4.3 Callback処理

TwitterからCallback URLへレスポンスが返ってくる時には、「oauth_verifier」というパラメーターが含まれている。このVerifierをTwitterオブジェクトに与えて、認証情報を設定する。

<ポイント>
1. Authentication URLへ渡したRequest TokenとVerifierを引数に、twitter4j.TwitterクラスのgetOAuthAccessTokenメソッドを実行する。
2. Request Tokenは今後必要なくなるので、削除する。

以下、サンプルコード。
twitter4j.Twitter twitter = (twitter4j.Twitter) session.getAttribute("twitter");
twitter4j.http.RequestToken requestToken = (twitter4j.http.RequestToken) session.getAttribute("requestToken");
String verifier = request.getParameter("oauth_verifier");
if(verifier == null){
  //エラー処理
}else{
  twitter.getOAuthAccessToken(requestToken, verifier);
  session.removeAttribute("requestToken");
  response.sendRedirect(request.getContextPath()+ "/twitter.jsp");
}

4.4 Twitpicへ画像をアップロード

いよいよTwitpicへ画像をアップロードする。
なお、Twitterユーザーが、Twitpicを連携アプリとして許可する必要はない。

また、画像のバイト数によってはアップロードに時間がかかる場合があるため、アップロード処理は非同期処理で実装したほうがいい。

<ポイント>
1. Access Token及びAccess Token Secretをコンフィグへ含める。
2. 画像のアップロードサイトとしてTwitpicを指定し、TwitpicのAPI Keyをコンフィグへ含める。

以下、サンプルコード。
twitter4j.Twitter twitter = (twitter4j.Twitter) session.getAttribute("twitter");
twitter4j.http.AccessToken accessToken = null;
try{
  accessToken = twitter.getOAuthAccessToken();
  twitter4j.conf.ConfigurationBuilder cb = new twitter4j.conf.ConfigurationBuilder();
  cb.setOAuthAccessToken(accessToken.getToken());
  cb.setOAuthAccessTokenSecret(accessToken.getTokenSecret());       
  cb.setMediaProvider("TWITPIC");
  cb.setMediaProviderAPIKey("TwitpicのAPI Key");       
  twitter4j.conf.Configuration conf = cb.build();
  twitter4j.media.ImageUpload upload = new twitter4j.media.ImageUploaderFactory(conf).getInstance();

  url = upload.upload(画像のjava.io.Fileオブジェクト);

}catch(twitter4j.TwitterException te){
  //エラー処理
}

アップロードに成功すれば、uploadメソッドの戻り値として、画像のURLが返ってくる。


さらに、ユーザーが画像URLを含んだツイートを出来るようにするには、ツイート文字列を引数にして、twitter4j.TwitterクラスのupdateStatusメソッドを実行すればよい。
twitter4j.Twitter twitter = (twitter4j.Twitter) session.getAttribute("twitter");
twitter4j.Status  status = twitter.updateStatus(text);

TwitterでOAuth認証。前編:デベロッパーページでアプリケーションを登録する。

TwitterのOAuth認証を使ってTwitpicへ画像をアップしてみた。

まずは、自分のアプリケーションをTwitterへ登録して、API KeyやConsumer Keyを取得する。


1.Twitter API Key/Consumer Key/Consumer Secret の取得

Twitterデベロッパーページへサインインし、ページ上部にある「Your apps」をクリックするとTwitter Applicationsページへ遷移する。ページ右側の「新しいアプリケーションを登録する」リンクをクリックして、アプリケーションを登録する。

TOSが表示されるので、「I Accept」で合意。



アプリケーション情報を登録する。ページ下部の「アプリケーションを登録する」ボタンをクリックすると、登録終了。

・アプリケーション名:
必須。アプリケーションの名前。TL上で「from ~」に表示される。日本語OK。
・アプリケーションの説明:
必須。アプリケーションの概要。Twitterユーザーの設定画面にある「連携アプリ」内にアプリケーションの説明として表示される。日本語OK。
・アプリケーションのウェブサイトURL:
必須。アプリケーションのホームページのURLを入力。TL上のfrom~のリンク先として使用される。
・所属会社/団体:
会社名等。 OAuth認証のプロセスで、「○○が開発した×××というアプリケーションがTwitter上のデータにアクセスしようとしています」という確認ダイアログ表示時に利用される。また、Twitterユーザーの設定画面にある「連携アプリ」内の作者名としても利用されるので、入力しておいたほうがベター。
・アプリケーションの種類:
Webアプリケーションの場合は「クライアントアプリケーション」を選択。
・コールバックURL※1:
Webアプリケーションの場合は必須。アプリケーション登録後でも編集可能。
・標準のアクセスタイプ:
「 Read & Write」を選択。
・アプリケーションのアイコン:
アプリのアイコン。無くてもOKだが設定しておいた方がベター。
※1
・Webアプリケーションの場合、Callback URLを指定しておかないと、TwitterでOAuth認証が終了した後で、自作アプリケーション側へレスポンスが返ってきたときに受け止める窓口がないので、エラーになる。その場合、以下のメッセージが表示される。
"Desktop applications only support the oauth_callback value 'oob'"


登録後、Twitterデベロッパーページの「Your apps」リンクをクリックすると、登録したアプリケーションの情報が表示される。


このページ内の以下2点は、OAuth時に必要になるので要チェック。
  • Consumer key
  • Consumer secret


2.TwitPic API Key の取得
TwitPicデベロッパーページへログインし、ページ上部にある「Register an App」をクリックするとTwitter Applicationsページへ遷移する。ここでアプリケーションを登録して、TwitpicのAPI Keyを取得する。

Application Title:
必須。TwitPicのページで「from ~」に表示される。日本語不可(文字化ける)。
Application Description:
必須。アプリケーションの概要。日本語不可(文字化ける)。
Application Homepage:
必須。アプリケーションのホームページのURLを入力。
Your Email:
必須。登録するメールアドレス。

登録後、Twitpic API Keyが表示される。これはTwitpicへ画像をアップロードする際に必要になるので要チェック。



以上で、登録手続きは終了。

ここから先は「TwitterでOAuth認証。後編:OAuth認証を経由してTwitpicへ画像をアップロードする。」へ続く。

2010年12月21日火曜日

Tweet ボタンをiframe を使って設置する

Tweet ボタンは、「Twitter / ツイートボタン」から、ウィザード形式で簡単に作成できる。

このページを使った場合、デフォルトでは、Twitter のwidgets.js をロードするコードになっている。
だが、iframe を使っても、Tweet ボタンは設置可能だ。

iframe を使っての設置方法は、Twitter のdeveloper ページに掲載されている。
Tweet Button | dev.twitter.com

<iframe allowtransparency="true" frameborder="0" scrolling="no" style="width:130px; height:20px;" src="http://platform.twitter.com/widgets/tweet_button.html?url=URL(UTF-8でエンコード)&amp;text=デフォルトで埋め込んでおきたい文字列(UTF-8でエンコード)&amp;via=Twitterのスクリーンネーム&amp;lang=ja&amp;count=horizontal(ボタン横にカウントを表示)"></iframe>

iframe のsrc は、http://platform.twitter.com/widgets/tweet_button.html であり、そのhtml にクエリーパラメータとして、以下のパラメータを与える。
  • url
  • text
  • via
  • lang
  • count
連結する「&」は、エスケープして「&amp;」と記述する点に注意。

iframe で定義しても、widgets.js をロードする場合と、全く同じ挙動になる。

Tweetボタン、Buzzボタン、FacebookのLikeボタン、いずれかが原因でIE8でページ表示に失敗する

Tweetボタン、Buzzボタン、FacebookのLikeボタンを設置したページが、IE8で表示できないという報告を、幾つか頂いた。それらのボタンが設置されていない他のページは、何ら問題なく表示されるらしい。

しかも、IE8ユーザーだと常にページが表示されないのではなく、表示されないユーザーも若干いる、という状況。自分のIE8では、表示されないと報告を受けたページは、問題なく表示される。

OSはWindows 7 32bit/64bit、Vistaと共通点が見られないが、報告をもらった方のブラウザは全てIE8だった。

ちなみに互換表示でも、表示されない状況は変わらないらしい。


どのように表示されないのか、具体的な報告を送ってくれた方のメールには、以下のエラーメッセージとエラーコードがあった。

メッセージ: HTML Parsing Error: Unable to modify the parent container element before the child element is closed (KB927917)
ライン: 0
文字: 0
コード: 0

「KB927917」については、Microsoftのサポートページに対応策が書かれている。
Why do I receive an "Operation aborted" error message when I visit a Web page in Internet Explorer?

記事を読んだ限り、div要素の内側のscriptブロックで、閉じられていないdiv要素の親コンテナーの内容を変更しようとしたときに発生するようだ。


そこで疑ったのが、TweetボタンやBuzzボタン。それらはjsを読み込んでいるが、もしかしたら、申し訳ないが、それらのjsの書き方が原因でKB927917が起こっているのではないか、ということ。

試しに、Tweetボタン、Buzzボタン、FacebookのLikeボタン、全てを非表示にしてみたところ、KB927917が発生せず、ページが完全に表示できたと報告を頂いた。他サイトのコードの埋め込みは増えているが、大切なページに埋め込むときには慎重にならないといけない。


では、jsのロードではなく、iframeではどうだろいうということで、Twitterのiframeの記述だけ加えてみた。それでまた表示できなくなったと報告を受けるかどうか、様子を見てみよう。

なお、Facebookは最初からiframeのコードが提供されている。Twitterは、デフォルトはjsをロードするコードが提供されるが、調べるとiframeのコードの書き方も提供されている

犯人はBuzzかなあ・・・?

API制限が緩くて開発者としては使いやすいサービスなので、Buzz頑張って欲しいなと思っているのだが・・・

2010年11月15日月曜日

マップ上データのビジュアル表現で参考になるサイト

マップ上にデータをマッピングする時のビジュアル表現として、参考になるサイトやアプリケーションを幾つかリストアップ。


1. The Open PV Project

The Open PV Project - Time Map
全米各地の太陽光発電システムの導入を、ヒートマップのようにプロットしている。Google Map API+Flashを使用。


2. A World Of Tweets

a world of tweets
Twitter Streaming APIとYahoo! Placemaker APIを使ってツイートの密度をヒートマップや煙のような雲で表示している。HTML5のCanvasを使用。


3. Magic Fiddle, Glee, Magic Piano, Ocarina by Smule

Smuleが作っているiPhoneやiPadアプリでの地図上のデータ表現は、どれも直感的で美しく、参考になる。

Magic Fiddle by Smule - Experience Social Music

Glee by Smule - Experience Social Music

Magic Piano by Smule - Experience Social Music

Ocarina by Smule - Experience Social Music

2010年11月5日金曜日

メドベージェフ大統領が国後島でツイート

There are so many beautiful places in Russia! Here is Kunashir  on Twitpicメドベージェフ大統領がTwitterアカウントを持っていると知り、彼のツイート @KremlinRussia_Eを見てみたら、案の定、国後島を訪れた際の写真がTwitpicに掲載されているorz。

なぜ現在のあの島の状況を、メドベージェフ大統領の写真から知らなきゃならないんだ。

There are so many beautiful places in Russia! Here is Kunashir http://twitpic.com/32zmwrless than a minute ago via Twitpic



その2つ前のツイートには、国後島を訪れる理由と見られる彼の意思がツイートしてある。

It is the president's duty to oversee the development of every region of the country, including the most remote ones.less than a minute ago via web



国後島がロシアの領土であれば、このツイートはなんら問題はない。その通りだ。

だが、国後島は日本の領土だ。

いや、国後島、択捉島、色丹島、歯舞諸島といったいわゆる北方四島だけでなく、占守島までの千島列島全域と南樺太までのいわゆる北方領土までが、日本の領土だと私は考えている。


日本の首相官邸ページにあたるであろう、クレムリンニュース下のロシア大統領ページ。
President of Russia(英語版)
Президент России(ロシア語版)

まず、眼につくのが「News map: in the Russian regions / in the world」というFlashコンテンツ。
マウスオーバーすると、メドベージェフ大統領がいつ、何で訪れたのか、概要を表示する。

特徴的なのは、過去に訪れていて記事があるところが濃い色で、訪れておらず記事がないところが薄い色で表示されていること。これにより、彼がまだロシア領土で訪れていないところが明確に分かるようになっている。また逆に、大統領がいかにロシア各地を訪れて活動しているかも分かるようになっている。

ロシア語版では全領土が濃い色で塗られている。もし国後島を訪れなければ、国内版マップではサハリン領域だけずっと薄い色で表示されていたのかもしれない。国後島を訪れたのは、このマップを埋める一環ということもあったかもしれない。

ちなみに、英語版ではところどころ薄い色がある。英語版ニュースとして記事にするまでもない国内ニュースがあるので、国内と国外でマップデータが異なるのだろう。

トップページに、このロシア領土を表示するFlashコンテンツがあるということは、どれだけロシア政府が領土や領海を意識しているかということを表している。領土・領海に対して意識を強く持つことは、私は、ごく当たり前のことで、あるべき姿だと思う。


一方、日本の首相官邸の英語版ページ。
Prime Minister of Japan and His Cabinet

領海や領土を象徴するコンテンツは無い。
また、残念だが、ロシア政府のページの方がリッチに感じる。なぜだろう。

まず、日本は、コンテンツが少ないように感じる。
また、首相官邸ページにはファビコンがない。ロシアのものにはロシア国旗をあしらったものが設定されている。
そして、ロシア政府のページは、政府の公式TwitterやYouTubeチャンネルへのリンクがトップにある。各記事には、FacebookやTwitterへ投稿するリンクも設けられている。

あと、私はサイトのソースを見る癖があるのだが、ロシアのものはコメントが英語で書かれていて、ソースが整理されていて美しい。日本のものは日本語のコメントが随所に見られ、ソースがあまり美しくない。

首相官邸ページの日本語版はまだよい。だが、英語版のページははっきり言ってショボい。閣僚一覧ページなどは、Web 2.0どころではなく、Web 1.0レベルに感じる。
Members of the Kan Cabinet


先の記事「Twitter外交で日本の存在感なし | Twitter diplomacy: Who Follows Whom Among World Leaders」にも書いたが、日本政府の発信力を向上させる必要を、強く感じる。

Twitter外交で日本の存在感なし | Twitter diplomacy: Who Follows Whom Among World Leaders

TechCrunch.com
Twitter diplomacy: Who Follows Whom Among World Leaders

今や各国首脳は、Twitterアカウントを持ち、互いにフォローしあい、時にはダイレクトメッセージまで送り合っているようだ。これでは本当に表題通り、Twitter外交だ。

The @KremlinRussia_E and the @WhiteHouse both follow UK Prime Minister David Cameron @Number10gov. These three could actually conduct a direct and secret Twitter diplomacy in 140 characters literally spelling ‘the end of those red phones that have been sitting around for so long’ as Barack Obama recently joked.

稚拙ながら訳してみました。
@KremlinRussia_E(メドベージェフ大統領が英語でツイートするアカウント)と@WhiteHouseはどちらも英国のデービッド・キャメロン首相のカウント@Number10govをフォローしている。この3つのアカウントは、実はダイレクトで秘密の140文字Twitter外交を実際に行なったようで、”長い間居座っていたあの赤電話はもう要らないんじゃないか”とオバマ大統領が最近ジョークを言った。


例えば、メドベージェフ大統領の英語ツイートアカウント @KremlinRussia_Eは、シュワルツネッガー州知事 @Schwarzenegger、ノルウェーのイエンス・ストルテンベルグ首相 @jensstoltenberg、カナダのスティーブン・ハーパー首相 @pmharper、英国のデービッド・キャメロン首相 @Number10gov、オバマ大統領 @BarackObamaとホワイトハウス @WhiteHouseをフォローしている。

メドベージェフ大統領はフォローしているのが10人で分かりやすかったのだが、他の首相・大統領は、何万、何十万というアカウントをフォローしているので、相互フォローをチェックするのが面倒でやっていない(^^;)。

が、オバマさんのジョークのように、これからはTwitter上でダイレクトメッセージをやりとりする機会も増え、Twitterも外交の場へと成長していくだろう。


では、我が日本は?

TechCrunchの写真に菅首相は写っていないし、TechCrunchの記事中に一度もJapanという単語が出てこない。

問題だ。

彼のツイートはユニークだね、と言われるような発信力を菅首相や官邸に求めたい。

2010年10月18日月曜日

TwitterのStreaming APIでlocationsを指定する方法とSearch APIでgeocodeを指定する方法

位置情報付きのツイートを利用するには、Streaming APIでlocationsを指定する方法と、REST型Search APIでgeocodeを指定する方法の2種類がある。

どちらにも、ご利用上の注意があり、どちらが正解とも言えない。
明日に向かって昇龍拳: TwitterのStreaming APIでlocationsを指定する場合の注意点
明日に向かって昇龍拳: TwitterのSearch APIでgeocodeを指定する場合の注意点


しかし個人的には、位置情報付きのツイートを取得するには、現時点では、Streaming APIでlocationsを指定する方がよいと思う


Streaming APIを使うメリット: 1. rate limitingがない

マップをインターフェースにするなどして、頻繁にTwitterのサーバへリクエストを発行するような仕様にする場合には、回数制限というのは大きなボトルネックだ。Streaming APIでは、一度開いた接続は基本的に無期限だ。回数制限という概念がない。


Streaming APIを使うメリット: 2. geo要素がnot nullなツイートしか検索結果に含まれない

位置情報が必ず指定されている、つまりgeo要素がnot nullなツイートしか検索結果に含まれないので、結果データが扱いやすい。

Search APIではやたらめったら結果が含まれてくるが、その中から使えるデータを精査して取り出すなど手を加える必要がある。作るときにも、その面は手間がかかるし、アプリケーションのパフォーマンスにも、コストとして影響するだろう。

更に、Search APIでは位置情報が付いたツイートが何ページ目に出現するのか分からないので、結局多くの結果にアクセスする必要が出てくる。当然、rate limitingに引っ掛かり易くなる。

geoがnot nullなツイートに限られることは、結果数が少なくなるというデメリットでもある。
しかしそれは、位置情報が付いたツイートが増えるように位置情報を付け易いクライアントを別途用意したり、少しずつでも位置情報付きのツイートが将来的に増えていくことで、状況も変わっていくだろう。


Streaming APIを利用するには、OAuthの利用や、切断時のリトライなど、実装しなくてはならないことが幾つかあるが、それらを考えても、やはり、上記のメリットの方が現時点では上回る。

TwitterのSearch APIでgeocodeを指定する場合の注意点

TwitterのREST型Search APIでは、geocodeをパラメータに含めて、ある地点の近くのツイートを取得することができる。いわゆるnearby検索だ。しかし、実際に使ってみると問題が多々ある。


1. geoがnullなツイートがほとんど

検索結果に含まれるツイートは、ほとんど(95%以上)geo要素がnullで、位置情報が含まれていないものばかり。

では、どうやって位置情報がプロットできるツイート数を増やすか。

まずは、プロフィールに入力されている住所をジオコードしたり、「iPhone:35.xxx, 132.xxx」などの文字列を自分でパースして緯度経度を取得したりする方法が考えられる。手間だが、これを行えば、100件中10件ほどは位置情報がプロットできるツイートになる。

次に、検索結果は最大約1500件取得できるので、1ページあたり最大100件で、ページナンバーの値を1から15まで変えながら、つまり15回リクエストを発行すれば、位置情報がプロットできるツイート数を増やせるだろう。しかし、この場合はrate limiting(IPベースのリクエスト制限回数)をオーバーしないか、注意が必要だ。


2. 検索結果が必ずしも指定した条件に合致していない

検索条件にgeocode及び半径 N km と指定しても、指定条件に当てはまりそうにないツイートが検索結果に入ってくる。検索対象が日本のどこかの場合は、現住所に日本と書かれているユーザのツイートも検索結果に含むというのが、Twitter側の仕様のようだ。


3. 検索結果の並び順が指定できない

ツイート日の降順に検索結果は並んでいる。指定したgeocodeに近い順には並んでいないので、そのようなリストを作りたかったら自分でソートする必要がある。


4. 検索結果が安定しない

同じクエリーを投げても、検索するたびに検索結果が変わる。なぜだかは分からない。


結論としては、「TwitterのSearch APIで、指定した緯度経度から半径 N km内のツイートを全て取得する」 ことは、簡単ではないということだ。

rate limitingを上回らないように気をつけながら、独自のパーサーなども絡ませて位置情報をプロットできるツイート数を増やして、使っていくことになる。

rate limitingを気にしたくなければStreaming APIを使う手もあるが、それも決してバラ色の解決策ではないのだ。
明日に向かって昇龍拳: TwitterのStreaming APIでlocationsを指定する場合の注意点

2010年10月16日土曜日

TwitterのREST型Search APIを使う場合の注意点

TwitterのSearch APIを使う時は、以下の点に注意する。


1. ユーザ認証は不要

Search APIの利用には認証は必要ない。誰でもリクエストが可能。



2.rate limiting(IPベースの制限回数)がある

Rate Limiting | dev.twitter.com

ユーザ認証が要らず、アノニマスで接続できる分、1IPあたり1時間内に発行できるリクエスト回数が限られている

不必要な検索や荒らしを防ぐために、それが何回なのかは公開されていない。Search APIと同じくREST型のREST APIは1時間あたり150回だが、ちなみにそれよりは多いらしい。多くのアプリケーションでは十分ではなかろうかというくらい、とある。

Requests to the Search API, hosted on search.twitter.com, do not count towards the REST API limit. However, all requests coming from an IP address are applied to a Search Rate Limit. The Search Rate Limit isn't made public to discourage unnecessary search usage and abuse, but it is higher than the REST Rate Limit. We feel the Search Rate Limit is both liberal and sufficient for most applications and know that many application vendors have found it suitable for their needs.

でも気をつけないといけないのは、IPあたりという点だ。

Search APIを使った自分のプログラムのリクエスト以外にもTwitterのAPIを呼び出しているものがあれば、それもSearch APIの制限回数の中に含まれる。

つまり、何らかのTwitterクライアントを動かしていたり、他のサービスでTwitterのAPIを使っている場合は、それらもSearch APIの回数にカウントされるので、その分も考慮しないと、デバッグしているだけで制限回数をオーバーしかねない。

制限回数をオーバーするとHTTPステータスコード 420 がTwitterのサーバから返ってくる。

あまりにも制限回数を超えるような高負荷なリクエストを連続してTwitterへ送った場合は、ブラックリストに登録されることもある。ブラックリストに載ったかもと思ったらAPIサポートページに相談して解除を申請することになる。



3. User-Agentを含まないとリクエストの制限回数がより少なくなる

Search APIによるリクエストには、ユニークで識別可能なUser-Agentが含まれている必要がある。でないと制限回数はより少なくなってしまう。



4. 制限回数を増やすような相談は可能だが、まずは自分でやることやってから

REST APIにはホワイトリストがあり、申請が認められれば1時間あたり20,000回まで制限が緩和できる。
が、Search APIの場合は、まずは自分でパフォーマンスチューニングをしてください、と。もうこれ以上は無理だ!となった場合にしか、APIサポートページに相談してこないでね、とある。

There isn't a whitelist for the Search API in the same way there is for the REST API. However, under some rare circumstances we have worked with developers to raise rate limiting for their applications search requests.

We do not give preemptive whitelisting for the Search API though. You must have a working application that has proven it requires more capacity before we will discuss whitelisting. If you feel that your application is doing everything it can to limit and combine queries where appropriate you can contact the email address on the API support page to discuss your needs.

また、IPベースかユーザーアカウントベースでホワイトリストへの申請が可能なREST APIとは異なり、Search APIではIPベースしか認められていない。

制限回数がとてもシビアな問題な場合は、Streaming APIを使ってね、ということだ。

TwitterのStreaming APIでlocationsを指定する場合の注意点

TwitterのStreaming APIを使って、プッシュ型で位置情報付きのツイートを取得する時は、以下の点に注意する。


1. Geotagging APIを使用して作成され、且つ、追跡する対象領域内に位置するツイートだけが結果に含まれる

つまり、ユーザーのプロフィールにある現在地の情報はツイートのフィルターには使われない

もし、ユーザーがプロフィールの現在地に“San Francisco”と設定していても、そのツイートがGeotagging APIを使っていなくてgeo要素がなければ、検索結果のストリームには含まれない。

Only tweets that are both created using the Geotagging API and are placed from within a tracked bounding box will be included in the stream – the user’s location field is not used to filter tweets (e.g. if a user has their location set to “San Francisco”, but the tweet was not created using the Geotagging API and has no geo element, it will not be included in the stream).


2. 追跡する対象領域はカンマで区切った経度と緯度のペア指定

最初のペアは対象領域の南西の角を示す。
例えばlocations=-122.75,36.8,-121.75,37.8はサンフランシスコエリアのツイートを追跡する指定になる。

バウンディングボックス、つまり追跡する対象領域は複数の指定ができて最大25個まで可能。例えばlocations=-122.75,36.8,-121.75,37.8,-74,40,-73,41はサンフランシスコとニューヨーク市エリアのツイートを追跡する指定になる。

Bounding boxes are specified as a comma separate list of longitude/latitude pairs, with the first pair denoting the southwest corner of the box. For example locations=-122.75,36.8,-121.75,37.8 would track tweets from the San Francisco area. Multiple bounding boxes may be specified by concatenating latitude/longitude pairs, for example: locations=-122.75,36.8,-121.75,37.8,-74,40,-73,41 would track tweets from San Francisco and New York City.

(・・・)and you may specify up to 25 bounding boxes.


3. locationsの指定とtrackの指定の両方を行なうとOR検索になる

なんと、対象領域の指定が論理ORなのである。

よって、検索キーワードの指定(trackの指定)に「twitter」、追跡する対象領域(locationsの指定)に-122.75,36.8,-121.75,37.8を行なうと、 twitterを含むツイート(geo要素がないツイートでも)か、あるいはサンフランシスコエリアのツイートという条件を指定したことになる。

Bounding boxes are logical ORs. A locations parameter may be combined with track parameters, but note that all terms are logically ORd, so the query string track=twitter&locations=-122.75,36.8,-121.75,37.8 would match any tweets containing the term Twitter (even non-geo tweets) OR coming from the San Francisco area.


特に、1と3が問題だ。

3は、ドキュメントを読んでいて、「ちょっとちょっと~」とついつい突っ込みたくなった。なんでORなの?そこはANDでしょう。

しかし、Twitter側で実装していないのであれば、ストリームで送られてくる検索結果を自分でフィルタリングすればよいだけのこと。まあ、まだよい。


しかし、1の方は大きな障害になるかもしれない。

1は、Twitter側のアプローチとして考えると、正しい。位置情報で絞り込みたいので、位置情報を指定していないツイートは検索結果に含まれるべきではない。

但し、まだまだgeo要素を含んだツイートは少ない。geoがnullでないツイートに限ると、結果件数はとても寂しいものになるだろう。そんな状態でアプリケーションを作っても、ゴーストタウンのようになってしまうかもしれない。何らかの工夫が必要だ。

逆に、プロフィールの現在地をストリームで取得する方法があるのか調べてみたが、今のところストリーム系の3つのAPI、Streaming APIUser StreamsSite Streamsのどれにもそれらしい記述は見当たらない。


ところで、Streaming APIは、2010年8月31日からベーシック認証がdeprecatedになり、OAuthを使うこととなったので、それもチェックポイントだ。
Transitioning from Basic Auth to OAuth | dev.twitter.com

OAuthの具体的な使用方法は、ドキュメントをまだ詳しく読んでないので分からないが、のっけから、「Transitioning from Basic Authentication to OAuth isn't simple for everyone. (ベーシック認証からOAuthへ切り替えることはすべての人にとって簡単というわけではない)」とあるゾ。

2010年10月14日木曜日

json指定でSearch APIを使ってリクエストを投げた時にTwitterのサーバから返ってくるデータ形式

json指定で、Search APIを使ってリクエストを投げた時に、Twitterのサーバから返ってくるデータ形式のまとめ。

「results」というルートの下に以下の形式のデータが収まっている。

  • location
    プロフィールに設定している現在地。

  • profile_image_url
    プロフィールに設定しているアイコン画像のパス。

  • created_at
    つぶやき日時(GMT+00)。

  • from_user
    つぶやいたアカウント名。misahotなど。

  • metadata
    recent(最近のもの)やpopular(人気のもの)などの検索結果形式。

  • to_user_id
    誰宛につぶやいたのか。誰宛でもない場合はnull。

  • text
    エンコードされたつぶやき文字列。

  • id
    ツイートID。

  • from_user_id
    つぶやいたユーザID。32102100などTwitter内で管理されている番号。

  • geo
    位置情報。位置を含まない場合はnull。

  • iso_language_code
    つぶやいた言語のISOコード。jaなど。

  • source
    ツイートに使ったアプリケーションのリンクタグ。<a href="http://twitter.com/">web</a>など。