SSブログ

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が特殊のようでした。
各言語の一覧
言語関数/メッソッド先頭位置見つからなかった時
PHPstrpos0FALSE
Javascriptserach0-1
Perlindex0-1
Pythonfind0-1
Rubyindex0Nill
Cstrchr0Null
C#IndexOf0-1
JavaIndexOf0-1
VBA/VBInStr10
awkindex10


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