iMacを手に入れてまずやったことのメモ

初めて行った作業ばかりだったので、設定や入れたものなどを忘れないための備忘録的な意味も含めて、iMacを購入後の設定手順をメモっておきます。

起動やユーザ登録、ネットワーク設定は全てすっ飛ばします。だってキャプチャ忘れたし…。

とゆうわけで、とりあえずソフトウェアアップデートしてから各種設定に入ります。

環境設定

左上のアップルのアイコンを押下して開く以下のメニューから選択するか、またはDockの以下のアイコンをクリック。(すみません、キャプチャ撮った時点ではDockがデフォルトじゃなくなってました)

マウスの設定

まずはマウスの設定から。
システム環境設定のマウスをクリックし、マウスの設定画面を開きます。

マウスの設定画面で、軌跡の早さをmax、スクロールをある程度の早さに変更。ダブルクリックの間隔は変えたか覚えてないです…。
27インチiMacなら、解像度の高さ的にも軌跡の早さはmax一択な気がします。
後やっぱり右クリックは欲しかった為、副ボタンのクリックにはチェック。

キーボードの設定

マウスの次はキーボード。
キーのリピート速度リピート入力認識までの時間は最大値に。効果を発揮するのは上下左右の矢印で移動する時とか。これが遅いといらいらします。
すべてのキーを標準のファンクションキーとして使用にチェック。MacはデフォルトだとF1やF2をファンクションキーとして使いたい時にFnキーを押しながら押さないといけないようなので、ここは迷わず変更。

キーボードショートカットの変更はとりあえずなし。
まだデフォルトのショートカットも使いこなしていないので。

Dockの設定

最初の手順がモロにIT戦記の方の内容と被ってますが…(とゆうか参考にしたので被って当たり前ですが)
次にDockの設定を変更します。
デフォルトだとDockは下にあるのですが、左に変更。左を選んだのは単純にデスクトップのアイコンが右から並んでたため。
Dockを自動的に隠す、はオンにしました。
ただ、基本的にキーランチャーが好きなためDockはあまり使わなそう。

ExposeとSpacesの設定

カーソル移動させて何かが表示されるのはあまり好きではないため、Exposeのコーナーへの割当はなし。これはショートカットを使います。
Spacesはショートカットはデフォルトのままで、各アプリを4つのスペースに割当。
といってもまだそこまでアプリを入れているわけではないので、各スペースの役割だけ決めました。

スペース1
ブラウザやチャット、Twitterアプリ等のよく見る系
スペース2
Eclipseやastah、Flex、エディタといった開発系
スペース3
ターミナルやFTP等のサーバー系やファイラー系
スペース4
とりあえずiTunesNNDD用。

mac用のPhotshop買ったらちょっと割り振り考え直さないと。

Dashbord Widget

オフィシャルから下の3つだけ。いいのあんまりなかた…。これから探していきます。

ColourMod

カラーピッカー。RGBの色を取りたくなることってちょこちょこあるので。
http://www.apple.com/jp/downloads/dashboard/developer/colourmod.html

iStat nano

CPU、メモリ、ハードドライブ、IP/外部IP、帯域幅、CPUの温度、バッテリー、駆動時間を表示。
http://www.apple.com/jp/downloads/dashboard/status/istatnano.html

WidgetTerm

ターミナルのウィジェット。何となく入れてみたけど…ターミナルは常時普通に立ち上げてるので、あんまり使わなそう。
http://www.apple.com/jp/downloads/dashboard/developer/widgetterm.html

ツール

Dropbox

これが無いとしんじゃう。。。ノート2つとWinPCとの簡単なデータ共有は専らこれ。PG系はSVN、その他はNFS
https://www.dropbox.com/

firefox

メインブラウザ。Safariもかなりかっこ良かったけれど、やはり使い慣れているfirefoxを選択。Safariは残念ながらWebクリップ専用機となりそうで、Dockからは既に削除済み(´・ω・`)
http://mozilla.jp/firefox/

Quicksilver

テキストランチャー。Windowsbluewindのようなものを探していたらこれが見つかったので利用。これ使いやすいです。Spotlightも結構優秀なので、兼用しつつ様子見。
とりえずPC起動時に起動するようにチェック。

初期設定での起動ショートカットキーがCtrl+SpaceでSpotlightと被っていたので、QuicksilverはCtrl+Qに変更
Reset search afterにもチェック。

http://www.blacktree.com/

tweetie

Twitter用アプリ。2日使っているけれど結構使いやすいです。見た目もいいし、このまま使い続けると思います。
http://www.atebits.com/tweetie-mac/

TotalFinder

とりあえず今のところ最も不満なのがFinder。WinのX-Finder的なやつが欲しいのだけれども、今のところ見つからず。
できればフリーで探したいけれど、とりあえずTotalFinderのα版を利用しています。ただ、TotalFinderのα版は不安定らしく、自己責任&バックアップを取っておくようにという記事を見かけました。不安定ならまだしも、ファイルバックアップって…怖すぎじゃ。
タブ型ファイラーは今後の課題点。

http://totalfinder.binaryage.com/

google 日本語入力

ことえりがどのくらい使える子なのかまだ分かっていないうちに入れるのもあれですが、winでも使っていたので。
http://www.google.co.jp/intl/ja/ime/index-mac.html

MagicPrefs

Magic Mouseの設定を自由に変えれる便利ツール。
3本指クリック、4本指クリック、各指のタップ等の色々な操作にたいしてコマンドを割り当てられます。
Tracking Speedでマウスカーソルの移動速度も通常の設定より速い値に設定できるので、27インチだとかなり便利。
3本指でのクリックにDashboard、4本指でのクリックにExposeを割り当てました。

(タップに色々割り当てて使ってみたのですが、変に反応してしまうことが多かったのでタップは諦めました。)

Flip4Mac

WMVを再生できるようになります。
http://www.microsoft.com/japan/windows/windowsmedia/player/wmcomponents.mspx

Perian

QuickTimeコンポーネント。色々なコーデックに対応できるようになるみたいです。flvもこれで再生可。
http://perian.org/

開発系

Xcode

同梱のDVDからインストール。
サイトからDLをしたい場合は登録が必要な模様。
http://developer.apple.com/jp/technology/tools.html

MacPorts

Mac版のyumやapt的存在らしい。つまり絶対に必要になるであろうもの。
Snow Leopard用のdmpをDLしてインストールしました。
http://www.macports.org/install.php

eclipse

今までガニメテを使っていましたが、折角なのでガリレオに。今までは基本的にPleiadesのオールインワンを入れていましたが、Mac版は無いみたいなので通常のEclipseを入手。パッケージはJava EEのMac64bit版で、追加でとりあえずPDTだけ。日本語化は特にする予定はなし。
Eclipseの詳細なカスタマイズは別途。
http://www.eclipse.org/downloads/

astah-community

JudeUMLツールとして愛用。ただastahになって、communityで画像出力した場合にロゴが入るようになってしまいました。後Javaソースのインポートもできなく…。
マインドマップも使いたいしastahUMLの購入を検討中なのですが、タイムドライセンスなのが本気で気に食わない。(communityは無料ですが、ユーザ登録が必要です。)
後、communityのMac版はサポート対象外で、自己責任の元に実行することとなっています。
EclipseのAmaterasを使ってみようとしてみたこともありましたが、あれ微妙過ぎ…。
http://astah.change-vision.com/ja/product/astah-community.html

Gauche

SICPの問題解く用に。MacPortsを利用して、Snow Leopard で MacPorts から Gauche をインストールのサイトに載っていた3行でインストール完了しました。
ターミナルに「gosh」と打って確認。

Carbon Emacs

Emacs系のエディタ。Gaucheの開発用として。
Emacs + Gauche で二兎を追う!を参考にさせていただきました。
http://homepage.mac.com/zenitani/emacs-j.html

firefoxのアドオン

firebug

もはや「俺がfirefoxだ!」と叫ばれても何の否定もできないくらい重要な存在。貴方が全てです。
https://addons.mozilla.org/ja/firefox/addon/1843

ColorZilla

カラーピッカーのアドオン。CSSやjsでの色指定をするときに、とりあえずこれで色を拾ってます。
https://addons.mozilla.org/ja/firefox/addon/271

FireGestures

マウスジェスチャー用アドオン。昔はかなり重宝していたのに、最近はショートカットばかりでめっきり使わなくなりました…。
https://addons.mozilla.org/ja/firefox/addon/6366

Google Toolbar for Firefox

Googleツールバーのアドオン。主にGmail確認とBookmark用。検索窓はfirefoxのデフォルトのと入れ替えています。
http://www.google.com/tools/firefox/toolbar/FT2/intl/ja/

Greasemonkey

これも定番。スクリプトは結構自分で書く事も多く、使ってないのも含めると30くらいあるかも。「お猿さん」って呼んでます。
https://addons.mozilla.org/ja/firefox/addon/748

Live HTTP headers

HTTP ヘッダの確認ができます。Webアプリ作ってると、ヘッダを確認したくなることが多々あるので。
https://addons.mozilla.org/ja/firefox/addon/3829

Tab Mix Plus

Firefox のタブ機能を拡張してくれるアドオンです。かなり使える子。
https://addons.mozilla.org/ja/firefox/addon/1122
この辺とかも簡単に設定できて最高。

Web Developer

これもフロント開発時にかなり重宝するアドオン。開発時に必須なのは、これとfirebug
https://addons.mozilla.org/ja/firefox/addon/60

テキストリンク

某所を巡る時とか用。。
https://addons.mozilla.org/ja/firefox/addon/1939

YSlow

フロントのパフォーマンスチューニング等に利用するアドオン。こんなの提供してくれるんだから、Yahooって凄いですよね…。
https://addons.mozilla.org/ja/firefox/addon/5369

Total Validator

HTMLやCSSのチェック用。HTML Validatorを使っていたのですが、「Html Validator は MacOSX では利用できません」との文字が…。そんなのあるんですね…。
https://addons.mozilla.org/ja/firefox/addon/2318

gTranslate

テキストを選択→右クリックのメニューで翻訳が可能なアドオン。google翻訳を使っているのでそれなりによい翻訳をしてくれます。わざわざ翻訳ページを開くのが手間だったりするので。
https://addons.mozilla.org/ja/firefox/addon/918

SeoQuake

SEOの調査用アドオン。googleとyahooの以外のは基本オフにしてます。たくさん出てもうざいので…。ipは表示してる。
https://addons.mozilla.org/ja/firefox/addon/3036

EclipseでApache Ivyの利用 - 基本編(1) -

Apache Ivyとは

プロジェクトの依存関係を管理するためのツール。
antとの親和性が高く、antに組み込む形で利用できる。
よくMavenと比較されているようだが自分はMavenの利用経験がない為Mavenとの比較はここでは述べない。

情報名 情報へのリンク
公式サイト http://ant.apache.org/ivy/
ダウンロード http://ant.apache.org/ivy/download.cgi
公式リファレンス http://ant.apache.org/ivy/history/latest-milestone/reference.html
Eclipseプラグイン IvyDE
ライセンス Apache License 2.0

Apache Ivyの主な機能

Apache Ivyのインストール

事前条件
  • Antが既にインストールされており、利用経験があること。
  • Eclipseでの開発環境が整っていること。
インストール
  1. http://ant.apache.org/ivy/download.cgi よりbinaryファイルをダウンロードし、任意のディレクトリに解凍する。
    (執筆時点での最新はapache-ivy-2.1.0-bin.tar.gz)
  2. Eclipseを起動し、メニューバーから下記を選択
  3. ウィンドウ → 設定 → Ant → ランタイム → 「クラスパス」のタブを選択
  4. 「外部JARの追加」→先ほど解凍したディレクトリ直下に存在するivy-2.1.0.jarを指定
  5. 「適用」を押下で完了

これでインストールは完了。

Apache Ivyの利用

以下のような構成のプロジェクトがあったとする。

ディレクトリ名 内容
src/ ソースディレクト
lib/ 依存JARライブラリ
bin/ eclipseのビルド出力フォルダ

lib配下のjarは以下の2つ。

  • commons-lang-2.4.jar
  • json-lib-2.3-jdk13.jar
1.ivy.xmlを書く

ivyの設定ファイル。依存関係をここに書く。
ivyはデフォルトでMavenのセントラルリポジトリに対応している為、http://mvnrepository.com/から必要なライブラリを検索してjarを探す。
例えばjson-libなら、json-libで検索するとhttp://mvnrepository.com/artifact/net.sf.json-lib/json-libが見つかるため、そのPOM Dependencyの項目を参考に以下のivy.xmlを記述する。

<?xml version="1.0" encoding="UTF-8"?>
<ivy-module version="2.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="http://ant.apache.org/ivy/schemas/ivy.xsd"
    xmlns:e="http://ant.apache.org/ivy/extra">
    <info organisation="valice" module="sample-ivy" />
    <dependencies>
        <dependency org="commons-lang" name="commons-lang" rev="2.0" />
        <dependency org="net.sf.json-lib" name="json-lib" rev="2.3" />
    </dependencies>
</ivy-module>

使用したタグの解説

項目名 説明
info このivy.xmlの基本情報
info@organisation モジュールの所有者、企業、機構
info@module モジュール名
dependency 依存モジュールの宣言
dependency@org pomのgroupId
dependency@name pomのartifactId
dependency@rev pomのversion
2.build.xmlを書く

ivyはantのtargetとして実行できるため、build.xmlを書く。
今回はivyのみを使う非常にシンプルなものを容易。

<?xml version="1.0" encoding="UTF-8"?>
<project name="ivy-sample" default="retrieve" basedir="."
    xmlns:ivy="antlib:org.apache.ivy.ant">

    <target name="retrieve">
        <ivy:retrieve />
    </target>

</project>
3.Antを実行する

今回はとりあえず簡単に使ってみることが目的の為、以上で完了。
後は上記antのretrieveを実行すればOK。実行すると、libフォルダが作成され(デフォルト)、依存jarがそこに配置される。
初めて実行するときはMavenのセントラルリポジトリから依存ライブラリ群をダウンロードする為時間がかかるが、2回目以降はローカルフォルダにキャッシュされている為すぐに完了する。


json-libで問題発生
だが自分はここでちょっとハマりました。
json-libの依存が上手く解決できず、json-lib-2.3.jarがダウンロードされない。
http://mvnrepository.com/artifact/net.sf.json-lib/json-lib
設定は確実にあっているはずだけれど、エラー内容で表示されるリポジトリを覗くと確かにjson-lib-2.3.jarなんてものはなく、-jdk13や-jdk15とかついているものしかない。
google先生に色々尋ねていたら、原因らしきものをmaven系のエントリで発見。
json-libは普通にdependencyに足すだけだとダウンロードに失敗する件 - tanamonの日記
ivyでclassifierを指定する為には、artifact要素の拡張属性を使用する必要があるらしいので、ivy.xmlの内容を下記の様に修正。

<?xml version="1.0" encoding="UTF-8"?>
<ivy-module version="2.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="http://ant.apache.org/ivy/schemas/ivy.xsd"
    xmlns:e="http://ant.apache.org/ivy/extra">
    <info organisation="valice" module="sample-ivy" />
    <dependencies>
        <dependency org="commons-lang" name="commons-lang" rev="2.0" />
        <dependency org="net.sf.json-lib" name="json-lib" rev="2.3">
            <artifact name="json-lib" type="jar" ext="jar"
                e:classifier="jdk13" />
        </dependency>
    </dependencies>
</ivy-module>

修正内容は、json-lib用のdependencyにartifactを加えたことと、拡張属性の名前空間(xmlns:e="http://ant.apache.org/ivy/extra)の追加。
これで成功。
ただ…json-libが実行時には必要の無い依存jarまで大量に落としてくるので、libが凄いことに…。
絶対どうにかできるハズなので、次回の調査対象。

簡単なサンプルbuild.xml

今回のivyをコンパイルの工程に加えた簡単なサンプルbuild.xmlを作成。
たぶん普通はlib自体を消してそこに再配置とかしないのだろうけど、とりあえずサンプルとして。
これでコンパイルの度に依存を解決してくれる。

<?xml version="1.0" encoding="UTF-8"?>
<project name="sample-api" default="all" basedir="."
    xmlns:ivy="antlib:org.apache.ivy.ant">

    <!-- set property -->
    <property name="bin" value="${basedir}/classes" />
    <property name="build" value="${basedir}/build" />
    <property name="src" value="${basedir}/src" />
    <property name="lib" value="${basedir}/lib" />
    <property name="version" value="0.10" />


    <!-- default target -->
    <target name="all" depends="compile,jar,clean" />

    <!-- init -->
    <target name="init" depends="clean">
        <mkdir dir="${bin}" />
        <mkdir dir="${build}" />
    </target>

    <!-- compile -->
    <target name="compile" depends="init,retrieve">
        <javac srcdir="${src}" destdir="${bin}">
            <classpath>
                <fileset dir="${lib}">
                    <include name="**/*.jar" />
                </fileset>
            </classpath>
        </javac>
    </target>

    <!-- clean -->
    <target name="clean">
        <delete dir="${bin}" />
        <delete dir="${build}" />
        <delete dir="${lib}" />
    </target>

    <!-- jar -->
    <target name="jar" depends="compile">
        <jar jarfile="${build}/sampleoapi-${version}.jar" basedir="${bin}" />
    </target>

    <target name="retrieve">
        <ivy:retrieve />
    </target>

</project>

次回予告

次回は基本編(2)として、ivyの設定ファイル、Mavenのセントラルリポジトリ以外を利用する方法と、利用できる要素と属性値の調査を行う予定。

OpenIDとは?

今更ながらOpenIDを利用してみました。

と、実は今までOpenIDの事をよく分かっていなかったのですが、今後Webサービス側としての利用を考えているので、ある程度ちゃんと調べてました。

まぁ細かい仕組みや経緯はwikiにお任せするとして、今回は要はOpenIDって何なの?を簡単に書いてみたいと思います。

OpenIDについて

OpenIDとは?

要は色んなサイトで共通で使えるID。
OpenIDの発行元は色々あって、例えば「はてな」ですと、はてなユーザーであれば特別な手続きをすることなくOpenIDが発行されているみたいです。
はてなOpenID

http://www.hatena.ne.jp/{ユーザID}/

このOpenIDがあれば、OpenIDに対応しているサイトのログイン認証等をこのOpenIDのみで通過できるようになります。
例えばOpenIDを使ってこのゲーム・裏技・攻略 - ワザップ!にログインする場合だと

  • 右上の「外部ID」をクリック
  • OpenIDでログイン」の入力フォームに、はてなOpenIDを入力
  • はてなに未ログインの場合はここでログインを求められる
  • ログイン成功後、ワザップの認証を許可するかの確認を取られます
  • 許可した場合、わざっぷへのOpenIDでのログインに成功します

この「許可」は、「今回のみ」と「常に許可」を選択できる為、常に許可を選べば次回以降の確認は取られなく無くなります。

OpenIDをがあると何が便利?

個人的な感想ですが、パスワード管理の煩雑さから開放されます。
ログインが必要な複数のWebサービス単位でアカウントを作成する必要がなく、一つのアカウントを使いまわすことが可能になります。
OpenIDの発行元も、はてなmixiyahoo!livedoor等と色々な大手Webサイトが存在しますので、既に持っているアカウントで一手続き済ますだけで取得できることも多いかと思われます。

なぜOpenIDに対応しているWebサービスが増えているの?

Webサービス側で「認証処理の機能」と「ユーザ情報(ID・パスワード等)の保持」を行う必要がなくなるというリスク回避の面が非常に大きいのでは無いかと思います。
これ勝手な想像ですので、間違っていたり他にこんな理由がある等のツッコミがあれば、是非ご指摘ください。

認証を行うWebサービスにはどんな個人情報が渡されるの?

基本的にOpenIDとユーザ名以外の情報は渡されないようです。
ただし自分から提供してもよい属性情報として付加した情報は、Webサービス側に(対応していれば)提供されるみたいです。
ですので、個人情報保護法はちゃんと守られています。

ただ気をつけなければいけないのが、例えばmixiOpenIDでログインした場合、OpenIDからmixiのユーザIDは分かる為、Webサービス側からすると「今mixiOpenIDでログインしてきたユーザが、どのmixiユーザなのか」といった情報は伝わってしまいます。(ログを取っていればですが)
なのでmixiのプロフィールに個人情報を記述していれば、Webサービスの管理者はそれを見ることくらいは可能。
これははてなも同様で、はてなOpenIDで何らかのWebサービスにログインすれば、ユーザIDからブログの特定くらいは可能。
こはちゃんと考慮した上で利用する必要があります。

OpenIDを使ったサービスの提供をしたい!

これはそのうち記事にします。提供予定ですので。

より詳しく知りたい方はこちら

今回はかなり簡単にOpenIDの説明をしてありますので、より詳しく知りたい方は他のサイトをご覧ください。
仕様から学ぶOpenIDのキホン − @IT
特集:いますぐ使えるOpenID|gihyo.jp … 技術評論社
OpenID をブロガー向けに分かりやすく説明すると?:Goodpic
たけまる / OpenID に向いている認証と向いてない認証

SQLiteのコマンド

簡単にDBを構築したい場合に超便利なSQLite
しかし趣味で偶にしか使わないので、毎回コマンドを忘れてしまうため備忘録として。

データベース系

データベースを作る or 接続する
sqlite dbname

dbnameのファイルが存在しなかった場合は新規に作成され、既に存在する場合はそのDBに接続する。

データベースの名前を見る
sqlite> .databases
seq  name             file
---  ---------------  ----------------------------------------------------------
0    main             /home/sqlite/sample.db
sqlite> .exit

現在接続中のDB(ファイル)のパスが表示される。

データベースの接続を切る
sqlite> .exit

又は、

sqlite> .quit
データベースのバックアップ

sqliteはデータベース毎にファイルが作成される為、そのファイルをコピーするだけでもバックアップが取れる。
.backupと.restoreコマンドを使う方法もある。

table系

tableの一覧を表示する
sqlite> .tables
sample1
sample2
tableのインデックス一覧を表示する
sqlite> .indices sample
name_index
tableのスキーマを確認する
sqlite> select * from sqlite_master; #*はテーブル名

下記の場合はCREATE TABLE文のみ表示される

sqlite> .schema [TABLE]

ダンプ&リストア系

ddl文まで含んだSQLとして出力される。

ダンプコマンド
sqlite> .dump [tablename, ...] > dump.sql

tablenameは複数指定可能。指定しなかった場合は全てダンプされる。

コマンドラインからのダンプ
sqlite dbname .dump > dump.sql
リストアコマンド
sqlite> .read dump.sql
コマンドラインからのリストア
sqlite dbname < dump.sql

ファイルの入力&出力系

表示結果をファイルに出力する
sqlite> .output sample.txt  #sample.txtは任意
sqlite> select * from sample;
sqlite>

これでsample.txtに表示結果が出力されている。尚、出力されるフォーマットは設定値の通りになる。
つまり以下のような設定にすると、簡単なcsv形式での出力が可能となる。(エスケープ等の処理はされない)
.mode csvで出力した場合はエスケープ処理もされるが、そのままインポートが出来ないので注意が必要。

sqlite> .output sample.csv
sqlite> .separator ","
sqlite> select * from sample;
ファイルからデータをインポートする
sqlite> .import sample.txt sample  #.import ファイル名 table名

ただし、区切り文字が設定値と一致しなければならない。

出力設定系

現在の設定値を表示する
sqlite> .show
     echo: off
  explain: off
  headers: off
     mode: list
nullvalue: ""
   output: stdout
separator: "|"
    width:

各項目は以下のコマンドで変更できる

実行したSQLを復唱する

OFFの場合(通常)

sqlite> .echo OFF
sqlite> select * from sample;

ONの場合

sqlite> .echo ON
sqlite> select * from sample;
select * from sample; #復唱されている
explainの結果を見やすくする

OFFの場合(通常)

sqlite> .explain OFF
sqlite> explain select * from sample;
0|Goto|0|13|
1|Integer|0|0|
2|OpenRead|0|2|
...

ONの場合

sqlite> .explain ON
sqlite> explain select * from sample;
addr  opcode          p1          p2          p3
----  --------------  ----------  ----------  ---------------------------------
0     Goto            0           13
1     Integer         0           0
2     OpenRead        0           2
...

.explain ON後は、headers: on、headers: onになっている為、通常のSELECT結果も同様の表示結果となる

SELECT結果でテーブルのヘッダーを表示する

ONの場合

sqlite> .header ON
sqlite> select * from sample;
id|user|type|name #これがヘッダー
1|root|A|vaice
2|dbuser|B|tanaka

OFF(通常)の場合

sqlite> .header OFF
sqlite> select * from sample;
select * from sample;
1|root|A|vaice
2|dbuser|B|tanaka
SELECT結果のフォーマットを変更する
sqlite> .mode [MODE]

[MODE]の種類は以下

MODE 説明
csv CSV形式
column 幅の揃ったテーブル形式で表示される
html TRタグ、TDタグを使ったHTMLのテーブルとして表示される
insert INSERT文で表示される
line clumn名 = value値 のペアで1行ずつ表示される
list デフォルト値。separatorの値で左詰で表示される
tabs タブ区切りで表示される
tcl tcl文法で表示される
表示結果の出力先を変更する

ファイルに出力する

sqlite> .output sample.txt  #sample.txtは任意
sqlite> select * from sample;
sqlite>

詳しくは「表示結果をファイルに出力する」の項目を参照。
標準出力に戻す場合は以下。

sqlite> .output stdout
データがnullだった場合の表示を指定する
sqlite> .nullvalue "NULL" #デフォルトは""(空)
データの区切り文字を指定する
sqlite> .separator "," #デフォルトは"|"
カラムの横幅を指定する

modeがcolumnの時のみ有効。

sqlite> .width "10" #デフォルトは""

スペース区切りで左から順に指定可能。

sqlite> .width "5 5 10 10"

Javaのアノテーションを独自で定義する

徐々に利用する機会が増えてきたアノテーションだが、アノテーションベースのフレームワークで使われているのを使ったりすることはあっても自分でアノテーションを定義したことが無かった。
「業務用フレームワーク作る際も使えそうだよなぁ」と思っていたので、今後使いこなす為にも改めてちゃんと勉強しなおしてみた。

※「アノテーション」自体は、JUnit、Jaxb、Spring等によって使い慣れていることを前提。

アノテーション

独自のアノテーションを作成する為には、以下のようなアノテーションのクラスを作成する必要がある。

@interface Annotation名{
    キーの型 キーの名前();
    ...
}

クラス名がアノテーション名、メソッド名がキー名となり、メソッドの返り値がキーに指定できる型となる。
アノテーション型はインターフェイス型と似ているが、通常のインターフェイス型に比べ、以下の制限がある。

  • extends節を書けない
  • メソッドは引数とthrows節を持てない
  • メソッドの戻り値で使えるのはプリミティブ型、String型、Class型、enum定数、アノテーション型、それらの配列、のみ
  • ジェネリクスは使えない

なお、@interfaceが指定されているクラスは、暗黙的ににjava.lang.annotation.Annotationインタフェースの継承クラスになる。

独自のアノテーション定義例
public @interface Hatena {
  int priority();
  String user();
}

public enum DiaryType {CATEGORY, DAY, NEW}
@interface Diary {
  DiaryType value();
}

上記の場合は @Hatena@Diaryアノテーションとして指定できるようになる。
この独自アノテーションを利用した例を以下に示す。

上記の独自定義クラスの利用例
@Hatena(priority = 1, user = "valice")
public class SampleClass {
    public SampleClass(){}
    @Diary(DiaryType.CATEGORY)
    public void sampleMethod(){
        ...省略
    }
}
キーが一つしか存在しないアノテーション

@Diaryの例のように、キーが一つしか存在しない場合、そのキーの名前をvalueとすることによってキー名を省略できるようになる。
キーが一つでも名前がvalueで無い場合は省略することはできない。

メタアノテーション型Target

アノテーションを定義する場合に重要な点は2つあり

  • 対象となる構文要素は何か(コンストラクタ、メソッド、ローカル変数等)
  • どのような情報を記述できるのか

を記述する必要があるが、「対象となる構文要素は何か」に関しては省略することができ、省略した場合は構文要素の制限が無い状態になる。
最初の例のアノテーション定義ではそれらを省略しており、@Hatena@Diaryアノテーションを指定できる要素であればいかなる要素に対しても付加できることになる。

アノテーションを付加できる構文要素を制限したい場合は、メタアノテーション型Targetをを付与すればよい。
@Hatenaはクラス、@Diaryはメソッドにのみ付与できるようにしたい場合、以下のようになる。

独自のアノテーション定義例にTagetを利用したもの
@Target(ElementType.TYPE)
public @interface Hatena {
  int priority();
  String user();
}

public enum DiaryType {CATEGORY, DAY, NEW}

@Target(ElementType.METHOD)
@interface Diary {
  DiaryType value();
}
ElementTypeで提供されている定数

ElementTypeは列挙型で、指定できる定数は以下。

定数名 構文要素
ElementType.ANNOTATION_TYPE アノテーション型宣言
ElementType.CONSTRUCTOR コンストラク
ElementType.FIELD フィールド宣言、enum宣言
ElementType.LOCAL_VARIABLE ローカル変数宣言
ElementType.METHOD メソッド宣言
ElementType.PACKAGE パッケージ宣言
ElementType.PARAMETER 引数宣言
ElementType.TYPE クラス宣言、インタフェース宣言、アノテーション型宣言、enum宣言

@Targetアノテーションvalueキーは配列である為、以下の様に複数指定することができる。その場合はそれら全ての構文要素に付与できるようになる。

@Target({ElementType.TYPE, ElementType.METHOD})
public @interface Hatena {
  int priority();
  String user();
}

デフォルト値

キーが複数ある場合でも、デフォルト値を指定することによってそのキーの指定を省略することができる。

public @interface Hatena {
  int priority() default 1;
  String user();
}

@Hatena(user = "valice")
public class SampleClass {
    ...
}

マーカ・アノテーション

アノテーション型の定義においてメソッドが一つも無い場合、そのようなアノテーションマーカ・アノテーションと呼ばれる。
マーカ・アノテーションは使用する際、以下のように括弧を省略することができる。

public @interface MarkerAnnotation {}

@MarkerAnnotation
public class SampleClass {
    ...
}

これらは、標準アノテーションの@Overrideや@Deprecatedと同じ振る舞いである。(@Overrideや@Deprecatedもマーカ・アノテーションである)

その他のメタアノテーション

メタアノテーション型Targetは既に紹介したが、その他の標準メタアノテーションであるRetention、Inherited、Documentedについても記載しておく。

Retention

アノテーションの有効範囲を指定できる。

定数名 有効範囲
RetentionPolicy.CLASS アノテーションの情報をクラス・ファイルに出力するが、実行時JVMにロードされない。省略された場合のデフォルト値。
RetentionPolicy.RUNTIME アノテーションの情報をクラス・ファイルに出力し、実行時JVMにもロードされる。その為、リフレクションAPI経由でその情報にアクセスできる。
RetentionPolicy.SOURCE アノテーションの情報はソース・コード上のみに保持され、コンパイル時によって破棄される。
@Retention(RetentionPolicy.CLASS)
public @interface Hatena {
  int priority();
  String user();
}

※Retentionはキーがvalueしか無いため、キー名の省略が可能

Inherited

アノテーションを利用したクラスにおいて、そのアノテーション指定を子孫クラスに継承させることができる。
指定は必ずクラス定義に対してする必要があり、それ以外に指定した場合は無効となる。
下記の例の場合、SampleSubClassにおいても@Hatenaアノテーションが有効となっている。

@Inherited
public @interface Hatena {
  int priority();
  String user();
}

@Hatena(priority = 1, user = "valice")
public class SampleClass {
    ...
}

public class SampleSubClass extends {
    ...
}

※Inheritedはマーカ・メタアノテーションの為、括弧は省略可能

Documented

アノテーションが付いていることをドキュメントに記載するためのマーカ・メタアノテーション
Javadocなどのツールでドキュメントを生成した場合、このメタアノテーションが指定されていないアノテーションを利用しているクラスには、アノテーションを利用している旨が記載されない。

予告

今回は定義の仕方だけですが、独自のアノテーションの利用方法もそのうち書く予定です。その際はここにリンクを貼ります。

linuxの/procについて

/proc配下のファイル群は、アプリケーションからのアクセスに応じて動的に内容が生成される仮想ファイル群である。
proc自体はファイルシステムで、システム起動時にマウントされる。(mountで確認できる)
このマウントに関しては、/etc/fstabに書かれているが、実際はカーネルにハードコーディングされているのでマウントする必要はない。(らしい)

配下のファイルの種類は大きくわけて2つ。

ディレクトリ名がプロセスIDになっているディレクトリの中身

名前 内容
cmdline プロセスを起動したコマンドライン(bash等)
cwd 現在の作業ディレクトリ(/home/user等)
environ プロセスの環境変数
exe 実況中のプログラムファイル(/bin/bash等)
fd/ プロセスが開いているファイルのファイル記述子(ファイルディスクリプタ)。シンボリックリンクのリンク先が開いているファイルになっている。
maps プロセスのアドレス空間におけるメモリマップ
mem プロセスのアドレス空間の内容
root ルートディレクトリ(/root)
status プロセス状態(属性や稼働状況)

ディレクトリ名が数値(プロセスID)でないファイル・ディレクトリの一覧

名前 内容
acpi/ 電力制御に関する情報
asound/ サウンドに関する情報
asound/cards 認識しているサウンドカードが確認できる
buddyinfo メモリの分散化問題を解析するために使用される…らしい
bus/ インストールされている各バスの情報
cgroups 資源コントローラの情報?
cmdline カーネル起動時のオプション
cpuinfo CPUの識別情報
crypto インストール済の暗号方法一覧(md5とか)
devices バイスノードに関する情報
diskstats 各ディスクデバイスのディスク I/O 統計情報
dma 登録されているISA DMAチャンネルの一覧
driver/ デバイスドライバが提供する情報表すファイルが置かれる
execdomains 実行ドメインと、パーソナリティ範囲の一覧
fb フレームバッファバイス、その番号、それを制御するドライバなどの一覧
filesystems 組み込まれているファイルシステムに関する情報を表すファイルが置かれる
fs/ nfsを利用している場合はここに情報が表示される?
ide/ IDEチャネルとそれに取り付けられている各デバイスの情報
interrupts バイスが使用しているIRQ(割り込み要求)の一覧
iomem バイスが使用しているメモリの一覧
ioports バイスが使用しているI/Oアドレスの一覧
irq/ 特定のIRQ(割り込み要求)を1つのCPUにのみ接続、またはCPUがどのIRQも処理しないように設定したりできる
kallsyms カーネルの外部シンボル定義一覧
kcore カーネルのメモリ空間全体にアクセスできる
key-users 認証データをLinuxカーネルにキャッシュすることかできる「鍵保存サービス」で使われる
keys 認証データをLinuxカーネルにキャッシュすることかできる「鍵保存サービス」で使われる
kmsg カーネルからのログメッセージ
kpagecount 中を見ても意味不明。何かのカウント?
kpageflags 中を見ても意味不明。何かのフラグ?
latency_stats レイテンシ情報?「Latency Top version : v0.1」こんなのが返ってきた
loadavg ロードアベレージ
locks ファイルロックとリースの情報
mdstat RAID設定の情報
meminfo メモリ使用状況
misc その他のメジャーデバイス上に登録されている その他のドライバを一覧
modules カーネルに組み込まれているモジュールの一覧
mounts 全マウントの一覧
mtrr システムで使用中の MTRR (Memory Type Range Registers)
net/ ネットワークデバイスやデバイスの通信に関する情報
pagetypeinfo 今のところ謎。そして調査予定なし…
partitions パーティション情報
reserve_info 「1:0 "total reserve" 0K 0/0」とだけ書いていた。今のところ謎。
sched_debug
schedstat
scsi/ SCSI情報(USBハードディスクはSCSIバイスとして認識)
self 自プロセスに関する情報。自プロセスのproc仮想ファイルへのシンボリックリンク
slabinfo カーネル設定オプションCONFIG_SLABが有効の場合にのみ存在する。カーネルキャッシュ使用率の情報。
stat システムのさまざまな統計情報。最後に再起動された時以降のものが保持されている。
swaps スワップ領域の一覧
sys/ カーネルの調整可能パラメータ(チューニングで利用)
sysrq-trigger このファイルにecho等で書き込むとSysRqキーを使うことができる。(rootのみ)
sysvipc/ 現在システム上に存在するIPCオブジェクトの一覧
timer_list システム上の設定されたクロックとタイマの情報?なんのこっちゃいな…
timer_stats カーネルのタイマを要求されているルーチンについての情報?
tty/ ttyドライバとライン設定のサブディレクトリがある
uptime システムが起動してからの経過時間
version カーネルのバージョン
vmallocinfo 動的メモリ空間の情報
vmstat 仮想メモリの使用状況
zoneinfo メモリのゾーン (memory zone) に関する情報。仮想メモリの振舞いを分析するのに役立つらしい。

PC起動時のフロー - MBRとブートローダとパーティションテーブル

先日、Linuxを入れていたPCにWindowsを入れようとしたら上手くブートできなくなるという事態が発生したので、これを期にブート回りをちゃんと勉強しなおしてみました。
忘れないようにメモ書き。

PC起動時のフロー

  1. M/B上のBIOSが起動する。
  2. BIOSは初期化処理後、起動ドライブを探す。
  3. 起動ドライブの先頭セクタがロードされ、MBRが読み込まる。
  4. ブートローダが作動し、パーティションテーブルの4つのテーブルエントリーから起動フラグが立っている基本領域が無いか探す。
  5. 起動フラグの立っている基本領域が見つかったらその領域の先頭位置をパーティションテーブルから取得する。
  6. BIOSにその位置にあるブートセクタをロードしてもらい、制御を受け渡す。
  7. OS固有の起動処理。

MBRとは

マスターブートレコード(Master Boot Record)の略。
ハードディスクの先頭部分(セクタ)に置かれ、パソコン起動時に最初に読み込まれる。

PC/AT互換機におけるマスターブートレコードの構造は以下

アドレス 内容 サイズ
0000 ブートローダ 446
01BE パーティションテーブル 64
01FE ブートシグニチャ 2

サイズは計512バイトで、ブートシグニチャは「MBRが有効である」事を示す固定値(0xAA55)が入る。

ブートローダとは

またはブートストラップローダ、マスターブートローダ、マスターブートコード、イニシャル・プログラム・ローダ(正式な名称はない)。
電源を入れた後、OS起動までの一連の処理を行うソフトウェア。
ブートローダは多段階で使われ、MBRに記録されたプログラムがさらに別のプログラムを呼ぶ。
MBRに記録されているプログラムは非常に小さいが、OSをロードして起動するための別のプログラムをロードするには十分な機能を持っている。

パーティションテーブルとは

ディスクのパーティション情報を管理している領域。
4エントリあり、それぞれ以下の情報を持つ。

アドレス 内容 サイズ
0x00 ブート可能かどうかのフラグ(「PC起動時のフロー」での起動フラグはこれ) 1
0x01 パーティションの開始位置(CHS方式) 3
0x04 パーティションのタイプ(NTFSとかFAT32とか) 1
0x05 パーティションの終了位置(CHS方式) 3
0x08 パーティションの開始位置(LBA方式) 4
0x0C 総セクター数(LBA方式) 4
サンプル

自分のWinPCのMBRをダンプして、パーティションテーブル部分を抜き出してみたのが下記。

第1エントリ - 80 00 01 fe 07 ff ff 00 3f 00 00 ea cc 09 ff 00
第2エントリ - 00 ff c1 fe 0f ff ff eb 0b 09 ff ac f5 1b 42 00
第3エントリ - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
第4エントリ - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

第1エントリに起動フラグが立っていて、第2エントリは拡張DOS領域(拡張パーティション)となっている事等が分かる。(第3エントリ、第4エントリはnull)
ここで示されている各パーティションの先頭位置にはブートセクタ (PBR) が存在するが、拡張パーティションの場合はMBRと同じ構成の拡張ブートレコード (EPBR)が存在し、パーティションテーブルの最初の2エントリのみが使用される(拡張パーティションテーブル)。
この拡張ブートレコード (EPBR)は、第1エントリに自身のブートセクタ(PBR)の位置を、第2エントリに次のパーティションのEPBRの位置を管理することにより、入れ子になる形で多数のパーティションの作成が可能となっている。