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。

CentOS7.1 PHP インストールとhttpdやFirewallの設定

# yum install php php-mbstring php-pdo php-pgsql
5.4.16なので、そのままyumでインストールする。
一気にyum install php* をやったら依存関係で怒られた。

インストール後の設定
# nano /etc/php.ini

short_open_tag = off を on へ
;extension=msql.so の;を外して有効にする。
下に
extension=pgsql.so
extension=mbstring.so
を追加



httpd.confにもphpの内容を追加する。
の項目内に
AddType application/x-httpd-php .php
を追記。

httpdを再起動
# systemctl start httpd.service

続いて
# firewall-cmd --add-service=postgresql --permanent
# firewall-cmd --reload

クライアントからアクセスして、PHPが予定通り動けばOK。

CentOS7.1 postgresql インストールから設定

パッケージは9.2.13がbaseでrpmに含まれている。
最新版は9.4.4の様なので、まぁ9.2でいいかということで、
# yum install postgresql*

インストール後そのまま起動しようとしても、起動できなかった。

systemctl start の中にpostgresql.serviceが無く、コマンド叩いても
Job for postgresql.service failed. See 'systemctl status postgresql.service' and 'journalctl -xn' for details.
詳細を確認されたい。と出ます。

# systemctl status postgresql.service
postgresql.service - PostgreSQL database server
Loaded: loaded (/usr/lib/systemd/system/postgresql.service; disabled)
Active: failed (Result: exit-code) since 金 2015-08-21 13:55:21 JST; 2min 57s ago
Process: 4824 ExecStartPre=/usr/bin/postgresql-check-db-dir ${PGDATA} (code=exited, status=1/FAILURE)

${PGDATA} がおかしいということなので、
指定先を調べてみる。
# nano /usr/lib/systemd/system/postgresql.service

# Location of database directory
Environment=PGDATA=/var/lib/pgsql/data ということで、/var/libpgsql/ に/data を作る。

# mkdir -p /var/lib/pgsql/data
# chown postgres:postgres /var/lib/pgsql/data/
postgresさんになってDBをフォーマットする。
# su - postgres
initdbコマンドでデータ格納場所を初期化する。
-bash-4.2$ initdb -D /var/lib/pgsql/data/
データベースシステム内のファイルの所有者は"postgres"ユーザでした。
このユーザがサーバプロセスを所有しなければなりません。

データベースクラスタはロケール"ja_JP.UTF-8"で初期化されます。
したがってデフォルトのデータベース符号化方式はUTF8に設定されました。
initdb: ロケール"ja_JP.UTF-8"用の適切なテキスト検索設定が見つかりません
デフォルトのテキスト検索設定はsimpleに設定されました。

ディレクトリ/var/lib/pgsql/dataの権限を設定しています ... ok
サブディレクトリを作成しています ... ok
デフォルトのmax_connectionsを選択しています ... 100
デフォルトの shared_buffers を選択しています ... 32MB
設定ファイルを作成しています ... ok
/var/lib/pgsql/data/base/1にtemplate1データベースを作成しています ... ok
pg_authidを初期化しています ... ok
依存関係を初期化しています ... ok
システムビューを作成しています ... ok
システムオブジェクトの定義をロードしています ... ok
照合順序を作成しています ... ok
変換を作成しています ... ok
ディレクトリを作成しています ... ok
組み込みオブジェクトに権限を設定しています ... ok
情報スキーマを作成しています ... ok
PL/pgSQL サーバサイド言語をロードしています ... ok
template1データベースをバキュームしています ... ok
template1からtemplate0へコピーしています ... ok
template1からpostgresへコピーしています ... ok

警告: ローカル接続向けに"trust"認証が有効です。
pg_hba.confを編集する、もしくは、次回initdbを実行する時に-Aオプショ
ン、または、--auth-localおよび--auth-hostを使用することで変更するこ
とができます。

成功しました。以下を使用してデータベースサーバを起動することができます。

    postmaster -D /var/lib/pgsql/data
または
    pg_ctl -D /var/lib/pgsql/data -l logfile start

-bash-4.2$ exit

systemctl start の中にpostgresql.serviceが増えているので、
# systemctl start postgresql.service で起動
# systemctl status postgresql.service
postgresql.service - PostgreSQL database server
   Loaded: loaded (/usr/lib/systemd/system/postgresql.service; disabled)
   Active: active (running) since 金 2015-08-21 14:22:24 JST; 2s ago
  Process: 5510 ExecStart=/usr/bin/pg_ctl start -D ${PGDATA} -s -o -p ${PGPORT} -w -t 300 (code=exited, status=0/SUCCESS)
  Process: 5503 ExecStartPre=/usr/bin/postgresql-check-db-dir ${PGDATA} (code=exited, status=0/SUCCESS)
 Main PID: 5513 (postgres)
   CGroup: /system.slice/postgresql.service
           tq5513 /usr/bin/postgres -D /var/lib/pgsql/data -p 5432
           tq5514 postgres: logger process
           tq5516 postgres: checkpointer process
           tq5517 postgres: writer process
           tq5518 postgres: wal writer process
           tq5519 postgres: autovacuum launcher process
           mq5520 postgres: stats collector process

大丈夫っぽい。

ユーザabcを作成。
#su - postgres
-bash-4.2$ createuser -P -s -E abc
新しいロールのためのパスワード:
もう一度入力してください:

ユーザが増えているか確認。
-bash-4.2$ psql
psql (9.2.13)
"help" でヘルプを表示します.

postgres=# select * from pg_shadow
2名になっているのでOK
\qでexit


pg_hba.confでネットワーク内からのアクセスを許容する。
# nano /var/lib/pgsql/data/pg_hba.conf
末尾の
# IPv4 local connections:
host    all         all         192.168.0.0/16          md5

こんな感じで、拠点間の接続にも対応できるように設定しておく。

CentOS7.1 httpdの設定 chkconfigはレガシー iptablesもレガシー

# yum list | grep httpd*
httpd.x86_64 2.4.6-31.el7.centos base

現在2.4が最新のようなので、このままyumでインストールしてしまう。

インストール後、自動起動の設定をしようと、
# chkconfig --add httpdを行うと、systemd serviceに移行したからそっち使え
と応答されるので、ちょっと調べた。

#systemctl list-unit-files
これで一覧が生じされるので、確認はここで行えばよさそう。

chkconfigでもパスしてくれるので、一緒だけど、正しくは
#systemctl is-enabled サービス名.service

httpdの場合は、# systemctl enable httpd.service
このように表記する模様。

更に、iptablesもレガシーな扱いになっているようだ・・・。
firewalld に移行したそうなので、そっちで設定してみる。
#systemctl list-unit-files に
firewalld.service enabled となっているので、
新規インストールは不要。 


firewall-cmdがコマンドらしいのでリストを出してみる。
#firewall-cmd --list-all
 public (default, active)
  interfaces: enp2s0
  sources:
  services: dhcpv6-client ssh
  ports:
  masquerade: no
  forward-ports:
  icmp-blocks:
  rich rules:

ゾーンの定義があるようだが、外部からのアクセスを許容したいので、
ゾーン設定は特に行わない。 --permanent を付けると再起動後も有効と
なるが、即時有効ではない模様。 --reloadしておく。

# firewall-cmd --add-service=http --permanent
success
# firewall-cmd --reload
success

ポートは開けたので、今度はhttpdの設定を行う。(PHPインストール後には再度弄る)
#nano /etc/httpd/conf/httpd.conf
DirectoryIndex index.html index.php index.htm index.shtml

保存して上書き
httpdを走らせる。
# systemctl start httpd
# systemctl enable httpd

外部クライアントからブラウジングできればOK。

2015/08/20

CentOS7.1 インストール作業~ネットワーク接続まで

インストールの前作業

http://isoredirect.centos.org/centos/7/isos/x86_64/CentOS-7-x86_64-DVD-1503-01.iso

http://ftp.riken.jp/Linux/centos/7/isos/x86_64/CentOS-7-x86_64-DVD-1503-01.iso 

この辺からISOイメージをダウンロードして、DVDを作成する。

今回購入したPRIMEGY TX1310M1 は ハードウェアRAIDを実装しており、
インストール時にRAIDのパッケージを追加する必要があった。

CenOS7 install にカーソルを併せてTABを押し、
inst.dd を追加してからインストールを行う。

対話式のモードになるので、fujitsuのホームページから

URL: http://support.ts.fujitsu.com/Download/Index.asp

「Product selection(manually search)」より「Fujitsu Server PRIMERGY」→「PRIMERGY TXxxx」
→「PRIMERGY TX1310 M1」 →「Red Hat Enterprise Linux」→「Red Hat Enterprise Linux 7(x86_64)」→「SATA RAID」→「RHDUP driver package megasr 16.01.2014.0318-1 for RHEL 7 GA」を用意しておく。
加えて、RAIDコントローラは有効にしないと起動時に制御が掛かるらしく、
OSインストール中の最後の再起動で躓いたので
BIOSでSATA Configurationの設定があるので、そこをIDE MODEにした。
必要を感じたらRAIDを組む事にする。



インストール後の設定

先ずは他のクライアントからターミナルで操作したいので、
ネットワークの設定をする。

$ ip address show 
でNICの情報を取る。
このサーバはNICを2つ持っている(19800で購入の割にすごいな)
 
1: lo:  mtu 65536 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: enp2s0:  mtu 1500 qdisc mq state UP qlen 1000
    link/ether 90:1b:0e:XX:XX:ee brd ff:ff:ff:ff:ff:ff
    valid_lft forever preferred_lft forever
3: enp0s25:  mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 90:1b:0e:XX:XX:dc brd ff:ff:ff:ff:ff:ff

$ nmcli device show enp2s0 で詳細を取る
GENERAL.デバイス:                       enp2s0
GENERAL.タイプ:                         ethernet
GENERAL.ハードウェアアドレス:           90:1B:0E:60:54:EE
GENERAL.MTU:                            1500
GENERAL.状態:                           1000 (接続済み)
GENERAL.接続:                           enp2s0
GENERAL.CON パス:                       /org/freedesktop/NetworkManager/ActiveConnection/3
WIRED-PROPERTIES.キャリア:              オン
IP4.アドレス[1]:                         ip = 127.0.0.1/8, gw = 0.0.0.0
IP6.アドレス[1]:                         ip = ::1/128, gw = ::                     

こんな感じ 

$ nmcli con show enp2s0 を見る。
 
↓サーバ起動時に自動で接続させる 
connection.autoconnect:                 no 
↓DHCPを固定にしたいので、ここはマニュアルにして、IPアドレスを指定。 
ipv4.method:                            auto
これについては、 昔のようなバグはもう無い様なのでGUIで弄ったほうが楽。
 
 
# nmcli con mod enp2s0 connection.autoconnect "yes"
# nmcli con mod enp2s0 ipv4.addresses "192.168.0.XXX/24"
# nmcli con mod enp2s0 ipv4.method "manual" 

# nmcli device disconnect enp2s0
# nmcli device connect enp2s0
 

他のクライアントからTeraTerm等で接続してみる。

2015/08/12

rsyncのエラー 12番

rsync: writefd_unbuffered failed to write 4092 bytes to socket [sender]

今更ながら、rsyncのエラーが起こったので、再度見直し、いろいろと調べてみた所
サイズの大きい圧縮ファイルの所で躓く様なので、そのあたりを調べてみた。

原因の推測
恐らく、ファイルサイズの異なる同じ名前のファイルを参照し、転送を開始する際に、
コマンドの指定が無い時は、差分の転送を行うが、
zip等の場合、内部構成まで見て差分処理を行おうとするようで、
エラーを返してくる模様。

解決方法
・ --whole-file をつけて、差分の送信をやめる。
・ zipやtarで保存する際は、別のファイルとなるように常にdateを付与する処理をする。
・ zip等のファイルは同期しないようにする。
そこで、一番楽そうな --whole-file をコマンドに追加することにした。

スクリプトシェル
#!/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 | head -1`
NewBackup=`date +%Y%m%d`backup

mkdir $BackupDIR/$NewBackup
rsync -rlptv --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



2015/07/09

CentOSからPHPを使って MicrosoftSqlServerに接続

CentOSからPHPを使ってMicrosoftSqlSeverに直接アクセスは出来ないらしく、

FreeTDSを使って橋渡しをするらしい。

イメージとしては、
PHP ⇔ FreeTDS ⇔ MsSqlServer
こんな感じの流れのようです。

とりあえず、FreeTDSでSqlServerにつかがるかを実験してみる。

先に unixODBCをインストールしている理由は、
FreeTDSはSybaseやSQL Serverと通信をするためのプロトコルであって(インターフェイス)、
DBへのアクセスをする場合にはODBCドライバを経由して行わなければならない。
らしい。
http://www.amy.hi-ho.ne.jp/jbaba/unix/tdsodbc.htm
↑ここに技術解説があった。みなさんここを見ているらしいです。

# yum install unixODBC-devel

ODBCドライバをインストール。

# yum install freetds-devel
FreeTDSをインストール。

freetdsにSqlServerの設定をする。
# nano /etc/freetds.conf

末尾に

[sqlserver]
host = DBサーバアドレス
port = 1433
tds version = 8.0
charset = sjis
client charset = utf-8
language = japanese

を加える。


charset は デフォルトはCP932だが、今回のベンダの設定では
SeqServerに定義したエンコードはsjisだったようだ。
エンコード関係でやはり30分ほど嵌った。


# tsql -S sqlserver -U ユーザ名 -P パスワード名
locale is "ja_JP.UTF-8"
locale charset is "UTF-8"
1>
となれば接続成功。

1>select * from テーブル名
2>go

このように使う。

ここまでが事前準備。



接続実験


$server=’DBサーバアドレス’;
$username='ユーザ名';
$password='パスワード';
$con=mssql_connect($server,$username,$password);

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

mssql_close($con);
?>



次は、二つのDBを跨いだときの取り扱いを残す予定。

2015/06/09

WindowsServer2012で外部サーバとssh同期とSQLサーバのコマンド処理(CSV書出し)


目的
WEBサイト内の一部のコンテンツを非同期処理を行いたいが、
今回、ベンダが用意したOSがWindowsServer2012であったので、
sshや、コマンド処理等、
WindowsServer2012単体で解決出来ない点を
忘れないようにオボエガキしておく。

仕掛け
SQLServer2014の動いているWindowsServer2012マシンで「タスク処理」させる
 ⇒batファイルをつくる
SQLServerをコマンドラインで動かし、必要なカラムを抽出させるクエリをcsvで吐出し
 ⇒bcpコマンドを使う
吐き出したcsvをutf-8に変換する。
 ⇒色々試したが、結果nkfを使うことにした。
レンタルサーバの所定フォルダとwindowsServer2012の所定フォルダの同期をとる
 ⇒ssh接続の方法を単独で持たないようなので、winSCPを利用する。
同期をとったcsvをjQueryを使って整形し、表示させる。


csv書出し用バッチ処理

@echo off
bcp "select ~" queryout "C:\出力先フォルダ\list.csv" -c -t, -S
<192.168.0.xxx> -U <ユーザ名> -P <パスワード>
exit

解説:-c 文字データ型を使用して操作を実行 -t, のカンマ区切りを付与
   -S サーバ名 
   -U ユーザ名
   -P パスワード
※当初、utf-8で出力できないかいろいろ試したが、SQLServerは動作保障外というだけあって、

-C 65001 を付けると書き出さなかった・・・。



エンコード用バッチ処理
 
@echo off
cd C:\作業フォルダ
type top.csv list.csv > before.csv
nkf32.exe -w80 before.csv > listUTF8.csv

解説:bcpコマンドは表題行を書き出してくれないので、
   予め、表題行のcsvを作っておき、typeコマンドでくっつけている。
   今回は、top.csvにlist.csvをくっつけて、
   nkf32.exe -w80 でutf-8に変換している。



レンタルサーバへの同期用バッチ処理


@echo off
cd "C:\Program Files (x86)\WinSCP"
WinSCP.exe /console /script="sync"

exit

解説:WinSCP.exe /console /script="スクリプト処理ファイル"
   この一行で、コマンドで動かせる。
   ITmediaさんに解説ページがあった。
   (コマンドリファレンスへのリンクもあり非常に助かった。)


スクリプト処理ファイルの中身


option batch on
open ユーザ名@サーバ名
cd /var/www/html/サーバ側の所定のフォルダ
lcd C:\ローカル側の所定のフォルダ
synchronize remote
exit

解説:synchronize remote リモート側(サーバ側)を同期させる と書くようだ。
   サーバ側のデータを同期させたいのであれば、synchronize local となる。
   両方ならばそのままの、both。
   事前に接続をさせておき、その際、ini等にパスワードは覚えさせておく必要あり。

非同期処理のhtml


<html>
<header>
<script src=\"jquery-1.11.3.min.js\"></script>
<script src=\"jquery.csv2table-0.02-b-2.8.js\" type=\"text/javascript\" charset=\"utf-8\"></script>
</header>
<body>
<div id=\"view\"></div>
<script>
$(function(){
  $(\'#view\').csv2table(\'./listUTF8.csv\');
});
</script>
<script>location.reload()</script>
</body>
</html>
最小の構成はこんな感じ

解説:jquery-1.11.3.min.js
   jquery.csv2table-0.02-b-2.8.js はそれぞれ先駆者のものを利用させて頂いた。
   jquery.csv2table-0.02-b-2.8.js はutf-8でないと文字化けする。

   mimeをかぶせてshift-jisという方法もあるが、
   一発で上手くいかなかったことととブラウザに左右されそうだったので、nkfでの処理を選択した。


WinSCP補足

ツール→環境設定→保存→レジストリからINIファイルに変更
ツール→設定のエクスポート

↓おまじない
◆WinSCPの起動をini起動にする
"C:\Program Files (x86)\WinSCP\WinSCP.exe" /ini=C:\syncXML\WinSCP.ini
winwcp.ini 設定
◆同期のコマンドの変数を2に変える
SynchronizeParams=2にする
◆winSCP.iniは出来れば、WinSCPの直下でない方がいいらしい。



同じような内容を開発ベンダに見積取ったら、
えらい金額が上がってきたので、作ってしまえというのが動機。

2015/04/15

VMWare Player WIN8.1上でWindows98を動かす

Windows8.1 64bit版を利用しているのだが、
どうしても、16bitのソフトを動かす必要ができた。
手持ちのXPは全て独自のインストール用のものだったので、
已むを得ずWindows98をインストールした際のオボエガキ。

VMWare Playerをダウンロード

https://my.vmware.com/jp/web/vmware/free#desktop_end_user_computing/vmware_player/7_0

手持ちのwindows98のISOを作成する。

imgburnを使った。

windows98の起動ディスクなんてもうないので、

http://www.allbootdisks.com/download/98.html
こちらからダウンロードした。

VMWare Playerの仮想マシンの設定で、
フロッピーを追加しimgファイルを自動起動するようにし、
MEMを512MBにして、起動。


仮想マシンを起動
→FDを読みこまれるので、1を選択してDOSを立ち上げる
→fdisk ENTER
→Yのまま ENTER
→1 ENTER
→Yのまま ENTER
→Escを押す
→restart ENTER で再起動
※再起動するので、formatをかける

→1 ENTER
→format C: ENTER
→Y ENTER
→フォーマットが終わったら Exit選択
→ボリュームラベルの入力(空欄のまま) ENTER
→D: ENTER
→setup ENTER
→Windows98インストールスタート

あらかたファイルのコピーが終わると再起動を要求してくるので、
その際に、フロッピーは自動起動しないようにする。
(もう一度DOS起動画面になってしまうため)

このまま使ってもよいが、ファイルのやり取りを画面上でできるようにするため、
VMwareToolsをインストールしておく。

管理の中にVMware Toolsのインストールがあるので、ダイアログに従えばOK。
問題なく使えた。

最後に

あ~、こんな感じで領域作ったな~、しょっちゅうFDISKやFORMATしたな~
と大変懐かしい気分になった。

2015/01/12

NEC PC-BL100RA (CentOS6)をWOL利用する

手順

1  起動時 F2でBIOS起動し、(珍しい日本語のセットアップユーティリティだった)
   詳細⇒リモート電源制御 を [使用する]に変更。

2  CentOSを立ち上げて、有線でネットワークの環境を構築する。
   (NICへの電源供給の関係で、無線は無理っぽかった)

3  WOL対応のソフトをyumでインストール

   # yum -y install ethtool

   # nano /etc/sysconfig/network-scripts/ifcfg-System_eth0

   末尾に
   ETHTOOL_OPTS="wol g"
   を追記する。

起動は各クライアントからマックアドレスに向けてマジックパケットを投げればOK