garicchi

LibreOfficeでセルの値が正規表現とマッチするか判定する

唐突にデータシートから正規表現で値をマッチさせたかったんですけどExcelを使った場合標準では用意されていなくて、VBScriptなどをかかなければならないらしいとおもって検索していたらLibreOfficeでは正規表現のマッチングができるそうです。

SEARCH関数は正規表現をサポートしていて、正規表現にマッチするならその位置、マッチしないなら数値ではないエラーを返します。

そこでISNUMBERでマッチされたかどうか判定するとこのような式になります。

 

バックグラウンドタスクでソケットをリッスンする – SocketActivityTrigger

SocketActivityTrigger

UWPのBackgroundTaskは、さまざまなトリガーによってプロセスの開始を可能にします。

その中でもSocketActivityTriggerというものを使うと、システムが受信したソケットに反応してUWPのバックグラウンドタスクを開始することができます。

2種類の方法

SocketActivityTriggerを利用したバックグラウンドソケット通信には2種類存在します。

  • フォアグランドでConnectしたソケットをバックグラウンドへ渡す
  • フォアグラウンドでリッスンしているリスナーをバックグラウンドへ渡す

前者の場合、かずきさんのブログ公式のサンプルに載っているのでそちらを参考にしてください。

 

今回のサンプルは後者の場合です。フォアグラウンドでソケットリッスンを開始し、バックグラウンドタスクへソケットリスナーを渡し、バックグラウンドでコネクションを確立します。

ソケットが閉じてもOSが再起動してもリッスンを再開します。

サンプル

サンプルはここに置いているので参考にしてください。

https://github.com/garicchi/uwp-background-socket

ポイント

SocketActivityTriggerにはポイントがいくつかあります。

まず普通にBackgroundTaskBuilderでタスクを生成しますが、TriggerにはSocketActivityTriggerを渡します。

その後、StreamSocketListenerでソケット待ち受けをしますが、バインドする前にEnableTransferOwnershipメソッドを呼んで、バックグラウンドにリスナーを渡す許可をしなければいけません。

ここでSocketActivityConnectedStandbyAction列挙体を入れる必要があります。公式サンプルではWakeになってますがDoNotWakeにしてください。(じゃないと動かない)

バインド完了したら以下の2文でソケットリスナーをバックグラウンドに渡します。

私のサンプルではバインド直後にいれていますが、OnSuspending時にやってもいいと思います。

バックグラウンドタスクではTriggerDetailのReasonプロパティを使用して、どのソケットイベントがきているかを判断します。

まず、ソケットリッスン状態でアクセプトできるソケットが来た場合、ConnectionAcceptedになります。

Acceptは自動で行われるのでここが呼び出された時点でアクセプトされています。

その後、StreamSocketListenerでアクセプトされたソケットを取得する必要がありますがイベントでしか取得できないので、イベントがちゃんと発火されるまで2秒ぐらいまちます。

コネクションを張れたら、このバックグラウンドタスクに再度受信したソケットの権限を渡します。

こうすることでアクセプトされたソケットに来る信号も、このタスクで取得できるようになります。

ソケットにデータが書き込まれたときはSocketActivityになります。

ここは普通にDataReaderでデータを1バイト読み取ります。

ソケットはsocketInformationのStreamSocketから取得します。

ソケットが閉じられたときは再度Listenをします。

ここが不思議なところなのですが、ソケットが閉じられたときだけじゃなく、OSが起動した時、SocketClosedが2回呼び出されます。

つまりSocketClosedが呼びされたタイミングでListenを開始すればOSが再起動してもListenを継続できます。

しかし2回呼び出されるのは厄介なので今リッスンしてるソケットの数で判断しています。

動作例

AndroidのアプリであるSimpleSocketTesterからソケットを送ってみています。

この手法は公式のサンプルにもないので少々難しいですね。質問は@garicchiにて受け付けています。

VSCodeでnodejsのデバッグをするときに「PATH上でランタイムnodeを見つけることができませんでした」と表示された場合

launch.jsonのruntimeExecutableキーの値にnodeへのパスを入れます。

これでデバッグが可能

 

http://stackoverflow.com/questions/31075763/vscode-0-3-cant-find-runtime-node-on-path

Azure Machine Learning チュートリアルを公開しました

先日CLR.H in TokyoでAzure Machine Learningについて登壇してきたわけですが、その時に作ったAzure Machine Learningのチュートリアルを公開します。

https://github.com/garicchi/azureml-tutorial

内容は気象庁の過去データを使って数時間後の気温を回帰分析で予測するという内容です。

インターネットのない環境でせこせこ作ってたのでスクリーンショット付きでわりとわかりやすいかと思います。

まあ機械学習系のチュートリアルは公式ドキュメントなどいろんなところに落ちてるわけですが、たいていデータセットが予め用意されているのでどういうデータがなぜ必要なのかとかがわからないパターンが多く

そんな中で気象庁のデータは非常にわかりやすい形で回帰分析を学ぶことができるデータセットだと思っています。

Azure Machine Learningに入門したい方はぜひお試しあれ

 

 

複数のPowerPointのファイルたちをInteropを使って1つのPDFに6スライド表示で出力する

とある用事があって、60個近くある.pptxをすべて1枚あたりに6スライドある表示(配布資料表示)ですべて1つのPDFにするということが必要になったわけですが、61個のpptxをすべて手作業でpdfにするのはプログラマーとしてあるまじき行為(三村親方談)なので自動化を試みました。

結果、OfficeInteropを使って自動化に成功しました。

やりかた

まずはMicrosoft Print to PDF仮想プリンタをデフォルトに設定します。

次に適当なC#のプロジェクトを作り、参照マネージャからCOM >[Microsoft Excel 16.0 Object Library]と

アセンブリ>拡張>[Microsoft.Office.Interop.Powerpoint]の2つを追加します。

あとは以下のコードを走らせるだけ

プログラムを走らせると、プログラム自体はすぐに終了しますが仮想プリンタのキューに大量に印刷命令を送信することで、徐々に大量のPDFが作成されるはずです。

あとは作成された1ページ6スライドのPDFをTHE PFF TOOLKITなど(https://www.pdflabs.com/tools/pdftk-the-pdf-toolkit/)を使って1つのpdfに結合すればOKです。

1ページ4スライドとかにしたい場合はOutpuTypeのプロパティとかをテキトーにいじってください。

感想

楽しかった