What, Why, How Create OSS Libraries - 過去に制作した30のライブラリから見るC#コーディングテクニックと個人OSSの原理原則

21,427 views

Published on

.NetFringe Japan 2016-10-01

Published in: Technology
0 Comments
19 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
21,427
On SlideShare
0
From Embeds
0
Number of Embeds
17,425
Actions
Shares
0
Downloads
31
Comments
0
Likes
19
Embeds 0
No embeds

No notes for slide

What, Why, How Create OSS Libraries - 過去に制作した30のライブラリから見るC#コーディングテクニックと個人OSSの原理原則

  1. 1. Work C# Unity Private http://neue.cc/ @neuecc
  2. 2. using C
  3. 3. in 8 years
  4. 4. What? Why? How?
  5. 5. Codeplex Era
  6. 6. というものがありました。 産廃
  7. 7. #1 2009-04-04 http://linqjs.codeplex.com/
  8. 8. LINQってJavaScriptでもできそうだね やるからには勝ちたい #勝ちとは
  9. 9. LINQってJavaScriptでもできそうだね やるからには勝ちたい #勝ちとは
  10. 10. Pros Cons
  11. 11. #2 2009-10-29 http://linqcomparer.codeplex.com/ source.Distinct(x => x.Age);
  12. 12. 小さくっても全然良い
  13. 13. 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); }
  14. 14. #3 2010-04-07 http://dbexecutor.codeplex.com/
  15. 15. #3 2010-04-07 http://dbexecutor.codeplex.com/
  16. 16. // (object x) => (object)((T)x).name static 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(); }
  17. 17. #4 2010-04-30 http://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;
  18. 18. #4 2010-04-30 http://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;
  19. 19. public class DynamicObject : IDynamicMetaObjectProvider { public virtual IEnumerable<string> GetDynamicMemberNames(); public virtual DynamicMetaObject GetMetaObject(Expression parameter); public virtual bool TryBinaryOperation(BinaryOperationBinder binder, object arg, out object public virtual bool TryConvert(ConvertBinder binder, out object result); public virtual bool TryCreateInstance(CreateInstanceBinder binder, object[] args, out objec public 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 re 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); }
  20. 20. #5 2010-07-15 http://xstreamingreader.codeplex.com/
  21. 21. #6 2010-09-12 http://reactiveoauth.codeplex.com/
  22. 22. #7 2011-02-22 https://chainingassertion.codeplex.com/ https://github.com/neuecc/ChainingAssertion
  23. 23. BDD, assertThat, fluent interface... ユニットテストへの思索を深める
  24. 24. #8 2011-10-17 http://reactiveproperty.codeplex.com/ https://github.com/runceel/ReactiveProperty
  25. 25. 実装は単純、思想は深遠
  26. 26. #9 2012-02-18 http://implicitquerystring.codeplex.com/ int x = Request.QueryString.ParseValue("hoge"); DateTime y = Request.QueryString.ParseValue("huga");
  27. 27. 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); } // ... }
  28. 28. #10 2012-04-02 http://hashmapper.codeplex.com/
  29. 29. GitHub Era
  30. 30. #11 2012-12-03 https://github.com/neuecc/MemcachedTranscoder
  31. 31. 「サイズ」と「速度」 圧縮とフォーマットは別 バージョニングとダンプ耐性も大事
  32. 32. #12 2013-02-27 https://github.com/neuecc/AsyncOAuth
  33. 33. ライブラリのためのasync/await
  34. 34. #13 2013-04-05 https://github.com/neuecc/CloudStructures
  35. 35. #14 2013-12-06 https://github.com/neuecc/OwinRequestScopeContext
  36. 36. CallContext #とは
  37. 37. #15 2013-12-08 https://github.com/neuecc/Owin.RedisSession
  38. 38. #16 2013-12-23 https://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); } }
  39. 39. DLL is IDL(Interface definition language)
  40. 40. #17 2013-12-23 https://github.com/neuecc/RespClient
  41. 41. public enum RespType : byte { SimpleStrings = (byte)'+', Erorrs = (byte)'-', Integers = (byte)':', BulkStrings = (byte)'$', Arrays = (byte)'*' }
  42. 42. #18 2014-05-28 https://github.com/neuecc/UniRx
  43. 43. (.NET関連で)GitHub Starを尺度にすると サポートは丁寧に。
  44. 44. #19 2014-09-24 https://github.com/neuecc/LINQ-to-BigQuery
  45. 45. Not IQueryable
  46. 46. #20 2014-10-28 https://github.com/neuecc/LINQ-to-GameObject-for-Unity
  47. 47. List<T>.Enumerator構造体 再帰イテレーター is Evil IEnumerable<GameObject> Descendants(GameObject root) { yield return root; foreach (Transform item in root.transform) { foreach (var child in Descendants(item.gameObject)) { yield return child.gameObject; } } }
  48. 48. #21 2015-01-14 https://github.com/neuecc/Open-on-GitHub
  49. 49. #22 2015-03-30 https://github.com/neuecc/NotifyPropertyChangedGenerator
  50. 50. #23 2015-11-03 https://github.com/neuecc/EtwStream
  51. 51. テキストログ #とは ログのパフォーマンス
  52. 52. #24 2016-03-18 https://github.com/neuecc/SerializableDictionary
  53. 53. #25 2012-05-23 https://github.com/neuecc/MarkdownGenerator
  54. 54. #26 2016-05-31 https://github.com/neuecc/PhotonWire
  55. 55. #27 2016-06-07 https://github.com/neuecc/ObserveEveryValueChanged public partial class MainWindow : Window { this.ObserveEveryValueChanged(x => x.Width); this.ObserveEveryValueChanged(x => x.Height); }
  56. 56. TBD
  57. 57. Reactive, ReImplemented Motion Library
  58. 58. Infinitely Fast Serializer for C# デシリアライズ速度 無限大高速な、新シリアライザ+フォーマット
  59. 59. Next Generation has come
  60. 60. Next Generation has come
  61. 61. Conclusion
  62. 62. linq.js, UniRx, LINQ to GameObject, LINQ to BigQuery LINQとは何であるかの掲示 ChainingAssertion 流れるようなインターフェイスや英語的なるものへの反逆 ReactiveProperty MVVMへの異質なアプローチ NotifyPropertyChangedGenerator Roslyn時代のコーディング手法 LightNode, PhotonWire 現代的な観点でのRPCの再評価 ライブラリは思想の塊であり、 言葉だけよりも、むしろずっと 流暢に語ってくれる 言葉に、より強い証明、よ り強力な説得力をもたらす
  63. 63. 経験値を貯めよう 小さなライブラリでの経験が、大きなライブラリに繋がる 特別なものは必要ない(本当に新規のアイディアなど存在しない、 LINQですら古来の関数型言語からの援用なのだから!) 人に見せるものを意識する 自分のために作ってるんだし、ではなく意識したパッケージング コードの書き方、見せ方、ウリを作るための機能の取捨、他人に 使ってもらうことを意識するとだいぶ違ってくる 機会はそんなに多くない!(8年間で、ある意味「たった」30回) なので、一つ一つの機会を大事にして欲しい

×