もなかアイスの試食品

「とりあえずやってみたい」そんな気持ちが先走りすぎて挫折が多い私のメモ書きみたいなものです.

CentOSでApacheとPHPをコンパイル&インストールしてみた

パッケージ管理ツールでPHPをインストールすると、CentOS6.8の場合、デフォルトのApache2.2がインストールされる

あとApache2.4を使う場合、パッケージ管理ツールでインストールするPHPはfast-cgiで使わないといけない(らしい)

ある環境と完全に合わせたかったなので、いろんなサイトを参考にしつつ、コンパイル&インストールをしてみた話

構成

参考にしたサイトの紹介

Apache2.4のインストールは主に以下のサイトを参考

normalse.hatenablog.jp

PHPのインストールは主に以下のサイトを参考

PHP: Apache 2.x (Unixシステム用) - Manual

必要なパッケージのインストール

ソースコードのダウンロードやらコンパイルで必要なパッケージをインストール

yum install wget pcre pcre-devel gcc make perl

perlをインストールした状態でApacheコンパイルしないと、今回のPHPのオプションの影響で「./configure」コマンドがコケる

Apache2.4のインストール

Apacheコンパイル&インストールする前に、aprと言うものをインストールする必要あり

aprは元々Apacheに同梱されていたパッケージで、OSの差を吸収するためのパッケージ・・・らしい

なので、まずaprとapr-utilのパッケージのコンパイル&インストールする

ソースコードのURLは以下のサイトより

Download - The Apache Portable Runtime Project

aprのコンパイル&インストール

# /usr/local/src/をソースコードの配置場所
cd /usr/local/src/
wget http://ftp.kddilabs.jp/infosystems/apache//apr/apr-1.5.2.tar.gz
    
# アーカイブを解凍&展開して、展開後のフォルダに移動
tar xvzf apr-1.5.2.tar.gz
cd apr-1.5.2
    
# /opt/apr/apr-1.5.2にインストールする
./configure --prefix=/opt/apr/apr-1.5.2
    
# コンパイル&インストールする
make
make test
make install

apr-utilのコンパイル&インストール

# /usr/local/src/をソースコードの配置場所
cd /usr/local/src/
wget http://ftp.kddilabs.jp/infosystems/apache//apr/apr-util-1.5.4.tar.gz
    
# アーカイブを解凍&展開して、展開後のフォルダに移動
tar xzvf apr-util-1.5.4.tar.gz
cd apr-util-1.5.4
    
# aprのインストール先を指定し、/opt/apr-util/apr-util-1.5.4にインストールする
./configure --prefix=/opt/apr-util/apr-util-1.5.4 --with-apr=/opt/apr/apr-1.5.2/
    
# コンパイル&インストールする
make
make test
make install

Apache2.4のコンパイル&インストール

# /usr/local/src/をソースコードの配置場所
cd /usr/local/src/
wget http://ftp.yz.yamagata-u.ac.jp/pub/network/apache//httpd/httpd-2.4.25.tar.gz
    
# アーカイブを解凍&展開して、展開後のフォルダに移動
tar xzvf httpd-2.4.25.tar.gz
cd httpd-2.4.25
    
# aprのapr-utilを指定し、/opt/httpd/httpd-2.4.25にインストールする
./configure --prefix=/opt/httpd/httpd-2.4.25 --with-apr=/opt/apr/apr-1.5.2/ -with-apr-util=/opt/apr-util/apr-util-1.5.4/ --with-mpm=prefork --enable-mods-shared='headers rewrite deflare alias env proxy mime log_config mod_include'
    
# コンパイル&インストールする(make testは動かなかった)
make
make install

オプションの「—with-mpm」やら「–enable-mods-shared」以下のサイトを参考

configure - Configure the source tree - Apache HTTP Server Version 2.4

PHP5.6のコンパイル&インストール

PHPに必要なパッケージをインストール

# コンパイルのためインストール
yum install libxml2-devel
    
# GDライブラリのためインストール
yum install libpng libpng-devel libjpeg libjpeg-devel freetype freetype-devel
    
# PostgreSQL9.5に接続するライブラリ生成のためインストール
rpm -Uvh https://download.postgresql.org/pub/repos/yum/9.5/redhat/rhel-6-x86_64/pgdg-centos95-9.5-3.noarch.rpm
yum install postgresql95-devel

PHPソースコードコンパイル&インストールする

# /usr/local/src/をソースコードの配置場所
cd /usr/local/src/
wget http://jp2.php.net/get/php-5.6.30.tar.gz/from/this/mirror -O php-5.6.30.tar.gz
    
tar xzvf php-5.6.30.tar.gz
cd php-5.6.30
    
./configure --enable-zip --enable-mbstring --enable-exif --with-gd --enable-gd-native-ttf --enable-gd-jis-conv --with-jpeg-dir=/usr/ --with-png-dir=/usr/ --with-freetype-dir=/usr/ --with-pdo-pgsql=/usr/pgsql-9.5/ --with-pgsql=/usr/pgsql-9.5/ --enable-ftp --prefix=/opt/php/php-5.6.30 --with-apxs2=/opt/httpd/httpd-2.4.25/bin/apxs
    
make
make test
make install

PHPコンパイルオプションは以下のサイトが分かりやすい

www.atmarkit.co.jp

PHP: 関数リファレンス - Manual

PHPの設定ファイルのコピー

cp php.ini-development /opt/php/php-5.6.30/lib/php.ini

ApachePHPの設定変更

/opt/httpd/httpd-2.4.25/conf/http.confを変更

ServerName www.example.com:80
↓
ServerName localhost:80
    
<Directory "/opt/httpd/httpd-2.4.25/htdocs">
    Options Indexes FollowSymLinks
    ↓
    Options FollowSymLinks
    AllowOverride None
    Require all granted
</Directory>
    
<IfModule dir_module>
    DirectoryIndex index.html
    ↓
    DirectoryIndex index.html index.php
</IfModule>
    
# 追記
<FilesMatch \.php$>
    SetHandler application/x-httpd-php
</FilesMatch>

/opt/php/php-5.6.30/lib/php.iniの変更

;date.timezone =
↓
date.timezone = Asia/Tokyo

Apacheの起動

/opt/httpd/httpd-2.4.25/bin/apachectl start

ApachePHPの動作確認

/opt/httpd/httpd-2.4.25/htdocsディレクトリ以下に動作確認用のファイルを生成

phpinfo.php

<?php
    phpinfo();

extensions.php

<?php
    print_r(get_loaded_extensions());

phpinfo.phpにアクセスしてちゃんと表示されるか確認

f:id:monakaice88:20170323072022p:plain

extensions.phpにもアクセスし、拡張機能が利用できるか確認

f:id:monakaice88:20170323072024p:plain

おわりに

とりあえずphpinfoが動作したけど、PHPの必要な拡張機能がちゃんとコンパイルされているか怪しい・・・

PHPソースコードディレクトリで「./configure –help」を隅々まで確認しないとよくわからないでござる

【C#】「tail -f」コマンドっぽいものを作ってみた

はじめに

LinuxでWEBアプリを作っていると、Apacheのログ監視、DBのログ監視とかで「tail -f」コマンドをよく使う

最近はWindowsApachePHPでアプリを開発しているけど、tailコマンドを使いたくなることが結構ある

Windowsでtailコマンドっぽいことをやろうと調べてみると、「PowerShell 3.0 以上」のソースコードが出て来る

自分の開発環境はWindows 7なので、PowerShell 2.0らしい

Windows 7 SP1だとPowerShellのバージョンが上がるらしい。自分のPowerShellのバージョン調べてなかった

あとコマンド長いし、大文字小文字混ざっている(;´Д`)

怪しいソフトは入れられないし、慣れていないPowerShell使うのが面倒なのでC#で作ってみた

ソースコード

以下のサイトを参考にして作成した

sugamasao.hatenablog.com

参考元ではRubyで作成しているけど、ブログ内で

ファイルを一行ずつ読み込み&出力で次の一行が無ければ sleep で待てば良さそう。

と書いてあるので、そのままC#で作ってみた

tail -fコマンドっぽいもの

使い方

ビルドしたときのバイナリ名が「tail_file.exe」で、環境変数Pathを通すと以下のコマンドでログ監視的なことができる

tail_file <ファイル名>

Linuxの「tail -f」は、実行時に文末の数行を表示するけど、今回のソースは実行時に先頭から文末まですべて出力する

数MBのファイルで実行した時、結構待たされるかもしれない

【Javascript】select要素の開いた/閉じたイベントを実装した話

はじめに

前回の記事の続き

monakaice88.hatenablog.com

前回の話は、セレクトボックスを選択した時(値が決まった時)にモーダルを表示するという機能を作成したけれども、

onchangeイベントを使っていたため、同じ値を選択したときにモーダルが表示されない問題点があった。

調べてみてもあまりコレだ!とくる内容のサイト・記事が見つからなかった

なので、セレクトボックスに「開かれた」、「閉じた」、「値が変わらなかった」という独自イベントを作成した話

実装

動作するイベントを調べた結果、「開くとき」に発生するイベントは「click」で「閉じるとき」に発生するイベントは「click blur keyup」ということがわかった(Chromeで調査)

今回はjQueryとAngularJSを使って実装

HTML

<div ng-app="App" ng-controller="Sample">
  <select ng-model="Sample.selectValue" ng-select-event expanded="Sample.onOpened()" unexpanded="Sample.onClosed()"  nonchanged="Sample.onNonChanged()" ng-change="Sample.onChanged()">
    <option value="1">1</option>
    <option value="2">2</option>
    <option value="3">3</option>
  </select>
  {{Sample.selectValue}}
</div>

JavascriptjQuery、AngularJS)

(function(window, jQuery, angular) {
  'use strict';
  
  var module = angular.module('App', []);
  
  module.controller('Sample', [
    '$scope',
    function($scope) {
      $scope.Sample = this;
      
      this.selectValue = '1';
    
      this.onOpened = function() {
        window.console.log('おーぷん');
      };
      
      this.onClosed = function() {
        window.console.log('しまった');
      };
      
      this.onChanged = function() {
        window.console.log('変わった');
      };
      
      this.onNonChanged = function() {
        window.console.log('変わってない');
      };
    }
  ]);
  
  /**
   * 普通のselect要素では、「リストボックスが開かれた」、「リストボックスが閉じた」、
   * 「値が変わらなかった」等のイベントが無いため作成
   * 
   * 以下のイベントを発生させる
   *   ・リストボックスが開かれた
   *   ・リストボックスが閉じた
   *   ・値が変わらなかった
   */
  module.directive('ngSelectEvent', [
    '$timeout',
    function($timeout) {
      return {
        restrict: 'A',
        scope: {
          expanded: '&',
          unexpanded: '&',
          nonchanged: '&'
        },
        link: function(scope, element, atts, ctrl) {
          var jQueryElement = jQuery(element);
          
          var WATCH_EXPAND_EVENTS = 'click';
          var WATCH_UNEXPAND_EVENTS = 'click blur keyup';
          
          jQueryElement.data('expanded', false);

          var __expanding = function() {
            jQueryElement.off(WATCH_EXPAND_EVENTS, __expanding);
            jQueryElement.data('expanded', true);
            jQueryElement.data('oldvalue', jQueryElement.val());
            jQueryElement.on(WATCH_UNEXPAND_EVENTS, __unexpanding);

            (scope.expanded)();
          };

          var __unexpanding = function() {
            jQueryElement.off(WATCH_UNEXPAND_EVENTS, __unexpanding);
            jQueryElement.data('expanded', false);
            jQueryElement.on(WATCH_EXPAND_EVENTS, __expanding);

            (scope.unexpanded)();
            
            var oldValue = jQueryElement.data('oldvalue');
            $timeout(function() {
              var newValue = jQueryElement.val();
              if (oldValue == newValue) {
                (scope.nonchanged)();
              }
            }, 0);
          };

          jQueryElement.on(WATCH_EXPAND_EVENTS, __expanding);
        }
      };
    }
  ]);
  
})(window, window.jQuery, window.angular);

今後の自分のためにも、AngularJSを使用しないソースコードも作ろうと思ったけど面倒くさくなったでござる

問題点?

見直しでjsfiddleで動作確認したところ、「ESC」キーを押したときの挙動がイマイチかも

「ESC」キー押してもイベントが走るように、「keyup」イベントを監視するようにしているけれども、2回押さないと反応してくれない・・・

他のキー(数字の1とか)を押した後だと、1回でイベントが呼ばれる感じ

keyupイベントは別処理にして、押されたキーのチェックをしたほうが良いかもしれない