2017/01/24

rsync

2017年1月23日記載
rsyncで差分を止めていたのだが、いよいよHDDの容量を逼迫してきた。

そこで、

--ignore-existing コピー先に存在するファイルは更新しない
こいつを嚙ましてみる。


LastBackup=`ls -t $BackupDIR | grep backup | head -1`
一番古いファイルとの差分を取っていたが、最新のものとの比較に修正
LastBackup=`ls -t $BackupDIR | grep backup | tail -1`



上手い事動きそうなので、定期的なフルバックアップをどのタイミングで行うか?
は今年の課題にしたいと思う。

スクリプトシェル
#!/bin/sh
# バックアップ先ディレクトリ指定
BackupDIR=/home/*****/dailyBackup

mkdir -p $BackupDIR
# バックアップログ定義
BackupLog=/home/*****/log/rsync_backup.log rm -f $BackupLog
touch $BackupLog
chmod 600 $BackupLog
#エラーチェック
error_exit () {
exit 1
}
#バックアップ実行
echo "`date` backup start" >> $BackupLog
LastBackup=`ls -t $BackupDIR | grep backup | tail -1`
NewBackup=`date +%Y%m%d`backup

mkdir $BackupDIR/$NewBackup
rsync -rlptv --ignore-existing
 --whole-file --link-dest=../$LastBackup /home/比較元のディレクトリ/ $BackupDIR/$NewBackup >> $BackupLog 2>&1

code=$?
if [ $code -ne 0 ]; then
cat $BackupLog | mail -s "BACKUP NG CODE IS $code" root
rm -rf $BackupDIR/$NewBackup
error_exit
fi
echo "`date` backup end" >> $BackupLog

2016/09/22

受信メール設定 dovcot

サーバを移行したあと、メールを使うユーザを追加した際に
受信サーバにアクセスできない というエラーが帰って来た。

原因が分かったので、忘れないうちに残す

dovcotの制御が原因だった。

ユーザを作成
useradd -m [ユーザ名]
passwd [ユーザ名]
2回入力して作成する。

var/spool/mail/[ユーザ名]

このファイルのパーミッションを660(恐らくデフォルト)から600に変える
こうしないと、応答に答えてくれない仕様の用だ。

以前の設定は、
660でも問題なく動いており、
応答もしてくれているようなので、
これに気づかずに悩んでしまった。

2016/09/06

サーバ移転で詰まったこと php関連

WEBサーバを移転した際に、嵌ってしまった原因を列挙しておく。
次回の更新が何年後か分からないが、忘備録

PHPのこと

/etc/php.ini
phpが稼働したら、
info.phpファイルを作り、設定確認
infophp();
?>


memory_limit (メモリ使用量の上限)
post_max_size (POSTデータの最大サイズ ※1回のアップロードファイルすべての合計サイズ)
↑今回、これを確認せず、8MBの壁にぶち当たり嵌った・・。

upload_max_filesize  (1ファイルあたりの最大アップロードサイズ)

この辺の数値が小さいと、画面が白いままになったり、
IF関数等で正しく動かない。

反映は

 # systemctl restart httpd.service




Postfixのこと

設定されているサイズを確認

# postconf | grep size_limit

body_checks_size_limit = 51200
bounce_size_limit = 50000
header_size_limit = 102400
postconf: warning: /etc/postfix/main.cf: unused parameter: mtp_sasl_security_options=
mailbox_size_limit = 此処をでかくする      例えば1GB     1073741824
message_size_limit = 此処を↑は小さくする  例えば100MB 104857600

反映は

# systemctl restart postfix.service


phpで作ったメールフォームで嵌った。



2016/08/09

postfixの設定など

社員用にPHPプログラム運用兼ファイルサーバを設置している。
いままでは、ローカルなメールの遣り取りだけで済んでいたのだが
どうしても、外部のメールサーバを経由して外部ユーザにメールを送らないといけなくなった。

ローカルの設定は結構いい加減にやっており、
外部にメールを送ろうとすると、rejectされてしまう。

CentOS7.x はpostfixが推奨されているので、設定することにした。

はじめに
postfixが動いているか?確認




# systemctl status postfix.service

今回は、phpが絡むので、設定する。
/etc/php.ini
L980位の
[mail function]
SMTP = localhost
smtp_port = 25
sendmail_from = なんかそれなに名前を付けておく。

※SMTP認証を使うときは、もう少し追記があるらしい。(今回はいらない)

# systemctl restart httpd.service
PHPの設定有効


つづいてpostfixの設定

前のかなりラフなものをちゃんとする。

 /etc/postfix/main.cf

L60
mail_owner = postfix 別のユーザに変更するときは、書き換える(今回不要)

myhostname = mail.xxx.co.jp 等

mydomain = xxx.co.jp 等

inet_interfaces = localhost 受信設定。受信しないので、localhostで良いが、ルータ等でセキュア環境にしてあるならば、allでもOKと思われる。

inet_protocols = ipv4 おまじない。ipv6をkillしている際は、記載しないと動かないらしい。

mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain ←註

mynetworks = XXX.XXX.XXX.0/24, 127.0.0.0/8 許容するネットワークの範囲を記載


mydestination に $mydomain を記載する際の注意

内部用のサーバから外部用のサーバにリレーする際に、
内部的には固定IP割り当てて、ルータで締めて、トンネル作って、そのアドレスを許容すればいいのだが、そこから外部に送る際、最近のレンタルサーバ等は、domainがいい加減だと、rejectしてくる。

そこで、$mydomainには、送信する際に問い合わせを受けても問題ないdomainを記載しておくのだが、mydestination に $mydomain を安易に書き加えると、外部サーバと内部サーバに同一の
アカウントがいる場合は、そのユーザに関しては、ローカルサーバ内にメールを送ってしまい。
本来の$mydomain に送るべきものが全く送れない状態になってしまうので、
注意が必要。
外部サーバを使ってメールを送信するような内部サーバのpostfixの設定で、
よほど特殊(たとえば内部で擬似的に運用する等の)な環境でない限り、
記載する際は注意が必要。






※SMTP認証を使う場合は、この辺も有効にする。
# In the case of SMTP, specify a domain, host, host:port, [host]:port,
# [address] or [address]:port; the form [host] turns off MX lookups.
#
# If you're connected via UUCP, see also the default_transport parameter.
#
#relayhost = $mydomain
#relayhost = [gateway.my.domain]
#relayhost = [mailserver.isp.tld]
#relayhost = uucphost
#relayhost = [an.ip.add.ress]

その他はそのままで大丈夫と思われる。

# systemctl restart postfix.service
再起動
# systemctl status postfix.service
エラーが無いか確認する。



この設定で、問題なく中継が出来た。
今後Gmailやその他のメールサーバと絡めたりしたいときには、
SMTP認証が必要になる。(今は止めておく)




2016/07/08

PHP 複数行を持つ標準入力の配列化

複数行を持つ標準入力の配列化

 

<?php
$input = trim(fgets(STDIN));
while ($input){
$array[] = $input;
$input = trim(fgets(STDIN));
}



これで、$arrayに標準出力の複数行で書かれたものを

配列に出来る。




一列づつ検証をする場合は、

 

    while($input=fgets(STDIN)){
  for ($i = 1; $i <= $input-1 ; $i++) {

この中で検証する;

}


このように処理すれば良い。



スキルアップの為、codeIQとかで勉強を始めたが、

標準入力の取り扱い方が良くわからずに困っておった。

 

 

プログラム自体は掛けるのだが、

標準入力の配列化が出来ず、解けない問題があったので、

いろいろ調べた結果 こうなった。

2016/06/27

javascipt datePicker 営業日の制御

打ち合わせ希望日をカレンダーで選択してもらってフォームで予約を入れてもらう。
このような制御が必要になった。


当初<input type="date">で良いかな?
と思ったが、ユーザがPC:スマホで7対3位で、まだまだPCが有利なので、

datepickerを使うことにした。

その際に、
・土日は選択させない。
・4営業日以降しか選択できない。

という条件を付けたい。

土日は選択させない事は先人の知恵で問題なく解決。
問題は、4営業日以降の縛り


datepickerの変数だけでは処理できなかったので、
起算点を今日にして、今日の曜日を取得し、
datepikcerのオプション minDate で制御した。


以下ソース。
<HEAD>
<META HTTP-EQUIV=Content-Type CONTENT=text/html;CHARSET=UTF-8>
<TITLE>アポどり用フォーム</TITLE>
<!-- jQuery-->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<!-- jQuery-UI -->
<script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1/jquery-ui.min.js"></script>
<!-- jQuery-UI-datepicker -->
<script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1/i18n/jquery.ui.datepicker-ja.min.js\"></script>
<link rel="stylesheet" href="http://ajax.googleapis.com/ajax/libs/jqueryui/1/themes/redmond/jquery-ui.css\" >
<script>
<!-- 今日の曜日を抽出-->
var dateObj = new Date() ;
var weekDayList = [0,1,2,3,4,5,6] ;
var todayWeekDay = weekDayList[ dateObj.getDay() ] ;
<!--datepicker 定義-->
    $(function(){
     // Datepicker の呼び出し
    $( "#datepicker" ).datepicker({onClose: function(dateText, inst) {
     //プラン番号の取得
     //日付オブジェクトの作成
    var date = new Date(dateText);
    var weekDay = parseInt(date.getDay());
    var check = false;
    if(weekDay > 0 && weekDay < 6){
    check = true;
    }
    if(!check){
    alert("この日は選択できません");
    $( "#datepicker" ).val('');
    }
    }});
//判別4(木曜)、5(金曜)は+6day それ以外は+4dayでOK
    if(todayWeekDay == 4 || todayWeekDay == 5){
            $( "#datepicker" ).datepicker( "option", 'minDate', "+6d" );
            $( "#datepicker" ).datepicker( "option", 'maxDate', "2m" );
            }            
            else{
            $( "#datepicker" ).datepicker( "option", 'minDate', "+4d" );
            $( "#datepicker" ).datepicker( "option", 'maxDate', "2m" );
            }
     }
     );
</script>
</HEAD>
<BODY>
<FORM ACTION="mail.php" METHOD="POST" ENCTYPE="application/x-www-form-urlencoded" >
<input type="text" name="date1" class="form_text-small\" id="datepicker" readonly="readonly">
</FORM>


こんな感じで実装すればよい。

            $( "#datepicker" ).datepicker( "option", 'minDate', "+4d" );
            $( "#datepicker" ).datepicker( "option", 'maxDate', "2m" );

肝はこの部分。

2016/05/24

CentOS7 ssh2_connectを実装する

正規の方法でインストールを試みるが、

#pecl install ssh2
PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/lib64/php/modules/msql.so' - /usr/lib64/php/modules/msql.so: cannot open shared object file: No                                                            
such file or directory in Unknown on line 0
PHP Warning:  Module 'mbstring' already loaded in Unknown on line 0
PHP Warning:  Module 'pgsql' already loaded in Unknown on line 0
Failed to download pecl/ssh2 within preferred state "stable", latest release is version 0.12, stability "beta", use "channel://pecl.php.net/ssh2-0.12" to install install failed

エラー

ネイティブな解説ページが有ったので、
参考にしながら実装までのオボエガキ


先ずは、yumを最新にする。

# yum update

# yum install make gcc libssh2 php-deve

# pecl install -f ssh2
PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/lib64/php/modules/msql.so' - /usr/lib64/php/modules/msql.so: cannot open shared object file: No such file or directory in Unknown on line 0
PHP Warning:  Module 'mbstring' already loaded in Unknown on line 0
PHP Warning:  Module 'pgsql' already loaded in Unknown on line 0
WARNING: failed to download pecl.php.net/ssh2 within preferred state "stable", will instead download version 0.12, stability "beta"
WARNING: channel "pecl.php.net" has updated its protocols, use "pecl channel-update pecl.php.net" to update
downloading ssh2-0.12.tgz ...
Starting to download ssh2-0.12.tgz (26,223 bytes)
.........done: 26,223 bytes
6 source files, building
running: phpize
Configuring for:
PHP Api Version:         20100412
Zend Module Api No:      20100525
Zend Extension Api No:   220100525
libssh2 prefix? [autodetect] :     ←ここはブランクのまま エンターした。
Build process completed successfully
Installing '/usr/lib64/php/modules/ssh2.so'
install ok: channel://pecl.php.net/ssh2-0.12
configuration option "php_ini" is not set to php.ini location
You should add "extension=ssh2.so" to php.ini

となるので、

# echo "extension=ssh2.so" > /etc/php.d/ssh2.ini

httpdを再起動させる。

# systemctl restart httpd.service

# php -m | grep ssh2
PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/lib64/php/modules/msql.so' - /usr/lib64/php/modules/msql.so: cannot open shared object file: No such file or directory in Unknown on line 0
PHP Warning:  Module 'mbstring' already loaded in Unknown on line 0
PHP Warning:  Module 'pgsql' already loaded in Unknown on line 0
ssh2

phpinfo() で確認すると

ssh2

SSH2 supportenabled
extension version 0.12
libssh2 version 1.4.3
banner SSH-2.0-libssh2_1.4.3

となり、実装完了。

実装方法




<?php
$connection = ssh2_connect('アドレス', 22);
ssh2_auth_password($connection, 'ログインユーザ名', 'ログインパスワード');

ssh2_scp_send($connection, '../転送元ファイル', '転送先ディレクトリ/転送するファイル', 0644);
?>

2016/05/23

phpexcelとlibreofficeのcuiを使ってPDFを作成する

かなりphpexcelの恩恵を受けているが、やはりpdfに加工したい事がある。
guiでせっせと作るのも良いのだが、
ボタン一つで作成させたい。

そこで、エクセルをpdfに変換するものをいろいろ探したところ、
libreofficeのCUIを使うのが一番崩れないようだ。

早速だが、CUIの環境を構築

#yum install libreoffice libreoffice-langpack-ja 

早速コマンドを投げてみる。

libreoffice --nologo --nofirststartwizard --convert-to pdf /var/www/html/pdf/000001.xlsx

エラーが返ってきた。

/usr/lib64/libreoffice/program/soffice.bin X11 error: Can't open display:
   Set DISPLAY environment variable, use -display option
   or check permissions of your X-Server
   (See "man X" resp. "man xhost" for details)


https://help.libreoffice.org/Common/Starting_the_Software_With_Parameters/ja
調べてみると、

オプションで  --headless を付けないと、ユーザーインタフェースが動いてしまい、NGらしい。

そこで、追加でオプションを実装。

#yum install libreoffice-headless 


libreoffice --headless --nologo --nofirststartwizard --convert-to pdf /var/www/html/excel/pdf/00001.xlsx
convert /var/www/html/excel/pdf/00001.xlsx -> /home/<>/00001.pdf using calc_pdf_Export


変換できた。

線種や文字化けはなさそう。

サイズが大きいと、ページを跨いでしまうようなので、余白の設定等で、そこをなんとかできれば、
十分使えそう。

2016/02/04

SSD 換装時のMBR問題 Windows7

HDDドライブが怪しくなってきたので、SSDに換装をしたが、
HDDが1TBに対し、SSDが240GBであったため、
ディスク丸ごとクローンが使えなかった。
元のパーティションを
EaseUE Partition Master で200GB位にまで小さくしてから
EaseUE Todo BackUp Free でパーティションクローンを作った。

EaseUEさんへのリンク
http://jp.easeus.com/partition-manager-software/free.html
EaseUS Todo Backup Freeの日本語公式ページ
http://jp.easeus.com/backup-software/free.html
システムクローンだと、換装後が面倒な予感がしたため、
非推奨のようだが、パーティションのクローンを作った。
free版なので、コピー先のパーティションをActiveに出来なかった。
恐らく駄目であろうと思いつつ、
SSDに付け替えて、BIOSを変更し、起動を掛けると、
bootLoaderが無いので起動できないとエラーが起きる。

しょうがないので、元のHDDに戻し、Windows修復ディスクを作成。
コントロール パネル→システムとセキュリティ→バックアップと復元
→システム修復ディスクの作成 で起動ディスクを作成する。

BIOSで DVD→SSDにして、ディスクから起動。

先ずは、スタートアップ修復を試すが、駄目。

続いて、コマンドプロンプトから

>bootsect /nt60 sys /mbr [ent]
でwindwos7用のブートストラップローダを書き込こもうとするが、
パーティションがアクティブでないので、書けないとエラーが返ってきた。

diskをactiveにしたいので、diskpaetコマンドを使う。
>DISKPART [ent]

・ディスクのリスト表示
DISKPART> list disk
  ディスク      状態           サイズ   空き   ダイナ GPT
  ###                                          ミック
  ------------  -------------  -------  -------  ---  ---
  ディスク 0    オンライン          200 GB  1024 KB

・ディスクを選択する。
DISKPART> select disk 0  [ent]

ディスク 0 が選択されました。

・パーティションのリスト表示
DISKPART> list partition  [ent]

  Partition ###  Type                Size     Offset
  -------------  ------------------  -------  -------
  Partition 1    プライマリ             200GB    31 KB

・パーティションを選択
DISKPART> select partition 1  [ent]

パーティション 1 が選択されました。

・activeにする
DISKPART> active  [ent]

DiskPart は現在のパーティションをアクティブとしてマークしました。

DISKPART> exit  [ent]

>bootsect /nt60 sys /mbr [ent]

ブートストラップローダを書き込んでくれるので、一旦再起動する。

>exit [ent]
これで再行動掛ける。
SSDからブートすると
BOOTMGR is missing というエラーが吐き出される。
BOOTMGR is missingが出るので、PBR(パーティションの先頭セクタ)は
生き返った。
恐らく、アクティブパーティションの設定がオカシイ。論理フォーマットが駄目なようだ。

再度システム修復ディスクから立ち上げて、
スタートアップ修復で起動可能になった。

>bootrec /fixboot
>bootrec /fixmbr
コマンドだと駄目だった。

2016/01/05

pdfに日付のフッターを付ける。(Pdftkを使ってなるべく軽くやる。)

以前、pdftkでスタンプを作ったが、
同じ原理で、タイムスタンプを押したいという話になった。
itextを使うといった手法もあるようだが、
費用が掛からず、なるべく動作が軽い方向で検討してみる。 

過去の財産を有効活用するため、
フッターに日付を持ったpdfを作成してみる。

いきなりPDFは作成できないので、
psファイルを一旦作成し、それをPDFに変換することにする。
a2psがデフォルトでインストールされていないので、
# yum install a2ps

なるべく重たくしないように、一回だけ改行した text.txtを作成し、footer.psに変換

コマンドは
$ a2ps text.txt -B -R --borders=no --footer=`date +%Y-%m-%d-%H:%M` -o footer.ps

オプションの補足
-B フレームを消す。
-R 用紙を縦にする。
--borders=no 外枠を消す。
--footer=`date +%Y-%m-%d-%H:%M` フッターに2015-01-01-01:01のタイムスタンプ
-o ファイル形式で出力する。


続いて、pdfに変換

$ ps2pdf footer.ps footer.pdf

以上。

これをcron等で、5分おき程度に作成させておけば、良い。

オプションを調べるのに凄く時間を消費したので、メモしておく。

2015/12/25

PHPExcel MSSqlServer PHPの記述

DBから取ってくる際には、shift-jisでページを作成しておかないと文字化けしたので、
やむを得ず、shift-jisで取り扱ったが、PHPExcelでのセルへの書き込みは
UTF-8で行う必要が有るため、MSSqlServerのエンコードCP932をUTF-8にして書き込む。

忘れやすいので、記載例を残す。


<?php
//PHPExcelの読み込み。
require_once("./Classes/PHPExcel.php");
require_once("./Classes/PHPExcel/IOFactory.php");
//タイムゾーン指定
date_default_timezone_set('Asia/Tokyo');

//MSSQLに接続。
$server='192.168.0.XXX:1433';
$username='USR_XXX';
$password='*******';
$con=mssql_connect($server,$username,$password);
//データベースを選択
mssql_select_db('DBの名前');

//クエリ作成。
$query = mssql_query("select~ 適宜作成 ");

//DBからデータ取得。
$col = mssql_fetch_array($query)

//PHPexcel xslx 形式の定義。
$reader = PHPExcel_IOFactory::createReader('Excel2007');
//example.xlsxを下敷きにする。
$excel = $reader->load("./下敷きにするエクセル.xlsx");

// シート設定。
$excel->setActiveSheetIndex(0);//何番目のシートか
$sheet = $excel->getActiveSheet();//有効になっているシートを代入

// セル値指定。
//日本語の指定が面倒。
//書き込みはUTF-8で行う必要が有るため、MSSqlServerのエンコードCP932をUTF-8にして書き込む。
$sheet->setCellValue('A1', mb_convert_encoding($name, 'UTF-8','auto'));//セルに値を入力。
$sheet->setCellValue('A2', mb_convert_encoding($addr, 'UTF-8','auto'));
$sheet->setCellValue('A3', mb_convert_encoding($requester, 'UTF-8','auto'));
$sheet->setCellValue('A4', mb_convert_encoding($TEL, 'UTF-8','auto'));
$sheet->setCellValue('A5', mb_convert_encoding($FAX, 'UTF-8','auto'));
$sheet->setCellValue('A6', $Number);//内部変数で扱うものは、特にエンコード不要。

//Excel2007形式(xlsx)のライターを作成。
$writer = PHPExcel_IOFactory::createWriter($excel, "Excel2007");

//ファイル出力。
$writer->save($Number.".".xlsx);



//結果セットを破棄。
  mssql_free_result($query);
//SQL Serverとの接続を解除。
  mssql_close();

?>

2015/12/21

PHPExcel MSSQLServerへの接続時エラーのメモ


開発ベンダが、DBの中身をShift-JISで格納してしまっているため、
PHP等をshift-jisで書かないと不具合が出る。
UTF-8の方がいろいろと都合がいいので、

date_default_timezone_getで宣言しろ
ということなので、PHPの頭に

date_default_timezone_set('Asia/Tokyo');

を書いたら動いた。 

Fatal error: Uncaught exception 'PHPExcel_Writer_Exception' with message 'Could not close zip
この辺のエラーはディレクトリに書き込み権限が無い場合によると思う。
パーミッションを 777 とかにして試験してみれば、行けると思う。 

2015/12/11

PHPExcel 実装

DBの扱いで最も手間が掛かるのが帳票だと思う。
基幹システムがjavaで書かれているので、
現状DBを舐めてデータを取得し、velocity、xls_foを使ってPDFを作成している。
この際、整形の為 xsl_foを苦労して造るのだが、
この作業が如何せん手間が掛かる。
スタッフからは「ここを直せ」と言われ、
クライアントからは「仕様が変わったから帳票変更」で片づけられる。

クライアントからは、エクセルで帳票のフォーマットが送られてくるので、
何とかvelocityでエクセルを扱おうとしたが、マージするくらいなら、
xsl_foを0から書いた方が楽な場合が多く、困っていた。

色々と探してみると、PHPでいいのがあるではないか!!
早速、ライブラリを使ってみる。

PHPは5.2以上で
php_zip, php_xml, php_gd2が拡張されているのが条件らしい。

php_xml, php_gd2がenableされていなかったので、

/etc/php.ini を編集
php_gd2は
# yum install php-gd でOKだった。
# systemctl restart httpd で設定読み直し

続いて、ライブラリのダウンロード
本家から最新のPHPExcel_1.8.0 をダウンロードする。

使い方は、PHP動かすディレクトリにClassesファイルを置いて、
require_onceでライブラリを読み込ませればOK
色々な参考サイトで、include_onceで書いている人が多かったが、
何故かinclude では上手く動かなかった。

以下PHPの例

<?
//PHPExcelの読み込み
require_once("./Classes/PHPExcel.php");
require_once("./Classes/PHPExcel/IOFactory.php");
//PHPexcel xslx 形式の定義
$reader = PHPExcel_IOFactory::createReader('Excel2007');
//base.xlsxを下敷きにする。
$excel = $reader->load("./base.xlsx");

// シート設定
$excel->setActiveSheetIndex(0);//何番目のシートか
$sheet = $excel->getActiveSheet();//有効になっているシートを代入

// セル値指定
$sheet->setCellValue('A10', 'Hello World !');//セルA10に値を入力

//Excel2007形式(xlsx)のライターを作成
$writer = PHPExcel_IOFactory::createWriter($excel, "Excel2007");

//ファイル出力
$writer->save("helloworld.xlsx); 

?>


マクロやVBAが入っていると上手くないというコメントも見られるが、
エクセルで設定した罫線や、文字サイズなどがキッチリ継承されるので、
すごーく便利。
もっと早く使いたかった・・・。

2015/10/13

非同期処理 HTML 検索窓を追加する

過去に書いた内容のブラッシュアップ

http://t0463.blogspot.jp/2015/06/windowsserver2012sshsqlcsv.html

jquery.csv2table を使い、csvを表にして表示させているが、
検索して、行を絞り込みたいという要望が出たので、
実装させてみる。
 
http://jsgt.org/lib/jquery/plugin/csv2table/v002/test.htm
↑このサイトのsetting.where 行の絞込み
をほぼそのまま流用にさせていただいた。ありがとうございます。
 
中身はこんな感じ 
 
<body> 
<input type="text" id="word">
<button type="button" id="btn-search">番号で検索</button>
<input type="text" id="word2">
<button type="button" id="btn-search2">住所で検索</button>
<div id="view1"></div>
<script type="text/javascript">
$().ready ( function() {
$('#btn-search').click ( function() {
$('#view1').csv2table('./listUTF8.csv', {
where: [ {'検索させたい列名':'like' + '%' + $('#word').val() + '%'} ]
});
});
});
</script>
<script type="text/javascript">
$().ready ( function() {
$('#btn-search2').click ( function() {
$('#view1').csv2table('./listUTF8.csv', {
where: [ {'検索させたい列名2':'like' + '%' + $('#word2').val() + '%'} ]
});
});
});
</script>
<br>
<font size ='2'>一覧表示</font>
<div id="view0"></div>

<script>
$(function(){
  $('#view0').csv2table('./listUTF8.csv');
});
</script>
</body>


2015/09/09

CentOS7.1 PHPでSQLServerにアクセス。

この内容は古いので、MSSQLへPHPで接続(PDO接続)を参照されたい


ODBC-develをyumでインストール。

# yum install unixODBC-devel.x86_64

前回のpdftkもそうだったが、freetds-develもサポート外のようで、
ソースからビルドかと思ったが、epelで取ってこれるらしいのでやってみる。

# yum install epel-release

続いて、freetds-develをyumでインストール

# yum install freetds-devel

読み込んだプラグイン:fastestmirror, langpacks
epel/x86_64/metalink                                     | 5.2 kB     00:00
epel                                                     | 4.3 kB     00:00
(1/3): epel/x86_64/group_gz                                | 169 kB   00:00
epel/x86_64/updateinfo         FAILED
http://ftp.kddilabs.jp/Linux/packages/fedora/epel/7/x86_64/repodata/2c17dad24b2f96866b643bc3d4ce432833ca592ecf1af495e2b3a2361cf7ceab-updateinfo.xml.bz2: [Errno 14] HTTP Error 404 - Not Found
他のミラーを試します。
(2/3): epel/x86_64/updateinfo                              | 349 kB   00:00
(3/3): epel/x86_64/primary_db                              | 3.5 MB   00:06


Downloading packages:
警告: /var/cache/yum/x86_64/7/epel/packages/freetds-devel-0.91-12.git0a42888.el7.x86_64.rpm: ヘッダー V3 RSA/SHA256 Signature、鍵 ID 3XXXXXX: NOKEY
freetds-devel-0.91-12.git0a42888.el7.x86_64.rpm の公開鍵がインストールされていません
(1/2): freetds-devel-0.91-12.git0a42888.el7.x86_64.rpm     |  48 kB   00:00
(2/2): freetds-0.91-12.git0a42888.el7.x86_64.rpm           | 1.1 MB   00:00
--------------------------------------------------------------------------------
合計                                               2.4 MB/s | 1.2 MB  00:00
file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7 から鍵を取得中です。
Importing GPG key 0xXXXXXXX:
 Userid     : "Fedora EPEL (7) "
 Package    : epel-release-7-5.noarch (@extras)
 From       : /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
上記の処理を行います。よろしいでしょうか? [y/N]y
 

途中上記の警告が出たが、インストールできた模様。

早速、phpで接続試験をすると、SqlServerにアクセスしていないようだ。
なんでだろう?
info.phpを作って調べると、php-mssql.x86_64 がインストールされていない模様。
# yum install php-mssql.x86_64

# systemctl restart httpd.service
で動いた。

接続の試験用

$server='192.168.XXX.XXX:1433';
$username='USR_XXX';
$password='*****';
$con=mssql_connect($server,$username,$password);

if($con !=FALSE)
{
        echo "Connection to SqlServer successful";
}
else
{
        die("Connection to SqlServer failed");
}

mssql_close($con);

?>

2015/09/01

CentOS7.1 Logwatchのメールを送信する。

CentOS5.xはport25を開ければ、そのまんま飛んできたが、
CentOS7.1はどうもデフォルトのままでは、Logwatchが飛ばないらしい。
まずは、メールソフトは何が動いているのか?を調べてみる。
sendmailが入っているか?
 
# systemctl status sendmail.service
sendmail.service
   Loaded: not-found (Reason: No such file or directory)
   Active: inactive (dead)
sendmailはサービスとして認識されているが、インストールされていない模様。
 
yumにメール関連は入っていないのか?と思ったが、
# yum list installed
postfix.x86_64         2:2.10.1-6.el7       @anaconda
postfixがインストールされていた。
sendmailが標準ではなくなったようだ。

動いているか確認。
# systemctl status postfix.service
postfix.service - Postfix Mail Transport Agent
   Loaded: loaded (/usr/lib/systemd/system/postfix.service; enabled)
   Active: active (running) since 金 2015-08-28 19:30:38 JST; 3 days ago
自動起動していた・・・。



postfixの設定

#nano /etc/postfix/main.cf


myhostname = mail.何か名前.com   追加

mydomain = 何か名前.com       追加

myorigin = $mydomain          コメント解除し、ローカルからの送信時ドメイン名を付与

inet_interfaces = localhost       今の所、受信はしないつもりなので、このまま

inet_protocols = ipv4           IPv6許容して無い時は影響受けるらしいので、記述

#mydestination = $myhostname, localhost.$mydomain, localhost     コメント化
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain 
コメント解除し自己メール許容

home_mailbox = Maildir/                   コメント解除

保存して、postfixを再起動。
# systemctl restart postfix.service
# systemctl status postfix.service
postfix.service - Postfix Mail Transport Agent
   Loaded: loaded (/usr/lib/systemd/system/postfix.service; enabled)
   Active: active (running) since 火 2015-09-01 10:36:14 JST; 4s ago
  Process: 9847 ExecStop=/usr/sbin/postfix stop (code=exited, status=0/SUCCESS)
  Process: 9862 ExecStart=/usr/sbin/postfix start (code=exited, status=0/SUCCESS)
  Process: 9859 ExecStartPre=/usr/libexec/postfix/chroot-update (code=exited, status=0/SUCCESS)
  Process: 9857 ExecStartPre=/usr/libexec/postfix/aliasesdb (code=exited, status=0/SUCCESS)

logwatchのメールを送ってみる。
# /etc/cron.daily/0logwatch

指定のアドレスにメールが届けばOK。

ポート25の開放の方法は

# firewall-cmd --add-service=smtp --permanent
success
# firewall-cmd --reload
success
# firewall-cmd  --list-all
public (default, active)
  interfaces: enp2s0
  sources:
  services: dhcpv6-client http postgresql samba smtp ssh tomcat
 ports: 8080/tcp
  masquerade: no
  forward-ports:
  icmp-blocks:
  rich rules:

追記
logwatchのメールを複数に送信する場合は、
# nano /usr/share/logwatch/default.conf/logwatch.conf
Detail = Med
MailTo = 任意のアドレス 任意のアドレス2 (半角スペースを挟めば良い模様)

2015/08/28

CentOS7.1 無理やり PDFTkをインストールする。

CentOS7.1にして、ありゃりゃな事に遭遇。
PDFTkがRPMでインストールできなかった・・・。

以前の作業(PDFTkをRPMでインストール)
http://t0463.blogspot.jp/2014/12/pdfpdftk.html


フォーラム等によると、どうも、libgcjとかいうライブラリがCentOS7から入っていない為、駄目らしい
https://github.com/documentcloud/docsplit/issues/123 此処に

building PDFtk on RHEL 7 currently isn't possible due to upstrean (Fedora) dropping support for libgcj
とあるので、サポートして無いのだろう。
だがしかし、こちらに偉大な先人が 数名いらっしゃった。
http://ume.macoron.net/archives/7627
http://blog.cyber-support.info/article/424149031.html

ベクタ画像を描くのに必要となる基本的なライブラリを入れる。
yum install libart_lgpl

GNUのコンパイラも必要みたいなので、CentOS6.7のものをPRMでインストール
# wget http://ftp.riken.jp/Linux/centos/6.7/os/x86_64/Packages/gmp-4.3.1-7.el6_2.2.x86_64.rpm 
# rpm -iv --force  gmp-4.3.1-7.el6_2.2.x86_64.rpm


つづいて、そのサポートしなくなったlibgcjのパッケージを用意
# wget http://ftp.riken.jp/Linux/centos/6.7/os/x86_64/Packages/libgcj-4.4.7-16.el6.x86_64.rpm
# rpm -iv --force libgcj-4.4.7-16.el6.x86_64.rpm
最後にPDFTkを持ってくる。
# wget https://www.pdflabs.com/tools/pdftk-the-pdf-toolkit/pdftk-2.02-1.el6.x86_64.rpm
# rpm -ivh pdftk-2.02-1.el6.x86_64.rpm


動いているようなので、良かった・・・。

OSのアップグレードはこういうのがネックだと感じる。

2015/08/22

CentOS7.1 Logwatch と crontabの設定


# yum install logwatch
# nano /usr/share/logwatch/default.conf/logwatch.conf
Detail = Med
MailTo = 任意のアドレス


以前の記事にあるが、crontabの時間がランダムになってしますので、
レガシーなcrontabにする。
# yum install cronie-noanacron
# rpm -e cronie-anacron


# nano /etc/cron.d/dailyjobs を修正。



2015/08/21

CentOS7.1 sambaインストール

http://desktop-linux.namakemono345.com/samba-centos-7/

これは、特に考えずにyumでインストールする。
# yum install samba

sambaの設定
[global]内に以下を、書き換え、追加する。
        workgroup = workgroup
        server string = 表示したいことを書いておく
        netbios name = 表示したいことを書いておく
#windowsからのアクセスを許容する
        map to guest = bad user
末尾に
        [共有させる名称] ←この名前で認識される
        comment = 名称
;       browseable = yes
        create mode = 0777
        directory mode = 0777
        path = /home/任意ディレクトリ
        guest ok = yes
        only guest = yes
        writeable = yes

上記は基本全権限。

ディレクトリを作る。
#mkdir /home/任意ディレクトリ

OS起動時に自動起動にする
自動起動を有効にする。
# systemctl enable smb
# systemctl list-unit-files で確認。
smb.service                                 enabled

起動
# systemctl start smb
ファイアーフォール開ける。
# firewall-cmd --add-service=samba --permanent
# firewall-cmd --reload

Windowsマシンからアクセスすると、
ディレクトリに入って中が見えるのに、書き込もうとすると
アクセス権限が無いといわれる。
そのくせ、デリートは出来たみたいになる。
(Linux上では消えていないので、オカシイ)

SELinuxがわるさしてるっぽいので動いているか調べる
# getenforce
Enforcing
動いておるので、とりあえず止めてみる。
# setenforce 0
これでwindows側から修正できた。
postgresの絡みの部分も再起動する毎、読み込まない症状が出たので、
社内用のサーバなので、セキュリティはそこそこで良いためSElinuxはとりあえず止める。
# nano /etc/selinux/config
SELINUX=disabled

SELinuxの件で2時間程嵌った・・・・。

CentOS7.1 HDDの追加

今回追加するHDDは2Tbi以下で、尚且つインターネットに曝されていないので、
XFSフォーマットで行う(centOS6で云うext4はXFSに変わったので)
HDDを取り付け、はじめにHDDが認識されているか確認
(LVMは手順が多いし、過去にVGの名称が同じなのに誤ってつないでしまい、データを壊した経験があるので喰わず嫌いなのである・・・。)

# dmesg|grep sd
[    3.602350]  sda: sda1 sda2
[    3.602758] sd 0:0:0:0: [sda] Attached SCSI disk
[    3.619862]  sdb: unknown partition table
[    3.620061] sd 1:0:0:0: [sdb] Attached SCSI disk
[    8.846799] XFS (sda1): Mounting V4 Filesystem
[   10.971040] XFS (sda1): Ending clean mount
[   10.971065] SELinux: initialized (dev sda1, type xfs), uses xattr

サイズ等を認識しているかを確認する。
# fdisk -l
Disk /dev/sdb: 2000.4 GB, 2000398934016 bytes, 3907029168 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O サイズ (最小 / 推奨): 4096 バイト / 4096 バイト

# fdisk /dev/sdb
Welcome to fdisk (util-linux 2.23.2).

Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Device does not contain a recognized partition table
Building a new DOS disklabel with disk identifier 0xbe76e7c2.

The device presents a logical sector size that is smaller than
the physical sector size. Aligning to a physical sector (or optimal
I/O) size boundary is recommended, or performance may be impacted.

コマンド (m でヘルプ):
コマンドの動作
   a   toggle a bootable flag
   b   edit bsd disklabel
   c   toggle the dos compatibility flag
   d   delete a partition
   g   create a new empty GPT partition table
   G   create an IRIX (SGI) partition table
   l   list known partition types
   m   print this menu
   n   add a new partition
   o   create a new empty DOS partition table
   p   print the partition table
   q   quit without saving changes
   s   create a new empty Sun disklabel
   t   change a partition's system id
   u   change display/entry units
   v   verify the partition table
   w   write table to disk and exit
   x   extra functionality (experts only)
             Pを入れて、パーテーションを設定
コマンド (m でヘルプ): p

Disk /dev/sdb: 2000.4 GB, 2000398934016 bytes, 3907029168 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O サイズ (最小 / 推奨): 4096 バイト / 4096 バイト
Disk label type: dos
ディスク識別子: 0xc7f836c8

デバイス ブート      始点        終点     ブロック   Id  システム

コマンド (m でヘルプ): n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): p
パーティション番号 (1-4, default 1): 1
最初 sector (2048-3907029167, 初期値 2048):エンター
初期値 2048 を使います
Last sector, +sectors or +size{K,M,G} (2048-3907029167, 初期値 3907029167):エンター
初期値 3907029167 を使います
Partition 1 of type Linux and of size 1.8 TiB is set

コマンド (m でヘルプ): p
Disk /dev/sdb: 2000.4 GB, 2000398934016 bytes, 3907029168 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O サイズ (最小 / 推奨): 4096 バイト / 4096 バイト
Disk label type: dos
ディスク識別子: 0xc7f836c8

デバイス ブート      始点        終点     ブロック   Id  システム
/dev/sdb1            2048  3907029167  1953513560   83  Linux

コマンド (m でヘルプ): w
パーティションテーブルは変更されました!

ioctl() を呼び出してパーティションテーブルを再読込みします。
ディスクを同期しています。

XFSタイプのファイルシステムを作成する。
# mkfs -t xfs /dev/sdb1
meta-data=/dev/sdb1              isize=256    agcount=4, agsize=122094598 blks
         =                       sectsz=4096  attr=2, projid32bit=1
         =                       crc=0        finobt=0
data     =                       bsize=4096   blocks=488378390, imaxpct=5
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=0
log      =internal log           bsize=4096   blocks=238466, version=2
         =                       sectsz=4096  sunit=1 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

続いて追加したHDDをstorage2としてマウントさせる

# mkdir /home/storage2
# mount /dev/sdb1 /home/storage2
# chown  ユーザ名 /home/storage2/

dfで確認
# df
ファイルシス            1K-ブロック    使用     使用可 使用% マウント位置
/dev/mapper/centos-root    52403200 4574420   47828780    9% /
devtmpfs                    2920376       0    2920376    0% /dev
tmpfs                       2930520      80    2930440    1% /dev/shm
tmpfs                       2930520    8964    2921556    1% /run
tmpfs                       2930520       0    2930520    0% /sys/fs/cgroup
/dev/mapper/centos-home  1893548692   85400 1893463292    1% /home
/dev/sda1                    505580  127680     377900   26% /boot
/dev/sdb1                1952559696   32976 1952526720    1% /home/storage2

常時、マウントするようにfstabを編集する。赤を追記(UUIDは置き換えること)
# blkid /dev/sdb1
/dev/sdb1: UUID="320f300e-XXXX-XXXX-XXXX-XXXXXXXXXXXX" TYPE="xfs"
# nano /etc/fstab
末尾に追加
#追加HDD
UUID=320f300e-XXXX-XXXX-XXXX-XXXXXXXXXXXX /home/storage2 xfs defaults 0 0

再起動してみて自動的にマウントされていればOK。