Akata Works

東京エンジニア。主にRuby,Go,たまにAWSとiOS。ゲーム音楽が好きです。連絡はTwitterかakata.onen@gmail.comまで

Xcodeのキャッシュのせいでエラーが出ていた

Tipsレベルですが・・

Xcodeでとあるフレームワークを入れたり消したり、バージョンを上げたり下げたりしていたら、 バージョンAを参照してるつもりが、バージョンBが参照されていました。

ちゃんとFramework Search Pathもフレームワークのパスも確認したが、 やっぱりバージョンAのものになっていました。

どうしようもなくなってしまったので先輩社員に泣きついたところ、 Xcodeが生成するキャッシュにバージョンBのものが残っており、それが利用されていることが原因かもしれないとのこと。

試しに"/Users/${user_name}/Library/Developer/Xcode/DerivedData/"ディレクトリにあるプロジェクトごとのキャッシュから、 該当するプロジェクトのディレクトリをまるごと削除したところ無事にエラーを解消することができました。

いやー先輩マジ偉大っす

みなさんもよく分からないエラーが出たらとりあえずキャッシュを消してみるといいかもしれません。


追記

どうもXcode上からでも削除することができるようです。先人の皆様ありがとうございますm( )m

Homebrewで"configure: error: cannot run C compiled programs"が出た

最近、iOS 9の開発のためにMac OSXをEl Capitan 10.11 Betaに、
XcodeXcode 7 Beta変えたところ、
しばらく使っていたら、急にtigが使えなくなりました・・

なんか依存ライブラリのReadlineが死んでいたっぽいので、
再インストールしてみました。

$ brew install readline

すると下のエラーが出ました。

==> ./configure --prefix=/usr/local/Cellar/readline/6.3.8 --enable-multibyte
checking for suffix of executables...
checking whether we are cross compiling... configure: error: in `/private/tmp/readline20150915-84835-wmsgny/readline-6.3':
configure: error: cannot run C compiled programs.
If you meant to cross compile, use `--host'.
See `config.log' for more details

取り敢えず、brew doctorコマンドで診察してみたところ、
どうも心当たりのある警告が出ていました。

Warning: Your Xcode (6.4) is outdated
Please update to Xcode 7.0.
Xcode can be updated from
  https://developer.apple.com/xcode/downloads/

あれ?Xcode入れたんだけどな

と思って、xcode-select

$ xcode-select -p
/Applications/Xcode 6.4.app/Contents/Developer
sudo xcode-select -s /Applications/Xcode-beta.app/Contents/Developer/

どうやらxcode-selectの参照がXcode 6.4になっていたことが原因だったみたいです。
Xcode 7 Betaにしたところ、インストールすることができました。

これに限らず、iOS 9の開発でバージョン上げてから何かと詰まることが多いなあ・・(´・ω・`)ショボーン

Rubyのスコープと変数定義で「What!?」ってなった話

最近になって急に、開発言語がPerlからRubyObjective-Cに早変わりして大変です。

そして、Perlの感覚でRubyを書いていると「What!?」ってなったことがあったので、
久しぶりに記事にしてみました。

下記はPerlのコードです。

#!/usr/bin/env perl

use strict;
use warnings;

use utf8;

if (0) {
  my $message = 'hoge';
}
print "$message\n";

が、当然エラーは出ます。

Global symbol "$message" requires explicit package name at..
Execution of.. aborted due to compilation errors.

message変数のスコープがIfブロック内なので当たり前ですよね。


下記はRubyのコードです。

#!/usr/bin/env ruby

if false
  message = 'hoge'
end

puts "#{message}"

が、エラーは出ません

(何も表示されない)

どうやら、RubyにおいてIfやFor,Whileブロックはスコープを生成しないらしいです。


そのため、PerlRubyでは以下の様な違いが出ます。

Ruby

#!/usr/bin/env ruby

hoge = 10
puts hoge

if true
  hoge = 100
  puts hoge
end

puts hoge
10
100
100

Perl

#!/usr/bin/env perl

use strict;
use warnings;

use utf8;

my $hoge = 10;
print "$hoge\n";

if (1) {
  my $hoge = 100;
  print "$hoge\n";
}

print "$hoge\n";
10
100
10

それでは、話を下記のコードに戻します。

#!/usr/bin/env ruby

if false
  message = 'hoge'
end

puts "#{message}"

さて、Ifブロックがスコープを生成しないため、Ifブロック外で変数が見えていることは分かりましたが、
何故、undefined local variable or methodエラーが出ない理由が分かりません。

実際にmessage変数のクラスを表示するとNilClassになっています。

#!/usr/bin/env ruby

if false
  message = 'hoge'
end

puts "#{message.class}";
NilClass

理由は簡単で、ちゃんと定義されているからです。

どうも、Rubyのパーサは代入を見つけた時点で、勝手に変数を定義するようになっているそうです。

知っていれば当たり前なのかも知れませんが、
慣れていない自分からすると、
初期化されていない気がして不安になってしまいます(||゚Д゚)ヒエー!!

参考URL

未変更のファイルが変更扱いになっていた問題(サブモジュール編)

最近、git addしてもgit checkoutしても、変更扱いされているファイル(以下hoge)がありました。
僕としてはhogeをまったく変更した記憶がないんですが・・

同じような現象としてファイルモードの問題があったので、
下記URLを参考に解決しようと思ったのですが、
あんまり関係ありませんでした(ノ゚゚Д゚゚)ノオラァッ!!


その後・・

たまたまgit submodule initgit submodule updateしたときにhogeに対して下記エラーが発生しました。

No submodule mapping found in .gitmodules for path hoge

なんかサブモジュールになってる・・
工エエェェ(´д`)ェェエエ工

どうやら「インデックスに紐付いていないサブモジュールがあるぞい」というエラーらしいです。

サブモジュールはファイルモードが160000になっているため、
以下コマンドでインデックス一覧を確認できます。

git ls-files --stage | grep 160000

インデックス一覧と".gitmodules"ファイルを比べたときに一覧にしかないインデックスがあったので、git rmすることで無事に解決しました。
--cachedオプションを付けなければファイルごとサヨナラします。注意しましょう。

git rm --cached hoge

サブモジュールェ・・


追記

実はhogeは拾ってきたZshプラグインで、こいつがコミット時にディレクトリエントリとみなされたことが原因でした。
git cloneしたものをリポジトリに含むときにはちゃんとサブモジュールにしましょう。

参考URL

Git - サブモジュール

Macでトラックパッドのスピードを限界突破したい

最近全然更新してなかった割にはしょぼい記事ですが・・

Macのトラックパッドのスピードが遅いです。
Better Touch Toolを使って速くしているつもりですが、それでも遅いです。

すごいイライラします´д` ;

そこで、defaultsコマンドを使ってみました。

こいつはシステムやアプリの設定値を読み書きできるツワモノです。

$ defaults read -g com.apple.trackpad.scaling
8

現在、BTTで設定できる最大値の8になっているのですが、
あまりにも遅いので倍の16にしました!!

$ defaults write -g com.apple.trackpad.scaling 16

再起動後、めちゃくちゃ速くなりました。

しかし、BTTが勝手に設定値を書き換えるので併用できない・・

でも、BTTが使えないのは困る´д` ;


結局いい解決案は思いつかなかったんですが、defaultsコマンドが便利でいろいろできるので紹介させていただきました。

(この前までBTTで8以上に設定できたような気がするんだがなぁ・・)

BTTを使っていない人はこの手を使ってください。

でも、使ってない人はさっさと入れたほうがいいと思います_φ( ̄ー ̄ )カリカリ

参考URL

Magic trackpad tracking speed changes | Apple Support Communities

ScalaのArrayとApplyについて調べた

初、Scalaの記事です。

Scalaは言語仕様にオマジナイ的なものが少なくて、
勉強していて「なるほど、ここはこうなってんだ〜〜」て思うことが多いです。

さて、そんなScalaの配列ですが、定義方法だけでも結構あります。

val num: Array[Int] = new Array[Int](5);    // 型と要素数で定義
val num             = new Array[Int](5);    // 型推論
val num: Array[Int] = new Array(5);         // 型推論
val num             = new Array(5);         // Array[Nothing]
val num: Array[Int] = new Array[Double](5); // error: type mismatch;

上記はコンストラクタを用いた初期化です。

型と要素数をきっちり定義してもよし、型推論に身を任せてもよしです。
ちなみにブラケットはジェネリックです。
C#あがりの自分にとってはなつかしいものです(-_- )シミジミ


またクラスやオブジェクトにはApplyメソッドという特別なメソッドを定義することができ、定義されていればクラス名(オブジェクト名)のみで呼び出せます。

ArrayオブジェクトではArrayクラスのコンストラクタを呼び出すように実装されているので、 インスタンスの生成は以下のように記述することもできます。

val num: Array[Int] = Array[Int](1, 2, 3, 4, 5);    // 型と初期値で定義
val num             = Array[Int](1, 2, 3, 4, 5);    // 型推論
val num: Array[Int] = Array(1, 2, 3, 4, 5);         // 型推論
val num             = Array(1, 2, 3, 4, 5);         // Array[Int]
val num: Array[Int] = Array[Double](1, 2, 3, 4, 5); // error: type mismatch

Applyメソッドあなどれん・・

こんなかんじでオブジェクトをファクトリーにして同名クラスのインスタンスを生成させていることが多いです。
ちなみに、オブジェクト名とクラス名が同じものをコンパニオンオブジェクトといいます。

また、Applyクラスでは要素の取得・代入するように実装されているので、 要素の取得・代入は以下のように記述することができます。

val num = Array(1, 2, 3, 4, 5);
num(0)       // 1
num.apply(0) // 1
num          // 1, 2, 3, 4, 5
num(0) = 6
num.update(1, 7)
num          // 6, 7, 3, 4, 5

引数がふたつのときはUpdateメソッドを呼び出すように実装されています(こっちはオーバーロード)

うーん、Scalaはおもしろいですねー^_^

補足

実際のコードはこんなかんじです。

Arrayオブジェクト

def apply[A: ClassManifest](xs: A*): Array[A] = {
  val array = new Array[A](xs.length)
  var i = 0
  for (x <- xs.iterator) { array(i) = x; i += 1 }
  array
}

CentOS 6.4にTorch7をインストールしてみた

最近あまり記事書いてないなーと思いながら投稿・・

巷で噂のディープラーニングをやろうと思ってTorch7をインストールしてみました。
CentOS 6.4でやりました。

ディープラーニング系のライブラリは導入が割とメンドクサいらしく日本語の記事が少ないですね。
H2OとかCaffeとかいろいろあるのですが、 H2OはR言語なのがなんとなく嫌で、Caffeは導入で死ぬことが多いっぽかったのでTorch7でいっかーくらいの気持ちでTorch7にしました。


こちらに導入手順があるのですが、僕のCentOS 6.4だと依存ライブラリ解決スクリプトが、
/etc/os-releaseファイルがないという理由でちゃんと動かなかったので、
依存ライブラリの一覧だけ引っ張ってきて、普通にyumコマンド叩いてインストールしました。

sudo yum install -y cmake curl readline-devel ncurses-devel \
  gcc-c++ gcc-gfortran git gnuplot unzip \
  nodejs npm libjpeg-turbo-devel libpng-devel \
  ImageMagick GraphicsMagick-devel fftw-devel \
  sox-devel sox SDL2-devel zeromq3-devel \
  qt-devel qtwebkit-devel sox-plugins-freeworld

あと、OpenBlasとかいうライブラリも必要っぽかったので入れました。
これに関してもスクリプトから引っ張ってきただけです。

cd /tmp/
git clone https://github.com/xianyi/OpenBLAS.git
cd OpenBLAS
if [ $(getconf _NPROCESSORS_ONLN) = 1 ]; then
  make NO_AFFINITY=1 USE_OPENMP=0 USE_THREAD=0
else
  make NO_AFFINITY=1 USE_OPENMP=1
fi
RET=$?;_
if [ $RET -ne 0 ]; then
  echo "Error. OpenBLAS could not be compiled";
  exit $RET;
fi
sudo make install
RET=$?;_
if [ $RET -ne 0 ]; then
  echo "Error. OpenBLAS could not be installed";
  exit $RET;
fi

最後にPythonとipythonを入れたら依存関係は完了です(ipythonのバージョンが古いとダメみたいです)


git clone https://github.com/torch/distro.git ~/torch --recursive
cd ~/torch; ./install.sh

後は上記コマンドを実行して、シェルスクリプトを再読み込みしたらいけました。

vagrant:^_^[~]$ th

  ______             __   |  Torch7
 /_  __/__  ________/ /   |  Scientific computing for Lua.
  / / / _ \/ __/ __/ _ \  |  Type ? for help
 /_/  \___/_/  \__/_//_/  |  https://github.com/torch
                          |  http://torch.ch

th>

う~ん、なんかざっくりですがインストールできました。

近々、社内の勉強会でディープラーニングの発表をしないといけないのでさわっていこうと思います。


追記

あとから確認したんですが、SDL2-develとsox-plugins-freeworldがインストールできていなかった・・

どちらもサウンド系のライブラリみたいなんですが、音声解析とかさせるときに使うのかな??
入れる場合はソースから入れる必要があるかもしれません。