ThaiTux.info https://www.thaitux.info อาตาปี สัมปะชาโน สติมา วิเนยยะ โลเก อะภิชฌาโทมะนัสสัง audacity: บันทึกการลดเสียงรบกวน https://www.thaitux.info/node/854 <div class="field field-name-body field-type-text-with-summary field-label-hidden"><div class="field-items"><div class="field-item even"><dl> <dt>กรณีเสียงรบกวนอยู่เป็นพื้นหลัง</dt> <dd> <li>ให้เลือกช่วงที่เป็นเสียงรบกวนพื้นหลัง -&gt; Effect -&gt; Noise Removal -&gt; Get Noise Profile</li> <li>เลือกทั้งหมด -&gt; Effect -&gt; Noise Removal -&gt; OK</li> </dd> <dt>กรณีเสียงรบกวนไม่ใช่เสียงที่คงที่ แต่ขี่อยู่บนเสียงพูด</dt> <dd> <li>เลือกทั้งหมด -&gt; Effect -&gt; Plug ins -&gt; Vocal Remover (for center-panned vocals)...</li> <li>Effect -&gt; Noise Removal -&gt; Get Noise Profile</li> <li>ปิดแทรกนี้ทิ้ง แล้วเปิดใหม่</li> <li>เลือกทั้งหมด -&gt; Effect -&gt; Noise Removal -&gt; OK</li> </dd> </dl> </div></div></div><div class="field field-name-taxonomy-vocabulary-1 field-type-taxonomy-term-reference field-label-above"><div class="field-label">Topic:&nbsp;</div><div class="field-items"><div class="field-item even"><a href="/taxonomy/term/46">multimedia</a></div><div class="field-item odd"><a href="/taxonomy/term/297">audacity</a></div></div></div> Tue, 26 Aug 2014 03:13:19 +0000 wd 854 at https://www.thaitux.info https://www.thaitux.info/node/854#comments python: แปลง html เป็น epub https://www.thaitux.info/node/766 <div class="field field-name-body field-type-text-with-summary field-label-hidden"><div class="field-items"><div class="field-item even"><p>เป็นโปรแกรมเล็ก ๆ ในการช่วยแปลงไฟล์ HTML เป็น <a href="http://idpf.org/epub">EPUB</a> ทำงานได้ในไฟล์เดียว แต่ยังทำงานได้จำกัด ไม่ได้รองรับข้อกำหนดทุกอย่างของ EPUB โดยเฉพาะ HTML5</p> <h3>ดาวน์โหลด</h3> <ul> <li>57-01-24 ยังไม่รองรับ ISBN: <a href="http://www.thaitux.info/files/html_2epub-2014-01-24.tar_.gz">html_2epub-2014-01-24.tar_.gz</a></li> <li>57-01-24 ย้ายพารามิเตอร์รุงรังไปอยู่ใน INC_FILE.py ทั้งหมด : <a href="http://www.thaitux.info/files/html_2epub-2014-01-24.tar__0.gz">html_2epub-2014-01-24.tar__0.gz</a></li> <li>57-01-26 เพิ่มการรองรับ footnote : <a href="http://www.thaitux.info/files/html_2epub-2014-01-26.tar_.gz">html_2epub-2014-01-26.tar_.gz</a></li> </ul> <h3>การปรับปรุง</h3> <ul> <li>57-01-26: เพิ่มการรองรับ footnote โดยโปรแกรมจะค้นหา footnote ที่มีอยู่ และสอดกลับเข้าไปในบทที่เป็นลิงก์ต้นทาง<br /> มีข้อแม้ว่า ต้องขึ้นต้นด้วย <code><br /> <p class="footnote"</code> หรือ <code><br /> <div class="footnote"</code> เท่านั้น</li> </ul> <h3>สมบัติและข้อกำหนด</h3> <ul> <li>แปลง HTML ไฟล์เดี่ยว</li> <li>ต้องเตรียมไฟล์ต้นฉบับ HTML มาก่อน เช่น <ul> <li>บังคับแบ่งบทด้วยแท็ก &lt;!--section_break--&gt; หรือ &lt;!--page_break--&gt;</li> <li>หากไม่มีแท็กแบ่งบทข้างต้น โปรแกรมจะแบ่งด้วยแท็ก &lt;h1&gt; หรือ &lt;h2&gt;</li> <li>อาจแบ่งคำด้วย <a href="http://linux.thai.net/projects/swath">SWATH</a> ซึ่งต้องแบ่งมาก่อน</li> <li>ปรับแต่ง css มาแล้ว ซึ่งอาจเป็นภายในไฟล์ HTML เอง หรือระบุไฟล์ภายใต้ไฟล์ลูก <code>INC_FILE.py</code> ด้วยพารามิเตอร์ <code>-i</code> ก็ได้ (EPUB รองรับ css ไม่ครบทุกคำสั่ง) โดยอันหลังสำคัญกว่าอันแรก คือจะแทนที่ css ในไฟล์ HTML ด้วย css ที่ระบุไว้</li> <li>ถ้ามีบทสารบัญภายในไฟล์ HTML โปรแกรมจะสร้างบทสารบัญไว้ด้วย แต่จะสร้างโค๊ด HTML ขึ้นมาใหม่เพื่อให้สอดคล้องกับ EPUB หากไม่ต้องการให้มีสารบัญอยู่ภายในบท ต้องลบบทสารบัญออกจากไฟล์ต้นฉบับ HTML ออกก่อน</li> </ul> </li> <li>แปลงเป็น EPUB ได้ 3 รุ่น คือ 2.0, 2.0.1 และ 3.0 ระบุด้วยพารามิเตอร์ <code>-ver</code> ค่าปริยายคือ 2.0.1</li> <li>ระบุจำนวนชั้นของสารบัญได้ ด้วยพารามิเตอร์ <code>-toclevel N</code> ค่าปริยายคือ 3</li> <li>ไฟล์ประกอบ เช่น ไฟล์ภาพ,ไฟล์ฟอนต์ และอื่น ๆ ต้องเตรียมด้วยมือเอง โดยใส่ไว้ภายใต้ไดเรคทอรี่ที่ระบุในพารามิเตอร์ <code>-incdir DIR</code> ทุกไฟล์และไดเรคทอรี่ภายใต้ <code>DIR/</code> จะถูกคัดลอกไปยังไดเรคทอรี่ของ EPUB ชื่อ <code>OEBPS/</code> ซึ่งถือเป็นไดเรคทอรี่รากของ EPUB เวลาเราอ้างถึงไฟล์จากคำสั่งใน css หรือคำสั่งใน HTML จะอิงกับไดเรคทอรี่รากนี้เสมอ</li> <li>เมื่อโปรแกรมทำงานเสร็จ จะทิ้งไดเรคทอรี่งานเอาไว้ ชื่อ <code>epubdir</code> เพื่อประโยชน์ในการดีบั๊ก เมื่อเสร็จงานแล้ว สามารถลบทิ้งด้วยมือ และในการสั่งงานโปรแกรมแต่ละครั้ง ทุกอย่างภายใต้ไดเรคทอรี่นี้ จะถูกลบทิ้งและสร้างขึ้นใหม่ ดังนั้นหากมีการแก้ไขเพื่อทดสอบ ควรแบคอัพไว้ก่อน และหากไม่ต้องการรันโปรแกรมใหม่ แต่เป็นการแก้ไขเพื่อทดสอบ ให้ใช้คำสั่งเชลล์ในการสร้าง EPUB ดังนี้<br /> <pre>$ <strong>cd epubdir</strong> $ <strong>zip -qX0 ../FILE.epub mimetype</strong> $ <strong>zip -qrX9 ../FILE.epub * -x mimetype</strong> $ <strong>cd -</strong> </pre></li> <li>เขียนแบบ quick&amp;dirty ค่อย ๆ คลำไป บั๊กเยอะแน่นอน</li> </ul> <h3>หมายเหตุในการทดสอบ</h3> <ul> <li>เลือกใช้รุ่น 2.0.1 เป็นค่าปริยาย เพราะ Google Play Books แสดงผลสารบัญแบบหลายชั้นได้ไม่ครบถ้วน และความรู้ยังไม่พอศึกษาและทดสอบ HTML5</li> <li>ใช้โปรแกรม <a href="https://github.com/IDPF/epubcheck">epubcheck</a> ในการตรวจสอบความถูกต้องของไฟล์ epub ที่ได้</li> <li>การฝังฟอนต์ ยังไม่ได้ทดสอบ เพราะโปรแกรมอ่านอีบุ๊คในท้องตลาดยังรองรับภาษาไทยและ opentype ไม่เต็มที่</li> <li>การทดสอบการแสดงผล ส่วนใหญ่ทดสอบใน EPUBReader Extensions ในไฟร์ฟอกซ์, Google Play Books บน Desktop/Android และ iBooks บน Mac/iOS ก็แสดงผลได้ดีพอควร มีข้อสังเกตุคือ <ul> <li>EPUBReader Extensions แสดงขนาดฟอนต์ได้ไม่คงที่นัก</li> <li>Google Play Books บน Desktop แสดงผลได้ค่อนข้างดี สารบัญแสดงครบ</li> <li>Google Play Books บน Android แสดงได้พอใช้ มีการแสดงผลตัวเอียงผิดสลับมาบ้าง สารบัญหลายชั้นของรุ่น 3.0 แสดงผิดเป็นบรรทัดว่าง และของรุ่น 2.0 แสดงแค่ชั้นเดียว</li> <li>iBooks ทั้งบน Mac และ iOS แสดงผลได้ดีเลิศ รองรับ CSS กว้างที่สุด แต่บน iOS7 ทำงานกับภาษาไทยได้ช้ามาก</li> </ul> </li> </ul> </ul> <h3>การใช้งาน</h3> <p>ลองใช้งานด้วยคำสั่ง</p> <pre>$ <strong>./html_2epub.py</strong></pre><p>ได้ผลเป็น</p> <pre>Usage: html_2epub.py [-showvar] [-ver EPUB_VER] [-ctl] [-toclevel N] [-i INC_FILE.py] [-c COVERIMG] [-incdir INC_DIR] FILE.html [FILE.epub] Convert one html file to epub. Parameters: -showvar: show internal variables that can modify for properly convert. example: html_2epub.py -showvar > INC_FILE.py. -ver: EPUB version ['2.0', '2.0.1', '3.0'], default '2.0.1'. -ctl: convert html tag to lowercase, not necessary if tag is already lower. -toclevel N: max level of TOC (default is 3). -i: include additional variables from INC_FILE.py. -c: cover image (jpg,png,gif). -incdir: include directory (will copy all files/dir in this dir into OEBPS/). To do: - ISBN supported, currently just use UUID. </pre><p>ลองสร้างไฟล์ลูก</p> <pre>$ <strong>./html_2epub.py -showvar > INC_FILE.py</strong> $ <strong>cat INC_FILE.py</strong></pre><p>ได้เป็น</p> <pre>#!/usr/bin/env python # coding=utf-8 # ---------- html_2epub.py SECTION ---------- # # variable that can be overriden. #VARIABLE ORDER: no order required. #-----type: STRING, will REPLACE default variable of same name----- #style_file : stylesheet file to replace original in html file. style_file = "" #language : language to be used, ('ENGLISH','THAI' : default THAI). language = "THAI" #book_uuid : UUID book identifier. book_uuid = "7a27330a-ebec-4fe9-9eb3-d8f09a75e789" #book_isbn : ISBN book identifier. book_isbn = "" #-----type: STRING, will APPEND default variable of same name----- #-----type: LIST, will APPEND default variable of same name----- #add_toc_brk_list : additional tags to be use for breaking chapter: [ [TAG,LEVEL],...]. add_toc_brk_list = [] #mod_toc_title_list : text to override default toc header and toc level: [ [CHAP_FILE#ID,LABEL,LEVEL],...] (use LEVEL=0 is no modified). mod_toc_title_list = [] </pre><p>หลังจากปรับแต่งไฟล์ <code>INC_FILE.py</code> แล้ว ลองใช้งานจริงด้วยคำสั่ง</p> <pre>$ <strong>./html_2epub.py -i INC_FILE.py INFILE.html OUTFILE.epub</strong></pre></div></div></div><div class="field field-name-upload field-type-file field-label-hidden"><div class="field-items"><div class="field-item even"><table class="sticky-enabled"> <thead><tr><th>Attachment</th><th>Size</th> </tr></thead> <tbody> <tr class="odd"><td><span class="file"><img class="file-icon" alt="Binary Data" title="application/octet-stream" src="/modules/file/icons/application-octet-stream.png" /> <a href="https://www.thaitux.info/files/html_2epub-2014-01-24.tar_.gz" type="application/octet-stream; length=10653" title="html_2epub-2014-01-24.tar_.gz">html_2epub-2014-01-24.tar_.gz</a></span></td><td>10.4 KB</td> </tr> <tr class="even"><td><span class="file"><img class="file-icon" alt="Binary Data" title="application/octet-stream" src="/modules/file/icons/application-octet-stream.png" /> <a href="https://www.thaitux.info/files/html_2epub-2014-01-24.tar__0.gz" type="application/octet-stream; length=10862" title="html_2epub-2014-01-24.tar_.gz">html_2epub-2014-01-24.tar_.gz</a></span></td><td>10.61 KB</td> </tr> <tr class="odd"><td><span class="file"><img class="file-icon" alt="Binary Data" title="application/octet-stream" src="/modules/file/icons/application-octet-stream.png" /> <a href="https://www.thaitux.info/files/html_2epub-2014-01-26.tar_.gz" type="application/octet-stream; length=11341" title="html_2epub-2014-01-26.tar_.gz">html_2epub-2014-01-26.tar_.gz</a></span></td><td>11.08 KB</td> </tr> </tbody> </table> </div></div></div><div class="field field-name-taxonomy-vocabulary-1 field-type-taxonomy-term-reference field-label-above"><div class="field-label">Topic:&nbsp;</div><div class="field-items"><div class="field-item even"><a href="/taxonomy/term/7">python</a></div><div class="field-item odd"><a href="/taxonomy/term/352">epub</a></div></div></div> Thu, 23 Jan 2014 17:33:45 +0000 wd 766 at https://www.thaitux.info https://www.thaitux.info/node/766#comments inkscape: ตัวอย่างสคริปต์ส่วนขยาย สำหรับขยายหน้ากระดาษ https://www.thaitux.info/node/761 <div class="field field-name-body field-type-text-with-summary field-label-hidden"><div class="field-items"><div class="field-item even"><p>งานต้นฉบับสำหรับส่งโรงพิมพ์ สำหรับหน้าที่มีภาพชิดขอบ เราจำเป็นต้องเผื่อขอบให้มากกว่าขนาดกระดาษจริงด้านละ 3 มม. เพื่อกันตัดขอบพลาด ดังนั้นเวลาเตรียมต้นฉบับ ต้องเผื่อขนาดหน้าไว้ +6 มม.เสมอ</p> <p>เราจะทำ <a href="http://www.inkscape.org">Inkscape</a> <a href="http://wiki.inkscape.org/wiki/index.php/Script_extensions">Script Extensions</a> ด้วยไพธอน เพื่อใช้ในการนี้ในการรันแปลงไฟล์ภาพทีละหลาย ๆ ไฟล์ได้</p> <!--break--><p>สคริปต์ตัวอย่าง จะเป็นสคริปต์ที่ใช้ขยายหน้ากระดาษของ Inkscape ออกด้านละ 3 มม. พร้อมกับขยับวัตถุทุกอย่างขึ้นข้างบนและไปทางขวา ด้านละ 3 มม. (ทั้งนี้เวลาเตรียมงานขั้นต้น เราจะจัดให้ลงหน้าตรงกลาง และเผื่อขนาดภาพพื้นหลังออกไปทางขอบทุกด้าน ซึ่งก็เป็นธรรมชาติของการทำงานอยู่แล้ว)</p> <p>จะตั้งชื่อส่วนขยายนี้ว่า <code>expand_3mm</code> จะต้องสร้างไฟล์ 2 ไฟล์ คือ Extension description file (.inx) และ Python script file (.py) แล้วใส่ลงในไดเรคทอรี่ <code>~/.config/inkscape/extensions/</code> หรือหากต้องการให้ใช้ได้กับทุกคนก็ใส่ลงใน <code>/usr/share/inkscape/extensions</code></p> <p>ดังนี้</p> <h3>Extension description file: expand_3mm.inx</h3> <pre>$ <strong>vi ~/.config/inkscape/extensions/expand_3mm.inx</strong></pre><pre> &lt;inkscape-extension&gt; &lt;_name&gt;Expand 3mm&lt;/_name&gt; &lt;id&gt;org.ekips.filter.expand_3mm&lt;/id&gt; &lt;dependency type="executable" location="extensions"&gt;expand_3mm.py&lt;/dependency&gt; &lt;dependency type="executable" location="extensions"&gt;inkex.py&lt;/dependency&gt; &lt;dependency type="executable" location="extensions"&gt;simpletransform.py&lt;/dependency&gt; &lt;effect&gt; &lt;object-type&gt;all&lt;/object-type&gt; &lt;effects-menu&gt; &lt;submenu _name="Example"/&gt; &lt;/effects-menu&gt; &lt;/effect&gt; &lt;script&gt; &lt;command reldir="extensions" interpreter="python"&gt;expand_3mm.py&lt;/command&gt; &lt;/script&gt; &lt;/inkscape-extension&gt; </pre><h3>Python script file: expand_3mm.py</h3> <pre>$ <strong>vi ~/.config/inkscape/extensions/expand_3mm.py</strong></pre><pre> #!/usr/bin/env python # These two lines are only needed if you don't put the script directly into the installation directory import sys sys.path.append('/usr/share/inkscape/extensions') # We will use the inkex module with the predefined Effect base class. import inkex, simpletransform class Expand3mmEffect(inkex.Effect): """ Example Inkscape effect extension. """ def __init__(self): """ Constructor. """ # Call the base class constructor. inkex.Effect.__init__(self) def effect(self): """ Effect behaviour. """ #MOVE 3mm,3mm add = 10.629878067 #3mm transformation = 'translate(%s,%s)' % (add,add,) transform = simpletransform.parseTransform(transformation) if self.selected: for id, node in self.selected.iteritems(): simpletransform.applyTransformToNode(transform, node) #EXPAND 6mm svg = self.document.getroot() width = float(svg.get('width')) + (add * 2) #6mm height = float(svg.get('height')) + (add * 2) #6mm svg.set('width','%s' % (width,)) svg.set('height','%s' % (height,)) # Create effect instance and apply it. effect = Expand3mmEffect() effect.affect() # vim: expandtab shiftwidth=4 tabstop=8 softtabstop=4 encoding=utf-8 textwidth=99 </pre><p> เสร็จแล้ว<br /> ทดสอบว่าสคริปต์ใช้ได้หรือไม่ ด้วยการลองเปิด inkscape ดู จะเห็นอยู่ในเมนู <code>Extensions -> Example -> Expand 3mm</code><br /> หรือผ่านบรรทัดคำสั่งว่า</p> <pre>$ <strong>inkscape --verb-list | grep expand_3mm</strong></pre><p>จะขึ้นมาว่า</p> <pre> org.ekips.filter.expand_3mm: Expand 3mm org.ekips.filter.expand_3mm.noprefs: Expand 3mm (No preferences) </pre><h3>ตัวอย่างการรันด้วยบรรทัดคำสั่ง</h3> <p>เปิดไฟล์ demo.svg -> Select All in All Layers -> ขยายขนาด -> บันทึกกลับ -> ปิด inkscape</p> <pre>$ <strong>inkscape demo.svg --verb=EditSelectAllInAllLayers --verb=org.ekips.filter.expand_3mm --verb=FileSave --verb=FileClose</strong></pre><p> เสร็จแล้ว</p> <h3>ที่มา</h3> <ul> <li><a href="http://wiki.inkscape.org/wiki/index.php/PythonEffectTutorial">PythonEffectTutorial</a></li> <li><a href="http://www.hoboes.com/Mimsy/hacks/write-inkscape-extension-create-multiple-duplicates/">Mimsy: Write an Inkscape extension: create multiple duplicates</a></li> <li>ตัวอย่างจากไฟล์อื่น ๆ ใน <code>/usr/share/inkscape/extensions</code> รวมทั้งตัว inkex.py ด้วย</li> </ul> </div></div></div><div class="field field-name-taxonomy-vocabulary-1 field-type-taxonomy-term-reference field-label-above"><div class="field-label">Topic:&nbsp;</div><div class="field-items"><div class="field-item even"><a href="/taxonomy/term/7">python</a></div><div class="field-item odd"><a href="/taxonomy/term/251">inkscape</a></div></div></div> Sat, 11 Jan 2014 15:42:27 +0000 wd 761 at https://www.thaitux.info https://www.thaitux.info/node/761#comments debian: ติดตั้ง OS X Guest ใน VirtualBox https://www.thaitux.info/node/760 <div class="field field-name-body field-type-text-with-summary field-label-hidden"><div class="field-items"><div class="field-item even"><p>มีงานที่ต้องการทดสอบการแสดงผล ของ Safari/iBooks ใน iPhone/iPad (iOS) และ Mac (OS X) จึงต้องลง OS X เพื่อทดสอบ แอปที่จะใช้ คือ iBooks, iBooks Author และ Xcode ต้องการทรัพยากรเป็น Mavericks (10.9) แต่ Mavericks ไม่มีแผ่นขาย มีขายแต่ Snow Leopard (10.6.3) จึงต้องมีขั้นตอนเยอะหน่อย</p> <!--break--><h3>ระบบที่ใช้ทดสอบ</h3> <p>host: <strong>Debian 3.12-1-amd64</strong><br /> cpu: <strong>Intel(R) Core(TM) i7-3770 CPU @ 3.40GHz</strong><br /> ram: <strong>8G</strong><br /> VirtualBox: <strong>Official 4.3</strong></p> <h3>ขั้นตอน</h3> <ul> <li>1.ติดตั้ง Snow Leopard (10.6) เพื่อจะสามารถดาวน์โหลด Mavericks (10.9) ได้ และนำมาสร้างเป็นไฟล์ iso เพื่อติดตั้งต่อไป</li> <li>2.ติดตั้ง Mavericks</li> </ul> <h3>ต้องเตรียม</h3> <ul> <li><a href="http://store.apple.com/th/product/MC573Z/A/mac-os-x-106-snow-leopard">ซื้อแผ่น Snow Leopard (10.6)</a> ราคา 620 บาท บวกค่าส่งอีก 300 บาท (ต้องสมัคร/ใช้บัญชี Apple ID)</li> <li><a href="http://www.tonymacx86.com/downloads.php?do=file&amp;id=156">iBoot Ivy Bridge 1.1.0</a> สำหรับบูตเข้า Snow Leopard (ต้องลงทะเบียน) แตกไฟล์แล้วเก็บไฟล์ <code>iBoot-Ivy-Bridge.iso</code> ไว้ (ถ้าบูตไม่ผ่าน ลองดาวน์โหลด iBoot ตัวอื่นดู)</li> <li>เนื้อที่ว่างของฮาร์ดดิสก์ ประมาณ 30-60 GB</li> </ul> <h2>1.ติดตั้ง Snow Leopard</h2> <p>เอา VirtualBox สร้าง Virtual Machine ใหม่ดังนี้</p> <pre> Name: <strong>osx</strong> Type: <strong>Max OS X</strong> Version: <strong>Mac OS X (64 bit)</strong> Memory size: <strong>2048</strong> Hard drive: <strong>virtual hard drive 30.00GB VDI (VirtualBox Disk Image)</strong> (ค่าปริยาย 20G ไม่พอ) Storage on physical hard drive: <strong>Dynamically allocated</strong> </pre><p> ตั้งค่าอื่น</p> <pre> System: Motherboard: <strong>ยกเลิก</strong> Enable EFI (special OSes only) Display: Video: <strong>Enable 3D Acceleration</strong> Storage: Controller: SATA -> Empty เปลี่ยน Attributes: Choose a virtual CD/DVD disk file: <strong>เปลี่ยนเป็น iBoot-Ivy-Bridge.iso ที่เตรียมไว้</strong> </pre><p> ส่วนที่เหลือ ใช้ค่าปริยายทั้งหมด</p> <p>เสร็จแล้วก็บูตเข้า iBoot ต่อด้วย Snow Leopard เพื่อติดตั้ง</p> <p>ตอนบูตเข้า iBoot ให้ใส่แผ่น Snow Leopard ในซีดีรอม แล้วเปลี่ยน Devices เป็น Host Drive ATAPI แล้วกด F5 เพื่อรีเฟรช แล้วจึงบูตติดตึ้ง Snow Leopard</p> <pre> Devices -> CD/DVD devices -> Host Drive ATAPI (sr0) กด F5 บูตด้วย Mac OS X Install DVD </pre><p> ติดตั้งตามปกติ ระหว่างติดตั้งต้องมีการสร้างพาร์ติชั่นด้วย</p> <pre> Utilities -> Disk Utility เลือก 32.21 GB VBOX HARDISK -> Partition -> <strong>+</strong> -> Name: <strong>osx</strong> <strong>Apply</strong> </pre><p> ติดตั้งต่อจนเสร็จ</p> <p>บูตเข้าระบบโดยต้องกลับไปใช้ <code>iBoot-Ivy-Bridge</code> อีกครั้ง แล้วเลือกเข้า osx ที่ติดตั้งเสร็จแล้ว<br /> ถ้าบูตไม่ขึ้น ให้ลองปิดและบูตใหม่</p> <p>หลังติดตั้งเสร็จเรียบร้อย ให้อัปเดตระบบ เพื่อให้มี App Store</p> <pre> Apple -> Software Update </pre><p> อัปเดตเสร็จ รีบูตใหม่ ระบบจะกลายเป็น 10.6.8 และมี App Store เรียบร้อย</p> <p>ดาวน์โหลด Mavericks ผ่าน AppStore ขนาดประมาณ 5.3GB (5GiB)<br /> เมื่อเสร็จ ไฟล์ที่ได้จะอยู่ที่ <code>/Applications/Install OS X Mavericks.app</code></p> <p>แปลงเป็น iso เพื่อจะนำไปติดตั้งในขั้นตอนต่อไป<br /> เข้า Terminal </p> <pre>Applications -> Utilities -> Terminal</pre><p> แล้วพิมพ์คำสั่งดังนี้</p> <pre> # Mount the installer image hdiutil attach /Applications/Install\ OS\ X\ Mavericks.app/Contents/SharedSupport/InstallESD.dmg -noverify -nobrowse -mountpoint /Volumes/install_app # Convert the boot image to a sparse bundle hdiutil convert /Volumes/install_app/BaseSystem.dmg -format UDSP -o /tmp/Mavericks # Increase the sparse bundle capacity to accommodate the packages hdiutil resize -size 8g /tmp/Mavericks.sparseimage # Mount the sparse bundle for package addition hdiutil attach /tmp/Mavericks.sparseimage -noverify -nobrowse -mountpoint /Volumes/install_build # Remove Package link and replace with actual files rm /Volumes/install_build/System/Installation/Packages cp -rp /Volumes/install_app/Packages /Volumes/install_build/System/Installation/ # Unmount the installer image hdiutil detach /Volumes/install_app # Unmount the sparse bundle hdiutil detach /Volumes/install_build # Resize the partition in the sparse bundle to remove any free space hdiutil resize -size `hdiutil resize -limits /tmp/Mavericks.sparseimage | tail -n 1 | awk '{ print $1 }'`b /tmp/Mavericks.sparseimage # Convert the sparse bundle to ISO/CD master hdiutil convert /tmp/Mavericks.sparseimage -format UDTO -o /tmp/Mavericks # Remove the sparse bundle rm /tmp/Mavericks.sparseimage # Rename the ISO and move it to the desktop mv /tmp/Mavericks.cdr ~/Desktop/Mavericks.iso </pre><p> คัดลอก <code>Mavericks.iso</code> บน Desktop มาสู่เครื่องจริง (อาจผ่าน usb หรือเน็ตเวิร์ค - ผมใช้ผ่านเน็ตเวิร์ค) เพื่อจะนำไปติดตั้งในขั้นตอนต่อไป</p> <p>ปิดเครื่อง</p> <p>จบขั้นแรก</p> <p>หากต้องการทดสอบ Snow Leopard ต่อไปก็สามารถเก็บ Virtual Machine "osx" นี้ไว้ได้ แต่หากไม่ต้องการใช้แล้วก็ลบทิ้งได้เลย</p> <h3>ที่มา</h3> <ul> <li><a href="http://techventura.wordpress.com/2012/12/04/install-mac-os-x-snow-leopard-in-VirtualBox-4-2-efi-method/">Install Mac OS X (Snow Leopard) in VirtualBox 4.2 (EFI Method)</a></li> <li><a href="http://tonymacx86.blogspot.com/2010/04/iboot-multibeast-install-mac-os-x-on.html">iBoot + MultiBeast: Install Mac OS X on any Intel-based PC</a></li> <li><a href="http://forums.appleinsider.com/t/159955/howto-create-bootable-mavericks-iso">HOWTO: Create bootable Mavericks ISO </a></li> </ul> <h2>2.ติดตั้ง Mavericks</h2> <p>เอา VirtualBox สร้าง Virtual Machine ใหม่ดังนี้ </p> <pre> Name: <strong>osx64</strong> Type: <strong>Max OS X</strong> Version: <strong>Mac OS X (64 bit)</strong> Memory size: <strong>2048</strong> Hard drive: <strong>virtual hard drive 30.00GB VDI (VirtualBox Disk Image)</strong> (ถ้าต้องใช้งานจริงจัง ควรเป็น 40G ขึ้นไป) Storage on physical hard drive: <strong>Dynamically allocated</strong> </pre><p> คราวนี้ไม่ต้องใช้ iBoot แล้ว โดยจะใช้ <code>Mavericks.iso</code> ที่ได้จากขั้นตอนก่อนหน้ามาทำเป็น virtual CD/DVD disk file<br /> สำหรับบูตเพื่อติดตั้ง และไม่ต้องยกเลิก EFI แล้ว</p> <p>ตั้งค่าอื่น</p> <pre> System: Processor: <strong>2</strong> CPU Display: Video: Video Memory: <strong>32</strong> MB (ใช้ค่าอื่นแล้วเปิด System Information ไม่ได้) <strong>Enable 3D Acceleration</strong> Storage: Controller: SATA -> Empty เปลี่ยน Attributes: Choose a virtual CD/DVD disk file: <strong>เปลี่ยนเป็น Mavericks.iso ที่เตรียมไว้</strong> </pre><p> ก่อนจะบูต ให้บอก VirtualBox ว่าจะติดตั้งเป็น 64 บิต และเลือกหน้าจอเป็นขนาด 1440x900<br /> เข้า Terminal ของลินุกซ์ แล้วพิมพ์ดังนี้</p> <pre> VM=osx64 N=4 #N can be one of 0,1,2,3,4,5 referring to the 640x480, 800x600, 1024x768, 1280x1024, 1440x900, 1920x1200 screen resolution respectively (5 may not worked). VBoxManage modifyvm "$VM" --firmware efi64 VBoxManage setextradata "$VM" VBoxInternal2/EfiGopMode $N VBoxManage setextradata "$VM" VBoxInternal2/SmcDeviceKey "ourhardworkbythesewordsguardedpleasedontsteal(c)AppleComputerInc" </pre><p> แล้วก็เริ่มสตาร์ท osx64 เพื่อติดต้้งได้เลย บูตครั้งแรกอาจนานหน่อยและมีรายงานความผิดพลาดเยอะ แต่ไม่ต้องสนใจ</p> <p>วิธีติดตั้งเหมือนเดิม คือต้องพาร์ติชั่นก่อน แล้วติดตั้งต่อจนจบ</p> <p>ตอนบูตครั้งแรก อย่าลืมเปลี่ยน virtual CD/DVD จาก Mavericks กลับเป็น Host Drive ATAPI (sr0)</p> <p>จบแล้ว</p> <h3>ที่มา</h3> <ul> <li><a href="http://ntk.me/2012/09/07/os-x-on-os-x/">OS X on OS X: Running OS X on VirtualBox</a></li> </ul> <h3>รายงานผล</h3> <ul> <li>Snow Leopard: เปิด About this Mac ไม่ได้</li> <li>Mavericks: การรันไม่ค่อยลื่นเท่าไหร่ แต่ก็พอใช้งาน test/debug Safari/iBooks ตามจุดประสงค์หลักได้</li> <li>ใช้ปุ่ม Alt ขวามือ แทนปุ่ม Command ใน Mac</li> <li>Mouse wheel หมุนกลับทางกับของลินุกซ์/วินโดวส์</li> </ul> </div></div></div><div class="field field-name-taxonomy-vocabulary-1 field-type-taxonomy-term-reference field-label-above"><div class="field-label">Topic:&nbsp;</div><div class="field-items"><div class="field-item even"><a href="/taxonomy/term/3">debian</a></div><div class="field-item odd"><a href="/taxonomy/term/230">virtualbox</a></div><div class="field-item even"><a href="/taxonomy/term/312">virtualization</a></div><div class="field-item odd"><a href="/taxonomy/term/344">os x</a></div></div></div> Fri, 10 Jan 2014 13:22:42 +0000 wd 760 at https://www.thaitux.info https://www.thaitux.info/node/760#comments python: ทำโปรแกรมแปลงบาลี https://www.thaitux.info/node/757 <div class="field field-name-body field-type-text-with-summary field-label-hidden"><div class="field-items"><div class="field-item even"><p>มีงานต้องแปลงบทสวดมนต์จากไทยไปอังกฤษ แต่ยาวมากถึงเกือบ ๓๐๐ บท ทำเสร็จแล้วจึงเขียนโปรแกรมเพื่อตรวจทานและเพื่อกันไม่ให้ลืม ต่อด้วยขยายความสามารถให้แปลได้หลาย ๆ ภาษา คิดว่าคงจะมีโอกาสใช้งานภายหลัง</p> <p>ใครมีโอกาสใช้งาน รบกวนช่วยทดสอบให้ด้วยครับ</p> <h3>ดาวน์โหลด</h3> <ul> <li>56-12-24: แก้บั๊กสระอาตัวสูงเมื่อใช้กับ ข และ ง (ภาษาพม่า) <a href="http://www.thaitux.info/files/pali_convert-2013-12-24.tar_.gz">pali_convert-2013-12-24.tar_.gz</a></li> <li>ดาวน์โหลดได้ที่ <a href="http://www.thaitux.info/files/pali_convert-2013-12-23.tar_.gz">python: โปรแกรมแปลงบาลี</a></li> </ul> <h3>ข้อจำกัด</h3> <ul> <li>ยังใช้ Python 2 อยู่</li> <li>ไฟล์ตั้งต้นได้แค่ภาษาอังกฤษแบบบาลี ไทยบาลี ไทยแบบง่าย และพม่าบาลี เนือ่งจากภาษาเหล่านี้มีตัวอักษรครบ</li> <li>สำหรับการแปลงเป็นไทยแบบง่าย มีหลายมาตรฐาน ตัดสินใจไม่แยกอักษรควบ ทำให้บางครั้งคำดูแปลก เช่น นิโค๎รธะ และ วิรุโฬ๎ห (แทนที่จะเป็น นิค๎โรธะ และ วิรุฬ๎โห) การแปลงกลับไปมาอาจให้ผลไม่เหมือนเดิม</li> <li>โปรแกรมยาวเกินจำเป็น และบั๊กเยอะแน่นอน อาจต้องแก้ผลลัพธ์ด้วยมือภายหลัง (ถ้ามีเวลาจะกลับมาแก้ให้สมบูรณ์ยิ่งขึ้น)</li> </ul> <!--break--><h3>การใช้งาน</h3> <p>ลองใช้งานด้วยคำสั่ง</p> <pre>$ <strong>./pali_convert.py</strong></pre><p>ได้ผลเป็น</p> <pre> Usage: pali_convert.py -f LANG -t LANG INFILE [OUTFILE] Options: -f, --from: convert from language. -t, --to: convert to language. Languages: * engpali : Pali English (asevnā ca bālānaṃ, paṇḍitānañca sevnā ฯ) eng : Simple English (asevna ca balanam, panditananca sevna ฯ) * thaipali : Pali Thai (อเสวฺนา จ พาลานํ, ปณฺฑิตานญฺจ เสวฺนา ฯ) * thai : Simple Thai (อะเสว๎นา จะ พาลานัง, ปัณฑิตานัญจะ เสว๎นา ฯ) lao : Simple Lao (อະເສວນາ ຈະ ພາລານັງ, ປັນດິຕານັຍຈະ ເສວນາ ຯ) * burmpali : Pali Burmese (အသေဝ္နါ စ ဗာလာနံ, ပဏ္ဍိတာနည္စ သေဝ္နါ ฯ) (* = Supported input language, eg. convert from) </pre><p> สมมุติจะแปลงจากไทยแบบง่าย เป็นอังกฤษแบบง่าย ก็สั่งด้วย</p> <pre>$ <strong>./pali_convert.py -f thai -t engpali THAI.txt ENG.txt</strong></pre><pre>Convert from thai (THAI.txt) to eng (ENG.txt) success.</pre><p> ไฟล์ที่จะแปลง</p> <pre>$ <strong>cat THAI.txt</strong></pre><pre>อุปปาตะสันติ นะโม ตัสสะ ภะคะวะโต อะระหะโต สัมมาสัมพุทธัสสะ. คันถารัมภะ (ก) สุทุททะโส อะยัง ธัมโม โลกัตถัง ชินะเทสิโต มะหาสันติกะโร โลเก สัพพะสัมปัตติทายะโก. (ข) สัพพุปปาตูปะสะมะโณ ภูตะยักขะนิวาระโณ อะกาละมัจจุสะมะโณ โสกะโรคะวินาสะโน. (ค) ปะระจักกะปะมัททะโน รัญโญ วิชะยะวัฑฒะโน สัพพานิฏฐะหะโร สันโต ธัมมัง วักขามิ ภูตะโต. (ฆ) วัตถุตตะยัสสะ โย ยัตถะ สังวัณเณติ คุณุตตะเม ตัสสะ ตัตถะ สุขาโรค๎ยะ- โสตถิโย โหนติ สัพพะทา. </pre><p> ได้ผลเป็น</p> <pre>$ <strong>cat ENG.txt</strong></pre><pre> uppatasanti namo tassa bhagavato arahato sammasambuddhassa. gantharambha (k) sududdaso ayam dhammo lokattham jinadesito mahasantikaro loke sabbasampattidayako. (kh) sabbuppatupasamano bhutayakkhanivarano akalamaccusamano sokarogavinasano. (g) paracakkapamaddano ranno vijayavaddhano sabbanitthaharo santo dhammam vakkhami bhutato. (gh) vatthuttayassa yo yattha sanvanneti gunuttame tassa tattha sukharogya- sotthiyo honti sabbada. </pre></div></div></div><div class="field field-name-upload field-type-file field-label-hidden"><div class="field-items"><div class="field-item even"><table class="sticky-enabled"> <thead><tr><th>Attachment</th><th>Size</th> </tr></thead> <tbody> <tr class="odd"><td><span class="file"><img class="file-icon" alt="Binary Data" title="application/octet-stream" src="/modules/file/icons/application-octet-stream.png" /> <a href="https://www.thaitux.info/files/pali_convert-2013-12-23.tar_.gz" type="application/octet-stream; length=5712" title="pali_convert-2013-12-23.tar_.gz">pali_convert-2013-12-23.tar_.gz</a></span></td><td>5.58 KB</td> </tr> <tr class="even"><td><span class="file"><img class="file-icon" alt="Binary Data" title="application/octet-stream" src="/modules/file/icons/application-octet-stream.png" /> <a href="https://www.thaitux.info/files/pali_convert-2013-12-24.tar_.gz" type="application/octet-stream; length=5761" title="pali_convert-2013-12-24.tar_.gz">pali_convert-2013-12-24.tar_.gz</a></span></td><td>5.63 KB</td> </tr> </tbody> </table> </div></div></div><div class="field field-name-taxonomy-vocabulary-1 field-type-taxonomy-term-reference field-label-above"><div class="field-label">Topic:&nbsp;</div><div class="field-items"><div class="field-item even"><a href="/taxonomy/term/7">python</a></div><div class="field-item odd"><a href="/taxonomy/term/340">pali</a></div></div></div> Mon, 23 Dec 2013 13:21:18 +0000 wd 757 at https://www.thaitux.info https://www.thaitux.info/node/757#comments bash: สคริปต์คัดลอกผู้ใช้ https://www.thaitux.info/node/755 <div class="field field-name-body field-type-text-with-summary field-label-hidden"><div class="field-items"><div class="field-item even"><p>สคริปต์คัดลอกผู้ใช้จากระบบปัจจุบันไปยังไดเรคทอรี่ที่ติดตั้งลินุกซ์อีกตัวหนึ่ง<br /> มีประโยชน์สำหรับติดตั้งลินุกซ์หลายตัว และต้องการให้ผู้ใช้เหมือนกับระบบปัจจุบัน ตัวอย่างการใช้งานเช่น</p> <ul> <li>ติดตั้งลินุกซ์ผ่าน debootstrap</li> <li>ติดตั้งลินุกซ์โดยการเมานต์ live cd แล้วคัดลอก squashfs มาติดตั้งโดยตรง</li> </ul> <p>ข้อกำหนดคือ</p> <ul> <li>ต้องใช้สิทธิ์ root ในการรัน</li> <li>ต้องเป็นลินุกซ์ที่มีการเก็บไฟล์ผู้ใช้แบบมาตรฐาน คือเก็บที่ไฟล์ <code>/etc/passwd</code>, <code>/etc/group</code> และ <code>/etc/shadow</code></li> </ul> <p>สคริปต์มีดังนี้</p> <pre>$ <strong>sudo vi /usr/local/sbin/transfer_users.sh</strong></pre><pre>#!/bin/bash function usage() { cat &lt;&lt;EOF Usage: $0 DESTINATION Transfer users from current linux system to DESTINATION directory that have another linux system. Run as root. EOF exit 1 } DEST=$1 if [ ! "$UID" == "0" ]; then echo "Please run as root." usage fi if [ ! -d "$DEST" ]; then echo "DESTINATION directory not found." usage fi if [ ! -d "$DEST/etc" ]; then echo "DESTINATION/etc directory not found." usage fi US=`ls /home` TMP=/tmp/${RANDOM}.txt #SORT ON UID for i in $US; do UUID=`grep ":/home/${i}:" /etc/passwd | cut -d: -f3` echo "${UUID}:${i}" &gt;&gt; $TMP done #PROCESS EACH USER for i in `cat $TMP | sort`; do UUID=`echo $i | cut -d: -f1` U=`echo $i | cut -d: -f2` PASSWDLINE=`grep ":/home/${U}:" /etc/passwd` #/etc/group GNUM=`echo $PASSWDLINE | cut -d: -f4` GROUPLINE=`grep $GNUM /etc/group` GNAME=`echo $GROUPLINE | cut -d: -f1` OLDGROUP=`grep $GNAME $DEST/etc/group` if [ "$OLDGROUP" == "" ]; then echo $GROUPLINE &gt;&gt; $DEST/etc/group elif [ "$OLDGROUP" != "$GROUPLINE" ]; then sed -i "s/$OLDGROUP/$GROUPLINE/g" $DEST/etc/group fi #/etc/passwd OLDPASS=`grep ":/home/${U}:" $DEST/etc/passwd` if [ "$OLDPASS" == "" ]; then echo $PASSWDLINE &gt;&gt; $DEST/etc/passwd elif [ "$OLDPASS" != "$PASSWDLINE" ]; then sed -i "s/$OLDPASS/$PASSWDLINE/g" $DEST/etc/passwd fi #/etc/shadow SHADOWLINE=`grep "${U}:" /etc/shadow | grep -v '*'` OLDSHADOW=`grep "${U}:" $DEST/etc/shadow | grep -v '*'` if [ "$OLDSHADOW" == "" ]; then echo $SHADOWLINE &gt;&gt; $DEST/etc/shadow elif [ "$OLDSHADOW" != "$SHADOWLINE" ]; then sed -i "s#$OLDSHADOW#$SHADOWLINE#g" $DEST/etc/shadow fi #GROUP MEMBERS for j in `groups $U | cut -d: -f2`; do for k in `echo $j`; do if [ "$k" == "$GNAME" ]; then continue fi OLDLINE=`grep "${k}:" $DEST/etc/group` if ! echo $OLDLINE | grep $U ; then if [ "${OLDLINE: -1}" == ":" ]; then sed -i "s/$OLDLINE/${OLDLINE}${U}/g" $DEST/etc/group else sed -i "s/$OLDLINE/${OLDLINE},${U}/g" $DEST/etc/group fi fi done done #/HOME if [ ! -d "$DEST/home/$U" ]; then mkdir -p "$DEST/home/$U" fi chown -R ${U}:${GNAME} $DEST/home/$U done #for i in passwd group shadow; do # cp $DEST/etc/$i $DEST/etc/${i}- #done rm $TMP </pre><p> ตัวอย่างเช่น เราติดตั้งลินุกซ์อีกอันไว้ที่ <code>/dev/sdaXX</code></p> <pre>$ <strong>sudo mount /dev/sdaXX /mnt/tmp</strong> $ <strong>sudo /usr/local/sbin/transfer_users.sh /mnt/tmp</strong></pre><p> ผู้ใช้ทั้งหมดใน <code>/home/*</code> จะถูกคัดลอกไปยัง <code>/mnt/tmp/home/</code> ตามต้องการ</p> </div></div></div><div class="field field-name-taxonomy-vocabulary-1 field-type-taxonomy-term-reference field-label-above"><div class="field-label">Topic:&nbsp;</div><div class="field-items"><div class="field-item even"><a href="/taxonomy/term/3">debian</a></div><div class="field-item odd"><a href="/taxonomy/term/96">bash</a></div></div></div> Thu, 19 Dec 2013 01:18:53 +0000 wd 755 at https://www.thaitux.info https://www.thaitux.info/node/755#comments bash: สคริปต์แก้ Boot record ของ NTFS https://www.thaitux.info/node/754 <div class="field field-name-body field-type-text-with-summary field-label-hidden"><div class="field-items"><div class="field-item even"><h3>update 2556-12-03</h3> <p>ลองใช้สคริปต์กับพาร์ติชั่นที่ขนาดไม่เท่ากันแล้วปรากฎว่าใช้ไม่ได้ เพราะ NTFS เก็บข้อมูลหลายอย่างมากกว่าแค่จุดเริ่มต้นและขนาด (ดูที่ <a href="http://www.ntfs.com/ntfs-partition-boot-sector.htm">NTFS Partition Boot Sector</a>)</p> <p>วิธีที่ได้ผลกว่าคือ ฟอร์แมตไดร์ฟไว้ก่อน -> เก็บ boot sector ไว้ 72 ไบต์ -> ทำ ntfsclone -> เอา boot recort ที่เก็บไว้มาเขียนทับ</p> <p>ตัวอย่างเช่น จะคัดลอก ไดร์ฟ /dev/sda1 ไปยัง /dev/sdb1 ขั้นตอนจะเป็นดังนี้</p> <pre>$ <strong>sudo mkfs.ntfs -f /dev/sdb1</strong> $ <strong>sudo dd if=/dev/sdb1 of=sdb1.img bs=72 count=1</strong> $ <strong>sudo ntfsclone -O /dev/sdb1 /dev/sda1</strong> $ <strong>sudo dd if=sdb1.img of=/dev/sdb1</strong></pre><hr /> <p>*** สคริปต์ด้านล่างนี้ ล้าสมัยแล้ว ***</p> <p>แก้ปัญหาเวลาใช้ <a href="http://en.wikipedia.org/wiki/Ntfsprogs">ntfsclone</a> ในการ restore พาร์ติชั่น NTFS มาลงในฮาร์ดดิสก์ลูกใหม่ ซึ่งจุดเริ่มต้นและขนาดอาจไม่เท่าของเดิม</p> <p>วิธีการคือใช้ข้อมูลจากตาราง Master Boot Record ปัจจุบัน มาเขียนทับ boot record ของพาร์ติชั่น NTFS ที่ต้องการ โดยใช้เชลล์สคริปต์</p> <pre>$ <strong>vi ntfs_fix_boot_sector.sh</strong></pre><!--break--><pre> #!/bin/bash function usage() { cat &lt;&lt;EOF Fix NTFS boot record: Usage: $0 DEVICE Example: $0 /dev/sda1 EOF exit 1 } if [ ! "$1" ]; then usage fi PART=$1 if [ ! -b "$PART" ]; then echo -e "$PART not found. Exit.\n" usage fi BSF="`echo $PART | tr '/' '_'`.img" BSFB=${BSF}.bak BSFD="${BSF}_`date +%F`.bak" function reverse_byte () { #reverse_byte HEXSTR local S=$1 #HEXSTR local B local C while [ "$S" ]; do B=${S:(-2)} S=${S:0:-2} C="${C}\\x${B}" done echo $C } function replace_byte () { #replace_byte OFFSET LENGTH NUMBER local O=$1 #OFFSET local L=$2 #LENGTH local N=$3 #NUMBER let NL=${L}*2 XN=`printf "%0${NL}x" $N` RXN=`reverse_byte $XN` #echo "printf $RXN | dd of=$BSF bs=1 seek=$O count=$L conv=notrunc" printf $RXN | sudo dd of=$BSF bs=1 seek=$O count=$L conv=notrunc &gt; /dev/null 2&gt;&amp;1 } sudo dd if=$PART of=$BSF bs=512 count=1 &gt; /dev/null 2&gt;&amp;1 TMP="/tmp/$0_${RANDOM}.txt" HDD=$PART while [ "`echo ${HDD:(-1)} | tr '0123456789' ' '`" == " " ]; do HDD=${HDD:0:-1} done sudo fdisk -l $HDD &gt; $TMP if ! cat $TMP | grep $PART | grep NTFS &gt; /dev/null 2&gt;&amp;1; then echo -e "$PART is not NTFS partition. Exit.\n" sudo rm $TMP sudo rm $BSF usage fi if [ ! -f "$BSFB" ]; then cp $BSF $BSFB else cp $BSF $BSFD fi echo "Fixing $PART ..." HEADS=`cat $TMP | grep 'sectors/track' | cut -d, -f1 | cut -d\ -f1` SECTORS=`cat $TMP | grep 'sectors/track' | cut -d, -f2 | cut -d\ -f2` START=`cat $TMP | grep "${PART} " | awk -F' ' '{ print $2 }'` END=`cat $TMP | grep "${PART} " | awk -F' ' '{ print $4 }'` if [ "$START" == "*" ]; then START=`cat $TMP | grep "${PART} " | awk -F' ' '{ print $3 }'` END=`cat $TMP | grep "${PART} " | awk -F' ' '{ print $4 }'` fi let LENGTH=$END-$START OFFSET_HEADS=26 OFFSET_SECTORS=24 OFFSET_START=28 OFFSET_LENGTH=40 LEN_HEADS=1 LEN_SECTORS=1 LEN_START=4 LEN_LENGTH=4 for i in HEADS SECTORS START LENGTH; do A="OFFSET_${i}" B="LEN_${i}" replace_byte ${!A} ${!B} ${!i} done echo "Fix with heads=$HEADS, sectors/track=$SECTORS, start=$START, length=$LENGTH" sudo dd if=$BSF of=$PART &gt; /dev/null 2&gt;&amp;1 sudo rm $TMP cat &lt;&lt;EOF Command used: sudo dd if=$BSF of=$PART Revert with command: sudo dd if=$BSFB of=$PART EOF </pre><p> ตัวอย่าง สมมุติว่าพาร์ติชั่นที่ต้องการเป็น /dev/sda1 คำสั่งคือ</p> <pre>$ <strong>ntfs_fix_boot_record.sh /dev/sda1</strong></pre><p> ได้ผลลัพธ์คือ</p> <pre> Fixing /dev/sda1 ... Fix with heads=255, sectors/track=63, start=2048, length=62914559 Command used: sudo dd if=_dev_sda1.img of=/dev/sda1 Revert with command: sudo dd if=_dev_sda1.img.bak of=/dev/sda1 </pre><h3>ที่มา:</h3> <ul> <li><a href="http://www.2pi.info/software/copying-windows-new-hard-drive.html">Copying Windows to a New Hard Drive Using Linux</a></li> </ul> </div></div></div><div class="field field-name-taxonomy-vocabulary-1 field-type-taxonomy-term-reference field-label-above"><div class="field-label">Topic:&nbsp;</div><div class="field-items"><div class="field-item even"><a href="/taxonomy/term/3">debian</a></div><div class="field-item odd"><a href="/taxonomy/term/75">ntfs</a></div><div class="field-item even"><a href="/taxonomy/term/96">bash</a></div></div></div> Tue, 26 Nov 2013 02:42:12 +0000 wd 754 at https://www.thaitux.info https://www.thaitux.info/node/754#comments bash: สคริปต์บล๊อกผู้ใช้ Drupal แบบอัตโนมัติ https://www.thaitux.info/node/753 <div class="field field-name-body field-type-text-with-summary field-label-hidden"><div class="field-items"><div class="field-item even"><p>ปรับปรุงสคริปต์ให้สามารถบล๊อกโดยอัตโนมัติ</p> <pre>$ <strong>vi drupal_auto_blockuser.sh</strong></pre><!--break--><pre> #!/bin/bash # AUTO BLOCK DRUPAL USER SCRIPT, CHECK SPAM FROM google.co.th # FROM: https://drupal.org/node/118759 SITE=<em><strong>http://www.example.com</strong></em> # NO TRAILING SLASH NAME=<em><strong>drupal_admin_user</strong></em> PASS=<em><strong>drupal_admin_password</strong></em> UIDFILE=<em><strong>"site_last_uid.txt"</strong></em> SPAMDATA="spamdata.txt" SLEEP=10 #REDUCE SERVER LOAD STATUS=0 #0:block,1:unblock OPLOGIN="Log%20in" OPSUBMIT="Save" TMP=/tmp/$RANDOM.txt COOKIES=/tmp/$RANDOM.txt GGCOOKIES=/tmp/$RANDOM.txt AGENT="Mozilla/5.0 (X11; Linux x86_64; rv:25.0) Gecko/20130712 Firefox/25.0" QURL="https://www.google.co.th/search?q=" # LOGIN wget -q -o /dev/null -O /dev/null \ --keep-session-cookies --save-cookies $COOKIES --load-cookies $COOKIES \ --post-data="name=${NAME}&amp;pass=${PASS}&amp;op=${OPLOGIN}&amp;form_id=user_login" \ "${SITE}/?q=user/login" # PREVIOUS USER ID PREVUID=`cat $UIDFILE` let "STARTUID=${PREVUID}+1" # GET LAST USER ID wget -q -o /dev/null -O $TMP \ --keep-session-cookies --save-cookies $COOKIES --load-cookies $COOKIES \ "${SITE}/?q=admin/user/user" LASTUID=`grep -m1 'class="form-item" id="edit-accounts-' $TMP | awk -F'class="form-item" id="edit-accounts-' '{ print $2 }' | cut -d\- -f1` #DO CHECK for ID in `eval echo {$STARTUID..$LASTUID}`; do wget -q -o /dev/null -O $TMP \ --keep-session-cookies --save-cookies $COOKIES --load-cookies $COOKIES \ "${SITE}/?q=user/${ID}/edit" LINE0=`grep -n 'value="user_profile_form"' $TMP | cut -d: -f1` # PREVENT BLOCKED USER ERROR if ! [ "$LINE0" ]; then continue fi let "LINE=${LINE0}-1" TOKEN=`sed -n -e "${LINE}p" $TMP | awk -F'value="' '{ print $2 }' | cut -d\" -f1` USER1=`grep 'id="edit-name"' $TMP | awk -F'value="' '{ print $2 }' | cut -d\" -f1` EMAIL=`grep 'id="edit-mail"' $TMP | awk -F'value="' '{ print $2 }' | cut -d\" -f1` # QUERY FOR SPAM wget -q -o /dev/null -O $TMP \ --keep-session-cookies --save-cookies $GGCOOKIES --load-cookies $GGCOOKIES \ -U "$AGENT" "${QURL}${EMAIL}" ISSPAM=0 KEYWORD="" #*********************** ### BEWARE THIS WHILE LOOP, VARIABLE $ISSPAM IS LOCAL, USE REDIRECT INSTEAD OF PIPE ### #cat $SPAMDATA | while read TXT; do # if [ "$TXT" ]; then # if grep -m1 "$TXT" $TMP &gt; /dev/null; then # ISSPAM=1 # break # fi # fi #done #*********************** while read TXT; do if [ "$TXT" ]; then if grep -m1 "$TXT" $TMP &gt; /dev/null; then ISSPAM=1 KEYWORD=$TXT break fi fi done &lt; &lt;(cat $SPAMDATA ) if [ "$ISSPAM" != "0" ]; then #DO BLOCK wget -q -o /dev/null -O /dev/null \ --keep-session-cookies --save-cookies $COOKIES --load-cookies $COOKIES \ --post-data="status=${STATUS}&amp;op=${OPSUBMIT}&amp;name=${USER1}&amp;mail=${EMAIL}&amp;form_token=${TOKEN}&amp;form_id=user_profile_form" \ "${SITE}/?q=user/${ID}/edit" echo "UID:\"$ID\", USER:\"$USER1\", EMAIL:\"$EMAIL\", KEYWORD:\"$KEYWORD\" --- Blocked." sleep $SLEEP else echo "--- UID:\"$ID\", USER:\"$USER1\", EMAIL:\"$EMAIL\", not found as spam." fi sleep $SLEEP done # SAVE LAST UID echo $LASTUID &gt; $UIDFILE rm $TMP rm $COOKIES rm $GGCOOKIES </pre><pre>$ <strong>chmod 700 drupal_auto_blockuser.sh</strong></pre><h4>สร้างไฟล์ spamdata.txt</h4> <p>ใส่ค่า spam keyword</p> <pre>$ <strong>vi spamdata.txt</strong></pre><pre> did not match any documents Spam ไม่ตรงกับเอกสารใด </pre><h4>สร้างไฟล์ site_last_uid.txt</h4> <p>ใส่ค่า uid ของผู้ใช้คนสุดท้ายที่ไม่ต้องการตรวจ (สมมุติว่าเป็นผู้ใช้คนที่ 1000)</p> <pre>$ <strong>vi site_last_uid.txt</strong></pre><pre> 1000</pre><h4>รัน</h4> <pre>$ <strong>./drupal_auto_blockuser.sh</strong></pre><p> ครั้งต่อไปก็แค่สั่งรัน โดยไม่ต้องปรับแต่งอะไรอีก เว้นแต่มี spam keyword เพิ่มเติมก็ไปแก้ไฟล์ spamdata.txt</p> <h4>ปรับปรุง</h4> <ul> <li>เพิ่ม cookies ให้กับ google เพื่อไม่ให้ google คิดว่าเป็น bot</li> </ul> </div></div></div><div class="field field-name-taxonomy-vocabulary-1 field-type-taxonomy-term-reference field-label-above"><div class="field-label">Topic:&nbsp;</div><div class="field-items"><div class="field-item even"><a href="/taxonomy/term/18">drupal</a></div><div class="field-item odd"><a href="/taxonomy/term/96">bash</a></div></div></div> Sat, 13 Jul 2013 10:24:27 +0000 wd 753 at https://www.thaitux.info https://www.thaitux.info/node/753#comments bash: สคริปต์บล๊อกผู้ใช้ Drupal https://www.thaitux.info/node/752 <div class="field field-name-body field-type-text-with-summary field-label-hidden"><div class="field-items"><div class="field-item even"><p>ทำสคริปต์บล๊อกผู้ใช้ <a href="https://drupal.org">Drupal</a> จากบรรทัดคำสั่ง (bash)</p> <pre>$ <strong>vi drupal_blockuser.sh</strong></pre><!--break--><pre> #!/bin/bash #FROM: https://drupal.org/node/118759 if [ "$#" == "0" ]; then echo "Script to block drupal users by uid" echo "Usage: $0 UID1 UID2 UID3 ..." exit 1 fi SITE=<strong><em>http://www.example.com</em></strong> #NO END SLASH NAME=<strong><em>drupal_admin_user</em></strong> PASS=<strong><em>drupal_admin_password</em></strong> STATUS=0 #0:block,1:unblock OPLOGIN="Log%20in" OPSUBMIT="Save" TMP=/tmp/$RANDOM.txt COOKIES=/tmp/$RANDOM.txt #LOGIN wget -q -o /dev/null -O /dev/null \ --keep-session-cookies --save-cookies $COOKIES --load-cookies $COOKIES \ --post-data="name=${NAME}&amp;pass=${PASS}&amp;op=${OPLOGIN}&amp;form_id=user_login" \ "${SITE}/?q=user/login" #DO BLOCK while (( "$#" )); do ID=$1 wget -q -o /dev/null -O $TMP \ --keep-session-cookies --save-cookies $COOKIES --load-cookies $COOKIES \ "${SITE}/?q=user/${ID}/edit" let "LINE=`grep -n 'value="user_profile_form"' $TMP | cut -d: -f1`-1" TOKEN=`sed -n -e "${LINE}p" $TMP | awk -F'value="' '{ print $2 }' | cut -d\" -f1` USER1=`grep 'id="edit-name"' $TMP | awk -F'value="' '{ print $2 }' | cut -d\" -f1` EMAIL=`grep 'id="edit-mail"' $TMP | awk -F'value="' '{ print $2 }' | cut -d\" -f1` wget -q -o /dev/null -O /dev/null \ --keep-session-cookies --save-cookies $COOKIES --load-cookies $COOKIES \ --post-data="status=${STATUS}&amp;op=${OPSUBMIT}&amp;name=${USER1}&amp;mail=${EMAIL}&amp;form_token=${TOKEN}&amp;form_id=user_profile_form" \ "${SITE}/?q=user/${ID}/edit" echo "USER:\"$USER1\" --- EMAIL:\"$EMAIL\" --- Blocked." shift done rm $TMP rm $COOKIES </pre><pre>$ <strong>chmod 700 ./drupal_blockuser.sh</strong></pre><p> วิธีใช้งานก็สั่ง</p> <pre>$ <strong>./drupal_blockuser.sh <em>UID1 UID2 UID3 ...</em></strong></pre><p> อย่าลืมแก้ตัวแปร <code>SITE, NAME, PASS</code> ให้เข้ากับงานเรา</p> </div></div></div><div class="field field-name-taxonomy-vocabulary-1 field-type-taxonomy-term-reference field-label-above"><div class="field-label">Topic:&nbsp;</div><div class="field-items"><div class="field-item even"><a href="/taxonomy/term/18">drupal</a></div><div class="field-item odd"><a href="/taxonomy/term/96">bash</a></div></div></div> Sat, 13 Jul 2013 07:08:49 +0000 wd 752 at https://www.thaitux.info https://www.thaitux.info/node/752#comments fonts: บันทึก Roboto https://www.thaitux.info/node/751 <div class="field field-name-body field-type-text-with-summary field-label-hidden"><div class="field-items"><div class="field-item even"><p>เอาฟอนต์ <a href="http://developer.android.com/design/style/typography.html">Roboto</a> มาใส่ภาษาไทย โดยเอาโครงฟอนต์ Roboto (20%) + <a href="/node/698">Droid Sans</a> (30%) + <a href="http://linux.thai.net/projects/fonts-tlwg">Garuda</a> (50%)</p> <p>จุดประสงค์คือจะนำไปใช้ทดสอบ Android ICS</p> <h3>Update</h3> <ul> <li>20140220<br /> <ul> <li>เลิกทำภายใต้ชื่อ Roboto เฉย ๆ แต่เปลี่ยนเป็น Roboto Web แทน ซึ่งจะมีภาษาอังกฤษ, ละติน, ไทย และลาว ใช้งานภายใต้ชื่อ Roboto Web</li> <li>ทำรุ่นที่มีเฉพาะไทยกับลาวภายใต้ชื่อ Roboto ThaiLao โดยตึ้งค่า perferred family เป็น <code>Roboto</code> ใช้งานภายใต้ชื่อ Roboto แต่ต้องมีการลงแพ็กเกจหรือปรับตั้งอื่น ดังนี้<br /> <ul> <li>สำหรับเดสก์ทอป ลงแพ็กเกจชื่อ <code>fonts-roboto</code> แล้วสามารถใช้งานผ่านชื่อฟอนต์ Roboto ได้เลย (ยกเว้น Inkscape ให้ใช้ Roboto Web แทน)</li> <li>สำหรับโทรศัพท์แอนดรอยด์ ให้นำ RobotoThaiLao-*.ttf ใส่ใน <code>/system/fonts</code> แล้วแก้ไขไฟล์ <code>/system/etc/fallback_fonts.xml</code> เพิ่มบรรทัดดังนี้ <pre> ... &lt;family&gt; &lt;fileset&gt; &lt;file&gt;RobotoThaiLao-Regular.ttf&lt;/file&gt; &lt;file&gt;RobotoThaiLao-Bold.ttf&lt;/file&gt; &lt;/fileset&gt; &lt;/family&gt; ... </pre> ยกเว้น RobotoThaiLao-Light และ RobotoThaiLao-Thin ต้องแก้ <code>/system/etc/system_fonts.xml</code> โดยตรง ดังนี้ <pre> ... &lt;family&gt; &lt;nameset&gt; &lt;name&gt;sans-serif-light&lt;/name&gt; &lt;/nameset&gt; &lt;fileset&gt; &lt;file&gt;Roboto-Light.ttf&lt;/file&gt; &lt;file&gt;Roboto-LightItalic.ttf&lt;/file&gt; <strong> &lt;file&gt;RobotoThaiLao-Light.ttf&lt;/file&gt;</strong> &lt;/fileset&gt; &lt;/family&gt; &lt;family&gt; &lt;nameset&gt; &lt;name&gt;sans-serif-thin&lt;/name&gt; &lt;/nameset&gt; &lt;fileset&gt; &lt;file&gt;Roboto-Thin.ttf&lt;/file&gt; &lt;file&gt;Roboto-ThinItalic.ttf&lt;/file&gt; <strong> &lt;file&gt;RobotoThaiLao-Thin.ttf&lt;/file&gt;</strong> &lt;/fileset&gt; &lt;/family&gt; ... </pre> </li> </ul></li> </ul> </ul> <hr /> <style type="text/css"> @font-face { font-family: "Roboto"; src: url(http://www.thaitux.info/files/fonts/ttf/Roboto-Regular.ttf); } @font-face { font-family: "Roboto"; font-weight: bold; src: url(http://www.thaitux.info/files/fonts/ttf/Roboto-Bold.ttf); } @font-face { font-family: "Roboto ThaiLao"; src: url(http://www.thaitux.info/files/fonts/ttf/RobotoThaiLao-Regular.ttf); } @font-face { font-family: "Roboto ThaiLao"; font-weight: bold; src: url(http://www.thaitux.info/files/fonts/ttf/RobotoThaiLao-Bold.ttf); } @font-face { font-family: "Roboto ThaiLao"; font-weight: 300; src: url(http://www.thaitux.info/files/fonts/ttf/RobotoThaiLao-Light.ttf); } @font-face { font-family: "Roboto Web"; src: url(http://www.thaitux.info/files/fonts/ttf/RobotoWeb-Regular.ttf); } @font-face { font-family: "Roboto Web"; font-weight: bold; src: url(http://www.thaitux.info/files/fonts/ttf/RobotoWeb-Bold.ttf); } @font-face { font-family: "Roboto Web"; font-weight: 300; src: url(http://www.thaitux.info/files/fonts/ttf/RobotoWeb-Light.ttf); } dt { font-weight: bold; } .demo { width: 100%; line-height: normal; } .Roboto { font-family: "Roboto",serif; } .RobotoThaiLao { font-family: "Roboto ThaiLao",serif; } .RobotoWeb { font-family: "Roboto Web",serif; } </style> <div class="Roboto"> <h3>Roboto (ต้นฉบับ+ไทย+ลาว) - เลิกทำแล้ว (จริง ๆ คือเปลี่ยนชื่อเป็น Roboto Web แทน ป้องกันสับสน)</h3> <dl> <dt>ดาวน์โหลดไฟล์ฟอนต์ (ล่าสุดคือ 20121003)</dt> <dd><a href="/files/fonts/Roboto-ttf.tar.gz">Roboto-ttf.tar.gz</a></dd> <dt>ดาวน์โหลดไฟล์ซอร์ส</dt> <dd> <li>รุ่นร่างเริ่มต้น ยังไม่ได้ทำ hint ยังไม่ได้ทำภาษาลาว (ใช้ของเดิมที่เป็นของ Droid Sans ที่ทำไว้ก่อนแล้ว) เพิ่มการรองรับภาษาบาลี (lang="pi"): <a href="/files/fonts/Roboto-src-20121003.tar.gz">Roboto-src-20121003.tar.gz</a></li> </dd> <dt>ตัวอย่าง</dt> <dd class="demo"> <p style="font-size:24px;"><span style="color: red;">24</span>!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_` Aabcdefghijklmnopqrstuvwxyz{|}~ <u>mrnrtodocode</u> ṃāñūṭḍṇṅ<br /> aกัขิฃีคึฅืฆุงูจฺฉ็ช่ซ้ฌ๊ญ๋ญุฎ์ฏํฐ๎ฐูฑั่ฒิ้ณี๊ดื๋ติ์ถะทาธำน่ำเบี่แปิํโผใฝ่ไพฟ้ภมยรฤๅลฦวศษสหฬอฮฯๆ ฿๏๐๑๒๓๔๕ ๖๗๘๙๚๛ ก่ป่ฝ้ฟ๊ฬ๋ คฅศ ดตฒ ญฐญานํ <span lang="pi">ญฐญานํ</span> โสตฺถิํ<br /> ກະຂັຄາງ່ຳຈິ່ຊີ້ຍຶ໊ດື໋ຕຸ່ຖູ້ທົ໊ນຼ໋ເບແປໂຜໃຝໄພຟ່ມ້ຢ໊ຣ໋ລ໌ວໍສຫອຮຯຽໆ ໐໑໒໓໔໕໖໗໘໙ ໜໝ&#3806;&#3807;</p> <p style="font-weight:bold; font-size:24px;"><span style="color: red;">24</span>!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_` Aabcdefghijklmnopqrstuvwxyz{|}~ <u>mrnrtodocode</u> ṃāñūṭḍṇṅ<br /> aกัขิฃีคึฅืฆุงูจฺฉ็ช่ซ้ฌ๊ญ๋ญุฎ์ฏํฐ๎ฐูฑั่ฒิ้ณี๊ดื๋ติ์ถะทาธำน่ำเบี่แปิํโผใฝ่ไพฟ้ภมยรฤๅลฦวศษสหฬอฮฯๆ ฿๏๐๑๒๓๔๕ ๖๗๘๙๚๛ ก่ป่ฝ้ฟ๊ฬ๋ คฅศ ดตฒ ญฐญานํ <span lang="pi">ญฐญานํ</span> โสตฺถิํ<br /> ກະຂັຄາງ່ຳຈິ່ຊີ້ຍຶ໊ດື໋ຕຸ່ຖູ້ທົ໊ນຼ໋ເບແປໂຜໃຝໄພຟ່ມ້ຢ໊ຣ໋ລ໌ວໍສຫອຮຯຽໆ ໐໑໒໓໔໕໖໗໘໙ ໜໝ&#3806;&#3807;</p> </dd> </dl> </div> <hr /> <div class="RobotoThaiLao"> <h3>Roboto ThaiLao (มีเฉพาะภาษาไทย+ลาว)</h3> <dl> <dt>ดาวน์โหลดไฟล์ฟอนต์ (ล่าสุดคือ 20140225)</dt> <dd><a href="/files/fonts/RobotoThaiLao-ttf.tar.gz">RobotoThaiLao-ttf.tar.gz</a></dd> <dt>ดาวน์โหลดไฟล์ซอร์ส</dt> <dd> <li>ใช้ฐานฟอนต์ของ Noto Sans Thai และ Roboto ต้นฉบับ เกลาภาษาไทยเล็กน้อย ทำ Glyph ภาษาลาวใหม่ให้สอดคล้องกับรูปแบบของ Roboto (ภาษาลาวมีการเปลี่ยนความกว้าง ไม่คอมแพตกับของเดิม) : <a href="/files/fonts/RobotoThaiLao-src-20140221.tar.gz">RobotoThaiLao-src-20140221.tar.gz</a></li> <li>เพิ่ม Light : <a href="/files/fonts/RobotoThaiLao-src-20140225.tar.gz">RobotoThaiLao-src-20140225.tar.gz</a></li> </dd> <dt>ตัวอย่าง</dt> <dd class="demo"> <p style="font-size:24px;"><span style="color: red;">24</span>!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_` Aabcdefghijklmnopqrstuvwxyz{|}~ <u>mrnrtodocode</u> ṃāñūṭḍṇṅ<br /> aกัขิฃีคึฅืฆุงูจฺฉ็ช่ซ้ฌ๊ญ๋ญุฎ์ฏํฐ๎ฐูฑั่ฒิ้ณี๊ดื๋ติ์ถะทาธำน่ำเบี่แปิํโผใฝ่ไพฟ้ภมยรฤๅลฦวศษสหฬอฮฯๆ ฿๏๐๑๒๓๔๕ ๖๗๘๙๚๛ ก่ป่ฝ้ฟ๊ฬ๋ คฅศ ดตฒ ญฐญานํ <span lang="pi">ญฐญานํ</span> โสตฺถิํ<br /> ກະຂັຄາງ່ຳຈິ່ຊີ້ຍຶ໊ດື໋ຕຸ່ຖູ້ທົ໊ນຼ໋ເບແປໂຜໃຝໄພຟ່ມ້ຢ໊ຣ໋ລ໌ວໍສຫອຮຯຽໆ ໐໑໒໓໔໕໖໗໘໙ ໜໝ&#3806;&#3807;</p> <p style="font-weight:bold; font-size:24px;"><span style="color: red;">24</span>!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_` Aabcdefghijklmnopqrstuvwxyz{|}~ <u>mrnrtodocode</u> ṃāñūṭḍṇṅ<br /> aกัขิฃีคึฅืฆุงูจฺฉ็ช่ซ้ฌ๊ญ๋ญุฎ์ฏํฐ๎ฐูฑั่ฒิ้ณี๊ดื๋ติ์ถะทาธำน่ำเบี่แปิํโผใฝ่ไพฟ้ภมยรฤๅลฦวศษสหฬอฮฯๆ ฿๏๐๑๒๓๔๕ ๖๗๘๙๚๛ ก่ป่ฝ้ฟ๊ฬ๋ คฅศ ดตฒ ญฐญานํ <span lang="pi">ญฐญานํ</span> โสตฺถิํ<br /> ກະຂັຄາງ່ຳຈິ່ຊີ້ຍຶ໊ດື໋ຕຸ່ຖູ້ທົ໊ນຼ໋ເບແປໂຜໃຝໄພຟ່ມ້ຢ໊ຣ໋ລ໌ວໍສຫອຮຯຽໆ ໐໑໒໓໔໕໖໗໘໙ ໜໝ&#3806;&#3807;</p> <p style="font-weight:300; font-size:24px;"><span style="color: red;">24</span>!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_` Aabcdefghijklmnopqrstuvwxyz{|}~ <u>mrnrtodocode</u> ṃāñūṭḍṇṅ<br /> aกัขิฃีคึฅืฆุงูจฺฉ็ช่ซ้ฌ๊ญ๋ญุฎ์ฏํฐ๎ฐูฑั่ฒิ้ณี๊ดื๋ติ์ถะทาธำน่ำเบี่แปิํโผใฝ่ไพฟ้ภมยรฤๅลฦวศษสหฬอฮฯๆ ฿๏๐๑๒๓๔๕ ๖๗๘๙๚๛ ก่ป่ฝ้ฟ๊ฬ๋ คฅศ ดตฒ ญฐญานํ <span lang="pi">ญฐญานํ</span> โสตฺถิํ<br /> ກະຂັຄາງ່ຳຈິ່ຊີ້ຍຶ໊ດື໋ຕຸ່ຖູ້ທົ໊ນຼ໋ເບແປໂຜໃຝໄພຟ່ມ້ຢ໊ຣ໋ລ໌ວໍສຫອຮຯຽໆ ໐໑໒໓໔໕໖໗໘໙ ໜໝ&#3806;&#3807;</p> </dd> </dl> </div> <hr /> <div class="RobotoWeb"> <h3>Roboto Web (อังกฤษ+ละติน+ไทย+ลาว)</h3> <dl> <dt>ดาวน์โหลดไฟล์ฟอนต์ (ล่าสุดคือ 20140225)</dt> <dd><a href="/files/fonts/RobotoWeb-ttf.tar.gz">RobotoWeb-ttf.tar.gz</a></dd> <dt>ดาวน์โหลดไฟล์ซอร์ส</dt> <dd> <li>รุ่นแรก ใส่ตัวละตินยังไม่ครบ : <a href="/files/fonts/RobotoWeb-src-20140221.tar.gz">RobotoWeb-src-20140221.tar.gz</a></li> <li>เพิ่ม Light : <a href="/files/fonts/RobotoWeb-src-20140225.tar.gz">RobotoWeb-src-20140225.tar.gz</a></li> </dd> <dt>ตัวอย่าง</dt> <dd class="demo"> <p style="font-size:24px;"><span style="color: red;">24</span>!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_` Aabcdefghijklmnopqrstuvwxyz{|}~ <u>mrnrtodocode</u> ṃāñūṭḍṇṅ<br /> aกัขิฃีคึฅืฆุงูจฺฉ็ช่ซ้ฌ๊ญ๋ญุฎ์ฏํฐ๎ฐูฑั่ฒิ้ณี๊ดื๋ติ์ถะทาธำน่ำเบี่แปิํโผใฝ่ไพฟ้ภมยรฤๅลฦวศษสหฬอฮฯๆ ฿๏๐๑๒๓๔๕ ๖๗๘๙๚๛ ก่ป่ฝ้ฟ๊ฬ๋ คฅศ ดตฒ ญฐญานํ <span lang="pi">ญฐญานํ</span> โสตฺถิํ<br /> ກະຂັຄາງ່ຳຈິ່ຊີ້ຍຶ໊ດື໋ຕຸ່ຖູ້ທົ໊ນຼ໋ເບແປໂຜໃຝໄພຟ່ມ້ຢ໊ຣ໋ລ໌ວໍສຫອຮຯຽໆ ໐໑໒໓໔໕໖໗໘໙ ໜໝ&#3806;&#3807;</p> <p style="font-weight:bold; font-size:24px;"><span style="color: red;">24</span>!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_` Aabcdefghijklmnopqrstuvwxyz{|}~ <u>mrnrtodocode</u> ṃāñūṭḍṇṅ<br /> aกัขิฃีคึฅืฆุงูจฺฉ็ช่ซ้ฌ๊ญ๋ญุฎ์ฏํฐ๎ฐูฑั่ฒิ้ณี๊ดื๋ติ์ถะทาธำน่ำเบี่แปิํโผใฝ่ไพฟ้ภมยรฤๅลฦวศษสหฬอฮฯๆ ฿๏๐๑๒๓๔๕ ๖๗๘๙๚๛ ก่ป่ฝ้ฟ๊ฬ๋ คฅศ ดตฒ ญฐญานํ <span lang="pi">ญฐญานํ</span> โสตฺถิํ<br /> ກະຂັຄາງ່ຳຈິ່ຊີ້ຍຶ໊ດື໋ຕຸ່ຖູ້ທົ໊ນຼ໋ເບແປໂຜໃຝໄພຟ່ມ້ຢ໊ຣ໋ລ໌ວໍສຫອຮຯຽໆ ໐໑໒໓໔໕໖໗໘໙ ໜໝ&#3806;&#3807;</p> <p style="font-weight:300; font-size:24px;"><span style="color: red;">24</span>!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_` Aabcdefghijklmnopqrstuvwxyz{|}~ <u>mrnrtodocode</u> ṃāñūṭḍṇṅ<br /> aกัขิฃีคึฅืฆุงูจฺฉ็ช่ซ้ฌ๊ญ๋ญุฎ์ฏํฐ๎ฐูฑั่ฒิ้ณี๊ดื๋ติ์ถะทาธำน่ำเบี่แปิํโผใฝ่ไพฟ้ภมยรฤๅลฦวศษสหฬอฮฯๆ ฿๏๐๑๒๓๔๕ ๖๗๘๙๚๛ ก่ป่ฝ้ฟ๊ฬ๋ คฅศ ดตฒ ญฐญานํ <span lang="pi">ญฐญานํ</span> โสตฺถิํ<br /> ກະຂັຄາງ່ຳຈິ່ຊີ້ຍຶ໊ດື໋ຕຸ່ຖູ້ທົ໊ນຼ໋ເບແປໂຜໃຝໄພຟ່ມ້ຢ໊ຣ໋ລ໌ວໍສຫອຮຯຽໆ ໐໑໒໓໔໕໖໗໘໙ ໜໝ&#3806;&#3807;</p> </dd> </dl> </div></div></div></div><div class="field field-name-taxonomy-vocabulary-1 field-type-taxonomy-term-reference field-label-above"><div class="field-label">Topic:&nbsp;</div><div class="field-items"><div class="field-item even"><a href="/taxonomy/term/216">hinting</a></div><div class="field-item odd"><a href="/taxonomy/term/294">fonts</a></div></div></div> Wed, 03 Oct 2012 11:51:44 +0000 wd 751 at https://www.thaitux.info https://www.thaitux.info/node/751#comments