restofwaterimpのぎじゅつMemo

SIerに所属。企画から運用まで幅広くやってます。C#中心に書いてます。

【メモ】リバースエンジニアリング(ETL編)

ここ、1、2年くらい、いろいろなお客さん、社内の誰かが作った現行システムの調査、分析を行ってます。

開発を行うよりも、ソース見て、設計書見て、「不具合?」「なにこれ?」「へ〜〜そういうこと」ということが多く、びっくりと発見を繰り返しながら

・今の状態を極力可視化する

・設計書とソースの差異を洗い出す

・問題点を出す

・解決の方向性を示す

 

というのも意識して、実施しています。

 

今回は、タイトルのとおりETL。。。の分析。

今までETLツールを実際に扱ったこと無い(HULFTはあるが、設計はしたこと無い)という状態でしたが、基本、データを加工するだけなので、見方さえ覚えれば、なんとかなるもんなんだと。

 

さて、実際に解析して気づいたのですが、こういうことがあると調査がとまどるな〜〜ということがあります。

・意味のないカラムや項目が紛れている(なんであるのかな・・・調べたのに使ってない)

・意図通りに動いているのか判断できない条件文(バグかな??)

 

では、どうやって乗り越えるのか。

 

世の中にはたいそう便利なリバースエンジニアリングツールが多くあるのは知っております。しかし、実際にそのツールを使って分析しているお客さんにいまだあったことはございません。

 

個人的には、実際のソースはツールを利用すれば、見えるのだが、本当に知りたいのは、

「なんでこんなことしているんだろね」

「今をベースもしくは新しく作りなおすには何を気にしないといけない?」

といったことを知りたいものかと。

それを起点に考えると、いくら現在のシステム状態を見せても「で??」と聞かれるのが落ちなんでしょうね。

 

では、私は何をしているか・・・。

 

と、言っても画期的なことをしているわけじゃないです。

 

やっていることは3点

・ER図の作成(ETLの元、先のシステムのDBの)

・ETLの処理のマッピングを人がわかるレベルで記載

 (ツールでうまく出しているのもあるが、I,P,Oで記載)

・ETLのJOBの関連性を記載して、時系列で表現する

 

と、いうことです。

 

要は、点ではなく、線や面で表現して、ユーザが利用している業務の言葉や、表現、流れに以下に近づけて、今の業務の問題点を炙りだしてもらうか。次の新システムの考えをイメージしてもらうか・・・が勝負かと。

 

地道な作業ですが、データの移行などの肝となる作業なので、早く、正確にやらんとなと。。

 

【メモ】ホストとWebとどっちが安心・・・という話になったので

昨日は飲み会。

他愛もない話から、趣味の話になり、その一部に、

「ホストのほうがWEBよりトラブル時の対応がやりやすい」という話がでた。

 

私もホストでの開発、運用が長いので、個人的な意見を。

ただ、WEBは運用経験がほぼ無いので、妄想です。

 

正直、ホストのほうが何かあった場合、リカバリが聞くのではないかと思う。

ホストの世界ですと、24/365では無いので、オンラインとバッチの世界に分かれる。

基本的に、オンライン中にシステムダウンはよっぽのことがない限り無い。バグがあり、トランザクションエラーはあるが、本番リリースを行ったあとは無いだろう。

と、いうことでバッチの世界で考える元とする。。。

 

ホストでのバッチは「実行したか」「実行していないか」というのが明確に判断できる。もともと最初に「人の意思で設定した順序のトランザクション」しか流れないので、不確定要素がない。スケジューラーの実行結果を見れば、「どの時点でトラブった」というのがわかる。

 

WEBでもログとDBを使っていれば、COMMIT、REDOログなどで判断は可能だ。

「時点がわかるのはWEBでもできる」というのは同じという意見は理解できる。

 

個人的には、ここからが大変なのかなと。

ホストであれば、

「このトラブった時点で、どのファイルが更新されており、このファイルはまだ更新されていない」というのがわりと容易(ちょ〜簡単という意味ではない)にできる。

一方、WEBの場合、データを突き合わせていって、「どこまで更新されており、どのような状況なのか」を判定するのに時間がかかる。トラブル時の複雑度がホストに比べると高いのではないかなと思う。

 


ただ、それだけでホストがいいというつもりは無いです。

要は使う会社や人の業務レベル、システムレベル、サービスレベル、何を実現したいのかによって、選べばいいかと。

 

なんでも最新技術を使ってやればいい。。と思うのではなく、「何を実現したいか」を軸に、「何を使うか」。あたりまえのことをしっかり考えて、情報システムは構築しなければと改めて考える飲み会であった。

【メモ】Hadoop 事始め・・・

大容量データを早く捌きたい・・・という重いと、前から興味があった技術であり、

個人的にもWebとかサーバ系への抵抗感が少なくなってきた(ワタシ的には)ので、

そろそろ手をつけようと。

 

会社のメンバーでSakura VPSを借りて、使っていこうということで、

とりあえず、sakura vpsを借りて、hadoopをインストール

 

Hadoop 第3版
Hadoop 第3版
posted with amazlet at 14.02.24
Tom White
オライリージャパン
売り上げランキング: 187,602

 

を見つつかつ

http://javatechnology.net/service/vps-java-tomcat/

http://toriaezu-engineer.hatenablog.com/entry/2013/09/10/000838

を見ながら、設定は完了

 

やっとこさ

# hadoop version

Hadoop 2.2.0

Subversion https://svn.apache.org/repos/asf/hadoop/common -r 1529768

Compiled by hortonmu on 2013-10-07T06:28Z

Compiled with protoc 2.5.0

From source with checksum 79e53ce7994d1628b240f09af91e1af4

 

This command was run using /usr/local/hadoop-2.2.0/share/hadoop/common/hadoop-common-2.2.0.jar

までこれました。

 

日常の仕事は汎用機なので、linuxwgetとかtarコマンドを使う機会が少ないので、

これからこういうのも知れればと。

 

まずは、スタンドアロンモードと擬似分散モードを学習だ!と。

で、2章に乗っているawk と hadoopでの処理速度の違いをまずは体験をしてみよう。。

Rubyで文字をasciiからutf-8にする方法

作りながら学ぶRuby入門の26章をmac環境でやっていたら、

登録時に、画面ではutf-8だが、webrick経由で、mysqlへ取り込むときのinsert文が

 

{"id"=>"201122", "title"=>"\xE3\x81\x9F\xE3\x81\x97\xE3\x81\x8B\xE3\x81\xAA\xE3\x81\x93\xE3\x81\xA8", "author"=>"\xE3\x81\x88\xE3\x81\x88\xE3\x81\xAE\xE3\x81\x8B\xE3\x81\xAA\xEF\xBC\x9F", "page"=>"100", "publish_date"=>"20100202"}

 

[2014-02-17 23:15:13] ERROR Encoding::CompatibilityError: incompatible character encodings: UTF-8 and ASCII-8BIT

 

って感じで、asciiで来てしまい、mysqlへ取り込めない状況に

さて、どうしたものかとググルと、force_encodingを使えば行けそうな。

■参考URL

http://qiita.com/yahihi/items/add104d5a0b848f0b5ff

 

と、いうことで、

    dbh.do("insert into bookinfos values('#{req.query['id']}', '#{req.query['title'].force_encoding("utf-8")}','#{req.query['author'].force_encoding("utf-8")}','#{req.query['page']}','#{req.query['publish_date']}');")

 

を文字に指定することで、正常に登録されるように。

 

項目名登録データ
id 2022
title だいじょうぶ
author けけけ
page 10
publish_date 20120202

    

ただ、これを一個一個気にしながら強制的に文字コードを直さないと行けないとなると、若干Rubyの設定が煩わしい。

何か、よい策があるような気もするが、コーディングを行いながら気づいていこうかと思う。

【メモ】文字コード(#! Ruby -Ksの意味)

「作りながら学ぶRuby 入門」の16章で、csvファイルからのファイル入出力を試していたら、以下のエラーが発生。

実行環境 mac OS 10.8

               Ruby 2.1.0

               Emacs 24.3

 

ex1601.rb:25:in `toFormattedString': incompatible character encodings: UTF-8 and Windows-31J (Encoding::CompatibilityError)

from ex1601.rb:82:in `block in listAllBookInfos'

from ex1601.rb:81:in `each'

from ex1601.rb:81:in `listAllBookInfos'

from ex1601.rb:174:in `run'

 

from ex1601.rb:189:in `<main>'

 

外部との入出力時がなく、ruby の実行環境上での文字のやりとりでは出てこなかったので、なんかあるのかなと調べてみた。

OS,Ruby,Emacsでの文字設定を調べてみた。

 

OS・・・UTF-8だよな〜

locale

LANG="ja_JP.UTF-8"

LC_COLLATE="ja_JP.UTF-8"

LC_CTYPE="ja_JP.UTF-8"

LC_MESSAGES="ja_JP.UTF-8"

LC_MONETARY="ja_JP.UTF-8"

LC_NUMERIC="ja_JP.UTF-8"

LC_TIME="ja_JP.UTF-8"

 

LC_ALL=

 

作成ファイル・・・uft-8

file --mime ex1601.rb

 

ex1601.rb: text/x-c++; charset=utf-8

emacs上・・・utf-8

f:id:restofwaterimp:20140125083157p:plain

 

はて、なんだろうと考えていたら、この本って、実行環境がWindowsが前提だったことを思い出した。

そこで、#! ruby -Ksを試しに恥ずして、実行したら、文字コードに関するエラーは外れた。

おまじないと思って、無視していたのだが、書籍を見なおしたら、一応書いてあった。

#! ruby -Ks ・・・ ver 1.8までのRubyがファイルの日本語を判定するために使う

# -*- coding: xxxxx -*- ・・・ ver1.9以降のRubyのファイルが日本語を判定するために使う

 

と、いうことであった。

つまりは複数のバージョンの指定を記載しており、多分、先に書いてあった旧バージョンの文字コードを判定してしまっていたのだろう。

 

そのため、実行時に、RubyはこのファイルをWIndows-31Jとして認識しているため、外部ファイルであるcsvUTF-8なのに、実行ソースはWindows-31Jで認識していた。という結論である。

いい勉強になりました。

 

参考にしたURL

OSとRubyスクリプト文字コードが異なる場合の対策

http://pgnote.net/?p=211

【メモ】バックスラッシュの入力にはまった

Macemacsを使って、rubyの学習をしていたところ

¥をバックスラッシュとして入力しても、改行されない。

 

http://mac.just4fun.biz/?macの設定%2Fバックスラッシュの入力方法

 

を参考に、英数で入力するときの¥を\になるように変更。

 

環境設定で変えるもんなんだなと。

【メモ】値渡し?参照渡し?

確か、rubyって値渡しだよな〜〜と。

 

入門Rubyには参照渡しっぽく以下のソースの説明が書いてあったので、「?」に。

 

#! ruby -Ks

#-*- coding:UTF-8 -*-

str1 = "Hello"

str2 = "WaWoo"

str3 = str1

puts str1;

puts str2;

puts str3;

str1 = ""

puts str1;

 

puts str3;

 

結果・・・

Hello

WaWoo

Hello

 

 

Hello

 

まあ、当然なのですが、str1とstr3が同じ参照先を見ているという感じに書いてあったんですね。。。

でも、そうならば、str1=""をした時に、str3も""になるような。

str1=""としたときに異なるアドレス空間に置かえるのか??

 

んなわけないような・・と以下のサイトでやっぱり値渡し(というかcallしてないから・・)というのを

値渡しと参照渡しの違いを理解する

http://magazine.rubyist.net/?0032-CallByValueAndCallByReference