20191215のMacに関する記事は14件です。

MacにGoをインストールする

とりあえずGoを始めようとして、A Tour of Go をやってみました。
が、その事前準備のインストールで躓きました…。
これから同じような経験をする方がいらっしゃるのではないかと思い、備忘録も兼ねて投稿します。
よりよい方法やバグ等ございましたら、アドバイスいただけると光栄です。

環境

  • macOS
  • Homebrew
  • Go (v1.13.4)

やってみたこと

インストール

とりあえず、HomebrewでGoをインストールします。

$ brew install go

確認

バージョン確認

インストールが完了したら、バージョンの確認をします。

$ go version
go version go1.13.4 darwin/amd64

実行環境の確認

次に、公式のスタートガイド から、実行環境のテストを進めます。

# 実行環境のディレクトリを作成
$ mkdir -p ~/go/src/hello

# 作成したディレクトリへ移動
$ cd ~/go/src/hello

# テスト用のファイルを作成
$ touch hello.go

# テスト用のファイルを編集
$ vi hello.go

hello.goの中身は以下のように編集します。

※もしVimコマンドの操作が分からないという方がいれば、下記のリンクを参照してください。

hello.go
package main

import "fmt"

func main() {
    fmt.Printf("hello, world\n")
}

編集が完了したら、ビルドしてバイナリファイルを生成します。

$ go build
hello.go:3:8: cannot find package "fmt" in any of:
        /Users/username/go/src/fmt (from $GOROOT)
        /usr/local/go/src/fmt (from $GOPATH)
package hello
        imports runtime: cannot find package "runtime" in any of:
        /Users/username/go/src/runtime (from $GOROOT)
        /usr/local/go/src/runtime (from $GOPATH)

...........( ̄ω ̄;)エートォ...

何か様子がおかしいぞ。

調べてみる

Homebrewでインストールした場合、/usr/local/Cellar/go/ 配下にバージョン毎にディレクトリが作成されるはずです。
そうすると、エラーの中にある /usr/local/go/src/fmt (from $GOPATH) ってそもそも存在しないのでは?
となったので、その辺を調べてみます。

$ cd /usr/local/go
bash: cd: /usr/local/go: No such file or directory

やっぱりない!!こいつか!!!!

(゜∇゜)(。_。)(゜∇゜)(。_。)ウンウン♪

環境変数を確認

go env でGo言語関連の環境変数を確認できるので、一応確認します。

$ go env
GO111MODULE=""
GOARCH="amd64"
GOBIN=""
GOCACHE="/Users/username/Library/Caches/go-build"
GOENV="/Users/username/Library/Application Support/go/env"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="darwin"
GONOPROXY=""
GONOSUMDB=""
GOOS="darwin"
GOPATH="/usr/local/go"
GOPRIVATE=""
GOPROXY="https://proxy.golang.org,direct"
GOROOT="/Users/username/go"
GOSUMDB="sum.golang.org"
GOTMPDIR=""
GOTOOLDIR="/Users/username/go/pkg/tool/darwin_amd64"
GCCGO="gccgo"
...

やはり、GOPATH が存在しないディレクトリを指定していますね。
この辺を変更すれば解決しそうです。

修正する

環境変数の変更

下記コマンドで変更が必要な環境変数を追加します。

# 環境変数の追加
$ echo 'export GOPATH=$HOME/go' >> ~/.bash_profile
$ echo 'export GOROOT=/usr/local/Cellar/go/1.13.4/libexec' >> ~/.bash_profile
$ echo 'export GOTOOLDIR=/usr/local/Cellar/go/1.13.4/libexec/pkg/tool/darwin_amd64' >> ~/.bash_profile
$ echo 'export PATH=$PATH:$GOPATH/bin' >> ~/.bash_profile

# bash_profileを更新
$ source ~/.bash_profile

変更の反映を確認

GOPATH GOROOT GOTOOLDIR の3箇所が正常に修正されていることを確認します。

$ go env
GO111MODULE=""
GOARCH="amd64"
GOBIN=""
GOCACHE="/Users/username/Library/Caches/go-build"
GOENV="/Users/username/Library/Application Support/go/env"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="darwin"
GONOPROXY=""
GONOSUMDB=""
GOOS="darwin"
GOPATH="/Users/username/go"
GOPRIVATE=""
GOPROXY="https://proxy.golang.org,direct"
GOROOT="/usr/local/Cellar/go/1.13.4/libexec"
GOSUMDB="sum.golang.org"
GOTMPDIR=""
GOTOOLDIR="/usr/local/Cellar/go/1.13.4/libexec/pkg/tool/darwin_amd64"
GCCGO="gccgo"
...

それぞれ、下記のように変更されていることを確認してください。

GOPATH="/Users/username/go"
GOROOT="/usr/local/Cellar/go/1.13.4/libexec"
GOTOOLDIR="/usr/local/Cellar/go/1.13.4/libexec/pkg/tool/darwin_amd64"

再び実行してみる

修正できたので、再度ビルドしてみます。

# 作成したディレクトリへ移動
$ cd ~/go/src/hello

# ビルドしてバイナリファイルを生成
$ go build

特に問題がなければ、エラーが出ずに完了します。
念の為、問題なくビルドできたことを確認するために、バイナリファイルを実行します。

$ ./hello
hello, world

上記のように hello, world と表示されれば完了です。

これで無事、Goのインストールと実行環境のテストまでが完了しました!
今後は、A Tour of Go を進めるもよし、プロジェクトを作成してガシガシ開発を進めるもよし、
素敵なGoライフを楽しんでください!!

関連URL

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

macOS環境構築覚書

はじめに

Mac Book Proを拾ったので数値計算用途の環境構築を行います.
ほとんど個人的な防備録です.
詳しくはそれぞれのリンク先を参照してください.

やることは

  • diskの初期化
  • editor (Visual Studio Code) のinstall
  • 開発環境の設定

です (随時更新).

実行環境

macOS Mojave 10.14.3

diskの初期化

前の持ち主の設定が残っていたのでdiskを初期化してOSを入れ直します.
まず, OSを(再)起動して起動画面が出る前からcommand + rを押し続けOS utilityを起動します.
disk utilityを選択し, 更にdiskを初期化を選択します.
diskのformatが終わったらdisk utilityを終了しOSの再installを選択しOSを入れ直します.
OSが入ったらOS utilityを終了し, OSを起動します.

http://vdeep.net/initialize-mac#Mac-2

最初の一歩(terminalの起動)

ほとんどの作業をterminal上で行います.
Desktop右上の虫眼鏡を押してterminalで検索すると見つかります.

editor (Visual Studio Code) のinstall

editorのVisual Studio Code (以下VScode) をinstallします.
公式ページ https://code.visualstudio.com/docs/?dv=osx から落とします.

terminalからVScodeを起動するための設定を行います.
VScodeを起動し, F1でcommand paletteを起動します.
Shell Command: Install 'code' command in PATH command.を選択します.
terminalを再起動すればcodeでVScodeが起動します.

https://code.visualstudio.com/docs/setup/mac

開発環境の設定

Command Line Tools for Xcode (Clang, Git, Make)

C++ compilerなど開発に必要なものはだいたいこれで入ります12.
terminalでxcode-select --installを実行します.

https://qiita.com/motofumi/items/0f2e7ae1b852f118fe95

なお, これでgccなども使えますが, 実際はClangが呼ばれるようです.

https://qiita.com/kuboshu83/items/265264551193da079ad2

Homebrew (要Command Line Tools for Xcode)

package manager.
terminalで以下を実行します.

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

https://brew.sh/index_ja.html


  1. これだとFortranがcompileできない... 

  2. ちなみにこれだけでC++ compiler, make, Gitが揃うのでITensorをinstallする環境が整います. https://itensor.org/docs.cgi?vers=cppv3&page=install 

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

macOS数値計算用環境構築覚書

はじめに

Mac Book Proを拾ったので数値計算用途の環境構築を行います.
ほとんど個人的な防備録です.
詳しくはそれぞれのリンク先を参照してください.

やることは

  • diskの初期化
  • editor (Visual Studio Code) のinstall
  • 開発環境の設定
  • 日本語入力設定

です (随時更新).

実行環境

macOS Mojave 10.14.3

diskの初期化

前の持ち主の設定が残っていたのでdiskを初期化してOSを入れ直します.
まず, OSを(再)起動して起動画面が出る前からcommand + rを押し続けOS utilityを起動します.
disk utilityを選択し, 更にdiskを初期化を選択します.
diskのformatが終わったらdisk utilityを終了しOSの再installを選択しOSを入れ直します.
OSが入ったらOS utilityを終了し, OSを起動します.

http://vdeep.net/initialize-mac#Mac-2

最初の一歩 (terminalの起動)

ほとんどの作業をterminal上で行います.
Desktop右上の虫眼鏡を押してterminalで検索すると見つかります.

editor (Visual Studio Code) のinstall

editorのVisual Studio Code (以下VScode) をinstallします.
公式ページ https://code.visualstudio.com/docs/?dv=osx から落とします.

terminalからVScodeを起動するための設定を行います.
VScodeを起動し, F1でcommand paletteを起動します.
Shell Command: Install 'code' command in PATH command.を選択します.
terminalを再起動すればcodeでVScodeが起動します.

https://code.visualstudio.com/docs/setup/mac

開発環境の設定

Command Line Tools for Xcode (Clang, Git, Make)

C++ compilerなど開発に必要なものはだいたいこれで入ります12.

terminalでxcode-select --installを実行します.

https://qiita.com/motofumi/items/0f2e7ae1b852f118fe95

なお, これでgccなども使えますが, 実際はClangが呼ばれるようです.

https://qiita.com/kuboshu83/items/265264551193da079ad2

Homebrew (要Command Line Tools for Xcode)

package manager.
terminalで以下を実行します.

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

https://brew.sh/index_ja.html

CMake

Homebrewで入ります.
brew install cmake

Fortran (GCC)

Homebrewで入ります.
brew install gcc

日本語入力設定

入力sourceに日本語を追加します.
system PreferencesからKeyboardのInput Sourcesを選択します.
+を押して日本語を追加します.
必要であれば各種設定を行います.
例えば, Caps Lockにローマ字入力onに切り替えを割り当てることなどができます.

https://support.apple.com/ja-jp/guide/japanese-input-method/jpim10267/6.2.1/mac/10.14


  1. これだとFortranがcompileできない... 

  2. ちなみにこれだけでC++ compiler, Make, Gitが揃うのでITensorをinstallする環境が整います. https://itensor.org/docs.cgi?vers=cppv3&page=install 

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

自作マイクロカーネルOS「Resea」をMac OSXで動かしてみる

Reseaとは何か、なぜ動かしてみるのか

Resea(りーせあ)とは

CとRustで一から作るマイクロカーネルOS』(2019/12/13)という記事で知りました。これはResea という seiyanuta (Seiya Nuta) 氏が公開した教育・研究向けマイクロカーネル自作OSを紹介したものです。実際に、さくらインターネットのIaaS上で、Webサーバとして動作させるまでを達成しています。稼動中のサーバにアクセスするだけでも、ちょっとした感動があります。

筆者は、Podcast『Turing Complete FM』を聴いて以降、低レイヤに興味が出て、OS、カーネルをちゃんと理解したいという動機付けをしばらく持っていました。しかし、Linuxのカーネルを素で読み始めるのはハードルが高く感じていました。そんな所にReseaの公開を知り、マイクロカーネルというカーネル部分が軽量、かつ教育・研究用途に機能が絞り込まれているため全体像を掴みやすいのではないか、ということで動かしつつ、コードを追い始めてみることにしました。記事によると以下のボリュームだそうです。

行数は空行やコメント行を含めて,カーネルが約5000行(コア部分は3000行),そしてユーザランドが約4500行になりました。 Unix互換性を提供しないことで,MINIXよりシンプルかつコンパクトで読みやすい物ができたと思っています。

さて、Reseaは詳細にわたるドキュメントが準備されています(Resea Documentation)。本稿では、以下の章のチュートリアルに沿って、手元のMac OSX環境で動かしてみます。

  • 3. Getting Started
  • 5. Userland Programming

本稿では紹介しませんが、以下の章では、Reseaのアーキテクチャ、設計の考え方に触れることができます。

  • 4. Design
  • 5. Servers
  • 7. Kernel Programming
  • 8. Internals

マイクロカーネルとは

Wikipediaには、 "マイクロカーネル ...(中略) OSが担う各種機能のうち、必要最小限のみをカーネル空間に残し、残りをユーザーレベルに移すことで全体の設計が簡素化でき、結果的にカスタマイズ性が向上し、性能も向上できるというOSの設計手法" とあります。

さらにReseaの盛り上がりを受け、@nullpo_head氏が、『マイクロカーネルとL4について』(2019/12/15)を公開されました。氏は、カーネル部分を(Cではなく)Rustで実装するマイクロカーネル自作OSプロジェクトを進められています。マイクロカーネルをより良く知るのにおすすめです。

Mac OSX上で動かすとは

Reseaは、カーネルはC、ユーザランドプログラムはRustで書かれています。また、一部ユーティリティがPythonで書かれています。

まず、Mac OSX上にビルドのための環境を一式揃えます。ビルドが終わったら、QEMUというエミュレータ上で Reseaを起動します。QEMUが「仮想のコンピュータ」となり、その上でReseaを起動し、色々と実験をしてみることができます。

image.png

コンパイル、ビルドは、 make build make run コマンドで行います。そのコマンドで行われていることの詳細は、この後クローンするReseaリポジトリの Makefile および kernel/arch/x64/arch.mk に定義されています。

それぞれのファイルに、例えば .PHONY: build .PHONY: run .PHONY: clean などに続けて、make build make run make clean などの振る舞いが定義されています。

例えば、本稿中で make runとして実行すると、QEMU qemu-system-x86_64 が立ち上がります。その仮想の64bit x86 CPU上で build/hdd.img をハードディスクとして認識し、Reseaが起動します。

本稿のゴールは一旦「動かす」ことなので、これ以上 Makefile の構成詳細は記述しません。例えば、こちら( - 自動化のためのGNU Make入門講座 - Makefileの基本:ルール)で、基本を知ることができます。

環境準備

リポジトリのclone

以下のReseaリポジトリをクローンします。

seiyanuta/resea: A pure microkernel-based hackable operating system written from scratch in C and Rust.

$ git clone https://github.com/seiyanuta/resea.git
$ cd resea

プロジェクトは、以下のディレクトリから構成されています。

  • docs: ドキュメント
  • kernel: Cで実装されたカーネル部分
  • libs/resea: Rustで実装されたユーザランド部分
  • servers: Rustで実装されたサーバ群
  • tools: Pythonツール群
  • misc: その他

必要パッケージの導入

チュートリアルに沿って、パッケージを導入します。実行環境により要否が異なります。

$ brew install llvm python3 qemu bochs i386-elf-grub xorriso mtools 
  • llvm: LLVMコンパイラプラットフォーム
  • python3: Python3系
  • qemu: プロセッサエミュレータ
  • bochs: PC/AT互換機(x86系)エミュレータ
  • i386-elf-grub: i386用の高機能ブートローダ
  • xorriso: ISO9660ファイルシステムの操作ツール
  • mtools: MSDOSファイルの操作ツール

筆者環境では以下を考慮して、一部を抜きました。

$ brew install llvm qemu i386-elf-grub xorriso mtools 
  • pyenvでPython環境を作っており、Python3系はインストール済のため、今回はスキップ
  • 一旦動かすだけならエミュレータに qemuを使えば良いので、 bochsは入れなくても構わない

  • qemuはすでにインストールしたことがあったため、エラー。brew upgrade qemuで、最新版をインストール

Pythonパッケージのインストール

$ pip install -r tools/requirements.txt

現Python3環境に応じて、pipまたはpip3コマンドを使います。

Rust Nightlyと必要パッケージのインストール

rustupを使います。rustup.rs - The Rust toolchain installerで最新の実行コマンドを確認します。

$ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

上記を実行すると、以下のプロンプトが表示されます。

...
Current installation options:

   default host triple: x86_64-apple-darwin
     default toolchain: stable
               profile: default
  modify PATH variable: yes

1) Proceed with installation (default)
2) Customize installation
3) Cancel installation
>

1と答え、先に進みます。

...
  stable installed - rustc 1.39.0 (4560ea788 2019-11-04)


Rust is installed now. Great!

To get started you need Cargo's bin directory ($HOME/.cargo/bin) in your PATH
environment variable. Next time you log in this will be done
automatically.

To configure your current shell run source $HOME/.cargo/env

上記のように、インストールが完了しました。パスを通しておきます。

$ source $HOME/.cargo/env

デフォルトでは安定版が導入されています。

$ rustc --version
rustc 1.39.0 (4560ea788 2019-11-04)

Nightlyバージョンを導入し、切り替えます。

$ rustup default nightly

以下のようにインストールが完了します。

info: syncing channel updates for 'nightly-x86_64-apple-darwin'
info: latest update on 2019-12-15, rust version 1.41.0-nightly (c8ea4ace9 2019-12-14)
...
  nightly-x86_64-apple-darwin installed - rustc 1.41.0-nightly (c8ea4ace9 2019-12-14)

念のためバージョンを確認します。

$ rustc --version
rustc 1.41.0-nightly (c8ea4ace9 2019-12-14)

必要に応じて rustup default stableコマンドで、安定版に戻すことができます。

必要パッケージをインストールします。

$ rustup component add rust-src
$ cargo install xargo

rustupは、Rust言語のインストーラです。cargoは、Rustのパッケージの取得、ビルドを行うためのツールです。

...
    Finished release [optimized] target(s) in 54.06s
  Installing /<user directory>/.cargo/bin/xargo
   Installed package `xargo v0.3.18` (executable `xargo`)

上記のように表示され、インストールが正常に終了しました。

Reseaのビルド

$ make build               # Build a kernel executable.
$ make iso                 # Build an ISO image.

(参考) ビルド時に見られるエラー等

  • 安定版のRustの場合、make buildでエラーが出ます。
...
     XARGO  servers/shell
WARNING: the sysroot can't be built for the Stable channel. Switch to nightly.
error: failed to run `rustc` to learn about target-specific information

Caused by:
  process didn't exit successfully: `rustc - --crate-name ___ --print=file-names -C lto -Z emit-stack-sizes -Z external-macro-backtrace --target user_x64 --crate-type bin --crate-type rlib --crate-type dylib --crate-type cdylib --crate-type staticlib --crate-type proc-macro --print=sysroot --print=cfg` (exit code: 1)
--- stderr
error: the option `Z` is only accepted on the nightly compiler


make: *** [build/servers/shell.elf] Error 101

Nightly Rustが入っていることを確認します。

  • make isowarningが出ました
$ make iso
      GRUB  build/resea.iso
i386-elf-grub-mkrescue: warning: cannot open directory `/usr/local/Cellar/i386-elf-grub/2.04/share/locale': No such file or directory.
GNU xorriso 1.5.2 : RockRidge filesystem manipulator, libburnia project.

Reseaの実行

以下を実行すると、QEMU上で動作しました。

$ make run GUI=1     # Run on QEMU.

image.png

make runコマンドを実行したターミナル上では、キーボード割り込みなどのログが観察できます。

QEMU自体が終了できない状態となったので、アクティビティモニタからプロセスを強制終了しました。

ユーザランドプログラムを書いてみる

Hello, World! - Resea Documentation に沿って進めます。

$ cp -r servers/hello servers/rand
$ cd servers/rand
$ ls
Cargo.toml Xargo.toml lib.rs     main.rs

ファイルを編集して行きます。

Cargo.tomlの編集

servers/rand/Cargo.tomlを編集します。

$ code Cargo.toml  # VSCodeの場合

編集前

[package]
name = "hello"
version = "0.0.0"
authors = ["Seiya Nuta <nuta@seiya.me>"]
edition = "2018"

[lib]
crate-type = ["staticlib"]
path = "lib.rs"

[dependencies]
resea = { path = "../../libs/resea" }

編集後

[package]
name = "rand" # Update here!
version = "0.0.0"
authors = ["Your Name <yourname@example.com>"]  # and here!
edition = "2018"

[lib]
crate-type = ["staticlib"]
path = "lib.rs"

[dependencies]
resea = { path = "../../libs/resea" }

main.rsの編集

servers/rand/main.rsを編集します。

$ code main.rs  # VSCodeの場合

編集前

#[no_mangle]
pub fn main() {
    info!("Hello World!");
}

編集後

#[no_mangle]
pub fn main() {
    info!("Hello World from rand server!");
}

.build.mkの追記

reasea/直下の.build.mkに、環境変数STARTUPSを足します。

$ cd ../../
$ echo "STARTUPS += rand" >> .build.mk

QEMUで実行する

$ make run

例えば、Cargo.tomlファイルの編集を忘れると、以下のようなエラーが出ます。

error: two packages named `hello` in this workspace:
- /Users/tomo.masuda/code/resea/servers/hello/Cargo.toml
- /Users/tomo.masuda/code/resea/servers/rand/Cargo.toml
make: *** [build/servers/rand.elf] Error 101

以下の通り、起動に成功しました。

...
[memmgr] entering mainloop...
[kernel] sys_open: created @memmgr.5
[kernel] sys_trasnfer: transfering @memmgr.5 -> @memmgr.2
[kernel] send: @memmgr.1 -> @kernel.2 => @kernel.1 (header=0000000005011008)
[kernel] recv: @kernel.1 <- @2 (header=0000000005011008, notification=0000000000000000)
[kernel] timer_create: id=2 initial=0, interval=0
[kernel] send: @kernel.2 -> @memmgr.1 => @memmgr.1 (header=0000000005810004)
[kernel] recv: @memmgr.1 <- @1 (header=0000000005810004, notification=0000000000000000)
[rand] Hello World from rand server!
[kernel] WARN: Exception #6
[kernel] WARN: RIP = 0000000001000022    CS  = 000000000000002b    RFL = 0000000000000202
[kernel] WARN: SS  = 0000000000000023    RSP = 0000000003000000    RBP = 0000000000000000
[kernel] WARN: RAX = 0000000000000000    RBX = 0000000000000000    RCX = 0000000001013f40
[kernel] WARN: RDX = 0000000000000001    RSI = 0000000002fffd68    RDI = 0000000002fffdc8
[kernel] WARN: R8  = 0000000000000001    R9  = 0000000000000000    R10 = 0000000000000000
[kernel] WARN: R11 = 0000000000000206    R12 = 0000000000000000    R13 = 0000000000000000
[kernel] WARN: R14 = 0000000000000000    R15 = 0000000000000000    ERR = 0000000000000000
[kernel] WARN: NYI: ignoring thread_kill_current (#rand.8)

アクティビティモニタからプロセスを強制終了します。

make: *** [run] Killed: 9
$ 

先に進めたら、追記するかもしれません。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

自作マイクロカーネルOS「Resea」をMac OS X上で動かしてみる

Reseaとは何か、なぜ動かしてみるのか

Resea(りーせあ)とは

CとRustで一から作るマイクロカーネルOS』(2019/12/13)という記事で知りました。これはResea という seiyanuta (Seiya Nuta) 氏が公開した教育・研究向けマイクロカーネル自作OSを紹介したものです。実際に、さくらインターネットのIaaS上で、Webサーバとして動作させるまでを達成しています。稼動中のサーバにアクセスするだけでも、ちょっとした感動があります。

筆者は、Podcast『Turing Complete FM』を聴いて以降、低レイヤに興味が出て、OS、カーネルをちゃんと理解したいという動機付けをしばらく持っていました。しかし、Linuxのカーネルを素で読み始めるのはハードルが高く感じていました。そんな所にReseaの公開を知り、マイクロカーネルというカーネル部分が軽量、かつ教育・研究用途に機能が絞り込まれているため全体像を掴みやすいのではないか、ということで動かしつつ、コードを追い始めてみることにしました。記事によると以下のボリュームだそうです。

行数は空行やコメント行を含めて,カーネルが約5000行(コア部分は3000行),そしてユーザランドが約4500行になりました。 Unix互換性を提供しないことで,MINIXよりシンプルかつコンパクトで読みやすい物ができたと思っています。

さて、Reseaは詳細にわたるドキュメントが準備されています(Resea Documentation)。本稿では、以下の章のチュートリアルに沿って、手元のMac OSX環境で動かしてみます。

  • 3. Getting Started
  • 5. Userland Programming

本稿では紹介しませんが、以下の章では、Reseaのアーキテクチャ、設計の考え方に触れることができます。

  • 4. Design
  • 5. Servers
  • 7. Kernel Programming
  • 8. Internals

マイクロカーネルとは

Wikipediaには、 "マイクロカーネル ...(中略) OSが担う各種機能のうち、必要最小限のみをカーネル空間に残し、残りをユーザーレベルに移すことで全体の設計が簡素化でき、結果的にカスタマイズ性が向上し、性能も向上できるというOSの設計手法" とあります。

さらにReseaの盛り上がりを受け、@nullpo_head氏が、『マイクロカーネルとL4について』(2019/12/15)を公開されました。氏は、カーネル部分を(Cではなく)Rustで実装するマイクロカーネル自作OSプロジェクトを進められています。マイクロカーネルをより良く知るのにおすすめです。

Mac OS X上で動かすとは

Reseaは、カーネルはC、ユーザランドプログラムはRustで書かれています。また、一部ユーティリティがPythonで書かれています。

まず、Mac OSX上にビルドのための環境を一式揃えます。ビルドが終わったら、QEMUというエミュレータ上で Reseaを起動します。QEMUが「仮想のコンピュータ」となり、その上でReseaを起動し、色々と実験をしてみることができます。

image.png

コンパイル、ビルドは、 make build make run コマンドで行います。そのコマンドで行われていることの詳細は、この後クローンするReseaリポジトリの Makefile および kernel/arch/x64/arch.mk に定義されています。

それぞれのファイルに、例えば .PHONY: build .PHONY: run .PHONY: clean などに続けて、make build make run make clean などの振る舞いが定義されています。

例えば、本稿中で make runとして実行すると、QEMU qemu-system-x86_64 が立ち上がります。その仮想の64bit x86 CPU上で build/hdd.img をハードディスクとして認識し、Reseaが起動します。

本稿のゴールは一旦「動かす」ことなので、これ以上 Makefile の構成詳細は記述しません。例えば、こちら( - 自動化のためのGNU Make入門講座 - Makefileの基本:ルール)で、基本を知ることができます。

環境準備

リポジトリのclone

以下のReseaリポジトリをクローンします。

seiyanuta/resea: A pure microkernel-based hackable operating system written from scratch in C and Rust.

$ git clone https://github.com/seiyanuta/resea.git
$ cd resea

プロジェクトは、以下のディレクトリから構成されています。

  • docs: ドキュメント
  • kernel: Cで実装されたカーネル部分
  • libs/resea: Rustで実装されたユーザランド部分
  • servers: Rustで実装されたサーバ群
  • tools: Pythonツール群
  • misc: その他

必要パッケージの導入

チュートリアルに沿って、パッケージを導入します。実行環境により要否が異なります。

$ brew install llvm python3 qemu bochs i386-elf-grub xorriso mtools 
  • llvm: LLVMコンパイラプラットフォーム
  • python3: Python3系
  • qemu: プロセッサエミュレータ
  • bochs: PC/AT互換機(x86系)エミュレータ
  • i386-elf-grub: i386用の高機能ブートローダ
  • xorriso: ISO9660ファイルシステムの操作ツール
  • mtools: MSDOSファイルの操作ツール

筆者環境では以下を考慮して、一部を抜きました。

$ brew install llvm qemu i386-elf-grub xorriso mtools 
  • pyenvでPython環境を作っており、Python3系はインストール済のため、今回はスキップ
  • 一旦動かすだけならエミュレータに qemuを使えば良いので、 bochsは入れなくても構わない

  • qemuはすでにインストールしたことがあったため、エラー。brew upgrade qemuで、最新版をインストール

Pythonパッケージのインストール

$ pip install -r tools/requirements.txt

現Python3環境に応じて、pipまたはpip3コマンドを使います。

Rust Nightlyと必要パッケージのインストール

rustupを使います。rustup.rs - The Rust toolchain installerで最新の実行コマンドを確認します。

$ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

上記を実行すると、以下のプロンプトが表示されます。

...
Current installation options:

   default host triple: x86_64-apple-darwin
     default toolchain: stable
               profile: default
  modify PATH variable: yes

1) Proceed with installation (default)
2) Customize installation
3) Cancel installation
>

1と答え、先に進みます。

...
  stable installed - rustc 1.39.0 (4560ea788 2019-11-04)


Rust is installed now. Great!

To get started you need Cargo's bin directory ($HOME/.cargo/bin) in your PATH
environment variable. Next time you log in this will be done
automatically.

To configure your current shell run source $HOME/.cargo/env

上記のように、インストールが完了しました。パスを通しておきます。

$ source $HOME/.cargo/env

デフォルトでは安定版が導入されています。

$ rustc --version
rustc 1.39.0 (4560ea788 2019-11-04)

Nightlyバージョンを導入し、切り替えます。

$ rustup default nightly

以下のようにインストールが完了します。

info: syncing channel updates for 'nightly-x86_64-apple-darwin'
info: latest update on 2019-12-15, rust version 1.41.0-nightly (c8ea4ace9 2019-12-14)
...
  nightly-x86_64-apple-darwin installed - rustc 1.41.0-nightly (c8ea4ace9 2019-12-14)

念のためバージョンを確認します。

$ rustc --version
rustc 1.41.0-nightly (c8ea4ace9 2019-12-14)

必要に応じて rustup default stableコマンドで、安定版に戻すことができます。

必要パッケージをインストールします。

$ rustup component add rust-src
$ cargo install xargo

rustupは、Rust言語のインストーラです。cargoは、Rustのパッケージの取得、ビルドを行うためのツールです。

...
    Finished release [optimized] target(s) in 54.06s
  Installing /<user directory>/.cargo/bin/xargo
   Installed package `xargo v0.3.18` (executable `xargo`)

上記のように表示され、インストールが正常に終了しました。

Reseaのビルド

$ make build               # Build a kernel executable.
$ make iso                 # Build an ISO image.

(参考) ビルド時に見られるエラー等

  • 安定版のRustの場合、make buildでエラーが出ます。
...
     XARGO  servers/shell
WARNING: the sysroot can't be built for the Stable channel. Switch to nightly.
error: failed to run `rustc` to learn about target-specific information

Caused by:
  process didn't exit successfully: `rustc - --crate-name ___ --print=file-names -C lto -Z emit-stack-sizes -Z external-macro-backtrace --target user_x64 --crate-type bin --crate-type rlib --crate-type dylib --crate-type cdylib --crate-type staticlib --crate-type proc-macro --print=sysroot --print=cfg` (exit code: 1)
--- stderr
error: the option `Z` is only accepted on the nightly compiler


make: *** [build/servers/shell.elf] Error 101

Nightly Rustが入っていることを確認します。

  • make isowarningが出ました
$ make iso
      GRUB  build/resea.iso
i386-elf-grub-mkrescue: warning: cannot open directory `/usr/local/Cellar/i386-elf-grub/2.04/share/locale': No such file or directory.
GNU xorriso 1.5.2 : RockRidge filesystem manipulator, libburnia project.

Reseaの実行

以下を実行すると、QEMU上で動作しました。

$ make run GUI=1     # Run on QEMU.

image.png

make runコマンドを実行したターミナル上では、キーボード割り込みなどのログが観察できます。

QEMU自体が終了できない状態となったので、アクティビティモニタからプロセスを強制終了しました。

ユーザランドプログラムを書いてみる

Hello, World! - Resea Documentation に沿って進めます。

$ cp -r servers/hello servers/rand
$ cd servers/rand
$ ls
Cargo.toml Xargo.toml lib.rs     main.rs

ファイルを編集して行きます。

Cargo.tomlの編集

servers/rand/Cargo.tomlを編集します。

$ code Cargo.toml  # VSCodeの場合

編集前

[package]
name = "hello"
version = "0.0.0"
authors = ["Seiya Nuta <nuta@seiya.me>"]
edition = "2018"

[lib]
crate-type = ["staticlib"]
path = "lib.rs"

[dependencies]
resea = { path = "../../libs/resea" }

編集後

[package]
name = "rand" # Update here!
version = "0.0.0"
authors = ["Your Name <yourname@example.com>"]  # and here!
edition = "2018"

[lib]
crate-type = ["staticlib"]
path = "lib.rs"

[dependencies]
resea = { path = "../../libs/resea" }

main.rsの編集

servers/rand/main.rsを編集します。

$ code main.rs  # VSCodeの場合

編集前

#[no_mangle]
pub fn main() {
    info!("Hello World!");
}

編集後

#[no_mangle]
pub fn main() {
    info!("Hello World from rand server!");
}

.build.mkの追記

reasea/直下の.build.mkに、環境変数STARTUPSを足します。

$ cd ../../
$ echo "STARTUPS += rand" >> .build.mk

QEMUで実行する

$ make run

例えば、Cargo.tomlファイルの編集を忘れると、以下のようなエラーが出ます。

error: two packages named `hello` in this workspace:
- /Users/tomo.masuda/code/resea/servers/hello/Cargo.toml
- /Users/tomo.masuda/code/resea/servers/rand/Cargo.toml
make: *** [build/servers/rand.elf] Error 101

以下の通り、起動に成功しました。

...
[memmgr] entering mainloop...
[kernel] sys_open: created @memmgr.5
[kernel] sys_trasnfer: transfering @memmgr.5 -> @memmgr.2
[kernel] send: @memmgr.1 -> @kernel.2 => @kernel.1 (header=0000000005011008)
[kernel] recv: @kernel.1 <- @2 (header=0000000005011008, notification=0000000000000000)
[kernel] timer_create: id=2 initial=0, interval=0
[kernel] send: @kernel.2 -> @memmgr.1 => @memmgr.1 (header=0000000005810004)
[kernel] recv: @memmgr.1 <- @1 (header=0000000005810004, notification=0000000000000000)
[rand] Hello World from rand server!
[kernel] WARN: Exception #6
[kernel] WARN: RIP = 0000000001000022    CS  = 000000000000002b    RFL = 0000000000000202
[kernel] WARN: SS  = 0000000000000023    RSP = 0000000003000000    RBP = 0000000000000000
[kernel] WARN: RAX = 0000000000000000    RBX = 0000000000000000    RCX = 0000000001013f40
[kernel] WARN: RDX = 0000000000000001    RSI = 0000000002fffd68    RDI = 0000000002fffdc8
[kernel] WARN: R8  = 0000000000000001    R9  = 0000000000000000    R10 = 0000000000000000
[kernel] WARN: R11 = 0000000000000206    R12 = 0000000000000000    R13 = 0000000000000000
[kernel] WARN: R14 = 0000000000000000    R15 = 0000000000000000    ERR = 0000000000000000
[kernel] WARN: NYI: ignoring thread_kill_current (#rand.8)

アクティビティモニタからプロセスを強制終了します。

make: *** [run] Killed: 9
$ 

先に進めたら、追記するかもしれません。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

あれ?.bash_profileや.bashrcが効いてないな?って思った時に読む記事

Macのバージョンアップに伴い、bashからzsh切り替わるとターミナルの$が、%になるんやけどここで気づいて欲しいのは僕らの「~/.bash_profile」はどうなったんやということ
bashからzshに移行メモにあるようにシンプルにとりあえず丸コピーでいいわっていう人はこれ

bash
$ cat .bash_profile >> .zprofile

なんやったら。あの上書きされると困る人もいるので一応追記コマンドにしてます

bash
$ cat .bashrc >> .zshrc

余談

あと余談なんやけどpyenvを入れた後に上記作業もやってると色々面倒で以下のようなことが起きてた
python2>3自動切り替えされんなんや分からんとりま「pyenv init」や

zsh
 ~ % pyenv init
# Load pyenv automatically by appending
# the following to ~/.zshrc:

eval "$(pyenv init -)"

親切に「~/.zshrcに追加しろ!」って教えてくれるんですね。
なので、cat使って一行で追加すると

echo "eval \"\$(pyenv init -)\""  >> .zshrc

前提環境:zsh

蛇足

あれお前profileに追記してないやんけという人はこちら
本当に正しい .bashrc と .bash_profile の使ひ分け

いまさらですがzshって2013年には切り替えよっていわれてたんですね
ヾ(o゚ω゚o)ノ゙bashからzshに移行して2014年を迎えよう! ref:
https://gist.github.com/harapeko/8045912

コマンド - とりあえずZshを使えば良いんだろう? - Qiita

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

MediaPipe の Hand Tracking を mac で動かす (動いた)

すでにやっている人がたくさんいるけど、復習ということで。

環境

MacBookPro + catalina 10.15.2 + Xcode 11.3 (11C29)

準備

先に brew のインストールが必要。bazel のインストールで jdk8 を要求されるかもしれない(下のコマンドには含む)。 bazel を普通に brew install bazel すると 1.2.1 とかインストールされるけど、bazel のバージョンが 1.1.0 以降だとダメぽいので、公式の通りにする。これ後で何か弊害でそう。

$ git clone https://github.com/google/mediapipe.git
$ brew cask install homebrew/cask-versions/adoptopenjdk8
$ brew install https://raw.githubusercontent.com/bazelbuild/homebrew-tap/f8a0fa981bcb1784a0d0823e14867b844e94fb3d/Formula/bazel.rb
$ brew link bazel
$ brew install opencv@3

xcode 関係で何かエラーが出たら、以下をためしてみる (自己責任で!)。

$ sudo xcodebuild -license accept
$ sudo xcode-select -r
$ sudo xcode-select -p

Hellp World のビルド

$ export GLOG_logtostderr=1
$ bazel run --define MEDIAPIPE_DISABLE_GPU=1     mediapipe/examples/desktop/hello_world:hello_world

Hello World が 10 回表示されたら OK。

Hand Tracking のビルトと実行

https://github.com/google/mediapipe/blob/master/mediapipe/examples/desktop/README.md
上記 URL には次のコマンドでビルドでいきるとあるけど、うちの環境では six module がないといわれて途中で止まった。

$ bazel build -c opt mediapipe/examples/desktop/hand_tracking:hand_tracking_cpu --define MEDIAPIPE_DISABLE_GPU=1

six を pip3 でインストールしたらいけた。

$ pip3 install six

ビルドを通ったら下記で実行できる。

GLOG_logtostderr=1 bazel-bin/mediapipe/examples/desktop/hand_tracking/hand_tracking_cpu     --calculator_graph_config_file=mediapipe/graphs/hand_tracking/hand_tracking_desktop_live.pbtxt

5fps くらいは出てる気がする。

Multiple Hand Tracking を試す

あっさり動いた。

$ bazel build -c opt --define MEDIAPIPE_DISABLE_GPU=1 \
          mediapipe/examples/desktop/multi_hand_tracking:multi_hand_tracking_cpu
$ GLOG_logtostderr=1 bazel-bin/mediapipe/examples/desktop/multi_hand_tracking/multi_hand_tracking_cpu \
--calculator_graph_config_file=mediapipe/graphs/hand_tracking/multi_hand_tracking_desktop_live.pbtxt
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

MediaPipe の Hand Tracking を mac で動かす

すでにやっている人がたくさんいるけど、復習ということで。

環境

MacBookPro + catalina 10.15.2 + Xcode 11.3 (11C29)

準備

先に brew のインストールが必要。bazel のインストールで jdk8 を要求されるかもしれない(下のコマンドには含む)。 bazel を普通に brew install bazel すると 1.2.1 とかインストールされるけど、bazel のバージョンが 1.1.0 以降だとダメぽいので、公式の通りにする。これ後で何か弊害でそう。

$ git clone https://github.com/google/mediapipe.git
$ brew cask install homebrew/cask-versions/adoptopenjdk8
$ brew install https://raw.githubusercontent.com/bazelbuild/homebrew-tap/f8a0fa981bcb1784a0d0823e14867b844e94fb3d/Formula/bazel.rb
$ brew link bazel
$ brew install opencv@3

xcode 関係で何かエラーが出たら、以下をためしてみる (自己責任で!)。

$ sudo xcodebuild -license accept
$ sudo xcode-select -r
$ sudo xcode-select -p

Hellp World のビルド

$ export GLOG_logtostderr=1
$ bazel run --define MEDIAPIPE_DISABLE_GPU=1     mediapipe/examples/desktop/hello_world:hello_world

Hello World が 10 回表示されたら OK。

Hand Tracking のビルトと実行

https://github.com/google/mediapipe/blob/master/mediapipe/examples/desktop/README.md
上記 URL には次のコマンドでビルドできると書かれているけど、うちの環境では six module がないといわれて途中で止まった。

$ bazel build -c opt mediapipe/examples/desktop/hand_tracking:hand_tracking_cpu --define MEDIAPIPE_DISABLE_GPU=1

six を pip3 でインストールしたらいけた。

$ pip3 install six

ビルドを通ったら下記で実行できる。

GLOG_logtostderr=1 bazel-bin/mediapipe/examples/desktop/hand_tracking/hand_tracking_cpu     --calculator_graph_config_file=mediapipe/graphs/hand_tracking/hand_tracking_desktop_live.pbtxt

5fps くらいは出てる気がする。

Multiple Hand Tracking を試す

あっさり動いた。

$ bazel build -c opt --define MEDIAPIPE_DISABLE_GPU=1 \
          mediapipe/examples/desktop/multi_hand_tracking:multi_hand_tracking_cpu
$ GLOG_logtostderr=1 bazel-bin/mediapipe/examples/desktop/multi_hand_tracking/multi_hand_tracking_cpu \
--calculator_graph_config_file=mediapipe/graphs/hand_tracking/multi_hand_tracking_desktop_live.pbtxt

landmark データの検証

手と指の位置のデータ (landmark) を取得して、表示させてみたのが次の図。手ひとつについて21点の landmark を認識して、それぞれ0番から20番まで手の各ポイントに割り当てられているようだ。番号は固定で、手の各位置と対応している。x,y,z の座標データが含まれているが、z は常に 0 になっている、つまり、奥行は取れていない。

pos.png

データもシンプルで使い勝手もいいので、いろいろできそうな気がしてきた。すごいよね google の人たち。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

いつのまにかzshでもないbashでもないshになってた話

こないだ何も知らずにchshした後の続きで
しらーんまにKPバッシュっぽくなってて、コナンくんよろしく「あれれーおかしーぞー?」って思って、
スクリーンショット 2019-12-15 16.17.37.png
↑試行錯誤してたあとによーくターミナルみたら....
おまえ"sh(シェル)"やんwww

結局前と全く同じコマンドを打ってからウィンドウ開き直したら直りました

terminal
chsh -s /bin/zsh

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

MacBook Pro でOpenPose その2

MacBook Pro でOpenPoseでMacBook ProでもOpenPoseが動作することがわかったのですが「GPUで動かせないかな?」と思い調べていたところPlaidMLというものをあるということで、下記を読んでみたところ、自分でもなんとかできそうかなということで試してみました。

環境

  • MacBook Pro 15in 2018 2.2 GHz Core i7 32GB Memory
  • Mojave 10.14.6
  • python 3.7.5
  • homebrew でpythonとvirtualenv、wgetをインストール

設定手順

準備

準備としては、Pythonの仮想環境を設定します。前回の環境を使っても良かったのですが、何か競合等がある場合を考えて作り直しました。

仮想環境を作成
$ virtualenv mppose-plaidml

仮想環境へ入る
$ source mppose-plaidml/bin/activate

PlaidML設定、動作確認

仮想環境へ入った後、PlaidMLパッケージのインストールと使用するデバイスの設定を行います。自分のMacBook ProにはRadeon Pro 555xが入っていたのでそちらを選択しました。

PlaidMLとベンチマークのパッケージをインストール
$ pip install plaidml-keras plaidbench

PlaidMLで使用するデバイスを設定
$ plaidml-setup
※デバイスの設定以外は y で
・・・
< 中略 >
・・・
デバイスの設定箇所では一覧に表示されたデバイスの番号を選択してEnter
Multiple devices detected (You can override by setting PLAIDML_DEVICE_IDS).
Please choose a default device:

   1 : llvm_cpu.0
   2 : opencl_intel_uhd_graphics_630.0
   3 : opencl_cpu.0
   4 : opencl_amd_radeon_pro_555x_compute_engine.0
   5 : metal_intel(r)_uhd_graphics_630.0
   6 : metal_amd_radeon_pro_555x.0

Default device? (1,2,3,4,5,6)[1]:6
・・・
< 中略 >
・・・

パッケージのインストールとデバイスの設定が終わったら、動作確認を行います

ベンチマークで動作を確認
$ plaidbench keras mobilenet
Running 1024 examples with mobilenet, batch size 1, on backend plaid
INFO:plaidml:Opening device "metal_amd_radeon_pro_555x.0" ※この表示が出ていれば選択したデバイスで動作している
Compiling network... Warming up... Running...
Example finished, elapsed: 0.545s (compile), 14.425s (execution)

-----------------------------------------------------------------------------------------
Network Name         Inference Latency         Time / FPS          
-----------------------------------------------------------------------------------------
mobilenet            14.09 ms                  0.00 ms / 1000000000.00 fps
Correctness: PASS, max_error: 1.675534622336272e-05, max_abs_error: 7.674098014831543e-07, fail_ratio: 0.0

動作していることは分かったのですが「CPUを使った場合と比べて早いのか遅いのか」が分からずどうすればいいのかなと思ったのですが、コマンドの前にPLAIDML_DEVICE_IDS="デバイス名"の記述をすればそのデバイスで動作するという情報があり、試してみました。

CPUを実行デバイスに設定してベンチマーク
$ PLAIDML_DEVICE_IDS="opencl_cpu.0" plaidbench keras mobilenet
Running 1024 examples with mobilenet, batch size 1, on backend plaid
INFO:plaidml:Opening device "opencl_cpu.0"
Compiling network... Warming up... Running...
Example finished, elapsed: 3.034s (compile), 141.360s (execution)

-----------------------------------------------------------------------------------------
Network Name         Inference Latency         Time / FPS          
-----------------------------------------------------------------------------------------
mobilenet            138.05 ms                 134.30 ms / 7.45 fps
Correctness: FAIL, max_error: 0.005546755623072386, max_abs_error: 0.0003522038459777832, fail_ratio: 0.076

結果としてはRadeon Pro 555xでCPUの10倍ほどのパフォーマンスが出るようなので、効果は出ているのかと思います。

あと、アクティビティモニターのウィンドウ -> GPUの履歴を選択するとGPUデバイス一覧と動作状況がリアルタイムで参照できるので、そちらを使って動作状況を見るという方法もあります。

OpenPose設定

では、OpenPoseを設定していきます。手順としては大方は前回と同じですが、PlaidMLを使うために手順を一部変える必要があります。

OpenPoseを動作させるためのパッケージをインストールします。
$ pip install ipython configobj pillow opencv-python

Kerasバックエンド版のOpenPoseをGithubよりクローンします。
$ git clone https://github.com/michalfaber/keras_Realtime_Multi-Person_Pose_Estimation.git

ディレクトリへ移動します。
$ cd keras_Realtime_Multi-Person_Pose_Estimation/

リポジトリ内のmodelディレクトリに移動してcaffeとkerasの学習モデルをダウンロードします。
$ cd model
$ sh get_caffe_model.sh 
$ sh get_keras_model.sh 

モデル処理のモジュールにPlaidMLを使用するための修正を加えます。
$ vi cmu_model.py

※ ソースの文頭に下記の2行を追加するだけでいいです。 
import plaidml.keras
plaidml.keras.install_backend()

空のinit.pyを作成します。(私の環境では、これを作成しないと後のpythonスクリプトを動作させる際にmodelディレクトリ配下のpythonモジュールが読みこめず、エラーになりました)
$ touch __init.py__

リポジトリのトップへ戻り、caffeのnumpy学習モデルレイヤをダンプします。
$ cd ../
$ docker run -v `pwd`:/workspace -it bvlc/caffe:cpu python dump_caffe_layers.py

caffeの学習モデルレイヤをkeras用に変換します。
$ python caffe_to_keras.py 

以上で設定は完了です。

動作は成功、しかし・・・・

ということで、前回と同じくサンプル写真とカメラで動作確認をしてみたのですが・・・

サンプル写真の姿勢検出をしてみる。
$ python demo_image.py --image sample_images/ski.jpg 

カメラを起動して姿勢検出をしてみる。
$ python demo_camera.py

カメラの姿勢検出で、大体processing time 0.21sec程度という結果となり、CPUでの動作結果(processing time 0.07sec程度)よりもパフォーマンスが落ちてしまいました。
「どうしてだろう?」と調べてみたところ、PlaidMLのissueにこんなやりとりが上がっていました。
Plaidml backend slower than TF backend #530

考えられる可能性としては「現在のPlaidMLが対応している計算モデルが少ない」ということなのかもしれません、今回使用したOpenPoseの計算モデル(CMU?)には対応できていないということなのかと思います。

通常であればここで諦めて「GPUを使った環境を用意する」のが正当かと思います。
今回は「現状自宅にある環境で、どこまでできるか?」というところなので、一応ここまでできたので、あとは

  • PlaidMLのバージョンアップ後を期待する(1年以上更新が止まっているようなので期待薄?)
  • PlaidMLが対応している計算モデルで動くように作り変えてみる

といったところで、色々考えつつやっていこうかと思います。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

macOS Catalinaへアップグレードしたら「空き容量が足りません」エラーが出たときの対処方法

macOSをMojaveからCatalinaへアップグレードしたら

コンピュータにmacOSをインストールできませんでした

Macintosh HDにはインストールに必要な空き領域がありません

と出てインストールが途中で止まってしまった。
画面に再起動ボタンが出ているので、これをクリックして再起動しても、
再び同じメッセージでOS起動できない状態。。。

MACサポートへ問合せしてみたら、以下の手順を教えてくれ、その手順でやったら
復活できたので、その手順を共有。

準備

データが入っていない空の外付けHDDを用意(USBタイプ)

外付けHDDへCatalinaインストール

  • macを起動時に Option + Command + R でmacOS復元モードで起動
  • ディスクユーティリティを選択
  • guidパーティションテーブル方式を選択できるようにするために、以下のようにすべてのデバイスを表示させる無題.png
  • 外付けHDDを挿す
  • ディスクユーティリティ画面の左ペインに外付けHDDが表示されるのを確認し、それを選択
  • 「消去」ボタンをクリックし、以下を選択
    • フォーマット:macos拡張ジャーナリング
    • 方式:GUIDパーティションマップ
  • 「消去」ボタンをクリック
  • macOS復元画面に戻り、「macOSを再インストール」を選択
    • インストール先のディスクに、先ほどフォーマットした外付けHDDを選択
  • Catalinaが外付けHDDにインストールされるので、完了するまで待つ

データの退避と、不要データの削除

  • osインストールが完了したら、Finderをクリックし、左ペインにMacintoshHDが見えるか確認
  • MacintoshHDが見えたら元のデータが取り出せる
    • MacintoshHD のDataに元のデータが入っているので、MacintoshHDを選択してもそのままだと見えない。Finderの検索窓に”home”と打つとData内のファイルが見えるので、そのファイルを右クリックし、置き場所のフォルダを表示させる。
    • 退避しておきたい対象のフォルダ or ファイルをデスクトップにDrag & Dropして退避する
  • MacintoshHDの不要なファイルを削除して、ディスク容量を空ける

内蔵DiskへCatalinaインストール

  • OS再起動させ、Command + R でmacOS復元モードで起動
  • 「macOSを再インストール」を選択し、Catalinaのインストールを実行
  • Catalinaインストールが無事完了!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Spyder4 をアイコンから起動させる(Mac編)

SpyderAnacondaに付いてくるIDE(プログラムを書くためのソフトウェア)で、直感的で使いやすい。特にサイエンス系やプログラミング初心者に向いていると思います。最近、待望のSpyder4がリリースされ、プログラマーたちがよく使っている(イメージの)ダークモードが使えるようになりました。

しかし、実際にインストールしようとするとちょっとややこしかったので、ここに記録しておきたいと思います。

準備

Spyderの公式ページではAnacondaからのインストールを強く勧めているので、とりあえずAnacondaをインストールしておきます。Anacondaのインストールは公式ページからダウンロードして直感的にNext、Nextと進めるだけでできます。

Spyder4をインストールする

Anacondaがインストールできたら、とりあえず新しい環境を作ります。これは、もし後で問題が起きたとしても、この環境を消したり、新しい環境をまた作ればよいので、保険になります。

conda create -n spyder4 python=3.7

新しい環境ができたら、conda activate spyder4 と入力・実行して、今作った新しい環境に移ります。そして、spyder4をインストールします。

conda install spyder==4.0

インストールが完了したら、spyderと入力・実行してspyder4を立ち上げます。
無事に立ち上がったら、spyder4のインストールは完成です。

ややこしかったのは、なぜかAnaconda Navigator(Anacondaをインストールする際にインストールされたソフトウェア)にspyder4がいなかったので、Terminalからspyder4を起動する必要があるところです。(最初からパソコンにanacondaがインストールされていない場合では、また状況は違うかもしれませんが。)

アイコンから起動させる

Macに標準装備されているAutomatorというアプリは、人間がクリックしたりドラッグしたりする操作を自動化してくれる便利アプリです。単純な繰り返し作業は、このアプリに任せることができます。今回はこれを利用してSpyder4をアイコンから起動させるようにします。

方法1

Spyder4は、実は下記の場所にあるアイコンをダブルクリックすることで起動させることができます。しかし、これを他の場所に移すと起動できないので、Automatorを使って、『これをクリックし、起動させる』ことをします。
~/opt/anaconda3/envs/spyder4/bin/spyder
(anaconda3の場所が異なることがあります)

1. Automatorを起動し、新規作成を選択します。
2. Workflowを選択します。
3. 上記のファイルをAutomatorの右側にドラッグ&ドロップします。
4. 検索バーでOpen Finder Items を検索し、この項目を右側の欄にドラッグ&ドロップします。
Screen Shot 2019-12-14 at 3.52.41 PM.png
5. このWorkflowを保存します。場所をApplicationsにすれば、Launchpadから起動できます。File FormatをApplicationに選択します。
Screen SPM.png

以上で完成です。

アイコンの変更

アイコンをSpyderのものに変えたいのであれば、下記の場所にダークモードのpngファイフがあるので、これをアイコンに使っても良いでしょう。
~/opt/anaconda3/⁨pkgs/spyder-4.0.0-py37_0⁩/lib⁩/⁨python3.7/⁨site-packages⁩/spyder⁩/⁨images⁩/spyder_dark.png
spyder_dark.png

Macではアイコンの変更は非常に簡単です。
1. 画像をコピーします。(注:画像ファイルではなく、画像自体をコピーします。つまり、画像をPreviewなどで開いて、全選択して(⌘+A)コピーします。)
2. 次に、変更先のアプリのアイコンを右クリックして、Get Infoを選択します。
3. 左上のアイコンの部分を選択して、ペースト(⌘+V)するだけで完成です。
Screen Shot 2019-12-14 at 4.18.34 PM.png

方法2

AppleScriptを使います。AppleScriptはMacOSをコードで操作できます。

1. Automatorを起動し、新規作成を選択します。
2. Workflowを選択します。
3. 検索バーでRun AppleScriptを検索し、この項目を右側の欄にドラッグ&ドロップします。
4. Scriptの欄に下記コードを書き込みます。

tell application "Terminal"
    do script " "
    activate
    do script "conda activate spyder4" in window 1
    do script "spyder" in window 1
end tell

あとは方法1と同様に保存して完成です。

(番外編)Kiteを使って自動予測入力

Kiteはコードの予測入力をしてくれるAdd onです。Spyderはデフォルトでは予測入力機能が余り充実していないので、このような(無料の)自動予測入力ツールがあると助かります。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Mac+Docker+ubuntu (??)

動作環境

Mac OS Catalina 10.15.1

概要

Mac上でROSを動かしたいと思い、公式を確認したところサポートされてるのがubuntu上だけだったので、Dockerを使ってubuntuを入れた後、その中でROSを動かしたいと思ったのでその実行手順をまとめておこうと思う。rosを入れる手順は別の記事でまとめようと思う。

まずはDockerをインストールする

とりあえず、MacにDockerをインストールする

https://hub.docker.com/editions/community/docker-ce-desktop-mac

公式サイトでまずは自分のアカウントを作ってログインする

スクリーンショット 2019-12-14 16.18.12.png

そして右上のGet Dockerからインストールできる

この時、ターミナル上で以下のコマンドでちゃんとインストールされたか確認できる

docker version

この時、macのアプリケーションフォルダに入ってるDockerをクリックして起動させてないといけないらしく、参考にした記事には載ってなかったのでこちらには載せておく

ubuntuを入れる

これでDockerは入ったのでubuntuを入れていく

docker pull ubuntu:16.04

今回はubuntu 16.04を入れる

https://hub.docker.com/_/ubuntu/

こちらのdockerhubの方でpull可能なubuntuのバージョンは載ってるので好きなのを入れましょう

docker images

これでpullしたものを確認する

ubuntu16.04があればきちんとpullできている

ubuntuが入ったら

まずはubuntuの起動をする

docker run -it -d --name ubuntu1604 ubuntu:16.04

dockerのrunコマンドで起動する

正しく起動されてるか確認する

docker ps

コンテナ名はubuntu1604なので、正しく起動されてたら出てくると思う

もし、出てこない場合は

docker ps -a

これでpullがちゃんとできてるか確認する

起動したらそのコンテナに入る

docker exec -it ubuntu1604 /bin/bash

これでコンテナ内に入れた

抜けたい時は

exit

再度入りたい場合は

docker exec -it ubuntu1604 bash

これで入れる

コンテナを停止させる場合

docker stop ubuntu1604

再度動かす場合

docker start ubuntu1604

停止と再起動はどちらもコンテナから抜けてからやる必要がある

ubuntuに入った状態でまずはユーザーを追加する

adduser user_name

user_nameには自分の好きな名前を入れよう

gpasswd -a user_name sudo

これでubuntu内でユーザーが追加された

これで一通りできたわけだが、例えばubuntu内でpythonのコードを書いて実行するには
ファイルの読み書きができないといけないが、docker内で処理されるので、macに入れてるテキストエディタは使えない

ということでubuntuにvimを入れておいた

sudo apt-get update
sudo apt-get install vim

これでvimをインストールできた

参考文献

Dockerをインストールした時に参考にさせていただいた
https://qiita.com/kurkuru/items/127fa99ef5b2f0288b81

ubuntu入れる時に参考にさせていただいた
https://weblabo.oscasierra.net/docker-ubuntu1604/

ユーザーを追加する時に参考にさせていただいた
https://qiita.com/white_aspara25/items/c1b9d02310b4731bfbaa

vim入れる時参考にさせていただいた
https://qiita.com/YumaInaura/items/3432cc3f8a8553e05a6e

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

MacBook Pro でOpenPose

MacBook Proで機械学習、Deep Leaning系の記事を調べていた際、Macで姿勢検出ができるという記事を
いくつか見つけて色々試してみたところ動作したので、備忘録的に書いておきます。

環境

  • MacBook Pro 15in 2018 2.2 GHz Core i7 32GB Memory
  • Mojave 10.14.6
  • python 3.7.5
  • homebrew でpythonとvirtualenv、wgetをインストール

設定手順

準備

準備としては、Pythonの仮想環境を設定します。

python仮想環境を作成します。
$ virtualenv mppose

python仮想環境に入ります。
$ source mppose/bin/activate

OpenPose設定

OpenPoseを設定していきます。

動作させるために必要なパッケージをインストールします。
$ pip3 install tensorflow ipython configobj keras pillow opencv-python

Kerasバックエンド版のOpenPoseのリポジトリをクローンして移動します。
$ git clone https://github.com/michalfaber/keras_Realtime_Multi-Person_Pose_Estimation.git
$ cd keras_Realtime_Multi-Person_Pose_Estimation/

リポジトリ内のmodelディレクトリに移動してcaffeとkerasの学習モデルをダウンロードします。
$ cd model
$ sh get_caffe_model.sh 
$ sh get_keras_model.sh 

空のinit.pyを作成します。(私の環境では、これを作成しないと後のpythonスクリプトを動作させる際にmodelディレクトリ配下のpythonモジュールが読みこめず、エラーになりました)
$ touch __init.py__

リポジトリのトップへ戻り、caffeのnumpy学習モデルレイヤをダンプします。
$ cd ../
$ docker run -v `pwd`:/workspace -it bvlc/caffe:cpu python dump_caffe_layers.py

caffeの学習モデルレイヤをkeras用に変換します。
$ python caffe_to_keras.py 

以上で設定は完了です。

動作確認

サンプル写真の姿勢検出をしてみる。
$ python demo_image.py --image sample_images/ski.jpg 

カメラを起動して姿勢検出をしてみる。
$ python demo_camera.py

カメラで姿勢検出をしてみたところ、大体processing time 0.07sec程度で検出ができているようで、CPUのみでもそこそこ動くものだなといったところです。姿勢検出系は他にもあるようなので、何かできるようなものがあればまた試してみようかと思います。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む