2013年7月2日火曜日

Haskellの学習~Real World Haskell 第2章~

こんにちは,今回は2章「型と関数」です.
この話はHaskellの基本なのでしっかり押さえておきたいです.

Haskellの型システム

Haskellの型のポイントは強い型・静的な型・自動的な型推論

強い型

Wikipediaによるとこのように書いてあります
強い型付けの定義の1つは、ある処理・演算が間違った型の引数をとることを禁止するというものである。例えばCでは不正なキャストができるが、これは強い型付けが存在しないことを示している。コンパイルが通ってしまうというだけでなく、実行時にも許されてしまうからである。これはコンパクトで高速なCのコードを可能にするが、デバッグをさらに困難なものにする。
...よくわからん
引数に整数をとるような関数に文字列を渡すとエラーになる.というものらしい.
また,暗黙的なキャストが行われないのも強い型の特徴でもある.
これにより,型の間違いによるエラーを実行前に発見できるが,その分別の型に変換するための余計なコードを書かなければいけないこともある .

静的型

プログラムを実行する前に変数や式がどのような型か決められていること.
これがあると実行する前に大体のエラーを検知できる!らしい...
自分は動的片付けのほうが慣れているので,これには少しなじめないかもなあ

自動的な型推論

特に型宣言しなくても型を推測してくれます.したら,明示的に型を付けることが可能です.
静的片付けだったらこれはいらないと思いますが...

2.6リストとタプル

リストもタプルも違いが今のところよくわからない.
ただし,タプルの要素が2,3を超えることはまれらしい.たぶんリストは結構あると思う.

練習問題



2.8関数の型と純粋性

Haskellの関数は純粋に入力値のみに依存する.これがHaskellの純粋性.
つまり,グローバルな変数や,その他の状況には依存しない.
テストをするときにはこれが非常に重要になる.どの環境でテストしても同じコードなら同じ結果になるから.
しかし,この純粋性はデフォルト値の話で,副作用があるものもある.そのような関数には頭にIOがついている.

2.10遅延評価

関数に渡す引数を渡す前に評価しないこと.


このようなコードがあった場合にisOdd(1 + 2) を使うとします.その場合に,引数に入れたとき(1 + 2)はまだ計算されておらず,3になっていないのです.そして関数内で実際に必要になった時に初めて(1 + 2)は評価され,3になります.
これを遅延評価と呼びます.

練習問題2.12


前回からだいぶ間が開いてしまいました.
次は「第3章 型を定義し,関数を単純化する」です

2013年6月22日土曜日

ブログにソースコードを張り付ける最も冴えてる方法を求めて

以前,このような記事を書きました.

しかし,この世界には多くのソースコードを張り付ける方法が存在します.
その中で,最も最高の方法はなんでしょうか.

いくつかの方法を比較してみようと思います.

因みにこれまで試した方法は,SyntaxHighlighterと,Gistです.
今回比較するこれら以外の方法は,Ideone.com
これくらいでしょうか.因みに,全て無料で利用できます.ほかにもあれば,ぜひ教えていただきたいです.
一つずつメリット・デメリットを上げていこうと思います.

SyntaxHighlighter

メリット

  • コードがブログ内に直接記述できる
  • いつでもコードの修正が簡単

デメリット


  • セットアップが面倒くさい
  • 使える言語がメジャーなものに限られる

Gist

メリット


  • ほとんどの言語に対応している
  • ソースコードのバージョン管理ができる

デメリット


  • 同じコードのバージョンごとにリンクが貼れない
  • 複数のコードを張ろうとすると,ひとまとめにされてしまう

Ideone.com

メリット


  • 結構マニアックなものもあり,C++などはバージョンも指定できる
  • 作成したコードで入出力が試せる

デメリット

  • 短すぎるコードだとやたら無駄スペースができる(下のほうとか)
こんな感じでまとめてみました.
皆さんの参考になれば幸いです

2013年5月22日水曜日

Haskellの学習~Real World Haskell 第1章~

こんにちは

割と速いペースで更新できてうれしいです!
この調子でやっていきたいです!

さて今日はHaskellを勉強し始めて実質最初の投稿です.

Real World Haskellを読み進めて,大事に思ったところ,気づいた点などを書き残していきます.


基本

  1. Haskellでは2つのコマンドをよく使う
  2. ghci
    対話型インタプリタ
    runghc
    Haskellのコードをスクリプトとして走らせるコマンド
  3. 計算は普通の書き方もポーランド記法も使える.その時に演算子はかっこで囲む
  4. べき乗は^
  5. 負数には必ずかっこ()を付ける.つけなくてもいい場合もあるが,基本的につける癖を持つこと
  6. ghciでコマンドを調べるコマンドがある
  7. let構文を使うことで一時的に変数を定義できる

リスト

  1. 基本はpythonと似ている.[]で指定して,カンマで区切る.長さに制限もない
  2. しかし,リストが[・・・・, ]のようにカンマの後に何も指定しない場合,エラーとなるので注意
  3. また,リスト内の全ての要素の方が一致しないとエラー(←まじかよ)
  4. 数字のリストで連続する値のリストを作成したい場合は[a..b]の形式で書くとaから始まってbで終わる
  5. リスト同士は++で連結できる
  6. リストの先頭にhogeを追加するコマンド

文字列

  1. いわゆる普通の言語の文字列と一緒pythonとも一緒
  2. 文字列の実態は文字のリスト.なので前述のリストの操作が使える

  1. 式の後にその型を表示するように設定できるコマンド
  2. ghciにはitという独自の機能がある.itはghciが最後に評価した式の結果を代入するもの
  3. itは使いこなせればすごい便利なもん
  4. %で有理数を作成することができる.例:3%11
  5. 有理数を使う前にはコマンドを打つ
  6. 追加機能を切るコマンド

簡単なコマンド

  1. runghcで走らせる
  2. 引数には指定のスクリプトの名前のみ.拡張子はいらない
  3. WC.hsを参照すること

練習問題の答えと以前のコマンド

コマンドはchapter1.txtにある
練習問題はexercise.hsを参照する
次回は第2章・型と関数です

2013年5月19日日曜日

Gistを使いましょう

こんにちは

今回はgithubが提供しているGistというサービスについて書きます.

なぜこのサービスを取り上げるかというと,このブログでも何度もプログラムについて言及してきました.
その中でソースコードを織り交ぜつつ,話をすることも何度もあります.

そういった場合にこれまでは,SyntaxHighlighterを利用していたのですが,非常に書きにくい.
コードを記述するときにHTMLを直接ゴリゴリ書かなきゃいけなかったり,HTMLに自分でクラスを記述しなければいけなかったり,対応していない言語があるのです.

それを解消してくれると期待しているのがGithub社が提供しているGistというサービスです.

実際に使ってみるとこんな感じです.


これはすごい!
何がすごいってちゃんとハイライトしてくれてる!
しかも使える言語が半端じゃなくおおい!
python,PHP,C#などはもちろんPrologのような変な言語も対応してます!これは素晴らしい!

今後の課題としてはコードを埋め込む際にリビジョンまで含めた指定ができるようになると,より完璧なものになるでしょう.

次回からはこれ使っていきます.

2013年5月15日水曜日

Haskellの学習~Real World Haskellのお勉強するよ!~

こんにちは

先日購入した,Real World Haskell 実戦で学ぶ関数型言語プログラミングを用いてHaskellを勉強しています.

え?ACM/ICPCはどこに行った?
すいません,あれ解くの一苦労なのでなかなか時間が取れていません.
土日とかにじっくり取り組みたいなあ

Haskellを勉強しようと思った理由はいくつかあります.


  1. 「使いこなせたら変態」といわれる言語に挑戦してみたかった
  2. 最近やってるオライリーフェアでオライリーの本が買いたかった
  3. 普段とは違う言語を勉強したかった
こういった理由でこの本を買いました.(最大の理由は2番目ですが)

というわけで,せっかく勉強したことは残していきたいので,学習した内容はここに書いていきます.

よろしくお願いします.

2013年4月17日水曜日

Ruby on Railsで遊ぼう

お久しぶりです!
このブログも久しぶりに投稿します.

今日は今まで敬遠していたRuby on Railsを試してみようということで,セットアップをやってみました.

私はあまりRubyが好きではないのですが,流行ってるもの(もう定番か?)は試そうということで挑戦です.

今回参考にさせていただいたサイトは
この2つの記事です.
また以上のサイトで不足している部分についても補足します.

環境

仮想環境:VMware player 5.0.2
OS    :Ubuntu12.04.01

Ruby1.9.3をインストール

まずはcurlをインストールします.
sudo apt-get install curl
時々使いますがこのcurlってなんでしょう?
調べたところ,URLを指定してファイルを取得するためのツールのようです.wgetとなにか違うのでしょうか?いつか調べよう.

このcurlを利用して,Rubyのバージョンを管理するRVMをインストールします.

curl -L https://get.rvm.io | bash -s stable
これでaptにはないもう少し新しいRubyのバージョンが使える準備が整ったわけです.

さらに,これを実行したのち,

source ~/.rvm/scripts/rvm
を実行することでしっかりとRVMをインストールするわけです.

しっかりとRVMがインストールされたところで,もう少し準備が入ります.
Ruby1.9.3をインストールするために必要なものをいんすとーるします
sudo apt-get --no-install-recommends install build-essential openssl libreadline6 libreadline6-dev curl git-core zlib1g zlib1g-dev libssl-dev libyaml-dev libsqlite3-dev sqlite3 libxml2-dev libxslt-dev autoconf libc6-dev libgdbm-dev ncurses-dev automake libtool bison subversion pkg-config libffi-dev
こんな感じです.
ひゃーたくさん!

これで準備はばっちり!

ここから実際にインストールに入ります.ちなみにrailsのインストールまで一気にやります.

rvm install 1.9.3
rvm use 1.9.3 --default
rvm rubygems current
gem install rails
これでrailsのインストールまで完了です.
ここまでの内容は,1のリンクを参考にしました.

また,補足として,nodejsをインストールしましょう.
これがないと,この後実際にrailsでアプリケーションを作る際に動きません.

sudo apt-get install nodejs
で特に問題はないでしょう.

実際にアプリケーションを作る

railsもインストールできたところで実際に作ってみましょう.
作るのはブログ形式のタイトルと中身を記述して,投稿し,それを閲覧できるアプリケーションです.



rails new myapp
cd myapp
上のコマンドを実行し,railsアプリケーションを作成し,そのディレクトリに入ります.

このディレクトリ内で実際に要素を作っていきます

rails g scaffold Post title:string body:text
rake db:migrate

このコマンドを少し解説します.
1行目rails はrailsを動かす,g はgenerateの略でコードを生成する,scaffoldはscaffold型のひな形を使ったアプリケーションにするという意味です.
title:stringはタイトルというエリアを作ってそこには文字列1行のエリアを,body:textはテキストエリアを作るという意味です.
2行目ではデータベースの設定をしています.

次にconfig/routes.rbを編集します.
54行目の
#root :to => 'welcome#index'
root :to => 'posts#index'
とし,さらにmyapp/public/index.htmlを削除します.

これで一応動くはずなので,ためしに動かしてみます.

rails s
でrailsによるサーバーを起動させ,初めのほうに書かれているURLにアクセスします.
ここまでになにも問題がなければ,
このように表示されるはずです.New Postから適当に投稿してみて,結果を確認してください.


以上でインストールは終了です.
2つ目のリンク先のブログ記事ではもっといろいろな機能をつけるので,気になる方はどうぞ.

2013年2月18日月曜日

Zend Framework を Ubuntuで使う

タイトルの通りです.

今までwebアプリケーションを作る際に,フレームワークというものを利用したことがなかったので,今回初めて挑戦してみました.

お試しとして,PHPのフレームワークでやろうと思ったので,その中でも(おそらく)一番有名なZend Frameworkを使ってみました.


  1. 環境
    • Ubuntu 12.04 LTS
    • apache 2.2.22
    • PHP 5.3.10
    • ZendFramework-1.12.1
  2. 参考にしたサイト



それでは始めます.

とりあえずフレームワーク本体を入手する.

まずはソースコードを入手します.
ここから最新版(現在は2.1)もしくは1.12を取得します.
おそらくtar.gz形式なので
$ tar zxvf Zend~.tar.gz
とコマンドを使って解凍します.
これを好きなところへ保存し置きます.
どこがいいんだろう?/var/の下?それともホームディレクトリ?よくわからないのでお好きなように.
ただし,保存した場所までのパスは覚えておいてください.次はそこへのパスを通します.

パスを通す

ソースの取得が終われば今度はパスを通します.
/etc/php5/apache2/php.ini
を編集します.
おそらく789行目のあたりに
; UNIX: "/path1:/path2"
include_path = ".:/usr/share/php:
と記述された部分があるので,そこに先ほど保存したソースコードの中にあるlibraryへのパスを書き込みます.
その際に,incldue_path = ...の部分はコメントアウトされているのでコメントアウトを外しておいてください.

apacheの設定をいじる

次にapacheの設定を変更します.

  • モジュールを有効にする
  • 作るディレクトリの設定を.htaccessで変更できるようにする
この二つです.
まずは
sudo a2enmod rewrite
とやってURL変換のためのモジュールを有効にします. ここでいったんapacheをリスタートさせておくと安心です.
次に
/etc/apache2/sites-avaivable/
の中にあるファイルを変更します.今利用している設定ファイル(おそらくdefault)をコピーします(名前はhoge).
そこにこれから作る予定のディレクトリについての以下の設定を追加します.
<directory /web_dir/hoge>
    AllowOverride All
</directory>
これでOKです.ディレクトリのパスなんかは適宜変更してください.
でまたapacheの再起動を行います.

hello worldアプリを作る

やっとみなさんお待ちかねのアプリ制作です.

まずはディレクトリを作りましょう.


  • application(controller,model,viewなど実際にはアクセスされないものをしまっておく場所)
  • html(フロントコントローラなど実際にアクセスされる部分)
htmlにはindex.php,.htaccessを作成します.
それぞれの中は
index.php
<?php
require_once 'Zend/Controller/Front.php';
Zend_Controller_Front::run('../application/controllers');//ここのパスは適宜変更
.htaccess
php_flag magic_quotes_gpc off

RewriteEngine on
RewriteBase /hoge/html/
RewriteRule !\.(js|ico|gif|jpg|png|css)$ index.php
このようになっています. .htaccessの最初の行を付けないチュートリアルもあるのですが,これがないとサーバーがスラッシュをディレクトリの切れ目と判断してしまうので困ったことになります.
これでいわゆるフロントコントローラは完成です.

次にapplicationのほうに行きましょう
作るディレクトリはcontrollers, views, modelsです.
controllersにはとりあえずIndexController.phpを作成します.
中身はこんな感じです.

IndexController.php
<?php
require_once 'Zend/Controller/Action.php';

class IndexController extends Zend_Controller_Action
{
    public function indexAction()
    {
    }  //不要な場合は、メソッドの中は空でも構いません
    public function helloAction()  //helloアクションメソッド
    {
      $req = $this->getRequest();
      $this->view->assign('name', $req->getPost('yourname'));
    }

}
ここら辺から大文字小文字にも気を付けてください.これを間違えるとかなりハマります.
これでコントローラは完成です.
次にviewを作成します.コントローラ/アクションごとに,対応するビューである「views/scripts/<コントローラ名>/<アクション名>.phtml」というファイルを作成します.
注意してほしいのは,コントローラ名は大文字で始まりますが,viewのためのコントローラ名がついたディレクトリは小文字で始まることです.
今回作るのはindexActionのためのindex.phtmlとhelloActionのためのhello.phtmlです.
それぞれは
index.phtml
<html>
<head>
<title>Hello World!</title>
</head>
<body>
こんにちは!<br />
お名前をどうぞ。<br />

<form action="Index/hello" method="post">
<?php echo $this->formText('yourname','your name')?>
<?php echo $this->formSubmit('','Go')?>
</form>

</body>
</html>
hello.phtml
<html>
<head>
<title>Hello World!</title>
</head>
<body>

こんにちは、
<?php echo $this->escape($this->name); ?>
さん!
<br />

</body>
</html>
こんな感じです.実際に動かしてみてきちんと動作したら完了です.