PHP雑記帳 ITかあさん

ITかあさん

Laravel 5 collectionを使った必ず記号も含まれるランダムパスワード

str_ramdom()を使うより、もう少し強固な必ず記号も含まれるランダムなパスワードを生成したい

Laravel
Larvalで以下のようにするとランダムな10文字を生成できます。パスワードリセット時などに便利

echo str_ramdom(10);
//Aek3Gkfk89

ただしパスワード設定の仕様がもう少し強固で、

  • 必ず半角大文字と半角小文字が入る
  • 数字を一つ以上含む
  • 記号を一つ以上含む

という「必ず大文字や数字や記号をそれぞれ含めなければならない」というルール縛りがあるとただランダムな文字列を生成するだけでは足りない場合があります。
(生成された文字がただのランダムだと、大文字や数字が一切含まれないということは当然発生しうる)

必ず仕様に乗っ取る強固なパスワードを生成する手順

      a から zの小文字配列をランダムで生成して指定数 配列を抽出
      Aから Zの小文字配列をランダムで生成して指定数 配列を抽出
      0から 9の整数を配列をランダムで生成して指定数 配列を抽出
      パスワードに使える記号を配列に。指定した数だけ 配列を抽出
      1~4までの手順で生成された配列を合体
      5の手順で合体した配列を文字列に変換し、シャッフル

4番目の記号は以下の通りとした

! $ % & ‘ ( ) * + , / ; < = > ? [ ] ^ { } ~

ランダムにいきなりとりだすのではなく、半角英字と数字、記号をそれぞれ別々に取り出してから 合体させて 最後にシャッフルすること。

Laravel5で 必ず数字や記号が含まれるランダムなパスワードの生成の例


CollectionはLaravelで配列からいい感じに配列を抽出できるヘルパーです。

ついでに非Laravelerの人へ捧ぐ、同じような強固なパスワード生成


array_flipは優秀だということがわかった。

MongoDB×PHPでAutoIncrement を実装する

mongoDB

MongoでMySQLのような AutoIncrement は実装できるか!できます!

mongoに新しくレコードが追加されるたびにuuidが追加されるので、識別するには困らないですが管理ようにAutoIncrement で数値で管理したい場合もありますねー。そんな時にはAutoIncrement 用の counter用のコレクションを追加してあげましょう。結構簡単にできました。

mongo コマンド

db.counters.insert({“_id”:”itemid”, “seq”:new NumberLong(1)});

これで、 counters コレクションにitem のAutoIncrementが保存されるドキュメントが作成されました

作成されたドキュメント

>db.counters.find()
{ “_id” : “itemid”, “seq” : 1 }

シーケンス番号発行するClass


MongoCollection::findAndModify
findAndModifyを使いって、countersのseqを取得。さらにseqに1をセットで次の連番に備える。

新規ドキュメント追加の際、 現在の item IDを調べてセット


countersから現在のitemidのseqを取得してセットするだけ。
こんな感じで”_id”に連番が入ります。

db.items.find();
{ “_id” : 1, “title” : “hoge”, “user_id” : 1, “created” : “2015/12/31 11:59:59″}

countersも確認。。

>db.counters.find()
{ “_id” : “itemid”, “seq” : 2 }

まとめ

countersコレクションは一つのコレクション以外に itemid以外の名称をつければ、itemコレクション以外にもAutoIncrementは複数設定してあげることができます。

ITかあさんが2015年入ってから超絶お世話になっている技術書

超絶お世話になっている技術書・参考書

プログラミングには少し離れつつある今日このごろですが、プログラミングは忘れたくない!
けども設計書・ドキュメントはどんどん書く!
そんな母さんが最近超絶お世話になっている本を紹介したいと思います。

Web API: The Good Parts

WEBAPI初めて作るなら絶対読むべき一冊!

最近WEBAPIを作る機会が増えましたが、以前はめっきるAPIは利用する側で開発する側ではありませんでした。
APIの戻り値は?POST?GET?え?何 PUT?PATCHにDELETE?
知らないメソッド、URIはどうするべきか
「APIとは?」という初歩の初歩から書いてあるので、APIの良い設計とはナンなのかを生まれて初めて設計する人にも分かり易く書いてあります。
プログラミングの仕方が書いてあるわけではなく、戻り値はどうあるべきかなどの設計に関わる部分がほとんどを占めていますので、利用言語については何でも問題ないでしょう。とにかくいい本!今は暇さえあればこの本ばかりを眺めて常にAPI設計の参考にしています。

CakePHPで学ぶ継続的インテグレーション

CakePHPに限らずWEBエンジニアなら必読の今時開発環境について網羅!

そうだ、Jenkins勉強しよう!
そう思ったらなぜかCakePHP本に出会ってしまった!
私の現在の開発環境はvagrant環境に構築したCentOSにCakePHPをインストールし、バージョン管理はgit。テストにSelenium。今よく効く継続的インテグレーションのツールを網羅しているのでCakePHPユーザー以外にもぜひともオススメしたい本。既にVagrantもgitもSeleniumも使っていますが、もっと早く出会っていたかったなあ!という本。
CakePHPの入門書とは全く違う切り口なので、CakePHPの入門レベルを終えてから手にとるべき本。もちろん現在別のFWでPHPを使っているユーザーならすぐにでも読むことをオススメしたい本です

実践 Selenium WebDriver

待ってました!Selenium WebDriverの本!

先日春のJavaScript祭を行った際、私の持ちネタはSelenium WebDriver×Node.jsでした。Selenium IDEはブラウザのアドオンとしてブラウザにJavaScriptを埋め込んで動作させるものでしたが、各ブラウザごとのWebDriberをインストールすることでブラウザの細かい挙動のチェックも出来るようになります。
複数のブラウザを平行で立ち上げて処理速度をチェックしたり、正しく挙動するかのチェックが出来ますから今までテストをFirefoxのブラウザで出来ていたことがChromeでもIEでもiPhoneのスマートフォンブラウザのチェックも出来るようになります。
本書はJAVAベースでの解説になりますが、全体的な基礎知識にぜひ読んでおくのがオススメ。

オススメ本は以上になります。

プログラミングにやや離れてしまった感はありますが、やっぱり技術書開いた時のワクワク感が大好きです。
またオススメ本があったら紹介したいと思います。

WEB API利用者・開発者必須アイテムChromeアドオン DHC を使ってみたよ

WEB API利用者・開発者必須アイテムChromeアドオン DHC

DHC

マツダさん、APIツカウならコレ ツカッテ

Chromeアドオン DHCは某国のエンジニアに教えてもらったよ。

Choromeアドオン DHCとは

DHC UI

公開されているWEB APIを叩くためのツール

世の中にはたくさんのAPIが公開されていて(現在公開されているAPI一覧【2013年版】
APIの開発を開始する前にAPIからの戻り値を正確におさえるためには仕様書レベルではなくて実際にAPIを叩いて正確に理解したい。
そんな時に使えるのが今回のChromeアドオンであるDHCです。

DHCのインストール

アドオンをインストールするだけ。

設定>拡張機能>他の拡張機能を見る>DHCを検索

DHCの使い方

アプリ一覧よりアドオンのDHCを起動

APIのURIを記載して、実行するとAPIから戻り値が受け取れます

今回は図書館検索、本の貸し出し状況を確認出来るカーリルAPIっていうので試してみたよ

APIのURLを記載してsave

URIを設定APIの保存

APIのURIを設定して、一先ず保存

サイドメニューに保存されているAPI一覧

保存すると サイドバーに保存したAPIが表示されているので、再度呼び出す時に便利

DHCからAPIを叩く

sendボタンを押してAPIを叩く

sendを押すと、レスポンスが返ってきます

APIでの戻り

レスポンスヘッダと、戻りがXMLなことが分かりますね。

詳細なパラメータを追加

APIには詳細なパラメータが出来るものがあります。今回使ったカリールというAPIも様々なパラメータを付けて、より詳細なデータや、自分の欲しいデータを検索して返すことが出来ます。
それらのパラメータをDHCにセットして叩いてみます。
詳細なパラメータを渡す

戻り値はXMLとJSON形式で選べるようなのでJSONに。なおKeyは仮のデータです。もしこのAPIを使いたい場合はAPI登録の申請を行って下さい。

レスポンスがJSONデータになった

レスポンス結果がJSONになりました。戻ってきた値の詳細についてはAPIの仕様書をご確認下さい。

GET以外にもリクエストは色々

色々なリクエスト

リクエストはPOSTやGET以外にも色々あります。もちろんそのAPIが対応していなければ400のエラーステータスしか返ってきませんが、色々APIを叩く時に試してみるといいと思います。

APIを利用して開発する際いはぜひ使いたい

APIを使って開発する時はもちろん、APIの設計やテストにもぜひ活用していきたいと思います。

PHPでxmlファイルの作成方法を今更なんだけどメモっとく

PHPでxmlファイルの作成方法を今更なんだけど詳しく書いておこう

気がついたら寝落ちして朝になってました

明日勉強会なのに、気がついたら寝落ちして朝になってました、ITかあさんです。

今度の勉強会で、公開されてるJSONデータを毎回取得して整形すると表示速度的によろしくなさそうなので、取得したデータをXMLにしてファイルを生成する処理をしました。

今更なんですが、PHPでXMLを生成する方法をメモしたいと思います。

完成したXML

今更なんですが、XMLは自分で好きに要素や属性値を決めることが出来ます。

<?xml version="1.0" encoding="UTF-8"?>
<conditions>
<condition>
<itchyEyes>
<itchyEyes4>0</itchyEyes4>
<itchyEyes3>0</itchyEyes3>
<itchyEyes2>0</itchyEyes2>
<itchyEyes1>0</itchyEyes1>
<itchyEyes0>0</itchyEyes0>
</itchyEyes>
</condition>
</conditions>

生成するPHP

このPHPと同じ階層にXMLファイルを生成します。

$dom = new DomDocument('1.0', 'UTF-8');
// appendChildでconditions属性作成
$conditions = $dom->appendChild($dom->createElement('conditions'));
//$conditionsに対してappendChildしてcondition属性を作成
$condition = $conditions->appendChild($dom->createElement('condition'));
//以下同様に新たに属性値を作成する
$itchyEyes = $condition->appendChild($dom->createElement('itchyEyes'));

$itchyEyes->appendChild($dom->createElement('itchyEyes4', '0'));
$itchyEyes->appendChild($dom->createElement('itchyEyes3', '0'));
$itchyEyes->appendChild($dom->createElement('itchyEyes2', '0'));
$itchyEyes->appendChild($dom->createElement('itchyEyes1', '0'));
$itchyEyes->appendChild($dom->createElement('itchyEyes0', '0'));

//XMLを整形してから出力処理
$dom->formatOutput = true;
//保存
$dom->save('kafun.xml');

これで同じ階層にxmlファイルが生成されます。

PHPを勉強するならこれだけは言いたい!PHPのオススメ勉強法

ほぼ独学でPHPerになったITかあさんが言いたい、PHPのオススメ勉強法

PHPのオススメ勉強法
エイプリルフールですが、これと言って嘘の予定はありませんITかあさんです。いつかはこんなことを書いてみたかった

PHPのオススメ勉強法について

やや長文になりますが、WEBデザイナーからほぼ独学でPHPerになったITかあさんの目線から色々PHPの勉強について語ってもよいでしょうか?

個人の価値観、他言語のプログラマーがPHPを勉強する際では状況も異なると思うので、ここでは

他言語の経験がゼロでPHPを学ぶ人を対象に

語りたいと思います。

そもそもPHPっていうのはナゼ動くか

ApacheとPHP
WEBデザイナーのころはイマイチPHPの仕組み自体よく分かっていませんでした。

Apacheが動かしているんじゃないの?

と思っていましたが、

ApacheはWEBサーバー

のことで、URLを叩いたらHTMLが表示されたりする「WEB環境の基本」です。

もちろん、WEB環境としてのApacheが起動していないとそもそもPHPも動かないのですが、
「PHPをサーバー上にインストール」しているからこそPHPは動くのです。

PHPはサーバーサイドスクリプト

サーバーサイドスクリプト

なんて言葉を聞いたことがあるかもしれません。PHPはこのサーバーサードスクリプトの一種であります。
Webでプログラムの実行が要求されて初めてその結果をブラウザに対して送信されます。
つまり、

ユーザーがフォームの送信ボタンを押したり、ブラウザを開いたりして初めて動く

それがPHPなのです。

PHPで出来ないこと

PHPは『WEB専門言語』であって、『サイトのユーザーの要求に対して』結果を返すため、例えばブラウザが全く開かれていないなど、一切の要求が無いと勝手に動くことはありません。

このため、PHPだけで『全自動』なプログラムを作ることが出来ません。その場合はサーバーに定期実行をさせる『cron(クーロン)』を設定させる必要があります。

そのことからも、PHPでWEBプログラムをするに当たっては多少のサーバーの知識も必要になってくるのです。

なぜPHPはよくdisられてしまうか

ITかあさんで大川さんの写真使ったのは初めてだな~
他の代表的なサーバーサイドスクリプトに
JavaやPerlやRubyなどがありますが、どの言語も汎用性があり、WEB以外にも使うことが出来ます。それに対しPHPはWEB用であり、PHPを使ってソフトウェアiPhoneアプリやWindowsアプリを開発することは出来ません。
あくまでもWEBアプリケーションしか作れないのです。

ソフトウェアという単語はよくありませんでした(WordPressもブログソフトウェアですしね)、訂正

しかもPHPは他言語に比べて習得が容易であることからも『え?あなたPHPしか出来ないの?』とたまにdisられてしまうんです。

簡単に習得出来るのは、非常によいことだと思うのですが・・

PHPは簡単か?(いや、そうでも・・)

私は最初から職業がプログラマーだったわけではなく、WEBデザイナーからだんだんWEB系のプログラマーにシフトしていきました。(このブログが始まったばかりころはまだWEBデザイナーだったんですよ)

どういう要求が来ても、対応出来るようになったのが本格的にプログラミングをやって2年くらいかかりました。

プログラム全く何もしらない未経験の人からすると、

決して簡単ではないよね、PHP・・・

って感じです。

ズバリ、完全に独学することは可能か?

プログラミングの勉強ってお金かかりますよね

PHPに限らず、プログラミングのスクールに通うのはお金かかりますよね

私はPHPを勉強したのは

ほぼ独学

と言っており、実は全てが独学ではありません。

PHPを学ぶ上で苦労したところ、独学では難しいところ

配列が分からない・・

参考書の構文解説などで配列について項目がありますが、私は配列が本当に分からなかったです。

特に連想配列の意味が分からない

連想配列の意味が分からず、ここは苦労しました。
私が愛するCakePHPもそうですが、SQLでデータベースの情報を要求すると連想配列で結果が返ってくるので連想配列が分からないとPHP+データベースで何か大規模なプログラムを作ることは出来ません。

逆を言えば、連想配列さえちゃんと理解出来れば後はGoogleで検索すれば自然と答えが見えてきます。

一から十まで全てをスクールに通うとお金もかかり大変ですから、
小規模な相互リンク管理のプログラムをPHP+Mysqlで作ってみるまでの簡単なフローをプログラムの家庭教師を雇って教えてもらうといいかもしれません。

ちなみに私は某スクールに3万円ほどでこの一連のフローを学びました。

構文や関数何を覚えればよいか

構文は全て覚える必要なし!

PHPの構文はたくさんありますが、基本3つが使えればOKです。

if文
foreach文
for文
while文・・・たま~に使う、くらいかな~

配列を扱うに当たり、foreach文とfor文の2つをマスター出来れば基本的なWEBサイトのプログラムを作ることは出来ます。
特に

foreach文を完璧に理解する

ことに私は苦労しましたが、逆を言えばそこだけ誰かに教えてもらえればどうにでもなりそうです。
(foreachだけどうにか出来れば、けっこうどうにでもなりそうですね)

あ、私関数は何一つまともに覚えてないですw

関数は都度Googleで検索すればよいので、関数は覚える必要は何一つありません。

PHPを勉強するならレンタルサーバーで!

さくらのレンタルサーバーが一番オススメ

PHPを勉強するにあたり、私はぜひレンタルサーバーで勉強されることをオススメします。
なぜITかあさんはレンタルサーバーで勉強することをオススメしたいかというと、

レンタルサーバーならPHPの環境が全て整っているから!

PHPをこれから勉強しようという人がサーバーをゼロから構築するのは現実的ではないですし、ローカル環境という選択もありますが、
環境設定を自分で整えたり、メールの環境を整えなければなりません。
(PHPの入門書で最初のローカル環境の設定に何十ページもとっていたりするんですよ!)

PHPの勉強をするために、その場だけのローカル環境を準備するのは時間がもったいないし、レンタルサーバーの環境に満足できなくなっるくらいPHPの学習が進んでから VPSなどを借りてサーバー構築されるのがいいと思います。

500円くらいのレンタルサーバーであればcronスケジュールを登録出来るものもありますし、最近のレンタルサーバーは専用サーバー並みに環境が整っています。

訂正しました

レンタルサーバーについて 素人スクリプトを公開するのは他の人にも迷惑をかける恐れがあるのでそれは止めたほうがよいとの意見を頂き、
この件は訂正させて頂きます。また、サーバー屋さんも『プログラムデバックの禁止』をしているところが多いことからも良い意見ではなかったと反省しています。

PHPを勉強するにあたり、オススメの書籍

本は2冊容易するのがベスト

PHPを勉強する=Mysqlとの連携
があるでしょうから、PHPの入門書とMysqlの入門書2冊あったほうがいいです。
ITかあさんがボロボロになるまで愛読したPHPの入門書はこれ!

PHPのオススメ解説本

全体的に文字も大きく読みやすいです。PHPの入門書は余計な解説に終始するものが多いのですが、『必要なことだけ』しっかりまとまっている本です。

ただ、Mysqlがコマンドプロンプトから行う形になっており、Mysqlを扱うなら「phpMyadmin」を選択する方法もあるので初心者の方はMysql部分の解説は難しいかもしれません。本全体の2/3に当たるPHPの解説が大変読みやすいです。

Mysqlのオススメ解説本

PHPの解説本はPHPの解説本で、Mysqlの解説本はMysqlの解説本で分けたほうがいいです。1冊にまとめた本も多いのですが、1冊にまとまっているということはどちらの解説も中途半端に終わる可能性があるためそれぞれ分けることをオススメします。

PHPを勉強するに当たり、何から手をつければよいか

とりあえずPHPが出来るようになりたい

そう、思っている人も多いと思います。実際私もWEBデザイナーのころからそう思っていて、

WEBにおける全ての工程を自分一人で出来るようになりたい!

と思っていました。

いきなりPHP+Mysqlの大規模サイトはしんどいですから、小さいものからコツコツ作ってレベルアップしていくのがいいです。

CSVファイルのPHP出力

まずは超単純なCSVファイルをPHPの配列を理解する上で、連想配列ではない、一列の配列を出力してみるのがいいと思います。まずは配列出力の基礎の基礎ですね。

SESSIONを利用したメールフォーム

SESSIONを利用したメールフォームはプログラムの基本です。またWEBデザイナーの時には中途半端な知識のままフォームのコーディングをしていましたが、フォームをしっかり作れるようにならなければプログラムは作れません。
なお、このサイトでもPHPメールフォームの詳しい作り方を解説しています。

ログファイルベースの掲示板

掲示板にかかわらず、何らかのログファイルベースの掲示板や相互リンク管理を作るといいと思います。
PHPを学ぶ上でパーミッションに対する理解も必要なので、このパーミッションに対する理解が深まります。

ログファイルベースからデータベースに

ログファイルベースで作ったプログラムをデータベースで対応します。
SQLに関する知識はこの時初めて勉強するので十分です。

また、PHPでMysqlにアクセスする方法としてmysql_connect()などがありますが、実は私はほとんど使ったことがありません。絶対にそうすべき!と言うつもりはさらさらありませんが、PHPライブラリでPEARがあり

PEAR:MDB2

と、いうプラグインがあります。

これを使うとPHP+Mysqlの連携が容易になるし、結果が全て連想配列で返ってくるのでforeach構文が使いこなせればすぐにでもプログラムの構築が可能です。

しかも、PHPってフレームワークを使うようになるとまず自分でmysql_connectの関数を書く機会はありません。
このため、余計な知識を付けるくらいなら より簡単なプラグインを使うことをオススメしたいのです。

(ちなみにこのPEAR:MDB2はレンタルサーバーならほとんどがあらかじめインストールされており、自分で使うために設定することは何もありません。)

最後にオープンソースフレームワークを

ここまでの工程を踏んで、最後にオープンソースのフレームワークを使うと、これまでの知識が活かされてスムーズにフレームワークを扱うことが出来ます。(ぜひ、CakePHPをオススメしたいですっ)
私はほとんが仕事での実務でこの工程を踏んできました。私は半年でフレームワークを使うようになりました。あまり習得が早いほうではありませんでしたから、熱心な方は3カ月くらいで可能な人もいるでしょう

フレームワークを使うとMVC(モデル・ビュー・コントローラ)の概念が出来、フレームワークの仕様に乗っ取って「クラス」や「独自関数」も書くようになります。

これだけは言いたい!

よく

PHPを○○日で学ぶシリーズ

とかありますが、

んな数日で出来るか、ボケぇぇぇっ!!

と、声を大にして言いたいです。

配列を制す者はPHPを制す!

私に以前こう言って下さった凄腕のプログラマーがいました。今思えば全くその通りだったと思います。
事実 SQLでDBの内容を取りだしたら連想配列で結果が返ってくるので これを自分の欲しい配列の形に変換する作業はよく使います。

むしろ配列だけやっておけばいいんじゃないの?

と、いう気になるくらい、PHPでサイトのプログラムを作る時は配列の操作を行います。
(後は文字列の操作を行ったり、文字化けの対策もあったり色々ありますがやはりGoogleで調べて解決します)

PHPの入門書は数あれど

配列の重要さ、配列の大切さ、配列への理解を深める書籍

に私は出会ったことがありません。結局本だけで配列への理解を深めるのを諦めてその部分だけスクールで学びました。

配列だけ解説したところで非常に地味なので本としてはつまらないので売れないからだと思います。

なにもPHPに対して理解していなかった時は何となく

PHPって難しそう、でも出来たら何となくスゴそう!

と思っていましたが、実際実務で扱うと

地味!

なんですよ。

まだまだ自分自身 美しいPHPのコードを学んだり、より効率的な記述を模索している最中ですが、

私はPHPが大好き

ですし、よりたくさんの人に『PHPの楽しさ』を伝えていけたらいいかなと思います。

2013.04.02追記

一晩で250近くもハテブを頂くとは思わず、『いい意味』でも『悪い意味』でも反響を頂きました。
誤りの部分は真摯に受け止めるとして、本当に『ド素人』からWEB系のプログラマーとして独立した現在、

『自分がPHPを学ぶ上で本当に苦労したこと、配列の大切さ』を伝えたかったのです。

批判の意見も 私自身がまだまだプログラマーとして未熟な部分もあるからでして、自分自身もっと努力してPHPの楽しさを伝えていきたいと思います。

CKEditor×CKFinderで入力したテキストを、携帯端末にも表示させたい

CKEditor×CKFinderで入力したテキストを、携帯・スマートフォンサイトにも表示させたい!

CKEditor×CKFinderで入力したテキストを、携帯端末にも表示させたい
以前、テキストエリアのフォームパーツにリッチエディタ機能が導入出来る、CKEditorとCKFinderについて紹介しました。

こんな素敵なエディタ機能を意図も簡単に導入出来るわけですから、

携帯サイト・スマートフォンサイトにだって表示したいですよね!そうですよね!

なお、誤解の無いように先に言っておきますと、エディタ機能を携帯に導入するわけではなく、

CKEditorとCKFinderを使って入力したものを携帯・スマホに表示する方法

です。

え?CKEditorとCKFinderそのままでは携帯・スマホには不向きなの?

せっかく導入したCKEditorとCKFinderですが、携帯・スマホ向けに表示させるにはちょっとした工夫が必要になります。

携帯・スマホにはリサイズ画像を表示するよ!

CKFinderも合わせて導入すると、画像をアップロードした後にサーバーブラウザーにアクセスすると サムネイルが生成されます。

CKFinderの自動生成サムネイルを携帯・スマートフォンで使う

PC用で使った画像をそのまま携帯に表示させるのはちょっとね~・・
と、いうことで自動で生成されるサムネイルファイルを携帯端末用に利用してしまおう!

config.php

config.phpの97行目付近でメインで生成されるサムネイルの設定を行うことが出来ます。サムネイルサイズの設定はこちらで行えばOKです。

$config['Thumbnails'] = Array(
		'url' => $baseUrl . '_thumbs',
		'directory' => $baseDir . '_thumbs',
		'enabled' => true,
		'directAccess' => false,
		'maxWidth' => 150,
		'maxHeight' => 150,
		'bmpSupported' => false,
		'quality' => 80);
$baseDirで指定したフォルダの下に_thumbsフォルダを無ければ設置してパーミッションを777に。

携帯・スマートフォンの出力部分

後は出力部分。この出力時にコツがあり、$hoge[‘Model’][‘text’]の中にCKFinderからの画像も含まれるテキストだとしたら、

CKEditorでの画像スタイルを除去しつつ、画像のディレクトリをサムネイルフォルダに置き換えを行う処理は以下になります。
$hoge['Model']['text'] = preg_replace('/(\]+)(style\=\"[^\"]+\")([^>]+)(>)/', '${1}${3}${4}', $hoge['Model']['text']);
echo str_replace("/images", "/_thumbs/Images", $hoge['Model']['text']);

こうすることで、PC用に投稿された画像を、サムネイル画像に変換しつつ、重要なのが

画像スタイルの除去。

これをやらないと PC画像用に引き伸ばされたスタイルが当てられらままになるのです。

CKEditorの絵文字を携帯にも対応させたい!

絵文字機能がCKEditorには用意されていますね。本物の携帯絵文字に変換してくれるわけではないのですが、PC用には絵文字画像が表示されて、携帯では表示されないのは残念なので、対応させるには、以下のフォルダに

ckeditor/plugins/smiley/

_thumbs/Imagesフォルダを追加します。

ckeditor/plugins/smiley/_thumbs/Images

ckeditor/plugins/smiley/フォルダに、絵文字画像が全て含まれているので、ディレクトリの中身をコピーし、先ほど追加したこちらのディレクトリに設置すればOK!

ckeditor/plugins/smiley/_thumbs/Images

PHPとGDアップロードされる画像のファイルのピクセルサイズを取得

PHPとGDアップロードされる画像のファイルのピクセルサイズを取得

PHP×GD アップロード前にピクセルが知りたい
GDでちょっと便利だと思ったのでメモ。ようは、テンポラリからもファイルのピクセルサイズが取得できればよいよ、ってなわけ。

今回のミッション:サーバーにファイルをアップロード時にその画像のピクセルサイズが知りたい!

前回GDを利用したフォームから画像をアップロードした際に、自動でリサイズされるやり方を紹介したのですが、

サーバーにちゃんとアップされる前のテンポラリからもGetImageSize()を使えばアップロードしたい画像が何ピクセルなのか取得できちゃうみたい

です。便利便利。

HTML

<input type='file' name='image' class="file_1" id="file_up"/>

PHP

$size = GetImageSize($_FILES["image"]['tmp_name']);
print_r($size);

GetImageSizeの出力結果

Array
(
    [0] => 300
    [1] => 40
    [2] => 2
    [3] => width="300" height="40"
    [bits] => 8
    [channels] => 3
    [mime] => image/jpeg
)

これをうまく利用してあげれば、ユーザーからのファイルのアップロードに対して

明確に何ピクセル×何ピクセルの画像のみアップロードOKにする

な~んてことも出来ますね!

PHP×GD フォームからアップロード時に比率を変えずにリサイズ

PHP×GD フォームからアップロード時に比率を変えずにリサイズ

PHP×GD 比率を変えずに画像をリサイズ

今回のミッション!

PHP×GDで、フォームからアップロードされた画像を引き伸ばしなどされず比率を維持したままリサイズしつつ、
比率を維持した結果足りない部分は背景画像で補う!

と、いうのが今回のミッションです。

リサイズ例

希望した比率と合わないものは余白をつける
こんな風に、希望した比率と合わないものは、余白をつけ、1pxのずれもなく、希望通りの画像サイズになるようにGDを駆使します。

GDとは、画像をいい感じにリサイズしたり、フィルタをかけたり、Photoshopみたくレイヤー重ねたりしちゃうPHPのライブラリのことです。

画像アップロード用のフォーム

アップロード用のフォームはこんな感じ。
ファイルアップロードのフォームにはmultipart/form-dataをお忘れなく
(さっきうっかりフォームにmultipart/form-dataを入れ忘れて、アップロードされない!って焦りましたw)

<form method="post" name="company" action="./upload.php" enctype="multipart/form-data">
<input type="file" name="image">
<input type="submit" value="決定" />
</form>

アップロードされた画像を比率維持したままリサイズする upload.php

では、比率を維持したまま、リサイズしつつ、比率維持したことで足りない部分は白い画像で埋めるやり方です。

ポイント

余白がいくつ欲しい!と考えるのではなく、『絶対にこの大きさのサイズの画像を作りたい!』という画像を呼び出し、
その後リサイズした画像を下に敷くイメージで画像を作成すれば、確実に欲しい大きさの画像が作れます
  $dir = "./upload/";	//アップロード用のディレクトリ
if (is_uploaded_file(@$_FILES["image"]["tmp_name"])) {
  // ファイル名の文字コードを変換する
  $file1 = $dir.$_FILES["image"]["name"];
  // テンポラリファイルを保存ディレクトリにコピー
  copy($_FILES["image"]["tmp_name"],$file1);
  $rename = "image.jpg";
  rename("$file1",$dir.$rename);
  }
 $file1 = $dir.$rename;                        // 元画像ファイル
  
  $in = ImageCreateFromJPEG($file1);                        // 元画像ファイル読み込み
  $size = GetImageSize($file1);                            // 元画像サイズ取得
  
  
  $width = 300;                                // リサイズしたい画像サイズ(width)
  $height = 400;                                // リサイズしたい画像サイズ(height)
 
  
  $ratio_orig = $size[0]/$size[1];//元画像の比率計算
 
/*画像の比率を計算する*/
  if ($width/$height > $ratio_orig) {
  $width = $height*$ratio_orig;
  } else {
  $height = $width/$ratio_orig;
  }

/*画像の生成ここから*/ 
  $out = ImageCreateTrueColor($width, $height);
  ImageCopyResampled($out, $in, 0, 0, 0, 0, $width, $height, $size[0], $size[1]);    // サイズ変更・コピー 
  
  //出力先の画像を作成
  // 画像ファイル読み込み(ベース画像)
  //もしリサイズしたい画像の大きさが300px×400pxなら、その大きさの画像を準備
  $img = ImageCreateFromJPEG("./white.jpg");
ImageCopy($img, $out, 0, 0,  0,0, $width, $height); //ベース画像にアップロードしたリサイズ画像を合体させる
  ImageJPEG($img, $file1);                            //最後に合体した画像を保存して終了

//メモリ開放
  ImageDestroy($in);
  ImageDestroy($out);
  ImageDestroy($img);

PHPのfunctionで複数の値をreturnする方法

PHPのfunctionで複数の値をreturnする方法

CakePHPでcomponentsにfunctionを書いて、controllersにその値をreturnしよう、値は複数。

・・・あれ?どうやるんだったっけ?functionで値を複数returnしたいとき。

PHPのfunctionで値は複数返すことが出来ない

PHPはfunction内に複数の変数を入れて、その全てをreturnすることは無理なようで、どうしても複数値をreturnしたい場合は配列化して、リストで渡すとよいそうです。

function small_numbers()
{
return array (0, 1, 2);
}
list ($zero, $one, $two) = small_numbers();

PHPのマニュアルより

へ~、そうなんだ。覚えておこう。