BobbyQuineのブログ(備忘録)

Linux関係の備忘録、その他タバコ、Vape関連なんかも。

Arch Linuxでbluetooth Speaker (headphone)が使いたいわよ

ども、BobbyQuineです。正直書かなくていい気もするけど一応書いとく。

正直これ読めばいい

https://wiki.archlinux.jp/index.php/Bluetooth_%E3%83%98%E3%83%83%E3%83%89%E3%82%BB%E3%83%83%E3%83%88

 

つないだ相手はsonyのh.earなんちゃらかんちゃら。

 

必要なもの入れる

$ sudo pacman -S pulseaudio-alsa pulseaudio-bluetooth bluez bluez-libs bluez-utils bluez-firmware

ついでに

$ sudo pacman -S pavucontrol

 

その後、headphoneの電源入れて"ペアリングモードにしてから"

$ sudo systemctl start bluetooth.service

$ sudo bluetoothctl

これでシェルが変わるはず。多分下な感じ

[bluetooth]# power on

[bluetooth]# agent on

[bluetooth]# default-agent

[bluetooth]# scan on

そしたら多分使いたいデバイスMacアドレスとデバイス名出るから確認。

[bluetooth]# pair yourdevicesMacAdd

ペアリングできたら

[bluetooth]# connect yourdevicesMacAdd

 

でなんだけどこれだと多分接続できない

別でまたTerminal立ち上げて

$ pulseaudio -k

$ pulseaudio

でpulseaudio再起動させてからもっかいコネクトとかやってみて。

接続できたら

[bluetooth]# scan off

[bluetooth]# exit

 

以上。いつもbluetoothバイス使ってるわけじゃないので自動化とかその辺はやりません、Arch Wiki見て。

UEFIマシンにArch Linuxをインストールする

ども、BobbyQuineです。今回はUEFIマシンにArch LinuxをインストールしてXfce4を入れていきます。またその後その他個人設定をば。

今回のマシンはDell inspiron 15 5547だった気がす。

 

 

DVDの準備

$ sudo growisofs -dvd-compat -speed=8 -Z /dev/sr0=archlinux-***.iso

メモ書き

growisofsはArchだったらdvd+rw-toolsパッケージに入ってる

 

 

起動モードの確認

# ls /sys/firmware/efi/efivars

 

 まぁ、今回は先述の通りUEFIマシンなのでなんだか色々ズラッと出てきます。UEFI起動であることが確認できました。

 

ネット接続

# wifi-menu

 

他のArchマシンから設定ファイル持ってくるとパスワード打つ手間省ける。

 

システムクロック更新

# timedatectl set-ntp true

確認は

# timedatectl status

 

ディスクのパーティション分け

# parted /dev/sda

(parted) mklabel gpt

(parted) mkpart ESP fat32 1MiB 551MiB

(parted) set 1 esp on

(parted) mkpart primary ext4 551MiB 50GiB

(parted) mkpart primary ext4 50GiB 100%

(parted) q

 

今回はUEFIブートなのでGPTで。また、FAT32でのESPが必要。

その他のサイズや構成はお好きなように。私はいつも通りsda2=root、sda3=homeでswapは作らず。

 

フォーマット

# mkfs.vfat -F32 /dev/sda1

# mkfs.ext4 /dev/sda2

# mkfs.ext4 /dev/sda3

 

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

# mount /dev/sda2 /mnt

# mkdir /mnt/boot

# mkdir /mnt/home

# mount /dev/sda1 /mnt/boot

# mount /dev/sda3 /mnt/home

 

ミラーリストの選択

# vim /etc/pacman.d/mirrorlist

Japan項目探してそのURLをファイルの先頭にコピー。

ってかインストールディスクにvimって入ってたっけ?前まで入って無かった気がしたけど

 

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

# pacstrap /mnt base base-devel

 

fstabの作成

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

 

chroot

chrootしていく。このとき、使用していたLiveCDが古かったためかうまくarch-rootが動かなかった。LiveCDを最新のものに取り替えるとうまく行った。

 

#arch-chroot /mnt /bin/bash

 

vimのインストール

私はvimmerなので設定にvimを使いたい

 

# pacman -S vim

 

ロケールの設定

# vim /etc/locale.gen

en_US.UTF-8 UTF-8

ja_JP.UTF-8 UTF-8

ru_RU.UTF-8 UTF-8

コメントアウトを外す。なおロシア語は私が個人的に使うので。

これが終わったら

# locale-gen

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

本来はjp106キーボードを呼び出すようにvconsole.confも編集するのだろうが、私はUS配列ユーザーなのでこのまま。

 

タイムゾーンの設定

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

# hwclock --systohc --utc

 

ホストネーム

※斜体のところは自分で決める。

# echo myhostname > /etc/hostname

同じ名前を/etc/hostsにも追加

#vim /etc/hosts

 

127.0.0.1 localhost.localdomain localhost

::1 localhost.localdomain localhost

127.0.1.1 myhostname.localdomain myhostname

 

Wi-Fiまわり

# pacman -S iw wpa_supplicant dialog

 

rootパスワード

# passwd

 

新規ユーザー作成

# useradd -m -g users -G wheel -s /bin/bash newusername

# passwd newusername

 

ブートローダーのインストール

今回はGrubでやっていきます。 UEFIなのかBIOSなのかでやり方の変わる項目です。

 

# pacman -S grub efibootmgr dosfstools

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

# grub-mkconfig -o /boot/grub/grub.cfg

 

chrootから出る

chrootから出てシャットダウン、LiveCDを取り出して再度起動。

 

# exit

# shutdown now

 

sudoの設定

再起動後、sudo の設定をやっていく。とりあえずrootでログインし

 

# pacman -S sudo bash-completion

 

このbash-completionはsudoでコマンドを打ち始めたときのTab補完が行えるようにする。

次にユーザーでsudoを使えるようにする。

 

# visudo

username ALL=(ALL) ALL

と追加。visudo はviと挙動が一緒。

 

ここから先は別記事でまとめたいと思います。では。

 

Arch Linuxで、USBスピーカーを抜き刺ししたときに自動的に音声出力先を変える。

ども、BobbyQuineです。今までUSBスピーカーはWindowsマシンの方で使っていたのでとくには弄って無かったのですが、色々あってArchマシンの方で使うことになったのでちょいと弄ってみました。

 

※2019/01/14追記:/etc/asound.confを編集するように書かれていますがこれだとシステム全体に適応されます。また、後の方に書いてあるシェルスクリプトを実行するにはsudoが必要になってしまいます。なのでユーザーごとの設定ファイルである~/.asoundrcに読み替えたほうがよいかと思われます。

 

まずは以前やったこちらについて、

http://bobbyquine.hatenablog.com/entry/2018/01/29/225506

この " /etc/modprobe.d/alsa-base.conf "と言うファイルはいらないので削除します。

と言うか邪魔です。

 

$ sudo rm /etc/modprobe.d/alsa-base.conf

 

次にここ( Advanced Linux Sound Architecture - ArchWiki )を参考に " /etc/udev/rules.d/00-local.rules " を編集します。と言うかコピペです。

 

$ sudo vim /etc/udev/rules.d/00-local.rules

KERNEL=="pcmC[D0-9cp]*", ACTION=="add", PROGRAM="/bin/sh -c 'K=%k ; K=$${K#pcmC}; K=$${K%%D*}; echo defaults.ctl.card $$K > /etc/asound.conf; echo defaults.pcm.card $$K >>/etc/asound.conf'"
KERNEL=="pcmC[D0-9cp]*", ACTION=="remove", PROGRAM="/bin/sh -c 'echo defaults.ctl.card 0 > /etc/asound.conf; echo defaults.pcm.card 0 >>/etc/asound.conf'"

 

2018/10/17追記

上記設定だと、USBスピーカーをつないだまま再起動すると発生するデバイスナンバリングの変化に対応できないのでこうした。

 

KERNEL=="pcmC[D0-9cp]*", ACTION=="add", PROGRAM="/bin/sh -c 'cat /proc/asound/modules|grep usb|sed -e s/^/defaults.ctl.card/ -e s/\ snd_usb_audio// > /etc/asound.conf; cat /proc/asound/modules|grep usb|sed -e s/^/defaults.pcm.card/ -e s/\ snd_usb_audio// >>/etc/asound.conf'"
KERNEL=="pcmC[D0-9cp]*", ACTION=="remove", PROGRAM="/bin/sh -c 'cat /proc/asound/modules|grep intel|sed -e s/^/defaults.ctl.card/ -e s/\ snd_hda_intel// > /etc/asound.conf; cat /proc/asound/modules|grep intel|sed -e s/^/defaults.pcm.card/ -e s/\ snd_hda_intel// >>/etc/asound.conf'"

 

こういうところでシェル芸やってたのが役にたつね。

追記以上

 

まぁそのまんまですね。カーネルまわりはよく分からないのでアレですが要するにUSBサウンドカードが追加されたら " /etc/asound.conf " を編集してるってだけですね。

 

でもこれ、自動化したぶんCPU食ってるのよね、ってことでこんなものも作ってみた。

 

vim ~/Command/usbaudio

#!/bin/bash
if test $1 = "0" ;then
  echo "defaults.ctl.card 0" > /etc/asound.conf
  echo "defaults.pcm.card 0" >> /etc/asound.conf
  echo "set audio output Headphone"
else

 if cat /proc/asound/modules|grep 1 > /dev/null ; then
  echo "defaults.ctl.card 1" > /etc/asound.conf
  echo "defaults.pcm.card 1" >> /etc/asound.conf
  echo "set audio output USB Speaker"

 else
   echo "defaults.ctl.card 0" > /etc/asound.conf
   echo "defaults.pcm.card 0" >> /etc/asound.conf
   echo "set audio output Headphone"
  fi
fi

 

まぁUSBスピーカーを抜き差ししたときにこれ実行すれば出力デバイス変えてくれるよね、ってことで。しかもこいつを使えばUSBスピーカー刺した状態でも内蔵チップ出力に変えられる。

http://bobbyquine.hatenablog.com/entry/2018/03/24/164602

こんな風にコマンド化して

 

$ usbaudio 0

 

ってね。

 

ちなみに余談だけどこのシェルスクリプト入れ子のif文に使ってる条件式、

cat /proc/asound/modules|grep 1 > /dev/null

って部分、いつだったかツイッターで見かけて気に入って使ってるやり方。

順を追って説明すると

$ cat /proc/asound/modules

ってしたときにUSBスピーカーが刺さっていると当環境下だと

 0 snd_hda_intel
1 snd_usb_audio

って出力され、USBスピーカーが刺さってないと

 0 snd_hda_intel

って出力される。まぁ/dev化が監視されてて自動で書き換わるようにできてる(/proc下だから云々ってのはめんどいからry)。

んで、だ。こいつの標準出力をgrepに渡してやって " 1 " って条件で検索してやる。

で、検索結果は/dev/nullに捨てちゃう。欲しいのは処理が成功したか失敗したかだけだから。

USBスピーカーが刺さってればgrepは成功したとOS側に返す。刺さって無ければ失敗したって返す。これを横取りしてif文に渡してやればスピーカー刺さってる刺さってないが分けられる。

っていうかgrepって検索結果が無いときはエラーコード返してるのね、今回の収穫はそこだわ。

このやり方初めて見たときはめっちゃ感動したなぁ。

というわけでいつも通りグダグダな記事でした。

LaTeXでロシア語と日本語を共存させてノートがとりたい(キリル文字直打ち)

ども、BobbyQuineです。今回はLaTeXのお話。どうしてもロシア語の授業のノートをLaTeXで取りたかったのですが、どうにもjarticleだと全角キリル文字になってしまう。

これだと気持ち悪いし読み辛いしでどうしようもない。なのでチャチャッとググってみたら「多言語使うならbabelを使え!!」とのこと。しかし、このbabel、キリル文字に対応させた英字で打っていくと言うものでした。わざわざ対応覚えるのも面倒だし、こちとらru配列せっかく覚えたから使いたい。ということでキリル文字打ちの文章部分を対応する英字に変換していくシェルスクリプトを書いていこうと思う。今回も使用OSはArch Linux、使用するのはTexLive、下記URLで作成した環境であるものとする。

http://bobbyquine.hatenablog.com/entry/2018/01/26/001125

 

参考ページ

http://a011w.broada.jp/wbaefznh35st/latex/babel130.html

http://a011w.broada.jp/wbaefznh35st/latex/sample_babel_russian.pdf

 

 

その前に、

 

$ sudo pacman -S texlive-langcyrillic

 

キリル文字回りに必要なものを入れておく。

 

シェルスクリプト

http://a011w.broada.jp/wbaefznh35st/latex/sample_babel_russian.pdf

 こちらを参考にキリル文字を対応する英字に変換するシェルスクリプトを書いてく。

まぁご覧いただければわかるクソコードである。シェルスクリプト内のsed部分は面倒くさくなってシェル芸で書き揃えた。ついでに書いとくとシェル芸ばっかやってるとシェルスクリプトの細かい部分忘れてて結構手間取った。

※2018/10/9 追記: 下記シェルスクリプトに引用符"«"、"»"を追加。それぞれ"<<<<"、">>>>"で入力できるようにした。

 

以下ファイル内(filename = rulatex)--------------------------------------------------------------------------

 

#!/bin/bash

realtex=$(echo $1|sed "s/.tex/.dvi/")
mkdir /tmp/rulatex
cat $1|sed -e "s/<<<</«/g" -e "s/>>>>/»/g" -e "s/А/{A}/g" -e "s/а/{a}/g" -e "s/Б/{B}/g" -e "s/б/{b}/g" -e "s/В/{V}/g" -e "s/в/{v}/g" -e "s/Г/{G}/g" -e "s/г/{g}/g" -e "s/Д/{D}/g" -e "s/д/{d}/g" -e "s/Е/{E}/g" -e "s/е/{e}/g" -e "s/Ё/{E0}/g" -e "s/ё/{e0}/g" -e "s/Ж/{Z1}/g" -e "s/ж/{z1}/g" -e "s/З/{Z}/g" -e "s/з/{z}/g" -e "s/И/{I}/g" -e "s/и/{i}/g" -e "s/Й/{I0}/g" -e "s/й/{i0}/g" -e "s/К/{K}/g" -e "s/к/{k}/g" -e "s/Л/{L}/g" -e "s/л/{l}/g" -e "s/М/{M}/g" -e "s/м/{m}/g" -e "s/Н/{N}/g" -e "s/н/{n}/g" -e "s/О/{O}/g" -e "s/о/{o}/g" -e "s/П/{P}/g" -e "s/п/{p}/g" -e "s/Р/{R}/g" -e "s/р/{r}/g" -e "s/С/{S}/g" -e "s/с/{s}/g" -e "s/Т/{T}/g" -e "s/т/{t}/g" -e "s/У/{U}/g" -e "s/у/{u}/g" -e "s/Ф/{F}/g" -e "s/ф/{f}/g" -e "s/Х/{H}/g" -e "s/х/{h}/g" -e "s/Ц/{C}/g" -e "s/ц/{c}/g" -e "s/Ч/{Q}/g" -e "s/ч/{q}/g" -e "s/Ш/{X}/g" -e "s/ш/{x}/g" -e "s/Щ/{W}/g" -e "s/щ/{w}/g" -e "s/Ъ/{P2}/g" -e "s/ъ/{p2}/g" -e "s/Ы/{Y}/g" -e "s/ы/{y}/g" -e "s/Ь/{P1}/g" -e "s/ь/{p1}/g" -e "s/Э/{E1}/g" -e "s/э/{e1}/g" -e "s/Ю/{J2}/g" -e "s/ю/{j2}/g" -e "s/Я/{J1}/g" -e "s/я/{j1}/g" > /tmp/rulatex/$1

platex /tmp/rulatex/$1 << EOF

 

EOF
dvipdfmx $realtex

 

-----------------------------------------------------------------------------------------------------------------以上

 

 

いい加減コピペやめてちゃんとファイルとしてアップロードしたいもんだけれども、やりかたがよーわからんw。

 

さて、せっかくなのでコマンドとしてパス通しときましょ。

http://bobbyquine.hatenablog.com/entry/2018/03/24/164602

 

実際に書いてみる

まぁbabelについてはこの辺のページがわかりやすい

https://user.ecc.u-tokyo.ac.jp/users/user-15826/wiki/?TeX/Manual/Babel

 

とりあえずテストファイル置いとく。

 

以下ファイル内(filename = test.tex)------------------------------------------------------------------------

 

\documentclass[a4j]{jsarticle}
\title{Russian Test(\foreignlanguage{russian}{Русский язык})}
\author{BobbyQuine}
\usepackage[OT2,T1]{fontenc}
\usepackage[russian,japanese]{babel}
\begin{document}
\maketitle
\begin{otherlanguage}{russian}
\section{русский язык}

this is the test.

\foreignlanguage{russian}{Где ты?}


ロシア語

 

\selectlanguage{russian}
Я тебя не отдам

\end{document}

 

--------------------------------------------------------------------------------------------------------------------以上

 

 

作ったtest.texを作ったrulatexコマンドで試してみる。

 

$ rulatex test.tex

 

ちなみにtest.tex内の赤字は今回の重要ポイント的な部分。

 

\usepackage[OT2,T1]{fontenc}

キリル文字にはOT2というのが必要だが、T1も無いと英語が使えなくなる。正直僕もよく分かっちゃいない。

 

\usepackage[russian,japanese]{babel}

ここではbabelで使う言語の設定的な。正直メインがjapaneseなのでここでjapanese設定いるか分からん。

 

ドキュメント内でのロシア語の書き方は複数ある。

\begin{otherlanguage}{russian}

\end{otherlanguage}

で囲んだところに書く方法、

\selectlanguage{russian}

の後に書く方法、

\foreignlanguage{russian}{Где ты?}

のように書く方法である。

二つめの書き方では、次に\selectlanguageで言語を替えるまで適応される。

三つめの書き方は日本語文章中に少しロシア語単語を書きたいときなどに便利である。

 

正直書くの飽きてきたので今回はこの辺で。アクセント記号にも対応させたものをそのうち書くかも。皆さん、ロシア語を極めましょう。Пока!!

自作キーボード、Ergo42を作ったお話 (Ubuntuでのファームウェア焼き込み)

適当に備忘録がてら書いてく。メインの組み立てなんかはこちらのブログを参考にした方がいい。写真や図もあってわかりやすい。

https://qiita.com/zk_phi/items/3180902a37fa73223020

 

なので組み立ては吹っ飛ばして、ファームウェア焼き込み環境整える所から。(組み立てに夢中になりすぎて写真撮り忘れた)

 

適当にUbuntu用意したら

$ sudo apt update

$ sudo apt install git gcc unzip wget zip gcc-avr binutils-avr avr-libc dfu-programmer dfu-util gcc-arm-none-eabi binutils-arm-none-eabi libnewlib-arm-none-eabi

 $ cd ~

$ git clone https://github.com/qmk/qmk_firmware.git

$ cd qmk_firmware

 

ここで作ったキーボードを片方つなぐ。なお、TRRSケーブルは繋がない

$ make ergo42/rev1:default:avrdude

途中、キーボード側のリセットボタン押せって出てくるから指示にしたがう。

もう方側にも同じように書き込んで完成。

 

キーマップは~/qmk_firmware/keyboards/ergo42/keymaps/default/keymap.cに保存されているのでそれを弄る。

 

シェル芸

個人的シェル芸置き場

 

zshでは

 

% echo {а..я}

а б в г д е ж з и й к л м н о п р с т у ф х ц ч ш щ ъ ы ь э ю я

 

とできる。しかしこれをBashに同様にコマンドを打ち込んでも実行されず

{а..я}

という出力が得られる。そこで"echo а я"からはじめてzshと同様の出力結果が得られるかやってみた。

 

$ echo а я|sed -e "s/^/print(\'/" -e "s/\$/\'\.encode(\'unicode_escape\'))/"|python3.6|sed -e 's/[^0-9,a-f, ]//g' -e 's/b//' -e s/^/0x/ -e "s/ / 0x/"|seq $(cat)|echo "obase=16; ibase=10; $(cat)"|bc|sed "s/^/\\\u/g"|echo -e $(cat)

 

一応ツイッターに収まったのでシェル芸botにいつだったか投げた。これについてpythonを使わずにやる方法探してるなう。

※追記:Python更新で3.7になった。書き換えて実効。

 

とあるディレクトリにあるmp4ファイルをvlcでランダム順に再生する。

lsの-Qオプションを始めて使ったので記念に。なお、ファイル群の名前が特殊文字を含まない場合はこのオプションはいらない

 

$ ls -Q | grep mp4 | sort -R |xargs vlc

 

いい加減shufコマンド覚えたい

 

2018/9/9

https://www.slideshare.net/kanata1/unicode-112630484

こちらのスライドを読ませていただき、Unicodeのおもしろさを知りました(ついでに闇の深さも)。まぁ、というわけでちょっと遊んだのを記録しとこうって感じで。

 

$ echo sedですべての文字の後ろにスペース追加する方法が相変わらず分からない|sed -e "s/^/print(\'/" -e "s/\$/\'\.encode(\'unicode_escape\'))/"|python3.7|sed s/b\'//|sed s/\'//|tr '\\' '\n'|sed '/^$/d'|sed -e "s/\$/\\\U3099\\\U0489/g" -e "s/u/\\\U/g"|sed -z "s/\n//g"|sed -e "s/^/echo \$\'/" -e "s/\$/\'/"|bash

 

未だにsedコマンドが使いこなせず、すべての文字の後ろに共通の文字を追加する方法が分からないorz

Unicode表はWikipediaにあるので、それを見て色々遊んでみたいと思う

 

2018/9/10

どうにも一つ前のシェル芸では英字箇所がうまくいかないことが分かったので。文章に取り消し線を入れるシェル芸。

$ echo test tweet | sed -e "s/\(.\)/\1\\n/g"|sed -e "s/\$/$'\\\U336'/g" -e 1"s/^/echo /"|sed -z "s/\n//g"|bash

 

なお、これはようやくsedで一文字ずつ改行する方法を見つけたのでそれを使った。

sed使いこなせないおじさん、一歩成長

 

2019/01/19

何でか知らんがFizzBuzz問題がTLで話題に。実は今までFizzBuzzをシェル芸でやったことがなかったのでやってみた。

$ seq 1 100|sed -e 0~15cFizzBuzz -e 0~3cFizz -e 0~5cBuzz

 

はい、なんか皆さんがやってるほど長くならなくて実はルール違反しているのでは??って感じなんだけど実際どうなんだろ。

 

2020/02/13

seq 1 7|tac|nl|awk '{if ($1 > $2) print $2,$1;else print $1,$2}'|sed -e s/^/seq\ /g -e s/\$/\\\necho\ a/g|bash|tr '\n' ' '|sed s/\ //g|tr 'a' '\n'|sed -e s/./1/g -e s/\$/aaaaaaa/g|sed s/......./\&\\\n/g|sed /^a*\$/d|rev|sed s/aa/\ /g

 

1111111
  11111
    111
     1
   111
  11111
1111111

 

seq 1 7|tac|nl|awk '{if ($1 > $2) print $2,$1;else print $1,$2}'|sed -e s/^/seq\ /g -e s/\$/\\\necho\ a/g|bash|tr '\n' ' '|sed s/\ //g|tr 'a' '\n'|sed -e s/./1/g -e s/\$/aaaaaaa/g|sed s/......./\&\\\n/g|sed /^a*\$/d|rev|sed s/aa/\ /g|sed -e s/^1/2/g -e s/\ 1/\ 2/g -e s/1\$/2/g|tr '1' ' '

エックスジャパンができあがる

 

2020/02/14

echo a43b5a8b1a4b1a13b1a8b1a3b1a11b1a25|sed -e s/a/\\\n0\|head\ \-n\ /g -e s/b/\\\n1\|head\ \-n\ /g|sed /^\$/d|sed s/^/yes\ /g|bash|tee a|tr '\n' ' '|sed s/^/yes\ /g|bash|head -n 98|nl|awk -F"\t" {'print $2,$1,$1,$1,$1,$1,$1,$1,$1,$1,$1'}|awk -F " " {'print "echo "$1"|awk {print $"$2"+$"$2+1"+$"$2+2"+$"$2+14"+$"$2+16"+$"$2+28"+$"$2+29"+$"$2+30",$"$2+15"}"'}|sed -e s/$\ /$/g -e s/\{/\{\'/g -e s/\}/\'\}/g|bash|awk '{if ($1 == "2") print $2; else if($1 == "3") print "1"; else print "0"}'|sed -e 1s/^/000000000000000/ -e '$ a 0000000000000'|sed s/./\&\\\n/g|sed /^\$/d|tee -a a|tr '\n' ' '|sed s/^/yes\ /g|bash|head -n 98|nl|awk -F"\t" {'print $2,$1,$1,$1,$1,$1,$1,$1,$1,$1,$1'}|awk -F " " {'print "echo "$1"|awk {print $"$2"+$"$2+1"+$"$2+2"+$"$2+14"+$"$2+16"+$"$2+28"+$"$2+29"+$"$2+30",$"$2+15"}"'}|sed -e s/$\ /$/g -e s/\{/\{\'/g -e s/\}/\'\}/g|bash|awk '{if ($1 == "2") print $2; else if($1 == "3") print "1"; else print "0"}'|sed -e 1s/^/000000000000000/ -e '$ a 0000000000000'|sed s/./\&\\\n/g|sed /^\$/d|tee -a a|tr '\n' ' '|sed s/^/yes\ /g|bash|head -n 98|nl|awk -F"\t" {'print $2,$1,$1,$1,$1,$1,$1,$1,$1,$1,$1'}|awk -F " " {'print "echo "$1"|awk {print $"$2"+$"$2+1"+$"$2+2"+$"$2+14"+$"$2+16"+$"$2+28"+$"$2+29"+$"$2+30",$"$2+15"}"'}|sed -e s/$\ /$/g -e s/\{/\{\'/g -e s/\}/\'\}/g|bash|awk '{if ($1 == "2") print $2; else if($1 == "3") print "1"; else print "0"}'|sed -e 1s/^/000000000000000/ -e '$ a 0000000000000'|sed s/./\&\\\n/g|sed /^\$/d|tee -a a|tr '\n' ' '|sed s/^/yes\ /g|bash|head -n 98|nl|awk -F"\t" {'print $2,$1,$1,$1,$1,$1,$1,$1,$1,$1,$1'}|awk -F " " {'print "echo "$1"|awk {print $"$2"+$"$2+1"+$"$2+2"+$"$2+14"+$"$2+16"+$"$2+28"+$"$2+29"+$"$2+30",$"$2+15"}"'}|sed -e s/$\ /$/g -e s/\{/\{\'/g -e s/\}/\'\}/g|bash|awk '{if ($1 == "2") print $2; else if($1 == "3") print "1"; else print "0"}'|sed -e 1s/^/000000000000000/ -e '$ a 0000000000000'|sed s/./\&\\\n/g|sed /^\$/d|tee -a a|tr '\n' ' '|sed s/^/yes\ /g|bash|head -n 98|nl|awk -F"\t" {'print $2,$1,$1,$1,$1,$1,$1,$1,$1,$1,$1'}|awk -F " " {'print "echo "$1"|awk {print $"$2"+$"$2+1"+$"$2+2"+$"$2+14"+$"$2+16"+$"$2+28"+$"$2+29"+$"$2+30",$"$2+15"}"'}|sed -e s/$\ /$/g -e s/\{/\{\'/g -e s/\}/\'\}/g|bash|awk '{if ($1 == "2") print $2; else if($1 == "3") print "1"; else print "0"}'|sed -e 1s/^/000000000000000/ -e '$ a 0000000000000'|sed s/./\&\\\n/g|sed /^\$/d|tee -a a|tr '\n' ' '|sed s/^/yes\ /g|bash|head -n 98|nl|awk -F"\t" {'print $2,$1,$1,$1,$1,$1,$1,$1,$1,$1,$1'}|awk -F " " {'print "echo "$1"|awk {print $"$2"+$"$2+1"+$"$2+2"+$"$2+14"+$"$2+16"+$"$2+28"+$"$2+29"+$"$2+30",$"$2+15"}"'}|sed -e s/$\ /$/g -e s/\{/\{\'/g -e s/\}/\'\}/g|bash|awk '{if ($1 == "2") print $2; else if($1 == "3") print "1"; else print "0"}'|sed -e 1s/^/000000000000000/ -e '$ a 0000000000000'|sed s/./\&\\\n/g|sed /^\$/d|tee -a a|tr '\n' ' '|sed s/^/yes\ /g|bash|head -n 98|nl|awk -F"\t" {'print $2,$1,$1,$1,$1,$1,$1,$1,$1,$1,$1'}|awk -F " " {'print "echo "$1"|awk {print $"$2"+$"$2+1"+$"$2+2"+$"$2+14"+$"$2+16"+$"$2+28"+$"$2+29"+$"$2+30",$"$2+15"}"'}|sed -e s/$\ /$/g -e s/\{/\{\'/g -e s/\}/\'\}/g|bash|awk '{if ($1 == "2") print $2; else if($1 == "3") print "1"; else print "0"}'|sed -e 1s/^/000000000000000/ -e '$ a 0000000000000'|sed s/./\&\\\n/g|sed /^\$/d|tee -a a|tr '\n' ' '|sed s/^/yes\ /g|bash|head -n 98|nl|awk -F"\t" {'print $2,$1,$1,$1,$1,$1,$1,$1,$1,$1,$1'}|awk -F " " {'print "echo "$1"|awk {print $"$2"+$"$2+1"+$"$2+2"+$"$2+14"+$"$2+16"+$"$2+28"+$"$2+29"+$"$2+30",$"$2+15"}"'}|sed -e s/$\ /$/g -e s/\{/\{\'/g -e s/\}/\'\}/g|bash|awk '{if ($1 == "2") print $2; else if($1 == "3") print "1"; else print "0"}'|sed -e 1s/^/000000000000000/ -e '$ a 0000000000000'|sed s/./\&\\\n/g|sed /^\$/d|tee -a a|tr '\n' ' '|sed s/^/yes\ /g|bash|head -n 98|nl|awk -F"\t" {'print $2,$1,$1,$1,$1,$1,$1,$1,$1,$1,$1'}|awk -F " " {'print "echo "$1"|awk {print $"$2"+$"$2+1"+$"$2+2"+$"$2+14"+$"$2+16"+$"$2+28"+$"$2+29"+$"$2+30",$"$2+15"}"'}|sed -e s/$\ /$/g -e s/\{/\{\'/g -e s/\}/\'\}/g|bash|awk '{if ($1 == "2") print $2; else if($1 == "3") print "1"; else print "0"}'|sed -e 1s/^/000000000000000/ -e '$ a 0000000000000'|sed s/./\&\\\n/g|sed /^\$/d|tee -a a|tr '\n' ' '|sed s/^/yes\ /g|bash|head -n 98|nl|awk -F"\t" {'print $2,$1,$1,$1,$1,$1,$1,$1,$1,$1,$1'}|awk -F " " {'print "echo "$1"|awk {print $"$2"+$"$2+1"+$"$2+2"+$"$2+14"+$"$2+16"+$"$2+28"+$"$2+29"+$"$2+30",$"$2+15"}"'}|sed -e s/$\ /$/g -e s/\{/\{\'/g -e s/\}/\'\}/g|bash|awk '{if ($1 == "2") print $2; else if($1 == "3") print "1"; else print "0"}'|sed -e 1s/^/000000000000000/ -e '$ a 0000000000000'|sed s/./\&\\\n/g|sed /^\$/d|tee -a a|tr '\n' ' '|sed s/^/yes\ /g|bash|head -n 98|nl|awk -F"\t" {'print $2,$1,$1,$1,$1,$1,$1,$1,$1,$1,$1'}|awk -F " " {'print "echo "$1"|awk {print $"$2"+$"$2+1"+$"$2+2"+$"$2+14"+$"$2+16"+$"$2+28"+$"$2+29"+$"$2+30",$"$2+15"}"'}|sed -e s/$\ /$/g -e s/\{/\{\'/g -e s/\}/\'\}/g|bash|awk '{if ($1 == "2") print $2; else if($1 == "3") print "1"; else print "0"}'|sed -e 1s/^/000000000000000/ -e '$ a 0000000000000'|sed s/./\&\\\n/g|sed /^\$/d|tee -a a|tr '\n' ' '|sed s/^/yes\ /g|bash|head -n 98|nl|awk -F"\t" {'print $2,$1,$1,$1,$1,$1,$1,$1,$1,$1,$1'}|awk -F " " {'print "echo "$1"|awk {print $"$2"+$"$2+1"+$"$2+2"+$"$2+14"+$"$2+16"+$"$2+28"+$"$2+29"+$"$2+30",$"$2+15"}"'}|sed -e s/$\ /$/g -e s/\{/\{\'/g -e s/\}/\'\}/g|bash|awk '{if ($1 == "2") print $2; else if($1 == "3") print "1"; else print "0"}'|sed -e 1s/^/000000000000000/ -e '$ a 0000000000000'|sed s/./\&\\\n/g|sed /^\$/d|tee -a a|tr '\n' ' '|sed s/^/yes\ /g|bash|head -n 98|nl|awk -F"\t" {'print $2,$1,$1,$1,$1,$1,$1,$1,$1,$1,$1'}|awk -F " " {'print "echo "$1"|awk {print $"$2"+$"$2+1"+$"$2+2"+$"$2+14"+$"$2+16"+$"$2+28"+$"$2+29"+$"$2+30",$"$2+15"}"'}|sed -e s/$\ /$/g -e s/\{/\{\'/g -e s/\}/\'\}/g|bash|awk '{if ($1 == "2") print $2; else if($1 == "3") print "1"; else print "0"}'|sed -e 1s/^/000000000000000/ -e '$ a 0000000000000'|sed s/./\&\\\n/g|sed /^\$/d|tee -a a && cat a|awk '{ORS=NR%14?"":"\n";print}'|sed s/0/\ \ /g|sed s/1/\[\]/g|textimg -asl9 -F100 -f /u*/s*/f*/t*/h*o/*A.ttf

 

lsでフルパスを出力する

持ってきたファイルのファイル名の先頭が-の連続から始まっていて処理に困ったときに使えた

$ ls $(pwd|sed s@\$@/\*@g)

 

youtubeを作業用BGMに使う時、広告鬱陶しくないですかと言うお話(解決策、シェル芸??)

ども、BobbyQuineです。タイトルにもある通り、YouTubeの広告、鬱陶しくないですか??普通に誰かの実況とか見ているぶんにはまぁいいですが、作業用BGMとして使っている最中に広告が流れてしまうと集中力も乱されますし広告スキップのために作業を中断しなければならなくなります。そこで今回は自分がYouTubeを作業用BGとして使うときにやっている方法をご紹介します。

 

やるなら自己責任で

 

今回使っていくのは基本的にはvlcです。Linuxユーザーにはある程度お馴染みなのではないでしょうか??Windowsのものも存在します。なお、後半ではBash向けのコマンドなんかを書いていくのでLinuxMac OSユーザーはそのまま使えます。Windowsコマンドについては詳しくないのでその辺はご了承ください。基本的にLinux向けに書いていきます。

 

VLCのインストール

実はVLCメディアプレイヤーにはストリーミング機能が備わっています。この機能では動画本編しか再生されません。つまり最初や途中の広告が再生されません。なのでこいつを使えば広告に作業を邪魔されることがありません。インストールは使っているディストリビューションの公式リポジトリからおそらくできると思います。とりあえず以下にはUbuntuの場合とArch Linux の場合を記載しておきます。

 

Ubuntu の場合

$ sudo apt-get install vlc

 

Arch Linux の場合

$ sudo pacman -S vlc

 

使いかた

基本的にはコマンドで何とかなります。適当に動画のURLを持ってきて

 

$ vlc https://www.youtube.com/watch?v=zXtsGAkyeIo

 

まぁ、これで再生できます。

 

これを使って作業用BGMの再生リストを作って置きます。

 

再生リストの作成

と堂々と書いたわけですが別に大層なものではなくただURLをテキストファイルに記述しただけものです。

 

$ cd ~

$ mkdir Video

$ mkdir ~/Video/List

$ cd ~/Video/List

$ vim list

 

以下ファイル内容--------------------------------------------------------------------

 

Carly Rae Jepsen - Call Me Maybe
https://www.youtube.com/watch?v=fWNaR-rxAic

t.A.T.u. - All The Things She Said
https://www.youtube.com/watch?v=8mGBaXPlri8

Selena Gomez, Marshmello - Wolves
https://www.youtube.com/watch?v=cH4E_t3m3xM

Selena Gomez - Come & Get It
https://www.youtube.com/watch?v=n-D1EB74Ckg

Avicii - Levels
https://www.youtube.com/watch?v=_ovdm2yX4MA

Егор Крид & MOLLY - Если ты меня не любишь (премьера клипа, 2017)
https://www.youtube.com/watch?v=RI4ALqHtGrs

t.A.T.u. - All About Us (Uncensored)
https://www.youtube.com/watch?v=6yP4Nm86yk0

以上----------------------------------------------------------------------------------------

 

リストの再生コマンド(シェル芸??)

まぁ、こっからは再生コマンドです。とりあえずそのものを記します。

 

$ vlc $(cat list | grep http | tr '\n' ' ')

何だかシェル芸っぽいことをやってます。これについて一応一つずつ解説していきます。

 

まず外側のvlcコマンドは置いといて括弧で囲われた区間の処理について、catコマンドでlistファイルの中身を読み出します。そしてそれをパイプでつないだgrepコマンドに渡します。grepコマンドでは " http " と言う文字列のある行だけに絞ります。で、それをtr コマンドにパイプで渡します。最後のtrコマンドでは改行をスペースに変換しています。これで出来上がる文字列はいかの様になります。

 

https://www.youtube.com/watch?v=fWNaR-rxAic https://www.youtube.com/watch?v=8mGBaXPlri8 https://www.youtube.com/watch?v=cH4E_t3m3xM https://www.youtube.com/watch?v=n-D1EB74Ckg https://www.youtube.com/watch?v=_ovdm2yX4MA https://www.youtube.com/watch?v=RI4ALqHtGrs https://www.youtube.com/watch?v=6yP4Nm86yk0

 

見事にURL同士の間にスペースの入った一行が出力されているのがわかります。で、上のコマンドではこれをvlcの引数しているわけです。

 

ここで、「毎回同じ順番に再生されては飽きてしまう」と言う僕のような人は以下の様に途中にsortコマンドを挿入し、URLをランダムに入れ替えるといいでしょう。

 

$ vlc $(cat list | grep http | sort -R | tr '\n' ' ')

 

以上、作業用BGMにYouTubeを使うための豆知識でした。

 

追記(2018/05/01) : 今日になって気になってやって見たところ上記コマンドのtrコマンド部分はなくても動作することが分かりました(何か悔しい)。なのでコマンドは以下のものでもオッケーです。

 

$ vlc $(cat list | grep http | sort -R )

 

ここから先は蛇足の個人的な最近のこと。

最近twitterのシェル芸botと言うものを知りまして、それとともにシェル芸という存在を知ったのですよ。ちゃんとは分かっていないのですがコマンドをパイプでつなぎまくることで複雑な処理を一発で終わらせることの様で、これまたすごい人たちがいろんなことをやっている様なのですよ。それに興味を持ってしまったが故に、今回紹介したコマンドは若干シェル芸っぽいことが行われているわけです。これをシェル芸と読んでいいのかわ分かりませんが今回の件で結構おもしろい世界だな、と思いました。