2014年5月29日木曜日

PHPでUUIDを生成するための拡張モジュールをインストール

uuid_phpPHPでUUID(Universally Unique Identifier)を生成したかったときの覚書。

環境: CentOS 6.5, nginx 1.6.0, PHP 5.4.28

コマンドラインツール(pecl)をインストールする
# yum install php-devel php-pear

検索してインストール
# pecl search uuid
# pecl install uuid

エラー

configure: error: no acceptable C compiler found in $PATH
See `config.log' for more details.
ERROR: `/var/tmp/uuid/configure --with-uuid' failed

コンパイラがないらしい。
# yum install gcc
# pecl install uuid

またエラー

configure: error: 'uuid/uuid.h' header not found
ERROR: `/var/tmp/uuid/configure --with-uuid' failed

uuid用のライブラリがないらしい。yumで検索してインストール。
# yum search uuid
# yum install libuuid-devel
# pecl install uuid

成功

Build process completed successfully
Installing '/usr/lib64/php/modules/uuid.so'
install ok: channel://pecl.php.net/uuid-1.0.3
configuration option "php_ini" is not set to php.ini location
You should add "extension=uuid.so" to php.ini

 

# vi /etc/php.d/uuid.ini

extension=uuid.so

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

phpinfo確認
# php -i | less

提供されているメソッドをヘッダーファイルで確認。

UUID v4を試してみる。
# php -r "echo uuid_create(UUID_TYPE_RANDOM);"

 

インストールしてはみたが、コンパイルして環境を整えるほどのことでもないので、この方法は止めた。

アンインストール
# rm /etc/php.d/uuid.ini
# pecl uninstall uuid
# /etc/rc.d/init.d/php-fpm restart

 

< Related Posts >

2014年5月23日金曜日

Lets Note S9の内蔵Wifiが壊れたので無線LAN子機を買った

有線LANから無線LANに切り替えると正常に動くこともあったけど、必要なときに使えないと困るので何とかしようとしたときの覚書。

環境: Let's note CF-S9L(CF-S9LY9BDP)Windows8.1 64bit

先に結論を書くと内蔵wifiデバイスが壊れていたので、以下はそう判断するまでのログ。

デバイスマネージャーで見ると無線LANはこんな風に表示されてた。

image

Let's note S9はWindows8のサポート対象外なのでIntelのサイトから最新のドライバをインストールしてみた。

Wireless_16.11.0_e164.exeをダウンロード・実行・再起動した。

するとデバイスマネージャーから消えて無線LANは全く反応しなくなった。

他試したこと。

  • 「システムの復元」を実行しても前の状態に戻らなかった。
  • Wireless_16.11.0_De164.exeも試してみた。
  • PanasonicのサポートページにあるWindows8対応しているS10のドライバもインストールしてみても改善せず。

 

パナソニックのサポート情報はこちら。

 

大人しくUSB無線LAN子機を買うか、Windows7のまま使う方がよさそう。

Windows8は堪能したし、どっかのタイミングでWindows7に戻すと思う。

 

< 2014/06/05 Modified >
リカバリーディスクを使って工場出荷時(Windows7)に戻したけど変わらず。そもそもデバイスマネージャに表示されないまま。

修理に出す?

 

< 2014/06/20 Modified >
いつの間にかデバイスマネージャに表示されるようになったけどWifiは使えないまま。無線LAN子機を買った。

 

< Related Posts >

2014年5月22日木曜日

CentOS上でJSHint + Gruntを使ってJavaScriptの文法チェック

grunt_jshint前の記事はMac向け。今回はCentOS向け。実行するコマンドが少し違う。

環境: CentOS 6.5 x64, node.js v0.10.28

node.jsのインストールは省略。こちらの記事を参考に。

nodejsプロジェクトに移動して、JSHintとGruntをインストール。
# su - node
$ cd /home/httpd/project/api/
$ npm install jshint -g
$ npm install grunt-cli -g

Grunt本体とプラグインをインストール。
$ npm install grunt --save-dev
$ npm install grunt-contrib-jshint --save-dev
$ npm install grunt-contrib-watch --save-dev

「save-dev」オプションは開発用モジュールをインストールするときにpackage.jsonの「devDependencies」に自動で追加してくれる。

devDependenciesのモジュールをアップデートするときは下記コマンド。
$ npm update -d

 

grunt設定ファイルを作成。
$ vi Gruntfile.js

Gistで公開しているのを参考に。

module.exports = function(grunt){
    var files = [];

    // Load plugins
    grunt.loadNpmTasks("grunt-contrib-jshint");
    grunt.loadNpmTasks("grunt-contrib-watch");

    // Watch Files
    files.push('app.js');
    files.push('config.js');
    files.push('lib/**/*.js');
    files.push('routes/**/*.js');

    grunt.initConfig({
        options: {
            livereload: true,
        },
        jshint: {
            all: files,
            options: {
                unused: true,
                node: true,
                newcap: false
            }
        },
        watch: {
            jshint: {
                files: files,
                tasks: ["jshint:all"]
            }
        }
    });
};

 

試してみる。
$ grunt jshint:all

監視開始
$ grunt watch:jshint

 

 

< Related Posts >

2014年5月21日水曜日

CentOS6 + nginx + PHP5.4 + MariaDB10 + WordPress + node.jsの環境を構築する手順をまとめ

CentOS6_platformCentOS-6.5-x86_64-minimalの環境にWordPressとREST APIの開発環境を構築するまでの手順を覚書。

環境: CentOS 6.5 x64

目次

  1. Firewallを設定
  2. nginxをYUM経由でインストール
  3. Remiリポジトリを追加してPHP5.4をインストール
  4. MySQLの代わりにMariaDBをインストール
  5. phpMyAdminをインストール
  6. WordPressをインストール
  7. REST API用にnode.jsをインストール
  8. REST API用にnginx設定ファイルを編集

 


1.Firewallを設定

ファイヤーウォール設定ツールをインストールして実行。

# yum install system-config-firewall-tui
# system-config-firewall-tui

開発用サーバーはsambaで共有するのでSELinuxを切っておく。

# vi /etc/sysconfig/selinux

SELINUX=disabled

# reboot

SELinuxの現在の動作モードを確認
# getenforce

 


2.nginxをYUM経由でインストール

前の記事を参考にCentOSのバージョンだけ変更。詳しくは公式ドキュメントを参考に。

# vi /etc/yum.repos.d/nginx.repo

[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/6/$basearch/
gpgcheck=0
enabled=1

# yum update
# yum install nginx

自動起動設定

# /etc/rc.d/init.d/nginx start
# chkconfig nginx on

 


3.Remiリポジトリを追加してPHP5.4をインストール

標準リポジトリはPHP5.3なのでRemiリポジトリを追加。

これも前の記事を参考にCentOSのバージョンだけ変更。wgetがなかったのでインストールしてから(curlでもいい)。

# yum install wget
# wget http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
# wget http://ftp.jaist.ac.jp/pub/Linux/Fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
# rpm -ivh epel-release-6-8.noarch.rpm remi-release-6.rpm

Remiリポジトリはデフォルトで有効にしておく。

# vi /etc/yum.repos.d/remi.repo

[remi]
enabled=1

PHP5.4をインストール

# yum update
# yum install php php-fpm php-devel php-cli php-xml php-mysqlnd php-mbstring php-gd php-mcrypt

「php-mysql」ではなく「php-mysqlnd」をインストールする。MariaDB 10はこちらでないと動かない。

自動起動設定

# /etc/rc.d/init.d/php-fpm start
# chkconfig php-fpm on

 


4.MySQLの代わりにMariaDBをインストール

これも前の記事を参考にCentOSのバージョンだけ変更。公式ドキュメントを参考に。

# vi /etc/yum.repos.d/MariaDB.repo

[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.0/centos6-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1

# yum update
# yum install MariaDB-server MariaDB-client

自動起動するように設定

# /etc/rc.d/init.d/mysql start
# chkconfig mysql on

初期設定スクリプトを実行。

# mysql_secure_installation

設定ファイルを編集してデフォルトの文字コードを指定。後々スマホアプリからの入力も受け付けるので「utf8mb4」にする。

# vi /etc/my.cnf.d/mysql-clients.cnf

[mysql]
default-character-set=utf8mb4

# vi /etc/my.cnf.d/server.cnf

[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
default-storage-engine = MyISAM
ft_min_word_len = 1
max_connections = 500

# Tuning
thread_handling = pool-of-threads
sort_buffer_size = 1MB
read_rnd_buffer_size = 1MB
join_buffer_size = 1MB

再起動

# /etc/rc.d/init.d/mysql restart

utf8mb4にするとvarcharのカラムにインデックスを付けられる文字数が変わり、MyISAMで最大250文字、InnoDBで最大191文字になる。無意味にvarchar(255)のカラムを作成しないようにする。

MySQL関連は下記サイトも参考に。

 


5.phpMyAdminをインストール

公式サイトからダウンロードして設置。

# cd /opt/httpdocs/
# yum install unzip
# unzip phpMyAdmin-4.2.0-english.zip
# mv phpMyAdmin-4.2.0-english phpmyadmin

nginxの設定ファイルを編集してアクセスできるように。

# vi /etc/nginx/conf.d/00_default.conf

server {
    listen       80 default_server;
    server_name  _;

    root    /opt/httpdocs;
    index   index.php index.html index.htm;
    charset utf-8;
    client_max_body_size 20M;

    location = /robots.txt  { access_log off; log_not_found off; }
    location = /favicon.ico { access_log off; log_not_found off; }

    location ~* \.php$ {
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        fastcgi_intercept_errors on;
        include        fastcgi_params;
    }

    location ~ /\. {
        deny  all;
        access_log off;
        log_not_found off;
    }
}

# /etc/rc.d/init.d/nginx configtest
# /etc/rc.d/init.d/nginx reload

「http://[IPアドレス]/phpmyadmin」でアクセス出来るはず。

開発用サーバーは外部に公開してないので、root用パスワードも設定ファイルに記述する。

# cd /opt/httpdocs/phpmyadmin/
# cp config.sample.inc.php config.inc.php
# vi config.inc.php

//$cfg['Servers'][$i]['auth_type'] = 'cookie';
$cfg['Servers'][$i]['auth_type']     = 'config';
$cfg['Servers'][$i]['user']          = 'root';
$cfg['Servers'][$i]['password']      = 'pass';

 


6.WordPressをインストール

ソースを公式サイトからダウンロードして設置。

# cd /opt/httpdocs/
# unzip wordpress-3.9.1.zip

WordPress用のデータベースをphpMyAdminで作成。

WordPress用のnginx設定ファイルを追加。「server_name」はhostsファイルに記述するとかして名前解決できるようにしておく。

# vi /etc/nginx/conf.d/01_wordpress.conf

server {
    listen       80;
    server_name  wordpress.hoge.net;

    root    /opt/httpdocs/wordpress;
    index   index.php index.html index.htm;
    charset utf-8;
    client_max_body_size 20M;

    location = /robots.txt  { access_log off; log_not_found off; }
    location = /favicon.ico { access_log off; log_not_found off; }

    location ~* \.php$ {
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        fastcgi_intercept_errors on;
        include        fastcgi_params;
    }

    location ~ /\. {
        deny  all;
        access_log off;
        log_not_found off;
    }

    # if the file is not found, forwarded to index.php (permalinks)
    if (!-e $request_filename) {
        rewrite ^/(.*)$ /index.php?q=$1 last;
    }
}

# /etc/rc.d/init.d/nginx configtest
# /etc/rc.d/init.d/nginx reload

HTTP経由でアクセスしてインストール実行。

# chmod 777 wordpress/ wordpress/wp-content

http://wordpress.local/

# chmod 755 wordpress/ wordpress/wp-content

インストールした後にphpMyAdminでエクスポートして「utf8」を「utf8mb4」に置換してインポートする。

wp-config.phpを編集してutf8mb4にする。

# vi wordpress/wp-config.php

define('DB_CHARSET', 'utf8mb4');
define('DB_COLLATE', 'utf8mb4_unicode_ci');

 


7.REST API用にnode.jsをインストール

nodejs実行用のユーザーを追加。

# useradd node
# passwd node

nginxの実行ユーザーと同じグループ「www」にする。

# groupadd www
# usermod -G www node
# usermod -G www nginx

変更されたか確認

# groups node
# groups nginx

このグループでWordPressのwp-contentに書き込み出来るようにする。

# cd /opt/httpdocs/wordpress/
# chown nginx.www -R wp-content/uploads
# chmod 775 -R wp-content/uploads

sessionの書き込みディレクトリの権限(/etc/php-fpm.d/www.confに記述)

# chown nginx.www -R /var/lib/php/session/

※ YUMでPHPが更新されたときに権限が変更されるので、毎回権限を変更し直す必要がある。

 

php-fpmの設定変更

# vi /etc/php-fpm.d/www.conf

user = nginx
group = www

 

nginxの設定変更

# vi /etc/nginx/nginx.conf

user  nginx www;

 

再起動

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

権限周りはこれで完了。

次はnodeユーザーに切り替えてnode.jsをインストール。詳しくはnvm(Node Version Manager)を参考に。

# su - node
$ wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.7.0/install.sh | sh

ログインし直す。

# su - node
$ nvm ls-remote
$ nvm install v0.10.28
$ nvm alias default v0.10.28

とりあえずnode-devとnpmlistはインストールしておく。

$ npm install node-dev -g
$ npm install npmlist -g

 

< 2014/06/03 Modified >
「#su - node」したときに下記エラーが出る場合は
# yum install man
すると出なくなる。

-bash: manpath: command not found

 

 


8.REST API用にnginx設定ファイルを編集

スマホアプリからのアクセスはNode.jsで処理をするので、前の記事を参考にさっき作ったnginx設定ファイルにプロキシ設定を追記する。

# vi /etc/nginx/conf.d/01_wordpress.conf

server {
    listen       80;
    server_name  wordpress.hoge.net;

    root    /opt/httpdocs/wordpress;
    index   index.php index.html index.htm;
    charset utf-8;
    client_max_body_size 20M;

    location = /robots.txt  { access_log off; log_not_found off; }
    location = /favicon.ico { access_log off; log_not_found off; }

    location ~* \.php$ {
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        fastcgi_intercept_errors on;
        include        fastcgi_params;
    }

    location ~ /\. {
        deny  all;
        access_log off;
        log_not_found off;
    }

    ### Reverse Proxy for API
    location /api/1/ {
        rewrite ^/api/1/(.*)$ /$1 break;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_pass http://127.0.0.1:3000;
    }

    ### if the file is not found, forwarded to index.php (permalinks)
    set $rewrite_flg "false";
    if (!-e $request_filename) {
        set $rewrite_flg "true";
    }
    if ($uri ~ "^/api/") {
        set $rewrite_flg "false";
    }
    if ($rewrite_flg = "true") {
        rewrite ^/(.*)$ /index.php?q=$1 last;
    }
}

 

# /etc/rc.d/init.d/nginx configtest
# /etc/rc.d/init.d/nginx reload

 

Redisのインストールこちらの記事を参考に。

 

< Related Posts >

2014年5月19日月曜日

Mac上でJSHint + Gruntを使ってJavaScriptの文法チェック

grunt_jshintTitaniumの開発で、今まではTitanium Studioの画面にエラーがないか確認していた。しかしTitanium StudioはJSLintを使っているのでチェックが厳しい。

for文内のcontinueを許可したかったり、Warningを消す設定が面倒くさくなったので、Titanium Studioを使わずJSHint + Grountを使ってリアルタイムにファイル監視しながら開発してみることにした。

環境: Mac OS X 10.9.3, Titanium SDK 3.2.3.GA

基本はCentOS上にインストールしたときと一緒。

JSHintをインストール。
$ sudo npm install jshint -g

Gruntのコマンドラインツールをインストール。
$ sudo npm install grunt-cli -g

プロジェクトディレクトリに移動してGrunt本体とプラグインをインストール。
$ cd ~/Documents/Titanium_Studio_Workspace/project/
$ sudo npm install grunt
$ sudo npm install grunt-contrib-jshint
$ sudo npm install grunt-contrib-watch

grunt-contrib-jshintを試してみる。
$ vi Gruntfile.js

module.exports = function(grunt){
    // Load plugins
    grunt.loadNpmTasks("grunt-contrib-jshint");

    grunt.initConfig({
        jshint : {
            all : ['Resources/**/*.js']
        }
    });
};

実行
$ grunt jshint:all

オプションなど詳しくはgrunt-contrib-jshintのGitHubページで確認。

 

次はファイルを保存したタイミングで実行する処理を追記。
$ vi Gruntfile.js

module.exports = function(grunt){
    // Load plugins
    grunt.loadNpmTasks("grunt-contrib-jshint");
    grunt.loadNpmTasks("grunt-contrib-watch");

    grunt.initConfig({
        jshint : {
            all : ['Resources/**/*.js']
        },
        watch : {
            jshint : {
                files : ["Resources/**/*.js"],
                tasks : ["jshint:all"]
            }
        }
    });
};

監視開始。
$ grunt watch:jshint

 

"L"や"Ti"は.jshintrcを編集してGlobalとして登録する。詳しくは公式ドキュメントを参考に。

 

他のプロジェクトでも流用したいのでGruntfile.jsに記述することにした。Gistで公開しているので参考にどうぞ。

 

便利すぎる。もっと早くやっておくべきだった。

 

< Related Posts >

2014年5月16日金曜日

MacPortsからHomebrewに切り替えてSubversion 1.8をインストール

mac-mini_subversion-upgrade相変わらずMacの共有フォルダのファイルをWindowsのTortoiseSVNからコミット出来ない。せめてログだけは確認したいとMacのsvnを1.8にアップグレードしようとしたときの覚書。

環境: Mac OS X 10.9.2, TortoiseSVN 1.8.6

目次

  1. MacPortsを削除
  2. Homebrewをインストール
  3. Subversion 1.8をインストール

 

<2014/05/16 Modified>
Mac OS X 10.9.3にアップデートしてもみてもTortoseSVNからコミット出来なかった。

 


1.MacPortsを削除

以前Node.jsのためにMacPortsを利用したけど今は使ってない。MacPortsだと依存関係で苦労する印象なので、最近人気なHomebrewに移行することにした。

アンインストールは公式ドキュメントを参考に。

インストール済みのパッケージを削除する。

$ sudo port -fp uninstall installed

Error: No ports matched the given expression

何もインストールしてないのでエラーになったんだと思う。次は関連するファイルを全削除。

$ sudo rm -rf \
    /opt/local \
    /Applications/DarwinPorts \
    /Applications/MacPorts \
    /Library/LaunchDaemons/org.macports.* \
    /Library/Receipts/DarwinPorts*.pkg \
    /Library/Receipts/MacPorts*.pkg \
    /Library/StartupItems/DarwinPortsStartup \
    /Library/Tcl/darwinports1.0 \
    /Library/Tcl/macports1.0 \
    ~/.macports

 


2.Homebrewをインストール

公式ドキュメントを参考に。

$ ruby -e "$(curl -fsSL https://raw.github.com/Homebrew/homebrew/go/install)"

xcode-selectをインストール画面が起動した。それ以外は全自動で完了。

まずはdoctorするらしい。helpも確認。

$ brew doctor
$ brew help

 


3.Subversion 1.8をインストール

さてsubversionのバージョンを確認してインストール

$ brew info subversion
$ brew install subversion

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

念のため出力されたのを全部貼り付けておく。

==> Installing dependencies for subversion: readline, sqlite, openssl
==> Installing subversion dependency: readline
==> Downloading https://downloads.sf.net/project/machomebrew/Bottles/readline-6.3.5.mavericks.bottle.tar.gz
######################################################################## 100.0%
==> Pouring readline-6.3.5.mavericks.bottle.tar.gz
==> Caveats
This formula is keg-only, so it was not symlinked into /usr/local.

OS X provides the BSD libedit library, which shadows libreadline.
In order to prevent conflicts when programs look for libreadline we are
defaulting this GNU Readline installation to keg-only.

Generally there are no consequences of this for you. If you build your
own software and it requires this formula, you'll need to add to your
build variables:

    LDFLAGS:  -L/usr/local/opt/readline/lib
    CPPFLAGS: -I/usr/local/opt/readline/include

==> Summary
?コ  /usr/local/Cellar/readline/6.3.5: 40 files, 2.1M
==> Installing subversion dependency: sqlite
==> Downloading https://downloads.sf.net/project/machomebrew/Bottles/sqlite-3.8.4.3.mavericks.bottle.tar.gz
######################################################################## 100.0%
==> Pouring sqlite-3.8.4.3.mavericks.bottle.tar.gz
==> Caveats
This formula is keg-only, so it was not symlinked into /usr/local.

Mac OS X already provides this software and installing another version in
parallel can cause all kinds of trouble.

OS X provides an older sqlite3.

Generally there are no consequences of this for you. If you build your
own software and it requires this formula, you'll need to add to your
build variables:

    LDFLAGS:  -L/usr/local/opt/sqlite/lib
    CPPFLAGS: -I/usr/local/opt/sqlite/include

==> Summary
?コ  /usr/local/Cellar/sqlite/3.8.4.3: 9 files, 2.0M
==> Installing subversion dependency: openssl
==> Downloading https://downloads.sf.net/project/machomebrew/Bottles/openssl-1.0.1g.mavericks.bottle.tar.gz
######################################################################## 100.0%
==> Pouring openssl-1.0.1g.mavericks.bottle.tar.gz
==> Caveats
A CA file has been bootstrapped using certificates from the system
keychain. To add additional certificates, place .pem files in
  /usr/local/etc/openssl/certs

and run
  /usr/local/opt/openssl/bin/c_rehash

This formula is keg-only, so it was not symlinked into /usr/local.

Mac OS X already provides this software and installing another version in
parallel can cause all kinds of trouble.

The OpenSSL provided by OS X is too old for some software.

Generally there are no consequences of this for you. If you build your
own software and it requires this formula, you'll need to add to your
build variables:

    LDFLAGS:  -L/usr/local/opt/openssl/lib
    CPPFLAGS: -I/usr/local/opt/openssl/include

==> Summary
?コ  /usr/local/Cellar/openssl/1.0.1g: 429 files, 15M
==> Installing subversion
==> Downloading https://downloads.sf.net/project/machomebrew/Bottles/subversion-1.8.8.mavericks.bottle.1.tar.gz
######################################################################## 100.0%
==> Pouring subversion-1.8.8.mavericks.bottle.1.tar.gz
==> Caveats
svntools have been installed to:
  /usr/local/opt/subversion/libexec

Bash completion has been installed to:
  /usr/local/etc/bash_completion.d
==> Summary
?コ  /usr/local/Cellar/subversion/1.8.8: 116 files, 9.3M

 

パスを通して読み込む。MacPorts用の記述は削除。

$ ~/.profile

# Add path for Homebrew
export PATH=/usr/local/bin:$PATH

$ source ~/.profile

作業ディレクトリに移動して1.7から1.8にアップグレードする

$ svn upgrade

無事WindowsのTortoiseSVNからログを確認出来た。コミット以外はTortoiseSVNから出来そうなのでAddする手間が省けそう。

 

< Related Posts >

2014年5月14日水曜日

[Titanium] アイコン画像はフォントに変換した方がよさそう

icon_to_font下記記事を読んで、今作ろうとしているアプリはアイコンをフォントに変換して埋め込む方法を試してみることにした。

Titaniumで開発する場合は色、大きさ、iOS用、Android用で複数の画像を用意しないといけないので、これが1つになるのは開発も楽。

こちらの記事でも画像は全てbitmapで描画されるからメモリを圧迫すると書いてある。

ただ、どれだけのコストパフォーマンスがあるのかは未知数。あとで感想を追記予定。

記事の最後にあるアイコンへのリンクはとっても参考になった。

ちなみに私がよく使うライセンスフリーのアイコンを配布しているサイトはこちら。ライセンス上再配布できないので注意。

 

< 2014/06/02 Modified >
実際にやってみたときの記事を書いた。

 

< Related Posts >

2014年5月13日火曜日

[Titanium] メモリリークを起こさないために気をつけること

titanium_slipTitaniumでメモリリークを起こさないための良記事があった。

詳しくは読んでもらうとして、最後のおすすめガイドラインだけ翻訳。それぞれ自分の経験からコメントも書いてみた。

  • グローバル変数は使わない。グローバル変数はガベージコレクトされない。使うつもりなら考え直せ。
    → CommonJSモジュールのスタティックメンバーとして宣言する方法を使う。書き方はこちら
  • 変数を使うときは「var」宣言して使う。
    → 「use strict」を宣言するか。JSLintを使って常に監視する方法がお勧め。
  • 使い終わったオブジェクトは「null」をセットして開放する。
    → なるべくvar宣言したviewをaddしない書き方を心がける。
  • ビューの作成はインスタンス化して後で開放できるCommonJSモジュールでカプセル化する。もしくはAlloyを使う。
    → CommonJSモジュールで作っておけば開放するメソッド1つで管理できるから楽。・・・ということだと思う。
  • ビューやモデルをバインドしてるときは、使い終わったときに関連する繋がりを破壊する。
    → Alloyを使っているなら$.destoroy()を使う(Alloyを使った方がいいのかな。。。)
  • 後で開放するオブジェクトでない限りクロージャを使わない。
    → 記事内でfor文の中にクロージャを使ってaddEventListenerをバインドしているが、このような場合はどうすればいいのか?
    → starのカスタムプロパティにiをセットしてe.sourceでアクセスすればメモリリークは起きない?
  • グローバルなイベントリスナーは必ず1つだけバインドするように気をつける。
  • 他の言語で用いているテクニックをJavaScriptに持ち込まない。変数スコープ、var宣言の巻き上げ、prototype継承、クロージャを理解する。
  • グローバルな変数を利用するためにTitaniumプロキシ(Ti.*)を利用しない。
    → CommonJSモジュール内でスタティック宣言すればいい。

 

Titanium公式ドキュメントも参考に。

 

 

< Related Posts >

2014年5月9日金曜日

Androidアプリで表示できないJPEG画像がある

android-jpegteniteoのユーザーから問合せがあって調査したときの覚書。

 

<現象>

  • teniteoアプリでスナップ写真が表示できない。
  • 特定の写真のみ
  • いくら待っても画面に写真が表示されない。

環境:Android(バージョン不明、Titanium SDK 3.1.2.GAで作成)

 

この写真はPicasaアルバムからAPI経由で配信している。

実際手持ちのAndroid端末でも同様の現象が起きるのを確認。表示できない画像のURLをブラウザアプリで開いても同様に表示できない。

imageViewで表示する際には下記ログを吐いていた。

[DEBUG] skia: --- decoder->decode returned false
[DEBUG] skia: --- SkImageDecoder::Factory returned null

 

原因はCMYKのICCプロファイルが埋め込んであるため、Android標準の画像処理でエラーになるらしい。

確かに元画像を見るとPhotoshopで加工した形式があって、ファイル情報を見ると「Japan Color 2001 Coated」(日本の標準印刷用CMYKプロファイル)の記述があった。

image

運営しているのが紙媒体を作ってるデザイナーの人が多いのでこれはしょうがないか。。。

 

<考えた対応策>

  • 正しい形式でアップロードし直す
  • そんな画像でもエラーにならないTitaniumモジュールを作る
  • Picasa API経由で元画像より小さい画像を指定すると、CMYK情報が削除されたJPGを配信してくれるので、これを利用する
    → 大きいサイズの画像をアップロードする運用にしておけばよかったと後悔中

 

Titaniumモジュールを作る場合は下記を参考にすると出来る気がする。

 

元画像があるならアップロードし直すべき。

 

< Related Posts >

Related Posts Plugin for WordPress, Blogger...

Blog Archives