投稿

2014の投稿を表示しています

今年のTitanium向けに書いた記事まとめとアプリ紹介2014版

イメージ
Titanium Advent Calendar 2014の22日目。今年自分が書いた記事のTitaniumに関するまとめ。まず今年の革命的だった発見が2つ。1つ目がアイコンフォント。各デバイスごとに大きさの違う画像を切り出していたのがなくなった。色違いや大きさが違う場合もコードで指定するだけでいい。メモリ効率もいいらしい。SE奮闘記: [Titanium] fontcustomをインストールしてアイコンフォントを作成2つ目がthisとparentの存在。これで無駄にグローバル領域やクロージャ(無名関数)を使わない書き方が出来るようになった。入れ子にならないのでコードが読みやすい。SE奮闘記:【Titanium】thisとparentとchildrenを使った書き方そして、これらを発見する前だけど今年の初めに作ったアプリを紹介。teniteoというママ向けのSNSサービスのクライアントアプリ。本家のアプリ(Android, iOS)とは別に実験的なアプリ。ゲストでも閲覧できるのと学園のイメージを取り入れてみた。teniteo学園(Android版)teniteo学園(iPhone版)
技術的な特徴Titanium SDK 3.2.0.GA iPhone, Androidで同じ見た目。ソースコードは分けてない。必要なときだけif文で分岐している。 Alloyは使ってない ListViewをかなり頑張っている サーバーはNode.jsでWordPressのデータベースに接続こんなListView。コメントもListViewを使ってる。PCで投稿されたコメントの中に表示できないバグがある。。。本当はもっと美少女ゲームっぽくしたかった。自分のデザインセンスのなさを痛感(キャラクターはデザイナーさんにお願いした)。ゲストでも閲覧だけなら使えるので試したい方はどうぞ。サーバーでこのアプリ向けには3つのプロセスしか待ち受けしてないので遅く感じるかも。来年は今作っているのも含めていくつかサービスを公開予定。Titanium的にはSocket.IOと連携したリアルタイム性を重視したアプリを作りたい。では、みなさん良いお年を。明日のTitanium Advent Calendarはcoeさんです。< Related Posts >TitaniumとWordPrssで…

開発中のTitanium SDKをInstallして試す

イメージ
今起きている現象が開発バージョンで直っているかインストールして試してみたときの覚書。環境: Mac OS X 10.10.1, Xcode 6.1.1, Titanium SDK 3.4.1.GA最新のダウンロード先の一覧は下記から。Appcelerator Continuous Buildsこの時点で最新の3.5.0 BETAをダウンロードしてインストール。コマンドで全部やってくれる。$ ti sdk install http://builds.appcelerator.com/mobile/3.5.0/mobilesdk-3.5.0.Beta-osx.zip確認してSDKの切り替え
$ ti sdk
$ ti sdk select 3.5.0.Beta切り替えた後はビルドする前にクリーンするのを忘れずに。
$ ti clean< Related Posts >[Titanium Mobile] SDKをSourceからBuildしてみるMac環境にAndroid SDKをInstall for Titanium Studio

TitaniumとWordPressで(比較的)簡単SNSアプリ

イメージ
Titanium Advent Calendar 2014の15日目。Titanium + WordPress + Node.jsの環境がうまくいっているので紹介。書いてる途中で簡単か?と思い直し「比較的」付けた(笑慣れると
WordPressで公開している → アプリ作りましょうか?
まずはアプリでサービス提供 → Web版も提供
が短期間で出来るようになる。長くなったのでポイントだけ。WordPressを使う理由データベースの構造がシンプルで汎用性がある
標準でユーザー管理、投稿、コメントなどの基本機能が揃ってる
テーマやプラグインで本体に手を加えずに開発出来るのもいい
アクション・フィルターの機能がNode.jsからキックするのに便利
重い処理や非同期処理したい場合はWP-CRONの仕組みが便利
情報が豊富
初心者でもWordPressは触った人が多いので教えなくて済む。
→ アプリ側を上級者で開発して、Web側は他人に振れる。
PHPフレームワークと比べて遅いけど、最近は負荷分散する仕組みが豊富なので許容範囲になる。
→ アプリのリクエストはNode.jsで処理するのでWordPress(PHP)の遅さは関係なくなる
Titaniumを使う理由一つのコードでAndroid, iOS両対応出来るのが強い
ネイティブとまでいかなくてもサクサク動く
最悪ネイティブモジュールを作れば何とかなる
Node.jsと組み合わせときの開発効率がうまい(全部JavaScript)
Node.jsを使う理由アプリからは同時に大量のリクエストが来るのでPHPでは捌き切れない
→ データベースはMySQLではなくスレッドプールが使えるMariaDBにする
TitaniumもJavaScript。CommonJSの考え方を理解してTitanium側のコード品質も上がっていく。
→ Titaniumで作った汎用関数がそのままNode.jsで使える
ちなみにWordPressは外部にAPIを提供しているので、アプリから直接WordPressにリクエストを送るだけでも大抵のことが出来る。XML-RPC WordPress API | WordPress CodexNode.jsのモジュールの中にはWordPressのXML-RPC APIに接続するのもある。wordpress-rest-api私は最初アプリ向けのA…

【Titanium】Alloy vs Classic

イメージ
2年前にAlloyを試してみたけど、未だにClassicな書き方をしている私。そろそろAlloyも成熟してきたころだと思い調査したときの覚書。環境:Titanium SDK 3.3.0.GA私がクラシックな書き方をしている理由(言い訳)を考えてみた。Alloyも結局クラシックなコードに変換している。だったら最初からクラシックな書き方でいいと思うWEB開発で複数言語(PHP, HTML, CSS, JavaScript)から開放されたと思ったのに、やっぱりXMLとかCSSっぽいのを書かないといけないの?CommonJSの考え方でサーバー側(NodeJS)とクライアント側(Titanium)をJavaScriptで書いているのが気持ちいいAlloyにバグがあったら見つけるのも直すのも大変そう(まだAlloyを信用できない)クラシックだとひとつの画面はひとつのJavaScriptファイルで完結するので管理しやすい今作っているアプリはサーバーと連携するクライアントアプリ。ビジネスロジックは全部サーバー側にあるので、MVCでいうところのViewをTitaniumで開発している感覚。さらにMVCで開発するほど大規模なアプリは今のところない。自分の中で確立した書き方から脱却するのが億劫世間ではAlloyで開発するべきだという意見が一般的。Classic vs Alloy? | Community Questions & Answers | Appcelerator Developer Centerベストアンサーを日本語訳してみたAlloyは一般的な方法と統一したコードを提供する。これは他のAlloyプロジェクトの開発者や新規開発者が理解するのに容易。Alloyは便利で役に立つたくさんのレイアウトショートカットを提供しているので、より早く開発することが出来る。我々のセールスチームは70%のコードを削減できた。これはたぶんベストな例だけど、Alloyアプリでたくさんのコード削減できる。Alloyアプリは各プラットフォームに最適なコードと追加ツールを提供するのでクラシックなアプリよりも動作が速い。Alloyは横長のアプリを作ったり、テーマを作ったり、再利用するコンポーネントを作るのに便利。これらはクラシックコードだと別々なカスタムソリューションが必要となる。AlloyはMVC…

【Titanium】thisとparentとchildrenを使った書き方

イメージ
Titanium Advent Calendar 2014の8日目。最近多用しているthis, parent, childrenを使った書き方の紹介です。環境: Titanium SDK 3.3.0.GAAlloyは使ってません。これらを使うとループの中でクロージャ(無名関数)を作成する必要がなくなったり、「引数を使いまわしたいから無名関数でネストする」必要がなくなります。メモリ効率的にもいいような気がします(実際は分かりません)。例えばこんなコードがあったとします。/ui/common/testView.js// Expose API
exports.createView = createView;function createView(title) {
    var frameView, buttonView, i;    frameView = Ti.UI.createView({
        layout: 'vertical',
        height: Ti.UI.SIZE
    });    for (i = 0; i < 10; i++) {
        buttonView = Ti.UI.createButton({
            title: title + i
        });        (function() {
            var index = i;
            buttonView.addEventListener('click', function() {
                alert(index);
            });
        })();        frameView.add(buttonView);
    }    return frameView;
}
これを呼び出すapp.jsvar win = Ti.UI.createWindow({
    backgroundColor:'#ffffff'
});win.add(require('/ui/common/testView').createView('ボタン'));
win.open();これを実行すると10個のボタンを配置…

【Titanium】AndroidでMapモジュールが落ちる現象

イメージ
iOS, Androidアプリ開発で、TitaniumのMapモジュールで嵌ったときの覚書。環境: Titanium SDK 3.3.0 GA, Galaxy S2(Android 4.0.3)下記エラーが表示されてマップ表示からしばらくしてアプリ自体が落ちる。[DEBUG] REQUEST: Connection opened to:https://clients4.google.com/glm/mmap/api
[DEBUG] REQUEST: Open Connection
[DEBUG] REQUEST: DRD(65): 62|147
[DEBUG] REQUEST: Close
[DEBUG] REQUEST: Error processing: com.google.maps.api.android.lib6.b.d@416a5da8 not retrying
[DEBUG] REQUEST: Retrying: com.google.maps.api.android.lib6.c.au@418ecd60
[ERROR] REQUEST: ERROR
[ERROR] REQUEST: java.lang.ArrayIndexOutOfBoundsException: length=1; index=1
[ERROR] REQUEST:        at org.appcelerator.titanium.util.TiResponseCache.get(TiResponseCache.java:276)
[ERROR] REQUEST:
[ERROR] REQUEST:        at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:211)
[ERROR] REQUEST:        at libcore.net.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:80)
[ERROR] REQUEST:        at libcore.net.http.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:188)
[ERROR] REQUEST: …

TitaniumでWebSocketを使いたくてtiwsをビルドする

イメージ
WebSocketを使ったアプリのイメージが出来たので、Titaniumでtiwsというネイティブモジュールを自前ビルドしてみたときの覚書。環境:Mac OS X 10.9.4, Titanium SDK 3.3.0.GAMarketPlaceでも配布されているのでそこからダウンロードすればビルドは必要ない。今回はtiws自体が2年間更新がなく、何かあれば自分で対応するためにビルドしてみた。まずはGitHubからCloneする。$ cd ~/Documents/Titanium_Studio_Workspace/
$ git clone https://github.com/iamyellow/tiwsFork先でいくつか修正されているようなのでこちらを使うことにした。
$ git clone https://github.com/HilkoLantinga/tiwsiOS用をビルド環境変数を変更
$ cd tiws/ios/
$ vi titanium.xcconfigTITANIUM_SDK_VERSION = 3.3.0.GATITANIUM_SDK = /Users/daiki/Library/Application Support/Titanium/mobilesdk/osx/$(TITANIUM_SDK_VERSION)ビルド実行。
$ ./build.pyカレントディレクトリに「net.iamyellow.tiws-iphone-0.3.zip」が出来る。Android用をビルド前の記事を参考にまずは環境を作る。環境変数を編集。
$ cd ../android
$ vi build.propertiestitanium.platform=/Users/daiki/Library/Application Support/Titanium/mobilesdk/osx/3.3.0.GA/android
android.platform=/Applications/android-sdk-macosx/platforms/android-14
google.apis=/Applications/android-sdk-macosx/add-ons/addon-google_apis-google-14ビルド実行
$ antエラーBUILD FAILED
/Users/daiki/…

アプリ向けのサーバーAPIは「REST」 or 「WebSocket」?

イメージ
アプリとサーバー間のやりとりをREST APIかまたはWebSocketで実装するか迷ったときの覚書。よくまとまっているサイトWebSockets versus REST?(上記サイトの日本語訳)WebSockets vs. REST?今のところ「共存出来るんだから、それぞれの特性を理解して使い分けろ」に落ち着いている感じ。WebSocketでやりとりするメッセージにルール付けして、RESTを表現しようとする動きもある。SwaggerSocket Protocol · swagger-api/swaggersocket WikiNginxはWebSocketをリバースプロキシ出来るし、ロードバランサとしても動作する。NGINX as a WebSockets Proxy - NGINXExpressJSとSocket.IOでセッションを共有出来る。node.js - socket.io and express 4 sessions - Stack OverflowSocket.IOを利用すると名前空間(namespace)で機能分けして、部屋(room)でメッセージを送受信する範囲を制御できる。接続すると自動的に1つの(自分のIDが付いた)roomに参加するので、特定の人だけにメッセージを送信する場合はその人だけが参加しているroomに送信する。Socket.IO — Rooms and NamespacesSocket.IO v1.0からバイナリー送受信もサポートされて、ファイルの送受信も簡単に実装できる。Socket.IO — Introducing Socket.IO 1.0(上記サイトの日本語訳)Socket.IO 1.0の紹介 (翻訳) - from scratchPCを遠隔操作できるデモをPCやタブレットで複数開きながら操作すると感動する。クライアントアプリをTitaniumで実装する場合は、iOS/Androidに対応したモジュールがある。iamyellow/tiws | GitHubTi.Network.Socket.TCPを使うと上記のネイティブモジュールを使わなくても出来るみたい。【Titanium Advent Calendar 2011:五日目】Titanium Mobileでソケット通信 | @masuidrive blogmasuidr…

node-mysqlからnode-mariasqlに乗り換える

イメージ
NodeJSの開発にも慣れたことだし、そろそろMariaDBのスレッドプールに頼らずにnode-mysqlのpool機能を使って、DB接続を使いまわすようにしようと調べたときの覚書。環境: MariaDB Server 10.0.14, node-mysql 2.5.2, node-mariasql 0.1.21調査しているとnode-mysqlより速いnode-mariasqlを発見。node-mysqlの作者が速度改善に取り組んだ記事が面白い。felixge/faster-than-c | GitHub(上記記事の日本語版)C言語より高速なJavaScriptによるバイナリ操作が話題 | A-Listers速度比較ベンチマークNode.JS MySQL client library benchmarksただDB接続をpoolしたい場合は別モジュールと組み合わせて開発する必要がある。This is not issue, but just question... · Issue #43 · mscdex/node-mariasql今のところnode-mariasqlに乗り換えて、MariaDBのスレッドプールに頼ることにした。node-mysqlのpool機能を使って接続を使いまわすようにした方が結果的に速くなるかもしれない。試してみて気付いたこと。Node.js v0.11では動かない。v0.10では動く。 selectした行ごとにasync.mapで非同期処理している中でqueryを投げると「Already Closed」エラーになる。
→ res.on('end')の中でclient.close()を呼び出すと回避できた。確かに速い気がするが、いつでもnode-mysqlに置き換えられるように作っておいた方が良さそう。< 2015/04/09 Modified >
Apache Benchで試してみたところ速度的に大差ない。node-mariasqlで実行したとき数値のカラム(countした値など)も文字列で返ってくるので、やっぱりnode-mysqlで開発することにした。< Related Posts >複数サーバーでセッション管理するためにRedisからMariaDB Cluster(MySQL)に変更CentOS6…

複数サーバーでセッション管理するためにRedisからMariaDB Cluster(MySQL)に変更

イメージ
前の記事で複数サーバー構成にした。nginxの設定では「ip_hash」を使いIPアドレスをキーにした負荷分散にしたけど、モバイルアプリからのアクセスは頻繁にセッションが切れる現象に遭遇。環境: CentOS 6.6 x64, Node.js v0.11.14, MariaDB 10.0.14今までアプリのセッションは各サーバーごとにRedisで管理していた。セッション管理するサーバーを用意して各アプリサーバーが参照するようにすれば出来る。Redisでセッションを一元管理する場合のポイントbind(/etc/redis.conf)は制限せずにファイヤーウォールで制限する Redis Clusterもあるけど、まだ開発段階みたい。。。と調べたけど、このサービスはMariaDB Galera Clusterでクラスター構築したので、セッション管理もこっちを使うことにした。connect-mysqlを使えば解決。poolも使えるので便利。nlf/connect-mysql | GitHubconnect-mysql-sessionの方が人気みたいだけど、内部でseqelizeというO/Rマッパーを使っている。node-mysqlを使ってほしいので除外。MariaDB ClusterがサポートしているのはInnoDBかXtraDBストレージエンジンだけでMemoryは使えないので注意。< Related Posts >MariaDB Galera Clusterをインストールしてデータベースをクラスター化CentOS6 + nginx + PHP5.4 + MariaDB10 + WordPress + node.jsの環境を構築する手順をまとめRedisをInstallして、Node.js + RedisでSession管理

【Titanium】SQLiteのテーブル一覧を出力

イメージ
Titanium.Databaseを使ってテーブルを作成したあとに、確認のためにデータベースのテーブル一覧を出力したときの覚書。環境: Titanium SDK 3.3.0.GA公式ドキュメントを参考に。Working with a SQLite Database - Appcelerator Platform - Appcelerator DocsPragma statements supported by SQLiteEZ-NET: SQLite でテーブルのカラム構造を取得するSQLで取得するためには「sqlite_master」からSELECTすればいいらしい。データベース名を引数にして、構造をオブジェクトで返す関数を作った。/**
* Get Database Structure
*
* @api public
* @param {String} dbName Database Name
* @return {Object}
*/
function getStructure(dbName) {
    var db, rsTables, rsColumns;
    var sql, tables, tableName;    // Generate SQL
    sql = [];
    sql.push("SELECT name");
    sql.push("FROM sqlite_master");
    sql.push("WHERE type = 'table';");    // Excute
    db = Ti.Database.open(dbName);
    rsTables = db.execute(sql.join(' '));    // Loop in Table ResultSet
    tables = {};
    while (rsTables.isValidRow()) {
        tableName = rsTables.fieldByName('name');
        tables[tableName] = {};        // Get Columns ResultSet
        rsC…

Google Compute Engineにインスタンス作成してSSHでログイン

イメージ
開発用でGoogle Compute Engine上にCentOSインスタンスを作成してTera Termでログインするまでの覚書。環境: f1-micro, CentOS 6.5 x86_64目次Google Developers Consoleでプロジェクト作成 Google Compute Engine上でインスタンス作成 Tera Term(SSH)からrootでログイン 気付いたこと1.Google Developers Consoleでプロジェクト作成Google Developers Consoleにアクセスして「Create Project」する。2.Google Compute Engine上でインスタンス作成作成したプロジェクトを選択して、
Compute → Compute Engine
を選択すると初回はクレジットカードの登録が必要。住所と名前は日本語でも大丈夫だった。有効になると
Compute → Compute Engine → VM instances
から「New instances」を選んでインスタンスを作成する。MACHINE TYPEは料金に関係してくる。詳しくは公式サイトで。Google Compute Engine - クラウド コンピューティングと Infrastructure As A Service ー Google Cloud Platform「EXTERNAL IP」はEphemeral(一時IPアドレス)を選択しておけば追加料金はかからない。作成後は自動で起動される。一覧から選択して「SSH」を選択するとブラウザ版SSHが起動する。これでも十分操作可能。3.Tera Term(SSH)からrootでログインTeraTerm Menuから起動するため。詳しくは公式ドキュメントを参考にしながら。Google Developers Console - Google Compute Engine ー Google Cloud Platformまずは公開鍵と秘密鍵を作成する。この辺は前の記事を参考に。【CentOS】さくらVPSサーバーの初期設定作成した公開鍵を管理画面の「SSH Keys」から登録する。このとき最後にユーザー名を指定する。他のユーザー名を指定すると自動でユーザーが作成される。ssh-rsa AAAAB3…

PHPStormを64bitで動作+メモリ容量を増やして高速化

イメージ
コード補完候補が表示されるときに一瞬止まるのがイラッときたので調査。環境: Windows 8.1 x64, JDK 8u20, PHPStorm 8.0.2やってはみたものの日本語入力すると落ちるのでオススメしない。→ こちらの方が既に報告してくれている様子。Javaのバグらしい。バージョン9で直るらしいのでしばらく先になりそう。Windows 7、Java SE 8u20、NetBeans 8の組み合わせで落ちる - torutkの日記< 2015/03/24 Modified >
PHPStorm 8.0.3 + JDK 8u40で無事動作するのを確認。参考サイトSelecting the JDK version the IDE will run under : JetBrains SupportPhpStormのメモリ使用量を増やして高速化目次使用中のメモリ容量を表示 64bit版JDKをインストール 64bit版PHPStormを起動 最大使用メモリ容量を増やす1.使用中のメモリ容量を表示File → Settings → Appearance → Show memory indicator2.64bit版JDKをインストールHelp → Aboutで確認するとJRE 1.7.0 x86を使っているので最新の64bit版JDK 1.8をインストールすれば速くなるかなと思ってやってみた。JDKを公式サイトからダウンロード。JREでなくJDKと参考サイトに書いてあった。Java SE - Downloads | Oracle Technology Network | Oracle「jdk-8u20-windows-x64.exe」を実行してインストール。念のためマシン再起動。3.64bit版PHPStormを起動PHPStormのインストールディレクトリに移動して64bit版を起動。C:\Program Files (x86)\JetBrains\PhpStorm 8.0.2\bin\PhpStorm64.exeHelp → Aboutでさっきインストールした1.8を使っているか確認。4.最大使用メモリ容量を増やすPhpStorm64.exe.vmoptionsを編集する。エディタ(メモ帳など)を管理者として実行して下記のように変更。変更前-…

WordPressで$_SESSIONが使えない

イメージ
ページ遷移のログを簡易的に$_SESSIONに保存して使いまわそうとしたら動作しなかったので調査。環境: CentOS 6.5, nginx 1.6.2, php-fpm 5.4.33initにフックしてsession_startしても、各ページでsession_idするたびに新たに新しいIDになって引き継げない。function hoge_init() {
    if (!session_id()) {
        session_start();
    }
}
add_action('init', 'hoge_init');調べてみるとPHPの設定でsession.cookie_pathの設定が「/tmp」になってた。
# less /etc/php.inisession.cookie_path = /tmpcookie_pathはクッキーを保存するパス(URI)。一致したアクセスのみクッキーを使えるようになる。cookie_pathを直したら動いた。他のサーバーをみると「/」だったので、session.save_pathと勘違いして書き換えてたみたい。設定した覚えがないのでどっかのバージョンは/tmpに設定されるかも。ちなみにsession.save_pathの設定は/etc/php-fpm.d/www.confに記載してある。ちょっと深追いしてWordPressと_SESSIONの関係を調査。WordPressはグローバル変数として_SESSIONを扱っていない。Php session not working in wordpress page template - Stack OverflowGlobal Variables | WordPress Codexvar_dump($GLOBALS);
するとWordPressが生成したグローバル変数が出力される。ということで$_SESSIONを使うのはやめて、update_user_metaを使うことにした。< Related Posts >CentOS6 + nginx + PHP5.4 + MariaDB10 + WordPress + node.jsの環境を構築する手順をまとめ【PHP】セッションタイムアウトの時間を設定する

WordPressのWP_Cronを使って非同期処理

イメージ
WordPressに投稿するとアプリにプッシュ通知する仕組みを作っているときの覚書。環境: CentOS 6.5, WordPress 4.0.0Linuxのcronとかpthreadに頼らずにやってみた。WordPressにはwp_schedule_single_eventという登録したフックを一度だけ実行する関数がある。Function Reference/wp schedule single event | WordPress Codexソースをみると10分の間に同じリクエストがくると無視されるが、$argsが違えばスケジュールに登録される。同じ記事に対して何度もプッシュ通知が来てもウザいのでちょうどいい。コードサンプルは上の公式サイトを参考に。でも念のためLinuxのCronに10分ごとに/wp-cron.phpにリクエストを送る処理書いた。。。
# vi /etc/cron.d/wordpressMAILTO=""# Excute WordPress WP_Cron
*/10 * * * * root curl http://hoge.com/wp-cron.php > /dev/null 2>&1参考サイト:Better wp-cron using linux's crontab< Related Posts >【Titanium, Android】Notificationからアプリにデータを渡すTitaniumアプリでPush Notification【Android版】Titaniumアプリでプッシュ通知(Push Notification)【iOS版】

【Titanium】ビルドしたときにzipalignエラー

イメージ
ネットで拾った古いソースコードを古いSDKでビルドしたときに下記エラーに遭遇した。環境: Mac OS X 10.9.4, Titanium SDK 3.3.0.GA, Android SDK Tools 23.0.2[ERROR] Unable to find Android SDK tools: zipalign.
[ERROR] You have an incomplete or out-of-date installation.
[ERROR] Verify your Android SDK packages or reinstall the Android SDK by running 'titanium setup android' or manually downloading from http://appcelerator.com/android-sdk.下記サイトを参考にAndroid SDKにあるzipalignをコピーするUnable to find Android SDK tools: zipalign | Community Questions & Answers | Appcelerator Developer Center$ cd /Applications/android-sdk-macosx/
$ cp build-tools/19.1.0/zipalign tools/これでビルドは通った。元に戻すときは削除するだけ。
$ rm -rf tools/zipalign< Related Posts >Titaniumを使ったアプリと苦労した事とかのまとめ2013年Titanium CLIでAndroid向けにCompile(Build)と実機でDebug

MariaDB(MySQL)設定のチューニング

イメージ
5年前にも書いたけど、調べ直したときの覚書。環境: MariaDB 10.0.13参考サイトServer System Variables - MariaDB Knowledge BaseMySQL :: MySQL 5.5 Reference Manual :: 5.1.4 Server System VariablesDSAS開発者の部屋:5分でできる、MySQLのメモリ関係のチューニング!変数名デフォルト説明max_connections151最大同時接続数。
Node.jsから非同期で処理する場合は一気に増加するので多めに設定。thread_pool_sizeCPUの数同時実行するスレッドグループの数。
デフォルトのままでいい。
参考:Thread pool in MariaDB 5.5 - MariaDB Knowledge Basethread_cache_size0キャッシュするスレッドの数。
"pool-of-threads"の場合無視される。table_open_cache400全てのスレッドでオープンするテーブルの数。
多すぎても少なすぎてもダメらしい。
参考:Optimizing table_open_cache - MariaDB Knowledge Base
参考:MySQL :: MySQL 5.1 リファレンスマニュアル :: 6.4.8 MySQL でのテーブルのオープンとクローズの方法key_buffer_size134217728MyISAMのインデックスをキャッシュするメモリ容量。全てのスレッドで共通。
実メモリの25%が妥当らしい。
参考:Optimizing key_buffer_size - MariaDB Knowledge Basesort_buffer_size2Mソートするときにスレッドごとに使うメモリ容量。大きすぎるとメモリが足りなくなるので注意。read_rnd_buffer_size262144ソート後にレコードを読み込むときに使用するメモリ容量。これもスレッドごと。join_buffer_size128KBインデックスを使わないテーブル結合に使われるメモリ容量。read_buffer_size128KBスレッドごとのシーケンシャルスキャンに使うメモリ容量。
参考:第2回 一番の基本,シーケンシャルスキャン…

ロードバランサとしてHAProxyかNginxか

イメージ
ロードバランサにHAProxyとNginxで迷ったときの覚書。ベンチマークはHAProxyの方が速いみたい。architecture/elb-benchmark.wiki at master · eucalyptus/architecture | GitHubHAProxyは1.5からHTTPSもサポート。YUMのリポジトリにあるのは1.4が主流。http, httpsをロードバランスするだけならNginxの方がいいかな?Nginxでロードバランサするときは下記記事が参考になりそう。Nginx + WordPress ロードバランサー篇 | サーバーワークス エンジニアブログ< 2014/09/23 Modified >
Nginxの死活監視に不安があったけど、ちゃんと指定ポートに応答がなかったら別サーバーにリクエストを投げてくれた。< Related Posts >Nginxを設定してWordPressにリバースプロキシするMariaDB, MySQLの冗長化、負荷分散の構成を考える

MariaDB Galera Clusterをインストールしてデータベースをクラスター化

イメージ
新サービスのサーバー構成を考えているときの覚書。環境: CentOS 6.5 x86_64, MariaDB Galera Server 10.0.13前の記事も参考に。SE奮闘記: MariaDB, MySQLの冗長化, 負荷分散の構成を考えるサービス全体のサーバー構成。ロードバランサー02やWeb02がいればさらに安心できる。ちなみにMariaDB Galera Clusterの最小ノード数は「3」。今回はデータベースをクラスター化するまで。参考サイトMariaDB Galera Clusterを試す (1) | さくらインターネット研究所Galera - MariaDB Knowledge BaseCentOS 6.5 で MariaDB の Galera Replication Cluster を試す | CUBE SUGAR STORAGE目次YUM経由でインストール 起動と設定 2台目以降のノード設定 クラスターに参加1.YUM経由でインストール公式サイトを参考にYUMのリポジトリを追加する。MariaDB - Setting up MariaDB Repositories[web01]# 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インストール実行
[web01]# yum search MariaDB
[web01]# yum install MariaDB-Galera-serverepelリポジトリを使ったので、前の記事を参考に登録した方がいいかも。クラスター構成なので常に稼働する前提。メンテナンスで停止するときは手動で起動するため自動起動はしないようにしておく。
[web01]# chkconfig mysql off2.起動と設定公式ドキュメントに従う。Getting Started with MariaDB Galera Cluster - MariaDB Knowledge Base設定ファイルを編集
[web01]# vi /etc/my.cnf.d/s…

Nginxを設定してWordPressにリバースプロキシする

イメージ
フロントエンドにNginxのサーバーを立てて、バックエンドのWordPressにリバースプロキシする設定しているときの覚書。環境: CentOS 6.5, Nginx 1.2.6, WordPress 4.0システム構成は下図。ポイントは外部と通信するときはHTTPSで暗号化して、内部ではHTTPでやりとりする。参考サイトNginx https reverse proxy to WordPress with Apache, http and different port | cmanios以下「https://hoge.com/demo/」アクセスしたときにweb01のWordPressを表示する設定。SSLのバージョンに注意。nginx - httpsだからというだけで安全?調べたら怖くなってきたSSLの話!? - Qiitalv01のnginx設定server {
    listen 80;
    server_name hoge.com www.hoge.com;
    return 301 https://hoge.com$request_uri;
}server {
    listen       443 ssl;
    server_name  hoge.com;    root /home/httpd/httpdocs/;    #
    # SSL
    #
    ssl on;
    ssl_certificate      /etc/nginx/ssl.d/2014_hoge_cert.pem;
    ssl_certificate_key  /etc/nginx/ssl.d/2014_hoge_nopass_key.pem;
    ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers  ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS;
    ssl_prefer_server_ciphers   on;
    #
    # Header
    #
    proxy_set_header X-R…

Nginxの設定(Config)変数の値を確認する方法

イメージ
Nginxでリバースプロキシして、バックエンドにあるWordPressを表示するように設定をゴニョゴニョしているときの覚書。環境: Nginx 1.6.2php-fpmとの連携を記述するときに「$document_root」の値を確認したい。How to output variable in nginx log for debugging - Server Faultadd_headerする方法が一番簡単。
# vi /etc/nginx/conf.d/01.wordpress.conf#
# Demo
#
location /demo {
    root  /home/httpd/hoge/web-demo;
    try_files $uri $uri/ =404;add_header debug_nginx1 "$document_root";
add_header debug_nginx2 "$fastcgi_script_name";
}これでブラウザでアクセス。Google Chromeの開発ツールでは「Response Headers」に表示される。その設定が反映されたか確認するのに便利。< Related Posts >CentOS6 + nginx + PHP5.4 + MariaDB10 + WordPress + node.jsの環境を構築する手順をまとめNginx+PHP-FPMのTuning設定

【Titanium, Android】Notificationからアプリにデータを渡す

イメージ
新着プッシュ通知(Notification)をアプリ側に表示して、それを押したら新着記事を表示する方法を調査したときの覚書。Androidで嵌った。環境: Titanium SDK 3.3.0.GAプッシュ通知を受け取るまでは前の記事を参考に。Notificationをタップして発行するIntentにpushExtraでセットした値が取れない。試したこと。Windowの「focus」イベントで渡されたActivityを参照
Ti.Android.currentActivity.intent.getStringExtra(Ti.Android.EXTRA_TEXT) Windowの「focus」イベントで渡されたActivityを参照。引数のイベントオブジェクトから参照。
e.source.activity.intent.getStringExtra(Ti.Android.EXTRA_TEXT) 起動後にrequireされた別ファイルでゴニョゴニョしているときに参照。
Ti.Android.currentActivity.intent.getStringExtra(Ti.Android.EXTRA_TEXT)どれもダメ。どうやらIntentが渡されるActivityを勘違いしているみたい。そもそも今起動中のActivityは何?android - View the Task's activity stack - Stack Overflowこのサイトを参考に今起動中のActivityを表示。
$ cd /Applications/android-sdk-macosx/platform-tools/
$ ./adb shell dumpsys activity | grep -i run  Running activities (most recent first):
      Run #3: ActivityRecord{4216fae0 com.hoge.appdemo/org.appcelerator.titanium.TiActivity}
      Run #2: ActivityRecord{426a7da0 com.hoge.appdemo/.HogeAppActivity}
      Run #1: ActivityRecord{41c99bf0 c…

TitaniumアプリでPush Notification【Android版】

イメージ
前回はiOSについて調査。今回はAndroid端末にプッシュ通知する方法を調査したときの覚書。開発環境: Mac OS X 10.9.4, Titanium SDK 3.3.0.GA, Android 4.0.3
サーバー:CentOS 6.5参考サイトOverview | Google Cloud Messaging | Android DevelopersGoogle Cloud Messaging for Android (GCM)を使ってみた - azukinohirokiの日記Androidでのpush通知について | Don't Fall - Titanium Mobileユーザー会サポートBBS目次Google Cloud Messaging(GCM)を有効に GCMとの通信用モジュールを探す Titaniumモジュールをビルドする環境を整える Titaniumモジュールのビルド実行 アプリからモジュールを利用 サーバーからプッシュ通知テスト デバッグと検証してみた1.Google Cloud Messaging(GCM)を有効にiOSはApple Push Notification service(APNs)経由でプッシュ通知を送る。Androidの場合はGoogle Cloud Messaging(GCM)経由。GCMのAPI Keyを取得Google API Consoleにアクセス プロジェクトを作成。 プロジェクトの「Overview」を開くと左上に「Project Number」が表示されているのでこれをメモ。あとで「sender_id」としてアプリ側に記述する。 APIs & auth → APIsから「Google Cloud Messaging for Android」を有効に APIs & auth → Credentialsから「Server Key」を作成。2.GCMとの通信用モジュールを探すiOSみたいにネイティブにサポートしてないので、公開されているモジュールを利用する。liccowee/Google-Cloud-Messaging--Titanium- | GitHub「dist/com.activate.gcm-android-0.6.zip」をそのまま利用しても問題なかった。…

Titaniumモジュールをビルドする環境を整える

イメージ
このTitaniumモジュールをビルドする環境を作ったときの覚書。環境: Mac OS X 10.9.4, Titanium SDK 3.3.0.GA参考Android Module Development Guide | Titanium 3.X - Appcelerator DocsGoogleCloudMessaging - Google-Cloud-Messaging--Titanium- モジュールを作る - Qiita目次Android NDKをインストール Android SDK 2.3.3 (API 10)をインストール ビルドツールApache Antをインストール1.Android NDKをインストールTitaniumはNDK Revision 9をサポートしているらしいのでr9dをダウンロードする。
$ cd /Applications/
$ curl -O http://dl.google.com/android/ndk/android-ndk-r9d-darwin-x86_64.tar.bz2
$ tar jxvf android-ndk-r9d-darwin-x86_64.tar.bz2
$ rm android-ndk-r9d-darwin-x86_64.tar.bz2環境変数を定義
$ vi ~/.profile# Android NDK
export ANDROID_NDK=/Applications/android-ndk-r9d確認
$ source ~/.profile
$ echo $ANDROID_NDK;2.Android SDK 2.3.3 (API 10)をインストール必須らしいので、android-sdk-macos/tools/androidを実行してインストール。環境変数を定義してあるか確認。
vi ~/.profile# Android SDK
export ANDROID_SDK=/Applications/android-sdk-macosx確認
$ source ~/.profile
$ echo $ANDROID_SDK;環境が整ったか確認
$ titanium setupWhere do you want to go? k3.ビルドツールApache Antをインストール公式サイトからダウンロード。
$ curl -O …