投稿

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と連携したリアルタイム性を重視したアプリを作りたい。 では、みなさん良いお年を。明日のT

開発中の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 Codex Node.jsのモジュールの中にはWordP

【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は横長のアプリを作ったり、テーマを作ったり、再利用するコンポーネントを作るのに便利。これらはクラ

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

イメージ
Titanium Advent Calendar 2014 の8日目。最近多用しているthis, parent, childrenを使った書き方の紹介です。 環境: Titanium SDK 3.3.0.GA Alloyは使ってません。 これらを使うとループの中でクロージャ(無名関数)を作成する必要がなくなったり、「引数を使いまわしたいから無名関数でネストする」必要がなくなります。 メモリ効率的にもいいような気がします(実際は分かりません)。 例えばこんなコードがあったとします。 /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.js var win = Ti.UI.createWindow({     backgroundColor:'#ffffff' }); win.add(require('/ui/common/testView').creat

【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

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

イメージ
WebSocketを使ったアプリのイメージが出来たので、Titaniumでtiwsというネイティブモジュールを自前ビルドしてみたときの覚書。 環境:Mac OS X 10.9.4, Titanium SDK 3.3.0.GA MarketPlaceでも配布されているので そこからダウンロード すればビルドは必要ない。 今回はtiws自体が2年間更新がなく、何かあれば自分で対応するためにビルドしてみた。 まずはGitHubからCloneする。 $ cd ~/Documents/Titanium_Studio_Workspace/ $ git clone https://github.com/iamyellow/tiws Fork先 でいくつか修正されているようなのでこちらを使うことにした。 $ git clone https://github.com/HilkoLantinga/tiws   iOS用をビルド 環境変数を変更 $ cd tiws/ios/ $ vi titanium.xcconfig TITANIUM_SDK_VERSION = 3.3.0.GA TITANIUM_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.properties titanium.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-goo

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

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

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 Pos

複数サーバーでセッション管理するために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 | GitHub connect-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 Docs Pragma statements supported by SQLite EZ-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] = {}

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」

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 Support PhpStormのメモリ使用量を増やして高速化   目次 使用中のメモリ容量を表示 64bit版JDKをインストール 64bit版PHPStormを起動 最大使用メモリ容量を増やす   1.使用中のメモリ容量を表示 File → Settings → Appearance → Show memory indicator   2.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.exe Help → Aboutでさっきインストールした1.8を使っているか確認。  

WordPressで$_SESSIONが使えない

イメージ
ページ遷移のログを簡易的に$_SESSIONに保存して使いまわそうとしたら動作しなかったので調査。 環境: CentOS 6.5, nginx 1.6.2, php-fpm 5.4.33 initにフックして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.ini session.cookie_path = /tmp cookie_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 Overflow Global Variables | WordPress Codex var_dump($GLOBALS); するとWordPressが生成したグローバル変数が出力される。   ということで$_SESSIONを使うのはやめて、 update_user_meta を使うことにした。   < Related Posts > CentOS6 + nginx + PHP5.4 + MariaDB10 + WordPress + node.

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

イメージ
WordPressに投稿するとアプリにプッシュ通知する仕組みを作っているときの覚書。 環境: CentOS 6.5, WordPress 4.0.0 Linuxの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/wordpress MAILTO="" # 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 Base MySQL :: MySQL 5.5 Reference Manual :: 5.1.4 Server System Variables DSAS開発者の部屋:5分でできる、MySQLのメモリ関係のチューニング!   変数名 デフォルト 説明 max_connections 151 最大同時接続数。 Node.jsから非同期で処理する場合は一気に増加するので多めに設定。 thread_pool_size CPUの数 同時実行するスレッドグループの数。 デフォルトのままでいい。 参考: Thread pool in MariaDB 5.5 - MariaDB Knowledge Base thread_cache_size 0 キャッシュするスレッドの数。 "pool-of-threads"の場合無視される。 table_open_cache 400 全てのスレッドでオープンするテーブルの数。 多すぎても少なすぎてもダメらしい。 参考: Optimizing table_open_cache - MariaDB Knowledge Base 参考: MySQL :: MySQL 5.1 リファレンスマニュアル :: 6.4.8 MySQL でのテーブルのオープンとクローズの方法 key_buffer_size 134217728 MyISAMのインデックスをキャッシュするメモリ容量。全てのスレッドで共通。 実メモリの25%が妥当らしい。 参考: Optimizing key_buffer_size - MariaDB Knowledge Base sort_buffer_size 2M ソートするときにスレッドごとに使うメモリ容量。大きすぎるとメモリが足りなくなるので注意。 read_rnd_buffer_size 262144 ソート後にレコードを読み込むときに使用するメモリ容量。これもスレッドごと。 join_buffer_size 128KB インデック

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

イメージ
ロードバランサにHAProxyとNginxで迷ったときの覚書。 ベンチマークはHAProxyの方が速いみたい。 architecture/elb-benchmark.wiki at master · eucalyptus/architecture | GitHub HAProxyは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 Base CentOS 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-server epelリポジトリを使ったので、 前の記事 を参考に登録した方がいいかも。 クラスター構成なので常に稼働する前提。メンテナンスで停止するときは手動で起動するため自動起動はしないようにしておく。 [web01] # chkconfig mysql off     2.起動と設定 公式ドキュメントに従う。 Getting Started

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の話!? - Qiita lv01の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  

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

イメージ
Nginxでリバースプロキシして、バックエンドにあるWordPressを表示するように設定をゴニョゴニョしているときの覚書。 環境: Nginx 1.6.2 php-fpmとの連携を記述するときに「$document_root」の値を確認したい。 How to output variable in nginx log for debugging - Server Fault add_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}

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 Developers Google 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

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

イメージ
このTitaniumモジュール をビルドする環境を作ったときの覚書。 環境: Mac OS X 10.9.4, Titanium SDK 3.3.0.GA   参考 Android Module Development Guide | Titanium 3.X - Appcelerator Docs GoogleCloudMessaging - 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 setup Whe