epgrec一式改修

予てより/var/log/messagesに時々現れていた

epgdump[5897]: segfault at 7fff3b687000 ip 0000000000403c55 sp 00007fff3b680cb0 error 4 in epgdump[400000+9000]

の頻度が高くなってきた気がした。

結果的には2時間間隔で実行する番組表の取得に失敗しているわけだが、何回かに1回でもきちんと取得できていれば大筋で問題無い仕組みなのでスルーしていたのだが、epgrec プロジェクト - SourceForge.JPでは特にアップデートされた形跡は無いものの、いろいろと有志が改修を試みているようなので、ひとつまじめに取り組んでみた。

yano@GT110b:~/software/tv$ diff -bc epgdumpr2_20111001/ epgdumpr2/
diff -bc epgdumpr2_20111001/Makefile epgdumpr2/Makefile
*** epgdumpr2_20111001/Makefile 2009-03-15 21:33:35.000000000 +0900
--- epgdumpr2/Makefile  2013-05-17 12:00:24.366854210 +0900
***************
*** 1,10 ****
  TARGETS               = epgdump
  OBJ_TARGETS   = epgdump.o aribstr.o eit.o ts.o util.o sdt.o
  HEDDERDEPEND  = eit.h sdt.h aribstr.h ts.h util.h
  LANG=C
  CC            = gcc
! CFLAGS                =  -std=c99 -O2 -Wall -g
  #LDFLAGS              = -pthread
  LIBS          =
--- 1,12 ----
+ PREFIX          = /usr/local
  TARGETS               = epgdump
  OBJ_TARGETS   = epgdump.o aribstr.o eit.o ts.o util.o sdt.o
  HEDDERDEPEND  = eit.h sdt.h aribstr.h ts.h util.h
  LANG=C
  CC            = gcc
! #CFLAGS               =  -std=c99 -O2 -Wall -g
! CFLAGS          =  -std=c99 -O2 -Wall -g -Werror -Wno-return-type
  #LDFLAGS              = -pthread
  LIBS          =
***************
*** 21,23 ****
--- 23,28 ----
  clean:
                rm -f core ${TARGETS} *.o
+
+ install:
+       install -m 755 ${TARGETS} ${PREFIX}/bin
diff -bc epgdumpr2_20111001/aribstr.c epgdumpr2/aribstr.c
*** epgdumpr2_20111001/aribstr.c        2009-11-18 12:35:20.000000000 +0900
--- epgdumpr2/aribstr.c 2013-05-17 11:27:45.868259545 +0900
***************
*** 318,324 ****
        fptr = code;
        tptr = xcode;
!       iconv(cd, &fptr, &inbyte, &tptr, &outbyte);
        iconv_close(cd);
--- 318,324 ----
        fptr = code;
        tptr = xcode;
!       iconv(cd, (char **)&fptr, &inbyte, &tptr, &outbyte);
        iconv_close(cd);
***************
*** 622,644 ****
  void LockingShiftGL(const BYTE byIndexG)
  {
        // LSx
!       m_pLockingGL = &m_CodeG[byIndexG];
  }
  void LockingShiftGR(const BYTE byIndexG)
  {
        // LSxR
!       m_pLockingGR = &m_CodeG[byIndexG];
  }
  void SingleShiftGL(const BYTE byIndexG)
  {
        // SSx
!       m_pSingleGL  = &m_CodeG[byIndexG];
  }
! const bool DesignationGSET(const BYTE byIndexG, const BYTE byCode)
  {
        // Gのグラフィックセットを割り当てる
        switch(byCode){
        case 0x42U      : m_CodeG[byIndexG] = CODE_KANJI;                               return true;    // Kanji
--- 622,646 ----
  void LockingShiftGL(const BYTE byIndexG)
  {
        // LSx
!       m_pLockingGL = &m_CodeG[(int)byIndexG];
  }
  void LockingShiftGR(const BYTE byIndexG)
  {
        // LSxR
!       m_pLockingGR = &m_CodeG[(int)byIndexG];
  }
  void SingleShiftGL(const BYTE byIndexG)
  {
        // SSx
!       m_pSingleGL  = &m_CodeG[(int)byIndexG];
  }
! const bool DesignationGSET(const BYTE byIndexG_arg, const BYTE byCode)
  {
+       int byIndexG = (int)byIndexG_arg;
+
        // Gのグラフィックセットを割り当てる
        switch(byCode){
        case 0x42U      : m_CodeG[byIndexG] = CODE_KANJI;                               return true;    // Kanji
***************
*** 660,667 ****
        }
  }
! const bool DesignationDRCS(const BYTE byIndexG, const BYTE byCode)
  {
        // DRCSのグラフィックセットを割り当てる
        switch(byCode){
        case 0x40U      : m_CodeG[byIndexG] = CODE_UNKNOWN;                             return true;    // DRCS-0
--- 662,671 ----
        }
  }
! const bool DesignationDRCS(const BYTE byIndexG_arg, const BYTE byCode)
  {
+       int byIndexG = (int)byIndexG_arg;
+
        // DRCSのグラフィックセットを割り当てる
        switch(byCode){
        case 0x40U      : m_CodeG[byIndexG] = CODE_UNKNOWN;                             return true;    // DRCS-0
diff -bc epgdumpr2_20111001/eit.h epgdumpr2/eit.h
*** epgdumpr2_20111001/eit.h    2009-11-18 12:23:01.000000000 +0900
--- epgdumpr2/eit.h     2013-05-17 11:27:45.868259545 +0900
***************
*** 28,34 ****
  typedef struct _EITbody {
        int event_id;
        char start_time[5];
!       char duration[3];
        int running_status;
        int free_CA_mode;
        int descriptors_loop_length;
--- 28,34 ----
  typedef struct _EITbody {
        int event_id;
        char start_time[5];
!       unsigned char duration[3];
        int running_status;
        int free_CA_mode;
        int descriptors_loop_length;
diff -bc epgdumpr2_20111001/ts.c epgdumpr2/ts.c
*** epgdumpr2_20111001/ts.c     2010-02-27 16:45:15.000000000 +0900
--- epgdumpr2/ts.c      2013-05-21 13:30:28.732126582 +0900
***************
*** 40,52 ****
        /* 戻すべき残りがあるか? */
        if(ridx >= 0 && secs[ridx].cont) {
                /* バッファチェック */
                if((secs[ridx].cur.payload[secs[ridx].curlen] & 0xFF) == 0xFF) {
                        secs[ridx].cont = 0;
                        secs[ridx].seclen = 0;
                        secs[ridx].setlen = 0;
                        secs[ridx].curlen = 0;
!               } else {
                        len = secs[ridx].cur.payloadlen - secs[ridx].curlen;
                        /* 全部設定済みチェック */
                        if(len == 0) {
--- 40,56 ----
        /* 戻すべき残りがあるか? */
        if(ridx >= 0 && secs[ridx].cont) {
+ /*
+ printf("secs[%d].cur.cont=%d, secs[%d].cur.payloadlen=%d, secs[%d].curlen=%d, secs[%d].seclen=%d, len=%d\n",
+ ridx, secs[ridx].cur.cont, ridx, secs[ridx].cur.payloadlen, ridx, secs[ridx].curlen, ridx, secs[ridx].seclen, len);
+ */
                /* バッファチェック */
                if((secs[ridx].cur.payload[secs[ridx].curlen] & 0xFF) == 0xFF) {
                        secs[ridx].cont = 0;
                        secs[ridx].seclen = 0;
                        secs[ridx].setlen = 0;
                        secs[ridx].curlen = 0;
!               } else if ( secs[ridx].curlen <= secs[ridx].cur.payloadlen ){
                        len = secs[ridx].cur.payloadlen - secs[ridx].curlen;
                        /* 全部設定済みチェック */
                        if(len == 0) {
***************
*** 68,73 ****
--- 72,82 ----
                                boff = 12;
                                secs[ridx].seclen = getBit(&secs[ridx].cur.payload[secs[ridx].curlen], &boff, 12) + 3; // ヘッダ
+                               if(secs[ridx].seclen > MAXSECLEN){
+                                       // セクションが MAXSECLEN より大きい時はこのセクションをスキップ
+                                       secs[ridx].cont = 0;
+                                       goto retry;
+                               }
                                /*
                                  if(secs[ridx].seclen == 2334) {
***************
*** 96,101 ****
--- 105,116 ----
                                        goto retry; /* もう一回 */
                                }
                        }
+               } else {
+ /*
+ printf("secs[%d].cont=%d, secs[%d].cur.payloadlen=%d, secs[%d].curlen=%d, secs[%d].seclen=%d\n",
+ ridx, secs[ridx].cont, ridx, secs[ridx].cur.payloadlen, ridx, secs[ridx].curlen, ridx, secs[ridx].seclen);
+ */
+                       secs[ridx].cont = 0;
                }
        }
***************
*** 203,209 ****
                }
                memset(pk.payload, 0xFF, sizeof(pk.payload));
!               if(pk.payloadlen <= 0){
                        continue;
                }
                memcpy(pk.payload, payptr, pk.payloadlen);
--- 218,224 ----
                }
                memset(pk.payload, 0xFF, sizeof(pk.payload));
!               if( !(0 < pk.payloadlen && pk.payloadlen <= sizeof(pk.payload)) ){
                        continue;
                }
                memcpy(pk.payload, payptr, pk.payloadlen);
***************
*** 227,232 ****
--- 242,252 ----
                                        /* 最初 セクション長を調べる */
                                        boff = 12;
                                        secs[i].seclen = getBit(secs[i].cur.payload, &boff, 12) + 3; // ヘッダ;
+                                       if(secs[i].seclen > MAXSECLEN){
+                                               /* セクション長が MAXSECLEN より長いときはこのセクションをスキップ */
+                                               secs[i].cont = 0;
+                                               goto retry;
+                                       }
                                        /*
                                          if(secs[i].seclen == 2334) {
                                          printf("aa");
***************
*** 274,280 ****
                }
        }
!       //return NULL;
  }
  /* BonTest/TsStream.cppからのパクリ */
--- 294,300 ----
                }
        }
!       return NULL;
  }
  /* BonTest/TsStream.cppからのパクリ */
***************
*** 311,316 ****
--- 331,342 ----
  int checkcrc(SECcache *secs) {
+       /* regard a section with more than MAXSECLEN data as an error. */
+       if(secs->seclen > MAXSECLEN) {
+               fprintf(stderr, "SECcache overrun secs->seclen=%d\n", secs->seclen);
+               return 0;
+       }
+
        /* セクションの終りに置かれる4バイトのCRC32は、
           CRC計算の結果0になるように設定される。
           値が発生した場合は、エラーなので対象外にする */
***************
*** 320,323 ****
        }
        return 1;
  }
-
--- 346,348 ----
diff -bc epgdumpr2_20111001/util.h epgdumpr2/util.h
*** epgdumpr2_20111001/util.h   2009-03-08 16:53:42.000000000 +0900
--- epgdumpr2/util.h    2013-05-17 11:46:37.356293005 +0900
***************
*** 1,12 ****
--- 1,15 ----
  #ifndef UTIL_H
  #define UTILH 1
+ // try for segfault at 7fff77650000 ip 0000000000403c55 sp 00007fff7764ae30 error 4 in epgdump[400000+9000]
+ // #define MAXSECLEN (4096*4)
  #define MAXSECLEN 4096
  #ifdef __cplusplus
  extern "C"{
  #endif /* __cplusplus */
+       int   strrep(char *buf, char *mae, char *ato);
        int   getBit(unsigned char *byte, int *pbit, int gbit);
        void  getStr(char *tostr, unsigned char *byte, int *pbit, int len);
        int   parseOTHERdesc(unsigned char *data);

しかし、この改修を行っても日テレNEWS24の番組表が空っぽのままだったので更に調べてみたところ、日テレNEWS24のチャンネルがCS24:350からCS8:349に移っていた。ついでにディズニージュニアがCS8:339でスタートしたのも思い出したので、そのへんも追加。差分は「BS新チャンネル対応公式版」のepgdumpr2_20111001.tar.gzに対する差分なので、2011年11月版のCSチャンネル対応も含む。

OCNの3G端末対応

5月23日(木)より3G端末でも利用可能という話だったOCN モバイル エントリー d LTE 980

OCN モバイル エントリー d LTE 980

OCN モバイル エントリー d LTE 980

規制通信速度を増速という朗報とともに3G端末にも対応。

設定方法を確認しなかった自分の落ち度と言われれば甘んじて受け入れるしか無いのだが、LTE端末では lte-d.ocn.ne.jp だった接続先(APN)を3G端末では 3g-d-2.ocn.ne.jp に設定しなくてはならないという罠に躓いたものの、無事にモバイルWi-Fiルーター HW-01Cで接続確認OK。

8796.jp管理日誌のように誤ってOCN モバイル エントリー d用のAPN 3g-d.ocn.ne.jp を設定するよう指示されてしまった可哀想なケースもあるようなので記しておきたい。

【追記】OCN モバイル エントリー d LTE 980ではなく3G専用で速度規制が無い代わりに「お手軽価格の月額2,670.15円」なOCN モバイル エントリー d用のAPNという事らしい。自分の手元に届いていた会員証にも同じように書かれていて、SO-03Dを再初期化した時にハマった。どうして使えもしない別サービスのAPNを一緒に書いとくかな…

参照

ケータイ Watch http://k-tai.impress.co.jp/

NTTコミュニケーションズ オフィシャルサイト http://www.ntt.com/

OCN モバイル エントリー d LTE 980 http://www.ocn.ne.jp/mobile/entry-d-lte980/

Amazon.co.jp https://www.amazon.co.jp/

三陸復興国立公園

三陸復興国立公園が誕生というニュース。

三陸復興国立公園

5/19 三陸復興国立公園より

31番目の国立公園が増えたのかと思ったら、陸中海岸国立公園の公園区域及び公園計画の変更だそうだ。

何でもかんでも震災復興に結びつけるのは芸が無いが、観光客を呼ぶ為の動機付けとしては積極的に応援していきたい。

また田野畑村の牛乳を片手に北山崎の断崖からのんびり太平洋の大海原を眺める贅沢を満喫しに行きたいな。

参照

環境省 http://www.env.go.jp/

Wikipedia http://ja.wikipedia.org/wiki/

なっちゃん34ヶ月

4月から保育園に通い始めた"なっちゃん"。

遊ぶ、遊ぶ

5/19 志免町総合福祉施設「シーメイト」にて

当然毎朝「行きたくない」とは言うものの、俄然おしゃべりが達者になったり、歌や踊りを覚えてたり、トイレもだいぶできるようになったりと、いろいろと成長しているのを感じていたのだが、妻と保育園の方針とが折合わず1ヶ月半で中退する事に。

参照

志免町 http://www.town.shime.lg.jp/

サイバー防衛隊?

自衛隊に「サイバー防衛隊」新設との事。

イメージ画像

flickr.comより

昨年9月の防衛省が「サイバー空間防衛隊」創設などに212億円を要求から続く流れで、陸・海・空に続く第4のフィールドという事ですかね。

住民票などのコンビニ交付が始まり、マイナンバー制度も始まろうとしている現代。多種多様なニーズに応える為のサービス提供や情報化の流れは止められない事から、好むと好まざるとに関わらず国家的なセキュリティ制作や組織が必要なのは言わずもがなだが、「外国政府の関与が疑われる国家レベルのサイバー攻撃対処では、自衛隊の能力や態勢の強化を掲げた」というのも今更感が激しく漂う。

内閣官房情報セキュリティセンターも27年度をめどに「サイバーセキュリティセンター」に改組という事だが、こちらで防衛省をコントロールするというお話でしょうか?

参照

INTERNET Watch http://internet.watch.impress.co.jp/

ITpro http://itpro.nikkeibp.co.jp/

財団法人 地方自治情報センター(LASDEC) https://www.lasdec.or.jp/

内閣官房情報セキュリティセンター http://www.nisc.go.jp/

Wikipedia http://ja.wikipedia.org/wiki/

QZSSみちびき

2010年秋に打ち上げられた日本の衛星測位システム準天頂衛星初号機「みちびき」

天頂近くにいるはずなのに…

QZレーダー

GPSレシーバとしてBloadcomのBCM4751を搭載する「Nexus 7」が「みちびき」に対応済みという事なので「Xperia acro HD」も含めて試してみたところ、QZレーダー(QZ-radar)調べでは天頂付近にいるはずなのだが、残念ながら「Nexus 7」も「Xperia acro HD」もGPS Testで何も表示されなかった。

「Nexus 10」ではPRN番号193番として表示されるのだが、「Nexus 7」では1番と表記される為に1番のGPS衛星が検出されるとそちらが優先され「みちびき」が表示されないという事情があるらしい。ロットで対応が違うというのも考えにくいので、「Nexus 7」で表示されないのはその為と思われる。

「Xperia acro HD」のGPSレシーバは不明だが、ロシアの衛星測位システムであるGLONASS対応はアナウンスされていて実際に表示される事も確認できたものの、QZSSの位置には何も表示されなかったのでこちらも「みちびき」対応の是非は確認できていない。Xperia arcでは見えていないという報告もあるので、「Xperia acro HD」も期待薄かなぁ。

…結局、1番のGPS衛星が隠れた午前1時半過ぎに確認したところ、「Xperia acro HD」のGPS Testでは特に変わりなく、「みちびき」を表示できたのはNexus 7だけだった。

参照

INTERNET Watch http://internet.watch.impress.co.jp/

Developer World http://developer.sonymobile.com/

KamoLand http://kamoland.com/wiki/

準天頂衛星システム(QZSS)みちびきデータ公開サイト[QZ-vision] http://qz-vision.jaxa.jp/

Wikipedia http://ja.wikipedia.org/wiki/

知り合いかも?

Kiriko Takemura (きゃりーぱみゅぱみゅ)

facebookより

きゃりーぱみゅぱみゅが「知り合い」なわけがない。

そういえばまねだ聖子や、シドニー五輪のメダリスト日下部基栄、ギンギラ太陽’Sの「コガキョ」とかもサジェストされた事あったけれど、最近の「知り合いかも?」はどうも裏がありそうな気がしてならない。

参照

ITmedia ニュース http://www.itmedia.co.jp/news/

Wikipedia http://ja.wikipedia.org/wiki/

ツール・ド・東北2013

今年11月3日(日)にツール・ド・東北2013が開催される。

ツール・ド・東北2013ロゴ

ツール・ド・東北2013より

今年は東日本大震災復興支援の趣旨に基づいて石巻市、女川町、南三陸町を舞台にしたファンライドイベントだが、10年程度はイベントを継続する方針で、岩手県や福島県への展開やプロフェッショナル・レースの開催も視野に入れているそうだ。

そういえば今年の全日本選手権ロードレースは大分県県民の森周辺で開催されるが、開催時期がなんと6月22日~23日との事。多少の雨ならばレースに面白味を加える事もあるのだが、梅雨の最盛期に持ってくるとは何とも大胆不適だね。

参照

ツール・ド・東北2013 http://tourdetohoku.yahoo.co.jp/

Yahoo! JAPAN広報からのお知らせ http://blogs.yahoo.co.jp/yj_pr_blog/

cyclowired http://www.cyclowired.jp/

全日本自転車競技選手権大会ロードレース http://nationalchampionships-road.com/

サイクルスポーツ.jp http://www.cyclesports.jp/

Wikipedia http://ja.wikipedia.org/wiki/

ウォータースクリーン

シドニーの道路でトンネルの入り口に発生させたウォータースクリーンに標識映像を投影し、ドライバーに警告を促す仕組みが導入されたそうだ。

大きな「STOP」の標識

A tight fit - YouTubeより

高さ制限を無視してトンネルを塞いでしまう事故を防ぐ為だそうだが、なかなか斬新で面白いアイディアだと思う。

安全性の面ではウォータースクリーンなのでブレーキが間に合わなくてスクリーンに突っ込んでも大丈夫。強いて言えば急ブレーキで後続車が追突する可能性はあるが、それはトンネルにつっかえたケースを考えると同じ事なので、十分な車間距離を確保していなかった後続車が悪いという事になる。

ただ、二輪車やオープンカーなどで巻き添えを食うと濡れてしまう心配があるので、ウォータースクリーンではなくてミスト程度でできるといいのだが。

参照

GIGAZINE http://gigazine.net/

マッハ車検

2008年に購入したティーダ50498kmで2回目の継続車検。

マッハ5デザインの書類

マッハ5デザインの書類

2年前に続いてファミリーユサ福岡東店へ。

前回はエコカー減税の軽減税率適用で15,000円だった重量税が正規の24,600円となり、24,950円から値上がりした自賠責27,840円等と合わせて法定費用合計が53,540円

13,000円の検査料は各種割引適用で7,000円になったものの、光軸調整と発煙筒とオイル交換費用3,300円が加わり合計10,300円

〆て総額63,840円也となり、2年前より1万2千円ほど増加となった。

しかし、リモートカメラでピットを眺めているだけ「立ち会い車検」と言われても何だかなぁ…という気がする。特に問題が無かったから眺めるだけで終わったのかもしれないが…

参照

マッハ車検 http://mach5.jp/

カー用品・バイク用品のことなら『ファミリーユサ』 http://www.yusayusa.com/