11月 2011
1件の投稿
2タグ
dojox.form.Uploaderのtips
dojox.form.Uploaderを使っててほいほいハマるので、ほぼ備忘録としてのメモ。
* POST時に他のデータも渡したい
uploadWithFormData()を使う。uploadOnSelectをtrueにすると勝手にsubmitされてしまうので、ファイルを選択されたらすぐにsubmitしたければ
<button data-dojo-type="dojox.form.Uploader" data-dojo-props="
id: 'uploader'
, name: 'uploaded'
, multiple: false
, uploadOnSelect: false
, url: 'xxx'
, onChange: function(){
doUpload();
}">upload now!</button>
function...
10月 2011
1件の投稿
4タグ
celeryでsingletonなタスク
djangoでバッチ処理や非同期処理を組もうとしてceleryを導入。使い方も簡単でとても便利。
が、多重起動されたら困る処理を制限しようとしても、celery自体にはそういう機能がない模様。celeryのcookbookをみると、celery.task.Taskを継承したクラスを自分で作ればいいらしい。でもいちいちclassを定義するのは面倒。
というわけでdecoratorでsingletonなタスクを実現できるようにしてみた。
やり方は簡単。というかcookbookの実装そのまんま。
def singletonTask(lockkey):
def _make_runner(func):
def _work_or_die(*args, **kwargs):
expire_time = kwargs.get("expire",...
8月 2011
3件の投稿
2タグ
dojoでハマってる
Webアプリを開発中で、ブラウザ側はdojoを使っているのですが、色々とハマっております。現在最も困っているのがdojox.grid.DataGridに埋め込んだdijit.form.Buttonの挙動。 dojox.grid.DataGridがなかなか強力で、これが使いたいためにdojoを選んだわけですが、このgridの各行にbuttonを配置すると途端に挙動が怪しくなってきます。
(1)ボタン文言をasciiにすると見た目が装飾されない。
表題の通りだけど、文章からは現象が伝わりづらい。次の画像をみるとわかりやすい。
ascii
not ascii
同じタグ構造で、上はボタンの文言が「test」、下は「テスト」。この違いだけで見た目がこのように変わる。 どちらも画像左上に「test」ボタンがあるが、このようにgridの外であればこの現象は起きない。わけがわからん。
...
1タグ
ファイルアップロード処理でtempfileを使う
ファイルアップロードをする際にposterを使っています。とても便利なのですが、実体ファイルを構築して、posterに食わせて、ファイル削除、という手順が面倒だったので、tempfileを使ってみました。
# 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":...
1タグ
pythonのissubclassでハマる
最近djangoでWebシステムを作るお仕事しています。python、djangoはなかなかよく出来ていてハマるところが少ないのですが、うっかり軽くハマったのでメモ。
あるクラスがあるクラスを継承しているかどうかをチェックするためには組み込み関数のissubclass()を使いますが、継承元が抽象クラスだとissubclass()はFalseを返してくるらしい。
検証のために次のようにやってみた。
>>> class ABC(object):
... class Meta:
... abstract = True
...
>>> class GHJ(ABC):
... hoge = 1
...
>>> issubclass(ABC, GHJ)
False
>>>...
7月 2011
1件の投稿
2タグ
Titaniumで死ぬほどハマる
最近TitaniumでiPhone&Androidアプリを作ってたりしますが、これが死ぬほどハマる地獄道でした。特にAndroid。iPhoneはそれなりにクセがあるけど、理解さえすればそうでもないのですが、Androidは別格です。
いまハマっているのはカメラ。ただ写真を撮って、それをアプリで使いたいだけなのに、なぜか写真を撮り終わったときのイベントハンドラが呼ばれない…。
var test_window = Ti.UI.createWindow({
title:'test',
backgroundColor:'#fff'
});
var tab_test = Ti.UI.createTab({
title: "test",
window: test_window
});
var label1 =...
5月 2011
2件の投稿
1タグ
xibのローカライズでハマる(2)
以前もハマったxibのローカライズ。またもハマりました。
どうやらxibをローカライズ前(言語環境毎のファイルを作る前)に実機転送してしまうと、その状態を覚えてしまうのか、その後どうやってもxibの内容が反映されなくなるという状態に陥りました。わけわかんない。 他にも、今回はNSLocalizedStringでいままで取れていた日本語リソースが、ある時点を境に英語しか取れなくなったりと、ローカライズ関連でハマりまくりです。
NSLocalizedStringのほうはどうやらフォルダの名前に問題があった模様。古いXcodeで作ったprojectなので、English.lproj や Japanese.lproj とかになっていたのですが、これを en.lproj 、 ja.lproj に変更したら日本語が取れるようになりました。
xibのほうは最後まで解決策がわからず。...
1タグ
EXC_BAD_ACCESSでハマる
iPhoneで開発してて、よく突き当たるのがEXC_BAD_ACCESS。 大抵は多重releaseしてしまうなどの単純ミスですが、稀に不可解なEXC_BAD_ACCESSに陥ることがありますよね。今回たまたま不可解なEXC_BAD_ACCESSが解決できたので、その顛末を参考までに書いてみます。
今回起きたのは「UIWebViewで画像長押し時にActionSheetを表示する」という処理の中。
UIWebViewは内包する子Viewの中で処理を行い、UIWebView自体は入れ物でしかなく、UIWebViewにUILongPressGestureRecognizerを登録しても無意味です。 なので「UIWebViewで画像長押し」を検知するのに色々小技が必要になります。 今回検知のためにNSObjectのrespondsToSelector:をmethod...
4月 2011
1件の投稿
2タグ
UIWebViewでリンク長押し時のActionSheet
UIWebViewはデフォルトで、リンクを長押ししてるとActionSheetが出てきます。選択肢がOpenとCopyしかないので、実質あまり意味がなかったりしますが。 なのでこのActionSheetのボタンをアプリでカスタマイズしたい諸兄も多いことでしょう。
そんなときのTips。
まず問題は長押しされたことの検知と、長押しされたリンクのURLの取得。相変わらず、普通にやるとActionSheetが表示されたことすら検知することができません。GestureRecognizerを当てれば長押しされたことだけはわかりますが、それだとリンクURLを抜き出すことが不可能(だと思う)なので、UIWebViewの仕組みを使いたいところです。
私がやったチカラ押しな方法は次の通り。
NSObjectのrespondsSelectorをmethod swizzling。...
3月 2011
4件の投稿
2タグ
UIWebViewでcanGoBackが効かない
UIWebViewではページの読込ませ方によってcanGoBack, canGoForwardの挙動が変わるようです。
canGoBackがYESになる loadRequest:
canGoBackがNOのまま loadData:MIMEType:textEncodingName:baseURL: loadHTMLString:baseURL:
これはcanGoBackだけでなく、実際にgoBackしても動作しなくなります。historyがきちんと更新されるのはloadRequest:だけのようです。
Javascriptでhistoryがいじれるといいのですが、試しにやってみたところ期待通りにはいきませんでした。できそうなものなんですけどね、、
1タグ
アプリの申請でハマる
はじめてiPhoneアプリをAppleに申請してみました。 が、そこで思いっきりハマりまくりでした。
ハマったのは次の2点。
証明書を取らないとダメ 申請するアプリはCode Signされてないとダメで、Code Signは個人証明書を取得してないとダメなわけです。と言ってもこれは比較的有名なハマりポイントらしい。
スクリーンショット不足 初めてのくせにiPhone, iPadのユニバーサルアプリにしてみたので、iPad用スクリーンショットもアップロードしないとmissing screenshot状態でストップしてしまいます。追加すればよいのですが、Localizeしてると、言語毎にスクリーンショットも独立しているので、全ての言語にiPad用スクリーンショットをアップロードしないといけません。
...
2タグ
xibのローカライズでハマる
設定画面など、あちこちに文字列を埋め込んだ画面はいちいちコードでNSLocalizedStringするのが面倒なので、xibをローカライズしてしまうのが簡単だと思います。
はじめてxibをローカライズしてみたのですが、色々ハマりました。
xibはサブフォルダの中でローカライズしてはいけないらしい。 たまたまユニバーサルアプリでやっていたので、xibがiPhoneサブフォルダの中に出来てしまいました。そこに置いたままローカライズすると認識されない模様。 文字列リソースをローカライズするとプロジェクトフォルダの直下にJapanese.lprojができますが、そこに入らないとダメみたい。
サブフォルダの残骸はFinderで削除しないとダメみたい。...
2タグ
UIWebViewでフォントサイズをいじる
相変わらずUIWebViewと格闘中です。
AppStoreにあるブラウザアプリで、フォントサイズが変更できるものがあったので、真似してみることに。
やり方は簡単、次のようにやるだけ。
script = @"document.getElementsByTagName('body')[0].style.webkitTextSizeAdjust='120%';";
[webView stringByEvaluatingJavaScriptFromString:script];
jQueryなどでスタイルのfont-sizeをいじっても、HTML上のスタイル定義のされ方によって適用されたりされなかったり安定しません。webkitTextSizeAdjustを使えばそういうときでもイチコロです。
元ネタはこちら。...
2月 2011
8件の投稿
2タグ
続:NSURLCacheでGoogleのトップページをキャッシュすると落ちる件
結局解決できていません、本件。
あれからさらにいろいろ試して、見えてきたのは[NSURLRequest cachePolicy]。
そもそもは、デフォルトのNSURLCache実装がstoreCachedResponseでデータを渡されていてもcachedResponseForRequestで返すものと返さないものが存在している、というところでした。
なぜか? データは違えども、NSCachedURLResponse、NSURLResponseの状態は概ね同じ。違うのは[NSURLRequest...
[iPhone]UIWebViewでNew Windowをなんとか検知する
先日(どころか実際には昨年から)ハマってるUIWebViewですが、懸案課題のNew Windowの検知が次のような姑息なアイデアでなんとかなりました!
やり方は次の2つの組み合わせ。
UIWebViewの webView:willClickElement: をoverrideして、elementからtarget属性を探す。(Aタグ用)
UIWebViewの stringByEvaluatingJavaScriptFromString: でJavascriptの”window.open”を書き換えてしまい、window.openされたら特殊なURLに飛ぶようにして、webView:shouldStartLoadWithRequest:navigationType: で検知する。(Javascript用)
(1)は簡単で、次のような感じ。
...
2タグ
NSURLCacheでGoogleのトップページをキャッシュすると落ちる件
原因が特定できなくて困っていた、Googleのトップページでだけ発生する落ちバグがあったわけですが、なんとなく原因が特定できたくさい。 ちなみにこれは次のような現象。
Googleのトップページ(http://www.google.co.jp/)の内容を保存しておき、通信しないでUIWebViewで表示しようとすると落ちる。
キャッシュの仕方はNSURLCacheでやろうと、別の方法を使っても発生する現象は同じ。
落ちるのはHTTPProtocol::createStreamのあたり。起きているのはEXC_BAD_ACCESS
あちこちのサイトをキャッシュしてみても、上記現象が起きるのはなぜかGoogleだけ。Googleとは言っても、ニュース(http://news.google.co.jp/)では大丈夫だったりします。
...
[iPhone]UIWebViewで困ってること
相変わらずUIWebViewと戯れているわけですが、いまのところ次の2点で困っていたりします。
リンクを長押ししたときに表示されるActionSheetのカスタマイズ方法がわからない
新しいWindowを開こうとしていることを検知できない
iOS4.2だと、長押ししているとUIWebBrowserViewに longPressGestureCanTransitionToRecognizedState: というメッセージが送られてきているようなので、このselectorを書き換えてしまえばなんとかなりそうです。 ですが、UIWebBrowserView は非公開クラスなので、いつ実装が変わるかわからないのであまり適切な方法ではなさそうです。
一番困っているのは2のほうで、Aタグの場合(<a href=”hoge”...
2タグ
[iPhone]サイトをローカル保存するための格闘
iPhoneを使っていて、最もイライラするのは通信状況。電波の受信感度はバッチリでも通信できないということが珍しくありません。 iPhoneのせい、というよりは、Softbankの電波のせいなわけですが。
iPhoneのSafariは(というか普通のブラウザはみな)一回みたページに戻る場合でも 最新かどうかを判断するため通信しようとするので、通信状況が不安定だとブラウジングがものすごくイライラします。
そこで一度みたページをすべてキャッシュし、キャッシュがあれば最新チェックもなにもかもすっ飛ばして表示してくれるアプリを作ろうとしています。が、これがなかなかに難儀しています。
いままでチャレンジしてみたこととしては、
(1) webView:shouldStartLoadWithRequest:navigationType: で保存すべきURLがわかるか?
...
クラウドとセキュリティ
クラウドで構築するシステムを進めている中で、サービス毎の差異やセキュリティ対策の状況を調べていました。 主に検討しているのはGoogle AppEngine, Amazon EC2, あとは国内ものとしてニフティクラウド。PaaSとIaaSが混じってるのはご愛嬌。
個人的には、クラウドは最終的にPaaS化していくだろうと考えていますが、現段階ではGAEはなにかと融通が効かないというか、Webアプリ or サービスを公開する以外には適用できそうにないので、本命はEC2。
コスト、使えるサービスと自由度、可用性などについては特に問題ないと思うのですが、課題になっているのはセキュリティ。...
1タグ
バッチ処理の高速化
5年程前に書かれた、他社が作成したシステムのバッチ処理があまりに不安定 かつ 低速だということなので、改善プロジェクトを実施しています。
懸案課題が解消すること
パフォーマンスが改善されること
現在保守している会社が保守していけること
保守性が向上すること
となかなかハードルが高い案件です。なんといっても、このシステムは資料もなく、ソースも滅茶苦茶で可読性が悪く、コメントの要領を得なくて大変なのです。
まだ進行中ですが、
長らく不思議現象だった懸案課題も改善できたようですし、
保守会社に新しい設計を理解してもらえたようですし、
新しい設計では現行システムの20倍速くらいにパフォーマンス改善されたようですし、
いままで明文化されていなかった要件やフローが資料化できるネタが洗いだせたようですし、
...
2タグ
UIWebViewでUser-Agentを変更する
UIWebViewでサイトをみると、User-AgentがSafariと違うため、一部のサイトでは iPhoneであると認識できずにPCサイトに連れていかれてしまいます。(Yahooとか)
ちょっと前までは
- (BOOL)webView:(UIWebView *)webView
shouldStartLoadWithRequest:(NSURLRequest *)request
navigationType:(UIWebViewNavigationType)navigationType
{
NSMutableURLRequest *req = (NSMutableURLRequest*)request;
[req setValue:USER_AGENT_STRING forHTTPHeaderField:@"User_Agent"];
return YES;
}
...