komeの備忘録

C#と水泳ネタを書き綴ります。大学院生。

raspbianでRealVNCが繋がらなかったときの話

Raspbian(4.9.59)をラズパイにインストールした。


最近のRaspbianは最初からRealVNCが入っているらしく、画面共有しようと思ってVNCサーバをonにした時に繋がらなくてハマったところを書く。


なおVNCクライアントには、WindowsのUltra VNC Viewerを使用した。別になんでもいいと思う。
# 自動起動の有効化などは省きます

No Supported Authentication Methods.

まず普通にラズパイを起動した状態でIPアドレス:ポート番号で接続を試みたら、上記のエラーで接続できなかった。

色々調べたら、Optimize Screen Captureにチェック入れよう!と出てきたのでやってみた。


設定方法

  1. ラズパイ画面右上のVNCマークをクリック
  2. 右上メニュー -> Options -> Troubleshooting -> Enable experimental direct capture modeにチェック
結果

"Connection Failed"

なんかメッセージが変わったが相変わらず表示できない


なので更に調べる

Security

どうやら初期設定だと認証がUNIXパスワードになっているらしい。

ここをVNCパスワードに変えてみようと思う。


設定方法

  1. ラズパイ画面右上のVNCマークをクリック
  2. 右上メニュー -> Security -> AuthenticationをUNIX PasswordからVNC Passwordに変更

パスワードの設定画面が出てくる。
VNC認証用のパスワードを設定し、登録完了。

いざ繋いでみる

接続できた!


初期設定でUNIXパスワードになっているとはまってしまう。


調べてもあんまり日本語のサイトにたどり着かなかったので、備忘録として記す。

まとめ

RealVNCを使いたかったら、とりあえずAuthenticationをVNCパスワードに変更しましょう。

C#でPowerPointに画像を挿入

C#PowerPointシリーズ第4弾。
前回のコードを流用する。

(using PPt = Microsoft.Office.Interop.PowerPoint;)
(using Microsoft.Office.Core;)

string pptxPath = @"C\sample.pptx";
var app = new PPt.Application();
var pres = app.Presentations;
var file = pres.Open(pptxPath, MsoTriState.msoFalse, MsoTriState.msoFalse, MsoTriState.msoFalse);

file.Slides[1].Duplicate();
file.Slides[1].MoveTo(file.Slides.Count);

// ここから
var l = /* 画像のドキュメント上での左位置 */;
var t = /* 画像のドキュメント上での上位置 */;
var w = /* 画像のドキュメント上での幅 */;
var h = /* 画像のドキュメント上での高さ */;
string photoPath = @"C\:sample.jpg";

var newPhotoShape = file.Slides[2].Shapes.AddPicture(photoPath, MsoTriState.msoFalse, MsoTriState.msoCTrue, l, t, w, h);
newPhotoShape.Name = "newphoto";
// ここまで

file.Save();
file.Close();


今回は以下のメソッドにてスライドに画像を挿入している。

var newPhotoShape = file.Slides[2].Shapes.AddPicture(photoPath, MsoTriState.msoFalse, MsoTriState.msoCTrue, l, t, w, h);


AddPictureメソッドの引数の意味は以下のとおりである。

  • 第1引数: 挿入する画像のパス(string)
  • 第2引数: 画像ファイルへのリンクをするかどうか(MsoTriState)
  • 第3引数: リンクされた画像が挿入されたドキュメントとともに保存されるかどうか。第2引数をmsoFalseにした場合、第3引数はmsoTrueにしなければならない。(MsoTriState)
  • 第4-7引数: 左位置、上位置、画像の幅、画像の高さ(float)


つまり今回は、fileで指定されたPowerPointファイルの2枚目のスライドに、photoPathで指定されたパスにある画像を左位置がl、上位置がtに幅w、高さhの値で挿入している。


なおAddPictureメソッドの次の行において画像を挿入したシェイプに名前を付けている。
こうすることで、挿入したレイヤーを後に使いやすくしている。

C#でPowerPointスライドを編集

C#PowerPointシリーズ3回目


まだ読んでいない方は前回、前々回の記事をまず読むことをすすめる。
komee.hatenablog.com
komee.hatenablog.com


今回は開いたPowerPointに対して実際にスライドをコピー・移動・削除する方法を書く。

(using PPt = Microsoft.Office.Interop.PowerPoint;)
(using Microsoft.Office.Core;)

string pptxPath = @"C\sample.pptx";
var app = new PPt.Application();
var pres = app.Presentations;
var file = pres.Open(pptxPath, MsoTriState.msoFalse, MsoTriState.msoFalse, MsoTriState.msoFalse);

// ここから
file.Slides[1].Duplicate();
file.Slides[1].MoveTo(file.Slides.Count);
file.Slides[2].Delete();
// ここまで

file.Save();
file.Close();

前回の記事のコードを流用する。
開いたPowerPointファイルにはすでに1枚のスライドを保持しているとする。
つまり、この時点ではスライドの枚数は1枚のみ。


C#でスライドを編集する場合、どのページを使用するかは、以下のようにfile.Slides[]の引数に入れて指定する。

file.Slides[1].Duplicate();


引数は1から始まるので注意。


  • 複製
file.Slides[1].Duplicate();

Duplicateメソッドを用いる。
コピーするとスライドの配置場所は、コピー元の次のページになる。

この時点でスライドは2ページとなっている。

  • 移動
file.Slides[1].MoveTo(file.Slides.Count);


MoveToメソッドを用いる。
引数としてスライドの何ページ目に移動するかを整数で指定する。

なおページ数のインデックスは1から始まる。プログラマにはわかりにくいが、一般人にはわかりやすくなっている。

今回は引数にfile.Slides.Countを用いてスライドのページ数を取得し、スライドの最後のページに移動するようにした。
この時点でスライドの1ページ目と2ページ目が入れ替わっている。

  • 削除
file.Slides[2].Delete();

Deleteメソッドを用いる。
指定されたページのスライドが削除される。

今回は1ページ目が削除された。



結果として最初と同じ状態になってPowerPointは保存された。




今回はこれらコピー・削除・移動だけで僕は作業していたのだが、ページの新規作成も書いたほうがいいよなぁ、と書きながら思ってしまった。
機会があったら調べることにする。

C#でPowerPointを開く

前回の記事の続き。

komee.hatenablog.com


前回同様、2つのコンポーネントを参照に追加し、プロジェクトにインポートする。


C#プログラムからPowerPointを開くには以下のように記述する。

(using PPt = Microsoft.Office.Interop.PowerPoint;)
(using Microsoft.Office.Core;)

string pptxPath = @"C\sample.pptx";
var app = new PPt.Application();
var pres = app.Presentations;
var file = pres.Open(pptxPath, MsoTriState.msoFalse, MsoTriState.msoFalse, MsoTriState.msoFalse);

/*
PowerPointへの何らかの操作をここに記述
*/

file.Save();
file.Close();

解説

1行目
(using PPt = Microsoft.Office.Interop.PowerPoint;)

前回紹介したMicrosoft.Office.Interop.PowerPoint をusingにしていしつつ、PPtという変数へ代入する。
こうすることで、プログラム中でこのコンポーネントを呼び出すときはPPt.~と省略した形で書くことができる。

4行目
string pptxPath = @"C\sample.pptx";

今回開くPowerPointのファイルへのパスを記述する。
文字列中にエスケープ文字(\)が出てくるため、ダブルクォーテーションの前に@をつけることに注意。

5-7行目
var app = new PPt.Application();
var pres = app.Presentations;
var file = pres.Open(targetPptx, MsoTriState.msoFalse, MsoTriState.msoFalse, MsoTriState.msoFalse);

ルーティン。このように書いたらPowerPointを開くことができた。
7行目のpres.Openの引数は以下のようになっている。

  • 第1引数: 今回開くファイルへのパス(string)
  • 第2引数: ReadOnly。読み込み専用で開くなら、Trueを指定。(MsoTriState)
  • 第3引数: Untitled。ファイルにタイトルがあるかないかを指定。Trueだとファイル名なしでオープンする。Falseにした場合、既にタイトルはあるものとしてオープンする。(MsoTriState)
  • 第4引数: WithWindow。描画をするかしないか。Trueにすると描画をしつつ実行する。Falseを指定すると描画なしで実行される。(MsoTriState)
13-14行目
file.Save();
file.Close();

ルーティン。開いたファイルを保存して閉じている。

Saveをしないで閉じると、ファイルは保存されない。

またCloseをしないでプログラムを終了すると、開いていたPowerPointのファイルはロックされたままになり、再度オープンできなくなる。

ちなみにCloseを書き忘れた場合はプログラムが終了した後に、そのファイルを普通に開いて、"保存して"閉じればその後も問題なく使える。
# そんなことするなら普通にプログラム中にCloseを書いた方がいいのは言うまでもないが。


以上、C#からPowerPointを開く方法を記載した。

次回以降はPowerPointのスライドを実際に編集する方法を書いていく。

C#でPowerPointを編集する

最初に私の実行環境を以下に記す。

Windows10 Enterprise 64bit

Visual Studio Enterprise 2017


さて、最近は趣味で、C#を用いてPowerPointを編集するコードを書いている。


C#PowerPointも幸いにして同じMicrosoft製の製品のため、PowerPointを編集するためのAPIが最初からVisualStudioの中には用意されている。


C#PowerPointを編集するためには以下の2つのコンポーネントを使用する。

しかし2つともデフォルトではプロジェクトを作成しただけではインポートされないため、使用する際には参照を追加する必要がある。


Microsoft.Office.Interop.PowerPoint
Microsoft.Office.Core

2つのコンポーネントはともにソリューションエクスプローラの参照を右クリックし、参照の追加を選択することで、プロジェクトに追加することができる。


1つめのコンポーネントは、左側カラムのアセンブリの拡張タブのなかに用意されている、Microsoft.Office.Interop.PowerPointを参照することで使用可能になる。

バージョンが2つあるが、私は新しい方を選択して使用している。

f:id:komee:20170621233306p:plain



2つめのコンポーネントは、左側カラムのCOMのタイプライブラリの中にある、Microsoft Office 16.0 Object Libraryを参照することで使用可能になる。

f:id:komee:20170621233310p:plain

Microsoft.Office.Coreは、参照を追加するコンポーネント名が異なるので注意。



以上2つの参照を追加し、プログラム内で以下のようにコンポーネントを追加することでPowerPointC#で操作可能となる。

using Microsoft.Office.Interop.PowerPoint;
using Microsoft.Office.Core;


具体的な操作方法はまた記す。



参考にしたサイト

Learn to Develop with Microsoft Developer Network | MSDN

備忘録を作った

C#を書いていてわからないことをググりまくっていた。

 

そしたら日本語のリファレンスがほとんどないことに気づいた。

 

英語の解説ページやMicrosoftのリファレンス原文を読んでるうちに、毎回同じところを読みに行っていて、その都度理解するのに時間がかかるため備忘録を作ることにした。

 

少なからず日本人で同じことを検索する人はいるのではないかと思うので、日本語でわかりやすく解説して参考にしてもらいたい。

 

主にC#, 趣味の水泳のネタと読んだ本を書くことになると思う。