20190811のMacに関する記事は4件です。

ターミナルについての備忘録

1. はじめに

  • Mac環境の勉強がてらTerminal(ターミナル)について調べたので自分用の備忘録としてまとめました。

2. Terminal(ターミナル)とは

  • 端末エミュレータのこと。
  • MacOSに標準で搭載されているTerminal.appや、iTerm2が該当する。
  • Terminal.appを起動すると、CLI(Command Line Interface:コマンドラインインターフェイス)のShell(シェル)であるBash(Bourne Again Shell:ボーンアゲインシェル)が起動する。

2-1. 端末エミュレータとは

  • キャラクタ端末(テキストの入力と表示を行う端末)を画面(ウインドウシステム)上で擬似的にエミュレートしたもの。

2-2. Shell(シェル)とは

  • ユーザがOS内部(Kernel:カーネル)とやりとりするためのソフトウェア。
  • カーネル自身はユーザと対話することができないため、ユーザがターミナルで入力したコマンドや入力操作をシェルが解釈し、カーネルに処理を依頼する。その後カーネルから出力された結果やメッセージをユーザに返す。

2-3.ターミナル上でのコマンド入力、解釈、実行までの流れ

  • 例としてlsコマンド実行までの流れ
  1. ターミナル上でlsコマンドを入力。
  2. シェルがコマンドを解釈し、カーネルに処理(ディレクトリ、ファイルのリスト出力)を依頼。
  3. カーネルが依頼された処理を実行。
  4. シェルがカーネルの処理結果を解釈し、ターミナルに結果(ファイル、ディレクトリのリスト)を返す。
  5. ターミナル上に結果(ファイル、ディレクトリのリスト)が表示される。

3. (よく使いそうな)コマンド一覧

pwd コマンド

  • print working directoryの略。
  • カレントディレクトリのパスを表示する。
pwd
$ pwd #カレントディレクトリのパスを表示

ls コマンド

  • listの略。
  • カレントディレクトリにあるファイルを表示する。
ls
$ ls #カレントディレクトリにあるファイルとディレクトリを表示
$ ls -a #隠しファイルも含めたファイルとディレクトリを表示
$ ls -l #ファイルやディレクトリの詳細も表示

cd コマンド

  • change directoryの略。
  • カレントディレクトリを移動する。
cd
$ cd Desktop #カレントディレクトリをDesktopフォルダに移動
$ cd ~ #ホームディレクトリに移動
$ cd .. #カレントディレクトリを1階層上のディレクトリに移動

touch コマンド

  • ファイルのタイムスタンプを変更する。
  • 存在しないファイル名を指定するとファイルを新規作成する。
touch
$ touch hoge.md #hoge.mdを新規作成
$ touch hoge.md #hoge.mdのタイムスタンプを現在日時に設定
$ touch -d "2019-8-11 20:30" hoge.md #hoge.mdのタイムスタンプを2019/8/11 20:30に設定

mkdir コマンド

  • make directoryの略。
  • カレントディレクトリに指定フォルダ(ディレクトリ)を作成する。
mkdir
$ mkdir hoge #hogeフォルダを作成
$ mkdir -m 666 hogehoge #パーミッション(666:全ユーザに読み書き許可、実行許可なし)のhogehogeフォルダを作成

mv コマンド

  • moveの略。
  • ファイルを移動またはファイル名をリネームする。
mv
$ mv hoge.md Desktop/ #hoge.mdをDesktopに移動
$ mv hoge.md hoge1.md #hoge.mdをhoge1.mdにリネーム

cp コマンド

  • copyの略。
  • ファイルまたはフォルダ(ディレクトリ)をコピーする。
cp
$ cp hoge.md hoge1.md #hoge.mdをhoge1.mdとしてコピー
$ cp -r test test1 # testフォルダをtest1フォルダとしてコピー

rm コマンド

  • removeの略。
  • ファイルまたはフォルダ(ディレクトリ)を削除する。
rm
$ rm hoge.md #hoge.mdを削除
$ rm hoge* #ファイル名にhogeを含むファイルを削除
$ rm -r test #testフォルダを削除

openコマンド

  • ファイルまたはフォルダ(ディレクトリ)を開く。
open
$ open . #カレントディレクトリをFinderで開く
$ open ~ #ホームディレクトリをFinderで開く
$ open hoge.md #関連付けられているアプリでhoge.mdを開く

source コマンド

  • ファイルを再読み込みする。
source
$ source .bash_profile #.bash_profileを再読み込みし、設定を有効にする

findコマンド

  • ファイルを検索する。
find
$ find ~/ -name *.md # ホームディレクトリ配下の.mdファイルを検索

grepコマンド

  • ファイル内の文字列に対して検索する。
grep
$ grep hoge *.md # カレントディレクトリに存在する.mdファイルについて、hogeを検索
$ grep hoge ./DEV # DEVディレクトリに存在するファイルについて、hogeを検索

# findコマンドと組み合わせて指定ディレクトリ配下を再帰的に検索する
$ find ./DEV -name "*.md" | xargs grep hoge # DEVディレクトリ配下の.mdファイルについて、hogeを検索
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Docker for MacでXilinx FPGA用の開発環境を作る

TL;DR

  • Xilinx ISEがインストールされたdockerイメージを作成しました。
  • Mac上から自動でビルドする環境を整備し、テンプレートとして公開しました。

はじめに

FPGAを販売するXilinx社では、ISE(最近のデバイス用にはVivado)と呼ばれる自社製の開発環境を用意しています。FPGAのコンフィグレーションに必要なBit stream file(*.bit)はこのISEを使って生成できますが、逆に言えばXilinx社謹製のISEを使わなければ生成できません。そして、ISEは対応OSがWindowsとLinuxのみなんですよね...見事にMacがハブれれてしまいました。メインで使っている端末がMacということもあり、MacからFPGAの開発ができると嬉しいな...と思いしばらくいじっていたので、備忘録を兼ねて記事にします。

以前の開発環境

一年ほど前にFPGAボードの開発をしていた際には、次のような環境で開発していました。

  • ターゲットデバイス
  • 開発&シミュレーション
    • Mac端末
    • 言語: VHDL
    • エディタ: Visual Studio Code
    • テスト用コンパイラ: ghdl
  • 実装
    • Windows端末
    • エディタ&コンパイラ: Xilinx ISE

状況としてはMacの方でVHDLコードを書き、ghdlでコンパイルして挙動を確認します。だいたいいい感じまでできたらソースコードをDropboxなりGithubなりにアップロードして、Windows端末にダウンロードし、Xilinx ISEで作成したプロジェクトにソースコードを加えて、実装用のBit stream fileを生成していました。
なぜこのような面倒な手順を踏んでいたかというと、Windows端末が研究室の端末で、自宅に持ち帰りが難しかったこと、加えてXilinx ISE上でのソースコードの編集がお世辞にもやりやすいとは言えなかった(補完やSyntax Highlightが貧弱だった)ため、ソースの編集はVS Code上でやりたかったという事情があります。Mac上でVMを使うことも考えたのですが、Mac上のストレージの容量が少なく、VMを立てたくもない状況でした。
そんなこんなで、このしち面倒臭い環境でしばらく開発をしており、そのときの目的が達成された後には、もう金輪際FPGAに関わることもないだろうと思っていたわけです。ただ、幸か不幸かまたFPGAに触る機会ができたので、この際Macで実装までできるようにしてやろうと思いまして、環境構築に取り組みました。

Mac上でのFPGA開発環境の構築

あらすじは次の通りです。

  1. Docker for MacでXilinx ISEインストール済みのdockerイメージを作成
  2. Pythonのinvokeパッケージを使ってコンパイル、テスト環境の構築

以下の手順では次のソフトウェアがインストールされていることを前提にしています。

  • Docker for Mac
  • Python 3.x
  • XQuartz
  • invoke (Python package)
  • ghdl

docker、XQuartz、Python3、ghdlはHomebrewから、invokeはAnaconda経由で入手しました。invokeはpipでも入手できるようです。

1. Docker for MacでXilinx ISEインストール済みのdockerイメージを作成

~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~
以下の手順でISE Webpack editionをインストールしたものはDocker Hub上でseekworser/ise_webpackで公開しているため、Webpack版であれば

docker pull seekworser/ise_webpack

で事足ります。容量が30 GB以上あるので注意してください。
~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~/~

dockerを使ってXilinx Vivadoをインストールしている方がいらっしゃったので、その記事を参考にしました。
Xilinx の開発ツールを Docker コンテナに閉じ込める

この方はVivado HLx 2018.2: All OS installer Single-File Downloadをダウンロードしてきて、インストールまで含めてDockerfileで自動化しているのですが、ISEではSingle file Downloadが存在しないため、泣く泣くインストールは手動で行います。
そこで、まずfull installer for Linuxをダウンロードしてきて、次のようなDockerfileを作成しました。

Dockerfile
FROM ubuntu

RUN \
  sed -i -e "s%http://[^ ]\+%http://ftp.jaist.ac.jp/pub/Linux/ubuntu/%g" /etc/apt/sources.list && \
  apt update && \
  apt upgrade -y && \
  apt -y --no-install-recommends install \
  ca-certificates curl sudo xorg dbus dbus-x11 ubuntu-gnome-default-settings gtk2-engines \
  ttf-ubuntu-font-family fonts-ubuntu-font-family-console fonts-droid-fallback lxappearance && \
  apt-get autoclean && \
  apt-get autoremove && \
  rm -rf /var/lib/apt/lists/* && \
  echo "%sudo ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers

COPY Xilinx_ISE_DS_Lin_14.7_1015_1.tar /

RUN mkdir /ise-installer &&\
  tar --strip-components 1 -C /ise-installer \
  -xvf Xilinx_ISE_DS_Lin_14.7_1015_1.tar &&\
  rm /Xilinx_ISE_DS_Lin_14.7_1015_1.tar

前半は先のリンクの方から丸パクリで、X11環境のインストールその他です。後半でインストール用のフォルダを/ise_installer下に展開しておきます。(ファイル名はバージョンに合わせて変えてください)

ここからGUIインストーラを立ち上げ、ISEをインストールします。Docker for MacでX11 GUIを立ち上げる際には次を参考にしました。
Mac+dockerでx11アプリケーションを起動する

先ほどのDockerfile、ダウンロードしたインストーラを全て同じフォルダに入れ、さらにhost側でXQuartzを立ち上げた状態で以下のコマンドを実行します。

docker build --no-cache --rm -t ise-installer .
xhost + 127.0.0.1
docker run -e DISPLAY=docker.for.mac.localhost:0 --name ise-installed ise-installer /ise-installer/xsetup

その後XQuartzでインストーラが起動するため、指示にしたがってインストールを行います。インストール後に、

(host)$ docker commit ise-installed ise-installed
(host)$ docker run -i --name ise ise-installed /bin/bash
(container)$ rm -rf /ise-installer
(container)$ exit
(host)$ docker commit ise ise
(host)$ docker container rm ise-installer ise-installed ise
(host)$ docker image rm ise-installer ise-installed

を順に実行し、ISEのインストールされたイメージiseを作成します。

2. Pythonのinvokeパッケージを使ってコンパイル、テスト環境の構築

先ほど作成したimageと、Pythonのinvokeパッケージを使用して、コンフィギュレーション用のBit stream fileを作成する環境を作成します。seekworser/ise_project_templateでPapilio pro用に作成したものは公開しています。
ディレクトリ構成は次のようになっています。

ise_project_template
.
├── Readme.md
├── log/
├── out/
├── test/
├── src/
│   ├── project.yaml
│   ├── sample.vhd
│   ├── sample_ucf.ucf
│   └── test_sample.vhd
├── sample.bit
└── tasks.py

logファイルの出力、中間ファイルの出力、ソースコード保管、test用のファイルの出力用のディレクトリとinvoke用のPythonスクリプトが置いてあります。

sample.vhdがメインのVHDLファイルです。

sample.vhd
entity sample is
    -- write ports
end sample;
architecture behavior of sample is
    -- write behavior
end behavior;

また、sample_ucf.ucfはFPGAの制約ファイルです。
プロジェクトが変わるごとにMakefileもといtasks.pyをいじるのは嫌だったので、project.yamlにコンパイル用のパラメータを格納しておくようにします。ついでに使うFPGAの情報もpart:以下に書いておきます。

project.yaml
src_files:
  - file_name: sample.vhd
    language: vhdl
    library: work
    entity_names:
      - sample 

test_files:
  - file_name: test_sample.vhd
    entity_names:
      - test_sample
      - test_sample2

ucf_file: sample_ucf.ucf

top_module: sample

part:
  device: xc6slx9
  package: tqg144
  speed: -2

tasks.pyではこの情報を読み取って、ビルドやテストなどを行うようコードを書いておきます。例えば次のようなイメージです。

tasks.py(一部)
import yaml
import invoke

def get_project_parameter(*keys):
    param = yaml.load(open(PROJECT_YAML_FILE_NAME, "r+"))
    for item in keys:
        param = param[item]
    return param

@invoke.task
def bitgen(c):
    c.run(
        "docker run --rm -i -v $(PWD):/project seekworser/ise_webpack:latest sh <<_EOT_\n"
        "cd /project\n"
        "{ise_base:s}bitgen -w {outdir:s}{top_module:s}.ncd {top_module:s}.bit {outdir:s}{top_module:s}.pcf\n"
        "mv *.drc {logdir:s}{top_module:s}_drc.log\n"
        "mv *.bgn {logdir:s}{top_module:s}_bitgen.log\n"
        "rm -rf *.xwbt _xmsgs xilinx_device_details.xml *.xrpt\n"
        "_EOT_".format(
            ise_base=ISE_BASE,
            top_module=get_project_parameter(TOP_MODULE_KEY),
            outdir=OUTDIR,
            logdir=LOGDIR,
        )
    )
    return

# ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ 
# some other tasks
# ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ 

ISE_BASE = "/opt/Xilinx/14.7/ISE_DS/ISE/bin/lin64/"
OUTDIR = "./out/"
SRCDIR = "./src/"
LOGDIR = "./log/"
PROJECT_YAML_FILE_NAME = SRCDIR + "project.yaml"
TOP_MODULE_KEY = "top_module"

最終的にどうなったか

以上の結果として

invoke builde

のコマンド一発でMacからBit stream fileが生成できるようになりました。ISEの使いにくいエディタを使う必要もなくなったため、開発がよりスムーズに進むようになりました。

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

Docker for Macを使ったローカルのKubernetesクラスタ上でSparkジョブを実行する

Docker for Macをインストールする

以下を参照ください。
https://docs.docker.com/docker-for-mac/install/

Kubernetesクラスタを有効にする

Preferences -> Kubernetes -> Enable Kubernetesをクリックします。
Screen Shot 2019-08-11 at 4.52.56 PM.png

SparkのDockerイメージを作成する

以下の記事を参照ください。
https://qiita.com/yohei1126@github/items/efcc906b8609d78274ff

Sparkジョブを実行する

サンプルとして提供されている spark-examples_2.11-2.4.3.jar を実行します。これはπを計算するプログラムです。
まずクラスタのURLを確認します。

 $ kubectl cluster-info
Kubernetes master is running at https://localhost:6443
KubeDNS is running at https://localhost:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

ジョブの実行にはSpark-submitコマンドが必要なため、リポジトリから取得して以下のコマンドを実行します。

$ wget https://www-us.apache.org/dist/spark/spark-2.4.3/spark-2.4.3-bin-hadoop2.7.tgz
$ tar zxvf spark-2.4.3-bin-hadoop2.7.tgz
$ cd spark-2.4.3-bin-hadoop2.7
$ bin/spark-submit \
  --master k8s://https://localhost:6443 \
  --deploy-mode cluster \
  --conf spark.executor.instances=3 \
  --conf spark.kubernetes.authenticate.driver.serviceAccountName=spark \
  --conf spark.kubernetes.container.image=yohei1126/spark:v2.4.3 \
  --class org.apache.spark.examples.SparkPi \
  --name spark-pi \
  local:///opt/spark/examples/jars/spark-examples_2.11-2.4.3.jar

Sparkジョブの結果を確認する

  • Sparkジョブはpodのなかで実行されるため、podの一覧を取得します。
  • kubectl logs でpodの中のログを確認すると、πが計算されています。
$ kubectl get pods
NAME                                               READY     STATUS      RESTARTS   AGE
spark-pi-2e689dc329e934f38c1017d59635da59-driver   0/1       Completed   0          46m
$ kubectl logs spark-pi-2e689dc329e934f38c1017d59635da59-driver
...
Pi is roughly 3.1442157210786053
...
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Mac で「 ⌘⌥⇧⌃ (command, option, shift, control) 」の文字を入力する

大体のアプリケーションでは、編集タブ → 絵文字と記号という項目があるのでこれを使う。
なければ、別のアプリケーション(メモとか)を開いて入力し、コピペしてくる。

なお、キーボードショーカットは⌃⌘スペース
image.png

開くと、カーソル近くに以下のような入力補助的なやつが出るはず。
image.png

あとは各記号の名前が分かれば検索できる。ということで以下に名前を挙げる。

⌘ : Place of Interest Sign
⌥ : Option Key
⇧ : Upwards White Arrow
⌃ : Up Arrowhead

(参考:各文字のデータ)
⌘ : https://unicode-table.com/en/2318/
⌥ : https://unicode-table.com/en/2325/
⇧ : https://unicode-table.com/en/21E7/
⌃ : https://unicode-table.com/en/2303/

ちなみにキーボードから普通に入力できる ^ は Circumflex Accent で別物なので注意。
image.png

オワタ\(⌃o⌃)/

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