Monday, February 19, 2007

LINQ to Code

With all of the information on the Internet telling you how much easier LINQ makes data access you may have missed out on some of the less obvious implications of the new language features. I'm referring specifically to how much easier it is to generate code using the new LINQ API. I'm going to demonstrate a brief example that uses a domain-specific language (DSL) to serialize a class to a fixed-length, record-based text file. This is useful if you find yourself having to work with legacy file formats from the dark ages. Rather than reinvent the wheel let's steal the approach used for XML serialization in the .NET Framework.

In order to convert your C# queries to SQL at run-time LINQ introduces a new construct called a lambda expression. Lambda expressions are just lambda functions that C# represents as data instead of executable code. For a good example of how to use lambda expressions and compile them see this post in Don Box's blog. If you choose to represent a function as a lambda expression tree you can analyze it at run-time and convert it to another form like a SQL query or executable code. This is known as metaprogramming (short defintion: code that manipulates code). When the compiler converts your code into a data tree it represents it using objects in the new System.Linq.Expressions namespace. The question I asked is “Can I use these objects to build a function at run-time?” The answer is yes.

As you probably know, in order to serialize a class as XML you mark it up with attributes. You may not realize this, but this is a form of metaprogramming. When you attach attributes to language constructs you are using a domain specific language which is a little language designed for a specific task. This is a very powerful technique because when you use a language specifically geared for a task it is usually much easier and less error-prone than it would have been if you had written it in a general purpose language like C#. Using attributes to specify a DSL is great because it groups the work to be performed on data with the data itself instead of storing it in an external file where it can get out of sync with changes.Here is the file I want to read from:

1600 Pennsylvania Avenue G.W. Bush
1600 Pennsylvania Avenue C. Rice
1600 Pennsylvania Avenue D. Cheney

Here is the class I want to deserialize from the file:

[TextRecordSerializable]
public class Customer{
private string address;

[FieldRange(0,35)]
public string Address
{
get { return address; }
set { address = value; }
}
private string name;
[FieldRange(35,10)]
public string Name
{
get { return name; }
set { name = value; }
}
}

The FieldRange attributes just store the starting character index and the length of the field in the record. The TextRecordSerializable attribute indicates that the class can be serialized. These two attributes are the only “commands” in our DSL. Simple, huh? Now a full implementation would be a little more complex, allowing for type conversions and such, but it still would be simple enough to describe with attributes and parameters. What we want to do is convert our DSL in to real-honest-to-goodness executable code that deserializes the object from a string (and vice versa). Basically we want to generate the following function:

Func customerParser = (line) => new Customer{Address = line.Substring(0,35), Name = line.Substring(35,10) };

This function can be built for ANY type at run-time using the following code. It might seem complex at first, but stick with it. It's not as complicated as it seems. (Click on the image below to zoom - I haven't figured out how to keep blogger from mauling my code so if anyone knows how please leave a comment)*The code below aliases System.Linq.Expressions.Expression as "Ex" to keep things short.




This code is just beautiful. The data flows out of our DSL, is filtered, and converted to an AST all in a single expression. We create our method in the static constructor and then cache it in a static variable. We then call this function inside a public class method called “Deserialize.” The end result is that we can do this:

var serializer = new TextRecordSerializer<Customer>();
var customer = serializer.Deserialize(“1600 Pennsylvania Avenue G.W. Bush ");Console.WriteLine(customer.Name);

Once our expression is compiled into a function, the code runs as fast as it would have if we had written it ourselves in raw C#. I will leave the method that generates the Serialize function as an exercise for the reader. Next time we'll look at using expressions to create much more advanced DSLs than are possible with simple attributes.

66 comments:

Liviu said...

Interesting. But where did you find documentation? The docs in Orcas for the new features are really of shame, It is a garbage of method declarations without any examples...

Jafar Husain said...

Most of the documentation for LINQ can be found at Microsoft's LINQ site however there is precious little information about Expression trees. I just went spelunking with intellisense and found what I needed. The expression trees are very similar in structure to the CodeDOM but they are built with static factory methods in the System.Linq.Expressions.Expression class.

olmocc said...

Your code is really cool man!. Would be great that Anders & Co. extend the Expression Trees to... Stement Lists :) So it will work with functions with more than one statment: with ifs, whiles, fors... and so on.

Jafar Husain said...

I agree. This would be ideal, but if they optimize tail recursion in lambda expressions when they are compiled we will be able to do anything we could do otherwise, but perhaps not as efficiently.

mawi said...

Hey Jafar! I really like the stuff you are putting out on this blog, and look forward to your book! :)

BUT - in the interest of being able to follow along, is there anywhere I can get the code in text and not picture format? I am lazy! (maybe stupid as well, if the code is there but I've missed it).

Jafar Husain said...

Flattery will get you everywhere. :-) Alas, Blogger doesn't allow me to upload any files except images. I would send it to you by e-mail but it's terribly disorganized, full of aborted ideas, and stuffed into one project which is basically my playground. I plan to clean up the code, GPL it, and post it for everyone once I find a way to serve it.

Sorry 'bout the wait

Escape said...

Very interesting post, LINQ is really a promising future, and this expression tree framework is really the fundations of this all.

To copy/past code to your blog, you should try CopyAsHtml from Colin Coller (http://www.jtleigh.com/CopySourceAsHtml - the server seems to be down at the time I write this comment). I hope it can help..

Anonymous said...

did u know about haskell in WINHugs?i got assignment about haskell.....that i got a lot problem do not know how to program it

ChrisB@HPS said...

Thanks for the head start on a project I'm working on to read fixed records from text files. But what if I want to expose a property other than a string from the class to deserialize, like so:

[TextRecordSerializable]
public class Customer
{
private string address;

[FieldRange(0, 35)]
public string Address
{
get { return address; }
set { address = value; }
}
private string name;
[FieldRange(35, 10)]
public string Name
{
get { return name; }
set { name = value; }
}

// INTEGER type property
private int zipcode;
[FieldRange(45, 5)]
public int ZipCode
{
get { return zipcode; }
set { zipcode = value; }
}
}

Can you point me in the right direction so that I can handle multiple data types in the Lambda expression? Thanks

Jafar Husain said...

Absolutely. It's best to use the TypeConverter framework that .NET exposes. All you need to do is modify your LINQ query to retrieve the type converter for each type that is not a string and then modify the expression to invoke the appropriate method on the type converter.

ChrisB@HPS said...

Thanks for the lightning fast response. After reading your suggestion I found myself digging through MSDN and finding very little in the way of useful info. I understand how to separate the query from the binding expression, but the disconnect is how to use the type converter within this query and then use this query to create an expression that invokes the appropriate type converter. Can you expand a bit more? Thanks a lot.

Shantell said...
This comment has been removed by a blog administrator.
wow gold1000 said...
This comment has been removed by a blog administrator.
SewhatSneev said...
This comment has been removed by a blog administrator.
yiwu said...
This comment has been removed by a blog administrator.
Anonymous said...
This comment has been removed by a blog administrator.
Anonymous said...
This comment has been removed by a blog administrator.
Anonymous said...
This comment has been removed by a blog administrator.
Anonymous said...
This comment has been removed by a blog administrator.
Chris Falter said...

Jafar,

Great post! In your "end result" code, don't you need to pass a type to the generic TestRecordSerializer in order to do work, let alone compile? In other words, this:

var serializer = new TextRecordSerializer();

should be this:

var serializer = new TextRecordSerializer[Customer]();

(Sorry I couldn't use angle brackets, blogger disallows them.)

Have you posted the code anywhere since you wrote this?

You might consider cleaning up the comments a bit, too. The spammers are such a shame.

chinaspecial said...
This comment has been removed by a blog administrator.
mmoga said...
This comment has been removed by a blog administrator.
Conrad said...
This comment has been removed by a blog administrator.
Jafar Husain said...

Hey Chris,

You are correct. In fact the generic type declaration _was_ in there but was intepreted as an HTML tag. Thanks for pointing it out.

Mea culpa, I haven't posted the code anywhere. I wrote this when VS2008 was in CTP and I no longer have it. The most interesting bits are in the code snippet. From there you should be able to fill it out. We'll call it a learning exercise :-).

Anonymous said...

I think 2moons dil changes my life. Because of 2moons gold, I meet a lot of friends. Besides, my friends usually give me some 2moon dil. I usually buy 2moons dil through Internet and advice from my friends, so I gain a lot of cheap 2moons gold and harvest in life.

9Dragons is a very good game. Through buying 9Dragons gold, I find fun in it. I am so glad that I can earn a lot of 9 Dragons gold. 9Dragons cater to the taste of young people. With cheap 9Dragons gold, you can get everything you want in this game. So I like to buy 9 Dragons gold. For me 9Dragons money is not just a simple thing.

belrion said...

buy wow gold

buy wow gold

buy wow account

buy wow gold

coco0610 said...

wholesale jewelry
handmade jewelry
jewelry wholesale
fashion jewelry
costume jewelry

Anonymous said...

aion chinaaion china gold,
aion cn goldaion chinese gold,
aion gold chinaaion gold chinese,
china aion goldchinese aion gold,
aion china kinaaion chinese kina,
aion kina chinachina aion kina,
aion china buybuy aion china,
aion chinese server goldaion cn server gold,
aion china server goldchina aion server gold,
chinese aion server goldaion chinese server gold,
aion cn server kinaaion china server kina,
china aion server kinachinese aion server kina

silk road gold said...

Now do you worried about that in the game do not had enough shaiya gold to play the game, now you can not worried, my friend told me a website, in here you can buy a lot shaiya money and only spend a little money, do not hesitate, it was really, in here we had much cheap shaiya gold, we can sure that you will get the shaiya online gold, quick to come here to buy shaiya gold .


Now do you worried about that in the game do not had enough silkroad gold to play the game, now you can not worried, my friend told me a website, in here you can buy a lot sro gold and only spend a little money, do not hesitate, it was really, in here we had much silkroad online gold, we can sure that you will get the silk road gold, quick to come here to buy cheap silkroad gold.

wowgoldme said...

buy wow gold,buy wow gold,cheap wow gold.buy wow gold,cheap wow gold,power wow power leveling,Buy wow gold.world of warcrft gold.

xxmy said...

Weekends to people ig2tmean that they can have a two-day wowgold4europe good rest. For example, people [url=http://www.gameusd.org ]gameusd[/url]can go out to enjoy themselves or get meinwowgold together with relatives and friends to talk with each storeingame other or watch interesting video tapes with the speebie whole family.
Everyone spends agamegold weekends in his ownmmofly way. Within two days, some people can relax themselves by listening to music, reading novels, or watching ogeworld films. Others perhaps are more active by playing basketball, wimming or mmorpgvip dancing. Different people have different gamesavor relaxations.
I often spend weekends withoggsale my family or my friends. Sometimes my parents take me on a visit to their old friends. Sometimesgamersell I go to the library to study or borrow some books to mmovirtex gain much knowledge. I also go to see various exhibition to broaden rpg trader my vision. An excursion to seashore or mountain resorts is my favorite way of spending weekends. Weekends are always enjoyable for me.

xxmy said...

Weekends to people ig2tmean that they can have a two-day wowgold4europe good rest. For example, people [url=http://www.gameusd.org ]gameusd[/url]can go out to enjoy themselves or get meinwowgold together with relatives and friends to talk with each storeingame other or watch interesting video tapes with the speebie whole family.
Everyone spends agamegold weekends in his ownmmofly way. Within two days, some people can relax themselves by listening to music, reading novels, or watching ogeworld films. Others perhaps are more active by playing basketball, wimming or mmorpgvip dancing. Different people have different gamesavor relaxations.
I often spend weekends withoggsale my family or my friends. Sometimes my parents take me on a visit to their old friends. Sometimesgamersell I go to the library to study or borrow some books to mmovirtex gain much knowledge. I also go to see various exhibition to broaden rpg trader my vision. An excursion to seashore or mountain resorts is my favorite way of spending weekends. Weekends are always enjoyable for me.

xxmy said...

Weekends to people ig2tmean that they can have a two-day wowgold4europe good rest. For example, people [url=http://www.gameusd.org ]gameusd[/url]can go out to enjoy themselves or get meinwowgold together with relatives and friends to talk with each storeingame other or watch interesting video tapes with the speebie whole family.
Everyone spends agamegold weekends in his ownmmofly way. Within two days, some people can relax themselves by listening to music, reading novels, or watching ogeworld films. Others perhaps are more active by playing basketball, wimming or mmorpgvip dancing. Different people have different gamesavor relaxations.
I often spend weekends withoggsale my family or my friends. Sometimes my parents take me on a visit to their old friends. Sometimesgamersell I go to the library to study or borrow some books to mmovirtex gain much knowledge. I also go to see various exhibition to broaden rpg trader my vision. An excursion to seashore or mountain resorts is my favorite way of spending weekends. Weekends are always enjoyable for me.

Affordable Luxurious Wedding Dress Blog said...

cheap wedding gowns,
discount bridal gowns,
China wedding dresses,
discount designer wedding dresses,
China wedding online store,
plus size wedding dresses,
cheap informal wedding dresses,
junior bridesmaid dresses,
cheap bridesmaid dresses,
maternity bridesmaid dresses,
discount flower girl gowns,
cheap prom dresses,
party dresses,
evening dresses,
mother of the bride dresses,
special occasion dresses,
cheap quinceanera dresses,
hot red wedding dresses

srggy said...

polo ralph lauren integrates two types of luxury and leisure style, now more and more popular men’s “thin” burberry polos, most designers have sought to perfect the cut with “cutting” a bag of bones of the body ralph lauren polo shirts. It is amazing that a tight lacoste polo shirts with pencil pants, full of retro style with a European aristocratic culture of leisure cheappolos.

srggy said...

The button to break the conventional design of polo shirts, the depth of clear lines of wholesale polo shirts from the Department of V on the first gives the impression of a unique, tailor-made with dark-green Lacoste polo shirts with the color scheme of Red and the casual cheap lacoste polos, stressed a summer of non-traditional use of color, so that the overall shape ofralph lauren polo shirts is full of flavor. The classic black-and-white cheap ralph lauren polos with matching black-and-white striped discount ralph lauren polos elegant leaves the impression that the import of polo clothing and black shoes brighten even more people.

srggy said...

Look !The shirt for men's clothing,ed hardy clothing, The ed hardy clothes on each piece were created ed hardy shirts and is recognized globally for his technical brilliance and mesmerizing imagery.Short sleeves ed hardy mens and ed hardy womens , remember to check out ed hardy t-shirts because they are very popular in demand too!Combination with ed hardy sunglasses,very handsome.

srggy said...

Andy Roddick's signature babolat pure drive, Pure Drive Roddick Babolat wilson k six, features GT Technology combined with head microgel and prince-o3-tour, versatile and accurate cheap tennis racquets with unparalleled performance and incredible feel with less vibrations.

jel said...

new polos men poloswomen polosdiscount polos
summer polospolo shirts whosalepolo fashionembroodered polos
tennis racketsclothing poloclothingedhardyshirt
edhardyclothingsummer ed hardy clothingcheap shirtsed hardy brand
cheap ed hardypolo shirts cheapcheap tennis racketsdiscount tennis rackets
ralphlaurenpoloshirtscheappolospolo fashionpolo logo
polo shirts in voguepolo women clothinged-hardy shirtsed-hardy sunglasses
ed-hardy logopolofashioncheaptennisracquetsed-hardy sunglasses
ed-hardy sunglassesed-hardy clothingdiscount polo shirtswholesale ed hardhy shirts
clothingfashionpolos summertennisrackets discountpolos clothes
wilson k sixedhardyclotheswholesale-polo-shirts

j said...

http://2009tennis.blogspot.com/
http://www.free-blog-site.com/tennis
http://o3.indiatimes.com/racquet/
http://cid-8c8a918b06ff68fd.spaces.live.com/?lc=2052
http://2009tennis.cocolog-nifty.com/
http://2009tennis.blog.drecom.jp/
http://2009tennis.blog.shinobi.jp/
http://www.actiblog.com/slary/
http://pshirts.blog126.fc2.com/
http://www.free-blog-site.com/shirts
http://nikepuma.blog.shinobi.jp/
http://hardy55.blog126.fc2.com/
http://cid-f80137f6d1a8020b.spaces.live.com/?lc=2052
http://www2.atword.jp/sdgdyhd/
http://kurumaro.com/hardy/
http://hardyclothes.jugem.jp/
http://www.actiblog.com/sfawagfra/
http://thediary.org/cheaphandbags/
http://ameblo.jp/kaowy/
http://sale.edublogs.org/
http://www2.atword.jp/jak/
http://09handbags.blog126.fc2.com/
http://sun15.cocolog-nifty.com/
http://ameblo.jp/ailsa15/
http://junior2tennis.blog.shinobi.jp/

j said...

In preparation for the purchase of a tennis racquetbefore, we must consider your financial ability to bear; On this basis, a further comparison, as far as possible, choose your tennis racket. Now a lot of cheap tennis racquet and more mixed materials, the proportion of mixed-use to control the stiffness of the tennis racquet discount and the shock-absorbing capacity, the more rigid cheap tennis racket, the swing more powerful force; but the relative resilience of the shock-absorbing capacity and discount tennis racket performance of talks on the easier it is for the wrist and elbow injury.
head junior tennis racket
wilson tennis racquet
wilson tennis racket
head tennis racket
babolat tennis racket
Womens Handbags
Cheap Purses
Designer Handbags

j said...

Burberry polo shirt the steady, solid, so many young girls also love it. Speaking of people of a ralph lauren polo, think it a sign of nobility elegant waving in the horse club.spyder jacket in the cold in your winter activities can be easily.columbia jacket it is expensive, but here you do not need to consider the price of it. the north face jacket one of my favorite money, I do not know how many in this world of its fans.
ed hardy clothing
ed hardy clothes
ed hardy shirts
ed hardy t-shirts
ed hardy sunglasses
ed hardy mens
ed hardy womens
Wholesale Handbags
Cheap Handbags

Anonymous said...

出会い喫茶出会いカフェテレクラ不倫セックスフレンドセフレ出会い出会い出会い掲示板出会い出会い出会い人妻風俗デリヘルデリバリーヘルス出会い出会い無料フィリピンライブチャットアダルトライブチャットデリヘル

Anonymous said...

不動産ソープランドアクセスカウンターコレステロール中性脂肪花粉症在宅ワーク内職在宅アルバイト乾燥肌ダイエット 食事サプリメント無料占い出会い山口クレジットカード現金化クレジット現金化ライブチャットフィリピンチャットレディパソコン在宅ワーク

Anonymous said...

出会い豊島区出会い北区出会い荒川区出会い板橋区出会い練馬区出会い足立区出会い葛飾区出会い江戸川区ニキビCholesterol水虫冷え性むくみ産後わきが車買取転職加齢臭

Anonymous said...

出会い愛知出会い秋田出会い青森出会い千葉出会い愛媛出会い福井出会い福岡出会い福島出会い岐阜出会い群馬出会い広島出会い北海道出会い兵庫出会い茨城出会い石川出会い岩手出会い香川出会い鹿児島出会い神奈川出会い高知

Anonymous said...

出会い熊本出会い京都出会い三重出会い宮城出会い宮崎出会い長野出会い長崎出会い奈良出会い新潟出会い大分出会い岡山出会い沖縄出会い大阪出会い佐賀出会い埼玉出会い滋賀出会い島根出会い静岡出会い栃木出会い徳島

Anonymous said...

出会い東京出会い鳥取出会い富山出会い和歌山出会い山形出会い山口出会い山梨出会い北九州出会い下関出会い川崎出会い神戸出会い久留米出会い水戸出会い名古屋出会い大牟田出会い埼玉出会い堺出会い仙台出会い横浜出会い横須賀出会い札幌出会い川崎

Anonymous said...

出会い堺出会い仙台出会い横浜出会い横須賀出会い札幌出会い千代田区出会い中央区出会い港区出会い新宿区出会い文京区出会い台東区出会い墨田区出会い江東区出会い品川区出会い目黒区出会い大田区出会い世田谷区出会い渋谷区出会い中野区出会い杉並区

Anonymous said...

福井出会い愛知出会い岐阜出会い静岡出会い三重出会い兵庫出会い大阪出会い和歌山出会い滋賀出会い京都出会い奈良出会い山口出会い鳥取出会い島根出会い岡山出会い広島出会い徳島出会い香川出会い愛媛出会い高知出会い

Anonymous said...

出会い札幌出会い函館出会い北海道出会い秋田出会い青森出会い岩手出会い東京出会い八王子出会い府中出会い調布出会い銀座出会い仙台出会い優良出会いサイトアダルト盗撮素人熟女エロアニメAV女優

Anonymous said...

出会い愛知出会い秋田出会い青森出会い千葉出会い愛媛出会い福井出会い福岡出会い福島出会い岐阜出会い群馬出会い広島出会い北海道出会い兵庫出会い茨城出会い石川出会い岩手出会い香川出会い鹿児島出会い神奈川出会い高知

Anonymous said...

出会い熊本出会い京都出会い三重出会い宮城出会い宮崎出会い長野出会い長崎出会い奈良出会い新潟出会い大分出会い岡山出会い沖縄出会い大阪出会い佐賀出会い埼玉出会い滋賀出会い島根出会い静岡出会い栃木出会い徳島

Anonymous said...

福井出会いカフェ愛知出会いカフェ岐阜出会いカフェ静岡出会いカフェ三重出会いカフェ兵庫出会いカフェ大阪出会いカフェ和歌山出会いカフェ滋賀出会いカフェ京都出会いカフェ奈良出会いカフェ山口出会いカフェ鳥取出会いカフェ島根出会いカフェ岡山出会いカフェ広島出会いカフェ徳島出会いカフェ香川出会いカフェ愛媛出会いカフェ高知出会いカフェ

Anonymous said...

出会い東京出会い大阪出会い福岡出会い兵庫出会い神奈川出会い宮城出会い千葉出会い愛知出会い埼玉出会い青森出会い岩手出会い秋田出会い山形出会い山口出会い東京出会い鳥取出会い富山出会い和歌山出会い山形

Anonymous said...

出会い奈良出会い滋賀出会い三重出会い和歌山出会い愛知出会い静岡出会い岐阜出会い広島出会い岡山出会い山口出会い島根出会い鳥取出会い富山出会い石川出会い福井出会い徳島出会い香川出会い愛媛出会い高知出会い福岡

Anonymous said...

セフレ奈良セフレ滋賀セフレ三重セフレ和歌山セフレ愛知セフレ静岡セフレ岐阜セフレ広島セフレ岡山セフレ山口セフレ島根セフレ鳥取セフレ富山セフレ石川セフレ福井セフレ徳島セフレ香川セフレ愛媛セフレ高知セフレ福岡

Anonymous said...

福井テレクラ愛知テレクラ岐阜テレクラ静岡テレクラ三重テレクラ兵庫テレクラ大阪テレクラ和歌山テレクラ滋賀テレクラ京都テレクラ奈良テレクラ山口テレクラ鳥取テレクラ島根テレクラ岡山テレクラ広島テレクラ徳島テレクラ香川テレクラ愛媛テレクラ高知テレクラ

Anonymous said...

福井セフレ愛知セフレ岐阜セフレ静岡セフレ三重セフレ兵庫セフレ大阪セフレ和歌山セフレ滋賀セフレ京都セフレ奈良セフレ山口セフレ鳥取セフレ島根セフレ岡山セフレ広島セフレ徳島セフレ香川セフレ愛媛セフレ高知セフレ

asdfsadf said...

nike shoes, jordan shoes, nike dunks, nike air force 1, nike shox, nike shoes, nike shox, nike dunks, nike air force 1, nike shox, nike shoes, nike shox oz, nike shox nz, nike shox r3, nike shox r4, nike shox r5, nike shox tl
nike air force 1










nike Air Force 1, nike shoes, Jordan shoes, nike sb dunks, cheap nike Air Force 1, cheap nike shoes, cheap Jordan shoes, cheap nike sb dunks, discount nike Air Force 1, discount nike shoes, discount Jordan shoes, discount nike sb dunks, nike shoes, nike shox, nike dunks, nike air force 1, jordan shoes, nike shoes, nike shox, nike dunks, nike air force 1, jordan shoes












nike shoes, nike shox, jordan shoes, puma shoes, nike dunks, nike air max, nike air force one, timberland boots, ugg boots, nike shoes, nike shox, nike air force 1, nike sb dunks, puma shoes, nike air max, jordan shoes, ugg boot, jordan sneakers, timberland shoes, bape shoes, nike shoes, nike shox, nike dunks, nike air force 1, jordan shoes

セフレ 不倫 出会い メル友 said...

無料 出会い 競馬予想 無料 競馬予想 競馬予想 無料 競馬予想 無料 競馬予想 無料 近視 手術 メル友 出会い 出会い 出会い 出会い メル友 メル友 人妻 メル友 ギャンブル依存症 AV女優 無料 出会い 出逢い 掲示板 出会い系 無料 出会い 人妻 出会い 人妻 出会い セフレ 人妻 出会い セックスフレンド メル友 出会い SM 愛人 不倫 セフレ 無料 出会い 出会い系 無料 無料 出会い 富士山 写真 富士山 メル友 無臭性動画 カリビアムコム 一本堂 出会い 人妻 セックスフレンド ハメ撮り エッチな0930 メル友 無料 出会い 無料 出会い セフレ セフレ セフレ セックスフレンド セックスフレンド セックスフレンド 人妻 出会い 人妻 出会い 人妻 出会い 出会い系 出会い系 出会い系 カリビアンカム カリビアンカム

products said...

China Wholesale has been described as the world’s factory. This phenomenom is typified by the rise ofbusiness. Incredible range of products available with China Wholesalers “Low Price and High Quality” not only reaches directly to their target clients worldwide but also ensures that wholesale from china from China means margins you cannot find elsewhere and buy products wholesaleChina Wholesale will skyroket your profits.

products said...

Women’s nike tn Shox Rivalry est le modèle féminin le plus tendance de baskets pour le sport. tn chaussuresConcernant la semelle :Cheap Brand Jeans ShopMen Jeans - True Religion Jeans nike shoes & Puma Shoes Online- tn nike, le caoutchouc extérieur, l’EVA intermédiaire et le textile intérieur s’associent pour attribuer à la.ed hardy shirts pretty fitCharlestoncheap columbia jackets. turned a pair of double plays to do the trick.Lacoste Polo Shirts, , Burberry Polo Shirts.wholesale Lacoste polo shirts and cheap polo shirtswith great price.Thank you so much!!cheap polo shirts men'ssweate,gillette mach3 razor bladesfor men.As for

Anonymous said...

情趣用品|情趣用品|情趣用品|情趣|情趣用品|情趣

eda said...

情趣按摩棒,自慰套,角色扮演,按摩棒,跳蛋,跳蛋,
情趣,情趣,角色扮演服,吊帶襪,丁字褲,情趣用品,情趣用品,跳蛋,男女,
潤滑液,SM,情趣內衣,內衣,性感內衣,自慰器,充氣娃娃,AV,
按摩棒,電動按摩棒,飛機杯,視訊,自慰套,自慰套,

Term Papers said...

I have been visiting various blogs for my term papers writing research. I have found your blog to be quite useful. Keep updating your blog with valuable information... Regards

About Me

My photo
I'm a software developer who started programming at age 16 and never saw any reason to stop. I'm working on the Presentation Platform Controls team at Microsoft. My primary interests are functional programming, and Rich Internet Applications.