<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>プログラミング on 黒曜の吹き溜まり</title>
    <link>https://blog.kokuyouwind.com/categories/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0/</link>
    <description>Recent content in プログラミング on 黒曜の吹き溜まり</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>ja</language>
    <lastBuildDate>Sun, 22 Dec 2019 23:17:40 +0900</lastBuildDate>
    
	<atom:link href="https://blog.kokuyouwind.com/categories/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0/index.xml" rel="self" type="application/rss+xml" />
    
    
    <item>
      <title>セトリを見ながら感想を書けるサービスを作りたかった話</title>
      <link>https://blog.kokuyouwind.com/posts/2019/12/%E3%82%BB%E3%83%88%E3%83%AA%E3%82%92%E8%A6%8B%E3%81%AA%E3%81%8C%E3%82%89%E6%84%9F%E6%83%B3%E3%82%92%E6%9B%B8%E3%81%91%E3%82%8B%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%82%92%E4%BD%9C%E3%82%8A%E3%81%9F%E3%81%8B%E3%81%A3%E3%81%9F%E8%A9%B1/</link>
      <pubDate>Sun, 22 Dec 2019 23:17:40 +0900</pubDate>
      
      <guid>https://blog.kokuyouwind.com/posts/2019/12/%E3%82%BB%E3%83%88%E3%83%AA%E3%82%92%E8%A6%8B%E3%81%AA%E3%81%8C%E3%82%89%E6%84%9F%E6%83%B3%E3%82%92%E6%9B%B8%E3%81%91%E3%82%8B%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%82%92%E4%BD%9C%E3%82%8A%E3%81%9F%E3%81%8B%E3%81%A3%E3%81%9F%E8%A9%B1/</guid>
      <description>&lt;p&gt;この記事は&lt;a href=&#34;https://adventar.org/calendars/3920&#34; target=&#34;_blank&#34;&gt;アイドルマスター Advent Calendar 2019&lt;/a&gt;の21日目の記事です。思いっきり締め切りをぶっちしました……&lt;/p&gt;

&lt;p&gt;それもこれも、シャニマス2ndのチケットをくれないイープラスってやつの陰謀なんです……&lt;/p&gt;

&lt;p&gt;&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;und&#34; dir=&#34;ltr&#34;&gt;&lt;a href=&#34;https://t.co/Fwb8onkI5W&#34;&gt;pic.twitter.com/Fwb8onkI5W&lt;/a&gt;&lt;/p&gt;&amp;mdash; 黒曜@デレ7thナゴド両日現地 (@kokuyouwind) &lt;a href=&#34;https://twitter.com/kokuyouwind/status/1208240531886628864?ref_src=twsrc%5Etfw&#34;&gt;December 21, 2019&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src=&#34;https://platform.twitter.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;&lt;/p&gt;

&lt;p&gt;嘘です、普通に間に合いませんでした。&lt;/p&gt;

&lt;h3 id=&#34;ライブの感想をピンポイントに共感したい問題&#34;&gt;📝 ライブの感想をピンポイントに共感したい問題&lt;/h3&gt;

&lt;p&gt;突然ですが、みなさんライブに行くと「この曲の感想を知りたい」みたいな気持ちになりませんか？&lt;/p&gt;

&lt;p&gt;例えば、プロデューサー感謝祭で突如特殊イントロから始まった「NEO THEORY FANTASY」とか……&lt;/p&gt;

&lt;p&gt;例えば、演出なしでたった一人、センターステージでほたるちゃんが歌い上げた「谷の底で咲く花は」とか……&lt;/p&gt;

&lt;p&gt;ライブの中でも、特にその曲についての感想を知りたい！ 語り合いたい！ 「よかった……」「それな……」って共感したい！ ってなると思うんですよ。というかなった。&lt;/p&gt;

&lt;p&gt;とはいえ、こういった感想をピンポイントで探すのは結構困難です。&lt;/p&gt;

&lt;p&gt;ライブが終わるとTwitterでは「自分のエモ」をみんなが好き好きに語りだしますし、ツイートに曲名をしっかり入れているとは限りません。また時間が立つとTwitterでは探せなくなってしまいます。&lt;/p&gt;

&lt;p&gt;一方、いわゆるライブレポ記事は公演ごとになっており、そのなかから特定の曲の感想を探してまわるというのは大変ですし、「わかる、それな！」したいという軽い気持ちがどんどん失われていきます。&lt;/p&gt;

&lt;h3 id=&#34;曲ごとに感想をつけるサービス&#34;&gt;🎵 曲ごとに感想をつけるサービス&lt;/h3&gt;

&lt;p&gt;そもそも、ライブの感想は「頭から順」に思い出すより、セトリを眺めて「この曲はここがよかった」「あ、この曲はエモの塊だった」みたいに順不同で考えることが多い気がしますよね。&lt;/p&gt;

&lt;p&gt;ということは、「セトリを見ながら感想を曲ごとにつける」サービスがあれば、公演通したレポートも書きやすいし、曲ごとの感想を横串で見ることもできるのでは？&lt;/p&gt;

&lt;p&gt;と思って試しに作ってみたのが&lt;a href=&#34;https://shiny-live.glideapp.io/&#34; target=&#34;_blank&#34;&gt;shiny-live&lt;/a&gt;というアプリです。&lt;/p&gt;

&lt;p&gt;&lt;img width=&#34;573&#34; alt=&#34;16f2dea95786b6aa6f22b9d1.png (198.4 kB)&#34; src=&#34;https://img.esa.io/uploads/production/attachments/11821/2019/12/22/38032/d1923ddb-5191-4d3c-8541-8b2034794000.png&#34;&gt;&lt;/p&gt;

&lt;p&gt;先に謝っておくと、とりあえず作ってみましたが穴が多いのであんまり実用的ではないです。
あと、データを入れるのが大変だったのでシャニマスのライブしか入ってません。&lt;/p&gt;

&lt;p&gt;というわけで、今回はこのアプリの話をします。&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Rubyパターンマッチを闇の力でアクティブにする</title>
      <link>https://blog.kokuyouwind.com/posts/2019/11/ruby%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E3%83%9E%E3%83%83%E3%83%81%E3%82%92%E9%97%87%E3%81%AE%E5%8A%9B%E3%81%A7%E3%82%A2%E3%82%AF%E3%83%86%E3%82%A3%E3%83%96%E3%81%AB%E3%81%99%E3%82%8B/</link>
      <pubDate>Fri, 29 Nov 2019 12:44:45 +0900</pubDate>
      
      <guid>https://blog.kokuyouwind.com/posts/2019/11/ruby%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E3%83%9E%E3%83%83%E3%83%81%E3%82%92%E9%97%87%E3%81%AE%E5%8A%9B%E3%81%A7%E3%82%A2%E3%82%AF%E3%83%86%E3%82%A3%E3%83%96%E3%81%AB%E3%81%99%E3%82%8B/</guid>
      <description>&lt;p&gt;この記事は&lt;a href=&#34;https://qiita.com/advent-calendar/2019/misoca-yayoi&#34; target=&#34;_blank&#34;&gt;Misoca+弥生 Advent Calendar 2019&lt;/a&gt;の1日目です。&lt;/p&gt;

&lt;p&gt;もう12月ですよ、12月！&lt;/p&gt;

&lt;p&gt;記事の内容とはなんの関係もありませんが、デレステに&lt;a href=&#34;https://www.youtube.com/watch?v=DEjJ9ZyVyhM&#34; target=&#34;_blank&#34;&gt;M@GIC&lt;/a&gt;が実装されましたね。&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;https://img.esa.io/uploads/production/attachments/11821/2019/11/29/38032/6c49fab4-c96f-4d4a-aa57-9eaf5fe022ca.jpg&#34; alt=&#34;Screenshot_20191128-222733.jpg (175.9 kB)&#34; /&gt;&lt;/p&gt;

&lt;p&gt;アニメを思い起こさせる最高のMVでした……&lt;/p&gt;

&lt;h3 id=&#34;rubyのパターンマッチ&#34;&gt;💎  Rubyのパターンマッチ&lt;/h3&gt;

&lt;p&gt;Ruby 2.7で、ついにパターンマッチが導入されますね。&lt;/p&gt;

&lt;p&gt;今は&lt;a href=&#34;https://www.ruby-lang.org/ja/news/2019/11/23/ruby-2-7-0-preview3-released/&#34; target=&#34;_blank&#34;&gt;Ruby 2.7.0-preview3&lt;/a&gt;で試すことができます。正式にリリースされるのは、おそらく例年通り12月25日でしょうか。&lt;/p&gt;

&lt;p&gt;パターンマッチ機能の使い方をざっくり書くと、&lt;code&gt;case ... in ...&lt;/code&gt;のような形でパターンマッチを行える機能です。&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-ruby&#34;&gt;case { key: :value}
in { key: x }
  p x # =&amp;gt; :value
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;詳しい話は&lt;a href=&#34;https://speakerdeck.com/k_tsj/pattern-matching-new-feature-in-ruby-2-dot-7&#34; target=&#34;_blank&#34;&gt;RubyKaigiでの発表スライド&lt;/a&gt;のほか、&lt;a href=&#34;https://tech.medpeer.co.jp/entry/2019/05/13/090000&#34; target=&#34;_blank&#34;&gt;メドピアさんの「Ruby2.7の(実験的)新機能「パターンマッチ」で遊ぶ」&lt;/a&gt;がよくまとまっておりわかりやすいです。&lt;/p&gt;

&lt;h3 id=&#34;f-のアクティブパターン&#34;&gt;🐫  F#のアクティブパターン&lt;/h3&gt;

&lt;p&gt;ところで、F#では&lt;a href=&#34;https://docs.microsoft.com/ja-jp/dotnet/fsharp/language-reference/active-patterns&#34; target=&#34;_blank&#34;&gt;アクティブパターン&lt;/a&gt;という機能を使うことができます。&lt;/p&gt;

&lt;p&gt;これは、パターンへの分解を、マッチ対象とは別に定義できるものです。&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-fsharp&#34;&gt;let (|Even|Odd|) input = if input % 2 = 0 then Even else Odd

let TestNumber input =
   match input with
   | Even -&amp;gt; printfn &amp;quot;%d is even&amp;quot; input
   | Odd  -&amp;gt; printfn &amp;quot;%d is odd&amp;quot; input

TestNumber 11 (* 11 is odd *)
TestNumber 32 (* 32 is even *)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;上記のように、マッチ対象となる数値とは独立して&lt;code&gt;Even&lt;/code&gt;と&lt;code&gt;Odd&lt;/code&gt;というパターンを定義することができます。&lt;/p&gt;

&lt;p&gt;さらに、パターンへの分解方法を変えることも可能です。&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-fsharp&#34;&gt;let (|RGB|) (col : System.Drawing.Color) =
     ( col.R, col.G, col.B )

let (|HSB|) (col : System.Drawing.Color) =
   ( col.GetHue(), col.GetSaturation(), col.GetBrightness() )

let printRGB (col: System.Drawing.Color) =
   match col with
   | RGB(r, g, b) -&amp;gt; printfn &amp;quot; Red: %d Green: %d Blue: %d&amp;quot; r g b

let printHSB (col: System.Drawing.Color) =
   match col with
   | HSB(h, s, b) -&amp;gt; printfn &amp;quot; Hue: %f Saturation: %f Brightness: %f&amp;quot; h s b
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;上記のように、&lt;code&gt;Color&lt;/code&gt;型に対してRGB値で取り出したりHSB値で取り出したりすることができます。&lt;/p&gt;

&lt;p&gt;Rubyのパターンマッチでは、パターンへの分解はマッチ対象の&lt;code&gt;deconstruct&lt;/code&gt;や&lt;code&gt;deconstruct_keys&lt;/code&gt;を使うため、分解方法を切り替えるには&lt;a href=&#34;https://docs.ruby-lang.org/ja/latest/method/Module/i/refine.html&#34; target=&#34;_blank&#34;&gt;Refinement&lt;/a&gt;を使うのが現実的な落とし所です。&lt;/p&gt;

&lt;p&gt;&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;一般的な回答としてはRefinements使ってくださいですかね。その場合RGBかHSVかの使い分けはRefinementsのスコープが最小範囲になりますが。&lt;/p&gt;&amp;mdash; k_tsj (@k_tsj) &lt;a href=&#34;https://twitter.com/k_tsj/status/1196673164622860288?ref_src=twsrc%5Etfw&#34;&gt;November 19, 2019&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src=&#34;https://platform.twitter.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;deconstruct&lt;/code&gt;などをパターン側ではなくマッチ対象側に持たせた理由は、辻本さんが&lt;a href=&#34;https://www.lambdanote.com/collections/n/products/nmonthly-vol-1-no-3-2019&#34; target=&#34;_blank&#34;&gt;n月刊ラムダノート Vol.1, No.3&lt;/a&gt;に書かれていました。設計判断の話や他言語との比較もいろいろ言及されていて興味深かったです。&lt;/p&gt;

&lt;p&gt;……が、それでもF#っぽい書き方をしたい！ と思ったのでそれっぽい実装を考えてみよう、というのが今回のテーマです。&lt;/p&gt;

&lt;p&gt;ちなみに「闇の力」とタイトルに入っていますが、実装してみたらTracePointとかISeqとかを使わない形に落ち着いたので若干釣りタイトルになっています。&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>esa.ioからの記事更新でカード画像を設定する</title>
      <link>https://blog.kokuyouwind.com/posts/2019/07/esa.io%E3%81%8B%E3%82%89%E3%81%AE%E8%A8%98%E4%BA%8B%E6%9B%B4%E6%96%B0%E3%81%A7%E3%82%AB%E3%83%BC%E3%83%89%E7%94%BB%E5%83%8F%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B/</link>
      <pubDate>Sun, 14 Jul 2019 23:17:14 +0900</pubDate>
      
      <guid>https://blog.kokuyouwind.com/posts/2019/07/esa.io%E3%81%8B%E3%82%89%E3%81%AE%E8%A8%98%E4%BA%8B%E6%9B%B4%E6%96%B0%E3%81%A7%E3%82%AB%E3%83%BC%E3%83%89%E7%94%BB%E5%83%8F%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://blog.kokuyouwind.com/posts/2019/04/%E3%83%96%E3%83%AD%E3%82%B0%E3%82%92hugo-netlify%E3%81%AB%E8%BC%89%E3%81%9B%E6%9B%BF%E3%81%88%E3%81%BE%E3%81%97%E3%81%9F/&#34; target=&#34;_blank&#34;&gt;以前の記事&lt;/a&gt;で紹介したとおり、このブログは&lt;a href=&#34;https://esa.io/&#34; target=&#34;_blank&#34;&gt;esa.io&lt;/a&gt;内の特定カテゴリに書いた記事が、Hugo+Netlifyによって自動で反映されるようになっています。&lt;/p&gt;

&lt;p&gt;この際、記事のFrontmatterはesa.ioのGitHub WebHookによって自動で設定されるため、記事ごとの画像を設定することができずサイトアイコンを表示するだけにしていました。&lt;/p&gt;

&lt;p&gt;しかしながら今どきTwitterCard画像に非対応というのも寂しいので、少し頑張ってみた結果、以下のように記事ごとの画像をTwitterCardに入れられるようになりました。&lt;/p&gt;

&lt;p&gt;&lt;img width=&#34;1312.5&#34; alt=&#34;16befe3e032a12a2fcca24e1.png (274.8 kB)&#34; src=&#34;https://img.esa.io/uploads/production/attachments/11821/2019/07/14/38032/8348bb2f-1c62-4861-8da3-eb3eff328833.png&#34;&gt;&lt;/p&gt;

&lt;p&gt;先日書いた&lt;a href=&#34;https://blog.kokuyouwind.com/posts/2019/07/%E3%83%A9%E3%82%A4%E3%83%96%E3%82%AB%E3%83%BC%E3%83%8B%E3%83%90%E3%83%AB%E6%8C%AF%E3%82%8A%E8%BF%94%E3%82%8A/&#34; target=&#34;_blank&#34;&gt;デレステの記事&lt;/a&gt;も、スクショをいい感じに設定できて楽しいです。&lt;/p&gt;

&lt;p&gt;&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;ブログをちょっと弄ってSummary Card with Large Imageを使えるようにした。だいぶ見栄えが良くなったので満足。 &lt;a href=&#34;https://t.co/WSResAOUHM&#34;&gt;https://t.co/WSResAOUHM&lt;/a&gt;&lt;/p&gt;&amp;mdash; 黒曜 (@kokuyouwind) &lt;a href=&#34;https://twitter.com/kokuyouwind/status/1150401132130267138?ref_src=twsrc%5Etfw&#34;&gt;July 14, 2019&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src=&#34;https://platform.twitter.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;&lt;/p&gt;

&lt;p&gt;ものすごく簡単なアイディアではあるのですが、どうやったのかをまとめておきます。&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>ポートフォリオサイトをGatsbyJSでリニューアルしました</title>
      <link>https://blog.kokuyouwind.com/posts/2019/05/%E3%83%9D%E3%83%BC%E3%83%88%E3%83%95%E3%82%A9%E3%83%AA%E3%82%AA%E3%82%B5%E3%82%A4%E3%83%88%E3%82%92gatsbyjs%E3%81%A7%E3%83%AA%E3%83%8B%E3%83%A5%E3%83%BC%E3%82%A2%E3%83%AB%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F/</link>
      <pubDate>Wed, 01 May 2019 21:58:42 +0900</pubDate>
      
      <guid>https://blog.kokuyouwind.com/posts/2019/05/%E3%83%9D%E3%83%BC%E3%83%88%E3%83%95%E3%82%A9%E3%83%AA%E3%82%AA%E3%82%B5%E3%82%A4%E3%83%88%E3%82%92gatsbyjs%E3%81%A7%E3%83%AA%E3%83%8B%E3%83%A5%E3%83%BC%E3%82%A2%E3%83%AB%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F/</guid>
      <description>&lt;p&gt;元号が変わり令和を迎えた昨今、皆様いかがお過ごしでしょうか。&lt;/p&gt;

&lt;p&gt;自分は「ゴールデンウィークもう半分過ぎたの？ 早すぎるのでは？？？」という気持ちでいっぱいです。&lt;/p&gt;

&lt;p&gt;連休始まってから、まだ3日くらいしか経ってない気がする……&lt;/p&gt;

&lt;h3 id=&#34;ポートフォリオサイト&#34;&gt;📋 ポートフォリオサイト&lt;/h3&gt;

&lt;p&gt;ゴールデンウィークに目標としていたことのひとつに「ポートフォリオサイトをリニューアルする」というのがありました。&lt;/p&gt;

&lt;p&gt;実はブログの他にポートフォリオサイトも作ってあったんですが、こいつも以前のブログと同じくWordPressで作っていたので、いい加減なんとかしようと思ったわけです。&lt;/p&gt;

&lt;p&gt;ブログと比べてコンテンツが少なく移行が簡単そうだったのと、タイルデザインでSPAっぽかったので&lt;a href=&#34;https://www.gatsbyjs.org/&#34; target=&#34;_blank&#34;&gt;GatsbyJS&lt;/a&gt;を使って作り直すことにしました。&lt;/p&gt;

&lt;p&gt;そんなわけでこんな見た目のサイトになりました。&lt;/p&gt;

&lt;p&gt;&lt;a href=&#34;https://www.kokuyouwind.com/&#34; target=&#34;_blank&#34;&gt;&lt;img width=&#34;1114.5&#34; alt=&#34;portfolio.png (3.1 MB)&#34; src=&#34;https://img.esa.io/uploads/production/attachments/11821/2019/05/01/38032/197e2dee-c0e0-49e6-b95b-e3d03b2c9849.png&#34;&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;記事の管理は&lt;a href=&#34;https://www.netlifycms.org/&#34; target=&#34;_blank&#34;&gt;Netlify CMS&lt;/a&gt;からできるようにしています。&lt;/p&gt;

&lt;p&gt;&lt;img width=&#34;1073&#34; alt=&#34;16a734eaca8b66b9944b4286.png (474.0 kB)&#34; src=&#34;https://img.esa.io/uploads/production/attachments/11821/2019/05/01/38032/a2c0f153-085a-4fa4-a533-36844585d733.png&#34;&gt;&lt;/p&gt;

&lt;p&gt;こんな感じで記事が一覧できるし、&lt;/p&gt;

&lt;p&gt;&lt;img width=&#34;1115.5&#34; alt=&#34;16a734f010b85cbee38f8cec.png (152.9 kB)&#34; src=&#34;https://img.esa.io/uploads/production/attachments/11821/2019/05/01/38032/e74d7ff9-54c7-41b4-9f88-f6f166a7cb58.png&#34;&gt;&lt;/p&gt;

&lt;p&gt;こんな感じで記事を作ったり手直ししたりできます。便利！&lt;/p&gt;

&lt;p&gt;実際に手を動かしたのは昨日と今日の2日間くらいなので、割とさっくり作れたんじゃないかなーと思います。&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>ブログをHugo&#43;Netlifyに載せ替えました</title>
      <link>https://blog.kokuyouwind.com/posts/2019/04/%E3%83%96%E3%83%AD%E3%82%B0%E3%82%92hugo-netlify%E3%81%AB%E8%BC%89%E3%81%9B%E6%9B%BF%E3%81%88%E3%81%BE%E3%81%97%E3%81%9F/</link>
      <pubDate>Sun, 07 Apr 2019 20:22:26 +0900</pubDate>
      
      <guid>https://blog.kokuyouwind.com/posts/2019/04/%E3%83%96%E3%83%AD%E3%82%B0%E3%82%92hugo-netlify%E3%81%AB%E8%BC%89%E3%81%9B%E6%9B%BF%E3%81%88%E3%81%BE%E3%81%97%E3%81%9F/</guid>
      <description>&lt;p&gt;このブログはConoHa VPS上に載せたWordPressで動かしていたんですが、こまめにバージョン上げるのも大変だし、書くためにダッシュボードにいくのもめんどいし…… ということで、静的サイトジェネレータに載せ替えることにしました。&lt;/p&gt;

&lt;p&gt;移行した構成は以下のような感じです。&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;https://img.esa.io/uploads/production/attachments/11821/2019/04/07/38032/27a3c6a5-9dfa-4e19-b844-5cb1907b88c6.png&#34; alt=&#34;current.png (48.9 kB)&#34; /&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;WordPressの過去記事を&lt;a href=&#34;https://github.com/SchumacherFM/wordpress-to-hugo-exporter&#34; target=&#34;_blank&#34;&gt;wordpress-to-hugo-exporter&lt;/a&gt;で変換して &lt;code&gt;archives&lt;/code&gt; 以下に配置&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://esa.io/&#34; target=&#34;_blank&#34;&gt;esa.io&lt;/a&gt;から書いた記事を&lt;a href=&#34;https://qiita.com/7of9/items/e051b55cfc79b82a08ee&#34; target=&#34;_blank&#34;&gt;GitHub Webhook&lt;/a&gt;で&lt;code&gt;posts&lt;/code&gt;以下に配置&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://gohugo.io/&#34; target=&#34;_blank&#34;&gt;Hugo&lt;/a&gt;でまとめてビルドし、&lt;a href=&#34;https://www.netlify.com/&#34; target=&#34;_blank&#34;&gt;Netlify&lt;/a&gt;から配信&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;という感じにしました。&lt;/p&gt;

&lt;p&gt;これにより、過去記事は同じURLに残したまま、今後はesa.ioの特定カテゴリ以下に記事を作るだけでブログが更新できます。&lt;/p&gt;

&lt;p&gt;便利ー。&lt;/p&gt;

&lt;p&gt;まぁ例によって色々引っかかったり諦めたこともあるので、そのへんをぼちぼちと書いていきます。&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Google Homeからつらいときに挙げる札を挙げる</title>
      <link>https://blog.kokuyouwind.com/archives/1563/</link>
      <pubDate>Sat, 09 Dec 2017 15:18:41 +0000</pubDate>
      
      <guid>https://blog.kokuyouwind.com/archives/1563/</guid>
      <description>&lt;p&gt;この記事は&lt;a href=&#34;https://qiita.com/advent-calendar/2017/misoca&#34; rel=&#34;noopener&#34; target=&#34;_blank&#34;&gt;Misoca Advent Calendar 2017&lt;/a&gt;の10日目です。&lt;br /&gt;
昨日の記事は&lt;a href=&#34;https://qiita.com/toyoshi&#34; rel=&#34;noopener&#34; target=&#34;_blank&#34;&gt;@toyoshi&lt;/a&gt;の&lt;a href=&#34;https://qiita.com/toyoshi/items/f620efe654cffdbf7731&#34; rel=&#34;noopener&#34; target=&#34;_blank&#34;&gt;開発以外の仕事でやってるちょっとした自動化の紹介&lt;/a&gt;でした。&lt;/p&gt;

&lt;p&gt;今日はもともと&lt;a href=&#34;https://github.com/kokuyouwind/slack_jiho&#34; rel=&#34;noopener&#34; target=&#34;_blank&#34;&gt;時報ボット&lt;/a&gt;について書くつもりだったんですが、&lt;a href=&#34;https://www.biccamera.com/bc/c/google/home/&#34; rel=&#34;noopener&#34; target=&#34;_blank&#34;&gt;急にGoogle Home半額セールが来た&lt;/a&gt;結果、いろいろ遊んだのでそっちに変えました。&lt;/p&gt;

&lt;p&gt;先に結論から話すと、このツイートが全てです。&lt;/p&gt;

&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;Google Homeに「厳しい」って話しかけると、「つらいよねー、わかるー」って言いながらSlackで札を挙げてくれるようになりました。いつ使うんだこれ &lt;a href=&#34;https://t.co/nazdm0E16x&#34;&gt;pic.twitter.com/nazdm0E16x&lt;/a&gt;&lt;/p&gt;&amp;mdash; 黒曜 (@kokuyouwind) &lt;a href=&#34;https://twitter.com/kokuyouwind/status/939326714164871168?ref_src=twsrc%5Etfw&#34;&gt;December 9, 2017&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.twitter.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;</description>
    </item>
    
    <item>
      <title>tipmonaで投げ銭するボタンを作った</title>
      <link>https://blog.kokuyouwind.com/archives/1482/</link>
      <pubDate>Sun, 11 Jun 2017 10:57:21 +0000</pubDate>
      
      <guid>https://blog.kokuyouwind.com/archives/1482/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://twitter.com/hyuki&#34; target=&#34;_blank&#34;&gt;@hyuki&lt;/a&gt;さんが&lt;a href=&#34;https://twitter.com/tipmona&#34; target=&#34;_blank&#34;&gt;@tipmona&lt;/a&gt;で簡単に投げ銭するためのブックマークレットを作っていたので、試しに使って遊んでみました。&lt;/p&gt;

&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;「tipmonaで手軽に投げ銭できるブックマークレット」を作りました。モナーコインをtipmona経由で贈りたい相手のツイートを表示した状態でTipmonaTipBookmarkletを起動します。詳細は以下に。&lt;a href=&#34;https://t.co/uCkgMxIlQd&#34;&gt;https://t.co/uCkgMxIlQd&lt;/a&gt;&lt;/p&gt;&amp;mdash; 結城浩 (@hyuki) &lt;a href=&#34;https://twitter.com/hyuki/status/873557355073425410?ref_src=twsrc%5Etfw&#34;&gt;June 10, 2017&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.twitter.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;</description>
    </item>
    
    <item>
      <title>型安全性とは結局何なのか</title>
      <link>https://blog.kokuyouwind.com/archives/1347/</link>
      <pubDate>Thu, 08 Dec 2016 17:42:31 +0000</pubDate>
      
      <guid>https://blog.kokuyouwind.com/archives/1347/</guid>
      <description>&lt;p&gt;この記事は &lt;a href=&#34;http://qiita.com/advent-calendar/2016/dwango2&#34; target=&#34;_blank&#34;&gt;第2のドワンゴ Advent Calendar 2016&lt;/a&gt; の8日目です。&lt;br /&gt;
日付を跨いでいる？ またまたご冗談を、DST(ドワンゴスタンダードタイム)ではまだ8日ですよ。&lt;/p&gt;

&lt;p&gt;ちなみに前日は…なんと誰も参加登録をしていませんでした！&lt;br /&gt;
結構な勢いで埋まってたんですけど、唯一の空きですね。&lt;br /&gt;
前々日は&lt;a href=&#34;http://qiita.com/daneko0123/items/5c922649e597ae0a7331&#34; target=&#34;_blank&#34;&gt;daneko0123&lt;/a&gt;さんでした。&lt;/p&gt;

&lt;p&gt;一昨年のアドベントカレンダー記事が「&lt;a href=&#34;https://blog.kokuyouwind.com/archives/808&#34; target=&#34;_blank&#34;&gt;関数型プログラミングとは結局何なのか&lt;/a&gt;」、去年の記事が「&lt;a href=&#34;https://blog.kokuyouwind.com/archives/1189&#34; target=&#34;_blank&#34;&gt;オブジェクト指向プログラミングとは結局なんなのか&lt;/a&gt;」ということで、3年目ともなると記事の方向性が固まりつつある雰囲気が漂いつつ、ネタ切れの空気も漂いつつあります。&lt;br /&gt;
そもそも去年の時点で既にドワンゴ社員ではないのにアドベントカレンダーには参加し続けている、というのもアレな話ですが。&lt;/p&gt;

&lt;p&gt;なにを書くか考えたのですが、最近null安全に関する記事が話題になり、その中で「型」と「安全性」という2つのトピックについて知られていない部分が多そうだと思ったので、プログラムで扱われる「型」とは何か、型が保証する「安全性」とは何か、についてまとめてみたいと思います。&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>プログラマ向けの脱出ゲームを作った話</title>
      <link>https://blog.kokuyouwind.com/archives/1270/</link>
      <pubDate>Fri, 08 Apr 2016 12:40:00 +0000</pubDate>
      
      <guid>https://blog.kokuyouwind.com/archives/1270/</guid>
      <description>&lt;p&gt;最近、リアル脱出ゲームにハマっています。&lt;br /&gt;
知らない人向けにSCRAPの&lt;a target=&#34;_blank&#34; href=&#34;http://realdgame.jp/&#34;&gt;リアル脱出ゲームサイト&lt;/a&gt;から引用すると、&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;ある部屋にあなたは突然閉じ込められる。周りには同じ境遇の人たちがたくさんいる。&lt;br /&gt;
部屋にはさまざまなアイテム、暗号、パズルが隠されているようだ。&lt;br /&gt;
暗号を解き、鍵を開き、箱を開け、制限時間内に最後の鍵を手に入れることができれば&lt;br /&gt;
あなたは脱出に成功する。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;といったゲームです。&lt;br /&gt;
ただし、謎の難易度はすこぶる高く、脱出率は1桁パーセントというレベル。&lt;br /&gt;
SCRAPの公演でも、&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;ただし、子供だましの簡単な謎ではありません。名探偵気取りでお越し下さい。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;と書かれるのがお約束になっています。&lt;br /&gt;
実際やってみるとわかるんですが、パズルだけではなくひらめきの必要な謎も多く、解けなかったときのはがゆさと、解けたときの達成感がやみつきになるゲームです。&lt;/p&gt;

&lt;p&gt;さて、実はプログラマ向けの脱出ゲーム「&lt;a href=&#34;https://codeiq.jp/magazine/2014/03/7590/&#34; target=&#34;_blank&#34;&gt;コードルームからの脱出&lt;/a&gt;」が、SCRAPとCodeIQのコラボで以前に実施されていました。&lt;br /&gt;
自分はプレ問題だけプレイして本番には参加しそびれたのですが、解説を見ると脱出ゲームの雰囲気を感じてもらえるかと思います。&lt;/p&gt;

&lt;p&gt;こういうゲーム、もっと色々あってもいいと思うんですが、ざっと探した限りではあまり数を見つけられませんでした。&lt;br /&gt;
個人的な印象ですが、こういうゲームが好きなプログラマは多そうな気がしますし、プログラマならではの謎みたいな面白いものも作れそうなので、もっと流行ってもいいんじゃないかなーと思います。&lt;/p&gt;

&lt;p&gt;というわけで、作ってみました。&lt;/p&gt;

&lt;p&gt;&lt;a href=&#34;https://github.com/kokuyouwind/escape-from-the-repository&#34; rel=&#34;attachment wp-att-1277&#34; target=&#34;_blank&#34;&gt;&lt;picture&gt;&lt;source type=&#34;image/webp&#34; srcset=&#34;https://blog.kokuyouwind.com/images/2016/04/WS000002.webp&#34; /&gt;&lt;img src=&#34;https://blog.kokuyouwind.com/images/2016/04/WS000002.jpg&#34; alt=&#34;escape_from_the_repository&#34; width=&#34;997&#34; height=&#34;417&#34; class=&#34;aligncenter size-full wp-image-1277&#34; srcset=&#34;https://blog.kokuyouwind.com/images/2016/04/WS000002.jpg 997w, https://blog.kokuyouwind.com/images/2016/04/WS000002-300x125.jpg 300w, https://blog.kokuyouwind.com/images/2016/04/WS000002-768x321.jpg 768w, https://blog.kokuyouwind.com/images/2016/04/WS000002-788x330.jpg 788w&#34; sizes=&#34;(max-width: 997px) 100vw, 997px&#34; /&gt;&lt;/picture&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;タイトルは、「&lt;a href=&#34;https://github.com/kokuyouwind/escape-from-the-repository&#34; target=&#34;_blank&#34;&gt;あるリポジトリからの脱出&lt;/a&gt;」。&lt;br /&gt;
タイトルから想像がつくかもしれませんが、gitを使った脱出ゲームです。&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>オブジェクト指向プログラミングとは結局なんなのか</title>
      <link>https://blog.kokuyouwind.com/archives/1189/</link>
      <pubDate>Sat, 05 Dec 2015 12:16:32 +0000</pubDate>
      
      <guid>https://blog.kokuyouwind.com/archives/1189/</guid>
      <description>&lt;p&gt;この記事は&lt;a href=&#34;http://qiita.com/advent-calendar/2015/dwango2&#34; target=&#34;_blank&#34;&gt;第2のドワンゴ Advent Calendar 2015&lt;/a&gt;の5日目です。&lt;br /&gt;
ちなみに前日は&lt;a href=&#34;http://qiita.com/deflis/items/9f2127e5886647306278&#34; target=&#34;_blank&#34;&gt;@deflis&lt;/a&gt;さんでした。&lt;br /&gt;
&lt;a href=&#34;https://blog.kokuyouwind.com/archives/1157&#34; target=&#34;_blank&#34;&gt;先日の記事&lt;/a&gt;で分かる通りドワンゴ社員()なのですが、まぁ&lt;a href=&#34;https://twitter.com/meso&#34; target=&#34;_blank&#34;&gt;@meso&lt;/a&gt;さんが「厳格な管理とかめんどくさいので、元社員も参加すればいいんじゃないかな。」とか言ってるしお目こぼし頂きたく…&lt;/p&gt;

&lt;p&gt;去年のアドベントカレンダー記事は「&lt;a href=&#34;https://blog.kokuyouwind.com/archives/808&#34; target=&#34;_blank&#34;&gt;関数型プログラミングとは結局なんなのか&lt;/a&gt;」というタイトルで、関数型プログラミングという語が何を指していて何を指していないのか、みたいなことをなるべく平易にまとめました。&lt;br /&gt;
なので今年は「オブジェクト指向プログラミング(以下OOP)とは結局なんなのか」という記事にしてみた…のですが、なにぶん語の指す範囲が広く、また自分も理解しきっているわけではないので、多少不正確な点があるかもしれません。&lt;br /&gt;
「関数型は流行りだけど、今更OOPかよ」とか思われるかもしれませんが、お付き合いいただければと思います。&lt;/p&gt;

&lt;h3 id=&#34;oopという語の曖昧さ&#34;&gt;OOPという語の曖昧さ&lt;/h3&gt;

&lt;p&gt;さて、一口にOOPといっても、人によってイメージするものがバラバラである可能性があります。&lt;br /&gt;
「動物クラスを継承した犬クラスと猫クラスが」とか「グワッと鳴けばアヒル」といった話から、「イマドキのオブジェクト指向は&lt;a href=&#34;http://www.amazon.co.jp/gp/product/B00GRKD6XU/ref=as_li_ss_tl?ie=UTF8&amp;#038;camp=247&amp;#038;creative=7399&amp;#038;creativeASIN=B00GRKD6XU&amp;#038;linkCode=as2&amp;#038;tag=kokuyouwind-22&#34; target=&#34;_blank&#34;&gt;ドメイン駆動&lt;/a&gt;で&lt;a href=&#34;http://www.amazon.co.jp/gp/product/B00UX9VJGW/ref=as_li_ss_tl?ie=UTF8&amp;#038;camp=247&amp;#038;creative=7399&amp;#038;creativeASIN=B00UX9VJGW&amp;#038;linkCode=as2&amp;#038;tag=kokuyouwind-22&#34; target=&#34;_blank&#34;&gt;ヘキサゴナルアーキテクチャ&lt;/a&gt;だ」みたいな話までいろんなイメージを持つ方がいると思いますが、今回はオブジェクト指向の本質的な思想の部分を中心にまとめる予定です。&lt;/p&gt;

&lt;p&gt;ところが困ったことに、OOPという語は2つの異なる系譜があったりします。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;アラン・ケイがSmalltalkで提唱したOOP&lt;/li&gt;
&lt;li&gt;ストラウストラップがC++で提唱したOOP&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;現在は、後者濃い目でこれらが混ざり合ったものに加えて&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;プログラミングではなく設計・モデリングの話&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;までOOPの範疇で語られていることも見かけることがあります。&lt;br /&gt;
これらの区別をつけないと議論の土台から噛み合わなくなってしまう可能性があるため、以降これらを区別して「アラン・ケイのOOP」「ストラウストラップのOOP」「オブジェクト指向のモデリング・設計」と呼び分け、順に見ていくことにします。&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>ConoHaのオブジェクトストレージをPaperclipから使う</title>
      <link>https://blog.kokuyouwind.com/archives/1129/</link>
      <pubDate>Sun, 26 Jul 2015 12:37:02 +0000</pubDate>
      
      <guid>https://blog.kokuyouwind.com/archives/1129/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://www.conoha.jp/referral/?token=guyH5Me6Y5m8kwpRJ92XUTQQPLJC1G9j_tCe9w4syP2eLbpRS4w-22F&#34; target=&#34;_blank&#34;&gt;清楚かわいいConoHaちゃん&lt;/a&gt;が、APIのレビュー記事を書くとクーポンをくれるらしいので、全力で乗っかっていこうと思います。&lt;/p&gt;

&lt;p&gt;&lt;picture&gt;&lt;source type=&#34;image/webp&#34; srcset=&#34;https://blog.kokuyouwind.com/images/2015/07/conoha_1920_1080_mode_2015summer.webp&#34; /&gt;&lt;img src=&#34;https://blog.kokuyouwind.com/images/2015/07/conoha_1920_1080_mode_2015summer.jpg&#34;/&gt;&lt;/picture&gt;&lt;br /&gt;
(画像は&lt;a href=&#34;https://www.conoha.jp/conoben/archives/10401&#34; target=&#34;_blank&#34;&gt;このは通信室&lt;/a&gt;より引用)&lt;/p&gt;

&lt;p&gt;今回利用してみるのは、ConoHaのオブジェクトストレージです。&lt;br /&gt;
これは基本的にOpenStack Swiftを使って実現されており、&lt;a href=&#34;https://www.conoha.jp/docs/swift-show_account_details_and_list_containers.html&#34; target=&#34;_blank&#34;&gt;API仕様&lt;/a&gt;も&lt;a href=&#34;http://developer.openstack.org/api-ref-objectstorage-v1.html&#34; target=&#34;_blank&#34;&gt;OpenStack Swift API&lt;/a&gt;とほぼ同じ内容になっています。&lt;/p&gt;

&lt;p&gt;APIが互換であれば、OpenStack Swiftを扱えるシステムからConoHaのオブジェクトストレージも扱うことが出来るはずですね。&lt;br /&gt;
そんなわけで、試しにRuby on Railsで画像アップロードをお手軽にできる&lt;a href=&#34;https://github.com/thoughtbot/paperclip&#34; target=&#34;_blank&#34;&gt;Paperclip&lt;/a&gt;のバックエンドをConoHaのオブジェクトストレージにしてみましょう。&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>strtotimeとtimestampの素敵な関係</title>
      <link>https://blog.kokuyouwind.com/archives/1031/</link>
      <pubDate>Thu, 18 Jun 2015 16:06:58 +0000</pubDate>
      
      <guid>https://blog.kokuyouwind.com/archives/1031/</guid>
      <description>&lt;p&gt;基本的には関数型言語推しですが、業務では諸事情でPHPを使っています。&lt;br /&gt;
色々と罠の多い言語であることは知っていたんですが、先日「これはあんまりだろ…」という挙動を踏み抜きました。&lt;br /&gt;
軽くググった限りでは同様の事例紹介が見当たらなかったのと、あまりにも衝撃的だったため記事として残しておきます。&lt;/p&gt;

&lt;h3 id=&#34;前置き-mysql-datetimeとstrtotime&#34;&gt;前置き:MySQL DATETIMEとstrtotime&lt;/h3&gt;

&lt;p&gt;PHPerな諸氏におかれましては、strtotimeが色々と頑張りすぎるせいでハマったことは1度や2度ではないのではないでしょう。&lt;br /&gt;
例えばMySQLのDATETIMEで未定義を表す &lt;code&gt;0000-00-00 00:00:00&lt;/code&gt;を32bit環境でstrtotimeに渡すとfalseになります。&lt;br /&gt;
&lt;a href=&#34;http://php.net/manual/ja/function.strtotime.php&#34; target=&#34;_blank&#34;&gt;ドキュメント&lt;/a&gt;を見ると&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;返り値 ¶&lt;br /&gt;
成功時はタイムスタンプ、そうでなければ FALSE を返します。 PHP 5.1.0 以前ではこの関数は失敗時に -1 を返します。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;と書かれており、「そうか、日付として不正だから解釈に失敗してfalseを返したんだな。0月とか存在しないし」と思ってしまいそうになるんですが、同じコードを64bit環境で実行すると以下のようになります。&lt;/p&gt;

&lt;div class=&#34;wp_codebox&#34;&gt;
  &lt;table&gt;
    &lt;tr id=&#34;p1031123&#34;&gt;
      &lt;td class=&#34;code&#34; id=&#34;p1031code123&#34;&gt;
        &lt;pre class=&#34;bash&#34; style=&#34;font-family:monospace;&#34;&gt;$ php &lt;span style=&#34;color: #660033;&#34;&gt;-r&lt;/span&gt; &lt;span style=&#34;color: #ff0000;&#34;&gt;&#39;var_dump(strtotime(&#34;0000-00-00 00:00:00&#34;));&#39;&lt;/span&gt;
int&lt;span style=&#34;color: #7a0874; font-weight: bold;&#34;&gt;&amp;#40;&lt;/span&gt;-&lt;span style=&#34;color: #000000;&#34;&gt;62170016400&lt;/span&gt;&lt;span style=&#34;color: #7a0874; font-weight: bold;&#34;&gt;&amp;#41;&lt;/span&gt;&lt;/pre&gt;
      &lt;/td&gt;
    &lt;/tr&gt;
  &lt;/table&gt;
&lt;/div&gt;

&lt;p&gt;謎の数値が出てきました。&lt;br /&gt;
これが一体いつを表しているのか、さらにdate関数を掛けて確認してみます。&lt;/p&gt;

&lt;div class=&#34;wp_codebox&#34;&gt;
  &lt;table&gt;
    &lt;tr id=&#34;p1031124&#34;&gt;
      &lt;td class=&#34;code&#34; id=&#34;p1031code124&#34;&gt;
        &lt;pre class=&#34;bash&#34; style=&#34;font-family:monospace;&#34;&gt;$ php &lt;span style=&#34;color: #660033;&#34;&gt;-r&lt;/span&gt; &lt;span style=&#34;color: #ff0000;&#34;&gt;&#39;var_dump(date(&#34;Y-m-d H:i:s&#34;, strtotime(&#34;0000-00-00 00:00:00&#34;)));&#39;&lt;/span&gt;
string&lt;span style=&#34;color: #7a0874; font-weight: bold;&#34;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&#34;color: #000000;&#34;&gt;20&lt;/span&gt;&lt;span style=&#34;color: #7a0874; font-weight: bold;&#34;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&#34;color: #ff0000;&#34;&gt;&#34;-0001-11-30 00:00:00&#34;&lt;/span&gt;&lt;/pre&gt;
      &lt;/td&gt;
    &lt;/tr&gt;
  &lt;/table&gt;
&lt;/div&gt;

&lt;p&gt;つまり、PHPはMySQLのDATETIMEの未定義値を「マイナス1年11月30日の0時0分0秒」とみなしていることがわかります。&lt;br /&gt;
実はPHPでは0月が「前年の12月」を、0日が「前月の最終日」を、それぞれ表すと解釈されるので、0年の1ヶ月前の更に1日前で-1年11月30日という日付が導かれるんですね。&lt;br /&gt;
32bit環境でfalseが返っていたのは、日付として不正だからでも何でもなく、単に「表現できる整数値の範囲を超えていたから」という理由だったわけです。&lt;/p&gt;

&lt;p&gt;この挙動の違いは&lt;a href=&#34;http://php.net/manual/ja/function.strtotime.php#101702&#34; target=&#34;_blank&#34;&gt;公式ドキュメントのコメント欄&lt;/a&gt;にさんざん書かれているので知っている人も多いと思います。&lt;br /&gt;
一方、今回踏んだ挙動は発生条件がかなり限られていることと、そもそも普通はそんなことしないだろう、という辺りであまり知られていないだろう挙動です。&lt;br /&gt;
あ、ここまでが前振りです。長くてすみません。&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>すごいHaskell本の演習問題を公開しました(5章まで)</title>
      <link>https://blog.kokuyouwind.com/archives/892/</link>
      <pubDate>Sun, 21 Dec 2014 07:59:16 +0000</pubDate>
      
      <guid>https://blog.kokuyouwind.com/archives/892/</guid>
      <description>&lt;p&gt;最近、会社で「すごいHaskellたのしく学ぼう!&lt;img src=&#34;https://ir-jp.amazon-adsystem.com/e/ir?t=kokuyouwind-22&amp;#038;l=as2&amp;#038;o=9&amp;#038;a=4274068854&#34; width=&#34;1&#34; height=&#34;1&#34; border=&#34;0&#34; alt=&#34;&#34; style=&#34;border:none !important; margin:0px !important;&#34; /&gt;」の勉強会を主催しています。&lt;/p&gt;

&lt;p&gt;&lt;center&gt;
  &lt;br /&gt;&lt;a href=&#34;https://www.amazon.co.jp/gp/product/4274068854/ref=as_li_tf_il?ie=UTF8&amp;#038;camp=247&amp;#038;creative=1211&amp;#038;creativeASIN=4274068854&amp;#038;linkCode=as2&amp;#038;tag=kokuyouwind-22&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;https://ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&amp;#038;ASIN=4274068854&amp;#038;Format=_SL250_&amp;#038;ID=AsinImage&amp;#038;MarketPlace=JP&amp;#038;ServiceVersion=20070822&amp;#038;WS=1&amp;#038;tag=kokuyouwind-22&#34; /&gt;&lt;/a&gt;&lt;img src=&#34;https://ir-jp.amazon-adsystem.com/e/ir?t=kokuyouwind-22&amp;#038;l=as2&amp;#038;o=9&amp;#038;a=4274068854&#34; width=&#34;1&#34; height=&#34;1&#34; border=&#34;0&#34; alt=&#34;&#34; style=&#34;border:none !important; margin:0px !important;&#34; /&gt;&lt;br /&gt;
&lt;/center&gt;&lt;/p&gt;

&lt;p&gt;内容としては週1回、1時間かけて本を読み進めつつ、例を実際に動かしたり、分かりづらい部分を自分が補足したり、気になる部分をお互い教え合ったり、といった形で進めています。&lt;br /&gt;
前回主催した型システム入門の勉強会はあっという間に参加者が減って頓挫したものの、今回は8回目時点で参加者がほとんど減っておらず、よい感じに続いています。&lt;/p&gt;

&lt;p&gt;ところで、すごいHaskell本は説明順序も適切ですし、例も豊富にある良い本なのですが、勉強会を進めて不満に思うことが出てきました。&lt;br /&gt;
それは、自分で考えて手を動かすための演習問題が一切ないという点です。&lt;br /&gt;
例が豊富にあるとはいえ、プログラミングの醍醐味は「どうやって解くかを考えて、それをプログラムに落としこむ」ところにあると自分は思っています。&lt;br /&gt;
また、そうやって問題を解くことで記憶も定着しますし、必要な知識が身についているかの理解度チェックにもなります。&lt;/p&gt;

&lt;p&gt;そういうわけで、社内勉強会では章が終わるごとに演習問題を解いて理解を確認してもらう、ということを行っています。(宿題というわけではなく、任意で解きたい人だけ解いてもらうような感じです)&lt;br /&gt;
この演習問題、もともとは社内Githubにまとめていたのですが、社外から見れないと不便であることと、特に社外秘の情報というわけでもないことから、&lt;a href=&#34;https://github.com/kokuyouwind/haskell-exercises&#34; title=&#34;すごいHaskell楽しく演習！&#34; target=&#34;_blank&#34;&gt;Githubに公開&lt;/a&gt;することにしました。&lt;br /&gt;
現在勉強会が5章までしか進んでいないので、5章分までの公開です。&lt;/p&gt;

&lt;p&gt;&lt;a href=&#34;https://github.com/kokuyouwind/haskell-exercises&#34; title=&#34;すごいHaskell楽しく演習！&#34; target=&#34;_blank&#34;&gt;&lt;picture&gt;&lt;source type=&#34;image/webp&#34; srcset=&#34;https://blog.kokuyouwind.com/images/2014/12/0214c8ef-c950-4046-8db9-aabc347c207b.webp&#34; /&gt;&lt;img src=&#34;https://blog.kokuyouwind.com/images/2014/12/0214c8ef-c950-4046-8db9-aabc347c207b.png&#34; alt=&#34;すごいHaskell楽しく演習！&#34; width=&#34;802&#34; height=&#34;445&#34; class=&#34;aligncenter size-full wp-image-919&#34; srcset=&#34;https://blog.kokuyouwind.com/images/2014/12/0214c8ef-c950-4046-8db9-aabc347c207b.png 802w, https://blog.kokuyouwind.com/images/2014/12/0214c8ef-c950-4046-8db9-aabc347c207b-300x166.png 300w, https://blog.kokuyouwind.com/images/2014/12/0214c8ef-c950-4046-8db9-aabc347c207b-788x437.png 788w&#34; sizes=&#34;(max-width: 802px) 100vw, 802px&#34; /&gt;&lt;/picture&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;すごいHaskell本を自習している方や勉強会をしている方、もしくは単にHaskellの問題を解いてみたい方など、ご自由に利用していただければと思います。&lt;br /&gt;
なお、問題作成にあたり自分で解けることは確認していますが、記述に間違いがあったり分かりづらい部分があるかもしれません。&lt;br /&gt;
そういった場合は&lt;a href=&#34;https://blog.kokuyouwind.com/mailto&#34; title=&#34;メールフォーム&#34; target=&#34;_blank&#34;&gt;メール&lt;/a&gt;かTwitterで&lt;a href=&#34;https://twitter.com/kokuyouwind&#34; target=&#34;_blank&#34;&gt;@kokuyouwind&lt;/a&gt;宛てにリプライをいただければと思います。&lt;/p&gt;

&lt;p&gt;問題を作るにあたり、なるべく作業的にならないよう、面白い題材を選んだつもりです。&lt;br /&gt;
以下では章ごとの問題について、どんな題材をテーマに何を狙って問題を作ったかの解説を書いていきたいと思います。&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>関数型プログラミングとは結局何なのか</title>
      <link>https://blog.kokuyouwind.com/archives/808/</link>
      <pubDate>Sat, 13 Dec 2014 16:47:25 +0000</pubDate>
      
      <guid>https://blog.kokuyouwind.com/archives/808/</guid>
      <description>&lt;p&gt;この記事は&lt;a href=&#34;http://qiita.com/advent-calendar/2014/dwango&#34; title=&#34;ドワンゴ Advent Calendar 2014&#34; target=&#34;_blank&#34;&gt;ドワンゴ Advent Calendar 2014&lt;/a&gt;の14日目です。&lt;br /&gt;
ちなみに前日は&lt;a href=&#34;http://erukiti.hatenablog.com/entry/2014/12/11/221415&#34; title=&#34;今更だけど、レガシーコード改善ガイドをガイドしてみる&#34; target=&#34;_blank&#34;&gt;@erukiti&lt;/a&gt;さんでした。&lt;br /&gt;
他の方は「こんなもの作ってみた！」系の記事が多いのですが、技術系の話題であれば特に縛りはないようなので、今回はひたすら文章をつらつらと綴っていきたいと思います。&lt;/p&gt;

&lt;p&gt;ここ数年、「&lt;a href=&#34;http://tech-sketch.jp/2013/08/parallel-functional-programming-1.html&#34; title=&#34;マルチコア時代のプログラマは関数脳になろう〜Java8のススメ〜&#34; target=&#34;_blank&#34;&gt;マルチコア時代の主流は関数型だ&lt;/a&gt;」とか「&lt;a href=&#34;http://itpro.nikkeibp.co.jp/article/COLUMN/20130112/449223/&#34; title=&#34;［関数型言語のトレンド］国内でも採用企業が増加&#34; target=&#34;_blank&#34;&gt;Javaはもう古い！ 時代は関数型！&lt;/a&gt;」といった記事をよく見かけるようになった気がします。&lt;br /&gt;
大学でOCamlを学んできた自分としては嬉しい限りなのですが、なんだか関数型という言葉がバズワード的な使われ方をしている気がして、まるで「現在起こっている全ての問題を解決する銀の矢だ！」といわんばかりの雰囲気を感じるのが気になっています。&lt;br /&gt;
最近うちの部署でもにわかに「関数型っぽく書こう」みたいな機運が高まってることもあるので、この機に関数型プログラミングとはなにか、どのような特徴があって何に向いているのか、みたいなことをまとめてみたいと思います。&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>鉄道指向でこころがぴょんぴょんする解説</title>
      <link>https://blog.kokuyouwind.com/archives/755/</link>
      <pubDate>Mon, 08 Dec 2014 15:19:41 +0000</pubDate>
      
      <guid>https://blog.kokuyouwind.com/archives/755/</guid>
      <description>&lt;p&gt;前回鉄道指向でこころぴょんぴょんする記事を書いたところ、会社の同僚から「鉄道指向ってなんだい？ わけがわからないよ。あと、この記事はどの辺がごちうさに関係あるんだい？」というありがたいコメントを頂きました。&lt;br /&gt;
そんなわけで、今回は前回書いたプログラムについて、鉄道指向と絡めて解説したいと思います。&lt;br /&gt;
なお、鉄道指向について詳しく知りたい場合は&lt;a href=&#34;https://github.com/yukitos/notes/blob/master/A_recipe_for_a_functional_app/Railway%20oriented%20programming.md&#34; title=&#34;鉄道指向プログラミング(翻訳)&#34; target=&#34;_blank&#34;&gt;鉄道指向プログラミングの翻訳記事&lt;/a&gt;を読んでいただいたほうがわかりやすいかと思います。&lt;/p&gt;

&lt;p&gt;さて、ざっくり鉄道指向について説明すると、「成功(Success)と失敗(Failure)の2種類の値を返すような関数を鉄道のスイッチに見立てて、この関数を組み合わせて広大な路線=プログラムを組み立てていく」というプログラミングスタイルです。&lt;br /&gt;
例えば何らかのWebアプリケーションを、以下のようなブラックボックスと考えてみましょう。&lt;/p&gt;

&lt;p&gt;&lt;picture&gt;&lt;source type=&#34;image/webp&#34; srcset=&#34;https://blog.kokuyouwind.com/images/2014/12/Request-Response.webp&#34; /&gt;&lt;img src=&#34;https://blog.kokuyouwind.com/images/2014/12/Request-Response.jpg&#34; alt=&#34;Request-Response&#34; width=&#34;405&#34; height=&#34;125&#34; class=&#34;aligncenter size-full wp-image-758&#34; srcset=&#34;https://blog.kokuyouwind.com/images/2014/12/Request-Response.jpg 405w, https://blog.kokuyouwind.com/images/2014/12/Request-Response-300x92.jpg 300w&#34; sizes=&#34;(max-width: 405px) 100vw, 405px&#34; /&gt;&lt;/picture&gt;&lt;/p&gt;

&lt;p&gt;ApplicationからSuccessとFailureの2本の矢印が伸びていますが、これはSuccessとFailureの両方を返すわけではなく、状況に応じていずれか一方を返すという意味です。&lt;br /&gt;
鉄道の路線と同様、通るのはどちらか一方だけ、ということですね。&lt;br /&gt;
またSuccessとFailureはどちらの路線かという情報とは別に、更に詳細な情報を持つことが出来ます。&lt;br /&gt;
上を通る列車が、詳細な情報を荷物として載せているイメージです。&lt;/p&gt;

&lt;p&gt;このような「SuccessとFailureのいずれかを返す型response」は、OCamlでは代数的データ型を用いて以下のように書くことが出来ます。&lt;/p&gt;

&lt;div class=&#34;wp_codebox&#34;&gt;
  &lt;table&gt;
    &lt;tr id=&#34;p755114&#34;&gt;
      &lt;td class=&#34;code&#34; id=&#34;p755code114&#34;&gt;
        &lt;pre class=&#34;ocaml&#34; style=&#34;font-family:monospace;&#34;&gt;&lt;span style=&#34;color: #06c; font-weight: bold;&#34;&gt;type&lt;/span&gt; &lt;span style=&#34;color: #6c6;&#34;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&#34;color: #a52a2a;&#34;&gt;&#39;&lt;/span&gt;a, &lt;span style=&#34;color: #a52a2a;&#34;&gt;&#39;&lt;/span&gt;b&lt;span style=&#34;color: #6c6;&#34;&gt;&amp;#41;&lt;/span&gt; response &lt;span style=&#34;color: #a52a2a;&#34;&gt;=&lt;/span&gt; Success &lt;span style=&#34;color: #06c; font-weight: bold;&#34;&gt;of&lt;/span&gt; &lt;span style=&#34;color: #a52a2a;&#34;&gt;&#39;&lt;/span&gt;a &lt;span style=&#34;color: #a52a2a;&#34;&gt;|&lt;/span&gt; &lt;a href=&#34;http://caml.inria.fr/pub/docs/manual-ocaml/libref/Pervasives.html#EXCEPTIONFailure&#34;&gt;&lt;span style=&#34;color: #06c; font-weight: bold;&#34;&gt;Failure&lt;/span&gt;&lt;/a&gt; &lt;span style=&#34;color: #06c; font-weight: bold;&#34;&gt;of&lt;/span&gt; &lt;span style=&#34;color: #a52a2a;&#34;&gt;&#39;&lt;/span&gt;b&lt;/pre&gt;
      &lt;/td&gt;
    &lt;/tr&gt;
  &lt;/table&gt;
&lt;/div&gt;

&lt;p&gt;&amp;#8216;aがSuccessの時に保持している詳細情報の型を、&amp;#8217;bがFailureの時に保持している詳細情報の型を、それぞれ表しています。&lt;br /&gt;
例えば成功した時に数値を、失敗した時に文字列を詳細情報として持つような型は&lt;/p&gt;

&lt;div class=&#34;wp_codebox&#34;&gt;
  &lt;table&gt;
    &lt;tr id=&#34;p755115&#34;&gt;
      &lt;td class=&#34;code&#34; id=&#34;p755code115&#34;&gt;
        &lt;pre class=&#34;ocaml&#34; style=&#34;font-family:monospace;&#34;&gt;&lt;span style=&#34;color: #6c6;&#34;&gt;&amp;#40;&lt;/span&gt;int,string&lt;span style=&#34;color: #6c6;&#34;&gt;&amp;#41;&lt;/span&gt; response&lt;/pre&gt;
      &lt;/td&gt;
    &lt;/tr&gt;
  &lt;/table&gt;
&lt;/div&gt;

&lt;p&gt;という型になります。&lt;br /&gt;
Success(1)やFailure(&amp;#8220;入力した数値が不正です&amp;#8221;)などは(int,string) response型の値です。&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>第2羽 関数を愛した言語と鉄道指向に愛された言語</title>
      <link>https://blog.kokuyouwind.com/archives/726/</link>
      <pubDate>Mon, 01 Dec 2014 15:04:30 +0000</pubDate>
      
      <guid>https://blog.kokuyouwind.com/archives/726/</guid>
      <description>&lt;p&gt;この記事は&lt;a href=&#34;http://www.adventar.org/calendars/439&#34; title=&#34;ごちうさ住民 Advent Calendar 2014&#34; target=&#34;_blank&#34;&gt;ごちうさ住民 Advent Calendar 2014&lt;/a&gt;の2日目です。&lt;br /&gt;
あとタイトルは内容にあんまり関係ありません。&lt;/p&gt;

&lt;p&gt;みなさん、心ぴょんぴょんしてますか？&lt;br /&gt;
今日は、鉄道指向を使って心ぴょんぴょんしてみたいと思います。&lt;/p&gt;

&lt;p&gt;まずは、&lt;a href=&#34;https://github.com/yukitos/notes/blob/master/A_recipe_for_a_functional_app/Railway%20oriented%20programming.md&#34; title=&#34;鉄道指向プログラミング(翻訳)&#34; target=&#34;_blank&#34;&gt;鉄道指向プログラミングの翻訳記事&lt;/a&gt;を参考に、鉄道指向で用いるResultモジュールを定義します。&lt;/p&gt;

&lt;div class=&#34;wp_codebox&#34;&gt;
  &lt;table&gt;
    &lt;tr id=&#34;p726110&#34;&gt;
      &lt;td class=&#34;code&#34; id=&#34;p726code110&#34;&gt;
        &lt;pre class=&#34;ocaml&#34; style=&#34;font-family:monospace;&#34;&gt;&lt;span style=&#34;color: #06c; font-weight: bold;&#34;&gt;type&lt;/span&gt; &lt;span style=&#34;color: #6c6;&#34;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&#34;color: #a52a2a;&#34;&gt;&#39;&lt;/span&gt;a, &lt;span style=&#34;color: #a52a2a;&#34;&gt;&#39;&lt;/span&gt;b&lt;span style=&#34;color: #6c6;&#34;&gt;&amp;#41;&lt;/span&gt; t &lt;span style=&#34;color: #a52a2a;&#34;&gt;=&lt;/span&gt; Success &lt;span style=&#34;color: #06c; font-weight: bold;&#34;&gt;of&lt;/span&gt; &lt;span style=&#34;color: #a52a2a;&#34;&gt;&#39;&lt;/span&gt;a &lt;span style=&#34;color: #a52a2a;&#34;&gt;|&lt;/span&gt; &lt;a href=&#34;http://caml.inria.fr/pub/docs/manual-ocaml/libref/Pervasives.html#EXCEPTIONFailure&#34;&gt;&lt;span style=&#34;color: #06c; font-weight: bold;&#34;&gt;Failure&lt;/span&gt;&lt;/a&gt; &lt;span style=&#34;color: #06c; font-weight: bold;&#34;&gt;of&lt;/span&gt; &lt;span style=&#34;color: #a52a2a;&#34;&gt;&#39;&lt;/span&gt;b
&lt;span style=&#34;color: #06c; font-weight: bold;&#34;&gt;let&lt;/span&gt; succeed x &lt;span style=&#34;color: #a52a2a;&#34;&gt;=&lt;/span&gt; Success x
&lt;span style=&#34;color: #06c; font-weight: bold;&#34;&gt;let&lt;/span&gt; fail x &lt;span style=&#34;color: #a52a2a;&#34;&gt;=&lt;/span&gt; &lt;a href=&#34;http://caml.inria.fr/pub/docs/manual-ocaml/libref/Pervasives.html#EXCEPTIONFailure&#34;&gt;&lt;span style=&#34;color: #06c; font-weight: bold;&#34;&gt;Failure&lt;/span&gt;&lt;/a&gt; x
&lt;span style=&#34;color: #06c; font-weight: bold;&#34;&gt;let&lt;/span&gt; either successFunc failureFunc &lt;span style=&#34;color: #a52a2a;&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #06c; font-weight: bold;&#34;&gt;function&lt;/span&gt;
  &lt;span style=&#34;color: #a52a2a;&#34;&gt;|&lt;/span&gt; Success s &lt;span style=&#34;color: #a52a2a;&#34;&gt;-&amp;gt;&lt;/span&gt; successFunc s
  &lt;span style=&#34;color: #a52a2a;&#34;&gt;|&lt;/span&gt; &lt;a href=&#34;http://caml.inria.fr/pub/docs/manual-ocaml/libref/Pervasives.html#EXCEPTIONFailure&#34;&gt;&lt;span style=&#34;color: #06c; font-weight: bold;&#34;&gt;Failure&lt;/span&gt;&lt;/a&gt; f &lt;span style=&#34;color: #a52a2a;&#34;&gt;-&amp;gt;&lt;/span&gt; failureFunc f
&lt;span style=&#34;color: #06c; font-weight: bold;&#34;&gt;let&lt;/span&gt; plus addS addF f1 f2 r &lt;span style=&#34;color: #a52a2a;&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #06c; font-weight: bold;&#34;&gt;match&lt;/span&gt; f1 r, f2 r &lt;span style=&#34;color: #06c; font-weight: bold;&#34;&gt;with&lt;/span&gt;
  &lt;span style=&#34;color: #a52a2a;&#34;&gt;|&lt;/span&gt; Success s1, Success s2 &lt;span style=&#34;color: #a52a2a;&#34;&gt;-&amp;gt;&lt;/span&gt; succeed @@ addS s1 s2
  &lt;span style=&#34;color: #a52a2a;&#34;&gt;|&lt;/span&gt; &lt;a href=&#34;http://caml.inria.fr/pub/docs/manual-ocaml/libref/Pervasives.html#EXCEPTIONFailure&#34;&gt;&lt;span style=&#34;color: #06c; font-weight: bold;&#34;&gt;Failure&lt;/span&gt;&lt;/a&gt; f1, Success _  &lt;span style=&#34;color: #a52a2a;&#34;&gt;-&amp;gt;&lt;/span&gt; fail f1
  &lt;span style=&#34;color: #a52a2a;&#34;&gt;|&lt;/span&gt; Success _ , &lt;a href=&#34;http://caml.inria.fr/pub/docs/manual-ocaml/libref/Pervasives.html#EXCEPTIONFailure&#34;&gt;&lt;span style=&#34;color: #06c; font-weight: bold;&#34;&gt;Failure&lt;/span&gt;&lt;/a&gt; f2 &lt;span style=&#34;color: #a52a2a;&#34;&gt;-&amp;gt;&lt;/span&gt; fail f2
  &lt;span style=&#34;color: #a52a2a;&#34;&gt;|&lt;/span&gt; &lt;a href=&#34;http://caml.inria.fr/pub/docs/manual-ocaml/libref/Pervasives.html#EXCEPTIONFailure&#34;&gt;&lt;span style=&#34;color: #06c; font-weight: bold;&#34;&gt;Failure&lt;/span&gt;&lt;/a&gt; f1, &lt;a href=&#34;http://caml.inria.fr/pub/docs/manual-ocaml/libref/Pervasives.html#EXCEPTIONFailure&#34;&gt;&lt;span style=&#34;color: #06c; font-weight: bold;&#34;&gt;Failure&lt;/span&gt;&lt;/a&gt; f2 &lt;span style=&#34;color: #a52a2a;&#34;&gt;-&amp;gt;&lt;/span&gt; fail @@ addF f1 f2&lt;/pre&gt;
      &lt;/td&gt;
    &lt;/tr&gt;
  &lt;/table&gt;
&lt;/div&gt;

&lt;p&gt;続いて、こころぴょんぴょんする関数を定義していきましょう。&lt;/p&gt;

&lt;div class=&#34;wp_codebox&#34;&gt;
  &lt;table&gt;
    &lt;tr id=&#34;p726111&#34;&gt;
      &lt;td class=&#34;code&#34; id=&#34;p726code111&#34;&gt;
        &lt;pre class=&#34;ocaml&#34; style=&#34;font-family:monospace;&#34;&gt;&lt;span style=&#34;color: #06c; font-weight: bold;&#34;&gt;let&lt;/span&gt; failOnMod n&lt;span style=&#34;color: #a52a2a;&#34;&gt;&#39;&lt;/span&gt; msg n &lt;span style=&#34;color: #a52a2a;&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #06c; font-weight: bold;&#34;&gt;if&lt;/span&gt; n &lt;span style=&#34;color: #06c; font-weight: bold;&#34;&gt;mod&lt;/span&gt; n&lt;span style=&#34;color: #a52a2a;&#34;&gt;&#39;&lt;/span&gt; &lt;span style=&#34;color: #a52a2a;&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #c6c;&#34;&gt;&lt;/span&gt; &lt;span style=&#34;color: #06c; font-weight: bold;&#34;&gt;then&lt;/span&gt; &lt;a href=&#34;http://caml.inria.fr/pub/docs/manual-ocaml/libref/Pervasives.html#EXCEPTIONFailure&#34;&gt;&lt;span style=&#34;color: #06c; font-weight: bold;&#34;&gt;Failure&lt;/span&gt;&lt;/a&gt; msg &lt;span style=&#34;color: #06c; font-weight: bold;&#34;&gt;else&lt;/span&gt; Success n
&lt;span style=&#34;color: #06c; font-weight: bold;&#34;&gt;let&lt;/span&gt; aa     &lt;span style=&#34;color: #a52a2a;&#34;&gt;=&lt;/span&gt; failOnMod &lt;span style=&#34;color: #c6c;&#34;&gt;3&lt;/span&gt; &lt;span style=&#34;color: #3cb371;&#34;&gt;&#34;あぁ^～&#34;&lt;/span&gt;
&lt;span style=&#34;color: #06c; font-weight: bold;&#34;&gt;let&lt;/span&gt; kokoro &lt;span style=&#34;color: #a52a2a;&#34;&gt;=&lt;/span&gt; failOnMod &lt;span style=&#34;color: #c6c;&#34;&gt;5&lt;/span&gt; &lt;span style=&#34;color: #3cb371;&#34;&gt;&#34;心が&#34;&lt;/span&gt;
&lt;span style=&#34;color: #06c; font-weight: bold;&#34;&gt;let&lt;/span&gt; pyon   &lt;span style=&#34;color: #a52a2a;&#34;&gt;=&lt;/span&gt; failOnMod &lt;span style=&#34;color: #c6c;&#34;&gt;7&lt;/span&gt; &lt;span style=&#34;color: #3cb371;&#34;&gt;&#34;ぴょんぴょんするんじゃぁ^～&#34;&lt;/span&gt;
&lt;span style=&#34;color: #06c; font-weight: bold;&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color: #6c6;&#34;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&#34;color: #a52a2a;&#34;&gt;&amp;&amp;&amp;&lt;/span&gt;&lt;span style=&#34;color: #6c6;&#34;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&#34;color: #a52a2a;&#34;&gt;=&lt;/span&gt; plus const &lt;span style=&#34;color: #6c6;&#34;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&#34;color: #a52a2a;&#34;&gt;^&lt;/span&gt;&lt;span style=&#34;color: #6c6;&#34;&gt;&amp;#41;&lt;/span&gt;
&lt;span style=&#34;color: #06c; font-weight: bold;&#34;&gt;let&lt;/span&gt; gochiusa &lt;span style=&#34;color: #a52a2a;&#34;&gt;=&lt;/span&gt; aa &lt;span style=&#34;color: #a52a2a;&#34;&gt;&amp;&amp;&amp;&lt;/span&gt; kokoro &lt;span style=&#34;color: #a52a2a;&#34;&gt;&amp;&amp;&amp;&lt;/span&gt; pyon &lt;span style=&#34;color: #a52a2a;&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; either &lt;a href=&#34;http://caml.inria.fr/pub/docs/manual-ocaml/libref/Pervasives.html#VALstring_of_int&#34;&gt;&lt;span style=&#34;color: #06c; font-weight: bold;&#34;&gt;string_of_int&lt;/span&gt;&lt;/a&gt; id
&amp;nbsp;
&lt;span style=&#34;color: #06c; font-weight: bold;&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color: #6c6;&#34;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&#34;color: #6c6;&#34;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&#34;color: #a52a2a;&#34;&gt;=&lt;/span&gt; &lt;a href=&#34;http://caml.inria.fr/pub/docs/manual-ocaml/libref/List.html&#34;&gt;&lt;span style=&#34;color: #06c; font-weight: bold;&#34;&gt;List&lt;/span&gt;&lt;/a&gt;&lt;span style=&#34;color: #a52a2a;&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #060;&#34;&gt;iter&lt;/span&gt; &lt;span style=&#34;color: #6c6;&#34;&gt;&amp;#40;&lt;/span&gt;gochiusa &lt;span style=&#34;color: #a52a2a;&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;a href=&#34;http://caml.inria.fr/pub/docs/manual-ocaml/libref/Printf.html&#34;&gt;&lt;span style=&#34;color: #06c; font-weight: bold;&#34;&gt;Printf&lt;/span&gt;&lt;/a&gt;&lt;span style=&#34;color: #a52a2a;&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #060;&#34;&gt;printf&lt;/span&gt; &lt;span style=&#34;color: #3cb371;&#34;&gt;&#34;%s\n&#34;&lt;/span&gt;&lt;span style=&#34;color: #6c6;&#34;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&#34;color: #6c6;&#34;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&#34;color: #c6c;&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color: #a52a2a;&#34;&gt;--&lt;/span&gt;&lt;span style=&#34;color: #c6c;&#34;&gt;105&lt;/span&gt;&lt;span style=&#34;color: #6c6;&#34;&gt;&amp;#41;&lt;/span&gt;&lt;/pre&gt;
      &lt;/td&gt;
    &lt;/tr&gt;
  &lt;/table&gt;
&lt;/div&gt;

&lt;p&gt;一部定義をすっ飛ばした関数がありますが、些細なことなのでUtil.mlのソースを見て下さいね。&lt;br /&gt;
では、さっくりMakeして実行してみましょう。&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>会社のLTでOCaml/Ocsigenについて発表しました</title>
      <link>https://blog.kokuyouwind.com/archives/655/</link>
      <pubDate>Mon, 14 Jul 2014 15:18:21 +0000</pubDate>
      
      <guid>https://blog.kokuyouwind.com/archives/655/</guid>
      <description>&lt;p&gt;うちの会社は割といろんな言語を使っているエンジニアがいるのですが、OCamlerは少なそうだったのでOCamlを布教するべく、OCamlでWebサービスが作れるOcsigenの紹介LTをしてきました。&lt;/p&gt;

&lt;p&gt;簡単にOcsigenを題材に選んだ流れをまとめると、&lt;br /&gt;
　先週月曜(2014/07/07)に全社ハッカソンがあった&lt;br /&gt;
→せっかくなのでOcsigenでなんか作りたかった&lt;br /&gt;
→チュートリアルの途中で力尽きた&lt;br /&gt;
→社内LTの発表順が翌週だったので、土日使ってチュートリアルを最後まで終わらせてネタにすることにした&lt;br /&gt;
というような感じでした。&lt;/p&gt;

&lt;p&gt;本当はチュートリアルで終わらずにアプリを作りたかったのですが、思いのほか環境構築のほうに手間取ったためにたどり着けませんでした…&lt;br /&gt;
まぁ思いのほかOcsigenのモジュール構成が複雑だったので、ある程度習熟しないと一朝一夕でなんか作るのはしんどそうでしたが。&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>OCamlでBefungeインタプリタを実装してみた</title>
      <link>https://blog.kokuyouwind.com/archives/245/</link>
      <pubDate>Tue, 13 Dec 2011 16:06:44 +0000</pubDate>
      
      <guid>https://blog.kokuyouwind.com/archives/245/</guid>
      <description>&lt;p&gt;なぜかふと思い立って、BefungeのインタプリタをOCamlで実装してしまいました。&lt;br /&gt;
Befungeってどんな言語？　というと、↓がHello,worldのソースファイルになるような言語です。&lt;br /&gt;
ちなみにこのソースはWikipediaのものをそのままお借りしています。&lt;/p&gt;

&lt;div class=&#34;wp_codebox&#34;&gt;
  &lt;table&gt;
    &lt;tr id=&#34;p24596&#34;&gt;
      &lt;td class=&#34;code&#34; id=&#34;p245code96&#34;&gt;
        &lt;pre class=&#34;befunge&#34; style=&#34;font-family:monospace;&#34;&gt;v @_       v
&amp;gt;0&#34;!dlroW&#34;v 
v  :#     &amp;lt;
&amp;gt;&#34; ,olleH&#34; v
   ^       &amp;lt;&lt;/pre&gt;
      &lt;/td&gt;
    &lt;/tr&gt;
  &lt;/table&gt;
&lt;/div&gt;

&lt;p&gt;WP-Codeboxでハイライトされない……&lt;br /&gt;
まぁ、さすがにこんなところまでサポートしてないですよね。&lt;br /&gt;
Brainfu*kはあるみたいですが。&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>OCamlでカウンターモジュール</title>
      <link>https://blog.kokuyouwind.com/archives/237/</link>
      <pubDate>Tue, 13 Dec 2011 05:04:22 +0000</pubDate>
      
      <guid>https://blog.kokuyouwind.com/archives/237/</guid>
      <description>&lt;p&gt;副作用はなるべくないほうがよい。&lt;br /&gt;
それはそうなんですが、副作用を使ったほうが効率がよかったり、コードの見通しが良くなったりすることもよくある話です。&lt;br /&gt;
例えば、以下のような単純な表示関数printを考えます。&lt;/p&gt;

&lt;div class=&#34;wp_codebox&#34;&gt;
  &lt;table&gt;
    &lt;tr id=&#34;p23778&#34;&gt;
      &lt;td class=&#34;code&#34; id=&#34;p237code78&#34;&gt;
        &lt;pre class=&#34;ocaml&#34; style=&#34;font-family:monospace;&#34;&gt;&lt;span style=&#34;color: #06c; font-weight: bold;&#34;&gt;let&lt;/span&gt; print s &lt;span style=&#34;color: #a52a2a;&#34;&gt;=&lt;/span&gt;
  &lt;a href=&#34;http://caml.inria.fr/pub/docs/manual-ocaml/libref/Format.html&#34;&gt;&lt;span style=&#34;color: #06c; font-weight: bold;&#34;&gt;Format&lt;/span&gt;&lt;/a&gt;&lt;span style=&#34;color: #a52a2a;&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #060;&#34;&gt;printf&lt;/span&gt; &lt;span style=&#34;color: #3cb371;&#34;&gt;&#34;%s@.&#34;&lt;/span&gt; s&lt;/pre&gt;
      &lt;/td&gt;
    &lt;/tr&gt;
  &lt;/table&gt;
&lt;/div&gt;

&lt;p&gt;当然ながら、呼び出すと以下のように引数の文字列をそのまま表示します。&lt;/p&gt;

&lt;div class=&#34;wp_codebox&#34;&gt;
  &lt;table&gt;
    &lt;tr id=&#34;p23779&#34;&gt;
      &lt;td class=&#34;code&#34; id=&#34;p237code79&#34;&gt;
        &lt;pre class=&#34;ocaml&#34; style=&#34;font-family:monospace;&#34;&gt;&lt;span style=&#34;color: #a52a2a;&#34;&gt;#&lt;/span&gt; print &lt;span style=&#34;color: #3cb371;&#34;&gt;&#34;a&#34;&lt;/span&gt;&lt;span style=&#34;color: #a52a2a;&#34;&gt;;;&lt;/span&gt;
a
&lt;span style=&#34;color: #a52a2a;&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color: #a52a2a;&#34;&gt;:&lt;/span&gt; unit &lt;span style=&#34;color: #a52a2a;&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #6c6;&#34;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&#34;color: #6c6;&#34;&gt;&amp;#41;&lt;/span&gt;
&lt;span style=&#34;color: #a52a2a;&#34;&gt;#&lt;/span&gt; print &lt;span style=&#34;color: #3cb371;&#34;&gt;&#34;b&#34;&lt;/span&gt;&lt;span style=&#34;color: #a52a2a;&#34;&gt;;;&lt;/span&gt;
b
&lt;span style=&#34;color: #a52a2a;&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color: #a52a2a;&#34;&gt;:&lt;/span&gt; unit &lt;span style=&#34;color: #a52a2a;&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #6c6;&#34;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&#34;color: #6c6;&#34;&gt;&amp;#41;&lt;/span&gt;
&lt;span style=&#34;color: #a52a2a;&#34;&gt;#&lt;/span&gt; print &lt;span style=&#34;color: #3cb371;&#34;&gt;&#34;c&#34;&lt;/span&gt;&lt;span style=&#34;color: #a52a2a;&#34;&gt;;;&lt;/span&gt;
c&lt;/pre&gt;
      &lt;/td&gt;
    &lt;/tr&gt;
  &lt;/table&gt;
&lt;/div&gt;</description>
    </item>
    
    <item>
      <title>OCaml標準ライブラリの拡張</title>
      <link>https://blog.kokuyouwind.com/archives/214/</link>
      <pubDate>Fri, 09 Dec 2011 15:31:54 +0000</pubDate>
      
      <guid>https://blog.kokuyouwind.com/archives/214/</guid>
      <description>&lt;p&gt;OCamlで使える標準ライブラリは、最初に触れた時こそ「すげー、集合とか標準で使えるの！？」とか思ってたものの、実際触っていると「あれ？　Setってof_listないの？」とか「え？　リストのconsって関数として用意されてないの？」とか「うわっ……私の年収、低すぎ……？」など、いろいろな不満が出てきます。最後のは関係ありませんが。&lt;/p&gt;

&lt;p&gt;調べてみたところ、あれは標準ライブラリではなくすとっどりぶなのですね……&lt;br /&gt;
それならしょうがない。&lt;br /&gt;
普通ならCoreとかBatteriesとか入れるんでしょうが、変な依存性入れたくないですし、これまで組んだプログラムを修正するのも面倒なので、勉強も兼ねて自分で互換性持たせたまま拡張してみることにしました。&lt;br /&gt;
先日、OCamlでモナドっぽいものを作ったという記事を書きましたが、それも拡張の一貫ですね。&lt;br /&gt;
というわけで、覚え書きも兼ねて、詰まった部分などをまとめておきます。&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Haskellの資料まとめ</title>
      <link>https://blog.kokuyouwind.com/archives/207/</link>
      <pubDate>Wed, 07 Dec 2011 01:38:04 +0000</pubDate>
      
      <guid>https://blog.kokuyouwind.com/archives/207/</guid>
      <description>&lt;p&gt;モナドを勉強するに辺り、やはり進んでいるのはHaskellらしく、調べてるだけでHaskellに関する情報がぼろぼろ出てきたのでその辺をご紹介。&lt;/p&gt;

&lt;p&gt;まず、「モナドのすべて」さん。&lt;br /&gt;
モナドの基礎についてかなり詳しく書かれています。&lt;br /&gt;
Haskellについて知らなくてもなんとなくはわかったので、特にOptionモナドやListモナドを実装する上で参考にさせて頂きました。&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>OCamlでモナドっぽいものを作る</title>
      <link>https://blog.kokuyouwind.com/archives/199/</link>
      <pubDate>Tue, 06 Dec 2011 16:49:56 +0000</pubDate>
      
      <guid>https://blog.kokuyouwind.com/archives/199/</guid>
      <description>&lt;p&gt;ライブラリの拡充と関数型言語のお勉強を兼ねて、モナドっぽいものを実装して見ました。&lt;br /&gt;
単純にモナドをOCamlで使いたいだけならMonad拡張を入れる方が手っ取り早いですが、あまり外部ライブラリへの依存性を入れたくないのと、OCamlの記法の中だけでどこまで出来るか試してみたかったので。&lt;br /&gt;
ちなみに誤解を避けるため先に断っておきますが、自分はHaskellerではありません。&lt;br /&gt;
以下ではモナドに関してHaskellをかなり参考にしていますが、Haskellのモナドに対する勘違いなどが含まれている可能性があります。&lt;br /&gt;
ご了承下さい。&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>擬似中置記法</title>
      <link>https://blog.kokuyouwind.com/archives/183/</link>
      <pubDate>Tue, 06 Dec 2011 07:06:16 +0000</pubDate>
      
      <guid>https://blog.kokuyouwind.com/archives/183/</guid>
      <description>&lt;p&gt;OCamlでは、modは特別扱いで中置記法として定義されています。&lt;/p&gt;

&lt;div class=&#34;wp_codebox&#34;&gt;
  &lt;table&gt;
    &lt;tr id=&#34;p18360&#34;&gt;
      &lt;td class=&#34;code&#34; id=&#34;p183code60&#34;&gt;
        &lt;pre class=&#34;ocaml&#34; style=&#34;font-family:monospace;&#34;&gt;&lt;span style=&#34;color: #a52a2a;&#34;&gt;#&lt;/span&gt; &lt;span style=&#34;color: #6c6;&#34;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&#34;color: #06c; font-weight: bold;&#34;&gt;mod&lt;/span&gt;&lt;span style=&#34;color: #6c6;&#34;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&#34;color: #a52a2a;&#34;&gt;;;&lt;/span&gt;
&lt;span style=&#34;color: #a52a2a;&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color: #a52a2a;&#34;&gt;:&lt;/span&gt; int &lt;span style=&#34;color: #a52a2a;&#34;&gt;-&amp;gt;&lt;/span&gt; int &lt;span style=&#34;color: #a52a2a;&#34;&gt;-&amp;gt;&lt;/span&gt; int &lt;span style=&#34;color: #a52a2a;&#34;&gt;=&lt;/span&gt; 
&lt;span style=&#34;color: #a52a2a;&#34;&gt;#&lt;/span&gt; &lt;span style=&#34;color: #c6c;&#34;&gt;5&lt;/span&gt; &lt;span style=&#34;color: #06c; font-weight: bold;&#34;&gt;mod&lt;/span&gt; &lt;span style=&#34;color: #c6c;&#34;&gt;3&lt;/span&gt;&lt;span style=&#34;color: #a52a2a;&#34;&gt;;;&lt;/span&gt;
&lt;span style=&#34;color: #a52a2a;&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color: #a52a2a;&#34;&gt;:&lt;/span&gt; int &lt;span style=&#34;color: #a52a2a;&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #c6c;&#34;&gt;2&lt;/span&gt;&lt;/pre&gt;
      &lt;/td&gt;
    &lt;/tr&gt;
  &lt;/table&gt;
&lt;/div&gt;

&lt;p&gt;たとえばこの別名でremという関数を作りたくても、これを中置記法で定義することは出来ません。&lt;/p&gt;

&lt;div class=&#34;wp_codebox&#34;&gt;
  &lt;table&gt;
    &lt;tr id=&#34;p18361&#34;&gt;
      &lt;td class=&#34;code&#34; id=&#34;p183code61&#34;&gt;
        &lt;pre class=&#34;ocaml&#34; style=&#34;font-family:monospace;&#34;&gt;&lt;span style=&#34;color: #a52a2a;&#34;&gt;#&lt;/span&gt; &lt;span style=&#34;color: #06c; font-weight: bold;&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color: #6c6;&#34;&gt;&amp;#40;&lt;/span&gt;rem&lt;span style=&#34;color: #6c6;&#34;&gt;&amp;#41;&lt;/span&gt; x y &lt;span style=&#34;color: #a52a2a;&#34;&gt;=&lt;/span&gt; x &lt;span style=&#34;color: #06c; font-weight: bold;&#34;&gt;mod&lt;/span&gt; y&lt;span style=&#34;color: #a52a2a;&#34;&gt;;;&lt;/span&gt;
Error&lt;span style=&#34;color: #a52a2a;&#34;&gt;:&lt;/span&gt; Syntax error&lt;/pre&gt;
      &lt;/td&gt;
    &lt;/tr&gt;
  &lt;/table&gt;
&lt;/div&gt;

&lt;p&gt;これは、中置演算子として定義できる文字列が、記号の特定の組み合わせ、もしくは予約された文字列、というふうに決められているからですね。&lt;br /&gt;
中置演算子として予約された文字列にはor,mod,land,lor,lxor,lsl,lsr,asrがあります。&lt;br /&gt;
(参考：公式マニュアルのinfix-opの項)&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>不動点と不動点コンビネータ</title>
      <link>https://blog.kokuyouwind.com/archives/174/</link>
      <pubDate>Tue, 06 Dec 2011 05:54:16 +0000</pubDate>
      
      <guid>https://blog.kokuyouwind.com/archives/174/</guid>
      <description>&lt;p&gt;ある関数  &lt;img src=&#34;//s0.wp.com/latex.php?latex=f%28x%29&amp;#038;bg=ffffff&amp;#038;fg=000&amp;#038;s=0&#34; alt=&#34;f(x)&#34; title=&#34;f(x)&#34; class=&#34;latex&#34; /&gt;について、  &lt;img src=&#34;//s0.wp.com/latex.php?latex=x_0+%3D+f+%28x_0%29&amp;#038;bg=ffffff&amp;#038;fg=000&amp;#038;s=0&#34; alt=&#34;x_0 = f (x_0)&#34; title=&#34;x_0 = f (x_0)&#34; class=&#34;latex&#34; /&gt;となる  &lt;img src=&#34;//s0.wp.com/latex.php?latex=x_0&amp;#038;bg=ffffff&amp;#038;fg=000&amp;#038;s=0&#34; alt=&#34;x_0&#34; title=&#34;x_0&#34; class=&#34;latex&#34; /&gt;が存在するとき、  &lt;img src=&#34;//s0.wp.com/latex.php?latex=x_0&amp;#038;bg=ffffff&amp;#038;fg=000&amp;#038;s=0&#34; alt=&#34;x_0&#34; title=&#34;x_0&#34; class=&#34;latex&#34; /&gt;を  &lt;img src=&#34;//s0.wp.com/latex.php?latex=f&amp;#038;bg=ffffff&amp;#038;fg=000&amp;#038;s=0&#34; alt=&#34;f&#34; title=&#34;f&#34; class=&#34;latex&#34; /&gt;の不動点といいます。&lt;br /&gt;
また、  &lt;img src=&#34;//s0.wp.com/latex.php?latex=x_0&amp;#038;bg=ffffff&amp;#038;fg=000&amp;#038;s=0&#34; alt=&#34;x_0&#34; title=&#34;x_0&#34; class=&#34;latex&#34; /&gt;に十分近い  &lt;img src=&#34;//s0.wp.com/latex.php?latex=x&amp;#038;bg=ffffff&amp;#038;fg=000&amp;#038;s=0&#34; alt=&#34;x&#34; title=&#34;x&#34; class=&#34;latex&#34; /&gt;に対し、列  &lt;img src=&#34;//s0.wp.com/latex.php?latex=x%2C+f%28x%29%2C+f%28f%28x%29%29%2C+%5Cldots&amp;#038;bg=ffffff&amp;#038;fg=000&amp;#038;s=0&#34; alt=&#34;x, f(x), f(f(x)), &amp;#92;ldots&#34; title=&#34;x, f(x), f(f(x)), &amp;#92;ldots&#34; class=&#34;latex&#34; /&gt;が  &lt;img src=&#34;//s0.wp.com/latex.php?latex=x_0&amp;#038;bg=ffffff&amp;#038;fg=000&amp;#038;s=0&#34; alt=&#34;x_0&#34; title=&#34;x_0&#34; class=&#34;latex&#34; /&gt;に収束するとき、  &lt;img src=&#34;//s0.wp.com/latex.php?latex=x_0&amp;#038;bg=ffffff&amp;#038;fg=000&amp;#038;s=0&#34; alt=&#34;x_0&#34; title=&#34;x_0&#34; class=&#34;latex&#34; /&gt;は  &lt;img src=&#34;//s0.wp.com/latex.php?latex=f+&amp;#038;bg=ffffff&amp;#038;fg=000&amp;#038;s=0&#34; alt=&#34;f &#34; title=&#34;f &#34; class=&#34;latex&#34; /&gt;の吸引的不動点である、といいます。&lt;br /&gt;
(参考:Wikipedia)&lt;/p&gt;

&lt;p&gt;吸引的不動点は、値が変化しなくなるまで関数適用を繰り返すだけなので、プログラムで簡単に書くことができます。&lt;br /&gt;
以下のfixは初期値xからfの吸引的不動点を求める関数です。&lt;br /&gt;
汎用性のため、一致検査関数はequalとして引数で取ります。&lt;/p&gt;

&lt;div class=&#34;wp_codebox&#34;&gt;
  &lt;table&gt;
    &lt;tr id=&#34;p17448&#34;&gt;
      &lt;td class=&#34;code&#34; id=&#34;p174code48&#34;&gt;
        &lt;pre class=&#34;ocaml&#34; style=&#34;font-family:monospace;&#34;&gt;&lt;span style=&#34;color: #06c; font-weight: bold;&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color: #06c; font-weight: bold;&#34;&gt;rec&lt;/span&gt; fix equal f x &lt;span style=&#34;color: #a52a2a;&#34;&gt;=&lt;/span&gt;
  &lt;span style=&#34;color: #06c; font-weight: bold;&#34;&gt;let&lt;/span&gt; x&lt;span style=&#34;color: #a52a2a;&#34;&gt;&#39;&lt;/span&gt; &lt;span style=&#34;color: #a52a2a;&#34;&gt;=&lt;/span&gt; f x &lt;span style=&#34;color: #06c; font-weight: bold;&#34;&gt;in&lt;/span&gt;
    &lt;span style=&#34;color: #06c; font-weight: bold;&#34;&gt;if&lt;/span&gt; equal x x&lt;span style=&#34;color: #a52a2a;&#34;&gt;&#39;&lt;/span&gt; &lt;span style=&#34;color: #06c; font-weight: bold;&#34;&gt;then&lt;/span&gt; x
    &lt;span style=&#34;color: #06c; font-weight: bold;&#34;&gt;else&lt;/span&gt; fix equal f x&lt;span style=&#34;color: #a52a2a;&#34;&gt;&#39;&lt;/span&gt;&lt;/pre&gt;
      &lt;/td&gt;
    &lt;/tr&gt;
  &lt;/table&gt;
&lt;/div&gt;</description>
    </item>
    
    <item>
      <title>第一級モジュール</title>
      <link>https://blog.kokuyouwind.com/archives/164/</link>
      <pubDate>Mon, 05 Dec 2011 06:58:56 +0000</pubDate>
      
      <guid>https://blog.kokuyouwind.com/archives/164/</guid>
      <description>&lt;p&gt;OCamlには、3.12から「第一級モジュール」の機能が加わっているらしいです。&lt;br /&gt;
第一級モジュールとは、第一級オブジェクトとしてモジュールが扱える、つまり変数や関数と同じように関数への受け渡しや代入操作が出来るものです。&lt;br /&gt;
公式マニュアル7.14 第一級のモジュールに詳しい説明があります。&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>let多相と値多相</title>
      <link>https://blog.kokuyouwind.com/archives/155/</link>
      <pubDate>Sun, 04 Dec 2011 06:57:14 +0000</pubDate>
      
      <guid>https://blog.kokuyouwind.com/archives/155/</guid>
      <description>&lt;p&gt;先日、関数合成を使うと、無駄なletやfunを減らせていいよね、という話をしました。&lt;/p&gt;

&lt;div class=&#34;wp_codebox&#34;&gt;
  &lt;table&gt;
    &lt;tr id=&#34;p15526&#34;&gt;
      &lt;td class=&#34;code&#34; id=&#34;p155code26&#34;&gt;
        &lt;pre class=&#34;ocaml&#34; style=&#34;font-family:monospace;&#34;&gt;&lt;span style=&#34;color: #06c; font-weight: bold;&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color: #6c6;&#34;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&#34;color: #a52a2a;&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&#34;color: #6c6;&#34;&gt;&amp;#41;&lt;/span&gt; f g x &lt;span style=&#34;color: #a52a2a;&#34;&gt;=&lt;/span&gt; g &lt;span style=&#34;color: #6c6;&#34;&gt;&amp;#40;&lt;/span&gt;f x&lt;span style=&#34;color: #6c6;&#34;&gt;&amp;#41;&lt;/span&gt;&lt;/pre&gt;
      &lt;/td&gt;
    &lt;/tr&gt;
  &lt;/table&gt;
&lt;/div&gt;

&lt;p&gt;で、関数合成を多用していると、2引数関数に対しても合成をしたくなる局面が出てきます。&lt;br /&gt;
たとえば、compareを元にしてequalを作ろうと思った場合、素直なコードは以下になります。&lt;/p&gt;

&lt;div class=&#34;wp_codebox&#34;&gt;
  &lt;table&gt;
    &lt;tr id=&#34;p15527&#34;&gt;
      &lt;td class=&#34;code&#34; id=&#34;p155code27&#34;&gt;
        &lt;pre class=&#34;ocaml&#34; style=&#34;font-family:monospace;&#34;&gt;&lt;span style=&#34;color: #06c; font-weight: bold;&#34;&gt;let&lt;/span&gt; equal x y &lt;span style=&#34;color: #a52a2a;&#34;&gt;=&lt;/span&gt;
  &lt;a href=&#34;http://caml.inria.fr/pub/docs/manual-ocaml/libref/Pervasives.html#VALcompare&#34;&gt;&lt;span style=&#34;color: #06c; font-weight: bold;&#34;&gt;compare&lt;/span&gt;&lt;/a&gt; x y &lt;span style=&#34;color: #a52a2a;&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #c6c;&#34;&gt;&lt;/span&gt;&lt;/pre&gt;
      &lt;/td&gt;
    &lt;/tr&gt;
  &lt;/table&gt;
&lt;/div&gt;

&lt;p&gt;これは、「xとyをcompareして、その値が0と等しいかを検査する」という関数になります。&lt;br /&gt;
これをcompareと(=) 0の関数合成で書こうとするとさっきの関数合成関数ではできません。(後述するカリー化とアンカリー化を使えば出来ますが)&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>OCamlでSetをmapする関数</title>
      <link>https://blog.kokuyouwind.com/archives/124/</link>
      <pubDate>Wed, 30 Nov 2011 14:06:25 +0000</pubDate>
      
      <guid>https://blog.kokuyouwind.com/archives/124/</guid>
      <description>&lt;p&gt;今日も今日とてOCamlでプログラムをガリガリ書いていたのですが、どうしても気になってSetをmapする関数を作って見ました。&lt;br /&gt;
とはいえ、さすがにSetに組み込むのは無理なので、外部で似たようなことをやるための汎用関数ですが。&lt;/p&gt;

&lt;div class=&#34;wp_codebox&#34;&gt;
  &lt;table&gt;
    &lt;tr id=&#34;p12415&#34;&gt;
      &lt;td class=&#34;code&#34; id=&#34;p124code15&#34;&gt;
        &lt;pre class=&#34;ocaml&#34; style=&#34;font-family:monospace;&#34;&gt;&lt;span style=&#34;color: #06c; font-weight: bold;&#34;&gt;let&lt;/span&gt; mapper folder adder empty f s &lt;span style=&#34;color: #a52a2a;&#34;&gt;=&lt;/span&gt;
  folder &lt;span style=&#34;color: #6c6;&#34;&gt;&amp;#40;&lt;/span&gt;f &lt;span style=&#34;color: #a52a2a;&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; adder&lt;span style=&#34;color: #6c6;&#34;&gt;&amp;#41;&lt;/span&gt; s empty&lt;/pre&gt;
      &lt;/td&gt;
    &lt;/tr&gt;
  &lt;/table&gt;
&lt;/div&gt;

&lt;p&gt;こんな感じです。&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>F#のパイプライン演算子・関数合成をOCamlで実装</title>
      <link>https://blog.kokuyouwind.com/archives/50/</link>
      <pubDate>Tue, 29 Nov 2011 08:44:19 +0000</pubDate>
      
      <guid>https://blog.kokuyouwind.com/archives/50/</guid>
      <description>&lt;p&gt;最近F#が気になっているのだけれど、F#で魅力を感じる機能の一つに、パイプライン演算子というのがあります。&lt;br /&gt;
これはUnixのパイプライン処理に類似するもので、値をある処理に与えて、その結果をまた別の処理に与えて……というのをかなり見やすく記述できる、というものです。&lt;br /&gt;
例えば、リストの各要素を2乗してから和を取る、という関数sqr_sumは、素直に書くと次の様になります。&lt;/p&gt;

&lt;div class=&#34;wp_codebox&#34;&gt;
  &lt;table&gt;
    &lt;tr id=&#34;p501&#34;&gt;
      &lt;td class=&#34;code&#34; id=&#34;p50code1&#34;&gt;
        &lt;pre class=&#34;ocaml&#34; style=&#34;font-family:monospace;&#34;&gt;&lt;span style=&#34;color: #06c; font-weight: bold;&#34;&gt;let&lt;/span&gt; sqr_sum l &lt;span style=&#34;color: #a52a2a;&#34;&gt;=&lt;/span&gt; &lt;a href=&#34;http://caml.inria.fr/pub/docs/manual-ocaml/libref/List.html&#34;&gt;&lt;span style=&#34;color: #06c; font-weight: bold;&#34;&gt;List&lt;/span&gt;&lt;/a&gt;&lt;span style=&#34;color: #a52a2a;&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #060;&#34;&gt;fold_left&lt;/span&gt; &lt;span style=&#34;color: #6c6;&#34;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&#34;color: #a52a2a;&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color: #6c6;&#34;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&#34;color: #c6c;&#34;&gt;&lt;/span&gt; &lt;span style=&#34;color: #6c6;&#34;&gt;&amp;#40;&lt;/span&gt;&lt;a href=&#34;http://caml.inria.fr/pub/docs/manual-ocaml/libref/List.html&#34;&gt;&lt;span style=&#34;color: #06c; font-weight: bold;&#34;&gt;List&lt;/span&gt;&lt;/a&gt;&lt;span style=&#34;color: #a52a2a;&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color: #060;&#34;&gt;map&lt;/span&gt; &lt;span style=&#34;color: #6c6;&#34;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&#34;color: #06c; font-weight: bold;&#34;&gt;fun&lt;/span&gt; x &lt;span style=&#34;color: #a52a2a;&#34;&gt;-&amp;gt;&lt;/span&gt; x &lt;span style=&#34;color: #a52a2a;&#34;&gt;*&lt;/span&gt; x&lt;span style=&#34;color: #6c6;&#34;&gt;&amp;#41;&lt;/span&gt; l&lt;span style=&#34;color: #6c6;&#34;&gt;&amp;#41;&lt;/span&gt;&lt;/pre&gt;
      &lt;/td&gt;
    &lt;/tr&gt;
  &lt;/table&gt;
&lt;/div&gt;

&lt;p&gt;まぁ読めなくはないですが、どこから処理されるのか一瞬迷いますよね。&lt;br /&gt;
もっと複雑に、リストのうち奇数であるような要素のみを取り出し、これを2乗して和を取る、なんてのを書いてみましょう。&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>OCamlのSet.Sにmap関数はない</title>
      <link>https://blog.kokuyouwind.com/archives/15/</link>
      <pubDate>Sun, 27 Nov 2011 07:52:58 +0000</pubDate>
      
      <guid>https://blog.kokuyouwind.com/archives/15/</guid>
      <description>&lt;p&gt;最近研究でOCamlのSetやMapを多用するんですが、Set.Sの中にmap関数はないんですね。&lt;br /&gt;
タプルの特定要素を取り出したり情報を付与したりするときにSet-&amp;gt;Set変換する必要があるんですが、いちいちfoldするのが面倒……&lt;br /&gt;
Listなんかにはmap関数があるのであってもよさそうなものですが、よく考えるとこの関数、型として表現が難しい(というかできない)のですね。&lt;/p&gt;

&lt;p&gt;Setはファンクターなので、例えばint型のSetなら(作れないですが)&lt;/p&gt;

&lt;pre&gt;int Set&lt;/pre&gt;

&lt;p&gt;ではなく&lt;/p&gt;

&lt;pre&gt;module IntSet = Set.Make  (struct    type t = int    let compare = compare   end)&lt;/pre&gt;

&lt;p&gt;といった感じになります。&lt;br /&gt;
要素の型や比較関数をまとめてストラクチャーとしてファンクターに与えることで、内部の型が固定されたストラクチャーが返されるわけです。&lt;/p&gt;

&lt;p&gt;んで、ファンクターの内部では集合自体の型はt、要素の型はeltで表されてるわけです。例えば&lt;/p&gt;

&lt;pre&gt;empty : tadd : elt -&amp;gt; t -&amp;gt; t&lt;/pre&gt;

&lt;p&gt;といった具合です。(OCamlマニュアルより)&lt;br /&gt;
ところがここでmap関数を考えると、&lt;/p&gt;

&lt;pre&gt;map : (elt -&amp;gt; &#39;a) -&amp;gt; t -&amp;gt; &#39;a set(?)&lt;/pre&gt;

&lt;p&gt;といった具合で、出力が&amp;#8217;aを要素とするSetになるわけですが、当然ファンクターはそんな型を知らないので定義できません。&lt;br /&gt;
with type構文とか使えないかなーと一瞬考えましたが、あれはSet.Sに型を与えてシグネチャを作るだけでしたね。全然関係ないです。&lt;/p&gt;</description>
    </item>
    
  </channel>
</rss>