planet-green.com

NetBeans + OS X Mavericks + JDK-7u45での不具合



うちの環境だけかもしれませんが・・
OS X Mavericks + Java(JDK-7u45) + NetBeans7.4 の環境だとNetBeansが頻繁にフリーズします。

試行錯誤してみると、どうやらJDK-7u45(Java™ SE Development Kit 7, Update 45)が原因のようで、NetBeans7.3.1でもフリーズします。
ファイルの切り替え時や、検査機能を使おうとした時に高頻度で固まります。
OS X Lionでは7u45で問題なかったと記憶しているので、Mavericksとの相性問題かもしれません。

やむを得ず、こちらのページの“Uninstalling the JDK“を参考に7u45をアンインストールして、こちらからアップル製のJava SE 6をダウンロードしてインストールしなおしました。

AppleのJavaはバージョンが6ですがセキュリティパッチ対応済みなので、問題はないはず。
7u45のアンインストール時、私の場合は /Library/Java/JavaVirtualMachines/jdk1.7.0_45.jdk も削除しました。

本当はNetBeansの7.4を使いたいのですが、インストール時・起動時に7u45が無いと動かないので残念です。

余談になりますが、OSをLionからMavericksに上書きアップデートした状態で使用していた時はNetBeansがデュアルディスプレイ環境で表示の不具合を起こしていたのですが、Mavericksをクリーンインストールしたら解消しました。
Mavericksはクリーンインストールがいいようです。

コメント
planet-green.com

MacBook Pro(early 2011)のSSD換装



うちのMacBook Pro(early 2011モデル)はHDDをSSDに交換し、メモリも16GBまで拡張しています。
メモリは公式には8Gまでしか搭載できないことになってますが、実際には16G(8G x 2)まで搭載できます。
ただしメモリ拡張もSSD換装もメーカー保証外になるので自己責任で。

写真はSSDに換装した時の様子。
MacBook Pro Retina以降はメモリ・SSDの換装が困難になりましたが、2011モデルは大丈夫です。

IMG_1868

その時に購入したのがこのメモリで・・・昨年の購入時は8千円台だったのに、今みると倍近くになってます。
ノートPC用のPC3-10600(DDR3-1333)メモリが品薄になってるのでしょうか?
Transcend JetRam ノートPC用増設メモリ PC3-10600(DDR3-1333) 16GB KIT(8GB x 2) 永久保証 JM1333KSH-16GK
(Transcend ノートPC用メモリ PC3-10600 DDR3 1333 16GB 1.5V 204pin SO-DIMM Kit)

SSDはこれ。
(国内正規代理店品5年間長期保証付き)PLEXTOR PX-512M5P
(PLEXTOR PX-512M5P)

このPLEXTORのSSDは現在は廃版になっているようですが、SATA規格であれば他の製品でも問題なく接続できると思います。(ただし自己責任で。)

例えば、↓のCrucial製SSDはレビューにMacBook Proでの動作報告があるので安心できるのではないでしょうか。

 

あと、MacBook ProのHDDを換装するにはこの特殊ドライバーが必要です。

MacBookの裏蓋は通常の精密ドライバーで簡単に外れるようになっているので、特に難しい作業ではないと思います。
長いネジと短いネジが混在しているので、外した場所がわかるようにしながら作業するといいかもしれません。

他に気をつけないといけないのは、事前に体に溜まっている静電気を水道管などに触れて放電しておくことと、
HDD(SSD)を接続しているフレキシブルケーブルを傷つけないようにすることでしょうか。

具体的手順はここが参考になると思います。

普段からTimeMachineでHDDをバックアップしているなら、SSD換装後は驚くほど簡単にデータを移行できます。
(ユーティリティー → 移行アシスタント)

ただし、wavesなどアクティベーションが必要なソフトをインストールしている場合は、念のためライセンスをクラウド等に移しておくのがいいと思います。

そして、SSD換装後は忘れずにTrimをオンにしておくと、寿命も延びパフォーマンスも上がります。
Trim Enabler

私はDAWでの音楽制作もこのMacBookで行っていまして、今までHDDではBDF2やKontaktのライブラリ読み込みに時間が掛かり、再生させるとHDDの負荷ですぐに止まっていたのが、かなりスムーズに再生できるようになりました。(もっとも、当然ながらCPUの負荷までは低減できませんが。)

ちなみにearly 2011モデルの17インチはSSDとの相性で問題が起きるようですが、解決策もあるようです。
MacBook Pro 17インチ Early 2011のSATA 3問題が解消!

コメント
planet-green.com

MacBook Pro (early 2011)のバッテリー交換



先月のことですが、愛用していたMacBook Pro(early 2011)のバッテリーが死亡しました。

しばらく前から、メニューバーのバッテリーのアイコンをクリックすると『バッテリーの交換修理』と表示されていたのですが、ついに『バッテリーがありません』となってしまいました。

MacBook PRO「バッテリーがありません」の表示

普通のノートPCであれば、バッテリーが無くてもAC電源だけで問題なく使えると思うのでずか、MacBook Proはバッテリーが無いと起動すらしなくなります。

このスクリーンキャプチャーを撮った後、しばらくしたら起動もしなくなってしまいました。
(正確に言うと、ログイン画面までは出るがその後で落ちる)

バッテリーがまだ認識されていた時でも、CPU使用率の高い(=電力消費の高い)アプリケーションを動かしていると、あっという間に充電率が減っていき、ゼロになった時点でシャットダウンしていました。

おそらく、最大時の消費電力が、ACアダプターからの給電力より大きいからだと思いますが、この設計思想はどうなのでしょう。
交換用バッテリーの予備在庫はいつまでもあるわけでは無いでしょうから、次のバッテリー交換時に在庫が無ければ、その時がこのMacBook Proの寿命となります。

それ以外は全く不満の無い、素晴らしい製品なんですけどね、MacBook Pro。

で、AppleのGenius Barに予約して持ち込み、当日中に交換修理していただきました。約1万3千円の出費。

バッテリーを長持ちさせるにはこんな方法がいいらしいです。
MacBookのバッテリーと長く付きあう3つのコツ

全然気をつけてませんでした。

コメント
planet-green.com

正規表現でユーザーエージェントからSafariを判別する方法



ユーザーエージェント(以下、UA)からSafariを識別する必要があったのですが、
普通に “Safari” の文字列だけを検出しようとすると、Chromeも引っかかってしまいます。
何故ならChromeのUAにも次のように Safari の文字列が含まれているからです。

Mozilla/5.0 (Windows NT 6.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.76 Safari/537.36

そこで、Safariだけを判別したい場合に正規表現一発だけで何とか出来ないかと、ネットで調べて参考にしたのが次のパターン。PHPのコードです。

$ua = $_SERVER['HTTP_USER_AGENT'];
if ( preg_match("/^(?!.*Chrome).+(Safari).+$/i", $ua) )
{
    ....
}

ところが、UAに”Safari”が含まれるのはChromeだけではなく、AppleWebKitを利用している他のブラウザだと、この正規表現をすり抜けてしまいます。
例えば、Andoroid標準ブラウザのUAは次のようになっています。

Mozilla/5.0 (Linux; U; Android 4.1.1; ja-jp; Galaxy Nexus Build/JRO03H) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30

他にも、BlackBerryやSymbianも同様になっています。
そこで次に考えた力業(ちからわざ)がこれ。

preg_match("/^.+(Windows|Macintosh|iPhone|iPad)(?!.*Chrome).+(Safari).+$/i", $ua)

(Windowsも含まれてるのは、Windows版Safariも存在するので)

それにしても、正規表現を何年も使っていながら、「否定的先読み」なんて機能を始めてしりました。

もうちょっとスマートなやり方があるように思うので、誰か教えてください!

【参考】
Regex Negative Lookahead for Chrome & Safari
正規表現の先読み・後読みを極める!

コメント
planet-green.com

ffmpegのインストール及びavconvとの比較 (追記あり)



私が開発してるサービスで動画のエンコードが必要になった時の作業メモです。
ちなみにサーバー環境は Linux 64Bit(Ubuntu 12.04.3 LTS)、さくらサーバーのVPS。
(※Ubuntu16での変更点は追記に記載してます。)

ubuntuにパッケージで用意されているのはffmpegから派生したavconvだったので、当初はパッケージ版のavconv(v0.8.9)をインストールして動画をコンコードするプログラムを書いていました。
といいますか、ubuntuで apt-get install ffmpeg を実行するとffmpegではなくavconvがインストールされます。

ところが、いくつかのタイプの動画をテストでエンコードしてみてわかりましたが、このパッケージ版には不具合があります。
QuickTimeでエンコードされたmovファイル(動画コーディックはmp4)を再エンコードしようとすると Floating point exception というエラーが出て止まってしまいます。

既にプログラムはavconv用に書いていたので、気を取り直してソースから最新版のavconv(v0.9.10)をビルドしてみました。
すると、先ほどのmovファイルの再エンコードではエラーは出なくなりましたが、今度は別のwmvファイルを再エンコードしようとすると、

Application provided invalid, non monotonically increasing dts to muxer in stream 1: 13568 >= 13024
av_interleaved_write_frame(): Invalid argument

というエラーが出て止まります。

v0.8.9のソースからビルドすると、上記2つの動画は正常にエンコード出来るようになりましたが、古いバージョンを使うというのは気持ち的にあまり嬉しくありません。
そこでavconvは諦め、本家ffmpegに回帰することにしました。

ソースから ffmpeg v8.90 + libx264 + libvpx + FDK-AAC をビルドして、上記の二つの動画も問題なくエンコードできる事を確認。
オプションの挙動がavconvと若干異なっているのでプログラム側を微調整。

avconvは -movflags faststart に対応してないようでqt-faststartを後から実行する必要がありましたが、ffmpegではオプション一発で済むので楽ちんです。
また、動画フィルターとサイズ指定オプションの実行される順番なども異なってるようです。

以下、ffmpegをインストールした時の作業メモ。

【yasm】
ubuntuのyasmが1.1系でx264のビルドには1.2系が必要なので、先にインストール。
http://yasm.tortall.net/Download.html

./configure
make
make install

【FDK-AAC】
http://sourceforge.net/projects/opencore-amr/files/fdk-aac/

tar xzvf fdk-aac-0.1.*.tar.gz
cd fdk-aac-0.1.*
./configure --prefix=/usr/local
make
make install-strip

もし、 ./libtool: line 1125: g++: command not found の等エラーが出たら
apt-get install g++ でg++をインストール。

【libx264】
http://www.videolan.org/developers/x264.html

git clone git://git.videolan.org/x264
cd x264
./configure --prefix=/usr/local --enable-shared --enable-pic --extra-cflags=-fPIC --extra-ldflags=-fPIC --extra-rcflags=-fPIC --enable-strip
make
make install

【libvpx(WebM VP8/VP9 Codec SDK)】

git clone --depth 1 http://git.chromium.org/webm/libvpx.git (※下に追記あり)
cd libvpx
./configure --prefix=/usr/local --disable-examples
make
make install
ldconfig

【ffmpeg】

git clone git://source.ffmpeg.org/ffmpeg.git
cd ffmpeg

./configure \
--prefix=/usr/local \
--libdir=/usr/local \
--shlibdir=/usr/local \
--incdir=/usr/local \
--mandir=/usr/local \
--arch=x86_64 \
--disable-debug \
--extra-cflags="-s -O3 -mtune=native -march=native" \
--enable-gpl \
--enable-nonfree \
--enable-libfdk-aac \
--enable-libvpx \
--enable-libx264
make
make install
ldconfig
  • 結局のことろ、本家公式サイトが一番参考になりました。
    https://trac.ffmpeg.org/wiki/UbuntuCompilationGuide
  • AACエンコーダーはNeroAACCodecが最も音質がいいらしいですが、ffmpegへは組み込めず外部プログラムを呼び出す形になるため、次点のFDK-AACでいいかなと。

#追記 2016/10/13

Ubuntu 16.04 LTS にインストールしてみました。
基本的には上記のままで大丈夫でした。
yasm は1.3系がパッケージに含まれているのでapt-getでいけます。

apt-get install yasm

libvpxのレポジトリが移転してました。

git clone https://chromium.googlesource.com/webm/libvpx

FDK-AACの高音質が欲しくてソースからビルドしてみましたが、そこまでこだわりが無ければ、Ubuntu16の標準パッケージで全然問題ないかも・・・。

コメント
planet-green.com

AWstatsのnginx環境へのインストール



AWstatsをnginxが稼働中のサーバーにインストールした時のメモです。

公式サイトよりダウンロードして /usr/share/awstats に展開。
http://awstats.sourceforge.net/#DOWNLOAD

# tar xzvf awstats-7.6.tar.gz 
# mv awstats-7.6 /usr/share/awstats

そして、〜/awstats/tools/nginx/awstats-nginx.conf に書かれている設定をnginxのサイト設定ファイルに追記すればいいのですが、私の環境では次のように書き直す必要がありました。

#
# AWstats
#
location ^~ /awstats/classes/ {
 alias /usr/share/awstats/wwwroot/classes/;
}

location ^~ /awstats/css/ {
 alias /usr/share/awstats/wwwroot/css/;
}

location ^~ /awstats/icon/ {
 alias /usr/share/awstats/wwwroot/icon/;
}

location ^~ /awstats-icon/ {
 alias /usr/share/awstats/wwwroot/icon/;
}

location ^~ /awstats/js/ {
 alias /usr/share/awstats/wwwroot/js/;
}

# Dynamic stats.
location ~ ^/cgi-bin/(awredir|awstats)\.pl {

 #↓必要に応じて追加
 #auth_basic "Secret Area";
 #auth_basic_user_file "/home/*****/.htpassword";

 #↓これを先に書かないと設定が上書きされてしまうのか正常に動作しない
 include fastcgi_params;
 #fastcgi_pass 127.0.0.1:9000;
 fastcgi_pass unix:/var/run/php5-fpm.sock;
 fastcgi_param SCRIPT_FILENAME /usr/share/awstats/wwwroot/cgi-bin/awstats-fcgi.php;
 fastcgi_param X_SCRIPT_FILENAME /usr/share/awstats/wwwroot$fastcgi_script_name;
 fastcgi_param X_SCRIPT_NAME $fastcgi_script_name;
}

あるいは、fcgiwrapを入れている環境では下記でも動きます。

fastcgi_pass unix:/var/run/fcgiwrap.socket;
fastcgi_index index.cgi;
fastcgi_param SCRIPT_FILENAME /usr/share/awstats/wwwroot$fastcgi_script_name;
include fastcgi_params;

この awstats-fcgi.php、コードを読むとperlスクリプトをシェルから実行して出力結果を返しているようで、なるほどと思いました。
nginxを導入してる環境でfcgiwrapをインストールしてるところは少ないと思うので、これはありかも。)

cp /usr/share/awstats/tools/nginx/awstats-fcgi.php /usr/share/awstats/wwwroot/cgi-bin/
mkdir /var/lib/awstats
chmod -R 755 /usr/share/awstats/

 

perl /usr/share/awstats/tools/awstats_configure.pl

上記perlスクリプトを実行し、設問に適切に答えてプロファイル名も登録すると、
サイト設定ファイルが /etc/awstats/以下に作成されるので下記項目を修正

LogFile="/usr/share/awstats/tools/logresolvemerge.pl /var/log/nginx/access.log /var/log/nginx/access.log.*.gz |"
# ↑実際のログファイル名に合わせて修正してください。

DirData="/var/lib/awstats"

DirIcons="/awstats/icon"

# SiteDomain,HostAliasesはサイトに応じて修正。

そして集計実行。

perl awstats.pl -output=pagetype -config=登録したプロファイル名)

するとブラウザで集計結果を表示できるようになります。

http://(サイトのホスト)/cgi-bin/awstats.pl?config=(登録したプロファイル名)

集計をcronで1日1回実行したい場合は、/etc/crontabに下記追加

05 15 * * * root /usr/bin/perl /usr/share/awstats/wwwroot/cgi-bin/awstats.pl -config=(登録したプロファイル名) -update 1>/dev/null 2>&1

CRONデーモン再起動

/etc/init.d/cron reload

・思い出しながら書いているので、間違ったり抜けたりしてる箇所があるかもしれません。

 


#追記 2017/03/11
2016年以降、Googleの全面HTTPS化に伴う仕様変更により、referrerから検索キーワードを取得できなくなりました。
今後、他社の検索エンジンも追随していくと思われます。
そうなると、残念ながらAWStats等のアクセス解析ソフトを導入する意義が半減してしまいます。

GoogleウェブマスターツールやGoogleアナリティクスを利用すればGoogleで検索された時の検索キーワードは取得できますが、他社の検索エンジンで検索された時の検索キーワードを取得するためには、それぞれの会社別の同様のツールを利用しなければならず、かなり不便になりそうです。

また、そうなった時にAWstatsのようなサーバーサイドのアクセス解析は完全に不要になるかというと、そういうわけではなく、例えば画像や動画などのメディアファイルに直リンクされた場合、GoogleアナリティクスのようなJavaScriptのタグをHTMLに貼り付けるタイプのツールではアクセス情報が取得できません。

ですので、AWStatsの存在意義が無くなることは無いのですが・・・・うーん。

 

コメント
planet-green.com

新ブログはじめました



新ブログはじめました。

これより古いブログ記事は http://tomoya.blog1.fc2.com/ にあります。

また、コンピューター系の記事や写真ギャラリーは 旧サイト にもありますのでどうぞ。

コメント