[Python] ผำควนโดยพอนไธ / Thai Spoonerism with Python

จากโจทย์ที่มีโกนพาสเบ็นหนด ว่วยด้าการสร้างควนผำ http://www.pagist.info/7331317

ผึงจมดำไถ้แปรมโกผำควนข้ามึนเป็นภาษาพอนไธ

 
juannam = len
jemnuantam = int
rut_inpaw = raw_input
 
def tamkad(kam):
    sara = {'a','e','i','o','u'}
    for akkirata in range(juannam(kam)):
        if kam [akkirata]  in sara:
            return (kam [:akkirata] ,kam [akkirata:] )
    return kam
 
def pangpayuan(paekyangra, pangyangla):
    (payanchanaektonpayangra, sianglangpaekyangra) = tamkad(paekyangra)
    (payanchanangtonpayangla, sianglangpangyangla) = tamkad(pangyangla)
    return (payanchanaektonpayangra+sianglangpangyangla, payanchanangtonpayangla+sianglangpaekyangra)
 
def pamkuan(kam):
    pangya = kam.split()
    if juannam(pangya) < 2: #mai tueng sung kom pai mai duan
        return kam
    lamdabkaektipuankamram, lamdabkangtipuankamram = (juannam(pangya)/2-1, juannam(pangya)-1)
    (pangya [lamdabkaektipuankamram] , pangya [lamdabkangtipuankamram] ) = pangpayuan(pangya [lamdabkaektipuankamram] , pangya [lamdabkangtipuankamram] )
    return ' '.join(pangya)
 
def main():
    jamnuankam = jemnuantam(rut_inpaw())
    for kitam in range(jamnuankam):
        print pamkuan(rut_inpaw())
    return
 
main()
 

ป.ล. มันยากอีตรงผวนโค้ดนี่แหละ = =”

Barcamp Bangkhen 2 [บาร์แคมป์บางเขน 2]

NOTE: We are fixing the theme. Content should not disappear, unless entire site does.

Blue text indicates English Translation of same number of Thai paragraphs above. Black English text should always be read by both Thai and non-Thai readers.

This post is NOT official, NOT endorsed by Barcamp Bangkhen, its staff or its sponsors, or Kasetsart University or its affiliates.

Barcamp Bangkhen?

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

กิจกรรมบาร์แคมป์บางเขน เป็นบาร์แคมป์ที่จัดในมหาวิทยาลัยเกษตรศาสตร์ โดยมีรากฐานมาจากการจัด “ComKUCamp” ขึ้นในปี พ.ศ. 2552 (หรือตอนผู้เขียนอยู่ปีหนึ่ง จำได้ว่าต้องออกครึ่งงานไปกิจกรรมคณะ) ที่ได้ขยายตัวออกมาเพื่อรองรับลักษณะงานที่ใหญ่ขึ้น โดยบาร์แคมป์บางเขนครั้งแรกถูกจัดขึ้นในปี 2553 และในวันนี้เป็นครั้งที่ 2

BarCamp : there is a word for it and it is “unconference”, meaning it’s some form of conference directed completely by its participants. No central organization directs the event. Everybody has liberty to offer any topic up for discussion or presentation, and voting takes place to see who’s the worthy. In general, the event is “open-styled.”

Barcamp Bangkhen is a BarCamp organized in Kasetsart University , originated from “ComKUCamp” in 2009. The event finally grew into Barcamp Bangkhen in 2010, and the second event today.


Session submission and table area, second floor.

Sessions I attended

Full list of sessions (and winners of Prof.Jittat’s Beef Challenge) is available at http://goo.gl/ZncZn

สำหรับห้องบรรยายที่ผู้เขียนได้เข้าจะมีดังต่อไปนี้ครับ / The following is the list of sessions I entered

Session 1: Pantip.com เปิดเผยโฉมใหม่ ที่นี่ที่แรก !! (The New Pantip.com) by Pantip.com Staff

พูดถึงการเปลี่ยนแปลง และรูปโฉมใหม่ของเว็บไซต์ Pantip.com ซึ่งเป็นชุมชนออนไลน์ที่ (น่าจะ) ใหญ่ที่สุดในประเทศไทย เช่น รูปแบบใหม่ๆ แบบการวางโฆษณา การออกแบบ การใช้งาน เป็นต้น (ผู้เขียนเข้าสาย เลยได้เนื้อหาไม่มาก)

Topics of interest included changes and new look of Pantip.com, (probably) the largest online community in Thailand, such as theme, advertisement placement, design, usability, etc.


Pantip.com session

Session 2: Skipped.

Due to pressing matters, I had to skip session 2.

Session 3: What (programming) Language do you Speak? by @LunaticNeko

ครับ ผู้เขียนขึ้นพูดเอง อันนี้เดี๋ยวขอเก็บไว้เล่าในอีกหัวนึงนะครับ สำหรับเนื้อหาหลักที่พูดจะเป็นการกล่าวถึงความนิยมของภาษาโปรแกรมมิ่งต่างๆ ปัญหาของภาษาแต่ละอย่าง ภาษาที่เข้าใจยาก (Esoteric Language) ได้แก่ LOLCODE, Shakespeare, Brainfuck, Chef และ Whitespace และชวนสนทนาเรื่องลักษณะของภาษาต่างๆ ภาษาที่ไม่เป็นที่รู้จักมากนัก เป็นต้น ซึ่งผู้เขียนขอขอบคุณอีกครั้งที่ผู้เข้าฟังทุกท่านมีส่วนร่วมกับกิจกรรมของผู้เขียนเป็นอย่างดีครับ

I spoke this myself, and I think it’s of particular importance so we will leave the details for later. In short, presentation (without presentation!) included popularity of programming languages, problems and downsides of some languages, esoteric programming languages (namely LOLCODE, Shakespeare, Brainfuck, Chef and Whitespace), and brought up discussions related to various less-common languages. I wish to speak my gratitude to everyone in my session for being very good participants. I hope you enjoyed my session.

Session 4: Road to Imagine Cup ™ 2012 & Microsoft® Learning Tools by Microsoft

น้องจากวิทยาการคอมพิวเตอร์เป็นคนบรรยายครับ ซึ่งก็จะพูดเกี่ยวกับหนทางการสมัคร Imagine Cup (ดูรายละเอียดได้ที่ facebook.com/icthai ) โปรแกรมต่างๆ ของทางไมโครซอฟท์ที่แจกฟรี เช่น Songsmith, Microsoft Math, Collage เป็นต้น ซึ่งแต่ละโปรแกรมจะเป็นโปรแกรมที่มีรูปแบบการทำงานที่ค่อนข้างเจาะจง และมีเป้าหมายเดียว ซึ่งทำให้ทำความเข้าใจได้ง่าย และมีเกมชิงรางวัลด้วย (มีมุขเกรียนๆ หลังเบรคนะครับ)

A sophomore took the microphone in this session from Microsoft, which was mainly about Imagine Cup, and various free applications from Microsoft including Songsmith®, Microsoft Math, Collage, etc. Each of these application is purpose-built, so it’s easy to get a grip. There’s also a prize game, but I’ll keep my “play style” after the break, ehehe~ (troll laughter)


Microsoft Session

Session 5: พาทัว*เบื้องหลังแฟนซับและ Season หน้ามีอะไรบ้าง (Behind the scenes of Fansubbing, and Japanese Animations for the Next Season) by KU Anime Club

พูดเรื่องกระบวนการทำแฟนซับ (Fansub) ซึ่งเป็นการทำบทบรรยายแปลให้รายการโทรทัศน์โดยไม่ผ่านกระบวนการของเจ้าของลิขสิทธิ์ ซึ่งประกอบด้วยขั้นตอนและตำแหน่งต่างๆ เช่น Timing, Translation, Typesetting, QC, ฯลฯ และมีการแนะนำรายการที่จะฉายในฤดูกาลใหม่ และที่มีโครงการแปล โดยผู้พูดมาจากกลุ่มแปล DAI-TAKU, Snookerman และ Red Alpha

Talked about Fansubbing process, which is a form of creation of subtitle for television shows unofficially without profit desires. Process itself included timing, translation, typesetting, QC and so on. Introduction and PVs to the new anime this season are also presented. Speakers came from DAI-TAKU, Snookerman and Red Alpha groups.
* [sic]

Session 6: Good resume in my point of view by @roofimon

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

Actually, there’s not much resume writing here, but it’s more about how to make a good profile. This includes how we live as well, because finding jobs is no longer through agency or head hunter, but rather by the enterprise themselves through social networks. Additionally, most of the time it’s HR that reads our resumes, so it’s not really clear to them how expert we are. And finally, speaker recommended avoiding export-and-printing resume from jobs websites, and start finding what we want to do, and blog it. Resume itself is not really relevant. (or something similar)


The best resume guide ever!

Session 7: เอาตัวรอดในเหตุภัยพิบัติ แบบ Geek Geek (Geek Survival Guide) by @racpong

พูดเรื่องการเอาตัวรอดในกรณีภัยพิบัติ โดยจะเน้นหนักไปในส่วนของการรักษาการทำงานของระบบไฟฟ้า โทรคมนาคม การรับข่าวสาร ส่งข้อความขอความช่วยเหลือ และระบบ SSTV เป็นต้น และกล่าวถึงประเด็นสำคัญในส่วนของ CPR ซึ่งปัจจุบันใช้ระบบ C-A-B (Circulation, Airway, Breathing) ไม่ใช่ A-B-C เหมือนเมื่อก่อน โดยเกิดขึ้นจากการที่หัวใจมีขีดจำกัดในการทำงานที่กระชั้นมากกว่าระบบหายใจ และกล่าวถึงเทคโนโลยีและองค์กรที่เกี่ยวข้องกับภัยพิบัติต่างๆ

Content related to survival in disaster situations, where the Geek comes into play with maintenance of electricity, telecommunication, receiving news, sending requests for assistance, SSTV, etc. Changes in CPR procedure is also announced: it’s C-A-B (Circulation, Airway, Breathing) and no longer A-B-C due to heart stoppage is of greater concern than stopped breathing. Mentions of NOAA and other organizations are also announced.

ATTN: In Thailand, for non-crime emergencies, please call 1669 and not 191 for faster and more accurate service. Thailand’s Emergency Amateur Frequency is 144.900MHz and not 145.000MHz.

Remember, when all else fails, radio saves the day.


Survival Course for GEEKS!

Session 8: Skipped

Due to me returning home and cleaning-up a bit, I had to leave.

Overall

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

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

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

I think this event is better than the previous one, but there’s still some matters of concern. Session arrangement has flaws in the matter that the more prominent speakers get their own time-slot, pulling audience away from less-known speakers. While this system makes everyone able to jump in and listen to the “big matters” all the time, it reduces the number of audience for those less-known speakers. I think this is a trade-off and we must balance it well.

Additionally, many people got to speak this time. There are also many types of speakers from teams ready to present with facts to unprepared solo presentations, such as me.

Some complained that the sticker that we put on shirts come off easily. Personally, I find the non-distinguishing identification more of problem, that it is hard to find help when we need one. I know it is necessary that in a BarCamp the peer-to-peer style is more preferred than the organized-event style, but technical errors do occur, and we need to find someone who can fix it as fast as we can.

My Session

หลังจากที่พยายามผลักดันหัวข้อใน ComKUCamp #2 (เสพติดทวิตเตอร์ และ ดักแก่เกมเก่า) ซึ่งไม่สำเร็จไปทั้งสองหัวข้อ และได้ขึ้นพูดเป็นกลุ่มใน Barcamp Bangkhen #1 (อนิเมชั่น + ดราม่า) จนในที่สุดผม (ตรงนี้พื้นที่ส่วนตัวละ ฮ่าๆ) ก็ได้ฉายเดี่ยวเป็นครั้งแรกกับ “What (programming) Language do you Speak?” ซึ่งในตอนแรกเสียงตอบรับดูเหมือนจะแย่ เพราะในงานบาร์แคมป์โดยทั่วไป ประเด็นพวกความรัก ของฟรี ดนตรี และนางแบบมักจะมาแรงกว่าเสมอ แต่ด้วยจำนวนห้องที่มาก ทำให้ผมได้ขึ้นพูดแบบไม่รู้เนื้อรู้ตัว (จริงๆ เพราะมีคนมาตามให้ขึ้นไป)

สุดท้ายผมขึ้นห้องบรรยายเลท แถมต้องไปเดินหาปลั๊ก พยายามบูตเครื่อง (ที่ไม่ติด เพราะแบตไม่พอ) สไลด์ก็ไม่มี ใช้เปิดเว็บ ( LangPop Stack Overflow Wikipedia  ฯลฯ) แสดงข้อมูลและตัวอย่างต่างๆ เอา ดูเหมือนเป็นคนที่สะเพร่า มักง่าย และไม่เอาใจใส่ผู้ฟัง แต่จริงๆ แล้วผมเองกะว่า ถ้าจะเตรียมสไลด์คงเตรียมไม่มาก เพราะตอนแรกว่าจะ set topic ไว้ว่าเอาความนิยมของภาษาในโลกทั่วไปและการแข่งขัน ตามด้วย feature แบบต่างๆ ของภาษา (เช่น overloading, strong/weak typing, ฯลฯ) และพูดด่าภาษาบางตัว จากนั้นค่อยเริ่มสนทนา

กลายเป็นว่าเพราะไม่ได้เตรียมอะไรมาเท่าไหร่ เลยกลายเป็นว่าเปิด LangPop ให้ดูความนิยมของภาษาแบบลกๆ แล้วถามคนนั้นคนนี้ว่ารู้จักภาษาอะไรบ้าง (แปลกสุดก็ CoffeeScript ฮา จริงๆ ผมก็รู้จักนะครับ รู้จักเพราะพวกนายนั่นแหละไอ้เฟรชชี่ มาชนะพี่ใน โค้ดจม = =”) เคยทำอะไรมาบ้าง มีท่านนึงตอบว่าเคยเขียนประมาณว่าพัฒนาตัว Pythonไปใช้เฉพาะทาง ซึ่งรายละเอียดเยอะเลยไม่ได้ถามต่อด้วย มีคนเคยทำ Cassandra ด้วย คนที่มือใหม่จริงๆ ก็มี งานนี้จึงเป็นงานรวมพลของคนทุกระดับฝีมือในการเขียนโปรแกรม และหลายภาษา การสนทนาจึงสนุกและต่อเนื่อง

ตอนผมถามเรื่องภาษาที่ไม่ชอบ มีน้องยกมือพูดเรื่องการ sort ใน VB6 ฟังก์ชันมันแยกชนิดมา ผมจึงพูดถึง overloading ว่า ถ้าภาษาไม่มี overloading เวลาเราสร้างฟังก์ชันที่รับได้หลายชนิดตัวแปรเราต้องสร้างแยก เช่น (pseudo:) sort_int(int [] n), sort_double(double [] n) sort_string(string [] n) ฯลฯ ซึ่งไม่เหมาะเลยเวลาที่จะเรียกใช้งาน แล้วก็พูดว่าเวลามี overload ก็ใช้ชื่อ sort เฉยๆ ก็ได้ และย้อนไปพูดเรื่องการเขียนฟังก์ชันเปรียบเทียบเองด้วยภาษาซี เป็นต้น สรุปว่าผมใช้ feedback จากผู้ฟังมาเลือกหัวข้อที่จะบรรยายต่อ ตรงนี้ยอมรับว่ากินแรงมหาศาลมาก เพราะต้องคอยนึกว่าเรากำลังคุยอะไรกันอยู่ ต้องพูดและคิดเป็นภาษาอังกฤษทั้งหมด

ต่อมาก็มีการพูดแนะนำเรื่องภาษาอ่านยาก (esoteric language) ต่างๆ เช่น Brainfuck, LOLCODE, Shakespeare, Chef และ Whitespace โดยเอาฮาเป็นหลัก เช่น ตอนพูดเรื่อง Brainfuck ก็ (พยายาม) ทำให้ผู้ฟัง (ที่มีความรู้มาบ้าง) ฮาด้วยมุขที่เอาไปเปรียบกับ Turing machine ว่ามันเหมือนกันน่าจะตรงเลื่อนเทปซ้ายขวากันเห็นๆ หรือ LOLCODE ผมก็เปิด lolcat ให้ดู ตอน Shakespeare ผมก็ยกว่าผมไม่เคยอ่านวรรณกรรมเชคสเปียร์ออกเลย และโค้ดพวกนี้ก็ด้วย อะไรประมาณนั้น ก่อนที่จะจบลงด้วย Chef ในช่วงเที่ยง ซึ่งบังเอิญอย่างน่าประหลาดว่ามันชวนหิวเหลือเกิน

หลังจากจบ session ก็มีต่างประเทศสองท่านเดินมาหา และขอเบอร์ติดต่อผมเอาไว้ อยากให้ทราบว่าผมไม่ได้เทพอะไรเลยครับ ฮ่าๆ ขอบพระคุณทุกท่านที่สนใจ แม้ว่าจะโดนแบไต๋ลากไปก็ตาม (โดยเฉพาะ “นายแบงค์ ภาคไฟ” ตัวชวนสินะ?) และขออภัยที่พูดแบบไม่เตรียมจนมีติดขัดอยู่บ้าง และหวังว่าเราจะได้เจอกันอีกในบาร์แคมป์อื่นๆ ครับ

After trying to push my session up in ComKUCamp #2 (Twitter Addict (solo) and Retro Gaming (team)) which were dropped, and got a team-talk in Barcamp Bangkhen #1 the following year, I finally got my place with “What (programming) Language do you Speak?”. At first the reception seemed bad and my topic was under-voted because, in past BarCamps, topics like love, free stuffs, music and girl models are hotter. But this time, with many more rooms, I got a surprise opportunity. (Literally. Somebody notified me late.)

So, I was late to the session room, and had to find wall-plug, boot up the laptop (it failed once due to low battery), no presentation file, and just opened sites like LangPop , Stack Overflow  or Wikipedia®  to present various data and examples. I look like (and partly am) a careless one, but actually, even if I had prepared the presentation slides, I wouldn’t prepare many pages because I have only few topics set, such as popularity of programming languages all over the world and in-competitions, followed by various language features (overloading, strong/weak typing, etc.) and make fun of some languages’ features, then finally followed by discussion.

It turned out that I didn’t prepare enough, so it ended up being me presenting LangPop page, asked people what languages they know (one of the freshmen knows CoffeeScript), then asked about experience and answers range from almost nothing to Cassandra to creating a Python variant. This became a room filled with people of many kinds of experiences, so the discussion turned out very well.

When I asked about disliked language, the CoffeeScript junior told me about sorting in VB6, so I went on and explained everyone about overloading that if you don’t overload, you need things like sort_int(int [] n), sort_double(double [] n), sort_string(string [] n), etc. and if we have overloading everything comes under single name sort. I also went back to talk about sorting in C where you have to write your own comparator function. All in all, I mainly used audience feedback to select a new topic to talk. I admit it was very hard, because I need to know the discussion very well and how it tends to move, as well as thinking and speaking entirely in English.

Then I talked about esoteric languages including Brainfuck, LOLCODE, Shakespeare, Chef and Whitespace with humor as intent. For example, when talking about Brainfuck I compared it to Turing machine’s tape structure, opened lolcats pictures when talking LOLCODE, showing Shakespearean Illiteracy when talking Shakespeare, and talk about Chef when it’s noon — when everyone’s hungry.

After session, two foreigners approached and made contact. Let this be known: I’m not that great. I thank everyone interested even if dragged off by Beartai  session in another room, and I apologize for my unpreparedness and struggles when speaking. I hope to see you again in the other BarCamps.

Trolling, videos of interest and trademark/copyright usage/notice are available after the break.
Continue reading Barcamp Bangkhen 2 [บาร์แคมป์บางเขน 2]

sigproc-if (Signal Processing Module Interface)

[Due to the immense amount of information, let’s speak English only this time.]

As course 01204325 Data Communication and Computer Networks at Kasetsart University requires use of signal processing tools, professor Chaiporn Jaikaeo (ชัยพร ใจแก้ว) has generously offered the tool he developed, the Python Signal Processing Module.

However, it has come to my attention that many of my classmates do not have enough Python-affinity, so I hereby present you with the “sigproc-if” package (full name: Signal Processing Module Interface), containing the .wav-Splitter (wavesplitter.py) and the .wav-Shifter (waveshifter.py) scripts.

Installation

This script package is very easy to install and use: Install by placing it next to the original sigproc.py, and run it as “python <scriptname> <command-line options> <arguments>”. Seriously, just like any other UNIX program, with “python” added in the front. We did this by using getopt and optparse.

Module Introduction

Splitter can split one .wav-file in terms of frequency, to as many channels as you please. Simply specify the list-of-frequencies for the program. It also has variable cutoff level. This cutoff is clear-cut, like how you cut a cake (which is not a lie!). The output channels will get a prefix which you can assign, and written into separate .wav files. If you need 4 channels, it will spit out 4 files.

Shifter can shift one (or many) .wav-file to any other frequency. There are 2 modes:

  • To-mode, where you specify destination frequency. Takes parameters -f as origin frequency (this program does not auto-detect) and -d as destination frequency.
  • By-mode, where you specify offset frequency. Takes parameter -f as offset frequency.

Here’s a catch: The -f and -d options have two modes in themselves. If you specify only one number (e.g. “-f 100”), it will be applied to all inputs. However, if you specify more than one frequency, the number must match that of arguments. For example, if you have 3 input files, the -f can be -f 100, or -if 100,200,300.

Usage Examples

tl;dr, please read here: Right, I think the manuals are too complex. Let’s see example:

Splitter Example

 ...$ python wavesplitter.py -f 200,600,1000 -c 20 XX.wav<br />
 

Program will split XX.wav into 3 files, each file will have “center frequencies” of 200, 600 and 1k Hertz respectively, with 20Hz “channel width” to each side. This will produce 3 files with following frequencies:

  • 180 to 220 (200±20)
  • 580 to 620 (600±20)
  • 980 to 1020 (1000±20)

NOTE: You can omit the -c or keep it zero, but this is not recommended, as the underlying signal processing may somehow “miss” those frequencies you specified. (and probably unavoidable due to sampling and digital signal stuff) If you are really sure your channels are completely clear-cut (e.g. input really is just a mix of few sine-waves), please at least, for Fourier’s sake, use c of something small like 10 or 15. It can’t hurt.

NOTE: If nothing appears in any of your favorite wave-editor application after splitting, please increase the -c value. This was noted by Monai “WuDragon” Thangsupanich. Thanks for bringing this up.

Shifter Example

With output files from Splitter, we can also put them into Shifter. Unfortunately, it is not possible to pipe them. We really cannot let wave signal data into the shell, right?

 ...$ python waveshifter.py -f 200,600,1000 -d 50 -t output.200.wav output.600.wav output.1000.wav 

With this code, program will activate its “to-mode”, with destination frequency as 50Hz, and will use -f option to map the “origin frequency” to the input files. The program now knows how much it will need to shift. The output will be suffixed with details on frequency changes.

What did we do in these examples? Clock’s ticking …………………………. time’s up. We have:

  • split the original wave file into three channels, at 200, 600 and 1000Hz each, with 20Hz window
  • shifted all those outputs so they are centered on 50Hz mark

Now we can use our other favorite tools to analyze them!

NOTE: It is important that in frequency lists you do NOT add space between numbers. Program will interpret it all wrong if you do so. It also must be comma-separated, and not semicolon or anything else. This is to keep the (already unnecessarily overcomplicated) program simple.

Downloads & Requirements

You can download the files directly from this website:

The two files I supplied are 100% powered by professor Chaiporn Jaikaeo’s sigproc package. You will need it. In turn, sigproc requires Python (preferably 2.6.x), NumPy, SciPy and Matplotlib. You will need all of them. If you’re on Ubuntu, you can whip up that Synaptic or fire the apt-get in the Terminal. If you’re on Windows, good luck…

Please leave a comment below if you find bugs or have suggestions. Do not comment in Facebook, Twitter, or wherever I posted. I cannot keep track of comments when they’re scattered. And if you really need to know about license: Yes you are free to use for your education, homework, or whatever you see fit. If you redistribute any file (modified or not), please list my name in your new source file, or link to this page as well (permalink or homepage). If you decide to make money, I won’t stop you, but you cannot sue me if your business crashes overnight. THERE IS NO WARRANTY! NOT EVEN THE … whatever legal stuff is. THIS CODE IS NOT COMPLETE! You’ve been warned!

About sigproc

Sigproc is a great signal processing module written in Python. It allows many simple signal processing from wav files, including filtering (by lambda function, so you can create any *pass filter.), frequency shift, amplification/attenuation, edit a frequency’s amplitude, mix signals together, and even plot it as time-domain, frequency-domain and phase graphs! Of course, that’s not all. Unlike my scripts, this module is object-oriented, so you can do many things with it.

[Python] Simple ASCII Art (well, not ASCII but yeah…)

วันนี้ผมไปเจอรุ่นน้องคนนึงบนเฟซบุคครับ เขาอัพ “ASCII Art” สะกดเป็นชื่อเขาเองดังนี้ครับ
Today I met a school junior on Facebook, who uploaded an “ASCII Art” spelling his own name, like this:

 
░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
░░███▄░▄██▄░█░░░█░███▄░▄██▄░░
░░█░░█░█░░█░██▄██░█░░█░█░░█░░
░░█▀█▄░█░░█░█░█░█░█▀▀░░█░░█░░
░░█░░█░▀██▀░█░░░█░█░░░░▀██▀░░
░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
 

ไม่นานผมก็เจออีกคน เสนอให้เขียนชื่อจริงนามสกุลจริงที่ค่อนข้างยาว ผมก็คิดได้ว่าถ้ามันยาวๆ แล้วจะเขียนโปรแกรมดีมั้ย คำตอบนั้นคือ ใช่
Then I found another person suggesting that thread opener write another name, I mean, first and last names. I started to think – “Should I code this?” The Answer, is Yes.

และผมก็เขียนสคริปต์สำหรับพิมพ์ตัวอักษรแต่ละตัวขึ้นมา
Then I wrote a script to print each character out.

 d = {}
def w(s):
    Z =  ['░░','░░','░░','░░','░░','░░']  //add two spaces at beginning
    for c in s:
        for i in range(6):              //print each row
            Z [i] +=d   [i] +'░'           //pad end of char with 1 space
    for i in range(6): Z [i] +='░'        //1 more space at end
    print('\n'.join(Z))                 //print them all 

ผมสร้างตัวแปร d เป็น dict แต่แค่นั้นยังไม่พอ เพราะ d ยังไม่มีตัวอักษรเก็บไว้เลย ผมจึงพยายามใส่ตัวอักษรเข้าไป แต่ทำทีละตัวมันช้า ผมก็เลยสร้างสคริปต์สำหรับใส่ตัวอักษรเข้าไปใน d โดยอัตโนมัติ
I created a dict d, but it still has no values. I tried adding some but it takes very long, so I decided to write another script that adds the character data automatically.

 def wrap(s):
    s = s.split(' ')
    return  ['░'*len(s[0] )] + s +  ['░'*len(s[0] )] //add equally-wide spaces to top & bottom rows 

สคริปต์นี้จะรับข้อมูลตัวอักษรที่แต่ละบรรทัดถูกแบ่งด้วยเว้นวรรค เช่น
This script will accept space-separated data string, like this

 ░░░░ \
▄██▄ \
█░░█ \
█▀▀█ \
█░░█ \
░░░░ 

อันนี้คือผมใช้ \ ขึ้นบรรทัดใหม่ให้ดูง่ายนะครับ สังเกตว่าผมมีเว้นวรรคก่อนจบบรรทัดด้วย เอาเป็นว่า พอเราไปรันใน console (แต่ผมเทสด้วย IDLE นะครับ) แล้วก็จะแปลงเป็น
In this case I used \ (backslash) to make it easier for you to read. Note that I still have to add spaces before the \ sign. Anyway, when I throw all that into wrap() it resulted like this:

  ['░░░░', '▄██▄', '█░░█', '█▀▀█', '█░░█', '░░░░']  

ซึ่งเราก็เอาไปกำหนดให้กับ d [‘A’] ได้เลย
Which I assigned it to d [‘A’]

จากนั้นก็ทำไปเรื่อยๆ (ออกแบบนี่ต้องทำเองนะครับ เหนื่อยมาก แถมไม่สวยอีก) ตั้งแต่ A-Z และเลข 0-9 พอออกแบบตัวอักษรครบก็เอามารันเลยครับ มาดูตัวอย่างการใช้งานจริงกัน (ก๊อปมาจากจอ IDLE)
Then I continued working on other characters, A-Z, 0-9, ! ? .. Here is an example of what it would look like running from IDLE:

 >>> writeascii('LUNATICNEKO.COM')
░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
░░█░░░░█░░█░█░░░█░▄██▄░████░█░████░█░░░█░█▀▀▀░█░░▄▀░▄██▄░░░████░▄██▄░█░░░█░░
░░█░░░░█░░█░██▄░█░█░░█░░▐▌░░█░█░░░░██▄░█░█▄▄▄░█▄▀░░░█░░█░░░█░░░░█░░█░██▄██░░
░░█░░░░█░░█░█░▀██░█▀▀█░░▐▌░░█░█░░░░█░▀██░█░░░░█░█░░░█░░█░░░█░░░░█░░█░█░█░█░░
░░█▄▄▄░▀▄▄▀░█░░░█░█░░█░░▐▌░░█░████░█░░░█░█▄▄▄░█░░▀▄░▀██▀░▄░████░▀██▀░█░░░█░░
░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ 

ขอให้สนุกกับการทำ ASCII ถึกควายครับ
Have fun!

*NOTE: Actually this is not ASCII. It’s Unicode, but it’s called ASCII art due to this kind of art date back to ASCII ages. (Would it be called EBCDIC Art if it was invented a few years earlier?)

P.S. Here is the “assignment instruction” for dict d.

 d={'!':  ['░', '█', '█', '█', '▄', '░'] , ' ':  ['░░░', '░░░', '░░░', '░░░', '░░░', '░░░'] , '.':  ['░', '░', '░', '░', '▄', '░'] , '1':  ['░░░', '░▄█', '▀░█', '░░█', '░░█', '░░░'] , '0':  ['░░░░', '░▄▄░', '█░▞█', '█▞░█', '▀▄▄▀', '░░░░'] , '3':  ['░░░░', '░▄▄░', '▀░░█', '░▀▀▄', '▀▄▄▀', '░░░░'] , '2':  ['░░░░', '░▄▄░', '▀░░█', '░▄▀░', '█▄▄▄', '░░░░'] , '5':  ['░░░░', '▄▄▄▄', '█░░░', '▀▀▀▄', '▄▄▄▀', '░░░░'] , '4':  ['░░░░', '░░▄░', '░▟█░', '▟▄█▄', '░░█░', '░░░░'] , '7':  ['░░░░', '▄▄▄▄', '░░░█', '░▄▀░', '█░░░', '░░░░'] , '6':  ['░░░░', '░▄▄░', '█░░░', '█▀▀▄', '▀▄▄▀', '░░░░'] , '9':  ['░░░░', '░▄▄░', '█░░█', '░▀▀█', '░▄▄▀', '░░░░'] , '8':  ['░░░░', '░▄▄░', '█░░█', '▄▀▀▄', '▀▄▄▀', '░░░░'] , '?':  ['░░░░', '░▄▄░', '▀░░█', '░░█░', '░░▄░', '░░░░'] , 'A':  ['░░░░', '▄██▄', '█░░█', '█▀▀█', '█░░█', '░░░░'] , 'C':  ['░░░░', '████', '█░░░', '█░░░', '████', '░░░░'] , 'B':  ['░░░░', '█▀▀▄', '█▄▄▀', '█░░█', '█▄▄▀', '░░░░'] , 'E':  ['░░░░', '█▀▀▀', '█▄▄▄', '█░░░', '█▄▄▄', '░░░░'] , 'D':  ['░░░░', '███▄', '█░░█', '█░░█', '███▀', '░░░░'] , 'G':  ['░░░░', '█▀▀▀', '█░░░', '█░▀█', '█▄▄█', '░░░░'] , 'F':  ['░░░░', '█▀▀▀', '█▄▄▄', '█░░░', '█░░░', '░░░░'] , 'I':  ['░', '█', '█', '█', '█', '░'] , 'H':  ['░░░░', '█░░█', '█░░█', '█▀▀█', '█░░█', '░░░░'] , 'K':  ['░░░░░', '█░░▄▀', '█▄▀░░', '█░█░░', '█░░▀▄', '░░░░░'] , 'J':  ['░░░░', '░░░█', '░░░█', '░░░█', '▀▄▄▀', '░░░░'] , 'M':  ['░░░░░', '█░░░█', '██▄██', '█░█░█', '█░░░█', '░░░░░'] , 'L':  ['░░░░', '█░░░', '█░░░', '█░░░', '█▄▄▄', '░░░░'] , 'O':  ['░░░░', '▄██▄', '█░░█', '█░░█', '▀██▀', '░░░░'] , 'N':  ['░░░░░', '█░░░█', '██▄░█', '█░▀██', '█░░░█', '░░░░░'] , 'Q':  ['░░░░', '▄██▄', '█░░█', '█░▄█', '▀▀▀█', '░░░░'] , 'P':  ['░░░░', '███▄', '█░░█', '█▀▀░', '█░░░', '░░░░'] , 'S':  ['░░░░', '▄▀▀▄', '█░░░', '░▀▀▄', '▀▄▄▀', '░░░░'] , 'R':  ['░░░░', '███▄', '█░░█', '█▀█▄', '█░░█', '░░░░'] , 'U':  ['░░░░', '█░░█', '█░░█', '█░░█', '▀▄▄▀', '░░░░'] , 'T':  ['░░░░', '████', '░▐▌░', '░▐▌░', '░▐▌░', '░░░░'] , 'W':  ['░░░░░░░', '▌░░▐░░▐', '▐░░▌▌░▌', '░▌▐░▐▐░', '░▐▌░░▌░', '░░░░░░░'] , 'V':  ['░░░░', '▌░░▐', '▐░░▌', '░▌▐░', '░▐▌░', '░░░░'] , 'Y':  ['░░░░', '▚░░▞', '░▚▞░', '░▐▌░', '░▐▌░', '░░░░'] , 'X':  ['░░░░', '▚░░▞', '░▚▞░', '░▞▚░', '▞░░▚', '░░░░'] , 'Z':  ['░░░░', '███▛', '░▗▛░', '░▟▘░', '▟███', '░░░░'] } 

Dedication: This article was inspired by “ร่มโพธิ์ หงศ์ลดารมภ์”‘s post on Facebook. Thank you very much.

[Python] O(n^n)

I saw a post on Facebook, stating something, like a rant, about O(n^n). Well, here is a Python script that will generate C program which really runs on O(n^n) order, where n is a number given in the Python call.

 def getexpn(n):
	for line in ['#include<stdio.h>\n','int main(){\n',\
	'int i [%d] ;'%n,'int c=0;\n']\
	+['for(i [%d] =0;i [%d] <%d;i [%d] ++){\n'%(i,i,n,i) for i in range( n)]\
	+ ['printf("%d\\n",c++);\n','}'*n,'\nreturn 0;\n','}'] :
		print line, 

Here’s a program generated with n=10

 #include<stdio.h>
int main(){
int i [10] ; int c=0;
for(i [0] =0;i [0] <10;i [0] ++){
for(i [1] =0;i [1] <10;i [1] ++){
for(i [2] =0;i [2] <10;i [2] ++){
for(i [3] =0;i [3] <10;i [3] ++){
for(i [4] =0;i [4] <10;i [4] ++){
for(i [5] =0;i [5] <10;i [5] ++){
for(i [6] =0;i [6] <10;i [6] ++){
for(i [7] =0;i [7] <10;i [7] ++){
for(i [8] =0;i [8] <10;i [8] ++){
for(i [9] =0;i [9] <10;i [9] ++){
printf("%d\n",c++);
}}}}}}}}}}
return 0;
} 

Useless but hey, just enter 100 in a script and you’ll get a program to generate number even larger than Googl… I mean Googol (1E100) itself! Oh, and the code is purposefully made to be ugly.

[Python] The Value of Words

หลายท่านคงเคยได้รับฟอร์เวิร์ดเมล์เกี่ยวกับอะไรทำนองว่า ถ้าคุณจับตัวอักษรภาษาอังกฤษ A..Z เป็นเลข 1..26 แล้วเอามาบวกกันแบบสตริง จะได้เป็นตัวเลขอะไรทำนองนั้นมั้ยครับ? ประมาณว่า

Have you been getting fwd-emails about something along the lines of, converting alphabets A..Z into integers 1..26 and “sum them up”, the resulting number will have certain meaning? Like …

T+I+M+E = 47
A+T+T+I+T+U+D+E = 100
L+O+V+E = 54

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

So I’ve written a simple Python function that accepts any word, strips all unrelated symbols, and return the said value. Maybe not that useful, but it’s exams so…

The Code

 def wordvalue(w):
	w = w.lower()
	s = "abcdefghijklmnopqrstuvwxyz"
	table = {s [i] :(i+1) for i in range(26)}
	return sum( [table[ch]  for ch in w if ch in table]) 

บรรทัดแรก เป็นการประกาศฟังก์ชันว่าจะรับ w ใดๆ (เขียนแบบไพธอน ถ้าเป็น C ก็คงต้องบอกว่า char [] )
บรรทัดที่สอง เราแปลง w ให้เป็น “ตัวอักษรเล็ก” ทั้งหมด
บรรทัดที่สาม เราให้ s เป็นสตริงจาก a ถึง z
บรรทัดที่สี่ เราสร้าง “ตาราง” (จริงๆ คือ “dictionary”) เพื่อใช้ค้นหา โดยตัวอักษรแต่ละตัวในสตริงจะไปตรงกับตัวเลข 1-26
และสุดท้าย ในวงเล็บของ sum นั้นคือการสั่งให้แปลงตัวอักษรตาม dictionary ที่่กำหนดไว้ แล้วทำเป็น list แล้วใช้ sum รวมค่าทั้งหมด

We declare function which accepts any w, converts it to small chars. Then we create a string s which is the alphabets, make table a dictionary which maps a,b,c,…,z to 1,2,3,…,26. Then we converts all characters in w, one by one, into numbers in a “list” and immediately use sum() to give summation of value.

Usage

เวลาใช้ก็โยนใส่ command line หรือเซฟเป็น .py แล้วรัน python -i <filename> ครับ เรียกใช้ฟังก์ชันโดยอาศัย pattern ที่ระบุในโค้ดครับ (w ต้องเป็นสตริง ไม่งั้นบึ้มเลย ผมไม่ได้เช็คตรงนี้นะครับ)

You can throw it into command line, or save as .py, open the Terminal and then python -i <filename>. Call the function as specified in the code. The w must be a string or it will die — I didn’t write anything to check for flaws.

Want to join in?

มีคำไหนเด็ดๆ โดนๆ ที่ “มูลค่า” มีความหมายแอบแฝงกับคำ หรืออะไรประหลาดๆ ก็บอกกันได้เลยนะครับ

Found strange words? Irony word values compared to word? Please drop a comment and tell me!