投稿

4月, 2020の投稿を表示しています

シェルスクリプトを実行する2種類の方法とその違い

イメージ
こんにちは、ぐぐりら(<a href="https://twitter.com/guglilac">@guglilac</a>)です。 ```bash ./シェルスクリプト名.sh ``` という方法と、 ```bash source ./シェルスクリプト名.sh ``` がある。 前者について、 `#!/bin/bash`がシェルスクリプトの先頭行についているけど、これは、ターミナルで ```bash ./シェルスクリプト名.sh ``` とすると、自動で ```bash /bin/bash シェルスクリプト名.sh ``` を実行してくれるということ。 なので、子プロセスとして新しくbashを起動してシェルスクリプトに書かれているコマンドを実行してくれる。 処理が終わると抜ける。 前者に関して言うと、シェル変数と環境変数の違いとして、 呼び出し元のシェルで使っていたシェル変数も、子プロセスのシェルでは参照できないが、 環境変数に指定すれば、子プロセスのシェルでも参照できるといった点が挙げられる。 シェルスクリプトを実行するもう一つの方法は、`source`コマンドを使ってシェルスクリプトを読み込む方法。 これは前者の方法と異なり、新しくシェルを起動するのではなく、現在のシェルでシェルスクリプトに書かれたコマンドを一つ一つ実行する。 なので、前者の方法で実行したシェルスクリプトが終わると、起動していたbashも終わるので、元のbashではシェルスクリプトで使っていたシェル変数は参照できないが、後者の方法であれば同じシェルにいるのでシェル変数はまだ残っている。 新しくシェルを起動する前者の方が、副作用を起こさないとか、呼び出し元のシェルのシェル変数が予期せぬ影響を与えたりといったことが起こらないため、基本的にはこちらの方が望ましい。 後者のようにシェルスクリプトの読み込みに`source`コマンドが使われている有名な例では、ログイン時に読み込まれる`.bash_profile`の中で`.bashrc`を読みこむ処理がある。 `.bashrc`もシェルスクリプトなわけだけど、これをログインシェルと異なる他のbashを起動して実行しては、ログインシェルに影響が残っ

ワイルドカードと正規表現(初心者メモ)

イメージ
こんにちは、ぐぐりら(<a href="https://twitter.com/guglilac">@guglilac</a>)です。 適当に使ってきていたけど、間違えるケースがあったので違いをメモします。 分かっている人には当たり前だと思うけど、知らなかったので定着のためアウトプット。 気をつけないと間違える。 シェルのワイルドカードは、勝手にパス名展開されてコマンドが実行される。 例えば ```bash cat hoge* ``` とすると、 カレントディレクトリにある`hoge(0文字以上)`のファイル名に展開される。 hoge.txtとhoge2.txtがあると、 ```bash cat hoge.txt hoge2.txt ``` と展開され、実行される。catは引数が指定されると、引数のファイルの中身をconcatして出力するので、hoge.txtとhoge2.txtの中身が連結されて出力される。 これはワイルドカードによるパス名展開。 これと正規表現を間違えてはいけない。 grepコマンドを例に説明する。 grepは、検索してくれる。 `grep 検索条件 検索ファイル` で、検索ファイルが指定されていないと標準入力を検索する。 パイプラインでつないで利用されることが多い。 `ls | grep hoge` みたいな。 lsした結果、ファイルやディレクトリの列が表示されるけど、それをgrepの入力につないでいる。 ここで、検索条件には * 単に検索する文字を入れる方法 * 正規表現 の二種類が使える。 ```bash ls | grep hoge ``` とすると、hogeが入った名前のファイルやディレクトリの名前が表示される。 正規表現を渡す場合は、 ```bash ls | grep 'hoge*' ``` のように、シングルクオートで囲む。そうしないと、ワイルドカードによるパス名展開されて引数が渡されてしまう。 次のように ```bash ls | grep hoge* ``` とすると、展開されて ```bash ls | grep hoge.txt hoge2.txt ``` となり、引数が多すぎてエラー。

和音をベクトルにするChord2Vecを作った話  〜 "A7" - "A" + "C" = ? 〜

イメージ
こんにちは、ぐぐりら(<a href="https://twitter.com/guglilac">@guglilac</a>)です。 今回は、Word2VecならぬChord2Vecを作って遊んでみましたという記事です。 Word2Vecは文章中に登場する単語を、共起関係をもとにベクトルにする手法で、広く使われています。 単語の意味を考慮してベクトルに埋め込むことができます。 Word2Vecを使うと、単語どうしの足し算や引き算がある程度できるようになります。 「王様」 - 「男」 + 「女」 = 「女王」 のような感じです。 Word2Vecについての詳細な説明は他に譲ります。 * [絵で理解するWord2vecの仕組み -Qiita](https://qiita.com/Hironsan/items/11b388575a058dc8a46a) * [word2vec(Skip-Gram Model)の仕組みを恐らく日本一簡潔にまとめてみたつもり](https://www.randpy.tokyo/entry/word2vec_skip_gram_model) 今回は、これを単語ではなく音楽のコードのベクトル表現を得たいと思います。 最終的には、タイトルにもあるように、 ``` "A7" - "A" + "C" = "C7" ``` のような計算ができるようなコードのベクトル表現を得ることが目標です。 ## なぜやったのか この記事を執筆するに至った経緯ですが、 [前回](https://www.smartbowwow.com/2019/12/lightfm.html)、lightFMという協調フィルタリング系のライブラリを用いて、楽曲のコード進行から最適なカポの位置を推薦しました。 その際に、予測の副産物として各コードのベクトル表現が得られたので可視化してみたり、Word2Vecのように足し算や引き算ができるかどうかを試したのですが、うまくいきませんでした。 lightFMはあくまで副産物としてベクトルが得られ、そこでは良い表現を得るということに焦点を当てていなかったので、今回は、そのリベンジです。 #