2019年3月24日 星期日

使用 docker + py-kms 搭建KMS服務器激活環境

若在 image 裡加裝 git,會增加大約 50MB 的大小。因此,事先下載 py-kms 的程式,再 copy 到 image 裡。
$ git clone https://github.com/SystemRage/py-kms.git

使用 CentOS 的 Dockerfile
FROM centos:centos7.6.1810

RUN yum -y install epel-release && \
    yum -y install \
           python36 python36-setuptools && \
    yum clean all && \
    rm -rf /var/cache/yum && \
    easy_install-3.6 pip && \
    pip3 install tzlocal && \
    pip3 install pysqlite3 && \
    rm -rf /root/.cache

ADD ./py-kms/py3-kms /app

WORKDIR /app

# Microsoft's KMS port
EXPOSE 1688

CMD ["python36", "server.py"]
可以使用 Python3 的 image,但實在太大了,有 900多MB。若使用 jfloff/alpine-python:3.6-slim 的 image,則可降到 100MB 以下,其 Dockerfile 如下
FROM jfloff/alpine-python:3.6-slim

RUN pip3 install tzlocal && \
    pip3 install pysqlite3 && \
    rm -rf /root/.cache && \
    touch /requirements.installed

ADD ./py-kms/py3-kms /app

WORKDIR /app

# Microsoft's KMS port
EXPOSE 1688

CMD ["python3", "server.py"]

docker-compose.yml 的內容
py-kms:
  build: .
  ports:
    - 1688:1688
建立 image 及 執行
$ docker-compose build
  
$ docker-compose up -d

測試結果
# docker exec -it py-kms-server_py-kms_1 bash

[root@d5bc8bfc000f app]# python36 client.py localhost
Client generating RPC Bind Request...
        Server receiving
Client sending RPC Bind Request...    ===============>
        Server sending
Client received RPC Bind Response !!!    <===============
RPC Bind acknowledged !!!

Client generating Activation Request dictionary...
Client generating Activation Request data...
Client generating RPC Activation Request...
        Server receiving
Client sending RPC Activation Request...   ===============>
        Server sending
Client received Response !!!     <===============
Activation Done !!!
大概如此

有人使用 python 的 image 來建立,但 size 太大了,各 image 大小比較
  • jfloff/alpine-python:3.6-slim: 83.7MB
  • CentOS7+Python36: 275MB
  • CentOS7+Python36+git: 329MB
  • Python3: 929MB

執行認證
slmgr -skms 172.16.16.15
slmgr -ato
測試看成不成功

2019年3月18日 星期一

LARAVEL 5 使用 DB-RAW SQL搭配 PAGINATION 自動分頁功能

參考網頁
LARAVEL 5 使用 DB-RAW SQL搭配 PAGINATION 自動分頁功能

原始的簡單作法

要取得分頁的資料,可以使用 query builder。
$data = DB::table('projects')
    ->groupBy('id')
    ->orderBy('id', 'asc')
    ->paginate(15); 
但在線上資料有如下的提示
Note: Currently, pagination operations that use a groupBy statement cannot be executed efficiently by Laravel. If you need to use a groupBy with a paginated result set, it is recommended that you query the database and create a paginator manually.

上面的查詢,可改成直接用 SQL 指令的查詢如下。
$sql = "SELECT * FROM projects
        GROUP BY id
        ORDER BY id ASC";

$query = DB::select($sql); 
依照網頁的說明,原始的 SQL 指令,可以自行使用分頁函式來建立分頁資料
Sometimes you may wish to create a pagination instance manually, passing it an array of items. You may do so by creating either an Illuminate\Pagination\Paginator  or   Illuminate\Pagination\LengthAwarePaginator  instance, depending on your needs.

自己建立分頁資料的作法如下

use Illuminate\Pagination\LengthAwarePaginator;
use Illuminate\Pagination\Paginator; 

$query = DB::select($sql);
$page = Paginator::resolveCurrentPage("page");
$perPage = $count; // 實際每頁筆數
$offset = ($page * $perPage) - $perPage;

$data = new LengthAwarePaginator(
    array_slice($query, $offset, $perPage, true), 
    count($query), 
    $perPage, 
    $page, 
    ['path' =>  Paginator::resolveCurrentPath()]
); 
其中 DB::select() 函式會回傳整個查詢結果。
$query = DB::select( DB::raw($sql) ); 
然後,再用 array_slice() 擷取對應該 page 的資料列。
array_slice($query, $offset, $perPage, true)

$data 就是整個查詢出來的data。

使用 MSSQL 的 cursor 的作法

上述作法,因為 DB::select() 會傳回所有的資料,會使得效率較差。例如 64,679 筆資料,要花 1.7秒左右,假如使用 SQL 2008 的 cursor,只取回所需的 10筆,大約只要 0.2秒左右。

另外,上述程式中取得 page 和 url 的作法,在只使用 Laravel 部分 component,而不是使用 Laravel framework 的情況時,無法無法正常運作,因此改用 Request 的作法。

$pdo = DB::connection()->getPdo();

$stmt = $pdo->prepare($sql, [
    PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL,
    PDO::SQLSRV_ATTR_CURSOR_SCROLL_TYPE => PDO::SQLSRV_CURSOR_STATIC
]);

$stmt->execute($param);

// Get the total number of rows returned by the query.
$totalCount = $stmt->rowCount();
$perPage = $count; // 實際每頁筆數
$page = $page = trim(Request::input('page', '1'));
$offset = ($page * $perPage) - $perPage;
$rows = array();

$i = 0;
while($row = $stmt->fetch(
    PDO::FETCH_ASSOC,
    PDO::FETCH_ORI_ABS,
    $offset + $i
)) {
    // dump($row);
    $rows[] = ($row);
    $i++;

    if ($i >= $pPageRows) {
        break;
    }
}

$stmt = null;

$data = new LengthAwarePaginator($rows, $totalCount, $perPage, $page,
    ['path' => Request::url()]); 


2019年3月17日 星期日

機械鍵盤加裝小紅點,資料收集

IBM 推出的在鍵盤上具有 trackpoint 的 Thinkpad 筆電和鍵盤,在寫程式或文章時,很好用,雙手不用離開鍵盤,當然,打電動還是滑鼠吧。因為那個 trackpoint 的頂帽是紅色的,所以叫 "小紅點",中國大陸叫指點桿。我平常都用桌機,因此外接小紅點鍵盤是我最常使用的生產工具之一。

六列式剪刀腳的外接 USB 小紅點鍵盤 (ThinkPad USB keyboard with trackpoint),有三種型式,SK-8835、 SK-8845、SK-8855。我從第一把用到第三把,尤其在 SK-8855 停產後,更是多買了好幾把來備用。

SK-8835 键盘推出時間為 2005年,從 THINKPAD T42、T43上移植下来的。在當時期待有小紅點的鍵盤已久,它一推出立刻去買一把,價格台幣 3千多元。後來同事也各買一把,但他們從來沒用那個小紅點實在可惜啊。這個鍵盤實在有夠大,右邊的數字鍵盤我完全沒用到,讓我沒地方擺滑鼠,真想把它切了。




SK-8845 是
在 2008 年推出,少了右邊的數字按鍵。因為那個數字鍵實在礙人,一推出立刻就去買了。但還有 touchpad,那個也很礙事,不小心會碰到,很想把它拔掉。後來是用紙板把它蓋住。


SK-8855 推出時間為 2010年,2014年停產,也是最後的六列式剪刀腳小紅點外接 USB 鍵盤。後來的鍵盤行程變短就很難用了。

最後的 SK-8855 是我使用了好長一段時間的鍵盤,就為了那顆小紅點 (Trackpoint)。時常會心動想改用機械鍵盤,但少了那顆小紅點,就只好作罷。直到某天才知道那個小紅點模組 (Trackpoint module) 就是一個完整的 PS/2 滑鼠,就燃起了希望,可以自己搞定在機械鍵盤上加裝小紅點模組 (Mechanical keyboard with Trackpoint)。

對於小紅點模組,能得到的資料只有最早 IBM 公開的說明書。後來有不同的版本,有的還可以外接 touchpad。每個版本的外型和接腳都不一樣,各接腳的信號也不同。先搜集一下網路上的資料,多瞭解一些,比較保險,避免不小心損壞小紅點模組。

參考網頁


SK-8835 的基本資訊

SK-8835 和 SK-8845 是 IBM 早期推出的外接小紅點鍵盤,附有觸控板的小紅點鍵盤,它的鍵盤模組與下列筆電相容 IBM x30 x31 x32 T40 T40p T41 T41p T42 T42p T43 T43p r32 r40 R50 R50e R50p R51 R51e R51p R52 R52p

我後來使用最久的是 SK-8855,沒有觸控板,它的鍵盤模組與下列筆電相容 ThinkPad T400S T410 T410S T410i T420 T420S T420i T510 T510i W510 W520 X220 X220S X220T

在網路上可以搜集到一些模組的接腳說明,但不是很確定是手上的模組是那一種排列,先收集再來確認。




使用 Teensy 2.0 開發板連接 R40 模組的情形。


系統抓到的 SK-8855 資訊

瞭解 SK-8855 的軟體資訊。在 Linux 下,列出裝置 SK-8835 的資訊
# xinput
⎡ Virtual core pointer                      id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                id=4    [slave  pointer  (2)]
⎜   ↳ Synaptics Inc. Composite TouchPad / TrackPoint    id=22   [slave  pointer  (2)]
⎜   ↳ Synaptics Inc. Composite TouchPad / TrackPoint    id=23   [slave  pointer  (2)]
⎣ Virtual core keyboard                     id=3    [master keyboard (2)]
    ↳ Virtual core XTEST keyboard               id=5    [slave  keyboard (3)]
    ↳ Lite-On Tech IBM USB Travel Keyboard with UltraNav System Control id=19   [slave  keyboard (3)]
    ↳ Lite-On Tech IBM USB Travel Keyboard with UltraNav    id=20   [slave  keyboard (3)]
    ↳ Lite-On Tech IBM USB Travel Keyboard with UltraNav Consumer Control   id=21   [slave  keyboard (3)]

USB 裝置看到的資訊
# lsusb
Bus 001 Device 019: ID 06cb:0009 Synaptics, Inc. Composite TouchPad and TrackPoint
Bus 001 Device 018: ID 04b3:3019 IBM Corp. 
Bus 001 Device 017: ID 04b3:3016 IBM Corp. UltraNav Keyboard Hub

找出它的 vendor id
# dmesg | grep -i synap
[  255.926699] usb 1-1.4: Manufacturer: Synaptics Inc.
[  255.930814] input: Synaptics Inc. Composite TouchPad / TrackPoint as /devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.4/1-1.4:1.0/0003:06CB:0009.000B/input/input28
[  255.930946] hid-generic 0003:06CB:0009.000B: input,hidraw9: USB HID v1.00 Mouse [Synaptics Inc. Composite TouchPad / TrackPoint] on usb-0000:00:14.0-1.4/input0
[  255.933549] input: Synaptics Inc. Composite TouchPad / TrackPoint as /devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.4/1-1.4:1.1/0003:06CB:0009.000C/input/input29
[  255.933726] hid-generic 0003:06CB:0009.000C: input,hidraw10: USB HID v1.00 Mouse [Synaptics Inc. Composite TouchPad / TrackPoint] on usb-0000:00:14.0-1.4/input1
[ 4095.812773] usb 1-1.4: Manufacturer: Synaptics Inc.
[ 4095.822378] input: Synaptics Inc. Composite TouchPad / TrackPoint as /devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.4/1-1.4:1.0/0003:06CB:0009.000F/input/input33
[ 4095.822885] hid-generic 0003:06CB:0009.000F: input,hidraw9: USB HID v1.00 Mouse [Synaptics Inc. Composite TouchPad / TrackPoint] on usb-0000:00:14.0-1.4/input0
[ 4095.826257] input: Synaptics Inc. Composite TouchPad / TrackPoint as /devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.4/1-1.4:1.1/0003:06CB:0009.0010/input/input34
[ 4095.826755] hid-generic 0003:06CB:0009.0010: input,hidraw10: USB HID v1.00 Mouse [Synaptics Inc. Composite TouchPad / TrackPoint] on usb-0000:00:14.0-1.4/input1
[ 4524.939148] usb 1-1.4: Manufacturer: Synaptics Inc.
[ 4524.944395] input: Synaptics Inc. Composite TouchPad / TrackPoint as /devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.4/1-1.4:1.0/0003:06CB:0009.0013/input/input38
[ 4524.944852] hid-generic 0003:06CB:0009.0013: input,hidraw9: USB HID v1.00 Mouse [Synaptics Inc. Composite TouchPad / TrackPoint] on usb-0000:00:14.0-1.4/input0
[ 4524.948361] input: Synaptics Inc. Composite TouchPad / TrackPoint as /devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.4/1-1.4:1.1/0003:06CB:0009.0014/input/input39
[ 4524.948903] hid-generic 0003:06CB:0009.0014: input,hidraw10: USB HID v1.00 Mouse [Synaptics Inc. Composite TouchPad / TrackPoint] on usb-0000:00:14.0-1.4/input1
[ 4728.236457] usb 1-1.4: Manufacturer: Synaptics Inc.
[ 4728.240581] input: Synaptics Inc. Composite TouchPad / TrackPoint as /devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.4/1-1.4:1.0/0003:06CB:0009.0017/input/input43
[ 4728.240797] hid-generic 0003:06CB:0009.0017: input,hidraw9: USB HID v1.00 Mouse [Synaptics Inc. Composite TouchPad / TrackPoint] on usb-0000:00:14.0-1.4/input0
[ 4728.243559] input: Synaptics Inc. Composite TouchPad / TrackPoint as /devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.4/1-1.4:1.1/0003:06CB:0009.0018/input/input44
[ 4728.243802] hid-generic 0003:06CB:0009.0018: input,hidraw10: USB HID v1.00 Mouse [Synaptics Inc. Composite TouchPad / TrackPoint] on usb-0000:00:14.0-1.4/input1

因為正在使用中,無法 unbind 裝置,所以無法使用 pyusb 傳送設定資料,就不繼續測下去了。

控制板選用

The Pro Micro is an Arduino-compatible microcontroller board developed under an open hardware license by Sparkfun. Clones of the Pro Micro are often used as a lower-cost alternative to a Teensy 2.0 as a basis for a DIY keyboard controller/converter when a lower number of pins would suffice.

Like the Teensy 2.0, it sports an AVR ATmega32u4 8-bit microcontroller which has an integrated USB controller. It has a micro-USB type B port (Teensy 2.0: mini-USB), 18 I/O pins (Teensy 2.0: 25 I/O pins) and an integrated voltage regulator for 3V operation.

基於前述說明,Teensy 2.0 的 pin 會多一些,可能比較好。
----------------------
目前使用的是 ThinkPad Lenovo 聯想 SK-8855 外接 USB 鍵盤,這個已經絕版。而現在機械鍵盤好像頗為熱門,可惜沒有加上小紅點 (trackpoint) 的鍵盤。

其實也變猶豫的,SK-8855 用起來還順手,是否要折騰自己改裝機械鍵盤,加上小紅點模組 (trackpoint module)。而自己在硬體改裝能力上,並不擅長,尤其機構,更是束手無策。另外,目前都採用薄膜電路,SMD 元件,連電子電路也動不了。

無論如何,先收集一下資料,再來研究一下可行性。

POKER改小紅點 TRACKPOINT MOD

小紅點控制板接線方式_存檔用

更新-POKER改小紅點 TRACKPOINT MOD-加上滾輪了

Topic: Looking for Trackpoint controller IC pinout

終於被我找到了,關鍵字 "x220 trackpoint module pinout","T400S T410 T410S T410i T420 T420S T420i T510 T510i W510 W520 X220 X220S X220T",用這些關鍵字去找。找到了下列幾個網站。


下面是鍵盤PCB板的連接情形

這個接頭是 Japan Aviation Electronics (JAE)  AA01B-S040VA1。這個是 0.4mm間距 40PIN 板對板連接器,有可能焊接嗎?



接頭的接點,是不可能焊接的,但轉個彎還是有解。轉換板上有3個測試點,對應到 3個信號。
TP1 => RST
TP2 => DAT
TP3 => CLK
接好後,經測試,OK 可以動作。但是一不小心,就把銅箔焊得掉下來了,好在那個是 reset 信號,有好多個接點可焊。焊好後,趕緊用膠布纏好,不敢再動它,以免全部泡湯。

Poor man's tex yoda
the module is from an x220 keyboard, of course in a 3D printed case. it's just connected to a PS/2 cable since that's what it outputs. it also has pins for the mouse buttons built in.
I'm on linux, so to speed up the pointer for my 4k monitor and get middle click scrolling, I run this:
xinput --set-prop "pointer:Barcode Reader " "libinput Scroll Method Enabled" 0 0 1
xinput --set-prop "pointer:Barcode Reader " "libinput Accel Speed" 1
you can get your PS/2 device with "xinput --list"
the switches are black complicated alps from an old keyboard. I used to have keycaps, but it interferes with the spacebar so I've left them off.

HHKBにトラックポイントを内蔵する方法 その4 - トラックポイントの設置
日本人的成品,機構 -- 搞電子的人的短板,最多只會做到用 AB膠黏。



Female connector from the front
Pin 1+DATAData
Pin 2Not connected[b]
Pin 3GNDGround
Pin 4Vcc+5 V DC at 275 mA
Pin 5+CLKClock
Pin 6Not connected[c]


硬派精璽 (in_pad) 賣家,在露天和Yahoo 拍賣上,有賣 TEX Yoda II DIY零組件|Trackpoint小紅點模組(含螺絲),一個 750 元。如下圖,其中一個鼠桿被我掰斷了。


在下面這個連結找到相關廠商,鈦思電子 (TEX),台北巿內湖路1段411巷21號,TEL: 02-2627-7372,不曉得能不能直接找它買那個延伸桿。

ThinkPad 25周年键盘小红点维修记录,這篇文在說键盘的小红点指点杆损坏了,变得松松夸夸,功能不正常。

網路上的改裝實例

網路上找到的改裝實例,參考一下別人怎麼改的


機械鍵盤的 Dimension
GH - B,兩排間距 20mm,Trackpoint 中心,離B的中心,11mm,就是偏上 2mm。

IMB trackpoint stem DIY

有人開發轉換板,使用 Thinkpad 的鍵盤

可惜,不知怎麼找到那個 转换板,连接转换板,有了那個才能接上鍵盤

Teensy 2.0 USB AVR 開發板

花幾千塊,買一個 SK-8855 來殺,只為了取得那個 USB 轉接板,成本實在太高了。網路上有人用 Teensy2.0USB AVR 開發板來接小紅點模組,這個開發板在網拍上用 360 元就能買到。

關鍵字是 "Teensy2.0USB AVR 開發板 鍵盤滑鼠ISP U盤實驗板 mega32u4 W177"。

下面是討論的連結
https://geekhack.org/index.php?topic=8971.msg775152#msg775152
https://github.com/Nephiel/tmk_keyboard/blob/master/tmk_core/protocol/ps2_mouse.c


網誌存檔