第1回 関数型言語勉強会 大阪に参加しました

Posted on 2012年5月19日 Comments

第1回 関数型言語勉強会 大阪に参加しました。

@s_kozake さん 関数型言語入門

CPUのマルチコア化
副作用が無い関数型は平行処理と相性がいい
これまで以上に並行処理が重要になる
内部DSLを作成しやすい(ホスト言語?)
関数型言語の特徴である、リスト内包表記/ラムダ/高階関数をHaskell,Scala,Javaでそれぞれの事例についての説明。

リスト内包表記はHaskellが格好いいと思った。

@kuchitama さん Clodure

ClojureはLISPのJVM実装
ClojureのビルドツールLeiningen
Clodure学習サイト 4Clojure

書籍「7つの言語 7つの世界」
最近、括弧が大好きなのでLISPもClojureもやってみたい。

@kitora_naoki さん 関数型って?

・第1級関数を扱えること
 →第1級関数を第1級オブジェクトとして扱えること。
 →第1級関数とはプログラミング実行時に生成され、関数自体を引数にしたり戻り値として使用することが出来る。
・参照透過性が常に保たれること=純粋関数型言語
 →変数への破壊的代入をしない → 漸化式
 →副作用を担当するのがモナド

@posaunehm(ぽざうね) さん 初心者がF#を触ってみた

F#はC#のLinqに似ている
VisualStudioはインテリセンスが優秀

写経をGithubにコミットする手法は勉強の成果が形に残るのでよさそう。
写経対象のライセンスによっては非公開にしておいたほうがいいかも。

@uskz さん プログラムを計算する話

数学的モデルの利点を利用する→問題が複雑すぎるときに数学モデル化すれば、定義の範囲を超えて複雑になることはない。
関数の代数として圏を使う。データ型に依存しない型判定
計算を使って関数を合成する例
Fokkingaの相互再帰定理?(よくわからない、ググる)
関数から2項関係に一般化することの利点
→関係から逆関係を利用できる、関係の合併も関係として扱える。
 関係の代数はAllegoryと呼ばれる特殊な圏論を使う。
リチャード・バード氏の本を読むと良い

ナップサック問題,val,digitsの例は解りそうなので、自分でもやってみたい。
val,digitsは逆関係と評価できるのだろうか?

@its_out_of_tune さん 関数型脳になろう!(仮)

Javaで副作用なしのプログラミングをした話。
ループ・破壊的代入なしでもJavaでBrainF*ckが実装できる。
ラムダの説明。

@ikegami__ さん 速習・関数型言語

http://www.slideshare.net/ikegami__/1-lt-12266517

読んでみたい本がたくさんあった。
プログラミング言語の基礎概念 (ライブラリ情報学コア・テキスト)
」と「プログラミングの基礎 (Computer Science Library)
」をポチっ。

@quassia88 さん Inverse FizzBuzz を解いてみよう

Inverse FizzBuzzの問題日本語訳

http://d.hatena.ne.jp/matarillo/20120515/p1

解法のヒント
→FizzBuzzの並びは循環するので、循環するFizzBuzzのリストを作成する
→問題を分割して指定値より大きいFizzやBuzzを返す関数を作る。
注意事項:最短になっているか?解のない問題に対してくラッシュしないか。空リストに対しても解を返すか?長いFizzBuzz列に対しての回答できるか?

ソースはgitHubに上がる予定。

@kyon_mm さん OCamlの多相ヴァリアントの紹介

多相Valiantは型安全なEnumみたいなもの?
Ocamlの多相Valiantは3つある。固定、開いている、閉じている。

@syamino 代数的データ型をラムダ計算の中で表現する方法

代数的データとパターンマッチについて。ラムダ計算でパターンマッチする例。
→スコットエンコーディング・・・(Yコンビネータでググる)
→チャーチエンコーディング・・・haskellのfoldr
チャーチ数はチャーチエンコーディングされた自然数

パターンマッチをラムダでする2つの方法について。
後半よく解らなくなってしまった。
パターンマッチをラムダで書く場合2つの選択があることが解った。
それぞれにメリット・デメリットがあるとのことだが、foldrと同等の処理ならチャーチエンコーディングで良いのかもしれない。

@keita44_f4 スタートSML#!

SML#は日本生まれのML言語。CやSQL言語との連携
Cをインポートすれば何でも出来るじゃないか。

@irof さん

Haskellのテスト Cabal,HUnitについて
brew install ghc
brew install cabal-insall
brew install hspec

セッションは関数型言語やその周辺技術についての概念の説明が多かった。
私は実務で関数型言語を使っていないので、実装に寄った話になるともっと解らなかったかもしれない。
カリー化等を実装ベースで「こう書いたらこれができる」とあやふやに理解しているので、言語ごとに違う実装例をみると、理解が激しく揺らぐ。

懇親会でおすすめの本等を聞かせたいただいた。数学ガールは読んでみようと思う。
懇親会でお話を聞かせていただいた方々の中には、関数型言語や関数型言語のフレームワークを用いて業務を効率化したいという意識を持っている人が複数いらっしゃった。
私は仕事では職場環境に合わせて開発し、趣味として仕事で使わないような言語や環境を触るのが好きですが、この取り組み方だと「仕事で使えるレベルまで到達しよう」という意識は生まれにくいので、もっとハードルを上げて技術の習得に臨むべきかもしれないと感じました。

PHPカンファレンス関西2012に参加しました

Posted on 2012年5月14日 Comments

PHPカンファレンス関西2012に参加してきました。
今回は20分のお時間をいただきKohanaのセッションも担当させていただきました。

とりわけ、今回はPHP5.4のフィーチャーや個性的なフレームワークについてのセッションが印象に残りました。

懇親会では翻訳やユーザコミュニティについてたくさんのご意見を頂くことが出来ました。ありがとうございます。

今回の発表のスライドを公開しています。
PHPフレームワークKohana

鹿駆動勉強会に参加しました

Posted on 2012年5月1日 Comments

鹿駆動勉強会に参加しました。

初のLTということで緊張しましたが、スタッフ・ご参加の皆さんのおかげで楽しい勉強会となりました。

私が発表したのは「PHPフレームワークKohana」についてです。スライドをアップしました。
PHPフレームワークKohana

PHPフレームワークKohana:ビューに変数をセットする

Posted on 2012年3月6日 Comments

Kohanaのビューを表示するにはテンプレートファイルを作成してコントローラーに以下のように記述します。

$view = View::factory('index');  // テンプレートファイルが view/index.php
$this->response->body($view);

さらにビューの中に変数の値をセットしたい場合はこう書きます。

$view = View::factory('index')
   ->set('user','太郎'); // 変数$userに'太郎'をセット

ビューファイルには$userという変数名になります。

<?php echo $user; ?>

set()と同様にbind()も使えます。
set()が値渡しであるのに対して、bind()は参照渡しです。

$view = View::factory('index')
   ->set('user','太郎'); // 参照渡しで$userに'太郎'をセット

bind()は参照渡しなので以下のように定数を渡したりするとエラーになります。

$view = View::factory('index')
   ->set('result',true); // trueは参照渡しできないのでエラーになる

MySQL勉強会in大阪(第2回)

Posted on 2012年3月6日 Comments

MySQL勉強会in大阪(第2回)に行ってきました。

高可用性を実現するシステム
レプリケーション
 ・マスター・スレーブ構成で参照性能を向上させる
 ・バックアップにも使える。但し、スレーブをそのままバックアップにするのはNG。スレーブを止めてフルバックアップをとる。
 ・MySQL5.5からは準同期レプリケーションが使える。

mySQL+DRBD
 ・linux専用・・・ノード間データコピー

3rdベンダー製HAソフト使用
 ・共有ディスクにデータを保存

4.MySQL Cluster
 ・マルチサイト・クラスタリング
   データセンターを跨いだレプリケーション
   同期レプリケーション(ネットワーク品質はかなり高いものが必要)
 ・シェアードナッシング型クラスタ・・・共有ディスクを使わない
   データをデータノードに分散&ミラーリングすして格納する。
 ・MySQL Cluster 7.2はJoin性能もアップ
 ・NoSQL memcachedAPI対応
   トランザクション対応キーバリューストア
   MySQLに対応&レプリケーション対応のKVSとして使える

mysqlnd_ms
mysqlnd(MySQL native driver for PHP)
 ・PHPのmysql(i)拡張PDO_MySQLより早い
 ・商用OKなライセンス

mysqlnd_ms
MySQL向けロードバランサ
PHPから送られてきたクエリを更新か検索かで判断してマスター・スレーブに自動的に振り分ける

CentOS6.2にPHP5.3.9とMySQL5.5を導入

http://myhome.munetika.mydns.jp/ossdbwiki/index.php/CentOS6.2%E3%81%ABPHP5.3.9%E3%81%A8MySQL5.5%E3%82%92%E5%B0%8E%E5%85%A5

—-
TODO:
NoSQL memcachedAPI使ってみる
kohanaでmysqlndが使えるか確認する

macOS : Lionにemacs 23.3bをインストール

Posted on 2012年2月24日 Comments

先日書いたDropboxでemacsの設定を共有ですが、もう1台のmacとも設定を共有しようとしたらエラーが出ました。

emacsのバージョンが合っていないと駄目みたいなので、brewで23.3にアップデートします。

brew install --cocoa emacs

これでいけるはずが、何故かこんなエラーが・・・。

curl: (22) The requested URL returned error: 404
Error: Failure while executing: /usr/bin/curl -f#LA Homebrew\ 0.8\ (Ruby\ 1.8.7-249;\ Mac\ OS\ X\ 10.7.2) http://ftp.gnu.org/pub/gnu/emacs/emacs-23.3.tar.bz2 -o /Users/nakau/Library/Caches/Homebrew/emacs-23.3.tar.bz2

原因はここで解りました。
homebrewにバグが合ったようです。

cd `brew --prefix`
git reset --hard FETCH_HEAD

homeberwをバグの無い状態にして再度実行します。

brew install --cocoa emacs
・・・
==> Summary
/usr/local/Cellar/emacs/23.3b: 3583 files, 94M, built in 5.8 minutes
# インストールが終わったらアプリケーションフォルダにコピーする
cp -a /usr/local/Cellar/emacs/23.3b/Emacs.app /Applications/

Dropboxでemacsの設定を共有

Posted on 2012年2月22日 Comments

Dropboxでemacsの設定を共有する方法です。

ユーザディレクトリの.emacs.dには以下のファイルを作成します。

/.emacs.d (~/.emacs.d)
  init.el

※auto-saveファイルの保存先など、マシンごとに独立しているべきディレクトリと設定ファイルはここに置きます。

Dropboxの共有ディレクトリに.emacs.dフォルダを作成します。
Dropboxの共有ディレクトリの.emacs.dには以下のファイル/ディレクトリを作成します。

/.emacs.d(Dropbox共有でディレクトリ内)
  /elisp   --- elispインストール用ディレクトリ※
    init.el  --- 共通設定ファイル
    init-windows.el  --- Windows用設定ファイル
    init-macos.el  --- mac用設定ファイル

※異なるアーキテクチャ間でelcを共有すると問題が出るかもしれないが、今のところ使えているので簡単のためにelispディレクトリは1つにする

ユーザディレクトリの.emacs.d/init.elの記述

;; Dropboxの共有ディレクトリにおいた.emacs.dのパスを定義
(setq dropbox-emacs-dir "c:/Users/hoge/Dropbox/.emacs.d")

;; Dropboxのinit.elを読み込む
(load (concat dropbox-emacs-dir "/init"))

Dropboxの.emacs.d/init.elの記述

;; LOAD-PATHとしてDropboxのelispディレクトリを読み込む
(setq load-path (cons (concat dropbox-emacs-dir "/elisp") load-path))

;; OSごとに異なる設定ファイルを読み込む
(cond
 ((eq window-system 'w32)
  (load (concat dropbox-emacs-dir "/init-windows")))
 ((or (eq window-system 'ns) (eq window-system 'mac))
  (load (concat dropbox-emacs-dir "/init-macos"))))

;; install-elisp.el
;; install-elispのディレクトリ先をDropboxのelispディレクトリにする
(require 'install-elisp)
(setq install-elisp-repository-directory (concat dropbox-emacs-dir "/elisp/"))

; auto-install.el
;; auto-installのディレクトリ先をDropboxのelispディレクトリにする
(require 'auto-install)
(setq auto-install-directory (concat dropbox-emacs-dir "/elisp/"))

mac OS X:LoginHookとLogoutHookを使って起動音を消す

Posted on 2012年2月19日 Comments

mac OS X 10.7 Lionでジャーンという起動音を消す方法。
厳密にはログアウトするときに音量をミュートし、ログインしたときにミュートを解除する。

まずLoginHookとLogoutHookが設定されているが確認する
sudo defaults read com.apple.loginwindow LoginHook
sudo defaults read com.apple.loginwindow LogoutHook

何かHookが設定されていればHookスクリプトのパスが表示されます。
何も設定されていないときは
The domain/default pair of (com.apple.loginwindow, LoginHook) does not exist
と表示されます。

既にLoginHook,LogoutHookに何か設定されていたら、それぞれスクリプトに以下の記述を追加します。
※scriptは#!/bin/bashを想定しています。違う場合は適宜変更する。

LoginHookに追記

osascript -e 'set volume with output muted'

LogoutHookに追記

osascript -e 'set volume without output muted'

これで完了。

LoginHook,LogoutHookに何も設定されていなければ、ログイン用とログアウト用のスクリプトを作成します。
ファイルの位置はどこでもよい。

vi /path/to/login.sh

#!/bash/bin
osascript -e 'set volume without output muted'

vi /path/to/logout.sh

#!/bash/bin
osascript -e 'set volume with output muted'

それぞれ保存して保存して実行権限をつけます。
chmod +x /path/to/login.sh
chmod +x /path/to/logout.sh

ログイン・ログアウトのHookを設定します。
sudo defaults write com.apple.loginwindow LoginHook /path/to/login.sh
sudo defaults write com.apple.loginwindow LogoutHook /path/to/logout.sh

WordPress:Zen-Codingプラグイン

Posted on 2012年2月11日 Comments

昔はTextile入力が嫌いだった(データに余計な文字が入るので)けど、もういろいろ面倒なのでマークアップしたい。
Wiki記法プラグインを入れようと思った。

WordPressのWiki記法プラグインは沢山あるけれど、私として外せないポイントはシンタックスハイライターと干渉しないこと。
まあそれ以外はなんでもいい。

シンタックスハイライターはSyntax Highlighter for WordPressを使っています。
何個か試したんだけど、ぴったりなのが無い。。。

[]で囲むタイプはSyntax Highlighterと干渉するし、そうじゃないのは投稿とは別にWiki固定ページを作るタイプが多い。
([]で囲むものでもPHP MarkUp方式ならSyntax Highlighterのタグを

をで囲むことで上手く動く。けどそれも面倒)

捜すのに疲れたので、方向転換してWP Zen-Codingを入れてみた。

これはとても素晴らしい。

Zen-Codingをもっとマスターしたくなった。

WordPress:SSHでWordPressを更新する

Posted on 2012年2月11日 Comments

WordPress3.1.1/CentOSです。

WordPressで画面からプラグインのインストールを行うのにFTPとFTPS接続が使えるのですが、サーバの都合でSSHが使いたかったので、その設定メモ。

phpからssh2が使えれば、wordpressの設定画面にSSHが使えるようになるらしい。
そのためにpeclでssh2をインストールする。

pecl install ssh2

エラーが出た。
Failed to download pecl/ssh2 within preferred state “stable”, latest release is version 0.11.3, stability “beta”, use “channel://pecl.php.net/ssh2-0.11.3″ to install
install failed

言われる通りにchannnelを指定してもエラーになるのでwgetで取ってくる。

wget http://pecl.php.net/get/ssh2-0.11.3.tgz
pecl install ssh2-0.11.3

またもエラー
checking for ssh2 files in default path… not found
configure: error: The required libssh2 library was not found. You can obtain that package from http://sourceforge.net/projects/libssh2/
ERROR: `/var/tmp/ssh2/configure –with-ssh2′ failed

libssh2を入れる。
yum install libssh2 libssh2-devel

もう一度pecl install。これでやっとインストールされた。
pecl install ssh2-0.11.3

Build process completed successfully
Installing ‘/usr/lib64/php/modules/ssh2.so’
install ok: channel://pecl.php.net/ssh2-0.11.3
configuration option “php_ini” is not set to php.ini location
You should add “extension=ssh2.so” to php.ini

ライブラリを読み込むようにする
echo “extension=ssh2.so” > /etc/php.d/ssh2.ini
/etc/init.d/httpd restart

SSHのキーを作成する。このキーはWEBからアクセスできないところに置く。
cd /var/www/
mkdir wp-ssh-key
ssh-keygen -b 2048 -t rsa -f wp-ssh-key/id_rsa # パスフレーズは入れても入れなくても良い
chown -R apache.apache wp-ssh-key/ # apacheからアクセスできるように

authorized_keysに登録
cat wp-ssh-key/id_rsa.pub >> ~/.ssh/authorized_keys

WordPressの設定に追記。 wp-config.php

// SSH Settings
define('FS_METHOD', 'ssh2');
define('FTP_PUBKEY', '/var/www/wp-ssh-key/id_rsa.pub');
define('FTP_PRIKEY', '/var/www/wp-ssh-key/id_rsa');
define('FTP_USER', 'username');
//define('FTP_PASS', 'passphrase'); // パスフレーズを付けたときはここに書く
define('FTP_HOST', 'www.example.com:22');