7.29.2012

C++: Classes for coordinate axes

C++: 二次元座標操作用クラス

ひとまず、必要最低限な機能のみ。

class Point {
public:
  int x, y;
  Point(int x=0, int y=0) : x(x), y(y) {}
  Point operator+(Point const& rhs) const { return Point(x + rhs.x, y + rhs.y); }
  Point operator+=(Point const& rhs) { x += rhs.x; y += rhs.y; return *this; }
  Point operator-(Point const& rhs) const { return Point(x - rhs.x, y - rhs.y); }
  Point operator-=(Point const& rhs) { x -= rhs.x; y -= rhs.y; return *this; }
  Point operator*(int n) const { return Point(x * n, y * n); }
  Point operator*=(int n) { x *= n; y *= n; return *this; }
  Point operator/(int n) const { return Point(x / n, y / n); }
  Point operator/=(int n) { x /= n; y /= n; return *this; }
  bool operator==(Point const& rhs) const { return x == rhs.x && y == rhs.y; }
  double euclidean_distance(Point const& rhs) const { return std::sqrt((x - rhs.x) * (x - rhs.x) + (y - rhs.y) * (y - rhs.y)); }
  int manhattan_distance(Point const& rhs) const { return std::abs(x - rhs.x) + std::abs(y - rhs.y); }
};
std::ostream & operator<<(std::ostream & stream, Point const& rhs) {
  stream << "Point(" << rhs.x << ", " << rhs.y << ")";
  return stream;
}
Point gDirection[] = { Point(1, 0), Point(0, 1), Point(-1, 0), Point(0, -1) };
class Rect {
public:
  Point bottom_left, top_right;
  Rect(Point bottom_left=Point(), Point top_right=Point()) : bottom_left(bottom_left), top_right(top_right) {}
  bool contains(Point const& p) const { return p.x >= bottom_left.x && p.x <= top_right.x && p.y >= bottom_left.y && p.y <= top_right.y; }
  int width() const { return top_right.x - bottom_left.x; }
  int height() const { return top_right.y - bottom_left.y; }
  int area() const { return width() * height(); }
};

Mac: OS X Mountain Lion Up-to-Date Program

Mac: OS X Mountain Lion 無償アップグレード手順

条件:
 ・2012年6月11日以降にAppleまたはApple製品取扱販売店でMacを購入したこと
 ・申し込みの締切は2012年8月24日

1. Up-to-Date プログラムの申し込み

以下の申し込みページから手続き。
http://www.apple.com/jp/osx/uptodate/

購入日、Macマシンのシリアル番号といった情報が必要。

2. コンテンツコードを入手

Apple から 2通のメールが届くのを待つ。
1通目はコンテンツコードの通知を開くためのパスワード。(OS X Mountain Lion Up-to-Date パスワードについて)
2通目はコンテンツコードが記載されたPDFファイルが添付されたもの。(OS X Mountain Lion Up-to-Date コンテンツコードについて)
このPDFファイルを開くのにパスワードが必要である。

3. App Store からダウンロード

App Store を開き、画面右側の Quick Links(ナビリンク) から Redeem(iTunes Card/コードを使う) を開く。
先ほどのPDFに書かれていたコードを入力し、Redeem。
Launch Pad が表示され、ダウンロードが始まる。

4. インストーラを実行

Launch Pad 上で OS X Mountain Lion をクリック。

画面の指示に従ってインストーラを進める。
ライセンス規約への合意、ハードディスクの選択など。
3分ほどでインストール準備完了となり、自動的に再起動が行われる。

再起動後、30分程度インストール処理が走り(処理は全て自動)、そして Mountain Lion が起動する。

7.23.2012

Simplify Your Repository

Dropbox を利用した資源の一元管理

OSもロケーションも異なる複数の端末から、同じレポジトリにアクセスして開発作業を進めたい。 
個人利用のみが目的なら、この要求を無料で満たすことのできるサービスはいくつか存在する。

(1) GitHub
 https://github.com/
 git ベースの管理ができるが、無料版だと全て公開されてしまう。 

(2) unfuddle
 https://unfuddle.com/ 
 なかなか使い勝手は良さそうだが、無料だと200MBまでしか使えない。 

(3) Dropbox + Subversion or git
 個人開発レベルなら、これが一番良さそうだ。
 Dropbox というクラウド上のファイル共有サービスを利用し、ネットワーク越しのファイル
 をローカルディレクトリと同等に扱えるようにする。

 その上で各端末に Subversion または git をインストールし、レポジトリをその共有ディレクトリ上に作る、という寸法だ。
 各端末上でセットアップを行う手間が発生するが、それを上回るメリットがあると思う。 

導入手順

Dropbox + Subversion + Subclipse と構成する例

・まずは、Dropbox をダウンロード、アカウント作成
 https://www.dropbox.com/ 

 無料版の場合、初期容量は2GBだが、Twitter連携・複数マシンへのインストールなど
 いくつかのミッションを達成するとボーナスとして容量が拡張される。

 Linux にインストールする場合だけ、少し手順が複雑だった。

・Subversion のインストール
 これもOSによってインストール方法が異なる。
 Mac 環境では、先日インストールした Homebrew を使って導入した。

 あとで Eclipse と連携させるため、JavaHL を使えるようにしなければならない。
 下記のリンク先を参照。 

・Subclipse (Eclipse プラグイン) のインストール
 http://subclipse.tigris.org/servlets/ProjectProcess?pageID=p4wYuA

 このサイトから Eclipse アップデートサイトのURLを確認し、
 Help -> Install New Software...
 を実行するだけ。 

 

参考:
Micro-Tip: Using Subclipse on OS/X with Homebrew
http://tedwise.com/2010/06/21/micro-tip-using-subclipse-on-osx-with-homebrew/ 

7.15.2012

How to Disable TCP/IP Firewall on RedHat Linux Enterprise 6

RHEL6 TCP/IP ファイアウォールの無効化方法

RedHat Enterprise Linux 6 ではデフォルトで SELinux(Security-Enhanced Linux)
および TCP/IP ファイアウォールが有効になっている。
http://jp.redhat.com/promo/resources/ 

サーバプロセスが上がっているのに、Apache・MySQL・FTPなどが何故か繋がらないという場合は
TCP/IP ファイアウォールを無効にして再確認してみよう。 

・SELinux の無効化

SELinux 自体を無効化すれば、セキュリティ強化機能は全て動作しなくなる。

SELinux の恒久的な有効化/無効化は、設定ファイル /etc/selinux/config を編集することで行える。

 (デフォルト状態)

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#       enforcing - SELinux security policy is enforced.
#       permissive - SELinux prints warnings instead of enforcing.
#       disabled - SELinux is fully disabled.
SELINUX=enforcing
# SELINUXTYPE= type of policy in use. Possible values are:
#       targeted - Only targeted network daemons are protected.
#       strict - Full SELinux protection.
SELINUXTYPE=targeted

 (SELINUX=disabled で無効にできる)

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#       enforcing - SELinux security policy is enforced.
#       permissive - SELinux prints warnings instead of enforcing.
#       disabled - SELinux is fully disabled.
SELINUX=disabled
# SELINUXTYPE= type of policy in use. Possible values are:
#       targeted - Only targeted network daemons are protected.
#       strict - Full SELinux protection.
SELINUXTYPE=targeted

ここを間違って「SELINUXTYPE=disabled」なんてしてしまうと、再起動後にOS が上がらなくなって、かなり焦る。

Kernel panic - not syncing: Attempted to kill init!

その場合の対処方法は、以下の通り。

電源投入直後に Enter キーを押して GRUB メニューに入る。
e キーを押して編集画面に入り、カーネルを選択して再度 e キーを押す。
末尾に「 selinux=0」を追記し、 Enter、b キーと押して起動する。
すると SELinux が無効となった状態で OS が起動されるので、設定ファイルを再編集できる。

 

・TCP/IP ファイアウォールの無効化

SELinux を有効にしたまま、TCP/IP ファイアウォールを無効化するには、
サービス「iptables」と「ip6tables」を停止すればよい。 

# service iptables stop
# service ip6tables stop
# chkconfig iptables off
# chkconfig ip6tables off

 

参考:
http://centlinuxer.blog37.fc2.com/blog-entry-74.html
http://www-06.ibm.com/jp/domino01/mkt/cnpages7.nsf/page/default-002D8884

7.12.2012

Migrating from MacPorts to HomeBrew

Mac: MacPorts から HomeBrew への移行

Mac にはいくつかのパッケージ管理システムがあるが、MacPorts よりも高速で賢いと言われる HomeBrew へ移行してみる。

1. MacPorts のアンインストール

併存はできないようなので、先に MacPorts を削除する必要がある。

・MacPorts でインストール済みのパッケージを確認

$ port installed

・アンインストール

$ sudo port -f uninstall installed
$ sudo rm -rf \
    /opt/local \
    /Applications/DarwinPorts \
    /Applications/MacPorts \
    /Library/LaunchDaemons/org.macports.* \
    /Library/Receipts/DarwinPorts*.pkg \
    /Library/Receipts/MacPorts*.pkg \
    /Library/StartupItems/DarwinPortsStartup \
    /Library/Tcl/darwinports1.0 \
    /Library/Tcl/macports1.0 \
    ~/.macports

2. HomeBrew のインストール

インストール手順・前提条件はこちらを参照。
https://github.com/mxcl/homebrew/wiki/installation

・上記URLからコピー&ペーストを行い、rubyスクリプトを実行

$ /usr/bin/ruby -e "$(/usr/bin/curl -fsSL https://raw.github.com/mxcl/homebrew/master/Library/Contributions/install_homebrew.rb)"
==> This script will install:
/usr/local/bin/brew
/usr/local/Library/Formula/...
/usr/local/Library/Homebrew/...
==> The following directories will be made group writable:
/usr/local/.
/usr/local/share
==> The following directories will have their group set to admin:
/usr/local/.
/usr/local/share

Press enter to continue
==> /usr/bin/sudo /bin/chmod g+rwx /usr/local/. /usr/local/share
Password:
==> /usr/bin/sudo /usr/bin/chgrp admin /usr/local/. /usr/local/share
==> Downloading and Installing Homebrew...
==> Installation successful!
You should run `brew doctor' *before* you install anything.
Now type: brew help

・指示どおり、brew doctor をやってみる。このように表示されれば問題なし。

$ brew doctor
Your system is raring to brew. 

・git をインストールしてから、続けて brew 本体をアップデートする。

$ brew install git
==> Downloading http://git-core.googlecode.com/files/git-1.7.11.1.tar.gz
######################################################################## 100.0%
==> make prefix=/usr/local/Cellar/git/1.7.11.1 CC=/usr/bin/clang CFLAGS=-Os -w -pipe -march=native -Qunused-arguments -mmacosx-version-min=1
==> make CC=/usr/bin/clang CFLAGS=-Os -w -pipe -march=native -Qunused-arguments -mmacosx-version-min=10.7 LDFLAGS=-L/usr/local/lib
==> make clean
==> Downloading http://git-core.googlecode.com/files/git-manpages-1.7.11.1.tar.gz
######################################################################## 100.0%
==> Downloading http://git-core.googlecode.com/files/git-htmldocs-1.7.11.1.tar.gz
######################################################################## 100.0%
==> Caveats
Bash completion has been installed to:
  /usr/local/etc/bash_completion.d

The OS X keychain credential helper has been installed to:
  /usr/local/bin/git-credential-osxkeychain

The 'contrib' directory has been installed to:
  /usr/local/share/git-core/contrib
==> Summary
/usr/local/Cellar/git/1.7.11.1: 1202 files, 23M, built in 34 seconds
$ brew update
Initialized empty Git repository in /usr/local/.git/
remote: Counting objects: 72005, done.
remote: Compressing objects: 100% (35547/35547), done.
remote: Total 72005 (delta 48528), reused 56682 (delta 35655)
Receiving objects: 100% (72005/72005), 10.28 MiB | 567 KiB/s, done.
Resolving deltas: 100% (48528/48528), done.
From https://github.com/mxcl/homebrew
 * [new branch]      gh-pages   -> origin/gh-pages
 * [new branch]      master     -> origin/master
HEAD is now at 11963f0 doctor: fix incorrect usage of 'or'
Unpacking objects: 100% (5/5), done.
Updated Homebrew from 11963f03 to 462201d1.
==> Updated Formula
git-flow

・HomeBrew では、パッケージは /usr/local/bin に格納される。PATHの検索順を変更する。

$ sudo vi /etc/paths
$ cat /etc/paths
/usr/local/bin
/usr/bin
/bin
/usr/sbin
/sbin

 3. インストール実行例

ためしに scala をインストールしてみる。一般ユーザ権限で実行できるのが嬉しい。

$ brew install scala
==> Downloading http://www.scala-lang.org/downloads/distrib/files/scala-2.9.2.tgz
######################################################################## 100.0%
==> Downloading https://raw.github.com/scala/scala-dist/27bc0c25145a83691e3678c7dda602e765e13413/completion.d/2.9.1/scala
######################################################################## 100.0%
==> Caveats
Bash completion has been installed to:
  /usr/local/etc/bash_completion.d
==> Summary
/usr/local/Cellar/scala/2.9.2: 38 files, 26M, built in 39 seconds

 

参考:
http://takus.me/mac/macports-to-homebrew/ 

7.08.2012

Connect NAS on Mac OS X

Mac: NAS への接続

Mac OS X Lion では、ネットワークドライブをマウントする際に
デフォルトで AFP (Apple Filing Protocol) による接続が行われる。
しかし、NAS側が古いためか通信がやたらと遅い。

そこで、スクリプトを作ってSMB接続するようにしたら数倍速くなった。

このような AppleScript を書いて、Applications 配下に .app として保存。

tell application "Finder"
	delay 1  ※適当な遅延時間(秒)
	activate
	mount volume "smb://接続先サーバ(ホスト名orIPアドレス)/共有名”
end tell

これを
System Preferences -> System -> Users & Groups -> Login Items
に追加すれば、ログイン時に自動マウントされる。

参考:
http://www.jinlingren.com/eid50.html 

Using the US Keyborad in Windows

Windows 環境での USキーボードの利用

Windows XP/Vista/7 でUSキーボードを接続した時、レイアウトが正しく反映されない(日本語キーボードのレイアウトのままの)場合がある。

ドライバの更新でもうまくいかない場合、直接レジストリを設定する必要がある。

キー:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\i8042prt\Parameters

名前                                  : 種類             –> データ
LayerDriver JPN                 : REG_SZ        -> kbd101.dll
OverrideKeyboardIdentifier: REG_SZ         -> PCAT_101KEY
OverrideKeyboardSubtype  : REG_DWORD -> 0
OverrideKeyboardType       : REG_DWORD –> 7

また、IMEのOn/Offを多用する場合、次の設定を行えば右AltキーをIMEのトグルに割り当てることができる。
101キーボードをAXキーボードに偽装する方法。(AXキーボードについては@ITの記事を参照)

キー:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\i8042prt\Parameters

名前                                 : 種類              –> データ
LayerDriver JPN                : REG_SZ         -> kbdax2.dll
OverrideKeyboardIdentifier: REG_SZ         –> AX_105KEY
OverrideKeyboardSubtype  : REG_DWORD -> 1
OverrideKeyboardType       : REG_DWORD –> 7

参考:
http://support.microsoft.com/kb/927824/ja
http://www.atmarkit.co.jp/fwin2k/win2ktips/041axkbd/axkbd.html

7.06.2012

Tail Recursion Optimization in Scala

Scala: 末尾再帰の最適化について

関数型プログラミングの中でも重要なテーマの一つ、末尾再帰の最適化について実際に試してみる。

ここでは例として、階乗の結果を定数 1,000,000,007 で割った剰余を求める関数を作る。(何の役に立つか謎だが)

1. 末尾再帰でない場合

まずは、ごく自然な再帰で階乗を求めてみる。

・コード

object Blog20120705_1 {
  val modulo = 1000000007
  def factorial(n: Int): Int = n match {
    case x if x < 0 => throw new IllegalArgumentException
    case 0 => 1
    case x => (x.toLong * factorial(x - 1) % modulo).toInt
  }
  def main(args: Array[String]): Unit = {
    println(factorial(0))
    println(factorial(6))
    println(factorial(1000))
    println(factorial(10000))
  }
}

・実行結果

1
720
641419708
Exception in thread "main" java.lang.StackOverflowError
    at blog.Blog20120705_1$.factorial(Blog20120705.scala:8)
    at blog.Blog20120705_1$.factorial(Blog20120705.scala:8)
    at blog.Blog20120705_1$.factorial(Blog20120705.scala:8)
(以下略)

factorial(1000) までは問題ない。
しかし factorial(10000) を計算したとき、スタックオーバーフローを引き起こしてしまった。

2. 末尾再帰

前の例では再帰処理の結果に対して計算が行われるため、再帰の呼び出しにあたってスタックを使用する必要があった。
次の例のようにアキュームレータを使うことで、関数の処理の最後に再帰呼び出しを行うようにすれば、コンパイラが最適化してスタックを使わないマシンコードを生成してくれる。

・コード

object Blog20120705_2 {
  val modulo = 1000000007
  def factorial(n: Int): Int = {
    def factorialLocal(n: Int, sofar: Int): Int = n match {
      case 0 => sofar
      case x => factorialLocal(x - 1, (x.toLong * sofar % modulo).toInt)
    }
    if (n < 0) throw new IllegalArgumentException
    factorialLocal(n, 1)
  }
  def main(args: Array[String]): Unit = {
    println(factorial(0))
    println(factorial(6))
    println(factorial(1000))
    println(factorial(10000))
  }
}

・実行結果

1
720
641419708
531950728

晴れて、factorial(10000) を計算できた。

3. アノテーションの活用

Scala 2.8 以降では、末尾再帰の最適化を保証してくれる "@tailrec" アノテーションが登場した。
これを利用すれば、最適化されない場合にコンパイルエラーとしてくれる。
末尾再帰の最適化を期待する関数には、安全のため必ず付けるようにしよう。
(末尾再帰をしていても、いくつかの制約により最適化されない場合もあるとのこと)

アノテーションを使用するためには、「import scala.annotation.tailrec」でインポートしておく。

・最適化されないコードは、次のエラーメッセージが出てコンパイルできない

import scala.annotation.tailrec
object Blog20120705_3 {
  val modulo = 1000000007
  @tailrec
  def factorial(n: Int): Int = n match {
    case x if x < 0 => throw new IllegalArgumentException
    case 0 => 1
    case x => (x.toLong * factorial(x - 1) % modulo).toInt
  }
  def main(args: Array[String]): Unit = {
    println(factorial(0))
    println(factorial(6))
    println(factorial(1000))
    println(factorial(10000))
  }
}

・エラーメッセージ

could not optimize @tailrec annotated method factorial: it contains a recursive call not in tail position

・最適化されるコードは、正常にコンパイルされる

import scala.annotation.tailrec
object Blog20120705_4 {
  val modulo = 1000000007
  def factorial(n: Int): Int = {
    @tailrec
    def factorialLocal(n: Int, sofar: Int): Int = n match {
      case 0 => sofar
      case x => factorialLocal(x - 1, (x.toLong * sofar % modulo).toInt)
    }
    if (n < 0) throw new IllegalArgumentException
    factorialLocal(n, 1)
  }
  def main(args: Array[String]): Unit = {
    println(factorial(0))
    println(factorial(6))
    println(factorial(1000))
    println(factorial(10000))
  }
}

7.05.2012

Installing KeyRemap4MacBook

Mac: KeyRemap4MacBook の導入 

素晴らしいソフト。
USキーボードの操作性を格段にアップさせることができた。

ここからダウンロードできる。マニュアルも分かりやすい。
http://pqrs.org/macosx/keyremap4macbook/index.html.ja

一ヶ所設定するだけで、コマンドキーに本来の機能を損なわぬまま
英数キー・かなキーの役割を持たせることができる。
NewImage

ことえりの場合、文字入力後に英数キー・かなキーを素早く2回押せば、その場で入力した内容に対して変換が行われる。
例えば、かなモードの時に「あppぇ」と打鍵した状態で「英数キー」を2回押せば、
文字を削除することなく「apple」と切り替わってくれる。 逆もまた然り。

これが非常に便利。

Google IME の場合は、どうやらその機能は使えないようだ。 

7.01.2012

Ten Useful Keyborad Shortcuts in Mac OS X

Mac: 10個のショートカット

Mac は標準で Emacs風のキーバインドを使うことができる。これはすごい。
control キーを左手小指の付け根で押すテクニックと合わせれば、かなりの効率化になりそうだ。
(ただし、修行が足りないためか MacBook Air だと指が攣りそうになる) 

・移動

control + P    ->    カーソルを上へ    // Previous
control + N    ->    カーソルを下へ    // Next
control + B    ->    カーソルを左へ    // Backward
control + F    ->    カーソルを右へ    // Forward

control + A    ->    カーソルを行頭へ    // 'a' はアルファベットの先頭
control + E    ->    カーソルを行末へ     // End

・一文字削除

control + H    ->    カーソル位置の手前の文字を削除    // バックスペース
control + D    ->    カーソル位置の文字を削除    // Delete

・カット/ペースト

control + K    ->    カーソル位置から行末までをカット    // Kill
control + Y    ->    カーソル位置に貼り付け    // Yank 

Installing BetterTouchTool and Making Safari Better

Mac: BetterTouchTool の導入、Safari 操作の改善

・BetterTouchTool

トラックパッドのジェスチャーに対して、任意のキー入力操作をバインドできるツール。
アプリケーションごとに設定を適用できる。 

こちらからappファイルをダウンロードし、Application フォルダにドラッグ&ドロップすればよい。
http://blog.boastr.net/?page_id=1722

 

・設定の追加

メニューバーからBetterTouchToolのアイコンを選択し、Preferencesを開く。

NewImage

左ペインから適用先のアプリケーションを選択し、(追加は「+」ボタン)
右下の「Add new gesture」でジェスチャーを追加するだけでよい。

今回はこのようなジェスチャーを設定してみた。

// 全アプリ共通の設定
Global => Four Finger Tap -> command + W    // 4本指のタップでウィンドウを閉じる

// Safari の設定
Safari => Three Finger Tap -> command + R    // 3本指のタップでタブを更新
              Two Finger TipTap Left -> command + shift + 左    // 左3本ティップタップで左のタブへ
              Two Finger TipTap Right -> command + shift + 右    // 右3本ティップタップで右のタブへ 
              Two Finger TipTap Middle -> command + T    // 中央3本ティップタップで新しいタブを開く 

NewImage

一本以上の指を置いた状態で左右の指をタップするTipTap という操作を利用すると、
バリエーションを大きく増やすことができる。

最後に、Basic Settings -> General -> Launch BetterTouchTool on startup をチェックし、自動起動するようにする。

NewImage

参考:
http://mac1ntosh.blog79.fc2.com/blog-entry-19.html 

Safari のキーボードショートカットのまとめ
http://inforati.jp/apple/mac-tips-techniques/internet-hints/how-to-use-mac-safari-browser-with-keyboard-shortcut.html 

Tip tap in BetterTouchTool 0.35 for Magic Mouse and Touchpad
http://www.youtube.com/watch?gl=JP&hl=ja&v=MRhBa3-O3fM 

How to Change Save Location for Screenshot in Mac OS X

Mac: スクリーンショットの保存先を変更する

ターミナルを起動し、以下のコマンドを実行すればよい。

・実行例 (パスを ~/Pictures/ScreenShot に変更する例

$ defaults write com.apple.screencapture location ~/Pictures/ScreenShot
$ killall SystemUIServer

・戻し手順

$ defaults delete com.apple.screencapture location
$ killall SystemUIServer