2014年5月18日日曜日

Raspberry Piセットアップ日記(8)Gmailでメール送信

●Gmailでメール送信
ssmtpを使う

1、ssmtpのインストール
$ sudo apt-get install ssmtp
2、ssmtpの設定
$ sudo vi /etc/ssmtp/ssmtp.conf 
#
# Config file for sSMTP sendmail
#
# The person who gets all mail for userids < 1000
# Make this empty to disable rewriting.
#root=postmaster

# The place where the mail goes. The actual machine name is required no 
# MX records are consulted. Commonly mailhosts are named mail.domain.com
mailhub=smtp.gmail.com:587

# Where will the mail seem to come from?
#rewriteDomain=

# The full hostname
#hostname=raspberrypi

# Are users allowed to set their own From: address?
# YES - Allow the user to specify their own From: address
# NO - Use the system generated From: address
#FromLineOverride=YES

AuthUser=Gmailのアカウント名
AuthPass=Gmailのパスワード
AuthMethod=LOGIN
UseSTARTTLS=YES
UseTLS=Yes
3、送信テスト
$ vi mailtest.txt
From:gmailのメールアドレス
To:あて先メールアドレス
Subject:test

Mail Test
$ sendmail -t < mailtest.txt

●参考
ラズベリーパイ(raspbian)を使ってみる - 5分でメールを送信できるようにする -

Raspberry Piセットアップ日記(7)crontabのエディタ変更

●crontabのエディタを変更


update-alternativesを使う
 $ sudo update-alternatives --config editor
alternative editor (/usr/bin/editor を提供) には 3 個の選択肢があります。

  選択肢    パス             優先度  状態
------------------------------------------------------------
* 0            /bin/nano           40        自動モード
  1            /bin/ed            -100       手動モード
  2            /bin/nano           40        手動モード
  3            /usr/bin/vim.tiny   10        手動モード

現在の選択 [*] を保持するには Enter、さもなければ選択肢の番号のキーを押してください: 3
update-alternatives: /usr/bin/editor (editor) を提供するために 手動モード で /usr/bin/vim.tiny を使います

2014年5月15日木曜日

KakeiWeb開発日記(3) : 一覧画面のページング

プログラミングスキル維持のため、家計簿システム(KakeiWeb)を作ろうという試み。 ●一覧画面のページング

(1)1ページ分のデータだけとってくるにはJPAのQuery#setFirstResult、Query#setMaxResultsを設定してクエリーを実行する

 public List getList(int page) {
  int first_result = (page-1) * rowsPerPage;
  TypedQuery q = em.createNamedQuery("CreditCard.findAll",CreditCard.class);
  q.setFirstResult(first_result);
  q.setMaxResults(rowsPerPage);
  return q.getResultList();
 }

(2)管理ビーンにJSFで扱いやすいようメソッド/プロパティを実装し、JSFで呼び出す

   
     
      
   


 public boolean hasNextPage() {
  return currentPage < pages;
 }
 public boolean hasPrevPage() {
  return currentPage > 1;
 }
 public String goPage(int page) {
  return "ListCreditCard?faces-redirect=true"+(page > 0 ? "&page="+page : null);
 }
 public int getCurrentPage() {
  return currentPage;
 }

前のページがないときなどは出したくないが、レイアウトが崩れるのでその辺は悩みどころ。
とりあえず今の状態で、完了とする。


●今後(短期課題)
済(1)一覧画面のページング処理実装
中(2)トランザクション編集画面の開発
    ・Excelフィーリング
    ・キーボード操作
    ・少ないキーストローク(自動日付、自動フィールド移動的な)
 (3)記入用Androidアプリの開発


●今後(中期課題)
 (1)本番環境をRaspberry Pi上へ構築する
 (2)マスタメンテ画面のテンプレート化


●今後(長期課題)
 (1)外部公開(Internet経由で入力・参照できるようにする)

2014年5月14日水曜日

MySQLのRaspberryへの移行

Eclipseの接続先をRaspberryPiに向ける

1、Glassfish コンソール起動(localhost:4848)
2、接続プールの編集
  リソース - JDBC - JDBC接続プール - 追加プロパティ タブの URL,user,password を編集
3、Eclipseで接続確認して、OK!

●今後(短期課題)
中(1)一覧画面のページング処理実装
済(2)開発DB環境をRaspberry Piに移行する。
未(3)マスタメンテ画面のテンプレート化

●今後(中期課題)
 (1)本番環境をRaspberry Pi上へ構築する


●今後(長期課題)
 (1)外部公開(Internet経由で入力・参照できるようにする)
 (2)記入用Androidアプリの開発

MySQLの移行



開発用にCentOS上に立てていたMySQLを、Raspberry Pi上に移行する。
さらにMySQL 5.1系(MyISAM)から5.5系(InnoDB)への移行も行う

●移行手順(概要)
1、新MySQL上にDBを作る
2、旧MySQLからmysqldumpでDBをダンプする
3、ダンプ内のEngine設定をMyISAMからInnoDBに変更
4、新MySQL上にダンプをインポートする

●移行手順(詳細)
1、新MySQL上にDBを作る
mysql> create database test;

2、旧MySQLからmysqldumpでDBをダンプする
$ mysqldump -u root -p kakei > kakei.sql

3、ダンプ内のEngine設定をMyISAMからInnoDBに変更
$ vi kakei.sql
%s/MyISAM/InnoDB/g

4、新MySQL上にダンプをインポートする
$ mysql -u kowner -p KakeiWebDev < kakei.sql

一部、キー長が長すぎるなど怒られたが、適宜ダンプを修正し再実行でOK。

●参考
MySQL(DB)の移行

MySQLのデータベースを別サーバーに移行する

Useful sed / awk liners for MySQL


2014年5月13日火曜日

SQL Server ログ配布

ログ配布の構成
http://technet.microsoft.com/ja-jp/library/ms190640.aspx

1、バックアップフォルダの共有
  トランザクションログバックアップを取るフォルダをネットワーク共有する
  とりあえずEveryone 読み書き可にした

2、プライマリ側でログ配布の設定&セカンダリ作成
(1)データベースのプロパティ→トランザクションログの配布→「ログ配布構成のプライマリ データベースとして有効にする」をON
(2)[トランザクション ログのバックアップ] で [バックアップの設定] をクリック
(3)[バックアップ フォルダーのネットワーク パスを指定する]を入力
   \\primary_server\shared_bkup
(3)バックアップ フォルダーがプライマリ サーバーに存在する場合は、バックアップ フォルダーのローカル パスを入力
   D:\backup
(4)バックアップジョブのスケジュールをクリック
(5)間隔を1分に設定
(6)OKを押す
(7)[セカンダリ サーバー インスタンスとデータベース] の [追加] をクリック
(8)接続をクリックしてセカンダリに接続
(9)[セカンダリ データベースの初期化] タブで
   「プライマリデータベースの完全バックアップを生成して、セカンダリデータベースに復元します」を選択
   復元オプションでフォルダを適切に設定
(10)[ファイルのコピー] タブの
    [ファイルのコピー先フォルダー] を入力
    スケジュールで間隔を1分に設定
(11)[トランザクションログの復元] タブの [バックアップ復元時のデータベース状態] で、[復旧モードなし]を選択
    スケジュールで間隔を1分に設定
(12)OK
(13)OK スクリプトは出力できない

ちなみにプライマリへの1000万件のINSERTがセカンダリに伝播するまで少なくとも1.5時間以上かかった。
正確には途中でキャンセルしたので不明。
個人的には使えない性能。(もちろん必要とされる性能要件による)

2014年5月12日月曜日

MySQLの設定

KakeiWeb開発をRaspberry Piで行うにあたり、mysqlのセットアップを済ませておく

●MySQLの設定
1、セキュア設定
$ sudo mysql_secure_installation

2、my.cnfの編集
文字化け対策、リモート接続を設定する
[mysqld]
...
character-set-server = utf8
# 以下の行はコメントアウト
#bind-address           = 127.0.0.1

[client]
...
default-character-set=utf8

編集したら、再起動
$ sudo service mysql restart

3、ユーザーの作成
$ mysql -u root -p
mysql> grant all privileges on KakeiWebDev.* to dbuser@localhost identified by 'xxxx';
mysql> grant all privileges on KakeiWebDev.* to dbuser@'111.111.111.%' identified by 'xxxx';

4、ポート開放
$ sudo ufw allow 3306/tcp

5、データベースの作成
mysql> create database KakeiWebDev;

2014年5月9日金曜日

KakeiWeb開発日記(2)

プログラミングスキル維持のため、家計簿システム(KakeiWeb)を作ろうという試み。

●JPAにおけるトランザクション実装
EJBにして、@TransactionAttributeアノテーションを使うのがよさげ。

public void insert(CreditCard e) throws Exception {
    UserTransaction utx = (UserTransaction)new InitialContext().lookup("java:comp/UserTransaction");
    utx.begin();
    em.persist(e);
    utx.commit();
}
JNDI(InititalContext)やJTA(UserTransaction)がやたらExceptionを投げてくるので
どのレイヤで吸収させるべきかの検討が必要であった。

@Named
@SessionScoped
@Stateful
public class Ejb implements Serializable {
    ...
    @TransactionAttribute(TransactionAttributeType.REQUIRED)
    public void insert(CreditCard e) {
        em.persist(e);
    }
}

例外キャッチ不要。トランザクションの開始終了の宣言不要。
これは楽!
ちなみに@RequestScopedにするなら、@Statelessのほうがおそらくよい。

参考
http://stackoverflow.com/questions/4294680/transaction-not-created-automatically-even-if-transactionattributetransactiona

http://otndnld.oracle.co.jp/document/products/wlw/docs103/guide/controls/conControlTransactions.html

●今後(短期課題)
(1)一覧画面のページング処理実装
(2)環境をRaspberry Piに移行する。

KakeiWeb開発日記(1)

プログラミングスキル維持のため、家計簿システム(KakeiWeb)を作ろうという試み。

●構成
OS:Linux(Raspbian)
Web/AP:GlassFish
アプリケーションフレームワーク:Java EE(JFS+JPA)
バッチ処理:Java+cron
DB:MySQL

●現時点の状況
永続化、画面遷移、その他もろもろ理解を目的として
マスターメンテ画面(クレジットカードマスター)を作成中。
リスト表示、メンテ画面表示、永続化まで一応動く状態。

●今後(短期課題)
(1)一覧画面のページング処理実装
(2)トランザクション開始・終了のスマートな実装
 JTAでトランザクションを実装しているが投げてくるexceptionが多くcatch実装が面倒。
 スマートなやり方を検討する
(3)環境をRaspberry Piに移行する。

2014年5月8日木曜日

Thumbs.db:encryptable


Windows7のフォルダにいつの間にか「Thumbs.db:encryptable」というファイルができている。
これは削除しようとしてもエラーになって消えない。(そんなファイルはありません的なことを言われる)
どうもファイル名にコロン(:)が入っていて、もともとコロンはNTFSでは
ファイル名として使えない記号なので、エラーになる、ということらしい。
みんなLinuxでマウントして消すということで解決している模様。

私も結局、日経Linux付録のUbuntu13.10ブータブルDVDからUbuntuを起動して、無事削除できた。

2014年5月3日土曜日

Raspberry Piセットアップ日記(6)ファイルサーバー化

●ファイルサーバー化 続き

ファイルシステムがNTFSだとめっちゃ遅いので、ext4にきりなおす。

参考


1.マウント済みディスクのアンマウント
 $ sudo umount /dev/sda2

2.3TBなのでpartedでパーティションをきりなおす
$ sudo parted -l
Model: I-O DATA HDJ-U (scsi)
Disk /dev/sda: 3001GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt

Number  Start   End     Size    File system  Name                          Flags 1      17.4kB  134MB   134MB                Microsoft 

reserved partition  msftres
 2      135MB   3001GB  3000GB  ntfs         Basic data partition


Model: SD  (sd/mmc)
Disk /dev/mmcblk0: 16.0GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos

Number  Start   End     Size    Type      File system  Flags
 1      4194kB  1445MB  1441MB  primary   fat32        lba
 2      1447MB  16.0GB  14.5GB  extended
 5      1451MB  1514MB  62.9MB  logical   fat32        lba
 6      1518MB  16.0GB  14.5GB  logical   ext4
 3      16.0GB  16.0GB  33.6MB  primary   ext4

$ sudo parted /dev/sda
GNU Parted 2.3
Using /dev/sda
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) print                                                            
Model: I-O DATA HDJ-U (scsi)
Disk /dev/sda: 3001GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt

Number  Start   End     Size    File system  Name                          Flags 1      17.4kB  134MB   134MB                Microsoft 

reserved partition  msftres
 2      135MB   3001GB  3000GB  ntfs         Basic data partition

3.パーティションテーブルの変更
(parted) mklabel
New disk label type? gpt
Warning: The existing disk label on /dev/sda will be destroyed and all data on
this disk will be lost. Do you want to continue?
Yes/No? y

4.パーティションの作成
(parted) mkpart
Partition name?  usbdisk
File system type?  [ext2]? ext3
Start? 0%
End? 3001GB

(parted) print
Model: I-O DATA HDJ-U (scsi)
Disk /dev/sda: 3001GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt

Number  Start   End     Size    File system  Name     Flags
 1      1049kB  3001GB  3001GB               usbdisk

5.ファイルシステムの作成
$ sudo mkfs -t ext4 /dev/sda1
mke2fs 1.42.5 (29-Jul-2012)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
183148544 inodes, 732566272 blocks
36628313 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=0
22357 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks: 
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,         4096000, 7962624, 11239424, 20480000, 23887872, 

71663616, 78675968, 
        102400000, 214990848, 512000000, 550731776, 644972544

Allocating group tables: done
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done


6.fstabの修正
/dev/sda1       /mnt/usbdisk1    ext4   defaults,noatime,nobh,data=writeback,commit=60  0       0

7.マウント
$ sudo mount /mnt/usbdisk1

8./etc/samba/smb.confの修正
[nas]
   comment = nas directory
   path = /mnt/usbdisk1/nas
   guest ok = yes
   read only = No
   writable = Yes
   hosts allow = 192.168.0.0/255.255.255.0
   security = server
   valid users = foo
   create mode = 0666
   directory mode = 0777

9.samba再起動
$ sudo service samba restart


体感的には早くなったように思う。

2014年5月2日金曜日

powershellで$を含む文字列を置換する



たとえば
hello,${name}
という文字列の${name}の部分を"world"に変えたいとき

'hello,${name}' -replace '${name}',"world"

ではダメで、

'hello,${name}' -replace "\`$\{name}","world"

これでOK。

からくりとしては
1、$がpowershellで変数を表す特殊文字なので、`でエスケープする必要がある
2、さらに、$は正規表現で行末を表す特殊文字でもあるので、さらに\でエスケープする必要がある

ということのようです。
なお中括弧{}も正規表現では意味があるので\でエスケープしています。


参考
http://goldyrain.blogspot.jp/2011/12/powershell.html