What, Why, How Create OSS Libraries -...
-
Upload
yoshifumi-kawai -
Category
Technology
-
view
19.136 -
download
4
Transcript of What, Why, How Create OSS Libraries -...
#2 2009-10-29http://linqcomparer.codeplex.com/
source.Distinct(x => x.Age);
class EqualityComparer<T> : IEqualityComparer<T>{
readonly Func<T, T, bool> equals;readonly Func<T, int> getHashCode;
public EqualityComparer(Func<T, T, bool> equals, Func<T, int> getHashCode){
this.equals = equals;this.getHashCode = getHashCode;
}
public bool Equals(T x, T y){
return equals(x, y);}
public int GetHashCode(T obj){
return getHashCode(obj);}
}
// (object x) => (object)((T)x).namestatic Func<object, object> CreateGetValue(Type type, string name){
var x = Expression.Parameter(typeof(object), "x");
var func = Expression.Lambda<Func<object, object>>(Expression.Convert(
Expression.PropertyOrField(type.IsValueType ? Expression.Unbox(x, type) : Expression.Convert(x, type),name),
typeof(object)),x);
return func.Compile();}
#4 2010-04-30http://dynamicjson.codeplex.com/
// Parse (JsonString to DynamicJson)var json = DynamicJson.Parse(@“{
""foo"":""json"",""bar"":100,""nest"":{""foobar"":true
}}");
// "Json" - dynamic(string)var r1 = json.foo;
// 100 - dynamic(double)var r2 = json.bar;
// true - dynamic(bool)var r3 = json.nest.foobar;
#4 2010-04-30http://dynamicjson.codeplex.com/
// Parse (JsonString to DynamicJson)var json = DynamicJson.Parse(@“{
""foo"":""json"",""bar"":100,""nest"":{""foobar"":true
}}");
// "Json" - dynamic(string)var r1 = json.foo;
// 100 - dynamic(double)var r2 = json.bar;
// true - dynamic(bool)var r3 = json.nest.foobar;
public class DynamicObject : IDynamicMetaObjectProvider{
public virtual IEnumerable<string> GetDynamicMemberNames();public virtual DynamicMetaObject GetMetaObject(Expression parameter);public virtual bool TryBinaryOperation(BinaryOperationBinder binder, object arg, out objectpublic virtual bool TryConvert(ConvertBinder binder, out object result);public virtual bool TryCreateInstance(CreateInstanceBinder binder, object[] args, out objectpublic virtual bool TryDeleteIndex(DeleteIndexBinder binder, object[] indexes);public virtual bool TryDeleteMember(DeleteMemberBinder binder);public virtual bool TryGetIndex(GetIndexBinder binder, object[] indexes, out object result);public virtual bool TryGetMember(GetMemberBinder binder, out object result);public virtual bool TryInvoke(InvokeBinder binder, object[] args, out object result);public virtual bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result);public virtual bool TrySetIndex(SetIndexBinder binder, object[] indexes, object value);public virtual bool TrySetMember(SetMemberBinder binder, object value);public virtual bool TryUnaryOperation(UnaryOperationBinder binder, out object result);
}
#7 2011-02-22https://chainingassertion.codeplex.com/
https://github.com/neuecc/ChainingAssertion
#8 2011-10-17http://reactiveproperty.codeplex.com/
https://github.com/runceel/ReactiveProperty
#9 2012-02-18http://implicitquerystring.codeplex.com/
int x = Request.QueryString.ParseValue("hoge");DateTime y = Request.QueryString.ParseValue("huga");
public struct ConvertableString{
readonly string value;
public ConvertableString(string value){
this.value = value;}
public static implicit operator Boolean(ConvertableString self){
return Boolean.Parse(self.value);}
public static implicit operator Int32(ConvertableString self){
return Int32.Parse(self.value);}// ...
}
#11 2012-12-03https://github.com/neuecc/MemcachedTranscoder
#14 2013-12-06https://github.com/neuecc/OwinRequestScopeContext
#15 2013-12-08https://github.com/neuecc/Owin.RedisSession
#16 2013-12-23https://github.com/neuecc/LightNode
public class My : LightNodeContract{
public string Echo(string x){
return x;}
public Task<int> Sum(int x, int? y, int z = 1000){
return Task.Run(() => x + y.Value + z);}
}
public enum RespType : byte{
SimpleStrings = (byte)'+',Erorrs = (byte)'-',Integers = (byte)':',BulkStrings = (byte)'$',Arrays = (byte)'*'
}
#20 2014-10-28https://github.com/neuecc/LINQ-to-GameObject-for-Unity
List<T>.Enumerator構造体
再帰イテレーター is EvilIEnumerable<GameObject> Descendants(GameObject root){
yield return root;foreach (Transform item in root.transform){
foreach (var child in Descendants(item.gameObject)){
yield return child.gameObject;}
}}
#22 2015-03-30https://github.com/neuecc/NotifyPropertyChangedGenerator
#24 2016-03-18https://github.com/neuecc/SerializableDictionary
#25 2012-05-23https://github.com/neuecc/MarkdownGenerator
#27 2016-06-07https://github.com/neuecc/ObserveEveryValueChanged
public partial class MainWindow : Window{
this.ObserveEveryValueChanged(x => x.Width);this.ObserveEveryValueChanged(x => x.Height);
}
linq.js, UniRx, LINQ to GameObject, LINQ to BigQuery
LINQとは何であるかの掲示
ChainingAssertion
流れるようなインターフェイスや英語的なるものへの反逆
ReactiveProperty
MVVMへの異質なアプローチ
NotifyPropertyChangedGenerator
Roslyn時代のコーディング手法
LightNode, PhotonWire
現代的な観点でのRPCの再評価
ライブラリは思想の塊であり、言葉だけよりも、むしろずっと流暢に語ってくれる
言葉に、より強い証明、より強力な説得力をもたらす