20201009のLinuxに関する記事は10件です。

手当たり次第IPv6を無効にしてみる

はじめに

最近は、いろんなサービスがIPv4, IPv6のいずれにも対応している。
今回そんなサービスたちをIPv4のみに限定してしまおう。

Apache(http)

/etc/httpd/conf/httpd.conf
#Listen 80
Listen 0.0.0.0:80

Apache(https)

/etc/httpd/conf.d/ssl.conf
#Listen 443 https
Listen 0.0.0.0:443 https

ssh

/etc/ssh/sshd_config

#AddressFamily any
AddressFamily inet

MySQL(v8)

/etc/my.cnf.d/mysql-server.cnf
[mysqld]
bind-address=127.0.0.1
mysqlx-bind-address = 127.0.0.1

PostgreSQL

pg_hba.conf
#host    all             all             ::1/128                 trust
host    all             all             127.0.0.1       255.255.255.255     trust
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Buildrootでラズパイ上のOBDなLinuxを開発するために必要そうなこと一覧

ホスト

$ sudo apt-get install build-essential 
$ sudo apt-get install ncurses-dev
$ sudo apt-get install flex
$ sudo apt-get install bison
$ sudo apt-get install python
$ sudo apt-get install unzip

menuconfig

make raspberrypi3_defconfig

でラズパイ3用のデフォルト設定に変更。ちなみに、

make list-defconfigs

ですべてのリストを見れる。 raspberrypi3_qt5we ってなんだ。

後はここを参考に

  • ビルド時のキャッシュの有効化
  • DHCPサーバからIPを取得できるようにする
  • SSHの有効化
  • ホスト名でSSHログインできるようにする

ELM327を使えるようにする

make linux-menuconfig

をしたら、

Device Drivers ->
    USB support -> 
        USB Serial Converter support
            USB_SERIAL_PL2303 (USB Prolific 2303 Single Port Serial Driver)

を有効化し、ドライバをイメージに含める。

後はお好きに

設定後はpythonでpython-obdしてみたり、menuconfigからQt5いれてみたり、煮るなり焼くなりご自由に!

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

スクールに通ってた頃の自分に教えてあげたいLinuxの便利なキーボード操作

この記事について

ポートフォリオの作成にあたって、フレームワークの学習ばかりでLinuxの勉強をあまりできていない方が多いのではないかと思います。

しかし、開発においてLinuxは密接に関わってきます。
そんなことも知らずにプログラミング学びたての頃は、Linuxでの効率性やLinuxの「L」も知らずに黙々とポートフォリオを作成していました。
そんな過去のスクールに通ってた頃の自分やこれから開発をしていこうという方のために、開発効率を上げるための便利なLinuxのキーボード操作を記した記事となっております。

環境

・Mac
・CentOS
・bash

カーソルキーを使わずにカーソルを移動させる

Linuxと打つはずがLinxと打ち間違えた時、← →(カーソルキー)を使ってカーソルを移動させたいよね?
しかし、カーソルキーというのは右下の方にあって、ホームポジションから大きく外れてしまってるのでスムーズにカーソルを移動させることができない。

$ echo Linx

そんな時はctrl + f or bでカーソルを移動させる。

コマンド 説明
ctrl + f foward【カーソルを前に(右に)】
ctrl + b back【カーソルを後ろに(左に)】

カーソルを最初・最後に移動する

こんな馬鹿みたいに長いコマンドの一番最後や最初まで1文字ずつカーソルを戻していくのがめんどくさいそこの奥さん!!!!便利なコマンドがこちらです!!!

$ git log --graph --format=format:'%C(bold blue)%h%C(reset) - %C(bold green)(%ar)%C(reset) %C(white)%s%C(reset) %C(bold white)— %an%C(reset)%C(bold green)%d%C(reset)' --abbrev-commit --date=relative --all
コマンド 説明
ctrl + a カーソルを最初に移動させる
ctrl + e カーソルを最後に移動させる

カーソルを1単語単位で移動させる

時には一単語ずつカーソルを移動させたいわよね!!!

コマンド 説明
option + 右へ移動
option + 左へ移動

入力した文字を一文字削除する

入力した文字をbackspaceで削除するのもいいけど、このキーを使うためにはホームポジションから大きくずれてしまう。だからそんな時には、、、

コマンド 説明
ctrl + h カーソル位置の後ろの文字を削除
ctrl + d カーソル位置の文字を削除

入力した文字を一単語単位で削除する

一文字ずつではなく、一単語単位で削除する

コマンド 説明
ctrl + w 一単語単位で削除

カット(全切り取り)とヤンク(ペースト)

コマンド 説明
ctrl + k カーソル位置から行末までを切り取る(カット)
ctrl + u カーソル位置から行頭までを切り取る(カット)
ctrl + y 最後に切り取った内容を貼り付ける(ヤンク)

コマンド履歴

過去に入力したコマンドをもう1度使いたい時に使える

コマンド 説明
↑キー 一つ前のコマンド履歴へ
↓キー 次のコマンド履歴へ(コマンド履歴を過去からみている時に)
ctrl + r 履歴を検索する

ctrl + r の例

過去に使用した同じコマンドを検索する時
ctrl + rを押す
②使いたいコマンド名の一部を入力(今回の場合はecho
③見つかればEnterでそのコマンドを実行する

(reverse-i-search)`': 

↓

(reverse-i-search)`echo': echo hello world

補完機能

echoってコマンドを打つ時に、最後まで入力するめんどくさくね?
そんな時はTabキーを押してやると残りの文字を補完してくれる

$ ec → Tabキーを押すと

$ echo → 残りの「ho」を自動で補完してくれる

最後に

いきなり全ての操作を覚えることは難しいので、何かしたの操作で「あれ?この操作すんのめっちゃめんどいねんけど。。。」って思ったら、大体解決することができると思うので、ぜひこちらの記事であったり自力で調べて開発の効率をドンドン上げていってください。

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

AzureAppServiceのWebシステムをWindowsからLinuxに乗せ換えた話

概要

AzureのAppServiceにて自作Webサイトの運営を行っていたのですが、カスタムドメインやSSLバインディングをするためには月約7000円程度のプランを選択する必要があり、収益の見込めないシステムには少し高いな~と思っていたところ、Linuxであればもう少し安く済むことを知り、乗せ換えることを決意。

以下、自作Webサイトの構成

フロントエンド Vue.js
バックエンド .Net Core 3.1(C#)
データベース SQLServer
CI/CD AzureDevopsPipelines
SSL証明書 Let’s Encrypt
その他使用サービス BlobStorage、SendGrid

AppServiceの「Windows」と「Linux」の違い

とりあえず出来るかどうかはわからないけど、一回作ってみよ~ってことで、AppService(Linux)を作成してみた。
ちらちら~っと中身を見たところ、以下の機能がLinuxだと使用できない。

  • Application Insight
  • Webジョブ
  • MySql in App
  • アプリの複製
  • 拡張機能
  • App Service Planの種類が少ない

拡張機能が使えない。。。
ということは、「Let's Encrypt」の導入は手動でやらなければいけないのか。。。
波乱の予感。。。(Windows版であれば拡張機能の「Azure Let's Encrypt」を使用して楽に適用できた)

何はともあれやってみる

とりあえずサービスは作成したので、ソースをデプロイして、構成情報設定してなんなく起動はできた。
カスタムドメインの設定方法もWindowsの時と変わらないので、特に困ることもなく完了。

ということで、最後の難関、手動での「Let's Encrypt」によるSSL証明書の取得

Certbotのインストール

該当のAppServiceにSSH接続(Azureポータルから可能)し、以下のコマンドを実行

$ apt-get update
$ apt-get install certbot

これでCertbotがインストールされているはず。

証明書の発行

Certbotを使用して証明書の発行を行います。
先度と同じように、SSHにて以下のコマンドを実行

certbot certonly -d <ドメイン> --manual --preferred-challenges dns

「--preferred-challenges dns」の部分は、認証方式の選択。

今回はDNSチャレンジという、証明書を取得したいドメインにTXTレコードを追加することで認証を行うことにした。
(他にも特定の場所にファイルを配置して参照させるHttpsチャレンジなどがある)

コマンドを進めていくと、途中で「DNSにこの値を使用してTXTレコード作れ」みたいな指示がでるので、指示に従う。
TXTレコード作成しても5分くらいは反映されないと思うので、以下のコマンドで反映されていることを確認してから次に進むこと。

nslookup -q=TXT [ドメイン]

以下のような文字列が表示されれば成功です。

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/[ドメイン]/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/[ドメイン]/privkey.pem
   Your cert will expire on <some-date>. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot
   again. To non-interactively renew *all* of your certificates, run
   "certbot renew"
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

プライベート証明書の作成

Let's Encryptから取得した中間証明書等を使用し、プライベート証明書を作成。

$ mkdir /tmp/sandbox -p
$ cd /tmp/sandbox

$ SOURCE=/etc/letsencrypt/live/[ドメイン]
$ sudo cp $SOURCE/{cert.pem,privkey.pem,chain.pem} .

$ sudo chown ope *.pem

$ openssl pkcs12 -export -out certificate.pfx -inkey privkey.pem -in cert.pem -certfile chain.pem

最後のopensslコマンドを実行した際に、パスワードの設定を要求されるので入力。
ここで入力したパスワードは、AppServiceに証明書を登録する際にも要求されるので覚えておくこと。

AppServiceへの設定

作成されたpfxファイルをダウンロードし、AppServiceのカスタムドメインから対象のドメインにSSLバインディング。
これで作業は完了!

終わりに

企業等で運用する場合には、ApplicationInsightとか分析ツール使えると便利ですが、個人運営の小規模サイトであればLinuxでいいかなぁ~と個人的には思いました。
Linuxサーバーで.NetCore動作させるのってどうなんやろ。。。って思っていたけど、案外普通に動いてて良かったです。
(ただ、Windowsに比べて多少の動作のもっさり感を感じました。気のせい?)

Windowsサーバーだと月約7000円だったのが、Linuxサーバーだと月約2000円!!
これならもう幾つかサーバ立ち上げてWEBサービス作ってもいいかなぁ~と考える今日この頃。

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

オレオレ証明書の警告をChromeで表示させないようにする

目的

オレオレ証明書の警告をChromeで表示させないようにする。
ドメインは ore.example.com とする。

手順

ホスト側の hosts 変更

以下の設定を追加する。※Windows10の場合

/C/Windows/System32/drivers/etc/hosts
127.0.0.1 ore.example.com

SSL証明書を作成

秘密鍵を作成

openssl genrsa -out ore.example.com.server.key 2048

証明書署名要求(CSR Certificate Signing Request)を作成

openssl req -new -key ore.example.com.server.key -out ore.example.com.server.csr

Country Name (2 letter code) [AU]:JP
State or Province Name (full name) [Some-State]:Tokyo
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or Your name) []:ore.example.com
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

SAN値を設定

ドメインはワイルドカードにしている。※ore.example.com にすると動かなかった
IPはホストのローカルエリアネットワークのIPアドレスにしている。※適宜変更

echo "subjectAltName = DNS:*.example.com, IP:192.168.xxx.xxx" > san.txt

サーバ証明書を作成

openssl x509 \
  -req \
  -sha256 \
  -days 3650 \
  -signkey ore.example.com.server.key \
  -in ore.example.com.server.csr \
  -out ore.example.com.server.crt \
  -extfile san.txt

(オプション)サーバ証明書を確認

openssl x509 -in ore.example.com.server.crt -text -noout

オレオレ証明書を Chrome に登録する

  1. Chrome の設定を開く。
  2. プライバシーとセキュリティメニューのセキュリティを選択する
  3. 証明書の管理を選択する(設定ボックスが表示される)
  4. 設定ボックスでインポートをクリックする
  5. 説明の画面で次へをクリックする
  6. さきほど作成したore.example.server.crtファイルを選択して次へをクリックする
  7. 証明書ストアを 信頼されたルート証明機関 に変更して次へをクリックする
  8. 最終確認画面で完了をクリックする
  9. セキュリティ警告が出る場合ははいをクリックする
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

VMware で Arch Linux をインストールするまで

はじめに!

自分が実際にVMwareでArch Linuxインストールするとき、他サイトの記事だと分かりづらかったりしたので、まとめてみました。
分かりやすくまとめたので、初めての人はもちろん、途中で諦めてしまった人も再度挑戦していただければ幸いです。

VMwareの環境構築の方法の掲載していますので、分かる方は次に進んでください。
VMware Workstation Player は最新バージョンにしてください。
これをやらないと仮想環境が起動できませんでした。

向いてる人たち

  • 最小パッケージからLinuxを構成してみたい!
  • 最近はパッケージが複雑化し、なんか重たいと感じている
  • 何となくオートよりもマニュアル派だ!
  • UbuntuやCentOSに飽きた...
  • 自作PCのカスタマイズは愛だ
  • 私はVim派です。(俺はnano派なんだけど。ふざけんな!!! って人も安心してください。入ってます。)

そもそもArchLinuxってなんぞや?

archlinux-logo-dark-90dpi.png

Linuxと名前にある通りLinuxディストリビューションの1つで、Linux の中でも特にカスタマイズ性に優れている魅力がありますが、選択肢を多くさせインストール手順を難しくするなど、基本的に初心者向けではなくコマンドや設定ファイルを触ることに慣れた人向けのディストリビューションです。

自分の環境

  • OS: Windows10 Pro 64ビット (Version 2004)
  • CPU: Intel Core i7-6700
  • メモリ: 16GB

インストールするアプリなど

  • VMWare Workstation 15 Player
  • TeraTerm

前提条件

あくまで私の好みでパッケージがいろいろ入っています。随時追加、削除してください。

  • ブートローダに grub を使います。
  • GUIのインストール方法は記載していません。あくまでインストール完了までです。

今回は VMware を使うので、BIOS や UEFI の項目にある(ない場合もあります)
Intel Virtualization Technology (VT-x) の設定を有効化してください
分からない方は以下を参考にしてください。

Google検索

あと、WMware Workstation Player はすでにインストールされているものとします。
入っていない方は以下を参考にしてください。

VMwareのインストール

イメージファイルのダウンロード先

イメージファイル (mirror.archlinuxjp.org)

bandicam 2020-10-09 15-53-01-996.jpg

このisoを選択してダウンロード!

1. VMware で仮想環境の構築

ここの部分が分かる方は無視してください!
VMwareの インストールが完了したら、起動してください。

新規仮想マシンの作成(N)をクリック

キャプチャ.PNG

インストーラディスクイメージファイルにさっきダウンロードしたArch Linuxのイメージを指定する

キャプチャ1.PNG

ゲストOSを「Linux」バージョンを「その他の Linux 5.x 以降のカーネル(64ビット)」にする

キャプチャ2.PNG

今回は、「Arch Linux」という名前にします。場所を指定したい場合は変更してください。

image.png

今回は、ディスクの容量を20Gに指定します。いっぱいお触りしたいときは増やしましょう。

キャプチャ4.PNG

よしっ!完了! じゃなくてこれで環境構築は終了ではありません。
ハードウェアをカスタマイズしましょう。

キャプチャ5.PNG

メモリ、プロセッサ数を増やしてください。
ネットワークアダプタを「ブリッジ」にしてください。できたら次に進んでください。

キャプチャ6.PNG

2. efiの設定

まだ起動しないでください!!!
Arch Linuxくんは無愛想なので まだ設定があります。

仮想環境があるディレクトリを開いてください。
キャプチャ7.PNG

拡張子が「.vmx」のファイルをメモ帳などで起動してください。
以下に追記して、保存はまだしないでください。約束です。
Ctrl + Shift + S を押してください

firmware = "efi"

キャプチャ10.PNG

必ず文字コードを「UTF-8」から絶対に「ANSI」にしてください。
文字化けして開けなくなります。
キャプチャ11.PNG

これで設定は完了です。

3. 仮想環境の起動と構築

それでは構築した仮想環境を起動しましょう。

ここで、この画面になっていたらefiの設定ができていません。上にある設定を行ってください。
キャプチャ14.PNG

この画面になっていればefiの設定ができているので、このまま進めてください。
キャプチャ13.PNG

なにもエラーがなく起動したらこの画面になります。
それではArch Linuxくんは無愛想なので 設定していきましょう。
bandicam 2020-10-09 13-41-52-460.jpg

キーマップの設定

おそらくほとんどの方が日本語キーボードを使用していると思います。(US配列の人、ごめんなさい)
ArchLinuxを始め、ほとんどのLinuxはUS配列のキーボードを使用しているため、まず日本語配列用のキーボードレイアウトに設定します。

# loadkeys jp106

ping で通信確認

大抵の場合、ネットワーク接続は確立されているはずですが、念のため確認します。

# ping -c 4 archlinux.jp

rootパスワードを設定

これは、SSHで一時的につなぐものだけなので、簡単なパスワードを推奨します。私は「a」にしました。

# passwd

SSHで接続

仮想マシンにコマンドを打っていくのはつらいのでSSH経由で操作します。sshdを起動して、ipアドレスを確認します。

SSHデーモンの開始
# systemctl start sshd

IPアドレスの確認
# ip a

確認すると私の環境では「ens33」で、IPアドレスは「192.168.1.36」でした。
bandicam 2020-10-09 13-49-26-109.jpg

時刻設定

公式マニュアルに最初に時刻設定を推奨しているので設定します

# timedatectl set-ntp true

4. パーティションの作成

ライブ環境によって認識されたディスクには /dev/sda や /dev/nvme0n1 などのようにブロックデバイスが割り当てられます。
デバイスを確認するには、lsblk または fdiskコマンドで確認してください。
efi起動なのでGPTでパーティショニングをしていきます。
このコマンドでgdiskが起動します。

# gdisk /dev/sda

まずは、 「 o 」でGPTのパーティションテーブルを作成します
この作業で既存パーティションは全て削除されます

Command (? for help):o
This option deletes all partitions and creates a new protective MBR.
Proceed? (Y/N): y

パーティションは、Arch Linuxのインストールガイドを参考にしています。
今回のパーティショニングは以下の通り設定します。

パーティション 容量
ESP (EFI Syeten Partition) 512M
swap パーティション 1GB
データパーティション 残り容量全て

ESPとはUEFIブートの際に推奨されているFAT32でフォーマットされているパーティションです。
swapとはパソコン使用時に複数のタスクを立ち上げメモリが不足した場合に、ディスクの一部の領域をメモリの代わりとして使う容量です。
残りの領域は全てデータ領域(root、homeディレクトリなど)として作成します。

Command (? for help):n
Permission number: 1
First sector : 何も押さずエンター
Last sector : +512M
Hex code or GUID : EF00

Command (? for help):n
Permission number: 2
First sector : 何も押さずエンター
Last sector : +1G
Hex code or GUID : 8200

Command (? for help):n
Permission number: 3
First sector : 何も押さずエンター
Last sector : 何も押さずエンター
Hex code or GUID : 8300

最後に W を指定してパーティションを切ります。
このままでは使用できないため、次に各パーティションをフォーマットします。

Command (? for help):W
Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!

Do you want to proceed? (Y/N): y
OK; writing new GUID partition table (GPT) to /dev/sda.
The operation has completed successfully.

各パーティションをフォーマット

ESP パーティションのフォーマット

UEFI ブートパーティションは、FAT32でフォーマットする必要があるため mkfs.vfat コマンドを使用します。

# mkfs.vfat -F32 /dev/sda1

Linuxファイルシステム(ext4)のフォーマット

フォーマットを行うためのコマンドは、mkfs.ext4 コマンドを使用します。

# mkfs.ext4 /dev/sda3

スワップの作成と読み込み

Linuxでスワップ領域を作成するためには、mkswap コマンドを使用します
作成したスワップ領域を実際に使用するため、swapon コマンドで設定できます。

# mkswap /dev/sda2
# swapon /dev/sda2

ちゃんとフォーマットできたか確認

lsblk コマンドを使用して、フォーマットできたか確認します。

# lsblk

このようになっていればOKです。

bandicam 2020-10-09 14-01-30-866.jpg

パーティションのマウント

次に、フォーマットしたパーティションのマウントをします。

まずルートディレクトリをマウントします
# mount /dev/sda3 /mnt
ディレクトリを作り、ESPを /mnt/boot にマウントします
# mkdir /mnt/boot
# mount /dev/sda1 /mnt/boot

マウントが完了すればいよいよシステムのインストールをしていきます!あともう一息!

5. システムのインストール

ミラーリストの編集

ここからベースシステムのインストールをしますが、パッケージをダウンロードするためにサーバーに接続します。
各国にいくつかのミラーがあり、デフォルトのままではダウンロードが長時間かかることがあるので日本のサーバーを選択します。
ミラーリストは /etc/pacman.d/mirrorlist に保存されていて、先頭から優先してサーバを使うようになっているので、このファイルを編集します。

使いたいエディタを使って編集しましょう。

# nano /etc/pacman.d/mirrorlist

開けたら、このテキストをこの位置に追加してください。

/etc/pacman.d/mirrorlist
Server = http://mirror.archlinuxjp.org/$repo/os/$arch

bandicam 2020-10-09 14-32-48-469.jpg

nano の場合

Ctrl + O で書き込み
Ctrl + X で終了

vim の場合

i で挿入モードに入る
Esc で挿入モードを終了
:wq で終了

ベースシステムのインストール

ミラーリストが編集できたら、次はベースシステムをインストールしていきます。
Linux ベースと以下のものをインストールします。適時追加や削除をしてください。

  • vi
  • vim
  • nano
  • wget
  • man-db
  • man-pages
# pacstrap /mnt base base-devel linux linux-firmware btrfs-progs intel-ucode vi vim nano dosfstools efibootmgr openssh dhcpcd netctl ccache zsh zsh-completions zsh-syntax-highlighting wget man-db man-pages screenfetch

ダウンロードしている様子
bandicam 2020-10-09 14-34-40-794.jpg

fstabの作成

fstabとは、パーティションやファイルシステムの情報やなどがどこにmountされているかなどを保存するためのものです。
genfstab で現在マウントされているパーティションを検索し、適切な値を書き込むことができます。

# genfstab -U -p /mnt >> /mnt/etc/fstab

6. Arch Linux のシステム設定

ここからはインストールした Arch Linux のシステム内に入り、各種設定をします。

先ほどインストールしたArch Linuxのシステムは /mnt に入っているので、ルートを /mnt にします。
mnt をルートディレクトリとして扱うのが chroot コマンドです。

# arch-chroot /mnt /bin/bash

言語、キーマップの設定

Linux 上で使う言語を設定します。
今回は ja_JP と デフォルトとして en_US (英語) は必須なので指定します。
キーマップの設定方法は、/etc/locale.gen ファイルから使う言語の先頭の # を削除して、使用する言語を選択できます。

# nano /etc/locale.gen
  • en_US.UTF-8 UTF-8
  • ja_JP.UTF-8 UTF-8

この2つの最初の # を削除して保存してください。

次に、次のコマンドを実行してロケールを生成します。

# locale-gen

2とも done と表示されれば完了です。
bandicam 2020-10-09 14-47-57-676.jpg

locale.conf ファイルを作成

この段階で日本語設定をしてしまうと文字化けしてしまうことがあるので、ここでは日本語設定は行わずに英語のままにします。

# echo LANG=en_US.UTF-8 > /etc/locale.conf

キーマップの設定 (US配列の場合は無視)

インストールした Arch Linux 上のコンソールのキーボード配列はデフォルトで英語配列になっているため、以下の設定ファイルでキーボード配列を指定します。
日本語キーボードを使用している場合は /etc/vconsole.conf ファイルに KEYMAP=jp106 の内容を書き込んでください。
US配列の場合はこのコマンドは無視してください。

# echo KEYMAP=jp106 > /etc/vconsole.conf

エリア設定

日本在住の場合は以下のコマンドを叩いてください。

# ln -s /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

時刻設定

ハードウェアクロックをUTCに設定します。

# hwclock -u -w

Hostnameを決める

HostnameとはインストールするLinuxの名前です。
好きな名前を「 /etc/hostname 」に書き込んでください。
今回は、Hostnameを arch にします。

# echo arch > /etc/hostname

/etc/hosts も同じように YOUR_HOSTNAME を削除して編集してください。

# nano /etc/hosts

bandicam 2020-10-09 14-50-55-790.jpg

次にrootのパスワードを設定します。
これをやらないとインストールができてもログインできません

# passwd

デーモンを自動的に有効化させる

デーモンを起動時に有効化するには、このコマンドを入力してください。

# systemctl enable sshd
# systemctl enable systemd-networkd
# systemctl enable systemd-resolved
# systemctl enable dhcpcd.service

7. ブートローダーの設定

Arch Linux を起動するために Linux に対応しているブートローダーを選択してインストールする必要がある。
今回は GRUB を使います。

# grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=arch_grub --recheck --debug
# grub-mkconfig -o /boot/grub/grub.cfg

これでインストール作業は完了です!お疲れ様でした。

8. システムの再起動

実際に動くかどうか確かめるために再起動しましょう。

# exit
# reboot

再起動してこの画面が出ればインストールができてる証拠です!
bandicam 2020-10-09 15-31-41-230.jpg

ログインできたら、早速 screenfetch コマンドを打ってみよう!!!

aキャプチャ.PNG

ああ...美しい...これぞArchLinux。漢のロマン

参考文献

Arch Linux公式ページ
ArchLinux インストールガイド
Arch LinuxをVMware Fusionにインストールする方法[ベースシステムインストール編]
VMwareにArch Linuxをインストールしよう
Arch Linux インストール俺々式完全版
makoのノート - Arch Linuxの初期設定
さくらのナレッジ - rch Linuxを簡単インストール – 「楽しいさくらのクラウド」(17)
クロの思考ノート - Arch Linuxを使ってみた
テックメモ - Arch Linux 初期設定
ログインが楽しくなる!screenfetchを使ってCentOSで遊んでみた
Windows:「VMware Workstation 15 Player」を使う

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

Arch LinuxでZoomにOBSの映像を配信する

TL;DR

  • Arch Linux上で仮想カメラデバイスを作成します.
  • OBSで映像キャプチャや画面キャプチャを1つの映像に合成します.合成映像をOS上の仮想カメラに流します.
  • 仮想カメラの映像をZoomのカメラデバイスとして設定し,配信します.
    • Zoomに限らず,DiscordやGoogle Meetなどのカメラ出力をする場合に利用できます.

準備

  • Arch Linux(ubuntu等の他のディストリビューションでも可能です)
    • Windowsでは手順が異なります.
  • OBS Studio
  • Zoom(カメラ入力ができればなんでもよい)

セットアップ

仮想カメラのセットアップ

v4l2loopbackを使って仮想カメラをセットアップします.
以下AURヘルパーであるyayを使ってインストール作業を行っています.他のディストリビューションではパッケージ名等が異なる可能性があります.

まず,以下のパッケージをインストールします.

$ yay -S v4l2loopback-dkms

標準カーネルを使っている場合はカーネルヘッダーファイルをインストールして,カーネルモジュールをコンパイルする必要があります.

$ yay -S linux-headers

v4l2loopbackモジュールを読み込みます.video_nr=42はデバイス番号を指定します.exclusive_caps=1を指定すると,Google Chrome等のブラウザ上で仮想カメラが認識されます.

sudo modprobe v4l2loopback video_nr=42 devices=1 exclusive_caps=1

モジュールが読み込めたら以下の手順で確認します.video42が作成されていればOKです.

$ ls /dev | grep video
video42

$ v4l2-ctl --list-devices
Dummy video device (0x0000) (platform:v4l2loopback-000):
    /dev/video42

設定の永続化

カーネルモジュールの読み込みを起動時に行いたい場合は設定ファイルに書き込んでおきます.

/etc/modprobe.d/v4l2loopback.conf
options v4l2loopback video_nr=42 devices=1 exclusive_caps=1
/etc/modules-load.d/modules.conf
v4l2loopback

OBSのセットアップ

OBSをインストールします.また,OBSの映像をv4l2に流し込むためのプラグインもインストールします.
obs-studioはcommunity版もありますが,ブラウザ機能がないため,必要があればGit版をインストールします.詳細はこちらの記事を参照ください.

$ yay -S obs-studio obs-v4l2sink

プラグインがインストールされた状態でOBSを起動すると,メニューのツールタブ下にv4l2sinkの選択肢が増えています.
設定を開くと以下のスクリーンショットのような画面が表示されるので,Device Path/dev/video42を指定して,Startをクリックします.

2020-10-09_152124_667388197.png

Zoomのセットアップ

Zoomを使って仮想カメラのテストをします.AURからインストールできます.

$ yay -S zoom

Zoomを起動して,適当にミーティングを開始します.
そのまま自分のカメラ映像を設定してもよいですが,今回は画面共有時に仮想カメラを指定して表示してみようと思います.
画面共有のウィンドウを選択する際に,AdvancedのタブからContent from 2nd Cameraを選択します.
他のカメラが接続されている場合は,左上に表示されるSwitch Cameraをクリックして仮想カメラに切り替えます.

2020-10-09_152459_389006401.png

OBSの画面を流せるので,ソースやシーンを活用すれば通常の画面共有よりも高度なことができるようになるかと思います.

参考

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

【Linux】psコマンドでCPU使用率を表示する、ヘッダーを表示する、grepのプロセスを表示しない方法

概要

OS内部で現在実行されているプロセス一覧を表示するpsコマンドについて、
タイトルの3つの方法を調べたので、備忘の意味でまとめておく

psコマンドでCPU使用率を表示する

ps auxコマンドを使用する。%CPUの列の数値がCPU使用率を表示している

[oracle@user]$ ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  1.0  0.1  19400  1532 ?        Ss   18:37   0:00 /sbin/init
root         2  0.0  0.0      0     0 ?        S    18:37   0:00 [kthreadd]

CPU使用率の高い順にソートする場合は 
ps aux --sort -%cpu

[oracle@user]$ ps aux --sort -%cpu
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root      2248  1.2  2.4 113448 24728 tty1     Ss+  18:37   0:02 /usr/bin/Xorg :
oracle    2493  0.4  2.3 543792 23932 ?        S    18:38   0:00 nautilus
root         1  0.3  0.1  19400  1532 ?        Ss   18:37   0:00 /sbin/init

ヘッダーを表示する

psコマンドの結果をgrepでソートすると、ヘッダーが表示されなくなってしまう。
head -1 を追記することで、ヘッダーを表示する。

[oracle@user]$ ps aux | head -1 && ps aux | grep bash
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root      2029  0.0  0.0 108212   900 ?        S    18:37   0:00 /bin/bash /usr/sbin/ksmtuned
oracle    2796  0.0  0.1 108352  1936 pts/0    Ss   18:38   0:00 /bin/bash

grepのプロセスを表示しない

grepコマンドを使用したときに、[ ] 角括弧(かくかっこ)を利用して
grep自身がpsコマンドで出力されないようにする

#何もしないとgrep自身が表示される
[oracle@user]$ ps aux | grep bash
root      2029  0.0  0.0 108212   900 ?        S    18:37   0:00 /bin/bash /usr/sbin/ksmtuned
oracle    2796  0.0  0.1 108352  1936 pts/0    Ss   18:38   0:00 /bin/bash
oracle    2903  0.0  0.0 107500   892 pts/0    S+   18:48   0:00 grep bash

#角括弧をつけるとgrep自身は表示されなくなる
[oracle@user]$ ps aux | grep [b]ash
root      2029  0.0  0.0 108212   900 ?        S    18:37   0:00 /bin/bash /usr/sbin/ksmtuned
oracle    2796  0.0  0.1 108352  1936 pts/0    Ss   18:38   0:00 /bin/bash
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

冷やかしで作った翻訳コマンド(TUI)が便利過ぎるのでガチ使い!

GAS をラップした翻訳ツール (TUI command) を Go 言語で書きました。
tran_1.gif

対象読者

以下に該当する方にとっては読む価値があるかもしれません。

  • 英語(や他の外国語)が苦手で翻訳ツールが手放せない
  • ターミナルで作業する時間が長い
  • translate-shell よりシンプルで視認性の良いコマンドを探している
  • GAS (Google Apps Script) に興味がある
  • Golang (Go 言語) の TUI ツールの実装に興味がある

目次

1. はじめに

英語が苦手な僕は、ドキュメントを読むときも書くときも、辞書サイトや翻訳サイトが手放せません。
普段、ターミナルで作業をすることが多いんですが、Web ブラウザとターミナルソフトの間を行ったり来たりしているので、それはそれはストレスが溜まります。

そんなある日、GAS (Google Apps Script) を触ったことがなかった僕は、後学のためにちょっと試してみようと思い、LanguageApp をラップしたお手軽翻訳コマンドを作ってみたんです。

最初は洒落で作り始めたつもりだったんですが、意外にもこれが便利に使えることがわかったので、記事にして紹介したいと思います。

コマンドは以下のリポジトリで公開しています。

類似するものに translate-shell というツールがあります。使っている方も多いと思いますが、本稿の後半で go-tran と translate-shell の違いについても触れています。

2. go-tran の概要

対応OS

Linux と Windows で動作確認しています。
(Mac でも動くと思います)

対話型インターフェス

tran コマンドを引数なしで実行すると、対話型シェルが起動します。

翻訳する

デフォルトでは、実行環境のカレント・ロケールの言語へ翻訳されるので、あとは翻訳したい外国語を入力するだけです。
以下は、英語、フランス語、イタリア語、スペイン語、韓国語、中国語を日本語へ翻訳する例です。
tran_1.gif
上記画像ではプロンプトが :ja> となっています。
これは (Source):(Target)> の形式になっていて、変換元 (Source) の言語が自動 (Auto) で、変換先 (Target) の言語が日本語 (ja) という意味です。例えば、日本語から英語へ翻訳する場合は ja:en> と表示されます。

言語を切り替える

変換先の言語を切り替えるには、2 桁の言語コード (ISO639-1) を入力します。
以下は、ターゲットの言語を切り替えながら、日本語を英語 (en)、フランス語 (fr)、イタリア語 (it)、スペイン語 (es)、韓国語 (ko)、中国語 (zh) へ翻訳する例です。
tran_2.gif

言語コードが分からない場合

言語コードが分からない場合は l (エル) コマンド (l: Language codes) で調べられます。

l コマンドは、入力した文字列が ISO639-1 コードと同じか、ISO 言語名称 (英名) に部分一致したものの一覧を表示します。どちらにも引っかからなかった場合は、内部で英語に変換してから再検索をかけるため、例えば日本語で入力した名称でも、目的の言語コードを比較的簡単に見つけることができます。

以下は「 l コマンドで "nor" を含むもの、"nese" を含むもの、"ドイツ語"、"クルド語"、"ズールー語" を検索し、その一覧は表示できたが、"カンブリア語" は見つからなかった」という例です。
tran_3.gif

バッチ・インターフェス

コマンドライン引数にファイル名を指定したり、コマンドの標準入力へパイプやリダイレクトで繋いだ場合はバッチ・コマンドとして実行されます。

ファイルの指定

引数にファイルのパス名を渡して go-tran を実行すると、そのファイルを翻訳してくれます。これも変換先の言語(デフォルト値)は実行環境のカレント・ロケールにより決まります。
tran_5.gif

パイプやリダイレクト

標準入力がターミナルではない場合、go-tran はバッチモードで実行されます。

例えば、僕の Ubuntu 環境は man が日本語で表示されるようになっているのですが、日本語のマニュアルが用意されていないコマンドもあります。普段あまり使わないコマンドほど日本語化されていなかったりしますよね。これまでは、知らない英単語に出くわしたときはわざわざ Web ブラウザを開いて調べていました。

でもこれからは man を go-tran にリダイレクトするだけで済みます。
tran_4.gif

3. go-tran の使い方

インストール

Go の環境がある場合

install go-tran
$ go get github.com/y-bash/go-tran
$ cd $GOPATH/src/github.com/y-bash/go-tran
$ go install ./...

Go の環境がなく、ソースコードのみ取得する場合

get source code
$ git clone https://github.com/y-bash/go-tran.git

もし、Go の環境はないけどバイナリを使ってみたいという方がいたら、方法を考えますので、気軽に声をかけてくださいね。

対話型で使う

起動する

実行ファイルは tran という名前です。

$ tran
Welcome to the GO-TRAN!
...

コマンドの説明

入力した文字は概ね以下のように判断されます。

文字列 説明
1 文字 コマンドとして判断。
2 文字 Target 言語の切り替え。
3 文字以上 入力したテキストを現在のモードに従って翻訳。

コマンドの種類は以下のとおりです。

コマンド 説明
h ヘルプを表示します。
l [str] 言語コードと名称の一覧を表示します。
(言語コードは ISO639-1)
  • str を指定した場合
    マッチする言語コードの一覧を表示
  • str を省略した場合
    すべてのコード (184 件) を表示
  • コード、名称に "en" を含むもの
    l en
  • 名称に "nor" を含むもの
    l nor
  • 名称に英名 "Welsh" を含むもの
    l ウェールズ語
s [str] 変換元の言語 (Source) を切り替えます。
  • str を指定した場合
    マッチする言語へ切り替え
  • str を省略した場合
    Auto (自動モード)へ切り替え
    ※通常は Auto で問題なし
  • 英語へ
    s en
  • スペイン語へ
    s spanish
  • ポルトガル語へ
    s ポルトガル語
  • Auto(自動モード) へ
    s
[t] code

t [str]
変換先の言語 (Target) を切り替えます。
  • t を省略した場合
    2 桁のコード (ISO639-1) で
    指定した言語へ切り替え
  • t の後に str を指定した場合
    マッチする言語へ切り替え
  • t の後の str を省略した場合
    実行環境のカレント・ロケール
    へ切り替え
  • カレント・ロケールへ
    t
  • 英語へ
    t en
  • ラテン語へ
    t ラテン語
  • C 言語へ
    c
q 終了

キー操作

主なキーバインドは以下のとおりです。
(bash 互換です)

カーソル移動

キー 説明 代替キー
Ctrl-a 行頭へ移動 Home
Ctrl-e 行末へ移動 End
Ctrl-b 1文字後退
Ctrl-f 1文字前進

文字削除

キー 説明 代替キー
Ctrl-h カーソル位置の手前の文字を削除 Back
space
Ctrl-d カーソル位置の文字を削除 Delete
Ctrl-k カーソル位置から行末まで削除
Ctrl-u 行頭からカーソル位置の手前まで削除

履歴操作

入力したコマンドやテキストはヒストリに保存されるので、キー操作でそれを辿ることができます。

キー 説明 代替キー
Ctrl-p 入力履歴を遡る
Ctrl-n 入力履歴を進む
Ctrl-r 入力履歴のインクリメンタルサーチ

バッチコマンドとして使う

書式

コマンドの書式は以下のとおりです。

format
tran [options] [path...]

オプション

オプションは以下のとおりです。

option 説明
-h ヘルプを表示します。 $ tran -h
-l 言語コードと名称の一覧 (184件) を表示します。
(言語コードは ISO639-1)
$ tran -l
-s code 変換元の言語 (Source) を
言語コード(ISO639-1)で指定します。
省略した場合は自動判別。
$ tran -s en
-t code 変換先の言語 (Target) を
言語コード(ISO639-1)で指定します。
省略した場合はカレント・ロケールへ変換。
$ tran -t en

パス

path の指定方法は以下のとおりです。

path 説明
指定 指定したファイルを翻訳して標準出力へ出力します。 $ tran a.txt b.txt
省略
  • 標準入力がターミナルの場合
    対話型で起動
  • 標準入力がパイプやリダイレクトの場合
    翻訳した結果を標準出力へ出力
  • ss コマンドの man を翻訳
    $ man ss|tran|less
  • Go のコンパイルエラーを翻訳
    $ go build . 2>&1|tran
  • ファイルをリダイレクト
    $ tran < a.txt

※セル内の "|" は全角文字です。
コピペの際はご注意ください。

使用例

難しい英単語を取り急ぎ確認

$ echo "penpineappleapplepen" | tran
ペンパイナッポーアップルペン

日本語のファイルを英語にする

$ tran -t en Japanese.txt
this is a pen.

日本語のファイルをラテン語にして保存

$ tran -t la Japanese.txt > Latin.txt

自動翻訳の結果を日本語に還元して、しっくりくるか確認

$ echo "僕はりんごが大好きです" | tran -t en | tran
りんごが大好き

strings.Builder (Golang) のソースコードの全コメント行を日本語にする

$ grep '^\s*//' ./builder.go | sed -e 's/^\s*..\s*//' | tran
Copyright 2017 The GoAuthors。全著作権所有。
このソースコードの使用は、BSDスタイルによって管理されています
LICENSEファイルにあるライセンス。
Builderは、Writeメソッドを使用して文字列を効率的に構築するために使用されます。
...

カレントディレクトリ配下の全ログファイルのエラー行を日本語にする

$ find . -name '*.log' | xargs grep 'error:' | tran
./tool/vim/src/auto/config.log:conftest.c:154:12:エラー: 'GETACLCNT'が宣言されていません(この関数での最初の使用)
./tool/vim/src/auto/config.log:conftest.c:154:26:エラー: 'NULL'が宣言されていません(この関数での最初の使用)
...

4. translate-shell との比較

実は僕が translate-shell のことを知ったのは、 go-tran を作り始めた後でした。
機能もほとんど似ており、コマンド名も同じ trans だったので驚きました。
(最初は go-trans という名前だったんです)

しかも、translate-shell は品詞などの付加情報を表示してくれたり、単語に複数の意味がある場合はそれを表示してくれたりと高機能です。

でも、少し使ってみると、go-tran には go-tran の良さがあることが次第にわかってきました。

translate-shell のメリット

translate-shell は、翻訳結果だけでなく以下のような付加情報も表示してくれます。

  • 変換元の言語
  • 変換先の言語
  • 品詞(単語の場合)
  • 複数の意味(単語の場合)

translate-shell の実行例
translate-shell_1.gif

辞書のように使えるため、英作文などでは使い勝手が良いかもしれませんね。
とはいってもがっつり英文ドキュメントを書かなければならない場合はもっとしっかりした辞書が必要になると思います。

go-tran のメリット

translate-shell に対する go-tran のアドバンテージは以下のとおりです。

  • シンプル
    余計な情報を出力しないため見やすいです。
    品詞などの付加情報は時として邪魔になります。
  • カラー表示
    カラー表示なので、見たい箇所を瞬時に判別できます。
  • 言語コードの検索機能
    go-tran なら言語コードを簡単に見つけられます。
    translate-shell では言語コードを記憶しておくか、ドキュメントを見なければならないでしょう。
  • bash ライクなキーバインド
    go-tran は文字編集がしやすいです。
    translate-shell は標準入力を単に読み取っているだけのようで、文字編集に難があります。
  • ヒストリ機能
    go-tran は前に入力したコマンドやテキストを再表示し、それを編集して実行することができます。
    これも translate-shell にはない機能です。
  • Windows ネイティブ対応
    go-tran は Windows のコマンドプロンプトで実行できます。
    translate-shell では Cygwin などの UNIX 互換環境が必要なようです。

go-tran の使用イメージ
tran_1.gif

5. 作り方は簡単

GAS (Google Apps Script) で作る Web API も、Go で作るクライアントもとても簡単です。

GAS で Web API を作る

tanabee さんの大人気記事を参考にさせていただきました。

参考にさせていただいたコードに、以下の処理を追記しています。

  • json で返却
  • GET/POST に対応
  • 例外処理
  • 例外メッセージを英語で出力

コードは以下のとおりです。

Translate.gs
// 共通処理
// param e イベント
function process(e) {
    let body // レスポンスボディ
    try {
        const p = e.parameter                                       // リクエスト・パラメータ
        const s = LanguageApp.translate(p.text, p.source, p.target) // 翻訳
        body = {code: 200, text: s}                                 // レスポンス・ボディの作成
    } catch (e) { // param e 例外
        // 翻訳に失敗した
        try {
            const msg = LanguageApp.translate(e.toString(), "", "en") // エラーメッセージを英語へ
            body = {code: 400, message: msg}                          // レスポンス・ボディの作成
        } catch (e) { // param e 例外
            // これに失敗するということは内部エラー
            body = {code: 500, message: e.toString()}                 // レスポンス・ボディの作成
        }
    }
    let resp = ContentService.createTextOutput()    // レスポンス
    resp.setMimeType(ContentService.MimeType.JSON)  // MIME タイプを JSON 形式にして
    resp.setContent(JSON.stringify(body))           // レスポンス・ボディを JSON 形式の文字列に変換
    return resp;                                    // レスポンスを返却
}

// GET
// param e イベント
function doGet(e) {
    return process(e) // 共通処理の呼び出し
}

// POST
// param e イベント
function doPost(e) {
    return process(e) // 共通処理の呼び出し
}

上記コードで process(e) と 2 つの catch(e) で同名の変数を使っているのが気になる方は変数名を変更してください。

なお、スクリプトを修正した後に Project versionNew にしないとプロダクトに反映されないということを知らなかったため、これで 20 分くらい悩みました。

Go でクライアントを作る

GAS で作った Web API をラップするクライアント側の関数(Go 言語)のは以下のとおりです。

tran.go
package tran

import (
        "encoding/json"
        "errors"
        "io/ioutil"
        "net/http"
        "net/url"
        "strings"
)

const gURL = "https://script.google.com/macros/s/@@script@@/exec" // @@script@@ 要修正

// レスポンスの JSON をマップする構造体
type TransData struct {
        Code    int    `json:"code"`    // レスポンス・ステータス
        Text    string `json:"text"`    // 翻訳結果
        Message string `json:"message"` // エラーメッセージ
}

// 翻訳
func Translate(text, source, target string) (string, error) {
        // パラメータの作成
        v := url.Values{}
        v.Add("text", text)     // 変換元の文字列
        v.Add("srouce", source) // 変換元の言語 (ISO639-1)
        v.Add("target", target) // 変換先の言語 (ISO639-1)

        // 翻訳 API へ POST でリクエスト
        resp, err := http.PostForm(gURL, v)
        if resp != nil {
                defer resp.Body.Close()
        }
        if err != nil {
                return "", err
        }
        // レスポンス・ボディをバッファへ読み込む
        buf, err := ioutil.ReadAll(resp.Body)
        if err != nil {
                return "", err
        }
        // レスポンス・ボディ (JSON 形式) を構造体へマップ
        var td TransData
        if err := json.Unmarshal(buf, &td); err != nil {
                return "", err
        }
        // レスポンス・ステータスの検査
        if td.Code != 200 {
                // エラー処理 (プレフィクスの "Exception: " を取り除く)
                msg := td.Message
                prefix := "exception:"
                if strings.HasPrefix(strings.ToLower(msg), prefix) {
                        msg = string(msg[len(prefix):])
                        msg = strings.TrimSpace(msg)
                }
                return "", errors.New(msg)
        }
        // 正常処理
        return td.Text, nil // 構造体から変換後の文字列を取り出して返却
}

難しいことは何もしておらず、一番シンプルな方法で HTTP リクエスト (POST) を投げているだけなんですが、以下の点は注意してくださいね。

  • 上記コードの @@script@@@ の箇所は、それぞれの GAS プロジェクトに合わせて修正する必要があります。
  • エラーが発生した際、メッセージのプレフィクス "Exception: " を取り除く処理を行っていますが、これは状況によっては不要な処理だと思います。

これ以外のコードについては、こちら をご覧ください。

6. go-tran の課題

現時点で以下のような課題がありますが、改善はそれほど難しくないと思います。

  • レスポンス・タイム
    現在、サーバ側は GAS の無料プランを使っているということもあり、トラフィックが集中した際のアクセス制限でレスポンスが悪くなることが考えられます。
    これについては、コマンドの config 設定でユーザ固有の URL を指定できるようにしようと考えています。そうすれば、利用者が自分の Google Account に GAS スクリプトを登録する負担は増えますが、それと引き換えに他人のことを気にせずにコマンドを使うことができるようになるはずです。

  • バッチの出力形式
    ログファイルやドキュメントを翻訳する場合はやはり原文と比較しながら見たいですよね。
    これについては、変換元と変換先を行ごとに交互に出力するオプションを用意する予定です。おそらく対応は難しくないでしょう。

7. おわりに

本稿では、Go 言語で翻訳ツール (TUI コマンド) を作ったという話と、そのコマンドの使い方を紹介しました。作り方についても簡単に紹介しました。また、既に似たツールが存在することを知り、最初はがっかりするも次第に自作コマンドも悪くないと思うようになったということを書きました。

GAS の翻訳 API は簡単に使える上に、皆に知れ渡っています。
最初は、そんな API を使ったプロダクトなんて特に面白いこともできないだろうと思っていましたが、実際に作ってみると意外にも便利なものを作ることができました(オレオレ仕様なのであたりまえなのですが…)。

また自作してみることで、人気ツールのメリットとデメリットの両方が見えるようになりました。

世に知れ渡ったソリューションは星の数ほどあります。
でも今回の経験は、そういったものの中にも、

  • コモディティ化したように見えるが、まだ誰も気づいていない使い道がある
  • デファクトスタンダードになっているが、まだ誰も気づいていない改善点がある

そういったことを改めて認識する機会となりました。

それでは!

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

冷やかしで作った翻訳コマンド(TUI)が便利すぎるのでガチ使い!

GAS をラップした翻訳ツール (TUI command) を Go 言語で書きました。
tran_1.gif

対象読者

以下に該当する方にとっては読む価値があるかもしれません。

  • 英語(や他の外国語)が苦手で翻訳ツールが手放せない
  • ターミナルで作業する時間が長い
  • translate-shell よりシンプルで視認性の良いコマンドを探している
  • GAS (Google Apps Script) に興味がある
  • Golang (Go 言語) の TUI ツールの実装に興味がある

目次

1. はじめに

英語が苦手な僕は、ドキュメントを読むときも書くときも、辞書サイトや翻訳サイトが手放せません。
普段、ターミナルで作業をすることが多いんですが、Web ブラウザとターミナルソフトの間を行ったり来たりしているので、それはそれはストレスが溜まります。

そんなある日、GAS (Google Apps Script) を触ったことがなかった僕は、後学のためにちょっと試してみようと思い、LanguageApp をラップしたお手軽翻訳コマンドを作ってみたんです。

最初は洒落で作り始めたつもりだったんですが、意外にもこれが便利に使えることがわかったので、記事にして紹介したいと思います。

コマンドは以下のリポジトリで公開しています。

類似するものに translate-shell というツールがあります。使っている方も多いと思いますが、本稿の後半で go-tran と translate-shell の違いについても触れています。

2. go-tran の概要

対応OS

Linux と Windows で動作確認しています。
(Mac でも動くと思います)

対話型インターフェス

tran コマンドを引数なしで実行すると、対話型シェルが起動します。

翻訳する

デフォルトでは、実行環境のカレント・ロケールの言語へ翻訳されるので、あとは翻訳したい外国語を入力するだけです。
以下は、英語、フランス語、イタリア語、スペイン語、韓国語、中国語を日本語へ翻訳する例です。
tran_1.gif
上記画像ではプロンプトが :ja> となっています。
これは (Source):(Target)> の形式になっていて、変換元 (Source) の言語が自動 (Auto) で、変換先 (Target) の言語が日本語 (ja) という意味です。例えば、日本語から英語へ翻訳する場合は ja:en> と表示されます。

言語を切り替える

変換先の言語を切り替えるには、2 桁の言語コード (ISO639-1) を入力します。
以下は、ターゲットの言語を切り替えながら、日本語を英語 (en)、フランス語 (fr)、イタリア語 (it)、スペイン語 (es)、韓国語 (ko)、中国語 (zh) へ翻訳する例です。
tran_2.gif

言語コードが分からない場合

言語コードが分からない場合は l (エル) コマンド (l: Language codes) で調べられます。

l コマンドは、入力した文字列が ISO639-1 コードと同じか、ISO 言語名称 (英名) に部分一致したものの一覧を表示します。どちらにも引っかからなかった場合は、内部で英語に変換してから再検索をかけるため、例えば日本語で入力した名称でも、目的の言語コードを比較的簡単に見つけることができます。

以下は「 l コマンドで "nor" を含むもの、"nese" を含むもの、"ドイツ語"、"クルド語"、"ズールー語" を検索し、その一覧は表示できたが、"カンブリア語" は見つからなかった」という例です。
tran_3.gif

バッチ・インターフェス

コマンドライン引数にファイル名を指定したり、コマンドの標準入力へパイプやリダイレクトで繋いだ場合はバッチ・コマンドとして実行されます。

ファイルの指定

引数にファイルのパス名を渡して go-tran を実行すると、そのファイルを翻訳してくれます。これも変換先の言語(デフォルト値)は実行環境のカレント・ロケールにより決まります。
tran_5.gif

パイプやリダイレクト

標準入力がターミナルではない場合、go-tran はバッチモードで実行されます。

例えば、僕の Ubuntu 環境は man が日本語で表示されるようになっているのですが、日本語のマニュアルが用意されていないコマンドもあります。普段あまり使わないコマンドほど日本語化されていなかったりしますよね。これまでは、知らない英単語に出くわしたときはわざわざ Web ブラウザを開いて調べていました。

でもこれからは man を go-tran にリダイレクトするだけで済みます。
tran_4.gif

3. go-tran の使い方

インストール

Go の環境がある場合

install go-tran
$ go get github.com/y-bash/go-tran
$ cd $GOPATH/src/github.com/y-bash/go-tran
$ go install ./...

Go の環境がなく、ソースコードのみ取得する場合

get source code
$ git clone https://github.com/y-bash/go-tran.git

もし、Go の環境はないけどバイナリを使ってみたいという方がいたら、方法を考えますので、気軽に声をかけてくださいね。

対話型で使う

起動する

実行ファイルは tran という名前です。

$ tran
Welcome to the GO-TRAN!
...

コマンドの説明

入力した文字は概ね以下のように判断されます。

文字列 説明
1 文字 コマンドとして判断。
2 文字 Target 言語の切り替え。
3 文字以上 入力したテキストを現在のモードに従って翻訳。

コマンドの種類は以下のとおりです。

コマンド 説明
h ヘルプを表示します。
l [str] 言語コードと名称の一覧を表示します。
(言語コードは ISO639-1)
  • str を指定した場合
    マッチする言語コードの一覧を表示
  • str を省略した場合
    すべてのコード (184 件) を表示
  • コード、名称に "en" を含むもの
    l en
  • 名称に "nor" を含むもの
    l nor
  • 名称に英名 "Welsh" を含むもの
    l ウェールズ語
s [str] 変換元の言語 (Source) を切り替えます。
  • str を指定した場合
    マッチする言語へ切り替え
  • str を省略した場合
    Auto (自動モード)へ切り替え
    ※通常は Auto で問題なし
  • 英語へ
    s en
  • スペイン語へ
    s spanish
  • ポルトガル語へ
    s ポルトガル語
  • Auto(自動モード) へ
    s
[t] code

t [str]
変換先の言語 (Target) を切り替えます。
  • t を省略した場合
    2 桁のコード (ISO639-1) で
    指定した言語へ切り替え
  • t の後に str を指定した場合
    マッチする言語へ切り替え
  • t の後の str を省略した場合
    実行環境のカレント・ロケール
    へ切り替え
  • カレント・ロケールへ
    t
  • 英語へ
    t en
  • ラテン語へ
    t ラテン語
  • C 言語へ
    c
q 終了

キー操作

主なキーバインドは以下のとおりです。
(bash 互換です)

カーソル移動

キー 説明 代替キー
Ctrl-a 行頭へ移動 Home
Ctrl-e 行末へ移動 End
Ctrl-b 1文字後退
Ctrl-f 1文字前進

文字削除

キー 説明 代替キー
Ctrl-h カーソル位置の手前の文字を削除 Back
space
Ctrl-d カーソル位置の文字を削除 Delete
Ctrl-k カーソル位置から行末まで削除
Ctrl-u 行頭からカーソル位置の手前まで削除

履歴操作

入力したコマンドやテキストはヒストリに保存されるので、キー操作でそれを辿ることができます。

キー 説明 代替キー
Ctrl-p 入力履歴を遡る
Ctrl-n 入力履歴を進む
Ctrl-r 入力履歴のインクリメンタルサーチ

バッチコマンドとして使う

書式

コマンドの書式は以下のとおりです。

format
tran [options] [path...]

オプション

オプションは以下のとおりです。

option 説明
-h ヘルプを表示します。 $ tran -h
-l 言語コードと名称の一覧 (184件) を表示します。
(言語コードは ISO639-1)
$ tran -l
-s code 変換元の言語 (Source) を
言語コード(ISO639-1)で指定します。
省略した場合は自動判別。
$ tran -s en
-t code 変換先の言語 (Target) を
言語コード(ISO639-1)で指定します。
省略した場合はカレント・ロケールへ変換。
$ tran -t en

パス

path の指定方法は以下のとおりです。

path 説明
指定 指定したファイルを翻訳して標準出力へ出力します。 $ tran a.txt b.txt
省略
  • 標準入力がターミナルの場合
    対話型で起動
  • 標準入力がパイプやリダイレクトの場合
    翻訳した結果を標準出力へ出力
  • ss コマンドの man を翻訳
    $ man ss|tran|less
  • Go のコンパイルエラーを翻訳
    $ go build . 2>&1|tran
  • ファイルをリダイレクト
    $ tran < a.txt

※セル内の "|" は全角文字です。
コピペの際はご注意ください。

使用例

難しい英単語を取り急ぎ確認

$ echo "penpineappleapplepen" | tran
ペンパイナッポーアップルペン

日本語のファイルを英語にする

$ tran -t en Japanese.txt
this is a pen.

日本語のファイルをラテン語にして保存

$ tran -t la Japanese.txt > Latin.txt

自動翻訳の結果を日本語に還元して、しっくりくるか確認

$ echo "僕はりんごが大好きです" | tran -t en | tran
りんごが大好き

strings.Builder (Golang) のソースコードの全コメント行を日本語にする

$ grep '^\s*//' ./builder.go | sed -e 's/^\s*..\s*//' | tran
Copyright 2017 The GoAuthors。全著作権所有。
このソースコードの使用は、BSDスタイルによって管理されています
LICENSEファイルにあるライセンス。
Builderは、Writeメソッドを使用して文字列を効率的に構築するために使用されます。
...

カレントディレクトリ配下の全ログファイルのエラー行を日本語にする

$ find . -name '*.log' | xargs grep 'error:' | tran
./tool/vim/src/auto/config.log:conftest.c:154:12:エラー: 'GETACLCNT'が宣言されていません(この関数での最初の使用)
./tool/vim/src/auto/config.log:conftest.c:154:26:エラー: 'NULL'が宣言されていません(この関数での最初の使用)
...

4. translate-shell との比較

実は僕が translate-shell のことを知ったのは、 go-tran を作り始めた後でした。
機能もほとんど似ており、コマンド名も同じ trans だったので驚きました。
(最初は go-trans という名前だったんです)

しかも、translate-shell は品詞などの付加情報を表示してくれたり、単語に複数の意味がある場合はそれを表示してくれたりと高機能です。

でも、少し使ってみると、go-tran には go-tran の良さがあることが次第にわかってきました。

translate-shell のメリット

translate-shell は、翻訳結果だけでなく以下のような付加情報も表示してくれます。

  • 変換元の言語
  • 変換先の言語
  • 品詞(単語の場合)
  • 複数の意味(単語の場合)

translate-shell の実行例
translate-shell_1.gif

辞書のように使えるため、英作文などでは使い勝手が良いかもしれませんね。
とはいってもがっつり英文ドキュメントを書かなければならない場合はもっとしっかりした辞書が必要になると思います。

go-tran のメリット

translate-shell に対する go-tran のアドバンテージは以下のとおりです。

  • シンプル
    余計な情報を出力しないため見やすいです。
    品詞などの付加情報は時として邪魔になります。
  • カラー表示
    カラー表示なので、見たい箇所を瞬時に判別できます。
  • 言語コードの検索機能
    go-tran なら言語コードを簡単に見つけられます。
    translate-shell では言語コードを記憶しておくか、ドキュメントを見なければならないでしょう。
  • bash ライクなキーバインド
    go-tran は文字編集がしやすいです。
    translate-shell は標準入力を単に読み取っているだけのようで、文字編集に難があります。
  • ヒストリ機能
    go-tran は前に入力したコマンドやテキストを再表示し、それを編集して実行することができます。
    これも translate-shell にはない機能です。
  • Windows ネイティブ対応
    go-tran は Windows のコマンドプロンプトで実行できます。
    translate-shell では Cygwin などの UNIX 互換環境が必要なようです。

go-tran の使用イメージ
tran_1.gif

5. 作り方は簡単

GAS (Google Apps Script) で作る Web API も、Go で作るクライアントもとても簡単です。

GAS で Web API を作る

tanabee さんの大人気記事を参考にさせていただきました。

参考にさせていただいたコードに、以下の処理を追記しています。

  • json で返却
  • GET/POST に対応
  • 例外処理
  • 例外メッセージを英語で出力

コードは以下のとおりです。

Translate.gs
// 共通処理
// param e イベント
function process(e) {
    let body // レスポンスボディ
    try {
        const p = e.parameter                                       // リクエスト・パラメータ
        const s = LanguageApp.translate(p.text, p.source, p.target) // 翻訳
        body = {code: 200, text: s}                                 // レスポンス・ボディの作成
    } catch (e) { // param e 例外
        // 翻訳に失敗した
        try {
            const msg = LanguageApp.translate(e.toString(), "", "en") // エラーメッセージを英語へ
            body = {code: 400, message: msg}                          // レスポンス・ボディの作成
        } catch (e) { // param e 例外
            // これに失敗するということは内部エラー
            body = {code: 500, message: e.toString()}                 // レスポンス・ボディの作成
        }
    }
    let resp = ContentService.createTextOutput()    // レスポンス
    resp.setMimeType(ContentService.MimeType.JSON)  // MIME タイプを JSON 形式にして
    resp.setContent(JSON.stringify(body))           // レスポンス・ボディを JSON 形式の文字列に変換
    return resp;                                    // レスポンスを返却
}

// GET
// param e イベント
function doGet(e) {
    return process(e) // 共通処理の呼び出し
}

// POST
// param e イベント
function doPost(e) {
    return process(e) // 共通処理の呼び出し
}

上記コードで process(e) と 2 つの catch(e) で同名の変数を使っているのが気になる方は変数名を変更してください。

なお、スクリプトを修正した後に Project versionNew にしないとプロダクトに反映されないということを知らなかったため、これで 20 分くらい悩みました。

Go でクライアントを作る

GAS で作った Web API をラップするクライアント側の関数(Go 言語)のは以下のとおりです。

tran.go
package tran

import (
        "encoding/json"
        "errors"
        "io/ioutil"
        "net/http"
        "net/url"
        "strings"
)

const gURL = "https://script.google.com/macros/s/@@script@@/exec" // @@script@@ 要修正

// レスポンスの JSON をマップする構造体
type TransData struct {
        Code    int    `json:"code"`    // レスポンス・ステータス
        Text    string `json:"text"`    // 翻訳結果
        Message string `json:"message"` // エラーメッセージ
}

// 翻訳
func Translate(text, source, target string) (string, error) {
        // パラメータの作成
        v := url.Values{}
        v.Add("text", text)     // 変換元の文字列
        v.Add("srouce", source) // 変換元の言語 (ISO639-1)
        v.Add("target", target) // 変換先の言語 (ISO639-1)

        // 翻訳 API へ POST でリクエスト
        resp, err := http.PostForm(gURL, v)
        if resp != nil {
                defer resp.Body.Close()
        }
        if err != nil {
                return "", err
        }
        // レスポンス・ボディをバッファへ読み込む
        buf, err := ioutil.ReadAll(resp.Body)
        if err != nil {
                return "", err
        }
        // レスポンス・ボディ (JSON 形式) を構造体へマップ
        var td TransData
        if err := json.Unmarshal(buf, &td); err != nil {
                return "", err
        }
        // レスポンス・ステータスの検査
        if td.Code != 200 {
                // エラー処理 (プレフィクスの "Exception: " を取り除く)
                msg := td.Message
                prefix := "exception:"
                if strings.HasPrefix(strings.ToLower(msg), prefix) {
                        msg = string(msg[len(prefix):])
                        msg = strings.TrimSpace(msg)
                }
                return "", errors.New(msg)
        }
        // 正常処理
        return td.Text, nil // 構造体から変換後の文字列を取り出して返却
}

難しいことは何もしておらず、一番シンプルな方法で HTTP リクエスト (POST) を投げているだけなんですが、以下の点は注意してくださいね。

  • 上記コードの @@script@@@ の箇所は、それぞれの GAS プロジェクトに合わせて修正する必要があります。
  • エラーが発生した際、メッセージのプレフィクス "Exception: " を取り除く処理を行っていますが、これは状況によっては不要な処理だと思います。

これ以外のコードについては、こちら をご覧ください。

6. go-tran の課題

現時点で以下のような課題がありますが、改善はそれほど難しくないと思います。

  • レスポンス・タイム
    現在、サーバ側は GAS の無料プランを使っているということもあり、トラフィックが集中した際のアクセス制限でレスポンスが悪くなることが考えられます。
    これについては、コマンドの config 設定でユーザ固有の URL を指定できるようにしようと考えています。そうすれば、利用者が自分の Google Account に GAS スクリプトを登録する負担は増えますが、それと引き換えに他人のことを気にせずにコマンドを使うことができるようになるはずです。

  • バッチの出力形式
    ログファイルやドキュメントを翻訳する場合はやはり原文と比較しながら見たいですよね。
    これについては、変換元と変換先を行ごとに交互に出力するオプションを用意する予定です。おそらく対応は難しくないでしょう。

  • 文字数制限(2020年10月12日 追記)
    GAS の LanguageApp に 大量の文章を投入するとエラーが発生することがわかりました。これについては、API に 1 度に投入する文字数の最大値を config 設定できるようにし、大量の文章が投入された場合は分割して翻訳するようにプログラムを修正する予定です。

7. おわりに

本稿では、Go 言語で翻訳ツール (TUI コマンド) を作ったという話と、そのコマンドの使い方を紹介しました。作り方についても簡単に紹介しました。また、既に似たツールが存在することを知り、最初はがっかりするも次第に自作コマンドも悪くないと思うようになったということを書きました。

GAS の翻訳 API は簡単に使える上に、皆に知れ渡っています。
最初は、そんな API を使ったプロダクトなんて特に面白いこともできないだろうと思っていましたが、実際に作ってみると意外にも便利なものを作ることができました(オレオレ仕様なのであたりまえなのですが…)。

また自作してみることで、人気ツールのメリットとデメリットの両方が見えるようになりました。

世に知れ渡ったソリューションは星の数ほどあります。
でも今回の経験は、そういったものの中にも、

  • コモディティ化したように見えるが、まだ誰も気づいていない使い道がある
  • デファクトスタンダードになっているが、まだ誰も気づいていない改善点がある

そういったことを改めて認識する機会となりました。

それでは!

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