ウィリアムのいたずらの、まちあるき、たべあるき

ウィリアムのいたずらが、街歩き、食べ物、音楽等の個人的見解を主に書くブログです(たま~にコンピューター関係も)

年金記録漏れの責任者。。。って、やっぱ、主キーを決めた人?

2007-06-11 19:06:58 | Weblog

ここのニュース
歴代厚相の責任追及=中川自民幹事長が表明-年金記録漏れ
http://headlines.yahoo.co.jp/hl?a=20070611-00000003-jij-pol


えーっと、責任追及っていっても。。。

年金記録漏れで、名寄せできない、技術的な問題と聞かれたら。。。

データベースの主キーに、、「基礎年金番号制度」みたいな、一意のキーをわりあてなかったってこと?(もし割り当てていれば、「基礎年金番号制度」なんてなくていいはず)

 つまり、名前や生年月日なんていったら、はじめから名前は(女性の場合)変わる可能性があるわけで、そーいうもので、照合させようって言うのが無茶で、また、国民年金、厚生年金、そのたもろもろの年金を一貫する、1人に対して一意な番号を、ある明確なタイミングで付与しなければ、結局名寄せ作業が出て、そのとき、データの入力ミスがあれば、名寄せできなくなることは明確。。

 なので、そういう一意のキーを与えなかった設計者が大問題っていうことになるけど。。




 で、だからこそ、アメリカは、社会保険番号(ソーシャルセキュリティナンバー)があるわけで、これだと、一生ついて回るので、名寄せの必要もない。ぜんぶこれでやればOK・・・

 でも、じゃあ、どーして、設計者はそーいう一意の番号を振らなかったのか?

 って考えたら、これは明確で、住基ネットのときにも問題になったように、これをやってしまうと、国民背番号制になってしまうので、徴兵のとき楽、とか、プライバシーは?とか。。

 っていうことで、イロイロ問題になりそうというか、今も問題なので、導入できなかったのであろう。




 つまり、致命的な問題は、年金制度設計時に社会保険番号(ソーシャルセキュリティナンバー)がもてなかったということで、これは、当時の社会としてはしかたないこと。。

 で、それにくらべると、業務の怠慢とかは、問題加減として、ちょっと落ちる
(業務の怠慢の責任は、本人のせいか?業務フローのせいか?そーいう人を採用したせいか?実際のところ、責任は難しい)

 ということで、社会保険番号の代わりとして、「基礎年金番号制度」をもったことは、まちょっと、よくなったのかなとはいえる(前にも書いたけど、これ自体が非難されることとは思えない。プライバシー上の問題とか、導入したときのしかたの問題っていうならわかるんだけど)




そういう点で、責任追及してもなあ。。
今の業務フローが変わらないんじゃなあ??
という気がする。

 むしろ、今の業務フローをすべて見直し、おかしいところを直すべき。

 そういう点で、
<民主党>参院選マニフェストの目玉に「年金通帳」交付
http://headlines.yahoo.co.jp/hl?a=20070608-00000097-mai-pol

の年金通帳という考えは、払い込んだ金額を(時効前に)自分で確認できるので基本的にはいい制度だと思う。

 ただ、施行するには、導入費用がどれくらいかかるかとかで難しいと思うので、今のネットで確認するサービスの使い勝手をよくするしかないのかな?という気もする。もちろん、それを年金通帳としてもいいけど。。まあ、その辺は小さな問題かな。。



  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

開発の初めから順番に書いていってみる その58:プログラミング(20)入出力の自動生成8

2007-06-11 16:06:17 | Weblog

 シリーズ「開発の初めから順番に書いていってみる」の続きです。
 現在プログラミングのDB入出力の自動生成をやっています。
 今回はここまでのまとめとして、今までやってきた、ユーザーテーブルにおけるDB入出力のクラスを続けて書きます。
 今回はトランザクション処理なしバージョンです。




■仕様

 ユーザーテーブルuserTBLにおいて、
 項目が
   name ユーザー名
   pass パスワード
   kind 種別
 とあるとき、select,insert,update,deleteを行うクラスです。



■ソース

そのソースは、以下のとおり

●userTBL.java
import java.util.*;
import java.sql.*;

public class userTBL {

	/*
	 * 	JDBC ドライバクラス名
	 */
	 public static final String JDBCDriverName = DBKankyo.JDBCDriverName;

	/*
	 * 	JDBC 接続URL
	 */
	 public static final String JDBCURL = DBKankyo.JDBCURL;

	/*
	 *  ユーザー名
	 */
	 public static final String JDBCUserName = DBKankyo.JDBCUserName;

	/*
	 *  パスワード
	 */
	 public static final String JDBCPassword = DBKankyo.JDBCPassword;

	/*
	 * SQL実行<BR>
	 * @return	int		0:OK,1:Error
	 */
	public	int	execute(String cmd)
	{
		try
		{
			
	      		// ドライバクラスをロード
      			Class.forName(JDBCDriverName); 

	      		// データベースへ接続
      			Connection con =
			   DriverManager.getConnection(JDBCURL,JDBCUserName,JDBCPassword);

	      		// ステートメントオブジェクトを生成
      			Statement stmt = con.createStatement();

			//	実行
	  		stmt.execute(cmd);

	      		// データベースから切断
      			stmt.close();
      			con.close();
   		} 
   		catch (Exception e)
   		{
     			e.printStackTrace();
     			return	-1;
   		}
		return	0;
	}

	/*
	 * SQLの検索実行<BR>
	 * @return	Vector	結果(1レコード1HashMapで入っている)
	 */
	public	Vector	selectExecute(String cmd)
	{
		Vector allData = new Vector();

		try
		{
			
	      		// ドライバクラスをロード
      			Class.forName(JDBCDriverName); 

	      		// データベースへ接続
      			Connection con = 
			  DriverManager.getConnection(JDBCURL,JDBCUserName,JDBCPassword);

	      		// ステートメントオブジェクトを生成
      			Statement stmt = con.createStatement();
      			
      			// クエリーを実行して結果セットを取得
      			ResultSet rs = stmt.executeQuery(cmd);

	      		ResultSetMetaData meta = rs.getMetaData();
      
      			// 検索された行数分ループ
      			while(rs.next())
      			{
   				HashMap mp = new HashMap();
      				for(int i = 1 ; i <= meta.getColumnCount(); i ++ )
      				{
      					mp.put(meta.getColumnName(i),
						rs.getString(meta.getColumnName(i)) );
      				}
   				allData.add(mp);		
      			}
 
      			// データベースから切断
      			stmt.close();
      			con.close();
 	   	}
    		catch (Exception e)
    		{
      			e.printStackTrace();
      			return	null;
    		}

		return	allData;
	}

	/*
	 * 検索<BR>
	 * @param	Vector	komoku	検索する項目
	 * @param	Vector	where	検索条件
	 * @return	int		0:OK,1:Error
	 */
	public	Vector	select(Vector komoku,Vector where)
	{
		//	Select文の初め      		
		StringBuffer sqlbuf = new StringBuffer("SELECT ");

		//	項目名の羅列
      		if ( komoku	==	null )
      		{
      			sqlbuf.append("*");
      		}
	      	else
      		{
	      		for(int i = 0 ; i < komoku.size() ; i ++ )
      			{
	      			if ( i	>	0 )
      				{
      					sqlbuf.append(",");
      				}
				String taisho = (String)komoku.elementAt(i);
				sqlbuf.append(taisho);
      			}
      		}

		//	テーブル名が入る	
      		sqlbuf.append(" FROM TBL_A ");

		//	条件式の作成
		String	wstr = makeWhere(where);
		if ( wstr	!=	null )
		{
	      		sqlbuf.append(" WHERE " + wstr);
		}
		
		return	selectExec(sqlbuf.toString());
	}

	/*
	 * 追加<BR>
	 * @param	HashMap	taisho	対象、NULLのときエラー
	 * @return	int		0:OK,1:Error
	 */
	public	int	insert(HashMap taisho)
	{

		// ハッシュマップに入っている値を受け取り
		String	name	=	(String)taisho.get("name");
		String	pass	=	(String)taisho.get("pass");
		String	auth	=	(String)taisho.get("auth");

		int	out_flg;
			
		// ハッシュマップに入っている値を受け取り
      	         StringBuffer sqlbuf 
                     = new StringBuffer("INSERT INTO userTBL(");

		//==========================//
		//	項目名の書き出し	//
		//==========================//
		out_flg	=	0;
 		//ユーザー名の設定
		if ( name	!=	null )
		{
			if ( out_flg	==	0 )
			{
				out_flg	=	1;
			}
			else
			{
				sqlbuf.append(",");
			}
			sqlbuf.append("name");
		}      		
 		//パスワードの設定
		if ( pass	!=	null )
		{
			if ( out_flg	==	0 )
			{
				out_flg	=	1;
			}
			else
			{
				sqlbuf.append(",");
			}
			sqlbuf.append("pass");
		}      		
 		//権限の設定
		if ( auth	!=	null )
		{
			if ( out_flg	==	0 )
			{
				out_flg	=	1;
			}
			else
			{
				sqlbuf.append(",");
			}
			sqlbuf.append("auth");
		}      		


		// ") VALUES ("を書き出し      		
		sqlbuf.append(") VALUES (");
		
		//==========================//
		//	値の書き出し	//
		//==========================//
		out_flg	=	0;
 		//ユーザー名の設定
		if ( name	!=	null )
		{
			if ( out_flg	==	0 )
			{
				out_flg	=	1;
			}
			else
			{
				sqlbuf.append(",");
			}

			sqlbuf.append("'");
			sqlbuf.append(name);
			sqlbuf.append("'");
		}      		
 		//パスワードの設定
		if ( pass	!=	null )
		{
			if ( out_flg	==	0 )
			{
				out_flg	=	1;
			}
			else
			{
				sqlbuf.append(",");
			}

			sqlbuf.append("'");
			sqlbuf.append(pass);
			sqlbuf.append("'");
		}      		
 		//権限の設定
		if ( auth	!=	null )
		{
			if ( out_flg	==	0 )
			{
				out_flg	=	1;
			}
			else
			{
				sqlbuf.append(",");
			}

			sqlbuf.append("");
			sqlbuf.append(auth);
			sqlbuf.append("");
		}      		

		//	おしまい部分      		
		sqlbuf.append(")");

		//	実行
		return	execute(sqlbuf.toString());
	}

	/*
	 * 削除<BR>
	 * @param	Vector	where	対象、NULLのとき、全削除
	 * @return	int	0:OK,1:Error
	 */
	public	int	delete(HashMap where)
	{
		//	SQL文の書き出し
      	StringBuffer sqlbuf = new StringBuffer("DELETE FROM userTBL");
		if ( where	!=	null )
		{
			String	wstr = makeWhere(where);
			if ( wstr	!=	null )
			{
	      			sqlbuf.append(" WHERE " + wstr);
			}
		}
		return	execute(sqlbuf.toString());
	}

	/*
	 * 更新<BR>
	 * @param	HashMap	naiyo	set句の内容	
	 * @param	Vector	where	対象、NULLのとき、全削除
	 * @return	int		0:OK,1:Error
	 */
	public	int	update(HashMap naiyo,Vector where)
	{
		//	データチェック
		if ( naiyo	==	null )
		{
			return	-1;
		}
		if ( naiyo.size()	<=	0 )
		{
			return	-1;
		}

		//	SQL文の書き出し
      	StringBuffer sqlbuf = new StringBuffer("UPDATE userTBL SET ");
		String rec = setOneRec(naiyo);
		if ( rec	==	null )
		{
			return	-1;
		}
		sqlbuf.append(rec);

		String	wstr = makeWhere(where);
		if ( wstr	!=	null )
		{
	      	sqlbuf.append(" WHERE " + wstr);
		}
		
		return	exec(sqlbuf.toString());
	}

	/*
	 * where句を作る
	 * @param	Vector	whete
	 * @return	String	結果(1レコード1ハッシュマップで入っている)
	 */
	public	String	makeWhere(Vector where)
	{
		StringBuffer buf = new StringBuffer();
		
		//	WHEREデータがない
		if ( where	==	null )
		{
			return	null;
		}
		//	WHEREデータがない
		else if ( where.size()	==	0 )
		{
			return	null;
		}
		else
		{
			//	WHEREデータ1行分のとき
			if ( where.size()	==	1 )
			{
				HashMap map = (HashMap)where.elementAt(0);
				if ( map.get("*zyoken")	!=	null )
				{
					//	条件文が指定してある
					buf.append((String)map.get("*zyoken"));
				}
				else
				{
					//	条件文は自分でつくる-1行分
					buf.append(whereOneRec(map));
				}
			}
			//	条件文は自分でつくる-複数行アリ=ORでつなぐ
			else
			{
			   for(int i = 0 ; i < where.size() ; i ++ )
			   {
			       if ( i	==	0 )
			       {  
				buf.append("( ");
			       }
			       else
			       {
			  	buf.append("OR ( ");
			       }
			       buf.append(whereOneRec((HashMap)where.elementAt(i)));
		 	       buf.append(" ) ");
			   }	
			}
		}
		return buf.toString();
	}

	/*
	 * where句の検索条件のAND1個分を作る
	 * @param	HashMap	taisho
	 * @return	String	結果(1レコード1ハッシュマップで入っている)
	 */
	public	String	whereOneRec(HashMap taisho)
	{
		return makeOneRec(taisho," AND ");	
	}

	/*
	 * set句の更新条件を作る
	 * @param	HashMap	taisho
	 * @return	String	結果(1レコード1ハッシュマップで入っている)
	 */
	public	String	setOneRec(HashMap taisho)
	{
		return makeOneRec(taisho," , ");	
	}

	/*
	 * where句の検索条件のAND1個分を作る
	 * @param	HashMap	taisho
	 * @return	String	結果(1レコード1ハッシュマップで入っている)
	 */
	public	String	makeOneRec(HashMap taisho,String kugiri)
	{
		StringBuffer buf = new StringBuffer();
		String	name	=	(String)taisho.get("name");
		String	pass	=	(String)taisho.get("pass");
		String	kind	=	(String)taisho.get("kind");

		int	out_flg	=	0;

 		//ユーザー名の設定
		if ( name	!=	null )
		{
			if ( out_flg	==	0 )
			{
				out_flg	=	1;
			}
			else
			{
				buf.append(kugiri);
			}

			buf.append("name =");
			buf.append("'");
			buf.append(name);
			buf.append("'");
		}

 		//パスワードの設定
		if ( pass	!=	null )
		{
			if ( out_flg	==	0 )
			{
				out_flg	=	1;
			}
			else
			{
				buf.append(kugiri);
			}

			buf.append("pass =");
			buf.append("'");
			buf.append(pass);
			buf.append("'");
		}

 		//ユーザー種別の設定
		if ( kind	!=	null )
		{
			if ( out_flg	==	0 )
			{
				out_flg	=	1;
			}
			else
			{
				buf.append(kugiri);
			}

			buf.append("kind =");
			buf.append("");
			buf.append(kind);
			buf.append("");
		}

		return	buf.toString();
	}

}

(上記< > ¥は、本当は半角です)




■DBKankyo.java

環境設定のための定数宣言クラス

public class DBKankyo {

	/*
	 * 	JDBC ドライバクラス名
	 */
	 public static final String JDBCDriverName = "org.gjt.mm.mysql.Driver";

	/*
	 * 	JDBC 接続URL
	 */
	 public static final String JDBCURL
	   = "jdbc:mysql://localhost/test?useUnicode=true&characterEncoding=utf8";

	/*
	 *  ユーザー名
	 */
	 public static final String JDBCUserName = "ユーザー名";

	/*
	 *  パスワード
	 */
	 public static final String JDBCPassword = "パスワード";
}

(上記< > ¥は、本当は半角です)



ってところです。
次回は、トランザクション処理についてです。

  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

年金加入履歴をネットで確認する「年金個人情報提供サービス」。。。

2007-06-11 13:30:01 | Weblog

社会保険庁の「年金個人情報提供サービス」というサイトで

・これまでの公的年金制度の加入の履歴(加入制度、事業所名称、資格取得・喪失年月日、加入月数等)
・国民年金保険料の納付状況
・厚生年金の標準報酬月額、標準賞与額
・船員保険の標準報酬月額、標準賞与額

などが見られるそうなのですが。。。

詳しいことは、以下のGIGAZINEの記事
年金加入履歴をネットで確認する「年金個人情報提供サービス」とは?
http://gigazine.net/index.php?/news/comments/20070611_idpassnet_sia_go_jp/

(上記及び下記の斜体は、上記GIGAZINEの記事からの引用)

そこに、実際のどのページにいって、
どのように操作すればよいかがかいてあります。。

でもねでもね。。
まず、ログイン用のIDとパスワードをもらわなくっちゃいけなくて
(上記サイトに書いてあるのは、そのログインIDのもらい方)


で、いつこのログイン用のIDとパスワードが届くかなのですが、平常時で2週間ほどかかるそうです。現在はどう考えても平常時ではないのでいつ届くのかさっぱりわからないのが難点でしょうか……。

すぐに見れるわけではないのね(^^;)





  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

一般的な編集ソフトの作り方 その11:メモリ上への要素展開(共通要素の例の呼び出し)

2007-06-11 02:06:25 | 開発ネタ

 ワープロやドローイングソフトなどの編集ソフトを作る上での一般的な考え方を考える「一般的な編集ソフトの作り方」です。
 前回は、今までのまとめと、共通要素のサンプルを示しました。
 また、ここでは、共通要素から編集ソフトの各要素に落とし込むところについて、書いています。

 今回は、前回書いた共通要素の呼び出し部分について書いてみたいと思います。




■構成と仕様

 この例は、こんな構成になっています。
  クラス test-呼び出し部分、
  |   |
  |  クラスModel-モデル部分、今回はsaveとreadのみ
  |   |
  クラスItem-共通要素部分、前回示したとおり



クラスTestにメインがあって、ここから実行します。、
今回実行する内容(仕様)はこんなかんじ

1.ファイルtest.xmlを読み込み、メモリ上に展開します
2.読み込み内容を表示します
3.1番目の枠の2文字目を削除します
4.ID10番で枠を2番目に追加します。
5.kekka.xmlという内容で書き出します。

Testでこの内容を実行し、Modelのsave,readで読み書きを実行します。



■ソース

●test.xml

まず、読み込んだtest.xmlは、こんなかんじ

<?xml version="1.0"?>
<doc>
<waku id="1" x="0" y="0" name="Frame1">
	<moji id="3" val="a"/>
	<moji id="4" val="b"/>
	<moji id="5" val="c"/>
</waku>
<waku id="2" x="100" y="0" name="Frame2">
	<moji id="6" val="d"/>
	<moji id="7" val="e"/>
</waku>
</doc>

(上記< > ¥は、本当は半角)

要素の属性をXMLの属性で表し、要素の親子関係をXMLの親子関係で表しています。

●test.java
次に、呼び出し元test.javaは、こんなかんじ
import java.io.*;

public class Test {
	public static void main(String[] args) {
		Model	model 	=	new Model();
		String	infname	=	"test.xml";
		String	outfname=	"kekka.xml";
		
		try
		{
			File f = new File(infname);
			byte[] b = new byte[(int) f.length()];
			FileInputStream fi = new FileInputStream(f);
			Item	top	= model.read(fi,"doc");
			fi.close();

			//	読み込み内容の表示
			top.print(System.out);
			
			//	一番目の枠の二文字目を削除
			Item waku1 = top.getChild(0);
			waku1.deleteChild(1);
			
			//	枠を追加
			Item sinkiWaku = new Item();
			sinkiWaku.itemKind	=	"waku";
			sinkiWaku.attr.put("id","10");
			top.insertChild(sinkiWaku,1);
			
			//	書き出し
			f = new File(outfname); 
			FileOutputStream fo = new FileOutputStream(f); 
			model.save(fo,top);
			fo.close();
		}
		catch(Exception e)
		{
			e.printStackTrace();
			return;
		}

	}
	

}

(上記< > ¥は、本当は半角)


●Model.java

そして、モデル部分Model.javaは、今回はこんな感じ(将来、ここの部分は増えていきます)
import javax.xml.parsers.*;

import org.w3c.dom.*;

import	java.io.*;
//出力のために追加
import javax.xml.transform.*;
import javax.xml.transform.dom.*;
import javax.xml.transform.stream.*;

public class Model {

	/*
	 * 読み込み
	 * @param	is		読み込みストリーム
	 * @param	tag		トップのタグ
	 * @return	トップのItem
	 */
	public	Item	read(InputStream is,String	tag)
	{
		Node	topNode	=	null;
		
		if ( is == null )
			return	null;
		
		try
		{
			//  ドキュメントビルダーファクトリを生成
			DocumentBuilderFactory dbfactory 
                               = DocumentBuilderFactory.newInstance();
			//  ドキュメントビルダーを生成
			DocumentBuilder builder
                                = dbfactory.newDocumentBuilder();
			//  パースを実行してDocumentオブジェクトを取得
			Document xtree = builder.parse(is);

			NodeList list =	xtree.getElementsByTagName(tag);
			if ( list.getLength() >	0 )
			{
				topNode	=	list.item(0);
			}
			else
			{
				return	null;
			}
		}catch(Exception e)
		{
			e.printStackTrace();
			return	null;
		}

		Item	top =	new	Item();
		top.readData(topNode);
		return	top;
	}

	/*
	 * 書き出し
	 * @param	os		書き出しストリーム
	 * @param	top		トップのItem
	 */
	public	int	save(FileOutputStream os,Item top)
	{

		Document xtree = null;

		//==============================//
		//	保存データ作成	     //
		//==============================//
		try
		{
			DocumentBuilderFactory dbfactory = 
				DocumentBuilderFactory.newInstance();
			DocumentBuilder builder = 
                dbfactory.newDocumentBuilder();
			xtree = builder.newDocument();
		}
		catch(Exception e)
		{
			e.printStackTrace();
			return-1;
		}
		if ( xtree	== null )
			return-1;
		
		//	書き出しデータを作成
		Node topNode = top.saveData(xtree);
		xtree.appendChild(topNode);
        
		//==============================//
		//	変換のための元生成     //
		//==============================//
		DOMSource source= new DOMSource(xtree); 

		//==============================//
		//  変換先(ファイル)生成      //
		//==============================//
		StreamResult result = new StreamResult(os); 

		//==============================//
		//	変換		     //
		//==============================//
		try
		{
			TransformerFactory transFactory
                    = TransformerFactory.newInstance(); 
			Transformer transformer
                    = transFactory.newTransformer(); 
			transformer.transform(source, result); 
		}
		catch(Exception e)
		{
			e.printStackTrace();
			return-1;
		}
		return	0;
	}
}

(上記< > ¥は、本当は半角)




具体的な説明は、今後します。
今回は、ここまで。



  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする