ページ

2014年11月9日日曜日

Node.jsでpostgres接続する

Node.jsでサーバPGをしようと思いpostgresへ接続

Node.js v0.10.26
postgres 9.3.2
上記バージョンにて確認

Node.jsはインストールされているとして以下のパッケージをnpmでインストールする必要がある。
https://github.com/brianc/node-postgres
$ npm install pg

使い方ですが、サーバで利用を想定して行うといかになります。


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();
    });
});
};

コネクションの関係も見ながら確認してみたのですが。
pg.ClientはdoRequest内で行い、client.endがコネクションを閉じるメソッドのため
これが必須です。これを省くとサーバが動作する限りコネクション数が増えるので注意です。

2014年10月5日日曜日

CentOS 6.5でPHP5.3→PHP 5.4にアップグレードする

CakePHP3系を利用したいと思いPHPを5.3からアップグレード

とりあえずCentOS 6.5系でPHP5.3のインストール手順
yum install php php-mbstring php-mbstring php-pear

PHP5.3からのアップレード手順
# 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

単純ですが、重要な手順です。

2014年7月20日日曜日

AWSの勉強開始

やっとこさAWSの勉強を開始するようにと思い
とりあえず本を探したらおあつらえ向きの


7/16日発売でAWSのエバンジェリストが書かれている本だったので即買い
AWSの基本的なアカウントの作り方、サーバの構築に必要な内容がまとまっていたので
これから始める人向けの本です。

≪CHAPTER 1≫システム構築をインフラから始めるには
≪CHAPTER 2≫ネットワークを構築する
≪CHAPTER 3≫サーバーを構築する
≪CHAPTER 4≫Web サーバーソフトをインストールする
≪CHAPTER 5≫ HTTP の動きを確認する
≪CHAPTER 6≫プライベートサブネットを構築する
≪CHAPTER 7≫ NAT サーバーを構築する
≪CHAPTER 8≫DB を用いたブログシステムの構築
≪CHAPTER 9≫TCP/IP による通信の仕組みを理解する
≪Appendix A≫パケットキャプチャで通信をのぞいてみる
≪Appendix B≫ネットワークの管理・運用とトラブルシューティング

これらの構成でなっているのですがネットワークを構築する部分に
IPのセグメント分けがありこちらがためになります。

よくわるWordpressのインストール等もあるのでAWSをこれからの人にオススメです

2014年7月13日日曜日

TitaniumでNow Loadingを使ったHTTPClientを実装

スマホアプリを作成する際によくある話ですが
Web通信部分(Ti.Network.createHTTPClient)を利用すると
非同期通信で画面の制御が面倒なことがあるので
これを回避する1つの方法No Loading...を実装してみました。

利用するのは、ActivityIndicatorと呼ばれるのものでこれを利用しバックグラウンドでは
Web通信を画面では、Now Loadingを表示します。

index.js
=========
function doClick(e) {
    var loading = Alloy.createController('loading',{
    handler : function(client, e){
    Ti.API.info("Received text: " + client.responseText);
         alert('success');
    }
    });
    loading.getView().open();
}
$.index.open();
=========

index.tss
=========
".container": {
backgroundColor:"white"
},
"Label": {
top: 30,
width: Ti.UI.SIZE,
height: Ti.UI.SIZE,
color: "#000"
}
=========

index.xml
=========
<Alloy>
    <Window class="container">
        <Label id="label" onClick="doClick">Hello, World</Label>
    </Window>
</Alloy>
=========


loading.js
=========
var args = arguments[0] || {};
function showIndicator(e){
    $.activityIndicator.show();
}
var url = "http://www.google.co.jp/";
var client = Ti.Network.createHTTPClient({
onload : function(e) {
    args.handler(this, e);
    $.loading.close();
    $.activityIndicator.hide();
},
onerror : function(e) {
    Ti.API.debug(e.error);
    alert('error');
    $.loading.close();
            $.activityIndicator.hide();
        },
    timeout : 5000
});
client.open("GET", url);
client.send();
=========

loading.tss
=========
".container" : {
    backgroundColor: '#999',
    opacity: 0.6,
    height:Ti.UI.FILL,
    width:Ti.UI.FILL
}
=========

loading.xml
=========
<Alloy>
    <Window class="container" onOpen="showIndicator">
        <ActivityIndicator id="activityIndicator" message="Loading..."/>
    </Window>
</Alloy>
=========

ソースはこのようになっています。
loading自体はモジュールみたいな形で利用します。
順番としては
loadingをopen->load画面を表示->HTTPリクエスト->onload処理->画面を閉じる
が流れです。

意外と簡単にでき応用も利くのでおためあれ

gitに今回作った内容を公開いたしました。
https://github.com/genyasan/ti/tree/master/loading

2014年7月6日日曜日

CentOS 6.5にgit 1.9インストール手順

今更ながらgitを行うとおもいCentOS 6.5に2014/07/06現在最新のgit 1.9.0をインストールする手順です.
使い方は追々・・・
yumで一発で終わるかと思ったらなかったのでソースから最新版をビルド

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 

手順はシンプルなので後は使いこなすだけ
そこそこ性能がないとmakeは数分かかりました。

Titanium画面遷移のしかた

Tiを利用した画面遷移の基礎的なものを作成してみました。
TiのWindowを利用すると画面遷移が行え親から子を作るようなイメージになります。
イメージをまとめるため簡素なものを作成してみました。

ちょこっとメモをかねて作成




index index2 index3
xml
<Alloy>
  <Window class="container">
    <Label text="index2を開く" onClick="openIndex2">
  </Window>

</Alloy>
<Alloy>
  <Window class="container">
    <Label text="index2を閉じる" onClick="closeIndex2" />
    <Label text="index3を開く" onClick="openIndex3" />
  </Window>

</Alloy>
<Alloy>
  <Window class="container">
    <Label id="param1" top="30" />
    <Label text="argsをチェックする"  top="30" onClick="argsCheck" />
    <Label text="index3を閉じる" onClick="closeIndex3" />
    <Label text="index2と3を閉じる" onClick="closeIndex2and3" />
  </Window>

</Alloy>
tss
".container" : {
  backgroundColor:'#0ff',
  top: 30,
  layout: 'vertical',
}
".container" : {
  backgroundColor:'#f00',
  top: 30,
  layout: 'vertical',
}
".container" : {
  backgroundColor:'#ff0',
  top: 30,
  layout: 'vertical',
}
js
function openIndex2() {
  var index2 = Alloy.createController('index2').getView();
  index2.open();
}

$.index.open();
var args = arguments[0] || {};

function closeIndex2() {
  $.index2.close();
}

function openIndex3() {
  var index3 = Alloy.createController('index3',{window : $.index2, text : "index2の中身を入れることができる."}).getView(); 
  index3.open();
}
var args = arguments[0] || {};

function argsCheck() {
  alert("このメソッドでもargsを参照できる:" + args.text)
}
function closeIndex3() {
  $.index3.close();
}
function closeIndex2and3() {
  $.index3.close();
  args.window.close();
}

// 引数を受け取る.
$.param1.text = args.text;


少し書き方を横着しましたgitとかに上げれればよいのですが現在勉強中。

こちらのソースを実行すると画像のようになるのですが、indexはそのままindex2をopenしているだけです。
Alloyから生成するためには「Alloy.createController」こちらを利用します。
さらに注意点としてopenするときはviewである必要があるので「getView()」メソッドが必要です。

index2のところで、自分をcloseする際には「$.index2.close();」と非常にシンプルになります。
ここはおまじないでよい気がしてきました。

openIndex3の点が面白いと思えるところです。
Alloy.createControllerをする際に引数を渡すことができます。
この引数がindex3のargsに格納され利用できるのですが。

index3内の「$.param1.text = args.text;」これは理解が行いやすいのですが。
あえてalertとcloseIndex2and3をつけた部分です。

clickイベントを実行した際にもargsが生成した際に利用したインスタンスが利用可能な点です。
これにより、alertで前のwindowであるindex2のデータを見ることができます。

closeIndex2and3についても、自信と、index2を同時にcloseすることができるのです。
基本的な点かもしれないですが意外と知らないなと思いフムフムなっとく

現状ものを作るよりも、知る方が多いので苦労します。

2014年7月2日水曜日

Titanium Sqlite対応

TitaniumでDB(sqlite)対応方法です。

Alloyを用いるとmodelと呼ばれる仕組みがあるので、楽にできます.


まずはプロジェクトから右クリックで「New」→「Alloy Model」を選択。


続いて、実際のテーブルにあたるスキーマーを定義そうすると下のような「models」ディレクトリにファイルが出来上がる


とりあえずこれでDBを利用できる状態になる。
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;
 }
};
1行だけ基本のソースから追加しています「idAttribute: "name"」この部分ですが
この行を加えるとPKになるようになっています。
どうやら初期状態では、columnsで定義された項目意外に「id」と呼ばれるPKが自動付与されるみたいです。
外部連携をする場合はPKがあらかじめ決まっている可能性が高いので「idAttribute」は覚えておいた方がよいです。
また、バリデータもこちらに記載できます。 簡単なバリデータであればよいのですが
複雑なものをどのように書くかわかりきっていないのでとりあえず今は放置

とりあえず、Insert,SELECT,DELETE,UPDATEを行います。

INSERT
var testModel = Alloy.createModel("test");
testModel.set({"name" : "弦也", "kana" : "ゲンヤ"});
if (testModel.isValid()) {
   testModel.save();
} else {
   alert("登録に失敗しました.");
}
これで登録ができます。
isValidはバリデーションなので初期ではただtrueが返却されるだけです。

少し応用しJSONのデータを組み合わせます。
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();
こういった感じが実用例かと思います。

SELECT
var testModel = Alloy.createCollection("test");
testModel.fetch();
testModel.map(function(test){
    Ti.API.info("name:" + test.get("name") + " kana:" + test.get("kana"));
});
INSERTと異なり、「Alloy.createCollection」を利用している点が注意です。
fetchでデータを取得していますがこれはすべて取得になります。
当然条件を指定したいので次のように記述
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"));
});
PDOなどでよく見る形式になりました。
このfetchはいろいろな形式で記載できそうなのですがまだ模索中とりあえずこれで対応できるのでよしとしています。

DELETE
var testModel = Alloy.createCollection('test');
testModel.fetch(query : { statement: 'SELECT * FROM test WHERE name = ?', params: ['弦也'] }});
while(testModel.length > 0) testModel.at(0).destroy();
少し面倒だがこのような書き方が一般的みたいです。
while文を利用するのが一番行数が少ない書き方みたいですが
その他何種類かあるのでそちらも随時試してまとめ中。

UPDATE
var testModel = Alloy.createModel("test");
testModel.set({"name" : "弦也", "kana" : "ゲンヤ"});
if (testModel.isValid()) {
   testModel.save();
} else {
   alert("更新に失敗しました.");
}
どうやら、INSERT OR UPDATEと呼ばれることを内部処理されているらしく、PKが合えば更新する使用みたいです。
これが「idAttribute」を利用している理由です。
自動で割り当てられたIDも便利ですがこれでは都合が悪いときがあるので臨機応変に対応です。
UPDATEについては、まだ調べきれていないので自信がないですがこれで動くと思います。

以上AlloyでModelsを利用するです。
もう少し応用編も今後作ってみたいと思います。

2014年6月17日火曜日

TitaniumでJsonファイルを取得する

Titaniumシリーズ Webサーバに置いてあるJsonを取得するサンプルです。
今回は自分のlocalhost内に置きます。


とりあえずjsonファイルを用意.

data.json
[{"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"}]

続いて実際の読み取りプログラム
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();

これでできます。
意外とあっけないですが1点注意点として遅延読み取りなので
ほかのプログラムがxhr.send()の後に走ります
こちらが覚えておかないと大変です。

次いでにPOSTのサンプル
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);

基礎的な点だが重要
JSだからJSON.parseを利用できるのが非常に便利です。

2014年6月15日日曜日

Titanium mobileで日付のフォーマット

Titaniumの日付フォーマットを調べてみました。
momentと呼ばれるライブラリを利用しているのでよく利用する。
今月末、来月末などの標準的な内容をコンソールログに出力してみました。

// ライブラリを呼び出し.
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"));

こちらの内容で出力結果が以下になります。
[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

日付を利用したかったのでまとめましたが思っている以上に少ない・・・

2014年6月11日水曜日

Titanium mobile Alloy ボタンを配置する

少しずつやっているので順次メモを記載

JS部分はとりあえず置いておいてGUI面を現在模索中第1段として
ボタンの配置をいろいろしてみました。



サンプルで作り上げたのがこちら画面全体配置、最小サイズ、任意のサイズ1列での分割です。

index.xml
<Alloy>
 <Window class="container">
   <Button id="button1" backgroundColor="red" onClick="doClick" title="フルサイズ" top="10" />
          <Button id="button2" backgroundColor="green" onClick="doClick" title="最小サイズ" top="100"  />
          <Button id="button3" backgroundColor="blue" onClick="doClick" title="サイズ固定" top="150" />
          
          <ButtonBar id="bb1" backgroundColor="#369" top="300" >
           <Labels>
                <Label>One</Label>
                <Label>Two</Label>
                <Label>Three</Label>
            </Labels>
          </ButtonBar>
          <ButtonBar id="bb2" backgroundColor="#369" top="360" >
           <Labels>
                <Label>Single</Label>
                <Label>Duo</Label>
                <Label>Triple</Label>
                <Label>Quad</Label>
            </Labels>
          </ButtonBar>
 </Window>
</Alloy>

index.tss
".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"
 
}

index.xmlに配置情報、index.tssにデザイン情報を記載、雑なボタンですがAlloyを利用したボタンの初歩かと思います。
Ti.UI.FILLはフルサイズとTi.UI.SIZEは最小サイズ、ButtonBarは任意の件数のボタンを配置できます。
この内容はAndroid iOS両方とも使えるのでUIの共通化が便利です。
次もレイアウト中心になるかと

2014年6月9日月曜日

Sim Freeスマホの検討

現在Sim Freeのスマホを利用してるのですが(ちなみにOCN Simです。
今現在使っているのはXperia SPです。2万台なのでお手頃
icon
icon


いつもXperiaシリーズを買っているので今回もそうしようと思っているのですがスペックが決めきれないので
Zシリーズが主な比較対象 比較は画面やメモリーなど基本的な点価格などです。

調べてみるとよく似ているようで微妙に異なる
品名Xperia Z2Xperia Z1Xperia Z1 CompactXperia Z
画像icon
icon
icon
icon
icon
icon
icon
icon
システムAndroid 4.4Android 4.2Android 4.3Android 4.1
CPU2.3 GHz Quad Core2.2 GHz Quad Core2.2 GHz Quad Core1.5 GHz Quad Core
容量16G16G16 GB16G
RAM3 GB2 GB2 GB2 GB
ディスプレイ5.2インチ5.0インチ4.3インチ5.0インチ
解像度1920 x 10801920 x 10801280 x 7201920x1080
カメラ20.7 Mpixels20.7 Mpixels20.7 Mpixels13 Mpixels
ネットワーク4G LTE 3G GSMLTE Bands 3G GSM4G LTE 3G GSMLTE HSPA+ GSM
ワイヤレスBluetooth: 4.0, NFCBluetooth: 4.0, NFCBluetooth: 4.0, NFCBluetooth: 4.0, NFC
バッテリー3000 mAh3000 mAh (Built-in)2300 mAh2400 mAh
重量158 g169 g137 g146 g
サイズ146.8 x 73.3 x 8.2144.4 x 73.9 x 8.5127 x 64.9 x 9.5139 x 71 x 7.9

このような感じになります。
価格的には、Z2>Z1>Z1 Compact>Zと妥当な通りでZ1かZ1 Compactで悩み中・・・

2014年6月7日土曜日

Titanium mobile始める

そろそろモバイルアプリを行うかと思い、Titanium mobileを勉強中お決まりのhello worldをやってみます。
ちなみにTitaniumのバージョンは2014/06/07現在の最新3.2.3です。

初回はただプロジェクトを作るだけなのでプロジェクトの作成手順が中心

Step1.
Titanium mobileをDLします。こちら
からダウンロードできますが、メアドなどの登録が必要です。

ダウンロードしてからインストールは趣旨ではなので割愛(Eclipseベースのためなじみがあれば気にならないです)
Titanium™ インストールガイド に詳しくあるのでご覧ください。


Titaniumを起動し「Mobile App Project」を作成し以下のAlloyを選択

保存ディレクトリなどを指定

これでHello worldが出来上がるデバッグモードで起動してみたがラベルがわかりにくかったので少し編集がてら下調べ

自動作成されたプロジェクトは上記画像のようになっているのでこれを確認
ルートディレクトリにある以下のディレクトリはおそらくそれぞれの役割で
app:ソースコードを記載する
plugins:ライブラリの管理
みたいに思えます。

appディレクトリを中心に見ると
assets:画像とか?
controllers:メイン処理
models:まだわからない
styles:css?のようなファイルがある デザインに利用すると思われます。
views:表示用のデータHTML見たいなもの
alloy.jsこれが共通処理

このような感じかと体感もう少しわかったらいろいろあげれるようにしてみたいな

2014年6月1日日曜日

PHPのよく使うarray関数をまとめる

最近PHPを使うのですがよくのでarray系の関数をまとめました。(今更間丸出しw


配列の切り出し.
$arr = array(1, 2, 3, 4, 5, 6);
$arr2 = array_slice($arr, 0, 3);
var_dump($arr2);
/** 結果 */
array(3) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(3)
}


配列のマージ.
$arr1 = array(1, 2, 3, 7, 9);
$arr2 = array(4, 8);
$arr3 = array(5);
$arr4 = array_marge($arr1, $arr2, $arr3);
var_dump($arr4);
/** 結果 */
array(8) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(3)
  [3]=>
  int(7)
  [4]=>
  int(9)
  [5]=>
  int(4)
  [6]=>
  int(8)
  [7]=>
  int(5)
}


配列からキーの一覧を取得する
$arr = array("a" => 1, "b" => 2, "c" => 3);
$keys = array_keys($arr);
var_dump($keys);
/** 結果 */
array(3) {
  [0]=>
  string(1) "a"
  [1]=>
  string(1) "b"
  [2]=>
  string(1) "c"
}


配列から値のみを取得する
$arr = array("a" => 1, "b" => 2, "c" => 3);
$vals = array_values($arr);
var_dump($vals);
/** 結果 */
array(3) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(3)
}


特定文字の配列を自動生成する
$a = array_fill(1, 5, '?');
var_dump($a);
/** 結果 */
array(5) {
  [1]=>
  string(1) "?"
  [2]=>
  string(1) "?"
  [3]=>
  string(1) "?"
  [4]=>
  string(1) "?"
  [5]=>
  string(1) "?"
}


配列から重複したデータを削除します.
$a = array("a" => 1, "b" => 2, "c" => 3, "d" => 4, "d" => 5, "a" => 9);
$vals = array_unique($a);
var_dump($vals);
/** 結果 */
array(4) {
  ["a"]=>
  int(9)
  ["b"]=>
  int(2)
  ["c"]=>
  int(3)
  ["d"]=>
  int(5)
}


配列から最初のキーを取得する
$arr = array("a" => 1, "b" => 2, "c" => 3);
$key = key(array_slice($arr, 0, 1));
var_dump($key);
/** 結果 */
string(1) "a"

配列から最後のキーを取得する
$arr = array("a" => 1, "b" => 2, "c" => 3);
$key = key(array_slice($arr, count($arr) - 1, 1));
var_dump($key);
/** 結果 */
string(1) "c"


array系を応用した関数

/**
 * PDOを利用したINSERTクエリーの発行.
 * @param object $dbh PDOの接続クラス.
 * @param string $table テーブル名.
 * @param array $values カラムと値の連想配列
 * @return integer 成功の場合は1失敗の場合は-1を返します.
 */
function insertQuery($dbh, $table, $values) {
    $sql = "INSERT INTO " . $table . "(" . join(", ",  array_keys($values)) . ") VALUES(" . join(", " ,array_rale("?", count($values))) . " )";
    $stmt = $dbh->prepare($sql);
    if (!$stmt->execute(array_values($values))) {
        print_r($dbh->errorInfo());
        return -1;
    }
    return 1;
}

このような応用ができます。
ほかにもあれば今後公開してみます。

2014年4月27日日曜日

postgresのバックアップを1ファイルずつgoogleドライブに保存する

自分用に作ったpostgresを1ファイルずつGoogleドライブに保存したいと考えシェルを作成。
pg_dumpを利用し対処1ファイルずつなのは除外したいDBもあるためです。
GoogleドライブはGoogleから出ているアプリを利用しフォルダに移動するだけなので保存すること自体は簡単です。
DropBoxとかもディレクトリを変更すれば対応できると思います。
※Macを利用しているのでLinux系では一部動作しない可能性もあります。
その際は一部改変が必要になるかと思います。


バックアップ詳細はDB名_yyyyMMdd.tar.gzで保存されています。
while read部分が少し戸惑いました。
パイプを利用してreadを行うないようです。




#/bin/sh

DATE=`date "+%Y%m%d"` # 日付のフォーマット
TMP_DIR="/tmp/pg_dump_$DATE" # 作業ディレクトリ
EXECLUDE_DB="template|postgres" # バックアップ除外対象
BACKUP_DIR="/Users/genya/Google ドライブ/backup" # バックアプディレクトリ
DB_USER=postgres # 動作ユーザー

# 作業ディレクトリ作成
echo "作業用ディレクトリを作成 $TMP_DIR"
mkdir $TMP_DIR

# DB一覧を取得する.
psql -c "select datname FROM pg_database;" -t -U postgres | while read db_name
do
 if [ -z "$db_name" ]; then
  continue
 fi
 # バックアップ対象外を除外
 DB_COUNT=`echo "$db_name" | grep  -E "($EXECLUDE_DB)" | wc -l`
 if [ "$DB_COUNT" -eq "1" ]; then
  echo "execlude database no backup $db_name"
  continue
 fi
 echo "backup database:$db_name"
 # バックアップ
 pg_dump -U $DB_USER $db_name > ${TMP_DIR}/${db_name}.sql
 # 圧縮
 tar zcvf ${TMP_DIR}/${db_name}_${DATE}.tar.gz ${TMP_DIR}/${db_name}.sql >/dev/null 2>&1
 # 元のファイルを削除
 rm ${TMP_DIR}/${db_name}.sql
 # googleドライブに移動
 mv ${TMP_DIR}/${db_name}_${DATE}.tar.gz "${BACKUP_DIR}/${db_name}_${DATE}.tar.gz"
done

# 作業ディレクトリ削除
rm -rf $TMP_DIR

2014年4月9日水曜日

postgresで区切り文字を集計する

備忘録のないようです。

以下のように「,」区切りの文字が連結されている状態でグループ化を行うための操作を記述

CREATE TABLE nodes(tags TEXT);
INSERT INTO nodes VALUES('tag1,tag2,tag3');
INSERT INTO nodes VALUES('tag1,tag3');
INSERT INTO nodes VALUES('tag1,tag3');
INSERT INTO nodes VALUES('tag1,tag4,tag5');
このデータを以下のようにしたい
tag   | count 
-------+-------
 tag1  |     4
 tag3  |     3
 tag2  |     1
 tag4  |     1
 tag5  |     1

このような処理はどのようにと呼ぶのか分からないがニュアンス的には
・区切り文字配列化
・パース配列化
・文字列分割結合
などか?

正式名称が知りたい・・・・
とりあえずSQLだけ記載
SELECT tag, COUNT(tag) FROM (SELECT UNNEST(STRING_TO_ARRAY(tags, ',')) FROM nodes) AS T1 GROUP BY tag ORDER BY COUNT(tag) DESC, tag;
UNNESTとSTRING_TO_ARRAYを利用することで対応が可能である。

UNNESTで検索を行うといろいろ応用が出てくるので参考にしてみたい。
とりあえず自分の目的は上記で解決です。

2014年3月19日水曜日

mavenとiciqlのインストール手順

Javaを利用する機会があり、せっかくなので新しいO/Rマッパーを試そうと思い探していて見つけたのが

iciqlとよばれるO/Rマッパーです。

以前Seasar2のS2JDBCを利用していましたが
軽量ということで使い心地はわからないがとりあえず試してみようと思います。

以下のソフトのインストール手順となります。
Databaseはpostgresを利用します.
・maven
・iciql

OSはmac OS X 10.9.2で行っています。
Postgresは9.3.2を利用しています。

mavenのインストール手順

# mavenをダウンロード
cd ~/Downloads
curl -O http://ftp.yz.yamagata-u.ac.jp/pub/network/apache/maven/maven-3/3.2.1/binaries/apache-maven-3.2.1-bin.tar.gz
# 展開
tar xvzf apache-maven-3.2.1-bin.tar.gz
mv apache-maven-3.2.1 apache-maven
mv apache-maven /Applications/
# パスを追加
echo "M2_HOME=/Applications/apache-maven" >> ~/.bash_profile
echo "PATH=$PATH:$M2_HOME/bin" >> ~/.bash_profile
echo "export M2_HOME" >> ~/.bash_profile
echo "export PATH" >> ~/.bash_profile
source ~/.bash_profile


ここまではおなじみの手順です。
mavenのインストールですので特に解説なくいきます。

iciqlインストール

# iciqlのダウンロードとmvnの追加
curl -o https://iciql.googlecode.com/files/iciql-1.2.0.zip
unzip iciql-1.2.0.zip
# mavenリポジトリに追加
mvn install:install-file -Dfile=iciql-1.2.0.jar -DgroupId=com.iciql -DartifactId=iciql -Dversion=1.2.0 -Dpackaging=jar

iciqlはmavenの保存場所が直接見当たらなかったので
自分の環境にDLしローカル内で保存

pom.xmlの作成


  4.0.0
  net.rule.selenium
  roadbike
  0.0.1-SNAPSHOT
  war
  
   
    com.iciql
    iciql
    1.2.0
   
   
  postgresql
  postgresql
  9.1-901.jdbc4
   
  

postgresと一緒にりようするのでiciqlとpostgresqlでpom.xmlを作成
これで「mvn eclipse:eclipse」で環境が整います。

またこちらを利用したentityクラスの自動生成もありますコマンドは以下となります
postgreテーブルの内容をentityとしたjavaファイルに出力します。
cp ~/.m2/repository/com/iciql/iciql/1.2.0/iciql-1.2.0.jar ./iciql-1.2.0.jar 
cp ~/.m2/repository/postgresql/postgresql/9.1-901.jdbc4/postgresql-9.1-901.jdbc4.jar ./postgresql-9.1-901.jdbc4.jar
java -cp iciql-1.2.0.jar:postgresql-9.1-901.jdbc4.jar com.iciql.util.GenerateModels -url "jdbc:postgresql://localhost:5432/postgres" -user postgres -password {PASSWORD}
iciqlを利用し、entityを自動生成が可能です。
ある程度はマッピングしてくれるので、こちらをベースに対応を行うと便利です。

2014年3月10日月曜日

RALEIGH RSRで箱根へ

とうとうミニベロ買いましたRALEIGH RSRです。

10段ギアの105がシーンに応じ利用可能なので重宝しています。

いきなりですが、箱根の山に挑戦してきました。
ヒルクライムです。

小田原->箱根->熱海












小田原から1号線をひたすら行くコースで、小田原発-熱海着コースとなります。

ミニベロ輪行
輪行中の状態













箱根の山へ挑戦しようと思い18切符行くためまずは
東京から小田原まで輪行です(これも初
左ミニベロ用の輪行袋オーストリッチ ちび輪バッグ・ミニベロ 輪行バッグ ブラックです。
これに入れました。右は、700ccの折りたたみです。
やっぱり小さいが少し長いです。



RALEIGH RSR
小田原駅近くのセブンイレブンにて













とりあえず、前輪を入れサドルの高さを調整しスタート準備中

箱根途中の橋


途中の駅で休憩
山頂までの途中の写真です。雪があるのかと思ったのですがこのあたりはほとんどないです。

箱根 874m地点で撮影













箱根874m地点に到着結構長い道のりでした。(体力不足
この辺りはすごく寒いです。測道には結構雪があります。
漕いでいるとそこまで気にならないですがここから主に下り・・・


ここからさらに1号線を進み芦ノ湖へ











到着するまで寒い・・・
下りは速度がでます。だいたいブレーキなしだと
40〜50km/h程度になります。
手袋していても驚くほど寒いそして足先も


芦ノ湖+自転車+富士山+海賊船w
たまたま来ました。

後はメインの下りここの冷えが非常に厳しかった












最後に撮影ここを下り熱海へ行き温泉へ入り帰宅
頑張れば体力のない人でも箱根は登れます
是非お試しをちなみに総時間8hほどです。

2014年2月23日日曜日

bootstrapのテンプレート デザイン性を少し出してみました。

bootstrapのテンプレート
基本的な感じではなくサイトで利用可能なイメージをしてみました。
少し改良すると色を変更し差別化できるかと思います。

タイトルの下にナビゲーションがあるのでこちらがwidth 100%で表示されています。
この部分が特徴的なデザインかと思います。

bootstrap無料テンプレート

コンテンツは、やや狭いと思えば#contents部分のcol-xs-2を調整していただければ
柔軟かと思います。

フッターはシンプルにしていますのでカスタマイズ必要かも?

ブログのイメージですが、その他にも活用可能かと思います。
端を消して2カラム、1カラム構成も可能です。

それぞれ、header、navigator、contents、pager、footerの単位で区切っているので
間を追加する場合はこちらに挟めば対応できます。


以下ソースです。
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>bootstrap3ノ進め方</title>
        <link rel="stylesheet" href="//netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css">
        <link rel="stylesheet" href="//netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap-theme.min.css">
        <!--[if lt IE 9]>
        <script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
        <script src="https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js"></script>
        <![endif]-->
        <script type="text/javascript" src="//code.jquery.com/jquery-1.11.0.min.js"></script>   
        <script src="//netdna.bootstrapcdn.com/bootstrap/3.1.1/js/bootstrap.min.js"></script>
        <style type="text/css">
        <!--
        #header {
            height: 50px;
            width: 100%;
            text-align: center;
        }
        #footer {
            background-color: #428bca;
            background-image: -moz-linear-gradient(top, #428bca, #222222);
            background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#428bca), to(#222222));
            background-image: -webkit-linear-gradient(top, #428bca, #222222);
            background-image: -o-linear-gradient(top, #428bca, #222222);
            background-image: linear-gradient(to bottom, #428bca, #222222);
            background-repeat: repeat-x;
            border-color: #428bca;
            height: 60px;
            text-align: center;
        }
        #navigator {
            background-color: #428bca;
            background-image: -moz-linear-gradient(top, #428bca, #222222);
            background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#428bca), to(#222222));
            background-image: -webkit-linear-gradient(top, #428bca, #222222);
            background-image: -o-linear-gradient(top, #428bca, #222222);
            background-image: linear-gradient(to bottom, #428bca, #222222);
            background-repeat: repeat-x;
            border-color: #428bca;
        }
        .navbar-grad {
          background-color: #428bca;
          background-image: -moz-linear-gradient(top, #428bca, #222222);
          background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#428bca), to(#222222));
          background-image: -webkit-linear-gradient(top, #428bca, #222222);
          background-image: -o-linear-gradient(top, #428bca, #222222);
          background-image: linear-gradient(to bottom, #428bca, #222222);
          background-repeat: repeat-x;
          border-color: #428bca;
         filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff111111', GradientType=0);
        }
        .navbar-grad > .active  > a{
          background-color: #428bca;
          background-image: -moz-linear-gradient(top, #428bca, #222222);
          background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#428bca), to(#222222));
          background-image: -webkit-linear-gradient(top, #428bca, #222222);
          background-image: -o-linear-gradient(top, #428bca, #222222);
          background-image: linear-gradient(to bottom, #428bca, #222222);
          background-repeat: repeat-x;
          border-color: #428bca;
         filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff111111', GradientType=0);
        }
        
        .navbar-grad > li > a:hover, .navbar-grad > li > a:focus {
            background-color: #428bca;
        }
        #contents {
            margin-top: 10px;
        }
        #pager {
            text-align: center;
        }
        </style>
    </head>
    <body>
        <div id="header"><h1>bootstrap無料テンプレート</h1></div>
        <div id="navigator" class="row">
            <div class="col-xs-2" style="background-color: #428bca;"></div>
            <div class="col-xs-8" style="">
                <ul class="nav nav-pills nav-justified navbar-grad">
                  <li class="active"><a href="#" >ブログ</a></li>
                  <li><a href="#" >このサイトについて</a></li>
                  <li><a href="#" >メッセージ</a></li>
                  <li><a href="#" >コンテンツ</a></li>
                </ul>
            </div>
            <div class="col-xs-2" style="background-color: #428bca;"></div>
        </div>
        <div id="contents" class="container">
            <div class="row">
              <div class="col-xs-2" style="">
              <div class="panel panel-primary">
                  <div class="panel-heading">
                    <h3 class="panel-title">最新記事</h3>
                  </div>
                  <ul class="list-group">
                    <li class="list-group-item"><a href="#">テンプレート1</a></li>
                    <li class="list-group-item"><a href="#">テンプレート2</a></li>
                    <li class="list-group-item"><a href="#">テンプレート3</a></li>
                    <li class="list-group-item"><a href="#">テンプレート4</a></li>
                  </ul>
                </div>
                <div class="panel panel-primary">
                  <div class="panel-heading">
                    <h3 class="panel-title">アーカイブ</h3>
                  </div>
                  <div class="panel-body"><a href="#">2014/02月 <span class="badge">12</span></a></div>
                  <div class="panel-body"><a href="#">2014/01月 <span class="badge">12</span></a></div>
                </div>
              </div>
              <div class="col-xs-8">
               <div class="row">
                  <div class="col-sm-6 col-md-4">
                    <div class="thumbnail">
                      <img src="256x256.png" alt="">
                      <div class="caption">
                        <h3>画像サムネイル</h3>
                        <p>画像の説明です。ここに説明文を入れると様々な内容で表示が可能です。</p>
                        <p><a href="#" class="btn btn-primary">リンク</a></p>
                      </div>
                    </div>
                  </div>
                  <div class="col-sm-6 col-md-4">
                    <div class="thumbnail">
                      <img src="256x256.png" alt="">
                      <div class="caption">
                        <h3>画像サムネイル</h3>
                        <p>画像の説明です。ここに説明文を入れると様々な内容で表示が可能です。</p>
                        <p><a href="#" class="btn btn-primary">リンク</a></p>
                      </div>
                    </div>
                  </div>
                  <div class="col-sm-6 col-md-4">
                    <div class="thumbnail">
                      <img src="256x256.png" alt="">
                      <div class="caption">
                        <h3>画像サムネイル</h3>
                        <p>画像の説明です。ここに説明文を入れると様々な内容で表示が可能です。</p>
                        <p><a href="#" class="btn btn-primary">リンク</a></p>
                      </div>
                    </div>
                  </div>
                </div>
              </div>
              <div class="col-xs-2">
                <div class="panel panel-primary">
                  <div class="panel-heading">
                    <h3 class="panel-title">カテゴリ</h3>
                  </div>
                  <ul class="list-group">
                    <li class="list-group-item"><a href="#">雑記 <span class="badge">1</span></a></li>
                    <li class="list-group-item"><a href="#">テンプレート集 <span class="badge">8</span></a></li>
                    <li class="list-group-item"><a href="#">デザイン <span class="badge">5</span></a></li>
                    <li class="list-group-item"><a href="#">bootstrap <span class="badge">3</span></a></li>
                  </ul>
                </div>
                <div class="panel panel-primary">
                  <div class="panel-heading">
                    <h3 class="panel-title">リンク</h3>
                  </div>
                  <div class="panel-body"><a href="http://joke-tech.blogspot.com/">戯言と技術</a></div>
                </div>
              </div>
            </div>
        </div>
        <div id="pager" class="container" >
            <div class="row">
                <div class="col-xs-12">
                    <ul class="pagination">
                      <li><a href="#">&laquo;</a></li>
                      <li><a href="#">1</a></li>
                      <li><a href="#">2</a></li>
                      <li><a href="#">3</a></li>
                      <li><a href="#">4</a></li>
                      <li><a href="#">5</a></li>
                      <li><a href="#">&raquo;</a></li>
                    </ul>
                </div>
            </div>
        </div>
        <div id="footer">
            <div class="container">
                <p class="muted credit">boostrapテンプレート 3カラム構成</p>
            </div>
        </div>
        </body>
</html>