sudo yum -y install postfix

postfixを入れます。

  更新                    : 2:postfix-2.6.6-8.el6.x86_64                    1/2
  整理中                  : 2:postfix-2.6.6-6.el6_7.1.x86_64                2/2
  Verifying               : 2:postfix-2.6.6-8.el6.x86_64                    1/2
  Verifying               : 2:postfix-2.6.6-6.el6_7.1.x86_64                2/2

更新:
  postfix.x86_64 2:2.6.6-8.el6

完了しました!
[vagrant@localhost /]$ sudo alternatives --config mta

2 プログラムがあり 'mta' を提供します。

  選択       コマンド
-----------------------------------------------
   1           /usr/sbin/sendmail.postfix
*+ 2           /usr/sbin/sendmail.sendmail

Enter を押して現在の選択 [+] を保持するか、選択番号を入力します:1
[vagrant@localhost /]$ sudo chkconfig --add postfix
[vagrant@localhost /]$ sudo chkconfig postfix on
[vagrant@localhost /]$ chkconfig --list postfix
postfix         0:off   1:off   2:on    3:on    4:on    5:on    6:off

vagrantでのsendmail

SMTPサーバーはメールを相手のメールサーバーまで届けるサーバー

PHPで以下のように書いて

$to = "hoge@gmail.com";
$subject = "TEST MAIL";
$message = "Hello!\r\nThis is TEST MAIL.";
$headers = "From: hoge@hoge.com";
 
mail($to, $subject, $message, $headers);

echo "finish!";

以下のようにエラーが出たので

sendmail: fatal: parameter inet_interfaces: no local interface found for ::1

/etc/hostsを修正し

[vagrant@localhost mail]$ vi /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
#::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

それでも全然finishしないので、SMTPサーバーを調べていたら、
>Postfix 2.10.1 ゲストOS上で稼働するMTA(SMTP)サーバー
>Dovecot 2.2.10 ゲストOS上で稼働するPOP3,IMAPサーバー
なるほど、Postfixをインストールしないといけないのね。

iptablesとは

iptables とは、Linux に実装されたパケットフィルタリング型のファイアウォール機能
ファイヤーウォールは本読むと絶対でてきますよね。

さて、iptable
etc/sysconfig/にある

ip6tables-config
iptables-config

機能
1.パケットフィルタリング
送られてきたパケットを検査して設定した条件に該当する場合、設定したアクション(通過、遮断、転送)を実行

2.アドレス変換
送られてきたパケットを検査して設定した条件に該当する場合、パケットの宛先アドレスや送信元アドレスを別のアドレスに書き換え

テーブル
filter パケットのフィルタリングに使用
nat アドレス変換に使用
mangle パケットをNAT以外の目的で置き換えるときに使用

チェイン
INPUT 入力(受信)パケットのチェイン
OUTPUT 出力(送信)パケットのチェイン
FORWARD 転送パケットのチェイン
PREROUTING 受信時に変換するチェイン
POSTROUTING 送信時に変換するチェイン

IPv4とIPv6
IPv6の特徴
-グローバルIPアドレスの数が多い
-セキュリティ機能を標準で装備している
-エンドユーザーの設定が簡単

なるほど、ここまで来たか

mysqlで複数カラムを検索

以下で可能。

SELECT * FROM tablename WHERE CONCAT(col1,col2) like '%query%';

例:
SELECT * FROM lists WHERE CONCAT(code,name) like ‘%運送%’;

例2:
SELECT * FROM lists WHERE CONCAT(code,name) like ‘%95%’;

例えば、検索クエリが複数の場合
以下だと、emptyで返ってきます。

SELECT * FROM lists WHERE CONCAT(code,name) like '%三菱 化学%';

ワードを二つに分けて、ANDで繋げます。

SELECT * FROM lists WHERE CONCAT(code,name) like '%三菱%' AND CONCAT(code,name) LIKE '%化学%';

以下のように返ってきます。

フォルダがなければフォルダを作成する

mkdirでフォルダを作成、コマンドラインと同じです。

$dir = "file/test";
if(!file_exists($dir)){
	mkdir($dir, 0777);
}

出来てますね。

では、約4000個フォルダを作ってみます。

$time_start = microtime(true);

$dsn = "mysql:dbname=equity;host=localhost";
$user = "hoge";
$password = "hogehoge";
try {
    $dbh = new PDO($dsn, $user, $password);
} catch (PDOException $e){
    print('connection failed:'.$e->getMessage());
} 

$sql = "select code from lists";
$stmt = $dbh->query($sql);
while($result = $stmt->fetch(PDO::FETCH_ASSOC)){
		$code_list[] = $result["code"];
}

foreach($code_list as $value){

	$dir = "file/".$value."";
	if(!file_exists($dir)){
		mkdir($dir, 0777);
	}
}

$time = microtime(true) - $time_start;
echo "{$time}秒";

はや!

訪問者のアクセスログ(ip)を取得する

cookieのvalueはGAっぽくします。KeyはAccessLogLDとのことでALID。

$min = 100000000;
$max = 999999999;
$value = "GA1." .rand($min, $max).".".rand($min, $max);

$valueは以下のようになります。
GA1.835471614.729296551

テキストファイルに書き込むので、brではなく\nをつかいます。

$min = 100000000;
$max = 999999999;
$value = "GA1." .rand($min, $max).".".rand($min, $max);

if(empty($_COOKIE['ALID'])){
	$time=date("Y/m/d H:i:s");
	$ip = $_SERVER['REMOTE_ADDR'];
	$hostname = @gethostbyaddr($ip);
	$log = $time ." ".$ip." ".$hostname."\n";

	$fp =@fopen('log.txt','a') or die("ファイルを取得できません");
		if(flock($fp,LOCK_EX)){
			fwrite($fp,$log);
		}
		flock($fp, LOCK_UN);
setcookie("ALID",$value, time()+1);
}

log.txt
2018/03/18 19:21:55 192.168.33.1 192.168.33.1

以下のように書くと、最新のデータが一番上にきます。

$content = file_get_contents('log.txt');
	$fp =@fopen('log.txt','w') or die("ファイルを取得できません");
		if(flock($fp,LOCK_EX)){
			fwrite($fp,$log.$content);
		}
		flock($fp, LOCK_UN);

log.txtで取得するログの数を制限したい場合は、fgetsで1行ずつ読み込めばOKですね。

$limit = 10;

echo $content;
$min = 100000000;
$max = 999999999;
$value = "GA1." .rand($min, $max).".".rand($min, $max);

if(empty($_COOKIE['ALID'])){
	$time=date("Y/m/d H:i:s");
	$ip = $_SERVER['REMOTE_ADDR'];
	$hostname = @gethostbyaddr($ip);
	$log = $time ." ".$ip." ".$hostname."\n";

    $fp = fopen('log.txt', 'r');
	for($i=0;$i <$limit;$i++){
		$content .= fgets($fp);
	}
	fclose($fp);

	$fp =@fopen('log.txt','w') or die("ファイルを取得できません");
		if(flock($fp,LOCK_EX)){
			rewind($fp);
			fwrite($fp,$log.$content);
		}
		flock($fp, LOCK_UN);
setcookie("ALID",$value, time()+1);
}

2018/03/18 20:25:06 192.168.33.1 192.168.33.1
2018/03/18 20:25:00 192.168.33.1 192.168.33.1
2018/03/18 20:24:59 192.168.33.1 192.168.33.1
2018/03/18 20:24:57 192.168.33.1 192.168.33.1
2018/03/18 20:24:53 192.168.33.1 192.168.33.1
2018/03/18 20:24:28 192.168.33.1 192.168.33.1
2018/03/18 20:23:26 192.168.33.1 192.168.33.1
2018/03/18 20:23:18 192.168.33.1 192.168.33.1
2018/03/18 20:23:13 192.168.33.1 192.168.33.1
2018/03/18 20:22:14 192.168.33.1 192.168.33.1
2018/03/18 20:21:45 192.168.33.1 192.168.33.1

Class ‘PHPExcel_Writer_csv’ not found

PHP Excelでexcelからcsvへの変換しようと以下のように書くと

set_include_path(get_include_path() . PATH_SEPARATOR . "vendor/phpoffice/phpexcel/Classes/");
include "PHPExcel.php";
include "PHPExcel/IOFactory.php";

$objReader = PHPExcel_IOFactory::createReader('Excel5');
$excel = $objReader->load('csv/edinetlist.xls');

$writer = PHPExcel_IOFactory::createWriter($excel, 'csv');
$writer->save('csv/edinetlist.xls');

なに!?
Class ‘PHPExcel_Writer_csv’ not found in /home/vagrant/equity/vendor/phpoffice/phpexcel/Classes/PHPExcel/IOFactory.php on line 141

githubを見ると、


The Writer names are case-sensitive
so you’d need to specify the Writer name correctly as ‘CSV’ rather than ‘csv’
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, ‘CSV’);

なるほど、以下で上手くいきます。

$writer = PHPExcel_IOFactory::createWriter($excel, 'CSV');

もう一回やってみよう

いろいろ触っていたら、csvは複数のsheetsをサポートしていないとアラートが出たので、手動でsheet2,sheet3を削除してcsvで保存。

ini_set('memory_limit', '512M');

$file = "csv/test.csv";
$file = fopen($file, "r");
echo "<table>";
if($file){
  $i= 0;
  while ($line = fgetcsv($file)) {
  	if($i < 10){
  		echo "<tr><td>".$line[0]."</td>";
  		echo "<td>".$line[1]."</td>";
  		echo "<td>".$line[4]."</td>";
  		echo "<td>".$line[5]."</td>";
  		echo "<td>".$line[9]."</td>";
  		echo "<td>".$line[10]."</td>";
  		echo "<td>".$line[11]."</td>";
  		echo "<td>".$line[12]."</td></tr>";
  	}
    $i++; 
  }
}
echo "</table>";
fclose($file);

あれ? なに。

composerでphpexcelをインストールします。
sudo vi /etc/php.iniで以下に変更。
‘memory_limit’, ‘512M’
‘set_time_limit’, ‘480’

phpexcelでシートを削除して期待するcsvに保存できるかやってみます。

set_include_path(get_include_path() . PATH_SEPARATOR . "vendor/phpoffice/phpexcel/Classes/");
include "PHPExcel.php";
include "PHPExcel/IOFactory.php";

$path = "csv/account.xls";
$excel = PHPExcel_IOFactory::load($path);

$excel->removeSheetByIndex(2);

$writer = PHPExcel_IOFactory::createWriter($excel, 'CSV');
$writer->save('csv/out.csv');

駄目なようなので、別の方法を探します。