yum update実行時にAttributeError: ‘YumBaseCli’ object has no attribute ‘_not_found_i’が発生

2015-01-17 06:06:48

CentOS 6.5にてyum updateを行なったところ、以下のエラーが発生した。実のところ、Pythonのモジュールを色々入れてから、調子が悪い。

Traceback (most recent call last):
File "/usr/bin/yum", line 29, in
yummain.user_main(sys.argv[1:], exit_code=True)
File "/usr/share/yum-cli/yummain.py", line 288, in user_main
errcode = main(args)
File "/usr/share/yum-cli/yummain.py", line 223, in main
return_code = base.doTransaction()
File "/usr/share/yum-cli/cli.py", line 453, in doTransaction
lsts = self.listTransaction()
File "/usr/share/yum-cli/output.py", line 1055, in listTransaction
(_('Not installed'), self._not_found_i.values()),
AttributeError: 'YumBaseCli' object has no attribute '_not_found_i'

CentOSのページからyumのrpmファイルをダウンロードして、以下のコマンドを実行してyumの再インストールを行なったところ正常に動作するようになった。

rpm -ivh --replacepkgs yum-3.2.29-43.el6.centos.noarch.rpm

yumコマンドを実行するとpycurlでエラーになる

CentOS 6.5にてyumコマンドを実行すると以下のエラーが発生し、yumコマンドが動作しない。

# yum
There was a problem importing one of the Python modules
required to run yum. The error leading to this problem was:

pycurl: libcurl link-time ssl backend (nss) is different from compile-time ssl backend (none/other)

yumはPythonで作られている。そのためPython実行環境のライブラリバージョンと、yumコマンドが使用しているライブラリバージョンの整合性がとれなくなると動作しなくなる。

下記のコマンドを実行してpycurlを一度アンインストールした後、コンパイルオプションを指定して、再度pycurlをインストールする事で正常に動作した。

# pip uninstall pycurl
# export PYCURL_SSL_LIBRARY=nss
# pip install pycurl

参考URL

通信販売に関する法律

ネタがないので、IT系の法律の話とか。

まず、特定の法律に関係なく、一般的な話をしておく。良く法律だけ読んで分かった気になって話す人が居るが、これはやめた法がよい。法文には明記されてない行間があったり、用語の使い方が日常の文書と異なったり、別の法律と補完相克関係にあったり、行政判断に委ねてる部分があったりする。だから必ず行政の通達や、裁判の判例もあわせて見ないと、とんでもない誤解をする事になる。

 Ⅰ.売買契約

通信販売に関する法律には特定商取引法がある。もともとは訪問販売法として、いわゆる押し売りを規制するための法律としてあったのが、電話勧誘完売とか、通信販売とか、いくつかの特定の方法を用いた販売方法について規制する法律として焼き直されたものだ。

通信販売に関して法律で規定されていることは大きく3つになる。

 1.商品や売買契約に関する情報の表示だ。

通信販売では、商品表示(広告)の内容についての規定があり、価格(送料など取引において発生する金額すべて)、住所氏名(メールアドレスも含む)、支払方法、商品の瑕疵、返品などに関する特約事項、その他の販売条件などの表示が義務づけられる。また商品広告の内容は客観的な事実に基づくものでなくてはなりません。

 2.返品(契約解除)への応諾義務

通信販売での返品について、多い誤解にクーリングオフがある。実は通信販売にクーリングオフという制度はない。クーリングオフは売り手側からコンタクトをとる訪問販売や電話勧誘に対する規制で、買い手側からコンタクトを取る通信販売では、対象にならない。

では、通信販売は返品に応ずる必要が無いかというと、そうではない。返品に関する特約事項を買い手に伝えていない場合は、商品到着後8日以内なら無制限に返品に応じる義務が発生する。この時に消費者が負担しなければならない金額は、商品の返送にかかる送料のみとなる。
返品に関する契約を規定しないと、食品を既に全部食べ終わって、包装紙だけになっていても返品に応じる事になる。逆に返品出来ない事を明確にしていれば、返品に応じる必要は無い。
返品に近い事柄にとして、民法上の錯誤による無効がある。商品説明の重要事項や契約事項が分かりにくいところに書いてあったりした場合には、勘違いで購入したとして、契約を無効にする事が出来る。特定商取引法上の契約解除は、民法上の錯誤無効と異なり、契約を解除にしたことによって発生した損害について、賠償する必要がない点で異なる。

 3.わかりやすく表示する義務

購入の申し込みなのか、有償なのかということがわかりやすい表示を義務付けている。購入ページで規約のチェックボックスをつけたり、ボタンを購入としてるのは、錯誤が発生しないことをUIレベルで担保するために行われている。「ほしい人はここをクリック」などのボタンを押したとしても売買契約とは認められない。
過去に通信販売事業者で摘発を受けた業者の多くは広告表示の不備によるものです。商品の広告内容に虚偽があったため、多くの開運グッズの通信販売事業者が摘発を受けています。~大師のような架空の人物の紹介文を載せたりしていたことが原因です。
また、契約解除にあたって特約として明記していない賠償を請求したことにより、摘発を受けた事業者もあります。

Windows XPサポート終了におけるIT業界の責任

Windows XPサポート終了におけるIT業界の責任(http://japan.zdnet.com/cio/sp_13matsuokaopinion/35044036/)という記事について、各所で色々意見されているので、私も纏めておきたい。

多くの論調は「ユーザー責任であって、IT業界に責任を求めるのは筋違いだろう」という物だが、ある面においてIT業界にも責任はあると思う。IT業界は維持運用にかかるコストについて、説明責任を果たしていなかったと思う。

独自開発したソフトウェアの維持コスト

日本では多くの企業が基幹システムとして、パッケージソフトをそのまま使うのでは無く、大幅にカスタマイズして独自機能を盛り込んだり、あるいは全くの0から独自システムを開発してきた。

これらのソフトを数年おきに発売される最新のOS等に対応させ続けるためには、本来なら開発者を囲って開発体制を維持するコストが必要になる。システムの細部の実装までドキュメント化して残しておくことはきわめて困難だし、また半年も担当から離れれば詳細な実装部分について忘却してしまうことは、開発者なら経験的に知っているはずだ。もし新しいOSや問題に迅速に対処しようとするなら、一定人数の開発者を開発完了後も独自開発したシステムに携わり開発体制を維持し続ける必要がある。

独自システムというのは作って稼働したからといって、そこで開発を終了してはならないものだった。昨今言う継続的インテグレーションを行ない、一定のコストを払い、常に改善や新機能の追加をし続ける必要がある。そうしなければ開発体制を維持する事は出来ない。

今多くの企業では、必要になってから技術者を集め、リバースエンジニアリングを行ないつつ、新たに開発体制を作り直すと言う方法を取っている。既存のシステムを解きほぐし、結果から過程を再現していくのは、相当に有能な人材を集めないと出来ないし、時間もかかる。また、古い開発環境と、新しい開発環境の両方に精通した人材を集める必要もあるので、構成人員のキャリアは高くなりがちになる。そのための予算も事前に考えてないし、コストも高く、人材も確保できず、時間も足りず、移行できない状況に陥っているのだろう。

 

ソフトウェアを売切りにしてしまったこと

二つ目のIT業界の責任は、パッケージソフトウェアを売切りにしていることだと思う。Windows XP発売当初、保守サポートの有効期限は区切られていなかった。ユーザーにとっては初期費用を払えば、追加コスト無しで使い続けられる製品だったわけで、ここに嘘がある。

安全に使い続けるためには保守が必要不可欠だというなら、売切りにすべきでは無かった。維持にコストがかかるなら、それを素直に料金体型に反映させるべきだったと思う。現在Adobeがいち早く対応したが、月額などの継続的に料金を支払い続けるシステムにすべきだったと思う。

WindowsXPだけの問題では無い

実はWindowsXPだけが大きな問題になっているが、同様の問題は他にも複数発生しつつある。

例えばAndoroidスマートフォンでは携帯電話メーカーからOSのアップデートが提供される事は殆ど無い。Andoroidの開発元であるGoogleは定期的にアップデートを提供しているにも関わらず・・・だ。セキュリティ上の問題はいくつも見つかっており、本来ならアップデートを提供すべきだが、売切りの状態のまま殆どの場合放置されている。もしセキュリティ問題の無い状態で使おうと思ったら、半年ごとに端末を買換える必要がある状況だ。でも携帯メーカーはそんな説明をしていない。

最近はTV等の家電もインターネットに接続する機能を有している。攻撃を受ける可能性もあるわけでセキュリティ上の問題が見つかればアップデートも必要なはずだが、アップデートは滅多に行なわれないし、いつまで無償でサポートするのか明示していない。

またメーカーが保守開発をひっそりと止めてしまったソフトウェアというのは沢山ある。一太郎や三四郎、ロータス123はすでに保守開発していないので、セキュリティホールは放ったままだ。Macintosh OSも最新バージョン以外は直ぐに保守を止めてしまうので、数年ごとにOSを買換えていないなら危険だ。

Windows XPに限った問題では無く、保守開発はコストがかかり、保守開発を維持していないソフトウェアを継続利用してはならないって、本質的な問題について議論する必要がある。

PythonをWinodwsにインストールする

日本国内ではRubyが幅をきかせていますが、海外ではC言語との親和性の高さと、豊富なサードパーティライブラリ群でPythonが人気を博しています。HadoopでMapReduceなアプリケーションを作る場合にも使えますので、WindowsへのPythonのインストール手順を確認しておきます。

PythonではVersion2.x系列と、Version3.x系列

PythonではVersion2.x系列と、Version3.x系列の2種類がメンテナンスされています。Version2.xとVersion3.xは言語仕様が異なるので互換性がありません。Version2.x系は変数に文字列型とUnicode文字列型の2種類があり、関数呼び出しの記述で括弧をかきません。これに対してVersion3.x系はUnicode文字列型だけになり、関数呼び出しの記述に括弧を付けるようになりました。現在主立ったLinuxディストリビューションに含まれているのはVersion2.x系列になります。ここではVersion2.x系をインスト-ルします。

どのPythonディストリビューションを使用するか?

Windows用に配布されているPythonにはPython.orgの純正版のほかに、ActiveState版等複数の亜種があります。

Pythonでは各種ライブラリやパッケージの管理にMyPIと言うツールを使います。WindowsでもMyPI自身は動作するのですが、パッケージをインストールするときにLinuxとの環境の違いからエラーとなることが少なくありません。それ以前にMyPIのインストールすら、ドキュメント通りにコマンドを実行しても失敗します。せっかくの豊富なライブラリなのに、いざ使うときに手間がかかるのはあまり嬉しくありません。

ここではActiveStateが無償で配布しているActivePythonをお勧めしておきます。ActiveState社がWindowsで動作するようにカスタマイズした状態で提供しているので、MyPIから問題なくパッケージをインストールできます。

ActivePythonのダウンロードとインストール

どのバージョンのPythonをインストールするべきかが分かれば、あとは簡単です。ActiveStateのダウンロードページから、必要なインストーラをダウンロードして実行するだけです。

MyPiを使ってパッケージのインストール

Pythonのインストールがおわったら、管理者権限でコマンドプロンプトを開き、以下のようにコマンドを実行します。

C:>pip install [パッケージ名]

例えば数値計算用のパッケージをインストールする場合は以下のようになります。

C:>pip install numpi

使いたいパッケージを探す場合には以下のようにコマンドを実行します。

C:>pip search [キーワード]

現在インストールされているパッケージを確認するには以下のようにします。

C:>pip list

 

Hiveのデータを圧縮して容量を節約する

LOAD DATAステートメントで取込むテキストファイルについては、Hive Language  Manualでもgzip形式で圧縮して取込むサンプルが例示されていますが、CREATE TABLE ~ STORED AS TEXTFILEで指定するテキストデータファイルに対してもgzipで圧縮して容量を節約することが出来ます。

特に気をつけるべき事はありません。テキストファイルを一つずつgzipで圧縮して、指定したフォルダに格納しておくだけです。

また圧縮することで処理速度が向上する場合があります。多くの処理系ではネットワーク帯域よりもメモリ帯域の方が圧倒的に高速なため、gzipで圧縮することによりネットワーク帯域負荷を下げる事によるメリットが、gzipの展開によるCPU負荷増大のデメリットよりも優るためです。

EMRを使う場合、巨大なデータをS3などのストレージに常時置いておくことによって発生する代金は馬鹿になりませんので、圧縮しておくことをお勧めします。

縦横に小計や合計が入っているエクセルシートを間違えずに作るために、意識すると良いポイント

縦横に小計や合計が入っているエクセルシートを間違えずに作るために、意識すると良い点を紹介してゆきます。

見せるための表とデータを保持するための表を分ける。
ユーザーに綺麗に見せるためのシートと、集計するためのデータを保持するためのシートは、分けて作ります。集計するシートには直接データを入力せずに、データ保持用のシートから、式を使って見せるためのシートにデータを取り込みます。
データ用のシートは誰かに見せるための物では無いので、集計のしやすさを優先して作成します。必ず1データを一行で表示し、セルの結合などは使いません。
データを管理する部分と、表示のための機能を分ける考え方は、モデルビューコントローラーモデルと呼ばれ、1990年前後からソフトウェアの設計に取り入れられるようになった方法です。モデルはデータを管理する部分、ビューは表示のための部分、コントローラーはモデルを操作するための部分でExcelがそれに当たります。
このようにデータと表示を分けておくと、表示を様々に変化させてもデータが影響を受けることが無いため、データを誤って書き換えてしまう心配がありません。頻繁なレイアウト変更の要求にも応えやすくなります。また同じデータを複数の方法で表示しているとき、データに変更が発生しても、複数の表示用シートに簡単に反映させることが出来ます。

小計や合計は式を入れる。
個々の値をsumで足しあわせて小計を、小計を足しあわせて合計を求めます。
当たり前のようですが、オートsumで上手く選択出来なかったり、自動の書式指定で上手く表示出来ないと、そこであきらめて数字を直接入力してしまったりする人は少なくありません。きっちり調べて式や表示書式で実現するようにします。
またsubtotalと言う関数がありますが、これは使いません。標準のドキュメントでは、subtotalは選択範囲内にある小計などの計算式を無視して合算を表示してくれるので、小計と合計が混在している表で容易に合計を求められる関数として例示されています。ですがこのような集計の方法をとっていると、小計計算式の選択範囲が誤っていても、合計は正しい値になってしまうため、小計が間違っていることに気がつき難くなります。合計は小計を足し合わせる式として書いていれば、小計が間違っているときに合計も誤った値になるので気がつきやすくなります。

合計や小計が正しいことを手早く判断する。
合計や小計が正しいことを手早く判断するには、合計や小計の計算元となっているシート全体を選択したときに右下に表示される合算が、合計の整数倍になっていることを確認します。もしどこかの指揮が誤っているなら、合計の整数倍にはならないので、各式を精査して誤っている箇所を探します。

以上のようなことに気をつけると、手早く、誤りないExcelの資料を作れます。

Windows系エンジニアのためのElastic Map Reduce 5

Amazon EMRでHiveを使う
EMRに接続して操作するためにSSHに対応したtelnetクライアントが必要です。私自身長年使っていることもあって、TeraTerm(http://ttssh2.sourceforge.jp/)をお勧めします。
Cluster Listから作成したEMRインスタンスの詳細を表示すると、Master public DNS nameにドメイン名が表示されています。このドメインにSSHで接続すると以下のように表示されます。SSHでログインするときのユーザーIDはhadoopです。

Linux (none) 3.2.30-49.59.amzn1.x86_64 #1 SMP Wed Oct 3 19:54:33 UTC 2012 x86_64
——————————————————————————–

Welcome to Amazon Elastic MapReduce running Hadoop and Debian/Squeeze.

Hadoop is installed in /home/hadoop. Log files are in /mnt/var/log/hadoop. Check
/mnt/var/log/hadoop/steps for diagnosing step failures.

The Hadoop UI can be accessed via the following commands:

JobTracker lynx http://localhost:9100/
NameNode lynx http://localhost:9101/

——————————————————————————–
hadoop@ip-10-121-9-185:~$
hadoop@ip-10-121-9-185:~$ hive

プロンプトが表示されたらhiveと入力して、hiveのインスタンスを起動します。
先ほどS3にアップロードしたファイルをテーブルとしてマウントします。

> Create external table reviewsNew
> (MemberID String, ProductID String, ReviewDate TimeStamp,
> HelpFeeedbackNum Int, FeedbackNum Int, Rating Int,
> Title String, Body String )
> row format delimited fields terminated by ‘t’ lines terminated by ‘n’
> stored as textfile location ‘s3://emr-sample/reviewsNew’

これで集計をおこなう準備が完了しました。

> select size(split(Body, ‘ ‘)) as wordscnt, count(*)
> from reviewsNew
> group by size(split(Body, ‘ ‘))
> sort by wordscnt;

上記のようなselect文を実行して集計してみます。bodyに含まれる単語数をカウントして、各単語数のレビューが何件あるかを集計します。この手のインデックスが全く機能しないようなSQLをRDBMSで実行した場合、現実的な時間内には終了しません。hiveなら5ノード程度の小さなクラスタ構成でも7分ほどで集計が終わります。
実際に使用する場合には以下のように結果保存用のテーブルを作成しておきます。

> create external table wordscnt
> (wordcnt Int, recordCnt Int)
> row format delimited fields terminated by ‘t’ lines terminated by ‘n’
> stored as textfile location ‘s3://emr-sample/wordscnt’

そして以下のように保存先テーブルを指定し、結果保存用のテーブルに格納します。その後、S3から作成されたデータファイルをダウンロードします。

> insert into table wordscnt
> select size(split(Body, ‘ ‘)) as wordscnt, count(*)
> from reviewsNew
> group by size(split(Body, ‘ ‘))
> sort by wordscnt;

Windows系エンジニアのためのElastic Map Reduce 3

AmazonでEMRを起動する
まずはEMRで使用するKeyPairを作成します。既に作ってある人は、それを流用してもかまいません。AWSマネジメントコンソールにログインし、EC2のコンソールを開いたら、左側のメニューからKey Pairsを選択します。Create Key Pairをクリックしてダイアログが表示されたら、Key Pair Nameを入力してYesをクリックします。自動的に鍵のダウンロードが始まるので、ダウンロードされたファイルを保管します。
続いてEMRのインスタンスを起動します。AWSマネジメントコンソールのElastic Map Reduceを選択し、Create clusterボタンをクリックして下さい。
Cluster ConfigurationのCluster Nameには適当に識別可能な名称を設定します。Loggingはチェックを外して下さい。
Software Configurationは初期設定のままでかまいません。Hadoop distributionはAmazonにチェックを、AMI Versionは初期設定で2.4.2になっているので、そのままにします。Applications to be installedにも初期設定でHiveとPigが含まれているはずです。
Hardware Configurationには若干のHadoopについての知識が必要です。NetworkとEC2 availability zoneは初期設定のまま、EC2 ClassicとNo preferenceにします。問題となるのはEC2 instance typeでHadoopを構成する仮想マシンノードの数と種類を指定します。
Masterは必ず1台必要になるノードで、Hadoopの分散処理に参加する全てのコンピュータを制御する中心となるノードです。構成する台数が増えた場合、Masterノードのスペックが低いと全体の処理性能が低下する恐れがあります。Masterノードは次に説明するCoreノードとしての機能も兼ねます。
Coreは必ず2台以上必要になるノードです。Hadoopの分散処理においてHDFSと言う分散ストレージを提供しています。EMRではストレージとして主にS3を使用するので、あまり容量を必要としませんが、Hive等のミドルウェアが一時的な記憶領域としてHDFSを使用する場合があります。途中でノードが停止した場合に備えるのと、読み取り負荷分散のため、三重に分散して保存するので、意外に容量を必要とする場合があり、必要に応じて増やします。
Taskは純粋に計算処理を担当するノードです。割り当てない事も出来ます。
Master、Core、TaskともにSpot Instanceを指定して料金を節約することが出来ますが、Masterノードが停止した場合には即座に処理が中断してしまいますし、Coreノードが2/3以上停止するとHDFSに保存したデータが消失してしまい、処理を継続出来なくなる可能性があります。練習中は良いですが、本番ではTaskノード以外をSpot Instanceにすることは避けた方が良いでしょう。
Security and AccessのEC2 key pairを設定して下さい。EMR起動後にSSHでログインするために公開鍵が必要になります。
最後にStepsのAuto TerminateはNoに設定します。

Windows系エンジニアのためのElastic Map Reduce 2

Hive用データを準備する
HiveはCSV形式やTSV形式のファイルに対して処理を行ないます。処理対象とするファイルを事前に変換しておきます。
ファイルは数10MBから数百MB程度のサイズで、複数のファイルに分割しておきます。Hiveは一つのファイルを一つのMapperプロセスに割り当てます。検索対象となるファイルの数が処理を分散できるノード数の上限になるので、必ず適度なサイズに分割しておかないと、Hadoopのメリットを得られません。
Hiveでは一つのフォルダを一つのテーブルとして扱います。ここで作成した分割ファイルをひとつフォルダに保存します。
通常のHadoopではHDSFを使用しますが、Amazon EMRではS3をストレージとして使用します。EMR用にS3のBucketを作成し、フォルダを作り、そこに作成したファイルをアップロードします。ここで作成したフォルダがHive上では一つのテーブルとして扱います。
Bucketを作成するリージョンは、EMRで使用するリージョンと同じ場所にします。同一リージョン内でのネットワーク通信は課金の対象となりませんが、リージョンをまたいだ通信は課金の対象となるので注意しましょう。
同様の理由でCSV形式のファイルへの変換や、CSVファイルをS3にアップロードする作業もAmazon EC2上で行なった方が良い場合もあります。EC2上の仮想マシンからS3へのアップロードは低速のインスタンスでも200~400Mbpsで行えますが、インターネット経由ではシングルスレッド転送だと数百Kbps~数Mbps程度になってしまい、大量のデータをアップロードするには時間がかかりすぎます。
都合、インターネット経由でアップロードする場合には、S3 Browser(http://s3browser.com)のような、マルチスレッド対応した転送ツールが便利です。
ここではサンプルデータとしてインターネット上で公開されているAmazonのレビュー記事のデータを使います。http://liu.cs.uic.edu/download/data/からreviewsNew.rarをダウンロードしてきます。解凍して得られたファイルを適当な行数で分割します。私はCygwinのsplitコマンドを使用しました。これを新たにemr-sampleバケットを作成し、reviewsNewフォルダにアップロードします。