読者です 読者をやめる 読者になる 読者になる

phpとか

自分用備忘録なので、自分が分かる程度にしか書いてません。

htaccess適用の範囲

いまだによくわかっていないんですが、htppd.confで、特定のパスの場合だけ違うディレクトリのプログラムを起動してる場合でも変更前のdocumentRootにあるhtaccessを見に行くんですね。

何を言ってるのか意味わからないと思うのですが、下記みたいな感じです。

【通常】
[URL] http://test.jp
[PATH] /var/www/

【「/admin」の場合】
[URL] http://test.jp/admin
[PATH] /home/admin/www/「rubyで書いたプログラムを起動」

上記の設定をhttpd.confに書いたとしても、
「/admin」で来た場合も、「/var/www/.htaccess」をみるんですね。

ただ、プログラムの起動ではなく、普通にリダイレクトするようにした場合は、リダイレクト先しか見ないようですね。


その場しのぎに調べるんじゃなくて、ちゃんと勉強しないとダメですね・・・




Unity5の教科書 2D&3Dスマートフォンゲーム入門講座 (Entertainment&IDEA)

Unity5の教科書 2D&3Dスマートフォンゲーム入門講座 (Entertainment&IDEA)

apache maxClientsについて

httpだとアクセス集中してるのに、httpsで接続すると普通に閲覧できるということがありました。

maxClientsってhttpとhttpsでそれぞれ適用されるんですね。

※maxClientsが2の場合、httpとhttpsがそれぞれ2プロセス(合計4プロセス)まで起動する





Unity5の教科書 2D&3Dスマートフォンゲーム入門講座 (Entertainment&IDEA)

Unity5の教科書 2D&3Dスマートフォンゲーム入門講座 (Entertainment&IDEA)

mysql5.5を再インストール & 以前のデータ復元

サーバが動かなくなりました。
専有レンサバでしたが、一か月経過し、やっと復旧の連絡がきました。

新サーバに以前のデータを新しくマウントしたらしいです。

下記のような構成です。
=======================================
【復旧前】
/root

【復旧後】
/mount/root
=======================================

これだと物理データは取れるけど、サービスなんも動かない・・・
とりあえずなんとかしてDBのdump取得しないと。しかしmysqlが動かない。

mysqlの場合、my.cnfの「datadir」に指定のディレクトリ内に物理データがあるらしいです。

試しにmysql起動

やはりできない。本体置いてある場所がマウント先(/mount/var/lib/mysqlみたいな)になっちゃってて、設定ファイルとかいろんなとこに絶対パスで書かれてるので、全部直すのめんどい。というか無理

/var/lib/に同バージョンのmysqlインストール

mysql公式のリポジトリをインストール

・・・しようとしましたが、yumで失敗。

yum install http://dev.mysql.com/get/mysql57-community-release-el6-8.noarch.rpm

以下もなぜかエラー

wget http://dev.mysql.com/get/mysql57-community-release-el6-8.noarch.rpm

しょうがないので、クライアントマシンでブラウザから落としたものをftpでサーバにアップして、インストール。
リポジトリのURL】
http://dev.mysql.com/downloads/repo/yum/

ここから自分のサーバのOSバージョン64bitかなどを確認して適切なものを選択。

アップしたリポジトリのインストール

sudo yum localinstall mysql57-community-release-el6-8.noarch.rpm

インストールしましたが、リポジトリの設定ファイルを見るとmysql5.6と5.7しかなかった・・・

cat /etc/yum.repos.d/mysql-community.repo

直接mysql5.5をインストール

これもクライアントマシンでブラウザから落としたものをftpでサーバにアップしました。

rpmのURL】
http://dev.mysql.com/downloads/mysql/5.5.html#downloadsMySQL :: Download MySQL Community Server

「Select Version:」を5.5.54
「Select Platform:」をLinux - Genericとして選択。

以下をダウンロード。
※64bitかなどを確認して適切なものを選択

  • Client Utilities
  • MySQL Server
  • Compatibility Libraries
sudo yum localinstall MySQL-server-5.5.54-1.linux2.6.i386.rpm

エラーでたので「nogpgcheck」オプションを付与して再実行

sudo yum localinstall MySQL-server-5.5.54-1.linux2.6.i386.rpm --nogpgcheck

「nogpgcheck」は、パッケージの出自の証明を確認しないオプションです。今回はmysqlの公式サイトからダウンロードしたものなので、
チェックしなくても大丈夫でしょう。

このままだとmy.cnfがないので作成します。最低限だけ書いて、あとは「datadir」を指定

「datadir」を以前のdatadir(マウント先にある)に指定するとエラー・・・

以下で立ち上がるか確認。

sudo mysqld_safe


メッセージはでるけど終わらない。ctr + Cも効かないので、ssh別セッション起動
するとmysql起動してました。


これでmysqldumpで障害発生前のデータを取得できました。




Unity5の教科書 2D&3Dスマートフォンゲーム入門講座 (Entertainment&IDEA)

Unity5の教科書 2D&3Dスマートフォンゲーム入門講座 (Entertainment&IDEA)

datepickerでDBにデータある日付のみ選択可能に

タイトルに関わる箇所だけ抜粋
パラメータとかは見ずらくなるので抜いてます。

project.calendar= function () {
    var options= this;
    options.month;
    options.dateArray = [];
  options.url = '/test/';
  options.timeout = 5000;
};

//dbにある日付か
project.calendar.prototype.invalidateion = function (date) {
  var ieFlg = project.calenar.prototype.validataionIe(),ymdArr = date.toLocaleDateString().split('/');
  if(ieFlg){
    ymdArr= [date.getFullYear(),date.getMonth() + 1,date.getDate()];
  }
  var y = ymdArr[0],m = ("0" + ymdArr[1]).slice(-2),d = ("0" + ymdArr[2]).slice(-2), ymd = y + m + d;
  if (m !== options.month) {
    if (parseInt(d) > 1) {
      if (parseInt(m) === 12) {
        y = parseInt(y) + 1;
        m = '01';
      } else {
        m = ("0" + (parseInt(m) + 1)).slice(-2);
      }
    }
    //データある日付
    project.calendar.prototype.getDateAjax(y + m)
      .done(function (data) {
        options.dateArray = data['result'];
      })
      .fail(function () {
        options.dateArray = [];
      });
    options.month = m;
  }
  return $.inArray(ymd, options.dateArray ) !== -1 ? result = [true, ''] : [false, ''];
}

//データ取得
project.calendar.prototype.getDateAjax = function (ym) {
  var dfd = $.Deferred();
  $.ajax({
    async: false,
    url: options.url + '?ym=' + ym,
    type: 'get',
    dataType: 'json',
    timeout: options.timeout,
    success: function (data) {
      if (data['err'] !== '') {
        return dfd.reject();
      }
      return dfd.resolve(data);
    },
    error: function () {
      return dfd.reject();
    }
  });
  return dfd.promise();
}

//initialization
var calendar= new project.calendar();
$('.datepicker').datepicker({
  beforeShowDay: function (date) {
    return calendar.invalidateion(date)
  }
});

1.datepicker設定

var calendar= new project.calendar();
$('.datepicker').datepicker({
  beforeShowDay: function (date) {
    return calendar.invalidateion(date)
  }
});

「beforeShowDay」で、[真偽値, '']の形式で返すことにより、選択の可否を設定できます。

[true, '']は有効、[false, '']は無効。
 第二引数はクラス名

2.「beforeShowDay」で渡される、表示される月のカレンダーの日付を分割

var ieFlg = project.calenar.prototype.validataionIe(),ymdArr = date.toLocaleDateString().split('/');
if(ieFlg){
  ymdArr= [date.getFullYear(),date.getMonth() + 1,date.getDate()];
}

ieやedgeだと、日付の形式が他のブラウザとちがうので、分けてます。
ie判定はユーザエージェントで
てか、全部getFullYear()とかでやればいいですね・・・

3.表示可否決定

if (m !== options.month) {
  if (parseInt(d) > 1) {
    if (parseInt(m) === 12) {
      y = parseInt(y) + 1;
      m = '01';
    } else {
      m = ("0" + (parseInt(m) + 1)).slice(-2);
    }
  }
  //データある日付
  project.calendar.prototype.getDateAjax(y + m)
    .done(function (data) {
      options.dateArray = data['result'];
    })
    .fail(function () {
      options.dateArray = [];
    });
  options.month = m;
}
return $.inArray(ymd, options.dateArray ) !== -1 ? result = [true, ''] : [false, ''];

if (m !== options.month)で、月が変わったときだけやってます。
もっといいやり方いっぱいありそうですね。

表示された全ての日付に対して処理するのは無駄なので上記制限します。
最初に取得したデータを使いまわします。

if (parseInt(d) > 1)は、カレンダーの始まりが前の月の日付かの判定です。
前の月の場合、月に+1したりしてます。

あとはajaxでとってきたデータに、「beforeShowDay」で渡される日付があるかを調べて、あるなら選択可能。なければ選択不可として結果を返してます。

※非同期だとカレンダーに値をセットする前に表示される可能性があるので、同期に設定してます。

async: false


Unity5の教科書 2D&3Dスマートフォンゲーム入門講座 (Entertainment&IDEA)

Unity5の教科書 2D&3Dスマートフォンゲーム入門講座 (Entertainment&IDEA)

PageSpeed Insights

PageSpeed Insights


恥ずかしながら今まで知らなかったのですが、これ便利ですね~

遅い原因と解決法を教えてくれるだけでなく、cssとか画像とか勝手にサイズ変更とか圧縮してくれます!

なんとか速度96/100まで行ったけど、twiiterのjsとかはどうしようもないですからね・・・
jsで呼べばいいのかな




Unity5の教科書 2D&3Dスマートフォンゲーム入門講座 (Entertainment&IDEA)

Unity5の教科書 2D&3Dスマートフォンゲーム入門講座 (Entertainment&IDEA)

phpから、非同期でシェルスクリプト(task)起動

画面上からユーザに重い処理をさせたいけど、処理終わるまでブラウザ開きっぱなしは困る。
というかユーザ自身が閉じたり、タイムリミットがあったりで、実行される保証がないですよね・・・

というわけで、phpから非同期でスクリプトを起動する方法をまとめました。

exec('cd ' . TASKSRUN . ';nohup php oil refine testScript' . escapeshellarg($test) .' > /dev/null &'/* '> '.TASKSRUN.'result.log 2> '.TASKSRUN.'err.log' */);
  • ※oilコマンドが打てないって方は、まずoilのインストールをお願いします。
  • ※それが面倒な方やfuelphpを使用しない方は、oilでtask実行でなく、シェルスクリプトの実行にしてください。


【解説】

1.まず、oilコマンドが打てるパスへ移動します。

'cd ' . TASKSRUN . '
  • ※「TASKSRUN」は、oilコマンドが使えるパスをいれた定数です。
  • 通常は、fuelディレクトリが置いてある階層に「oil」があるとおもうので、そこですね。
  • ※escapeshellarg($test)は、スクリプトに渡す引数で、escapeshellarg関数でエンコードしてます。

2.非同期(結果を待たない)にして実行

';nohup php oil refine testScript' . escapeshellarg($test) .'

nohup」をつけると、ログアウト後もコマンドを実行し続けます

3.ログに書き込み

'/* '> '.TASKSRUN.'result.log 2> '.TASKSRUN.'err.log' */

エラーログと実行時のログを別にしてます。
ログいらない方は、コメントアウトしたまま、下記にすれば、ログはできません。

' > /dev/null &'

あとは、読んだスクリプト内で終了フラグをdbとかテキストとかに書き込むようにして、メール通知するなり、
ブラウザ上に表示するなりすればOKかとおもいます。


Unity5の教科書 2D&3Dスマートフォンゲーム入門講座 (Entertainment&IDEA)

Unity5の教科書 2D&3Dスマートフォンゲーム入門講座 (Entertainment&IDEA)

パズルwebアプリ

f:id:hrjk315:20161202111739p:plain
app.starfams.com


子どものために作ってみました。
小さい子に是非お使いくださいませ。

html5で作成しました

スマホでのみ操作可能です。


Unity5の教科書 2D&3Dスマートフォンゲーム入門講座 (Entertainment&IDEA)

Unity5の教科書 2D&3Dスマートフォンゲーム入門講座 (Entertainment&IDEA)