nanohablog

技術ブログ

Raspberry PiでAirPlay(2)

各種設定

1. セットアップ
Raspberry Pi をケースに入れ、SDSCカード、Wi-Fiアダプタ、モニタ、キーボード、マウスをセットし電源を入れる。
 
2. 初期設定
「Raspi-config」という設定画面が表示されるので各値を設定する。矢印キーとtabキーで移動、後から「sudo raspi-config」というコマンドで呼び出す事が可能。

 


・Change User Password - 自分が覚えやすいパスワードを設定
・Enable Boot to Desctop/Scratch - 起動時にデスクトップ版で起動するかコマンドライン版で起動するかを選択する、ここでは一度Desctopに設定する
 
3. Wi-Fiアダプターの設定
起動後、デスクトップにある「Wi-Fi Config」アプリケーションを開く。正しく接続されていれば、リストに自分が接続したアダプタが表示されるので選択します。正しく接続されているかブラウザ「midori」を開いて確認する。
 
4. SSHで接続する
デスクトップの「xterm」を開き、「ifconfig」コマンドを実行する。
「wlan0」の「inet addr:[ローカルIPアドレス]」の値を控え手持ちのPCのターミナルから「ssh [ローカルIPアドレス]」で接続を確認する。
 
5. オーディオ出力の設定

パッケージのアップデート(しばらく時間がかかるので放置)
sudo apt-get update
sudo apt-get upgrade

オーディオ出力の設定
amixer cset numid=3 1

6. AirPlay用のライブラリをインストールする

依存関係のライブラリのインストール
sudo apt-get install git libao-dev libssl-dev libcrypt-openssl-rsa-perl libio-socket-inet6-perl libwww-perl avahi-utils libmodule-build-perl

git clone https://github.com/njh/perl-net-sdp.git
perl-net-sdp
cd perl-net-sdp
perl Build.PL
sudo ./Build
sudo ./Build test
sudo ./Build install
cd ..

Shairportのインストール
git clone https://github.com/hendrikw82/shairport.git
cd shairport make

Shairportを起動
./shairport.pl -a AirPi
※-a オプションは表示名なので好きな名前を設定する。
各デバイスの「AirPlay」機能で設定した名前が表示されている&スピーカーを接続し音楽が再生される事を確認する。



7. 自動起動の設定

起動時に自動で立ち上がる様に設定
cd shairport
make install
cp shairport.init.sample /etc/init.d/shairport
cd /etc/init.d
chmod a+x shairport
sudo insserv shairport

起動スクリプトの起動オプションを変更
sudo nano shairport
- DAEMON_ARGS="-w $PIDFILE"
+ DAEMON_ARGS="-w $PIDFILE -a AirPi"

再起動して動作を確認
reboot

AirPlayで快適な音楽ライフを!



Special Thanks.
James Laird: https://github.com/hendrikw82
lifehacker.jp: http://www.lifehacker.jp/2013/03/130306raspberry_piairplay.html

 

Raspberry PiでAirPlay(1)



買ったまま暫く放置していたRaspberry Pi。だけど同僚から「iOSとSoket通信はどうか?」とアドバイスを頂きAirPlayサーバーにする事に。

AirPlay - Wikipedia
"AirPlayは、iTunesiPhoneiPod touchiPadで再生している音楽や動画、画像を、家庭内のネットワークを経由して他の機器でストリーミング再生する機能である。元々は、iTunesの音源をAir Mac Express経由でオーディオ機器に接続してストリーミング再生する旧AirTunesに由来する。アップルのiTunes10に初めて搭載された。"

必要なもの

1. Raspberry Pi 本体
TypeA、TypeBどちらでも良い。TypeBはTypeAと比べてメモリ容量が多いのとUSBポートが2つ付いてたり有線LANのポートが付いてたりする。今回はTypeAを使用。たまにケースやSDカードとのセットが安く売ってたりする様なので要検討。

2. SDSCカード
今回はSanDiscの10GB、class10のmicroSDカードをSDSCアダプターに差し替えて使用(なぜかmicroSDカードが使えると勘違い、、、)。

3. Wi-Fiアダプター
今回はBUFFALOのWLI-UC-GNM IEEE802.11b/g/nのものを使用(無線LANは正式にはサポートして居らず接続が途中で切れる事がある。同じくBUFFALOのEEE802.11a/nのものを使用したが認識せず)。

4. SDカードリーダー
SDSCカードにOSをインストールする為に必要。

5. USB電源
今回は取り急ぎKindleに付属していたUSBケーブル&電源を使用。

6. iPhone or iPad or Mac
今回はiPhone5s/5 iOS 7.0.4、Macbook air 10.9.1にて動作確認。

7. スピーカーとオーディオケーブル

8. モニタ、HDMIケーブル、USBハブ、USBキーボード、USBマウス
作業用。

9. ケース
好みのものを用意する。


OSのインストール

quick-start-guide(公式)

1. 公式サイトよりお好みのOSをダウンロードする
今回は2014-01-07-wheezy-raspbian.zipを使用した。

2. SDカードをフォーマットする
Mac場合はSD Association's Formatting Tool をダウンロード後、説明にしたがってフォーマットする。

3. OSをSDカードにインストールする
ターミナルを起動しコマンドを実行。

ダウンロードディレクトリに移動する

cd Downloads


SHA-1 Checksumを確認する

shasum 2014-01-07-wheezy-raspbian.zip
9d0afbf932ec22e3c29d793693f58b0406bcab86unzip


zipファイルを解凍する

unzip 2014-01-07-wheezy-raspbian.zip


SDカードのマウントディレクトリを確認する

df -h

※私の環境では「/dev/disk1s1」

SDカードをアンマウントする

sudo diskutil unmount /dev/disk1s1


ディスクイメージをSDカードにコピーする

sudo dd bs=1m if=2014-01-07-wheezy-raspbian.zip of=/dev/rdisk1

※「/dev/disk1s1」の先頭に「r」を付加し末尾の「s1」を削る

コピーされるのを待ちレスポンスが返されれば完了。



>> 次へ「Raspberry PiでAirPlay(2)


Delayed :: Cron :: Job の使用方法

公式 https://github.com/codez/delayed_cron_job#changing-the-schedule

Delayed :: Cron :: Job とは

Rails用のGemでDelayed :: Job の拡張機能であり、ジョブを実行式をcron形式で設定できます。

インストール

  1. Gemfile に以下の行を追記します。

    gem delayed_cron_job

  2. bundle インストールを実行します。

    $ bundle

  3. migration ファイルを作成、実行します。 ※ delayed_job_active_recordを使用している場合、delayed_jobs テーブルに cron カラムが追加されます。

    $ rails generate delayed_job:cron $ rails db:migrate

使用方法

以下の様に Delayed::Job クラスを呼び出し、引数に実行したいJob、実行時間を記載します。

Delayed::Job.enqueue(MyRepeatedJob.new, cron: '15 */6 * * 1-5')

若しくは ActivieJob を使用して以下の様に記述します。

MyJob.set(cron: '*/5 * * * *').perform_later

スケジューリング

通常、アプリケーションをデプロイするタイミングで、全てのJobの設定が必要になります。これを以下の様なスーパークラスを作成する事で簡単に行うことができます。

Custom CronJob superclass

app/jobs/cron_job.rb:

# Default configuration in `app/jobs/application_job.rb`, or subclass
# ActiveJob::Base .
class CronJob < ApplicationJob

  class_attribute :cron_expression

  class << self

    def schedule
      set(cron: cron_expression).perform_later unless scheduled?
    end

    def remove
      delayed_job.destroy if scheduled?
    end

    def scheduled?
      delayed_job.present?
    end

    def delayed_job
      Delayed::Job
        .where('handler LIKE ?', "%job_class: #{name}%")
        .first
    end

  end
end

CronJobから継承するジョブの例

app/jobs/noon_job.rb:

# Note that it inherits from `CronJob`
class NoonJob < CronJob
  # set the (default) cron expression
  self.cron_expression = '0 12 * * *'

  # will enqueue the mailing delivery job
  def perform
    UserMailer.daily_notice(User.first).deliver_later
  end
end

スケジューリングトリガー

一番初めにJobをDBに登録してスケジューリングを行う必要があります。手動で行いたくない場合、以下のようなJobクラスを作成してrails db:* クラスにフックする事が可能です。

lib/tasks/jobs.rake:

namespace :db do
  desc 'Schedule all cron jobs'
  task :schedule_jobs => :environment do
    # Need to load all jobs definitions in order to find subclasses
    glob = Rails.root.join('app', 'jobs', '**', '*_job.rb')
    Dir.glob(glob).each { |file| require file }
    CronJob.subclasses.each(&:schedule)
  end
end

# invoke schedule_jobs automatically after every migration and schema load.
%w(db:migrate db:schema:load).each do |task|
  Rake::Task[task].enhance do
    Rake::Task['db:schedule_jobs'].invoke
  end
end

以下のコマンドを実行する事でJobがDBに登録されて、設定時刻に実行されます。

rails db:migrate rails db:schema:load rails db:schedule_job

M1 Mac に Rails 環境を構築する

home brew

https://brew.sh/index_ja

インストール

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

rbenv

https://github.com/rbenv/rbenv#installation

インストール

brew install rbenv brew upgrade rbenv ruby-build rbenv init RUBY_CFLAGS=-DUSE_FFI_CLOSURE_ALLOC rbenv install [version] rbenv global [ver] rbenv local [ver] ruby -v

mysql

インストール

brew install --build-from-source mysql@[ver] echo 'export PATH="/opt/homebrew/opt/mysql@5.7/bin:$PATH"' >> ~/.zshrc source .zshrc brew services restart mysql@[ver] mysql -uroot

メモ

If you need to have mysql@5.7 first in your PATH, run:

For compilers to find mysql@5.7 you may need to set:
  export LDFLAGS="-L/opt/homebrew/opt/mysql@[ver]/lib"
  export CPPFLAGS="-I/opt/homebrew/opt/mysql@[ver]/include"

For pkg-config to find mysql@5.7 you may need to set:
  export PKG_CONFIG_PATH="/opt/homebrew/opt/mysql@[ver]/lib/pkgconfig"

nodebrew

https://github.com/hokaccha/nodebrew

インストール

brew install nodebrew echo 'export PATH=$HOME/.nodebrew/current/bin:$PATH' >> .zshr source .zshrc

Node.js

インストール

nodebrew setup nodebrew compile v[ver] nodebrew use v[ver] node -v

Yarn Version Manager (yvm)

https://github.com/tophat/yvm

インストール

brew install tophat/bar/yvm

Run the following command to configure your shell rc file

node "/opt/homebrew/opt/yvm/yvm.js" configure-shell --yvmDir "/opt/homebrew/opt/yvm" See "/opt/homebrew/opt/yvm/.config" for examples.

If you have previously installed YVM, link the versions folder to allow all brewed YVM access to the managed yarn distributions ln -sF ~/.yvm/versions /opt/homebrew/opt/yvm

yvm version

brew upgrade yvm

yarn

インストール

yvm install [ver]

以下の様に表示された場合、一度ディレクトリを削除する EEXIST: file already exists, mkdir '/opt/homebrew/Cellar/yvm/4.1.4/versions'

yvm use [ver] yarn -v

puma-dev

インストール

brew install puma/puma/puma-dev puma-dev -install -d test vim ~/.puma-dev/oatnd 3000 と記載する

rails

インストール

active_storageのイメージデータ

storage.zip
    解凍してルート直下に配置する

gem mimemagicのライセンス問題対応

https://qiita.com/ShioriPeace/items/9c50d3bc90bbf7101c0a

brew install shared-mime-info gem install mimemagic -v '0.3.10' --source 'https://rubygems.org/'

gem mysqlのインストールエラー対応

https://qiita.com/HrsUed/items/ca2e0aee6a2402571cf6

bundle config --local build.mysql2 "--with-ldflags=-L/opt/homebrew/opt/openssl@1.1/lib" bundle config --local build.mysql2 "--with-cppflags=-I/opt/homebrew/opt/openssl@1.1/include"

bundle install

https://bundler.io/man/bundle-install.1.html gem install bundler bundle config set --local path 'vendor/bundle' bundle install

webpacker インストール

bundle exec rails webpacker:install

Rails の起動

bundle exec rails s