2014年6月30日月曜日

球形ロボット「Sphero」で猫様満足度アップを狙う

sphero_cat面白そうなガジェットを見つけた。

 

APIが公開されているので、動きを制御したり情報を取得して表示するアプリが作れる。

 

勝手に動きまわってにゃんこたちの遊び相手になってくれたら何と素晴らしいことか!時間を作って制御するアプリを作りたい。

 

< Related Posts >

2014年6月27日金曜日

安くて汎用性のあるサーバーホスティング会社を探す

cloud_server今仕事で使っている専用サーバーの契約期限がもうすぐ切れるので、他のホスティング会社を調べたときの覚書。

現在使用しているのはGMOの専用サーバー

コストパフォーマンスはいいのだけれど、下記の件があってからネットワークが信用できなくなった。

  • 異様に名前解決が遅い時があった。→ いつの間にか直った。
  • gitコマンドを実行しようとしたら「github.com」へアクセスできず、サポートに問合せたら上位ネットワークでIP制限かけてた。

サポートの対応も、こちらが証拠を揃えないと動いてくれない。ネットワーク上でIP制限かけるのはいいけど(DOS攻撃対策とかもあるし)通知してほしいと言っても出来ないらしい。

私:「・・・ということは、御社のサービスを利用している限りは突然サーバーにアクセス出来なくなることがあるということですか?」

担当者:「そうなります。。。」

愚痴はここまで。

 

移行候補はこちら。

サービス コメント
AWS(Amazon Web Service) 従量制なので、いくら掛かるか見積もりが難しい。
Google Compute Engine(Google Cloud Platform) AWSと同じ従量制。面白そうなので本当はこれにしたかった。
さくらVPS 安くて安心できる感じがする。複数台借りてローカルネットワークを構築出来るのもいい。
カゴヤ・クラウド/VPS CPU12core / Memory4GB / HDD800GBが月額3456円
チューニングをしっかりすれば、これで十分な気がする。

さくらVPSで複数台+ローカルネットワークにして、MySQL Clusterで運用してみようかと考え中。

参考サイト

 

< Related Posts >

2014年6月26日木曜日

体重計とBluetoothで連携するアプリを作りたい

bluetooth_mobileスマフォと連携できる体重計があるか調査

AppleとGoogleがデベロッパーカンファレンスで健康管理のSDK, APIを強化すると発表したのでスマフォ+医療は何か出来そうな感じがする。

 

下記製品と連携するアプリは作れそう。

 

BluetoothのHDP (Health Device Profile)というプロファイルに対応している機器ならアプリとの連携もしやすい。

 

私自身は体重管理しても嬉しくないけど、我が家のにゃんことわんこ向けに健康管理アプリを作るのは楽しいかもしれない。

2014年6月20日金曜日

PhpStormエディタでPhalcon PHP開発向けの設定

phpstorm_phalconPhalcon PHPの開発をするときにPhpStormを設定したときの覚書。

クライアント環境: Windows 7 64bit, PhpStrom 8 EAP 138.567
サーバー環境: CentOS6.5, Nginx 1.6.0, PHP 5.4.29

 


1.自動補完出来るように

参考サイト

phalcon-devtoolsをダウンロード

適当な場所に解凍(C:\Users\daiki\PhpstormProjects\phalcon-devtools)

PhpStormのプロジェクトの「External Libraries」を右クリック → 「Configure PHP Include Paths...」 → Include path → Add

参照するフォルダを選択(C:\Users\daiki\PhpstormProjects\phalcon-devtools\ide\1.3.2)

 


2.voltテンプレートを認識出来るように

デフォルトで用意されているTwigとして登録する。

Settings → File Types → Twigを選択 → 「*.volt」を追加

 


3.リモートデバッグ出来るように

参考サイト

まずはサーバー側にXdebugをインストール。yum経由は要remiリポジトリ。

# yum install php-pecl-xdebug

公式サイトのドキュメントを見ながら設定。

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

; Enable xdebug extension module
zend_extension=/usr/lib64/php/modules/xdebug.so

; see http://xdebug.org/docs/all_settings

xdebug.remote_enable=1
xdebug.remote_port=9001
xdebug.remote_autostart=1
xdebug.remote_connect_back=1

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

DBGp用にファイアウォールを設定は必要ないみたい。

ちなみに空いているポートの確認は
# nmap localhost
が見やすい。nmapがインストールされてない環境では
# netstat -l
でも分かる。

今度はPhpStorm側の設定。

Settings → PHP → DebugのXdebug - Debug port:を9001にする。

Settings→ PHP → SeversにデバッグするURLを指定して、ローカル側のパスとサーバー側の絶対パスを結びつける。

image

これで右上にある受話器マークをクリックすれば、リモートデバッグ開始。

image

例えば/public/index.phpの適当な場所にブレークポイントをつけてブラウザで表示させれば止まるはず。

今までvar_dumpや外部ファイルにログを出力してデバッグしてたけど、人が書いたプログラムを解析するのにリモートデバッグ便利だね。

 

< Related Posts >

2014年6月19日木曜日

TitaniumのAPIDocをコンパイルしてPhpStormのコード補完機能に追加

titanium_phpstormTitaniumの開発用エディタとしてPhpStormを利用したときの覚書。

環境: Titanium SDK 3.2.3.GA, PhpStorm 8.0 EAP 138.567

 


< 2015/06/26 Modified >
外部ライブラリを読み込んで少し設定すれば十分快適に開発できるようになってた。

  • JavaScript → Libraries → Downloadで「titanium」を追加。「Node.js Globals」も追加
  • なぜか「Node.js v0.12.5 Core Modules」を追加しないとLが「unresolved」になる
  • Directoriesで「Resources」ディレクトリを「Resource roots」に設定。requireを相対パスで記述すれば、「Cannot resolve directory」は解決できる。

 

下記を参考にしたけど、jsca2jsに置いてあるTitaniumのバージョンが古いのと、提供されているコマンドも3.2.3.GAで動かなかったので、最新のAPIドキュメントをコンパイルしてみた。

最新のAPIドキュメントをダウンロードして、json形式でコンパイル。
参考: Titanium Mobileのapidocのビルド | Selfkleptomaniac

$ git clone https://github.com/appcelerator/titanium_mobile.git
$ cd titanium_mobile
$ sudo easy_install pyyaml
$ sudo easy_install markdown
$ sudo easy_install mako
$ sudo easy_install Pygments
$ cd apidoc
$ ./docgen.py --format=json

TiAutocompleteを利用して変換する。

$ cd ../../
$ git clone https://github.com/netpro2k/TiAutocomplete
$ cp titanium_mobile/dist/apidoc/api.json TiAutocomplete/
$ cd TiAutocomplete/
$ node tiDocs.js > titanium.js

titanium.jsを好きなところに置いて、PhpStormの「File -> Settings -> JavaScript -> Libraries」からAddすれば補完されるようになる。

image

 

Settins -> Pluginsから「NodeJS」をインストールすると、Settings -> JavaScript -> Librariesに「Node.js Globals」が表示されるので有効にするとrequire, exportsなどが認識されるようになる。

それでもいろいろWarningが出るので、全部消そうと思ったら大変。

そして、今まで使ってたxyzzyに一旦戻ったら快適すぎてPhpStormに戻れない。PhpStormがTitaniumの開発に対応するまでは待つと思う。

 

< Related Posts >

2014年6月18日水曜日

CentOS6 + Nginx + Phalcon PHP + MongoDBの環境構築手順

phalcon-phpPhalcon PHP Frameworkの環境を構築したときの覚書。

環境: CentOS 6.5 x86_64, nginx 1.6.0, php 5.4.29, mongodb 2.6.1-2

PhalconはPHPのエクステンションとしてC言語で実装されたMVCフレームワーク。特徴は何と言っても速さ。

最近はWordPressをベースにすることが多いけどシステム系のサイトを構築するのにいい選択肢になりそう。

 


1.Phalcon PHPをインストール

公式サイトを参考に。

# yum install gcc make php-devel git
# git clone git://github.com/phalcon/cphalcon.git
# cd cphalcon/build
# ./install

Installing shared extensions:     /usr/lib64/php/modules/

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

extension=phalcon.so

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

確認
# php --info | grep Phalcon

 


2.Phalcon Developer Toolsをインストール

Phalconの開発ツール群。公式サイトを参考に。

# cd
# git clone https://github.com/phalcon/phalcon-devtools.git
# cd phalcon-devtools/
# ./phalcon.sh

シンボリックリンクを作成
# ln -s phalcon.php /usr/bin/phalcon
# ldconfig

 


3.nginxの設定

これも公式ドキュメントが十分詳しい。

# vi /etc/nginx/conf.d/hoge.conf

server {
    listen       80;
    server_name  dev.hoge.jp;

    index index.php index.html index.htm;
    set $root_path '/home/httpd/hoge/web/public';
    root $root_path;

    try_files $uri $uri/ @rewrite;

    charset utf-8;
    client_max_body_size 2M;

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

    location @rewrite {
        rewrite ^/(.*)$ /index.php?_url=/$1;
    }

    location ~ \.php {
        #try_files $uri =404;
        #fastcgi_pass unix:/run/php-fpm/php-fpm.sock;
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index /index.php;
        fastcgi_buffer_size 32k;
        fastcgi_buffers 4 32k;

        include /etc/nginx/fastcgi_params;

        fastcgi_split_path_info       ^(.+\.php)(/.+)$;
        fastcgi_param PATH_INFO       $fastcgi_path_info;
        fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }

    location ~* ^/(css|img|js|flv|swf|download)/(.+)$ {
        root $root_path;
    }

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

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

 


4.MongoDBのインストール

YUM経由で更新できるように公式リポジトリを追加。

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

[mongodb]
name=MongoDB Repository
baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64/
gpgcheck=0
enabled=1

# yum update
# yum install mongodb-org

起動して、自動起動するように登録。
# /etc/rc.d/init.d/mongod start
# chkconfig mongod on

PHP用のドライバをインストール。remiリポジトリが使われた。
# yum install php-pecl-mongo
# /etc/rc.d/init.d/php-fpm restart

 


5.MongoDBのphpMyAdmin的「RockMongo」をインストール、設定

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

# cd /opt/httpdocs/
# unzip rockmongo-1.1.7.zip
# rm rockmongo-1.1.7.zip
# mv rockmongo-1.1.7 rockmongo

公開されているところに設定したのでnginxの設定は省略。本番環境はBasic認証などを推奨。

http://netbios-name/rockmongo

初期パスワードはadmin/admin

 


6.開発する上での諸情報

コーディング規約

サンプルなどは公式ドキュメントが充実している。

 

< Related Posts >

2014年6月17日火曜日

xyzzyからPhpStormに乗り換え。設定メモ

xyzzy_phpstorm今までxyzzyを使ってきたけれど、他人が書いたPHPコードを読むのにさすがに限界を感じて評判のいいPhpStormを試してみた。

環境: Windows 7 64bit, PhpStorm 8.0 EAP 138.567, TortoiseSVN 1.8.7

PhpStormにしようと思った理由

 


1.PhpStorm 8 EAPをインストール

WordPressの機能を試したかったのでEAP(Early Access Program)バージョンを公式サイトからダウンロードしてインストール。30日間の試用ライセンスが含まれているらしい。

 


2.Subversionとの連携

TortoiseSVNをインストールする際に「command line client tools」を選択しておく。binフォルダにsvn.exeがインストールされる(環境変数Pathにも追記される)。

Settings → Version Control → Subversionの「Use command line client:」でsvnと入力(Pathに追記されているから)。

PhpStormをインストールする前に設定しておけば自動で補完される。

 


3.外観設定

初回起動時に選択するテーマは「Darcula」を選択。

Settings -> Colors & Fontsから「Save As...」をクリックしてコピー。下記を変更

  • Primary font: Consolas
  • Size: 14
  • Line Spacing: 1.1

その他

  • 行番号を表示(Show line numbers)
    Settings -> Editor -> Appearance
  • スペースを表示(Show whitespaces)
    Settings -> Editor -> Appearance
  • 編集中マークを表示(Mark modified tabs with asterisk)
    Settings -> Editor -> Editor Tabs
  • タブは一行で(Show tabs in single row)
    Settings -> Editor -> Editor Tabs

 


4.キーバインドの変更

「Default」からコピー。完全に自分用。

カーソルの移動はEmacs風にしたい。

Name Old Keymap New Keymap Remove Bind
Right   Ctrl + F Find...
Find Ctrl + F Alt + S  
Left   Ctrl + B Declaration
Declaration Ctrl + B Alt + B  
Up   Ctrl + P Parameter Info
Parameter Info Ctrl + P Alt + P  
Down   Ctrl + N Class...
New Folder...
Class... Ctrl + N Alt + N  
Cut up to Line End   Ctrl + K Check In Project
Escape   Ctrl + G  
Line... Ctrl + G Alt + G  
Delete   Ctrl + D Compare Directories
Compare Two Files
Send EOF
Backspace   Ctrl + H Type Hierarchy
Type Hierarchy Ctrl + H Alt + H  
Move Caret to Line End   Ctrl + E Recent Files
Commit Message History
Recent Files Ctrl + E Alt + E  
Recent Files   F2 Next Highlightted Error
Last Edit Location   Shift + F2 Previous Highlightted Error
Move Caret to Line Start   Ctrl + A Select ALL
Select ALL Ctrl + A Alt + A  
Split Line   Ctrl + O Override Methods
Override Methods.. Ctrl + O Alt + O  
       
Split Vertically   Ctrl + Numpad-5  
Split Horizontally   Ctrl + Numpad-2  
Unsplit   Ctrl + Numpad-1  
Unsplit All   Ctrl + Numpad-0  
       
Emacs Tab   Tab Tab
Toggle Full Screen Mode   Ctrl + Numpad-9  
       
Next Highlightted Error   F10  
Stop Ctrl + F2 Ctrl + F10  

 


5.便利機能

よく使いそうな便利機能。Shift2回で全体検索できるのが使いやすい。

Shift2回 → 「keymap」でデフォルトを確認したり、Ctrl + Shift + AでAction名で検索出来る。

Name Keymap Comment
Declation Ctrl + B 定義元にジャンプ
Alt + Bに変えた。
Paste from History... Ctrl + Shift + V コピーした履歴ダイアログを表示
Extend Selection Ctrl + W カーソルがある単語を選択
Reformat Code Ctrl + Alt + L 自動整形。ファイル単位やディレクトリ単位で指定可能。

 


6.プロジェクト初期作成時の確認事項

Windowsで開発しているとデフォルトの設定を変えないといけない

  • Code Style → Line Separator(for new files)を「Unix and OS X(\n)」に
  • File Encodings → Project Encodingを「UTF-8」に

 

また追記予定。

 

< Related Posts >

2014年6月13日金曜日

[Titanium][Android] 端末のGPS機能で現在位置を取得する

android_gps_location定期的に現在位置を取得する方法を調査したときの覚書。

環境: Titanium SDK 3.2.3.GA, Android

GPSの有効・無効の判定など、KitchenSinkを見るのが分かりやすい。

下記のサンプルコードも参考になった。

 

私が書いたgeolocation.jsはこんな感じ(一部)

var U = require('/lib/utils');
var _gpsProvider;

exports.init = init;
exports.release = release;

/**
* Initialization
*
* @api public
*/
function init() {
    if (!U.isAndroid()) {
        return;
    }

    //
    // "preferredProvider" is deprecated.
    // @see http://docs.appcelerator.com/titanium/3.0/#!/api/Titanium.Geolocation.Android
    //

    //Ti.Geolocation.preferredProvider = 'gps';
    //Ti.Geolocation.accuracy = Ti.Geolocation.ACCURACY_HIGH;
    //Ti.Geolocation.distanceFilter = 10;

    _gpsProvider = Ti.Geolocation.Android.createLocationProvider({
        name: Ti.Geolocation.PROVIDER_GPS,
        minUpdateTime: 30, // seconds
        minUpdateDistance: 100 // meters
    });

    Ti.Geolocation.Android.addLocationProvider(_gpsProvider);
    Ti.Geolocation.Android.manualMode = true;

    // Bind Event
    Ti.Geolocation.addEventListener('location', handleLocation);
}


/**
* Release
*
* @api public
*/
function release() {
    if (_gpsProvider) {
        Ti.Geolocation.Android.removeLocationProvider(_gpsProvider);
        Ti.Geolocation.removeEventListener('location', handleLocation);
    }
    _gpsProvider = null;
}

 

GPSが無効のときは設定画面を開きたい。

ただKitchenSinkで試すと分かるけど、getCurrentPositionは「位置情報サービス」が有効だとGPSが無効でも正常に動作する。

GPSが有効かどうかは
Ti.Geolocation.addEventListener('location', handleLocation)
の結果を見て判断するしかない。モジュールを作れば別。

サンプルコード

/**
* Show Setting App
*
* @api public
* @param {String} text
*/
function showLocationSetting(text) {
    var dialog;

    dialog = Ti.UI.createAlertDialog({
        message: text || L('w_gps_off'),
        buttonNames: [L('cancel'),L('settings')],
        cancel: 0
    });

    // Add click event.
    dialog.addEventListener('click', function(e) {
        if (!U.isAndroid() || e.cancel === e.index || e.cancel === true) {
            return false;
        }
        Ti.Android.currentActivity.startActivity(Ti.Android.createIntent({
            action: 'android.settings.LOCATION_SOURCE_SETTINGS'
        }));
    });

    // Show
    dialog.show();
}

 

 

位置情報を収集している間はServiceを起動 + Notificationに表示して分かりやすくしてみた。

 

< Related Posts >

2014年6月12日木曜日

[Titanium][Android] 定期実行するServiceを起動してNotificationに表示

titanium_android_serviceバックグラウンドで定期的に動作するServiceを実装したときの覚書。

環境: Titanium SDK 3.2.3.GA, Android

参考サイト

サンプルコードは上記サイトを参考に。

サービスが起動しているかどうかのチェックは次のようにする。

if (Ti.Android.isServiceRunning(Ti.Android.createServiceIntent({url: 'testservice.js'}))) {
    console.log('Service IS running');
}

この辺はKitchenSinkのコードを見るとわかりやすい。

 

サービス起動中はNotificationの「進行中」に出しておきたい。

上記を参考に下記関数をserviceのstart, stopイベントにバインドする。

_service.addEventListener('start', handleStartService);
_service.addEventListener('stop', handleStopService);

function handleStartService(){
    var pending, notification;

    // Intent for Click Notification
    pending = Ti.Android.createPendingIntent({
        intent: Ti.Android.createIntent({
            flags: Ti.Android.FLAG_ACTIVITY_BROUGHT_TO_FRONT,
            className: 'com.hoge.gps.HogeGpsActivity'
        }),
        flags: Ti.Android.FLAG_UPDATE_CURRENT
    });

    // Create Notification
    notification = Ti.Android.createNotification({
        contentIntent: pending,
        icon: '/images/notification.png',
        contentTitle: L('service_notice_title'),
        contentText: L('service_notice_text'),
        flags: Titanium.Android.FLAG_ONGOING_EVENT | Titanium.Android.FLAG_NO_CLEAR
    });

    // Show
    Ti.Android.NotificationManager.notify(1, notification);
}

function handleStopService(){
    Ti.Android.NotificationManager.cancel(1);
}

classNameに指定するActivityの名前はbuild/android/AndroidManifest.xmlを見て確認する。

Notificationのアイコンサイズは24x24dp。詳しくは公式サイトで。

 

< Related Posts >

2014年6月4日水曜日

iOSをDistributeするときにIDFAエラーで先に進めない

ios_distribute_warning_idfaいつものようにTitaniumで作成したアプリを公開しようとしたらValidationするときに下記エラーになった。

Improper Advertiseing Identifier [IDFA] Usage. Your app contains the Advertising Identifier [IDFA] API but you have not indicated its usage on the Prepare for Upload page in iTunes Connect.

このエラーは新しいバージョンを追加するときに表示される質問

Does this app use the Advertising Identifier (IDFA)?

に「No」と答えると「IDFA」のチェックが走るらしい。

でも、アプリ内で広告は表示してない。

Titaniumで作成したアプリで、もしかしたらFacebookモジュールで使っているのかな?

ただIDFAの質問に対する回答を変更したくても出来ない。

新しく追加したバージョンも「Waiting for Upload」のまま削除できない。

とりあえずiTunes ConnectのContact Usから質問を送信(5月20日付)。

どうなるか。

 

< 2014/06/04 Modified >
Facebook Moduleを使っているのが原因みたい。

 

< 2014/06/19 Modified >
約1ヶ月待っても返事がないので、tiapp.xmlのfacebookモジュールの部分を削除して再Validation + Submit

<module platform="iphone">facebook</module>

無事完了したらiTunes ConnectのView Detail → Binay Details → Reject This Binaryをすると、再度「Ready to Upload Binary」が出来るようになり、IDFAの項目を選択出来るようになる。

けど、広告を表示しているわけではないので選択肢を選べない。

Githubでパッチ済みのモジュールが公開されているので、これを使えば出来るかもしれない。

もうすぐ3.3.0がリリースされるのでそれまで待つことにした。

 

< 2014/07/23 Modified >
3.3.0.GAがリリースされた。けど抜本的な解決とはならないみたい。結局、アプリ申請時にIDFAのチェックをする必要がある。

 

 

< Related Posts >

2014年6月2日月曜日

[Titanium] fontcustomをインストールしてアイコンフォントを作成

icon_convert_to_fontアプリを作成する際にアイコン画像はフォントに変換した方がよさそうなので実際にやってみたときの覚書。

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

前の記事の参考サイトではIconMoon AppというWebサービスを使っていたけど、Font Customというコマンドラインから利用できるソフトがあったのでこちらを利用することにした。

まずはFontForgeのインストール。Homebrewは既にインストール済み。

$ brew install fontforge ttfautohint

エラー

cairo: Unsatisfied dependency: XQuartz
Homebrew does not package XQuartz. Installers may be found at:
  https://xquartz.macosforge.org
Error: An unsatisfied requirement failed this build.

リンク先からXQuartz-2.7.6.dmgをダウンロード・インストール。

再トライ
$ brew install fontforge ttfautohint

無事完了。次はfontcustomをインストール。

$ sudo gem install fontcustom

Documents/fonts/svg/にsvgファイルを置いて試してみる。

$ cd Documents/fonts/
$ fontcustom compile svg/

fontcustomフォルダに出力された。fontcustom-preview.htmlをGoogle Chromeで開くと確認出来る。

Titanium公式サイトによると「fontFamily」で指定する値は環境によって違うらしい。iOSは「PostScript name」。Androidはファイル名。

なのでフォント名を指定して出力。

$ fontcustom compile svg/ -f 'icons'


< 2015/06/24 Modified >
fontcustomを1.3.8にアップデートしたらオプションが変更になってた。
$ fontcustom compile svg/ --name=icons --output=icons

viewBoxの値がマイナスになってズレてしまう現象はillustratorでObject → Compound Path → Makeしておいて、新規作成して保存すれば直った。

Adobe Illustrator 19.0.0

image


TitaniumプロジェクトのResources/fontsディレクトリにコピー。SDK 3.2から自動で読み込んでくれるらしい。

$ cp icons/icons_556e7f14dfa764ce14b970af6e496f5d.ttf ../Titanium_Studio_Workspace/hoge_project/Resources/fonts/icons.ttf

ソースに書いてみる。

Ti.UI.createLabel({
    text: '\uf100',
    color: '#f00',
    font: {
        fontSize: 20,
        fontFamily: 'icons'
    }
}

ビルドする。一旦Cleanしないと読み込んでくれなかった。
$ titanium clean
$ titanium build --platform ios --log-level debug --target simulator --retina

createLabelのtextプロパティはpreview.htmlを見ながら次のようにする。

&#xf100; → \uf100

これが分からずしばらく嵌ってた。

実装するときはCommonJSモジュール化して名前を与えるようにした方がよさそう。

それとResources/fontsにttf以外のファイルを置くと原因不明のエラーで起動できないので注意(Androidのみ)。

これでも少し嵌った。

フォントにしておくと大きさや色を調整しながら開発できるし、デバイスごとに画像を用意しなくて済むのでとっても便利!

 

< Related Posts >

Related Posts Plugin for WordPress, Blogger...

Blog Archives