ว่าด้วย EPSG:24047

ข้อมูลแผนที่ที่ใช้ EPSG:24047 Indian 1975 / UTM zone 47N พบว่าถ้าใช้ Postgres/PostGIS ST_Transform ไปเป็น EPSG:4326 แล้วแสดงบนแผนที่ไม่ตรงกับการเอา EPSG:24047 ไปต่อให้ GeoServer render ตรงๆ

ดูที่ https://epsg.io/24047 ระบุว่าเป็นตามนี้ (และดูในตาราง spatial_ref_sys ใน PostgreSQL ก็เป็นตามนี้

PROJCS["Indian 1975 / UTM zone 47N",
GEOGCS["Indian 1975",
DATUM["Indian_1975",
SPHEROID["Everest 1830 (1937 Adjustment)",6377276.345,300.8017],
TOWGS84[293,836,318,0.5,1.6,-2.8,2.1]],
PRIMEM["Greenwich",0,
AUTHORITY["EPSG","8901"]],
UNIT["degree",0.0174532925199433,
AUTHORITY["EPSG","9122"]],
AUTHORITY["EPSG","4240"]],
PROJECTION["Transverse_Mercator"],
PARAMETER["latitude_of_origin",0],
PARAMETER["central_meridian",99],
PARAMETER["scale_factor",0.9996],
PARAMETER["false_easting",500000],
PARAMETER["false_northing",0],
UNIT["metre",1,
AUTHORITY["EPSG","9001"]],
AXIS["Easting",EAST],
AXIS["Northing",NORTH],
AUTHORITY["EPSG","24047"]]

แต่ใน Geoserver (Google เจอที่ https://view.eumetsat.int/geoserver/web/wicket/bookmarkable/org.geoserver.web.demo.SRSDescriptionPage?0&code=EPSG:24047)

PROJCS["Indian 1975 / UTM zone 47N",
GEOGCS["Indian 1975",
DATUM["Indian 1975",
SPHEROID["Everest 1830 (1937 Adjustment)", 6377276.345, 300.8017, AUTHORITY["EPSG","7015"]],
TOWGS84[204.64, 834.74, 293.8, 0.0, 0.0, 0.0, 0.0],
AUTHORITY["EPSG","6240"]],
PRIMEM["Greenwich", 0.0, AUTHORITY["EPSG","8901"]],
UNIT["degree", 0.017453292519943295],
AXIS["Geodetic latitude", NORTH],
AXIS["Geodetic longitude", EAST],
AUTHORITY["EPSG","4240"]],
PROJECTION["Transverse_Mercator", AUTHORITY["EPSG","9807"]],
PARAMETER["central_meridian", 99.0],
PARAMETER["latitude_of_origin", 0.0],
PARAMETER["scale_factor", 0.9996],
PARAMETER["false_easting", 500000.0],
PARAMETER["false_northing", 0.0],
UNIT["m", 1.0],
AXIS["Easting", EAST],
AXIS["Northing", NORTH],
AUTHORITY["EPSG","24047"]]

ไม่รู้อันไหนคือ ถูกคือผิด

AI Notes

  • Finetune Falcon 7b/40b instruct with your own data – คือ เอา Falcon มาลอง fine tune โดยเพิ่มข้อมูล prompt+response แบบที่เราต้องการเข้าไปเอง แล้วก็ train เพื่อให้โมเดลตอบแบบที่ train เพิ่มไปได้
%%time
device = "cuda:0"

encoding = tokenizer(prompt, return_tensors="pt").to(device)

# Ott 20231029
#with torch.inference_mode():
with torch.no_grad():
outputs = model.generate(
input_ids = encoding.input_ids,
attention_mask = encoding.attention_mask,
generation_config = generation_config
)

print(tokenizer.decode(outputs[0], skip_special_tokens=True))

ลง PostgreSQL เก่าๆ (9.6) บน เครื่อง Ubuntu 22.04

เพิ่ม apt sources เก่าๆ

sudo apt-key adv –keyserver hkp://keyserver.ubuntu.com:80/ –recv-keys 3B4FE6ACC0B21F32

deb http://th.archive.ubuntu.com/ubuntu bionic main restricted universe multiverse
deb http://th.archive.ubuntu.com/ubuntu focal main restricted universe multiverse

เพิ่ม postgresql apt sources

wget –quiet -O – https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add –

/etc/apt/sources.list.d/pgdg.list
deb http://apt.postgresql.org/pub/repos/apt/ jammy-pgdg main
deb http://apt.postgresql.org/pub/repos/apt/ focal-pgdg main
deb http://apt.postgresql.org/pub/repos/apt/ bionic-pgdg main

หลังจากนั้นก็ควรจะ apt install ได้ อย่าลืมตั้ง default locale ก่อน

cat /etc/default/locale
LANG=en_US.UTF-8
LANG=th_TH.UTF-8

apt install postgresql-9.6-postgis-2.4 postgresql-9.6-slony1-2

GeoServer behinds nginx HTTPS reverse proxy

กรณีที่ใช้ nginx เป็น HTTPS reverse proxy บังหน้า geoserver ด้านหลัง มีต้องตั้งค่าเพิ่มเติมดังนี้

Proxy Base URL

สามารถตั้งได้หลายทาง

  • ใส่ใน WEB-INF/web.xml
    <context-param>
      <param-name>PROXY_BASE_URL</param-name>
      <param-value>https://fqdn-hostname/geoserver</param-value>
    </context-param>

  • ทางหน้า GUI (Global Settings)
  • ใส่ใน global.xml ใน data_dir
<proxyBaseUrl>https://fqdn-hostname/geoserver</proxyBaseUrl>

CSRF WHITELIST

บางครั้งถ้าลองกดทำ action บางอย่าง เช่น เปลี่ยนรหัสผ่าน แล้วเจอปัญหา HTTP Status 400 – Bad Request Type Status Report Message Origin does not correspond to request Description The server cannot or will not process the request due to something that is perceived to be a client error ให้ใส่ประมาณนี้ใน web.xml

<context-param>
     <param-name>GEOSERVER_CSRF_WHITELIST</param-name>
     <param-value>fqdn-hostname</param-value>
</context-param>

<filter>
    <filter-name>cross-origin</filter-name>
    <filter-class>org.apache.catalina.filters.CorsFilter</filter-class>
    <init-param>
        <param-name>cors.allowed.origins</param-name>
        <param-value>*</param-value>
    </init-param>
    <init-param>
        <param-name>cors.allowed.methods</param-name>
        <param-value>GET,POST,PUT,DELETE,HEAD,OPTIONS</param-value>
    </init-param>
    <init-param>
        <param-name>cors.allowed.headers</param-name>
        <param-value>*</param-value>
    </init-param>
</filter>

Apache mod_dir HTTPS / HTTP redirection

ปัญหาคือ ถ้าตั้ง apache อยู่หลัง reverse proxy โดย apache <–> reverse proxy คุย HTTP กัน แต่ reverse proxy เป็น HTTPS คุยกับภายนอก

เวลา browse URL ที่เป็น directory แบบไม่ใส่ slash ปิดท้าย เช่น https://host/dirname, apache จะ redirect ไปที่ HTTP แบบมี / ปิดท้าย กล่าวคือ อะไรทำนอง http://host/dirname/ หรือ http://host/dirname/index.php <– แล้วแต่ตั้งค่า directory index ไว้

ซึ่งทำให้มีปัญหาเพราะมันหลุดจาก HTTPS ไปหา HTTP

วิธีแก้

ใส่ใน apache config

ServerName https://localhost

อ้างอิง https://serverfault.com/questions/885474/apache-redirects-from-https-to-http-when-adding-trailing-slash-to-directory

สร้าง Static route ใน Mac OS X

แบบครั้งเดียว

sudo route add 10.0.0.0/24 1.0.0.1

แบบถาวร

  1. หาชื่อ interface ก่อน จากผลัพธ์ของคำสั่งนี้ สมมติว่าได้ผลลัพธ์ MM14
    networksetup -listnetworkserviceorder
  2. สร้าง static route ถาวร ด้วย (เปลี่ยนชื่อ MM14 และ IP อะไรต่างๆ เป็นของท่าน)
    networksetup -setadditionalroutes MM14 10.0.0.0 255.255.255.0 1.0.0.1
  3. ดูผลลัพธ์​ก็ netstat ธรรมดา (grep ด้วยชื่อ network ที่ add ไป)
    netstat -rn|grep 10
  4. ถ้าจะยกเลิก ไม่เอาแล้วก็
    networksetup -setadditionalroutes MM14

ให้ Tomcat รับ x-forwarded-proto

Ref: https://backstage.forgerock.com/knowledge/kb/article/a37878699

กรณีที่ใช้ nginx / reverse proxy บังหน้า Tomcat เพื่อรับ HTTPS แล้วระหว่าง nginx <–> tomcat คุยกันด้วย HTTP แต่เราก็ยังอยากให้ Tomcat รู้สึกว่าเป็น https เพื่อเวลาแทนตัวแปร URL อะไรต่างๆ มันจะได้มาเป็น https ไม่ใช่ http ก็ต้องทำ 2 อย่างดังนี้

  • ที่ nginx ต้องใส่
    location / {
       [...]
       
        proxy_set_header        X-Forwarded-Proto       https;

        #proxy_cache geonode-cache;

    }
  • ที่ Tomcat server.xml ต้องเพิ่ม
<Valve className="org.apache.catalina.valves.RemoteIpValve"
    remoteIpHeader="x-forwarded-for"
    remoteIpProxiesHeader="x-forwarded-by"
    protocolHeader="x-forwarded-proto"
    protocolHeaderHttpsValue="https"
/>

Drupal PHP force SSL

เวลาใช้ท่า nginx เป็น reverse proxy ด้านนอกสุด รับ SSL แล้วส่งต่อ request ให้ server ด้านหลังที่เป็น Apache/Nginx+PHP ด้วย HTTP แต่เราต้องการให้ PHP รับรู้ว่า request จริงๆ มาเป็น HTTPS โดยเดิมเราก็ส่ง Header

proxy_set_header        X-Forwarded-Proto       https;

มาแล้ว หลังๆ บางที Web server ด้านหลังก็ยังมองว่าเป็น HTTP อยู่ดี ต้องแปะอะไรทำนองนี้เพิ่มเข้าไป

  /**
   * If external request was HTTPS but internal request is HTTP, set $_SERVER['HTTPS'] so Drupal detects the right scheme.
   */
  if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https' && $_SERVER["REQUEST_SCHEME"] == 'http') {
    $_SERVER['HTTPS'] = 'on';
  }

อ้างอิง: https://www.drupal.org/project/provision/issues/3040646

ในบางกรณีพบว่ามีปัญหาในการอ้างถึง files ใน sites/default/files ให้บังคับแบบนี้

$settings['file_public_base_url'] = 'https://<host-name>/sites/default/files';

git cheat sheet

Compare your working copy with the upstream

git diff @{upstream}

ไม่ต้องสนใจไฟล์นี้

git update-index --skip-worktree robots.txt;

ถ้าจะเอาคืนกลับมาเหมือนเดิมก็

git update-index --no-skip-worktree robots.txt;

จำรหัส

git config --global credential.helper store

phppgadmin PostgreSQL 12 issue

phppgadmin จะมีปัญหากับ PostgreSQL 12 เวลา browse table แล้วมันจะ error ประมาณนี้ เพราะคือ คอลัมน์ relhasoids มันไม่มีแล้ว

ERROR: column relhasoids does not exist

https://stackoverflow.com/questions/58758377/how-to-fix-error-column-relhasoids-does-not-exist-in-phppgadmin

แก้ code phppgadmin ประมาณนี้

/usr/share/phppgadmin/classes/database# diff -u Postgres-org.php Postgres.php 
--- Postgres-org.php    2021-05-10 12:24:02.883661674 +0700
+++ Postgres.php        2021-05-10 12:24:33.211848605 +0700
@@ -1043,13 +1043,14 @@
 
                $sql = "SELECT relhasoids FROM pg_catalog.pg_class WHERE relname='{$table}'
                        AND relnamespace = (SELECT oid FROM pg_catalog.pg_namespace WHERE nspname='{$c_schema}')";
-
+/*
                $rs = $this->selectSet($sql);
                if ($rs->recordCount() != 1) return null;
                else {
                        $rs->fields['relhasoids'] = $this->phpBool($rs->fields['relhasoids']);
                        return $rs->fields['relhasoids'];
                }
+ */
        }
 
        /**

The Best of Pranburi

Important places in Pranburi for live-to-eat people.

Three big fresh markets:

  • ตลาดนัดทางรถไฟ ปราณบุรี (Railway fresh market near Lotus Pranburi), week-days, afternoon. Fresh seafood around 2pm. Map: http://longdo.com/p/A10178041
  • ตลาดนัดโกเล็ก หน้าอำเภอปราณบุรี (Near-Praburi District Office Fresh Market), massive market under a roof, week-ends, afternoon. Map: http://longdo.com/p/A10568950
ตลาดนัดโกเล็ก หน้าอำเภอ

Some of my favorite places:

  • โชคอารีย์ ซีฟู้ด Choke Aree Seafood restaurant. Fresh stuff. ปากน้ำปราณ, Pak Nam Pran, Map: http://longdo.com/p/A10325425
  • ขนมหวานบ้านพุทธรักษา Phuttaraksa Desserts. ข้าวเหนียวลูกตาล และ กล้วยบวชชี คือ อร่อย. Luk Taan w/ sticky rice and Buad Chee Banana are sublime. Map: http://longdo.com/p/A10154730
  • ร้านอาหารครัวลูกสาว Krua Luk Sao Restaurant. Local taste of Pranburi. แกงป่าปลาทราย และ ปลาสำลีทอดสามรส Kang Pa Pla and Fried Samlee fish. Map: http://longdo.com/p/A10572228
ปลาสำลีทอด
แกงป่าปลาทราย
  • เอื้อง อิ้ง ซีฟู้ด (Sisters Ueng, Ing Seafood) Good and fresh seafood, อาหารทะเล, Map: http://longdo.com/p/A10031761
  • ขนมหวาน วงเวียนปากน้ำปราณฯ Dessert stalls. เม็ดขนุน Med Kanun,
เม็ดขนุน

Screen สำหรับ Remote SSH Session

ใช้ screen มานานหลายปี จนหลังๆ เห็นคนนิยมเปลี่ยนไปใช้ tmux กันมากแล้ว แต่ก็ยังติด screen อยู่

เรื่องของเรื่องคือการ remote ssh ไปยัง linux servers ใดๆ เพื่อไปรันคำสั่งอะไรบางอย่าง บางทีเราอยากรันอะไรค้างไว้ หรือ บางที network ไม่ stable ทำอะไรอยู่ค้างๆ อยู่แล้วหลุด วิธีแก้ง่ายๆ ก็คือ รัน screen เอาไว้ก่อน ซึ่งจะเสมือนหน้าจอเสมือนของเราที่ logged on ค้างไว้อยู่บน server, การสั่งคำสั่งทำงานอะไร มันก็จะอยู่ภายใต้ screen ต่อให้ network หลุดไป กลับมาใหม่ ก็จะเห็นหน้าจอเดิม ทำงานต่อได้

default configuration ของ screen จะใช้ key CTRL-A ซึ่งจะชนกับ short-cut keyboard ที่เอาไว้สำหรับเลื่อนไปต้นบรรทัด และ default หน้าจอก็จะไม่ค่อยสวยงาม

วิธีแก้ให้สร้างไฟล์ ~/.screenrc ที่มีเนื้อหาตามด้านล่างนี้ เพื่อเปลี่ยน key ที่ใช้เป็น CTRL-T และให้มี Status bar สวยๆ ด้านล่าง

ตัวอย่างหน้าจอ screeen

ตัวอย่าง .screenrc (ลอกจากของคุณพูลลาภ วีระธนาบุตร นานมาแล้ว

startup_message off


#  scroll  (100)
defscrollback 200


#  status
hardstatus on
hardstatus alwayslastline
hardstatus string "%{.bW}%-w%{.rW}%n %t%{-}%+w %=%{..G} %H %{..Y} %m/%d %C%a "


#  Ctrl+t  Ctrl+a
escape ^Ta

วิธีใช้งานเบื้องต้น

  • เข้าใช้ครั้งแรกสั่งว่า
screen
  • ปุ่มที่ใช้บ่อยๆ
    • CTRL-T + C = Create สร้างหน้าจอใหม่
    • CTRL-T + P = Previous ไปหน้าจอด้านซ้าย
    • CTRL-T + N = Next ไปหน้าจอด้านขวา
    • CTRL-T + 2 = ไปหน้าจอที่ 2 (ระบุตัวเลขหน้าจอเอาเลย)
    • CTRL-T + K = Kill ทิ้งหน้าจอปัจจุบัน
  • จะเลิกใช้ชั่วคราว กด CTRL-T + D = Detach ออกจาก screen
  • เข้าครั้งต่อไปพิมพ์
screen -rd

จะเลิกใช้ ก็ exit หรือ kill ทุกหน้าจอมาเรื่อยๆ จนหมด แล้วก็ exit อันสุดท้ายมันก็จะหลุดจาก screen โดยอัตโนมัติ

nginx performance tuning

/etc/security.limits.conf

www-data       soft    nofile  30000
www-data       hard    nofile  50000

ทดสอบผลลัพธ์โดย log out/log in แล้ว ulimit -Hn ; ulimit -Sn

/etc/nginx.conf

worker_processes auto;

# Increase open files
worker_rlimit_nofile 30000;

events {
        #worker_connections 2048;
        worker_connections 30000;
        # multi_accept on;
}

http {

...
        client_max_body_size 30m;


        proxy_connect_timeout 20;


        proxy_send_timeout          120;
        proxy_read_timeout          120;
        send_timeout                120;
...

        gzip on;
        gzip_disable "msie6";
        gzip_types text/plain text/css text/xml text/javascript application/x-javascript application/xml application/json;
}

/etc/sysctl.conf

BOTH on the host and inside the container. And make sure there is sysctl -p /etc/sysctl.conf in the start up script of the container.

net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1

net.core.somaxconn = 2048
fs.file-max = 70000

/etc/php/7.2/fpm/pool.d/www.conf

pm.max_children = 500

เด็กไทยทำ app สู้ต่างชาติได้เหรอคะ

จากกรณีเด็กไทยทำ app สู้ต่างชาติได้เหรอคะ (อ้างอิง https://brandinside.asia/startup-to-thai-gov/ ส่วนรายละเอียดคำพูดในการประชุม หาดูเอาตาม fB ท่านที่ไปเข้าร่วมนะ)

ผมมองว่า

ที่ผ่านมารัฐบาลไทยประสบความสำเร็จอย่างยิ่งในการสนับสนุนให้เกิดการ *ใช้* เทคโนโลยี เวลามี keyword อะไรใหม่ๆ เช่น Big data, AI, Smart City, Smart whatever เราจะตอบสนองอย่างไวในการพยายามนำมาใช้งาน ใช้ได้จริงไม่ได้จริงอีกเรื่องนะ แต่อย่างน้อยมีความพยายาม ซึ่งผมมองว่าเป็นเรื่องดี

แต่เรากลับล้มเหลวอย่างยิ่งในการ *สร้าง* เทคโนโลยีด้าน IT ของเราเอง ไม่ใช่แค่เราไม่มี Unicorn แต่เราไม่ได้มีบทบาทร่วมในฐานะผู้สร้างเทคโนโลยีต่างๆ ของโลกเท่าไหร่ เริ่มตั้งแต่ระดับวิจัย,​ พัฒนา, ไปจนถึงเชิงพาณิชย์ มีบ้างประปรายไม่ใช่ไม่มีเลย แต่ไม่เยอะ เทียบกับสิงคโปร์, ไต้หวัน, คือ ห่างไกล

การที่บอกว่าสนับสนุนให้เกิดการใช้เทคโนโลยีข้างต้น เค้าทำโดยไม่สนใจว่าจะต้องใช้ของไทย บางทีเน้นให้ใช้ต่างประเทศด้วยซ้ำไป เอาให้ได้ผลลัพธ์ที่ดีที่สุดไวๆ ก็พอเข้าใจได้ ถ้า mission คือ แค่จะใช้

ซึ่งถามว่าทำไมมันไม่มีการสร้างเทคโนโลยี ผมว่าเป็นเพราะเราไม่ได้มี mission ที่อยากจะมีการสร้าง เอกชนที่มีความอยากจะสร้างก็สร้างไปตามมีตามเกิด สำเร็จมากน้อย แล้วแต่ตามความสามารถและโชคชะตา ส่วนภาครัฐไม่ได้มีกลไกหรือหน่วยงานใดที่จะมาผลักดันให้เกิดตรงนี้

ซึ่งโลกปัจจุบันมันไม่ได้เหมือนยี่สิบปีที่แล้ว มันมีเอกชนขนาดใหญ่จากต่างประเทศมากมายดำเนินธุรกิจอยู่ในตลาดโลก และด้วยขนาดที่ใหญ่ เค้าสามารถทุ่มทุนทำสิ่งที่น่าจะเรียกได้ว่าทุ่มตลาด ทำของดีให้ใช้ฟรี อัดฉีดด้วยทุนไม่อั้น พูดง่ายๆ ทำให้รายเล็กเกิดได้แต่ยาก ต้องเก่งจริงๆ และมีทุนสู้ รวมถึงมีกลไกการช่วยสนับสนุนจากภาครัฐและทุกๆ ฝ่าย อย่างแยบยลที่จะดันให้สู้ได้

ซึ่งภาครัฐเรามีความหน่อมแน้มอย่างยิ่งในการจะสนับสนุนเอกชนไทย ทำได้ก็แค่ให้ทุนหยุมๆ หยิมๆ พาไปออก event ฯลฯ แต่ไม่เพียงพอที่จะถีบให้เอกชนที่มีแววเติบโตมากๆ ได้

ซึ่งก็อาจจะเป็นเพราะหน่วยงานเหล่านั้นเค้าไม่ได้มีพันธกิจที่จะต้องมาสนับสนุนเอกชน ดีไม่ดีโดนครหาอีกทำไมไปเอื้อบางรายนั้น ทั้งๆ ที่ผมเห็นรัฐบาลหลายๆ ชาติ เค้าก็ดันเอกชนของเค้ากันตรงๆ คงจะมีกลไกที่ต่างจากประเทศเรา

ในขณะเดียวกันหน่วยงานรัฐกลับไม่หน่อมแน้มที่จะแสดงความดีใจอย่างออกนอกหน้าเวลาที่เชิญเอกชนดังๆ ต่างประเทศมาเมืองไทยได้ หรือเวลาไปดูงานเมืองนอก รวมถึงการที่เอกชนต่างชาติได้สิทธิ์ต่างๆ ไม่ว่าจะเรื่องภาษี ฯลฯ ทำให้มีแต้มต่อเอกชนไทย ก็ไม่เห็นจะมีหน่วยงานใดจะมาสนใจแก้ไข คอยปกป้องผลประโยชน์ของเอกชนไทย

เทียบกับวงการอื่นๆ ไม่ว่าจะเป็นธนาคาร, เกษตรกรรม ฯลฯ เหมือนประเทศเรามีกลไกพอสมควรในการปกป้องเอกชนในประเทศ ใช่หรือไม่

ซึ่งเอกชนเค้าก็รวมตัวกันมาเป็นสมาคมฯ​ ยื่นข้อเสนอก็ควรจะรับฟังเค้าหรือเปล่า ไม่ใช่แค่ถามคำถามที่แสดงความตื้นเขินแถมได้ยินว่าไม่ได้อยู่รับฟังคำตอบด้วยซ้ำๆ

โดยสรุปมองว่า โดยโครงสร้าง มันไม่มีหน่วยงานใดที่มีหน้าที่ที่จะมาคอยดูให้เกิดเอกชนไทยที่แข่งขันด้าน IT ได้ในระดับโลก ก็ทำกันไปตามมีตามเกิด มันก็เอวังด้วยประการฉะนี้

แต่มีข้อดีคือ ถ้ามี unicorn ไทย เกิดขึ้นมาได้ในสภาพแวดล้อมเช่นนี้ เชื่อว่าไปรอดในตลาดโลกแน่นอน เพราะโตมาได้ในสภาพแวดล้อมที่ไม่เอื้อ แสดงว่าเก่งจริงๆ

ว่าแต่มันจะมีหรือเปล่า?

เพิ่มลูกค้าโดยการขึ้นราคา

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

เป็นไปได้อย่างไร?

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

ในช่วงแรกก็มีลูกค้าพอสมควร ด้วยความที่ในย่านนี้มีร้านซูชิระดับนี้ไม่มาก ลูกค้าที่เดิมถ้าอยากทานปลาดิบคุณภาพสูงแบบนี้ต้องเข้าเมือง พอมีร้านนี้ก็เป็นทางเลือกที่ดี ก็เป็นที่ตื่นเต้นกัน

อย่างไรก็ตามด้วยราคาที่ค่อนข้างสูง แต่ละอย่างในเมนูหลักหลายร้อยถึงหลายพัน เรียกว่าสั่งไม่มันส์ เพราะแต่ละอย่างค่อนข้างแพง จึงไม่ใช่อะไรที่คนจำนวนมากจะมากินบ่อยๆ

และด้วยความที่ทำเลอยู่นอกเมือง ลูกค้าจรแบบพนักงานออฟฟิศมาทานตอนพักเที่ยง หรือพาลูกค้ามารับรองก็ไม่มาก นานๆ ไป ก็เหมือนลูกค้าเริ่มจะเริ่มลดลง

พอลูกค้าลดลง ทางร้านก็มีการปล่อยเมนูโปรโมชั่นราคาระดับ 300-700 บาท ออกมา ซึ่งถูกลงกว่าเดิมมาก โดยตัดปลาระดับพรีเมี่ยมมากๆ ออกไป ทว่าก็คุณภาพโดยรวมยังอยู่ในระดับที่ดีมากอยู่ ราคาก็ไม่แพงแล้ว เรียกว่าถูกเลยดีกว่า เช่น ปลาแซลมอนในภาพด้านล่าง 110 บาท เท่านั้น

แต่ลูกค้าก็ไม่ได้เพิ่มขึ้นมากขึ้นเท่าใด เรียกว่ายังไม่ปัง

ซึ่งถ้าให้วิเคราะห์ ผมมองว่าถึงแม้ราคาลดลงมามาก ระดับที่ใกล้เคียงกับร้านอาหารญี่ปุ่นในห้างแล้ว แต่ด้วยความที่เมนูโปรโมชั่นมีไม่มาก นอกเหนือจากนี้ ถ้าอยากกินอย่างอื่นก็จะเป็นเมนูพรีเมี่ยมเดิม ซึ่งราคาต่างกันรุนแรงมาก และกลับกัน ปลาพรีเมี่ยมที่เคยเป็นจุดว้าวของร้าน ก็ไม่มีในเมนูโปรโมชั่น

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

และด้วยความที่ลูกค้าไม่มาก ทำให้ปลาที่สั่งมาระลอกหนึ่งก็ใช้เวลาหลายวันกว่าจะหมดสต๊อก ซึ่งบางทีถ้าไปในช่วงท้ายๆ สต๊อก ก็อาจจะเจอปลาที่เรียกว่าไม่ได้สดเว่อร์ ลูกค้าก็จะไม่ค่อยฟินเท่าใดนัก

แต่จนมาถึงช่วงเดือนที่ผ่านมา ปรากฎว่า ร้านมีลูกค้าเพิ่มขึ้นอย่างเห็นได้ชัด ปลาก็คุณภาพดีกว่าเดิม เชฟบอกว่ายอดสั่งปลาเข้าร้านมากกว่าเดิมถึงสองเท่า! ปลาที่สั่งมาหมดไว ทำให้สั่งได้บ่อยขึ้น ปลาก็สดใหม่ตลอด

เกิดอะไรขึ้น?

สอบถามได้ความว่า ร้านมีการจัดเมนูบุฟเฟต์กินไม่อั้น!

ซึ่งราคาก็ไม่ได้ถูกนะครับ 1,890 บาท, 1,390 บาท และ 990 บาท ต่อหัว

แต่ละราคา จะมีสิทธิ์เลือกสั่งอาหารที่มีการจำกัดคุณภาพต่างกัน ถ้าตัวแพงสุด 1,890 สั่งได้ไม่อั้น จะโอโทโร่ ชูโทโร่ เนื้อวากิว ตับห่าน ฯลฯ จัดได้เต็มที่ ไม่อั้น จำกัดเวลาที่ 2 ชั่วโมง

ซึ่งราคาต่อหัวระดับนี้ แพงกว่าเดิมครับ ก่อนหน้านี้ ผมเชื่อว่าด้วยราคาในเมนูพรีเมี่ยม ลูกค้าธรรมดาที่ไม่ได้เงินหนาจริงๆ ก็จะสั่งอย่างกระมิดกระเมี้ยน ไม่เยอะ เกรงใจกระเป๋าตังค์ ค่าใช้จ่ายต่อหัวไม่น่าถึงสูงขนาดนั้น

แต่การอัปราคาขึ้น ทำไมกลับทำให้มีลูกค้าเข้าร้านมากมาย และยอมจ่ายในราคาที่เดิมไม่เคยจ่าย?

ผมตอบได้ว่าเพราะลูกค้ารู้สึกว่าคุ้มค่าครับ!

สิ่งต่างๆ จะแพงจะถูก มันอยู่ที่ว่าทำให้ลูกค้ารู้สึกว่าคุ้มกับที่จ่ายไปหรือเปล่า ใช่อยู่ที่จำนวนเงินไม่

มันคือความฟินที่ได้กินปลาดีๆ พรีเมี่ยม และกินแบบไม่อั้น กินเยอะกว่าปกติ มันเกิดความรู้สึกว่าคุ้มค่า

ยิ่งได้เทียบราคากับการสั่งจากเมนูปกติ ว่าถ้าคุณสั่งราคาปกติแพงขนาดนี้ แต่นี่บุฟเฟ่ต์กินได้ไม่อั้น มันโคตรคุ้ม มันฟิน

เชฟเล่าว่า ลูกค้าบุฟเฟต์ บางโต๊ะก็สั่งได้เป็น 10 อย่างเลยทีเดียว

ผลสรุปที่ได้ ชัดเจนว่าลูกค้าชอบ ลูกค้าเข้าร้านมากขึ้น จ่ายแพงขึ้น และกลับออกไปด้วยความสุข ความฟิน ที่ได้กินของดีๆ เยอะๆ

ร้านค้าคุ้มค่าหรือไม่ ผมเชื่อว่ายังไงคงจะคำนวณมาแล้วไม่ให้ขาดทุน คนๆ นึงจะกินได้สักเท่าไหร่ เดี๋ยวก็ต้องอิ่ม เวลาก็ต้องหมด ความเสียหายมันจำกัด แต่อย่างน้อย ร้านได้ลูกค้าจำนวนมากขึ้น ปลาหมุนเวียนดีขึ้น

เรียกว่า margin กำไรของสินค้าลดลง แต่ขายได้มากขึ้น และคุณภาพสินค้าสูงขึ้น

เป็นกรณีศึกษาที่น่าสนใจติดตามตอนต่อไป ว่าจะประสบความสำเร็จกับกลยุทธนี้หรือไม่ครับ

แต่ที่แน่ๆ ที่สำเร็จไปแล้วคือ เอาชนะใจลูกค้า และได้ฝังความรู้สึกแบรนด์ร้านซูชิพรีเมี่ยมในใจลูกค้าอีกครั้ง

ปล. ช่วงนี้ เวลาลูกค้าเข้าร้านพร้อมๆ กัน สั่งบุฟเฟ่ต์กันเมามัน เชฟทำแทบจะไม่ทัน จึงแนะนำว่าถ้าจะมาให้มาวันธรรมดา หรือ ช่วงบ่ายๆ ลูกค้าจะไม่แน่น ไม่ต้องรอนาน

ปล2. ไม่ได้ค่า sponspor นะ แต่อยากบอกว่าปลาเค้าดีจริงๆ 🙂

พร้อมไป ไปถึงทุกที่ไม่มีพลาด

ปัจจุบันการอ้างอิงตำแหน่งสถานที่ในประเทศไทยโดยการใช้ข้อมูลที่อยู่ (บ้านเลขที่ หมู่ ถนน ตำบล ฯลฯ) ยังมีปัญหาด้านความแม่นยำ ไม่สามารถระบุตำแหน่งที่ถูกต้อง ทำให้การจะส่งสินค้าหรือเดินทางไปยังสถานที่นั้นๆ เป็นไปอย่างไม่มีประสิทธิภาพ บ่อยครั้งต้องโทรถามให้อธิบาย หรือไปผิดที่ก็ต้องวนหา เกิดความสิ้นเปลืองทั้งเวลาและค่าใช้จ่ายหลายพันล้านบาทต่อปี

ยกตัวอย่าง เวลาเราจะขึ้นรถแท๊กซี่ไปไหน ถ้าจุดหมายปลายทางอยู่บนถนนใหญ่หรือใกล้สถานที่สำคัญ ก็โชคดีไป แต่ถ้าอยู่ในซอยลึก เราก็ต้องคอยบอกทางเมื่อไหร่จะต้องเลี้ยวตรงไหน จะหลับก็ไม่ได้

อีกทั้งบางทีจุดหมายทีเราจะไป เราก็ไม่ทราบเหมือนกันว่าต้องไปยังไง หรือ อยู่ตรงไหนแน่

จะดีกว่าไหม ถ้าเราแค่บอกหมายเลขโทรศัพท์ หรือ ตัวเลขรหัส 8 หลัก ของสถานที่ปลายทาง แล้วแท๊กซี่สามารถพาเราไปถึงจุดหมายได้อย่างถูกต้อง?

หรือเวลาที่เราสั่งสินค้าจะให้มาส่งที่บ้าน เราก็ต้องกรอกรายละเอียดที่อยู่ยืดยาว บางครั้งต้องมีวาดแผนที่ประกอบให้ด้วย จะดีกว่าไหม ถ้าแค่กรอกหมายเลขโทรศัพท์ หรือ ตัวเลขรหัส 8 หลัก ของบ้านเรา แล้วจบเลย สินค้ามาส่งได้ถูกต้อง ไม่ต้องมาโทรถามเส้นทาง?

เพื่อแก้ไขปัญหาดังกล่าว พร้อมไป (PromptPai) เสนอแนวทางในการระบุพิกัดตำแหน่งสถานที่โดยใช้รหัสตัวเลข 8 หลัก หรือ หมายเลขโทรศัพท์ และใช้เทคโนโลยีสารสนเทศมาช่วยทำให้สามารถระบุตำแหน่งได้อย่างแม่นยำ และด้วยลักษณะที่เป็นตัวเลข ทำให้สามารถสื่อสารรหัสพร้อมไปได้โดยง่าย และไม่มีข้อจำกัดทางภาษา

การทำงานของ พร้อมไป (PromptPai) คือ การแทนที่ตำแหน่งสถานที่ด้วยหมายเลขโทรศัพท์ หรือ รหัสตัวเลข 8 หลัก ยกตัวอย่างเช่น หน่วยงานรัฐชื่อ สำนักงานพัฒนารัฐบาลดิจิทัล (องค์การมหาชน) สพร. จะถูกแทนที่ด้วย

  1. รหัสพร้อมไป 8 หลัก 1025 9208
  2. หมายเลขโทรศัพท์ของหน่วยงาน 026126000

ถ้าต้องการจะเดินทางไป สพร. ก็สามารถบอกแค่หมายเลขโทรศัพท์หรือรหัส 8 หลัก อย่างใดอย่างหนึ่ง แท๊กซี่ที่รองรับระบบพร้อมไป ก็จะนำท่านไปได้อย่างถูกต้องทันที

ตัวอย่างข้อมูลที่ได้จากระบบพร้อมไป เมื่อระบุหมายเลขโทรศัพท์ 026126000

ดร.ภัทระ เกียรติเสวี ผู้จัดการทั่วไป บริษัท เมตามีเดีย เทคโนโลยี จำกัด ผู้พัฒนาระบบพร้อมไป กล่าวว่า “ปัจจุบันระบบพร้อมไปพัฒนาเสร็จสิ้นแล้ว พร้อมใช้งานโดยมีข้อมูลสถานที่แล้วกว่า 4 แสนแห่ง และล่าสุดกวาด 2 รางวัล ได้แก่ รางวัลรองชนะเลิศอันดับ 1 และรางวัลขวัญใจกรรมการ จากโครงการประกวดนวัตกรรมข้อมูลเปิดภาครัฐ หรือ Thailand Data Innovation Awards 2019 (DIA) จัดขึ้นโดยสำนักงานพัฒนารัฐบาลดิจิทัล (องค์การมหาชน) หรือ สพร.


ดร. ภัทระ กล่าวว่า “จุดเด่น ของ พร้อมไป คือ เป็นระบบเปิด ผู้ใช้สามารถใช้งานและสร้างรหัสพร้อมไปของตนเองได้ฟรี และ เป็นการพัฒนาโดยใช้ แนวคิดร่วมสร้าง (Co-Creation) ร่วมแก้ปัญหาของประเทศ โดยดึงความ มีส่วนร่วมจากพวกเราทุกคน ไม่ใช่รอหวังพึ่งเพียงภาครัฐ หรือบริษัทรายใดรายหนึ่ง”

“และสำคัญที่สุดคือ ข้อมูลตำแหน่งที่อยู่ที่เกิดขึ้นทั้งหมดจะเปิดเป็น Open data เป็นโครงสร้างพื้นฐานด้านภูมิสารสนเทศของประเทศ เพื่อให้เกิดการใช้งานต่อยอด ให้เกิดประโยชน์สูงสุดต่อประเทศสืบไป” ดร.ภัทระ สรุป

พร้อมไป สามารถใช้งานได้ผ่านเว็บไซต์, แอปพลิเคชันมือถือ, LINE และมี API สำหรับการเชื่อมโยงและต่อยอด ดูรายละเอียดเพิ่มเติมได้ที่ https://promptpai.com/

วิธีแก้ Ubuntu/Debian package

บางทีบางโปรแกรมมีบางอย่างที่เราอยากจะแก้ใน source code แต่ตอนใช้งานก็อยากจะ build กลับเป็น deb package เพื่อให้ง่ายต่อการติดตั้ง ก็มีวิธีง่ายๆ ดังนี้ เช่น สมมติจะ build nginx ใหม่ เพราะต้องการให้มีรองรับ healthcheck ซึ่ง patch อยู่ที่ https://github.com/yaoweibin/nginx_upstream_check_module วิธีทำก็ทำดังนี้

apt install devscripts build-essential

apt-get source nginx # เอา source code ลงมาที่ folder ก่อน จะได้ folder nginx-1.16.0 หรืออะไรทำนองนี้

apt-get build-dep nginx # เอา package อื่นๆ ที่จำเป็นในการ build ลงมา

cd nginx-1.16.0 และจะ patch จะแก้ source code อะไรก็แก้ เช่นในกรณีนี้

cd src
git clone https://github.com/yaoweibin/nginx_upstream_check_module.git
cd ..
patch -p1 < src/nginx_upstream_check_module/check_1.14.0+.patch 

ถ้าจะแก้อะไรเพิ่มเติมใน debian/rules ก็จัดให้เรียบร้อย เช่นกรณีนี้ต้องเติม –add-module=src/nginx_upstream_check_module ให้ configure option

สร้างเป็น patch โดยสั่ง
dpkg-source  –commit

เพิ่มใน changelog โดยสั่ง
dch -i
ตั้งชื่อรุ่น package อะไรให้เรียบร้อย

แล้วก็สั่ง build

debuild -us -uc

จากนั้นจะได้ deb file มาก็ติดตั้ง และ apt-mark hold ไว้ เพื่อไม่ให้มันโดนรุ่นใหม่มาทับ

 dpkg -i nginx_1.16.0-1healthcheck~xenial_amd64.deb 

 apt-mark hold nginx

 ดูผลลัพธ์การติดตั้งด้วย dpkg -l nginx และผลลัพธ์การ hold ด้วย apt-mark showhold

MySQL DB SQL_MODE

MySQL รุ่นใหม่ๆ เช่น 5.7 หรือ MariaDB 10.3 มีความ strict เรื่อง query มากขึ้น ซึ่งถ้าโค้ดเก่าเรายังไม่รองรับก็ใช้วิธีแก้แบบกึ่งบาปไปก่อนโดยใส่ใน my.cnf ประมาณนี้

#sql_mode=STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
sql_mode                = NO_ENGINE_SUBSTITUTION

แก้แล้วต้อง restart ทีนึง ทดสอบโดยการ SELECT ขึ้นมาดู

mysql> select  @@SQL_MODE, @@GLOBAL.SQL_MODE;
+------------------------+------------------------+
| @@SQL_MODE | @@GLOBAL.SQL_MODE |
+------------------------+------------------------+
| NO_ENGINE_SUBSTITUTION | NO_ENGINE_SUBSTITUTION |
+------------------------+------------------------+
1 row in set (0.00 sec)

Faster gdal2tiles.py

เดิมๆ gdal2tiles มันรันใช้แค่ CPU core เดียว ทำให้ช้า

พบว่า gdal2tiles.py 2.3 มี option

--processes=<NB_PROCESSES>

Number of processes to use for tiling.

แต่ใน ​Ubuntu gdal-bin packages มันรุ่นเก่ามาก ติดตั้งอันนี้แทน

#sudo add-apt-repository ppa:ubuntugis/ppa
#sudo add-apt-repository ppa:ubuntugis/ubuntugis-unstable

sudo add-apt-repository ppa:nextgis/ppa

apt install gdal-bin python-gdal

แถมด้วย patch สำหรับซ่อมเรื่อง https และให้มัน select layer เลย กรณี Leaflet

  $ cat gdal2tiles-2.4.patch 
 --- /usr/bin/gdal2tiles.py.org  2019-06-29 09:25:01.809381770 +0700
 +++ /usr/bin/gdal2tiles.py      2019-07-03 23:36:11.389713375 +0700
 @@ -2320,8 +2320,12 @@
              <title>%(htmltitle)s</title>
  
              <!-- Leaflet -->
 -            <link rel="stylesheet" href="http://cdn.leafletjs.com/leaflet-0.7.5/leaflet.css" />
 -            <script src="http://cdn.leafletjs.com/leaflet-0.7.5/leaflet.js"></script>
 +            <!--link rel="stylesheet" href="http://cdn.leafletjs.com/leaflet-0.7.5/leaflet.css" />
 +            <script src="http://cdn.leafletjs.com/leaflet-0.7.5/leaflet.js"></script-->
 +
 +            <!-- Leaflet -->
 +            <link rel="stylesheet" href="https://unpkg.com/leaflet@1.5.1/dist/leaflet.css" integrity="sha512-xwE/Az9zrjBIphAcBb3F6JVqxf46+CDLwfLMHloNu6KEQCAWi6HcDUbeOfBIptF7tcCzusKFjFw2yuvEpDL9wQ==" crossorigin=""/>
 +            <script src="https://unpkg.com/leaflet@1.5.1/dist/leaflet.js" integrity="sha512-GffPMF3RvMeYyc1LWMHtK8EbPv0iNZ8/oTtHPx9/cc2ILxQ+u905qIwdpULaqDkyBKgOaB57QTMg7ztg8Jm2Og==" crossorigin=""></script>
  
              <style>
                  body { margin:0; padding:0; }
 @@ -2375,8 +2379,9 @@
              zoom: %(beginzoom)s,
              minZoom: %(minzoom)s,
              maxZoom: %(maxzoom)s,
 -            layers: [osm]
 +            layers: [osm,lyr]
          });
 +            //layers: [osm]
  
          var basemaps = {"OpenStreetMap": osm, "CartoDB Positron": cartodb, "Stamen Toner": toner, "Without background": white}
          var overlaymaps = {"Layer": lyr}
 @@ -2638,8 +2643,10 @@
                function getURL(bounds) {
                    bounds = this.adjustBounds(bounds);
                    var res = this.getServerResolution();
 -                  var x = Math.round((bounds.left - this.tileOrigin.lon) / (res * this.tile_size.w));
 -                  var y = Math.round((bounds.bottom - this.tileOrigin.lat) / (res * this.tile_size.h));
 +                  //var x = Math.round((bounds.left - this.tileOrigin.lon) / (res * this.tile_size.w));
 +                  //var y = Math.round((bounds.bottom - this.tileOrigin.lat) / (res * this.tile_size.h));
 +                  var x = Math.round((bounds.left - this.tileOrigin.lon) / (res * this.tileSize.w));
 +                  var y = Math.round((bounds.bottom - this.tileOrigin.lat) / (res * this.tileSize.h));
                    var z = this.getServerZoom();
                    if (this.map.baseLayer.CLASS_NAME === 'OpenLayers.Layer.Bing') {
                        z+=1; 

เจออีกอัน gdal2tiles leaflet https://github.com/commenthol/gdal2tiles-leaflet มีรุ่นที่เป็น multiprocesses แต่ลองแล้ว พอให้รัน zoom 1-16 มันเหมือนตายๆ รันภาพได้ไม่ครบ อาการเหมือนมันจะเริ่ม generate Overview Tiles ขณะที่ยัง generate Base tiles ยังไม่เสร็จยังไงชอบกล

WordPress Setup

wget -q -O https://api.wordpress.org/secret-key/1.1/salt/ เพื่อให้ได้เนื้อหามา replace บรรทัดใน wp-config.php

wp-config.php:

define('AUTH_KEY',         'xxxx');
define('SECURE_AUTH_KEY',  'xxxx');
define('LOGGED_IN_KEY',    'xxxx');
define('NONCE_KEY',        'xxxx');
define('AUTH_SALT',        'xxxx');
define('SECURE_AUTH_SALT', 'xxxx');
define('LOGGED_IN_SALT',   'xxxx');
define('NONCE_SALT',       'xxxx');

และเพิ่มพวกนี้ (เปลี่ยนให้เป็นค่าที่ถูกต้อง)

define('WP_HOME','https://'.$_SERVER["SERVER_NAME"].'/articles');
define('WP_SITEURL','https://'.$_SERVER["SERVER_NAME"].'/articles');
define('FORCE_SSL_ADMIN', true);

if ( $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https' )
{
    $_SERVER['HTTPS']       = 'on';
    $_SERVER['SERVER_PORT'] = 443;
}

Docker notes

สูตรปกติ /etc/docker/daemon.json

 {
         "data-root": "/data/docker",
         "storage-opt": ["dm.basesize=50G"],
         "mtu": 1400
 } 

ดูตั้งค่าเครือข่ายใช้ ip แทน ifconfig

ip a
ip link set dev eth0 mtu 1400

ถ้าอยากให้แก้ไขโน่นนี่ เช่น set mtu ต้องเปิดสิทธิ์ใน docker-compose.yml
    cap_add:
     – ALL

mtu ที่ set ใน /etc/docker/daemon.json จะไม่ส่งผลในกรณี docker-compose.yml ต้องใส่เอง

networks:                                
  default:                               
    driver: bridge                       
    driver_opts:                         
      com.docker.network.driver.mtu: 1400

Notes on SQL queries

ถ้า WHERE มีหลาย conditions สร้าง index แบบ multi-columnจะให้ผลที่ดีกว่า

select ….. WHERE (o.tolang = ‘th’ AND (o.sentence_en_lower LIKE ‘% chums%’ OR o.sentence_en_lower LIKE ‘%chums%’) AND o.sentence_tolang NOT LIKE ‘%cHFFFF%’) LIMIT 15;

สร้าง index แบบ sentence_en_lower แยกกับ tolang ได้ผลลัพธ์
Planning time: 51.183 ms, Execution time: 293.293 ms   

สร้าง index แบบ multi-column (sentence_en_lower รวมกับ tolang) ได้ผลลัพธ์

Planning time: 0.547 ms   Execution time: 62.052 ms

INDEX ขนาดใหญ่ๆ มากๆ บางที PostgreSQL บางเครื่องไม่ยอมใช้เฉย

อันนี้คือ งง สองเครื่อง set-up ตาราง, index เหมือนกันเด๊ะ แต่บาง query บางเครื่องไม่ยอมใช้ index ใช้เป็น seq scan เฉย ก็คือต้องทดสอบดีๆ ว่ามันทำงานได้อย่างที่เราคิดไว้ EXPLAIN ANALYZE query ดูให้หมด

ลง GitLab ใน Ubuntu / Docker

ตามโพย

sudo apt install ca-certificates curl openssh-server exim4-daemon-heavy

curl -sS https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh | sudo bash

vi /etc/gitlab/gitlab.rb แก้ให้ถูกใจ

gitlab-ctl reconfigure

มันจะไปค้างตรง ruby_block[wait for redis service socket] action 
ให้รันคำสั่งนี้ก่อน

/opt/gitlab/embedded/bin/runsvdir-start &

ดูเพิ่มเติม https://gitlab.com/gitlab-org/omnibus-gitlab/issues/4257

ชอบมีปัญหาเกี่ยวกับ locale ต้องสั่ง

export LANG=en_US.UTF-8

export LC_ALL=en_US.UTF-8

certbot-auto กับ Ubuntu precise

ยังมีเครื่องเก๋ากึ๊กที่ใช้ Ubuntu precise 12.04 และ certbot-auto รุ่นล่าสุดมันจะพัง ต้องแก้คือ

pip_version = StrictVersion(check_output([python, '-m', 'pip', '--version'])
by
pip_version = StrictVersion(check_output(['pip', '--version'])

and
command = [python, '-m', 'pip', 'install', '--no-index', '--no-deps', '-U']
by
command = ['pip', 'install', '--no-index', '--no-deps', '-U']

และเติม  --no-self-upgrade ตอนรันด้วย เดี๋ยวมันก็เปลี่ยนไปอีก

อ้างจาก https://community.letsencrypt.org/t/pip-error-with-certbot-auto/88200/4

Copy file path in Mac OS X Finder

ปัญหาอย่างหนึ่งในการใช้ Finder ใน Mac OS X ก็คือ ต้องการจะได้ PATH แบบ อะไรทำนอง /Users/pattara/messages.log ของไฟล์ที่กำหนดเปิดใน Finder พบว่าวิธีที่สะดวกสุดคือใช้ Automator ทำเป็น Quick Action เลือกไฟล์แล้วก็กดขวาเลือก “Copy Path” ก็จะได้ PATH ของไฟล์นั้นๆ ใน Clipboard วิธีการทำดูตามลิงค์ครับ

http://osxdaily.com/2013/06/19/copy-file-folder-path-mac-os-x/

ถ้าอยากใช้ ssh key DSA เก่า กับ Mac OS X Sierra และรุ่นที่ใหม่กว่านั้น

ถ้าอยากใช้ ssh key DSA เก่า กับ Mac OS X Sierra และรุ่นที่ใหม่กว่านั้น
(at your own risk)

เติมใน /etc/ssh/ssh_config

PubkeyAcceptedKeyTypes=+ssh-dss

https://cjanderson-drupal.ninja/drupal/ssh-dsa-keys-not-supported-macos-sierra

https://cjanderson-drupal.ninja/drupal/ssh-dsa-keys-not-supported-macos-sierra

เกี่ยวกับ ipv6 บางที ubuntu server มันจะทำให้ ssh -X (forward display) ไม่ได้ มี error ทำนอง

เกี่ยวกับ ipv6 บางที ubuntu server มันจะทำให้ ssh -X (forward display) ไม่ได้ มี error ทำนอง

Failed to allocate internet-domain X11 display socket

วิธีแก้ ต้องเพิ่มใน /etc/ssh/sshd_config

AddressFamily inet

http://www.snowfrog.net/2011/11/06/ssh-display-is-not-set-failed-to-allocate-internet-domain-x11-display-socket/

http://www.snowfrog.net/2011/11/06/ssh-display-is-not-set-failed-to-allocate-internet-domain-x11-display-socket/

ลง Dell Open Manage บน Ubuntu 18.04

ลง Dell Open Manage บน Ubuntu 18.04

ตามโพย

https://www.reddit.com/r/sysadmin/comments/8hs6qs/when_will_dell_openmanage_be_out_for_ubuntu_1804/

1. ใส่ใน /etc/apt/sources.list
deb [trusted=yes] http://linux.dell.com/repo/community/openmanage/910/xenial xenial main

(GPG key ก็พัง ต้องใส่ trusted=yes)

2. apt-get update
3. apt-get install srvadmin-all
4.touch /opt/dell/srvadmin/lib64/openmanage/IGNORE_GENERATION
5. cd /opt/dell/srvadmin/sbin
6. ./srvadmin-services.sh enable
7. ./srvadmin-services.sh start

เมื่อยามที่เรื่องสิทธิ์ของ mysql พังๆ อยากจะเข้าเป็น root แบบแก้ไขได้ทุกอย่าง สั่ง

เมื่อยามที่เรื่องสิทธิ์ของ mysql พังๆ อยากจะเข้าเป็น root แบบแก้ไขได้ทุกอย่าง สั่ง

mysqld_safe –skip-grant-tables

https://support.rackspace.com/how-to/mysql-resetting-a-lost-mysql-root-password/

ติดตั้ง Squid บน cygwin

ติดตั้ง Squid บน cygwin

เพิ่งรู้ว่า cygwin มี apt ด้วย

ก็ดีงามมาก เช่น ถ้าจะลง squid

wget rawgit.com/transcode-open/apt-cyg/master/apt-cyg
install apt-cyg /bin
apt-cyg install squid
/usr/sbin/squid -z

ก่อน start squid สร้าง /etc/resolv.conf ให้ถูกต้องก่อน (เช่น nameserver 8.8.8.8) ไม่งั้นมันจะไม่ได้
แล้วก็
/usr/sbin/squid

Reference: https://superuser.com/questions/622582/how-to-install-squid-3-3-on-windows/622583

FIXME เวลาติดตั้ง module ด้วย CPAN แล้วมันใช้ได้แค่ user นั้นคนเดียว

FIXME เวลาติดตั้ง module ด้วย CPAN แล้วมันใช้ได้แค่ user นั้นคนเดียว

คงไม่ใช่วิธีที่ถูกต้อง แต่แปะไว้ก่อนละกัน มันแก้ปัญหาได้

perl -MCPAN -e shell
install xxxxx ไปตามปกติ

เสร็จแล้วต้อง

~/perl5/lib/perl5/x86_64-linux-gnu-thread-multi# cp -dpxvR auto/* /usr/share/perl5/auto/

เมื่อ svn folder พัง

เมื่อ svn folder พัง

$ svn cleanup

svn: E155009: Failed to run the WC DB work queue associated with ‘/mnt/c/Users/ott/svn’, work item 69847 (file-install xxx/xxx/xxx/system-diagram.pptx 1 0 1 1)
svn: E000002: Can’t open file ‘/mnt/c/Users/ott/svn/.svn/pristine/24/2495f0a289553c10974abf8ef4fc0dde096e72fa.svn-base’: No such file or directory

แก้ไขโดย
$ sqlite3 .svn/wc.db “delete from work_queue”

แล้วก็
$ svn cleanup

phppgadmin dump แล้วเป็นหน้าขาว

phppgadmin dump แล้วเป็นหน้าขาว

https://serverfault.com/questions/203863/phppgadmin-exporting-empty-sql-dump

“you need to modify your dbexport.php in /usr/share/phppgadmin (on Ubuntu)

modify line from passthru($cmd); to echo passthru($cmd); modify line $cmd = $exe . ” -i”; to $cmd = $exe;

it will be enough. Cause parameter -i seems to be deprecated in postgres 9.5 , he gave error for me.”

https://serverfault.com/questions/203863/phppgadmin-exporting-empty-sql-dump

คุณเป็นผู้นำหรือผู้ตาม?

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

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

อย่างไรก็ตาม การเป็นผู้นำไม่ได้หมายความว่าดีกว่าเสมอไป และการเป็นผู้ตามก็ไม่ได้หมายความว่าจะด้อยกว่า หรืออนาคตอาชีพการงานจะตัน หรือว่ามีรายได้น้อยกว่า บ่อยครั้งในหลายๆ อาชีพ ที่บุคลากรไม่จำเป็นจะต้องเป็นหัวหน้า มีลูกทีมมากมาย ก็สามารถประสบความสำเร็จในระดับสูง รวมถึงมีรายได้สูง ตัวอย่าง เช่น อาชีพที่ใช้ฝีมือ ความสามารถเฉพาะตัว เช่น แพทย์, ศิลปิน, ที่ปรึกษาด้านกฎหมาย, นักเขียน, โปรแกรมเมอร์, นักออกแบบ เป็นต้น

อาจมองได้ว่าบุคคลเหล่านี้ แม้จะไม่ได้เป็นผู้นำคนอื่น แท้จริงก็คือเป็นผู้นำตัวเอง หรือ ผู้นำทีมเล็กๆ และสามารถประสบความสำเร็จได้ไม่แพ้ผู้นำองค์กรขนาดใหญ่ รวมถึงมีข้อดีกว่าหลายๆ อย่าง เช่น

  • รับผิดชอบเฉพาะส่วนของตัวเองหรือของทีมเล็กๆ ทำให้มีเวลาและสมาธิในการทำหน้าที่ในส่วนที่ตนเองรับผิดชอบและเชี่ยวชาญจริงๆ ส่งผลให้ได้ผลงานที่ดีเด่น รวมถึงมีโอกาสได้ฝึกฝนหรือศึกษาต่อยอดในด้านนั้นๆ จนเป็นผู้เชี่ยวชาญ
  • ไม่ปวดหัวกับปัญหาที่ไม่ใช่เรื่องของตน เนื่องจากความรับผิดชอบจะชัดเจนอยู่ในหน้าที่ที่ได้รับมอบหมาย หรือเลือกที่จะทำ หากมีปัญหาอื่นใดที่นอกเหนือจากที่รับผิดชอบ สามารถส่งปัญหาต่อให้กับผู้นำได้

อย่างไรก็ตาม งานอีกหลายอย่างไม่สามารถทำได้โดยคนๆ เดียว หรือ คนกลุ่มเล็กๆ ทว่า จำเป็นต้องมีทีมงานหลายฝ่าย จำเป็นต้องมีผู้นำที่ประสานพลังของทุกฝ่ายให้เป็นหนึ่งเดียว อีกทั้ง การเป็นผู้นำก็มีความท้าทายในอีกรูปแบบที่ต่างกันไป มีจุดเด่น (หรือจุดด้อยก็ไม่แน่ใจ) เช่น

  • ต้องรับผิดชอบผลงานของทั้งทีม ไม่ใช่เฉพาะส่วนของตนเอง บ่อยครั้งผลงานส่วนตัวของผู้นำเองแทบจะไม่มีหรือมีน้อยมาก ผลงานจริงๆ ของผู้นำ คือการรวมผลงานของสมาชิกในทีม ซึ่งการรวมผลงานจากหลายๆ คนเข้าด้วยกัน ก็ทำให้ผู้นำเสมือนว่า มีบทบาทหรืออำนาจตัดสินใจในสิ่งที่มีผลกระทบต่อโลกสูงกว่า มีโอกาสสร้างความสำเร็จได้มาก แต่ขณะเดียวกันก็มีโอกาสผิดพลาดได้มากขึ้นเช่นกัน
  • มีอิสระในการทำงานมากกว่า หัวหน้างานหรือผู้บริหารองค์กรอาจมองได้ว่า มีอิสระในการทำงาน ปลอดจากข้อจำกัดยิบๆ ย่อยๆ เช่น การเข้างานรูดบัตรตรงเวลา หรือ โอกาสในการเดินทาง ไปโน่นไปนี่มากมาย ได้เที่ยวฟรี ไม่จำเป็นต้องนั่งประจำโต๊ะทำงานที่สำนักงาน อย่างไรก็ตาม มองในอีกแง่หนึ่งก็คือ ท่านเหล่านั้นแบกงานติดตัวไปตลอดเวลา ไม่ว่าจะเดินทางไปที่นั่ง แม้กระทั่งอยู่บ้านพักผ่อน หรือ ท่องเที่ยวส่วนตัว หากมีลูกค้าติดต่อ หรือ งานเร่งด่วนอะไรขึ้นมา ก็ต้องตอบสนอง หรือบ่อยครั้ง บุคคลจำพวกนี้ มีเป้าหมายอยู่ในหัวที่กระตุ้นสมองให้คิดแต่เรื่องงานตลอด แม้ว่าจะกำลังอยู่ในระหว่างพักผ่อน ดังนั้นความเป็นอิสระที่เหมือนจะมี ไม่ต้องเข้าสำนักงาน สุดท้ายก็เสมือนทำงานอยู่ตลอดเวลาไม่ว่าจะอยู่ที่ใดนั่นเอง

ในชีวิตการทำงาน ท่านสามารถเลือกได้ว่าจะเดินเส้นทางสายใด อย่างที่กล่าวไว้ตอนนั้น บุคคลหนึ่งๆ มีทั้งภาวะผู้นำและผู้ตามอยู่ในตัว ขึ้นอยู่กับท่านพอใจจะปล่อยให้ภาวะไหนมีผลตัวต่อท่านมากกว่า

หากท่านต้องการเป็นผู้ตามที่ดี ก็ต้อง

  • หมั่นเสริมสร้างความสามารถ ในส่วนที่ตนรับผิดชอบให้ดียิ่งขึ้นๆ ไป ผู้ตามแท้จริงแล้วต้องมีความรู้แตกฉานเชี่ยวชาญในสาขาของตนเองมากกว่าผู้นำ (เพราะผู้นำต้องหมดเวลาไปกับการจัดการปัญหาบุคคล การบรรลุเป้าหมาย อะไรต่างๆ ไม่มีเวลาที่จะได้ศึกษาหรือลงมือทำจริงในเนื้องานอีกต่อไป) หากแม้นไม่สามารถทำหน้าที่ในความรับผิดชอบของตนเองได้ ก็จะไม่ถูกเลือกให้ทำงาน ไม่สามารถเป็นผู้ตามได้
  • เลือกทำงานที่ดี งานที่ดี หมายถึงงานที่ 1) ชอบ 2) ทำได้ดี 3) มีประโยชน์ต่อคนอื่น เพราะถ้าไม่มีประโยชน์ต่อคนอื่น ก็มีแนวโน้มว่า ยากที่จะมีค่าตอบแทนที่ดี ยากที่จะมีคนเห็นคุณค่า
  • สำคัญที่สุด ทำงานกับผู้นำที่ดี และหน่วยงานที่ดี และถูกโฉลกกับท่าน เพราะหากอยู่กับผู้นำที่ไม่ดี, หน่วยงานที่ไม่มีอนาคต หรือ ไม่เข้ากับท่าน ต่อให้ท่านทำงานเต็มที่อย่างไร ก็คงไม่สำเร็จ และไม่มีความสุข

แต่หากท่านต้องการดำเนินชีวิตในแบบผู้นำ ต้องการเป็นหัวหน้าคน ได้สร้างผลงานที่มีผลกระทบสูงกว่า  ก็ต้องหมั่นสร้างเสริมพัฒนาบุคลิกลักษณะที่บ่งชี้ถึงความเป็นผู้นำ เช่น

  • รับผิดและชอบ ผู้นำที่ดีจักต้องรับทั้งผิดและชอบ ในผลงานของทั้งทีม ไม่เฉพาะงานของตนเอง อันที่จริงแล้ว ความชอบที่เกิดขึ้น ผู้นำต้องจักมอบให้แก่ลูกทีมที่สร้างผลงาน มิใช่โอ้อวดว่าเป็นแต่เพราะฝีมือตน ส่วนความผิดไม่ว่าจะของใครในทีม ผู้นำต้องออกตัวรับก่อน มิใช่โยนว่าเป็นผลงานของคนอื่นใด เนื่องจากถือว่าเป็นตัวแทนของบุคคลทั้งกลุ่ม และเมื่อผิดแล้วก็ต้องแก้ไข ไม่ใช่มัวแก้ตัวหรือชี้นิ้วหาคนผิด ผิดครั้งแรกส่วนใหญ่ไม่มีใครว่า อย่าให้ผิดซ้ำซากเป็นใช้ได้
  • สื่อสาร ผู้นำต้องสื่อสารตลอดเวลา สื่อสารให้ลูกทีม สื่อสารกับลูกค้า สื่อสารกับผู้นำในระดับสูงขึ้นไป สื่อสารกับสังคม การสื่อสารที่ดีไม่ใช่ว่าต้องพูดเป็นต่อยหอยทั้งวัน หรือ พูดสักแต่ว่าสื่อความออกไปครบถ้วน แต่หมายถึง ผู้รับจะต้องได้รับสารครบถ้วน ซึ่งแปลว่า ผู้นำจะต้องรู้วิธีที่จะสื่อสารให้ผู้รับสารแต่ละแบบเข้าใจ อาจจะต้องใช้ปริมาณสารและวิธีการที่แตกต่างกัน ผู้นำจักต้องหมั่นคุยหรือเขียนหรือจะใช้สื่ออะไรก็แล้วแต่ ให้ผู้ร่วมงานได้ทราบในสิ่งที่ควรจะทราบ ในเวลาที่เหมาะสม 
  • ฟังและติดตาม ผู้นำดูเหมือนว่าจะเป็นฝ่ายพูด ฝ่ายสั่งงาน แต่แท้จริงแล้วต้องรับฟังมากกว่าพูด มิฉะนั้นจะไม่รับทราบถึงปัญหาที่เกิดขึ้นในการทำงาน ต้องฟังเพื่อรับความเห็นจากผู้ร่วมงาน หากสักแต่ว่าเอาแต่สั่งๆ อย่างเดียว ก็ยากที่จะสำเร็จ เมื่อฟังแล้วพบว่ามีปัญหา ก็ต้องรีบแก้ไข และสำคัญที่สุด หากสมาชิกไม่สื่อสารกลับมา ไม่มีอะไรจะพูดให้ฟัง ผู้นำก็ต้องเป็นฝ่ายติดตาม เพราะเป็นไปได้ว่าบุคลิกผู้ตามอาจไม่กล้าออกความคิดเห็น ติดปัญหาแล้วก็งงอยู่อย่างนั้น ผู้นำก็ต้องรู้ และเป็นฝ่ายเข้าถึง กิจการงานต่างๆ มีน้อยครั้งที่ผู้นำเพียงสั่งงานและถึงเวลาที่กำหนดได้ผลงานตามที่สั่งครบถ้วน ผู้นำต้องติดตามดูความคืบหน้าตลอดเวลา
  • มองภาพใหญ่ออก และเรียนรู้เรื่องใหม่ๆ อย่างรวดเร็ว ผู้นำต้องมีความเข้าใจในภาพรวมของทั้งทีม หมายความว่า สิ่งที่ต้องเรียนรู้มีมาก และรวมถึงสิ่งที่ผู้นำทำเองไม่ได้ หรือ ไม่มีความถนัด ขณะที่เวลามีน้อย เทียบกับสมาชิกทีมแต่ละคนที่มีเวลาศึกษาในเรื่องของตน ดังนั้นผู้นำมีความจำเป็นอย่างยิ่งยวดที่จะต้องเรียนรู้เร็ว และ สำคัญที่สุดคือ มองภาพใหญ่ออก ซึ่งจะทำได้ก็ต่อเมื่อผู้นำมีความเข้าใจเพียงพอในแต่ละเรื่องต่างๆ ที่ตนเองรับผิดชอบ ไม่จำเป็นต้องทำเองเป็น แต่ต้องเข้าใจหลักการและเหตุผลในระดับที่ลึกเพียงพอ ซึ่งหลายคนมีความกดดันที่จะต้องให้มาเรียนรู้ในสิ่งที่ไม่ได้ชอบหรือไม่ได้สนใจ
  • สร้างแรงกระตุ้นให้คนอื่น ผู้นำต้องมีเป้าหมายและแรงกระตุ้นตนเองตลอดเวลาอันนั้นไม่ต้องพูดถึง แต่แค่นั้นยังไม่พอ ต้องสามารถสร้างแรงกระตุ้นให้สมาชิกในทีมทราบถึงเป้าหมายและมีแรงกระตุ้นในการทำงานให้บรรลุเป้าหมายร่วมกันได้ บางคร้ั้งสมาชิกอาจมีปัญหาที่ไม่เกี่ยวกับงาน ก็ต้องอย่างน้อยรู้จักรับฟังและให้คำแนะนำที่ดีในการจัดการกับปัญหา
  • เป็นตัวอย่างที่ดี เนื่องจากผู้นำจะเป็นเสมือนต้นแบบให้กับสมาชิกในทีมโดยอัตโนมัติ หากประพฤติตนไม่เป็นตัวอย่างที่ดี เช่น ไม่ขยัน เกี่ยงงาน หนักไม่เอาเบาไม่สู้ เข้างานสาย แต่งตัวไม่เรียบร้อย พูดจาหยาบคาย หงุดหงิดอารมณ์ขึ้น ก็ยากจะปกครองลูกทีม ทั้งๆ ที่จริงๆ ผลงานอาจจะยังดี แน่นอนว่าคนเราไม่สามารถสมบูรณ์แบบไปได้ทุกเรื่อง แต่ผู้นำต้องพยายามรักษาสิ่งที่ดีไว้ให้มากกว่าสิ่งที่ไม่ดี ยิ่งมีสิ่งไม่ดีอยู่มากเท่าไหร่ หมายความว่าสิ่งที่ดีของท่านต้องโดดเด่นเป็นทวีคูณจึงจะกลบสิ่งไม่ดีเหล่านั้นได้ ขณะที่ผู้ตามไม่มีความกดดันเหล่านี้ ทำหน้าที่ของตัวเองให้สำเร็จเป็นใช้ได้ ไม่จำเป็นต้องทำตัวเป็นแบบอย่างอะไรมากมาย

ลองเลือกกันดูว่าครับ อยากดำเนินชีวิตแบบไหน ภาวะผู้นำหรือผู้ตามที่จะเหมาะสมกับตัวท่านมากกว่ากัน  ซึ่งทั้งสองแบบก็มีภาระหน้าที่แตกต่างกัน แนะนำให้เลือกแบบที่ท่านทำแล้วสำเร็จและมีความสุขในชีวิตมากกว่า ขอให้โชคดีครับ

mysql replication เวลา master ล่ม แล้ว slave หลุด แล้ว resync ใหม่บางทีมีปัญหา data มันซ้ำๆ ให้กระโดดข้ามพวก error…

mysql replication เวลา master ล่ม แล้ว slave หลุด แล้ว resync ใหม่บางทีมีปัญหา data มันซ้ำๆ ให้กระโดดข้ามพวก error โดยใส่งี้ใน /etc/mysql/my.cnf

slave-skip-errors=1062
skip-slave-start

แล้ว mysql> slave start ด้วยมือ จน ดูด้วย show slave status G แล้วมัน

Slave_IO_Running: Yes
Slave_SQL_Running: Yes

แล้วก็เอาสองบรรทัดบนนั้นออกแล้ว restart mysql อีกที

ขับรถในประเทศไทยอันตรายที่สุด




เรื่องนี้พูดกันมานาน ไม่เห็นจะผลักให้เป็นวาระแห่งชาติ จริงๆ สักที มันสำคัญนะครับ

เสนอไอเดีย

1. ผลักดันให้ใช้มอเตอร์ไซต์ไฟฟ้าเกือบทั้งหมดภายใน 3 ปี แบบที่เมืองจีน เสียงก็เงียบ ขับได้ไม่เร็วมาก (น่าจะไม่เกิน 55 กม. /ชม.) ในเมื่อขับได้ไม่เร็ว อุบัติเหตุก็เกิดยาก ไฟฟ้าลดมลภาวะทางเสียงด้วย รัฐบาลคงต้องช่วยเอกชนที่เกี่ยวข้องกับมอเตอร์ไซต์ในปัจจุบันว่าเราจะไปยังจุดนั้นได้อย่างไร

https://www.bloomberg.com/news/articles/2017-06-19/add-traffic-to-the-risks-of-being-in-emerging-markets-chart

2. บังคับใช้กฎจราจรอย่างจริงจัง ติดกล้องจับปรับ ทั่วประเทศ ขับเร็ว เปลี่ยนเลนเส้นทึบ ปาดคอสะพาน ไม่ใส่หมวกจอดขาวแดง คนนั่งท้ายรถกระบะ ฯลฯ ครั้งละ 400 ชำระง่ายๆ ที่ 7-11 อย่าให้ลึกบาก และปรับเพิ่มขึ้นเรื่อยๆ ทีละนิดอย่าปรับโหดเกิน (เค้าก็วิ่งเต้นกัน) หรือ ลำบากเกิน (เค้าไม่สะดวกไปจ่าย) ใช้เทคโนโลยีเข้าช่วยไม่เปลืองแรงเจ้าหน้าที่สักนิด และมีรายได้จากผู้กระทำผิด อีกต่างหาก

มาตรการง่ายๆ 2 ข้อนี้ 3 ปี หลุดจาก Top 10 แน่นอน

* post นี้ยกเลิก โปรดดูอีก post หนึ่ง **

* post นี้ยกเลิก โปรดดูอีก post หนึ่ง **

AutoHotKey setting กรณีสลับปุ่ม Windows กับ Alt

ปัญหาคืออยากใช้ปุ่ม alt+spacebar ในการสลับภาษาให้เหมือนๆ กันระหว่าง Windows กับ Mac

ซึ่งใน Windows พยายามใช้ AutoHotkey แปลงปุ่ม alt+spacebar เป็น alt-shift แล้ว แต่มันใช้กับ Microsoft Office ไม่ได้ ก็เลยใช้วิธีใหม่ ใช้ win+spacebar แทน โดยสลับปุ่ม win เป็น alt ด้วย SharpKeys เลย ได้ผลดี คือ ตอบสนองไว ใช้ได้ทุกโปรแกรม แต่ปัญหาที่ตามมาก็คือ ต้อง ปรับ short cut อื่นๆ ที่เคยใช้กับ alt ให้มาใช้กับ win ตามในข้อ 2

สรุปขั้นตอน
1. ใช้ SharpKeys สลับปุ่ม Alt กับ Windows (แก้ registry)

2. AutoHotKey setting for Windows

#q::Send, !{F4}
#a::Send, ^a
#c::Send, ^c
#v::Send, ^v
::Send, ^t
#x::Send, ^x
#w::Send, ^w
#z::Send, ^z
#y::Send, ^y

;#m::Send, +{#} ; minimize all
;#u::Send, +{#}m ; unminimize

!s:: Send, #s
!e:: Send, #e
!r:: Send, #r

!m:: WinMinimizeAll

LWin & Tab::AltTab
LWin & Left:: Send !{Left}
LWin & Right:: Send !{Right}

#f4::WinClose, A ; Win+C

#`:: ; Next window
WinGetClass, ActiveClass, A
WinGet, WinClassCount, Count, ahk_class %ActiveClass%
IF WinClassCount = 1
Return
Else
WinGet, List, List, % “ahk_class ” ActiveClass
Loop, % List
{
index := List – A_Index + 1
WinGet, State, MinMax, % “ahk_id ” List%index%
if (State -1)
{
WinID := List%index%
break
}
}
WinActivate, % “ahk_id ” WinID
return

#^`:: ; Last window
WinGetClass, ActiveClass, A
WinGet, WinClassCount, Count, ahk_class %ActiveClass%
IF WinClassCount = 1
Return
Else
WinGet, List, List, % “ahk_class ” ActiveClass
Loop, % List
{
index := List – A_Index + 1
WinGet, State, MinMax, % “ahk_id ” List%index%
if (State -1)
{
WinID := List%index%
break
}
}
WinActivate, % “ahk_id ” WinID
return

Windows 10 VPN ตั้งค่าไม่ให้มันเป็น default route

Windows 10 VPN ตั้งค่าไม่ให้มันเป็น default route

สมมติว่า VPN ชื่อ MM14

Set-VpnConnection “MM14” -SplitTunneling $True

ดูผลลัพธ์
Get-VpnConnection

https://answers.microsoft.com/en-us/insider/forum/insider_wintp-insider_web/how-to-disable-default-gateway-remote-in-vpm-with/6d4e1090-dbfc-4474-bcaf-cf4d60d0a2f8

https://answers.microsoft.com/en-us/insider/forum/insider_wintp-insider_web/how-to-disable-default-gateway-remote-in-vpm-with/6d4e1090-dbfc-4474-bcaf-cf4d60d0a2f8

ปรับแก้เรื่องปุ่ม Home End ให้เหมือน Windows

ปรับแก้เรื่องปุ่ม Home End ให้เหมือน Windows

Mac OS X’s ~Library/KeyBindings/DefaultKeyBinding.dict

{
/* Remap Home / End keys to be correct */
“UF729” = “moveToBeginningOfLine:”; /* Home */
“UF72B” = “moveToEndOfLine:”; /* End */
“$UF729” = “moveToBeginningOfLineAndModifySelection:”; /* Shift + Home */
“$UF72B” = “moveToEndOfLineAndModifySelection:”; /* Shift + End */
“^UF729” = “moveToBeginningOfDocument:”; /* Ctrl + Home */
“^UF72B” = “moveToEndOfDocument:”; /* Ctrl + End */
“$^UF729” = “moveToBeginningOfDocumentAndModifySelection:”; /* Shift + Ctrl + Home */
“$^UF72B” = “moveToEndOfDocumentAndModifySelection:”; /* Shift + Ctrl + End */
}

เวลามี JasperServer อยู่หลัง nginx proxy เวลาเปิดเว็บมันจะวน loop refresh ตัวเองไม่เลิก และดูใน cataline.out…

เวลามี JasperServer อยู่หลัง nginx proxy เวลาเปิดเว็บมันจะวน loop refresh ตัวเองไม่เลิก และดูใน cataline.out จะพบอะไรทำนอง

2017-06-09 03:25:17,409 ERROR CsrfGuard,http-nio-8082-exec-9:44 – potential cross-site request forgery (CSRF) attack thwarted (user:, ip:127.0.0.1, method:POST, uri:/jasperserver/flow.html, error:required token is missing from the request)

วิธีแก้คือ
1. ให้เติมใน nginx config

allow undescores in headers on your proxy

–nginx—

server {

underscores_in_headers on;}

2. apache-tomcat/conf/server.xml

เติม scheme=”https” proxyPort=”443″ ต่อท้ายในส่วน Connector

<Connector port="8888" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
URIEncoding="UTF-8" scheme="https" proxyName="” proxyPort=”443″/>

ในเว็บด้านล่างบอกให้แก้ apache-tomcat/webapps/jasperserver/WEB-INF/classes/esapi/security-config.properties ตามด้านล่าง แต่เหมือนไม่ต้องทำก็ได้

security.validation.csrf.on=false

อีกแนวทางหนึ่งที่เหมือนจะได้คือแก้

WEB-INF/csrf/jrs.csrfguard.properties> org.owasp.csrfguard.Enabled = false

http://community.jaspersoft.com/questions/823240/jasperserver-55-csrf-error-when-installed-behind-apache-reverse-proxy

http://community.jaspersoft.com/questions/823240/jasperserver-55-csrf-error-when-installed-behind-apache-reverse-proxy

Benchmarks ให้ลอง Vuthichai Ampornaramveth

Benchmarks ให้ลอง Vuthichai Ampornaramveth
บน Dell Precision 5520 Notebook ใหม่

Browser / JavaScript
https://chromium.github.io/octane/

Octane Score:
ใน Windows: 30388
ใน Mac OS (VMware): 24083

CPU
http://geekbench.com/
ใน Windows:
Single-Core Score Multi-Core Score
3840 11889
ใน Mac OS (VMware):
Single-Core Score Multi-Core Score
3648 10774

https://browser.geekbench.com/v4/cpu/3048851

3D GPU
https://www.futuremark.com/benchmarks/3dmark
ใหญ่เกิน ยังโหลดไม่เสร็จ

https://www.futuremark.com/benchmarks/3dmark

AutoHotKey setting กรณีสลับปุ่ม Windows กับ Alt

AutoHotKey setting กรณีสลับปุ่ม Windows กับ Alt

ใช้ Mac มานานๆ ก็เกิดความถนัด key binding ต่างๆ ของ Mac มาพอใช้ Windows ก็เลยอยากได้แบบของ Mac รวมถึงพวกปุ่มเปลี่ยนภาษาที่ใช้ alt-space

วิธีการใช้ Auto Hot Key และใส่เนื้อหา script ดังนี้

(script บางส่วนจาก https://superuser.com/questions/435602/shortcut-in-windows-7-to-switch-between-same-applications-windows-like-cmd)

พบว่าเปลี่ยนภาษาใช้วิธีนี้ดีที่สุด

LAlt & Space:: ; Change language
PostMessage, 0x50, 0x02,0,, A
Send, {Ctrl down}{Shift}{Ctrl up}
return

ที่ต้องเพิ่ม Send, {Ctrl down}{Shift}{Ctrl up} เพราะถ้าไม่มีบรรทัดนี้ พอใช้ร่วมกับ VcXsrv ซึ่งต้อง start ด้วย option
“C:Program FilesVcXsrvvcxsrv.exe” :0 -ac -terminate -lesspointer -multiwindow -clipboard -wgl -xkblayout us,th -xkbvariant winkeys -xkboptions grp:alt_shift_toggle

ปรากฎว่ามันจะไม่เปลี่ยนภาษาด้วย alt-space (แต่เปลี่ยนด้วย laft + lshift) แต่ถ้าใส่
Send, {Ctrl down}{Shift}{Ctrl up} แล้วมันทำให้เปลี่ยนภาษาด้วย alt-space ได้ ซึ่งได้เพราะอะไรยังงงๆ

# ปล. ในกรณีที่ใช้ Windows ใน VMWare Fusion ที่มีการสลับปุ่ม Option กับ Command (เพราะผมชอบให้ปุ่ม Alt (ซึ่งจะ mapped กับปุ่ม command) มันติดกับ spacebar) ก็ต้องเปลี่ยนเป็น

!Space:: ; Change language
PostMessage, 0x50, 0x02,0,, A
Send, {Ctrl down}{Shift}{Ctrl up}
return

#############################################
แบบอื่นๆ
;LAlt & Space:: PostMessage, 0x50, 0x02,0,, A

; แบบนี้ ใช้ได้กับทุกโปรแกรมยกเว้น Microsoft Office 😦
;!Space::
;Send, {ALTDOWN}{SHIFTDOWN}{SHIFTUP}{ALTUP}
;return
;!Space::Send, {Alt down}{Shift}{Alt up}

###############################################
# เนื้อหาไฟล์ที่ใช้ล่าสุด

!q::Send, !{F4}
!a::Send, ^a
!c::Send, ^c
!v::Send, ^v
!t::Send, ^t
!x::Send, ^x
!w::Send, ^w
!z::Send, ^z
!y::Send, ^y
!m::Send, +{#} ; minimize all
!u::Send, +{#}m ; unminimize

LAlt & Space:: PostMessage, 0x50, 0x02,0,, A

#c::Run calc.exe

!`:: ; Next window
WinGetClass, ActiveClass, A
WinGet, WinClassCount, Count, ahk_class %ActiveClass%
IF WinClassCount = 1
Return
Else
WinGet, List, List, % “ahk_class ” ActiveClass
Loop, % List
{
index := List – A_Index + 1
WinGet, State, MinMax, % “ahk_id ” List%index%
if (State -1)
{
WinID := List%index%
break
}
}
WinActivate, % “ahk_id ” WinID
return

!^`:: ; Last window
WinGetClass, ActiveClass, A
WinGet, WinClassCount, Count, ahk_class %ActiveClass%
IF WinClassCount = 1
Return
Else
WinGet, List, List, % “ahk_class ” ActiveClass
Loop, % List
{
index := List – A_Index + 1
WinGet, State, MinMax, % “ahk_id ” List%index%
if (State -1)
{
WinID := List%index%
break
}
}
WinActivate, % “ahk_id ” WinID
return

Windows มีคำสั่งพิเศษ shell:xxxxx อยู่มากมาย

Windows มีคำสั่งพิเศษ shell:xxxxx อยู่มากมาย

shell:startup คือเปิด start up folder (ที่เราสามารถจะลากโปรแกรมต่างๆ มา create short cut here ในนี้ เพื่อจะให้มันรันทุกครั้งที่ starting up)

https://www.howtogeek.com/257715/how-to-open-hidden-system-folders-with-windos-shell-command/

https://www.howtogeek.com/257715/how-to-open-hidden-system-folders-with-windos-shell-command/

Windows 10 + VMware / Mac OS X set-up

Windows 10 + VMware / Mac OS X set-up

– ลง VMware-player-12.5.2-4638234.exe (ให้มันติดตั้ง Enhanced Keyboard driver ไปด้วย)
– patch ด้วย unlocker 2.08 (“Run as Admin” ==> win-install.cmd)
– สร้าง VM มา 1 อัน, ใส่ config ตามต้องการ
– edit .vmx file เติม

smc.version = “0”

– แก้ disk config ของ VM ลบอันเดิมทิ้ง แล้ว add อัน Sierra

– mount VMware tool ISO file แล้วติดตั้ง VMware tool

– ตั้งค่า Shared Folder ให้ VM

– แก้ C:UsersAppDataRoamingVMwarepreferences.ini
เติม
# ซ่อน toolbar
pref.vmplayer.fullscreen.nobar = 1
pref.fullscreen.autohide = “TRUE”
# grab key
pref.grabOnKeyPress = “TRUE”

จัดการ Samsung Galaxy S7 SM-G930FD

จัดการ Samsung Galaxy S7 SM-G930FD

Android 7

From:
http://www.droidviews.com/install-twrp-root-galaxy-s7-and-s7-edge-on-nougat-g935fxxu1dplt/

0. Copy
no-verity-opt-encrypt-5.0.zip
SR3-SuperSU-v2.79-SR3-20170114223742.zip
to SD card.

1. install TWRP
(volume down + home + power) go to download mode
then use ODIN to flash AP with twrp-3.1.1-0-herolte.img.tar

2. boot phone to TWRP by volume up + home + power 6 seconds
3. then use TWRP to Install
no-verity-opt-encrypt-5.0.zip
reboot to TWRP again

4. then install
SR3-SuperSU-v2.79-SR3-20170114223742.zip

5. install Root Essentials to handle SD adoptable storage stuff

done

PS:
1. TWRP download latest from https://dl.twrp.me/herolte/
2. If TWRP can’t install with error mounting data ==> need to wipe out/format data (using TWRP)
3.also tried http://galaxys7root.com/galaxy-s7-s7-edge-root/how-to-root-galaxy-s7-or-s7-edge-on-android-7-0-nougat-w-magisk/2/
but it didn’t work
4. Reset to stock Android 6
Download G930FXXU1CPJ2_G930FOLB1CPJ2_THL.zip and use ODIN to flash to mobile

http://galaxys7root.com/galaxy-s7-s7-edge-root/how-to-root-galaxy-s7-or-s7-edge-on-android-7-0-nougat-w-magisk/2/

Credit to Sukoom@MM

Credit to Sukoom@MM

Mapproxy has problem of cannot zoom layers to beyond 20.
The below quick fix is to just increate the limit to 23.

/usr/local/lib/python2.7/dist-packages/mapproxy# diff u grid-old.txt grid.py
— grid-old.txt 2017-05-23 12:53:47.063180887 +0700
+++ grid.py 2017-05-23 13:00:25.910840510 +0700
@@ -205,7 +205,8 @@
res.append(next_res)
else:
if not num_levels:
num_levels = 20 if res_factor != math.sqrt(2) else 40
+ #num_levels = 20 if res_factor != math.sqrt(2) else 40 # Ott modified May 23, 2017
+ num_levels = 23 if res_factor != math.sqrt(2) else 40
res = [min_res]
while len(res) < num_levels:
res.append(res[-1]/res_factor)

แปะๆ คำสั่ง symfony

แปะๆ คำสั่ง symfony

symfony new otttest
cd otttest/
vi app/config/parameters.yml
php bin/console server:start
(เข้า localhost:8000 ได้)

alias symclearcache=’php bin/console cache:clea -e prod’
alias symconsole=’php bin/console’
alias symrouter=’php bin/console debug:router’
alias symsetappcachelogs=’setfacl -R -m u:www-data:rwx -m u:pattara:rwx app/cache app/logs; setfacl -dR -m u:www-data:rwx -m u:pattara:rwx app/cache app/logs’

Set-up HTTPS with Free certificate

Set-up HTTPS with Free certificate

– แบบ gen เอง

# a2enmod ssl
# make-ssl-cert generate-default-snakeoil -force-overwrite

เติมใน apache conf

SSLEngine on

SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem
SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key

SSLOptions +StdEnvVars

BrowserMatch "MSIE [2-6]"
nokeepalive ssl-unclean-shutdown
downgrade-1.0 force-response-1.0
# MSIE 7 and newer should be able to use keepalive
BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown

แบบใช้ let’s encrypt free sir

https://certbot.eff.org/#ubuntutrusty-apache

cd /usr/local/sbin/
wget https://dl.eff.org/certbot-auto
chmod a+x certbot-auto
./certbot-auto
ตอบไปตามขั้นตอน มันจะแก้ apache config ให้เสร็จ
update ทดลอง
/usr/local/sbin/certbot-auto renew -dry-run
update จริง
/usr/local/sbin/certbot-auto renew --quiet --no-self-upgrade

ใส่ใน cron

0 0 * * *  python -c 'import random; import time; time.sleep(random.random() * 43200)' && PATH=/usr/sbin:$PATH /usr/local/sbin/certbot-auto renew  --quiet # --no-self-upgrade

สร้าง dhparm.pem

cd /etc/apache2 ; openssl dhparam -out dhparams.pem 2048

แล้วก็ตัดแปะผลลัพธ์ไปต่อท้าย SSL Certificate file ที่ใช้

เติมใน /etc/apache2/mods-enabled/ssl.conf

# Ott added April 7, 2016
SSLProtocol all -SSLv2 -SSLv3

SSLCipherSuite ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA

SSLHonorCipherOrder on

#SSLOpenSSLConfCmd Curves secp384r1
#SSLOpenSSLConfCmd DHParameters "/etc/apache2/dhparam.pem"

บางครั้งมีปัญหาเรื่อง tls-sni-01 challenge
เป็นจากสองบรรทัดนี้ ต้องเอาออกถึงจะ renew cert ได้

#ssl_stapling on;
#ssl_stapling_verify on;
(วิธี renew แบบใช้ standalone authen - nginx จะ down ไปแป็บนึง ไม่ดีนัก)
certbot-auto --authenticator standalone --installer nginx -d http://www-test.abc.com --pre-hook "service nginx stop" --post-hook "service nginx start"

ใช้ Cer ที่ที่ซื้อมา, ถ้าใช้ Apache config ประมาณนี้ (สังเกตว่า SSLPassPhraseDialog อยู่นอก VirtualHost


  SSLCertificateFile /etc/apache2/ssl/mycer.cer
  SSLCertificateKeyFile /etc/apache2/ssl/mycer.key
  SSLCertificateChainFile /etc/apache2/ssl/mycer.cer
</VirtualHost>


SSLPassPhraseDialog exec:/etc/apache2/ssl/mycer-passphrase-file.sh

โดยที่ข้างใน /etc/apache2/ssl/mycer-passphrase-file.sh คือ (chmod +x)

#!/bin/sh
cat /etc/apache2/ssl/mycer.pass

แต่ถ้า nginx ง่ายกว่า

    ssl_certificate /etc/nginx/ssl/mycer.cer;
    ssl_password_file /etc/nginx/ssl/mycer.passwd;
    ssl_certificate_key /etc/nginx/ssl/mycer.key;

vagrant start ไม่ขึ้น

vagrant start ไม่ขึ้น

error ทำนอง
The VirtualBox VM was created with a user that doesn’t match the current user running Vagrant. VirtualBox requires that the same user be used to manage the VM that was created. Please re-run Vagrant with that user. This is not a Vagrant issue.

The UID used to create the VM was: 1001 Your UID is: 1000

วิธีแก้คือ เข้าไป edit ไฟล์นี้ ให้มัน uid ตรงกัน
.vagrant/machines//virtualbox/creator_uid”

http://stackoverflow.com/questions/31644222/vagrant-not-starting-up-user-that-created-vm-doesnt-match-current-user

http://stackoverflow.com/questions/31644222/vagrant-not-starting-up-user-that-created-vm-doesnt-match-current-user

Ubuntu ถ้าเราไป disable ipv6 ไว้ใน /etc/sysctl.conf

Ubuntu ถ้าเราไป disable ipv6 ไว้ใน /etc/sysctl.conf

# IPv6
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1

มันจะทำให้ ssh -X ไป server นั้นๆ แล้วรัน X11 apps ไม่ได้ มันจะขึ้น

$ xclock
Error: Can’t open display:

ซึ่งดูใน /var/log/auth.log จะพบว่า

May 1 05:00:05 pm15 sshd[44649]: error: Failed to allocate internet-domain X11 display socket.

วิธีแก้คือ เติมไปที่ /etc/ssh/sshd_config

AddressFamily inet

แล้วมันถึงจะหาย

รายละเอียด ดู
https://bugs.launchpad.net/ubuntu/+source/openssh/+bug/136947

https://bugs.launchpad.net/ubuntu/+source/openssh/+bug/136947

แต่เดิมๆ ทำ HTTP Redirect ที่ Apache ด้วย

แต่เดิมๆ ทำ HTTP Redirect ที่ Apache ด้วย

RedirectMatch /(.*) http:///$1

ซึ่งเหมือนมันจะส่ง HTTP 302 ให้ redirect

แต่พบว่า HTTP POST parameters อะไรหายหมด

ค้นหาดูได้ความว่าให้ใช้ 307 แทน ใส่ใน config ยังงี้

Redirect 307 / http:///

คำอธิบายจาก
http://stackoverflow.com/questions/2068418/whats-the-difference-between-a-302-and-a-307-redirect

307 came about because user agents adopted as a de facto behaviour to take POST requests that receive a 302 response and send a GET request to the Location response header.

That is the incorrect behaviour — only a 303 should cause a POST to turn into a GET. User agents should (but don’t) stick with the POST method when requesting the new URL if the original POST request returned a 302.

307 was introduced to allow servers to make it clear to the user agent that a method change should not be made by the client when following the Location response header.

http://stackoverflow.com/questions/2068418/whats-the-difference-between-a-302-and-a-307-redirect

PostgreSQL timezone configuration

PostgreSQL timezone configuration

ก่อนนี้ไม่เห็นต้องตั้งแฮะ เดี๋ยวเพิ่งอัปเป็น 9.6 (จากเดิมรุ่น 8.x) พบว่า

SELECT current_timestamp; จะได้เวลา UTC เฉย

ไล่ไปไล่มาพบในไฟล์ postgresql.conf
ต้องแก้เป็น

#timezone = ‘UTC’
timezone = ‘Asia/Bangkok’

#log_timezone = ‘UTC’
log_timezone = ‘Asia/Bangkok’

ผู้ประกอบธุรกิจบริการการชำระเงินทางอิเล็กทรอนิกส์

ผู้ประกอบธุรกิจบริการการชำระเงินทางอิเล็กทรอนิกส์
https://www.bot.or.th/Thai/PaymentSystems/OversightOfEmoney/ListOfEmoney/Pages/eMoneyProvider.aspx

ผู้ประกอบธุรกิจบัตรเงินอิเล็กทรอนิกส์
https://www.bot.or.th/Thai/PaymentSystems/OversightOfEmoney/eMoneyProvider/Pages/default.aspx

https://www.bot.or.th/Thai/PaymentSystems/OversightOfEmoney/ListOfEmoney/Pages/eMoneyProvider.aspx

มีปัญหาว่าใน Docker Container ไม่สามารถ start NTP server ได้

มีปัญหาว่าใน Docker Container ไม่สามารถ start NTP server ได้

อาการประมาณนี้

root@2454e41f5eb4:/# /etc/init.d/ntp start
* Starting NTP server ntpd /usr/sbin/ntpd: error while loading shared libraries: libopts.so.25: cannot open shared object file: Permission denied
[fail]

ดูใน https://groups.google.com/forum/#!topic/passenger-docker/B7Cq3gs1paw บอกว่าเป็นเพราะว่า App Armor ของ host มันรันอยู่ ก็เอา NTP ออกไปซะ ก็รันได้

root@host:/etc/apparmor.d# mv usr.sbin.ntpd disable/
root@host:/etc/apparmor.d# service apparmor restart

root@2454e41f5eb4:/# /etc/init.d/ntp start
* Starting NTP server ntpd [ OK ]

https://groups.google.com/forum/#!topic/passenger-docker/B7Cq3gs1paw

Vuthichai Ampornaramveth กล่าวว่า

Vuthichai Ampornaramveth กล่าวว่า

เคลียร์พื้นที่คืนจาก X Code

1. ~/Library/Developers $ xcrun simctl delete unavailable
2. rm -rf Xcode/DerivedData/*
3. ข้างใน “iOS DeviceSupport” อันไหนไม่เอาก็ลบทิ้งไป

ก็ได้มาหลายสิบ GB อยู่

MySQL เปลี่ยนทุก table จาก MyISAM เป็น InnoDB

MySQL เปลี่ยนทุก table จาก MyISAM เป็น InnoDB

เหตุผลหลักคือ row-level locking แทนที่จะเป็น table-level locking ใน MyISAM

SELECT CONCAT(‘ALTER TABLE ‘, TABLE_SCHEMA, ‘.’, TABLE_NAME,’ ENGINE=InnoDB;’)
FROM Information_schema.TABLES WHERE TABLE_SCHEMA = ‘DBNAME’ AND ENGINE = ‘MyISAM’ AND TABLE_TYPE = ‘BASE TABLE’

http://www.ryadel.com/en/mysql-convert-all-tables-of-one-or-more-databases-to-myisam-or-innodb/

MySQL – Convert all Tables of one or more Database(s) from MyISAM to InnoDB and vice-versa

Google Street View URL

Google Street View URL
http://stackoverflow.com/questions/387942/google-street-view-url

————————————————————————————————————
Building a Google Street View URL

Basic Google Map URL http://maps.google.com/maps?q=

q= Query – anything passed in this parameter is treated as if it had been typed into the query box on the maps.google.com page.

Basic url to display GPS cords location

http://maps.google.com/maps?q=31.33519,-89.28720

http://maps.google.com/maps?q=&layer=c

layer= Activates overlays. Current options are “t” traffic, “c” street view. Append (e.g. layer=tc) for simultaneous.

http://maps.google.com/maps?q=&layer=c&cbll=

cbll= Latitude,longitude for Street View

http://maps.google.com/maps?q=&layer=c&cbll=31.33519,-89.28720

http://maps.google.com/maps?q=&layer=c&cbll=31.335198,-89.287204&cbp=

cbp= Street View window that accepts 5 parameters:

Street View/map arrangement, 11=upper half Street View and lower half map, 12=mostly Street View with corner map
Rotation angle/bearing (in degrees)
Tilt angle, -90 (straight up) to 90 (straight down)
Zoom level, 0-2
Pitch (in degrees) -90 (straight up) to 90 (straight down), default 5
The one below is: (11) upper half Street View and lower half map, (0) Facing North, (0) Straight Ahead, (0) Normal Zoom, (0) Pitch of 0

This one works as is, just change the cords and if you want to face a different direction (the 0 after 11) http://maps.google.com/maps?q=&layer=c&cbll=31.335198,-89.287204&cbp=11,0,0,0,0

For more Google Street View code interpertation

บันทีกการ unroot S7

บันทีกการ unroot S7

1. ลง Odin3 v3.12.3
2. Download stock ROM อะไรทำนอง
G930FXXU1CPJ2_G930FOLB1CPJ2_THL.zip

3. ใช้ Odin ลง Stock ROM โดยเลือกไฟล์
BL, AP, CP, HOME_CSC จาก zip ไฟล์ในข้อ 2

4. reboot กลับมาปั๊บ มันจะถาม decrypt password ไม่รู้ตอบอะไร ก็เลย recovery mode (volume up + home + power) เข้าไป reset to factory default มันก็จะบูตกลับมาเหมือนเป็นเครื่องใหม่

Samsung S7 internal memory 32GB ที่ให้มา ลงโน่นนี่สักพักก็เต็ม

Samsung S7 internal memory 32GB ที่ให้มา ลงโน่นนี่สักพักก็เต็ม

สามารถใช้ SD Card เป็น internal memory ได้ วิธีการ

$ adb shell

shell@herolte:/ $ sm list-disks
disk:179,0

shell@herolte:/ $ sm partition disk:179,0 private

จากนั้นก็เข้า Setting / Storage / SD Card / More option ==> Migrate data

ยังสงสัยว่า แล้วถ้าผู้ใช้ทั่วไป ไม่ได้มีลง adb ไว้จะทำยังไง

https://www.xda-developers.com/enable-adoptable-storage-for-galaxy-s7-and-s7-edge/

https://www.xda-developers.com/enable-adoptable-storage-for-galaxy-s7-and-s7-edge/

โดย Punyapat Sessomboon

โดย Punyapat Sessomboon

Symfony ช้าๆ อืดๆ อยู่ดีๆ request ก็อึ้ง 20 วิ แล้วค่อยตอบ ทั้งๆ ที่ เครื่องก็ว่างๆ

สรุปเป็นปัญหาที่ PHP session_start() จะเรียกซ้อนกันไม่ได้ กล่าวคือจาก browser อย่ายิง ajax ไปหา server เยอะ โดยที่แต่ละอันเปิด session_start() มันจะรอกัน

วิธีแก้อันไหนที่ไม่ได้ใช้ session ก็สั่ง

session_write_close();

ซะ
http://konrness.com/php5/how-to-prevent-blocking-php-requests/

ทำ docker img ไว้ แล้ววันดีคืนดีบนเครื่องใหม่จะใช้ ก็สั่ง docker load < xxxxx.img แล้วมันก็ว่า No space left on…

ทำ docker img ไว้ แล้ววันดีคืนดีบนเครื่องใหม่จะใช้ ก็สั่ง docker load < xxxxx.img แล้วมันก็ว่า No space left on devices ทั้งๆ ที่ /data/docker ก็ใหญ่โตแล้ว

สรุปวิธีแก้
0. ใช้ docker-engine เหมือนจะโอกว่า docker.io ที่มากับ Ubuntu
กล่าวคือ ต้องใส่ใน /etc/apt/sources.list

deb https://apt.dockerproject.org/repo ubuntu-trusty main

1. สั่ง docker info ดู จะเห็นว่า base device size มัน 10GB ซึ่งไม่พอ

# docker info | less
WARNING: Usage of loopback devices is strongly discouraged for production use. Use `–storage-opt dm.thinpooldev` to specify a custom block storage device.
WARNING: No swap limit support
Containers: 0
Running: 0
Paused: 0
Stopped: 0
Images: 0
Server Version: 1.12.3
Storage Driver: devicemapper
Pool Name: docker-8:1-131219-pool
Pool Blocksize: 65.54 kB
Base Device Size: 10.74 GB <————————— ตรงนี้

2. เพิ่มใน /etc/default/docker
DOCKER_OPTS="-g /data/docker" –storage-opt dm.basesize=40G"

restart docker แล้วสั่ง docker info อีกที จะกลายเป็น 40GB ล่ะ

# docker info | less
WARNING: Usage of loopback devices is strongly discouraged for production use. Use `–storage-opt dm.thinpooldev` to specify a custom block storage device.
Containers: 0
Running: 0
Paused: 0
Stopped: 0
Images: 0
Server Version: 1.12.3
Storage Driver: devicemapper
Pool Name: docker-8:33-232783876-pool
Pool Blocksize: 65.54 kB
Base Device Size: 42.95 GB <————- โตขึ้นแล้ว

Memcache w/ Repcached set-up

Memcache w/ Repcached set-up

Repcached http://repcached.lab.klab.org/ เป็น patch สำหรับ memcache ที่ทำให้มันรองรับ replication ได้ ซึ่งเหมือนจะนิ่งๆ ไป แต่ก็มีคนดูแลต่อทำ ubuntu dev ไว้ที่

https://launchpad.net/~niedbalski/+archive/ubuntu/memcached-repcached

ซึ่งก็ไป

add-apt-repository ppa:niedbalski/memcached-repcached

เอามาลงได้ จะได้รุ่น memcached ประมาณ 1.4.14-0ubuntu10repcache3

สั่ง
apt-mark hold memcached
ไว้ มันจะได้ไม่ auto udpate กลับไปรุ่น ubuntu เดิม (สั่ง apt-mark showhold เพื่อดูผลลัพธ์)

วิธีการใช้งานเหมือนเดิมทุกอย่าง **** ยกเว้นต้องใส่ -X สำหรับระบุ replication port ถ้าไม่ระบุมันจะ default ให้ ซึ่งทำให้รันหลาย process ไม่ได้ มันจะตีกัน **

และ -x สำหรับ peer server ที่จะ replicate ไป

อะไรประมาณนี้
/usr/bin/memcached -d -u memcache -m 128 -p 11212 -l 10.0.0.2 -x 10.0.0.200 -X 21212

ตั้งแต่ Xcode8/iOS10 ไม่รู้ submit iOS App ขึ้นไปมันก็จะมีเมล์มาบอกว่า

ตั้งแต่ Xcode8/iOS10 ไม่รู้ submit iOS App ขึ้นไปมันก็จะมีเมล์มาบอกว่า

Missing Push Notification Entitlement – Your app includes an API for Apple’s Push Notification service, but the aps-environment entitlement is missing from the app’s signature. To resolve this, make sure your App ID is enabled for push notification in the Provisioning Portal. Then, sign your app with a distribution provisioning profile that includes the aps-environment entitlement. This will create the correct signature, and you can resubmit your app. See “Provisioning and Development” in the Local and Push Notification Programming Guide for more information. If your app does not use the Apple Push Notification service, no action is required. You may remove the API from future submissions to stop this warning. If you use a third-party framework, you may need to contact the developer for information on removing the API.

สรุปคือ

– ใน Xcode’s Build Settings’s Code Signing Entitlements ต้องใส่ค่าไฟล์ entitlements ไว้ ให้มันขึ้นช่องเดียว ไม่ต้องแยก Debug/Release ถ้ามีบรรทัดอะไรว่างๆ ภายในจะไม่ได้!

– ใน tab “Capabilities” ก็ให้เลือก Push Noti เป็น ON

อ่านผลตรวจเลือดด้วยตนเอง

แปะเก็บไว้

อ่านผลตรวจเลือดด้วยตนเอง (ควรจัดพิมพ์เก็บเอาไว้อ่านเทียบกับผลตรวจสุขภาพประจำปีนะครับ)
โดย นพ.สันต์ ใจยอดศิลป์
วันนี้ผมจะรวบยอดสอนการแปลผลการตรวจเคมีในเลือดให้ฟัง ท่านที่ถามมาคล้ายกันแต่ว่าผมไม่ได้ตอบก็ขอให้เอาวิธีแปลผลที่คุยกันวันนี้ไปแปลผลการตรวจของท่านเอาเองก็แล้วกัน
1. Blood chemistry แปลตรงๆว่าเคมีของเลือด หมายถึงระดับของสารต่างๆที่อยู่ในเลือดซึ่งก่อปฏิกิริยาเคมีได้ ซึ่งการเพิ่มขึ้นหรือลดลงของสารเหล่านี้ บ่งบอกไปถึงว่าจะมีโรคอะไรเกิดขึ้นในร่างกายบ้าง
 2. FBS = ย่อมาจาก fasting blood sugar แปลว่าระดับน้ำตาลในเลือดหลังการอดอาหารมาอย่างน้อย 8 ชั่วโมง เป็นการตรวจสถานะของโรคเบาหวานโดยตรง คือคนปกติค่านี้จะต่ำกว่า 100 mg/dL ถ้าของใครสูงเกิน 125 ก็ถือว่าเป็นเบาหวานแล้วอย่างบริบูรณ์
3. HbA1C = ย่อมาจาก hemoglobin A1C แปลว่าระน้ำตาลสะสมเฉลี่ยสามเดือนในเม็ดเลือดแดง มีความหมายคล้ายๆกับค่า FBS คือโดยคำนิยาม ถ้าน้ำตาลสะสมเฉลี่ยของของใครสูงกว่า 6.5% ก็ถือว่าเป็นโรคเบาหวานไปแล้วอย่างบริบูรณ์ ค่า HbA1C นี้ดีกว่าค่า FBS ในสองประเด็น คือ
3.1 ทำให้เราตรวจคัดกรองเบาหวานได้ทุกเมื่อ โดยไม่ต้องอดอาหารมาล่วงหน้า
3.2 การที่มันสะท้อนค่าน้ำตาลในเลือดในช่วงเวลาสามเดือนย้อนหลัง จึงตัดปัญหาระดับน้ำตาลวูบวาบในช่วงหนึ่งวันก่อนการตรวจ คือคนไข้บางคนที่จะทำตัวดีเฉพาะสองสามวันก่อนไปหาหมอเพื่อให้น้ำตาลในเลือดดูดี พอคล้อยหลังหมอตรวจเสร็จก็ออกมาสั่งไอติมมากินเป็นกะละมังให้หายอยาก คนไข้แบบนี้การตรวจ HbA1C จะทำให้ทราบสถานะที่แท้จริงของเบาหวานดีกว่า
4. BUN =  ย่อมาจาก blood urea nitrogen แปลว่าไนโตรเจนในรูปของยูเรีย  ตัวยูเรียนี้เป็นเศษของเหลือจากการเผาผลาญโปรตีนที่ตับ ซึ่งต้องถูกกำจัดทิ้งโดยไต การวัดระดับค่าของ BUN เป็นตัวบ่งบอกว่าเลือดไหลไปกรองที่ไตมากพอหรือไม่ ในภาวะที่เลือดไหลไปกรองที่ไตน้อยลง เช่นในภาวะร่างกายขาดน้ำ หรือสูญเสียเลือดไปทางอื่นเช่นเลือดออกในทางเดินอาหาร หรือในภาวะช็อก ระดับของ BUN จะสูงขึ้นอย่างรวดเร็ว ค่าปกติของ BUN คือ 8-24 
5. Cr = เขียนเต็มว่า Creatinine แปลว่าเศษเหลือจากการสลายตัวของกล้ามเนื้อ คือกล้ามเนื้อของคนเรานี้มันสลายตัวและสร้างใหม่อยู่ตลอดเวลา คนมีกล้ามมากก็สลายตัวมากสร้างมาก Cr ซึ่งเป็นเศษซากที่สลายตัวออกมาจะถูกไตขับทิ้งไป แต่ในกรณีที่ไตเสียการทำงาน เช่นเป็นโรคไตเรื้อรัง ไตจะขับ Cr ออกทิ้งไม่ทันกับที่กล้ามเนื้อสลายออกมา ทำให้ระดับ Cr ในเลือดสูงผิดปกติ ค่าปกติของมันคือ 0.7-1.2 mg/dL 
6. eGFR = เรียกสั้นๆว่า จีเอฟอาร์. ย่อมาจาก estimated glomerular filtration rate แปลว่าอัตราการไหลของเลือดผ่านตัวกรองของไตในหนึ่งนาที ค่านี้ได้จากการคำนวณเอาจาก Cr กับอายุ และชาติพันธุ์ของเจ้าตัว ห้องแล็บที่ยังไม่ทันสมัยจะไม่รายงานค่านี้ ถ้าเจ้าตัวอยากทราบค่านี้ต้องเอาค่า Cr ที่ได้ไปอาศัย GFR calculator ตามเว็บในเน็ทคำนวณให้ ค่าจีเอฟอาร์.นี้มีประโยชน์มากในแง่ที่ใช้แบ่งระดับความรุนแรงของคนที่ Cr ผิดปกติอย่างคุณนี้ว่ามีความรุนแรงเป็นโรคไตเรื้อรังระยะไหนของ 5 ระยะ กล่าวคือ 
ระยะที่ 1 ตรวจพบพยาธิสภาพที่ไตแล้ว แต่ไตยังทำงานปกติ (จีเอฟอาร์ 90 มล./นาที ขึ้นไป) 
ระยะที่ 2 ตรวจพบพยาธิสภาพที่ไตแล้ว และไตเริ่มทำงานผิดปกติเล็กน้อย (จีเอฟอาร์ 60-89 มล./นาที)
ระยะที่ 3 ไตทำงานผิดปกติปานกลาง ไม่ว่าจะตรวจพบพยาธิสภาพที่ไตหรือไม่ก็ตาม (จีเอฟอาร์ 30-59 มล./นาที
)ระยะที่ 4 ไตทำงานผิดปกติมาก (จีเอฟอาร์ 15-29 มล./นาที)
ระยะที่ 5. ระยะสุดท้าย (จีเอฟอาร์ต่ำกว่า 15 หรือต้องล้างไต)    
 7. Uric acid ก็คือกรดยูริกที่เป็นต้นเหตุของโรคเก้าท์นั่นแหละ ค่าปกติของกรดยูริกในเลือดคือ 3.4-7.0 
8. Triglyceride คือไขมันไตรกลีเซอไรด์ ซึ่งเป็นไขมันก่อโรคชนิดหนึ่งในร่างกายเรา ระดับที่สูงจนต้องใช้ยาคือเกิน 200 mg/dl 
9. HDL-cholesterol เรียกสั้นๆว่าเอ็ช.ดี.แอล. เรียกอีกอย่างว่า “ไขมันดี” เพราะมันเป็นไขมันที่ดึงไขมันที่พอกหลอดเลือดออกไปจากหลอดเลือด ดังนั้นยิ่งมีเอ็ช.ดี.แอล.มากก็ยิ่งดี คนปกติควรมีเอ็ชดีแอล.เกิน 40 mg/dl ขึ้นไป 
10. LDL-cholesterol เรียกสั้นๆว่าแอลดีแอล. หรือเรียกอีกอย่างว่า “ไขมันเลว” เพราะมันเป็นตัวไขมันที่พอกอยู่ที่ผนังหลอดเลือดและเป็นไขมันก่อโรคโดยตรง การจะตัดสินว่าคนไข้คนไหนควรกินยาลดไขมันเมื่อไหร่ก็ตัดสินกันจากระดับแอลดีแอล.นี่แหละ โดยเทียบกับความเสี่ยงในการเป็นโรคที่แต่ละคนมีเป็นทุนอยู่แล้ว  กล่าวคือ
– ถ้ามีความเสี่ยงต่ำ จะให้เริ่มทานยาลดไขมันเมื่อ LDL มากกว่า 160
– ถ้ามีความเสี่ยงปานกลาง จะให้เริ่มทานยาลดไขมัน
เมื่อ LDL มากกว่า 130
– ถ้ามีความเสี่ยงสูง หรือเป็นโรคหัวใจ หรือเบาหวาน หรืออัมพาตแล้ว จะให้เริ่มทานยาลดไขมันเมื่อ LDL มากกว่า 100   
11. Total Cholesterol หมายถึงโคเลสเตอรอลรวมในร่างกาย เป็นค่ารวมของไขมันสามอย่าง กล่าวคือ    
โคเลสเตอรอลรวม = ไขมันดี (HDL) + ไขมันเลว (LDL) + หนึ่งในห้าของไขมันไตรกลีเซอไรด์      สมัยก่อนเราใช้ค่าโคเลสเตอรอลรวมตัวนี้ตัวเดียวในการประเมินไขมันในเลือด จึงได้กำหนดค่าปกติไว้ว่าถ้าสูงเกิน 240 mg/dl จึงจะถือว่าสูงและเริ่มใช้ยา 
แต่สมัยนี้เราไม่ค่อยจะดูค่าโคเลสเตอรอลรวมกันเท่าไหร่แล้ว เราดูเจาะลึกลงไปถึงไขมันแต่ละชนิด และตัดสินใจใช้หรือไม่ใช้ยาจากระดับไขมันเลว (LDL) โดยไม่สนใจโคเลสเตอรอลรวมแล้ว เพราะค่านี้มักชักนำให้เข้าใจผิด ยกตัวอย่างเช่นถ้าดูค่าโคเลสเตอรอลรวมได้ 214 ซึ่งก็แค่สูงเกินพอดีไปบ้างแต่ไม่สูงถึงกับต้องใช้ยา แต่ว่าจริงๆแล้วเป็นความเข้าใจผิด เพราะค่าโคเลสเตอรอลรวมดูต่ำอยู่ได้เพราะมีไขมันดี (HDL) ต่ำกว่าปกติ เลยพลอยทำให้ค่าโคเลสเตอรอลรวมต่ำไปด้วย ทั้งๆที่เป็นคนมีไขมันเลวอยู่ในระดับสูงถึงขั้นต้องใช้ยาแล้ว 
12. AST(SGOT) = ย่อมาจาก aspartate transaminase หรือชื่อเก่าว่า serum glutamic oxaloacetic transaminase เป็นเอ็นไซม์ที่ปกติอยู่ในเซลของตับ ซึ่งจะไม่ออกมาในเลือด หากมีเอ็นไซม์ตัวนี้ออกมาในเลือดมากก็แสดงว่าเซลตับกำลังได้รับความเสียหาย เช่นอาจจะมีตับอักเสบจากการติดเชื้อหรือจากสารพิษ หรือแม้กระทั้งจากแอลกอฮอล์ และไขมันแทรกเนื้อตับ ค่าปกติของ AST คือไม่เกิน 40 IU/L 
13. ALT (SGPT) = ย่อมาจาก alamine amintransferase หรือชื่อเก่าว่า serum glutamic pyruvic transaminase เป็นเอ็นไซม์ที่ปกติอยู่ในเซลของตับเช่นเดียวกับ AST และจะออกมาในเลือดเมื่อเซลตับได้รับความเสียหายเช่นกัน โดยเฉพาะอย่างยิ่งในกรณีที่มีเนื้องอกอุดตันทางเดินน้ำดี ค่าปกติของ ALT คือไม่เกิน 34 IU/L 
14. Alkaline Phosphatase = เป็นเอ็นไซม์ที่อยู่ในเซลของตับ ทางเดินน้ำดี และของกระดูกเป็นส่วนใหญ่ ความหมายของเอ็นไซม์ตัวนี้หากมันสูงขึ้นคืออาจจะมีปัญหาที่ทางเดินน้ำดี ตับ หรือกระดูก ค่าปกติในผู้ชายผู้ใหญ่ไม่เกิน 128 U/L
15. GTT = ย่อมาจาก gamma glytamyl transpeptidase เป็นเอ็นไซม์ในเซลตับและทางเดินน้ำดีเช่นเดียวกับ ALT มีความไวต่อความเสียหายของเซลตับมากกว่า แต่ขาดความจำเพาะเจาะจง หมายความว่าเมื่อ GTT สูงจะเกิดจากอะไรก็ได้ที่อาจจะไม่ใช่เรื่องของตับ เช่นอาจมีปัญหาที่ตับอ่อน ที่หัวใจ ที่ปอด หรือแม้กระทั่งเป็นเบาหวาน อ้วน หรือดื่มแอลกอฮอล์ ก็ทำให้ GTT สูงได้ สารตัวนี้จึงไม่มีประโยชน์ในการคัดกรองโรคเลย 
16. HBs Ag = ย่อมาจาก hepatitis B surface antigen แปลว่าตัวไวรัสตับอักเสบบี.ซึ่งตรวจจากโมเลกุลที่ผิวของมัน ถ้าตรวจได้ผลบวกก็แปลว่ามีเชื้อไวรัสตับอักเสบบี.อยู่ในตัว หากตรวจได้ผลลบ ก็แปลว่าไม่มีเชื้อไวรัสตับอักเสบบี
17. Anti HBs = ย่อมาจาก antibody to hepatitis B surface antigen แปลว่าภูมิต้านทานต่อไวรัสตับอักเสบบี. หากตรวจได้ผลบวกก็แปลว่าคุณมีภูมิคุ้มกันต่อไวรัสบี.แล้ว ไม่ต้องไปแสวงหาการฉีดวัคซีน

Ubuntu NGINX Set-up + SSL

Ubuntu NGINX Set-up + SSL

1. สร้าง dhparam.pem
cd /etc/ssl/certs/
openssl dhparam -out dhparam.pem 2048

2. เติม ใน /etc/nginx/nginx.conf

log_format timing ‘$remote_addr – $remote_user [$time_local] $request ‘
‘by $upstream_addr uptime $upstream_response_time ‘
‘mytime $request_time’;

# Specify a log format compatible with Apache’s combined format
log_format main ‘$remote_addr – $remote_user [$time_local] ‘
‘”$request” $status $body_bytes_sent “$http_referer” ‘
‘”$http_user_agent” “$http_x_forwarded_for” ‘
‘by “$upstream_addr” uptime “$upstream_response_time” ‘
‘mytime “$request_time” ‘;

log_format up_head ‘$remote_addr – $remote_user [$time_local] $request ‘
‘upstream_http_content_type $upstream_http_content_type’;

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
ssl_ciphers ‘ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA’;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;

# มีปัญหากับ certbot-auto renew
#ssl_stapling on;
#ssl_stapling_verify on;
add_header Strict-Transport-Security max-age=15768000;

3. mkdir /etc/nginx/ssl/
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/nginx/ssl/nginx.key -out /etc/nginx/ssl/nginx.crt

4. nginx site config

listen 443 ssl;
ssl_certificate /etc/nginx/ssl/nginx.crt;
ssl_certificate_key /etc/nginx/ssl/nginx.key;

5. config ที่ใช้บ่อยๆ

location /phppgadmin {
root /usr/share/;
index index.php;
location ~ ^/phppgadmin/(.+.php)$ {
try_files $uri =404;
fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
fastcgi_index index.php;
include fastcgi.conf;
fastcgi_read_timeout 86400;
}

auth_basic “DB Staff”;
auth_basic_user_file /etc/phppgadmin/htpasswd;
}

#location /jasperserver {
# proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# proxy_pass http://127.0.0.1:8081/jasperserver;
# proxy_read_timeout 900;
#}

#location /highchartsexport {
# proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# proxy_pass http://127.0.0.1:7801/;
# proxy_read_timeout 900;
#}

location /geoserver {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://127.0.0.1:8080/geoserver;

#proxy_pass http://geoserverservers/geoserver/;
#proxy_set_header Host $host;
#proxy_set_header X-Real-IP $remote_addr;
#proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#proxy_set_header X-Forwarded-Proto https;

}

SSL/TLS Web Set-up Ubuntu Apache (2.2)

SSL/TLS Web Set-up Ubuntu Apache (2.2)

วันดีคืนดี web (https) ก็เปิดจาก iPhone App ไม่ได้
http://stackoverflow.com/a/31245309/1586439

วิธีตรวจสอบง่ายๆ ดู https://www.ssllabs.com/ ทดสอบแล้วก็เห็นปัญหา (เค้าจะให้เกรดเรา A, B, C)
อันที่เป็นปัญหาคือเรื่อง Diffie-Hellman ต้องใช้ 2048 bit

สรุปทีทำไป

1. เติมต่อท้ายใน /etc/apache2/mods-enabled/ssl.conf

# Ott added April 7, 2016
SSLProtocol all -SSLv2 -SSLv3

SSLCipherSuite ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA

SSLHonorCipherOrder on

2. สร้าง dhparm.pem

openssl dhparam -out dhparams.pem 2048

แล้วก็ตัดแปะผลลัพธ์ไปต่อท้าย SSL Certificate file ที่ใช้

ได้ A แล้ว

Keychain Corrupted in Mac OS X

Keychain Corrupted in Mac OS X

1. วันดีคืนดี ก็ build app ลงมือถือไม่ได้
error ว่า The specified keychain is not a valid keychain file.

2. ดูด้วย Keychain Access ก็ไม่รู้ว่าปัญหาคืออะไร ต้องพิสูจน์ทราบด้วย
$ security list-keychains
จะเห็นว่ามี keychain file อะไรบ้าง แล้วก็ลองไล่หาปัญหา
$ security dump-keychain /Users/pattara/Library/Keychains/login.keychain
มันก็จะ dump พรืดอะไรมาเยอะมาก
แต่ไม่จบ จะมี error ก่อน

3. วิธีแก้ที่เท่ห์ๆ ยังทำไม่ได้ แต่ที่ทำคือ ใช้ Keychain Access reset login keychain ไปเลย และเริ่มใหม่ import key cerficiate อะไรเข้าไปทีละอัน ก็จะ build ได้

หมดเวลา 3 man-hours

mount NTFS จาก XenServer

mount NTFS จาก XenServer

wget http://packages.sw.be/rpmforge-release/rpmforge-release-0.5.2-2.el5.rf.i386.rpm

Install DAG’s GPG key

rpm –import http://apt.sw.be/RPM-GPG-KEY.dag.txt

Verify the package

rpm -K rpmforge-release-0.5.2-2.el5.rf.i386.rpm

Install it

rpm -i rpmforge-release-0.5.2-2.el5.rf.i386.rpm

Disable it by changing the following flag: enabled = 1 to enabled = 0 in the following file

vi /etc/yum.repos.d/rpmforge.repo

Install the library/driver

yum –enablerepo=rpmforge –enablerepo=base install fuse-sshfs

yum –enablerepo=rpmforge install ntfs-3g

Finally mount the USB drive

mount -t ntfs-3g /dev/sdb1 /usbdisk

https://nchrissos.wordpress.com/2013/10/23/reading-and-writing-on-a-ntfs-usb-drive-attached-on-a-citrix-xenserver-6-2/

#xenserver

Reading and Writing on a NTFS USB Drive attached on a Citrix Xenserver 6.2

ลง NFS server บน xenserver

ลง NFS server บน xenserver

# yum –enablerepo=base –disablerepo=citrix install nfs-utils nfs-utils-lib

สร้าง /etc/exports เช่น
/data 192.168.1.38(ro,sync,no_root_squash,no_subtree_check)

# exportfs -a
# service portmap start
# service nfs start
# chkconfig portmap on
# chkconfig nfs on

# showmount -e

http://xmodulo.com/how-to-set-up-nfs-server-on-xenserver.html

https://www.digitalocean.com/community/tutorials/how-to-set-up-an-nfs-mount-on-centos-6

#xenserver

https://www.digitalocean.com/community/tutorials/how-to-set-up-an-nfs-mount-on-centos-6

บางครั้งเราก็อยาก ลงซอฟต์แวร์อะไรเพิ่มเติมใน xenserver ซึ่ง default repository มันจะเป็นเฉพาะ citrix ต้องสั่งประมาณ

บางครั้งเราก็อยาก ลงซอฟต์แวร์อะไรเพิ่มเติมใน xenserver ซึ่ง default repository มันจะเป็นเฉพาะ citrix ต้องสั่งประมาณ

yum –enablerepo=base –disablerepo=citrix install traceroute

ดูว่าใช้อะไรอยู่
yum repolist enabled

http://xmodulo.com/how-to-install-additional-packages-in.html

http://xmodulo.com/how-to-install-additional-packages-in.html

Mac เดี่ยวนี้เล่นไปเล่นมาก็ hangedๆ เอ๋อๆ ค้างๆ

Mac เดี่ยวนี้เล่นไปเล่นมาก็ hangedๆ เอ๋อๆ ค้างๆ

วีธีแก้แบบเบาคือ

1. option+command+esc แล้ว kill app ที่ค้าง

2. กรณี finder ค้าง ทำ script ไว้แบบนี้เลย

pattara@Otto-MBP:~$ cat /usr/local/bin/restartfinder.sh
killall -KILL Finder
killall -KILL Dock
killall -KILL Dock
killall -KILL SystemUIServer

การทำ URL path redirection Apache Pentaho

การทำ URL path redirection Apache Pentaho
(สมมติว่ารันที่ 8082)

Apache config:

ProxyPass /pentaho http://127.0.0.1:8082/pentaho
ProxyPassReverse /pentaho http://127.0.0.1:8082/pentaho

ProxyPass /pentaho-style http://127.0.0.1:8082/pentaho-style
ProxyPassReverse /pentaho-style http://127.0.0.1:8082/pentaho-style

Pentaho’s Tomcat’s conf/server.xml:

<Connector URIEncoding="UTF-8" port="8082" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
proxyName="”
proxyPort=”80″
/>

http://pentaho.mm.co.th

ทำให้ VM autostart ใน Xen และอื่นๆ

ทำให้ VM autostart ใน Xen

Instructions
Setting the XenServer to allow Auto-Start

Gather the UUIDs of the pools you wish to auto-start.

To get the list of the pools on your XenServer, run “xe pool-list”

Copy the UUID of the pool. If you have just one server, it will still have a pool UUID as noted in the following

User-added image

Then type the following command to set the pool or server to allow auto-start:
xe pool-param-set uuid=UUID other-config:auto_poweron=true
Note: Replacing UUID with the UUID of the XenServer or pool.

Setting the Virtual Machines to Auto-Start

Gather the UUIDs of the Virtual Machine you want to auto-start by running xe vm-list.
Note: This generates a list of Virtual Machines in your pool or server and their associated UUIDs.

Copy the UUID of the Virtual Machines you want to auto-start, and run the following command for each Virtual Machine to auto-start:
xe vm-param-set uuid=UUID other-config:auto_poweron=true
Note: Replace UUID with the UUID of the Virtual Machine to auto-start.

http://support.citrix.com/article/CTX133910

http://support.citrix.com/article/CTX133910

สั่งเปลี่ยน bootable HDD

  • เวลา attach disk ตัวใหม่มา ใน Storage ของ VM เปลี่ยนให้เป็น id = 0
  • สั่ง xe vm-param-set HVM-boot-policy=”BIOS order” uuid=xxxx เพื่อให้ Xen บูท HDD ตัวที่ 0

Xen Server 6.2 ถ้าอยากให้ VM บูตจาก CDROM drive ได้ หลังจากที่ติดตั้งไปแล้ว ให้เลือก “Start in Recovery Mode” จาก…

Xen Server 6.2 ถ้าอยากให้ VM บูตจาก CDROM drive ได้ หลังจากที่ติดตั้งไปแล้ว ให้เลือก “Start in Recovery Mode” จาก เมนู

วิธีติดตั้ง Ubuntu 14.04 กับ Xen Server 6.2.0

วิธีติดตั้ง Ubuntu 14.04 กับ Xen Server 6.2.0

เรื่องของเรื่องคือ xen server มันรุ่นเก่าเกินที่จะรองรับ 14.04 ก็เลยต้องทำแบบที่เขาว่านี้

1. Install Ubuntu when at the installing grub stage
choose “Back” and, from the menu, choose open a shell
now enter the following commands

chroot /target
apt-get install grub
grub-install /dev/xvda 
update-grub 

2. ลงเสร็จแล้ว บูตกลับมาต้องลง Guest Tool

 install the guest utilities. Again 14.04 is not recognized by the install script but this can be easily bypassed by entering two commands:

sudo mount /dev/xvdd /media/cdrom
sudo dpkg -i /media/cdrom/Linux/xe-guest-utilities_6.1.0-1031_amd64.deb
sudo umount /dev/xvdd

อ้างอิงจาก http://64bit.co.uk/installing-ubuntu-14-04-on-xenserver-6-2/

*********** ในกรณีที่เป็นการ apt-get upgrade จาก 12.04 มา 14.04 ทำข้างต้นแล้วต้องแก้ไฟล์ /usr/lib/python2.4/site-packages/grub/GrubConf.py at line 428 and change:

if arg.strip() == “${saved_entry}”:
to

if arg.strip() == “${saved_entry}” or arg.strip() == “${next_entry}”:

ด้วย ถึงจะ boot ได้
อ้างอิงจาก http://cepa.io/devlog/xenserver-6-2-upgrade-ubuntu-to-14-04-lts

http://64bit.co.uk/installing-ubuntu-14-04-on-xenserver-6-2

Step 1 – Creating the ISO Library Folder

Step 1 – Creating the ISO Library Folder

Connect to the XenServer using SSH and then issue the following command:
วิธีสร้าง Local ISO folder บน Xen Server

ใช้ตัวฟรี วิธีการมันก็เลยยากๆ นิดนึง

ดู http://www.riverlite.co.uk/blog/xenserver-creating-a-local-iso-library/

โดยสรุป คือ
“mkdir -p /var/opt/xen/ISO_Store”
“xe sr-create name-label=LocalISO type=iso device-config:location=/var/opt/xen/ISO_Store device-config:legacy_mode=true content-type=iso”

http://www.riverlite.co.uk/blog/xenserver-creating-a-local-iso-library

NFS Share via ZFS

NFS Share via ZFS

วันดีคืนดี upgrade เครื่องเก่าที่เคยเป็น NFS server (ใช้ ZFS) เป็น 14.04 แล้ว เครื่องอื่นก็ mount มาไม่ได้

พบว่าปกติในกรณีที่ใช้ ZFS share nfs มันต้องไม่ใส่อะไรใน /etc/exports แต่ต้องไปสั่งอะไรประมาณนี้แทน
zfs set sharenfs=rw=@10.0.0.0/24,no_subtree_check,async,no_root_squash data/map-images

และก็ต้องรัน nfs-kernel-server ด้วย ถึงแม้จะไม่มี /etc/exports

แต่พบว่ามันไม่รัน เพราะว่า บรรทัดนี้ ใน /etc/init.d/nfs-kernel-server
ต้อง comment ออกให้มันรัน

        #if [ -f /etc/exports ] && grep -q ‘^[[:space:]][^#]/’ $export_files
        if [ -f /etc/exports ]

แล้วก็ /etc/init.d/nfs-kernel-server start
แล้วก็ zfs share -a
แล้วสั่ง showmount -e ถึงจะเห็นสิ่งที่แชร์จาก ZFS