AWSのClamavとPCRE

AWSAmazon Web Services)のEC2に入れたClamavが以下のメッセージを吐いていた。pcreとpcre-develは導入済み。
yum update clamavで直ったので、どうやらfixされたらしい。(clamavのバージョンは0.99.2)

[LibClamAV] cli_loadldb: logical signature for Win.Trojan.ssid18332-1 uses PCREs but support is disabled, skipping
[LibClamAV] cli_loadldb: logical signature for Win.Ransomware.Locky-4 uses PCREs but support is disabled, skipping
[LibClamAV] cli_loadldb: logical signature for Html.Exploit.CVE_2016_0184-1 uses PCREs but support is disabled, skipping
[LibClamAV] cli_loadldb: logical signature for Pdf.Exploit.APSB16_26-1 uses PCREs but support is disabled, skipping
[LibClamAV] cli_loadldb: logical signature for Swf.Exploit.2016_4215-1 uses PCREs but support is disabled, skipping
[LibClamAV] cli_loadldb: logical signature for Xml.Exploit.CVE_2013_3860-3 uses PCREs but support is disabled, skipping
[LibClamAV] cli_loadldb: logical signature for Pdf.Exploit.CVE_2016_1079-2 uses PCREs but support is disabled, skipping
[LibClamAV] cli_loadldb: logical signature for Pdf.Exploit.CVE_2016_3370-1 uses PCREs but support is disabled, skipping

ビッグデータの超高次元な説明変数をスケーラブルに選択する(Selection of Huge Dimensional Explanatory Variables by Google MapReduce)

久しぶりのビッグデータ関連の投稿。昨年7月に書いたレポートを掲載する(末尾のリンク)。

レポートで取り扱うのは、「数百万ー数億の説明変数がある判別問題においてMapReduceを用いてスケーラブルに変数選択をする方法論」について。統計方向からの勘弁なアプローチとなっている。
後述するが、当レポートは「遺伝情報から特定の疾患を判別する」という問題に刺激されて作成した。

さて。

前置きが長くなってしまうが、研究背景から述べたいと思う。自分が何年か前にMapReduceというフレームワークについて聞きかじり、興味をもった点は以下だった。

  1. 線形代数を多用する旧来からの多変量解析法の実務において、MapReduceの分散フレームワークが有効に使えそうかどうか。
  2. Amazon Web Servicesに代表されるクラウド環境において、簡単にMapReduceコンフィギュレーションが可能かどうか。
  3. クラウド環境が(そのふれこみ通り)「資金の乏しい研究」の味方となる(廉価な)プラットフォームなのか。

第1の問いに対しては、これまでの試行結果よりネガティブな印象を受けてしまったことは否めない。(たとえば、Hadoop Mapreduceで大きな相関行列を計算する)。
著名な機械学習のプロジェクトであるApache Mahoutが「Goodbye MapReduce」という結論を下したのもこれに関係ないことではないだろう。

これに対して、第2、第3の問いに対しては極めてポジティブな印象があり、クラウド環境は「資金の乏しい研究プロジェクト」に大きな力を与えると確信できた。

添付するレポートは、2014年の応用統計学会春季大会で聞かせていただいた東京農工大石井教授の研究に刺激され作成した。その発表では「遺伝情報から特定の疾患を判別する」という問題が取り扱われていた。「遺伝マーカー」なるものがどのようなデータであるかわからないが、それらの「有無」つまり2値の説明変数であろう(もしくはそう還元できるだろう)と推測した。定式化としては古典的な判別分析の問題(2群の判別関数)となるが、ビッグデータの特徴である「超高次元な説明変数」群をどう取り扱うかが課題となる。
よく知られているように説明変数の数を増やしていけば自ずと判別結果は良好(オーバーフィット)となる。また、説明変数が多くなればなるほど「判別を本質的に決めているのはどの変量か」という議論がしずらくなるから、少ない変量で判別を行うことが分析者の腕の見せ所である。
そして、判別問題は固有値問題に帰着されるから「線形代数の苦手なMapReduce」には不得意な領域である。それでも「(クラウドはプラットフォームとしてのメリットがあるのだから)どうにかMapReduceを使うことはできないかな」と考えた結果、「線形代数演算を簡単に行うDSLDomain Specific Language)にはR(S plus)やMATLABなどがあるのだから、これらのソフトウェアが使える程度まで次元縮約(変数選択)してあげれられればいいだろう」という安直な結論に到達した。つまり、「MapReduceでスケーラブルに変数選択を行う方法論」を探すことが新たな課題であり、レポートの主旨となる。

添付のレポートで採用したのは「符号検定(二項検定)」という古くから用いられている簡便な統計検定を用いた変数選択の方法論とそのAmazon Web Services上でのシミュレーション結果である。これは、MapReduceという「(演算上の)制約の強いフレームワーク」を利用するにあたっては「できる限り」簡便な方法を利用すべきと考えたためである。「符号検定」は品質管理の現場などで「計算機のない時代に」変数間の相関を計るために利用されていた。

レポートでは具体的なデータを用いた検証には至っておらず、数値実験によって手法がMapReduceフレームワークによってスケールすることだけを検証した。
1,000,000オーダーの説明変数に対して、1,000のサンプル数のデータを20台構成のAmazon Elastic MapReduceクラスタで8分14秒(494秒)で処理できた。1億であれば計算時間は49,400秒(14時間弱)であるが、クラスタサイズを増やせばそれを線形に減らすことが可能である。
ただし、これらの所要時間は「Amazon Web Servicesの特定の環境」において得られた計測値であること、データの加工・転送にかかる時間は含まれていないことを付記しておく。

レポート:二項検定に基づくMapReduceを用いたビッグデータのスクリーニング

注記:
レポートは自由にダウンロード可能です。なんらかのお役に立てたらご連絡いただけたら嬉しいです。

CakePHP2.5.5でビューを使ってみる

前回の続き。
今回はCakePHP1.3.6のこちらのログをCakePHP2.5.5でなぞってビューを使ってみる。

Cakeのルールでは、

  • コントローラーのプログラム名(Controllerの前:キャメル記法)で/app/viewsにディレクトリを作成する。ディレクトリ名はキャメル記法になる。そのコントローラーから使うviewは、このディレクトリに入れる。
  • コントローラー内のメソッド名と、上記のディレクトリ内にある「メソッド名.ctp」が自動的に紐付けされる。
  • 紐付けするには、変数$autoRenderをtrueに設定する。
  • レイアウトを適用するには、$autoLayoutをtrueにする。

開発環境としてeclipse_pdtを利用しているので、「.ctp」をPHPエディタで編集するように設定しておく。
eclipseのメニューバーのEclipse=>環境設定(Macのため。WindowsならWindow=>Preference)=>General=>Content Typesで、Text下にあるPHP Content Typeを選択し、*.ctpを追加する。

サンプルの作成

今回のサンプル名(プログラム名)は、TestViewとする。
Cakeの規約に乗っ取り、/app/viewsにディレクトリTestViewを作成する。

コントローラーの作成

/app/controllersにTestViewController.phpを、以下のように作成する。

<?php

class TestViewController extends AppController{
	public $name = 'TestView';
	public $uses = null;
	public $autoLayout = false;
	public $autoRender = true;
	
	function index(){
	}

}
?>
ビューの作成

先のログでwebrootに作成したindex.htmlを、/app/views/TestViewにコピーし、index.ctpとリネームする。
これで、index.ctpは、TestViewのindexメソッドと紐付けられる。

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>これはテストです。</title>
</head>
<body>
app/View/TestView/index.ctpを表示しています。<br>
<br>
テスト
</body>
</html>

これで、localhost/workspace/cake-2.5.5/TestViewにアクセスすると、以下の画面が帰ってくる。

ここで、コントローラーの$autoLayoutをtrueにしてみる。

<?php
class TestViewController extends AppController{
	public $name = 'TestView';
	public $uses = null;
	public $autoLayout = ture;
	public $autoRender = true;

	function index(){
	}
}
?>

すると、Cakeで用意されているレイアウトが適用されて、以下のような画面が帰ってくる。
エラーが出まくっているが、とりあえず今のところ大丈夫の模様。


Viewはメソッドごとに作成するので、先のコードにindex2()を追加する。
index2ではメンバー変数$autoLayoutをfalseにする。

<?php

class TestViewController extends AppController{
	public $name = 'TestView';
	public $uses = null;
	public $autoLayout = true;
	public $autoRender = true;
	
	function index(){
	}
	
	function index2(){
		$this->autoLayout=false;
	}
	
}
?>

/app/views/に、以下のindex2.ctpを作成する。

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>This is Test Page</title>
</head>
<body>
Displaying "app/View/TestView/index2.ctp".<br>
<br>
Testing...
</body>
</html>

ここで、/localhost/workspace/samplecake/index2にアクセスすると、以下の画面が帰り、もくろみ通りレイアウトが適用されない。Dispatcherのエラーが気になる。。。

CakePHP2.5.5でコントローラを使ってみる

前回の続き。
今回はCakePHP1.3.6のこちらのログをCakePHP2.5.5でなぞってコントローラだけを使ってみる。

CakePHPはCOC(Convention over Configuration)を採用したフレームワークなので、これに準じて確認用コントローラーを作成する。

  • コントローラーは、/app/controllers配下におく。
  • コントローラーのファイルは、[プログラム名]Controller.phpとする。(キャメル記法:Cake1系ではここがアンダースコア記法だった)
  • コントローラーのクラス名は、[プログラム名]Controllerとする。(キャメル記法)
  • コントローラーのメンバ変数$nameには、キャメル記法のプログラム名を入れる。
  • かならず、index()メソッドを作成する。

「プログラム名」はTesCakeにする。/app/controllersに「TestCakeController.php」を作成し、以下のコードを書く。

<?php
class TestCakeController extends AppController{
	public $name = 'TestCake';
	public $uses = null;
	public $autoRender = false;
	
	function index(){
		echo "これはCakePHP2.5のコントローラーのテストです";
	}
}
?>

メンバー変数の$usesはモデル、$autoRenderはビューテンプレートの利用を意味するので、ここでは、それぞれnull, falseにして、index()にあるecho文でレスポンスを返す。

これで、/localhost/workspace/cakesample/TestCakeにアクセスすると、index()が呼ばれ、以下の画面がでる。

メソッドの呼び出しは、/プログラム名/メソッド名で行われる
以下のコードを書いてみる。

<?php

class TestCakeController extends AppController{
	public $name = 'TestCake';
	public $uses = null;
	public $autoRender = false;
	
	function index(){
		echo "これはCakePHP2.5のコントローラーのテストです";
	}
	
	function index2(){
		echo "This is a test of CakePHP2.5 Controller";
	}

}
?>

ここで、/localhost/workspace/cakesample/TestCake/index2にアクセスすると、index2()が呼ばれ、以下の画面がでる。

CakePHP2.5.5でStaticなHTMLを使う

前回の続き。
今回はCakePHP1.3.6のこちらのログをCakePHP2.5.5でなぞってみる。
StaticはHTMLファイルは/app/webrootにおく。
例えば、

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>これはテストです。</title>
</head>
<body>
app/webroot/index.htmlを表示しています。<br>
<br>
テスト
</body>
</html>

とし、

http://localhost/workspace/cake-2.5.5/

ブラウザーで見てみる。
ただし、workspace/cake-2.5.5はドキュメントルート。

以下の画面が戻れば、app/webroot/.htaccessもOKということ。

CakePHP2.5.5を使ってみる。

以前、CakePHP1.3.6を一通りレビューした(こちらから一連のログがある)が、訳あってCakePHPをまた使ってみることになった。

以前のレビューに沿って、Cake2.5.5をMacOX+XAMPP+Eclipseでレビューする。

実行要件

Cake2.xの要件をCake book 2.xで見ると

と書いてある。

XAMPPは随分前にいれた1.7.3なので若干心配になってチェックをした。
まず、mod_rewriteは「アプリケーション」→「XAMPP」→「etc」のhttpd.confをみればよい。

Cakeは.htaccessを使うので、AloWOverrideのところも見ておく。httpd.confの主要なところは以下。

…
LoadModule rewrite_module modules/mod_rewrite.so
…
<Directory />
    Options FollowSymLinks
    AllowOverride All
    #XAMPP
    #Order deny,allow
    #Deny from all
</Directory>
…

自分のPCではEclipseワークスペースにaliasを設定している。

Alias /workspace "/Users/tetsuya/Documents/workspace/"
<Directory "/Users/tetsuya/Documents/workspace">
Allow from all
</Directory>

次にPHPMySQLのバージョンを確認しておく。XAMPP(のApacheMySQL)を起動しておけば

http://localhost/phpmyadmin

phpMyAdminを開くことができる。

MySQLが5.1系、phpが5.3系なので問題なさそう。

CakePHPのダウンロード

CakePHP本家サイトよりCakePHP2.5.5をダウンロードする。

Eclipseにcake-2.5.5というPHPプロジェクトを作成し、そこに解凍をする。

.htaccessの編集

プロジェクト直下、app下、webroot下にある.htaccessのRewriteBaseを以下のように書き直す。

プロジェクト直下の.htaccess
<IfModule mod_rewrite.c>
   RewriteEngine on
   RewriteBase 	  /workspace/cake-2.5.5/
   RewriteRule    ^$ app/webroot/    [L]
   RewriteRule    (.*) app/webroot/$1 [L]
</IfModule>
プロジェクト/app/.htaccess
<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteBase  /workspace/cake-2.5.5/app/
    RewriteRule    ^$    webroot/    [L]
    RewriteRule    (.*) webroot/$1    [L]
</IfModule>
プロジェクト/app/webroot/.htaccess
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase  /workspace/cake-2.5.5/app/webroot/
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
</IfModule>

app/Config/core.phpcypherを修正する。

/**
 * A random string used in security hashing methods.
 */
	Configure::write('Security.salt', '[適当な30文字の文字列]');

/**
 * A random numeric string (digits only) used to encrypt/decrypt strings.
 */
	Configure::write('Security.cipherSeed', '[適当な30文字の文字列]');

とりあえず、これで準備は完了。

app/Config/core.phpとbootstrap.phpにCacheエラーの対応をする。

CakePHP2からCacheのアクセス権でエラーが出るようになったので、iwakingさんのブログを参考にcore.phpとbootstrap.phpを修正する。

core.phpを修正する。

Cache::config('_cake_core_', array(
	'engine' => $engine,
	'prefix' => $prefix . 'cake_core_',
	'path' => CACHE . 'persistent' . DS,
	'serialize' => ($engine === 'File'),
	'duration' => $duration,
	'mask'=>0666 //ここ
));

/**
 * Configure the cache for model and datasource caches. This cache configuration
 * is used to store schema descriptions, and table listings in connections.
 */
Cache::config('_cake_model_', array(
	'engine' => $engine,
	'prefix' => $prefix . 'cake_model_',
	'path' => CACHE . 'models' . DS,
	'serialize' => ($engine === 'File'),
	'duration' => $duration,
	'mask'=>0666 //ここ
));

bootstrap.phpに以下を追記する。

Cache::config('default', array(
'mask' => 0666,
));

app/tmpに書き込み権限をつける

/workspace/cake-2.5.5/appにcdして、

chmod -R 777 tmp

としてtmp配下に書き込み権限を付与する。

アクセスしてみる

http://localhost/workspace/cake-2.5.5

へアクセスしてみる。とりあえずOKのようだ。

MacからSharepoint Onlineのドキュメント・フォルダーにアクセスする。

Office365を使っているのだが、WindowsからはSharepointオンラインにあるドキュメント・フォルダー(OneDrive for Businessにあるドキュメント・フォルダー)をエクスプローラーで開くことができる。

ビデオ エクスプローラーで開く を使ってライブラリ ファイルをコピーまたは移動する

おんなじようにMac(OSX)からマウントできないかな、と思ってしらべたら、Finderからはマウントできないらしい。
Office2011が入っている環境では、以下のようにエクスプローラー・ライクに使用することができる。
参考 Connecting a Mac with OSX to SharePoint (including O365)!


まず、Microsoft Document Connesction.appを起動する。

次に、左上の「場所の追加」で「Sharepointサイト」を選択し、URLを入力する。URLは

https://xxxx.sharepoint.com/personel/xxx_xxx_xx/Documents/

とすれば、個人用のOneDrive for Businessのドキュメントフォルダーにアクセスできる。

Office365の認証を聞かれるので、ユーザー/パスをいれると、以下のようにドキュメント・フォルダーの一覧が表示される。