min117の日記

初期desireもち。趣味Mac,メインFedora,仕事xp。

bash トランプの札を全て表示する

f:id:min117:20200119232630p:plain

麻雀ができたのでトランプもやってみる。

 

orebibou.com

Unicode 麻雀牌 - CyberLibrarian

Unicode トランプ - CyberLibrarian

 

[fedora PT3]$ echo -e \\U1F0A0 \\U1F0A{1..9} \\U1F0A{A..E} \\U1F0B{1..9} \\U1F0B{A..E} \\U1F0BF \\U1F0C{1..9} \\U1F0C{A..E} \\U1F0CF \\U1F0D{1..9} \\U1F0D{A..E}

🂠 🂡 🂢 🂣 🂤 🂥 🂦 🂧 🂨 🂩 🂪 🂫 🂬 🂭 🂮 🂱 🂲 🂳 🂴 🂵 🂶 🂷 🂸 🂹 🂺 🂻 🂼 🂽 🂾 🂿 🃁 

🃂 🃃 🃄 🃅 🃆 🃇 🃈 🃉 🃊 🃋 🃌 🃍 🃎 🃏 🃑 🃒 🃓 🃔 🃕 🃖 🃗 🃘 🃙 🃚 🃛 🃜 🃝 🃞

 

[fedora PT3]$ for i in {A..F}; do echo -e "$i"; if "$i" == 'A' ; then echo -e "Spades" ; fi; done

A

Spades

B

C

D

E

F

[fedora PT3]$ 

 

スクリプトにする。

$ vim shellgei_trumps.sh

for i in {A..F}

do

    echo "$i"

 

    if [[ "$i" == 'A' ]]; then echo -e "Spades or swords(スペード又は剣)"

    elif [[ "$i" == 'B' ]]; then echo -e "Hearts"

    elif [[ "$i" == 'C' ]]; then echo -e "Diamonds or pentacles(ダイヤ又は貨幣)"

    elif [[ "$i" == 'D' ]]; then echo -e "Clubs or wands(クラブ又は棍棒"

    elif [[ "$i" == 'E' || "$i" == 'F' ]]; then echo -e "Trumps(トランプ)"

    fi

 

    echo -e \\U1F0"$i"{1..9}

    echo -e \\U1F0"$i"{A..E}

    echo '------------------'

done

 

[fedora PT3]$ ./shellgei_trumps.sh 

20200119_232028

A

Spades or swords(スペード又は剣)

🂡 🂢 🂣 🂤 🂥 🂦 🂧 🂨 🂩

🂪 🂫 🂬 🂭 🂮

------------------

B

Hearts

🂱 🂲 🂳 🂴 🂵 🂶 🂷 🂸 🂹

🂺 🂻 🂼 🂽 🂾

------------------

C

Diamonds or pentacles(ダイヤ又は貨幣)

🃁 🃂 🃃 🃄 🃅 🃆 🃇 🃈 🃉

🃊 🃋 🃌 🃍 🃎

------------------

D

Clubs or wands(クラブ又は棍棒

🃑 🃒 🃓 🃔 🃕 🃖 🃗 🃘 🃙

🃚 🃛 🃜 🃝 🃞

------------------

E

Trumps(トランプ)

🃡 🃢 🃣 🃤 🃥 🃦 🃧 🃨 🃩

🃪 🃫 🃬 🃭 🃮

------------------

F

Trumps(トランプ)

🃱 🃲 🃳 🃴 🃵 🃶 🃷 🃸 🃹

🃺 🃻 🃼 🃽 🃾

------------------

[fedora PT3]$ 

 

 

 

 

 

 

 

bash マージャンの牌を全て表示する

f:id:min117:20200119215926p:plain
麻雀なんてやったことないから意味は全く分からないが、文字コードにはマージャン牌があるらしい。

 

orebibou.com

Unicode 麻雀牌 - CyberLibrarian

Unicode トランプ - CyberLibrarian

 

[fedora PT3]$ echo -e \\U1F00{A..F} \\U1F01{0..9} \\U1F01{0..9} \\U1F01{A..F} \\U1F02{0..9}

🀊 🀋 🀌 🀍 🀎 🀏 🀐 🀑 🀒 🀓 🀔 🀕 🀖 🀗 🀘 🀙 🀐 🀑 🀒 🀓 🀔 🀕 🀖 🀗 🀘 🀙 🀚 🀛 🀜 🀝 🀞 

🀟 🀠 🀡 🀢 🀣 🀤 🀥 🀦 🀧 🀨 🀩

 

[fedora PT3]$ echo -e \\U1F00{A..F} \\U1F01{0..9} \\U1F01{0..9} \\U1F01{A..F} \\U1F02{0..9} | tr -d ' ' | sed 's/^......../&\n/'

🀊🀋🀌🀍🀎🀏🀐🀑

🀒🀓🀔🀕🀖🀗🀘🀙🀐🀑🀒🀓🀔🀕🀖🀗🀘🀙🀚🀛🀜🀝🀞🀟🀠🀡🀢🀣🀤🀥🀦🀧🀨🀩

 

{0..3}{,,} は色々使えそう。

[fedora PT3]$ echo -e \\U1F00{0..3}{,,}

🀀 🀀 🀀 🀁 🀁 🀁 🀂 🀂 🀂 🀃 🀃 🀃

qiita.com

f:id:min117:20200119222127p:plain

[fedora PT3]$ echo -e \\U1F00{0..3}{,,} \\U1F006{,}

🀀 🀀 🀀 🀁 🀁 🀁 🀂 🀂 🀂 🀃 🀃 🀃 🀆 🀆

 

[fedora PT3]$ echo -e \\U1F00{0..3}{,,} \\U1F006{,} | sed -r 's/(.) \1/\1\1/g' 

🀀🀀 🀀 🀁🀁 🀁 🀂🀂 🀂 🀃🀃 🀃 🀆🀆

 

[fedora PT3]$ echo -e \\U1F00{0..3}{,,} \\U1F006{,} | sed -r 's/(.) \1/\1\1/g' | sed -r s'/(.) \1/\1\1/g'

🀀🀀🀀 🀁🀁🀁 🀂🀂🀂 🀃🀃🀃 🀆🀆

 

[fedora PT3]$ echo -e \\U1F00{0..3}{,,} \\U1F006{,} | sed -r 's/(.) \1/\1\1/g' | sed -r s'/(.) \1/\1\1/g' | sort -R

🀀🀀🀀 🀁🀁🀁 🀂🀂🀂 🀃🀃🀃 🀆🀆

[fedora PT3]$ 

 

[fedora PT3]$ echo -e '\U1F006'{,,,,,,,,,,,,,,,,,,,,}

🀆 🀆 🀆 🀆 🀆 🀆 🀆 🀆 🀆 🀆 🀆 🀆 🀆 🀆 🀆 🀆 🀆 🀆 🀆 🀆 🀆

 

 

 

 

 

 

bash 3桁の数字で各桁を足すと15になる数字だけを表示(ゾロ目は除く)

www.youtube.com

 

[fedora PT3]$ seq 123 999 | grep -v 0 | awk -F '' '$1+$2+$3==15' | grep -P '(.).*\1'

177

339

366

393

447

474

555

636

663

717

744

771

933

[fedora PT3]$ 

 

grep -P だと perl正規表現

min117.hatenablog.com

 

xargsで1行に表示

[fedora PT3]$ seq 123 999 | grep -v 0 | awk -F '' '$1+$2+$3==15' | grep -P '(.).*\1' | xargs

177 339 366 393 447 474 555 636 663 717 744 771 933

[fedora PT3]$ 

 

 grep -v で反転

seq 123 999 | grep -v 0 | awk -F '' '$1+$2+$3==15' | grep -Pv '(.).*\1'

 

xargsで1行に表示

[fedora PT3]$ seq 123 999 | grep -v 0 | awk -F '' '$1+$2+$3==15' | grep -Pv '(.).*\1' | xargs

159 168 186 195 249 258 267 276 285 294 348 357 375 384 429 438 456 465 483 492 519 528 537 546 564 573 582 591 618 627 645 654 672 681 726 735 753 762 816 825 834 843 852 861 915 924 942 951

[fedora PT3]$ 

 

-Pを使わずに grep本体だけでもいける

[fedora PT3]$ seq 123 999 | grep -v 0 | awk -F '' '$1+$2+$3==15' | grep -v '\(.\).*\1' | xargs

159 168 186 195 249 258 267 276 285 294 348 357 375 384 429 438 456 465 483 492 519 528 537 546 564 573 582 591 618 627 645 654 672 681 726 735 753 762 816 825 834 843 852 861 915 924 942 951

[fedora PT3]$ 

 

 

xargsで10行だけ表示

[fedora PT3]$ seq 123 999 | grep -v 0 | awk -F '' '$1+$2+$3==15' | grep -v '\(.\).*\1' | xargs -n 10

159 168 186 195 249 258 267 276 285 294

348 357 375 384 429 438 456 465 483 492

519 528 537 546 564 573 582 591 618 627

645 654 672 681 726 735 753 762 816 825

834 843 852 861 915 924 942 951

[fedora PT3]$ 

 

 

 

 

 

bash sedでラベリングによりループ回して三角形を書く

シェル芸勉強会の動画。毎度すごい参考になる。

f:id:min117:20200119212013j:plain

www.youtube.com

 

シェルにこんな三角形を表示するワンライナーはどう書くか?

f:id:min117:20200119203000p:plain

 

こうやる。

$ echo ' ^^' | sed ':a p;s/ ^/^ /;b a' | head -n 5 | sed 1i.

f:id:min117:20200119203355p:plain

すごい。

 

$ echo ' ^^' | sed ':a p;s/ ^/^ /;b a' | head -n 5 | sed 1i.

:a aというラベリングをするよ。あとでaとして使うよ

p プリント(画面に表示)せよ

s/ ^/^ / 半角スペース^ を ^半角スペースにせよ

b 直後にきたラベル文字(今回はa)に分岐せよ(:aで指示した処理をせよ)

 

つまり、a p;s/ ^/^ /; で示した処理をb でループしてる。

 

これすごい。ワンライナーで、しかもsedの中でループしてるってことか。日々のbashでしょっちゅう使えそう。

 

sedのマニュアルも見ておく。

$ man sed

f:id:min117:20200119204129p:plain

 

sed 1i.はオマケ。1行目にドットを表示(して見栄えをよく)せよ、というだけ。

 

表示する文字を/と\に変えて

sedの区切り文字を/から@に変えてみると

 

変更前 echo ' ^^' | sed ':a p;s/ ^/^ /;b a' | head -n 5 | sed 1i.

変更後 echo ' /\' | sed ':a p;s@ /@/ @;b a' | head -n 5 | sed 1i.

f:id:min117:20200119205316p:plain

すごすぎ。

 

[fedora PT3]$ echo 'lCAgL1wKlCAvlCBcCiAvlCAglFwKLyAglCAglFwK77+j77+j77+j77+jCg=='|base64 --decode | sed '3s//👁/3;1s/^././'

  /\

 / \

 /  \

/    \

 ̄ ̄ ̄ ̄

 

f:id:min117:20200119211626p:plain

 

 

 

 

 

独習Java第4版 インスタンスメソッドとインスタンス変数

f:id:min117:20200119141449p:plain

要は雛形であるクラスから実体化されて客観的に(objective)に物質として触れることができるのがオブジェクトであり、それをインスタンス(実体)と呼ぶことにしたのであろうと。

 

こんなイメージ

f:id:min117:20200119132110p:plain

高次元の霊的存在である天使どもが、我々の住む主物質界に安定して実体化した姿が主天使第4位の天使ドミニオンだとすると

 

高次元の霊的存在であるクラスどもが、我々の触る主物質界つまりメモリ上に安定して実体化した姿がインスタンスであろうと。

 

読んでて理解した。良い作品は全てに通ず

 

インスタンスメソッド主天使ドミニオン使うビームや武器)を呼び出すためには、クラスのインスタンスを生成する(天使を主物質界に実体化する)必要がある。

f:id:min117:20200119134015j:plain

実体化してメソッド(武器やビーム)を使いこなせれば強力だ。

f:id:min117:20200119140140p:plain

 

 

Stringクラスで試してみる。

Stringというクラス(天使)が実体化してインスタンスになった(主天使に実体化した)ときに使えるメソッド(武器)にはこんなのがあるらしい。

f:id:min117:20200119134933j:plain

substringというメソッドを使えば、startからendまでの文字列を切り出すことができる

 

やってみる。

$ vim p56_First10Chars.java

f:id:min117:20200119135307p:plain

f:id:min117:20200119135739p:plain

4行目 変数sに文字列を入れた=オブジェクトsとして実体化した

5行目 オブジェクトsメソッドsubstringを利用して0から10文字目までを切り出す

 

12行目

やってることは4行目+5行目と同じなんだけど、ダブルクオートで囲んだ時点でオブジェクトが作成されている(実体化している)から

 "文字列".substring(1,10);

のような書き方ができる。

コンパイル

f:id:min117:20200119135516p:plain

 

実行

f:id:min117:20200119135859p:plain

f:id:min117:20200119140714j:plain

 

こうして見ると、クラス(天使)実体化(主天使ドミニオンになる)してはじめてメソッド(武器)が使えるはずなんだけど、

 

例外的に、クラス(天使)実体化しなくても使えるメソッド(武器)があって、それが静的メソッドだということだろうと理解した。

min117.hatenablog.com

 

Java楽しすぎる。



 

 

 

 

RaspberryPi3 omxplayerで最近のmp3を順番に再生するスクリプト(5MB以上は読み飛ばす)

f:id:min117:20200119114854p:plain

動画からワンクリックで音声を抽出+再生できる機能を先日実装した。

min117.hatenablog.com

おかげでサーバにmp3がどんどん貯まる。

 

お気に入りのmp3ばかりなので順番に再生したい。最新のだけを拾って再生するスクリプトにする。長い音声(5MB以上)は音楽以外(英語の会話)だったりするから読み飛ばす

 

RaspberryPi3 で実行してテレビで再生させる。

 

できた。

$ vim mymp3recent.sh

f:id:min117:20200119114244p:plain

f:id:min117:20200119114313p:plain

29行目+61行目

ファイル名に半角スペースが含まれていてもブツ切りされないよう一時的にIFSを変更している。

min117.hatenablog.com

 

 

 

 

コピペ用

  1 #!/bin/bash

  2 

  3 shopt -s expand_aliases

  4 source ~/.bashrc

  5 

  6 # shopt について

  7 # https://www.gnu.org/software/bash/manual/html_node/The-Shopt-Builtin.html

  8 

  9 # 異常時にちゃんと止まるスクリプト

 10 # http://fj.hatenablog.jp/entry/2017/05/20/192431

 11 #set -eu -o pipefail

 12 #trap 'echo "ERROR: line no = $LINENO, exit status = $? > &2; exit 1' ERR

 13 

 14 mydate=`date +"%Y%m%d_%H%M%S"`

 15 mypath=`pwd`

 16 

 17 echo $mydate

 18 

 19 # http://d.hatena.ne.jp/nattou_curry_2/20091103/1257262803

 20 # Bashを使うなら理解しておきたいアルゴリズム - 抽出・ソート・結合・集計

 21 

 22 # 関数

 23 # function multi() { echo "数値を入力"; read ans; for i in $(seq 1 10); do ech    o "$i"; echo $*1; done; }

 24 

 25 # IFSを一時的に変更

 26 # http://min117.hatenablog.com/entry/2020/01/03/104644

 27 # ( IFS=$'\n'; for i in $(ls -rt | grep mp3 | tail -n 10 ); do echo "$i"; )

 28 

 29 ( IFS=$'\n'

 30     ## ls -rtでファイル名だけ取得

 31     # IFSを改行だけにしてるから

 32     # 半角入ってても取得できる

 33     for i in $(ls -rt | grep .*mp3$ | tail -n 30)

 34     do

 35         echo "$i"

 36         # ファイルサイズを取得

 37         # lsに人間読めるhをつけちゃうとファイルサイズ表記が3.1Mのようになり

 38         # if文で使えなくなる

 39       # mp3SIZE=`ls -shalrt "$i" | awk '{print $1}'`

 40         #mp3SIZE=`ls -salt "$i" | awk '{print $1}'`

 41         mp3SIZE=`ls -salt "$i" | awk '{print $1}'`

 42         mp3TIME=`ls -salt "$i" | awk '{print $7,$8,$9}'`

 43         echo $mp3SIZE'KB'

 44         echo '----------'

 45         echo $*2'MB'

 46         echo $mp3TIME

 47         echo '----------'

 48         # echo `echo $mp3SIZE | awk -FM '{print $1}'`

 49         # 5MB以上のmp3なら読み飛ばす

 50         if [[ "$mp3SIZE" -gt 5000 ]]

 51         then

 52             echo '5000 over'

 53         else

 54             echo 'YEEEEES'

 55             omxplayer "$i"

 56         fi

 57         

 58         echo '--------------------'

 59     done

 60 

 61 )

 62 

 

 

*1:ans*i

*2:mp3SIZE/1024

独習Java第4版 静的メソッドと静的変数(自然対数の底eと円周率π)

「静的メソッドはクラスに結びつけられているため、それを呼び出すためにクラスのインスタンスを生成する必要がない

f:id:min117:20200118144706p:plain

昔は言っている意味がさっぱり分からなかったが、今なら分かる。

f:id:min117:20200118143703j:plain

クラスっていう雛形自体が持っているメソッドが静的メソッドで、その雛形から作られた実体(インスタンス)が持っているメソッドではないのね。

 

クラスっていう雛形自体が持っている変数が静的変数で、その雛形から作られた実体(インスタンス)が持っているメソッドではないのね。

 

なるほど。

 

書いてみる。

Mathクラスの

 静的メソッドE(自然対数の底e)は Math.E で呼び出す

 静的メソッドPI(円周率)はMath.PI で呼び出す

$ vim p53_EPI.java

f:id:min117:20200118141957p:plain

 

コンパイルする。

$ javac p53_EPI.java

f:id:min117:20200118143900p:plain

 

実行。

$ java p53_EPI

f:id:min117:20200118142054p:plain

うむ。

 

 

 

もう一つ。

$ vim p53_AreaCircumference.java 

f:id:min117:20200118142834p:plain

 

コンパイル

$ javac p53_AreaCircumference.java 

f:id:min117:20200118144152p:plain

 

実行

$ java  p53_AreaCircumference

f:id:min117:20200118142906p:plain

 

面白い。200円の本とは思えない。楽しい。

f:id:min117:20200118144532j:plain

f:id:min117:20200118144537j:plain

f:id:min117:20200118144541j:plain