Diary

Diary

日々学んだことをアウトプットする場として初めてみました

ターミナル上での情報の見つけ方

ターミナル上での情報の見つけ方

ターミナル上で操作をしていて、「同じコマンドを何回もブラウザで検索している人」や「詰まった際に毎回ブラウザで検索しないと解決できない人」には参考になるかもしれません。

  • 誰のためのものか
    • ある程度基本的なコマンドを覚えた
  • 誰のためのものではないか
    • あんまりコマンドを使ったことがない人
  • 何が学べるか
    • ブラウザに戻らずターミナルだけで必要情報を検索できるようになる
    • man, type

目次

なお以降の例は次の環境で試したものです

$ cat /etc/os-release 
NAME="Ubuntu"
VERSION="20.04.2 LTS (Focal Fossa)"
...

$ uname -r
5.4.0-1038-raspi

manコマンド

オプションなどの細かい使い方がうる覚えなコマンドを、ターミナル上でぱぱっと検索したい時に使っています。

manコマンドとは

「指定したコマンドのマニュアルを表示させる」コマンドであり、マニュアルの略からmanとなっています。

その基本的な使い方は

# 調べ方
$ man コマンド
# iでカーソル下、kでカーソル上
# qで終了

です

必要な情報の探し方

コマンドによっては、man コマンドで大量の情報が出てくるので、必要なものを選択するためにgrepを使います

例えば、「列を並び替えるのにsortを使えば良いことは覚えていたが、数字での並び替えをどうすればいいか」を調べるには、以下のようにします。

$ man sort | grep num
...
 -n, --numeric-sort
  compare according to string numerical value
...

よって、-nのオプションをつけたら良さそうなことがわかります。

また、grepのマッチした前後N行も表示させるオプションとして、-A(前)、-B(後)、-C(前後)もよく使います。

man sort | grep key -A2

typeコマンド

基本的にはコマンドの存在チェックを行うコマンドである。

# コマンドが存在する場合
$ type ls
ls is aliased to `ls --color=auto`
$ type cd
cd is a shell builtin
$ type xargs
xargs is /usr/bin/xargs

# コマンドが存在しない場合
$ type lss
bash: type: lss: not found

複数コマンドの候補がある場合に、全て表示するには-aオプションをつけます

$ type -a ls
ls is aliased to `ls --color=auto`
ls is /usr/bin/ls
ls is /bin/ls

(cf) whichコマンド

同じく、コマンドの存在をチェックしてくれるコマンドにwhichがあります。 whichは以下のように、コマンドの存在する場所のパスを示してくれます。

$ which ls
/usr/bin/ls

(cf) whichコマンドとの違い

typeは何でも検索できるのに対し、whichはビルトインコマンドは検索できないという性質があります

$ type cd
cd is a shell builtin

$ which cd

また、type自身がビルトインコマンドなので、実際にターミナルで打って実行されるのはtypeの方の結果になります

# typeはシェルコマンド
$ type type
type is a shell builtin

# 実際にlsとして実行されるのはtypeの結果
$ type ls
ls is aliased to `ls --color=auto`
$ which ls
/usr/bin/ls

シェルコマンド「man」の使い方

シェルコマンド「man」の使い方

自分がターミナルに触れる機会が増えるにつき、manコマンドが便利だと思いましたのでその紹介をしたいと思います。

使い方がうる覚えなコマンドをターミナル上でぱぱっと検索したい時に使っています。

なお以降の例は次の環境で試したものです

$ cat /etc/os-release 
NAME="Ubuntu"
VERSION="20.04.2 LTS (Focal Fossa)"
...

$ uname -r
5.4.0-1038-raspi

manコマンドとは

「指定したコマンドのマニュアルを表示させる」コマンドであり、マニュアルの略からmanとなっています。

その基本的な使い方は

# 調べ方
$ man コマンド
# iでカーソル下、kでカーソル上
# qで終了

です

とういことは、manコマンドの使い方を調べるにはmanのmanをしてみたら良いであろうと考えられます

$ man man

MAN(1)             Manual pager utils 

NAME
       man - an interface to the system reference manuals

SYNOPSIS
       man [man options] [[section] page ...] ...
       man -k [apropos options] regexp ...
       man -K [man options] [section] term ...
       man -f [whatis options] page ...
       man -l [man options] file ...
       man -w|-W [man options] page ...

DESCRIPTION
       man  is  the  system's manual pager. ....

       The table below shows the section numbers of the manual followed by the types of pages they contain.

       1   Executable programs or shell commands
       2   System calls (functions provided by the kernel)
       3   Library calls (functions within program libraries)
       4   Special files (usually found in /dev)
       5   File formats and conventions, e.g. /etc/passwd
       6   Games
       7   Miscellaneous (including macro packages and conventions), e.g. man(7), groff(7)
       8   System administration commands (usually only for root)
       9   Kernel routines [Non standard]

       A manual page consists of several sections.
       ...

基本的な内容は

  • 名前の簡単な説明
  • 簡単な使い方
  • オプション

などが表示されます。その正確な内容はbashzshなどのバージョン(カーネルのバージョン)に依存しています

man(1)の(1)とは?

manコマンドや、そのほかの色々な説明を読んでいると各種コマンドの右側に(数字)となっているところがあると思います。例えばman(1)、ls(1)といった形です。

これは上のman manの結果の中の、DESCRIPTIONに記述されており、マニュアルページのセクション番号に対応するようです。

よく出てくるのは1,重要なのは1,2,3,7ぐらいかと思われます。

必要なオプションを見つけ出す

基本的にはman + grepの組み合わせで検索を行うことが多いです。

以下は、「並び替えをsortで行えることは覚えていたけど、数字順で並び替えるにはどのオプションを使えば良いかわからなかった」時に使ったコマンドです。

$ man sort | grep num
...
       -n, --numeric-sort
              compare according to string numerical value
...

よって、-nオプションをつけることにより数字でソートできることがわかります。

なお、grepコマンドのオプションで「マッチした文字列を含む行の前後N列を表示させる(-C3など)」、とかもありよく使っています。

1回は読んでみるべきコマンド

man,bash(zsh),typeコマンドや、他にもよく使うものなんかは1回調べてみると良いと思います

おわりに

せっかくターミナル上で作業しているのに、わからないコマンドが出てくるたびにブラウザに検索に戻るなんて時間の無駄ですよね(?)

みなさんがmanコマンドで効率的な検索を行ない、快適な生活が送れるようになったら幸いです

PCとAndroid端末間でadbコマンドを通じてファイルのやりとりを行う

PCとAndroid端末間でadbコマンドを通じてファイルのやりとりを行う

Requirements

  • Android側での設定が終わっていること koko206.hatenablog.com

  • adb(Android Debug Bridge)が使えること

    • ターミナルでadbコマンドが以下のように反応したら設定OKです
$ adb   
Android Debug Bridge version 1.0.41
Version 31.0.2-7242960
Installed as /Users/kokoichi/Library/Android/sdk/platform-tools/adb

global options:
....

Androidの端末に入ってみる

Android端末をPCに繋げた状態で、adb shellとターミナルで打つ

$ adb shell
hammerhead:/ $ 

hammerhead:/ $ ls
acct        d              etc              mnt          product   system
apex        data           firmware         odm          res       system_ext
bin         data_mirror    init             oem          sdcard    tombstones
bugreports  debug_ramdisk  init.environ.rc  persist      sepolicy  vendor
cache       default.prop   linkerconfig     postinstall  storage   vtc
config      dev            lost+found       proc         sys

Linuxみたいに沢山の設定フォルダなどが出てきた!

個人のデータなどは「sdcard」に入ってることが多いので、とりあえずその中を見てみる

hammerhead:/ $ cd sdcard/                                                                     
hammerhead:/sdcard $ ls
Alarms   Audiobooks  Documents  Movies  Notifications  Podcasts
Android  DCIM        Download   Music   Pictures       Ringtones

PCのフォルダ構成と似ていてなんとなくわかると思います

PC ⇨ Android にファイルを送る

PC側のターミナルで操作を行いたいので、以前の操作でAndroid shellにいる人はexitコマンドで抜けましょう

hammerhead:/sdcard $ exit

~ $

ファイルの送り方

以下のコマンドで実行します

adb push [ファイル名] [送りたい場所]

pushでPCから送り込むイメージです

# 例
$ adb push test.txt /sdcard/Download/
test.txt: 1 file pushed, 0 skipped. 0.0 MB/s (170 bytes in 0.004s)

Android ⇨ PC にファイルを送る

同じくPCのシェルから実行します

ファイルの送り方

以下のコマンドで実行します

adb pull [ファイル名(絶対PATH)] [保存したいPCの場所]

pullAndroidから引っ張ってくるイメージです

# 例「.」は現在のPCのパスって意味です
$ adb pull /sdcard/Pictures/Screenshots/Screenshot_20210720-104212_設定.png .
/sdcard/Pictures/Screenshots/Screenshot_202107..., 0 skipped. 8.3 MB/s (169364 bytes in 0.019s

基本的には「/sdcard/」以下のフォルダを触ることになるのかと思いますが、それ以外ではpermissionの変更が必要になるかもしれません。

おわりに

Android端末内でのパスを指定するときは見慣れないフォルダ名とかもあると思うので、Tab補完をうまく利用しつつ上手にやってください

PCとAndroidで通信を行う準備

PCとAndroidで通信を行う準備

この記事ではAndroidをいじるために必要なAndroid側の設定について解説していきます

(以下は自分の端末での見た目ですが、おおよその配置は変わらないと思います)

開発者モードになる

1. 「設定」のアプリの「デバイス情報」をクリック

f:id:kokoichi206:20210720122411p:plain


2. 一番下までスクロールし、「ビルド番号」の部分を7回くらいクリック

f:id:kokoichi206:20210720122615p:plain

USBデバッグをONにする

1. 「設定」アプリの中で「システム」の欄の中から「詳細情報」を開き以下のように「USBデバッグ」をONにする

f:id:kokoichi206:20210720123014p:plain

おわりに

以上がAndroid端末側での設定になります。

実際にAndroidをどのようにいじっていくかについては次回以降紹介できたらと思います。

FizzBuzz at ターミナル(ワンライナー)!

FizzBuzz at ターミナル!

FizzBuzzワンライナーでやってみる

FizzBuzzとは?

Wikipediaに説明は任せます(笑)

簡単にいうと、以下のような出力を目指します

1
2
Fizz
4
Buzz
Fizz
...
14
FizzBuzz
16
...

まず1から100までの数字を連続で出力する

seqコマンドを使用する

$ seq 100
1
2
3
...

5の倍数の処理

置換なのでsedを用いる

$ seq 100 | sed '5~5s@.*@Buzz@g'

.* は任意の文字列の0文字以上のパターンにマッチします

3の倍数の処理

$ seq 100 | sed '5~5s@.*@Buzz@' \
| sed '3~3s@[0-9]*@Fizz@'

[0-9]*で、任意の数字にマッチさせてます。

15の倍数のところの説明

ここがちょっとテクい(?)のですが、*は直前のパターンを0文字以上なので、0文字にもマッチします(0字マッチ)。

すでに5の倍数の処理を終えているので、15の倍数のところにはBuzzが入っていますが、BuzzのBの手前にマッチします。

そしてそのマッチしたものがFizzに置換されるので、結果としてFizzBuzzを得ます。

おわりに

結果をまとめておきます

$ seq 100 | sed '5~5s@.*@Buzz@' | sed '3~3s@[0-9]*@Fizz@'

0字マッチの部分はなかなか捉えるのが難しいと思います。以下の例なども参考にしてみてください。

$ echo abc | sed 's/b*/1/g'
1a1c1

linuxのコマンドでsortしてみる

linuxのコマンドでsortしてみる

主にsortコマンドの使い方となっています

設定

以下のような内容の記述されたファイルをソートしてみます(ちなみにファイルの内容のイメージは、左が乱数の下1桁で右がその出現回数です)

$ cat last_one 
0 978
1 1048
2 972
3 953
4 1007
5 980
6 1010
7 983
8 1081
9 988

ソートに使うkeyを選択する

まず第二項をキーとしてsortするには、keyを指定するオプション-k2をつけます

$ cat last_one | sort -k2
4 1007
6 1010
1 1048
8 1081
3 953
2 972
0 978
5 980
7 983
9 988

これだと、辞書型でのsortになってしまいます。

つまり、(左から)1桁目を比べてそれが同じなら2桁目を比べて、というsortの仕方です。

数字としての大きさでソート

普通の数字順で並び替えたければ、numberの-nオプションをつけます

$ cat last_one | sort -k2 -n
3 953
2 972
0 978
5 980
7 983
9 988
4 1007
6 1010
1 1048
8 1081

逆順でソート

逆順でソートするには、reverseの-rオプションをつけます

$ cat last_one | sort -k2 -n -r
8 1081
1 1048
6 1010
4 1007
9 988
7 983
5 980
0 978
2 972
3 953

ハイパス・フィルター/ローパス・フィルターの計算

ローパス・フィルターの計算

ラプラス変換の性質をあまり利用せず愚直にローパス回路の計算をしてみました

ローパスフィルター

設定

以下のような典型的なローパルフィルタ回路における、VoutとVinの比を計算する

f:id:kokoichi206:20210718221014p:plain

計算

上の回路図の電圧の動きに着目すると


V _ {in}(t) = \frac{1}{C}\int I(t)dt + V _ {out}(t)

である。 V _ {out}の部分は出力電圧を測定するのみで、電流は流れないと考えると、抵抗側にも I(t)の電流が流れるから V _ {out}(t) = RI(t)の関係が成り立ち、


V _ {in}(t) = \frac{1}{RC}\int _ {-\infty} ^{t} V _ {out}(t')dt' + V _ {out}(t)

を得る。

ここで、ラプラス変換


F(s) = \int_0 ^\infty f(t)e ^{-st}dt

の逆変換


\lim_{p\to \infty}\frac{1}{2\pi i}\int _ {c-ip} ^{c+ip}f(t)e ^{st}dt

を行うと、


\int V _ {in}(s)e^{st}ds = \frac{1}{RC}\int V _ {out}(s)\left(\int _ {-\infty} ^{t} e ^{st'}dt'\right)ds + \int V _ {out}(s)e ^{st}ds

となる。

さらに右辺第一項の t' 積分


\int _ 0 ^\infty e ^{st'}dt' = \left[\frac{1}{s} e ^{st'}\right] _ {t'=-\infty} ^{t'=t} = \frac{1}{s}e ^{st}

となる。(ここで t 積分が簡単に消えてs依存性に代わるところがラプラス変換のすごいところ!)

よって最終的に


\int V _ {in}(s)e ^{st}ds = \frac{1}{sRC}\int V _ {out}(s)e ^{st}ds + \int V _ {out}(s)e ^{st}ds

と変形できる。

中身を比較して(ラプラス変換してラプラス変換をすると元に戻るという性質より)


V _ {in}(s) = \left(\frac{1}{sRC} + 1\right)V _ {out}(t)

となる。

解釈

形式的に s = i\omega とすると、


\left|\frac{V _ {out}}{V _ {in}}\right| = \left|\frac{1}{\frac{1}{i\omega RC} + 1}\right| = \frac{1}{\sqrt{1+(\frac{1}{\omega RC}) ^2}}

が成り立つ。この関係式は


\left|\frac{V _ {out}}{V _ {in}}\right| \to 1 \quad (\omega\to 0) \
\left|\frac{V _ {out}}{V _ {in}}\right| \to 0 \quad (\omega\to\infty)

なので、確かにローパス(低周波数だけ通す)の役割を果たしている

ハイパスフィルター

ハイパスフィルターは典型的には下のような回路で与えられる

f:id:kokoichi206:20210718232237p:plain

ローパスの時と同様に計算を進めると


\left|\frac{V _ {out}}{V _ {in}}\right| = \left|\frac{1}{\frac{i\omega L}{R} + 1}\right| = \frac{1}{\sqrt{1+(\frac{\omega L}{R}) ^2}}

を得る

おわりに

今回回路図は、VSCodeの拡張機能(drawio)を用いて作成しました

f:id:kokoichi206:20210718234717p:plain