@kyanny's blog

My thoughts, my life. Views/opinions are my own.

Windows 10 Insider Preview Build 14332 の Bash で遊ぶ

blogs.windows.com

いろいろ動かなくて面白い。

導入方法などは Build 14316 と同じ。こちらの記事 In future builds, you’ll be asked to create a user account when installing Bash. You’ll then be able to use sudo to elevate your rights within the Linux filesystem/environment と予言?されていたように、最初にアカウントを作るように求められた。

kyanny@NAGAE_Y:~$ groups kyanny
kyanny : kyanny adm cdrom sudo dip plugdev

sudo グループが sudo 権限 (ALL) つき。

いくつかプログラミング言語を動かしたりしてみた。

go1.6.2

kyanny@NAGAE_Y:~$ go version
go version go1.6.2 linux/amd64
kyanny@NAGAE_Y:~$ cat main.go
package main

import "fmt"

func main() {
        fmt.Println("Hello, World!")
}
kyanny@NAGAE_Y:~$ go run main.go
# command-line-arguments
runtime: failed to create new OS thread (have 2 already; errno=22)
fatal error: newosproc

runtime stack:
runtime.throw(0x853790, 0x9)
        /usr/local/go/src/runtime/panic.go:547 +0x90
runtime.newosproc(0xc82002a000, 0xc820039fc0)
        /usr/local/go/src/runtime/os1_linux.go:149 +0x18c
runtime.newm(0x8c6290, 0x0)
        /usr/local/go/src/runtime/proc.go:1516 +0x135
runtime.main.func1()
        /usr/local/go/src/runtime/proc.go:125 +0x2c
runtime.systemstack(0xd76300)
        /usr/local/go/src/runtime/asm_amd64.s:291 +0x79
runtime.mstart()
        /usr/local/go/src/runtime/proc.go:1051

goroutine 1 [running]:
runtime.systemstack_switch()
        /usr/local/go/src/runtime/asm_amd64.s:245 fp=0xc820024770 sp=0xc820024768
runtime.main()
        /usr/local/go/src/runtime/proc.go:126 +0x62 fp=0xc8200247c0 sp=0xc820024770
runtime.goexit()
        /usr/local/go/src/runtime/asm_amd64.s:1998 +0x1 fp=0xc8200247c8 sp=0xc8200247c0
kyanny@NAGAE_Y:~$

Mac OSX El Capitan 上で gox でクロスコンパイルしたバイナリを持っていって実行してみても同じだった(Vagrant/VirtualBox で作った Ubuntu 14.04 上では実行できたバイナリ)

kyanny@NAGAE_Y:~$ ./go-cross-compile/
go-cross-compile_darwin_386         go-cross-compile_netbsd_386
go-cross-compile_darwin_amd64       go-cross-compile_netbsd_amd64
go-cross-compile_freebsd_386        go-cross-compile_netbsd_arm
go-cross-compile_freebsd_amd64      go-cross-compile_openbsd_386
go-cross-compile_freebsd_arm        go-cross-compile_openbsd_amd64
go-cross-compile_linux_386          go-cross-compile_windows_386.exe
go-cross-compile_linux_amd64        go-cross-compile_windows_amd64.exe
go-cross-compile_linux_arm          run.sh
kyanny@NAGAE_Y:~$ ./go-cross-compile/run.sh
./go-cross-compile/run.sh: line 3: ./go-cross-compile_darwin_386: No such file or directory
./go-cross-compile/run.sh: line 4: ./go-cross-compile_darwin_amd64: No such file or directory
./go-cross-compile/run.sh: line 5: ./go-cross-compile_freebsd_386: No such file or directory
kyanny@NAGAE_Y:~/go-cross-compile$ ./run.sh
./run.sh: line 3: ./go-cross-compile_darwin_386: cannot execute binary file: Exec format error
./run.sh: line 4: ./go-cross-compile_darwin_amd64: cannot execute binary file: Exec format error
./run.sh: line 5: ./go-cross-compile_freebsd_386: cannot execute binary file: Exec format error
./run.sh: line 6:    77 Segmentation fault      (core dumped) ./go-cross-compile_freebsd_amd64
./run.sh: line 7: ./go-cross-compile_freebsd_arm: cannot execute binary file: Exec format error
./run.sh: line 8: ./go-cross-compile_linux_386: cannot execute binary file: Exec format error
runtime: failed to create new OS thread (have 2 already; errno=22)
fatal error: newosproc

runtime stack:
runtime.throw(0x50b5d0, 0x9)
        /usr/local/Cellar/go/1.5.1/libexec/src/runtime/panic.go:527 +0x90
runtime.newosproc(0xc82002a000, 0xc820039fc0)
        /usr/local/Cellar/go/1.5.1/libexec/src/runtime/os1_linux.go:150 +0x1ab
runtime.newm(0x538f70, 0x0)
        /usr/local/Cellar/go/1.5.1/libexec/src/runtime/proc1.go:1105 +0x130
runtime.main.func1()
        /usr/local/Cellar/go/1.5.1/libexec/src/runtime/proc.go:48 +0x2c
runtime.systemstack(0x594ae0)
        /usr/local/Cellar/go/1.5.1/libexec/src/runtime/asm_amd64.s:262 +0x79
runtime.mstart()
        /usr/local/Cellar/go/1.5.1/libexec/src/runtime/proc1.go:674

goroutine 1 [running]:
runtime.systemstack_switch()
        /usr/local/Cellar/go/1.5.1/libexec/src/runtime/asm_amd64.s:216 fp=0xc820024770 sp=0xc820024768
runtime.main()
        /usr/local/Cellar/go/1.5.1/libexec/src/runtime/proc.go:49 +0x62 fp=0xc8200247c0 sp=0xc820024770
runtime.goexit()
        /usr/local/Cellar/go/1.5.1/libexec/src/runtime/asm_amd64.s:1696 +0x1 fp=0xc8200247c8 sp=0xc8200247c0
./run.sh: line 10: ./go-cross-compile_linux_arm: cannot execute binary file: Exec format error
./run.sh: line 11: ./go-cross-compile_netbsd_386: cannot execute binary file: Exec format error
./run.sh: line 12:    83 Segmentation fault      (core dumped) ./go-cross-compile_netbsd_amd64
./run.sh: line 13: ./go-cross-compile_netbsd_arm: cannot execute binary file: Exec format error
./run.sh: line 14: ./go-cross-compile_openbsd_386: cannot execute binary file: Exec format error
./run.sh: line 15:    86 Segmentation fault      (core dumped) ./go-cross-compile_openbsd_amd64
./run.sh: line 16: ./go-cross-compile_windows_386.exe: cannot execute binary file: Exec format error
./run.sh: line 17: ./go-cross-compile_windows_amd64.exe: cannot execute binary file: Exec format error
kyanny@NAGAE_Y:~/go-cross-compile$

rust1.8.0 (stable)

Linux 64bit 用のを curl | sh でインストールしてみたが、 rustc が segfault して何もできなかった。

kyanny@NAGAE_Y:~$ rustc
Segmentation fault (core dumped)

python2.7.6 (builtin)

Go を実行したときのエラーメッセージをみて、 OS スレッドが作れないという制限はほかの言語でもあるのか?と気になったので最初から Bash 環境内にインストール済みだった Python 2.7.6 でマルチスレッドプログラムを走らせてみる。ちなみに Perl 5.8.12 もインストール済みだった。

kyanny@NAGAE_Y:~$ python -V
Python 2.7.6
kyanny@NAGAE_Y:~$ cat t.py
# -*- coding: utf-8 -*-

import threading
import time
import datetime

class TestThread(threading.Thread):

        def __init__(self):
                threading.Thread.__init__(self)

        def run(self):
                print "  === start sub thread ==="
                for i in range(5):
                        time.sleep(5)
                        print "  sub thread : " + str(datetime.datetime.today())                print "  === end sub thread ==="

if __name__ == "__main__":

        th = TestThread()
        th.start()
        th2 = TestThread()
        th2.start()
        th3 = TestThread()
        th3.start()


        time.sleep(1)

        print "=== start main thread ==="
        for i in range(5):
                time.sleep(10)
                print "main thread : " + str(datetime.datetime.today())
        print "=== end main thread ==="
kyanny@NAGAE_Y:~$ python t.py
  === start sub thread ===
  === start sub thread ===
  === start sub thread ===
=== start main thread ===
  sub thread : 2016-05-01 15:01:57.477265
  sub thread : 2016-05-01 15:01:57.482722
   sub thread : 2016-05-01 15:01:57.483245                                                                                                                                                                         sub thread : 2016-05-01 15:02:02.479006
  sub thread : 2016-05-01 15:02:02.484028
  sub thread : 2016-05-01 15:02:02.486608
main thread : 2016-05-01 15:02:03.484343
  sub thread : 2016-05-01 15:02:07.481971
  sub thread : 2016-05-01 15:02:07.485194
  sub thread : 2016-05-01 15:02:07.487769
  sub thread : 2016-05-01 15:02:12.483610
  sub thread : 2016-05-01 15:02:12.486361
  sub thread : 2016-05-01 15:02:12.488906
main thread : 2016-05-01 15:02:13.484920
  sub thread : 2016-05-01 15:02:17.485255
  === end sub thread ===
  sub thread : 2016-05-01 15:02:17.487762
  === end sub thread ===
  sub thread : 2016-05-01 15:02:17.490164
  === end sub thread ===
main thread : 2016-05-01 15:02:23.486541
main thread : 2016-05-01 15:02:33.488207
main thread : 2016-05-01 15:02:43.489786
=== end main thread ===

うまくいってしまった。 Python 2.7.6 のスレッドは OS スレッドを使ってないとかそういう事情があるのか?と思ったが、 Ruby と同じく GIL はあるもののちゃんと普通のスレッドのようだ。

node4.4.3

kyanny@NAGAE_Y:~$ ./node-v4.4.3-linux-x64/bin/node -v
v4.4.3
kyanny@NAGAE_Y:~$ cat n.js
console.log("Hello world");
kyanny@NAGAE_Y:~$ ./node-v4.4.3-linux-x64/bin/node n.js
fs.js:549
  return binding.open(pathModule._makeLong(path), stringToFlags(flags), mode);
                 ^

Error: Unknown system error -25: Unknown system error -25, open '/home/kyanny/n.js'
    at Error (native)
    at Object.fs.openSync (fs.js:549:18)
    at Object.fs.readFileSync (fs.js:397:15)
    at Object.Module._extensions..js (module.js:415:20)
    at Module.load (module.js:343:32)
    at Function.Module._load (module.js:300:12)
    at Function.Module.runMain (module.js:441:10)
    at startup (node.js:139:18)
    at node.js:968:3
kyanny@NAGAE_Y:~$ ./node-v4.4.3-linux-x64/bin/node
>
Error: Could not open history file.
REPL session history will not be persisted.
> console.log("Hello world");
Hello world
undefined

ファイルは実行できないが REPL は実行できた。

ruby2.3.1

zlib を configure するところでエラーで止まる。マシンが非力なのか configure に時間がかかって待ちが長いのであまり深追いしていない。 mruby1.2.0 もエラーでコンパイルできず。