シングルクォート内で変数を展開する

T-SQLで、シングルクォート内で変数を展開するに上手いやり方が解らない・・・
例えば以下のようなクエリ。

[sql]
DECLARE @d nvarchar(50)
DECLARE @cmd nvarchar(100)

SET @d = N’C:\database\backup’
SET @cmd = N’dir ‘ + @d + ‘ /b’
exec master..xp_cmdshell @cmd
[/sql]

効率悪いと思うけど、1時間ほどググってこれで落ち着いたが正しいのかな?
個人的には、以下のように書きたい。書いたらスッキリすると思う。
[sql]
DECLARE @d nvarchar(50)
SET @d = N’C:\database\backup’
exec master..xp_cmdshell ‘dir @{d} /b’
— とか
exec master..xp_cmdshell ”’dir’ + @d + ‘ /b”’
[/sql]

WindowsOSのカスタムセットアップスクリプトを作る

以前windows用カスタムインストールメディアを作成するで、
OSインストール後に、アプリケーションをインストールをしたい場合の設定を調べたので記載。

動きとしては、

  • OSインストール時に、インストールメディアのPATH\sources\$OEM$\$$\setupが、%windir%\Setup\に展開される。
  • インストール後、%windir%\Setup\scripts/SetupComplete.cmdが実行される。
  • 注意点としては、

  • 再起動を伴うインストール、設定は最後に1つのみやる
  • この後にユーザープロファイルが作成される為、C:\Users\Administrator\Desktopにファイルを置くなどは行わない
  • ボタンを押すなどのGUI操作が必要な処理は行えない(サイレントインストールが出来れば行ける)
  • 会社のOSはWindowsServer2008R2なので、SetupComplete.cmdに以下の処理を追記。

    [code]
    # ログイン後のセットアップに使うスクリプト群をC:直下に配置
    xcopy %windir%\Setup\scripts\custum_setup C:\setup\ /Y 

    # ドットネットフレームワーク4.5をインストール
    %windir%\Setup\scripts\Packages\dotnetfx45_full_x86_x64.exe /q

    # Windowsアップデート関連の何かをインストール
    %windir%\Setup\scripts\Packages\Windows6.1-KB3138612-x64.msu /quiet /norestart

    # Powershell4.0をインストール(再起動あり)
    %windir%\Setup\scripts\Packages\Windows6.1-KB2819745-x64-MultiPkg.msu /quiet /forcerestart
    [/code]

    SQLServerに大量のテストデータを入れる

    SQL Serverのパーティション分割の検証で、大量に日付をを含むテストデータが欲しかったので、
    http://d.hatena.ne.jp/dotnetmemo/20111015/1318663995
    http://d.hatena.ne.jp/qaz76/20110512/1305251400
    を参考にしてみた。

    先輩方に感謝!

    testdata

    [code]
    # テーブル作成
    CREATE TABLE [dbo].[TestTable](
    [id] [int] NULL,
    [data] [varchar](50) NULL,
    [add_date] [datetime2](7) NULL
    )

    GO
    [/code]

    [code]
    — ランダムな日付返す
    CREATE VIEW
    V_RAND
    AS
    SELECT RAND() RND
    GO
    –UDF
    CREATE FUNCTION
    RANDNUM
    (
    @START AS INT,
    @END AS INT
    )
    RETURNS INT
    AS
    BEGIN
    RETURN (SELECT FLOOR(@START + (RND * (@END – @START + 1))) FROM V_RAND)
    END
    GO

    –UDF
    CREATE FUNCTION
    RANDDATE
    (
    @START AS DATETIME,
    @END AS DATETIME
    )
    RETURNS DATETIME
    AS
    BEGIN
    RETURN DATEADD(DAY, DBO.RANDNUM(0, DATEDIFF(DAY, @START, @END)), @START)
    END
    GO

    [/code]

    [code]
    — 100万件レコード作る
    — add_dateには、2015/01/01から2016/07/31までの日付をランダムでくっつける(重複あり)
    Declare @p_NumberOfRows Bigint
    Select @p_NumberOfRows=1000000;
    With Base As
    (
    Select 1 as n
    Union All
    Select n+1 From Base Where n < Ceiling(SQRT(@p_NumberOfRows))
    ),
    Expand As
    (
    Select 1 as C From Base as B1, Base as B2
    ),
    Nums As
    (
    Select Row_Number() OVER(ORDER BY C) As n From Expand
    )
    INSERT INTO TestTable
    Select n, ‘DATA’ + right(‘0000000000’ + convert(varchar, n), 10),dbo.RANDDATE(‘2015/01/01’, ‘2016/07/31’)
    from Nums Where n<=@p_NumberOfRows
    OPTION (MaxRecursion 0);
    [/code]

    Let’s EncryptでブログをHTTPS通信にしてみた

    参考:Let’s Encrypt 総合ポータル

    基本的には上のリンク通りだがメモしておく。
    Apache(RPM) + wordpressの構成

    [code]
    # 実行ファイルを置く場所 ※今回は/usr/bin

    cd /usr/bin

    # リポジトリ取得
    git clone https://github.com/certbot/certbot

    # インストール&設定 ※ 事前に80/tcpを落としておく
    cd certbot
    /usr/bin/certbot-auto certonly -a standalone -m メールアドレス -d www.jhhk-family.net –agree-tos –no-bootstrap

    # ssl.conf修正
    # 事前にssl.confを設定してたとして、Let’s Encryptに上書きされるので、もう一度修正。
    vim /etc/httpd/conf.d/ssl.conf
    <VirtualHost _default_:443>
    DocumentRoot "/var/www/wordpress"
    ErrorLog logs/ssl_error_log
    TransferLog logs/ssl_access_log
    LogLevel warn

    <Directory "/var/www/wordpress/">
    Options FollowSymLinks
    AllowOverride All
    Order allow,deny
    Allow from all
    </Directory>
    </vertualhost>

    # 最後にDocumentRoot直下の.htaccessに、rewriteの設定を追加し、HTTP接続をHTTPSにリダイレクトする

    <IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{HTTPS} off # 追加
    RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L] # 追加
    RewriteBase /
    RewriteRule ^index\.php$ – [L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /index.php [L]
    </IfModule>

    [/code]

    Let’s Encryptの有効期限が3ヶ月なので、crontagで毎月更新している人が多い。

    00 16 * * 2 root /usr/bin/certbot-auto renew –post-hook “service httod restart”

    grafanaを試してみた

    CloudwatchをGrafana+Graphiteで見るようにしたら幸せになった件を見たらカッコよかったので試してみた

    AWS上にt1.nanoインスタンス(Amazon Linux)を作成し、ここにgrafanaを入れてみる。

    Redhat系とはいえ、初めてAmazon Linuxも触ったのでOSの設定も少し入っています。

    まずはawscliをインストールする。

    pythonのバージョンを確認したら、2.7.10だったので、pipは最初から入っていたが、

    /usr/local/bin/pip にPATHが通って居なかったので、まずはPATHを通します。


    修正が終わったらsource /root/.bash_profileを忘れずに。

    次は、awscliのインストール。


    で、やっとgrafanaのインストール。

    grafanaはRPMで配っていたので、さくっと。


    grafanaを起動する前に、awsのAPIに繋ぐ為の認証情報を設定する。

    awscliの認証ファイルは、~/.aws/に保存されるがgrafanaの場合は/usr/share/grafana/.awsに同じファイルを複製してあげればいい。


    ここまでやって、grafanaを起動。
    初期ポートは3000
    アカウント:admin
    パスワード:admin
    grafana_login.jpg
    ログイン後、左上のアイコンをクリックし、DataSourceを選択。
    CloudWatchを選択し、接続情報を設定する。

    grafana_datasource.jpg

    グラフの表示、並べ替えなどはもう少し勉強してから書きます。
    grafana_grafh.jpg

    トレースフラグを付けてデッドロックを記録する

    SQL Serverにはトレースフラグを言うものを付けて、特定のエラーを記録する方法がある。
    デットロックを後追いするにはいいかもしれない。

    [code]
    — 現在のトレースフラグ確認
    DBCC TRACESTATUS (1204, 1222)
    GO

    — 結果
    TraceFlag Status Global Session
    1204 0 0 0 1222 0 0 0

    — トレースフラグ設定
    DBCC TRACEON (1204, 1222,-1)
    GO

    — 結果
    TraceFlag Status Global Session
    1204 1 1 0 1222 1 1 0

    — トレースフラグ設定を消す場合
    DBCC TRACEOFF (1204, 1222,-1)
    GO
    [/code]
    カッコ内の番号は、MSサイトを参照

    上記はオンラインで変更できるパラメータだが、起動時から有効にするには
    SQL Server Configuration Managerで、

    [code]
    -T1204 -T1222
    [/code]

    を追加する。

    SQLConfigurationManager.png

    #error “Unrecognized SSL Toolkit!”

    apacheのmod_sslを後から追加しようとしたら、こんなエラーに遭遇

    [code]
    # /usr/local/apache2/bin/apxs -i -a -c -I/usr/local/openssl/include/openssl mod_ssl.c
    /usr/local/apache-2.2.31/build/libtool –silent –mode=compile gcc -prefer-pic -DLINUX -D_REENTRANT -D_GNU_SOURCE -g -O2 -pthread -I/usr/local/apache-2.2.31/include -I/usr/local/apache-2.2.31/include -I/usr/local/apache-2.2.31/include -I/usr/local/openssl/include/openssl -c -o mod_ssl.lo mod_ssl.c && touch mod_ssl.slo
    ssl_private.h:60 から include されたファイル中,
    mod_ssl.c:27 から:
    ssl_toolkit_compat.h:267:2: error: #error "Unrecognized SSL Toolkit!"
    In file included from ssl_private.h:86,
    from mod_ssl.c:27:
    ~中略~
    ssl_private.h:644: error: declaration for parameter ‘ssl_init_Child’ but no such parameter
    mod_ssl.c:572: error: expected ‘{‘ at end of input
    apxs:Error: Command failed with rc=65536
    [/code]

    調べたら、そもそもopensslのソースインストールが失敗してた。
    改めて、opensslのインストールをしたけど、こっちもエラーでインストールできない。

    [code]
    make[2]: Entering directory `/usr/local/src/openssl-1.0.2g’
    [ -z "" ] || gcc -fPIC -DOPENSSL_PIC -DZLIB -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -Wa,–noexecstack -m64 -DL_ENDIAN -O3 -Wall -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DWHIRLPOOL_ASM -DGHASH_ASM -DECP_NISTZ256_ASM -Iinclude \
    -DFINGERPRINT_PREMAIN_DSO_LOAD -o fips_premain_dso \
    fips_premain.c fipscanister.o \
    libcrypto.a -ldl -lz
    make[3]: Entering directory `/usr/local/src/openssl-1.0.2g’
    make[4]: Entering directory `/usr/local/src/openssl-1.0.2g’
    /usr/bin/ld: libcrypto.a(rsaz_exp.o): relocation R_X86_64_32 against `.rodata’ can not be used when making a shared object; recompile with -fPIC
    libcrypto.a(rsaz_exp.o): could not read symbols: Bad value
    collect2: ld returned 1 exit status
    make[4]: *** [link_a.gnu] Error 1
    make[4]: Leaving directory `/usr/local/src/openssl-1.0.2g’
    make[3]: *** [do_linux-shared] Error 2
    make[3]: Leaving directory `/usr/local/src/openssl-1.0.2g’
    make[2]: *** [libcrypto.so.1.0.0] Error 2
    make[2]: Leaving directory `/usr/local/src/openssl-1.0.2g’
    make[1]: *** [shared] エラー 2
    make[1]: ディレクトリ `/usr/local/src/openssl-1.0.2g/crypto’ から出ます
    make: *** [build_crypto] エラー 1
    [/code]

    このエラーを解決するには、configオプションに、-fPICを付けてあげる
    [code]
    ./config -fPIC –prefix=/usr/local/openssl-1.0.2g shared zlib
    make
    make install
    [/code]

    で、もう一度「/usr/local/apache2/bin/apxs -i -a -c -I/usr/local/openssl/include/openssl mod_ssl.c」を実行したけど、まだ同じエラーが出る。
    ldconfigは実行済みなのに・・・

    再度ググって、こちらのページを見つけた。元RX-7乗りの適当な日々
    同じことやったら通った!
    [code]
    /usr/local/apache2/bin/apxs -c -i -a -D HAVE_OPENSSL=1 *.c -lcrypto -lssl
    [/code]

    mysqld.sockが作成出来ない

    mysqld.sockの場所をRPM標準の/var/lib/mysql/mysqld.sockから/tmp/mysqld.sockに変更したらmysqlが起動しなくなった件

    /var/log/mysqld.logを見ると、
    [code]
    2016-04-27 19:04:34 19904 [ERROR] Can’t start server : Bind on unix socket: Permission denied
    2016-04-27 19:04:34 19904 [ERROR] Do you already have another mysqld server running on socket: /tmp/mysql.sock ?
    2016-04-27 19:04:34 19904 [ERROR] Aborting
    [/code]が記録されていた。

    Permission denied?
    /tmpディレクトリのパーミッションも777なのに?

    su -c “touch /tmp/mysql” mysql
    でファイル作れるよ?

    調べた結果、/var/log/audit/audit.logに以下のログを発見。
    原因はselinuxだった。

    [code]
    type=AVC msg=audit(1461749417.909:7600470): avc: denied { module_request } for pid=22742 comm="mysqld" kmod="net-pf-10" scontext=unconfined_u:system_r:mysqld_t:s0 tcontext=system_u:system_r:kernel_t:s0 tclass=system
    type=SYSCALL msg=audit(1461749417.909:7600470): arch=c000003e syscall=41 success=no exit=-97 a0=a a1=1 a2=0 a3=7fff608ad190 items=0 ppid=22480 pid=22742 auid=528 uid=27 gid=27 euid=27 suid=27 fsuid=27 egid=27 sgid=27 fsgid=27 tty=pts15 ses=695500 comm="mysqld" exe="/usr/sbin/mysqld" subj=unconfined_u:system_r:mysqld_t:s0 key=(null)
    type=AVC msg=audit(1461749417.911:7600471): avc: denied { create } for pid=22742 comm="mysqld" name="mysql.sock" scontext=unconfined_u:system_r:mysqld_t:s0 tcontext=unconfined_u:object_r:tmp_t:s0 tclass=sock_file
    type=SYSCALL msg=audit(1461749417.911:7600471): arch=c000003e syscall=49 success=no exit=-13 a0=c a1=7fff608ad1e0 a2=6e a3=0 items=0 ppid=22480 pid=22742 auid=528 uid=27 gid=27 euid=27 suid=27 fsuid=27 egid=27 sgid=27 fsgid=27 tty=pts15 ses=695500 comm="mysqld" exe="/usr/sbin/mysqld" subj=unconfined_u:system_r:mysqld_t:s0 key=(null)
    type=AVC msg=audit(1461749433.190:7600472): avc: denied { module_request } for pid=24545 comm="mysqld" kmod="net-pf-10" scontext=unconfined_u:system_r:mysqld_t:s0 tcontext=system_u:system_r:kernel_t:s0 tclass=system
    [/code]

    setenforce 0を実行後、mysqldの起動が出来るようになった。

    /etc/sysconfig/selinuxをみると、SELINUX=disabled
    になっているので、誰かが手動で有効にしていたんだろう。

    windows用カスタムインストールメディアを作成する

    サーバーに新規にWindowsをインストールする時、Windows標準のドライバではデバイスを認識しない事がある。

    RAIDカードのドライバが合わなければインストールすら出来ないし、
    インストール出来たとしても、NICドライバが合わなければ、USBメモリ等にドライバを入れておいて後からインストールする等、めんどくさいです。

    Windowsのインストールメディアを元に、
    ・RAIDドライバの追加
    ・NICドライバの追加
    ・Windowsサービスの有効化(SNMPサービスなど)
    を行ったカスタムインストールメディアを作る事が出来たので、素人がハマった箇所をメモします。

    基本的な手順は、
    http://www.vwnet.jp/Windows/WS12R2/AddDriver/AddDriver2ISO.htm
    https://msdn.microsoft.com/ja-jp/library/hh825099.aspx
    などを見て下さい。

    作った環境は以下になります。
    クライアント: Windows 10
    メディア  : Windows Server 2008 R2
    サーバー  : DELL PowerEdge R720
    RAIDカード : PERC H710P Mini
    ネットワーク: Intel(R) 10G 2P X520 Adapter 、Intel(R) GbE 4P I350-t rNDC

    ハマった箇所(1)ドライバファイルの在り処
    DELLのドライバは、実行ファイル形式(exe)で提供されています。
    そのままでは追加が出来ないので、ドライバーファイルだけに抜き出します。

    http://www.dell.com/support/home/jp/ja/jpdhs1/Drivers/DriversDetails?driverId=XYPYC&fileId=3481042880&osCode=WS8R2&productCode=poweredge-r720&languageCode=jp&categoryId=SF


    http://www.dell.com/support/home/us/en/19/Drivers/DriversDetails?driverId=W205T
    からドライバファイルをダウンロードし解凍します。※Windows標準機能で解凍できました。

    << RAIDカード >>
    SAS-RAID_Driver_XYPYC_WN64_6.803.21.00_A07.EXEを解凍します。
    解凍後、SAS-RAID_Driver_XYPYC_WN64_6.803.21.00_A07\payload\にドライバーファイルがあります。

    << ネットワークカード >>
    SAS-RAID_Firmware_F9M2Y_WN64_21.3.2-0005_A07.EXEを解凍します。
    解凍されたフォルダを見ると、Winx64.pkgというファイルがあるので、これも解凍します。
    解凍後、Network_Driver_W205T_WN64_17.0.0_A00\Winx64\Winx64にドライバー群があります。
    今回のネットワークカードに必要なドライバーは、PRO1000とPROXGBの2つになります。

    ハマった箇所(2) boot.wim と install.wim
    各サイトを流し読みしていて気付くのが遅れてしまい、無駄に時間を使ってしまったので。
    細かいとこは分かりませんが、以下の認識で間違っていないと思う。
    boot.wim   ・・・ RAIDカードなどのWindowsのインストールに必須のドライバーを追加
    install.wim ・・・ ネットワークカードなど、後からでもいいドライバーの追加、Windows機能のデフォルト値変更、レジストリ変更もここ

    indexを適切に指定しないと間違った場所にドライバを追加してしまう事になる為、
    必ず
    Dism /Get-WimInfo /WimFile:”インストールメディアのPATH\sources\boot.wim”
    Dism /Get-WimInfo /WimFile:”インストールメディアのPATH\sources\install.wim”
    を実行して、indexを確認してください。

    レジストリ変更と、アプリケーション追加は試していないので、試したら追記します。

    続きを読む windows用カスタムインストールメディアを作成する

    ジョブを設定を一括で変更する

    とりあえず、沢山あるログシッピングのLSCopyとLSRestoreジョブの失敗時のアラートを飛ばしたい。
    DBメールの設定と、オペレーターの設定は先に済ませておく。

    [code]
    USE msdb
    GO
    declare @job_copy nvarchar(50)
    declare @job_restore nvarchar(50)
    DECLARE C1_LSCOPY CURSOR FOR
    SELECT name FROM dbo.sysjobs where name LIKE ‘LSCopy%’
    DECLARE C1_LSRESTORE CURSOR FOR
    SELECT name FROM dbo.sysjobs where name LIKE ‘LSRestore%’
    OPEN C1_LSCOPY
    FETCH NEXT FROM C1_LSCOPY INTO @job_copy
    WHILE (@@FETCH_STATUS = 0)
    BEGIN
    EXEC dbo.sp_update_job @job_name = @job_copy,
    @notify_level_email=2,
    @notify_email_operator_name=N’Admin’;
    FETCH NEXT FROM C1_LSCOPY INTO @job_copy
    END
    OPEN C1_LSRESTORE
    FETCH NEXT FROM C1_LSRESTORE INTO @job_restore
    WHILE (@@FETCH_STATUS = 0)
    BEGIN
    EXEC dbo.sp_update_job @job_name = @job_restore,
    @notify_level_email=2,
    @notify_email_operator_name=N’Admin’;
    FETCH NEXT FROM C1_LSRESTORE INTO @job_restore
    END
    CLOSE C1_LSCOPY
    CLOSE C1_LSRESTORE
    DEALLOCATE C1_LSCOPY
    DEALLOCATE C1_LSRESTORE
    GO
    [/code]