【DBサーバ】MySQL導入

  • MySQLインストール

    yum -y install mysql-server mysql-devel
    
  • MySQL設定

    vi /etc/my.cnf
    
    # 下記内容を追加([mysqld]に)
    # クライアントの文字コードに依存しない
    skip-character-set-client-handshake
    # 文字コード
    character-set-server=utf8
    
    下記内容を追加
    [mysql]
    default-character-set=utf8
    
    /etc/rc.d/init.d/mysqld start
    chkconfig mysqld on
    chkconfig --list mysqld
    

    ランレベルが2~5でonを確認する。

  • rootユーザのパスワード設定とUTF-8の確認

    mysql -u root
    
    SET PASSWORD FOR root@localhost=password('データベースパスワード');
    

    character_set_filesystemとcharacter_sets_dir以外がUTF-8であることを確認する。

    show variables like 'char%';
    
  • 初期ユーザと初期データベースの削除

    mysql -u root -pデータベースパスワード
    

    ユーザ名が空のユーザを確認し、削除する。

    SELECT user,host FROM mysql.user;
    
    DELETE FROM mysql.user WHERE user='';
    

    データベースを確認しデータベースtestを削除する。

    SHOW DATABASES;
    
    DROP DATABASE test;
    exit
    

【WEBサーバ】Apache2SSL導入

  • 秘密鍵作成

    cd /etc/pki/tls/certs
    openssl genrsa -aes256 1024 > server.key
    
    Generating RSA private key, 1024 bit long modulus
    ......................++++++
    ............++++++
    e is 65537 (0x10001)
    Enter pass phrase:パスワード入力
    Verifying - Enter pass phrase:パスワード再入力
    
  • 公開鍵作成

    openssl req -new -key server.key > server.csr
    
    Enter pass phrase for server.key:パスワード入力
    You are about to be asked to enter information that will be incorporated
    into your certificate request.
    略
    Country Name (2 letter code) [XX]:JP
    State or Province Name (full name) []:Tokyo
    Locality Name (eg, city) [Default City]:Akihabara
    Organization Name (eg, company) [Default Company Ltd]:OreOreCA
    Organizational Unit Name (eg, section) []:z-aws
    Common Name (eg, your name or your server's hostname) []:z-aws.net
    Email Address []:空欄
    A challenge password []:空欄
    An optional company name []:空欄
    
  • 証明書作成

    openssl x509 -in server.csr -days 36500 -req -signkey server.key > server.crt
    
    Enter pass phrase for server.key:パスワード入力
    
  • 秘密鍵パスワード解除
    現状のままだとApache2の再起動のたびにパスワードを求められるので、
    秘密鍵のパスワードを解除しておきます。

    mv server.key server.key.org
    openssl rsa -in server.key.org > server.key
    
    Enter pass phrase for server.key.org:パスワード入力
    writing RSA key
    
  • Apache2のSSL導入

    yum install mod_ssl
    
  • Apache2のSSL設定

    cp -pi /etc/httpd/conf.d/ssl.conf /etc/httpd/conf.d/ssl.conf.org
    vi /etc/httpd/conf.d/ssl.conf
    
    下記内容に変更
    #DocumentRoot "/var/www/html"
    ↓
    DocumentRoot "/var/www/html"
    
    ErrorLog logs/ssl_error_log
    ↓
    ErrorLog /var/log/httpd/ssl_error_log
    
    TransferLog logs/ssl_access_log
    ↓
    #TransferLog logs/ssl_access_log
    
    CustomLog logs/ssl_request_log \
              "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
    ↓
    CustomLog /var/log/httpd/ssl_access_log \
              "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
    
    
    # POODLE SSLv3.0 脆弱性問題対処
    SSLProtocol all -SSLv2
    ↓
    SSLProtocol all -SSLv2 -SSLv3
    
    SSLCertificateFile /etc/pki/tls/certs/localhost.crt
    ↓
    SSLCertificateFile /etc/pki/tls/certs/server.crt
    
    SSLCertificateKeyFile /etc/pki/tls/private/localhost.key
    ↓
    SSLCertificateKeyFile /etc/pki/tls/certs/server.key
    
  • Apache2SSLの動作確認
    AWSコンソール画面から「セキュリティグループ」-「インバウンド」で
    以下を許可しておきます。

    プロトコル:TCP
    ポート:443
    
    echo '<h1>It works!</h1>' > /var/www/html/index.html
    /etc/rc.d/init.d/httpd restart
    

    https://xxx.xxx.xxx.xxx/

    証明書の確認が表示された後、「It works!」が表示されれば正常です。

    rm -f /var/www/html/index.html
    

【WEBサーバ】Apache2設定

  • Apache2のドキュメントルート設定
    基本的な設定は完了したので、次にドキュメントルートの設定を行います。

    vi /etc/httpd/conf/httpd.conf
    
    下記の設定となるように変更(変更部分または重要部分のみ記載)
    # ドキュメントルート
    DocumentRoot "/var/www/html"
    
    # 最上位の制御
    <Directory />
        Options FollowSymLinks
        AllowOverride None
    </Directory>
    
    # ドキュメントルートの制御
    <Directory "/var/www/html">
        Options -Indexes FollowSymLinks
        AllowOverride All
        Order allow,deny
        Allow from all
    </Directory>
    
    # アクセス制御ファイル名
    AccessFileName .htaccess
    
    # ファイル名を指定しない場合の検索優先順位(index.html)
    <Files ~ "^\.ht">
        Order allow,deny
        Deny from all
        Satisfy All
    </Files>
    
    # iconsルートの制御
    <Directory "/var/www/icons">
        Options -Indexes MultiViews FollowSymLinks
        AllowOverride None
        Order allow,deny
        Allow from all
    </Directory>
    
    # エラーログ出力先
    ErrorLog /var/log/httpd/error_log
    
  • welcome.confの無効化

    mv /etc/httpd/conf.d/welcome.conf /etc/httpd/conf.d/welcome.conf.org
    
  • Apache2の動作確認
    AWSコンソール画面から「セキュリティグループ」-「インバウンド」で
    以下を許可しておきます。

    プロトコル:TCP
    ポート:80
    
    echo '<h1>It works!</h1>' > /var/www/html/index.html
    /etc/rc.d/init.d/httpd start
    

    http://xxx.xxx.xxx.xxx/

    「It works!」が表示されれば正常です。

    rm -f /var/www/html/index.html
    
  • Apache2起動設定

    chkconfig httpd on
    chkconfig --list httpd
    

    ランレベルが2~5でonを確認する。

【WEBサーバ】Apache2導入

  • Apatch2インストール

    yum -y install httpd httpd-devel
    

    簡単な初期設定を行っておきます。

    cp -pi /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.org
    vi /etc/httpd/conf/httpd.conf
    
    下記内容を変更
    # サーバ情報表示内容
    ServerTokens OS
    ↓
    ServerTokens ProductOnly
    
    # サーバ署名表示内容
    ServerSignature On
    ↓
    ServerSignature Off
    

【Oracle】1ヵ月間の範囲に含まれるにデータの抽出

業務では適用開始年月日(VALID_START_YMD)と
適用終了年月日(VALID_END_YMD)を持つテーブルが多いですが、
そこから指定の1ヵ月間の範囲に含まれるデータを抽出します。

WHERE VALID_START_YMD <= '月末' AND VALID_END_YMD >= '月初'
適用開始年月日にあてるのが「月末」
適用終了年月日にあてるのが「月初」

逆にしてしまうと1ヶ月間のうち、月初~15日、16日~月末のような
2レコードがある場合、取得できなくなります。

【bat】フォルダの末尾に日付を追加してバックアップ

作業フォルダの末尾に日付を追加してバックアップします。
設計や開発時にファイルサーバーやSVNサーバが使えない場合、
日々のバックアップで利用しました。

@ECHO OFF
REM コピーします。
SET DIR_NAME=%date:~0,4%%date:~5,2%%date:~8,2%
SET DIR_FULL_NAME=D:\test_%DIR_NAME%

REM ディレクトリを作成する。実行結果をNULに流し、標準エラー出力および標準出力とする。
MKDIR %DIR_FULL_NAME% > NUL 2>&1
XCOPY /Y /D /E C:\Users\ユーザ名\Desktop\test %DIR_FULL_NAME%
REM /Y:同名のファイルが存在する場合、上書きの確認を行わない
REM /D:コピー先に同名のファイルが存在する場合に更新日が新しいファイルのみコピーする
REM /E:ファイルが存在しなくてもディレクトリごとコピーする
REM /EXCLUDE:file nameを使うとコピー除外もできる

【WordPress】WordPressテーマ変更

  • 外観-テーマ
    BirdTIPSを入れました。
  • 外観-テーマ編集
    index.php、single.php、archive.php、page.php、search.php、404.phpの編集で下記内容を削除する。

    <?php get_sidebar('right'); ?>
    
  • 外観-テーマ編集
    style.cssの編集で下記内容を変更する。
    変更前

    #main {
      width: 78.59%;
      float: left; }
    

    変更後

    #main {
      width: 100.00%;
      float: left; }
    
  • 外観-テーマ編集
    header.phpの編集で下記内容をコメントアウトする。
    スマホから見た場合、ソース表示内容が切れてしまうのを防ぎたいので、
    あえてPC表示と同じ見た目にするためにコメントアウトしています。

    <meta name="viewport" content="width=device-width" >
    
  • 設定-表示設定
    1ページに表示する最大投稿数を5から10に変更する。
  • 設定-SyntaxHighlighter
    テーマをEmacsからRDarkに変更する。

【AWS】iphoneからAWS接続

  • iphoneからAWS接続
    *pemを*pkkにPuTTYの鍵生成で変換。
    vsshアプリで鍵指定して接続可能。

  • iphoneからAWS起動
    AWSアプリで可能。
    IAMユーザーで作成したユーザーでログインする。

【JScript】ファイル一覧とディレクトリ一覧

サブディレクトリ内は再帰しません。

// パスを指定する。
var target = "D:/Book/";

// ファイル一覧とディレクトリ一覧を取得する。
enumFiles(target);

function enumFiles(target) {

    // ファイルを扱う準備を行う。
    var fso = new ActiveXObject("Scripting.FileSystemObject");

    // FileExistsの第1引数がファイルの場合
    if (fso.FileExists(target) == true) {
        WScript.Echo("ファイルです。");
    }

    // FileExistsの第1引数がファイル以外の場合
    if (fso.FileExists(target) == false) {
        WScript.Echo("ファイルではありません。");
    }

    // FolderExistsの第1引数がディレクトリの場合
    if (fso.FolderExists(target) == true) {
        WScript.Echo("ディレクトリです。");

        // ディレクトリ内の一覧を取得する。
        var all = fso.GetFolder(target);

        // ディレクトリ内の一覧からファイルを取得する。
        var eFile = new Enumerator(all.Files);
        for ( ; !eFile.atEnd(); eFile.moveNext()) {
            var file = eFile.item();
            WScript.Echo(file.Path);
        }

        // ディレクトリ内の一覧からサブディレクトリを取得する。
        var eDir = new Enumerator(all.SubFolders);
        for ( ; !eDir.atEnd(); eDir.moveNext()) {
            var dir = eDir.item();
            enumFiles(dir.Path);
        }
    }

    // FolderExistsの第1引数がディレクトリ以外の場合
    if (fso.FolderExists(target) == false) {
        WScript.Echo("ディレクトリではありません。");
    }
}

【JScript】ディレクトリ内の全てのファイルを開き特定文字を置換する

保守開発において改修前後で比較することが多いですが、
ファイル内に自動で更新日時が入るようなファイルが大量にある場合、
更新日時をある一定の文字に置換し、改修前後で比較可能にします。

対象の大量ファイルは「C:/replaceBefore」にあるとし、
置換後の大量ファイルを作成するために「C:/replaceAfter」を作成しておきます。

var fso = new ActiveXObject("Scripting.FileSystemObject");
var files = fso.GetFolder("C:/replaceBefore").Files;
var e = new Enumerator(files);
// ディレクトリ内の全てのファイル分繰り返す。
for ( ; !e.atEnd(); e.moveNext()) {
    var file = e.item();
    var fileFullPathBefore = "C:/replaceBefore/" + file.Name;
    var fileFullPathAfter  = "C:/replaceAfter/" + file.Name;
    WScript.Echo(fileFullPathBefore + "を処理します。");

    // 入力ファイルの設定
    // Typeの設定値
    // 1:バイナリを表す。
    // 2:既定値。charsetで指定した文字セットで文字列を表す。
    var sr = new ActiveXObject("ADODB.Stream");
    sr.Type = 2;
    sr.charset = "utf-8";
    sr.Open();
    sr.LoadFromFile(fileFullPathBefore);

    // 入力ファイルの読込み
    // ReadTextの第1引数
    // -1:既定値。EOSマーカーに達するまですべてのバイトをストリームから読み取る。
    // -2:改行までの行をストリームから読み取る。改行はLineSeparatorの設定値依存。
    var temp = sr.ReadText(-1);
//  WScript.Echo(temp);
    sr.Close();
    sr = null;

    // 出力ファイルの設定
    var sw = new ActiveXObject("ADODB.Stream");
    sw.Type = 2;
    sw.charset = "utf-8";
    sw.Open();

    // 置換文字列検索用
    // RegExpの第2引数に'g'を指定すると全置換になる。
    var reg = new RegExp("[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}[.][0-9]{7}");
//  var reg = new RegExp("[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}[.][0-9]{7}", 'g');

    // 出力ファイルの書込み
    // WriteTextの第2引数
    // ActiveXObjectのTypeが文字列(2)の場合に利用する。
    // 0:既定値。文字列を書き込む。
    // 1:文字列+改行を書き込む
    sw.WriteText(temp.replace(reg, ""), 0);

    // 書き込みの文字コードがUTF-8の場合、BOMが付与されるため、除去する。
    // 書き込んだオブジェクトのポジションをゼロに戻し、
    // バイナリモードを指定した上で、ポジションを3byte分ずらし、再書き込みする。
    // この処理順序は変更不可。
    if (sw.charset == "utf-8") {
        sw.Position = 0;
        sw.Type = 1;
        sw.Position = 3;
        var textBinary = sw.Read();
        sw.Close();
        sw.Type = 1;
        sw.Open();
        sw.Write(textBinary);
    }

    // 出力ファイルの保存
    // SaveToFileの第2引数
    // 1:既定値。ファイルがない場合、新規作成する。ファイルがある場合、上書きしない。
    // 2:ファイルがない場合、新規作成する。ファイルがある場合、上書きする。
    sw.SaveToFile(fileFullPathAfter, 2);
    sw.Close();
    sw = null;
}
fso = null;