Digitra

LINUXサーバの設定やプログラムのことなどを中心にブログを書いています。

MacのPHPがぶっ壊れたときの対処

Macで、homebrewで色々とインストールをしていたら、AtomPHPがおかしくなっているよとの警告が出てきたので、phpを叩いてみると、以下のようなエラーが出る。

 

$ php -v
dyld: Library not loaded: /usr/local/opt/readline/lib/libreadline.7.dylib
Referenced from: /usr/local/bin/php
Reason: image not found
Abort trap: 6

 

$ brew update && brew upgrade

をすると治るよという記述も見られたが、どうも治らない。

エラーが出ている、readlineも

$ brew reinstall readline

するも駄目だったが、そもそも、エラーには、libreadline.7.dylibが無いと出ている。

 

/usr/local/opt/readline/lib/を見てみると、確かに8はあるけど、7は無い。

brewコマンドでreadlineも確認。

$ brew info readline
readline: stable 8.0.0 (bottled) [keg-only]

 

ということで、強引だけど、8で7の代用をして試してみる。

 

リンク張ってみる

$ cd /usr/local/opt/readline/lib/
$ ln libreadline.8.dylib libreadline.7.dylib

 

 

あっさり動いた

$ php -v
PHP 7.0.15 (cli) (built: Jan 22 2017 08:51:45) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2017 Zend Technologies

 

以上

tailコマンドで16進数エスケープされた日本語をターミナルで表示する

Apacheデバッグログを出すときに日本語が、16進数エスケープされた状態になるので、どうにか日本語が読める状態にならないかなと思っていましたが、perlをパイプで使うことでtailしながら日本語がしっかり表示できました。

 

tail -f [logファイル] | perl -nle 's/\?\\([a-f\d]{3})/chr($1)/ieg;s/\\x([a-f\d]{2})/pack("C", hex($1))/ieg;print $_;'

 

おそらく、nkf -wを咬ませても、うまくいくとは思いますが、それだけのために、調査したいサーバにnkfインストールするのは面倒なので、これがいいかなと。

cronで1分以下の実行をさせる方法

sleepさせてから実行するプロセスを一気に作ってしまうことで実現します。

 

* * * * * for i in `seq 0 15 59`;do (sleep ${i} ; /path/to/script &> /tmp/script.log ) & done;

 

上の例だと、15秒おきに実行となる。

sleep 0 ; /path/to/script &> /tmp/script.log
sleep 15 ; /path/to/script &> /tmp/script.log
sleep 30 ; /path/to/script &> /tmp/script.log
sleep 45 ; /path/to/script &> /tmp/script.log

のプロセスが出来て、15秒おきの実行が実現できる。

GoogleMapApiで地名と緯度経度を相互変換する

GoogleMapのAPIで地名と緯度経度を変換するAPIがあります。

今のところこのAPIデベロッパーキーなどの指定がなくても利用できるようなので、以下のようなPHPのコードで簡単に変換することが出来ます。

 

地名から緯度経度を得る

第一引数:地名
第二引数:検索結果の地名を何語で得るか(デフォルト日本語にしています)
返り値:GoogleMapGeocodeのAPIのレスポンスを連想配列にしたもの

function getGoogleGeoCode($location, $lang="ja") {    
    $url = "http://maps.google.com/maps/api/geocode/json?sensor=false";
    $url.= "&language=".$lang;
    $url.= "&address=".urlencode($location);
    $rawdata = file_get_contents($url);
    return json_decode($rawdata,TRUE);
}

 

緯度経度から地名を得る

第一引数:緯度
第二引数:経度
返り値:GoogleMapGeocodeのAPIのレスポンスを連想配列にしたもの

function getGoogleGeoAddress($lat, $lng) {
    $url = "http://maps.google.com/maps/api/geocode/json?sensor=false";
    $url.= "&latlng=".$lat.",".$lng;
    $rawdata = file_get_contents($url);
    return json_decode($rawdata,TRUE);
}

 

file_get_contentsの関数でURLをOpen出来ないようなサーバの場合は、 cURLとかで叩いてください。 

 

developers.google.com

 

PHP: file_get_contents - Manual

PHPでディレクトリ内のファイルをまとめて消したい

PHPでファイルを消すときにはunlink、ディレクトリを消すときにはrmdirを使いますが、ディレクトリ内のファイルをまとめて消す場合や、*でパターンで消したい場合は、

array_mapとglob関数を使って、消してあげましょう。

PHP: array_map - Manual

PHP: glob - Manual

 

例:

array_map('unlink', glob("/tmp/hoge/*.txt"));

 

とてもスマートですね。

iPhoneが突然電源が切れる問題は解決するのか

AppleがiPhone6Sが突然電源が切れる問題の交換プログラムが開始されたので、早速自分のiPhoneが対象になっているかを調べてみた。

iPhone 6s が突然シャットダウンする問題に対するプログラム - Apple サポート

 

シリアル番号は、「設定」>「一般」>「情報」を開いて、「シリアル番号」のところを長押しするとコピーできる。

 

で、入れてみたものの、おめーのは対象じゃないぜ!とのこと。マジかよ。。

 

更に来週には、iOSのソフトウェアアップデートで診断プログラムが配布されるとのことだ。

www.rbbtoday.com

 

そもそも、iPhone6Sに限定したAppleは対応をすすめているが、うちの嫁さんはiPhone5Sでも発生するし、同僚はiPhone6でも発生している。

しかも、自分含め、3人共、iOS10にアップする前には発生しなかった問題だ。

 

空気が原因だったという見解も出てきた。

japan.cnet.com

 

iPhone6Sの一部の機種はもしかするとそうなのかもしれないが、他のiPhone機種でも発生しているのだから、やはりOSの問題なのではないだろうか。

 

もし、バッテリーがヘタっているのだとしたら、残容量が十分にあるにも関わらず、突然電源が切れるのは、どうにも納得がいかない。

あるとしたら、実はバッテリーの残容量は殆どないにも関わらず、バッテリー残容量がまだ20%や30%あるように見えているバグだろう。

 

iOSのアップデートで直る問題なら良いのだが、今のiOSがバッテリー周辺のモジュールをぶっ壊してしまうようなもので、世界中の新旧iPhoneをぶっ壊しているのだとしたら累計出荷台数10億台超えているから大変なことだ。

 

 

MacでEclipseが起動しなくなったと思ったらiCloudのせいやった

MacBookAirでEclipseを使っているのですが、突然Eclipseを起動ができなくなりました。
ログを見ろとことなので、見てみると

java.lang.NoClassDefFoundError: Could not initialize class jp.sourceforge.mergedoc.pleiades.aspect.resource.Translations

 

と出力されている。
んなとこ、触ってないがな!!
と原因を調べてみると、必要なファイルが見つからないようだ。

MacOS Sierraになってからか、利用頻度の少ないファイルをiCloudに勝手にどんどんアップして、ローカルストレージを節約していくような機能がついたようで、ローカルの実体ファイルがなくなっていたりします。
普通のファイルとかだったらアクセスしたときにiCloudからダウンロードしてくるので問題ないですが、アプリケーションでファイルチェックしているような場合は困るわけです。

私の場合は、Eclipseをダウンロードして ~/Documents/以下に展開していたので、iCloudが親切にもアップしてくださっていたようです。
EclipseのアプリディレクトリにiCloudの雲のマークがついていたので、これをクリックするとそのディレクトリ以下のiCloudにアップロードしていたファイルをダウンロードしてきてくれます。

ダウンロードが終わったら、再度Eclipseを起動してみると、何事もなかったように動く。
あーよかった。っと数日経つとまたiCloudさんが勝手にアップしてEclipseが起動できなくなっていた。

~/Documents/ 以下にアプリ置いてんじゃないよってことだろうから、Eclipseの置き場所を ~/MyApp/ とかのディレクトリ作ってお引越しします。