読者です 読者をやめる 読者になる 読者になる

Blank?=False

「呉下の阿蒙にあらず」をモットーにしたITエンジニアの日々

VBAでRedisに接続 その2

f:id:stonebeach-dakar:20161204184825p:plain

以前、こんな記事を書きました。

stonebeach-dakar.hatenablog.com

今回はその続きをやっていきます!

前回の記事で書いたライブラリ作成について

そもそもクライアントサーバシステムのクライアントの実装自体の経験がなかったので、色々と調べてみました。
と言っても、低レイヤ層の実装なので、インターネットで余り情報が集められず、Rubyの各DB用アダプタのコードを読みながら勉強してみました。

基本的には、Webアプリケーションと同様、リクエストを送ってレスポンスが戻ってくる、というやり方のようです。


まだよくはわかっていないのですが、レスポンスを集めてフォーマット変換して初めて1つの情報として扱えるようになる、とか。
このあたりは要勉強かな〜。

VBAでソケット通信をするためのライブラリは標準ライブラリにはないようで、ソケット通信のためのAPIを使う必要があるようです。
APIを使う次点で「サクッと」ではないような気もするし、自分も作ったことがないのでちょっと今回ゼロからは無理かな、ということになりました。

そのうちRubyでこういうアダプタ・ドライバを作ってみたいですね。

今回のソケット通信などのコードはこの辺を読んで色々と勉強させていただきました。

github.com

github.com

github.com


VBAからRedisに接続する方法

Redisの公式HPにたくさんのクライアントが紹介されていますので、これらのクライアントを使ってVBAに接続できないか調べてみました。
dllファイルを作成できれば、VBAでそのdllを参照設定すれば接続できるんじゃないかと思ったんです。

で、色々なクライアントをみたりあーだこーだやってみた結果、殆どのクライアントはUnix系OS用で、Windowsだとビルドも通りません。
そりゃ公式でWindowsに対応してませんものね。

LinuxにインストールしているRedisにWindowsのクライアントからアクセスする用途はあまりないんでしょうか。

そんな中、使えそうだと思ったのがC#/.Netで作成されたStackExchange.Redisというクライアントです。
そう、名前から分かる通りStackOverFlowが開発しているものです。

C#/.NetならWindowsでも動くはず!

github.com


それ以外にも様々なプログラミン語言語で書かれたクライアントがありますので、ぜひRedisの公式を見てください。
こういうふうに公式にクライアント情報が載っているのはつかいやすくていいですね。

Redis f:id:stonebeach-dakar:20161214204754p:plain

StackExchange.Redisのコードをビルドしてdllファイルを作成

今回はWindows環境で作成します。
まずはgit cloneリポジトリをローカルに保存します。

> git clone https://github.com/StackExchange/StackExchange.Redis.git

クローン作成が無事完了したら、StackExchange.Redisフォルダを開いて、StackExchange.Redis.slnをVisualStudioで開きます。
もしVisualStudioをお持ちでなければ、個人であれば無料で使えるCommunityをインストールすればOKです。
f:id:stonebeach-dakar:20161214205915p:plain

特に設定しなくても幾つかNuget関係のエラーが発生したもの、後は警告(旧形式エラー)のみで問題なくビルドできました。
もし保存先とを変えたい場合は各自設定してください。

また、各.Netのバージョンに合わせて別々のプロジェクトとなっているので、必要な.Netバージョンのdllだけ欲しい場合はそのプロジェクトだけビルドすればOKです。

実際に利用してみる

とりあえず、適当にサンプルを作って正常に動くか確認します。
今回はStackExchange.RedisのドキュメントのBasic Usageを参考にサンプルコードを書いてみます。
StackExchange.Redis/Basics.md at master · StackExchange/StackExchange.Redis · GitHub

C#は余り書いたことがないのであんまり参考にしないでね

StackExchange.Redis Sample

どんなコードかというと、"mykey"というキーに"abcdefg"というデータを割り当てて、Redisに保存・読み込みしている処理です。


実行結果

f:id:stonebeach-dakar:20161214204323p:plain
パット見、ちゃんと動いてそうですね。ただ本当にRedisに保存されているのかわかりません。

Redis-cliを使ってを実際にデータが有るか確認

>redis-cli
127.0.0.1:6379> get mykey
"abcdefg"

よし、OK!

残念だな、そのままではVBAでは動かんよ

C#で動くことを確認できたので、じゃあVBAから使ってみようか!と思っても動きません。
C#で作成したdllはそのままではVBAでは使えないようです。

下のサイトを参考に、次回はVBAで読み込める形式のdllファイルを作成し、実際にVBAで読み込むところまでやってみたいと思います。
www.ka-net.org Excel から使うマネージDLL を作る。 | supermab's blog
COMコンポーネントってなんだっけ・・・最近VBA開発ばかりでWindowネイティブアプリ開発から遠さがっているので色々と忘れてしまってます。

まとめ

今回、ソケット通信などの低レイヤ層のコードを初めて読んだのですが、何をしているのかサッパリ。
Railsでもそうなんですが、普段高レイヤ層で開発していると、低レイヤ層で何をやっているのかがわからなくなります。
それだと、使える技術の幅が狭くなってしまうので、低レイヤ層で何をやっているのか、そういったものが理解できるようになれば もっと色々なものが作れるエンジニアとして成長出来ると思います。

さしあたってはソケット通信の基礎となるTCP/IPについて勉強してみたいところです。