6.25.2012

Installing Oracle JDK 7 in Mac OS X

Mac: JDK7 のインストール

・インストール

http://www.oracle.com/technetwork/java/javase/downloads/index.html

最新の JDK を選択 -> ライセンスに同意 -> Macosx-x64 (今回は jdk-7u5-macosx-x64.dmg) をダウンロード。
実行するとこんな画面が出る。

NewImage 

箱をダブルクリックするとインストーラが起動。
NewImage 

すぐに完了する。
NewImage

ReadMe をクリックすると、説明用ページに飛ぶ。
http://www.oracle.com/technetwork/java/javase/downloads/jdk-for-mac-readme-1564562.html 

 

 ・システムの設定

Application -> Utilities -> Java Preferences を開き、ドラッグ&ドロップで「Java SE 7」を一番上にする。

NewImage

・Eclipse の設定

command + 「,」 で Preferences を開く。
Java -> Installed JREs ===> Add...

NewImage

ここで MacOS X VM が出てこないときは、
Help -> Install New Software… で Eclipse 本家のサイトを選択し、
Programming Languages -> Eclipse Java Development Tools をインストール。

MacOS X VM を選択。NewImage

以下を指定して Finish。
 JRE home: /Library/Java/JavaVirtualMachines/1.7.0.jdk/Contents/Home
 JRE name: Java SE 7 (任意)

NewImage

Java SE 7 を選択。

NewImage

参考:
http://toggtc.hatenablog.com/entry/2012/04/28/112031 

Installing Scala in Mac OS X

Mac: Scala インストールのメモ

Scala 実行環境の導入から Eclipse で開発できるようになるまでの備忘録。
ハマりポイントがいくつかあった。

1. MacPorts のインストール

MacPorts とは、主にオープンソースのソフトウェアを簡単にインストール・管理できる
Mac向けのパッケージシステムで、apt-get や yam と似たようなシンタックスで利用できる。

今回、Scala は MacPorts を利用してインストールすることにする。

http://www.macports.org/
ページ右側の「Download」ボタンをクリック。
Mac OS X Package (.pkg) Installer をダウンロードし実行。インストーラに従えばよい。

また、MacPorts の実行には、Xcode Developer Tools のインストールが必要である。

ハマりポイント①
Xcode をインストールしても、以下のようなエラーが出てしまう。

Error:
Error: No Xcode installation was found.
Error: Please install Xcode and/or run xcode-select to specify its location.
Error:

Xcode4.3以降の場合、Command Line Tool を追加でインストールしなければならないらしい。
http://guide.macports.org/chunked/installing.xcode.html
http://morikuma.org/blog/348

Xcode を開き、Open Developer Tool -> More Developer Tools… をクリック。
ユーザ登録を行い、Command Line Tools for Xcode の最新版をダウンロード・インストールする。

・起動確認

$ sudo port -v
Password:
MacPorts 2.1.1
Entering interactive mode... ("help" for help, "quit" to quit)
[Users/user] > quit
Goodbye
$

・参考:
http://d.hatena.ne.jp/liquidfunc/20100908/1283877396


2. Scala のインストール

・MacPorts でパッケージを検索

$ port search scala

・適切なバージョンをインストール(以下はバージョン2.9の例)

$ sudo port install scala29

 この段階では、「scala-2.9」のようなバージョン付きの実行ファイルしか作成されない。
 「scala」というコマンド名のリンクを作るには、scala_select というパッケージをインストールする。

$ sudo port install scala_select

ハマりポイント②
インストール自体は特に問題ないのに、コマンド「scala_select」を実行できない。

$ scala_select
-bash: scala_select: command not found
$

いつからか、実行方法が変わっているようだ。正しいコマンドは以下の通り。

$ sudo port select --set scala scala29

この辺の説明は、port info コマンドでも参照することができる。ファイル一覧は「port contents」。

$ port info scala_select
scala_select @0.1, Revision 2 (sysutils)

Description:          scala_select installs files that allow 'port select' to switch the default scala compiler. It creates unsuffixed symlinks in the MacPorts prefix that point
                      to the selected version.
Homepage:             http://www.macports.org/

Platforms:            darwin
License:              BSD
Maintainers:          openmaintainer@macports.org, krischik@macports.org, blair@macports.org
$

 ・起動確認

 Java Runtime Environment がインストールされていなければ、以下のような画面が出る。
 「Install」を選択すれば、このタイミングでインストールされる。

1 $ Pasted Graphic 7 

$ scala
Welcome to Scala version 2.9.2 (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_33).
Type in expressions to have them evaluated.
Type :help for more information.

scala> :q
$ 


3. Eclipse のインストール

・本体のインストール
 Mac 用のパッケージを選択し、ダウンロード。(今回は Eclipse IDE for C/C++ の 64Bit版にした)
 http://www.eclipse.org/downloads/ 
 tar ファイルを展開し、フォルダごと /Applications 配下へ移動するだけでよい。 

・ヒープサイズ変更
  /Applications/eclipse/Eclipse.app/Contents/MacOS/eclipse.ini
 を編集し、ヒープサイズを増やす。
 -Xms512m  -Xmx1200m といった感じ。

・Scala IDE の導入
 この手順は他のOSの場合と同じ。
 Scala IDE の URL をコピペするとき Adobe Flash のインストールを要求されたので、ここでインストール。 
 Scala IDE インストール後に Eclipse を再起動。

 http://mogproject.blogspot.jp/2012/04/getting-started-with-scala-functional.html 
 (項番5を参照)  

ハマりポイント③
Eclipse 起動時に以下のエラーが発生。

NewImage
原因未調査。 

・JRE の設定

Preference -> Java -> Installed JREs の設定で以下のホームパスの JRE を追加する。
「/Library/Java/Home」

・動作確認

 新規の Scala プロジェクトを作成し、プログラムが動くことを確認。

6.24.2012

Installing MarsEdit

Mac: MarsEdit のインストール

  • 体験版(30日無料試用)を利用するには、Apple Store ではなく本家からダウンロードする

http://www.red-sweater.com/marsedit/

  • 導入手順

http://www.olein.net/use/20120402070000/ 

  • プレビューのテンプレートを作る
http://crossmodelife.com/2012/01/12/987/ 
  • プレビューで SyntaxHighlighter が使えるようにするには、スクリプトの修正が必要。
http://marcschwieterman.com/blog/marsedit-preview-with-syntaxhighlighter/

また、テンプレート内では shAutoloader.js が(そのままでは)正しく動作しないので、各 shBrushXXX.js ファイルを直接インクルードする。

How to Change the Hostname in Mac OS X

Mac: ホスト名の変更

Mac OS X でホスト名を変えるには、
Apple アイコン - System Preferences…(システム環境設定...)
- Internet & Wireless(インターネットとネットワーク) - Sharing(共有)

を開いて Computer Name(コンピュータ名) を設定すればよい。

Print Screen in Mac OS X

Mac: プリントスクリーンの方法

Mac で画面のキャプチャー(スクリーンショット)を撮るコマンド。

・画面全体のキャプチャー
  shift + command + 3      ⇒ デスクトップ配下にファイルとして出力
  shift + control + command + 3  ⇒ クリップボードにコピー 

・選択範囲のキャプチャー
  shift + command + 4  → ドラッグで範囲を選択      ⇒ デスクトップ配下にファイルとして出力
  shift + control + command + 4  → ドラッグで範囲を選択  ⇒ クリップボードにコピー 

・ウィンドウのキャプチャー
  shift + command + 4  → スペースキー  →  ウィンドウを選択
   ⇒ デスクトップ配下にファイルとして出力
  shift + control + command + 4  → スペースキー  →  ウィンドウを選択
   ⇒ クリップボードにコピー 

参考:
http://memorva.jp/internet/mac/screenshot_print_screen.php 

Hello, MacBook Air!

MacBook Air 購入

アラン・チューリング生誕100周年記念の日に MacBook Air が届いた。

image  MacBook Air 13インチ
image  キーボードはUS配列にカスタマイズ

以下、セットアップのメモ。

・第一言語を英語にしてセットアップ

・日本語入力メソッドを追加設定
  - ことえり環境設定で caps lock キー を 押した時「英字を入力」 にする

・LANに繋げるため、有線インタフェースに固定アドレスを設定

・マルチタッチトラックパッドに感動

・iTunes の設定
  - ライブラリのパスをNASに設定して音源を共有
   http://diary.lylyco.com/2009/08/_itunes_1.html
  - OS起動時にNASを自動マウントする
   http://macfan.jp/guide/2008/10/13/post_100.html

・無料アプリ CheatSheet をインストール
  http://www.cheatsheetapp.com/CheatSheet/
  commandキー長押しでショートカットキー一覧が表示されるようになる

6.23.2012

How to Detect Stack Overflow with GCC

GCCでスタックオーバーフローを検知する方法

GCC でコンパイルしたC/C++プログラムがスタックオーバーフローを引き起こした時、
何も起こっていないかのようにプログラムが静かに終了することがある。

コンパイル時に「-fstack-check」 オプションを付けておくと、スタックオーバーフローの際に
強制的にプログラムを停止させてくれるので、何らかのメッセージを拾うことができる。

また、マルチスレッド環境ではこのフラグを指定すべきである。

Scala Style Guide

Scala スタイルガイド

本家
http://docs.scala-lang.org/style/

PDF版
http://www.codecommit.com/scala-style-guide.pdf

日本語版
http://yanana.github.com/scala-style/

6.19.2012

Performance Triangle for JVM

JVM パフォーマンスのトライアングル

元 Twitter 社エンジニア Attila Szegedi 氏の発表による。
JVM(Java Virtual Machine) のトレードオフ(同時には成立しない二律背反の関係)を考える。

image

この図は分かりやすいが、正確さに欠ける。
そこで、このような三角形(トライアングル)が提唱された。

image

これは、次のように言い換えることができる。

・パフォーマンス トライアングル
image

・省メモリ
  → 物理メモリ・ヒープサイズを増やせば、パフォーマンスは向上する。
  → ただし、32bit のデータモデルの場合は 4GB の壁を超えてはいけない。
    プロセスが 32bit のデータモデルか調べる方法:
    http://mogproject.blogspot.jp/2011/09/how-to-find-if-process-is-64-bit-or-32.html
・応答速度
  → アプリケーションの最長停止時間
  → ガベージコレクタ―の動作が最も影響する

このトライアングルの理論において、
C(Compactness) × T(Throughput) × R(Responsiveness) = a (定数) である。

定数 a に対して、C, T, R のどこに比重を置くか変えるのがチューニング。
定数 a を増加させるのが 最適化である。

参考:
Everything I Ever Learned About JVM Performance Tuning at Twitter
http://www.beyondlinux.com/files/pub/qconhangzhou2011/Everything%20I%20ever%20learned%20about%20JVM%20performance%20tuning%20@twitter%28Attila%20Szegedi%29.pdf

Ninety-Nine Scala Problems

Scala: 99個の小問題

やはり、実力をつけるには問題を解かないと。
http://aperiodic.net/phil/scala/s-99/

6.18.2012

Microsoft Fix it Solution Center

Microsoft Fix it

Microsoft 製品のトラブルシューティングのために、こんなサイトが作られていた。
http://support.microsoft.com/fixit/ja

英語
http://support.microsoft.com/fixit/en

6.14.2012

Creating Shortcuts in VBScript

VBScript: ショートカットの作成

普通のファイルへのショートカットであれば、以下の方法で作成できる。

Option Explicit
Dim wsh: Set wsh = CreateObject("WScript.Shell")
Dim fso: Set fso = CreateObject("Scripting.FileSystemObject")
Dim desktop_path: desktop_path = wsh.SpecialFolders("Desktop")
Dim shortcut_path: shortcut_path = desktop_path & "\Shortcut to notepad.lnk"
Dim target_path: target_path = "%windir%\notepad.exe"
Dim shortcut

If fso.FileExists(shortcut_path) Then
  WScript.Echo "Shortcut already exists."
Else
  Set shortcut = wsh.CreateShortcut(shortcut_path)
  shortcut.TargetPath = target_path
  shortcut.Save
  Set shortcut = Nothing
End If

Set wsh = Nothing
Set fso = Nothing

参考:
http://visualbasic.about.com/od/quicktips/qt/createshortcut.htm

6.10.2012

HTA Helpomatic

HTAスクリプト作成支援ユーティリティ

コントロール要素の作成などに便利。

http://www.microsoft.com/en-us/download/details.aspx?id=17332

6.09.2012

Network Speed Calculator with HTA

HTA版ネットワーク速度計算機

ネットワークの伝送時間を概算で得たい場合、以下の計算式をよく利用する。

bandwidth: 帯域幅(bps)
efficiency: 伝送効率(%)
datasize: データ量(バイト)
timetaken: 所要時間(秒)

image

この計算を簡単に行えるようにHTAのスクリプトを作成した。

・NetSpeed.hta

<html><!--
'*****************************************************************************
'*
'* NAME           : Network Speed Calculator
'*
'* DESCRIPTION    : Calculate bandwidth, data size or time taken.
'*
'* VERSION HISTORY:
'* 1.0  2012-06-09  Initial release by mogproject
'*
'*****************************************************************************
--><head>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<title>&nbsp;</title>

<script language="JavaScript"><!--
resizeWindow(350, 170);

function resizeWindow(width, height) {
  width = Math.min(width, screen.width);
  height = Math.min(height, screen.height);
  window.resizeTo(width, height);
  window.moveTo ((screen.width - width) / 2, (screen.height - height) / 2);
}
--></script>
 
<HTA:APPLICATION
 ID             ="hta"
 APPLICATIONNAME="Network Speed Calculator"
 VERSION        ="1.0"
 ICON           =""
 BORDER         ="normal"
 BORDERSTYLE    ="normal"
 CAPTION        ="yes"
 INNERBORDER    ="yes"
 MAXIMIZEBUTTON ="yes"
 MINIMIZEBUTTON ="yes"
 SHOWINTASKBAR  ="yes"
 SINGLEINSTANCE ="yes"
 SYSMENU        ="yes"
 WINDOWSTATE    ="normal"
 SCROLL         ="no"
 SCROLLFLAT     ="yes"
 SELECTION      ="no"
 CONTEXTMENU    ="yes"
 NAVIGABLE      ="no" />

<script language="JavaScript"><!--
function onLoad() {
  document.title= hta.applicationName + " v" + hta.version;

  txtBandwidth.value = 100;
  txtEfficiency.value = 80;
  txtDataSize.value = "";
  txtTimeTaken.value = "";
  checkAvailability();
}
function onKeyPress(evt) {
  window.event.returnValue
      = (evt.keyCode >= 48 && event.keyCode <= 57) || event.keyCode == 46;
}
function onKeyUp() {
  checkAvailability();
}
function checkAvailability() {
  var elems = [txtBandwidth, txtDataSize, txtTimeTaken];
  for (var i in elems) {
    elems[i].style.backgroundColor = "white";
  }
  btnCalcBandwidth.disabled = ! (txtEfficiency.value.length
      && txtDataSize.value.length && txtTimeTaken.value.length);
  btnCalcDataSize.disabled = ! (txtEfficiency.value.length
      && txtBandwidth.value.length && txtTimeTaken.value.length);
  btnCalcTimeTaken.disabled = ! (txtEfficiency.value.length
      && txtBandwidth.value.length && txtDataSize.value.length);
}
function updateValue(elem, val) {
  elem.value = Math.round(val * 100) / 100;
  checkAvailability();
  elem.style.backgroundColor = "yellow";
}
function calcBandwidth() {
  updateValue(txtBandwidth,
      800 * txtDataSize.value * lstUnitDataSize.value
      / (txtTimeTaken.value * lstUnitTimeTaken.value * txtEfficiency.value)
      / lstUnitBandwidth.value);
}
function calcDataSize() {
  updateValue(txtDataSize,
      txtBandwidth.value * lstUnitBandwidth.value * txtEfficiency.value
      * txtTimeTaken.value * lstUnitTimeTaken.value / 800
      / lstUnitDataSize.value);
}
function calcTimeTaken() {
  updateValue(txtTimeTaken,
      800 * txtDataSize.value * lstUnitDataSize.value
      / (txtBandwidth.value * lstUnitBandwidth.value * txtEfficiency.value)
      / lstUnitTimeTaken.value);
}
--></script>

<style type="text/css"><!--
body {
  font-family     : Verdana, Arial, Helvetica, Sans-serif;
  font-size       : 9px;
  font-weight     : normal;
  background-color: #a9a9a9;
  color           : #000000;
  margin          : 0px 0px 0px 0px;
}
table {
  border-collapse : collapse;
  border-spacing  : 0px;
  border-width    : 0px;
  border-style    : solid;
}
table.main {
  width           : 320px;
  height          : 120px;
  font-size       : 12px;
}
input {
  font-family     : Verdana, Arial, Helvetica, Sans-serif;
  font-weight     : normal;
}
input.text {
  font-size       : 14px;
  text-align      : right;
  width           : 6em;
}
input.button {
  width           : 4em;
}
select {
  font-family     : Verdana, Arial, Helvetica, Sans-serif;
  font-size       : 12px;
  font-weight     : normal;
}
--></style>
</head>

<body onload="onLoad()">
<table width="100%" height="100%"><tr><td align="center">
<table class="main">
<tr>
 <td align="right">bandwidth</td>
 <td align="right">
   <input name="txtBandwidth" type="text" class="text"
    onkeypress="window.event.returnValue = onKeyPress(window.event)"
    onkeyup="onKeyUp()" onchange="onKeyUp()" />
 </td>
 <td align="left">
  <select name="lstUnitBandwidth">
   <option value="1">bps</option>
   <option value="1024">Kbps</option>
   <option value="1048576" selected="selected">Mbps</option>
   <option value="1073741824">Gbps</option>
  </select>
 </td>
 <td align="left">
  <input name="btnCalcBandwidth" type="button" class="button" value="calc"
   onclick="calcBandwidth()" />
 </td>
</tr>
<tr>
 <td align="right">efficiency</td>
 <td align="right">
   <input name="txtEfficiency" type="text" class="text"
    onkeypress="onKeyPress(window.event)"
    onkeyup="onKeyUp()" onchange="onKeyUp()" />
 </td>
 <td align="left">%</td>
 <td align="left"></td>
</tr>
<tr>
 <td align="right">data size</td>
 <td align="right">
   <input name="txtDataSize" type="text" class="text"
    onkeypress="onKeyPress(window.event)"
    onkeyup="onKeyUp()" onchange="onKeyUp()" />
 </td>
 <td align="left">
  <select name="lstUnitDataSize">
   <option value="1">Byte</option>
   <option value="1024">KB</option>
   <option value="1048576" selected="selected">MB</option>
   <option value="1073741824">GB</option>
   <option value="1099511627776">TB</option>
  </select>
 </td>
 <td align="left">
  <input name="btnCalcDataSize" type="button" class="button" value="calc""
   onclick="calcDataSize()" />
 </td>
</tr>
<tr>
 <td align="right">time taken</td>
 <td align="right">
   <input name="txtTimeTaken" type="text" class="text"
    onkeypress="onKeyPress(window.event)"
    onkeyup="onKeyUp()" onchange="onKeyUp()" />
 </td>
 <td align="left">
  <select name="lstUnitTimeTaken">
   <option value="1">seconds</option>
   <option value="60" selected="selected">minutes</option>
   <option value="3600">hours</option>
   <option value="86400">days</option>
  </select>
 </td>
 <td align="left">
  <input name="btnCalcTimeTaken" type="button" class="button" value="calc"
   onclick="calcTimeTaken()" />
  </td>
</tr>
</table>
</body>
</td></tr></table>
</html>

・画面

image

・使用方法

(1) 必要な帯域幅を算出したい場合
bandwidthの単位, efficiency, data size, time taken を設定し、bandwidth 横の「calc」ボタンを押下。

(2) 時間内に伝送可能なデータ量を算出したい場合
bandwidth, efficiency, data sizeの単位, time taken を設定し、data size 横の「calc」ボタンを押下。

(3) 所要時間を算出したい場合
bandwidth, efficiency, data size, time takenの単位 を設定し、time taken 横の「calc」ボタンを押下。

6.03.2012

C++: Handy version of sequence algorithms

シーケンス(vector/string)操作アルゴリズムの便利バージョン

・概要

UNIQUE: ソート処理を行なってからユニーク・アルゴリズムを実行し、不要な部分を削除する。
http://mogproject.blogspot.jp/2011/08/c-remove-duplicates-from-vector.html

REMOVE, REMOVE_IF: 削除アルゴリズムを実行した後、不要な部分を削除する。

ROTATE: 指定されたカウント分、シーケンスを左方向にローテーションする。
      負数が指定された場合は、逆に右方向へローテーションする。

・コード

template <typename T> void UNIQUE(T &v) {
  std::sort(v.begin(), v.end());
  v.erase(std::unique(v.begin(), v.end()), v.end());
}
template <typename T, typename U> void REMOVE(T &v, U const& val) {
  v.erase(std::remove(v.begin(), v.end(), val), v.end());
}
template <typename T, typename U> void REMOVE_IF(T &v, U predicate) {
  v.erase(std::remove_if(v.begin(), v.end(), predicate), v.end());
}
template <typename T> void ROTATE(T &v, int count) {
  count %= static_cast<int>(v.size());
  if (count < 0) { std::rotate(v.rbegin(), v.rbegin() - count, v.rend()); }
  else { std::rotate(v.begin(), v.begin() + count, v.end()); }
}

・実行例

#include <vector>
#include <string>
#include <iostream>
#include <sstream>
#include <algorithm>

template <typename T> void UNIQUE(T &v) {
  std::sort(v.begin(), v.end());
  v.erase(std::unique(v.begin(), v.end()), v.end());
}
template <typename T, typename U> void REMOVE(T &v, U const& val) {
  v.erase(std::remove(v.begin(), v.end(), val), v.end());
}
template <typename T, typename U> void REMOVE_IF(T &v, U predicate) {
  v.erase(std::remove_if(v.begin(), v.end(), predicate), v.end());
}
template <typename T> void ROTATE(T &v, int count) {
  count %= static_cast<int>(v.size());
  if (count < 0) { std::rotate(v.rbegin(), v.rbegin() - count, v.rend()); }
  else { std::rotate(v.begin(), v.begin() + count, v.end()); }
}

std::vector<int> create_vector(int t1, int t2, int t3, int t4, int t5) {
  std::vector<int> v;
  v.push_back(t1); v.push_back(t2); v.push_back(t3); v.push_back(t4); v.push_back(t5);
  return v;
}

using namespace std;

string output(vector<int> const& v, string const& s) {
  stringstream ss;
  for (int i = 0; i < (int)v.size(); ++i) ss << v[i] << ", ";
  ss << s << endl;
  return ss.str();
}
bool is_odd(int x) { return x % 2; }

int main() {
  vector<int> v_init = create_vector(1, 2, 1, 3, 2), v;
  string s_init = "ABACB", s;

  v = v_init; s = s_init;
  cout << "before UNIQUE:     " << output(v, s);
  cout << "after  UNIQUE:     " << output((UNIQUE(v), v), (UNIQUE(s), s));

  v = v_init; s = s_init;
  cout << "before REMOVE:     " << output(v, s);
  cout << "after  REMOVE:     " << output((REMOVE(v, 2), v), (REMOVE(s, 'B'), s));

  v = v_init; s = s_init;
  cout << "before REMOVE_IF:  " << output(v, s);
  cout << "after  REMOVE_IF:  " << output((REMOVE_IF(v, is_odd), v), (REMOVE_IF(s, is_odd), s));

  v = create_vector(1, 2, 3, 4, 5); s = "ABCDE";
  cout << "before ROTATE:     " << output(v, s);
  cout << "after  ROTATE(2):  " << output((ROTATE(v, 2), v), (ROTATE(s, 2), s));
  cout << "after  ROTATE(-2): " << output((ROTATE(v, -2), v), (ROTATE(s, -2), s));
  cout << "after  ROTATE(12): " << output((ROTATE(v, 12), v), (ROTATE(s, 12), s));

  return 0;
}

・出力例

before UNIQUE:     1, 2, 1, 3, 2, ABACB
after  UNIQUE:     1, 2, 3, ABC
before REMOVE:     1, 2, 1, 3, 2, ABACB
after  REMOVE:     1, 1, 3, AAC
before REMOVE_IF:  1, 2, 1, 3, 2, ABACB
after  REMOVE_IF:  2, 2, BB
before ROTATE:     1, 2, 3, 4, 5, ABCDE
after  ROTATE(2):  3, 4, 5, 1, 2, CDEAB
after  ROTATE(-2): 1, 2, 3, 4, 5, ABCDE
after  ROTATE(12): 3, 4, 5, 1, 2, CDEAB