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

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

年金カード、一見よさそうだけど、もし、キャッシュカード機能がつくと?(0時45分ころ修正)

2007-06-14 23:29:49 | Weblog

年金関係のことを書くと、見る人が増えるかんじなので、今日も年金の話題。

自民党が年金カードというのを検討しているらしい。
ここのニュース
(6/14)政府、「年金カード」導入検討――納付記録、確認容易に
http://www.nikkei.co.jp/sp2/nt68/20070613AS3S1302713062007.html

によると(以下斜体は上記サイトより引用)

政府は13日、年金記録漏れ問題を受けた国民の年金不信を解消するため、公的年金保険料の納付記録や将来受け取る年金額などを簡単に把握できる「年金カード」を発行する方向で検討に入った。公的年金の加入者や年金受給者らを対象にICカードを発行、保険料の納付状況をパソコンなどで簡単に確認できるようにする。早ければ2008年の実現を目指す。


このニュースをきいたとき。「ありえねー、無駄遣い!」と思わなかっただろか?
このカードを送るのに、80円切手がかかる。
かりに、全国民の半分の5千万人に送ったとしても、80円X5千万=40億円もかかる。

しかし、これ、封筒で送るだけの値段で、ICカードを作る費用もかかるし、
ICカードの場合、読み取る機械の費用、
さらには、ソフト開発費もかかる。

何百億円という投資が必要だろう。
だれが、そんな費用払うの??税金??

確かめたいだけなら、年金加入履歴をネットで確認する「年金個人情報提供サービス」があるのだから、これのパスワードをみんなに振ってしまって、領収書とか、社会保険庁から送る郵便のところに、そのログイン名パスワードを書いておいて、確認できるようにする。それ以外に知りたい人は、社会保険事務所にいって、年金手帳とその他自分を証明するものを持っていくと、職員が教えてくれる(アカウントを書いた紙を渡してくれる)、それ専用の窓口を作れば、仕事も早いし、あとは、このサイトの見方・・だけど、それは情報格差の問題として、他のネット関係の問題(電子政府とか)とあわせて自治体で取り組んでもらう。。

 とかすれば、すぐに、それもお金使わないで出来るじゃん・・・

 なんで、こんな金かかることするんだあ。。。業界だけが潤う。。。




 とおもったら、こんなニュースを発見

(12/27)08年度にも年金カード、クレジット機能も・社保庁
http://www.nikkei.co.jp/sp2/nt68/20051226AS1F2401426122005.html

によると(以下斜体は上記12月27日のニュースより引用)

社会保険庁は20歳以上が入る公的年金の加入者と年金受給者を対象に個人カードを導入する検討に入った。年金の加入記録や受取額を簡単に把握できるようにするほか、ICチップを組み込むなどして金融機能を付ける方向で調整する。社保庁改革に伴う業務改善策の一環で、クレジットカード機能の付与や、受給者による年金担保借り入れなども可能にする考えだ。


クレジット機能の付与ですとおお(@_@!)

じゃあ、クレジットで借金して、強制的に払わされちゃうんですかあ。。。

それは、国はお金集まるし、クレジット会社は、会員増えるし。。
そんなら、80円切手だろうが、カード費用だろうが、トーゼン、カード会社は払うよなあ。。
何千万人と強制加入になれば、売上げ急上昇だし、そのお金で運用益爆発的になるもんなあ。。
1人あたり、2万円として、仮に1千万人が振り込むと、そのカード会社は、1月に2千億円入る。
それを運用すれば、0.01%だって、2千万でしょー、す、すげー(@_@!)

 それが、毎月ですぜ、旦那!!、このクレジット会社、笑いとまんないっす。。

 まあ、何人かは払わないやつもいるだろうけど、年金基礎番号を押さえているから、個人の特定も楽だし。。(どこかに就職したら、一発でばれてしまう)

 そりゃー、カード費用だって、切手代だって払うだろう。。。

 この話、そーいうオチ??
 それで、クレジットまでして、年金払わされるの。。。
 野党は、その辺追及しないのかあ??

P.S 5千万人の人が年金を仮に払っているとしたら、カード支払いの人は、会社員(は天引きされるので)それを除くと。。。1千万人くらい??と思い直して修正しました。



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

日本ブログ協会、知らぬ間に活動が終わっていた(^^;)

2007-06-14 19:21:51 | Weblog

知らないのはウィリアムのいたずらだけかも知んないけど、

以前あった、
日本ブログ協会
http://www.fmmc.or.jp/japan-blog/


って、活動を終了していたんですね(^^;)
日本ブログ協会のページ、一番上の左側のマークのよこに・・・
(以下斜体はそのページから引用)

日本ブログ協会の活動は平成19年3月末で活動を終了いたしました。

とある。

結局、何をやった協会だったんだろう(^^;)

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

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

2007-06-14 18:10:23 | 開発ネタ

 シリーズ「開発の初めから順番に書いていってみる」の続きです。
 現在プログラミングのDB入出力の自動生成をやっています。
 自動生成は、ここでやってきたように、
  ・雛形ソース→サンプルソースから変形
  ・仕様書のExcelシート
 をつくって、あとは、自動変換のシートの作業一覧シートに、それらを指定すれば出来ました。

 前前回、サンプルソースに関して、前回仕様書をやったので、今回はいよいよ雛形ソースです。




■そのまえに

 その前にですが、ここでやったように、この自動生成をしても、定数部分のクラスは1つ作らないといけません。それは、そこの下のほうの DBKankyo.javaになります。
 今回は、その部分はあるとして、上のほうのテーブルのjavaファイルを自動生成します。




■雛形ファイル

こんな感じだと思います

import java.util.*;
import java.sql.*;

/**
 * 
 * $#$CELL B2$#$<BR>
 * 
 * テーブル項目$#$REP 8$#$
 * $#$KETA A$#$	$#$KETA C$#$$#$REPEND A$#$
 * 
 */
public class $#$CELL B3$#$ {

	/*
	 * 	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;
	 /*
	  * コネクション
	  */
	Connection con = null;

  	/*
	 * コネクションセット<BR>
	 */
	public	void setConnection(Connection con)
	{
		this.con	=	con;
	}
	
  	/*
	 * SQL実行<BR>
	 * @param	cmd	SQL文
	 * @return	int		0:OK,1:Error
	 */
	public	int	execute(String cmd)
	{
		try
		{
			int	con_flg	=	0;
			if ( con	==	null )
			{
	      		// ドライバクラスをロード
   	   			Class.forName(JDBCDriverName); // MySQLの場合

      			// データベースへ接続
      			con = DriverManager.getConnection(JDBCURL,
                                     JDBCUserName,JDBCPassword);
      			con_flg	=	1;
			}
			
      		// ステートメントオブジェクトを生成
      		Statement stmt = con.createStatement();

			//	実行
	  		stmt.execute(cmd);

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

	/*
	 * SQLの検索実行<BR>
	 * @param	cmd	SQL文
	 * @return	Vector	結果(1レコード1ハッシュマップ)
	 */
	public	Vector	selectExecute(String cmd)
	{
		Vector allData = new Vector();

		try
		{
			
			int	con_flg	=	0;
			if ( con	==	null )
			{
	      		// ドライバクラスをロード
   	   			Class.forName(JDBCDriverName); // MySQLの場合

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

      		// ステートメントオブジェクトを生成
      		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();
      		if ( con_flg	==	1 )
      		{
	      		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 $#$CELL B3$#$ ");

		//	条件式の作成
		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)
	{

		// ハッシュマップに入っている値を受け取り
$#$REP 8$#$		String	$#$KETA A$#$	=	(String)taisho.get("$#$KETA A$#$");
$#$REPEND A$#$

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

		//==========================//
		//	項目名の書き出し	//
		//==========================//
		out_flg	=	0;
$#$REP 8$#$ 		//$#$KETA C$#$の設定
		if ( $#$KETA A$#$	!=	null )
		{
			if ( out_flg	==	0 )
			{
				out_flg	=	1;
			}
			else
			{
				sqlbuf.append(",");
			}
			sqlbuf.append("$#$KETA A$#$");
		}      		
$#$REPEND A$#$

		// ") VALUES ("を書き出し      		
		sqlbuf.append(") VALUES (");
		
		//==========================//
		//	値の書き出し	//
		//==========================//
		out_flg	=	0;
$#$REP 8$#$ 		//$#$KETA C$#$の設定
		if ( $#$KETA A$#$	!=	null )
		{
			if ( out_flg	==	0 )
			{
				out_flg	=	1;
			}
			else
			{
				sqlbuf.append(",");
			}

			sqlbuf.append("$#$KETA N$#$");
			sqlbuf.append($#$KETA A$#$);
			sqlbuf.append("$#$KETA N$#$");
		}      		
$#$REPEND A$#$

		//	おしまい部分      		
		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 $#$CELL B3$#$");
		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 $#$CELL B3$#$ 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();
$#$REP 8$#$		String	$#$KETA A$#$	=	(String)taisho.get("$#$KETA A$#$");
$#$REPEND A$#$

		int	out_flg	=	0;

$#$REP 8$#$ 		//$#$KETA C$#$の設定
		if ( $#$KETA A$#$	!=	null )
		{
			if ( out_flg	==	0 )
			{
				out_flg	=	1;
			}
			else
			{
				buf.append(kugiri);
			}

			buf.append("$#$KETA A$#$ =");
			buf.append("$#$KETA N$#$");
			buf.append($#$KETA A$#$);
			buf.append("$#$KETA N$#$");
		}
$#$REPEND A$#$
		return	buf.toString();
	}

}

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

 はじめ、サンプルにしようとしたのが、もっと複雑なので、それを参考に書き換えているわけですが、その書き換えで間違えているところがいままでちらほらあり、気づいたのは直しているのですが、直しきっていなかったら、ごめん(^^;)本当はそのサンプルもなおして、確認すればいいのですが、そこまですんのが、めんどっちいのです。




ということで、DBはここまで。
このシリーズの次回から、やっと画面に入ります
(画面が終わると、プログラミングが終わり)



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

一般的な編集ソフトの作り方 その14:イベント発生時の動き(要素移動)

2007-06-14 16:15:01 | 開発ネタ

ワープロやドローイングソフトなどの編集ソフトを作る上での一般的な考え方を考える「一般的な編集ソフトの作り方」です。
 ここでは、主に、

  ・メモリ上に、要素をもつ
  ・イベント発生時の動き
  ・画面の構成

ということで、現在、「イベント発生時の動き」をやっています。
その機能には、
  ・印刷
  ・保存
  ・読み込み
  ・カット(切り取り)
  ・ペースト(貼り込み)
  ・プロパティ(属性設定・変更)
  ・表示
  ・要素の選択
  ・(要素の)移動
で、前回「要素の選択」をやったので、今日は「(要素の)移動」です。




■要素の移動

要素を移動する場合、

1.あらかじめ、要素が選択されていて
2.その要素がドラッグされていて
3.はなされたとき、イベントが発生します。

 つまり、ボタンを押した(ButtonPress)のときに(1)のイベントがあがります。

 で、ドラッグされたというイベントが取れればいいけど、とれないとき、
 (1)の要素が選択されていて、かつ、ボタンを離した(ButtonRelease)というイベントがきたら、移動みたいなかんじです。

 ただ、この方法だと、ドラッグ中は、どーするんだ(離したときに、いきなり要素が動いてきてしまう)ので、ドラッグ中もイベントが挙がる場合、その処理をするなど、いろいろシステムによってありそうです。




■イベント処理内容

で、その離されたないしは、ドラッグが終わったときに、イベントが来た瞬間にやることとして、

1.離した地点のX,Yを取得
2.そこに、選択されている要素が動けるのかチェック
  →動かせない場合、エラーとするか、次善の位置に移動するかはシステム
   によってちがう
3.移動する場合、その要素のXYを設定
4.子供がある場合、子供も動くならXYを再設定
5.再描画

となります。

 昨日、書き忘れましたが、要素選択の場合も選択された項目を反転して再描画することが多いはずです。




■位置を動かすと削除、挿入になる場合

 ただし、位置を動かすと、削除、挿入の意味になる場合もあります。
 この場合は、移動というより削除と挿入をいっぺんにやった感じです。
 位置決定処理がはいってきますので、結構めんどくさい話になります。
 (それは、位置決定のときに書きます。




 ということで、要素の移動、ここまで。



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

AJAXでケータイアプリを書くという可能性は。。。

2007-06-14 11:50:45 | Weblog

WWDC 2007 スティーブ・ジョブズ キーノート
http://japanese.engadget.com/2007/06/11/wwdc-2007-jobs-keynote/

によると(以下斜体は上記サイトより引用)

iPhoneの開発環境に関して

「iPhoneをセキュアに保ちつつ、サードパーティの開発者によいアプリを書いてもらいiPhoneの機能を拡大する方法について努力してきた。そしてとてもSweetなソリューションに辿り着いた。説明しよう。モバイルデバイス用のアプリケーションを開発するイノベーティブな新手法......iPhoneには完全なSafariエンジンが組み込まれていることに基づいている」。



11:18AM - 「だから、iPhoneの(ネイティブ)アプリとまったく同様に見え、動作するWeb 2.0やAJAXなアプリを書くことができる。iPhoneのサービスとも完全に統合できる。通話もできるし、メールチェック、(組み込みの)Google Mapを検索など......。アプリの配布についても心配無用。ただインターネットのサーバに置けばいい。アップデートもサーバ上で済む。iPhone上のセキュアなサンドボックス内で走る。しかもSDKは不要!現代的なウェブアプリを書ければそれで事足りる」。


ちょっとまって、iPhoneのAJAXで、iPhoneのサービス、つまり通話とかができたとしたら、勝手に電話をかけらて、しまわない??それはセキュアなのか??
でも・・・


11:21AM - LDAPを使った企業用カスタムアドレスブックのデモ。すべて完成させるまでに1人月以下、600行以下。標準のcontactアプリにvCard表示。「ウェブアプリから通話したり、標準のメールを使ってメール送信、アドレスをタップしてGoogle Mapsで表示、etc」。


 いや、技術的に同じコトをBREWでやらせようとしたら、

 たとえば、BREW上にフルブラウザを動かして、そのブラウザがAJAXを解釈し、XMLHttpRequestでopenするとき、URLがhttp://で始まればネットにいき、brew://ではじまったら、BREWのSDKの関数を呼び出すみたいなかんじにして、返り値を、そのresponseXMLなり、responseTextでとってくるとすれば、技術的にはできそうだ。。。ブラウザ会社ががんばれば。。

 この場合、ブラウザがアプリ部分になるので、ブラウザがアプリの検査、認証さえ受ければいい(AJAXの部分はBREWの関数を使ってても、アプリが動いてるわけなので、いらない)っていうことになるけど。。

 これって、大丈夫なんだろうか・・・
 勝手に電話帳を上から見て、勝手に電話をかけたりしたら。。。
 (いや、必要があって自動的にかけてくれるのはいいんだけど・・)

 これ、技術的な問題というより、
 キャリアがこれを認めるかどうかの決断力ですな。



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