About koitsu

A somewhat-picky 30-something UNIX systems and network administrator living in the northern California bay. And unlike the gazillion others that live here, what I have to say might actually amount to something!

PUBG in-game Korean signs/messages

Non-asians who play PlayerUnknown’s Battlegrounds have probably encountered places in the game where there have been messages painted on the walls/floor in some foreign Asian language. A commonly-discussed one is this:

The written text is 極東의無敵者. This is Korean, specifically a combination of Hangul and Hanja. Hanja have Hangul equivalents, so the sentence becomes 극동의무적자 in pure Hangul. This Hangul can also be romanised as Geugdonguimujeogja.

For fun, let’s break things down word by word:

Hanja Hangul Romanised Hangul Meaning
極東 극동 geugdong East Asia / the Far East
n/a ui “of”, i.e. a possession particle
無敵 무적 mujeog unrivalled, i.e. invincible/invulnerable
ja “one who is” (comes after an adjective)

Therefore, roughly translated to English, we get something like “The invincible of the Far East”. The hanja have the same meaning in traditional Chinese too.

Okay, so what is 極東의無敵者 / 극동의무적자 exactly? What does it refer to?

극동의무적자 is an actual Korean film released in 1970. Wikipedia doesn’t include a plot description, nor does Movist, but but Daum does:

Korean: 핵연구의 세계적 권위자인 제임스 박 박사가 세계원자력세미나 참석차 동경에 방문했다가 신원을 알 수 없는 이들에게 납치당한다. 이에 한국 측 정보기관에서는 첩보원 HS-7호(남궁원)에게 이 사건을 담당케 하고, 이에 ‘강’이라는 이름으로 홍콩에서 활동 중이던 HS-7호가 동경으로 온다. 그는 이 사건이 일본 암흑가의 이케다(이대엽) 일파와 관련 있을 것으로 보고 그들 조직에 접근한다. 조직의 보스(허장강)는 강의 정체를 의심하여 기미코(남정임)에게 그를 감시케 하고, 수차례의 임무로 그를 테스트한다. 태연하게 도박사 행세를 하던 강은 이케다 조직이 중공과 연관된 왕태산(최성호) 일파와 접선할 예정임을 알게 된다.

English (badly translated by me, and probably incorrect in some manner): Dr. James PARK, a world-renowned nuclear physicist, is kidnapped during a nuclear energy seminar in Tokyo by an unknown group. The Korean Intelligent Agency gets involved, delegating the investigation to secret agent named “HS-7” (a.k.a. “Gang” (“river” in English)), who is actively stationed in Hong Kong but immediately heads to Tokyo. HS-7 determines the kidnapping was done by “Ikeda”, who is part of an Japanese underworld organisation, and attempts to infiltrate the org he’s part of. The boss of the org is suspicious of HS-7, sending “Kimiko” to monitor his activities and repeatedly test his loyalty. HS-7 discovers that the org has associations with “Taesan WANG”, an individual with direct ties to the CCP (Chinese Communist Party).

  • “HS-7” / “Gang” is played by 남궁원 (Won NAMKOONG)
  • “Kimiko” is played by 남정임 (Jeong-im NAM)
  • “Boss” is played by 허장강 (Jang-kang HEO)
  • “Ikeda” is played by 이대엽 (Dae-yeob LEE)
  • “Taesan WANG” is played by 최성호 (Sung-ho CHOI)

Someone posted the film on YouTube, without subtitles (not surprising for a film of this age). If you can understand Korean and like espionage/spy films, you might dig it.

So how does this relate to PUBG exactly?

It’s hard to say. I can see indirect correlations (e.g. maybe some of what’s going on in PUBG is caused by strange government organisations or espionage), but my gut feeling is that someone at Bluehole Studio in South Korea is simply a big fan of the film.


Candy 25 cabinets — hell on Earth, part 2

In late 2013 I wrote a blog post describing the negatives of owning one of SNK’s Candy 25 cabinets. I wanted to follow up to that with an incident that happened today, adding further justification.

For the first time in almost 10 years I had an interested buyer in the cab. A mutual friend introduced us, and both of them visited. The potential buyer seemed incredibly interested. Said mutual friend wanted to try out (or demonstrate) the fact that the cabinet had a rotatable monitor, and proceeded to do exactly that. This is something I had done before (maybe back in 2001) without issue, but I was very very careful about it, but since then had always run my display horizontally, not vertically. So I hadn’t rotated it for a very long time.

Continue reading

Moto G 2015 (3rd Gen) vs. 2013 (1st Gen)

Since mid-2014 I’ve owned a mobile phone: a Motorola Moto G 2013 (1st Generation model). When shopping for a phone (since the last time I owned a mobile was in 2002 or thereabouts), the requirements were pretty simple: low-cost (I cannot justify spending US$600), worked with T-Mobile (i.e. used GSM), and was something I could buy immediately (vs. buying it through the carrier + paying monthly charges). My friend Liz recommended the Moto G.

In May 2014 I purchased the 16GB GSM model from Amazon for US$199.95, and I’ve been mostly happy with it (my biggest complaint has been the selfie camera brightness bug introduced in KitKat 4.4.3, which still exists even as of Lollipop 5.1). I was also a Motorola beta tester of Lollipop (I had a lot of UI-related complaints, some of which got rectified, others didn’t).

However, odds are the Moto G 2013 won’t get Marshmallow 6.0 (another example of Google and vendors focused excessively on their cash cow of forcing people to buy new phones just to get software updates), and I had begun to encounter several applications which really didn’t perform very well. And that selfie camera bug really pissed me off (yup, I’m OCD about bugs).

I began looking for a replacement phone with the same requirements as before, and of course was introduced to the Moto G 2015 (3rd Generation model). The 8GB model was US$179.99, while the 16GB model was US$219.99. The 2015 model included a microSD slot (the 2013 model doesn’t have one), and after doing some research I found that with Marshmallow you’d be able to use your microSD card for system space/storage; it didn’t make much sense to me to spend US$40 to get 8GB of space when I could spend US$14 and get a high-end 32GB microSD card. After reading several reviews of the 2015 model, I ended up purchasing the 8GB version from Amazon. The first one I received actually had dead pixels and a touch screen that seemed non-responsive about 20% of the time (more on that in a moment), so I got a replacement (which had no dead pixels).

Below are the reasons why I’ve chosen to return the 2015 model and stick with my 2013. This is literally the only “review” of this sort — specifically giving a negative opinion rather than a positive — that I could find, so apparently I’m in the minority.

Continue reading

Sharing introverted communication wisdom

I’ve been having a lot of interpersonal conflicts with people as of late, and after lots of introspection over several weeks, I decided to write down some thoughts I had. Below is what I put down this morning.

Being an introvert is difficult, given that American society caters to and is predominantly extroverted, but the world becomes a completely different place when you have people who are neglecting you either directly/intentionally or indirectly.

Those who aren’t introverted often seem to have difficulty understanding that our time alone (to recharge, recompose) doesn’t mean we don’t want contact, we just want contact that amounts something: something with weight or substance. Small 5-10 minute chitchats, or “conveniently short” texts discussing trivialities, do not make us feel appreciated nor do they give the impression the listener is applying empathy (trying to connect with their conversation partner) — instead, the introvert is left feeling unfulfilled and in many cases belittled. They feel like best-effort communication is being prioritised over quality.

In today’s world so many people “don’t have time” for X/Y/Z. The excuses are literally endless. I’ve always maintained that making time for things (especially people) you care for is always worthwhile. Rebuttals like “there need to be more hours in a day” are nothing but impractical and convenient excuses. If I can make time for you, surely you can make time for me — golden rule and all that.

I don’t think I’ve ever heard a person ask another “is the way we communicate fulfilling? Are you happy with how we talk?” Maybe those are questions that, if were to become more commonplace, would save more friendships and relationships.

I’m of the strong belief that this advice can apply to extroverts too, but it’s important to remember that the nuances and needs of introverts and communication are different.

小鸡小鸡 (Chick Chick) lyrics (Chinese and English)

Rollin’ WANG’s 小鸡小鸡 (小雞小雞 / xiao3ji1 xiao3ji1 / Chick Chick) video is currently a viral hit. It also happens to be one of the Mandarin videos that I absolutely love — it’s probably the only thing that makes me want to get up and dance.

I thought it’d be and maybe benefit non-Mandarin speakers to translate the lyrics. But honestly it’s not that hard: a lot of it consists of onomatopoeias (words imitating sounds), and the rapping part has no actual lyrical content (it’s just about making sounds that have a good rhythm).


Continue reading

Ruby warnings and scope

Today I wrote some Ruby code at work. We use Ruby 1.8 for reasons I won’t go into here. The code works fine, no issues. But we use Rubocop (under Ruby 1.9) to enforce consistent styles and also to look for any kind of oddity situations that might bite us.

Today Rubocop complained at me about my code. Likewise, many versions of Ruby complained in the same manner, excluding Ruby 1.8. Since the actual code I wrote wouldn’t make any sense to readers, I wrote a very easy-to-understand test case that reproduces the problem reliably, with lines 7 and 10 highlighted:

# Encoding: UTF-8

foo = true

if foo
  bar = 'something'
  puts bar
  [1, 2, 3].each { |bar| puts 'hello' }

The warning message, both from Rubocop under Ruby 1.9, and from multiple versions of Ruby via ruby -w natively:

jdc@ubuntu:~$ rvm list

rvm rubies

=* ruby-1.8.7-p374 [ x86_64 ]
   ruby-1.9.3-p547 [ x86_64 ]
   ruby-2.1.0      [ x86_64 ]
   ruby-2.1-head   [ x86_64 ]

# => - current
# =* - current && default
#  * - default

jdc@ubuntu:~$ rvm 1.8.7-p374 do ruby -w ./x

jdc@ubuntu:~$ rvm 1.9.3-p547 do ruby -w ./x
./x:10: warning: shadowing outer local variable - bar

jdc@ubuntu:~$ rvm 2.1.0 do ruby -w ./x
./x:10: warning: shadowing outer local variable - bar

jdc@ubuntu:~$ rvm 2.1-head do ruby -w ./x
./x:10: warning: shadowing outer local variable - bar

jdc@ubuntu:~$ rvm 1.9.3-p547 do rubocop ./x
Inspecting 1 file


x:10:21: W: Shadowing outer local variable - bar
[1, 2, 3].each { |bar| puts 'hello' }

1 file inspected, 1 offense detected

I’m a C programmer (and also do assembly and Perl), so am quite familiar with -Wshadow, so the message itself made sense (most of what I found on Google were Ruby coders not understanding the message). But what didn’t make sense is that there was no shadowing violation here — the code within the if has a different scope than within the else. There is no way possible for these two to “share” scope, unless the language was horribly brain-damaged.

Simply renaming the variable bar (in either scope, but not both) rectifies the “problem”.

So, Ruby… do you simply not understand scope, or does your warning mode — which it appears very few people use (otherwise I’d have expected this to come up by now, and that’s pretty disappointing in itself) — simply have bugs (someone’s bison/yacc code is broken somewhere)?

The answer, as I found out in mid-2017, is that Ruby’s definition/concept of variable scope is unlike any other programming language I’ve used — and, if you ask me, borders on dangerous (I personally would use much more colourful language). In Ruby, variable scope segregation is limited to functions, classes, modules, procs, and blocks. Thus, in the above example, the if/else “sections” technically all have the same scope (i.e. main).

Equally dangerous and stupid, I also learned that Ruby internally declares the existence of a variable even if that code never gets run (i.e. the internal creation of said variable happens at parse-time, not run-time). As such, variables which are declared (but not used or not ever assigned to a value during run-time) end up with a value of nil (rather than throwing a variable-is-unknown error). A variable existing and assigned to nil is substantially different than a non-existent variable. With this design choice in mind, how can one trust the defined? expression? (answer: one probably can’t).

It never ceases to amaze me how much advocacy there is for Ruby, that has either awful design decisions (here’s another one) or bugs; it doesn’t matter to me which. No PL is perfect, but I would expect a language that’s been around since 1995 (with Ruby 1.8 being out as of late 2003) to have their ducks in order by now.

It’s amazing how nearly every single time I have to deal with Ruby, I find or encounter something like this.


Like NES/Famicom games? Good! So check out Brad Smith’s upcoming NES/FC game called Lizard:

There are fully-playable demos available for NES/FC (specifically a ROM file which you can use on your favourite emulator), PC (Windows), and Mac (OS X). Linux is a possibility if folks donate enough.

So stop reading this and go donate + help out. Every little bit counts! :-)