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

PhpStormで半角スペース、タブの表示/非表示設定

PhpStorm

PhpStormで半角スペースやタブの表示、非表示を切り替える設定項目。

  • IDE Settings > Editor > Appearance

『Show whitespaces』にチェックすると表示、チェックを外すと非表示になる。

redmine+svnで『リポジトリに、エントリ/リビジョンが存在しません。』が出る場合の対応

redmine svn

redmine+svn(オレオレ証明書)な環境で、下記のようなエラーが出る場合の対応メモ。

Server certificate verification failed: certificate has expired, certificate issued for a different hostname, issuer is not trusted (...

検索すると何件か引っかかる下記の対応が、自分の環境だと何故か上手くいかない。

RedmineでSSL自己証明書Subversionリポジトリにアクセスする方法 - TrinityT’s LABO
redmineでSubversionリポジトリにhttpsでアクセスする|成長の果実
リポジトリに、エントリ/リビジョンが存在しません(オレオレ証明書でSSL) - snit21の日記

なので、一度許可した証明書をコピーする方法で対応。

$ svn list https://example.com/hoge/

『常に承認する」を選択

ホームディレクトリ配下に『.subversion』が作成される為、/var/www配下へコピー

$ sudo cp -a ~/.subversion /var/www/
$ sudo chown -R apache:apache /var/www/.subversion

これでOK。

FuelPHPのForm::radioとラベルの関連付け

FuelPHP

FuelPHPの想定バージョンは1.7

Form::radioにラベルを関連づける為のメモ。

Form::radioでradioボタンを作成し、そこにラベルを関連づけしようとすると、Form::labelはidにformのprefixが付くのに対し、Form::radioはprefixが付かないので若干ややこしい。

対応案1

Form::radioでprefix付きのidを指定する。
(label側のidにprefixが付くのを見越し、radio側のidを付けてしまう)

<?= Form::radio('status', 1, Input::post('status') != '0', array('id' => 'form_status_1')) ?>
<?= Form::label('有効', 'status_1') ?>
<?= Form::radio('status', 0, Input::post('status') == '0', array('id' => 'form_status_0')) ?>
<?= Form::label('無効', 'status_0') ?>

生成されるHTML

<input id="form_status_1" name="status" value="1" checked="checked" type="radio" />
<label for="form_status_1">有効</label>
<input id="form_status_0" name="status" value="0" type="radio" />
<label for="form_status_0">無効</label>

対応案2

prefixを自動的に付けないようにする。
(idへのprefixの自動付与をやめ、radioとlabelで同じidを指定する)

app/config/form.php
<?php
return array(
    'auto_id_prefix' => ''
);

<?= Form::radio('status', 1, Input::post('status') != '0', array('id' => 'status_1')) ?>
<?= Form::label('有効', 'status_1') ?>
<?= Form::radio('status', 0, Input::post('status') == '0', array('id' => 'status_0')) ?>
<?= Form::label('無効', 'status_0') ?>

生成されるHTML

<input id="status_1" name="status" value="1" checked="checked" type="radio" />
<label for="status_1">有効</label>
<input id="status_0" name="status" value="0" type="radio" />
<label for="status_0">無効</label>

FuelPHP ヘッダー/フッター等のパーツの呼び出し

FuelPHP

ヘッダーやフッター等のパーツを個別にテンプレートファイルとして持っている場合、楽をして、コントローラ側でセットせずに、『render』(View::render()のエイリアス)をView側で直接呼び出す事が多い。
これってあり?なし?

http://fuelphp.com/docs/classes/view.html#/function_render

renderを使用する場合

View)

<?= render('header') ?>
...
<?= render('footer') ?>

コントローラでセットする場合

Controller)

<?php

class Controller_Hoge extends Controller
{
    public function action_index()
    {
        $view = View::forge('hoge');
        $view->header = View::forge('header');
        $view->footer = View::forge('footer');
        return $view;
    }
}

View)

<?= $header ?>
...
<?= $footer ?>

PHPだとこんな感じ?某一覧抽出

PHP スクレイピング エロ

id:yutakikuchi氏のPythonのサンプルコードをPHPで実装するとこんな感じ?

アダルトフィルタ実装に向けたA○女優リストの自動抽出 + α - Yuta.Kikuchiの日記

<?php
$base_url = 'http://ja.wikipedia.org';

$url_list = [
    '/wiki/AV%E5%A5%B3%E5%84%AA%E4%B8%80%E8%A6%A7_%E3%81%82%E8%A1%8C',
    '/wiki/AV%E5%A5%B3%E5%84%AA%E4%B8%80%E8%A6%A7_%E3%81%8B%E8%A1%8C',
    '/wiki/AV%E5%A5%B3%E5%84%AA%E4%B8%80%E8%A6%A7_%E3%81%95%E8%A1%8C',
    '/wiki/AV%E5%A5%B3%E5%84%AA%E4%B8%80%E8%A6%A7_%E3%81%9F%E8%A1%8C',
    '/wiki/AV%E5%A5%B3%E5%84%AA%E4%B8%80%E8%A6%A7_%E3%81%AA%E8%A1%8C',
    '/wiki/AV%E5%A5%B3%E5%84%AA%E4%B8%80%E8%A6%A7_%E3%81%AF%E8%A1%8C',
    '/wiki/AV%E5%A5%B3%E5%84%AA%E4%B8%80%E8%A6%A7_%E3%81%BE%E8%A1%8C',
    '/wiki/AV%E5%A5%B3%E5%84%AA%E4%B8%80%E8%A6%A7_%E3%82%84%E8%A1%8C',
    '/wiki/AV%E5%A5%B3%E5%84%AA%E4%B8%80%E8%A6%A7_%E3%82%89%E3%83%BB%E3%82%8F%E8%A1%8C'
];

foreach ($url_list as $url) {
    preg_match_all('|<li><a href="(?P<url>.*?)".*?>(?P<name>.*?)</a>.*?((?P<initial>.).*?</li>|u', file_get_contents($base_url.$url), $match, PREG_SET_ORDER);
    foreach ($match as $m) {

        if (preg_match('|\A/w/|', $m['url'])) continue;

        $html = preg_replace('/\r|\n/', '', file_get_contents($base_url.$m['url']));

        preg_match('|スリーサイズ</a>:</th><td nowrap="nowrap">(?P<bust>\d+) - (?P<waist>\d+) - (?P<hip>\d+) cm|', $html, $size);
        preg_match('|ブラのサイズ</a>:</th><td>(?P<cup>[a-zA-Z])|', $html, $bra);

        echo sprintf("Name:%s\tBust:%s\tWaist:%s\tHip:%s\tBra:%s",
            $m['name'],
            $size['bust'] ?: '-',
            $size['waist'] ?: '-',
            $size['hip'] ?: '-',
            $bra['cup'] ? strtoupper($bra['cup']) : '-'
        ).PHP_EOL;
        sleep(5);
    }
}

ファイル出力、面倒くさいから書いてないや。
あと、久々にブログ書いた...

『Percona Toolkit for MySQL』をRPMでインストール

MySQL

『Percona Toolkit』をRPMでインストールする為のメモ。

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

『Percona Tookit』インストールに必要なパッケージのインストール

$ sudo yum install perl-Time-HiRes perl-IO-Socket-SSL

2. rpmのダウンロード

http://www.percona.com/ へアクセスしrpmをダウンロード

『Software』 > 『Percona Toolkit for MySQL』 > 『Download Latest』 > 『RPM』

$ wget 'http://www.percona.com/redir/downloads/percona-toolkit/LATEST/RPM/percona-toolkit-2.2.3-1.noarch.rpm'

3. インストール

$ sudo rpm -ivh percona-toolkit-2.2.3-1.noarch.rpm

FuelPHP+MySQLでSHOWコマンドの結果を取得

FuelPHP

※2013/06/05追記
クエリタイプにDB::SELECTと指定するだけで大丈夫なようです。
参考) http://d.hatena.ne.jp/Kenji_s/20130605/fuel_db_query
id:Kenji_s さん情報ありがとうございます。


  • 想定バージョン : FuelPHP 1.6

FuelPHPで『SHOW PROCESSLIST』や『SHOW WARNINGS』等のSHOWコマンドの結果を取りたかったんだけど、下のやり方だと対象の件数しか取れない。。。

<?php
$result = \DB::query('SHOW PROCESSLIST');

pdoを使ってたので、コアの『database/pdo/connection.php』を確認したところ、以下の記述。

<?php
...
if ($type === \DB::SELECT)
{
        // Convert the result into an array, as PDOStatement::rowCount is not reliable
        if ($as_object === false)
        {
                $result = $result->fetchAll(\PDO::FETCH_ASSOC);
        }
        elseif (is_string($as_object))
        {
                $result = $result->fetchAll(\PDO::FETCH_CLASS, $as_object);
        }
        else
        {
                $result = $result->fetchAll(\PDO::FETCH_CLASS, 'stdClass');
        }


        // Return an iterator of results
        return new \Database_Result_Cached($result, $sql, $as_object);
}
elseif ($type === \DB::INSERT)
{
        // Return a list of insert id and rows created
        return array(
                $this->_connection->lastInsertId(),
                $result->rowCount(),
        );
}
else
{
        // Return the number of rows affected
        return $result->errorCode() === '00000' ? $result->rowCount() : -1;
}

SHOW使った時点で件数しか取れないのね。
しょうがないので、以下のようにして取得。

<?php
$db = \Database_Connection::instance();
$result = $db->connection()->query('SHOW WARNINGS');
foreach ($result as $val) {
    echo $val['Message'];
}