Red Hat で動く Microsoft SQL Server

最近の Microsoft は、オープンソースソフトに対する姿勢が様変わりしてます。特に、Windows の基盤ともいえるような .NET をオープンソースにしたのは、正直、かなり驚きました。

以前は、Linux を目の仇にしてて、よくWindows Server と比較する発表とかも出てたと記憶しています。

そんな Microsoft が、Linux の代表ともえる Red Hat のイベントで、Linux 版の Microsoft SQL Serever をデモしたというニュースをネットで見ました。なんでも、コマンドラインから、yum でインストールして service コマンドで実行したり、クライアントの Mac Book で Chrome で動作をアピールしたとか。

そして極め付きは、サービス名が mssql-server で、最近オープンソース界とあつれきのあるオラクルの mysql-server にそっくりなのだとか。

Red Hat Summit 2016にMicrosoftが登壇、SQL Serverをデモ
http://cloud.watch.impress.co.jp/docs/event/1009213.html

時代が変わったということでしょうね。
Microsoft が Windows Server と Linux の比較をやっていたころ、オープンソースの多くは Sun Microsystem のSolaris 上で開発されていました。私は、Red Hat よりも Sun Microsystem の貢献度が大きいと思っています。その Sun Microsystem を買収したのが、オープンソースに否定的な Oracle とは。プレイヤーが入れ替わったことを実感する年になったような気がします。

なお、今オープンソースを支えている最大の企業は、AWSを展開するアマゾンらしいし。アマゾンって、昔はネットにできた本屋さんだったのに、今は世界的なIT企業。

Excelの課題

Excelの課題です。

Excelの課題について相談されたのですが、すぐにどうすればいいか思いつきませんでした。ちょっと考えれば、なんとかなったのですが、あと10分で仕事が終わり、という時間だったでの、逃げ腰だったのがまずかったかも。

問題はこういうのです。

Excel で作られた3人の名前のリストのチェックをやりたい。
1つのグループが1行になっており、全く同じ組み合わせのみ除きたい。


1 A B C
2 B C D
3 C D E
4 C A B
5 B C D
6 D E F

上の例の、No.1 と、No.4 が同じ組み合わせ、また、No.2 と No.5 が同じです。リストは約1000行くらいになるそうで、自動で簡単にチェックできないか、というものでした。

質問された時は、「何かいい関数ない?」というものだったのですが思いつきませんでした。

じゃ、どうすれば確認できるか。
もちろん、VBAマクロ(というか普通にプログラム)すれば、なんとかなりそうです。それを、Excel のシートだけで、プログラムの経験の無い人でも使えるようなシートを、という要求でした。(まあ、無理ですね)

私が思うに、Excel だろうがプログラムだろうが、基本はいっしょです。どうすれば、全ての組み合わせを確認できるか、につきると思いました。最初に思ったのは、全員の氏名に重み付けしてそれを計算させる、というものでした。しかし、抜けがあった際、確認が難しくなります。そこで、ずべてのパーターンのマッチングをやらせる案を使いました。

Excel の =vlookup() は、非常に便利な機能で、私は前の会社でいろいろと使いました。
これを使うと、プログラムで組まないと難しいような処理を、Excel のシートの組み合わせでも十分実現することができます。

具体的には、3人の氏名から検索リストを作り、全ての組み合わせをキーとして =vlookup()で検索する方法ならやれそうと思いました。ただし、この方法では、自分と同じ組み合わせは見つけられません。そこだけ、別に調べる必要があります。これは、検索リストをソートして、上下で同じものがある行に印をつけることにしました。

という方針を決めてExcel のシートに関数を書いていきます。

(1) 検索リスト
 =concatenate() で、”A” “B” “C” から、”ABC” という文字列を作ります。
(2) 組み合わせのキー
同じく =concatenate() で、3文字から順番を変えた全ての組み合わせを作ります。
元が”ABC”なら、”ACB”, “BAC”, “BCA”, “CAB”, CBA” ですね。
(3) 検索リストの同一判定
元の表は、検索リストをキーにして並び替えします。そして、その前後を比較する =if() を書いておきます。もし、前後に同じものがあれば、1に、なければ0になるようにしました。
こんな感じです。 =if(F10=F9,1,if(F10=F11,1,0))
(4) 順番を変えたキーを使って、検索リストを =vlookup() で一致しているものがないか探します。
(5) 最後に、全体の判定を行う関数を作ります。
同一判定で1だったら1、キーの検索でエラーでないものだ1つでもあったら1に、それ以外は0になるようにします。これは、=if() と、=iserror() や、 =and() などを組み合わせて
作ることができます。
  =if( {同一判定で1},1,if( and(iserror({キーの検索}), …. ), 0, 1 ))
(6) 最後に、オートフィルターを入れて、(5)で1になった行のみにし、行番号で元のリストの該当する行を対象と判定します。

元の行の右側に結構関数を書いたセルが並びますが、Excel のシートのみで抽出できます。

できたとはいえ、Excel でめったに関数を書かない人にとっては、「これって何語? 日本語で説明してよ!」ということになるかもしれませんね。

前の会社では、女性事務員にこういう関数入りのシートを渡したら、「私、関数知らないので、こういうExcelシートは受け取れません」と言われました。
コピペして数字と文字だけにして渡し直しましたが、こう言われるとかなりガクッときます。

LANケーブルの修理

昨日、ネットワークが繋がらないとの連絡があったそうで、その連絡を受けた職員といっしょに現地へ。

大学内の本館から離れた建物の事務所なのですが、机の下にHubとケーブルがとぐろを巻いている。見た感じ、Hubの挙動があやしい。つめの壊れたLANケーブルもあったので、まずケーブルの不良を疑う。

ケーブルを交換し、Hubのポートを変えたらアクセスランプの挙動が変った。この組み合わせならパソコンから接続できる。Hubとケーブルの両方が疑わしい。とりあえず、予備のケーブルがあるので、疑わしいケーブルは回収する。

事務所に戻ってケーブルをテスターにかけたところ問題なし。Hubの故障と判明。予備のHubがあったので、これを障害が発生するHubと翌日交換して無事復旧です。

ついでにつめの壊れたLANケーブルも回収してきました。この職場にもちゃんとLANケーブル作成キットがあったので、さっそく修理します。

LANケーブルの修理(というか端子の交換)は、かなり久しぶり。一時期は毎月1本くらいづつ直していた時期もあるが、ここ10年はやっていない。しかも、老眼で細かい点が見えにくい。そういえば、スマホに拡大鏡があったな、と使ってみる。なかなかいい感じで見える。この作業は、若い人向けだな、と思いつつより線をほぐしてコネクタに押し込み、かしめ器具でカチ。テスターで修理できていることを確認して完成。

夏の暑い時期に寒いくらいに冷房の効いたサーバールームでの久々の作業でした。

INA86_netwarkkk_TP_V

Genymotionをインストール

スマートフォンでの見え方をチェックするため、派遣先で使っているパソコンに、スマートフォンのエミュレータを入れました。

以前、BlueStacks を試しに自宅のパソコンに入れたことがあったので、ネットで調べたところ、どうも評判が悪くなっています。無理やりソフトをインストールしようとするらしい。以前使った時は、幾つかの機種を選べたと思うのですが、それも選べなくなっていました。

そこで急遽、方針を変えてネットで評判がいい、Genymotion を入れることにしました。派遣先で使っているPCには既に VirtualBox をインストール済みで、ゲストOSに CentOS が入っています。このインストールは省ける訳です。

Genymotion の公式サイトでアカウント登録を行い、無事ダウンロードできました。
インストールもうまくいって、デバイスも設定できました。
しかし、デバイスを起動しようとしたところ、次のようなメッセージが出て動きません。

Unable to start the virtual device.
VirtualBox cannnot start the virtual device.
to fing out the cause of the problems, start the virtual decive from VirtualBox.
For more infomation, check the log files. Please refer to: www.genymotion.com/faq/logs

ここに書かれたFQAのログを見ると、ログの取り方が書いているだけでした。
詳細はログを見ろということらしいです。
そこで、このWebページを参考に探したところ、下記のパスのファイルが参考になりました。

C:\ユーザー\{ユーザー名}\AppData\Local\Genymobile\genymotion.log 

このファイルに、こんなメッセージがありました。

 [Genymotion Player] [Warning] [getSavedHostOnlyInterface] Checking "VirtualBox Host-

Only Ethernet Adapter #2" interface status (  QHostAddress( "192.168.203.2" )  )

もしかして、ネットワーク関係のエラーと思い、ViurtalBox の設定を見ると、確かに、ネットワークの設定が、 「Ethernet Adapter #2」 になっています。この設定は無いので、他のゲストOSと同じ「Ethernet Adapter」に変更して、起動したところ正常に立ち上がりました。

どうもゲストOS起動時に、公式サイトにアクセスしているようです。

そして、このネットワークのエラーですが、皆さん困ってるようで google では、この手の記事がたくさんありました。他のゲストOSは、NATで普通に外へアクセスできているので問題ありませんが、最初から設定して動作しないのはやっぱりインストーラの問題のような気もします。
(何回かやっているうちにうまくいく人もいるようで、よくはわかりません)

さっそく、目的のページを表示してみます。へえ、こんなふうに見えているんだ。
(自分のスマホでは、これまでに1度も見たことがありませんでした。)

ついつい、Windows 7 側の IE の URL をコピーして、genymotion で動いているデバイスのブラウザに貼り付けようとしてしまいます。もちろん、貼り付けできません。ゲストOSの CentOS と Windows 7 の間では、クリップボードを有効しており、CentOS側のアプリケーション次第では使えるのですが、これはダメみたいです。

見難いページがあれば、ブログを管理している方に言ってみたいと思います。

派遣先のブログサーバーのエラーログ

派遣先で使っているブログサーバーで、6月からエラーの原因を特定してはできるだけ修正してきたのですが、やっと効果がでてきました。

httpd のログデータの容量を確認したところ、アクセスログはそれほど変化が無いのに対し、エラーログは大きく減っています。
アクセスログもステータスが 403 や 404 になってた検索エンジンなどからのアクセスを制限したせいで、若干ですが減っているように思います。

$ ls -al
-rw-r--r-- 1 root root  17234350 Jul 11 12:59 access_log
-rw-r--r-- 1 root root  99732053 Jul 10 04:53 access_log.1
-rw-r--r-- 1 root root 116623840 Jul  3 04:53 access_log.2
-rw-r--r-- 1 root root 159421706 Jun 26 04:53 access_log.3
-rw-r--r-- 1 root root 122591359 Jun 19 04:53 access_log.4
-rw-r--r-- 1 root root     28913 Jul 11 12:59 error_log
-rw-r--r-- 1 root root    281532 Jul 10 04:01 error_log.1
-rw-r--r-- 1 root root   6278998 Jul  3 04:41 error_log.2
-rw-r--r-- 1 root root   7055106 Jun 26 04:16 error_log.3
-rw-r--r-- 1 root root  11833899 Jun 19 04:51 error_log.4
$

やっぱり、対策して効果が出ているのを確認できると、やってよかったと思います。このサーバーは、ずっと容量が厳しい状況で、ログもこれだけしか取れてないのですが、少しは容量削減にも貢献できたかもしれません。

この他にも、アクセスしている端末がどれくらいかも調べたのですが、最近の傾向なんでしょうね、スマホからのアクセスがかなり多いようです。それも、日中はパソコンからのアクセスが多いのに対し、夕方6時を境にスマホからのアクセスが多くなります。

また、お昼休み(12時台)に急にアクセス数が増え、夜7時台は急にアクセス数が減るのも解りました。この大学は女子学生の比率が多いそうです。お昼は大学の食堂で食べるの短時間で済むのに対し、夕飯を自分で作っていたり、バスタイムを長めに取っているからでしょうね。

とはいえ、1日あたりのアクセス数では、まだパソコンからのアクセス数が多いもののスマホからのアクセスが全体の1/3を占めています。女性に人気の一般のサイトは、もっと多いんでしょう。

スマホに対応したテーマになっているのか、というのも気になるところです。そのうち簡単に確認できるような何かを作ってみたいな、とも思っているところです。

東北芸術工科大学の学食(定食)

SAS で使うプログラムが難しい

SASUniversityEdition

SAS University Edition で使うプログラム、今調べているところです。

1. 概要

1960年代から使われている SAS は、当時流行った第4世代言語に属するコンピュータ言語で、同じ時期に生まれた SQL などと同じように記述しやすいのが特徴だそうです。もともとはIBMの大型汎用コンピュータで使われるソフトで、当時のカードリーダでも扱えるような言語仕様になっています。

今でも IBMの大型コンピュータで動作する他、1980年代から90年代にかけて流行った UNIX や、その後のLinux でも動作するし、最近は Windows 版も出ているようです。元々はテキストベースの仕組みですが、ハード側のグラフィック環境がよくなったこともあって、今ではグラフ作成機能が基本セットもについています。

2. 言語仕様

プログラム言語の仕様ですが、これがなかなかとっつきにくい。

まず、大きく分けると、data と proc の2つの部分からできています。
data で、処理に使うデータセットを作成し、proc で計算させたりグラフを書かせたりします。

(1) data でデータを取り込む

まず data ですが、card 形式でデータを1行ずつ読み込ませることもできます。ですが、データ量が多い場合は、Excel などから CSV形式して infile で読み込ませます。

どちらからというと、測定器などのデータを生成する装置から、何かのメディアを解して直接データを取り込み、このシステムで集計した結果を使う、という使い方がいいような気がします。infile は、どういったフォーマットでも適応可能なように工夫されているように思います。

ちょうど、テキストファイルを Excel に取り込むような感じのことを、プログラムします。1列分を文字数で区切ったり、「,」(コンマ)や、「 」(スペース)で区切ったりする訳です。

例えば、Excel から出力した CSV ファイルを取り込む場合は、次のように書きます。

filename = indata '{パス}/sample.csv' ;
data in;
 infile indata dlm=',' firstobs=1 dsd encoding="sjis" termstr=CRLF;
 input text_s : $CHAR50.
       size_s : 10. 
       date_s : anydtdte16.;
run;

これは、Excel で作成した3列のデータをCSVファイルに書き出して、SASで取り込むプログラムの例です。infile で取り込む際、次のオプションを使っています。

dlm=','  デリミタを「,」(コンマ)とする。(CSVファイルはコンマ区切りファイル)
firstobs=1  最初の1行を取り込み対象から除外する
dsd   「,」で区切られた単語が「"」で括られていたら、その中の「,」を単語の一部とみなす
encoding="sjis" 日本語の文字コードをシフトJISにする
termstr=CRLF  改行コードを「CR+LF」(Windows 標準)にする

次の input で、1列分のデータを定義している。CSVファイルで取り込んでも、文字列か
数値か、日付かを定義するのは Excel でテキストファイルを取り込むのと同じ感じです。

text_s : $CHAR50. 1列目を「text_s」という名称とし、文字列で最大50字取り込む
size_s : 10. 2列目を「size_s」という名称とし、最大10桁の数値として取り込む
date_s : anydtde16.  3列目を「date_s」という名称とし、16文字分の記述から SAS内部の時間デ

ータに変換する

run ; ファイル取り込みを実行する

(2) データを加工する

また、この data では、読み込んだ数値を組み合わせて新しいデータを計算させることもできます。算術演算や条件によって値を変えるなどのプログラムを、個々の数値ではなく1列分といったまとまったデータに対して行えます。

文字列を取り込んで、そこに含まれるキーワードに応じて、新しいデータを作成するこが可能で、かんたんな構造化プログラムを記述することができます。

下の例は、ファイルから取り込んだ1列分の文字列「url」に’feed’ が含まれておらず、かつ、1列分の文字列「message」に’Feed’が含まれていない場合、新しいデータの列 feed に 0 を、どちらかが含まれている場合は feed に 1 を代入する。

 fed1 = index( url, 'feed' ) ;
 fed2 = index( message, 'Feed' ) ;
 if ( fed1 = 0 ) & ( fed2 = 0 ) then feed = 0 ;
 else feed = 1 ;

(3) その他の加工

複数のデータをファイルから取り込んで、1つの表を作成したりすることできます。

他にもいろいろとやれるようですが、今のところ勉強中です。
目的に応じてプログラムを組んでいろいろと加工することができるので、ノウハウが書かれているようなものですね。

(4) 表にする

ここはまだ勉強中です。

個々の支払い情報や売り上げ情報などをピボットで集計して、月ごとの推移を計算させるというのは前職でよくやっていたので得意なのですが、Excelと同じことは結局できませんでした。

ネットで調べると多くのサンプルを使った散布図から、統計学の計算式を使ってこの分布の傾向を求めることができるようです。しかし、そういったことを前職で日常的にやってこなかったことから、このシステムの良さがイメージできませんでした。

きっと他にもうまい使い方があるのだと思います。

なお、簡単な集計表はこれだけで作成することができます。

proc means sum ;

  var bot win mac iphone android ;


run ;


この例は、集計表を作成する means プロシージャーを使った例です。
means は、var で指定する対象のデータの集計を行うます。この例は、var で指定したbot win mac iphone android の4つのデータの、sum (合計値)の表を作成する処理です。

表は、SAS University Edition の結果画面に表示されます。画像で切りとって MS Wordや、PowerPoint などのドキュメント作成にも使えそうです。

(5) グラフにする

ここはまだ勉強中です。

SAS の有償版には、グラフ作成用のパッケージが含まれており、いろいろなグラフを簡単に作成できるようです。1つの雛形を用意しておえけば、細かい設定まで使いまわしできるので、Excel でグラフ作るよりは簡単に使えるようです。

無償版の SAS University Edition には基本セットしか入っていないものの、簡単なグラフを作成することは可能です。

例えば、簡単な散布図を作るプログラムはこれだけです。

proc sgplot data = readin;
scatter x = x y = y;
run;

この例は、基本セットに含まれる sgplot を使って、散布図を scatter コマンドで作成しています。予め、 data で、「readin」というデータセットを作成しておきます。scatter では、x= と y= の変数を指定しなければなりません。

また、簡単に折れ線グラフを表示するには、こんなプログラムになります。

proc sgplot data=readin ;
  series x = x y = y ;
run ;

これは、基本セットに含まれる sgplot を使って、折れ線グラフを series コマンドで作成しています。予め、 data で、「readin」というデータセットを作成しておきます。

同じく棒グラフの例です。

proc sgplot data=readin ;
  vbox x / response = y ;
run ;

これは、基本セットに含まれる sgplot を使って、折れ線グラフを series コマンドで作成しています。予め、 data で、「readin」というデータセットを作成しておきます。

グラフは、SAS University Edition の結果画面に表示されます。画像で切りとって MS Wordや、PowerPoint などのドキュメント作成にも使えそうです。ただし、その場合は、グラフのタイトルや、X軸Y軸の説明などオプションを使って見栄えをよくする必要があります。
このオプションは、ネットで scatter、series、vbox のドキュメントを調べれます。

3.個人的な感想

いきなりここに感想を書くのは変ですが、まだ、調べている最中なので実績がありません。
なので、途中思ったことを書きます。

個人的には、Excel でできるようなことは Excel でやればいいのでは、と思うのですが、Excel は以外と同じことの繰り返しは苦手。もちろんマクロを組んで処理を自動化し、うまく雛形を使えば、SAS University Edition でやれるようなことはできると思います。マクロの組み方とは、Excel の高度な使い方を覚える必要なりますが…

ただし、過去に SAS の資産があれば別で、前に使ったコードを積極的に使っていくのなら絶対にこの SAS University Edition を使ってこのコードを使いこなせるレベルになるべきでしょう。

追加)一点残念なことが。
Webブラウザで使えるテキストエディタで、ブラウザ上でプログラムを編集できるのですが、きっと、JavaScript のキットなのでしょう。IE 11 ではエディタの表示が崩れます。Chrome や、FireFox では問題ありません。こういうの多いですね。Windows Edge では試してません。

今日はここまで。

統計処理ソフトウェアに挑戦中

今週の火曜日から、SAS University Edition の設定などを行っています。
これは、統計処理のソフトでは老舗で、利用者も多い SAS の無償版だそうです。

SAS は、サーバークライアント形式のアプリで、ベースになるプログラムを、Linux サーバーなどにインストールし、Windows などのクライアントPCからWebブラウザなどを使って利用する仕組みです。

この無償版は、VMware Player や Virtual Box 用の仮想化OS上にサーバーのサブセットを組み込んだもので、基本的はそのPCだけで利用するようにです。さらに、基本セットのみで、主にSASを導入済みの施設での学習などを目的としているため、無料のようです。

そして、VirualBox の設定は簡単で、ゲストOSを利用者に見せないように工夫されています。たぶん、Windows 用のフリーソフトをイントールする感じで、誰でも設定することができると思います。しかし、SAS Studio という、SAS を利用する仕組みは有償版と全く同じだそうで、本格的なことにも利用できるようです。とはいえ、仮想OS上に実現したシステムなので、動作はやはり遅くなります。

また、SAS は、専用のプログラム言語で、外部で作成したデータを使って統計の技術を利用して集計を行います。そして、このプログラム言語の習得が利用者の課題になっているみたいです。この SAS University Edition は、学習したい人にはきっと便利なソフトなのでしょう。

さて「これを使おう」とした場合ですが、初めての人には敷居が高いような気がします。今、勤めている大学で、誰が使うのかは解りませんが、大変なんじゃないでしょうか。私は、面倒だったら Linux のスクリプトで加工して、Excel でさらに細かい調整をやってから Excel で計算させる、というのやってきたので、Excel の方が簡単な気がします。

最新版の Excel は結構大きなデータも扱えるし。
今回、 SAS University Edition 用のデータを Excel で作ろうとしたのでは、40万行のテキストを、Excel でも普通に読めてました。(Office 2016 の Excel です)

この Excel でやったことを SAS University Edition でやろうとしたのですが、途中で挫折してます。データは取り込めて、その際に表示するためのデータも作れたのですが、Excel でやってことと同じようにやろうとしても無理みたいで。(Excel のピボットは、やっぱり便利だ)

SAS は、もう少し修行してみますが、人に教えられるレベルになれるか、ちょっと自信がないと感じてます。

ブログ投稿確認画面の仕様はこんなの

WordPress のデータベースとアップロードされたファイルとで、動的にHTMLを作る仕組みです。
ということは、HTMLの元になるデータが、データベースとファイルにある、ということ。

WordPress が使用する各テーブルの内容に関しては、ネットにいくらでも情報があるので、そっちを参照してもらうといいでしょう。

6月末までに私が作成したブログ投稿を確認するための仕組みはこんな感じで動作してます。

(1) まず、webroot のディレクトリ
このブログサーバーに落ち着くまで、過去にいろいろな経緯があったと思います。
そして、担当者も何人も変わったと聞いています。
そのせいか、webroot になっているディレクトリには、今も使われている WroedPress を設定した
ディレクトリを含めて、かなり多くのディレクトリがあります。
大学なんで、誰でも簡単に情報発信できるのがいいところ、と言えば聞こえはいいのですが…
ディレクトリだけで3桁に迫る数がありました。

ということで、まずは webroot にあるディレクトリのリストを作ることから始めます。
もちろん、webroot にはいろいろなファイルが置いてあるので、ファイルタイプを調べて、それらをチェックしていきます。

具体的には、dir() の結果を read() で順番に読んで、2次元の配列を格納していきます。2次元にしたのは、ファイル名とディレクトリかどうかのチェックを同じ添え字番号でアクセスできるようにするため。PHPはこういうのを簡単に作れるのいいですよね。

実際に使っているのはこんなコードです。
if( is_dir( $this->prefix_dir ) ) {
  if( $dh = opendir($this->prefix_dir)) {
    while(( $file = readdir($dh)) !== false ) {
      $this->dir_list[$this->dir_count]['name'] = $file;
      $this->dir_list[$this->dir_count]['type'] = filetype($this->prefix_dir . $file);
      $this->dir_count += 1;
    }
  }
}

(2) 次に WordPress 用のデフィレクトリか確認を
webroot にあるディレクトリのリストができたら、その中に、wp-config.php があるか確認していきます。
(1) で作った配列にをループで回して、ファイルチェックを行い、見つかったら内容を読んでこのファイルに書かれたデータベース名を配列に格納していきます。これで、このサーバーで公開している WordPress のリストができあがりです。

if(strcmp($this->dir_list[$i]['type'], "dir") == 0 ) {
  $config_file = $this->prefix_dir . $this->dir_list[$i]['name'] . "/wp-config.php";
    if( is_file($config_file)) {
      $this->dir_list[$i]['wp_chk'] = 1;
      $cf_lines = file($config_file);
      foreach( $cf_lines as $line ) {
        if($startpos = strpos( $line, "DB_NAME") !== false ) {
          $endpos = strpos($line, ");");
          $length = $endpos - 20;
          $this->dir_list[$i]['dbname'] = substr($line, 19, $length);
          break;
        }
      }
    }
  }
}

実は作りかけのブログ記事がありました。wp-config.php はあるのですが、そこに記載されたデータベースは MySQL にありませんでした。過去の担当者が何かやったのでしょうが、こういうのは無視するしかありません。

(3) ブログサイトの情報をデータベースから
WordPress の場合、ブログサイトの名称やURLなどは、MySQL のデータベースに記録されています。
これらを参照して、WordPress の基本情報を完成させます。基本情報は、最初に作ったディレクトリの
配列に記録していきます。
PHPでは、こういう中途半端な配列を気にせずに使えるのがいいですね。

例 WordPressのディレクトリの場合
  $datas[0]['directory'] = "xxxxx";
  $datas[0]['dir_flg']   = 1;   // dir_flg が1ならディレクトリ、0ならファイル
  $datas[0]['wp_flg']    = 1;  // wp_flg が1なら WordPress用、0なら別のディレクトリ 
  $datas[0]['database']  = "xxxxx";

例 WordPressではないディレクトリの場合
  $datas[1]['directory'] = "yyyyy";
  $datas[1]['dir_flg']   = 1;
  $datas[1]['wp_flg']    = 0;  // WordPressのディレクトリではない。
                  $datas[1]['database'] が無くても問題なし

例 webroot にあるファイル
  $datas[2]['directory'] = "robots.txt";
  $datas[2]['dir_flg']   = 0;  // テキストファイルなので対象外
                  $datas[2]['wp_flg']などが無くても問題なし

WordPress が扱うデータベース内は、wp-config.php で指定した接頭子を使ったテーブルの名称が使われます。偶然、新規登録する際にこの接頭子を共通にすること、というルールがあったので、全て同じテーブル名で参照できました。とはいえ、ルールがはっきりしているので、合成するのも簡単です。

ブログ名称などは、(接頭子)_option というテーブルに入っています。このテーブルは、

例 接頭子が「wp_」だった場合は、テーブル名は「wp_option」

になります。

内容はこんな感じで、option_name に入っているキーワードを使って、option_value の値を取り出す
ようなSQLを組みます。

option_id   (ユニークなIDが振られています)
option_name  (システム内で使用する blogname などのキーワードが格納されてます)
option_value  (キーワードに対応する具体的な URL などの文字が格納されてます)

例えば、ブログの名称は、こんなSQLで取り出せます。

select option_value from wp_option where option_name = 'blogname';

(4) 投稿した記事は、(接頭子)_postにある
ブログの情報が解ったので、次にそれぞれのブログに投稿された記事を調べます。記事専用の別の配列を用意して、まず、ディレクトリ用の配列から必要な情報をコピーします。このコピーする情報は、扱う数が多ければ配列の番号だけを格納して後から参照するべきですが、今回作る仕組みは扱う数が少ないので、全てコピーすることにしました。また、同じテーブルには、記事に貼り付けるためにアップロードした画像の情報も入っています。これも別の配列に格納します。

全データを取り出す必要はなく、今回作成したページでは1週間分に限定しています。

(接頭子)_postのテーブルに格納される記事は、下書きした分や、保存したものが全て格納されているので、以外とたくさんあります。このうち、「post_date」列に投稿した日時が格納されているので、1週間分を取り出す際は、ここをSQL分の where で指定します。

また、下書きや保存のみ、画像などと公開された記事の区別は、「post_status」の列で判定しました。
なお、画像データは、添付された記事のIDが格納された「post_parent」列を参照し、さらに「post_type」で添付データと判定してます。

使っているSQLはこんなので、特別なことはやってません。

1週間分の記事を抽出するSQL
select id,post_title,post_date from wp_posts 
  where ( post_date between '2016-6-20' and '2016-8-27' and ( post_status='publish' );

指定する記事に添付された画像などを抽出するSQL
select id, post_name, guid from wp_posts 
  where ( post_parent = '100' ) and ( post_type = 'attachment' );

SQLでデータベースから取り出したデータを各配列に格納したら準備OKです。

(5) 表示するデータを作成する
(4)までの処理で配列に格納したデータを使い、表示するデータを作成します。表示は、1日分なので、各記事のDBから「post_date」をコピーした日付データを確認し、その日に投稿された記事を表示用の配列にコピーしていきます。画像では、その日に投稿された記事のIDを使い、その記事に貼り付けてある画像を parent_id を調べて該当するデータを、別に用意した画像表示用の配列にコピーします。

表示用のデータを作ったら、それをHTMLの表形式で表示します。画像に関しては、ファイルをサイズを
予め調べておき、それを表示する記事毎、日毎に集計してHTMLに書き出します。また、ここの画像は縮小版のファイル名を調べてそれを表示し、元の画像は jQuery を使った Lightbox で、ここの画像のファイルサイズといっしょに表示するようにしてます。なお、Lightbox では、記事毎にグループを作ってスライドショーで確認できるようにしてみました。

Lightboxが表示する画像のURLは次のとおり。
<a href="http://(ブログ記事のURL)/wp-content/uploads/(元の画像データ)"
data-lightbox="image[200]" title="File size (ファイルサイズ数)byte ">
<img src="http://(ブログ記事のURL)/wp-content/uploads/(縮小してアップされた画像データ)">
</a>

ディレクトリを調べてブログかどうか判定し、ブログだったらデータベースを参照する、という仕組みはそれなりに作るのに手間がかかりました。また、データベースに格納されたURLからファイルのパスを作ってファイルサイズを調べるといった処理も正直手間取りました。表示については、どの日の投稿で大きなファイルをアップしたか、が解ればいいので、かなり手を抜いてます。そっちを凝ればさらに時間がかかるのでしょう。最後に、Lightbox の設定は一番簡単でしたが、見栄えはばつぐんです。やっぱりきれいに見えるページはできがよく見えますね。

以上

ブログの管理ツール組み込みました

6月は派遣先で使われているブログサーバーでトラブルがあったので、いろいろと仕掛けを準備しました。

まずは、リソース管理ツールの登録。
実は、派遣先の公式サイトとブログサイトなどは、ホスティングサービスを利用しています。
公式サイトは、デザインなども含めて管理を外部に委託しており、サーバーのメンテも不要らしいのですが、ブログサーバーは WordPress を利用しており自分たちで管理しています。
しかし、よくある手抜き管理状態で、私が4月に引き継いだ時点では、誰かがログインしないとどうなっているのか解らない状態でした。
そんな中、トラブルが発生し、サーバーがアクセス不能になり、なんとかしてくれ、ということに。

ということで、なんとかすることに。

まず、ファイル容量がほぼ一杯で、いつ Disk full で動かなくなってもおかしくない。
WordPress で担当者がそれぞれブログを投稿しているのですが、プラグインを更新したとたん動かなくなったりする。
しかも、アップするファイルサイズの制限が緩いので、誰でも大きな画像が簡単にアップできてしまう。

いろいろ問題はありますが、日ごろの管理が必要と判断。
ということで、次の2つを設定することにしました。

(1) オープンソースのサーバー管理システムを導入する。
(2) WordPressで投稿された記事の状況がすぐ解るように簡単なツールを準備する。

(1)は、MRTG なら使ったことがあったので、似たようなものを探したところ、今はいろいろあるんですね。
負荷が少なくて簡単に設定できる「munin」を選択し、設定しました。

(2)は、自分で作ることに。
WordPress は、個人的に使っているので過去に調べたこともありあした。今回、より詳しく調べて、データベースに格納された情報をうまく使って、投稿された記事の情報を簡易的に見れるページを作りました。
さらに、WordPrss に格納された、投稿されて記事に使われている画像の情報を利用して、画像ファイルのファイルサイズを調べて表示するように作ってみました。

当初イメージした仕様と、後からこういう機能もあればいいな、を組み合わせて予定通りのものができました。
後は、この2つのツールを使って、事前に問題になりそうな点をチェックできたらいいな、と思ってます。

派遣先のしかも公開中のサーバーに設置したページなので、ここにリンクは貼れません。
しかも、それなりに苦労はしましたが、技術的にすごいことはなってないので…

ただ、これくらのをパッと作れるエンジニアになれれば、自信がつくんでしょうね。

N811_notepcwosawarubiz_TP_V