SSブログ

MySQLデータのWindowsからUbuntu(Linux)への移動 [Linux]


 Windows環境で運用しているWebDBをUbuntu(Linux)に移植するため、久しぶりにLinuxをいじったので勘が鈍ってしまい少し手間取った。
 元々Accessで運用されていたシステムをWeb化したとき、データをphpMyAdminでMySQLにインポートした。このときのテーブル作成sql文が
CREATE TABLE IF NOT EXISTS `T_テーブル名` (
 略
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=501 ;

できたテーブル名が `t_テーブル名`になっていたが、PHPでの検索が
SELECT * FROM `T_テーブル名`

でもWindows上は問題なく動作しているのでそのままにしていた。
 このデータをphpMyAdminでExportしてUbuntu側にInportしたので、テーブル作成sql文が
CREATE TABLE IF NOT EXISTS `t_テーブル名` (
 略
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=501 ;

になり、テーブル名が `t_テーブル名`となった。
 Unubutuで
SELECT * FROM `T_テーブル名`

で検索したので該当テーブルが無いのでエラーが。
そうだWindowsは大文字・小文字を区別しないが、Linuxは大文字・小文字を区別するのだった!!




WSH(vbs)でhostsの書き換え [VBA/VBS]


 同じ内容のファイルでPukiwiki/WordPressをWindows7 VMware上のWindowsXP/Windows7/Ubuntuで運用するため、ホスト名をmyhostに固定、ルーターで割り当てられるIPアドレスを固定になるように設定。
 運用したいOSのみホスト名(myhost)とIPアドレス対応を有効になるように、エディターでhostsの内容を書き換えていたが、エディターを管理者権限で立ち上げ深い階層にあるhostsを書き換えるのが面倒になったのでvbsで作成してみた。管理者権限でのvbs実行はここを参照させて頂きました。

hostsの内容
####################################################
# 有効にしたいOSの行頭の#を削除、他OSの行頭に#にする
#    
####################################################
192.168.1.3    myhost    #VMwarePlayer WindowsXP
#192.168.1.4  myhost    #VMwarePlayer Windows10
#192.168.1.5  myhost    #VMwarePlayer Ubuntu

vbsスクリプト
'#########################################
' hostを管理者権限で書き換え
'
'#########################################
Option Explicit

Dim WMI, OS, Value, Shell
Dim inputData, msgData, objFso, objFile
Dim lngPos1, lngPos2, readData
Dim buf_strTxt, fileName, fileNameTo

do while WScript.Arguments.Count = 0 and WScript.Version >= 5.7
    '##### WScript5.7 または Vista 以上かをチェック
    Set WMI = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\.\root\cimv2")
    Set OS = WMI.ExecQuery("SELECT *FROM Win32_OperatingSystem")
    For Each Value in OS
    if left(Value.Version, 3) < 6.0 then exit do
    Next

    '##### 管理者権限で実行
    Set Shell = CreateObject("Shell.Application")
    Shell.ShellExecute "wscript.exe", """" & WScript.ScriptFullName & """ uac", "", "runas"

    WScript.Quit
loop

'##### hosts書換

fileName = "c:\Windows\System32\drivers\etc\hosts"
inputData = InputBox("myhostのIPアドレスを変更します。" & vbCrLf & "1: VMwarePlayer WindowsXP" _
      & vbCrLf & "2: VMwarePlayer Windows10 & vbCrLf & 3: VMwarePlayer Ubuntu","hosts")
select case inputData
Case 1
  msgData = "VMwarePlayer WindowsXP"
Case 2
  msgData = "VMwarePlayer Windows10"
Case 3
  msgData = "VMwarePlayer Ubuntu"
Case Else
  MsgBox("1~3以外が選択されました。" & vbCrLf & "処理を中断します。")
  WScript.Quit
End Select

MsgBox (msgData & "が選択されました。") 

Set objFso = CreateObject("Scripting.FileSystemObject")
Set objFile = objFso.OpenTextFile(fileName, 1, False)
If Err.Number > 0 Then
	WScript.Echo "Open Error"
Else
	buf_strTxt = ""
	Do Until objFile.AtEndOfStream
		readData = objFile.ReadLine
		lngPos1 = Instr(readData, "192.168.1")
		lngPos2 = Instr(readData, msgData)
		If lngPos1 = 1 And lngPos2 = 0 Then      '192.168.1で始まりmsgDataを含まない時
			buf_strTxt = buf_strTxt & "#" & readData & vbCrLf
		ElseIf lngPos1 = 1 And lngPos2 > 0 Then  '192.168.1で始まりmsgDataを含む時
			buf_strTxt = buf_strTxt & readData & vbCrLf
		ElseIf lngPos1 = 2 And lngPos2 > 0 Then  '#192.168.1で始まりmsgDataを含む時
			buf_strTxt = buf_strTxt & Right(readData,Len(readData) - 1) & vbCrLf
		Else                                     '上記以外
			buf_strTxt = buf_strTxt & readData & vbCrLf
		End If
	Loop
End If
objFile.Close
Set objFile = Nothing
Set objFile = Nothing

'WScript.Echo buf_strTxt

'元ファイルをリネームして、テンポラリファイル作成
Set objFso = CreateObject("Scripting.FileSystemObject")
fileNameTo = fileName & "_"
objFso.MoveFile fileName, fileNameTo

'書込み用テキストファイル作成
Set objFile = objFso.OpenTextFile(fileName, 2, true)

'書込み
objFile.Write buf_strTxt
objFile.Close

'テンポラリファイルを削除
objFso.DeleteFile fileNameTo

Set objFile = Nothing
Set objFso  = Nothing

WindowsXPが「このコマンドを処理するのに必要な記憶域をサーバーで確保できません」でエラー [Windows]

 VMwarePlayer上のWindows10環境構築に伴い、WindowsXP環境からネットワーク経由でWindows7環境の共有フォルダーにPukiwiki/WordPressホルダーを丸ごとコピーしようとすると「このコマンドを処理するのに必要な記憶域をサーバーで確保できません」のメッセージでエラーが発生。一旦このエラーが発生すると共有フォルダーに接続できなくなる。記憶領域が確保できないとのメッセージなので安易に考え、WindowsXP側のメインメモリメモリを2Gから3Gに変更(仮想環境なのでメモリ増設は簡単)しても効果なし。
 このままではPukiwiki/WordPressの移行ができないので、ネットで調べるとここにこの事象の対処方法がありました。IRPStackSizeが小さすぎるためエラーしており、IRPStackSizeの値を大きくすることで解決するとのこと。記事に従いHKEY_LOCAL_MACHINE¥System¥CurrentControlSet¥Services¥LanmanServer¥Parameters
のIRPStackSize値を16進32(50)にしたら解決しました。

WordPressのサーバー移動 [WordPress]

 VMware上のWindows10環境構築にともない、WordPressもWindowsXP環境から移動した。移動作業に少し手間取ったのでこの備忘録。

手順
  • WindowsXP環境のWordPressホルダーをWindows10環境に丸ごとコピー
  • phpMyAdminでWindowsXP環境のMySQLのDB名WPDB,WSPをSQL形式でエクスポート
  • phpMyAdminでエクスポートされたSQL形式データをWindows10環境のMySQLにインポート
  • ブラウザーでWordPressを表示させると”HTTP500内部サーバーエラー”
  • この情報だけでは何も分からないので、詳細エラー表示しようとWordPressのコードを見たが色んな箇所でエラー表示の抑制をしており、修正が困難でエラー表示を諦め
  • MySQLのインストール時ユーザー、パスワードを入力が必要であるが、他のWebDB用のユーザー名、パスワードと異なる値を指定した記憶が・・・
  • phpMyAdminでDB名wpdbを指定し特権タブで新しいユーザーを追加
  • ユーザ:Wordpressインストール時指定したMySQLユーザー名,ホスト:localhost, パスワード:Wordpressインストール時指定したMySQLパスワード
  • 以上で正常に表示されるようになりました。


Pukiwikiで日本語が表示されない [PHP]


 WindowsXP(PHP5.3.2,Pukiwiki1.4.7)のPukiwikiフォルダーを丸ごとWindows10(PHP5)にコピーして、WindowXPと同じPukiwikiを運用しようとしたが、簡単に移行できなく苦労したのでその時の備忘録。
  • コピー後Pukiwikiをブラウザーで表示させると、エラー500を表示し何も表示されない。
  • PHPの設定ファイルphp.iniをerror_perporting = E_ALL & ~E_DEPRECATED & ~E_NOTICEに変更してみたが、エラー500を表示し何も表示されない。
  • pukiwikiのindex.phpでもerror_reporting(0)の記述があったので、PHPの設定と同じに変更。
  • lib/func.phpで組込関数hex2bin()がユーザ関数として再定義されたとのエラー表示。
  • PHP5.4以降のhex2bin()が組込まれている場合、定義しないように変更。
  • function hex2bin($hex_string) {
       省略
    }
    if(! function_exists('hex2bin')) {
      function hex2bin(hex_string) {
        省略
      }
    }
    
  • 今度は日本語が表示されない。PukiwikiのHomePageに"PHPの仕様変更に伴い、PHP5.4 以降で正常にマルチバイト文字を表示できない事がある問題の修正"の記載
  • 読むとPHP5.4の変更で”htmlspecialchars関数の第3引数の変更”が悪さをしているよう。 「htmlspecialchars関数の第3引数には、処理対象文字列の文字エンコーディングを指定します。この指定をしない場合、従来(PHP5.3まで)はISO-8859-1とみなされていたのに対して、PHP5.4ではUTF-8とみなされるようになります。」とのこと。
  • wikiフォルダーの各ページのデータ(xx.txt)がEUC-JPだったので、libフォルダー内のphpファイルでhtmlspecialcharsを使用している箇所全て、第三引数にEUC-JPを指定するように変更
  • htmlspecialchars(xx);
      ↓
    htmlspecialchars(xx,ENT_QUOTES,'EUC-JP');
    

この間約半日費やして漸く正常に表示できるようになった。
本当は、PHP5.4対応のPukiwiki1.5.0に変更すれば問題ないのだが、今回はWindowsXPのPukiwikiと内容の同期したかったの修正で対応した。




Windows7のBlueScreenがメモリ交換で直った [Windows]

 メインで使用している自作Core i7 Windows7マシンは、VirtualPC/VMwarePlayer等を起動して高負荷になるとBlueScreenになることがあった。メインメモリを疑いメモリテストを行ったが異常なし、頻度も低かったのでそのまま使用していた。今回Windows10環境が必要になり、VMwarePlayer上にWindows10環境を構築することにした。環境構築のためWindows10 DSP版を購入したときのハードとして、値段が安くなっていることもあり、DDR3 DIMM 8Gx2(メーカ製)を購入し、現状の2Gx4(無印)と入れ替えを行った。
 BlueScreeenの改善には余り期待していなかったが、メモリ交換後BlueScreenがピタリと無くなった。
Core i7 Windows7マシン構築時は2Gx4メモリが高価であったこともあり、無印メモリを購入したがやはり無印メモリは良くなかったのかな?

Windows10 IISのPHP設定ではまった [Windows]

 Windows7上のVMwarePlayerにWindow10をインストールしIISでWebサーバを構築したとき苦労したので備忘録として記載。 IIS、PHP、MySQLは手順通りインストールで問題なく完了。
 PHP : WebPlatformInstallerからPHP5.6.16 For IIS Expressをインストール
MySQL: MySQL5.7.11をWindows(x86,32-bit), MSI Installerでインストール

MySQLのデータをphpMyAdminでインポートしようとしたところ、インポートデータが大き過ぎでエラー。php.iniをエディターで以下に変更してIISを再起動。

C:\Program Files(x86)\iis exppress\PHP\v5.6\php.ini
Upload_max_filesize = 2M ->48M
post_max_size = 8M ->48M

 しかし、phpMyAdminの「インポートするファイル」の(最長: 2,048KiB)が変わっていない。php.iniを変更しても変更内容が反映されない?? IISの再起動ではダメ?と思いシステムの再起動を実施したが変化なし。

 ネットで調べると同じように悩んだ方がいたみたいでここが大変参考になった。
Program Files等のフォルダー内のファイルに対し書き込み権限が無い状態で書き込もうとすると、書き込み対象のC:\Program Files(x86)\iis exppress\PHP\v5.6\php.iniに書き込むのではなく、
C:\Users\%USERNAME%\AppData\Local\VirtualStore\Program Files(x86)\iis express\PHP\v5.6\php.ini
に書き込まれるようでした。これはVista以降のセキュリティ対策のための仕様とのこと。管理者権限でC:\Program Files(x86)\iis exppress\PHP\v5.6\php.iniを変更したら設定が変わった。

複数データ表示テーブルの入力チェック [HTML/CSS/JavaScript]


 WebDBシステムで会員情報をテーブルの1行に表示させて、該当会員のデータを編集することがある。入力項目のチェックをJavascriptで行うには、各項目にに割り振ったIDセレクターによりJavascript側で入力内容を取得することになる。しかし会員毎に同じ項目があり少し工夫が必要となる。この機能を実装したときの備忘録。

コード
Javascript部
/*===============================================
  入力チェック
    id: tbl_会員のIDの値
=================================================*/
function inpCHK(id) {
  if(document.getElementById(id + "年号").value == "") {
    alert("年号が空白のため登録できません。");
    target = document.getElementById(id + "年号");
    target.focus();
    return false;
  }
    ・
    ・
}

HTML部
echo '';


画面イメージ
gamen.jpg

西暦和暦変換をDB登録方式に(年号・元号変更時の対応) [PHP]


 未だ和暦で記載が必要な書類が多くあり、WebDBシステムを作成していても和暦西暦変換が必要になってくる。昭和・平成に対応していてもシステムに依っては大正・明治が必要になる場合も出てくる。
せっかくDBを使用しているので和暦の元年の西暦年月日を追加登録するとその和暦に対応できるようにしてみた。

DB登録(tbl_年号)
年号略号日付
昭和S1926-12-25
平成H1989-01-08
大正T1912-07-30


// --------------------------------------------------------------------
//   西暦 -> 和暦変換用の関数
//     引数     $flg 1: 元号アルファベット, 1以外 : 昭和、平成
//                 $dt  年月日(西暦,和暦も可)
//     戻り値: 和暦 元号yy年mm月dd日
// --------------------------------------------------------------------
function to_wareki($dt,$flg) {
   $SV_MySQL=xx;  $USER_MySQL=yy;  $PASS_MYSQL = zz;

   //データベースへの接続
   $link= mysql_connect($SV_MySQL, $USER_MySQL, $PASS_MYSQL) or die('接続に失敗しました。');
   mysql_select_db($DB_Name,$link) or die('データベース選択に失敗しました。');
   mysql_set_charset('utf8');
		
   //年号データ取得
   $sql = "SELECT * FROM tbl_年号 ORDER BY 日付";
   $result = mysql_query($sql, $link) or die('検索に失敗しました。'.mysql_error($link).'
'.$sql); $NENGOU_DT = array(); $NENGOU_DT_AL = array(); $NENGOU_DATE = array(); while($row = mysql_fetch_assoc($result)) { array_push($NENGOU_DT, $row['年号']); array_push($NENGOU_DT_AL, $row['略号']); array_push($NENGOU_DATE, $row['日付']); } $dt = strtolower(mb_convert_kana($dt,"a","UTF-8")); //小文字化 $dt = preg_replace('/\s/', '',$dt); $dt = str_replace("/","-",$dt); if(preg_match("/^[0-9-]+$/", $dt)) { //西暦の時 list($yy, $mm, $dd) = explode("-", $dt); if(strlen($mm)==1) $mm = "0".$mm; if(strlen($dd)==1) $dd = "0".$dd; $ymd = $yy.$mm.$dd; $count_nengou = count($NENGOU_DT); for($i = 0; $i <= $count_nengou - 1; $i++ ) { $nengou_dtt = date("Y-m-d",strtotime($NENGOU_DATE[$i]) - 2); list($nengou_yy, $nengou_mm, $nengou_dd) = explode("-", $nengou_dtt); $nengou_dt = $nengou_yy. $nengou_mm. $nengou_dd; $nengou_dtt = $NENGOU_DATE[$i + 1]; list($nengou_yy_next, $nengou_mm_next, $nengou_dd_next) = explode("-", $nengou_dtt); $nengou_dt_next = $nengou_yy_next. $nengou_mm_next. $nengou_dd_next; if($ymd > $nengou_dt && ($ymd < $nengou_dt_next || $nengou_dt_next == "")) { if($flg <> 1) { $gg = $NENGOU_DT[$i]; } else { $gg = $NENGOU_DT_AL[$i]; } $yy -= $nengou_yy - 1; break; } } $wareki = $gg.$yy."年".$mm."月".$dd."日"; return $wareki; } elseif($flg <> 1) { if(preg_match("/^[a-z]/", $dt)) { $count_nengou = count($NENGOU_DT); for($i = 0; $i < $count_nengou -1; $i++) { if(substr($dt,0,1) == strtolower($NENGOU_DT_AL[$i])) { $gg = $NENGOU_DT[$i]; } } $ymd = substr($dt,1); list($yy, $mm, $dd) = explode("-", $ymd); $wareki = $gg.$yy."年".$mm."月".$dd."日"; return $wareki; } else { return $dt; } } } 和暦 -> 西暦変換用の関数は省略



MySQL定時バックアップで大失敗 [MySQL]


 MySQLのデータをWindowsのタスクスケジューラを使用して毎日AM1:00に下記のようなバッチを起動してバックアップするように設定。作業が午後であったため、15:00にタスクスケジューラ起動するように設定して確認を実施。
バックアップが"DB名_backup_yyyymmdd_ttmmss.sql"のファイル名で作成されていることを確認できこれでOK。
 ところが後日、バックアップファイル名が"DB名_yyyymmdd_"となり、バックアップデータが無いファイルが作成されていることが判明。
 原因は、午前1時にtimeコマンドを発行すると01:mm:ssとなると思っていたが、実際は 1:xx:zzで先頭が0では無く空白となるのが原因でバッチが異常終了していた。この間バックアップデータが必要となる事態が無くて不幸中の幸い。
 下記のバッチの変更後にして、10時前でも10時後でも問題なくバックアップできるようになった。

変更内容
 time=%time: = 0%で10時以前は0t:mm:ssのように先頭に0を追加

@echo off

REM #===========================================#
REM # MYSQL バックアップ(日時ファイル名)
REM #===========================================#
REM 実行コマンドのPATH定義(MySQL mysqldumpの場所)
set dump_command="C:\Program Files\MySQL\MySQL Server 5.1\bin\mysqldump" 

REM DB名定義
set db_name=DB名

REM バックアップ先定義
set backup_dir=バックアップ先

REM バックアップディレクトリへ移動
pushd %backup_dir%

REM タイムスタンプ(書式:YYYYMMDD_HHMISS)
変更前 set timestamp=%date:~,4%%date:~5,2%%date:~8,2%_%time:~0,2%%time:~3,2%%time:~6,2%
      ↓
変更後 set time2=%time: =0%
変更後 set timestamp=%date:~,4%%date:~5,2%%date:~8,2%_%time2:~0,2%%time2:~3,2%%time2:~6,2%


REM バックアップファイル名
set backup_db_file=%backup_dir%%db_name%_backup_%timestamp%.sql

REM MYSQL ユーザー/パスワード定義
set user_mysql=xxxx
set password_mysql=yyyy

REM バックアップ開始
REM %dump_command% -u%user_mysql% -p%password_mysql% %db_name% > %backup_db_file%
 %dump_command% -u%user_mysql% -p%password_mysql% %db_name% > %backup_db_file%

REM # 6.7世代分より古いダンプファイル及びログを削除
for /f "skip=7 delims=" %%F in ('dir /b /o-d *.sql') do del "%%F"

REM 元のディレクトリへ移動
popd


この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。