SQLの窓

2020年02月04日


C# のタプル( Visual Studio 2017 でテスト )

System.ValueTuple を NuGet でインストールする必要がありますが、値を集団で容易に扱う事ができます

using System;

// System.ValueTuple を NuGet でインストール
// https://www.nuget.org/packages/System.ValueTuple/
// プロジェクトのプロパティのビルドの詳細設定で最新 C# 言語バージョンに変更
namespace ConsoleApp_003
{
	class Program
	{
		static void Main(string[] args)
		{
			// 無名
			var unnamed = ("one", "two");
			Console.WriteLine($"1: {unnamed.Item1}, 2: {unnamed.Item2}");

			// 左辺でプロパティを定義
			(string Alpha, string Beta) namedLetters = ("one", "two");
			Console.WriteLine($"1: {namedLetters.Alpha}, 2: {namedLetters.Beta}");

			// 右辺でプロパティを定義
			var alphabetStart = (Alpha: "one", Beta: "two");
			Console.WriteLine($"1: {alphabetStart.Alpha}, 2: {alphabetStart.Beta}");

			// 変数でプロパティを定義
			var sum = 12.5;
			var count = 5;
			var accumulation = (count, sum);
			Console.WriteLine($"1: {accumulation.count}, 2: {accumulation.sum}");

			// タプルを戻す関数 ( 1 )
			Console.WriteLine($"1: {testFunc().Item1}, 2: {testFunc().Item2}, 3: {testFunc().Item3}");

			// タプルを戻す関数 ( 2 )
			Console.WriteLine($"1: {testFunc2().a}, 2: {testFunc2().b}, 3: {testFunc2().c}");

			Console.ReadLine();
		}

		// ***********************************
		// タプルを戻す関数 ( 1 )
		// ***********************************
		public static (string, int, double) testFunc()
		{
			return ("a", 1, 5.5);
		}

		// ***********************************
		// タプルを戻す関数 ( 2 )
		// ***********************************
		public static (string a, int b, double c) testFunc2()
		{
			return ("a", 1, 5.5);
		}
	}
}



このページの PDF



posted by lightbox at 2020-02-04 01:19 | Pleiades | このブログの読者になる | 更新情報をチェックする

2020年02月02日


VBScript(WSH) と PHP(7.3) で氏名をランダムに作成





names.wsf
<JOB>
<COMMENT>
************************************************************
 WEB WSH 実行スケルトン
************************************************************
</COMMENT>

<OBJECT id="WshShell" progid="WScript.Shell" />

<SCRIPT language=VBScript>
' ***********************************************************
' 処理開始
' ***********************************************************

nMax = 500

' ***********************************************************
' Cscript.exe で強制実行
' ***********************************************************
Crun

strName1 = "山川森鈴木高田本多村吉岡松丸杉浦中尾安原野内"
strName2 = "和元雅正由克友浩春冬洋輝"
strName3 = "男也一行樹之"
strName4 = "子代美恵"

str = ""

For i = 1 to nMax
	' 姓1文字目
	nTarget = Random( 1, Len(strName1) )
	strName = Mid( strName1, nTarget, 1 )
	' 1文字目と2文字目が一致したら除外
	nTarget2 = nTarget
	Do while( nTarget = nTarget2 )
		nTarget2 = Random( 1, Len(strName1) )
	Loop
	' 姓2文字目
	strName = strName & Mid( strName1, nTarget2, 1 ) & " "
	' 名1文字目
	nTarget = Random( 1, Len(strName2) )
	strName = strName & Mid( strName2, nTarget, 1 )
	' 性別
	nTarget = Random( 0, 1 )
	' 性別によって名2文字目を決定
	if nTarget = 0 then
		nTarget = Random( 1, Len(strName3) )
		strName = strName & Mid( strName3, nTarget, 1 )
	else
		nTarget = Random( 1, Len(strName4) )
		strName = strName & Mid( strName4, nTarget, 1 )
	end if

	str = str & strName & " / "
	if (i-1) Mod 6 = 5 then
		Wscript.Echo str
		str = ""
	end if

Next

if str <> "" then
	Wscript.Echo str
end if


REM ************************************************
REM 指定範囲の整数の乱数を取得
REM ************************************************
Function Random( nMin, nMax )

	Randomize
	Random = nMin + Int(Rnd * (nMax - nMin + 1))

End function

Function SameRandom( nMin, nMax )

	SameRandom = nMin + Int(Rnd * (nMax - nMin + 1))

End function

REM **********************************************************
REM Wscript で実行された場合は Cscript で実行しなおす
REM **********************************************************
Function Crun( )

	Dim str

	str = WScript.FullName
	str = Right( str, 11 )
	str = Ucase( str )
	if str <> "CSCRIPT.EXE" then
		str = WScript.ScriptFullName
		strParam = " "
		For I = 0 to Wscript.Arguments.Count - 1
			if instr(Wscript.Arguments(I), " ") < 1 then
				strParam = strParam & Wscript.Arguments(I) & " "
			else
				strParam = strParam & Dd(Wscript.Arguments(I)) & " "
			end if
		Next
		Call WshShell.Run( "cmd.exe /c cscript.exe " & Dd(str) & strParam & " & pause", 3 )
		WScript.Quit
	end if

End Function

REM **********************************************************
REM ダブルクォートで囲む
REM **********************************************************
Function Dd( strValue )

	Dd = """" & strValue & """"

End function

</SCRIPT>
</JOB>


names.php
<?php
// ソースコードは UTF8N
// PHP.INI の default_charset = "UTF-8"

$NAME_1 = 0;
$NAME_2 = 1;
$NAME_3 = 2;
$NAME_4 = 3;

# シード
$name_seed = array();
$name_seed[] = "山川森鈴木高田本多村吉岡松丸杉浦中尾安原野内";
$name_seed[] = "和元雅正由克友浩春冬洋輝";
$name_seed[] = "男也一行樹之";
$name_seed[] = "子代美恵";
$names = array();

# 人数
$num = 100;

for ( $i = 0; $i < $num; $i++ ) {

	// 姓1文字目
	$n1 = mb_substr( $name_seed[$NAME_1], rand( 0, mb_strlen($name_seed[$NAME_1])-1 ), 1 );

	// 1文字目と2文字目が一致したら除外
	$n2 = $n1;
	while( $n2 == $n1 ) {
		$n2 = mb_substr( $name_seed[$NAME_1], rand( 0, mb_strlen($name_seed[$NAME_1])-1 ), 1 ) ;
	} 

	
	$name_result = $n1 . $n2 . " ";

	// 名1文字目
	$n3 = mb_substr( $name_seed[$NAME_2], rand( 0, mb_strlen($name_seed[$NAME_2])-1 ), 1 );
	$name_result .= $n3;

	$sex = rand( 0,1 );

	// 性別によって名2文字目を決定
	if ( $sex == 0 ) {
		$name_result .= mb_substr( $name_seed[$NAME_3], rand( 0, mb_strlen($name_seed[$NAME_3])-1 ), 1 );
	}
	else {
		$name_result .= mb_substr( $name_seed[$NAME_4], rand( 0, mb_strlen($name_seed[$NAME_4])-1 ), 1 );
	}

	// php PHP 7.3.13 で化けません
	if ( array_search( $name_result, $names ) === FALSE ) {
		print $name_result;
	}
	else {
		// 同姓同名
		print "*" . $name_result;
	}

	print " / ";

	if ( $i % 6 == 5 ) {
		print "\n";
	}

	$names[] = $name_result;

}

file_put_contents("names.log", print_r($names, true) );

print "\n";
print file_get_contents("names.log");

?>


▼ names.bat( php.exe に対して PATH は通してから実行 )
php.exe "%~p0names.php"
pause
このページのPDF
posted by lightbox at 2020-02-02 20:53 | Pleiades | このブログの読者になる | 更新情報をチェックする

2020年01月09日


C# : System.Data.Odbc によるデータベースのテーブルからのデータ取得処理( サンプルの SQL は MySQL 用です )

スタンダードな C# から ODBC を使用した読み取り処理のテンプレートです。

▼ 以下のようなデータで実行

using System;
using System.Data.Odbc;

namespace MySQL1
{
	class Program
	{
		static void Main(string[] args)
		{
			// *******************************
			// 接続文字列作成
			// *******************************

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

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

			// 接続用のパラメータを追加
			builder.Add("server", "localhost");
			builder.Add("database", "lightbox");
			builder.Add("uid", "root");
			builder.Add("pwd", "");

			// 接続文字列の内容を確認
			Console.WriteLine(builder.ConnectionString);

			// 一旦停止
			Console.ReadLine();

			using (OdbcConnection myCon = new OdbcConnection())
			using (OdbcCommand myCommand = new OdbcCommand())
			{

				// *******************************
				// 接続
				// *******************************
				try
				{
					myCon.ConnectionString = builder.ConnectionString;
					myCon.Open();
				}
				catch (OdbcException ex)
				{
					Console.WriteLine("接続エラーです");

					string errorMessages = "";
					int i = 0;

					for (i = 0; i < ex.Errors.Count; i++)
					{
						errorMessages += $"Index #{i.ToString()}\r\nMessage: {ex.Errors[i].Message}\r\nNativeError: {ex.Errors[i].NativeError.ToString()}\r\nSource: {ex.Errors[i].Source}\r\nSQL: {ex.Errors[i].SQLState}\r\n";
					}

					Console.WriteLine(errorMessages);
					// 一旦停止
					Console.ReadLine();

					// アプリケーション終了
					return;
				}

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

				// 実行する為に必要な情報をセット
				myCommand.CommandText = myQuery;
				myCommand.Connection = myCon;

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

				// *******************************
				// 読み出し
				// Read メソッドは、行が存在する場合は true、
				// それ以外の場合は false を返します
				// *******************************
				while (myReader.Read())
				{
					string result = "";

					// 列定義は文字列
					result += $"{GetValue(myReader, "社員コード")} : ";
					result += $"{GetValue(myReader, "氏名")} : ";

					// 列定義は整数
					result += $"{GetValue(myReader, "給与")} : ";

					// 列定義は日付
					result += $"{GetValue(myReader, "作成日")} : ";
					result += $"{GetValue(myReader, "更新日")} : ";
					result += $"{GetValue(myReader, "生年月日")} : ";
					result += $"{GetValue(myReader, "誕生日")}";

					// 内容をコンソールに表示
					Console.WriteLine(result);

				}

				// リーダーを閉じる
				myReader.Close();

				// 接続を閉じる
				myCon.Close();
			}
			// 接続の終わり

			// 一旦停止
			Console.ReadLine();


		}

		// ********************************************************
		// 列データ取得
		//
		// 列データを文字列として取得しますが、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;

		}
	}
}


実行結果




関連する Microsoft ドキュメント

OdbcConnectionStringBuilder クラス
OdbcConnection クラス
OdbcCommand クラス
OdbcDataReader クラス



このページの PDF


posted by lightbox at 2020-01-09 14:19 | Pleiades | このブログの読者になる | 更新情報をチェックする

2018年06月20日


WindowsBuilder の JFaceで アプリケーションウインドウとダイアログを使用した基本処理

WindowsBuilder のインストールとプロジェクトの作成

▼ 以下を参照して下さい
Pleiades All in One で、Windows アプリを作成する手順( WindowBuilder + Swing デザイナー or SWT デザイナー[JFace] )

ApplicationWindow を中央に表示
	@Override
	protected Point getInitialLocation(Point initialSize) {

		GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment();

		// デスクトップのサイズ
		Point windowSize = new Point(
				env.getMaximumWindowBounds().width,
				env.getMaximumWindowBounds().height);
		Point position = new Point(0,0);

		// デスクトップの中心に表示します
		return new Point(
			position.x + ((windowSize.x - initialSize.x) / 2),
			position.y + ((windowSize.y - initialSize.y) / 2)
		);
	}

ダイアログの呼び出し

呼び出し先から、こちら側のコントロールにアクセスする為、識別する為に名前を setData でセットしています
		Button btnNewButton = new Button(container, SWT.NONE);
		btnNewButton.addSelectionListener(new SelectionAdapter() {
			@Override
			public void widgetSelected(SelectionEvent e) {
				Dialog1 dialog = new Dialog1(getShell());
				int result = dialog.open();
				System.out.println(result);
			}
		});
		btnNewButton.setBounds(10, 10, 75, 25);
		btnNewButton.setText("New Button");
		btnNewButton.setData("name","Button1");



ダイアログを親ウインドウの中央に
	@Override
	protected Point getInitialLocation(Point initialSize) {

		Point windowSize = this.getShell().getParent().getSize();
		Point position = this.getShell().getParent().getLocation();

		return new Point(
			position.x + ((windowSize.x - initialSize.x) / 2),
			position.y + ((windowSize.y - initialSize.y) / 2)
		);
	}



ダイアログから親ウインドウにアクセス

対症療法なので正確では無いですが、parentShell.getChildren() の内容にもう少しチェックを追加すれば使用に問題は無いと思います。コンストラクタにウインドウのインスタンスを渡せば簡単ですが、汎用性はこちらのほうが勝ると思います。
	@Override
	protected void createButtonsForButtonBar(Composite parent) {
		Button button = createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true);
		button.addSelectionListener(new SelectionAdapter() {
			@Override
			public void widgetSelected(SelectionEvent e) {

				Shell parentShell = Dialog1.this.getParentShell();
				Control[] controls = parentShell.getChildren();
				Composite con = (Composite)controls[1];

				controls = con.getChildren();

				for( Control control: controls ) {
					Object name = control.getData("name");
					if ( name != null) {
						if ( name.toString().equals("Button1") ) {
							Button btn = (Button) controls[0];
							btn.setText("ボタン");
							break;
						}
					}
				}

				Dialog1.this.setReturnCode(Dialog.OK);
				Dialog1.this.close();

			}
		});
		Button button_1 = createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false);
		button_1.addSelectionListener(new SelectionAdapter() {
			@Override
			public void widgetSelected(SelectionEvent e) {
				Dialog1.this.setReturnCode(Dialog.CANCEL);
				Dialog1.this.close();
			}
		});
	}





posted by lightbox at 2018-06-20 20:02 | Pleiades | このブログの読者になる | 更新情報をチェックする

Pleiades Oxygen + WindowsBuilder で MySQL を使用して SQL(select) からデータの一覧を表示する

WindowsBuilder のインストールとプロジェクトの作成

Pleiades All in One で、Windows アプリを作成する手順( WindowBuilder + Swing デザイナー or SWT デザイナー[JFace] )

JFace の アプリケーションウインドウを追加します



パースペクティブを Java EE に変更



Oxygen で、WindowBuilder エディターにフォントの設定が効かないので、Java エディタも開いて併用します。
( Java エディタ では、CTRL + プラスキー でフォントが大きくなります )



使えないコントロールを削除

toolBarManager と statusLineManager はコードでしかメンテできそうにないので、メニューでテストは十分なので削除します。



関連する 必要ない Override メソッドも削除します



最後に必要なくなった呼び出し部分も削除します



▼ この時点で以下のようなソースになります( タイトルは変更しています )
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.window.ApplicationWindow;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;

public class Main extends ApplicationWindow {

	// *******************************
	// コンストラクタ
	// *******************************
	public Main() {
		super(null);
		createActions();
		addMenuBar();
	}

	// *******************************
	// 画面作成
	// *******************************
	@Override
	protected Control createContents(Composite parent) {
		Composite container = new Composite(parent, SWT.NONE);

		return container;
	}

	// *******************************
	// コンストラクタからの初期処理
	// *******************************
	private void createActions() {

	}

	// *******************************
	// メニュー
	// *******************************
	@Override
	protected MenuManager createMenuManager() {
		MenuManager menuManager = new MenuManager("menu");
		return menuManager;
	}

	// *******************************
	// エントリポイント
	// *******************************
	public static void main(String args[]) {
		try {
			Main window = new Main();
			window.setBlockOnOpen(true);
			window.open();
			Display.getCurrent().dispose();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	// *******************************
	// ウインドウ ( Shell )
	// *******************************
	@Override
	protected void configureShell(Shell newShell) {
		super.configureShell(newShell);
		// ウインドウのタイトル
		newShell.setText("MySQL データ表示");
	}

	// *******************************
	// ウインドウサイズ
	// *******************************
	@Override
	protected Point getInitialSize() {
		return new Point(635, 405);
	}
}


テーブルのサイズをウインドウのサイズ変更と同期させる


protected Control createContents(Composite parent) {
	Composite container = new Composite(parent, SWT.NONE);
	container.addControlListener(new ControlAdapter() {
		@Override
		public void controlResized(ControlEvent e) {
			// org.eclipse.swt.graphics.Rectangle;
			Rectangle size = container.getClientArea();
			table.setSize(size.width-21, size.height-24);
		}
	});

	table = new Table(container, SWT.BORDER | SWT.FULL_SELECTION);
	table.setBounds(10, 10, 599, 322);
	table.setHeaderVisible(true);
	table.setLinesVisible(true);

	return container;
}
メニューをデザイナから追加します 1) MenuManager を選択 2) メニュー部分をクリック 3) 新規を選択 4) メニューアイテム部分をクリック 5) メニューアイテムが一つ作成される コードも同時に作成されているので、Override の run を追加して loadMySQL("select * from 社員マスタ"); を追加
// *******************************
// コンストラクタからの初期処理
// *******************************
private void createActions() {

	{
		action = new Action("New Action") {
			@Override
			public void run() {
				table.removeAll();
				loadMySQL("select * from 社員マスタ");
				
			}
		};
	}
}

protected void loadMySQL(String string) {
	
	
}
MySQL 処理部分 private Connection conn = null; private Statement stmt = null; private ResultSet rs = null; private int maxRows = 20;
	protected void loadMySQL(String string) {

		try {
			// MySQL Connector/J 接続
			conn = (Connection) DriverManager.getConnection(
				// mysql-connector-java-8.0.11 で serverTimezone が必要
				"jdbc:mysql://localhost/lightbox?user=root&password=&characterEncoding=UTF-8&serverTimezone=JST"
			);

			stmt = (Statement) conn.createStatement();
			rs = stmt.executeQuery(string);

			// select の結果の列情報の取得
			ResultSetMetaData rsmd = (ResultSetMetaData) rs.getMetaData();

			// 列数
			int columnCount = rsmd.getColumnCount();

			// 前回のテーブル列を全て削除
			int tableColumnCount = table.getColumnCount();
			TableColumn tableColumnWork = null;
			for( int i = tableColumnCount - 1; i >= 0; i--) {
				tableColumnWork = table.getColumn(i);
				tableColumnWork.dispose();
			}

			// 列名
			TableColumn tableColumn = null;
			for( int i = 1; i <= columnCount; i++) {
				tableColumn = new TableColumn(table, SWT.NONE);
				tableColumn.setWidth(100);
				tableColumn.setText(rsmd.getColumnName(i));
			}

			TableItem tableItem = null;
			SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
			int countRow = 0;
			while( rs.next() && countRow < maxRows ) {

				countRow++;

				String[] columnData = new String[columnCount];

				for( int i = 1; i <= columnCount; i++) {

					if ( rsmd.getColumnTypeName(i).equals("DATETIME") ) {
						columnData[i-1] = sdf.format(rs.getDate(i));
					}
					else {
						columnData[i-1] = rs.getString(i);
					}

				}
				tableItem = new TableItem(table, SWT.NONE);
				tableItem.setText(columnData);
			}

			rs.close();
			stmt.close();
			conn.close();

		} catch (SQLException ex) {
			// handle any errors
			System.out.println("SQLException: " + ex.getMessage());
			System.out.println("SQLState: " + ex.getSQLState());
			System.out.println("VendorError: " + ex.getErrorCode());
		}
	}

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;

行をダブルクリックした時の行データの取得
		table.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseDoubleClick(MouseEvent e) {
				int row_no = table.getSelectionIndex();
				// 行 は 0 以上
				if ( row_no >= 0 ) {
					// タイトル部分の表示
					TableColumn[] tableColumns = table.getColumns();
					for( TableColumn column: tableColumns ) {
						System.out.println( column.getText() );
					}

					// 行部分の表示
					TableItem tableItem = table.getItem(row_no);
					int columnCount = tableColumns.length;
					for( int i = 0; i < columnCount; i++ ) {
						System.out.println( tableItem.getText(i));
					}
				}
				
			}
		});

関連する記事

WindowBuilder JFace : WEB より JSON を取得して Table に表示する




posted by lightbox at 2018-06-20 17:28 | Pleiades | このブログの読者になる | 更新情報をチェックする

2018年06月18日


Pleiades Oxygen の XAMPP の TOMCAT を Pleiades の JDK8 で動作させる

PC に JDK がインストールされていない場合、Pleiades 内の JDK で起動できます。

XAMPP の TOMCATは、pleiades\xampp にあって、実際起動しているのは pleiades\xampp\catalina_start.bat です。その中でレジストリのチェックをして 『HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Development Kit』が無いと起動できません。

▼ 以下を手動で登録します。
[HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Development Kit]
"JavaHome"="C:\pleiades\java\8"
※ 実際のバッチファイルでは、以下の4種類をチェックして、それぞれについて処理分岐しています
set JDKKeyName64=HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Development Kit
set JDKKeyName32=HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\JavaSoft\Java Development Kit
set JREKeyName64=HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment
set JREKeyName32=HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\JavaSoft\Java Runtime Environment
▼ バッチファイルのチェック部分
:JDKRUN
echo.
echo [XAMPP]: Using JDK
set "CURRENT_DIR=%cd%"
set "CATALINA_HOME=%CURRENT_DIR%\tomcat"

set Cmd=reg query "%KeyName%" /s
for /f "tokens=2*" %%i in ('%Cmd% ^| find "JavaHome"') do set JAVA_HOME=%%j

echo.
echo [XAMPP]: Seems fine!
echo [XAMPP]: Set JAVA_HOME : %JAVA_HOME%
echo [XAMPP]: Set CATALINA_HOME : %CATALINA_HOME%
echo.

if %ERRORLEVEL% == 0 (
	echo %MyPID% > tomcat\logs\catalina.pid
)

"%CATALINA_HOME%\bin\catalina.bat" run
goto END

:JRERUN
echo.
echo [XAMPP]: Using JRE
set "CURRENT_DIR=%cd%"
set "CATALINA_HOME=%CURRENT_DIR%\tomcat"

set Cmd=reg query "%KeyName%" /s
for /f "tokens=2*" %%i in ('%Cmd% ^| find "JavaHome"') do set JRE_HOME=%%j

echo.
echo [XAMPP]: Seems fine!
echo [XAMPP]: Set JRE_HOME : %JRE_HOME%
echo [XAMPP]: Set CATALINA_HOME : %CATALINA_HOME%
echo.

if %ERRORLEVEL% == 0 (
	echo %MyPID% > tomcat\logs\catalina.pid
)

"%CATALINA_HOME%\bin\catalina.bat" run
goto END

reg query /s は、レジストリのツリーの下位を全て再帰的に検索します。そして、JDK の場合は JavaHome が見つかったらその値を環境変数の JAVA_HOME にセットして "%CATALINA_HOME%\bin\catalina.bat" を実行します。



posted by lightbox at 2018-06-18 23:24 | Pleiades | このブログの読者になる | 更新情報をチェックする
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 ドロップシャドウの参考デモ
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり