jquery使ってcallback関数を利用時のthisへのアクセス

文章にするのは難しかったので、とりあえずソース

<html>
	<head>
		<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js"></script>
		<script type="text/javascript">
			var Fuga = function(){};
			Fuga.prototype = {
				hoge: 'fuga',
				do1: function() {
					$.get('/src/fuga.txt', null, function() {
						console.dir(this.hoge);
					}, 'text');
				},
				do2: function() {
					$.get('/src/fuga.txt', null, jQuery.proxy(
					function(data, status, xhr)  {
						console.dir(this.hoge);
					}, this), 'text');
				},
				do3: function() {
					var self = this;
					$.get('/src/fuga.txt', null, jQuery.proxy(
					function(data, status, xhr)  {
						console.dir(self.hoge);
					}, this), 'text');
				}
			}
			var f = new Fuga();
			f.do1();
			f.do2();
			f.do3();
		</script>
	</head>
	<body>
		sample
	</body>
</html>

do1で上手くいかなくて、$.ajaxの場合はcontextで指定、$.getの場合はjQuery.proxyで指定出来るらしいのでdo2で実現。
ってかこんな面倒なの?って思うんだけど、どーなんだろ、javascriptに詳しい人ヘルプ。

他に思いつくのは、無名関数でラップして引数として渡すとか、ダサイ。

@mumoshu からの助言で do3 を追加、何か適当な予約変数に突っ込んでくれりゃいいのに・・・

これ、jqueryに限ったわけじゃなく、クロージャ使ったときのthisの参照先の問題か。
まぁタイトルはそのままで。

2010年 12月 29日 | Filed under dev, javascript, Program
タグ:

javaのjsonライブラリのデコーダのベンチマーク

メジャーそうなライブラリのベンチマークを取ってみました。

  • jsonorg(twitter4j.internal 2.1.9 snapshot)
  • jsonic
  • gson
  • jackson

maven経由で取れる最新版で試してます(jsonicは無いので、1.2.5を突っ込んで動かしてます)

対象となるデータはTwitterのpublictimelineから拾ってきたデータ(20件の配列で中身連想配列)
コードはgithubに置きました。
jsonorgはPOJOに変換とか便利な機能は付いてなかったです(json-libは付いてるみたいだけど)。
JSONエンコーダのインスタンスを作るものに関しては、一度生成した物を使いまわしています。
自分のマシンだと結構早い方だと思うので、sakuraのvpsで動かしました。

計測結果サマリ

ライブラリ 1回目 1000のアベレージ
jsonic 440 2.1835
gson 184 4.2541
jackson 313 0.7926
jsonorg 37 1.7359

@shin1ogawa経由で見つけた計測同様、jacksonがぶっちぎり。
jsonorgの1回目がやたら早いけど、内部実装がどうなってるかまでは追いかけて無いからgetHogeしたときに具体的な事してるとかだったらどうしよ・・・w

計測結果ベタ

bench start [jsonic]
first
         start [1293096329073]
         end   [1293096329513]
         diff  [440]
--
10000 loop
         start   [1293096329515]
         end     [1293096351350]
         diff    [21835]
         average [2.1835]
bench end [jsonic]
----
bench start [gson]
first
         start [1293096351352]
         end   [1293096351536]
         diff  [184]
--
10000 loop
         start   [1293096351540]
         end     [1293096394081]
         diff    [42541]
         average [4.2541]
bench end [gson]
----
bench start [jackson]
first
         start [1293096394082]
         end   [1293096394395]
         diff  [313]
--
10000 loop
         start   [1293096394396]
         end     [1293096402322]
         diff    [7926]
         average [0.7926]
bench end [jackson]
----
bench start [jsonorg]
first
         start [1293096402324]
         end   [1293096402361]
         diff  [37]
--
10000 loop
         start   [1293096402362]
         end     [1293096419721]
         diff    [17359]
         average [1.7359]
bench end [jsonorg]
----
2010年 12月 23日 | Filed under dev, Java, javascript, Program, Twitter
タグ:

mod_proxyでHTTP_HOSTの値がローカルアドレス(バランシング先に設定したURL)で困る件

よく巷で見かける設定だとこんな感じで

ProxyRequests Off
ProxyPass        /fizzbuzz http://192.168.0.10
ProxyPassReverse /fizzbuzz http://192.168.0.10

これだと $_SERVER['HTTP_HOST'] が 192.168.0.10 になっちゃうので、場合によっては困っちゃう。
自作の場合は気をつければいいんだけど、他人のを動かすと結構はまる(xoops, wordpress)どーすっかなーと思ったらコレを追加するだけでよかった。

ProxyPreserveHost On
2010年 12月 23日 | Filed under dev, Linux, memo, Program
タグ:

各種PHPのWebFramework上でhello worldベンチ(apcもあるよ)。

表題のまんま。

対象フレームワーク

  • CodeIgniter 1.7.3
  • ZendFramework 1.11.1
  • CakePHP 1.3.6
  • KohanaPHP 3.0.8

って取り終えてからsymfony抜けてるのに気付いた・・・まぁいいや。

ソース

とりあえずgithubにおいてみた
https://github.com/withgod/php_framework_benchmark

cakephpはやたらファイルが多いのでいったん保留。
git add したときに空のフォルダがすっ飛んでるのでそのままじゃ動かないかも。

実行環境

  • vmware上のdebian lenny(2.6.26-2-amd64)
  • 多すぎても実際に動かすサーバとの差異が出そうなので、コア2個、メモリ2G(ホストはCorei7,Mem8G)
  • PHP 5.2.16-0.dotdeb.0
  • Apache 2.2.9-10+lenny8

計測側は 別マシン(GigaBaseLan経由)のdebian sidからabでポチっと。
計測に使ったコードも一応晒すかと思ったんだけど、CakePHPがappsだけうまく切り離すのが面倒で良く解らなかったので止めた。
テンプレートは全部で使ってません。
#zfはzf createして出来たコードに iniでresources.frontController.noViewRenderer = 1 して Controllerで echo ‘helloworld’みたいな感じ。

計測方法

こんなシェル回すだけ、、、つって最初はかなり適当にやってたんだけど、値がおかしいので設定をもう少しつめました。

具体的には下記のような感じ。

apache

<IfModule mpm_prefork_module>
    StartServers        100
    MinSpareServers     100
    MaxSpareServers     100
    MaxClients          410
    MaxRequestsPerChild   0
</IfModule>
ServerLimit 410

接続数が足りてなくてスループット出ないので変更、評価アプリが単純なのと相まって凄いスループット出てる・・・w
最初から全部400とか立ち上げるとSwapOut発生しまくりだったのでとりあえずこんな感じで。
再起動時にワーニング出るんだけど(gracefullだと駄目です、ちゃんとstop/start出来るコマンドで。してもWarningで照るんだけどね・・・)、ps axf | grep -c ‘apache2′するとちゃんと立ち上がってるみたいなので気にしない。

ulimit file descriptors

上限から変更。
/etc/security/limits.conf に次を追加

www-data hard nofile 10240
www-data soft nofile 10240
noname hard nofile 10240
noname soft nofile 10240

/etc/pam.d/login に次を追加

session required pam_limits.so

再ログインすれば有効になります、面倒なら再起動で。
上だけでも連続してテストを行うとクライアント側でTIME_WAIT、サーバ側でSYN_SENTとか溜まるので、計測取るスクリプトで sleep 90 してお茶を濁してます(確かdebian?の初期値は60秒、変更したいとなるとKernel再構築だったはず。)

計測用スクリプト

#!/bin/sh

ts=`date "+%Y%m%d%H%M%S"`
prefix='apc_'
doRun() {
	ab -c  10 -n 1000 $1 > ./out/$prefix$ts-$2-010-1000.txt
	sleep 90;
	ab -c  30 -n 1000 $1 > ./out/$prefix$ts-$2-030-1000.txt
	sleep 90;
	ab -c  50 -n 1000 $1 > ./out/$prefix$ts-$2-050-1000.txt
	sleep 90;
	ab -c 100 -n 1000 $1 > ./out/$prefix$ts-$2-100-1000.txt
	sleep 90;
	ab -c 200 -n 2000 $1 > ./out/$prefix$ts-$2-200-2000.txt
	sleep 90;
	ab -c 300 -n 3000 $1 > ./out/$prefix$ts-$2-300-3000.txt
	sleep 90;
	ab -c 400 -n 4000 $1 > ./out/$prefix$ts-$2-400-4000.txt
}

doRun 'http://192.168.0.155/apps/cakephp/hello_world/' cake;
doRun 'http://192.168.0.155/apps/kohana/' kohana;
doRun 'http://192.168.0.155/apps/codeigniter/index.php/hello' ci;
doRun 'http://192.168.0.155/apps/zf/helloworld/public' zf;
doRun 'http://192.168.0.155/phpinfo' phpinfo;

何度か回してみたところ、apcなしだとcakeで300多重以上、ciで400多重以上の時にabが異常終了するので取れて無いです(サーバTAT遅延でタイムアウトするとab自体が落ちる?よーわからん)

集計用スクリプト(ログ集計+gnuplot用のスクリプト吐き出し)

ついでに↓で出してる集計につかったperlスクリプトはこんな感じ。
perlでログざーっと漁ってgnuplotへ食わすファイルに落とす、ついでにココに貼り付ける用のデータも生成。

#!/usr/bin/perl

use strict;
use Data::Dumper;
use File::Basename;
use IO::File;
use POSIX;

my $now = strftime "%Y%m%d%H%M%S", localtime;

my %data = ('apc' => {}, 'noapc' => {});
for my $f (glob './out/*.txt') {
	my $b = basename($f);
	my ($prefix, $target, $con, $num) = ($1, $2, $3, $4) if ($b =~ /([a-z]+)?_?\d+\-([a-z]+)\-(\d+)-(\d+)\.txt$/);
	$prefix = 'noapc' unless $prefix;
	$data{"$prefix"}->{$target} = {} unless (exists $data{"$prefix"}->{$target});
	my $val = `grep "Requests per second" $f | awk '{print \$4}'`;
	$val =~ s/[\r\n]//;
	$data{"$prefix"}->{$target}->{$con} = $val;
}

for my $j (keys %data) {
	print "$j\t010\t030\t050\t100\t200\t300\t400\n";
	my $plot = <<"_EOT_";
set term png
set output './${now}_$j.png'
set title '$j graph'
set xlabel 'concurrency'
set ylabel 'request/per second'
set grid
plot \\
_EOT_
	for my $k (keys %{$data{$j}}) {
		print "$k";
		my $fname = "${j}_${k}.txt";
		my $fh = IO::File->new("> ./graph/${now}_$fname");
		for my $l (sort keys %{$data{$j}->{$k}}) {
			print "\t" . $data{$j}->{$k}->{$l} ;
			print $fh $l . " " . $data{$j}->{$k}->{$l} . "\n";
		}
		$fh->close;
		$plot .= "\"./${now}_$fname\" using 1:2 title \"$k\" with lines, \\\n";
		print "\n"
	}
	$plot =~ s/, \\$//;
	my $graph_fh = IO::File->new("> ./graph/${now}_graph_$j.plot");
	print $graph_fh $plot;
	$graph_fh->close;
}

計測結果

without apc

20101220163454_noapc

noapc 010 030 050 100 200 300 400
kohana 117.09 237.91 231.50 234.80 143.91 197.61
ci 137.77 203.66 201.19 201.80 138.70
phpinfo 137.11 926.16 932.02 924.78 489.71 438.99 342.95
cake 59.10 69.85 75.89 76.27 74.55
zf 134.77 907.97 919.69 931.49 588.52 435.18 345.51

with apc

20101220163454_apc

apc 010 030 050 100 200 300 400
kohana 137.00 798.51 825.87 813.94 566.84 314.40 332.66
ci 146.27 807.87 797.76 803.79 567.05 381.62 247.43
phpinfo 131.24 929.17 915.39 933.95 588.15 436.91 342.84
cake 212.97 287.25 287.27 290.76 293.66 200.77 193.22
zf 135.00 900.23 937.48 937.20 597.30 437.12 344.20

所感

接続数が足りなくて最初は全然スループット出て無い。
APC入れない状態で出来てるすげー差は恐らく有効になってるモジュールの差なのかな、cakeは詰め込みまくった状態で、他は全然入ってない状態と予想。
APC入れたらその辺の差がぐっと詰まるっぽいのもそんな感じ?
入れてるapacheとかphpの設定とかはデフォルトだし、その辺を詰めてみると面白いかもしれない(ビジネスロジック部分と違ってこの辺の値は一般的に適応出来るし。 ってことでちょっと詰めてみたんだけど、凄いスループット出てる、まぁ仕方ない。)
ほんとはFrameworkの性能差が見たくてベンチ取ったんだけど、どっちかっつーとapcスゲーになった気が・・・w
あと結果に若干?な部分があるのは、他で負荷掛かってたのかなあ・・それ以外には使わない状態でやったんだけどー・・・
何度か繰り返したアベレージにしないと駄目かも(つっても接続開放とかの絡みで、1回集計に50分ぐらい掛かるからしんどい・・・w)
気が向いたらついでにvmの割り当ても変えてベンチとって見てもいいかもしれない。
zfが鬼のような値出してるけど、phpinfoと変わらない辺りを見るとなーんも入ってないに近いんだろうなあ・・・その辺は中身まで追いかけないと解らんけど、他のFWに比べてすげー緩いから具体的な部品を詰め込まないと値取れない気がする。
apc無しだと性能差が激しいけど、逆にapc入れると殆ど性能差が無いから好きなの使えって感じかなぁ(cakephpはモデル生成が走る、とかって見かけたからその辺改めて見ないと駄目かも (‘A`)

2010年 12月 19日 | Filed under dev, PHP, Program
タグ:

debian unstable上のhudsonでnetwork unreachable

mavenのレポジトリにアクセス出来なくてプラグインが落ちてこなかったり、テスト中のソケット生成に失敗しまくる件について解決。
何故か手では動くんだけど・・・

/etc/sysctl.d/bindv6only.conf

の1を0に変更↓

net.ipv6.bindv6only = 0

再起動できない場合は次も。

echo 0 > /proc/sys/net/ipv6/bindv6only
2010年 12月 17日 | Filed under dev, Java
タグ:

Services_Twitter_Uploaderを使って簡単Post

自作自演エントリをでっちあげてみる。

Basic認証が廃止されたせいで、Twitpicやyfrogへのポストが凄く面倒になってる人にお勧めのライブラリ。
javaだと twitter4j.media のお陰で簡単にアップロード出来るのに、お手軽なはずのphpだと出来無いじゃん!って事でt4j.mediaのリファクタ後の勢いに任せて作ってみました。
PHPからOAuth Echoを使って、画像投稿サイト(yfrogは動画も投稿出来るけど)に簡単にPHPから投稿出来るライブラリです。

対応サイトはこんな感じ

  • imgly
  • plixi
  • twipple
  • twitgoo
  • twitpic
  • yfrog
  • mobypicture
  • twipl
  • posterous

使い方

Services_Twitter_Uploader から最新版を落としてきて、適当なフォルダに突っ込む。

必要なモジュール

HTTP_OAuthとHTTP_Request2。

pear install -f HTTP_OAuth
pear install -f HTTP_Request2

で入ってくれるはず。

コード

require_once "Services/Twitter/Uploader.php";

$oauth = new HTTP_OAuth_Consumer('APP KEY', 'APP SECRET', 'TOKEN', 'SECRET');

$uploader = Services_Twitter_Uploader::factory('yfrog', $oauth);
//twitpicはAPI KEYが必要 http://dev.twitpic.com/apps/new
//$uploader = Services_Twitter_Uploader::factory('twitpic', $this->oauth, 'apiKey');
//proxy経由はこう
//$req = new HTTP_Request2();
//$req->setConfig(array( 'proxy_host' => 'HOST', 'proxy_port' => 'PORT'));
//$uploader = Services_OAuthUploader::factory('yfrog', $oauth,  null, $req);

try {
	$url = $uploader->upload('/path/to/upload.jpg', 'from Services_Twitter_Uploader');
	var_dump($url); // upload後のURL
} catch(Services_Twitter_Uploader_Exception $e) {
	var_dump($e);
}
2010年 12月 16日 | Filed under dev, PHP, Twitter
タグ:

JSONObjectのgetLongの挙動がおかしい

せっかくあるんだし、って事で使わせて貰ってるんだけど動作がおかしいところを見つけたので、@yusukeyに共有するためにポスト。

こんな感じのコードを用意して

import twitter4j.internal.org.json.JSONObject;

public class JSonTest {
    public static void main(String[] args) throws Exception {
        //http://api.twitter.com/1/statuses/show/00.xml
        String jsonStr1 = "{" +
                "\"k1\":\"13857270119014401\"," +
                "\"k2\":\"13958500480716800\"," +
                "\"k3\":\"13958500480716801\"," + //sonzai sinai
                "\"k4\":\"13995264494796800\"," +
                "\"k5\":\"13117320041865216\"," +
                "\"k6\":\"13996071046881280\"" +
                "}";
        JSONObject json1 = new JSONObject(jsonStr1);
        System.out.println(json1.getLong("k1"));
        System.out.println(json1.getLong("k2"));
        System.out.println(json1.getLong("k3"));
        System.out.println(json1.getLong("k4"));
        System.out.println(json1.getLong("k5"));
        System.out.println(json1.getLong("k6"));
    }
}

実行するとこんな感じに、末尾が1だった場合に落ちてる。

13857270119014400
13958500480716800
13958500480716800
13995264494796800
13117320041865216
13996071046881280

再現環境
windows 7 64bit jdk 1.6.0_23
twitter4j 2.1.4で発生して、2.1.8でも確認。
mac slでも確認。

追記

取りあえず問題点は解った、文字列(“”で囲ってる)に対して getLong してるせいで落ちてるみたい。
#全然追ってないけど、getDoubleとか呼び出されてる
jsonがおかしいというか、getLongがおかしいというか・・・
getLongが失敗するか、適切に変換した上で返してほしいなあ、と思って試しに文字列を入れるとnot numberつってExceptionが出るので、コード書いた人的には数値文字列ならちゃんと値返すよ!って思って書いてるような気がする。

t4jでは問題が無い

もしかしたら影響有るかも、ってことで@yusukeyに報告上げたけど、特に問題は無いらしい。

@withgod json.orgのライブラリの問題?ですね。Twitter4Jでは JSONObject#getLong() は使っていないです。 twitter4j.internal.util.ParseUtil#getLong(name,json) 使うといいかも。
15分前 YoruFukurouから withgod宛

http://twitter.com/yusukey/status/14317321774432256
こんな動作に対応するためにそういう実装になってるらしい。

@withgod そうですそうです。Twitter API は “100+” とか返してくることもあるので文字としていったんとっていたんだと思います。
6分前 YoruFukurouから withgod宛

http://twitter.com/yusukey/status/14321262973157377
そういやそんな動作あったなあ・・・

2010年 12月 13日 | Filed under dev, Java, Twitter
タグ:

makegood を試す

俺は基本vim+zsh+screenなんだけど、他の要員の事も考えてよさげな makegoodを試してみる。

環境

  • win 7 64bit
  • php 5.2.14, xdebug 2.1.0, phpunit 3.5.5
  • makegod 1.1.0(update site install)

動かしてみたのはこないだから書いてる Services_OAuthUploaderを動かしてみた

取りあえず何も考えずmakegodの設定をこうして全てのテスト実行
テスティングフレームワーク PHPUnit
XML設定ファイル /Services_OAuthUploader/tests/phpunit.xml
プリロードスクリプト 空
この状態で動かすと、include_pathの問題で次のエラー


Fatal error: require_once(): Failed opening required 'PHPUnit/Runner/Version.php'  (include_path='.;C:\eclipse_path\plugins\com.piece_framework.makegood.stagehand_testrunner_1.1.0.v201011141637\resources\php\PEAR') in C:\eclipse_path\plugins\com.piece_framework.makegood.stagehand_testrunner_1.1.0.v201011141637\resources\php\PEAR\Stagehand\TestRunner\Preparator\PHPUnitPreparator.php on line 38

PHP executableでphp.ini指定してあって、include_pathも設定してるんだけどその設定は出てきてない・・・
eclipse経由で php -i とか出来たら確実なんだろうけど、PDT普段から使って無いので解らず。

仕方ないので makegod 側で prepare.php を次のように置いてmakegodの設定を変更

<?php
if (defined('E_DEPRECATED')) {
    error_reporting(E_ALL & ~E_DEPRECATED);
} else {
    error_reporting(E_ALL);
}
//php自体にもStagehand_TestRunnerを以前に入れてるので後回しにしてある(一応最新にはしたけど)
set_include_path(get_include_path() . PATH_SEPARATOR . $_SERVER['PHP_PEAR_INSTALL_DIR']);

プリロードスクリプト /Services_OAuthUploader/tests/prepare.php

この状態で実行すると次のエラー

Services_OAuthUploaderTest::testFactory

RuntimeException: PHP Fatal error:  Class 'Stagehand_CLIController' not found in C:\eclipse_path\plugins\com.piece_framework.makegood.stagehand_testrunner_1.1.0.v201011141637\resources\php\PEAR\Stagehand\TestRunner\TestRunnerCLIController.php on line 47
PHP Stack trace:
PHP   1. {main}() -:0
PHP   2. require_once() -:162

C:\eclipse_path\plugins\com.piece_framework.makegood.stagehand_testrunner_1.1.0.v201011141637\resources\php\PEAR\Stagehand\TestRunner\Runner\PHPUnitRunner.php:115
C:\eclipse_path\plugins\com.piece_framework.makegood.stagehand_testrunner_1.1.0.v201011141637\resources\php\PEAR\Stagehand\TestRunner\TestRunner.php:70
C:\eclipse_path\plugins\com.piece_framework.makegood.stagehand_testrunner_1.1.0.v201011141637\resources\php\PEAR\Stagehand\TestRunner\TestRunnerCLIController.php:380
C:\eclipse_path\plugins\com.piece_framework.makegood.stagehand_testrunner_1.1.0.v201011141637\resources\php\PEAR\Stagehand\TestRunner\TestRunnerCLIController.php:173
C:\eclipse_path\plugins\com.piece_framework.makegood.stagehand_testrunner_1.1.0.v201011141637\resources\php\PEAR\Stagehand\CLIController.php:101
C:\eclipse_path\plugins\com.piece_framework.makegood.stagehand_testrunner_1.1.0.v201011141637\resources\php\bin\phpunitrunner.php:69

何でこうなのかはよく解らんが、適当にgrepして Stagehand\TestRunner\TestRunnerCLIController.php に require_once(‘Stagehand/CLIController.php’);を付けて上記エラーは対応。
が、この状態で実行しても経過時間がひたすら過ぎてくだけの状態。
他の箇所ならともかく、 testFactory なので何が問題なんだろう・・・と思いつつ取りあえず phpunit.xml を外してみたら動いた。

このエントリを作者に投げてやり取りしたところ、問題点はproccessIsolationらしい。

@iteman:
@withgod 結論としてはStagehand_TestRunnerがprocessIsolationをサポートしていないことが原因ですね。将来的にはMakeGoodからはprocessIsolationは常に無効化するつもりですが。代替手段は提供します。

http://twitter.com/iteman/status/12793420296757248

2010年 12月 9日 | Filed under dev, PHP
タグ:

Services_OAuthUploader 作った

t4jへのpatchの投稿とか、そのまま勢いに任せてリファクタリングとかしてた関係で、oauth echoに対応したuploaderに妙に詳しくなったので、そのままの勢いで Services_OAuthUploader とか作ってみた。

まぁぶっちゃけt4jのmedia関係をそのままphpに移植したと言っても過言では無いんだけど、まぁその辺はご愛嬌。

とりあえずコード書いて、コメント書いて、テスト書いてみた、ってレベルなのでまだpearへの登録とかはしてない(ってか、仕方しらない)

対応サイトはこんな感じ。

  • imgly
  • plixi
  • twipple
  • twitgoo
  • twitpic
  • yfrog

使い方はtest見てください、って事で・・・

実装・テスト書くよりも、コメントだとかredmine,hudson周りの方が時間食ってたと思う(‘A`

取りあえず作ってみた、ってレベルなので今後の予定は未定。
何気なく振ってる1.0.0ってのはpear的にはβとかじゃなくて正式版扱いになると思うので、バージョンは明日にでも変えます。
取りあえず test 周りが結構適当なので、その辺を綺麗にしようかな・・・

2010年 12月 5日 | Filed under dev, PHP, Twitter
タグ:

intellij IDEAのフリーカーソルを止める

文末の改行より横に行けちゃうのがキモイ、ってつぶやいてたら@yusukey からmention貰ったのでこっちでも共有。

http://twitter.com/#!/yusukey/status/8894843900141568

@withgod フリーカーソルは”caret”で設定画面を検索すると設定項目が見つかりますよ。cursorだとみつからない(>_<) "Allow placement of caret after end of line"ってやつです

2010年 11月 30日 | Filed under dev, idea, Java, Win
タグ:

rider.withgod.jp – blog is Stephen Fry proof thanks to caching by WP Super Cache