2014年12月14日日曜日

HttpFileUploadが動かなくなった

何やらHttpFileUploadが動かなくなった。Apache側のアクセスログに何も表示されないので、iOSアプリ側からHTTPリクエストを送れてすらいないっぽい。ただ、理由が分からない。

HTTPFileUpload.mのdelegateメソッドの最後尾にログを吐かせる一行を入れる。

メソッド: - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error


追加する行: NSLog(@"NSError is %@", error);

で、何が見えるか。コンソールを見ると、

NSError is Error Domain=NSURLErrorDomain Code=-1002 "unsupported URL" UserInfo=0x15d9f8a0 {NSUnderlyingError=0x15df9bf0 "unsupported URL", NSLocalizedDescription=unsupported URL}

という感じ。これを調べてみると、

NSURLErrorDomain Code -1002 downloading pdf

にコメントが載ってる。曰く「The reason for this error is that your URL contains some characters that have to be percent escaped.」ということである。

どうもパッと見では分からないのだけれど、アプリに埋め込んだURLの末尾の文字がおかしかったみたい。書き直したら何故かすんなり通った。見た目からは全く分からないんだけれど。

PHPのMySQLドライバの警告

そう言えば、PHPのMySQLドライバがずっと警告を吐き続けている。

Warning: mysql_connect(): Headers and client library minor version mismatch. Headers:50605 Library:50540 in /usr/local/httpd-2.4.2/htdocs/***** on line **

で、何なのこれって話ですが、とりあえずインストールされているMySQLのバージョンを調べる。

apt-cache show mysql-server
(省略)
Version: 5.5.40-0ubuntu0.12.04.1
(省略)

ということで5.5.40っぽい。これが「Library: 50540」って事なのかな。で、phpinfo()の結果を見てみると以下の様な感じに。

MySQL Supportenabled
Active Persistent Links 0
Active Links 0
Client API version 5.5.40
MYSQL_MODULE_TYPE external
MYSQL_SOCKET /tmp/mysql565.sock
MYSQL_INCLUDE -I/usr/local/mysql-5.6.5-m8/include
MYSQL_LIBS -L/usr/local/mysql-5.6.5-m8/lib -lmysqlclient_r  
これのinclude部分のバージョンが5.6.5な所が「Headers:50605」って事なのかな。仕方ないので、これは再コンパイルかな。

さて、ソースからビルドして入れるか。

> sudo apt-get build-dep php5-mysql

すると、結局php5をソースからビルドする事になる。

パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
'php5-mysql' の代わりに 'php5' をソースパッケージとして選出しています
以下のパッケージが新たにインストールされます:
  apache2-prefork-dev apache2-utils apache2.2-bin apache2.2-common aspell
  aspell-en chrpath comerr-dev debhelper dh-apparmor dictionaries-common
  diffstat flex freetds-common freetds-dev gettext groff-base
  hardening-wrapper html2text intltool-debian krb5-multidev lemon libapr1-dev
  libaprutil1-dbd-sqlite3 libaprutil1-dev libaprutil1-ldap libaspell-dev
  libaspell15 libbsd-dev libbz2-dev libcroco3 libct4 libcurl4-openssl-dev
  libdb-dev libdb5.1-dev libedit-dev libenchant-dev libenchant1c2a libfl-dev
  libgcrypt11-dev libgd2-xpm libgd2-xpm-dev libgettextpo0 libglib2.0-bin
  libglib2.0-data libglib2.0-dev libgmp-dev libgmp3-dev libgnutls-dev
  libgnutls-openssl27 libgnutlsxx27 libgpg-error-dev libgssrpc4
  libhunspell-1.3-0 libice-dev libicu-dev libicu48 libidn11-dev
  libkadm5clnt-mit8 libkadm5srv-mit8 libkdb5-6 libkrb5-dev libldap2-dev
  libmagic-dev libmhash-dev libmhash2 libmysqlclient-dev libp11-kit-dev
  libpam0g-dev libperl-dev libperl5.14 libpipeline1 libpq-dev libpq5
  libpspell-dev librecode-dev librecode0 librtmp-dev libsasl2-dev
  libsensors4-dev libsm-dev libsnmp-base libsnmp-dev libsnmp-perl libsnmp15
  libsybdb5 libt1-5 libt1-dev libtasn1-3-dev libtidy-0.99-0 libtidy-dev
  libunistring0 libwrap0-dev libxaw7-dev libxmltok1 libxmltok1-dev libxmu-dev
  libxmu-headers libxpm-dev libxt-dev man-db po-debconf quilt re2c uuid-dev
アップグレード: 0 個、新規インストール: 105 個、削除: 0 個、保留: 0 個。
1 個のパッケージが完全にインストールまたは削除されていません。
49.8 MB のアーカイブを取得する必要があります。
この操作後に追加で 166 MB のディスク容量が消費されます。
続行しますか [Y/n]? Y
(中略)
以下のパッケージの処理中にエラーが発生しました:
 grub-pc
E: Sub-process /usr/bin/dpkg returned an error code (1)
E: ビルド依存関係の処理に失敗しました

えらい事になったぜ。エラーはコマンド実行の途中に表示されていた。

/usr/sbin/grub-probe: エラー: cannot find a device for / (is /dev mounted?).
dpkg: grub-pc の処理中にエラーが発生しました (--configure):
 サブプロセス インストール済みの post-installation スクリプト はエラー終了ステータス 1 を返しました

なんでだろう。dfすると一応/devも見えるのだが。

> df -a
Filesystem     1K-blocks    Used Available Use% Mounted on
aufs             5104816 2362200   2486616  49% /
proc                   0       0         0    - /proc
sysfs                  0       0         0    - /sys
udev              113528       4    113524   1% /dev
devpts                 0       0         0    - /dev/pts
tmpfs              49084     212     48872   1% /run
none                   0       0         0    - /sys/fs/fuse/connections
none                   0       0         0    - /sys/kernel/debug
none                   0       0         0    - /sys/kernel/security
none                5120       0      5120   0% /run/lock
none              122700       0    122700   0% /run/shm
hostfs                 0       0         0    - /rackhub

なんか、何となく根が深そうなのでちょっとここは避けて通りたい

2014年12月13日土曜日

PHPの設定をもう少し追加


PHPでは直接ユーザからアクセスされないファイルを".inc"って感じの拡張子で作るけれど、このファイルがRackhubのApacheのデフォルト設定ではPHPとして認識されない様になっているので、それを設定する。

設定ファイル/usr/local/httpd-2.4.2/conf/conf.d/defaultの下記を変更。

変更前: AddHandler php5-script .php
変更後: AddHandler php5-script .php .inc

でもってApacheを再起動すると、無事に.incがPHPとして認識され、直接URLを叩いても真っ白な画面になる(PHPロジックを実行しても何も表示されないんで)。

> sudo /usr/bin/apachectl restart

Emacsもちょっと整備する

開発はMacBook Proでやっていて、当然iOSアプリの開発はX-codeなんですけれど、PHPの開発はやっぱりEmacsが良いなあと言う事で、とりあえずターミナルアプリ上でemacs -nwしてやってましたが、やはり生産性がイマイチなのでGUI版のEmacsでやることに。

最近は~/.emacsじゃなくて~/.emacs.d/init.elに書くんですね。とりあえず、PHPモードを使いたいので、init.elに下記を追加。

(autoload 'php-mode "php-mode" "Major mode for editing php code." t)
(add-to-list 'auto-mode-alist '("\\.php$" . php-mode))
(add-to-list 'auto-mode-alist '("\\.inc$" . php-mode))


これだけだとPHPモード本体が無いので、下記からダウンロードしてZIPファイルを解凍しphp-mode.elを取り出す。
でもってとりあえずphp-mode.el~/emacs.d/に置いて、M-x load-fileする。

あと、Spotlightの起動キーバインドがCtrl-spaceなので、これをCtrl-cmd-spaceに変更する。これ変えとかないとEmacsでコピペが出来ない。

RackhubのMySQLを整備する

なんか、触ってないとUNIXのコマンドとかMySQLの使い方とか、本当にスパッと忘れてしまうものだなあと実感。

とりあえず、Rackhubのrootパスワードを変更する。

> sudo su -
% passwd
New password:


そして一般ユーザに戻って

> mysql -u root -p

でさっき変更したrootのパスワードを入れると無事mysqlコマンドラインツールが起動した。UNIXユーザのパスワードを変更するのがpasswdコマンドだと思い出すのに2分掛かった。

さて、MySQLについてもすっかり忘れている。まずはデータベースから作らなくちゃ。作ったら一度コマンドラインツールからquitして再度データベースを指定してログインするよ。

mysql> CREATE DATABASE hoge;
Query OK, 1 row affected (0.01 sec)


mysql> quit
 

> mysql -u root -p hoge

mysql> show tables;
Empty set (0.00 sec)


ちなみにこんなサイトを発見。面白いし便利。

2014年12月7日日曜日

画像のアップロード時にジオタグが抜け落ちる

正確に言うと、iOSアプリ内で画像データを扱う際はUIImageクラスのインスタンスを使うわけであるが、このオブジェクトにはExifやその中のジオタグ(ロケーション情報。緯度とか経度とか)が入っていないので、UIImageオブジェクトをそのままHttpFileUploadでアップロードする(つまりバイナリをBase64エンコードして送る)だけでは、当然Exifやジオタグはアップロードされない。

逃げ方としては、ロケーション情報は普通にテキスト情報としてPOSTする、というのが簡単。

本筋から言うと、UIImageオブジェクトとしてでは無く、Exifやジオタグが入った「単なるバイナリファイル」としてアップロードすれば、この問題は回避出来るのかも知れない。時間があれば手を付けたいところ。

あと、PhotoLibraryから読み込んだ画像のデータでは、Exifやジオタグが取れていないっぽい。ここはどう解決するかまだ考えていない。

一つの逃げとしては、とにかく「画像をアップロードする時点の」位置情報で代替するという所か。

なんか中途半端だけれど。