grepでファイル内を検索する

以前、下記のようなのような記述で特定の文字列を含むファイルを検索できることをまとめましたが、対象ファイルのファイル形式などがわからないと使えないことが懸念でした。

おとなりの後輩により簡単な書式ということでご教示いただいたのがこれです。

●オプション
i:大文字、小文字関係なし
r:再帰的に検索
n:行数表示
l:ファイル名のみ表示

例)

※検索結果は以下のように表示されます。

var_dump

説明

・変数に関する情報をダンプすること。
→ ダンプする ・・・ データなどをファイルや画面に出力すること

引数として指定した変数の内容や命令の返値を画面上に出力すること

例)変数 $a に文字列「hoge」が格納されていた場合、

$aをvar_dumpする

画面上には、次の様に変数の内容が出力されます。

この場合のstringは変数の型を示し、「(4)」は文字列のバイト数を示し、そしてダブルクォート内が内容(値)を表しています。
※文字列、4バイト、hogeを示します。

vim チートシート 実践編

モード

挿入モードへ

カーソル移動

ファイルの先頭に移動する

ファイルの末尾に移動する

行頭に移動する

行末に移動する

編集

ファイル

検索と置換

領域選択

領域選択スタート

短形選択スタート

行選択スタート

コピー

切り取り

ウィンドウ

画面を上下に分割する

画面を分割しつつ、ファイル名のファイルを開く

今いるウィンドウにファイルを開く

今いるウィンドウにて各コマンドを実行する

buffer(バッファ管理)

register(レジスタ管理)

mark(マーク)

folding(折りたたみ)

word completion(単語補完)

recording(操作記憶)

外部コマンドとの連携

*参考URL

  • vimで効率的にコードを書くための小技
  • Vim Documents in Japanese
  • 名無しのvim使い

SHORTINIT

説明

WordPressの初期化処理を短縮するかどうかを示す定数。標準ではfalse(短縮しない)となる。
※trueに設定するとWordPressの起動プロセスを短縮させる。

例(wp-include/defualt-contents.php)

上記の例でSHORTINITをtrueに設定すると、wp-config.phpからロードされるwp-setting.phpの中盤で、データベースに接続したあとで、処理を停止して制御をコントローラーに戻します。

注意事項

主にバッチ処理などでデータベースを直接コントロールするための処理などの場合に用いる。利点は初期化処理を簡略化し、初期化処理を高速化することです。
この定数はwp-config.phpに記述することもの可能ですが、通常のWebサイトとして動作しているWordPressの場合には、表示が行われなくなりますので注意が必要です。

 

関数を利用して特殊文字をHTMLエンティティに変換する

ブラウザにソースコードを表示する基本的な考え方で特殊文字をエンティティ化する処理について書きました。

今回はその処理を手動ではなくプログラムで出力する方法について考えます。
htmlspecialchars関数を利用することにより、特殊文字をHTMLエンティティに変換する事ができます。

関数を利用して出力された文字列をコピーして、本ブログに貼り付け(テキストモード)て、適切な文字列として表示されることを目標にします。
今回は以下の3つの方法で実施してみます。

1.フォームに入力した文字列がエンティティ化されてブラウザに出力される

まず簡単なフォームを作ります。フォームに入力し「送信」をクリックすると入力した文字列が当該ページに出力されます。
http://www.yoshihiro.asia/test/test.php
※この時点ではまだエンティティ化を行っていません。

「hogehoge」と入力すると当該ページにそのまま「hogehoge」と表示されます。
次に「<strong>strongタグは強調します</strong>」という文字列を表示させたい際に、この文字列を入力し送信をクリックする、文字列がそのまま出力されるのではなく「strongタグは強調します」のように表示されます。入力した「<strong>strongタグは強調します</strong>」の「<strong></strong>」タグがhtmlタグとして認識されているからです。

入力した文字列がそのままの文字列として出力されるようエンティティ化する処理を加えます。
htmlspecialchars関数を利用することにより、特殊文字をHTMLエンティティに変換する事ができます。

※参考:http://php.net/manual/ja/function.htmlspecialchars.php

今回はhtmlspecialchars( $hoge );をechoの前に加え、入力した文字列$hogeのエンティティ化された値を出力するようにします。
http://www.yoshihiro.asia/test/test2.php

この処理により「<strong>strongタグは強調します</strong>」という文字列を入力した場合も、そのままの「<strong>strongタグは強調します</strong>」という文字列で出力されるようになります。
変換処理された結果ページのソースをみると「&lt;strong&gt;strongタグは強調します&lt;/strong&gt;」とエンティティ化されています。

またhtmlspecialchars関数は、デフォルトではシングルクオートの変換が除外されています。シングルクオートも変換したいので第2引数にENT_QUOTESを設定しました。これによりシングルクオートも変換されるようになりました。
※「”hogehoge”」を入力すると出力された文字列ソースでは「&quot;hogehoge&quot;」、「’hogehoge’」を入力すると出力された文字列ソースでは「&amp#039;hogehoge&amp#039;」とエンティティ化された結果が出力されています。

さらに<code>タグで囲むことでソースコードであることを示せ、<pre>タグで囲むことで「整形済みテキスト」として改行やスペースを書いたとおりに示すことができます。
変換し出力した文字列が<pre><code><strong>strongタグは強調します</strong></code></pre>のように出力される設定します。
http://www.yoshihiro.asia/test/test2A.php

出力された内容のソースコードを見ると「<pre><code>&lt;strong&gt;strongタグは強調します&lt;/strong&gt;</code></pre>」のように、エンティティ化された内容が<pre>タグ、<code>タグで囲まれています。
これを本ブログのhtmlにそのまま貼り付けると

のようにソースコードを記載することができました。

2.シェルで入力した内容を標準出力で表示させる

$argvを用いてスクリプトに渡された引数の配列を出力させます。
※$argvについては別途まとめます

まず新たに作成したtest3.phpファイルに以下のように記載します。

1で示したとおり、このままだと特殊文字をHTMLエンティティ化されていないので、htmlspecialcharsを追加します。(このままだと構文エラーとなってしまう)
またソースコードであることを示すため<pre><code>タグで囲んで出力するようにします。

このファイルを利用し、シェルに変換したい文字列を入力し、エンティティ化させて出力させます。
例えばシェルに下記のコマンドを入力すると、

下記のように標準出力されます。

これをそのままこのブログに貼り付けると、下記のようにソースコードとして表示されるようになりました。

3.別ファイルの内容を読み込み、エンティティ化した内容をブラウザに出力する

hogehoge.txtにあらかじめ出力させたい文字列を書いておき、そのファイルを読み込みエンティティ化させてブラウザに出力する方法を考えます。
まずはhogehoge.txtの内容を読み込むためfile_get_contents関数を利用して、test4.phpファイルを作成します。

エンティティ化を行っていいないので、「hogehoge」という文字列はそのまま出力されますが、「<strong>hogehoge</strong>」はhtmlの記述として処理されるので「hogehoge」に表示されます。
「<strong>hogehoge</strong>」をそのままの文字列として出力したいので、htmlspecialcharsを追加します。またソースコードであることを示すため<pre><code>タグで囲んで出力するようにします。

http://www.yoshihiro.asia/test/test5.php
出力された文字列はエンティティ化されているので、そのソースコードコピーして貼り付けると下記のように表示することができました。

パラメーターを引き回す

HTTPには「状態」という考え方がなく接続はWebページごとに切れてしまう

Webアクセスに使うHTTPプロトコルはブラウザからのリクエストとサーバーからのレスポンスの1往復のメッセージのやりとりで処理が完結するステートレス(クライアントとサーバーの接続の現在の状態を表すデータなどを保持せず、入力の内容によってのみ出力が決定される方式)なプロトコルです。

Webブラウザは取得するWebページをHTTPリクエストでWebサーバに要求し、WebサーバーはHTTPレスポンスでWebページヘ返送します。
HTTPの接続はこの1往復のWebページ単位で切れるのが原則です。
※複数の画面をまたがることをもともと想定していない。

そこで複数のWebページをまたいだ一連の通信としてセッションという仕組みが考案されました。

セッション管理

複数のWebページにまたがった通信を認識するため、WebサイトがWebブラウザとの間のセッションを把握し、処理の状態を把握するためのセッション管理の仕組みが必要となります。

セッションの認識はセッションID(※)のやりとりで実現します。
(※)セッションIDとはアクセス中のユーザーの識別やセッション管理のために付与される固有の識別情報です。
WebサイトはセッションIDを発行し、Webブラウザへ送信します。Webブラウザから一連のアクセスで同じセッションIDが送信されればWebサイトは同一のセッションIDとして認識します。

セッションIDのやりとり

Webブラウザからリクエストを受けたWebサイトはページを生成すると同時に、セッションを識別するセッションIDを生成します。同時にセッション用データを格納するセッション・オブジェクトを作り、セッションの状態を保存しておきます。
その上でWebサイトは応答するWebページと一緒に生成したセッションIDをWebブラウザへ送信します。

セッションIDを受け取ったブラウザはそのサイトの一連のアクセスのときに(2回目以降のアクセスのときに)HTTPリクエストにWebページの要求とともにセッションIDをつけて送信します。
同一セッションであれば同じセッションIDが送られてくるので、WebサイトはそのセッションIDがに対応するセッション・オブジェクトを参照し、なかに書かれた状態情報をもとに処理を進めます。

セッションIDの受け渡しかた

WebブラウザとWebサイトはどのような手段でセッションIDをやりとりするのでしょうか。
主に3つのやり方があります。

1.Cookieを使う

CookieはWebサイトがWebブラウザに一時的にデータを書き込んで保存させる仕組みです。WebサイトがWebブラウザにCookieを送り、次回以降のアクセスで送り返してもらうという仕組みです。

Cookieを使うWebサイトはWebブラウザに送るHTTPレスポンスの拡張ヘッダにCookieとしてのセッションIDを書き込んで送ります。Cookieを受け取ったブラウザはそのCookieを保持し、そのWebサイトへの一覧のアクセスのときにHTTPリクエストの拡張ヘッダにCookieをつけて送信します。
Webサイトは受けとったCookieに含まれるセッションIDを見てセッションを識別します。

2.GETメソッドによるパラメーター渡し

Webブラウザの設定でCookieを禁止している場合など、CookieでセッションIDをやりとりできない場合があります。
そのような場合にはWebページ内に埋め込むURLにセッションIDを付けGETメソッドでサーバーにセッションIDを渡すことができます。
セッションID付与されたURLが埋め込まれたWebページのボタンやリンクをユーザーがクリックすると,埋め込まれたURLがHTTPリクエストによってWebサイトに送られます。
送られたHTTPリクエストからWebサイトはセッションIDを受け取ります。

GETメソッドの方法を使うWebサイトはURLの後ろに「ssid=12345」のようなセッションIDをパラメータとして付けます。そのパラメータが付与された「http://www.example.com/?ssid=12345」のようなURLをWebサイトへ送ります。
Webサイトはパラメータとして「ssid=12345」というセッションIDを受け取ります。

この際、要求するセッションIDがWebブラウザのアドレス・バーに表示されます。

3.POSTメソッドによるパラメーター渡し

Webページに入力したデータをWebサイトに送るための機能であるフォームを使ってセッションIDをやりとりするには,Webページを記述するHTMLデータの中のフォーム・データにセッションIDを埋め込んでおきWebアクセスでフォーム・データの一部としてセッションIDを送信することができます。
POSTメソッドで送ることで、データはHTTPリクエストのボディ部として送信されるため、URLにセッションIDは表示されません。

preg_replace()関数

正規表現検索および置換を行う関数です。

書式

preg_replace (①検索文字,②置換後の文字,③検索・置換対象となる文字列もしくは文字列の配列);

意味

③検索・置換対象となる文字列もしくは文字列の配列に対して、①検索文字を用いて検索を行い、②置換後の文字置換します。

上の例の出力は以下となります。

やってしまった間違い

画面表示が真っ白に。

→ preg_replaceは「正規表現検索および置換を行なう」ものなので、検索を行なうパターンにはデリミタ(区切り文字)が必要でした。

=> $pattern = ‘quick’;
→ $pattern = ‘/quick/’;

mysqlnd

※このコンテンツは以下の資料の内容を参考に記載しています。

http://derickrethans.nl/talks/andrey-mysqlnd.pdf

MySQLを利用する方法

PHPアプリケーションからMySQLを利用する方法(MySQLのクライアントライブラリ)はたくさんあります。
例)

  • mysql_connect
  • mysqli
  • PDO (MySQL ドライバ)
  • Doctirne
  • Zendquent
  • ADOdb
  • PEAR_MDB2
  • PEAR_DB

これらのライブラリがMySQLを呼び出すためには、最終的には前述のうちmysql拡張、mysqli拡張、PDO拡張(MySQLドライバ)のいずれかを呼び出しています。

  • mysql 拡張:php4の時代から使えた古くからある拡張
  • mysqli 拡張:mysql 拡張を刷新する形でphp5から利用可能なモジュール
  • PDO 拡張:それ自身がDB 抽象層であり、配下に多くの DBMS に対応したドライバが存在、そのなかのひとつがmysql

さらにこれらがMySQLと直接やり取りしているのではなく、
mysqlnd / libmysql → アクセスやプロトコル判断など
mysql / mysqli / pdo → 実際に接続
を行っています。

Screenshot-2014-10-13-at-02.46.30[1]

libmysqlとmysqlnd

さらにApplicationとMySQL Server の間には前述のライブラリの他に

  • libmysql
  • mysqlnd

という2つのライブラリが存在しています。

libmysqlは、MYSQL側が用意しているライブラリで、MySQL 利用者に対してC言語レベルでのAPIを提供するものです。
MySQLは、phpのみならずperl、python、rubyなどといった動的言語から利用可能なため、それらの言語からMySQLを利用するにあたり、このlibmysqlを呼び出しています。

mysqlndは、PHPの拡張モジュールとして実装された、MySQLのネイティブクライアントです。
libmysqlを介さないため、 MySQLサーバから受け取ったデータをそのままPHPの変数として表現することができ、オーバヘッドが減り、メモリも節約できることが特徴です。

※php5.4移行はmysqlndがデフォルトとなり、libmysqlはオプションとなりました。