タグ別アーカイブ: PHP

Here Document

ヒアドキュメントが便利なのでもう少し調べる。
Y901x のインストールスクリプトで使っているから経験はあるのだが。

ヒアドキュメント – Wikipedia

シェルスクリプトはバッククォーテーションでコマンドも使えるのか。

#!/bin/sh

func() {
    echo バッククオートで関数も使える
}
shstr=シェルスクリプト
hdstr=ヒアドキュメント

cat << __EOS__
${shstr}で$hdstrは今更だけど
最初の改行は無視される、最後は echo や cat が改行する
エスケープ文字 \\ は有効
記号は\$とバッククオートを除いて <'"{[+=~ と普通に使える
`func`
__EOS__

自作関数でもいいようだ。

# output
シェルスクリプトでヒアドキュメントは今更だけど
最初の改行は無視される、最後は echo や cat が改行する
エスケープ文字 \ は有効
記号は$とバッククオートを除いて <'"{[+=~ と普通に使える
バッククオートで関数も使える

これはもしかして PHP でも関数が使えるかも。

<?php

function func() { return "関数"; }
$plstr = "Perl";
$shstr = "シェルスクリプト";

echo <<< __EOS__
PHP は${shstr}や $plstr 同様に利用できる
最初と最後の改行は無視されるので最後は一行開けるとよし
エスケープ文字 \\ は有効
記号は\$を除いて <'"{[+=~` と普通に使える
`func` って PHP にこんな機能はもともと無いよ!

__EOS__;
/* output
PHP はシェルスクリプトや Perl 同様に利用できる
最初と最後の改行は無視されるので最後は一行開けるとよし
エスケープ文字 \ は有効
記号は$を除いて <'"{[+=~` と普通に使える
`func` って PHP にこんな機能はもともと無いよ!
*/
?>

んなわけないか。
ところで PHP のヒアドキュメントは最後を改行しなくて最初戸惑った。
よく考えたら echo, cat, print() が改行していただけだった。
PHP の echo は改行しないもんね。

Perl や Lua って Fedora に最初から入っているけど使ったことが無いな。
余程のことがないかぎり今後も使うことは無いと思うけど。
GNOME は以前 JavaScript を押していたけど今はどうなんだろう?

// Gjs
// imports /usr/share/gjs-1.0/format.js

const Format = imports.format;

String.prototype.format = Format.format;

let jstr = "\
JavaScript はエスケープで強引な改行しか手段が無い\n\
更に%s機能は無い\n\
しかし %s ならこんなことができる\n\
%%s, %%d, %%x, %%f のみ";

print(jstr.format("文字列フォーマット", "Gjs"));
/*
JavaScript はエスケープで強引な改行しか手段が無い
更に文字列フォーマット機能は無い
しかし Gjs ならこんなことができる
%s, %d, %x, %f のみ
*/

これだものな。
面倒臭くなってブン投げたのは筆者だけではないと思う。

#include <stdio.h>

#define CSTR "\
%s は\n\
説明不要だよね\n"

int
main (int argc, char ** argv) {
	printf (CSTR, "C 言語");
	return 0;
}
/*
C 言語 は
説明不要だよね
*/

C のほうが簡単なんて洒落にもならん。
プラス記号で成形するのって最初は分かり易いのでいいと思うが。

#!/usr/bin/env python3

DOCSTR = """{0} はお馴染 {1}
最初と最後の改行も有効だけど print が最後を改行する
{2}
{1} は \\ エスケープが有効"""

def func():
    return "関数は format で実行すれば文字列さ"

print(DOCSTR.format("Python", "docstring", func()))

''' output
Python はお馴染 docstring
最初と最後の改行も有効だけど print が最後を改行する
関数は format で実行すれば文字列さ
docstring は \ エスケープが有効
'''

あぁ楽チン、やっぱりコレだよコレ!

しかしやっぱりヒアドキュメントに変数を直書きできたほうが便利。
それには $ 記号を変数に利用する言語しか無理なんだろうな。
と思っていました。

// Vala

const string DOCSTR = """Python と同じ
%s も使える、でも ''' は使えない
何故か \\ エスケープ\nは使えない
""";

string func() { return "無理"; }

int main (string[] args) {
    string one = "Vala";
    string tow = "ヒアドキュメント";
    stdout.printf(@"$one は実は@\"\"を使って$towもどきが利用できる
ですが$${one}みたいなブレース表記はダメみたい
最初と最後の改行も有効、エスケープ文字 \\ は有効
記号は$$と\"を除いて <'{[+=~` と普通に使える
`func` は当然不可能\n\n");
    //
    stdout.printf(DOCSTR, "docstring");
    return 0;
}
/* output
Vala は実は@""を使ってヒアドキュメントもどきが利用できる
ですが${one}みたいなブレース表記はダメみたい
最初と最後の改行も有効、エスケープ文字 \ は有効
記号は$と"を除いて <'{[+=~` と普通に使える
`func` は当然不可能

Python と同じ
docstring も使える、でも ''' は使えない
何故か \\ エスケープ\nは使えない
*/

Vala はやってくれました。
おかげで解った、滅茶苦茶使い辛いということを。
これなら docstring 方式のほうがいいや。

最後に、Gedit の色分けってスゴすぎる!

gedit

まさかこの Vala の $ 変数を見分けて色分けするとは思わなかった。
PHP 部分と HTML 部分をしっかり見分けるとかは知っていたが。
どの言語でもヒアドキュメント内でマズい記号を打つと即座に色が変わる。
これがデフォルトエディタって GNOME 恐るべしだよ。

PHP

サイト整理はひとまず一段落。
内容の書き換えだけでなく久々に PHP をやったので少し覚書。

今まで sakura サーバーに上げた奴と local で動作が違う場合があったが

<?
    // sakura はコレで PHP 処理をする設定になっている
?>
<?php
    // local で動かしている httpd は PHP 宣言必須な設定
?>

こんな単純なことだった、<?php としたら当然のように同じ動作に。
何故今まで気が付かなかったのだろう、私ってほんとバカ。

AdSense を localhost で表示させない手段も変更。
表示確認で幾度もリロードするし誤クリックしてしまうのも防ぎたいので。

google.txt みたいなファイルを用意し AdSense スクリプトを書き込む。
ソレを Web に上げ local ファイルは違う内容にして都度読み込みコードに。
というかなり苦しい手段をずっと使っていたけど

<?php
$sitename = "L'Isola di Niente";
$hostname = $_SERVER['SERVER_NAME'];
$foottext = "Copyright(C) sasakima-nao All rights reserved 2002 --- 2014.";

if ($hostname == "localhost") {
    $google = <<< __EOF__
    // local 用 HTML
__EOF__;
} else {
    $google = <<< __EOF__
    // AdSense 表示スクリプト
__EOF__;
}
?>

http://localhost かどうかで振り分けすればいいジャン!
これで Web 上と local の構成をまったく同じにしても問題なくなった。

そんなわけで今までヘッダ部分はこんな感じにしていたけど

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width" />
<title><?php print($title); ?> - L'Isola di Niente</title>
<link href="../style.css" rel="stylesheet" type="text/css" />
</head>

<body>
<div align="center">
<img alt="L'Isola di Niente" src="../img/banner1.gif" /><br />
<?php print(file_get_contents("../google.txt")); ?>
<div class="mainBlock">
<div class="entry"><a href="/">L'Isola di Niente</a> &raquo; <?php print($title); ?></div>

ヒアドキュメントというものがあったのさ。

<?php
require_once("../theme/vars.php");
echo <<< __EOF__
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width" />
<title>$title - $sitename</title>
<link href="../style.css" rel="stylesheet" type="text/css" />
</head>

<body>
<div align="center">
<img alt="$sitename" src="../img/banner1.gif" /><br />
$google
<div class="mainBlock">
<div class="entry"><a href="/">$sitename</a> &raquo; $title</div>
__EOF__;
?>

Gedit のかなり優秀な色分け表示が台無しになってしまうのが難点。
しかし変数を自由に直書きできる魅力は捨て難い。

んでカテゴリ毎に点在させていたヘッダは共通ファイルを読み込むように。
サイト名を変更する場合も変数一つ変更すれば全ページに適用される。
SyntaxHighlighter 部分だけはカテゴリ別読み込みにしているけど。

ウチは三階層あるので三つ用意したが一つにまとめたいな…
CMS ツールなら単層にできるけど自力でやりたい。

こんなことイイな、できたらイイな。
を実現するのがプログラミングの楽しみですから。
PHP も自力で色々やってみると面白い、今年は Web メインかな。

Python and .NET Methods

.NET と Python メソッド対応表 – L’Isola di Niente

自分で利用したかったので作ってみた。
ついでに覚書ページのも少しまとめた、整理進んでねぇ…

表を作るので何年かぶりに table タグを使おうと思ったけど面倒くさい。
せっかく PHP なんだからコードで作ってしまえ!
ということでこんなのを作ってみた、PHP に関しては私はサルです。

<html>
<head>
<meta content="text/html; charset=utf-8" http-equiv="content-type" />
<title>PHP table</title>
<?php
function put_table($items, $count, $separator) {
    echo "<table border=1 cellspacing=0 cellpadding=3>\n";
    $header = true;
    $array1 = explode("\n", $items);
    foreach ($array1 as $s1) {
        $array = explode($separator, $s1);
        echo "<tr>\n";
        for ($i=0; $i<$count; $i++) {
            if ($header) {
                echo "<th bgcolor=\"#eeeeee\">$array[$i]</th>";
            } else {
                echo "<td>$array[$i]</td>";
            }
        }
        echo "</tr>\n";
        $header = false;
    }
    echo "</table>\n";
}
?>
</head>
<body>
<?php
$items = <<<ITEMS
名前|デスクトップ|リリース予定
Ubuntu 11.04|Unity|2011-04-28
Fedora 15|Gnome 3|2011-05-24(2011-04-19 Beta)
Mandriva 2011|KDE 4|2011-06-13
ITEMS;
put_table($items, 3, "|");
?>

</body>
</html>

みたくヒア・ドキュメントにしてセル数とセパレータ指定にしてみた。
ヒア・ドキュメントなら後で書きたしや書き換えをやりたくなっても簡単だ。

PHP は HTML 中にそのまんま書き込めるから楽でいいよね。
まぁ言語仕様はどうかとは思うけど…

しかし次の Linux はドレでいくかなぁ?
GTK+ 3.0 がやりたいので Fedora にしたいけど初版は不安定かもしれないし…