- 投稿日:2019-08-11T21:51:45+09:00
ターミナルについての備忘録
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
コマンド実行までの流れ
- ターミナル上で
ls
コマンドを入力。- シェルがコマンドを解釈し、カーネルに処理(ディレクトリ、ファイルのリスト出力)を依頼。
- カーネルが依頼された処理を実行。
- シェルがカーネルの処理結果を解釈し、ターミナルに結果(ファイル、ディレクトリのリスト)を返す。
- ターミナル上に結果(ファイル、ディレクトリのリスト)が表示される。
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を検索
- 投稿日:2019-08-11T19:44:12+09:00
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開発環境の構築
あらすじは次の通りです。
- Docker for MacでXilinx ISEインストール済みのdockerイメージを作成
- 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を作成しました。DockerfileFROM 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.pylogファイルの出力、中間ファイルの出力、ソースコード保管、test用のファイルの出力用のディレクトリとinvoke用のPythonスクリプトが置いてあります。
sample.vhd
がメインのVHDLファイルです。sample.vhdentity 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.yamlsrc_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の使いにくいエディタを使う必要もなくなったため、開発がよりスムーズに進むようになりました。
- 投稿日:2019-08-11T18:00:00+09:00
Docker for Macを使ったローカルのKubernetesクラスタ上でSparkジョブを実行する
Docker for Macをインストールする
以下を参照ください。
https://docs.docker.com/docker-for-mac/install/Kubernetesクラスタを有効にする
Preferences -> Kubernetes -> Enable Kubernetesをクリックします。
SparkのDockerイメージを作成する
以下の記事を参照ください。
https://qiita.com/yohei1126@github/items/efcc906b8609d78274ffSparkジョブを実行する
サンプルとして提供されている
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.jarSparkジョブの結果を確認する
- 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 ...
- 投稿日:2019-08-11T00:46:46+09:00
Mac で「 ⌘⌥⇧⌃ (command, option, shift, control) 」の文字を入力する
大体のアプリケーションでは、
編集タブ → 絵文字と記号
という項目があるのでこれを使う。
なければ、別のアプリケーション(メモ
とか)を開いて入力し、コピペしてくる。開くと、カーソル近くに以下のような入力補助的なやつが出るはず。
あとは各記号の名前が分かれば検索できる。ということで以下に名前を挙げる。
⌘ : 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 で別物なので注意。
オワタ\(⌃o⌃)/