Ubuntu16でSQLiteを使用してみる [SQLite]
Ubuntu16上のApache+PHP7でSQLite DBを使用しようとしたときのメモ。
UbuntuでもWindowsと同じようにPHPにはSQLiteがデフォルトで入っていると思い込み、
/etc/php/7.0/apache2/php.iniのextension=php_sqlite3.dllのコメント";"を外して、apache2を再起動。
$db = new SQLite3($dbname); $result = $db->query('SELECT * FROM '.$table_name);
とするとClass SQLite3 not found のエラーを吐く。
Ubuntuは別途php用sqliteをインストールする必要があるみたい。
php7.0-sqlite3をインストール後apach2を再起動したら正常に動作するようになった。
Linux bashでファイルの同期 [Linux]
久しぶりにLinuxを触ったので、bashの勉強方々ファイルの同期スクリプトを作成してみた。
subdir内のfile検索のための再帰処理、fileの更新日比較のためのfile名の連想配列、file名操作のための前方一致での削除(最短マッチ)等、bashについて勉強になった。
#!/bin/bash # file同期スクリプト # 更新元dir: dr_s # 更新先dir: dr_d dr_s="/vv/ww/" dr_d="/xx/yy" declare -A s_array declare -A d_array s_dir="s" d_dir="d" #dir内のfileを再帰的に検索して連想配列に格納する関数 # x_array[file name] = "D" or 更新日時のUTC秒 # walk(){ for e in $1/*; do path=$e if [ -d "$path" ]; then #echo "D:$path" if [ $2 = $s_dir ]; then s_array[$path]="D" else d_array[$path]="D" fi walk $path $2 elif [ -f "$path" ]; then e_date=`date +%s -r $path` if [ $2 = $s_dir ]; then s_array[$path]=$e_date else d_array[$path]=$e_date fi #echo " f:"${path##*/}","$e_date fi done } echo "同期開始" echo " 更新元 $dr_s" echo " 更新先 $dr_d" walk $dr_s $s_dir #更新元のdir/fileを配列に格納 walk $dr_d $d_dir #更新先のdir/fileを配列に格納 echo "dir更新" for key in ${!s_array[@]};do # echo "${key} => [${s_array[$key]}]" if [ ${s_array[$key]} = "D" ]; then str_fname=$dr_d${key#$dr_s} if [ ! -e $str_fname ]; then echo " Dir $str_fname not exist" mkdir $str_fname fi fi done echo "file更新" for key in ${!s_array[@]};do if [ ${s_array[$key]} != "D" ]; then str_fname=$dr_d${key#$dr_s} if [ ! -e $str_fname ]; then echo " file $str_fname not exist" cp $key $str_fname else if [ ${s_array[$key]} -gt ${d_array[$str_fname]} ]; then echo " file $key is new!!" cp $key -f $str_fname fi fi fi done echo "同期完了"
ランダムデータ作成(vbs) [VBA/VBS]
「大量データから該当データ抽出(vbs)」で動作確認の為に使用したサンプルデータ(数値と英文字のランダムデータ)を作成するVBScript。
'ランダムデータ作成 '例 DMUQVPUSS,8464 ' Option Explicit Dim intValue, intUpper, intLower ,loopNum, i, k, sLen, strUpper, strLower, strValue, strCnt Dim objFSO ' FileSystemObject Dim objFile ' ファイル書き込み用 loopNum = 50000 '作成個数 i = 0 '作成RANDOM数値 intUpper = 10000 '最大値 intLower = 1 '最小値 '作成RANDOM英文字 strUpper = 26 '英文字Z strLower = 1 '英文字A strCnt = 8 '文字数 Randomize Set objFSO = WScript.CreateObject("Scripting.FileSystemObject") If Err.Number = 0 Then Set objFile = objFSO.OpenTextFile("data.txt", 2, True) If Err.Number = 0 Then Do For k = 0 to StrCnt strValue = CStr(Int((strUpper - strLower + 1) * Rnd + strLower)) objFile.Write(Chr(strValue + 64)) Next objFile.Write(",") intValue = CStr(Int((intUpper - intLower + 1) * Rnd + intLower)) sLen = 3 - Len(intValue) For k = 0 to sLen intValue = "0" & intValue Next objFile.Write(intValue) objFile.WriteLine() i = i + 1 Loop Until i = loopNum objFile.Close Else WScript.Echo "ファイルオープンエラー: " & Err.Description End If Else WScript.Echo "エラー: " & Err.Description End If Set objFile = Nothing Set objFSO = Nothing
大量データから該当データ抽出(vbs) [VBA/VBS]
ある部品の一部製造ロットに品質問題があり、数万件の"S/N+ロット番号"リストから該当製造ロットのS/N+ロット番号を抽出する必要が出た。Excelでも抽出可能であるが大量データの処理であり、処理時間も考えてVBScriptで作成してみた。実行方法は下記VBScript(check.vbs)にdata.txtをDrag&Dropするかコマンドプロンプト上でcheck.vbs data.txt。
'data.txt内のデータにfilter.txt内のデータが存在する '場合result.txtに対象データを書き込む(check.vbs) ' Option Explicit Dim objArgs, I, objFso, objFile, objWFile, rdStr, filterAry, cntAry, item, dtStr 'filter.txtから読み込んだ値を配列filterAryに格納 Set filterAry = CreateObject("System.Collections.ArrayList") Set objFso = CreateObject("Scripting.FileSystemObject") Set objFile = objFso.OpenTextFile(objFso.getParentFolderName(WScript.ScriptFullName) & "\filter.txt", 1, False) Do Until objFile.AtEndOfStream filterAry.add objFile.ReadLine Loop objFile.Close cntAry = filterAry.Count 'data.txtを引数として受け取る Set objArgs = WScript.Arguments Set objFile = objFso.OpenTextFile(objArgs(I), 1, False) 'data.txtから読み込んだ値とにfilterAryの比較 Set objWFile = objFSO.OpenTextFile(objFso.getParentFolderName(WScript.ScriptFullName) & "\result.txt", 2, True) Do Until objFile.AtEndOfStream rdStr = objFile.ReadLine dtStr = Split(rdStr,",") For Each item In filterAry If dtStr(1) = item Then objWFile.WriteLine(dtStr(0) & "," & dtStr(1)) End If Next Loop objFile.Close Set objFile = Nothing Set objWFile = Nothing Set objFso = Nothing WScript.Echo "処理完了" '******* 'data.txtの例 DRVQZLWOM,6269 ZFYJMQFEO,9009 'filter.txtの例(check.vbsと同じフォルダーに置く) 1900 9466
文字列内の文字位置(言語による違い) [言語]
PHP/JavascriptでWebページを作成していて、文字列内の文字位置検索関数を使用した後、Excel VBAでも文字位置検索関数を使うと先頭文字位置が"0"か"1"かの違いで”はまる”ことがある。先頭文字位置を"0"とするか”1”とするかは、見つからなかった時の戻り値と関係するようであるが、各言語での違いをリストアップしてみた。ほとんどの言語が先頭文字位置を"0"から数えるようで、見つからなかった時"0"を返し、先頭文字を"1"とするVBAが特殊のようでした。
各言語の一覧
各言語の一覧
言語 | 関数/メッソッド | 先頭位置 | 見つからなかった時 |
---|---|---|---|
PHP | strpos | 0 | FALSE |
Javascript | serach | 0 | -1 |
Perl | index | 0 | -1 |
Python | find | 0 | -1 |
Ruby | index | 0 | Nill |
C | strchr | 0 | Null |
C# | IndexOf | 0 | -1 |
Java | IndexOf | 0 | -1 |
VBA/VB | InStr | 1 | 0 |
awk | index | 1 | 0 |