2014年3月6日木曜日

PostgreSQL9.3に更新してからDBのサイズが取得できなくなった

仕事でPostgreSQL8.3を使っていたがいろいろ問題があって9.3にアップする事に。
DB監視でサイズ情報を取得していたが動かなくなってしまいさあ大変。
ということで調べてみた。

これが今まで使っていたクエリ(の抜粋)
select
  relname,
  to_char(pg_relation_size(relname)),
  to_char(pg_total_relation_size(relname)),
  relfilenode
where
 pg_class
where
 relowner = xxxx and
 relkind = 'r';

こんな情報がありました。明示的なキャストが必要みたい。でも8.3だぞ?

 http://www.sraoss.co.jp/technology/postgresql/8.3/



select
  relname,
  to_char(pg_relation_size(relname::text)),
  to_char(pg_total_relation_size(relname::text)),
  relfilenode
where
 pg_class
where
 relowner = xxxx and
 relkind = 'r';

実際に明示的に記述することで取得できるようになった。
実務ではプログラミングから離れているため、このようなちょっとしたことでも
キャッチアップできていない。そんな自分に腹が立つ。。。

2013年12月24日火曜日

車に追突してきた容疑者が見つかった

 11月に家族と車で買い物に出かけた。信号待ちで止まっていたところ後ろから追突された。ハザードを出して車から出ようとしたところ、急発進して私の車の横を駆け抜け信号無視して逃げていった。車の特徴・ナンバーを覚えていた私は、頭にきて警察に通報、もろもろの処理をして、1か月ほど経過したところだった。

 警察からは容疑者が謝りたい、弁償したいとのことだった。ならばということで電話で話をしようということで待っているのだがかかってこない。
正直、車の破損についてはどうでもいい。 いい大人が逃げる、そして謝ると言って謝りの連絡がないことに憤りを感じている。本当はこんないい加減な人間と話す時間さえももったいないくらいなので、話すことさえためらわれる。しかし言いたい事は言っておきたいので待ってることにする。


はあ、全く人間的に問題のある大人が多すぎてうんざりする。

2013年12月19日木曜日

[Ruby]Zaim API V2に対応した認証用ライブラリを作ってみた

家計簿ソフトZaim(https://zaim.net)が提供するWebAPIの認証部分を
omniauthを参考に作ってみた。

ソースコードは以下のサイトにアップロード。
https://github.com/maar4569/omniauth-zaimv2

参考にしたのは以下のライブラリ。(v1用のライブラリ。)
mururuさんありがとうございます。

https://github.com/mururu/omniauth-zaim


以前Google Apps ScriptからZaim APIをたたこうとして失敗し涙したが、
今回は成功。

Railsに組み込む場合、コールバック用のコントローラに
以下のような記述をしておくと、verify APIのレスポンスが得られる。

#サンプル
def callback
  auth = request.env['omniauth.auth']
  @user_id = auth.info.id
  @name = auth.info.name
  @input_count = auth.info.input_count
  @day_count = auth.info.day_count
  @repeat_count = auth.info.repeat_count
  @day = auth.info.day
  @week = auth.info.week
  @currency_code = auth.info.currency_code"
end

また、カテゴリに関する情報を取得する場合は以下のコードで取得できる。
 api_url = auth.extra.access_token.consumer.options[:site] + "/v2/home/category"
 raw_info = MultiJson.load(auth.extra.access_token.get(api_url).body)['categories']
 p "categries =>  #{raw_info}"

ジャンルなども基本的には同じ要領で取得する。

Zaimの情報を分析して家計を助けるぞー

2013年11月27日水曜日

EC2インスタンスにRuby1.9.3をインストールする。

Amazon EC2のRHEL6の無料インスタンスにRuby1.9.3をyumでインストールしたかったが、初期設定のレポジトリには1.8.x1しかなかったため、パッケージをビルドしてインストールすることを試みた。

1.まずビルドに必要なパッケージをインストールする。
  対象は以下のとおり。
  zlib-devel
  openssl-devel
  readline-devel
  tk-devel
  libyaml-devel
  libffi-devel
  rpm-build

  注意
  libyaml-develをインストールしたときに、以下のようなエラーが発生するかもしれな
  い。
  Error:  Multilib version problems found. This often means that the root
       cause is something else and multilib version checking is just
       pointing out that there is a problem.

  要は複数のバージョンがあるので問題ありということ。
  元々インストールされていたのはlibyaml.i686、必要なのはlibyaml-devel.x86_64
      なので元々あったほうをアンインストールし、libyaml-devel.x86_64をインストール
  した。
      sudo yum remove libyaml.i686
      sudo yum install   libyaml-devel.x86_64
 
2.home直下にrpmbuildディレクトリを作成する。

3.rpmbuildディレクトリの下に以下5つのディレクトリを作成する。
  BUILD  RPMS  SOURCES  SPECS  SRPMS

4.SOURCESディレクトリに移動する。
  cd ~/rpmbuild/SOURCES

5.ruby1.9.3のアーカイブをダウンロードする。
  wget http://ftp.ruby-lang.org/pub/ruby/1.9/ruby-1.9.3-p448.tar.gz

6.SPECSディレクトリに移動する。
  cd ~/rpmbuild/SPECS

7.specファイルをダウンロードする。
 wget https://raw.github.com/imeyer/ruby-1.9.3-rpm/master/ruby19.spec

8.ビルドを実行する。
  rpmbuild -bb ruby19.spec

9. rpmファイルが作成されていることを確認する。
 ~/rpmbuild/RPMS/x86_64/ruby-1.9.3p448-1.el6.x86_64.rpm

10.~/rpmbuild/RPMS/x86_64ディレクトリに移動する。
   cd ~/rpmbuild/RPMS/x86_64

11.パッケージをインストールする。
  sudo rpm -ivh ruby-1.9.3p448-1.el6.x86_64.rpm

12.インストールできたか確認する。
  ruby -v

  OK。1.9.3が入った!

  ruby 1.9.3p448 (2013-06-27 revision 41675) [x86_64-linux]




2013年11月20日水曜日

AWSでWindowsのFTPサーバ(パッシブモード)を構築する

仕事でWindowsサーバをFTPサーバとする必要があったため、AWS上で構築してみた。
その作業のまとめ。
前提として
 ・WindowsサーバのEC2インスタンスを作成しておくこと。
 ・そのインスタンスにFTPサービスをインストールしておくこと。
 ・RDPで接続できること。
が必要。

今回は動作確認のため同一VPC内に2つのWindowsサーバインスタンスを作成した。
FTPクライアントとFTPサービスのような位置づけ。
FTPプロトコルの利用範囲だが、
「インターネットからのFTPは許さない。指定VPC内のみ許可する」
ものとする。

1.まずマネジメントコンソールからVPCを選択する。
2.Security Groupsを選択する。

3.右ペインから用意したインスタンスが使うVPCを選択する。

4.下のペインで以下のように設定する。
 Create a new Rule  -> Custom TCP Rule
   Port range             ->  21
   Source                   -> VPCのGroup ID。 (ここではsg-4ce9e12e)
 ポイントはSourceにVPCのGroup IDを入れる事である。これでVPC内でしかFTPが
 使えないようになる。VPCの名前はDetailsタブのGroupIDに書かれている。


5.Apply Rule Changesをクリックする。これをクリックしないと設定が反映されない。

6.手順4同様に今度はFTPの制御用ポートを設定する。WindowsサーバのWindowsファイアウォールのポリシーを見てみると1024-65535が制御用ポートとして設定されているのでVPCでも同じ設定をする。
 Create a new Rule  -> Custom TCP Rule
   Port range             ->  1024-65535
   Source                   -> VPCのGroup ID


7.これでFTPサーバに接続できればOK。
   ex)ftp://サーバIPアドレス/hoge
   *hogeディレクトリはあらかじめサーバ側に作成しておくと望ましい。

2013年10月30日水曜日

CentOSでSambaを使う。

CentOS6.2でsambaをインストールしてファイル共有サーバを構築する。

1.sambaをインストール
  yum install samba.x64_86

2.sambaがインストールされたことを確認する。
  yum list installed samba
  ->samba.x64_86 3.6.9-151.el6_4.1

4./etc/samba/smb.confに以下の設定を追加
[global]
        dos charset = CP932
        display charset = UTF-8
        workgroup = VMLAN
        netbios name = VMSAMBA
[public] <-フォルダ名がpublicとして公開される。
        path = /var/samba/shared <-後で実体のフォルダを作る
        writable = Yes
        write list = smbguest <-後でアカウントを作る。

5.sharedフォルダの作成
  mkdir /var/samba
  mkdir /var/samba/shared

6.sharedフォルダを読み書きOKにする。
  chmod 777 /var/samba/shared

7.アクセス用アカウントを作成する
  /usr/sbin/useradd -m smbguest

8.アクセス用アカウントにパスワードを設定する
  pdbedit -a smbguest

9.サービスを起動する
  rc.d/init.d/smb start
  rc.d/init.d/nmb start
  できればOS起動時に自動自動するようにしたほうがよい。

10.FWでSMB関連ポートを開く
   vi /etc/sysconfig/iptables で以下の設定を追加する。
 
   -A INPUT -p tcp --dport 139 -j ACCEPT
   -A INPUT -p udp --dport 137 -j ACCEPT
   -A INPUT -p udp --dport 138 -j ACCEPT
   -A INPUT -p tcp --dport 445 -j ACCEPT

   参考:http://futurismo.biz/archives/1390

11.しかしpublicフォルダにアクセスできない。
   selinuxによるセキュリティがかかっている。
   semanageコマンドでアクセスできるようにする。
 
  semanageコマンドが無い場合があるのでその場合は追加インストールする。
  /usr/bin/yum provides /usr/sbin/semanage

  ここは結構はまるところ。

12.以下のコマンドを実行
  semanage fcontext -a -t samba_share_t "/var/samba/shared"
  restorecon -RF "/var/samba/shared"

13.Windowsマシンからアクセスする。
  ¥¥サーバ名(またはIPアドレス)¥shared

14.ログイン要求されるのでsmbguestで認証する。

15.アクセスでき晴れて書き込みできる状態に。

2013年10月10日木曜日

GoogleSpreadSheetでToDoタスクを作り、期限が近づいたらメールで通知する。

GoogleSpreadSheetは非常に便利だ。

Excelと同じように表計算やマクロ機能(Google Apps Script)を持っているが
何と言っても一番はスケジューラ機能だ。
スプレッドシートの内容を、指定した時間にメールで通知するなんてことも可能。
これはExcelだけではなかなかできないと思う。

という訳で自分の仕事を円滑に進められるようにするためにということで、
GoogleSpreadSheetを多様しているのだが、中でもToDoリストとしての活用は
いろいろな方でも使えるものだと思うのでサンプルコードを書いてみた。

コードはGitHubにアップしているのでそれを参考にしていただければ思う。
https://github.com/maar4569/notifyToDoWithGAS

そのサンプルを元にToDoアプリを作ってみようと思う。

このToDoアプリができること。
・利用者はスプレッドシートにToDoを書く。
・ToDoの締め切り日が近づいてくるとメールで通知してくれる。
 N日前ですよとか、締め切り当日ですよとか、過ぎてますよとか。

作成手順
1.GitHubからコードをダウンロードしておく。
2.まずはGoogleドライブ上に新規のスプレッドシート「ToDoList」を作成する。
  2-1.シート名を「ToDo」に変更する。
  2-2.ToDoListに1行目のカラムに「task」「deadline」「notes」「deleted」と記述する。
 task やるべきことを書いておく。
 deadline 期日を書く。(yyyy/mm/dd形式で)
 notes 補足事項があれば書いておく。
 deleted メールで通知する必要が無くなった場合「1」と書いておくと通知しなくなる。
     つまりもう済んだタスクは1と書いておく。書かないとずっとメールで通知して
     くることになる。

  2-3.2行名以降にはやるべきtaskを書く。


3.ダウンロードしたコードを挿入する。
  3-1.空のプロジェクトを選択。 

  3-2.[ファイル]-[新規作成]-[スクリプトファイル]を選択。

  3-3.main.gsというファイル名に変更し、ダウンロードしたコードをコピペする。

4.関数 notifyDoDoを探し、変数に設定する。(赤い字のところを変更する)
function notifyToDo(){
  //Spread Sheet Config
  var sheetName      = "ToDo";  <-シート名を設定する。手順2.1でToDoにしたのでここは編集しなくてもよい。
  var spreadSheetKey = "your spread sheet Key"; <-スプレッドシートのキーを設定する
スプレッドシートを開いたときのURLで下のアドレスバーの黒塗りの箇所に該当する文字列を登録する。

  //mail config
  var subject        = "[MyToDoリストからの通知]ステータスのお知らせ";  <-メールのタイトルを設定する
  var recipients     = new Array("mailaddress"); <-メールアドレスを設定する。複数ある場合は、カンマ区切りで設定する。ex)aaa@x.com,bbb@x.com
  //notification config
  var threshold      = 4;   <-期限の4日間になったら通知する

5.関数notifyToDoを実行する。

6.SpreadSheet、Gmailの利用承認を求められる。
  6-1.「続行」をクリックする。


  6-2.「承認する」をクリックする。
   これによってこのアプリがSpreadSheetへのアクセスとメール送信が許可される。


7.トリガーを設定する。
 これは定期的にToDoの状況をメールで通知するようにするためである。

  7-1.「リソース」から「現在のプロジェクトのトリガー」を選択。

  7-2.「トリガーが設定されていません。・・・」をクリックする。

  7-3.トリガーを設定する。
          実行は、notifyTodo関数
          イベントは、時間主導型、日タイマー、午後4時から5時。
          これで毎日午後4〜5時の間にタスクのステータスがメールで通知される。



8.トリガーで設定した時間になるとメールで通知される。(めでたしめでたし)