文字っぽいの。

文字を書いています。写真も混ざります。

SwiftでURLのQueryをDictionaryにパースする

前提

  • swift2.1

functionを定義する方法

func generateDictionalyFromUrlComponents(components: NSURLComponents) -> [String : String] {
    var fragments: [String : String] = [:]
    guard let items = components.queryItems else {
        return fragments
    }
    
    for item in items {
        fragments[item.name] = item.value
    }
    
    return fragments
}

let comp: NSURLComponents? = NSURLComponents(string: "http://example.com/?id=12345&username=tarou")
let fragments = generateDictionalyFromUrlComponents(comp!)
print(fragments["id"]) // => Optional("12345")

NSURLをextensionする方法

extension NSURL {
    var fragments: [String : String] {
        var results: [String : String] = [:]
        guard let urlComponents = NSURLComponents(string: self.absoluteString), let items = urlComponents.queryItems else {
            return results
        }
        
        for item in items {
            results[item.name] = item.value
        }
    
        return results
    }
}

let url = NSURL(string: "http://example.com/?id=12345&username=tarou")
print(url!.fragments["id"]) // => Optional("12345")

雑感

  • NSURLComponentsとNSURLQueryItemは便利
  • 雑にググったら正規表現祭りで地獄かと思った

『日本Web技術界隈著名人の残念さ具合』について僕が知っていること

thinkchang.hatenablog.com


こちらのエントリーが流行っております。この記事を素早く見つけてブックマークした人達を見てみましょう。

日本Web技術界隈著名人の残念さ具合 - thinkchangの日々日誌

そのとーり

2015/08/22 17:19
b.hatena.ne.jp

日本Web技術界隈著名人の残念さ具合 - thinkchangの日々日誌

書いた

2015/08/22 17:19
b.hatena.ne.jp

日本Web技術界隈著名人の残念さ具合 - thinkchangの日々日誌

はげどう

2015/08/22 17:34
b.hatena.ne.jp


なるほど。では、このエントリーの次に投稿されたエントリーのブクマを見てみましょう。

b.hatena.ne.jp

f:id:FromAtom:20150825145904p:plain


なにかに気がついたようです。

b.hatena.ne.jp


やっぱり気がついて無かったようです。

b.hatena.ne.jp

f:id:FromAtom:20150825150206p:plain


そういえば、このブログで一番最初に投稿されたエントリーはどんな感じでしょう。

b.hatena.ne.jp

f:id:FromAtom:20150825150515p:plain

現場からは以上です。

SwiftでUIActivityController(シェアシート)に独自のUIActivityを実装する。

シェアシート内のこれら。

f:id:FromAtom:20150817204110p:plain

こっちの灰色な方を独自実装する方法。Tumblrだと不適切としてフラグを付けるが、ここに独自で作られて入ってる。そんなUIActivityをSwiftで実装する方法。

まず、UIActivityを継承したクラスを作って、いくつかのメソッドをオーバライドする。

class CustomAlertsActivity: UIActivity {
    override func activityTitle() -> String? {
        return "アクティビティの名前"
    }
    
    override func activityImage() -> UIImage? {
        return UIImage(named: "ImageName")
    }
    
    override func activityType() -> String? {
        return "com.example.myapp"
    }
    
    override func canPerformWithActivityItems(activityItems: [AnyObject]) -> Bool {
        // trueを返すと表示される
        // activityItemsの中身をみて、表示するかどうか判断する
        return true
    }
    
    override func prepareWithActivityItems(activityItems: [AnyObject]) {
        // 選択された時の処理を書く
    }
}

使う時はこうやって書く。

let string: String = "なんらかのテキスト"
let url: NSURL = NSURL(string: "http://www.example.com/")!
let activityItems: [AnyObject] = [
    string,
    url
]

let applicationActivities = [
    CustomActivity() // <- 上で作ったやつ
]

let activityViewController = UIActivityViewController(activityItems: activityItems, applicationActivities: applicationActivities)

// 不要なデフォルトアクティビティはここに登録して消す
let excludedActivityTypes = [
    UIActivityTypePrint,
    UIActivityTypeAssignToContact
]

activityViewController.excludedActivityTypes = excludedActivityTypes
presentViewController(activityViewController, animated: true, completion: nil)

簡単。

スプラトゥーン公式TwitterのつぶやきをSlackに投げるIFTTTレシピ作った。

つくった。

IFTTT Recipe: SplatoonJP2Slack connects twitter to slackifttt.com

こんな感じでSlackに飛んでくる

f:id:FromAtom:20150817200200p:plain

IFTTTの仕様で最大で15分位遅延するけど、毎回手作業でURLコピーして「こんなんでたよ」とするより楽で良い。ぜひご利用下さい。

Slackのカスタム絵文字に『イカモドキ』を使うとイカした感じになる

フリーフォント「イカモドキ」 | あらむぎ というフリーフォントがあります。これを使って、絵文字を作るとこんな感じになります。

f:id:FromAtom:20150813201615p:plain

Slackの絵文字に文字を入れるとだいたい見難くなるんですが、イカモドキを使うとめちゃくちゃ視認性が良くて、大変イカしています。

XcodeでTabキーを叩いた時の挙動をEmacsと同じにする

 Emacsでは行のどこでTabキーを叩いても、インデント調整が行われます。 Xcode、というかEmacs以外のエディタを使っていて一番つらいのは、 Tabキーを叩いた時に\t(もしくはスペースn個)が入力されることです。

 「行の真ん中でタブとか入力せんやろ!?」と思いながらうっかり叩いて入力された空白を丁寧に削除し、 C-iを叩き直す日々が続いていましたが、設定見てみたら普通にEmacs風にできました。

f:id:FromAtom:20150811104656p:plain

コレ、の部分をIndents alwaysにすれば良いです。やったー!

Incompatible library version: Foo requires version 2.0.0 or later, but HOGEHOGE provides version 1.0.0 というエラー解決した。

前提

エラー

 シミュレータでは動くのに、実機に転送して起動するとこういうエラーが出て落ちる。そして、SwiftyJSONのバージョンは1.0.0じゃない。

dyld: Library not loaded: @rpath/SwiftyJSON.framework/SwiftyJSON
  Referenced from: /private/var/mobile/Containers/Bundle/Application/CC8759F5-A501-400C-93A8-DCEE3BFE4770/XXX.app/XXX

Reason: Incompatible library version: Foo requires version 2.0.0 or later, but SwiftyJSON provides version 1.0.0

対策

 Clean Build Folderをしたら直った。KeyBindではCommand-Option-Shift-Kに割り当てられていて、GUIで操作する場合は、Productメニューの中でOptionキーを押すと表示がこう変わるので、選べば良い。

小言

 CocoaPodsを0.38系にバージョンアップしたら出てきたので、CocoaPodsが悪いのかと思ってバージョン変えまくって疲れた。Podfileの中からエラーを吐くライブラリをどんどん消していったら、昔入れたけどもう消したライブラリが無いって怒られてたので、「なんかキャッシュ残ってそう」と思って調べたら見つかった。完全にCocoaPod周りを疑って、バージョンチェックがおかしいのかな?とRubyのコード読んで1日消費したので、とにかく辛かった。