本の紹介

私はシステム開発に関する仕事に携わっています。(特にSI)
2、3年前からWEBアプリケーションの脆弱性に関連するシステム開発に携わっていました。
普段、開発しているときにSQLインジェクションが・・・とか、XXSとか・・・なんて意識して
開発している人はあまりいないですよね。(少なくとも私のまわりにはいません)

以下の本は、WEBアプリケーションを開発する人にとっては是非、手に取ってほしいと思います。

S2Daoで複数のデータソースを扱う

S2Daoを使用しているシステム(S)で他システムに対してデータを更新しないといけなくなり、他システム(W)用のデータソースを追加します。

変更するファイルは以下の2つ。
j2ee.dicon
・dao.dicon

それぞれ、S用とW用に分割します。

まず、j2ee.diconについてトランザクション関連以外のコンポーネントを削除します。
j2ee.dicon

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container//EN"
"http://www.seasar.org/dtd/components.dtd">

  
  
  
  
  

各システム用のデータソースを定義したj2ee_s.dicon、j2ee_w.diconを作成します。
j2ee_s.dicon

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container//EN"
"http://www.seasar.org/dtd/components.dtd">

  
    
    

    
        
          "oracle.jdbc.driver.OracleDriver"
        

        
          "jdbc:oracle:thin:@xxx.xxx.xxx.xxx:1521:sss"
        

        "USER01"
        "PASSWORD01"
    

    
        600
        10
        true
        
    

    

j2ee_s.dicon

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container//EN"
"http://www.seasar.org/dtd/components.dtd">

  
    
    

    
        
          "oracle.jdbc.driver.OracleDriver"
        

        
          "jdbc:oracle:thin:@zzz.zzz.zzz.zzz:1521:www"
        

        "USER02"
        "PASSWORD02"
    

    
        600
        10
        true
        
    

    

dao.diconも分割します。それぞれで、S用、W用のj2ee.diconをインクルードします。
・dao_s.dicon

<?xml version="1.0" encoding="Shift_JIS"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container//EN"
"http://www.seasar.org/dtd/components21.dtd">

  
  
  
  
    
      
    

  

  
  
  
  
  
  
  
  
  
  
  
  

・dao_w.dicon

<?xml version="1.0" encoding="Shift_JIS"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container//EN"
"http://www.seasar.org/dtd/components21.dtd">

  
  
  
  
    
      
    

  

  
  
  
  
  
  
  
  
  
  
  
  

ActionやDaoのコンポーネント定義を記載しているapplication.diconを編集します。

・application.dicon

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container//EN"
"http://www.seasar.org/dtd/components21.dtd">

  
  
   ←分割後のdao.diconに変更
   ←分割後のdao.diconに変更

  
    
      aop.traceInterceptor
    

  

〜 省略 〜

 <!-- S用システムにアクセスするDAOアスペクト適用 -->
  
    dao_s.interceptor
    
      "jp.co.zzz.xxx.s.dao"
      ".*Dao"
    

  

  <!-- W用システムにアクセスするDAOアスペクト適用 -->
  
    dao_w.interceptor
    
      "jp.co.zzz.xxx.w.dao"
      ".*Dao"
    

  


仕組みが理解できていれば、意外と簡単。

テーブルのデータをCSVファイルに出力する

とあるシステムではレプリケーション機能を使っていて、マスター1台、スレーブ2台というような構成になっている。
現時点では原因が判明していないが、レプリケーションに遅延が発生して、ある短い期間でマスタとスレーブでデータ不整合となる状態となった。
現状は整合性が取れている状態なのだが、念のため3台のテーブルの内容に差異がないことの確認をすることになった。
対象のテーブルのデータ量は多くないので、データをCSVファイルに出力させて内容のdiffを取ることになった。

そこで以下を実行し、データをCSVファイルに出力することにした。

$ mysql -uXXXXX -pXXXXX XXXXdb;

mysql>SELECT * FROM テーブル名 INTO OUTFILE "/home/admin/XXXXX.csv" FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '囲み文字の指定';
mysql>

振り返ってみる

ふと、思い立って自分の職務経歴を棚卸してみました。
今の会社に入社して丸10年が経ちました。
幸いなことに周りの対人関係にも恵まれ、仕事にも恵まれ?、ここまで走ってきた感じです。

ここに載せることは控えますが、色々な開発言語、RDBMS、業種の案件をやらせてもらいました。
いろいろな仕事をやらせてくれた今の会社に感謝です。

Cassandraにデータを入れてみる

インストールフォルダにREADME.txtがあり、そこに書いてあることを実行してみる。

まずはKeyspace1というキースペースを作成する。

[default@unknown] create keyspace Keyspace1;
5fb17170-9fe0-11e0-0000-242d50cf1ffc
Waiting for schema agreement...
... schemas agree across the cluster
[default@unknown]

使用するKeyspaceを指定する。

[default@unknown] use Keyspace1;
Authenticated to keyspace: Keyspace1
[default@Keyspace1]

次はColumn familyを作成する。(RDBでいうところのテーブルみたいなものか?)

[default@Keyspace1] create column family Users with comparator=UTF8Type and default_validation_class=UTF8Type and key_validation_class=UTF8Type;acc99e60-9fe0-11e0-0000-242d50cf1ffc
Waiting for schema agreement...
... schemas agree across the cluster
[default@Keyspace1]

データを入れてみる。

[default@Keyspace1] set Users[jsmith][first] = 'John';
Value inserted.
[default@Keyspace1] set Users[jsmith][last] = 'Smith';
Value inserted.
[default@Keyspace1] set Users[jsmith][age] = long(42);
Value inserted.

入れたデータを取得してみる。

[default@Keyspace1] get Users[jsmith];
=> (column=age, value=42, timestamp=1309085036510000)
=> (column=first, value=John, timestamp=1309085005307000)
=> (column=last, value=Smith, timestamp=1309085015807000)
Returned 3 results.

案外、簡単にできるものなんですね。。。
そりゃ、書いてある通りにコマンド打っているだけですからね。