タグ

ブックマーク / bleis-tift.hatenablog.com (17)

  • Go言語のイケてない部分 - ぐるぐる~

    最近色々あって仕事Go言語を使っています。 色々割り切っている言語なので、こんなこと言ってもしゃーないんですが、言語設計はミスってるんじゃなかなぁ、と思わざるを得ない点が多々あります。 使い始めて1か月くらいなので間違ったことを書いているかもしれませんので、何かあれば指摘していただけるとありがたいです。 文ではネガばかり羅列していますが、ランタイムとツール周りは気に入っています。 Goのランタイムを使う、もっと洗練されたAlt Go的なものがあるといいのに(もしくはジェネリクスのったGo2を早くリリースしてほしい)、と思う日々です。 追記: なんか意図とは違った受け取られ方をしている方もいるので追記します。 この記事はあくまで、「Go言語を学ぶにあたって躓いた点」を列挙し、まとめ、理由を考えてみる(教えてもらう)ために書いたものです。 Go言語自体はDisってますが、Go言語ユーザーを

    Go言語のイケてない部分 - ぐるぐる~
  • re:僕にとってMaybe / Nullable / Optional が、どうしてもしっくりこないわけ。 - ぐるぐる~

    元ネタ: 僕にとってMaybe / Nullable / Optional が、どうしてもしっくりこないわけ。 - 亀岡的プログラマ日記 OOPの文脈で見ると、元の記事が言っていることもわからなくはないのですが、対象が広すぎていろいろと不正確になってしまっているので、ちょっとまとめてみます。 元の記事が対象にしているのは、Maybe / Optional / Nullableの3つです。 対応する型を持つ言語を見てみると、下記のようになります。 Maybe(Haskell) Optional(Swift/Java) Nullable(C#) これらは、「値がないこと」を表すもの、という見方では同じですが、それぞれ異なる価値観の元に作られています。 Maybe/OptionalとNullable これらはすべて型パラメータを取ります*1。 しかし、この中でNullableだけは型パラメータに

    re:僕にとってMaybe / Nullable / Optional が、どうしてもしっくりこないわけ。 - ぐるぐる~
  • ChalkTalk CLR – 動的コード生成技術(式木・IL等)に行ってきた - ぐるぐる~

    centerclr.doorkeeper.jp 直前で定員を増やしてもらえたので、参加できました。 会自体について 内容は主にILの話と式木の話で、ディスカッションというよりは講義に近い感じでした。 個人的にはディスカッション寄りの会を期待していたのですが、知識レベルにばらつきがあったのと、初めての取り組みということで仕方ないのかな、と。 次回以降で、もしディスカッション寄りの会をやりたいなら、「このを読了しており内容についてもある程度理解していること」とかにした方がより濃い内容のディスカッションができると思います。 聴講のみの席も用意すると、「ディスカッションに参加するのは怖いけど話は聞きたい」って人も参加できますし*1。 最初にKPTをして今回の方向性を決めよう、という試みは面白くはありましたが、会の最初にKも何もないので、KPTにとらわれずに「知りたいこと」「議論したいこと」みたい

    ChalkTalk CLR – 動的コード生成技術(式木・IL等)に行ってきた - ぐるぐる~
  • 再帰関数のスタックオーバーフローを倒す話 その1 - ぐるぐる~

    再帰関数のスタックオーバーフローを倒す話を何回かに分けてします。 連載目次 再帰関数のスタックオーバーフローを倒す話 その1 ← 今回 CPSとCPS変換の話 再帰関数のスタックオーバーフローを倒す話 その1.5 F#での「末尾」についての話 再帰関数のスタックオーバーフローを倒す話 その2 .NETにおける末尾最適化の方法についての話 再帰関数のスタックオーバーフローを倒す話 その2.5 継続モナドと、F#の残念さの話 再帰関数のスタックオーバーフローを倒す話 その3 すべてをあきらめて再帰をwhileに書き直す方法の話 はじめに 継続渡しスタイルもしくは継続渡し形式(Continuation Passing Style、以降CPS)という言葉を聞いたことがあるでしょうか。 今日はCPSの話をします。 前提知識は、F#のみです。 継続とは CPSの前に、まずは継続の話です。 継続と言って

    再帰関数のスタックオーバーフローを倒す話 その1 - ぐるぐる~
  • rebase で本番用の設定と開発用の設定を簡単に切り替える - ぐるぐる~

    rebase を使うと、番用の設定と開発用の設定を簡単に切り替えることができます。 rebase の基は rebase について - ぐるぐる〜 で説明しているので、ここまでは分かっている前提です。 例えば、ASP.NET番用と開発用の web.config が違うとします。 共用のリポジトリには開発用の web.config をコミットしてはいけません。 これをすべて手作業で行おうとすると、ついつい間違って開発用の web.config をコミットしてしまったり、ついつい間違えて開発用の web.config の内容がどこかにいっちゃったりすることがあります。 こういった事故を少なくするために、rebase を使います。 rebase --onto onto オプションを使用することで、ある地点 (ブランチ a とします) から分岐したブランチ (b とします) の分岐点から先

    rebase で本番用の設定と開発用の設定を簡単に切り替える - ぐるぐる~
  • Ruby嫌いがアンダースタンディングコンピュテーションを読んで - ぐるぐる~

    アンダースタンディング コンピュテーション―単純な機械から不可能なプログラムまで 作者: Tom Stuart,笹田耕一(監訳),笹井崇司出版社/メーカー: オライリージャパン発売日: 2014/09/18メディア: 大型この商品を含むブログ (2件) を見る 一番最初にはっきりさせておきますが、Rubyは嫌いな言語です。 が、このRubyが嫌いな自分でもいいだと言える*1でした。 自分が対象読者に入っているかどうかは実際に読んでみるまで微妙かな、と思っていましたが、とても楽しめました。 以下、書評です。 Rubyという選択 説明用のコードとして書はRubyを使っていますが、 これに関してはその理由が1章にあります。 私はその明瞭さと柔軟さに魅かれてRubyを選びました また、続けて 書にはRuby独自の機能に依存しているところはありません。 そのため、もしあなたにとってわか

    Ruby嫌いがアンダースタンディングコンピュテーションを読んで - ぐるぐる~
  • TestCase 属性などによるテストコードのリファクタリング - ぐるぐる~

    昨日のわんくまの昼休みに TDD 道場があったんですが、テストコードのリファクタリングについて賛否あったのでちょっと自分の考えをまとめておきます。 それに加え、C# と NUnit でどのようにテストコードをリファクタリングできるか、というのも紹介します。 というかこちらがメイン。 テストを追加した際に追加したテストだけを実行するか全部実行するかというのも意見が分かれたんですが、主に個別に指定するのが面倒という理由で全部実行する派です。 全部実行すると時間がかかる?それはもはや単体テストじゃないですね。重いテストは分割して分離しちゃいましょう。 これに関してはレガシーコード改善ガイド (Object Oriented SELECTION)をどうぞ。機会があればここら辺についても書きたいところです。 テストコードのリファクタリングについて まず、テストコードのリファクタリングはありだと思いま

    TestCase 属性などによるテストコードのリファクタリング - ぐるぐる~
  • 遅延評価ってなんなのさ - ぐるぐる~

    何なんでしょうね。分かりません。 自分の頭の中をとりあえず整理するためのエントリなので、あなたの頭を混乱させるだけになるかもしれません。 もし混乱してしまったら忘れてください。え、無理?忘れてください。 自分の考えを明確にしたので、こちらをどうぞ。 遅延評価いうなキャンペーンとかどうか - ぐるぐる~ これは遅延評価ですか? 関数を渡すだけ // Scala def hoge(f: Unit => Int) = for (i <- 1 to 2) println(f()) (* F# *) let hoge f = for i in 1..2 do printfn "%d" (f()) この関数に渡す f は 2 回実行されます。そのため、f の中で画面出力をしていた場合、2 回出力されます。 これは遅延評価でしょうか?俺は違うと思います。 ここは多くの人で合意が取れると思ってます。 Sc

    遅延評価ってなんなのさ - ぐるぐる~
    lepton9
    lepton9 2013/12/27
  • LangExtでのOptionの設計 - ぐるぐる~

    このエントリの最新版はGithubにあります。 Optionの意味を理解していることを前提に、直和型をC#で実現する方法についてを説明し、 LangExtではどういう方針を採用しているのかと、その理由について明らかにします。 バリアント型のC#での設計方針 Optionなどのバリアント型(VBのVariant型のことではありません)をC#で実現する場合、大まかに次の2つの方針があります。 型の階層で表現する タグを判別する値を持つようにする 一つ目の方法は、Option(もしくはMaybe)型の実現方法としてよく使われている方法です。 +-----------+ | Option[T] | +-----------+ △ | +-----+-----+ | | +---------+ +---------+ | Some[T] | | None[T] | +---------+ +----

    LangExtでのOptionの設計 - ぐるぐる~
    lepton9
    lepton9 2013/06/01
  • C# 使いから見てうらやましい Java8 の default 実装の使い方 - ぐるぐる~

    Java8 から追加されるインターフェイスの default 実装ですが、C# の拡張メソッドに似てますよね。 実際、このどちらも「シンインターフェイス」を定義するだけで「リッチインターフェイス」が手に入ります。 しかし、C# の拡張メソッドと Java のインターフェイスの default 実装には、それぞれの利点と欠点があります。 拡張メソッドの利点 拡張メソッドの利点は、インターフェイスの実装者だけでなく、 インターフェイスの使用者に対してもインターフェイスの拡張が開かれている点です。 既存の型ですら、後付けでメソッドを追加することができるということです。 using System; public static class StringExtension { // インターフェイスでなくても、どんな型に対しても拡張可能 public static int ToInt(this str

    C# 使いから見てうらやましい Java8 の default 実装の使い方 - ぐるぐる~
  • Java 8を関数型っぽく使うためのおまじないをC#でやってみた - ぐるぐる~

    Java 8を関数型っぽく使うためのおまじない - きしだのはてな Java は大変ですね。 C# さんは、ラムダ式も Func 型(Java の Function 型に大体対応)も Visual Studio 2008 時代(5年前)から使えたので、似たようなことはすでにできます。 上記の記事のパクリなので、上記の記事をまずは読んでから読むことをおすすめします。 Func 型 C# では Func デリゲートというものがあります。名前空間名や型パラメータまで含めると、System.Func<TArg, TResult> です。 こんな感じで使います。 Func<string, string> enclose = s => "[" + s + "]"; これを呼び出そうとすると、こんな感じになります。 // Javaだとenclose.apply("foo")と、applyが必要 Syst

    Java 8を関数型っぽく使うためのおまじないをC#でやってみた - ぐるぐる~
  • 並列/並行基礎勉強会でasync/awaitをDisってきた - ぐるぐる~

    async/await不要論 from bleis tift 3/23 に開催された、並列/並行基礎勉強会で「async/await 不要論」という発表をしてきました。 一番言いたかったこと 一番言いたかったことは、実は並列とかとは全く関係ないことです。 それは、言語への機能追加に関することです。 C# は 5.0 で非同期処理のための専用の構文として、async/await を導入しました。 これは、F# が計算一般という抽象度の高いものための汎用的な構文として、コンピュテーション式を採用しているのとは対照的です。 専用の構文を用意するかしないかは、その言語を取り巻く環境次第です。 専用の構文の利点と欠点 専用の構文の利点は、その使用用途が明確であるというところにあります。 そのため、書き方さえ覚えてしまえば、その裏で何がどうなるかなどを一切気にせずに使えてしまえたりします。 欠点は、専

  • 「変数に型がないということの利点について考える」の問題について考える - ぐるぐる~

    id:perlcodesample さんの 変数に型がないということの利点について考える - サンプルコードによるPerl入門 から。 ううむ。 けれども、型がないということは、当に素晴らしいことです。 型がないことによって、たくさんの面倒から解放されるからです。 冒頭のこれが、「静的型付き言語にはメリットが(ほとんど)ない」と言っているように思えてしまいます。 コメントのやり取りを見ても、ある程度そう考えているように受け取れます。 勘違いなどが多く見られたので、補足というか、反論というか、そんな感じのことを書きます。 追記: ごく一部、このエントリを「動的型付き言語と静的型付き言語を比べて、静的型付き言語の方が素晴らしい言語である」ということを言うためのものだと勘違いしている人を見かけました。 このエントリは、そこについては言及していません。 あくまで、元記事で「動的型付き言語のメリッ

    「変数に型がないということの利点について考える」の問題について考える - ぐるぐる~
  • 遅延評価いうなキャンペーンとかどうか - ぐるぐる~

    遅延評価については以前も書いてるんですが、そのときは結論なしでした。 が、ちょっと考えるところがあって、言語を Java に絞って自分の考えを明確にしておきます。 結論から書きましょう。 「Java(とC#) で遅延評価って書いてあるものは遅延評価ではない」です。 Java における「評価」とは まず一番最初に、Java で「評価」って言うと、どういうことを指すのかを確認しておきます。 言語仕様の該当部分を要約すると、こんな感じでしょうか。 プログラム中の式を評価すると、結果は 変数 値 無し のうちのどれかとなる。 評価した結果が値になる、というのはいいでしょう。それ以外の 2 つを軽く説明します。 評価の結果が「変数」とは? コメント欄で指摘が入っています。 代入の結果は変数ではありません(15.26)。 結果が変数となるのは、ローカル変数、現在のオブジェクトやクラスの変数、フィールド

  • Vim のキーマッピングを設定するときに注意していること - ぐるぐる~

    Vim Advent Calendar 2011 の参加エントリです。 何を書こうか迷ったんですが、Vim のキーマッピングをカスタマイズする際に個人的に気を付けていることをまとめることにしました。 あくまで自分の Vim の使い方なので、全ての人に「これを気を付けろ!」と言えるようなものではないですが、一つの例として参考にしていただけたらと。 はじめに そうやって一口にVimというがね、僕が好きなのは僕のVimだけなんだ。ひとのVimは大嫌いだ。 僕が好きなのは僕のVimだけなんだ - 理想未来はどうなった? これを読んで、「そうそう、そうだよね」となる人と、「何言ってんの?」となる人に分かれると思います。 前者は、Vim をバリバリカスタマイズしまくって、自分色に染め上げる気質の人で、後者はカスタマイズは最小限に済ませ、素の Vim を好む気質の人です。 カスタマイズしまくると、Vim

    Vim のキーマッピングを設定するときに注意していること - ぐるぐる~
  • Git 基礎最速マスター - ぐるぐる~

    id:repeatedly から無言の圧力を受けたので書きました。 タイトルは釣り。そもそも自分が Git マスターしてないし。突っ込み歓迎。超歓迎。 一応、このエントリだけで一つの Git リポジトリをそれなりに操れるようになることを目指してます。なので、コマンド一つ一つに対する説明じゃなくて、やりたいこと一つ一つに対する説明が中心です。え?それ最速マスターじゃない?きーこーえーなーいー。 あと、他のバージョン管理システム、例えば Subversion や Mercurial が使えることを前提としています。誰か「バージョン管理システム基礎最速マスター」とか書かないの? インストール Windows と Debian しか分かりませんので、自分のシステムに読み替えて行ってください。あと誰か Mac ください。 インストールも設定も終ってるよ!って方はリポジトリの作成までひとっ飛び。 Wi

    Git 基礎最速マスター - ぐるぐる~
  • NULLIF 関数の実用的な使い方 - ぐるぐる~

    NULLIF 関数って動作の説明は多いけど、それを何に使えばいいのかってあんまり理解されてないんじゃないかと思う。 ってことで、NULLIF 関数の実用的な使い方をいくつか紹介する。 NULLIF 関数の動作 まずは、NULLIF 関数の動作から。 NULLIF 関数は引数を 2 つとって、引数が等しい場合に NULL を返し、異なる場合に第一引数を返すだけの、動作自体はかなり簡単な関数。 例えば、 SELECT col_a, col_b, NULLIF(col_a, col_b) FROM SomeTable; これを実行すると、次のような結果が得られる。 col_a col_b NULLIF(col_a, col_b) 10 10 NULL 10 0 10 0 10 0 NULL NULL NULL また、プログラマのためのSQL 第2版では、CASE 式を用いて、 NULLIF(V1

    NULLIF 関数の実用的な使い方 - ぐるぐる~
  • 1