<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10japanesefull.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ja"><title type="text">◆F99a.q8oVE::Blog</title><link rel="alternate" type="text/html" href="http://blog.f99aq8ove.net/" /><updated>2011-04-03T13:25:41+00:00</updated><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="f99aq" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><id>tag:blog.f99aq8ove.net,2005:/</id><link rel="license" type="text/html" href="http://creativecommons.org/licenses/by-sa/3.0/" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.jp/f99aq" /><entry><title type="html">FreeBSDなファイルサーバーからexportしたドライブをiSCSIでマウントして、Time Machine用に使う</title><link rel="alternate" type="text/html" href="http://blog.f99aq8ove.net/archive/2011/04/1301837141.html" /><category term="FreeBSD" /><category term="iSCSI" /><author><name>◆F99a.q8oVE</name></author><updated>2011-04-03T06:25:41-07:00</updated><id>tag:blog.f99aq8ove.net,2011-04-03:/archive/2011/04/1301837141.html</id><content type="html">&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
			&lt;p&gt;&#xD;
Macのバックアップ機能Time Machineは、直接USBで接続したHDDを使うのは簡単ですが、NASのようにネットワーク越しのドライブを使用するには小細工が必要なことで有名です。&#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
本エントリでは、ネットワーク越しにFreeBSDなファイルサーバーをiSCSIでマウントできるようにして、これをTime Machineに使ってみます。&#xD;
&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;FreeBSD 8.2-RELEASE&lt;/li&gt;&#xD;
&lt;li&gt;istgt-20110223&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;&#xD;
Time Machine用にzfs領域(なんて言うんだっけ?)を確保しておきます。&#xD;
&lt;/p&gt;&#xD;
&lt;pre&gt;&#xD;
## __GooglePrettify__&#xD;
# zfs create -o mountpoint=/timemachine tank3/timemachine&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;&#xD;
ここで、zfsの設定からshareiscsi=onを設定してみても、FreeBSDではサポートされていなくて残念な思いをします。&#xD;
なので、portsから以下をインストールします。&#xD;
&lt;/p&gt;&#xD;
&lt;pre&gt;&#xD;
## __GooglePrettify__&#xD;
&#xD;
# cd /usr/local/etc/istgt&#xD;
# cp auth.conf.sample auth.conf&#xD;
# cp istgt.conf.sample istgt.conf&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;&#xD;
istgt.conf を適宜修正。以下では、ファイルサーバーは10.0.1.1, マウントするマックは10.0.4.1です。&#xD;
&lt;/p&gt;&#xD;
&lt;pre&gt;&#xD;
## __GooglePrettify__&#xD;
--- istgt.conf.sample   2011-04-01 02:04:14.638057161 +0900&#xD;
+++ istgt.conf  2011-04-02 17:14:28.031064416 +0900&#xD;
@@ -17,7 +17,7 @@&#xD;
 [Global]&#xD;
   Comment "Global section"&#xD;
   # node name (not include optional part)&#xD;
-  NodeBase "iqn.2007-09.jp.ne.peach.istgt"&#xD;
+  NodeBase "iqn.2007-09.net.f99aq8ove.istgt"&#xD;
&#xD;
   # files&#xD;
   PidFile /var/run/istgt.pid&#xD;
@@ -83,7 +83,7 @@&#xD;
   Comment "SINGLE PORT TEST"&#xD;
   # Portal Label(not used) IP(IPv6 or IPv4):Port&#xD;
   #Portal DA1 [2001:03e0:06cf:0003:021b:21ff:fe04:f405]:3260&#xD;
-  Portal DA1 192.168.2.36:3260&#xD;
+  Portal DA1 10.0.1.1:3260&#xD;
&#xD;
 # wildcard address you may need if use DHCP&#xD;
 # DO NOT USE WITH OTHER PORTALS&#xD;
@@ -95,10 +95,10 @@&#xD;
&#xD;
 [InitiatorGroup1]&#xD;
   Comment "Initiator Group1"&#xD;
-  InitiatorName "iqn.1991-05.com.microsoft:saturn"&#xD;
+  # InitiatorName "iqn.1991-05.com.microsoft:saturn"&#xD;
   # special word "ALL" match all of initiators&#xD;
-  #InitiatorName "ALL"&#xD;
-  Netmask 192.168.2.0/24&#xD;
+  InitiatorName "ALL"&#xD;
+  Netmask 10.0.4.0/24&#xD;
&#xD;
 # TargetName, Mapping, UnitType, LUN0 are minimum required&#xD;
 [LogicalUnit1]&#xD;
&#xD;
@@ -106,13 +106,13 @@&#xD;
   # full specified iqn (same as below)&#xD;
   #TargetName iqn.2007-09.jp.ne.peach.istgt:disk1&#xD;
   # short specified non iqn (will add NodeBase)&#xD;
-  TargetName disk1&#xD;
-  TargetAlias "Data Disk1"&#xD;
+  TargetName timemachine&#xD;
+  TargetAlias "Time machine"&#xD;
   # use initiators in tag1 via portals in tag1&#xD;
   Mapping PortalGroup1 InitiatorGroup1&#xD;
   # accept both CHAP and None&#xD;
-  AuthMethod Auto&#xD;
-  AuthGroup AuthGroup1&#xD;
+  AuthMethod None&#xD;
+  #AuthGroup AuthGroup1&#xD;
   #UseDigest Header Data&#xD;
   UseDigest Auto&#xD;
   UnitType Disk&#xD;
@@ -136,7 +136,7 @@&#xD;
&#xD;
   # LogicalVolume for this unit on LUN0&#xD;
   # for file extent&#xD;
-  LUN0 Storage /tank/iscsi/istgt-disk1 10GB&#xD;
+  LUN0 Storage /timemachine/tm1 200GB&#xD;
   # for raw device extent&#xD;
   #LUN0 Storage /dev/ad4 Auto&#xD;
   # for ZFS volume extent&#xD;
&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;&#xD;
また、ファイヤーウォールの 3260 tcp/udp を開けておきます。&#xD;
&lt;/p&gt;&#xD;
&lt;pre&gt;&#xD;
## __GooglePrettify__&#xD;
# echo istgt_enable="YES" &amp;gt;&amp;gt; /etc/rc.conf&#xD;
# /usr/local/etc/rc.d/istgt start&#xD;
# /usr/local/etc/rc.d/istgt start&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;&#xD;
これでサーバー側の設定は完了。次はマック側の設定です。&#xD;
&lt;a href="http://www.studionetworksolutions.com/products/product_detail.php?pi=11"&gt;globalSAN iSCSI initiator for OS X&lt;/a&gt;をインストールします。&#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
環境設定でglobalSANの設定画面を開いてTargetの追加で&lt;br&gt;&#xD;
&#xD;
Target Name: iqn.2007-09.net.f99aq8ove.istgt:timemachine&lt;br&gt;&#xD;
でadd&lt;br&gt;&#xD;
iSCSI Options... -&amp;gt; Always send "SessionType" when connecting. をチェック&lt;br&gt;&#xD;
そのあとでIPaddrを登録してconnect&#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
初期化するか聞いてくるので初期化して、このディスクをTimeMachineで使うようにして完成&#xD;
&lt;/p&gt;&#xD;
		&lt;/div&gt;</content></entry><entry><title type="html">適当 Net::Cassandra ラッパー</title><link rel="alternate" type="text/html" href="http://blog.f99aq8ove.net/archive/2010/06/1275824769.html" /><category term="Cassandra" /><author><name>◆F99a.q8oVE</name></author><updated>2010-06-06T04:46:09-07:00</updated><id>tag:blog.f99aq8ove.net,2010-06-06:/archive/2010/06/1275824769.html</id><content type="html">&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
			&lt;ul&gt;&#xD;
&lt;li&gt;&lt;a href="http://f99aq8ove.net/tr/"&gt;ついったら〜人気者ランキング&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;a href="http://d.hatena.ne.jp/f99aq/20100207/1265547349"&gt;ついったら〜人気者ランキング - ◆F99a.q8oVEの日記&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;&#xD;
Twitter Streaming API で流れてくるユーザー情報を保存するのに、初めは MySQL を使っていました。でも、IO が重かった(自宅ファイルサーバ兼用なので……)ので、Cassandra に切り替えてみました。ちょうど、Key-value store っぽい使いかたしかしてなかったし。&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
もう少しちゃんと実装してテストも書いてから出そうかと思ってたけど、数ヶ月進展しないからとりあえず貼ってみます。&#xD;
&lt;/p&gt;&#xD;
&lt;script src="http://gist.github.com/427517.js?file=MyCassandra.pm"&gt;&lt;/script&gt;&#xD;
		&lt;/div&gt;</content></entry><entry><title type="html">grub2 を入れてみた</title><link rel="alternate" type="text/html" href="http://blog.f99aq8ove.net/archive/2010/05/1273390320.html" /><category term="ubuntu" /><category term="linux" /><author><name>◆F99a.q8oVE</name></author><updated>2010-05-09T00:32:00-07:00</updated><id>tag:blog.f99aq8ove.net,2010-05-09:/archive/2010/05/1273390320.html</id><content type="html">&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
			&lt;p&gt;&#xD;
最近、Ubuntu 10.04  (lucid) にアップグレードしたんだけど、grub2 が入ってなかったので、手動で grub2 を入れてみた。&#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
実は、Ubuntu 9.10 から grub2 がデフォルトだったらしいけど、クリーンインストールはしてなかったので、自動では grub2 は入らなかったみたい。&#xD;
&lt;pre&gt;&#xD;
% grub-install -v&#xD;
&lt;/pre&gt;&#xD;
したら、0.94だったかな?&#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
&lt;h2&gt;grub2 をインストールする&lt;/h2&gt;&#xD;
&lt;pre&gt;&#xD;
% sudo aptitude install grub2&#xD;
&lt;/pre&gt;&#xD;
これで、インストールされる。表示されるデフォルトの選択子を選ぶと、grub2 は menu.lst からチェーンロードされる。この状態で grub2 がちゃんと動作することを確認して、&#xD;
&lt;pre&gt;&#xD;
% sudo upgrade-from-grub-legacy&#xD;
&lt;/pre&gt;&#xD;
してやれば、直接 grub2 がロードされるようになる。&#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
とまぁ、特に設定してないんで代わり映えはしないけど、とりあえず grub2 になった模様。&#xD;
&lt;pre&gt;&#xD;
% grub-install -v&#xD;
grub-install (GNU GRUB 1.98-1ubuntu6)&#xD;
&lt;/pre&gt;&#xD;
&lt;/p&gt;&#xD;
		&lt;/div&gt;</content></entry><entry><title type="html">FreeBSD 7.2でHadoopのサンプルを動かしてみた</title><link rel="alternate" type="text/html" href="http://blog.f99aq8ove.net/archive/2009/09/1253375133.html" /><category term="hadoop" /><author><name>◆F99a.q8oVE</name></author><updated>2009-09-19T08:45:33-07:00</updated><id>tag:blog.f99aq8ove.net,2009-09-20:/archive/2009/09/1253375133.html</id><content type="html">&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
			&lt;p&gt;&#xD;
とりあえず、hadoop用のアカウントを作ってみた。&#xD;
&lt;/p&gt;&#xD;
&lt;pre&gt;&#xD;
## __GooglePrettify__&#xD;
% sudo adduser hadoop&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;&#xD;
このユーザー用に、パスワード無しのSSH鍵を作って、ログインできるようにしておく。&#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
予めtarballを手動で/usr/ports/distfilesに入れておいて、&#xD;
&lt;/p&gt;&#xD;
&lt;pre&gt;&#xD;
## __GooglePrettify__&#xD;
% cd /usr/ports/java/diablo-jdk16&#xD;
% sudo make config          # TZUPDATEは無効にしておく(手抜き)&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;&#xD;
で、JDKのインストール&#xD;
&lt;/p&gt;&#xD;
&lt;pre&gt;&#xD;
## __GooglePrettify__&#xD;
% sudo portinstall java/diablo-jdk16&#xD;
% sudo portinstall shells/bash&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;&#xD;
JDKが入ったら、次はhadoopのインストール。&lt;a href="http://hadoop.apache.org/common/releases.html#Download"&gt;http://hadoop.apache.org/common/releases.html#Download&lt;/a&gt;らへんからダウンロード。&#xD;
&lt;/p&gt;&#xD;
&lt;pre&gt;&#xD;
## __GooglePrettify__&#xD;
% tar zxvf hadoop-0.20.1.tar.gz&#xD;
% cd hadoop-0.20.1/conf&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;&#xD;
hadoop-env.shのJAVA_HOMEを設定しておく。&#xD;
&lt;/p&gt;&#xD;
&lt;pre&gt;&#xD;
## __GooglePrettify__&#xD;
export JAVA_HOME=/usr/local/diablo-jdk1.6.0&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;&#xD;
docs/quickstart.htmlを見ながら&#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
conf/core-site.xml&#xD;
&lt;/p&gt;&#xD;
&lt;pre&gt;&#xD;
&amp;lt;!-- __GooglePrettify__ --&amp;gt;&#xD;
&amp;lt;configuration&amp;gt;&#xD;
  &amp;lt;property&amp;gt;&#xD;
    &amp;lt;name&amp;gt;fs.default.name&amp;lt;/name&amp;gt;&#xD;
    &amp;lt;value&amp;gt;hdfs://localhost:9000&amp;lt;/value&amp;gt;&#xD;
  &amp;lt;/property&amp;gt;&#xD;
&amp;lt;/configuration&amp;gt;&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;&#xD;
conf/hdfs-site.xml&#xD;
&lt;/p&gt;&#xD;
&lt;pre&gt;&#xD;
&amp;lt;!-- __GooglePrettify__ --&amp;gt;&#xD;
&amp;lt;configuration&amp;gt;&#xD;
  &amp;lt;property&amp;gt;&#xD;
    &amp;lt;name&amp;gt;dfs.replication&amp;lt;/name&amp;gt;&#xD;
    &amp;lt;value&amp;gt;1&amp;lt;/value&amp;gt;&#xD;
  &amp;lt;/property&amp;gt;&#xD;
&amp;lt;/configuration&amp;gt;&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;&#xD;
conf/mapred-site.xml&#xD;
&lt;/p&gt;&#xD;
&lt;pre&gt;&#xD;
&amp;lt;!-- __GooglePrettify__ --&amp;gt;&#xD;
&amp;lt;configuration&amp;gt;&#xD;
  &amp;lt;property&amp;gt;&#xD;
    &amp;lt;name&amp;gt;mapred.job.tracker&amp;lt;/name&amp;gt;&#xD;
    &amp;lt;value&amp;gt;localhost:9001&amp;lt;/value&amp;gt;&#xD;
  &amp;lt;/property&amp;gt;&#xD;
&amp;lt;/configuration&amp;gt;&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;&#xD;
起動してみる。&#xD;
&lt;/p&gt;&#xD;
&lt;pre&gt;&#xD;
## __GooglePrettify__&#xD;
% cd ../bin&#xD;
% ./hadoop namenode -format        # HDFSの初期化&#xD;
% ./start-all.sh&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;&#xD;
エラーが出なければ成功。jpsで動作してるか確認できる。&#xD;
&lt;/p&gt;&#xD;
&lt;pre&gt;&#xD;
## __GooglePrettify__&#xD;
% mkdir ~/inputs&#xD;
% cp CHANGES.txt ~/inputs            # 適当なファイルを入れて&#xD;
% hadoop dfs -put ~/inputs inputs    # HDFSにコピー&#xD;
% hadoop dfs -ls inputs              # コピーできたか確認&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;&#xD;
いよいよ、map, reduceを実行してみる。&#xD;
&lt;/p&gt;&#xD;
&lt;pre&gt;&#xD;
## __GooglePrettify__&#xD;
% hadoop jar hadoop-0.20.1-examples.jar wordcount inputs outputs&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;&#xD;
ほっとくと、なにやら出力が出て終了。&#xD;
&lt;/p&gt;&#xD;
&lt;pre&gt;&#xD;
## __GooglePrettify__&#xD;
% hadoop dfs -ls outputs&#xD;
Found 2 items&#xD;
drwxr-xr-x   - hadoop supergroup          0 2009-09-19 22:58 /user/hadoop/outputs/_logs&#xD;
-rw-r--r--   1 hadoop supergroup     126351 2009-09-19 22:59 /user/hadoop/outputs/part-r-00000&#xD;
% hadoop dfs -cat outputs/part-r-00000      # に、単語をカウントした結果が出力される&#xD;
&lt;/pre&gt;&#xD;
		&lt;/div&gt;</content></entry><entry><title type="html">C++ で学ぶ JavaScript の参照渡し (入門編)</title><link rel="alternate" type="text/html" href="http://blog.f99aq8ove.net/archive/2009/05/1241948336.html" /><category term="JavaScript" /><category term="C++" /><author><name>◆F99a.q8oVE</name></author><updated>2009-05-10T02:38:56-07:00</updated><id>tag:blog.f99aq8ove.net,2009-05-10:/archive/2009/05/1241948336.html</id><content type="html">&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
			&lt;p&gt;&#xD;
発端は、2ch で見かけた、この発言 &lt;a href="http://pc11.2ch.net/test/read.cgi/tech/1192182741/605"&gt;JavaScript&lt;/a&gt;.&#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
まずは、こちらをご覧ください。&lt;br&gt;&#xD;
(注: 例示の JavaScript は SpiderMonkey や Rhino のインタプリターで実行するか、print を alert に読みかえてブラウザーで実行してください。)&#xD;
&lt;/p&gt;&#xD;
&lt;pre&gt;&#xD;
// __GooglePrettify__&#xD;
function func1(a) {&#xD;
    a = {hoge: 2};&#xD;
}&#xD;
var b = {hoge: 1};&#xD;
func1(b);&#xD;
print(b.hoge); // =&amp;gt; 1&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;&#xD;
実行すると、1 と表示されましたよね。「参照渡し(call by reference)なら、ここで 2 と表示されなければおかしい。これは、値渡し(call by value)じゃないの?」というのがリンク先で投げかけられていた疑問です。&#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
ここで、次の関数を考えてみます。&#xD;
&lt;/p&gt;&#xD;
&lt;pre&gt;&#xD;
// __GooglePrettify__&#xD;
function func2(a) {&#xD;
    a.hoge = 2;&#xD;
}&#xD;
var b = {hoge: 1};&#xD;
func2(b);&#xD;
print(b.hoge); // =&amp;gt; 2&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;&#xD;
今度は 2 と表示されたと思います。この挙動を指して、参照渡しだと説明された場合は納得できると思います。&#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
ここで、突然ですが、視点を変えて C++ で同様の関数をつくってみましょう。&#xD;
&lt;/p&gt;&#xD;
&lt;pre&gt;&#xD;
// __GooglePrettify__&#xD;
#include &amp;lt;iostream&amp;gt;&#xD;
&#xD;
using namespace std;&#xD;
&#xD;
class Hoge&#xD;
{&#xD;
public:&#xD;
    int hoge;&#xD;
    Hoge(int a) : hoge(a) {}&#xD;
};&#xD;
&#xD;
void func_v1(Hoge a)&#xD;
{&#xD;
    a = Hoge(2);&#xD;
}&#xD;
&#xD;
void func_v2(Hoge a)&#xD;
{&#xD;
    a.hoge = 2;&#xD;
}&#xD;
&#xD;
void func_r1(Hoge &amp;amp;a)&#xD;
{&#xD;
    a = Hoge(2);&#xD;
}&#xD;
&#xD;
void func_r2(Hoge &amp;amp;a)&#xD;
{&#xD;
    a.hoge = 2;&#xD;
}&#xD;
&#xD;
int main(void)&#xD;
{&#xD;
    {&#xD;
        Hoge b(1);&#xD;
        func_v1(b);&#xD;
        cout &amp;lt;&amp;lt; b.hoge &amp;lt;&amp;lt; endl; // =&amp;gt; 1&#xD;
    }&#xD;
    {&#xD;
        Hoge b(1);&#xD;
        func_v2(b);&#xD;
        cout &amp;lt;&amp;lt; b.hoge &amp;lt;&amp;lt; endl; // =&amp;gt; 1&#xD;
        // まぁ、値渡しですから。&#xD;
    }&#xD;
    {&#xD;
        Hoge b(1);&#xD;
        func_r1(b);&#xD;
        cout &amp;lt;&amp;lt; b.hoge &amp;lt;&amp;lt; endl; // =&amp;gt; 2&#xD;
        // おっ!?&#xD;
    }&#xD;
    {&#xD;
        Hoge b(1);&#xD;
        func_r2(b);&#xD;
        cout &amp;lt;&amp;lt; b.hoge &amp;lt;&amp;lt; endl; // =&amp;gt; 2&#xD;
        // うんうん。これこそ、参照渡しです。&#xD;
    }&#xD;
&#xD;
    return 0;&#xD;
}&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;&#xD;
同じような事をするのに、2 倍のパターンが出てきました。さてさて、JavaScript はどちらのパターンでしょう。&#xD;
結論から言うと後者の _r 付きのパターンにあたります。これが参照渡し(call by refference)です。&#xD;
_v 付きは、もちろん値渡し(call by value)です。&#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
ここで、よ〜く見ると、func_r1 と func1 の挙動が異なりますね。&#xD;
ここで更に C++ について学んで行きましょう。&#xD;
&lt;/p&gt;&#xD;
&lt;pre&gt;&#xD;
// __GooglePrettify__&#xD;
#include &amp;lt;iostream&amp;gt;&#xD;
&#xD;
using namespace std;&#xD;
&#xD;
class Hoge&#xD;
{&#xD;
public:&#xD;
    int hoge;&#xD;
    Hoge(int a) : hoge(a) {}&#xD;
};&#xD;
&#xD;
void func_p1(Hoge *a)&#xD;
{&#xD;
    a = new Hoge(2);&#xD;
}&#xD;
&#xD;
void func_p1_(Hoge *a)&#xD;
{&#xD;
    *a = Hoge(2);&#xD;
}&#xD;
&#xD;
void func_p2(Hoge *a)&#xD;
{&#xD;
    a-&amp;gt;hoge = 2;&#xD;
}&#xD;
&#xD;
int main(void)&#xD;
{&#xD;
    {&#xD;
        Hoge b(1);&#xD;
        func_p1(&amp;amp;b);&#xD;
        cout &amp;lt;&amp;lt; b.hoge &amp;lt;&amp;lt; endl; // =&amp;gt; 1&#xD;
        // あらあら (このままだとメモリーリークします)&#xD;
    }&#xD;
    {&#xD;
        Hoge b(1);&#xD;
        func_p1_(&amp;amp;b);&#xD;
        cout &amp;lt;&amp;lt; b.hoge &amp;lt;&amp;lt; endl; // =&amp;gt; 2&#xD;
        // おぁ!?&#xD;
    }&#xD;
    {&#xD;
        Hoge b(1);&#xD;
        func_p2(&amp;amp;b);&#xD;
        cout &amp;lt;&amp;lt; b.hoge &amp;lt;&amp;lt; endl; // =&amp;gt; 2&#xD;
        // うんうん&#xD;
    }&#xD;
&#xD;
    return 0;&#xD;
}&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;&#xD;
またしても分裂してしまいました。ここで、func1 と同じものは func_p1 です。func_r1 と同じものは func_p1_ です。(本当は、参照は書き変え不可な所が違いますが。)&lt;br&gt;&#xD;
func_p1 と func_p1_ の違いのポイントは、代入時の左辺値が a か *a か、という点です。&#xD;
これによって、処理の対象が "ポインタ" か "ポインタが指し示している先のオブジェクト" か、という違いが生じます。&lt;br&gt;&#xD;
C++ では参照を用いることで、"*" を使わずに "参照先のオブジェクト" に対して処理を実行することができます。&#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
ところで、先程の C++ の関数はこうも書けます。&#xD;
&lt;/p&gt;&#xD;
&lt;pre&gt;&#xD;
// __GooglePrettify__&#xD;
#include &amp;lt;iostream&amp;gt;&#xD;
&#xD;
using namespace std;&#xD;
&#xD;
class Hoge&#xD;
{&#xD;
public:&#xD;
    int hoge;&#xD;
    Hoge(int a) : hoge(a) {}&#xD;
};&#xD;
&#xD;
void func_r1_(Hoge &amp;amp;a)&#xD;
{&#xD;
    a.operator=(Hoge(2));&#xD;
}&#xD;
&#xD;
int main(void)&#xD;
{&#xD;
    {&#xD;
        Hoge b(1);&#xD;
        func_r1_(b);&#xD;
        cout &amp;lt;&amp;lt; b.hoge &amp;lt;&amp;lt; endl; // =&amp;gt; 2&#xD;
        // おおっ!?&#xD;
    }&#xD;
&#xD;
    return 0;&#xD;
}&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;&#xD;
この書き方のほうが、参照先のオブジェクトの代入演算子を実行している...、参照先のオブジェクトのメンバ関数 operator= を実行しているということがわかりやすいと思います。&lt;br&gt;&#xD;
ポインタによる参照渡しの例 func_p1 に戻ると、こっちは参照先自体(ポインタ)を入れ替える処理が実行されます。そしてこれは、JavaScript での参照渡しと同様の動作です。&#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
func_p1 と func_r1 の差はここです。&#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
C++ での参照は、一貫して参照先のオブジェクトに○○を適用という感じです。&#xD;
JavaScript でも、C++ のそれとだいたい同じなのですが、代入の時だけは参照を貼り替えるという動作になります。&#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
なんとなくイメージはつかんでいただけたかなと思うのですが、いかがでしょう?&#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
最後に、C++ では参照先のオブジェクトに対して代入演算子が呼ばれると言いましたが、この動作と同じようなことを JavaScript でやってみましょう。&#xD;
&lt;/p&gt;&#xD;
&lt;pre&gt;&#xD;
// __GooglePrettify__&#xD;
function assign(that){&#xD;
    if (this === that) return this;&#xD;
&#xD;
    for (var i in that) if (that.hasOwnProperty(i)) {&#xD;
        this[i] = that[i];&#xD;
    }&#xD;
    return this;&#xD;
}&#xD;
&#xD;
function func1_(a) {&#xD;
    a.assign = assign; // Assign method を生やして...&#xD;
    a.assign({hoge: 2});&#xD;
}&#xD;
var b = {hoge: 1};&#xD;
func1_(b);&#xD;
print(b.hoge); // =&amp;gt; 2&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;&#xD;
この様に、ちゃんと値が書き変わりました。&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
おわり。(続編は有りません。)&#xD;
&lt;/p&gt;&#xD;
&#xD;
参考文献&#xD;
&lt;ul&gt;&#xD;
    &lt;li&gt;&#xD;
    &lt;a href="http://www.amazon.co.jp/o/ASIN/4894714515/f99aq-22/ref=nosim"&gt;Effective C++ 原著第3版&lt;/a&gt;&lt;br&gt;&#xD;
    私はこれで C++ を学びました ;) 持ってるのは改訂第2版だけど。&#xD;
    &lt;/li&gt;&#xD;
    &lt;li&gt;&#xD;
    &lt;a href="http://www.amazon.co.jp/o/ASIN/4894714760/f99aq-22/ref=nosim"&gt;新訂版 More Effective C++&lt;/a&gt;&lt;br&gt;&#xD;
    私はこれ(ry こっちも、新訂版は持ってない!&#xD;
    &lt;/li&gt;&#xD;
    &lt;li&gt;&#xD;
    &lt;a href="http://www.amazon.co.jp/o/ASIN/4894714108/f99aq-22/ref=nosim"&gt;Effective STL—STLを効果的に使いこなす50の鉄則&lt;/a&gt;&lt;br&gt;&#xD;
    3 冊セットということで、ついでに。&#xD;
    &lt;/li&gt;&#xD;
    &lt;li&gt;&#xD;
    &lt;a href="http://www.amazon.co.jp/o/ASIN/4873113296/f99aq-22/ref=nosim"&gt;JavaScript 第5版&lt;/a&gt;&lt;br&gt;&#xD;
    JavaScript といえば、この本。&#xD;
    &lt;/li&gt;&#xD;
    &lt;li&gt;&#xD;
    &lt;a href="http://www.amazon.co.jp/o/ASIN/4873113911/f99aq-22/ref=nosim"&gt;JavaScript: The Good Parts —「良いパーツ」によるベストプラクティス&lt;/a&gt;&lt;br&gt;&#xD;
    JavaScript での Effective C++ 的な本。(だと個人的に思う。)&#xD;
    &lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
		&lt;/div&gt;</content></entry><entry><title type="html">GooglePrettify でシンタックスハイライトするようにしてみた</title><link rel="alternate" type="text/html" href="http://blog.f99aq8ove.net/archive/2009/05/1241350752.html" /><category term="JavaScript" /><author><name>◆F99a.q8oVE</name></author><updated>2009-05-03T04:39:12-07:00</updated><id>tag:blog.f99aq8ove.net,2009-05-03:/archive/2009/05/1241350752.html</id><content type="html">&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
			&lt;p&gt;&#xD;
組み込むのは簡単だった。&lt;br&gt;&#xD;
&lt;a href="http://steps.dodgson.org/"&gt;steps to phantasien&lt;/a&gt; インスパイアで、__GooglePrettify__ を埋め込んだ &amp;lt;pre&amp;gt;&#xD;
対象にしてみた。こうしておくと、FeedReader で読んでる人への目印(?)になる。&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
これら CSS と JavaScript をロードしておいて、&#xD;
&lt;/p&gt;&#xD;
&lt;pre&gt;&#xD;
&amp;lt;!-- __GooglePrettify__ --&amp;gt;&#xD;
&amp;lt;link rel="stylesheet" type="text/css" href="http://google-code-prettify.googlecode.com/svn/trunk/src/prettify.css" /&amp;gt;&#xD;
&#xD;
&amp;lt;script type="text/JavaScript" src="http://www.google.com/jsapi"&amp;gt;&amp;lt;/script&amp;gt;&#xD;
&amp;lt;script type="text/JavaScript" src="http://google-code-prettify.googlecode.com/svn/trunk/src/prettify.js"&amp;gt;&amp;lt;/script&amp;gt;&#xD;
&lt;/pre&gt;&#xD;
&#xD;
こんなのを実行するようにしておく。&#xD;
&lt;pre&gt;&#xD;
// __GooglePrettify__&#xD;
(function(){&#xD;
        // jQuery をロードして…&#xD;
        google.load("jquery", "1");&#xD;
&#xD;
        // コールバックは google.setOnLoadCallback で指定&#xD;
        google.setOnLoadCallback(function(){&#xD;
            // __GooglePrettify__ を含む &amp;lt;pre&amp;gt; の class に prettyprint を指定して、__GooglePrettify__ の行を取り除く&#xD;
            $("pre:contains('__GooglePrettify__')").addClass("prettyprint").each(function(i, elm){&#xD;
                    elm.innerHTML = elm.innerHTML.replace(/^.*?__GooglePrettify__.*?\n/, "");&#xD;
                    $(this).css("background-color", "white");&#xD;
                });&#xD;
&#xD;
            // prettyPrint!!&#xD;
            prettyPrint();&#xD;
        });&#xD;
    })();&#xD;
&lt;/pre&gt;&#xD;
		&lt;/div&gt;</content></entry><entry><title type="html">GooglePrettify のテスト</title><link rel="alternate" type="text/html" href="http://blog.f99aq8ove.net/archive/2009/04/1240754481.html" /><category term="C" /><author><name>◆F99a.q8oVE</name></author><updated>2009-04-26T07:01:21-07:00</updated><id>tag:blog.f99aq8ove.net,2009-04-26:/archive/2009/04/1240754481.html</id><content type="html">&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
			すいません。ちょっとテストしますよ。。。&#xD;
&lt;pre&gt;&#xD;
/* __GooglePrettify__ */&#xD;
#include &amp;lt;stdio.h&amp;gt;&#xD;
&#xD;
int main(void) {&#xD;
    printf("Hello world!\n");&#xD;
    return 0;&#xD;
}&#xD;
&lt;/pre&gt;&#xD;
		&lt;/div&gt;</content></entry><entry><title type="html">ZFS で snapshot をローテーションしながら取得していく script</title><link rel="alternate" type="text/html" href="http://blog.f99aq8ove.net/archive/2009/02/1233759024.html" /><category term="ZFS" /><author><name>◆F99a.q8oVE</name></author><updated>2009-02-04T06:50:24-08:00</updated><id>tag:blog.f99aq8ove.net,2009-02-04:/archive/2009/02/1233759024.html</id><content type="html">&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
			&lt;p&gt;&#xD;
ZFS で、際限なく延々と snapshot をとるのではなく、古い snapshot は自動で消したいよね、というモチベーション。&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
そこで、こんな script を書いてみた。(自己の責任にてご利用ください。)&#xD;
&lt;/p&gt;&#xD;
&#xD;
&lt;script src="http://gist.github.com/58114.js"&gt;&lt;/script&gt;&#xD;
&#xD;
&lt;p&gt;&#xD;
以下のように crontab に書いておくと…&#xD;
&lt;/p&gt;&#xD;
&lt;pre class="syntax-highlight"&gt;&lt;span class="synSpecial"&gt;@daily&lt;/span&gt;   &lt;span class="synStatement"&gt;/root/bin/zfs_snapshot.sh tank days_later   7  recursive&lt;/span&gt;&#xD;
&lt;span class="synSpecial"&gt;@weekly&lt;/span&gt;  &lt;span class="synStatement"&gt;/root/bin/zfs_snapshot.sh tank weeks_later  5  recursive&lt;/span&gt;&#xD;
&lt;span class="synSpecial"&gt;@monthly&lt;/span&gt; &lt;span class="synStatement"&gt;/root/bin/zfs_snapshot.sh tank months_later 12 recursive&lt;/span&gt;&#xD;
&lt;span class="synSpecial"&gt;@yearly&lt;/span&gt;  &lt;span class="synStatement"&gt;/root/bin/zfs_snapshot.sh tank years_later  10 recursive&lt;/span&gt;&#xD;
&lt;/pre&gt;&#xD;
&#xD;
&lt;p&gt;&#xD;
このような感じで、今日 0days_later だった snapshot が明日には 1days_later ... というふうにローテーションしていきます。&#xD;
&lt;/p&gt;&#xD;
&#xD;
&lt;pre&gt;tank/usr                                    5.23G   137G  2.64G  /usr&#xD;
tank/usr@0weeks_later                           0      -  2.57G  -&#xD;
tank/usr@0months_later                          0      -  2.57G  -&#xD;
tank/usr@3days_later                        29.5K      -  2.57G  -&#xD;
tank/usr@2days_later                        6.22M      -  2.59G  -&#xD;
tank/usr@1days_later                        6.16M      -  2.59G  -&#xD;
tank/usr@0days_later                        6.16M      -  2.59G  -&#xD;
&lt;/pre&gt;&#xD;
&#xD;
&lt;p&gt;&#xD;
既知の問題&#xD;
&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;snapshot が規定数に達していない場合は、zfs destroy, zfs rename がエラーになる&lt;/li&gt;&#xD;
&lt;li&gt;コメントの英語が変&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
		&lt;/div&gt;</content></entry><entry><title type="html">TypePad Connect でコメント欄をつけてみた</title><link rel="alternate" type="text/html" href="http://blog.f99aq8ove.net/archive/2009/02/1233495676.html" /><category term="web" /><author><name>◆F99a.q8oVE</name></author><updated>2009-02-01T05:41:16-08:00</updated><id>tag:blog.f99aq8ove.net,2009-02-01:/archive/2009/02/1233495676.html</id><content type="html">&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
			&lt;ul&gt;&#xD;
&lt;li&gt;&lt;a href="http://www.movabletype.jp/blog/typepad_connect_beta.html"&gt;TypePad Connect Beta を開始 | MovableType.jp&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;a href="http://www.typepad.com/connect/"&gt;TypePad - TypePad Connect Beta - Home&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;&#xD;
ということで、つけてみた。↓の方参照。&#xD;
&lt;/p&gt;&#xD;
		&lt;/div&gt;</content></entry><entry><title type="html">perl で seq を実装してみた</title><link rel="alternate" type="text/html" href="http://blog.f99aq8ove.net/archive/2008/08/1218565761.html" /><category term="perl" /><author><name>◆F99a.q8oVE</name></author><updated>2008-08-12T11:29:21-07:00</updated><id>tag:blog.f99aq8ove.net,2008-08-13:/archive/2008/08/1218565761.html</id><content type="html">&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
			&lt;p&gt;&#xD;
この前は &lt;a href="http://blog.f99aq8ove.net/archive/2008/08/1217763880.html"&gt;mktemp&lt;/a&gt; を書いてましたが、今度は seq を書いてみました。&#xD;
seq は、shell script でループを書く時によく使ってます。&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
勉強ということで、Test::Base を使ってみたり、コードは gist に貼ってみたり...。&#xD;
しかし、これだと feed reader 上で直接コードが読めないところが難点かな。&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
(ref: &lt;a href="http://gihyo.jp/dev/feature/01/test-perl/0002"&gt;Happy Testing Perl:第 2 回 Test::Base の紹介|gihyo.jp ... 技術評論社&lt;/a&gt;)&#xD;
&lt;/p&gt;&#xD;
&lt;a href="http://gist.github.com/5103"&gt;gist: 5103 — GitHub&lt;/a&gt;&#xD;
&lt;script src="http://gist.github.com/5103.js"&gt;&lt;/script&gt;&#xD;
		&lt;/div&gt;</content></entry></feed>

