<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>wiennat</title><description>random rambling</description><link>https://www.onedd.net</link><item><title>The Wealth Ladder</title><link>https://www.onedd.net/posts/the-wealth-ladder</link><guid isPermaLink="true">https://www.onedd.net/posts/the-wealth-ladder</guid><pubDate>Thu, 30 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;แต่ส่วนตัวคิดว่าพอเค้าแบ่งแต่ละขั้นเป็นตัวเลขมันแล้วทำให้จำลำดับจำยาก เลยขอมาสรุป&lt;/p&gt;</content:encoded></item><item><title>เรื่องของตัวเลขใน It&apos;s over 9000!</title><link>https://www.onedd.net/posts/its-over-9000</link><guid isPermaLink="true">https://www.onedd.net/posts/its-over-9000</guid><pubDate>Fri, 11 Aug 2023 01:53:52 GMT</pubDate><content:encoded>&lt;p&gt;หลายๆ คนคงรู้ว่ามีม It’s over &lt;em&gt;xxxx&lt;/em&gt;! นั้นมีที่มาจากฉากหนึ่งในดราก้อนบอล เนื้อเรื่องคือช่วงที่เบจิต้ามาบุกโลกครั้งแรกๆ แล้วเครื่องวัดพลังบอกว่าพลังของโกคูนั้นมีพลังเพิ่มขึ้นมากกว่า  9000  จุดจนทำให้เบจิต้าตกใจ&lt;/p&gt;
&lt;div class=&quot;video-wrapper&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/SiMHTK15Pik&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;p&gt;ถ้าเข้าไปอ่านใน&lt;a href=&quot;https://en.wikipedia.org/wiki/It%27s_Over_9000!&quot;&gt;วิกิพีเดียของมีมนี้&lt;/a&gt; ก็จะรู้ว่า จริงๆ แล้วในบทจะต้องพูดว่า “It’s over 8000!” ตามแบบในภาคภาษาญี่ปุ่น 「8000以上だ…!」ซึ่งภาษาอื่นๆ รวมทั้งภาษาไทยก็แปลตามนี้ทั้งสิ้น&lt;/p&gt;
&lt;div class=&quot;video-wrapper&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/FNpI2xrVf-c&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;p&gt;แต่ว่าทีมที่แปลบทพากย์นั้นบอกว่าตัวเลข 9000 นั้นเข้ากับการขยับปากของเบจิต้ามากกว่าก็เลยเปลี่ยนบทไปเป็น “It’s over 9000!” แต่ก็มีคนให้ข้อสังเกตว่าทีมแปลนี้มักแปลผิดอยู่บ่อยๆ อยู่แล้ว ดังนั้นรอบนี้ก็น่าจะแปลผิดเช่นกัน&lt;/p&gt;
&lt;h1 id=&quot;ทำไมเบจิต้าถึงพูดว่า-its-over-8000-ตั้งแต่แรก&quot;&gt;ทำไมเบจิต้าถึงพูดว่า It’s over 8000 ตั้งแต่แรก&lt;/h1&gt;
&lt;p&gt;หลายๆ บทความที่หามาก็มักจะจบการอธิบายว่าเบจิต้าพูด “It’s over 9000!” เพราะมันเข้ากับภาพได้ดีกว่า “It’s over 8000” แค่นั้น แต่ที่น่าสนใจไม่แพ้กันก็คือ ในวิกิพีเดียอธิบายเพิ่มว่าทำไมเบจิต้าถึงระบุถึงตัวเลขนี้เข้าไปด้วย&lt;/p&gt;
&lt;p&gt;เหตุผลก็คือตัวเลข 8000 นั้นเป็นตัวเลขแบบ &lt;a href=&quot;https://en.wikipedia.org/w/index.php?title=Indefinite_hyperbolic_numeral&quot;&gt;indefinite hyperbolic&lt;/a&gt; ของญี่ปุ่น ตัวเลขแบบนี้ก็คือพวกตัวเลขหรือจำนวนที่มีความหมายว่ามีค่าเยอะมากๆ โดยไม่ได้หมายถึงจำนวนที่ระบุแต่อย่างใด&lt;/p&gt;
&lt;p&gt;ตัวอย่างของจำนวนประเภทนี้ในภาษาไทยก็เช่นคำว่า ร้อยแปดหรือร้อยแปดพันเก้า ก็ไม่ได้จำเป็นจะต้องหมายถึง 108 เป๊ะๆ แต่มีความหมายโดยนัยว่ามากมายอยู่
ในภาษาอังกฤษก็จะเป็นคำจำพวก &lt;em&gt;-illion&lt;/em&gt; เช่น zillion, gajillion เป็นตัน
ส่วนของอาหรับก็จะเป็นตัวเลข 1001 อย่างชื่อนิทาน &lt;a href=&quot;https://th.wikipedia.org/wiki/%E0%B8%AD%E0%B8%B2%E0%B8%AB%E0%B8%A3%E0%B8%B1%E0%B8%9A%E0%B8%A3%E0%B8%B2%E0%B8%95%E0%B8%A3%E0%B8%B5&quot;&gt;พันหนึ่งราตรี&lt;/a&gt; ก็น่าจะมีความหมายโดยนัยว่าเป็นเวลานานมากๆ นั่นแหละ&lt;/p&gt;
&lt;p&gt;ไม่รู้ว่าเป็นความตั้งใจของผู้ที่แต่งเรื่องนี้ตั้งแต่แรกรึเปล่าที่ให้เบจิต้าพูดว่า “It’s over 8000!” ก็จะได้เพิ่มความรู้สึกให้คนอ่านมังงะคิดว่าพลังของโกคูเยอะมากๆ เข้าไปอีกนั่นเอง&lt;/p&gt;</content:encoded></item><item><title>The Making of Dune II</title><link>https://www.onedd.net/posts/making-of-dune-ii</link><guid isPermaLink="true">https://www.onedd.net/posts/making-of-dune-ii</guid><pubDate>Thu, 05 Jan 2023 16:00:00 GMT</pubDate><content:encoded>&lt;p&gt;วันก่อนได้ไปอ่าน&lt;a href=&quot;https://readonlymemory.vg/the-making-of-dune-ii/&quot;&gt;บทความเกี่ยวกับการสร้างเกม Dune II&lt;/a&gt; ที่อยู่บนเว็บไซต์ &lt;a href=&quot;https://readonlymemory.vg/&quot;&gt;Read Only Memory&lt;/a&gt; มา แล้วมีอะไรหลายๆ อย่างน่าสนใจดี&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;เกม Dune II เป็นเกม RTS เกมแรกๆ ที่มีการสร้างมาเลย โดยอ้างอิงเนื้อเรื่องมาจากนิยายคลาสสิคที่ชื่อเดียวกัน โดยอ้างอิงเนื้อเรื่องมาจากภาพยนตร์ที่ออกฉายในปี 1984 ที่กำกับโดย David Lynch&lt;/li&gt;
&lt;li&gt;เนื้อเรื่องก็เข้าใจง่ายมาก มีตระกูลใหญ่สามตระกูลแย่งชิงความเป็นใหญ่กันในดาว Arrakis เราจะต้องเลือกเป็นผู้นำของหนึ่งในสามตระกูลนั้นแล้วก็เก็บแร่ สร้างฐาน กองทัพ เพื่อขยายดินแดนไปเรื่อยๆ จนครอบครองทั้งดาว&lt;/li&gt;
&lt;li&gt;ในช่วงเวลาไล่เลี่ยกันกับที่ Dune II วางตลาด ก็มีเกม Dune ภาคหนึ่งวางตลาดอยู่เช่นกัน แต่ทั้งสองก็ไม่ได้มีความเกี่ยวเนื่องกัน ไม่ได้เป็นภาคต่อของกันและกันแต่อย่างใด&lt;/li&gt;
&lt;li&gt;ถึงแม้ว่าจะเป็นเกมต้นแบบของเกมประเภท RTS แต่ Dune II ก็ได้แรงบันดาลใจและไอเดียมาจากเกมอื่นๆ มากมายอย่าง Herzog Zwei (Technosoft, 1986, Sega Mega Drive) และ Military Madness (1990, Hudsonsoft) รวมไปถึงการใช้เมาส์ที่ได้แรงบันดาลใจจาก Populous (1989, Bullfrog)&lt;/li&gt;
&lt;li&gt;คอมพิวเตอร์จะโกงเล็กน้อยตรงที่ได้เงินต่อรถขนแร่เยอะกว่าผู้เล่น แล้วก็รู้ว่ายูนิตของผู้เล่นอยู่ไหน&lt;/li&gt;
&lt;li&gt;คนออกแบบด่านจะออกแบบไว้ล่วงหน้าแล้วว่าอยากให้ฐานทัพของฝั่งคอมพิวเตอร์เป็นยังไง เสร็จแล้วก็ค่อยๆ ย้อนหลังไปว่าตอนเริ่มเกมในแต่ละด่านควรจะต้องเป็นยังไง&lt;/li&gt;
&lt;li&gt;Westwood ไม่อยากทำภาคต่อของ Dune II เพราะไม่อยากจ่ายค่าลิขสิทธิ เลยสร้าง Command &amp;#x26; Conquer ขึ้นมาแทน&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;The biggest single thing I should have added to it was the ability to drag-select units to allow a player to issue one order simultaneously to multiple units.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Joe Bostic ที่เป็นหัวหน้าโปรแกรมเมอร์บอกว่า ฟีเจอร์ที่อยากใส่ใน Dune II มากที่สุดคือการเลือกยูนิตจำนวนมากด้วยการ Drag ซึ่งแค่นั้นก็ทำให้ C&amp;#x26;C มีพัฒนาการที่ก้าวกระโดดไปจาก Dune II มากแล้ว&lt;/li&gt;
&lt;li&gt;โค้ดต่างๆ ที่ถูกใช้ใน Dune II ก็เอามาสร้าง C&amp;#x26;C, Red Alert, Tiberian Sun ไปตามลำดับ&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title>ทำไมคนอเมริกันเรียกฟุตบอลว่า Soccer?</title><link>https://www.onedd.net/posts/soccer-football</link><guid isPermaLink="true">https://www.onedd.net/posts/soccer-football</guid><pubDate>Thu, 22 Dec 2022 04:00:00 GMT</pubDate><content:encoded>&lt;p&gt;หลายเดือนก่อนบอลโลกจะเริ่มต้นขึ้น มีเพื่อนถามว่า ทำไมอเมริกันฟุตบอลถึงถูกเรียกว่าฟุตบอลทั้งๆ ที่มันเตะอยู่แค่แป๊บเดียว พอลองไปหาๆ ดูก็เลยทำให้รู้ว่าทำไมคนอังกฤษเรียกว่า Football แต่คนอเมริกันเรียกฟุตบอลว่า Soccer และรู้มั้ยว่าจริงๆ แล้วอังกฤษเองก็เรียกกีฬาประเภทนี้ว่า Soccer มาก่อนเช่นกัน&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Football and Soccer&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;  width=&quot;843&quot; height=&quot;843&quot; src=&quot;https://www.onedd.net/_astro/IMG_7578.DijVDSjt_61UeT.webp&quot; &gt;&lt;/p&gt;
&lt;p&gt;สรุปแบบเข้าใจง่ายๆ ก็คือ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;กีฬาที่ใช้เท้าเตะลูกบอลมีมานานมากแล้ว แล้วก็มีหลายประเภทด้วย ทั้งหมดรวมเรียกว่าฟุตบอล อย่างรักบี้ก็จัดเป็นหนึ่งในกีฬาฟุตบอลเช่นกัน&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;กีฬาที่ทุกวันนี้เรียกว่าฟุตบอลนั้น เริ่มมาจากการที่อังกฤษตั้งสมาคมฟุตบอลหรือ Football Association (FA ที่เรารู้จักกันดีนั่นแหละ) ที่คอยกำหนดกฏกติกาสำหรับการเล่นฟุตบอลขึ้นมา เจ้ากีฬาประเภทนี้ก็ได้รีบการเรียกชื่อว่าเป็น &lt;strong&gt;Association Football&lt;/strong&gt; เพื่อระบุให้ชัดจากกีฬาฟุตบอลประเภทอื่นๆ&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ทีนี้ก็มีคนที่คิดคำเรียกนักกีฬาขึ้นมาเพราะไม่งั้นชื่อมันจะยาว อย่างนักกีฬารักบี้ก็เรียกว่า Rugger และนักกีฬา Association Football ก็เรียกว่า Assoccer แล้วก็เลยโดนกร่อนเสียงให้เหลือแค่คำว่า Soccer ในเวลาต่อมา&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;เพียงแต่ว่าชื่อนี้มันก็เป็นแค่ชื่อเล่น ไม่ได้รับความนิยมอะไรมากนัก พอตอนหลังที่ Association Football ได้รับความนิยมมากเข้า พอพูดถึงฟุตบอล คนก็จะนึกถึง Association Football ก่อน&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ทีนี้ฝั่งอเมริกาที่มีการเล่นกีฬา gridiron football กันอยู่แล้วก็เลยชินกับการเรียกกีฬา gridiron football ว่าฟุตบอลอยู่แล้ว&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ดังนั้นนักกีฬา Association Football ในอเมริกาก็เลยเรียกกีฬานี้ว่า Soccer เพื่อไม่ให้สับสนแล้วก็ใช้กันต่อมาเรื่อยๆ&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;นอกจากอเมริกาแล้ว ประเทศอื่นๆ ที่เวลาพูดถึง Football แล้วเกิดความกำกวมว่าหมายถึงกีฬาฟุตบอลไหน ก็มักจะเลี่ยงไปใช้คำว่า Soccer แทนเวลาพูดถึง Association Football&lt;/p&gt;
&lt;p&gt;ref - &lt;a href=&quot;https://www.britannica.com/story/why-do-some-people-call-football-soccer&quot;&gt;https://www.britannica.com/story/why-do-some-people-call-football-soccer&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title>Pingora พร็อกซีตัวใหม่ของ Cloudflare ที่มาแทน nginx</title><link>https://www.onedd.net/posts/pingora</link><guid isPermaLink="true">https://www.onedd.net/posts/pingora</guid><pubDate>Wed, 21 Sep 2022 02:00:00 GMT</pubDate><content:encoded>&lt;p&gt;เมื่อหลายวันก่อน Cloudflare ประกาศว่าได้เปลี่ยนมาใช้พร็อกซีตัวใหม่ที่พัฒนาขึ้นใหม่ทั้งหมดแทนที่ nginx ที่ใช้งานอยู่ก่อนหน้า โดยเหตุผลหลักก็เพื่อแก้ปัญหาจากข้อจำกัดของ nginx เอง โดยในบล็อกมีการอธิบายถึงปัญหาดังกล่าวไว้ด้วย ถึงจะรู้ว่าเราคงไม่น่าจะมีโอกาสได้เจออะไรแบบนี้เท่าไหร่ แต่ก็ทำให้เราได้มีโอกาสเปิดหูเปิดตาว่าในระบบใหญ่ๆ ระดับนี้นั้นมีปัญหาอะไรเกิดขึ้นได้บ้าง&lt;/p&gt;
&lt;h1 id=&quot;nginx-ในระบบของ-cloudflare&quot;&gt;nginx ในระบบของ Cloudflare&lt;/h1&gt;
&lt;p&gt;ก่อนเราจะเริ่มไปพูดถึงว่า nginx มีปัญหาอย่างไร เราลองมาดูกันก่อนว่า Cloudflare ใช้งาน nginx อย่างไรบ้าง&lt;/p&gt;
&lt;p&gt;ปกติแล้ว Cloudflare จะทำหน้าที่เป็นตัวกลางที่อยู่ระหว่างไคลเอนต์ (เครื่องผู้ใช้, บราวเซอร์, แอปหรืออุปกรณ์ต่างๆ) ที่เรียกใช้งานเซิฟเวอร์ (API Server) โดย Cloudflare นั้นเลือกใช้ nginx เพื่อใช้เป็นพร็อกซี (Proxy) ที่จะส่งต่อการคุยกันระหว่างเครื่องผู้ใช้และเซิฟเวอร์ เมื่อบวกกับการที่ Cloudflare มีเครื่อง edge server ที่อยู่ใกล้กับไคลเอนต์มากๆ ทำให้การใช้งานโดยทั่วไปมีประสิทธิภาพสูงกว่าการเรียกเซิฟเวอร์แบบตรงๆ&lt;/p&gt;
&lt;p&gt;หนึ่งในวิธีที่ Cloudflare ใช้เพื่อช่วยเพิ่มประสิทธิภาพก็คือ Connection reuse ซึ่งแทนที่จะต้องสร้าง connection จากพร็อกซีไปยังเครื่องเซิฟเวอร์ทุกครั้งที่มี request เข้ามา ก็ให้ &lt;a href=&quot;https://www.nginx.com/blog/load-balancing-with-nginx-plus-part-2/&quot;&gt;nginx เก็บ connection เก่าๆ เอาไว้ใน connection pool&lt;/a&gt; หากมี request ใหม่ที่ต้องการใช้งานเซิฟเวอร์เดิมก็แค่เอา connection ใน pool ออกมาใช้ เท่านี้ก็ช่วยลดเวลาและหน่วยความจำที่ต้องใช้สร้าง connection ได้แล้ว&lt;/p&gt;
&lt;h1 id=&quot;ปัญหาของ-nginx-ใน-cloudflare&quot;&gt;ปัญหาของ nginx ใน Cloudflare&lt;/h1&gt;
&lt;p&gt;&lt;img  loading=&quot;lazy&quot; decoding=&quot;async&quot;  width=&quot;1636&quot; height=&quot;695&quot; src=&quot;https://www.onedd.net/_astro/connection-pool-cf.shM5bGC5_2iJfaC.webp&quot; &gt;&lt;/p&gt;
&lt;p&gt;ช่วงก่อนหน้านี้ Cloudflare นั้นก็มีการพูดถึงปัญหาในการใช้งาน nginx มาอยู่บ้างคือ&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;ข้อจำกัดของ architecture ที่ nginx ใช้นั้นมีผลต่อ performance
&lt;ul&gt;
&lt;li&gt;nginx ใช้ &lt;a href=&quot;https://www.nginx.com/blog/inside-nginx-how-we-designed-for-performance-scale/&quot;&gt;worker ในระดับ process&lt;/a&gt; และหนึ่ง request จะถูก handle ด้วย process เดียวแบบไม่มี work stealing แปลว่าถ้ามี request ที่ใช้งาน &lt;a href=&quot;https://blog.cloudflare.com/the-problem-with-event-loops/&quot;&gt;CPU หนักๆ&lt;/a&gt; หรือใช้ &lt;a href=&quot;https://blog.cloudflare.com/how-we-scaled-nginx-and-saved-the-world-54-years-every-day/&quot;&gt;blocked I/O&lt;/a&gt; ก็จะทำให้ request อื่นๆ ช้าตามไปด้วย&lt;/li&gt;
&lt;li&gt;nginx ยังมีปัญหาว่าจะ &lt;a href=&quot;https://blog.cloudflare.com/the-sad-state-of-linux-socket-balancing/&quot;&gt;schedule งาน worker&lt;/a&gt; แบบไม่เท่าเทียมกัน ทำให้ปัญหาข้างต้นมีผลกว่าเดิม&lt;/li&gt;
&lt;li&gt;ไม่มีการแชร์ connection pool ข้าม worker process -  ถ้า process ที่รับ request จะเป็นเครื่องเดียวกันแต่เป็นคนละ process ก็ต้องสร้าง connection ใหม่อยู่ดี&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;เพิ่มฟีเจอร์อื่นๆ ได้ยาก - ถึง nginx จะมีให้เขียนโมดูลเพิ่มเติมได้ แต่ถ้าไม่เข้ากับสิ่งที่ nginx ออกแบบไว้ก็อาจจะทำได้ยาก&lt;/li&gt;
&lt;li&gt;อีกสิ่งที่พูดถึงแต่ละไว้เป็นตัวเล็กๆ คือเดฟของ nginx ไม่ค่อยแอคทีฟในคอมมูนิตี้แต่ไปงุบงิบทำกันเอง&lt;/li&gt;
&lt;/ol&gt;
&lt;h1 id=&quot;แนวทางการแก้ปัญหาของ-cloudflare&quot;&gt;แนวทางการแก้ปัญหาของ Cloudflare&lt;/h1&gt;
&lt;p&gt;Cloudflare อธิบายว่ามีสามทางเลือกเพื่อแก้ปัญหานี้&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;ใช้งาน nginx ต่อไป - อาจจะต้อง fork project เพื่อปรับให้เข้ากับการใช้งานของ Cloudflare ซึ่งจากปัญหาข้างต้นคิดว่าเป็นงานใหญ่ถึงแม้ว่าบุคลากรจะมีความเชี่ยวชาญ แต่ก็ไม่ใช่เรื่องง่าย&lt;/li&gt;
&lt;li&gt;เปลี่ยนไปใช้พร็อกซีตัวอื่นอย่าง Envoy (&lt;a href=&quot;https://dropbox.tech/infrastructure/how-we-migrated-dropbox-from-nginx-to-envoy&quot;&gt;Dropbox เลือกแนวทางนี้&lt;/a&gt;)- กังวลว่าพอใช้ๆ ไปก็จะเกิดปัญหาอื่นที่แก้ไม่ได้ง่ายๆ แบบเดียวกับ nginx อยู่&lt;/li&gt;
&lt;li&gt;ทำใหม่หมด - ข้อนี้เหนื่อยสุด เรารู้อยู่แล้วว่า Cloudflare เลือกทางนี้&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;ที่น่าสนใจคือก่อน Cloudflare จะตัดสินใจแบบนี้ก็ได้ประเมินทางเลือกทุกๆ ไตรมาสมาซักระยะแล้ว (ในบทความใช้ว่า for a few years) ซึ่งผลก็คือใช้ nginx ต่อจนสุดท้ายก็เห็นว่าลงทุนทำใหม่เลยคุ้มค่ากว่าก็ค่อยตัดสินใจเริ่มทำของตัวเอง&lt;/p&gt;
&lt;h1 id=&quot;design-decision-ใน-pingora-project&quot;&gt;Design Decision ใน Pingora project&lt;/h1&gt;
&lt;p&gt;&lt;img  loading=&quot;lazy&quot; decoding=&quot;async&quot;  width=&quot;1636&quot; height=&quot;695&quot; src=&quot;https://www.onedd.net/_astro/new-connection-pool-cf.BUGXEEKp_194ibV.webp&quot; &gt;
Cloudflare เลือกใช้ Rust เพราะอยากได้ Performance แบบ C แต่มีความ memory-safe อยู่ อีกเหตุผลน่าจะเพราะว่ามีการใช้ Rust ในหลายๆ โปรดักส์อยู่แล้ว&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;เลือกจะอิมพลีเมนต์ไลบรารี HTTP ขึ้นมาใหม่เพื่อตอบสนองความใช้งานตัวเอง เพราะไลบรารีที่เป็น 3rd-party อาจจะเลือกทำตามมาตรฐานอย่างเคร่งครัดและปฏิเสธ request ที่ไม่ตรงตามมาตรฐาน แต่ลูกค้าของ Cloudflare นั้นอาจจะใช้ request ที่ไม่ตรงมาตรฐานที่ว่านั้นก็ได้ ทำให้อยู่ในสภาพที่ต้องเลือกระหว่าง “ความถูกต้องหรือความถูกใจ” ซึ่ง Cloudflare เลือกความถูกใจ&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ใช้ Multi-threading แทน Multi-processing เพื่อแชร์ข้อมูลกันระหว่าง worker โดยเฉพาะ connection pool และ อนุญาตให้มี work stealing เพื่อลดปัญหาที่งานกระจุกอยู่ที่ worker เดียวโดยที่ worker อื่นไม่มีงานทำ&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ทำเป็น extensible platform ที่ให้กลุ่มอื่นมาเพิ่มฟีเจอร์ได้ง่ายๆ&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;ผลหลังจากเอา-pingora-มาใช้&quot;&gt;ผลหลังจากเอา Pingora มาใช้&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;หลังจากใช้งานใน production มาระยะหนึ่ง Cloudflare ก็สรุปออกมาว่า Pingora นั้นเร็วกว่า nginx จริงๆ&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ที่เป็นแบบนี้ก็เพราะมีการแชร์ข้อมูลกันระหว่าง Worker มากขึ้น ทำให้จำนวน connection ที่สร้างต่อวินาทีนั้นเหลือแค่ 1/3 ของระบบเก่า
อัตราส่วนของการใช้ connection ซ้ำในระบบของลูกค้ารายหนึ่งเพิ่มขึ้นจาก 87
1% -&gt; 99
2% หรือถ้าคิดเป็นจำนวน connection ที่สร้างขึ้นใหม่ก็จะเหลือแค่ 1/160 ของของเดิม&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;แล้วพอเป็นของตัวเอง จะทำอะไรก็ง่ายไม่ต้องเสียเวลาคุยกันข้ามองค์กร ทำให้เข็นฟีเจอร์ใหม่ๆ ออกมาได้ง่ายขึ้น&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ประหยัดขึ้น เพราะใช้ซีพียูน้อยลง 70% ใช้หน่วยความจำน้อยลง 67% เมื่อเทียบกับระบบเดิมและโหลดเท่าเดิม เหตุผลเพราะนอกจาก Rust ทำงานได้มีประสิทธิภาพกว่า Lua แล้วยังไม่ต้องไปใช้การทำงานที่ต้องข้ามไปข้ามมาระหว่าง C &amp;#x3C;-&gt; Lua แบบใน nginx และอีกเหตุผลคือ พอมีการใช้ซ้ำ connection มากๆ ก็ประหยัดเวลาการทำ TLS handshaking ที่เปลืองเวลาซีพียู&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;สิ่งที่เป็น by product คือปลอดภัยขึ้นเพราะส่วนใหญ่ถ้ามีปัญหาก็มักจะไม่ได้เกิดจาก Pingora ทำให้ตรวจพอปัญหาในจุดอื่นๆ ที่ไม่รู้มาก่อนเพิ่มมากขึ้น&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;สรุป&quot;&gt;สรุป&lt;/h1&gt;
&lt;p&gt;Cloudflare เปลี่ยนมาทำพร็อกซีของตัวเองเพราะการใช้งาน nginx ต่อไปเริ่มไม่คุ้มค่าแล้ว เหตุผลหลักๆ ก็มาจากสถาปัตยกรรมของ nginx ที่เริ่มตอบโจทย์การใช้งานของ Cloudflare ได้ไม่ดี มีการใช้ reuse connection น้อยเพราะแต่ละ process แชร์ connection pool ไม่ได้
ซึ่งกว่า Cloudflare จะตัดสินใจทำของตัวเองก็ใช้เวลาพิจารณาอยู่หลายปีจนมั่นใจว่าทำแล้วคุ้มแน่ถึงจะเริ่มทำ&lt;/p&gt;
&lt;p&gt;แล้วพอทำของตัวเองก็ออกแบบให้เข้ากับการใช้งานของตัวเองเป็นหลัก เลือกทำไลบรารีของตัวเองที่รองรับ request ที่ไม่ได้มาตรฐาน
ผลก็คือได้พร็อกซีตัวใหม่ที่ตอบโจทย์ตรงกับความต้องการทางธุรกิจของตัวเองมากขึ้น ประหยัดต้นทุนของระบบไปได้เยอะ (เปลี่ยนเป็นต้นทุนทรัพยากรมนุษย์แทน)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;สรุปจาก: &lt;a href=&quot;https://blog.cloudflare.com/how-we-built-pingora-the-proxy-that-connects-cloudflare-to-the-internet/&quot;&gt;https://blog.cloudflare.com/how-we-built-pingora-the-proxy-that-connects-cloudflare-to-the-internet/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;ปล 1. ยังไม่เปิดซอร์สและคิดว่าน่าจะไม่เปิดด้วย&lt;/p&gt;
&lt;p&gt;ปล 2. นั่งอ่านไปก็พบว่าคนเขียนบทความนี่แซะ nginx แทบทุกย่อหน้า&lt;/p&gt;</content:encoded></item><item><title>Starbucks Cup Sizes</title><link>https://www.onedd.net/posts/starbucks-cup-sizes</link><guid isPermaLink="true">https://www.onedd.net/posts/starbucks-cup-sizes</guid><pubDate>Tue, 05 Jul 2022 15:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Starbucks มีชื่อเรียกขนาดแก้วของตัวเองที่ไม่ค่อยเหมือนชาวบ้าน ส่วนตัวปกติก็จะสั่งแก้ว Tall แต่ก็ไม่เคยจำได้ซักทีว่าจริงๆ แล้วเจ้าไซส์ Tall มันขนาดเป๊ะๆ เท่าไหร่&lt;/p&gt;
&lt;p&gt;หลักๆ แล้วเครื่องดื่มในร้านจะมีทั้งหมดสี่ขนาดคือ short, tall, grande, venti และมี trenta ที่ไม่เคยเห็นบนเมนู&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;short&lt;/strong&gt; (8 oz) → 236 ml&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;tall&lt;/strong&gt; (12 oz) → 354 ml&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;grande&lt;/strong&gt; (16 oz) → 473 ml&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;venti (hot)&lt;/strong&gt; (20 oz) → 591 ml&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;venti (cold)&lt;/strong&gt; (24 oz) → 709 ml&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;trenta&lt;/strong&gt; (31 oz) → 916 ml อันนี้ไม่เคยเห็นในญี่ปุ่น ไม่รู้ว่าสั่งได้มั้ย&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;เมนูไหนที่ไม่ได้เขียนว่ามี Short ก็อาจจะขอสั่งขนาดเป็น short ได้&lt;/p&gt;
&lt;p&gt;พอจำได้ก็ดูคลิปนี้ต่อ&lt;/p&gt;
&lt;div class=&quot;video-wrapper&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/SSk0B0dVq4g&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;p&gt;ref - &lt;a href=&quot;https://customerservice.starbucks.com/app/answers/detail/a_id/3113/~/what-are-the-sizes-of-starbucks-drinks&quot;&gt;https://customerservice.starbucks.com/app/answers/detail/a_id/3113/~/what-are-the-sizes-of-starbucks-drinks&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title>Surprisingly Synchronization</title><link>https://www.onedd.net/posts/surprisingly-synchronization</link><guid isPermaLink="true">https://www.onedd.net/posts/surprisingly-synchronization</guid><pubDate>Mon, 09 May 2022 15:00:00 GMT</pubDate><content:encoded>&lt;p&gt;เมื่อบ่ายวันก่อนลองกดวิดีโอของ &lt;a href=&quot;https://www.youtube.com/channel/UCHnyfMqiRRG1u-2MsSQLbXA&quot;&gt;Veritasium&lt;/a&gt; ที่ชื่อ “The Surprising Secret of Synchronization” มาดูเพราะมันขึ้นมาเป็นวิดีโอแนะนำหลังจากวิดีโอที่ดูอยู่จบ&lt;/p&gt;
&lt;div class=&quot;video-wrapper&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/t-_VPRCtiUg&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;p&gt;คร่าวๆ ก็คือเค้าอธิบายว่ามันมีเหตุการณ์ที่เกิดในลักษณะที่เป็นคาบบางอย่างที่ในช่วงแรกๆ อาจจะเกิดไม่พร้อมกัน แต่พอเวลาผ่านไปจะมีการปรับสมดุลให้มันเกิดขึ้นพร้อมๆ กันขึ้นมา
โดยเค้ายกตัวอย่างคือลูกตุ้มนาฬิกาสองลูกที่ตอนแรกอาจจะแกว่งไม่พร้อมกัน แต่ก็กลับมาพร้อมกันทีหลัง หรือว่าเมโทรนอมที่เริ่มไม่พร้อมกันแล้วก็ค่อยๆ ปรับจนพร้อมกัน หรือแม้กระทั่งหิ่งห้อยนั้นจะปรับให้ตัวเองเปล่งแสงพร้อมๆ กับตัวอื่น
ซึ่งบางครั้งมันดันมีผลกับการใช้ชีวิตด้วยเช่น &lt;a href=&quot;https://en.wikipedia.org/wiki/Millennium_Bridge,_London&quot;&gt;มิลเลนเนียมบริดจ์&lt;/a&gt; ที่แกว่งตัวตอนเวลาคนเดินข้ามเยอะๆ&lt;/p&gt;
&lt;div class=&quot;video-wrapper&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/y2FaOJxWqLE&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;p&gt;หรือ&lt;a href=&quot;https://en.wikipedia.org/wiki/Broughton_Suspension_Bridge&quot;&gt;สะพาน Broughton&lt;/a&gt; ที่ถล่มในช่วงที่ทหารเดินสวนสนามผ่าน&lt;/p&gt;
&lt;p&gt;ว่าง่ายๆ คือแรงกระทำตอนที่ทหารตบเท้าพร้อมกันมากๆ มันช่วยเสริมกันและกันจนมีผลต่อโครงสร้างของสะพานจนถล่มลงมานั่นเอง และนี่ก็เป็นเหตุผลที่สะพานหลายๆ แห่งจะต้องให้ทหารเดินไม่พร้อมกันช่วงข้ามสะพาน&lt;/p&gt;
&lt;p&gt;ที่น่าประหลาดใจก็คือ บ่ายวันนั้นก็มี&lt;a href=&quot;https://www.allkpop.com/article/2022/05/after-2-months-of-investigation-architecture-experts-conclude-that-tremors-at-the-sm-entertainment-building-were-caused-by-concentrated-rhythmic-group-movement?fbclid=IwAR1lJ766oReoDDdEdor81Au-wvi3vPyr85L3o3rAu80IEUVEmDCYItyDoU8&quot;&gt;ข่าวผลการสำรวจที่ตึกของ SM Entertainment สั่นพอดี&lt;/a&gt;
ผู้เชี่ยวชาญรายงานผลการสำรวจว่าการสั่นเกิดจากการซ้อมเต้นที่มีอย่างหนาแน่น (concentrated) ในชั้น 9 และ 10 ซึ่งก็ตรงกับชั้นที่ SM Entertainment เช่าไว้ทำเป็นห้องซ้อมพอดี&lt;/p&gt;
&lt;p&gt;ก็นับว่าเป็นเรื่องประหลาดดีเหมือนกันที่ได้ดูวิดีโออธิบายแล้วก็มาอ่านข่าวนี้ต่อ เลยเข้าใจมากขึ้นว่ามันน่าจะเกิดจากอะไร&lt;/p&gt;</content:encoded></item><item><title>โค้ดสำหรับทดสอบ Connection reset by peer</title><link>https://www.onedd.net/posts/test-connection-reset-by-peer</link><guid isPermaLink="true">https://www.onedd.net/posts/test-connection-reset-by-peer</guid><pubDate>Mon, 25 Apr 2022 02:30:00 GMT</pubDate><content:encoded>&lt;p&gt;หลายเดือนก่อนเจอปัญหาที่แก้ไม่ตกว่าทำไมอยู่ๆ ก็มี log ที่ API Server ที่เขียนด้วย Kotlin บอกว่าดึงข้อมูลไม่ได้ออกมาเต็มไปหมด
พอเช็คในรายละเอียดของ log พบว่าทุกอันชี้ไปที่สาเหตุเดียวกันหมดคือ &lt;code&gt;MonoCoroutine was canceled&lt;/code&gt; แต่ก็ไม่ได้มีรายละเอียดอะไรมากไปกว่านั้น&lt;/p&gt;
&lt;!--more--&gt;
&lt;p&gt;หลังจากหามาอยู่สองเดือนก็เดาว่ามันน่าจะเกิดจากการที่อีกฝั่งตัดการเชื่อมต่อไปโดยไม่บอก (Connection reset by peer) เลยไปตามหาโค้ดที่ใช้ทดสอบมาเป็น Java ประมาณนี้&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;java&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;package&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; net.onedd;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; java.io.BufferedReader;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; java.io.InputStreamReader;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; java.io.PrintWriter;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; java.net.Socket;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; class&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; Application&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    public&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; static&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; void&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; main&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;String&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;[] &lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;args&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;throws&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; Exception {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        System.out.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;println&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;starting&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        Socket s &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; new&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; Socket&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;localhost&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;5000&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        PrintWriter out &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; new&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; PrintWriter&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(s.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;getOutputStream&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(), &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;true&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        BufferedReader in &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; new&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; BufferedReader&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; InputStreamReader&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(s.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;getInputStream&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;()));&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        out.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;println&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;GET /echo?m=a HTTP/1.1&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        out.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;println&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;</content:encoded></item><item><title>หวยญี่ปุ่น ซื้อแล้วเงินไปไหน</title><link>https://www.onedd.net/posts/lotterry</link><guid isPermaLink="true">https://www.onedd.net/posts/lotterry</guid><pubDate>Wed, 30 Mar 2022 15:00:00 GMT</pubDate><content:encoded>&lt;p&gt;เมื่อสองสามปีก่อนดูรายการขอตามไปบ้าน (家ついていっていいですか？)　แล้วมีการพูดถึงว่ารายได้จากการซื้อลอตเตอรี่ในญี่ปุ่นนั้นจะถูกบริจาคเพื่อไปทำประโยชน์ให้สาธารณะ บวกกับว่าปีก่อนมีประเด็นเรื่องเงินบริจาคของกองสลาก ก็เลยสงสัยขึ้นมาว่า รายได้จากการขายหวยของญี่ปุ่นนั้นถูกจัดสรรปันส่วนยังไง&lt;/p&gt;
&lt;!--more--&gt;
&lt;p&gt;อ้างอิงจากเว็บไซต์ &lt;a href=&quot;https://www.takarakuji-official.jp/about/proceeds/top.html&quot;&gt;https://www.takarakuji-official.jp/about/proceeds/top.html&lt;/a&gt; ระบุรายละเอียดของรายได้และการใช้จ่ายเงินของสมาคมหวยของญี่ปุ่นไว้ดังนี้&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ยอดจัดจำหน่ายทั้งหมดของปีเรวะที่ 2 อยู่ที่ &lt;strong&gt;816 พันล้านเยน (หรือแปดแสนล้านเยน)&lt;/strong&gt; คิดเป็นเงินไทยก็ประมาณสองแสนล้านบาทนิดๆ&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;47.0% (383.9 พันล้านเยน ประมาณแสนล้านบาท)&lt;/strong&gt; - ใช้เพื่อเป็นเงินรางวัล&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;36.6% (298.2 พันล้านเยน ประมาณเกือบๆ เก้าหมื่นล้านบาท)&lt;/strong&gt; - มอบให้เมืองต่างๆ เพื่อใช้พัฒนาสาธารณประโยชน์ เช่นป้องกันและแก้ปัญหาผู้สูงอายุ ปัญหาเด็กเกิดน้อย ภัยธรรมชาติ ฯลฯ&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;15.5%&lt;/strong&gt; - ค่าสิ่งพิมพ์ ค่าใช้จ่ายเพื่อจัดจำหน่าย&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ส่วนของไทย เว็บไซต์ของกองสลากมีระบุไว้เหมือนกันในหน้านี้ &lt;a href=&quot;https://www.glo.or.th/about/performance/revenue&quot;&gt;https://www.glo.or.th/about/performance/revenue&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;以上&lt;/p&gt;</content:encoded></item><item><title>Imakita Sangyou</title><link>https://www.onedd.net/posts/imakita-sangyou</link><guid isPermaLink="true">https://www.onedd.net/posts/imakita-sangyou</guid><pubDate>Fri, 04 Mar 2022 09:26:00 GMT</pubDate><content:encoded>&lt;p&gt;คำว่า &lt;strong&gt;今北産業&lt;/strong&gt; แปลเป็นไทยแบบสวยๆ ได้ว่า &lt;strong&gt;อิมาคิตะอุตสาหการ&lt;/strong&gt; ฟังดูแล้วอาจจะฟังดูเหมือนชื่อกิจการหรือชื่อบริษัทอะไรซักอย่าง แต่ความจริงแล้วกลับไม่ได้มีความหมายแบบนั้นเลยแม้แต่นิดเดียว&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;คำว่า  &lt;strong&gt;今北産業&lt;/strong&gt; เป็นคำสแลงในภาษาญี่ปุ่น ว่ากันว่ามีต้นกำเนิดมาจากบอร์ด 2ch โดยคันจิสี่ตัวนี้ที่อ่านว่า อิมาคิตะซังเกียว มันไปพ้องกับคำว่า&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;「いま」หรือ「今」อ่านว่า อิมะ แปลว่าตอนนี้&lt;/li&gt;
&lt;li&gt;「きた」อ่านว่า คิตะ แปลว่า มาแล้ว และพ้องเสียงกับคำว่า 「北」ที่แปลว่าทิศเหนือ&lt;/li&gt;
&lt;li&gt;「３行」อ่านว่า ซังเกียว แปลว่า สามบรรทัด และพ้องกับคำว่า 「産業」ที่แปลว่าอุตสาหกรรม&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;พอเอาทั้งสามคำมาติดกัน มันก็จะกลายเป็นภาษาปากที่ถ้าเคยเรียนภาษาญี่ปุ่นมา
หลายคนก็น่าจะพอเข้าใจได้ว่ามันย่อมาจากเต็มๆ ว่า &lt;em&gt;「今来た（から）、（状況を）3行（で説明して）」&lt;/em&gt;
หรือแปลเป็นภาษาไทยได้ว่า &lt;em&gt;”เพิ่งมาอะ ขอสรุปสั้นๆ สามบรรทัด”&lt;/em&gt; นั่นเอง ให้ลองนึกถึงว่าเราล็อกอินเข้ามาในห้องแชทหรือในเกม แล้วเพื่อนกำลังคุยอะไรกันอยู่ซักอย่างแต่เราไม่เข้าใจเลย ก็เลยบอกว่า &lt;em&gt;“อิมาคิตะซังเกียว”&lt;/em&gt; เพื่อให้เพื่อนๆ อธิบายให้ฟัง&lt;/p&gt;
&lt;h2 id=&quot;อ๋อ-มันคือ-tldr-เวอร์ชันญี่ปุ่นสินะ&quot;&gt;อ๋อ มันคือ TL;DR เวอร์ชันญี่ปุ่นสินะ&lt;/h2&gt;
&lt;p&gt;พอถึงตรงนี้คงมีคนคิดว่า &lt;strong&gt;อิมาคิตะซังเกียว&lt;/strong&gt; คือ &lt;strong&gt;TL;DR&lt;/strong&gt; หรือ &lt;strong&gt;Too long. Don’t read&lt;/strong&gt; เวอร์ชันภาษาญี่ปุ่นสินะ&lt;/p&gt;
&lt;p&gt;แต่จริงๆ  มันมีความต่างกันอยู่นิดหน่อยตรงที่ว่า &lt;strong&gt;อิมาคิตะซังเกียว&lt;/strong&gt; นั้นมักจะถูกใช้ในบริบทที่ผู้พูดตามสถานการณ์ไม่ทันเพราะเพิ่งเข้าสู่บทสนทนาในช่วงที่สถานการณ์ดำเนินไปมากแล้ว ก็เลยขอให้คนอื่นอธิบายให้ ยกตัวอย่างเช่นเพื่อนของเรากำลังเล่น MMORPG กันอยู่แล้วกำลังวางแผนจะทำอะไรซักอย่าง แต่เราที่เพิ่งล็อกอินเข้ามาในเกมก็จะไม่รู้ว่ากำลังคุยเรื่องอะไรอยู่ ก็เลยขอให้คนอื่นอธิบายให้ฟัง (คือต่อให้ตามอ่านได้ก็อาจจะนานหรือก็ตามไม่ทันอยู่ดี)
แต่เราจะไม่ค่อยเห็นคนใช้ในกรณีที่ว่า &lt;em&gt;ผู้พูดคิดว่าเนื้อหายาวเกินไปแล้วเลยอยากจะขอสรุปให้คนอื่นสั้นๆ&lt;/em&gt; แบบเดียวกับที่เราเห็นในการใช้งาน TL;DR&lt;/p&gt;
&lt;p&gt;และเนื่องจากคำว่า &lt;strong&gt;อิมาคิตะซังเกียว&lt;/strong&gt; เป็นคำสแลงที่ใช้มากในหมู่วัยรุ่น เราจึงไม่ค่อยเห็นในการใช้งานในชีวิตประจำวันเท่าไหร่&lt;/p&gt;
&lt;p&gt;ส่วน &lt;strong&gt;TL;DR&lt;/strong&gt; นั้นอาจจะใช้ในกรณีที่ผู้พูดรู้สึกว่า “ที่กำลังคุยกันอยู่ยาวมาก ไม่อ่านละ ไปสรุปมาให้หน่อย” หรืออาจจะใช้ในบริบทที่ผู้พูดรู้สึกว่าเนื้อหามันยาวมาก เลยต้องการจะสื่อว่า “สำหรับคนที่ขี้เกียจอ่าน เดี๋ยวจะสรุปให้ฟัง” ก็ได้&lt;/p&gt;
&lt;p&gt;นอกจากนี้การใช้งาน TL;DR ในบริบทที่ผู้พูดอยากให้คนอื่นสรุปเนื้อหาให้นี่ฟังแล้วเหมือนเป็นประโยคคำสั่ง
ทำให้ผู้ฟังรู้สึกว่าผู้พูดเป็นคนก้าวร้าวได้ ดังนั้นควรต้องระวังการใช้งานให้ดี&lt;/p&gt;
&lt;h2 id=&quot;ตัวอย่างการใช้งาน&quot;&gt;ตัวอย่างการใช้งาน&lt;/h2&gt;
&lt;p&gt;เมื่อเห็นคนพูดถึงแม่แตงโมกันเต็มฟีด แต่ไม่เข้าใจว่าพูดถึงเรื่องอะไรก็เลยบอกว่า　“เรื่องแม่แตงโม อิมาคิตะซังเกียว” หรือ “ขอสรุปสั้นๆ สามบรรทัดเรื่องแม่แตงโม”&lt;/p&gt;
&lt;p&gt;以上&lt;/p&gt;</content:encoded></item><item><title>เซต ssh ให้ใช้ Github ได้หลายแอคเคาท์</title><link>https://www.onedd.net/posts/multiple-github-account</link><guid isPermaLink="true">https://www.onedd.net/posts/multiple-github-account</guid><pubDate>Sun, 31 Oct 2021 02:40:21 GMT</pubDate><content:encoded>&lt;p&gt;ปกติแล้ว Github แนะนำให้ใช้แอคเคาท์เดียวสำหรับทั้งเรื่องงานและเรื่องส่วนตัว แต่สำหรับบางกรณีที่ต้องใช้มากกว่า 1 แอคเคาท์ เช่นมีการใช้ dotfiles ร่วมกัน หรือใช้ Github สำหรับจดบันทึกส่วนตัว (เช่นใช้ Obsidian) ถ้าเป็นเมื่อก่อนอาจจะยอมใช้ HTTP Protocol แล้วใส่พาสเวิร์ดเอาแทนได้ แต่พอ Github เลิกรองรับการใช้งานพาสเวิร์ดก็เลยต้องมาออกแรงมากขึ้นหน่อยด้วยการเซต SSH config เพิ่ม&lt;/p&gt;
&lt;!--more--&gt;
&lt;p&gt;สมมติว่าเรามีแอคเคาท์ชื่อ &lt;code&gt;my-personal-account&lt;/code&gt; กับ &lt;code&gt;my-work-account&lt;/code&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;ให้สร้าง ssh public/private key pairs ของทั้งสอง เซฟในชื่อที่ต่างกัน เช่น &lt;code&gt;my-personal-account กับ my-personal-account.pub&lt;/code&gt; และ &lt;code&gt;my-work-account กับ my-work-account.pub&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;เลือกว่าจะให้แอคเคาท์ไหนจะให้เป็นแอคเคาท์หลัก กรณีนี้สมมติว่าให้ &lt;code&gt;my-personal-account&lt;/code&gt; เป็นแอคเคาท์หลัก&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ในไฟล์​ &lt;code&gt;~/.ssh/config&lt;/code&gt; ให้กำหนดค่าแบบนี้&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Host github.com&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    HostName github.com&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    User git&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    AddKeysToAgent yes&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    UseKeychain yes&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    IdentityFile ~/.ssh/my-personal-account&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Host github.com-work&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    HostName github.com&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    User git&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    AddKeysToAgent yes&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    UseKeychain yes&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    IdentityFile ~/.ssh/my-work-account&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;สำหรับแอคเคาท์หลักก็ใช้คำสั่งตามปกติ แต่เวลาเราจะใช้งาน repo ที่เป็นของแอคเคาท์ทำงานก็ใช้วิธี git clone ด้วยการเติม &lt;code&gt;-work&lt;/code&gt; เข้าไปท้าย &lt;code&gt;github.com&lt;/code&gt; แบบคำสั่งข้างล่างนี้แทน โดยที่ตรง &lt;code&gt;(your repo)&lt;/code&gt; นี่ก็ใส่เป็นชื่อ repo ที่ต้องการ&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;git clone git@github.com-work:(your repo)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;เช่น&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;git clone git@github.com-work:my-work-accont/myrepo.git&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;คำสั่งอื่นๆ ก็ใช้งานตามปกติ&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;ข้อควรระวัง&quot;&gt;ข้อควรระวัง&lt;/h2&gt;
&lt;p&gt;ถึงแม้ว่าเราจะโคลนตัว repo มาได้แต่ว่าเวลาเรา commit code มันอาจจะเป็นชื่อและอีเมลที่เราใช้กับแอคเคาท์อื่นก็ได้ ดังนั้นคนที่กลัวว่าชื่อ/อีเมลจะปนกันก็ควรจะ &lt;strong&gt;ต้องตรวจสอบ .git/config ทุกครั้งหลังจาก clone ว่าตั้งค่า git.user และ git.email ถูกต้อง&lt;/strong&gt;&lt;/p&gt;</content:encoded></item><item><title>2021 Facebook Outage</title><link>https://www.onedd.net/posts/2021-facebook-outage</link><guid isPermaLink="true">https://www.onedd.net/posts/2021-facebook-outage</guid><pubDate>Mon, 04 Oct 2021 23:40:30 GMT</pubDate><content:encoded>&lt;p&gt;เมื่อวาน facebook.com รวมทั้งบริการอื่นๆ ของเฟซบุ๊กทั้ง Whatsapp, Instagram ล่มทั้งหมดเพราะมีข้อผิดพลาดเกิดขึ้นที่ระดับ BGP ถึงโลกจะสงบสุขชั่วคราว แต่เชื่อว่าวิศวกรของเฟซบุ๊กน่าจะวุ่นวายกันมากเป็นพิเศษ
ระหว่างที่รอทางเฟซบุ๊กออก Post-mortem มา เราก็สามารถอ่าน&lt;a href=&quot;https://blog.cloudflare.com/october-2021-facebook-outage/&quot;&gt;สรุปที่ Cloudflare สรุปเหตุการณ์จากมุมมองคนนอกเอาไว้&lt;/a&gt; แทน&lt;/p&gt;
&lt;!--more--&gt;
&lt;p&gt;ในรายงานของ Cloudflare เล่ารายละเอียดว่าเกิดอะไรขึ้นที่ฝั่ง Cloudflare ในช่วงเวลาที่เกิดปัญหาขึ้น โดยก็ไม่ได้ลงลึกหรือเดาว่าเกิดอะไรขึ้นที่ฝั่งเฟซบุ๊ก
กล่าวโดยสรุปก็คือมีการแก้ไขข้อมูลที่ BGP แล้วก็ทำให้ DNS ของฝั่งเฟซบุ๊กหายไปจากอินเทอร์เน็ต พอ DNS หายไปทุกอย่างที่ผูกกับ DNS ตัวนี้ก็หายไปด้วยรวมทั้ง &lt;a href=&quot;https://status.fb.com/&quot;&gt;https://status.fb.com/&lt;/a&gt; ที่&lt;a href=&quot;https://twitter.com/Nick_Craver/status/1445160195991166980?s=20&quot;&gt;แม้จะอยู่บน Cloudfront&lt;/a&gt; ก็ได้รับผลกระทบไปด้วย&lt;/p&gt;
&lt;p&gt;ส่วนที่คาดไม่ถึงของเหตุการณ์นี้ที่อยู่ในสรุปก็คือการล่มครั้งนี้ยังส่งแรงกระเพื่อมไปยังบริการ DNS ต่างๆ ด้วย คือพออุปกรณ์และแอปต่างๆ ไม่สามารถ resolve ชื่อโดเมนของเฟซบุ๊กไม่ได้ ผู้ใช้ก็อาจจะกดให้ refresh เพื่อลองใหม่ บวกกับตัวแอปเองก็อาจจะลอง resolve ชื่อโดเมนไปเรื่อยๆ ด้วยทำให้เกิดทราฟฟิกเพิ่มขึ้นมหาศาล จนทำให้บริการ DNS อย่าง 1.1.1.1 ของ Cloudflare หรือ &lt;a href=&quot;https://twitter.com/awlnx/status/1445073290708533258&quot;&gt;8.8.8.8 ของกูเกิลต้องรับภาระหนัก&lt;/a&gt;มากขึ้น&lt;/p&gt;
&lt;p&gt;ถ้าข้ามไปฝั่ง &lt;a href=&quot;https://krebsonsecurity.com/2021/10/what-happened-to-facebook-instagram-whatsapp/&quot;&gt;Krebs on Security&lt;/a&gt; ก็จะมีอธิบายสรุปพร้อมกับรายงานสดความคืบหน้าของเหตุการณ์แทน&lt;/p&gt;</content:encoded></item><item><title>รายได้เฉลี่ยของคนญี่ปุ่น</title><link>https://www.onedd.net/posts/japanese-average-income</link><guid isPermaLink="true">https://www.onedd.net/posts/japanese-average-income</guid><pubDate>Sat, 06 Feb 2021 00:05:05 GMT</pubDate><content:encoded>&lt;p&gt;วันก่อนเห็นข่าวว่ารัฐบาลญี่ปุ่นจะมีการแก้กฏหมายเพื่อ&lt;a href=&quot;https://www3.nhk.or.jp/news/html/20210202/k10012845011000.html&quot;&gt;ยกเลิกเงินสนับสนุนการเลี้ยงดูเด็กสำหรับครอบครัวผู้มีรายได้สูง&lt;/a&gt; คือมีรายได้ต่อปีเกิน 12 ล้านเยน ก็เลยสงสัยเกี่ยวกับรายได้เฉลี่ยของคนญี่ปุ่นขึ้นมา&lt;/p&gt;
&lt;!--more--&gt;
&lt;p&gt;ด้วยความที่เคยอ่านผ่านๆ ตามาว่ารายได้ต่อปีเฉลี่ยของคนญี่ปุ่นจะอยู่ที่ประมาณ 6 ล้านเยน ดังนั้นพอบอกว่ารายได้สูงคือ 12 ล้านเยนก็รู้สึกว่าเยอะเหมือนกันนะ
แต่พอนึกถึงว่าเป็นครอบครัวที่ทั้งสามีภรรยาทำงานทั้งคู่ ตัวเลข 12 ล้านเยนมันก็กลายเป็นธรรมดาขึ้นมาทันที พอแบบนี้ก็เลยรู้สึกว่าแล้วรายได้เฉลี่ยต่อครอบครัว จริงๆ แล้วมันเท่าไหร่กันแน่&lt;/p&gt;
&lt;p&gt;&lt;img  loading=&quot;lazy&quot; decoding=&quot;async&quot;  width=&quot;1214&quot; height=&quot;848&quot; src=&quot;https://www.onedd.net/_astro/fig1.DVWTEcB0_1A4H5U.webp&quot; &gt;
จาก&lt;a href=&quot;https://www.mhlw.go.jp/toukei/saikin/hw/k-tyosa/k-tyosa17/dl/03.pdf&quot;&gt;ผลสำรวจรายได้ครอบครัวที่มีขนาด 2 คนขึ้นไปของกระทรวงสาธารณสุข แรงงานและสวัสดิการญี่ปุ่นในปี 2019&lt;/a&gt;จะเห็นว่ารายได้เฉลี่ยต่อครอบครัวของคนญี่ปุ่นจะอยู่ที่ประมาณ 5.52 ล้านเยน โดยที่มีค่ามัธยฐานอยู่ที่ 4.37 ล้านเยน ส่วนจำนวนครอบครัวที่มีรายได้เกิน 12 ล้านเยนมีอยู่ประมาณ 7.2% เท่านั้นเอง&lt;/p&gt;
&lt;p&gt;พอลองไปดูผลสำรวจ&lt;a href=&quot;https://doda.jp/guide/heikin/&quot;&gt;เงินเดือนเฉลี่ยสำหรับพนักงานประจำของญี่ปุ่นที่จัดทำโดยเว็บไซต์หางาน doda&lt;/a&gt; สำหรับปี 2020 จะพบว่ารายได้เฉลี่ยอยู่ที่ประมาณ 4.1 ล้านเยน โดยที่ถ้าดูเฉพาะช่วงอายุ 40 - 60 ซึ่งเป็นช่วงอายุที่น่าจะมีครอบครัวแล้วก็จะมีรายได้เฉลี่ยอยู่ที่ 5.1 - 6.1 ล้านเยน&lt;/p&gt;
&lt;p&gt;ทีนี้พอมาดูผลสำรวจของ&lt;a href=&quot;http://www.stat.go.jp/english/data/kakei/156index.html&quot;&gt;สำนักงานสถิติของญี่ปุ่น&lt;/a&gt; ดูจะได้ตัวเลขของปี 2019 ว่ามีรายได้เฉลี่ยที่ประมาณ 5.1 ล้านเยนแต่ตัวเลขที่น่าสนใจคือถึงแม้ขนาดครอบครัวเฉลี่ยอยู่ที่ 2.3 คน แต่มีจำนวนผู้ที่มีรายได้อยู่ที่ 1.03 คนเท่านั้น ซึ่งก็คือส่วนใหญ่แล้วเป็นครอบครัวที่มีรายได้หลักทางเดียว&lt;/p&gt;
&lt;p&gt;ส่วนที่เคยเห็นผ่านๆ ตอนดูหนังสือแนะนำบริษัทที่รับเด็กจบใหม่เมื่อหลายปีก่อน ก็จำได้ว่าเงินเดือนของเด็กป.โทจบใหม่ส่วนใหญ่อยู่ที่ประมาณ 220000 - 240000 เยน (คิดเป็นต่อปีคือประมาณ 2.6 - 2.8 ล้าน)&lt;/p&gt;
&lt;p&gt;ก็นับว่าเงินเดือนสตาร์ทของสาขาไอทีที่เริ่มต้นที่ราวๆ 3 ล้านเยนกลางๆ ไปจนถึง 6 ล้านเยน นี่ก็นับว่าเยอะมากจริงๆ ยิ่งพอมาเทียบกับรายชื่อบริษัทใน &lt;a href=&quot;https://gaijininjapan.blog/10-jp-tech-companies&quot;&gt;10 บริษัทไอทีในญี่ปุ่นที่ใช้ภาษาอังกฤษ ที่น่าทำงานด้วย&lt;/a&gt; แล้วยิ่งรู้สึกเห็นถึงความแตกต่าง&lt;/p&gt;
&lt;p&gt;สรุปก็คือรายได้เกิน 12 ล้านเยนต่อปีถึงแม้ว่าจะดูไม่เยอะมาก เพราะถ้าทำงานทั้งสามีภรรยามันก็น่าจะถึงได้ไม่ยาก
แต่พอดูที่การกระจายตัวของรายได้แล้วก็เป็นส่วนน้อยจริงๆ ที่มีรายได้เกิน 12 ล้านเยนเพราะส่วนใหญ่เป็นครอบครัวที่มีรายได้หลักแค่ทางเดียว&lt;/p&gt;
&lt;p&gt;PS. รายได้ 12 ล้านเยน หักภาษีต่างๆ แล้วจะเหลือเทคโฮมประมาณ 8.6 ล้านเยน&lt;/p&gt;</content:encoded></item><item><title>CSS Zen Garden</title><link>https://www.onedd.net/posts/css-zen-garden</link><guid isPermaLink="true">https://www.onedd.net/posts/css-zen-garden</guid><pubDate>Sun, 22 Mar 2020 15:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;http://csszengarden.com/&quot;&gt;CSS Zen Garden&lt;/a&gt; เป็นโปรเจคเก่ามากเปิดตัวมาตั้งแต่สมัยปี 2003
ตัวเว็บไซต์เองจะมี HTML อยู่หนึ่งหน้า แต่ผู้ใช้จะเลือกเปลี่ยน CSS เพื่อเปลี่ยนดีไซน์ของหน้านั้นได้โดยยังใช้ HTML เดิม ซึ่ง CSS พวกนี้ก็คือมาจากเว็บดีไซเนอร์ส่งเข้ามา&lt;/p&gt;
&lt;p&gt;ในช่วงนั้น CSS ยังเป็นของที่ใหม่อยู่ ส่วนใหญ่ก็ใช้แค่ตกแต่งสีของลิงค์ แต่ระดับเลย์เอาท์นั้นมักใช้เป็น Table-based layout กันเป็นหลัก
ถึงแม้ว่าแนวทางนี้จะเข้าใจได้ง่ายและบราวเซอร์ต่างๆ ก็รองรับเหมือนกันหมดอยู่แล้ว แต่ก็มีข้อเสียคือถ้าจะเปลี่ยนดีไซน์ของเว็บแม้เล็กน้อยก็อาจจะต้องทำใหม่ทั้งหมดเพราะโครงสร้างของตารางมันไม่ยืดหยุ่นพอ
CSS Zen Garden ก็เลยเหมือนเป็นทั้งแหล่งโชว์ของว่า CSS ทำอะไรและเข้ามาช่วยได้ขนาดไหน และก็เป็นที่โชว์ของของเหล่าเว็บดีไซเนอร์ด้วยว่ามีฝีมือขนาดไหน
เพราะอย่างที่รู้กันว่าบราวเซอร์ต่างๆ ก็รองรับและแสดงผล CSS ได้ต่างกัน ดังนั้นเว็บดีไซเนอร์เหล่านี้ก็เลยต้องงัดเทคนิคมากมายเพื่อให้มาสร้างเป็น CSS ที่แสดงผลได้ถูกต้องในทุกบราวเซอร์&lt;/p&gt;
&lt;!--more--&gt;
&lt;p&gt;วันก่อนใน Hacker news มี คนเอาลิงค์นี้ไปโพสต์ แล้วในช่อง discussion ก็เกิดประเด็นถกเถียงกันมากว่า HTML กับ CSS เนี่ยมันควรจะแยกกันมั้ย&lt;/p&gt;
&lt;p&gt;คือถ้ามาจากสาย CSS Zen Garden มาก่อนก็คงจะให้ความรู้สึกว่า HTML มันแสดงโครงสร้างของเอกสาร เพราะฉะนั้นมันก็ไม่ควรจะต้องมายุ่งเกี่ยวเลยกับการแสดงผลหรือเลย์เอาท์ของหน้าสิ ดังนั้นการเอาคลาสของ CSS สำหรับระบุหน้าตาไปใส่ใน HTML นี่มันก็เหมือนกับการเอา presentation กับ data มาปนกันมั่วไปหมด ใครนึกไม่ออกลองนึกถึงพวก css framework อย่าง Bootstrap ที่จะมีคลาสสำหรับกำหนดกริด กำหนดเลย์เอาท์ สี ช่องไฟอยู่เยอะแยะมากมาย&lt;/p&gt;
&lt;p&gt;อีกฝั่งก็ให้เหตุผลว่า html มันก็ถูกใช้สำหรับ presentation เสมอมา มันก็แยกกันไม่ออกแล้วแหละ บางคนก็บอกว่าถ้าทำแบบ pure css เลยจะทำให้ต่างคนต่างทำงานซ้ำซ้อนกันเพราะแต่ละคนก็จะไม่อยากไปแตะโค้ดของส่วนอื่นๆ ทีนี้จะยิ่งลำบากเข้าไปใหญ่ ซึ่งวิธีแก้มันก็คือจะต้องมากำหนด framework ตรงกลางซึ่งก็จะคือวิธีใช้คลาสระบุแบบใน css framework นี่แหละ&lt;/p&gt;
&lt;p&gt;จริงๆ ก็คงเป็นเรื่องความชอบกับความเหมาะสมของแต่ละงานมากกว่า แต่เนื่องจากเริ่มรู้จัก CSS ก็จาก CSS Zen Garden ก็เลยชอบแนวทางของฝั่งนี้มากกว่า เพราะโค้ดของ html มันดูเป็นระเบียบเรียบร้อยสะอาดตาเข้าใจง่ายมากกว่าด้วย&lt;/p&gt;
&lt;p&gt;แต่ทั้งหมดทั้งมวลถ้าให้สรุปเอง ก็คงจะได้ว่า HTML กับ CSS มันใช้ยากนั่นแหละ&lt;/p&gt;
&lt;p&gt;Hacker News discussion: &lt;a href=&quot;https://news.ycombinator.com/item?id=22627018&quot;&gt;https://news.ycombinator.com/item?id=22627018&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title>Meiji-jingumae Station</title><link>https://www.onedd.net/posts/meiji-jingumae</link><guid isPermaLink="true">https://www.onedd.net/posts/meiji-jingumae</guid><pubDate>Sun, 06 Oct 2019 14:23:02 GMT</pubDate><content:encoded>&lt;p&gt;เร็วๆ นี้มีข่าวเกี่ยวกับการเปลี่ยนชื่อสถานีรถไฟที่ในแถบคันไซ [1] โดยหลายๆ สถานีใส่ชื่อที่คนทั่วไปรู้จักเข้าไปในช่ือสถานีเพื่อนักท่องเที่ยวกับคนที่มาจากต่างถิ่นใช้งานได้สะดวกมากขึ้น
ก็เลยพาลสงสัยว่า แล้วสถานีอย่างเมจิจิงกูมาเอะ [Meiji-jingumae (Harajuku)] ล่ะ ทำไมต้องมีการใส่วงเล็บว่า Harajuku ทำไมไม่ใช้ชื่อสถานีเดียวกันไปเลย แล้วเริ่มใช้ชื่อนี้มาตั้งแต่เมื่อไหร่&lt;/p&gt;
&lt;p&gt;หลังจากหาด้วยกูเกิลดูก็ได้ความว่า ชื่อเดิมของสถานีตอนเปิดบริการในปี 1962 ใช้ชื่อแค่ว่า เมจิจิงกูมาเอะ โดยคาดว่าน่าจะต้องการไม่ให้ชื่อซ้ำกับสถานีฮาราจุกุของ JR ที่อยู่ใกล้ๆ กัน
แต่เนื่องจากทั้งสองสถานีนั้นอยู่ในระยะที่เดินกันถึงและนับเป็นสถานีที่ใช้สำหรับเปลี่ยนสายระหว่างสายยามาโนเตะกับสายชิโยะดะมาตลอด
ทำให้ในปี 2010 มีการตัดสินใจเพิ่มคำว่า [&amp;#x3C;Harajuku&gt;] ลงไปในชื่อสถานีเพื่อเป็นการย้ำว่าสถานีนี้อยู่ในย่านฮาราจุกุมากขึ้น&lt;/p&gt;
&lt;p&gt;ในปัจจุบันสถานีเมจิจิงกูมาเอะเป็นสถานีที่มีจำนวนผู้โดยสายขึ้นลงเป็นอันดับที่ 36 จากทั้งหมด 130 สถานีของโตเกียวเมโทร
โดยในปี 2018 มีผู้ใช้งานเฉลี่ยต่อวันที่ 109528 คน
ส่วนในปี 2010 ที่มีการเปลี่ยนชื่อสถานีนั้นมีผู้โดยสารขึ้นลงเฉลี่ย 74693 คนต่อวัน ลดลงจากปี 2009 ที่มีผู้โดยสารขึ้นลงเฉลี่ย 75434 คนต่อวันหรือลดลงประมาณ 1%&lt;/p&gt;</content:encoded></item><item><title>Building Control Plane</title><link>https://www.onedd.net/posts/building-control-plane</link><guid isPermaLink="true">https://www.onedd.net/posts/building-control-plane</guid><pubDate>Wed, 28 Aug 2019 00:05:05 GMT</pubDate><content:encoded/></item><item><title>Longdo Dict Chrome Bookmarklet</title><link>https://www.onedd.net/posts/longdo-dict-chrome-bookmarklet</link><guid isPermaLink="true">https://www.onedd.net/posts/longdo-dict-chrome-bookmarklet</guid><pubDate>Mon, 22 Jul 2019 15:00:00 GMT</pubDate><content:encoded>&lt;p&gt;อันนี้เป็น Bookmarklet ใช้สำหรับเวลาจะเปิดหาความหมายคำจาก Longdo Dict&lt;/p&gt;
&lt;p&gt;ด้วยความที่ขี้เกียจเขียนให้เป็น Extension ของ Chrome ก็เลยทำมาไว้เป็น Bookmarklet ของจาวาสคริปต์แทน
เวลาใช้ก็ Highlight ประโยคแล้วก็กดที่ปุ่ม Bookmarklet หรือว่ากดที่ Bookmarklet แล้วก็พิมพ์คำที่ต้องการก็จะเปิดหน้าต่างใหม่ของ Longdo Dict ให้เอง&lt;/p&gt;
&lt;!--more--&gt;
&lt;p&gt;ตอนทำออกมาใหม่ๆ จำได้ว่าทาง Longdo Dict ก็เคยเอาไปแชร์ไว้รอบนึงแล้ว แต่วันก่อนเข้าไปเปิดดูปรากฏว่าลิงค์เดิมที่เก็บโค้ดอันนี้ไว้มันใช้งานไม่ได้แล้ว
เลยขอเอามาแปะใหม่ที่นี่แล้วกัน วิธีติดตั้งก็คือลากข้อความข้างล่างไปแปะเป็น Bookmark ได้เลย&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;javascript:void(q=window.getSelection?window.getSelection():(document.getSelection?document.getSelection():(document.selection?document.selection.createRange().text:&apos;&apos;)));if(q==&apos;&apos;)void(q=prompt(&apos;Enter a word&apos;,&apos;&apos;));if(q){void(ldwin=window.open(&apos;http://dict.longdo.com/mobile.php?search=&apos;+encodeURIComponent(q),&apos;ldwin&apos;,&apos;width=600,height=600,resizable=yes,scrollbars=yes,toolbar=no,location=no,directories=no,status=yes,menubar=no,copyhistory=no&apos;));void(setTimeout(&apos;ldwin.focus()&apos;,1));};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;</content:encoded></item><item><title>ชื่อ</title><link>https://www.onedd.net/posts/chuue</link><guid isPermaLink="true">https://www.onedd.net/posts/chuue</guid><pubDate>Fri, 24 May 2019 15:00:00 GMT</pubDate><content:encoded>&lt;p&gt;คุยกับพี่ที่ทำงานเรื่องชื่อไป เลยขอจดคำศัพท์เกี่ยวกับชื่อไว้เล่นๆ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ชื่อต้น ชื่อกลาง ชื่อท้าย – อันนี้น่าจะมาจากคำว่า first/middle/last name&lt;/li&gt;
&lt;li&gt;ชื่อตัว – อันนี้เคยได้เห็นใช้ในหนังสือภาษาอังกฤษ หมายถึงชื่อ&lt;/li&gt;
&lt;li&gt;上の名前 (ความหมาย: ชื่อบน) –  นามสกุล อันนี้น่าจะเพราะว่าภาษาญี่ปุ่นเวลาเขียนแบบบนลงล่าง นามสกุลที่มาก่อนก็เลยอยู่ข้างบน&lt;/li&gt;
&lt;li&gt;下の名前 (ความหมาย: ชื่อล่าง) –  ชื่อตัว เหตุผลเดียวกับข้างบน&lt;/li&gt;
&lt;li&gt;姓名（せいめい）・氏名（しめい）– ชื่อนามสกุล&lt;/li&gt;
&lt;li&gt;名前 （なまえ）- ชื่อ-นามสกุล หรือชื่ออย่างเดียวก็ได้&lt;/li&gt;
&lt;li&gt;名（な）– ชื่อ&lt;/li&gt;
&lt;li&gt;名字・苗字（みょうじ）– นามสกุล&lt;/li&gt;
&lt;li&gt;芸名 – Stage name หรือพวกนามแฝง&lt;/li&gt;
&lt;li&gt;本名（ほんめい、ほんみょう） – ชื่อจริง (ที่ไม่ใช่ stage name หรือพวกชื่อในวงการ)&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item></channel></rss>