どれが外部ファイルで宣言されているのかわからない
シェルスクリプトでかなりの数の変数を外部ファイルで定義をしているものに出会った時に、どれが外部宣言なのかを調べるために作りました。check.py < sample.shって感じで使います。
evalで変数展開して組み合わせて使っている変数には対応していません。
hoge=foo fuga=bar foobar=yes eval echo \$$hoge$fuga # yes
シェルスクリプトでかなりの数の変数を外部ファイルで定義をしているものに出会った時に、どれが外部宣言なのかを調べるために作りました。check.py < sample.shって感じで使います。
hoge=foo fuga=bar foobar=yes eval echo \$$hoge$fuga # yes
NoLockScreenご存知ですか?そこそこ古くからあるtweak(CydiaUpdates.netを見る限りは2010/10/05)でアラートがなく、パスコードロックもされていないようであればiPhoneの特徴的なslide to unlockをスキップしてくれる代物で愛用しています。
が、初版の公開から一切のアップデートが行われておらずiOS5での新しいバナーシステムへの対応は行われていませんでした。さらにiOS6ではアプリが最前面にある状態(SpringBoardではない)でロック後にロックボタンでロックを解除すると、ロック解除後にすぐさまロックされてしまうバグがあります。
この状態で放置されており、自分的にも欲しいtweakでしたので対応版をつくりました(こんな時オープンソースならフォークするのが楽なのにと思います、なので将来的にはgithubで公開予定です)。
上述の問題点である
を解消したNoLockScreen2をパブリックベータテストします。iFileでインストールするのが一番楽だと思います。問題なければBigBoss行き。アイコンは四苦八苦してたら@renz0ne23さんが作ってくれました!多謝!
jp.r-plus.nolockscreen2_0.0.1-11_iphoneos-arm.deb
依存関係は以下です。
Depends: mobilesubstrate, preferenceloader, firmware(>= 4.0)
Conflicts: com.openbrew.nolockscreen
ActionMenuで選択文字列を各種辞書やGoogle検索(Safari)に投げ込むDaijirin ActionMenu PluginをiOS 6から使えるようになったUIActivity+UIActivityViewControllerで作り直しました。以下課題というか問題点
お蔵入りの可能性が高そうですかね
exec
使ってますか?bashの組み込みコマンドのexec
はコマンドの変更の他にリダイレクトの動的変更ができます。こんなシェルスクリプトを実行すると、何もしなければファイルディスクリプタ1番の/dev/stdoutに出力されます。#!/bin/sh echo "first"
これを以下のようにすると、途中で全体のファイルディスクリプタをexecコマンドで変更できます。この場合、firstはstdoutにsecondはfileに出力されます。
#!/bin/sh echo "first" exec > file echo "second"
while read LINE; do # do something... done < fileとしますが、標準入力を変更する事で以下のように書くことができます。
exec < file while read LINE; do # do something... done
doneのところまで読み進まずとも何のファイルを入力とするのかわかる点がメリットでしょうか。デメリットは他人が読んだ時にわからない可能性が高い点です!調べざるを得なかったよ!他人が読みやすいプログラムを書いたほうが絶対に良いので、使わない方が良いでしょう!
brew install haskell-platform
cabal update
cabal install cabal-install
cabal install pandoc
brew install ruby
sudo vim /etc/paths
先頭に/Users/r-plus/.cabal/bin, /usr/local/binを追加
自分のbloggerの設定と1.9.2+のRubyへのPATHを指定。
gem install nokogiri
gem install net-https-wrapper
これでmarkdown形式で書いたバッファから:w blogger:create
でBloggerに投稿されます。
が、なにやら自動で改行タグが入れられてしまったのでxmlを圧縮するパッチを書きました。https://github.com/r-plus/blogger.vim/commit/844e1cfc387c49e858daefbb943ab62dbfd4dbdd しかしこれだとpreタグの中の改行も削除してしまう。しょうがないので複数行のはgistにでもなげようかと思ったがscriptタグの閉じタグが内包表記になってしまう。なんとままならない事か。
いえmarkdownの方が好みなのですが会社でRedmineを使っているので、ドキュメントはtextileで書いておけばそれをコピペするだけでチケットに綺麗に書けるわけです。この書きためたtextileをローカル閲覧する際にHTMLで見れる環境を構築しました。
vim-quickrun+openbrowser.vimで開くとかApache使わないでinvisible.js使ったり色々模索してますがこれはそのうちの1つです。ちなみにこのBloggerはmarkdownで書いてます。
とりあえずWindows向けのApacheをインストールします。
PHPを使うのでインストールしておきます。
textileのTypeとActionを追加しておきます。(要mod_action)
AddType text/textile textile
Action text/textile /lib/tt.php
conf読み直しのためにApacheを再起動。
これで拡張子が.textileのtextile記法のファイルをtextileディレクトリにでも突っ込んでブラウザでlocalhost/textile/hoge.textileとかアクセスすればHTMLで表示されるよ!
cssなしの生htmlもなんなので、会社ではtt.phpで生成しているhtmlにcssをリンクさせて表示させてます。 丸々参考にさせてもらったFenrir川端さんのGitHub のように、Markdown ファイルを HTML として表示したいに感謝。
日付をキーにした辞書の最初と最後を拾うのにちょっと詰まったのでメモ。Python 3ではkeysメソッドが返すのはリストじゃなくてビューに変わるけど、sorted関数にすぐ渡しているので3でもそのまま動く。ちなみにiterkeyメソッドは廃止なので積極的に使わない方が良い。
■Portraitモードにおけるoverlayボタン
v3.1からPortraitモードでもOS標準のoverlayボタンが表示されるように変更します。下記の表はそれを踏まえての遷移表です。
■Sleipnizerフルスクリーン遷移表
Sleipnizer (>= 3.1)のフルスクリーン管理が非常に複雑になってきましたので、まとめておきます。左の状態からアクション後の状態が右側です。on/offの状態はoverlayボタンが出なくて不便なだけなのでならないように作ってます。
Sleipnizer | iOS 6 native | action | Sleipnizer | iOS 6 native |
off | off | tweak | on | on |
native | off (on : Relate to native) | |||
off | on | tweak (Portrait) | on | on |
tweak (Landscape) | off | off | ||
native (Landscape) | ||||
on | on | tweak | off | off |
native |
■Relate to native
Relate to nativeを有効にすると上記の表で1箇所だけ動作が変わります。また、iOS6からのiOS標準のフルスクリーン状態は/var/mobile/Library/Preferences/com.apple.mobilesafari.plistに保存され、Safariの起動時(Suspendから復帰ではない)にplist設定値から状態が復元されるのですが、この際にフルスクリーンがONで保存されていると起動時からフルスクリーンになります。Startup FullScreenが半分入る感じですね。
■Keep statusbar
諸々の整合性からiOS6+ですとKeep statusbarが有効なのはPortraitモードのみになりました。FullScreen for Safariは完全になくしてしまったみたいですが。
■iPad
iPadは標準が入ってこなかったようなので、これまで通りに使えるはずです。はず。
libinstabannerをリリースしました。iOS5から実装されたUIAlertViewによる通知にかわる方法として上部にバナーがでるおなじみのアレですが、tweakから任意に呼び出すには結構な手間がかかる(特にSpringBoardの外からは)のでライブラリを作りました。
使い方は1通りしかないので難しい事は何もなく、ヘッダーのUsageがもうほんとすべてです。bundleIdentifierの引数はnilチェックしてるのでそこは最低限なにか入れる必要があります。titleはnilにすると自動でDisplayNameが入ります。com.apple.Preferencesを指定して日本語なら「設定」てな感じです。
bundleIdentifierを自由に指定できるのでこんな感じにすると・・
[InstaBanner showBannerWithBundleIdentifier:@"eu.heinelt.ifile" title:nil message:@"libinstabanner test"];こうなります。タップするとそのアプリを起動できます。
iOS 6からUIActivityViewControllerを使用したメニュー導入されました。従来使われていたUIActionSheetより生成にパワーが必要でUIActionSheetよりも起動は遅いですが、表示できるメニュー数が多くて便利ですね。便利なんですが人によっては絶対に使わないようなメニューもあるかと思います。Weiboとか、メールとか、メッセージとか。そこでOS標準提供のActivityをオン・オフ設定できるCleanActivityを作りました。これで私のBylineは2段にまとまってスッキリ!
設定できるのは標準提供されている以下9種類のActivityです。
色々とオフにするとスッキリしたメニューにできます。
CleanActivityはgithubで公開しています。Licensed under the GPL v3です。アイコンのほうきがGPLだったので。CleanStatusのほうきと同じ画像だと思うのですがアレはちゃんとGPL守ってるのでしょうか。MacBook Air (Late 2010)からMacBook Pro 13" Retinaに移行した際のメモ。
ここ最近tsSpeed Aをオープンソース実装する事を目指してFakeClockUpをバージョンアップしてきてv0.7.1-1で達成できました。バイナリ・ソースコードともにgithubにあります。ライセンスは踏襲してApache License 2.0です。
スライダーの値はfloat型でしか得られないので、スライダーの値をListの値に完全に合わせてあげなければ設定が同期しているようにならないのですが、ここで他のSpecifierの値を設定するにはobjectを引数とするメソッドを使用するので、floatもしくはdoubleからオブジェクトへ変換する際にNSNumberを使って0.100000000の値を[NSNumber numberWithDouble:0.100000000];してみると実際の値は0.099999998753みたいな値になってしまい同期がとれませんでした。なので、最終的にはNSStringとして保存する形になりました。詳しくはソースで。
タイトル通り、Sleipnizerで使っているPull-To-Gestureの部分のコードをgithubで公開しました。特徴はSleipnizerで使えるように4方向に対応している事です。branchのsleipnizerがまさに使ってる状態です。
https://github.com/r-plus/AllAroundPullView使い方の詳細はgithubのREADMEを参照。
chpwnのPullToRefreshViewを元に以下な感じの代物です。
iOSのバージョンを判定するのには二通り程あって、UIDeviceから取得する方法
float iOSVersion = [[[UIDevice currentDevice] systemVersion] floatValue];と、kCFCoreFoundationVersionNumberを使うやり方があります。
kCFCoreFoundationVersionNumber >= 550.52 //550.52はiOS 4.2の値
ちなみにfloatValue使うと小数点2個は取れないので5.1.1は5.100000になります。kCFCoreFoundationVersionNumberも3項目のバージョンでの値に変更はないため、3項目までちゃんと取る場合はNSNumericSearchできちんと比較する必要があります。
で、tweakのバージョン判定では2項目までで十分な事が多いのでkCF~の方がオススメです。うっかりspringboardが対象のtweakのconstructorでUIDevice使うと危険なので。UIDeviceを使ってはいませんが、iOS5が出た当初に発現していた画面1/4問題は、例えばLastAppでは以下のバージョン判定の1行が原因で起こっていました。
isFirmware3x_ = (class_getInstanceMethod(objc_getClass("SBApplication"), @selector(pid)) != NULL);これを以下に書き換えることで対処したと思われます。
isFormware3x_ = (kCFCoreFoundationVersionNumber < 550.32) ? YES : NO; // 550.32はiOS 4.0の数字
新OSが出た際の確認方法は/System/Library/Frameworks/CoreFoundation.framework/Info.plistのCFBundleVersionから確認できます。iOS5.1.xは690.10ですね。
2.0からの番号はこのあたりを参考に。chpwn / IconSupport - Firmware.h
IMP old, new; old = class_getMethodImplementation([UIKeyboardLayoutStar class], @selector(shouldShowDictationKey)); new = class_getMethodImplementation([UIKeyboardLayoutStar class], @selector(new_shouldShowDictationKey)); IMP tmp; tmp = old; old = new; new = tmp;オリジナルのメソッドを使う気がなければ最後のところは
old = new;だけで事足りてしまう。 また、method_exchangeImplementationsなんて素敵な関数もあるのでこうも書ける。
Method old, new; old = class_getInstanceMethod([UIKeyboardLayoutStar class], @selector(shouldShowDictationKey)); new = class_getInstanceMethod([UIKeyboardLayoutStar class], @selector(new_shouldShowDictationKey)); method_exchangeImplementations(old, new);いずれにせよ、これらの処理を行えば以後OSやアプリケーションがshouldShowDIctationKeyメソッドを呼び出すと、実際に処理が走るコードは自らが書いたnew_shouldShowDictationKeyメソッドのもととなる。 ちなみにnew_shouldShowDictationKeyは追加しなければならないので、class_addMethod関数で追加できる。
static BOOL replaced_UIKeyboardLayoutStar_shouldShowDictationKey(UIKeyboardLayoutStar *self, SEL _cmd) { return NO; } class_addMethod([UIKeyboardLayoutStar class], @selector(new_shouldShowDictationKey), &replaced_UIKeyboardLayoutStar_shouldShowDictationKey, "c@:");メソッドの実装であるIMPを上書きするだけでも書き方は色々ある。
Method method = class_getMethodImplementation([UIKeyboardLayoutStar class], @selector(shouldShowDictationKey)); static BOOL replaced_UIKeyboardLayoutStar_shouldShowDictationKey(UIKeyboardLayoutStar *self, SEL _cmd) { return NO; } method_setImplementation(method, &replaced_UIKeyboardLayoutStar_shouldShowDictationKey);さて、これらの処理を適当な関数にまとめて、その関数を呼び出せば晴れてフックが完了するが、元々は存在しない関数だ。一体どうやって呼べばいいのか。
%hook UIKeyboardLayoutStar - (BOOL)shouldShowDictationKey { return NO; } %end
iOS5.1からSiriが日本語に対応した事で、日本語キーボードでも音声入力が使えるようになりましたが
あまりの邪魔っぷりにこのキーを無効にするtweakを作りました。Require: iOS 5.1+です。
日本語フリックキーボードの場合だけ無効にするバージョンと全てのキーボードで無効にするバージョンを作りました。
全てのキーボードで無効にするバージョンはBigBoss提出予定です。
https://github.com/r-plus/NoDictation/downloads
ちなみにSiriが要らないのならSiriをOFFにすれば純正でこのボタンは無効です。
iPadは設定から音声入力のON/OFFが純正で可能です。
先日UMAXの4GBx2メモリをSofmap-Onlineで買ったのですが、初期不良を掴んでしまった時のメモ。
とりあえずここから症状を報告しました。https://www.sofmap.com/inquiry_mail_ec/exec/
たしかこんな感じ。
Windows使用中に突然落ちてしまった為、Memtest86+を走らせるとErrorの数値が変化せず落ちるため初期不良と思われます。
この度、ご注文を頂いておりました上記商品でございますが、 ご連絡頂きました状況から、初期不良の可能性が考慮されます 為、弊社にて交換のお手続きをさせて頂きたく存じます。 なお、商品の交換方法につきましては、弊社から交換商品と 着払いの返送用伝票をお客様のご注文時の配送先ご住所へ お送り致します。 交換商品をお受け取り頂く際に、お届けにあがった佐川急便 の配送担当者へお手元の不具合のある商品を、梱包頂いた状態 で返送用伝票とともにお渡し頂く事により、商品の交換と させて頂きます。 また、商品交換の際には、不具合品とともに、下記一式を 梱包箱へお戻しくださいますようお願い致します。 ○御買上票/納品書(商品に同梱)のコピー (原本はお手元にお取り置き下さい。) もしくはお名前・ご注文番号、不具合の症状を記載したメモ書き ○マニュアル、メーカー保証書、付属品など購入時の 製品に同梱されていた物全て。 梱包頂く箱や緩衝材がお手元に無い場合は、交換品をお届け 致します梱包材をそのままご利用頂いても結構でございます。 上記方法による交換にご了承頂けます場合は、大変お手数を お掛け致しますが商品の交換につきまして、ご希望の配送時間を 下記にご記入頂き、本メールをご返信頂けますようお願い 申し上げます。 時間帯指定(【】内に○をお願い致します。) 【 】午前中 【 】12:00-14:00 【 】14:00-16:00 【 】16:00-18:00 【 】18:00-21:00 【 】指定無し
DocSetsがAppStoreに並びました。
買う前に試してみたかったので、コンパイルしてみましたメモ。
まずはcloneします。
Air:git_clone hyde$ git clone git://github.com/omz/DocSets-for-iOS.git Cloning into DocSets-for-iOS... remote: Counting objects: 358, done. remote: Compressing objects: 100% (206/206), done. remote: Total 358 (delta 158), reused 343 (delta 145) Receiving objects: 100% (358/358), 8.96 MiB | 107 KiB/s, done. Resolving deltas: 100% (158/158), done.で、そのままコンパイルしてみる。
@interface RootViewController : UITableViewController今度は通りました。{ DetailViewController *detailViewController; } @property (nonatomic, strong) DetailViewController *detailViewController; - (void)addDocSet:(id)sender; ←これ @end
先日の#pyfesでjsonファイルを操作したことないなー、と思ったのでこんなのを作ってました。
@search_accountの最新3ツイートを取得し、それぞれ5分以内のものか判定した上でsearch wordが含まれているかを判定します。
最後の部分でメール送信なり、自分にmentionなり、boxcarにプッシュなりを設定し、
数分間隔で定期実行させればキャンペーン開始通知として使えそうです。
ところでPythonの変数って推奨の銘々則ってあるんですかね?PEPとかに。
ObjCみたくキャメルケースで書いてしまってるけど。
Twitter上で早い者勝ちのキャンペーン等がされる事が最近多いため、定期的にそのTwitterアカウントのツイートを取得してキャンペーン関連のツイートが行われたら通知を受け取りたいと思います。
流石にこのためだけにPCを立ち上げっぱなしにするのも嫌なので、デプロイ先PaaSをどれにするか調べたメモ。
#!/usr/bin/env python import datetime print 'Content-type: text/html\n\n' print '<html><body>' nowtime = datetime.datetime.now() print 'Now time is %s' % nowtime print '</body></html>'などという軽量極まりないコードを1回実行させるとCPU時間が
普段左手持ちで左の親指で全て操作してるのですが、この持ち方だと画面右上がちょっと遠い。
そこそこの頻度で利用するDefineメニューのDoneボタンを押すのがそろそろ面倒になったので、
左右どちらかのスワイプで破棄できるようにDictGoogleに機能追加しました。
モーダルビューの破棄に限定したので、iPadではスワイプしても意味はないです。
が、このリストへのリンクが1つ2つならまだ平気ですが、10個とかになると億劫になってきて、detail PSListItemsController validValues 80 100 120 160 200 validTitles 80(default) 100 120 160 200(insensitive)
{ entry = { bundle = "SleipnizerSettings"; cell = PSLinkCell; detail = "RootPreferenceController"; icon = "SleipnizerforSafari.png"; isController = 1; label = "Sleipnizer for Safari"; }; }
BUNDLE_NAME = SleipnizerSettings SleipnizerSettings_FILES = Preference.m SleipnizerSettings_INSTALL_PATH = /Library/PreferenceBundles SleipnizerSettings_FRAMEWORKS = UIKit SleipnizerSettings_PRIVATE_FRAMEWORKS = Preferences include $(THEOS_MAKE_PATH)/bundle.mk internal-stage:: $(ECHO_NOTHING)mkdir -p $(THEOS_STAGING_DIR)/Library/PreferenceLoader/Preferences$(ECHO_END) $(ECHO_NOTHING)cp entry.plist $(THEOS_STAGING_DIR)/Library/PreferenceLoader/Preferences/SleipnizerforSafari.plist$(ECHO_END)
#import <Preferences/Preferences.h> __attribute__((visibility("hidden"))) @interface RootPreferenceController : PSListController @end @implementation RootPreferenceController - (id)specifiers { if(_specifiers == nil) { _specifiers = [[self loadSpecifiersFromPlistName:@"SleipnizerforSafari" target:self] retain]; } return _specifiers; } @end
detail PSListItemsController valuesDataSource valuesSource: titlesDataSource titlesSource:
- (NSArray *)valuesSource:(id)target { return [NSArray arrayWithObjects:@"80", @"100", @"120", @"160", @"200", nil]; } - (NSArray *)titlesSource:(id)target { return [NSArray arrayWithObjects:@"80(default)", @"100", @"120", @"160", @"200(insensitive)", nil]; }