$30 off During Our Annual Pro Sale. View Details »

What__Why__How_Create_OSS_Libraries_-_過去に制作した30のライブラリから見るC_コーディングテクニックと個人OSSの原理原則.pdf

Yoshifumi Kawai
October 01, 2016
55

 What__Why__How_Create_OSS_Libraries_-_過去に制作した30のライブラリから見るC_コーディングテクニックと個人OSSの原理原則.pdf

Yoshifumi Kawai

October 01, 2016
Tweet

More Decks by Yoshifumi Kawai

Transcript

  1. View Slide

  2. Work
    C#
    Unity
    Private
    http://neue.cc/
    @neuecc

    View Slide

  3. using C

    View Slide

  4. in 8 years

    View Slide

  5. View Slide

  6. What?
    Why?
    How?

    View Slide

  7. Codeplex Era

    View Slide

  8. というものがありました。
    産廃

    View Slide

  9. #1 2009-04-04
    http://linqjs.codeplex.com/

    View Slide

  10. LINQってJavaScriptでもできそうだね
    やるからには勝ちたい #勝ちとは

    View Slide

  11. LINQってJavaScriptでもできそうだね
    やるからには勝ちたい #勝ちとは

    View Slide

  12. Pros
    Cons

    View Slide

  13. #2 2009-10-29
    http://linqcomparer.codeplex.com/
    source.Distinct(x => x.Age);

    View Slide

  14. 小さくっても全然良い

    View Slide

  15. class EqualityComparer : IEqualityComparer
    {
    readonly Func equals;
    readonly Func getHashCode;
    public EqualityComparer(Func equals, Func 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);
    }

    View Slide

  16. #3 2010-04-07
    http://dbexecutor.codeplex.com/

    View Slide

  17. #3 2010-04-07
    http://dbexecutor.codeplex.com/

    View Slide

  18. // (object x) => (object)((T)x).name
    static Func CreateGetValue(Type type, string name)
    {
    var x = Expression.Parameter(typeof(object), "x");
    var func = Expression.Lambda>(
    Expression.Convert(
    Expression.PropertyOrField(
    type.IsValueType ? Expression.Unbox(x, type) : Expression.Convert(x, type),
    name),
    typeof(object)),
    x);
    return func.Compile();
    }

    View Slide

  19. #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;

    View Slide

  20. #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;

    View Slide

  21. public class DynamicObject : IDynamicMetaObjectProvider
    {
    public virtual IEnumerable 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);
    }

    View Slide

  22. #5 2010-07-15
    http://xstreamingreader.codeplex.com/

    View Slide

  23. #6 2010-09-12
    http://reactiveoauth.codeplex.com/

    View Slide

  24. #7 2011-02-22
    https://chainingassertion.codeplex.com/
    https://github.com/neuecc/ChainingAssertion

    View Slide

  25. BDD, assertThat, fluent interface...
    ユニットテストへの思索を深める

    View Slide

  26. #8 2011-10-17
    http://reactiveproperty.codeplex.com/
    https://github.com/runceel/ReactiveProperty

    View Slide

  27. 実装は単純、思想は深遠

    View Slide

  28. #9 2012-02-18
    http://implicitquerystring.codeplex.com/
    int x = Request.QueryString.ParseValue("hoge");
    DateTime y = Request.QueryString.ParseValue("huga");

    View Slide

  29. 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);
    }
    // ...
    }

    View Slide

  30. #10 2012-04-02
    http://hashmapper.codeplex.com/

    View Slide

  31. GitHub Era

    View Slide

  32. #11 2012-12-03
    https://github.com/neuecc/MemcachedTranscoder

    View Slide

  33. 「サイズ」と「速度」
    圧縮とフォーマットは別
    バージョニングとダンプ耐性も大事

    View Slide

  34. #12 2013-02-27
    https://github.com/neuecc/AsyncOAuth

    View Slide

  35. ライブラリのためのasync/await

    View Slide

  36. #13 2013-04-05
    https://github.com/neuecc/CloudStructures

    View Slide

  37. View Slide

  38. #14 2013-12-06
    https://github.com/neuecc/OwinRequestScopeContext

    View Slide

  39. CallContext #とは

    View Slide

  40. #15 2013-12-08
    https://github.com/neuecc/Owin.RedisSession

    View Slide

  41. #16 2013-12-23
    https://github.com/neuecc/LightNode
    public class My : LightNodeContract
    {
    public string Echo(string x)
    {
    return x;
    }
    public Task Sum(int x, int? y, int z = 1000)
    {
    return Task.Run(() => x + y.Value + z);
    }
    }

    View Slide

  42. DLL is IDL(Interface definition language)

    View Slide

  43. #17 2013-12-23
    https://github.com/neuecc/RespClient

    View Slide

  44. public enum RespType : byte
    {
    SimpleStrings = (byte)'+',
    Erorrs = (byte)'-',
    Integers = (byte)':',
    BulkStrings = (byte)'$',
    Arrays = (byte)'*'
    }

    View Slide

  45. #18 2014-05-28
    https://github.com/neuecc/UniRx

    View Slide

  46. (.NET関連で)GitHub Starを尺度にすると
    サポートは丁寧に。

    View Slide

  47. #19 2014-09-24
    https://github.com/neuecc/LINQ-to-BigQuery

    View Slide

  48. Not IQueryable

    View Slide

  49. #20 2014-10-28
    https://github.com/neuecc/LINQ-to-GameObject-for-Unity

    View Slide

  50. List.Enumerator構造体
    再帰イテレーター is Evil
    IEnumerable Descendants(GameObject root)
    {
    yield return root;
    foreach (Transform item in root.transform)
    {
    foreach (var child in Descendants(item.gameObject))
    {
    yield return child.gameObject;
    }
    }
    }

    View Slide

  51. #21 2015-01-14
    https://github.com/neuecc/Open-on-GitHub

    View Slide

  52. #22 2015-03-30
    https://github.com/neuecc/NotifyPropertyChangedGenerator

    View Slide

  53. #23 2015-11-03
    https://github.com/neuecc/EtwStream

    View Slide

  54. テキストログ #とは
    ログのパフォーマンス

    View Slide

  55. #24 2016-03-18
    https://github.com/neuecc/SerializableDictionary

    View Slide

  56. #25 2012-05-23
    https://github.com/neuecc/MarkdownGenerator

    View Slide

  57. #26 2016-05-31
    https://github.com/neuecc/PhotonWire

    View Slide

  58. View Slide

  59. View Slide

  60. #27 2016-06-07
    https://github.com/neuecc/ObserveEveryValueChanged
    public partial class MainWindow : Window
    {
    this.ObserveEveryValueChanged(x => x.Width);
    this.ObserveEveryValueChanged(x => x.Height);
    }

    View Slide

  61. TBD

    View Slide

  62. Reactive, ReImplemented Motion Library

    View Slide

  63. Infinitely Fast Serializer for C#
    デシリアライズ速度
    無限大高速な、新シリアライザ+フォーマット

    View Slide

  64. Next Generation has come

    View Slide

  65. Next Generation has come

    View Slide

  66. Conclusion

    View Slide

  67. linq.js, UniRx, LINQ to GameObject, LINQ to BigQuery
    LINQとは何であるかの掲示
    ChainingAssertion
    流れるようなインターフェイスや英語的なるものへの反逆
    ReactiveProperty
    MVVMへの異質なアプローチ
    NotifyPropertyChangedGenerator
    Roslyn時代のコーディング手法
    LightNode, PhotonWire
    現代的な観点でのRPCの再評価
    ライブラリは思想の塊であり、
    言葉だけよりも、むしろずっと
    流暢に語ってくれる
    言葉に、より強い証明、よ
    り強力な説得力をもたらす

    View Slide

  68. 経験値を貯めよう
    小さなライブラリでの経験が、大きなライブラリに繋がる
    特別なものは必要ない(本当に新規のアイディアなど存在しない、
    LINQですら古来の関数型言語からの援用なのだから!)
    人に見せるものを意識する
    自分のために作ってるんだし、ではなく意識したパッケージング
    コードの書き方、見せ方、ウリを作るための機能の取捨、他人に
    使ってもらうことを意識するとだいぶ違ってくる
    機会はそんなに多くない!(8年間で、ある意味「たった」30回)
    なので、一つ一つの機会を大事にして欲しい

    View Slide