2011年9月25日日曜日

quickrun.vimでblockdiagのプレビューする

blockdiagを書くとき、blockdiagに対応したエディタみたいなものは特に無いのでvimで書いていたのですが、やっぱりプレビューがとても面倒で、
➜ ~ blockdiag -a hoge.diag && open hoge.png という感じのコマンドを毎回実行していました。(MacなのでPreviewが勝手に立ち上がってくれる)

これをVimから一発でできるようにするため、Quickrun.vimの設定を書いて見ました。

let g:quickrun_config['diag'] = {
            \'command': '$HOME/.pythonbrew/pythons/Python-2.7.2/bin/blockdiag',
            \'exec': ['%c -a %s -o %{expand("%:r")}.png', 'open -g  %{expand("%:r")}.png'],
            \'outputter':'message',
            \}
" blockdiag
autocmd BufWinEnter,BufNewFile *.diag set filetype=diag

ちょっと汚いですが、こんな感じになりました。

pythonbrewを使ったPython環境にblockdiagを入れているので、そのままcommandにblockdiagと書くとcommand not foundになってしまったので直接パスを指定しています。
openコマンド(-gでバックグラウンドでプロセスが起動)を使っているので、Macでしか動かないと思います。(openの部分を環境ごとに変えればいいけど)
また、デフォルトだとdiagというタイプは存在してないので、自動的にファイルタイプを設定するようにしておく必要もあります。
outputterはよくわからなかったけど、とりあえずこうしてみた。

以下が書いてる様子。quickrunするたびにpreviewも更新できるので、そこそこ便利になった。

2011年9月21日水曜日

(括弧)とスペースを使わないでXSS

タイトルのように括弧とスペースを入力値に使えないような状態でXSSするものを見つけて結構面白かったのでメモ。
その時のサイトを再現したような感じのページ

JS Bin

クイズとか書いてありますが、興味ある方は下の解答を読む前にやってみるといいかもしれないですね。

自分が考えながらやった感じの解答は以下のようなものです

以下に実証コードを作成するまでの経緯を書いておくと

---

  1. 検索キーがエスケープされてない事に気づく
  2. 単純に<script>alert(1)</script>を検索キーとした場合()が大文字変換されてJavaScriptコードはエラーになる
  3. 検索キーにスペースが入ると検索結果が変わり、この場合はエスケープされて正しく出力される
  4. スペースと括弧を使わずにスクリプトを実行するという条件でも、window.nameを使い任意のスクリプトを実行させることが可能。
    XSS例題(下書き中) - st4rdustの日記
    2009-08-17 - hoshikuzu | star_dust の書斎
  5. XSS例題のようなaリンクのtargetにスクリプトを仕込んでやる方法でとりあえず実行できる事は確認したが、実際に罠として踏ませるテストケースにために自動的に実行できるようにする。
  6. window.openでtarget指定や、aリンクを用意してdocument.createEvent('MouseEvents')で自動的に踏ませる方法はポップアップブロックに阻まれてしまった。(許可すれば実行はできる)
    Chrome で画像の一括ダウンロード - Griever
  7. target指定があると、ポップアップブロックされてしまうが、targetはframeの指定にも利用できる。
    <a>-HTML5タグリファレンス
  8. つまり、以下のようにtargetに仕込んだスクリプトと同じ名前をつけたiframeを用意すれば、ポップアップせずに iframe内のURLが書き換わるようになり、そのURLにJavaScriptの実行コードを仕込むことができる。
<iframe src="http://攻撃対象サイト" name="javascript:alert(1)"></iframe>
<a id="xss" href="http://攻撃対象サイト/%3Cscript%3Elocation.href=window.name%3C/script%3E" target="javascript:alert(1)">
XSS
</a>
後は、マウスクリックを自動でさせるようにすれば、罠ページにアクセスしたら任意のJavaScriptを実行できる。

----

という感じの流れで、上記の解答例を作ってました。
window.nameで実行できることにはすぐ気づいたのですが、それを自動的に実行させる方法を色々試していたので何か遠回りな方法になっています。

window.nameの参考リンクにもでてきた@s_hskzさんによる解答はもっとシンプルで、こっちのほうが失敗もないし良いと思います。

他にも解答はあるような気がしますがこんなところで。

再現したページのしょっぱいPHPコードは http://codepad.viper-7.com/1EvHix で見られます。

iOSアプリのコンソールに出てくるアプリ名を変更する

iOSアプリを書いてる時に、Targetを複製したりするとアプリ名やコンソールに出てくる名前などデフォルトで"元Target名 copy"という感じになってしまいます。
identifierはすぐわかりますが、特にコンソールに出てくる名前の変え方がよくわかりませんでした。

InfoタブのBundle nameがそれに該当するようですが、Bundle nameは${PRODUCT_NAME}を参照しているため、${PRODUCT_NAME}を変更する方が合理的です。
${PRODUCT_NAME}はBuild SettingsタブのPackagingセクションにあります。
${PRODUCT_NAME}はConfigurationsごとに変更できるみたいです(まとめて変更もできる)

Ninshin  ninshin xcodeproj

${PRODUCT_NAME}が変更されると、ファイルとして出てくる.appのファイル名も変わるため、コンソールに出てくる名前も変更することが出来ました。

IOSシミュレータ

とてもわかりづらいですね。はい。

2011年9月17日土曜日

Macでblockdiag動かすためにPython環境作りなおした

homebrewでのPythonが壊れた感じで、brew install pythonとかもまともに出来なかったので、pybrewを使ってPythonをインストールするようにした。

が、その前にbrewで動いてたPythonのやつとかを全部消したくなったので、

osx - How to uninstall Python 2.7 on a Mac OS X 10.6.4? - Stack Overflow

を参考にアンインストール的なことを行った。

sudo rm -rf /Library/Frameworks/Python.framework/Versions/2.7
sudo rm -rf "/Applications/Python 2.7"
ls -l /usr/local/bin | grep '../Library/Frameworks/Python.framework/Versions/2.7' # これ見るとpythonへのリンクしてるものがわかるので、削除する

で、次にpybrewをインストールした。

$ curl -kL http://github.com/utahta/pythonbrew/raw/master/pythonbrew-install | bash

そして.zshenvにsource $HOME/.pythonbrew/etc/bashrcを書き込んだ。

こうすればpybrewコマンドが使えるようになるので、

pybrew install <version>

で好きなバージョンのPythonをインストールできる。
そのまま2.7.2をインストールしようとしたらエラーになったけど、-fオプションをつけたらインストールできた。

最終的に.zshrcは以下みたいな感じに

# pybrew
if [[ -s $HOME/.pythonbrew/etc/bashrc ]]; then
  source $HOME/.pythonbrew/etc/bashrc
  pybrew switch 2.7.2 >/dev/null
fi

次にblockdiagのインストール。

blockdiag の概要 — blockdiag v1.0 documentation

の手順どおりにやればいいので、freetype2をインストールして、
自分の場合はpipを使いたかったので、

$easy_install pip
$pip install pil
$pip install blockdiag

という感じでインストールできた。

ここまで来るのに一ヶ月かかるぐらいPythonへの苦手意識がつよくて、今まで一回で何かをインストールできた記憶が殆どない。

 

「8.8.8.8,8.8.4.4」より速い「129.250.35.250」より速いDNS

「個人によって効果が異なる可能性があります」という系統のお話なので、
そういう数値の見比べして設定したい方はDNS Jumperとかのソフトウェアを使えばいいんじゃないでしょうか。
DNSの速度比較と設定まで自動的に行えます。(Windows限定だけど)

DNSを変えよう的な話はDNSキャッシュポイズニングとかそういう時にあったのを思い出した。

そういえば、Google Public DNSはいつの間にか日本にもあったんですね。

今時のブラウザはDNS prefetchを持ってる(ChromeとFirefoxにあるのは覚えがある)のでリロードタイミングだとDNSの速度比較にならないという話でもあったけど。

2011年9月15日木曜日

アプリ内課金(In App Purchase)に関するリジェクト事例と仮想通貨について

Appleのアプリ審査ガイドライン、UIWebViewに関係するリジェクト事例と似たようなお話ですが、In App Purchaseについてのリジェクト理由や事例などを調べてみました。

最初に、アプリ内課金での仮想通貨購入について

初めにIn App Purchase プログラミングガイドを見てしまったのが混乱の元みたいな気がしますが、In App Purchase プログラミングガイドには以下のように書かれています。 (iOS Developer Library)

In App Purchaseは、プロダクトを作り出すための汎用のメカニズムを提供しますが、プロダクトの
実装方法の詳細はデベロッパにゆだねています。ただし、アプリケーションの設計においては、以
下に示すように留意すべき重要なガイドラインがいくつかあります。

●アプリケーションの中で提供できるのは電子商品または電子サービスに限られています。In App
Purchaseを使って実物の商品やサービスを販売することはできません。

●中間通貨のようなアイテムを提供することはできません。 これは、特定の商品やサービスを購
入するということがユーザに認識されることが重要であるためです。

●販売用に提供するアイテムには、ポルノ、誹謗、中傷、ギャンブル(ギャンブルのシミュレー
ションであれば問題ありません)や、それらに関連するようなものを含めないようにします。

という感じで、"中間通貨のようなアイテムを提供することはできません"と書かれています。
この中間通貨というものが、mixiアプリやモバゲーなどで見かけるような仮想通貨(ポイントを購入するようなもの)だと思っていたのですが、株式会社アドウェイズのアプリなどは、
In App Purchaseで仮想通貨(魂だったり、愛だったり)を購入することができるようになっていて、これはガイドラインとは違うのか?と思いました。

基本に振り返ってAppleのアプリ審査基準ガイドライン(Appleのアプリ審査ガイドラインに日本語訳のリンクまとめてある)を見ると、

11. Purchasing and currencies

11.4 Apps that use IAP to purchase credits or other currencies must consume those credits within the application

というように仮想通貨の購入に関する注意事項が書いてあったり、Appleの審査項目への質問が多いので私見を晒す - ku-sukeのはてなダイアリーの11を見るとわかりやすいですが、
仮想通貨の購入自体は容認されていて、その購入した仮想通貨がアプリ内で完結しなければならないということが書かれている。
つまり、 そのアプリで購入した仮想通貨が、他のアプリと連動したり、Web版から使えたりしたらマズイのかもしれない。(アプリ版があるのでWebからは使わせないとかでもいいと思うけど)

なので、アプリ内で購入した通貨はアプリの外から触れるようにしてはいけないことに注意すれば、仮想通貨自体は扱ってもよいもののようだ。(実際に確かめたわけではないので保証はできないが)

次にIn App Purchaseに関するリジェクト事例について

iPhone App in App Purchase リジェクトされました|Across the Star Cluster
Reject Database for iPhone:detail

「購入ボタン」を押す前にiTunes StoreのIDとPassを聞いてはいけない。

リジェクト事例共有:アプリ内課金 « ジェネシックスブログ

In App Purchaseで設定する課金の種類は用途に合わせて正確に設定しないといけない。

In App Purchaseのデバックが出来ません。 - iPhone-dev.jp掲示板 | Google グループ

In App Purchase時にiTunes アカウントの使用する旨メッセージ表示する必要がある。

独自課金を使ったリジェクト事例について - iPhone-dev.jp掲示板 | Google グループ

最近は似たようなアプリを大量リリースすると厳しめの判定を受けるので、In App Purchaseを使ってまとめるようにしないといけない感じになってる。

https://twitter.com/#!/glassonion1/status/100470766931423232

"ゲーム内仮想通貨の値段設定はTier 60(8500円)まで"

Store Kitを使ったアプリ内課金の実装について

実装すると、とても罠が多いみたいですが...

公式ドキュメント

iTunes Connectデベロッパガイド
In App Purchaseプログラミングガイド

参考サイトとか

 

2011年9月14日水曜日

コマンドラインからAppCodeを立ち上げる方法

メニュー -> Tools -> Create Command-Line Launcher...

をクリックすると、コマンドライン用のスクリプト生成画面が表示されるので、好きな名前で登録すればコマンドラインからプロジェクトファイルを開けるようになる。

NewImage

appcode app.xcodeproj みたいなかんじで開ける。
XCodeは関連付けされてるので、open app.xcodeprojでプロジェクトを開ける。

 

2011年9月3日土曜日

Xcode4.1のBehaviorを独自定義して整形スクリプトを走らせたかった

 

Xcode4.1からBehaviorを自分で定義できるようになったため、ショートカットから任意のスクリプトが実行可能になった。

NewImage

Using Uncrustify directly in Xcode 4!のように、整形スクリプトを走らせるようにもできるけど、今開いているタブのファイルだけに対してuncrstufiyを実行させたかった。

上記のprintEnv.shを使って、環境変数の一覧を調べてみたところ、実行対象のファイルパスはふくまれていなくて、プロジェクトを対象にやってる感じになっていた…

XcodeDeveloperPlatformsDirectory:/Developer/Platforms
SHELL:/bin/zsh
TMPDIR:/var/folders/5g/5gEvVawpHWu+RB42rXnkr++++TI/-Tmp-/
Apple_PubSub_Socket_Render:/tmp/launch-3WFq58/Render
USER:azu
COMMAND_MODE:unix2003
SSH_AUTH_SOCK:/tmp/launch-H4Av4Y/Listeners
__CF_USER_TEXT_ENCODING:0x1F5:1:14
XcodeDeveloperDirectory:/Developer
PATH:/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin
PWD:/Users/azu/Downloads/ShareKit.0.2.1/0.2.1gm1
XcodeWorkspacePath:/Users/azu/Downloads/ShareKit.0.2.1/0.2.1gm1/ShareKit.xcodeproj/project.xcworkspace
SHLVL:1
HOME:/Users/azu
XcodeProjectPath:/Users/azu/Downloads/ShareKit.0.2.1/0.2.1gm1/ShareKit.xcodeproj
XcodeProject:ShareKit.xcoeproj
LOGNAME:azu
DISPLAY:/tmp/launch-KbbwXZ/org.x:0
XcodeDeveloperApplicationsDirectory:/Developer/Applications
SECURITYSESSIONID:3019c3
_:/usr/bin/ruby

何かいい方法ないのですかね。

Xcode 4.1 for Snow Leopardがインストールできないように見える件

NewImage

Xcode 4.1 for Snow Leopardが公開されています(数日ダウンロードができないトラブルがあった)
snow leopardだとApp StoreのXcodeがダウンロードできなかったので、今まで通りダウンロードしてきてインストールします。

xcode_4.1_for_snow_leopard.dmgというファイルをダウロードして、今までのようにInstallXcode.pkgをインストールしてもそのままではインストールは完了していません。
実際には/Application/フォルダにInstall Xcode.appというファイルがインストールされるだけです。

そのため、Install Xcode.appを実行してインストールすれば/Developer/ディレクトリの方にXcode.appなどがインストールされるようになるみたいです。
(どうしてこんなわかりにくい仕様にしたんだ…)

2011年9月2日金曜日

ShareKitで入力画面なしで投稿させる

ShareKitはTwitterやFacebookやEmailやTumblrなどそのへんのサービスへの投稿をまとめて受け持ってくれるライブラリです。

SHKItem *item = [SHKItem text:[postText text]];
[SHKTwitter shareItem:item];

という感じで、Twitter投稿させたいと思ったとき、shareItemメソッドだと
入力画面がでてから投稿という感じになってしまいます。

入力画面をなしにして、入力をコードで指定して投稿させるにはsendメソッドを使うといいです。

    SHKTwitter *twitter = [SHKTwitter new];
    if([twitter authorize]){
        SHKItem *item = [SHKItem new];
        [item setCustomValue:[postText text]];
        twitter.item = item;
        [twitter send];
    }

shareItemメソッドはログイン状態の確認も自動でやるので、[twitter isAuthorized]しなくてもいいですが、
sendメソッドは投稿するだけなのでログインしていないとエラーになります。
なので、isAuthorizedで確認する必要があるのとログイン処理をするので、[twitter authorize]を使うと楽です。

- (BOOL)authorize
{
	if ([self isAuthorized])
		return YES;
	
	else 
		[self promptAuthorization];
	
	return NO;
}

2011年9月1日木曜日

"Xcodeが予期しない理由で終了しました。" というエラーで開けないXCodeプロジェクトを修復

 

NewImage

XCode4.0.2 for snow leopardを使っていますが、結構な頻度でタイトルのような「Xcodeが予期しない理由で終了しました。」となり、
xcodeprojファイルが開けなくなることがあります。
(ちなみにJetbrains IDEのAppCodeでは開けるという状態)

このプロジェクトの中にある

プロジェクト名.xcodeproj/project.xcworkspace/xcuserdata/ユーザー名.xcuserdatad/UserInterfaceState.xcuserstate

というファイルを削除or移動させれば開けるようになるみたいです。

このファイルはXCode4から追加されたようで、UIの設定を持ってる感じのファイルです。

gitでも邪魔臭いファイルです…
逆に壊れてる状態でもAppCodeで開けたのは、この設定ファイルはXCode専用のものだからのようですね。