Labyrinth of Wisdom

-This is My Archive-


【Discogs】リリース作品の別バージョン作成について(マスターリリース)

はじめに

同じ作品でも初回限定版や各国にローカライズしたバージョン(日本版など)があると思います。

Discogsではそのバージョン違いを、マスターリリースという機能を使ってまとめることができます。 今回はそのマスターリリースの使用方法について説明していきたいと思います。

サンプルとしてKendrick Lamarのページを使います。

マスターリリースについて

f:id:Labyrinth_of_Wisdom:20170608095022p:plain

「Overly Dedicated」という作品はMP3のデータ配信とCDrでのリリースがあったようです。 近年よくある手法で、要は媒体が違うだけですね。

マスターリリースを使えばこのような表示方法にすることが可能になります。

f:id:Labyrinth_of_Wisdom:20170608095954p:plain

ページのサイドバーに「マスターリリースを作成」というボタンがあります。 これをクリック。

f:id:Labyrinth_of_Wisdom:20170608100128p:plain

すると上記のような画面になります。 ここでまとめたいリリース作品にチェックを入れ、「作成する」ボタンを押します。

今回は仮に「HiiiPoWeR」という作品を対象にします。 (実際は別バージョンは出ていないので作成しません)

また、マスターリリース作成時にはまとめたいリリース作品のURL最後尾にある7桁の数字が必要になるので、別途メモをしておいてください。

*HiiiPoWeR URL*
https://www.discogs.com/ja/Kendrick-Lamar-HiiiPoWeR/release/3776731

f:id:Labyrinth_of_Wisdom:20170608102940p:plain

キーリリース項目に、メインとなるバージョンのURL最後尾7桁の数字を入力します。

リリース項目に、メインバージョンも含めた全てのバージョンの数値を入力していきます。

これでマスターリリースが作成され、バージョン違いが表示されるようになります。

リリースのコピーについて

マスターリリースの作成方法は分かったけど、同じようなリリース何個も作成しないといけないの?となると思うので、リリースのコピー方法についても解説します。

f:id:Labyrinth_of_Wisdom:20170608104115p:plain

「リリースを編集」をクリックします。

f:id:Labyrinth_of_Wisdom:20170608104209p:plain

「下書きへコピー」をクリックします。

f:id:Labyrinth_of_Wisdom:20170608104506p:plain

アカウントメニューの「下書き」をクリックします。

f:id:Labyrinth_of_Wisdom:20170608104656p:plain

するとコピーしたリリースの下書きが作成されているので、「編集/送信」をクリックしてリリースを編集していきます。

【Discogs】アーティストの別名義登録について

Discogsでアーティストの別名義を登録したい時があると思いますが、その方法についてメモします。

大きく分けて、[エイリアス][バリエーション]と呼ばれる二つの方法があります。

サンプルとして使いやすいので、RhymesterMummy-D氏のDiscogsページを使用します。

f:id:Labyrinth_of_Wisdom:20170531113805p:plain

www.discogs.com

エイリアス

エイリアス…別名

[Mummy-D]という名義は主にMC/Rapper時に使用されるメインとなる名義です。

それとは別に氏はProducerとして[Mr.Drunk]という名義も持っています。

さらに作詞の時等は本名の[Daisuke Sakama]という名義も使います。

このように、同一人物ですが全く違う名前を持っているアーティストにはエイリアスを設定します。

設定方法としては、別名義のアーティスト名をエイリアス欄に記入するだけ。 設定が終わると、エイリアス欄にで別名義のリンクが作成され、クリックするとその別名義のページに飛びます。

因みに、別名義でのアーティストページが存在しない場合は、記入してもエラーになります。

バリエーション

氏のバリエーションの項目を見てみてください。 同じような、しかし微妙に異なる名義がいくつも並んでいるのが分かりますか?

氏は客演も沢山あるのですが、曲によってはグループ名を表記していたりすることもあるので、本来の[Mummy-D]とは少し違う表記が沢山あったりします。

例えば[Mummy-D From Rhymester]みたいなやつです。

他にもよくあるのが、カタカナ表記のアーティストがローマ字表記だったりとか、そういった別名義まではいかないけど表記がちょっと違うというのがバリエーションになります。

f:id:Labyrinth_of_Wisdom:20170531113906p:plain

設定方法のサンプルとして、[Mummy-D From Rhymester]でリリースしている作品を使用します。 因みにバリエーション設定されている名義は表記の後ろに*が付きます。

f:id:Labyrinth_of_Wisdom:20170531114125p:plain

これは作品の編集画面ですが、Mummy-D氏の項目を見てください。 アーティスト名の箇所には[Mummy-D]と書いてあります。

その横に[ANV入力欄]と呼ばれる項目があるのですが、そこに[Mummy-D From Rhymester]と記載されています。

この[ANV入力欄]に記入した値がそのアーティストの名義バリエーションになります。

極端な話、ここで田中太郎とか書いてもそのアーティストのバリエーションになってしまいます。 (Discogsのマナーに反するのでやったら駄目ですよ)

まとめ

全部バリエーションにしたらいいんじゃない?という風に思う方もいらっしゃると思うのですが、名義が違いすぎるものはエイリアスとして登録するのがDiscogsの基本理念ぽいです。(一回それで指摘ありました)

なので下記の様な考え方で進めていけばいいかなと思います。

エイリアス:別のアーティスト
バリエーション:表記違い

Discogsは翻訳があまり進んでないので分かりにくい箇所が多々あるのですが、今回の記事で少しでもDiscogsの理解が深まればと思います。

複数条件での検索 (動的SOQL)

複数の入力フォームに値を入力し、その値を検索条件として値を取得するコードのサンプルです。 例えば下記の様なフォームがあるとします。



このフォームの場合、レコードの検索条件としては下記の4パターンが考えられます。

・名前も年齢も入力されていない
 →全てのレコードを取得

・名前のみ入力されている
 →名前の前方・後方一致で当てはまるレコードを取得

・年齢のみ入力されている
 →年齢が一致するレコードを取得

・名前も年齢も入力されている
 →名前が前方・後方一致かつ、年齢が一致するレコードを取得

つまりユーザの操作によって4パターンのSOQLが発行されることになります。

if(String.isBlank(inputName) && String.isBlank(inputAge)){
    // 名前も年齢も入力されていない
    Hoge__c[] hogeList = [SELECT Name, Age__c FROM Hoge__c];
}else if(!String.isBlank(inputName) && String.isBlank(inputAge)){
    // 名前のみ入力されている
    Hoge__c[] hogeList = [SELECT Name, Age__c FROM Hoge__c WHERE Name LIKE :name]
}else if(String.isBlank(inputName) && !String.isBlank(inputAge)){
    // 年齢のみ入力されている
    Hoge__c[] hogeList = [SELECT Name, Age__c FROM Hoge__c WHERE Age__c = :age]
}else{
    //名前も年齢も入力されている
    Hoge__c[] hogeList = [SELECT Name, Age__c FROM Hoge__c WHERE Name LIKE :name AND Age__c = :age]
}

この方法では、WHERE句のみが違う同じようなコードを何回も書かないといけません。 今回は入力フォームが二つなので4パターンで済みますが、これがもっとたくさんある場合はその都度同じようなSOQLの文を書かないといけないので面倒です。

おまけに名前の検索時は%田中%みたいに自分でワイルドカード(%)を付けてやらないと前方・後方一致検索できません。

これを解決するのが動的SOQLと呼ばれるものです。 先ほどのコードに書いてあるSOQLは静的SOQLと呼ばれます。

動的SOQLはDatabase.query(String)メソッドを使用して、引数に文字列でSOQL文を渡してやることでレコードを取得します。

// 静的SOQL
Hoge__c[] hogeList = [SELECT Name, Age__c FROM Hoge__c];

// 動的SOQL
Hoge__c[] hogeList = Database.query('SELECT Name, Age__c FROM Hoge__c');

動的SOQLはSOQL文が文字列なので、Database.query(String)メソッドを呼び出す前に、条件分岐でsoql文を作り変えてやれば画面の入力値に応じて発行されるsoql文が変化します。

先ほどの静的SOQLで書いたコードを動的SOQLで書き直したコントローラのサンプルコードを記載します。

public class SampleSearchController {

    // フォーム入力用変数
    public String inputName {get;set;}
    public String inputAge {get;set;}

    // 検索するオブジェクト
    public Hoge__c[] hogeList{get;set}

    // コンストラクタ
    public SampleSearchController(){
    hogeList = new List<Hoge__c>();
    }

    // 検索メソッド
    public void search(){
        String soql = 'SELECT Id, Name, Age__c FROM Hoge__c';
        String where = ' WHERE '
        String soqlName = 'Name LIKE \'%' + String.escapeSingleQuotes(inputName) + '%\'';
        String soqlAge = 'Age__c = ' + String.escapeSingleQuotes(inputAge);

        if(!String.isBlank(inputName) && !String.isBlank(inputAge)){
            // 名前も年齢も入力されている
            soql += where + soqlName + ' AND ' + soqlAge;
        }else if(!String.isBlank(inputName) && String.isBlank(inputAge)){
            // 名前のみ入力されている
            soql += where + soqlName;
        }else if(String.isBlank(inputName) && !String.isBlank(inputAge)){
            // 年齢のみ入力されている
            soql += where + soqlAge;
        }

        System.debug(soql);
        hogeList = Database.query(soql);
    }

}

このようにSOQL文を文字列で扱うことで、入力された値によって動的にSOQL文を変化させることが出来ます。 ついでにワイルドカード(%)も変数の中に埋め込んでいるので、入力フォームにワイルドカード(%)を入れなくても前方・後方一致検索ができます。

【Discogs】ミュージシャンのディスコグラフィー調査に便利なサイト

あるアーティストの最新アルバムを聴いてすっかり気に入ってしまい、昔の音源も聴いてみようと思うことがままあります。

一般的にはそのアーティストの公式HPやWikipediaなんかを見ればいいと思うんですが、ディスコグラフィーについて特化しているサイトがあるので紹介したいと思います。

Discogs - Wikipedia

2000年に開設され、アメリカ合衆国オレゴン州ポートランドにある企業Zink Media, Inc.が運営している。 ユーザーアカウントを作成すれば誰でも編集できるウィキの要素を持ち、ジャケット写真等の投稿も可能。ポピュラー音楽からクラシック音楽、ノンミュージック(オーディオブック等)まで全てのジャンルを網羅するが、特にクラブミュージックに強みを持っている。 リリース作品のほかアーティスト、レコードレーベルなどの情報も掲載される。 リリース作品に関しては、アーティストのソロ作品・プロデュース作品・提供作品から、レコーディング参加作品・ブートレグまで網羅している。一枚のCD・レコードにつき、その作品に関わったミュージシャン・プロデューサー・スタジオ等のクレジット、再発盤・デジタルリマスタリング盤の情報まで記載されている。 リリース情報の閲覧や投稿だけでなく、ユーザーレビュー投票やコメントなどのコミュニティ機能、CD・レコード等の売買ができるマーケットプレイス機能なども統合されている。

ざっくり言うとアーティストのディスコグラフィーに特化したWikipediaって感じです。 この音源は媒体がCD-Rで出ているとか、データのみでリリースしたとか書いてあって、過去の音源を遡るのにめちゃ便利です。

熱心なファンや本人が書き込みしていることもあるのか、超マイナーな音源の紹介とかもされていることがあってビビります。

気になるアーティストがいたらここで調べると面白いので良ければ。

音楽データ購入サイトの使い分け方

以前の記事で今でもCDを買う習慣があると書きましたが、中にはどうしても手に入らない廃盤のCDとか、アナログレコードでしか発売がされていない音楽なんていうのもちらほらあります。(我が家にはレコードプレーヤーがない)

そういう時に役立つ、音楽データが購入できるサイトの僕なりの使い分けを紹介したいと思います。

因みに、今から紹介するサイトがiTunesAmazonのDL購入と一番何が違うかというと、ビットレートが高いもの、つまり高音質なものが購入できるという点です。

具体的に言うと、MP3のビットレート320kbps以上の音質のものを配信しているということです。 (iTunesAAC 256kbps、AmazonはMP3 256kbps)

別に気にならない人はいいんですけど、どうせなら原曲になるべく近い音で聴きたいので、こういったサイトを使うようにしています。

音質については下記以外にも色々記事あるので探してみてください。

Bandcamp

アンダーグラウンドなアーティストの音源を探す時によく利用します。 発信の場を完全にBandcampに移しているアーティストもいて、最新アルバムはここでか手に入らないなんてこともあります。

あと廃盤のアルバムとかも結構あって、中には投げ銭で提供している太っ腹なアーティストもいるので、手に入らなかった音源とか見つけるとテンション上がります。

Bandcampについての詳細はこちらを参照。

Beatport / Junodownload

この2つのサイトは入手が難しいCDや、レコードでのみ発売されている音源のデータを購入する際によく使います。

Junodownloadの方が基本安い感じですが、Beatportは定期的にクーポン配信があるので、うまく併用してお得な方を選んでいます。

決済方法

Paypalのアカウントを取得することを強く推奨します。 クレジットでもいけるはずですけど、やっぱり安心感あるので。

Paypalについては下記参照。

他にも色々購入サイトはありますが、僕なりの使い方を紹介しました。

自分的CD整理術

違法DLやiTunesなどのデータDLサービス、音源入りUSBなどが発売されているこのご時世にCDを購入する人は段々と減っていっていると思いますが、僕は今でももっぱらCDを買う習慣があります。(勿論DL購入もするけど)

理由としては惰性もあるし、やっぱり安心感みたいなものもあるし、欲しい音源がCDしかないってこともたまにあるからです。

でもいくらCDがコンパクトディスクなんて名前の通りコンパクトでも、塵も積もれば山。 長年かけて集めたCDは着実に部屋を圧迫していきました。

なんとかしないと駄目だなーと思っていた時に、(確か)TV番組の木梨サイクルに出演していたスチャダラパーBOSE氏が紹介してたんですが、CDをアナログレコードみたいに収納できるグッズがあるというのを思い出しました。

調べてみたら、リンク先でも紹介していました。

明日に向かって捨てろ!!~ボーズの脱アーカイブ宣言~

明日に向かって捨てろ!!

明日に向かって捨てろ!!

CDケースの厚みの大体1/3くらいになるので、収納できる量が増えるみたいです。 早速色々調べてみて、それっぽいのを発見しました。

メーカーから直接購入もできますし、Amazonからも購入可能です。

これに入れ替えたCDをプラスチックの収納ケースに入れると、まさにアナログレコードな感じでCDが収納可能になります。 CDの収納に悩んでいる人は一度導入してみてはどうでしょう?

f:id:Labyrinth_of_Wisdom:20170215014639j:plain f:id:Labyrinth_of_Wisdom:20170215014643j:plain f:id:Labyrinth_of_Wisdom:20170215014646j:plain

この収納ケースはスタッキングもできるのでおすすめです。

天馬 いれと庫 CD収納ボックス クリア

天馬 いれと庫 CD収納ボックス クリア

入力フォームの行追加と行削除

Visualforceでの行追加・削除機能のサンプルです。 結構色んな要素を使ってて思ったよりもややこしかったので、忘れないうちにメモします。

行追加

これは思ってたよりも簡単に実装できます。

Accountのリスト型変数accountListを作成して、コンストラクタでAccount型の変数accountをnewしてaddします。 こうすることで画面に遷移した際に、空のテキストボックスが1行表示されます。

追加もこれと同じ要領で、追加ボタンを押した際に空のaccountがnewされて、accountListにaddされればいいのです。

ただし、今回のサンプルではテキストボックスの項目が必須になっている為、一工夫してやらないとうまく追加されません。 Visualforceの方で、追加ボタンのコードにimmediate="true"を設定してやることでこの問題を解決しています。

このimmediate="true"というのは全ての検証ルールをスキップすることが出来るという事を意味します。(デフォルトはfalse) immediate="true"を指定せずに追加ボタンを押すと、必須項目に値が入っていないと怒られてしまいます。

» 【Salesforce】apex:inputFieldの必須チェック回避【Visualforce】技術ブログ

行削除

こちらが色々な要素が入っていて意外とややこしいです。 まずパッと思いつくのは、accountListから要素を削除したらいけそうだな、となりますよね。

でもaccountListのインデックス(添え字)を指定してやらないと自分が削除したい行が消せないので、画面で指定した行番号を取得しないといけないという事になります。 なのでまず任意の行番号を取得するロジックが必要になります。

行番号指定

行番号指定には、Visualforceのvariableというコードを使用します。 これはVisualforce内で変数を設定できるコードみたいです。

pageBlockTableの上にvariableを置き、変数countを初期値0でセット。 pageBlockTable内で要素がループする前に再度variableを置き、countに1を加算。 これで一行目には0、二行目には1と、行番号がセットされます。

行番号送信

次に、この各行にセットされた数値をコントローラに渡してやる必要があります。 渡すタイミングとしては削除ボタンを押下した時なので、その辺りに仕込みます。

まずcommandButtonactionに行削除メソッドを指定、こちらにも同じ理由でimmediate="true"を指定します。 さらにreRenderに再描画したい範囲を指定してやります。 今回はform全体を再描画したいので、formのid値(form)を指定します。

commandButtonタグの間にparamをセットします。 paramnameに適当な値を指定、valueに行番号である変数countを指定します。 これで削除ボタンを押下した際にこのparamにセットした変数countが送信されます。

行番号取得

コントローラで送信された行番号を取得していきます。

行削除メソッドでSystem.currentPageReference().getParameters().get('xxx')を使用して送信された行番号を取得します。 xxxの部分はparamnameで指定した値です。

取得した値をInteger型に変換して、変数rowNumberに代入します。 入力フォームが一行しかない場合は削除したくないので、accountListのサイズが1より大きい場合のみrowNumberのインデックスの要素を配列から削除します。

f:id:Labyrinth_of_Wisdom:20170208120534p:plain

サンプルコード

public class AddDeleteRowController {

    public Account[] accountList {get;set;}
    public Integer rowNumber {get;set;}

    // コンストラクタ
    public addDeleteRowController(){
        accountList = new List<Account>();
        Account account = new Account();
        accountList.add(account);
    }

    // 行追加
    public void addRow(){
        Account account = new Account();
        accountList.add(account);
    }

    // 行削除
    public void deleteRow(){
        // 行番号取得
        rowNumber = Integer.ValueOf(System.currentPageReference().getParameters().get('number'));
        // 一行以上の時に削除可能
        if(accountList.size() > 1){
            accountList.remove(rowNumber);
        }
    }

}
<apex:page controller="AddDeleteRowController" showHeader="false" sidebar="false" >
    <apex:pageBlock title="取引先">
        <apex:form id="form">
            <!-- 行追加ボタン -->
            <apex:commandButton value="追加" immediate="true" action="{!addRow}" />
            <!-- インデックス取得用の変数 -->
            <apex:variable value="{!0}" var="count"/>
            <apex:pageBlockTable value="{!accountList}" var="item">
                <!-- 行削除ボタン -->
                <apex:column headerValue="行操作">
                    <apex:commandButton value="削除" immediate="true" action="{!deleteRow}" reRender="form" >
                        <!-- 行のインデックスを送信する -->
                        <apex:param name="number" value="{!count}" />
                    </apex:commandButton>
                    <!-- ループするごとに+1 -->
                    <apex:variable value="{!count + 1}" var="count"/>
                </apex:column>
                <apex:column headerValue="名称">
                    <apex:inputField value="{!item.Name}"/>
                </apex:column>
            </apex:pageBlockTable>
        </apex:form>
    </apex:pageBlock>
</apex:page>