スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

ブログを検索エンジンに簡単に登録する方法

作成したブログを検索エンジン(google、yahooなど)に簡単に登録する方法です。

「バナーを張る」

これだけです。


今は、検索エンジンの登録を代行してくれる様々なサービスがあります。
私が使っているのはEC studio アフィリエイトというもの。

このサービスは、登録後生成されたバナーをサイトに貼り付けておくだけで、国内の主要な検索エンジンに自動で毎月サイトを登録してくれるというもの。


設定は簡単。
EC studio アフィリエイトで「新規登録」を行い、バナーが生成されるので、それをブログのどっかに貼り付ければOK

これで、あとは勝手に検索エンジンに登録してくれます。(たぶん・・・)

ちなみにこんなバナーです


80,000人以上のウェブマスターに認められた、アフィリエイトプログラム

80,000人以上のウェブマスターに認められた、アフィリエイトプログラム


スポンサーサイト

テーマ : HP作成
ジャンル : コンピュータ

Android 別のActivityからプリファレンスの参照方法

別のアプリケーションからプリファレンスを参照する


別のアプリケーションから、設定したプリファレンスの内容を参照できます。
プリファレンスを生成するアプリAと、アプリAのプリファレンスを参照するアプリBを作成します。

■プリファレンスを生成するActivity「PrefSample1」

package pref.sample1;①

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

public class PrefSample1 extends Activity {

String prefName = "worldPref"; // プリファレンス名

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

// プリファレンスに値の出力
SharedPreferences sp = getSharedPreferences(prefName, ②
MODE_WORLD_READABLE | MODE_WORLD_WRITEABLE);
SharedPreferences.Editor editor = sp.edit();
editor.putString("key1", "sample1");
editor.putString("key2", "sample2");
editor.commit();
}
}

①Androidではアプリの区別をパッケージ名で行います。
 PrefSample1はパッケージ「pref.sample1」で生成します。
②プリファレンスの作成を行います。
 他のアプリでの利用を行うため、モードは「MODE_WORLD_READABLE|MODE_WORLD_WRITEABLE」
 とします。読み書きを許可してます。


■PrefSample1のプリファレンスを読み込むActivity「PrefSample2」

package pref.sample2;

import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.widget.TextView;

public class PrefSample2 extends Activity {

String prefName = "worldPref"; // プリファレンス名

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
try {
Context other = createPackageContext("pref.sample1", ①
Context.CONTEXT_IGNORE_SECURITY);
SharedPreferences sp = other.getSharedPreferences(prefName,
MODE_WORLD_READABLE | MODE_WORLD_WRITEABLE);

StringBuilder line = new StringBuilder();
line.append(" key1 = " + sp.getString("key1", ""));
line.append("\n key2 = " + sp.getString("key2", ""));
TextView tv = new TextView(this);
tv.setText(line.toString());
setContentView(tv);
} catch (Exception ex) {}
}
}

①別のアプリのプリファレンスを使用する場合は、パッケージを指定してContextを取得します。
 取得したContextから、保存時と同じモードでプリファレンスを取得します。

テーマ : android
ジャンル : コンピュータ

MCAセキュリティの勉強・試験(2回目)

前回、惜しくも1点足りずに不合格になってしまったMCAセキュリティのリベンジを行った。

古い参考書ではなく、最新の参考書を購入し、もう一度初めから読み直し。
前回と同じ内容の部分は確認程度にし、Windows7周りを詳しく読み込んだ。

前回の試験から2週間後に再試験。

結果はなんとか合格。

ライン560のところ、596で合格(・∀・)


2つの参考書を読んで、さらに2回目の試験だというのにギリギリ・・・

MCAセキュリティ難しいよ。
それとも単に俺のオツムが弱いのか。
たぶん後者だろう(´・ω・`)


ともかく、合格には間違いない。
これでMCA4つ取ることができて一安心(´∀`)


今回の勉強で前よりはセキュリティに詳しくなったが、やはりまだまだダメだな。
普段からセキュリティ分野に携わっていないと、難しいということがよくわかった。

ということで、MCAセキュリティについての感想は、
「難しい」
の一言。
理由は「普段あまり意識していないから」


■個人的総評
勉強時間:★★★☆☆
難易度 :★★★★☆



今回のセキュリティで、無事MCA4つの資格が集まった。
初めはMCA = 簡単・初心者の資格
程度の認識だったが、この試験はベテランでも受ける価値はあると思う。

いい勉強になったし、アプリケーションからDB、セキュリティと幅広く学ぶことができてよかった。


試験の難易度は、
セキュリティ>>>>>>プラットフォーム > アプリケーション=データベース
かな。

私みたいなSI、SEならプラットフォーム、アプリケーション、DBは問題ないだろう。


さぁ~次はどーやったらMCAマスターの証明書がもらえるのだろうか。
これがもらえないと会社から報奨金がもらえない(´・∀・`)

Android 自作ゲームアプリがWeb雑誌に掲載されました

本格的にまじめに作りこんだAndroidの自作ゲームアプリが、
スマートフォン情報サイトmobileASCIIで紹介されました。

「アプリ名:カブトムシ王(キング)対戦 」
http://mobileascii.jp/elem/000/000/054/54371/

このアプリは、今まで作ってきたアプリの中で、一番のヒット作になっています。

苦労して作ったかいがありましたよ。

mobileASCII様 ありがとー

テーマ : android
ジャンル : コンピュータ

Android SQLiteのDBファイルをSDカード上に作成する方法


SQLiteのDBファイルをSDカード上に作成


 通常、アプリでSQLiteを利用する場合にできるDBファイルは、そのアプリの配下に作成されます。
作成される場所は「/data/data/(package_name)/databases」です。
パッケージの配下に「databases」というフォルダを作成し、そこにDBファイルを作成します。

 そこで今回は、デフォルトでパッケージ配下に作成されるDBファイルをSDカード上に作成する方法を記述します。

○SDカードに作成されたDBファイル

※AndExplorerにて確認

○実行結果


※2010年時点
■メリット(だと思われる・・・)
・大容量のDBファイルが構築できる(端末容量<SDカードのため)
・DBファイルがアプリに依存していないため、他のアプリからもアクセスできる

■デメリット
・SDカードが必須。PC接続時にSDカードをマウントしていると、端末上でSDカードの認識ができないため、
 アプリが異常終了する(Xperiaで確認)

■注意点
・SQLiteOpenHelperを利用しない
 正確には「利用できない」です。
SQLiteOpenHelperでのDBファイルの指定の際に、フォルダ構成を示す「/」スラッシュが入っていると
エラーとなってしまうからです。
SDカード上のDBファイルを開くには、ルートからそのDBファイルまでのパスが必要になり、必然的に「/」が
含まれてしまいます。
そのため、SQLiteOpenHelperを利用せずに自前でのコーディングが必要となります。



■自前のSQLiteOpenHelper

DBに接続し、コネクションを返すクラスを作成します。

○SQLiteHelperクラス

package sdcard.sqlite;

import java.io.File;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.os.Environment;

public class SQLiteHelper {

String folder = "/sqlitefile"; // DBファイルを格納するフォルダ①
String dbfile = "/sqlite.db"; // DBファイル名

// コネクションの生成
public SQLiteDatabase openConnection() throws SQLException {

// SDカードのパス
File file = Environment.getExternalStorageDirectory();②
// フォルダの生成
String fol = file.getPath() + folder;③
if (new File(fol).exists() == false) {
new File(fol).mkdir();
}
// DBまでのパス
String dbpath = fol + dbfile;

SQLiteDatabase db = null;
db = SQLiteDatabase.openOrCreateDatabase(dbpath, null);④
return db;
}

}

①SDカードに作成するフォルダと作成されるDBファイル名の指定です
②「Environment.getExternalStorageDirectory();」でSDカードのパスを取得します。
③ ①で設定したフォルダをSDカード上に作成します。
④「SQLiteDatabase.openOrCreateDatabase(dbpath, null);」でSQLiteのDBコネクションを生成します。


■アクティビティ
DBのコネクションを取得し、テーブルの作成、データの登録、参照を行います

○SQLite4SDアクティビティ

package sdcard.sqlite;

import android.app.Activity;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.widget.TextView;

public class SQLite4SD extends Activity {@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

SQLiteDatabase db = null;
Cursor c = null;
try {
// DBコネクション生成
db = new SQLiteHelper().openConnection();①

// テーブルの作成
String q = " CREATE TABLE TEST(ID TEXT,NAME TEXT)";②
db.execSQL(q);

// データの登録
q = " INSERT INTO TEST(ID,NAME) ";③
q += " VALUES(?,?) ";
Object[] bind = {
"0001", "hoge"
};
db.execSQL(q, bind);

Object[] bind2 = {
"0002", "pu"
};
db.execSQL(q, bind2);

// データの抽出 ④
q = " SELECT * FROM TEST";
c = db.rawQuery(q, new String[] {}); // 実行
String[] colname = c.getColumnNames(); // 列名取得
String rst = "";
while (c.moveToNext()) {
String line = "";
for (int i = 0; i < colname.length; i++) {
String cn = colname[i];
line += cn + "=" + c.getString(i) + " ";
}
rst += line + "\n";
}

TextView tv = new TextView(this);⑤
tv.setText(rst);
this.setContentView(tv);
} finally {
if (db != null) db.close();
if (c != null) c.close();
}
}
}


①自作SQLiteクラスからDBコネクションを取得します。
②テーブルを作成します。
③データの登録を行います。
④登録したデータを取得します。
⑤取得した内容を表示します。


■マニフェストファイル
今回はSDカードにアクセスするため、マニフェストファイルに以下を記述します

<?xml version="1.0" encoding="utf-8" ?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="sdcard.sqlite"
android:versionCode="1" android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".SQLite4SD" 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>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>①
</manifest>

① uses-permissionに「android.permission.WRITE_EXTERNAL_STORAGE」を追加します。

テーマ : android
ジャンル : コンピュータ

Android ファイルによる入出力について

ファイルによる入出力について

Androidでもファイルの入出力が可能です。ただし、作成されるファイルはアプリごとの専用リソースとして
扱われます。そのため、他のアプリから利用できません。

■ファイルの入出力についてのサンプル                  
ファイルの出力先は「/data/data/パッケージ名/files」となります。


package android.sample.filep;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

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

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

// ファイルの出力
FileOutputStream fos = null;
BufferedWriter out = null;
try {
fos = this.openFileOutput("text.txt", 0);①
out = new BufferedWriter(new OutputStreamWriter(fos));
out.write("ファイルの出力・抽出テストです");②
out.flush();
} catch (Exception ex) {
System.out.println(ex);
} finally {
try {
if (fos != null) fos.close();
if (out != null) out.close();
} catch (Exception ex) {}
}
// ファイルの抽出
FileInputStream fis = null;
BufferedReader in = null;
try {
fis = this.openFileInput("text.txt");③
      in = new BufferedReader(new InputStreamReader(fis));
((TextView) findViewById(R.id.output)).setText( in .readLine());④
} catch (Exception ex) {
System.out.println(ex);
} finally {
try {
if (fis != null) fis.close();
if ( in != null) in .close();
} catch (Exception ex) {}
}
}
}



①ファイルの出力は、Context.openFileOutputを利用します。
②BufferedWriterでファイルの出力します。
③ファイルの入力は、Context.openFileInputを利用します。
④BufferedReader.readLineでファイルを読み込みます

テーマ : android
ジャンル : コンピュータ

Android SQLiteの作成・データの永続化

SQLiteによるデータの永続化


Androidに搭載されているSQLiteについての操作方法を記載します。

・データベースを作成クラスでは、SQLiteOpenHelperを継承し、
 必要なメソッドをオーバーライドします。

・データベースに対しての操作を行うクラスでは、DAOクラスを導入します。
 insert、updateメソッドを実装します。

以下にサンプルを記述
今回はDB、テーブルの作成、データの登録・参照のサンプルとなります。


SQLiteを利用するActivityクラス        

○AndroSQLiteアクティビティクラス

package andro.sqlite;

import java.util.List;
import android.app.Activity;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;

public class AndroSQLite extends Activity {
/** Called when the activity is first created. */@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

  // prefectureSQLiteHelperのコンストラクタ呼び出し
PrefectureSQLiteHelper dbHelper = new PrefectureSQLiteHelper(this);①
SQLiteDatabase db = dbHelper.getWritableDatabase();②

// prefectureDao コンスト呼び出し③
PrefectureDao prefDao = new PrefectureDao(db);

Prefecture pf = new Prefecture();④
pf.setName("青森");
pf.setCode("10");
prefDao.insert(pf);

pf = new Prefecture();
pf.setName("東京");
pf.setCode("20");
prefDao.insert(pf);

List < Prefecture > list = prefDao.findAll();⑤

db.close();⑥

StringBuilder lines = new StringBuilder();
for (Prefecture p: list) {
lines.append(p.getName());
lines.append("|");
lines.append(p.getCode());
lines.append(System.getProperty("line.separator"));
}

TextView tv = new TextView(this);⑦
tv.setText(lines.toString());
setContentView(tv);
}
}

①SQLiteOpenHelperを実装したPrefectureSQLiteHelperを生成
②getWritableDatabase()メソッドを実行してSQLiteDatabaseを取得する。
  SQLiteHelperのonCreate()メソッドが実行される。
③操作用DAOクラスを生成します。
④データ格納用クラスのPrefectureクラスを生成します。
 値設定後、操作用DAOクラスのInsertメソッドを実行します。
⑤DAOクラスのfindAll()で、現在登録されている全項目を抽出する
⑥DBを閉じます。
⑦画面表示用のTextViewwを生成


SQLiteOpenHelperを実装するクラス      
○PrefectureSQLiteHelperクラス

package andro.sqlite;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

//SQLiteOpenHelperを継承し独自Helperクラスを生成
public class PrefectureSQLiteHelper extends SQLiteOpenHelper {

private static final String DATABASE_NAME = "PREFECTURE"; // データベース名 ①
private static final int DATABASE_VERSION = 1; // スキーマバージョン

// テーブル作成用SQL
private static final String CREATE_TABLE_SQL =
" create table prefecture (name text primary key,code text)";②
private static final String DROP_TABLE_SQL = "drop table if exists prefecture";

public PrefectureSQLiteHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);③
}

@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_TABLE_SQL); // テーブル作成用SQL実行 ④
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {⑤
}
}

①作成するデータベース名
②テーブル作成用のCreate文
③コンストラクタにてsuperクラスにデータベース名、スキーマを設定する
④onCreateメソッドにて、execSQLを実行します。
 execSQLはSELECT以外のSQLを実行します。
⑤onUpgradeメソッドでは、既存のテーブル削除後にonCreateで新たにテーブルを作成します。
 今回は省略します。

データ操作用のDAOクラス          

○PrefectureDaoクラス

package andro.sqlite;

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

import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;

//データ操作用クラス
public class PrefectureDao {
private static final String TABLE_NAME = "prefecture";①
private static final String COLUMN_NAME = "name";
private static final String COLUMN_CODE = "code";
private static final String[] COLUMNS = {
COLUMN_NAME, COLUMN_CODE
};

private SQLiteDatabase db;

/**
* コンストにてSQLiteDatabaseを引数とする

* @param db
*/
public PrefectureDao(SQLiteDatabase db) {
this.db = db;②
}

public long insert(Prefecture pref) {
ContentValues values = new ContentValues();③
values.put(COLUMN_NAME, pref.getName());
values.put(COLUMN_CODE, pref.getCode());
return db.insert(TABLE_NAME, null, values);
}

public long update(Prefecture pref) {
ContentValues values = new ContentValues();
values.put(COLUMN_NAME, pref.getName());
values.put(COLUMN_CODE, pref.getCode());
String whereClause = "name = " + pref.getName();④
return db.update(TABLE_NAME, values, whereClause, null);
}

public List < Prefecture > findAll() {
List < Prefecture > list = new ArrayList < Prefecture > ();
Cursor cursor = db.query(TABLE_NAME, COLUMNS, null, null, null, null, ⑤
COLUMN_CODE);
while (cursor.moveToNext()) {⑥
Prefecture pref = new Prefecture();
pref.setName(cursor.getString(0));
pref.setCode(cursor.getString(1));
list.add(pref);
}
return list;
}

public Prefecture findByName(String name) {⑦
String selection = " name = " + name;
Cursor cursor = db.query(TABLE_NAME, COLUMNS, selection, null, null,
null, null);
while (cursor.moveToNext()) {
Prefecture pref = new Prefecture();
pref.setName(cursor.getString(0));
pref.setCode(cursor.getString(1));
return pref;
}
return null;
}

public int delete(String name) {⑧
return db.delete(TABLE_NAME, " name = " + name, null);
}
}

①作成したテーブル名、列名、列名を配列かしたString配列を設定
②コンストラクタにてSQLiteDatabeseを設定
③Insert用にContentValuesオブジェクトを使用する。
 putメソッドでKey、Value設定を行う。
④更新条件としてnameに条件を指定する。
⑤queryメソッドで条件を指定しデータを取得します。
 検索結果はCursorで戻します。
⑥Cursorから結果を取得し、データ格納クラス(Prefecture)へ値を設定しリスト化する。
⑦条件を指定してデータを検索します。
⑧削除メソッド


データ格納クラス              
○Prefectureクラス

package andro.sqlite;

public class Prefecture {

private String name = "";
private String code = "";

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getCode() {
return code;
}

public void setCode(String code) {
this.code = code;
}

}



■実行結果
20121124_194313.jpg

テーマ : android
ジャンル : コンピュータ

Android プリファレンス(Preference)によるデータの保存

プリファレンスによるデータの保存

プリファレンスとは、MapオブジェクトのようにKey&Value形式でデータと取り扱う仕様となっています。

■プリファレンスのデータ保存サンプル
以下がデータの保存、取得のサンプルです。


package android.sample.preference;

import android.app.Activity;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.widget.TextView;

public class PreferenceSample extends Activity {
     // プリファレンス名
    public static final String PREFERENCE_NAME = "SAMPLE"; ①

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
         // setContentView(R.layout.main);
        SharedPreferences pref =
getSharedPreferences(PREFERENCE_NAME, MODE_PRIVATE);②

        SharedPreferences.Editor editor = pref.edit();  ③

     editor.putBoolean("TEST_BOOL", true);

     editor.putString("TEST_STR", "TEST");

         editor.commit(); ④



        boolean bl = pref.getBoolean("TEST_BOOL", false);

        String str = pref.getString("TEST_STR", "hoge");



        TextView vi = new TextView(this);

        vi.setText("bool = " + bl + " string = " + str);

        setContentView(vi);

    
}

}



①プリファレンスを判断するプリファレンス名
②getSharedPreferencesでプリファレンスインスタンスを取得します。第一引数はプリファレンス名、第二引数に公開モードを指定します。
③編集はEditorインスタンスを利用します。取得したインスタンスにputBoolean、putStringで値を設定します。
④commitメソッドでデータを確定させます。


■デフォルトのプリファレンスの利用

アプリにはデフォルトのプリファレンスが1つ準備されています。プリファレンスを一つしか利用しない、または他のアプリと共有する必要が無い場合は、デフォルトのプリファレンスを利用したほうが便利です。

○デフォルトのプリファレンス取得


SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(this);

テーマ : android
ジャンル : コンピュータ

カレーパン 山崎パンの焼きカレーパン

山崎パンの焼きカレーパン

20121124_194313.jpg

近所の八百屋で袋に詰まれて安売りしていた。
3つのパンがセットで200円。

嫁が買い物ついでに買ってきたもので、袋をみたら俺の大好きなカレーパン。

まず、包装のデザインが今のカレーパンと比べると古い(´・ω・`)

コンビニでパンやおにぎりを買うときって、見た目・包装などで決めることが多いと思う。
ちとこの包装は、あまり美味しそうには見えないかな。ゴメンね山崎パンさん。

味はというと、
申し訳ないが、これが予想以上に美味かった(・∀・)

カレーパンに大切な辛さについて、しっかりと程よい辛さがあって良い(・∀・)
その辛さの中に、程よい甘みがある。
なんと、りんごのピューレが入っているではないか。

しっかりと辛さもあり、その中でリンゴの甘みをも活かしているとは。


味は予想以上に美味しい。
だからこそ、見た目の包装が勿体ない。

もっと美味しそうな包装にすれば良いのに(´・ω・`)
んん?? これは包装じゃなくパンの見た目なのかな?

満足度:★★★★☆
味は文句無く美味しい。辛さと甘みのバランスが自分は好きな感じ。
ただ、やはり見た目が勿体ない。


それと、
いつも思うのだが、「焼き」カレーパンの「焼き」ってなんなんだ?

テーマ : パン
ジャンル : グルメ

HTML CSSでテーブル(TABLE)のセルの上下左右の余白を無くす

通常HTMLでTable要素を構築した場合、Td(セル)の上下左右には余白が設定される





 あ 
 い 


この余白を無くするには、以下をCSSで設定してあげればよい

border-spacing: 0px;
border-collapse: collapse;







 あ 
 い 


table要素のstyle属性で以下のように追記する

style="border-spacing: 0px;border-collapse: collapse;"

テーマ : HP作成
ジャンル : コンピュータ

Android 設定画面を簡単に作成する方法

設定画面を簡単に作成

簡単に値を保存できるプリファレンスは便利ですが、画面レイアウトや、値の保存、取得についての処理は
結構複雑化する場合があります。

しかし、PreferenceActivityを利用すると簡単に設定画面を作成することが可能となります。
PreferenceActivityを利用すると、値の保存、抽出をActivity側が自動で行ってくれます。
設定画面はXMLで作成します。XMLでは画面レイアウトのほかに、プリファレンスに値を保存する際にKeyを指定します









20121116_064145.jpg

20121116_064145.jpg

20121116_064145.jpg

20121116_064145.jpg


■プリファレンスのレイアウトXML
○pref.xml
通常のレイアウトとは記述方法が異なります。


<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceScreen android:title="設定1(サブメニュー有り)">①
<PreferenceCategory android:title="サブメニュー">②
<CheckBoxPreference android:key="check1" ③
android:title="チェックボックス" android:summary="説明"
/>/>
<ListPreference android:key="list1" android:title="リスト設定" ④
android:summary="説明"
android:entries="@array/entries_list_preference"
android:entryValues="@array/entryvalues_list_preference"
android:dialogTitle="ダイアログタイトル" />
</PreferenceCategory>
</PreferenceScreen>
<PreferenceCategory android:title="設定2">
<EditTextPreference android:key="text1" ⑤
android:title="編集" android:dialogTitle="入力ダイアログ"
/>/></PreferenceCategory>
</PreferenceScreen>


①PreferenceScreenは設定項目の土台となるクラスです。
②PreferenceCategoryでは、タイトルの設定が可能です。
③チェックボックスが表示されます。チェック状態がプリファレンスへ登録されます。
④ラジオボタンのリストが表示されます。選択した項目がプリファレンスへ登録されます。
 entries、entryValuesは表示するリスト内容です。Valueフォルダにarray.xmlで設定しています。
⑤入力フィールドが表示されます。入力内容がプリファレンスへ登録されます。

○arrays.xml

<?xml version="1.0" encoding="utf-8" ?>
<resources>
<string-array name="entries_list_preference">
<item>選択1</item>
<item>選択2</item>
<item>選択3</item>
</string-array>
<string-array name="entryvalues_list_preference">
<item>1</item>
<item>2</item>
<item>3</item>
</string-array>
</resources>


■表示する画面

package pref.test;

import android.os.Bundle;
import android.preference.PreferenceActivity;

public class PrefTest extends PreferenceActivity {②
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setTitle("setting");
addPreferencesFromResource(R.xml.pref);①
}
}


①プリファレンスのxmlを指定します。
②プリファレンスを表示するために、PreferenceActivityを継承します。

■Preference種類
CheckBoxPreference チェックボックス表示。チェック状態が保持されます。
DialogPreference ダイアログボックス表示
EditTextPreference 入力フィールド表示。入力内容が保持されます。
ListPreference リスト表示。選択項目が保持されます。
RingTonePreference 着信音リスト表示。選択した着信音に設定されます。


■手動で値を抽出するには
設定された値を抽出するには、デフォルトのプリファレンスを取得することで抽出が可能となります。

SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(this);


デフォルトで取得したプリファレンスに対して、xmlで指定したキーで値の抽出が可能となります。

テーマ : android
ジャンル : コンピュータ

画像 ORFファイル(RAWファイル)を変換するフリーソフト

オリンパス PENで写真を撮って、PCに取り込んだまでは良かったが、
その画像を他のPCに送ったところで困った。

送った先のPCで画像が見えない。

よく見たら画像の拡張子が.orf
オリンパスの画像拡張子らしい。

手元にはカメラもないし困ったなーと思って、変換するためのフリーソフトが無いか探してみた。

そしたら発見(・∀・)

■XnView
http://www.gigafree.net/tool/view/xnview.html

これで問題なくorfファイルを変換することに成功( ゚∀゚)

このソフトはいろんな拡張子に対応しているらし。
すごいソフトだ。



■対応フォーマット
AI / ANI / BMP / CAM / CIN / CRW / CUR / DCR / DIB / EMF /
GBR / GIF / ICL / ICO / J6I / JBR / JP2 / JPG / KDC / DNG / LBM / MIF / MNG / MSK / NEF / OIL /
ORF / PAT / PBM / PCD / PDF / PFI / PIC / PMP / PNG / PNM / PPM / PSD / PSP / PSPBRUSH /
RAW / RLE / RW2 / SR2 / SRF / SVG / TEX / TIF / TIM / TM2 / TUB / XCF
・動画
AVI /
MOV / MPG

テーマ : フリーソフト
ジャンル : コンピュータ

Android 日付ダイアログと時刻ダイアログの表示

日付ダイアログと時刻ダイアログ
日付入力、時刻入力が可能なダイアログです。










○main.xml
日付、時刻を表示するTextViewとダイアログを表示するButtonを配置します

<?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">
<TextView android:id="@+id/datelabel" android:layout_width="fill_parent"
android:layout_height="wrap_content" />
<Button android:id="@+id/datebtn" android:layout_width="fill_parent" android:layout_height="wrap_content"
android:text="日付ダイアログ" />
<TextView android:id="@+id/timelabel" android:layout_width="fill_parent"
android:layout_height="wrap_content" />
<Button android:id="@+id/timebtn" android:layout_width="fill_parent" android:layout_height="wrap_content"
android:text="時刻ダイアログ" />
</LinearLayout>


○Activity

package dialog.test;

import java.text.SimpleDateFormat;
import java.util.Date;
import android.app.Activity;
import android.app.DatePickerDialog;
import android.app.TimePickerDialog;
import android.app.TimePickerDialog.OnTimeSetListener;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.DatePicker;
import android.widget.TextView;
import android.widget.TimePicker;

public class DialogTest extends Activity {

Activity activity = null;
TextView dateLabel = null;
TextView timeLabel = null;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
activity = this;
dateLabel = (TextView) findViewById(R.id.datelabel);
timeLabel = (TextView) findViewById(R.id.timelabel);

findViewById(R.id.datebtn).setOnClickListener(dateClick);①
findViewById(R.id.timebtn).setOnClickListener(timeClick);
}

/**
* 日付ダイアログ表示
*/
OnClickListener dateClick = new OnClickListener() {@Override
public void onClick(View v) {
String now = now();
int y = Integer.parseInt(now.substring(0, 4));
int m = Integer.parseInt(now.substring(4, 6));
int d = Integer.parseInt(now.substring(6, 8));
if (!dateLabel.getText().toString().equals("")) {
String[] date = dateLabel.getText().toString().split("/");
y = Integer.parseInt(date[0]);
m = Integer.parseInt(date[1]);
d = Integer.parseInt(date[2]);
}

// 日付ダイアログ
DatePickerDialog dateDialog = new DatePickerDialog(activity, ②
new DatePickerDialog.OnDateSetListener() {@Override
public void onDateSet(DatePicker view, int year, ③
int monthOfYear, int dayOfMonth) {
dateLabel.setText(String.format("%04d/%02d/%02d",
year, monthOfYear + 1, dayOfMonth));
}
}, y, m - 1, d);
dateDialog.setButton(DialogInterface.BUTTON_NEGATIVE, "cancel", ④
new DialogInterface.OnClickListener() {@Override
public void onClick(DialogInterface dialog, int which) {
dateLabel.setText("");
}
});
dateDialog.show();
}
};
/**
*  時刻ダイアログ表示
*/
OnClickListener timeClick = new OnClickListener() {@Override
public void onClick(View v) {
String now = now();
int h = Integer.parseInt(now.substring(8, 10));
int m = Integer.parseInt(now.substring(10, 12));
if (!timeLabel.getText().toString().equals("")) {
String[] time = timeLabel.getText().toString().split(":");
h = Integer.parseInt(time[0]);
m = Integer.parseInt(time[1]);
}

// 時刻ダイアログ
TimePickerDialog timeDialog = new TimePickerDialog(activity, ⑥
new OnTimeSetListener() {@Override
public void onTimeSet(TimePicker view, int hourOfDay, ⑦
int minute) {
timeLabel.setText(String.format("%02d:%02d",
hourOfDay, minute));
}
}, h, m, true);
timeDialog.setButton(DialogInterface.BUTTON_NEGATIVE, "cancel", ⑧
new DialogInterface.OnClickListener() {@Override
public void onClick(DialogInterface dialog, int which) {
timeLabel.setText("");
}
});
timeDialog.show();
}
};

public static String now() {
Date date1 = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
return sdf.format(date1);
}
}

①日付、時刻入力のダイアログを表示するClickイベントを設定します。
②日付のダイアログはDataPickerDialogを使用します。第一引数にActivity、第二引数に
  設定ボタンクリック時のイベント、第三~五引数には表示する年月日を指定します。
③onDateSetメソッドで設定値を受け取ります
④ボタンを追加する場合は、setButtonメソッドを使用します。
⑥時刻を表示するダイアログは、TimePickerDialogを使用します。
  引数はActivity、設定クリック時のイベントリスナー、表示する時刻です。
⑦設定クリック時に呼ばれるメソッドです。
⑧setButtonでボタンの追加が可能です。

テーマ : android
ジャンル : コンピュータ

Android プログレスバーのダイアログ

プログレスバーのダイアログ
処理の進捗状況をプログレスバーで表示します。











○main.xml
ダイアログを表示するButtonを配置します。

<?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">
<Button android:text="Button" android:id="@+id/button1" android:layout_width="wrap_content"
android:layout_height="wrap_content"></Button>
</LinearLayout>



○Activity
プログレスバーの進捗はHandlerを利用します。

package progress.test;

import android.app.Activity;
import android.app.ProgressDialog;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;

public class ProgressDialogTest extends Activity {
int index = 0;
Handler hand = null;

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

final ProgressDialog progress = new ProgressDialog(this);

findViewById(R.id.button1).setOnClickListener(
new View.OnClickListener() {@Override
public void onClick(View v) {
index = 0;
// プログレスバーの表示
progress.setTitle("Progress Dialog");
progress.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);①

progress.setMax(100);②
progress.show();
progress.setProgress(index);③

// Handler処理
hand = new Handler(new Handler.Callback() {④@Override
public boolean handleMessage(Message msg) {
if (index >= 100) {
progress.dismiss();
} else {
index++;
progress.incrementProgressBy(1);⑤
hand.sendEmptyMessageDelayed(0, 100);⑥
}
return false;
}
});
hand.sendEmptyMessageDelayed(0, 100);
}
});
}
}


①バーを表示するため、ProgressDialog.setProgressStyleにSTYLE_HORIZONTALを設定
②setMax()で最大値の設定
③setProgress(int)で初期値の設定
④Handlerを使用し、定期的に進捗をカウントアップします。
⑤incrementProgressBy(int)でint分カウントアップ
⑥100ミリ秒後に再度HandlerをCallします。

テーマ : android
ジャンル : コンピュータ

Android SurfaceViewを使ってグラフィック処理

グラフィック機能を活用したアプリケーション

・グラフィック機能を利用するには、描画処理を別スレッドで処理できるSurfaceViewを利用します。
【関連項目】
・SurfaceView
 →別スレッドを描画処理専用として割り当てることが可能となる。
・SurfaceHolder
 →SurfaceViewへアクセスするためのインターフェース。
 →SurfaceViewのgetHolderメソッドでSurfaceHolderを取得することが可能。
 →SurfaceHolder.Callbackインタフェースは、SurfaceViewが生成されたとき、変更されたとき、破棄されたとき
  の3つのイベントをハンドルすることが可能

■SurfaceViewを使ってグラフィック処理を行う  
・自身と敵のグラフィックオブジェクトを描画し、画面上で動作させる。
 敵オブジェクトはランダムに計算した値によって、自動で移動させるが
 自機オブジェクトは画面イベントでのonTouchEventにより座標を取得、タッチした場所へ移動させる。
 自機と敵オブジェが接触した場合にアクションを起こす。
 簡単なアクションゲームを作成する。


○SurfaceCircleViewクラス

package com.example.game;

import android.content.Context;
import android.util.Log;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

public class SurfaceCircleView extends SurfaceView {①
/** コールバッククラス */
private CircleSurfaceHolderCallback cshc = null; // このクラスはコールバックをインタフェースしている

/**
* コンストラクタ

* @param context
*/
public SurfaceCircleView(Context context) {
super(context);

// SurfaceHolderを取得
SurfaceHolder holder = getHolder();②

// コールバッククラスを生成しSurfaceHolderに追加する
this.cshc = new CircleSurfaceHolderCallback();③
holder.addCallback(this.cshc);④
}

/**
* タッチイベントメソッド

* @see android.view.View#onTouchEvent(android.view.MotionEvent)
*/@Override
public boolean onTouchEvent(MotionEvent event) {⑤
// タッチされた座標を取得
float y = event.getY();
float x = event.getX();

// コールバッククラスにタッチ座標を渡す
this.cshc.setKeyX(x);
    // タッチイベントでの座標をコールバッククラスへ設定する(CircleSurfaceholderCallback)
this.cshc.setKeyY(y);

// ログ出力
Log.d( " SurfaceCircleView ", " x: " + event.getX() + " y: " + event.getY());
return true;
}
}

①SurfaceViewを実装します。ActivityクラスではこのクラスをsetContentViewします
②自身(SurfaceView)の生成、変更、破棄時のコールバック処理を行うためのSurfaceHolderを取得する。
③コールバック処理を実装したクラス(CircleSurfaceHolderCallback)を生成する
④自身(SurfaceView)のaddCallbackでコールバックを実装したクラスを実装する
⑤タッチイベントにより、座標を取得、コールバッククラスへ値を設定する。


○SurfaceCircleViewクラス

package com.example.game;

import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.SurfaceHolder;

//コールバックとスレッドをインタフェースしている
public class CircleSurfaceHolderCallback implements SurfaceHolder.Callback,
Runnable {

/** サーフェースホルダ */
private SurfaceHolder holder = null;

/** スレッド */
private Thread thread = null;

/** スレッド実行フラグ */
private boolean threadRun = true;

/** 敵オブジェクト */
private Circle enemyCircle = null;①

/** 自機オブジェクト */
private Circle myCircle = null;

/**
* コンストラクタ
*/
public CircleSurfaceHolderCallback() {
this.enemyCircle = new Circle(0, 0, 20, Color.RED); // 敵オブジェ作成 ②
this.myCircle = new Circle(0, 0, 20, Color.WHITE); // マイオブジェ作成
}

/** 画面タッチY座標 */
private float keyY = 0;

/** 画面タッチX座標 */
private float keyX = 0;

/** 画面高さ */
private int height;

/** 画面横幅 */
private int width;

/**
* @param keyY ③
*/
public void setKeyY(float keyY) {
synchronized(this.holder) { // setメソッドは別スレッドから呼ばれるため同期させる
this.keyY = keyY;
}
}

/**
* @param keyX
*/
public void setKeyX(float keyX) {
synchronized(this.holder) { // setメソッドは別スレッドから呼ばれるため同期させる
this.keyX = keyX;
}
}

/**
* サーフェース生成時

* @see android.view.SurfaceHolder.Callback#surfaceCreated(android.view.SurfaceHolder)
*/
public void surfaceCreated(SurfaceHolder holder) {④
this.holder = holder; // インスタンスを自身に格納
this.thread = new Thread(this); // 描画用スレッドを新しく生成
this.thread.start(); // スレッドを実行する(Runnable)
}

/**
* サーフェース変更時 ⑤

* @see android.view.SurfaceHolder.Callback#surfaceChanged(android.view.SurfaceHolder,
*      int, int, int)
*/
public void surfaceChanged(SurfaceHolder holder, int format, int width, // 端末を傾けたときの画面切り替わりの処理
int height) {
synchronized(this.holder) { // 同期処理にして、敵オブジェ、マイオブジェの位置を再設定する
this.width = width;
this.height = height;

this.enemyCircle.setCx(width * 1 / 2);
this.enemyCircle.setCy(height / 4);
this.myCircle.setCx(width / 2);
this.myCircle.setCy(height * 3 / 4);
this.keyX = width / 2;
this.keyY = height * 3 / 4;
}
}

/**
* サーフェース破棄時

* @see android.view.SurfaceHolder.Callback#surfaceDestroyed(android.view.SurfaceHolder)
*/
public void surfaceDestroyed(SurfaceHolder holder) {⑥
boolean retry = true;

synchronized(this.holder) { // 同期処理
this.threadRun = false; // メンバ変数 終了フラグを立てる
}

while (retry) {
try {
this.thread.join(); // 別スレッドが終了するまで待つ
retry = false;
} catch (InterruptedException e) {}
}

this.thread = null; // スレッド終了
}

/**
* スレッド処理
*/
public void run() {⑦
// レベル
int level = 1;
// 最大レベル
int levelMax = 1;
// レベルアップまでのカウント
long count = 0;
// 自機の情報
float myX;
float myY;
float myR;
// 敵の情報
float eneX;
float eneY;
float eneR;
// 画面の幅
int width;

// ペイントオブジェクト
Paint paintEne = new Paint(); // 敵paint
Paint paintMy = new Paint(); // マイpaint
Paint paintLevel = new Paint(); // レベル表示領域

// 描画色の設定
paintEne.setColor(this.enemyCircle.getColor()); // 敵オブジェのColor設定
paintMy.setColor(this.myCircle.getColor()); // マイオブジェのColor設定
paintLevel.setColor(Color.WHITE);

// 初期の敵移動量設定
this.enemyCircle.setMoveX(-1 - (int) Math.ceil(Math.random() * (this.enemyCircle.getMoveXMax() / 2))); // 敵オブジェの移動量をランダム生成
this.enemyCircle.setMoveY(1 + (int) Math.ceil(Math.random() * (this.enemyCircle.getMoveYMax() / 2)));

// メインループ
while (this.threadRun) { // メンバbool スレッド制御フラグ参照
// 敵移動
moveEnemy(this.enemyCircle);⑧
// 自機移動
moveMyShip(this.myCircle);

synchronized(this.holder) { // スレッドの同期
// 自機の座標取得
myX = this.myCircle.getCx();
myY = this.myCircle.getCy();
myR = this.myCircle.getRadius();
// 敵の座標取得
eneX = this.enemyCircle.getCx();
eneY = this.enemyCircle.getCy();
eneR = this.enemyCircle.getRadius();

// 画面幅取得
width = this.width;
// レベルに応じた最大移動量設定
this.enemyCircle.setMoveXMax(level / 2 + 5);
this.enemyCircle.setMoveYMax(level / 2 + 5);

}

// Canvas取得
Canvas canvas = this.holder.lockCanvas(); // スレッドのキャンパス取得 ⑨

// 背景色の設定
canvas.drawColor(Color.BLACK); // 背景を設定

// 敵の描画
canvas.drawCircle(eneX, eneY, eneR, paintEne); // 敵paintを設定

// 自機の描画
canvas.drawCircle(myX, myY, myR, paintMy); // マイpaintを設定

// レベル表示
canvas.drawText("Level:" + level, 2, 12, paintLevel);
canvas.drawText("MaxLevel:" + levelMax, width / 2, 12, paintLevel);

// Canvasアンロック
this.holder.unlockCanvasAndPost(canvas); // キャンバスの開放・出力 ⑩

// 衝突判定
if (collisionJudgment(this.enemyCircle, this.myCircle)) {
count = 0;
level = 1;
try {
Thread.sleep(500); // 衝突時に0.5秒まつ
} catch (InterruptedException e) {}
}

// レベルアップ判定
count++;
if (count > 100) {
count = 0;
level++;
if (level > levelMax) {
levelMax = level;
}
}

// ウェイト
try {
Thread.sleep(10); // 再描画のウェイト
} catch (InterruptedException e) {}
}
}

/**
* 敵移動処理 自動移動処理

* @param canvas

* @param circle
*/
private void moveEnemy(Circle circle) {
synchronized(this.holder) {
// 新しい座標を計算
float cx = circle.getCx();
float cy = circle.getCy();

// 移動
circle.setCx(cx - circle.getMoveX()); // 移動は設定している移動量となる
circle.setCy(cy - circle.getMoveY());

float rad = circle.getRadius() / (float) 1.1;

// 壁衝突処理(x座標 左側)
if (circle.getCx() < rad) {
circle.setMoveX(-1 - (int) Math.ceil(Math.random() * (circle.getMoveXMax() / 2)));
}

// 壁衝突処理(x座標 右側)
if (circle.getCx() > this.width - rad) {
circle.setMoveX(1 + (int) Math.ceil(Math.random() * (circle.getMoveXMax() / 2)));
}

// 壁衝突処理(y座標 上側)
if (circle.getCy() < rad) {
circle.setMoveY(-1 - (int) Math.ceil(Math.random() * (circle.getMoveYMax() / 2)));
}

// 壁衝突処理(y座標 下側)
if (circle.getCy() > this.height - rad) {
circle.setMoveY(1 + (int) Math.ceil(Math.random() * (circle.getMoveYMax() / 2)));
}
}
}

/**
* 自機移動処理

* @param canvas

* @param circle
*/
private void moveMyShip(Circle circle) {
synchronized(this.holder) {
// 新しい座標を計算
float cx = circle.getCx();
float cy = circle.getCy();
circle.setCx(cx - (cx - this.keyX) / 30); // 移動は上記setメソッドで設定された移動量となる
circle.setCy(cy - (cy - this.keyY) / 30);

// 画面境界移動制限
float rad = circle.getRadius() / (float) 1.1;
if (circle.getCx() < rad) {
circle.setCx(rad);
}
if (circle.getCx() > this.width - rad) {
circle.setCx(this.width - rad);
}

if (circle.getCy() < rad) {
circle.setCy(rad);
}
if (circle.getCy() > this.height - rad) {
circle.setCy(this.height - rad);
}
}
}

/**
* 衝突判定

* @param enemy
* @param my
* @return
*/
private boolean collisionJudgment(Circle enemy, Circle my) {
float myX;
float myY;
float eneX;
float eneY;
float eneR;
float eneMinX;
float eneMaxX;
float eneMinY;
float eneMaxY;

synchronized(this.holder) {
// 敵の座標取得
eneX = enemy.getCx();
eneY = enemy.getCy();
eneR = enemy.getRadius();

// 自機の座標取得
myX = my.getCx();
myY = my.getCy();
}

// 敵の当たり判定範囲
eneMinX = eneX - (eneR * 3 / 4);
eneMaxX = eneX + (eneR * 3 / 4);
eneMinY = eneY - (eneR * 3 / 4);
eneMaxY = eneY + (eneR * 3 / 4);

// 衝突判定
if ((myX >= eneMinX && myX <= eneMaxX) && (myY >= eneMinY && myY <= eneMaxY)) {
return true;
}

return false;
}
}


①Circleオブジェクトを宣言
②2つのCircleオブジェクトを生成。
③onTouchEventから呼び出され、座標を設定する
④SurfaceHolder生成時にCall。描画用スレッドを実行する
⑤画面を傾けたるなどでCall。オブジェクトの現在位置を計算し、再配置を行う。
⑥SurfaceHolder破棄時にCall。後始末を行う。
⑦スレッド処理
⑧敵移動はランダム計算。自機移動はonTouchEventにて設定された座標を下に計算
⑨holder.lockCanvas()でCanvasオブジェクトを取得
 .drawCircleにて円形を描画する。
⑩unlockCanvasAndPost()メソッドにて実際に画面へ描画する


○SurfaceActivityアクティビティクラス

package com.example.game;

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

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


①setContentViewに、SurfaceViewを実装しているSurfaceCircleViewクラスを設定する。


○Circleクラス
描画するグラフィックオブジェクトの半径、座標などの設定値を保持するクラス

package com.example.game;

public class Circle {
/** x座標 */
private float cx = 0;

/** y座標 */
private float cy = 0;

/** 円の半径 */
private float radius = 50;

/** 色 */
private int color = 0;

/** x方向移動量 */
private int moveX = 0;

/** y方向移動量 */
private int moveY = 0;

/** x方向最大移動量 */
private int moveXMax = 0;

/** y方向最大移動量 */
private int moveYMax = 0;

/**
* コンストラクタ

* @param cx
*            x座標
* @param cy
*            y座標
* @param radius
*            円の半径
* @param color
*            色
*/
public Circle(float cx, float cy, float radius, int color) {
this.cx = cx;
this.cy = cy;
this.radius = radius;
this.color = color;
}

/**
* x座標を取得する

* @return cx
*/
public float getCx() {
return cx;
}

/**
* x座標を設定する

* @param cx
*            セットする cx
*/
public void setCx(float cx) {
this.cx = cx;
}

/**
* y座標を取得する

* @return cy
*/
public float getCy() {
return cy;
}

/**
* y座標を設定する

* @param cy
*            セットする cy
*/
public void setCy(float cy) {
this.cy = cy;
}

/**
* 半径を取得する

* @return radius
*/
public float getRadius() {
return radius;
}

/**
* 半径を設定する

* @param radius
*            セットする radius
*/
public void setRadius(float radius) {
this.radius = radius;
}

/**
* 色を取得する

* @return color
*/
public int getColor() {
return color;
}

/**
* 色を設定する

* @param color
*            セットする color
*/
public void setColor(int color) {
this.color = color;
}

/**
* @return moveXMax
*/
public int getMoveXMax() {
return moveXMax;
}

/**
* @param moveXMax
*            セットする moveXMax
*/
public void setMoveXMax(int moveXMax) {
this.moveXMax = moveXMax;
}

/**
* @return moveYMax
*/
public int getMoveYMax() {
return moveYMax;
}

/**
* @param moveYMax
*            セットする moveYMax
*/
public void setMoveYMax(int moveYMax) {
this.moveYMax = moveYMax;
}

/**
* @return moveX
*/
public int getMoveX() {
return moveX;
}

/**
* @param moveX
*            セットする moveX
*/
public void setMoveX(int moveX) {
this.moveX = moveX;
}

/**
* @return moveY
*/
public int getMoveY() {
return moveY;
}

/**
* @param moveY
*            セットする moveY
*/
public void setMoveY(int moveY) {
this.moveY = moveY;
}
}



■稼動イメージ




・常に赤い○が移動している。別スレッドにて処理している。
・画面のパネルタッチイベントにて座標を取得。その位置へ白い玉を移動させる。

テーマ : android
ジャンル : コンピュータ

Android Colorを16進数で指定する方法

Androidでは、Javaコード中にColorを指定する場合
Color.argb(alh, R, G, B);
を利用して色を指定するのだが、これが面倒くさい。

第一引数は透明度をあらわし、残り3つの引数は色の度合いをあらわす。

つまり、赤にしたい時は
Color.argb(255, 255, 0, 0)

青の場合は
Color.argb(255, 0, 0, 255)

ちょっと薄い青なら
Color.argb(200, 0, 0, 255)

とか、いちいち色を表すための、対応する数字が必要になる。
そんな数字覚えていられんわ。


ということで、簡単に色を指定できるオリジナルメソッドを作成した。


まず、Webサービスを中心に今までやってきていたため、色を指定する場合はCSSなどよく利用しているため、
#FFFFFF
#000000
などの16進での指定になれている。


また、使いたい色を調べるために以下のサイトを参考にさせてもらっている。
http://www.cam.hi-ho.ne.jp/mendoxi/misc/colorchart.html


ということなので、色を16進で指定して、それをAndroidのColorに変換するメソッドを作った。


public static int Color(int alh, String color) {
try {
int R = Hex2ToInt(color.substring(0, 2));
int G = Hex2ToInt(color.substring(2, 4));
int B = Hex2ToInt(color.substring(4, 6));
return Color.argb(alh, R, G, B);
} catch (Exception ex) {
return 0;
}
}
public static int Hex2ToInt(String HEX) {
int Value = 0;
char HexDigit[] = HEX.toCharArray();
Value = (Character.digit(HexDigit[0], 16)) * 16 + (Character.digit(HexDigit[1], 16));
return Value;
}


ColorメソッドをCallして使用する。
第一引数に透明度をintで255までの数字で指定する。
第二引数に指定する色を16進で指定する(#はつけない)

Hex2ToIntは2桁の16進を変換しているメソッド


利用方法は以下のように使う
テキストを赤字にする

((TextView)v.findViewById(R.id.txt)).setTextColor(Color(255, "FF0000"));



これで自分の慣れ親しんだ16進で色を指定することができる。

テーマ : android
ジャンル : コンピュータ

熱帯魚 RRE.A キングコブラハイドーサルの稚魚(1週間後)

20121118_1932422.jpg

RRE.Aキングコブラハイドーサルの稚魚が産まれて1週間経つ。

毎日観察しているが、星になっている稚魚は見られない。
たぶん、数は全然減っていないと思われる。

稚魚用水槽は親水槽の水をそのまま使っている。交換は3週間後から始めようと思っているため、まだ一度も水の交換はしていない。

仕事の関係上、餌は一日二回。朝と夜だ。
夜は毎回ブラインシュリンプをあげている。

一度にあげるブラインはサジ3杯分。
画像を良く見ると、画面全体にツブツブが薄くたくさん写っているが、それは全てブラインシュリンプ。

それでも翌昼くらいにはなくなっているので、稚魚の食欲というのはすごいものだ。

朝は、フレークタイプの餌と粒状の餌をブレンドして粉々にした餌をあげている。

ブラインシュリンプを二回上げるほど、沸かすことも出来ないし、栄養が偏らないようにするという理由もある。


ということを1週間続けてきた。

稚魚は目に見えて成長しており、体調は1cmを超えてきている。

このまま順調に育ってもらいたいものだ。

テーマ : 熱帯魚
ジャンル : ペット

熱帯魚の配送方法について

先日、初めてYahooオークションで熱帯魚を出品した。
また、初めて「生き物」を宅急便で送ったため、いろいろ失敗した点をメモする。

■熱帯魚を入れる袋
まず、熱帯魚を送るための「袋」について
熱帯魚屋で扱っている袋があればベストなのだが、実際にどこに売っているのかわからない。
ホームセンターなどにいけば、様々な種類のビニール袋があると思うが、ちょうどショッピングモールでいろんな種類のビニール袋があった。
なるべく厚手で、先端をグルグルまわして輪ゴムで縛ることを考えで、大きめのビニール袋を購入した。




気をつけなければなれないことは、なるべく大きめ(長め)の袋にすること。
水を入れるのはもちろんのこと、最後に口を縛ることを考えると、最低縦は40cmは必要だと思う。

さらにあると便利なのがジップロック

大サイズなら熱帯魚を輸送するには十分の大きさだ。
水を入れてひっくり返してみたが、水が漏れることもなかった。

私は今回、ジップロックに熱帯魚を入れ、さらにビニール袋を二重にして梱包した。


■配送時のサイズについて
オークションで、配送は60サイズで送る予定だったが、これが失敗だった。
60サイズって以外と小さく、熱帯魚を送るには厳しい。

クロネコヤマトで調べたのだが、60サイズはさらに2kgまでの制限もある。

最低80サイズは必ず必要だと感じた。

なんとか段ボールを加工して、縦横幅60サイズに収まるようにして、水を含め2kgに押さえた。

それでもギリギリ。余裕を持つなら80サイズ必要だけど、金額があがるのが痛い。

■その他必要なもの
よく聞くのが「酸素が出る石」というもの。

これを入れとくと、酸欠になる心配無し。

冬に必要なものはホッカイロ

箱に一つ張っとくだけで水温の下降を押さえることができる。

逆に夏に必要なのが保冷剤

水温の上昇を押さえるためには必須。


■次回気をつけること

今回オークションで出品した際に、金額と送料のみ頂くことにしていたが、いざ発送準備をすると「厚手の袋」「酸素の出る石」等、いろいろ必要なものが出てきた。

よくオークションで見る「梱包料〜円」とあるが、梱包料を頂かないと、以外と痛い目にあうかもしれない。
熱帯魚を送るときには「梱包料300円」くらいは、頂いた方がいいと思う。

それと送料。
60サイズが以外と小さいということなので、80サイズで金額を頂くようにした方がいい。

テーマ : 熱帯魚
ジャンル : ペット

Java 可変長引数の定義方法

Javaで、メソッドに渡す引数を可変長にする方法


定義

public void hoge(String[] hairetu){
}


Call

hoge(new String[]{"あ", "い", "う"});

引数を配列で宣言し、Call側は引数を渡すときに配列化して渡す


■もう一つの方法

定義

public void hoge(String... hairetu){
}


Call

hoge("あ", "い", "う");

引数を配列ではなく「...」で宣言する。
Call側での指定の仕方はすごく簡素になる。

Call側では配列を使用しなくても、メソッド側に配列として渡すことができる。


hoge();

ちなみにこれは配列0でのCallのやり方

熱帯魚 ミニブッシープレコの稚魚

20121115_202057.jpg


昨日、いつものように熱帯魚に餌をあげていたら、ミニブッシープレコの水槽に見たことの無いおたまじゃくしみたいなのがいた。

なんと、ミニブッシープレコの稚魚だった(・∀・)

大宮のアクアライズで安いときにコツコツと購入していたため、大人のミニブッシープレコは6匹ほど飼っていたのだが、まさか稚魚が産まれているなんて思ってもいなかった。

とてもうれしい(´∀`)

飼育しだして半年以上たっており、半ばプレコの繁殖にはあきらめていたのだが。

見た感じ5匹はいた。


いきなりの稚魚登場ということで、驚きと喜びが一気に来てしまった。
さて、プレコの餌は何がいいのかな??

調べてみたら、大人と同じ餌でいいらしい。
細かくしてあげるとより良いらしい。

うちであげているプレコの餌はこれ




そこに沈むタイプでプレコがよく集まってきている。

時間がたつと、餌が崩れだすため稚魚も食べやすいだろう。


いや~やっぱり稚魚や稚エビが産まれるのはうれしいな~

次はぜひキンペコちゃんに頑張ってもらいたい( ´ ▽ ` )ノ

テーマ : 熱帯魚
ジャンル : ペット

カレーパン ミニストップのカレーパン

私がよく食べるのがミニストップのカレーパン
20121116_064145.jpg


なぜ良く食べるのかというと、すぐ目の前にあるコンビニがミニストップだから。

パンは良くある揚げパン形式。
温めるとやはりすこり油っぽい。
もう少し、さっぱりしてくれるとうれしいところだ。

味はほんのちょっぴり辛い感じがする。

具は見た目以上にしっかりしていて食べ応えがある。

ま~美味しいからちょくちょく買ってるんだがね。


満足度:★★★★☆

値段と味を考えると自分は満足。

テーマ : パン
ジャンル : グルメ

FC2 ソースコードのハイライトとHTMLエスケープとソースコードの整形

FC2のブログ上にソースコードを載せる方法と、ソースコードの整形、エスケープ等のやり方をメモ。

■ソースコードのハイライトについて

よく見かけるのが「SyntaxHighlighter」について
しかし、私にはこれがどうにも上手く設定できなかった。
ということで「google-code-prettify」を使っている。

このようにソースコードがハイライト化される。

public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello World");
}
}

普通にソースコードを乗せるより、だいぶ見やすい。


■google-code-prettifyのダウンロード
http://code.google.com/p/google-code-prettify/downloads/list
上記サイトから「prettify-small-1-Jun-2011.tar.bz2」をダウンロードする。
※ファイル名は変更されている可能性あり。

解凍するとフォルダに以下の二つのファイルがある。
・prettify.css
・prettify.js
この二つのファイルを使用する。

■テンプレートファイルの編集

ダウンロードしたjs、cssファイルをテンプレートに追記する。
まずはjs、cssファイルのアップロードを行う。

ネット上からファイルが見えれば、どこにアップロードしても問題ない。
とりあえず、FC2の「ファイル管理」を利用する。
※管理画面上は左側「ファイルアップロード」、「新しく記事を書く」画面では「ファイル挿入」が該当する

js,cssの二つのファイルをアップロードするとリンクが確認できると思われるので、そのリンクを覚える。


次にテンプレートの編集

管理画面左側の「テンプレートの設定」からテンプレート一覧を表示
現在使用しているテンプレートの「編集」を実行
<HEAD>と</Head>の間にアップしたjs,cssのファイルを記述する

例)

<link href="<URL>/prettify.css" type="text/css" rel="stylesheet">
<script type="text/javascript" src="<URL>/prettify.js"></script>


bodyにonloadを追記する

<body onload="prettyPrint()">


テンプレートの編集は以上

■使用方法


<pre class="prettyprint">
ソースコード
</pre>


ちなみに対応するプログラムは記述しなくてもいいらしい、
ロジック側で勝手に判断するみたい。
※対応プログラム
 CやHTMLなどいろいろあるみたい


■Web上でのソースコードのエスケープ方法

貼り付けるコードの「<」や「>」はそのままでは表示されないのはみんな知っていると思う。
表示させるには、各コードをエスケープ変換させればよい


そこで、ソースコード全てをエスケープ変換してくれるサイト
http://webtools.dounokouno.com/htmlescape/index.html

表示するソースを全て貼り付けて変換するだけ
Web上で出来るというのも便利


■Web上でのソースコードの整形方法

ソースコードがきちんと整形されていれば見やすいが、そうでない場合もある。
そこで、Web上でソースコードを整形してくれるWebサイトを見つけた
http://jsbeautifier.org/

中央の窓にソースコードを貼り付けて、上のでっかいボタンをクリックすると整形してくれる。
ただし、ソース自体がバグっていると整形できないっぽい。
※括弧が足りないなど

なんかJavaScriptとHTMLのみが対象っぽいけど、Javaのソースでもきれいにしてくれた。


以上、3つをメモ。
これで、ブログにソースコードを記載するときに綺麗にできそうだ。

テーマ : HP作成
ジャンル : コンピュータ

Android テキストの音声読み上げ(TextToSpeech)

テキストの音声読み上げ(TextToSpeech)

・TextToSpeechは音声でテキストを読み上げる機能で、Android1.6から搭載されています。
 今回は、音声の速度、ピッチの変更を可能とします。
○TextToSpeechクラス


package text.speech;
import java.util.Locale;
import android.app.Activity;
import android.os.Bundle;
import android.speech.tts.TextToSpeech.OnInitListener;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
public class TextToSpeech extends Activity implements
android.view.View.OnClickListener, OnInitListener {
final private //遅い①
final private //普通
final private //早い
final private //低い
final private //普通
final private //高い
private Button btnSpeech;②
private Button btnSlow;
private Button btnNormal;
private Button btnFast;
private Button btnLowPitch;
private Button btnNormalPitch;
private Button btnHighPitch;
private EditText mTextEdit;
private android.speech.tts.TextToSpeech mSpeech;③
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// TextToSpeech(Context context, TextToSpeech.OnInitListener listener)
// 第一引数はContextとなるthis、第二引数はOnInitリスナー。onInitを実装しているthis
mSpeech = new android.speech.tts.TextToSpeech(this, this);④
// 入力テキストの抽出
mTextEdit = (EditText) findViewById(R.id.text_et);
// ボタンのClickListenerの登録⑤
btnSpeech = (Button) findViewById(R.id.execute_btn);
btnSpeech.setOnClickListener(this);
btnSlow = (Button) findViewById(R.id.ButtonSlow);
btnSlow.setOnClickListener(this);
btnNormal = (Button) findViewById(R.id.ButtonNormal);
btnNormal.setOnClickListener(this);
btnFast = (Button) findViewById(R.id.ButtonFast);
btnFast.setOnClickListener(this);
btnLowPitch = (Button) findViewById(R.id.ButtonLowPitch);
btnLowPitch.setOnClickListener(this);
btnNormalPitch = (Button) findViewById(R.id.ButtonNormalPitch);
btnNormalPitch.setOnClickListener(this);
btnHighPitch = (Button) findViewById(R.id.ButtonHighPitch);
btnHighPitch.setOnClickListener(this);
}
public void onDestroy() {
super.onDestroy();
mSpeech.shutdown();
}
//onClickイベントvにオブジェクトが格納される
public void onClick(View v) {⑤-1
if (btnSpeech == v) speechText();⑥
if (btnSlow == v) mSpeech.setSpeechRate(SP_SLOW); // 速度設定⑦
if (btnNormal == v) mSpeech.setSpeechRate(SP_NORMAL);
if (btnFast == v) mSpeech.setSpeechRate(SP_FAST);
if (btnLowPitch == v) mSpeech.setPitch(PH_LOW); // ピッチ設定⑧
if (btnNormalPitch == v) mSpeech.setPitch(PH_NORMAL);
if (btnHighPitch == v) mSpeech.setPitch(PH_HIGH);
}
// テキストの読み上げ
private void speechText() {
String string = mTextEdit.getText().toString();⑨
// 読み上げ開始
mSpeech.speak(string, android.speech.tts.TextToSpeech.QUEUE_FLUSH, null);⑩
}
// statusは成功の場合:TextToSpeech.SUCCESSが、失敗の場合:TextToSpeech.ERRORが渡されます。
public void onInit(int status) {
Log.d( & quot; TextToSpeech & quot;, & quot; onInit & quot;);
if (status == android.speech.tts.TextToSpeech.SUCCESS) {
mSpeech.setLanguage(Locale.ENGLISH);⑪
}
}
}



①音声速度、ピッチの値を宣言します。この値で速度、ピッチを制御します。
②各Button用の変数を宣言
③TextToSpeechの変数
④TextToSpeechを生成します。第一引数はContextとなるthis、第二引数はonInitリスナーを実装しているthisとなる
⑤全てのButtonへonClickを実装しているthisをOnClickリスナーとして設定
  OnClick先で押下ボタンを判断し、制御する。
⑤-1 onClickの引数Viewに、押下したボタンが格納される
⑥btnSpeechボタン押下時に、テキスト読み込みメソッドを実行する。
⑦setSpeechRateメソッドで音声速度を設定します
⑧setPitchメソッドで音声のピッチを設定します
⑨Editから入力した文字列を抽出する
⑩speakメソッドでテキストの読みあげを開始する。
  第一引数は読み上げるテキストを設定、第二引数はキューを設定。
  キューは以下の通りです。
  →TextToSpeech.QUEUE_ADD:再生キューへエントリを追加
  →TextToSpeech.QUEUE_FLUSH:再生待ちのエントリをドロップしてエントリを実行
  第三引数には、実行後に呼び出されるメソッドの引数に渡す値を設定(HashMap形式)。不要の場合はNull
⑪onInitメソッドは初期処理時に実行されます。setLanguageでロケールを設定します。




テーマ : android
ジャンル : コンピュータ

カレーパン 川越達也のマイルド焼きカレーパン

20121115_063724.jpg

今日は、先日食べたスパイシーカレーパンじゃない方、「マイルド焼きカレーパン」を食べてみた。

まず、普通カレーパンは揚げパンが主流だと思うが、このパンは普通のパンだ。
で、このパンがま~合わない。
パン自体がグニョグニョしてて、食べにくい。パンを温めたことでパンが余計食べにくくなった。

カレー自体は「マイルド」だと思うが「焼き」がどこなのかわからない。
焼きカレーなのか?

食べた感想は素直に「美味しくない」
パンとカレーがミスマッチ過ぎる。

スパイシーカレーパンが美味しかったのに、なんでこっちはこーなったんだろ。

満足度:★☆☆☆☆
再購入することはないだろう。

テーマ : パン
ジャンル : グルメ

カレーパン 川越達也のスパイシーカレーパン

私は無類のカレーパン好きだ

20121114_065513.jpg

今日は近所で売っていた新しいパン
川越達也のスパイシーカレーパン 125円

袋に「からみに気をつけて」と書いているとおり、普通のカレーパンには無い辛味があった。
でも、ほんのピリっとするだけで、全然辛くない

中のカレーは旨みがあっておいしい。

関心したのが、普通のカレーパンと比べて、全然脂っこくないこと。


美味しくて食べやすくてピリっと辛味があってすばらしい。
ぜひ、また購入したい


満足度:★★★★★
私の中でコンビニで購入できるカレーパンのTOPである。
安い旨い、また買いたい。

次は、もう一つのマイルドなんたらっていうカレーパンにしよう。

テーマ : パン
ジャンル : グルメ

MCAセキュリティの勉強・試験

20121109_185329.jpg

最後になるMCAセキュリティを受験してきた。
結果は画像の通り。

MCA4つの中で一番難しいといわれているセキュリティ。
難しいといわれているが、別に難しいことは何一つなかった。
たぶん、セキュリティを普段あまり意識していないからであり、参考書を読めば理解できないものはなかった。

では、なぜ試験は不合格だったのか。
それは「最新のセキュリティ技術について勉強していなかった」ためである。

■試験について
やはり、セキュリティ関連で良く見る問題もよく出ていた。
・共通、公開鍵暗号について
・ユーザの証明、メッセージダイジェスト・・・
・SSL、CA
などなど

他にメインとなっているのが、やはりMicrosoftのセキュリティについて
一般的には「Windows Update」「自動更新」機能など

そして、不合格だった原因の「Windows 7」のセキュリティについての問題。

■Windowsのセキュリティについて
過去受けた3つの試験について、数件あったがそこまで最新の情報についての問題はなかった。
主にその基盤となる技術、知識についての問題が多かったため、古い参考書でもなんとか合格できたのだと思う。

しかし、セキュリティについてはそうではなかった。
とにかくWindows7のセキュリティについての設問が多かった。

世界的にウィルスの脅威に対する対策は、日進月歩、秒進分歩というくらい進歩しているし、しなければいけないものだ。たった一つのウィルスが会社に大きなダメージを与える。個人情報流出など。

そのため、MCAセキュリティではWindowsの最新のウィルス対策についての問題が多いのだと思う。


セキュリティについては、常に最新の情報を持っているべきだとつくづく思った。
2003年度の参考書は、そりゃ情報が古すぎるか。



参考書にも記載されている通り、「Windows7」対応と明記してある。
たぶん、そろそろWindows8対応とかになって、この参考書もあまり役に立たなくなるのかもしれない。

JavaScript 切捨て、切り上げ、四捨五入

Math.floor(kingaku * 1.05 ) 切捨て
Math.ceil() 切り上げ
Math.round() 四捨五入

テーマ : Webサービス
ジャンル : コンピュータ

JavaScript 全角・半角チェック

value全てが全角の場合はtrue
全角以外を含んでいる場合はfalse


/**
* 全角であるかをチェック
*
* @return ture : 全角 / flase : 全角以外
*/
function chkZenkaku(value) {
for (var i = 0; i < value.length; ++i) {
var c = value.charCodeAt(i);
// 半角カタカナは不許可
if (c < 256 || (c >= 0xff61 && c <= 0xff9f)) {
//全角以外を含んでる
return false;
}
}
//全て全角
return true;
}

テーマ : Webサービス
ジャンル : コンピュータ

JavaScript メールアドレスのチェック

JavaScriptでメールアドレスをチェックする方法


mail = document.getElementById("email").value;
if(mail.match(/^[0-9,A-Z,a-z][0-9,a-z,A-Z,_,\.,-]+@[0-9,A-Z,a-z][0-9,a-z,A-Z,_,\.,-]+\.$/i)){
alert("正しいかも");
}else{
alert("違うかも");
}

テーマ : Webサービス
ジャンル : コンピュータ

JavaScript Trim(空白除去)について

JavaScriptでTrim(空白除去)を行うには

target = target.replace(/(^\s+)|(\s+$)/g, "");

テーマ : Webサービス
ジャンル : コンピュータ

おすすめアプリ
カテゴリ
最新記事
リンク
アクセスカウンター
アクセス解析
imobile
i-mobile
i-mobile
i-mobile
i-mobile
i-mobile
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR
Amazon
Androidお勧め参考書
EC studio
商品
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。