2016年3月19日土曜日

入力れた文字をかな変換する(Swift)

テキストボックスに入力された文字をかな変換する機能を実装必要が出てきました。
内容としては、iOS 標準アプリの電話帳とかにある、姓名を漢字で入力したら、よみがなが自動的に入るあの機能です。

ものすごく単純に考えると、入力された値を保持して「かな」に変換してやれば良いかと思ったのですが、部分削除等の操作を考えると、頭が混んがらかってきたので、多分違う方法があるだろうと思って調べてみました。

すると、正にやりたかったことが実装されているページがありましたので参考にさせて頂きました。

[OSX][iOS]読み仮名を得る(Cocoa練習帳)
http://ameblo.jp/bitz/entry-11859904155.html

Objectiive-C で書かれたコードですが、Swift に置き換えても問題なく動作しました。
素晴らしい。

実装内容としては、入力された値をトークナイザーを使用して解析し、ローマー字に変換後、かな変換すると言った物です。
Swift 変換のコードを下に載せておきます。

func kanaHenkan(text: String) -> String {
    let inputText: NSString = text
    let outputText = NSMutableString()

    let range: CFRange = CFRangeMake(0, inputText.length)
    let locale: CFLocaleRef = CFLocaleCopyCurrent()
    let tokenizer: CFStringTokenizerRef
                   = CFStringTokenizerCreate(kCFAllocatorDefault,
                                        inputText as CFStringRef,
                                                           range,
                              kCFStringTokenizerUnitWordBoundary,
                                                           locale)

    var tokenType: CFStringTokenizerTokenType
                   = CFStringTokenizerGoToTokenAtIndex(tokenizer, 0)

    while (tokenType != .None) {
        let latin: CFTypeRef
                   = CFStringTokenizerCopyCurrentTokenAttribute(tokenizer,
                                                                kCFStringTokenizerAttributeLatinTranscription)
        let romanAlphabet: NSString = latin as! NSString
        let furigana = romanAlphabet.mutableCopy()
        CFStringTransform(furigana as! CFMutableString, nil, kCFStringTransformLatinHiragana, false)

        outputText.appendString(furigana as! String)

        tokenType = CFStringTokenizerAdvanceToNextToken(tokenizer)
    }

    return outputText as String
}

メソッド化して、与えた文字列をかな文字で取得するようにしています。
うまく置き換えができるか心配でしたがなんとかできてよかったです。

Written with StackEdit.

2016年2月14日日曜日

携帯キャリア変更によりGoogle の二段階認証ができなくなった話

先日、キャリアの2年縛りが終了するとのメールを受けて、嬉しげに iPhone 6s に変更しました(実際にはそれほどでもなかったけど)。

そこで、ケチってキャリアごとの MNP を行って金額を安くする方法を試みたのですが、それが仇となり今回のタイトルの様な自体が起こってしまったのです。

二段階認証の確認コードが数時間前に解約したキャリアメールに飛ぶ画面を見た時のやっちまった感は、なかなかのものでした。

実際は、この二段階認証は、キャリアメールだけではなく、バックアップコードを取得しておけば、それを使ってログインできる様になっているのですが、パット見ナンノコッチャな印象で放置していました。
問題が発生してから事の重要に気がつくという、よくあるパターンです。
なので、バックアップコードは入手するようにしましょう。

バックアップコードの内容としては、これを作成すると、パスフレーズが複数個入ったテキストファイルを入手することができるので、二段階認証の画面でキャリアメール以外の方法を選択すれば、このコードが使用できるといったものです。
まあ、このファイル自体もなくしてしまうと意味無いですけどね。しかし、作っておくに越したことありません。

さて、今回やらかしたのは、通常の Google アカウントと、Google Apps を使用して独自ドメインで使用していたサイト管理のアカウントです。

Google アカウントについては、検索すると割りとヒットしますので、そちらを参考に。。。

MNPしたらGoogle認証(ログイン)の2段階認証が出来なくて悶絶した。
http://d.hatena.ne.jp/gonsuke777/20150924/1443095404

Googleアカウントにログインできない問題を解決した方法
http://tarohibi.com/google-noenter

たぶん大体の人は復旧フォームを使用しての対応になるかと思いますが、
結構復旧には厳しい質問(アカウント使用開始日だとか、最終ログイン日だとか、良くメールを送るアカウントだとか…etc)が続くので覚悟が必要です。

たまたま、パスワード管理ソフトを使用していことも有って最終使用日がそこに書かれてあったと言うのと、twitter のアカウントと大体同じぐらいの時に開設したアカウントだった事を思い出し復旧ができました。
これでだめならどうしたら良いのか分かりません。

次に Google Apps の方ですが、こちらはどうにかして、Google 宛に二段階認証が行えない旨の内容をフォームで送ることから始まります。

Google Apps for Work
https://apps.google.com/intx/ja/

どこからフォームを送ったのかわからなくなったのですが、多分ログイン画面で、ログインできないを選択してフォームにたどり着いたと思います。

内容については詳細を記述する所があるので、包み隠さず内容を書いてください。
(自分の場合は若干焦っていたこともあり、最初の内容は若干内容が薄いと感じて再度内容を送りなおすという事をしてしまいました。
同じ内容で送ると質問番号がグチャグチャになるのでやめてくださいと、お叱りのメールをいただきました。。。)

送信完了画面には、48- 72 時間までに返答をしますという事を書いてあり、また真夜中(23時)に送信したので、明日もしくは明後日、ひょっとしたらスルーされるかもと思っていたのですが、ものの 1 時間後には連絡のメールが届きました。

そして、そこには管理者としての証明を行う確認方法が書かれてあり、証明が確率したら一定時間の解除コードを教えていただけるという内容で復旧が行えました。

サラッと書きましたが、サイトを作成した時から暫く放置していたので、証明作業に結構苦戦しました。しかし、担当の方の気遣いもあり不安なく作業することができました。

正直、Google と言う企業、冷血な企業と思っていましたが、先程も書いたとおり、フォームを送ると直ぐに回答が返ってきたり、夜中の対応、そして朝には電話での連絡も頂くなど、ものすごく手厚いサービス。
何より日本人のスタッフが担当してくれて、言語の不安も安心と、全くの不安はありませんでした。

すげぇや Google !!

と、久日に企業に対する感想を持ったのでした。

まあ、これで次やらかしても安心などとは思いませんが、質問することの憂鬱感は無いのは確かです。
もし、同じ状態になった方がおられた場合は、一旦 Google に問い合わせをかけて見るのが良いかもしれません。

最後にまとめてとして、携帯を変更する場合に気をつける点を書いて置きます。

  1. キャリアメールの二段階認証をしていないか(している場合は一時解除)
  2. バックアップコードは入手しているか
  3. その他の代替手段の設定はしているか(モバイルアプリやバックアップ用電話番号の指定もできる)

私のように馬鹿な事をしないように皆さん気をつけてくださいね。

Written with StackEdit.

プログラマ向けノートアプリ Quiver

Markdown 使っていますか。
さて、今回は Mac 専用のアプリとはなりますが、プログラマ専用のノートアプリがあることを教えてもらったので、記録がてら残しておきます。

名前は Quiver。
日本語で言うところの矢筒ですね。

Quiver
http://happenapps.com/#quiver

AppStore から購入でき、この記事を書いている時点では 1,200 円です。
今回トライアル版があるので試して見ました。

ちなみに、似たようなコンセプトに、和製の Boostnote があります。
こちらは今のところ Free で使用できます。

Boostnote
https://b00st.io/jp/

その他は、Github が提供している GitBox でしょうか。

GistBox
http://www.gistboxapp.com/

こっちは完全 Cloud でスニペットを格納するので、ちょっと違うかもしれません。

Quiver の特徴としては、Markdown が使える、コードシンタックスが使用できる、LaTex もサポート、エディタが良い?、ファイルリンク、全文検索、テーマのカスタマイズ、オートセーブ、JSON フォーマットでのエクスポート、Dropbox や、iCloud Drive、その他のクラウドサービスとの同期が行える、更にはチームでも使用できるなど、至れり尽くせりで。ナレッジを格納するには持って来いの内容のようです。

実際に使ってみると、素晴の一言。
ジャンル分けもでき、tag 付等もできる。
また、Inbox や Recents とかまであるので、なんとなく GTD ツールっぽくも使えるかも。

いい点としては、区間をセルで区切り、そのセル内にどの形式(Markdown/Text/Code…)で記述するかを指定することで、その形式に適した表示を行えるという点。この方式は実に良いと思います。
これまでの Markdown エディタは、一つのファイル内で一形式だったので、テキストの装飾が面倒だったり、コードはそれなりの指定で囲む必要があったりと、扱いが面倒だったのですが、この方式なら簡単操作で切り替えることができストレスなく作業できそうです。

二の足を踏む点としては、似たような内容を TrunkNotes というアプリでやっている点でしょうか。ただ、こちらはコードシンタックス等がなく(どうにかすればできるかもしれない)、また見せ方も Wiki なのでやや見づらい点があり悩んでいたところでした。
現状の不満点としては、iPhone 版のアプリが無いという点。
実際 iPhone で編集等はしないのですが、書いた内容を確認できるという安心感というか達成感というかが欲しいと言うのが自分には大事な部分となっています。

Trunk Notes
http://www.trunknotes.com/

とはいえ、クラウド連携があるので、組み合わせれば最高の環境が出来そうな気がしてきました。
もう暫くトライアル版で試してみてから購入を検討したいと思います。

追記:
クラウド連携の確認をしてみたところ、例えば Dropbox であれば、Mac にDropbox のアプリを入れて同期出来できる状態にしてそこに Quiver のファイルを置く内容みたいです(このアプリから Dropbox 連携をするわけではないみたい)。
あと、ファイルは専用ファイルになるので、Trunk Notes で作成した Markdown のファイルを読み込めるようではない(インポート機能)ようです。
折角の資産(といっていいかわからないが)が活かせないのは残念。

Written with StackEdit.

2015年12月29日火曜日

NavigationBar が View に重なる対応について

今更ながらのところでもあるけど、UINavigationController を使用している場合に、storyboard 上で、NavigationBar が View に重なる対応についてどうすれば良いかを考えて見ることにする。

この内容は iOS7 から View がフル画面表示に変わった時から発生した内容なので、なぜ今頃という面があるかもしれないが、今一歩良い対応方法が見つからないので、調べてみることにした。

ちなみに、今までは、先にビューのデザインをして、オブジェクトを配置後に、座標0, 0 の位置にずらす方法で対応していた。
よって、最終的にはナビゲーションバーの下にオブジェクトが配置される様になる。
この方法で、実行時には問題なく表示されるのだが、問題点はメンテナンスを行う際に、ナビゲーションバーの下のオブジェクトを見逃す場合があると言うこと。
(そんなバカなと思うかもしれないが、焦って対応をする場合などは案外見落としがちになる)
その他、あえてナビゲーションバー分下にビューをずらす方法も考えたが、Autolayout の制約が難しくなるので却下した。

この問題に対応すべく storyboard を使用した場合の良い方法を調べてみることにした。
調べてみると、みんなどうやってこの部分を対応しているかよく分からない。
この内容でよく引用されているのが以下の記事。
やはりお前らのiOS7対応は間違っている(解説編)
http://qiita.com/yimajo/items/254c7cebab7864678246
上記や、その他のサイトを見る限り以下の方法がある。
  1. ViewController の Extend Edges の Under Top Bars と、Under Bottom Bars のチェックを外す
  2. 上としっしょだが、コードで指定する
    self.edgesForExtendedLayout = UIRectEdgeNone;
  3. NavigationController の Navigation Bar の Translucent のチェックを外す
いずれも、ビュー開始位置がナビゲーションバーの下からになる。
(すりガラス的な効果が消えたふうに見える)
その他、各 ViewController の Extend Edges の Under Top Bars のチェック、
同じく、ViewController の Adjust Scroll View Insets のチェックを外すなどもある。

うーん。
調べてみた結果自分の困っている内容(Xcode での視界性の悪さ)とは別の内容(アプリの仕様というか不具合対応)での回答が多いようだ。

ここいら辺を踏まえて、自分の問題に対するベターと思われる方法を考えてみた。
方法は、上記のいずれのチェックも外さずに、NavigationController の Attributes にある Shows Navigation Bar のチェックを外し、コード上でこの属性を有効にする方法。
これであれば、Storyboard からは、ナビゲーションバーの表示が消えて、作業・確認しやすくなる。
制約等も直感的に付けることが出来る。
この場合は、ナビゲーションバー先頭の ViewController の viewDidLoad で
[[self navigationController] setNavigationBarHidden:NO animated:YES];
// Swift
self.navigationController?.setNavigationBarHidden(false, animated: true)
とするか、サブクラスを作成して、上記のコードで指定するなどが必要。
難点は、画面上からナビゲーションバーが消えてしまうので、ナビゲーションバーが存在しないかと思ってしまう点か。
(storyborad に UINavigationController が出ているから大丈夫とは思うが)
あくまで、ベターなのでベストがわからない。。。

しかし、なぜこんなに苦労が必要なのだろうか?
storyboard で見えたとおりに表示されないという Xcode 側に問題がある気がするのだが(ナビゲーションバーとフル画面を表示したいなら storyboard でナビゲーションバー部分を別表現すればいいのに)、Xcode 作っている開発者は違和感覚えないのだろうか?
Written with StackEdit.

2015年12月28日月曜日

デジタルノート環境について

文具ネタ

年も押し迫ったということで、資料というかメモ紙の整理をしていた。
普段は、A4 のコピー用紙をメモ紙にしているが、物凄く大量に紙を消費してしまう。

これはアカン(経済的にも、環境的にも、情報整理的にも)と思って、iPad で使用できるデジタルペンとアプリに移行しようと目論んでいた。
その時に買った内容とその時のレビューが以下の内容

BAMBOO STYLUS fineline を買ってみた
http://tizio1976.blogspot.jp/2015/09/bamboo-stylus-fineline.html

結果をいうと、実務ではかなり厳しかった。
厳しかった内容は以下のとおり
  • 拡大領域で書くので感覚が慣れない(紙とペンは1対1)
  • 考え事や、タイピングをしているとその間にペアリングが切れてしまう
  • パームリジェクションが今ひとつ
慣れの部分もあるかもしれないが、慣れる前にストレスがたまりまくり効率が悪くなった。
結局、紙とペンのに戻ってしまった。

あれから、iPad Pro + ペンシルが良いとのレビューを見たが、割りかし高価なため、用途を考えるとちょっと手が出せない。

そんな中、アナログとデジタルのハイブリッド?というのか、コクヨの CamiApp S を記事を発見した。

CamiApp S(コクヨ)
http://www.kokuyo-st.co.jp/stationery/camiapp-s/index.html

どうやら手書きで入力したものがスマートフォンへ保存といった代物のようだ。
この手の物は、以前から発売されているが、今回はコクヨからといった感じか。

ということで、他のメーカーの同コンセプトの製品を調べてみた。

livescribe
http://www.livescribe.com/ja/

Boogie Board SYNC9.7(KING JIM)
http://www.kingjim.co.jp/sp/boogieboard/bb6.html

airpen pocket++
http://www.airpen.jp/
phree(KICK STARTER より)
http://otmtech.com/

結構ある。
いずれも、専用器具を用いて Bluetooth 等で通信する仕組み。

いずれの製品もレビューを見ると、専用ペンというのがネックのようだ。
どうやらこの分野はまだまだ発展中の様でもう暫くしないと普及しないかもしれない。

購入して開発費に貢献したいところだが、なかなか現実のお財布状況が厳しいため今一歩が踏み出せないのであった。。。

結論としては、今のところは、手書きで必要な情報を清書+スキャナが良いのかもしれない。

2015年12月5日土曜日

Xcode 7.1.1 で iOS7 のシミュレータを動かす方法

覚書として Xcode7 から、シミュレータの対応する iOS のバージョンが 8.4 以降になったようだ。
実際、iPhone4s iOS7 の組み合わせでシミュレータを実行しようとすると、
The iOS 7.1 simulator runtime is not available. Unable to open liblaunch_sim.dylib. Try reinstalling Xcode or the simulator runtime.
のエラーがでて実行できない。
Apple 自体が古い OS のサポートは切っているので、古い OS に対応したアプリなんか作るなと言うことだろうか。
確かに、古い端末をずっと使われたら商売上がったりだもんね。

とはいえ、世の中そう甘くない。
慣れ親しんだ端末をアップデートせずに使う人もいるわけで、最近では買い替え後の端末を有効利用してやろうと考える人もいる。
だから Apple よもう少し寛容になってくれ。。。
(MS なんて VB6 のサポートまだやってるんだぞ)

さて、本題だが、この状態が発生したが、自分では実機を持っているので最悪シミュレータを使用しなくても良い環境にある。
なので、調査はしたけど試してないので、どうしても必要になったら実行に移そうと思う。
参考にしたのは以下のサイト

Xcode 7 付属のシミュレータに iOS 7.1 シミュレータを登録する
http://qiita.com/msa_uccky/items/f6ed080e5d723d4c0793

How can I run the iOS 7.1 Simulator in Xcode 7.0 beta 2?
http://stackoverflow.com/questions/31056634/how-can-i-run-the-ios-7-1-simulator-in-xcode-7-0-beta-

安定の Qiita と Stackoverflow 凄いサイトだ。
この記事を読むと、エラー文にも有った liblaunch_sim.dylib が古い OS に対応していないので、Xcode7 アプリ内にある iOS7 のファイルを使用するように変更する手順が書かれている。

というかみんなどうやってこういう情報を得るのだろうか。探究心が足らないのだろうか?

最終的には以下の様にすれば良いらしい

1. 現在 /Library/Developer... にある liblaunch_sim.dylib をバックアップ
$ sudo mv "/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS 7.1.simruntime/Contents/Resources/RuntimeRoot/usr/lib/system/host/liblaunch_sim.dylib"{,.bak}

2. Xcode アプリ内にある liblaunch_sim.dylib を上記の /Library/Developer... にシンボリックリンクを張る

$ sudo ln -sf "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/usr/lib/system/host/liblaunch_sim.dylib" "/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS 7.1.simruntime/Contents/Resources/RuntimeRoot/usr/lib/system/host/liblaunch_sim.dylib"
これで、iOS7 のシミュレータが動くはず。

2015年11月30日月曜日

(Mac)Nokogiri のインストールでエラーが出る

Rails のインストールをしようとした所、エラーが発生してインストールできない状態になった。
よくよくログを見てみると nokogiri のインストールで失敗しているようだ。

$ gem install nokogiri
Building native extensions.  This could take a while...
ERROR:  Error installing nokogiri:
    ERROR: Failed to build gem native extension.
    /Users/zeonic/.rbenv/versions/2.2.3/bin/ruby -r ./siteconf20151129-59395-c8vrlu.rb extconf.rb
checking if the C compiler accepts ... yes
checking if the C compiler accepts -Wno-error=unused-command-line-argument-hard-error-in-future... no
Building nokogiri using packaged libraries.
checking for gzdopen() in -lz... yes
checking for iconv... no
-----
libiconv is missing.  Please locate mkmf.log to investigate how it is failing.
-----
*** extconf.rb failed ***
...

この場合は、nokogiri を個別にインストールしてから、rails のインストールを行えば良いとの記事を各所で見かけたが、nokogiri の単体インストールがうまくいかない。
ところで、nokogiri とは?
Ruby のスクレイピング(HTMLやXMLの構造を解析して、特定の要素を指定しやすい形に加工する)ライブラリのことらしい。
よく書かれている内容にそって、実行してみたんだけどなぁ。。。と思ったのがエラーは変わらないので、内容を再度咀嚼しながら確認。
結果的に必要なライブラリパスを直接指定する方法でうまく行ったので経過を載せておきます。
  1. Homebrew のアップデート

    $ brew update
    $ brew upgrade

  2. 必要ライブラリ用のリポジトリを取得

    $ brew tap homebrew/dupes

  3. ライブラリのインストール

    $ brew install libxml2 libxslt libiconv

  4. ライブラリをリンク

    $ brew link --force libxml2 libxslt libiconv

  5. nokogiri のインストール

    $ NOKOGIRI_USE_SYSTEM_LIBRARIES=1 gem install nokogiri --
    --use-system-libraries
    --with-iconv-dir="$(brew --prefix libiconv)"
    --with-xml2-config="$(brew --prefix libxml2)/bin/xml2-config"
    --with-xslt-config="$(brew --prefix libxslt)/bin/xslt-config"

  6. rails のインストール

    $ gem install rails

ひとまず上手く行ったけど、一発目の環境設定でつまずくと、やる気なくすなぁ。
Written with StackEdit.