スーパーハリネズミ

ハリネズミ愛好家のWebエンジニアによる日記。

macでpyenvを使ってpython3を始めよう

f:id:superharinezumi:20180618225041j:plain:w600

今回は、mac で、pyenv を使ってpython3 を始めるためのメモを残そうと思います。

pyenv (ピーワイエンブ)は、異なるバージョンのpythonを複数管理できるツールで、例えば「このプロジェクトはpython2 で、あのプロジェクトはpython3 で開発する」のようなことが可能です。何より、デフォルトでインストールされているpython を汚さずに、新しいpython をインストールできる、というメリットがあります。

検証環境

macOS High Sierra

まずは、今インストールされているpython のバージョンを、一応調べておきます(もちろん、インストールされていなくても大丈夫です)。

$ python --version
    # Python 2.7.10

2.7.10 ですね。

pyenv のインストールと設定

インストールにあたり、macはhomebrewという優秀なパッケージマネージャがあるため、それを使います。homebrewをインストールしていない場合は、この機会にインストールしておくことをお勧めします。開発者であれば必ず使うかと思います...多分...

homebrew で、pyenv をインストールします。

$ brew install pyenv

1分くらいで完了するかと思います。

インストールできたか、確認しましょう。

$ pyenv -v
    # pyenv 1.2.4

pyenv バージョン1.2.4 がインストールされました。

次に、シェルの設定ファイルに変更を加えるため、以下のコマンドを実行します。 以下のコマンドは、pyenv の公式ドキュメントからの引用です。 zsh ユーザの場合は、「~/.bash_profile」を「~/.zshenv」 に書き換えて実行してください。

$ echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n  eval "$(pyenv init -)"\nfi' >> ~/.bash_profile

設定を反映するために、シェルを再起動します。

exec "$SHELL"

python3 をインストール

ここからようやく、python 本体のインストールになります。 まずは、インストール可能なpython のバージョン一覧を見たいですね。以下のコマンドを実行しましょう。

$ pyenv install --list

現時点(2018.6.18)では、python 3.6.5 が最新のようなので、それをインストールしようと思います。

$ pyenv install 3.6.5

これは少し時間がかかります。僕のmacでは10分程度でしたが、5分経過後くらいからファンが回り始めました。

完了したら、現在インストールされているpython の一覧を確認しておきましょう。以下のコマンドを実行します。

$ pyenv versions

結果は、以下のようになるかと思います。

* system (set by /Users/xxxxx/.pyenv/version)
  3.6.5

アスタリスク(*)の付いているバージョンが、現在使用されているpython のバージョンです。この状態ではまだ、システムのpython (デフォルトで入っているpython )を使うようになっています。

これを、mac全体で、3.6.5 を使うように切り替えます。

$ pyenv global 3.6.5

もう一度、インストールされているpython の一覧をみてみましょう。

$ pyenv versions

結果は、以下のようになり、3.6.5 に切り替わった状態になるはずです。

  system
* 3.6.5 (set by /Users/xxxxx/.pyenv/version)

これで、python3 を使えるようになりました!

$ python --version
    # Python 3.6.5

特定ディレクトリのみ違うバージョンのpython を使う

さて、複数のプロジェクトに関わっていると、「ディレクトリによって、使うpython のバージョンを変更したい」という状況になることがありますが、pyenv を使えばこれも解決することができます。

具体的には、ディレクトリ内に移動(cd)し、

$ pyenv local xxxxx(バージョン)

のように、local というサブコマンドを使うと、そのディレクトリ内は、特定のバージョンのpython を使うことができます。

例として、project というディレクトリ内のみ、システムのデフォルトのpython を使う場合は、以下のように設定し、確認することができます。

$ mkdir project
$ cd project
$ pyenv local system
$ python --version
    # Python 2.7.10
$ cd ../
$ python --version
    # Python 3.6.5

まとめ

mac での、pyenv を使った、 python3 の始め方を簡単に紹介しました。

ちなみに、Perl にはplenv 、Ruby にはrbenv という、ほぼ同じようなツールが存在するので、この種のツールは、一つ知っておくと、応用が効くかと思います。

Python 頑張っていきましょう。

YouTube Data API v3 で、特定チャンネルの最新の動画IDを取得するには?

f:id:superharinezumi:20180614230424j:plain YouTube Data API v3 という、Googleが提供しているAPIがあります。本記事は、そのAPIを使って、YouTubeのある特定のチャンネルの、最新の動画IDを取得してみようと思います!

これができれば、「自分のWebサイトに、最新の動画を自動的に表示する」ということも可能になります。

はじめに

こちらが公式ページですね。

YouTube Data API の概要  |  YouTube Data API (v3)  |  Google Developers

公式ページは情報量が多いので、この記事では、できるだけシンプルに説明していこうと思います。

Google アカウントを作成しておく

YouTube Data API v3 を使用するには、Googleアカウントを作成しておく必要があります。すでに持っている場合は、それを使うこともできます。

YouTube Data API v3 を有効にする

まず、Google APIs のダッシュボードに入ります。

Google Cloud Platform

ダッシュボードの上の方に表示されている、「APIとサービスの有効化」をクリックします。 f:id:superharinezumi:20180614221036p:plain

すると、APIを検索できる画面(「APIライブラリ」)に遷移します。ここには、APIが使える様々なGoogleのサービスが並んでいます。 f:id:superharinezumi:20180614221044p:plain

今回は、YouTube のAPIを使用するので、YouTube と検索し、「YouTube Data API v3」を選択します。 f:id:superharinezumi:20180614221049p:plain

「有効にする」をクリックします。 f:id:superharinezumi:20180614221054p:plain

これで、YouTube Data API v3 を有効にできました!

APIキーを取得する

次に、「APIキー」を取得します。APIキーとは、文字通り、APIにアクセスするために必要なパスワードのようなものです。APIにアクセスするための方法は、APIキーを使う方法以外にもいくつかあるのですが、今回は「APIキー」を使った方法を説明します。

まず、左のメニューから「認証情報」をクリックして、「認証情報を作成」ボタンをクリックします。 f:id:superharinezumi:20180614221058p:plain

いくつか選択肢が表示されますが、「APIキー」を選択してください。 f:id:superharinezumi:20180614221104p:plain

これで、APIキーが作成できました!このダイアログは、そのまま閉じて大丈夫です。 f:id:superharinezumi:20180614221154p:plain

※ 「キーを制限」という機能がありますが、これを使えば、ある特定のWebサイトからのみAPI実行を許可する、などということができます。セキュリティを向上させるために必要な部分ですが、本記事では割愛します。

実際にAPIを叩いてみる

それでは実際に、特定のチャンネルの最新の動画IDを取得するため、検索のAPIを実行してみます。

検索APIのURLは、https://www.googleapis.com/youtube/v3/search となっています。このURLに、必要なパラメータをつけて実行します。ここでは、以下の4つをつけてみます(詳しい説明は公式ドキュメントをご覧ください)。

  • part=id
  • channelId=UCGGhM6XCSJFQ6DTRffnKRIw (ロックバンド「MUSE」のチャンネルID)
  • order=date (新しい順)
  • key=XXXXX (上記で取得したAPIキー)

これらのパラメータをつけると、具体的には以下のようなURLになります。 https://www.googleapis.com/youtube/v3/search?part=id&channelId=UCGGhM6XCSJFQ6DTRffnKRIw&order=date&key=XXXXX

このURLに、ブラウザからアクセスしてみてください。

すると、以下のようなjson形式のデータが返ってきます。

f:id:superharinezumi:20180614223533p:plain

itemsというキーの中に、動画の情報が配列で返ってきていることが分かります。新しい順で取得しているので、配列の1番目の要素のid > videoId が、最新の動画IDということになります。

これで無事に、最新の動画IDが取得できました! 実際の運用では、各種プログラミング言語からこのAPIを叩いて、jsonをパースする流れになるかと思います。

まとめ

APIを実行するまでの準備が色々と必要なため、少しハードルが高く感じたかも知れませんが、他のGoogleサービスのAPIを使うときにも応用できるはずなので、一度はやっておくと良いかなという気がしました。

API Reference  |  YouTube Data API (v3)  |  Google Developers

【Studio One】Addictive Drums 2 のMIDIデータを、パラのオーディオデータに変換する方法

f:id:superharinezumi:20180613222153p:plain

最近、DTMでAddictive Drums 2というドラム音源を使っているのですが、Studio One上で、パラのオーディオデータとして扱いたいという場面があり、調べたのでここにメモしておきます。

環境

macOS High Sierra, Studio One 3.5

手順

※ 以下、Addictive Drums 2は、AD2と表記します。

まずはMIDIデータを打ち込み、音源はAD2を選択しておきます。 f:id:superharinezumi:20180613215348p:plain:w600

次に、トラック名の右側に表示されている、鍵盤のアイコンをクリックし、AD2を開きます。開いたあと、右上のメニューから「KIT」を選択してください。すると、以下のような画面になるかと思います。 f:id:superharinezumi:20180613215402p:plain:w600

各チャンネルの下の方にある、「↓」アイコンをクリックし、「Separate Out [Pre Fader]」を選択します。プリフェーダーというのは、文字通り、フェーダーの前、という意味なので、AD2のミキサーのフェーダーに入る前の音を出力する、ということです。フェーダーを通った後の音を出力したい場合は、Post Fader の方を選択してください。 f:id:superharinezumi:20180613215418p:plain:w600

「Separate Out [Pre Fader]」を選択すると、「↓」アイコンがオレンジ色に光ります。この操作を、パラで書き出したいチャンネル全てで、繰り返します。すると、以下のようになります。 f:id:superharinezumi:20180613215424p:plain:w600

ここでAD2のウィンドウは閉じて、Studio One右下の「ミックス」をクリックし、左下の「インストゥルメント」から「AddictiveDrums2」の文字の部分をクリックすると、各チャンネルを選択するチェックボックスが表示されます。 f:id:superharinezumi:20180613215429p:plain:w600

出力したい各チャンネルにチェックを入れていくと、以下のように、チャンネルに対応するフェーダーが増えていきます。 f:id:superharinezumi:20180613215437p:plain:w600

この時点で再生すると、パラで再生されていることが確認できます。 f:id:superharinezumi:20180613215443p:plain:w600

ここで、トラックの部分を右クリックし、「オーディオトラックに変換」をクリックします。 f:id:superharinezumi:20180613215451p:plain:w600

設定を確認し、「OK」をクリックします。「インストゥルメントトラック状態を保持」にチェックを入れておくと、出力したオーディオデータから、MIDIデータに戻すことができます。 f:id:superharinezumi:20180613215458p:plain:w600

オーディオデータに変換できました! f:id:superharinezumi:20180613215503p:plain:w600

まとめ

という訳で、これでAD2のMIDIデータをオーディオデータ化できたので、外部にミックスをお願いするなど、幅が広がります。

bash/Linux: 自作コマンドの作り方

f:id:superharinezumi:20180607234625j:plain

自作のコマンドを作りたくなったので、メモとして残します。

検証環境

macOS High Sierra, bash 3.2.57

コマンドにしたいスクリプトを用意する

例として、西暦を和暦(平成のみ)に変換するbashスクリプトを作り、それをコマンドにしてみましょう。

heisei というファイル名で、以下のような内容を書いておきます。

year=$1
heisei=$(($year - 2000 + 12))
echo "H.$heisei"

$1 は、引数として渡される値です。 エラー制御も何もないひどい出来ですが、一応これでよしとしましょう。

実行するための準備

このファイルはただのシェルスクリプトなので、以下のように、sh で実行することもできます。

sh heisei 2018

ですが、やはり他のLinuxコマンド同様に、コマンド名のみで実行したいですね。 sh を省略するためには、以下の2点を行う必要があります。

  • ファイルに実行権限を付与する
  • パスが通っているディレクトリにファイルを移動する

まず、実行権限を与えます。

chmod u+x heisei

次に、パスを確認します。パスは、環境変数 $PATH で確認できます。コロンつなぎで見辛いため、tr などで改行に置換して出力すると見やすくなります。

echo $PATH | tr ':' '\n'

僕の環境では、/usr/local/bin にパスが通っていたので、ここに移動することにします。

mv heisei /usr/local/bin/

実行する

これで無事に、コマンド名のみで実行できます。

heisei 2018
# H.30

意外にも簡単に自作コマンドを作成できたので満足です。

コマンドラインからQRコード(画像)を作る方法

QRコードをコマンドラインから作成する方法がないか調べていたのですが、意外にも簡単にできることがわかったので、メモとして残しておきます。

検証環境

macOS High Sierra, bash 3.2.57

qrencode のインストール

使うのは、qrencode というパッケージです。 macの場合は、brewなどのパッケージ管理ツールを使ってインストールすると良いかと思います。

brew install qrencode

もちろんLinuxでも使えるので、aptやyumなどでインストールしましょう。

実際に作る

コマンドは、以下のように使います。-o オプションで、出力先のファイルを指定します。その後に、QRコードにしたい文字列を指定します。

qrencode -o qr.png 'QRTEST'

これで画像が完成しました。開いてみましょう。

open qr.png

f:id:superharinezumi:20180606221517p:plain

補足

qrencode https://github.com/fukuchi/libqrencode/

開発者は日本の方のようですね。僕もいつか作れるように頑張ります!

bash: seqコマンドで、連番を出力する

たまにですが、連番の数字を、さっと用意したいときがあります。何らかのプログラミング言語を使用して出力するのも手ではありますが、seq コマンドを使えば、コマンドラインですぐに出力することができます。

検証環境

macOS High Sierra, bash 3.2.57

書式

seq コマンドは、以下のような書式です。

seq [開始] [間隔] [終了]

例として、50 から 10刻みで、100 まで表示するには、以下のようにします。

seq 50 10 100

開始位置は、省略することができ、その場合は、1から開始します。

seq 5

正直、使いどころが難しいコマンドではありますが、覚えておくと便利です。

Perl: 配列の中に、特定の要素が含まれるかを確かめるには?

f:id:superharinezumi:20180604223400j:plain

「配列の中に、〇〇が含まれていたら〜」という条件分岐を書きたい時があります。 その場合、Perlではどのように書くのがスマートなのでしょうか。

grep を使う

grep を使うと、スマートに書くことができます。 例として、フルーツの名前の配列に、banana が含まれるかという条件を書いて見ましょう。

my @fruits = ('apple', 'banana', 'orange');

if (grep { $_ eq 'banana' } @fruits) {
    print 'banana is included !';
}

数行で実現することができました。

とはいえ、上の例は少し分かりづらいです。そもそも、grep は、ブレース(波括弧)の中に、条件式を書き、返ってくる値は、スカラで受け取る時は「条件を満たした要素の数」が返ってきます。そのため、以下のように、$count などの関数名でいったん受け取った方が、分かりやすいコードだと思います。

my @fruits = ('apple', 'banana', 'orange');

my $count = grep { $_ eq 'banana' } @fruits;

if ($count >= 1) {
    print 'banana is included !';
}

for を使う

もちろん、for を使っても書くことができます。その場合は、以下のように書くことができます。

my @fruits = ('apple', 'banana', 'orange');

my $is_banana_included = 0;

for my $fruit (@fruits) {
    if ($fruit eq 'banana') {
        $is_banana_included = 1;
        next;
    }
}

if ($is_banana_included) {
    print 'banana is included !';
}

まず、$is_banana_included のような、「含まれていたかどうか」というフラグを用意しておき、その後はfor でループしつつ、条件に一致したら、フラグに1を設定し、next でループを抜けます(それ以降のループは、意味がないため)。

まとめ

どちらを使うかは、好みによるかと思いますが、grep を使った方が、コードの行数は減らすことができます。ただし、for を使った方が、分かりやすいような気がしています。後から条件を増やしていく場合などは、for の方が向いているかと思います。