tzdata 2024a-0+deb11u1

Upgrade package บน raspberrypi วันนี้มี package ที่ต้อง update แต่มีปัญหาอยู่ เจ้า package อันนั้นก็คือ

tzdata 2024a-0+deb11u1

ซึ่ง upgrade ไปแล้วจะได้ผลประมาณนี้

Fetched 13.2 MB in 1min 14s (180 kB/s)                                                                                                                                                                             
Reading package lists... Done                                                                                                                                                                                      
Reading package lists... Done                                                                                                                                                                                      
Building dependency tree... Done                                                                                                                                                                                   
Reading state information... Done                                                                                                                                                                                  
Calculating upgrade... Done                                                                                                                                                                                        
The following packages will be upgraded:                                                                                                                                                                           
  tzdata                                                                                                                                                                                                           
1 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.                                                                                                                                                     
Need to get 0 B/304 kB of archives.                                                                                                                                                                                
After this operation, 931 kB of additional disk space will be used.                                                                                                                                                
apt-listchanges: Reading changelogs...                                                                                                                                                                             
Preconfiguring packages ...                                                                                                                                                                                        
(Reading database ... 52286 files and directories currently installed.)                                                                                                                                            
Preparing to unpack .../tzdata_2024a-0+deb11u1_all.deb ...                                                                                                                                                         
Unpacking tzdata (2024a-0+deb11u1) over (2023c-5) ...                                                                                                                                                              
dpkg: error processing archive /var/cache/apt/archives/tzdata_2024a-0+deb11u1_all.deb (--unpack):                                                                                                                  
 unable to open '/usr/share/zoneinfo/posix/Africa/Abidjan.dpkg-new': No such file or directory                                                                                                                     
Errors were encountered while processing:                                                                                                                                                                          
 /var/cache/apt/archives/tzdata_2024a-0+deb11u1_all.deb                                                                                                                                                            
needrestart is being skipped since dpkg has failed                                                                                                                                                                 
E: Sub-process /usr/bin/dpkg returned an error code (1)                                                                                                                                                            

ตรวจสอบดูแล้ว คิดว่าย้อนกลับไปใช้ตัวเก่าจะดีกว่า

cj@pi01:~ $ apt-cache policy tzdata                                                                                                                                                                                
tzdata:                                                                                                                                                                                                            
  Installed: 2023c-5                                                                                                                                                                                               
  Candidate: 2024a-0+deb11u1                                                                                                                                                                                       
  Version table:                                                                                                                                                                                                   
     2024a-0+deb11u1 500                                                                                                                                                                                           
        500 http://ftp.jaist.ac.jp/raspbian bullseye/main armhf Packages                                                                                                                                           
 *** 2023c-5 500                                                                                                                                                                                                   
        500 http://ftp.jaist.ac.jp/raspbian bookworm/main armhf Packages                                 
        100 /var/lib/dpkg/status                    

ติดตั้ง version 2023c-5 โดยการใช้คำสั่ง

sudo apt install tzdata=2023c-5       

จบ

sysdig and strace

มี application อยู่ 2 ตัวที่ใช้สำหรับ trace ว่า โปรแกรมตัวนึงมันติดต่อผ่าน network ไปที่ไหนบ้าง

  • sysdig
  • strace

ทั้งสองตัวมีเป็น package ให้ติดตั้งแล้ใช้งานได้บน debian/ubuntu และเดาว่าน่าจะมีบน Linux distro ทั่วๆไปทั้งหมด

sysdig — ยังไม่เคยลองใช้งานจริงจังมาก่อน แต่ดูแล้ววน่าสนใจ เพราะเขียนโปรแกรมร่วมเข้าไปใช้งานในการวิเคราะห์ข้อมูลได้ (แต่ยังไม่ได้ลอง)

ตัวอย่าง จะใช้ sysdig สำหรับ trace event ที่เกิดขึ้น กับโปรแกรม ping
เราอยากจะรู้ว่า มี event อะไรเกิดขึ้นบ้างถ้าเราใช้คำสั่ง

ping -c 3 8.8.8.8

ทำได้ประมาณนี้
จาก terminal หนึ่ง ให้ run คำสั่ง

sudo sysdig proc.name='ping'

และ อีก terminal หนึ่งให้ไป run คำสั่ง

ping -c 3 8.8.8.8

ที่ terminal แรกก็จะเห็นผลลัพธ์ประมาณนี้

98006 10:06:55.851978155 3 ping (2145859.2145859) < execve res=0 exe=ping args=-c.3.8.8.8.8. tid=2145859(ping) pid=2145859(ping) ptid=2114748(bash) cwd= fdlimit=1024 pgft_maj=0 pgft_min=31 vm_size=460 vm_rss=4 vm_swap=0 comm=ping cgroups=cpuset=/user.slice.cpu=/user.slice/user-1000.slice/user@1000.service/app.slic... env=SHELL=/bin/bash.SESSION_MANAGER=local/trantor:@/tmp/.ICE-unix/16757,unix/tran... tty=34829 pgid=2145859(ping) loginuid=1000 flags=0 
98007 10:06:55.852042985 3 ping (2145859.2145859) > access mode=0(F_OK) 
98008 10:06:55.852070023 3 ping (2145859.2145859) < access res=-2(ENOENT) name=/etc/suid-debug 
98009 10:06:55.852087854 3 ping (2145859.2145859) > brk addr=0 
...

ถ้าจะดูผลเฉพาะการติดต่อกับ network (สำหรับ ping) ก็ใช้คำสั่งนี้

sudo sysdig proc.name='ping' |  grep -E 'sendto|recvmsg'

ลองดู blog ตัวนี้

https://sysdig.com/blog/sysdig-tracers/

Tag line ของ blog ก็คือ “open source transaction tracing meets htop and strace” ซึ่งจะชี้ไปที่ strace

strace — system trace เทียบกับ sysdig ที่เป็นการ trace event ที่เกิดขึ้นบนระบบทั้งหมด แล้วค่อยมา filter เลือกเอา event ที่สนใจ เช่น event ที่เกิดขึ้นจาก โปรแกรม ping ก็ใช้ proc.name=’ping’

สำหรับ strace จะใช้ในลักษณะของ wrapper ที่จะ wrap โปรแกรมนั้นและแสดง system trace ที่โปรแกรมนั้นเรียกใช้ทั้งหมด เช่น ต้องการดู trace ของ ping

ping -c 3 8.8.8.8

ก็ใช้คำสั่ง

sudo strace ping -c 3 8.8.8.8

ถ้าต้องการดูเฉพาะ network activity ก็ใช้คำสั่ง

sudo strace -e trace=network ping -c 3 8.8.8.8

ถ้าโปรแกรมที่ trace นั้นมีการ fork sub process แล้วเราต้องการ trace sub process นั้นด้วย ก็ต้องเพิ่ม option “-f” หรือ “–follow-forks”

ทดสอบ mail

root@debian-12:~# dns-scout 
IPINFO_API_TOKEN environment variable not set.
Enter ipinfo.io API token, or press return to skip ASN: 
 Enter domain, IP (or 'exit' to quit): 
 ------------------------------------
 cjv6.net
 Reg   🟢: PDR Ltd. d/b/a PublicDomainRegistry.com
 IPs   🟢: 128.199.245.86, 2400:6180:0:d0::28d:3001
 NS    🟢: ns2.cjv6.net, ns1.cjv6.net
 MX    ✅: turtle.cjv6.net
 TXT   🟢: 
 v=spf1 a mx ip4:128.199.245.86 ip6:2001:19f0:5:5ca:5400:ff:fe87:9bd8 ip4:45.76.10.5 -all
 SPF   ✅: v=spf1 a mx ip4:128.199.245.86 ip6:2001:19f0:5:5ca:5400:ff:fe87:9bd8 ip4:45.76.10.5 -all
 DMARC ✅: v=DMARC1; p=quarantine; rua=mailto:cj@cjv6.net
 DKIM  ✅:  default._domainkey.v=DKIM1;p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDcz5hE2H1C9bgHmvDtt4byrDmQh10VL5
 olAipQqW6zQnVHJApkJ4T/x61t/YvyFq4RpZ0w9TNg3/Ur0eO41jq/2H2G8nsKWvp3AmxMB2hyc/APC6
 rwWoLUL1x01oqHoK32P6Vxby6SwWaAgmhdVgg+N/jYjPJrlIRT0HgqJtdQIDAQAB
 PTR   ✅: turtle.cjv6.net
 Enter domain, IP (or 'exit' to quit): 
 ------------------------------------

DNSSEC

คำถาม หลังจาก disable DNSSEC สำหรับ domain นึงแล้ว จะใช้เวลาเท่าไหร่ ก่อนที่ สถานะของ DNSSEC สำหรับ domain นั้นๆ จะถูกยกเลิก กลายเป็น domain ที่ไม่มีการใช้งาน DNSSEC?

นี่คือผลของการตรวจสอบที่ตัว server ของ domain นั้น

root@turtle:~# rndc dnssec -status cjz.monster
dnssec-policy: default
current time:  Thu Sep 28 15:54:07 2023

key: 20391 (ECDSAP256SHA256), CSK
  published:      yes - since Tue Jan 31 11:12:43 2023
  key signing:    yes - since Tue Jan 31 11:12:43 2023
  zone signing:   yes - since Tue Jan 31 13:17:43 2023

  No rollover scheduled
  - goal:           omnipresent
  - dnskey:         omnipresent
  - ds:             omnipresent
  - zone rrsig:     omnipresent
  - key rrsig:      omnipresent

key: 47119 (ECDSAP256SHA256), CSK
  published:      no
  key signing:    no
  zone signing:   no

  Key has been removed from the zone
  - goal:           hidden
  - dnskey:         hidden
  - ds:             unretentive
  - zone rrsig:     hidden
  - key rrsig:      hidden

โดยที่ปิด DNSSEC ที่ server ของ namecheap แล้ว

# dig +trace cjz.monster soa | grep $'RRSIG\tSOA' | awk '{ print $9,$10 }'
20231008012542 20230924002542

เท่าที่ดูแล้ว น่าจะเป็น 2023-10-08 01:25:42
คือวันที่ 8 ตุลาคม นี้นะ

Edit: 2023-09-29 17:15
อาจจะไม่ใช่

cj@turtle:~$ dig +trace cjz.monster soa | grep $’RRSIG\tSOA’ | awk ‘{ print $9,$10 }’
20231012232439 20230928222439
cj@turtle:~$ date
Fri Sep 29 05:14:18 PM +07 2023

Caste

เป็นศัพท์คำใหม่ที่ได้มาจากการอ่านการ์ตูนหรือไม่ก็ Light Novel ซึ่งจะว่าไป เป็นศัพท์ที่เห็นมาบ่อยครั้งอยู่พอสมควรล่ะ แต่จาก context ของการเห็นครั้งแรกๆ ก็จะเป็นการอ่านแบบผ่านๆ เลยเห็นเป็นว่าคำนี้คือ castle ไม่ใช่ caste

ซึ่ง context ที่ว่าก็คือ ตัวเอก (ซึ่งมักจะเป็นผู้ชาย MC — Main Character หรือ Male Main Character) บรรยายถึงตัวละครในเรื่องอีกคนหนึ่ง ซึ่งมักจะเป็น Love Interest ของตัวเอกว่า different caste — ซึ่งทำให้เข้าใจว่า สาวเจ้าน่ะเป็นเจ้าหญิงอยู่บนหอคอย (castle) ซึ่งสูงเกินเอื้อม อะไรประมาณนั้น

จนเห็นคำนี้หลายครั้งเข้า ก็ชักสงสัยแล้วละว่า คนแปลน่ะ (หรือคนที่ทำหน้าที่ type setting) น่ะ ไม่ได้พิมพ์ผิดโดยการทำตัว l หายไป 1 ตัวหรอก แต่เป็นเราคนอ่านเองนี้แหละ ที่เข้าใจผิดมาตั้งแต่ตอนแรก

ก็เลยต้อง google search หา meaning of caste ดู

ก็ได้ข้อสรุปว่า ข้าพเจ้านี้น่ะ ไม่ใช่แมว แต่โง่เอง

คำนี้แปลว่า ชนชั้น หรือ วรรณะ

Debian 12 ping

ติดตั้ง Debian Bookworm ใหม่ วันนี้บน VPS ของ cloudcone แล้วเจอว่า คำสั่ง ping มีปัญหาถ้าใช้งานจาก ผูัใช้ธรรมดาที่ไม่ใช่ root โดยเจอ

cj@cc1:~$ ping www.google.com
ping: socktype: SOCK_RAW
ping: socket: Operation not permitted
ping: => missing cap_net_raw+p capability or setuid?

2023-09-07 on cc1

เอาล่ะ มีปัญหาเรื่อง capability ล่ะ จะ set มันยังไง ยังไม่อยากแก้ปัญหาด้วย setuid root

Search google ก็ไปเจอ

https://unix.stackexchange.com/questions/592911/how-does-ping-work-on-fedora-without-setuid-and-capabilities

คำตอบที่น่าสนใจคือเรื่องของ ping group range ใน sysctl ซึ่งก็ไม่ตรงกับ capability โดยตรงสักเท่าไหร่ ลองหาดูจาก sysctl -a | grep ping_group_range ก็เจอเฉพาะ ipv4 ไม่มีของ ipv6 ค่าตั้งต้นเป็น 1 0

root@cc1:/home/cj# sysctl -a | grep net.ipv4.ping_group_range
net.ipv4.ping_group_range = 1 0

ซึ่งเป็น range เริ่มต้นที่ 1 และจบที่ 0

ซึ่งถ้าเป็นตามนี้จริงๆก็คือ ไม่มีใครใช้งานได้เลยแม้กระทั่ง root แต่จริงๆไม่ใช่ เพราะทดลองใช้ root แล้วก็สามารถ ping ได้ ไม่มีปัญหา

แต่เพื่อจะให้มันใช้งานได้ก่อน เพราะ cloudcone agent มันต้องการฟังก์ชันส่วนนี้ในการ monitor ตัว server อยู่ก็เลยไปเพิ่มไฟล์ 999-ping.conf ใน /etc/sysctl.d

echo “net.ipv4.ping_group_range=0 4294967295” > /etc/sysctl.d/999-ping.conf

ตามตัวอย่างใน stackexchange ซึ่งไม่ work ต้องเปลี่ยนค่า group ตัวหลังเป็น 65535 ถึงจะใช้งานได้

root@cc1:/home/cj# sysctl -p /etc/sysctl.d/999-ping.conf
sysctl: setting key “net.ipv4.ping_group_range”: Invalid argument

root@cc1:/home/cj# cat /etc/sysctl.d/999-ping.conf
net.ipv4.ping_group_range=0 65535

root@cc1:/etc/sysctl.d# sysctl -p /etc/sysctl.d/999-ping.conf
net.ipv4.ping_group_range = 0 65535

Upgrade debian 11 to 12

จาก bullseye เป็น bookworm
การ upgrade desktop ที่ใช้อยู่ ซึ่งประกอบไปด้วย notebook 2-3 เครื่อง ดูเหมือนว่าจะผ่านไปได้ด้วยดีจนน่าแปลกใจ ไม่มีอะไรผิดปกติ application ที่ใช้งานอยู่ ก็ใช้งานได้ทั้งหมด

ตัว Gnome desktop เปลี่ยนตำแหน่งของ Icon ที่ใช้ start app จากด้านซ้ายของ screen มาเป็นด้านล่าง ซึ่งทำให้การเคลื่อนของ mouse ไปเปิด app เปลี่ยนไปนิดหน่อย แต่อย่างอื่นก็ดูไม่ต่าง ในแง่ของการใช้งาน

ปัญหาเริ่มเกิด เมื่อต้องไป update ตัว server ซึ่งเป็น VM อยู่บน digital ocean ที่ใช้งานมาแล้วเกือบ 10 ปี (เริ่ม 2014) และด้วย config เก่าๆจำนวนมากที่ไม่ได้ update ตามไปด้วย

เรื่องแรกที่เป็นปัญหาเลยก็คือ openvpn config ที่เคยใช้งานได้ ทั้งสำหรับเครื่อง Linux debian อื่นๆ และ mikrotik swtich และ router ที่มีอยู่ 2-3 ตัว อยู่ๆ ก็ใช้งานไม่ได้ขึ้นมา มี error เกี่ยวกับ ชนิดของ cypher ระหว่างตัว client กับ server ที่ไม่ตรงกัน เลยทำให้เชื่อมต่อไม่ได้

ซึ่งเนื่องจากตัว mikrotik config ที่เกี่ยวกับ openvpn ไม่ได้เปลี่ยนเปลงอะไร งั้นปัญหาก็อยู่ที่ตัว debian server แหง

หลังจากงมอยู่พักนึง ก็พบว่า เดิมทีเพื่อที่ให้ config ตัวนี้ ใช้งานได้กับ mikrotik ก็ต้องจำกัด cypher ให้เหลือแค่ AES-256-CBC

พอ upgrade openvpn เป็น version ที่ใช้งานอยู่บน bookworm ก็ต้องเพิ่ม config ใหม่ “data-cyphers” ให้เป็นแบบเดียวกัน

cipher AES-256-CBC
data-ciphers AES-256-CBC

นอกจากนั้นก็เป็นปัญหาทั่วไปของ service บางอย่างที่ start ไม่ได้ เพราะ package ถูกถอนออกไป โดยไม่ได้ติดตั้งตัวทดแทน เช่น php-fpm และ mariadb ซึ่งพอติดตั้งกลับเข้าไปก็สามารถใช้งานได้

ปัญหาใหญ่ที่สุดที่เจอ ก็คือ ssh ซึ่งเดิมทีใช้ในการ connect เข้าไปที่ตัว mikrotik ได้ โดยใช้ public key ซึ่งใช้งานได้ดี อยู่ ๆ ก็ใช้งานไม่ได้ เครื่อง mikrotik จะถาม password ลอง setup password แล้ว ก็ดูเหมือนว่ายังใช้งานไม่ได้ เพราะ password ที่ป้อนเข้าไปไม่ถูกต้อง

ssh ที่ติดตั้งอยู่เดิมบน bullseye คือ openssh 8.4

ssh ที่ติดตั้งบน bookworm คือ openssh 9.2p1

หลังจากลองอยู่พักใหญ่ แล้วยังใช้งานไม่ได้ ก็เลย copy ตัว ssh binary จาก VM ที่ติดตั้ง bullseye เอาไว้ มาใช้งานปน server ก็ปรากฏว่าใช่งานได้ ก็เลย copy ไปไว้ใน ~/bin และ แก้ไข script ที่ใช้ในการ login เข้า mikrotik router ให้ใช้ ssh ตัวนี้แทน ก็เลยทำให้ script ที่ใช้งานอยู่กลับมาใช้งานได้เป็นปกติ

Edit: 2023-07-05

วันนี้เพิ่งเจอว่า ตอน openssh update เป็น 8.8 มีการเปลี่ยน config

openssh (1:8.8p1-1) unstable; urgency=medium

OpenSSH 8.8 includes a number of changes that may affect existing
configurations:

  • This release disables RSA signatures using the SHA-1 hash algorithm by default. This change has been made as the SHA-1 hash algorithm is cryptographically broken, and it is possible to create chosen-prefix
    hash collisions for <USD$50K.
  • For most users, this change should be invisible and there is no need to replace ssh-rsa keys. OpenSSH has supported RFC8332 RSA/SHA-256/512 signatures since release 7.2 and existing ssh-rsa keys will automatically use the stronger algorithm where possible.
  • Incompatibility is more likely when connecting to older SSH implementations that have not been upgraded or have not closely tracked improvements in the SSH protocol. For these cases, it may be necessary to selectively re-enable RSA/SHA1 to allow connection and/or user authentication via the HostkeyAlgorithms and PubkeyAcceptedAlgorithms options. For example, the following stanza in ~/.ssh/config will enable RSA/SHA1 for host and user authentication for a single destination
host old-host
        HostkeyAlgorithms +ssh-rsa
        PubkeyAcceptedAlgorithms +ssh-rsa

สรุป เพิ่ม 2 บรรทัดนี้เข้าไปใน .ssh/config ก็จบ ใช้งาน openssh 9.1 กับ mikrotik ต่อไปได้

Update wordpress from 6.1.1 to 6.2

หลังจากครั้งที่แล้วได้ update จาก 5.9.2 แล้วหลังจากนั้นก็เพิ่ม blog ใหม่ไม่ได้ -_-“

สำหรับการ update ครั้งล่าสุดแบบ manual ทำได้แล้ว โดยการ extract tgz file ไปลงใน /var/www/wordpress โดยก่อนหน้านั้นก็ rename ตัวเก่าจาก wordpress ไปเป็น wordpress-6.1.1 ไปซะ

พอได้ตัวใหม่มา ถ้าจะยังใช้ theme อันเก่า ก็ต้อง copy มาจาก
wp-content /themes

ซึ่งตอนนี้ก็ใช้ blank-canvas และ มี seedlet อีกตัวนึง

รูปภาพและอะไรอื่นๆ จะอยู่ใน wp-content/uploads ซึ่งส่วนนี้ควรจะแยกเก็บเอาไว้ต่างหาก แล้วค่อย link เอามาเก็บไว้ใน wp-content ของ wordpress version ล่าสุด

อีกส่วนที่จำเป็นต้องใช้ก็คือ .htaccess ซึ่งควรที่จะ copy มาจาก wordpress ตัวเก่าได้เลย

#!/bin/sh

[ "$(id -u)" != 0 ] && echo "Need root privileges" && exit

WP_FILE=$(ls -t ${HOME}/Downloads/wordpress* 2> /dev/null | head -1)
[ -z "${WP_FILE}" ] && echo "No wordpress tgz file in ${HOME}/Downloads" && exit
cd /var/www
STAMP=$(date +%s -r wordpress)
WP=$(pwd)/wordpress
WP_OLD=${WP}-${STAMP}
mv ${WP} ${WP_OLD}
tar -zxvf ${WP_FILE}
chown www-data:www-data ${WP}/wp-content
cp ${WP_OLD}/.htaccess ${WP}
cp ${WP_OLD}/wp-config.php ${WP}
ln -s /var/www/wp_themes/* ${WP}/wp-content/themes/
ln -s /var/www/wp_uploads ${WP}/wp-content/uploads

เมื่อ website ใช้ histats

ทดลองกับ wp.cjv6.net เอง เมื่อเพิ่ม histats javascript เข้าไป แล้วทดสอบโดยใช้ GTMetrix ก็จะได้ประมาณนี้

https://gtmetrix.com/reports/wp.cjv6.net/xSWUtDwW/

โอเค ทีนี้เอามันออก
ก็จะได้ประมาณนี้


https://gtmetrix.com/reports/wp.cjv6.net/Rps79MTY/

แต่เฮ้ย ทำไมผลลัพธ์มันถึงได้แย่กว่าเดิมว้อย!!!
โอเค re-test
ได้ผลตามนี้

https://gtmetrix.com/reports/wp.cjv6.net/P6pQhdsg/

ในแง่ของประสิทธิภาพ / Grade ที่ได้จาก GTMetrix ไม่ต่างจากเดิม แต่ ถ้าเอาข้อมูลในส่วนของ Waterfall มาเทียบกัน

นี่คือกรณีที่ไม่ได้ใส่ histat เอาไว้ในส่วนของ footer จำนวน request เท่ากับ 17 เวลาที่ใช้ในการ load เท่ากับ 1.8 วินาที

แต่ถ้าใส่ histats เข้าไป

จำนวน request เท่ากับ 162 เวลาที่ใช้ในการ load เท่ากับ 6.1 วินาที

ในแง่ของคนที่เปิด blog มาดูอาจจะไม่เห็นความแตกต่าง เพราะทั้งหมดของ histats และส่วนที่ตามมาจะถูกโหลดเป็นแบบ background แต่ … เมื่อเทียบจำนวน request และ เวลาที่กว่า web client จะโหลดเสร็จ … เราควรเปลี่ยนไปใช้วิธีการอื่นในการเก็บ stat จะดีกว่า

ไม่ต้องพูดถึงว่า ไอ้เจ้าสารพัด script ที่ถูกโหลดตามมาทีหลังจะเก็บข้อมูลอะไรเอาไปบ้าง -_-“

แมงกระพรุนไม่เป็นน้ำแข็ง

แมงกะพรุนไม่เป็นน้ำแข็ง

อ่านจบไปเมื่อคืนวาน หลังจากซื้อมาแล้ว ก็อ่านไปเรื่อยๆ อ่านบ้าง หยุดบ้าง ไปประมาณครึ่งเล่ม (น่าจะเกินครึ่งอยู่หน่อยนึง) แล้วก็อ่านต่อรวดเดียวจบภายในคืนเดียว กว่าจะรู้สึกตัวอีกทีก็ตีสี่ครึ่งแล้ว

ไม่ได้รู้สึกว่ามันสนุกมาก เนื้อเรื่องช่วงกลางๆเรื่อง ไปจนถึงก่อนจบ ดูน่าสนใจกว่า ช่วงท้ายของเรื่อง ที่มีการ “เฉลย” สิ่งที่เกิดขึ้น ว่าเกิดขึ้นได้อย่างไร … จะว่าไป ส่วนที่บอกว่า คนร้ายคือใคร ก็มีการบอกอ้อมๆ โดยวิธีการเล่าเรื่อง ไปในช่วงแรกๆแล้ว ส่วนประเด็นของ มันเกิดขึ้นได้อย่างไร แบบที่อธิบายรายละเอียดในช่วงท้ายของหนังสือ ก็ … ช่วยอธิบายสิ่งที่เกิดขึ้นได้ แต่มันดูหลวมๆ ไม่น่าตื่นเต้น และ ไม่ได้จูงใจมากขนาดนั้น

แต่ประเมินจากที่ตัวเองอ่านได้จนจบ … ก็คงไม่เลวล่ะมั้ง

คนเขียนคนเดียวกัน มีหนังสือ แปลออกมาอีกเล่มนึง น่าจะเป็น mystery ในทำนองเดียวกันกับเล่มนี้ เคยอ่าน review แล้ว มีคนชอบเล่มนี้มากกว่า

ประเมินจากจุดนี้ คงไม่ซื้อต่อล่ะ หรืออาจจะรอเจอในหนังสือมือสองแบบราคาอ่านแล้ว

เล่มนี้ เจอขายในกลุ่มหนังสือมือสองเหมือนกัน ขายแบบลดราคาหลายเปอร์เซ์นต์อยู่แหละ แต่หนังสือคือสภาพมือหนึ่งในซีล

โอเค จบไปอีกหนึ่งเล่ม