投稿

6月, 2013の投稿を表示しています

SQLite3とphpのPDOを使用した、DBテーブルの自動作成

構築中のWebサイトに、SQLデータベースを導入することにしました。

今回のWebサイトは友人と分業して作っているため、Ubuntuで開発したあと、ソースツリーだけコピーしてxampp環境でテストできなければなりません。
「できるだけ導入作業がいらない」(というか事前準備がない)のが大事、ということになります。
つまり、DB側であらかじめテーブルなどを作成する必要がないように作りたいのです。

普通、商業サイトなどを作る際は、DB環境構築は一回きりなので、自動化などがされていない場合もあるようです。

データベースの自動セットアップ PHPコード側は、「PHPプログラミングの教科書」様のデータベースを自動セットアップ(テーブルを自動作成)するには様の通りにすればよいです。

PHPからSQLite接続してテーブルを作成したら、.sqliteファイルが作成されます。

データベース操作関数にPDOを使うようにしておけば、mysqlなどへの移行も比較的簡単になるそうですが、いずれ移行することをねらうなら、実際にMySQLで試したほうがよいと思います。

一番下にPHP(PDO)によるサンプルソースがあります。

SQLiteの導入 Ubuntu 主にWorld Wide Windblue様のページを参考に。必要パッケージを導入します。
sudo apt-get install sqlite3 php5-sqlite
「2.適当なディレクトリにDBを作成してみる」に書いてあったDBファイルの作成手順ですが、私の環境と違うのか、ただSQLiteに接続して終了するだけでは、.sqliteファイルは作成されないようです。

結果的に事前に.sqliteファイルの作成は不要だったので、問題なしです。

ただし、.sqliteファイルを作成するディレクトリの権限を変更する必要があります。
chmod a+w indbfile/

PHPコードからsqliteにアクセスして、DB作成したら.sqliteファイルも問題なく作ることができました。

xampp xampp v3.1.0にて、特に設定することなくsqliteを使うことができました。
これはかなり良いです。

TIPS:「カラムを書き込もうとしたらSQLiteのDBからテーブルが消えていた」場合 SQLiteはいろいろ気が利いている、と聞いてい…

XAMPP環境における日本語ファイル名の文字化け解決法

イメージ
前置き WebページのPHPコードをUbuntuで書いているのですが、テスト環境としてxamppでも動かすことになりました。
開発をスムーズに進めるために、Linuxとxamppで同一ソースを使える必要があります。






xampp環境は、Ubuntuよりも前衛的というか、Ubuntu環境がスルーする非推奨な関数などに対して敏感なようです。Ubuntu環境では問題ないPHPコードでも、エラーメッセージを出してくれます。
(面倒ではありますが)ソースコードから非推奨な関数や書き方を取り除く良い機会だとも思ったので、エラーメッセージに対してひとつずつソース修正を行うことにしました。
たぶん、xampp でデバックするコツは、検索ワードを「エラーメッセージ+エラーを起こした関数名」にすることかなと思います。
たいていの問題は、解決法がWeb上にありました。検索すればこれぞというページが出てくるので楽でした。


ところが、「日本語ファイル名の取り扱い」で、突然立ち往生することになりました。
xammp環境でPHPを使ってファイルを読み書きすると、ファイル名が文字化けします。この現象について書かれたページを探したのですが、見つけた対処法がどれも効きません。

・「php.iniを書き換える」という対処法があるのですが、自分の環境では上手く行きませんでした。
また、できれば変更はプロジェクトディレクトリの中で完結させて(バージョン管理システムで管理できるから)、環境設定はできるだけデフォルトから変更せずに済むほうが良いです。

・解決法の中には「出力をSJISにします」というものもありました。
PHPの内部エンコーディングはUTF-8が基本であり、UTF-8とSJISをソース内で混在させたら、それこそ私の手に負えない複雑なコードになりそうです。
それを避けようと思ったら、すべてをSJISに統一するしかありません。index.phpもHTMLソースもcharsetも、すべてSJISを指定して書くことになります。でも、この解決法は完全に「Windows環境で開発する」ことを意味していると思います。
わたしの場合、メインの開発環境はUbuntu Linuxで、サーバもUNIXの予定です。Linux環境でテキストはUTF-8ですし、HTMLソースやcharsetを書き換えるのも面倒です。

Knotterを使ってみた。 トポロジカルなデザインツール

イメージ
Knotterは、セルティック ノット(Celtic knot)デザイン専用の画像エディタです。
セルティック ノットを日本語でどう訳すのかよくわかりませんが、「ケルト縄風デザイン」 とでもすれば良いのでしょうか。

Libre Graphics Worldの記事(英語)でKnotterが取り上げられていて、興味が湧いたので触ってみました。
英語で探しても情報がほとんど見つからず、不明な点も多いですが、現在わかっていることをまとめています。

試したバージョンは knotter_0.9.3-2_amd64.deb (2013年6月当時の最新版)。
環境は Ubutnu13.04-amd64です。


インストール インストーラへのリンクが公式サイトにあるので環境に合わせて選択。
ソフトウェアセンターでインストールすると、「インストールに失敗しました」とダイアログが出ますが、問題なく起動します。
(追記 注: パッケージマネージャが不具合を起こしてアップデートなどができなくなります。knotterをアンインストールすれば解決します。)


基本操作 何はともあれ、Edge Loopツールを選択して書いてみます。

とりあえず書くだけならばLibre Graphics Worldの記事(英語)でもリンクされている動画が参考になります。


出てくるものが「角」ばかりなので、言葉と意味の対応づけに気をつけないと混乱します。
・knot(縄)
設定されている縄の性質(「柔らかい・硬い」的な)で、角の形がどうなるか決まります。
Knotterが縄だけを書く専用ツールなので、「この画像で使うedgeのデフォルト設定」 くらいの理解で良いのかもしれません。

・edge(角)
エディタ上では赤いドットで表されている部分のことです。
・cusp(先端)
edgeの形状を指すようです。

 記事でも取り上げられていた星型の先端(star cusp)の作り方ですが、Selection Styleの項目StyleでStar Cuspを選択するだけです。


 Style以外の設定項目
 ・Curve
  角の両脇にある出っ張り部分の、膨らみ具合を調節できます。
 ・Gap
  描画線が重なる箇所の余白サイズを調節できます。
 ・Angle
  ガイドの角の角度と描画される角の角度の関係をあらわしているようで…

Ubuntu13.04で使える動画編集ソフト一覧

イメージ
タイトル通り、Ubuntuで使える動画編集ソフトウェア一覧です。
2013年5月にUbuntu 13.04でインストールを検証しています。


なお、Linux環境で使える動画編集ソフトウェアの一覧としては「玉虫色に染まれ!」様のページが大変よくまとまっています。
2008年の情報ですが、字幕やマルチトラックなど、実際の動画編集を行った感想が載っているので、動画編集ソフトウェアを選ぶ際には目を通すべきです。
Linuxで使える動画編集ソフト(その1)
 紹介ソフトウェア:kino / Avidemux / Stopmotion / PiTiVi
Linuxで使える動画編集ソフト(その2)
 紹介ソフトウェア:kdenlive / Open Movie Editor / LiVES


紹介されている以外にも、以下のソフトウェアが存在します。
そうはいっても、用途が違うソフトウェアもあり、動画編集ソフトとしてはFlowbladeが一押しといったところです。
luciole / Cinelerra / toonloop / Flowblade Movie Editor / ffDiaporama

紹介順は基本的に、見比べやすいように上記の「玉虫色に染まれ!」様に準拠しましたが、Open Shot Video Editor / Open Movie Editor / Cinelerra / Flowblade / ffDiaporamaに関しては、ソフトウェアセンターからインストールできないため、この記事の先頭で紹介しています。


各ソフトウェアごとに、名前・アイコン・スクリーンショットを用意し、インストール方法・検証・感想をつけました。

とりあえずすべてのソフトウェアで、動画再生できるか検証しています。
検証で使った動画は、H246/AAC 形式です。(「よくわかる現代魔法」ノンテロップOP  再生時間 1分30秒, Container:MPEG-2 Transport Stream, サイズ:1920 x 1080, オーディオ audio/x-private-ts-lpcm)
インポートと再生(サウンド出力含む)ができるかどうか検証しています。
ただし、今回紹介するソフトの一部は、普通の動画編集ソフトではないため、検証の対象外となっています。
本来なら検証は動画のインポート…

ひとつのボタンから複数の情報を送る (HTMLでPOST、そしてhidden)

イメージ
formでユーザの入力やファイルを送信する際、IDを付与したり、送信した情報を紐付けるか、などの情報を一緒に送信したい場合があります。
その場合、ID情報はブラウザに表示しないのがベストです。ユーザに見せたり、編集してもらう必要はありません。

 わたしの場合、10個の画像が並んだ画像一覧ページで、画像ひとつずつにコメント欄があり、どの画像に対するコメントなのか特定する必要がありました。




追記:「fancyBoxで装飾したフォームからPOSTを送信する」方法とサンプルコードを公開しました。


formによる送信は、送る側でnameとvalueを指定すると、受け取る側で$_POST連想配列の中身として情報を受け取れる、という仕組みになっています。
例:
送信する側 (HTML)
    <input name="name" value="string value or other.">
受信する側 (PHP)
    $inValue = $_POST["name"];

今回の場合、情報をまとめて送り、受け取る側では、$_POSTを配列として扱うことで、
    //画像に対するコメントを保存
    saveComment ($_POST["imagename"], $_POST["comment"]);
などと書きたいわけです。

これを実現する方法として、 inputタグのtype="hidden" を使います。
ユーザを惑わせることなく、複数の情報を同時に送信できるようになります。


なお、検索すると、JavaScriptでpostするという解決法が出てきますが、そんなに大げさなことをする必要はありません。(それに、JavaScriptが無効にされていたら情報が送信できなくなります。)


POST(GETでもよいですが)で送信する側 HTMLで以下のように書きます。
例:
    <form action="capture_post.php" method="post">
        <p>
        コメント:<br>
        <input type…

SQLデータベース:ソートしてから特定順位のカラムを取り出す

なお実行環境はPDO(Ubuntu13.04のPHP)+SQLiteです。

仮定:
アップロードされた時間でソートされたn番目の行からファイルIDを取得したいとします。

アップロードされたファイルの情報を、データベースに格納しています。
ファイルごとに、一意なIDとしてid、アップロードされた時刻としてuptimeが記録されています。
テーブルはfilesTable、id,uptime列(それぞれidがinteger型、uptimeがtimestamp型)
テーブルにはその他にファイル名なども記録されていますが、今回は関係ありません。

アップロードされたファイルは、DB中ではIDで管理します。 ファイル名FromID ()やIDFromアップロードの順番 ()などの関数がPHPソース内で散見されることになる予定です。



3行目のIDを取得するなら、こんな感じです。
SELECT id FROM (SELECT id, uptime FROM filesTable ORDER BY uptime) LIMIT 1 OFFSET 3;

 実際には、アップロードされた順に使う(表示するとか)と思うので、
SELECT id FROM (SELECT id, uptime FROM filesTable ORDER BY uptime DESC) LIMIT 1 OFFSET 3;
 として降順に並べ替える使い方になると思います。


このSQLクエリーができるまで おまけです。

まずは、「テーブルからなんか取り出す」レベルの適当さで、最低限のクエリーを書きます。
SELECT * FROM filesTable;

上の例ではすべての列を取り出しますが、必要な情報はidとuptimeだけなので、そのようにします。
SELECT id,uptime FROM filesTable;

アップロード時間でソートする必要があるので、ソート関数を探してきて、くっつけます。
SELECT id,uptime FROM filesTable ORDER BY uptime;

ここから混迷した探索の時間。(主にネットからコピペしたSQLクエリーが動かない)
"OFFSET 1*2" などとするのですが、OFFSETは環境によって記法が違うとのこと。
PDO環境ではLIMITの後…

たった2行で外部ライブラリも使わずにPHPだけでテンプレートを実現する

PHPの基本機能だけでテンプレートっぽいことを実現します。
 使用するPHPの関数は、file_get_contents ()とprintf ()だけです。

この手法のメリットとしては主にこのようなものがあります。
・ページ本体のソースが読みやすくなる
・テンプレート化した部分を、他のページで使いまわすことができる

テンプレートエンジンを使わないことには以下のようなメリットがあります。
・素のhtmlに近い形で書けるようになり、読み書きが楽になる
・導入の手間がかからない
・新しくテンプレートエンジンの文法を覚えなくてよい
・余計な不具合を持ち込まずに済む
・不具合が起きても、仕組みが単純なので原因特定が容易

もちろんデメリットもあります。あまり複雑なことができません。

いろいろ工夫はできますが、もう少し複雑になったら、テンプレートエンジンか別の手を検討すべきです。しかし、ちょっとしたWebページなら、わざわざ追加のライブラリを加えて仕組みを複雑にすることは避けるべきだと思います。

個人的な事情として、「漏れのある抽象化の法則」(Joel on Software)に則って、必要な知識が身につくまでは、ライブラリの導入は避けて素のhtml+phpを使おうという方針の問題もあります。



実際の記述 読みこむ側が、file_get_contents ()でテンプレートを変数に読み込みます。
printf ()にテンプレートを渡せばokです。
例:
        $srcStr = file_get_contents("imgarea_templete.html");
        printf ( $srcStr, $imgUrl, basename($imgUrl));

テンプレートファイルの中身はこんな感じです。
例:(imgarea_templete.html)
    <div class="imgarea">
        <img src="%s" width=200 align=left><br>
        画像についてメモする<br>

            <textarea></textarea>

        …

PHPでアップロード可能なファイルサイズの上限値を取得する

PHPでアップロードファイルサイズの上限値を設定する方法は見つかるのですが、設定が反映されているかどうかを確認する方法が見つからないので関数を書いてみました。
PHP側で最大ファイルサイズを取得すれば、.htaccessやapacheサーバ設定の兼ね合いで実際の上限値が思った値になっていなかった場合でも、そのことが簡単にわかります。

具体的には、アップロードページで「『アップロードできるファイルのサイズは20MBまでです』などと表示しつつ、実際には2MBのファイルまでしかアップロードできない」といったような、厄介な不具合を回避できます。

この関数を書くにあたって、Apptechs Blog様の.htaccessへのアップロード上限の設定方法から上限値を決める設定オプションを、PHPリファレンスマニュアルのini_get()関数から設定オプションの値を取得する方法とバイトサイズへの変換関数を、それぞれ参考にさせていただきました。


 PHPソース    //アップロードファイルサイズの上限を取得する
    function getMaxUploadSize(){
        /*アップロードファイルサイズの上限は以下の3項目のうちの最小値。
        通常は memory_limit > post_max_size > upload_max_filesize
        */
        $limit_max = (ini_get_bytes('post_max_size') < ini_get_bytes('upload_max_filesize') )?
                    'post_max_size' : 'upload_max_filesize';
        $limit_max = (ini_get_bytes($limit_max) < ini_get_bytes('memory_limit'))?
                    $limit_max : 'memory_limit';
        return ini_get($limit_max);
    }


    //設定オプションを整数…