しるふぃずむ

どうもプログラマです。好きなものはC#とジンギスカンです。嫌いなものはJava。プログラムおもちろいね。

Visual Studio 2015 リリース記念 勉強会 (C#UG)

Visual Studio 2015 リリース記念 勉強会 (C#UG) - 日本C#ユーザー会 | Doorkeeperに参加します。 久々の勉強会、楽しんできます。

C#6.0、いろいろいじり倒したい。

csugjp.doorkeeper.jp

GNUWin32: GNU tools in Windows

社内講習でgrep, awk, sedなんかのコマンドラインツールに関する講義を聞いてきました. 久々にgnu grepを触って,\dが使えないのに戸惑いました.

普段の業務はWindowsで,他の人でも使えるようにと考えると普通のbat+JScriptで書くくらいしかできないんですが折角なのでWindowsでもこの辺りのツールを使えるように整備.

DOSのバッチにいれこむことを考えると,cygwinなんかで入れるのは除外. MinGWでも悪くはないでしょうが,Windowsバイナリで配布されてるので今回はこれで.

GnuWin32

このあたり: GnuWin - Browse Files at SourceForge.netからzipを落としてきて適当に展開するだけで大体問題なく. 全部Pathを通しちゃうとfindとかがWindows標準と被ってるのが心配なので,シンボリックリンクとかで何とかしたいですかね.とりあえず保留.

WindowsCUIは標準でやろうとするとものすごく貧弱で残念なわけですが,なんとかならないんでしょうかね. Windows10ですこしコマンドプロンプトが強化されるなんて話も聞いたので,少し期待.

Swiftのライブラリ周り

iOSアプリを作ろうと調査中。 取りあえずSwiftのplaygroundで言語自体の癖を試しつつ。 Optional周りはさすが後発言語、中々良いかも。

  • ライブラリ管理

    • cocoaPods
  • テスト

    • XCTest: 本家のテストフレームワーク
    • Quick: BDD開発 動かせるようなら使ってみたい
  • Rx

    • kzaher/RxSwift: 活発なようなのでまずこれから試してみる
    • jspahrsummers/RxSwift: 更新とまってるっぽい
    • ReactiveCocoa: objective-c。呼べるみたいだけどできれば使いたくない
  • WebAPI回り

    • SwiftyJSON: JSON操作ライブラリ
    • Alamofire: HTTP通信ライブラリ

Visual Studio Code

Visual Studio Code、使ってみました。

Visual StudioのエディタとGitリポジトリ管理、デバッガの機能だけを抜き出したようなテキストエディタLinuxにもMacOSXにも対応しているので、手になじめば結構便利かもしれません。 手軽にgitで管理しながら軽快にかけるので良い感じ。 欠点に感じているところは十分この先解消されそうかなと思ってます。今後に期待。

f:id:yuhsylphy:20150513221816p:plain

良い点
  • 軽い  インストールが一瞬過ぎて驚きました。起動もサクサクで、使用感はいい感じ。
  • 設定がJSON  Preferenceを開くと、左にReadonlyのデフォルト設定群と右に空の個人設定用領域。何が設定できるのか、デフォルト値が何なのか、とても分かりやすく編集しやすく、かつ別環境に移植しやすくて良いと思います。
悪い点
  • 文字エンコーディングがほぼ決め打ち  UTF-8, UTF-16にしか対応しておらず、違うエンコーディングで読み込みなおすオプションも無いようです。 手元で使うだけならいいですが、仕事だとどうしてもcp932とか読まなきゃいけないケースがあるのでまだ使えなさそうで残念。 あとは、新規作成したUTF-8にBOMがつかないこと。いや、デフォルトがBOMなしなのはとても良いんですが、Visual StudioとかMSVCとかEXCEL(csv)とかがどれもBOM付きUTF-8しか受け付けないのにBOMをつけるオプションも見当たらない。 このあたり、もし方法があるならだれかご存知の方教えてください。
  • EXPLOREタブ?がUNCパス未対応  Openから直には開けるんですが、EXPLOREでネットワークパス上を指定するとファイルは見えるのに開けない。ちょっと残念。
  • IMEとの相性  確定直後に間髪入れず入力するとひとつ前に入力していたものが上書きされたり、全角スペースがうまく入力できなかったりと、多言語対応は甘い感じ。
  • エディタ分割が縦のみ  横分割(上下に配置)ができない。今のところ困っていませんが、欲しくなることもありそう。
未確認
  • デバッグ  Node.jsなんかのステップ実行とかができるようですが、やってません。 C#なんかはデバッグできないのかしら。

話題の本

f:id:yuhsylphy:20150510190025j:plain

困った評価の多い話題の本を買いました。 ちょっとずつ読み進めます。

paizaで使うIxの簡易実装

使うとこだけ作った。
マルチスレッド対応とかは知らない。

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

/// <summary>
/// System.Interactiveのシンタックスをコピー
/// </summary>
public static class EnumerableEx
{
    private static void CheckNullArgument<T>(T arg, string name)
    {
        if(arg == null)
        {
            throw new ArgumentNullException(name);
        }
    }
    
    public static IEnumerable<TResult> Generate<TState, TResult>(
        TState initialState, 
        Func<TState, bool> condition, 
        Func<TState, TState> iterate, 
        Func<TState, TResult> resultSelector
        )
    {
        CheckNullArgument(condition, "condition");
        CheckNullArgument(iterate, "iterate");
        CheckNullArgument(resultSelector, "resultSelector");

        for (var i = initialState; condition(i); i = iterate(i))
        {
            yield return resultSelector(i);
        }
    }

    public static void ForEach<TSource>(this IEnumerable<TSource> source, Action<TSource> onNext)
    {
        CheckNullArgument(source, "source");
        CheckNullArgument(onNext, "onNext");
        
        foreach(var x in source)
        {
            onNext(x);
        }
    }
    
    public static void ForEach<TSource>(this IEnumerable<TSource> source, Action<TSource, int> onNext)
    {
        CheckNullArgument(source, "source");
        CheckNullArgument(onNext, "onNext");
        
        var i = 0;
        foreach(var x in source)
        {
            onNext(x, i++);
        }
    }
    
    public static IEnumerable<TSource> Memoize<TSource>(this IEnumerable<TSource> source)
    {
        CheckNullArgument(source, "source");
        
        return new Memoized<TSource>(source.GetEnumerator());
    }
    
    /// <summary>
    /// Memoize簡易実装
    /// </summary>
    private class Memoized<T>: IEnumerable<T>
    {
        private IEnumerator<T> Src { get; set; }
        private List<T> Buf { get; set; }
        
        public Memoized(IEnumerator<T> src)
        {
            Src = src;
            
            var src_ = src as ICollection<T>; 
            if(src_ != null)
            {
                Buf = new List<T>(src_.Length);
                return;
            }
            var src__ = src as T[];
            if(src__ != null)
            {
                Buf = new List<T>(src__.Length);
                return;
            }
            Buf = new List<T>();
        }
        
        public IEnumerator<T> GetEnumerator()
        {
            for(var i = 0; true; ++i)
            {
                var hasValue = true;
                if (i >= Buf.Count)
                {
                    hasValue = Src.MoveNext();
                    if(hasValue)
                    {
                        Buf.Add(Src.Current);
                    }
                }

                if(hasValue)
                {
                    yield return Buf[i];
                }
                else
                {
                    yield break;
                }
            }
        }
        
        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
        {
            return this.GetEnumerator();
        }
    }
}