public static void main
ぱそこんのなにかしらのめも
2011-11-13(Sun) 01:28
VirtualBoxのNATのみでホストOSからゲストOSへ接続する方法
課題
VirtualBoxのネットワークアダプタをNATのみにして、ゲストOS→インターネット
ホストOS→(ssh)→ゲストOS
ができるようにする。
(VirtualBox+CentOS6のネットワーク設定メモで書いた「ホストオンリーアダプタ」を使わない方法)
環境
- ホストOS:Windows XP
- ゲストOS:CentOS-6.0-i386-minimal
- VirtualBox 4.1.6 for Windows hosts
VirtualBoxの設定
「VirtualBox+CentOS6のネットワーク設定メモ」に書いた状態からの変更。- ホストオンリーアダプタを無効(削除)にする
- ネットワークアダプタ1:NAT にする。
- ネットワークアダプタ1の「ポートフォワーディング」を開く。
- 以下の通り設定する。
- 名前:ssh(任意)
- プロトコル:TCP
- ホストIP:(空欄)
- ホストポート:2222(ホストOSで使っていないポート)
- ゲストIP:10.0.3.15(ゲストOSのeth0に設定するIP 空欄でもOK)
- ゲストポート:22
- ↓こんな感じ
- ゲストOSを起動
TeraTerm, puttyから127.0.0.1:2222にアクセスしてログインできればOK
JUGEMテーマ:PC関連
2011-11-13(Sun) 00:26
CentOSにupdatedbとlocateコマンドをインストールする方法
課題
CentOS-6.0-i386-minimalをインストールするとupdatedbとlocateが使用できないのでインストールする。コマンド
# yum install mlocate
JUGEMテーマ:Linux
2011-11-12(Sat) 14:07
VirtualBox+CentOS6のネットワーク設定メモ
課題
VirtualBox-4.1.6にCentOS-6.0-i386-minimalをインストールして、CentOS→インターネット
Windows→(ssh)→CentOS
ができるようにする。
やること
VirtualBoxのネットワークアダプタにホストオンリーアダプタとNATを設定する。(NATのみで接続する方法→VirtualBoxのNATのみでホストOSからゲストOSへ接続する方法)
環境
- ホストOS:Windows XP
- ゲストOS:CentOS-6.0-i386-minimal.iso
- VirtualBox 4.1.6 for Windows hosts
VirtualBoxの設定
- 仮想マシン名:CentOS-6.0-i386-minimal
- メインメモリ:512MB
- オーディオ:無効
- ネットワークアダプタ1:ホストオンリーアダプタ
- ネットワークアダプタ2:NAT
- その他はデフォルト
CentOS6の設定
# more /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 ONBOOT=yes BOOTPROTO=static HWADDR=08:00:27:FF:D7:92 IPADDR=192.168.56.105 NETMASK=255.255.255.0 GATEWAY=192.168.56.1 # more /etc/sysconfig/network-scripts/ifcfg-eth1 DEVICE=eth1 ONBOOT=yes BOOTPROTO=static HWADDR=08:00:27:81:28:2D IPADDR=10.0.3.15 NETMASK=255.255.255.0 GATEWAY=10.0.3.2 # more /etc/sysconfig/network NETWORKING=yes HOSTNAME=localhost.localdomain # more /etc/resolv.conf ; generated by /sbin/dhclient-script nameserver 8.8.8.8 nameserver 4.4.4.4 # /etc/rc.d/init.d/network restartsshでログインとcurl等でサイトが見られればOK
JUGEMテーマ:PC関連
2011-05-15(Sun) 00:37
Gmailアカウントを取得する時にかかってくる電話番号
Gmail(Googleアカウント)で新しいメールアドレスを取得する際に、アカウント確認用の電話番号を入力すると「
5854561283」から電話が掛かってきて、確認コードを読み上げてくれる。
「58」はベネズエラの国コード。
電話番号ごとに作成できるアカウント数を制限してるっぽい。
作成したアカウントの数が上限に達したという通知が表示される(Google アカウント ヘルプ)
「58」はベネズエラの国コード。
電話番号ごとに作成できるアカウント数を制限してるっぽい。
作成したアカウントの数が上限に達したという通知が表示される(Google アカウント ヘルプ)
JUGEMテーマ:Google
2011-05-05(Thu) 00:18
Googleマイマップを携帯から見るツールを更新した(その3)
GoogleMapsのマイマップを携帯から見るツール
「GoogleMyMaps for mobile」を、Googleマップの仕様変更に対応させた。
Googleマイマップを携帯から見るツールを更新した
Googleマイマップを携帯から見るツールを更新した(その2)
「GoogleMyMaps for mobile」を、Googleマップの仕様変更に対応させた。
対応内容
Googleマイマップの出力がGeoRSS形式からKML形式になっていたので、KMLをパースできるようにした。参照
Googleマイマップを携帯から見るツールを作ったGoogleマイマップを携帯から見るツールを更新した
Googleマイマップを携帯から見るツールを更新した(その2)
JUGEMテーマ:Google
2011-03-14(Mon) 10:13
炊き出しマップ携帯版(東北地方太平洋沖地震関連)
「炊き出しまっぷ、緊急避難場所(東日本)Meal Supply & Evacuation places」を
携帯(ガラケー)から見る用にまとめました。
* 青森県版
http://goo.gl/Mzo1c
* 岩手県版
http://goo.gl/sYYqz
* 宮城県版
http://goo.gl/8dHYX
* 山形県版
http://goo.gl/l68Ty
* 福島県版
http://goo.gl/8VnjX
* 茨城県版
http://goo.gl/KnW0j
* 栃木県版
http://goo.gl/osvHl
* 東日本版
http://goo.gl/zio8d
(データサイズ大きいです。岩手県はこちらからのようです。)
共同編集被害リアルマップ東北地方太平洋沖地震
http://goo.gl/XUI8p
これらは↓のサイトのデータを読み込んでいます。
炊き出しまっぷ、緊急避難場所(東日本) Meal Supply & Evacuation places (East Japan)
地震被害状況まとめGoogleマップ@wiki
GoogleMyMaps for mobile | ケータイで見るGoogleマイマップ
* 青森県版
http://goo.gl/Mzo1c
* 岩手県版
http://goo.gl/sYYqz
* 宮城県版
http://goo.gl/8dHYX
* 山形県版
http://goo.gl/l68Ty
* 福島県版
http://goo.gl/8VnjX
* 茨城県版
http://goo.gl/KnW0j
* 栃木県版
http://goo.gl/osvHl
* 東日本版
http://goo.gl/zio8d
(データサイズ大きいです。
共同編集被害リアルマップ東北地方太平洋沖地震
http://goo.gl/XUI8p
これらは↓のサイトのデータを読み込んでいます。
炊き出しまっぷ、緊急避難場所(東日本) Meal Supply & Evacuation places (East Japan)
地震被害状況まとめGoogleマップ@wiki
GoogleMyMaps for mobile | ケータイで見るGoogleマイマップ
JUGEMテーマ:2011 地震(東北地方太平洋沖地震)
2011-03-13(Sun) 21:10
東北地方太平洋沖地震の給水所一覧
東北地方太平洋沖地震の影響で断水している地域を@kyusuishoさんがまとめられています。
給水所Googleマイマップまとめ
Googleマイマップを携帯電話(主にガラケー)から閲覧するためのサイトを作ってありますので、もし使われる方がいましたらご自由に使ってください。
GoogleMyMaps for mobile (使い方)
給水所Googleマイマップまとめ
Googleマイマップを携帯電話(主にガラケー)から閲覧するためのサイトを作ってありますので、もし使われる方がいましたらご自由に使ってください。
GoogleMyMaps for mobile (使い方)
JUGEMテーマ:2011 地震(東北地方太平洋沖地震)
2010-12-11(Sat) 00:00
Androidのエミュレータがネットワークに接続できない場合の対処方法
問題
Androidのエミュレータがインターネットにつながらない。エミュレータのブラウザからIPを直打ちするとサイトは見られる。
環境
MacOSX 10.6.5 / ADT8.0.1 / Helios原因
エミュレータのDNS設定がうまくいってないっぽい。解決方法
$ adb shell # getprop net.dns1 (空行が表示される) # getprop net.dns2 (空行が表示される) # setprop net.dns1 8.8.8.8 # setprop net.dns2 8.8.4.4
やってること
- getprop net.dns1
- エミュレータが使うDNSサーバ(その1)を表示する。
- getprop net.dns2
- エミュレータが使うDNSサーバ(その2)を表示する。
- setprop net.dns1 8.8.8.8
- エミュレータが使うDNSサーバ(その1)を「8.8.8.8」に設定する。
- setprop net.dns2 8.8.4.4
- エミュレータが使うDNSサーバ(その2)を「8.8.4.4」に設定する。
そもそもなんでネットワークにつながらなくなるのかってのは不明。
JUGEMテーマ:Android
2010-12-10(Fri) 14:20
Androidでデータベースの内容をAlertDialogにリスト表示する方法
やりたいこと
Androidでデータベースの内容をAlertDialogにリスト表示する。↓こんな感じ。

メニューをタップするとsummaryテーブル(後述)の中身がAlertDialogにリスト表示される。このリストの1行をタップすると、(summaryテーブルの_idをキーにして)detailテーブルの内容が表示される。
テーブル
summaryテーブル _id title +------+------------+ 1 一覧その1 4 一覧その2 5 一覧その3 +------+------------+ (summary._idはわざと歯抜けにしてある) detailテーブル _id summary_id content +-------+-------------+-----------+ 1 1 詳細-1 2 1 詳細-2 3 1 詳細-3 . . 100 4 詳細-100 101 4 詳細-102 102 4 詳細-103 . . 200 5 詳細-201 201 5 詳細-202 202 5 詳細-203 +-------+-------------+-----------+summary._id と detail.summary_id が対応する。
SELECT * FROM detail LEFT OUTER JOIN summary ON summary._id = detail.summary_id;
大事なこと
- AlertDialog.BuilderのsetCursor()だと、今回のように歯抜け_idがある場合には不向き。(=summary._idとリスト上のpositionがイコールにならないので、detailテーブルを引っ張ってくるときにメンドクサイ)
- SimpleCursorAdapterを使う。
- SimpleCursorAdapterを使う時はテーブルに_idが必須。
- SimpleCursorAdapterはSELECTを実行したCursorから、カラム名とandroid:idを対応させて1行分のレイアウトに放り込んでくれる。
先にSimpleCursorAdapterのコンストラクタの説明
//Android Developersのリファレンスから抜粋
SimpleCursorAdapter(
Context context,
int layout,
Cursor c,
String[] from,
int[] to
);
//実際
new SimpleCursorAdapter(
getApplicationContext(),
R.layout.one_row,
cursor,
new String[] {"col_hoge", "col_fuga"},
new int[] {R.id.hoge, R.id.fuga}
);
- Context context
-
getApplicationContext()
コンテキストを渡す。thisでもいいけどgetApplicationContext()でいい。 - int layout
-
R.layout.one_row
データベースからSELECTしてきたデータの1行分を格納・表示するためのレイアウトファイル。 - Cursor c
-
cursor
リスト表示したいデータの入ってるテーブルからSELECTしてきた結果のCursor。
sqliteDatabase.rawQuery(sql,null);とか。 - String[] from
- new String[] {"col_hoge", "col_fuga"}
レイアウトファイルに表示させるデータ(テーブル)のカラム名。 - int[] to
- new int[] {R.id.hoge, R.id.fuga}
レイアウトファイル内でのandroid:id。
この例だと、
col_hoge列の値はレイアウトファイル内のid=hogeに表示される。
col_fuga列の値はレイアウトファイル内のid=fugaに表示される。
値を表示できるのはTextViewだけ。
<TextView android:id="@+id/hoge" .../> <TextView android:id="@+id/fuga" .../>
ソースコード
Database2ListView.java
package com.example.android.demo.database2listview;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.database.Cursor;
import android.os.Bundle;
import android.os.Handler;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
public class Database2ListView extends Activity {
// private static final String TAG = "com.example.android.demo.db2listview.DemoDb2ListView";
private static final String DB_NAME = "DemoDb2ListView.sqlite3";
private static final int DB_VERSION = 1;
private DbHelper mDbHelper;
private AlertDialog mAlertDialog;
private ProgressDialog mProgressDialog;
private Handler mHandler;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mHandler = new Handler();
mDbHelper = new DbHelper(getApplicationContext(), DB_NAME, null, DB_VERSION);
mDbHelper.openReadOnly();
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.menu:
//XMLから生成する場合はLayoutInflaterでもOK
//ListView listView = (ListView) getLayoutInflater().inflate(R.layout.list, null);
ListView listView = new ListView(getApplicationContext());
//ListView listView = new ListView(this);
/*
* AlertDialog.Builder#setCursor()でデータを引っ張ってくることもできるが、
* DialogInterface.OnClickListener#onClick()では、クリックされたposition
* しか取得できないため、summaryテーブルの_idに歯抜けがあった場合にズレてしまう。
* (=positionと_idが対応してくれない。今回はわざと歯抜けにしてある。)
* なので、今回はSimpleCursorAdapterをListViewに登録してみる。
*
* 手順は以下。
* 1.summaryテーブルの全データをcursorに入れる。
* 2.simpleCursorAdapterで1行分のデータ表示設定をする。
* 3.simpleCursorAdapterをlistViewのアダプタとして登録する。
* 4.listView内の1行がタップされた場合の処理を記述する。
* 5.mAlertDialogのViewとして設定する。
* 6.mAlertDialogを表示する。
*
* SimpleCursorAdapter(Context context, int layout, Cursor c, String[] from, int[] to)
* http://developer.android.com/reference/android/widget/SimpleCursorAdapter.html
* cから1行ずつfrom[]のカラムを取得し、layoutのto[]へセットする(to[]の中はandroid:id)
*
* simpleCursorAdapter = new SimpleCursorAdapter()の引数の説明
* getApplicationContext()
* コンテキスト(Database2ListView.thisでもいいけど不要)
* R.layout.row_summary
* summaryテーブルのデータをセットする1行分のレイアウトファイル
* cursor
* summaryテーブルの全データが入ったCursor
* new String[] {"_id", "title"}
* summaryテーブルのカラム名配列
* new int[] {R.id.col_summary_id, R.id.col_summary_title}
* row_summary.xml内のandroid:id配列
*
* summaryテーブルの _id 列は R.id.col_summary_id へ格納される。
* summaryテーブルの title 列は R.id.col_summary_title へ格納される。
*
* SimpleCursorAdapterを使う場合は、テーブル内に必ず_id列がないとダメ。
* AUTOINCREMENTじゃなくてもいいけどPRIMARY KEYで。
*/
//1.summaryテーブルの全データをcursorに入れる。
Cursor cursor = mDbHelper.selectSummary();
startManagingCursor(cursor);
//2.simpleCursorAdapterで1行分のデータ表示設定をする。
SimpleCursorAdapter simpleCursorAdapter;
simpleCursorAdapter = new SimpleCursorAdapter(
getApplicationContext(),
R.layout.row_summary,
cursor,
new String[] {"_id", "title"},
new int[] {R.id.col_summary_id, R.id.col_summary_title}
);
//3.simpleCursorAdapterをlistViewのアダプタとして登録する。
listView.setAdapter(simpleCursorAdapter);
//4.listView内の1行がタップされた場合の処理を記述する。
listView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
/*
* タップされたら、AlertDialogを消し、
* タップされた行(detail.summary_id = summary._id)のデータをActivityに表示する。
*/
mAlertDialog.dismiss();
showDetail(id);
}
});
//5.mAlertDialogのViewとして設定する。
mAlertDialog = new AlertDialog.Builder(Database2ListView.this)
.setTitle("summaryテーブル一覧")
.setView(listView)
.create();
//6.mAlertDialogを表示する。
mAlertDialog.show();
break;
default:
break;
}
return true;
}
/**
* detailテーブルからdetail.summary_id=summaryIdのデータを取得して、地のActivityに表示する。
*/
private void showDetail(final long summaryId) {
//ProgressDialogを表示(お約束)
mProgressDialog = new ProgressDialog(this);
mProgressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
mProgressDialog.setMessage("読み込み中...");
mProgressDialog.setCancelable(false);
mProgressDialog.show();
(new Thread(new Runnable(){
@Override
public void run() {
//ProgressDialogを強制的に表示するための時間稼ぎ用(他には影響なし)
for (int i = 0; i < 1000000; i++) {
double j = Math.pow(Math.PI, 2D);
}
//detail.summary_id=summaryIdのデータを取得
final Cursor cursor = mDbHelper.selectDetail(summaryId);
startManagingCursor(cursor);
/*
* Handlerで地のActivity(UI)を書き換える
* (new Handler()).post()は使えなかった。
* runOnUiThread()でも大丈夫
*/
mHandler.post(new Runnable(){
@Override
public void run() {
SimpleCursorAdapter simpleCursorAdapter;
simpleCursorAdapter = new SimpleCursorAdapter(
getApplicationContext(),
R.layout.row_detail,
cursor,
new String[] {"_id", "summary_id", "content"},
new int[] {R.id.col_detail_id, R.id.col_detail_summary_id, R.id.col_detail_content}
);
ListView listView = new ListView(getApplicationContext());
listView.setAdapter(simpleCursorAdapter);
setContentView(listView);
}
});
mProgressDialog.dismiss();
}
})).start();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu, menu);
return true;
}
@Override
protected void onDestroy() {
mDbHelper.close();
super.onDestroy();
}
}
DbHelper.java
package com.example.android.demo.database2listview;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
public class DbHelper extends SQLiteOpenHelper {
// private static final String TAG = "com.example.android.demo.db2listview.DemoDb2ListView";
private SQLiteDatabase mSQLiteDatabase;
public DbHelper(Context context, String dbName, CursorFactory factory, int version) {
super(context, dbName, factory, version);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.beginTransaction();
try {
//テーブル作成
StringBuilder sql;
sql = new StringBuilder(152);
sql.append("CREATE TABLE summary (");
sql.append(" _id INTEGER PRIMARY KEY,");
sql.append(" title STRING NOT NULL");
sql.append(")");
db.execSQL(sql.toString());
sql = new StringBuilder(152);
sql.append("CREATE TABLE detail (");
sql.append(" _id INTEGER PRIMARY KEY,");
sql.append(" summary_id INTEGER NOT NULL,");
sql.append(" content STRING NOT NULL");
sql.append(")");
db.execSQL(sql.toString());
db.setTransactionSuccessful();
} finally {
db.endTransaction();
}
db.beginTransaction();
try {
//とりあえず初期データ投入(_idはわざと歯抜けにしてある)
db.execSQL("INSERT INTO summary (_id, title) VALUES (1, '一覧その1')");
db.execSQL("INSERT INTO summary (_id, title) VALUES (4, '一覧その4')");
db.execSQL("INSERT INTO summary (_id, title) VALUES (5, '一覧その5')");
for (int i = 1; i <= 100; i++) {
db.execSQL("INSERT INTO detail (_id, summary_id, content) VALUES ("+i+", 1, '詳細-"+i+"')");
}
for (int i = 101; i <= 300; i++) {
db.execSQL("INSERT INTO detail (_id, summary_id, content) VALUES ("+i+", 4, '詳細-"+i+"')");
}
for (int i = 301; i <= 600; i++) {
db.execSQL("INSERT INTO detail (_id, summary_id, content) VALUES ("+i+", 5, '詳細-"+i+"')");
}
db.setTransactionSuccessful();
} finally {
db.endTransaction();
}
// Log.i(TAG, "onCreate()");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
public void openReadOnly() {
mSQLiteDatabase = getReadableDatabase();
}
public Cursor selectSummary() {
String sql = "SELECT _id, title FROM summary";
return mSQLiteDatabase.rawQuery(sql, null);
}
public Cursor selectDetail(long summaryId) {
String sql = "SELECT _id, summary_id, content FROM detail WHERE summary_id = ?";
return mSQLiteDatabase.rawQuery(sql, new String[]{Long.toString(summaryId)});
}
}
全ソース
Eclipseのプロジェクトごと置いておきますね。Database2ListView(GitHub)
git@github.com:magpad/Database2ListView.git
Eclipse3.6.1 / UTF-8 / LF / AndroidSDK2.3 / ADT8.0.1
JUGEMテーマ:Android
2010-12-08(Wed) 16:14
AndroidのContextメモ
メモ
Context(とApplicationとActivityとServiceとWindowとViewとDialog)の脳内まとめ。
- Contextクラス
- アプリ全体のリソースやらクラスやらを取りまとめるところ
- Applicationクラス
- アプリに関する情報
- Serviceクラス
- 長期間に及ぶ処理をするところ
- Activityクラス
- 短期間で終わる処理をするところ
- Windowクラス
- ユーザーが目にする画面
- Viewクラス
- 画面上の部品
- Dialogクラス
- 画面上の一時的な部品
getApplicationContext()もActivityをextendsしたクラス内でのthisもContexだけど中身は全く違う。
JUGEMテーマ:Android
