アーカイブ

投稿者のアーカイブ

GoogleIMEの設定

2012 年 4 月 24 日 コメントはありません

SSHを介してVimを使う人に感動的なESCキーを押すとESCキーが効きつつIMEがオフになる設定(Google日本語入力とVimの相性は最強!) – しふーのブログ

ことえりからインポートした設定+上記の設定をエクスポートした内容。
エクスポートファイルのデフォルトのファイル名はkeymap.txt

status	key	command
Composition	Backspace	Backspace
Composition	Ctrl ;	DisplayAsHalfWidth
Composition	Ctrl :	DisplayAsHalfAlphanumeric
Composition	Ctrl '	DisplayAsHalfAlphanumeric
Composition	Ctrl 0	DisplayAsHalfAlphanumeric
Composition	Ctrl 2	ConvertWithoutHistory
Composition	Ctrl 6	DisplayAsHiragana
Composition	Ctrl 7	DisplayAsFullKatakana
Composition	Ctrl 8	DisplayAsHalfWidth
Composition	Ctrl 9	DisplayAsFullAlphanumeric
Composition	Ctrl a	MoveCursorToBeginning
Composition	Ctrl b	MoveCursorLeft
Composition	Ctrl d	Delete
Composition	Ctrl e	MoveCursorToEnd
Composition	Ctrl Eisu	ToggleAlphanumericMode
Composition	Ctrl f	MoveCursorRight
Composition	Ctrl g	Cancel
Composition	Ctrl h	Backspace
Composition	Ctrl j	DisplayAsHiragana
Composition	Ctrl k	DisplayAsFullKatakana
Composition	Ctrl l	DisplayAsFullAlphanumeric
Composition	Ctrl Left	MoveCursorToBeginning
Composition	Ctrl m	Commit
Composition	Ctrl m	Commit
Composition	Ctrl Option 1	DisplayAsHiragana
Composition	Ctrl Option 2	DisplayAsFullKatakana
Composition	Ctrl Option 3	DisplayAsFullAlphanumeric
Composition	Ctrl Option 4	DisplayAsHalfWidth
Composition	Ctrl Option 5	DisplayAsHalfAlphanumeric
Composition	Ctrl Right	MoveCursorToEnd
Composition	Delete	Delete
Composition	Eisu	ToggleAlphanumericMode
Composition	Enter	Commit
Composition	ESC	Cancel
Composition	F10	DisplayAsHalfAlphanumeric
Composition	F2	ConvertWithoutHistory
Composition	F6	DisplayAsHiragana
Composition	F7	DisplayAsFullKatakana
Composition	F8	DisplayAsHalfKatakana
Composition	F9	DisplayAsFullAlphanumeric
Composition	Left	MoveCursorLeft
Composition	Option a	DisplayAsHalfWidth
Composition	Option c	DisplayAsFullAlphanumeric
Composition	Option F1	DisplayAsHiragana
Composition	Option F2	DisplayAsFullKatakana
Composition	Option F3	DisplayAsFullAlphanumeric
Composition	Option F4	DisplayAsHalfWidth
Composition	Option F5	DisplayAsHalfAlphanumeric
Composition	Option j	MoveCursorLeft
Composition	Option l	MoveCursorRight
Composition	Option s	DisplayAsHalfAlphanumeric
Composition	Option Space	InsertFullSpace
Composition	Option x	DisplayAsFullKatakana
Composition	Option z	DisplayAsHiragana
Composition	Right	MoveCursorRight
Composition	Space	Convert
Composition	Tab	PredictAndConvert
Conversion	Backspace	Cancel
Conversion	Ctrl ;	DisplayAsHalfWidth
Conversion	Ctrl :	DisplayAsHalfAlphanumeric
Conversion	Ctrl '	DisplayAsHalfAlphanumeric
Conversion	Ctrl 0	DisplayAsHalfAlphanumeric
Conversion	Ctrl 6	DisplayAsHiragana
Conversion	Ctrl 7	DisplayAsFullKatakana
Conversion	Ctrl 8	DisplayAsHalfWidth
Conversion	Ctrl 9	DisplayAsFullAlphanumeric
Conversion	Ctrl a	SegmentFocusFirst
Conversion	Ctrl b	SegmentFocusLeft
Conversion	Ctrl d	SegmentFocusRight
Conversion	Ctrl e	ConvertPrev
Conversion	Ctrl f	SegmentFocusRight
Conversion	Ctrl h	Cancel
Conversion	Ctrl i	SegmentWidthShrink
Conversion	Ctrl j	DisplayAsHiragana
Conversion	Ctrl k	DisplayAsFullKatakana
Conversion	Ctrl l	DisplayAsFullAlphanumeric
Conversion	Ctrl Left	SegmentFocusFirst
Conversion	Ctrl m	Commit
Conversion	Ctrl n	ConvertNext
Conversion	Ctrl o	SegmentWidthExpand
Conversion	Ctrl Option 1	DisplayAsHiragana
Conversion	Ctrl Option 2	DisplayAsFullKatakana
Conversion	Ctrl Option 3	DisplayAsFullAlphanumeric
Conversion	Ctrl Option 4	DisplayAsHalfWidth
Conversion	Ctrl Option 5	DisplayAsHalfAlphanumeric
Conversion	Ctrl p	ConvertPrev
Conversion	Ctrl q	SegmentWidthShrink
Conversion	Ctrl Right	SegmentFocusLast
Conversion	Ctrl s	SegmentFocusLeft
Conversion	Ctrl w	SegmentWidthExpand
Conversion	Ctrl x	ConvertNext
Conversion	Down	ConvertNext
Conversion	Enter	Commit
Conversion	ESC	Cancel
Conversion	F10	DisplayAsHalfAlphanumeric
Conversion	F6	DisplayAsHiragana
Conversion	F7	DisplayAsFullKatakana
Conversion	F8	DisplayAsHalfWidth
Conversion	F9	DisplayAsFullAlphanumeric
Conversion	Left	SegmentFocusLeft
Conversion	Option a	DisplayAsHalfWidth
Conversion	Option c	DisplayAsFullAlphanumeric
Conversion	Option F1	DisplayAsHiragana
Conversion	Option F2	DisplayAsFullKatakana
Conversion	Option F3	DisplayAsFullAlphanumeric
Conversion	Option F4	DisplayAsHalfWidth
Conversion	Option F5	DisplayAsHalfAlphanumeric
Conversion	Option i	ConvertPrev
Conversion	Option k	ConvertNext
Conversion	Option s	DisplayAsHalfAlphanumeric
Conversion	Option x	DisplayAsFullKatakana
Conversion	Option z	DisplayAsHiragana
Conversion	PageDown	ConvertNextPage
Conversion	PageUp	ConvertPrevPage
Conversion	Right	SegmentFocusRight
Conversion	Shift Down	ConvertNextPage
Conversion	Shift Left	SegmentWidthShrink
Conversion	Shift Right	SegmentWidthExpand
Conversion	Shift Space	ConvertPrev
Conversion	Shift Tab	ConvertPrev
Conversion	Shift Up	ConvertPrevPage
Conversion	Space	ConvertNext
Conversion	Tab	PredictAndConvert
Conversion	Up	ConvertPrev
DirectInput	Ctrl Shift r	Reconvert
Precomposition	Backspace	Revert
Precomposition	Ctrl Backspace	Undo
Precomposition	Ctrl Eisu	ToggleAlphanumericMode
Precomposition	Ctrl Shift r	Reconvert
Precomposition	Eisu	ToggleAlphanumericMode
Precomposition	Shift Space	InsertAlternateSpace
Precomposition	Space	InsertSpace
Suggestion	Ctrl n	PredictAndConvert
Suggestion	Down	PredictAndConvert
Suggestion	Shift Enter	CommitFirstSuggestion
DirectInput	Escape	CancelAndIMEOff
Precomposition	Escape	CancelAndIMEOff
Composition	Escape	CancelAndIMEOff
Conversion	Escape	CancelAndIMEOff
Suggestion	Escape	CancelAndIMEOff
Prediction	Escape	CancelAndIMEOff
Composition	Hankaku/Zenkaku	IMEOff
Composition	Kanji	IMEOff
Composition	OFF	IMEOff
Composition	ON	IMEOn
Conversion	Hankaku/Zenkaku	IMEOff
Conversion	Kanji	IMEOff
Conversion	OFF	IMEOff
Conversion	ON	IMEOn
DirectInput	Hankaku/Zenkaku	IMEOn
DirectInput	Kanji	IMEOn
DirectInput	ON	IMEOn
Precomposition	Hankaku/Zenkaku	IMEOff
Precomposition	Kanji	IMEOff
Precomposition	OFF	IMEOff
Precomposition	ON	IMEOn
カテゴリー: 日記 タグ:

twitter日本語ハッシュタグの対応

2011 年 7 月 13 日 コメントはありません

Twitterブログ: #日本語ハッシュタグ
こちらの対応。

以前はハッシュタグの対応に正規表現を利用していたかと思いますが、最近はstatusからハッシュタグ情報がとれます。
GET statuses/show/:id | Twitter Developers
include_entities=trueでhashtagsがとれてその中にハッシュタグ情報が。

APIのバグかと思われますが、「ー」で終了しているタグがhashtagsにはいってきません。
api.twitter.com/1/statuses/show/90961863306772481.xml?include_entities=true
バグレポートすればそのうち直るのかな。

searchAPIにはそもそもハッシュタグ情報が含まれないので現状では解決策なし。
GET search | Twitter Developers

カテゴリー: 日記 タグ:

Androidでtwitter4jを利用してOAuth認証(ブラウザ)

2011 年 7 月 4 日 コメントはありません

他のIntentから遷移し、URL表示しないブラウザを立ち上げ認証したらhogehoge。

public class OAuthActivity extends Activity {
    final private String CONSUMER_KEY = "xxxxxx";
    final private String CONSUMER_SECRET = "xxxxxx";

    private String CALLBACK_URL = "myapp://oauth";
    private OAuthAuthorization oauth;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        WebView webview = new WebView(this);
        setContentView(webview);

        Configuration config = new ConfigurationBuilder().build();
        oauth = new OAuthAuthorization(config);
        oauth.setOAuthConsumer(CONSUMER_KEY, CONSUMER_SECRET);
        oauth.setOAuthAccessToken(null);
        try {
            String url = oauth.getOAuthRequestToken(CALLBACK_URL).getAuthorizeURL();
            webview.loadUrl(url);
        } catch (TwitterException e) {
            Toast.makeText(this, R.string.twitter_failed, Toast.LENGTH_LONG).show();
            finish();
        }
    }

    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);

        Uri uri = intent.getData();
        if (uri != null && uri.toString().startsWith(CALLBACK_URL)) {
            String verifier = uri.getQueryParameter("oauth_verifier");
            try {
                AccessToken at = oauth.getOAuthAccessToken(verifier);
                Log.d(getLocalClassName(), "screen_name = " + at.getScreenName());
                Log.d(getLocalClassName(), "access_token = " + at.getToken());
                Log.d(getLocalClassName(), "access_token_secret = " + at.getTokenSecret());
                // hogehoge
                Toast.makeText(this, R.string.twitter_login_success, Toast.LENGTH_LONG).show();
                finish();
            } catch (Exception e) {
                Log.w(getLocalClassName(), e.getMessage());
                Toast.makeText(this, R.string.twitter_login_failed, Toast.LENGTH_LONG).show();
                finish();
            }
        }
    }
}

AndroidManifest.xml該当箇所。
lunchModeで多重起動させない。
あとヒストリー残さない。
ブラウザから「myapp://oauth」でIntentが起動するように。

        <activity
            android:name=".OAuthActivity"
            android:launchMode="singleTask"
            android:noHistory="true"
            >
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />
                <data android:scheme="myapp" android:host="oauth" />
            </intent-filter>
        </activity>
カテゴリー: android タグ: , , ,

Mac OS XにPEARのインストール

2011 年 7 月 1 日 コメントはありません

Mac OS XにPEARのインストール – ぱんぴーまっしぐら
うまく行かなくなってたので。

$ curl -O http://pear.php.net/go-pear.phar
$ php go-pear.phar

パイプでつなぐとreadlineがうまくいかないので別で実行。
ユーザー環境にインストールしようとするのでそのままEnter

~/pear/bin/pear help
カテゴリー: php タグ: ,

Androidで画像を選択し、画像を切り抜く(クロップ)するサンプル

2011 年 6 月 20 日 コメントはありません

layoutはボタン置いてあるだけなので省略。
ボタンクリック>ギャラリーから画像選択>クロップ>なんかするhogehoge。
クロップ後のサイズ(outputX、outputY)が大きすぎるとエラーでて利用できない。
壁紙サイズは無理。

package com.example.crop;

import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MainActivity extends Activity implements OnClickListener {

    final private int REQUEST_CODE_GALLERY = 10;
    final private int REQUEST_CODE_CROP = 11;

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

        Button button_background = (Button)findViewById(R.id.button_background);
        button_background.setOnClickListener(this);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (resultCode == RESULT_OK) {
            switch (requestCode) {
            case REQUEST_CODE_GALLERY:
                Intent intent = new Intent("com.android.camera.action.CROP");
                intent.setData(data.getData());
                intent.putExtra("outputX", 48);
                intent.putExtra("outputY", 48);
                intent.putExtra("aspectX", 1);
                intent.putExtra("aspectY", 1);
                intent.putExtra("scale", true);
                intent.putExtra("return-data", true);
                startActivityForResult(intent, REQUEST_CODE_CROP);
                break;
            case REQUEST_CODE_CROP:
                Bundle ext = data.getExtras();
                if (ext != null) {
                    Bitmap bitmap = ext.getParcelable("data");
                    // hogehoge
                }
                break;
            }
        }
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.button_background:
            Intent intent = new Intent();
            intent.setType("image/*");
            intent.setAction(Intent.ACTION_GET_CONTENT);
            startActivityForResult(intent, REQUEST_CODE_GALLERY);
            break;
        }
    }
}
カテゴリー: android タグ:

Eclipse 3.6(Helios)でMavenを利用する

2011 年 5 月 25 日 コメントはありません

m2eclipseを利用する。
MacOSX(snow leopard)のMaven 3.0.2、Windows環境で昔インストールしたMaven 2.2.1の環境で動作した。
jreはJDKのものを指定しないとエラーでる。

カテゴリー: 日記 タグ: ,

AsyncTaskのcancel時の動き

2011 年 5 月 11 日 コメントはありません

Android 2.1 update 1 ~ Android 2.3.2
AsyncTaskのcancel(true)を外部から呼んだ場合と、doInBackgroundで呼んだ場合挙動が異なる。
あと、cancelしてもdoInBackgroundは最後まで実行される。

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

        new AsyncTask<Void, Integer, Void>() {
            @Override
            protected Void doInBackground(Void... params) {
                for (int i = 0, cnt = 10; i < cnt; i++) {
                    publishProgress(i);
                    SystemClock.sleep(1000);
                    if (i == 5) {
                        cancel(true);
                    }
                }
                return null;
            }
            @Override
            public void onProgressUpdate(Integer... values) {
                Log.d(getLocalClassName(), "count "+values[0]);
            }
            @Override
            protected void onCancelled() {
                Log.d(getLocalClassName(), "onCancelled");
            }
            @Override
            protected void onPostExecute(Void result) {
                Log.d(getLocalClassName(), "onPostExecute");
            }
        }.execute();
    }
}

結果

count 0
count 1
count 2
count 3
count 4
count 5
onPostExecute
count 6
count 7
count 8
count 9
public class MainActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        AsyncTask<Void, Integer, Void> task = new AsyncTask<Void, Integer, Void>() {
            @Override
            protected Void doInBackground(Void... params) {
                for (int i = 0, cnt = 10; i < cnt; i++) {
                    publishProgress(i);
                    SystemClock.sleep(1000);
                }
                return null;
            }
            @Override
            public void onProgressUpdate(Integer... values) {
                Log.d(getLocalClassName(), "count "+values[0]);
            }
            @Override
            protected void onCancelled() {
                Log.d(getLocalClassName(), "onCancelled");
            }
            @Override
            protected void onPostExecute(Void result) {
                Log.d(getLocalClassName(), "onPostExecute");
            }
        };
        task.execute();

        SystemClock.sleep(5000);
        task.cancel(true);
    }
}

結果

count 0
count 1
count 2
count 3
count 4
onCancelled
count 5
count 6
count 7
count 8
count 9
カテゴリー: android タグ: ,

Apacheのリバースプロキシを利用してSERVER_NAMEが取れない時

2011 年 5 月 6 日 コメントはありません

Apacheのリバースプロキシを利用して、SERVER_NAMEがリバースプロキシサーバのIPになっちゃう場合は、リバースプロキシ側のApacheに以下の設定を追加。

ProxyPreserveHost On

PHPプログラムでSERVER_NAMEの値を超利用しまくりな場合は、問題ないようならぶち込んじゃってもいいかも。

$_SERVER['SERVER_NAME'] = isset($_SERVER['X_FORWARDED_HOST']) ? $_SERVER['X_FORWARDED_HOST'] : $_SERVER['SERVER_NAME'];
カテゴリー: linux タグ: ,

Mac OSXでApacheの利用

2011 年 5 月 4 日 コメントはありません

システム環境設定>共有>Web共有をチェック

httpd.confの設定

$ sudo vim /etc/apache2/httpd.conf

設定を上書きできないと困るので180行目のAllowOverrideを変更

    AllowOverride All

PHPを利用可能にするため116行目のコメントアウトを外す

LoadModule php5_module        libexec/apache2/libphp5.so

ヴァーチャルホストの設定ファイルvhosts以下に配置し読み込めるように最後の行に追加
デフォルトだと469行目でヴァーチャルホストの設定を読み込んでいるようだが、最終行のIncludeでPHPの設定が行われているので、それ以降に設定を書かないとPHPを利用できないため

Include /private/etc/apache2/vhosts/*.conf

ヴァーチャルホストの設定ファイルを作成
ファイル名はお好みで

$ sudo vim /etc/apache2/vhosts/httpd-vhosts-hoge.example.com.conf

ファイルはhogeユーザのSite以下にドメインディレクトリを作成し、そこをドキュメントルートにしています
localhostから接続できるようにAllow fromを追加

<VirtualHost *:80>
    ServerName hoge.example.com
    DocumentRoot /Users/hoge/Sites/hoge.example.com
    <Directory /Users/hoge/Sites/hoge.example.com>
        Allow from ::1
        Allow from 127.0.0.1
    </Directory>
    ErrorLog /var/log/apache2/hoge.example.com-error_log
    CustomLog /var/log/apache2/hoge.example.com-access_log combined
</VirtualHost>

Apache設定ファイルにミスがないかチェック

sudo apache2ctl configtest

大丈夫なようなら再起動

sudo apache2ctl -k restart

hostsファイルに名前解決できるように追加

sudo vim /etc/hosts
::1 hoge.example.com
127.0.0.1 hoge.example.com
カテゴリー: macosx タグ: ,

androidエミュレータのSDカードにファイルを転送する

2011 年 4 月 21 日 コメントはありません

DDMSのファイル・エクスプローラだとGUIで簡単に転送できますが、テスト用に大量に転送する必要があったのでadbコマンドを利用します。
Windowsでのお話。

転送コマンド自体は以下。

adb push ファイル名 /sdcard/転送先

SDカードは「/sdcard」としてマウントされています。

実機のSDカードをGドライブにマウントし、downloadフォルダ内のgifファイルをエミュレータのSDカード内のdownloadフォルダに転送します。
実機も認識しているため、adbのオプションで実行先をエミュレータとする「-e」オプションを指定。

for %A in (G:\download\*.gif) do adb -e push %~fA /sdcard/download

転送後、エミュレータのアプリケーション一覧から「Dev Tools > Media Scanner」でSDカードを再認識させる必要がある。

カテゴリー: android タグ: