2013年12月4日水曜日

iMac27インチが3回に1回しか起動しなくなった

家のiMac27インチの電源を付けてもジャーンっていう音が鳴って、
そのまま起動しない現象が発生した。

いくら待っても起動しないので電源ボタンを押して強制終了する。
再度電源を入れても同じ現象で起動しない。

これを3回繰り返してようやく起動する。

OSをMavericks(Mac OS X 10.9)にアップデートしてようやく現象がなるなりました。
今のところは。

OS的な問題だったようです。
ウイルスなのか、仕組まれたものなのか。。。

とりあえず解決されたのでよかたです。

2013年10月12日土曜日

EOS Kiss x7で巡るグルメブログ

念願のデジタル一眼を買いました!
キャノンのEOS Kiss x7、コンパクト軽量ということでこれに決定。
カメラについては素人なため機能は無視w

せっかく買ったからにはなんか撮りたい!!ということでご飯食べたら
写真撮ってブログに書こうと思います。

記念すべき第1回は東小金井駅から徒歩1分の中華料理店「宝華」です^^
ぱちぱちぱち

東小金井駅をよく利用する筆者はこの店を前から気になっていました!
ときどき行列ができるくらいのお店だったので。

ようやく突撃できました!!

さぁカメラをもってご飯とか観光客みたいですがそんなことは気にしない!!
さーなにを食べたか!写真を見て下さい!なんと綺麗!素人でこの絵!!

このチャーハン、一見シンプルに見えるごく普通のチャーハンに見える。
なんだー、普通のチャーハンじゃんと思って落胆した。

とりあえず一口食べてみた。

(((;・ж;・;)))ぶるぶるぶる
めちゃくちゃ美味いやないか!!!!

美味すぎてあっという間に完食テヘペロ

そしてメインのこの油そば【宝そば】。
たからそばと読むらしい。

チャーハンの後だから期待値は高い。相当高いから。

パクリ。。。

(;・ж;・;)(;・ж;・;)

美味い!!!!!

次!! 
 これは連れのを一口貰った。
美味い!

 俺の期待値はぐんぐん上がり、絶頂に達した。

すべての期待をこの餃子にのせた。
どんなうまい餃子なんだと。。

すでにおなかいっぱいだが、一口ぱくり


(;・ж;・;)(;・ж;・;)(;・ж;・;)(;・ж;・;)(;・ж;・;)

こ、これは、(;・ж;・;)


ぜんぜん



美味しくない。。。。。


( ´;゚;∀;゚;)なんで?!



もう一口。



( ´;゚;∀;゚;)( ´;゚;∀;゚;)やっぱり美味しくない。



という訳で。

餃子以外はとりあえずめちゃくちゃ美味い中華料理店【宝華】

詳細はウェブで見て下さい。
http://www.k-houka.com/

結構有名なんですねー!

2013年8月30日金曜日

在日中国人が香港(マカオも)に旅行に行くための詳細手順

日本人パスポートで香港に旅行に行くにはなんも不便はないですが、

中国人パスポートで行こうとすると【通行証】なるものが必要になる。

いろいろネットで調べると情報が載っています。
行ったことがある人だと分かると思いますけど、行ったことがない人だと
具体的にどうすればいいのか分からないので、メモ程度に書いておきます。

在日中国人が香港(マカオ)に旅行にいくためにやること。

1、旅行会社で予約する
2、中国大使館(領事館)で香港進入許可を取得する

1はいいとして、2ですね。
詳細はここにも書いてありますのでご参考までに。
http://www.china-embassy.or.jp/jpn/lsfu/oo99/t913435.htm

2について詳細を書いておきます。
■行く前に持ち物
パスポート、外国人登録証、証明写真(※大きさ注意)、20円、旅行会社からもらう旅程表(滞在先、フライト番号)
※証明写真:領事館で撮ることができるが、自前で持ってくときは大きさに注意した方がいいです。よほど変わった大きさの写真でなければ受理されると思いますけど。
※20円:パスポートと外国人登録証をコピーするため

■領事館にいくまで
今回は渋谷駅から都バス01「新橋駅いき」に乗って「西麻布」で降りて、
歩きました。もしハチ公前に出ちゃったら、JR抜けて行かないとだめです。
分からなかったら聞くといいです。バス停が多すぎて初心者の俺には迷うレベルでした。

■領事館での流れ
・入り口で簡単な手荷物検査
・証明写真を持参してない場合はまずは写真を撮っておきましょう。混んでたら先に書類を書きましょう。
 ※1回も複数回も同じなので複数回にチェックしておきましょ!
  俺は1回でやっても受付のお姉さんに複数回にしときますねって言われました。
・3Fに上がって、エレベータ横のインフォメーションカウンターにある書類を取って記入する
・記入する項目が多いので覚悟して下さい。
 ※分からなかったらインフォメーションのお姉さんに聞いて下さい。
・記入が終わったらインフォメーションで順番待ち番号を貰って待ちます。
・待ってる間にパスポートと外国人登録証のコピーをしてしまします。
・基本的に受理されて3日後に受け取ります。
 ※8/29→9/3


こんな感じです。
1回行ってしまえば何でもないんですけどね。

2013年7月21日日曜日

Android2.3.3でAsyncTaskLoaderを使おう

Android2.3.3でアプリを開発しています。

バックグラウンドで通信して、取ってきたデータをキャッシュしてユーザに提示するような、
よくあるアプリケーションを制作しています。
実際にはアップデートを担当しています。

現在、アプリのバックグラウンド処理にはAsyncTaskを利用しています。
AsyncTaskについて調べているとAndroid3.0からはAsyncTaskは非推奨になっていて、
代わりにAsyncTaskLoaderなるものが登場していることを知った。

http://www.srv-shinra.com/wordpress/?p=308

を見てもわかるようにそういうことだそうです。
APIレベルを上げてやればいいのですが、Android.2.3.3のユーザも結構いるため、
そう簡単に切り捨てることはできません。

でも、AsyncTaskはcancel処理あたりに問題があるという記事をチラホラみかけます。
例えば、

GCMのIntentServiceでAsyncTaskを実行したらsending message to a Handler on a dead threadの警告が出て悩まされる


に取り上げられていることが発生するみたいです。
回避するためにはThreadを使ったりするみたいですが、それも面倒です。

だから、Android2.3.3でもAsyncTaskLoaderを使いたいという結論に至りました。
でも、ネット上で実装している人の情報をあまり見つけることができません。
調べ方が悪いのか。。。

でも、SupportLibraryにLoaderManagerとかあるのになんでActivityにgetLoaderManagerメソッドがないの??

と思っていろいろ調べていたら、FragmentActivityに実装されていました。
なるほど、もうActivityで作るのは時代遅れなのですね。。

でも、ActivityにないLoaderManagerさえ自前で自作してしまえば
ActivityでもAsyncTaskLoaderが使えるようです。

Androidソースコードを見ると、LoaderManagerはAbstractなので実際に実装されているクラスは、
LoaderManagerImplというクラスがありました。

それを参考にしてLoaderManagerだけ実装してやれば実現できそうです。
HashMapで管理するLoaderManagerを実装して簡単に試してみたらできました。

でも、もうActivityはもう時代遅れなのか?!。。。

Androidソースを除いてたらSparseArrayなるクラスがあることを知った。

「AndroidのSparseArrayは本当に速いのか測定してみた」
http://thinking-megane.blogspot.jp/2012/06/androidsparsearray.html

ここを見ると以降SparseArrayを使おうと思いました。

結局、今回の調べごとで勉強したことは、
・FragmentActivityをつけば問題は解決されることと
・SparseArrayはHashMapより速い
でした。

収穫収穫!!

以下は実装途中ですが、こんな感じでLoaderManagerを実装すればActivity(Android2.3.3)でもAsyncTaskLoaderが使えるということです。
--------
package com.example.asyncloadertest;

import java.io.FileDescriptor;
import java.io.IOException;
import java.io.PrintWriter;

import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;

import android.content.Context;
import android.support.v4.content.AsyncTaskLoader;

public class TestLoader extends AsyncTaskLoader<String> {

    String result;

    public TestLoader(Context context) {
super(context);
    }

    @Override
    public String loadInBackground() {
DefaultHttpClient client = new DefaultHttpClient();
HttpGet get = new HttpGet("http://www.yahoo.co.jp/");
try {
    HttpResponse execute = client.execute(get);
    String res = EntityUtils.toString(execute.getEntity());
    return res;
} catch (ClientProtocolException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
}
return null;
    }

    @Override
    public void deliverResult(String data) {
if (isReset()) {
    if (this.result != null) {
this.result = null;
    }
    return;
}

this.result = data;

if (isStarted()) {
    super.deliverResult(data);
}
    }

    @Override
    protected void onStartLoading() {
if (this.result != null) {
    deliverResult(this.result);
}
if (takeContentChanged() || this.result == null) {
    // これをやっておくとonCreateLoaderで開始処理をしなくてよくなる
    forceLoad();
}
    }

    @Override
    protected void onStopLoading() {
super.onStopLoading();
cancelLoad();
    }

    @Override
    protected void onReset() {
super.onReset();
onStopLoading();
    }

    @Override
    public void dump(String prefix, FileDescriptor fd, PrintWriter writer,
    String[] args) {
super.dump(prefix, fd, writer, args);
writer.print(prefix);
writer.print("result=");
writer.println(this.result);
    }

}
--------
package com.example.asyncloadertest;

import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.util.HashMap;

import android.os.Bundle;
import android.app.Activity;
import android.support.v4.app.LoaderManager;
import android.support.v4.app.LoaderManager.LoaderCallbacks;
import android.support.v4.content.Loader;
import android.util.Log;
import android.view.Menu;
import android.widget.TextView;

public class AsyncTascLoaderTestActivity extends Activity implements LoaderCallbacks<String> {

    // Yahooをロードする
    public static final int TASK_001 = 0x00001;
    
    LoaderManager loaderManager = new LoaderManager() {
        HashMap<Integer, Loader<String>> loaders = new HashMap<Integer, Loader<String>>();
        
        @Override
        public <String> Loader<String> restartLoader(int arg0, Bundle arg1,
        LoaderCallbacks<String> arg2) {
    return null;
        }
        
        /**
         * ローダの初期化
         */
        @Override
        public <String> Loader<String> initLoader(int arg0, Bundle arg1,
        LoaderCallbacks<String> arg2) {
            Log.d("Called","initLoader");
    Loader<String> loader = arg2.onCreateLoader(arg0, arg1);
    // do initialize...
    loaders.put(arg0, (Loader<String>) loader);
    return loader;
        }
        
        @Override
        public <String> Loader<String> getLoader(int arg0) {
            Log.d("Called","getLoader");
    return (Loader<String>) loaders.get(arg0);
        }
        
        @Override
        public void dump(String arg0, FileDescriptor arg1, PrintWriter arg2,
        String[] arg3) {
            // nothing
        }
        
        /**
         * 破棄
         * これより前にロードを止めるべき
         */
        @Override
        public void destroyLoader(int arg0) {
            Log.d("Called","destroyLoader");
            loaders.remove(arg0);
        }
    };
    // TextView
    TextView view;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_async_tasc_loader_test);
// ローダー初期化
loaderManager.initLoader(TASK_001, null, this);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.async_tasc_loader_test, menu);
return true;
    }

    /**
     * ローダー作成
     */
    @Override
    public Loader<String> onCreateLoader(int arg0, Bundle arg1) {
        Log.d("Called","onCreateLoader");
// Create
TestLoader loader = new TestLoader(this);
return loader;
    }

    /**
     * バックグラウンド処理が終わったら
     */
    @Override
    public void onLoadFinished(Loader<String> arg0, String arg1) {
        Log.d("Called","onLoadFinished");
view = (TextView) findViewById(R.id.view);
if (arg0 != null && arg0.getId() == TASK_001) {
    view.setText(arg1);
}
    }

    /**
     * 処理がリセットされたら
     */
    @Override
    public void onLoaderReset(Loader<String> arg0) {
if (view != null)
    view.setText("Loader is reset");
    }


}
--------

jQueryでtableをまるごとソートするためには

HTMLでテーブルを組んだあとで、何かをキーにして並べ替えをしたい、
そういうこと(機能)を実装したい場合があると思います。

JSのsort関数(定義に関しては下の方にまとめているので見てください)と
jQueryを組み合わせることで結構簡単にできたので備忘録しときます。

改善、もっと簡単にできるってのがあればコメントお願い致します。

sort関数は配列を簡単に並べ替えることができます。

よくある例では以下のような配列をソートします。
var a = [2, 1, 4, 3];

それを応用して以下のような配列をソートします。
var b = [object, object, object];

具体例を見ながらの方がいいと思います。
例)以下のテーブルを入力されたキーをもとにソートし直したい

<a id='resort' href='#'/>並べなおす</a>
<table>

<tr class='sort_item'>
  <td class='sort_key'>
    <input type='text' name='hoge1' value="0"/>
  </td>
  <td>
  ....
  </td>
</tr>

<tr class='sort_item'>
  <td class='sort_key'>
    <input type='text' name='hoge2' value=""/>
  </td>
  <td>
  ....
  </td>
</tr>

<tr class='sort_item'>
  <td class='sort_key'>
    <input type='text' name='hoge3' value="a"/>
  </td>
  <td>
  ....
  </td>
</tr>

<tr class='sort_item'>
  <td class='sort_key'>
    <input type='text' name='hoge4'  value="4"/>
  </td>
  <td>
  ....
  </td>
</tr>



</table>

jQueryで並べなおす機能を実装するには以下の2ステップをコーディングするだけ。

1、ソート対象配列を取得
【実装】
var sortItem = $('.sort_item');

2、ソート関数を実装
【実装】
sortItem.sort(function(a, b){
  //ここに比較処理を書く
  //返却は-1, 0 , 1のどれか
});

いろいろ検証してsort関数について理解を深めていきます。
検証はChrome28を使ってます。

★検証パターン1
引数aとbには何が入ってくるのか!?
【ソースコード】
<html>
<head><title>sort test</title>
<meta charset="utf-8"/>
<script src="http://code.jquery.com/jquery-1.10.1.min.js"></script>
<script>
$(document).ready(function(){
$("#resort").click(function(){
var sortItem = $('.sort_item');
sortItem.sort(function(a, b){
//検証パターン1
//出力
console.log(a);
console.log(b);
});
});
});
</script>
</head>
<body>
<a id='resort' href='#'/>並べなおす</a>
<table>

<tr class='sort_item'>
  <td class='sort_key'>
    <input type='text' name='hoge1' value="0"/>
  </td>
  <td>
  0
  </td>
</tr>

<tr class='sort_item'>
  <td class='sort_key'>
    <input type='text' name='hoge2' value=""/>
  </td>
  <td>
  ....
  </td>
</tr>

<tr class='sort_item'>
  <td class='sort_key'>
    <input type='text' name='hoge3' value="a"/>
  </td>
  <td>
  a
  </td>
</tr>

<tr class='sort_item'>
  <td class='sort_key'>
    <input type='text' name='hoge4'  value="4"/>
  </td>
  <td>
  4
  </td>
</tr>
</body>
</html>

【結果】
出力は以下のようになりました。
これ順番に隣同士の要素を引数a、bに与えてるんですね。
-------

-------


さて、本題に戻ります。
これで引数に何が入ってくるかわかりました。

そこからキーを取って来てくらべればいいということです。

var aKey = $(a).find(".sort_key").val();
var bKey = $(b).find(".sort_key").val();
if (aKey > bKey) return -1;
else if (aKey < bKey) return 1;
else return 0;

という感じにすればいいということですね。

これでいろいろ応用が利くようになりますね!


■sort関数の定義
元情報(https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/sort)に基づいて話しています。

構文は【array.sort(compareFunction);】で定義されています。

この引数のcompareFunctionが今回のミソです。
元情報から引用すればcompareFunctionは「ソート順を定義する関数を指定します。省略された場合、配列を各要素の文字列比較に基づき辞書順にソートされます。」だそうです。


compareFunction が与えられた場合、配列の要素は比較関数の返り値に基づきソートされます。もし a と b が比較されようとしている要素の場合、
  • compareFunction(a, b) が 0 未満の場合、a を b より小さい添字にソートします。
  • compareFunction(a, b) が 0 を返す場合、a と b は互いに関して変えることなく、他のすべての要素に関してソートします。注意: ECMAScript 標準はこの振る舞いを保証しておらず、そのため一部のブラウザ (例えば、遅くとも 2003 年以前のバージョンの Mozilla) はこれを尊重していません。
  • compareFunction(a, b) が 0 より大きい場合、b を a より小さい添字にソートします。
(元情報より引用)

2013年5月21日火曜日

Nexus7にUbuntuをインストールする際に発生するエラー


Downloaded images failed checksum validation


こんなエラーが発生して先に進めなくて大変でしたが原因は単純です。

チェックサムファイルにあるべきファイルがダウンロードされていないため
チェックサムが通らなかっただけ。

解決策も簡単。

足りないファイルをダウンロードしてすでに~/Downloads/UbuntuNexus7/に入れる
もっかいインストールを始める。
※ディレクトリ名が間違ってるかもしれませんが、すでにダウンロードしてあるところに入れるだけなので

こんどはあっさり通ってぽかんとするはず!!

2013年4月29日月曜日

firefox OSアプリをマーケットの審査基準について

先日(4/25)、firefoxOSに関するセミナーに参加してきました。
Mozilla Japanのdynamisさんの話を聞いてきました。

そこで気になった話のうちの一つ「マーケットプレースにアプリを出すためには」
というテーマに焦点をあててみます。

■Firefoxマーケットプレイスに登録する手順
1、アカウント作成(無料)
  下記のURLから登録を。
  https://marketplace.firefox.com/developers/
2、manifest.webappを登録
  ※launch_pathは注意が必要
   アプリの内部では「/」を「/index.html」に変換してくれないのでちゃんと書く必要がある。
   (例)"launch_path" : "/index.html"
3、アプリ情報を記載
  ※必要な情報を入れる。プライバシーポリシーは一言でもいいらしい。
4、レビュー完了をまつ
  ※問題はここ、どんなレビューが行われるのか詳細は下で。

■マーケットプレイスの意味
アプリを公開する手段の一つ。

■審査はどんなことをするのか?(プレゼン資料より引用)
コミュニティレビューを行う。
レビューは基準もレビュアーも全てオープンで公平だそうで。
動作まではレビューしない。
【アプリレビューの原則】
公平、思いやり、一貫性
 →制限する門番ではなく開発者の成功を助ける設定
品質保証は行わない
 →アプリを使うがコードレビューは行わない
アプリの見た目でなく動作を確認
 →デザインが悪くても構わないが動作しないと却下
疑わしきは罰せず
 →却下を決める前に開発者に質問します
【求められること】
プライバシーポリシーの明記(リンク)
主機能をレビュー担当者が確認可能に
対象プラットフォームに適したUI
 ×明らかにPC向けのサイトをモバイル用と登録
 ×画面中央だけ使って回り全部空白
正常にナビゲーションできること
 「戻る」ボタンに依存しないで使えること
 ボタンやリンクはクリックしやすく
【禁止されるコンテンツ例】

猥褻な素材、あるいは性や暴力の描写
知的財産など他者の権利を侵害するもの
ウィルスやスパイウェアなど
ギャンブルの宣伝、児童を搾取するもの
特定個人や団体を誹謗中傷するもの
ユーザを騙して金銭を振り込ませるもの
常識で考えて下さいとのこと。
【公開禁止となる場合】
フィッシング詐欺
スパム行為
コンテンツレーティング違反
端末速度低下、クラッシュ、データ損失
DDOSなどネットワーク攻撃用アプリ
その他、映画のネタになりそうなリスク 
総じて言えば、常識を考えてれば問題ないということですね。

次はアプリを本格的に作って行こうかと思います。