@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 もエラーでコンパイルできず。

Windows 10

奥さんが知人から借りている Surface Pro を Windows 8.1 から Windows 10 にアップグレードしてみた。会社に置いてたまに IE での検証機として使っていたりしたが、噂の Bash を試してみたくて GW に遊ぼうと思い一旦自宅に持ち帰った。寝てる間にアップグレードは終わっていた。

少し触ったくらいだが、 Windows 8.1 のときと比べてとても使いやすくなった気がする(そもそも Surface 普段ぜんぜん使ってなかったのだが)ハードウェアは何も変わってないのに、見た目もすごくスタイリッシュというか、解像度が高くなったように感じられる。しかしなんといっても、 Metro UI な部分とデスクトップな部分が、 Win8 のときはあからさまに分断されてて行き来がしづらい感じだったのが、 Win10 になってとても良い感じに融合しているように感じられた。

肝心の Bash は、 Insider Preview Build というのを入手するために何をすればいいか知らなかったのでやり方を調べたり、いくつか溜まっていた Windows Update を適用したりしていて、まだ Build が落ちてこなくて試せていない。はやく触ってみたい。

Quipper Qstrap で theme-color

Google Developers Summit に参加する数日前に theme-color というものを知って面白いなと思い、カンファレンスでも言及されていてさらに興味が湧いたので、自分で試したくなってちょっとしたでもページを作った。

Quipper Colors

Quipper では Bootstrap をベースにした Qstrap という CSS フレームワークを自社開発している。これは Quipper のサービスで統一したカラースキームやコンポーネントを再利用しやすくすることで、開発者の負担を減らしたり統一したユーザー体験を提供する目的で作られているものだが、このカラースキームを選ぶと theme-color を変化させて Android Chrome のツールバーの色を変えられる、というもの。

実装は至極単純で、 meta タグの値を変えただけの HTML を各色ぶん用意してリンクをはってるだけ。仕事では Qstrap を毎日使っているものの、ゼロからマークアップすることはあまりないし、あまり使わないコンポーネントもあったりするので、 Qstrap の練習も兼ねている。

Google Developers Summit : Progressive Web Apps に参加した

Google Developers Summit Tokyo 2016 : Progressive Web App | トップ

久しぶりに技術カンファレンスに参加した。 Progressive であるかどうかはともかく、仕事でも Web アプリケーションをずっと書いているし、モバイルへの関心も高まってきたので、 Web 技術のカンファレンスがどういうものか興味もあった。

全体的に、 Progressive Web Apps (PWAs) という言葉・概念自体にあまりこだわることはないのかな、と思った。 Web アプリが Native アプリのように「インストールできる、オフラインで動く」ようにするために、新しい Web API を活用したり、 Native と遜色ないユーザー体験を実現・提供していきましょう、ということで、それを例えば Apple が iOS の Safari に独自仕様で「ホーム画面に追加」機能を作ったりしていたのを、 Google は Web 標準に働きかけてちゃんと統一していきますよ、それがブラウザやプラットフォームにかかわらずユーザーが等しくより良い Web アプリを体験できることに繋がるから、みたいな、そういうのをひっくるめて呼ぶためにとりあえず名前をつける必要があった、というところか。

Progressive というワードが用いられているのは、まだまだ Web アプリで Native に匹敵するユーザー体験を実現するのは難しいところもあって、なので全てのユーザーに最も良い体験を提供するのは無理でも、段階的に実現・提供していきましょう、ということのようだ。最初に見たときの印象では Progressive JPEG のように、「最初にぼやけたレイアウトだけレンダリングさせてデータが届き次第順次精細なものを表示していくテクニック」のようなことかと思ったが、もっと観念的なことのようだった(もちろんテクニックも含まれてはいるが)

Chrome が Add to home 機能を実装したことでホーム画面に Native アプリと全く同じように Web アプリをインストールできるようになった(ブラウザから直接)、という話が何度もいろいろな人に言及されてたけど、 iOS ユーザーとしては正直「そんなの iPhone では何年も前からできてたけど、え、 Android いまさら?しかも Chrome だけ?」と思ってしまった。が、 theme-color には感動した。カンファレンスの数日前に全然関係ないところで知ったが、改めてここでも触れられていて、これは確かに Web の体験を Native っぽくする重要なポイントだし、それが簡単なマークアップだけでできるのは画期的だと思った。のでちょっとしたデモを作ったりして遊んだ。

以下、良かったセッションなど。

Offline first experiences

Service Worker の話。内容が具体的で、わかりやすかった。

Hey, look at me, I'm Notification

通知の話。 Web Notifications とか Web Push API とかは夢があるし、実用イメージも湧きやすいが、濫用したらダメよ、ということを具体的にいろんな通知の例を挙げて、どこが良くてどこがダメか、どうすれば改善できるか、という話をずっとしていてこれが良かった。 Timely, Precise, Relevant という三軸を満たすようにするのが大事ということで、言われてみれば確かにその通りで全部当たり前なのだけど、なんでも通知したくなっちゃいそうなので気をつけてやらないとな、と改めて思った。

あと、 Web 通知はブラウザのサポートなどが鍵になってくるものの、依然としてサーバサイド API を介在してそこでいろいろケアしてやる必要がある、言い換えればサーバサイドで工夫する余地があるというのは興味深かった。 Web にせよ Native にせよ、クライアントサイド・フロントエンドの重要さは増すばかりだが、裏方色の強くなったサーバサイド・ API というのもちゃんと存在感があって大事な部分であり続ける、というのは、サーバサイドを本職としてきた身には安心するところがあった。

SUUMO における Progressive Web Apps の活用事例

HTTP -> HTTPS への移行時に localStorage がネックになったのでサーバサイド API (とその裏のデータベース)を介して「お引越し」させる、という話はいろいろすごかったが、中でも「情報誌など紙媒体に http:// で書かれた URL を全て https:// に変更していくのは(印刷された紙が残り続けてしまうので)難しいので HSTS 対応なども進めていく」というのは、確かに印刷された紙はどうしようもないな、と同情を禁じ得なかった。

ホーム画面から起動されたものは KPI の数字がちょっと良かった、とか、そういう話も良かった。しかし、大掛かりなアプリで大掛かりなマイグレーションをするから大変というのはわかるが、全工程の半分過ぎたところまでで一年かかっているというのは時間かかりすぎだと思った。

SQL ゼロからはじめるデータベース操作

アマゾンのセールで半額だったので、ウィンドウ関数とはどういうものか基礎知識を得るために買った。その他苦手意識があるテクニックの部分もあわせて読んだ。

ウィンドウ関数の説明はわかりやすかったが、全体的になんとなく読みづらかった。相関サブクエリは相変わらずさっぱりわからなかった。

SQL ゼロからはじめるデータベース操作

SQL ゼロからはじめるデータベース操作