2013年7月30日火曜日

iPhoneから投稿したときに特殊文字以降が表示されない

compose_to_wordpress_from_devidesWordPressと連携するiPhone・Androidアプリ(Titanium Mobile)を作成しているときに特殊文字(「かお」で変換して出てくる黄色のスマイリーなど)を投稿すると、それ以降の文章が表示されなかったので調べたときの覚書。

環境: CentOS 5.9, nginx 1.2.6, PHP 5.4.11, MySQL 5.5.32, WordPress 3.5

参考にしたのは下記サイト。

データベースの文字コードをutf8mb4にする必要があるみたい。

一度全てのデータをSQL文でエクスポートして「CHARSET=utf8mb4」で登録し直す。

デフォルトで「utfmb4」になるようにmy.cnfを変更。
# vi /etc/my.cnf

[mysqld]
# charset
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci

[mysql]
default-character-set=utf8mb4

確認
# mysql -p -u root

mysql> SHOW VARIABLES LIKE 'character_set%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8mb4                    |
| character_set_connection | utf8mb4                    |
| character_set_database   | utf8mb4                    |
| character_set_filesystem | binary                     |
| character_set_results    | utf8mb4                    |
| character_set_server     | utf8mb4                    |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+

WordPressの設定ファイルwp-config.phpもそれに合わせて変更。

define('DB_CHARSET', 'utf8mb4');

define('DB_COLLATE', 'utf8mb4_general_ci');

 

iPhoneやAndroidで入力された絵文字をPCのWebブラウザでも表示したい場合は下記のようなライブラリが役に立つかもしれない。

iPhone, Android, PC間で完璧に相互変換することは難しい。

機種依存文字は四角の豆腐のような文字になってしまう(「豆腐化」と呼ばれているらしい)ので、これを表示したくない場合はサーバー側で変換してあげる必要がありそう。

 

< Related Posts >

2013年7月16日火曜日

[Titanium Mobile] アプリ内で選択した画像をResize

android_image-resizeアプリ上で複数の写真を選択してサーバーにアップロードする仕組みを作っているときに、画像を適当な大きさにリサイズするやり方を調査したときの覚書。

環境: Titanium SDK 3.1.1.GA

検索して出てくるのが、imageView経由で変換する方法。

SDK 3.0からはAndroidでも
Titanium.Blob.imageAsResized
が使えるようになっているので、これを使うのが正攻法。

ただ試してみるとAndroid2.3.3搭載の端末(AQUOS PHONE SHARP IS14SH)では落ちる。

他にいい方法がないものかと検索すると、古い端末でも動くモジュールを開発してくれている方がいた。

このモジュールを導入して試してみると、リサイズされずに切り抜いた画像になってしまう。この現象を開発者の方に質問してみたのがこちら。

丁寧に対応してくれて無事リサイズされるようになった。

ただ、これを端末で試してみると数回に一回落ちる(あとで別の原因が分かったので、このモジュールとは関係ない)。

しょうがなくAndroid2.3.3以下は選択した画像そのままアップロードする仕組みに変更。この場合サーバーのアップロード制限に引っかからないようにチェックは必要。

 

次に遭遇したのがPOSTした画像をPHPで扱う際に、なぜかファイル名が「.txt」になっている現象。Android端末のみ。

Titaniumで加工した画像をアップロードするとなるみたい。

PHP側で置換することで対応。

foreach ($_FILES as $key => $file) {
    $name = $file['name'];

    // Adjust file name for android app
    if (!empty($name) && strpos($name, '.txt') !== false) {
        $name = str_replace('.txt', '.bmp', $name);
        $file['name'] = $name;
    }
    // save files
}

他に似たような問題で困っている人もいないみたいなので、別の手法がありそうな予感。

 

< Related Posts >

2013年7月11日木曜日

WordPressでBMPを扱うためにImageMagickをInstall

wordpress_imagemagick_bmpAndroidアプリからWordPressにPOSTした画像を処理する際に下記エラーが出力された。

No editor could be selected.

環境: CentOS 5.9, nginx 1.4.1, PHP 5.4.17, WordPress 3.5.0

ソースを追ってみると、GDライブラリはBMPを扱ってない(wp-includes/class-wp-image-editor-gd.phpの60行目あたり)。ImageMagickを使うと出来そうなのでインストールしてみた。

※結局YUM経由のImageMagickは古かったので、この辺は読み飛ばしてOK。

remiレポジトリは前の記事を参考に。

# yum install ImageMagick-devel.x86_64 --enablerepo=remi

/var/tmp/imagick/imagick_class.c: In function 'zim_imagick_setimageprogressmonitor':
/var/tmp/imagick/imagick_class.c:9534: error: 'struct _php_core_globals' has no member named 'safe_mode'
/var/tmp/imagick/imagick_class.c:9534: error: 'CHECKUID_CHECK_FILE_AND_DIR' undeclared (first use in this function)
/var/tmp/imagick/imagick_class.c:9534: error: (Each undeclared identifier is reported only once
/var/tmp/imagick/imagick_class.c:9534: error: for each function it appears in.)
/var/tmp/imagick/imagick_class.c:9534: error: 'CHECKUID_NO_ERRORS' undeclared (first use in this function)
make: *** [imagick_class.lo] Error 1
ERROR: `make' failed

下記サイトを参考にBetaバージョンをインストール。

# pear config-set preferred_state beta
# pecl install imagick
# vi /etc/php.d/imagick.ini

extension=imagick.so

# /etc/rc.d/init.d/php-fpm restart

phpinfo()で確認。

image

これでも最初のエラーが表示されBMP画像を加工できない。

さらにソースを追ってみると、
class-wp-image-editor-imagick.php
の96行目あたりで

// setIteratorIndex is optional unless mime is an animated format.
// Here, we just say no if you are missing it and aren't loading a jpeg.
if ( ! method_exists( 'Imagick', 'setIteratorIndex' ) && $mime_type != 'image/jpeg' )
        return false;

setIteratorIndexメソッドがあるかチェックしてる。これはImageMagick 6.2.9以上からサポートされているみたい(yumでインストールされたのは6.2.8)。

今度は公式サイトを参考に最新版をソースからインストールしてみる。

まずはさっきのをアンインストール。
# pecl uninstall imagick
# yum remove ImageMagick-devel

Image Magickをダウンロードしてインストール
# cd /opt/software/
# wget http://www.imagemagick.org/download/ImageMagick.tar.gz
# tar xzvf ImageMagick.tar.gz
# cd ImageMagick-6.8.6-4/
# ./configure
# make
# make install

imagickもソースからコンパイルする。下記サイトを参考に。

シンボリックリンクを貼っておく。これをしないとエラーになる。
# ln -s /usr/local/include/ImageMagick-6 /usr/local/include/ImageMagick

# cd ../
# wget http://pecl.php.net/get/imagick-3.1.0RC2.tgz
# tar xzvf imagick-3.1.0RC2.tgz
# cd imagick-3.1.0RC2
# phpize
# ./configure PKG_CONFIG_PATH=/usr/local/lib/pkgconfig
# make
# make install

Installing shared extensions:     /usr/lib64/php/modules/
Installing header files:          /usr/include/php/

/etc/php.d/imagick.ini
はさっき作ったのでそのまま。

# /etc/rc.d/init.d/php-fpm restart

phpinfo()で確認。

image

これで成功。

 

< Related Posts >

2013年7月9日火曜日

Let's note CF-S9にWindows8をInstall

windows8_install-to_lets-noteプロモーションで買ったWindows8日本語版が余っていたので、手持ちのレッツノートをアップグレードしてみた。

環境: Let's note CF-S9L(CF-S9LY9BDP), Windows7 64bit → Windows8 64bit

Windows8のインストールディスクはWindows 8 アップグレード アシスタントで購入したのをiso形式で出力して、ディスクに書き込んだものを使用。

アップグレード版とはいえ、Windowsの設定を引き継がなければクリーンインストール出来る。

インストールからセットアップを起動して、「個人ファイルを残す」に設定して実行。

インストール後デバイスマネージャーを開くといくつかドライバが見つからないものがあるので、それぞれ「ドライバーソフトウェアの更新」から
C:\util
を指定すると自動でインストールされる。

アップグレード完了後は「Windows.old」というバックアップフォルダが出来て容量を圧迫しているので、下記サイトを参考に削除する。

 

マウスパッドの縁をぐるぐるしてスクローするのは専用ソフトをインストールしないと使えないみたい。

インストール後は下記エラーが表示されるのでホイールパッドユーティリティだけアンインストールして使うのを止めた。

image

会社では外付けマウスを使うし、家ではリモートデスクトップで接続するので、今のところ不便はない。

ちなみにディスプレイはASUS MX279Hに出力してる(HDMI接続)。

Windows7の頃はディスプレイの電源が切れて復帰するときに、砂漠状態となっていた。その現象はアップグレードで直ったみたい。これは、ビデオドライバの問題だと思うし、時間が経ってもディスプレイの電源を切らない設定で回避出来ていたけど。

 

今まで活躍する機会があまりなかったレッツノートを使い倒せる環境が出来たので満足。

 

< 2013/09/11 Modified >
昨日イベント会場にて、ミュート(Fn + F4) → スリープ(蓋を閉じる) → 復帰(蓋を開ける) → ログインすることなくシャットダウン。

そして今日立ち上げてみると音がでない。。。もちろんミュートは解除。

ネットで探してみると、休止状態から復帰すると音が出るというので試してみると確かにこれで出るようにはなる。

Windows 8 標準のサウンドドライバを使っていたので、CF-S9L用のドライバに変更してみたけど変わらず(C\utilに入ってる)。

今まで休止状態から復帰しても音が出ていたので、ミュートが引き金になった気がする。

S9はWindows8動作確認対象外の機種なのでドライバは提供されないらしい。

どうしようもないのだろうか。。。

 

< 2013/10/18 Modified >
こちらのブログにホットキー用のアプリをインストールしたら直ったと情報があったので、試しにインストールしてみた。

下記を実行する。
C:\util\hkeyapp\setup.exe

再起動すると起動直後からミュート(消音)になっていて、Fn + F4で音が出るようになった!

 

< Related Posts >

2013年7月4日木曜日

[Titanium Mobile] SDKをSourceからBuildしてみる

titanium_build-sdk-from-source-codeAndroidアプリを作成しているときにソースコードを修正しないと解決しない問題に遭遇したので、ソースコードからビルドしてみたときの覚書。

環境: Mac OS X 10.8.4, Titanium SDK 3.1.1.GA

参考にしたのは下記。

SConsというビルドツールを利用するようなのでMacPortsからインストールする。

$ sudo port selfupdate
$ sudo port install scons

2.3.0がインストールされた。

次はAndroid NDK(Native Development Kit)のインストール。下記サイトからダウンロードして適当なディレクトリに解凍する。

環境変数を追加

$ vi ~/.bash_profile

#Android NDK
ANDROID_NDK=/Applications/android-ndk-r8e
export ANDROID_NDK=${ANDROID_NDK}
export PATH=$PATH:${ANDROID_NDK}

$ source ~/.bash_profile

titanium mobileのソースコードをダウンロードする。GitHub for Macを利用すると簡単。

ビルドしてみる。

$ cd /Users/daiki/Documents/GitHub/titanium_mobile/
$ scons android=1 android_sdk=/Applications/android-sdk-macosx/ PRODUCT_VERSION=3.1.2

失敗。。。

ndkのバージョンr8eはいくつかファイルを修正しないとビルドできないらしい。下記記事を参考に3ファイルを修正。

$ scons android=1 android_sdk=/Applications/android-sdk-macosx/ PRODUCT_VERSION=3.1.2

You don't have pyyaml!

またエラー。言われた通りにインストールコマンドを実行してみる。

# sudo easy_install pyyaml

build/temp.macosx-10.8-intel-2.7/check_libyaml.c:2:10: fatal error: 'yaml.h' file not found

libyamlが必要らしい。

$ sudo port install libyaml
$ sudo easy_install pyyaml
$ scons android=1 android_sdk=/Applications/android-sdk-macosx/ PRODUCT_VERSION=3.1.2

完了するとdist/mobilesdk-3.1.2-osx.zipが出来た。

$ unzip dist/mobilesdk-3.1.2-osx.zip dist/

解凍するとmobilesdkとmoduleがある。moduleは変更してないので、mobilesdkだけコピーしてみる。

$ cp -r dist/mobilesdk/osx/3.1.2 ~/Library/Application\ Support/Titaniu
m/mobilesdk/osx/

このSDKを使うように設定ファイルを修正。

$ cd
$ vi .titanium/config.json

tiapp.xmlの「sdk-version」も変更してビルドしてみる。

$ titanium build -p android --log-level debug --target device

これでソースを変更する環境が整った。

 

< Related Posts >

Related Posts Plugin for WordPress, Blogger...

Blog Archives