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 | Comment(0) | 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 | Comment(0) | 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 | Comment(0) | 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 | Comment(0) | java : JSP | このブログの読者になる | 更新情報をチェックする

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

現在、Pleiades All in One では、Eclipse 4.6 Neon 3 が最新バージョンなので、64bit版の Java Full Edition
 をダウンロードします。


Java だけではなく、Tomcat(6,7,8)JDK(6u48,7u80,8u121) も同梱されており、いろいろ便利に使えます。

解凍

Pleiades のダウンロードファイル(1.01G)はとても名前が長いので、Pleiades.zip に変更し、c:\ に移動してから 7-zip で解凍します。(昔から Pleiades で注意がうながされている、パスの長さの制限に対するものです)



jface プラグインの手動整備

ファイルをリネームするだけです。理由は解りませんが、本来の正しいファイルが .backup となっているので、.backup の無いファイルは適当なファイル名にして、.backup の付いたファイルを正式なファイルにします。

▼ リネーム前


▼ リネーム後


これは、Eclipse 4.4 Luna では必要無いのですが、たしか、Eclipse 4.5 Mars でも必要があると思います。これをしないと、実行時にエラーが発生します。(フォント用のプロパティファイルが、存在しないため)

最初の実行

Pleiades は、最初と、環境が変わった際に、以下を実行するように強く推奨されています。
eclipse.exe -clean.cmd

WindowBuilder のインストール

WindowBuilder のサイトよりインストール用の URL を取得します。



リンク先の URL をクリップボードにコピーします。そして、HELP => 新規ソフトウェアのインストール で、『作業対象』に URL を貼り付けて Enter キーを押して下さい。

WindowBuilder が表示されたら、チェックしてインストールを進めます。

SWT デザイナー[JFace] を使う場合

プロジェクトは専用のものを使いますので、『その他』から以下を選択して下さい。



プロジェクトを作成したら、CTRL+N でその他より、以下を選択して下さい。



実行してウインドウが表示されたら準備完了です。



Swing デザイナー を使う場合

この場合は、プラグインのリネームは必要ありません。プロジェクトも通常の Java プロジェクトで以下を選択します。



これも、実行してウインドウが表示されたら準備完了です。



posted by lightbox at 2017-04-15 20:02 | Comment(0) | java : WindowBuilder | このブログの読者になる | 更新情報をチェックする

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 + データベース | このブログの読者になる | 更新情報をチェックする

JSON データを即 TABLE 要素にセットしてくれる jQuery プラグイン『DYNATABLE』の利用


デモページ

いろいろしっかりした API を揃えている優秀そうなプラグインなんですが、何故かさっぱり日本語のページがヒットせず、サンプルコードも見つかりません。なので、基本的なコードのみで即動作するコードの紹介です。

そもそも、目的としては PHP で JSON の配列データは埋め込んでしまって、そのまま jQuery のプラグインを起動させるという単純なもので、PHP 部分は <?= $変数 ?> とかで実装して下さい。

それと、配布ページのデモは、bootstrap 前提で表示されているので、こちらからのデモページでは cdnjs で貼り付けています。

ソースコード
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css" />
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/Dynatable/0.3.1/jquery.dynatable.min.css" />
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/Dynatable/0.3.1/jquery.dynatable.min.js"></script>

<script>
$(function(){
	$('#my-table').dynatable({
		dataset: {
			records: [ {
				  "code" : "0001",
				  "name" : "浦岡 友也"
				}, {
				  "code" : "0002",
				  "name" : "山村 洋代"
				}, {
				  "code" : "0003",
				  "name" : "多岡 冬行"
				} ]
		}
	});
});
</script>
<div style='width:500px;margin:100px auto;'>
<table id="my-table" class="table table-bordered">
	<thead>
		<th>code</th>
		<th>name</th>
	</thead>
	<tbody></tbody>
</table>
</div>




posted by lightbox at 2017-04-15 17:09 | Comment(0) | jQuery + プラグイン | このブログの読者になる | 更新情報をチェックする

PHP の関数で規定されているキャッシュコントロールの無効 : session_cache_limiter( 'nocache' )

session_start() を実行しないと有効にならないので、セッションが必要無い場合は header を直書きすればいいと思いますが、セッションを有効にしても損は無いので以下のようにとておくと簡単です。

session_cache_limiter
<?php
session_cache_limiter('nocache');
session_start();
?>


header を直接書くと以下のようになります
<?php
header( "Expires: Thu, 19 Nov 1981 08:52:00 GMT" );
header( "Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0" );
header( "Pragma: no-cache" );
?>

▼ 以下は、Cache-Control の値についての解説です
HTTP キャッシュ
「no-store」はもっと単純です。返されたレスポンスのバージョンにかかわらず、ブラウザのキャッシュやすべての中間キャッシュはそのレスポンスを一切格納できません。たとえば、個人の機密データや銀行データが含まれているレスポンスなどです。ユーザーがこのアセットをリクエストするたびに、リクエストがサーバーに送信され、完全なレスポンスが毎回ダウンロードされます。
※ 一部引用
posted by lightbox at 2017-04-15 15:02 | Comment(0) | PHP + 特記事項 | このブログの読者になる | 更新情報をチェックする

PHP で漢字スペースと通常スペースのトリムとPHP正規表現チェッカー(置き換え)

※ 昔使っていた『PHP正規表現チェッカー』のサイトが閉鎖されたので他のサイトに変更しました

PHP では trim と言う関数で、文字列の先頭および末尾にあるホワイトスペースを取り除く事ができますが、デフォルトでは以下の文字を削除します。
" " (ASCII 32 (0x20)), 通常の空白。
"\t" (ASCII 9 (0x09)), タブ。
"\n" (ASCII 10 (0x0A)), リターン。
"\r" (ASCII 13 (0x0D)), 改行。
"\0" (ASCII 0 (0x00)), NULバイト
"\x0B" (ASCII 11 (0x0B)), 垂直タブ
で、日本語スペースはこのままでは削除してくれないので、追加してみると普通に削除してくれました。 Run Code で実行
<?php

    $kj = "漢字表示";
    $kj_space = " ";
    $a_space = " ";
   

    $str = "{$kj_space}{$a_space}{$kj}{$kj_space}{$a_space}";

    $str = trim($str, "{$a_space}\t\n\r\0\x0B{$kj_space}");
    
    print "|{$str}|";
    
?>
また、同様の結果を preg_replace で得る方法もテストしてみました。この場合重要なのは、パターン修飾子 の "u" でした。(パターンと対象文字列は、 UTF-8 として処理されます)

Run Code で実行
<?php

    $kj = "漢字表示";
    $kj_space = " ";
    $a_space = " ";
   

    $str = "{$kj_space}{$a_space}{$kj}{$kj_space}{$a_space}";

    $str = preg_replace( "/^[ \s]+/u", "", $str );
    $str = preg_replace( "/[ \s]+$/u", "", $str );
    
    print "|{$str}|";
    
?>

また、正規表現のパーターンを一つにして一回で置換する場合は以下のようになります
<?php

    $kj = "漢字表示";
    $kj_space = " ";
    $a_space = " ";
   

    $str = "{$kj_space}{$a_space}{$kj}{$kj_space}{$a_space}";

    $str = preg_replace( "/^[ \s]+|[ \s]+$/u", "", $str );
    
    print "|{$str}|";
    
?>
この場合、重要なのは | を使った構文です

確認は、PHP正規表現チェッカー(置き換え) で解りやすく行う事ができます

▼ パターン文字列は ^[ \s]+|[ \s]+$


PHP正規表現チェッカーで デベロッパーツールを F12 で開いて(コンソール) 以下を実行できます。
$("input[name='pattern").val("^[ \\s]+|[ \\s]+$");$("input[name='replacement']").val("削除");$("#subject").val("  漢字表示  ");$('#preg_replace').keyup();


※ このサイトでは、jQuery が使用されています


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

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

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

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

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


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

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

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

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

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


Windows
container 終わり

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

Android SDK ポケットリファレンス
改訂版 Webデザイナーのための jQuery入門
今すぐ使えるかんたん ホームページ HTML&CSS入門
CSS ドロップシャドウの参考デモ
PHP正規表現チェッカー
Google Hosted Libraries
cdnjs
BUTTONS (CSS でボタン)
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり