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ブログ: #日本語ハッシュタグ
こちらの対応。
以前はハッシュタグの対応に正規表現を利用していたかと思いますが、最近は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
他の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>
Mac OS XにPEARのインストール – ぱんぴーまっしぐら
うまく行かなくなってたので。
$ curl -O http://pear.php.net/go-pear.phar
$ php go-pear.phar
パイプでつなぐとreadlineがうまくいかないので別で実行。
ユーザー環境にインストールしようとするのでそのままEnter
~/pear/bin/pear help
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;
}
}
}
m2eclipseを利用する。
MacOSX(snow leopard)のMaven 3.0.2、Windows環境で昔インストールしたMaven 2.2.1の環境で動作した。
jreはJDKのものを指定しないとエラーでる。
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
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'];
システム環境設定>共有>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
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カードを再認識させる必要がある。