-->

2012-12-09

memo: isbn

http://ja.wikipedia.org/wiki/ISBN
http://www.linein.org/blog/2007/01/05/convert-isbn10-to-isbn13-with-php/
http://d.hatena.ne.jp/hhelibex/20101001/1285960903

これは上記のサイトのphpのテストです。
"..."の内容は上記のサイトにあります。

<?php
/**
 * ISBN(ISBN-10、ISBN-13)をチェックするユーティリティ。
 * 
 * @author hhelibex
 * @see http://ja.wikipedia.org/wiki/ISBN
 */
class ISBNUtil {
...
}

/**
 * Convert ISBN10 to ISBN13 with PHP
 * 
 * @see http://www.linein.org/blog/2007/01/05/convert-isbn10-to-isbn13-with-php/
 */
function genchksum13($isbn) {
...
}

if (defined("STDIN"))
{
    // usage //
    $list = array(
        '1234567890',
        "4061592998",
        "978-4061592995",
        "4906732135",
        "978-4906732135",
        "978-4-286-13043-9",
        );
    $result = array();

    foreach ($list as $str)
    {
        $isbn13 = "";
        $maybeIsbn = "";

        print "\n" . str_repeat("=", 70) . "\n";

        $maybeIsbn = preg_replace("/[^0-9]/", "", $str);

        switch (true)
        {
        case ISBNUtil::isValidISBN10($maybeIsbn):
            print "\"{$maybeIsbn}\" is isbn10\n";

            echo $isbn13 = isbn10_to_13($maybeIsbn); // returns ISBN13
            print "\n";
            var_dump(ISBNUtil::isValidISBN13($isbn13));
            break;

        case ISBNUtil::isValidISBN13($maybeIsbn):
            print "\"{$maybeIsbn}\" is isbn13\n";
            $isbn13 = $maybeIsbn;
            break;

        default:
            trigger_error("\"{$maybeIsbn}\" is not isbn.", E_USER_NOTICE);
        }

        $result[] = array(
            "original" => $str,
            "converted" => $isbn13,
            );
    }

    print "\n// check\n";

    foreach ($result as $key1 => $val1)
    {
        print "\n" . str_repeat("=", 70) . "\n";
        print "\$key1 = {$key1}\n";
        print "\$val1[\"original\"] = {$val1["original"]}\n";
        print "\$val1[\"converted\"] = {$val1["converted"]}\n";

        foreach ($result as $key2 =>$val2)
        {
            if ($key1 !== $key2 && $val1["converted"] === $val2["converted"])
            {
                print "{$val1["original"]} == {$val2["original"]}\n";
            }
        }
    }
}

2012-12-02

memo: session.upload-progress

これはphpのsession.upload-progressのサンプルです。

# .htaccess

# テストで1GBぐらいまでOKにする。
php_value       post_max_size 1024M
php_value       upload_max_filesize 1024M

# アップロードが終わっても情報を残す。
php_value       session.upload_progress.cleanup Off

<?php
/**
 * アップロードのサンプル
 * 
 * php5.3以上
 */

function return_bytes($val)
{
    $val = trim($val);
    $last = strtolower($val[strlen($val)-1]);
    switch($last)
    {
        // 'G' は PHP 5.1.0 以降で使用可能です
    case 'g':
        $val *= 1024;
    case 'm':
        $val *= 1024;
    case 'k':
        $val *= 1024;
    }
    return $val;
}
function MAIN()
{
    session_start();

    $fileName = basename(__FILE__);

    $uploadProgressName = "001";
    $uploadProgressId = ini_get("session.upload_progress.prefix") . $uploadProgressName;
    $uploadFile = "/tmp/abc.txt";
    $allowExt = array(
        "maxFileSize" => return_bytes(ini_get("upload_max_filesize")),
        "uploadProgressNameKey" => ini_get("session.upload_progress.name"),
        "uploadProgressNameValue" => $uploadProgressName,
        "allowExt" => array("jpg", "png", "gif", "iso"),
        );
    $action = isset($_REQUEST["action"]) ? $_REQUEST["action"] : "default";

    switch ($action)
    {
    case "uploadResult":
      print `ls -l --time-style="+%Y-%m-%d %H:%M:%S" {$uploadFile} && md5sum {$uploadFile}`;
      exit;

    case "getConfig":
        print json_encode($allowExt);
        exit;

    case "status":
        printf("%d", 100 * $_SESSION[$uploadProgressId]["bytes_processed"] / $_SESSION[$uploadProgressId]["content_length"]);
        exit;

    case "upload":
        if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadFile))
        {
            echo "File is valid, and was successfully uploaded.\n";
        }
        else
        {
            echo "Possible file upload attack!\n";
        }
        exit;

    case "default":
        break;

    default:
        trigger_error("unknown action={$action}.", E_USER_ERROR);
    }

  return array($fileName, $uploadProgressId, $uploadFile);
}

list($fileName, $uploadProgressId, $uploadFile) = MAIN();

?>
<html>
 <head>
  <meta content='IE=100' http-equiv='X-UA-Compatible'/>
  <meta content='text/css' http-equiv='Content-Style-Type'/>
  <meta content='text/javascript' http-equiv='Content-Script-Type'/>
  <meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>
  <title></title>
  <script src="/js/jquery-1.8.3.min.js"></script>
  <script>
(function(){

  $(document).ready(function(){
    var waitTime = 500;
    var minWaitTime = 250;
    var fileName = function(){
      var url = window.location.pathname;
      return url.substring(url.lastIndexOf('/')+1);
    }();

    $.ajaxSetup({cache:false});

    $("form[id^=uploadProgress]").each(function(){
      var formId = $(this).attr("id");
      var formElem = $("#" + formId);
      var buttonElem = $("#" + formId + "Button");
      var inputFileElem = $("#" + formId + "InputFile");
      var barElem = $("#" + formId + "Bar");
      var messageElem = $("#" + formId + "Message");
      var config;
      var setButtonElem = function(){
        setTimeout(function(){
          if (config)
          {
            buttonElem.click(function(){
              inputFileElem.click().focus();
            });
            var inputHiddenElem = $(document.createElement("input")).attr("type", "hidden");
            formElem.prepend(inputHiddenElem.clone().
                           attr("name", config.uploadProgressNameKey).
                           attr("value", config.uploadProgressNameValue));
            formElem.prepend(inputHiddenElem.clone().attr("name", "MAX_FILE_SIZE").attr("value", config.maxFileSize));
          }
          else
          {
            setButtonElem();
          }
        }, 1000);
      };

      $.getJSON(fileName, {action:"getConfig"}, function(json){
        config = json;
        messageElem.text("拡張子: " + config.allowExt.join(", "));
      });

      setButtonElem();

      inputFileElem.change(function(){
        var startPercent = 0;
        var reloadStatus = function(){
          setTimeout(function(){
            $.get(
              fileName, {action:"status"},
              function(data, status, XHR)
              {
                var dataInt = parseInt(data, 10);
                var endPercent = dataInt;
                if (startPercent !== 0)
                {
                  if ((endPercent - startPercent) > 5)
                  {
                    waitTime = Math.max(parseInt(waitTime / 2, 10), minWaitTime);
                  }
                  else
                  {
                    waitTime = waitTime * 2;
                  }
                }

                startPercent = endPercent;

                if (!isNaN(dataInt))
                {
                  barElem.html(String(dataInt) + "%");
                  if (dataInt >= 0 && dataInt < 100)
                  {
                    reloadStatus();
                  }
                  else if (dataInt == 100)
                  {
                    $.get(fileName, {action:"uploadResult"},
                          function(data, status, XHR)
                          {
                            messageElem.text("アップロード完了: \n" + String(data)).css("white-space", "pre");
                          });
                  }
                }
              }
            );
          }, waitTime);
        };

        if (-1 == $.inArray($(this).attr("value").replace(/^.*\.([^.]+)$/, "$1").toLowerCase(), config.allowExt))
        {
          messageElem.text("拡張子エラー: " + $(this).attr("value"));
          return;
        }

        buttonElem.css("display", "none");
        formElem.submit();
        barElem.html("0%");

        reloadStatus();
      });
    });
  });
})();
  </script>
 </head>
 <body>

  <a href="<?=$fileName?>" target="">Reload</a>

  <form enctype="multipart/form-data" action="<?=$fileName?>" method="POST" id="uploadProgress001" target="uploadProgress001Result">
   <hr />
   <input type="hidden" name="action" value="upload" />
   <iframe name="uploadProgress001Result" style="display:none;"></iframe>
   <input id="uploadProgress001InputFile" style="display:none;" name="userfile" type="file" />
   <span id="uploadProgress001Button" style="cursor:pointer;color:blue;text-decoration:underline;">アップロード</span>
   <span id="uploadProgress001Bar" style="display: block;font-family: monospace;text-align: right;width: 2em;"></span>
   <span id="uploadProgress001Message"></span>
   <hr />
  </form>

  <?=htmlspecialchars(`ls -l --time-style="+%Y-%m-%d %H:%M:%S" $uploadFile`)?>
  <pre><?=htmlspecialchars(var_export($_SESSION[$uploadProgressId], true))?></pre>

 </body>
</html>

memo: ddの/dev/urandomとrsync,ssh

ddで/dev/urandom以外。
http://infobsession.net/wiki/index.php?Linux%2FOpenSSL%A4%C7%A5%C7%A5%A3%A5%B9%A5%AF%BE%C3%B5%EE

export erace_target_dev=/dev/erace_target_dev
badblocks -c 1024 -o /tmp/bb_out.txt -s -v -w $erace_target_dev
dd if=/dev/zero bs=1M | openssl enc -aes-256-ofb -k "`dd if=/dev/urandom count=2 2> /dev/null | hexdump `" | dd_rescue -w - $erace_target_dev
dd if=/dev/urandom count=1 of=$erace_target_dev
dd if=/dev/random count=16 bs=1 of=$erace_target_dev

rsyncが無いがsshがある場合のバックアップ。
http://www.linuxquestions.org/questions/linux-general-1/recursive-scp-w-o-following-links-658857/

cd /destination/directory
ssh user@remote.host "cd /original/directory; tar cf - ./" | tar xvf -

export erace_target_dev=/dev/sdb
dd if=/dev/zero bs=1M | openssl enc -aes-128-ofb -k "`dd if=/dev/urandom count=2 2> /dev/null | hexdump `" | dd_rescue -w - $erace_target_dev
dd if=/dev/urandom count=1 of=$erace_target_dev
dd if=/dev/random count=16 bs=1 of=$erace_target_dev

ssh root@192.168.0.230 "cd /mnt/gentoo; tar cf - ./" | tar xvf -

2012-11-25

sys-fs/lessfs

参考サイト。
http://diary-of-paddy.blogspot.jp/2011/06/lessfs.html

make menuconfig。
file system => fuse
< # CONFIG_FUSE_FS is not set
---
> CONFIG_FUSE_FS=m
> # CONFIG_CUSE is not set

インストールオプション。
$ grep lessfs /etc/portage/package.use/x86_64-pc-linux-gnu
sys-fs/lessfs                   lzo

インストール。
sudo emerge --oneshot -avt sys-fs/lessfs

modprobe fuse起動設定。
sudo /etc/init.d/fuse restart
sudo rc-update add fuse default

初期化。
sudo mkdir -p /data/master/mta
sudo mklessfs -c /etc/lessfs.cfg
sudo lessfs /etc/lessfs.cfg /mnt/lessfs/

確認。
$ mount |grep less
lessfs on /mnt/lessfs type fuse.lessfs (rw,nosuid,nodev,max_read=131072,default_permissions,allow_other)

テスト。128MBの\0だらけのデータを10個。
$ cd /mnt/lessfs/
$ df | grep ^/dev/sda1
/dev/sda1         20641404   6630052  12962828   34% /
$ sudo dd if=/dev/zero of=/var/tmp/dummy.data bs=128M count=1
1+0 レコード入力
1+0 レコード出力
134217728 バイト (134 MB) コピーされました、 0.15713 秒、 854 MB/秒
$ df | grep ^/dev/sda1
/dev/sda1         20641404   6761512  12831368   35% /
$ sudo cp -i /var/tmp/dummy.data .
$ df | grep ^/dev/sda1
/dev/sda1         20641404   6761268  12831612   35% /
$ for num in $(seq 1 10); do df | grep ^/dev/sda1; sudo cp -i dummy.data dummy.data.$num; done
/dev/sda1         20641404   6761264  12831616   35% /
/dev/sda1         20641404   6761372  12831508   35% /
/dev/sda1         20641404   6761540  12831340   35% /
/dev/sda1         20641404   6761676  12831204   35% /
/dev/sda1         20641404   6761808  12831072   35% /
/dev/sda1         20641404   6762180  12830700   35% /
/dev/sda1         20641404   6762312  12830568   35% /
/dev/sda1         20641404   6762452  12830428   35% /
/dev/sda1         20641404   6762564  12830316   35% /
/dev/sda1         20641404   6762696  12830184   35% /
$ cd ..
$ sudo umount /mnt/lessfs/
$ du -sh /data/
16M     /data/

テスト。カーネルのファイルを10個。
$ sudo lessfs /etc/lessfs.cfg /mnt/lessfs/
$ cd /mnt/lessfs/

$ find /mnt/lessfs/ -name "dummy*" -exec md5sum {} \; | awk '{print $1}' | sort | uniq -c
     11 fde9e0818281836e4fc0edfede2b8762

$ sudo cp -i /usr/portage/distfiles/linux-3.5.tar.bz2 .
$ df | grep ^/dev/sda1
/dev/sda1         20641404   6924292  12668588   36% /
$ for num in $(seq 1 10); do df | grep ^/dev/sda1; sudo cp -i linux-3.5.tar.bz2 linux-3.5.tar.bz2.$num; done
/dev/sda1         20641404   6923292  12669588   36% /
/dev/sda1         20641404   6923516  12669364   36% /
/dev/sda1         20641404   6923744  12669136   36% /
/dev/sda1         20641404   6923964  12668916   36% /
/dev/sda1         20641404   6924180  12668700   36% /
/dev/sda1         20641404   6924368  12668512   36% /
/dev/sda1         20641404   6924628  12668252   36% /
/dev/sda1         20641404   6924720  12668160   36% /
/dev/sda1         20641404   6925084  12667796   36% /
/dev/sda1         20641404   6925300  12667580   36% /

$ cd ..
$ sudo umount /mnt/lessfs/
$ du -sh /data/
175M    /data/

テスト。1280MBの\0だらけのデータを10個。
$ sudo rm -rf dummy.data*
$ sudo rm -f /var/tmp/dummy.data
$ sudo dd if=/dev/zero of=/var/tmp/dummy.data bs=128M count=10
10+0 レコード入力
10+0 レコード出力
1342177280 バイト (1.3 GB) コピーされました、 16.7565 秒、 80.1 MB/秒
$ df | grep ^/dev/sda1
/dev/sda1         20641404   8121448  11471432   42% /

$ for num in $(seq 1 10); do df | grep ^/dev/sda1; sudo cp -i /var/tmp/dummy.data dummy.data.$num; done
/dev/sda1         20641404   8117592  11475288   42% /
/dev/sda1         20641404   8121488  11471392   42% /
/dev/sda1         20641404   8128460  11464420   42% /
/dev/sda1         20641404   8132088  11460792   42% /
/dev/sda1         20641404   8146808  11446072   42% /
/dev/sda1         20641404   8147228  11445652   42% /
/dev/sda1         20641404   8151012  11441868   42% /
/dev/sda1         20641404   8154648  11438232   42% /
/dev/sda1         20641404   8160748  11432132   42% /
cp: `dummy.data.9' を書き込んでいます: ソフトウェアが接続を中断しました
cp: `dummy.data.9' の拡張に失敗しました: ソフトウェアが接続を中断しました
df: `/mnt/lessfs': 通信端点が接続されていません
/dev/sda1         20641404   8169424  11423456   42% /
cp: `dummy.data.10' にアクセス中: 通信端点が接続されていません

$ df | grep ^/dev/sda1
df: `/mnt/lessfs': 通信端点が接続されていません
/dev/sda1         20641404   8166600  11426280   42% /

$ ls -al /mnt/lessfs
ls: /mnt/lessfs にアクセスできません: 通信端点が接続されていません

$ cd ..
bash: cd: ..: 通信端点が接続されていません

$ cd /mnt/
$ sudo umount /mnt/lessfs/
$ df | grep ^/dev/sda1
/dev/sda1         20641404   8166604  11426276   42% /
$ sudo rm -f /var/tmp/dummy.data
$ df | grep ^/dev/sda1
/dev/sda1         20641404   6855880  12737000   35% /

$ sudo lessfs /etc/lessfs.cfg /mnt/lessfs/
$ cd lessfs/
$ df | grep ^lessfs
lessfs            20641404   6856332  12736548   35% /mnt/lessfs

$ ls -al
合計 6133384
drwxr-xr-x 4 root root       4096 2012-11-25 02:31:29 ./
drwxr-xr-x 7 root root       4096 2012-11-25 01:42:31 ../
drwxr-xr-x 4 root root       4096 2012-11-25 02:00:11 .lessfs/
-rw-r--r-- 1 root root 1342177280 2012-11-25 02:30:17 dummy.data.1
-rw-r--r-- 1 root root 1342177280 2012-11-25 02:30:53 dummy.data.2
-rw-r--r-- 1 root root 1342177280 2012-11-25 02:31:26 dummy.data.3
-rw-r--r-- 1 root root 1342177280 2012-11-25 02:31:29 dummy.data.4
-rw-r--r-- 1 root root   21102592 2012-11-25 02:31:29 dummy.data.5
-rw-r--r-- 1 root root   80978443 2012-11-25 02:21:01 linux-3.5.tar.bz2
-rw-r--r-- 1 root root   80978443 2012-11-25 02:21:56 linux-3.5.tar.bz2.1
-rw-r--r-- 1 root root   80978443 2012-11-25 02:22:20 linux-3.5.tar.bz2.10
-rw-r--r-- 1 root root   80978443 2012-11-25 02:21:58 linux-3.5.tar.bz2.2
-rw-r--r-- 1 root root   80978443 2012-11-25 02:22:02 linux-3.5.tar.bz2.3
-rw-r--r-- 1 root root   80978443 2012-11-25 02:22:05 linux-3.5.tar.bz2.4
-rw-r--r-- 1 root root   80978443 2012-11-25 02:22:07 linux-3.5.tar.bz2.5
-rw-r--r-- 1 root root   80978443 2012-11-25 02:22:11 linux-3.5.tar.bz2.6
-rw-r--r-- 1 root root   80978443 2012-11-25 02:22:11 linux-3.5.tar.bz2.7
-rw-r--r-- 1 root root   80978443 2012-11-25 02:22:13 linux-3.5.tar.bz2.8
-rw-r--r-- 1 root root   80978443 2012-11-25 02:22:17 linux-3.5.tar.bz2.9

$ du -sh /data/
236M    /data/

テスト。大きいファイルをダイレクトに作成。
$ sudo dd if=/dev/zero of=dummy.data.big bs=128M count=80
dd: `dummy.data.big' を書き込んでいます: 通信端点が接続されていません
44+0 レコード入力
43+0 レコード出力
5772410880 バイト (5.8 GB) コピーされました、 12.5095 秒、 461 MB/秒
$ ls
ls: ディレクトリ . を開くことが出来ません: 通信端点が接続されていません
$ cd ..
bash: cd: ..: 通信端点が接続されていません
$ cd /mnt/
$ sudo umount /mnt/lessfs/
$ sudo lessfs /etc/lessfs.cfg /mnt/lessfs/
$ cd lessfs/
$ ls -alh dummy.data.big
-rw-r--r-- 1 root root 1.6G 2012-11-25 02:47:14 dummy.data.big

テスト。でかいファイルをコピーする。
$ sudo rm -i dummy.data.big
$ df -h | grep ^/dev/sda1
/dev/sda1         20G  6.6G   13G   36% /
$ sudo dd if=/dev/zero of=/var/tmp/dummy.data.big bs=1G count=10
10+0 レコード入力
10+0 レコード出力
10737418240 バイト (11 GB) コピーされました、 72.1913 秒、 149 MB/秒
$ df -h | grep ^/dev/sda1
/dev/sda1         20G   17G  2.2G   89% /
$ sudo cp -i /var/tmp/dummy.data.big .
cp: `./dummy.data.big' を書き込んでいます: ソフトウェアが接続を中断しました
cp: `./dummy.data.big' の拡張に失敗しました: ソフトウェアが接続を中断しました
cp: `./dummy.data.big' を閉じています: 通信端点が接続されていません
$ cd /mnt/
$ sudo umount /mnt/lessfs/
umount /mnt/lessfs: デバイスがビジーです。
       (このデバイスがプロセスによって使われているのであれば、lsof(8)やfuser(1)を使って調査するのが有益かもしれません)
$ sudo rm -f /var/tmp/dummy.data.big
$ sudo lsof lessfs
lsof: WARNING: can't stat() fuse.lessfs file system /mnt/lessfs
      Output information may be incomplete.
lsof: status error on lessfs: Transport endpoint is not connected
lsof 4.85
 latest revision: ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/
 latest FAQ: ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/FAQ
 latest man page: ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/lsof_man
 usage: [-?abhKlnNoOPRtUvVX] [+|-c c] [+|-d s] [+D D] [+|-f[gG]] [+|-e s]
 [-F [f]] [-g [s]] [-i [i]] [+|-L [l]] [+m [m]] [-o [o]] [-p s]
[+|-r [t]] [-s [p:s]] [-S [t]] [-T [t]] [-u s] [+|-w] [-x [fl]] [--] [names]
Use the ``-h'' option to get more help information.

再起動後、マウントする。
$ ls -alh dummy.data.big
-rw-r--r-- 1 root root 5.0G 2012-11-25 03:02:59 dummy.data.big

ディスクフルギリギリまで詰め込んで運用していると、不味いシナリオが発生しそう...
と、参考サイトに書いてあるので、残りのディスク容量が少ない時にそれ以上ぐらいのサイズのファイルをコピーするとダメっぽい。

rsync の --link-dest より小さくなりそうな気がするが、なにかあった時に、どうやって取り出したらいいのかわからないので正常にマウントできる/data/をバックアップしたらいいのかもしれない。

バックアップファイルの管理が適当で同じファイルや未圧縮が多く複数人が保存している場合とても圧縮できるという物なのかもしれない。

2012-11-04

memo: 古いpcの更新

http://d.hatena.ne.jp/tmatsuu/20101225/1293262061
http://www.atmarkit.co.jp/flinux/rensai/linuxtips/277usetmpfs.html
http://www.asahi-net.or.jp/~aa4t-nngk/nfsv4.html
http://d.hatena.ne.jp/tmatsuu/20090110/1231557035
http://www.gentoo.org/doc/ja/gcc-upgrading.xml

(old)pentium3, (new)i5-3470の場合。
nfsは4にしないとlockとかできない。(nfs-utilsを古くしないと無理。それよりnfs4使うほうが楽)
gccの設定にnativeはダメ。
(new)がマウントした(old)のファイルの所有者がnobodyだらけだとダメ。
メモリに余裕があれば/var/tmpはtmpfsでマウントする。
gccの更新もやる。

サーバー側で"/"マウントOKの許可の設定などをする。
$ cat /etc/exports
# /etc/exports: NFS file systems being exported.  See exports(5).
/ 192.168.0.100/255.255.255.255(rw,sync,no_root_squash,fsid=0,subtree_check)
#/ 192.168.0.110/255.255.255.255(rw,sync,no_root_squash,fsid=0,subtree_check)
/ 192.168.0.110/255.255.255.255(rw,async,no_root_squash,fsid=0,no_subtree_check)
# サーバーはNFSD_V4も入れる。
$ grep -iP "nfs.*4" /usr/src/linux/.config
CONFIG_NFS_V4=y
CONFIG_NFS_V4_1=y
CONFIG_NFSD_V4=y

gccの設定。
$ cat /proc/cpuinfo | grep model\ name
model name      : Pentium III (Coppermine)
$ grep ^C /etc/make.conf
CFLAGS="-march=pentium3 --param l1-cache-size=16 --param l1-cache-line-size=32 --param l2-cache-size=256 -fomit-frame-pointer -Os"
CXXFLAGS="${CFLAGS}"
CHOST="i686-pc-linux-gnu"

ファイルの所有者がおかしい場合はチェックする。
$ grep nobody /etc/idmapd.conf
#Nobody-User = nobody
#Nobody-Group = nobody

$ ps aux|grep [r]pc.idmapd
root      6806  0.0  0.1   2724   700 ?        Ss   09:55   0:00 /usr/sbin/rpc.idmapd

$ sudo mount -t nfs4 192.168.0.120:/ /mnt/dynabook/

$ ll -d /mnt/dynabook/bin/ | grep root
drwxr-xr-x 2 root root 4096 2012-11-04 08:45:22 /mnt/dynabook/bin//

マウントする。
$ sudo umount -l /mnt/dynabook

$ sudo mount -t nfs4 192.168.0.120:/ /mnt/dynabook/

$ cat /proc/meminfo | grep ^Mem
MemTotal:        8170052 kB
MemFree:         3824372 kB
# 余裕がなければ mount --bind /var/tmp/dynabook/var/tmp /mnt/dynabook/var/tmp/ など。
$ sudo mount -t tmpfs -o size=4096m tmpfs /mnt/dynabook/var/tmp/
$ sudo mount -t tmpfs -o size=4096m tmpfs /mnt/dynabook/tmp/

$ sudo mount --rbind /usr/portage/ /mnt/dynabook/usr/portage/

$ sudo mount -t proc none /mnt/dynabook/proc/

chrootする。
$ cd /mnt/dynabook/
$ sudo chroot . /bin/bash

$ env-update
$ source /etc/profile
$ export PS1="(chroot.nfs.dynabook) $PS1"

更新する。
$ emerge --oneshot portage
$ emerge -uav gcc
$ gcc-config -l
$ gcc-config i686-pc-linux-gnu-4.5.4
$ env-update && source /etc/profile
$ fix_libtool_files.sh 4.5.4
$ emerge --oneshot -av libtool
$ emerge --jobs=8 --load-average=16 --keep-going -eavt system
...
状態が古いので色々更新などがある。

$ genkernel --makeopts="-j16 KCFLAGS=\\\"-march=pentium3 --param l1-cache-size=16 --param l1-cache-line-size=32 --param l2-cache-size=256 -fomit-frame-pointer -Os\\\"" --kernel-config=/etc/kernels/kernel-config-x86-2.6.38-hardened-r6 --arch-override=x86 all

memo: cscope

http://d.hatena.ne.jp/goinger/20100424/1272134240
http://d.hatena.ne.jp/hsyd/20100511/1273595996
http://sajin.sakura.ne.jp/diary/?date=201001

$ emerge -pv dev-util/cscope|grep USE
[ebuild   R    ] dev-util/cscope-15.8a  USE="emacs" 0 kB

$ find . -type f -readable -name "*.php" > cscope.files

# Smartyのキャッシュ除外
#$ find . -type f -readable -name "*.php" ! -name "%%*.tpl.php" > cscope.files

$ for fn in $(find . -type f -readable ! -name "*.php" ! -name "*.phpt" ! -name "*.phps"); do \
file $fn | grep -P "ASCII text(?:,|$)" 2>&1 >/dev/null && \
grep "&1 >/dev/null && \
php -l $fn 2>&1 >/dev/null && \
echo $fn; \
done | \
while read -r fn; do \
test -e "$fn" && echo $fn; \
done > cscope.files.tmp

# いらない場合が多い。php以外の拡張子でphpっぽいのを探す。
#$ cat cscope.files.tmp >> cscope.files

$ rm -i cscope.out
$ cscope -b

こんだけ使ったが便利だと思う。
C-c s s => n(next), p(prev), o(移動して閉じる)
C-c s t => こっちテキストなんでマッチするのが多い。

ディレクトリ名ごとのcscope.outのパスの設定もできるっぽい。

subversionのインストール

http://www.gside.org/Gentoo/subversion/subversion.html
http://d.hatena.ne.jp/dayflower/20070604/1180941582
http://www.hyuki.com/techinfo/svninit.html#import
http://thinkit.co.jp/cert/article/0611/2/2/2.htm

subversionのインストール設定にapache2を追加して再インストールする。
$ grep subversion /etc/portage/package.use
dev-vcs/subversion      -dso perl apache2

apacheの設定にSVN,DAVを追加する。
$ grep ^APACHE2_OPTS /etc/conf.d/apache2
APACHE2_OPTS="-D DEFAULT_VHOST -D INFO -D SSL -D SSL_DEFAULT_VHOST -D LANGUAGE"
APACHE2_OPTS="${APACHE2_OPTS} -D PHP5 -D PROXY -D EXTRACT_FORWARDED"
APACHE2_OPTS="${APACHE2_OPTS} -D SVN -D SVN_AUTHZ -D DAV -D DAV_FS -D SSL -D SSL_DEFAULT_VHOST"

ディレクトリを作成する。
$ sudo mkdir -p /var/svn/repos

レポジトリを作成する。
$ sudo svnadmin create /var/svn/repos/repos001
$ sudo chown -R apache:apache /var/svn/repos/repos001/

apacheの設定に追加する。
$ rcsdiff /etc/config-archive/etc/apache2/modules.d/47_mod_dav_svn.conf,v /etc/apache2/modules.d/47_mod_dav_svn.conf
===================================================================
RCS file: /etc/config-archive/etc/apache2/modules.d/47_mod_dav_svn.conf,v
retrieving revision 1.1
diff -r1.1 /etc/apache2/modules.d/47_mod_dav_svn.conf
15a16,24
> <Location /svn/repos>
>        DAV svn
>        SVNParentPath /var/svn/repos
>        SVNListParentPath On
>        AuthType Basic
>        AuthName "Subversion repository"
>        AuthUserFile /var/svn/conf/svnusers
>        Require valid-user
> </Location>

Basic認証の設定をする。
$ sudo mkdir /var/svn/conf/
$ sudo htpasswd -c /var/svn/conf/svnusers admin

再起動する。
$ sudo /etc/init.d/apache2 restart

確認する。
http://192.168.xxx.xxx/svn/repos/
Collection of Repositories

    repos001/

Powered by Subversion version 1.6.17 (r1128011).

SSLのみ。
$ rcsdiff -u /etc/config-archive/etc/apache2/modules.d/47_mod_dav_svn.conf,v /etc/apache2/modules.d/47_mod_dav_svn.conf
===================================================================
RCS file: /etc/config-archive/etc/apache2/modules.d/47_mod_dav_svn.conf,v
retrieving revision 1.2
diff -u -r1.2 /etc/apache2/modules.d/47_mod_dav_svn.conf
--- /etc/apache2/modules.d/47_mod_dav_svn.conf  2012/11/03 14:40:53     1.2
+++ /etc/apache2/modules.d/47_mod_dav_svn.conf  2012/11/03 14:41:29
@@ -14,6 +14,7 @@
 #       Require valid-user
 #</Location>
 <Location /svn/repos>
+       SSLRequireSSL
        DAV svn
        SVNParentPath /var/svn/repos
        SVNListParentPath On

テスト。
import.
$ cd /tmp/
$ mkdir htdocs
$ cd htdocs/
$ echo "test001" >> a.txt
$ cat a.txt
test001
$ svn import http://192.168.0.110/svn/repos/repos001/htdocs -m "test001"
追加しています              a.txt

リビジョン 1 をコミットしました。

checkout.
$ cd /tmp/
$ mv -i htdocs/ htdocs.old
$ svn checkout http://192.168.0.110/svn/repos/repos001/htdocs htdocs
A    htdocs/a.txt
リビジョン 1 をチェックアウトしました。
$ diff -r htdocs.old/ htdocs
htdocsだけに発見: .svn

diff.
$ cd htdocs
$ echo "test002" >> a.txt
$ svn diff
Index: a.txt
===================================================================
--- a.txt (リビジョン 1)
+++ a.txt (作業コピー)
@@ -1 +1,2 @@
 test001
+test002
$ svn commit . -m "test002"
送信しています              a.txt
ファイルのデータを送信しています .
リビジョン 2 をコミットしました。
$ svn diff
$ echo "test003" >> a.txt
$ svn diff
Index: a.txt
===================================================================
--- a.txt (リビジョン 2)
+++ a.txt (作業コピー)
@@ -1,2 +1,3 @@
 test001
 test002
+test003

delete.
$ svn delete http://192.168.0.110/svn/repos/repos001/htdocs/a.txt -m 'test004'

リビジョン 3 をコミットしました。
$ cd /tmp/
$ svn checkout http://192.168.0.110/svn/repos/repos001/htdocs htdocs
   C htdocs/a.txt
リビジョン 3 をチェックアウトしました。
Summary of conflicts:
  Tree conflicts: 1
$ mv -i htdocs htdocs.current
$ svn checkout http://192.168.0.110/svn/repos/repos001/htdocs htdocs
リビジョン 3 をチェックアウトしました。
$ diff -r -q htdocs htdocs.current/
ファイル htdocs/.svn/all-wcprops と htdocs.current/.svn/all-wcprops は異なります
ファイル htdocs/.svn/entries と htdocs.current/.svn/entries は異なります
htdocs.current/.svn/text-baseだけに発見: a.txt.svn-base
htdocs.current/だけに発見: a.txt
$ svn checkout -r2 http://192.168.0.110/svn/repos/repos001/htdocs htdocs
A    htdocs/a.txt
リビジョン 2 をチェックアウトしました。
$ diff -r -q htdocs htdocs.current/
ファイル htdocs/.svn/all-wcprops と htdocs.current/.svn/all-wcprops は異なります
ファイル htdocs/.svn/entries と htdocs.current/.svn/entries は異なります
ファイル htdocs/a.txt と htdocs.current/a.txt は異なります
$ diff htdocs/a.txt htdocs.current/a.txt
2a3
> test003

よくわからないがdeleteしたファイル名は指定できなかった。
たぶんコマンドの内容がおかしい。
普通はコマンドではなくエディタの機能を経由とかで使うので復活方法を把握しとけばOK.
$ svn copy http://192.168.0.110/svn/repos/repos001/htdocs/a.txt a.txt
svn: パス 'http://192.168.0.110/svn/repos/repos001/htdocs/a.txt' がリビジョン 4 に見つかりません
$ svn copy -r2 http://192.168.0.110/svn/repos/repos001/htdocs/a.txt a.txt
svn: パス '/svn/repos/repos001/!svn/bc/4/htdocs/a.txt' が見つかりません
$ svn copy -r2 http://192.168.0.110/svn/repos/repos001/htdocs/ htdocs
A    htdocs/a.txt
リビジョン 2 をチェックアウトしました。
A         htdocs

ファイルシステムは?
たぶん安全性を取るとfsfsが良い。
しかしどこか壊れているのに大丈夫なつもりで使い続けるほうがまずそう。
$ svnadmin create --help | grep "fs-type"
  --fs-type           : リポジトリ形式: 'fsfs' (デフォルト) または 'bdb'

バックアップは?
1日1回やって古いのは消すとか。cron,logrotateとか。
$ tar cvzf varsvn.tar.gz /var/svn/

2012-10-28

vmhgfs

$ grep open-vm /etc/portage/package.use
app-emulation/open-vm-tools     fuse
$ grep vmhgfs /etc/fstab
.host:/                 /mnt/hgfs       vmhgfs          defaults        0 0

$ grep vmhgfs_mnt= /etc/vmware-tools/services.sh
vmhgfs_mnt="/mnt/hgfs"

$ mount -v|grep hgfs
.host:/ on /mnt/hgfs type vmhgfs (rw,ttl=1)

http://askubuntu.com/questions/29284/how-do-i-mount-shared-folders-win7-host-in-ubuntu-guest-using-vmwaretools-v

$ grep vmhgfs /etc/fstab
.host:/                 /mnt/hgfs       vmhgfs          defaults,ttl=5,uid=1000,gid=1000        0 0

vmware playerのコピーアンドペースト

gnomeのGUIのcentos6.3でホストゲスト間でコピペOKだったはずなのに、できなくなった。

isolation.tools.copy.disable="FALSE"
isolation.tools.paste.disable="FALSE"

本体の更新が確かあったような気がするので、その際にデフォルト値が変わったのかもしれない。

参考URL.
http://d.hatena.ne.jp/EijiYoshida/20110127/1296133467

windows7のntpd

ホストOSがwindows7でゲストOSがvmware-toolsを入れたOSの場合、ゲストOSのntpdを止める。
そしてパソコンを点けっぱなしか休止が多い場合はntpdを入れることを検討する。

参考URL。
http://assimane.blog.so-net.ne.jp/2012-09-12
http://www.asahi-net.or.jp/~aa4t-nngk/ntpd.html
http://d.hatena.ne.jp/incarose86/20110505/1312522379

$ diff "ntp - コピー.conf" ntp.conf 
16a17,28
> 
> server 0.jp.pool.ntp.org iburst maxpoll 15
> server 1.jp.pool.ntp.org iburst maxpoll 15
> server 2.jp.pool.ntp.org iburst maxpoll 15
> server 3.jp.pool.ntp.org iburst maxpoll 15
> 
> restrict default nomodify nopeer
> restrict 127.0.0.1
> 
> restrict 192.168.0.0 mask 255.255.255.0 nomodify nopeer notrap
> 
> tinker step 8 stepout 300 panic 50400

iburst => 起動直後は早めに時計合わせする。
maxpoll 17 => (2^17) / 3600 = 36.4088889 => 安定したら36時間に1回ぐらい時間を聞きに行く。
maxpoll 11 => (2^11) / 60 = 34.1333333 => 安定したら34分に1回ぐらい時間を聞きに行く。

8秒以上のずれが300秒以上続いたら無理やり戻す。14時間以上ずれていたら諦める。

何かのログの時間が巻戻っていたら、maxpollを少なくする、stepを消す(0.128に戻す)、とかする。
...
2012-10-28 19:37:27 xxx xxx xxx
2012-10-28 19:37:19 xxx xxx xxx
...

この場合maxpoll 15(約9時間)以内で8秒以内のズレであれば、うまいこと時計合わせする、と思う。
開発やテスト環境ではなく外部のサーバーにログを送信とかやってたら、これではダメ。

app-misc/screen-4.0.3-r5に全角記号の表示の対応

app-misc/screen-4.0.3-r5に全角記号の表示の対応をします。
この例はgentoolinux用です。

参考URL。
http://d.hatena.ne.jp/Fivestar/20080710/1215694006
http://www.dekaino.net/screen/01install.html

ダウンロードします。
$ grep wget ~/.bash_history | tail -n3
wget http://www.dekaino.net/screen/screen-4.0.2-deadlock-patch
wget http://www.dekaino.net/screen/screen-4.0.2-hankanacopy-patch
wget http://www.dekaino.net/screen/screen-4.0.2-patch-cjkwidth-cvs-2006052001

patchの設置場所です。
$ pwd
/usr/local/portage/test/app-misc/screen
$ sudo cp -ri /usr/portage/app-misc/screen ..
...
$ ll -tr files/ | tail -n3
-rw-r--r-- 1 root root  9236 2012-10-28 05:33:20 screen-4.0.2-patch-cjkwidth-cvs-2006052001
-rw-r--r-- 1 root root   334 2012-10-28 05:33:20 screen-4.0.2-hankanacopy-patch
-rw-r--r-- 1 root root   549 2012-10-28 05:33:20 screen-4.0.2-deadlock-patch

PORTDIR_OVERLAYに設置してscreen-4.0.3-r6.ebuildを作成してManifestを更新します。
$ sudo ebuild screen-4.0.3-r6.ebuild manifest

インストールします。
$ sudo emerge -avt app-misc/screen

screen-4.0.3-r6.ebuildの修正点です。
$ diff -u screen-4.0.3-r5.ebuild screen-4.0.3-r6.ebuild
--- screen-4.0.3-r5.ebuild      2012-10-28 05:29:16.907814881 +0900
+++ screen-4.0.3-r6.ebuild      2012-10-28 05:36:21.856134184 +0900
@@ -28,6 +28,10 @@
 }

 src_prepare() {
+       epatch "${FILESDIR}"/screen-4.0.2-deadlock-patch
+       epatch "${FILESDIR}"/screen-4.0.2-hankanacopy-patch
+       epatch "${FILESDIR}"/screen-4.0.2-patch-cjkwidth-cvs-2006052001
+
        # Bug 34599: integer overflow in 4.0.1
        # (Nov 29 2003 -solar)
        epatch "${FILESDIR}"/screen-4.0.1-int-overflow-fix.patch

make.confの設定です。
$ grep PORTDIR_OVERLAY /etc/make.conf
PORTDIR_OVERLAY="${PORTDIR_OVERLAY} /usr/local/portage/test"

更新で消えないようにします。同じ名前だと消えるかもしれません。
$ rcsdiff /etc/config-archive/etc/portage/package.mask,v /etc/portage/package.mask
===================================================================
RCS file: /etc/config-archive/etc/portage/package.mask,v
retrieving revision 1.15
diff -r1.15 /etc/portage/package.mask
0a1,2
> >app-misc/screen-4.0.3-r6
>

設置したファイル。
$ diff -qr /usr/portage/app-misc/screen /usr/local/portage/test/app-misc/screen/
ファイル /usr/portage/app-misc/screen/Manifest と /usr/local/portage/test/app-misc/screen/Manifest は異なります
/usr/local/portage/test/app-misc/screen/filesだけに発見: screen-4.0.2-deadlock-patch
/usr/local/portage/test/app-misc/screen/filesだけに発見: screen-4.0.2-hankanacopy-patch
/usr/local/portage/test/app-misc/screen/filesだけに発見: screen-4.0.2-patch-cjkwidth-cvs-2006052001
/usr/local/portage/test/app-misc/screen/だけに発見: screen-4.0.3-r6.ebuild

2012-10-27

Windows 8 Release Preview のインストール

http://www.ijailbreak.com/microsoft/windows-8-release-preview-32-bit-64-bit-download/

http://iso.esd.microsoft.com/WRPDL/D29D6C5B1D8AF956B5DA9DF738CFD92DFD4F6C8FB/Windows8-ReleasePreview-64bit-English.iso

http://iso.esd.microsoft.com/WRPDL/D29D6C5B1D8AF956B5DA9DF738CFD92DFD4F6C8FB/Windows8-ReleasePreview-64bit-Japanese.iso


Product Key: TK8TP-9JN6P-7X7WW-RFFTV-B7QPF

評価版を使ってみた結果、使いこなせるようになると便利なんだと思います。
デスクトップの時計の右にカーソルを持ってくると設定が開けるようです。
使っていないPCかvmware playerなどで試すのが良いです。

vmware playerの時計

vmware playerの時計が合わないのでvmware-toolsを入れようとしたが、
エラーが出たりしたのでパッケージを入れた。

主なエラー。
vm communication interface socket family failed

参考URL。
http://forums.gentoo.org/viewtopic-t-913692-start-0.html
http://blog.sorah.jp/2011/08/24/gentoo-on-vmware
http://www.shocksolution.com/2009/10/kernel-configuration-gentoo-guest-vmware-fusion/
http://blog.livedoor.jp/woodv/archives/52616279.html
http://www.kinusati.net/2011/10/03/vmware-player%E3%81%AE%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E5%8C%96/

ext2,ext4を有効にした。
$ wget http://www.shocksolution.com/files/26Sept2009_Vmware_Gentoo_amd64.config
$ sudo genkernel --makeopts="-j16 KCFLAGS=\\\"-march=native -O2\\\"" --kernel-config=/tmp/26Sept2009_Vmware_Gentoo_amd64.config --menuconfig all

パッケージを入れた。
sudo emerge -avt app-emulation/open-vm-tools

パッケージ名にはvmwareが無い。
$ eix open-vm -cI
[I] app-emulation/open-vm-tools (2012.05.21.724730@2012年10月27日): Opensourced tools for VMware guests
[I] app-emulation/open-vm-tools-kmod (2012.05.21.724730@2012年10月27日): Opensourced tools for VMware guests
Found 2 matches.

説明にはある。
$ eix -S vmware -c
[I] app-emulation/open-vm-tools (2012.05.21.724730@2012年10月27日): Opensourced tools for VMware guests
[I] app-emulation/open-vm-tools-kmod (2012.05.21.724730@2012年10月27日): Opensourced tools for VMware guests
[N] app-emulation/vmware-modules (~264.4): VMware kernel modules
[N] app-emulation/vmware-tools (~8.8.4.744019): VMware Tools for guest operating systems
[N] app-emulation/vmware-view-open-client (~4.5.0.297975-r1): Open Source VMware View Client
[N] app-emulation/vmware-vix (~1.11.4.744019): VMware VIX API for Linux
[N] sec-policy/selinux-vmware (--): SELinux policy for vmware
[N] x11-drivers/xf86-input-vmmouse (12.9.0): VMWare mouse input driver
[N] x11-drivers/xf86-video-vmware (12.0.2): VMware SVGA video driver
[N] x11-libs/libview (0.6.6-r2): VMware's Incredibly Exciting Widgets
Found 10 matches.

3分ぐらい休止にして再度起動しても時間がずれなかったので、きっと成功した。

たぶん大丈夫なので時計合わせを止めた。
# こっちは普通にソースから入れて成功した。
$ cat /etc/redhat-release
CentOS release 6.3 (Final)
$ chkconfig --list|grep ntp
ntpd            0:off   1:off   2:off   3:off   4:off   5:off   6:off
ntpdate         0:off   1:off   2:off   3:off   4:off   5:off   6:off

$ rc-update show|grep ntp
$

失敗の例。あとカーネルの.configも何かうまいこと設定しないとダメっぽい。
たぶんうまいこと設定すればVMwareTools-9.2.0-799703.tar.gzでOK。
# カーネル
sys-kernel/gentoo-sources-3.5.7
# 失敗
VMwareTools-9.2.0-799703.tar.gz
# 失敗(isoからtar.gzを出す。なんかやり方が違うっぽい)
app-emulation/vmware-tools-8.8.4.744019

emerge --syncしたらマスク無しから黄色のマスクに戻った。そのままにする。
sys-kernel/gentoo-sources-3.5.7

OKそうであれば起動の設定をする。
$ rc-update show|grep vmware
         vmware-tools |      default

$ grep ^clock= /etc/conf.d/hwclock
clock="UTC"

windows7のsexeで起動する場合サービスのログオンするアカウントを設定しないと起動しない。

画面が出ないので追加する。
hints.hideAll = "TRUE"
msg.noOk = "TRUE"

laymanを入れれば新しいのを取得できる。
$ eix -O vmware -c vmware-tools
[N] app-emulation/vmware-tools (~9.2.0.812388[1]): VMware Tools for guest operating systems
[1] "vmware" layman/vmware
usui@vmware-gentoo1 ~ $ eix -O vmware vmware-tools
* app-emulation/vmware-tools
     Available versions:  ~8.4.9.744570^m ~8.4.9.744570^m[1] ~8.8.4.744019^m ~8.8.4.744019^m[1] ~9.2.0.812388^m[1] {{vmware_guest_freebsd vmware_guest_linux vmware_guest_netware vmware_guest_solaris vmware_guest_winPre2k vmware_guest_windows}}
     Homepage:            http://www.vmware.com/products/player/
     Description:         VMware Tools for guest operating systems

[1] "vmware" layman/vmware

2012-10-08

メモ: bashのalias

ログイン後にaliasを実行するのは大変なのかもしれない。
ログイン先の~/.bashrcなどを変更できない場合。

http://d.hatena.ne.jp/sodomojo/20081120/1227213620
http://kakakikikeke.blogspot.jp/2012/08/poderosassh.html

~/.ssh/config LocalCommand

bind '"\C-n": history-search-forward'
bind '"\C-p": history-search-backward'

alias ls='ls -A -T0 -N -C -F --color=auto --time-style="+%Y-%m-%d %H:%M:%S"'
alias ll='ls -l'
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
alias enman='LANG=C LC_ALL=C PATH="/usr/bin:/bin" man'
alias mydate='date +%Y-%m-%d'
if [ -z "`which lv 2>/dev/null`" ]; then alias lv='less'; fi

    mycp(){ SRC=$1;\
if test ! -e "${SRC}";then echo "\"${SRC}\" does not exist.";return 1;fi;\
DIST=`pwd`"/"`basename $1`.`date --reference "${SRC}" +%Y-%m-%d_%H%M%S`;\
if test -e "${DIST}";then echo "\"${DIST}\" is exist.";return 1;fi;\
cp -ai "${SRC}" "${DIST}";}
    mymv(){ SRC=$1;\
if test ! -e "${SRC}";then echo "\"${SRC}\" does not exist.";return 1;fi;\
DIST=`pwd`"/"`basename $1`.`date --reference "${SRC}" +%Y-%m-%d_%H%M%S`;\
if test -e "${DIST}";then echo "\"${DIST}\" is exist.";return 1;fi;\
mv -i "${SRC}" "${DIST}";}

2012-07-31

scimの起動

日本語入力ができなかったので設定を追加した。
$ cd /etc/X11/xinit/xinitrc.d/
$ sudo vi 99-scim
$ cat 99-scim | grep -v ^#
LANG='ja_JP.UTF-8' scim -d
export XMODIFIERS=@im=SCIM
export GTK_IM_MODULE=scim
export QT_IM_MODULE=scim
$ sudo chmod +x 99-scim

たぶん以前はstartxで起動していた。
$ cat .xinitrc | grep -v ^#
LANG='ja_JP.UTF-8' scim -d
export XMODIFIERS=@im=SCIM
export GTK_IM_MODULE=scim
export QT_IM_MODULE=scim
exec gnome-session

参考URL。
http://en.gentoo-wiki.com/wiki/SCIM#GNOME_or_other_GTK_windows_manager

2012-07-26

Could not access KVM kernel module: Permission denied

kvmが動作していない。
以前は何らしかの名前が出たような気がする。
$ sudo virsh list
 Id    名前                         状態
----------------------------------------------------


グラフィカルな管理画面では復元ができる状態で停止中のリストが表示される。
しかし復元はできない。
$ sudo virt-manager

Could not access KVM kernel module: Permission denied と出る。
グループを追加した。
$ sudo usermod -a -G kvm qemu

それから復元をすると、今度はpythonのエラーが長々と出る。
ゲストOSが起動したままの状態で終了している場合はキャッシュファイルが古いと起動しない場合がある。
$ cd /var/lib/libvirt/qemu/save/
$ sudo mv -i centos5.save centos5.save.old

参考URL。
http://forums.gentoo.org/viewtopic-t-925976-start-0.html
https://bugs.gentoo.org/show_bug.cgi?id=420507

'gsettings-data-convert.desktop' failed

gnomeが起動できない。新規ユーザーを作成して、それにログインしても無理だった。
$ sudo tail -f /var/log/messages
...
Jul 26 16:47:23 amdgentoo gnome-session[17395]: WARNING: Application 'gsettings-data-convert.desktop' failed to register before timeout
...

少し新しいgconfを入れた。
sudo ACCEPT_KEYWORDS="~*" emerge --oneshot -av =gnome-base/gconf-3.2.3-r1

参考URL。
http://ubuntuforums.org/showthread.php?t=1939185

2012-06-30

phpの更新の失敗

phpの更新が失敗するので設定を追加した。
$ rcsdiff /etc/config-archive/etc/portage/package.mask,v /etc/portage/package.mask
===================================================================
RCS file: /etc/config-archive/etc/portage/package.mask,v
retrieving revision 1.13
diff -r1.13 /etc/portage/package.mask
0a1,3
> =net-libs/c-client-2007f-r1
> =net-libs/c-client-2007f
>

エラーの一部。
...
php_imap.c:837:45: error: expected declaration specifiers or '...' before 'ANNOTATION'
php_imap.c: In function 'mail_getannotation':
php_imap.c:839:2: error: 'ANNOTATION_VALUES' undeclared (first use in this function)
...

phpは古いままでコマンドが失敗する状態。
$ php -v
php: symbol lookup error: php: undefined symbol: mail_free_annotation

$ eix ^php$ -Ic
[I] dev-lang/php (5.3.10(5.3)@2012年02月05日): The PHP language runtime engine: CLI, CGI, FPM/FastCGI, Apache2 and embed SAPIs.

修正したら直った。
$ php -v
PHP 5.3.14-pl0-gentoo (cli) (built: Jun 30 2012 01:08:08)
Copyright (c) 1997-2012 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2012 Zend Technologies

$ eix ^php$ -Ic
[D] dev-lang/php (5.3.14(5.3)@2012年06月30日 -> 5.3.10(5.3)): The PHP language runtime engine: CLI, CGI, FPM/FastCGI, Apache2 and embed SAPIs.

net-libs/c-client-2007e-r2になっている。
$ eix "^(php|c-client)$" -Ic
[D] dev-lang/php (5.3.14(5.3)@2012年06月30日 -> 5.3.10(5.3)): The PHP language runtime engine: CLI, CGI, FPM/FastCGI, Apache2 and embed SAPIs.
[I] net-libs/c-client (2007e-r2@2012年06月30日): UW IMAP c-client library
Found 2 matches.

原因は不明だがphpに使うc-clientのバージョンが安定版ではなかった。
どこかの設定でmaskを外してしまっているのかもしれない。
$ eix ^c-client$
[I] net-libs/c-client
     Available versions:  2007e-r2 [m]~2007f [m]~2007f-r1 {doc kernel_FreeBSD kernel_linux kolab pam ssl static-libs}
     Installed versions:  2007e-r2(01時01分12秒 2012年06月30日)(kernel_linux kolab pam ssl -doc -kernel_FreeBSD)
     Homepage:            http://www.washington.edu/imap/
     Description:         UW IMAP c-client library