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

窓を作っては壊していた人のブログ

提督の窓や成績の窓を作ってました.今では適当に好き勝手に開発をしてます.

雑記: Mastodon を見ての学祭での利用について

学祭アプリのタイムラインを Mastodon に置き換えたい.

前回のアプリケーションではサーバーとモバイルで頑張って WebSocket をはっていたので,再度今年実装などになると非常に面倒だろうなと思った. 問題になってくるのはアカウント登録や認証周り.ここは Mastodon の仕組みをちゃんと抑えて自前で改造するのが必要なのかなと思っている.

雑に Android であれば ANDROID_ID を取得してサーバー側で適当なアカウントを作ってしまい AccessToken を返して通信してもらうとかでいいか.

学祭などで Mastodon を使うと他の大学祭との交流とかに使えそうかもしれないなーという雑な思いがある.

こういった企画に関しては私はあまり得意ではないので,何かできそうだったら教えて欲しい.

の前に今年本当に学祭アプリ作成に携わるかどうかという感じなんですよね……….

C# で Mastodon のAPIライブラリの Mastodot を作った

最近 Twitter も見つつの Mastodon も見つつみたいな生活になってきました(どのインスタンスかは…察してください)(就活の方をちゃんとやりなさい)(研究が炎上している)

そうなると自分で適当なクライントを作ったり,API を叩いてちょっとした監視などをしたいなぁという欲求が出てくるようになってきます.

ということで実際にライブラリを作って Nuget に公開してみました.

GitHub - yamachu/Mastodot: C# Library for Mastodon. Easy Toot!

www.nuget.org

それで作ってみた監視の Bot がこちら.

qiita.com

使ってみる

とりあえず最低限使えるような流れを少し載せようと思います.

MastodonAPI を叩いてごにょごにょするためには Mastodonインスタンスに対して自分のクライアントアプリを登録して,それに紐付けられた ClientIdClientSecret を取得する必要があります.

var app = await ApplicationManager.RegistApp("mastodon.cloud", "はじめての Mastodon アプリ", Scope.Read | Scope.Write | Scope.Follow);

こんな感じで Mastodonインスタンスに今回では “はじめての Mastodon アプリ” というアプリを登録することが出来ました. ここで得られた app にさっき必要といった ClientIdClientSecret が格納されています.

このオブジェクト自体をシリアライズするなりトークンを別に保存するなりします(接続の度にアプリケーションを作り直すのはちょっと…)

  • AccessToken の取得

先程得られた ClientIdClientSecret を使って AccessToken を取得していきます. Mastodon ではユーザー認可に OAuth を使っているのですが,そこで必要になるのがその AccessToken です.

この取得方法には2種類あり,メールアドレスとパスワードのペアによる取得か,ログイン済みのブラウザなどで特定の URL に飛ぶことで行う方法があります.

様々な解説記事ではメールアドレスとパスワードのペアによるログインが多く載っているので,ここでは後者の方法を取ってみようと思います.

// さっきの app 変数が残っているのであれば,
var url = ApplicationManager.GetOAuthUrl(app);
// なければこんな感じで
// var url = ApplicationManager.GetOAuthUrl("mastodon.cloud", "ここにClientId", Scope.Read | Scope.Write | Scope.Follow);

ここで得られた url にログイン済みのブラウザなどでアクセスして認証?をクリックすると,真ん中にながーーーーーーい文字列が表示されます.これをコピーしてください.

var tokens = await ApplicaionManager.GetAccessTokenByCode(app, 長い文字列);
// もしくは
// var tokens = await ApplicaionManager.GetAccessTokenByCode("mastodon.cloud", "ここにClientId", "ClientSecret", 長い文字列);

ここで得られた tokens に お待ちかねの AccessToken が格納されています. これからはこの AccessToken を使って API を叩くのでどこかに保存しておいてください.

自分は今のところ確認していないのですが,たまに認証・認可を行う際にサブドメインを切ってそこで認証とかをする場合があります. その際は上のメソッドに名前付き引数で subdomain: "authenticate" みたいな感じに入れるといいと思います(仮に authenticate.mastodon.cloud みたいなURLで認証が行われるのであれば).

  • Toot しよう

簡単に HelloWorld 的なこともやってみましょう. 自分のクライントから Toot 出来たときは本当に嬉しいものなので(個人差があります),それをやってみます.

var client = new MastodonClient("mastodon.cloud", "ここにAccessToken");
var status = await client.PostNewStatus(status: "Hello Mastodon!");

こうすると対象の Mastodon インスタンスに自分の Toot が投稿されます.やったぜ

画像つきはちょっと面倒で,Xamarin とかだと自分で画像を byte[] に変換して〜という作業が入ってここに書くのは大変なので,コンソールアプリとかで実行していることを想定してみます.

var attachment = await client.UploadMedia("アップしたいファイルのパス");
var status = await client.PostNewStatus("矢澤にこは俺の嫁", mediaIds: new int[] { attachment.Id});

みたいにすると画像つきの投稿もできます. 他の詳しい仕様などは公式のドキュメント

documentation/API.md at master · tootsuite/documentation · GitHub

またはこのライブラリのソースなどをご覧ください(投げやり).

  • ストリームをだら見する

最後にストリームをダラダラと見ていきます. 本ライブラリでは Reactive 系のライブラリを導入しているため,ストリームに接続すると Observable 系のものが返ってくるようになっています. そのため他の Rx.* を使ったことのある人であればなんとなく使い勝手がわかると思います.

var publicStream = client.GetObservablePublicTimeline()
                    .OfType<Status>()
                    .Subscribe(x => Console.WriteLine($"{x.Account.FullUserName} Tooted: {x.Content}"));
            

ここでは流れてくる投稿のみをフィルタして表示していますが,OfType<Notification> などにすると通知が取れたりもします.

非常に簡単に使えるように,ということを心がけて作ってみたので,是非試してみてください.

まとめたコードなどは Mastodot/Program.cs at master · yamachu/Mastodot · GitHub

に置いてあるので参考にしてみてください.

バグ報告やIssue,PRお待ちしております!

久しぶりに Windows 使って開発する時に .NET Core 周りで困ったこと

はじめに

最近(1ヶ月前ぐらい)Windowsマシンを導入しました. 今使っているMac Book ProにもVMで入れてはいたのですが,ストレージが足りずに起動が出来なくなってしまって, ある意味いい機会だということで,どうせ重い作業をするのであればリモートで繋げばいいじゃんという風に考えたのがきっかけです.

数年前まではずっとWindowsを使っていたのですが,最近の開発環境の導入とかってどうなってるの?という浦島太郎状態です. そこで自分がやったことを備忘録として挙げておきます.(インストールしたOSはWindows10)

本題の.NET Coreはまた後ほど.

最低限の開発環境導入

絶対入れるもの

必要そうなもの

とりあえずこれだけで人権が担保されました. あとは適当に何か必要になったら入れることにします.

本題の .NET Core のこと

Windows で開発したい理由はもう一つあって,自分がちょっと使ってみた GitHub - reactjs/React.NET: .NET library for JSX compilation and server-side rendering of React components

っていうライブラリがどうも macOSLinuxWindows でパスの扱いの挙動が違うという問題を解決したかったということです.

Windows というか,Visual Studio で開発することのメリットとして,Windows 環境で動いているプロセスに対してデバッグが出来て,また Docker コンテナにデプロイしてからそいつに対しても デバッグが出来るという点があります. これをすれば Windows と他の OS での挙動の違いが探れると思い実際にやってみました.

が,まずこのライブラリを動作させることに苦労するという意味の分からない展開になりました. これがタイトルに挙げた .NET Core 周りで困ったことです.

このライブラリで使用されている .NET Core の SDK のバージョンは 1.0.0-preview2-003121 です. 現在 dotnet core とかで検索して見つかるページで配布されているものは 1.0.0-preview2-003131 で,バージョンが合わず,このままだと動いてくれませんでした. で,以外と検索すると見つかりづらいといいますか,ちょっとファイル名を予想して検索したりというようなことだったり,リリース時のブログ記事から URL を探したりみたいなことをする羽目に.

また OS を再インストールした時に迷わないようなメモを残そうということで,この記事を書いたわけです.

結論:

github.com

これを見る.

やったー見つかったーこれで開発できるーーーーーー

というわけでもないんですよね. インストールしてみようとするとバージョン云々で弾かれる. どうもこの問題はリリース時に色々問題として挙がっていたようです.

対策としては DotNetCore.1.0.0-VS2015Tools.Preview2.exe SKIP_VSU_CHECK=1 みたいにフラグをつけてインストールする.

最後に

ライブラリのパス問題の PR もマージされたので良かったです. なんというか,すごくその場しのぎ感ある対策ですが,とりあえず動くのでいいでしょう(

本当の最後に,

Windows 難しい.

VSCodeでの.NETアプリ開発の知見(随時追加

問題 - ローカル環境変数設定 - エディタ周り

状況

プログラム内で環境変数が欲しい時があって,そのプロジェクトのデバッグの時とか使う時のみで設定したい. VSCode内のTaskでsourceとかしてもデバッガ起動する時の設定のlaunch.jsonを実行するshellは別物だから環境変数が引き継がれないという問題に直面.

解決策

${workspaceRoot}/.vscode以下にsettings.jsonを追加する.そこに目的の環境変数を入れ込む.

{
 "WEB.TOKEN": "hoge",
 "WEB.KEY": "fuga"
}

launch.jsonからは

...
"env": {
 "TOKEN": "${config.WEB.TOKEN}",
 "KEY": "${config.WEB.KEY}"
},
...

問題 - tasks.jsonで色々コマンド使いたい - エディタ周り

状況

.NET のプロジェクトを読み込んで自動的に作られたtasks.jsonでbuild以外のコマンドをしたくて,buildのargs内に ; で区切ってシェルコマンドを入れたけどダメだった.

解決策

そもそもトップにあるコマンドが "command": "dotnet"だからってこと.ここをMac/Linuxユーザは"sh"とかに変えておけばいい感じだった. そしてコマンドを実行するために,その下にあるargsを "args": [ "-c" ]に変更. これで万事解決かと思いきやそうではなく,tasksの要素にsuppressTaskNameが含まれていないもしくはfalseになっている場合task名が第一引数として渡される.

 "command": "dotnet",
 "args", [],
 "tasks" : [
 {
  "taskName": "build",
  "args": [
   "${workspaceRoot}/project.json"
  ]
}

みたいになっていると,dotnet build ${workspaceRoot}/project.jsonとして実行されるということ. コマンド名と関係ないtask名をつけるのであれば,"suppressTaskName": trueとして設定するといい.

結局こんな形になった(上の環境変数を設定しようとしてダメだったやつが含まれてる)

{
    "version": "0.1.0",
    "command": "sh",
    "isShellCommand": true,
    "showOutput": "always",
    "args": [ "-c" ],
    "tasks": [
        {
            "taskName": "build",
            "suppressTaskName": true,
            "args": [
                "dotnet build ${workspaceRoot}/project.json"
            ],
            "isBuildCommand": true,
            "problemMatcher": "$msCompile"
        },
        {
            "taskName": "set-env",
            "suppressTaskName": true,
            "args": [
                "source ${workspaceRoot}/.token_env"
            ]
        }
    ]
}

問題 - yo aspnetで作られたDockerfileを使ってみたけどrestoreでこける - 開発周り

状況

2016/12/3現在yo aspnetで作られるDockerfileは以下のとおり

FROM microsoft/dotnet:latest

COPY . /app

WORKDIR /app

RUN ["dotnet", "restore"]

RUN ["dotnet", "build"]

EXPOSE 5000/tcp

CMD ["dotnet", "run", "--server.urls", "http://*:5000"]

テンプレートで吐き出されるのはバージョンが1.0.1のものだけれども,今のlatestは1.1.0なのでそのあたりでも怒られる.

解決策(正しいかは別

諦めた

FROM microsoft/aspnetcore:1.0.1

COPY ./out/ /app

WORKDIR /app

EXPOSE 80

ENTRYPOINT ["dotnet", "アプリ名.dll"]

で,このDockerfileでイメージをbuildする前にdotnet publish -c Release -o outって感じで${ProjectRoot}/out 以下に吐き出す. これでデプロイできた. Dockerとかコピペでcompose叩いてたからコマンドほとんど分からなくて疲れた

なにか詰まったら随時追加していきます.

WebSharpを触ってみた(導入編

Xamarinの強い人たちのツイートを眺めていたらこんな記述がありました.(会話の内容は省略)

なにこの見るからに面白そうなもの…ということで実際にサンプルだけでも触ってみることにしました.

そこそこ詳しくこっちに書いたのでこちらも併せてごらんください. qiita.com

追記に追記(2017年2月20日) 追記(2017年1月27日)

さて,現在開発をmacで行っているのですが,dotnet core のバージョンが 1.0.0-rc4-004616 こんな感じといいますか, project.jsonでプロジェクトを管理するのではなくcsprojで管理し始めたものになると,binding.gypとかを書き換える必要が出てきます. ちょっとdiffを用意し忘れましたが,見ればすぐわかります(雑

ちなみにそれでビルドは全部通ったのですが,スタックオーバーフロー起こしてElectronで起動できませんでした,現在原因調べてます.

予想はついてはいましたが,1.0.0-preview2-1-003177とかに戻すと動きますね…dotnet coreの最新のrc4のものをリネームしてpreview2を指すようにするという対処法で行っていますが, あまり良い方法ではないですね…

edge.jsのプロジェクトにglobal.jsonを加えてビルドするようにしたら問題ないですね.自分のフォークしたリポジトリに入れたのでそれを見ていただければと…

導入

GitHub - xamarin/WebSharp: Support for running C# on the web browser.

からリポジトリをクローンしてきて,その中のExampleをとりあえず眺めてみることに.

Pre-requisitesとして挙げられているものを確認してみると

  • Node.js
  • Native Abstractions for Node.js
  • PepperPlugin

の3つ.Electron触ったことある人ならNode.jsは入ってるだろうし問題無し.

nanはネイティブライブラリをラップしたりしてたことのある人ならば入っているだろうけど,入っていなかったらnpm i nanでインストール

最後のPepperPluginだけれども,この名前を聞くとChromeのあれかな…と勘違いしてしまう.あ,流行ってる(?)PPAPでもないです.ということで,このPepperPluginのインストールについて触れてみることにする.

リンク先に飛んでみると,

If you have never setup WebSharp before, use the make setup makefile target, this will download the dependencies for the build: Pepper SDK and NuGet:

make setup

と言われてるので大人しくmake setupを叩いてみると make: *** No rule to make target `setup'. Stop.

おいREADME!!!!!!!となるのですが,文章を見て察しろということなんでしょうね,WebSharpを一度もsetupしたことがないのであれば,と言っているので,リポジトリのルートディレクトリに行ってmake buildを叩くと無事に関連物がポンポンダウンロードされます.あとは言われた通りにmake buildを叩けば準備完了…と行きたいところですが, 私が以前に書いた Visual Studio for Macをインストールしてmono4.8+が無いと怒られた時の対処法 - Qiita を実践し,monoが4.8.0になっていた場合, mono/utils/mono-dl.hがないとか言われて怒られます.

なのでその時は

sudo ln -nfs /Library/Frameworks/Mono.framework/Versions/4.6.2 /Library/Frameworks/Mono.framework/Versions/Current

みたいにして以前のバージョンに戻してください.(この辺り.zshrcとかに関数用意しておこうかなあ…)

追記(2017年2月20日)

上記のリンクに載せたQiitaの記事に色々と対策やら考察やら書きました. とりあえずPKG_CONFIG_PATHを設定すればln -sとかをしなくて良さそうです.あとはmono 4.8.0 のバージョンを新しめの物にかえれば問題なく動作しそうですね.

あとは言われた通りに写経すれば動くはずです.動かないなーっていう人は,使われてるElectronが自分でglobalに入れたものでバージョンがあっていないとかその辺の問題だと思いますので,node_modules/.bin/electronあたりのものを使って起動しましょう.

とPepperPlugin必要なのかーという感じではありますが,機能を限れば不要でした.

というのもDotNetSamplesのサンプルを試した時はPepperPluginのインストールをしない状態で始めた時に動作していたからです. 詳しい理由とかは調べるのが めんどう たいへんなので,誰か詳しい方お願いします.

触ってみた感想としてはcsxみたいなものかーという感想です. 私はjs書くのが非常に苦手だったので,C# で書けるのはだいぶ負担が減って良いと思います(jsじゃなくてtsという選択肢もあってそっちも使ってたけど,やっぱりC# の方がいい).

すぐ試したいことはネイティブライブラリをラップしたやつでも容易に呼び出すことができるか,またReactの中に埋め込んでごにょごにょ出来るかって感じですかね.

ViewをReactで書いてモデル部をC# で書くとかごった煮感あってすごい楽しみ…Electronで使えるから,GUIアプリケーションもある意味C# で書ける環境が作られつつあるって考えてもいいんですよねやったーーー

mixi git challengeに参加してきました

経緯

今年の夏休みにもメールでgit challengeのことは知っていたけれども,クックパッドインターンに参加していて,後半まで残れるかわからなかったため参加を見送りしていたイベントでした. しかし今の時期に開催されるもので,友人から一緒に出ないと誘われ参加を決意しエントリーシートを提出したところ通ったので無事参加に至る. 通常のgitの運用だったり,OSSへのPRベースの運用でひどい運用のリポジトリを触ったことがなかったので,ぬるま湯につかった私が生き残れる現場なのかこれは...という不安でいっぱいでした.

当日

朝の新幹線に乗っていて大宮で乗り換えたら誘ってくれた友人(k君)と遭遇し,一緒に会場まで向かった. けどこういう日に限ってトラブルは起きるもので,濃霧のため電車が遅延,田舎っぺなので乗り換えの電車がわからないなどなど重なり, 結局集合時間には間に合わず,渋谷駅から会場に行くまでにも迷い,オリエンテーション開始時間ぴったりに到着しました,本当にmixiさん,参加者のみなさんごめんなさい....

会場に着いてからの感想は,ここ本当にオフィスか???というものでした,本当に綺麗(社員の人に聞いたらお客さん向け&人事とかそういう人が基本的に使う空間だったらしい). そこで簡易的なオリエンテーションを受け,なぜバージョン管理システムを利用するか,またmixiでの利用の方法についての解説を受けました.

私たちもチーム開発(SmartCampusや東北大学祭公式アプリ)でgitを活用してソース管理をしていたが,チームがでかくなったりチームの方針ではデザイナでもバージョン管理システムを使うんだなぁということを知った. まぁこの非エンジニアであるデザイナだったりがバージョン管理システムを使うというのが後々の悲劇を生むということは競技のうちに知るのであった.

お昼ごはん

最初のオリエンテーションで今からお昼ごはん,🍣🍣🍣っていうものが見えたので🍣きたあああああと思ったんですよ,思ったんですけどね... どうも今日はイチローマリナーズだかで何かしらしたやつの日らしく,それにちなんでイチローの好物である🍛でした. いや,🍛好きだからいいんだけど紛らわしいわ!!

食に命をかける系エンジニアなので結構早めに並んだのですが,ビーフ人気で私の眼の前で売り切れました,一緒にきたk君,ビーフは美味かったかい...? 私はポークを選択しましたが,結構美味かった,甘めのルゥだったなぁという印象(ビーフ,ポーク,チキン,野菜だと甘めが公約数なのかしら). 他にも野菜なりデザートなりジャガバターがあってよかった. f:id:yamachu_co:20161120121401j:plain:w400

本日メンターになった人は同じ東北大学出身で,しかも馴染みのある研究室の方でした(S研). 研究室の話で盛り上がったり,Subversionからgitになってよかったみたいな感じの話だったり,だいぶ楽しいお昼ごはんでした.

競技に関して

同じ大学から参加のk君と一緒のIチームで競技を行いました. 同じチームで開発していた(リポジトリは違うもので開発をしていたけれども)ので信頼のおける相方でした. 即興で組むとさすがにどれくらいの力量があるのか測れないので本当に相方ガチャっぽくなってしまうので,本当にチームには恵まれていたと思います.

チームの攻略方針としては,とりあえずk君は奇数番目の問題を,私は偶数番目の問題をということで問題を解き始めました. 結果的にいい選択だったんじゃないかなとは思っています(問題の出題傾向的な意味で<-検閲対象

ずっと語録を発していたりで一番 うるさい 和やかで賑やかなチームだったのではないかとう感じで,マイペースで競技を行えました. そのこともあり,問題のことについてはあまり話せないですが,頑張りました,健闘しましたとしか言えませんが,1位タイが3チームあって,結局5位でした. スコア的には3ポイント差で,私が最後の問題を通していれば表彰でした,ほんとごめん... 競技終了10秒前ぐらいにk君がpushして無事CI通った時はマジで燃えました,あいつもってるわ,マジ.

解答解説

知るかこんなコマンド. (と思ったけどクックパッドインターンでやってたことを思い出して頭を抱えた)

まず感じたのは,低級コマンド触ることがないように,ちゃんとしたgitの運用を心がけたいですね,ということ. あとforce pushで投げくんなという印象しか持たなかった. けど実際非エンジニアの入るリポジトリでは今回競技に出たクソリポジトリみたいなことが起こるらしい(最初のオリエンテーションで言ってたやつ),

けどforce pushされた時でもすーぱーえんじにあなら,はいはいこういうことねってことで直せるあたりかっこいい,ああなりたいって思いました.

今日得られた教訓としては, * git の運用に関してのルールを正しくもうけよう * これがいいらしいということではなく,正しく理解できた上で変更をかけよう * 誰かのやらかしがわかるようにCIだったりテストをできる環境を作って,常に通知させるようにしたほうがよさそう

ということでした.ローカルバックアップ強い.

懇親会

酒飲んでソシャゲのチート対策だったりテープメディアがまだ存在しているという話で盛り上がったことぐらいしか覚えてない. 琥珀エビス美味かった.f:id:yamachu_co:20161120175129j:plain:w400

帰宅

帰れてよかった,本当によかった...

実は私帰りの新幹線適当に窓口行ったら取れるだろうと思っていまして,油断していたのですが,はい,とれませんでした(自分では). JRさんDOS攻撃まがいのリロード作業してごめん,本当に指定席とりたかったんだ...となっていたのですが, 本日の相方のk君がチケットをなんとかしてモバイルページでとってくれて無事帰ることができました,20分以上連打作業に付き合ってくれて本当にありがとう,本当にありがとう. ということでこれは今k君がとってくれた新幹線の中で書いています.

おわりに

実際mixi git challengeに参加してよかったかと言われればよかったです,非常に満足のいく内容のイベントでした. 実際あんなやばいリポジトリに触れるかは別として...

あと何がよかったって,こんなにいっぱいoctcatとかのシールもらえました!!!!!!神!!!!!!!(大学から借りてるMacじゃなかったら貼ってた).

f:id:yamachu_co:20161121001433j:plain:w400

他にも強い同年代のエンジニアとの交流もあるし,こんなgitの運用があるんだ,こんなgitのコマンド,業(ワザとも読んだりゴウと読んだりもする)があるんだってことで非常に勉強になりました. 自分のこれからのgitの運用に(あんなひどいリポジトリはないと信じたいが)活かしていけるかなと思いました.

エンジニア職を目指すのであればVCSは手足のように使えて当たり前の世界ですし,是非ともこれからエンジニア職を目指して就職活動だったり, 自分のgit力を上げたいという方は是非とも参加してみてください,非常に優しい面白いメンターの方が待っています.

本当に内容が無いような感じの記事ですけど,お酒が入っているからしょうがないの,許して♡(あとやったこと書くと検閲対象になりそうだから書けない)

検閲対象に入らなければいいな

要チェックgitコマンド * git reflog * git log --pretty=formatほにゃらら

gitコマンドじゃ無いけど,簡単なshell芸出来ないのはちょっとどうかと思います(

けど優勝チームとかSourceTreeばりばり使っても普通に上位行けたので,やっぱりちゃんと使い方とどうなるかと理解すべきかなと思います,あとグラフ見て何がどうなっているのかを察して.

本当の最後に

oppai さいこー!!!!!!!!!!!

Xamarin StudioのAddinを作っていたらハマってしまってteratailで質問したら解決した話

毎回タイトルにセンスがないのは仕様

ということでタイトルのまんまのことでして,Xamarin StudioのAddin作りをしてみました.

成果物はこちら

GitHub - yamachu/VariableConsoleWriter

選択した変数をSystem.Diagnostics.Debug.WriteLineで囲って,実行されたメソッド名と一緒に出力するコードを挿入するアドイン. f:id:yamachu_co:20161107230248g:plain

デバッガ使えとかいうツッコミはなしで

やったこととか色々

右クリックをすると表示されるコンテキストメニューにコマンドを追加したかったのですが,なかなかうまくいかずに苦戦してました.

公式ドキュメントを読んでみると

Creating contextual menus
TODO

...ha?TODOじゃないんじゃ,書いてくれ,な?

という感じでどうしようかなぁ〜と考えた時あることに気がつきました.
「エディタ自体もAddinみたいので拡張されてるんだし,それパクればいけるじゃん」

そう,これとか

ということで中身の確認をしてみたのですが,基本的にはやっていることは同じ,なのにこちらでは出てこない.

困り果てたのでteratailに相談だ!ということで質問を投下

teratail.com

回答がかなり早いタイミングで来たんですけど,回答者,すごい回答者が来てしまった...という感じでした.本当にありがたかったです.

要点をまとめると * Addin実行してる時のApplication Output見よう * アセンブリの参照が足りない

ということでした.完全にビンゴでして,f:id:yamachu_co:20161107225847p:plain

このMonoDevelop.SourceEditor2を参照に加えたら動きました. ちゃんとコンソールにERRORで出ていたのですが,完全に見逃していました.これからエディタ上でのContextMenuに何か加えたいという人はこの辺りにご注意を...

まとめ

  • Addin実行してる時のApplication Output見よう
  • アセンブリの参照の確認をしよう
  • 公式リポジトリを見て実装のベースとなるところを確認しよう
  • ちゃんと途中経過とか色々書けば回答してくださる人もあらわれてくれる