[Math] How to find drop rate after killing “x” monsters

English version available after the break. Summary: we are talking about how to find out the number of monster kills necessary to get a number of drops using statistics.

อีกประโยชน์ของวิชา prob stat: คำนวณว่าต้องตีมอนกี่ตัวถึงจะมีโอกาสเก็บ rare drop ได้ครบ โดยใช้ negative binomial distribution (Pascal distribution?)

สิ่งที่เราอยากรู้คือ CDF (cumulative distribution function) ไม่ใช่ PDF (probability density function) เพราะ PDF เป็นการบอกว่าจะได้ของครบที่การตี x ตัว แต่ CDF จะบอกเราว่าเมื่อเราตีไปแล้ว x ตัว โอกาสที่เราจะได้ของครบ (นับตั้งแต่การตีตัวแรก) เป็นเท่าไหร่

ยกตัวอย่างการตีความ จะได้ว่า
– PDF ที่ x = 5000 มี P(X=5000) = 0.001 แสดงว่า ความน่าจะเป็นที่ของดรอปครบตอนตีมอนได้ 5000 ตัวพอดีอยู่ที่ 0.001 หรือ 0.1%
– CDF ที่ x = 5000 มี P(X<=5000) = 0.6 แสดงว่า ความน่าจะเป็นที่ของดรอปครบตอนตีมอนไปแล้ว 5000 ตัวอยู่ที่ 0.6 หรือ 60% (อาจจะครบก่อนหน้านี้ก็ได้)

ฟังก์ชันใน Wolfram Alpha ชื่อ NB(r,p) โดยให้ r = จำนวนของที่จะใช้ และ p = drop rate
สำหรับ MATLAB หรือ octave สามารถใช้ nbinpdf และ nbincdf ในการหาค่าจาก PDF และ CDF ได้

plot

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

เปิดวาร์ป

Continue reading [Math] How to find drop rate after killing “x” monsters

C: One more reason why you must bracket one-line statement blocks

Because this code is bugged, of course.

Scenario: This piece of code determines if the cost of current permutation is the best one. If so, it sets the “new low” as the best cost possible. Otherwise, it will print a debug. Finally, the program will calculate next permutation and continue.

 //CODE 1
//#define DEBUG

if(this_cost < best_cost){
  best_cost = this_cost;
} else
  #ifdef DEBUG
  print_debug();
  #endif
next_permutation(perm); 

It has two different meanings entirely with and without DEBUG defined. This is what gcc understands if DEBUG is defined:

 //CODE 1.1
if(this_cost < best_cost){
  best_cost = this_cost;
} else
  print_debug();
next_permutation(perm);
// This code is correct 

And this case, not:

 //CODE 1.2
if(this_cost < best_cost){
  best_cost = this_cost;
} else
next_permutation(perm);
// This code is wrong 

The best way to avoid this problem is to bracketize every block statement, even one-liners like this case. This code would be more readable without affecting performance:

 //CODE 2
//#define DEBUG

if(this_cost < best_cost){
  best_cost = this_cost;
} else {
  #ifdef DEBUG
  print_debug();
  #endif
}
next_permutation(perm); 

Just a pair of braces stopped the damn bug. How could I be so careless?!

Barcamp Bangkhen #3

TO SPEAKERS: If I have FACTUAL ERRORS or OFFENSIVE MATERIALS within this entry, please contact me ASAP. I will remove (or correct, at your discretion) them at the first opportunity.

กลับมาอีกครั้งสำหรับบารแคมป์บางเขน การ(อ)สัมมนานอกกรอบที่ทุกคนจะได้แลกเปลี่ยนเรียนรู้ซึ่งกันและกันอย่างเสรี แถมเสื้อฟรีให้เอาไปใส่ได้ไม่ซ้ำใครด้วยละเอ้อ!! ครั้งนี้ผมก็ไปเข้าร่วมมาด้วย และมี session น่าสนใจเยอะแยะเลยครับ มาอ่านกันว่าผมไปเข้าห้องไหนมาบ้าง!
Here we come! The third Barcamp Bangkhen, the very great unconference where people will meet and exchange, and get FREE SHIRT while we’re at it! I joined this time as well, and there are loads of great sessions! Let’s see which rooms I joined.

(หมายเหตุ ที่เรียกว่าห้อง “เด็กD” ผมจะใช้คำกลางๆ ในที่นี้ว่า “Auditorium” นะครับ // “Auditorium” will be used to refer to the “DekD” room )

Session 2 Auditorium: ทำไงให้เว็ปเร็ว ตอน เว็ปช้ามากเบยยย (Make web faster)

โดย/by @vinboxx / Download Slide

การทำเว็บให้เร็วด้วยเทคนิคต่างๆ เช่น minification, caching, การทำงานกับ query string และ unique file name, การใช้ content delivery network เช่น CloudFlare เพื่อทำให้เว็บเราเร็วขึ้น โดยเราสามารถเลือกการใช้ content delivery ของเราได้ นำเสนอฟีเจอร์ต่างๆ ว่ามีอะไรบ้าง (ผู้เขียนคิดว่า CloudFlare ก็น่าสนใจดีนะ ^ ^)
Web acceleration using techniques like minification, caching, minding query string and unique file name, using CDNs like CloudFlare to accelerate website and its customization. Features of CloudFlare are also explored.

ต่อมาก็พูดเรื่องเครื่องมือหรือ tool ต่างๆ เพื่อช่วยในการพัฒนาเว็บที่เร็วขึ้นได้ เช่น ใช้ PageSpeed Tools หรือ pingdom วิเคราะห์เวลาในการโหลดเว็บ หรือใช้ WebPagetest เพื่อวิเคราะห์เว็บอย่างละเอียดก็ได้ ว่า optimization สามารถทำให้เร็วขึ้นได้มากขนาดไหน อย่างไรบ้าง
Then the speaker talked about tools that can be used to aid web acceleration like Google PageSpeed Tools, pingdom, or WebPagetest to analyze website for possible optimizations. (i.e. where we went wrong and made the site slow)

Session 3 Auditorium: Google Student Ambassador

โดย/by GSA Thailand

แนะนำ GSA, ทริปสิงคโปร์และกิจกรรมต่างๆ แจกของ งานและหน้าที่ของ GSA
Introduction to GSA, the Singapore trip, and SWAG!

ขั้นตอนการสมัคร

  1. ส่งแบบฟอร์มออนไลน์
  2. สัมภาษณ์กับ Google มีการสอบข้อมูลทั่วไปเกี่ยวกับบริษัทในรอบเช้า และการสัมภาษณ์ในรอบบ่าย โดยใช้การสุ่มตอบคำถามที่กำหนดไว้ เน้นการตอบคำถามมากกว่าตัวคำตอบ
  3. รอ 2 เดือน ประกาศผล ให้ส่งเอกสารต่างๆ เพิ่มเติม

Application Procedures

  1. Online form submission
  2. Interview with Google consisting of “examination” and “interview”. Decision is made more on presentation and delivery than the answer itself
  3. Results are announced after two months. Qualified individuals will be required to submit additional documents.

การเป็น Ambassador จะมีอายุงาน 1 ปี
Ambassadors will remain in position for one year.

บทบาทและหน้าที่

  • ต้องจัดกิจกรรมประชาสัมพันธ์ปีละ 5-8 กิจกรรม ตามที่เราเห็นสมควร โดยจะมีของแจกจาก Google
  • เป็นช่องทางการสื่อสารระหว่างมหาวิทยาลัยกับ Google

Roles and duties

  • Hold 5-8 PR events per year at their discretion. Google supplies swag.
  • To be a channel of communication between the university and Google

ตัวอย่างคำถามรอบสอบ

  • ผู้ก่อตั้ง Google = ไม่รู้ก็…
  • ผู้ก่อตั้ง Gmail = Paul Buchheit
  • Google ซื้อ Android ปีใด = 2005
  • Google ประเทศไทย ตั้งอยู่ที่ใด = CentralWorld ชั้น …
  • อะไรคือผลิตภัณฑ์ของ Google ที่บ่งบอกความเป็นตัวคุณ = iGoogle

Example Questions from examination round

  • Google founder = (you know ’em!)
  • Gmail founder = Paul Buchheit
  • The year which Google acquired Android = 2005
  • Where is the Google Thailand office = Somewhere in CentralWorld
  • Which Google product defines ‘you’? = iGoogle

Session 4 17304: Ruby on Rails

โดย/by Zack Siri / @artellectual

การพัฒนาเว็บด้วย Ruby on Rails การสร้างฐานข้อมูล platform ต่างๆ ที่เกี่ยวข้อง ฯลฯ Rails เป็น platform แบบ MVC (Model-View-Controller)
Web development using Ruby on Rails, database creation, platforms, etc. Rails is an MVC platform.

การสร้าง Controller จะมี convention ที่ชัดเจน คือเป็นกฎที่ชัดเจน เพื่อให้เราทำตามได้โดยง่าย โดยเราจะสร้าง Controller เองหรือจะให้ Rails ทำให้ก็ได้
Rails has specific conventions that must be followed. Controllers can be written manually or can be automatically created. Either way, they must follow the Rails conventions.

จากนั้นจะเป็นการสร้าง View ซึ่งจะบอกว่า controller นั้นจะแสดงผลออกมาอย่างไร โดย view จะต้องมีชื่อตรงกับ controller (ตรงนี้เป็น convention หนึ่งของ Rails) ทำให้การทำงานก็จะตรงไปตรงมามากขึ้น โดยเราสามารถที่จะใช้ helper method เพื่อให้เขียนเว็บได้ง่ายและเร็วขึ้นด้วยก็ได้ สำหรับตัวอย่างของ session นี้คือการสร้างเว็บฟอร์มง่ายๆ เก็บและแสดงข้อมูลได้
After creating model and controller it’s time for view. In Rails, view must have same name as controller. Helper methods can be employed for ease and speed. This session demonstrates simple case of web form creation that can collect and display data.

โดยสรุป ผู้เขียนก็ไม่ค่อยเข้าใจเท่าไหร่เหมือนเดิม เพราะไม่ค่อยคุ้นเคยกับ Ruby หรือ Rails ตั้งแต่แรก
I still don’t understand Rails much due to unfamiliarity with Ruby itself. Actually, I’m a bit familiar with Ruby, but I can’t figure out how to make websites out of them.

Session 5 17302: Methods of Payment: How we waste money on the Internet

โดย/by LunaticNeko / Download Slide

อธิบายองค์ประกอบที่จะนำไปสู่การใช้เงิน 5 ประการ (Product, Want, Money, Can Pay, Delivery) วิธีการคำนวณหาเงินที่ต้องจ่ายจริงจากราคาสินค้า ค่าส่ง อากรนำเข้า และภาษีมูลค่าเพิ่ม จากนั้นอธิบายถึงการจำหน่ายสินค้าแบบดิจิตอลและสินค้าเสมือน (digital and virtual goods) หนทางการหาเงินของเกมบน Facebook ว่ามาจาก 3 ทางหลัก ได้แก่โฆษณา โฆษณาแฝง และการจำหน่ายสินค้าเสมือนให้ผู้เล่น ต่อด้วยการแนะนำ Kickstarter ว่าเป็นแหล่งที่มาของธุรกิจที่จะนำเงินออกจากกระเป๋าเราด้วยนวัตกรรมต่างๆ มากมายในอนาคต
Describes the five components of spending (Product, Want, Money, Can Pay, Delivery), method to calculate how much one must really pay after shipping, import tariff, and VAT; describes digital and virtual goods sales. Facebook games earn money from three ways: advertisement, product placement, and virtual goods sales. Kickstarter is described as source of new businesses and innovations that can bring money out of our pockets.

ในส่วนต่อมา อธิบายการนำเงินออกจากกระเป๋าโดยใช้บัตรเครดิต หากไม่มีก็เป็นการสร้างบัตรเดบิตออนไลน์ผ่านบริการของธนาคาร หากไม่มีก็ใช้ช่องทางอื่นๆ เช่นบัตรเติมเงินของบริการต่างๆ หากไม่มีเงินจริงๆ ก็สามารถทำแบบสอบถามเพื่อแลกกับสินค้าเสมือนได้ ดังนั้น จะเห็นว่า แม้ว่าเราจะไม่มีเงิน ผู้ให้บริการก็ยังสามารถนำเงินออกจากกระเป๋าของเราได้อยู่ดี
In the next part, the presenter describes how to pay using credit cards, or debit if one does not have credit, or other payment methods like cash cards. If they really have no money, they can do surveys to earn virtual goods. This is summarized as “even if we don’t have money, they can still take it from us.”

ดังที่กล่าวไว้แล้วถึงองค์ประกอบการใช้เงิน 5 ประการ เราสามารถตัดองค์ประกอบตัวใดตัวหนึ่งเพื่อตัดการใช้จ่ายของเราได้ ทางที่ง่ายที่สุดคือใช้การควบคุมตนเองเข้ามาตัดความต้องการ (Want) ทิ้งไป โดยให้หลีกเลี่ยงการซื้อในขณะที่ความสามารถในการตัดสินใจลดลง การป้องกันไม่ให้ซื้อสินค้าในขณะที่ความสามารถในการตัดสินใจลดลง การปรับทัศนคติที่มีต่อสินค้าที่ล่อตาล่อใจ และสุดท้ายคือการลดละความต้องการทางโลก
As described earlier, if one of the five components of spending is eliminated, spending will not happen. The easiest way is to eliminate the Want by 1) avoid purchasing with impaired judgement, 2) prevent purchasing with impaired judgement, 3) change of initial attitude towards attractive items, and 4) reduce earthly desires.

จากนั้นผมก็แทบจะกลับบ้านทันทีครับ เพราะการบ้านเยอะ และมีงานต้องทำอีกหลายอย่างด้วย เช่นการอัพบล็อกนี้เป็นต้น
Then I left for home almost immediately due to many things to do, including homework and blogging.

บทสรุป / Conclusion

ขอขอบพระคุณ คณาจารย์ผู้รับผิดชอบกิจกรรม คณะวิศวกรรมศาสตร์ ผู้สนับสนุนทั้งหลาย ผู้ที่เข้าฟังการบรรยายของผม ตลอดจนวิทยากรทุกท่านที่ร่วมงานในครั้งนี้ และขอขอบคุณ น้องๆ ปี 2-3 ที่ช่วยกันจัดงานนี้เป็นอย่างดีครับ ปีนี้ผมคิดว่างานประสบความสำเร็จดีมากในแง่จำนวนคน แต่ยังมีข้อจำกัดเรื่องจำนวน “เซสชั่นเกรดเอบวก” ที่ยังมีน้อยเกินไป ทำให้ Auditorium ยังเป็นที่ของวิทยากรหน้าเดิมเช่นเคย
I hereby thank the faculty, the Faculty, sponsors, my audience, and all speakers who participated today. I also thank the Juniors and Sophomores who organized this as well. I think this year is quite good in terms of participation, but there’s still a lack of “A+ sessions” which results in the Auditorium still held down by the same old speakers.

แล้วพบกันใหม่ที่บาร์แคมป์ที่ไหนอีกซักแห่งครับ สวัสดี
See you again in the next Barcamp … somewhere! KTHXBAI!

อ้อ ขอบคุณ GSA Thailand สำหรับ Swag ด้วยครับ แต่ผมก็ยังไม่รู้ว่าจะเอามันเข้ามาใช้ในชีวิตประจำวันยังไง ขอใช้ขวดเก่าไปพลางๆ ก่อนนะครับ
Before I go, thanks GSA Thailand for the Swag. I still don’t know how to use this bottle so I’ll use the old one for a while. Thanks again!

[Game Review] Trigger Knight

null
Google Play Banner for Trigger Knight (Proprietary Image taken from Google Play)

Today I revisited an old game and played it once more. I liked it and its mobile edition enough to actually write another review specifically for it.

Web-based version of the game in progress (Screenshot of Proprietary Software)

This game, Trigger Knight, follows a blademaster girl who dashes around endlessly. Her life fading away, she ran and ran, destroying any enemies in her path, upgrades her gear, and get her “lifespan” restored from time to time.

Trigger Knight, developed by Mintsphere, utilizes the recently popular One-Button Gameplay Mechanic, which was popularized by games like Canabalt. You use just the left mouse button or screen tapping to interact. All running and combat are automatically executed.

Fortunately I have a potion right now. If not, I’ll be faced with a decision. (Screenshot of Proprietary Software)

I talked about upgrades. Yes, there are, but you have to decide wisely. You can only buy one specified item the shop you’re running over is offering, and there’s no turning back. Will you take it or leave it? Or to be more exact, will you take it and deny yourself a church (which without it you will fade and die) or a potion shop (which without potions you will be hit by the next monster and die too), or wait and grab that new sword from the next bladesmith? Your call.

For its simplicity, execution, graphics, and gameplay design I give it a really positive review. I was impressed by how much you can reduce a JRPG into a one-button arcade. It’s free, and it’s even mobile. Why say no to this game?

You can play Trigger Knight on “her” official homepage at Mintsphere , on Kongregate , or download from Google Play or App Store .

UPDATE: I really appreciate your quick response, MINTSPHERE! I’ve found another great thing on your website and I really want to share it: The BGM of Trigger Knight! Get it from MINTSPHERE now.

Skyrim Story II: Escalation

After mastering my “home turf” at Woodland Home in the previous post, I took my Nord “multi-role” for another spin. This time we met a bunch of civil war combatants (Imperials vs Stormcloaks) fighting each other near Redoran’s Retreat. Since my doctrine is to “unify Skyrim my own way, one troop at a time”, I went ahead and Fireballed both sides, prompting them to go after me.

A minute into the fight I realized there were too many Stormcloaks than I could handle. I decided to run away to the nearby bandit-owned Silent Moons Camp. While the name says it’s a camp, it’s a stairtop forge facility with moderate bandit garrison. Hoping for Stormcloaks and the bandits to slaughter each other. I knew the Stormcloaks would win, but this will give me some breathing room.

My break ended when I heard a dragon’s cry. My duties as the Dragonborn forced me to come out and slay the dragon, whatever means necessary. The situation escalated quickly when two mammoths entered the battle area. I did what I have to do: kill them all. Lacking proper rage spells, I shot more fireballs at the mammoths, prompting them to fight. After a lot of running and slashing, the dragon landed and relieved many Stormcloaks of their heads before succumbing to combined forces of swords, spells, and stampede. The dragon died, and I killed all the weakened loose ends.

Result of battle:

  • Imperial units routed
  • Stormcloak rebels suffered too much loss due to dragon attack and had to leave
  • One dragon and two mammoths slain
  • Silent Moons bandit camp nearby suffered heavy collateral damage, no survivors
  • Someone just got a hell a lot richer

Now I try embedding an album from imgur, too.

Skyrim Story: Battle of Woodland Home

null
(Photo: M’aiq the Liar in the water. Taken next to Woodland Home by BYOH mod, which is also right next to a WARZONE event area.)

Related Mods:
WARZONES (Nexus 9494)
Build Your Own Home (Nexus 18480)
Economics of Skyrim (Nexus 11919)
Skyrim Community Uncapper (Nexus 1175)
Uncapped Perks (Nexus 7015)

I shopped in Whiterun, at Belethor’s General Goods Store, then went to my “build-your-own-home” foundation in the woods using fast travel (f-you immersionfags). Somehow, Belethor followed me there too. It would have been nothing if there’s no WARZONE there — the area was infested by 10+ soulthirsty necromancers out for anyone’s lives, persistently.

I ran and ran, even though I was considered overpowered against bandits, I was a no-go against multiple necromancers as I was not equipped to fight head-on against too many enemies in open field at once. (Best way to deal with necromancers depends on character builds, but I just buff myself and slash’em to Oblivion.)

The area was too sparse for me to use Fire Breath shout (Yol), the enemies running too fast to use firebolts or bows either. Sword-dashing is also a suicide, so I had to run, run and run. It took me three minutes to realize that the mages were mostly fire-based, so I decided to use a leftover spell I had: Summon Flame Atronach (Atronach is like an “elemental” from other mythology themes)

Why fight fire with fire, some of you may ask? This is because being a fire mage does not automatically grant you fire resistance, but atronachs are MADE OF fire so they are always 100% immune. This means fire-mage vs flame-atronach fight is a one-way kill. If the mage can’t adapt, he dies.

The Atronach worked well until they got sniped by skeleton archers a minute into the fight. I had to rush those skeletons while dodging all other spells. As a role-play element, I restricted myself (mentally) from leaving the battlefield (it’s MY HOUSE there. I cannot abandon it!) and had to run around.

I eventually resorted to “lose the battle but win the war” scheme, went into hiding then sniped all those damn mages one by one.

After the last guy went down I went to the workshop and was jumped by another, one last mage. I took him down with the sword, then (mentally) kicked his body down the waterfall like in the movies.

*Character Build*
– Level: 51 (at time of fighting)
– Gender/Race: Female Nord
– Style: Sneak-based “versatile” (Light armor stealth battlemage)

Aftermath: M’aiq the Liar visited my house. He stood in the river, with no care to the world. I don’t know what happened to Belethor the merchant but I presumed he fled back to his city. He should not have tried to spy how I get my wares, and he should never ever consider that from now on.

[เขียนยามคิดว่าว่าง] “แท็บเล็ตคอมพิวเตอร์” หรือ “แท็บเล็ตพีซี”

มีความพยายามมากมายที่จะขีดเส้นแบ่งระหว่างคำว่าแท็บเล็ตคอมพิวเตอร์ (tablet computer) และแท็บเล็ตพีซี (tablet PC) ซึ่งผู้เขียนเองก็ได้ไปศึกษาจากแหล่งข้อมูลต่างๆ และพบว่าเส้นแบ่งดังกล่าวมีอยู่ในหลายมิติและหลายระดับที่แตกต่างกันออกไป

>> ดาวน์โหลดเอกสาร (PDF) <<

[Game Review] Air Conflicts: Secret Wars

(Picture from the game’s Steam page  showing a Spitfire killing German planes. Note the damage detail.)

I have recently come across this particular game released over a year ago, thanks to Indie Gala for this. Let’s get started.

Storyline

This game follows the story of Dorothy Derbec, a.k.a. DeeDee, whose father Guillaume Derbec was lost in WWI, requiring her to live with his father’s squadmate Tommy. She’s the sky-bound type of girl: uneasy on the ground, at peace in the air. She smuggled liquor right up until WWII reaches Tobruk where she does her job. Carrying her last name Derbec, Dorothy inherited a lot from her father.

Due to her need for mechanics, she met Clive, a drunk aircraft engineer who can’t fly but knows all his planes. Due to her need for money, she had to fight in this war. After a particular war event, she changes her view of the war. Money fell behind in her list of priorities. Along the way, DeeDee meets more of her father’s old squadron, learning his heroic tales through their words.

Of course, since there are heroic tales of a former ace mentioned, there must be flashbacks. Yes, flashbacks are presented with sepia-filtered levels with the player taking the role of the storyteller flying in biplanes, fighting the old WWI with the Derbec Dad. This means two campaigns are alternated: WWII campaign narrated by DeeDee, and the WWI campaign by her father’s friends.

The writer did good job designating a woman as the main character. “But it’s the air force not infantry!” seems valid as an excuse to insert women into violent games, along with “But she’s Lara Croft!” The old squadmates also provide good expansion to the story, filling the story of the old ace piece-at-a-time.

Gameplay

This game plays more like a flying arcade than a simulator. The entire plane has just one “health bar”, except in some rare cases you might score a critical hit which results in instant kill. Fortunately, it works one-way. The game sports many plane models ranging from the WWI-era biplanes to Spitfires to Messerschmitts.

In single-player, you just do what the others tell you to. Yes, exactly. To the letter. Sometimes there are time limits, sometimes not. Just be quick, add some firepower, top off with finesse, then you win. Since I cannot find anyone to play multi-player with, I have to leave that part out of this review.

The game also features a small amount of stealth-based missions, which are quite fun but also frustrating. On the other hand, sometimes you do the searching, for ground targets however. In this case, the game presents you with hidden ground targets. It needs some getting used to, but is very easy in the end.

The two-linear campaign style keeps the player focused on the missions rather than attempting to maximize gains or capitalize on events, while the player is given a choice of planes to suit his/her play style. I am in favor of this, as the game does quite good on storyline development. It’s good game if you just want to fly without the need to watch all the instruments: the most complex thing you can do to yourself is stall to death, which can be easily avoided by increasing throttle.

Graphics

Not quite good. While Air Conflicts utilizes the graphics card well, running on HDR and all, this game suffers a severe lack of model & texture detail on tanks and AA’s, which happens to be featured quite a lot in the game due to the need to bomb them. I do not appreciate cabbage-grade work, but due to budget level I will let it slide.

While the ground units are sub-par, the damage model of the planes are surprisingly detailed compared against the former, even though in terms of gameplay planes are “just one health bar.” The smoke caused by bombing and downed planes also look nice, at least from another plane’s distance (i.e. “the player). The plane is in the sky, so the ground might look a bit bad, but the sky is good. Reasonable. This shows that the development team did its prioritization well.

Sound

It’s traditional to review about sound of the game as well. While I play games, I do not really master the fine art of sound appreciation, let alone music. The compositions and effects are good but the narratives and dialogues don’t have enough appropriate emotions in the voice acting. They sound more narrated than acted, especially how each of Guillaume Derbec’s drinking-line in the game story, which I cannot tell you for it is integral to the storyline.

System Requirements and Purchasing

As stated in its Steam page (link above), I think this game requires a bit too much of a graphics card. This level of game should not require anything beyond Shader Model 2.0 cards, while AC requires 3.0. This requirement is reasonable however as the game uses quite a lot of graphic effects.

The game sells for $19.99 on US Steam, and for $6.24 or more (current price when writing this, along with other games) on Indie Gala VI . If you decide to purchase the game on Indie Gala you might find it worth the price, as it also includes other games, bringing the “perceived cost” of AC down to $3 or less.

So go for it, get the Gala pack. The entire package is worth even more.

Conclusion

Air Conflicts: Secret Wars is a nice game to play for the arcade fun and don’t care much about sub-par graphics and less-than-good narratives. It’s the gameplay and level designs that make this game fun and worth its (reduced) price. My final score would be 69/100, taking some points off for graphics and narratives.

Disclaimer

Neither the entry author nor the blog are related to Games Farm (the developer), bitComposer Games (the publisher), Steam, or Indie Gala. All trademarks are owned by their owners and not me. The image used above should fall within fair-use as I use it to identify the blog entry as related to the game, no free images could be created as any screenshots of the game are also non-free, only one medium-resolution image is used, and the author has attributed the source.

Internship, Days 33-35 (6-8 Jun 2012) [END]


(Photo: A gift from Symphony, and my faculty-paper)

สำหรับตอนนี้เป็นตอนสุดท้ายของซีรี่ส์ฝึกงานแล้วนะครับ ขออภัยที่มาช้าไปเล็กน้อย เริ่มกันเลยดีกว่า

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

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

This is the last episode in the internship series. Sorry for being late, let’s begin anyway.

During the three days I spent time with the new task analyzing data from emails. The emails have network data as <field> : <value> lines, which are easy to extract.

I didn’t think it would take time, but as the end of internship nears, I have to prepare the presentation as well as the papers to submit to matter where they are such as time record, etc. For this entry I’ll split into multiple parts, with Thai and English interleaving for easy reading.

งานชิ้นสุดท้าย / Last Task

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

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

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

As introduced earlier, the last task consists of email data extraction which works on the same system as mail alerts, but on a different context. The emails will come from the same source, but processing will be separated so we do not need to build another database-inbox.

The no-primary-key problem from email counting task also carries over, which I fixed by building an execution log which keeps track of the last time we checked emails, and will never revisit older emails no matter the reason. While this makes the system relatively faster, it suffers from the non-retroactiveness of email inspection, i.e. if you change the email definition midway, old and new data won’t be consistent. (So it might be better to delete the definition entirely)

Email definition can only be done on a per-sender basis without per-subject separation. The work is not done, but I will try to finish if possible, as it only benefits everyone.

การนำเสนองาน / Presentation

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

7th was the day the intern students present their works. Since I’ve talked to my supervisor that I will be explaining the work “from beginning to end” (reasons, requirements, architecture, implementation, demonstration, conclusion and suggestion) and I have four tasks to do (five actually: server installation, “vplay” video player, email counting, IDC system, and email data extraction but I won’t count the first)  and I ended up with 43 slides taking up more than half-hour while others used much less time; and I did it all without telling any kind of knowledge at all (I see my work as ordinary programming tasks so the process is more interesting than the code) while others presented more content and knowledge than I did. I felt awkward afterwards, but still happy being able to tell others what I do.

งานเลี้ยงส่ง / Farewell Party

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

The party was hosted at MK Restaurants, Robinson Ratchada. This was one of the few moments I get to talk to many friends and seniors at once. Thank you very much, and sorry for over(-the-budget)eating.

เคลียร์เอกสาร / Final Paperwork

การจัดการเอกสารทั้งหมด

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

Just do all the paper.

  • Copy the times from company log to faculty log, have supervisor sign it.
  • Photocopy everything that need to be submitted, except corporate secrets (which I don’t have.)
  • Write TODOs where needed, and document as much as possible
  • Submit last weekly report to HR
  • Return employee and lift cards

ขอขอบคุณ / Thanks to:

พี่ๆ ที่บริษัท CS LOXINFO ทุกคน

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

Thanks to all CS LOXINFO employees!

  • P’Pat (Pensopha Kamolnawin), internship supervisor
  • P’Gee (Keeratipong Ukachoke), technical advisor
  • P’Nui (Surasak Uthayopas), head of technical & operation department
  • P’Tik (Kanchisar Dunmai), HR
  • P’Yod (I don’t know your name), but more thanks if you actually buy me Diablo III instead of bragging how you earn so much from Auction House out loud :)
  • And everyone for providing me with enjoyable work environment and experience!

Finally, thanks to all friends in the same internship program, even though we don’t get to see each other much.

สำหรับผู้ที่ต้องการเนื้อหาหรือข้อมูลจากการฝึกงาน หากสามารถให้ได้จะให้นะครับ ติดต่อมาได้

For those who need content or data from internship, I will provide them if possible so feel free to contact.

Some more pics


At presentation, my two friends preparing


ASCII Art of company name, limited to 80 characters wide


Phase I of MK Pot


Phase II, and we ate them all.

You can view all internship posts here: http://lunaticneko.com/blog/?tag=school-internship