2019年12月14日 (土)

Windowsでmatn/go-oci8を使おうとしてとても苦労している話

0. 唐突にOracle Databaseを使おうと思い立った

Oracle Databaseを使ったシステムなど、お仕事くらいでしか使うことはなかったんだけど、Oracle Cloud Free Tierとして使えるDBのPaaSがOracle Databaseだけ、というので、かなり仕方なく使う、というネガティブな話だったりする。

Javaや.NETには公式のデータベースドライバが出ているので、それらを使えば簡単にDBを利用できるけど、せっかくなので今回はGoでやってみることにした。

なお、結論から書くとこの話、実現できてないorz

1. 環境

ビルドには以下が必要。

  • C/C++コンパイラ
  • pkg-config
  • プラットフォームとバージョンに応じたOracle InstantClient

このほか、当然のことながらGitやGoが必要。

1-1. MSYS2

僕のWindows PC(Windows 10 pro version 1909)にはSphinxでPDFをビルドするため、MSYS由来のGNU Makeとshが入っていたので、GCCを入れるためpacmanを起動。
しかしながら、なぜか何もフィードバックを出さずpacmanが途中で終了してしまい、パッケージのインストールもアップデートもできずハマる。

おかしい、version 1809のころはふつうにpacmanが動いていたはずなのに。

これでは何もできないので、MSYS2はあきらめることに。

1-2. Cygwin

ならば、ということでMSYS2をアンインストールしてCygwin x64を入れてみた。

Baseパッケージグループのほか、makeやGCCをCygwin Installerで一とおりインストールし、C:\cygwin64\binなどをWindowsのPath環境変数に追加していった。

Cygwin shellではなくDOS窓からgo get github.com/mattn/go-oci8とやったところ、

  # runtime/cgo
  gcc_libinit_windows.c: 関数 ‘x_cgo_sys_thread_create’ 内:
  gcc_libinit_windows.c:57:12: エラー: implicit declaration of function ‘_beginthread’; did you mean ‘OpenThread’? [-Werror=implicit-function-declaration]
    thandle = _beginthread(func, 0, arg);
              ^~~~~~~~~~~~
              OpenThread
  cc1: all warnings being treated as errors
  go: failed to remove work dir: GetFileInformationByHandle C:\cygwin64\tmp\go-build601027150\NUL: Incorrect function.

と出てビルドできず。後でググると本体のGitHub WikiInstallFromSource

Go does not support the Cygwin toolchain.

などど書かれていた。なん....だと....?

1-3. WSL

最近のエディションにはWSL(Windows Subsystem for Linux)という、読んで字のごとくLinux互換環境を提供するサブシステムが標準搭載されている。デーモンを常駐させられない以外はほぼLinuxそのままなので、こいつで頑張ってみることに。

僕は普段UbuntuのWSLを使っているけど、GCCもpkg-configもapt installで導入できるのでお手軽だ。

ということでapt installでGCCやらpkg-configやらをインストールしてgo getしてみる。
結果、エラー表示は出ず。

いけた、のか? ということで付属のexampleで動作確認。

  $ cd $GOPATH/src/github.com/mattn/go-oci8/_example/nls
  $ GO_OCI8_CONNECT_STRING=system/Orcl19cAdmin@//localhost:1521/ORCLCDB go run main.go
  ORA-12571: TNS:packet writer failure

パケット到達不能、だと....? まぁ、Oracle Databaseは親環境のDockerで動かしているとはいえ、WSLからDockerを制御できているので、親環境とは通信できているはずだが。

てなわけで、この方法もダメということに。

1-4. TDM-GCC

Goの公式としてはTDM-GCCを推奨しているようなので、Cygwin GCCをアンインストールしてこちらに切り替えてみた。

パッケージマネージャは付属していないので、pkg-configを自力でセットアップしなければならない。やり方自体はStackOverflowの記事を参考にやってみた。

一応、直リンクを置いておく。

準備自体はGistを残してくれている方がいたので、それを使わせてもらうことに。

  > go get github.com/mattn/go-oci8
  # pkg-config --cflags  -- oci8
  pkg-config: exit status 3221225595

3221225595をWindowsの電卓に通すと0xC000007Bになるのだが、pkg-configが正常起動できていない、ということのようだ。どうやらABIが違うようなので、win64ではなくwin32に変えることで正常起動するようになった。

で、再挑戦。

  > go get github.com/mattn/go-oci8
  # github.com/mattn/go-oci8
  In file included from GOPATH\src\github.com\mattn\go-oci8\cHelpers.go:3:0:
  ./oci8.go.h:1:17: fatal error: oci.h: No such file or directory
  compilation terminated.

....pkg-configがインクルードパスを正常に処理できていないようだ。もちろん、oci.hの場所は-Iオプションの行で指定しているんだが。

おわりに

最後のTDM-GCCパターンではあと一歩なような気もする。

そんな気はするんだが、MySQLやPostgreSQLのドライバだったり、GoではなくJavaを選択していた場合だと、もっと簡単にデータアクセスを実装できていたであろう、と考えると、「なぜ僕はこんな苦行を....?」などと考えてしまう。

| | コメント (0)

2019年7月20日 (土)

続々:BSoDとの戦いに挑む

収束した....のか?

前回前々回のポストからいくつかやってみた結果の結論から言うと、Version 1903をインストールしたら収まった。ような気がする。

それまでにやったこと

ざっくり書くとこんな感じ。

  1. 余計な仮想スイッチの削除
  2. NICのドライバ更新
  3. Windows 10 Version 1903 (Windows 10 May 2019 Update) のインストール

1. 余計な仮想スイッチの削除

OSはPro版なのでHyper-Vが使えるんだけど、Version 1709から「既定のスイッチ(Default Switch)」と呼ばれる仮想スイッチが自動で作成されるようになった。

既定のスイッチについてはQiitaに解説記事が投稿されているのでそちらを参照いただくとして、過去Hyper-Vゲストにインターネットアクセスさせるために仮想スイッチを作っていたことがあり、そいつと機能的に噛んでいるのでは?ということで既定のスイッチだけ残して残りは削除することに。

ちなみにこれ、Hyper-Vの役割をセットアップしていないと削除できないので、Hyper-Vをセットアップして既定のスイッチ以外を削除して再起動。
これでしばらく様子をみることにしたが、一日置いてBSoD発症。

2. NICのドライバ更新

デバイスマネージャーでNIC(有線、無線とも)を見てみると、Windows Update経由でインストールされたものが使用されていた。

そういえば昔(10年以上前の話だが)、両面自動印刷機能とかが付いたHPのカラーインクジェットプリンタをWindows Updateのドライバで動かそうとしたら、片面印刷だけ、かつカラー不可という非常にイケてない状況になったことがあったので、IntelからNICのドライバをダウンロードしてセットアップ。
同様に様子を見ていたら、作業の3日後にBSoD発症。

3. Windows 10 Version 1903 のインストール

バージョン情報をみると、Version 1903公開から2か月以上たっていたにもかかわらずVersion 1803のままだった。たぶん、1903をダウンロードできるだけのまとまった稼働時間を確保していなかったのだろう。

ということで、更新アシスタントからVersion 1903を手動セットアップすることに。

結果、Intel製NICドライバは見事Windows Update版で上書きされてしまったが、実のところVersion 1903をセットアップして以降BSoDは発症していない。こっちの記事でDocker for Windowsを使っていても、である。

はっきりしないうちに収束した感があるので、モヤモヤするものが若干あるけれど。

| | コメント (0)

2019年6月23日 (日)

続:BSoDとの戦いに挑む

ネイティブモジュールのデバッグに挑む

先日のポストでToDoにしていた、デバッガのセットアップとかをやってみた。

いまどきのデバッガ

Debugging Tools for Windows というやつを使うんだが、こいつにはMicrosoft Store版があって、最新のWindows 10の場合そちらのほうがより近代的なんだそうな。

Windbg Preview in Microsoft Store

ストアアプリなので、導入自体はいたって簡単。ストアからアプリを入れたら、アクセスしやすくするためスタートメニューにピン止めしておく。

一方、ダンプサイズの拡張については、最近のWindowsはやらなくてもそれなりのサイズを確保してくれるらしい。設定自体は以前と同じシステムのプロパティの中の「起動と回復」の中にある。

Boot_and_recovery

デフォルト値が「自動メモリダンプ」になっていて、メモリを16GB搭載しているこのPCでは、だいたい1GB~1.5GB程度のダンプを確保してくれるようになっている。
昔のデフォルト値は「最小メモリダンプ(256KB)」だったので、ダンプから自力でどうにかしようと考えているような人にはいい時代になった、と言える(?)

実際にデバッガにかけてみる

実のところ、よく発生しているBSoD 2種が先日の記事を書いた後で運よく(?)発生したので、ダンプを確保して分析にかけてみることにした。
WinDbgを起動して、確保したダンプを読み込ませると、自動的に簡易分析が始まる。デバッグシンボルの取得は勝手にやってくれるようだ。

0xd1_simple_analysis

画面中の !analyze -v のリンクを押すと分析が始まる。
以下は DRIVER_IRQL_NOT_LESS_OR_EQUAL で BSoD になったやつを分析したときの出力だけど、長いので途中省略。 vmswitch というモジュールがトリガーになったようだ。

0: kd> !analyze -v
*******************************************************************************
*                                                                             *
*                        Bugcheck Analysis                                    *
*                                                                             *
*******************************************************************************

 

DRIVER_IRQL_NOT_LESS_OR_EQUAL (d1)
An attempt was made to access a pageable (or completely invalid) address at an
interrupt request level (IRQL) that is too high.  This is usually
caused by drivers using improper addresses.
If kernel debugger is available get stack backtrace.
Arguments:
Arg1: 0000000000000548, memory referenced
Arg2: 0000000000000002, IRQL
Arg3: 0000000000000000, value 0 = read operation, 1 = write operation
Arg4: fffff808c961972b, address which referenced memory

 

Debugging Details:
------------------
  :
(中略)
  :
FOLLOWUP_IP: 
vmswitch!VmsQueueGroupIsRestrictedQueue+7
fffff808`c961972b 8b9048050000    mov     edx,dword ptr [rax+548h]

 

FAULT_INSTR_CODE:  548908b
SYMBOL_STACK_INDEX:  3
SYMBOL_NAME:  vmswitch!VmsQueueGroupIsRestrictedQueue+7
FOLLOWUP_NAME:  MachineOwner
MODULE_NAME: vmswitch
IMAGE_NAME:  vmswitch.sys
DEBUG_FLR_IMAGE_TIMESTAMP:  62acf328
STACK_COMMAND:  .thread ; .cxr ; kb
BUCKET_ID_FUNC_OFFSET:  7
FAILURE_BUCKET_ID:  AV_vmswitch!VmsQueueGroupIsRestrictedQueue
BUCKET_ID:  AV_vmswitch!VmsQueueGroupIsRestrictedQueue
PRIMARY_PROBLEM_CLASS:  AV_vmswitch!VmsQueueGroupIsRestrictedQueue
  :

そして、もう一つ。 KERNEL_SECURITY_CHECK_FAILURE で BSoD になったやつを分析してみる。

Loading Dump File [C:\work\memdumps\0x139_vmswitch-sys_20190622-03.DMP]
Kernel Bitmap Dump File: Kernel address space is available, User address space may not be available.

 

 

************* Path validation summary **************
Response                         Time (ms)     Location
Deferred                                       srv*
Symbol search path is: srv*
Executable search path is: 
Windows 10 Kernel Version 17134 MP (4 procs) Free x64
Product: WinNt, suite: TerminalServer SingleUserTS
Built by: 17134.1.amd64fre.rs4_release.180410-1804
Machine Name:
Kernel base = 0xfffff803`254b0000 PsLoadedModuleList = 0xfffff803`2585d170
Debug session time: Sat Jun 22 22:09:48.984 2019 (UTC + 9:00)
System Uptime: 0 days 5:39:39.842
Loading Kernel Symbols
.........................................Page 20008bef5 too large to be in the dump file.
Page 2000aadf4 too large to be in the dump file.
......................
................................................................
................................................................
...............................
Loading User Symbols

 

Loading unloaded module list
..............
For analysis of this file, run !analyze -v
nt!KeBugCheckEx:
fffff803`2565aab0 48894c2408      mov     qword ptr [rsp+8],rcx ss:0018:ffffda05`86612940=0000000000000139
2: kd> !analyze -v
*******************************************************************************
*                                                                             *
*                        Bugcheck Analysis                                    *
*                                                                             *
*******************************************************************************

 

KERNEL_SECURITY_CHECK_FAILURE (139)
A kernel component has corrupted a critical data structure.  The corruption
could potentially allow a malicious user to gain control of this machine.
Arguments:
Arg1: 0000000000000003, A LIST_ENTRY has been corrupted (i.e. double remove).
Arg2: ffffda0586612c60, Address of the trap frame for the exception that caused the bugcheck
Arg3: ffffda0586612bb8, Address of the exception record for the exception that caused the bugcheck
Arg4: 0000000000000000, Reserved

 

Debugging Details:
------------------
  :
(中略)
  :
FOLLOWUP_IP: 
vmswitch!VmsQsUpdatePerProcessorPacketStats+2c3
fffff80b`e4a67be3 cd29            int     29h

 

FAULT_INSTR_CODE:  8d4829cd
SYMBOL_STACK_INDEX:  4
SYMBOL_NAME:  vmswitch!VmsQsUpdatePerProcessorPacketStats+2c3
FOLLOWUP_NAME:  MachineOwner
MODULE_NAME: vmswitch
IMAGE_NAME:  vmswitch.sys
DEBUG_FLR_IMAGE_TIMESTAMP:  62acf328
STACK_COMMAND:  .thread ; .cxr ; kb
BUCKET_ID_FUNC_OFFSET:  2c3
FAILURE_BUCKET_ID:  0x139_3_CORRUPT_LIST_ENTRY_vmswitch!VmsQsUpdatePerProcessorPacketStats
BUCKET_ID:  0x139_3_CORRUPT_LIST_ENTRY_vmswitch!VmsQsUpdatePerProcessorPacketStats
PRIMARY_PROBLEM_CLASS:  0x139_3_CORRUPT_LIST_ENTRY_vmswitch!VmsQsUpdatePerProcessorPacketStats

おや? こちらも vmswitch がトリガーになっているようだ。

問題になっているモジュールが特定できたので、次はワークアラウンドの検索かな....。

| | コメント (0)

2019年6月21日 (金)

BSoDとの戦いに挑む

ここ最近ひどい

僕が普段使いしている Panasonic CF-B11 というノート PC なんだけど、ここ最近不定期に BSoD を出してくる。
どうにかしなきゃね、ということで、調べてみることに。

イベントログを読む

Windows という OS はぎりぎりまできっちりイベントログを収集していて、それは BSoD による強制再起動も例外ではない。ということは割と知られていることなので、とりあえず直近の2か月ほどを抜いてみる。

BSoD イベントは、 System イベントログ内に BugCheck というソース名で記録されるので、 Windows PowerShell でとりあえずヘッドラインだけでも出してみる。

PS > Get-EventLog -LogName System -After "2019/05/01" | Where-Object {$_.Source -eq "BugCheck"}

   Index Time          EntryType   Source                 InstanceID Message                                                                            
   ----- ----          ---------   ------                 ---------- -------                                                                            
  157766 6 20 06:47    Error       BugCheck               1073742825 ソース 'BugCheck' のイベント ID '1073742825' の説明が見つかりません。必要なレジストリ情報またはメッセージを表示するメッセージ DL...
  156383 6 17 21:48    Error       BugCheck               1073742825 ソース 'BugCheck' のイベント ID '1073742825' の説明が見つかりません。必要なレジストリ情報またはメッセージを表示するメッセージ DL...
  151168 6 08 16:26    Error       BugCheck               1073742825 ソース 'BugCheck' のイベント ID '1073742825' の説明が見つかりません。必要なレジストリ情報またはメッセージを表示するメッセージ DL...
  148570 6 08 15:11    Error       BugCheck               1073742825 ソース 'BugCheck' のイベント ID '1073742825' の説明が見つかりません。必要なレジストリ情報またはメッセージを表示するメッセージ DL...
  146691 6 05 20:38    Error       BugCheck               1073742825 ソース 'BugCheck' のイベント ID '1073742825' の説明が見つかりません。必要なレジストリ情報またはメッセージを表示するメッセージ DL...
  145460 6 03 22:35    Error       BugCheck               1073742825 ソース 'BugCheck' のイベント ID '1073742825' の説明が見つかりません。必要なレジストリ情報またはメッセージを表示するメッセージ DL...
  144162 6 02 20:54    Error       BugCheck               1073742825 ソース 'BugCheck' のイベント ID '1073742825' の説明が見つかりません。必要なレジストリ情報またはメッセージを表示するメッセージ DL...
  137197 6 01 22:18    Error       BugCheck               1073742825 ソース 'BugCheck' のイベント ID '1073742825' の説明が見つかりません。必要なレジストリ情報またはメッセージを表示するメッセージ DL...
  136141 6 01 07:49    Error       BugCheck               1073742825 ソース 'BugCheck' のイベント ID '1073742825' の説明が見つかりません。必要なレジストリ情報またはメッセージを表示するメッセージ DL...
  133441 5 26 19:51    Error       BugCheck               1073742825 ソース 'BugCheck' のイベント ID '1073742825' の説明が見つかりません。必要なレジストリ情報またはメッセージを表示するメッセージ DL...
  133303 5 26 13:27    Error       BugCheck               1073742825 ソース 'BugCheck' のイベント ID '1073742825' の説明が見つかりません。必要なレジストリ情報またはメッセージを表示するメッセージ DL...
  132988 5 25 21:32    Error       BugCheck               1073742825 ソース 'BugCheck' のイベント ID '1073742825' の説明が見つかりません。必要なレジストリ情報またはメッセージを表示するメッセージ DL...
  132631 5 25 19:19    Error       BugCheck               1073742825 ソース 'BugCheck' のイベント ID '1073742825' の説明が見つかりません。必要なレジストリ情報またはメッセージを表示するメッセージ DL...
  131648 5 24 23:02    Error       BugCheck               1073742825 ソース 'BugCheck' のイベント ID '1073742825' の説明が見つかりません。必要なレジストリ情報またはメッセージを表示するメッセージ DL...
  130682 5 22 22:24    Error       BugCheck               1073742825 ソース 'BugCheck' のイベント ID '1073742825' の説明が見つかりません。必要なレジストリ情報またはメッセージを表示するメッセージ DL...
  129735 5 20 21:04    Error       BugCheck               1073742825 ソース 'BugCheck' のイベント ID '1073742825' の説明が見つかりません。必要なレジストリ情報またはメッセージを表示するメッセージ DL...
  129301 5 19 15:18    Error       BugCheck               1073742825 ソース 'BugCheck' のイベント ID '1073742825' の説明が見つかりません。必要なレジストリ情報またはメッセージを表示するメッセージ DL...
  128834 5 19 11:44    Error       BugCheck               1073742825 ソース 'BugCheck' のイベント ID '1073742825' の説明が見つかりません。必要なレジストリ情報またはメッセージを表示するメッセージ DL...
  128416 5 18 22:42    Error       BugCheck               1073742825 ソース 'BugCheck' のイベント ID '1073742825' の説明が見つかりません。必要なレジストリ情報またはメッセージを表示するメッセージ DL...
  126350 5 13 22:47    Error       BugCheck               1073742825 ソース 'BugCheck' のイベント ID '1073742825' の説明が見つかりません。必要なレジストリ情報またはメッセージを表示するメッセージ DL...
  125399 5 12 10:24    Error       BugCheck               1073742825 ソース 'BugCheck' のイベント ID '1073742825' の説明が見つかりません。必要なレジストリ情報またはメッセージを表示するメッセージ DL...
  125194 5 11 23:39    Error       BugCheck               1073742825 ソース 'BugCheck' のイベント ID '1073742825' の説明が見つかりません。必要なレジストリ情報またはメッセージを表示するメッセージ DL...
  123956 5 08 13:52    Error       BugCheck               1073742825 ソース 'BugCheck' のイベント ID '1073742825' の説明が見つかりません。必要なレジストリ情報またはメッセージを表示するメッセージ DL...
  121016 5 02 23:33    Error       BugCheck               1073742825 ソース 'BugCheck' のイベント ID '1073742825' の説明が見つかりません。必要なレジストリ情報またはメッセージを表示するメッセージ DL...
  120450 5 02 15:58    Error       BugCheck               1073742825 ソース 'BugCheck' のイベント ID '1073742825' の説明が見つかりません。必要なレジストリ情報またはメッセージを表示するメッセージ DL...
  119397 5 01 19:09    Error       BugCheck               1073742825 ソース 'BugCheck' のイベント ID '1073742825' の説明が見つかりません。必要なレジストリ情報またはメッセージを表示するメッセージ DL...

あー、このアウトプットではだめだ、ということで、 Format-List に通してみたところ、大半がこんな感じ。

Index              : 120450
EntryType          : Error
InstanceId         : 1073742825
Message            : ソース 'BugCheck' のイベント ID '1073742825' の説明が見つかりません。必要なレジストリ情報またはメッセージを表示するメッセージ DLL ファイルがローカル コンピューターに存在しない可能性があります。または、これらのデータへのアクセス
                     許可がユーザーに与えられていない可能性があります。次の情報はイベントの一部です:'0x00000139 (0x0000000000000003, 0xfffff801f3072950, 0xfffff801f30728a8, 0x0000000000000000
                     )', 'C:\WINDOWS\MEMORY.DMP', 'b537a1cf-30ea-4911-be63-13624e70de94'
Category           : (0)
CategoryNumber     : 0
ReplacementStrings : {0x00000139 (0x0000000000000003, 0xfffff801f3072950, 0xfffff801f30728a8, 0x0000000000000000), C:\WINDOWS\MEMORY.DMP, b537a1cf-30ea-
                     4911-be63-13624e70de94}
Source             : BugCheck
TimeGenerated      : 2019/05/02 15:58:00
TimeWritten        : 2019/05/02 15:58:00
UserName           : 

ReplacementStrings 行をみると、バグチェックコードが 0x139 だとわかった。先頭の16進数がそれだ。
MSDN の Bug Check Code Reference によれば、

カーネルが重要なデータ構造の破損を検知した
んだそうな。[出展]

加えて、先頭から2番目の16進数は「破損のタイプ」だそう。前述の MSDN の記事では、

A LIST_ENTRY was corrupted (for example, a double remove). For more information, see the following Cause section.

LIST_ENTRY というのは、リスト構造のデータを扱う構造体のことのようだ。

むぅ、構造体そのものではなくて、そいつを操作している処理を特定しないといけないようだ。ここから先の追跡は、デバッガ使ってダンプを眺めてみるしかなさそうだけど、デバッガって Visual Studio のどのコンポーネントに入ってるんだろう?

次の ToDo

  1. デバッガのセットアップ
  2. ダンプの取得サイズを1段階上げる設定に変える

くらいかな....?

| | コメント (0)

2019年4月21日 (日)

MySQL素人がWindows版で3rd partyユーティリティからの接続を使えるようにした話

終わってみればどうということはないけれど

 

正解に行きつくまで、正直なところ相当苦労した。いや、ぼくの MySQL 力がしょぼいせいだけど。

 

何が問題だったのか

 

かいつまんで書くとこんなところ。

 

  • 開発にも使っている自分の Windows PC に、 MySQL Community Edition 8.0 をインストール
  • 起動モードは Windows Service に設定 (Window なので)
  • 同時にインストールできる MySQL Workbench から接続に行くと普通に使える(まぁ、当たり前)
  • 普段は JetBrains DataGrip を使っているので、 DataGrip からローカルホストの MySQL に接続しようとすると「タイムゾーンがおかしい」といって接続できない

 

やったことの備忘録

 

大きくわけて二つ。

 

  1. タイムゾーン設定のインポート
  2. 起動時に参照されるタイムゾーン設定の作成

 

1. タイムゾーン設定のインポート

 

「そう言えば、タイムゾーンって my.cnf とかに書くやつじゃなかったっけ?」というわけで、そのあたりをググってみたところ、

 

Windowsの場合はOSにタイムゾーンの設定が無いため、タイムゾーンのファイルをダウンロードする必要があります。

 

などという記述を発見。
「ええ?そうなん?」と思いつつも、公式の MySQL :: Time zone description tables から、 MySQL 5.7以上むけの POSIX 標準 SQL ファイルをダウンロードして実行。

 

これでタイムゾーンの管理情報は作成できたので、起動してみるがダメ。

 

2. 起動時に参照されるタイムゾーン設定の作成

 

ここでどんなタイムゾーン設定が有効になっているのかを調べてみる。

 

mysql> show variables like '%time_zone%';
+------------------+--------+
| Variable_name | Value |
+------------------+--------+
| system_time_zone | |
| time_zone | SYSTEM |
+------------------+--------+
2 rows in set (0.01 sec)

 

これはどういうことなのか? と再度調べてみたところ、

 

 

変数名 説明
system_time_zone システムのタイムゾーンで、起動時に TZ 環境変数を参照して決定したあとは、変更されることはない
time_zone サーバのカレントタイムゾーンで、権限があれば後から変更できる。
初期値は SYSTEM で、 system_time_zone と同じであることを表す

 

....とのことのようだ。(出展 : http://download.nust.na/pub6/mysql/doc/refman/5.1/ja/time-zone-support.html)

 

なるほど、 my.cnf を編集しなくても環境変数定義で大丈夫なのか。ということで、オフセット値を設定してみることに。
管理者権限のあるDOS窓を起動して、以下を投入。 MySQL はサービス稼働なので、システム環境変数として登録した。

 

> setx /m TZ +09:00

 

この状態で MySQL を再起動して、再びタイムゾーン設定を見てみると、

 

mysql> show variables like '%time_zone%';
+------------------+--------+
| Variable_name | Value |
+------------------+--------+
| system_time_zone | +09 |
| time_zone | SYSTEM |
+------------------+--------+
2 rows in set (0.01 sec)

 

....ということで、無事タイムゾーンが日本に設定されたようだ。

 

この状態で、再び GataGrip から接続を試みると、無事接続できた。

| | コメント (0)

2018年7月20日 (金)

Sphinxの環境を整える

この記事の目標

  • Sphinxの編集環境を作る
  • こぎれいなPDFを出力できる環境をWindowsで作る

Sphinx is 何


SphinxはPythonで書かれたドキュメントビルダで、reStructuredTextというマークアップ言語で書かれたソースをこぎれいなHTMLなんかに変換してくれる優れもの。

Sphinxのインストール


詳しくは公式のSphinxのインストール参照。

以下、かいつまんで書く。

  1. Pythonをインストール、デフォルトでよいが、公式ではPython 3.xを推奨している模様
  2. PIPをインストール
  3. pip install -U Sphinxを実行


編集には、Visual Studio CodeとreStructuredText拡張を使っているが、UTF-8が扱えれば使い慣れたエディタで大丈夫。

こぎれいなPDFをWindowsで作る


実はここがこの記事のメイン。


とりあえず、自分で試したWindowsとLinux(Ubuntu)で必要だったパッケージについて、ざっくりまとめた。

ビルダ html epub latex latexpdf
Windows
要TeX Live

要TeX Live, GNU Make, sh
Linux
要TeX Live

要TeX Live


この表のとおり、SphinxでこぎれいなPDFを作るにはTeXの力を借りる必要があるんだが、これにはTeX Liveというパッケージを使うのが一番簡単だ。


インストーラはInstalling TeX Live over the Internetで取得できる。

Windowsの場合、ネットインストール型のインストーラを使うのがお手軽だが、時間はとてもかかる(2時間くらい?)ことを覚悟したほうがいい。

とはいえ、待っているだけで基本終了するので、特に難しいところはないはず。


また、Sphinxのlatexpdfビルダは、WindowsのDOS窓では処理ができない動きをするので、UNIX由来のツールであるGNU Makeとshを入れておく必要がある。

これにはMSYS2を使うことにした。


QiitaにMSYS2 による gcc 開発環境の構築という記事を投稿している方がいるので、そちらを参考にmakeだけを入れる。

入れたら、C:\msys64\usr\binをパスに追加しておくこと。


ここまでできれば、Sphinxのドキュメントプロジェクトのあるディレクトリでmake.exe latexpdfとやればこぎれいなPDFが出力できていることだろう。


なお、「Sphinxのlatexpdfビルダは、WindowsのDOS窓では処理ができない動きをする」件、一応Issueにも挙がっているようで、日本のメーリングリストでも話題になっているんだけど、なかなかfixしないよなぁ....。


| | コメント (0) | トラックバック (0)

2013年8月11日 (日)

工程管理ツールはどうするか?

いま、工程管理ツールをどうしようかと悩み中。

というのも、以前自宅PCにRedmineをセットアップしていたんだけど、諸般の事情でサーバ運用ができなくなってしまい、代替サービスを探しているわけで。

GitHubにはBTS機能はあるけど、ガントチャート作成とかがサポートされていないようなので、工程管理用途には向かないように思う。

なので、「ガントチャート作成マクロをもったExcelファイル」をSkyDriveに置いて共有しようかと思ったんだけど、ベクターにアップされていた奴らは、どれもコレジャナイ感が半端ない。
あとは、ローカルディスクにインストールして使え、というやつらしかない。

こんなのでは「複数マシン間でのタスクの共有」ができないわけで、工程管理情報の更新のたびに「工程管理ツールをインストールしたPCを引っ張り出さなくてはならなくなる。

こんなめんどくさすぎることなんてやってられないので、ほんとうはRedmineみたいなのを使いたいわけですよ、ええ。

まぁ、「工程管理サービス」でググるとそれらしいサービスがいくつかヒットするんだけど、これ、自分のニーズに合うかどうかを、ひとつひとつ評価していかなきゃならんよなぁ。むぅ....。

| | コメント (0) | トラックバック (0)

2013年7月 7日 (日)

Visual Studio 2012 Expressのキーボードショートカット

いま、翔泳社の10日でおぼえるC#入門教室をやっているんだけど、何度も出てくるのでいい加減覚えたほうがいいと感じたキーボードショートカットを、あれこれ列挙してみる。

ショートカットのバインド 説明
Ctrl+R、そのあとR 「名前の変更」リファクタリングの実行
Ctrl+R、そのあとM 「メソッドの抽出」リファクタリングの実行
Ctrl+E、そのあとD オートフォーマット設定に従い、ソース全体のフォーマットを自動整形する
Ctrl+K、そのあとS 「ブロックの挿入」メニューの呼び出し
Shift+F7 デザイナーの表示
Ctrl+Alt+0 コードの表示

Emacsみたく、「Ctrl+なにかのあと、別の何かを押す」的なキーバインドが多いので、Vim使いの僕には覚えるのに難儀しそうだけど、便利そうなのは覚えていきたいなぁ。

けどね、実は一番ほしいと思っている、「usingの並べ替え」がショートカットにないんだよね(汗)。
てなわけで、こんなショートカットを[ツール]→[オプション]の[環境]→[キーボード]に定義してみた。

ショートカットのバインド 説明
Ctrl+U、そのあとS 「usingの並べ替え」メニューの実行
Ctrl+U、そのあとD 「未使用usingの削除」メニューの実行

オリジナルのショートカットを定義したわけだけど、ほかのIDE製品とかぶったりしてないか、とかは気にしないことにしたw。

| | コメント (0) | トラックバック (0)

2013年6月30日 (日)

ラムダ式 on C#

今、C#の初学者向け書籍を片手にC#の勉強中なんだけど、突然だけど「ラムダ式ってすごいね~」と感心した、というお話。

for (var i=list.Count-1; i>=0; i--)
{
    if(list.get(i)==成立条件)
    {
        list.RemoveAt(i);
    }
}

が、

list.RemoveAll(element => element == 成立条件);

と書けちゃうんだからすごいもんです。

最初は何をやっているのかさっぱりわからなかったけど、なんというか、「ある日突然目覚める」というのはやっぱりあるみたいだ。

| | コメント (0) | トラックバック (0)

2013年1月 5日 (土)

Picture Importer再び

おとといに引き続き、C#を。

自宅に戻って別のマシンで1.0.0.0を動かしたら、入力フォルダがA:\になっているわけで、「そーだよなぁ、FDDもリムーバブルドライブだもんなぁ」と。

ということで、

  • 「リムーバブルドライブ」のうち、FDDに割り当てられるA:\とB:\は無視する
  • [マイピクチャ]選択中は、出力フォルダのブラウズができないようにボタンをロックする

というバグフィックス&エンハンスを行ったPicture Importer 1.1.0.0を作成しました。よろしかったら使ってみてください。

こちらも引き続きソースコードはGitHubに上げてありますので、こちらもよろしかったら見てやってください。

| | コメント (0) | トラックバック (0)