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
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していく。このとき、使用していたLiveCDが古かったためかうまくarch-rootが動かなかった。LiveCDを最新のものに取り替えるとうまく行った。
vimのインストール
ロケールの設定
# vim /etc/locale.gen
のコメントアウトを外す。なおロシア語は私が個人的に使うので。
これが終わったら
# 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でフルパスを出力する
持ってきたファイルのファイル名の先頭が-の連続から始まっていて処理に困ったときに使えた
youtubeを作業用BGMに使う時、広告鬱陶しくないですかと言うお話(解決策、シェル芸??)
ども、BobbyQuineです。タイトルにもある通り、YouTubeの広告、鬱陶しくないですか??普通に誰かの実況とか見ているぶんにはまぁいいですが、作業用BGMとして使っている最中に広告が流れてしまうと集中力も乱されますし広告スキップのために作業を中断しなければならなくなります。そこで今回は自分がYouTubeを作業用BGとして使うときにやっている方法をご紹介します。
やるなら自己責任で
今回使っていくのは基本的にはvlcです。Linuxユーザーにはある程度お馴染みなのではないでしょうか??Windowsのものも存在します。なお、後半ではBash向けのコマンドなんかを書いていくのでLinuxかMac OSユーザーはそのまま使えます。Windowsコマンドについては詳しくないのでその辺はご了承ください。基本的にLinux向けに書いていきます。
VLCのインストール
実はVLCメディアプレイヤーにはストリーミング機能が備わっています。この機能では動画本編しか再生されません。つまり最初や途中の広告が再生されません。なのでこいつを使えば広告に作業を邪魔されることがありません。インストールは使っているディストリビューションの公式リポジトリからおそらくできると思います。とりあえず以下にはUbuntuの場合とArch Linux の場合を記載しておきます。
Ubuntu の場合
$ sudo apt-get install vlc
Arch Linux の場合
使いかた
基本的にはコマンドで何とかなります。適当に動画の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と言うものを知りまして、それとともにシェル芸という存在を知ったのですよ。ちゃんとは分かっていないのですがコマンドをパイプでつなぎまくることで複雑な処理を一発で終わらせることの様で、これまたすごい人たちがいろんなことをやっている様なのですよ。それに興味を持ってしまったが故に、今回紹介したコマンドは若干シェル芸っぽいことが行われているわけです。これをシェル芸と読んでいいのかわ分かりませんが今回の件で結構おもしろい世界だな、と思いました。