link もっと前
   2018年 7月 2日 -
      2018年 6月 23日  
link もっと後

link 未来から過去へ表示(*)
link 過去から未来へ表示

日々

link permalink

libtool の謎のエラー

Raspberry Pi 3 を持っているのですが、あまり速くない(当たり前ですけど)こともあり、ほとんどコンパイルには使っていませんでした。今日、久しぶりにコードのビルドに使ってみたら、変な症状にハマりました。

autoreconf は正常終了?
$ autoconf --version
autoconf (GNU Autoconf) 2.69
...

$ automake --version
automake (GNU automake) 1.15
...

$  autoreconf -fi
aclocal: warning: couldn't open directory 'm4': No such file or directory
configure.ac:23: installing 'conf/compile'
configure.ac:16: installing 'conf/install-sh'
configure.ac:16: installing 'conf/missing'
src/Makefile.am: installing 'conf/depcomp'

更地からのビルドなので autoreconf -fi を実行しています。この時点では特にエラーも出ずに終わったように見えます。

configure がエラーで落ちる
$ ./configure
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /bin/mkdir -p
checking for gawk... gawk
checking whether make sets $(MAKE)... yes
checking whether make supports nested variables... yes
checking whether make supports nested variables... (cached) yes
./configure: line 2505: syntax error near unexpected token `ac_ext=c'
./configure: line 2505: `ac_ext=c'

しかし configure が謎のエラーで終了してしまいます。しかも config.log にエラーの内容が記録されておらず、怪しいです。

しばし configure.ac をいじってみてわかったことは、以下の条件を満たしていると、このエラーが発生するようです。

  • configure.ac に LT_INIT() を記述、つまり libtool を使うように記述する
  • システムに libtool がインストールされていない
  • 更地(autoconf, automake 関連のファイルが全く無い状態)からビルドする

解決策は libtool をインストールするか、libtool を使っていないなら configure.ac から LT_INIT() を削除しても良いです。

この辺の仕組みは詳しくありませんが、libtool が無いなら無いと言ってくれれば、もう少しわかりやすいのにな…と思います。

[編集者: すずき]
[更新: 2018年 7月 4日 23:12]
link 編集する

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



link permalink

Android チューナー周りの調査メモ

Android 8 のチューナー周りについて、家でも少し調べていたので、わかったことのメモを貼っておきます。環境は下記の通りです。

  • タグ: android-8.1.0_r33
  • ディレクトリ: android/packages/apps/TV

チューナーの動作は大きく分けると、チャンネルスキャン、視聴の 2つです。

チャンネルスキャン

チャンネルスキャンは全てのチャンネルに対してチューニングを行って、受信できるかどうか試す動作を指します。Android 8 の場合、フレームワーク内部にチャンネルのリストを持っていて、リストの先頭から試す仕組みになっているようです。

コードを見た感じ、処理は下記のように進むようです。

チャンネルスキャン画面の動作
// @ src/com/android/tv/tuner/setup/TunerSetupActivity.java
TunerSetupActivity::executeAction(String category, int actionId, Bundle params)
    switch (category)
      case ConnectionTypeFragment.ACTION_CATEGORY:
        mLastScanFragment = new ScanFragment();
        Bundle args1 = new Bundle();
        // actionId は GUI 画面の選択肢(Antenna, Cable, Not sure)の
        // 上から何番目か?に相当する、一番上が actionId = 0
        // ★★ CHANNEL_MAP_SCAN_FILE は後述
        args1.putInt(ScanFragment.EXTRA_FOR_CHANNEL_SCAN_FILE,
                     CHANNEL_MAP_SCAN_FILE[actionId]);
        // ...snip...
        // ScanFragment を実行、表示する
        showFragment(mLastScanFragment);

ScanFragment::onCreateView() @ src/com/android/tv/tuner/setup/ScanFragment.java
  ScanFragment::startScan()
    new ChannelScanTask()
    ChannelScanTask::execute()

ScanFragment::ChannelScanTask::doInBackground() @ src/com/android/tv/tuner/setup/ScanFragment.java
  //チャンネルリストを得る
  ChannelScanFileParser::parseScanFile() @ src/com/android/tv/tuner/setup/ScanFragment.java
  ScanFragment::ChannelScanTask::scanChannels()
    TunerTsStreamer::startStream(ChannelScanFileParser.ScanChannel) @ src/com/android/tv/tuner/source/TunerTsStreamer.java
      TunerHal::tune() @ src/com/android/tv/tuner/TunerHal.java
        Java_com_android_tv_tuner_TunerHal_nativeTune() @ jni/tunertvinput_jni.cpp
          DvbManager::tune() @ jni/DvbManager.cpp
            //DVB API v5 でのチューニング方法
            ioctl(FE_SET_PROPERTY) // /dev/dvb0.fe0 などに対して実施

DvbManager::tune() は ATSC 決め打ちの場所があって、DVB や ISDB など他の放送規格には対応していないように見えます。

CHANNEL_MAP_SCAN_FILE はスキャンするチャンネルの一覧が書いてあるファイルのリソース ID が並んでいます。

チャンネルリストのリソース ID
    private static final int CHANNEL_MAP_SCAN_FILE[] = {
        R.raw.ut_us_atsc_center_frequencies_8vsb,
        R.raw.ut_us_cable_standard_center_frequencies_qam256,
        R.raw.ut_us_all,
        R.raw.ut_kr_atsc_center_frequencies_8vsb,
        R.raw.ut_kr_cable_standard_center_frequencies_qam256,
        R.raw.ut_kr_all,
        R.raw.ut_kr_dev_cj_cable_center_frequencies_qam256,
        R.raw.ut_euro_dvbt_all,
        R.raw.ut_euro_dvbt_all,
        R.raw.ut_euro_dvbt_all
    };

ちなみにファイルは packages/apps/TV/usbtuner-res/raw の下にあります。もし新しいファイル file_name を追加したいときは、ディレクトリの下にファイルを追加し、CHANNEL_MAP_SCAN_FILE に R.raw.file_name のように、追加すれば良いみたいです。

視聴

TV 視聴の際は、チューニングと MPEG2-TS データを受け取って、セクション解析する処理が行われるようです。

チューニングについては、チャネルスキャンで紹介した TunerHal::tune() が使われますので割愛して、TS データを受け取るところを調べます。どうも下記のようになっているようです。

DVB API デバイスから TS を受け取って、PSI パーサーに渡すまで
TunerTsStreamer::StreamingThread::run() @ src/com/android/tv/tuner/source/TunerTsStreamer.java
  TunerHal::readTsStream() @ src/com/android/tv/tuner/TunerHal.java
    TunerHal::nativeWriteInBuffer()
      Java_com_android_tv_tuner_TunerHal_nativeWriteInBuffer() @ jni/tunertvinput_jni.cpp
        DvbManager::readTsStream() @ jni/DvbManager.cpp
          read() // /dev/dvb0.dvr0 など
  EventDetector::feedTSStream() @ src/com/android/tv/tuner/tvinput/EventDetector.java
    TsParser::feedTSData() @ src/com/android/tv/tuner/ts/TsParser.java
      TsParser::feedTSPacket()
        Stream::feedData()
          SectionStream::handleData()
            SectionParser::parseSections() @ src/com/android/tv/tuner/ts/SectionParser.java

詳細に調べ切れていませんが、動画や音声データは com.android.tv.tuner ではあまり触らないようです。ExoPlayer に丸投げですかね?

[編集者: すずき]
[更新: 2018年 6月 29日 21:37]
link 編集する

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



link permalink

Namazu 延命

Namazu の延命策として、検索文字列に UTF-8 文字列を投げられるようにしました。

といっても、オリジナルの CGI を namazu.cgi → namazu2.cgi にリネームして、下記のラッパー CGI を用意しただけです。

Sakura は Perl が 2種類(/usr/bin/perl = perl 5.8, /usr/bin/perl5 = perl 5.14)入っていて、perl 5.14 だけ Text::Iconv がインストールされています。しかしなぜか @INC にパスが通っていません。仕方ないので、かなりダサいですが、強引にパスを通しています。

UTF-8 の検索文字列を EUC-JP に変換するラッパー

#!/usr/bin/perl5

use lib '/usr/local/lib/perl5/site_perl/5.14/mach';

use CGI;
use Text::Iconv;

my $cv = Text::Iconv->new("UTF-8", "EUC-JP");
my $cgi = CGI->new;
my $q_cv = $cv->convert(scalar $cgi->param('query'));
$cgi->param('query', $q_cv);
$q_str = $cgi->query_string();
print "Location: namazu2.cgi?" . $q_str . "\n\n";

今回スクリプトを書いていて初めて知ったのですが CGI の param 関数を読んでスカラ値を受けたい場合 scalar $cgi->param('query') という書き方をした方が良いそうです。

理由の詳細はこのブログ(New Class of Vulnerability in Perl Web Applications)に載っていますが、ハッシュで受けると意図せず他の値を上書きしてしまう可能性があるので、明示的にスカラとして受け取るべき、ということらしいです。

気づいたきっかけ

Perl 初心者の私がなぜ気づいたかというと、動作テストをしたときに Apache の動作ログに、下記の Warning が記録されたからです。

Apache のエラーログ
AH01215: CGI::param called in list context from /home/katsuhiro/public_html/namazu/aaa.cgi line 8, this can lead to vulnerabilities.
See the warning in "Fetching the value or values of a single named parameter" at /usr/share/perl5/CGI.pm line 412.

初心者にはエラーメッセージだけだと意味がわかりませんが、Warning メッセージに言われるがまま /usr/share/perl5/CGI.pm 412行目を見ると、

CGI.pm

	# list context can be dangerous so warn:
	# http://blog.gerv.net/2014.10/new-class-of-vulnerability-in-perl-web-applications
	if ( wantarray && $LIST_CONTEXT_WARN == 1 ) {
		my ( $package, $filename, $line ) = caller;
		if ( $package ne 'CGI' ) {
			$LIST_CONTEXT_WARN++; # only warn once
			warn "CGI::param called in list context from $filename line $line, this can lead to vulnerabilities. "
				. 'See the warning in "Fetching the value or values of a single named parameter"';
		}
	}

危険な理由として、先ほど紹介したブログの URL を書いてくれていました。親切ですね。ブログを読んだので何となくわかりましたが、説明なしでは若干難解なコードかもしれません…。

[編集者: すずき]
[更新: 2018年 6月 29日 00:12]
link 編集する

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



link permalink

Kindle の本もダブることがある

Kindle の本は「ダブって買うことがない」利点があります。

が、例外もあって、今回ハマってしまいました。

ASIN

Amazon の電子書籍には必ず ASIN(Amazon Standard Identification Number)というユニークな ID が振られています。Amazon ストアの URL の最後に付いている、謎の英数字、あれが ASIN です。

Kindle ストアで本を選択したとき、自動的に購入済みの ASIN かどうか(=その本を持っているかどうか)チェックされ、購入済みか否かで、ストアに表示されるボタンが変わります。例えば 500円の本なら、

  • 未購入、未発売: 「¥500 で予約注文」ボタン
  • 未購入、発売中: 「¥500 で今すぐ購入」ボタン
  • 購入済み: 「今すぐ読む」ボタン

このように 3パターンのうち適切なボタンが表示されます。また、ブラウザの戻る機能で購入ページに戻り、同じ購入ボタンを押しても「あなた、もう買ってるでしょ?」って言われます。Kindle のダブり防止機能はかなり強力です。

この素敵な機能のおかげで、同じ本を 2冊買うことはほぼありません。

同じ本、違う ASIN

Kindle のダブり防止は「同じ本なら、ずっと同じ ASIN」という前提に依存していますので、この前提が崩れてしまうと、チェックが効かず、同じ本を 2回買えてしまいます。例えば、下記のような場合です。

  • 同じ本がストアに 2つ登録されている(ストア側がダブっている)
  • 同じ本がストアに 2回登録された(古い本を消して、新しい本を登録した)

私が今回ハマったパターンは後者でした。オンライン The Comic という本の 9巻目で、同じ本のようですが、なぜか ASIN: B07CH794VZ(以降、旧版)と、ASIN: B07CSVJYL2(以降、新版)の 2つの ASID が存在しています。そのため、

  • 旧版を買う
  • 旧版がストアから外され、新版が登録される
  • 新版も買う

このような経緯で 2冊買ってしまいました。ちなみに現在、旧版は買えず、評価ページだけが悲しく残っています。

返品できる

Amazon のカスタマーサポートに連絡したところ、新版の購入を取り消して、返金してもらうことができました。またカスタマーサポートの方が言うには「ストア内で本の入れ替えはある」ようです。

今回のような ASIN の付け替えは良くあるのか?珍しいのか?ちょっと気になります。あまり気軽に ASIN の付け替えをやられますと、購入、未購入の管理が結構辛くなります。

しかしまあ、今まで 6,000冊ほど買ってきて、今回初めて ASIN の付け替えに当たったので、体感的にそんなに頻度は高くないように思います。普通に楽しむ程度なら、まず困らない頻度だとは思います。

[編集者: すずき]
[更新: 2018年 6月 28日 11:45]
link 編集する

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



link もっと前
   2018年 7月 2日 -
      2018年 6月 23日  
link もっと後

管理用メニュー

link 記事を新規作成

合計:  counter total
本日:  counter today

link About www.katsuster.net
RDF ファイル RSS 1.0
QR コード QR コード

最終更新: 9/17 20:03

カレンダー

<2018>
<<<07>>>
1234567
891011121314
15161718192021
22232425262728
293031----

最近のコメント 5件

  • link 18年09月07日
    すずき 「ありがとう!\nこちらこそ、楽しみにして...」
    (更新:09/11 19:30)
  • link 18年09月07日
    よしだあ 「おつかれさまでした!\nまた仕事できるの...」
    (更新:09/11 19:17)
  • link 18年08月15日
    すずき 「うーん、なんか暴走したり、動かなかったり...」
    (更新:08/15 10:52)
  • link 18年08月15日
    すずき 「実行できた。あと実行ファイルパスについて...」
    (更新:08/15 10:42)
  • link 18年08月15日
    すずき 「さすがに x86_64 と arm のク...」
    (更新:08/15 10:35)

最近の記事 20件

link もっとみる
  • link 18年09月13日
    すずき 「[府民から都民へ] 家が決まりました。今月末から東京都民です。さよ...」
    (更新:09/17 20:03)
  • link 18年09月11日
    すずき 「[エアコン浄化] 今年の 7月に(2018年 7月 17日の日記参...」
    (更新:09/17 19:38)
  • link 18年09月10日
    すずき 「[引っ越し準備] 引っ越し用の新品の段ボールが 50箱以上届き、家...」
    (更新:09/17 19:32)
  • link 18年09月07日
    すずき 「[最終勤務日] 今日は Socionext の最終勤務日でした。9...」
    (更新:09/09 01:21)
  • link 18年09月06日
    すずき 「[さくらのメールサーバーと git send-email] 自宅か...」
    (更新:09/07 01:24)
  • link 18年09月03日
    すずき 「[ROCK64 のカーネルだけ元に戻したい] ROCK64 のカー...」
    (更新:09/04 01:34)
  • link 18年08月27日
    すずき 「[DTI の配ってくる IP アドレス] 以前、高槻市での WAK...」
    (更新:08/31 01:40)
  • link 18年08月26日
    すずき 「[不思議なダメージ計算式] 宇宙戦艦物語 RPG というスマホのゲ...」
    (更新:08/31 01:27)
  • link 18年08月21日
    すずき 「[エアコンがまた臭くなった] 先日(2018年 7月 17日の日記...」
    (更新:08/23 19:25)
  • link 18年08月20日
    すずき 「[Rock64 の U-Boot スクリプトを読む] 先日(201...」
    (更新:08/22 00:04)
  • link 18年08月15日
    すずき 「[自分のマシンは何 GFLOPS か? その 3] その 1、その...」
    (更新:08/15 10:46)
  • link 18年08月14日
    すずき 「[自分のマシンは何 GFLOPS か? その 2] その 1、その...」
    (更新:08/15 10:08)
  • link 18年08月13日
    すずき 「[自分のマシンは何 GFLOPS か? その 1] その 1、その...」
    (更新:08/15 10:08)
  • link 18年08月12日
    すずき 「[ARM PC で開発できるか?] 最近の ARM 搭載 SoC ...」
    (更新:08/14 13:32)
  • link 18年08月10日
    すずき 「[エディタ] 誰しもお気に入りのエディタがあると思いますが、私は割...」
    (更新:08/12 21:55)
  • link 19年08月11日
    すずき 「[間違えた] 1年、間違えたので、消す。...」
    (更新:08/12 21:33)
  • link 18年08月11日
    すずき 「[地震保険] AIG 損害保険から「大阪北部地震で被害を受けた方は...」
    (更新:08/12 21:32)
  • link 18年08月08日
    すずき 「[久しぶりに自作 ARM エミュレータ] 久しぶりに自作 ARM ...」
    (更新:08/09 00:51)
  • link 18年08月05日
    すずき 「[微妙に壊れてる ThinkPad E480 のキーボード] 先日...」
    (更新:08/05 01:20)
  • link 18年08月04日
    すずき 「[車検] 先週、大阪スバル(高槻店)にレガシィの車検をお願いしてい...」
    (更新:08/05 00:38)

こんてんつ

open/close wiki
open/close Java API

過去の日記

open/close 2002年
open/close 2003年
open/close 2004年
open/close 2005年
open/close 2006年
open/close 2007年
open/close 2008年
open/close 2009年
open/close 2010年
open/close 2011年
open/close 2012年
open/close 2013年
open/close 2014年
open/close 2015年
open/close 2016年
open/close 2017年
open/close 2018年
open/close 過去日記について

その他の情報

open/close アクセス統計
open/close サーバ一覧
open/close サイトの情報