tag:blogger.com,1999:blog-63917982556574924222024-09-11T11:58:56.452+09:00戯言と技術普段使うコマンドや、困ったことをまとめた備忘録的技術ブログ たまに趣味のネタw弦也http://www.blogger.com/profile/16272758099624685883[email protected]Blogger66125tag:blogger.com,1999:blog-6391798255657492422.post-78056172338256148712023-01-15T11:03:00.004+09:002023-01-15T11:03:38.273+09:00サイトの移動記事を移動しました。 <a href="https://www.keydrop.net">https://www.keydrop.net</a> Laravel9など記事は新規サイトにて記載弦也http://www.blogger.com/profile/16272758099624685883[email protected]tag:blogger.com,1999:blog-6391798255657492422.post-2431403394436993732017-08-20T23:15:00.000+09:002017-08-20T23:17:27.717+09:00Mac Sierraでapache +PHP5.6をPHP7.1を利用する手順PHP5.6=>PHP7.1をMac Sierraで利用するための手順<br /> <br /> <br /> <table border="1"><tbody> <tr><th>名称</th><th>概要</th> </tr> <tr><td>実行日</td><td>2017/08/20</td></tr> <tr><td>OS</td><td>MacOS Sierra </td></tr> <tr><td>Apache</td><td>2.4.27</td></tr> <tr><td>Brew</td><td>Homebrew 1.3.1</td></tr> </tbody></table><br /> <pre class="prettyprint"><code class=" hljs shell"> $ brew tap homebrew/dupes $ brew tap homebrew/versions $ brew tap homebrew/php $ brew tap homebrew/apache $ brew update -- 不要なら外す $ brew unlink php56 $ brew install php71 --with-httpd24 -- 普段CakePHPをよく利用するのでついでに手順化 $ brew install php71-intl php71-pdo-pgsql $ sudo vi /etc/apache2/httpd.conf -- 以下の変更-- # LoadModule php5_module libexec/apache2/libphp5.so LoadModule php7_module /usr/local/opt/php71/libexec/apache2/libphp7.so ------------- $ sudo vi /etc/apache2/other/php7.conf --- 以下を追加 --- <FilesMatch .php$> SetHandler application/x-httpd-php </FilesMatch> <ifmodule php7_module> AddType application/x-httpd-php .php AddType application/x-httpd-php-source .phps <ifmodule dir_module> DirectoryIndex index.html index.php </IfModule> </IfModule> --------------- sudo mv /etc/apache2/other/php5.conf /etc/apache2/other/php5.conf.bk -- versionチェック $ php -v $ sudo apachectl restart </code></pre><br /> 基本はこれで行けるはずですが、自分の環境では行けず以下を対応<br /> <br /> <br /> <pre class="prettyprint"><code class=" hljs shell"> less /var/log/apache2/error_log ---- エラーログをチェック ----- [Sun Aug 20 20:53:25.102393 2017] [mpm_prefork:notice] [pid 86] AH00163: Apache/2.4.25 (Unix) PHP/7.1.8 configured -- resuming normal operations [Sun Aug 20 20:53:25.102609 2017] [core:notice] [pid 86] AH00094: Command line: '/usr/sbin/httpd -D FOREGROUND' --------------------------- </code></pre><br /> php.iniが古いのが問題の可能性が高い<br /> php5.6からphp7.1向けのphp.iniを公式サイトからphp-7.1.8.tar.bz2をDLし<br /> Downloadフォルダに解凍後以下を実施<br /> <br /> <pre class="prettyprint"><code class=" hljs shell"> sudo mv /etc/php.ini /etc/php.ini.20170820 sudo cp Downloads/php-7.1.8/php.ini-production /etc/php.ini </code></pre><br /> これで行けました。弦也http://www.blogger.com/profile/16272758099624685883[email protected]tag:blogger.com,1999:blog-6391798255657492422.post-22701472176187280782017-08-20T18:21:00.001+09:002017-08-20T18:34:02.941+09:00localhostでWebプッシュの実現(OneSignal編)Webプッシュ技術が流行っているので試しに実装及びまとめてみました。 <br /> 環境は以下に記載ですが、localhostで試験的にやってみたい人向けに書いています。<br /> OneSignalというサービスを利用して対応してみましたが以下の理由で対応しました。他に良いものもあるかもしれないですが自分の中ではこれが一番しっくりきました。<br /> <blockquote> 無料で利用できる <br /> 非SSLで利用可能 <br /> Mac &amp; Windows系の主要ブラウザ対応(iOSは非対応)</blockquote> 早速検証環境を羅列<br /> <table><thead> <tr> <th>環境</th> <th>概要</th> </tr> </thead> <tbody> <tr> <td>2017/08/19日検証</td> <td></td> </tr> <tr> <td>プッシュサービス</td> <td>OneSignal</td> </tr> <tr> <td>Webサーバ</td> <td>macOS Sierra上にapache(Apache/2.4.25)</td> </tr> <tr> <td>ホスト</td> <td><a href="http://localhost/~">http://localhost/~</a>{ユーザ名}/</td> </tr> </tbody></table> 基本的にMacを触っていれば初期状態?で利用できるものを前提にしてみました。<br /> <blockquote> <a href="http://localhost/index.html">http://localhost/index.html</a>に実現するイメージです。</blockquote> <h4 id="1サイトに登録"> 1.サイトに登録</h4> <a href="https://onesignal.com/">https://onesignal.com/</a> <br /> に登録、登録にはメアド&パスワードでOK <br /> GitHubとかその他でも可<br /> <blockquote> 登録作業は本質ではないので省略</blockquote> <h4 id="2新しいプロジェクトの設定safari編"> 2.新しいプロジェクトの設定(Safari編)</h4> <h5 id="2-1プロジェクト名の入力"> 2-1.プロジェクト名の入力</h5> <div> <br /></div> <div class="separator" style="clear: both; text-align: center;"> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxZzRWKEwG48HgRswbHEa73hb-Cl3HNw8xG68vhKm3VbnBkQQB4ZDoOqhz9c_y1Ty6Y0PgNlIBpEI4QKB9yw6DWawkoaqEUswVmm7d-Jw2xbtL3N00abmAmww8NrVqrZa8xJOnJIhHjKRD/s1600/Step2-1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="868" data-original-width="1400" height="198" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxZzRWKEwG48HgRswbHEa73hb-Cl3HNw8xG68vhKm3VbnBkQQB4ZDoOqhz9c_y1Ty6Y0PgNlIBpEI4QKB9yw6DWawkoaqEUswVmm7d-Jw2xbtL3N00abmAmww8NrVqrZa8xJOnJIhHjKRD/s320/Step2-1.png" width="320" /></a></div> <div> <br /></div> <code><br /> </code><code>Add a new app</code>を押し新規作成 <br /> ここは自分で適当に決める今回は`Test’で作成<br /> <h5 id="2-2website-pushを指定"> 2-2.WebSite Pushを指定</h5> <div> <br /></div> <div class="separator" style="clear: both; text-align: center;"> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiHopkW4oekZPsytb9P59NeGd0KKZ2qsOg7C_G4GtX15LfB95sQYNyfYAcU5SDZWEiNvSDxaapG7bq7d2YnXg-ePlxm_4UIkhrE5eSnqIO1BMGyJpjMMqlIKtVjER7T-P87610SKcw-RJax/s1600/Step2-3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="971" data-original-width="1600" height="194" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiHopkW4oekZPsytb9P59NeGd0KKZ2qsOg7C_G4GtX15LfB95sQYNyfYAcU5SDZWEiNvSDxaapG7bq7d2YnXg-ePlxm_4UIkhrE5eSnqIO1BMGyJpjMMqlIKtVjER7T-P87610SKcw-RJax/s320/Step2-3.png" width="320" /></a></div> <div> <br /></div> 何も考えず<code>WebSiet Push</code>を選択<br /> <h5 id="2-3apple-safariを指定"> 2-3.Apple Safariを指定</h5> <div> <br /></div> <div class="separator" style="clear: both; text-align: center;"> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9zp7EV2BmkDHadp5nhe-2jQFKsbR7b5vZEPSlaog-TGWLALBkEEKUpdZZdwW4-7O-ts-WfMk1CdjKFppynmBLrkaXGeHd4PdWnwgwFuil7xvt1nLHy279zdb18MRLA1W_ivduJoZjNi4L/s1600/Step2-3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="971" data-original-width="1600" height="194" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9zp7EV2BmkDHadp5nhe-2jQFKsbR7b5vZEPSlaog-TGWLALBkEEKUpdZZdwW4-7O-ts-WfMk1CdjKFppynmBLrkaXGeHd4PdWnwgwFuil7xvt1nLHy279zdb18MRLA1W_ivduJoZjNi4L/s320/Step2-3.png" width="320" /></a></div> <div> <br /></div> まずは Safariの設定をするので<code>Apple Safari</code>を指定<br /> <h5 id="2-4テストサイト情報を指定"> 2-4.テストサイト情報を指定</h5> <div class="separator" style="clear: both; text-align: center;"> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9Zs8EO5tw4Ki91fEL5UjUy4ERk8hk4yqEcCmo5ZZI9YyPb43wQDm5BxPY_lI6ndk7qgZB1DCU0lBlNG1dZaGV9YS8Ik-g5L9y5fDj2xZ11I8Mv7d7Q0pOhO0wdrHo-9PKGqvUOh3msh2M/s1600/Step2-4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="976" data-original-width="1600" height="195" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9Zs8EO5tw4Ki91fEL5UjUy4ERk8hk4yqEcCmo5ZZI9YyPb43wQDm5BxPY_lI6ndk7qgZB1DCU0lBlNG1dZaGV9YS8Ik-g5L9y5fDj2xZ11I8Mv7d7Q0pOhO0wdrHo-9PKGqvUOh3msh2M/s320/Step2-4.png" width="320" /></a></div> <br /> <br /> 必須入力が、2つで <br /> <code>Site Name</code>これは適当で良い今回は<code>Test1</code>を指定 <br /> <code>Site URL</code>ここに<code>http://localhost</code>を指定 <br /> 残り2つは製品をリリースするのなら触った方が良いがとり得ず今は放置<br /> <h5 id="2-5sdkの指定"> 2-5.SDKの指定</h5> <div class="separator" style="clear: both; text-align: center;"> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj6DNwmC-81aS_Q1aJJ1lGKRw8YRJOUCGZUcWC1gVeSDJ9Wf1p2Tes7VH5Nr7QkZ89DnXvgoU8LubApUwSfrZT-x1GBMFZMWLlbVOzDvb63ZjmZvOTPDtyxnceZSkLN62wuryk74kG4oEoG/s1600/Step2-5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="970" data-original-width="1600" height="193" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj6DNwmC-81aS_Q1aJJ1lGKRw8YRJOUCGZUcWC1gVeSDJ9Wf1p2Tes7VH5Nr7QkZ89DnXvgoU8LubApUwSfrZT-x1GBMFZMWLlbVOzDvb63ZjmZvOTPDtyxnceZSkLN62wuryk74kG4oEoG/s320/Step2-5.png" width="320" /></a></div> <br /> <br /> 何も考えず<code>Websiet Push</code>を選択<br /> <h5 id="2-6test実行"> 2-6.Test実行</h5> <div class="separator" style="clear: both; text-align: center;"> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjB6WKIrCaYAvEbnQ4DAZOBS78Z-xx-yIrJK3VdMcQe3nJlBOAWMSDHi4ePsHN46uGSRReXohZ4EoAZyxx_9_-VXpOrLTTRPjB0mg2a0ueaMDehwOSqyC_oTRkYU_wLFkK5OsDjNvM7n3bX/s1600/Step2-6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="964" data-original-width="1600" height="192" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjB6WKIrCaYAvEbnQ4DAZOBS78Z-xx-yIrJK3VdMcQe3nJlBOAWMSDHi4ePsHN46uGSRReXohZ4EoAZyxx_9_-VXpOrLTTRPjB0mg2a0ueaMDehwOSqyC_oTRkYU_wLFkK5OsDjNvM7n3bX/s320/Step2-6.png" width="320" /></a></div> <br /> <br /> この画面に来ると2つのことをする必要がある <br /> 1. 承認用HTMLの作成 <br /> 2. ブラウザから承認<br /> まずは、<code>承認用HTMLの作成</code>から <br /> <code># sudo vi /Library/WebServer/Documents/index.html.en</code><br /> 以下のソースを記載<br /> <pre class="prettyprint"><code class=" hljs xml"><span class="hljs-tag">&lt;<span class="hljs-title">html</span>&gt;</span> <span class="hljs-tag">&lt;<span class="hljs-title">script</span> <span class="hljs-attribute">src</span>=<span class="hljs-value">"https://cdn.onesignal.com/sdks/OneSignalSDK.js"</span> <span class="hljs-attribute">async</span>=<span class="hljs-value">'async'</span>&gt;</span><span class="javascript"></span><span class="hljs-tag">&lt;/<span class="hljs-title">script</span>&gt;</span> <span class="hljs-tag">&lt;<span class="hljs-title">script</span>&gt;</span><span class="javascript"> <span class="hljs-keyword">var</span> OneSignal = window.OneSignal || []; OneSignal.push([<span class="hljs-string">"init"</span>, { appId: <span class="hljs-string">"{Your App IDを置き換え}"</span>, httpPermissionRequest: {enable: <span class="hljs-literal">true</span>}, allowLocalhostAsSecureOrigin: <span class="hljs-literal">true</span>, autoRegister: <span class="hljs-literal">true</span>, notifyButton: {enable: <span class="hljs-literal">false</span>} }]); </span><span class="hljs-tag">&lt;/<span class="hljs-title">script</span>&gt;</span> <span class="hljs-tag">&lt;<span class="hljs-title">body</span>&gt;</span> <span class="hljs-tag">&lt;<span class="hljs-title">h1</span>&gt;</span>It works!<span class="hljs-tag">&lt;/<span class="hljs-title">h1</span>&gt;</span> <span class="hljs-tag">&lt;/<span class="hljs-title">body</span>&gt;</span> <span class="hljs-tag">&lt;/<span class="hljs-title">html</span>&gt;</span></code></pre> 自分で、<code>Your App IDを置き換え</code>部分を書き換えてください。<br /> <code>ブラウザから承認</code>の実行 <br /> <a href="http://localhost/">http://localhost/</a> <br /> にアクセスしてアクセスを許可をしてサイトに戻り確認作業<br /> <br /> <div class="separator" style="clear: both; text-align: center;"> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgIKS71D-BZaLMaekM0Q4MNh7F7kO98yh04-PyXMkyyr-mSU9PK4Q3uOJj2HeOUKprLhf8GkmhFF_vXyE9uZlKVEEqCIqU7oEaj9oESoxiUCHMP4qkh4FKZrS86IHJ8i848aDiFeah17SJW/s1600/Step2-6-1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="390" data-original-width="1182" height="105" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgIKS71D-BZaLMaekM0Q4MNh7F7kO98yh04-PyXMkyyr-mSU9PK4Q3uOJj2HeOUKprLhf8GkmhFF_vXyE9uZlKVEEqCIqU7oEaj9oESoxiUCHMP4qkh4FKZrS86IHJ8i848aDiFeah17SJW/s320/Step2-6-1.png" width="320" /></a></div> <br /> <br /> とここまでがSafariの設定次にその他ブラウザ対応 <br /> 個人的にですが実はSafariの方が簡単でした。<br /> <h4 id="3その他ブラウザ対応"> 3.その他ブラウザ対応</h4> 次はその他ブラウザ今回のテストはChromeで実施 <br /> この方法でFireFoxも対応可能です。<br /> <h5 id="3-1設定情報の登録"> 3-1.設定情報の登録</h5> <br /> <div class="separator" style="clear: both; text-align: center;"> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhKQYv7t3CgApaWVzmWwHIZmmrkAxK-3uhOclo2Ietkn9pvsDxJvX_QzGlLTSDuxc1nydf8Y8DLOYt3_Q8WRYpmCLXUUPpwFfybd18vqynGP-S4T10O9oXM4LQiUPFUCGuCqfRWFaGfzsuw/s1600/3-1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="198" data-original-width="1600" height="39" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhKQYv7t3CgApaWVzmWwHIZmmrkAxK-3uhOclo2Ietkn9pvsDxJvX_QzGlLTSDuxc1nydf8Y8DLOYt3_Q8WRYpmCLXUUPpwFfybd18vqynGP-S4T10O9oXM4LQiUPFUCGuCqfRWFaGfzsuw/s320/3-1.png" width="320" /></a></div> <code><br /> </code> <code><br /> </code> <code>App Setting</code> =&gt; <code>Google Chrome and Mozilla Firefox</code> =&gt; <code>CONFIGURE</code>の順番で移動<br /> <br /> <br /> <div class="separator" style="clear: both; text-align: center;"> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiuUUjmECzdwRqD5ssc9VkRXWUQPIO0SXA60hxO8jNGfF5lKN_fbSEqGkgCP2gRQD_QhgdbnQkSALkfMo_MveUkkhSvtcWRsjAIZ6Afu_jr6K_IJumDF78XejYNfov-c6CG3EjQzlkgt9ck/s1600/3-2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="897" data-original-width="1600" height="179" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiuUUjmECzdwRqD5ssc9VkRXWUQPIO0SXA60hxO8jNGfF5lKN_fbSEqGkgCP2gRQD_QhgdbnQkSALkfMo_MveUkkhSvtcWRsjAIZ6Afu_jr6K_IJumDF78XejYNfov-c6CG3EjQzlkgt9ck/s320/3-2.png" width="320" /></a></div> <br /> 入力情報がこの場合は、<code>https://localhost</code>にして<code>My site is not fully HTTPS</code>設定をチェックをつけないようにして登録します。 <br /> 色々試したのですがこうしないと正しく登録できない。<br /> <h5 id="3-2追加ファイルの設置"> 3-2.追加ファイルの設置</h5> ここで認証の前に一つ対応が入ります。 <br /> <code>index.html</code>の変更は不要なのですが追加でJSファイルが1つ必要です。<br /> <code># cd /Library/WebServer/Documents/</code> <br /> <code># sudo wget https://cdn.onesignal.com/sdks/OneSignalSDKWorker.js</code><br /> どうやらChromeやFireFoxだとローカル内のOneSignalSDKWorker.jsが必要みたいでこれを取って来る必要があります。<br /> この内容の注意したいところがあります。 <br /> 例えばサイトのアクセスが<code>http://localhost/~{ユーザ名}/index.html</code>この場合でも<code>OneSignalSDKWorker.js</code>のアクセス先は<code>http://localhost/OneSignalSDKWorker.js</code>にする必要があるところです。<br /> 少しみてみるとCrhome用のデバッグコンソールに出て来るので失敗する場合は、エラーログをチェックしてみると良いです。弦也http://www.blogger.com/profile/16272758099624685883[email protected]tag:blogger.com,1999:blog-6391798255657492422.post-56055004450140258242017-06-24T13:22:00.002+09:002017-08-14T23:53:25.017+09:00CakePHP クエリービルダー活用<p>CakePHP 3系を利用したQueryBuilderの活用法 <br> 複雑なSQL(Group BYを主体)を記載する方法を記載</p> <p>基本的に、特別なケースでない場合初期化の処理は <br> 省きController上で動作させる前提で記載します</p> <table> <thead> <tr> <th align="left">Software</th> <th align="left">Version</th> </tr> </thead> <tbody><tr> <td align="left">Postgres</td> <td align="left">9.6.1</td> </tr> <tr> <td align="left">CakePHP</td> <td align="left">3.3.16</td> </tr> </tbody></table> <p>まずはテーブルとデータを作成. <br> SQL</p> <pre class="prettyprint"><code class=" hljs sql"><span class="hljs-operator"><span class="hljs-keyword">CREATE</span> <span class="hljs-keyword">TABLE</span> users ( user_id SERIAL, user_name <span class="hljs-keyword">VARCHAR</span>(<span class="hljs-number">256</span>), role <span class="hljs-keyword">VARCHAR</span>(<span class="hljs-number">32</span>) <span class="hljs-keyword">DEFAULT</span> <span class="hljs-string">'author'</span>, created_date <span class="hljs-keyword">TIMESTAMP</span> <span class="hljs-keyword">DEFAULT</span> NOW(), update_date <span class="hljs-keyword">TIMESTAMP</span> <span class="hljs-keyword">DEFAULT</span> NOW(), <span class="hljs-keyword">PRIMARY</span> <span class="hljs-keyword">KEY</span>(user_id) );</span> <span class="hljs-operator"><span class="hljs-keyword">CREATE</span> <span class="hljs-keyword">TABLE</span> products ( product_id SERIAL, product_name <span class="hljs-keyword">VARCHAR</span>(<span class="hljs-number">256</span>), price <span class="hljs-keyword">INTEGER</span>, <span class="hljs-keyword">PRIMARY</span> <span class="hljs-keyword">KEY</span>(product_id) );</span> <span class="hljs-operator"><span class="hljs-keyword">CREATE</span> <span class="hljs-keyword">TABLE</span> product_orders ( product_order_id SERIAL, product_id <span class="hljs-keyword">INTEGER</span>, <span class="hljs-keyword">date</span> TIMESAMP, user_id <span class="hljs-keyword">INTEGER</span>, <span class="hljs-keyword">PRIMARY</span> <span class="hljs-keyword">KEY</span>(product_order_id) );</span></code></pre> <p>データ用SQL</p> <pre class="prettyprint"><code class=" hljs sql"><span class="hljs-operator"><span class="hljs-keyword">INSERT</span> <span class="hljs-keyword">INTO</span> users(user_name) <span class="hljs-keyword">VALUES</span> (<span class="hljs-string">'User A'</span>), (<span class="hljs-string">'User B'</span>);</span> <span class="hljs-operator"><span class="hljs-keyword">INSERT</span> <span class="hljs-keyword">INTO</span> products(product_name, price) <span class="hljs-keyword">VALUES</span> (<span class="hljs-string">'product A'</span>, <span class="hljs-number">1000</span>), (<span class="hljs-string">'product B'</span>, <span class="hljs-number">100</span>), (<span class="hljs-string">'product C'</span>, <span class="hljs-number">200</span>);</span> <span class="hljs-operator"><span class="hljs-keyword">INSERT</span> <span class="hljs-keyword">INTO</span> product_orders(product_id, <span class="hljs-keyword">date</span>, user_id) <span class="hljs-keyword">VALUES</span> (<span class="hljs-number">1</span>, <span class="hljs-string">'2017/06/24 15:00:00'</span>, <span class="hljs-number">1</span>), (<span class="hljs-number">1</span>, <span class="hljs-string">'2017/06/24 16:00:00'</span>, <span class="hljs-number">2</span>), (<span class="hljs-number">2</span>, <span class="hljs-string">'2017/06/24 17:00:00'</span>, <span class="hljs-number">3</span>), (<span class="hljs-number">1</span>, <span class="hljs-string">'2017/06/25 15:00:00'</span>, <span class="hljs-number">2</span>), (<span class="hljs-number">2</span>, <span class="hljs-string">'2017/06/25 16:00:00'</span>, <span class="hljs-number">3</span>), (<span class="hljs-number">2</span>, <span class="hljs-string">'2017/06/26 15:00:00'</span>, <span class="hljs-number">1</span>);</span></code></pre> <p>基本的な共通処理</p> <pre class="prettyprint"><code class=" hljs lasso">use Cake<span class="hljs-subst">\</span>ORM<span class="hljs-subst">\</span>TableRegistry; <span class="hljs-keyword">public</span> function initialize(<span class="hljs-built_in">array</span> <span class="hljs-variable">$config</span>) { <span class="hljs-variable">$this</span><span class="hljs-subst">-&gt;</span>Users <span class="hljs-subst">=</span> TableRegistry<span class="hljs-tag">::get</span>(<span class="hljs-string">'Users'</span>); <span class="hljs-variable">$this</span><span class="hljs-subst">-&gt;</span>Products <span class="hljs-subst">=</span> TableRegistry<span class="hljs-tag">::get</span>(<span class="hljs-string">'Products'</span>); <span class="hljs-variable">$this</span><span class="hljs-subst">-&gt;</span>ProductOrders <span class="hljs-subst">=</span> TableRegistry<span class="hljs-tag">::get</span>(<span class="hljs-string">'ProductOrders'</span>); }</code></pre> <h2 id="1-簡単なgroup-by">1. 簡単なGroup BY</h2> <p>商品IDと合計件数を抽出</p> <p>SQL</p> <pre class="prettyprint"><code class=" hljs sql"><span class="hljs-operator"><span class="hljs-keyword">SELECT</span> product_id, <span class="hljs-aggregate">COUNT</span>(product_order_id) <span class="hljs-keyword">AS</span> total <span class="hljs-keyword">FROM</span> product_orders <span class="hljs-keyword">GROUP</span> <span class="hljs-keyword">BY</span> product_id;</span></code></pre> <p>PHP</p> <pre class="prettyprint"><code class=" hljs lasso"><span class="hljs-variable">$productOrders</span> <span class="hljs-subst">=</span> <span class="hljs-variable">$this</span><span class="hljs-subst">-&gt;</span>ProductOrders<span class="hljs-subst">-&gt;</span>find(); <span class="hljs-variable">$datas</span> <span class="hljs-subst">=</span> <span class="hljs-variable">$productOrders</span><span class="hljs-subst">-&gt;</span><span class="hljs-keyword">select</span>(<span class="hljs-preprocessor">[</span> <span class="hljs-string">'product_id'</span>, <span class="hljs-string">'total'</span> <span class="hljs-subst">=&gt;</span> <span class="hljs-variable">$productOrders</span><span class="hljs-subst">-&gt;</span>func()<span class="hljs-subst">-&gt;</span>count(<span class="hljs-string">'product_order_id'</span>) <span class="hljs-preprocessor">]</span><span class="hljs-markup">)-&gt;toArray();</span></code></pre> <ol> <li>少し複雑なGroup By</li> </ol> <pre class="prettyprint"><code class=" hljs sql"><span class="hljs-operator"><span class="hljs-keyword">SELECT</span> product_id, product_name, T1.total <span class="hljs-keyword">FROM</span> products <span class="hljs-keyword">INNER</span> <span class="hljs-keyword">JOIN</span> ( <span class="hljs-keyword">SELECT</span> product_id, <span class="hljs-aggregate">COUNT</span>(product_order_id) <span class="hljs-keyword">AS</span> total <span class="hljs-keyword">FROM</span> product_orders <span class="hljs-keyword">WHERE</span> <span class="hljs-keyword">date</span> &gt;= <span class="hljs-string">'2016/06/25'</span> <span class="hljs-keyword">GROUP</span> <span class="hljs-keyword">BY</span> product_order_id ) <span class="hljs-keyword">AS</span> T1 <span class="hljs-keyword">USING</span>(product_id)</span></code></pre> <p>PHP</p> <pre class="prettyprint"><code class=" hljs lasso"><span class="hljs-variable">$products</span> <span class="hljs-subst">=</span> <span class="hljs-variable">$this</span><span class="hljs-subst">-&gt;</span>Products<span class="hljs-subst">-&gt;</span>find(); <span class="hljs-variable">$productOrders</span> <span class="hljs-subst">=</span> <span class="hljs-variable">$this</span><span class="hljs-subst">-&gt;</span>ProductOrders<span class="hljs-subst">-&gt;</span>find(); <span class="hljs-variable">$datas</span> <span class="hljs-subst">=</span> <span class="hljs-variable">$productOrders</span><span class="hljs-subst">-&gt;</span><span class="hljs-keyword">select</span>(<span class="hljs-preprocessor">[</span> <span class="hljs-string">'product_id'</span>, <span class="hljs-string">'total'</span> <span class="hljs-subst">=&gt;</span> <span class="hljs-variable">$productOrders</span><span class="hljs-subst">-&gt;</span>func()<span class="hljs-subst">-&gt;</span>count(<span class="hljs-string">'product_order_id'</span>)<span class="hljs-subst">-&gt;</span><span class="hljs-keyword">where</span>(<span class="hljs-preprocessor">[</span><span class="hljs-string">'date'</span> <span class="hljs-subst">=&gt;</span> <span class="hljs-literal">new</span> Time(<span class="hljs-string">'2017-06-25'</span>)<span class="hljs-preprocessor">]</span><span class="hljs-markup">) ]); $productsRecored = $products-&gt;join(</span><span class="hljs-preprocessor">[</span> <span class="hljs-string">'T1'</span> <span class="hljs-subst">=&gt;</span> <span class="hljs-preprocessor">[</span> <span class="hljs-string">'table'</span> <span class="hljs-subst">=&gt;</span> <span class="hljs-variable">$datas</span>, <span class="hljs-string">'type'</span> <span class="hljs-subst">=&gt;</span> <span class="hljs-string">'INNER'</span>, <span class="hljs-string">'conditions'</span> <span class="hljs-subst">=&gt;</span> <span class="hljs-string">'T1.product_id = Products.product_id'</span>, <span class="hljs-preprocessor">]</span><span class="hljs-markup"> ])-&gt;select(</span><span class="hljs-preprocessor">[</span> <span class="hljs-string">"product_id"</span>, <span class="hljs-string">"product_name"</span>, <span class="hljs-string">"total"</span> <span class="hljs-subst">=&gt;</span> <span class="hljs-string">"T1.total"</span> <span class="hljs-preprocessor">]</span><span class="hljs-markup">)-&gt;toArray(); </span></code></pre> <p>自分が困ったSQLを記載</p>弦也http://www.blogger.com/profile/16272758099624685883[email protected]tag:blogger.com,1999:blog-6391798255657492422.post-16732577901087410192016-07-24T17:52:00.001+09:002016-07-24T17:52:54.542+09:00Cakephp3を利用しShellでComponentを利用する.cakephp3を利用してShellでComponentを呼び出すのが<br /> 少し面倒だったのでまとめ<br /> <br /> <h3>src/Controller/Component/TestsComponent.php</h3><pre class="prettyprint">&lt?php namespace App\Controller\Component; use Cake\Controller\Component; class TestsComponent extends Component { public function test() { echo "OK\n"; } } </pre><br /> <h3>src/Shell/SampleShell.php</h3><pre class="prettyprint">&lt?php namespace App\Shell; use Cake\Console\ConsoleOptionParser; use Cake\Console\Shell; use Cake\Log\Log; use Psy\Shell as PsyShell; use Cake\Controller\Component; use Cake\Controller\ComponentRegistry; use App\Controller\Component\TestsComponent; class SampleShell extends Shell { public function initialize() { $this->Tests = new TestsComponent(new ComponentRegistry()); } public function main() { $this->Tests->test(); } } </pre><br /> どうやらオートロードできないみたいなので自分でコンポーネントを初期化する必要があるみたいです。<br /> Abstract化したりしてリフレクション的な感じで簡易化できそうな気もするのでできたら追記予定。<br /> <br /> 弦也http://www.blogger.com/profile/16272758099624685883[email protected]tag:blogger.com,1999:blog-6391798255657492422.post-51367720110019589142016-07-02T13:00:00.002+09:002016-07-02T13:00:35.203+09:00CentOS 7にTensorFlowをインストールする自分メモ<br /> <br /> 以下のWindowsにVirutal Boxをインストールし実施<br /> <br /> <br /> <ul> <li>Virtual Box 5.0.22 r108108</li> <li>実施日:2016/06/28</li> <li>OS CentOS-7-x86_64-Minimal-1511</li> </ul> <br /> <br /> 普通にインストールしてネットワークが起動しない場合は以下を実施して対処<br /> <br /> ネットーワークの起動<br /> インストール時にonbootをonにしていない場合はこの設定が必要です。<br /> $ nmcli c<br /> =====<br /> NAME UUID TYPE DEVICE <br /> enp0s3 xxxxxxx-xxxxx-xxxx-xxxxx-xxxxxxxxxxx 802-3-ethernet enp0s3 <br /> =========<br /> <br /> enp0s3がデバイスのID<br /> <br /> onbootを有効にする。<br /> $ nmcli c m enp0s3 connection.autoconnect yes<br /> <br /> ネットワークの再起動<br /> $ systemctl restart NetworkManager<br /> $ systemctl restart network<br /> <br /> IPアドレスの確認<br /> $ ip addr<br /> <br /> <br /> pipのインストール<br /> $ yum install -y epel-release<br /> $ yum install -y python-pip<br /> $ pip install pip --upgrade<br /> <br /> その他ライブラリのインストール<br /> $ yum install -y python-devel python-virtualenv<br /> <br /> TensorFlowのインストール<br /> $ pip install --upgrade https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.9.0-cp27-none-linux_x86_64.whl<br /> <br /> TensorFlowの環境設定ファイルを設置<br /> $ virtualenv --system-site-packages ~/tensorflow<br /> <br /> <br /> TensorFlowの設定を呼び出し<br /> $ source ~/tensorflow/bin/activate<br /> <br /> <br /> $ vi test.py<br /> ========以下を貼り付け============<br /> import tensorflow as tf<br /> import numpy as np<br /> ==================================<br /> <br /> <br /> $ python test.py<br /> エラーが出なければ成功<br /> <br /> <br /> <br /> まとめ<br /> CentOS6系とかと比べてほとんど変わらないです。弦也http://www.blogger.com/profile/16272758099624685883[email protected]tag:blogger.com,1999:blog-6391798255657492422.post-10569922444104318432015-12-14T23:03:00.000+09:002015-12-15T00:43:54.249+09:00Tensorflowで学ぶ最急降下法Tensorflowで学ぶ最急降下法<br /> <br /> ありきたりですが、Tensorflowの初期サンプルに掲載されている<br /> 最急降下法(train.GradientDescentOptimizer)の解説です。<br /> <br /> 最急降下法とは、ある式を作りその式に基づき<br /> 微分を行いもっとも傾きから最小の値を算出する手法です。<br /> <br /> <br /> TensorFlowのget startedにあるIntroductionが<br /> この最急降下法のサンプルとなります。<br /> <br /> 大まかなフローとしては<br /> Step1.初期データ作成<br /> Step2.予測モデルする方程式を作成<br /> Step3.ロス関数と目標設定を作成<br /> Step4.最適化の実行<br /> すごくざっくりですがこの4ステップで最急降下法を実現しています。<br /> <br /> <code class="prettyprint"><br /> # おまじない<br /> import tensorflow as tf<br /> import numpy as np<br /> <br /> ### Step1.初期データ作成 ###<br /> # ランダムなxの値を作成<br /> x_data = np.random.rand(100).astype("float32")<br /> # y = 0.1x + 0.3の式に基づいた値を算出<br /> y_data = x_data * 0.1 + 0.3<br /> <br /> ### Step2.予測モデルする方程式を作成 ###<br /> # W 上でいう aに値する係数を初期値として-1.0~1.0の範囲でランダム生成<br /> W = tf.Variable(tf.random_uniform([1], -1.0, 1.0))<br /> # bの値を初期値0で作成<br /> b = tf.Variable(tf.zeros([1]))<br /> # y = W * x + bを再現<br /> y = W * x_data + b<br /> <br /> ### Step3.ロス関数と目標設定を作成 ###<br /> # 予想した結果y - 実際のyのデータ二乗した結果の平均をlossと位置付ける<br /> loss = tf.reduce_mean(tf.square(y - y_data))<br /> # Learning Rateの指定<br /> optimizer = tf.train.GradientDescentOptimizer(0.5)<br /> # lossが最小化する値を目的に置く<br /> train = optimizer.minimize(loss)<br /> <br /> ### Step4.最適化の実行 ###<br /> # TensorFlowの実行準備<br /> init = tf.initialize_all_variables()<br /> <br /> # graphの準備<br /> sess = tf.Session()<br /> sess.run(init)<br /> <br /> # 201回の最適化を実行<br /> for step in xrange(201):<br /> sess.run(train)<br /> # 20回毎に途中の値を出力<br /> if step % 20 == 0:<br /> print step, sess.run(W), sess.run(b)<br /> </code><br /> <br /> この流れになります。<br /> 何の脈略もないのですが自己理解のための簡易解説となります。弦也http://www.blogger.com/profile/16272758099624685883[email protected]tag:blogger.com,1999:blog-6391798255657492422.post-35395051761057961902015-12-01T01:57:00.004+09:002015-12-01T01:59:10.499+09:00Apps ScriptとQiita APIを利用してGoogleスプレットシートにデータを書き込むQiitaの情報を自分なりに見やすくしたいと思い<br /> APIを利用しExcelのような形で見れるようにできないかと奮闘の備忘録<br /> <br /> まずは準備<br /> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5bz44vOY3ZaWWaEJyrMhLrm0-vNwb8y0V54NCtoO8AAi2RaLADeF2MBTyVEw-e9G5pQ2teA5Uk1WCmA2hUTFSNDYbt7_HJhn6qKBCO57z_bjYVORmEIXk8k-6Z1oIuJfvHCGa3P8KHjhW/s1600/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588+2015-11-30+22.51.26.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="107" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5bz44vOY3ZaWWaEJyrMhLrm0-vNwb8y0V54NCtoO8AAi2RaLADeF2MBTyVEw-e9G5pQ2teA5Uk1WCmA2hUTFSNDYbt7_HJhn6qKBCO57z_bjYVORmEIXk8k-6Z1oIuJfvHCGa3P8KHjhW/s320/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588+2015-11-30+22.51.26.png" width="320" /></a>Qiita APIを利用すために個人用認証トークンを取得設定=>アプリケーション<br /> から設定可能で今回は読み込みだけなので「read_qiita」で発行以後のソースにこちらの認証トークンを利用します。<br /> <br /> <br /> <br /> <br /> <br /> <br /> 続いてGoogle Drive上にファイルを作成2つのファイルを作成します。<br /> <br /> まずは、Google Drive上でスプレットシートを作成<br /> 作成自体は簡単です。<br /> 続いて名前を付けて保存します。<br /> <br /> <div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhvUh_nTntTgoacRzomcmKohseC5LY8bm9rCkUh1OtW0EtMJh89-Sus2Uo20Uuj7ps8r1CfH2Fn8azwhPIKtCUKLPtXkpU24i8_QmCCsAFFlQHGzSn_YF7jn1ZxYxxyNE2YtyE9PaGjJFWD/s1600/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588+2015-11-30+23.13.41.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="132" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhvUh_nTntTgoacRzomcmKohseC5LY8bm9rCkUh1OtW0EtMJh89-Sus2Uo20Uuj7ps8r1CfH2Fn8azwhPIKtCUKLPtXkpU24i8_QmCCsAFFlQHGzSn_YF7jn1ZxYxxyNE2YtyE9PaGjJFWD/s320/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588+2015-11-30+23.13.41.png" width="320" /></a></div><br /> ここでは、ファイル名「Qiita」シート名「lists」とします。<br /> またA列にid,B列にtitle,C列にcreate date,D列にurl,E列にtagsを入れます。 <br /> <br /> <br /> 名称はなんでも良いですが見出しとして入れてください。<br /> ※<b>シート名はApps sciprtで利用しますので注意してください。</b><br /> <br /> <br /> <br /> もう一つ必要なのがスプレットシートのIDです<br /> IDはURLから取得できます。<br /> <br /> パターンとしては<br /> https://docs.google.com/spreadsheets/d/{ID}/edit#gid=0&amp;vpid=A1<br /> 上記の{ID}部分がIDとなります。<br /> <br /> <br /> 例として以下となります。<br /> <div class="separator" style="clear: both; font-family: -webkit-standard; text-align: center; white-space: normal;"></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_iGE9NbQ_sqRYRSjCH1SRzgFUGSzPPMQWl_zcE5Lnt6XwH3tUnbA2eDKAfCVsjx8VCxdmQgBWiXLkeaRsM8JNF1a5GSMJbbnRYeSeHuJIYveOA6S2jx1VjyI5CMsyUKYZqPe0spR_swBK/s1600/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588+2015-11-30+23.01.32.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="24" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_iGE9NbQ_sqRYRSjCH1SRzgFUGSzPPMQWl_zcE5Lnt6XwH3tUnbA2eDKAfCVsjx8VCxdmQgBWiXLkeaRsM8JNF1a5GSMJbbnRYeSeHuJIYveOA6S2jx1VjyI5CMsyUKYZqPe0spR_swBK/s640/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588+2015-11-30+23.01.32.png" width="640" /></a></div><br /> <br /> <br /> 青く塗られている部分がこのシートのIDになります。<br /> <b>※URLにアクセスしてもすでに削除済みなので開くことができません。</b><br /> <b><br /> </b><br /> <b><br /> </b><br /> <br /> ようやく本題<br /> apps scriptを利用していきます。<br /> <br /> apps scriptが有効でない場合は以下の処理が必要です。<br /> <div class="separator" style="clear: both; text-align: center;"></div><br /> <div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEht9wmELB_7wcj60jDM2kVpfnzFpc3fl-zBwj9H57bajva63dH_sriqM6R077Pv4BdFvhskothxkg3A6cbet5mN3ULuXL6pN3KGYUDQFSZYzBNZIYKxr85zQHXX6Qyk3jlD0UpO9IFuNtRs/s1600/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588+2015-11-30+23.05.42.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="156" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEht9wmELB_7wcj60jDM2kVpfnzFpc3fl-zBwj9H57bajva63dH_sriqM6R077Pv4BdFvhskothxkg3A6cbet5mN3ULuXL6pN3KGYUDQFSZYzBNZIYKxr85zQHXX6Qyk3jlD0UpO9IFuNtRs/s200/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588+2015-11-30+23.05.42.png" width="200" /></a></div><br /> 新規=>その他=>アプリを追加に行きます。<br /> 検索で「apps script」と検索すると以下がでます。<br /> <br /> こちらを追加してください。<br /> 追加ができれば前の図様ように「Google Apps Script」が表示されます。<br /> こちらを選択しApps Scriptを新規作成します。<br /> <br /> <br /> <br /> <br /> コードは以下です。<br /> コード実行時にアクセス許可をもめられうので許可して実行.<br /> ファイル名:qiita<br /> <hr /><pre class="prettyprint">function myFunction() { // スプレッドシートのID. var spreadsheetId = '{ID}';  // スプレッドシートのシート名. var spreadsheetName = 'list'; // Qiita APIのURL. var url = 'https://qiita.com/api/v2/items?page=1&amp;per_page=100'; // スプレッドシートにアクセス. var spreadsheetData = SpreadsheetApp.openById(spreadsheetId); // スプレッドシートのシートにアクセス. var sheet = spreadsheetData.getSheetByName(spreadsheetName) // シートのデータを取得. var sheetdata = sheet.getSheetValues(1, 1, sheet.getLastRow(), sheet.getLastColumn()); // Qiita APIからデータを取得. var qiitas = getHttpQiitaApiRequest(url); // Qiita APIから取得したデータを列へ挿入. for (var n in qiitas) { var qitta = qiitas[n]; var isCheck = findById(sheetdata, qitta.id); // 既に存在しているか確認. if (!isCheck) write(sheet, qitta); else break; } // ソートをcreate dateで降順にソート var sortRange = sheet.getRange(2, 1, sheet.getLastRow(), sheet.getLastColumn()); sortRange.sort([{column: 3, ascending: false}, {column: 1, ascending: true}]); } /** * Qiita APIにアクセスしデータを取得します. */ function getHttpQiitaApiRequest(url) { // 認証トークンをセット var options = { 'method' : 'get', 'headers' : { 'Authorization' : 'Bearer {認証トークン}' } }; // HTTPリクエストを送信. var response = UrlFetchApp.fetch(url, options); // レスポンス結果を取得. var text = response.getContentText("UTF-8"); // JSONパース. return JSON.parse(text); } /** * シートから重複するIDを検索します. * true: 既にIDが存在する場合. false: IDが存在しない場合. */ function findById(sheetdata, id) { for (var i in sheetdata) { // IDの重複チェック if (sheetdata[i][0] == id) return true; } return false; } /** * シートにデータを書き込みます. */ function write(sheet, qitta) { // 最終行を取得. var n = sheet.getLastRow() + 1; // 日付の書式を変更 var date = qitta.created_at.replace(/T/g, ' ').replace(/\+09:00/g, ' '); // データの書き込み sheet.getRange(n, 1).setValue(qitta.id); sheet.getRange(n, 2).setValue(qitta.title); sheet.getRange(n, 3).setValue(date); sheet.getRange(n, 4).setValue(qitta.url); var tag = ""; for (var i in qitta.tags) { tag += qitta.tags[i].name + ","; } sheet.getRange(n, 5).setValue(tag); } </pre><hr />これを動かせば下図のような結果となります。<br /> <div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgkmkO3Kqz7taA5ZXRSlaVLmiu4rwe7OTVtWErfLsK6tonAwXr1Oeu6CUhEpO60ENFyuGavCqGCYYV7JVGgx4QJWP_xu619Ir3OIQBe-q_tI5gELWWSYCkTktS1UeulFJn8tFb4FJ8a45G-/s1600/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588+2015-11-30+23.24.36.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="12" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgkmkO3Kqz7taA5ZXRSlaVLmiu4rwe7OTVtWErfLsK6tonAwXr1Oeu6CUhEpO60ENFyuGavCqGCYYV7JVGgx4QJWP_xu619Ir3OIQBe-q_tI5gELWWSYCkTktS1UeulFJn8tFb4FJ8a45G-/s320/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588+2015-11-30+23.24.36.png" width="320" /></a></div><br /> <br /> <br /> 以上となります。<br /> スケジューラーに組み込むと毎時更新とかが可能です。<br /> Apps Scriptが思っている以上に色々できるので細々したの作成中です。弦也http://www.blogger.com/profile/16272758099624685883[email protected]tag:blogger.com,1999:blog-6391798255657492422.post-9249403666997190762015-11-25T00:30:00.000+09:002015-12-14T22:47:44.511+09:00node.js配列データを同期処理する方法Node.jsを利用し配列データを同期処理する方法を記載<br /> <br /> どのように表現して良いかわからないのですが<br /> 以下のようなデータの処理です。<br /> <br /> <br /> <pre class="pretty print">var datas = [{"id" : "1"}, {"id" : "2"}];</pre><br /> これを<br /> id = 1<br /> id = 2<br /> と表示してくれるのを同期処理で書く方法です。<br /> 単純にfor文を利用すれば良いのではという話ではなく<br /> datasはDBに保存したいデータとらえてください。<br /> <br /> つまり実際には<br /> INSERT INTO test(id) VALUES(1);<br /> INSERT INTO test(id) VALUES(2);<br /> と上記の処理をしたい比同期処理ではどちらが先にくるか不明のため<br /> 順番に配列からSQLを実行したい場合に考えた方法です。<br /> <br /> 結論的には再起処理を行います。<br /> 実際のサンプルは以下です。<br /> <br /> <pre class="prettyprint">function insert(datas, n, callBack) { if (datas.length == n) { if (callBack != null) callBack(); return; } var sql = "INSERT INTO test(id) VALUES(" + datas[n].id + ")"; console.log(sql); // 実際にここでSQLを実行. insert(datas, n + 1, callBack); } var datas = [{"id" : "1"}, {"id" : "2"}]; insert(datas, 0, function() { console.log("complite"); }); </pre>上記のようなソースになります。<br /> <br /> <br /> INSERT INTO test(id) VALUES(1);<br /> INSERT INTO test(id) VALUES(2);<br /> complite<br /> これで同期処理のようにできます。<br /> ライブラリを使えばほかの方法もあると思うのですが<br /> 利用しない場合の考え方になります。<br /> <br /> callback地獄感もありますが、これはこれで個人的には使い勝手が良いと思っています。弦也http://www.blogger.com/profile/16272758099624685883[email protected]tag:blogger.com,1999:blog-6391798255657492422.post-19471531293577496202015-11-25T00:05:00.002+09:002015-11-25T00:16:26.093+09:00TensorFlowについて事前知識編【乱数生成】Googleから出た話題の機械学習用のライブラリTensorFlow<br /> こちらを触ろうと思い奮闘の備忘録<br /> <br /> 機械学習なんてやったことない+Pythonも初なのでサンプルを理解しようとするだけで必死とりあえず<br /> ちょっとずつまとめ<br /> ※インストール手順等は公式ドキュメントとかを見て対応していただきますようにお願いいたします。<br /> そのあたりはQiitaとかの方がすごく良いドキュメントがあります。<br /> <br /> <a href="http://www.tensorflow.org/get_started/index.html">チュートリアル</a>を見たらデータの生成があるのですが<br /> まずはここからつまづいたのでまとめる<br /> <br /> ランダムデータを作成する段階でわからなかった・・・・<br /> じつはこの「np.float32」、「np.random.rand(2, 100)」はimport文を見たらわかるのですが<br /> TensorFlowとは違いnumpyと言う数学用のライブラリです。<br /> Python発なのでわからなかった(汗汗<br /> <br /> と事前にnumpyについて少し備忘録をまとめます。<br /> <br /> <pre class="prettyprint">x_data = np.float32(np.random.rand(2, 100)) # Random input </pre>これの意味ですが、0.0〜1.0までの乱数を2次元配列で100個作るという意味になります。<br /> <br /> もっと値を小さくして2次元配列を5個つくるを実行<br /> <pre class="prettyprint">import numpy as np x_data = np.float32(np.random.rand(2, 5)) print x_data</pre>実行結果が以下<br /> <code><br /> [[ 0.22113453 0.77961475 0.08531918 0.12012649 0.43397358]<br /> [ 0.72542971 0.40160421 0.13799493 0.22445418 0.3758058 ]]<br /> </code><br /> <br /> x_data = np.float32(np.random.rand(2, 5))<br /> この中の2が次元を5が個数を表しているので変更すれば<br /> 相当な次元のデータが出来ると思います。<br /> <br /> <br /> 2次元配列で5個のランダム数が出来上がりました。<br /> では、次に1〜10の少数にしたいであればどうするかは10をかけるだけです<br /> <br /> <pre class="prettyprint">import numpy as np x_data = np.float32(np.random.rand(2, 5)) * 10 print x_data</pre><code><br /> [[ 5.39343119 5.11242962 2.86795855 7.04219055 6.99380398]<br /> [ 1.75642431 2.2877152 8.44399357 4.74935007 5.61556864]]<br /> </code><br /> <br /> 高校数学の行列のイメージで0.0〜1.0の間の数字に10をかけてくれます。<br /> ではさらに、1〜10の整数はどうするのか?<br /> 答えは以下です。<br /> <br /> <pre class="prettyprint">import numpy as np x_data = np.int32(np.random.rand(2, 5) * 10) print x_data</pre><code><br /> [[4 8 3 5 8]<br /> [1 2 0 8 0]]<br /> </code><br /> <br /> なんとなくfloat32をint32に変更すればうまいこといくと思ったのですが<br /> 先に10をかける必要がありました。 ということは0.0〜10.0までの少数も先に10をかけることも可能ということでした。<br /> まだまだ難しい・・・<br /> <br /> こちらを応用すれば整数は無限と出来ると思います。<br /> 64bit型がないか確認しところ以下できるみたいです。<br /> <br /> <pre class="prettyprint">x_data = np.int64(np.random.rand(2, 5) * 10) x_data = np.float64(np.random.rand(2, 5) * 10) </pre><br /> <br /> なんかこれ以外とテストデータ作成もこれでできそうな気がしてたw<br /> まずは基礎の基礎かと思いますが以上乱数生成に関する内容でした。弦也http://www.blogger.com/profile/16272758099624685883[email protected]tag:blogger.com,1999:blog-6391798255657492422.post-68547488085362497312015-09-28T00:22:00.000+09:002015-09-28T00:25:01.992+09:00Node.jsを利用してYoutube APIにアクセスする。Node.jsを利用したYootube APIのアクセスを行います。<br /> <br /> まずはpackage.jsonを作りましょう。<br /> npm利用のためです。<br /> <br /> package.json<br /> <pre class="prettyprint">{ "name": "youtube-sample", "version": "0.0.0", "description": "", "devDependencies": { "googleapis": "*" } } </pre><br /> 次にライブラリをインストールしましょう<br /> 先ほどのpackage.json同一フォルダで以下のコマンドを実行<br /> <pre class="prettyprint">npm install </pre><br /> 本題の部分ですが先に認証ファイルを用意する必要があります。<br /> ローカルで利用するためなのでoAuthの認証キーを取得する必要があります。<br /> <br /> Google Developer Consoleへ移動し<br /> <div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjicCUGlTCDgBy1DavnfVpdVLkitCzhhZe8bIu3WC3LHkqyBCXU_iZnVl6DkezP7xt7D4FjBpMPAq9dGNhjwKW6PbjhFAxK4vc-76z1p8OQSobVCoI17vWQJkAA3kKGY8spTrrP0lCDUUru/s1600/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588+2015-09-27+22.12.14.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjicCUGlTCDgBy1DavnfVpdVLkitCzhhZe8bIu3WC3LHkqyBCXU_iZnVl6DkezP7xt7D4FjBpMPAq9dGNhjwKW6PbjhFAxK4vc-76z1p8OQSobVCoI17vWQJkAA3kKGY8spTrrP0lCDUUru/s1600/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588+2015-09-27+22.12.14.png" /></a></div><br /> <br /> <br /> <br /> <br /> <br /> 認証情報へ移動します。<br /> <br /> 続いて「認証情報を追加」=&gt;「サービスアカウント」を選択します。<br /> <br /> <div class="separator" style="clear: both; text-align: center;"></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHhptfX-jFny31_YS0RNi6yhr22AkTKmjqupTbfKabIkmzyoQUHyB_FVfZmzHMTxibSIzUp7VqrzEFO7GmgtcMmgrLxz1nv_8cUIfrvXH7tB7dkmvAFNi_IRIyaPZ1AFmfCcyPXx4_URbv/s1600/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588+2015-09-27+22.12.24.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="195" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHhptfX-jFny31_YS0RNi6yhr22AkTKmjqupTbfKabIkmzyoQUHyB_FVfZmzHMTxibSIzUp7VqrzEFO7GmgtcMmgrLxz1nv_8cUIfrvXH7tB7dkmvAFNi_IRIyaPZ1AFmfCcyPXx4_URbv/s320/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588+2015-09-27+22.12.24.png" width="320" /></a></div><br /> <br /> <br /> <br /> <br /> <br /> <br /> <br /> <br /> <br /> <br /> <br /> <br /> <br /> 最後に「JSON」を選択してダウンロードできるファイルを保存してpackage.jsonと同じフォルダーに置いてください<br /> <br /> <br /> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifUPigG41i1Y6c1nPe8wYOAYOXuctymeNMjnY8ld5Eqf_03fxdV80xNvmPDr-BMq9T9F1bfYh0fe4GEhITH6Ud88oe-cBxbMHFWfEQy6StXPVdmuMAr8skptgwE0yhEKKMBnV1ker2uvyM/s1600/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588+2015-09-27+22.12.35.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="139" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifUPigG41i1Y6c1nPe8wYOAYOXuctymeNMjnY8ld5Eqf_03fxdV80xNvmPDr-BMq9T9F1bfYh0fe4GEhITH6Ud88oe-cBxbMHFWfEQy6StXPVdmuMAr8skptgwE0yhEKKMBnV1ker2uvyM/s320/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588+2015-09-27+22.12.35.png" width="320" /></a><br /> <br /> <br /> <br /> <br /> <br /> <br /> <br /> <br /> <br /> あとはただ使うだけだと10行前後で終わります。<br /> youtube.js<br /> <pre class="prettyprint">var google = require('googleapis'); var OAuth2 = google.auth.OAuth2; var key = require('./{ファイル名をDLしたファイルに変更}.json'); var jwtClient = new google.auth.JWT(key.client_email, null, key.private_key, ["https://www.googleapis.com/auth/youtube"], null); jwtClient.authorize(function(err, tokens) { if (err) { console.log(err); return; } var youtube = google.youtube({ version: 'v3', auth: jwtClient }); youtube.search.list({"part" : "id,snippet", q: "node.js"}, function(err2, datas) { if (err2) { console.log(err2); return; } for (var i = 0; i < datas.items.length; i++) console.log(datas.items[i]); }); }); </pre> <br /> これであとは実行だけ<br /> node youtube.js<br /> とすれば結果が帰ります。<br /> Google側が用意しているライブラリを利用すれば簡単に出来るので<br /> あとは検索の種類とかをドキュメントから探すだけで良いです。<br /> 弦也http://www.blogger.com/profile/16272758099624685883[email protected]tag:blogger.com,1999:blog-6391798255657492422.post-41574054449741932152015-03-29T23:48:00.000+09:002015-03-29T23:48:20.113+09:00Rを使って株価の株価チャート出すちょっとRを触りだし株価のチャートが出せないか検討してのでまとめました。<br /> <br /> 株価のチャート?<br /> ぱっと思いつくのがヒゲ? ロウソク?などです。<br /> 今回の内容でこのようなイメージができます。<br /> <br /> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjReJqjBY50y4IxU5mWrSgt4siJVZjC6lVhPtySpEUz5gTAqfiP9ByPzdoZpszfYCHs5y_uX3IconLGEU-XscKM0d0Xy-V7dUKLC8nMXSCNgCZYamOYMuRk4RBMrASRkPxzay1iIzwoMIA7/s1600/plot1.png" imageanchor="1"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjReJqjBY50y4IxU5mWrSgt4siJVZjC6lVhPtySpEUz5gTAqfiP9ByPzdoZpszfYCHs5y_uX3IconLGEU-XscKM0d0Xy-V7dUKLC8nMXSCNgCZYamOYMuRk4RBMrASRkPxzay1iIzwoMIA7/s320/plot1.png" /></a><br /> <br /> とある株価の3ヶ月の推移です。<br /> 出ているのは株価、25日移動平均線、75日移動平均線<br /> 出来高などが出ています。<br /> <br /> いろいろカスタマイズできるみたいですがまだ不明な点もあるので<br /> 現在鋭意ドキュメントを解読中<br /> <br /> では実際に必要なデータはどのようなものかというと以下のCSVになります。<br /> <pre class="prettyprint">"Date","Open","High","Low","Close","Volume" 2015-01-01,220,224,219,222,68000 2015-01-02,217,218,211,211,100000 2015-01-03,212,213,208,212,44000 ・ ・ ・ 2015-03-25,212,213,208,212,44000 </pre>それぞれ、ヘッダーが<br /> 日付,初値,高値,安値,終値,出来高<br /> を示しています。<br /> <br /> データ自体は転がっているものをまとめて持ってきたとして<br /> 使い方をご説明します。<br /> <br /> 今回は以下の要件とします。<br /> ・ヒゲグラフを出す<br /> ・過去3ヶ月の内容を出す<br /> ・25日移動平均線を出す<br /> ・75日移動平均線を出す<br /> ・出来高をだす<br /> <br /> 上記を満たす実装を作ります。<br /> 早速ソースコード<br /> <pre class="prettyprint">install.packages("quantmod") library("quantmod") loadCsv &lt;- "~/data.csv" data &lt;- read.zoo(loadCsv, header=T, sep=",") candleChart(data, theme="white",subset="last 3 months") addSMA(25, on = 1, with.col = Close, overlay = TRUE, col = "blue") addSMA(75, on = 1, with.col = Close, overlay = TRUE, col = "red") </pre><br /> このようなコードで作成ができます。<br /> Rの中でquantmodが実際に利用するライブラリです。<br /> <br /> 5行目のデータのロードまでは、おまじないとして割愛します。<br /> <br /> data &lt;- read.zoo(loadCsv, header=T, sep=",")<br /> 7行目の部分で、データを入れます。<br /> header=T<br /> こちらでヘッダーコードを無視(だと思う)<br /> <br /> sep=","<br /> セパレータの指定です。<br /> データをロードすると後は、描画だけです。<br /> <br /> <br /> candleChart(data, theme="white",subset="last 3 months")<br /> こちらで、ベースとなるチャートを出します。<br /> <br /> theme="white"<br /> 初期の色が黒背景なので、白背景に変えるのをお勧めします。(黒だと個人的には見えにく)<br /> <br /> subset="last 3 months"<br /> 3ヶ月前を出す指示を与えます。<br /> その他の場合は「2014::2015-01」のように記述します。<br /> 2014年から2015-01までを示しているのだと思うが正直まだ自信がない<br /> 日付の指定もできるのかなど検証中<br /> <br /> addSMA(25, on = 1, with.col = Cl, overlay = TRUE, col = "blue")<br /> addSMA(75, on = 1, with.col = Cl, overlay = TRUE, col = "red")<br /> 最後に2つの内容ですが移動平均を出します。<br /> 移動平均といっても正確には、単純移動平均になります。<br /> 最初の数値が何日分を指定<br /> <br /> on = 1<br /> いまのところ用途が不明だが表示系に関するものらしい<br /> <br /> with.col = Close<br /> カラムの指定になります。(おそらくこれであっている)<br /> <br /> overlay = TRUE<br /> 描画を上書きするかの指定になります。<br /> 基本TRUEになると思います。<br /> <br /> col = "red"<br /> 移動平均線の色を指定します。<br /> <br /> このような感じで実行すれば株のグラフがつくれます<br /> 後は、保存するなりをするだけです。<br /> <br /> まだ不明な点はあるのですがとりあえず。<br /> 動くものはできます。<br /> <br /> 思っている以上にドキュメンがなく苦労しました。<br /> 弦也http://www.blogger.com/profile/16272758099624685883[email protected]tag:blogger.com,1999:blog-6391798255657492422.post-48582251056848288072015-02-06T01:01:00.000+09:002015-02-06T01:15:30.005+09:00MacにMongoDB3.0をインストールNoSQLを本格的に勉強しようと思いとりあえずMongoDB3.0をインストール<br /> <br /> brewで行えば簡単そうですが、まだ(2015/02/06日現在)3.0できなさそうなので<br /> 手動にてインストール<br /> <br /> インストール先<br /> /Users/{ユーザ名}/mongoldb<br /> ※以後のユーザ名は自分の名前に書き換えて下さい.<br /> <pre class="prettyprint">$ cd ~/Downloads/ # DLと解凍しインストール $ curl -O http://downloads.mongodb.org/osx/mongodb-osx-x86_64-3.0.0-rc6.tgz $ tar -zxvf mongodb-osx-x86_64-3.0.0-rc6.tgz $ mkdir -p ~/mongodb $ cp -R -n mongodb-osx-x86_64-3.0.0-rc6/ ~/mongodb # DLしたファイルを削除 $ rm -rf mongodb-osx-x86_64-3.0.0-rc6/ $ rm mongodb-osx-x86_64-3.0.0-rc6.tgz # パスを通します. $ echo "export PATH=/Users/{ユーザ名}/mongodb/bin:\$PATH" >> ~/.bash_profile $ source ~/.bash_profile $ mkdir -p ./data/db $ mongod --dbpath ./data/db # ちなみに以下のようにするとログが書き込みできます。 $ sudo mongod --dbpath ./data/db --logpath /var/log/mongodb.log </pre><br /> 以下でアクセスするととりあえず動きました。<br /> <pre class="prettyprint">$ mongo ================================== MongoDB shell version: 3.0.0-rc6 connecting to: test Welcome to the MongoDB shell. For interactive help, type "help". For more comprehensive documentation, see http://docs.mongodb.org/ Questions? Try the support group http://groups.google.com/group/mongodb-user Server has startup warnings: 2015-02-06T01:07:50.323+0900 I CONTROL [initandlisten] ** WARNING: You are running this process as the root user, which is not recommended. 2015-02-06T01:07:50.323+0900 I CONTROL [initandlisten] > ================================== </pre><br /> <br /> launchd/launchctlを利用し、起動時に実行できるようにします。<br /> <pre class="prettyprint">sudo vi /Library/LaunchDaemons/org.mongodb.mongod.plist ====以下を貼り付け============================= <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>Label</key> <string>org.mongodb.mongod</string> <key>RunAtLoad</key> <true/> <key>ProgramArguments</key> <array> <string>/Users/{ユーザ名}/mongodb/bin/mongod</string> <string>--dbpath</string> <string>/Users/{ユーザ名}/mongodb/data/db</string> <string>--logpath</string> <string>/var/log/mongodb.log</string> </array> </dict> </plist> ========================== # 権限を付与 $ sudo chown root:wheel /Library/LaunchDaemons/org.mongodb.mongod.plist $ sudo chmod 644 /Library/LaunchDaemons/org.mongodb.mongod.plist # サービスの実行 $ sudo launchctl load /Library/LaunchDaemons/org.mongodb.mongod.plist # サービスの停止 # sudo launchctl unload /Library/LaunchDaemons/org.mongodb.mongod.plist </pre><br /> 次回に触ってみようと思います。<br /> とりあえず今日はここまで 弦也http://www.blogger.com/profile/16272758099624685883[email protected]tag:blogger.com,1999:blog-6391798255657492422.post-22030162621033398642014-11-09T16:59:00.004+09:002014-11-09T16:59:52.545+09:00Node.jsでpostgres接続するNode.jsでサーバPGをしようと思いpostgresへ接続<br /> <br /> Node.js v0.10.26<br /> postgres 9.3.2<br /> 上記バージョンにて確認<br /> <br /> Node.jsはインストールされているとして以下のパッケージをnpmでインストールする必要がある。<br /> https://github.com/brianc/node-postgres<br /> <pre>$ npm install pg </pre><br /> 使い方ですが、サーバで利用を想定して行うといかになります。<br /> <br /> <br /> <pre class="prettyprint">var pg = require('pg'); var http = require('http'); var conString = "postgres://postgres:@localhost:5432/postgres"; var server = http.createServer(); server.on('request', doRequest); server.listen(1008); function doRequest(request, response) { var client = new pg.Client(conString); client.connect(function(err) { if(err) { return console.error('could not connect to postgres', err); } client.query('SELECT NOW() AS "theTime"', function(err, result) { response.writeHead(200, {'Content-Type': 'text/html'}); if(err) { return console.error('error running query', err); } console.log(result.rows[0].theTime); response.write(result.rows[0].theTime + ""); response.end(); client.end(); }); }); }; </pre><br /> コネクションの関係も見ながら確認してみたのですが。<br /> pg.ClientはdoRequest内で行い、client.endがコネクションを閉じるメソッドのため<br /> これが必須です。これを省くとサーバが動作する限りコネクション数が増えるので注意です。<br /> 弦也http://www.blogger.com/profile/16272758099624685883[email protected]tag:blogger.com,1999:blog-6391798255657492422.post-65235454198136766492014-10-05T21:43:00.001+09:002014-10-05T21:43:20.870+09:00CentOS 6.5でPHP5.3→PHP 5.4にアップグレードするCakePHP3系を利用したいと思いPHPを5.3からアップグレード<br /> <br /> とりあえずCentOS 6.5系でPHP5.3のインストール手順<br /> <pre class="prettyprint">yum install php php-mbstring php-mbstring php-pear</pre><br /> PHP5.3からのアップレード手順<br /> <pre class="prettyprint"># yum install yum-fastestmirror # yum upgrade # yum update # rpm –import http://rpms.famillecollet.com/RPM-GPG-KEY-remi # cd /etc/yum.repos.d # wget http://rpms.famillecollet.com/remi-enterprise.repo # yum --enablerepo=remi update # /etc/init.d/httpd restart </pre><br /> 単純ですが、重要な手順です。弦也http://www.blogger.com/profile/16272758099624685883[email protected]tag:blogger.com,1999:blog-6391798255657492422.post-34827759406992288112014-07-20T19:51:00.001+09:002014-07-20T19:51:38.601+09:00AWSの勉強開始やっとこさAWSの勉強を開始するようにと思い<br /> とりあえず本を探したらおあつらえ向きの<br /> <br /> <table border="0" cellpadding="0" cellspacing="0"><tbody> <tr><td valign="top"><div style="border: 1px solid; float: left; margin: 0px; padding: 6px 0px; text-align: center; width: 320px;"> <a href="http://hb.afl.rakuten.co.jp/hgc/12e853e0.f3d18b6a.12e853e1.d20c411e/?pc=http%3a%2f%2fbooks.rakuten.co.jp%2frb%2f12779849%2f%3fscid%3daf_link_tbl&amp;m=http%3a%2f%2fm.rakuten.co.jp%2fbook%2fi%2f16940809%2f" target="_blank"><img alt="Amazon Web Services基礎からのネットワーク&サーバー構築" border="0" src="http://hbb.afl.rakuten.co.jp/hgb/?pc=http%3a%2f%2fthumbnail.image.rakuten.co.jp%2f%400_mall%2fbook%2fcabinet%2f2969%2f9784822262969.jpg%3f_ex%3d300x300&amp;m=http%3a%2f%2fthumbnail.image.rakuten.co.jp%2f%400_mall%2fbook%2fcabinet%2f2969%2f9784822262969.jpg%3f_ex%3d80x80" style="margin: 0px; padding: 0px;" /></a><br /> <div style="font-size: 12px; line-height: 1.4em; margin: 0px; padding: 2px 6px; text-align: left;"> <a href="http://hb.afl.rakuten.co.jp/hgc/12e853e0.f3d18b6a.12e853e1.d20c411e/?pc=http%3a%2f%2fbooks.rakuten.co.jp%2frb%2f12779849%2f%3fscid%3daf_link_tbl&amp;m=http%3a%2f%2fm.rakuten.co.jp%2fbook%2fi%2f16940809%2f" target="_blank">Amazon Web Services基礎からのネットワーク&サーバー構築</a><br /> 著者:玉川憲<br /> 価格:2,916円(税込、送料込)<br /> <a href="http://hb.afl.rakuten.co.jp/hgc/12e853e0.f3d18b6a.12e853e1.d20c411e/?pc=http%3a%2f%2fbooks.rakuten.co.jp%2frb%2f12779849%2f%3fscid%3daf_link_tbl&amp;m=http%3a%2f%2fm.rakuten.co.jp%2fbook%2fi%2f16940809%2f" target="_blank">楽天ブックスで詳細を見る</a></div> </div> </td></tr> </tbody></table> <br /> 7/16日発売でAWSのエバンジェリストが書かれている本だったので即買い<br /> AWSの基本的なアカウントの作り方、サーバの構築に必要な内容がまとまっていたので<br /> これから始める人向けの本です。<br /> <br /> ≪CHAPTER 1≫システム構築をインフラから始めるには<br /> ≪CHAPTER 2≫ネットワークを構築する<br /> ≪CHAPTER 3≫サーバーを構築する<br /> ≪CHAPTER 4≫Web サーバーソフトをインストールする<br /> ≪CHAPTER 5≫ HTTP の動きを確認する<br /> ≪CHAPTER 6≫プライベートサブネットを構築する<br /> ≪CHAPTER 7≫ NAT サーバーを構築する<br /> ≪CHAPTER 8≫DB を用いたブログシステムの構築<br /> ≪CHAPTER 9≫TCP/IP による通信の仕組みを理解する<br /> ≪Appendix A≫パケットキャプチャで通信をのぞいてみる<br /> ≪Appendix B≫ネットワークの管理・運用とトラブルシューティング<br /> <br /> これらの構成でなっているのですがネットワークを構築する部分に<br /> IPのセグメント分けがありこちらがためになります。<br /> <br /> よくわるWordpressのインストール等もあるのでAWSをこれからの人にオススメです弦也http://www.blogger.com/profile/16272758099624685883[email protected]tag:blogger.com,1999:blog-6391798255657492422.post-18159760378966658912014-07-13T16:29:00.001+09:002014-07-13T16:30:57.212+09:00TitaniumでNow Loadingを使ったHTTPClientを実装スマホアプリを作成する際によくある話ですが<br /> Web通信部分(<span style="font-family: Monaco; font-size: 11px;">Ti.Network.createHTTPClient)</span>を利用すると<br /> 非同期通信で画面の制御が面倒なことがあるので<br /> これを回避する1つの方法No Loading...を実装してみました。<br /> <br /> 利用するのは、ActivityIndicatorと呼ばれるのものでこれを利用しバックグラウンドでは<br /> Web通信を画面では、Now Loadingを表示します。<br /> <br /> <pre class="">index.js</pre> <pre class="">=========</pre> <pre class=""><div style="font-family: Monaco; font-size: 11px;"> <span style="color: #0326cc;">function </span>doClick(e) {</div> <div style="font-family: Monaco; font-size: 11px;"> &nbsp; &nbsp; <span style="color: #0326cc;">var </span>loading = Alloy.createController(<span style="color: #3933ff;">'loading'</span>,{</div> <div style="font-family: Monaco; font-size: 11px;"> &nbsp; &nbsp; <span class="Apple-tab-span"> </span>handler : <span style="color: #0326cc;">function</span>(client, e){</div> <div style="font-family: Monaco; font-size: 11px;"> &nbsp; &nbsp; <span class="Apple-tab-span"> </span>Ti.API.info(<span style="color: #3933ff;">"Received text: "</span> + client.responseText);</div> <div style="font-family: Monaco; font-size: 11px;"> &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; <span class="Apple-tab-span"> </span>alert(<span style="color: #3933ff;">'success'</span>);</div> <div style="font-family: Monaco; font-size: 11px;"> <span class="Apple-tab-span"> </span>&nbsp; &nbsp; }</div> <div style="font-family: Monaco; font-size: 11px;"> &nbsp; &nbsp; });<span class="Apple-tab-span"> </span></div> <div style="font-family: Monaco; font-size: 11px;"> &nbsp; &nbsp; loading.getView().open();</div> <div style="font-family: Monaco; font-size: 11px; min-height: 15px;"> }</div> <div style="font-family: Monaco; font-size: 11px; min-height: 15px;"> $.index.open();</div> </pre> <span style="font-family: monospace; white-space: pre;">=========</span><br /> <div> <span style="font-family: monospace; white-space: pre;"><br /></span></div> <div> <span style="font-family: monospace; white-space: pre;">index.tss</span></div> <div> <span style="font-family: monospace; white-space: pre;">=========</span></div> <div> <div style="color: #a55f4d; font-family: Monaco; font-size: 11px;"> ".container"<span style="color: black;">: {</span></div> <div style="font-family: Monaco; font-size: 11px;"> <span class="Apple-tab-span" style="white-space: pre;"> </span>backgroundColor:<span style="color: #3933ff;">"white"</span></div> <div style="font-family: Monaco; font-size: 11px;"> },</div> <div style="color: #a55f4d; font-family: Monaco; font-size: 11px;"> "Label"<span style="color: black;">: {</span></div> <div style="font-family: Monaco; font-size: 11px;"> <span class="Apple-tab-span" style="white-space: pre;"> </span>top: 30,</div> <div style="font-family: Monaco; font-size: 11px;"> <span class="Apple-tab-span" style="white-space: pre;"> </span>width: Ti.UI.SIZE,</div> <div style="font-family: Monaco; font-size: 11px;"> <span class="Apple-tab-span" style="white-space: pre;"> </span>height: Ti.UI.SIZE,</div> <div style="font-family: Monaco; font-size: 11px;"> <span class="Apple-tab-span" style="white-space: pre;"> </span>color: <span style="color: #3933ff;">"#000"</span></div> <div style="font-family: Monaco; font-size: 11px;"> }</div> <span style="font-family: monospace; white-space: pre;">=========</span></div> <div> <span style="font-family: monospace; white-space: pre;"><br /></span></div> <div> <span style="font-family: monospace; white-space: pre;">index.xml</span></div> <div> <span style="font-family: monospace; white-space: pre;">=========</span></div> <div> <span style="font-family: Monaco; font-size: 11px;">&lt;</span><span style="color: #011993; font-family: Monaco; font-size: 11px;">Alloy</span><span style="font-family: Monaco; font-size: 11px;">&gt;</span></div> <div style="color: #008f00; font-family: Monaco; font-size: 11px;"> <span style="color: black;">&nbsp; &nbsp; &lt;</span><span style="color: #011993;">Window </span><span style="color: black;">class=</span>"container"<span style="color: black;">&gt;</span></div> <div style="font-family: Monaco; font-size: 11px;"> &nbsp; &nbsp; &nbsp; &nbsp; &lt;<span style="color: #011993;">Label </span>id=<span style="color: #008f00;">"label" </span>onClick=<span style="color: #008f00;">"doClick"</span>&gt;Hello, World&lt;/<span style="color: #011993;">Label</span>&gt;</div> <div style="color: #011993; font-family: Monaco; font-size: 11px;"> <span style="color: black;">&nbsp; &nbsp; &lt;/</span>Window<span style="color: black;">&gt;</span></div> <div style="color: #011993; font-family: Monaco; font-size: 11px;"> <span style="color: black;">&lt;/</span>Alloy<span style="color: black;">&gt;</span></div> <span style="font-family: monospace; white-space: pre;">=========</span><br /> <div> <span style="font-family: monospace; white-space: pre;"><br /></span></div> <div> <span style="font-family: monospace; white-space: pre;"><br /></span></div> <div> <span style="font-family: monospace; white-space: pre;">loading.js</span></div> <div> <span style="font-family: monospace; white-space: pre;">=========</span></div> <div> <div style="font-family: Monaco; font-size: 11px;"> <span style="color: #0326cc;">var </span>args = arguments[0] || {};</div> <div style="font-family: Monaco; font-size: 11px;"> <span style="color: #0326cc;">function </span>showIndicator(e){</div> <div style="font-family: Monaco; font-size: 11px;"> &nbsp; &nbsp; $.activityIndicator.show();</div> <div style="font-family: Monaco; font-size: 11px;"> }</div> <div style="color: #3933ff; font-family: Monaco; font-size: 11px;"> <span style="color: #0326cc;">var </span><span style="color: black;">url = </span>"http://www.google.co.jp/"<span style="color: black;">;</span></div> <div style="font-family: Monaco; font-size: 11px;"> <span style="color: #0326cc;">var </span>client = Ti.Network.createHTTPClient({</div> <div style="font-family: Monaco; font-size: 11px;"> <span class="Apple-tab-span" style="white-space: pre;"> </span>onload : <span style="color: #0326cc;">function</span>(e) {</div> <div style="font-family: Monaco; font-size: 11px;"> <span class="Apple-tab-span" style="white-space: pre;"> </span>&nbsp; &nbsp; args.handler(<span style="color: #a55f4d;">this</span>, e);</div> <div style="font-family: Monaco; font-size: 11px;"> <span class="Apple-tab-span" style="white-space: pre;"> </span>&nbsp; &nbsp; $.loading.close();</div> <div style="font-family: Monaco; font-size: 11px;"> <span class="Apple-tab-span" style="white-space: pre;"> </span>&nbsp; &nbsp; $.activityIndicator.hide();</div> <div style="font-family: Monaco; font-size: 11px;"> <span class="Apple-tab-span" style="white-space: pre;"> </span>},</div> <div style="font-family: Monaco; font-size: 11px;"> <span class="Apple-tab-span" style="white-space: pre;"> </span>onerror : <span style="color: #0326cc;">function</span>(e) {</div> <div style="font-family: Monaco; font-size: 11px;"> <span class="Apple-tab-span" style="white-space: pre;"> </span>&nbsp; &nbsp; Ti.API.debug(e.error);</div> <div style="font-family: Monaco; font-size: 11px;"> <span class="Apple-tab-span" style="white-space: pre;"> </span>&nbsp; &nbsp; alert(<span style="color: #3933ff;">'error'</span>);</div> <div style="font-family: Monaco; font-size: 11px;"> <span class="Apple-tab-span" style="white-space: pre;"> </span>&nbsp; &nbsp; $.loading.close();</div> <div style="font-family: Monaco; font-size: 11px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $.activityIndicator.hide();</div> <div style="font-family: Monaco; font-size: 11px;"> &nbsp; &nbsp; &nbsp; &nbsp; },</div> <div style="color: #4e9072; font-family: Monaco; font-size: 11px;"> <span style="color: black;">&nbsp; &nbsp; timeout : 5000</span></div> <div style="font-family: Monaco; font-size: 11px;"> });</div> <div style="font-family: Monaco; font-size: 11px;"> client.open(<span style="color: #3933ff;">"GET"</span>, url);</div> <div style="font-family: Monaco; font-size: 11px;"> client.send();</div> <span style="font-family: monospace; white-space: pre;">=========</span></div> <div> <span style="font-family: monospace; white-space: pre;"><br /></span></div> <div> <span style="font-family: monospace; white-space: pre;">loading.tss</span></div> <div> <div> <span style="font-family: monospace; white-space: pre;">=========</span></div> </div> <div> <div style="color: #3933ff; font-family: Monaco; font-size: 11px;"> ".container"<span style="color: black;"> : {</span></div> <div style="font-family: Monaco; font-size: 11px;"> &nbsp; &nbsp; backgroundColor: <span style="color: #3933ff;">'#999'</span>,</div> <div style="font-family: Monaco; font-size: 11px;"> &nbsp; &nbsp; opacity: 0.6,</div> <div style="font-family: Monaco; font-size: 11px;"> &nbsp; &nbsp; height:Ti.UI.FILL,</div> <div style="font-family: Monaco; font-size: 11px;"> &nbsp; &nbsp; width:Ti.UI.FILL</div> <div style="font-family: Monaco; font-size: 11px;"> }</div> </div> <span style="font-family: monospace; white-space: pre;">=========</span><br /> <div> <span style="font-family: monospace;"><span style="white-space: pre;"><br /></span></span></div> <div> <span style="font-family: monospace;"><span style="white-space: pre;">loading.xml</span></span></div> <div> <span style="font-family: monospace;"><span style="white-space: pre;">=========</span></span></div> <div> <div style="color: #011993; font-family: Monaco; font-size: 11px;"> <span style="color: black;">&lt;</span>Alloy<span style="color: black;">&gt;</span></div> <div style="color: #008f00; font-family: Monaco; font-size: 11px;"> &nbsp; &nbsp;&nbsp;<span style="color: black;">&lt;</span><span style="color: #011993;">Window </span><span style="color: black;">class=</span>"container" <span style="color: black;">onOpen=</span>"showIndicator"<span style="color: black;">&gt;</span></div> <div style="color: #008f00; font-family: Monaco; font-size: 11px;"> &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<span style="color: black;">&lt;</span><span style="color: #011993;">ActivityIndicator </span><span style="color: black;">id=</span>"activityIndicator" <span style="color: black;">message=</span>"Loading..."<span style="color: black;">/&gt;</span></div> <div style="color: #011993; font-family: Monaco; font-size: 11px;"> <span style="color: black;">&nbsp; &nbsp; &lt;/</span>Window<span style="color: black;">&gt;</span></div> <div style="color: #011993; font-family: Monaco; font-size: 11px;"> <span style="color: black;">&lt;/</span>Alloy<span style="color: black;">&gt;</span></div> <span style="font-family: monospace; white-space: pre;">=========</span></div> <div> <span style="font-family: monospace; white-space: pre;"><br /></span></div> <div> <span style="font-family: monospace; white-space: pre;">ソースはこのようになっています。</span></div> <div> <span style="font-family: monospace; white-space: pre;">loading自体はモジュールみたいな形で利用します。</span></div> <div> <span style="font-family: monospace;"><span style="white-space: pre;">順番としては</span></span></div> <div> <span style="font-family: monospace;"><span style="white-space: pre;">loadingをopen-&gt;load画面を表示-&gt;HTTPリクエスト-&gt;onload処理-&gt;画面を閉じる</span></span></div> <div> <span style="font-family: monospace;"><span style="white-space: pre;">が流れです。</span></span></div> <div> <span style="font-family: monospace;"><span style="white-space: pre;"><br /></span></span></div> <div> <span style="font-family: monospace;"><span style="white-space: pre;">意外と簡単にでき応用も利くのでおためあれ</span></span></div> <div> <span style="font-family: monospace;"><span style="white-space: pre;"><br /></span></span></div> <div> <span style="font-family: monospace;"><span style="white-space: pre;">gitに今回作った内容を公開いたしました。</span></span></div> <div> https://github.com/genyasan/ti/tree/master/loading</div> 弦也http://www.blogger.com/profile/16272758099624685883[email protected]tag:blogger.com,1999:blog-6391798255657492422.post-42277278496224254422014-07-06T21:52:00.003+09:002014-07-06T21:52:47.105+09:00CentOS 6.5にgit 1.9インストール手順今更ながらgitを行うとおもいCentOS 6.5に2014/07/06現在最新のgit 1.9.0をインストールする手順です.<br /> 使い方は追々・・・<br /> yumで一発で終わるかと思ったらなかったのでソースから最新版をビルド<br /> <br /> <pre class="prettyprint">su - $ yum install -y zlib-devel perl-devel gettext gcc curl-devel $ wget https://git-core.googlecode.com/files/git-1.9.0.tar.gz $ tar xfvz git-1.9.0.tar.gz $ cd git-1.9.0 $ ./configure $ make $ make install $ git --version git version 1.9.0 $ cd .. $ rm -rf git-1.9.0 $ rm git-1.9.0.tar.gz </pre><br /> 手順はシンプルなので後は使いこなすだけ<br /> そこそこ性能がないとmakeは数分かかりました。弦也http://www.blogger.com/profile/16272758099624685883[email protected]tag:blogger.com,1999:blog-6391798255657492422.post-4003935700228552432014-07-06T21:52:00.002+09:002014-07-06T23:29:00.570+09:00Titanium画面遷移のしかたTiを利用した画面遷移の基礎的なものを作成してみました。<br /> TiのWindowを利用すると画面遷移が行え親から子を作るようなイメージになります。<br /> イメージをまとめるため簡素なものを作成してみました。<br /> <br /> ちょこっとメモをかねて作成<br /> <br /> <br /> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7kpzro9bcRFoWKmhWiLsGsraq4Jn6sGL3oIpBKz4x43AxToGezy0qqVuYjST9KkeRyWaSwkyCbXB7wxfO9GT97sFxiKMTp_s5AUP1B-rdkbV759wyIuWjfpgoJYWhuAZBQgDBIhGyxZEn/s1600/chap1.png" imageanchor="1"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7kpzro9bcRFoWKmhWiLsGsraq4Jn6sGL3oIpBKz4x43AxToGezy0qqVuYjST9KkeRyWaSwkyCbXB7wxfO9GT97sFxiKMTp_s5AUP1B-rdkbV759wyIuWjfpgoJYWhuAZBQgDBIhGyxZEn/s320/chap1.png" height="168" width="320" /></a><br /> <br /> <table border="1"><tbody> <tr> <th></th> <th>index</th> <th>index2</th> <th>index3</th> </tr> <tr> <td>xml</td> <td valign="top"><div style="color: #011993; font-family: Monaco; font-size: 11px;"><span style="color: black;">&lt;</span>Alloy<span style="color: black;">&gt;</span></div><div style="color: #008f00; font-family: Monaco; font-size: 11px;"><span style="color: black;">&nbsp; &lt;</span><span style="color: #011993;">Window </span><span style="color: black;">class=</span>"container"<span style="color: black;">&gt;</span></div><div style="color: #008f00; font-family: Monaco; font-size: 11px;"><span style="color: black;">&nbsp; &nbsp; &lt;</span><span style="color: #011993;">Label </span><span style="color: black;">text=</span>"index2を開く" <span style="color: black;">onClick=</span>"openIndex2"<span style="color: black;">&gt;</span></div><div style="color: #011993; font-family: Monaco; font-size: 11px;"><span style="color: black;">&nbsp; &lt;/</span>Window<span style="color: black;">&gt;</span></div><br /> <div style="color: #011993; font-family: Monaco; font-size: 11px;"><span style="color: black;">&lt;/</span>Alloy<span style="color: black;">&gt;</span></div></td> <td valign="top"><div style="color: #011993; font-family: Monaco; font-size: 11px;"><span style="color: black;">&lt;</span>Alloy<span style="color: black;">&gt;</span></div><div style="color: #008f00; font-family: Monaco; font-size: 11px;"><span style="color: black;">&nbsp; &lt;</span><span style="color: #011993;">Window </span><span style="color: black;">class=</span>"container"<span style="color: black;">&gt;</span></div><div style="color: #008f00; font-family: Monaco; font-size: 11px;"><span style="color: black;">&nbsp; &nbsp; &lt;</span><span style="color: #011993;">Label </span><span style="color: black;">text=</span>"index2を閉じる" <span style="color: black;">onClick=</span>"closeIndex2" <span style="color: black;">/&gt;</span></div><div style="color: #008f00; font-family: Monaco; font-size: 11px;"><span style="color: black;">&nbsp; &nbsp; &lt;</span><span style="color: #011993;">Label </span><span style="color: black;">text=</span>"index3を開く" <span style="color: black;">onClick=</span>"openIndex3" <span style="color: black;">/&gt;</span></div><div style="color: #011993; font-family: Monaco; font-size: 11px;"><span style="color: black;">&nbsp; &lt;/</span>Window<span style="color: black;">&gt;</span></div><br /> <div style="color: #011993; font-family: Monaco; font-size: 11px;"><span style="color: black;">&lt;/</span>Alloy<span style="color: black;">&gt;</span></div></td> <td valign="top"><div style="color: #011993; font-family: Monaco; font-size: 11px;"><span style="color: black;">&lt;</span>Alloy<span style="color: black;">&gt;</span><br /> <div style="color: #008f00;"><span style="color: black;">&nbsp; &lt;</span><span style="color: #011993;">Window </span><span style="color: black;">class=</span>"container"<span style="color: black;">&gt;</span></div>&nbsp; &nbsp; &lt;Label id=<span style="color: #008f00;">"param1" </span>top=<span style="color: #008f00;">"30" </span>/&gt;<br /> <div style="color: #008f00;"><span style="color: black;">&nbsp; &nbsp; &lt;</span><span style="color: #011993;">Label </span><span style="color: black;">text=</span>"argsをチェックする" &nbsp;<span style="color: black;">top=</span>"30" <span style="color: black;">onClick=</span>"argsCheck" <span style="color: black;">/&gt;</span></div><div style="color: #008f00;"><span style="color: black;">&nbsp; &nbsp; &lt;</span><span style="color: #011993;">Label </span><span style="color: black;">text=</span>"index3を閉じる" <span style="color: black;">onClick=</span>"closeIndex3" <span style="color: black;">/&gt;</span></div><div style="color: #008f00;"><span style="color: black;">&nbsp; &nbsp; &lt;</span><span style="color: #011993;">Label </span><span style="color: black;">text=</span>"index2と3を閉じる" <span style="color: black;">onClick=</span>"closeIndex2and3" <span style="color: black;">/&gt;</span></div><span style="color: black;">&nbsp; &lt;/</span>Window<span style="color: black;">&gt;</span><br /> <br /> <span style="color: black;">&lt;/</span>Alloy<span style="color: black;">&gt;</span></div></td> </tr> <tr> <td>tss</td> <td valign="top"><div style="color: #3933ff; font-family: Monaco; font-size: 11px;">".container"<span style="color: black;"> : {</span></div><div style="font-family: Monaco; font-size: 11px;">&nbsp; backgroundColor:<span style="color: #3933ff;">'#0ff'</span>,</div><div style="font-family: Monaco; font-size: 11px;">&nbsp; top: 30,</div><div style="font-family: Monaco; font-size: 11px;">&nbsp; layout: <span style="color: #3933ff;">'vertical'</span>,</div><div style="font-family: Monaco; font-size: 11px;">}</div></td> <td valign="top"><div style="font-family: Monaco; font-size: 11px; min-height: 15px;"><span style="color: #3933ff;">".container"</span> : {</div><div style="font-family: Monaco; font-size: 11px;">&nbsp; backgroundColor:<span style="color: #3933ff;">'#f00'</span>,</div><div style="font-family: Monaco; font-size: 11px;">&nbsp; top: 30,</div><div style="font-family: Monaco; font-size: 11px;">&nbsp; layout: <span style="color: #3933ff;">'vertical'</span>,</div><div style="font-family: Monaco; font-size: 11px;">}</div></td> <td valign="top"><div style="color: #3933ff; font-family: Monaco; font-size: 11px;">".container"<span style="color: black;"> : {</span></div><div style="font-family: Monaco; font-size: 11px;">&nbsp; backgroundColor:<span style="color: #3933ff;">'#ff0'</span>,</div><div style="font-family: Monaco; font-size: 11px;">&nbsp; top: 30,</div><div style="font-family: Monaco; font-size: 11px;">&nbsp; layout: <span style="color: #3933ff;">'vertical'</span>,</div><div style="font-family: Monaco; font-size: 11px;">}</div></td> </tr> <tr> <td>js</td> <td valign="top"><div style="font-family: Monaco; font-size: 11px; min-height: 15px;"><span style="color: #0326cc;">function </span>openIndex2() {</div><div style="font-family: Monaco; font-size: 11px;">&nbsp;&nbsp;<span style="color: #0326cc;">var </span>index2 = Alloy.createController(<span style="color: #3933ff;">'index2'</span>).getView();</div><div style="font-family: Monaco; font-size: 11px;">&nbsp; index2.open();</div><div style="font-family: Monaco; font-size: 11px;">}</div><div style="font-family: Monaco; font-size: 11px;"><br /> </div><div style="font-family: Monaco; font-size: 11px;">$.index.open();</div></td> <td valign="top"><div style="font-family: Monaco; font-size: 11px;"><span style="color: #0326cc;">var </span>args = arguments[0] || {};</div><div style="font-family: Monaco; font-size: 11px; min-height: 15px;"><br /> </div><div style="font-family: Monaco; font-size: 11px;"><span style="color: #0326cc;">function </span>closeIndex2() {</div><div style="font-family: Monaco; font-size: 11px;">&nbsp; $.index2.close();</div><div style="font-family: Monaco; font-size: 11px;">}</div><div style="font-family: Monaco; font-size: 11px;"><span style="color: #0326cc;"><br /> </span></div><div style="font-family: Monaco; font-size: 11px;"><span style="color: #0326cc;">function </span>openIndex3() {</div><div style="font-family: Monaco; font-size: 11px;">&nbsp;&nbsp;<span style="color: #0326cc;">var </span>index3 = Alloy.createController(<span style="color: #3933ff;">'index3'</span>,{window : $.index2, text : <span style="color: #3933ff;">"index2の中身を入れることができる."</span>}).getView();&nbsp;</div><div style="font-family: Monaco; font-size: 11px;">&nbsp; index3.open();</div><div style="font-family: Monaco; font-size: 11px;">}</div></td> <td valign="top"><div style="font-family: Monaco; font-size: 11px;"><span style="color: #0326cc;">var </span>args = arguments[0] || {};</div><div style="font-family: Monaco; font-size: 11px; min-height: 15px;"><br /> </div><div style="font-family: Monaco; font-size: 11px;"><span style="color: #0326cc;">function </span>argsCheck() {</div><div style="font-family: Monaco; font-size: 11px;">&nbsp; alert(<span style="color: #3933ff;">"このメソッドでもargsを参照できる:"</span> + args.text)<span class="Apple-tab-span" style="white-space: pre;"> </span></div><div style="font-family: Monaco; font-size: 11px;">}</div><div style="font-family: Monaco; font-size: 11px;"><span style="color: #0326cc;">function </span>closeIndex3() {</div><div style="font-family: Monaco; font-size: 11px;">&nbsp; $.index3.close();</div><div style="font-family: Monaco; font-size: 11px;">}</div><div style="font-family: Monaco; font-size: 11px;"><span style="color: #0326cc;">function </span>closeIndex2and3() {</div><div style="font-family: Monaco; font-size: 11px;">&nbsp; $.index3.close();</div><div style="font-family: Monaco; font-size: 11px;">&nbsp; args.window.close();</div><div style="font-family: Monaco; font-size: 11px;">}</div><div style="font-family: Monaco; font-size: 11px; min-height: 15px;"><br /> </div><div style="color: #4e9072; font-family: Monaco; font-size: 11px;">// 引数を受け取る.</div><div style="font-family: Monaco; font-size: 11px;">$.param1.text = args.text;</div><div><br /> </div></td> </tr> </tbody></table><br /> 少し書き方を横着しましたgitとかに上げれればよいのですが現在勉強中。<br /> <br /> こちらのソースを実行すると画像のようになるのですが、indexはそのままindex2をopenしているだけです。<br /> Alloyから生成するためには「Alloy.createController」こちらを利用します。<br /> さらに注意点としてopenするときはviewである必要があるので「getView()」メソッドが必要です。<br /> <br /> index2のところで、自分をcloseする際には「$.index2.close();」と非常にシンプルになります。<br /> ここはおまじないでよい気がしてきました。<br /> <br /> openIndex3の点が面白いと思えるところです。<br /> Alloy.createControllerをする際に引数を渡すことができます。<br /> この引数がindex3のargsに格納され利用できるのですが。<br /> <br /> index3内の「$.param1.text = args.text;」これは理解が行いやすいのですが。<br /> あえてalertとcloseIndex2and3をつけた部分です。<br /> <br /> clickイベントを実行した際にもargsが生成した際に利用したインスタンスが利用可能な点です。<br /> これにより、alertで前のwindowであるindex2のデータを見ることができます。<br /> <br /> closeIndex2and3についても、自信と、index2を同時にcloseすることができるのです。<br /> 基本的な点かもしれないですが意外と知らないなと思いフムフムなっとく<br /> <br /> 現状ものを作るよりも、知る方が多いので苦労します。弦也http://www.blogger.com/profile/16272758099624685883[email protected]tag:blogger.com,1999:blog-6391798255657492422.post-79055417517938094842014-07-02T23:37:00.001+09:002014-07-02T23:38:14.147+09:00Titanium Sqlite対応TitaniumでDB(sqlite)対応方法です。<br /> <br /> Alloyを用いるとmodelと呼ばれる仕組みがあるので、楽にできます.<br /> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEirCo6YdiluBwFaLie1Gnbh-u6ncXalXs6FqpEprH3VC79w7xtAPm39nmNKEb7S7G5UeeS41HNVGVDLZGk6yIQCHu5J_cZiJwUU4xDCYqgDVlZ7NWX02Dqq6TtSSBUQG7WXv7o3Q8PU37us/s1600/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2014-07-02+21.48.11.png" imageanchor="1"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEirCo6YdiluBwFaLie1Gnbh-u6ncXalXs6FqpEprH3VC79w7xtAPm39nmNKEb7S7G5UeeS41HNVGVDLZGk6yIQCHu5J_cZiJwUU4xDCYqgDVlZ7NWX02Dqq6TtSSBUQG7WXv7o3Q8PU37us/s320/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2014-07-02+21.48.11.png" /></a><br /> <br /> まずはプロジェクトから右クリックで「New」→「Alloy Model」を選択。<br /> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggpTTfzEFhXiBDYhUF7POZPit5jWxrGHIykNHNQSB9YRsODFBY2R7Mbuw-x7yJ5EL4Urf9z12HWpqrfQjYl8kk7a_XkHd6td56W1Gfz-xnImPJfGZg4R2aYdACVP3HNRZhKfulA6N-nOM0/s1600/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2014-07-02+21.49.04.png" imageanchor="1"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggpTTfzEFhXiBDYhUF7POZPit5jWxrGHIykNHNQSB9YRsODFBY2R7Mbuw-x7yJ5EL4Urf9z12HWpqrfQjYl8kk7a_XkHd6td56W1Gfz-xnImPJfGZg4R2aYdACVP3HNRZhKfulA6N-nOM0/s320/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2014-07-02+21.49.04.png" /></a><br /> <br /> 続いて、実際のテーブルにあたるスキーマーを定義そうすると下のような「models」ディレクトリにファイルが出来上がる<br /> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEinUhhH30wr45JzvCkyC4o2KIXT4QwtBQXghkGd5ZE0Hb9euGFDRmC0gU4hDHKGp_nh1whuAnHqwNx2QnKlE49TUGugP2HL8LGzF2vAbEaCQO4aFIhw628_dTVK-DOgAH_lNGWjWsH9eF6n/s1600/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2014-07-02+21.52.11.png" imageanchor="1"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEinUhhH30wr45JzvCkyC4o2KIXT4QwtBQXghkGd5ZE0Hb9euGFDRmC0gU4hDHKGp_nh1whuAnHqwNx2QnKlE49TUGugP2HL8LGzF2vAbEaCQO4aFIhw628_dTVK-DOgAH_lNGWjWsH9eF6n/s320/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2014-07-02+21.52.11.png" /></a><br /> <br /> とりあえずこれでDBを利用できる状態になる。<br /> <pre class="prettyprint">exports.definition = { config: { columns: { "name": "text", "kana": "text" }, adapter: { type: "sql", collection_name: "test", idAttribute: "name" } }, extendModel: function(Model) { _.extend(Model.prototype, { // extended functions and properties go here }); return Model; }, extendCollection: function(Collection) { _.extend(Collection.prototype, { // extended functions and properties go here }); return Collection; } };</pre>1行だけ基本のソースから追加しています「idAttribute: "name"」この部分ですが<br /> この行を加えるとPKになるようになっています。<br /> どうやら初期状態では、columnsで定義された項目意外に「id」と呼ばれるPKが自動付与されるみたいです。<br /> 外部連携をする場合はPKがあらかじめ決まっている可能性が高いので「idAttribute」は覚えておいた方がよいです。<br /> また、バリデータもこちらに記載できます。 簡単なバリデータであればよいのですが<br /> 複雑なものをどのように書くかわかりきっていないのでとりあえず今は放置<br /> <br /> とりあえず、Insert,SELECT,DELETE,UPDATEを行います。<br /> <br /> INSERT<br /> <pre class="prettyprint">var testModel = Alloy.createModel("test"); testModel.set({"name" : "弦也", "kana" : "ゲンヤ"}); if (testModel.isValid()) { testModel.save(); } else { alert("登録に失敗しました."); }</pre>これで登録ができます。<br /> isValidはバリデーションなので初期ではただtrueが返却されるだけです。<br /> <br /> 少し応用しJSONのデータを組み合わせます。<br /> <pre>var xhr1 = Ti.Network.createHTTPClient({ onload: function() { var json = JSON.parse(this.responseText); var count = 0; for (var i in json) { count++; var testModel = Alloy.createModel("test"); testModel.set(json[i]); testModel.save(); } } }); xhr1.open("GET", "http://localhost/test.json"); xhr1.send();</pre>こういった感じが実用例かと思います。<br /> <br /> SELECT<br /> <pre class="prettyprint">var testModel = Alloy.createCollection("test"); testModel.fetch(); testModel.map(function(test){ Ti.API.info("name:" + test.get("name") + " kana:" + test.get("kana")); });</pre>INSERTと異なり、「Alloy.createCollection」を利用している点が注意です。<br /> fetchでデータを取得していますがこれはすべて取得になります。<br /> 当然条件を指定したいので次のように記述<br /> <pre class="prettyprint">var testModel = Alloy.createCollection("test"); testModel.fetch(query : { statement: 'SELECT * FROM test WHERE name = ?', params: ['弦也'] }}); testModel.map(function(test){ Ti.API.info("name:" + test.get("name") + " kana:" + test.get("kana")); });</pre>PDOなどでよく見る形式になりました。<br /> このfetchはいろいろな形式で記載できそうなのですがまだ模索中とりあえずこれで対応できるのでよしとしています。<br /> <br /> DELETE<br /> <pre class="prettyprint">var testModel = Alloy.createCollection('test'); testModel.fetch(query : { statement: 'SELECT * FROM test WHERE name = ?', params: ['弦也'] }}); while(testModel.length > 0) testModel.at(0).destroy(); </pre>少し面倒だがこのような書き方が一般的みたいです。<br /> while文を利用するのが一番行数が少ない書き方みたいですが<br /> その他何種類かあるのでそちらも随時試してまとめ中。<br /> <br /> UPDATE<br /> <pre class="prettyprint">var testModel = Alloy.createModel("test"); testModel.set({"name" : "弦也", "kana" : "ゲンヤ"}); if (testModel.isValid()) { testModel.save(); } else { alert("更新に失敗しました."); }</pre>どうやら、INSERT OR UPDATEと呼ばれることを内部処理されているらしく、PKが合えば更新する使用みたいです。<br /> これが「idAttribute」を利用している理由です。<br /> 自動で割り当てられたIDも便利ですがこれでは都合が悪いときがあるので臨機応変に対応です。<br /> UPDATEについては、まだ調べきれていないので自信がないですがこれで動くと思います。<br /> <br /> 以上AlloyでModelsを利用するです。<br /> もう少し応用編も今後作ってみたいと思います。弦也http://www.blogger.com/profile/16272758099624685883[email protected]tag:blogger.com,1999:blog-6391798255657492422.post-84538117667676189352014-06-17T00:15:00.003+09:002014-06-17T00:15:59.949+09:00TitaniumでJsonファイルを取得するTitaniumシリーズ Webサーバに置いてあるJsonを取得するサンプルです。<br /> 今回は自分のlocalhost内に置きます。<br /> <br /> <br /> とりあえずjsonファイルを用意.<br /> <br /> data.json<br /> <pre class="prettyprint">[{"id":7,"en_name":"fukushima","ja_name":"\u798f\u5cf6\u770c"}, {"id":8,"en_name":"ibaraki","ja_name":"\u8328\u57ce\u770c"}, {"id":9,"en_name":"tochigi","ja_name":"\u6803\u6728\u770c"}, {"id":10,"en_name":"gunma","ja_name":"\u7fa4\u99ac\u770c"}, {"id":11,"en_name":"saitama","ja_name":"\u57fc\u7389\u770c"}, {"id":12,"en_name":"chiba","ja_name":"\u5343\u8449\u770c"}, {"id":13,"en_name":"tokyo","ja_name":"\u6771\u4eac\u90fd"}, {"id":14,"en_name":"kanagawa","ja_name":"\u795e\u5948\u5ddd\u770c"}] </pre><br /> 続いて実際の読み取りプログラム<br /> <pre class="prettyprint">var url = "http://localhost/data.json"; var xhr = Ti.Network.createHTTPClient({ onload: function() { var json = JSON.parse(this.responseText); for (var i in json) { Ti.API.info(json[i]); } } }); xhr.open("GET", url); xhr.send();</pre><br /> これでできます。<br /> 意外とあっけないですが1点注意点として遅延読み取りなので<br /> ほかのプログラムがxhr.send()の後に走ります<br /> こちらが覚えておかないと大変です。<br /> <br /> 次いでにPOSTのサンプル<br /> <pre class="prettyprint">var url = "http://localhost/data.json"; var postData = { title: 'data1' }; var xhr = Ti.Network.createHTTPClient({ onload: function() { var json = JSON.parse(this.responseText); for (var i in json) { Ti.API.info(json[i]); } } }); xhr.open('POST','http://www.myblog.com/post.php'); xhr.send(postData); </pre><br /> 基礎的な点だが重要<br /> JSだからJSON.parseを利用できるのが非常に便利です。弦也http://www.blogger.com/profile/16272758099624685883[email protected]tag:blogger.com,1999:blog-6391798255657492422.post-42972029073351992632014-06-15T16:04:00.000+09:002014-06-15T16:04:08.917+09:00Titanium mobileで日付のフォーマットTitaniumの日付フォーマットを調べてみました。<br /> momentと呼ばれるライブラリを利用しているのでよく利用する。<br /> 今月末、来月末などの標準的な内容をコンソールログに出力してみました。<br /> <br /> <pre class="prettyprint">// ライブラリを呼び出し. var moment = require("alloy/moment"); // 標準出力. Ti.API.info(moment()); // 今の日付をformat化して. Ti.API.info(moment().format("YYYY/MM/DD HH:mm:ss")); // 1ヶ月後. Ti.API.info(moment().add('months', 1).format("YYYY/MM/DD HH:mm:ss")); // 今月の月初. Ti.API.info(moment().format("YYYY/MM/01 00:00:00")); // 今月末. Ti.API.info(moment().endOf('month').format("YYYY/MM/DD HH:mm:ss")); // 来月末. Ti.API.info(moment().add('months', 1).endOf('month').format("YYYY/MM/DD HH:mm:ss")); // 前月末. Ti.API.info(moment().add('months', -1).endOf('month').format("YYYY/MM/DD HH:mm:ss"));</pre><br /> こちらの内容で出力結果が以下になります。<br /> <pre class="prettyprint">[INFO] : 2014/06/15 15:58:19 [INFO] : 2014/07/15 15:58:19 [INFO] : 2014/06/01 00:00:00 [INFO] : 2014/06/30 23:59:59 [INFO] : 2014/07/31 23:59:59 [INFO] : 2014/05/31 23:59:59</pre><br /> 日付を利用したかったのでまとめましたが思っている以上に少ない・・・弦也http://www.blogger.com/profile/16272758099624685883[email protected]tag:blogger.com,1999:blog-6391798255657492422.post-3673289081265733652014-06-11T21:59:00.000+09:002014-06-11T21:59:19.104+09:00Titanium mobile Alloy ボタンを配置する少しずつやっているので順次メモを記載<br /> <br /> JS部分はとりあえず置いておいてGUI面を現在模索中第1段として<br /> ボタンの配置をいろいろしてみました。<br /> <br /> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglD9b4IGJVNXLIaxVItOX6DUQ0o3HH_DyWYj_6hGhdgs2jm0ouKb2TSnbzkCfRYvQqqHqrxuO9oMNFnpR28Q9c6bJEOWREV9FU11sXLWHgNbyQufaBvJodyczmgQ4auHo1Ex5XS9m7rkxc/s1600/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2014-06-09+23.09.48.png" imageanchor="1"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglD9b4IGJVNXLIaxVItOX6DUQ0o3HH_DyWYj_6hGhdgs2jm0ouKb2TSnbzkCfRYvQqqHqrxuO9oMNFnpR28Q9c6bJEOWREV9FU11sXLWHgNbyQufaBvJodyczmgQ4auHo1Ex5XS9m7rkxc/s320/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2014-06-09+23.09.48.png" /></a><br /> <br /> サンプルで作り上げたのがこちら画面全体配置、最小サイズ、任意のサイズ1列での分割です。<br /> <br /> index.xml<br /> <pre class="prettyprint">&lt;Alloy&gt; &lt;Window&nbsp;class="container"&gt; &nbsp;&nbsp;&lt;Button&nbsp;id="button1"&nbsp;backgroundColor="red"&nbsp;onClick="doClick"&nbsp;title="フルサイズ"&nbsp;top="10"&nbsp;/&gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;Button&nbsp;id="button2"&nbsp;backgroundColor="green"&nbsp;onClick="doClick"&nbsp;title="最小サイズ"&nbsp;top="100"&nbsp;&nbsp;/&gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;Button&nbsp;id="button3"&nbsp;backgroundColor="blue"&nbsp;onClick="doClick"&nbsp;title="サイズ固定"&nbsp;top="150"&nbsp;/&gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;ButtonBar&nbsp;id="bb1"&nbsp;backgroundColor="#369"&nbsp;top="300"&nbsp;&gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Labels&gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;Label&gt;One&lt;/Label&gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;Label&gt;Two&lt;/Label&gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;Label&gt;Three&lt;/Label&gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/Labels&gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/ButtonBar&gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;ButtonBar&nbsp;id="bb2"&nbsp;backgroundColor="#369"&nbsp;top="360"&nbsp;&gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Labels&gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;Label&gt;Single&lt;/Label&gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;Label&gt;Duo&lt;/Label&gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;Label&gt;Triple&lt;/Label&gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;Label&gt;Quad&lt;/Label&gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/Labels&gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/ButtonBar&gt; &lt;/Window&gt; &lt;/Alloy&gt; </pre><br /> index.tss<br /> <pre class="prettyprint">".container": { backgroundColor : "white", }, "#button1": { backgroundColor : "green", width : Ti.UI.FILL, height : "50dp" }, "#button2": { backgroundColor : "blue", width: "150dp", width : Ti.UI.SIZE, height : "50dp" }, "#button3": { backgroundColor : "red", width : "150dp", height : "50dp" }, "#bb1": { backgroundColor : "#369", width : Ti.UI.FILL, height : "50dp" }, "#bb2": { backgroundColor : "#369", width : Ti.UI.FILL, height : "20dp" } </pre><br /> index.xmlに配置情報、index.tssにデザイン情報を記載、雑なボタンですがAlloyを利用したボタンの初歩かと思います。<br /> Ti.UI.FILLはフルサイズとTi.UI.SIZEは最小サイズ、ButtonBarは任意の件数のボタンを配置できます。<br /> この内容はAndroid iOS両方とも使えるのでUIの共通化が便利です。<br /> 次もレイアウト中心になるかと弦也http://www.blogger.com/profile/16272758099624685883[email protected]tag:blogger.com,1999:blog-6391798255657492422.post-27441679762105882602014-06-09T20:31:00.000+09:002014-06-09T20:31:11.448+09:00Sim Freeスマホの検討現在Sim Freeのスマホを利用してるのですが(ちなみに<b>OCN Sim</b>です。<br /> 今現在使っているのはXperia SPです。2万台なのでお手頃<br /> <a href="http://linksynergy.jrs5.com/fs-bin/click?id=1DyDANcBYzU&amp;subid=&amp;offerid=281529.1&amp;type=10&amp;tmpid=11519&amp;RD_PARM1=http%3A%2F%2Fwww.expansys.jp%2Fs.aspx%3Fsearch%3DXperia%2520SP"><img alt="icon" border="0" src="http://i1.expansys.com/img/n/248651/sony-xperia-sp-lte-c5303.jpg" /></a><br /> <img alt="icon" src="http://ad.linksynergy.com/fs-bin/show?id=1DyDANcBYzU&amp;bids=281529.1&amp;type=10" height="1" width="1" /><br /> <br /> <br /> いつもXperiaシリーズを買っているので今回もそうしようと思っているのですがスペックが決めきれないので<br /> Zシリーズが主な比較対象 比較は画面やメモリーなど基本的な点価格などです。<br /> <br /> 調べてみるとよく似ているようで微妙に異なる<br /> <table border="1" cellpadding="0" cellspacing="0" dir="ltr" style="border-collapse: collapse; border: 1px solid #ccc; font-family: arial,sans,sans-serif; font-size: 13px; table-layout: fixed;"><colgroup><col width="90"></col><col width="132"></col><col width="134"></col><col width="135"></col><col width="132"></col></colgroup><tbody> <tr style="height: 20px;"><td data-sheets-value="[null,2,&quot;\u54c1\u540d&quot;]" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000; font-size: 110%; font-weight: bold; padding: 2px 3px 2px 3px; vertical-align: bottom; white-space: nowrap;">品名</td><td data-sheets-value="[null,2,&quot;Xperia Z2&quot;]" style="border-bottom: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000; font-size: 110%; font-weight: bold; padding: 2px 3px 2px 3px; vertical-align: bottom; white-space: nowrap;">Xperia Z2</td><td data-sheets-value="[null,2,&quot;Xperia Z1&quot;]" style="border-bottom: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000; font-size: 110%; font-weight: bold; padding: 2px 3px 2px 3px; vertical-align: bottom; white-space: nowrap;">Xperia Z1</td><td data-sheets-value="[null,2,&quot;Xperia Z1 Compact&quot;]" style="border-bottom: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000; font-size: 110%; font-weight: bold; padding: 2px 3px 2px 3px; vertical-align: bottom; white-space: nowrap;">Xperia Z1 Compact</td><td data-sheets-value="[null,2,&quot;Xperia Z&quot;]" style="border-bottom: 1px solid #000000; border-right: 1px solid #000000; border-top: 1px solid #000000; font-size: 110%; font-weight: bold; padding: 2px 3px 2px 3px; vertical-align: bottom; white-space: nowrap;">Xperia Z</td></tr> <tr style="height: 20px;"><td data-sheets-value="[null,2,&quot;\u753b\u50cf&quot;]" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; font-size: 110%; font-weight: bold; padding: 2px 3px 2px 3px; vertical-align: bottom; white-space: nowrap;">画像</td><td style="border-bottom: 1px solid #000000; border-right: 1px solid #000000; padding: 2px 3px 2px 3px; vertical-align: bottom;"><a href="http://linksynergy.jrs5.com/fs-bin/click?id=1DyDANcBYzU&amp;subid=&amp;offerid=281529.1&amp;type=10&amp;tmpid=11519&amp;RD_PARM1=http%3A%2F%2Fwww.expansys.jp%2Fsony-xperia-z2-unlocked-lte-16gb-purple-258978%2F" target="new"><img alt="icon" border="0" src="http://i2.expansys.com/img/l/258978/sony-xperia-z2.jpg" /></a><br /> <img alt="icon" src="http://ad.linksynergy.com/fs-bin/show?id=1DyDANcBYzU&amp;bids=281529.1&amp;type=10" height="1" width="1" /></td><td style="border-bottom: 1px solid #000000; border-right: 1px solid #000000; padding: 2px 3px 2px 3px; vertical-align: bottom;"><a href="http://linksynergy.jrs5.com/fs-bin/click?id=1DyDANcBYzU&amp;subid=&amp;offerid=281529.1&amp;type=10&amp;tmpid=11519&amp;RD_PARM1=http%3A%2F%2Fwww.expansys.jp%2Fsony-xperia-z1-unlocked-16gb-black-253049%2F" target="new"><img alt="icon" border="0" src="http://i2.expansys.com/img/l/253049/sony-xperia-z1.jpg" /></a><br /> <img alt="icon" src="http://ad.linksynergy.com/fs-bin/show?id=1DyDANcBYzU&amp;bids=281529.1&amp;type=10" height="1" width="1" /></td><td style="border-bottom: 1px solid #000000; border-right: 1px solid #000000; padding: 2px 3px 2px 3px; vertical-align: bottom;"><a href="http://linksynergy.jrs5.com/fs-bin/click?id=1DyDANcBYzU&amp;subid=&amp;offerid=281529.1&amp;type=10&amp;tmpid=11519&amp;RD_PARM1=http%3A%2F%2Fwww.expansys.jp%2Fsony-xperia-z1-compact-unlocked-lte-16gb-black-258379%2F" target="new"><img alt="icon" border="0" src="http://i2.expansys.com/img/l/258379/sony-xperia-z1-compact.jpg" /></a><br /> <img alt="icon" src="http://ad.linksynergy.com/fs-bin/show?id=1DyDANcBYzU&amp;bids=281529.1&amp;type=10" height="1" width="1" /></td><td style="border-bottom: 1px solid #000000; border-right: 1px solid #000000; padding: 2px 3px 2px 3px; vertical-align: bottom;"><a href="http://linksynergy.jrs5.com/fs-bin/click?id=1DyDANcBYzU&amp;subid=&amp;offerid=281529.1&amp;type=10&amp;tmpid=11519&amp;RD_PARM1=http%3A%2F%2Fwww.expansys.jp%2Fsony-xperia-z-unlocked-16gb-purple-241237%2F" target="new"><img alt="icon" border="0" src="http://i2.expansys.com/img/l/241237/sony-xperia-z.jpg" /></a><br /> <img alt="icon" src="http://ad.linksynergy.com/fs-bin/show?id=1DyDANcBYzU&amp;bids=281529.1&amp;type=10" height="1" width="1" /></td></tr> <tr style="height: 20px;"><td data-sheets-value="[null,2,&quot;\u30b7\u30b9\u30c6\u30e0&quot;]" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; font-size: 110%; font-weight: bold; padding: 2px 3px 2px 3px; vertical-align: bottom; white-space: nowrap;">システム</td><td data-sheets-value="[null,2,&quot;Android 4.4&quot;]" style="border-bottom: 1px solid #000000; border-right: 1px solid #000000; font-size: 110%; padding: 2px 3px 2px 3px; vertical-align: bottom; white-space: nowrap;">Android 4.4</td><td data-sheets-value="[null,2,&quot;Android 4.2&quot;]" style="border-bottom: 1px solid #000000; border-right: 1px solid #000000; font-size: 110%; padding: 2px 3px 2px 3px; vertical-align: bottom; white-space: nowrap;">Android 4.2</td><td data-sheets-value="[null,2,&quot;Android 4.3&quot;]" style="border-bottom: 1px solid #000000; border-right: 1px solid #000000; font-size: 110%; padding: 2px 3px 2px 3px; vertical-align: bottom; white-space: nowrap;">Android 4.3</td><td data-sheets-value="[null,2,&quot;Android 4.1&quot;]" style="border-bottom: 1px solid #000000; border-right: 1px solid #000000; font-size: 110%; padding: 2px 3px 2px 3px; vertical-align: bottom; white-space: nowrap;">Android 4.1</td></tr> <tr style="height: 20px;"><td data-sheets-value="[null,2,&quot;CPU&quot;]" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; font-size: 110%; font-weight: bold; padding: 2px 3px 2px 3px; vertical-align: bottom; white-space: nowrap;">CPU</td><td data-sheets-value="[null,2,&quot;2.3 GHz Quad Core&quot;]" style="border-bottom: 1px solid #000000; border-right: 1px solid #000000; font-size: 110%; padding: 2px 3px 2px 3px; vertical-align: bottom; white-space: nowrap;">2.3 GHz Quad Core</td><td data-sheets-value="[null,2,&quot;2.2 GHz Quad Core&quot;]" style="border-bottom: 1px solid #000000; border-right: 1px solid #000000; font-size: 110%; padding: 2px 3px 2px 3px; vertical-align: bottom; white-space: nowrap;">2.2 GHz Quad Core</td><td data-sheets-value="[null,2,&quot;2.2 GHz Quad Core&quot;]" style="border-bottom: 1px solid #000000; border-right: 1px solid #000000; font-size: 110%; padding: 2px 3px 2px 3px; vertical-align: bottom; white-space: nowrap;">2.2 GHz Quad Core</td><td data-sheets-value="[null,2,&quot;1.5 GHz Quad Core&quot;]" style="border-bottom: 1px solid #000000; border-right: 1px solid #000000; font-size: 110%; padding: 2px 3px 2px 3px; vertical-align: bottom; white-space: nowrap;">1.5 GHz Quad Core</td></tr> <tr style="height: 20px;"><td data-sheets-value="[null,2,&quot;\u5bb9\u91cf&quot;]" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; font-size: 110%; font-weight: bold; padding: 2px 3px 2px 3px; vertical-align: bottom; white-space: nowrap;">容量</td><td data-sheets-value="[null,2,&quot;16G&quot;]" style="border-bottom: 1px solid #000000; border-right: 1px solid #000000; font-size: 110%; padding: 2px 3px 2px 3px; vertical-align: bottom; white-space: nowrap;">16G</td><td data-sheets-value="[null,2,&quot;16G&quot;]" style="border-bottom: 1px solid #000000; border-right: 1px solid #000000; font-size: 110%; padding: 2px 3px 2px 3px; vertical-align: bottom; white-space: nowrap;">16G</td><td data-sheets-value="[null,2,&quot;16 GB&quot;]" style="border-bottom: 1px solid #000000; border-right: 1px solid #000000; font-size: 110%; padding: 2px 3px 2px 3px; vertical-align: bottom; white-space: nowrap;">16 GB</td><td data-sheets-value="[null,2,&quot;16G&quot;]" style="border-bottom: 1px solid #000000; border-right: 1px solid #000000; font-size: 110%; padding: 2px 3px 2px 3px; vertical-align: bottom; white-space: nowrap;">16G</td></tr> <tr style="height: 20px;"><td data-sheets-value="[null,2,&quot;RAM&quot;]" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; font-size: 110%; font-weight: bold; padding: 2px 3px 2px 3px; vertical-align: bottom; white-space: nowrap;">RAM</td><td data-sheets-value="[null,2,&quot;3 GB&quot;]" style="border-bottom: 1px solid #000000; border-right: 1px solid #000000; font-size: 110%; padding: 2px 3px 2px 3px; vertical-align: bottom; white-space: nowrap;">3 GB</td><td data-sheets-value="[null,2,&quot;2 GB&quot;]" style="border-bottom: 1px solid #000000; border-right: 1px solid #000000; font-size: 110%; padding: 2px 3px 2px 3px; vertical-align: bottom; white-space: nowrap;">2 GB</td><td data-sheets-value="[null,2,&quot;2 GB&quot;]" style="border-bottom: 1px solid #000000; border-right: 1px solid #000000; font-size: 110%; padding: 2px 3px 2px 3px; vertical-align: bottom; white-space: nowrap;">2 GB</td><td data-sheets-value="[null,2,&quot;2 GB&quot;]" style="border-bottom: 1px solid #000000; border-right: 1px solid #000000; font-size: 110%; padding: 2px 3px 2px 3px; vertical-align: bottom; white-space: nowrap;">2 GB</td></tr> <tr style="height: 20px;"><td data-sheets-value="[null,2,&quot;\u30c7\u30a3\u30b9\u30d7\u30ec\u30a4&quot;]" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; font-size: 110%; font-weight: bold; padding: 2px 3px 2px 3px; vertical-align: bottom; white-space: nowrap;">ディスプレイ</td><td data-sheets-value="[null,2,&quot;5.2\u30a4\u30f3\u30c1&quot;]" style="border-bottom: 1px solid #000000; border-right: 1px solid #000000; font-size: 110%; padding: 2px 3px 2px 3px; vertical-align: bottom; white-space: nowrap;">5.2インチ</td><td data-sheets-value="[null,2,&quot;5.0\u30a4\u30f3\u30c1&quot;]" style="border-bottom: 1px solid #000000; border-right: 1px solid #000000; font-size: 110%; padding: 2px 3px 2px 3px; vertical-align: bottom; white-space: nowrap;">5.0インチ</td><td data-sheets-value="[null,2,&quot;4.3\u30a4\u30f3\u30c1&quot;]" style="border-bottom: 1px solid #000000; border-right: 1px solid #000000; font-size: 110%; padding: 2px 3px 2px 3px; vertical-align: bottom; white-space: nowrap;">4.3インチ</td><td data-sheets-value="[null,2,&quot;5.0\u30a4\u30f3\u30c1&quot;]" style="border-bottom: 1px solid #000000; border-right: 1px solid #000000; font-size: 110%; padding: 2px 3px 2px 3px; vertical-align: bottom; white-space: nowrap;">5.0インチ</td></tr> <tr style="height: 20px;"><td data-sheets-value="[null,2,&quot;\u89e3\u50cf\u5ea6&quot;]" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; font-size: 110%; font-weight: bold; padding: 2px 3px 2px 3px; vertical-align: bottom; white-space: nowrap;">解像度</td><td data-sheets-value="[null,2,&quot;1920 x 1080&quot;]" style="border-bottom: 1px solid #000000; border-right: 1px solid #000000; font-size: 110%; padding: 2px 3px 2px 3px; vertical-align: bottom; white-space: nowrap;">1920 x 1080</td><td data-sheets-value="[null,2,&quot;1920 x 1080&quot;]" style="border-bottom: 1px solid #000000; border-right: 1px solid #000000; font-size: 110%; padding: 2px 3px 2px 3px; vertical-align: bottom; white-space: nowrap;">1920 x 1080</td><td data-sheets-value="[null,2,&quot;1280 x 720&quot;]" style="border-bottom: 1px solid #000000; border-right: 1px solid #000000; font-size: 110%; padding: 2px 3px 2px 3px; vertical-align: bottom; white-space: nowrap;">1280 x 720</td><td data-sheets-value="[null,2,&quot;1920x1080&quot;]" style="border-bottom: 1px solid #000000; border-right: 1px solid #000000; font-size: 110%; padding: 2px 3px 2px 3px; vertical-align: bottom; white-space: nowrap;">1920x1080</td></tr> <tr style="height: 20px;"><td data-sheets-value="[null,2,&quot;\u30ab\u30e1\u30e9&quot;]" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; font-size: 110%; font-weight: bold; padding: 2px 3px 2px 3px; vertical-align: bottom; white-space: nowrap;">カメラ</td><td data-sheets-value="[null,2,&quot;20.7 Mpixels&quot;]" style="border-bottom: 1px solid #000000; border-right: 1px solid #000000; font-size: 110%; padding: 2px 3px 2px 3px; vertical-align: bottom; white-space: nowrap;">20.7 Mpixels</td><td data-sheets-value="[null,2,&quot;20.7 Mpixels&quot;]" style="border-bottom: 1px solid #000000; border-right: 1px solid #000000; font-size: 110%; padding: 2px 3px 2px 3px; vertical-align: bottom; white-space: nowrap;">20.7 Mpixels</td><td data-sheets-value="[null,2,&quot;20.7 Mpixels&quot;]" style="border-bottom: 1px solid #000000; border-right: 1px solid #000000; font-size: 110%; padding: 2px 3px 2px 3px; vertical-align: bottom; white-space: nowrap;">20.7 Mpixels</td><td data-sheets-value="[null,2,&quot;13 Mpixels&quot;]" style="border-bottom: 1px solid #000000; border-right: 1px solid #000000; font-size: 110%; padding: 2px 3px 2px 3px; vertical-align: bottom; white-space: nowrap;">13 Mpixels</td></tr> <tr style="height: 20px;"><td data-sheets-value="[null,2,&quot;\u30cd\u30c3\u30c8\u30ef\u30fc\u30af&quot;]" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; font-size: 110%; font-weight: bold; padding: 2px 3px 2px 3px; vertical-align: bottom; white-space: nowrap;">ネットワーク</td><td data-sheets-value="[null,2,&quot;4G LTE 3G GSM&quot;]" style="border-bottom: 1px solid #000000; border-right: 1px solid #000000; font-size: 110%; padding: 2px 3px 2px 3px; vertical-align: bottom; white-space: nowrap;">4G LTE 3G GSM</td><td data-sheets-value="[null,2,&quot;LTE Bands 3G GSM&quot;]" style="border-bottom: 1px solid #000000; border-right: 1px solid #000000; font-size: 110%; padding: 2px 3px 2px 3px; vertical-align: bottom; white-space: nowrap;">LTE Bands 3G GSM</td><td data-sheets-value="[null,2,&quot;4G LTE 3G GSM&quot;]" style="border-bottom: 1px solid #000000; border-right: 1px solid #000000; font-size: 110%; padding: 2px 3px 2px 3px; vertical-align: bottom; white-space: nowrap;">4G LTE 3G GSM</td><td data-sheets-value="[null,2,&quot;LTE HSPA+ GSM&quot;]" style="border-bottom: 1px solid #000000; border-right: 1px solid #000000; font-size: 110%; padding: 2px 3px 2px 3px; vertical-align: bottom; white-space: nowrap;">LTE HSPA+ GSM</td></tr> <tr style="height: 20px;"><td data-sheets-value="[null,2,&quot;\u30ef\u30a4\u30e4\u30ec\u30b9&quot;]" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; font-size: 110%; font-weight: bold; padding: 2px 3px 2px 3px; vertical-align: bottom; white-space: nowrap;">ワイヤレス</td><td data-sheets-value="[null,2,&quot;Bluetooth: 4.0, NFC&quot;]" style="border-bottom: 1px solid #000000; border-right: 1px solid #000000; font-size: 110%; padding: 2px 3px 2px 3px; vertical-align: bottom; white-space: nowrap;">Bluetooth: 4.0, NFC</td><td data-sheets-value="[null,2,&quot;Bluetooth: 4.0, NFC&quot;]" style="border-bottom: 1px solid #000000; border-right: 1px solid #000000; font-size: 110%; padding: 2px 3px 2px 3px; vertical-align: bottom; white-space: nowrap;">Bluetooth: 4.0, NFC</td><td data-sheets-value="[null,2,&quot;Bluetooth: 4.0, NFC&quot;]" style="border-bottom: 1px solid #000000; border-right: 1px solid #000000; font-size: 110%; padding: 2px 3px 2px 3px; vertical-align: bottom; white-space: nowrap;">Bluetooth: 4.0, NFC</td><td data-sheets-value="[null,2,&quot;Bluetooth: 4.0, NFC&quot;]" style="border-bottom: 1px solid #000000; border-right: 1px solid #000000; font-size: 110%; padding: 2px 3px 2px 3px; vertical-align: bottom; white-space: nowrap;">Bluetooth: 4.0, NFC</td></tr> <tr style="height: 20px;"><td data-sheets-value="[null,2,&quot;\u30d0\u30c3\u30c6\u30ea\u30fc&quot;]" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; font-size: 110%; font-weight: bold; padding: 2px 3px 2px 3px; vertical-align: bottom; white-space: nowrap;">バッテリー</td><td data-sheets-value="[null,2,&quot;3000 mAh&quot;]" style="border-bottom: 1px solid #000000; border-right: 1px solid #000000; font-size: 110%; padding: 2px 3px 2px 3px; vertical-align: bottom; white-space: nowrap;">3000 mAh</td><td data-sheets-value="[null,2,&quot;3000 mAh (Built-in)&quot;]" style="border-bottom: 1px solid #000000; border-right: 1px solid #000000; font-size: 110%; padding: 2px 3px 2px 3px; vertical-align: bottom; white-space: nowrap;">3000 mAh (Built-in)</td><td data-sheets-value="[null,2,&quot;2300 mAh&quot;]" style="border-bottom: 1px solid #000000; border-right: 1px solid #000000; font-size: 110%; padding: 2px 3px 2px 3px; vertical-align: bottom; white-space: nowrap;">2300 mAh</td><td data-sheets-value="[null,2,&quot;2400 mAh&quot;]" style="border-bottom: 1px solid #000000; border-right: 1px solid #000000; font-size: 110%; padding: 2px 3px 2px 3px; vertical-align: bottom; white-space: nowrap;">2400 mAh</td></tr> <tr style="height: 20px;"><td data-sheets-value="[null,2,&quot;\u91cd\u91cf&quot;]" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; font-size: 110%; font-weight: bold; padding: 2px 3px 2px 3px; vertical-align: bottom; white-space: nowrap;">重量</td><td data-sheets-value="[null,2,&quot;158 g&quot;]" style="border-bottom: 1px solid #000000; border-right: 1px solid #000000; font-size: 110%; padding: 2px 3px 2px 3px; vertical-align: bottom; white-space: nowrap;">158 g</td><td data-sheets-value="[null,2,&quot;169 g&quot;]" style="border-bottom: 1px solid #000000; border-right: 1px solid #000000; font-size: 110%; padding: 2px 3px 2px 3px; vertical-align: bottom; white-space: nowrap;">169 g</td><td data-sheets-value="[null,2,&quot;137 g&quot;]" style="border-bottom: 1px solid #000000; border-right: 1px solid #000000; font-size: 110%; padding: 2px 3px 2px 3px; vertical-align: bottom; white-space: nowrap;">137 g</td><td data-sheets-value="[null,2,&quot;146 g&quot;]" style="border-bottom: 1px solid #000000; border-right: 1px solid #000000; font-size: 110%; padding: 2px 3px 2px 3px; vertical-align: bottom; white-space: nowrap;">146 g</td></tr> <tr style="height: 20px;"><td data-sheets-value="[null,2,&quot;\u30b5\u30a4\u30ba&quot;]" style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; font-size: 110%; font-weight: bold; padding: 2px 3px 2px 3px; vertical-align: bottom; white-space: nowrap;">サイズ</td><td data-sheets-value="[null,2,&quot;146.8 x 73.3 x 8.2&quot;]" style="border-bottom: 1px solid #000000; border-right: 1px solid #000000; font-size: 110%; padding: 2px 3px 2px 3px; vertical-align: bottom; white-space: nowrap;">146.8 x 73.3 x 8.2</td><td data-sheets-value="[null,2,&quot;144.4 x 73.9 x 8.5&quot;]" style="border-bottom: 1px solid #000000; border-right: 1px solid #000000; font-size: 110%; padding: 2px 3px 2px 3px; vertical-align: bottom; white-space: nowrap;">144.4 x 73.9 x 8.5</td><td data-sheets-value="[null,2,&quot;127 x 64.9 x 9.5&quot;]" style="border-bottom: 1px solid #000000; border-right: 1px solid #000000; font-size: 110%; padding: 2px 3px 2px 3px; vertical-align: bottom; white-space: nowrap;">127 x 64.9 x 9.5</td><td data-sheets-value="[null,2,&quot;139 x 71 x 7.9&quot;]" style="border-bottom: 1px solid #000000; border-right: 1px solid #000000; font-size: 110%; padding: 2px 3px 2px 3px; vertical-align: bottom; white-space: nowrap;">139 x 71 x 7.9</td></tr> </tbody></table><br /> このような感じになります。<br /> 価格的には、Z2&gt;Z1&gt;Z1 Compact&gt;Zと妥当な通りでZ1かZ1 Compactで悩み中・・・<br /> 弦也http://www.blogger.com/profile/16272758099624685883[email protected]tag:blogger.com,1999:blog-6391798255657492422.post-36969366834886430112014-06-07T14:20:00.001+09:002014-06-07T14:20:36.335+09:00Titanium mobile始めるそろそろモバイルアプリを行うかと思い、Titanium mobileを勉強中お決まりのhello worldをやってみます。<br /> ちなみにTitaniumのバージョンは2014/06/07現在の最新3.2.3です。<br /> <br /> 初回はただプロジェクトを作るだけなのでプロジェクトの作成手順が中心<br /> <br /> Step1.<br /> Titanium mobileをDLします。<a href="http://www.appcelerator.com/titanium/">こちら</a><br /> からダウンロードできますが、メアドなどの登録が必要です。<br /> <br /> ダウンロードしてからインストールは趣旨ではなので割愛(Eclipseベースのためなじみがあれば気にならないです)<br /> <a href="http://install.titanium-mobile.jp/"> Titanium™ インストールガイド </a>に詳しくあるのでご覧ください。<br /> <br /> <br /> Titaniumを起動し「Mobile App Project」を作成し以下のAlloyを選択<br /> <div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgyWG5IzspIzrfq-h-MLFgia8eY7HFrsZTNvAJbhp517mJ_TFnv2y7gEAeCQ4atTJiP30bv9azZ0yl97AQ8nE4Mhv_zm2K5VMFxjs5HAzEKRK0aIHtsmcEVZVRZ7YvrQqYRwFvvD8lJcrWE/s1600/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2014-06-07+14.04.04.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgyWG5IzspIzrfq-h-MLFgia8eY7HFrsZTNvAJbhp517mJ_TFnv2y7gEAeCQ4atTJiP30bv9azZ0yl97AQ8nE4Mhv_zm2K5VMFxjs5HAzEKRK0aIHtsmcEVZVRZ7YvrQqYRwFvvD8lJcrWE/s200/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2014-06-07+14.04.04.png" /></a></div><br /> 保存ディレクトリなどを指定<br /> <div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMlpEAMDUE7EMcgLso_mK9Afo73MgShEbtE6kPcDAIAp5nBMS4VrIDzOpYVb5qEXXiJPEW7bPoO__3EVr2boK2s2czAeLVk1BQEL7PqXkSF-wMQdAERRwShEeTzwg8DR8GOpsEi44AjkjC/s1600/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2014-06-07+14.04.59.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMlpEAMDUE7EMcgLso_mK9Afo73MgShEbtE6kPcDAIAp5nBMS4VrIDzOpYVb5qEXXiJPEW7bPoO__3EVr2boK2s2czAeLVk1BQEL7PqXkSF-wMQdAERRwShEeTzwg8DR8GOpsEi44AjkjC/s200/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2014-06-07+14.04.59.png" /></a></div><br /> これでHello worldが出来上がるデバッグモードで起動してみたがラベルがわかりにくかったので少し編集がてら下調べ<br /> <div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEja7l9MWgxWCsy29ggJDOTt6T3lh2xNVr9AUO4-aKIjutG6PjJjHV-zdBKfjfD2ejEAtocb0bvDksJyx0iYxRfbsntpnFPz89_d5T_O4u16kFeoc7FeHnETxyqtemYPKEaFDJrVJIypoW2u/s1600/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2014-06-07+14.16.09.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEja7l9MWgxWCsy29ggJDOTt6T3lh2xNVr9AUO4-aKIjutG6PjJjHV-zdBKfjfD2ejEAtocb0bvDksJyx0iYxRfbsntpnFPz89_d5T_O4u16kFeoc7FeHnETxyqtemYPKEaFDJrVJIypoW2u/s200/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2014-06-07+14.16.09.png" /></a></div><br /> 自動作成されたプロジェクトは上記画像のようになっているのでこれを確認<br /> ルートディレクトリにある以下のディレクトリはおそらくそれぞれの役割で<br /> app:ソースコードを記載する<br /> plugins:ライブラリの管理<br /> みたいに思えます。<br /> <br /> appディレクトリを中心に見ると<br /> assets:画像とか?<br /> controllers:メイン処理<br /> models:まだわからない<br /> styles:css?のようなファイルがある デザインに利用すると思われます。<br /> views:表示用のデータHTML見たいなもの<br /> alloy.jsこれが共通処理<br /> <br /> このような感じかと体感もう少しわかったらいろいろあげれるようにしてみたいな弦也http://www.blogger.com/profile/16272758099624685883[email protected]