Crashlytics Invocation Error

チームメンバーがCrashlyticsをインストールしてくれたのだが、ビルドに失敗したので、どうすればいいのか調べた。

エラーメッセージはこちら

Shell Script Invocation Error
Command /bin/sh failed with exit code 1
Crashlytics: You must install Crashlytics to continue. https://api.crashlytics.com/api/v1/******************/confirm/jp.app.appName

If this machine is a build server please remove Crashlytics.app if present and use xcodebuild so that ukissAlarm.app.dSYM is uploaded.

解決方法は単純で、Crashlyticsのビルドツールをインストールしていなかったことが原因であった。

https://crashlytics.com/downloads

Crashlyticsはなかなか良いツールだけれど、導入方法の説明ページを見つけづらくて参った。Qiita等を見てやっと解決に辿り着いた。


Crash Report解析サービスのCrashlyticsを試してみた

今回の不正解ルート
パーミッションの変更:iOS xcode 5 crashlytics error - Shell Script Invocation Error - ./Crashlytics.framework/run: Permission denied

試していないもの
Crashlytics.appを一旦削除:Crashlytics build script fails on Xcode Server CI

Scala: ファイルの内容を一行ずつ処理したい

java.nio.file.Filesで一行ごとに処理(ただしScala)

Java SE 7のjava.nio.file.Filesがとても便利な件

ファイルの内容を一行ずつ読み込んで処理したい場合に、今まではこちらのページ:(Fileの読み込み - Scala覚書)を参考に実装していましたが、nioを使えば簡単だったので、メモしておきます。

val file = Paths.get(path)
Files.readAllLines(file, Charset.defaultCharset())
     .foreach(println)

Charset.defaultCharset()が鬱陶しいですがそれに目を瞑ればシンプルです。 scala.io.Sourcejava.io.BufferedReadercommons.io.FileUtils だといずれもバッファをクローズする必要があるので、それに比べればだいぶ良いのではないでしょうか。

巨大なファイルのとき

これは、scala.io.Sourceを利用するのがよさそう。構造的部分型を利用したローンパターンを使わなければならないので、そのぶんコードが膨らみますが、そのぶん使用箇所はシンプルにまとまります。

using(Source.fromFile("file.txt")) {
     _.getLines().foreach(println)
}

def using[A <% { def close():Unit }](s: A)(f: A=>Any) {
     try f(s) finally s.close()
}

また、using内でSourceのもつメソッドを十分に活用したい場合は、構造的部分型での一般化を諦める必要があります。
参考:Scala using(ローンパターン)-Hishidama's Scala Memo-

Logbackで設定ファイルを読み込む

Logbackで設定ファイルが意図したとおりに読み込まれないという現象に遭遇したので、改めてまとめる。

読み込み順序

優先順位の高いものから順に読み込まれる。上位の条件にヒットした場合は、次の条件へは進まない。

  1. クラスパスから logback.groovy を検索する。
  2. クラスパスから logback-test.xml を検索する。
  3. クラスパスから logback.xml を検索する。
  4. JVMが ServiceLoader (JDK 6 and above) を実行している場合、ServiceLoaderは、インターフェース com.qos.logback.classic.spi.Configurator の実装のうち、最初に発見されたものを使用する。
  5. 以上がいずれも存在しなかった場合、 BasicConfigurator を使用する。

クラスパスは、起動オプション -classpath (推奨)または環境変数 ${CLASSPATH} で指定する。クラスパスで指定したディレクトリ直下のみを読み込む。

BasicConfigrator を使用する場合、ログの出力先は標準出力に向けられる。

参考: 公式

xmlファイルをjarに含めない場合

設定が変わるたびに毎度ビルドするのは面倒なので、起動オプションで指定する方法。
あらかじめjarファイルの生成時にlogback.xmlを除外したうえで、以下のオプションを指定しつつ起動すればよい。

-Dlogback.configurationFile=./logback.xml

controlling logback configuration in standalone app
Exclude logback.xml in Jar file

Scala.jsでNode.jsのモジュールを呼び出したい

Scala.jsでNode.jsのモジュールを呼び出したい

import scala.scalajs.js
import js.Dynamic.{global => g}
import js.DynamicImplicits._

val app = js.Dynamic.global.require("app")

参考1にあるように require("app") だけを指定しても、Predefのrequireしか見つからずコンパイルエラーとなったので、参考2のように明示的に指定しています。

参考1:How to invoke nodejs modules from scala.js? -stackoverflow-
参考2:scala-js/scala-js - Gitter - 2015/03/02

Electronまとめ

公式 / @electronjs / ドキュメント

Electronとは

JS, HTML, CSSだけでクロスプラットフォームアプリケーションを作るためのフレームワークである。

技術的にはio.js、Chromium、Atom Editorに依拠している。

まずはこれ:「Electron基礎+入門」by @mainyaa

主な特徴(Electron勉強会イベントページより引用)

  • Mac/WindowsネイティブアプリをJavaScriptで作れるよ
  • rendererはnodeで動くよ!その下のwindow以下のブラウザはchromiumで動くよ
  • rendererはwin/macの機能を使えるよ。CocoaAPIも使えるよ
  • ブラウザでnodeのmoduleが使えるよ
  • ブラウザとrendererが通信できるよ
  • ランタイムであるchromium内蔵だからchromeなしで動くよ
  • ブラウザはchromiumオンリーだから楽だよ。devtools使えるよ。エッジな機能使いたい放題だよ

海外コミュニティ

国内コミュニティ

アクティブな人

導入事例

参考ページ

始める

ダウンロード

  • ビルド済みのバイナリ、デバッグシンボル(Linux, Windows, Mac用)

  • npmを用いてインストールすることもできる。

# Install the `electron` command globally in your $PATH
npm install electron-prebuilt -g

# Install as a development dependency
npm install electron-prebuilt --save-dev

Xcodeのツールバーのキーボードショートカットを視覚化する

よく忘れるのでスクリーンショット撮ってメモ。

エディタは「スタンダードエディタ」と「アシスタントエディタ」。
左側のバーは「ナビゲータ」。
右側のバーは「ユーティリティ」。「インスペクタ」と「ライブラリ」が含まれます。
下側のバーは「デバッグエリア」。

バーの名前も覚えて忘れないようにします。

シェルがたくさんありすぎていまいち掴めなかったので関係性を整理してみた

シェルといえばbashですよね。笑

shebangはしっかり指定しましょうとか各所で言わていますが、今まではサボって適当に !/bin/sh とか指定していました。
きょうは時間ができたので、有名ドコロのシェルが何からどう派生してきたのか一念発起して調べてみました。

参考文献はWikipediaです(キリッ

僕と同じく sh を適当に設定している人は多いと思いますが、たんなる sh は今では他のシェルへのエイリアスなので、その先が何なのかを確認しなければなりません。bashは sh をさらに高機能にしたもので、もっとも普及しています。大抵のLinuxディストリビューションや、Mac OSのターミナルで標準に指定されているシェルです。

dashは、ubuntuを含むdebian系Linuxディストリビューションで標準に指定されているシェルです。親のashは、多くのBSD系で標準のシェルです。また、kshを親に持つzshもあります。kshやzshはそれほど標準のシェルに採用されているわけではありませんが、zshはbashのように振る舞う互換モードを備えていて、その便利さからファンも多いです。

bashとdashとzshはそれぞれ祖先に sh をもっており、 sh の機能については互換性があります。これに対して、祖先が sh でないものもあり、その一つがcshです。cshはC言語風に書けるシェルで、いまではcshから派生したtcshが多く利用されます。cshはshと同じthompson shellを親に持っており、そのためcshとshとは互換性がありません。

そんなややこしい関係性があるシェルの世界ですが、この図さえあればもうshebangに困りませんね。ご査収ください。

参考:Wikipedia シェル, Bourne Shell, bash など

Xcodeのプロジェクトナビゲータで、ファイル名の右側に表示されるMはどういう意味?

Xcodeの左ペイン、プロジェクトナビゲータ(⌘1)で、ファイル名の右側に表示されるMやAはどういう意味かわからなかったので調べました。

これは、Gitリポジトリ上でのソースコードの状態を表すアイコンです。実はXcodeではgitが使えます。考えてみればモダンなIDEですのでまぁ当たり前なのですが、言われるまでわかりませんよね。

意味は以下のとおりです。

  • M
    • 変更された
  • A
    • 追加された
  • ?
    • 追跡されていない

参考: Xcodeで使われている文字アイコンの意味まとめ

XcodeでコメントにTODOとかFIXMEを使うには

あとで取り組むときに付けたいコメント内タグですが、Xcodeではタグだけ抽出して一覧表示することができないみたいでガッカリ…

追記: プラグインがあるらしい
Xcodeプラグイン XToDo TODOなど特殊タグの一覧管理用Xcodeプラグイン

ジャンプバー(上部のパンくずリスト)に表示したり、コンパイラに警告させることはできるみたいので、一応紹介しておきます。

デフォルトでは以下の5種類があります。適宜使い分けてください。

// MARK:

// TODO:
// FIXME:
// !!!:
// ???:

一覧させたければcmd+shift+Fのプロジェクト内検索で。


Xcode4のTODOタグを警告に出力する

Swift’s Answer to #pragma mark, FIXME and TODO

Xcode TODO FIXME の使い方