SQLの窓

2015年06月28日

Eclipse に 画面分割があるとは知らなかった。

▼ これをショートカットでできないかいろいろ試していて見つけました。
Eclipse で、文字列内のファイルのパスの \ 記号を \\ にする方法

縦分割 / CTRL + \



横分割 / CTRL + [



まあ、でもあまりやらないほうがいいとは思います。なにかのはずみに片方が表示せずに固まったので


タグ:Eclipse java
posted by at 2015-06-28 22:16 | Comment(0) | Java | このブログの読者になる | 更新情報をチェックする

2015年06月15日

Google Gson の fromJson が、配列でも ArrayList でも同等に扱ってくれる事のテスト

なんとなくできるんだろうなぁ、と思いながらも試した事は無かったのですが、普通にできました。テストはコンソールでやっていますが、本来は Android で ArrayAdapter とセットで使用するので、どちらでもあまり大差はありません。

というより、Google Gson で文字列 JSON がほぼストレートに ListView にセットされるところが最も素敵なところです。
import java.util.ArrayList;
import java.util.ListIterator;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;


public class Main {

	// Livedoor の お天気Webサービス用 (JSON用)
	class Weather {
		// ArrayList で定義
		ArrayList<PinpointLocation> pinpointLocations;
	}
	class Weather2 {
		// 配列で定義
		PinpointLocation[] pinpointLocations;
	}

	public static void main(String[] args) {
		// TODO 自動生成されたメソッド・スタブ

		System.out.println("開始");

		// データをセット
		String result = Tools.httpGet(
			"http://weather.livedoor.com/forecast/webservice/json/v1?city=270000",
			"utf-8",
			null
		);

		System.out.println(result);

		Gson gson = new Gson();

		// ArrayList として処理
		Weather weatherData = gson.fromJson(result, Weather.class);

		// 多いので40番目から
		ListIterator<PinpointLocation> li = weatherData.pinpointLocations.listIterator(39);
		while(li.hasNext()) {
			PinpointLocation data = li.next();
			System.out.println(data.name + " : " + data.link );
		}

		System.out.println("-----------------------------------------");

		// 配列
		Weather2 weatherData2 = gson.fromJson(result, Weather2.class);

		// 多いので40番目から
		for( int i = 39; i < weatherData2.pinpointLocations.length; i++ ) {
			PinpointLocation data = weatherData2.pinpointLocations[i];
			System.out.println(data.name + " : " + data.link );
		}

		// 多いので40番目から( 39 番までを削除 )
		for( int i = 38; i >= 0; i-- ) {
			weatherData.pinpointLocations.remove(i);
		}
		
		Gson gsonPretty = new GsonBuilder().setPrettyPrinting().create();
		String json1 = gsonPretty.toJson(weatherData);
		System.out.println( json1 );

	}

}


後重要なのは、逆の toJson ですが、この場合は整形する方法があるので、ここも重要です。
Gson prettyGson = new GsonBuilder().setPrettyPrinting().create();
String json = prettyGson.toJson(weatherData);


Web アクセス用簡易 static クラス
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.Iterator;
import java.util.Map;


public class Tools {

	// 指定した URL へ 任意の charset で処理
	public static String httpGet( String targetUrl,String targetCharset,Map<String,String> params) {

		StringBuffer web_data = new StringBuffer();

		try {
			// Query String の作成( 必要無ければ引数を null とする )
			String data = "";
			if ( params != null ) {
				Iterator<String> it =  params.keySet().iterator();
				String key = null;
				String value = null;
				while(it.hasNext()) {
					key = it.next().toString();
					value = params.get(key);
					if ( !data.equals("") ) {
						data += "&";
					}
					data += key + "=" + URLEncoder.encode(value, targetCharset) ;
				}
				if ( !data.equals("") ) {
					targetUrl = targetUrl + "?" + data;
				}
			}

			// **********************************************
			// インターネットへの接続
			// **********************************************
			// 読み込む WEB上のターゲット
			URL url = new URL(targetUrl);
			// 接続オブジェクト
			HttpURLConnection http = (HttpURLConnection)url.openConnection();
			// GET メソッド
			http.setRequestMethod("GET");
			// 接続
			http.connect();

			// **********************************************
			// ストリームとして読み込む準備
			// **********************************************
			// 以下読み込み3点セット InputStream / InputStreamReader / BufferedReader
			InputStream input_stream = http.getInputStream();
			// UTF-8 でリーダーを作成
			InputStreamReader input_stream_reader = new InputStreamReader(input_stream, targetCharset);
			// 行単位で読み込む為の準備
			BufferedReader buffered_reader = new BufferedReader(input_stream_reader);

			// **********************************************
			// 行の一括読み込み
			// **********************************************
			String line_buffer = null;
			// BufferedReader は、readLine が null を返すと読み込み終了
			while ( null != (line_buffer = buffered_reader.readLine() ) ) {
				web_data.append( line_buffer );
				web_data.append( "\n" );
			}

			// **********************************************
			// 接続解除
			// **********************************************
			http.disconnect();
		}
		catch(Exception e) {
			// 失敗
			System.out.println(e.getMessage());
		}
		return web_data.toString();
	}
}



タグ:JSON
posted by at 2015-06-15 20:58 | Comment(0) | Java | このブログの読者になる | 更新情報をチェックする

2015年05月28日

Java sun.jdbc.odbc.JdbcOdbcDriver から Microsoft Excel

関連する記事

Java 8 で、sun.jdbc.odbc.JdbcOdbcDriver を使う手順

▲ リンク先では、MySQL ODBC 5.3 Unicode Driver でテストしています。

接続文字列について

この手の正式情報は全く手に入らなかったのですが、Readonly のパラメータを省略する(全く記述しない場合)と更新を拒否されました。Readonly=False にしても更新されてしまいます。



このダイアログは、ドライバの設定画面ですが、バージョンのパラメータは試していませんが、FIL らしいです。

▼ 以下のサンプルでは更新されます。
		Button btnDatabase = new Button(container, SWT.NONE);
		btnDatabase.addSelectionListener(new SelectionAdapter() {

			@Override
			public void widgetSelected(SelectionEvent ex) {

				boolean ret = true;

				Connection con = null;
				Statement stmt = null;
				ResultSet rset = null;

				String DriverName = "sun.jdbc.odbc.JdbcOdbcDriver";
				String connectionString =
						"Provider=MSDASQL" +
						";Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)}" +
						";Dbq=C:\\user\\MDB\\syain.xlsx" +
						";Readonly=;";
				String Query = "";
				
				// 日本語設定用プロパティ
				Properties prop = new Properties();
				prop.put("charSet", "MS932");
				System.out.println(connectionString);

				// 接続
				try {
					Class.forName( DriverName );
					con = DriverManager.getConnection(
							"jdbc:odbc:" + connectionString,prop
					);

					stmt = con.createStatement();
				}
				catch( Exception e  ) {
					System.out.println(e.getMessage());
					ret = false;
				}
				// 接続失敗
				if ( !ret ) {
					return;
				}

				System.out.println("接続成功");
				// SQL 作成
				Query = "update 社員マスタ set 氏名 = 'java 更新' where 社員コード = '0001'";
				try {
					stmt.executeUpdate( Query );
				}
				catch( SQLException e ) {
					System.out.println(e.getMessage());
					ret = false;
				}
				// 実行失敗
				if ( !ret ) {
					return;
				}

				// SQL 作成
				Query = "select * from 社員マスタ where 社員コード = '0001'";
				try {
					rset = stmt.executeQuery ( Query );
					ret = rset.next();
				}
				catch( SQLException e ) {
					System.out.println(e.getMessage());
					ret = false;
				}

				// データが存在しないので処理終了
				if ( !ret ) {
					return;
				}

				System.out.println("SQL実行成功");

				try {
					System.out.println( rset.getString( "氏名" ) );
				}
				catch( SQLException e ) {
					System.out.println(e.getMessage());
				}

				System.out.println("列データ取得成功");

				try {
					stmt.close();
					con.close();
				}
				catch( SQLException e ) {
					System.out.println(e.getMessage());
				}

			}
		});
関連する資料

日本語 Eclipse 4.4 Pleiades で WindowBuilder


タグ:EXCEL microsoft java
posted by at 2015-05-28 19:06 | Comment(0) | Java | このブログの読者になる | 更新情報をチェックする

Java sun.jdbc.odbc.JdbcOdbcDriver から Microsoft Access

関連する記事

Java 8 で、sun.jdbc.odbc.JdbcOdbcDriver を使う手順

▲ リンク先では、MySQL ODBC 5.3 Unicode Driver でテストしています。
		Button btnDatabase = new Button(container, SWT.NONE);
		btnDatabase.addSelectionListener(new SelectionAdapter() {

			@Override
			public void widgetSelected(SelectionEvent ex) {

				boolean ret = true;

				Connection con = null;
				Statement stmt = null;
				ResultSet rset = null;

				String DriverName = "sun.jdbc.odbc.JdbcOdbcDriver";
				String connectionString =
						"Provider=MSDASQL" +
						";Driver={Microsoft Access Driver (*.mdb, *.accdb)}" +
						";Dbq=C:\\user\\MDB\\社員マスタ.accdb" + ";";

				// 日本語設定用プロパティ
				Properties prop = new Properties();
				prop.put("charSet", "MS932");
				System.out.println(connectionString);

				// 接続
				try {
					Class.forName( DriverName );
					con = DriverManager.getConnection(
							"jdbc:odbc:" + connectionString,prop
					);

					stmt = con.createStatement();
				}
				catch( Exception e  ) {
					System.out.println(e.getMessage());
					ret = false;
				}
				// 接続失敗
				if ( !ret ) {
					return;
				}

				System.out.println("接続成功");

				// SQL 作成
				String Query = "select * from 社員マスタ where 社員コード = '0001'";
				try {
					rset = stmt.executeQuery ( Query );
					ret = rset.next();
				}
				catch( SQLException e ) {
					System.out.println(e.getMessage());
					ret = false;
				}

				// データが存在しないので処理終了
				if ( !ret ) {
					return;
				}

				System.out.println("SQL実行成功");

				try {
					System.out.println( rset.getString( "氏名" ) );
				}
				catch( SQLException e ) {
					System.out.println(e.getMessage());
				}

				System.out.println("列データ取得成功");

				try {
					stmt.close();
					con.close();
				}
				catch( SQLException e ) {
					System.out.println(e.getMessage());
				}

			}
		});
関連する資料

日本語 Eclipse 4.4 Pleiades で WindowBuilder



タグ:microsoft java
posted by at 2015-05-28 18:19 | Comment(0) | Java | このブログの読者になる | 更新情報をチェックする

2015年04月25日

Pleiades All in One 4.4.2.v20150310(Luna) の Java 32bit Full Edition が、自己解凍書庫で、Vector に登録されている件



ダウンロードしようとしたら、フレームに Vector が表示されてびっくりした。

● セットアップは自己解凍書庫なのでダブルクリックで解凍するだけ (インストール作業は不要) です。
● Eclipse、JRE とも 32bit 版のため Windows 32bit、64bit どちらでも動作します。
● アンインストールはディレクトリーを削除するだけです。
● デフォルトでは c:\pleiades (c:\pleiades\eclipse) に解凍されます。
ついこの間までは、Android 用の ADT に付属されていた Eclipse を Pleiades の日本語化プラグイン使って利用していたのですが、Google が Eclipse やめて、Android Studio にしたので、一般 Java は Pleiades 使おうとして行ってみたらこうなってました。 しかも Google Chrome でダウンロードしようとするとこうなります。 頑張ってダウンロードできない事も無いはずなのだけれど、かなり面倒くさいはずなので Firefox でダウンロードしました。良く見ると、Vector にはこんな記述が・・・
Google Chrome及びFirefoxのセーフブラウジング機能により、一部のソフトがダウンロードができなくなる不具合が確認されています。ダウンロードができない場合は、Internet Explorerなどの別のブラウザでお試しください。
という事は、最悪 IE を使えって事か。 Google Chrome で Silverlight が使えない そういえば、最近 Google Chrome では、Silverlight が使えなくなりました。現在では chrome://flags/NPAPI を有効 にすれば使えるようになりますが、9月には全く使えなくなるという話です。 そもそも、Java と Adobe Reader と Adobe Flash と Microsoft Silverlight は、きっちり最新に更新しないと脆弱性狙われて悪意のあるサイトにアクセスするだけでウイルスに感染する元凶なので、当然と言えば当然なんですが、いきなりいろいろやってくれるのであせる事が最近多いです。ホント ▼ トレンドマイクロ セキュリティブログ 狙いは IE、Java、Flash、Silverlight:Web経由脆弱性攻撃の手口 ▼ トレンドマイクロ is702 脆弱性を攻撃する不正サイトの手口
posted by at 2015-04-25 22:42 | Comment(0) | Java | このブログの読者になる | 更新情報をチェックする

2014年05月25日

Eclipse : プライベートクラスの作成

プライベートクラスを作成するソースコードを選択して右クリックします



『エンクロージング型』をチェックし、その横の名前がソースコードのクラス名である事を確認し、private ラジオボタンを選択して、スーパークラスは特に必要なければ、『java.lang.Object』のまま完了します



すると、ソースコードの先頭にプラベートクラスのブロックが作成されます



▼ ブロックの位置変更は、『アウトライン』で

ドラッグして移動させます





posted by at 2014-05-25 00:00 | Comment(0) | Java | このブログの読者になる | 更新情報をチェックする

2014年05月14日

Java の授業で社員マスタメンテを作成しています

DB 処理に関しては以下の汎用コードを使い、MS Access のみに限定して作成しました。( 殆どコピペと微調整で作成できます )

Eclipse + WindowBuilder : JDBC と ODBC を使った、オールマイティなデータベース接続サンプル( MySQL / SQLServer / Oracle / Postgres / MS Access)

処理そのものより、Eclipse + WindowBuilder の機能を使う練習です。変数名や、クラス名、アクションを使ったイベント作成等、ソースコードの見渡しがかなりすっきりしているはずです。
public class Main extends JFrame {

	private JPanel contentPane;
	private JTextField syainCode;
	private JTextField syainName;
	private final Action checkAction = new CheckAction();
	private final Action cancelAction = new CancelAction();
	private JButton checkButton;
	private JButton updateButton;
	private JButton cancelButton;

	private String currentDir = null;
	private Connection con = null;
	private Statement stmt = null;
	private ResultSet rset = null;
	
	
	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					Main frame = new Main();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public Main() {
		addWindowListener(new WindowAdapter() {
			@Override
			public void windowActivated(WindowEvent arg0) {
				Main.this.setLocationRelativeTo(null);
				
				currentDir = System.getProperty("user.dir");
				System.out.println(currentDir);
			}
		});
		setResizable(false);
		setTitle("\u793E\u54E1\u30DE\u30B9\u30BF\u30E1\u30F3\u30C6");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 450, 300);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);
		
		JLabel label = new JLabel("\u30B3\u30FC\u30C9");
		label.setBounds(31, 32, 50, 13);
		contentPane.add(label);
		
		JLabel label_1 = new JLabel("\u6C0F\u540D");
		label_1.setBounds(31, 88, 50, 13);
		contentPane.add(label_1);
		
		syainCode = new JTextField();
		syainCode.setBounds(78, 29, 50, 19);
		contentPane.add(syainCode);
		syainCode.setColumns(10);
		
		syainName = new JTextField();
		syainName.setEnabled(false);
		syainName.setColumns(10);
		syainName.setBounds(78, 85, 202, 19);
		contentPane.add(syainName);
		
		checkButton = new JButton("\u78BA\u8A8D");
		checkButton.setAction(checkAction);
		checkButton.setBounds(304, 28, 106, 21);
		contentPane.add(checkButton);
		
		updateButton = new JButton("\u66F4\u65B0");
		updateButton.setEnabled(false);
		updateButton.setBounds(304, 170, 106, 21);
		contentPane.add(updateButton);
		
		cancelButton = new JButton("\u30AD\u30E3\u30F3\u30BB\u30EB");
		cancelButton.setAction(cancelAction);
		cancelButton.setEnabled(false);
		cancelButton.setBounds(304, 208, 106, 21);
		contentPane.add(cancelButton);
		
		
	}
	
	private class CheckAction extends AbstractAction {
		public CheckAction() {
			putValue(NAME, "確認");
			putValue(SHORT_DESCRIPTION, "Some short description");
		}
		public void actionPerformed(ActionEvent e) {
			
			// 実際は、getConnect が失敗した場合の処理が必要です
			getConnect();
			
			try {
				
				stmt = con.createStatement();
				String scode = syainCode.getText();
				rset = stmt.executeQuery ( "select * from 社員マスタ where 社員コード = '" + scode + "'" );
				if ( rset.next() ) {
					syainName.setText(rset.getString( "氏名" ));
					
					syainCode.setEnabled(false);
					checkButton.setEnabled(false);

					syainName.setEnabled(true);
					updateButton.setEnabled(true);
					cancelButton.setEnabled(true);
					
					syainName.requestFocusInWindow();
					syainName.selectAll();
					
				}
				else {
					JOptionPane.showMessageDialog(contentPane, "入力した社員コードは存在しません");
					syainCode.requestFocusInWindow();
					syainCode.selectAll();
				}
				
				rset.close();
				stmt.close();
				
			} catch (Exception e1) {
				// TODO 
				e1.printStackTrace();
			}			
			
			con.close();

		}
	}
	private class CancelAction extends AbstractAction {
		public CancelAction() {
			putValue(NAME, "キャンセル");
			putValue(SHORT_DESCRIPTION, "Some short description");
		}
		public void actionPerformed(ActionEvent e) {
			Main.this.syainCode.setEnabled(true);
			Main.this.checkButton.setEnabled(true);

			Main.this.syainName.setEnabled(false);
			Main.this.updateButton.setEnabled(false);
			Main.this.cancelButton.setEnabled(false);
			
			syainName.setText("");
		}
	}
	

	private boolean getConnect() {
		
		boolean connect_result = true;
		String connectionString = "";

		// *********************************************
		// ODBC 用接続文字列
		// *********************************************
		// MDB
		connectionString = "Provider=MSDASQL"
				+ ";Driver={Microsoft Access Driver (*.mdb)}"
				+ ";Dbq=" + currentDir + "\\data\\販売管理C.mdb" + ";";

		
		try {
			Properties prop = new Properties();
			prop.put("charSet", "MS932");
			System.out.println(connectionString);
			con = DriverManager.getConnection("jdbc:odbc:"+connectionString, prop);
			
		} catch (Exception e1) {
			// TODO 
			e1.printStackTrace();
			connect_result = false;
		}
		
		return connect_result;
	}
	
}

ウインドウの初期処理として windowActivated を使っているのは、このイベントが重要だからです。初期処理であれば、インスタンス内より呼び出すメソッドを一つ作成すればいいのですが、この段階ではこちらのほうが勉強になります。また、コンストラクタ内は WindowBuilder が自動的にコードを書くのでこの段階ではあまり触りたく無いという事情もあります。

まだ、項目や入力チェックは殆ど実装されていません。


posted by at 2014-05-14 02:28 | Comment(0) | Java | このブログの読者になる | 更新情報をチェックする

2013年10月31日

Java で MySQL 5.6 に接続。今時は、ベンダー(MySQL/Oracle)のドライバーが優秀

要するに、MySQL の ODBC ドライバを使って、jdbc:odbc ドライバを使用すると、プロジェクトを MS932(SHIFT_JIS) で作成して、ドライバのオプションを sjis にしないとうまくいかない。

しかし、jdbc:mysql だと、何もしなくてもどちらからも接続できました。逆にオプション設定しても現実の状態を見てそちらを優先させているような感じです。

ドライバは、Download Connector/J をダウンロードしてインストールしますが、MySQL をインストールした PC ならば既にインストールされていると思います。場所は、『C:\Program Files\MySQL\MySQL Connector J』 の mysql-connector-java-5.1.26-bin.jar を Eclipse の 実行構成の『クラスパス』タブで、ユーザーエントリーに『外部 Jar 追加』で参照させました。

ドキュメント(英文)
Connection con;
Statement stmt;
ResultSet rset;

//	String connectionString =
//		"jdbc:odbc:Provider=MSDASQL" +
//		";Driver={MySQL ODBC 5.2w Driver}" +
//		";SERVER=localhost" + 
//		";DATABASE=lightbox" +
//		";UID=root" +
//		";PWD=trustno1" +
//		";Charset=sjis" +
//		";";	

String connectionString = "jdbc:mysql://localhost/lightbox?" +
"user=root&password=パスワード";

try {
	con = DriverManager.getConnection(connectionString);
	stmt = con.createStatement();

	rset = stmt.executeQuery ( "select * from `社員マスタ`" );

	ResultSetMetaData rm = rset.getMetaData();
	int nCols = rm.getColumnCount();
	String[] data = new String[nCols];
	int i;

	while( rset.next() ) {
		for( i = 0; i < nCols; i++ ) {
			data[i] = rset.getString( i+1 );

			if ( i != 0 ) {
				System.out.print( "," );
			}
			System.out.print( data[i] );
		}
		System.out.println(  );
	}

	stmt.close();
	con.close();

}
catch (Exception e) {
	System.out.println( e.getMessage() );
}		

久しぶりに Java から DB にアクセスして、Class.forName が必要無くなった事を認識しました・・・・


posted by at 2013-10-31 23:06 | Java | このブログの読者になる | 更新情報をチェックする

2009年11月06日

Java:Windows(C++)で言うところのアクセラレータキー


Java : 最上位のウインドウで特定のキーアクションを処理する



たったこれだけの処理をテストして確定するのに時間がかかります。

Java は基本的に信頼できる情報が少なくて、自分でテストするしかないようです。
この情報もまた、環境やバージョンで変わるかもしれないし変わらないかもしれない・・・
と言わざるを得ないのが実感です。

業務アプリはそもそも、オフコンからの流れがありますし、エンドユーザは、時間=コスト
という現実世界で処理しておられるので、効率を考えれば、キーボードの処理は重要に
なります。

もちろん、マウスのほうが便利な場面もありますが、そちらは、通常 API 的に苦労は無
い事が多く、当たり前の単純なシーケーンスを実現しようとした時に、Java は実に大きな壁
を作ってくれるような気がします。

もちろん、Java ほどでは無いにしても、Microsoft でも Adobe でもだいたいにおいて
同じですけれども。


posted by at 2009-11-06 15:17 | Java | このブログの読者になる | 更新情報をチェックする

2009年10月21日

JTableの標準化(ほぼ完成版)


JTableの標準化

Jtable_std 

前回ボタンを追加できるようにしたのですが、AddColumn をしてしまうと内部のデフォルトエディタがリセットされてしまったので、多少の仕様変更に加えて、コンボボックスとチェックボックスを追加できるようにして、さらに TAB によるフォーカスコントロールを行って、伝票入力ができると思われる程度にはなりました。

Enter キーで次のカラムへ移動したいところですが、Java はやたらと面倒くさいです。これだから、Java は流行らないんでしょうね・・・
Java は得意では無いのですが、プログラミングは仕事なのでいろいろな言語を標準化しましたが、なんか JTable の設計思想はちょっとキツイです。

世の中にほとんど良いサンプルが無いのがその証拠です。




posted by at 2009-10-21 16:35 | Java | このブログの読者になる | 更新情報をチェックする
Seesaa の各ページの表示について
Seesaa の 記事がたまに全く表示されない場合があります。その場合は、設定> 詳細設定> ブログ設定 で 最新の情報に更新の『実行ボタン』で記事やアーカイブが最新にビルドされます。

Seesaa のページで、アーカイブとタグページは要注意です。タグページはコンテンツが全く無い状態になりますし、アーカイブページも歯抜けページはコンテンツが存在しないのにページが表示されてしまいます。

また、カテゴリページもそういう意味では完全ではありません。『カテゴリID-番号』というフォーマットで表示されるページですが、実際存在するより大きな番号でも表示されてしまいます。

※ インデックスページのみ、実際の記事数を超えたページを指定しても最後のページが表示されるようです

対処としては、このようなヘルプ的な情報を固定でページの最後に表示するようにするといいでしょう。具体的には、メインの記事コンテンツの下に『自由形式』を追加し、アーカイブとカテゴリページでのみ表示するように設定し、コンテンツを用意するといいと思います。


※ エキスパートモードで表示しています

アーカイブとカテゴリページはこのように簡単に設定できますが、タグページは HTML 設定を直接変更して、以下の『タグページでのみ表示される内容』の記述方法で設定する必要があります

<% if:page_name eq 'archive' -%>
アーカイブページでのみ表示される内容
<% /if %>

<% if:page_name eq 'category' -%>
カテゴリページでのみ表示される内容
<% /if %>

<% if:page_name eq 'tag' -%>
タグページでのみ表示される内容
<% /if %>
この記述は、以下の場所で使用します


Android SDK ポケットリファレンス
改訂版 Webデザイナーのための jQuery入門
今すぐ使えるかんたん ホームページ HTML&CSS入門
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX