開発環境にMacを使用しているの方は要注意!SRMコマンド!
みなさん、開発環境には何を使っていますか?Linuxですか?Macですか?はたまたWindowsですかね?
ちなみに僕は家も会社もMacを使っています。
そしてMac以外をご使用の方はこの先を読む必要はあまりないかもしれません(読んでくれるとうれしいけどね)
先日、ファイルを削除でrm
コマンドを使おうとしたら、間違ってsrm
と打って実行してしまったのですが、
何もエラーは出ず何も標準出力もされず通ってしまいました。
^_^[~]$ srm hoge/huga/foo/bar.txt ^_^[~]$
そして、どうせ大したことないだろうと思っていたらファイルが消えていました・・
どうもsrm
コマンドはMacでファイルを完全消去するためのコマンドのようで、ゴミ箱で「確実にゴミ箱を空にする」を押したときに実行されるやつみたいです。
実行するとなんの面影もなく、ファイルが完全消滅してしまいます。
そんなコマンドがrm
コマンドにs
を追加するだけで簡単に使用でき、
使い方もrm
コマンドとほとんど変わらないので普段Macで開発している人は要注意です!
そんなわけで早速"zshrc"に以下を追加しました。
alias rm='rm -i' alias cp='cp -i' alias mv='mv -i' alias srm='srm -i' # new!
今回はたまたま消していいファイルだったのでよかったんですが、大事なファイルを削除しないためにも-i
オプションは付けておくようにしましょう。
参考URL
RailsとBundlerで`bundle exec`を省略した話とその時の副産物について
Railsアプリケーションの開発に使っているBundlerで一々bundle exec
を打つのって面倒ですよね。
調べてみるとrbenvのpluginだとかいろいろあるらしいのですが、
これまではずっとエイリアスでなんとか凌いでいました。
↓こんなやつ↓
alias rs='bundle exec rails server' alias rc='bundle exec rails console'
まあ、これでも別にいいんですが、最近たまたまGitHubを漁っていたら、良さ気な回避方法を使用しているプロジェクトがあったのでちょっと移行してみました。
多分、仕組み的にはrbenvのpluginとそんなに変わらないんじゃないかな・・
※以下はアプリケーションルートにいる前提です
まず、bundle install
時に--binstubs
を付けて、railsやrakeコマンドの実行ファイルのスタブを作成しておきます。
bundle install --binstubs #{path}
※#{path}を指定しなければ'bin/‘ディレクトリ以下に作成されますが、Rails 4では元のスクリプトが上書きされるので注意してください
これで./bin/rails
でrailsコマンドが実行できる訳ですが、このままだとパスが通っていないのであんまり便利じゃないっす!
ただ、普通にパスを通してしまうと全てのディレクトリから実行可能になってしまうので、以下のディレクトリを作成して、".zprofile"ファイルに以下を記述します。
mkdir -p .git/safe/
多分'.git/safe/‘ディレクトリに大きな意味はないです。
export PATH=.git/safe/../../bin:$PATH
※Bashなら". bash_profile"ファイルだっけ?
こうすることで、アプリケーションルートに".git/safe"ディレクトリが存在すれば、アプリケーションルートの"bin/“ディレクトリが実行パスに追加されるので、
アプリケーションルートでのみ実行可能で、かつbundle exec
を省略することができます。
実行パスに相対パスが来るのがなんか気持ち悪い気がしますが、仕組みが分かりやすいのでとりあえずこれに落ち着きました。
あと、僕は英語があんまり得意ではないので、もしかしたら本来の意図と違っているかもしれません・・( ̄ω ̄;)
これを応用すれば、ディレクトリレベルで実行可能なスクリプトやエイリアスっぽいものが使えそうな気がしました。
環境変数もあんまり汚さないのでいいのではないでしょうか?(これが副産物です)
参考URL
PATH=".git/safe/../../bin:$PATH" and do mkdir .git/safe in the root of repositories that you trust.
— Tim Pope (@tpope) 2012年2月4日
今更ながらXcode 7のBitcodeについてまとめてみた
タイトルにあるように今更ながら、Xcode 7でいろいろあったBitcodeについてまとめてみました。
まずはじめに、BitcodeとはXcodeのビルドフローにおける中間言語(LLVM IR)のバイナリ表現です。 LLVM IRにはテキスト表現とバイナリ表現の2種類がありますが、そのうちのバイナリ表現になります。
また、Xcodeの基本的なビルドフローは以下のようになります。
で、Xcode 7以降はデフォルトでBitcodeを含んだデータを生成するようになった感じです(もちろんBuild Settingsで無効にできます。詳しくはこの記事を)
Bitcodeを有効にすることでApple側でアーキテクチャに合ったコンパイルをしてくれるなど、メリットがあるのでなるべく有効にしておくといいと思います。
ちなみに、フレームワーク製作者の方はBitcodeに対応する場合、Build Settingsで有効にするだけだと駄目かもしれないです。詳しくは参考URLにあるのですが、xcodebuild
にOTHER_CFLAGS="-fembed-bitcode"
を設定すると多分いけると思います。
また、実際にアプリケーションに導入してテストする際に、通常のビルドではなくアーカイブまでしてください。じゃないとBitcodeのチェックが入らないので気付かないかもしれませんよ(経験済み)
Bitcodeに対応できていない場合、以下のようなエラーが出ます。
ld: bitcode bundle could not be generated because ~ was built without full bitcode. All object files and libraries for bitcode must be generated from Xcode Archive or Install build for architecture ~ clang: error: linker command failed with exit code 1 (use -v to see invocation)
参考URL
コンテンツ単位でボットからのアクセスを無視する
自身のサイトに訪れたユーザのアクセス情報をイベント単位で取得し、レポートを作成したり、Mixpanelを使用するとき、
クローラなどのボットが凄まじいノイズっぷりを発揮し、
レポートがメチャクチャになります。
サイト単位やページ単位でボットのアクセスをスルーする場合は、"robots.txt"ファイルを作成すればOKですが、検索結果から消滅されると困ります。
"robots.txt"については参考URLを参照してください。
そこで別の手段として、さらに細かいコンテンツ単位で指定する場合や、
"robots.txt"ファイルを無視するボット対策として、
ユーザエージェントで判断する方法があります。
例えばGooglebotの場合は、ユーザエージェントに"Googlebot"が含まれるため、 以下のコードで簡単にスルーできます。
if !request.env["HTTP_USER_AGENT"].match("Googlebot") # TODO: end
同様の方法で"libwww"も簡単にスルーできたりします。
ちなみにGoogleアナリティクスには、ロボットをフィルタリングするための設定があるようですね。
参考URL
Xcodeで遭遇したエラーたち・・(逐次更新)
見つかる度に逐次更新していく予定です。
duplicate symbol OBJC_CLASS$_ (2015-09-18)
duplicate symbol _OBJC_CLASS_$_#{hoge}
同じ名前のクラスや変数,メソッドなどが定義されていれば発生します。本来はIDEの恩恵ですぐに気付くと思いますが、僕の場合はCompile Sourcesに同じファイルが含まれていたことによって発生しました。
ファイルの作り直しとかをしてたら遭遇するかもしれません。
importで"*.m"ファイルを間違えて読み込んでも発生するそうです(参考URLはてブより)
ARC forbids explicit message send of (2015-09-28)
ARC forbids explicit message send of #{'autorelease' | 'release'}
メモリ管理方式でARCが有効になっているのに、autoreleaseメソッドやreleaseメソッドが記述されていると発生します。
TARGETSの設定からBuild Settings => Apple LLVM - Language - Objective C => Objective-C Automatic Reference CountingをNoにすることで解消します。
古いカウンタ管理方式を用いているアプリケーションを、新しいXcodeで編集したことによって発生しました。
Include of non-modular header inside framework module ${module_name} (2015-10-22)
Include of non-modular header inside framework module #{module_name}
フレームワークのモジュール内に非モジュールのヘッダファイルがインクルードされていると発生します。
TARGETの設定からBuild Settings => Apple LLVM - Language- Modules => Allow Non-modular includes in Framework ModulesをYesにし、
読み込みを許可することで解消できますが、
もしあなたがフレームワークの開発者ならば、ちゃんとmodulemapで対応したほうがいいと思います。
App Transport Security has blocked a cleartext HTTP (2015-11-19)
iOS 9からHTTPS通信が推奨されるようになったため、HTTP通信を行うとこのエラーに遭遇するかも知れません。
でも、Appleが推奨しているので、できればHTTPSに切り替えるほうがいいと思います。
一応、ATSを無効にすることでHTTPでも通信は可能です(詳しくは参考URLを見てください)
ld: bitcode bundle could not be generated because was built without full bitcode. (2015-12-07)
ld: bitcode bundle could not be generated because #{framework_path} was built without full bitcode.
使っているフレームワークがBitcodeに対応していないのに、Bitcodeを有効にしていると発生します。
Bitcodeに対応するのを待つか、TARGETSの設定からBuild Settings => Build Options => Enable BitcodeをNoにすることで無効にできます。
Xcode 7から有効になったので、Xcode 6で作ったアプリケーションをXcode 7で起動した人は見たことがあるんじゃないでしょうか?
また、Bitcodeについては別記事にまとめていますので、よかったらそちらも御覧ください。
was built for newer ios version than being linked (2018-08-09)
was built for newer ios version (${xxx}) than being linked (${yyy})
これに関しては実際に起ったものを解決したわけではないので、調べた限りでのあくまでも予想ですmm
- xxx: リンクしているあるライブラリ中のDeployment Target
- yyy: リンクしているあるライブラリ中またはアプリ自体のDeployment Target?
Deployment Targetに関しては過去に記事を書いたのでそれを見てもらえると......
アプリに使用するライブラリの最小動作保証バージョンがxxxなのに、アプリまたはそれ以外のライブラリでより古いバージョンの動作を保証しているってことだと思う。
なので、アプリ自体またはライブラリのDeployment Targetを調整すれば直るかな?
なおライブラリ自体のDeployment Targetを調べるには以下のコマンドを実行する。
otool -lv #{library_filepath} | less
Load command 1 cmd LC_VERSION_MIN_IPHONEOS cmdsize 16 version 7.0 sdk n/a
参考URL
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に、
XcodeをXcode 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の開発でバージョン上げてから何かと詰まることが多いなあ・・(´・ω・`)ショボーン