-->

2013-09-19

memo: K760E, LBT-UAN04C2BK

K760E, LBT-UAN04C2BK

windows7でも使用可能らしいので買った。

コントロール パネル\すべてのコントロール パネル項目\デバイスとプリンター
ではペアリングできなかった。

コンピューター\マイBluetoothデバイス
でできた。(Bluetooth USBアダプタのCD付属)

「F10」が「fn-F10」で反応がある。
「ctl-alt-delete」が「fn-ctl-alt-delete」で反応がある。(印字はdeleteで機能はbackspaceでdeleteにする場合が「fn+delete」)
google画像検索、検索ツール、大きいサイズでも見た目は見れる。


http://masaru.org/diary/20110412.html

http://qa.green-house.co.jp/faq_detail.html?id=1117

LBT-UAN04C2BKのCDのソフトウェアを入れた。
csr harmony wireless software stack

ディスカバリーモード : ディスカバリーOFF
SCMT-T               : 有効
デバイスの種類       : PC/デスクトップPC

キーボードが109っぽいが印字と違うのでusにしたいが「地域と言語」から設定するUSだと日本語変換ができない。
参考サイトを元に値を変更した。
HKEY_LOCALMACHINE\SYSTEM\CurrentControlSet\Enum\HID
↓
HID\CSRHIDDevice????????&?????
↓
xxx&0xxx
    KeyboardTypeOverride
xxx&1xxx
    KeyboardTypeOverride
xxx&2xxx
    KeyboardTypeOverride
複数ある場合は番号が多い方のようです。

何回も再インストールしたら増えたので復元で戻したら戻った。
ちょうどいいタイミングのログがあったので。2日前の。
その間に入れたソフトウェアはおかしくなったので入れなおした。

無事「shift-2」で「@」が出たので成功した。

http://www.logicool.co.jp/ja-jp/product/wireless-solar-keyboard-k760-for-mac
仕様
型番 K760E
キーレイアウト : 78キー英語レイアウト

コントロール パネル\すべてのコントロール パネル項目
に表示方法:小さいアイコンで
Bluetooth Devices
Bluetooth 設定
という表示が出て「Bluetooth 設定」のほうは押しても反応がない。
なにか間違ったかと思って再インストールして消えたかと思ったが再起動後に出るので、そのままにした。
「表示方法:カテゴリ」の場合はそうでもない。

F1~F12を多用する場合はやめたほうが良さそう。
しかし太陽電池は良さそう。壊れなければ。

2013-09-16

memo: VMware Player, Microsoft Loopback Adapter

http://www.anseilen.org/puki/index.php?%CC%B5%C0%FELAN%A1%DCVPN%B4%C4%B6%AD%A4%C7%A1%A2%B2%BE%C1%DBPC%A4%F2%BB%C8%A4%A6

http://blogs.yahoo.co.jp/akio_myau/39554285.html

http://d.hatena.ne.jp/uesama99/20070211/1171159451

https://twitter.com/yyamasak/statuses/289623414795296768

http://d.hatena.ne.jp/kakenman/20110314/1300084623

http://trendy.nikkeibp.co.jp/article/tec/bb/20020826/101625/


これはNAT接続がうまくいかないがブリッジ接続でIPアドレスを割り当てたくない場合に試すかもしれないので確認した作業の例です。

スタート、コンピューター、右クリック、管理、
コンピューターの管理、デバイスマネージャ、ネットワークアダプタ、
操作(A)、レガシーハードウェアの追加(L)、
...

コントロール パネル\すべてのコントロール パネル項目\ネットワーク接続

ローカルエリア接続2
認識されていないネットワーク
Microsoft Loopback Adapter

右クリック、プロパティ、インターネットプロトコルバージョン4(TCP/IPv4)、
プロパティ、次のIPアドレスを使う、

IPアドレス(I):       192.168.137.1
サブネットマスク(U): 255.255.255.0

OK、ローカルエリア接続、右クリック、プロパティ、共有、

インターネット接続の共有
[v]ネットワークのほかのユーザーに、このコンピュータのインターネット接続を通しての接続を許可する(N)
ホームネットワーク接続(H):
[ローカルエリア接続2]
[ ]ネットワークのほかのユーザーに、共有インターネット接続の制御や無効化を許可する(O)

OK、

VmwarePlayer
仮想マシン設定の編集(D)
ネットワークアダプタ ブリッジ(自動)
(●)ブリッジ: 物理ネットワークに直接接続(B)
    [ ]物理ネットワーク接続の状態を複製(P)
                           アダプタの設定(F)

ブリッジの自動設定
自動的にブリッジするホストネットワークアダプタを選択してください:
[v] Microsot Loopback Adapter
[ ] Realtek RTL8168D/8111D...

$ cat /etc/sysconfig/network-scripts/ifcfg-eth0 | grep -v ^# | grep -v ^$
DEVICE="eth0"
BOOTPROTO="static"
NM_CONTROLLED="no"
ONBOOT="yes"
TYPE="Ethernet"
IPADDR="192.168.137.220"
GATEWAY=192.168.137.1
NETMASK="255.255.255.0"
DNS1="192.168.0.1"

元々動いていた他のvmwareplayerのブリッジ接続のSSH接続が切れた。
アダプタの設定(F)
で、Microsot Loopback Adapterを外せばOK.
共存させる意味はないが。物理的な環境によって使い分け的な何かがあるかもしれない。
今度はMicrosot Loopback Adapterのほうが接続切れたので共存できないようだ。
ローカルエリア接続2を使うほうのVmwareの設定が変わっていた。
[ ] Microsot Loopback Adapter
[v] Realtek RTL8168D/8111D...
何か設定が衝突したので片方を衝突しないようにした的な何かがあったかもしれない。
ローカルエリア接続 → ローカルエリア接続2
ローカルエリア接続 → VMware Virtual Ethernet Adapter for VMnet1
が両方は無理なのかもしれない。

他も192.168.137.xxxにすれば普通に共存はできる。
普通のブリッジのように192.168.137.xxxに192.168.0.xxx(ホストOS以外)からはアクセスできない。
192.168.137.xxx → ssh 192.168.0.xxx(ホストOS以外) → ssh 192.168.137.xxx できないのでOK.

NAT接続で大丈夫か、普通のブリッジ接続でIPアドレスを複数使ってよいなどであれば必要ない。
多分、
[ ]物理ネットワーク接続の状態を複製(P)
を、ONにしてゲストをDHCPにすれば、IPアドレスも被らない、といいな、と思う。
これはVPNのCLIENTで接続するとVmwarePlayerのNAT接続にアクセスできない場合などで試してみる場合の参考です。
そもそも本当に問題が解決するかどうかは不明です。

ローカルエリア接続2を使う場合。両方ONだとvmwareplayerが2個以上で両方にブリッジ接続すると何かがまずい。
普通はしないので1個だけにする。"Vmware Bridge Protocol"ONを。別に物理的に複数ある場合は関係ない。
ローカルエリア接続2 → [v] Vmware Bridge Protocol
ローカルエリア接続  → [ ] Vmware Bridge Protocol

ローカルエリア接続、プロパティ、共有、設定にIPフォワーディングの設定のようなものがあるが、この例では変更していない。

2013-09-14

memo: arglist-cont-nonempty

他に影響がある。
;; spl_autoload_register(call_user_func(function() { の次の行を4。他で影響あれば無し。
;; ((arglist-cont-nonempty 1 22) (arglist-cont-nonempty 1 37) (statement-block-intro 1)) で statement-block-intro で4.
(c-set-offset 'arglist-cont-nonempty' 0)

2013-09-08

spl_autoload_registerの例

https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-0.md
http://qiita.com/Hiraku/items/72251c709503e554c280

クラス名 => ファイルパスで1:1で対応していないと非常にわかりにくいので下記の例は非推薦な例です。








spl_autoload_register(function($className)
{
    static $includePathList;
    if (!is_array($includePathList)) {
        $includePathList = explode(PATH_SEPARATOR, get_include_path());
    }
    $includedFileList = get_included_files();
    $successFlag = false;
    do {
        $classNameList = array();
        $errorFlag = false;
        preg_replace_callback(
            "/(" .
            "(?:[A-Z])" .
            "(?:" .
            "(?:[0-9]{0,15})" .
            "(?:[a-z])" .
            "(?:[0-9]{0,15})" .
            "){1,15}" .
            ")|(.)/", function($matches) use(&$classNameList, &$errorFlag) {
                if (!$errorFlag) {
                    switch (true) {
                    case (is_string($matches[1]) && $matches[1] !== ""):
                        $classNameList[] = $matches[1];
                        break;
                    case (is_string($matches[2])):
                        switch (true) {
                        case (in_array($matches[2], array("\\", "_"), true)):
                            break;
                        default:
                            $errorFlag = true;
                        }
                        break;
                    default:
                        trigger_error("\$className parse error.", E_USER_ERROR);
                    }
                }
            }, $className);
        if ($errorFlag) {
            break;
        }
        foreach ($includePathList as $includeDir) {
            $currentDir1 = $includeDir;
            $classNameListTmp = $classNameList;
            foreach ($classNameList as $val1) {
                if (count($classNameListTmp) <= 1) {
                    break;
                }
                $currentDir1 .= DIRECTORY_SEPARATOR . $val1;
                if (!is_dir($currentDir1)) {
                    break;
                }
                array_shift($classNameListTmp);
                $currentDir2 = "";
                foreach ($classNameListTmp as $val2) {
                    $file = $currentDir1 . DIRECTORY_SEPARATOR . $currentDir2 . $val2 . ".php";
                    if (!in_array($file, $includedFileList, true) && is_file($file)) {
                        require($file);
                        if (class_exists($className)) {
                            $successFlag = true;
                            break 3;
                        }
                    }
                    $currentDir2 .= $val2;
                }
            }
        }
    } while (false);
});

問題点。

後でset_include_path(...)が行われても考慮しない。

全部同じディレクトリやファイルの走査になる。
$class = new Foo_Bar_Baz;
$class = new FooBarBaz;
$class = new \Foo\Bar\Baz;

大文字の英字{1} + 小文字の英字{1,15}(半角数字が間にあるのはOK)で"\"と"_"は区切り。
foo_bar_baz は無理。
F111_B222_B333 は無理。
Foo1_Bar2_Baz3 はOK.

"$class = new FooBar;" => "./Foo/Bar.php" のように、"ディレクトリ/ファイル名.php"で最低2つ。

$class = new FooBarBaz;
./Foo/Bar/Baz.phpで定義されている場合、定義されていないが候補に上がるファイルを全部requireする。

./Foo/Bar.php <= 読む。無い。
./Foo/BarBaz.php <= 読む。無い。
./Foo/Bar/Baz.php <= 読む。あった。終わり。

include_path = "1:2:3:4:5:6:7:8:9:." の場合で
./1/Foo/Bar.php などが全部ある場合、30ファイル目をrequireしたところで終了する。
その無駄な29ファイルはrequireしただけでは何も実行部分が無い定義だけのファイルであること、を期待している。

$class = new \Foo\Bar_Baz; のように1つ目がnamespaceであることを期待しているような気もするが強制していない。
多分\Foo\であれば"use xxx as xxx"できっと名前の競合をきっと防げる、のではないか?と思うので。

多分スラッシュとバックスラッシュが見分けにくいフォントがお気に入りの場合、つらい。
ドット、カンマ、コロン、セミコロンが見分けにくいフォントがあるのと、あんまり変わらない問題のようにも感じる。
さすがにスラッシュとバックスラッシュは無いか?見分けにくいフォントを使うのは?色んな場面でかなり不便のはずだし。

(1 + (15 + 1 + 15) * 15) = 466 <= こんな長いクラス名の一部があるかどうかは別にしてマッチする可能性はある。
こういう部分で正規表現を使うのはマナー違反的な何かがある。でかい文字に正規表現処理したらセグメンテーション違反とかね。



探す順番を制御できないがinclude_onceのほうがシンプル。
<?php
spl_autoload_register(function($className)
{
    $successFlag = false;
    do {
        $classNameList = array();
        $errorFlag = false;
        preg_replace_callback(
            "/([A-Z][a-z0-9]{0,9}[a-z][a-z0-9]{0,9})|(.)/",
            function($matches) use(&$classNameList, &$errorFlag) {
                if (!$errorFlag) {
                    switch (true) {
                    case (is_string($matches[1]) && $matches[1] !== ""):
                        $classNameList[] = $matches[1];
                        break;
                    case (is_string($matches[2])):
                        switch (true) {
                        case (in_array($matches[2], array("\\", "_"), true)):
                            break;
                        default:
                            $errorFlag = true;
                        }
                        break;
                    default:
                        trigger_error("\$className parse error.", E_USER_ERROR);
                    }
                }
            }, $className);
        if ($errorFlag) {
            break;
        }
        $currentDir1 = "";
        $classNameListTmp = $classNameList;
        foreach ($classNameList as $val1) {
            $currentDir2 = "";
            foreach ($classNameListTmp as $val2) {
                $file = $currentDir1 . $currentDir2 . $val2 . ".php";
                @include_once($file);
                if (class_exists($className)) {
                    $successFlag = true;
                    break 2;
                }
                $currentDir2 .= $val2;
            }
            $currentDir1 .= $val1 .DIRECTORY_SEPARATOR;
            array_shift($classNameListTmp);
        }
    } while (false);
});

/*
set_include_path("001:002:003");
$class = new \Foo\Bar\Baz;

001/Foo/Bar/Baz.php
001/Foo/BarBaz.php
001/Foo/Bar.php
001/FooBarBaz.php
001/FooBar.php
001/Foo.php
002/Foo/Bar/Baz.php
002/Foo/BarBaz.php
002/Foo/Bar.php
002/FooBarBaz.php
002/FooBar.php
002/Foo.php
003/Foo/Bar/Baz.php
003/Foo/BarBaz.php
003/Foo/Bar.php
003/FooBarBaz.php
003/FooBar.php
003/Foo.php
*/
spl_autoload_register(function($className)
{
    static $includePathList;
    if (!is_array($includePathList)) {
        $includePathList = explode(PATH_SEPARATOR, get_include_path());
        foreach ($includePathList as $key => $dir) {
            if (!is_dir($dir) || !is_readable($dir)) {
                unset($includePathList[$key]);
            }
        }
        $includePathList = array_reverse($includePathList);
    }
    do {
        $classNameList = array();
        $errorFlag = false;
        preg_replace_callback(
            "/([A-Z][a-z0-9]{0,9}[a-z][a-z0-9]{0,9})|(.)/",
            function($matches) use(&$classNameList, &$errorFlag) {
                if (!$errorFlag) {
                    switch (true) {
                    case (is_string($matches[1]) && $matches[1] !== ""):
                        $classNameList[] = $matches[1];
                        break;
                    case (is_string($matches[2])):
                        switch (true) {
                        case (in_array($matches[2], array("\\", "_"), true)):
                            break;
                        default:
                            $errorFlag = true;
                        }
                        break;
                    default:
                        trigger_error("\$className parse error.", E_USER_ERROR);
                    }
                }
            }, $className);
        if ($errorFlag) {
            break;
        }
        $fileList = array();
        foreach ($includePathList as $includeDir) {
            $currentDir1 = $includeDir . DIRECTORY_SEPARATOR;
            $classNameListTmp = $classNameList;
            foreach ($classNameList as $val1) {
                $currentDir2 = "";
                foreach ($classNameListTmp as $val2) {
                    $file = $currentDir1 . $currentDir2 . $val2 . ".php";
                    if (is_file($file)) {
                        $fileList[] = $file;
                    }
                    $currentDir2 .= $val2;
                }
                if (count($classNameListTmp) <= 1) {
                    break;
                }
                $currentDir1 .= $val1 . DIRECTORY_SEPARATOR;
                if (!is_dir($currentDir1)) {
                    break;
                }
                array_shift($classNameListTmp);
            }
        }
        for ($i = count($fileList) - 1; $i >= 0; --$i) {
            @include_once($fileList[$i]);
            if (class_exists($className)) {
                break;
            }
        }
    } while (false);
});

2013-09-03

memo: vmware player, VirtualBox

VMnet8が192.168.129.1の場合でNATの場合 gateway 192.168.129.2, ipaddress 192.168.129.3-127 かもしれない。
仮想ネットワークエディタの使用はポートフォワーディングが必要な場合などのみ、かもしれない。
VirtualBoxを入れると休止状態から復帰した場合にvmware-playerのブリッジ接続ができなくなる場合がある。

以下は詳細です。

参考URL.
http://thatsdone-j.blogspot.jp/2013/01/vmware-player.html
http://blog.kondoyoshiyuki.com/2012/08/18/fix-ip-address-on-vmware-player/
http://prog.hateblo.jp/entry/2012/04/03/105927
http://qiita.com/nojima/items/4ee930105f947fc2e818
http://www.kuron-zero.com/port/windows7a.php

http://qiita.com/nojima/items/4ee930105f947fc2e818
管理者権限でコマンドプロンプトを開く。
    cd "C:\Program Files (x86)\VMware\VMware Player"
    rundll32 vmnetui.dll,VMNetUI_ShowStandalone

仮想ネットワークエディタ
↓
VMnet8  NAT  NAT  接続済み  有効  129.168.129.0  (最初からこうだった)
↓
選択してNAT設定
↓
ネットワーク     : vmnet8
...
ゲートウェイIP(G): 192.168.129.2 (最初からこうだった?触っていないはずだが微妙な値が入っている気持ちになる。)
...
ポート転送(F)
22  TCP  192.168.129.20:22 (これ追加のみ。これは入れた。)
...
OK押して適用が押せる状態になっているはずなので押す。

仮想ネットワークエディタのDHCPの設定の範囲外(192.168.129.128~254以外。255と1と2以外。)にした。
$ rcsdiff /etc/config-archive/etc/sysconfig/network-scripts/ifcfg-eth0,v /etc/sysconfig/network-scripts/ifcfg-eth0
===================================================================
RCS file: /etc/config-archive/etc/sysconfig/network-scripts/ifcfg-eth0,v
retrieving revision 1.1
diff -r1.1 /etc/sysconfig/network-scripts/ifcfg-eth0
8c8
< IPADDR="192.168.0.220"
---
> IPADDR="192.168.129.20"
10a11,13
> GATEWAY=192.168.129.2
> NETMASK=255.255.255.0
> BROADCAST=192.168.129.255

他のブリッジ接続のほうからは無理だった。
(windows,putty => ブリッジ接続のlinux => ssh 192.168.129.20 x)
windowsから直接sshしたところ、つながった。
(windows,putty => ssh 192.168.129.20 o)

いじっていないはず。過去にいじったかどうかは不明。
ネットワーク接続
VMware Network Adapter VMnet8のプロパティ
インターネットプロトコルバージョン4(tcp/ipv4)のプロパティは無変更
IPアドレス      : 192.168.129.1
サブネットマスク: 255.255.255.0
他は記入なし。

見た感じ GATEWAY=192.168.129.1 じゃダメなのか?のテスト。
仮想ネットワークエディタのNATの設定
ゲートウェイIP(G): 192.168.129.1 に変更。

centosのほうの設定変更
$ route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.129.0   0.0.0.0         255.255.255.0   U     1      0        0 eth0
0.0.0.0         192.168.129.1   0.0.0.0         UG    0      0        0 eth0

$ ifconfig |grep 192.168.129
          inet addr:192.168.129.20  Bcast:192.168.129.255  Mask:255.255.255.0

ダメだった。多分最初からNAT設定のGATEWAYは末尾2だった。

DNSは下記。これは実際のgateway=dnsの状態で。
$ cat /etc/resolv.conf 
# Generated by NetworkManager
search localnet
nameserver 192.168.0.1

ping test.
NATのOS => GATEWAY, DNS, 外, 多分OK
NATのOS => windows, ブリッジの他のos => 無理

$ ping -c1 192.168.0.1
PING 192.168.0.1 (192.168.0.1) 56(84) bytes of data.
64 bytes from 192.168.0.1: icmp_seq=1 ttl=128 time=1.11 ms

--- 192.168.0.1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 1ms
rtt min/avg/max/mdev = 1.111/1.111/1.111/0.000 ms

$ ping -c1 www.google.co.jp
PING www.google.co.jp (173.194.72.94) 56(84) bytes of data.
64 bytes from tf-in-f94.1e100.net (173.194.72.94): icmp_seq=1 ttl=128 time=35.4 ms

--- www.google.co.jp ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 43ms
rtt min/avg/max/mdev = 35.498/35.498/35.498/0.000 ms

$ ping -c1 129.168.0.80
PING 129.168.0.80 (129.168.0.80) 56(84) bytes of data.

--- 129.168.0.80 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 10000ms

$ ping -c1 129.168.0.110
PING 129.168.0.110 (129.168.0.110) 56(84) bytes of data.

--- 129.168.0.110 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 10000ms

ブリッジのOS => NATのOS 無理。
ブリッジのOS => 192.168.129.1 x
ブリッジのOS => 192.168.129.2 x
ブリッジのOS => 192.168.129.20 x

windows7 => 192.168.129.1 o
windows7 => 192.168.129.2 x
windows7 => 192.168.129.20 o

ssh test.
windows7 => 192.168.129.20 o

natのosが外を見れる。
windowsからsshできる。
よくわからないが目的を達成したので成功。



同じネットワークであればpingは通るっぽい。
$ rcsdiff /etc/config-archive/etc/conf.d/net,v /etc/conf.d/net
===================================================================
RCS file: /etc/config-archive/etc/conf.d/net,v
retrieving revision 1.1
diff -r1.1 /etc/conf.d/net
9,10c9,10
< config_eth0="192.168.0.110 netmask 255.255.255.0 brd 192.168.0.255"
< routes_eth0="default via 192.168.0.1"
---
> config_eth0="192.168.129.21 netmask 255.255.255.0 brd 192.168.129.255"
> routes_eth0="default via 192.168.129.2"
12a13
> txqueuelen_eth0="65535"

$ ping -c3 192.168.129.20
PING 192.168.129.20 (192.168.129.20) 56(84) bytes of data.
64 bytes from 192.168.129.20: icmp_seq=1 ttl=64 time=0.680 ms
64 bytes from 192.168.129.20: icmp_seq=2 ttl=64 time=0.451 ms
64 bytes from 192.168.129.20: icmp_seq=3 ttl=64 time=0.431 ms

--- 192.168.129.20 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2000ms
rtt min/avg/max/mdev = 0.431/0.520/0.680/0.115 ms

自分のPCでlinux上のemacsなどのエディタが使いたいだけであれば、ポートフォワーディングはいらない。

ポート転送(F), 22  TCP  192.168.129.20:22
実際のwindowsのループバックの22。
ssh 127.0.0.1:22
他の実際のOSから見たwindowsのIPアドレスのport22で。
ssh 192.168.0.80:22

ポート転送(F), 22  TCP  192.168.129.21:10022
実際のwindowsのループバックの10022。
ssh 127.0.0.1:10022
他の実際のOSから見たwindowsのIPアドレスのport10022で。
ssh 192.168.0.80:10022

他の実際のパソコンから見るためにはファイアウォールに設定する。
http://www.kuron-zero.com/port/windows7a.php
tcp 22, 10022 開ける。

vmware立ち上げたところのwindowsからだけであればいらない。
ssh 192.168.129.20:22
ssh 192.168.129.21:22

vmware playerが無理だったらssh接続であればVirtualBoxもあり。
仮想マシン
設定
ネットワーク
割り当てNAT
ポートフォワーディング
Rule1  TCP  127.0.0.1  22  10.0.2.15  22

windowsから 127.0.0.1:22 でOK.
# /etc/sysconfig/network-scripts/ifcfg-eth0 変更していないが ifconfig, route 変化あり。
# 10.0.2.15 を固定できるか知らないが多分出来る気がする。

確認。
ポートフォワーディング
Rule1  TCP  127.0.0.1  22  10.0.2.115  22
に変更。

ifcfg-eth1を作成

$ cat /etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE="eth1"
BOOTPROTO="static"
NM_CONTROLLED="yes"
ONBOOT="yes"
TYPE="Ethernet"
IPADDR="10.0.2.115"
NETMASK="255.255.255.0"
DNS1="192.168.0.1"
GATEWAY=10.0.2.2
NETMASK=255.255.255.0
BROADCAST=10.0.2.255