<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Wasith Theerapattrathamrong</title>
    <description>The latest articles on DEV Community by Wasith Theerapattrathamrong (@ph9).</description>
    <link>https://dev.to/ph9</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F358978%2Ffc896a0b-e136-4ea3-975c-a3457858131f.jpeg</url>
      <title>DEV Community: Wasith Theerapattrathamrong</title>
      <link>https://dev.to/ph9</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ph9"/>
    <language>en</language>
    <item>
      <title>ประเภทของ Equivalence Class Testing</title>
      <dc:creator>Wasith Theerapattrathamrong</dc:creator>
      <pubDate>Wed, 02 Dec 2020 21:29:45 +0000</pubDate>
      <link>https://dev.to/ph9/equivalence-class-testing-2387</link>
      <guid>https://dev.to/ph9/equivalence-class-testing-2387</guid>
      <description>&lt;p&gt;บทความนี้เกี่ยวกับการทดสอบระบบ จะมาเล่าถึงประเภทของ Equivalence Class Testing โดยแบ่งออกเป็น 4 กลุ่มย่อย ๆ ดังนี้&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Weak Normal Equivalence Class Testing&lt;/strong&gt;: คือการทดสอบที่ ตัวแปลแต่ละตัวจะถูกทดสอบ และผลลัพธ์จะขึ้นอยู่กับค่าเพียงค่าเดียวเท่านั้น หรือรู้จักกันในชื่อ &lt;strong&gt;single fault assumption&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Strong Normal Equivalence Class Testing&lt;/strong&gt;: หรือ &lt;strong&gt;multiple fault assumption&lt;/strong&gt; นั้นจะทดสอบผลลัพธ์จาก inputs ที่มากกว่า 1 ตัว&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Weak Robust Equivalence Class Testing:&lt;/strong&gt; จะเหมือนกับข้อแรก แต่จะเน้นในการตรวจสอบค่าที่ไม่ถูกต้อง เช่นค่าที่อยู่นอกขอบเขต ยกตัวอย่างเช่น ถ้าฟังก์ชันที่จะทดสอบรับจำนวนเต็มที่ 0-100 และใส่ -1 เข้าไปโปรแกรมจะทำงานอย่างไร throw exception หรือไม่&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Strong Robust Equivalence Class Testing&lt;/strong&gt;: เป็นการออกแบบการทดสอบที่อาจจะผสมไปด้วยค่าที่ถถูกต้อง และค่าที่ผิด โดยอาจจะผิดทั้งหมด หรือผิดแค่บางส่วนก็ได้&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;ซึ่งการออกแบบ test cases ที่ดี ควรลดการซ้ำซ้อนของ test cases ต่าง ๆ ด้วย ในมุมผมใช้แค่ 3 แบบแรกก็เพียงพอแล้ว&lt;/p&gt;

&lt;h3&gt;
  
  
  ถ้ายังไม่เข้าใจไปดูตัวอย่าง code (ภาษา Swift) กัน
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight swift"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="kt"&gt;Calculator&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;left&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Int&lt;/span&gt;
  &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;right&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Int&lt;/span&gt;

  &lt;span class="o"&gt;...&lt;/span&gt;

  &lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;leftAddedWithOne&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kt"&gt;Int&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;left&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kt"&gt;Int&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;left&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;right&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;เรามาดูกันที่ 2 ฟังก์ชันของโปรแกรมข้างบน คือ &lt;code&gt;leftAddedWithOne()&lt;/code&gt; และ &lt;code&gt;add()&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;leftAddedWithOne()&lt;/code&gt; จะทำการเข้าค่า &lt;code&gt;left&lt;/code&gt; มาเพิ่มด้วย &lt;code&gt;1&lt;/code&gt; แล้วให้ผลลัพธ์ออกมา&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;add()&lt;/code&gt; จะทำการเอาค่า &lt;code&gt;left&lt;/code&gt; กับค่า &lt;code&gt;right&lt;/code&gt; มาบวกกัน แล้วให้ผลลัพธ์ออกมา&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  ถ้าเราเขียน unit test ด้วย XCTestCase อาจจะได้เป็น
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight swift"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;placeholderValue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;Int&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;min&lt;/span&gt;

&lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;test_whenLeftIs99_leftAddedWithOne_shouldReturn100&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;calculator&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;Calculator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;left&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;99&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;right&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;placeholderValue&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="kt"&gt;XCTAssertEqual&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;calculator&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;leftAddedWithOne&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;test_add_shouldReturnValueOfLeftAndRightAddedTogether&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;calculator&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;Calculator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;left&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;99&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;right&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;66&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="kt"&gt;XCTAssertEqual&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;calculator&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="mi"&gt;33&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;จะเห็นได้ว่า test case แรก &lt;code&gt;test_whenLeftIs99_leftAddedWithOne_shouldReturn100()&lt;/code&gt; จะไม่ได้สนใจ value ของ &lt;code&gt;right&lt;/code&gt; โดยผลลัพธ์จะขึ้นอยู่กับค่า &lt;code&gt;left&lt;/code&gt; อย่างเดียวเท่านั้น Test case แบบนี้จัดอยู่ในกลุ่ม &lt;strong&gt;Weak Normal Equivalence Class Testing&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;ส่วน test case ที่ 2 &lt;code&gt;test_add_shouldReturnValueOfLeftAndRightAddedTogether()&lt;/code&gt; ผลลัพธ์จะขึ้นอยู่กับค่ามากกว่า 1 ค่า คือ &lt;code&gt;left&lt;/code&gt; และ &lt;code&gt;right&lt;/code&gt; ซึ่งถ้าค่าใดค่า 1 เปลี่ยนไปจะทำให้ test case นี้ fail. Test case นี้จึงจัดอยู่ในกลุ่มของ &lt;strong&gt;Strong Normal Equivalence Class Testing&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;หมายเหตุ&lt;/em&gt;&lt;/strong&gt; &lt;code&gt;placeholder&lt;/code&gt; คือ ค่าที่ใส่แค่ให้ครบตามที่โปรแรกมนั้น ๆ ต้องการไม่งั้น compile ไม่ผ่าน แต่ไม่ได้เอามาคิดคำควณกับ test case นั้น&lt;/p&gt;

&lt;p&gt;แต่ก่อนในวงการวิทยาการคอมพิวเตอร์เรียก &lt;code&gt;placeholder&lt;/code&gt; ว่า &lt;code&gt;dummy&lt;/code&gt; แต่ Google ได้ออกคำแนะนำใหม่&lt;a href="https://www.blognone.com/node/116929"&gt;ให้เรียกว่า &lt;code&gt;placeholder&lt;/code&gt; แทน&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  ส่วน robust testing
&lt;/h4&gt;

&lt;p&gt;สมมุติว่ามีฟังก์ชันที่เรา string แล้วจะแปลงค่าเป็น Int ให้ โดยถ้าแปลงไม่ได้จะให้ผลลัพธ์เป็น nil แทน&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight swift"&gt;&lt;code&gt;&lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;convertToInt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="nv"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kt"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kt"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;XCTAssertNil&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"ก"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ซึ่ง test case ที่ดีเราไม่ควรทำการทดสอบตัว framework, หรือ library ที่ใช้ในแบบข้างบนนะครับ&lt;/p&gt;

&lt;p&gt;ขอให้สนุกกับการเขียนโค้ด สวัสดีครับ 🙏&lt;/p&gt;

</description>
    </item>
    <item>
      <title>AppStore Connect API ใหม่ กับ fastlane เจ้าเดิม</title>
      <dc:creator>Wasith Theerapattrathamrong</dc:creator>
      <pubDate>Tue, 13 Oct 2020 01:29:35 +0000</pubDate>
      <link>https://dev.to/ph9/appstore-connect-api-fastlane-4n2f</link>
      <guid>https://dev.to/ph9/appstore-connect-api-fastlane-4n2f</guid>
      <description>&lt;p&gt;หลังจากที่ AppStore Connect เปลี่ยน API เลิกการใช้ Username, password, OTP, และ app-password ไปทำให้ถึงเวลาที่ fastlane ต้องยกเครื่อง ต้องใช้ fastlane &lt;a href="https://newreleases.io/project/github/fastlane/fastlane/release/2.162.0"&gt;2.162.0&lt;/a&gt; ขึ้นไปเท่านั้น&lt;/p&gt;

&lt;h2&gt;
  
  
  Create API KEY
&lt;/h2&gt;

&lt;p&gt;ขั้นแรกเราต้องเข้าไปที่ &lt;a href="https://appstoreconnect.apple.com/access/api"&gt;https://appstoreconnect.apple.com/access/api&lt;/a&gt; ก่อน หรือ&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Login ที่ &lt;a href="https://appstoreconnect.apple.com"&gt;https://appstoreconnect.apple.com&lt;/a&gt; ครั้งแรกที่ทำต้องใช้ &lt;strong&gt;Account Holder เท่านั้น&lt;/strong&gt; ใช้ Admin ไม่พอนะ ใครที่ทำหายไปแล้วไปตามหามาด้วย&lt;/li&gt;
&lt;li&gt;เข้าไปที่ &lt;a href="https://appstoreconnect.apple.com/access/api"&gt;https://appstoreconnect.apple.com/access/api&lt;/a&gt; หรือ Login &amp;gt; Users and Access &amp;gt; Keys &amp;gt; &lt;/li&gt;
&lt;li&gt;กด Request Access&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--W_69Ayx_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/6nlxnu42e04hc09man3p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--W_69Ayx_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/6nlxnu42e04hc09man3p.png" alt="Screen Shot 2563-10-13 at 08.09.08"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;อ่านให้เรียบร้อย แล้วติ๊กยอมรับ แล้วกด Submit หลังจากตรงนี้ใช้ Admin ขึ้นไปได้ละ&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--48BGi4to--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/lvsmgra4pf5n68llied2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--48BGi4to--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/lvsmgra4pf5n68llied2.png" alt="Screen Shot 2563-10-13 at 08.10.04"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;กด Generate API Key&lt;/li&gt;
&lt;li&gt;ตั้งชื่อ เช่น Fastlane, Access เลือกเป็น level ของ user ที่เราจะให้ใช้ API Key ตัวที่กำลังจะสร้าง เลือก Developer หรือ Admin​ ไม่เป็นไรถ้าสร้างแล้วใช้ไม่ได้มาสร้างใหม่ได้เรื่อย ๆ&lt;/li&gt;
&lt;li&gt;กด Download API Key ดาวโหลดได้ครั้งเดียวนะ ทำหายให้ Revoke แล้วสร้างใหม่&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--CVYBeiln--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/tpf7ea6yu85bkwbyjjud.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--CVYBeiln--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/tpf7ea6yu85bkwbyjjud.png" alt="Screen Shot 2563-10-13 at 08.13.55"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;เอา key ที่ได้มาไปเก็บไว้ที่ปลอดภัย เช่น AWS Key Management แต่ถ้า ไม่ได้สนใจ security อะไรมากก็โพสขึ้่น pantip (หยอกนะ)&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Create JSON file for App Store config in Fastlane
&lt;/h2&gt;

&lt;p&gt;ต่อมาเราจะมาสร้าง .json file ที่เก็บตัวข้อมูลที่ใช้ในการต่อกับ App Store Connect&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"key_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;KEY_ID&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"issuer_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;ISSURE_ID&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"key"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"-----BEGIN PRIVATE KEY-----&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;KEY_PART1&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;KEY_PART2&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;...&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;-----END PRIVATE KEY-----"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"duration"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"in_house"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;โดยให้แทนค่า KEY_ID, ISSUE_ID ที่มาจากหน้า &lt;a href="https://appstoreconnect.apple.com/access/api"&gt;https://appstoreconnect.apple.com/access/api&lt;/a&gt; หนะแหละ แล้วเปิดไว้ .p8 ที่ดาวโหลดมาได้แล้วเอาไปแทน value ตรง key และแทนการขึ้นบรรทัดใหม่ด้วยการ &lt;code&gt;\n&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Use it
&lt;/h2&gt;

&lt;p&gt;เหมือนเดิมเอาไปวางไว้ใน Key Management หรือ เอาง่าย ๆ ก็วางไว้กับ Fastfile เลยก็ได้ ในกรณีนี้วางไว้ที่ &lt;code&gt;fastlane/app-store-connect.json&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;เสร็จแล้วใน Deliverfile, Matchfile, Precheckfile, หรือไฟล์ที่เกี่ยวกับ App Store Connect ว่า &lt;code&gt;api_key_path("fastlane/app-store-connect.json")&lt;/code&gt; &lt;/p&gt;

&lt;p&gt;เท่านี้ก็ใช้งานได้แล้ว ให้ลองใช้ distribute, match อะไรพวกนี้ดูว่าสามารถใช้งานได้หรือไม่&lt;/p&gt;

&lt;h2&gt;
  
  
  ปล.
&lt;/h2&gt;

&lt;p&gt;จริง ๆ มีอีกวิธีคือเขียน Code ใน Fastfile แต่เราพบว่า code มันยั๊วเยี๊ยไปหมด เราเลยนำเสนอแค่แบบการใช้ config json เท่านั้น&lt;/p&gt;

&lt;p&gt;ถ้าใครเจอ &lt;code&gt;Unresolved conflict between options: 'api_key' and 'username'&lt;/code&gt; ให้ลองลบพวก username หรือ &lt;code&gt;FASTLANE_USERNAME&lt;/code&gt; ออกไปเพราะมันชนกัน&lt;/p&gt;

&lt;p&gt;Reference:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/fastlane/fastlane/pull/17291"&gt;https://github.com/fastlane/fastlane/pull/17291&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.fastlane.tools/actions"&gt;https://docs.fastlane.tools/actions&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
    <item>
      <title>เอาคอมใส่ตู้เย็นขณะทำงานช่วยระบายความร้อนได้ดีจริงหรอ ?</title>
      <dc:creator>Wasith Theerapattrathamrong</dc:creator>
      <pubDate>Thu, 21 May 2020 04:40:47 +0000</pubDate>
      <link>https://dev.to/ph9/-1gmb</link>
      <guid>https://dev.to/ph9/-1gmb</guid>
      <description>&lt;h1&gt;
  
  
  เอาคอมเข้าตู้เย็น
&lt;/h1&gt;

&lt;p&gt;เป็นการทดลองเล็ก ๆ โดยการเอา MacBook Pro 16" Late 2016 (Intel Core i7-6920HQ @ 2.9 GHz (4 cores)) ไปเข้าตู้เย็นเพราะว่ามันร้อนชนสุดกำลังที่เครื่องจะรับไหว เพราะว่าผมเอาคอมทุกเครื่องที่มีเข้าโครงการ &lt;a href="https://dev.to/ph9/folding-home-covid-19-1j07"&gt;Folding@Home&lt;/a&gt; เพื่อช่วยประมวลผลเผื่อหาวิธีรักษาและป้องกัน COVID-19 &lt;/p&gt;

&lt;p&gt;พอผมรันไว้ที่โต๊ะทำงาน พันลมก็ดังมากเลยคิดเล่น ๆ ว่า ตู้เย็นมันเย็น มันจะช่วยให้คอมเราเย็นขึ้นได้ไหม ผมเลยทำการทดลองโดยการเอาแมคบุ๊คใส่ตู้เย็น โดยสายชาร์จก็ยังเสียบค้างไว้อยู่ โดยที่ไม่ได้เจาะตู้เย็นแต่สายชาร์จวางพาดยางหุ้มประตูออกมาเลย&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--NHC-dGVv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/3im0rifspvst4uqqfszp.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--NHC-dGVv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/3im0rifspvst4uqqfszp.jpg" alt="คอมในตู้เย็น"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  การทดลอง
&lt;/h2&gt;

&lt;p&gt;สำหรับการทดลอง เราใช้ MacBook เครื่องเดียวกัน กับ 2 ตู้เย็นที่แตกต่างกัน โดยกำการทดลองแบบละ 30 นาที โดยให้ทำงานทั้ง CPU และ GPU&lt;/p&gt;

&lt;p&gt;สำหรับงานที่รันเฉพาะ CPU หรือ GPU ไม่ได้รวมอยู่ในบทความนี้&lt;/p&gt;

&lt;h3&gt;
  
  
  ตู้เย็นแบบธรรมดา
&lt;/h3&gt;

&lt;p&gt;โดยลักษณะการทำงานของคู้เย็นชนิดนี้ จะทำงานก็ต่อเมื่อมีอุณหภูมิที่สูงกว่าที่กำหนด และหยุดทำงานหลังจากอุณภูมิตำกว่าที่กำหนด &lt;/p&gt;

&lt;p&gt;ผลคือ ตู้เย็นระบายความร้อนไม่ทัน ในตู้ค่อนข้างร้อน และความร้อนคอมก็สูงขึ้นเรื่อย ๆ จนเกิด สิ่งที่เรียกว่า CPU throttling&lt;/p&gt;

&lt;h4&gt;
  
  
  CPU throttling
&lt;/h4&gt;

&lt;p&gt;เป็นกระบวนการที่ตัว CPU เองจะลด clock speed หรือความเร็ว CPU ลง เพื่อให้ความร้อนลดลง เป็นการรักษา CPU ให้มีอายุนาน หรือป้องกันวงจรไหม้ โดยปกติจะรักษาให้ความร้อนไม่เกิน 100℃&lt;/p&gt;

&lt;h3&gt;
  
  
  ตู้เย็นแบบ inverter
&lt;/h3&gt;

&lt;p&gt;เป็นตู้เย็นที่จะทำงานตลอดเวลา โดยจะปรับความแรงตามความต้องการระบายความร้อนออก เช่นร้อนมาก ก็จะทำงานเต็มกำลัง เย็นแล้ว ก็จะทำงานเบา ๆ ช้า ๆ&lt;/p&gt;

&lt;p&gt;ผลการทดลองของตู้เย็นแบบ inverter คือ ตู้เย็นทำงานเสียงดังตลอดเวลา ในตู้เย็นกว่าอากาศข้างนอก แต่ไม่เย็นแบบตู้เย็นอีกแล้ว&lt;/p&gt;

&lt;h3&gt;
  
  
  ลองเอาใส่ช่องแข็ง
&lt;/h3&gt;

&lt;p&gt;เนื่องจากเครื่อง MacBook อุณภูมิที่ทำงานได้อยู่ที่ 10-100℃ พออุณหภูมิของเครื่องต่ำมาก ๆ ก็ทำให้เครื่องดับไม่สามารถทำงานต่อได้&lt;/p&gt;

&lt;h3&gt;
  
  
  หลังเอาออกจากช่องแข็ง
&lt;/h3&gt;

&lt;p&gt;เนื่องจากความเย็นที่ต่างกันมาก อาจทำให้มีไอน้ำมาเกาะเป็นหยดน้ำที่ตัวเครื่องหรือวงจรภายใน ควรเอาแช่ช่องธรรมดาต่อ โดยเปิดให้เครื่องทำงานด้วยเพราะจะได้สร้างความร้อนที่ตัวเครื่อง เพื่อให้อุณหภูมิของเครื่องไม่ต่างกับอุณหภูมิภายนอกมาก เพื่อลดการกลั่นตัวจากไอน้ำเป็นน้ำแล้วมาเกาะที่ตัวเครื่อง ที่เกิดจากอุณหภูมิที่ต่างกันเกิดไปและมีความชื้นในอากาศ ซึ่งอาจทำให้เครื่องช็อตและพังได้&lt;/p&gt;

&lt;h2&gt;
  
  
  ตารางสรุป
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;ห้อง&lt;/th&gt;
&lt;th&gt;ตู้เย็นธรรมดา&lt;/th&gt;
&lt;th&gt;Inverter ช่องธรรมดา&lt;/th&gt;
&lt;th&gt;Inverter ช่องแข็ง&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;CPU's temperature (~℃)&lt;/td&gt;
&lt;td&gt;98&lt;/td&gt;
&lt;td&gt;98&lt;/td&gt;
&lt;td&gt;95&lt;/td&gt;
&lt;td&gt;65-75&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPU's temperature (~℃)&lt;/td&gt;
&lt;td&gt;90&lt;/td&gt;
&lt;td&gt;80&lt;/td&gt;
&lt;td&gt;60-75&lt;/td&gt;
&lt;td&gt;33-48&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fan speed (~rpm)&lt;/td&gt;
&lt;td&gt;~4,000&lt;/td&gt;
&lt;td&gt;~4,000&lt;/td&gt;
&lt;td&gt;4,000&lt;/td&gt;
&lt;td&gt;1,200&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PPD&lt;/td&gt;
&lt;td&gt;40,000&lt;/td&gt;
&lt;td&gt;38,000&lt;/td&gt;
&lt;td&gt;50,000&lt;/td&gt;
&lt;td&gt;52,000&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Temperature และ fan speed ยิ่งต่ำยิ่งดี&lt;/p&gt;

&lt;p&gt;PPD: Point per day (แต้มที่ได้จาก Folding@Home) ยิ่งมากยิ่งดี เพิ่มขึ้นจาก ~ 40,000 แต้มต่อวันเป็น 52,000 ต่อวัน&lt;/p&gt;

&lt;p&gt;จะเห็นได้ว่าเอาเข้าตู้เย็นธรรมดา แย่กว่าไว้ในสภาพห้องเสียอีก ส่วนเอาเข้าช่องแข็งก็เครื่องจะดับได้ง่ายเพราะอุณภูมิที่ต่ำเกินไป&lt;/p&gt;

&lt;p&gt;ปล. หลังจากเผยแพร่ออกไป จะมีความเห็นเรื่องความชื้นเยอะมาก แต่จะบอกว่าในตู้เย็นความชื้นน้อยมากครับ ในห้องผมวัดได้ 78% 28℃ แต่ในตู้เย็นวัดได้ 35% 2.8℃ ดูหลังจากใส่เครื่องวัดเข้าไปในตู้แล้วเป็นเวลา 60 นาที&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--IXJ6prnn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/fu9slh0ep4lgrcdhepyd.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--IXJ6prnn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/fu9slh0ep4lgrcdhepyd.jpg" alt="ความชื้นในตู้เย็น"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;เพราะโดยส่วนใหญ่ตู้เย็นหรือเครื่องปรับอากาศใช้พลังส่วนมากในการเอาความชื้นออกไปจากระบบ และส่วนหนึ่งทำให้ระบบเย็นขึ้น&lt;/p&gt;

&lt;p&gt;ส่วนความชื้นที่มีในตู้เย็นนั้นมักจะเกิดจากการเปิดฝาตู้เย็น การเปิดตู้เย็นบ่อยเลยทำให้เปลืองไฟ&lt;/p&gt;

&lt;p&gt;ส่วนห้องแอร์การปลูกต้นไม้ ซึ่งมีคุณสมบัติในการคายน้ำ ส่งผลให้แอร์ต้องทำงานหนัก และตามมาด้วยค่าไฟที่สูงขึ้น&lt;/p&gt;

</description>
      <category>cooling</category>
      <category>pc</category>
    </item>
    <item>
      <title>Folding@home โปรเจคช่วยประมวลผลเพื่อต่อสู้ COVID-19!</title>
      <dc:creator>Wasith Theerapattrathamrong</dc:creator>
      <pubDate>Tue, 19 May 2020 17:35:27 +0000</pubDate>
      <link>https://dev.to/ph9/folding-home-covid-19-1j07</link>
      <guid>https://dev.to/ph9/folding-home-covid-19-1j07</guid>
      <description>&lt;h1&gt;
  
  
  Folding@home (FAH, F@h)
&lt;/h1&gt;

&lt;p&gt;ไม่ได้เป็นของใหม่อะไรเลย โดย FAH เป็นโปรเจคการประมวลผลแบบกระจาย (distributed computing) สำหรับการจำลองพลวัตของโปรตีน (protein dynamics) รวมไปถึงการประมวลผลเพื่อจำลองการขดตัว หรือการเคลื่อนไหวของโปรตีน โดยใครที่มีเครื่องคอมพิวเตอร์ว่าง ๆ ก็เอามาให้มันประมวลผลเพื่อช่วยในโปรเจคนี้ได้ ซึ่งผลของการประมวลที่ได้จะช่วยให้นักวิทยาเข้าใจในชีววิทยามากขึ้น นั่นหมายถึงอาจช่วยให้ค้นพบวิธีการรักษาโรคต่าง ๆ ได้&lt;/p&gt;

&lt;h2&gt;
  
  
  Download
&lt;/h2&gt;

&lt;p&gt;ใครพร้อมแล้วก็ไปดาวโหลดกันกันได้เลยที่ &lt;a href="https://foldingathome.org/start-folding/"&gt;https://foldingathome.org/start-folding/&lt;/a&gt; ส่วนผมใช้ macOS อยู่แล้วก็เลือกที่จะลงแบบ geek ๆ ด้วย &lt;code&gt;brew cask install folding-at-home&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Community
&lt;/h2&gt;

&lt;p&gt;ในไทยก็ได้มีการรวมตัวกันที่เฟสบุคกลุ่ม &lt;a href="https://www.facebook.com/groups/263948448063747/"&gt;Folding@Home Thailand&lt;/a&gt; ผมไม่ได้สร้างเองนะมี&lt;a href="https://medium.com/@udkgab/75fa46be4708"&gt;คนสร้างไว้อยู่แล้ว&lt;/a&gt; &amp;lt;&amp;lt; กดเบา ๆ เข้าไปอ่านถ้าต้องการรายละเอียดที่มากขึ้น&lt;/p&gt;

&lt;p&gt;ซึ่งจริง ๆ เคยมีคน&lt;a href="https://cryptominingman.blogspot.com/2016/10/foldinghome-v7.html"&gt;เขียนอธิบาย&lt;/a&gt; FAH ไว้ตั้งแต่ ต.ค. 59 กันเลยทีเดียว และมีการลง pantip.com ด้วยตั้งแต่ &lt;a href="https://pantip.com/topic/36358948"&gt;เม.ย. 60&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Setup
&lt;/h2&gt;

&lt;p&gt;สำหรับใครที่ไม่ต้องการ credit ใด ๆ ติดตั้งเสร็จก็สามารถกด Fold ได้เลย แต่อย่างน้อยใส่ Team Number ด้วยเลข &lt;code&gt;261333&lt;/code&gt; ก็ยังดีนะ ซึ่งอยู่ในนาม &lt;a href="https://stats.foldingathome.org/team/261333"&gt;Folding@Home Thailand&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--6oPcbBog--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/uqcxwrney9r5834nsdxr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6oPcbBog--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/uqcxwrney9r5834nsdxr.png" alt="FAHControl"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ถ้าต้องการเลือกว่าเราจะ support โปรเจคไหนสามารถเลือกได้ที่ Configure &amp;gt; Advanced &amp;gt; Cause Preference ผมเลือกเป็น High Priority ไป degfault เป็นโปรเจคไหนก็ได้ (Any)&lt;/li&gt;
&lt;li&gt;ในส่วนของ Folding Power สามารถปรับพลังที่เราจะใช้ในการประมวลผลได้จาก Light - Medium - Full&lt;/li&gt;
&lt;li&gt;Folding Slots ปกติแล้วจะมีแต่ CPU และตามด้วยจำนวน threads ในรูปจะเห็นว่าใช้อยู่ทั้งหมด 12 threads&lt;/li&gt;
&lt;li&gt;สามารถเพิ่ม GPU ได้จาก Configure ซ้ายบน ไม่แน่ใจว่าถ้ามี CPU หลายตัว จะต้องเพิ่มเองหรือป่าว หรือมีมาให้ตั้งแต่แรก&lt;/li&gt;
&lt;li&gt;ปุ่ม Finish ▷| เมื่อกดแล้ว โปรแกรมจะยังทำงานต่อจนกว่าจะเสร็จงานนั้น ๆ แล้วจึงจะหยุด&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  สมัคร
&lt;/h2&gt;

&lt;p&gt;ถ้าใครอยากได้ credit สามารถลงทะเบียนได้ที่ &lt;a href="https://apps.foldingathome.org/getpasskey"&gt;https://apps.foldingathome.org/getpasskey&lt;/a&gt; โดยเราจะได้ username และ passkey สำหรับมากรอกในโปรแกรมผ่านทางอีเมลอีกที&lt;/p&gt;

&lt;p&gt;ซึ่งที่ผมเห็นบางคนก็ใช้รหัสกระเป๋าตังตัวเองตั้งเป็น alias นะ ไม่รู้มีคนบริจาคบ้างมั้ย 555&lt;/p&gt;

&lt;h2&gt;
  
  
  ข้อจำกัด
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;สำหรับ macOS ยังไม่รองรับการประมวลผลบน GPU&lt;/li&gt;
&lt;li&gt;ถ้าอยากช่วยบน ARM เช่น Raspberry Pi หรือโทรศัพท์มือถือให้ไปดูโปรเจค &lt;a href="https://boinc.bakerlab.org"&gt;Rosetta@home&lt;/a&gt; แทน&lt;/li&gt;
&lt;li&gt;ใครที่หวังว่าจะเห็นคะแนนตัวเองทันทีหลังจากจบงาน อาจจะไม่เห็นทันที เพราะระบบจะ refresh คะแนนทุก ๆ 1 ชม.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://youtu.be/HaMjPs66cTs"&gt;คอขวด&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;ซึ่งเมื่อวันที่ 27 มีนาคม 2563 มีรายงานว่าผู้เข้าร่วมโครงการ &lt;a href="https://twitter.com/drGregBowman/status/1243405484289228801"&gt;กระโดดจากประมาณ 3 หมื่นคนเป็นมากกว่า 4 แสนคน&lt;/a&gt;เลยทีเดียว&lt;/p&gt;

&lt;p&gt;ซึ่งทำให้เกิด&lt;a href="https://youtu.be/KU4qOebhkfs"&gt;คอขวดที่เซิฟเวอร์&lt;/a&gt; ที่ไม่สามารถประจายงาน และรับงานได้เร็วพอกับพลังประมวลผลที่มีอยู่ตอนนี้ คาดว่าตอนนี้ปัญหานี้น่าจะได้รับการแก้ไขแล้ว&lt;/p&gt;

&lt;h2&gt;
  
  
  อ่านต่อ
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;คำถามที่พบบ่อย &lt;a href="https://foldingathome.org/support/faq/project-details/"&gt;https://foldingathome.org/support/faq/project-details/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;ก็ไม่ได้อยากเขียนยาวมาก คิดว่าติดตั้ง และใช้งานได้ไม่ยาก แค่อยากบอกให้รู้ว่าโลกมีสิ่งนี้อยู่&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;สวัสดีครับ&lt;/strong&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>ลง Xcode และ iOS simulators ผ่าน command-line เพื่อทำ script อัตโนมัติ</title>
      <dc:creator>Wasith Theerapattrathamrong</dc:creator>
      <pubDate>Thu, 23 Apr 2020 04:24:09 +0000</pubDate>
      <link>https://dev.to/ph9/xcode-ios-simulators-command-line-xcode-version-4i64</link>
      <guid>https://dev.to/ph9/xcode-ios-simulators-command-line-xcode-version-4i64</guid>
      <description>&lt;h1&gt;
  
  
  xcode-install
&lt;/h1&gt;

&lt;p&gt;รอบนี้เราจะมารู้จักเครื่องมือตัวนึงเป็น gem (โปรแกรมที่เขียนด้วยภาษา Ruby) สำหรับใครยังใช้ sudo gem อยู่แนะนำให้อ่าน "&lt;a href="https://medium.com/odds-team/%E0%B9%80%E0%B8%A3%E0%B8%B2%E0%B9%84%E0%B8%A1%E0%B9%88%E0%B8%84%E0%B8%A7%E0%B8%A3%E0%B9%83%E0%B8%8A%E0%B9%89-sudo-gem-e1c37a0a02e4"&gt;เราไม่ควรใช้ sudo gem&lt;/a&gt;" ก่อนนะครับ&lt;/p&gt;

&lt;h2&gt;
  
  
  ติดตั้ง
&lt;/h2&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;sudo&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; gem &lt;span class="nb"&gt;install &lt;/span&gt;xcode-install
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;ซึ่งระหว่างใช้งานอาจจะมีการถาม username, password ของ Apple Developer Account ด้วย ซึ่งสามารถตั้ง environment variables ได้จาก &lt;code&gt;XCODE_INSTALL_USER&lt;/code&gt; และ &lt;code&gt;XCODE_INSTALL_PASSWORD&lt;/code&gt; ตามลำดับ หรือ login ผ่าน command line ก็ได้ ถ้าใครเปิด Multi-Factor authen สามารถสร้าง app password เพื่อใช้แทนรหัสผ่านจริงได้&lt;/p&gt;

&lt;h2&gt;
  
  
  คำสั่งพื้นฐาน สำหรับ Xcode
&lt;/h2&gt;

&lt;p&gt;คำสั่งที่เราจะได้คือ &lt;code&gt;xcversion&lt;/code&gt; ไม่ใช่ &lt;code&gt;xcode-install&lt;/code&gt; นะ&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;xcversion update&lt;/code&gt; มันจะไปตรวจที่ &lt;a href="https://developer.apple.com/downloads"&gt;developer.apple.com/downloads&lt;/a&gt; ว่ามีเวอร์ชั่นอะไรให้ดาวโหลดบ้าง บางครั้งใน AppStore จะใหม่กว่าหน้าเว็บนี้ เพราะฉะนั้น ถ้าไม่เจอเวอร์ชั่นใหม่ในวันแรก ๆ ก็ไม่แปลก&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;xcversion install &amp;lt;version&amp;gt;&lt;/code&gt; ไว้ติดตั้ง Xcode เวอร์ชั่นที่กำหนด&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;xcversion select &amp;lt;version&amp;gt;&lt;/code&gt; เลือกเวอร์ชั่นที่ต้องการ ใช้แทน &lt;code&gt;sudo xcode-select -s &amp;lt;Xcode Path&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;xcversion select &amp;lt;version&amp;gt; --symlink&lt;/code&gt; เพื่อให้ &lt;code&gt;xcode-install&lt;/code&gt; เลือกเวอร์ชั่นและตั้ง link ไว้ที่ &lt;code&gt;/Application/Xcode.app&lt;/code&gt; ให้&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;xcversion selected&lt;/code&gt; ไว้ดูว่าใช้ Xcodeเวอร์ชั่นใด build ไหน ใช้แทนคำสั่ง &lt;code&gt;/usr/bin/xcodebuild -version&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;xcversion uninstall &amp;lt;version&amp;gt;&lt;/code&gt; ไว้ลบเวอร์ชั่นที่ไม่ใช้ทิ้ง&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  คำสั่งพื้นฐานสำหรับ iOS simulators
&lt;/h2&gt;

&lt;p&gt;นอกจากจะดาวโหลด Xcode ได้แล้วยังสามารถดาวโหลด iOS simulators ได้ด้วย&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;xcversion simulators&lt;/code&gt; ไว้ดูว่าตอนนี้มี versions อะไรบ้าง และสามารถติดตั้ง versions อะไรได้บ้าง ทั้ง iOS, tvOS, watchOS&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;xcversion simulators --install=&amp;lt;ชื่อ simulator&amp;gt;&lt;/code&gt; เช่น &lt;code&gt;xcversion simulators --install="iOS 12.4"&lt;/code&gt; เพื่อติดตั้ง simulatorเวอร์ชั่นที่กำหนด&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ดูเพิ่มเติม
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;xcversion [command] --help&lt;/code&gt; จะช่วยให้เราดูได้ว่า สามารถใช้คำสั่งอะไรได้บ้าง และแต่ละคำสั่งคืออะไร&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  สรุป
&lt;/h2&gt;

&lt;p&gt;เท่าที่ใช้งานก็สามารถใช้งานได้ดี เหมาะที่จะไปตั้งเป็นชุดคำสั่ง สำหรับคนที่เพิ่งติดตั้งเครื่องใหม่ได้ แต่เหมือนกับ internet ประเทศไทยจะไม่ค่อยเป็นมิตรกับเว็บ &lt;a href="https://developer.apple.com/downloads"&gt;https://developer.apple.com/downloads&lt;/a&gt; เท่าไหร่ ซึ่งถ้าใช้เวลานานเกินไป อาจจะโหลดไม่สำเร็จได้&lt;/p&gt;

&lt;p&gt;ถ้าเราโหลดจากเว็บ เราจะได้ &lt;code&gt;.xip&lt;/code&gt; ซึ่งทำให้ copy ไปลงเครื่องอื่นได้ด้วย กรณีอินเตอร์เน็ตช้า แต่ถ้าติดตั้งผ่าน &lt;code&gt;xcode-install&lt;/code&gt; จะไม่มี &lt;code&gt;.xip&lt;/code&gt; ให้ก็อปไปเครื่องอื่น&lt;/p&gt;

&lt;p&gt;ถ้าจะก็อป &lt;code&gt;.xip&lt;/code&gt; ไปที่เครื่องอื่น แนะนำให้ใช้ USB Storage แทน AirDrop เพราะถ้าไฟล์ใหญ่มาก ๆ มักจะโอนผ่าน AirDrop ไม่ค่อยสำเร็จ&lt;/p&gt;

&lt;p&gt;เหมือนเดิม ตอนนี้ก็ยังมองหางานอยู่ สนใจอยากได้ผมไปทำงานด้วยติดต่อมาได้เลยนะครับ&lt;/p&gt;

</description>
      <category>ios</category>
      <category>automation</category>
    </item>
    <item>
      <title>มาตรวจดูกันว่าโปรเจค Android, iOS project เราปลอดภัยแค่ไหนด้วย MobSF</title>
      <dc:creator>Wasith Theerapattrathamrong</dc:creator>
      <pubDate>Sun, 19 Apr 2020 12:14:14 +0000</pubDate>
      <link>https://dev.to/ph9/android-ios-project-mobsf-3l4n</link>
      <guid>https://dev.to/ph9/android-ios-project-mobsf-3l4n</guid>
      <description>&lt;h1&gt;
  
  
  MobSF
&lt;/h1&gt;

&lt;p&gt;น่าจะได้อ่านกันไปแล้วกับบทความที่แล้วกับการ&lt;a href="https://dev.to/ph9/ios-project-dependencies-owasp-dependency-check-54lj"&gt;ตรวจ dependencies ของ iOS ด้วย OWASP Dependency-Check&lt;/a&gt; วันนี้มาตรวจ &lt;code&gt;ipa&lt;/code&gt; กันต่อด้วย MobSF&lt;/p&gt;

&lt;p&gt;ซึ่ง MobSF สามารถตรวจได้ทั้งแบบ static และ dynamic สำหรับบทความนี้จะตรวจแบบ static เท่านั้น และ MobSF สามารถติดตั้งลงเครื่องก็ได้ แต่เราจะพาทำแบบใช้ docker เท่านั้น&lt;/p&gt;

&lt;h2&gt;
  
  
  ต้องใช้อะไรบ้าง
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;docker โดยผมจะข้ามการติดตั้ง docker ไป&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ipa&lt;/code&gt; ไม่สอนการ archive ในบทความนี้เช่นกัน&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  เริ่ม
&lt;/h2&gt;

&lt;p&gt;เมื่อเรา start docker แล้ว ให้ทำการดึง MobSF&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;docker pull opensecurity/mobile-security-framework-mobsf
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;run แบบใช้ครั้งเดียวทิ้ง&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;--rm&lt;/span&gt; &lt;span class="nt"&gt;-it&lt;/span&gt; &lt;span class="nt"&gt;--name&lt;/span&gt; MobSF &lt;span class="nt"&gt;-p&lt;/span&gt; 8000:8000 opensecurity/mobile-security-framework-mobsf:latest
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;พอ start เสร็จแล้วก็เข้าไปที่ &lt;a href="http://localhost:8080"&gt;http://localhost:8080&lt;/a&gt; แล้วโยนไฟล์ &lt;code&gt;apk&lt;/code&gt;, &lt;code&gt;ipa&lt;/code&gt;, หรือ &lt;code&gt;zip&lt;/code&gt; ของ โปรเจค iOS เข้าไปได้เลย แล้วมันจะทำการวิเคราะห์ให้ทันที และพาไปหน้าผลการวิเคราะห์เมื่อเสร็จ แต่ผลของการวิเคราะห์ &lt;code&gt;zip&lt;/code&gt; กับ &lt;code&gt;ipa&lt;/code&gt; จะไม่เหมือนกัน&lt;/p&gt;

&lt;p&gt;โดย zip ของ iOS ต้องไม่รวม folder project นอกสุด ให้ (ให้ไฟล์ &lt;code&gt;xcodeproj&lt;/code&gt; อยู่ที่ root ของ zip)&lt;/p&gt;

&lt;h2&gt;
  
  
  ผลการทดลอง
&lt;/h2&gt;

&lt;p&gt;ตัว report มีหน้าเว็บให้ดู ถ้าเราใช้ docker แล้วทุบทิ้งอาจจะดูย้อนหลังไม่ได้ ซึ่งเราสามารถดึงเป็น JSON ผ่าน API ของ MobSF หรือดาวโหลด PDF มาเก็บไว้ก็ได้&lt;/p&gt;

&lt;h3&gt;
  
  
  ทดลองด้วย zip ของโปรเจค iOS
&lt;/h3&gt;

&lt;p&gt;ซึ่งไม่มี source code ของเราเองเลยเป็นของ dependencies ล้วน ๆ จะเจอว่า&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;เจอว่ามีการเก็บ keys, usersnames, passwords, ในไฟล์ของ dependencies ซึ่ง เข้าไปดูก็ไม่มี&lt;/li&gt;
&lt;li&gt;เจอว่ามีการใส่ ip ไว้ตรง ๆ ใน source code แต่มันคือ comment ของ Alamofire&lt;/li&gt;
&lt;li&gt;เจอว่ามีการใช้ hash ที่ไม่แข็งแรงแล้วเช่น MD5 ซึ่งมีใน source code ของ Kingfisher&lt;/li&gt;
&lt;li&gt;เจอว่ามีการเก็บ log ซึ่งอาจจะมีการ log ข้อมูล sensitive ก็ได้ ตรงนี้ถ้าเราต้องใช้ dependencies นั้น ๆ ก็คงแก้อะไรไม่ได้ 🤣&lt;/li&gt;
&lt;li&gt;เจอว่ามีการใช้ API ที่ไม่อนุญาต ตรงนี้เดี๋ยวตอนเอาขึ้น TestFlight เดี๋ยวมันบอกอีกทีเองแหละว่าเจอจริงหรือป่าว&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;แต่ก็น่าสนว่ามันสามารถวิเคราะห์ได้ประมาณนึงว่าเราพลาดอะไรหรือป่าว ที่ไฟล์ไหน ถ้าใช้กับโปรเจคจริง อาจจะเจอสิ่งที่เราพลาดไปก็ได้ แต่ถ้าต้องมาดูทุกวันคงเหนื่อยน่าดู อาจจะดู release ละครั้งก็ได้&lt;/p&gt;

&lt;h3&gt;
  
  
  ทดลองด้วย ipa
&lt;/h3&gt;

&lt;p&gt;สำหรับการตรวจด้วย ipa นั้น จะไม่สามารถระบุได้ว่าที่ตรวจเจอหนะมาจากไฟล์ไหน&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;มีตรวจเจอว่าใช้คำสั่งที่อันตราย เช่น _strlen, _strncpy, _fopen, _printf, _memcpy, _sscanf แต่ดูแล้ว เราคงไม่ได้ใช้เองนะ&lt;/li&gt;
&lt;li&gt;พบ NSLog ใน code อาจจะเผลอ log ข้อมูล sensitive ได้
– มีการใช้ _malloc ฟังก์ชัน ซึ่งอาจจองหรือเข้าถึง memory บางส่วน หรือจอง memory เยอะเกินไปได้ แหงหละ lib ของ Google ส่วนใหญ่เป็น C จะเจอก็ไม่แปลก&lt;/li&gt;
&lt;li&gt;มีคำชมเช่นใช้ Automatic Reference Counting (ARC), Position Independent Executable (PIE), etc.&lt;/li&gt;
&lt;li&gt;และมีการตรวจว่า domain ที่ระบุอยู่ใน source code มียิงไปหา server ที่อยู่ในรายชื่อของเว็บไม่พึงประสงค์หรือไม่ ซึ่งจะเจอเป็นของ Google, Fabric, Apple, etc. แต่ไม่เจอ domain ของ server เราเองแฮะ น่าจะเพราะไม่ได้ใส่ &lt;code&gt;https://&lt;/code&gt; ไว้ข้างหน้าของ string ที่ไว้เก็บ domain ของเรา (นอกงี้ hacker ก็แอบใส่ domain ที่ไม่รวม http เข้าไปใน open source ก็จะตรวจหาไม่เจอแล้วสินะ)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ทดลองด้วย apk
&lt;/h3&gt;

&lt;p&gt;ซึ่งทดลองจาก Debug ที่ไม่ได้ obfuscate ไม่ใช่จาก Release อาจจะเจอช่องโหว่ หรือจุดอันตรายมากกว่าปกติ&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sign ตัวแอปด้วย SHA1 ซึ่งไม่ค่อยแข็งแรงแล้ว&lt;/li&gt;
&lt;li&gt;จะมีการตรวจ permission ที่ขอในแอป ซึ่งบางส่วนผมก็ว่าปกตินะ ก็ต้องขออะ แต่บางส่วนผมก็ดูไม่รู้เรื่องเหมือนกัน พอดีไม่ค่อยเชี่ยว Android&lt;/li&gt;
&lt;li&gt;Activities สามารถเข้าถึงด้วยแอปอื่นได้ บอกรายชื่อมาด้วย&lt;/li&gt;
&lt;li&gt;เนื่องจากของ Android จะ compile เป็น object code เลยสามารถ decompile และแกะชื่อไฟล์กลับมาได้ด้วย ก็ว่าทำไม ไม่มีให้ตรวจ &lt;code&gt;zip&lt;/code&gt; ของ Android&lt;/li&gt;
&lt;li&gt;หลาย ๆ อย่างก็ตรวจได้ข้อเดียวกับของ iOS เช่น algorithm hash ห่วย มี log อาจจะ hardcode username, password, keys&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;อื้ม มีประโยชน์มากทีเดียว เพราะรอบนี้จงใจ hardcode key เข้าไป แล้วมันก็ตรวจเจอจริง ๆ (ไม่มีโปรเจคให้ดูนะ 555) จริง ๆ เราก็ไปเอา apk จากใน Play Store มาโยนเข้าไปเล่น ๆ ก็ได้ น่าจะง่ายกว่าสร้างโปรเจคมาเล่น&lt;/p&gt;

&lt;h2&gt;
  
  
  ทิ้งท้าย
&lt;/h2&gt;

&lt;p&gt;คิดว่ามีประโยชน์มากเลยทีเดียวสำหรับ security audit หรือทีมที่พัฒนาที่ต้องการมอบความปลอดภัยให้กับผู้ใช้งาน&lt;/p&gt;

&lt;p&gt;ซึ่งตอนเราเขียน เราอาจจะไม่มีความรู้ว่า code ที่เราเขียนส่งผลร้ายขอผู้ใช้งานอย่างไรบ้าง แต่พอเราเจอรายงานที่ระบุประเภทช่องโหว่ และไฟล์ที่ตรวจเจอ เราก็นำผลการตรวจมาแก้ไข และ code ครั้งหน้าเราก็จะทำได้ดีขึ้น&lt;/p&gt;

&lt;p&gt;สำหรับบทความนี้ไว้เท่านี้ก่อนแล้วกันนะครับ เดี๋ยวจะยาวเกินไป ถ้ามีโอกาส จะมาเขียนให้ทำงานผ่าน build pipelines ให้ดูว่าพอจะทำยังไงได้บ้าง&lt;/p&gt;

&lt;p&gt;สำหรับใครที่อ่านมาถึงตรงนี้ผมกำลังมองหางานอยู่ครับ ไม่มีงานทำ skill หลัก ๆ จะเป็น iOS ถ้าสนใจอยากทำงานด้วย จิ้มเบา ๆ ไปหาเบอร์โทรหรืออีเมลได้ที่ &lt;a href="https://github.com/ph9/cv"&gt;https://github.com/ph9/cv&lt;/a&gt;&lt;/p&gt;

</description>
      <category>android</category>
      <category>ios</category>
      <category>security</category>
    </item>
    <item>
      <title>มาตรวจดูกันว่า iOS Project เราใช้ dependencies อะไรที่เป็นอันรายหรือไม่ด้วย OWASP Dependency-Check�</title>
      <dc:creator>Wasith Theerapattrathamrong</dc:creator>
      <pubDate>Sun, 19 Apr 2020 08:18:17 +0000</pubDate>
      <link>https://dev.to/ph9/ios-project-dependencies-owasp-dependency-check-54lj</link>
      <guid>https://dev.to/ph9/ios-project-dependencies-owasp-dependency-check-54lj</guid>
      <description>&lt;h1&gt;
  
  
  OWASP Dependency-Chek
&lt;/h1&gt;

&lt;p&gt;td;lr ไปดูตัวอย่าง repo ได้ที่นี่ &lt;a href="https://github.com/PH9/MadeForScan"&gt;https://github.com/PH9/MadeForScan&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  ทำความรู้จัก OWASP &lt;a href="https://owasp.org/www-project-dependency-check/"&gt;Dependency-Check&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;เป็นเครื่องมือตรวจสอบว่าเราใช้ dependencies ที่มีช่องโหว่ที่รู้แล้ว (Common Vulnerabilities and Exposures: CVE) หรือไม่ เมื่อตรวจสอบแล้วจะทำการสร้างรายงานให้เราดูต่อไป&lt;/p&gt;

&lt;p&gt;โดย Dependency-Check เกิดขึ้นมาเพราะว่า OWASP Top 10 (การจัดอันดับสิ่งที่นักพัฒนาชอบทำพลาด ซึ่งส่งผลให้เกิดให้ช่องโหว่ และการโจมตี) ในปี ค.ศ. 2013 พบว่ามีการใช้งานเครื่องมือ หรือชุดคำสั่งที่มีช่องโหว่ อยู่ในลำดับที่ 9&lt;/p&gt;

&lt;h2&gt;
  
  
  ทำยังไง
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;ติดตั้ง &lt;code&gt;dependency-check&lt;/code&gt; โดยสามารถติดตั้งผ่าน &lt;a href="https://brew.sh"&gt;Homebrew&lt;/a&gt; ด้วยคำสั่ง &lt;code&gt;brew install dependency-check&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;ทำการ scan ด้วยคำสั่ง &lt;code&gt;dependency-check --enableExperimental -s . -o .&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;ง่ายมะ... แต่เดี๋ยวก่อน!&lt;/p&gt;

&lt;h3&gt;
  
  
  อธิบายคำสั่ง
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;--enableExperimental&lt;/code&gt; เป็นการเรียกใช้ features ของ Dependency-Check อยู่ยังอยู่ระหว่างการทดสอบ ซึ่ง Coacoapods และ Swift Package Manager ยังเป็น experimental อยู่&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-s, --scan &amp;lt;path&amp;gt;&lt;/code&gt; คือการบอกว่าให้ทำการตรวจสอบที่ path นี้&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-o, --out &amp;lt;path&amp;gt;&lt;/code&gt; คือให้ออกรายงานที่ path นี้&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;โดย default แล้วรายงานจะออกมาเป็น html โดยเราสามารถเลือกได้เป็น HTML, XML, CSV, JSON, JUNIT, หรือ ALL (ทั้งหมด) ด้วยคำสั่ง &lt;code&gt;-f, --format &amp;lt;format&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  ทำอะไรได้เพิ่มอีกบ้าง
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;--junitFailOnCVSS &amp;lt;score&amp;gt;&lt;/code&gt; ระบุว่าจะให้ต้อง score เท่าไหร่ถึงจะผ่านถ้าเอาไปใส่ใน build pipelines ซึ่งจะมีตั้งแต่ 0-10 (ยิ่งต่ำยิ่งดี) ถ้าไม่ระบุ default จะอยู่ที่ 11 ซึ่งแปลว่าผ่านตลอดนั่นเอง โดยคำสั่งนี้จะต้องไว้ข้างหน้า &lt;code&gt;-s &amp;lt;path&amp;gt;&lt;/code&gt; ไม่งั้นอาจจะไม่ทำงานได้&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;--suppression &amp;lt;file&amp;gt;&lt;/code&gt; เป็นการให้ dependency-check ไปอ่านไฟล์ที่รวบรวมรายชื่อ CVE ที่ไม่สนใจได้ โดยโครงสร้างของไฟล์หน้าตาประมาณนี้
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;suppressions&lt;/span&gt; &lt;span class="na"&gt;xmlns=&lt;/span&gt;&lt;span class="s"&gt;"https://jeremylong.github.io/DependencyCheck/dependency-suppression.2.3.xsd"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;suppress&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;notes&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;&amp;lt;![CDATA[
        file name: GoogleUtilities/AppDelegateSwizzler:6.5.2
        ]]&amp;gt;&lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;/notes&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;sha1&amp;gt;&lt;/span&gt;368d339f66194780a65f3e55481ef29a35971cc2&lt;span class="nt"&gt;&amp;lt;/sha1&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;cve&amp;gt;&lt;/span&gt;CVE-2005-0036&lt;span class="nt"&gt;&amp;lt;/cve&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/suppress&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;suppress&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;notes&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;&amp;lt;![CDATA[
        file name: GoogleUtilities/AppDelegateSwizzler:6.5.2
        ]]&amp;gt;&lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;/notes&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;sha1&amp;gt;&lt;/span&gt;368d339f66194780a65f3e55481ef29a35971cc2&lt;span class="nt"&gt;&amp;lt;/sha1&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;cve&amp;gt;&lt;/span&gt;CVE-2005-0861&lt;span class="nt"&gt;&amp;lt;/cve&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/suppress&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/suppressions&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;ถามว่าเราจะรู้ได้ไงว่าจะ ignore ยังไง ตอนที่ Dependency-Check ออก report ถ้าเป็น HTML จะมี ปุ่มสีเทา ๆ เขียนว่า &lt;code&gt;suppress&lt;/code&gt; ให้คลิก และสามารถคัดลอก xml เพื่อมาใส่ได้&lt;/p&gt;

&lt;h3&gt;
  
  
  ถ้าในโปรเจคคุณมี Gemfile, Gemfile.lock
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;คุณอาจจะต้องติดตั้ง bundle-audit ด้วย โดยสามารถติดตั้งได้โดยคำสั่ง &lt;code&gt;[sudo] gem install bundle-audit&lt;/code&gt; เพื่อให้สามารถตรวจสอบได้ เพราะ Dependency-Check ใช้โปรแกรม bundle audit ในการตรวจสอบ gem&lt;/li&gt;
&lt;li&gt;หรือใช้คำสั่ง &lt;code&gt;--disableBundleAudit&lt;/code&gt; ไปซะเลย เพราะยังไง gem จะไม่ถูกรวมเข้าไปใน ipa อยู่แล้ว&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;อ่านต่อ:&lt;/strong&gt; &lt;a href="https://medium.com/@phai/e1c37a0a02e4"&gt;เราไม่ควรใช้ “sudo gem”!!&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Dependencies อะไรที่เกี่ยวกับการพัฒนา iOS แล้ว scan ไม่ได้
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Dependencies ที่มาจาก &lt;a href="https://github.com/Carthage/Carthage"&gt;Carthage&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Dependencies ที่มาจาก &lt;a href="https://brew.sh"&gt;Homebrew&lt;/a&gt; ซึ่งก็ไม่น่าเป็นห่วง เพราะส่วนนี้ไม่ได้ใช้ในโปรเจคอยู่แล้ว&lt;/li&gt;
&lt;li&gt;Dependencies ที่มาจากการ copy ไฟล์ &lt;code&gt;.framework&lt;/code&gt;, &lt;code&gt;.a&lt;/code&gt;, &lt;code&gt;.o&lt;/code&gt; มาวาง&lt;/li&gt;
&lt;li&gt;และจาก Git Submodules&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;สรุปคือตรวจได้แค่ใน &lt;code&gt;Gemfile.lock&lt;/code&gt; กับ &lt;code&gt;Podfile.lock&lt;/code&gt; และจาก Swift Package Manager เท่านั้น 🤣🤣&lt;/p&gt;

&lt;h2&gt;
  
  
  รู้ว่ามีช่องโหว่ แล้วเอาไปทำอะไรได้บ้าง
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;ใช้เป็นข้ออ้างว่า dependencies มีช่องโหว่ เพื่อทำการอัพเดท dependencies ที่ใช้ เพราะบางที่ไม่ยอมให้อัพบ่อย ๆ&lt;/li&gt;
&lt;li&gt;หรือกลับกัน บางที่นักพัฒนาเองทำงานไปเรื่อย ๆ ไม่เคยอัพเดท dependencies เลย&lt;/li&gt;
&lt;li&gt;ยกระดับมาตรฐานของโปรแกรมที่พัฒนา&lt;/li&gt;
&lt;li&gt;ออกคำเตือนสำหรับผู้ใช้โปรแกรมเวอร์ชั่นเก่า ๆ ให้ทำการอัพเดท&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;ส่วนใหญ่ถ้า CVE ออก มันจะมีการแก้ไขก่อนเปิดเผย หรือแก้ไขตามมาในไม่นาน และหลาย ๆ ครั้งการแก้บัคใน open-sources จะมี commit ให้ดูว่าแก้ตรงไหนไป ทำให้ hacker สามารถ reverse engineer ดูได้ง่ายว่าจะทำการโจมตีอย่างไร&lt;/p&gt;

&lt;h2&gt;
  
  
  ป.ล.
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;จะบอกก่อนว่าตัวที่ทำ static scan นั้น มีหลายตัวมาก แต่เจิม dev.to ด้วย OWASP Dependency-Check ก่อนแล้วกัน&lt;/li&gt;
&lt;li&gt;OWASP Dependency-Check ตรวจสอบโปรเจคอื่น ๆ นอกจาก iOS ได้ด้วยนะ เยอะเลยลองไปเล่นกันอยู่ได้&lt;/li&gt;
&lt;li&gt;dev.to ใช้ Markdown format ซึ่งผมชอบเป็นการส่วนตัวอยู่แล้ว แต่พอบทความเป็นภาษาไทยมันจะดูอ่านยากแปลก ๆ นะ 555&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ios</category>
      <category>security</category>
    </item>
  </channel>
</rss>
