プログラミング生放送勉強会 第39回@DMM .comラボに参加&LTをしました with LTの補足

  |   2016/02/14 ( 2019/01/05 ) | 127 views
 0

こんにちはー!ニアです。

先日(2月13日)、「プログラミング生放送勉強会 第39回@株式会社DMM.com ラボ(恵比寿)」に参加しました。

1. 明日はバレンタインなので・・・

Xiia03.png
シアです!

明日がバレンタインデーとうことで、ワタシとミョウガさんでチョコレート菓子のプレゼントをしようと思い、ワタシは「ラング・ド・シャ・ショコラ」を、ミョウガさんは「ビスキュイ・オ・ショコラ」をセレクトしました。

HappyValentine

シアたん&ミョウガ バレンタイン限定イラスト

2人がオーダーした「ラング・ド・シャ・ショコラ」と「ビスキュイ・オ・ショコラ」は、恵比寿のアトレ内で購入しました。お値段は2160円(税込)です。

2. 私はテーブルタップの魔術師よ

今回の勉強会から、私はケーブルとタップを分離させることができるテーブルタップを持っていきました。青のトリプルタップと併用して計7コ口でっせ!

DSC_0361

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 ->

◆ 補足事項

時間の都合上、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次会にも参加しました。

DSC_0379

6. にあはのろわれてしまった!?

当日:

  • テーブルの脚に膝をぶつける
  • ツイートで画像やハッシュタグを入れ忘れる
  • 恵比寿駅の階段でスリップする
  • 地元の路線が運転見合わせになる(別路線で迂回しました)
その翌日:
  • 地元の駅から小雨の内に帰宅(帰宅して少し経った後に大雨になりました)
  • @felis_catus_氏のプロ生ちゃんおみくじの結果が「大吉」

なんと極端な運勢の差なのでしょう。

多分、2月13日の私は呪われていたようです(笑)。今度からは厄除けの宝石を持って行こうかな・・・。

Nia-ha-norowarete-shimatta

それでは、See you next!

この記事をシェアする
Chronoir.netのRSSフィードを購読する

ニア(Nia)

サーバー・フロント・DB・インフラ(クラウド)エンジニア(目指すはフルスタック)。主にC#/PHPを使っています。最近はDockerやWebアプリ、モバイルアプリ開発(Xamarin)を探求中。好物は紅茶とコーヒー、シラス丼、趣味は写真撮影と音ゲーです

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください