<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>ぱんぴーまっしぐら</title>
	<atom:link href="http://blog.cheki.net/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.cheki.net</link>
	<description>悲しみの果てに</description>
	<lastBuildDate>Wed, 13 Jul 2011 02:39:08 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>twitter日本語ハッシュタグの対応</title>
		<link>http://blog.cheki.net/archives/2364</link>
		<comments>http://blog.cheki.net/archives/2364#comments</comments>
		<pubDate>Wed, 13 Jul 2011 02:39:08 +0000</pubDate>
		<dc:creator>cockok</dc:creator>
				<category><![CDATA[日記]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://blog.cheki.net/?p=2364</guid>
		<description><![CDATA[Twitterブログ: ＃日本語ハッシュタグ こちらの対応。 以前はハッシュタグの対応に正規表現を利用していたかと思いますが、最近はstatusからハッシュタグ情報がとれます。 GET statuses/show/:id [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.jp.twitter.com/2011/07/blog-post.html">Twitterブログ: ＃日本語ハッシュタグ</a><br />
こちらの対応。</p>
<p>以前はハッシュタグの対応に正規表現を利用していたかと思いますが、最近はstatusからハッシュタグ情報がとれます。<br />
<a href="https://dev.twitter.com/docs/api/1/get/statuses/show/%3Aid">GET statuses/show/:id | Twitter Developers</a><br />
include_entities=trueでhashtagsがとれてその中にハッシュタグ情報が。</p>
<p>APIのバグかと思われますが、「ー」で終了しているタグがhashtagsにはいってきません。<br />
<a href="http://api.twitter.com/1/statuses/show/90961863306772481.xml?include_entities=true">api.twitter.com/1/statuses/show/90961863306772481.xml?include_entities=true</a><br />
バグレポートすればそのうち直るのかな。</p>
<p>searchAPIにはそもそもハッシュタグ情報が含まれないので現状では解決策なし。<br />
<a href="https://dev.twitter.com/docs/api/1/get/search">GET search | Twitter Developers</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.cheki.net/archives/2364/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Androidでtwitter4jを利用してOAuth認証(ブラウザ)</title>
		<link>http://blog.cheki.net/archives/2359</link>
		<comments>http://blog.cheki.net/archives/2359#comments</comments>
		<pubDate>Mon, 04 Jul 2011 05:07:36 +0000</pubDate>
		<dc:creator>cockok</dc:creator>
				<category><![CDATA[android]]></category>
		<category><![CDATA[oauth]]></category>
		<category><![CDATA[twitter]]></category>
		<category><![CDATA[twitter4j]]></category>

		<guid isPermaLink="false">http://blog.cheki.net/?p=2359</guid>
		<description><![CDATA[他のIntentから遷移し、URL表示しないブラウザを立ち上げ認証したらhogehoge。 public class OAuthActivity extends Activity { final private Stri [...]]]></description>
			<content:encoded><![CDATA[<p>他のIntentから遷移し、URL表示しないブラウザを立ち上げ認証したらhogehoge。</p>
<pre>
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 &#038;&#038; 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();
            }
        }
    }
}
</pre>
<p>AndroidManifest.xml該当箇所。<br />
lunchModeで多重起動させない。<br />
あとヒストリー残さない。<br />
ブラウザから「myapp://oauth」でIntentが起動するように。</p>
<pre>
        &lt;activity
            android:name=&quot;.OAuthActivity&quot;
            android:launchMode=&quot;singleTask&quot;
            android:noHistory=&quot;true&quot;
            &gt;
            &lt;intent-filter&gt;
                &lt;action android:name=&quot;android.intent.action.VIEW&quot; /&gt;
                &lt;category android:name=&quot;android.intent.category.DEFAULT&quot; /&gt;
                &lt;category android:name=&quot;android.intent.category.BROWSABLE&quot; /&gt;
                &lt;data android:scheme=&quot;myapp&quot; android:host=&quot;oauth&quot; /&gt;
            &lt;/intent-filter&gt;
        &lt;/activity&gt;
</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.cheki.net/archives/2359/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mac OS XにPEARのインストール</title>
		<link>http://blog.cheki.net/archives/2356</link>
		<comments>http://blog.cheki.net/archives/2356#comments</comments>
		<pubDate>Fri, 01 Jul 2011 08:52:44 +0000</pubDate>
		<dc:creator>cockok</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[osx]]></category>
		<category><![CDATA[pear]]></category>

		<guid isPermaLink="false">http://blog.cheki.net/?p=2356</guid>
		<description><![CDATA[Mac OS XにPEARのインストール – ぱんぴーまっしぐら うまく行かなくなってたので。 $ curl -O http://pear.php.net/go-pear.phar $ php go-pear.phar  [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.cheki.net/archives/2296">Mac OS XにPEARのインストール – ぱんぴーまっしぐら</a><br />
うまく行かなくなってたので。</p>
<pre>
$ curl -O http://pear.php.net/go-pear.phar
$ php go-pear.phar
</pre>
<p>パイプでつなぐとreadlineがうまくいかないので別で実行。<br />
ユーザー環境にインストールしようとするのでそのままEnter</p>
<pre>
~/pear/bin/pear help
</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.cheki.net/archives/2356/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Androidで画像を選択し、画像を切り抜く（クロップ）するサンプル</title>
		<link>http://blog.cheki.net/archives/2349</link>
		<comments>http://blog.cheki.net/archives/2349#comments</comments>
		<pubDate>Mon, 20 Jun 2011 05:45:37 +0000</pubDate>
		<dc:creator>cockok</dc:creator>
				<category><![CDATA[android]]></category>

		<guid isPermaLink="false">http://blog.cheki.net/?p=2349</guid>
		<description><![CDATA[layoutはボタン置いてあるだけなので省略。 ボタンクリック＞ギャラリーから画像選択＞クロップ＞なんかするhogehoge。 クロップ後のサイズ（outputX、outputY）が大きすぎるとエラーでて利用できない。  [...]]]></description>
			<content:encoded><![CDATA[<p>layoutはボタン置いてあるだけなので省略。<br />
ボタンクリック＞ギャラリーから画像選択＞クロップ＞なんかするhogehoge。<br />
クロップ後のサイズ（outputX、outputY）が大きすぎるとエラーでて利用できない。<br />
壁紙サイズは無理。</p>
<pre>
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;
        }
    }
}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.cheki.net/archives/2349/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Eclipse 3.6(Helios)でMavenを利用する</title>
		<link>http://blog.cheki.net/archives/2347</link>
		<comments>http://blog.cheki.net/archives/2347#comments</comments>
		<pubDate>Wed, 25 May 2011 10:13:23 +0000</pubDate>
		<dc:creator>cockok</dc:creator>
				<category><![CDATA[日記]]></category>
		<category><![CDATA[eclipse]]></category>
		<category><![CDATA[maven]]></category>

		<guid isPermaLink="false">http://blog.cheki.net/?p=2347</guid>
		<description><![CDATA[m2eclipseを利用する。 MacOSX(snow leopard)のMaven 3.0.2、Windows環境で昔インストールしたMaven 2.2.1の環境で動作した。 jreはJDKのものを指定しないとエラーで [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.eclipse.org/m2e/">m2eclipse</a>を利用する。<br />
MacOSX(snow leopard)のMaven 3.0.2、Windows環境で昔インストールしたMaven 2.2.1の環境で動作した。<br />
jreはJDKのものを指定しないとエラーでる。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.cheki.net/archives/2347/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>AsyncTaskのcancel時の動き</title>
		<link>http://blog.cheki.net/archives/2342</link>
		<comments>http://blog.cheki.net/archives/2342#comments</comments>
		<pubDate>Wed, 11 May 2011 11:42:18 +0000</pubDate>
		<dc:creator>cockok</dc:creator>
				<category><![CDATA[android]]></category>
		<category><![CDATA[AsyncTask]]></category>

		<guid isPermaLink="false">http://blog.cheki.net/?p=2342</guid>
		<description><![CDATA[Android 2.1 update 1 ～ Android 2.3.2 AsyncTaskのcancel(true)を外部から呼んだ場合と、doInBackgroundで呼んだ場合挙動が異なる。 あと、cancelして [...]]]></description>
			<content:encoded><![CDATA[<p>Android 2.1 update 1 ～ Android 2.3.2<br />
AsyncTaskのcancel(true)を外部から呼んだ場合と、doInBackgroundで呼んだ場合挙動が異なる。<br />
あと、cancelしてもdoInBackgroundは最後まで実行される。</p>
<pre>
public class MainActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        new AsyncTask&lt;Void, Integer, Void&gt;() {
            @Override
            protected Void doInBackground(Void... params) {
                for (int i = 0, cnt = 10; i &lt; cnt; i++) {
                    publishProgress(i);
                    SystemClock.sleep(1000);
                    if (i == 5) {
                        cancel(true);
                    }
                }
                return null;
            }
            @Override
            public void onProgressUpdate(Integer... values) {
                Log.d(getLocalClassName(), &quot;count &quot;+values[0]);
            }
            @Override
            protected void onCancelled() {
                Log.d(getLocalClassName(), &quot;onCancelled&quot;);
            }
            @Override
            protected void onPostExecute(Void result) {
                Log.d(getLocalClassName(), &quot;onPostExecute&quot;);
            }
        }.execute();
    }
}
</pre>
<p>結果</p>
<pre>
count 0
count 1
count 2
count 3
count 4
count 5
onPostExecute
count 6
count 7
count 8
count 9
</pre>
<pre>
public class MainActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

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

        SystemClock.sleep(5000);
        task.cancel(true);
    }
}
</pre>
<p>結果</p>
<pre>
count 0
count 1
count 2
count 3
count 4
onCancelled
count 5
count 6
count 7
count 8
count 9
</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.cheki.net/archives/2342/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Apacheのリバースプロキシを利用してSERVER_NAMEが取れない時</title>
		<link>http://blog.cheki.net/archives/2339</link>
		<comments>http://blog.cheki.net/archives/2339#comments</comments>
		<pubDate>Thu, 05 May 2011 15:26:36 +0000</pubDate>
		<dc:creator>cockok</dc:creator>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://blog.cheki.net/?p=2339</guid>
		<description><![CDATA[Apacheのリバースプロキシを利用して、SERVER_NAMEがリバースプロキシサーバのIPになっちゃう場合は、リバースプロキシ側のApacheに以下の設定を追加。 ProxyPreserveHost On PHPプロ [...]]]></description>
			<content:encoded><![CDATA[<p>Apacheのリバースプロキシを利用して、SERVER_NAMEがリバースプロキシサーバのIPになっちゃう場合は、リバースプロキシ側のApacheに以下の設定を追加。</p>
<pre>
ProxyPreserveHost On
</pre>
<p>PHPプログラムでSERVER_NAMEの値を超利用しまくりな場合は、問題ないようならぶち込んじゃってもいいかも。</p>
<pre>
$_SERVER['SERVER_NAME'] = isset($_SERVER['X_FORWARDED_HOST']) ? $_SERVER['X_FORWARDED_HOST'] : $_SERVER['SERVER_NAME'];
</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.cheki.net/archives/2339/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mac OSXでApacheの利用</title>
		<link>http://blog.cheki.net/archives/2333</link>
		<comments>http://blog.cheki.net/archives/2333#comments</comments>
		<pubDate>Wed, 04 May 2011 02:32:09 +0000</pubDate>
		<dc:creator>cockok</dc:creator>
				<category><![CDATA[macosx]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://blog.cheki.net/?p=2333</guid>
		<description><![CDATA[システム環境設定＞共有＞Web共有をチェック httpd.confの設定 $ sudo vim /etc/apache2/httpd.conf 設定を上書きできないと困るので180行目のAllowOverrideを変更  [...]]]></description>
			<content:encoded><![CDATA[<p>システム環境設定＞共有＞Web共有をチェック</p>
<p>httpd.confの設定</p>
<pre>
$ sudo vim /etc/apache2/httpd.conf
</pre>
<p>設定を上書きできないと困るので180行目のAllowOverrideを変更</p>
<pre>
    AllowOverride All
</pre>
<p>PHPを利用可能にするため116行目のコメントアウトを外す</p>
<pre>
LoadModule php5_module        libexec/apache2/libphp5.so
</pre>
<p>ヴァーチャルホストの設定ファイルvhosts以下に配置し読み込めるように最後の行に追加<br />
デフォルトだと469行目でヴァーチャルホストの設定を読み込んでいるようだが、最終行のIncludeでPHPの設定が行われているので、それ以降に設定を書かないとPHPを利用できないため</p>
<pre>
Include /private/etc/apache2/vhosts/*.conf
</pre>
<p>ヴァーチャルホストの設定ファイルを作成<br />
ファイル名はお好みで</p>
<pre>
$ sudo vim /etc/apache2/vhosts/httpd-vhosts-hoge.example.com.conf
</pre>
<p>ファイルはhogeユーザのSite以下にドメインディレクトリを作成し、そこをドキュメントルートにしています<br />
localhostから接続できるようにAllow fromを追加</p>
<pre>
&lt;VirtualHost *:80&gt;
    ServerName hoge.example.com
    DocumentRoot /Users/hoge/Sites/hoge.example.com
    &lt;Directory /Users/hoge/Sites/hoge.example.com&gt;
        Allow from ::1
        Allow from 127.0.0.1
    &lt;/Directory&gt;
    ErrorLog /var/log/apache2/hoge.example.com-error_log
    CustomLog /var/log/apache2/hoge.example.com-access_log combined
&lt;/VirtualHost&gt;
</pre>
<p>Apache設定ファイルにミスがないかチェック</p>
<pre>
sudo apache2ctl configtest
</pre>
<p>大丈夫なようなら再起動</p>
<pre>
sudo apache2ctl -k restart
</pre>
<p>hostsファイルに名前解決できるように追加</p>
<pre>
sudo vim /etc/hosts
</pre>
<pre>
::1 hoge.example.com
127.0.0.1 hoge.example.com
</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.cheki.net/archives/2333/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>androidエミュレータのSDカードにファイルを転送する</title>
		<link>http://blog.cheki.net/archives/2328</link>
		<comments>http://blog.cheki.net/archives/2328#comments</comments>
		<pubDate>Thu, 21 Apr 2011 04:12:47 +0000</pubDate>
		<dc:creator>cockok</dc:creator>
				<category><![CDATA[android]]></category>

		<guid isPermaLink="false">http://blog.cheki.net/?p=2328</guid>
		<description><![CDATA[DDMSのファイル・エクスプローラだとGUIで簡単に転送できますが、テスト用に大量に転送する必要があったのでadbコマンドを利用します。 Windowsでのお話。 転送コマンド自体は以下。 adb push ファイル名  [...]]]></description>
			<content:encoded><![CDATA[<p>DDMSのファイル・エクスプローラだとGUIで簡単に転送できますが、テスト用に大量に転送する必要があったのでadbコマンドを利用します。<br />
Windowsでのお話。</p>
<p>転送コマンド自体は以下。</p>
<pre>
adb push ファイル名 /sdcard/転送先
</pre>
<p>SDカードは「/sdcard」としてマウントされています。</p>
<p>実機のSDカードをGドライブにマウントし、downloadフォルダ内のgifファイルをエミュレータのSDカード内のdownloadフォルダに転送します。<br />
実機も認識しているため、adbのオプションで実行先をエミュレータとする「-e」オプションを指定。</p>
<pre>
for %A in (G:\download\*.gif) do adb -e push %~fA /sdcard/download
</pre>
<p>転送後、エミュレータのアプリケーション一覧から「Dev Tools ＞ Media Scanner」でSDカードを再認識させる必要がある。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.cheki.net/archives/2328/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>twitterのリストでリスト名に日本語が通るようになっていた</title>
		<link>http://blog.cheki.net/archives/2324</link>
		<comments>http://blog.cheki.net/archives/2324#comments</comments>
		<pubDate>Thu, 13 Jan 2011 08:33:32 +0000</pubDate>
		<dc:creator>cockok</dc:creator>
				<category><![CDATA[日記]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://blog.cheki.net/?p=2324</guid>
		<description><![CDATA[UTF-8の範囲、BMP外はダメっぽい。 文字数はUTF-8で23文字までっぽい。 日本語 http://twitter.com/cockok/%E6%97%A5%E6%9C%AC%E8%AA%9E 日本語-18 htt [...]]]></description>
			<content:encoded><![CDATA[<p>UTF-8の範囲、BMP外はダメっぽい。<br />
文字数はUTF-8で23文字までっぽい。</p>
<p>日本語</p>
<p>http://twitter.com/cockok/%E6%97%A5%E6%9C%AC%E8%AA%9E</p>
<p>日本語-18</p>
<p>http://twitter.com/cockok/%E6%97%A5%E6%9C%AC%E8%AA%9E-18</p>
<p>☃</p>
<p>http://twitter.com/cockok/%E2%98%83</p>
<p></p>
<p>http://twitter.com/cockok/%EE%98%BE</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.cheki.net/archives/2324/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

