2011年9月22日木曜日

[Android] GridView内に非同期で画像を表示する方法

このエントリーをはてなブックマークに追加


【構成】

【AsyncGridViewActivity.java -メインアクティビティー】
package com.ayakix;

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.os.Bundle;
import android.widget.GridView;

public class AsyncGridViewActivity extends Activity {
private GridView gv;
private List urlList;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// グリッドビュー
gv = (GridView) findViewById(R.id.gv);
// ダウンロードURLリスト
urlList = new ArrayList();

urlList.add("http://example.com/test.png");

gv.setAdapter(new ImageGridViewAdapter(this, urlList));
gv.invalidate();
}
}


【ImageDownloadTask.java -非同期の画像ダウンローダー】
package com.ayakix;

import java.io.BufferedInputStream;
import java.io.InputStream;
import java.net.URL;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Handler;
import android.util.Log;
import android.widget.ImageView;

public class ImageDownloadTask {
private ImageView iv;
private String url;
private Bitmap bitmap;

public ImageDownloadTask(ImageView iv, String url){
this.iv = iv;
this.url = url;
}

public void execute(){
final Handler mHandler = new Handler();
new Thread(new Runnable() {
public void run() {
bitmap = getBitmap(url);
if(bitmap == null) return;
// ポスト処理
mHandler.post(new Runnable() {
public void run() {
// 画像のセット
iv.setImageBitmap(bitmap);
}
});
}
}).start();
}

/*
* 画像のダウンロード
*/
public Bitmap getBitmap(String url){
Bitmap bitmap = null;
try{
BufferedInputStream in = new BufferedInputStream((InputStream) (new URL(url)).getContent());
bitmap = BitmapFactory.decodeStream(in);
in.close();
} catch (Exception ex){
return null;
}
return bitmap;
}
}


【ImageGridViewAdapter - グリッドビューアダプター】
package com.ayakix;

import java.util.List;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;

public class ImageGridViewAdapter extends BaseAdapter {
private List urlList;
private LayoutInflater inflater;

static class ViewHolder{
ImageView iv_image;
}

public ImageGridViewAdapter(Context context, List urlList) {
this.urlList = urlList;
inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = convertView;
ViewHolder holder;
if (view == null) {
holder = new ViewHolder();
view = inflater.inflate(R.layout.imagegridview, null);
// 画像
holder.iv_image = (ImageView) view.findViewById(R.id.imagegridview_iv_image);
// 画像の非同期DL
new ImageDownloadTask(holder.iv_image, urlList.get(position)).execute();
// 登録
view.setTag(holder);
} else {
holder = (ViewHolder)view.getTag();
}
return view;
}

@Override
public long getItemId(int position) {
return 0;
}

@Override
public Object getItem(int position) {
return null;
}

@Override
public int getCount() {
return urlList.size();
}
}


【imagegridview.xml -グリッドビューの各要素のレイアウト定義】
<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<!-- 写真 -->
<ImageView
android:id="@+id/imagegridview_iv_image"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:adjustViewBounds="true"
/>
</RelativeLayout>


【main.xml - メインアクティビティーのレイアウト定義】
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<GridView
android:id="@+id/gv"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:verticalSpacing="10sp"
android:horizontalSpacing="10sp"
android:numColumns="4"
android:stretchMode="columnWidth"
android:gravity="center"
/>
</LinearLayout>


【AndroidManifest.xml】
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.ayakix"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk android:minSdkVersion="4" />

<uses-permission android:name="android.permission.INTERNET"></uses-permission>

<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".AsyncGridViewActivity"
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>

ポイントとなるImageDownloadTask.java内では、画像のダウンロード処理に対して、Handlerを使用しています。このプログラムを作成する前にはAsyncTaskを利用していたのですが、AsyncTaskは同時に処理できるタスク数が標準では5になっているみたいです(プールサイズが5)。そのため、多くの処理を並列に行えないため、Handlerを使いました。

AndroidのカメラプレビューでOverlayを表示する方法

このエントリーをはてなブックマークに追加

【構成】

【MainActivity.java - メインアクティビティー】

package com.ayakix;

import android.app.Activity;
import android.os.Bundle;
import android.view.ViewGroup.LayoutParams;
import android.view.Window;
import android.view.WindowManager;

public class MainActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(new CameraView(this));
addContentView(new CameraOverlayView(this), new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
}
}


【CameraView.java - カメラサーフェースビュー】

package com.ayakix;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.hardware.Camera;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

public class CameraView extends SurfaceView implements SurfaceHolder.Callback, Camera.PictureCallback, Camera.AutoFocusCallback {
private SurfaceHolder holder;
private Camera camera;

public CameraView(Context context) {
super(context);
holder = getHolder();
holder.addCallback(this);
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}

@Override
public void surfaceCreated(SurfaceHolder holder) {
try {
camera = Camera.open();
camera.setPreviewDisplay(holder);
} catch (Exception e) {
}
}

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
camera.startPreview();
}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {
camera.setPreviewCallback(null);
camera.stopPreview();
camera.release();
camera = null;
}

@Override
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction()==MotionEvent.ACTION_DOWN) {
camera.autoFocus(this);
}
return true;
}

@Override
public void onAutoFocus(boolean success, Camera camera) {
camera.autoFocus(null);
camera.takePicture(null, null, this);
}

@Override
public void onPictureTaken(byte[] data, Camera camera) {
try {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 4;
Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length, options);
// bitmap画像をカットする処理など
int w = bitmap.getWidth();
int h = bitmap.getHeight();
// 中央部分の四角形をカット
bitmap = cutBitmap(bitmap, (w-h)/2, 0, h, h);
// 90度回転
bitmap = rotateBitmap90(bitmap);

// とりあえずもう一度カメラプレビュー
camera.startPreview();
} catch (Exception e) {
}
}

/*
* カット
*/
public Bitmap cutBitmap(Bitmap bmp,int x,int y,int w,int h) {
Bitmap result=Bitmap.createBitmap(w,h,Bitmap.Config.ARGB_8888);
Canvas canvas=new Canvas(result);
canvas.drawBitmap(bmp,-x,-y,null);
return result;
}
/*
* 画像の回転 90度
*/
public Bitmap rotateBitmap90(Bitmap bmp) {
int w=bmp.getWidth();
int h=bmp.getHeight();
Bitmap result=Bitmap.createBitmap(h,w,Bitmap.Config.ARGB_8888);
Canvas canvas=new Canvas(result);
canvas.rotate(90,0,0);
canvas.drawBitmap(bmp,0,-h,null);
return result;
}
}


【CameraOverlayView.java - オーバーレイビュー】

package com.ayakix;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.View;

public class CameraOverlayView extends View {
private int width, height;

public CameraOverlayView(Context context) {
super(context);
setFocusable(true);
}

@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh){
// ビューのサイズを取得
width= w;
height= h;
}


/**
* 描画処理
*/
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
// 背景色を設定
canvas.drawColor(Color.TRANSPARENT);

// 描画するための線の色を設定
Paint paint = new Paint();
paint.setStyle(Paint.Style.FILL);
paint.setARGB(100, 0, 0, 0);

// 上枠表示
canvas.drawRect(0, 0, (width-height)/2, height, paint);
// 下枠表示
canvas.drawRect((width-height)/2 + height, 0, width, height, paint);

// 中央十字憑依時
int len = height / 10;
paint.setARGB(255, 255, 0, 0);
canvas.drawLine(width/2, height/2-len, width/2, height/2+len, paint);
canvas.drawLine(width/2-len, height/2, width/2+len, height/2, paint);
// 円表示
paint.setStyle(Paint.Style.STROKE);
canvas.drawCircle(width/2, height/2, len*5, paint);
}
}


【AndroidManifest.xml】

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.ayakix"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk android:minSdkVersion="4" />

<uses-permission android:name="android.permission.CAMERA" />
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".MainActivity"
android:label="@string/app_name"
android:screenOrientation="landscape">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".activity.CameraActivity" android:screenOrientation="landscape"></activity>

</application>
</manifest>

2011年9月13日火曜日

Androidでシンプルなタブを作る方法

このエントリーをはてなブックマークに追加
【構成】

【SimpleCustomTabActivity.java - メインとなるActivity】
package com.ayakix;

import android.app.TabActivity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.TabHost;
import android.widget.TextView;

public class SimpleCustomTabActivity extends TabActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

TabHost tabHost = getTabHost();
tabHost.getTabWidget().setDividerDrawable(R.drawable.tabdivider);

// タブの初期化
View v1 = new MyView(this, "AA");
tabHost.addTab(tabHost.newTabSpec("AA")
.setIndicator(v1)
.setContent(new Intent(this, SubActivity.class)));
View v2 = new MyView(this, "BB");
tabHost.addTab(tabHost.newTabSpec("BB")
.setIndicator(v2)
.setContent(new Intent(this, SubActivity.class)));
View v3 = new MyView(this, "CC");
tabHost.addTab(tabHost.newTabSpec("CC")
.setIndicator(v3)
.setContent(new Intent(this, SubActivity.class)));
}

private class MyView extends FrameLayout {
private LayoutInflater inflater;
public MyView(Context context) {
super(context);
inflater = LayoutInflater.from(context);
}

public MyView(Context context, String title) {
this(context);
View v = inflater.inflate(R.layout.tabwidget, null);
TextView tv = (TextView) v.findViewById(R.id.tabwidget_tv);
tv.setText(title);
addView(v);
}
}
}


【SubActivity - タブコンテンツとなるActivity】
package com.ayakix;

import android.app.Activity;
import android.os.Bundle;

public class SubActivity extends Activity{
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.sub);
}
}


【tabback.xml - タブの背景】
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 選択時 -->
<item android:state_selected="true">
<shape android:shape="rectangle">
<solid
android:color="#FF33CC33"
/>
<!-- 角を丸める -->
<corners
android:radius="50sp"
/>
</shape>
</item>
<!-- 非選択時 -->
<item android:state_selected="false">
<shape android:shape="rectangle">
<solid
android:color="#FF3333CC"
/>
</shape>
</item>
</selector>


【tabdivider.xml - タブ間の調整】
<?xml version="1.0" encoding="utf-8"?>
<shape
xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle" >
<size
android:width="20px"
/>
<solid
android:color="#00000000"
/>
</shape>


【main.xml - SimpleCustomTabActivityの画面構成】
<?xml version="1.0" encoding="utf-8"?>
<TabHost
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/tabhost"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<LinearLayout
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TabWidget
android:id="@android:id/tabs"
android:layout_width="fill_parent"
android:layout_height="50sp"
android:layout_marginTop="10sp"
android:layout_marginLeft="10sp"
android:layout_marginRight="10sp"/>
<FrameLayout
android:id="@android:id/tabcontent"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
</LinearLayout>
</TabHost>


【sub.xml - SubActivityの画面構成】
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#FF33CC33">
</LinearLayout>


【tabwidget.xml - タブの画面構成】
<?xml version="1.0" encoding="utf-8"?>

<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center"
android:background="@drawable/tabback">

<TextView
android:id="@+id/tabwidget_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
</LinearLayout>


【styles.xml - スタイルの定義】
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="NoShadowTheme" parent="@android:style/Theme.Light">
<item name="android:windowContentOverlay">@null</item>
</style>
</resources>


【AndroidManifest.xml - マニフェストファイル】
<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="com.ayakix"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk android:minSdkVersion="4" />

<application
android:icon="@drawable/icon"
android:label="@string/app_name"
android:theme="@style/NoShadowTheme">
<activity
android:name=".SimpleCustomTabActivity"
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=".SubActivity">
</activity>
</application>
</manifest>



ポイントとなるのは、テーマを設定しているところ。デフォルトのテーマでは、タブとコンテンツの間にドロップシャドウがついてしまう。android:windowContentOverlayをnullにしたテーマを適応することで、ドロップシャドウを無効にする。

2011年9月6日火曜日

Androidで複数ボタンから1つだけ選択するUIの実現

このエントリーをはてなブックマークに追加

少しタイトルがわかりにくいですが、複数のボタンから一つ選択すると、他のボタンは非選択状態になると言ったUIの実現方法です。
これは、ラジオボタンからチェックするボタンを消し、背景画像を用意することで実現できます。

【構成】


【MainActivity.java】
package com.ayakix;

import android.app.Activity;
import android.os.Bundle;

public class MainActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
}


【main.xml】
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<RadioGroup
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:orientation="horizontal">
<RadioButton android:id="@+id/rb_left"
android:text="Left"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:checked="true"
android:layout_weight="1"
android:button="@null"
android:background="@drawable/back" />
<RadioButton android:id="@+id/rb_center"
android:text="Center"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:button="@null"
android:background="@drawable/back" />
<RadioButton android:id="@+id/rb_right"
android:text="Right"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:button="@null"
android:background="@drawable/back" />
</RadioGroup>
</LinearLayout>

※android:button="@null"とすることで、ラジオボタンのチェックするボタンが表示されなくなり、自分で設定する背景であるandroid:background="@drawable/back"のみが表示されるようになります。

【back.xml】
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_checked="false">
<color android:color="#FFFF0000" />
</item>
<item android:state_checked="true">
<color android:color="#FF00FF00" />
</item>
</selector>

※falseの場合には非選択状態の背景を、trueの場合には選択状態の背景を設定します。

Androidのタブ間スペースを調整する方法

このエントリーをはてなブックマークに追加


Androidでタブを使う際に、タブ間のスペースを調整する方法についてのメモ。

Androidでデフォルトのタブウィジェットを使うとタブ間適度なスペースを設けてくれますが、カスタムタブを利用すると、スペースがなくなり、タブ同士がくっついてしまいます。
TabWidgetに対してDividerをセットすることで調節可能となります。

【構成】

【MainActivity.java】
package com.ayakix;

import android.app.TabActivity;
import android.os.Bundle;
import android.widget.TabHost;

public class MainActivity extends TabActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

TabHost tabHost = getTabHost();
// Dividerをセットする
tabHost.getTabWidget().setDividerDrawable(R.drawable.tabdivider);

// タブの初期化
tabHost.addTab(tabHost.newTabSpec("AA")
.setIndicator("AA")
.setContent(R.id.content));
tabHost.addTab(tabHost.newTabSpec("BB")
.setIndicator("BB")
.setContent(R.id.content));
tabHost.addTab(tabHost.newTabSpec("CC")
.setIndicator("CC")
.setContent(R.id.content));
}
}


【main.xml】
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TabHost
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/tabhost"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TabWidget
android:id="@android:id/tabs"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
<FrameLayout
android:id="@android:id/tabcontent"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<LinearLayout
android:id="@+id/content"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
</LinearLayout>
</FrameLayout>>
</TabHost>
</LinearLayout>


【tabdivider.xml】
<?xml version="1.0" encoding="utf-8"?>
<shape
xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle" >
<size
android:width="20px"
/>
<solid
android:color="#00000000"
/>
</shape>

※widthの値を変更することにより、タブ間のスペースを調整できます。また、colorを変更することにより、色を変更できます。

2011年8月9日火曜日

FacebookにAndroidアプリのキーハッシュを登録する際の注意点

このエントリーをはてなブックマークに追加
自前のAndroidからFacebookにアクセスするためには,Facebookページより開発者として登録し,アプリIDを取得する必要があります.
その後,鍵のハッシュ値をFacebookに登録する必要があります.

アプリIDの取得方法については下記ページを参照ください.
Androidで、Facebook SDK を使ってみた。 - OneWorldの開発ブログ

ローカル環境下でデバッグするためには,下記コマンドにより,生成されたキーハッシュをFacebookの開発者ページより登録することで,アクセス可能となります.

keytool -exportcert -alias androiddebugkey -keystore "C:\debug.keystore" | openssl.exe sha1 -binary | openssl.exe base64

「debug.keystore」の位置については,Eclipse⇒Window⇒Preferences⇒Android⇒Buildを参照し,パスを修正してください.


アプリケーションをマーケット等で一般公開するためには,デフォルトで用意されているデバッグ用の鍵ではなく,自分独自の鍵を使ってアプリケーションに署名する必要があります.

独自の鍵の生成方法については下記ページを参照ください.
Androidアプリケーションを公開するために:署名と配置の方法 / DevX - japan.internet.com コラム


「自分独自の鍵を使ってアプリケーションに署名する」と言っても,使用するコマンドは同じです.
ただ,aliasの値(ここでは,XXXXX)として,独自の鍵を生成した際のaliasを指定する必要があります.

keytool -exportcert -alias XXXXX -keystore "C:\debug.keystore" | openssl.exe sha1 -binary | openssl.exe base64

ちなみに,鍵のaliasを忘れた際は,下記コマンドにより,鍵の情報を得ることができます.

keytool -list -v -keystore {keystoreファイル名}

ここで[別名]となっているものがこの鍵のaliasとなります.


なお,鍵ファイルはバイナリファイルとなっていますが,バイナリエディタ等で閲覧できます.
この際alias(別名)は先頭の文字です.

2011年7月13日水曜日

CiNiiで大学別の論文数を調べたみた

このエントリーをはてなブックマークに追加
ふと気になったので,国立情報学研究所 論文情報ナビゲータCiNiiで大学別論文数を調べてみた.

調査方法としては「著者所属」ボックスに「○○大学」と日本語で大学名を記入し,その検索ヒット数を列挙した.
※英語名では調べていません

大学別上位TOP10はこのような結果になった.

東京大学 129902
京都大学 82690
大阪大学 79520
東北大学 68695
九州大学 66401
名古屋大学 58749
北海道大学 53419
東京工業大学 52128
神戸大学 51812
日本大学 46700


ちなみに「刊行物名」ボックスに「情報処理学会論文誌」を入力した場合の上位TOP10は,下記のようになった.

東京大学 749
大阪大学 552
京都大学 513
慶應義塾大学 503
筑波大学 463
電気通信大学 366
東京工業大学 316
九州大学 300
名古屋大学 286
奈良先端科学技術大学院大学 271

こちらにまとめたエクセルデータを置いておきます.
※日本の大学779校,短期大406校について調べました.
※「情報処理学会論文誌」での検索の際には,所属別で上位200位までの大学に対して調べています.

2011年7月7日木曜日

[Android] チェックボックスでパスワードの表示/非表示を切り替える

このエントリーをはてなブックマークに追加

パスワードをテキスト画面に入力する際,「******」のようにパスワードを隠ぺいして表示しますが,スマートフォンでは,入力がタップであるため,よく押し間違いをしてしまいます.
そういう時には,仕方ないのでパスワードをそのまま表示します.ここでは,パスワードの表示
・非表示をチェックボックスの状態で切り替える方法を紹介します.

main.xml










ChangeInputTypeActivity.java
import android.app.Activity;
import android.os.Bundle;
import android.text.InputType;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.CheckBox;
import android.widget.EditText;

public class ChangeInputTypeActivity extends Activity {
private EditText et;
private CheckBox cb;
private int defaultIType;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

et = (EditText) findViewById(R.id.editText);
defaultIType = et.getInputType();
et.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD | defaultIType);

cb = (CheckBox) findViewById(R.id.checkBox);
cb.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if(cb. isChecked())
et.setInputType(InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD | defaultIType);
else
et.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD | defaultIType);
// チェックボックスをクリックするとカーソルが先頭にきてしまうので,末尾に戻す
et.setSelection(et.getText().length());
}
});
}
}


パスワードの表示・非表示は,setInputTypeメソッドを用いて変更します.ここでは,初期値のInputTypeをdefaultITypeとして保持をしておき,チェックボックスがON/OFFされた場合に,27行目から30行目で変更処理を行います.

PIRKA for Androidを開発した

このエントリーをはてなブックマークに追加



▼概要
PIRKAはスマートフォンアプリでゴミ拾いの写真を投稿してもらい、拡散し、新たなゴミ拾いを促すというシンプルなサービスです。
あなたがゴミを拾うと、PIRKAの世界地図( http://www.e-pirka.com )がピカリと光ります。

これまでにPIRKAはWebとiPhoneアプリで運営してきましたが、Androidアプリが欲しいというこうとで、開発しました。

▼使い方
1.Android Marketから無料のアプリをダウンロードしてください
2.PIRKAを起動し、email、username,passwordを登録してください。
3.PickUp画面よりゴミ拾いの写真を撮影し、投稿してください。
4.ゴミはお近くのゴミ箱に捨ててください。
5.綺麗になった場所はMapにてご確認いただけます。
6.TimeLineにて他の方が拾ったゴミにniceする事ができます。

▼現状と今後
PIRKAは、Open Network LabのSeed Acceleratorにも採択されています。
[関連]:ayakix-lablog: ONL Seed Accelerator キックオフイベントに行ってきた

現在、PIRKAは、世界中から350個以上のゴミをなくすことが出来ました。
今後は、この勢いを更に加速させるために、皆様是非Android版をお使いください!
そしてバグ報告を @ayakix までよろしくお願いします!w

2011年7月5日火曜日

Androidで位置情報を取得する=>失敗時には設定画面を開く

このエントリーをはてなブックマークに追加

現在のAndroid携帯端末の多くは,位置を特定するために,GPS(衛星利用測位システム),または基地局の情報を用いて,位置を測量します.

Androidでは,位置情報の取得手段を「ロケーション・プロバイダ」と呼びます.
携帯端末の状態や,ユーザーによる設定によって,利用できるロケーション・プロバイダは変わります.

そこで,位置情報を取得する際,先に精度の高いGPSを利用して,GPSが利用できない場合には,基地局情報を用いることとなります.

また,GPSや基地局情報を利用可能状態にない時は,設定画面を開き,ユーザに利用可能にしてもらうことも必要かと思います.

下記には,その二つの処理をするプログラムを記載します.

/* 位置情報の取得 */
// ロケーションマネージャの取得
LocationManager lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
// 最適な位置情報プロバイダの選択
// Criteriaを変更することで,各種設定変更可能
String bs = lm.getBestProvider(new Criteria(), true);

Location locate = lm.getLastKnownLocation(bs);
if(locate == null){
// 現在地が取得できなかった場合,GPSで取得してみる
locate = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
}
if(locate == null){
// 現在地が取得できなかった場合,無線測位で取得してみる
locate = lm.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
}
locate = null;
if(locate != null){ // 現在地情報取得成功
// 緯度の取得
int latitude = (int) (locate.getLatitude() * 1e6);
// 経度の取得
int longitude = (int) (locate.getLongitude() * 1e6);
Log.d("MYTAG", String.valueOf(latitude));
Log.d("MYTAG", String.valueOf(longitude));
} else {
/* 現在地情報取得失敗処理 */
}

/* 位置情報を取得できなかった場合,設定画面を開く */
if(locate != null){
/* 現在地情報取得成功処理 */
} else {
// 端末の位置情報設定画面へ遷移
try {
startActivity(new Intent("android.settings.LOCATION_SOURCE_SETTINGS"));
} catch (final ActivityNotFoundException e) {
// 位置情報設定画面がない端末の場合
}
}

2011年7月4日月曜日

Google Android Developer Lab Tokyo 2011に行ってきた

このエントリーをはてなブックマークに追加

7/3に六本木ヒルズ内のGoogle 東京オフィスで開催されたAndroid デベロッパーラボ 東京 2011に参加しました.
詳細
資料

このイベントでは,Androidアプリ開発者を対象として,今年2月にリリースしたAndroid Honeycomb を中心に,セッション,コードラボが開催されました.

セッションには,「Honeycombの紹介」「プログラミングTips」「スマートフォンとタブレット用UIデザイン」「Android Marketの新機能」等がありました.個人的に一番興味深かったのはタブレット用UIであるholographic theme "Holo" です.タブレットのUIは,スマートフォン用のUIを拡大すればよい訳でなく,やはりUIを再設計し直す必要があると思います.
セッションのいくつかは英語で行われたのですが,通訳者のレベルが素晴らしく僕みたいに英語が苦手でも全く問題ありませんでしたw

また,コードラボでは,参加者全員にOptimus Pad L-06Cが無償で配られ,資料のHoneypad Codelab Stepsに従って,実機を使ったハンズオンで開発しました.
チューターの方もついていただき,安心して取り組むことが出来ました.

今回のイベントに参加した開発者向けに3ヶ月後にフォローアップイベントがあり,そこでHoneyCombアプリを公開し,選定されたアプリは,特典として,Android Marketでフィーチャーされ,開発者にはGoogle I/O 2012のチケットがプレゼントされるみたいです.
ライバルのレベルが高すぎる訳ですが,何か開発してみようと思います!!

ONL Seed Accelerator キックオフイベントに行ってきた

このエントリーをはてなブックマークに追加

Open Network Lab Seed Accelerator 第3期生のキックオフイベントに参加してきたのでご報告.

▼Open Network Labとは
株式会社デジタルガレージ,株式会社ネットプライスドットコム,株式会社カカクコムが運営しており,

世界進出を視野に入れグローバルに活躍することを目標にインターネットを利用したビジネスでの企業を志すエンジニアや企業家を「Seed Accelerator」「Communitiy」活動を支援するプロジェクトです
via Open Network Lab(オープンネットワークラボ)

Seed Acceleratorとは
起業志向のエンジニアの短期育成を目的としたインキュベーションプログラムです。
高い技術力と有望なビジネスプランを有する個人やチーム(1チーム最大3名迄)を公募します。
選抜した個人やチームに対して、サーバー環境やオフィススペースといった施設を提供すると共に、経験豊富なエンジニアや起業家、経営者によるアドバイス(メンタリング)を行います。
3カ月間の育成期間を経てプログラムを修了したチームには、国内外のベンチャーキャピタリストや起業家に、資金調達のためのアピールを行う機会を与えます。
via Open Network Lab / Seed Accelerator

そこで何をするか?
現在,私は小嶌不二夫氏(@kojimafujio)を代表とするPIRKA(ピリカ)に開発者として参加しています.
PIRKAとは,ゴミ拾いを共有・発信し世界をきれいにするソーシャルネットワーキングサービスです.
今回,このPIRKAがSeed Acceleratorに採択されました.そこで,7月から9月までのプログラム期間中にONLを拠点として、事業アイデアのブラッシュアップやプロトタイプの開発に取り組みます.
また,それに伴いすごいメンターの方々(Open Network Lab / Mentors)と話合いを設けることができます.
PIRKA for Web
PIRKA for iPhone
PIRKA for Android


感想
と言うことで,第3期生のキックオフイベントに参加してきました.
他のチームも素晴らしいアイデアを持っており,また,とても個性的なメンバーで構成されていたため,すごい刺激を受けることができました.
がんばるぞーーー!!!!

2011年6月11日土曜日

Android開発時のプロジェクトエラー

このエントリーをはてなブックマークに追加
Androidの開発時に,JavaのソースやXMLファイルにエラーが出ていないにも関わらず,
プロジェクト自体にエラーが出てしまう謎な現象に陥りました.



こういう場合はプロジェクトをリフレッシュ/クリーンしたり,Eclipseを再起動することで直ることがありますが,それもダメ.

結論から言うと,drawableの中に「default.png」という画像を格納していたのが原因でした.

理由はたぶんJavaの予約語だからと思います.
その他の予約語でも同様のエラーがでました.
同様に,XMLファイル等も予約語のファイル名で作成しようとするとエラーがでます.

また,画像のファイル名に大文字が含まれていてもエラーがでます.


仕様ですっ!!!(キリッ

2011年5月30日月曜日

Cookpad 開発コンテスト24の表彰式に行ってきた

このエントリーをはてなブックマークに追加
先日,Cookpad株式会社主催の第2回 開発コンテスト24に参加しましたが,光栄なことに第2位を受賞しましたので,白金台にあるCookpad株式会社にて開催された表彰式に参加しました.

また,折角の機会なので,事務局様にお願いして事前にCookpadのオフィスを見学させてもらいました.(見学を快諾していただきありがとうございました)

▼閑静な住宅街を抜けると,そこはおしゃれなオフィス入口

▼オフィス横にある暖かい雰囲気の談話&ミーティングスペース

▼噂の温水器 存在感がすごいですw

▼オフィス横のまったりくつろぎスペース

▼くつろぎスペースにはウクレレやら各種ボードゲームやら

▼くつろぎスペースからの外の風景 絶景!

▼各種お茶・お菓子も準備万端

▼表彰式風景


Ustreamで配信していました.ずっと公開されているかわかりませんが,下記から表彰式の映像を見ることができます.
USTREAM: 24 contest

▼壁一面にはホワイトボード(ワーキングスペースは撮影禁止でしたが同様に一面ホワイトボードです)

▼懇親会の料理 オシャレすぎておいしすぎて困りました

▼お土産のCookpadエコバッグ!かわいい

▼ワーキングスペース
社員の人たちのデスク周りは撮影禁止だったのですが,設備的にも非常に良い印象を受けました.特にイスがリープチェアだったのが素晴らしいです!!働く人のことを大切に扱い少しでもよい環境を,という心遣いを感じることが出来ました.

■感想
Cookpadの環境・仕事・人はどれをとっても素晴らしく,一気にファンになりました.
このような機会を設けてくださったことに感謝いたします.

そんなCookpadに対して僕からのお願いは二つ.

・料理に興味がある女性には,Cookpadはかなり愛用されていると思いますが,料理に興味がない男性を巻き込むようなサービス展開をしてくれればと思います.(もちろんこんなことはとっくに社内で議論されているとは思いますが)

・開発コンテスト Season Ⅲ 期待しております!

[スライド]


[関連記事]
ayakix-lablog: 第2回 開発コンテスト24に参加しました

2011年5月9日月曜日

AndroidでBluetoothのアドレスを取得する

このエントリーをはてなブックマークに追加
Bluetoothを使う際にアドレスを取得しようと思ったのですが,ハマってしまったのでエントリにします.

環境は下記の通りです.
HW:HTC Desire HD
OS: Android 2.2

Androidでは,ローカルのBluetoothデバイスを利用するためにBluetoothAdapter APIが用意されています.

プログラムで実行したいことは,BluetoothAdapterオブジェクトを用いて,Bluetoothを利用可能状態にした後,そのアドレスを取得する,といった動作です.

下記プログラムでは,onCreateメソッド内にて,BluetoothAdapterオブジェクトを生成し,そのisEnabledメソッドにより,BluetoothがON or OFFを判断します.そして,OFFの場合は,Intentを発行後,BluetoothをONにします.
その後,getAddressメソッドを呼び出しアドレスを取得します.

しかし,このgetAddressメソッドの戻り値は"UNKNOWN"となり,ここでエラーが発生します.

この問題を解決し,正しいアドレスを取得するには,onActivityResultメソッドをオーバーライドし,この中で,getAddressメソッドを呼ぶ必要があります.

初めはonCreateメソッド内で全処理を行っていたのですが,BluetoothをONにするのを待つことなく,getAddressメソッドが呼び出されたことが原因かと思います.

そこで,RESULTを返すようにし,BluetoothをONにした後に呼び出されるonActivityResultメソッド内で処理を行います.

※このプログラムではBluetoothをOFFにできないので,試した後は手動でOFFにしてください.
package jp.ayakix;

import android.app.Activity;
import android.bluetooth.*;
import android.os.Bundle;
import android.util.Log;
import android.content.Intent;

public class BluetoothTest extends Activity {
private static final int REQUEST_ENABLE_BT = 3;
private BluetoothAdapter bAdapter;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

bAdapter = BluetoothAdapter.getDefaultAdapter();

// デバイスがBluetoothを備えているか?
if (bAdapter == null) {
Log.d("MYTAG", "Device does not support Bluetooth");
} else {
// Bluetoothが利用可能状態か?
if (!bAdapter.isEnabled()) {
// 利用可能状態でない場合=>利用可能にする
Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
}

// アドレスを取得できない
Log.d("MYTAG", bAdapter.getName());
Log.d("MYTAG", bAdapter.getAddress());
}
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_ENABLE_BT) {
if (resultCode == RESULT_OK) {
Log.d("MYTAG", "Device can use Bluetooth");
// アドレスを取得できる
Log.d("MYTAG", bAdapter.getName());
Log.d("MYTAG", bAdapter.getAddress());
} else if (resultCode == RESULT_CANCELED) {
Log.d("MYTAG", "Device cannot use Bluetooth");
}
}
}
}

2011年4月24日日曜日

第2回 開発コンテスト24に参加しました

このエントリーをはてなブックマークに追加
クックパッド株式会社が主催した第2回開発コンテスト24に参加しました.

これは,ある課題に対して24時間以内に成果物をオンライン上で提出するといった内容のコンテストです.

今回のお題は
(普段の生活で)半径3m以内にいる人が困っていることを解決する

21時に課題が発表され翌日の21時までに提出する必要があります.
私は下記のタイムスケジュールで取り組みました.
21:00 - 23:30 アイデア出し
23:30 - 00:00 休憩
00:00 - 00:30 UI設計
00:30 - 06:00 開発
06:00 - 11:00 睡眠
11:00 - 12:00 食事
12:00 - 18:00 開発
18:00 - 21:00 動画作成提出

ちなみに実際の行動とスケジュールはほぼ一致していました.

■アイデア出し
・利用物:Powerpoint
アイデア出しはパワポを使いました.下記にパワポの内容を示します.

▼まず初めに自分の半径3m以内にいる人を列挙
▼半径3m以内にいる人が困っていそうなことを列挙




▼これまでに考えたことを一度整理し,開発目標と自分の中で重要度が高いと感じたことを列挙
▼開発目標を参考に,開発対象を絞り,問題解決のためのアプリケーションを考察


▼もう一度ブレストし,思いついたものを列挙
(最終的に一番下に書いてあるピクトグラムコミュニケーションを採用しました)
▼開発アプリケーションが決まったとこでUIと機能の設計






■1次開発
・ 利用物:Eclipse, Android SDK
アプリケーションはAndroid上で実装することに決めました.
開発アプリケーションと設計が決まったことで早速開発に取り組む・・・つもりだったのですが,
私がAndroidアプリケーションを開発したのは1年以上前であり,今一度復習をしました.
(この後何度も逆引きやチュートリアルとにらめっこしました・・・)
少しプログラムを組んではエミュレータ上で実行というのを幾度となく繰り返しました.
プログラムのバグを追うのがなかなか大変でした.

朝6時までの開発進捗状況は約30%ほどだったかと思います.

■2次開発
・ 利用物:Eclipse, Android SDK, HTC Desire HD
正午から再び開発.
ここではカメラの使用につまづきました.以前Ver. 1.6でカメラを使用した経験はあるのですが,今回利用した端末はHTC Desire HD (Ver 2.2)でした.カメラAPIの使用がVer. 2.1から変更したらしく,ここでかなりの時間を消耗しました.

機能面でいたらない点は多数あったのですが,18時になったため開発はひとまず終了.

■動画作成
・ 利用物:Microsoft Movie Maker, デジカメ
動画作成の手順は,
[アプリケーションを動かし,デジカメで録画]-[Microsoft Movie Makerで編集]-[Youtubeへアップロード]
動画の作成は,結構時間を費やしました.光の関係で,携帯の画面がうまく映らなかったり, 携帯の画面に自分が写りこんでしまったりw 何回か撮り直しをしました.

Microsoft Movie Makerは以前に使用したことがあるため,使用方法については問題がありませんでした.動作手順を説明するためにキャプションを挿入しました.また,音楽を流し,その音楽の再生時間に合うように動画を編集しました.最後に謝辞をつけてムービーを発行し,Youtubeへアップロード.

▼作成した動画



■感想
・疲れました・・・1日時間をとれたのが幸いでしたが,それでも疲れました.
・スケジュール・・・個人的にスケジュール通り工程が進んだのが非常にうれしかったです.
・アイデア・・・やはり一人でブレストはいまいちですね.今度機会があれば複数人でチャレンジしたいです.
・技術面・・・もう少し事前にAndroidの開発に慣れておけばと反省.

開発者のみなさま,運営者のみなさま,お疲れ様でした!!!

2011年4月21日木曜日

Windowsで各種プログラムを一発起動させる方法

このエントリーをはてなブックマークに追加
「Win+r」でファイル名を指定して実行が起動します。

ここでは、プログラム名を指定することで、プログラムを一発で起動することができます(ただし、パスが通っている必要があり)。

例えば、「cmd.exe」 (.exeは省略可能)と入力し、OKを押すことでコマンドプロンプトが立ち上がります。

ここでは、Windowsで用意されているプログラムやサービスを一発で起動する方法についていくつか記載します。

[コントロールパネル] control.exe
[ペイント] mspaint.exe
[メモ帳] notepad.exe
[コンピュータをロック] rundll32.exe user32.dll,LockWorkStation
[画面の解像度] rundll32.exe Shell32.dll,Control_RunDLL Desk.cpl
[ゴミ箱を開く] shell:RecycleBinFolder
[インターネットのプロパティ] inetcpl.cpl
[ネットワーク接続] ncpa.cpl
[システムのプロパティ] sysdm.cpl
[日付と時刻] timedate.cpl
[ネットワーク接続] ncpa.cpl
[プログラムの追加と削除] appwiz.cpl
[ipconfig] cmd.exe /k ipconfig /all
[マウスのプロパティ] main.cpl @0
[キーボードのプロパティ] main.cpl @1
[電源オプションのプロパティ] powercfg.cpl

これらのショートカットをランチャー等に登録しておくことにより、必要な画面を一発で呼び出すことができます。
これ以外にもまだまだありますので、気になる人は調べてみるとよりパソコン作業が快適になるかもしれません。

2011年4月14日木曜日

Kindleの購入から活用まで

このエントリーをはてなブックマークに追加
私はKindleをほぼ毎日使用して読書および英語学習をしています。

と言うか、基本的にそれ以外には使用用途がありませんw(一応音楽が聞けるのですが)

というわけで、私がKindleを利用する上で役立った情報を簡単にまとめたいと思います。


1. 購入

まずは、ともあれKindleを購入しないと話になりません。
KindleはAmazon.comで購入する必要があります。 現在の価格はWi-Fi版$139(約11,500円(4/13日現在)), 3G+Wi-Fi版$189(約15,700円)となっています。また、5月3日からWi-Fi版Kindleに広告を付けたものが$114(約9,500円)で販売される模様です(ただし、日本からすぐに購入可能かはわからない)

 具体的な購入方法については下記ページが参考になるかと思います。
 Kindle キンドル 購入 方法 | instantanés

2. 青空文庫リーダーとして
青空文庫は,著作権の消滅した作品と「自由に読んでもらってかまわない」作品を公開しています。ここには、太宰 治や夏目 漱石などの文豪の作品が多く公開されています。個人的にはKindleを青空文庫専用リーダーとして使用しても十分に購入費のもとは取れると考えています。

しかし、青空文庫で公開されている作品はKindle上で読書するために最適化されていません。そこで、青空キンドルを利用することで、作品をKindle上で最適化した状態で読むことができます(pdfファイルとして出力してくれます) 。また、青空文庫で公開されている作品以外でも、青空文庫形式で作成されているテキストを持っている場合、青空キンドル マニュアルよりKindle用にファイルを変換することも可能です。

3. コンテンツの購入
なんと言っても電子ブックリーダーの最大の特徴は「思い立った時に本を購入できること」と「雑誌や新聞の定期購読(ダウンロード)が可能であること」です。
私は朝日新聞の英語版を購読しています。購読費用は月当たり$9.99となっています。内容はNews/Features,Business,Views,Cool Japan,Sportsとなっています。14日間の無料購読もできるので是非利用してください。(ただし、何もしないとそのまま購読することになるので、購読を中止したい場合は、Amazon.comより購読を中止する必要があります)

ちなみにKindleでは文章を読み上げてくれるText-to-Speech機能がついているので、新聞を読み上げてもらうことも可能です。個人的な感想ではまずまずの精度なのではないかと思っています。当然ながら日本人の名前や辞書に登録されていない単語は変な読み方になりますが。(例:Abeを「アベ」ではなく「エイブ」と発音する)

4. 英辞郎のインストール
英語の文書を読む際、英語が不得意な方は、辞書が必要かと思います(私もそう)。Kindleにはデフォルトで英英辞書がついているのですが、やはり英和辞書が欲しいですね。

下記サイトでは、英和・和英辞書として有名な英辞郎のKindle対応版を販売しています。購入しファイルをダウンロードしたら、そのファイルをKindle内の所定の箇所に移動し、使用辞書の設定を変更するだけで使用できるようになります。

英辞郎●MOBI/Kindle 対応版

5. スクリーンセーバーの変更
私がKindleの気に入っている点の一つに、スクリーンセーバーがあります(そもそもスクリーンセーバーはディスプレイの焼き付きを防ぐためのもので、e-inkを使用しているKindleではスクリーンセーバーをする必要はないのですが)。
スクリーンセーバーはKindleの電源を切っても表示されます(当然ながらバッテリーは減りません!)。デフォルトでは、何名かの有名な文豪が表示されます。これも非常に美しいのですが、中には自分で撮った写真等にカスタマイズしたい人もいると思います。
カスタマイズ方法および画像のダウンロード方法は、下記ページにまとまっています。

Life with Kindle - スクリーンセーバー画像を変えよう | PIXTURE STUDIO

※ただし、Kindleの中身をいじることになるため、設定を間違えた場合はKindleが正常に起動しなくなる、ソフトウェアアップデートが受けられなくなる等の可能性がありますので、自己責任ということでお願いします。

6. 風呂にて
私はお風呂につかりながらKindleを読むのが好きです。
Kindleには防水性がないので、何らかの工夫が必要です。Kindleの専用防水ケースもあるみたいですが、私はジップロックで代用しています。湯船に落としたりしない限り大丈夫かな...ただ、水蒸気で曇るためタオルでその度に拭いているのが少し不便ですw


Kindleで楽しい読書体験を・・・

2011年3月11日金曜日

東北地方太平洋沖地震後のインターネット転送量

このエントリーをはてなブックマークに追加
Webの高速化・サーバの負荷軽減を目指すAkamaiは,世界におけるHTTP Hits per Secondを可視化したVisualizing AkamaiリアルタイWebモニターサービスを展開しています.
AkamaiはWebのトラフィックの20%に関係しているとも言われているので,ある程度の信頼度があると言えます.

2011年3月11日午後2時46分頃に発生した東北地方太平洋沖地震ですが,その後世界のHTTPトラフィックがどのようになったのかを調査するためにAkamaiのスクリーンキャプチャを撮りました.


▲17時21分(日本時間)の世界のトラフィックを可視化したものです.


 ▲21時57分(日本時間)の世界のトラフィックを可視化したものです.

また, Visualizing Akamaiを動画にしたものを下記に掲載します.
キャプチャした時間帯は17:34 - 23:13 (+9:00 JPN) です.


※データは全てAkamaiの画面をキャプチャしたものです
※ところどころ飛んでいる箇所があります
※今回の地震とトラフィックに関係があるか否かはまだ現段階ではわかりません

少しでも多くの方々が無事であることを心よりお祈りします.