SQLの窓 イラストAC フリー素材

2015年01月12日

C# バッチビルドキットで、VB の My 名前空間を使ってクリップボードを使ったり、キーボードの SHIFT キーが押されているかを知る

以下のキットを使うと、コマンドプロンプトで手軽に C# のビルドができます。(%windir%\Microsoft.NET\Framework\v4.0.30319 に環境があります)



処理自体の元々は VB.net ですが、単純な実行部分は Code Translation for .NET (C#<->VB.NET) で変換して、後は適当にエラー処理するだけでした。

参考ドキュメント

方法 : My 名前空間を使用する (C# プログラミング ガイド) 

これを利用するには、Microsoft.VisualBasic.dll の参照が必要ですが、『PATH=C:\Windows\Microsoft.NET\Framework\v4.0.30319;』というパスと、コマンドラインとしては『csc.exe /r:Microsoft.VisualBasic.dll cf.cs』で可能です。(64ビット環境では、Framework64というフォルダがあると思います)

※後、注意事項としてクリップボードのアクセス時には [STAThread] が必要です。
( このクラスを使用するには、Main メソッドが STAThreadAttribute 属性でマークされている必要があります。 )
using System;
using Microsoft.VisualBasic.Devices;
using System.Collections.Specialized;

class MyModule {

	[STAThread]
	static void Main() {
		string[] argv;
		argv = System.Environment.GetCommandLineArgs();
		string ActType;
		if ((argv.Length == 1)) {
			ActType = "name";
		}
		else {
			ActType = argv[1];
		}

		// VB.net で言うところの、My.Computer
		// http://msdn.microsoft.com/ja-jp/library/ms173136.aspx
		Computer myComputer = new Computer();

		// SHIFT キーを押しているがどうか
		if (myComputer.Keyboard.ShiftKeyDown) {
			if ((ActType == "name")) {
				// フルパスで表示
				ActType = "path";
			}
			else {
				// ファイル名だけで表示
				ActType = "name";
			}
		}

		StringCollection FileList;
		string delimStr = "\\";
		char[] delimiter = delimStr.ToCharArray();
		string[] aData;

		// エクスプローラから取得したファイル
		// 一覧形式のデータがあった場合
		if (myComputer.Clipboard.ContainsFileDropList()) {
			FileList = myComputer.Clipboard.GetFileDropList();
			foreach (string FilePath in FileList) {
				if ((ActType == "path")) {
					Console.WriteLine(FilePath);
				}
				else {
					aData = FilePath.Split(delimiter);
					Console.WriteLine(aData[(aData.Length - 1)]);
				}
			}
		}

		// 通常のテキストデータがあった場合
		if (myComputer.Clipboard.ContainsText()) {
			Console.WriteLine(myComputer.Clipboard.GetText());
		}


	}
}


関連する記事


▼ 元となった VB.net のコード
Imports System.Collections.Specialized

Module MyModule

' ********************************************
' クリップボードにあるファイル情報を標準出力へ
' ( エクスプローラの「コピー」で取得した内容 )
' 引数による処理タイプの決定
' name : ファイル名のみ
' path : フルパス
' ********************************************
Sub Main()

	' 文字列の配列
	Dim argv As String()

	' コマンドラインの取得
	argv = System.Environment.GetCommandLineArgs()
	Dim ActType As String

	' 引数が無い場合は、名前のみ
	If argv.Length = 1 Then
		ActType = "name"
	Else
		' name または path
		ActType = argv(1)
	End If

	' SHIFT キーを感知できた場合は処理を反転する
	' 要するに引数無しで SHIFT キーを押していたらフルパス
	If My.Computer.Keyboard.ShiftKeyDown Then
		If ActType = "name" Then
			ActType = "path"
		else
			ActType = "name"
		End If
	End If

	Dim FileList As StringCollection
	Dim FilePath As String
	Dim ClipString As String = ""

	' フルパスから名前だけを取り出す為のデリミタ
	Dim delimStr As String = "\"
	Dim delimiter As Char() = delimStr.ToCharArray()

	Dim aData As String()

	' クリップボードにファイルのデータがあった場合
	If My.Computer.Clipboard.ContainsFileDropList() Then
		'データを取得する
		FileList = My.Computer.Clipboard.GetFileDropList()
		'取得したファイル名を列挙する
		For Each FilePath In FileList
			If ActType = "path" Then
				Console.WriteLine( FilePath )
			Else
				aData = FilePath.Split(delimiter)
				Console.WriteLine( aData(aData.Length - 1) )
			End If
		Next
	End If


End Sub

End Module



タグ:C#
posted by at 2015-01-12 00:29 | Comment(0) | C# | このブログの読者になる | 更新情報をチェックする

2014年08月07日

printui.dll を VB.net または C# から呼び出す/ DllImport で LoadLibraryA / VS2010

DllImport 属性の使用

printui.dll を使用して、通常使うプリンターを名前で設定します

rundll32 printui.dll,PrintUIEntry /? で、コマンドラインからの使用方法のダイアログが表示されます。

通常使うプリンターとして設定: 
rundll32 printui.dll,PrintUIEntry /y /n "printer"

VB.net
Imports System.Runtime.InteropServices

Module Module1

	<DllImport("kernel32.dll", CharSet:=CharSet.Auto)> _
	Public Function LoadLibraryA( _
  <MarshalAs(UnmanagedType.LPStr)> ByVal DllName As String _
 ) As Integer
	End Function

	<DllImport("kernel32.dll", CharSet:=CharSet.Auto)> _
	Public Function FreeLibrary( _
   ByVal hModule As Integer _
 ) As Integer
	End Function

	<DllImport("kernel32.dll", CharSet:=CharSet.Auto)> _
	Public Function GetProcAddress( _
   ByVal hModule As Integer, _
   <MarshalAs(UnmanagedType.LPStr)> ByVal lpProcName As String _
 ) As Integer
	End Function

	<DllImport("user32.dll", CharSet:=CharSet.Unicode)> _
	Public Function GetDesktopWindow() As Integer
	End Function

	Delegate Sub PrintUIEntryW( _
	   ByVal hwnd As Int32, _
	   ByVal hinst As Int32, _
	  <MarshalAs(UnmanagedType.LPWStr)> ByVal text As String, _
	  ByVal nCmdShow As Int32)

	Sub Main()
		Dim hModule As Integer = LoadLibraryA("printui.dll")

		' *****************************
		' 実行
		' *****************************
		Dim ptr As IntPtr
		ptr = GetProcAddress(hModule, "PrintUIEntryW")
		If ptr <> IntPtr.Zero Then
			Dim func1 As PrintUIEntryW = _
			  Marshal.GetDelegateForFunctionPointer(ptr, _
			  GetType(PrintUIEntryW) _
			  )
			Call func1(GetDesktopWindow(), hModule, _
			 "/y /n """ & "プリンタ名" & """", 5)

			Call FreeLibrary(hModule)
		End If

	End Sub

End Module


C#
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;

namespace printui_cs {
	class Program {

		[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
		public static extern int LoadLibraryA([MarshalAs(UnmanagedType.LPStr)] 
		string DllName);

		[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
		public static extern int FreeLibrary(int hModule);

		[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
		public static extern int GetProcAddress(int hModule,
			[MarshalAs(UnmanagedType.LPStr)] 
		string lpProcName);

		[DllImport("user32.dll", CharSet = CharSet.Auto)]
		public static extern int GetDesktopWindow();

		public delegate void PrintUIEntryW(
			Int32 hwnd,
			Int32 hinst,
			[MarshalAs(UnmanagedType.LPWStr)] string text,
			Int32 nCmdShow);

		static void Main(string[] args) {

			int hModule = LoadLibraryA("printui.dll");

			// **************************
			// 実行 
			// **************************
			IntPtr ptr;
			ptr = (IntPtr)GetProcAddress(hModule, "PrintUIEntryW");
			if (ptr != IntPtr.Zero) {
				PrintUIEntryW func1 =
					(PrintUIEntryW)Marshal.GetDelegateForFunctionPointer(ptr, typeof(PrintUIEntryW));
				func1(GetDesktopWindow(), hModule, "/y /n \"" + "プリンタ名" + "\"", 5);
			}
			FreeLibrary(hModule);
		}
	}
}

※ "プリンタ名" が デバイスとプリンターで表示されるプリンタ名です。

関連する Microsoft ドキュメント

ユーザーによる操作なしで Windows にプリンタを追加する方法
[INFO] Windows の Rundll と Rundll32 インターフェイス
UnmanagedType 列挙体
文字列に対する既定のマーシャリング


PrintUIEntryW の最後の引数は、ShowWindow の nCndShow と同じで、5 は SW_SHOW を意味します。



タグ:Win32 API VB C#
posted by at 2014-08-07 23:23 | C# | このブログの読者になる | 更新情報をチェックする

2013年10月19日

LINQ で List のソート

あまり深入りせずに、とりあえずソートで使えばいいと思うのです。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

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

			List<MyData> list = new List<MyData>(){
				new MyData() { title = "国語", name = "山田先生",idno=1 },
				new MyData() { title = "英語", name = "田中先生",idno=5 },
				new MyData() { title = "社会", name = "鈴木先生",idno=10 }
			};

			var query = from el in list
				orderby el.idno descending
				select el;

			foreach (var val in query) {
				Console.WriteLine(val.title+" : "+val.name);
			}

			Console.ReadLine();

		}

		private class MyData {
			public string title;
			public string name;
			public int idno;
		}
	}
}




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

2013年10月12日

VS2010(C#)WPF : ListView 内に GridView を配置する









以上で、ListView 内に GridView が配置され、GridViewColumn が一つ作成されています。この GridViewColumn の CellTemplate に対して、DataTemplate を適合させてデータバインドを行います。

DataTemplate(2列ぶん)
<Window.Resources>

	<Style
		TargetType="{x:Type ListView}">
		<Setter
			Property="ItemContainerStyle">
			<Setter.Value>
				<Style
					TargetType="ListViewItem">
					<Setter
						Property="VerticalContentAlignment"
						Value="Top" />
				</Style>
			</Setter.Value>
		</Setter>
	</Style>

	<!-- 一覧データ 用の表示部品定義 -->
	<DataTemplate
		x:Key="ListImageTemplate">

		<StackPanel
			HorizontalAlignment="Left"
			Width="60">
			<Image
				Source="{Binding image}"
				Width="50"
				Height="50" />
			<TextBlock
				Text="{Binding screen_name}"
				TextWrapping="Wrap"
				Padding="4" />
		</StackPanel>

	</DataTemplate>

	<DataTemplate
		x:Key="ListDataTemplate">

		<StackPanel
			Margin="0,0,0,17"
			Width="250">
			<Border
				BorderThickness="1"
				BorderBrush="Black"
				Padding="4">
				<TextBlock
					Text="{Binding name}"
					TextWrapping="Wrap" />
			</Border>
			<TextBlock
				Text="{Binding text}"
				TextWrapping="Wrap"
				Padding="3" />
		</StackPanel>

	</DataTemplate>
</Window.Resources>


ListView に対する設定
<ListView
	Grid.Row="1"
	Height="227"
	HorizontalAlignment="Left"
	Margin="23,13,0,0"
	Name="listView1"
	VerticalAlignment="Top"
	Width="459"
	ItemsSource="{Binding statuses}">
	<ListView.View>
		<GridView>
			<GridViewColumn
				CellTemplate="{StaticResource ListImageTemplate}" />
			<GridViewColumn
				CellTemplate="{StaticResource ListDataTemplate}" />
		</GridView>
	</ListView.View>
</ListView>


バインド用のグループクラス
using System;
using System.ComponentModel;
using System.Collections.ObjectModel;

namespace WpfApp1
{
	public class MainViewModel {
		public MainViewModel() 	{
			this.statuses = new ObservableCollection<ItemViewModel>();
		}
		public ObservableCollection<ItemViewModel> statuses { get; set; }
	}
}


バインド用の明細クラス
using System;
using System.ComponentModel;
using System.Linq.Expressions;

namespace WpfApp1
{
	public class ItemViewModel : INotifyPropertyChanged 	{
		public string image { get; set; }
		public string text { get; set; }
		public string name { get; set; }
		public string screen_name { get; set; }

		public event PropertyChangedEventHandler PropertyChanged;
		public void NotifyPropertyChanged(String propertyName) {
			PropertyChangedEventHandler handler = PropertyChanged;
			if (null != handler) {
				handler(this, new PropertyChangedEventArgs(propertyName));
			}
		}
	}
}

データのロード部分
MainViewModel mvm = new MainViewModel();
mvm.statuses.Add(new ItemViewModel() {
	image = "https://lh3.googleusercontent.com/-1n_3a1aPisc/UNSrq1LzhpI/AAAAAAAAKdA/qMQKXmdZlf4/s200/freefont_hanko_ume-pgo4.png",
	screen_name = "sworc",
	name = "夜歩き",
	text = "ListView に GridView を実装する手順"
});

this.listView1.DataContext = mvm;




posted by at 2013-10-12 02:42 | C# | このブログの読者になる | 更新情報をチェックする

2013年10月11日

Windows ストア用の System.Collections.Generic 名前空間には、SortedList はありません。

System.Collections 名前空間

もちろん、通常の Framework には存在します。
SortedList<TKey, TValue> は、SortedDictionary<TKey, TValue> ほどメモリを使用しません。
と、あるので Twitter API の OAuth のデータを作るのに SortedList を使ったりしてたのですが、Windows Store では、SortedDictionary を使わなくてはいけません。 Microsoft の開発環境はいつのまにこんなに面倒な事になってしましたのでしょう。 それに、Windows8.1 サンプルでは、VB.net が無くなったようですし。
posted by at 2013-10-11 09:08 | C# | このブログの読者になる | 更新情報をチェックする

2013年09月16日

情報が全くみつからない Microsoft.Live

日本語は皆無と言っていいでしょうね。本当にやる気あるんだろうか、Microsoft は。SkyDrive に Windows ストアから API 使おうとしても、年額4,900円払わないといけないし。何がしたいか良く解らない。



英文ページしかないダウンロードページから、Live SDK v5.4 をダウンロードしてインストールすると、『C:\Program Files (x86)\Microsoft SDKs\Live\v5.4\.Net\Bin』にインストールされる。

それを使って LiveAuthClient クラスの 『ExchangeAuthCodeAsync』というメソッドを使ってセッションを取得するんだけれど、それに関する日本語ページが Microsoft のここしかない。が、これは何故か ASP.Net のお話になっている。

わけが解らないけれど、とにかく Windows8 + Visual Studio 2012 のフォームアプリで無事アップロードができる。何がなんだか良く解らない状態。

で、結局 GitHub にあるソースコードが最も信頼できる状態。もう、めっちゃくちゃ。

https://github.com/liveservices/LiveSDK-for-Windows
▲ ここにしか無い・・・・

SkyDrive へ移動( VS2012 用テンプレート )

posted by at 2013-09-16 21:16 | C# | このブログの読者になる | 更新情報をチェックする

2013年09月12日

VS2010(C#) バッチ(コンソールアプリ) Twitter 投稿

2013年09月10日 : 1〜4 : C#

前期は、Windows ストアと Windows Phone に特化して入力バリエーションと xaml ベースの Binding によるデータ処理を中心に行いました( データは XML で PHP 経由の DB )が、後期はテクニカルにバリエーションを付加しながら、JSON 中心のデータ処理を行います。但し、Windows ストアと Windows Phone に対してのデータ供給は 簡易 Http サーバを作成して対応したいと思います。

■ Twitter API の自分のアプリのトークンを使って投稿するだけの class VS2012_TwitterTwitter API の自分のアプリのトークンを使って投稿するだけの class VS2010_Twitter

バッチ処理は、DB や テキストファイル等を組み合わせた上で タスクスケジューラに登録すれば、最短で 5分間隔で自動投稿が可能になります。

▼ WebClient で Twitter 投稿 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Diagnostics;
using System.Security.Cryptography;

namespace BatchTweet
{
    class VS2010_Twitter
    {
        private string _consumer_key;
        private string _consumer_secret;
        private string _token;
        private string _secret;

        private string _tweet_api = "https://api.twitter.com/1.1/statuses/update.json";

        public VS2010_Twitter(
            string consumer_key,
            string consumer_secret,
            string token,
            string secret
            )
        {
            _consumer_key = consumer_key;
            _consumer_secret = consumer_secret;
            _token = token;
            _secret = secret;
        }

        public string Tweet(string text)
        {

            WebClient wc = new WebClient();

            // ソートされるリスト
            SortedList<string, string> sl = new SortedList<string, string>();
            sl.Add("oauth_consumer_key", _consumer_key);
            sl.Add("oauth_nonce", Nonce());
            sl.Add("oauth_signature_method", "HMAC-SHA1");
            sl.Add("oauth_timestamp", TimeStamp());
            sl.Add("oauth_token", _token);
            sl.Add("oauth_version", "1.0");
            sl.Add("status", Uri.EscapeDataString(text));

            // http ヘッダ用シグネチャ作成
            string work = "";
            foreach (KeyValuePair<string, string> kvp in sl)
            {
                if (work != "")
                {
                    work += "&";
                }
                work += kvp.Key + "=" + kvp.Value;
            }

            string work2 = "";
            // メソッド
            work2 += "POST" + "&";
            // API URL
            work2 += Uri.EscapeDataString(_tweet_api) + "&";
            // Oauth + データ
            work2 += Uri.EscapeDataString(work);

            // OAuth tool チェック用
            Debug.WriteLine(work2);

            string oauth_signature = Signature(work2);

            // ヘッダ情報を作成
            work = "";
            foreach (KeyValuePair<string, string> kvp in sl)
            {
                // oauth_* のみを使用する
                if (work != "")
                {
                    if (kvp.Key.Substring(0, 6) == "oauth_")
                    {
                        work += ", ";
                    }
                }
                if (kvp.Key.Substring(0, 6) == "oauth_")
                {
                    work += kvp.Key + "=" + Dd(kvp.Value);
                }
            }
            // シグネチャを追加( ヘッダーはソートの必要は無い )
            work += ", oauth_signature=" + Dd(Uri.EscapeDataString(oauth_signature));

            // OAuth tool チェック用
            Debug.WriteLine(work);

            // フォーマットは、 OAuth tool で確認。
            wc.Headers["Authorization"] = "OAuth " + work;
            // POST 用ヘッダ
            wc.Headers["Content-Type"] = "application/x-www-form-urlencoded";

            // 投稿
            string result = wc.UploadString(new Uri(_tweet_api), "POST", "status=" + sl["status"]);

            return result;

        }

        // ダブルクォートで挟む
        private string Dd(string base_string)
        {
            return "\"" + base_string + "\"";
        }

        private string Nonce()
        {
            Random rand = new Random();
            int nonce = rand.Next(1000000000);
            return nonce.ToString();
        }

        // タイムスタンプ
        private string TimeStamp()
        {
            TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);
            return Convert.ToInt64(ts.TotalSeconds).ToString();
        }

        // シグネチャ
        private string Signature(string target)
        {
            string work = _consumer_secret + "&" + _secret;
            byte[] bin = Encoding.UTF8.GetBytes(target);

            HMACSHA1 hmacsha1 = new HMACSHA1();
            hmacsha1.Key = Encoding.UTF8.GetBytes(work);
            byte[] hash = hmacsha1.ComputeHash(bin);

            return Convert.ToBase64String(hash);
        }
    }
}


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace BatchTweet
{
    class Program
    {
        static void Main(string[] args)
        {
            VS2010_Twitter twitter =
                new VS2010_Twitter(
                    "Consumer key",
                    "Consumer secret",
                    "Access token",
                    "Access token secret"
            );

            // 投稿
            string json = twitter.Tweet("バッチ投稿1");

            Console.WriteLine(json);

        }
    }
}




posted by at 2013-09-12 22:57 | C# | このブログの読者になる | 更新情報をチェックする

2013年01月05日

C# の delegate : メソッドの引数にメソッドを渡して使用する方法と、JavaScript の function(){} と同じ使用方法( 匿名 )

要するに関数型の変数の宣言。

private delegate void func(string a);

で、func という型が定義されて、func a という変数 a は、『引数が string 型で、戻り値が無い』という定義がされているメソッドであればなんでも良いという事。

メソッドを代入された変数はそのメソッドの代用になり、そのままメソッドとして使用できるようになるが、変数なので、内容を変更もできるし(他のメソッドとして入れ替え可能)、引数にも使用できる。( もちろん最初のメソッド名も引数として渡せるが、変数では無いので中身を変更はできない )

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;

namespace WindowsFormsApplication1
{

    public partial class Form1 : Form
    {
        private delegate void func(string a);

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {

            // 呼び出しタイプ1
            func _ptr = debug_string;
            button_action(_ptr);

            // 呼び出しタイプ2
            button_action(new func(debug_string));

            // 匿名処理1
            button_action((string a) => { Debug.WriteLine(a); });

            // 匿名処理2
            button_action(delegate(string a) { Debug.WriteLine(a); });
           
        }

        private void button_action(func ptr)
        {
            // 変数を使ってメソッドを呼び出す
            // ( 呼び出しタイプ1と2では debug_string が呼び出される )
            // ( 匿名処理1と2では そこに書いた別々のコードが呼び出される )
            ptr("デバッグを呼び出す");
        }

        private void debug_string(string a)
        {
            Debug.WriteLine(a);
        }
    }
}

※ 呼び出しタイプ2/匿名処理1/匿名処理2
方法 : デリゲートを宣言し、インスタンス化して使用する

リンク先によると、『new func(debug_string)』は一番古い書き方で、その次に『debug_string』というメソッド名を直接セットするようになっていますが、さらに『delegate』を使って匿名の処理をその場で書く事ができるようになっています。

さらに、最新の書き方が『ラムダ式』で、 (引数) => {処理;処理;} というような書き方が可能になっています。

ラムダ式 (C# プログラミング ガイド)


posted by at 2013-01-05 19:32 | C# | このブログの読者になる | 更新情報をチェックする

2012年12月05日

Windows8(C#) の WebView の LoadComplete で取得した URL 内のアクセストークンを Split で取得

本当は、url_params をループして、key_value[0] が "access_token" の場合で取得するのが正しいですが、手っ取り早くテストするコードです。 
        private async void webView_LoadComplete(object sender, NavigationEventArgs e)
        {

            String token = e.Uri.ToString();

            if (token.IndexOf("access_token=") != -1)
            {

                // 0 番目が 位置情報としてのURL 部分
                String[] url_params = token.Split(new Char[] { '?', '&' });
                String[] key_value = url_params[1].Split(new Char[] { '=' });

                ((TextBox)App.mainPage.FindName("PostBody")).Text = key_value[1];
                
            }

        }

関連する記事

Windows8(C#) で Google にログインしてカレンダーの情報を扱う




posted by at 2012-12-05 13:54 | C# | このブログの読者になる | 更新情報をチェックする

2012年11月06日

Facebook C# SDK の 5.4.1.0 のダウンロード

1) github で facebook-csharp-sdk-master.zip をダウンロード

2) 解凍して Source フォルダのソリューションを開いて( Windows Phone で行いました )ビルド

3) .nuget フォルダに NuGet.exe が作成されるので、コマンドプロンプトから、nuget install Facebook -Version 5.4.1 を実行

4) NuGet.exe のある場所に Facebook.5.4.1.0 が作成されて、その中の lib フォルダの中の sl3-wp が Windows Phone 用です。



もちろん、最新版もビルドされていますが、5.4.1 のコードが動きませんでした・・・




posted by at 2012-11-06 20:07 | C# | このブログの読者になる | 更新情報をチェックする
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