読者です 読者をやめる 読者になる 読者になる

しるてく

技術的な話をします

crontabでdateを扱うときとかに注意すること

crontab
45  9 * * 3 hoge.pl `date -v+2d +"%Y%m%d"`

こんな感じのことやろうとしたら

/bin/sh: -c: line 0: unexpected EOF while looking for matching ``'
/bin/sh: -c: line 1: syntax error: unexpected end of file

こけてなんだろなーと思ったらcrontabでは % 以降を標準入力として扱うらしくエスケープが必要らしい。

みんながハマった道だと思いつつメモ残しておく。

Androidのパッケージ名に使える文字

android

AppStoreとあわせようとしてハマったのでメモ。

基本は英字。 先頭でなければ 数字と_が使える。

https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/content/pm/PackageParser.java#1201

    private static String validateName(String name, boolean requireSeparator,
            boolean requireFilename) {
        final int N = name.length();
        boolean hasSep = false;
        boolean front = true;
        for (int i=0; i<N; i++) {
            final char c = name.charAt(i);
            if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) {
                front = false;
                continue;
            }
            if (!front) {
                if ((c >= '0' && c <= '9') || c == '_') {
                    continue;
                }
            }
            if (c == '.') {
                hasSep = true;
                front = true;
                continue;
            }
            return "bad character '" + c + "'";
        }
        if (requireFilename && !FileUtils.isValidExtFilename(name)) {
            return "Invalid filename";
        }
        return hasSep || !requireSeparator
                ? null : "must have at least one '.' separator";
    }

macで半角ダッシュ(--)が全角ダッシュ(―)に変換されてしまう呪いを解く

mac

carton install --deployment 打ってくださいみたいな発言で、半角ダッシュが全角になってて、「なんかおかしいんですけど…」みたいになることが社内で頻発してて、なぜかslackのせいにされてるけど、それmacの設定だよ!!

システム環境設定 > キーボード > ユーザ辞書 から、「スマート引用符とスマートダッシュを使用」をOFFにしましょう!

f:id:ofsilvers:20151130105852p:plain

UIWebView の謎のボーダーと白い背景

xcode storyboard

UIWebView配置したら、バウンスしたときの背景が白かったり、WevViewの下に黒い下線が表示されたりしてなんだろって思ったら、WebView の  opaquefalse にして、Background を ClearColor にすれば良いだけだった。

ちなみにバウンスもさせたくないよって場合は webView.scrollView.bounces = false してあげればよい。

android で INSTALL_FAILED_UID_CHANGED が出たら

android

諦めて出荷時に戻しましょう!

UICollectionViewでSDWebImage使うと同じ画像が表示されてしまうことがある

swift xcode

CollectionViewで図鑑(所持していると画像が見えて、所持していないと?画像が表示される)みたいなのを作るとして、

class HogeCollectionViewCell: UICollectionViewCell {
    @IBOutlet weak var hogeImageView: UIImageView!

    func setImage(url: String?) {
        if url != nil {
            self.hogeImageView.sd_setImageWithURL(NSURL(string: url))
        } else {
            self.hogeImageView.image = UIImage(named: "empty_hoge")
        }
    }
}

こんな感じのカスタムセルを作って、 cell.setImage(url) みたいな感じで画像をセットすると、未所持セルで何故か他の所持セルと同じ画像が表示されてしまう。

どうやら動きをみると、画面外にスクロールすると、どんどん未所持セルが所持セルに置き換わっているようなので、cellのreuseでsdWebImageが悪さしているらしいことが分かる。

なので、以下のように、 prepareForReusesd_cancelCurrentImageLoad を呼んであげればよさそうだ。

class HogeCollectionViewCell: UICollectionViewCell {
    @IBOutlet weak var hogeImageView: UIImageView!

    override func prepareForReuse() {
        super.prepareForReuse()
        self.hogeImageView.sd_cancelCurrentImageLoad()
    }

    func setImage(url: String?) {
        if url != nil {
            self.hogeImageView.sd_setImageWithURL(NSURL(string: url))
        } else {
            self.hogeImageView.image = UIImage(named: "empty_hoge")
        }
    }
}

なおった。

MapBox iOS SDK 2.0.0 試した

swift mapbox

MapBoxっていうOpenStreetMapのデザインをカスタムできるみたいなサービスがあるのでiOS SDKを触ってみた。 触ってて、なんか転がっている情報となんか違うなと思っていたら、ちょうど6日程前に2.0.0がリリースされたっぽい。

www.mapbox.com

使い方

  1. MapBoxに登録する
  2. なんかデザインいじいじする
  3. pod 'Mapbox-iOS-SDK' して importしてあげてあとはよしなに

ドキュメントそこそこまとまっているのでちゃんと読めば、サンプル作る程度なら迷わなそう。

感想

  • Web上でデザインの設定ができるんだけどすごい簡単だし、いろいろな表示が出来て良い
    • ただ、アプリ側でどうやって表示するのかようわからんかった
    • JSON書いてね!みたいな記述もあれば(しかも書き方/何を変更すればいいのか分からん)
    • styleURLにMap ID(mapbox://<user.style>)指定してねみたいな記述もある

こういう感じ

        mapView.styleURL         = NSURL(string: "asset://styles/light-v7.json") // これはOK
        mapView.styleURL         = NSURL(string: "mapbox://silvers.xxxxxx") // 真っ黒の地図になった
  • 地図の移動を検知するほうほうがなさそう?

google mapでいうところのこれ

    func mapView(mapView: GMSMapView, didChangeCameraPosition position:GMSCameraPosition) {
        println("didChangeCameraPosition(): latitude:\(position.target.latitude), longitude:\(position.target.longitude)")
    }

    func mapView(mapView: GMSMapView, idleAtCameraPosition position:GMSCameraPosition) {
        println("idleAtCameraPosition(): latitude:\(position.target.latitude), longitude:\(position.target.longitude)")
    }

まとめ

簡単にカスタマイズされたデザインの地図表示するなら楽そうだなって感じだった。

一方で、地図上で複雑な処理させるならGoogleMapのほうがやりやすい。

Mapbox.js使えばWebでも使えるのでこっちは今すぐ使っても良いなあ!と思った(イベント会場の位置とか、お店の位置とかそういうの示すのに)。