localhost

読み込んだ画像を元に、テキストをレンダリングして新しい画像ファイルを生成します。

 

読込画像
http://zokei.koekatamarin.com/wp-content/uploads/2016/06/splabg.png

フォント
https://drive.google.com/file/d/0B4EpEP9nVtnvWjRpYTIxVlNvcWc/view
http://zokei.koekatamarin.com/wp-content/uploads/2017/07/ikamodoki1.zip

以下のimg.phpとおなじ階層に .pngファイル と .ttfファイル を設置

 

さらに上記スクリプトを改良して、合成するテキストを、クエリストリングからパラメーターとして受け取ることが出来るようにします。

img.php?name=なまえ&text=ぶんしょう

のようなURLにアクセスします。

 

この img.php によって生成された画像データは、PNG形式の画像ですので、画像ファイルのように扱うことが出来ます。

 

index.html

スクレイピングとは?

APIを使ったデータ取得の場合
・JSONなどのプログラムで扱いやすいデータが返ってくる
・サービス提供者が、APIを公開してくれている必要がある

スクレイピングする場合
・WebページからHTMLデータをそのまま取ってくる
・APIが公開されていなくても、サイトさえあれば無理矢理データを取ってこれる
・ただしユーザー認証が必要なサイトは工夫が必要

 

単純なページ取得

file_get_contents関数でファイルやURLのデータを取得

 

スクレイピングライブラリ

ライブラリとは、言語標準の関数では実現できない機能を、様々な人が様々なプロジェクト・プログラムで利用しやすいように、ひとかたまりにして配布されているプログラムコードのことです。

スクレイピングするためのライブラリ
・PHP Simple HTML DOM Parser
・Goutte
・phpQuery
いくつかありますが、古くからあって更新もされている「PHP Simple HTML DOM Parser」を選択するのがベストプラクティスだと思います。

PHP Simple HTML DOM Parser
ダウンロード
概要
解説ページ(日本語)

 

PHP Simple HTML DOM Parser の利用

スクリーンショット 2016-06-16 14.14.15

上記は商用サイトのHTMLソースコードであるが、「PHP Simple HTML DOM Parser」によって、HTMLタグをjQuery的に抽出していくことができる。

 

file_get_contents() ではなく、このライブラリ独自の関数 file_get_html() を使用する

コードの実行結果↓

スクリーンショット 2016-06-16 16.29.01

 

find()というのも、PHP標準の関数ではなく、Simple HTML DOM Parser独自のオブジェクトメソッド。

変数$htmlは、オブジェクト。
(Simple HTML DOM Parserクラスのオブジェクトインスタンス)
オブジェクトは、その内部にメソッドを持つ(定義されている)。
なので、オブジェクトのメソッドを使用する際は、
「オブジェクト->メソッド()」と表記する。

PHPは、中途半端なオブジェクト指向プログラミング言語なので、主語=オブジェクトのあるコード・ないコードが混在します。

 

実用的に絞り込む

ニュース欄のニュースを複数取得する

 

スクリーンショット 2016-06-16 16.03.42

 

アイデア

・Amazonのランキングを保存しつづけて、推移がわかるようにする
・いろいろなサイトのニュースを取得して、スポーツ新聞のようなレイアウトのCSSで表示し直す
・Steamのサイトからセール情報をチェックし続けて、新しいセールが始まったらメールを送信する
などなど…

 

注意点

スクレイピング処理は、言うまでもなく、相手方のサーバーからデータを取得します。
アクセス頻度によっては、相手方のサーバーに負荷をかける事になります。

このため、上記のような単純な作りだと、ユーザーがこのページにアクセスするたびに、自分のサーバーから相手方のサーバーにアクセスしてしまうことになります。
1分間に100人がこのサイトを使用したら、自分のサーバーから相手方のサーバーに1分あたり100アクセスしたことになって、明らかに不審なアクセス数です。
もしこのようなことで相手方のサーバーを停止させるようなことがあれば、不正アクセスの罪に問われかねません(不正な攻撃プログラムを開発・公開・利用幇助した)。

 

実際に2010年、脆弱なシステム環境で運用されていた図書館のサイト(サーバー)から、書籍データを取得するプログラムを作った人が逮捕されるという事件が起こりました。
岡崎市立中央図書館事件 – Wikipedia
※この事件は捜査関係者にIT知識が乏しかったせいで起きた不当な逮捕・勾留であると一般に考えられています。

 

このような意図せざる迷惑行為や無用の誤解を避けるためには、キャッシュの仕組みを利用します。
スクレイピング処理を公開サイトのコードに書くのではなく、1時間に1回管理者のみによって動作させる専用のコードを用意しておき、自分のサーバー上にキャッシュデータを生成しておきます。
サイトにアクセスするユーザーには、そのキャッシュデータを表示するようにします。

フォーム

HTMLコーディングの学習の中で、formタグというのを覚えてきたと思いますが、実際にフォームを動かすには、サーバーサイドプログラミングが必要です。

実装

htdocsのなかに、「anq」というフォルダを作ります。

index.html

 

anq.php

 

次のステップ

このサンプルでは、Webサイトとして公開するにはいくつか問題があります。

・確認ページがない
・入力内容のエラーチェックがない(文字数、全角半角、英数字など)
・何度でもアンケートに回答できてしまう
・結果ページをリロードすると、何度もデータが記録されてしまう
・悪意のあるフォーム入力に対応できていない(サニタイズの必要)

 

また、さらに高度なプログラムにしていくには、

・結果を集計するページを作る
・集計ページは管理者(特別なユーザー)のみが見られるようにする
・メールを飛ばす
・アンケートの設問をデータベースで管理すれば、様々なアンケートを沢山簡単に設置することができる

といった改善余地があるでしょう。

RDB

データベースとして現在でも主流なのはRDB(リレーショナルデータベース)です。
(2007年以降は、NoSQLも台頭)

RDBとして最高の性能を誇るのはOracle社の「Oracle」で、ひとつの業界標準と成っています。
ただしライセンスが高額なのが難点で、それなりの予算規模の業務システムなどで使われることが多いです。

オープンソースのRDBとしては、「MySQL」が無償なのでよく利用されます。
「PostgreSQL」のほうが性能は高いとされますが、ライセンス利用料が発生します。

MySQL

MySQLは、XAMPPによってすでにインストールされています。
データベース(RDB)はエクセルの表のようなものと言いましたが、実際にはエクセルのような「画面」を持ちません。
(プログラムやコマンドラインから利用するものなため)

見て分かりやすい管理ツールとして、PHP製のオープンソースツール「phpMyAdmin」というものがあります。
これもXAMPPによって一緒にインストールされているはずです。

phpMyAdmin
https://www.phpmyadmin.net/

データベース・テーブル・レコード

RDMにおいてデータは以下のように保存されています。

・データベース・・・エクセルファイル全体のようなもの
・テーブル・・・エクセルのシート1枚
・レコード・・・各シートのひとつの行

まずデータベース「Anq」を作成します。
そのなかに、テーブル「Entry」を作成します(カラム数:5)。

スクリーンショット 2016-06-10 08.47.09

作成できたら「Entry」テーブルを選択して「挿入」してみましょう。

スクリーンショット 2016-06-10 08.53.03

レコードがひとつできました。

SQL文

プログラムでレコードを追加するには、プログラムから「SQL文」というのを発行します。

ここでは、phpMyAdmin上でSQL文を打ってみましょう。
[crayon]
INSERT INTO Entry (name,answer1,answer2) VALUES (“Bob”, 1, “From SQL”);
[crayon]

レコードがもうひとつ増えました。

 

SQL文は、
・SELECT文・・・レコードの取得
・INSERT文・・・レコードの追加
・UPDATE文・・・レコードの更新
・DELETE文・・・レコードの削除
の4種類が基本になってきます。

この4種類は、情報システム全般における4つの処理「CRUD」に対応します。

C・・・CREATE
R・・・READ
U・・・UPDATE
D・・・DELETE

ブログサービスも、企業の基幹業務システムも、ITシステムはいずれもデータを「取得」「追加」「更新」「削除」するという4つの機能を組み合わせて構築されます。

基本の基本

PHPは、
以下のブラケットで囲んで記述する必要があります。

また、一般的に、「.php」または「.html」の拡張子でファイルを保存しておく必要があります。

サンプル

テキストエディタで、

と入力し、「hello.php」として保存します。
保存する場所は、
XAMPPをインストールしたフォルダの中です。

(Mac) /Applications/xammp/htdocs/
(Win) C:¥Program Files¥xampp¥htdocs

このフォルダーのデータをブラウザで表示するには、ブラウザのアドレス欄に

と入力します。

「Hello World」という文字が表示されましたか?

この「localhost」というのは、Webサイトの「yahoo.co.jp」なんかとおなじです。
ただし、他のコンピューターからは見られません。
というのも、XAMPPがインストールされた時に、コンピューターの設定を書き換えてくれていて、

「localhost」は「C:¥Program Files¥xampp¥htdocs」の別名である

ということが、このコンピューターでだけ通用するようになっているからです。

※コンピューターの外部からこのページを表示するには、このコンピューターのIPアドレスを打ち込みます。

PHPコードの説明

先ほどのPHPプログラムの説明です。

print() というのは、文字を出力するためのPHPの関数です。
echo と書くことも出来ます。

変数も出力できます。
PHPの変数は、頭に「$」をつけます。

PHP最大の特徴「HTMLと混ぜて書ける」

次のコードを、「test.php」として作成します。

 

【メモ】日時を取得する関数 date()

ユーザーが入力した情報を受け取る

get.php

ブラウザで、
http://localhost/get.php?name=john
にアクセスします。

$_GET[] で、GET形式の通信データ(パラメータ)を受け取れます。
GETのパラメータは、ブラウザではクエリストリングとしてページアドレスに自動的に追記されます。

http://localhost/get.php?name=bob
にすると、表示が変わります。

パスワードなどは、アドレス欄に表示されるとマズイので、GETではなくPOSTを使います。

GETとかPOSTとかいうのは、
HTMLのformタグに書くあれのことです。

このコードを、「form.html」として保存しましょう。

このHTMLフォームは、「post」形式の通信で(method)、「post.php」に対してデータを送信します(action)。

 

では、データを送信された先の、受け取り側となる「post.php」を作りましょう。

これは、入力された内容を単純にそのまま表示し返すだけのプログラムです。

書いたプログラムをサーバー上で実行する

Java、Ruby、PHP、Perl、Pythonといったプログラム言語は、プログラムを記述(コーディング)するのにはもちろん特別な環境は必要なく、テキストエディタでよい。
しかし、実際にコーディングしたプログラムソースコードを実行するには、コンピュータ上に各言語の実行環境が必要である(インタープリタ言語)。

Ruby、PHP、Perlといった言語で書かれたプログラムは、Webシステム(サイト)で利用されることが多い。

一方、Javascriptも、Webサイトで利用されることが多い。
HTMLやCSSといったマークアップ言語ももちろんWebサイトで利用される。

このため「同じWebの話」のように混同しやすいのだが、
Ruby、PHP、Perlのプログラムは、サーバー上で実行される。
Javascript、それにHTMl、CSSは、ブラウザ上、つまり、クライアント側で実行される。

サーバーサイド

Javascript、HTMl、CSSの実行環境は、クライアント側のブラウザそのものである。
一方、Ruby、PHP、Perlなどの実行環境は、サーバー側にインストールされた各言語のモジュール(ランタイム)である。

要するに、Rubyを動かすには、サーバー側にRuby(のランタイム)をインストールしていないといけない。

「XAMPP」は、自分の開発用コンピュータをかんたんにWebサーバー化してしまえるパッケージであるが、サーバーソフトやデータベースソフトと同時に、PHPとPerlもインストールされる。
これにより、PHPとPerlそれぞれで書かれたプログラムが実行できるようになる。

サーバーサイドプログラミングの目的

元々、クライアントサイドでは大した処理はできない。
実行速度はそれぞれのコンピューターとブラウザに左右されるので、極端に低速だったりする場合も考えられる。
また、サーバーサイドではないために、サーバー上の機能やデータをそのまま利用することが出来ない。
他にも、互換性の問題を考慮すると、汎用的な処理にしか向かない。

サーバーサイドでは、サーバー上のデータベースと直接連携することができる。
また、サーバー上にさらに特殊なソフトウェアをインストールすれば、その機能も使用することが出来る。
たとえば、音声合成プログラム、3DCG生成プログラムなど。
極端なことを言えば、WindowsサーバーにPhotoshopをインストールしておけば、Photoshopの機能をすべて利用したWebサイトなんてものだって作ろうと思えば作れる(実際にはライセンスの問題があるが)。

もっと簡単なことで言えば、ユーザーが入力した情報をサーバーに保存したり、それを引き出したりすることが主な目的である(SaaS/ASP/クラウド)。

ユーザー登録であったり、買い物の決済であったり、ゲームのスコアの記録であったり、双方向のチャットであったり、サーバーは様々な場面で用いられている。
その数の分だけ、サーバーサイドプログラミングが行われているということになる。

XAMPP

https://www.apachefriends.org/jp/index.html

ウェブの実行に必要なソフトウェアをまとめてパッケージ化したもの。

X – Windows、Linux、Mac OS X、Solarisのクロスプラットフォーム
A – ApacheのA
M – MySQLまたはMariaDBのM
P – PHPのP
P – PerlのP

※元はLinuxサーバーの典型的な構成を「LAMP環境」と呼んでいた。

Webサーバー

Webサーバーソフトウェアを稼働させたコンピューターのことが「Webサーバー」と呼ばれる。(サーバー←→クライアント)

Webサーバーソフトウェア

Apache
IIS(Windows Server)
Nginx
lighttpd
など…

これらはWebサーバーとして汎用的な機能を備えたソフトウェアであるが、単純なWebサーバーソフトウェアならば誰でも容易に開発可能である。

その他の新しいサーバーの実装については、
サーバPUSHざっくりまとめを参照。

データベース

おおまかに、
・RDBMS
・NoSQL
の2つに分類される。

RDBMS(リレーショナルデータベースマネジメントシステム)

「関係モデル」という考え方に基づいてデータを取り扱うデータベース「関係データベース」を管理する仕組み・ソフトウェアのこと。
エクセルの表のようなものが複数あり、相互に関連しあっているとイメージすると理解しやすい。

Oracle
Microsoft SQL Server
MySQL(MariaDB)
PostgreSQL
など…

phpMyAdmin_img

NoSQL(KVS)

いくつかの方式があるが、キーバーリュー型(KVS)が有名。
キーに対してバリューを記録するという非常に単純な構造。
非常に大量のデータを高速に処理することができるが、データの揮発性が高く、実装も複雑になるので、特に大規模なサービス以外では積極的に用いられない。

Mongo DB
Apache Cassandra
BigTable(Google)
DynamoDB(Amazon)
Tokyo Tyrant(mixi)
など…

プログラムの実行

「サーバーサイド」とは につづきます