こんにちはー!ニアです。
先日(2月13日)、「プログラミング生放送勉強会 第39回@株式会社DMM.com ラボ(恵比寿)」に参加しました。
目次
1. 明日はバレンタインなので・・・
明日がバレンタインデーとうことで、ワタシとミョウガさんでチョコレート菓子のプレゼントをしようと思い、ワタシは「ラング・ド・シャ・ショコラ」を、ミョウガさんは「ビスキュイ・オ・ショコラ」をセレクトしました。
(1日早いですが)ハッピーバレンタインデー☆
ワタシからは「ラング・ド・シャ・ショコラ」を送ります。
プロ生勉強会の参加者の皆さん、どうぞお召し上がりください☆
#pronama pic.twitter.com/NfIVRShssx— シアたん(Xiia Chronoir) (@xiia_chronoir) 2016, 2月 13
Happy Valentine day~♪
わたしからは「ビスキュイ・オ・ショコラ」を送りますよっ!
#pronama pic.twitter.com/nob2S3F84j
— 水橋ミョウガ (Myoga S. S.) (@Myoga1012) 2016, 2月 13
2人がオーダーした「ラング・ド・シャ・ショコラ」と「ビスキュイ・オ・ショコラ」は、恵比寿のアトレ内で購入しました。お値段は2160円(税込)です。
2. 私はテーブルタップの魔術師よ
今回の勉強会から、私はケーブルとタップを分離させることができるテーブルタップを持っていきました。青のトリプルタップと併用して計7コ口でっせ!
3. 今回の勉強会
今回はマスコットアプリ関連のセッションがメインでした。Android WearのWatch Faceなど興味深い内容を聴けました。受賞された方々、おめでとうございます!
私もAndroid Watchが欲しいのですが、Moto 360 2ndかHuawei WatchかCASIOかで迷いますな。
4. 今回のMy LTのテーマ
今回は、前回の勉強会で発表した「LINQ to XMLですぱこーを読もう!」の続編として「すぱこーRSSフィードを取得するライブラリの開発話」のテーマでLTさせていただきました。
◆ Link
すぱーダのページ -> //chronoir.net/spada/
NuGet Gallery ->
- すぱーダ : https://www.nuget.org/packages/Chronir_net.SPADA/
- エクすぱーダ : https://www.nuget.org/packages/Chronoir_net.XSPADA/
- ユニすぱーダ : https://www.nuget.org/packages/Chronoir_net.UniSPADA/
◆ 補足事項
時間の都合上、LTでスキップした部分について補足します。
1. エクすぱーダとユニすぱーダで待機可能なLoadAsyncメソッドを追加した目的
RSSフィードを取得したアイテムを.NETの「ObservableCollection<T>」で管理する時、アイテムの追加処理を実装しやすくするためです。
RSSの取得に時間がかかるため、モバイルアプリやUWPアプリでは非同期で行う必要がありますが、ObservableCollection<T>をリストボックスなどのUIとバインディングしている時、アイテムの追加や削除などの処理はUIと同じスレッドで行う必要があります(コレクションが変化した時に発生する「CollectionChanged」イベントをUIと同じスレッドで行う必要があるためです)。
using Chronoir_net.SPADA;
using System.Threading.Tasks;
using System.Collections.ObjectModel;
class TestModel {
// 取得したすぱこーRSSフィードのアイテムのコレクション
// ( リストボックスなどにバインディングしているとします )
public ObservableCollection<SpacoRSSItem> Items { get; private set; }
public TestModel(){
Items = new ObservableCollection<SpacoRSSItem>();
}
// すぱこーRSSフィードを取得( GetRSSAsyncから非同期で呼び出し )
private void GetRSS() {
var sr = SpacoRSSReader.Load( "http://pronama-api.azurewebsites.net/feed/spaco" );
// ObservableCollectionにアイテムを追加します。
foreach( var i in sr.Items ) {
// リストボックスなどのUIにバインディングしている場合、
// UIと異なるスレッドでアイテムを追加すると、例外がスローされてしまいます。
list.Add( i );
}
}
public async Task GetRSSAsync() {
await Task.Run( () => GetRSS() );
}
}
WPFであれば、BindingOperationsクラスにあるEnableCollectionSynchronizationメソッド を利用して、UIと異なるスレッドからアイテムを追加・削除などの処理ができます。
using Chronoir_net.SPADA;
using System.Threading.Tasks;
using System.Collections.ObjectModel;
using System.Windows.Data;
class TestModel {
// 取得したすぱこーRSSフィードのアイテムのコレクション
// ( リストボックスなどにバインディングしているとします )
public ObservableCollection<SpacoRSSItem> Items { get; private set; }
public TestModel(){
Items = new ObservableCollection<SpacoRSSItem>();
// この1文を追加します。
BindingOperations.EnableCollectionSynchronization( Items, new object() );
}
// すぱこーRSSフィードを取得( GetRSSAsyncから非同期で呼び出し )
private void GetRSS() {
var sr = SpacoRSSReader.Load( "http://pronama-api.azurewebsites.net/feed/spaco" );
// ObservableCollectionにアイテムを追加します。
foreach( var i in sr.Items ) {
list.Add( i );
}
}
public async Task GetRSSAsync() {
await Task.Run( () => GetRSS() );
}
}
UWPアプリ(WindowsランタイムAPI系)やクロスプラットフォーム用アプリ(Xamarin系)では、そのような機能がないので、SpacoRSSReader.Loadメソッドの処理だけを非同期で実行できる必要があったのです。
using Chronoir_net.SPADA;
using System.Threading.Tasks;
using System.Collections.ObjectModel;
class TestModel {
// 取得したすぱこーRSSフィードのアイテムのコレクション
// ( リストボックスなどにバインディングしているとします )
public ObservableCollection<SpacoRSSItem> Items { get; private set; }
public TestModel(){
Items = new ObservableCollection<SpacoRSSItem>();
}
// すぱこーRSSフィードを取得
public void GetRSS() {
// すぱこーRSSフィードを非同期で取得します。
var sr = await Task.Run( () => SpacoRSSReader.LoadAsync( "http://pronama-api.azurewebsites.net/feed/spaco" ) );
// ObservableCollectionにアイテムを追加します。
foreach( var i in sr.Items ) {
list.Add( i );
}
}
}
2. SpacoRSSReader.ItemsからLINQを使って操作
LTでは最近の2か月分のみを抽出するデモのみを行いました。
var sr = SpacoRSSReader.Load( "http://pronama-api.azurewebsites.net/feed/spaco" );
// 今から2か月前のDateTimeオブジェクト
var rc2 = DateTime.Now.AddMonths( -2 );
// 最近2か月分のアイテムのみを抽出します。
var items = sr.Items.Where( i => i.PubDate >= rec2 );
ここでは、LTで扱わなかった以下の2つの方法のサンプルコードを紹介します。
- 1話から順に並び替え
- 作者を指定し抽出
1話から順に並び替える方法はいくつかあります。すぱこーRSSフィードは最新話から順に並んでいるので、Reverseメソッドだけで実装できます。
var sr = SpacoRSSReader.Load( "http://pronama-api.azurewebsites.net/feed/spaco" );
// 1話から順に並び替え
var ans = sr.Reverse();
1話から順に並び替える別の方法として、Volumeの昇順に並び替える方法とPubDateの古い順に並び変える方法があります。
var sr = SpacoRSSReader.Load( "http://pronama-api.azurewebsites.net/feed/spaco" );
// 1話から順に並び替え
var ans1 = sr.OrderBy( i => i.Volume );
var ans2 = sr.OrderBy( i => i.PubDate );
作者を指定して抽出する時は、Whereメソッドを使ってラムダ式にAuthorとの等価演算の式を入れます。
var sr = SpacoRSSReader.Load( "http://pronama-api.azurewebsites.net/feed/spaco" );
// 作者を指定して抽出
var ans = sr.OrderBy( i => i.Author == "作者名" );
5. いつもの居酒屋で懇親会
懇親会はさくら水産で行われました。今回は2次会にも参加しました。
6. にあはのろわれてしまった!?
当日:
- テーブルの脚に膝をぶつける
- ツイートで画像やハッシュタグを入れ忘れる
- 恵比寿駅の階段でスリップする
- 地元の路線が運転見合わせになる(別路線で迂回しました)
- 地元の駅から小雨の内に帰宅(帰宅して少し経った後に大雨になりました)
- @felis_catus_氏のプロ生ちゃんおみくじの結果が「大吉」
なんと極端な運勢の差なのでしょう。
多分、2月13日の私は呪われていたようです(笑)。今度からは厄除けの宝石を持って行こうかな・・・。
それでは、See you next!