SQLの窓

2014年07月25日


VS2010(C#) : HttpWebRequest クラスを使用して WEBアプリにバイナリデータを POST する

C# のコンソールアプリケーションで一般的に WEB アクセスする為に、HttpWebRequest クラスを使用します。

非同期ですと、いくぶん面倒ですが同期処理だと単純です。ここを参考に PowerShell でも利用できると思います。

▼ 以下関連する近い処理
VS2010(C#) : COMの Msxml2.ServerXMLHTTP を使用して WEBアプリにバイナリデータを POST する

C# ソースコード
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.IO;

namespace PngUpload2 {
	class Program {
		static void Main(string[] args) {

			HttpWebRequest myReq =
			(HttpWebRequest)WebRequest.Create("http://yourdomain/put/put.php");

			// ****************************
			// ファイルを読み込む為のオブジェクト
			// ****************************
			FileStream fs = new FileStream(
				@"C:\user\web\web\various\put\winofsql.png",
				FileMode.Open, FileAccess.Read);

			// ****************************
			// ファイルを読み込むバイト型配列
			// ****************************
			byte[] bs = new byte[fs.Length];
			// ファイルの内容をすべて読み込む
			fs.Read(bs, 0, bs.Length);
			// 閉じる
			fs.Close();

			myReq.Method = "POST";
			//POST送信するデータの長さを指定
			myReq.ContentLength = bs.Length;

			// ****************************
			// データを書き込む
			// ****************************
			Stream reqStream = myReq.GetRequestStream();
			reqStream.Write(bs, 0, bs.Length);
			reqStream.Close();

			// ****************************
			// 結果を取得
			// ****************************
			WebResponse myRes = myReq.GetResponse();
			Stream resStream = myRes.GetResponseStream();
			StreamReader sr = new StreamReader(resStream, Encoding.UTF8);
			Console.WriteLine(sr.ReadToEnd());
			sr.Close();

			Console.ReadLine();

		}
	}
}

PHP 側については、『VBscript(または JScript) で簡単にバイナリファイルをアップロードする』 を参照して下さい。


関連する記事


タグ:C# framework HTTP
posted by lightbox at 2014-07-25 18:15 | VS(C#) | このブログの読者になる | 更新情報をチェックする

2014年07月24日


VS2010(C#) : COMの Msxml2.ServerXMLHTTP を使用して WEBアプリにバイナリデータを POST する

VB.net(2010) : COMの Msxml2.ServerXMLHTTP を使用して WEBアプリにバイナリデータを POST する
VBscript(または JScript) で簡単にバイナリファイルをアップロードする

いずれも同じ処理です。C# では、VB.net に比べていくぶん表現が厳密になっているのが解ります。文字列に使われている @ は、逐語的リテラル文字列と呼ばれており、使いやすさと読みやすさを考慮しています。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MSXML2;
using System.IO;

namespace PngUpload {
	class Program {
		static void Main(string[] args) {

			// ****************************
			// http 通信用のオブジェクトを作成
			// ****************************
			ServerXMLHTTP60 ServerXML = new ServerXMLHTTP60();

			// ****************************
			// 呼び出す URL を設定
			// ****************************
			String URL  = "http://yourdomain/put/put.php";

			// ****************************
			// POST する為に開く
			// ****************************
			ServerXML.open("POST", URL, false);

			// ****************************
			// タイムアウトの設定
			// ****************************
			int lResolve = 60 * 1000;
			int lConnect = 60 * 1000;
			int lSend = 60 * 1000;
			int lReceive = 60 * 1000;
			ServerXML.setTimeouts(lResolve, lConnect, lSend, lReceive);

			// ****************************
			// ファイルを読み込む為のオブジェクト
			// ****************************
			FileStream fs = new FileStream( 
				@"C:\user\web\web\put\winofsql.png", 
				FileMode.Open, FileAccess.Read);

			// ****************************
			// ファイルを読み込むバイト型配列
			// ****************************
			byte[] bs = new byte[fs.Length];
			// ファイルの内容をすべて読み込む
			fs.Read(bs, 0, bs.Length);
			// 閉じる
			fs.Close();

			// ****************************
			// 送信するデータの長さをヘッダにセット
			// ****************************
			ServerXML.setRequestHeader("Content-Length", bs.Length.ToString());
			// 送信
			ServerXML.send(bs);

			// ****************************
			// 結果の表示
			// ****************************
			Console.WriteLine(ServerXML.responseText);

			Console.ReadLine();

		}
	}
}



関連する記事


タグ:C# com
posted by lightbox at 2014-07-24 21:39 | VS(C#) | このブログの読者になる | 更新情報をチェックする

2014年04月10日


VS2010(C#) : System.Data.Odbc データ取得(SELECT)処理( MySQL )

OneDrive へ移動


スタンダードな C# から ODBC を使用した読み取り処理のテンプレートです。元は VB.net だったものを、Convert VB.NET to C# で変換して作成しています。

※ MySQL ODBC 5.2w Driver は、古いので、MySQL ODBC 5.3 Unicode Driver を使用して下さい( 93行 )
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Odbc;

namespace MySQL1 {
	class Program {
		static void Main(string[] args) {

			// 新しい OdbcConnection オブジェクトを作成
			OdbcConnection myCon = CreateConnection();

			if (myCon == null) {
				Console.WriteLine("処理が異常終了しました");
				return;
			}

			//---------------------------------------------------

			// レコードセットを取得する為の SQL を準備
			string myQuery = "SELECT `社員マスタ`.*,DATE_FORMAT(`生年月日`,'%Y-%m-%d') as `誕生日`" + " from `社員マスタ`";

			// SELECT 実行用のオブジェクトを作成
			OdbcCommand myCommand = new OdbcCommand();
			// 実行する為に必要な情報をセット
			myCommand.CommandText = myQuery;
			myCommand.Connection = myCon;

			// 実行後にレコードセットを取得する為のオブジェクトを作成
			OdbcDataReader myReader;
			// ここで SELECT を実行してその結果をオブジェクトに格納する
			myReader = myCommand.ExecuteReader();

			// 読み出し
			// Rewad メソッドは、行が存在する場合は true、それ以外の場合は false を返します

			while (myReader.Read()) {
				// 文字列
				Console.Write(GetValue(myReader, "社員コード") + " : ");
				Console.Write(GetValue(myReader, "氏名") + " : ");

				// 整数
				Console.Write(GetValue(myReader, "給与") + " : ");

				// 日付
				Console.Write(GetValue(myReader, "作成日") + " : ");
				Console.Write(GetValue(myReader, "更新日") + " : ");
				Console.Write(GetValue(myReader, "生年月日") + " : ");
				Console.Write(GetValue(myReader, "誕生日"));

				Console.WriteLine();

			}

			myReader.Close();
			//---------------------------------------------------

			EndConnection(myCon);

		}

		// ******************************************************
		// 接続終了
		// ******************************************************

		static void EndConnection(OdbcConnection myCon) {
			// 接続を閉じる
			myCon.Close();

			// OdbcConnection オブジェクトに使用されているすべてのリソースを解放
			myCon.Dispose();

			// 処理終了
			Console.WriteLine("処理が終了しました");

			// 一時停止
			Console.Write("Enterキーを押して下さい : ");
			Console.ReadLine();

		}

		// ******************************************************
		// 接続作成
		// ******************************************************
		static OdbcConnection CreateConnection() {

			// 新しい OdbcConnectionStringBuilder オブジェクトを作成
			OdbcConnectionStringBuilder builder = new OdbcConnectionStringBuilder();

			// ドライバ文字列をセット ( 波型括弧{} は必要ありません ) 
			// 文字列を正確に取得するには、レジストリ : HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI
			builder.Driver = "MySQL ODBC 5.2w Driver";

			// 接続用のパラメータを追加
			builder.Add("SERVER", "localhost");
			builder.Add("DATABASE", "lightbox");
			builder.Add("UID", "root");
			builder.Add("PWD", "パスワード");

			// 内容を確認
			Console.WriteLine(builder.ConnectionString);

			// 新しい OdbcConnection オブジェクトを作成
			OdbcConnection myCon = new OdbcConnection();

			// 接続文字列を設定
			myCon.ConnectionString = builder.ConnectionString;

			// 接続を開く
			try {
				myCon.Open();
			}
			catch (OdbcException ex) {
				Console.WriteLine("接続エラーです");
				// Console.WriteLine( ex.Message )
				ErrorAction(ex);
				return null;
			}

			return myCon;

		}

		// ******************************************************
		// エラー処理
		// ******************************************************

		static void ErrorAction(OdbcException ex) {
			string CrLf = "\r\n";
			string errorMessages = "";
			int i = 0;

			for (i = 0; i <= ex.Errors.Count - 1; i++) {
				errorMessages += "Index #" + i.ToString() + CrLf + "Message: " + ex.Errors[i].Message + CrLf + "NativeError: " + ex.Errors[i].NativeError.ToString() + CrLf + "Source: " + ex.Errors[i].Source + CrLf + "SQL: " + ex.Errors[i].SQLState + CrLf;
			}

			Console.WriteLine(errorMessages);

		}


		// ********************************************************
		// 列データ取得
		//
		// 列データを文字列として取得しますが、NULL の場合は
		// 空文字列を返します
		// ********************************************************
		static string GetValue(OdbcDataReader myReader, string strName) {

			string ret = "";
			int fld = 0;

			// 指定された列名より、テーブル内での定義順序番号を取得
			fld = myReader.GetOrdinal(strName);
			// 定義順序番号より、NULL かどうかをチェック
			if (myReader.IsDBNull(fld)) {
				ret = "";
			}
			else {
				// NULL でなければ内容をオブジェクトとして取りだして文字列化する
				ret = myReader.GetValue(fld).ToString();
			}

			// 列の値を返す
			return ret;

		}

	}
}


以下は、show create table で取得した MySQL用の テーブル作成用 SQL です。
CREATE TABLE `社員マスタ` (
  `社員コード` varchar(4) NOT NULL DEFAULT '',
  `氏名` varchar(50) DEFAULT NULL,
  `フリガナ` varchar(50) DEFAULT NULL,
  `所属` varchar(4) DEFAULT NULL,
  `性別` int(11) DEFAULT NULL,
  `作成日` datetime DEFAULT NULL,
  `更新日` datetime DEFAULT NULL,
  `給与` int(11) DEFAULT NULL,
  `手当` int(11) DEFAULT NULL,
  `管理者` varchar(4) DEFAULT NULL,
  `生年月日` datetime DEFAULT NULL,
  PRIMARY KEY (`社員コード`)
)




posted by lightbox at 2014-04-10 19:47 | VS(C#) | このブログの読者になる | 更新情報をチェックする

2013年11月04日


VS2010 WPF(C#) DataGrid + データベース バインド / DataGrid に MDB のデータを読み込んで表示するテンプレート

SkyDrive へ移動




解説ページ

DataGrid へデータベースの内容を表示する問い合わせのサンプルですが、XAML を利用する上でデータはバインドでコントロールに表示されます。その為、データベースのデータを扱う為のプライベートクラス( SELECT 文の列リストを格納するクラス )を作成して利用します。

DataGrid は、ある手順を踏むと、そのクラスから自動的に列を作成してくれる上に、バインドの Mode=OneWay のルールで、コレクションの内容を変更するだけでコントロールの表示を変更する事ができます。


posted by lightbox at 2013-11-04 17:36 | VS(C#) | このブログの読者になる | 更新情報をチェックする

2013年11月01日


VS2012 WPF(C#) : 『TKMP.DLL を使用したイベントによる非同期メール受信処理を Task(await) を使用して順次処理のように記述する』テンプレート

SkyDrive へ移動


Framework 4.5 では、Task<TResult> クラスによって非同期処理の結果を取得してあたかも同期処理のような記述を行う事ができるようになりましたが、既存の非同期処理をそのように書き換える為に、TaskCompletionSource<TResult> クラスを使用します。

単純に考えると、Task を戻り値とするメソッド内は全て管理されていて、その中で登録されたイベントは全て管理下に置かれるようです。イベントが終了するまで、メソッドが終わる事無く、TaskCompletionSource<TResult> クラスの TrySetResult( SetResult との違いは良く解りません )で、値をセットした時にメソッドが終了するように見えます。

こうする事によって、大きなメリットの一つとして、UI スレッドにふつうに戻って来て処理を行えるところであり、当然ループ内の一部として自然に行を追加しながら非同期を実現する事ができました



MainWindow.xaml.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
using System.Net;
using System.Windows;
using System.Windows.Input;
using System.Collections.ObjectModel;
using TKMP.Net;
using System.IO;
using TKMP.Reader;
using System.Threading;
using System.Threading.Tasks;

namespace WPF_DataGrid_MailGet1 {
	public partial class MainWindow : Window {

		private MainViewModel mvm = new MainViewModel();
		private ImapClient client = null;

		// *********************************************
		// コンストラクタ
		// *********************************************
		public MainWindow() {
			InitializeComponent();

			this.dataGrid1.DataContext = mvm;
		}

		// 接続および、メールヘッダの取得
		private async void actButton_Click(object sender, RoutedEventArgs e) {

			mvm.mail_data.Clear();

			BasicImapLogon logon = new BasicImapLogon(this.userName.Text, this.password.Password);
			client = new ImapClient(logon, "imap.gmail.com", 993);
			client.AuthenticationProtocol = AuthenticationProtocols.SSL;

			if (!client.Connect()) {
				return;
			}

			// メールデータ一覧を格納するオブジェクト
			IMailData[] md = client.GetMailList();

			// データがありません
			if (md == null) {
				return;
			}

			// メールデータの数
			mailCount.Text = md.Length.ToString();

			// 読込み制限
			int maxCount = 20;
			int idx = 0;

			// 非同期で全て表示
			foreach (var data in md) {

				idx++;
				if (idx > maxCount) {
					break;
				}

				// Framework 4.5 : 値を返す非同期処理
				MailReader reader = await ReadBodyAnsync( data );

				// UI スレッドに戻って来ているので、特殊な処理は必要無い
				string from = "";
				string subject = "";
				string mdate = "";
				// ヘッダの一覧より、目的のヘッダを探す
				foreach (TKMP.Reader.Header.HeaderString headerdata in reader.HeaderCollection) {

					if (headerdata.Name == "From") {
						from = headerdata.Data;
					}
					if (headerdata.Name == "Subject") {
						subject = headerdata.Data;
					}
					if (headerdata.Name == "Date") {
						mdate = headerdata.Data;
					}

				}

				// 行追加
				mvm.mail_data.Add(new ItemViewModel() {
					from = from,
					subject = subject,
					mdate = mdate
				});

			}
			// ソース的には、順次処理なので全てのデータ処理後のクローズ
			client.Close();

		}

		// *********************************************
		// 戻り値を返す事のできる非同期処理 【開始】
		// *********************************************
		private TaskCompletionSource<MailReader> tcs = null;
		private Task<MailReader> ReadBodyAnsync(IMailData MailData) {

			// 戻り値用のクラス
			tcs = new TaskCompletionSource<MailReader>();

			// 個別にイベント登録
			MailData.BodyLoaded += new EventHandler(MailData_event);
			// 非同期処理開始
			MailData.ReadBodyAnsync();

			return tcs.Task;
		}

		// 本来のイベント処理
		private void MailData_event(object sender, EventArgs e) {

			IMailData MailData = (IMailData)sender;

			// イベント削除
			MailData.BodyLoaded -= new EventHandler(MailData_event);

			// 本文無し( 本文が必要な場合は、false で、reader.MainText )
			MailReader reader = new MailReader(MailData.DataStream, true);

			// ****************************
			// 戻り値用のクラスの戻り値をセット
			// ****************************
			tcs.TrySetResult(reader);

		}
		// *********************************************
		// 戻り値を返す事のできる非同期処理 【終了】
		// *********************************************


		// ダブルクリック
		private void dataGrid1_MouseDoubleClick(object sender, MouseButtonEventArgs e) {
			Debug.WriteLine(dataGrid1.SelectedIndex);

		}


	}
}

参考ページ

c# - Best way to convert callback-based async method to awaitable task - Stack Overflow
c# - TaskCompletionSource : When to use SetResult() versus TrySetResult(), etc - Stack Overflow

関連するページ

▼ このページの処理の元となった、通常のイベント非同期処理
WPF(C#) : 『DataGrid に、TKMP.DLL を使用して非同期にメールヘッダを受信する』 テンプレート



posted by lightbox at 2013-11-01 20:29 | VS(C#) | このブログの読者になる | 更新情報をチェックする

2013年10月29日


Framework4(C#) : WebClient で Post と Get する汎用 static クラス

テストしたのは、Windows7 + Visual Studio 2010 + WPF アプリケーションです。

Web アクセスには、UrlEncode が必要になりますが、HttpUtility.UrlEncode はプロジェクトのプロパティで、『.NET Framework 4』にして System.Web を参照します。最初にプロジェクトを作成した場合、『.NET Framework 4 Client Profile』にセットされている場合があり、その場合  System.Web を参照できません。

HttpUtility.UrlEncode は、Windows Phone(OS 7.1) にもある事はあるのですが、エンコード結果が UTF-8 系列しか指定できないので、Encoding を指定する第二引数がありません。参照も、System.Windows の中の System.Net にあります。ですから、このクラスは Windows Phone(OS 7.1) では使用できません。

%エンコーディングの仕様が違いますが、WEB へ送信する場合は、Uri.EscapeDataString でも使用可能で、Twitter への投稿ではこちら(RFC 3986)が良いと思いますが、文字列は UTF-8 に変換されてエンコーディングされます。
using System;
using System.Collections.Generic;
using System.Net;
using System.Text;
using System.Web;

namespace winofsql {

	class Tool {

        public static string serverEncoding = "utf-8";

		// *********************************************
		// UTF-8 POST
		// *********************************************
		public static string Post(string url,
            Dictionary<string, string> param,
            UploadStringCompletedEventHandler UploadStringCompleted=null) {

			string result = "";

			try {
				WebClient webClient = new WebClient();
                webClient.Encoding = Encoding.GetEncoding(serverEncoding);

                if ( UploadStringCompleted != null ) {
                    // 呼び出し側でラムダ式を使う事を想定した
                    // イベント登録
                    webClient.UploadStringCompleted += UploadStringCompleted;
                }

                webClient.Headers["Content-Type"] = "application/x-www-form-urlencoded";

                string data_string = "";

                foreach (KeyValuePair<string, string> kvp in param)
                {
                    if (data_string != "")
                    {
                        data_string += "&";
                    }
                    data_string += kvp.Key + "=";

            		// *******************************************************
                    // プロジェクトのプロパティの対象フレームワークを 
                    //『Framework 4』 にして System.Web を参照します
            		// *******************************************************
                    data_string += HttpUtility.UrlEncode(kvp.Value, Encoding.UTF8);
                }
                
                webClient.UploadStringAsync(new Uri(url), "POST", data_string);

			}
			catch (Exception Err) {
				result = "ERROR: " + Err.Message;
			}

            return result;

		}

		// *********************************************
		// エンコード指定 POST
		// *********************************************
		public static string Post(string url,
            string encoding,
            Dictionary<string, string> param,
            UploadStringCompletedEventHandler UploadStringCompleted=null) {

			string result = "";

			try {
				WebClient webClient = new WebClient();
                webClient.Encoding = Encoding.GetEncoding(serverEncoding);

                if ( UploadStringCompleted != null ) {
                    // 呼び出し側でラムダ式を使う事を想定した
                    // イベント登録
                    webClient.UploadStringCompleted += UploadStringCompleted;
                }

                webClient.Headers["Content-Type"] = "application/x-www-form-urlencoded";

                string data_string = "";

                foreach (KeyValuePair<string, string> kvp in param)
                {
                    if (data_string != "")
                    {
                        data_string += "&";
                    }
                    data_string += kvp.Key + "=";

            		// *******************************************************
                    // プロジェクトのプロパティの対象のフレームワークを 
                    //『.NET Framework 4』 にして System.Web を参照します
            		// *******************************************************
                    data_string += HttpUtility.UrlEncode(kvp.Value, Encoding.GetEncoding(encoding));
                }
                
                webClient.UploadStringAsync(new Uri(url), "POST", data_string);

			}
			catch (Exception Err) {
				result = "ERROR: " + Err.Message;
			}

            return result;

		}

		// *********************************************
		// URL のみ呼び出し GET
		// *********************************************
		public static string Get(
            string url,
            DownloadStringCompletedEventHandler DownloadStringCompleted=null) {

			string result = "";

			try {
				WebClient webClient = new WebClient();
                webClient.Encoding = Encoding.GetEncoding(serverEncoding);

                if ( DownloadStringCompleted != null ) {
                    // 呼び出し側でラムダ式を使う事を想定した
                    // イベント登録
                    webClient.DownloadStringCompleted += DownloadStringCompleted;
                }

                webClient.DownloadStringAsync(new Uri(url));

			}
			catch (Exception Err) {
				result = "ERROR: " + Err.Message;
			}

            return result;

		}

		// *********************************************
		// データ呼び出し( UTF-8 ) GET
		// *********************************************
		public static string Get(
            string url, 
            Dictionary<string, string> param,
            DownloadStringCompletedEventHandler DownloadStringCompleted=null) {

            string result = "";

            try
            {
                WebClient webClient = new WebClient();
                webClient.Encoding = Encoding.GetEncoding(serverEncoding);

                if (DownloadStringCompleted != null)
                {
                    // 呼び出し側でラムダ式を使う事を想定した
                    // イベント登録
                    webClient.DownloadStringCompleted += DownloadStringCompleted;
                }

                string data_string = "";

                foreach (KeyValuePair<string, string> kvp in param)
                {
                    if (data_string != "")
                    {
                        data_string += "&";
                    }
                    data_string += kvp.Key + "=";

                    // *******************************************************
                    // プロジェクトのプロパティの対象フレームワークを 
                    //『Framework 4』 にして System.Web を参照します
                    // *******************************************************
                    data_string += HttpUtility.UrlEncode(kvp.Value, Encoding.UTF8);
                }

                webClient.DownloadStringAsync(new Uri(url + "?" + data_string));

            }
            catch (Exception Err)
            {
                result = "ERROR: " + Err.Message;
            }

            return result;

		}

		// *********************************************
		// データ呼び出し( エンコード指定 ) GET
		// *********************************************
		public static string Get(
            string url,
            string encoding,
            Dictionary<string, string> param,
            DownloadStringCompletedEventHandler DownloadStringCompleted=null) {

            string result = "";

            try
            {
                WebClient webClient = new WebClient();
                webClient.Encoding = Encoding.GetEncoding(serverEncoding);

                if (DownloadStringCompleted != null)
                {
                    // 呼び出し側でラムダ式を使う事を想定した
                    // イベント登録
                    webClient.DownloadStringCompleted += DownloadStringCompleted;
                }

                string data_string = "";

                foreach (KeyValuePair<string, string> kvp in param)
                {
                    if (data_string != "")
                    {
                        data_string += "&";
                    }
                    data_string += kvp.Key + "=";

                    // *******************************************************
                    // プロジェクトのプロパティの対象フレームワークを 
                    //『Framework 4』 にして System.Web を参照します
                    // *******************************************************
                    data_string += HttpUtility.UrlEncode(kvp.Value, Encoding.GetEncoding(encoding));
                }

                webClient.DownloadStringAsync(new Uri(url + "?" + data_string));

            }
            catch (Exception Err)
            {
                result = "ERROR: " + Err.Message;
            }

            return result;

		}

	}
}


使用方法のサンプル
Tool.serverEncoding = "utf-8";
Tool.Post("http://student.xii.jp/lightbox/php_sample_1/log.php",
	"utf-8",
	new Dictionary<string, string>() { { "send", "ok" }, { "text", "日本語" } },
(object _sender, UploadStringCompletedEventArgs _e) =>
{
	// Error プロパティがセットされているとエラー
	if (_e.Error != null)
	{
		// エラー処理
	}
	// 正常な結果
	else
	{
		// 正常処理
	}
});

関連する記事

Framework4.5(C#)ストア : HttpClient で Post と Get する汎用 static クラス
Framework4(C#) : Windows Phone OS 7.1 : WebClient で Post と Get する汎用 static クラス
Android で Post と Get

いろいろな言語におけるバーセントエンコーディング





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

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

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

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

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


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

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

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

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

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

フリーフォントで簡単ロゴ作成
フリーフォントでボタン素材作成
フリーフォントで吹き出し画像作成
フリーフォントではんこ画像作成
ほぼ自由に利用できるフリーフォント
フリーフォントの書体見本とサンプル
画像を大きく見る為のウインドウを開くボタンの作成

CSS ドロップシャドウの参考デモ
BUTTONS (CSS でボタン)
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり