投稿

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

MacをMavericksにしたらTortoiseSVNのコミットが失敗する

イメージ
TitaniumもMavericksをサポートするようになったので、開発サーバーになっているMac miniをMavericksにアップグレードしてみたときの覚書。 環境: OS X Mavericks 10.9.1, Windows 8.1, TortoiseSVN 10.8.4 WindowsからMacの共有フォルダにあるソースをTortoiseSVNでコミットしようとすると下記エラー Error: Commit failed (details follow):  Error: Can't move  Error:  '\\hoge\hogehoge\.svn\tmp\svn-CF8BDE60'  Error:  to  Error:  '\\hoge\hogehoge\.svn\pristine\3a\3abd0eabfa1e58f83cfcce2403a3dc22dcb7ad79.svn-base':  Error:  パラメーターが間違っています。    Macのログには下記エラー $ less /var/log/system.log Dec 25 11:21:11 local smbd[184]: File system does not support 0X0, size attrs Dec 25 11:21:11 local smbd[184]: File system does not support 0X40000, file attrs Dec 25 11:21:11 local smbd[184]: File system does not support 0X0 time attrs   フォーラムにも上がっていてまだ直ってないらしい。 Server File Sharing unstable on mac and...: Apple Support Communities SMB1のみに切り替えると出来るという情報があるが私の環境では成功しなかった。 しょうがないので、しばらくはSSH経由でsvn commitすることにした(一度別フォルダに退避して、svn checkoutしてから上書きする)。 MacのSubversionを1.8に挙げないとTortoiseSVN

Node.js + Expressの環境でファイルをアップロードする処理

イメージ
Titaniumで開発しているアプリからファイルをアップロードして保存する処理を開発していたときの覚書。 環境:node.js v0.10.22, express v3.4.6, busboy v0.0.12 よく見かけるのは app.use(express.bodyParser()); としてreq.filesを参照する方法。しかし、これを記述すると下記エラーをnodejsが出力する。 connect.multipart() will be removed in connect 3.0 visit https://github.com/senchalabs/connect/wiki/Connect-3.0 for alternatives connect.limit() will be removed in connect 3.0 リンク先を見ると、ディスクにファイルを保存するのはセキュリティ上の問題から非推奨となり、他のパーサーを使えとある。 multiparty と busboy を試した結果、難易度は上がるけど busboy を使ってストリーム形式で処理することにした。 理由は busboyはアップロードするファイルサイズを制限できる から。 ちなみにmultipartyはTitaniumからアップロードしたcontent-typeに対応してない(multiparty3.1.0で確認)。 こちらのissue#29 にあるように正規表現を直せば対応可能。 サンプルコードは GitHubのReadme と test を見れば何となく分かると思う。   実際に使ってみた注意点をいくつか(※v0.0.12) アップロードしたファイル名が日本語だとfilenameが化ける。 issue#20 に上がってる → filenameを使わない実装を推奨 → ちなみにmultipartyは大丈夫 → v0.0.13で修正されたらしい。試してない。  busboy.on('file')の中でfileに対して操作をしないとbusboy.on('end')が発生しない。 このissue#16 で説明してる。 ファイルサイズの制限に引っかかったら「limit」イベントが発生するので、書き込み中のファイルは自前で削除

node.jsでImageMagick + gmをインストールして画像処理

イメージ
Node.jsで画像処理(Resize, Crop)をする方法を調べたときの覚書。 環境: CentOS 5.10, node.js v0.10.21 GraphicsMagick もしくは ImageMagick をnode.jsから利用できるモジュール「gm」が良さそうなのでインストールしてみた。   < 2014/08/21 Modified > CentOS6.5の環境ではYUM経由でImageMagick 6.5.4-7がインストールされて問題なかったので、こっちを推奨。   まずはImageMagickでJPEGとPNGをサポートするようにライブラリをインストール # yum install libjpeg libjpeg-devel libpng libpng-devel 何となく JPEG 2000 にも対応しておく # yum install jasper-devel ImageMagickをソースからコンパイル(yum経由は古いから) # 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 バージョンの確認 # convert --version 対応しているフォーマット一覧 # convert -list format   今度はgmのインストール # cd /home/project/hoge/ # npm install gm   ImageMagickを使う場合は次のようになる。 var gm = require('gm').subClass({ imageMagick: true }); gm("img.png").resize(150, 150).write('/path', callback); USING IMAGEMAGICK | gm : GraphicsMagick for node.js     < Related Posts

REST APIのテストする開発ツール Google Chrome「Postman」

イメージ
iPhone, Androidアプリ向けにRest APIなWebサービスを開発している時にアプリを起動せず簡単にテストするツールを探したときの覚書。 参考 testing - What tools can I use to test a REST API? - Stack Overflow What tools do you use to test your public REST API? - Stack Overflow REST / HTTP API Tools for Development and Testing | Minimum Viable Pontification   Google Chrome拡張機能「 Postman - REST Client 」 多機能でサクサク動くので使いやすい。 履歴機能など必要なものは揃っていて、ソースコードも公開されているので素敵すぎる。   Firefoxアドオン「 Poster 」 「 Postman - REST Client 」があればいらない。 インストール後は右下の「P」かツールから起動する。 「Headers」は任意の値を設定するときに使う。 「Parameters」を登録しておけば「Body from Parameters」で値を生成してくれるので便利。     < Related Posts > nginx + node.js + pm2でアプリ向けのREST API環境を構築 iOS SimulatorからPOSTしているDATAを確認(Network監視) IEのAjax通信をDebugするときにPOST情報を表示「Fiddler2」 jQueryを使ってPHPとJSON形式のデータをやり取りする方法

Titaniumを使ったアプリと苦労した事とかのまとめ2013年

イメージ
Titanium™ Advent Calendar 2013 の12日目です。 今年の仕事はTitanium Mobileを使ったアプリ開発の1年でした。今回は開発したアプリの紹介と経験をまとめてみました。 開発したアプリがこれ。 teniteo(iPhone用アプリ) teniteo(Android用アプリ)   このアプリの特徴 WordPressのフロントエンド。本体 → http://teniteo.jp/ ソースコードはiPhone, Android共通。たまに内部で処理を分岐。 Alloyは使ってない。 参考: [Titanium] AlloyのSample App Screenshot一覧 サーバー側はWordPress(PHP)のプラグインで処理 参考: [Titanium] JSON.stringifyした値をPOSTしてもjson_decodeが失敗する Mapモジュールを使ってる。 参考: [Titanium] Google Maps API v2用Androidモジュールを設定 参考: [Titanium] iOSとAndroidで地図アプリ(Google Maps)を起動 Facebookアカウントでのログインも出来る。 参考: [Titanium Mobile] Facebook Moduleを使ったLoginが失敗する アクセス解析はサーバー側でやる。 参考: 【PHP】Server-SideでGoogle Analyticsを使ったTrackingをする   苦労したこと 最初はどんな書き方をしていけばいいか分からない。 → 最近公開された ChariTi というアプリが非常に参考になる。 参考: [Titanium Mobile]Performance改善のためApplicationの設計を見直す 参考: Titanium Mobileを使ったAndroid, iOS App開発に役立つLink集 iPhoneアプリの方が開発しやすいがAndroidも途中で確認しないと後でハマる。 参考: Galaxy S4に対応したAndroid Emulator AVDを作成 特にAndroidのマルチ画面関連の知識は避けて通れない 参考: anyDensity="false&

Google Play BooksへPDF形式を登録・出版(電子書籍化)

イメージ
愛知県中心に発行しているフリーペーパー「teniteo」の東京版「teniteo mini」を無事出版できた。 バックナンバー | teniteo[テニテオ] iPhone, Android向けのteniteoアプリも利用者が増えてきたので、以前から要望のある「フリーペーパー自体をスマフォで見れるようにしたい」というのをGoogle Play Booksでどの程度実現できるか試してみた。 詳しくは公式ヘルプで。 Google の Books ヘルプセンター 利用登録後、ブックスパートナーで設定できる配信先は2つ。 Google Play → 主にスマフォ向け 「Playストア」で検索でき、購入後Androidの「Playブックス」で読める。 Googleアカウントで紐付いていて、いろんなプラットフォームで読む方法が提供されている(Web, Android, iOS) Google ブックス → 主にPC向け Googleの書籍検索から検索・プレビューが出来るようになる。 プレビュー出来る範囲を指定可能。 Flash版のデジタルブックと比べて、本のような動きは出来ないけど問題なく読める。 Googleの検索に引っかかるようになるのは大きい。 40ページ(46MB)のPDFファイルをアップロードして処理完了するまで、約1時間かかった。 ページごとのPDFをアップロードすることも可能。その際はファイル名をガイドラインに従う必要がある。 書籍の設定: コンテンツ ファイル - Books ヘルプ   結局2時間経ってもGoogle Play、Google ブックスに表示されなかったので、次の日(約22時間後)確認したら表示されてた。 teniteo mini 2013.WINTER 東京版 - Google Play の書籍 teniteo mini 2013.WINTER 東京版: 就学前の子供を持つママの為の地域情報誌「テニテオ」 - Google ブックス   でも「要対応」に次のエラーが表示されていて、Google Playから購入できない(価格は「無料」に設定)。 この書籍は次の理由で掲載されていません: 価格情報がないか、適切ではありません   「Google Playの設定」から価格のところで国

nodejsからPHPを実行してWordPressのユーザー認証

イメージ
nodejsを使ってiPhone, Androidアプリ用のRest APIを開発する際に、WordPressのデータベースを使ったユーザー認証をしたかったので調査。 環境: CentoOS 5.10, node.js 0.10.21, php 5.4.21 最初はPHPでやっていることをJavaScriptで再現しようとしたけど、ソースコードを読んで無理そうだと諦めた。 なので、nodejsからPHPを外部コマンドとして呼び出して返り値を受け取ることにした。 nodejsから外部コマンドを実行するのは"child_process"を使うらしい。 Child Process Node.js v0.10.22 Manual & Documentation   nodejsから実行するPHPファイル。 wp_checkpassword.php <?php /** * WordPress Check Password for CommandLine * * @usage *   # php wp_checkpassword.php --hash="hash" --password="password" --path="/path/to/wordpress" */ $options = getopt(null, array('hash:', 'password:', 'path:')); // // Validation // if (empty($options['hash']) ||     empty($options['password']) ||     empty($options['path'])) {   exit('option error'); } // // @see wp-includes/pluggable.php line:1448 // $check = false; require_once($options['path'] . 'wp-includes/class-phpass.php&

[Titanium Mobile]Performance改善のためApplicationの設計を見直す

イメージ
Android, iPhoneアプリが一段落したので、次期開発に向けてアプリの設計とより良いパファーマンスを得られる書き方など調べ直したときの覚書。 環境:Titanium SDK 3.1.3.GA まず公式ドキュメント Best Practices and Recommendations - Titanium 3.X - Appcelerator Docs アプリのサンプルも公開されてた。 Community app - Titanium 3.X - Appcelerator Docs でもこれ2年間更新されてない(SDK v1.8.1)ので、abcsWriterの方がいいかも。 appcelerator-titans/abcsWriter | github 両方とも「名前付き関数(named function)」を多用しているので無名関数(nameless function, anonymous function)とどっちがいいか調査。 nameless vs named function · jsPerf Are named functions or anonymous functions preferred in JavaScript? - Stack Overflow 名前付き関数の方が速いらしい。 var hogeFunc = function() {}; このような無名関数を基本使っていたのでショック。今後は名前付きにしよう。。。   < 2013/11/20 Modified > ChariTi というアプリが 非常に 参考になる。 lib/core.js, lib/http.js, utilities.jsとかヨダレが出そうになるぐらい。別記事で詳細を紹介する予定。   去年のCODESTRONG(カンファレンス)のビデオを見てみた。 Breakout session - iOS Internals and Best Practices - CODESTRONG 2012 今後気をつけること。 setterを使うよりプロパティでアクセスした方が速い "透明"はコストが掛かるので常に背景色を設定した方が速い   関連した記事も見つけた。これは実際やっ

携帯(スマフォ)2台持ちなら激安SIM月額490円がお得

イメージ
最近激安SIMがあることを知ったので、契約して使ってみた。 参考サイト 格安SIM(ドコモMVNO等)LTE比較ランキング (2013年11月更新) | 最速資産運用 契約したのはこちら。 月額490円|ServersMan SIM LTE 100:【dream.jp】 概要 初期費用:3150円 月額:490円 ドコモ回線 回線最大速度100kbps(ドコモのXiは最大150Mbps) 転送量制限なし 高速化するオプション有り 1年縛り、2年縛りとかがないので気軽に試せる   切り替える前のドコモ料金はこちら。 ガラケー(F-01C) 基本使用料 (FOMAタイプSS_バリュー) +1年割り +ファミリー割引 924円 ガラケー(F-01C) パケ・ホーダイ ダブル定額料 372円 スマフォ(Galaxy S2) 基本使用料 (Xiデータプランフラットにねん) 3791円 スマフォ(Galaxy S2) SPモード 300円   これをガラケー+激安SIMにすると ガラケー(F-01C) 基本使用料 (FOMAタイプSS_バリュー) +2年割り 924円 スマフォ(Galaxy S2) ServersMan SIM LTE 100 490円   単純計算で 毎月3973円 安くなる。   100kbpsでも通勤途中は録画して転送した動画を見ているので問題なし。体感的には「ちょっと遅いかな?」という程度。電車の中の繋がりにくさは同じ。 今度利用者数が増えると遅くなりそうな予感。。。 「Xiデータプランフラットにねん」の 解約金1万円 を払っても変更した方が断然お得。ただ自分のスマフォが他社のSIMに変更出来るかは要確認。 「パケ・ホーダイ ダブル定額料」を解約すると「Xiデータプランフラットにねん」が正規料金になってしまうので、 月末(3日前ぐらいからOK)にドコモショップで手続きする必要がある 。   < 2013/11/28 Modified > ドコモショップに行ってきたら解約当月は必ず「Xiデータプランフラットにねん」の正規料金を請求されるので、月末に行こうが関係ない。 日割りに出来ないので、新しいSIMカードが届いたらすぐ解約しても

nginx + node.js + pm2でアプリ向けのREST API環境を構築

イメージ
前回の記事でWeb APIについて勉強し、モバイルアプリからのリクエストはNode.jsで捌くことにした。そのために環境を構築したときの覚書。 環境:CentOS 5.10, Node.js 0.10.21, nginx 1.4.3, pm2 0.6.5   < 2014/05/30 Modified > CentOS6版も書いたのでそちらも参考に。 SE奮闘記: CentOS6 + nginx + PHP5.4 + MariaDB10 + WordPress + node.jsの環境を構築する手順をまとめ   1.Node.jsをインストール < 2013/12/09 Modified > 本番環境の場合は実行ユーザーで作成した方がいいので、この記事の最後の方を参照。 前の記事を参考にnvmでインストールする。 SE奮闘記: LESSファイルを監視してCSSファイルに自動コンパイルする環境を構築 # nvm install v0.10.21 # nvm alias default 0.10.21   2.「Hello World」を作成 プロジェクトディレクトリに移動 # cd /home/project/ Express というNode.js向けのフレームワークをベースにする。 restify というREST Webサービス用に特化したモジュールもあるけど、開発のスピードと下記ベンチマークを参考にExpressを選択。 expressjs vs perfectapi vs restify 速度比較 | ab benchmarks on EC2 medium instance expressjsの公式ドキュメント 通りに「Hello World」を作る。 # vi package.json {   "name": "hello-world",   "description": "hello world test app",   "version": "0.0.1",   "private": true,   "dependencies&qu

iOSアプリをDistributeするときに120x120が必要になった

イメージ
Titanium Mobileで作成したアプリをストアに送信する「Validation」をしたときに下記エラーが出るようになった。 Missing recommended icon file - The bundle does not contain an app icon for iPhone / iPod Touch of exactly '120x120' pixels, in .png format. 120x120のアイコンが必要になったらしい。 環境: Titanium SDK 3.1.3.GA 参考にしたサイト。 Icons and Splash Screens - Titanium 3.X - Appcelerator Docs iOS Human Interface Guidelines: Icon and Image Sizes | iOS Developer Library   [iOS 7] iOSアイコンファイル早見表(2013/9) | Developers.IO   上記サイトを参考に Resources/iphone/appicon-60.png Resources/iphone/appicon-60@2x.png を用意したらValidationが通った。   < Related Posts > Titaniumで作成したアプリをApp Storeに申請してみた

モバイルアプリ向けにRESTfulなJSON APIを設計するために

イメージ
Titanium Mobileを使ってWordPressと連携できるiOSアプリ、Androidアプリを作った。 【Web】teniteo[テニテオ] 【iOS】teniteo | iTunes 【Android】teniteo - Google Play の Android アプリ アプリからのリクエストはWordPress(PHP)で処理しているので、Web版のメソッドを流用出来て開発は比較的楽だった。 しかし、こんな独自仕様のAPIではなく、そもそもアプリのバックエンド(WebAPI)はどうあるべきか調べてみた。 参考サイト Web API Design - 開発者が愛するインターフェイスを作る Announcement: Free eBook on Web API Design | Apigee Blog REST APIが主流らしい。 上記サイトからダウンロードできる無料のPDFにWeb APIを設計するための指針がまとめられていて分かりやすい。   WordPress.comではREST APIを開発者向けに公開しているので、URIを決めるときの参考になる。 REST API | Developer Resources | WordPress.com   さらにサーバー側はNode.jsで構築すればPHPの50倍速くなるらしい。 とりあえず簡単なベンチマークNode.js,PHP,Perl - Qiita [キータ] Webアプリサーバーの常識を覆す「Node.js」 - 大量アクセスを小さいシステムで:ITpro JavaScriptだけでクライアント側(Titanium Mobile)とサーバー側が開発出来るのは嬉しい。 ただし、WordPressが提供している便利関数が使えなくなるのでテスト工数は増えそう。   少ない「人」と「お金」と「時間」で開発するためにはこういった技術を活用することがますます重要になりそう。   < Related Posts > node.js用の開発Document, Coding Guide(コーディング規約) #nodejs_jp WebSocket, node.js, Socket.IOって何?

[Subversion]日本語ファイル名をコミットするとエラー

イメージ
日本語を含む名前のファイルを TortoiseSVN でコミットしようとするとエラーになったときの覚書。 環境: Amazon Linux AMI release 2013.09, Subversion Server 1.7.13, TortoiseSVN 1.8.2 SubversionはYUM経由でインストール。 それまでは日本語でもコミット出来ていた。たぶんサーバー側でyum updateしてSubversionのバージョンが上がったからだと思う。 TortoiseSVNのエラー Command: Commit Modified: C:\Users\daiki\Documents\Projects\hoge\Documents\99.Etc\アンケート.xls Sending content: C:\Users\daiki\Documents\Projects\hoge\Documents\99.Etc\アンケート.xls Error: Commit failed (details follow): Error: File Error:  'C:\Users\daiki\Documents\Projects\hoge\Documents\99.Etc\アンケート.xls' Error:  is out of date Error: File not found: transaction '668-jc', path Error:  '/trunk/documents/99.Etc/%A2%E3%83%B3%E3%82%B1%E3%83%BC%E3%83%88.xls' Error: You have to update your working copy first. Completed!:   サーバー側のエラーログ # tail -f /var/log/httpd/error_log [Wed Oct 23 08:24:04 2013] [error] [client 61.205.209.20] Could not fetch resource information.  [404, #0] [Wed Oct 23 08:24:04 2013] [error] [client 61.20

Google Play, App Storeのアプリ画面を起動するQRコードを生成

イメージ
チラシを作成する際にQRコードを貼り付けて、読み込むとAndroidアプリ、iPhoneアプリをダウンロードできるアプリストアを表示するようにしたくて調査したときの覚書。 ちなみにQRコードを読み取るアプリをダウンロードしてスキャンするぐらいならアプリストアでキーワード検索した方が早い。。。   URIスキーム(URLスキーム)の仕組みを使うと起動するアプリをある程度制御することができる。 URI scheme - Wikipedia, the free encyclopedia   Google Playの「teniteo」アプリ を起動する場合 market://details?id=jp.teniteo.app   App Storeの「teniteo」アプリ を起動する場合 itms-apps://itunes.apple.com/jp/app/teniteo/id619969170   これのQRコードを生成する。下記サイトで無料で作れる。サイズも指定出来て便利。 QR Code generator - create QR Codes (for free) [logo, business card, vCard, t-shirt, mug] - goQR.me   ちなみにこの記事に付けている画像が実際に生成したQRコード。   チラシに必要な「Google Play」と「App Store」のロゴのベクトル画像は下記から手に入る。 App Store Marketing Guidelines - Apple Developer Android app on Google play vector in .EPS, .CRD, .AI format     < Related Posts > [Titanium] iOSとAndroidで地図アプリ(Google Maps)を起動 【Androidアプリ】バーコード読み取り「Zxing」をEclipseで使う

Windows8からMacの共有フォルダへのアクセスが切断されたりする

イメージ
会社の開発環境では、Mac miniがメインサーバーになっていて、WindowsからMacの共有フォルダにアクセスしてTitanium Mobileの開発したり、VMware Fusion上でLinuxを動かしていたりする。 WindowsからMacの共有フォルダ(SMB/CIFS)にアクセスして、 TortoiseSVN でコミット作業しているとたまに途中で失敗することがあったので、イラっときて調べたときの覚書。 環境: Windows 8 64bit, OS X 10.8.5 IPv6が悪さすることがあるらしい。 Mac OS 10.7 Lion でやたらネットワークが遅い、切れるときは、 IPv6 を切ってみよう - Qiita [キータ] 書いてある通り System Preferences → Network → Advanced ... → Configure IPv5 を「Link-local only」にするとコミットに失敗することがなくなった。   さらに下記記事を読んでSMB/CIFSを理解すると問題の切り分けが出来そうな気がする。 基礎から学ぶWindowsネットワーク:第20回 ファイル共有プロトコルSMB/CIFS(その1) (1/3) - @IT   < Related Posts > Networkが断続的に切断されるのでLANケーブルを疑ってみた 【Mac】WindowsからMacの共有フォルダにアクセスする

nginx + php-fpmの環境で処理が途中で止まる

イメージ
サーバーから外部API経由でデータを取得している処理でたまに途中で失敗していたので調べてみた。 環境: CentOS 5.9 x86_64, nginx 1.4.3, php-fpm 5.4.20 エラーログを見てみると # tail -f /var/log/nginx/error.log 2013/10/17 20:03:36 [error] 5377#0: *3392 readv() failed (104: Connection reset by peer) while reading upstream # tail -f /var/log/php-fpm/error.log [17-Oct-2013 20:04:31] WARNING: [pool www] child 10965 exited on signal 11 (SIGSEGV) after 30946.471106 seconds from start [17-Oct-2013 20:04:31] NOTICE: [pool www] child 13670 started php-fpmの request_terminate_timeout を設定すると直るという情報があったので設定してみる。 # vi /etc/php-fpm.d/www.conf request_terminate_timeout = 30s # /etc/rc.d/init.d/php-fpm restart     < Related Posts > Nginx+PHP-FPMのTuning設定 FileをUploadするためのnginxとphp.iniの設定

Google Apps Scriptで自動的にGmailのメールを定期的に削除

イメージ
メールマガジンなどはGmailのフィルター機能を使ってラベル付け+アーカイブしているけど、キーワード検索するとヒットしてウザいので定期的に削除することにした。 参考にしたサイトはこちら。 時間が経過すると自動的にメールを削除するGmailフィルターをつくる | Lifehacking.jp Create time-based Gmail filters with Google Apps Script | johnedayjohneday   手順 Google Apps Script にアクセスして「空のプロジェクト」を作成 メールを検索して削除するスクリプトをJavaScriptで記述 「現在のプロジェクトのトリガー」で実行間隔を設定 上記サイトのスクリプトを参考に、複数のラベルを対象とするように変更したのがこれ。 「filters」に設定する値はGmail上でラベルをクリックしたときに検索バー表示される値そのまま。 試すときは「ゴミ箱」を空にして、「max」の値を5ぐらいで動作確認した方がいい。 もっと簡単設定できるようにUIを付けたウェブアプリケーションも作れるような気がする。   < Related Posts > [Google Apps]複数Domainを管理している場合にDKIMを設定してviaが出ないようにする Gmailフィルタメモ。必要なメールだけ携帯に転送

[Titanium Mobile]TabGroupのTop LevelでAndroidのMenuを表示

イメージ
Titanium SDK 3.1.3.GAに上げたらAndroidのメニューが表示されなくなったので調査したときの覚書。 環境: Titanium SDK 3.1.3.GA TabGroupの各タブのトップだけ表示されず、下の階層へ画面遷移すれば普通にメニューが表示される。 今までは共通関数で、 win = Titanium.UI.createWindow(); win.activity.onCreateOptionsMenu = function(e) {     e.menu.add({title: L('menu1')}); }); とやっていた。 どうやらTabGroup直下のwndowにはactivity(≒画面)がないらしい。 Android menu options doesn't appear... onCreateOptionsMenu isn't called | Community Questions & Answers | Appcelerator Developer Center Titaniumではactivityを持っているwindowを「heavyweight」windowと呼んでいて、「heavyweight」なwindowを作成するかどうかを条件に応じて判断している。詳しくは下記。 Activities - Titanium 3.X - Appcelerator Docs   TabGroup直下の場合はTabGroupのActivityでonCreateOptionsMenuする必要があるみたい。 tabGroup = Titanium.UI.createTabGroup(); tabGroup.activity.onCreateOptionsMenu = function(e) {     e.menu.add({title: L('menu1')}); });   < Related Posts > Titanium Mobileを使ったAndroid, iOS App開発に役立つLink集

[Titanium Mobile]HTTPClientのSession(Cookie)をAndroidのWebViewに引き継ぐ

イメージ
WordPressとやり取りするアプリをTitanium Mobileで開発しているときに、HTTPClientでログインしておいたのに WebView を使うとセッションが引き継がれないので調査したときの覚書。 表示するだけならHTTPClientでGETして、WebViewのhtmlに流し込んだ方が簡単。 問い合わせフォームなど入力してPOSTするページはWebViewのurl指定で表示させたい。 Androidのみ。iOSは何もしなくても引き継がれる。 参考になったサイト。 Cookies and Webviews again | Community Questions & Answers | Appcelerator Developer Center 環境: Titanium SDK 3.1.3.GA, WordPress 3.6.1   まずは、HTTPClientしたときのCookieを覚えておく xhr = Titanium.Network.createHTTPClient(); xhr.onload = function() {     // Save cookie for Android WebView     if (this.getResponseHeader('set-cookie')) {         self.cookie = this.getResponseHeader('set-cookie');     } }   その後、WebViewを使用するときにevalJSを使ってCookieをセットする view = Titanium.UI.createWebView(); view.addEventListener('beforeload', function() {     cookie = self.cookie.split(/,\s(?=\w+=)/g);     cookie.forEach(function(item) {         item.split('; ').forEach(function(data) {             view.evalJS('document.cookie="

Subversion 1.8系をCentOSにInstall (YUM経由)

イメージ
Subversionのクライアント環境だけCentOSに追加したときの覚書。 環境: CentOS 5.9, Subversion 1.8.3 Subversionのサービスを提供している WANdisco がインストール用のシェルスクリプトを配布しているのでそれを利用する。 Download Subversion (SVN) 1.8.x Server & Client | Download Subversion (SVN) 1.6.x Server & Client | WANdisco ダウンロードするために登録が必要。 YUMで配布してくれるなら、これくらいはお安い御用。 登録したメールアドレスにリンクが送られてくるので、それをクリックしてダウンロード。 あとはサーバーに置いて実行する。 # chmod 655 ./svn1.8_rhel5_wandisco.sh # ./svn1.8_rhel5_wandisco.sh Subversionのクライアントとして使うのでapacheのSVNモジュールはインストールしない。 チェックアウトしてみる。 # svn checkout http://dev.hoge.net/project/branches/demo demo/ --username hoge ちなみにサーバーはSubversion 1.7.9 コマンドは忘れるものなのでヘルプで確認 # svn help   < Related Posts > CentOS + Subversion + LDAP + ApacheをInstallして設定 SubversionをCompileしてsvnコマンドを使用(RPMとYUMを使う方法を追記)

LESSファイルを監視してCSSファイルに自動コンパイルする環境を構築

イメージ
CSSフレームワークの「 Bootstrap 」をベースにして、CSSを動的に生成する言語「 less 」の環境を構築したときの覚書。 環境: CentOS 5.9 x86_64, Node.js v0.10.20, Grunt 0.4.1 サーバー側でlessファイルからcssファイルにコンパイルするためにはnode.jsの環境が必要。node.jsは nvm (Node Version Manager) 経由でインストールする。 gitが必須らしい # yum install git nvmをインストール # wget -qO- https://raw.github.com/creationix/nvm/master/install.sh | sh ここで一旦ログアウト&ログイン nodejsをインストール # nvm install v0.10.20 デフォルトでv0.10.20を使うようにする # nvm alias default 0.10.20 lessファイルをcssファイルにコンパイルするソフトをインストール # npm install -g less   試してみる # cd /home/projects/hoge/ # lessc less/hoge.less css/hoge.css   次はlessファイルを監視して、保存と同時にcssファイルにコンパイルする環境を作る。 参考にしたサイト Getting started - Grunt: The JavaScript Task Runner コーダーさんの為のGrunt入門(後編)〜CSSプリコンパイラ編 | Mach3.laBlog 手順 タスク管理ツール「 Grunt 」をインストール LESSをCSSにコンパイルするGruntプラグイン「 grunt-contrib-less 」をインストール ファイルを監視して更新を検知するGruntプラグイン「 grunt-contrib-watch 」をインストール   Gruntのコマンドラインツールをインストール # npm install -g grunt-cli Grunt本体とプラグインをインストール # cd /home/projects/hoge/ # npm install gr

猫のトイレ臭い対策でデオトイレを買ってみる

イメージ
普通の猫トイレを使っていたけど、1週間ほどで臭くなりだして、ニャンコも嫌がっている様子。 揃えた猫用品は 前の記事 を参照。猫2匹、 5ヶ月のオスとメス 。 調べてみると重曹(ベーキングパウダー)を下に敷くと臭いが抑えられると聞いてやってみた。 確かに臭いが控えめになった気がする。。。けど、トイレが綺麗になるわけもなく、2週間で猫砂をまるっと替えているのが現状。 < 2017/11/23 追記 > 普通の猫トイレは猫砂の下にデオトイレ用の吸収シートを敷いて使っている。 何とかならないものかと調べてみて、今度はシート交換式のデオトイレを買ってみた。 ユニチャーム1週間消臭・抗菌デオトイレ フード付き本体セット (アイボリー) おしっこの場合は下のシートが吸収してくれるので、掃除がかなり楽になる。 うんちは相変わらず臭い。こっちでうんちした場合はなぜか砂をかけてくれない。砂が大きいから? 前の猫トイレと両方おいておくと、前のトイレを優先的に使うみたい。猫砂の感じがお気に入りらしい。前の猫砂をデオトイレで使いたいが、砕けてシートの上に落ちてしまう。 総体的には買って良かった。 おしっこをデオトイレ、うんちを前の猫トイレでしてもらえると大変助かります。 < Related Posts > 猫を向かい入れるために猫用品を揃える

[Titanium] iOSとAndroidで地図アプリ(Google Maps)を起動

イメージ
アプリ内の地図と地図アプリを連携すると便利なので、パラメータを渡して起動する方法を調査。 環境: Titanium SDK 3.1.1.GA 参考にしたのは下記。 Google Maps URL Scheme - Google Maps SDK for iOS - Google Developers Apple URL Scheme Reference: Map Links Google Maps のパラメータ   実際書いたコードを下記に抜粋。 iOSの場合はグーグルマップアプリがインストールしてあれば、そちらを優先して開く。 Androidの場合はおなじみのアプリを選択する。 緯度と経度をクエリとして渡した方がピンが立つので分かりやすい。 if (this.isAndroid) {     // Google Map     url = [];     url.push('http://maps.google.com/maps');     //url.push('?ll=' + this.region.latitude + ',' + this.region.longitude);     url.push('?q=' + this.region.latitude + ',' + this.region.longitude);     url.push('&z=16');     Titanium.Platform.openURL(url.join(''));     return true; } if (this.isIos) {     // Google Map of Native App     url = [];     url.push('comgooglemaps://');     //url.push('?center=' + this.region.latitude + ',' + this.region.longitude);     url.push('?q=' + this.region.latitude + ',&

[Titanium] Google Maps API v2用Androidモジュールを設定

イメージ
Titanium Mobileで作成したiOSアプリ、Androidアプリ内にGoogle Mapを表示して、店舗情報をプロット表示するために調査したときの覚書。 環境: Titanium SDK 3.1.1.GA Titanium公式ドキュメントを読む。 Titanium.Map | Titanium 3.X - Appcelerator Docs iOSでは「Titanium.Map」 Androidでは「Modules.Map」というモジュール を使うらしい。 iOS用には KitchenSink を参考にすれば難しくないと思う。ここからはAndroid用のモジュールを使えるようにするまでの手順。   Android用のモジュールに関する公式ドキュメントはこちら。 Modules.Map | Titanium 3.X - Appcelerator Docs Google Maps v2 for Android | Titanium 3.X - Appcelerator Docs このモジュールはTitanium 3.1.0以上が必要なので注意。   簡単に手順をまとめると。 1.Google Play Services SDKをインストール Android SDK Managerを起動して「Extras」 → 「Google Play services」をインストールする。 Setup Google Play Services SDK | Android Developers     2.Google APIs Consoleに登録してAPI Keyを取得 Google APIs Console にアクセスして「Google Maps Android API v2」をONにする。 Google APIs Consoleの「API Access」 → 「Create new Android Key...」からアプリに埋め込まれているFingerPrintを入力 開発用のFingerPrintは下記コマンドで確認できる(パスワードはなし)。S $ keytool -list -v -keystore ~/Library/Application\ Support/Titanium/mobilesdk/osx/3.1.

リニア長野県駅「新飯田」の(大まかな)位置が公表されたので、Google Mapsに描画してみた

私の実家の近くに駅ができると聞いていたので気になっていた駅の場所。本日だいたいの位置が公表されたので、Google Mapsの機能を使って書いてみた。 情報元はJR東海の公式ホームページ 中央新幹線(東京都・名古屋市間)環境影響評価準備書(長野県) |JR東海 第1章 対象事業の名称/第2章 事業者の氏名及び住所/第3章 対象事業の目的及び内容(PDF) 下記地図で枠が表示されない場合は こちら から。 大きな地図でみる 153号線に隣接すると思うから、パチンコダイナムとドラッグストアの間ぐらいかな? 実家から歩いていけなくはないけど、個人的にはもう少し東の方がよかった。 2027年完成予定。

anyDensity="false"から脱出するためにAndroidの画面サイズ関連を理解する

イメージ
Titanium Mobileで開発していると、iOSアプリで確認してからAndroidアプリで確認してみると、レイアウトが崩れてしまうことが多い。 当初は「anyDensity="false"」に設定して誤魔化してきたけど、どのAndroid端末でも同じユーザーインターフェイスになるように画面サイズに関する資料を読んでみたときの覚書。 まずは公式ドキュメントを読む。 Supporting Multiple Screens | Android Developers 2. マルチ画面のサポート - ソフトウェア技術ドキュメントを勝手に翻訳 (公式ドキュメントの日本語訳) 用語と概念を理解する Screen size 画面サイズ 端末の物理的な画面の大きさ。 Androidでは、すべての画面サイズを4つに分類している。 small normal large xlarge (extra large) Screen density 画面密度 画面に対するピクセル数の密度。 単位は dpi (dots per inch) ディスプレイではピクセルとドットが1体1で対応するので、ppi (pixel per inch)でも同じ意味になる。( wikipedia ) Androidでは、全ての画面密度を4つに分類している。最近1つ増えた。 ldpi (low) mdpi (medium) hdpi (high)   端末例)Samsung S2 (SC-02C), Xperia arc (SO-01C) xhdpi (extra high)   端末例)Samsung S3 (SC-06D), Xperia A (SO-02E) xxhdpi   端末例)Samsung S4 (SC-04E), HTC J One (HTL22) 参考: Androidアプリーリソース画像サイズ&種類ー : Excite Designer's Blog 参考: 最新スマホ26機種徹底比較|スマートフォンガイド 参考: 画面サイズと画面密度のシェア率 | Android Developers Orientation オリエンテーション 画面の向き。 横長か縦長か。 Resolution 画面解像度 画面のピクセル数の

Google Maps API v3を使って地図上に店舗情報をプロットする

イメージ
Google Mapに店舗情報をプロットする開発したときの覚書。1年前の下書きを元にしているので情報が古いかも。 環境: Google Maps API v3 やりたい事 緯度と経度を元にGoogle Map上にプロットする プロットしたときのアイコンを独自のアイコンにしたい 表示される吹き出しもいい感じにしたい 表示された店舗情報の数・位置によって、地図上の縮尺をいい感じにしたい たくさんの情報がプロットされたとしてもいい感じに表示したい 住所から緯度と経度を取得したい。逆も。 こんな風に実現できた。 地域情報検索 | teniteo[テニテオ]   まずはGoogleの公式ドキュメントを読む。 Google Maps Javascript API V3 Reference - Google Maps JavaScript API v3 | Google Developers   地図を日本語表示したい場合は「language=ja」を追加する <script type="text/javascript" src="http://maps.googleapis.com/maps/api/js?sensor=false&language=ja"> コンセプト - Google Maps JavaScript API v3 | Google Developers   住所から緯度と経度を取得するには、下記を参考に。 ジオコーディング サービス - Google Maps JavaScript API v3 | Google Developers   Google Mapに渡せるQuery Parameterは下記に情報があったけど、今はなくっているみたい(2013年9月9日時点) http://mapki.com/wiki/Google_Map_Parameters   jQueryで簡単に使えるようなライブラリがやっぱりあった。 jquery-ui-map - Google map v3 plugin for jQuery and jQuery Mobile - Google Project Hosting でも使ってない。   近く

Androidアプリの画面(UI)設計をする際に読んでおきたい資料

イメージ
アプリの画面設計する際にどんなUIにするべきか調査したときの覚書。役に立ちそうなサイトの紹介   Android Interaction Design Patterns Androidのデザインパターンを紹介。 それぞれの利点と欠点があり、サンプルアプリを掲載されていてわかりやすい。   Draw 9-patch | Android Developers 「NinePatch」を活用すれば、吹き出しや角丸デザインも恐くない。 ちなみにiOSでは同じ仕組みはない。外部ライブラリを使えば出来るみたい。   Android Asset Studio 9-patchやアイコンなどを生成してくれるオンラインサービス。   Android UI Patterns: Watch this: Google I/O 2013 - Android Design for UI Developers Google I/O 2013のセッション記事。UI設計に関する動画へのリンクがある。 Android 4.0からのデザインガイドラインの説明。   Android UI design patterns: Google I/O 2010 Google I/O 2010のUI設計に関するセッション動画。 まだAndroid2.3系も多いので、この辺の方が役に立つかも。   他にもGoogle先生に「App UI Design Pattern」などで聞くといろいろ参考になる情報が出てくる。   < Related Posts > Titanium Mobileを使ったAndroid, iOS App開発に役立つLink集 iPhone, Androidの画面設計(Wireframe)用Free素材を探す

Titanium Studioで"L"のWarningを消したい

イメージ
Titanium Studioのバリデーション機能を使って構文チェックしているときに"L"(Titanium.Local.getString()のショートカット)がずっとWarning表示されるので非表示するやり方を調査。 環境: Titanium Studio 3.1.2 まずはバリデーション機能を有効にするやり方 Titanium Studio → Preferences → Studio → Validation JSLint Validatorにチェックを付ける。 プロジェクト内を全て再チェックしたい場合は、Project → Clean...   'L' was used before it was defined. がたくさん表示されて見にくいので、フィルターの設定をする。 Titanium Studio → Preferences → Studio → Validation JSLint Validatorを選択して、下記Filterを追加。「Missing 'new'.」はお好みで。 Missing 'new'. 'L' was .+ Strictモードで書いていると未定義の変数があるだけで落ちてしまうので(Android)、Titanium Studioのバリデーション機能は便利。 ファイルの先頭にJSLintのオプションを記述することも出来る。詳細は JSLint: The JavaScript Code Quality Tool /*jslint eqeq:true, nomen:true, devel:true, plusplus:true*/   < Related Posts > [Titanium Mobile] Strict ModeとJSLintで統一性のあるCoding Titanium Mobileを使ったAndroid, iOS App開発に役立つLink集