5.29.2011

C++: Convert array to vector

C++: 配列からvectorへの変換

Top Coder のプラグインで使われているテクニックの応用。
空の配列には対応していない。

   1: #include <vector>
   2: #define VECTOR(a) VECTOR_((a), sizeof(a) / sizeof(a[0]))
   3: template <typename T>
   4: std::vector<T> VECTOR_(T *array, std::size_t size) {
   5:   return std::vector<T>(array, array + size);
   6: }
・使用例
   1: int x[] = {1, 2, 3, 4, 5};
   2: std::string y[] = {"aa", "bb", "cc"};
   3:  
   4: std::vector<int> vx = VECTOR(x);
   5: std::vector<std::string> vy = VECTOR(y);
   6:  
   7: std::cout << vx[2] << vy[2] << std::endl;  // "3cc"

Windows: STOP error in NDIS.sys

Windows: NDIS.sys STOPエラー

Windows XP3 + 無線ドライバの相性の問題でブルースクリーン(DRIVER_IRQL_NOT_LESS_OR_EQUAL)が発生。

参考:
http://dynabook.com/assistpc/faq/pcdata/008137.htm
http://www.sacnoha.com/?p=702
http://www.whlgcy.com/2011/01/0x000000d1-ndissys.html

Available length of user password in Solaris

Solaris: ログインパスワードの有効文字数

Solaris におけるユーザのパスワードは、デフォルトでは 8文字以内でしか利用できない。
9文字以上のパスワードを設定しても、実際にチェックされるのは先頭8文字だけである。

・パスワード設定

   1: # passwd root
   2: 新しいパスワード: 「password1234」と入力
   3: 新しいパスワードを再入力してください: 「password1234」と入力
   4: passwd: root のパスワードが変更されました

・パスワード確認

   1: $ su -
   2: パスワード: 「password」と入力
   3: Sun Microsystems Inc.   SunOS 5.10      Generic January 2005
   4: # id
   5: uid=0(root) gid=0(root)

このように、su でも telnet でも ftp でも、先頭8文字さえわかればログインできてしまうのだ。

9文字以上のパスワードを正しく使えるようにするためには、パスワード暗号アルゴリズムを変更する必要がある。

まず、どのアルゴリズムが使用できるか、crypt.conf を確認する。
下記の例だと、「1」が「MD5」となっていることがわかる。 (2a: Blowfish, md5: Sun MD5, 5: sha256, 6: sha512)

・/etc/security/crypt.conf

   1: # cat /etc/security/crypt.conf
   2: #
   3: # Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
   4: # Use is subject to license terms.
   5: #
   6: #ident  "@(#)crypt.conf 1.2     08/05/14 SMI"
   7: #
   8: # The algorithm name __unix__ is reserved.
   9:  
  10: 1       crypt_bsdmd5.so.1
  11: 2a      crypt_bsdbf.so.1
  12: md5     crypt_sunmd5.so.1
  13: 5       crypt_sha256.so.1
  14: 6       crypt_sha512.so.1

そして、policy.conf を編集する。

・/etc/security/policy.conf

CRYPT_DEFAULT=__unix__

  ↓

CRYPT_DEFAULT=1

この段階ではまだ、既存のパスワードは古い暗号化のままなので、パスワードを再設定する。

   1: # grep root /etc/shadow
   2: root:K6pbRTjC7L0A6:15122::::::
   3: # passwd root
   4: 新しいパスワード:「password1234」と入力
   5: 新しいパスワードを再入力してください:「password1234」と入力
   6: passwd: root のパスワードが変更されました
   7: # grep root /etc/shadow
   8: root:$1$z6atQD7B$3P25WD9Y/TC8ThO7l9u8D.:15122::::::

/etc/shadow を見ると暗号化アルゴリズムが変わり、セキュリティが強化されたことがわかる。

最後に、先頭8文字だけではログインできないことを確認。

   1: $ su -
   2: パスワード: 「password」と入力
   3: su: Sorry

 

参考:
http://pooh.gr.jp/?p=841
http://d.hatena.ne.jp/matoken/20090129/1233239258

5.26.2011

Note for introducing Firefox

Firefox 初期セットアップ覚え書き

Google Chrome に見切りをつけようかと考えている今日のこの頃。

1. まず導入するアドオン

 ・AutoPager
 https://addons.mozilla.org/ja/firefox/addon/autopager/
 nクリックを1クリックにすると商売になる。1クリックを0クリックにすると、発明となる。

 ・FireGestures
 https://addons.mozilla.org/ja/firefox/addon/firegestures/
 「戻る」、「上の階層へ移動」といったオペレーションを、マウスジェスチャーのみで実現できる。

 ・Speed Dial
 https://addons.mozilla.org/ja/firefox/addon/speed-dial/
 ブックマークの進化系。ページのイメージがサムネールで表示され、1クリックで目的のページにアクセスできる。

 ・テキストリンク
 https://addons.mozilla.org/ja/firefox/addon/text-link/
 リンクになっていないURI文字列をダブルクリックで開けるようにする。

2. about:config 設定

 URLに「about:config」と入力すると、Firefoxの詳細なパラメータを変更できる。

 ・browser.search.openintab false => true
 検索バーを使用したとき、常に新しいタブで開く。Alt+Enterを押せば、同じタブで開く。

 ・mousewheel.withnokey.numlines 6 => 8
  mousewheel.withnokey.sysnumlines true => false
 マウスホイールの移動量を増やす。

 ・browser.tabs.closeWindowWithLastTab true => false
 最後のタブを閉じたときに、ウィンドウごと閉じられてしまうのを防ぐ。

 ・network.http.pipelining false => true
  network.http.pipelining.maxrequests 4 => 8
  network.http.proxy.pipelining false => true
 パイプライン処理(一度に多数のHTTPリクエストを送りつける)を行うことで、ブラウジングを高速化する。

 ・[新規] nglayout.initialpaint.delay 0 (整数値)
 描画開始までの待ち時間を無くして、さらに高速化。

参考:
http://www.mozilla.org/projects/netlib/http/pipelining-faq.html

5.24.2011

How to find slow SQL in Oracle

Oracle: 時間のかかるSQLを調べる方法

何かOracleの挙動がおかしいが、どのSQLに問題があるのか分からない。
そんなとき、SQL*Plusを使って調査する方法の一例。

※この記事は Oracle 10g について記載しています。9i 以前では一部コマンドが正しく動作しませんのでご注意ください。

ライブラリ・キャッシュ内に残っているSQLは、
動的パフォーマンスビュー「v$sql」を参照することで直近の状態を把捉できる。

1. 事象の発生した時間が特定できる場合

 最後にアクティブになった時刻「last_active_time」を「to_char」で文字列に変換し、
 それを比較することでレコードを抽出する。

 ①件数のカウント

  例1) 最後にアクティブになった時刻が「2011/5/24 19:31:00~19:31:59」のSQLをカウント

   1: select count(*)
   2:   from v$sql
   3:  where to_char(last_active_time, 'yyyymmddhh24mi') = '201105241931';

  例2) 最後にアクティブになった時刻が「2011/5/24 19:31:20~19:31:29」のSQLをカウント
  (like で文字列を比較することで、10秒の範囲を抽出できる)
   1: select count(*)
   2:   from v$sql
   3:  where to_char(last_active_time, 'yyyymmddhh24miss') like '2011052419312%';

 

 ②SQL情報の取り出し

  例3) 最後にアクティブになった時刻が「2011/5/24 19:31:00~19:31:59」のSQLを調べる

   1: select to_char(last_active_time, 'yyyy/mm/dd hh24:mi:ss'),
   2:        sql_id,
   3:        hash_value,
   4:        sql_text,
   5:        round(cpu_time/1000000,2),
   6:        round(elapsed_time/1000000,2),
   7:        executions,
   8:        buffer_gets,
   9:        disk_reads
  10:   from v$sql
  11:  where to_char(last_active_time, 'yyyymmddhh24mi') = '201105241931';

  出力結果は、順に
   (1) 最後にアクティブになった時刻
   (2) SQL ID
   (3) ハッシュ値  ※SQL IDとともに実行計画などの更なる調査に利用
   (4) SQL文       ※長いSQLの場合は全文が表示されないことがある => その場合は 「sql_fulltext」を参照
   (5) 累計のCPU時間(秒)    ※単位を「マイクロ秒」から「秒」に変換するために10の6乗で割り算を行い、
   (6) 累計の経過時間(秒)     さらに小数点以下の丸めを行っている
   (7) 実行回数
   (8) 累計のバッファ取得回数    ※1回に取得するサイズは、初期パラメータのブロックサイズと同じ
   (9) 累計のディスク読み込み回数
  となる。

 

2. 一回あたりの経過時間が長いSQLを抽出する

 「elapsed_time / executions / 1000000」で1回あたりの経過時間(秒)を算出することができる。
 ゼロ除算を防ぐため、「executions > 0」という条件は必須。

 ①件数のカウント

  例4) 1回あたり60秒以上かかったSQLをカウント

   1: select count(*)
   2:   from v$sql
   3:  where executions > 0
   4:    and elapsed_time/executions/1000000 >= 60;

 ②SQL情報の取り出し

  例5) 1回あたり60秒以上かかったSQLを調べる

   1: select to_char(last_active_time, 'yyyy/mm/dd hh24:mi:ss'),
   2:        sql_id,
   3:        hash_value,
   4:        sql_text,
   5:        round(cpu_time/1000000,2),
   6:        round(elapsed_time/1000000,2),
   7:        executions,
   8:        buffer_gets,
   9:        disk_reads
  10:   from v$sql
  11:  where executions > 0
  12:    and elapsed_time/executions/1000000 >= 60;

参考:
http://otndnld.oracle.co.jp/document/products/oracle10g/102/doc_cd/server.102/B19228-04/dynviews_2.htm

5.22.2011

Python unit testing

Python: ユニットテストの実行

このページ(Dive Into Python)が分かりやすかった。
http://diveintopython3-ja.rdy.jp/unit-testing.html

Pythonでは、テスト駆動開発(TDD/Test-Driven Development)に必要なツールが標準で用意されている。

以下の手順で実行。

・unittest モジュールをインポート
・「unittest.TestCase」を継承するクラスを作成
・「test」で始まる名前のクラスメソッドを作成
・そのメソッドの中でテストしたい処理を実行 ⇒ 例外が発生せずメソッドが完了すれば、テストOKとなる
・同値性の確認:self.assertEqual(first, second)
・特定の例外が発生することの確認:self.assertRaises(excClass)
  ⇒ with ステートメントを使うと非常にスマートなコーディングができる。
・unittest.main() を実行

以上を踏まえ、将棋の駒クラスのユニットテストを実装。

・test_piece.py

#!/usr/bin/python2.7
# Copyright (c) 2011 Mog Project. All rights reserved.
from shogi.piece import Piece
from shogi.piece import PieceError
import unittest

class Test(unittest.TestCase):
  # csa, owner, type, origin, reverse, promote
  all_pieces = (
      (None, ' ', '* ', ' * ', ' * ', None),
      (' * ', ' ', '* ', ' * ', ' * ', None),
      (' XX', ' ', '* ', ' * ', ' * ', None),
      ('+FU', '+', 'FU', '+FU', '-FU', '+TO'),
      ('+KY', '+', 'KY', '+KY', '-KY', '+NY'),
      ('+KE', '+', 'KE', '+KE', '-KE', '+NK'),
      ('+GI', '+', 'GI', '+GI', '-GI', '+NG'),
      ('+KI', '+', 'KI', '+KI', '-KI', None),
      ('+KA', '+', 'KA', '+KA', '-KA', '+UM'),
      ('+HI', '+', 'HI', '+HI', '-HI', '+RY'),
      ('+OU', '+', 'OU', '+OU', '-OU', None),
      ('+TO', '+', 'TO', '+FU', '-TO', None),
      ('+NY', '+', 'NY', '+KY', '-NY', None),
      ('+NK', '+', 'NK', '+KE', '-NK', None),
      ('+NG', '+', 'NG', '+GI', '-NG', None),
      ('+UM', '+', 'UM', '+KA', '-UM', None),
      ('+RY', '+', 'RY', '+HI', '-RY', None),
      ('-FU', '-', 'FU', '-FU', '+FU', '-TO'),
      ('-KY', '-', 'KY', '-KY', '+KY', '-NY'),
      ('-KE', '-', 'KE', '-KE', '+KE', '-NK'),
      ('-GI', '-', 'GI', '-GI', '+GI', '-NG'),
      ('-KI', '-', 'KI', '-KI', '+KI', None),
      ('-KA', '-', 'KA', '-KA', '+KA', '-UM'),
      ('-HI', '-', 'HI', '-HI', '+HI', '-RY'),
      ('-OU', '-', 'OU', '-OU', '+OU', None),
      ('-TO', '-', 'TO', '-FU', '+TO', None),
      ('-NY', '-', 'NY', '-KY', '+NY', None),
      ('-NK', '-', 'NK', '-KE', '+NK', None),
      ('-NG', '-', 'NG', '-GI', '+NG', None),
      ('-UM', '-', 'UM', '-KA', '+UM', None),
      ('-RY', '-', 'RY', '-HI', '+RY', None),
      )

  def test_all(self):
    print '[All pieces]'
    for csa, owner, type_, origin, reverse, promote in self.all_pieces:
      print csa, owner, type_, origin, reverse, promote
      p = Piece() if not csa else Piece(csa)
      self.assertEqual(str(p), '%s%s' % (owner, type_))
      self.assertEqual(repr(p), "Piece('%s%s')" % (owner, type_))
      self.assertEqual(p.owner(), owner)
      self.assertEqual(p.type_(), type_)
      self.assertEqual(p.origin(), Piece(origin))
      self.assertEqual(p.reverse(), Piece(reverse))
      self.assertEqual(p.is_promotable(), promote != None)
      if promote:
        self.assertEqual(p.promote(), Piece(promote))

  def test_initialize_error(self):
    print '[Initialize errors]'
    for csa in ('', ' ', '-', 'SPAM', '=FU', '+Fu', 0):
      with self.assertRaises(PieceError) as cm:
        Piece(csa)
      print cm.exception

  def test_modify_error(self):
    print '[Modify error]'
    with self.assertRaises(TypeError) as cm:
      x = Piece('+FU')
      x.csa = '-FU'
    print cm.exception

  def test_delete_error(self):
    print '[Delete error]'
    with self.assertRaises(TypeError) as cm:
      x = Piece('+FU')
      del x.csa
    print cm.exception

  def test_promote_error(self):
    print '[Promote errors]'
    for x in (None, '+', '-'):
      for y in ('OU', 'KI', 'TO', 'NY', 'NK', 'NG', 'UM', 'RY'):
        with self.assertRaises(PieceError) as cm:
          if not x:
            Piece().promote()
          else:
            Piece(x + y).promote()
        print cm.exception
        if not x: break


if __name__ == "__main__":
  unittest.main()


・出力結果(Eclipse + Pydev で実行)

pydev debugger: warning: psyco not available for speedups (the debugger will still work correctly, but a bit slower)
pydev debugger: starting
Finding files... done.
Importing test modules ... done.

[All pieces]
None   *   *   *  None
*    *   *   *  None
XX   *   *   *  None
+FU + FU +FU -FU +TO
+KY + KY +KY -KY +NY
+KE + KE +KE -KE +NK
+GI + GI +GI -GI +NG
+KI + KI +KI -KI None
+KA + KA +KA -KA +UM
+HI + HI +HI -HI +RY
+OU + OU +OU -OU None
+TO + TO +FU -TO None
+NY + NY +KY -NY None
+NK + NK +KE -NK None
+NG + NG +GI -NG None
+UM + UM +KA -UM None
+RY + RY +HI -RY None
-FU - FU -FU +FU -TO
-KY - KY -KY +KY -NY
-KE - KE -KE +KE -NK
-GI - GI -GI +GI -NG
-KI - KI -KI +KI None
-KA - KA -KA +KA -UM
-HI - HI -HI +HI -RY
-OU - OU -OU +OU None
-TO - TO -FU +TO None
-NY - NY -KY +NY None
-NK - NK -KE +NK None
-NG - NG -GI +NG None
-UM - UM -KA +UM None
-RY - RY -HI +RY None
[Delete error]
piece object is read-only
[Initialize errors]
piece type error ('')
piece type error (' ')
piece type error ('-')
piece type error ('SPAM')
piece type error ('=FU')
piece type error ('+Fu')
piece type error (0)
[Modify error]
piece object is read-only
[Promote errors]
unpromotable piece ( * )
unpromotable piece (+OU)
unpromotable piece (+KI)
unpromotable piece (+TO)
unpromotable piece (+NY)
unpromotable piece (+NK)
unpromotable piece (+NG)
unpromotable piece (+UM)
unpromotable piece (+RY)
unpromotable piece (-OU)
unpromotable piece (-KI)
unpromotable piece (-TO)
unpromotable piece (-NY)
unpromotable piece (-NK)
unpromotable piece (-NG)
unpromotable piece (-UM)
unpromotable piece (-RY)
----------------------------------------------------------------------
Ran 5 tests in 0.058s

OK

5.15.2011

Python: TypeError: unhashable type

将棋の駒として、手番+駒の種類を保持するクラスを作る。
そして、そのクラスのインスタンスを持ち駒の数を保持するディクショナリのキーとして使ってみる。

まず単純にクラスを作っただけでは、ディクショナリそのものが正しく動作しない。(KeyError が発生)
これは比較処理においてインスタンスのアドレスが利用されるため。
同じ駒であっても、インスタンスを作るたびにアドレスが変わってしまうため、Key が不定となってしまう。

そこで演算子オーバーロードで「__eq__」、「__ne__」をカスタマイズすると、今度は「unhashable type」エラーが
発生する。
ディクショナリのキーにはハッシュ関数の適用が必須であるためである。

演算子オーバーロードで「__hash__」をカスタマイズ。
これで問題ないかと思ったが、クラスが変更可能なオブジェクトを定義している場合には「__hash__」を定義しては
いけないらしい。ディクショナリの実装においてハッシュ値が変更不能であることが要求されているためで、
オブジェクトのハッシュ値が変化すると、キーが誤ったハッシュバケツに入っていることになってしまうとのこと。
ごもっともな話だ。

最終的に、クラスを文字列やタプルのような immutable な設計にすることとした。
プロトタイピングは以下のような形。

_TURNS = frozenset(['+', '-'])
_PIECE_TYPES = frozenset([
    '* ', 'FU', 'KY', 'KE', 'GI', 'KI', 'KA', 'HI',
    'OU', 'TO', 'NY', 'NK', 'NG', 'UM', 'RY'
    ])
_PIECE_HANDS = frozenset(['FU', 'KY', 'KE', 'GI', 'KI', 'KA', 'HI'])
_PIECE_PROMOTE = {
    'FU':'TO', 'KY':'NY', 'KE':'NK', 'GI':'NG', 'KA':'UM', 'HI':'RY'
    }
_NULL_PIECE = ' * '

class PieceError(Exception): pass

class Piece(object):
  """Manages owner and type of the piece.
  This is an immutable class.
  """
  _mutable = False
  def __init__(self, csa=' * '):
    self._mutable = True
    self.csa = csa
    self._mutable = False

  def __setattr__(self, name, value):
    if self._mutable or name == '_mutable':
      super(Piece, self).__setattr__(name, value)
    else:
      raise TypeError("Can't modify immutable instance")
  def __delattr__(self, name):
    raise TypeError("Can't modify immutable instance")

  def __str__(self):
    return self.csa
  def __repr__(self):
    return 'Piece(%s)' % self.csa
  def __eq__(self, other):
    return self.csa == other.csa
  def __ne__(self, other):
    return self.csa != other.csa
  def __hash__(self):
    return self.csa.__hash__()

  def owner(self):
    return self.csa[0]
  def type_(self):
    return self.csa[1:]
  def promote(self):
    if not self.type_() in _PIECE_PROMOTE.keys():
      raise PieceError('Unpromotable piece (%s)' % self.csa)
    return Piece(self.owner() + _PIECE_PROMOTE[self.type_()])
  def demote(self):
    pass  # now thinking...

参考:
・Python リファレンスマニュアル
http://www.python.jp/doc/2.5/ref/customization.html
・Immutable object
http://code.activestate.com/recipes/577207-immutable-objectsubclass/

Loop without an iterator variable in Python

Python: 変数の不要な繰り返し処理

たとえば文字 x を n 回 print するとき、以下のように書くと「i」が不使用の変数(Unused variable)として警告が出てしまう。

for i in range(n):
  print x

ループ変数を「_」にするのが最もシンプルなアイデアのようだ。

for _ in range(n):
  print x

ただし、対話型プロンプトにおいて、「_」は直前の処理結果を返す命令として定義されている。

>>> 1+2+3
6
>>> _
6

ループ変数とはいえ名前空間が上書きされてしまうため、マナーとして変数名に「_」を使うのは避けるべきということだ。

>>> for _ in range(3): pass

>>> _
2
>>> 1+2+3
6
>>> _
2

結局、使わない変数を定義しても『気にしない』のが現時点の最善らしい。

参考:
・Is it possible to implement a Python for range loop without an iterator variable?
http://stackoverflow.com/questions/818828/is-it-possible-to-implement-a-python-for-range-loop-without-an-iterator-variable

5.14.2011

Enumerations like C 'enum' in Python

Python で enum のような列挙型

Python には constant な定数という概念がない。(immutable はある)

そこで、C言語の enum のようなことをどのように実現するか調べてみた。

>>> class Numbers:
        Zero, One, Two, Three, Four = range(5)
>>> Numbers.Zero
0
>>> Numbers.Three
3

So cool!

参考:
http://www.velocityreviews.com/forums/t322211-enum-in-python.html
http://sla-tmp.blogspot.com/2010/10/pythonenum.html

5.11.2011

Kinect for Windows SDK beta comming in this spring

Kinect for Windows SDK beta 今春公開

X-BOX を持っていないが、何故か Kinect は家にある。

巷に広まる Kinect ハック熱を加速させるであろう Microsoft 社の SDK(Beta版) がまもなく公開されるとのこと。http://research.microsoft.com/en-us/um/redmond/projects/kinectsdk/

MMDだけでは勿体無い、全く新しい感性が花開くとき。

5.10.2011

Multi-workspace in Windows

Windows でのワークスペース切り替え

Windows でも UNIX のようにワークスペース(デスクトップ)を切り替えて使えると非常に便利。
VirtuaWin というソフトで実現できる。

ただし、デュアルモニタ用に使っている「MultiMonitor taskBar」とデフォルトのショートカット
(Ctrl+Alt+[Left, Right])が重なっているので注意。

・VirtuaWin
http://virtuawin.sourceforge.net/

・MultiMonitor taskBar
http://www.mediachance.com/download.htm

5.09.2011

VBScript interactive shell

VBScript: インタラクティブコンソールの実現

同じようなことを発想する人はいるもので。

Python Shell(IDLE)のようなインタラクティブ(対話的)なコード実行を実現するスクリプト。

・VBScript interactive shell
http://www.kryogenix.org/days/2004/04/01/interactiveVbscript

・複数行入力対応対話型シェル
http://180.cocolog-nifty.com/blog/2011/03/post-0176.html

5.05.2011

Assigning double-click to a multi-button mouse in Ubuntu

Ubuntu: 多ボタンマウスにダブルクリックを割り当て

Logicool の MX-400 の親指ボタンにダブルクリックを割り当てるため悪戦苦闘。

btnx も試してみたが、うまくいかなかったので「xbindkeys」+「xte」ユーティリティの組み合わせ
を使うことにした。

「xte」は「xautomation」をインストールすれば使える。(xvkbdはキーストローク登録用)
# apt-get install xbindkeys xautomation xvkbd

・bindkeys 設定ファイル(~/.xbindkeysrc)

"/usr/bin/xvkbd -xsendevent -text "\C\[Page_Up]""
  m:0x00 + b:6
"/usr/bin/xvkbd -xsendevent -text "\C\[Page_Down]""
  m:0x00 + b:7
"/usr/bin/xte 'mouseup y' 'mouseclick 1' 'mouseclick 1' &"
  m:0x00 + b:8 + release
"/usr/bin/xvkbd -xsendevent -text "\Cw""
  m:0x00 + b:9

上記の例では、チルトを「Ctrl」+「Page Up」、「Ctrl」+「Page Down」(主にFireFoxのタブ切り替え)、
親指ボタンの「進む」ボタンを「Ctrl」+「W」(タブを閉じる)、「戻る」ボタンをダブルクリックに割り当てている。

参考:
btnx
http://chirijiri.blog17.fc2.com/blog-entry-110.html
xautomation
http://ubuntuforums.org/showthread.php?t=316441

p.s. 世界コンピュータ将棋選手権決勝を見に早稲田へ行ってきました。

5.04.2011

Customizing Ubuntu 11.04 pt.2

Ubuntu 11.04 カスタマイズ その2

・ディレクトリ構造を英語に変更
$ LANG=C xdg-user-dirs-gtk-update

・ログインシェルを ksh に変更
・「端末」の設定でログインシェルを使うよう設定
・~/.profile の編集
 export EDITOR=vi
 export LIBOVERLAY_SCROLLBAR=0
 ※オーバーレイ・スクロールバーをやめて、従来のものに戻す。
  そうしないとeclipseなどで不具合発生。

・不要な表示の削除
 $ sudo apt-get remove indicator-me indicator-messages

・Python の開発用に IDLE を導入

参考
http://d.hatena.ne.jp/Syo-Takasaki/20100517/1274076382
http://ubuntu4beginners.blogspot.com/2011/04/disable-overlay-scrollbars-in-ubuntu.html
http://shortrecipes.blogspot.com/2010/04/ubuntu-1004-how-to-remove-chat-and-mail.html

5.03.2011

Customizing Ubuntu 11.04

Ubuntu マシンのカスタマイズ

今日やったことのメモ。

・メール設定

・オーディオカード設定
 M-Audio Delta1010のドライバは追加インストール不要だった。

・Bansheeメディアプレーヤー設定
 NAS上の楽曲をいくつかインポート。

・FireFox設定
 アドオン(マウスジェスチャー、KeyConfig、AutoPager)追加
 マウスホイールのスクロール量を調整
 http://blog.livedoor.jp/love_eames2/archives/50993175.html

・マウス設定
 Logicool MX400のマウスボタンを割り当て
 http://retujyou.com/2008/04/12/ubuntu-5button-mouse/
 https://wiki.ubuntulinux.jp/UbuntuTips/Hardware/ExtensionOfMouseButtonWithXbindkeysAndXvkbd

・デスクトップ上のユーザ名を非表示にする
 http://blog.mypapit.net/2011/05/remove-username-memenu-ubuntu-natty-1104.html
 $ gconftool -s /system/indicator/me/display --type int 0

・Empathyの削除
 http://ubuntuforums.org/showthread.php?t=1371087

・Windowsマシンへのリモートデスクトップ
 https://wiki.ubuntulinux.jp/UbuntuTips/Desktop/RemoteU2W

5.02.2011

Assigning 'henkan' and 'muhenkan' key to Mozc(Google Japanese Input) in Ubuntu

Ubuntu: Mozc(Google日本語入力)における「変換」「無変換」キーの割り当て

まず設定の「一般」タブから「言語パネルの表示」を「アクティブである時」または「常に表示する」に変更。

言語バーが出るようになったら、MS-IME等のテンプレートをファイルにエクスポート。
そのファイルに以下のような内容を追記し、今度はインポートする。

・「変換」キーにIMEオン、「無変換」キーにIMEオフを割り当てる例

DirectInput    Henkan    IMEOn
Precomposition    MuHenkan    IMEOff
Composition    MuHenkan    IMEOff
Suggestion    MuHenkan    IMEOff
Conversion    MuHenkan    IMEOff

※各フィールドはタブ区切り

参考:
http://d.hatena.ne.jp/yuyunko/20100715/1279190426

5.01.2011

Installing Ubuntu 11.04 via network boot

ネットワークブートによる Ubuntu 11.04 のインストール

Windows Vista マシンのパーティションを削って(EASEUS Partition Master による)、デュアルブート環境としてUbuntuを導入した。その備忘録。

1. 準備

PXE(Preboot Execution Environment)ブートを行うためには、あらかじめ同一ネットワーク上にDHCPサーバとTFTPサーバが存在し、正しく設定されている必要がある。
この手順は対象マシンとは別の、構築済みのUbuntuマシン上で行った。今回は以下のパッケージを利用。
DHCPサーバ: dhcp3-server
TFTPサーバ: tftpd-hpa

 

1.1 DHCPサーバの設定

・DHCPサーバのインストール
# apt-get install dhcp3-server

(中略)

Generating /etc/default/dhcp3-server...
* Starting DHCP server dhcpd3                                                                                               
* check syslog for diagnostics.
                                                                                                                       [fail]
invoke-rc.d: initscript dhcp3-server, action "start" failed.

エラーが出てしまうが、これは「/etc/dhcp3/dhcpd.conf」を修正すればよい。
・修正前
# A slightly different configuration for an internal subnet.
#subnet 10.5.5.0 netmask 255.255.255.224 {
#  range 10.5.5.26 10.5.5.30;
#  option domain-name-servers ns1.internal.example.org;
#  option domain-name "internal.example.org";
#  option routers 10.5.5.1;
#  option broadcast-address 10.5.5.31;
#  default-lease-time 600;
#  max-lease-time 7200;
#}

・各環境のネットワーク設計に準じた修正を行い、さらにPXEの設定(青文字部分)を追加。
(例)ネットワークアドレス                :192.168.1.0/24
DHCP割り当て用アドレス         :192.168.1.240~249
デフォルトルータ、DNSサーバ    :192.168.1.1
TFTPサーバ(つまりこのサーバ):192.168.1.121
# A slightly different configuration for an internal subnet.
subnet 192.168.1.0 netmask 255.255.255.0 {
  range 192.168.1.240 192.168.1.249;
  option domain-name-servers 192.168.1.1;
  option domain-name "local";
  option routers 192.168.1.1;
  option broadcast-address 192.168.1.255;
  default-lease-time 600;
  max-lease-time 7200;
  next-server 192.168.1.121;
  filename "pxelinux.0";

}

  ・DHCPサーバの起動
# /etc/init.d/dhcp3-server start
* Starting DHCP server dhcpd3                                                                                         [ OK ]
# /etc/init.d/dhcp3-server status
Status of DHCP server: dhcpd3 is running.

    ※環境によっては、dhcp3-server → isc-dhcp-server、/etc/dhcp3/dhcpd.conf → /etc/dhcp/dhcpd.conf
  となるようなので、適宜読み替える。

 

1.2 TFTPサーバの設定

・TFTPサーバ、ならびにTFTPクライアントのインストール

# apt-get install tftpd-hpa tftp-hpa

・TFTPルート(デフォルトは/var/lib/tftpboot)へ資産配備 ※今回はUbuntu 11.04・64ビット版を配備
# cd /var/lib/tftpboot
# wget http://archive.ubuntu.com/ubuntu/dists/natty/main/installer-amd64/current/images/netboot/netboot.tar.gz
# zcat ./netboot.tar.gz |tar xvf -

参考:
Ubuntu 11.04 ダウンロード先
http://cdimage.ubuntu.com/netboot/11.04/
PXE設定手順
http://myy.haaga-helia.fi/~karte/ubuntu_pxe.html

 

2. インストール

 

2.1 テキストベースのセットアップ

対象のマシンの電源を投入し、BIOSの起動中に F12 キーを押してネットワークブートする。
ブート後の手順は以下のとおり。
Installer boot menu => install
[!!] Select a language => Japanese - 日本語
[!] Select a language
    インストーラの翻訳は、選択された言語では完全ではありません。
    (中略)
    選択された言語でインストールを続けますか? => はい
[!] 場所の選択 => 日本
[!] Configure the keyboard
    Detect keyboard layout? => いいえ
[!] Configure the keyboard => Japan => Japan
<ネットワークの認識>
[!] ネットワークの設定
※DHCPと認識された場合は、ここで戻って手動設定をし直す
    => 戻る
[?] Ubuntu インストーラメインメニュー => ネットワークの設定
[?] ネットワークの設定
    DHCP でネットワークを自動的に設定していますか? => いいえ
[!!] ネットワークの設定
    IPアドレス => (IPアドレス)
    ネットマスク => (ネットマスク)
    ゲートウェイ => (ゲートウェイ)
    ネームサーバアドレス => (ネームサーバアドレス)
    この情報で正しいですか? => はい
    ホスト名 => (ホスト名)
    ドメイン名 => (ドメイン名)
[!] Ubuntu アーカイブのミラーを選択 => 日本 => jp.archive.ubuntu.com
    HTTP プロキシの情報 => (空)
<コンポーネントのダウンロード>
[!] 時間の設定
    ... your time zone is Asia/Tokyo => はい
[!!] ディスクのパーティショニング => 手動
    => 空き領域を選択
    空き領域の利用方法 => ガイドによるパーティショニング
    (ext4ファイルシステムおよびスワップ領域が作成)
    => パーティショニングの終了とディスクへの変更の書き込み
    ディスクに変更を書き込みますか? => はい
<ベースシステムをインストールしています>
[!!] ユーザーとパスワードのセットアップ
    新しいユーザの本名 (フルネーム) => (空)
    あなたのアカウントのユーザ名 => (ユーザ名)
    新しいユーザのパスワードを選んでください => (パスワード)
    確認のため、再度パスワードを入力してください => (パスワード)
    (脆弱なパスワードだと確認が入る)
    ホームディレクトリを暗号化しますか? => いいえ
<ソフトウェアの選択とインストール>
[!] discover を設定しています => 自動的にアップデートしない
[!] ソフトウェアの選択 => Ubuntu desktop のみ選択
    (30分程度かかった)
[!] grub-pc を設定しています
    マスターブートレコードにGRUBブートローダをインストールしますか? => はい
[!] インストールの完了 => 続ける

 

2.2 インストール後の作業

・root ユーザのパスワード設定
$ sudo passwd
$ su -                     ※確認
・必要なソフトウェアの追加インストール(とりあえず)
Google 日本語入力(Mozc)
# apt-get install ibus-mozc
参考:http://aruneko.sora-blue.net/archives/1131