tag:blogger.com,1999:blog-38981918465461476592024-03-19T20:24:49.426+09:00Dev. GrAFR開発メモを中心に ..ゆちゃんhttp://www.blogger.com/profile/12754048020092995283noreply@blogger.comBlogger45125tag:blogger.com,1999:blog-3898191846546147659.post-74980112259436844162012-12-13T14:40:00.003+09:002012-12-13T14:40:22.195+09:00Ruby on Rails 解説ブログRuby in Rails 関連のブログも切ったので、そちらのほうも、是非宜しくお願いいたします。<div>
<br /></div>
<div>
<a href="http://rails-gf.blogspot.jp/" target="_blank">Rails.GrAFR</a></div>
ゆちゃんhttp://www.blogger.com/profile/12754048020092995283noreply@blogger.com0tag:blogger.com,1999:blog-3898191846546147659.post-52386672657317282382012-12-02T08:32:00.002+09:002012-12-02T08:32:36.450+09:00ソースコードの行数カウントfind ./ -type f | grep 'java\|xml' | xargs wc -l<br />
<br />
こんなふうにすれば、ディレクトリを再帰で潜りながら、java と xml の行数の合計を出してくれます。<br />
(ファイル名にjava,xmlを含むもの (厳密に拡張子で絞り込んでるわけではないですが。。))<br />
<br />
メモメモゆちゃんhttp://www.blogger.com/profile/12754048020092995283noreply@blogger.com0tag:blogger.com,1999:blog-3898191846546147659.post-38507033807318115492012-11-14T02:01:00.003+09:002012-11-14T02:01:20.073+09:00MongoDB を Mac OS X 10.7 Lion にインストールちょっと触ってみたかったので、Mac にインストールしてみた。<br />
homebrewを使ってインストールします!!<br />
<br />
<div style="background: #4f4e56; color: white; padding: 5px;">
sudo brew install mongodb
</div>
<br />
これをやればインストール完了なのですが、<br />
「Cowardly refusing to `sudo brew install'」<br />
とErrorが出たので、まずこれを解決するために以下のコマンドを実行<br />
<br />
<div style="background: #4f4e56; color: white; padding: 5px;">
sudo chown -R root /usr/local
</div>
<br />
このあとにさっきのコマンドを再び実行すればインストールできます。
<br />
<br />
<Mongodbを動かす>
<br />
<div style="background: #4f4e56; color: white; padding: 5px;">
# まず /data/db/ を作成
sudo mkdir -p /data/db/<br />
sudo chown `id -u` /data/db
# mongod で実行
mongod
</div>
<br />
この状態で、
<br />
<div style="background: #4f4e56; color: white; padding: 5px;">
mongo
</div>
とやれば、接続されるはずです。ゆちゃんhttp://www.blogger.com/profile/12754048020092995283noreply@blogger.com0tag:blogger.com,1999:blog-3898191846546147659.post-87721073609811156472011-10-25T16:40:00.000+09:002011-10-25T16:40:32.950+09:00symfony2ブログ開設しました。これからは、Symfony2に関しては<a href="http://symfony2-gf.blogspot.com/">Symfony2.GrAFR</a>に書いてきます!<br />
よろしくお願い致します。ゆちゃんhttp://www.blogger.com/profile/12754048020092995283noreply@blogger.com0tag:blogger.com,1999:blog-3898191846546147659.post-68795591435252954312011-10-06T01:33:00.000+09:002011-10-06T01:33:51.196+09:00No input file specified.Symfony2をさくらインターネットで動かそう!!とか思って phpのバージョンを 5.3.8 (CGI版) にした。<br />
で、Symfony2 を動かした所、「No input file specified.」というエラーが。。。。<br />
<br />
まぁ、エラーの内容はSymfony2とは関係ないんだけれど。。<br />
<br />
これは、CGI版PHP環境でなんかのmoduleを使用する際に起こるらしい。<br />
やっぱりVPSを契約してもらうべきだったか。。。と思ったけど、普通に解決できたので問題ないっぽい!!<br />
<br />
ただ、php.iniに<br />
cgi.fix_pathinfo = 1<br />
を加えるだけでOKっぽいです。同時にタイムゾーンも指定しておきました。<br />
date.timezone = Asia/Tokyoゆちゃんhttp://www.blogger.com/profile/12754048020092995283noreply@blogger.com0tag:blogger.com,1999:blog-3898191846546147659.post-53177419533260115632011-07-21T22:50:00.002+09:002011-07-23T17:12:55.732+09:00Cent OS (5.5) に MeCab をインストール<a href="http://mecab.sourceforge.net/" target="_blank">MeCab: Yet Another Part-of-Speech and Morphological Analyzer</a><br />
<br />
MeCabで形態素解析!ってことで、CentOS (5.5) にさっそく MeCab0.98 を導入してみます。<br />
<br />
<span class="Apple-style-span" style="color: #b45f06;"><b>① まず MeCabのインストール</b></span><br />
<div style="background: #4f4e56; color: white; padding: 5px;">[root@ ~]# wget 'http://downloads.sourceforge.net/project/mecab/mecab/0.98/mecab-0.98.tar.gz?r=http%3A%2F%2Fsourceforge.net%2Fprojects%2Fmecab%2Ffiles%2F&ts=1283097111&use_mirror=jaist'<br />
[root@ ~]# tar xvfz mecab-0.98.tar.gz<br />
[root@ ~]# cd mecab-0.98<br />
[root@ ~]# ./configure<br />
[root@ ~]# make<br />
[root@ ~]# make install</div><br />
<span class="Apple-style-span" style="color: #b45f06;"><b>② IPA 辞書をダウンロード</b></span><br />
IPA 辞書, Juman 辞書 があるが、前者が推奨されていたので、それをダウンロードします。また, configureの際に文字コードを指定します(UTF-8とします)。<br />
違う文字コードでインストールしてしまった場合は、make uninstall してからやり直せばOK<br />
<div style="background: #4f4e56; color: white; padding: 5px;">[root@ ~]# wget 'http://downloads.sourceforge.net/project/mecab/mecab-ipadic/2.7.0-20070801/mecab-ipadic-2.7.0-20070801.tar.gz?r=http%3A%2F%2Fsourceforge.net%2Fprojects%2Fmecab%2Ffiles%2F&ts=1283097195&use_mirror=jaist'<br />
[root@ ~]# tar xvfz mecab-ipadic-2.7.0-20070801.tar.gz<br />
[root@ ~]# cd mecab-ipadic-2.7.0-20070801<br />
[root@ ~]# ./configure --with-charset=utf8<br />
[root@ ~]# make<br />
[root@ ~]# make install</div><br />
<br />
<b><span class="Apple-style-span" style="color: #b45f06;">※ これで終了。最後に何か文字列(</span><span class="Apple-style-span" style="color: #0b5394;">明日は明日の風が吹く</span><span class="Apple-style-span" style="color: #b45f06;">)を解析してみます。</span></b><br />
<br />
[root@ ~]# mecab<br />
明日は明日の風が吹く<br />
明日 名詞,副詞可能,*,*,*,*,明日,アシタ,アシタ<br />
は 助詞,係助詞,*,*,*,*,は,ハ,ワ<br />
明日 名詞,副詞可能,*,*,*,*,明日,アシタ,アシタ<br />
の 助詞,連体化,*,*,*,*,の,ノ,ノ<br />
風 名詞,一般,*,*,*,*,風,カゼ,カゼ<br />
が 助詞,格助詞,一般,*,*,*,が,ガ,ガ<br />
吹く 動詞,自立,*,*,五段・カ行イ音便,基本形,吹く,フク,フク<br />
EOS<br />
<br />
<br />
<b><span class="Apple-style-span" style="color: #b45f06;">※ おまけとして、PHPからアクセスするために MeCab extension をインストールします。</span></b><br />
<a href="http://d.hatena.ne.jp/yoshi-ken/20110621">http://d.hatena.ne.jp/yoshi-ken/20110621</a> の記事を参考にさせていただきました!<br />
<div style="background: #4f4e56; color: white; padding: 5px;">pear channel-discover pecl.opendogs.org<br />
pear install opendogs/mecab-beta<br />
echo "extension=mecab.so" > /etc/php.d/mecab.ini<br />
php -m | fgrep mecab #インストールに成功していたら「mecab」という行が表示されます<br />
</div><br />
<pre name="code" class="php"><?php
$target_str = "明日は明日の風が吹く";
$result = mecab_split($target_str);
print_r($result);
?>
</pre><br />
これで Array ( [0] => 明日 [1] => は [2] => 明日 [3] => の [4] => 風 [5] => が [6] => 吹く ) となります。ゆちゃんhttp://www.blogger.com/profile/12754048020092995283noreply@blogger.com0tag:blogger.com,1999:blog-3898191846546147659.post-58612492863869543912011-07-13T21:29:00.001+09:002011-07-13T21:30:31.053+09:00iPhone - json-frameworkjsonのパースをしたかったので、ちょっと調べてみたら、<span class="Apple-style-span" style="color: orange;">json-framework</span>というのがヨサゲ。<br />
ってことで導入してみました。<br />
<br />
json-frameworkは Google Code にあります。<a href="http://code.google.com/p/json-framework/">http://code.google.com/p/json-framework/</a><br />
<br />
① GitHubからダウンロード! (v3.0.1), <br />
② Classesの中身をプロジェクトにインポート!(自分は, JSONというグループを作成し、そこにインポートしました。)<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdN2UwM0BMIlwXkskPGpfmW6vGhbpLIv_o8xxiBTqIJPkP-l1xTjRnudGCOKrqjW5B1Av5CaLLEc8zoCpFn1m9V_LZ19N-ggPJM1pBI2jKxUmEG6GwL8cjoVHHS2jBU-ZHI_gdHQe_OsA/s1600/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%25EF%25BC%25882011-07-13+21.23.21%25EF%25BC%2589.png" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdN2UwM0BMIlwXkskPGpfmW6vGhbpLIv_o8xxiBTqIJPkP-l1xTjRnudGCOKrqjW5B1Av5CaLLEc8zoCpFn1m9V_LZ19N-ggPJM1pBI2jKxUmEG6GwL8cjoVHHS2jBU-ZHI_gdHQe_OsA/s320/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%25EF%25BC%25882011-07-13+21.23.21%25EF%25BC%2589.png" width="191" /></a></div><br />
③ 利用したいクラスの先頭で<br />
<pre name="code" class="c">#import "SBJson.h"
</pre>とすれば、OK。<br />
<br />
④ あとは NSString として jsonデータを与えパースすれば、配列として返ってくるっぽい<br />
NSArray jsonArray = [json_str JSONValue];<br />
<br />
<br />
ってことで json-framework についての簡単なメモでした。ゆちゃんhttp://www.blogger.com/profile/12754048020092995283noreply@blogger.com0tag:blogger.com,1999:blog-3898191846546147659.post-20402393744544315872011-07-12T08:27:00.002+09:002011-07-13T16:02:24.632+09:00iPhone - 開発入門② IBを使用しない場合Interface Builder を使用しないでアプリケーションを作成する場合は, 最初に以下の手順を行い, IBを使用しない設定に変更する。<br />
<br />
① Window-based Application でプロジェクトを作成する。(プロジェクト名はHogeとする)<br />
<br />
② Resouces 内の xibファイルである「MainWindow.xib」を削除する。<br />
<br />
③ Resouces 内の「Hoge-Info.plist」を開き, 一番下の「Main nib file base name」のプロパティを削除<br />
<br />
④ Other Sources 内の「main.m」を開き、以下の様変更を加える。(通常は, xibファイルがDelegateクラスを呼び出していたが、それを削除しため指定してやる必要がある。)<br />
<br />
< 変更前 ><br />
<pre class="c" name="code">int main(int argc, char *argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
int retVal = UIApplicationMain(argc, argv, nil, nil);
[pool release];
return retVal;
}
</pre><br />
< 変更後 ><br />
<pre class="c" name="code">int main(int argc, char *argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
int retVal = UIApplicationMain(argc, argv, nil, @"HogeAppDelegate");
[pool release];
return retVal;
}
</pre><br />
<br />
⑤ Other Sources 内 のファイルで, @property や @ synthesize を削除してしまう。<br />
<br />
_________________________________________________________<br />
<br />
これで設定は完了です。あとは, HogeAppDelegateで自分でwindowの作成をし、viewをつくっていく感じ。<br />
<br />
<pre class="c" name="code">// HogeAppDelegate.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// windowを作成
CGRect screenbounds = [[UIScreen mainScreen] bounds];
window = [[UIWindow alloc] initWithFrame:screenbounds];
/**
* ここでwindow上にaddSubviewしていけば良い
*/
[window makeKeyAndVisible];
return YES;
}
</pre>ゆちゃんhttp://www.blogger.com/profile/12754048020092995283noreply@blogger.com0tag:blogger.com,1999:blog-3898191846546147659.post-30896324787624331652011-07-12T08:01:00.000+09:002011-07-12T08:01:43.253+09:00iPhone - 開発入門① テンプレートの選択※Xcodeのインストール等の環境構築の説明は行いません。<br />
<br />
まず, Xcodeを起動して, テンプレートタイプを選ぶ。(以下の画面)<br />
<br />
<div class="separator" style="clear: both; text-align: left;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhiKn1pAaflz5LMMaAPobqcSNeGnArtm4hWrIlVNHeRwJVecEcntg9dTU-i-iLnVWkHEXpW-_pV7IwxQuWFYO-_XMmezol524QpJ79EJkh4QLDlRMrhqB7HGSdFMVyYtp7q3_KkRsljucQ/s1600/iphone_beginner1.png" imageanchor="1"><img border="0" height="260" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhiKn1pAaflz5LMMaAPobqcSNeGnArtm4hWrIlVNHeRwJVecEcntg9dTU-i-iLnVWkHEXpW-_pV7IwxQuWFYO-_XMmezol524QpJ79EJkh4QLDlRMrhqB7HGSdFMVyYtp7q3_KkRsljucQ/s320/iphone_beginner1.png" width="320" /></a></div><br />
<br />
まず、どのテンプレートを使用すればいいかで困惑するはずです。<br />
テンプレートは以下の物<br />
<br />
<ul><li><span class="Apple-style-span" style="color: orange;">Navigation-based Application</span><br />
リストの項目を選択したら、その項目について階層的に潜っていくような階層構造を持ったタイプ。<br />
</li>
<li><span class="Apple-style-span" style="color: orange;">OpenGL ES Application</span><br />
3Dのグラフィックを使用したゲームなどのようなOpenGLを使用したタイプ<br />
</li>
<li><span class="Apple-style-span" style="color: orange;">Split View-based Application</span><br />
iPadでSplit Viewを使うようなタイプ<br />
</li>
<li><span class="Apple-style-span" style="color: orange;">Tab Bar Application</span><br />
下部にTabを生成しウィンドウを切り替えるタイプ<br />
</li>
<li><span class="Apple-style-span" style="color: orange;">Utility Application</span><br />
iPhoneの天気アプリのような、フリップして裏画面で設定を行うようなタイプ<br />
</li>
<li><span class="Apple-style-span" style="color: orange;">View-based Application</span><br />
ビューを1つだけ使用するタイプ<br />
</li>
<li><span class="Apple-style-span" style="color: orange;">Window-based Application</span><br />
全ての基礎となるタイプ<br />
</li>
</ul><br />
しかし、音楽のための iPodアプリケーションのように、<span class="Apple-style-span" style="color: #0b5394;">タブがあってナビゲーションもあるアプリ</span>を作りたい場合、どうすればよいか?という疑問が浮かぶはずです!<br />
<br />
この場合は, Tab Bar Application の タブの1つとして Navigation-based のビューを生成すれば良い。<br />
<br />
<br />
※ 基本的にInterface Builder(以下IB)を利用して画面を生成していくのですが、その方法だと裏側がどうなっているのかが理解できず、タブがあってナビゲーションもあるアプリのように複雑なものは理解しずらいのでは?と思います。そこで、IBを使用しないで作成する方法で記事を書いていきます。(個人的にIBはよくわからないっていうのが本音なんですけどね。笑) そのため、<span class="Apple-style-span" style="color: #b45f06;">Window-based Application</span> を使用していきます<br />
<br />
次回は、その前提としてアプリケーションの画面の構成について自分なりにまとめてみます。ゆちゃんhttp://www.blogger.com/profile/12754048020092995283noreply@blogger.com0tag:blogger.com,1999:blog-3898191846546147659.post-33854253392774250572011-05-30T13:43:00.001+09:002011-06-01T22:18:11.922+09:00Android - SQLiteでの複数レコード挿入複数のレコードを追加するためのメソッドを作成しました。<br />
conflictAlgorithm には, SQLiteDatabase.CONFLICT_NONE, SQLiteDatabase.CONFLICT_REPLACE などの, コンフリクトが発生した場合の処理を指定します。<br />
また, transaction を true にした場合は, トランザクション処理を併用します。<br />
<br />
<pre class="java" name="code">/**
* insert a lot of data
*
* @param nullColumnHack
* @param valueList 値のリスト
* @param conflictAlgorithm コンフリクト発生時の処理
* @param transaction トランザクション処理を併用するか否か
* @return Boolean 成功 or 失敗
*/
public Boolean insertMany(SQLiteDatabase db , String table , String nullColumnHack, List<ContentValues> valueList, int conflictAlgorithm, Boolean transaction) {
if(valueList != null && valueList.size() > 0){
String[] CONFLICT_VALUES = new String[]{"", " OR ROLLBACK ", " OR ABORT ", " OR FAIL ", " OR IGNORE ", " OR REPLACE "};
// At first, create sql statement
ContentValues initialValues = valueList.get(0);
// Measurements show most sql lengths <= 152
StringBuilder sql_build = new StringBuilder(152);
sql_build.append("INSERT");
sql_build.append(CONFLICT_VALUES[conflictAlgorithm]);
sql_build.append(" INTO ");
sql_build.append(table);
// Measurements show most values lengths < 40
StringBuilder values = new StringBuilder(40);
Set<Map.Entry<String, Object>> entrySet = null;
if (initialValues != null && initialValues.size() > 0) {
entrySet = initialValues.valueSet();
Iterator<Map.Entry<String, Object>> entriesIter = entrySet.iterator();
sql_build.append('(');
boolean needSeparator = false;
while (entriesIter.hasNext()) {
if (needSeparator) {
sql_build.append(", ");
values.append(", ");
}
needSeparator = true;
Map.Entry<String, Object> entry = entriesIter.next();
sql_build.append(entry.getKey());
values.append('?');
}
sql_build.append(')');
} else {
sql_build.append("(" + nullColumnHack + ") ");
values.append("NULL");
}
sql_build.append(" VALUES(");
sql_build.append(values);
sql_build.append(");");
String sql = sql_build.toString();
SQLiteStatement statement = null;
// if transaction id true, beginTransaction()
if(transaction){
db.beginTransaction();
}
try {
for(int i=0,length=valueList.size(); i<length; i++){
statement = db.compileStatement(sql);
initialValues = valueList.get(i);
entrySet = initialValues.valueSet();
// Bind the values
if (entrySet != null) {
int size = entrySet.size();
Iterator<Map.Entry<String, Object>> entriesIter = entrySet.iterator();
for (int j = 0; j < size; j++) {
Map.Entry<String, Object> entry = entriesIter.next();
DatabaseUtils.bindObjectToProgram(statement, j + 1, entry.getValue());
}
}
// Run the program and then cleanup
statement.execute();
statement.close();
}
// if transaction id true, setTransactionSuccessful()
if(transaction){
db.setTransactionSuccessful();
db.endTransaction();
transaction = false;
}
return true;
} catch (SQLiteDatabaseCorruptException e) {
throw e;
} finally {
if (statement != null) {
statement.close();
}
// if transaction id true, endTransaction()
if(transaction){
db.endTransaction();
}
}
}
return false;
}
</pre>ゆちゃんhttp://www.blogger.com/profile/12754048020092995283noreply@blogger.com0tag:blogger.com,1999:blog-3898191846546147659.post-55875301969593589162011-05-10T11:42:00.002+09:002011-07-05T09:49:46.140+09:00Android - SQLite 文字列ソートSQLiteの文字列ソートにおいて (SQLiteに限らず) , かな, 英字, 数字, 記号 の順番を群単位で変えたい場合は, そのためのフィールドを追加するのが一番簡単っぽい。というより、これしか思い浮かばなかった。<br />
<br />
デフォルトだと<数字, 英字 .... >という順番だったが, ワードの頭文字に対して<かな, 記号(その他), 数字, 英語> という順番にソートしたかった。そこで, sortgroupというフィールドを目的のテーブルに作成する。<br />
<br />
sortgroupの値は, <span class="Apple-style-span" style="color: #bf9000;">半角カナ → 1, 記号(その他) → 2, 数字 → 3, 英字 → 4 </span> とする。<br />
<br />
こうすれば, SELECT * FROM table ORDER BY sortgroup ASC みたいにすれば取ってこれるよね。<br />
<br />
で、頭文字がどのタイプのものかを判別するためのプログラムは以下<br />
<br />
<pre class="java" name="code">public class CheckWordType {
// 文字列が 半角カタカナ(1), その他(2), 数字(3), アルファベット(4)のどれかを調べる
public int checkCharType(char c){
if(c >= 0xff66 && c <= 0xff9d){ // 半角カタカナ (1) http://ash.jp/code/unitbl1.htm 参照
return 1;
}else if(Character.isLetter(c)){ // アルファベット (4)
return 4;
}else if(Character.isDigit(c)){ // 数字 (3)
return 3;
}else{ // その他 (2)
return 2;
}
}
}
</pre><br />
まぁ、まとめるほどの事でもないんだけど、書く記事がなかったんでwゆちゃんhttp://www.blogger.com/profile/12754048020092995283noreply@blogger.com0tag:blogger.com,1999:blog-3898191846546147659.post-90489102275628641242011-04-27T19:30:00.006+09:002011-07-05T09:50:06.549+09:00Android - プログラムでLinearLayoutのGravity属性を設定LinearLayoutそのものを中央寄せしたい場合は, 以下のように LayoutParams の gravity 変数に値を設定すれば良い。<br />
<br />
<pre class="java" name="code">LinearLayout.LayoutParams lp =
new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT);
lp.gravity = Gravity.CENTER_HORIZONTAL;
view.setLayoutParams(lp);
</pre><br />
<br />
view.setGravity(gravity); で設定しようとしてはまったのでメモ。<br />
LinearLayout の小ビューの中央寄せはをする場合に, view.setGravity(gravity); を使うのかな?ゆちゃんhttp://www.blogger.com/profile/12754048020092995283noreply@blogger.com0tag:blogger.com,1999:blog-3898191846546147659.post-67966084311433498562011-04-27T19:24:00.001+09:002011-07-05T09:50:27.577+09:00Android - 画面の横幅と縦幅の取得画面の横幅と縦幅を取得したい場合は以下の様にすれば良い<br />
<br />
<pre name="code" class="java">DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
int width = metrics.widthPixels; // 横幅サイズを取得
int height = metrics.heightPixels; // 縦幅サイズを取得
</pre><br />
ちなみに, 幅が小さいほうが横幅, 大きいほうが縦幅というわけではなく, その時の画面の向きに対する横幅・縦幅です。ゆちゃんhttp://www.blogger.com/profile/12754048020092995283noreply@blogger.com0tag:blogger.com,1999:blog-3898191846546147659.post-36559406698413377862011-04-20T01:15:00.002+09:002011-04-20T01:21:00.213+09:00MINE TYPE の一覧 (cakePHPより)cakePHP1.3のmedia.phpで定義されているMINEタイプの一覧は以下のものとなっていた。<br />
しっておくと便利かもしれないので、一応メモ!<br />
<br />
<pre name="code" class="php">var $mimeType = array(
'ai' => 'application/postscript',
'bcpio' => 'application/x-bcpio',
'bin' => 'application/octet-stream',
'ccad' => 'application/clariscad',
'cdf' => 'application/x-netcdf',
'class' => 'application/octet-stream',
'cpio' => 'application/x-cpio',
'cpt' => 'application/mac-compactpro',
'csh' => 'application/x-csh',
'csv' => 'application/csv',
'dcr' => 'application/x-director',
'dir' => 'application/x-director',
'dms' => 'application/octet-stream',
'doc' => 'application/msword',
'drw' => 'application/drafting',
'dvi' => 'application/x-dvi',
'dwg' => 'application/acad',
'dxf' => 'application/dxf',
'dxr' => 'application/x-director',
'eot' => 'application/vnd.ms-fontobject',
'eps' => 'application/postscript',
'exe' => 'application/octet-stream',
'ez' => 'application/andrew-inset',
'flv' => 'video/x-flv',
'gtar' => 'application/x-gtar',
'gz' => 'application/x-gzip',
'bz2' => 'application/x-bzip',
'7z' => 'application/x-7z-compressed',
'hdf' => 'application/x-hdf',
'hqx' => 'application/mac-binhex40',
'ico' => 'image/vnd.microsoft.icon',
'ips' => 'application/x-ipscript',
'ipx' => 'application/x-ipix',
'js' => 'application/x-javascript',
'latex' => 'application/x-latex',
'lha' => 'application/octet-stream',
'lsp' => 'application/x-lisp',
'lzh' => 'application/octet-stream',
'man' => 'application/x-troff-man',
'me' => 'application/x-troff-me',
'mif' => 'application/vnd.mif',
'ms' => 'application/x-troff-ms',
'nc' => 'application/x-netcdf',
'oda' => 'application/oda',
'otf' => 'font/otf',
'pdf' => 'application/pdf',
'pgn' => 'application/x-chess-pgn',
'pot' => 'application/mspowerpoint',
'pps' => 'application/mspowerpoint',
'ppt' => 'application/mspowerpoint',
'ppz' => 'application/mspowerpoint',
'pre' => 'application/x-freelance',
'prt' => 'application/pro_eng',
'ps' => 'application/postscript',
'roff' => 'application/x-troff',
'scm' => 'application/x-lotusscreencam',
'set' => 'application/set',
'sh' => 'application/x-sh',
'shar' => 'application/x-shar',
'sit' => 'application/x-stuffit',
'skd' => 'application/x-koan',
'skm' => 'application/x-koan',
'skp' => 'application/x-koan',
'skt' => 'application/x-koan',
'smi' => 'application/smil',
'smil' => 'application/smil',
'sol' => 'application/solids',
'spl' => 'application/x-futuresplash',
'src' => 'application/x-wais-source',
'step' => 'application/STEP',
'stl' => 'application/SLA',
'stp' => 'application/STEP',
'sv4cpio' => 'application/x-sv4cpio',
'sv4crc' => 'application/x-sv4crc',
'svg' => 'image/svg+xml',
'svgz' => 'image/svg+xml',
'swf' => 'application/x-shockwave-flash',
't' => 'application/x-troff',
'tar' => 'application/x-tar',
'tcl' => 'application/x-tcl',
'tex' => 'application/x-tex',
'texi' => 'application/x-texinfo',
'texinfo' => 'application/x-texinfo',
'tr' => 'application/x-troff',
'tsp' => 'application/dsptype',
'ttf' => 'font/ttf',
'unv' => 'application/i-deas',
'ustar' => 'application/x-ustar',
'vcd' => 'application/x-cdlink',
'vda' => 'application/vda',
'xlc' => 'application/vnd.ms-excel',
'xll' => 'application/vnd.ms-excel',
'xlm' => 'application/vnd.ms-excel',
'xls' => 'application/vnd.ms-excel',
'xlw' => 'application/vnd.ms-excel',
'zip' => 'application/zip',
'aif' => 'audio/x-aiff',
'aifc' => 'audio/x-aiff',
'aiff' => 'audio/x-aiff',
'au' => 'audio/basic',
'kar' => 'audio/midi',
'mid' => 'audio/midi',
'midi' => 'audio/midi',
'mp2' => 'audio/mpeg',
'mp3' => 'audio/mpeg',
'mpga' => 'audio/mpeg',
'ra' => 'audio/x-realaudio',
'ram' => 'audio/x-pn-realaudio',
'rm' => 'audio/x-pn-realaudio',
'rpm' => 'audio/x-pn-realaudio-plugin',
'snd' => 'audio/basic',
'tsi' => 'audio/TSP-audio',
'wav' => 'audio/x-wav',
'asc' => 'text/plain',
'c' => 'text/plain',
'cc' => 'text/plain',
'css' => 'text/css',
'etx' => 'text/x-setext',
'f' => 'text/plain',
'f90' => 'text/plain',
'h' => 'text/plain',
'hh' => 'text/plain',
'htm' => 'text/html',
'html' => 'text/html',
'm' => 'text/plain',
'rtf' => 'text/rtf',
'rtx' => 'text/richtext',
'sgm' => 'text/sgml',
'sgml' => 'text/sgml',
'tsv' => 'text/tab-separated-values',
'tpl' => 'text/template',
'txt' => 'text/plain',
'xml' => 'text/xml',
'avi' => 'video/x-msvideo',
'fli' => 'video/x-fli',
'mov' => 'video/quicktime',
'movie' => 'video/x-sgi-movie',
'mpe' => 'video/mpeg',
'mpeg' => 'video/mpeg',
'mpg' => 'video/mpeg',
'qt' => 'video/quicktime',
'viv' => 'video/vnd.vivo',
'vivo' => 'video/vnd.vivo',
'gif' => 'image/gif',
'ief' => 'image/ief',
'jpe' => 'image/jpeg',
'jpeg' => 'image/jpeg',
'jpg' => 'image/jpeg',
'pbm' => 'image/x-portable-bitmap',
'pgm' => 'image/x-portable-graymap',
'png' => 'image/png',
'pnm' => 'image/x-portable-anymap',
'ppm' => 'image/x-portable-pixmap',
'ras' => 'image/cmu-raster',
'rgb' => 'image/x-rgb',
'tif' => 'image/tiff',
'tiff' => 'image/tiff',
'xbm' => 'image/x-xbitmap',
'xpm' => 'image/x-xpixmap',
'xwd' => 'image/x-xwindowdump',
'ice' => 'x-conference/x-cooltalk',
'iges' => 'model/iges',
'igs' => 'model/iges',
'mesh' => 'model/mesh',
'msh' => 'model/mesh',
'silo' => 'model/mesh',
'vrml' => 'model/vrml',
'wrl' => 'model/vrml',
'mime' => 'www/mime',
'pdb' => 'chemical/x-pdb',
'xyz' => 'chemical/x-pdb'
);
</pre>ゆちゃんhttp://www.blogger.com/profile/12754048020092995283noreply@blogger.com0tag:blogger.com,1999:blog-3898191846546147659.post-19987625852434963022011-04-18T20:44:00.004+09:002011-07-05T09:50:44.248+09:00Android - HTTP-POST通信を行うHTTPのPOST処理を行う場合は, 以下のようにすればOK.<br />
<br />
<pre name="code" class="java">/**
* HTTP POSTを行う
*
* @param url HTTP通信を行うターゲットのURL
* @param requestParams パラメータ
* @param encode HTTP要求時の文字コード
* @return 受信結果の文字列
*/
public String httpPostRequest( String url, Map<String, String> requestParams, String encode ){
try{
HttpPost httppost = new HttpPost( url );
DefaultHttpClient client = new DefaultHttpClient();
// リクエストパラメータの設定
List<NameValuePair> params = new ArrayList<NameValuePair>();
for (Map.Entry<String, String> entry : requestParams.entrySet()) {
params.add(new BasicNameValuePair((String) entry.getKey(), (String) entry.getValue()));
}
// POST データの設定
httppost.setEntity(new UrlEncodedFormEntity(params, encode));
HttpResponse response = client.execute( httppost );
int status = response.getStatusLine().getStatusCode();
// 結果が正しく帰って来なければエラー
if ( status != HttpStatus.SC_OK ){ throw new Exception( "" ); }
return EntityUtils.toString( response.getEntity());
}catch ( Exception e ){
return null;
}
}
</pre><br />
<br />
POST データを付加する際, <br />
httppost.setEntity(new UrlEncodedFormEntity(params, encode));<br />
とするが, ここで第二引数に, ちゃんと encode を指定してあげること。<br />
内部エンコードがUTF-8だろうからって指定しなかったために、えらい目に会いました。<br />
<br />
Webプログラム (PHP等) でもそうだけど、文字コードは明示的にちゃんと指定してあげなきゃだめですね。猛省。。。ゆちゃんhttp://www.blogger.com/profile/12754048020092995283noreply@blogger.com0tag:blogger.com,1999:blog-3898191846546147659.post-6230485138830463112011-04-07T00:07:00.002+09:002011-04-07T02:42:17.781+09:00動作しているサービスの一覧について動作しているサービスの一覧は,<br />
<br />
<br />
<span class="Apple-style-span" style="color: blue;">chkconfig --list </span>というコマンドで把握できる。出力例は以下<br />
<br />
<br />
<br />
<span class="Apple-style-span" style="color: #666666;">NetworkManager <span class="Apple-tab-span" style="white-space: pre;"> </span>0:off<span class="Apple-tab-span" style="white-space: pre;"> </span>1:off<span class="Apple-tab-span" style="white-space: pre;"> </span>2:off<span class="Apple-tab-span" style="white-space: pre;"> </span>3:off<span class="Apple-tab-span" style="white-space: pre;"> </span>4:off<span class="Apple-tab-span" style="white-space: pre;"> </span>5:off<span class="Apple-tab-span" style="white-space: pre;"> </span>6:off</span><br />
<span class="Apple-style-span" style="color: #666666;">acpid <span class="Apple-tab-span" style="white-space: pre;"> </span>0:off<span class="Apple-tab-span" style="white-space: pre;"> </span>1:off<span class="Apple-tab-span" style="white-space: pre;"> </span>2:on<span class="Apple-tab-span" style="white-space: pre;"> </span>3:on<span class="Apple-tab-span" style="white-space: pre;"> </span>4:on<span class="Apple-tab-span" style="white-space: pre;"> </span>5:on<span class="Apple-tab-span" style="white-space: pre;"> </span>6:off</span><br />
<span class="Apple-style-span" style="color: #666666;">anacron <span class="Apple-tab-span" style="white-space: pre;"> </span>0:off<span class="Apple-tab-span" style="white-space: pre;"> </span>1:off<span class="Apple-tab-span" style="white-space: pre;"> </span>2:off<span class="Apple-tab-span" style="white-space: pre;"> </span>3:off<span class="Apple-tab-span" style="white-space: pre;"> </span>4:off<span class="Apple-tab-span" style="white-space: pre;"> </span>5:off<span class="Apple-tab-span" style="white-space: pre;"> </span>6:off</span><br />
<span class="Apple-style-span" style="color: #666666;">atd <span class="Apple-tab-span" style="white-space: pre;"> </span>0:off<span class="Apple-tab-span" style="white-space: pre;"> </span>1:off<span class="Apple-tab-span" style="white-space: pre;"> </span>2:off<span class="Apple-tab-span" style="white-space: pre;"> </span>3:on<span class="Apple-tab-span" style="white-space: pre;"> </span>4:on<span class="Apple-tab-span" style="white-space: pre;"> </span>5:on<span class="Apple-tab-span" style="white-space: pre;"> </span>6:off</span><br />
<span class="Apple-style-span" style="color: #666666;">auditd <span class="Apple-tab-span" style="white-space: pre;"> </span>0:off<span class="Apple-tab-span" style="white-space: pre;"> </span>1:off<span class="Apple-tab-span" style="white-space: pre;"> </span>2:off<span class="Apple-tab-span" style="white-space: pre;"> </span>3:off<span class="Apple-tab-span" style="white-space: pre;"> </span>4:off<span class="Apple-tab-span" style="white-space: pre;"> </span>5:off<span class="Apple-tab-span" style="white-space: pre;"> </span>6:off</span><br />
<span class="Apple-style-span" style="color: #666666;"> :</span><br />
<span class="Apple-style-span" style="color: #666666;"> :</span><br />
<span class="Apple-style-span" style="color: #666666;">wpa_supplicant <span class="Apple-tab-span" style="white-space: pre;"> </span>0:off<span class="Apple-tab-span" style="white-space: pre;"> </span>1:off<span class="Apple-tab-span" style="white-space: pre;"> </span>2:off<span class="Apple-tab-span" style="white-space: pre;"> </span>3:off<span class="Apple-tab-span" style="white-space: pre;"> </span>4:off<span class="Apple-tab-span" style="white-space: pre;"> </span>5:off<span class="Apple-tab-span" style="white-space: pre;"> </span>6:off</span><br />
<span class="Apple-style-span" style="color: #666666;">xfs <span class="Apple-tab-span" style="white-space: pre;"> </span>0:off<span class="Apple-tab-span" style="white-space: pre;"> </span>1:off<span class="Apple-tab-span" style="white-space: pre;"> </span>2:off<span class="Apple-tab-span" style="white-space: pre;"> </span>3:off<span class="Apple-tab-span" style="white-space: pre;"> </span>4:off<span class="Apple-tab-span" style="white-space: pre;"> </span>5:off<span class="Apple-tab-span" style="white-space: pre;"> </span>6:off</span><br />
<span class="Apple-style-span" style="color: #666666;">ypbind <span class="Apple-tab-span" style="white-space: pre;"> </span>0:off<span class="Apple-tab-span" style="white-space: pre;"> </span>1:off<span class="Apple-tab-span" style="white-space: pre;"> </span>2:off<span class="Apple-tab-span" style="white-space: pre;"> </span>3:off<span class="Apple-tab-span" style="white-space: pre;"> </span>4:off<span class="Apple-tab-span" style="white-space: pre;"> </span>5:off<span class="Apple-tab-span" style="white-space: pre;"> </span>6:off</span><br />
<span class="Apple-style-span" style="color: #666666;">yum-updatesd <span class="Apple-tab-span" style="white-space: pre;"> </span>0:off<span class="Apple-tab-span" style="white-space: pre;"> </span>1:off<span class="Apple-tab-span" style="white-space: pre;"> </span>2:off<span class="Apple-tab-span" style="white-space: pre;"> </span>3:off<span class="Apple-tab-span" style="white-space: pre;"> </span>4:off<span class="Apple-tab-span" style="white-space: pre;"> </span>5:off<span class="Apple-tab-span" style="white-space: pre;"> </span>6:off</span><br />
<div><br />
</div><div><br />
</div><div>ここで 0 ~ 6 の数字はランレベルを表しており,<br />
<br />
</div><div><br />
0 : システムの停止<br />
1 : シングルユーザーモード<br />
2 : マルチユーザーモード(NFSなし)<br />
3 : マルチユーザーモード(テキストログイン)<br />
4 : 未使用<br />
5 : マルチユーザーモード(グラフィカルログイン)<br />
6 : システムの再起動</div><div><br />
である。ちなみに, ランレベルについては <a href="http://www.atmarkit.co.jp/flinux/rensai/linuxtips/156whatrunlv.html">こちら</a></div><div><br />
</div>ゆちゃんhttp://www.blogger.com/profile/12754048020092995283noreply@blogger.com0tag:blogger.com,1999:blog-3898191846546147659.post-18626296003349096062011-04-05T21:05:00.001+09:002011-07-05T09:51:06.106+09:00Android - 画面の向きの固定方法画面の向きを固定したい!という場合があると思います。<br />
その場合は, 以下の様にすれば良い。<br />
<br />
<pre class="java" name="code">// 画面の向きを固定
public void fixDisplayOrientation(){
Configuration config = getResources().getConfiguration();
if(config.orientation == Configuration.ORIENTATION_PORTRAIT){
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}else if (config.orientation == Configuration.ORIENTATION_LANDSCAPE){
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
}
}
// 画面の向きの固定を解除
public void unfixDisplayOrientation(){
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
}
</pre><br />
ここで, <span class="Apple-style-span" style="color: red;">画面の向きを取得するとき</span>, config.orientation の値を使用。<br />
Configuration.ORIENTATION_PORTRAIT なのか Configuration.ORIENTATION_LANDSCAPE なのかで判断する。<br />
<br />
<br />
しかし, <span class="Apple-style-span" style="color: #0b5394;">画面の向きを設定するとき</span>, は, setRequestedOrientation(int orientation) に与える引数の値は, Configuration.ORIENTATION_PORTRAIT や Configuration.ORIENTATION_LANDSCAPE ではなく, <span class="Apple-style-span" style="color: #0b5394;">ActivityInfo.SCREEN_ORIENTATION_PORTRAIT または ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE</span> なので注意!ゆちゃんhttp://www.blogger.com/profile/12754048020092995283noreply@blogger.com0tag:blogger.com,1999:blog-3898191846546147659.post-33585032442651316882011-04-04T14:55:00.001+09:002011-07-05T09:51:19.435+09:00Android - IMEの表示/非表示IMEをプログラムで表示/非表示の切り替えを行いたかったので、その時のメモ。<br />
<br />
まずは表示方法から<br />
<pre name="code" class="java">// 表示方法
EditText et = (EditText)findViewById(R.id.edittext);
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(et, InputMethodManager.SHOW_IMPLICIT);
</pre><br />
次に非表示にする方法<br />
<pre name="code" class="java">// 非表示方法
imm.hideSoftInputFromWindow(v.getWindowToken(),0);
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
</pre><br />
とりあえずこれで出来ました。ゆちゃんhttp://www.blogger.com/profile/12754048020092995283noreply@blogger.com0tag:blogger.com,1999:blog-3898191846546147659.post-44141766553288557742011-04-01T21:17:00.002+09:002011-07-05T09:51:32.031+09:00Android - ローディング画像を表示する画像読み込み中にローディング画像を表示させたい (クルクル回るやつ)。<br />
この場合, Androidに用意されている ProgressBar を使用すれば良い。(gifアニメーションで実現しようとする場合は, 結構めんどくさそう)<br />
<br />
<pre class="xml" name="code"><ProgressBar
android:id="@+id/product_image_loading"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
style="?android:attr/progressBarStyle"/>
</pre><br />
これだけでOK。<br />
<br />
以下は例, 上から順に, styleは<br />
progressBarStyleSmall<br />
progressBarStyle<br />
progressBarStyleLarge<br />
progressBarStyleHorizontal<br />
です。progressBarStyleHorizontal には, android:indeterminate="true" も指定してある。<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh3ratiIBB637qR6sCwfn_-Zhd_vghbAyZYyGurbRK3a1ClwOCp9CYsOm0SPO2XwfnXOSf6c_gMq8Zap9mSHuLuLUlI24stY56IEgMs9a8EBTUC1Nr4OQ1vMbrdTwN0qPxFjiOfkLMb_s4/s1600/loading.png" imageanchor="1" style=""><img border="0" height="320" width="312" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh3ratiIBB637qR6sCwfn_-Zhd_vghbAyZYyGurbRK3a1ClwOCp9CYsOm0SPO2XwfnXOSf6c_gMq8Zap9mSHuLuLUlI24stY56IEgMs9a8EBTUC1Nr4OQ1vMbrdTwN0qPxFjiOfkLMb_s4/s320/loading.png" /></a></div>ゆちゃんhttp://www.blogger.com/profile/12754048020092995283noreply@blogger.com0tag:blogger.com,1999:blog-3898191846546147659.post-74393595333121589932011-03-30T19:04:00.001+09:002011-07-05T09:51:44.017+09:00Android - colors.xml についてres/values/ に, colors.xmlというファイルを作成する (以下はその例)。<br />
<br />
<pre class="xml" name="code"><?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="color1">#ff66cdaa</color>
<color name="color2">#ffff89c4</color>
<color name="color3">#ffAAAAAA</color>
</resources>
</pre><br />
こうすることで, 独自の色を定義することができる。<br />
<br />
xml から使用する場合は, android:background="@color/color1" などというように, <span class="Apple-style-span" style="color: blue;">@color/</span> で指定して上げれば良い。<br />
<br />
プログラム中から使用する場合は, 例として<br />
int color = getResources().getColor(R.color.color1);<br />
view.setBackgroundColor(color); としてあげればOK。<br />
<br />
<br />
view.setBackgroundColor(R.color.color1)という指定をしてしまってハマったのでメモメモ。ゆちゃんhttp://www.blogger.com/profile/12754048020092995283noreply@blogger.com0tag:blogger.com,1999:blog-3898191846546147659.post-57437249308374686282011-03-29T18:47:00.003+09:002011-07-05T09:51:59.808+09:00Android - Activity 起動時にキーボードを表示させないActivity を起動する際に, EditText にフォーカスが当たっている場合, キーボードが自動で表示される。<br />
これを辞めたい場合 (キーボードの表示を禁止する場合), <br />
<br />
setContentView を行う前に, <br />
this.getWindow().setSoftInputMode(LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);<br />
をしてあげれば良い。(※ android.view.WindowManager.LayoutParams をimport)<br />
<br />
<a href="https://groups.google.com/group/android-group-japan/browse_thread/thread/013b4d8f575748b2/4326df813618d3a2?hl=ja">こちら</a>を参考にさせて頂きました。<br />
<br />
また, EditTextかたフォーカスが外れたらキーボードを隠したい場合は, <br />
<br />
<pre class="java" name="code">EditText editText = (EditText)findViewById(R.id.EditText01);
editText.setOnFocusChangeListener(new View.OnFocusChangeListener(){
@Override
public void onFocusChange(View v, boolean flag){
if(flag == false){
InputMethodManager inputMethodManager =
(InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
inputMethodManager.hideSoftInputFromWindow(v.getWindowToken(),0);
}
}
});
</pre><br />
というように, EditText の setOnFocusChange に inputMethodManager.hideSoftInputFromWindow(v.getWindowToken(),0)<br />
を行わせてあげれば良い。ゆちゃんhttp://www.blogger.com/profile/12754048020092995283noreply@blogger.com0tag:blogger.com,1999:blog-3898191846546147659.post-19114938456135530192011-03-25T19:58:00.002+09:002011-07-05T09:52:11.224+09:00Android - startActivityForResult & onActivityResultメインアクティビティからサブアクティビティを呼び出し, サブアクティビティが終了した際にコールバックを呼ぶ。<br />
ちょっとはまったのでメモ ( . .)Φ<br />
<br />
このような事を行う際には,<br />
① メインアクティビティ側で startActivityForResult を使用して サブアクティビティ を起動する。<br />
② サブアクティビティで setResult(...) を使用して, 呼び出し側(メイン) に返す内容を定める<br />
③ メインアクティビティ側の onActivityResult がコールバックで呼び出される。<br />
<br />
という流れである。しかし, 呼び出し側 (メイン) と呼び出される側 (サブ) を両方共マニフェストファイルで <span class="Apple-style-span" style="color: blue;">SingleTask</span> に設定していた場合, これが上手くいかなかった。。<br />
<br />
この場合, 呼び出される (サブアクティビティ) 側には SingleTask や SingleInstance は設定しないほうが良いだろうという結論。ゆちゃんhttp://www.blogger.com/profile/12754048020092995283noreply@blogger.com0tag:blogger.com,1999:blog-3898191846546147659.post-11892198311357240682011-03-24T15:13:00.005+09:002011-07-05T09:52:20.287+09:00Android - Examination of "Context"Android では, <br />
<br />
AlertDialog.Builder dialog = new AlertDialog.Builder(MainActivity.this);<br />
Intent intent = new Intent(MainActivity.this, HogeActivity.class); <br />
<br />
といったように, 引数に Context を渡すことが頻繁にあります。(上でいう MainActivity.this)<br />
この Context に関して, どういうものかを知っておくべきだと思い、自分なりにまとめてみる。<br />
<br />
<br />
まず知っておくべき事としては<br />
<br />
<div style="border: 1px solid #666666; padding: 10px;">① Context は, アプリケーションのグローバルな環境情報を受け渡すために使用される (コンストラクタの引数によく与えられる)。 (これにより, 特定のアプリケーションのリソースやクラスにアクセスでき, アクティビティ起動やインテントのブロードキャスト, インテント受信といった操作を呼び出せる)<br />
<br />
② Context には, <span class="Apple-style-span" style="color: blue;">Application Context</span> と <span class="Apple-style-span" style="color: orange;">Activity Context</span> というものが存在する。前者は, getApplicationContext() で取得する Context であり, 後者は上記の例のように 「this」で取得するものである。<br />
後者の「this」は Activity である (Activity クラスは Context を継承している) 。<br />
<br />
③ <span class="Apple-style-span" style="color: blue;">Application Context</span> はアプリケーションに結び付けられていて, アプリケーションのライフサイクルで同じものである。これに対して, <span class="Apple-style-span" style="color: orange;">Activity Context</span>は Activity に結び付けられている ( 画面回転等の様な際に何度も破棄される可能性がある Activity )<br />
<br />
<div style="text-align: right;">( Reference )<br />
<a href="http://androidforbeginners.blogspot.com/2009/12/context.html">http://androidforbeginners.blogspot.com/2009/12/context.html</a><br />
<a href="http://developer.android.com/reference/android/content/Context.html">http://developer.android.com/reference/android/content/Context.html</a></div></div><br />
では, <span class="Apple-style-span" style="color: blue;">Application Context</span> と <span class="Apple-style-span" style="color: orange;">Activity Context</span> はどう使い分ければ良いのか?<br />
それに関するヒントとして, <br />
<a href="http://android-developers.blogspot.com/2009/01/avoiding-memory-leaks.html">http://android-developers.blogspot.com/2009/01/avoiding-memory-leaks.html</a><br />
にメモリリークとの関係性が記述されているので, 参考にしておくと良いと思う。<br />
<br />
様々な記事があるが、どれも言ってることは, <br />
<br />
<div style="border: 1px solid #666666; padding: 10px;">① Activity と同じライフサイクルの際には <span class="Apple-style-span" style="color: orange;">Activity Context</span> を使用する。GUIを扱う際には特に注意すること。<br />
② ライフサイクルが異なる場合に <span class="Apple-style-span" style="color: orange;">Activity Context</span> を使用すると, メモリリークする可能性がある。その場合は<span class="Apple-style-span" style="color: blue;">Application Context</span> を使用するとよい。</div><br />
ということなのかな?<br />
正直, どちらの Context を使用すればいいか?という答えは難しく, 場合によってって感じでした(すみません。。。)。<br />
なので, 経験を踏んで ライフサイクル を考えながら選ぶべきなんですね。<br />
<br />
強いてゆうなれば, Activity のライフサイクルが終了した際に, 同時に破棄したい場合は <span class="Apple-style-span" style="color: orange;">Activity Context</span> , それ以外やどちらを使用すればよくわかりません..って場合は, <span class="Apple-style-span" style="color: blue;">Application Context</span> を使用するのが無難なのかな。。って感じです。ゆちゃんhttp://www.blogger.com/profile/12754048020092995283noreply@blogger.com0tag:blogger.com,1999:blog-3898191846546147659.post-81584405985217013702011-03-21T02:50:00.003+09:002011-07-05T09:55:18.440+09:00Android - ログアウト処理の実装<a href="http://michelle-gf.blogspot.com/2011/03/blog-post_21.html">前回の記事 (ログイン & ログアウト処理 (スタックの問題点))</a> で, ログイン & ログアウト処理の実装ではまった内容を説明した。今回はその解決法を説明する。<br />
<br />
前回の記事における HogeActivity の内容を以下に変更する。(LoginActivityにもnohistory属性を付加)<br />
<br />
<pre class="java" name="code">package com.dev_grafr.app.logintest;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class HogeActivity extends Activity {
public static final String PREFERENCES_FILE_NAME = "preference";
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.hoge);
((Button) findViewById(R.id.logoutBtn)).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
logout();
Intent broadcastIntent = new Intent();
broadcastIntent.setAction("com.dev_grafr.app.logintest.LOGOUT");
sendBroadcast(broadcastIntent);
Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
startActivity(intent);
}
});
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("com.dev_grafr.app.logintest.LOGOUT");
registerReceiver(new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
finish();
}
}, intentFilter);
}
// ログアウト処理
public void logout(){
SharedPreferences settings = getSharedPreferences(PREFERENCES_FILE_NAME, 0); // 0 -> MODE_PRIVATE
SharedPreferences.Editor editor = settings.edit();
editor.putLong("logged-in", 0);
editor.commit();
}
}
</pre><br />
これでOK<br />
<br />
つまり, ログアウトしましたよ〜。というメッセージをスタック内の Activity に対して BroadCast してあげれば良い。<br />
この BroadCast を受け取ったアクティビティは, 自分自身をfinishする。これで一度にスタックからアクティビティを除去できるわけである。<br />
<br />
<br />
どうでしょう?なにか他にも ログイン & ログアウト処理 の実装方法があれば, 教えてくださると嬉しいです。ゆちゃんhttp://www.blogger.com/profile/12754048020092995283noreply@blogger.com0tag:blogger.com,1999:blog-3898191846546147659.post-72062181304137420282011-03-21T02:22:00.012+09:002011-07-05T09:55:06.044+09:00Android - ログイン & ログアウト処理 (スタックの問題点)ログイン & ログアウト処理があるアプリケーションを作成する際にはまった内容をメモ<br />
<br />
<span class="Apple-style-span" style="color: red;">最初にはまった内容を</span>、説明します。<br />
問題点とかどうでもいいから、ログイン & ログアウト処理 の方法だけ教えてくれればいいんだよ!って方は, <a href="http://michelle-gf.blogspot.com/2011/03/blog-post_9055.html">ログアウト処理の実装</a>の方を参照してください<br />
<br />
流れとして, <br />
① MainActivity においてログイン済みかどうかの判定を行う (MainAvtivity は, レイアウトを持たないActivityで, アプリケーション起動時の処理などを行うものとする。)<br />
② ログインがされていない場合は, LoginActivity に遷移し, その後ログインが完了したら HogeActivity に遷移<br />
③ ログイン済みの場合は HogeActivity に直接遷移<br />
④ HogeActivity においてログアウト処理が行われたら LoginActivity に遷移する。<br />
<br />
ということを考える。<br />
※ ちなみに, ログイン済みか否かは プリファレンスを利用して判断する。また, MainAvtivity はレイアウトを持たないので, android:nohistory 属性をtrueにして, バックキーで戻れないようにしておく。<br />
<br />
この流れで作成したファイルは以下<br />
<br />
< AndroidManifest.xml ><br />
<br />
<pre class="xml" name="code"><?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.dev_grafr.app.logintest"
android:versionCode="1"
android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".MainActivity"
android:label="@string/app_name"
android:noHistory="true"
android:launchMode="singleTask"
>
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".LoginActivity"
android:label="@string/app_name"
android:launchMode="singleTask"
android:noHistory="true">
</activity>
<activity android:name=".HogeActivity"
android:label="@string/app_name">
</activity>
</application>
</manifest>
</pre><br />
< MainActivity.java ><br />
<pre class="java" name="code">package com.dev_grafr.app.logintest;
import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
public class MainActivity extends Activity {
public static final String PREFERENCES_FILE_NAME = "preference";
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if(loginCheck()){ // HogeActivity に遷移
Intent intent = new Intent(getApplicationContext(), HogeActivity.class);
startActivity(intent);
}else{ // LoginActivity に遷移
Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
startActivity(intent);
}
}
// ログイン判定
public Boolean loginCheck(){
SharedPreferences settings = getSharedPreferences(PREFERENCES_FILE_NAME, 0); // 0 -> MODE_PRIVATE
if(settings == null) return false;
int login = (int) settings.getLong("logged-in", 0);
if(login == 1) return true;
else return false;
}
}
</pre><br />
< LoginActivity.java ><br />
<br />
<pre class="java" name="code">package com.dev_grafr.app.logintest;
import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class LoginActivity extends Activity {
public static final String PREFERENCES_FILE_NAME = "preference";
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.login);
((Button) findViewById(R.id.loginBtn)).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
login();
// ログイン後は HogeActivity に遷移
Intent intent = new Intent(getApplicationContext(), HogeActivity.class);
startActivity(intent);
}
});
}
// ログイン処理
public void login(){
SharedPreferences settings = getSharedPreferences(PREFERENCES_FILE_NAME, 0); // 0 -> MODE_PRIVATE
SharedPreferences.Editor editor = settings.edit();
editor.putLong("logged-in", 1);
editor.commit();
}
}
</pre><br />
< HogeActivity.java > ← <span class="Apple-style-span" style="color: red;">失敗例(正しいものは<a href="http://michelle-gf.blogspot.com/2011/03/blog-post_9055.html">次回のブログ</a>で)</span><br />
<br />
<pre class="java" name="code">package com.dev_grafr.app.logintest;
import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class HogeActivity extends Activity {
public static final String PREFERENCES_FILE_NAME = "preference";
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.hoge);
((Button) findViewById(R.id.logoutBtn)).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
logout();
Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); // ← FLAG_ACTIVITY_CLEAR_TOPを設定
startActivity(intent);
}
});
}
// ログアウト処理
public void logout(){
SharedPreferences settings = getSharedPreferences(PREFERENCES_FILE_NAME, 0); // 0 -> MODE_PRIVATE
SharedPreferences.Editor editor = settings.edit();
editor.putLong("logged-in", 0);
editor.commit();
}
}
</pre><br />
<br />
[ 場合① ]<br />
<span class="Apple-style-span" style="color: blue;">MainActivity -> LoginActivity -> HogeActivity と遷移した場合の Activityのスタック</span>は, もちろん以下の通り<br />
<span class="Apple-style-span" style="color: #666666;">MainActivity は nohistory 属性が付いているので () をつけている</span><br />
____________________________________<br />
| ( MainActivity ) , LoginActivity , HogeActivity<br />
____________________________________<br />
<br />
そして, この時 HogeActivity において ログアウト処理を行い, LoginActivity に遷移する。その際にインテントに対して FLAG_ACTIVITY_CLEAR_TOP のフラグを付加することにより, HogeActivity が破棄されて遷移後のスタックは<br />
____________________________________<br />
| ( MainActivity ) , LoginActivity <br />
____________________________________<br />
<br />
となる。この場合は問題ない。<br />
<br />
[ 場合② ]<br />
<span class="Apple-style-span" style="color: blue;">しかし!!一度ログインを行い, ログイン済みの場合にアプリケーションを起動した際</span>は, LoginActivity を介さないため, <br />
____________________________________<br />
| ( MainActivity ) , HogeActivity<br />
____________________________________<br />
<br />
というスタックになる。ここで ログアウト処理を行って LoginActivity に遷移した場合, <br />
____________________________________<br />
| ( MainActivity ) , HogeActivity , LoginActivity <br />
____________________________________<br />
<br />
となってしまうのである。つまり, <span class="Apple-style-span" style="color: red;">ログアウトしたにも関わらず、LoginActivityにおいてバックキーを押すと, HogeActivityに戻ってしまう</span>。<br />
そこで, HogeActivity でログアウト処理 ----> MainActivity ----> ログイン判定 ----> LoginActivity という遷移で, <br />
FLAG_ACTIVITY_CLEAR_TOPフラグを付加したインテントにより MainActivity を経由すれば, MainActivity 以外がスタックから廃棄され上手くいくのではないか?と考えたのだが, <span class="Apple-style-span" style="color: #0b5394;">MainActivity にはnohistory属性がついており</span>, これがあるとうまくいかないという現象に陥った。<br />
<br />
<span class="Apple-style-span" style="color: red;">つまり, nohistory属性 がついていると, スタックに積まれないないため, FLAG_ACTIVITY_CLEAR_TOPを利用してもActivityが破棄されないのではないか</span>という結論に至る(間違ってたらすいません)<br />
<br />
<br />
実際には, ログインごはログイン画面にはバックキーでは戻れないようにするため, LoginActivityにもnohistory属性をつけるので, そうすると場合①もできないんですよね。笑<br />
だって, MainActivity と LoginActivity が nohistory でスタックが<br />
____________________________________<br />
| HogeActivity<br />
____________________________________<br />
<br />
となると考えられるわけですから。。。<br />
<br />
<br />
つまり, この方法だと上手なログアウト処理ができませんでした。<br />
<br />
ログアウトした場合, LoginActivity を除いた全ての Activity をスタックから排除するにはどうすればいいのか・・・。<br />
ということで、<a href="http://michelle-gf.blogspot.com/2011/03/blog-post_9055.html">次回</a>はこの解決法を説明します。ゆちゃんhttp://www.blogger.com/profile/12754048020092995283noreply@blogger.com0