StaticVoid放浪記 -2ページ目

仮想OSによるサーバー構築の可能性

使用する仮想デスクトップ
VMWarePlayer
http://www.vmware.com/jp/products/player/overview.html

使用するOS
CentOS 5.6
http://www.centos.org/

導入方法がよくわかるサイト様
CentOSで自宅サーバー構築
http://centossrv.com/

仕事としてやること
SQLサーバーを設置、データベースの実装
案山子

個人でやってみたいこと
Webサーバー設置、個人サイト作成
クローズドなコミュニティツール置き場

等々
たとえばデータベースと自分で作った適当なプログラムが連動できれば
簡易的なチャットツールか掲示板が無料で簡単に作れるんじゃないかとか

なんかゲームライクなアプリおけば色々楽しいんじゃないか とか

今週土日は実家なんで新PCのベンチマークも兼ねてちょっと使ってみよう
待て続報

SmartPhone EXPOにいってきました。

昨日から東京ビックサイトで開催されていますEXPOに本日行ってまいりました。
展示していた中から気になった技術、サービス等をざっと紹介していきたいと思います。

ウェルコムデザイン株式会社様
http://www.e-welcom.com/
スマートフォンをバーコードリーダーに出来るというシステムが展示してありました。
ハンディターミナルは高価な物が多い中、アプリに機能を落とし込む事でコストの削減を図っているようです。
また、通信機能等も活用する事が出来るため、使う人には非常に便利そうな技術でした。
Bluetooth通信回りを上手く利用できているので是非参考にさせて頂きたいものです。

タクト情報システムズ様
http://www.tact-info.co.jp/layout1.html?category=profile&contents=news
スマートフォン(展示は主にiPadを使っていました)を使った会議システムが展示してありました。
手持ちの資料を紙媒体からデータに変え、会議資料をデータベースに置き、通信を行う事で
会議を円滑に進めようという取り組みが非常に興味深かったです。
個人的にはデータベースを絡めたスマートフォンの通信技術に惹かれた次第であります。

YAMAGATA株式会社様
http://www.yamagata-corp.jp/jp/
「ライブ壁紙」というシステムを使い、デザイン性に富み、動きのある壁紙を展示していました。
インターフェイス的に動きがよく見え、非常に面白かったです。
自分はデザインセンスがいまいちなので、「動かせる壁紙」というアイディアに目を奪われました。
カタログ等への転用も出来るようで利便性、娯楽性が高く素晴らしいシステムだと感心いたしました。

その他にも多々みて回ったのですが、流石に描ききれないので特に印象深かった企業様を挙げさせていただきました。
基本的に自分の現在開発しているアプリに落とし込めそうな技術を探してウロウロしていました。
こういった展示会は余り訪れる機会がなかったので、新鮮な体験でした。

Androidにインストールされているアプリ名、アイコンを同時に取得する

他のサイトでも多々紹介されていますが、
アプリ名、アイコンを同時に取得、表示する方法はあまり紹介されていない様です。
せっかく自分が出来たので方法を公開したいと思います

PackageManager pm = this.getPackageManager();
List list = pm.queryIntentActivities(intent, 0);

String[] appN = new String[100];
String[] pkgN = new String[100];

int i=0;
for(ResolveInfo item : list){
//アプリの名前、パッケージ名を取得する
appN[i] = item.loadLabel(pm).toString();
pkgN[i] = item.activityInfo.packageName;
i++;
}

//サイズの丁度いい参照用の配列を用意する
final String[][] AppName = new String[2][i];

for (int c = 0; c < i; c++){
AppName[0][c]=appN[c];
AppName[1][c]=pkgN[c];
}

ArrayAdapter MyAdapter =
new ArrayAdapter(this,android.R.layout.simple_spinner_item,AppName[0]);
//各自で定義したスピナーにアダプターをセットする
aSpinner.setAdapter(MyAdapter);
aSpinner.setOnItemSelectedListener(
new AdapterView.OnItemSelectedListener()
{
public void onItemSelected(AdapterView parent,View v, int position, long id){
Spinner spinner = (Spinner)parent;
String s = (String)spinner.getSelectedItem();
aTextView.setText(String.format("%s Selected.",s));
//アイコンを取得する為に新しくパッケージマネージャーを定義する
PackageManager pm2 = getPackageManager();
try {
Drawable icon = pm2.getApplicationIcon(AppName[1][position]);
//アイコンを表示させる為のImageViewを定義しておく事
aImageView.setImageDrawable(icon);
} catch (NameNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}}
public void onNothingSelected(AdapterViewparent){//エラー処理は割愛}
});

大事なのはArrayAdapterに渡す配列を2次元配列にしておくこと。
そして0行目にはアプリケーション名、1行目にはパッケージ名を渡しておけば
onItemSelectedの中で選択したSpinnerの要素番号(アプリ名)からパッケージ名を参照する事が可能となります。
別に2次元配列にする必然性はないですが、設計的に見直しが楽です。

自分用お買い物メモ

前記事反省点・改善点

現在、ペアリングはonStartメソッドで行う為、アプリ起動時に相方がDiscovery_Enableになっていないと接続を確立できない。

あらかじめどちらかが起動していれば問題はない(はず)為、一応問題はないが、3者間通信等を行うときにはおそらくハードルになってくる。

あと、ペアリング承認自体はオートではなく、手動でToastを叩かなければいけない。要改善

さらに、アプリ起動からDiscovery,ペアリングまでそこそこ時間がかかってしまう。要改善


こんなところですかね。

今回とは関係ないけれど、今後のタスク

3者間通信の実現
UI、操作性の改善

以上。

BlueTooth通信確立

あらかじめペアリングが必要と言われたので、
アプリを起動した後にペアリングを促せる(Bluetooth機器を検索できる)ようにプログラムを弄りました。

元ソース
http://d.hatena.ne.jp/umetyuu/20101212

上記ソースコードのonStartのログ出力直前に以下を追記

//発見可能状態
Intent discoverableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300);
startActivity(discoverableIntent);
 final BroadcastReceiver mReceiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (BluetoothDevice.ACTION_FOUND.equals(action)) {
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
// Add the name and address to an array adapter to show in a ListView
//ListViewではなく(自分の場合は)デバイスリストに直結させています
mDevices.add(device);
}}};

//検索
mAdapter.startDiscovery();
IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
registerReceiver(mReceiver, filter);
// Don't forget to unregister during onDestroy

これにより、デバイスリストにDiscoveryしたデバイスを追加し、ペアリングを許可することで
上記ソース元による接続シークエンスへと移行します。

AndroidでのBlueTooth通信

AndroidでBlueTooth通信を実現使用としているのですが・・・

知らない文法で知らない機構を使う事がこんなに難しいとは・・・
とりあえず参考資料だけでも投下します。

http://groups.google.com/group/android-group-japan/browse_thread/thread/3ef47ad1e352b4ac
http://developer.android.com/resources/samples/BluetoothChat/index.html

ソースコピーして暫定的にでも動けばいいと思ったのですが、なかなか上手くいかず・・・
パッケージ名を変更したり、Jarを読み込みなおしたりしたが、エラーは消えず

とりあえずソースコードを上から下まで眺めまわし、問題点を整理するところからスタート。

①パッケージ名、構造が違うことによる参照誤差
②コンパイルするAndroidアプリのバージョン見直し
③そもそも構造を勉強しなおす

この辺りが現段階での壁ですね。
BlueToothのペアリングをアプリから操作できる方法等も併せて調べたいところ

また、インターフェイス面でも流用出来そうなソースを見つけたので自分用メモ
http://xfutures.jp/2010/02/14/197/

なにはともあれ、知識と経験を積まねば通信アプリは難しいですね。特に端末間通信は
GoogleMapみたいに1から用意されていれば楽なのにな・・・

Androidアプリ作成に着手!

いよいよAndroidアプリを作り始めたのですが・・・
ベースがJavaとはいえ、見慣れない文法が多くて前途多難。

とりあえず今はインストールアプリの一覧が取得出来るアプリを作ってみてるのですが
なかなか難しいですね

とりあえず参考にしたサイト様を載せておきますか

https://sites.google.com/a/gclue.jp/android-1000-tips/pakkeji-mei-kara-iconwo-shi--yut
http://d.hatena.ne.jp/h13i32maru/20110320/1300583808

と、こんなところですね
現在はこんな感じで動きます。

StaticVoid放浪記

インターフェイスの調整や、使用感の改善を目指して進みます。

将来的には通信の機能もつけたいので、勉強する事はたくさんありますね~
さしあたってはゴールデンウィーク入って頭がボケる前にキリのいい所までは作りたいですね

それでは帰ります!

はじめてのぴーえいちぴー

データーベースサーバーを他所に置く必要が出てきましたが。
実際のPCを使うのは面倒なので、自分のPCにVMを使い、仮想PCを使ってそこにサーバーを置くことにしました。

で、ついでだからデータベースをWeb上で操作できるようにするため、PHPを使い始めました。
ということでMySQLサーバーにWeb上(PHP)から接続するコードを載せます。

try {
  //MySQLに接続
$pdo = new PDO("mysql:host=localhost; dbname=でーたべーす名", "ゆーざー","ぱすわーど");

//エラー処理
} catch(PDOException $e){
var_dump($e->getMessage());
}

//切断
$pdo = null;
?>

と簡単に書くとこんな感じです。実働部分はCatchの前に書きました。

SELECTを使うとき

$stmt = $pdo->query("SQL文");

while($row = $stmt->fetch(PDO::FETCH_ASSOC)){
echo implode(", ", $row) . PHP_EOL;
}

これでSQL文(SELECT構文)がブラウザ上に列挙されます。
また、要素ごとに,で区切られ、列が移動すると改行もしてくれます。

次はINSERTを紹介したいのですが、テーブルの形が分からないと構文も分かりにくいので、
暫定的にテーブルを作成します。

mysql>CREATE TABLE User(ID Int,Pass varchar(45),Name varchar(45));

と、こんな感じのテーブルでINSERTを使うとき

$stmt = $pdo->prepare("INSERT INTO User(ID,Pass,Name)VALUES(:ID,:Pass,;Name)");

$stmt->bindValue(':ID',IDの中身);
$stmt->bindValue(':Pass',Passの中身);
$stmt->bindValue(':Name',Nameの中身);

$stmt->execute();

となるみたいです。

後半のbindValueをしないと、変数をSQL文内で使う事が出来ないようで、
最初のSQL文宣言の所で使っている :ID :Pass :Name を下部でそれぞれに中身を放り込んでやり、

最後にExecute()で実行している という構造になっています。

正直まだ理解が進んでいないのですが、今日はこのあたりで終了したいと思います。

MySQLでのデータベース操作のコマンド

昨日はテーブルの作成までを書いたので、今日は操作コマンドを書きたいと思います。

特定のカラムを取得する方法

SELECT カラム名 FROM テーブル名 WHERE 条件

です。
たとえば昨日の記事を例にだし、「Numberが1である列のIDを取得」しますと。

SELECT ID FROM テーブル名 WHERE Number=1;


特定のカラムを更新する方法

UPDATE テーブル名 SET カラム1=要素1,カラム2=要素2,... WHERE 条件;

となります。例として「Numberが1である列の内容を更新」します。

UPDATE テーブル名 SET Number=2 ,ID='F-14' WHERE ID = 1;

となります。ちなみにSQL文内で文字列を使用する時は'で囲みましょう。


テーブルに新しい行を追加する

INSERT テーブル名 INTO (カラム1,カラム2,...) VALUES (要素1,要素2,...);

となります。例として

INSERT テーブル名 INTO (Number,ID) VALUES (3,'A-10');

これで新しい行が追加されました。
さらに詳しい使用方法はきりがないのでとりあえず割愛します。
自分用メモですんでw