前回、LINQの結果を Cache オブジェクトに保存しましたが、コードを少し修正して保存先を memcached に変更してみます。

ジェネリック・クラスをそのまま memcached に保存できなかったので、XmlSerializer でシリアライズ・デシリアライズしています。そのため、public で読み書き可能なプロパティやフィールドだけが対象となっていますし、オーバヘッドも結構あります。

ということで、実際には最低でも BinaryFormatter でのシリアライズに変更しないと使えないとは思いますが・・・

今回も下記のサイトのコードを使わせていただきました。

Caching the results of LINQ queries
http://petemontgomery.wordpress.com/2008/08/07/caching-the-results-of-linq-queries/

 

 サンプルコード

public static class QueryResultCache
{
    static public Enyim.Caching.MemcachedClient mc = new Enyim.Caching.MemcachedClient();

    public static IEnumerable<T> FromMemcached<T>(this IQueryable<T> query)
    {
        return query.FromMemcached(TimeSpan.FromMinutes(1));
    }

    public static IEnumerable<T> FromMemcached<T>(this IQueryable<T> query,
        TimeSpan slidingExpiration)
    {

        var expression = Evaluator.PartialEval(
            query.Expression,
            QueryResultCache.CanBeEvaluatedLocally);

        string key = expression.ToString();

        key = key.ToMd5Fingerprint();

        Enyim.Caching.MemcachedClient mc = new Enyim.Caching.MemcachedClient();
        System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(typeof(List<T>));

        List<T> result;
        var c = mc.Get(key) as byte[];
        using (System.IO.MemoryStream stream = new System.IO.MemoryStream())
        {
            if (c == null)
            {
                result = query.ToList();
                serializer.Serialize(stream, result);
                byte[] b = stream.ToArray();
                mc.Store(Enyim.Caching.Memcached.StoreMode.Set, key, b, slidingExpiration);

            }
            else
            {
                stream.Write(c, 0, c.Length);
                stream.Position = 0;
                result = serializer.Deserialize(stream) as List<T>;
            }

            stream.Close();
        }

        return result;
    }

	・・・・・
}

LINQの結果をCache オブジェクトに保存します。Queryからキーを自動的に生成しているため、簡単に使うことができます。詳しくは下記のサイトをご覧ください。

Caching the results of LINQ queries
http://petemontgomery.wordpress.com/2008/08/07/caching-the-results-of-linq-queries/

1.MSDNに記載されている ExpressionVisitor クラスをプロジェクトに追加します。

ExpressionVisitor
http://msdn.microsoft.com/en-us/library/bb882521.aspx

2.Caching the results of LINQ queries の Source code にある QueryResultCache クラス, Evaluator クラスをプロジェクトに追加します。

3.あとは通常のFromCacheメゾット を呼び出すだけで使用できます。

using (DataClassesDataContext db = new DataClassesDataContext())
{
	var people = from p in db.Person
		where p.IsReal == true
		select p;

		var result = people.FromCache().ToList();
}

LINQ to Twitter を使って、投稿、削除、検索します。

投稿は UpdateStatus メゾットを使用します。

using System;
using System.Collections.Generic;
using System.Linq;
using LinqToTwitter;

class Program
{
	static void Main(string[] args)
	{
		ITwitterAuthorization auth = new UsernamePasswordAuthorization() 
		{ 
			UserName = "USERNAME", 
			Password = "PASSWORD" 
		};
		using (TwitterContext twitterCtx = new TwitterContext(auth, "https://twitter.com/", "http://search.twitter.com/"))
		{
			auth.SignOn();

			// 投稿する
			var tweet = twitterCtx.UpdateStatus("投稿する内容です");

			auth.SignOff();
			Console.ReadLine();
		}
	}
}

削除は DestroyStatus メゾットを使用します。下記コードは、投稿内容が「テスト」となっているものを削除しています。

var tweets = from tweet in twitterCtx.Status
	where tweet.Type == StatusType.Friends && 
		tweet.Text == "テスト"
	select tweet;

foreach (var tweet in tweets)
{
	var status = twitterCtx.DestroyStatus(tweet.StatusID);
}

検索は、Search メゾットを使用します。下記コードは、検索キーワード「ff13」で最初の3件を取得しています。

var queryResults = from search in twitterCtx.Search
	where search.Type == SearchType.Search &&
		search.Query == "ff13" &&
		search.Page == 1 &&
		search.PageSize == 3
		select search;

foreach (var search in queryResults)
{
	Console.WriteLine("Query: " + search.Query);
	Console.WriteLine();

	foreach (var entry in search.Entries)
	{
		Console.WriteLine("AuthorName: " + entry.Author.Name);
		Console.WriteLine("AuthorURI : " + entry.Author.URI);
		Console.WriteLine("Content   : " + entry.Content);
		Console.WriteLine("Published : " + entry.Published);
		Console.WriteLine();
	}
}

今回もLINQ to Twitterを使って、自分のタイムラインを取得します。

前回、ユーザー名とパスワードでの認証したので、今回は認証にOAuthを使用していますが、LinqToTwitterDemo の InitializeOAuthConsumerStrings をそのまま使用しているだけです。

準備

1.「Applications Using Twitter」にアクセスし、「Register a new application ≫」をクリックしてアプリケーションを登録します。

2.アプリケーションの内容を適当に入力して、今回はコンソールアプリでテストしますので「Application Type」は「Client」を選択し、「保存する」をクリックします。

3.「Consumer key」と「Consumer secret」が表示されるのでメモっておきます。

4.プロジェクトを作成し、「LinqToTwitter.dll」を参照に追加します。

5.アプリケーション構成ファイル(App.Config)を作成し、取得した「Consumer key」と「Consumer secret」を設定に追加します。

app.config

<configuration>
  <appSettings>
    <add key="twitterConsumerKey" value="[Consumer key]" />
    <add key="twitterConsumerSecret" value="[Consumer secret]" />
  </appSettings>
</configuration>

 

サンプルコード(C#)

using System;
using System.Linq;
using LinqToTwitter;
using System.Configuration;

class Program
{
    // 認証
    private static void InitializeOAuthConsumerStrings(TwitterContext twitterCtx)
    {
        var oauth = (DesktopOAuthAuthorization)twitterCtx.AuthorizedClient;
        oauth.GetVerifier = () =>
        {
            Console.WriteLine("Next, you'll need to tell Twitter to authorize access.\nThis program will not have access to your credentials, which is the benefit of OAuth.\nOnce you log into Twitter and give this program permission,\n come back to this console.");
            Console.Write("Please enter the PIN that Twitter gives you after authorizing this client: ");
            return Console.ReadLine();
        };

        if (oauth.CachedCredentialsAvailable)
        {
            Console.WriteLine("Skipping OAuth authorization step because that has already been done.");
        }
    }

    static void Main(string[] args)
    {
        ITwitterAuthorization auth = new DesktopOAuthAuthorization();
        TwitterContext twitterCtx = new TwitterContext(auth, "https://twitter.com/", "http://search.twitter.com/");

        InitializeOAuthConsumerStrings(twitterCtx);

        auth.SignOn();

        // タイムラインを取得して出力
        var tweets = from tweet in twitterCtx.Status
                     where tweet.Type == StatusType.Friends
                     select tweet;

        foreach (var tweet in tweets)
        {
            Console.WriteLine("User Name: {0}, Tweet: {1}",
                tweet.User.Name,
                tweet.Text);
        }

        twitterCtx.Dispose();

        Console.ReadLine();
    }
}

 

実行

1.初回実行時にブラウザが起動し、「ユーザー名やメールアドレス」と「パスワード」の入力ページが表示されますので、入力して「許可する」をクリックします。

201s

2. ページが移動して番号が表示されますので、表示された番号をコンソールに入力します。

202s

203s

3.認証が通ればタイムラインを取得しコンソールに出力されます。

.NETからTwitterのAPIを使用するLINQ Provider(LINQ to Twitter)を使ってみます。今回は、ユーザー名とパスワードで認証して自分のタイムラインを取得しています。

LINQ to Twitter - Code Plex
http://linqtotwitter.codeplex.com/
今回はLINQ to Twitter Beta v2.0.7をダウンロードして使用

 準備

1.Twitterのアカウントを取得します。

2.「LINQ to Twitter」をダウンロードして展開、「LinqToTwitter\bin\Release」の中にある「LinqToTwitter.dll」を適当な場所にコピーします。

3.プロジェクトを作成し、「LinqToTwitter.dll」を参照に追加します。

サンプルコード(C#)

using LinqToTwitter;
static void Main(string[] args)
{
	// 認証
    ITwitterAuthorization auth;
    auth = new UsernamePasswordAuthorization() { UserName = "USERNAME", Password = "PASSWORD" };
    TwitterContext twitterCtx = new TwitterContext(auth, "https://twitter.com/", "http://search.twitter.com/");
    auth.SignOn();

    // タイムラインを取得して出力
    var tweets = from tweet in twitterCtx.Status
                 where tweet.Type == StatusType.Friends
                 select tweet;

	foreach (var tweet in tweets)
    {
    	Console.WriteLine("User Name: {0}, Tweet: {1}",
        		tweet.User.Name,
                tweet.Text);
	}
    twitterCtx.Dispose();
    Console.ReadLine();
}