かは・らぼ

Linux / データベース などの備忘録です

かはる。UNIX/Linuxを愛してます
底辺SEの頂点に立てるようあしたもいっしょうけんめいがんばりますっ!!
========== 経歴書 ==========
12.06〜 電力 : SFDCとかAccessとか
13.09〜 銀行 : Tivoliとかシェルスクリプトとか
15.04〜 小売 : TeradataとかA-autoとか
17.01〜 小売 : AWSとかCoreSaverとか
18.01〜 通信 : MySQLとかPHPとか

Excel VBAで改行を含むStringを1行ずつ読み込む

【Excel VBAで改行を含むStringを1行ずつ読み込む】

◆ 私の環境は以下のとおりです
  • Microsoft Excel 2010 (14.0.7183.5000) SP2 MSO (14.0.7184.5000)
  • Microsoft Visual Basic for Application 7.0

◆ やりたかったことは、フォルダ配下のファイルをループして、ハッシュ値の一覧を作ることです

    C:\Users\kahal>certutil -hashfile C:\Users\kahal\test\test.log MD5


    C:\Users\kahal>certutil -hashfile C:\Users\kahal\test\test.log MD5
    MD5 ハッシュ (ファイル C:\Users\kahal\test\test.log):

    6e1d82e9ca29d2c59e02fd70e8c91398 ☜☜☜ ここだけ抜き出したい

    CertUtil: -hashfile コマンドは正常に完了しました。
    C:\Users\kahal>

     


    CertUtil


    ◆  というわけで、サンプルソースです
    1. 宣言セクション
    Dim row As Integer

    2. チェックサムの関数
    '### チェックサム関数 
    Function checksum(target As String, row As Integer)
    Dim shell, result
    Set shell  = CreateObject(
    "WScript.Shell")
    Set result = shell.Exec(
    "%ComSpec% /c CertUtil -hashfile """ & target & """ MD5")
    'MD5チェックサムを取得

    Do While result.Status = 0 'execが終了するまで待ち
    DoEvents
    Loop


    md5 = Split(result.stdout.readall, vbCrLf)
    'CertUtilの結果を改行コードで分割
    Cells(row, 2).Value = target 'ファイル名をはっつけ
    Cells(row, 3).Value = Trim(md5(1)) 'MD5チェックサムをはっつけ

    Set shell  = Nothing
    Set result = Nothing
    End Function


    3. メインの関数
    '### メイン関数
    Function main(Optional folder As String = "dummy")

    '### 初期処理
    If folder = "dummy" Then
    Range(
    "B5:C65536").ClearContents '貼り付けエリアをクリア
    row = 5 '貼り付けエリアの先頭行
    folder = Cells(2, 3).Value 'フォルダ名を取得
    End If

    '### フォルダの存在チェック
    exist = dir(folder, vbDirectory) '存在しない場合は空白が戻る
    If exist = "" Or folder = "" Then
    MsgBox ("フォルダが存在しません")
    Exit Function '存在しなかったら終了
    End If

    '### メイン処理
    With CreateObject("Scripting.FileSystemObject")
    For Each file In .getfolder(folder).Files '直下のファイルをひとつずつ見つけて、
    Call checksum(folder & "\" & file.Name, row) 'チェックサム関数になげる
    row = row + 1 '貼り付け位置をひとつしたへ
    Next file

    '### 再帰的な処理
    For Each subfolder In .getfolder(folder).subfolders
    'サブフォルダをひとつずつ見つけて、
    main (subfolder) '再帰的に実行
    Next subfolder
    End With
    End Function



    ◆  結果です
    タイトルなし
    ちょっとチカチカするけど、いい感じです(`・ω・´)!!

    ソースです
    チェックサム取得のサンプル.zip

    参考にしたリンクです
    FileSystemObjectの解説(目次)
    第5回 WshShellオブジェクトの詳細(1) (3/4)

    MySQLを入れたときの日本語設定

    【MySQLを入れたときの日本語設定 】

    ◆ 私の環境は以下のとおりです
    • Amazon Linux AMI 2017.03.0 (HVM), SSD Volume Type (64bit)
    • MySQL 5.7 - mysql Ver 14.14 Distrib 5.7.18, for Linux (x86_64) using EditLine wrapper

    ◆ デフォルトでは言語設定がlatin1になっています

      mysql> show variables like 'chara%';


      mysql> show variables like 'chara%';
      +--------------------------+----------------------------+

      | Variable_name            | Value                      |

      +--------------------------+----------------------------+

      | character_set_client     | utf8                       |

      | character_set_connection | utf8                       |

      | character_set_database   | latin1                     |

      | character_set_filesystem | binary                     |

      | character_set_results    | utf8                       |

      | character_set_server     | latin1                     |

      | character_set_system     | utf8                       |

      | character_sets_dir       | /usr/share/mysql/charsets/ |

      +--------------------------+----------------------------+

      8 rows in set (0.00 sec)
       


      [Variable_name]

      character_set_database : デフォルトのデータベースにセットされる文字セット
      character_set_server : サーバのデフォルトの文字セット

      Variable name

      なので日本語をinsertしようとすると失敗します


      mysql> insert into testdb.testtbl values ('てすと');

      ERROR 1366 (HY000): Incorrect string value: '\xE3\x81\xA6\xE3\x81\x99...' for column 'test' at row 1

      mysql> 
       


       ☞ リファレンス


      ◆  手順です
      1. my.cnf を修正します
      sudo vi /etc/my.cnf


      # For advice on how to change settings please see

      # http://dev.mysql.com/doc/refman/5.7/en/server-configuration-defaults.html


      [mysqld]

      #

      # Remove leading # and set to the amount of RAM for the most important data

      # cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.

      # innodb_buffer_pool_size = 128M

      #

      # Remove leading # to turn on a very important data integrity option: logging

      # changes to the binary log between backups.

      # log_bin

      #

      # Remove leading # to set options mainly useful for reporting servers.

      # The server defaults are faster for transactions and fast SELECTs.

      # Adjust sizes as needed, experiment to find the optimal values.

      # join_buffer_size = 128M

      # sort_buffer_size = 2M

      # read_rnd_buffer_size = 2M

      datadir=/var/lib/mysql

      socket=/var/lib/mysql/mysql.sock


      # Disabling symbolic-links is recommended to prevent assorted security risks

      symbolic-links=0


      log-error=/var/log/mysqld.log

      pid-file=/var/run/mysqld/mysqld.pid


      character-set-server=utf8

       

      ⇒ character-set-serverを追記します

      2. MySQLを再起動します

      sudo service mysqld restart


      Stopping mysqld:                                           [
        OK  ]

      Starting mysqld:                                           [  OK  ]
       



      mysql> show variables like 'chara%';


      mysql> show variables like 'chara%';

      +--------------------------+----------------------------+

      | Variable_name            | Value                      |

      +--------------------------+----------------------------+

      | character_set_client     | utf8                       |

      | character_set_connection | utf8                       |

      | character_set_database   | utf8                       |

      | character_set_filesystem | binary                     |

      | character_set_results    | utf8                       |

      | character_set_server     | utf8                       |

      | character_set_system     | utf8                       |

      | character_sets_dir       | /usr/share/mysql/charsets/ |

      +--------------------------+----------------------------+

      8 rows in set (0.00 sec)

       

      ⇒ 文字コードがutf8に変更されています

      3. データベースを再作成します

      mysql> drop database testdb;


      mysql> drop database testdb;

      Query OK, 1 row affected (0.01 sec)


      mysql> 
       



      mysql> create database testdb;


      mysql> create database testdb;

      Query OK, 1 row affected (0.00 sec)


      mysql> 

       



      mysql> create table testdb.testtbl (test varchar(20));


      mysql> create table testdb.testtbl (test varchar(20));

      Query OK, 0 rows affected (0.01 sec)


      mysql> 
       



      こんどは無事に日本語もinsertできます


      mysql> insert into testdb.testtbl values ('てすと');

      Query OK, 1 row affected (0.00 sec)


      mysql> select * from testdb.testtbl;

      +-----------+

      | test      |

      +-----------+

      | てすと    |

      +-----------+

      1 row in set (0.00 sec)


      mysql> 

       


      =========================================================

      ここまではググればいっぱいでてきました。私がつまづいたのはDBの再作成で
      mysql> create database test2;


      mysql> create database test2;

      Query OK, 1 row affected (0.00 sec)


      mysql>
       



      もとのテーブルをコピーしようとすると
      mysql> create table test2db.testtbl2 select * from testdb.testtbl;


      mysql> create table test2db.testtbl2 select * from testdb.testtbl;

      Query OK, 0 rows affected (0.02 sec)

      Records: 0  Duplicates: 0  Warnings: 0


      mysql>
       



      日本語はinsertできないみたいです(´・ω・`)。ちゃんと1から作らなくちゃです


      mysql> insert into test2db.testtbl2 values ('てすと');

      ERROR 1366 (HY000): Incorrect string value: '\xE3\x81\xA6\xE3\x81\x99...' for column 'test' at row 1

      mysql> 
       



      参考にしたリンクです
      MySQLに日本語でINSERTできない場合

      DBQLからCPU使用率をみる

      【DBQLからCPU使用率をみる】

      ◆ 私の職場の環境は以下のとおりです
      • Teradata 13.10

      ◆ DBQLogTblのみかたです
      カラム 意訳 単位
      QueryID クエリごとに発番された内部的なID。system-wideで一意だからほかのテーブルとも(QueryIDだけをキーにして)結合できるよ、とのこと
      StartTime クエリがsubmitされたとき TimeStamp
      FirstStepTime クエリが最初にdispatchされたとき TimeStamp
      FirstRespTime最初のresponseが返されたとき TimeStamp
      AMPCPUTime AMPが使用したCPUの時間
      ParserCPUTimeparserとdispatcherが使用したCPUの時間
      QueryText SQLの最初の200文字 (全文はDBQLSQLTblに残ってる)

      [以下の2つの時間が計算できます]
      経過時間:ElapsedTime = FirstRespTime - StartTime
      実行時間:ExecuteTime = FirstRespTime - FirstStepTime (経過時間から待ち時間を除外)

      [こっちも計算できます]

      CPU使用時間:TotalCPUTime = AMPCPUTime + ParserCPUTime

      SQLにするとこんな感じです
      select ( FirstRespTime - StartTime       HOUR(4) TO SECOND(2) ) as ElapsedTime,  
                ( FirstRespTime - FirstStepTime HOUR(4) TO SECOND(2) ) as ExecuteTime, 
                ( AMPCPUTime + ParserCPUTime ) as TotalCPUTime
      from DBC.DBQLogTbl
      where ~


      ◆ ResUsageScpu
      のみかたです
      カラム 意訳 単位
      TheDate ログがentryされた日付
      TheTime ログがentryされた時刻
      NodeID nodeのID
      cpuidnodeごとのCPUのID
      NominalSecs ロギングする間隔
      CPUIdleidleの時間㌢秒
      CPUIoWaitidleおよびI/O待ち時間㌢秒
      CPUUServ userのservice codeをexecuteしている時間㌢秒
      CPUUExec userのexecution codeをexecuteしている時間 ㌢秒

      [以下の2つの時間が計算できます]
      退屈な時間:IdleTime = CPUIdle + CPUIoWait
      忙しい時間:BusyTime = CPUUServ + CPUUExec

      [つまりはこういうことのようです]

      CPU使用率:CPUUsage = ( CPUUServ + CPUUExec ) / ( CPUIdle + CPUIoWait + CPUUServ + CPUUExec ) * 100

      ※分母は理論的にはTotalCPUTimeになるはずですが、微妙に誤差はでるようです
       TotalCPUTimeは以下でも計算できます

      1秒あたりのTotalCPUTimeはつまるところCPU(コア?)の数なので、
      select count ( * ) as TotalCPUTimePerSec from
      ( select NodeID, cpuid  
        from DBC.ResUsageScpu
        group by NodeID, cpuid )

      それにNominalSecs(何秒ごとにロギングしてるか)と100(㌢秒換算)をかけてさしあげます
      理論的な分母:TotalCPUTime = TotalCPUTimePerSec * NominalSecs * 100


      [特定のクエリがどれだけのCPUを占有しているかを平準化した率は、]

      1秒間あたりのそのクエリのCPU時間をだして、
      ( DBQLogTbl.AMPCPUTime + 
      DBQLogTbl.ParserCPUTime ) / DBQLogTbl.ExecuteTime ・・・(A)

      1秒間あたりのTotalCPUTimeをだして(単位は秒のまま)、
      ResUsageScpu.TotalCPUTimePerSec・・・(B)

      (A) / (B) * 100 で割ることのすれば出せそうです


      参考にしたリンクです
      Main Log Table: DBQLogTbl
      Calculating the actual query run time
      ResUsageScpu Table - Summary Mode
      ギャラリー
      • Excel VBAで改行を含むStringを1行ずつ読み込む
      • Oracle 12c DBCA が起動しない
      • Oracle 12c DBCA が起動しない
      • Oracle 12c DBCA が起動しない
      • Oracle 12c DBCA が起動しない
      • Oracle 12c DBCA が起動しない
      • Oracle 12c DBCA が起動しない
      • Oracle 12c DBCA が起動しない
      • Oracle 12c DBCA が起動しない