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
    • ↓こんな感じ
      VirtualBoxのポートフォワーディング設定
  • ゲストOSを起動

TeraTerm, puttyから127.0.0.1:2222にアクセスしてログインできればOK

JUGEMテーマ:PC関連
tips | http://magpad.jugem.jp/?eid=210
このエントリーをはてなブックマークに追加
Check
0
    CentOSにupdatedbとlocateコマンドをインストールする方法
    このエントリーをはてなブックマークに追加

    課題

    CentOS-6.0-i386-minimalをインストールするとupdatedbとlocateが使用できないのでインストールする。

    コマンド

    # yum install mlocate
    

    JUGEMテーマ:Linux
    Linux | http://magpad.jugem.jp/?eid=209
    このエントリーをはてなブックマークに追加
    Check
    0
      VirtualBox+CentOS6のネットワーク設定メモ
      このエントリーをはてなブックマークに追加

      課題

      VirtualBox-4.1.6にCentOS-6.0-i386-minimalをインストールして、
      CentOS→インターネット
      Windows→(ssh)→CentOS
      ができるようにする。

      やること

      VirtualBoxのネットワークアダプタにホストオンリーアダプタとNATを設定する。
      (NATのみで接続する方法→VirtualBoxのNATのみでホストOSからゲストOSへ接続する方法

      環境


      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 restart
      
      sshでログインとcurl等でサイトが見られればOK

      JUGEMテーマ:PC関連
      tips | http://magpad.jugem.jp/?eid=207
      このエントリーをはてなブックマークに追加
      Check
      0
        Gmailアカウントを取得する時にかかってくる電話番号
        このエントリーをはてなブックマークに追加
        Gmail(Googleアカウント)で新しいメールアドレスを取得する際に、アカウント確認用の電話番号を入力すると「 5854561283」から電話が掛かってきて、確認コードを読み上げてくれる。
        「58」はベネズエラの国コード。

        電話番号ごとに作成できるアカウント数を制限してるっぽい。
        作成したアカウントの数が上限に達したという通知が表示される(Google アカウント ヘルプ)

        JUGEMテーマ:Google
        Google | http://magpad.jugem.jp/?eid=204
        このエントリーをはてなブックマークに追加
        Check
        0
          Googleマイマップを携帯から見るツールを更新した(その3)
          このエントリーをはてなブックマークに追加
          GoogleMapsのマイマップを携帯から見るツール
          GoogleMyMaps for mobile」を、Googleマップの仕様変更に対応させた。

          対応内容

          Googleマイマップの出力がGeoRSS形式からKML形式になっていたので、KMLをパースできるようにした。

          参照

          Googleマイマップを携帯から見るツールを作った
          Googleマイマップを携帯から見るツールを更新した
          Googleマイマップを携帯から見るツールを更新した(その2)

          JUGEMテーマ:Google
          Google | http://magpad.jugem.jp/?eid=203
          このエントリーをはてなブックマークに追加
          Check
          0
            炊き出しマップ携帯版(東北地方太平洋沖地震関連)
            このエントリーをはてなブックマークに追加
            炊き出しまっぷ、緊急避難場所(東日本)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マイマップ
            others | http://magpad.jugem.jp/?eid=201
            このエントリーをはてなブックマークに追加
            Check
            0
              東北地方太平洋沖地震の給水所一覧
              このエントリーをはてなブックマークに追加
              東北地方太平洋沖地震の影響で断水している地域を@kyusuishoさんがまとめられています。

              給水所Googleマイマップまとめ

              Googleマイマップを携帯電話(主にガラケー)から閲覧するためのサイトを作ってありますので、もし使われる方がいましたらご自由に使ってください。
              GoogleMyMaps for mobile (使い方)

              others | http://magpad.jugem.jp/?eid=200
              このエントリーをはてなブックマークに追加
              Check
              0
                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
                Android | http://magpad.jugem.jp/?eid=199
                このエントリーをはてなブックマークに追加
                Check
                0
                  Androidでデータベースの内容をAlertDialogにリスト表示する方法
                  このエントリーをはてなブックマークに追加

                  やりたいこと

                  Androidでデータベースの内容をAlertDialogにリスト表示する。
                  ↓こんな感じ。
                  データベースの内容を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
                  Android | http://magpad.jugem.jp/?eid=198
                  このエントリーをはてなブックマークに追加
                  Check
                  0
                    AndroidのContextメモ
                    このエントリーをはてなブックマークに追加

                    メモ

                    Context(とApplicationとActivityとServiceとWindowとViewとDialog)の脳内まとめ。

                    Contextの概念図
                    Contextクラス
                    アプリ全体のリソースやらクラスやらを取りまとめるところ
                    Applicationクラス
                    アプリに関する情報
                    Serviceクラス
                    長期間に及ぶ処理をするところ
                    Activityクラス
                    短期間で終わる処理をするところ
                    Windowクラス
                    ユーザーが目にする画面
                    Viewクラス
                    画面上の部品
                    Dialogクラス
                    画面上の一時的な部品

                    getApplicationContext()もActivityをextendsしたクラス内でのthisもContexだけど中身は全く違う。

                    JUGEMテーマ:Android
                    Android | http://magpad.jugem.jp/?eid=197
                    このエントリーをはてなブックマークに追加
                    Check
                    0