谷本 心 in せろ部屋 このページをアンテナに追加 RSSフィード

2017-03-20

TT-BA09で、テレビの音声をBluetoothで無線化してみた(失敗編)

成功の影に失敗あり。

テレビの音声をBluetoothでワイヤレス化しようという試みですが、一度失敗していたので、今回はその話を書きます。

成功した話は、前回のエントリーを読んでください。

http://d.hatena.ne.jp/cero-t/20170111/1484142249


テレビをBluetooth化するには「トランスミッター」と「レシーバー」が必要というのは前回説明した通りですが、それぞれ最初に選んだ製品は、トランスミッター側が前回も書いた「TT-BA09」で、レシーバー側はオーディオテクニカの「AT-PHA50BT」でした。

AT-PHA50BTは「ワイヤレスヘッドホンアンプ」とうたわれていて簡易アンプ機能がついているため、音量調整ができるだけでなくエフェクト機能などもついているので良さそうと思い、選びました。

これを、次のように接続しました。


テレビ → (光音声出力) → TT-BA09 → (Bluetooth/apt-X) → AT-PHA50BT → (ケーブル) → ヘッドホン


まぁトランスミッターとレシーバーを繋ぐときは、普通にこうなります。前回書いた「TT-BA08」のところがAT-PHA50BTになっただけです。


なんかおかしいぞ?

それで接続して使い始めたのですが、問題が2つありました

  1. 切断/再接続をすると、音が途切れ途切れになって使えなくなる
  2. 音量が変えられない

まず切断/再接続時の挙動ですが、接続中に一度AT-PHA50BT側(レシーバー側)の電源を入れ直すと、音が途切れ途切れになってしまい、実質的に使えなくなります。TT-BA09側(トランスミッター側)の電源を入れ直せば問題なくなりますし、まぁBluetooth機器だし、これぐらいの相性問題はあるよね、という認識で我慢して使おうかと思いました。


それより困るのが「音量を変えられない」という問題。AT-PHA50BT(レシーバー)のダイヤルをいくら回しても、ヘッドホンから聞こえる音量は全く変わらないのです。ヘッドホンアンプの役割を果たしてくれません。

もちろん、テレビ側の音量を変えても(光音声出力経由ですから)ヘッドホン側の音量は変わりません。ライブ音源なのに音が小さすぎたりすると、かなりガッカリです。


初期不良かな?

そう思って、試しにAT-PHA50BTをiPhoneBluetooth接続してみたのですが、音量もエフェクトも含めて、すべての機能がきちんと動きます。再接続しても問題ありません。


それで気づいたんですが、、、


あれ?

TT-BA09と繋ぎ直すと、さっきより音が大きくなってるぞ?


そうなんです、iPhoneで音量を変えた後に、改めてTT-BA09とAT-PHA50BTを接続し直すと、iPhoneで変えた時の音量のままになってるんです。いったい何を言ってるか分からねー(略)

要するにAT-PHA50BTは内部的に音量を保持していて、iPhone(などのスマホ)と接続した時には音量を変更できるけど、TT-BA09と接続した時には変更ができないと、そういう感じのようです。


なので、TT-BA09と繋いでいる時に音が大きい/小さいなーと思ったら、iPhoneと繋ぎ直して音量を調整して、またTT-BA09に繋ぎ直せばいいだけだ、ということです😇

ってできるわけないやろ💢


サポートへの問い合わせ

我慢しながら使おうかな、とも思ったのですが、一縷の望みを掛けて、サポートに問い合わせることにしました。

僕はトラブルシューターですから、こういう不具合報告はお手の物です。問題の状況や、いくつかの組み合わせで検証した結果などを、きちんと事実と推測に分けて報告をしました。もちろん、他社製品のせいだと言われないような予防線も張ります。こういう報告を送られると、逃げようがないですからね。


問い合わせを出して数日後、返信がありました。

返信内容は転載禁止なので詳しくは書けませんが、「スマートフォンと繋ぐことを前提にしたので、電話帳機能がない機器と繋ぐとボリュームとか効かなくなることがあります」みたいな事が書かれていました。


そんなこと、製品紹介のどこにも書かれてないやないか!!!💢💢

https://www.audio-technica.co.jp/atj/show_model.php?modelId=2661


・・・なんて怒りを抑えつつ、せめてと思い、「別に交換しろとは言わないから、せめてホームページに書いとけや!」に社会性フィルタを掛けた内容でメールを返信しておきました。すぐに「指摘を真摯に受け止めます」という旨の大人語な回答を頂きました。

2ヶ月以上前の話ですが、いまだ書かれている様子はないので、今後も変わらないでしょうね。


どうしようこれ

一時は我慢しながら使おうかと思ったAT-PHA50BTですが、このサポートとのやり取りも含めて諦めるしかないと判断し、前回の記事に書いたとおりTT-BA08を買い直したわけです。TT-BA08との組み合わせなら、何ら問題ありません。


と言うことで使わなくなったAT-PHA50BTですが、これ、何に使いましょうね。

iPhoneMacとはきちんと接続できるので、勉強会とかで「音を鳴らしたいけど、ケーブルが届かない!」という時に、サッと出してヒーローになる。そんな夢を見ながら、カバンに忍ばせておくことにしましょうかね。

2017-01-11

TT-BA09で、テレビの音声をBluetoothで無線化してみた(成功編)

BABYMETALのライブが放送される時期だけWOWOWを契約する、ちょっとWOWOWにとっては迷惑気味なメイトのCERO-METALデス!


さて、普段ヘッドホンで音楽を聴くようになってから、テレビでもライブなどを観る時にはテレビのスピーカーでは物足りなくなり、ヘッドホンで聴くようになりました。ただ3mぐらいのケーブルを使ってもテレビまで近いですし、キッチンで料理や洗い物をしながらテレビを観る時になんかには使えません。

そんな背景から、テレビの音声をワイヤレスにしてヘッドホンで聴きたいなーと思っていました。


ちょうどWOWOWBABYMETAL東京ドームライブが放送される年末年始のこのタイミングで、テレビの音声をBluetoothで飛ばして、ヘッドホンで聴ける環境を作ることにしました。


何がいるの?

そもそも、テレビの音声をBluetoothで飛ばすには何が必要か、という整理からです。接続の流れはこんな感じになります。


テレビ → Bluetoothトランスミッター → Blueotoothレシーバー → ヘッドホン


テレビからの音声入力を受けてBluetoothで飛ばすものを「トランスミッター」と呼び、Bluetoothで受信をする方を「レシーバー」と呼びます。ITエンジニアの皆様方にも分かりやすく説明すると、トランスミッターがWi-Fiルーターに相当し、レシーバーWi-Fi子機に相当します。

またレシーバーとヘッドホンをケーブルで繋ぐものもあれば、ヘッドホン自体がレシーバーになるワイヤレスヘッドホンなどもあります。


製品の選び方

Bluetoothトランスミッターやレシーバーを選ぶ際の観点になるのが、次の2つです。

  • 音声入力の方式(ヘッドホンジャック、赤と白のRCAピンプラグ、光デジタルなど)
  • 対応コーデックSBCAACapt-X、LDACなど)

音声入力の方式はまぁ分かるので割愛するとして、よく分からないのがコーデックです。

ざっくり調べた感じ、次のような違いがあるようです。

  • SBC: ほとんどの機器が対応するけど、音質が悪い。
  • AAC: 主にApple製品で使われる。SBCより音質が良い。
  • apt-X: Androidや多くの機器で使われる。AACより遅延が少ない。
  • apt-X HD: apt-Xをさらに高音質にしたもの。まだ対応製品が少ない。
  • LDAC: ハイレゾ音源に対応するもの。音質は一番良いがソニー製品でしか採用されていない。

対応製品が多いapt-Xが、現在ではほぼスタンダードになってるようです。apt-Xに対応したトランスミッターはいくつかあるのですが、AACやLDACに対応した単体のトランスミッターというのは、ちょっと見つけられませんでした。


実際に買った製品

それで今回用意したのは、次の製品です。

この組み合わせで、ばっちりワイヤレスで視聴できる環境が整いました。


TT-BA09

音声のトランスミッター、レシーバーの両方に使える製品です。TaoTronics社からは似たような製品がいくつか出ているのですが、このTT-BA09は光音声入力があったので、これを選びました。ちなみにTT-BA09には音量を調整する機能がありません。


TT-BA08

上の製品と同じく音声のトランスミッター、レシーバーの両方に使える製品です。TT-BA09よりも一回り小さな製品です。

こちらはレシーバーとして使う際に音量の調整ができるようになっています。通常、光音声入力では出力側での音量調整ができず、レシーバーで音量調整する必要があるため、これを選びました。


それで、繋いでみると。

さすがは同じメーカーの同一シリーズの製品でしょうか、全く何の問題もなく接続できました。

接続はこんな流れです。


テレビ → (光音声出力) → TT-BA09 → (Bluetooth/apt-X) → TT-BA08 → (ケーブル) → ヘッドホン


Bluetoothを切断/再接続をしても、全く問題なく音声を聞くことができます。

また、テレビの音量を変えてもヘッドホンから聞こえる音量は変わらないため、テレビは消音にし、音量をTT-BA08で調整するような使い方になります。音量を調整できないレシーバーだと、こういう事ができないんですよね。


遅延とか音質は?

Bluetoothでよく言われるのが音声の遅延。

apt-Xでは40msほどの遅延があると言われており、口と声がズレるのを気にする僕としては、遅延があるのははっきり分かります。遅延があまり分からない人でも、テレビとヘッドホンの音を両方出せば、はっきりとズレていることは分かるでしょう。

ただ、そうは言っても40msですから、ズレを検出しようとしない限りは、さほど気にならない程度でした。


そして気になる音質ですが、これはとても良いです。

ショボいテレビのスピーカーに比べれば音声はクリアに聞こえ、特に海外映画などの英語もだいぶ聞き取りやすくなりました。音楽番組などもしっかり低音が聞こえるのは、さすがヘッドホンですね。

音楽番組を流しっぱなしにしながらリビングキッチンでウロウロしても、ヘッドホンで聴けるのは最高です。


・・・ということで、特にトラブルも起きることないつまらない話になったのですが、実はこの前に、別メーカーの製品との組み合わせでトラブルがありました。せっかくなので、それについては、また改めて書きたいと思います。


See you!

2016-12-08

Optimizing JavaというJavaパフォーマンス系の書籍が面白そう

急激な冷え込みのせいで「寒い!」というつぶやきがTLに散見されるこの頃ですが、皆さんお風邪など召していらっしゃらないでしょうか。

否応なしに寒いという言葉に反応してしまう、けなげなエンジニアの @ です。


このエントリーは Java Advent Calendar 2016 の8日目です。

昨日は @ さんの「Java Stream APIでハマったこと」で、

明日は @ さんの「マイクロベンチマークツール、JMHについて」でした。


今日のエントリーでは、Javaのパフォーマンス系書籍を紹介したいと思います。

Optimizing Java - O’Reilly Media

URLを見るにつけ、あのオライリー様のサイトですら拡張子が由緒正しい .do なのですから、日本のSIerがStrutsを使うことをどうして否定できましょうか。

いえ、今日はそんな話題ではありません。


紹介したいのは上のリンク先の本、「Optimizing Java - Practical Techniques for Improved Performance Tuning」です。名前の通り、Javaのパフォーマンスに関する書籍です。まだEarly Releaseの段階で、全体の1/3ほどしか書かれていませんが、現状の版を入手したので紹介したいと思います。


ここまでで、「あれ、なんか似たような本がなかったっけ」と思った方がいらっしゃるかも知れません。そう、オライリー社からは2015年に「Javaパフォーマンス」という書籍が出版されています。

Javaパフォーマンス - O’Reilly Japan

こちらの日本語版では、私も監訳者まえがきを書かせて頂き、Java Day Tokyoで寺田佳央さんと共にサイン会を行いました。

当時はきっと「この寺田さんの横にいて本に落書きしてる人、誰なんだろう」と思われていたかも知れませんが、私を誰だと思ってるんでしょう、せろさんだぞ?


この2冊について、比較しながら紹介しましょう。


目次

「Javaパフォーマンス」の目次は、次の通りです。

1章イントロダクション
2章パフォーマンステストのアプローチ
3章Javaパフォーマンスのツールボックス
4章JITコンパイラのしくみ
5章ガベージコレクションの基礎
6章ガベージコレクションのアルゴリズム
7章ヒープのベストプラクティス
8章ネイティブメモリのベストプラクティス
9章スレッドと同期のパフォーマンス
10章Java EEのパフォーマンス
11章データベースのベストプラクティス
12章Java SEのAPIのパフォーマンス

JavaのメモリやGC、スレッドに関する紹介から、SE / EEやデータベースのパフォーマンスに広げた話をしています。


一方、「Optimizing Java」の目次は次の通りです。

Chapter 1Optimization and Performance Defined
Chapter 2Overview of the JVM
Chapter 3Hardware and Operating Systems
Chapter 4Performance Testing
Chapter 5Measurement and Bottom-Up Performance
Chapter 6Monitoring and Analysis
Chapter 7Hotspot GC Deep Dive
Chapter 8Garbage Collection Monitoring and Tuning
Chapter 9Hotspot JIT Compilation
Chapter 10Java Language Performance Techniques
Chapter 11Profiling
Chapter 12Concurrent Performance Techniques
Chapter 13The Future

うん、ほとんど一緒やん?


「Optimizing Java」には、「Javaパフォーマンス」では触れられていたSEやEEの話などはないため、そこが差分になりそうにも見えます。ただ正直、「Javaパフォーマンス」の10章以降はちょっと薄口な感じでしたので、そこを飛ばせばほとんど同じ内容を網羅していると言えます。


では、何が違うんでしょうか。


Javaパフォーマンス vs Optimizing Java

僕が見た限りでは「Javaパフォーマンス」は教科書に近い内容、「Optimizing Java」はやや読み物寄りの内容になっています。

「Optimizing Java」は、現在執筆されているChapter 5までしか読めていませんが、「Javaパフォーマンス」には書かれていなかったOSやJVM周りのレイヤーの話や、テスト戦略の話など、少し目線が違った内容を書いていました。


たとえば、Javaのクラスファイルが「0xCAFEBABE」から始まっていることは、Javaに詳しい方なら既にご存じかと思います。ただ、その先はどうなっているのか。

書籍では次のように紹介されています。

  • Magic Number (0xCAFEBABE)
  • Version of Class File Format
  • Constant Pool
  • Access Flags
  • This Class Name
  • Super Class Name
  • Interfaces
  • Fields
  • Methods
  • Attributes

この先頭を取って

M V C A T S I F M A、

語呂合わせして

My Very Cute Animal Turn Savage In Full Moon Areas

なんて紹介されています。


「僕のとってもかわいい猫は、満月のエリアで凶暴になる」

・・・覚えやすいんですかね、これ?


あ、なんかふざけた本だなと思ったかも知れませんが、もちろん技術的な面もきちんと紹介されています。

あくまで上に書いたようなウィット(?)も挟みながら、Javaの領域だけでなく、必要に応じて低レイヤーにも触れて紹介する本となっているわけです。そのため、「Javaパフォーマンス」を読んだ方でも楽しめる本になるのではないかと思います。


で、いつ出るの? 日本語版は?

この本は2017年3月に出版予定となっています。


また、皆さん気になる日本語版ですが、残念ながらまだ翻訳されることは決まっていないようです。

ただ原著の人気が高かったり、この後に公開される6章以降の内容が「Javaパフォーマンス」とはまた違った切り口であり楽しめるのであれば、翻訳される可能性も十分にあるんじゃないかなと思っています。


そんなわけで、日本語版が出ることを祈りながら、このエントリーを書きました。

Stay tuned, see you!

2014-12-12

[]BootのO/RマッパーにMyBatisを使いたい。

DBアクセス層に何を使うかって、本当によく話題になりますよね。

「これで間違いないでしょ」っていう鉄板の選択肢がないから、だと思うわけですが

「SQLを書きたい日本人」な僕としては、消去法的にMyBatisを使っています。


消去法って言うからには、消えた選択肢があるわけで。


Hibernate : アイドントライク ハイバネートサン

JPA : アイドントライク ハイバネートサン

Doma : アイドントライク APT

S2JDBC : キャノット ユーズ ウィズ スプリング

DBflute : 少し文化が違うんです。

Mirage : 開発止まっちゃったし。


ホントはMirageあたりが大好物で、過去に実案件に投入した時には

まったく問題が起きなくて素晴らしかったのですが

開発が止まっていることと、実績的なアレでなかなか使いにくいんです。


そんなわけで消去法的に残ったMyBatisを使うため

Spring Boot + MyBatisの設定をしました。


ところで、テーブルのカラム名はスネークケース、JavaのEntityはキャメルケース、

という組み合わせで使うことは、とてもよくあることだと思いますが、

MyBatisでそれを行うためには、設定ファイルを書く必要があります。

(あるいはConfigurationクラスを使う)


また、Java8で使えるようになったLocalDateクラスを利用する場合も

TypeHandlerと設定ファイルを書く必要があります。


その辺りを盛り込んだのが、以下になります。


src/main/java/適当なパッケージ/MyBatisConfig.java

import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;

import javax.sql.DataSource;

@Configuration
@MapperScan("package.names.to.persistence") // Mapper層のパッケージ名を指定
public class DataConfig {
    @Bean
    public SqlSessionFactoryBean sqlSessionFactory(DataSource dataSource) throws Exception {
        SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(dataSource);
        sessionFactory.setTypeAliasesPackage(Entity.class.getPackage().getName());
        sessionFactory.setConfigLocation(new ClassPathResource("/mybatis-config.xml"));
        return sessionFactory;
    }
}

このように、mybatis-config.xmlを読み込むように設定を入れました。


設定ファイルは、こんな感じになります。

src/main/resources/mybatis-config.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <settings>
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>
    <typeHandlers>
        <typeHandler handler="xxx.LocalDateTypeHandler"/>
    </typeHandlers>
</configuration>

スネークケースからキャメルケースへの変換と

LocalDateを使うための型ハンドラの定義を書いています。


型ハンドラの実装は、こんな感じです。

src/main/java/xxx/LocalDateTypeHandler.java

package xxx;

import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedTypes;

import java.sql.CallableStatement;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.time.LocalDate;

@MappedTypes(LocalDate.class)
public class LocalDateTypeHandler extends BaseTypeHandler<LocalDate> {
    @Override
    public void setNonNullParameter(PreparedStatement preparedStatement, int i, LocalDate localDate,
                                    JdbcType jdbcType) throws SQLException {
        preparedStatement.setDate(i, Date.valueOf(localDate));
    }

    @Override
    public LocalDate getNullableResult(ResultSet resultSet, String s) throws SQLException {
        Date date = resultSet.getDate(s);
        if (date == null) {
            return null;
        }
        return date.toLocalDate();
    }

    @Override
    public LocalDate getNullableResult(ResultSet resultSet, int i) throws SQLException {
        return resultSet.getDate(i).toLocalDate();
    }

    @Override
    public LocalDate getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
        return callableStatement.getDate(i).toLocalDate();
    }
}

こんな感じで設定をすれば、あとは世の中にあるサンプル通りに

Mapperクラスを作り、domainクラスを作り、SQLを書いたXMLファイルを作れば動きます。


ただIDEからJUnitを動かした後に、mvn spring-boot:runで起動したり、

逆に、mvn spring-boot:runして起動&停止した後に、JUnitを実行させたりすると

なぜか設定ファイルが見つからず無限ループになってしまうなど、微妙にバギーな挙動をします。


あと、MyBatisのConfigurationクラスと、SpringのConfigurationアノテーションは

名前が被ってしまっているからMyBatisのConfigurationクラスが使いにくいとか、

どうも、Spring Boot + MyBatisの組み合わせは、こなれてない印象があります。


もう少しバージョンが上がれば、良い感じになっていくのかな?

2011-01-06

[][]次世代のノートPCとスマートフォンの形。

いよいよCESが開幕、

その中でちょっと興味深いスマートフォンが発表されました。

Dockは2種類用意され、11.6インチディスプレイ、フルキーボードやトラックパッド、ステレオスピーカーなどを搭載し、8時間動作する「Laptop Dock」と、フルキーボードやマウス、スピーカー、HDMI端子や3つのUSB端子を搭載し、大型モニーターやテレビへの出力を想定した「HD Multimedia Dock」から選べる。

米Motorola、スマートフォンやタブレットなどAndroid端末発表 - ケータイWatch

いいですね! こういうのを待っていました。


普段はスマートフォンだけを持ち歩き、

自宅ではデスクトップPCとして利用し、

旅行時や勉強会にはノートPCとして持ち歩く、

そんな風に使えたら便利ですよね。


公式サイトでは、これらのドックを使った様子の動画もあります。

http://www.att.com/shop/wireless/devices/motorola-atrix.jsp#fbid=LvVneuhahex


また、Laptop Dockにフォーカスした記事もありました。

http://www.netbooknews.com/17233/motorola-atrix-4g-with-laptop-dock-turns-phone-into-11-6-netbook/

写真を見る限り、普通のマルチウィンドウなGUIに見えますが、

Android + カスタムUIなのか、ただの独自アプリなのか、ちょっと興味深いですね。


スマートフォンをPC代わりに使う時代の、入り口まで来ましたね。

Foleoみたいに壮大にコケない事を期待します(><)