ブログ (71)


複数の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のプロパティとかをテキトーにいじってください。

感想

楽しかった




都民へと昇格した

本日から3月まで東京都民へと昇格を果たしました。拠点地は東日本橋あたりです。理由は聞かないでください

契約したマンスリーマンションは机が狭い以外はまあなんかいい感じ(広いし)なので最高かよっておもってたらネット回線が来ていないことに入居した後に気づきました。

契約書を見返すと設備に「インターネット」の文字はどこにもなく、テレビよりもエアコンよりも大事なネットのない世界で2カ月生きていきます。

まあそんなことをしたら死んでしまうので明日あたりにWiMAXでも契約しに行こうかな…

3月までは東日本橋あたりをうろうろしてるのでかまってやってください




MicrosoftBotFramework v1とv3の罠

結論

  • 使用していたクラスはv1時代のものでv3では非推奨となっている(使えるけど)
  • v1時代はSkypeのグループ会話に対応していなかった
  • v1時代のクラスでBotを開発していたのでSkypeグループでのMentionに反応できなかった
  • v3のクラスに置き換えましょう

事の発端

12/18に横浜でMicrosoftBotFrameworkのハッカソンを開いたとき、参加者の方からこのような質問をいただきました。

BotFrameworkで作成したBotが、普通の1対1の会話には反応してくれるけどグループ会話に追加したときに反応してくれない

 

そもそもBotFrameworkはSkypeのグループチャットを有効にしたとき、「@botname こんにちは」などのMentionを飛ばすことで反応ができるはずなのに実際に動きを見せてもらったら見事に反応してませんでした。

その後ソースコードをいただき、その原因を探ってみました。

ソースコードは以下となります。(掲載許可はいただきました)

 

原因調査

原因調査するにはデバッグするのが一番ということでローカルに実行環境を作成しデバッグしてみるとコンソールに以下のようなメッセージが表示されていました。

 

BotConnectorBot class is deprecated. Use UniversalBot with a ChatConnector class.
CommandDialog class is deprecated. Use IntentDialog class instead.

 

どうやらBotConnectorBotクラスと、CommandDialogクラスは現在のバージョンでは非推奨のようです。

それぞれ、UniversalBotとIntentDialogに置き換えましょうとのことでした。

ソースコードの場所を見ても、deprecatedフォルダ以下にあるので完全に非推奨クラスのようです。

 

BotFrameworkはv1から始まり、現在v3なのですが、v3で大きく仕様が変化しました。

また、v1のドキュメントを見ても、Skypeのグループ会話機能の説明がないことから、Skypeのグループ会話機能はv3からということが推測できます。

 

つまり、v3の環境で、v1のクラスを呼び出していたため、Skypeのグループ会話に対応していないv1では、グループ会話に応答できなかったということです。

 

対処方法

v3のコードに置き換えましょう。

実際に置き換えたサンプルを以下に示します。

 

これで正しく応答することができます。

1対1の場合

グループ会話の場合

Mention以外には反応しない

Mentionにだけ反応する

対策方法

BotFrameworkは最近出たということもあり、仕様がどんどん進化していきます。(v3でだいぶ安定してるとは思いますが)

このようなところに引っかからないためには以下のことに注意すると良いです。

デバッグメッセージを見る

Microsoftの製品はとくに、広報互換性を重視しているので古いコードでも難なく動いてしまいます。

そういう時は、必ずデバッグメッセージとして表示されますのでそれを注意深く読んでみるのがいいかと思います。

デバッグメッセージはたいてい英語ですが頑張れば読めます

公式ドキュメントを見る

公式ドキュメントは常に最新の情報が上がっているので仕様が安定していないようなプラットフォームであれば、公式を見るのがよいでしょう。

英語ですが頑張れば読めます。

Botの応答でprintfデバッグ

Bot系は特に、ローカル環境でのデバッグが難しいプラットフォームになります。printfのような出力環境も難しいので、Botの応答に変数の値を出力させちゃうのが良いでしょう。

node.jsの場合であればJSON.stringifyでJSON化して応答させるとみやすくて良いです。

 




時間のかかるpythonスクリプトをssh上でログアウトしても止めずに実行し続ける

Linuxでsshをし、ログアウトしても実行し続けるにはコマンドの前のnohupをつけます

これでout.logファイルに標準出力が入ります

しかしpythonでnohupを実行すると、出力がバッファにとどまってしまうので-uオプションをつける必要があります。

 




how to arrange height of grid system in bootstrap

boot strap grid system is very useful and nice.

but cells height can not arrange in default.

ex. following image does not arrange three images height.

one way to solve it, write display:flex in div wrapping some cells.

cells become arranging.

but above way are not corresponded to responsive design.

so you can write media query in css.