SQLの窓

2017年04月25日


MySQLの日本語オンラインマニュアル、5.6 とその中のいくつかの重要なリンク

オンラインは最新が 5.7 で、英文のみですが、5.6 は日本語版があります

アーカイブ
日本語の 5.1 と 4.1 のマニュアルを PDF でダウンロード(表示)できるようです

▼ よく使うセクション
第13章 SQL ステートメントの構文

※ こちらも重要なので
4.5.1. mysql − MySQL コマンド行ツール
4.5.4 mysqldump − データベースバックアッププログラム

▼ Windows の 5.6 のコマンドラインオプションです
http://winofsql.jp/mysqlhelp.txt

▼ Windows の コマンドプロンプトで、SHIFT_JIS(cp932) に設定されている事を確認した処理です


関連する記事

MySQL のコマンドプロンプトからの処理用バッチファイル


どうしても当時のオリジナルを確認したい場合

WEB アーカイブより http://dev.mysql.com/doc/refman/5.1/ja/ で確認できます( 2014/7/3 ぶんより )



タグ:MySQL
posted by lightbox at 2017-04-25 10:52 | MySQL | このブログの読者になる | 更新情報をチェックする

2017年04月24日


MySQL のコマンドプロンプトからの処理用バッチファイル

普通に MySQL をインストールすると、bin フォルダまでは階層が深いので、以下のように専用のバッチファイルを作れば、PATH 環境変数を使う必要もありません。

最初に mysql -u root -p でテストするといいと思います。

※ バッチファイルの終了は、exit です。
mysql_cmd.bat
@echo off
setlocal
set path=C:\Program Files\MySQL\MySQL Server 5.7\bin;%path%
prompt cmd(mysql)$G

cmd.exe /k cls

endlocal

MySQL に接続(パスワードは入力)
cmd(mysql)>mysql -u root -p
Enter password: ********
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 12
Server version: 5.7.18-log MySQL Community Server (GPL)

Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 

この後、use データベース と show tables; で動作確認。

※ mysql終了は、exit または quit です。



タグ:MySQL
posted by lightbox at 2017-04-24 17:17 | MySQL | このブログの読者になる | 更新情報をチェックする

2017年04月23日


Google スプレッドシートの内容を JSON として localhost で取得する手順

Google API

Google API Console で、プロジェクトを作成し、Google Apps API より Sheets API をクリックして有効にする。

認証情報を作成で、API キーを選択。

最初はテストの為、キーの制限は『なし』のままで作業する。

Google ドライブ

Google スプレッドシートを作成する。



『無題のスプレッドシート』をクリックして名前を付けて、適当な表データを作成する。



共有の設定で、『リンクを知っている全員が閲覧できる』ようにする。



URL 部分より、スプレッドシートの id を取得する



JSON 取得用の URL

https://sheets.googleapis.com/v4/spreadsheets/{spreadsheetId}/values/{range} をベースに Google Chrome のアドレスバーで、JSON 取得用の URL を完成させる。

range 部分には シート名を日本語のまま貼り付ける。

最後に、?key=APIキーで完成させる
https://sheets.googleapis.com/v4/spreadsheets/1TEAEfUkxObUasSPdqml0qKb-TR2sA34a6m5ONCfb8eU/values/%E3%82%B7%E3%83%BC%E3%83%881?key=APIキー
{
  "range": "'シート1'!A1:Z1000",
  "majorDimension": "ROWS",
  "values": [
    [
      "228291",
      "310689",
      "307080"
    ],
    [
      "21631",
      "11969",
      "19389"
    ],
    [
      "209800",
      "183450",
      "177000"
    ],
    [
      "35375",
      "35471",
      "38699"
    ],
    [
      "6278",
      "7587",
      "8671"
    ],
    [
      "8452",
      "8930",
      "10415"
    ]
  ]
}

PHP で実行

まず、localhost で実行してみる。

▼ UTF-8N で保存
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Google スプレッドシート</title> 
</head>
<body style='white-space:pre;'>
<?php

$url = "https://sheets.googleapis.com/v4/spreadsheets/1TEAEfUkxObUasSPdqml0qKb-TR2sA34a6m5ONCfb8eU/values/%E3%82%B7%E3%83%BC%E3%83%881?key=APIキー";
$data = @file_get_contents($url);

print $data;

?>
</body>
</html>


API キーの制限を 『IP アドレス』にして、『127.0.0.1』と設定する。その後、ブラウザからアクセスすると、403 エラーとなって、アクセスして来た IP アドレスが表示されるので、その IP アドレスを登録します。すると、その場所の WAN 側のアドレスからのアクセス時のみ受け付けるようになります。




タグ:API google
posted by lightbox at 2017-04-23 20:58 | API | このブログの読者になる | 更新情報をチェックする

2017年04月18日


csc.exe を使用して、コマンドプロンプトから C# 5 のアプリケーションをビルドする



32ビット用 : %windir%\Microsoft.NET\Framework\v4.0.30319
64ビット用 : %windir%\Microsoft.NET\Framework64\v4.0.30319

以下64ビット環境です。
※ Windows10 でも動作していますが、以下のメッセージが出力されます
This compiler is provided as part of the Microsoft (R) .NET Framework, but only supports language versions up to C# 5, which is no longer the latest version.
csc.exe は、c# 用のコンパイラです。面倒な場所ではあるので、以下のスクリプトで簡単にプロンプトが作成できます
<JOB>
<RESOURCE id="commandList">
<![CDATA[
mode con: cols=120
set PATH=%windir%\Microsoft.NET\Framework64\v4.0.30319;%PATH%
prompt C#$G
]]>
</RESOURCE>

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

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

strPath = WScript.ScriptFullName
Set obj = Fso.GetFile( strPath )
Set obj = obj.ParentFolder
WshShell.CurrentDirectory = obj.Path

aData = Split( GetInline( "commandList" ), vbCrLf )
strCommand = "cmd.exe /k " & aData(0)
For I = 1 to Ubound( aData )
	strCommand = strCommand & "&" & aData(I)
Next
Call WshShell.Run( strCommand, 3 )

' ***********************************************************
' 関数
' ***********************************************************
Function GetInline( strName )

	GetInline = RegTrim( getResource( strName ) ) & vbCrLf

End Function
Function RegTrim( strValue )

	Dim regEx, str

	Set regEx = New RegExp
	regEx.IgnoreCase = True
	regEx.Pattern = "^[ \s]+"
	str = regEx.Replace( strValue, "" )
	regEx.Pattern = "[ \s]+$"
	RegTrim = regEx.Replace( str, "" )

End Function
</SCRIPT>
</JOB>

VBScript で記述されており、通常エクスプローラから実行すると最大化ウインドウでコマンドプロンプトが開くように作成してあります。

コマンドプロンプトからは、csc ソースコード.cs と入力するだけで基本的なビルドはすぐできます。

sample.cs
using System;
using System.IO;

// ********************************************************
// 実行
// ********************************************************
public class App
{

	public static void Main() {

		// PATH 環境変数取得
		String strEnv = Environment.GetEnvironmentVariable( "PATH" );

		// 配列定義
		String delimStr = ";";
		Char[] delimiter = delimStr.ToCharArray();

		String[] split = null;

		// トークン分割
		split = strEnv.Split( delimiter );

		// ソート
		Array.Sort( split, split.GetLowerBound(0), split.Length );

		// 書き込み
		try {
			StreamWriter OutFile = new StreamWriter( @".\result.txt", false );
			foreach (String strValue in split) {
				OutFile.WriteLine( strValue );
			}
			OutFile.Flush();
			OutFile.Close();
	
		}
		catch( Exception e ) {
			Console.WriteLine("エラーの内容 : {0}", e.ToString());
		}
	}

}

オプションは csc /? で表示されます。

mysql.cs( ODBC アクセス )
using Microsoft.VisualBasic;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
using System.Data.Odbc;

public class App
{

	// ********************************************************
	// MySQL / System.Data.Odbc
	// ********************************************************

	public static void Main()
	{
		string myConnectString = "Driver={MySQL ODBC 5.3 Unicode Driver};" + "SERVER=localhost;" + "DATABASE=lightbox;" + "UID=root;" + "PWD=password";

		OdbcConnection myCon = new OdbcConnection();
		myCon.ConnectionString = myConnectString;
		myCon.Open();

		string myQuery = "SELECT 社員マスタ.*,DATE_FORMAT(生年月日,'%Y-%m-%d') as 誕生日" + " from 社員マスタ";
		OdbcCommand myCommand = new OdbcCommand();
		myCommand.CommandText = myQuery;
		myCommand.Connection = myCon;

		OdbcDataReader myReader = default(OdbcDataReader);
		myReader = myCommand.ExecuteReader();


		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();

		myQuery = "update 社員マスタ set 生年月日 = '1982/01/01'" + " where 社員コード = '0002'";
		Execute(myCon, myQuery);

		myCon.Close();

		myReader.Dispose();
		myCon.Dispose();

	}

	// ********************************************************
	// 列データ取得
	// ********************************************************
	public static string GetValue(OdbcDataReader odr, string strName)
	{

		string ret = "";
		int fld = 0;

		fld = odr.GetOrdinal(strName);
		if (odr.IsDBNull(fld)) {
			ret = "";
		} else {
			ret = odr.GetValue(fld).ToString();
		}

		return ret;

	}

	// ********************************************************
	// 更新処理
	// ********************************************************
	public static int Execute(OdbcConnection cn, string SQL)
	{

		int ret = 0;
		OdbcCommand execCommand = new OdbcCommand();

		execCommand.CommandText = SQL;
		execCommand.Connection = cn;
		try {
			ret = execCommand.ExecuteNonQuery();
		} catch (Exception ex) {
			Console.WriteLine(ex.Message);
		}
		execCommand.Dispose();

		return ret;

	}

}




タグ:C#
posted by lightbox at 2017-04-18 22:08 | VS(C#) | このブログの読者になる | 更新情報をチェックする

2017年04月15日


Pleiades All in One(NEON) で、サーブレットとJSP を作成する手順

関連する記事

Pleiades All in One(NEON) で、Windows アプリを作成する手順( WindowBuilder )

Pleiades All in One(NEON) には、Tomcat8 が同梱されているので普通にすぐ使えます。(Tomcat6とTomcat7 も入ってます)

(少なくとも単独起動に必要です)

プロジェクト作成

▼ 動的 Web プロジェクトを作成します




サーブレット作成



初期のソース


import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class WebApp
 */
@WebServlet("/WebApp")
public class WebApp extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public WebApp() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		response.getWriter().append("Served at: ").append(request.getContextPath());
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}


パースペクティブを Java EE にして実行







JSP 作成



▼ ソースを以下に変更して実行
( 全て保存して http://localhost:8080/Web1/NewFile.jsp にアクセス )
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP シンプル</title>
</head>
<body>

こんにちは!

</body>
</html>

サーブレットを以下のように変更

変更後、全て保存して実行( サーバは再起動 )



import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.jsp.JspFactory;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.PageContext;

@WebServlet("/WebApp")
public class WebApp extends HttpServlet {
	private static final long serialVersionUID = 1L;
	private static final JspFactory _jspxFactory = JspFactory.getDefaultFactory();

	public WebApp() {
		super();
	}

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		PageContext pageContext = _jspxFactory.getPageContext(this, request, response,
	  			null, true, 8192, true);
	JspWriter out = pageContext.getOut();


	response.setContentType("text/html; charset=UTF-8");

	out.write("<!DOCTYPE html>\r\n");
	out.write("<html>\r\n");
	out.write("<head>\r\n");
	out.write("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\r\n");
	out.write("<title>Insert title here</title>\r\n");
	out.write("</head>\r\n");
	out.write("<body>\r\n");
	out.write("\r\n");
	out.write("こんにちは!\r\n");
	out.write("\r\n");
	out.write("</body>\r\n");
	out.write("</html>");

	_jspxFactory.releasePageContext(pageContext);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

※ JSP がコンパイルされた結果の java ソースコードより転用しています

C:\user\java\Web170415a がワークスペースです
C:\user\java\Web170415a\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\work\Catalina\localhost\Web1\org\apache\jsp\NewFile_jsp.java
posted by lightbox at 2017-04-15 22:25 | java : JSP | このブログの読者になる | 更新情報をチェックする

PHP で MySQLをテストする為のソースコード


※ $_GET['text'] で入力された SQL が引き渡されます。
※ GET コマンドなので、内容はアドレスバーで確認する事ができます
※ Form を使わずにアドレスバーから直接 SQL を実行できます。

MySQL 改良版拡張モジュール
<?php
session_cache_limiter('nocache');
session_start();
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>SQL実行結果</title> 
</head>
<body style='white-space:pre;'>
<?php
print $_GET['text'] . "\n";

$server = 'localhost';
$dbname = 'lightbox';
$user = 'root';
$password = 'パスワード';

// ***************************
// 接続
// ***************************
$mysqli = @ new mysqli($server, $user, $password, $dbname);
if ($mysqli->connect_error) {
	print "接続エラーです : ({$mysqli->connect_errno}) ({$mysqli->connect_error})";
	exit();
}

// ***************************
// クライアントの文字セット
// ***************************
$mysqli->set_charset("utf8"); 

// ***************************
// クエリ
// ***************************
$result = $mysqli->query($_GET['text']);
if ( !$result ) {
	print "\n";
	print "<span style='color:#f00'>" . $mysqli->error . "</span>";
}

// ***************************
// 列数
// ***************************
$nfield = $result->field_count;
if ( $nfield ) {
	$ncount = 0;
	print "<table style='border:solid 1px #000;border-collapse:collapse;'>\n";

	print "\t<th style='border:solid 1px #000;padding:5px;'></th>\n";

	$field = $result->fetch_fields( );
	for( $i = 0; $i < $nfield; $i++ ) {
		print "\t<th style='border:solid 1px #000;padding:5px;'>{$field[$i]->name}</th>\n";
	}

	while ($row = $result->fetch_row()) {
		print "<tr>\n";
		print "\t<td style='border:solid 1px #000;padding:5px;'>" . ($ncount + 1) . "</td>\n";
		for( $i = 0; $i < $nfield; $i++ ) {

			print "\t<td style='border:solid 1px #000;padding:5px;'>{$row[$i]}</td>\n";
		}
		print "</tr>\n";
		$ncount++;
	}
	print "</table>";
}

// ***************************
// 接続解除
// ***************************
$mysqli->close();
?>

</body>
</html>


PHP 5.5.0 で非推奨になり、PHP 7.0.0 で削除
<?php
session_cache_limiter('nocache');
session_start();
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>SQL実行結果</title> 
</head>
<body style='white-space:pre;'>
<?php
print $_GET['text'] . "\n";

$server = 'localhost';
$dbname = 'lightbox';
$user = 'root';
$password = 'パスワード';

// ***************************
// 接続
// ***************************
$connect = @mysql_connect( $server, $user, $password );
if ( !$connect ) {
	print "接続エラーです";
	exit();
}

// ***************************
// DB選択
// ***************************
mysql_select_db( $dbname, $connect );
mysql_set_charset("utf8", $connect); 

// ***************************
// クエリ
// ***************************
$result = mysql_query($_GET['text'], $connect);
if ( !$result ) {
	print "\n";
	print "<span style='color:#f00'>" . mysql_error() . "</span>";
}

// ***************************
// 列数
// ***************************
$nfield = @mysql_num_fields( $result );
if ( $nfield ) {
	$ncount = 0;
	print "<table style='border:solid 1px #000;border-collapse:collapse;'>\n";

	print "\t<th style='border:solid 1px #000;padding:5px;'></th>\n";
	for( $i = 0; $i < $nfield; $i++ ) {
		$field = mysql_fetch_field( $result, $i );

		print "\t<th style='border:solid 1px #000;padding:5px;'>{$field->name}</th>\n";
	}

	while ($row = mysql_fetch_row($result)) {
		print "<tr>\n";
		print "\t<td style='border:solid 1px #000;padding:5px;'>" . ($ncount + 1) . "</td>\n";
		for( $i = 0; $i < $nfield; $i++ ) {
			print "\t<td style='border:solid 1px #000;padding:5px;'>{$row[$i]}</td>\n";
		}
		print "</tr>\n";
		$ncount++;
	}
	print "</table>";
}

// ***************************
// 接続解除
// ***************************
mysql_close($connect);
?>

</body>
</html>

※ このコードではセキュリティ上の考慮はされていません。



posted by lightbox at 2017-04-15 19:47 | PHP + データベース | このブログの読者になる | 更新情報をチェックする
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 終わり