Windows Server 2003 SP1(worlgroup)でVisaul Studio 2005を使っていて、サービスパック1をインストールshなきゃと思って、インストールを始めました。
リリースノートを読んで、エラーが出るのかな(?)と思いつつ、試したらエラーがでました。 Windows Server 2003のインストールでは、「エラー 1718。ファイルFilenameはデジタル署名ポリシーによって拒否されました」との内容がリリースノートに記載されていたのですが、発生したエラーは「インストールリソース(あやふや)にアクセスできません」というものです。
エラー番号が出てないので、「?」と思って色々と試したのですが、同じエラーが発生してインストールできません。仕方がないのでアンインストールしてからインストールして、再度SP1をインストールしても一緒でした。リリースノートに書かれていた、対策を読んでローカルセキュリティポリシーを設定しようとしたら、ソフトウェア制限ポリシーに「実行」 というポリシーが無いんですね。
ふーむと考えながら、該当するのはどのポリシーかなと思いながら「強制」を選択し、ローカルの管理者を除くすべてのユーザーに設定しました。
この状態でSP1をインストールしたら、動き出しました。で、色々と調べていったらイベントビューアに「エラー1718」が出力されていました。あっ、と思ったけど。
Windows XPやVistaにインストールするときは、ここまで手間がかからなかったから、気がつきませんでした。
やっぱし、Serverに開発製品をインストールするもんじゃないですね。
2007年1月30日火曜日
2007年1月28日日曜日
FePyのElementPathモジュール
IronPythonでFePyのElementTreeモジュールを使用するときにXPathがうまく使えないということを以前に説明しました。これは正規表現のreモジュールの実装の違いであると説明しました。
具体的には、ElementPathはXPathを分解するのにre.filndall()メソッドを使ってリストの要素としてタプルが含まれていることを期待しているのですが、IronPython 1.0.1のre.findall()メソッドはリストのみを返すためにエラーとなります。
この現象を回避するために、ElementPathモジュールをxpath_tokenizerをIPCEかIronPythonかで正規表現の扱いかたを変更する必要があります。それには、以下のようにElementPathを書き換える必要があります。
上記のように変更すれば、IronPython 1.0.1でもXPath式が利用できるようです。
具体的には、ElementPathはXPathを分解するのにre.filndall()メソッドを使ってリストの要素としてタプルが含まれていることを期待しているのですが、IronPython 1.0.1のre.findall()メソッドはリストのみを返すためにエラーとなります。
この現象を回避するために、ElementPathモジュールをxpath_tokenizerをIPCEかIronPythonかで正規表現の扱いかたを変更する必要があります。それには、以下のようにElementPathを書き換える必要があります。
##
# Deference IronPython-1.0.1 and IPCE-r5
# IPCE-r5 re.findall return a list includes tuple
# IP-1.0.1 re.findall return a list only
## 正規表現をコンパイルします
_token_pattern = re.compile(
"(::|\.\.|\(\)|[/.*:\[\]\(\)@=])|((?:\{[^}]+\})?[^/:\[\]\(\)@=\s]+)|\s+")
# When use IPY 1.0.1, return True
# IronPython 1.0.1 の正規表現かどうかをテストします
def _check_ipy():
ret = _token_pattern.findall("/root/test")
itm = ret[0]
if isinstance(itm, tuple): return False
return True
## for IPY 1.0.1 Only
## IronPython 1.0.1の場合に呼び出される関数を定義します
def _ipy_tokennizer(xpath):
return [m.groups() for m in _token_pattern.finditer(xpath)]
xpath_tokenizer = _token_pattern.findall
## IronPython 1.0.1なら呼び出し先を関数に変更します
if _check_ipy():
xpath_tokenizer = _ipy_tokennizer
##
# original code 以下は、元のオリジナルなコードです
#xpath_tokenizer = re.compile(
# "(::|\.\.|\(\)|[/.*:\[\]\(\)@=])|((?:\{[^}]+\})?[^/:\[\]\(\)@=\s]+)|\s+"
# ).findall
##
上記のように変更すれば、IronPython 1.0.1でもXPath式が利用できるようです。
2007年1月23日火曜日
FePyのElementtreeモジュール 3
既に見つけていたpyexapt.pyですが、これに手を加えてXMLであればXML宣言のencodingを使い、HTMLであればmetaのcharsetを使って、ユニコードに変換するように書き加えてみました。 そのソースコードを以下に示します。
# Copyright (c) 2005, 2006 Seo Sanghyeon
# A chapter from Dan Wahlin's "XML for ASP.NET Developers" is useful
# for understanding this code. Posted to informit.com, 2002-02-22.
# http://www.informit.com/articles/article.asp?p=25485
# 2005-11-16 sanxiyn Created
# 2006-08-18 sanxiyn Merged changes from Mark Rees
# * Adapted to the new way to load .NET libraries
# * Handle empty elements
# 2006-08-29 sanxiyn Added support for XML namespaces
# Simplified code a lot
# 2006-10-21 sanxiyn Minimal support for xml.sax
# 2006-10-24 sanxiyn Implemented ordered_attributes, namespace_prefixes
# 2006-10-27 sanxiyn Added expat.error
# 2006-10-29 sanxiyn Implemented Start/End NamespaceDeclHandler
# 2006-11-20 sanxiyn Merged changes from Fredrik Lundh
# * Handle multiple calls to Parse()
import clr
clr.AddReference("System.Xml")
from System import Enum
from System.IO import StringReader
from System.Xml import XmlReader, XmlNodeType
# xml.sax passes an undocumented keyword argument "intern" to ParserCreate.
# Let's ignore it.
def ParserCreate(encoding=None, namespace_separator=None, **kw):
return xmlparser(namespace_separator)
# Used by xml.sax
XML_PARAM_ENTITY_PARSING_UNLESS_STANDALONE = 1
# Used by Kid
XML_PARAM_ENTITY_PARSING_ALWAYS = 2
class error(Exception):
pass
class xmlparser(object):
__slots__ = [
# Internal
"_data",
"_separator",
"_reader",
"_ns_stack",
"_enc",
# Attributes
# Implemented
"ordered_attributes",
"namespace_prefixes",
# Stub for xml.dom
"buffer_text",
"specified_attributes",
# Handlers
# Implemented
"StartElementHandler",
"EndElementHandler",
"CharacterDataHandler",
"StartNamespaceDeclHandler",
"EndNamespaceDeclHandler",
# Stub for ElementTree
"DefaultHandlerExpand",
# Stub for xml.sax
"ProcessingInstructionHandler",
"UnparsedEntityDeclHandler",
"NotationDeclHandler",
"ExternalEntityRefHandler",
# Stub for xml.dom
"StartDoctypeDeclHandler",
"EntityDeclHandler",
"CommentHandler",
"StartCdataSectionHandler",
"EndCdataSectionHandler",
"XmlDeclHandler",
"ElementDeclHandler",
"AttlistDeclHandler",
# Stub for Kid
"DefaultHandler",
]
returns_unicode = True
intern = {}
def __init__(self, separator):
self._data = []
self._separator = separator
self._ns_stack = []
self.ordered_attributes = False
self.namespace_prefixes = False
from System.Text import Encoding
self._enc = Encoding.ASCII.WebName #デフォルトエンコーディング
def Parse(self, data, isfinal=False):
self._data.append(data)
if isfinal:
data = "".join(self._data)
self._data = None
self._parse(data)
def _qname(self):
separator = self._separator
reader = self._reader
if separator is None:
# Name convert unicode
return self._handle_unicodechar(reader.Name)
#return reader.Name
if reader.NamespaceURI:
# qname covert unicode
temp = reader.NamespaceURI + separator + self._handle_unicodechar(reader.LocalName)
#temp = reader.NamespaceURI + separator + reader.LocalName
if self.namespace_prefixes:
if reader.Prefix:
return temp + separator + reader.Prefix
else:
return temp
else:
# qname convert unicode
return self._handle_unicodechar(reader.LocalName)
#return reader.LocalName
def _parse(self, data):
#パッチ XmlReaderSettingでDTDの検証をしないに追加
from System.Xml import XmlReaderSettings
readersettings = XmlReaderSettings()
readersettings.ProhibitDtd = False
reader = XmlReader.Create(StringReader(data), readersettings)
self._reader = reader
while reader.Read():
nodetype = reader.NodeType
typename = Enum.GetName(XmlNodeType, nodetype)
# meta tag case in html, then call meta handler( get chareset) charsetを処理するハンドラの設定
if reader.Name.lower() == "meta":
typename = "meta"
handler = getattr(self, '_handle_' + typename, None)
if handler is not None:
handler()
def _handle_Element(self):
reader = self._reader
name = self._qname()
ns_stack = self._ns_stack
ns_stack.append(None)
if self.ordered_attributes:
attributes = []
else:
attributes = {}
while reader.MoveToNextAttribute():
if reader.Prefix == 'xmlns':
# LocalName convert unicode
prefix = self._handle_unicodechar(reader.LocalName)
#prefix = reader.LocalName
uri = reader.Value
ns_stack.append(prefix)
if hasattr(self, "StartNamespaceDeclHandler"):
self.StartNamespaceDeclHandler(prefix, uri)
continue
key = self._qname()
# attribute value convert unicode
value = self._handle_unicodechar(reader.Value)
#value = reader.Value
if self.ordered_attributes:
attributes.append(key)
attributes.append(value)
else:
attributes[key] = value
reader.MoveToElement()
if hasattr(self, "StartElementHandler"):
self.StartElementHandler(name, attributes)
# EndElement node is not generated for empty elements.
# Call its handler here.
if reader.IsEmptyElement:
self._handle_EndElement()
def _handle_EndElement(self):
name = self._qname()
if hasattr(self, "EndElementHandler"):
self.EndElementHandler(name)
ns_stack = self._ns_stack
while True:
prefix = ns_stack.pop()
if prefix is None:
break
if hasattr(self, "EndNamespaceDeclHandler"):
self.EndNamespaceDeclHandler(prefix)
def _handle_Text(self):
reader = self._reader
# text convert unicode
data = self._handle_unicodechar(reader.Value)
#data = reader.Value
if hasattr(self, "CharacterDataHandler"):
self.CharacterDataHandler(data)
# handle encoding from XmlDeclation XML宣言からencodingを取得
def _handle_XmlDeclaration(self):
enc = self._reader.GetAttribute("encoding")
if enc == "" :
return
self._enc = enc
# hadle charset from meta tag in html metaタグからcharsetを取得
def _handle_meta(self):
content = self._reader.GetAttribute("content")
if content == "":
return
content = content.lower()
i = content.find("charset=")
if i == -1:
return
chardata = "".join([content[j] for j in range(i + 8, len(content))])
charset = chardata.split(";")[0].strip()
self._enc = charset
# ユニコードに変換
def _handle_unicodechar(self, data):
if self._enc == "":
return data
try:
return unicode(data, self._enc)
except:
return data
# Stub for xml.sax
def SetBase(self, base):
pass
def SetParamEntityParsing(self, flag):
return True
# Stub for Kid
def UseForeignDTD(self):
pass
2007年1月21日日曜日
IronPythonとElementTreeモジュール 2
FePyプロジェクトで提供しているElementTreeモジュールがIronPython 1.0.1でも使えることを前回に説明しましたが、日本語などの文字列をデコードしてくれないのはなぁと思っていて、いろいろと調べました。結局、pyexpat.pyの_parseメソッドには読み込み済みのデータが流れているので、ElementTreeモジュールを何とかしないといけないんです。
ElementTreeのコンストラクタを見るとopen関数でファイルを開いて、XMLの場合はXMLTreeBuilderモジュールで処理をしていました。ああ、open関数か...これを使っているとファイルのエンコードを判別してくれないんですね。さて、どうしたものでしょうねぇ。
XMLだけなら方法は無くないけど、HTMLとかも考えると。うーん。どうしたもんだろう。
結局はpyespat.pyの中でXML宣言のエンコーディングを取り出して、タグ名やらアトリビュート名、値を愚直にunicode関数で変換しました。encoding指定がない時は、デフォルトをUTF-8指定にしています。ネームスペースとかに日本語などを使わない限りは、大丈夫でしょう。
FePyプロジェクトがpyespat.pyモジュールを作成した理由は、CPythonだとxmlparserが提供されるけど、IronPythonでは提供されないという理由からのようです。
ElementTreeのコンストラクタを見るとopen関数でファイルを開いて、XMLの場合はXMLTreeBuilderモジュールで処理をしていました。ああ、open関数か...これを使っているとファイルのエンコードを判別してくれないんですね。さて、どうしたものでしょうねぇ。
XMLだけなら方法は無くないけど、HTMLとかも考えると。うーん。どうしたもんだろう。
結局はpyespat.pyの中でXML宣言のエンコーディングを取り出して、タグ名やらアトリビュート名、値を愚直にunicode関数で変換しました。encoding指定がない時は、デフォルトをUTF-8指定にしています。ネームスペースとかに日本語などを使わない限りは、大丈夫でしょう。
FePyプロジェクトがpyespat.pyモジュールを作成した理由は、CPythonだとxmlparserが提供されるけど、IronPythonでは提供されないという理由からのようです。
2007年1月20日土曜日
IPCE r5のsocketモジュール
IronPythonでurllibモジュールのurlopen()関数やurlretrieve()関数が使えないかと考えて、FePyプロジェクトのIPCE r5を色々と調べました。結果と二つのことがわかりました。
import fepy
fepy.override_builtin('socket')
早速、urllibをインポートしてurllib.urlopen()関数を呼んでみると、残念ながらエラーになってしまいました。どうも返ってくるはずのファイル風オブジェクトが、正しいオブジェクトを持っていないのが原因のようです。
そこで、色々とハックしてみました。ハックしていくとhttplibが、socketのmakefile()を呼んでいることを見つけ、このmakefileが正しい結果を返さないのが原因でした。これに対処するには、socket.pyのmakefileメソッドの実装を変更する必要があります。
変更前:
stream = NetworkStream(self.socket)
return file(stream, mode)
変更後:
return _fileobject(self, mode, bufsize)
つまり、NetworkStreamオブジェクトをファイルオブジェクトに変換できないというのが原因でした。変更した_fileobjectのインスタンスは、httplibやhttplib2が使用しているsocketモジュールのオブジェクトで、CPythonのドキュメントには記載されていません。このことをFePyプロジェクトでは知っていたから、socketモジュールの独自実装を行っているようです。
この変更が完了したら、IPCE r5からでもIronPython 1.0.1からでもurllibのurlopen()関数やurlretrieve()関数が正常に動作するようになりました。
- IPCE r5は標準では、IronPythonのsocketモジュールを使用している
- IPCE r5で、socketモジュールの独自実装が始まっている
import fepy
fepy.override_builtin('socket')
早速、urllibをインポートしてurllib.urlopen()関数を呼んでみると、残念ながらエラーになってしまいました。どうも返ってくるはずのファイル風オブジェクトが、正しいオブジェクトを持っていないのが原因のようです。
そこで、色々とハックしてみました。ハックしていくとhttplibが、socketのmakefile()を呼んでいることを見つけ、このmakefileが正しい結果を返さないのが原因でした。これに対処するには、socket.pyのmakefileメソッドの実装を変更する必要があります。
変更前:
stream = NetworkStream(self.socket)
return file(stream, mode)
変更後:
return _fileobject(self, mode, bufsize)
つまり、NetworkStreamオブジェクトをファイルオブジェクトに変換できないというのが原因でした。変更した_fileobjectのインスタンスは、httplibやhttplib2が使用しているsocketモジュールのオブジェクトで、CPythonのドキュメントには記載されていません。このことをFePyプロジェクトでは知っていたから、socketモジュールの独自実装を行っているようです。
この変更が完了したら、IPCE r5からでもIronPython 1.0.1からでもurllibのurlopen()関数やurlretrieve()関数が正常に動作するようになりました。
2007年1月8日月曜日
IronPythonとElementTreeモジュール
PythonでXMLやHTMLを使うのに便利なモジュールとしてElementTreeがあります。これをIronPythonから使えないかと考えて、いろいろと試してみました。結果は、予測通りでそのままでは使えませんでした。
このため、FePyプロジェクトのIPCE-r5に含まれているElementTreeを使ってみました。結果としては、
XPathの問題は何が原因かなと思ってソースコードを少々調べました。結果、IPCEの実装では、XmlReaderを使ってドキュメントを読み込んでいるのと、XPath式を分解するのに正規表現を使っているのを見つけました。XPath式を分解するための正規表現のパターンが、IronPython1.0.1では思った結果を返さないことが原因であると判明しました。
これはIPCEのreモジュールが、CPythonとの互換性を目指して修正されていることが原因でした。ということは、パターンをIronPython向けに移植すれば使えそうな感じです(ElementPath.pyのxpath_tokenizer)。
セキュリティ例外の件は、XmlReader.CreateメソッドでXmlReaderのインスタンスを作成しているのですが、ここにXmlReaderSettings.ProhibitDtd=Falseを渡すことで回避できます(pyexpat.pyの_parseメソッド)。
基本的に上記の問題以外は使えそうなのですが、IronPythonとIPCEも_codecsモジュールの実装上の問題があり、日本語を含むマルチバイト(正確にはASCII以外)の文字はXMLでエンコードを指定していても変換してくれません。このため、自分でencode()関数を使ってユニコードに変換する必要があります。
これ以外にXMLをIronPythonで使うには、XmlDocumentを使う方法になります。さて、どうしたもんでしょうかねぇ。
このため、FePyプロジェクトのIPCE-r5に含まれているElementTreeを使ってみました。結果としては、
- XPathを使わなければIronPython1.0.1から使える。
- IPCE-r5で使えば、XPathも使える(findtext、findallなど)。
- DTDを使用していると環境によってセキュリティ例外がでる(IPCEとIronPythonとも)。
XPathの問題は何が原因かなと思ってソースコードを少々調べました。結果、IPCEの実装では、XmlReaderを使ってドキュメントを読み込んでいるのと、XPath式を分解するのに正規表現を使っているのを見つけました。XPath式を分解するための正規表現のパターンが、IronPython1.0.1では思った結果を返さないことが原因であると判明しました。
これはIPCEのreモジュールが、CPythonとの互換性を目指して修正されていることが原因でした。ということは、パターンをIronPython向けに移植すれば使えそうな感じです(ElementPath.pyのxpath_tokenizer)。
セキュリティ例外の件は、XmlReader.CreateメソッドでXmlReaderのインスタンスを作成しているのですが、ここにXmlReaderSettings.ProhibitDtd=Falseを渡すことで回避できます(pyexpat.pyの_parseメソッド)。
基本的に上記の問題以外は使えそうなのですが、IronPythonとIPCEも_codecsモジュールの実装上の問題があり、日本語を含むマルチバイト(正確にはASCII以外)の文字はXMLでエンコードを指定していても変換してくれません。このため、自分でencode()関数を使ってユニコードに変換する必要があります。
これ以外にXMLをIronPythonで使うには、XmlDocumentを使う方法になります。さて、どうしたもんでしょうかねぇ。
2007年1月5日金曜日
地上波デジタル放送について
デジタル放送のTV番組を見るようになって、はや2年位になります。確かに、宣伝通りに画質は奇麗なんだけど、不満な点が何点かあります。
1.アスペクト7:3の番組が少ない。
2.放送局の都合で勝手にデータモードにされる。
3.チャンネルの切り替えが遅い
というものです。
1.のアスペクトに関しては、初回放送が7:3なのに再放送では6:4しかなかったりします。しかも、アスペクトの制御信号を放送局が送るので、TV側の機能でも比率を変更することができません。使い難いったらありゃしない。極論すると、放送局が見せてあげるんだから、視聴者は俺らが指定した比率で見ろと押しつけているかのようです。TV側の機能で無視することもできると思うけど、販売するための認証が通らないのでしょうね。きっと。TVという機器の値段を押し上げていると思うんだけど。
2.勝手にデータモードにしてくれた放送局が、MBSとNHKでありました。非常にウザッタイ出来事でした。自分でTVを操作していないのに、データ放送受信モード(リモコンのデータボタン)に切り替わるんですね。最初に気がついたときに、アレ?と思ったんだど。繰り返し切り替わるので、これは放送局が勝手に制御信号を流していると気がつきました。放送局側とTVメーカーに苦情を当り前のこととして言いました。放送局側の電話の対応者は、そんなことができるんですか?と驚いていましたが、お前らがやったんだろうが。てなもんです。TVの所有者は誰なんでしょうね?技術的にできるからといって、やっていいとは限りません。
3.チャンネル切り替えが遅いのは、現時点ではしょうがないのでしょう。TV側の機能が向上すれば、もう少し早くなるかも知れません。
皆さん、B-CASカードってご存知ですか。デジタル放送を視聴するのに必須のカードなんですが、これって貸与なんですね。しかも契約として物議を醸しているシュリンクラップ契約(袋を破くと契約したっていうやつです)なんですね。B-CASカードを管理している株式会社ビーエス・コンディショナルアクセスシステムズなんですが、この会社は放送局や家電メーカが出資して設立した会社です。
この会社の一番の問題と私が考えるのは、B-CASを契約した視聴者の個人情報がこの一社に集まっているという点です。日本全国の契約者情報ですよ。住民基本台帳ネットワークにおける個人情報の扱いで色々な議論があったと思います。ですが、住基ネットと同じと言わないけれど匹敵する位の個人情報を一つの企業が握るというのは、非常に問題だと思いませんか? どうして、誰も問題提起しなかったんだろう?と私は考えます。もっと、安全性に関して議論すべきだと思うんですね。
TV局からの個人情報漏洩事故が過去にありました。この漏洩した個人情報のかなりの部分が、このB-CAS社からTV局側に渡ったものと思われます。何故なら、B-CAS社に登録する個人情報が、既定ではTV局へ通知しても良いとなっているからです。皆さんもご存じでしたでしょうか。これが、シュリンクラップ契約なるものをTVなどの家電製品と一緒に配布した成果と言えるのでは、ないでしょうか。
私の場合は、TV局への通知は「いいえ」にしましたけど。このB-CAS社に対する登録は、CATV経由の視聴の場合は必須なんです。自分で購入したTVの場合は任意ですけど。設置にきた人たちは、口を揃えて登録してくださいという罠が待ち構えています。
さあ、皆さんならどうしますます? ご家族ならどうされますか?
1.アスペクト7:3の番組が少ない。
2.放送局の都合で勝手にデータモードにされる。
3.チャンネルの切り替えが遅い
というものです。
1.のアスペクトに関しては、初回放送が7:3なのに再放送では6:4しかなかったりします。しかも、アスペクトの制御信号を放送局が送るので、TV側の機能でも比率を変更することができません。使い難いったらありゃしない。極論すると、放送局が見せてあげるんだから、視聴者は俺らが指定した比率で見ろと押しつけているかのようです。TV側の機能で無視することもできると思うけど、販売するための認証が通らないのでしょうね。きっと。TVという機器の値段を押し上げていると思うんだけど。
2.勝手にデータモードにしてくれた放送局が、MBSとNHKでありました。非常にウザッタイ出来事でした。自分でTVを操作していないのに、データ放送受信モード(リモコンのデータボタン)に切り替わるんですね。最初に気がついたときに、アレ?と思ったんだど。繰り返し切り替わるので、これは放送局が勝手に制御信号を流していると気がつきました。放送局側とTVメーカーに苦情を当り前のこととして言いました。放送局側の電話の対応者は、そんなことができるんですか?と驚いていましたが、お前らがやったんだろうが。てなもんです。TVの所有者は誰なんでしょうね?技術的にできるからといって、やっていいとは限りません。
3.チャンネル切り替えが遅いのは、現時点ではしょうがないのでしょう。TV側の機能が向上すれば、もう少し早くなるかも知れません。
皆さん、B-CASカードってご存知ですか。デジタル放送を視聴するのに必須のカードなんですが、これって貸与なんですね。しかも契約として物議を醸しているシュリンクラップ契約(袋を破くと契約したっていうやつです)なんですね。B-CASカードを管理している株式会社ビーエス・コンディショナルアクセスシステムズなんですが、この会社は放送局や家電メーカが出資して設立した会社です。
この会社の一番の問題と私が考えるのは、B-CASを契約した視聴者の個人情報がこの一社に集まっているという点です。日本全国の契約者情報ですよ。住民基本台帳ネットワークにおける個人情報の扱いで色々な議論があったと思います。ですが、住基ネットと同じと言わないけれど匹敵する位の個人情報を一つの企業が握るというのは、非常に問題だと思いませんか? どうして、誰も問題提起しなかったんだろう?と私は考えます。もっと、安全性に関して議論すべきだと思うんですね。
TV局からの個人情報漏洩事故が過去にありました。この漏洩した個人情報のかなりの部分が、このB-CAS社からTV局側に渡ったものと思われます。何故なら、B-CAS社に登録する個人情報が、既定ではTV局へ通知しても良いとなっているからです。皆さんもご存じでしたでしょうか。これが、シュリンクラップ契約なるものをTVなどの家電製品と一緒に配布した成果と言えるのでは、ないでしょうか。
私の場合は、TV局への通知は「いいえ」にしましたけど。このB-CAS社に対する登録は、CATV経由の視聴の場合は必須なんです。自分で購入したTVの場合は任意ですけど。設置にきた人たちは、口を揃えて登録してくださいという罠が待ち構えています。
さあ、皆さんならどうしますます? ご家族ならどうされますか?
登録:
投稿 (Atom)