ドメイン変更

ORGからJPに変更。。。

IPアドレスが同じの場合、HTTPSでのドメイン転送はどうすればいいんだろう・・・。
う~む、勢いで変更しちゃったから、HTTPSでリンク貼られたところは軒並み、「プライバシーエラー」が出てしまう。

んー、ま、いいか。

xkeymacs + Windows10

そろそろプロパティダイアログの修正入っているのかなぁ・・・と思って久しぶりにxkeymacsのページを覗いたけど、現状で安定しているのかsnapshotが6年前で止まってた。まぁ、Windows10でもちゃんと動いているんだし(^^;
snapshotのリリースは止まっていたけど、ソース自体は更新されていたので、最新のソースをダウンロードしてVisual Studio 2015 Community でビルドした。
ビルドする前に設定ダイアログのサイズをちょっと伸ばしてプロパティシートが切れないのようにちょっとだけ伸ばす。これは↓と同じ(^^;

Windows8.1用にxkeymacsをビルド

スクリーンテキストのサイズは100%でしか使わないのでOK。
プロパティの部分だけ(GUIの部分だけ)C# .Net Frameworkとかで書けば多分解決するんでしょうけど、いかんせん、MFCのソースは僕には皆目読めません。。。読む気ありません。。。ただでさえC++忘れかけてるのに・・・。C++ TR1ぐらいがギリついてけるが、C++11規格とかもうサッパリ・・・。Cに至ってはもうC90ぐらいでも今となってはついていけるかも怪しい。。。

ってなわけで、どこからでもダウンロードできるように、リンク貼っておこう。
Rev.8799a18のものをVisual Studio 2015 Community Editionでビルドしたやつ

CentOS から Windows上のSQLServerへの道のり

副題: Road to SQLServer on Windows. (^^;

備忘録です。

今まで、CentOS6からSQLServerへのアクセスは、FreeTDS を使っていました。PHPからはPDO_DBLIB 経由。これは結構簡単にセットアップできました。yum で FreeTDSとか、もっと簡単に、php-sybaseなりphp-mssqlなり入れれば依存関係で必要なライブラリは勝手にインストールされますしね。設定自体も、/etc/freetds.conf と /etc/locales.conf とかいじればあとは、PDOからアクセスできます。

で、非常に疎かったので知らなかったんですが、Microsoftから Linux向けのSQLServer ODBCドライバが供給されている、とのこと。

今更何言ってんの??? って感じですが、知らなかったものはしょうがない。説明通りにやってみます(^^;

# curl https://packages.microsoft.com/config/rhel/6/prod.repo > /etc/yum.repos.d/mssql-release.repo
exit root

$ sudo ACCEPT_EULA=Y yum install msodbcsql
$ sudo ACCEPT_EULA=Y yum install mssql-tools
$ sudo yum install unixODBC-devel
$ sudo ln -sfn /opt/mssql-tools/bin/sqlcmd /usr/bin/sqlcmd
$ sudo ln -sfn /opt/mssql-tools/bin/bcp /usr/bin/bcp

エラーもなく、インストール完了。
ここまでは説明書通り。

さて、ここから設定。

/etc/odbcinst.ini を開くと、以下のセクションが追加されているはず。

[ODBC Driver 13 for SQL Server]
Description=Microsoft ODBC Driver 13 for SQL Server
Driver=/opt/microsoft/msodbcsql/lib64/libmsodbcsql-13.1.so.6.0
UsageCount=1

そして、/etc/odbc.ini を編集します。僕の環境ではodbc.ini は空のファイルでした。
データソースを記述していきます。

[Development]
Driver = ODBC Driver 13 for SQL Server #odbcinst.ini に追加されたセクション名
Description = for development databse #適当
Trace = Yes #わからん。 
Server = 10.1.1.1 #稼働中のSQLServerのIPアドレスもしくはホスト名 ファイヤーウォールでアクセス許可を出すこと。
Port = 1433 #SQLServer Configuration Manager で TCP/IP を有効に。
Database = Sample  #データベース名

この状態で、まず、isql コマンドで接続してみます。書式は、isql [データソース名] [ユーザー名] [パスワード]ですね。

$ isql Development dbuser dbpass
+---------------------------------------+
| Connected!                            |
|                                       |
| sql-statement                         |
| help [tablename]                      |
| quit                                  |
|                                       |
+---------------------------------------+
SQL> select count(*) from hogehoge
+------------+
|            |
+------------+
| 5500       |
+------------+
SQLRowCount returns 0
1 rows fetched
SQL>

無事接続できました!

今度は、マイクロソフトが提供しているツールを使用してみましょう。

$ sqlcmd -S 10.1.1.1  -U dbuser
Password: xxxxxx
1> use Sample
2> go
データベース コンテキストが 'Sample' に変更されました。
1> select count(*) from hogehoge
2> go

-----------
       5500

(1 rows affected)
1>

接続できました。

次に、PHP で PDO_ODBC経由で接続してみます。
DSNには、odbc.ini で設定した、データソース名ではなく、ドライバ名・サーバー名・データベース名をそれぞれ直接指定してみました。

$ php -a
Interactive shell

php > $pdo = new PDO('odbc:Driver={ODBC Driver 13 for SQL Server};Server=10.1.1.1;Database=Sample','dbuser','dbpass');
php > $sth = $pdo->query('select count(*) from hogehoge');
php > echo $sth->fetchColumn();
5500
php >

接続できました。

日本語(UTF-8)が正常にCRUDできるか、まだテストしていませんが、とりあえずは、正常に接続できることを確認できたことでヨシとしましょう。

Console.ReadLine(bool intercept ) が欲しい!

と、思いませんか? うまいもんはうまい。by はや

コンソールなプログラムを C# で組んでいると、パスワードなど見せてはいけないものを入力するケースって意外にありますよね。そういうとき、Linuxとかだと、シェルスクリプトで stty でファイトー、一発!!ってなもんですが、かなしきかな、C#(というより、.Net Frameworkのクラスライブラリ)には、適当なものがありませぬ。

クラスライブラリの広大な海から、やっとこさ、System.Console.ReadKey(bool)というものを見つけました。が、やっぱりその辺は自作しないといけないようで・・・。Console.ReadKey(bool)ってのがあるんだから、Console.ReadLine(bool)くらい作っておいて欲しい・・・そこまで頼るな!って?

どうでもいいけど、拡張メソッドの静的バージョンって欲しいよう(^^;;; Consoleクラスに自作静的メソッドをバカバカ追加して自己満に浸りたい・・・。

愚痴はさておき・・・忘れないようにコード・メモです

  /// <summary>
  /// コンソール関連のヘルパー&ラッパー関数など。C#4.0必須
  /// </summary>
  public static class ConsoleEx
    {
      /// <summary>
      /// メッセージを出力してキー入力を待機します。
      /// </summary>
      public static ConsoleKeyInfo WriteLineAndReadKey(string msg = "\n何かキーを押してください。",bool echoback = false)
        {
           Console.WriteLine(msg);
           return Console.ReadKey(echoback);
        }
      public static string WriteAndReadLine(string mesg,bool intercept = false)
        {
          if(!string.IsNullOrEmpty(mesg))
              Console.Write(mesg);

          return ReadLine(intercept);
        }

      /// <summary>
      ///  エコーバック無しにキー入力を行う。(たぶん日本語はだめ)
      /// </summary>
      /// <returns>入力値</returns>
      public static string ReadLine(bool intercept,char mask = '*')
        {
          if(!intercept)
            return Console.ReadLine();

          var cs = new List<char>();
          bool isContinue = true;
          while(isContinue)
            {
              var ki = Console.ReadKey(true);
              switch(ki.Key)
                {
                  case ConsoleKey.Escape:
                    cs.Clear();
                    goto case ConsoleKey.Enter;
                  case ConsoleKey.Enter:
                    isContinue = false;
                    break;
                  case ConsoleKey.Backspace:
                    if(cs.Count > 0)
                      {
                        cs.RemoveAt(cs.Count - 1);
                        Console.Write("\b \b");
                      }
                    break;
                  default:
                    if(ki.KeyChar != '\0')
                      cs.Add(ki.KeyChar);
                    Console.Write(mask);
                    break;
                }
            }
          return new string(cs.ToArray());
        }
    }

追記:バグ修正 (2017/05/17)

やっぱりWSLでCentOSが使いたい(挫折編)

Bash On Windows、WSL(Windows Subsystem for Linux)で提供されているディストリビューションは ubuntu ですが、ubuntuの環境が動くんなら、他のディストリビューションも動くでしょ? というのが普通の感情(^^

ちょちょっとググってみると、やっぱりあります。
WSL Distribution Switcher ( https://github.com/RoliSoft/WSL-Distribution-Switcher )

Python3で書かれている一連のスクリプトツールのようですが、これを使うといろんなディストリビューションをインストールして切り替えて使えるようです! やったー!
ってなわけで、単純なオイラはすぐに Python の Windowsバイナリをインストールして、早速試してみました。

要するにこのツールは、LinuxディストリビューションのDockerイメージを取得・展開・切り替えの一連の手順をスクリプト化したもののようです。間違ってたらすみません。

で、結果的には、CentOSで運用できるところまではいかなかった・・・。いえ、一応CentOSをインストールできてbashは起動できたんですが・・・このエントリは、その時の備忘録です。

※ Pythonで書かれているので、Windows版のPython3バイナリをインストールしておく必要があります。cygwin環境のpythonだと dockerイメージの解凍に失敗してしまいました。この辺よく分かりません(m´・ω・`)m ゴメン…

上記サイトに行き、git 使っている方は、clone、使ってない方はzip書庫をダウンロードして適当なフォルダに展開してください。私は デスクトップに展開して作業しました。
ちなみに、Windows10のバージョンは Anniversary Update ( Windows10 v1607/Build14393 ) です。

まずは、README.mdに書かれている手順を行う前に、hook_postinstall_all.sample.sh というファイルをリネームして、hook_postinstall_all.sh にしときます。単に sample を消すだけです。
普通にインストールすると root のパスワードが設定されないので、困ることになるので、hook_postinstall_all.shを編集します。具体的には 下記の行をスクリプト上部のコメントが終わった直後ぐらいに追記しときます。

#rootのパスワード設定
ROOTPASSWD="0000" 

前準備完了。

1、get-source.py で Docker Hub 内の オフィシャルイメージを取得します。

僕の目的は CentOSの最新版なので、単に centos と指定。 たぶん動かないと思うけど CentOS6系なら ‘centos:6’ というような感じで指定するみたいです。指定の仕方は docker のまんまですね・・・。詳しくは上記サイトのREADME.md 参照。

C:\Users\xxx\Desktop\WSL>> python get-source.py centos

これで tarボールがダウンロードできました。

2、install.py で tarボールの解凍および切り替え

ダウンロードしたtarボールを指定するか、イメージ名を引数にして install.py を実行。

C:\Users\xxx\Desktop\WSL>> python install.py centos

これで、%localappdata%\lxss ディレクトリにある既存のubuntuが入った rootfs がリネームされ、新しい rootfs に先ほどのイメージが格納されます。
その後、hook_postinstall_all.sh が実行されます。

これで一応インストール完了。試しに bash を立ち上げて、/etc/redhat-release を見ると

$ cat /etc/redhat-release
CentOS Linux release 7.3.1611 (Core)

3、switch.py で切り替える

元の ubuntu に戻すときは、

C:\Users\xxx\Desktop\WSL>> python install.py ubuntu:trusty

引数なしで実行すると、インストールされているディストリビューションの一覧が表示されます。

C:\Users\xxx\Desktop\WSL>> python install.py
usage: ./switch.py image[:tag]

The following distributions are currently installed:

  - centos:latest*
  - ubuntu:trusty

To switch back to the default distribution, specify ubuntu:trusty as the argument.

4、sudo とかその他諸々がエラーで使えない!!!

さて、実はこれからです(笑)
CentOSがインストールされてやったー!と思って、以下のコマンドを叩くと・・・

$ sudo vi /etc/hosts
sudo: unable to create sockets: Socket type not supported

どうやら sudo コマンドが使えないみたい・・・。
README.mdには、その対策として、 alias sudo=”sudo -S” で回避するように、とのことですが、僕の環境だと同じエラーが出ます・・・。
仕方ないので、su でrootになって作業するしかありません・・・めんどくさーーーーーー!
他にも、localectl とか timedatectl とか なんちゃらctl が動かない。どーなっとんじゃー!?

ってな感じです。CentOS7自体まだ触ったことないんで・・・。ちなみに CentOS6はbash自体起動できず。まぁ、カーネルバージョンが違うので当たり前? これもよくわかんないです。

ってなわけで? おとなしく ubuntu に戻しました・・・。今後のWSLのアップデートに期待です・・・。次のWindows10のバージョンアップ( Creators Update でしたっけ?)でネットワーク関係のシステムコールがまともに使えるようになるんでしょうか・・・・???? 現状ネットワークドライブにアクセスできないので、まともに使えない・・・Apacheとかsambaとかフツーに使えるようにしてyo!!!

(m´・ω・`)m オネガイシマス。