Emotion Wave Tech Blog

福岡にあるエモーションウェーブ株式会社のエンジニアが書いています。

VB.netでプロセス間通信(IpcChannel)

最近、webネタが多いのでたまには、.netネタでも。

あまり使う事ないですが、プロセス間で情報のやり取りをしたい時があると思います。 手法は、HTTPやTCPやIPCがありますが、今回は、同一マシン上のプロセス間で行いたいと思いますので、 IPCチャンネルを利用してコーディングしたいと思います。

今回のソリューションの構成は、下記の通り。

ipclibプロジェクト
 ・IpcServerクラス
 ・IpcClientクラス
 ・IpcSharedObjectクラス

serverプロジェクト
 ・form1クラス(画面)

clientプロジェクト
 ・form1クラス(画面)

まずは、サーバー側

Imports System.Runtime.Remoting
Imports System.Runtime.Remoting.Channels
Imports System.Runtime.Remoting.Channels.Ipc

Public Class IpcServer

    Public Property SharedObject() As IpcSharedObject
    Private _channel As IpcServerChannel

    Public Sub New()

        ' チャンネルを登録
        Me._channel = New IpcServerChannel("ipcsrv")
        ChannelServices.RegisterChannel(Me._channel, True)

        ' リモートオブジェクトを生成して公開
        Me._SharedObject = New IpcSharedObject()
        RemotingServices.Marshal(Me._SharedObject, "ipccli", GetType(IpcSharedObject))

    End Sub
End Class

続いてクライアント側

Imports System.Runtime.Remoting
Imports System.Runtime.Remoting.Channels
Imports System.Runtime.Remoting.Channels.Ipc


Public Class IpcClient

    Public Property SharedObject As IpcSharedObject
    Private _channel As IpcClientChannel

    Public Sub New()
        ' クライアントチャンネルの生成
        Me._channel = New IpcClientChannel()

        ' チャンネルを登録
        ChannelServices.RegisterChannel(Me._channel, True)

        ' リモートオブジェクトを取得
        Me._SharedObject = TryCast(Activator.GetObject(GetType(IpcSharedObject),
                                                   String.Format("ipc://{0}/{1}", "ipcsrv", "ipccli")
                                                   ), IpcSharedObject)

    End Sub


End Class

そして、サーバーとクライント側共有するオブジェクト

''' <summary>
''' IPCプロトコル間で共有するクラス
''' </summary>
''' <remarks></remarks>
<Serializable()>
Public Class IpcSharedObject
    Inherits MarshalByRefObject

    ''' <summary>
    ''' ReceivedMessageイベントを発生される(メッセージ送信→メッセージ受信の流れ)
    ''' </summary>
    ''' <param name="message"></param>
    ''' <remarks></remarks>
    Public Sub SendMessage(ByVal message As String)
        'イベントを発生させる
        RaiseEvent ReceivedMessage(message)
    End Sub


    ''' <summary>
    ''' メッセージ受信をイベント
    ''' </summary>
    ''' <param name="messsage"></param>
    ''' <remarks></remarks>
    Public Event ReceivedMessage(ByVal messsage As String)



    ''' <summary>
    ''' インスタンスの有効期間を無制限にするにオーバーライドして戻り値を無効にする
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Overrides Function InitializeLifetimeService() As Object
        Return Nothing
    End Function

End Class

そして、各ipclibを画面側で呼び出します。 まず、サーバー側画面

Imports ipclib

Public Class server

    Public Sub ReceivedMessage(msg As String)

        Me.Label1.Text = msg
    End Sub

    Private Sub server_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        Dim srv = New IpcServer()
        '受信時のイベントを関連付け
        AddHandler srv.SharedObject.ReceivedMessage, AddressOf ReceivedMessage
    End Sub
End Class

最後にクライント側画面

Imports ipclib

Public Class client
    Private cli As IpcClient


    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    'サーバ側プロセスへメッセージを送信
        cli.SharedObject.SendMessage(Me.TextBox1.Text)
    End Sub

    Private Sub client_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        cli = New IpcClient()
    End Sub
End Class

そして実行するとこんな感じでプロセス間でデータのやり取りができます。

f:id:devew:20190322101141p:plain

2014年のゴールデンウィークに読むと捗りそうな本(主にチーム開発系)

もうすぐゴールデンウィークですね。 皆さん予定はお決まりでしょうか? もしまだ決まってないのであれば読書GWにしてみては如何でしょうか。

ということで、僭越ながら2014年GWに読むと2014年GW終わってから捗るかもしれない本を紹介致します。

アジャイルラクティス 達人プログラマに学ぶ現場開発者の習慣」

アジャイルプラクティス 達人プログラマに学ぶ現場開発者の習慣

アジャイルプラクティス 達人プログラマに学ぶ現場開発者の習慣

まずはこれ。 私が強烈に影響を受けた本。こっから色々と変わりました。 まさにGWに読んだ気がします。

アジャイルサムライ-達人開発者への道」

アジャイルサムライ−達人開発者への道−

アジャイルサムライ−達人開発者への道−

でも、今のアジャイルの本と言えばこれかもしれません。 各地で読書会等のコミュニティも盛んなようです。福岡にもあります。(休眠中)

ファシリテーション入門」

アジャイル本を読んでからチーム開発のドライブに興味が沸き沸きし、ちゃんと勉強しなきゃと思いこういう本も読みました。 とても勉強になります。

「WHYから始めよ!―インスパイア型リーダーはここが違う」

WHYから始めよ!  インスパイア型リーダーはここが違う

WHYから始めよ! インスパイア型リーダーはここが違う

この本にもかなり影響を受けました。 しっかりとしたWHYがあると人は強くなれます!

「小さなチーム、大きな仕事〔完全版〕: 37シグナルズ成功の法則」

小さなチーム、大きな仕事〔完全版〕: 37シグナルズ成功の法則

小さなチーム、大きな仕事〔完全版〕: 37シグナルズ成功の法則

  • 作者: ジェイソン・フリード,デイヴィッド・ハイネマイヤー・ハンソン,黒沢 健二,松永 肇一,美谷 広海,祐佳 ヤング
  • 出版社/メーカー: 早川書房
  • 発売日: 2012/01/11
  • メディア: 単行本
  • 購入: 21人 クリック: 325回
  • この商品を含むブログ (39件) を見る

数年前に読みましたが激アツです。 働き方について考えさせられます。

小さなチーム、大きな仕事―37シグナルズ成功の法則 (ハヤカワ新書juice)

小さなチーム、大きな仕事―37シグナルズ成功の法則 (ハヤカワ新書juice)

ちなみに僕が持ってるのはこっちです。 中古しかないですが、中古でも良いんじゃないでしょうか。

「強いチームはオフィスを捨てる: 37シグナルズが考える「働き方革命」」

強いチームはオフィスを捨てる: 37シグナルズが考える「働き方革命」

強いチームはオフィスを捨てる: 37シグナルズが考える「働き方革命」

今、朝の通勤時にちびちびと読んでいます。 昨今リモートワークが激アツなので将来的なことも考えてこの機会に読んでおこうと思っています。

「なぜ、あの部門は「残業なし」で「好成績」なのか? 6時に帰る チーム術」

刺激的なタイトルに惹かれて購入。 内容も素晴らしいです。

「Clean Coder プロフェッショナルプログラマへの道」

Clean Coder プロフェッショナルプログラマへの道

Clean Coder プロフェッショナルプログラマへの道

2年前ぐらいに新入社員が入ってきたタイミングで社内で読書会をした本です。 エンジニアとしてのあるべき姿がここにあります。

「リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)」

リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)

リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)

ソフトウェアは成長させないといけない。 その場しのぎで意味不明の命名をしてコードを書いていると後々の成長の弊害になる。 コードで意思を伝えれるようにと思うわけです。

「架空升野日記」

架空升野日記

架空升野日記

最後はこれ。おもしろいです。 休日の昼下がりなんかに読むとシフォンのような気持ちになれます。

何も考えずに挙げてみましたが結果的にチーム開発系が多くなりました。特に最後のやつ。

ということで、ゴールデンウィークをエンジョイしましょう!

JavaScriptフレームワークでデータバインディングを試してみる(Knockout.js編)

f:id:devew:20190322102054j:plain

photo credit: Severin Sadjina via photopin cc

こんにちは。 去年から引き続き今年も花見が出来なかったのでがっかりしている中原です。

花見の話は置いといて、今回もJavaScriptでのデータバインディングについてです。 使用するのはKnockout.js。公式サイトは以下です。

Knockout : Home

以前のRactive.jsで作成したサンプルと同じものをKnockout.jsで実装してみました。 Ractive.jsの記事は以下です。

JavaScriptフレームワークでデータバインディングを試してみる(Ractive.js編) | tech.ewdev.info

結果的にはこういう画面を作りました。 (下の画面は実際に動作します)

「add tweet」ボタンを押すと入力した内容が下に一覧で表示されます。 また、Filterのテキストボックスで一覧のフィルタリングもできるようになっています。

HTMLはこんな感じで、KnockoutのModelとバインドする場合は「data-bind」属性を記述します。

JavaScript側はこんな感じ。 バインドするプロパティとメソッドを記述したModelを作成し、最後にko.applyBindings! これでHTMLとバインドされます。

言うまでもなくView(Html)とModel(JavaScript)がバインドしているので、双方向で値が連動されます。 個人的にですがデータバインディングは軽快な気持ちで実装が出来る気がしてます。

てことで、これからWebアプリを作成する際にはKnockout.jsも検討してみてはどうでしょうか。 ちなみに日本語ドキュメントもあるので、Ractive.jsよりは取っ付き易いと思います。

ドキュメントKnockout.js

WPFの画面でジェネリック・クラスを継承

WPFの画面でジェネリック・クラスを継承させることってできるのかな? と思い調べてみたらできました。

こんな感じです。

まず、継承させるジェネリック・クラスを作成します。

namespace WpfBaseWindow
{   public abstract class BaseWindow<T> : System.Windows.Window where T : BaseWindow<T>
    {
    }
}

そして、このBaseWindowを継承した画面を作成します。

C#のコード

    public partial class MyWindow: BaseWindow<MyWindow>
    {
        public MyWindow()
        {
            InitializeComponent();
        }
    }

xamlコード

<base:BaseWindow x:Class="Sample.MyWindow"
        x:TypeArguments="local:MyWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:Sample"
        xmlns:base="clr-namespace:WpfBaseWindow;assembly=WpfBaseWindow"
        Title="MyWindow" Height="1024" Width="1280" WindowStartupLocation="CenterScreen">
    <Grid>
        ・・・
    </Grid>
</base:BaseWindow>

xamlでは「x:TypeArguments」を使ってジェネリックの制約型引数をコンストラクターに渡すことができるみたいです。

Node.jsでWebアプリケーション

f:id:devew:20191224113700p:plain

最近よく耳にすることが多くなったWebアプリケーションと言えば、Node.jsですよね!! 今回はJavaScript Webアプリケーションの「Node.js」について紹介したいと思います。

1.Node.jsとは

そもそもJavaScriptはクライアントサイドでは?と思っているかもしれませんが、 今やJavaScriptはサーバサイドでも動作します。それを可能にするのがNode.jsです。

Node.jsとは、JavaScriptがサーバ上でプログラムを実行できるように、ファイルやネットワークI/Oなど多くの機能を備えたもので、軽量なネットワークアプリケーションを構築できるプラットフォームです。

2.注目されている理由は?

近年のスマートフォンタブレットの急速な普及により、JavaScriptの需要が増えたことが注目されている一つの理由です。 また、HTML5/CSS3の出現で、Web系には必須のスキルとなっているのがjavascriptなのです。

3.何がいいの?

・環境構築が手軽 WindowsMacUNIX系のどのOSでもインストールするだけで環境構築ができる。 →もちろんPATHは設定しないといけないけど。。

・サーバーサイドとクライアントサイドを一つの言語で開発できる 今までのWeb開発はたくさんの言語を組み合わせて実現していたが、Nodeを使えばサーバーからクライアントまですべてJavaScriptだけでよい。

・リアルタイムWebが可能 タイムラグなし(リロードせず)に情報を更新できる。Facebookなどによく使われている手法。

・ノンブロッキングI/Oを採用 例えば、データベースに問い合わせ→結果の受け取り→後処理をコールバックで行う。 このように基本的に重い入出力処理を非同期で実行することができる。

・イベントループ方式を採用 リクエストやコールバックの発生はイベントとして扱い、そのイベント処理が終わったら、次のイベントを処理するといったように 待ち合わせを行い順番に処理することでアクセスが集中したときにも対応できる

・ライブラリが豊富 WebSocket、HTML記述の効率化(jade)やjsの圧縮(uglifyjs)、テスト(karma)、デバッグ(weinre)などたくさんのライブラリがある。

・学習には最適 言語の基本的なことが理解でき、オブジェクト指向も身につく。

4.何ができるの?

これにより、今までなにかと面倒だったチャットなどが手軽に作れるようになります。 もはやjsだけでなんでもできてしまう時代。。

インストール方法は、簡単なので割愛。→ググってみて!! 次回は、実際にNodeを使って簡単なチャットを作ってみたいと思います。