tag:blogger.com,1999:blog-53739191274386577982024-03-13T11:59:04.319+09:00seekpointr_plushttp://www.blogger.com/profile/16727192385192587463noreply@blogger.comBlogger43125tag:blogger.com,1999:blog-5373919127438657798.post-60344343828093082862013-07-26T01:12:00.002+09:002013-07-26T01:12:55.483+09:00引越し引越しました。 <a href="http://r-plus.github.io/">http://r-plus.github.io/</a>r_plushttp://www.blogger.com/profile/16727192385192587463noreply@blogger.comtag:blogger.com,1999:blog-5373919127438657798.post-82660212740023016262013-06-01T20:24:00.001+09:002013-06-01T20:25:29.824+09:00UIImageのappIcon取得メソッド<code>UIImage</code>のプライベートクラスメソッド。SpringBoardとIPCしてアイコンイメージ返してくれる。便利。iOS 5.0+<br />
<pre>+ (id)_applicationIconImageForBundleIdentifier:(NSString *)bundleIdentifier format:(int)arg2;
+ (id)_applicationIconImageForBundleIdentifier:(NSString *)bundleIdentifier format:(int)arg2 scale:(float)arg3;</pre>r_plushttp://www.blogger.com/profile/16727192385192587463noreply@blogger.comtag:blogger.com,1999:blog-5373919127438657798.post-14418969940033188682013-05-18T18:01:00.000+09:002013-05-18T18:34:51.841+09:00xpwnのdmgでDecrypt<p><a href="http://seekpoint.blogspot.jp/2013/02/maciosclassdump.html">以前書いた</a><code>vfdecrypt</code>を使うとiOS 6.0からはバグったdmgファイルしか生成できなくなりました。代替としてxpwnの<code>dmg</code>を使う事で正常にDecryptできます。</p><h4 id="xpwnからdmgをビルドする">Xpwnからdmgをビルドする</h4><p>xpwnのコードからビルドします。</p><pre>git clone git://github.com/planetbeing/xpwn.git
cd xpwn
mkdir build
cd build
cmake ..
make dmg-bin</pre><p>warningが出ますが、<code>dmg</code>はコンパイルできてます。<code>dmg/dmg</code>がそれです。<code>/usr/local/bin/</code>にでも入れときましょう。</p><h4 id="dmgでdecrypt">dmgでDecrypt</h4><pre>dmg extract XXX-XXXX-XXX.dmg output.dmg -k <key></pre>r_plushttp://www.blogger.com/profile/16727192385192587463noreply@blogger.comtag:blogger.com,1999:blog-5373919127438657798.post-36900478284196571252013-04-23T23:27:00.000+09:002013-04-23T23:27:57.490+09:00RHEL6.xでファイル生成日時crtimeを確認する方法ファイルには様々なメタデータがあり、代表的なのはmtime, atime, ctimeとかがあります。ext3ではこれらの情報はi-nodeの情報として格納されており、<code>stat</code>コマンド等で確認する事ができます。ここでctimeはChange timeなので厳密にはファイルの生成時間ではありませんが、<a href="https://github.com/torvalds/linux/blob/master/fs/ext4/ext4.h#L697-L698">ext4からは嬉しい事にファイル生成時間がcrtimeとして拡張されています</a>。<br />
<br />
さて、今お仕事で触っているRHEL6.xですが、こいつのcoreutilsのバージョンが8.4です。<a href="https://github.com/gvvaughan/GNU-coreutils/commit/abe5c1f9bc09753fd79e7a121c8ecfa917dfaddb"><code>stat</code>コマンドがcrtimeの表示をサポートする初めてのコミット</a>を含むバージョンは8.6であるため、RHNのパッケージの<code>stat</code>コマンドでは確認できません。RHEL 7.xでは<code>stat</code>で知ることができるでしょう。<br />
<br />
この程度のために他のリポジトリからのパッケージの導入やコンパイルをするもの億劫ですし、頻繁に使うわけでもありません。情報自体はi-nodeに格納されているため、その情報を見ることができればcrtimeを知る事ができます。<code>debugfs</code>コマンドはext2, 3, 4のデバッグ用のコマンドで、これを使ってファイルのi-nodeの情報を見ることができます。<br />
<br />
<code>debugfs -R "stat /root/test" /dev/mapper/vg01-lv02</code><br />
ファイルシステムのマウントポイントをルートとしたPATH指定なので注意。<>でくくってi-node番号指定にする事もできます。これを打つと以下のようにi-nodeの情報が出力されます。<br />
<pre>Inode: 133370 Type: regular Mode: 0644 Flags: 0x80000
Generation: 1995841318 Version: 0x00000000:00000001
User: 0 Group: 0 Size: 250
File ACL: 0 Directory ACL: 0
Links: 1 Blockcount: 8
Fragment: Address: 0 Number: 0 Size: 0
ctime: 0x4c080d16:0bf9435c -- Thu Jun 3 21:14:14 2010
atime: 0x4c3da303:c11dd858 -- Wed Jul 14 12:44:03 2010
mtime: 0x4c080d16:0bf9435c -- Thu Jun 3 21:14:14 2010
crtime: 0x4c080d16:0bf9435c -- Thu Jun 3 21:14:14 2010 ←これ
Size of extra inode fields: 28
EXTENTS:
(0): 557470 </pre>r_plushttp://www.blogger.com/profile/16727192385192587463noreply@blogger.comtag:blogger.com,1999:blog-5373919127438657798.post-48964235428947618352013-04-10T21:54:00.000+09:002013-04-10T21:54:21.209+09:00アプリのスタートアップ機能を搭載したInfinityTask v1.4 <div xmlns='http://www.w3.org/1999/xhtml'><p>InfinityTaskの1.4をリリースしました。1.4では実験的な機能としてアプリのスタートアップを登録できる機能を追加しました。 「Startup Applications」の項目でアプリをオンにするとRespring後に自動でそのアプリが起動します。 SafariとChromeではこの起動時にOpenTabBackground++が動作するようにしました。</p><p>この起動は電話やメールと同様のサイレントな起動をしますので、通常のアプリ起動シーケンスとは異なる起動シーケンスになります。 このためアプリ側の各種初期化を行うメソッドの実装によっては望みの状態まで起動されない事もあります。(特にゲーム系はスタート画面まで行かない事が多いです)</p><p>本機能の主眼であるSafari, Chromeにおいては起動されてOTB++が動作する事を確認済みです。</p></div>r_plushttp://www.blogger.com/profile/16727192385192587463noreply@blogger.comtag:blogger.com,1999:blog-5373919127438657798.post-344505470454927072013-03-16T20:40:00.001+09:002013-03-16T20:46:49.988+09:00iPadかどうか判別する <div xmlns='http://www.w3.org/1999/xhtml'><pre>[[UIDevice currentDevice] isWildcat]</pre>でもいいんですが、無駄にPrivate API使うのも危険なので(とは言えAppleのコードではかなり使われているのでこれの仕様が変わったり無くなったりする事はほぼ無いんじゃないかとは思いますが)、最近良く見かける下記のやり方の方が良さそう。<br />
<pre>static BOOL IsPad(void)
{
return UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad;
}</pre><p>これも安心のiOS 3.2+</p></div>r_plushttp://www.blogger.com/profile/16727192385192587463noreply@blogger.comtag:blogger.com,1999:blog-5373919127438657798.post-78413500701467738632013-03-16T20:31:00.001+09:002013-03-16T20:46:42.317+09:00画面が縦なのか横なのかを判別する <div xmlns='http://www.w3.org/1999/xhtml'><p>これまで色々なメソッド使ってみたりしましたが、これ以上ない正解に辿りついたのでメモ。</p><pre>static BOOL IsLandscape(void)
{
return UIInterfaceOrientationIsLandscape([UIApplication sharedApplication].statusBarOrientation);
}</pre><p>ちなみにステータスバーが非表示でも大丈夫みたいです。<br />
Available in iOS 2.0 or higherの安心設計。</p></div>r_plushttp://www.blogger.com/profile/16727192385192587463noreply@blogger.comtag:blogger.com,1999:blog-5373919127438657798.post-62839217023198459702013-03-03T16:15:00.000+09:002013-03-03T16:23:38.354+09:00resizableImageWithCapInsets:(UIEdgeInsets)capInsets でちょっとハマった話<h4>Capの左右(上下)の合計を画像の幅(高さ)と同じにした時のバグ(iOS 5)</h4>ボタン用の下のような画像を背景に使った時にこんなコードを書いてハマったケース。<br />
<a href="http://4.bp.blogspot.com/-j1FvvdEtJUo/UTLuoPkNbKI/AAAAAAAAALE/Jpk0RybtM0I/s1600/Button@2x.png" imageanchor="1" ><img border="0" src="http://4.bp.blogspot.com/-j1FvvdEtJUo/UTLuoPkNbKI/AAAAAAAAALE/Jpk0RybtM0I/s320/Button@2x.png" /></a><br />
<pre>[button setBackgroundImage:[bgImage resizableImageWithCapInsets:UIEdgeInsetsMake(20.0f, 22.0f, 20.0f, 22.0f)] forState:UIControlStateNormal];</pre>こう書くとiOS 6ではうまくいくのだけど、iOS 5では通常時は普通の表示だけどボタンを押下すると何か欠ける。<br />
<a href="http://3.bp.blogspot.com/-rJ-LJ7LZf8g/UTLw-Vuxp-I/AAAAAAAAALg/yXvzurQ1w0E/s1600/IMG_20130303154243.jpg" imageanchor="1" ><img border="0" src="http://3.bp.blogspot.com/-rJ-LJ7LZf8g/UTLw-Vuxp-I/AAAAAAAAALg/yXvzurQ1w0E/s320/IMG_20130303154243.jpg" /></a><br />
これは元画像の幅44pxに対してUIEdgeInsetsMakeのleftとrightの合計が44pxで同一になっているのが原因だ。左右端が表示されているのは画像の高さが47pxでtop+bottomは40だからだろう。ちなみに同一になるように書いてもiOS 6では丁度境界の1pxを引き伸ばしているのか、いい具合に表示された。丁度にする必要はないので若干数値を減らせばOKだ。<br />
<pre>[button setBackgroundImage:[bgImage resizableImageWithCapInsets:UIEdgeInsetsMake(20.0f, 20.0f, 20.0f, 20.0f)] forState:UIControlStateNormal];</pre><h4>Capの左右(上下)で片方だけ0指定した時のバグ(iOS 5)</h4><a href="http://1.bp.blogspot.com/-qMDLS7j_9Ss/UTL0noMwAVI/AAAAAAAAAL8/Xs90X8Q2Hu4/s1600/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88_2013_03_03_15_29.png" imageanchor="1" style="clear:right; float:right; margin-left:1em; margin-bottom:1em"><img border="0" src="http://1.bp.blogspot.com/-qMDLS7j_9Ss/UTL0noMwAVI/AAAAAAAAAL8/Xs90X8Q2Hu4/s320/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88_2013_03_03_15_29.png" /></a>先ほどの画像のUIActivityViewController呼び出し時みたいなViewの背景に指定している画像は右のような1x44の画像で、これをリサイズさせて背景に指定しているが、上の方にしか適応されていない。コードはこんな感じだ。<br />
<pre>_backgroundImageView.image = [bgImage resizableImageWithCapInsets:UIEdgeInsetsMake(43.0f, 0, 0, 0)];</pre>これはCap-topを43にして残りの下1pxを伸ばしてくれると思って書いたコードだ。これの原因はtopに1以上の値を指定したがbottomは0を指定しているためだ。どうやら左右(上下)の数値の組み合わせは0,0の組み合わせでなければ1以上を指定して引き伸ばす範囲を明確にしないとダメらしい。ちなみにこれもiOS 6ではイイカンジに引き伸ばして表示された。解決の為には1以上を指定すればいいので、引き伸ばすピクセルが一番下の1pxではなく下から2px目になってしまうが、以下のようにすれば良い。<br />
<pre>_backgroundImageView.image = [bgImage resizableImageWithCapInsets:UIEdgeInsetsMake(42.0f, 0, 1.0f, 0)];</pre><a href="http://3.bp.blogspot.com/-DEnwduygH88/UTLxEH9vYCI/AAAAAAAAALo/DBAdJ8UUiIg/s1600/IMG_20130303154310.jpg" imageanchor="1" ><img border="0" src="http://3.bp.blogspot.com/-DEnwduygH88/UTLxEH9vYCI/AAAAAAAAALo/DBAdJ8UUiIg/s320/IMG_20130303154310.jpg" /></a><br />
これでiOS 5でもちゃんと引き伸ばされる。r_plushttp://www.blogger.com/profile/16727192385192587463noreply@blogger.comtag:blogger.com,1999:blog-5373919127438657798.post-31627746547283403132013-02-23T09:41:00.000+09:002013-02-23T09:41:51.739+09:00BundleIdentifierSearcherあのアプリを買っていないのだけれど、tweak作成にあたってBundleIdentifierを知りたい・・・。そんな貴兄におくるBundleIdentifierSearcher!<br />
<br />
<img src="https://raw.github.com/r-plus/BundleIdentifierSearcher/master/SS.png" /><br />
<br />
検索してダブルクリックするとBundleIdentifierをコピーできます。NSJSONSerializationクラスとNSArray, NSDictionaryのModern Objective-C Literal Syntaxを使っているのでOS X 10.7+が必要です。<br />
iOS 5からのTwitter連携用に作られたのでしょうけど、JSON扱えるクラスがFoundationにあって助かった。<br />
<br />
<a href="http://cl.ly/N6UG">バイナリはこちら</a><br />
<a href="https://github.com/r-plus/BundleIdentifierSearcher">ソースはgithubに。</a>r_plushttp://www.blogger.com/profile/16727192385192587463noreply@blogger.comtag:blogger.com,1999:blog-5373919127438657798.post-71819722379577068192013-02-11T20:36:00.001+09:002013-02-11T20:36:33.595+09:00Sleipnizer 3.1が出ましたSleipnizer 3.1が出ました!<br />
<br />
新機能<br />
<h4>■Improved FindOnPageアクション</h4>独自のFindOnPageを呼ぶ出すアクションを追加しました。<br />
<iframe width="420" height="315" src="http://www.youtube.com/embed/HdX6PtztzC0" frameborder="0" allowfullscreen></iframe><br />
<br />
<h4>■Focus SearchBarアクション</h4>検索バーにフォーカスするアクションを追加しました。<br />
<br />
<h4>■KeepTabBarオプション</h4>タブを残してフルスクリーンにするフルスクリーンオプションを追加しました。<br />
<a href="http://2.bp.blogspot.com/-9tO1Lq-Syy0/URjK8FinY0I/AAAAAAAAAKM/8GNHnAZxfSY/s1600/IMG_0021.png" imageanchor="1" style=""><img border="0" height="240" width="320" src="http://2.bp.blogspot.com/-9tO1Lq-Syy0/URjK8FinY0I/AAAAAAAAAKM/8GNHnAZxfSY/s320/IMG_0021.png" /></a><br />
<h4>■SmartBannerKillerオプション</h4>こいつを殺せます。<br />
<a href="http://2.bp.blogspot.com/-zCBA-OH59Lw/URjNec9eSjI/AAAAAAAAAKg/Sd5zP7MqdHM/s1600/%25E5%2586%2599%25E7%259C%259F_2013-02-11_19_11_48.png" imageanchor="1" style=""><img border="0" height="320" width="180" src="http://2.bp.blogspot.com/-zCBA-OH59Lw/URjNec9eSjI/AAAAAAAAAKg/Sd5zP7MqdHM/s320/%25E5%2586%2599%25E7%259C%259F_2013-02-11_19_11_48.png" /></a><br />
<h4>■iOS 6ネイティブのオーバーレイボタンを縦画面でも表示させる</h4><h4>■このオーバーレイボタンに長押しジェスチャー</h4>こいつを縦画面でも表示させます+何故か標準では長押ししても履歴が出ないので、出るようにしました。<br />
<a href="http://3.bp.blogspot.com/-X1jr43_kiow/URjPTGeAXOI/AAAAAAAAAKw/uVTVBJnvLuI/s1600/%25E5%2586%2599%25E7%259C%259F_2013-02-11_19_20_34.png" imageanchor="1" style=""><img border="0" height="320" width="180" src="http://3.bp.blogspot.com/-X1jr43_kiow/URjPTGeAXOI/AAAAAAAAAKw/uVTVBJnvLuI/s320/%25E5%2586%2599%25E7%259C%259F_2013-02-11_19_20_34.png" /></a><br />
<br />
<br />
<br />
<h4>■L/R始まりのジェスチャーの安定性を向上</h4>時にジェスチャーが効かない事をなくしました。<br />
<h4>■4.2でもインストール可に。</h4><h4>■いくつか不要と思うアクションを廃止</h4>r_plushttp://www.blogger.com/profile/16727192385192587463noreply@blogger.comtag:blogger.com,1999:blog-5373919127438657798.post-12871852386777482422013-02-08T01:32:00.000+09:002013-02-08T01:32:54.698+09:00New tweak "InfinityTask"<p><code>InfinityTask</code> debut on Cydia Store!</p><p>This new tweak feature is...</p><li>Infinite background task.</li><br />
<li>Add <code>OpenTabBackground++</code> background task to Safari and Chrome.</li><br />
<li>Add <code>Add to ReadingList</code> background task to SpringBoard for iOS 6+.</li><br />
<h4>■Infinite bgtask and change idle sleep behavior.</h4><p>First, this is iOS original task completion and idle sleep behavior mechanism since iOS 4.</p><img src="https://cacoo.com/diagrams/zF7iLHBJLTil87Kb-60DEE.png" /> <p>Then below image is <code>InfinityTask</code>tweaked version of one.</p><img src="https://cacoo.com/diagrams/TxPZNVP8PgngFftv-60DEE.png" /> <p>If you lock the device then after 15s, iOS go <code>idle sleep</code>mode for battery life(super power saving mode). Idle sleep mode stoped most HW and SW feature also TCP connection. But many background task required network connection; So system prevent idle sleep mode for background task during it running.</p><p>Although iOS restrict 600sec for battery. <code>InfinityTask</code> unlock that mechanism! You can enable infinite background task one by one apps, that app's background task can prevent your selected time have passed after locking the device. I recommend enable to network connection not required bgtask type apps.</p><h4>■Add <code>OpenTabBackground++</code> background task to Safari and Chrome.</h4><p>Added new background task for Safari and Chrome monitoring clipboard to open url as new tab in background.</p><iframe width="560" height="315" src="http://www.youtube.com/embed/1oPpYvh7g0I" frameborder="0" allowfullscreen></iframe><br />
<h4>■Add <code>Add to ReadingList</code> background task to SpringBoard for iOS 6+.</h4><p>Said <code>OpenTabBackground++</code> is background task, so that app must running background. This feature isn't require Safari running in background. When you copy URL to clipboard, automatically add to ReadingList that URL.</p>r_plushttp://www.blogger.com/profile/16727192385192587463noreply@blogger.comtag:blogger.com,1999:blog-5373919127438657798.post-80465603860283599642013-02-03T13:11:00.000+09:002013-02-03T13:11:37.156+09:00Mac上でiOSバイナリをClassDump<p>「あのバージョンのバイナリ(SpringBoardとか)をClassDumpしたいけど稼働してる実機がないなぁ」って時の方法。</p><ol style='list-style-type: decimal'><li><a href='http://iphone-elite.googlecode.com/files/vfdecryptIM.zip'>vfdecrypt(Intel Mac)</a> をDL。chmod +xして/usr/local/binにでも突っ込むといいでしょう。</li>
<li>Dumpしたいバージョンの<a href='http://theiphonewiki.com/wiki/Firmware'>ipsw</a>をDL。</li>
<li>ipswをunzip<code>mkdir dmg; unzip hogehoge.ipsw -d dmg; cd dmg</code></li>
<li>対象の<a href='http://theiphonewiki.com/wiki/VFDecrypt_Keys'>VFDecrypt key</a>を調べる。Root Filesystemのやつね。</li>
<li><code>vfdecrypt -i hogehoge.dmg -k 対象のkey -o output.dmg</code></li>
<li>output.dmgをマウントしてバイナリをコピる。</li>
<li>class-dumpする。</li>
</ol><p>以上。</p>r_plushttp://www.blogger.com/profile/16727192385192587463noreply@blogger.comtag:blogger.com,1999:blog-5373919127438657798.post-26244181235742063272013-01-30T00:18:00.000+09:002013-01-30T00:28:31.545+09:00Teratermのアノ挙動をvimに!<p>この記事は<a href="http://atnd.org/events/33746">Vim Advent Calendar 2012</a>の61日目の記事です。<br />
60日目は@KSuzukiiiさんの「<a href="http://lsifrontend.hatenablog.com/entry/2013/01/29/000346">はじめての unite source(unite-tig)</a>」でした。</p><p>最近仕事で使うWindowsでもgvim(kaoriyaさん版)を使用しだしたのですが、コピペまわりで四苦八苦したのでそのあたりの事を書きます。</p><h4 id='windows-gvimでのコピペ事情'>Windows gvimでのコピペ事情</h4><p>Windowsのgvimですが、Windows標準の<code><C-c></code>や<code><C-v></code>でのコピペが初期設定ではできません。</p><p>これを実現するには<code>source $VIMRUNTIME/mswin.vim</code>を書いてvimrcで有効にすればできるようになります!が、行選択ビジュアルモード<code><S-v></code>時に<code><C-f></code>や<code><C-b></code>で画面移動すると選択が外れるバグがあります。</p><p>これが結構使う動作のため、泣く泣く無効化させてクリップボードの貼り付けは右クリックから行なっていました。</p><h4 id='ある日気づいた'>ある日気づいた!</h4><p>gvimで右クリックするといくつかのメニューが出てきますが、クリップボードからの貼り付けにしか使用していない事に気づきました。唐突ですが皆さんはsshクライアントは何を使用していますか?私はMacではTerminal.appでWindowsではTeratermを使っています。</p><p>このTeratermのデフォルト設定に以下の2つの機能があります。</p><ul><li>選択した文字列を自動でクリップボードに保存</li>
<li>右クリックするとクリップボードの文字列を挿入</li>
</ul><p>この2つの機能をなかなか気に入っていまして、右クリックを貼り付けにしか使用していないならTeratermのこの挙動をVimにも設定したところなかなか便利!</p><h4 id='vimrcに追加'>vimrcに追加!</h4><p>まずは「選択すると自動でクリップボードに文字列を保存する」設定から。下記の設定でビジュアルモードで選択すると自動でクリップボードに保存されます。(+clipboardでコンパイルされたvimである必要があります)</p><pre>" GUI
set guioptions+=a
" CUI
"set clipboard+=autoselect</pre><p>次に「右クリックでクリップボードの文字列を挿入」ですが、ノーマルモードとインサートモードの両方でできるようにしました。こちらも*レジスタを利用するのでclipboardが有効なvimが必要です。</p><pre>nnoremap <RightMouse> "*p
inoremap <RightMouse> <C-r><C-o>*</pre><h4 id='完成ッ'>完成ッ!</h4><p>上記の設定でTeraterm風のキーバインドのVimを得られました。エクセルやらでコピーして右クリックでVimに貼り付けッ!今のところこの設定で快適に作業できています。このカスタマイズ性の高さがVimの醍醐味ですね。</p><p>明日の62日目は2回目の<a href="http://d.hatena.ne.jp/thinca/">@thinca</a>さんです。楽しみです。</p>r_plushttp://www.blogger.com/profile/16727192385192587463noreply@blogger.comtag:blogger.com,1999:blog-5373919127438657798.post-58983273304203995882013-01-14T17:41:00.000+09:002013-01-14T17:41:00.790+09:00自動retainされないNSMutableSet<p>addObjectしてもretainされないNSMutableSetを作る。使い所はグローバル変数のstatic NSMutableSet *でこれを使って特定クラスのオブジェクトを詰め込んでいって、あるタイミングで全インスタンスに対して何か処理をする為。retainさせないのはreleaseタイミングはデフォルトのままにするため。まぁaddObjectしたらすぐにreleaseするのと大差ないんだけどね(その場合もSEGVには注意しないといけない)。</p><pre>CFSetCallBacks assignCallbacks = kCFTypeSetCallBacks;
assignCallbacks.retain = NULL;
assignCallbacks.release = NULL;
NSMutableSet *assignSet = (NSMutableSet *)CFSetCreateMutable(kCFAllocatorDefault, 0, &assignCallbacks);</pre><p>これで<code>[assignSet addObject:obj];</code>してもobjのretainCountは増えない。解放されたオブジェクトを触るとSEGVになるので、以下のようにaddするオブジェクトのクラスにおけるdeallocの中で外す。</p><pre>- (void)dealloc
{
if ([assignSet containsObject:self])
[assignSet removeObject:self];
[super dealloc]; // %orig;
}</pre>上記のようにdeallocいじらないといけないので、単一のクラスのオブジェクトを詰め込む場合以外ぐらいに留めておくのがよさそう。<br />
<br />
参考 <a href="http://decafish.blog.so-net.ne.jp/2010-10-27-1">http://decafish.blog.so-net.ne.jp/2010-10-27-1</a>r_plushttp://www.blogger.com/profile/16727192385192587463noreply@blogger.comtag:blogger.com,1999:blog-5373919127438657798.post-6028945194292811952012-12-30T13:36:00.000+09:002012-12-30T13:36:52.472+09:00シェルスクリプトのファイル内未定義変数を調べる<h4 id='どれが外部ファイルで宣言されているのかわからない'>どれが外部ファイルで宣言されているのかわからない</h4><p>シェルスクリプトでかなりの数の変数を外部ファイルで定義をしているものに出会った時に、どれが外部宣言なのかを調べるために作りました。check.py < sample.shって感じで使います。</p><br />
<br />
<script src='https://gist.github.com/4374181.js'></script><br />
evalで変数展開して組み合わせて使っている変数には対応していません。<br />
<pre>hoge=foo
fuga=bar
foobar=yes
eval echo \$$hoge$fuga
# yes</pre>r_plushttp://www.blogger.com/profile/16727192385192587463noreply@blogger.comtag:blogger.com,1999:blog-5373919127438657798.post-87079799731511945142012-12-23T20:18:00.003+09:002012-12-23T23:56:36.649+09:00NoLockScreen2 Public beta test<h4 id='nolockscreen'>NoLockScreen</h4><p>NoLockScreenご存知ですか?そこそこ古くからあるtweak(CydiaUpdates.netを見る限りは2010/10/05)でアラートがなく、パスコードロックもされていないようであればiPhoneの特徴的なslide to unlockをスキップしてくれる代物で愛用しています。</p><p>が、初版の公開から一切のアップデートが行われておらずiOS5での新しいバナーシステムへの対応は行われていませんでした。さらにiOS6ではアプリが最前面にある状態(SpringBoardではない)でロック後にロックボタンでロックを解除すると、ロック解除後にすぐさまロックされてしまうバグがあります。</p><p>この状態で放置されており、自分的にも欲しいtweakでしたので対応版をつくりました(こんな時オープンソースならフォークするのが楽なのにと思います、なので将来的にはgithubで公開予定です)。</p><h4 id='nolockscreen2'>NoLockScreen2</h4><p>上述の問題点である</p><ul><li>iOS 5+でロックスクリーンにバナー表示があるのに自動アンロックしてしまう対応不足</li>
<li>iOS 6でロックされてしまうバグ</li>
</ul><p>を解消したNoLockScreen2をパブリックベータテストします。iFileでインストールするのが一番楽だと思います。問題なければBigBoss行き。アイコンは四苦八苦してたら<a href='https://twitter.com/renz0ne23'>@renz0ne23</a>さんが作ってくれました!多謝!</p><p><a href='http://cl.ly/Llj1'>jp.r-plus.nolockscreen2_0.0.1-11_iphoneos-arm.deb</a></p><p>依存関係は以下です。</p><p>Depends: mobilesubstrate, preferenceloader, firmware(>= 4.0)<br />
Conflicts: com.openbrew.nolockscreen</p>r_plushttp://www.blogger.com/profile/16727192385192587463noreply@blogger.comtag:blogger.com,1999:blog-5373919127438657798.post-28114218804233158452012-12-22T21:50:00.000+09:002012-12-22T21:50:34.859+09:00DicActivity<a href="http://3.bp.blogspot.com/-1UgQtahp3Kc/UNWpak8hxRI/AAAAAAAAAJs/MvvtAeE_ZSg/s1600/IMG_0011.PNG" imageanchor="1" style="clear:right; float:right; margin-left:1em; margin-bottom:1em"><img border="0" height="320" width="213" src="http://3.bp.blogspot.com/-1UgQtahp3Kc/UNWpak8hxRI/AAAAAAAAAJs/MvvtAeE_ZSg/s320/IMG_0011.PNG" /></a><br />
<p>ActionMenuで選択文字列を各種辞書やGoogle検索(Safari)に投げ込むDaijirin ActionMenu PluginをiOS 6から使えるようになったUIActivity+UIActivityViewControllerで作り直しました。以下課題というか問題点</p><ul><li>表示時に一気に各ActivityClassをalloc initするコストがやはり高いのか、iPhone 4では動作速度にちょっと不満がでるレベル(といっても0.1sぐらいの差ですが)</li>
<li>オプション追加する度にアイコンで四苦八苦する</li>
<li>アルファ画像しか使えない仕様なので視認性も期待したほど向上していない</li>
</ul><p>お蔵入りの可能性が高そうですかね</p>r_plushttp://www.blogger.com/profile/16727192385192587463noreply@blogger.comtag:blogger.com,1999:blog-5373919127438657798.post-56526365544622505732012-12-14T22:21:00.002+09:002012-12-14T22:21:58.606+09:00execリダイレクト<h5 id="exec-redirect-out">exec redirect-out</h5><code>exec</code>使ってますか?bashの組み込みコマンドの<code>exec</code>はコマンドの変更の他にリダイレクトの動的変更ができます。こんなシェルスクリプトを実行すると、何もしなければファイルディスクリプタ1番の/dev/stdoutに出力されます。<br />
<pre class="prettyprint">#!/bin/sh
echo "first"</pre><p>これを以下のようにすると、途中で全体のファイルディスクリプタをexecコマンドで変更できます。この場合、firstはstdoutにsecondはfileに出力されます。</p><pre>#!/bin/sh
echo "first"
exec > file
echo "second"</pre><h5 id="exec-redirect-in">exec redirect-in</h5>リダイレクトインも同様に動的変更ができますが、おもな使い所はwhile readだと思います。普通ファイルから1行ずつ読み込んで処理を行う場合は<br />
<pre>while read LINE; do
# do something...
done < file</pre>
としますが、標準入力を変更する事で以下のように書くことができます。
<pre>exec < file
while read LINE; do
# do something...
done</pre>
<p>doneのところまで読み進まずとも何のファイルを入力とするのかわかる点がメリットでしょうか。デメリットは他人が読んだ時にわからない可能性が高い点です!調べざるを得なかったよ!他人が読みやすいプログラムを書いたほうが絶対に良いので、使わない方が良いでしょう!</p>r_plushttp://www.blogger.com/profile/16727192385192587463noreply@blogger.comtag:blogger.com,1999:blog-5373919127438657798.post-51152909197660176312012-12-09T17:06:00.000+09:002012-12-09T17:06:43.812+09:00blogger.vimでvimからpost<h5>install pandoc</h5><ol><li><code>brew install haskell-platform</code></li>
<li><code>cabal update</code></li>
<li><code>cabal install cabal-install</code></li>
<li><code>cabal install pandoc</code></li>
</ol><h5>install vim-plugins</h5><ol><li>metarw.vim</li>
<li>blogger.vim</li>
</ol><h5>install ruby 1.9.2+(blogger.vim required)</h5><ol><li><code>brew install ruby</code></li>
</ol><h5>prefer brew and cabal commands</h5><ol><li><code>sudo vim /etc/paths</code></li>
</ol><p>先頭に/Users/r-plus/.cabal/bin, /usr/local/binを追加</p><h5>config blogger.vim</h5><p>自分のbloggerの設定と1.9.2+のRubyへのPATHを指定。</p><script src="https://gist.github.com/4243830.js?file=gistfile1.vim"></script><br />
<h5>install blogger.vim required gems</h5><ol><li><code>gem install nokogiri</code></li>
<li><code>gem install net-https-wrapper</code></li>
</ol><h5>Post From Vim!</h5><p>これでmarkdown形式で書いたバッファから<code>:w blogger:create</code>でBloggerに投稿されます。<br />
が、なにやら自動で改行タグが入れられてしまったのでxmlを圧縮するパッチを書きました。<a href="https://github.com/r-plus/blogger.vim/commit/844e1cfc387c49e858daefbb943ab62dbfd4dbdd">https://github.com/r-plus/blogger.vim/commit/844e1cfc387c49e858daefbb943ab62dbfd4dbdd</a> しかしこれだとpreタグの中の改行も削除してしまう。しょうがないので複数行のはgistにでもなげようかと思ったがscriptタグの閉じタグが内包表記になってしまう。なんとままならない事か。</p>r_plushttp://www.blogger.com/profile/16727192385192587463noreply@blogger.comtag:blogger.com,1999:blog-5373919127438657798.post-89117852360430125812012-12-06T23:21:00.000+09:002012-12-09T12:36:44.560+09:00テキストはtextileで書こう!<h4>■textileを使おう!</h4>
<p>いえmarkdownの方が好みなのですが会社でRedmineを使っているので、ドキュメントはtextileで書いておけばそれをコピペするだけでチケットに綺麗に書けるわけです。この書きためたtextileをローカル閲覧する際にHTMLで見れる環境を構築しました。</p><p>vim-quickrun+openbrowser.vimで開くとかApache使わないでinvisible.js使ったり色々模索してますがこれはそのうちの1つです。ちなみにこのBloggerはmarkdownで書いてます。</p>
<h5>■Apacheを導入</h5>
<p>とりあえずWindows向けのApacheをインストールします。</p>
<h5>■PHPをインストール</h5>
<p>PHPを使うのでインストールしておきます。</p>
<h5>■httpd.confの編集</h5>
<p>textileのTypeとActionを追加しておきます。(要mod_action)</p>
<pre><code>AddType text/textile textile
Action text/textile /lib/tt.php
</code></pre>
<p>conf読み直しのためにApacheを再起動。</p>
<h5>■Parserをlibにつっこみます</h5>
<ul>
<li><a href="http://textile.thresholdstate.com/">http://textile.thresholdstate.com/</a>からDLした純正パーサーをlibに突っ込みます。</li>
<li>Actionに指定したtt.phpをlibに突っ込みます <script src="https://gist.github.com/4224581.js?file=tt.php"></script></li>
<li>完成!</li>
</ul>
<p>これで拡張子が.textileのtextile記法のファイルをtextileディレクトリにでも突っ込んでブラウザでlocalhost/textile/hoge.textileとかアクセスすればHTMLで表示されるよ!</p>
<p>cssなしの生htmlもなんなので、会社ではtt.phpで生成しているhtmlにcssをリンクさせて表示させてます。
丸々参考にさせてもらったFenrir川端さんの<a href="http://blog.fenrir-inc.com/jp/2012/05/github_markdown.html">GitHub のように、Markdown ファイルを HTML として表示したい</a>に感謝。</p>
r_plushttp://www.blogger.com/profile/16727192385192587463noreply@blogger.comtag:blogger.com,1999:blog-5373919127438657798.post-26553308956974149482012-12-02T16:58:00.001+09:002012-12-09T12:31:55.649+09:00CLIメモ<h4>■シンボル表示</h4><div>
<ul>
<li>nm</li>
</ul>
<h4>■リンクしているライブラリ表示</h4></div>
<div>
<ul>
<li>otool -L</li>
</ul>
<h4>■文字列</h4></div>
<div>
<ul>
<li>strings</li>
</ul>
<h4>■アーキテクチャ</h4></div>
<div>
<ul>
<li>lipo -info</li>
<li>file</li>
</ul>
</div>r_plushttp://www.blogger.com/profile/16727192385192587463noreply@blogger.comtag:blogger.com,1999:blog-5373919127438657798.post-73706429661614360322012-11-23T12:33:00.001+09:002012-11-23T12:33:50.208+09:00Python辞書型の最初と最後のキーを取得する日付をキーにした辞書の最初と最後を拾うのにちょっと詰まったのでメモ。Python 3ではkeysメソッドが返すのはリストじゃなくてビューに変わるけど、sorted関数にすぐ渡しているので3でもそのまま動く。ちなみにiterkeyメソッドは廃止なので積極的に使わない方が良い。
<script src="https://gist.github.com/4133883.js?file=firstLastKey.py"></script>r_plushttp://www.blogger.com/profile/16727192385192587463noreply@blogger.comtag:blogger.com,1999:blog-5373919127438657798.post-78080168261477408362012-11-19T23:23:00.000+09:002012-12-09T12:32:17.356+09:00iOS 6におけるSleipnizerフルスクリーン機能<p>■Portraitモードにおけるoverlayボタン</p>
<p>v3.1からPortraitモードでもOS標準のoverlayボタンが表示されるように変更します。下記の表はそれを踏まえての遷移表です。</p>
<p>■Sleipnizerフルスクリーン遷移表</p>
<p>Sleipnizer (>= 3.1)のフルスクリーン管理が非常に複雑になってきましたので、まとめておきます。左の状態からアクション後の状態が右側です。on/offの状態はoverlayボタンが出なくて不便なだけなのでならないように作ってます。</p>
<table>
<tr><td>Sleipnizer</td><td>iOS 6 native</td><td>action</td><td>Sleipnizer</td><td>iOS 6 native</td></tr>
<tr><td rowspan="2">off</td><td rowspan="2">off</td><td>tweak</td><td>on</td><td rowspan="2">on</td></tr>
<tr><td>native</td><td>off (on : Relate to native)</td></tr>
<tr><td rowspan="3">off</td><td rowspan="3">on</td><td>tweak (Portrait)</td><td>on</td><td>on</td></tr>
<tr><td>tweak (Landscape)</td><td rowspan="2">off</td><td rowspan="2">off</td></tr>
<tr><td>native (Landscape)</td></tr>
<tr><td rowspan="2">on</td><td rowspan="2">on</td><td>tweak</td><td rowspan="2">off</td><td rowspan="2">off</td></tr>
<tr><td>native</td></tr>
</table>
<p>■Relate to native</p>
<p>Relate to nativeを有効にすると上記の表で1箇所だけ動作が変わります。また、iOS6からのiOS標準のフルスクリーン状態は/var/mobile/Library/Preferences/com.apple.mobilesafari.plistに保存され、Safariの起動時(Suspendから復帰ではない)にplist設定値から状態が復元されるのですが、この際にフルスクリーンがONで保存されていると起動時からフルスクリーンになります。Startup FullScreenが半分入る感じですね。</p>
<p>■Keep statusbar</p>
<p>諸々の整合性からiOS6+ですとKeep statusbarが有効なのはPortraitモードのみになりました。FullScreen for Safariは完全になくしてしまったみたいですが。</p>
<p>■iPad</p>
<p>iPadは標準が入ってこなかったようなので、これまで通りに使えるはずです。はず。</p>r_plushttp://www.blogger.com/profile/16727192385192587463noreply@blogger.comtag:blogger.com,1999:blog-5373919127438657798.post-51290968689884621492012-11-14T23:44:00.000+09:002012-12-09T12:30:32.896+09:00libinstabannerlibinstabannerをリリースしました。iOS5から実装されたUIAlertViewによる通知にかわる方法として上部にバナーがでるおなじみのアレですが、tweakから任意に呼び出すには結構な手間がかかる(特にSpringBoardの外からは)のでライブラリを作りました。
<p>使い方は1通りしかないので難しい事は何もなく、ヘッダーのUsageがもうほんとすべてです。bundleIdentifierの引数はnilチェックしてるのでそこは最低限なにか入れる必要があります。titleはnilにすると自動でDisplayNameが入ります。com.apple.Preferencesを指定して日本語なら「設定」てな感じです。</p>
<script src="https://gist.github.com/4072402.js?file=InstaBanner.h"></script>
<p>bundleIdentifierを自由に指定できるのでこんな感じにすると・・</p>
<pre>[InstaBanner showBannerWithBundleIdentifier:@"eu.heinelt.ifile" title:nil message:@"libinstabanner test"];</pre>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-Q9nEvc0aKx4/UKOsm5cwTRI/AAAAAAAAAJU/5uyIHLYVQII/s1600/2012-11-14%2B06.32.07.png" imageanchor="1" style="clear:right; float:right; margin-left:1em; margin-bottom:1em"><img border="0" height="320" width="213" src="http://1.bp.blogspot.com/-Q9nEvc0aKx4/UKOsm5cwTRI/AAAAAAAAAJU/5uyIHLYVQII/s320/2012-11-14%2B06.32.07.png" /></a></div>
こうなります。タップするとそのアプリを起動できます。<br />面倒なコードが1行ですむね!やったね!r_plushttp://www.blogger.com/profile/16727192385192587463noreply@blogger.comtag:blogger.com,1999:blog-5373919127438657798.post-69172589151394379792012-11-02T22:37:00.000+09:002012-12-09T12:30:59.793+09:00CleanActivity<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-GXAAHlO_VXY/UJPK2wVdEkI/AAAAAAAAAIo/BzbbW_2lYtI/s1600/ac.png" imageanchor="1" style="clear:right; float:right; margin-left:1em; margin-bottom:1em"><img border="0" height="320" width="180" src="http://2.bp.blogspot.com/-GXAAHlO_VXY/UJPK2wVdEkI/AAAAAAAAAIo/BzbbW_2lYtI/s320/ac.png" /></a></div>
<p>iOS 6からUIActivityViewControllerを使用したメニュー導入されました。従来使われていたUIActionSheetより生成にパワーが必要でUIActionSheetよりも起動は遅いですが、表示できるメニュー数が多くて便利ですね。便利なんですが人によっては絶対に使わないようなメニューもあるかと思います。Weiboとか、メールとか、メッセージとか。そこでOS標準提供のActivityをオン・オフ設定できるCleanActivityを作りました。これで私のBylineは2段にまとまってスッキリ!</p>
<p>設定できるのは標準提供されている以下9種類のActivityです。
<li>Twitter</li>
<li>Facebook</li>
<li>Weibo</li>
<li>Message</li>
<li>Mail</li>
<li>Pasteboard</li>
<li>Print</li>
<li>Assign to Contact</li>
<li>Save to CameraRoll</li>
<p>色々とオフにするとスッキリしたメニューにできます。
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-y5uUasNjF6s/UJPLhsazHBI/AAAAAAAAAI0/ptcfQSKHd3g/s1600/cleanactivity.png" imageanchor="1" style="clear:right; float:right; margin-left:1em; margin-bottom:1em"><img border="0" height="320" width="213" src="http://3.bp.blogspot.com/-y5uUasNjF6s/UJPLhsazHBI/AAAAAAAAAI0/ptcfQSKHd3g/s320/cleanactivity.png" /></a></div>
CleanActivityは<a href="https://github.com/r-plus/CleanActivity">github</a>で公開しています。Licensed under the GPL v3です。アイコンのほうきがGPLだったので。CleanStatusのほうきと同じ画像だと思うのですがアレはちゃんとGPL守ってるのでしょうか。</p>r_plushttp://www.blogger.com/profile/16727192385192587463noreply@blogger.com