2012/04/16

OneNoteでハイパーリンクをクリックするとエラーメッセージが出る

OneNoteでハイパーリンクをクリックすると、
(自環境はWindows7、OneNote 2010、IE9)
「このコンピュータに設定されている制約のため、この操作は中止されました。システム管理者に問い合わせてください」
というエラーがでる。
 
調べた結果、Outlookでも起きる現象で、
原因は一概には言えないようだが、ブラウザをインストール/削除をすることで(レジストリ等の)環境が壊れて起きるっぽい。
 
解決策が下記で
http://support.microsoft.com/kb/310049/ja
  1. IEの設定をリセットして、既定ブラウザに設定する => 再起動
  2. レジストリ設定を他のコンピュータからインポートする => 再起動
  3. Microsoft Fix it 50388を使う => 再起動
の何れかで、直ったり直らなかったりするらしい。
で、結局1では直らず、3で直りました。

以下のサイトが参考になりました。

パソコンのツボ ~OfficeのTIP:"このコンピュータに設定されている制約のため、この操作は中止されました。システム管理者に問い合わせてください"というエラーがでて、ハイパーリンクが機能しない

2012/03/30

ビットの逆転

ビットを逆順にする。
1011 => 1101

ふつう思いつくのはこんな感じ?
unsigned long BitReversal(unsigned long src, char bit/*=32*/)
{
  unsigned long reversed = 0;
  for(int i=1; i<(bit+1); ++i) {
    if(src & 1)
      reversed |= (1 << (bit-i));
    src >>= 1;
  }
  return reversed;
}
元の値の最下位ビットが1なら、先頭から数えた現在位置に1立てる。
元の値を1ビットシフト。

ビット逆順の妙義
ループを使わないし、分岐もない。
元ネタはハッカーのたのしみ」という本(Hacker's Delight

unsigned rev(unsigned x){
  x = (x & 0x55555555) << 1 | (x >> 1) & 0x55555555;
  x = (x & 0x33333333) << 2 | (x >> 2) & 0x33333333;
  x = (x & 0x0F0F0F0F) << 4 | (x >> 4) & 0x0F0F0F0F;
  x = (x << 24) | ((x & 0xFF00) << 8) |
    ((x >> 8) & 0xFF00) | (x >> 24);
  return x;
}
なんだこれ。


その他、逆転の妙義
Bit Twiddling Hacks
http://graphics.stanford.edu/~seander/bithacks.html

どうすれば、こんなことを思いつけるようになるのか。

2012/03/19

Redmineのバックアップ

バックアップ方法
http://redmine.jp/faq/system_management/backup/

対象は2つ
  1. データベース
  2. 添付ファイル

データベース

MYSQL
mysqldumpコマンドでダンプデータを取得する。
SQLite
データベースファイル(config/database.yml内のdatabaseで指定されているファイル)をコピー

添付ファイル

データベースのほかに、チケットやWikiなどで添付されたファイルもバックアップする必要がある。
保存場所は、
Redmineインストールディレクトリ以下のfilesディレクトリ
…らしいのだが、自分の環境では下記にあった。なんで?
/var/lib/redmine/default/files

参考:添付ファイルの格納場所
よかろうもん!::Redmineのファイル保存先を変更する

シェルスクリプトで日毎バックアップする

cronで。
Agenda Labs::Redmineの自動バックアップ設定

2012/03/16

UbuntuへRedmineをインストールする

環境

VirtualBox4.1x
Ubuntu 11.10 Desktop

目的

RedmineをApache2にPassengerでMySQLを使う(壊れた日本語)

インストール

紆余曲折あったが、公式通りでOKでした。

幾つかの実行環境Passenger(Apache上でRuby on Railsアプリを動かす)、WEBrick(RubyのHTTP Webサーバー)、mod_cgiがあり、今回はPassengerで行う。

また、データベースもMySQL、PostgreSQL、SQLite3を選べるが、今回はMySQLで。

前提としてLAMP環境が整っている事。

まずPassenger
$ sudo apt-get install libapache2-mod-passenger

たぶんセキュリティを停止してるんだと思う。
$ sudo apt-get install apparmor-utils
$ sudo aa-complain /usr/sbin/mysqld
Setting /usr/sbin/mysqld to complain mode.

Redmine本体。MySQLで動かすパッケージも。
$ sudo apt-get install redmine-mysql redmine

リンクを張る。
$ sudo ln -s /usr/share/redmine/public /var/www/redmine

Passengerの設定
/etc/apache2/mods-available/passenger.conf
に以下を追加する。
PassengerDefaultUser www-data
こんな感じ
$sudo nano /etc/apache2/mods-avilable/passenger.conf

<IfModule mod_passenger.c>
  PassengerDefaultUser www-data  
  PassengerRoot /usr
  PassengerRuby /usr/bin/ruby
</IfModule>

apache2の設定にも
/etc/apache2/sites-available/default

<Directory /var/www/redmine>
    RailsBaseURI /redmine
    PassengerResolveSymlinksInDocumentRoot on
</Directory>
を追加する
$ sudo nano /etc/apache2/sites-available/default
<VirtualHost *:80>
  # 省略 
  <Directory /var/www/redmine>
      RailsBaseURI /redmine
      PassengerResolveSymlinksInDocumentRoot on
  </Directory>
</VirtualHost>

セキュリティをもとに戻しているんだと思う。
$ sudo aa-enforce /usr/sbin/mysqld
Setting /usr/sbin/mysqld to enforce mode.

passengerを有効に。
$ sudo a2enmod passenger
Module passenger already enabled

apache2再起動。
$ sudo service apache2 restart
 * Restarting web server apache2
apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1 for ServerName
 ... waiting apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1 for ServerName [ OK ]

http://localhost/redmine
にアクセス、表示されるハズ。

もし「403 Forbidden」なら
$ sudo chmod a+x /usr/share/redmine/public
で解決するハズ。

初期値でID:admin, PASSWORD:admin でログインできる。

日本語化

adminの表示言語を変えるには
adminでログインして右上にある[my account]をクリック
[Language]をEnglishからJapaneseに変更して[Save]
その場で表示が日本語になるハズ。
http://redmine.jp/tech_note/first-step/admin/admin-user-language/

他、デフォルトで表示される言語を変更するには、adminでログイン後、
上部メニューの[Administration]でSettings>[Display]タブ>[Default language: English]から[Japanese]へ変更して[Save]

その他の参照

Ubuntu 10.10 に Redmine をインストールする

UbuntuにVirtualBox Guest Additionsをインストールする

環境

VirtualBox4.11
Ubuntu 11.10 Desktop

Guest Additionsの機能

・マウスカーソルの透過的な移動
・シームレスウィンドウを使えるようになる
(ウィンドウ単位での表示)
・解像度の選択が広がる
・ホスト時刻と同期できるようになる
・共有フォルダが使えるようになる
・クリップボードの共有を共有できる

インストール

Ubuntuを起動し、
VirtualBoxのメニューからデバイス>Guest Additionsをインストールする を選ぶ
VBOXADDITIONS_4.1.X CDがマウントされ開かれる。
そこで”オートランの問い合わせ”というのが表示されるので開く。

実行してよいか聞かれるので「実行する」

root特権が必要なので、パスワード認証をする。

ビルドが始まり、終了すると「Press Return to close this window...」と表示されるので、[enter]を押して閉じる。

最後に反映させる為に再起動する。


ホストOSのWindows7との間でクリップボードの共有が出来てなかったのですが、Guest Additionsを導入して出来る様になりました。

参考
大人になったら肺呼吸::UbuntuにVirtualBox Guest Additionsをインストールする方法
sis's memo blog::VirtualBox導入の怪

VirtualBoxのネットワーク設定

仮想マシンの設定>ネットワーク

ネットワークアダプタは最大で4つまで使用できる。
割り当てにはいくか種類があり、デフォルトでNATが選択されている。
  • 未割り当て
  • NAT
    ゲストOSからインターネットは繋がるが、ホストOS間は繋がらない。
  • ブリッジアダプタ
    ゲストOSがホストOSと同じネットワークにつながる。
    インターネットに繋がり、ゲストOSとホストOSの間がつながる。
    同じネットワーク上の他のPCからも見える。
  • 内部ネットワーク
    仮想マシンを複数起動したときに、各マシン間を繋ぐためのネットワークらしい。
  • ホストオンリーアダプタ
    ホストOSとゲストOS間のネットワーク。
  • Generic Driver
がある

つまり標準で、ゲストOSはインターネットはできるけども、ホストOSとは繋がっていない。
で目的としては
  • ゲストOSがインターネットに繋がる
  • ゲストOSとホストOSが繋がる
なので、ブリッジ接続かなと思ったらハマった。
 結論としてはアダプタを2つにし、NATホストオンリーアダプタにする。
これでUbuntuを起動して確認。

$ sudo route
カーネルIP経路テーブル
受信先サイト    ゲートウェイ    ネットマスク   フラグ Metric Ref 使用数 インタフェース
default         10.0.2.2        0.0.0.0         UG    0      0        0 rename2
10.0.2.0        *               255.255.255.0   U     1      0        0 rename2
link-local      *               255.255.0.0     U     1000   0        0 rename2
192.168.56.0    *               255.255.255.0   U     1      0        0 eth1

$ ifconfig
eth1      Link encap:イーサネット  ハードウェアアドレス 08:00:27:59:22:7e  
          inetアドレス:192.168.56.102  ブロードキャスト:192.168.56.255  マスク:255.255.255.0
          inet6アドレス: fe80::a00:27ff:fe59:227e/64 範囲:リンク
          UP BROADCAST RUNNING MULTICAST  MTU:1500  メトリック:1
          RXパケット:16 エラー:0 損失:0 オーバラン:0 フレーム:0
          TXパケット:70 エラー:0 損失:0 オーバラン:0 キャリア:0
          衝突(Collisions):0 TXキュー長:1000 
          RXバイト:2549 (2.5 KB)  TXバイト:11278 (11.2 KB)

lo        Link encap:ローカルループバック  
          inetアドレス:127.0.0.1  マスク:255.0.0.0
          inet6アドレス: ::1/128 範囲:ホスト
          UP LOOPBACK RUNNING  MTU:16436  メトリック:1
          RXパケット:0 エラー:0 損失:0 オーバラン:0 フレーム:0
          TXパケット:0 エラー:0 損失:0 オーバラン:0 キャリア:0
          衝突(Collisions):0 TXキュー長:0 
          RXバイト:0 (0.0 B)  TXバイト:0 (0.0 B)

rename2   Link encap:イーサネット  ハードウェアアドレス 08:00:27:96:ea:6c  
          inetアドレス:10.0.2.15  ブロードキャスト:10.0.2.255  マスク:255.255.255.0
          inet6アドレス: fe80::a00:27ff:fe96:ea6c/64 範囲:リンク
          UP BROADCAST RUNNING MULTICAST  MTU:1500  メトリック:1
          RXパケット:25 エラー:0 損失:0 オーバラン:0 フレーム:0
          TXパケット:98 エラー:0 損失:0 オーバラン:0 キャリア:0
          衝突(Collisions):0 TXキュー長:1000 
          RXバイト:3522 (3.5 KB)  TXバイト:13346 (13.3 KB)

firefoxを起動してインターネットにも繋がる事も確認。


またホストOSからpingを飛ばしてみる。
> ping 192.168.56.102

192.168.56.102 に ping を送信しています 32 バイトのデータ:
192.168.56.102 からの応答: バイト数 =32 時間 <1ms TTL=64
192.168.56.102 からの応答: バイト数 =32 時間 <1ms TTL=64
192.168.56.102 からの応答: バイト数 =32 時間 <1ms TTL=64
192.168.56.102 からの応答: バイト数 =32 時間 <1ms TTL=64

ちなみにもう一方のアダプタ(NATの方)へは飛ばない。
> ping 10.0.2.15

10.0.2.15 に ping を送信しています 32 バイトのデータ:
要求がタイムアウトしました。
要求がタイムアウトしました。
要求がタイムアウトしました。
要求がタイムアウトしました。
10.0.2.15 の ping 統計:
    パケット数: 送信 = 4、受信 = 0、損失 = 4 (100% の損失)、

参考
もやし日記::VirtualBox 2.2 と CentOS 5.3 でローカル開発環境

VirtualBoxで新規マシンを作成し、Ubuntu Desktop CDからインストールする

http://www.ubuntulinux.jp/download/ja-remix-cd
ISOファイルをダウンロードしてくる。

ダウンロードしたのは、現時点でのバージョンは11.10。
ubuntu-ja-11.10-desktop-i386.iso

VirtualBoxを起動し
  • 新規(N) をクリック、ウィザードが起動するので[次へ]
  • 仮想マシン名とOSタイプ
    名前をつけ、OSタイプをLinux, Ubuntuを選択、[次へ]
  • メモリ
    サイズを選択、[次へ]
  • 仮想ハードディスク
    新規ハードディスク作成を選択、[次へ]
作成を選ぶと、新規仮想ディスクの作成ウィザードが開始される。
  • 新規仮想ディスクの作成
    VDI(VirtualBox)
    VMDK (VMware)
    VHD(VirtualPC)
    HDD(Paralles=Mac)
    特に理由がなければ、VDIで良いと思う。選択したら[次へ]
  • Virtual disk storage details
    ストレージタイプを選択
    Dynamically alocatedは、ゲストOSで実際に使われた分だけ、ホストOS側のハードディスクが使われる(スパースファイル)
    Fixed sizeは、指定サイズが即座に占有される。
  • Virtual disk file location and size
    保存場所とサイズを決めて、[次へ]
  • 概要
    [Create]で仮想ハードディスクのウィザードが完了。
新規仮想ディスクの作成ウィザードが終わり、新規仮想マシン作成ウィザードに戻る。
  • 新規仮想マシン作成::概要
    [Create]で仮想マシンが作成されウィザードが完了。
作成された仮想マシンを起動すると、初回起動ウィザードが開始される。
  • インストールメディアを選択
    メディアソースをプルダウンから選択するか、右にあるフォルダアイコンでISOファイルなど仮想CD/DVDファイルを選択できるので選択する。
    今回は下記を選び、[次へ]
    ubuntu-ja-11.10-desktop-i386.iso
  • 概要
    [起動]でウィザード完了、仮想マシンが起動される。

ubunuのインストーラーが起動するので、セットアップしていく
(特に迷う要素はないハズ)


インストール完了後、ゲストOSの再起動が必要。
インストールメディアがマウントされたままだと注意されるので、外して[enter]
(メニュー>デバイス>CD/DVDドライブ>仮想ドライブからディスクを除去)


仮想マシンの保存先は下記:
C:\Users\<ユーザー名>\VirtualBox VMs

Ubuntu配布のVHDを利用する

 http://www.ubuntulinux.jp/download/ja-remix-vhd
Ubuntuからダウンロードしたファイルを解凍する。

VirtualBoxを起動>新規>
  • 名前を付けてOSタイプをLinux、Ubuntuにして、[次へ]
  • メモリサイズを決めて、[次へ]
  • 既存のハードディスクを使用を選択し、回答したVHDファイルを選択して[次へ]
  • 概要が示されるので良ければ[Create]
以上。

名前を「Ubuntu~」とかにすると、自動的にOSタイプがLinux、Ubuntuになる。
芸が細かい。


仮想マシンを起動するとUbunteが起動し
  • 言語選択
  • 地域選択
  • キーボード選択
  • ユーザー名とパスワード、コンピュータ名の設定
以上でUbuntuが起動する。
なんて楽なんだ・・・!

Ubuntuを使う

恥ずかしながらLinuxはさっぱりわからない。

大昔、学生時代に、ちょっとしか触ったことがない。
しかも黎明期、まだNICドライバすらままならない時代にTurboLinuxを泣きながらDECのPCに入れてた。

あの頃は、インストールすることが目的になっていて、ログインしてネットワークが繋がった時点で、大変な達成感があり、そのあと触ることがなかった…

…あの頃に比べると今はなんと楽な事か!
と思って、Linuxをちょっと触ってみようと思いました。

そんな訳で、今現在、本屋にいって情報量が多かったのは
FedoraCentOSUbuntu といった所。
(RHL系とDebian系で系列が違う、ぐらいしかわからん)

そんな中でホビーユース的に情報が多そうだったのがUbuntuだったので、これを使ってみてみることにした。

目標は
  • WEBアプリとを試すためのLAMP
  • ソフトウェアRAID
  • SambaでNAS
的な事。
とりあえず、いきなりCUIは厳しいので Ubuntu Desktop から入って Server へ移行する方向で。

VirtualBoxの導入

今まではメインでVMwareを使っていたが、乗り換えてみることにした。

https://www.virtualbox.org/
使おうと思ったきっかけ
  • 無料でスナップショットが使える
  • UbunteでVirutalBox用のVHDを配布してるから
無料でスナップショットが使えるというのが最大の理由。
2つめは背中を押された理由。

VMwareのようなユーザー登録もなく、ダウンロードできる。
インストールや設定は以下を参考にした。
http://vboxmania.net/

インストール後、エクステンションパックを導入する。
  • USB2.0ホストコントローラー
  • リモートデスクトップ機能
  • PXEブートローダー(E1000)
が追加されるので入れておく。
ファイル>環境設定>機能拡張 で右側の[パッケージ追加]を押し、予めダウン
ロードしておいたエクステンションパックを選択すればOK。
エクステンションパック導入後

2012/03/01

const char * => LPWSTR 変換

変換マクロを使えば簡単。
#include <atlconv.h>
...
USES_CONVERSION;  // コインパイルエラーを避ける為のマクロ

std::string str = "Hello, world!";
CA2W pszWide(str.c_str());

// または直接
LPWSTR x = CA2W(str.c_str());
UTF-8なら
CA2W pszWide(str.c_str(), CP_UTF8);

参考/引用

例外は参照渡しで受け取る

大本ネタは「More Effective C++」§13。

catch節で例外オブジェクト受け取るには、ポインタ、値、参照渡しの3つの方法がある。
結論は参照渡しで受け取るのがベスト

ポインタ渡し

効率が良いが、ポインタが指し示す例外オブジェクトの保証が必要。
void func() {
  exception e;  // ローカル。スコープから出たら破棄される。
  ...
  throw &e; // 破棄されるオブジェクトのポインタを投げる事になる。
}
(受け取った時)例外オブジェクトは誰が破棄するのか不透明。
static exception e;
throw &e;
throw new exception;

値渡し

例外が発生するたびに2回コピーされる(ので生成処理が2回発生する)
基底クラスのオブジェクトとして受け取ると、派生クラスのデータは欠落する。

参照

例外のコピーは1回で済む。派生クラスのデータも欠落しない。
try {
  throw exception();
}
catch (exception& e) {
  cerr << e.what() << endl;
}

参考/引用