C#で漢数字表記

QiitaでC#での漢数字表記の記事を書きました

qiita.com

提督業も忙しい!プラグイン更新してみた

提督業も忙しい!プラグインをユーザー定義レシピも表示できるようにしました
プラグインと同じ場所にあるUserRecipe.xamlを編集すればいいです
バイナリもGitHubで公開しています
github.com

参考サイト
GitHub - ruhiel/ImprovementArsenalPlugin: KanColleViewer用の改修工廠装備一覧を表示するプラグイン

提督業も忙しい!プラグイン作ってみた

急に作りたくなったのでやった

艦これWikiの開発レシピのページをパースして表示してます
いらない部分は手動で飛ばしたりしてます
他のレシピは入れてません

ソースとバイナリはGitHubで公開しています
github.com

参考サイト
KanColleViewer プラグインの作り方とか – CAT EARS
neue cc - C#でスクレイピング:HTMLパース(Linq to Html)のためのSGMLReader利用法
GitHub - Grabacr07/KanColleViewer: 艦これブラウザーのようなもの

プログラムTips

プログラムに使えそうなサイトいろいろ列挙します

MITライセンスの使い方
http://www.catch.jp/oss-license/2013/09/27/mit_license/自作ソースコードに、MITライセンスを適用する3つのやり方 | オープンソース・ライセンスの談話室

メールライブラリ
github.com

配列を一つの値で初期化
challengeandresponse.blogspot.jp

torokonbu.blogspot.jp

sourcechord.hatenablog.com

devlights.hatenablog.com

neue cc - Reactive Extensions入門 + メソッド早見解説表

[Unity] ネットワークの接続状態を取得する | ftvlog

PCLの暗号化ライブラリ
www.nuget.org

Unity 〜 バックグラウンドへの移行と復帰を検知する方法 〜

Windowsサービスを楽に開発~TopShelf~Windowsサービスを楽に開発~TopShelf~ | 84zume Works

C#でお手軽ファイル暗号化

適当なクラスをMessagePackでシリアライズしてからAESで暗号化してファイルに保存、保存したファイルから複合化してデシリアライズしてみました。

今回のソースは以下で公開しています
github.com

シリアライズに使用したMessagePackについては
neue cc - C#(.NET, .NET Core, Unity, Xamarin)用の新しい高速なMessagePack実装
を参考にしてください。

MessagePackAnalyzerをインストールしないとMessagePack関係のコーディングが面倒なので気をつけてください

シリアライズするクラスはPublicにしないと例外が出ます。うっかりPublicを付け忘れると悲惨なことになります。

以下は暗号化関係のソースです
https://github.com/reniris/EasyEncrypt/blob/05dceefdc37aa0a3617c68faa40d664705f244b8/EasyEncrypt/Encrypt.cs
暗号化、複合化部分は抽象化してあるので、拡張しやすくなっているはずです。

暗号化キーは、指定されていない場合は自動生成するようになっています。
最初の一回だけキーを生成してどこかに保存しておいて、次からはそのキーを使うというようなやり方を想定しています。

ネットにある暗号化のサンプルはキーを直接ソースに書いてあるのが多かったので、ソースにキーを書かないことを意識しました。

Xamarinでツイートアプリつくるよ(5) トークンを再利用する

前回のプログラムではアプリを再起動するたびに認証されていたが、今回は認証情報を保存して、一度認証できれば以降認証しないようにした。
MainSetting.csを更新
中身は以下URL
NyanTweet/MainSetting.cs at 8ed0211012ad24ea7f56b738417dcf180e5b9dce · reniris/NyanTweet · GitHub
Tweet.csを更新
NyanTweet/Tweet.cs at 8ed0211012ad24ea7f56b738417dcf180e5b9dce · reniris/NyanTweet · GitHub
MainPageViewModel.csを更新
中身は以下URL
NyanTweet/MainPageViewModel.cs at 8ed0211012ad24ea7f56b738417dcf180e5b9dce · reniris/NyanTweet · GitHub


MainSetting.csについて解説
アクセストークンをプロパティに追加
ファイルへの読み書きタイミングを調整
読み込みをLoad関数に、書き込みをSave関数にまとめました。
setterがprivateの場合[JsonProperty]属性がないとシリアライズ・デシリアライズできないので注意

Tweet.csについて解説
ツイートと認証を分離

MainPageViewModel.csについて解説
コマンドにファイルの読み書きを明示的に追加

プロパティのsetterでファイル書き込みするとタイミングによっておかしなことになるため、ファイル書き込みは明示的に関数で設定するように変更しました。

参考サイト
github.com

Xamarinでツイートアプリつくるよ(4) Twitter認証PINなし そして絶望へ

ツイートアプリを名乗っているくせにTwitterのTの字すら出てこなかった当アプリですが、今回とうとうTwitter認証を実装します。
PINを使用せずに認証しようとしたらうっかり地獄の蓋を開けてしまいました

今回の記事を含むソースは以下に公開しています(APIキーなどを除く)
GitHub - reniris/NyanTweet: 定型短文ツイートプログラム

方法は以下を参照
wplogs.com
リソースファイルTwitterAPIKey.resxをNyanTweetプロジェクトへ追加して、AccessTokenAccessTokenSecretAPIKeyAPISecretを文字列リソースとして追加しておいてください。ここはGitHubには公開されていません

PINを使用して認証する場合

var session = CoreTweet.OAuth.Authorize(ConsumerKey, ConsumerSecret);
var url = session.AuthorizeUri;
Device.OpenUri(new Uri(url));

string PINcode; //ここにPINを入れる
tokens = CoreTweet.OAuth.GetTokens(session, PINcode);
var res = await tokens.Statuses.UpdateAsync(new { status = "にゃーん" });

こんな感じで簡単に書けるのですが、PINを使わない場合はそう簡単にいきません。
ググってもなかなかいい感じのコードが見つからなくて苦労しました。

PINを使わずに認証する場合はコールバックURLが必要です。Twitter Appshttps://apps.twitter.com/で適当なURLを設定しておいてください。プログラムで使うURLと違っていても大丈夫です。

ASP.NETでのコールバックURLは使用例が見つかったのですが、Xamarinではどうすればいいかわからずにしばらく悩む羽目になりました。
どうやらカスタムURLスキーマというものを使って自分自身を再起動すればいいようです。二重起動しないよう念のためLaunchModeをLaunchMode.SingleTaskにしておいてください。

カスタムURLスキーマの設定方法はちょまどさんのサイトを参考にしてください
chomado.com

Twitter認証をざっくり解説

  • ブラウザで認証ページを開いてコールバックでパラメータを取得

Device.OpenUri(new Uri(session.AuthorizeUri));でええやんと思っていたら結果を待ってくれないので、結果を待ってくれる機種依存コードを
xamarinhelp.com
forums.xamarin.com
を元に実装、だがどうやってもキャンセルが返ってくるという謎の現象に悩まされるため、OnActivityResultではなくOnResumeを使うことにした。
しかしsession.AuthorizeUriにはパラメータが入らないことに気づかず絶望、数日悩む羽目になった。
パラメータはコールバックのカスタムURLスキーマについているため、OnResumeからURLを返すように変更してようやくパラメータを取得できた。

  • クエリパラメータをパース

 ネットで見つけたコードをそのままコピペ。特に難しいことはない。

  • oauth_token と oauth_verifierを取得

  もう何も怖くない

var res = await t.Account.VerifyCredentialsAsync();
if(res.IsVerified == false) return null;

  とかやってたせいで常にnullが返っていた。最後の最後まで苦しめてくれます。

当方にはMaciPadもないのでiOS部分は実装していません。今回実装されたAndroid版をもとに誰か実装してください。

あと、今回のバージョンではアプリを再起動するたびに認証を求められます。この辺はあとで修正します。