Interview and Coding

In many companies, coding related requirements/interviews are considered important to hire talented engineers.
However, there are several different ways to evaluate applicant’s skills and you may realise the thoughts of interviewers from that.
Let’s go through them!

1. Online coding tests like Codility

Some large IT companies use online tests after screening applied resumes.
Most of those problems are between entry and intermediate level, so you can easily solve them in most case. Actually, some problems are famous enough to find answers online such like Fibonacci. You may feel it much easier if you are good at some scripting languages like Python.

  • Pros: Easy to pass.
  • Cons: HRs and interviewers do not pay much attention.

Here’s a good collections of problems.
https://www.martinkysel.com/codility-solutions/

2. Whiteboard coding

Famous IT giant companies adopt coding on whiteboard during interview. Basic questions are related to data structure like trees or recursive coding. You need to ask details of questions before coding and do it quickly because interview time is limited.

  • Pros: Good chance to appeal your capabilities.
  • Cons: Takes long time. Missing discussion may affect to result a lot.

Here’s a big collection.
https://www.impactinterview.com/2009/10/140-google-interview-questions/

There’s a book about it.
https://www.amazon.com/Programming-Interviews-Exposed-Secrets-Landing/dp/1118261364

3. Public GitHub or your Apps

Some small companies request your GitHub when you apply to them.
They may check your green dots on your profile. wait. is it sure?
Perhaps your public repos are almost like rotten trashcan, so you would better to clean up beforehand.
If you have any published iOS/Android apps, you can send its source and published URLs. It will be a good chance to describe your product related skills and thoughts.

  • Pros: Easy to describe your motivation of coding.
  • Cons: Need to make regular contribution before applying.

Conclusion

Although you may think companies are going to check your abilities, the motivation behind varies.
Understand thoughts behind application processes and grab best opportunity for you!

 

Running OpenSSH sshd and MSYS2 rsync on Windows

OpenSSH and MSYS2 make it possible on Windows to use rsync over ssh which is a powerful tool for backup.

For OpenSSH installation, download
https://github.com/PowerShell/Win32-OpenSSH/releases

Basic instructions:
https://github.com/PowerShell/Win32-OpenSSH/wiki/Install-Win32-OpenSSH

Initially, I got an error running FixHostFilePermissions.ps1. So I omit that step. Then I saw these errors in sshd.log file.

560 13:02:08:686 error: Could not load host key: ./ssh_host_rsa_key
560 13:02:08:687 error: Could not load host key: ./ssh_host_dsa_key
560 13:02:08:687 error: Could not load host key: ./ssh_host_ecdsa_key
560 13:02:08:688 error: Could not load host key: ./ssh_host_ed25519_key
560 13:02:08:688 sshd: no hostkeys available -- exiting.

In my case, I needed to type the following command to run one of scripts.

powershell -ExecutionPolicy Bypass -File .\FixHostFilePermissions.ps1 Unblock

Next, I got this error after several tries of ssh connection from other computers.

3900 15:23:43:588 error: fork: Input/output error

I did these steps for each exe not to be blocked by antivirus.
Right click .exe -> Properties -> Unblock

For more details, see
https://github.com/PowerShell/Win32-OpenSSH/issues/844

To use public key authorization, you need to make .ssh/authorized_keys file.
On Windows, you need an extra work.

icacls C:\users\username\.ssh /grant "NT Service\sshd":R /T

For more details, see
https://superuser.com/questions/1041957/how-to-properly-configure-win32-openssh-authentication

To install MSYS2, download

http://www.msys2.org

Follow the instruction above.
After that, install rsync

pacman Sy rsync

Make sure /usr/bin of MSYS2 is included in PATH env.
Let’s try running rsync from linux like this.

rsync -azzv -e "ssh -p 20022 -i ~/.ssh/id_rsa" 'Backup@windows-pc:/c/users/someuser/Documents' /srv/share/Documents

Using Google Cloud Datastore on GCE

Cloud Datastore is a kind of Key-Value store provided as a full-managed service on Google Cloud.

It has been well known as a backend of GAE but it is also a good choice when we build apps on GCE.

 

Check official document for more details.

 

What is Cloud Datastore?

Cloud Datastore consists from these ideas.
  • Kind — A name of group of Entities
  • Key — A key to identify Entity. It can form Path with parents.
  • Entity — An object having Key and Properties

 

Understanding the idea of Key will make most difference for beginners.
So, let’s see it’s details.

 

Key in Cloud Datastore

There are 3 kinds of key.
Kind of key
What is it?
Basic key
A key having id and associated with project
Key with a parent
A key which has a parent key.
It is uniquely identified by <parent id, id>
Partial key
A key not having id/name field (yet).
It is used when you add an entity with auto generated id.
Key has these fields.
Required
Type
kind
yes
string
id/name
yes (no for partial key)
int for id, string for name.
(note: 1234 and ‘1234’ are differ!)
project
yes
string
parent
no
Key

 

Reuse of auto generated id

Because auto generated ids are frequently reused by Datastore, a newly generated id may has the same id of recently deleted entry.
Let’s consider what happens on a service having lots of users with associated private entities.

 

As a bad example,
If you assign an auto generated id to new user and delete the user’s entity when they unregister, a new user may have same id with old user.
It may cause unintentional privacy leak.

 

For Good practice,
  • Assign unique id or name from other identification (like Email, Facebook, Firebase, etc)
  • never delete user’s entity.
  • Use allocateIds method.

 

Remember, the uniqueness of Key is assured by its *path*.
Auto generated id may be duplicated if they has different Kind or Parent but it’s OK.

 

For more detail,

Appendix. Difference between GAE

You can see the difference of library from its import examples.

 

For GCE,
# Imports the Google Cloud client library
from google.cloud import datastore

 

Yes, it’s not from google.appengine.*
As documented below, the use of google.cloud is encouraged for apps those are hosted on GCE.

 

So, what’s the difference between them?
Actually, google.cloud library doesn’t have NDB APIs. People who started learning Datastore recently should not be confused with old documents!

 

Here’s latest Python document:

 

Have fun!

WindowsでFabric

Windows 環境で Fabric を使おうとしてハマったのでその解決方法を書いておきます。

環境

  • Windows 7
  • VisualStudio 2013 Express
  • Python 2.7.6
    • easy_installでpipインストール済み

手順

http://stackoverflow.com/questions/21829188/error-unable-to-find-vcvarsall-bat-when-installing-fabric-python-library-on
より

pip install fabric

を実行すると以下のようなエラーが出ました。

building 'Crypto.Random.OSRNG.winrandom' extension
warning: GMP or MPIR library not found; Not building Crypto.PublicKey._fastmath.
error: Unable to find vcvarsall.bat

以下よりビルド済みのPyCryptoを取得してインストールします。

http://www.voidspace.org.uk/python/modules.shtml#pycrypto

もう一度fabricのインストールをたたくこと今度は成功しました。

以上

コマンドラインオプションのusageの書式

一般に、UNIX系コマンドラインツールは-hや–helpオプションをつけると使い方が表示されます。 Cで言うgetoptが標準的で、さまざまな言語でサポートされています。

今時、オプション引数の一覧はライブラリが生成してくれることが多いですが、usageの内容までは生成してくれないようなのでちょっと調べてみました。

基本は、

  • Usage: で書き始める
  • 必須のものは名前のみ
  • 必須でないものは[arg]のように名前を括弧で囲む
  • 複数指定可能な場合は … を付ける
  • 引数付きオプションには分かりやすい引数名を付ける

というのが大まかなルールになっています。

以下、有名なコマンドのusageだけ抜粋してみました。

$ bash --help
Usage:  bash [GNU long option] [option] ...
        bash [GNU long option] [option] script-file ...

$ man --help
usage: man [-adfhktwW] [section] [-M path] [-P pager] [-S list]
        [-m system] [-p string] name ...

$ ls --help
Usage: ls [OPTION]... [FILE]...

$ sort --help
Usage: sort [OPTION]... [FILE]...
  or:  sort [OPTION]... --files0-from=F

$ uniq --help
Usage: uniq [OPTION]... [INPUT [OUTPUT]]

$ sed --help
Usage: sed [OPTION]... {script-only-if-no-other-script} [input-file]...

$ awk --help
Usage: awk [POSIX or GNU style options] -f progfile [--] file ...
Usage: awk [POSIX or GNU style options] [--] 'program' file ...

$ find --help
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]

$ grep --help
Usage: grep [OPTION]... PATTERN [FILE]...

興味深いのは、

  • オプションのネスト(uniq) [INPUT [OUTPUT]]
  • オプション引数の列挙(find) [-D help|tree|search|stat|rates|opt|exec]
  • 複数オプションを括弧の中に記述(find) [path…]
  • 引数の単語はハイフンでつなぐ(bash) script-file

など。 大文字小文字やスペースの数など多少のバラつきはあるようです。

オプションの有無で指定が大きく変わるものは、複数usageを表示することで分かりやすくしているようです。

参照

ログなどの巨大なテキストファイルから一部を切り出す方法

ログファイルなど、ファイルサイズが1GBやそれ以上ある場合に、テキストエディタを使わずにコマンドラインで一部を切り出す方法です。 gzip圧縮されたファイルは適当にzlessやzcatで読み替えてください。

  • 行の範囲を特定する

lessコマンドに-Nオプションをつけて目的のファイルを開き、”/”を押して対象の文字を検索します。

less -N filename
  • 範囲の切り出し

sedで目的の行番号の範囲を切り出します。1506224行目から1506377行目まで切り出したい場合は以下のようにします。

cat hugelogfile.log | sed -n 1506224,1506377p > clipped.txt

以上。

参考

* http://stackoverflow.com/questions/831681/how-to-display-line-numbers-in-less-gnu
* http://stackoverflow.com/questions/83329/how-can-i-extract-a-range-of-lines-from-a-text-file-on-unix

[Go言語] Goでのキャスト (型アサーション)

Go言語では、インターフェース型xから型Tについて、

x.(T)

のような記法を型アサーションと呼びます。 Tがインターフェース型の場合、動的な型xがインターフェースTを実装しているかどうかを確認します。

xがTを実装しているかどうかは実行時に決まるため、失敗する場合があります。 いわゆるダウンキャストに相当する操作をすることができるため、C++のdynamic_castや、WindowsのCOMで言うところのQueryInterfaceに近いイメージだと思います。

型アサーションが以下のように代入や初期化で使われると、(T, bool)のペアを返します。

v, ok := x.(T)

次の例では、FooableとBarableを実装した”Hogus”と、Fooableのみ実装した”Bogus”を作成して、型アサーションによってHogusがBarableにキャストできてBogusができないことを確認しています。

http://play.golang.org/p/GggE7R1yw2

package main

import "fmt"

type Fooable interface {
    Foo()
}

type Barable interface {
    Bar()
}

type Hocus struct {
    format string
}

func NewHocus() (*Hocus) {
    b := new(Hocus)
    b.format = "-- %s\n"
    return b
}

func (self *Hocus) Foo() {
    fmt.Printf(self.format, "Hocus Foo")
}

func (self *Hocus) Bar() {
    fmt.Printf(self.format, "Hocus Bar")
}

type Bogus struct {
    format string
}

func NewBogus() (*Bogus) {
    b := new(Bogus)
    b.format = "== %s\n"
    return b
}

func (self *Bogus) Foo() {
    fmt.Printf(self.format, "Bogus Foo")
}

func main() {
    testHocus()
    testBogus()
}

func testHocus() {
    var o Fooable
    o = NewHocus()
    o.Foo()
    p, ok := o.(Barable)
    p.Bar()
    fmt.Printf("Type assertion result is %t\n", ok)
}

func testBogus() {
    var o Fooable
    o = NewBogus()
    o.Foo()
    p, ok := o.(Barable)
    fmt.Printf("Bogus Barable is %T\n", p)
    fmt.Printf("Type assertion result is %t\n", ok)
}

参考

  • http://golang.org/ref/spec#Type_assertions
  • http://ja.wikipedia.org/wiki/%E5%9E%8B%E5%A4%89%E6%8F%9B

[Go言語] コンストラクタの書き方

Go言語のコンストラクタは以下のように書くことが推奨されています。

http://play.golang.org/p/oM5C26l8iw

package main

import "fmt"

type Person struct {
    Name string
    Age int
}

func NewPerson (name string, age int) *Person {
    if age < 0 {
        return nil
    }
    p := new(Person)
    p.Name = name
    p.Age = age
    return p
}

func main() {
    taro := NewPerson("Taro", 26)
    fmt.Printf("name: %s age: %d", taro.Name, taro.Age)
}

NewPersonは構造体の初期化を使って以下のように記述することもできます。

func NewPerson (name string, age int) *Person {
    if age < 0 {
        return nil
    }
    p := Person{name, age}
    return &p
}

Cに慣れた人にしてみるとローカル変数のポインタを返すことに違和感があるかもしれませんが、メモリ領域は呼ぶ度に新たに確保されます。

  • Effective Go – Constructors and composite literals
    http://golang.org/doc/effective_go.html#composite_literals

[Go言語] アノニマスフィールド(anonymous field)による継承とオーバーライド

Go言語には継承はありませんが、アノニマスフィールド(anonymous field)を使うことで共通のフィールドとメソッドを持つ構造体(struct)を作ることができます。詳しくはドキュメント等を参照して下さい。

今回は、アノニマスフィールドで継承した場合のオーバーライドの扱いを調べました。インターフェース渡しのメソッドでは元の構造体のメソッドが呼ばれます。ちょっと例が長いですが。

インターフェース渡しの例

http://play.golang.org/p/ebyaLR1ruQ

package main

import "fmt"

type Animal interface {
    Eat()
}

type Mammal struct {
    Weight int
}

type Human struct {
    Mammal
}

func (a *Mammal) Eat() {
    a.Weight += 11
}

func (h *Human) Eat() {
    h.Weight += 23
}

func main() {
    // Human
    h := &Human{Mammal{1}}

    serveFood(h)

    fmt.Printf("Human weight is %d\n", h.Weight)

    // Mammal
    m := &Mammal{1}

    serveFood(m)

    fmt.Printf("Mammal weight is %d\n", m.Weight)
}

func serveFood(a Animal) {
    a.Eat()
}

実行結果

Human weight is 24
Mammal weight is 12
Program exited.

一方、メソッドの引数にポインタを渡すとMammalのメソッドが呼ばれてしまいます。

ポインタ渡しの例

http://play.golang.org/p/ZEiHehkhID

package main

import "fmt"

type Mammal struct {
    Weight int
}

type Human struct {
    Mammal
}

func (a *Mammal) Eat() {
    a.Weight += 11
}

func (h *Human) Eat() {
    h.Weight += 23
}

func main() {
    // Human
    h := &Human{Mammal{1}}

    serveFood(&h.Mammal)

    fmt.Printf("Human weight is %d\n", h.Weight)
}

func serveFood(a *Mammal) {
    a.Eat()
}

実行結果

Human weight is 12
Program exited.

アノニマスフィールドのポインタを使うのは避けた方が良さそうです。

余談ですが、Goにはオーバーロードはありません。
http://golang.org/doc/faq#overloading

参考

[Go言語] インターフェース引数は値渡しなのか参照渡しなのか

Go言語(golang)にはポインタとインターフェースがありますが、「インターフェースへのポインタ」で渡す必要があるのかどうか。

結論から言うと、インターフェースはインスタンスへの参照を持っているのでインターフェースへのポインタを渡す必要はありません。
以下の例では、serveFoodメソッドにインターフェースで渡していますが、元のインスタンスが変更されていることが分かります。

http://play.golang.org/p/M6is2Gpe0B

package main

import "fmt"

type Animal interface {
    Eat()
}

type Human struct {
    Vital string
}

func (h *Human) Eat() {
    h.Vital = "full"
}

func main() {
    a := &Human{"empty"}

    serveFood(a)

    fmt.Printf("vital is %s", a.Vital)
}

func serveFood(a Animal) {
    a.Eat()
}

実行結果

vital is full
Program exited.

まあ、インターフェースの値って何なのか考えてみれば明らかだと思いますが、ポインタに不慣れな人には理解が難しいところかもしれません。

参考

データベースで1:1のリレーションシップはいつ使うのか

ちょっと気になって調べたところ、Stackoverflowに質問が。

Is there ever a time where using a database 1:1 relationship makes sense?

ベストアンサーのコメントを見ると、

A 1:1 relationship typically indicates that you have partitioned a
larger entity for some reason. Often it is because of performance
reasons in the physical schema, but it can happen in the logic side as
well if a large chunk of the data is expected to be “unknown” at the
same time (in which case you have a 1:0 or 1:1, but no more).

訳)
1:1のリレーションシップは一般に大きな実体をなんらの理由で分割したことを示している。しばしばそれは物理スキーマのパフォーマンスが原因であるが、大きなデータの固まりが同時には”未定”になるべき場合はロジックの側でも起こりうる。(その場合1:0か1:1以外にはならない)

例も書いてありますが、まあ拾い読みしていくと以下のような感じかなと。

  • パフォーマンス
    • 行ロック
  • DB容量
    • BLOB
    • ごく一部のレコードしかフィールドを持たない
  • セキュリティ

Vertical paritioningとも呼ぶようです。一つのオブジェクトを分割して保存していることには変わりないですが、特定のカラムが頻繁に更新されて、多くがNULLになる場合には考えてみてもいいかもしれません。

Reference

Linuxなどで、コマンドラインからファイルサイズの大きいファイルを見つける方法

Linuxなどで、コマンドラインからファイルサイズの大きいファイルを見つける方法

# du -a /var | sort -n -r | head -n 10

/varのところを、~に変えればホームディレクトリ以下ですね。
ファイルサイズを数値の降順でソートして10件だけ表示されます。

quotaでエラーが出た時に便利。

ネタ元:
How Do I Find The Largest Top 10 Files and Directories On a Linux / UNIX / BSD?

Git の References と Remotes

昨日、遅ればせながら Heroku を使ってみました。
それはおいおい書くとして、deploy するには @git push@ する必要があって、そのコマンドがふと気になったのでメモ。
ちなみに、私は git はたまに使う程度です。
h3. Heroku に push するコマンド
Heroku に push するコマンドは、
“公式サイトの説明”:http://blog.heroku.com/archives/2011/8/29/play/
にもあるように、以下のコマンドを使う。
bc. git push heroku master
確かにうまくいきます。
でも、 heroku と master って誰が決めたんでしょうか。プロジェクトが複数あってもそれぞれ heroku で push できるのはどういうこと ?
これは Git の References と Remotes というものでした。
“Pro Git – Pro Git 9.3 Git Internals Git References”:http://progit.org/book/ch9-3.html
本来、 Git のリポジトリは URL とハッシュ値で管理しているところを、『ローカルコピーごとに』エイリアスが付けられているんだなぁ、というお話でした。

Bullet Physics を iPhone で使う

iつみきで使っているライブラリのプロジェクトファイルはCMakeにこんな感じオプションを指定して作っています。
BULLET_PHYSICS.xcodeprojを開いて、LinearMath, BulletCollision, BulletDynamics あたりをビルドします。
できたライブラリは src/BulletDynamics/Debug などから適当にコピーして使います。
bc. #
$ cmake -DBUILD_SHARED_LIBS=OFF -DFRAMEWORK=OFF \
-DCMAKE_INSTALL_PREFIX=/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.3.sdk/System/Library/Frameworks \
-DCMAKE_INSTALL_NAME_DIR=/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk/System/Library/Frameworks \
-DCMAKE_C_COMPILER=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/llvm-gcc-4.2 \
-DCMAKE_CXX_COMPILER=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/llvm-g++-4.2 \
-DCMAKE_OSX_SYSROOT=/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk/ \
-DCMAKE_OSX_ARCHITECTURES=’armv6;armv7′ \
-DCMAKE_BUILD_TYPE=RelWithDebugInfo \
-DCMAKE_CROSSCOMPILING=ON \
-DBUILD_DEMOS=OFF \
-DBUILD_EXTRAS=OFF \
-DBUILD_UNIT_TESTS=OFF \
-DUSE_GLUT=OFF \
-G Xcode
iOS5 でもビルドできることは確認しました。
なんかいらなさげなオプションも一応つけたままにしています。ちなみにiPadだとarmv6のライブラリだと警告が出ます。
なるべくなら手動で操作するところを減らしたいので Framework にしたいところですが、 iOS では shared library が使えないため、今のところ static library を使っています。
iOSのバージョンが変わった場合が気になる人は Base SDK を Latest iOS に設定する良いかもしれません。
関連情報
– http://stackoverflow.com/questions/794137/how-to-set-up-cmake-to-build-a-library-for-the-iphone
– http://stackoverflow.com/questions/822404/how-to-set-up-cmake-to-build-an-app-for-the-iphone
– http://discussions.apple.com/thread.jspa?threadID=1549084
– http://www.cmake.org/pipermail/cmake/2009-October/032661.html

Mac OSX用

$ rm CMakeCache.txt
$ cmake -DBUILD_SHARED_LIBS=ON -DFRAMEWORK=ON \
-DCMAKE_INSTALL_PREFIX=/Library/Frameworks \
-DCMAKE_INSTALL_NAME_DIR=/Library/Frameworks \
-DCMAKE_OSX_ARCHITECTURES=’i386;x86_64′ \
-DCMAKE_BUILD_TYPE=RelWithDebugInfo \
-G “Unix Makefiles”
$ make
$ make install

chmod install_manifest.txt

  • BulletDynamics
  • BulletCollision
  • LinearMath
    をビルドする

Javascript で Unicode の文字クラスを使う

Javascript で扱う文字列の文字コードは全て Unicode (UTF-16) ですが、 @\w@ が日本語にヒットしなかったりして不便なことこの上ありません。
また、記号を除いた文字だけ取り出したい、といった場合、ほかの環境では Unicode で定められている文字クラス (Character Class) で指定することで簡単に記述できますが、ECMA-262 5th にも含まれていないため Javascript では@[\uxxxx-\uxxxx]@という泥臭い指定をする羽目になってしまいます。
そこで使えそうなのがこのJSライブラリ。
“XRegExp”:http://xregexp.com/
これ単独でも、名前付きキャプチャーが使えたりして便利です。
そして、プラグインを入れると文字クラスも使えます。
“XRegExp – plugins”:http://xregexp.com/plugins/
テーブルを含んでいるだけに若干サイズがでかいのが気になりますが、細かいことは気にしない!自分で書いてバグるよりマシ!
ちなみに、ここを見て知りました。最近StackOverflowばっかり見てる。
“regex – Javascript + Unicode – Stack Overflow”:http://stackoverflow.com/questions/280712/javascript-unicode
以上、XRegExpの紹介でした。
余談:
Twitter の本家で日本語ハッシュタグのリンクの処理部分を見たら、fromCharCode で文字コード範囲の文字を全て含む Array を作っていた。
これって超積極的に定数伝播するインタープリタだとコンパイルタイムにテーブル作れるのかな?と思った。