プログラミング一般」カテゴリーアーカイブ

論理回路と関数型言語

ものすごく唐突に関数型言語と論理回路は似ているなー、と思った。

Pythonに関数型プログラミングの構文として用意してあるイテレータやジェネレータみたいな”状態を持つ関数”っていうのはカウンタに代表される組み合わせ回路と振る舞いが似ている。

論理回路のプロトタイプ作成とかに関数型言語使うと便利そうな。

何かそれぞれの起源に共通の祖先があったりするのかしら?

Project Euler

Project Eulerというサイトを見つけた。
このサイトにはコンピュータを使って解くタイプの数学の問題がたくさん載っている。
アカウントを取得すると各問題に回答したかどうかをサイト上で見ることができる。

10問くらい解いてみたけど、問題のタイプとしては素数とか数列とかそういった類のものが多い印象。
新しい言語を覚えるときに、このサイトに載ってる問題をその言語で解いたりすると勉強になりそう。

Schemeと再帰

Schemeチュートリアルの内容をゴリゴリ写経してます。

基本的な制御構造が繰り返しでなく再帰のため、初っぱなから再帰の洗礼に見舞われてます。
ということで再帰関数について調べたことについて書いてみます。


再帰関数とは
再帰関数とは関数それ自体が自らを呼び出す処理を持つ関数のこと。
例えば階乗の計算なんかがよく例として挙げられる。

(define (fact n)
   (if (= n 1)
      1
      (* fact (- n 1)))))

上記の関数factは関数本体からfact自身を呼び出している。
factに渡す引数は1ずつ減算されていて、n=1となったところで再帰処理の終端に到達する。
再帰処理を関数として記述するときは終端の設定を必ず行う(そうしないと無限ループに陥る)。


Flat recursion
リストのトップレベルのアイテム(アトム)を処理対象とする再帰処理をFlat recursionという(この語に関して日本語訳が見つからなかった)。
例えば下記のようなリストのトップレベル要素のみの総和を計算する関数が挙げられる。

;Flat recursion
(define (sum_list l)
  (if (null? l)
      0
      (+ (car l) (sum_list (cdr l)))))



Deep recursion
Flat recursionとは対照的に、リストの要素全てを処理対象とする再帰処理をDeep recursionという。
Deep recursionバージョンのsum_listを示すと下記のようになる。

;Deep recursion                                                                                                                  
(define (sum_list l)
  (cond ((null? l) 0)
        ((number? l) l)
        (else (+(sum_list (car l)) (sum_list (cdr l))))))



Tail recursion(末尾再帰)
関数の末尾が再帰呼び出しのみで終わっている再帰処理を末尾再帰という。
末尾再帰で階乗を計算する関数を書くと以下のような形になる。

;Tail recursion version                                                                                                          
(define (fact n)
  (define (iter product counter)
    (if (> counter n)
        product
        (iter (* counter product)
              (+ counter 1))))
    (iter 1 1))

この方法だと、引数に計算結果を渡しているので、計算の途中経過を再帰呼び出しの都度保存しておく必要が無い。そのため、末尾再帰を利用することでメモリの消費量を抑えることができる(らしい)。



…とりあえずこんな感じか。
現状、用語の確認がメインみたいな感じですな。
まだ実用的なプログラムに触れてないので、イマイチ再帰の効用について理解できてないのがちょっと。。
Schemeはリスト構造を基本に構成されているので、木構造のデータ(xmlとか)処理なんかが強いんだろうな、とかそのくらいの認識

Github漁って色んなコードを読んでみるべきかなー。

Schemeで遊ぶ

関数型プログラミング言語”Scheme”で遊んでます。

SchemeはLispの流れを汲んだプログラミング言語。
方々を調べ回ったところによると下記のような特徴を持った言語とのこと。

  • 複数のプログラミングパラダイムをサポート
    手続き型、オブジェクト指向、関数型の3つのパラダイムをサポートしている。

  • レキシカルスコープ(静的スコープ)
    レキシカルスコープを持つ言語。
    最近の言語は大抵レキシカルスコープを持っているので、取り立てて意識する必要はないと思うけれど。
    Emacs Lispや初期のLispがダイナミックスコープで実装されていたようなので、そちらと混同しないように、ということに注意。
  • プログラム内の全てのプロシージャが第一級プロシージャ
    式を関数の引数や戻り値、変数に格納する値として取り扱える。

  • シンプルな構文規則
    閉じ括弧で式を表す、前置記法で演算子を作用させる。ほぼこれだけ。
    しかし、とにかく括弧が多い。。
  • 再帰、再帰、再帰!
    繰り返し処理において再帰を多用する(らしい)。
  • 自動プログラミングやインタプリタ実装、言語処理の実装なんかに向いてる
  • Schemeを通じて特に身につけたいのは再帰処理の実装センスと関数型プログラミングのエッセンスを吸収すること。
    Processingで再帰使って絵を描いたりしたこともあったけど、どうにも再帰使った独自の実装にこぎ着けるところまでは行かなかった。
    というか自分で考えた再帰処理を実装してみると、大抵ヒープを食いつぶしてエラーを吐くという残念な結果にしかならないというトラウマが。。
    再帰は読むのも苦手なので、勘所をつかんでおきたい。

    Raspberry Pi と Arch Linux



    ちょっと前の話なのだけれど、3ヶ月くらい前にRaspberry Piを購入した。
    買った直後に起動テストだけして完全に放置、という非常にもったいない状態だったので、(Linux + サーバ)勉強用のマシンとして運用するため、Arch Linux をインストールしてみた。
    で、Arch Linux起動後のアップデートでハマったのでメモしておく。

    まずはRaspberry Pi公式サイトからダウンロードしたイメージ使って、SDカードにArch Linuxをインストール。
    SDカードを挿し込んでボードに電源を挿す。OSの起動自体はすんなりうまくいったんだけれど起動直後に行ったglibcのアップデートでエラーが発生。

    どうやら2012/7/14以降、Arch Linuxのすべてのパッケージが/libに置いてたファイルを/usr/libに移していて、これが原因でアップデート時にエラーが発生するらしい。
    このエラーに対するフォローはArch Linuxの公式サイトに載ってたのだけど、一緒に載ってる解決法を試しても全くうまくいかない。
    (ちなみにこの過程で2度、カーネルパニックを引き起こした。。)

    色々試したり調べてるうちに、最新(2012/9/16)版のRaspberry Pi用 Arch Linuxのイメージファイルを発見。
    これを再インストールしてみることにした。
    (公式サイトのリンクを辿って入手できるイメージは日付が2012/6/13になっていてちょっと古い)

    再インストールしたArch Linuxでは問題なくアップデート完了、ことなきを得た。

    じき公式サイトのイメージも新しいものに置き換わるとは思うけれど、それまでの間は新しいイメージ使ったほうが良さそうです。

    GUIのメニュー項目名に引かれた下線




    前々からGUIのメニューバーに並んでる文字列中の一部の文字に下線が引いてあるのがずっと気になってた(上の画像で言うと”File”の’F’とか”Edit”の’E’とか)。
    Qtの勉強してたらその理由がついにわかった。

    あの下線はメニューに割り当てられたキーボードアクセラレータの文字を表してるらしい。
    例えば”Edit”の’E’に下線が引いてあったとするとそのメニューには”Alt+E”が割り当てられている。

    あとそれに関連したおまけ情報をさらに2つ。

  • キーボードアクセラレータの自動割付けに利用できる“Kuhn-Munkres Algotithm”というアルゴリズムがある。メニューの数が多い場合はこのアルゴリズムを用いると自動で最適な割付を求めることができる(らしい)。
  • メニュー項目の中には”OpenFile…”のように、末尾にピリオドが3つ付いたものがある。これはそのメニューを選択すると、その後何らかの入力をユーザに要求する、ということを表している(開くファイル名の入力、検索キーワードの入力、など)。
  • 色々作法があるようで。
    こういう細かいTIPS集めたサイトとか本とかって無いのかな。

    史上最大の発明アルゴリズム

    “史上最大の発明アルゴリズム”を読んだ。

    “コンピュータに問題を解決させるための覚え書き”としてのアルゴリズムが、どのように発明されたのかについての経緯が書いてある。
    アルキメデス、ライプニッツ、ゲーデル、テューリングなどなど。
    時代を経て、何人もの論理学者、数学者を介して、抽象的なものに数学的な表現が与えられ、徐々にその輪郭がはっきりしていく過程が面白い。

    最後の方、テューリングマシンが出る段でカチッとピースがはまるというか。それまで高尚な学問としてのイメージが強かった分野が一気に実用的なものに転換した瞬間を垣間みるようで。


    歴史を俯瞰して現代までの流れを追っていくというような構成の本。”フェルマーの最終定理”とか書いてるサイモンシン先生の著作が好きな人とかは結構イケるんじゃないかなと。



    …とこんな感じの本ではあるんだけど、個人的にはラムダ計算のあたりが全然理解できなかったのがすごく悔しかった。そろそろ新しいプログラミング言語でも勉強しようかなと思ってたので、これを機にHaskellかScalaあたりを覚えるべきか。

    環境設定いろいろ

    Djangoの勉強に合わせて、環境を構築する。
    wikiにApacheのBasic認証付けたり、tmux入れたり、Emacsのキーバインド覚えたり。
    Djangoの勉強より、こっちの方に力入れてしまいそうでコワい。

    tmuxとEmacsのキーバインドがかぶってるのがちょっとうっとおしかった(二つともC-bを多用する)。
    ~/.tmux.confをいじって対応。
    tmuxのPrefixをC-tに変更した。

    設定ファイルの適用がPC再起動後だということを知らず、何度もターミナルを立ち上げ直したり。
    UNIX、マダヨクワカラナイヨ…

    そういえばwikiにBasic認証付けたらiPhoneのSafariから閲覧できなくなった。。(訂正:Safariでは閲覧できたけど、後からインストールしたブラウザアプリでは閲覧できなかった。理由は未だ不明)
    Apacheの設定と関連あるのかしら?
    出先でwiki見たいのでどうにか対応したい。

    iOSアプリ開発のお勉強

    iPhoneアプリ開発のお勉強中。本読んだり、AppleのDevガイド読んだり。
    本は2冊購入した。設計指針用に”iPhoneアプリ設計の極意”を、実装方法の勉強用に”iPhone SDK アプリケーション開発ガイド”を買ってみた。

    勉強してく中で気にかかった点。
    本が最新バージョンのXcodeに対応していないので、旧バージョンの部分と新バージョンの差分を自分で埋めてく必要があるのがちょい面倒だったこと。本選ぶ時にもうちょっと考えるべきだった。。
    あとはObjective-Cで使われてる用語が独特で、ちょっと面食らった。例えばJavaでいうinterfaceがprotocolと呼ばれてたり(厳密に言うと両者は違うらしいけど)、処理を呼び出されるオブジェクトのことをレシーバーと呼んだり、など。他の言語でオブジェクト指向勉強しててもそこら辺の対応関係覚える必要ありそう。

    Macbook Air買いました。

    もう一ヶ月くらい前になるのですが、Macbook Air(13inch)を購入しました。

    購入動機は3つくらいあって、

    1.ノートPCが一台欲しかった
     自分は比較的自宅のリビングに居る時間が長いのだけれど、そこにPCが無くて不便だったので。ノートPCが一台あれば家のどこでもブラウジングやら開発やらが出来るかなと。あと出先に持ってく用途にも使いたいなと。

    2.Mac PCに触れてみたかった
     iPhone使ってるうちにMacに興味が湧いてきた。iOSみたいな分かりやすい、奇麗なUIがデスクトップPC上でどのように表現されてるのかを体験してみたいという欲求から。

    3.iOSアプリを作ってみたかった
     これも上の理由と似たようなものなのだけれど。iPhoneアプリに触れるうち、自分も何か作ってみたくなった。Processingの延長でCGやら画像処理関連のアプリとか作りたい。

    これまでのところ取り立てて不満もなく、軽快に動作してます。
    現在はAppleのDeveloper用ドキュメント読んだりXcode触ったりしながら勉強中の身。
    あとはいつDev登録するか。。