<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><atom:link rel="hub" href="http://tumblr.superfeedr.com/" xmlns:atom="http://www.w3.org/2005/Atom"/><description>ネコを愛する、プログラムが書けるSE的なITなんでも屋の公式ページ的なもの。普段の活動などを記録していきます。twitterは@takemasa5</description><title>武之新</title><generator>Tumblr (3.0; @takemasa5)</generator><link>http://www.takenoshin.com/</link><item><title>dojox.form.Uploaderのtips</title><description>&lt;p&gt;dojox.form.Uploaderを使っててほいほいハマるので、ほぼ備忘録としてのメモ。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;* POST時に他のデータも渡したい&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;uploadWithFormData()を使う。uploadOnSelectをtrueにすると勝手にsubmitされてしまうので、ファイルを選択されたらすぐにsubmitしたければ&lt;/p&gt;
&lt;pre&gt;&amp;lt;button data-dojo-type="dojox.form.Uploader" data-dojo-props="
	id: 'uploader'
	, name: 'uploaded'
	, multiple: false
	, uploadOnSelect: false
	, url: 'xxx'
	, onChange: function(){
		doUpload();
}"&amp;gt;upload now!&amp;lt;/button&amp;gt;

function doUpload(){
	var uploader = dijit.byId("uploader");
	uploader.onComplete = function(array){
		if (array[0] == "succeeded"){
			// succeeded
		}
		else {
			// failed
		}
		uploader.reset();
	};
	uploader.uploadWithFormData({
		"hoge": "hoehoe"
	});
}
&lt;/pre&gt;
&lt;p&gt;とやっておけば概ねおｋ&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;* 1回目は動いたけど、2回目が動かない&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;ファイル名が同じだとonChangeが発生しない。同じファイル名でもsubmitしたければ、onCompleteの最後のほうでreset()を呼ぶ。&lt;/p&gt;</description><link>http://www.takenoshin.com/post/12461699257</link><guid>http://www.takenoshin.com/post/12461699257</guid><pubDate>Mon, 07 Nov 2011 16:38:34 +0900</pubDate><category>javascript</category><category>dojo</category></item><item><title>celeryでsingletonなタスク</title><description>&lt;p&gt;djangoでバッチ処理や非同期処理を組もうとしてceleryを導入。使い方も簡単でとても便利。&lt;/p&gt;
&lt;p&gt;が、多重起動されたら困る処理を制限しようとしても、celery自体にはそういう機能がない模様。celeryのcookbookをみると、celery.task.Taskを継承したクラスを自分で作ればいいらしい。でもいちいちclassを定義するのは面倒。&lt;/p&gt;
&lt;p&gt;というわけでdecoratorでsingletonなタスクを実現できるようにしてみた。&lt;/p&gt;
&lt;p&gt;&lt;!-- more --&gt;やり方は簡単。というかcookbookの実装そのまんま。&lt;/p&gt;
&lt;pre&gt;def singletonTask(lockkey):
	def _make_runner(func):
		def _work_or_die(*args, **kwargs):
			expire_time = kwargs.get("expire", SINGLETON_TASK_EXPIRETIME)
			acquire_lock = lambda: cache.add(lockkey, "true", expire_time)
			release_lock = lambda: cache.delete(lockkey)

			
			#logger = _make_runner.get_logger()
			#logger.info("check working flg...")
			
			if acquire_lock() :
				try:
					#logger.info("started....")
					func(*args, **kwargs)
					
				finally:
					release_lock()
	
			else :
				#logger.info("job cancelled")
				raise TaskAlreadyWorking(lockkey)
				
		_work_or_die.__name__ = func.__name__
		_work_or_die.__module__ = func.__module__
		return _work_or_die
			
	return _make_runner			
&lt;/pre&gt;
&lt;p&gt;弱点は_work_or_dieの中ではloggerが使えないこと。func.get_loggerも、_work_or_die.get_loggerもうまくいかなかった。困った。&lt;/p&gt;
&lt;p&gt;あとキモは_work_or_die.__name__ を func.__name__ に書き換えていること。celeryのtask生成部分を見てると、@taskにnameを与えない限り、func.__name__ を元にtaskの名前を決めている。なので _work_or_die.__name__ を書き換えないでそのまま返すと、全て同じ名前になり、正しいタスクが起動できなくなる。&lt;/p&gt;
&lt;p&gt;最初気が付かなくてハマったので、FAQの decorating tasks のあたりにでも書いておいてほしいなぁ。&lt;/p&gt;
&lt;p&gt;2011/10/15 追記&lt;/p&gt;
&lt;p&gt;__module__も書き換えないとダメなことを忘れていたので追記&lt;/p&gt;</description><link>http://www.takenoshin.com/post/11429792594</link><guid>http://www.takenoshin.com/post/11429792594</guid><pubDate>Fri, 14 Oct 2011 16:39:00 +0900</pubDate><category>python</category><category>celery</category><category>decorator</category><category>django</category></item><item><title>dojoでハマってる</title><description>&lt;p&gt;Webアプリを開発中で、ブラウザ側はdojoを使っているのですが、色々とハマっております。現在最も困っているのがdojox.grid.DataGridに埋め込んだdijit.form.Buttonの挙動。&lt;br/&gt;dojox.grid.DataGridがなかなか強力で、これが使いたいためにdojoを選んだわけですが、このgridの各行にbuttonを配置すると途端に挙動が怪しくなってきます。 &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;!-- more --&gt;（１）ボタン文言をasciiにすると見た目が装飾されない。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;表題の通りだけど、文章からは現象が伝わりづらい。次の画像をみるとわかりやすい。&lt;/p&gt;
&lt;p&gt;ascii&lt;br/&gt;&lt;img src="http://media.tumblr.com/tumblr_lqrlt74XHI1qfzj8o.png"/&gt;&lt;/p&gt;
&lt;p&gt;not ascii&lt;br/&gt;&lt;img src="http://media.tumblr.com/tumblr_lqrlthQKZ31qfzj8o.png"/&gt;&lt;/p&gt;
&lt;p&gt;同じタグ構造で、上はボタンの文言が「test」、下は「テスト」。この違いだけで見た目がこのように変わる。 どちらも画像左上に「test」ボタンがあるが、このようにgridの外であればこの現象は起きない。わけがわからん。&lt;/p&gt;
&lt;p&gt;追記：&lt;br/&gt;gridのformatterで＜button data-dojo-type=&amp;#8221;dijit.form.Button&amp;#8221;＞test＜/button＞ とやるとおかしくなるが、ボタンが1個だけでよければ&lt;/p&gt;
&lt;pre&gt;formatter: function(value, index){
  return new dijit.form.Button({
    label: "test"
  });
}
&lt;/pre&gt;
&lt;p&gt;とやればasciiでも期待通りになる模様。ボタン2個のときはどうしたらいいのだろう&amp;#8230;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;（２）gridの中に入れたdijit.form.Buttonをクリックすると、外のwidgetにイベントが伝播する。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;これまた意味不明な挙動なのだが、次のようなタグ構造があるとする。&lt;/p&gt;
&lt;pre&gt;＜div data-dojo-type="dijit.Dialog"＞
  ＜form id="frm" data-dojo-type="dijit.form.Form"＞
  ＜div data-dojo-type="dijit.layout.BorderContainer"＞
    ＜div data-dojo-type="dijit.layout.ContentPane"＞
      ＜div id="grid" data-dojo-type="dojox.grid.DataGrid"＞＜/div＞
    ＜/div＞
    ＜div data-dojo-type="dijit.layout.ContentPane"＞
      ＜button data-dojo-type="dijit.form.Button"＞ボタンA＜/button＞
    ＜/div＞
  ＜/div＞
  ＜/form＞
＜/div＞
&lt;/pre&gt;
&lt;p&gt;このとき「ボタンA」をクリックする分にはそのボタンのonClickが動くだけなのだが、gridの中にボタンを配置しそれをクリックすると、そのボタンのonClickが実行された後にfrmがsubmitされてしまう。&lt;br/&gt;とりあえずfrmのonSubmitにfunction(){ return false; }を入れて回避しているが、普通にsubmitさせたいformの場合は困ってしまうだろう。 &lt;/p&gt;
&lt;p&gt;gridに絡まない部分ではクセさえ掴めば割といい感じなのだが、（といってもdijit.formにほしいwidgetがないとが色々あるけど）、gridとdijit.formを組み合わせるとイマイチなのかもしれない。&lt;/p&gt;</description><link>http://www.takenoshin.com/post/9606642140</link><guid>http://www.takenoshin.com/post/9606642140</guid><pubDate>Wed, 31 Aug 2011 09:15:00 +0900</pubDate><category>dojo</category><category>javascript</category></item><item><title>ファイルアップロード処理でtempfileを使う</title><description>&lt;p&gt;ファイルアップロードをする際にposterを使っています。とても便利なのですが、実体ファイルを構築して、posterに食わせて、ファイル削除、という手順が面倒だったので、tempfileを使ってみました。&lt;/p&gt;

&lt;pre&gt;# make temporary file
temp = tempfile.TemporaryFile()
temp.write(simplejson.dumps({
	"seq": 1,
	"abc": 123,
	"def": "ASD"
}))
temp.write("\n")
temp.write(simplejson.dumps({
	"seq": 2,
	"abc": 123,
	"def": "ASD"
}))
temp.write("\n")
temp.write(simplejson.dumps({
	"seq": 3,
	"abc": 123,
	"def": "ASD"
}))
temp.flush()
temp.seek(0)


# encoding
datagen, headers = multipart_encode({
	"args": "other parameter", 
	"datas": temp
})


# create request
request = urllib2.Request("http://localhost:8000/fileupload/", datagen, headers)

# do post !
response = urllib2.urlopen(request)
&lt;/pre&gt;
&lt;p&gt;これで少なくともファイルの後始末は気にしなくてよいので便利。ちなみにSpooledTemporaryFileだとうまくいかない。rollover()すればイケるかもしれないけど未検証。&lt;/p&gt;</description><link>http://www.takenoshin.com/post/8465418182</link><guid>http://www.takenoshin.com/post/8465418182</guid><pubDate>Thu, 04 Aug 2011 17:11:27 +0900</pubDate><category>python</category></item><item><title>pythonのissubclassでハマる</title><description>&lt;p&gt;最近djangoでWebシステムを作るお仕事しています。python、djangoはなかなかよく出来ていてハマるところが少ないのですが、うっかり軽くハマったのでメモ。&lt;/p&gt;
&lt;p&gt;あるクラスがあるクラスを継承しているかどうかをチェックするためには組み込み関数のissubclass()を使いますが、継承元が抽象クラスだとissubclass()はFalseを返してくるらしい。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;検証のために次のようにやってみた。&lt;/p&gt;
&lt;pre&gt;&amp;gt;&amp;gt;&amp;gt; class ABC(object):
...     class Meta:
...             abstract = True
... 
&amp;gt;&amp;gt;&amp;gt; class GHJ(ABC):
...     hoge = 1
... 
&amp;gt;&amp;gt;&amp;gt; issubclass(ABC, GHJ)
False
&amp;gt;&amp;gt;&amp;gt; 
&amp;gt;&amp;gt;&amp;gt; 
&amp;gt;&amp;gt;&amp;gt; class ZXC(object):
...     hoge=1
... 
&amp;gt;&amp;gt;&amp;gt; class ASD(ZXC):
...     hoge=2
... 
&amp;gt;&amp;gt;&amp;gt; issubclass(ASD, ZXC)
True
&amp;gt;&amp;gt;&amp;gt; 
&lt;/pre&gt;
&lt;p&gt;わかってしまえばなんてことないんですが、うっかりすると欲しい結果にならないので要注意&lt;/p&gt;</description><link>http://www.takenoshin.com/post/8455564961</link><guid>http://www.takenoshin.com/post/8455564961</guid><pubDate>Thu, 04 Aug 2011 11:51:43 +0900</pubDate><category>python</category></item><item><title>Titaniumで死ぬほどハマる</title><description>&lt;p&gt;最近TitaniumでiPhone&amp;amp;Androidアプリを作ってたりしますが、これが死ぬほどハマる地獄道でした。特にAndroid。iPhoneはそれなりにクセがあるけど、理解さえすればそうでもないのですが、Androidは別格です。&lt;/p&gt;
&lt;p&gt;いまハマっているのはカメラ。ただ写真を撮って、それをアプリで使いたいだけなのに、なぜか写真を撮り終わったときのイベントハンドラが呼ばれない&amp;#8230;。&lt;/p&gt;

&lt;pre&gt;var test_window = Ti.UI.createWindow({
    title:'test',
    backgroundColor:'#fff'
});
var tab_test = Ti.UI.createTab({
	title: "test",
	window: test_window
});
var label1 = Titanium.UI.createLabel({
	color:'#999',
	text:'I am Window 1',
	font:{fontSize:20,fontFamily:'Helvetica Neue'},
	textAlign:'center',
	width:'auto'
});

test_window.add(label1);
label1.addEventListener("click", function(e){
	
			Ti.Media.showCamera({
				saveToPhotoGallery: true,
				allowEditing: false,
				mediaTypes: [Ti.Media.MEDIA_TYPE_PHOTO],
				cancel:function(){
					Ti.API.warn("camera cancelled");
				},
				error:function(){
					Ti.API.warn("camera error");
				},
				success: function(event){
					Ti.API.warn("camera succeeded");
				}
	});
});
&lt;/pre&gt;
&lt;p&gt;やっているのはこれだけ。空っぽのprojectを作って、これをapp.jsに書くと動くのだけど、実際のアプリに組み込むとsuccessもcancelもerrorも呼ばれなくなったりするのです。どうやらapp.jsなら動くというところに回避策がありそうですが、いまのところドハマリ中。&lt;/p&gt;
&lt;p&gt;他にもドキュメントに書いてあるけど未実装だったり、ググると出てくるサンプルコードがいまの最新では動かなかったり、そもそもそのサンプルで使ってるAPIはドキュメントに書いてなかったり、まぁ、いろいろ香ばしい。まだ実戦で使うものではない気がしてきています。&lt;/p&gt;</description><link>http://www.takenoshin.com/post/7562202452</link><guid>http://www.takenoshin.com/post/7562202452</guid><pubDate>Wed, 13 Jul 2011 13:38:51 +0900</pubDate><category>titanium</category><category>android</category></item><item><title>xibのローカライズでハマる(2)</title><description>&lt;p&gt;以前もハマったxibのローカライズ。またもハマりました。&lt;/p&gt;
&lt;p&gt;どうやらxibをローカライズ前（言語環境毎のファイルを作る前）に実機転送してしまうと、その状態を覚えてしまうのか、その後どうやってもxibの内容が反映されなくなるという状態に陥りました。わけわかんない。&lt;br/&gt;他にも、今回はNSLocalizedStringでいままで取れていた日本語リソースが、ある時点を境に英語しか取れなくなったりと、ローカライズ関連でハマりまくりです。&lt;/p&gt;
&lt;p&gt;NSLocalizedStringのほうはどうやらフォルダの名前に問題があった模様。古いXcodeで作ったprojectなので、English.lproj や Japanese.lproj とかになっていたのですが、これを en.lproj 、 ja.lproj に変更したら日本語が取れるようになりました。&lt;/p&gt;
&lt;p&gt;xibのほうは最後まで解決策がわからず。&lt;br/&gt;仕方ないのでファイル名をrenameしました。renameするととりあえず反映されるようになりました。ホントにもう、わけわかんない。 &lt;/p&gt;</description><link>http://www.takenoshin.com/post/5181065417</link><guid>http://www.takenoshin.com/post/5181065417</guid><pubDate>Wed, 04 May 2011 12:30:56 +0900</pubDate><category>iphone</category></item><item><title>EXC_BAD_ACCESSでハマる</title><description>&lt;p&gt;iPhoneで開発してて、よく突き当たるのが&lt;span&gt;EXC_BAD_ACCESS。&lt;br/&gt;大抵は多重releaseしてしまうなどの単純ミスですが、稀に不可解な&lt;/span&gt;&lt;span&gt;EXC_BAD_ACCESSに陥ることがありますよね。今回たまたま不可解な&lt;/span&gt;&lt;span&gt;EXC_BAD_ACCESSが解決できたので、その顛末を参考までに書いてみます。&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span&gt;&lt;!-- more --&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;今回起きたのは「UIWebViewで画像長押し時にActionSheetを表示する」という処理の中。&lt;/p&gt;
&lt;p&gt;UIWebViewは内包する子Viewの中で処理を行い、UIWebView自体は入れ物でしかなく、UIWebViewにUILongPressGestureRecognizerを登録しても無意味です。 なので「UIWebViewで画像長押し」を検知するのに色々小技が必要になります。&lt;br/&gt;今回検知のためにNSObjectのrespondsToSelector:をmethod swizzlingしていました。ここで長押しを検知し、NSNotificationCenterを経由してActionSheetを出す、という仕組み。処理としては、&lt;/p&gt;
&lt;ol&gt;&lt;li&gt;(NSObject) respondsToSelector:&lt;br/&gt;NSNotificationCenterのpostNotificationName:object:を使って自作クラスのハンドラを呼び出す。&lt;/li&gt;
&lt;li&gt;(自作クラス) notificationハンドラ&lt;br/&gt;ここでUIActionSheetを構築、表示&lt;/li&gt;
&lt;li&gt;(UIActionSheet) showInView:&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;という流れ。&lt;/p&gt;
&lt;p&gt;この処理の流れでテストを行っていたところ、うまく動作するときもあるのですが、(3)の段階でEXC_BAD_ACCESSが起きることがあります。(2)でUIActionSheetを構築してる段階では問題なし。UIActionSheetの構築コードは元々バッチリ動いていた箇所からの転用なので、それが原因とも思えないですし、UIActionSheetを作ってもshowInView:を呼び出さなければEXC_BAD_ACCESSも起きないため構築に問題があるわけではないらしい。&lt;br/&gt;当然UIActionSheet関連処理をすべてコメント化するとEXC_BAD_ACCESSは起きない。 &lt;/p&gt;
&lt;p&gt;正直かなりお手上げ状態。 なにがダメなのか？？？&lt;br/&gt;上記処理は1から3まですべて同期的に動くので、それがダメなのかな？&lt;/p&gt;
&lt;p&gt;試しに(3)を別メソッドに切り出し、(2)からperformSelector:withObject:afterDelay:を使って非同期式に変えてみたところEXC_BAD_ACCESSが出なくなりました！わーい！&lt;/p&gt;
&lt;p&gt;というわけで、私が今回ハマったEXC_BAD_ACCESSではrun loopに戻る前にやってはいけないことをやっているようでした。たぶんrespondsToSelector:から戻った後の処理のなにかとバッティングしているのでしょう。なにとバッティングしているのかは全くわからず、Appleのみぞ知ることでしょう。回避できたのはたまたまです。&lt;/p&gt;
&lt;p&gt;不可解なEXC_BAD_ACCESSがいつも同じ理由というわけではないですが、こういうこともあるようです。困ったときの参考になると幸いです。&lt;/p&gt;
&lt;!-- p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; line-height: 16.0px; font: 13.0px Menlo; background-color: #eeeeee} --&gt; &lt;!-- p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; line-height: 16.0px; font: 13.0px Menlo; background-color: #eeeeee} --&gt; &lt;!-- p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; line-height: 16.0px; font: 13.0px Menlo; background-color: #eeeeee} --&gt;</description><link>http://www.takenoshin.com/post/5152058384</link><guid>http://www.takenoshin.com/post/5152058384</guid><pubDate>Tue, 03 May 2011 12:28:00 +0900</pubDate><category>iphone</category></item><item><title>UIWebViewでリンク長押し時のActionSheet</title><description>&lt;p&gt;UIWebViewはデフォルトで、リンクを長押ししてるとActionSheetが出てきます。選択肢がOpenとCopyしかないので、実質あまり意味がなかったりしますが。&lt;br/&gt;なのでこのActionSheetのボタンをアプリでカスタマイズしたい諸兄も多いことでしょう。&lt;/p&gt;
&lt;p&gt;そんなときのTips。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;まず問題は長押しされたことの検知と、長押しされたリンクのURLの取得。相変わらず、普通にやるとActionSheetが表示されたことすら検知することができません。GestureRecognizerを当てれば長押しされたことだけはわかりますが、それだとリンクURLを抜き出すことが不可能（だと思う）なので、UIWebViewの仕組みを使いたいところです。&lt;/p&gt;
&lt;p&gt;私がやったチカラ押しな方法は次の通り。&lt;/p&gt;
&lt;ol&gt;&lt;li&gt;NSObjectのrespondsSelectorをmethod swizzling。&lt;br/&gt;置き換えたメソッドの中で&lt;span&gt;touchCalloutEnabled&lt;/span&gt;を監視させる。 touchCalloutEnabledでActionSheetを出すべきかどうかを判断させているようなので、これが呼ばれた＝ActionSheetの出番、という判断にできる。&lt;/li&gt;
&lt;li&gt;UIActionSheetのshowInView:をmethod swizzling。&lt;span&gt;touchCalloutEnabled&lt;/span&gt;が呼ばれた直後のshowInView:はUIWebViewが出そうとしているので、それを出さない（捨てて）、独自にActionSheetを表示する。&lt;br/&gt;長押しされたリンクのURLはActionSheetのtitleになっているので、それを使う。&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;というゴリ押しな方法で、とりあえず独自ActionSheetが出せる。&lt;br/&gt;注意点はshowInView:でUIWebViewが表示しようとしたActionSheetを捨てるところ。なにもしないまま放っておくと、ActionSheetが閉じるのを待っているのか、UIWebViewが動かなくなる。仕方ないのでキャンセルボタンが押されたかのように&lt;/p&gt;
&lt;ul&gt;&lt;li&gt; p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo} &lt;span&gt;actionSheet:clickedButtonAtIndex:&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt; &lt;/span&gt;  p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo} &lt;span&gt;actionSheet:willDismissWithButtonIndex:&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;/span&gt;  p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo} &lt;span&gt;actionSheet:didDismissWithButtonIndex:&lt;/span&gt; &lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;を呼び出してあげると忘れてくれます。&lt;br/&gt;相当ごり押しな方法ですが、なんとか目的達成。もっとスマートな方法があれば誰か教えてください&amp;#8230; &lt;/p&gt;

&lt;p&gt;ちなみに、ActionSheetを出さないのは&lt;/p&gt;
&lt;blockquote&gt;
&lt;p class="p1"&gt;[webView stringByEvaluatingJavaScriptFromString:@&amp;#8221;document.documentElement.style.webkitTouchCallout = &amp;#8216;none&amp;#8217;;&amp;#8221;]&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;とやるだけで簡単にブロックできます。&lt;/p&gt;</description><link>http://www.takenoshin.com/post/4549914421</link><guid>http://www.takenoshin.com/post/4549914421</guid><pubDate>Tue, 12 Apr 2011 19:05:48 +0900</pubDate><category>iphone</category><category>UIWebView</category></item><item><title>UIWebViewでcanGoBackが効かない</title><description>&lt;p&gt;UIWebViewではページの読込ませ方によってcanGoBack, canGoForwardの挙動が変わるようです。&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;canGoBackがYESになる&lt;br/&gt;loadRequest: &lt;/li&gt;
&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;canGoBackがNOのまま&lt;br/&gt;loadData:MIMEType:textEncodingName:baseURL:&lt;br/&gt;loadHTMLString:baseURL:&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;これはcanGoBackだけでなく、実際にgoBackしても動作しなくなります。historyがきちんと更新されるのはloadRequest:だけのようです。&lt;/p&gt;
&lt;p&gt;Javascriptでhistoryがいじれるといいのですが、試しにやってみたところ期待通りにはいきませんでした。できそうなものなんですけどね、、&lt;/p&gt;</description><link>http://www.takenoshin.com/post/4172635696</link><guid>http://www.takenoshin.com/post/4172635696</guid><pubDate>Tue, 29 Mar 2011 09:49:00 +0900</pubDate><category>iphone</category><category>UIWebView</category></item><item><title>アプリの申請でハマる</title><description>&lt;p&gt;はじめてiPhoneアプリをAppleに申請してみました。&lt;br/&gt;が、そこで思いっきりハマりまくりでした。&lt;/p&gt;
&lt;p&gt;ハマったのは次の２点。&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;証明書を取らないとダメ&lt;br/&gt;申請するアプリはCode Signされてないとダメで、Code Signは個人証明書を取得してないとダメなわけです。と言ってもこれは比較的有名なハマりポイントらしい。&lt;/li&gt;
&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;スクリーンショット不足&lt;br/&gt;初めてのくせにiPhone, iPadのユニバーサルアプリにしてみたので、iPad用スクリーンショットもアップロードしないとmissing screenshot状態でストップしてしまいます。追加すればよいのですが、Localizeしてると、言語毎にスクリーンショットも独立しているので、全ての言語にiPad用スクリーンショットをアップロードしないといけません。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;どハマりしたのはスクリーンショットで、アップロードしたのに状態が変わらず焦りました。こんな状態になるのはユニバーサルかつLocalizeしたときくらいでしょうからレアケースだと思いますが。&lt;/p&gt;</description><link>http://www.takenoshin.com/post/3961057760</link><guid>http://www.takenoshin.com/post/3961057760</guid><pubDate>Sun, 20 Mar 2011 00:10:23 +0900</pubDate><category>iphone</category></item><item><title>xibのローカライズでハマる</title><description>&lt;p&gt;設定画面など、あちこちに文字列を埋め込んだ画面はいちいちコードでNSLocalizedStringするのが面倒なので、xibをローカライズしてしまうのが簡単だと思います。&lt;/p&gt;
&lt;p&gt;はじめてxibをローカライズしてみたのですが、色々ハマりました。&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;strong&gt;xibはサブフォルダの中でローカライズしてはいけないらしい。&lt;/strong&gt;&lt;br/&gt;たまたまユニバーサルアプリでやっていたので、xibがiPhoneサブフォルダの中に出来てしまいました。そこに置いたままローカライズすると認識されない模様。 文字列リソースをローカライズするとプロジェクトフォルダの直下にJapanese.lprojができますが、そこに入らないとダメみたい。&lt;/li&gt;
&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;サブフォルダの残骸はFinderで削除しないとダメみたい。&lt;/strong&gt;&lt;br/&gt;一回xibをサブフォルダで作ったあと、サブフォルダにできたJapanese.lprojの中にxibが残ったままにすると、Xcode上でxibを削除しても、ビルド時に掴んでしまうくさい。&lt;br/&gt;サブフォルダに作ったxibと同じ名前でプロジェクトフォルダ直下に作り直しても、残骸が残ったままだとそっちが優先して使われているようで、うまく動かなくなりました。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;それにしても、Xcodeはメジャーバージョンが変わるたびに作法がガラリと変わるので、ネットで調べてもどれがいまも使える方法なのかがわかりづらいですね。&lt;/p&gt;</description><link>http://www.takenoshin.com/post/3635579315</link><guid>http://www.takenoshin.com/post/3635579315</guid><pubDate>Fri, 04 Mar 2011 15:07:17 +0900</pubDate><category>iphone</category><category>localize</category></item><item><title>UIWebViewでフォントサイズをいじる</title><description>&lt;p&gt;相変わらずUIWebViewと格闘中です。&lt;/p&gt;
&lt;p&gt;AppStoreにあるブラウザアプリで、フォントサイズが変更できるものがあったので、真似してみることに。&lt;/p&gt;
&lt;p&gt;やり方は簡単、次のようにやるだけ。&lt;/p&gt;
&lt;blockquote&gt;&lt;code&gt;
&lt;p class="p1"&gt;&lt;span class="s1"&gt;script = &lt;/span&gt;@"document.getElementsByTagName('body')[0].style.webkitTextSizeAdjust='120%';"&lt;span class="s1"&gt;;&lt;/span&gt;&lt;/p&gt;
&lt;p class="p1"&gt;&lt;span class="s1"&gt;[webView &lt;/span&gt;stringByEvaluatingJavaScriptFromString:script];&lt;/p&gt;
&lt;/code&gt;&lt;/blockquote&gt;
&lt;p&gt;jQueryなどでスタイルのfont-sizeをいじっても、HTML上のスタイル定義のされ方によって適用されたりされなかったり安定しません。webkitTextSizeAdjustを使えばそういうときでもイチコロです。&lt;/p&gt;
&lt;p&gt;元ネタはこちら。&lt;br/&gt;&lt;a href="http://stackoverflow.com/questions/589177/how-to-increase-font-size-in-uiwebview%C2%A0"&gt;http://stackoverflow.com/questions/589177/how-to-increase-font-size-in-uiwebview &lt;/a&gt;&lt;/p&gt;</description><link>http://www.takenoshin.com/post/3610745444</link><guid>http://www.takenoshin.com/post/3610745444</guid><pubDate>Thu, 03 Mar 2011 10:12:27 +0900</pubDate><category>iphone</category><category>UIWebView</category></item><item><title>続：NSURLCacheでGoogleのトップページをキャッシュすると落ちる件</title><description>&lt;p&gt;結局解決できていません、本件。&lt;/p&gt;
&lt;p&gt;あれからさらにいろいろ試して、見えてきたのは[NSURLRequest cachePolicy]。&lt;/p&gt;
&lt;p&gt;そもそもは、デフォルトのNSURLCache実装がstoreCachedResponseでデータを渡されていてもcachedResponseForRequestで返すものと返さないものが存在している、というところでした。&lt;/p&gt;
&lt;p&gt;なぜか？&lt;br/&gt;データは違えども、NSCachedURLResponse、NSURLResponseの状態は概ね同じ。違うのは[NSURLRequest cachePolicy]。デフォルトのNSURLCacheはNSURLRequestReturnCacheDataElseLoad、NSURLRequestReturnCacheDataDontLoadの場合はキャッシュを返すけど、NSURLRequestUseProtocolCachePolicyの場合は返さないようです。&lt;/p&gt;
&lt;p&gt;相変わらず理由はわかりませんが、真似してみることに。&lt;/p&gt;
&lt;p&gt;ふむ、&lt;strong&gt;落ちなくなった&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;前回も落ちなくなった後、他の箇所をいじっていたら再発したので安心できませんが、とりあえず改善。どうやらものすごく微妙なバランスで動いているようです、NSURLCache。 &lt;/p&gt;
&lt;p&gt;ただ、割といろんなリソースがNSURLRequestUseProtocolCachePolicyでリクエストされているので、NSURLRequestUseProtocolCachePolicyだとキャッシュを返しちゃだめとなるとローカル保存からWebページを再現するのは難しいのかもしれません。。&lt;/p&gt;</description><link>http://www.takenoshin.com/post/3418449921</link><guid>http://www.takenoshin.com/post/3418449921</guid><pubDate>Mon, 21 Feb 2011 14:09:00 +0900</pubDate><category>iphone</category><category>UIWebView</category></item><item><title>[iPhone]UIWebViewでNew Windowをなんとか検知する</title><description>&lt;p&gt;先日（どころか実際には昨年から）ハマってるUIWebViewですが、懸案課題のNew Windowの検知が次のような姑息なアイデアでなんとかなりました！&lt;/p&gt;
&lt;p&gt;やり方は次の2つの組み合わせ。&lt;/p&gt;
&lt;ol&gt;&lt;li&gt;UIWebViewの webView:willClickElement: をoverrideして、elementからtarget属性を探す。（Aタグ用）&lt;/li&gt;
&lt;li&gt;UIWebViewの stringByEvaluatingJavaScriptFromString: でJavascriptの&amp;#8221;window.open&amp;#8221;を書き換えてしまい、window.openされたら特殊なURLに飛ぶようにして、webView:shouldStartLoadWithRequest:navigationType: で検知する。（Javascript用）&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;(1)は簡単で、次のような感じ。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;@implementation UIWebView(hack)&lt;/p&gt;
&lt;p&gt;- (void)webView:(UIWebView *)sender willClickElement:(id)element {&lt;br/&gt;    BOOL is_new_window = NO;&lt;br/&gt;    NSString* nodeName = [element nodeName];&lt;br/&gt;    NSString* hrefURL = [element hrefURL];&lt;br/&gt;    NSString* textContent = [element textContent];&lt;br/&gt;    id attributes = [element attributes];&lt;br/&gt;    int length = [attributes length];&lt;br/&gt;    for(int i = 0; i &amp;lt; length; i++ ) {&lt;br/&gt;        id item = [attributes item:i];&lt;br/&gt;        NSString* name = [item name];&lt;br/&gt;        NSString* value = [item value];&lt;br/&gt;        &lt;br/&gt;        if (NSOrderedSame == [name compare:@&amp;#8221;target&amp;#8221; options:NSCaseInsensitiveSearch]){&lt;br/&gt;            is_new_window = YES;&lt;br/&gt;            break;&lt;br/&gt;        }&lt;br/&gt;    }&lt;br/&gt;    &lt;br/&gt;    if (is_new_window){&lt;br/&gt;        NSLog(@&amp;#8221;clicked!!&amp;#8221;);&lt;br/&gt;    }&lt;br/&gt;}&lt;/p&gt;
&lt;p&gt;@end&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;これは &lt;a href="http://son-son.sakura.ne.jp/?p=752"&gt;http://son-son.sakura.ne.jp/?p=752&lt;/a&gt; を参考にさせてもらいました。&lt;/p&gt;
&lt;p&gt;(2)はなかなか面倒で、次の２ステップが必要。&lt;br/&gt;まず、webViewDidFinishLoad: でwindow.openを書き換える。書き換え方は&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[webView stringByEvaluatingJavaScriptFromString:&lt;br/&gt; @&amp;#8221;window.open = function(url, window_name, options){ &lt;br/&gt;    window_name = window_name == &amp;#8221;&amp;#160;? &amp;#8216;_blank&amp;#8217;&amp;#160;: window_name;&lt;br/&gt;    location.href = &amp;#8216;wopen://&amp;#8217; + (window_name == null&amp;#160;? &amp;#8216;_blank&amp;#8217;&amp;#160;: window_name) + &amp;#8216;/&amp;#8217; + url; &lt;br/&gt;    };&amp;#8221;];&lt;span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;こんな感じ。あとでURLからwindow.openが呼ばれたことと、遷移したいURLがわからなければならないので、schemeを独自のものに書き換えてしまうのがよいと思う。&lt;/p&gt;
&lt;p&gt;続いて、webView:shouldStartLoadWithRequest:navigationType: で検知する部分。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;- (BOOL)webView:(UIWebView *)webView &lt;br/&gt;    shouldStartLoadWithRequest:(NSURLRequest *)request &lt;br/&gt;    navigationType:(UIWebViewNavigationType)navigationType&lt;br/&gt;{&lt;br/&gt;    NSURL *url = [request URL];    &lt;br/&gt;    if ([[url scheme] isEqualToString:@&amp;#8221;wopen&amp;#8221;]){&lt;br/&gt;        NSString *host = [url host];&lt;br/&gt;        if (host&amp;#160;!= nil &amp;amp;&amp;amp; [host isEqualToString:@&amp;#8221;_blank&amp;#8221;]){&lt;br/&gt;            NSLog(@&amp;#8221;new window!&amp;#8221;);&lt;br/&gt;        }&lt;br/&gt;        return NO;&lt;br/&gt;    }&lt;/p&gt;
&lt;p&gt;    return YES;&lt;br/&gt;}    &lt;/p&gt;

&lt;/blockquote&gt;
&lt;p&gt;URLのscheme部分をみてwindow.openなのかどうかを見極め、遷移先を[URL path]で取って、あとは自分でどうにかする、という感じです。&lt;/p&gt;
&lt;p&gt;自分もまだ基礎実験までしかやってないので、すごく見切り発車的エントリです w&lt;br/&gt;このあとアプリに実装してみようと思います。 &lt;/p&gt;</description><link>http://www.takenoshin.com/post/3416150747</link><guid>http://www.takenoshin.com/post/3416150747</guid><pubDate>Mon, 21 Feb 2011 12:00:06 +0900</pubDate></item><item><title>NSURLCacheでGoogleのトップページをキャッシュすると落ちる件</title><description>&lt;p&gt;原因が特定できなくて困っていた、Googleのトップページでだけ発生する落ちバグがあったわけですが、なんとなく原因が特定できたくさい。&lt;br/&gt;ちなみにこれは次のような現象。&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Googleのトップページ（http://www.google.co.jp/）の内容を保存しておき、通信しないでUIWebViewで表示しようとすると落ちる。&lt;/li&gt;
&lt;li&gt;キャッシュの仕方はNSURLCacheでやろうと、別の方法を使っても発生する現象は同じ。&lt;/li&gt;
&lt;li&gt;落ちるのはHTTPProtocol::createStreamのあたり。起きているのはEXC_BAD_ACCESS&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;あちこちのサイトをキャッシュしてみても、上記現象が起きるのはなぜかGoogleだけ。Googleとは言っても、ニュース（http://news.google.co.jp/）では大丈夫だったりします。&lt;/p&gt;
&lt;p&gt;さらに、EXC_BAD_ACCESSは通常過剰releaseによって解放済みのメモリにアクセスすると起きるものですが、いくらretainかましても改善しませんでした。過剰releaseならGoogle以外でも発生するだろうし、ランダム要素があるなら &lt;a href="http://www.google.co.jp/"&gt;http://www.google.co.jp/&lt;/a&gt; で100％発生するというのはおかしいので、やはりGoogleさんのサイト構造に起因するものとして調べてみました。&lt;/p&gt;
&lt;p&gt;とはいってもソースもないライブラリの中で起きてる例外なので調べようもなく、できることといえばファイルの構成をよくよくみてみるくらい。じーっ、とよく見てみると、試してみたサイトの中で、唯一 &lt;a href="http://www.google.co.jp/"&gt;http://www.google.co.jp/&lt;/a&gt; だけHTML5のmanifestファイルが含まれていました！&lt;/p&gt;
&lt;p&gt;試しにmanifest指定を削ってみます。 &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;落ちない！　これか！&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;理屈はわかりませんが、とりあえずmanifest指定を削ってしまうとよいようです。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;（2/21追記）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;いろいろいじってるうちにまた落ちるようになりました。違うらしい。&lt;/strong&gt;&lt;/p&gt;</description><link>http://www.takenoshin.com/post/3399473916</link><guid>http://www.takenoshin.com/post/3399473916</guid><pubDate>Sun, 20 Feb 2011 17:29:00 +0900</pubDate><category>iphone</category><category>UIWebView</category></item><item><title>[iPhone]UIWebViewで困ってること</title><description>&lt;p&gt;相変わらずUIWebViewと戯れているわけですが、いまのところ次の2点で困っていたりします。&lt;/p&gt;
&lt;ol&gt;&lt;li&gt;リンクを長押ししたときに表示されるActionSheetのカスタマイズ方法がわからない&lt;/li&gt;
&lt;li&gt;新しいWindowを開こうとしていることを検知できない&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;iOS4.2だと、長押ししているとUIWebBrowserViewに longPressGestureCanTransitionToRecognizedState: というメッセージが送られてきているようなので、このselectorを書き換えてしまえばなんとかなりそうです。&lt;br/&gt;ですが、UIWebBrowserView は非公開クラスなので、いつ実装が変わるかわからないのであまり適切な方法ではなさそうです。&lt;/p&gt;
&lt;p&gt;一番困っているのは2のほうで、Aタグの場合（&amp;lt;a href=&amp;#8221;hoge&amp;#8221; target=&amp;#8221;_blank&amp;#8221;&amp;gt;等の場合）は検知ができているのですが、Javascriptでwindow.openしようとしていることが検知できなかったりしています。&lt;br/&gt;AppStoreでタブブラウザをいくつかダウンロードしてみたのですが、window.openもきちんと別タブにするアプリもあり、なんらかの方法で検知できるようです。はてさて。。 &lt;/p&gt;</description><link>http://www.takenoshin.com/post/3394416864</link><guid>http://www.takenoshin.com/post/3394416864</guid><pubDate>Sun, 20 Feb 2011 12:00:06 +0900</pubDate></item><item><title>[iPhone]サイトをローカル保存するための格闘</title><description>&lt;p&gt;iPhoneを使っていて、最もイライラするのは通信状況。電波の受信感度はバッチリでも通信できないということが珍しくありません。&lt;br/&gt;iPhoneのせい、というよりは、Softbankの電波のせいなわけですが。&lt;/p&gt;
&lt;p&gt;iPhoneのSafariは（というか普通のブラウザはみな）一回みたページに戻る場合でも 最新かどうかを判断するため通信しようとするので、通信状況が不安定だとブラウジングがものすごくイライラします。&lt;/p&gt;
&lt;p&gt;そこで一度みたページをすべてキャッシュし、キャッシュがあれば最新チェックもなにもかもすっ飛ばして表示してくれるアプリを作ろうとしています。が、これがなかなかに難儀しています。&lt;/p&gt;
&lt;p&gt;いままでチャレンジしてみたこととしては、&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;(1) &lt;/strong&gt;&lt;span&gt;&lt;strong&gt;webView:shouldStartLoadWithRequest:navigationType: で保存すべきURLがわかるか？&lt;/strong&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ol&gt;&lt;li&gt;ドキュメントのURLはこれでわかるけど、画像やCSSなどのリソースについては呼び出されないのでわからない。さらにJavascriptでXHRとかしてるとそれは呼び出されてしまい、なにがページでなにがXHRかわからない。&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;&lt;strong&gt;(2) いっそのこと webView:shouldStartLoadWithRequest:navigationType: に飛んで来たURLからHTMLを取得し、中身をparseして画像やCSSなどのリンクをたどればできるんじゃないか？&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;&lt;li&gt;HTML、CSSのparseはできた。&lt;/li&gt;
&lt;li&gt;GoogleやYahooなどではCSSをJavascriptで後から追加するので、HTMLだけparseしても正しく表示できない。&lt;/li&gt;
&lt;li&gt;Javascriptのparseはさすがにちょっと無理。&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;&lt;strong&gt;(3) &lt;span&gt;uiWebView:&lt;/span&gt;resource:willSendRequest:redirectResponse:fromDataSource: でなら画像やCSSも含めて呼び出されているっぽいからいけるんじゃない？&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;&lt;li&gt;概ねこれで保存対象がわかるようではあるが、一部のリソースは呼ばれない模様。NSURLCacheのcachedResponse:forRequest: をチェックしているとwillSendRequestに飛んで来てないURLがcachedResponse:forRequest: されていたりしている。&lt;/li&gt;
&lt;li&gt;キャッシュしているリソースであればrequestのURLをfile://に書き換えたいが、それをすると落ちる。特にGoogleのトップページとか。&lt;/li&gt;
&lt;li&gt;2が回避不能なのでこれだけでは解決できず。&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;&lt;strong&gt;(4) NSURLCacheでどうよ？&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;&lt;li&gt;キャッシュを返しても落ちない！キャッシュを返すのはこれでイケる。&lt;/li&gt;
&lt;li&gt;UIWebViewWebViewDelegateよりも呼ばれる数が多いので、こちらが呼ばれたものが本当に通信しにいっているリソースだと思われる。なので、これで保存対象がわかる。 &lt;/li&gt;
&lt;li&gt;storeCachedResponse:forRequest: はredirectされていても呼ばれてしまう模様。NSCachedURLResponseだけではredirectされたものかどうかの判断ができそうにないので、保存は無理。&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;という流れ。&lt;br/&gt;結論としては、(4)でなんとかなりそう。&lt;br/&gt;ただしstoreCachedResponse:forRequest: はredirectの絡みで使えないため、&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;cachedResponse:forRequest: で保存対象を特定&lt;/li&gt;
&lt;li&gt;自力で保存&lt;/li&gt;
&lt;li&gt;自力保存したリソースが要求されたらそれをcachedResponse:forRequest: で返す&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;という実装になりそうである。なかなか大変。 &lt;/p&gt;</description><link>http://www.takenoshin.com/post/3372606121</link><guid>http://www.takenoshin.com/post/3372606121</guid><pubDate>Sat, 19 Feb 2011 10:40:00 +0900</pubDate><category>iphone</category><category>UIWebView</category></item><item><title>クラウドとセキュリティ</title><description>&lt;p&gt;クラウドで構築するシステムを進めている中で、サービス毎の差異やセキュリティ対策の状況を調べていました。 主に検討しているのはGoogle AppEngine, Amazon EC2, あとは国内ものとしてニフティクラウド。PaaSとIaaSが混じってるのはご愛嬌。&lt;/p&gt;
&lt;p&gt;個人的には、クラウドは最終的にPaaS化していくだろうと考えていますが、現段階ではGAEはなにかと融通が効かないというか、Webアプリ or サービスを公開する以外には適用できそうにないので、本命はEC2。&lt;/p&gt;
&lt;p&gt;コスト、使えるサービスと自由度、可用性などについては特に問題ないと思うのですが、課題になっているのはセキュリティ。 自分的には、Amazonがセキュリティ施策でなにをしているのかを読むと充分だと思うのですが、これをクライアントに納得してもらうのが難しい。第三者機関からなにかの認定を受けているとかしていてくれれば安心材料になるのですが、SAS70くらいしかないですし、これってセキュリティの認定じゃないし。&lt;/p&gt;
&lt;p&gt;そもそもクライアントには「自分の資産(データ)がどこにあるのかはっきりしないし、データが他人の管理下に置かれるわけだし、しかも他の企業と相乗りサービス」という漠然とした不安が根底にあるので、なおさら根拠を求められるわけです。&lt;/p&gt;
&lt;p&gt;私としては、&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;物理的に完全に分離されていないとしても、暗号化した上で分散して保存されていれば、第三者が不正アクセスでデータを完全な形で引き抜くことはできないでしょうし、複数のデータセンターに冗長化して保存されている時点で物理的なデータ保管場所にはさほど意味がないと思ってます。&lt;/li&gt;
&lt;li&gt;運用会社内部からの不正アクセスはホスティングだろうとクラウドだろうと付きまとう問題なので、クラウドという環境の特性ではないと思ってます。&lt;/li&gt;
&lt;li&gt;物理環境としては、他の企業と空間をshareするデータセンターよりも、物理環境に立ち入るのはサービス提供業者だけに限定されているクラウドのほうが入退室管理も厳密にできると思うので、ちょっと前までよくやっていた、自社でサーバを購入してどこかのデータセンターにハウジングしてもらうより、よっぽどセキュアだと思ってます。&lt;/li&gt;
&lt;li&gt;電子的セキュリティも重要ですが、ソーシャルエンジニアリングのほうがよっぽど怖いので、システム化範囲を削って電話対応等を増やすほうが危ないと思ってます。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;自分ではこのように思うのですが、絶対的な保証や安全などは当然ないわけです。明確な課題を検討するのと違い、不安を払拭するのは難しいものですね。&lt;/p&gt;
&lt;p&gt;ちなみにAmazon Web Serviceのセキュリティについてはこちら。&lt;br/&gt;&lt;a href="http://aws.amazon.com/jp/security/"&gt;http://aws.amazon.com/jp/security/&lt;/a&gt;&lt;/p&gt;</description><link>http://www.takenoshin.com/post/3320407585</link><guid>http://www.takenoshin.com/post/3320407585</guid><pubDate>Wed, 16 Feb 2011 12:00:06 +0900</pubDate></item><item><title>バッチ処理の高速化</title><description>&lt;p&gt;5年程前に書かれた、他社が作成したシステムのバッチ処理があまりに不安定 かつ 低速だということなので、改善プロジェクトを実施しています。&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;懸案課題が解消すること&lt;/li&gt;
&lt;li&gt;パフォーマンスが改善されること&lt;/li&gt;
&lt;li&gt;現在保守している会社が保守していけること&lt;/li&gt;
&lt;li&gt;保守性が向上すること&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;となかなかハードルが高い案件です。なんといっても、このシステムは資料もなく、ソースも滅茶苦茶で可読性が悪く、コメントの要領を得なくて大変なのです。&lt;/p&gt;
&lt;p&gt;まだ進行中ですが、&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;長らく不思議現象だった懸案課題も改善できたようですし、&lt;/li&gt;
&lt;li&gt;保守会社に新しい設計を理解してもらえたようですし、&lt;/li&gt;
&lt;li&gt;新しい設計では現行システムの20倍速くらいにパフォーマンス改善されたようですし、&lt;/li&gt;
&lt;li&gt;いままで明文化されていなかった要件やフローが資料化できるネタが洗いだせたようですし、&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;ほぼハードルをクリアできそうです。ひと月でここまでできればなかなかいい感じ。特に、設計／実装のコンセプトを保守会社の方々に伝えて彼らにやってもらう、という方法を採りながら目標達成できそうなのが素晴らしい。&lt;/p&gt;
&lt;p&gt;自分で設計／実装してしまえば割と簡単なのですが、今回は今後の保守の兼ね合いから、保守会社の方々に設計を理解してもらう必要があります。設計／実装に彼らが深く関わることで、彼らに「自分のシステム」という認識をもってもらうことがとても重要だと考えているからです。&lt;/p&gt;
&lt;p&gt;そうは言いつつ、アドバイザーに徹するだけで到達可能だと考えていたレベルに到達できるかどうか不安でした。でもなんとかなりそうです。こういう関わり方でもきちんと実績を残せると、自分も新しいプロジェクトの関わり方ができそうです。&lt;/p&gt;</description><link>http://www.takenoshin.com/post/3308625027</link><guid>http://www.takenoshin.com/post/3308625027</guid><pubDate>Tue, 15 Feb 2011 21:58:00 +0900</pubDate><category>java</category></item></channel></rss>

