2011年10月27日木曜日

あるー日♪homwbrewをupdateしたらエラーがでよった。

あるー日♪homwbrewをupdateしたらエラーがでよった。

追記

検索したらhttps://github.com/mxcl/homebrew/issues/2906で対処方法が書いてあった。

対処

ううむ。とりあえず以下のようにして対処。
sudo chown -R `whoami` /usr/local
cd /usr/local
git stash
git reset --hard
brew update
git stash
sudo chown -R root /usr/local
git stash clear

出たエラー

$ brew update
remote: Counting objects: 6067, done.
remote: Compressing objects: 100% (2320/2320), done.
remote: Total 5519 (delta 4066), reused 4343 (delta 3138)
Receiving objects: 100% (5519/5519), 906.93 KiB | 274 KiB/s, done.
Resolving deltas: 100% (4066/4066), completed with 437 local objects.
From http://github.com/mxcl/homebrew
* branch            master     -> FETCH_HEAD
error: unable to unlink old '.gitignore' (Permission denied)
Updating 8e52cfa..d34a131
Error: Failed while executing git pull http://github.com/mxcl/homebrew.git master
Permisson deniedというのでsudoしたらエラーがでよった。
$ sudo brew update
From https://github.com/mxcl/homebrew
* [new branch]      master     -> origin/master
error: Your local changes to the following files would be overwritten by merge:
Library/Contributions/brew_bash_completion.sh
Library/Contributions/brew_zsh_completion.zsh
Library/Contributions/examples/brew-bottle.rb
Library/Contributions/examples/brew-missing.rb
Library/Contributions/examples/brew-pull.rb
Library/Contributions/examples/brew-server
Library/Contributions/examples/brew-unpack.rb
Library/Contributions/manpages/brew.1.md
Library/Formula/a2ps.rb
Library/Formula/aamath.rb
Library/Formula/ack.rb
Library/Formula/activemq.rb
Library/Formula/adns.rb
Library/Formula/android-ndk.rb
Library/Formula/android-sdk.rb
Library/Formula/ansifilter.rb
Library/Formula/antlr.rb
Library/Formula/aplus.rb
Library/Formula/app-engine-java-sdk.rb
Library/Formula/aqbanking.rb
Library/Formula/aria2.rb
Library/Formula/arm.rb
Library/Formula/asciidoc.rb
Library/Formula/aspell.rb
Library/Formula/asymptote.rb
Library/Formula/atf.rb
Library/Formula/atk.rb
Library/Formula/atlassian-plugin-sdk.rb
Library/Formula/atomicparsley.rb
Library/Formula/audiofile.rb
Library/Formula/authexec.rb
Library/Formula/autoconf-archive.rb
Library/Formula/autogen.rb
Library/Formula/autojump.rb
Library/Formula/avrdude.rb
Library/Formula/aws-cfn-tools.rb
Library/Formula/bagit.rb
Library/Formula/bash-completion.rb
Library/Formula/bash.rb
Library/Formula/bazaar.rb
Library/Formula/bdw-gc.rb
Library/Formula/beanstalk.rb
Library/Formula/bedtools.rb
Library/Formula/binutils.rb
Library/Formula/bmon.rb
Library/Formula/boost.rb
Library/Formula/botan.rb
Library/Formula/bulk_extractor.rb
Library/Formula/bullet.rb
Library/Formula/bwa.rb
Library/Formula/byobu.rb
Library/Formula/c-ares.rb
Library/Formula/cabal-install.rb
Library/Formula/cairo.rb
Library/Formula/cassandra.rb
Library/Formula/ccache.rb
Library/Formula/cdecl.rb
Library/Formula/cdparanoia.rb
Library/Formula/cfitsio.rb
Library/Formula/cflow.rb
Library/Formula/cherokee.rb
Library/Formula/chocolate-doom.rb
Library/Formula/chromedriver.rb
Library/Formula/class-dump.rb
Library/Formula/clisp.rb
Library/Formula/cliweather.rb
Library/Formula/clojure-contrib.rb
Library/Formula/clojure.rb
Library/Formula/cmake.rb
Library/Formula/cmigemo.rb
Library/Formula/coda-cli.rb
Library/Formula/color-code.rb
Library/Formula/coreutils.rb
Library/Formula/couchdb-lucene.rb
Library/Formula/couchdb.rb
Library/Formula/cppcheck.rb
Library/Formula/cppdom.rb
Library/Formula/cppunit.rb
Library/Formula/csshx.rb
Library/Formula/csstidy.rb
Library/Formula/csv-fix.rb
Library/Formula/cufflinks.rb
Library/Formula/curl.rb
Library/Formula/d-bus.rb
Library/Formula/dash.rb
Library/Formula/dcmtk.rb
Library/Formula/dcraw.rb
Library/Formula/ddclient.rb
Library/Formula/ddrescue.rb
Library/Formula/deja-gnu.rb
Library/Formula/dialog.rb
Library/Formula/diction.rb
Library/Formula/diffpdf.rb
Library/Formula/direnv.rb
Library/Formula/discount.rb
Library/Formula/djmount.rb
Library/Formula/djview4.rb
Library/Formula/dmd.rb
Library/Formula/dnsmasq.rb
Library/Formula/dos2unix.rb
Library/Formula/dotless.rb
Library/Formula/dovecot.rb
Library/Formula/doxygen.rb
Library/Formula/duplicity.rb
Library/Formula/dvtm.rb
Library/Formula/easy-tag.rb
Library/Formula/ec2-api-tools.rb
Library/Formula/eigen.rb
Library/Formula/ejabberd.rb
Library/Formula/elasticsearch.rb
Library/Formula/elb-tools.rb
Library/Formula/elinks.rb
Library/Formula/emacs.rb
Library/Formula/encfs.rb
Library/Formula/erlang.rb
Library/Formula/esniper.rb
Library/Formula/exiftool.rb
Library/Formula/exult.rb
Library/Formula/fantom.rb
Library/Formula/feh.rb
Library/Formula/fex.rb
Library/Formula/ffmpeg.rb
Library/Formula/ffmpegthumbnailer.rb
Library/Formula/fftw.rb
Library/Formula/figlet.rb
Library/Formula/findutils.rb
Library/Formula/fio.rb
Library/Formula/fltk.rb
Library/Formula/fossil.rb
Library/Formula/freetds.rb
Library/Formula/frink.rb
Library/Formula/ftimes.rb
Library/Formula/gauche.rb
Library/Formula/gawk.rb
Library/Formula/gcal.rb
Library/Formula/gd.rb
Library/Formula/gdal.rb
Lib
error: The following untracked working tree files would be overwritten by merge:
Library/Aliases/boehmgc
Library/Aliases/dwarffortress
Library/Aliases/gjstest
Library/Aliases/libnettle
Library/Aliases/mediainfo
Library/Aliases/unix2dos
Library/Aliases/xmlsec1
Library/Contributions/examples/brew-mirror-check.rb
Library/Formula/aespipe.rb
Library/Formula/aimage.rb
Library/Formula/amap.rb
Library/Formula/anttweakbar.rb
Library/Formula/apiextractor.rb
Library/Formula/apktool.rb
Library/Formula/apparix.rb
Library/Formula/armadillo.rb
Library/Formula/asciitex.rb
Library/Formula/assimp.rb
Library/Formula/auctex.rb
Library/Formula/augeas.rb
Library/Formula/avra.rb
Library/Formula/aws-elasticache.rb
Library/Formula/bbcp.rb
Library/Formula/bonnie++.rb
Library/Formula/cast.rb
Library/Formula/cfengine.rb
Library/Formula/chkrootkit.rb
Library/Formula/cminpack.rb
Library/Formula/convertlit.rb
Library/Formula/cpputest.rb
Library/Formula/cssembed.rb
Library/Formula/csup.rb
Library/Formula/csvprintf.rb
Library/Formula/cunit.rb
Library/Formula/curlpp.rb
Library/Formula/daq.rb
Library/Formula/dc3dd.rb
Library/Formula/ddd.rb
Library/Formula/denyhosts.rb
Library/Formula/dfu-util.rb
Library/Formula/djvu2pdf.rb
Library/Formula/dsocks.rb
Library/Formula/dwarf-fortress.rb
Library/Formula/figtoipe.rb
Library/Formula/flann.rb
Library/Formula/fuse4x-kext.rb
Library/Formula/fuse4x.rb
Library/Formula/gearman-php.rb
Library/Formula/generatorrunner.rb
Library/Formula/ggobi.rb
Library/Formula/git-url-sub.rb
Library/Formula/google-js-test.rb
Library/Formula/grads.rb
Library/Formula/graylog2-server.rb
Library/Formula/gremlin.rb
Library/Formula/growly.rb
Library/Formula/gsutil.rb
Library/Formula/gv.rb
Library/Formula/herrie.rb
Library/Formula/hexedit.rb
Library/Formula/hmmer.rb
Library/Formula/httpry.rb
Library/Formula/idutils.rb
Library/Formula/imake.rb
Library/Formula/ipopt.rb
Library/Formula/ipv6calc.rb
Library/Formula/iso-codes.rb
Library/Formula/jbig2dec.rb
Library/Formula/jbig2enc.rb
Library/Formula/jbigkit.rb
Library/Formula/jp2a.rb
Library/Formula/js-test-driver.rb
Library/Formula/jscoverage.rb
Library/Formula/jsonpp.rb
Library/Formula/kbtin.rb
Library/Formula/kdiff3.rb
Library/Formula/libflowmanager.rb
Library/Formula/libmp3splt.rb
Library/Formula/libraw.rb
Library/Formula/libtommath.rb
Library/Formula/libunique.rb
Library/Formula/libutf.rb
Library/Formula/libxmlsec1.rb
Library/Formula/libxslt.rb
Library/Formula/libyubikey.rb
Library/Formula/liquibase.rb
Library/Formula/minised.rb
Library/Formula/montage.rb
Library/Formula/mp3splt.rb
Library/Formula/mupdf.rb
Library/Formula/mysql++.rb
Library/Formula/mysql-connector-c++.rb
Library/Formula/neo4j.rb
Library/Formula/nettle.rb
Library/Formula/nss.rb
Library/Formula/ntfs-3g.rb
Library/Formula/ntl.rb
Library/Formula/opencc.rb
Library/Formula/openmeeg.rb
Library/Formula/p11-kit.rb
Library/Formula/parmetis.rb
Library/Formula/pdfgrep.rb
Library/Formula/peg-markdown.rb
Library/Formula/pngwriter.rb
Library/Formula/podofo.rb
Library/Formula/pyqwt.rb
Library/Formula/pyside-tools.rb
Library/Formula/pyside.rb
Library/Formula/qfits.rb
Library/Formula/qi.rb
Library/Formula/qprint.rb
Library/Formula/rbenv-gemset.rb
Library/Formula/robodoc.rb
Library/Formula/rsyslog.rb
Library/Formula/ruby-build.rb
Library/Formula/s3fs.rb
Library/Formula/saga-core.rb
Library/Formula/salt.rb
Library/Formula/sc68.rb
Library/Formula/scotch.rb
Library/Formula/sersniff.rb
Library/Formula/shen.rb
Library/Formula/shiboken.rb
Library/Formula/sisc-scheme.rb
Library/Formula/snort.rb
Library/Formula/solid.rb
Library/Formula/spiped.rb
Library/Formula/sshfs.rb
Library/Formula/sslscan.rb
Library/Formula/star.rb
Library/Formula/stress.rb
Library/Formula/synfigstudio.rb
Library/Formula/tinyfugue.rb
Library/Formula/topgit.rb
Library/Formula/transmission.rb
Library/Formula/tup.rb
Library/Formula/udis86.rb
Library/Formula/udns.rb
Library/Formula/unifdef.rb
Library/Formula/unrtf.rb
Library/Formula/whatmask.rb
Library/F
Updating 8e52cfa..d34a131
Aborting
Error: Failed while executing git pull  origin refs/heads/master:refs/remotes/origin/master

2011年10月18日火曜日

jQuery templatesを利用して元のHTMLにテンプレート用のタグをできるだけ入れないようにしてみた

jQuery templatesを利用して、支給されたhtmlにデータを動的に適用します。

方針

  • できる限りもとのHTMLをいじらない
  • 動的に変更されるデータ部分に適用されているサンプルデータを消さない
  • テンプレート部分は外だしする

説明

こんな感じのHTMLがデザイナさんから提供されたとします。
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  </head>
  <body>
    <h1>sample</h1>
    <h2>リスト</h2>
    <ol id="result-list">
        <li><b>鈴木(30)</b>:女性</li>
        <li><b>安藤(20)</b>:男性</li>
    </ol>
    
    <hr/>
    
    <h2>テーブル</h2>
    <table>
        <thead>
            <tr>
                <th>name</th>
                <th>age</th>
                <th>sex</th>
            </tr>
        </thead>
        <tbody id="result-table">
            <tr>
                <td>鈴木</td>
                <td>30</td>
                <td>女性</td>
            </tr>
            <tr>
                <td>安藤</td>
                <td>20</td>
                <td>男性</td>
            </tr>
        </tbody>
    </table>
  </body>
</html>

動的に変更される部分の確認

サンプルでデータが入っていますが、動的に変更される箇所が2カ所あります。

<li><b>鈴木(30)</b>:女性</li>
<li><b>安藤(20)</b>:男性</li>

<tr>
    <td>鈴木</td>
    <td>30</td>
    <td>女性</td>
</tr>
<tr>
    <td>安藤</td>
    <td>20</td>
    <td>男性</td>
</tr>

テンプレート化

では、この部分をテンプレート化します。項目は三つで「名前」「年齢」「性別」なので、単純に「${変数名}」として置き換えます。

<li><b>${name}(${age})</b>:${sex}</li>

<tr><td>${name}</td><td>${age}</td><td>${sex}</td></tr>

jQuery.templatesを利用してテンプレートをコードとして格納する

$.template(name, template)というメソッドを使って$.templateというmapに先ほど作成したテンプレートを格納します。
$.templateというmapにnameがkeyでtemplateがvalueとして格納されます。mapなので、$.template["name"]でtemplateが参照できます。

先ほどのHTMLで動的に変更される部分にidがついていたので、それをそのままtemplate名としてしまいましょう。

index.template.js
$(function(){
    $.template(
        "result-list", 
        "<li><b>${name}(${age})</b>:${sex}</li>"
    );
    
    $.template(
        "result-table", 
        "<tr><td>${name}</td><td>${age}</td><td>${sex}</td></tr>"
    );
});

元のhtmlにjQuery、jQuery templates、自作のテンプレートを読み込ませる

今回はjQueryとjQuery templatesを利用するのでheadで読み込ませます。先ほど作成したindex.template.jsも読み込ませておきます

この時点では以下の通りです。

<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.4/jquery.min.js"></script>
    <script type="text/javascript" src="http://ajax.aspnetcdn.com/ajax/jquery.templates/beta1/jquery.tmpl.min.js"></script>    
    <script type="text/javascript" src="index.template.js"></script>    
  </head>
  <body>
    <h1>sample</h1>
    <h2>リスト</h2>
    <ol id="result-list">
        <li><b>鈴木(30)</b>:女性</li>
        <li><b>安藤(20)</b>:男性</li>
    </ol>
    
    <hr/>
    
    <h2>テーブル</h2>
    <table>
        <thead>
            <tr>
                <th>name</th>
                <th>age</th>
                <th>sex</th>
            </tr>
        </thead>
        <tbody id="result-table">
            <tr>
                <td>鈴木</td>
                <td>30</td>
                <td>女性</td>
            </tr>
            <tr>
                <td>安藤</td>
                <td>20</td>
                <td>男性</td>
            </tr>
        </tbody>
    </table>
  </body>
</html>

テンプレートにデータを適用する。

とりあえず、index.jsなどとして、配列に名前、年齢、性別を持ったオブジェクトを詰めておきます。実際にはajaxアクセスなどして取得したjsonとかを詰めることになると思います。
$.tmpl(template, data)でtemplateにdataが反映されるので、適用したいtargetにappendToすることで反映されます。
サンプルデータが入っているので、最初に空にしてから反映するというメソッドにしています。

index.js
$(function() {    
    var data = [
        { name:"鈴木", age:20, sex:"男性" },
        { name:"田中", age:50, sex:"女性" },
        { name:"齋藤", age:35, sex:"週二回" },
    ];
    
    var appendTemplate = function(template, target){
        $(target).empty();
        $.tmpl(template, data).appendTo(target);            
    }

    appendTemplate("result-list","#result-list");      
    appendTemplate("result-table","#result-table");
});

完成品はgitHubに上げてあります。JavaScriptを無効にすると元々のサンプルデータが入った状態になります。

2011年8月14日日曜日

アルクの英辞郎をalfredからすげー簡単にひく。

専門用語などを翻訳家さんたちがよってたかって追加しているアルクの英辞郎 on Webをalfredから楽にひける方法です。

ここをクリックしてね

これでalfredに登録されます。使い方は「alc 検索語」です。

alfredですげー楽に辞書を引く

alfredというランチャを使っているのですが、ランチャの起動キーショートカットは他とかぶるのがいやなのでコマンドキーのダブルタップに設定しています。で、開発中にメソッド名やプロパティ名を考えるために英和が引きたいとかいうときがありますよね?そういうときにalfredのダイアログで「define 検索語」でMacに搭載されている辞書がひけます。つまり…。
  1. コマンドキーダブルタップ
  2. defiくらいまで入力してtabで保管
  3. 検索したい単語を入力
これだけで辞書がひけます。便利。

2011年8月3日水曜日

Macの開発環境のセットアップ

書きかけ。

@ebc_2in2crcさんが「MacBook Air買ったひゃっほーい。でもなにから手を付ければいいかわからないんだぜ?」状態になっていました。煽った責任は全く感じていないのですが、セットアップ関係についてちょっとメモしておきます。

開発環境

まず、ターミナルを起動します。

/アプリケーション/ユーティリティ/ターミナル

ターミナルを起動するとbashが待っているので、普通にunixのコマンド群で操作できます。

Javaランタイムのインストール

ターミナルでjavaと打つと、javaランタイムが入っていなければインストーラが起動します。

$ java

Xcodeのインストール

gccなどのコンパイラなどは標準でインストールされていません。Appleの提供するXcodeという開発環境をインストールすると一緒にインストールされるため、Xcodeをインストールします。

App Storeの起動

/アプリケーション/App Store

apple IDでサインインすることが必要です。

アプリケーションの購入(無料アプリもありますが)に利用しますので、さくっと作成してしまいましょう。
サインインした後は右上の検索フィールドにXcodeを入力すれば、検索結果にXcodeが出てきますので、インストールしてください。

XcodeはApp Storeでインストールしても、インストールされるのはインストーラなので、ダウンロードが完了したら「/アプリケーション/install Xcode」を起動してください。この際にiTunesが起動しとりますがな、とエラーが出た場合は、iTunesを終了して、さらに「/アプリケーション/ユーティリティ/アクティビティモニタ」を起動して、右上の検索フィールドに「iTunes」と入力するとiTunes Helperがヒットするので、これも終了してください。

homebrewのインストール

homebrewはmacのパッケージ管理ツールです。

標準でインストールされていないアプリケーションや最新バージョンを利用したいとか標準ではついていないオプションでビルドしたいなどの場合に利用します。gccなど開発ツールを使用するので、Xcodeを先にインストールしておくこと。

インストール方法

$ ruby -e "$(curl -fsSL https://gist.github.com/raw/323731/install_homebrew.rb)"

インストールが完了したらbrew updateしておきましょう。

$ brew update

homebrewでインストールするためのレシピはfomulaと呼ばれています。どんなfomulaがあるか検索したい場合はsearchオプションで可能です。

$ brew search 検索文字列
$ brew search /正規表現文字列/

subversionのインストール

OS Xはデフォルトでsvnがインストールされていますが、macの文字コードの関係で日本語ファイル名の扱いに問題があります。幸い、homebrewで対策済みのsvnをインストールするオプションがあります。

$ brew install subversion --unicode-path
ちなみに、どのようなオプションがあるのかはoptionsで調べることができます。
$ brew options formula名

python3のインストール

$ brew install python3

pipのインストール

pipはpythonのツール管理ツールです。

$ sudo easy_install pip

OS Xではsuは使いません。su権限が必要な場合はsudoで実行します。

mercurialのインストール

メッセージが英語でよい場合はpipでインストールします。

$ sudo pip install mercurial

私は日本語メッセージが欲しかったのでパッケージでインストールしました。インストールされるディレクトリなどはpipと同じです。

bashの設定

普通に$HOME配下に.bash_profileを置いて設定を書きましょう。source .bash_profileで反映されます。以下は参考まで…。

export PATH=/usr/local/bin:$PATH
export HGENCODING=utf-8 # mercurial用
export LANGUAGE=ja
export LANG=ja_JP.UTF-8
export LESSCHARSET=utf-8
export EDITOR=nano
export PS1='[\t \u@\H \W]$ '

vimの設定

$HOME配下に.vimrcを置いて設定を書きましょう。私はあまりvimを使わないので日本語が利用できるくらいしか設定していません。

set enc=utf-8
set fenc=utf-8
set fencs=iso-2022-jp,euc-jp,cp932

NetBeansのニーモニックを消す

OS Xではメニューのニーモニックが不要です。これを消す方法がFaqJaMacNnemonicJaにあります。OS XのFinderはWindowsのExplorerと違ってフォルダを上書きしてしまうので、terminalでやりましょう。

NetBeansのデフォルトエンコーディングをUTF-8にする

NetBeansで作成したファイルの文字エンコーディングはShift_JISです。何かと都合が悪いのでUTF-8に変更します。

NetBeansのデフォルトエンコーディングを変更したい場合はnetbeans.conf内のnetbeans_default_optionsパラメータに-J-Dfile.encoding=UTF-8を追加

/Applications/NetBeans/NetBeans 7.0.app/Contents/Resources/NetBeans/etc/netbeans.conf

NetBeansから起動したJavaアプリケーションの文字コードをUTF-8に変更する

OS XのJDKのデフォルト文字コードはShift_JISなため、NetBeansから起動したtomcatなどのログが文字化けします。Finderから起動したアプリケーションはシェルを介さないので~/.bash_profileに_JAVA_OPTIONSを設定していても読み込まれません。~/.MacOSX/environment.plistに設定したオプションはユーザがログインした際に認識されるため、こちらに設定を書きます。SSHなどでログインした場合を考慮して~/.bash_profileにも同様の設定を行います。

~/.MacOSX/environment.plist

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
    <dict>
        <key>JAVA_HOME</key>
        <string>/System/Library/Frameworks/JavaVM.framework/Versions/1.6/Home</string>
        <key>_JAVA_OPTIONS</key>
        <string>-Dfile.encoding=UTF-8</string>
    </dict>
</plist>

~/.bash_profile

export _JAVA_OPTIONS=-Dfile.encoding=UTF-8

NetBeansのMercurialで日本語ログをコミットできるようにする

先の_JAVA_OPTIONS同様にHGENCODINGがNetBeansからでは認識されません。対処も同様に~/.MacOSX/environment.plistを編集します。dictの子に以下を追記。再ログイン後に認識されます。

<key>HGENCODING</key>
          <string>utf-8</string>

postgresqlのインストール

homebrewでさくっと。以前はビルドエラーとかあったらしいですが、今は大丈夫です。

$ brew install postgresql

MySQLのインストール

homebrewでさくっと。

$ brew install mysql

/etc/my.cnf

[mysqld]
max_allowed_packet=64M
socket = /usr/local/var/mysql/mysql.sock
character-set-server = utf8
innodb_file_per_table

[mysql]
default-character-set = utf8

[client]
socket = /usr/local/var/mysql/mysql.sock
default-character-set=utf8

操作方法あれこれ

アプリケーションがどこにあるかわからないんだぜ?

デフォルトでは「ctrl+space」で画面右上にspotlightという検索エンジンの検索条件フィールドが表示されます。インクリメンタルサーチでいろいろ探してくれます。ちなみに「ctrl+option+space」で検索ウィンドウが開きます。OS Xではシステムで日本語設定している場合、アプリケーションやシステムが表示するディレクトリなどを日本語表記にしていますが、実体は英語でのファイルパスです。そのようなファイルは日本語でも英語でも検索が可能です。例えば「アクティビティモニタ」は「activity monitor」でも検索にヒットします。

アプリケーションの中のディレクトリにアクセスする

.appはディレクトリなので、Terminalからcdでアクセスすると中に入れます。Finderでアクセスする場合は右クリックでコンテキストメニューの中の「パッケージの内容を表示」でアクセス可能です。

ライブラリフォルダがFinderに表示されない

なにかとアクセスすることが多いライブラリフォルダですが、一般ユーザへの配慮からか、OS X Lionから不可視に設定されました。可視に変更してしまいます。

可視にする

chflags nohidden ~/Library

不可視にする

chflags hidden ~/Library

TerminalのカレントディレクトリをFinderで開きたい

openコマンドで開けます。

$ open .

いろいろインストールしたアプリケーション

App Store

  • dropbox:データストレージサービスのクライアント
  • evernote:クラウド化されたメモ
  • Alfred:ランチャ
  • LimeChat:ircクライアント
  • Cornerstone:svnのGUI

単体インストーラ

  • 1password
  • MacHg:mercurialのGUI
  • CyberDuck:FTPクライアント
  • KeyRemap4MacBook:キーアサイン変更
  • Growl:いろいろ情報通知してくれる

その他の設定もろもろ

dashboardを無効にする

私はdashboardを利用しないので無効化してしまいます。

dashboardの無効化

$ defaults write com.apple.dashboard mcx-disabled -boolean YES
$ killall Dock

dashboradの有効化

$ defaults delete com.apple.dashboard mcx-disabled
$ killall Dock

Spotlightのショートカット

Ctrl + spaceがデフォルトなのですが、この組み合わせは貴重なのでoption + spaceに変更してしまいます。

locateが使いたい

$ sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.locate.plist

ファイル保存時のダイアログのデフォルトを詳細表示にする

$ defaults write -g NSNavPanelExpandedStateForSaveMode -boolean true

もとに戻す

$ defaults delete -g NSNavPanelExpandedStateForSaveMode

印刷のダイアログのデフォルトを詳細表示にする

$ defaults write -g PMPrintingExpandedStateForPrint -boolean true

もとに戻す

$ defaults delete -g PMPrintingExpandedStateForPrint

ネットワークディスクに.DS_Storeファイルを生成しないようにする

OS XではFinderのアイコンの表示情報などを.DS_Storeというファイルで生成します。これはデフォルトでは不可視で、WindowsやLinuxでは不要なファイルです。ローカルでは問題ないのですが、ネットワークディスクにアクセスした場合に他のOSからはゴミとなってしまいますので、ネットワーク上のディスクには生成しないように設定します。

defaults write com.apple.desktopservices DSDontWriteNetworkStores true

dot filesのバックアップ

.bash_profileなどのファイルは中身に機密性がない(.sshとかは別)かつ修正したら自動でバックアップされてほしいということからgithubなどのバージョン管理ではなく、DropBoxを利用してバックアップしています。

オリジナルをDropBoxのディレクトリに移動して、本来あるべき場所からシンボリックリンクを貼るだけです。

作業前にバックアップ

$ cp ~/.vim.rc ~/.vim.rc.bak
$ cp ~/.gitconfig.rc ~/.gitconfig.bak
$ cp ~/.bash_profile ~/.bash_profile.bak

DropBoxにファイルを移動

DropBoxのdotfiles配下(ディレクトリは任意)に設定ファイルを移動する。

$ mv ~/Dropbox/dotfiles/.vim.rc ~/.vim.rc
$ mv ~/Dropbox/dotfiles/.gitconfig.rc ~/.gitconfig
$ mv ~/Dropbox/dotfiles/.bash_profile ~/.bash_profile

シンボリックリンクを貼る

ln -s ~/Dropbox/dotfiles/.gitconfig .gitconfig
ln -s ~/Dropbox/dotfiles/.vimrc .vimrc
ln -s ~/Dropbox/dotfiles/.bash_profile .bash_profile

まだ続く予定。

2011年6月25日土曜日

スクラム道バーストに参加した感想&doneの定義の話

2011/06/24にスクラム道バーストに参加してきました。申し込みを忘れていたのですが、当日行けそうに無かった方のご好意で代わりに参加してきました。@ledsunさんありがとう。

内容は過去のスクラム道の再演とトピックに対する議論の場でした。詳しい内容は他の方の素晴らしいレポートがあるのでそちらをご参照くださいw

選手ってなに?ってことが良くわからないまま選手として参加してしまいましたが、壇上に上ってもそんなに緊張しないものですね。変なこと言っても殴られたりしないので、このような形式があったらどんどん選手として名乗りをあげるといいと思います。


スクラム道バーストで「doneの定義を拡大/縮小することの是非」がトピックに上がりました。思い返すとストーリーのdoneの定義なのかタスクのdoneの定義なのかがあやふやだったので、それぞれ検討しました。

結論としては、拡大するにしろ縮小するにしろ、スプリントバックログをいじるのでプロダクトオーナーの判断が必要。拡大は(こなせるのであれば)問題になることはあまりないが、縮小はリリース時期や提供価値に影響が大きいので要注意。となりました。

ストーリーの場合

ストーリーのdoneの定義を変更するのはプロダクトオーナーの承認が必要。ストーリーをスプリントバッグログにいれる判断はストーリーが提供する内容に対する判断なので、doneの定義が変わった場合はストーリーが提供する内容が変わるはずだから。

doneの定義を拡大したい場合

スプリント内で追加するタスクが達成可能かの見積もりをした上でシステムに価値が向上するかをプロダクトオーナーに確認する(ストーリーのdoneの定義が拡大するということはタスクが追加されるはず)。プロダクトオーナーはもしかすると他のストーリーをスプリントに追加したいかもしれない。

doneの定義を縮小したい場合

縮小するということはストーリーのタスクをいくつか落とすことを意味する(ストーリーのdoneの定義に影響しないならタスクはチームの判断で落としてよいが、その場合は「ストーリー」のdoneの定義の縮小にはあたらない)。タスクを落とした結果、ストーリーの提供する価値がどのように変化するのかをプロダクトオーナーに提示して判断を仰ぐ。

  • 他のストーリーのスプリントバックログから落とすことで当該ストーリーをdoneさせる
  • 当該ストーリーを落として他のストーリーに入れ替える
  • ストーリーを分割して、達成できないストーリーをプロダクトバックログにいれる
  • あるタスクがブロック要素となっている場合はスクラムマスターにブロック要素の除去を要請する

などの判断などがありそう。

タスクの場合

タスクのdoneの定義の縮小がストーリーのdoneに影響を与える場合の対処は、ストーリーのdoneの定義の縮小と同じ。ストーリーのdoneに影響を与えない場合は縮小して問題ない。この場合はタスクを分割して不要なタスクを落とすことと同義。いまは必要ないという場合は他のストーリーのタスクとする場合もある。

doneの定義を拡大したい場合

タスクの所属するストーリーがスプリント内でこなせるなら、特に問題なし。しかし、そもそものタスクのdoneの定義がdoneしたとするには弱かったのではないか?という気もする。追加でこれもやっておきたい、はタスクの追加になるのではないか。

doneの定義を縮小したい場合

縮小したとして、それはそのタスクがdoneしたと言えるのかが問題。もし言えるのであればタスクが余分なものを含んでいたということ。言えないのであれば、それは縮小したからといってdoneしたということに意味が無い。ストーリーのdoneの定義に影響を与えるので、対処はストーリーのdoneの定義の縮小と同じ。タスクをdoneできない原因の対処はもちろん必要。

2011年6月20日月曜日

勉強会に参加すること

最近、勉強会などに参加するようになりました。何故かというと、こんな悩みがありまして…。

「生きる意味ってなに?」

とりあえず、生きるということは是と仮に置きます。生きてる限りは「より良い生を送りたい」ものです。より良く生きるって自分にとってはどういうこと? 自分にとっては「自分に価値が感じられる」「誰かを(多少なりとも)幸せにしている」「(いろいろあるけど)自分の欲求が満たされている」に少しでも近づくこととしました。

  • 価値を生み出す(価値を生み出す自分には価値がある)
  • 人を愛する(愛する人を幸せにするために行動する)
  • 人に認められたり、認めたりする(承認欲求ってあるよね)

「他者との交流と自分の行動を通じて価値を作り出す」ことで実現できそうです。価値を作り出すためには能力が必要です。能力を得るにはどうしたらいいでしょうか?「学習して実践する」しかないですよね。インプットしてアウトプットしてれば自動的に能力が向上するはず。勉強会には人がいる。ということは相互活動でインプットとアウトプットができる。リソースの手当がつけば参加しない手は無いわけです。そんなわけで、都合がつけば勉強会に参加するようになったわけです。わかんなくてもできなくても得るものは必ずあるし、与えられるものは必ずあります。

Scrum Boot Camp横浜に参加した感想

6/18(土)に横浜で開催されたScrum Boot Campに参加してきました。Scrumの説明と演習でScrumへのとっかかりを体験できる勉強会です。休憩時間や懇親会でいろいろ感想を話したり、疑問点に対する意見を聞いたりできて有意義でした。以下、思ったことや感想や学んだことを雑多に書きます(あたかも最初から知っていたかのような口ぶりで書いている部分もあります)。

演習について

演習はテーブルごとに分かれてチームで行うのですが、自分のいたチームはほぼ違和感無く演習することができました。他のチームがどうだったのかに興味があったので、懇親会で別のチームの方々に感想を聞いて回ったところ、まったくうまくいかなかったチームは無いようでした。いろいろなバックグラウンドを持つ人々が初対面で演習可能というのは「Scrumの取り組みの一つ一つは誰でも可能なこと」と感じました。

勉強会に参加するということは、Scrumに興味がある、勉強しようとする意思がある、人の話を聞く気がある人が集まっている状態なので、そもそも成立する可能性が高いのは事実です。おそらく、参加者は自分の所属組織に戻って、勉強会で得たものを取り入れようとした際に相当のギャップを感じてしょんぼりするかもしれません。

感じたこと

自分を変えるのと他人を変えるのを比べると自分を変えることは自分自身の努力で可能ですが、他人を変えるのは自分の手の届かない部分が多いので、チームに導入するのは相当に難しいはずです。しかし、Scrum(じゃなくて他の開発手法でも)かどうかは、true/falseの二値で表されるのではなく、度数で表現するものなので、導入して成果が上がっている状態を想像して、その状態と現在の間を埋めていけば、ちょっとScrumからだいぶScrumに、そしてほとんどScrum、完全にScrumという風になるはず。

「うちの組織のメンバーはScrumを実施できるレベルにない」という質問がありました。確かに設計や実装、試験などのスキルの他にも「自動化されたテスト」「継続的インテグレーション」「ソフトウェア構成管理」「バグトラッキングシステム」「ペアプログラミング」「リファクタリング」「様々な活動の集計の自動化」などの様々な開発プラクティスを身につけた人々だけでチームが構成されていないとScrumできないと考えがちですが、Scrumを導入しはじめると必然的にスキルの向上や習得が必要になるはずです。これは「できるからやる」のではなく「できるようになるためにやる」そして「やるからできるようになる」と考えると良いのではないかと感じました。

Scrumにはいろんなツールがあります。プランニングポーカーとか朝会とかふりかえりとかバーンダウンチャートとか。全てのツールは可能な限り素早く最大限の価値を提供するための道具なので「何をどうする?そしてどうなった?」を明確にして「それは目的の達成に向かっているか?」を意識して取り組みたいと思います。

話は変わりますが、エリヤフ・ゴールドラット博士が亡くなりました。この人は「制約条件の理論」を生み出した人です。「制約条件の理論」というのは「システム(目的(ゴール)」を継続的に最大化するためのメソッド(といっていいのかな?管理哲学?)です。この制約条件の理論を達成するために「TOC思考プロセス」といういろいろなツールがあります。Scrumの導入のために役に立ちそうなツールが満載なので、まずは『ザ・ゴール ― 企業の究極の目的とは何か』という小説仕立ての書籍でどのようなものなのか一読することをおすすめします。

2011年5月28日土曜日

SafariのRSS FeedをOPMLに書き出してGoogle Readerにインポートする方法

手順

Thomas Tempelmann | Importing Safari's RSS feeds into Google Reader (OPML export) のDownloadからSafariFeedToOPML_1.0.2.zipをダウンロードしてきて解凍する。

  1. 自分のディスク上に新しいフォルダを作る(たとえばデスクトップ上、名前は好きにどうぞ)。このフォルダがブックマークを一時的に書き出す場所。
  2. お望みのRSSブックマークをSafariから書き出す。メニューバーの「ブックマーク」「すべてのブックマークを表示」で開いたパネルの左側に「すべてのRSS配信」があるので、好きなFeedを選んで(Command + Aで全選択)1.で作ったフォルダにDrag and Dropする。
  3. Safari Feed to OPML.appを起動して、1.のフォルダの中のファイルを全部をアプリケーションのウインドウにDropする。もしくはフォルダをDropする。アプリケーションは全てのRSSブックマークをウインドウの中にリストする。
  4. 最後に「Write OPML...」ボタンを押す。で、ファイル保存先を選ぶ。デスクトップを使うといいんじゃないかな。
  5. OPMLファイルができたので、1.でつくったフォルダは削除してもいい。
  6. このOPMLファイルをGoogle Reader(リーダー設定のインポート/エクスポートタブ)でインポートできる。

経緯

SafariのRSS購読機能を使っていたんだけど、iPhoneのSafariでは「すべてのRSSの表示」ができなくて不便だったので、Bylineというアプリを使うことにしました。このアプリはGoogle Readerに登録してあるRSSフィードをいい感じに一覧表示してくれるうえにオフライン閲覧機能があるので、電波がいまいちなSoftbank iPhoneではうれしい感じなのです。が、しかし、Safariに登録されているRSSフィードをGoogle Readerに移行するのが面倒です。Google ReaderはOPMLというファイルを通じてエクスポート/インポート可能なのですが、SafariはOPMLのエクスポートをサポートしていません。で、Google Readerのヘルプを見てみるとSafariのRSSフィードをエクスポートするシェルスクリプトもしくはAutomatorアプリがあるらしい、というので早速使ってみるが、書き出されたOPMLファイルの中身は空で書き出しに失敗してしまっています。もしかしたら英語環境に依存したパスでも書いてあるのかな、と確認したところ、「~/Library/Syndication/Database3」というファイルからデータを取り出しているのですが、Safari 5ではディレクトリ構成&データの格納方法が変わってしまっているため、もう使えない方法でした。うーん、困ったな解決方法ないかなと思いながらコメントを読んでいたら「おれ簡単な方法のアプリつくったでよ」という人がおりました。ありがたいことです。んで、さっそくその方法で試したらうまくいったんですが、英語なんで、手順をポンチ訳して載せときます。というのが経緯。

2011年5月24日火曜日

メソッドと関数の違いとthisは何を指しているか(JavaScriptの場合)

日頃、メソッドのことを関数と呼んでしまったり、関数をメソッドと呼んでしまったり混同していたりするわけですが、インスタンスの内部にあるのがメソッドです。

var objA = {};
objA.method = function(){
    console.log("method");
}
objA.method(); // これはメソッドの呼び出し

function func(){
    console.log("function");
}
func(); // これは関数の呼び出し

メソッドと関数の大きな違いの一つに「this」でインスタンスを参照できる点があります。メソッド内で「this」はインスタンスを指しています。では、関数内の「this」は何を指しているかというとグローバルオブジェクト(JavaScriptの場合)です。

ここまではよいのですが、メソッド内で関数が宣言されている場合にメソッド内で、その関数を呼び出した場合の関数内で「this」は何を指しているのでしょうか? 答えはグローバルオブジェクトです。

var hoge = "global";

var objB = {};
objB.hoge = "property";
objB.method = function(){
    var hoge = "local";
    function nestedFunction(){
        console.log("a:" + this.hoge); // グローバルのhogeを指している
    }
    console.log("b:" + hoge);  // この関数内のhogeを指している
    console.log("c:" + this.hoge); // インスタンス(つまりobjB)のhogeプロパティを指している
}

objC.method();
実行結果
a:global
b:local
c:property

2011年5月23日月曜日

やる夫で学ぶTDD epub版

twiiter id @oota_ken さんが書いた「やる夫で学ぶTDD」をepub化しました。@oota_ken さんの配布許可をご好意でいただけましたので、配布しちゃいます。


おいてある場所

YaruoDeTDD.epub

以下、iPadでのスクリーンショット

2011年5月16日月曜日

tvmobiliのuninstall方法

お試しでinstallしたのだけど、uninstall方法を調べた。tvmobiliはLaunchAgentsとLaunchDaemonsを追加するので単純にアプリケーションを削除するだけではきれいになりません。

環境

  • Snow Leopard

手順

Applications/TVMOBiLi.app/Contents/MacOS/uninstall をterminalで実行するだけ。

JavaScriptでcallbackに引数を与えたい。

やりたいこと

JavaScriptのcallbackに引数を使いたい。

方法

callbackのmethodが関数オブジェクトを返すようにする。


説明

たとえばjQueryで以下のようなコードを書いてもうまくいきません。

    var callbackMethod1 = function(target){
        target.slideDown(1000);
    }

    $("#div0").slideUp(1000, callbackMethod1($("#div0")));

しかし、以下は動作します。

    var callbackMethod2 = function(){
            $("#div1").slideDown(1000);
    }

    $("#div1").slideUp(1000, callbackMethod2);

callbackMethod1のslideDownをfadeOutに変更して実行してみると、slideUpと同時にfadeOutしているのが確認できます。つまり、slideUpの動作が完了してからcallbackMethod1が呼ばれているのではなく、ほぼ同時に動作してしまっています。つまり、引数つきのcallbackをslideUpに渡す時点で、callbackMethod1を実行しまっているということです。

callbackMethod2はcallbackMethod2の参照を渡しているので、callbackをslideUpに渡す時点では実行されず、動作完了後にslideUpがcallbackMethod2を実行します。

引数を取るメソッドが関数オブジェクトを返すようにすることで意図通り動作させることができます。

    var callbackMethod3 = function(target){
        return function(){
            target.slideDown(1000);
        }
    }

    $("#div2").slideUp(1000, callbackMethod3($("#div2")));

callbackでの処理がその箇所でしか使用しない場合は単に以下のように無名関数で書くとよいでしょう。

    $("#div3").slideUp(1000, function(){
        $("#div3").slideDown(1000);
    });

2011年5月6日金曜日

Effective JavaScriptをepubにしてみた。

Effective JavaScriptをPDFにしました - renoivのブログを見て、これはいいなぁと思ったので、epubにしてみた。もともと書いた方はexealさんなので、メタ情報のauthorをexealさんにしてあります。


おいてある場所

Effective JavaScript epub ver

以下、iPadとiPhoneのiBooksでのスクリーンショット



OmegaTでstardict形式の辞書が読み込めないのはjdk1.6のバグです

twitterでつぶやいてたら@brandeluneさんが「ログ見た?」と質問してくれたおかげで問題が解決しました。そもそもOmegaT自体がJRE同梱版を利用することを推奨してたのを見落としていたのですが、同梱版を利用する以外の解決方法です。


どういう問題?

.dict, .idx, .ifoの3ファイルをdictionaryディレクトリに格納しても、OmegaTが辞書を読み込んでくれない。


判断基準は?

ターミナルでコマンドラインから起動するとログがターミナル上に流れます。OmegaTのプロジェクトを開いた際に以下のエラーが発生していればこの問題だと思われます。

Error load dictionary from '★OmegaTのプロジェクトファイルのpath★/dictionary/辞書ファイルの名称.ifo': invalid literal/length code

回避方法

jdk1.5もしくはjdk1.7で実行する。Java Preferencesで使用するjdkのバージョンを変更するかフルパスで指定して実行

/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Home/bin/java -jar /Applications/OmegaT.app/Contents/Resources/Java/OmegaT.jar

なぜ?

jdk1.6.0_24のバグです。http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7028902を参照


環境

  • Mac OS X Snow Leopard
  • jdk1.6.0_24

参考

SnowLopardにjdk1.5をインストールする方法
http://wiki.oneswarm.org/index.php/OS_X_10.6_Snow_Leopard
ターミナルからOmegaTを実行する方法(pathは各自読み替えて)
java -jar /Applications/OmegaT.app/Contents/Resources/Java/OmegaT.jar

2011年5月3日火曜日

NetBeansを-Dfile.encoding=UTF-8で利用している場合にFindBugsの警告が文字化けしちゃうのを直す

やりたいこと

NetBeansでFindBugsの警告が文字化けするのを直したい。


なぜ?

読めん。


環境

  • Mac OS X Snow Leopard
  • NetBeans 7.0

原因

どうやら日本語メッセージがSJISで保存されている


方法

  1. /Applications/NetBeans/NetBeans 7.0.app/Contents/Resources/NetBeans/sqe1/modules/extにfindbugs.jarが入っているので、デスクトップにコピー
  2. jar xvf findbugs.jarとかやって解凍
  3. messages_ja.xmlの文字エンコードをSJISからUTF-8に変換
  4. jar cvf findbugs.jar .とかやって圧縮
  5. 元あった場所に戻す

2011年4月30日土曜日

CheckStyleで自分に不要な指摘を抑制する

やりたいこと

CheckStyleで指摘されたくない項目を警告抑制する。

なぜ?

無視すると決めた警告で警告だらけになると本当に修正しないといけないものが埋もれるから

方法

TAKAHASHI, KazutakaさんがCheckstyle 日本語訳 バージョン 4.1を公開しています。感謝。

Privateなメソッドや変数とかはJavaDoc無いよって指摘されたくない。




        
            
        
        
            
        
        
            
        

いまどき一行に80文字以上書いてるって指摘されたくない。

   
     
        
            
        
  

Parameterに代入とかしてもFindBugsが指摘してくれるからfinalは必須にしたくない。


ConstructorとSetterの場合はthisで指定するのでFieldを隠しても警告しない。



        
            
            
        
     

サブクラス化できるクラスの非private、非staticのメソッドをabstract、final、空実装にするのはやや苦しい。サブクラス化が必要か不必要かの判断は初回実装中に判断しにくいので。


native2asciiはやめてXMLのプロパティを使う

やりたいこと

XML形式のプロパティが使いたい。

なぜ?

native2asciiのエンコードされた日本語文字列はメンテナンスするのが面倒なので。

環境

JDK1.5以降

説明

とくに難しいことはしていません。storeToXML()とloadFromXML()しているだけです。プロパティから値を取得したい場合はgetProperty(キー)とかしてください。PropertiesのJavaDocとかも参照のこと。

サンプルコード

streamの扱いは適当なんで、BufferedOutputStreamとかBufferedInputStream使ってください。

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Properties;

public class Application {
    
    private static final String XML_PROPERTIES_NAME = "test";
    private static final String XML_PROPERTIES_NAME_SUFFIX = ".properties.xml";
    private static final String XML_PROPERTIES_FILE_NAME = XML_PROPERTIES_NAME + XML_PROPERTIES_NAME_SUFFIX;
    private static final String XML_COMMENT = "プロパティのコメント";

    private Properties getProperties() {
        Properties properties = new Properties();
        properties.setProperty("usage", "このプログラムの使用方法");
        properties.setProperty("test", "テスト文字列");

        return properties;
    }

    private void saveProp() throws IOException {
        Properties properties = getProperties();

        OutputStream stream = new FileOutputStream(XML_PROPERTIES_FILE_NAME);
        properties.storeToXML(stream, XML_COMMENT);

        stream.close();
    }

    private void loadProp() throws IOException {
        InputStream stream = new FileInputStream("test.properties.xml");

        Properties prop = new Properties();
        prop.loadFromXML(stream);

        stream.close();

        prop.list(System.out);
    }

    /**
     * @param args the command line arguments
     * @throws IOException
     */
    public static void main(String[] args) throws IOException {
        Application app = new Application();
        app.saveProp();
        app.loadProp();
    }
}

2011年4月28日木曜日

ポモドーロ開始時にtwitterを終了する
AppleScriptで制御する
ポモドーロ完了時にtwitterを起動する
AppleScriptで制御する
ポモドーロ中に思いついたこと
Evernoteに書いて忘れる

2011年4月26日火曜日

shellからJavaScriptを気軽に実行

やりたいこと

JavaScriptをシェル上で気軽に実行したい。

なぜ?

そりゃあ、今JavaScriptをおべんきょしてるので、折角だし。

環境

  • Mac OS X Snow Leopard
  • Java jdk 1.6.0(Snow Leopardに搭載されているやつ)

手順

以下のテキストファイルを/usr/local/binあたりにjsとかそんなファイル名で置く。パスが通っていればどこでもいいです。

export CLASSPATH=/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Classes/classes.jar
java com.sun.tools.script.shell.Main $*

作成したファイルに実行権限をつける。

確認

echo "println('hello world')" > test.js
js test.js

引数なしで実行すると対話型シェルが起動します

2011年4月21日木曜日

NetBeansのTomcatがどこにsessions.serを保管するか

ちょっと気になったので調べた。

環境

  • Mac OS X Snow Leopard
  • NetBeans 7.0
  • tomcat-6.0.26

結果

tomcatを終了した際に以下に保管される。起動するとメモリ上に読み込まれて削除される

/Users/ユーザ名/.netbeans/7.0/apache-tomcat-6.0.26_base/work/Catalina/localhost/_/SESSIONS.ser

2011年4月13日水曜日

GitHub用にSSH Keyを作る

やりたいこと

GitHub専用のSSH Keyを作って、他のSSH Keyと使い分ける

なぜ?

仕事用の公開鍵と共用はまずい。

環境

Mac OS X Snow Leopard

手順

Keyを生成する

# Keyが格納されているディレクトリに移動
cd ~/.ssh

# GitHub用のkeyを格納するディレクトリを作成して移動
mkdir github
cd github

# Keyの生成
ssh-keygen -t rsa -C "メールアドレス"

# ★の部分でid_rsa.github.comと入力してEnter
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/your_user_directory/.ssh/github/id_rsa):★

# パスフレーズを要求されるので、パスフレーズを指定
Enter passphrase (empty for no passphrase):★パスフレーズを入力★
Enter same passphrase again:★もいっかい同じパスフレーズを入力★

生成したKeyをConfigに記述

~/.ssh/configに以下を記述(viでもnanoでもemacsでもお好みに)

Host github
HostName github.com
IdentityFile ~/.ssh/github/id_rsa.github.com
User git

確認

# SSHで接続
ssh github

参考

  • http://help.github.com/mac-set-up-git/
  • http://d.hatena.ne.jp/superbrothers/20090730/1248971671
を参考にさせていただきました。

GitのLocal Repositoryごとに使用するユーザ情報を変更する

やりたいこと

Repositoryによってuser.nameとuser.emailを使い分ける

なぜ?

仕事用のユーザ情報とプライベートのユーザ情報は違うものを使いたい。人によってはプライベートは必要ないけど、案件によって使っているメールアドレスが違う(常駐先のメールアドレスとかね!)。

手順

#対象のLocal Repositoryに移動
cd my_local_repository

#対象のLocal Repositoryで使用するユーザ情報の設定
git config user.name "指定したいお名前"
git config user.email "指定したいメールアドレス"

確認

git config --list

2011年3月31日木曜日

Safari 5で突然RSSが取得できなくなったら(Mach error 268435460 - (ipc/send) timed out)” (NSMachErrorDomain:268435460)

アクティビティモニタを起動して「PubSubAgent」プロセスを終了させると復帰するかもしれません。

2011年3月28日月曜日

Hibernate3でhbm2java

NetBeans6.9.1で「データベースからの Hibernate のマッピングファイルと POJO」を実行するとjavaコードと.hbm.xmlが生成されますが、手を入れたhbm.xmlからjavaコードを生成する手段が見当たらなかったのでantでやりました。

build.xmlに以下を追加してhbm2javaタスクを実行。
class.pathは各自の環境にあわせてください。私はMacでNetBeansなので…。

単独のxmlに記載してbuild.xmlでimportしてもよし。
NetBeansではnbproject内のbuild-impl.xmlが実体でbuild.xmlでimportしているので。

<path id="class.path">
        <fileset dir="/Applications/NetBeans/NetBeans 6.9.1.app/Contents/Resources/NetBeans/ide/modules/ext/" includes="*.jar"/>
        <fileset dir="/Applications/NetBeans/NetBeans 6.9.1.app/Contents/Resources/NetBeans/java/ant/lib" includes="*jar"/>
        <fileset dir="/Applications/NetBeans/NetBeans 6.9.1.app/Contents/Resources/NetBeans/java/modules/ext/hibernate/" includes="*.jar" />
    </path>

    <property name="srcdir" value="${basedir}/src"/>

    <target name="hbm2java">
        <taskdef name="hibernatetool" classname="org.hibernate.tool.ant.HibernateToolTask">
            <classpath refid="class.path"/>
        </taskdef>
        <hibernatetool destdir="${srcdir}">
            <configuration configurationfile="${srcdir}/hibernate.cfg.xml">
                <fileset dir="${srcdir}">
                    <include name="**/*.hbm.xml"/>
                </fileset>
            </configuration>
            <hbm2java/>
        </hibernatetool>
    </target>

2011年3月21日月曜日

MacOSXのMySQLで日本語文字化け

文字コードをutf8にしとく。

1) /etc/my.cnf に文字コードを指定する。
存在しない場合は/usr/local/mysql/support-files/my-midium.cnfから複製

sudo cp /usr/local/mysql/support-files/my-midium.cnf /etc/my.cnf

[mysqld]以下にcharacter-set-server = utf8を追加

[mysqld]
port            = 3306
socket          = /tmp/mysql.sock
skip-external-locking
key_buffer_size = 16M
max_allowed_packet = 1M
table_open_cache = 64
sort_buffer_size = 512K
net_buffer_length = 8K
read_buffer_size = 256K
read_rnd_buffer_size = 512K
myisam_sort_buffer_size = 8M  
character-set-server = utf8 <--これ

2) MySQLを再起動
3) Consoleで確認

show variables like 'character_set%';

| Variable_name            | Value
| character_set_client     | utf8
| character_set_connection | utf8
| character_set_database   | utf8
| character_set_filesystem | binary
| character_set_results    | utf8
| character_set_server     | utf8
| character_set_system     | utf8


4) すでに作成しちゃったdatabeseの文字コードを変更する。

mysqldumpでdump&restoreするんだけど、面倒なのでNavicat for MySQL Liteでやっちゃいました。

2011年3月10日木曜日

はじめてのQT

最近twitterをはじめた。で、今日はじめてQTされた。うれしいもんですね。

2011年3月7日月曜日

Gitの洗礼を受ける

http://gitimmersion.com/index.html

1)インストール
※macportsがインストールされている前提で
sudo port install git-core
2)初期設定
$ git config --global user.name "お名前"
$ git config --global user.email "メールアドレス"
 

2011年3月6日日曜日

+演算子、StringBuilder、StringBufferの文字列連結の時間計測

(JDK1.6)+演算子、StringBuilder、StringBufferのそれぞれで文字列を連結した場合の処理時間をNetBeansのプロファイラで計測した結果。



各テストが計測に妥当かどうか(コンパイラで最適化される書き方になっているかとか理解していないので)不明ですが…。意味のあるベンチマークとか私には難しすぎるw

1回こっきりだと、いずれも大差ないですが、繰り返し処理の場合は+演算子は相当不利っぽいので、普段は+演算子を使い、パフォーマンスが問題になった際には繰り返し処理内の文字列連結を確認することにしました(もちろん最もボトルネックになっているかどうかの計測は必要ですが)。

「いやいや計測方法がおかしいだろう」とか「そのコードじゃあ計測したことにならんよ」とか優しくおしえてくださいw

以下ソース

public class NewClassTest {

    private String s1 = "a";
    private String s2 = "b";
    private int loop1 = 1000;
    private int loop2 = 10000;
  
    public NewClassTest() {
    }

    @BeforeClass
    public static void setUpClass() throws Exception {
    }

    @AfterClass
    public static void tearDownClass() throws Exception {
    }
  
    @Before
    public void setUp() {
    }
  
    @After
    public void tearDown() {
    }

    @Test
    public void test01一回プラスで連結(){
        String str = s1 + s2;
    }

    @Test
    public void test02一回StringBuffer(){
        String str = new StringBuffer(s1).append(s2).toString();
    }

    @Test
    public void test03一回StringBuilder(){
        String str = new StringBuilder(s1).append(s2).toString();
    }

    @Test
    public void test04千回プラスで連結1(){
        String str = "";
        for (int i =0; i < loop1; i++) {
            str = str + i;
        }      
    }
  
    @Test
    public void test05千回StringBuilder1(){
        String str = "";
        StringBuilder sbui = new StringBuilder(str);
        for (int i =0; i < loop1; i++) {
            sbui.append(i);
        }
        str = sbui.toString();    
    }

    @Test
    public void test06千回StringBuffer1(){
        String str = "";
        StringBuffer sbuf = new StringBuffer(str);
        for (int i =0; i < loop1; i++) {
            sbuf.append(i);
        }
        str = sbuf.toString();    
    }

    @Test
    public void test07千回プラスで連結2(){
        String s = "abcdefg";
        for (int i = 0; i < loop1; i++) {
            s += "abc"+ "def";
        }
    }
  
    @Test
    public void test08千回StringBuilder2(){
        StringBuilder sbui = new StringBuilder("abcdef");
        for (int i = 0; i < loop1; i++) {
            sbui.append("abc");
            sbui.append("def");
        }
        sbui.toString();  
    }

    @Test
    public void test09千回StringBuffer2(){
        StringBuffer sbuf = new StringBuffer("abcdef");
        for (int i = 0; i < loop1; i++) {
            sbuf.append("abc");
            sbuf.append("def");
        }
        sbuf.toString();
    }

     @Test
    public void test10一万回プラスで連結1(){
        String str = "";
        for (int i =0; i < loop2; i++) {
            str = str + i;
        }      
    }
  
    @Test
    public void test11一万回StringBuilder1(){
        String str = "";
        StringBuilder sbui = new StringBuilder(str);
        for (int i =0; i < loop2; i++) {
            sbui.append(i);
        }
        str = sbui.toString();    
    }

    @Test
    public void test12一万回StringBuffer1(){
        String str = "";
        StringBuffer sbuf = new StringBuffer(str);
        for (int i =0; i < loop2; i++) {
            sbuf.append(i);
        }
        str = sbuf.toString();    
    }

  
    @Test
    public void test13一万回プラスで連結2(){
        String s = "abcdefg";
        for (int i = 0; i < loop2; i++) {
            s += "abc"+ "def";
        }
    }
  
    @Test
    public void test14一万回StringBuilder2(){
        StringBuilder sbui = new StringBuilder("abcdef");
        for (int i = 0; i < loop2; i++) {
            sbui.append("abc");
            sbui.append("def");
        }
        sbui.toString();  
    }

    @Test
    public void test15一万回StringBuffer2(){
        StringBuffer sbuf = new StringBuffer("abcdef");
        for (int i = 0; i < loop2; i++) {
            sbuf.append("abc");
            sbuf.append("def");
        }
        sbuf.toString();
    }
}

2011年2月24日木曜日

NetBarrierでcookieを制限している場合にiTunes App Storeからダウンロードできない

以下の3つのドメインをNetBarrierの[ 概要 -> プライバシー -> データ -> ネットサーフィン ]の“信頼するサイト”に加える。
  • store.apple.com
  • apple.co.jp(日本の場合)
  • apple.com
おそらく、iTunesの認証でcookieを使っているのでしょう。