好きなCDを紹介するためにプログラミングの記事をちまちま書いてます → 記事一覧

VirtualDJをNumark Party Mix用にいい感じマッピング

DJコントローラ書いました。

Numark ミラーボール付き 2デッキDJコントローラー Virtual DJ LE付属 Party Mix

Numark ミラーボール付き 2デッキDJコントローラー Virtual DJ LE付属 Party Mix

「光る板」ことNumarkのPartymix。安い!小さい!光る!

最高なんだけど、EQがMIDとLOWしか無かったり、フィルターが摘みでできなかったり、 全体的にボタンとつまみがもう少し欲しいなぁという感じになりました。

Partymix、みんなどんな風に使ってるのかなと思って調べてたら、こんな動画が出てきた。

www.youtube.com

オタレコで買えばよかった!!!!!!!!!!!!!!!

PAD4を押してる間だけツマミの機能を変えたい

  • GAIN -> EQ HIGH
  • EQ TREBLE -> EQ MID
  • EQ LOW -> フィルター

PAD4が使えなくなるとそれはそれで不便なのでPAD4をスイッチにして

  • PAD1 <-> PAD4
  • PAD2 <-> PAD5
  • PAD3 <-> PAD6

こういう感じで入れ替わって欲しい。

ついでにエフェクトもツマミでやれるならやりたい

やっていく

スクショとるの面倒すぎたのでとってないです。
VirtualDJのスキンがPartyMix用になってる人はデフォルトに戻します。

VirtualDJの左上の歯車のマーク > コントローラ

になってると思うので、マッピングをカスタムマッピングに変更して、
(必要なら適当に名前をつけて)保存ボタンを押すとxmlファイルが生成される。 僕のPCでは、Documents/VirtualDJ/Mappers/Numark Party Mix - shivaduke.xml が該当ファイル

xmlを弄ってもいいし、VirtualDJから弄ってもいいです。

今回弄ったところ(なんかエスケープ?されて見にくい)

<map value="EQ_LOW" action="shift ? filter : eq_low" />
<map value="EQ_HIGH" action="shift ? eq_mid : eq_mid &amp; eq_high" />
<map value="GAIN" action="shift ? eq_high :  gain" />
<map value="PAD1" action="var &quot;my_pad&quot; ? pad 4 : pad 1" />
<map value="PAD2" action="var &quot;my_pad&quot; ? pad 5 : pad 2" />
<map value="PAD3" action="var &quot;my_pad&quot; ? pad 6 : pad 3" />
<map value="PAD4" action="toggle &quot;my_pad&quot; &amp; shift" />

PAD4はshift & toggle "my_pad" を指定

  • shift :押している間shift変数に1が入って離すと0になる
  • toggle "my_pad""my_pad"という名前の変数の01をスイッチする

"my_pad"変数を使ってる理由

shiftはもともと使われている変数で、
例えば Hot Cueモードで PAD1 + shift をすると
登録されている hot cueが削除されます。
トラックパッドだと右クリック) なので、PAD切り替えにshiftを使うのはよくない!し、
スイッチ的に切り替えたいので、別の変数にしてます。
toggleすると、ONのときはPADが勝手に光ってくれるので
コンラだけで判定できて素敵。

変数の中身はvar "my_pad"で参照できるので、それで三項演算子
動作を切り替えてるだけ。

エフェクトもPADに変数渡しといて、EQ LOWをその間だけエフェクトツマミにする
みたいなことが可能なのですが、少し複雑になるので、悩み中。

ノイズとかはツマミでやるとカッコいいので、やりたい。

PADの編集

デフォルトスキンのパッドのとこの [HOT CUES ▼] を右クリックすると編集画面にいけます

PAD系はPAD PAGEというページ(Hot Cue、Effect、Loopなど)が複数あって、
各ページごとのPAD1PAD8shift + PAD1shift+ PAD8の合わせて16枚の動作が指定できます。
上の設定にするとPAD1〜PAD6が使えるので好きな機能をつけるといいと思う。
僕は、LoopのPAD4を loop_halfにして、PAD5を loop_outにしました。

悩み

コントローラのマッピング画面、ほぼ全てのボタンがあるんだけど、 PAD MODE切り替えるボタンが無くて困ってる。

追記(PAD4の改善)

PAD4を押してフィルターとかを弄ったときに他のPADの番号が変わってしまうのが 残念なので、長押しした場合は何もしないように修正した。

<map value="PAD4" action="shift &amp; holding 250ms ? nothing  : toggle &quot;my_pad&quot;" />
<map value="LED_PAD4" action="var &quot;my_pad&quot;" />
  • PAD4の操作は、押している間shift = 1にして、250ms 以内に離すと "my_pad"変数の01を入れ替える。
  • holding は指定した時間(デフォルトは500ms)長押しした場合にtrueを返す。
  • LED_PAD4 にPAD4のLEDが点灯する条件を指定できるので、"my_pad"変数を指定するといい感じに点灯する。

追記(Noiseフィルターをツマミでやる)

EQ_HIGHのツマミをデフォルトでeq_midにしておいて、shift + EQ_HIGHは一旦何もしないことにする。

<map value="EQ_HIGH" action="shift ? nothing : eq_mid : eq_mid />

PADの編集画面にいって[New page]ボタンを押すと新しいPADページが作成されるので My FXみたいな名前をつける。 とりあえずPAD1PAD3はデフォルトのPM FXと同じようにGrid、Flanger、Phaserを指定しておいて PAD4にNoiseを指定してみる。

VirtualDJ/Pads/My FX.xmlが作成されるので、これを弄る。

<?xml version="1.0" encoding="UTF-8"?>
<page name="My FX">
    <pad1 name="GRID">effect_active &apos;Beat grid&apos;</pad1>
    <pad2 name="FLANGER">effect_active &apos;Flanger&apos; &amp; effect_slider &apos;Flanger&apos; 1 90% &amp; effect_slider &apos;Flanger&apos; 2 75%</pad2>
    <pad3 name="PHASER">effect_active &apos;Phaser&apos; &amp; effect_slider &apos;Phaser&apos; 1 75% &amp; effect_slider &apos;Phaser&apos; 2 75%</pad3>
    <pad4 name="NOISE">set &quot;effect1&quot; 1 while_pressed &amp; effect_active 1 &apos;Noise&apos; while_pressed &amp; effect_slider 1 1 50% &amp; effect_slider 1 2 30%</pad4>
</page>

My FXモードでPAD4を押すとエフェクト1にNoiseをパラメータを初期化してセットして 押している間だけ"effect1" = 1 & エフェクトONにする。

あとはエフェクトPADをPM FXMy FXに変更してツマミの処理を変える

<map value="EFFECT_MODE" action="pad_page &apos;My FX&apos;" />
<map value="EQ_HIGH" action="shift ? nothing : var &quot;effect1&quot; ? effect_slider 1 : eq_mid" />

「たのしいRuby第5版」をよんでいる

経緯

Rubyの勉強は"月額980円で様々な言語の簡単なレッスンが受けられる素晴らしいサービス"であるところの Progate でやったくらいで、あとはわからんことがあったらggる、みたいな感じだったので、そろそろ偉い人が系統立てて書いた本を読まないと、なんだかむずむずして落ち着かないぞ。。。ということで、本を読むことにした。

以前Railsとかを仕事で書いていたらしい師匠に、「何かいい本ありますか?」と聞いたら『たのしいRuby』がよいと言われたので、買って読んでいる。ペーパーレスの時代に逆行して本を買った。分厚い。。。

たのしいRuby 第5版

たのしいRuby 第5版

(このブログにはアフィ的なものはありません)

第6版が2019年3月11日に出るらしいです。

たのしいRuby 第6版

たのしいRuby 第6版

感想

この本は4部構成になっていて、

  1. はじめてのRuby
  2. 基礎を学ぼう
  3. クラスを使おう
  4. ツールを作ってみよう

という感じです。 クラス、モジュール、ブロック、例外とか基礎的なことの説明が書かれてる第2部まで読んだ。第3部からは具体的なクラス(Stringとか)のメソッドとかを触ると思われる。 めちゃくちゃ読みやすい。大変勉強になる。若干たのしい。 特にブロックは特殊なので、一度きちんと理解しとかないとよくないな、と思いました。 Railsチュートリアルやりつつこの本も1日1章ずつとか読んどくといいのではないだろうか。

今回の一枚

REDLINE DAY REMIX

REDLINE DAY REMIX

REDLINEの劇伴のリミックスアルバム。記憶が正しければ、映像に合わせて劇伴が書かれてるんだったと思う。 OSTもめちゃいいんだけど、こっちもすごくいい。マシンヘッドのテーマのリミックスがすごい良い。 And it's so beautifulのリミックスもとても良い。語彙がなさすぎて良いしか言えないけど、良いです。

あと鉄コン筋クリートのリミックスアルバムも買ってしまったのだけれど、これもすごいよかった。

鉄コン筋クリートREMIX:鉄筋コンクリート

鉄コン筋クリートREMIX:鉄筋コンクリート

RailsのActiveResourceでの例外の扱い

はじめに

ActiveResourceというのはAPIをあたかもdbのように扱うことを可能にするRailsの機能である。 すごい便利だけど、ActiveRecordと同じノリで呼びまくるとすごい遅くなっちゃう(当たり前)ので注意が必要っぽい。

使い方

こういう感じでモデルを作る

class User < ActiveResource::Base
    self.site "https://api.hogehogehumans.com"

でdbと同じノリでコントローラとかで使う

def show
    id = params[:id]
    @user = User.find(id)
end

たくさん解説記事があるし、ソースコードのREADMEも読むと良さそう

ails/activeresource: Connects business objects and REST web services

困ったこと

APIを叩いたときに、そもそもリソースが無かったり、ベーシック認証に失敗したり、いろいろ例外が起こって困る。

  • 401 - ActiveResource::UnauthorizedAccess
  • 404 - ActiveResource::ResourceNotFound

Ajaxで叩いたアクション内で例外が発生すると

Completed 500 Internal Server Error

とログに残るのだけど、例外ごとに処理とかを書きたい。

やりかた

発生する例外たちは

activeresource/lib/active_resource/exceptions.rb

を頑張って眺めたところ ActiveResource::ConnectionError というクラスの子クラスになっている。エラーメッセージとかコードとかは @message@response を見ればよいっぽい。

例外処理はRubyでは begin rescueをやるっぽいので

def show
    id = params[:id]
    begin
        @user = User.find(id)
    rescure => error
        render :plain => error.message
    end
end

とかする。エラーごとに処理を変えるときは、rescue の後に例外クラスを指定すればよくて

def show
    id = params[:id]
    begin
        @user = User.find(id)
    rescure => ActiveResource::UnauthorizedAccess => error
        #Unauthorizedのときの処理
    rescure => ActiveResource::ResourceNotFound => error
        #Not Foundのときの処理
    ....
    end
end

とする。レスポンスコードとかは error.response.code を見ればよくて

def show
    id = params[:id]
    begin
        @user = User.find(id)
    rescure => error
        code = error.response.code.to_i
        case code
        when 404 then
            #Not Foundのときの処理
        when 401 then
            #Unauthorizedのときの処理
        ....
        end
    end
end

みたいにすることもできます。

今回の一枚

Mouth To Mouse

Mouth To Mouse

syrup16gのMouth to Mouse。高校3年の時のクラスメイトがsyrup16gの熱烈なファンで色々と聞かせてもらったときに、メリモがかっこいいなと思ったので、学校帰りに買ったのだと思う。ふと思い出して、聴いたらやっぱりかっこいいですね。 ちょっと前に復活したみたいな話を聞いたけど、まだ聴けてない。

Railsでomniauthを使ったログイン機構の統合テスト

はじめに

omniauthはtwitterとかfacebookとかのoauth認証を可能にしてくれるgem。 細かい使い方とかはなんかggったりしてください。 今回は、ログインした後の処理とかをテストしたりしたい。統合テストではsessionを直接いじれないので、コントローラのアクションを叩いてsessionに値をセットしたりしないといけない。

参考URL

Integration Testing · omniauth/omniauth Wiki

やっていく

テストを作成

$ rails g integration_test users_login

テスト実装

test/fixtures/users.yml にモック用のユーザーを設定する

tanaka:
  name: tanaka
  screen_name: tana_ka
  twitter_id: 123545
  encrypted_api_key: 

test/integration/users_login_test.rb が生成されてるので、こんな感じで書いていく。

require 'test_helper'

class UsersLoginTest < ActionDispatch::IntegrationTest
  #テスト前に実行する処理
  def setup
    #test/fixtures/users.ymlに書いた:tanakaをセット
    @user = users(:tanaka)
    
    #omniauthのテスト用オプション
    #/auth/twitterを叩くとtwitterに飛ばずに
    #/auth/twitter/callbackにリダイレクトされるようになる
    OmniAuth.config.test_mode = true
    
    #モックを作成。@tanakaに合わせて作っておく
    #request.env['omniauth.auth']に指定したのが入ると思うとよい。
    OmniAuth.config.mock_auth[:twitter] = OmniAuth::AuthHash.new({
      :provider => 'twitter',
      :uid => '123545',
      :info =>  { :name => "tanaka", :nickname => "tana_ka"}
    })
  end
  
  test "login and logout" do
    get root_path
    
    #ログインリンクがあるか確認
    assert_select "a[href=?]", "/auth/twitter"
    get "/auth/twitter"
    assert_redirected_to auth_twitter_callback_path
    follow_redirect!
    
    #ログインに成功してユーザーページへリダイレクト
    assert_redirected_to user_path(@user.id)
    follow_redirect!
    
    #ログイン後、ログアウトへのリンクがあるかチェック
    assert_select "a[href=?]", logout_path
    delete logout_path
    assert_nil session[:user_id]
  end
end

今日の一枚

Future Sound of Paris Vol.2

Future Sound of Paris Vol.2

Future Sound of Paris Vol.2 パリに行った時に中古ショップで買った。 すごいよくて最近ずっと家で流してる。

Rails 5.2でjQueryを使わずにAjaxをやるいくつかの方法

はじめに

ここでは、コントローラのことを”コンラ”と呼びます。ご了承ください。


やりたいこと

  1. ボタンを押す
  2. 非同期でコンラのアクションを叩く
  3. アクションのレスポンスを使ってビューを更新する

やるべきこと

この記事では次のように【送信】【アクション】【後処理】の3つに分けることにする

  1. 【送信】フォームやらボタンクリック時に非同期でリクエストを送るようにする(js)
  2. 【アクション】叩かれるアクションおよびレンダリングするビューなど(rails)
  3. 【後処理】叩いたアクションのレスポンスを使ってビューを更新する(js)



やりたいこととやるべきことが一致する時、世界の声が聞こえる。

(参照:STAR DRIVER 輝きのタクト)


注意

Ruby on RailsでのAjaxのやり方は何個かあって、例えば

  • form_with などのヘルパ関数を使うことで【送信】パートをjsから切り離す
  • コンラのアクションで【後処理】を書いた js.erbレンダリングする
  • Rails.ajax を使うことで【送信】パートを書く(XMLHttpRequest を扱わなくてよい)



準備

コンラ作成

$ rails g controller hoge index

ルーティング

Rails.application.routes.draw do
  get 'hoge/index' => 'hoge#index'
  post 'hoge/ajax' => 'hoge#ajax'
end


例1

【送信】app/views/hoge/index.html.erb

form_with というヘルパ関数を使うと勝手に非同期通信するフォームを生成してくれる。ちなみに送信ボタンだけ生成する場合は、button_to 関数を使った方がスマートな気がする(button_to - リファレンス - - Railsドキュメント)。

<%= form_with url: "/hoge/ajax" do |f| %>
    <%= f.submit "送信"%>
<% end %>

<div id="result"></div>


【アクション】app/controllers/hoge_controller.rb

ajaxアクションはアルファベットを8つランダムに選んで並べた文字列を@testに格納したあとに、app/views/hoge/ajax.js.erbレンダリングする。ここのjsをcoffeeスクリプトでやる場合は、ファイル名をajax.coffeeにすると良いらしい。

class UsersController < ApplicationController
  def index
  end
  
  def ajax
    @text = ("a".."z").to_a.shuffle[0..7].join
  end
end


【後処理】app/views/hoge/ajax.coffee

上記の通りjsで書く場合はajax.js.erbにする。 jsに翻訳したいときはjs2coffeeが便利。

r = document.getElementById('result')
r.innerHTML = "<%= @text %>"



例2

【送信1】app/views/hoge/index.html.erb

ビューは普通に書く

<button id="myButton">送信</button>

<div id="result"></div>


【送信2】&【後処理】app/assets/javascripts/hoge.coffee

jsの方にAjax処理を書く。 イベントリスナーとかの作法を全然知らないので馬鹿なことしてたら教えてください。

Rails.ajaxrails-ujsというgemの機能だったけど、 Rails5.1.0からはRails自身に内包されてるのでGemfileに書く必要はない(rails-ujsのGitリポジトリ)。 普通にjsで書くなら、XMLHttpRequest (XMLHttpRequest - MDN) を使うはずで、 実際 Rails.ajax の中身で使ってる。

document.addEventListener 'DOMContentLoaded', ->
  button = document.getElementById('myButton')
  button.addEventListener 'click', ->
    Rails.ajax
      type: 'POST'
      url: "/hoge/ajax"
      dataType: "html"
      success: (response) ->
        console.log('success')
        r = document.getElementById('result')
        r.innerHTML = response.body.innerHTML
        return
      error: (response) ->
        console.log('error')
        return
    return
  return

これだけで、ボタンをクリックすると/hoge/ajax がPOSTメソッドで叩かれる。

Rails.ajax メソッドの引数は連想配列で色々指定する。 今回はアクションでパーシャル(html.erb)をレンダリングするので、dataType: "html" としたけど、例1のように js.erb や coffee をレンダリングする場合は dataType: "script" にすることに注意。

  • type: "GET","POST"などのメソッドを指定
  • url: "叩きたいURL"
  • data: パラメータを "key1=value1&key2=value2"の形で指定
  • dataType: "*","text","html","json","script"のいずれか。例1のようにjs.erb(coffee)をレンダリングするときは script を指定する。
  • success: 【後処理】無名関数を書いてもいい。
  • error: 【後処理】通信失敗時に実行する関数を指定
  • beforeSend: 多分リクエスト送信前に実行して欲しい関数
  • crossDomain: 多分 true or false

【アクション1】app/controllers/hoge_controller.rb

class UsersController < ApplicationController
  def index
  end
  
  def ajax
    @text = ("a".."z").to_a.shuffle[0..7].join
    render partial: "result", locals: {text: @text}
  end
end

【アクション2】app/views/hoge/_result.html.erb

(この程度ならhtmlをレンダリングする意味ない)

This is a new random password for you : <%= text %>



例3

この例ではRails.ajaxを書くけど、coffeeをレンダリングしてみる。

【送信1】app/views/hoge/index.html.erb

これは例2と同じなので省略。

【送信2】app/assets/javascripts/hoge.coffee

アクションでjsをレンダリングするので、success時の処理は何も無くてよい。

document.addEventListener 'DOMContentLoaded', ->
  button = document.getElementById('myButton')
  button.addEventListener 'click', ->
    Rails.ajax
      type: 'POST'
      url: "/hoge/ajax"
      dataType: "script"
      success: (response) ->
        console.log('success')
        return
      error: (response) ->
        console.log('error')
        return
    return
  return

【アクション1】app/controllers/hoge_controller.rb

class UsersController < ApplicationController
  def index
  end
  
  def ajax
    @text = ("a".."z").to_a.shuffle[0..7].join
    render "update_result"
  end
end

【アクション2】app/views/hoge/_result.html.erb

パーシャルなんだけど、アクションでレンダリングしたcoffee内で再びレンダリングする。

This is a new random password for you : <%= text %>

【後処理】app/views/hoge/update_result.coffee

jsが分断されて落ち着かないし、賢いやり方じゃない気がする。【送信】パートに form_with などのヘルパ関数を使う場合にはいいのかもです。

r = document.getElementById('result')
r.innerHTML = "<%= j render partial: 'result', locals: {text: @text} %>"



参考にしたもの


今回の一枚

L'été

L'été

  • Snail's House
  • エレクトロニック
  • ¥1500

めちゃ好き。ダイスケリチャードによるジャケもめちゃ好き。

Rails + Challonge API を触ってみた感想

注意

今回は進捗無しの日記です

Challogne とは?

challonge.com
対戦ゲームの大会でトーナメント進行をサポートする素晴らしいWebサービス.同系統の(より多機能な)サービスに smash.gg というのもあります.

Challonge API

Challonge API v1 Documentation - Challonge
いわゆるREST API というやつで,PHPRubyPythonJavascript用のラッパーが用意されています.REST API については,この記事を読んで雰囲気を知りました.
0からREST APIについて調べてみた

Challogne のようなサービスを自前で作ろうとすると,db に tournaments テーブルやら participants テーブルやら,matches テーブルを作るというのが容易に想像できるけど,このデータたちを外部から触るの仕組みがAPIで,RESTというのはAPIの作り方(既約? or アーキテクチャ?)の一つらしい.

今回は Rails の練習なので,ruby 用の gem を使いました.
GitHub - challonge-community/challonge-ruby-gem: Utilize the Challonge! API with preconfigured ActiveResource classes.


感想

なんか重い.仮想サーバなので xserver でやってみないとわかんないけど,とりあえず重い.

Rails には ActiveResource という機能があって,これはREST APIを db(つまりActiveRecord)と同じノリで使えるという素晴らしいものである.Challogne API の gem は ActiveResource を使ってるので,APIリクエストをdbと同じノリで使いまくったら,なんかえらい重い...APIコールなので当たり前か.

今後やること

  • 重い理由を調べる方法を学ぶ(なんか速度を測るやつ)
  • json のパースが遅い可能性がある
  • API リクエストの回数をキャッシュを使ったりして減らす
  • ユーザーには自分の db からデータを渡して裏で db に API の情報を反映させたりする?

これまで機能面しか考えてなかったので,速度を意識するよいきっかけになりました.


今回の一枚

spotify 有料会員になったので,最近ウハウハです.

Fantome

Fantome

宇多田ヒカルが 2016 年に出したアルバムで,なんかすごい海外でも売れたらしい(日本語の歌ばかりなのに!).すごい""日本の唄""って感じで,とても綺麗な優しいアルバムだなぁと思いました.こういうのも出来るのか.最近新しいアルバム「初恋」を出したそうです.気になる.

WindowsでRails5にBootstrap4を入れようとして苦しんだ

タイトル通り.日本語で解説してる記事とgemのREADMEを読みながらやったけど,いっぱい失敗して泣きそうになった.

Railsアプリで Bootstrap 4 を利用する
GitHub - twbs/bootstrap-rubygem: Bootstrap 4 rubygem for Rails / Sprockets / Hanami / etc

エラー:ActionView::Template::Error (undefined not callable)

言われたとおりにすると,エラーが起こる.
app/view/layouts/application.html.erb というレイアウトの css と js を読み込んでる2行

<%= stylesheet_link_tag    'application', media: 'all', 'data-turbolinks-track': 'reload' %>
<%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %>

で問題が起こってるらしい

答え gemfile から duktape を消す

何が問題なのか理解してないんだけど,そうするといいと書いてました
Rails5.2.1+Bootstrap4でActionView::Template::Error (undefined not callable)が出た場合 | 魔法使いレベル6

# gem 'duktape'

エラー:JScript runtime does’t support ES6. Please update or replace your current ExecJS runtime.

エラーがどんどん出て泣きそうになった

答え jsのランタイムをNode.jsにする

KapilSachdev commented on 23 Jun

duktape has become the default JS Runtime in Windows sometime ago in rails/rails#30014.

If you look into other similar issues involving Exejs you might found out that duktape is actually the culprit (however its execjs here for definition of duktape context).
If you change your runtime environment to use Nodejs, the error would be resolved, as the case with @yasunari89

# In `config/boot.rb`
ENV['EXECJS_RUNTIME'] = 'Node'

ExecJS::ProgramError after adding bootstrap gem · Issue #157 · twbs/bootstrap-rubygem · GitHub


まず config/boot.rb に次の一行を追加します

ENV['EXECJS_RUNTIME'] = 'Node'

Node.jsというのをインストールしてない場合は,Node.jsのページで簡単にインストールできます.


今回の1枚

Panty & Stocking with Garterbelt THE WORST ALBUM

Panty & Stocking with Garterbelt THE WORST ALBUM

Panty&Stocking with Garterbelt THE WORST ALBUM.アニメのOSTのリミックス版でドラマCD的な会話劇も収録されてます(ピー音無し).D City Rock という曲は原曲がめちゃかっこいい(PVもかっこいい)んですが,このアルバムに収録されてるリミックスも超かっこいい...