プログラムTips

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

MITライセンスの使い方
http://www.catch.jp/oss-license/2013/09/27/mit_license/www.catch.jp

メールライブラリ
github.com

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

torokonbu.blogspot.jp

sourcechord.hatenablog.com

devlights.hatenablog.com

neue.cc

ftvoid.com

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

programming-ios.com

Windowsサービスを楽に開発~TopShelf~84zume.wordpress.com

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版をもとに誰か実装してください。

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

Xamarinでツイートアプリつくるよ(3) ファイル読み書き

ファイルへ設定を保存できるようにするよ
設定をJSON形式で読み書きするからPCLStorageとJSON.NETをNugetで追加しておいてね

MainSetting.csを更新
中身は以下URL
https://github.com/reniris/NyanTweet/blob/835cbb0523cf537c34cb6574a845d6de39d53d0b/NyanTweet/NyanTweet/Model/MainSetting.cs
MainPageViewModel.csを更新
中身は以下URL
https://github.com/reniris/NyanTweet/blob/835cbb0523cf537c34cb6574a845d6de39d53d0b/NyanTweet/NyanTweet/ViewModel/MainPageViewModel.cs

MainSetting.csについて解説
JSONシリアライズ、デシリアライズ、ファイルへの読みこみ、書きこみを追加
インスタンスの作成を必ずファイルから読むように変更して、ファイルがない場合はデフォルト値をnewするようにしました

MainPageViewModel.csについて解説
58行目

private MainSetting _setting = MainSetting.LoadJson();

ファイルから設定を読み込むように変更

この変更を実装することによって、真ん中の大きいボタンに表示されている文言を変更した後、再起動しても変更されたままにすることができます。

Xamarinでツイートアプリつくるよ(2) ボタンにコマンドをバインディング

今回はメインのUIを作ってボタンクリックでコマンドを実行するよ
必要なライブラリReactivePropertyをインストールするために、PCLプロジェクトを.NET Standardに変更しておいてね
やり方はググれ。VisualStudio2015だとなぞのビルドエラーがたくさん出て、夜眠れなくて朝起きれないことになるのでVisualStudio2017を使おう
ダウンロードサイトはこちら
www.visualstudio.com
日本語サイトはわからなかったけど、このページからダウンロードできない英語力ではプログラムなんてできないのであきらめよう

NugetでReactivePropertyを検索してインストール
.Net Standardプロジェクトになっていればインストールできるはず

それらが終わったらクラスを追加していきます
まずは設定用のModel、MainSetting.csファイルを追加
中身は以下URL
NyanTweet/MainSetting.cs at 08034ba7a8a27b7dfe6fb5badea5f88fbded3b8b · reniris/NyanTweet · GitHub
プロパティ一つとデフォルトの文字列があるだけのクラスです

ViewModel、MainPageViewModel.csを追加
中身は以下
NyanTweet/MainPageViewModel.cs at 08034ba7a8a27b7dfe6fb5badea5f88fbded3b8b · reniris/NyanTweet · GitHub
UIにバインディングするプロパティとコマンドです

View、MainPage.xamlを追加
中身
NyanTweet/MainPage.xaml at 08034ba7a8a27b7dfe6fb5badea5f88fbded3b8b · reniris/NyanTweet · GitHub
メインのUIです


MainPage.xamlについて解説
8行目

  <ContentPage.BindingContext>
    <vm:MainPageViewModel />
</ContentPage.BindingContext>

これでバインディングが可能になります。WPFでいうDataContextです。

13行目

    <Button Text="{Binding TweetWord.Value}"
            HorizontalOptions="FillAndExpand"
            VerticalOptions="FillAndExpand"
            FontSize="Large"
            Command="{Binding TweetCommand}"
/>

メインの大きいボタンです。
表示テキストにTweetWordプロパティ、コマンドにTweetCommandプロパティをバインドしています。TweetWord.ValueとなっているのはReactivePropertyを使っているからです。
他のコントロールについては変わりないので特に解説しません。

MainPageViewModel.csについて解説
92行目

this.TweetCommand.Subscribe(_ => this.Message.Value = this.TweetWord.Value);

これだけで大きいボタンを押すと、下のほうにメッセージを出すことができます。

Xamarinでツイートアプリつくるよ(1) まずは最初のPageを差し替える

Xamarinの練習のためにツイートプログラムを作るよ

 

まずはXmarinのプロジェクトを作る(ここはほかのサイトのほうが詳しい)

それから、View、ViewModel、Modelフォルダを作る

ViewにMainPage.xamlを作って

 

App.csのコンストラクタを以下のように変更

         public App()
        {
            this.MainPage = new View.MainPage();
        }

 

こうすると、最初に表示されるページがMainPage.xamlに差し替えられるよ

 

今回の記事で使っているソースコードGitHubで公開しています

github.com

まだたいしたことはできないけど、最終的には設定した文を手動ツイートするプログラムになる予定だよ