プログラミング in OCaml #2

プログラミング in OCaml (目次) - kengpong

(* 練習問題3.3 *)
(* 式 b1 && b2 を || と not と b1, b2 のみを用いて同じ意味になるように書く。*)
let before b1 b2 = b1 && b2;;
let after b1 b2 = (not (not b1 || not b2));;
(* 式 b1 || b2 を && と not と b1, b2 のみを用いて同じく。*)
let before b1 b2 = b1 || b2;;
let after b1 b2 = (not (not b1 && nob b2));;

しばらく考えて駄目っぽかったのでカンニングしたところ、ド・モルガンの法則 - Wikipediaとかいう奴らしい。

プログラミング in OCaml #1

プログラミング in OCaml (目次) - kengpong

(* 練習問題3.2 *)
(*
 *  式 b1 && b2 を if 式と true, false, b1, b2 のみを用いて、同じ意味になるようにする。
 *  式 b1 || b2 についても同様に。
 *  簡単過ぎるようであれば if の使用を一度までにする。
 *)
let before b1 b2 = b1 && b2;;
let after b1 b2 =
    if b1 then
        if b2 then
            true
        else
            false
    else
        false
;;
let more b1 b2 =
    if b1 then 
        b2
    else
        b1
;;

(* b1 || b2 についても同様に *)
let before b1 b2 = b1 || b2;;
let after b1 b2 =
    if b1 then
        true
    else
        if b2 then
            true
        else
            false
;;
let more b1 b2 =
    if b1 then
        b1
    else
        b2
;;      

if 式一度ってのは、これやるまであまり考えてなかった発想だなー。

プログラミング in OCaml #0

プログラミング in OCaml (目次) - kengpong

(* 練習問題 3.1 *)

(* USドルを受け取って円に換算する関数 *)
let dollar2yen dollar =
    let rate = 114.32 in
    int_of_float (floor (dollar *. rate +. 0.5))
;;

(* 円を受け取ってUSドルに換算する関数 *)
let yen2dollar yen =
    let rate = 114.32 in
    (floor ((float_of_int yen) *. 10. /. rate +. 0.5)) /. 10.
;;

(* USドルを受け取って文字列を返す関数 *)
let dollar2yen_string dollar =
    let dollar_string = string_of_float dollar in
    let yen_string = string_of_int (dollar2yen dollar) in
    dollar_string ^ " dollars are " ^ yen_string  ^ " yen."
;;

(* 文字を受け取ってアルファベットなら大文字に、その他はそのまま返す関数 *)
let capitalize c =
    let c_int = int_of_char c in
    if c_int > 96 && c_int < 123 then
        char_of_int (c_int - 32) 
    else
        c
;;      

プログラミング in OCaml (目次)

前置き

前回の日記ではてな市民になれたようで、ここいらで一発ちゃんと日記書くかーというところに届きました プログラミング in OCaml
ちょうど良いので、この本の練習問題を連載していく事にしました。どこまで続くかな?

方針

  • 練習問題と解いた答えを書いていく
    • これはやらんでいいだろうみたいなものは、バシバシ飛ばす
  • ここにインデックス用のトラックバックを打っていく

という感じで進めていこう。
ただ、問題文が長くて打つのめんどくさい時は、勝手に端折っていくようになるだろうと予想。

というわけで

いつも通りツッコミとかお待ちしておりますので、勝手に添削なりコメントなりよろすくおねがいします!

追記

あー、そういえば、、
どこまでが引用で、どこからがまずいのかとか良くわかっていないので、そういった意味でのツッコミとかもあったら教えてください!

プログラミング in OCaml ~関数型プログラミングの基礎からGUI構築まで~

プログラミング in OCaml ~関数型プログラミングの基礎からGUI構築まで~

Re:PHPの標準関数でPOSTする方法

PHPでPOSTを送信するとなると、Pearのライブラリを使った方法が一般的だと思いますが、Pearなんて大嫌いだという人もいるかと思います。そこで、PHPの標準関数だけでPostを実行する関数を作ってみました。間違ってるよとか、つかいづれーとか、もっと言い書き方があるよ、なんて意見があればはてぶでがんがん叩いていただけると幸いです。

PHPの標準関数でPOSTする方法 | eラーニングをすべての人に!blog.eラーニング.co.jp

元コードはリンク先で見てもらうとして、僕がつかいづれーとか思ったのは以下。

  • httpsに対応していない
  • ポートが80固定

というわけで書いてみました。

<?php
error_reporting(E_ALL);

function post($url, $data, $headers = array()) {
    $content = http_build_query($data);
    $headers += array(
        'Content-type'   => 'application/x-www-form-urlencoded',
        'Content-Length' => strlen($content),
    );
    $header = '';
    foreach ($headers as $key => $val) {
        $header .= "$key: $val\r\n";
    }
    $params = array(
        'http' => array(
            'method'  => 'POST',
            'header'  => $header,
            'content' => $content,
        ),
    );
    $context = stream_context_create($params);
    if (!$fp = fopen($url, 'rb', false, $context)) {
        return false;
    }
    return stream_get_contents($fp);
}
echo post('http://example.com/',               array('hoge' => 1)); // ふつう
echo post('https://example.com/',              array('huga' => 2)); // https
echo post('http://example.com:8000/',          array('piyo' => 3)); // ポート指定
echo post('http://user:password@example.com/', array('piyo' => 4)); // こんなのも!・・・でも使うか?

例外処理などを全然考えてない感じのコードですので、割とどうでも良い用途にしか使えそうにありませんが、
さくっとやりたいだけならこんな感じでも良いのでしょうかね。

蛇足

元コードの方に、バックスラッシュと意味の無いグルーピング*1のせいで見難い正規表現がありますが、これは以下のように変更すると良いと思います。

<?php
$pattern = "/^(http):\/\/([^\/]+)\/.*$/i"; // なにがなんだか><

$pattern = '!^http://([^/]+)/.*$!i'; // やったね!

*1: (http)で後方参照可能なグルーピングをしているが、参照してる所が無い

(Carbon|Cocoa)Emacsと環境変数(主に$PATHについて)

Emacs を Spotlight から起動すると、 PATH=/usr/bin:/bin みたいな事になっていて、shell-command とかを使う時に悲しい感じです。
普段使っている shell から $PATH を引き継いでくれると僕はすごく助かる!
というわけで、僕は以下のような elisp を書いて凌いでいますが激しく力技っぽいので、より良い方法があればツッコんでください。

;; ~/.env に 環境変数の設定がまとまっていて .bashrc とかから呼ぶようにしてある
(defun set-shell-path ()
  (interactive)
  (setenv "PATH"
          (mapconcat 'identity
                     (split-string (shell-command-to-string
                                    "source ~/.env;echo $PATH") ":") ":")))