今日の自分を支える 技術→マネジメント

技術職→管理職になりました

WindowsのDockerでMySQLを動かしたい

手順が1つにまとまったサイトがなかったので記事にする。

前提

Dockerで書籍学習以外のコンテナを作るのは初めての超初心者が書いています。

ホスト環境

  • Windows11
  • Docker version 20.10.17, build 100c701

作りたいMySQL環境

  • mysql5.7

手順

  1. MySQLコンテナ用のフォルダを作成し、移動しておく
  2. my.cnfの作成。作成したファイルは読み取り専用にしておく。

     [mysql]
     default-character-set=utf8mb4
     [mysqld]
     character-set-server=utf8mb4
     collation-server=utf8mb4_bin
     [client]
     default-character-set=utf8mb4
    
  3. dockerfileの作成

     FROM mysql:5.7
    
     # my.cnfをコンテナにコピー
     COPY my.cnf /etc/mysql/conf.d/my.cnf
    
     # MySQLで日本語が使用できるようにするための設定
     RUN yum update -y && yum reinstall -y glibc-common
     ENV LC_ALL ja_JP.UTF-8
     ENV TZ Asia/Tokyo
     ENV LANG=ja_JP.UTF-8
    
     CMD ["mysqld"]
    
     EXPOSE 3306
    
  4. docker-compose.ymlを作成

     version: '3'
     services:
       mysql:
         build: ./
    
         image: mysql_tatsu
         ports:
           - "3306:3306"
         command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
         environment:
           - MYSQL_ROOT_PASSWORD=mysql
    
  5. dockerイメージの作成

     docker build -t mysql:tatsu .
    
  6. Docker起動

     docker run -v C:/mmd/docker/mysql:/etc/mysql/conf.d -it --name test-wolrd-mysql -e MYSQL_ROOT_PASSWORD=mysql -d mysql:tatsu --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    
  7. MySQL起動まで

     docker exec -it test-wolrd-mysql bash -p
     mysql -u root -pmysql -h 127.0.0.1
    

躓きポイント

MySQLで日本語が入力できない

  • my.cnfが必要。コンテナにコピーされているか確認する
  • 「RUN yum update -y && yum reinstall -y glibc-common」がないと「bash: warning: setlocale: LC_ALL: cannot change locale (ja_JP.UTF-8)」がでる
  • mysqlからの確認方法

      SHOW VARIABLES LIKE 'char%';
    

dockerfileなおしたけど「bash: warning: setlocale: LC_ALL: cannot change locale (ja_JP.UTF-8)」エラー消えない

  • イメージ作り直し忘れてない?

参考

https://qiita.com/TAMIYAN/items/ed9ec892d91e5af962c6

http://taustation.com/mysql-enable-multibyte-input-2/

https://gouf.hatenablog.com/entry/2018/02/18/155729

クラスタ構成でIISに役割と機能の追加をすると0x800f0922エラーが発生する

ネットを探しても全然見つからず困ったので、メモ書き。

問題

クラスタ構成されている2台のPCに、IISのセキュリティ機能を追加しようとしたところ「0x800f0922」エラーが発生した。

調査

以下のログを確認する
- C:\Windows にあるiis.log(iis8.logなど数字が入ってる場合もある)
- CBS.log

今回のログ

生ログは貼り付けられないので、参考URLのログから引用

[04/20/2011 15:42:23] [ ***** IIS 7.0 Component Based Setup ***** ]  [04/20/2011 15:42:23] "C:\Windows\System32\inetsrv\iissetup.exe" /install ODBCLoggingBinaries  [04/20/2011 15:42:23] Install of component ODBCLoggingBinaries succeeded!  [04/20/2011 15:42:23] Success!  [04/20/2011 15:42:23] [ End of IIS 7.0 Component Based Setup ]  [04/20/2011 15:42:23] [ ***** IIS 7.0 Component Based Setup ***** ]  [04/20/2011 15:42:23] "C:\Windows\System32\inetsrv\iissetup.exe" /install ODBCLogging  [04/20/2011 15:42:23] Install of component ODBCLogging succeeded!  [04/20/2011 15:42:23] Success!  [04/20/2011 15:42:23] [ End of IIS 7.0 Component Based Setup ]  [04/20/2011 15:42:23] [ ***** IIS 7.0 Component Based Setup ***** ]  [04/20/2011 15:42:23] "C:\Windows\System32\inetsrv\iissetup.exe" /launch C:\Windows\System32\inetsrv\appcmd.exe reset config -section:system.webServer/odbcLogging  

[04/20/2011 15:42:23] Launching command C:\Windows\System32\inetsrv\appcmd.exe, with params C:\Windows\System32\inetsrv\appcmd.exe reset config -section:system.webServer/odbcLogging  
[04/20/2011 15:42:24] < !!FAIL!! > LaunchCommand result=0x80070005

[04/20/2011 15:42:24] [ End of IIS 7.0 Component Based Setup ]  [04/20/2011 15:42:26] [ ***** IIS 7.0 Component Based Setup ***** ]  [04/20/2011 15:42:26] "C:\Windows\WinSxS\amd64_microsoft-windows-iis-sharedlibraries_31bf3856ad364e35_6.0.6002.18005_none_6ef387546a5193ce\iissetup.exe" /uninstall ODBCLogging  [04/20/2011 15:42:26] Uninstall of component ODBCLogging succeeded!  [04/20/2011 15:42:26] Success!  [04/20/2011 15:42:26] [ End of IIS 7.0 Component Based Setup ]  [04/20/2011 15:42:26] [ ***** IIS 7.0 Component Based Setup ***** ]  [04/20/2011 15:42:26] "C:\Windows\WinSxS\amd64_microsoft-windows-iis-sharedlibraries_31bf3856ad364e35_6.0.6002.18005_none_6ef387546a5193ce\iissetup.exe" /launch_uninstall C:\Windows\System32\inetsrv\appcmd.exe clear config -section:system.webServer/odbcLogging  [04/20/2011 15:42:26] Launching command C:\Windows\System32\inetsrv\appcmd.exe, with params C:\Windows\System32\inetsrv\appcmd.exe clear config -section:system.webServer/odbcLogging  [04/20/2011 15:42:27] < !!FAIL!! > LaunchCommand result=0x80070005  [04/20/2011 15:42:27] [ End of IIS 7.0 Component Based Setup ]  [04/20/2011 15:42:27] [ ***** IIS 7.0 Component Based Setup ***** ]  [04/20/2011 15:42:27] "C:\Windows\WinSxS\amd64_microsoft-windows-iis-sharedlibraries_31bf3856ad364e35_6.0.6002.18005_none_6ef387546a5193ce\iissetup.exe" /uninstall ODBCLoggingBinaries  [04/20/2011 15:42:27] Uninstall of component ODBCLoggingBinaries succeeded!  [04/20/2011 15:42:27] Success!  [04/20/2011 15:42:27] [ End of IIS 7.0 Component Based Setup ]  

appcmd.exeコマンド実行後に「< !!FAIL!! > LaunchCommand result=0x80070005」が出ている感じ

原因

参考URLにもある通り「共有構成」が邪魔していた。インストールの際に共有構成の設定ファイルを更新しようとするためらしい。
IISマネージャで共有構成の有効化を解除 してから役割と機能の追加を実施すると、正常にインストールできた。
IIS設定ファイルが更新されるので、再度共有構成をする際には共有構成のエクスポートからやりなおしたほうがよい

参考URL

このサイトがヒントになった。 Document Display | HPE Support Center

クラシックASPとVBScriptでWebAPI

あとで書き直す。とりあえず箇条書き

  • ASP.NETではない古いASPをクラシックASPというらしい。
    ASP WebAPIで検索するとASP.NETが出てきてしまうのでクラシックASPで検索しないと情報が探せない
  • フレームワークを使うのではなくWebAPIを擬似的に実装しているイメージ
  • 実装方法はQiitaに乗ってた↓でできた

qiita.com

  • Basic認証もやる予定(やった結果のメモもあとではる)

www.chima-chimao.com

  • エラーもJSONで返すのでエラーページを使う。まだできてないのであとで追記
  • エラーページの設定がうまく動かなくて戻せなくなった(エントリの種類がローカルになった)→web.config消したらもどせた

自分用Perlクイックリファレンス

自分用なので、他言語と共通するようなことはあまり記載されていない。

数値・文字列

  • 数値には「_」が使える(無視される)
  • 文字列の囲みは「"」「'」どちらも使えるが、「"」で変数を使うと展開される
  • 文字列結合は「.」
  • 型はあまり厳密ではなく、jsのように勝手にキャストされる

変数

変数の頭につける記号は取り出す値の型に該当するモノをつけるイメージ

  • $xxx
     スカラー変数。通常の変数
  • @yyy = ("xxx", "yyy")
     配列
  • $yyy[0]
     配列の値へのアクセス
  • $#yyy
     配列の最後の添え字。配列を作ると勝手に作られている
  • ($a,$b) = ("aa","bb")
     一括代入できる
  • %xx = ( "one", "iti", "two", "ni" );
     連想配列、"one"がキーで"iti"が値になる
  • $xx{"one"}
     連想配列から値の取り出し

  • レキシカル変数
     myで宣言される変数。いわゆるローカル変数。

  • デフォルト変数
     myでレキシカル変数を宣言しなかったり、などの時にデフォルトでここに入る

配列の操作

  • qw( a i u e o)
     文字列の半角空白を区切りとして配列を作成する。
     くくり文字は同じ文字、または<>などの囲い文字であれば何でもいいらしい。
  • $a = shift @array
     配列から最初の要素を取り出す(最初の要素は配列から失われる)
  • unshift @array, 5
     配列の最初に要素を追加する
  • $a = pop @array;
     末尾の要素を取り出す(末尾の要素は失われる)
  • push @array, 5;
     末尾に要素を追加する
  • @sorted = sort { $a 演算子 $b } @array;
     昇順で並べ替え。{~}の部分は省略できる
  • @sorted = sort { $b 演算子 $a } @array;
      降順で並べ替え
    • 演算子
      • <=> 数値として並び替え
      • cmp 辞書的な並び替え

リファレンス

C言語のポインタ的なこと。
配列のリファレンスは多次元配列を実現するのに使われる。

  • $xxx_ref = \$xxx
     スカラー変数のリファレンス。
     参照したい変数に「\」を付けるとリファレンスになる
  • $xxx_ref
     帰ってくるのはSCALAR(0x1832660)というような番地情報?
  • $$xxx_ref
     参照したいモノがなんなのかを頭に1つつければ値が取得できる。
     今回の場合中身がスカラ変数なので「$」を付ける
  • $$array_ref[1] または $array_ref->[0]
     配列リファレンスから値の取り出し
  • $ref = "foo"; print $$ref;
      これでもリファレンスが作れるが「use strict」プラグマを付けるとランタイムエラーになる  

制御文

条件式

  • true、falseに該当するものがない
  • 0、空白、"0"、未定義はfalseと同等になる
  • 文字列の比較の場合「eq 、ne、gt、 lt、ge、le」を使う。なお 0-9<A-Z<a-z

構文

  • unless(...) {}
     ifの逆で偽の時に処理される
  • if (){ } elsif () {} else {}
     「elsif」なので注意。
  • print("OK!") if ( 条件分 )
     if文の後置。後ろに書いてもOK

サブルーチン

  • sub aa { .. }
  • $[0] や @ で引数が扱える
  • $xx = shift をみたら@_が省略されていると思え

オブジェクト指向

  • Person->foo();
     クラスメソッドの呼び出し。
  • $p->bar();
     オブジェクトメソッドの呼び出し
  • my $class = shift;
  • my $self = shift;  classにはクラス名が入る。クラスメソッド、オブジェクトメソッドの1行目。
     オブジェクト指向のメソッド呼び出しでは第一引数にクラスやオブジェクトの参照が設定されるらしい。
     

その他

  • use strict;
     コードをより厳密にチェックするためのプラグマ。つけるべし。
  • use warnings;
  • $x =~ s/123/456/g
     文字列置換。=~は正規表現の時に使われるやつ

参考サイト

WindowsServerから別サーバへ接続できない

インフラは苦手…いつも困るので備忘のため記録する。
今回困ったのはメールサーバ。
ちなみにまだ解決していないので、確認内容が追加されれば適宜追記する。
結局ネットワーク経路上に25ポートを塞いでいるやつがいたみたい。

確認すべきこと

pingは通るか?
・tracerouteで経路を確認
→ 基本中の基本。問題があるならNW管理者に確認する

telnetでポートを指定した接続確認
 telnet 接続先 port
 ※telnetが使えない場合はコンパネ→プログラムの有効化で使えるようにする

・FW設定の確認
 自サーバのFWの確認
 経路途中にFWがあればNW管理者に設定を確認してもらう

document.activeElementの初期値がnull

時間がないのであまりまとめられないが、メモ書きとして

document.activeElementがなんかnullなんだけど? と思ったら bodyのstyleにvisibility:hiddenが設定されていて ブラウザが「表示されてるbodyタグないよね」と判断してnullを設定していた

visibilityをもとに戻すタイミングで 他にfocusが当たっていなければbodyタグにfocusを当てるとよい
さもないと、画面が選択状態にならずキー押下などが有効にならない

MySQLでJOINしたテーブルにPRIMARYのインデックスが使用されない

状況

何の変哲もない、主キー同士を結合条件にして取得するSQLでインデックスが効かない問題が発生した

SELECT * FROM A, B WHERE A.ID = B.ID

確認したこと

  1. EXPLAINをSELECTの前につけて実行計画の取得
     → possible_keysがNULLでPRIMARYが候補にも挙がらない
  2. 主キーが本当に設定されているか?
     → 設定されていた
  3. テーブル単体で主キーを条件に検索した場合はどうなるか?
     → PRIMARYのインデックスが利用された
  4. A.IDとB.IDの列の型は一致しているか?
     → 一致している ※型が不一致だとインデックス効かないらしい
  5. ヒント句FORCE INDEX(PRIMARY)を付けてみる
     → PRIMARYが利用されないまま
  6. インデックスの再作成  → ALTER TABLE で再構築を実施してみるも効果なし
     参考:MySQL :: MySQL 5.6 リファレンスマニュアル :: 2.11.4 テーブルまたはインデックスの再作成または修復
  7. 上記URLに記載のあった照合順序を確認
     → AとBで異なっている!!
     参考:【MySQL】照合順序とは? - Qiita

対策

  1. 照合順序を同一に設定する
  2. データ変換を実施

これで無事にPRIMARYが利用されるようになりました。
別の型扱いされてしまうんですかね?
検索してもヒットしなかったのでレアケースなんだろうな