2015年6月14日日曜日

Laravel5と郵便番号用ajaxのajaxzip3.js

Laravel5でちょっとしたWebシステムを開発することになった。ちなみに、2014年10月ごろにはLaravel4でWebシステムを開発した。Laravel4とLaravel5はフォルダの配置とデフォルトの設定が随分変わったので、最初かなり戸惑った。
 それはさて置き、 ajaxzip3.jsと郵便番号の話です。フォームに郵便番号を入れると住所欄に住所が入るWEBページがよくあります。自分で作らなければいけないと思い、日本郵便のページから郵便番号のファイルをダウンロードして、簡単なプログラムを書いて、郵便番号のデータをMySQLに取り込んだ。

<2015/6/14追加>
Google Codeがサービス廃止になり、Githubに移行したそうです。私のページも動かなくなったので驚きましたが、理由が分かれば、安心。
Github移行を機にこれまでhttp、httpsで分かれていたURLを一本化したそうです。
今後は、https://ajaxzip3.github.io/ajaxzip3.js に成ります。(http://でも使えるみたいですが、基本はhttps://です。)
今までは、http://ajaxzip3.googlecode.com/svn/trunk/ajaxzip3/ajaxzip3.js だった。下記の部分もこの部分は読み替えてください。書き換えてください。

その後Javascriptの見本が見たくて、Googleで検索したら、ajaxzip3 と言う、驚異的なページを見つけてしまった。  ajaxzip3.jsを使えば、もう自分で郵便番号を用意する必要はない。ホームページに書くコードも至極簡単だ。ヘッダーの中で下記:
http://ajaxzip3.googlecode.com/svn/trunk/ajaxzip3/ajaxzip3.jsを読み込み。
本文のフォームの中に下記のように書く(私が書いたコードで、余分に、class="eisu"とtype="tel"で英数字化、placeholder="453"でグレーの初期値表示、onKeyPress="return submitStop(event)で改行キーでの送信の拒否、を入れている)。データベースを3桁4桁にしているので、入力用フォームも3桁4桁に分けている。
<td>
<input class="eisu" maxlength="3" placeholder="453" onKeyPress="return submitStop(event);" name="zip21" type="tel" value="">
</td><td>
<input class="eisu" maxlength="4" placeholder="0042" onKeyUp="AjaxZip3.zip2addr(zip21,zip22,addr21,addr21);" onKeyPress="return submitStop(event);" name="zip22" type="tel" value="">
</td>
ajaxzip3の動作見本ページはここです。

ajaxzip3のURLを見ると、https://code.google.com/p/ajaxzip3/と、google.comのドメインになっている。ajaxzip3.jsの設置場所も、googlecode.comになっている。Google Project Hostingというページで、オープンソースをGoogleが応援しているようだ。Googleがこのようなことを行っているのははじめて知った。(上に追加で記したように、Google Codeはサービス廃止だそうです。)


LinuxのopenSUSEをインストールして、日本が使える設定をする

Linuxの派生の一つであるopenSUSEを熱心に勧める学生に、2015/5/23土曜日のOSC2015名古屋で出会った。openSUSEの読み方は「オープンスージー」かと思っていたら「オープンスーゼ」だそうだ。ちょっとダサいな。また、openSUSEのoは小文字であり、大文字のOpenSUSEは間違いだそうだ。くれぐれも、openSUSEと書くようにしましょうか。

OSC2015名古屋以来、openSUSEをインストールしようと思っていたが、6月13日土曜日の深夜にやっとインストールした。インストールは簡単だが、日本語が使えるようになるまで、2時間以上掛かった。openSUSEで日本語を使えるまでの手順を書いておきます。

ちなみに、openSUSEのインストールに使ったパソコンはFMV INSPIRON 710m。メモリ1.25GB。XPからWindows7にアップした後、フリーズに近い状態ばかりで使い物にならないので、CentOSでもいれようかと思っていたが、人生初めてのopenSUSEをインストールすることにした。


ではopenSUSEのインストールをはじめます。
1.openSUSEをダウンロード。710mは旧32ビットPC用(64ビット用ではない)

2.isoファイルをDVD-Rに焼く

3.DVDから起動後、インストール最初の頃に、F2ボタンを押して、日本語を選んでインストールを進める

4.インストールの最後の頃に、パスワードの管理システムうんぬんが出てくるけど、一応、自分のIDのときと同じパスワードを入れて設定しておくといい。理由は、後々、無線LANの設定で、このパスワード管理を設定しておけば、PC起動のたびに、無線LANにパスワードを入れる必要がなくなるので、ぜひ、設定しておくことを勧めします。

5.もう一つ、インストールの途中で、無線LANやLANの設定が出てくるが、710mの場合、何もせずに次へ次へ進んで、無線LANは何もしなくても稼動した。

6.openSUSEのインストールが一通り終了して、再起動後、openSUSEにデフォルトで入っているFireFoxとLibreOfficeを使ってみた。

7.残念なことに、openSUSEで日本語が入力出来ない。Googleで検索してそれに従うが、やはり、日本語入力はできない。

8.出来ないけど、とりあえず、必須の日本語環境の設定手順を書いておくと

9.左下緑丸のスタートボタンをクリックし ⇒ コンピュータを選択し ⇒ YaSTを選び ⇒ YaST2コントロールセンターを開き ⇒ システムを選び ⇒ 言語を選び ⇒ 第一言語を日本語に設定する。

10.スタートボタン ⇒ 最上段の検索枠に「ibus」と入れて、ibus設定を開く ⇒ 入力メソッドをクリックし ⇒ 追加ボタンをクリックし ⇒ 日本をを選び ⇒ Mazcを選ぶ(Mazc-jp Layoutではなないので注意) ⇒ 設定を見てみると、「ローマ字入力」「MS-IME(ATOKも使えるとはすごい)」でいいでしょう。

11.ここまで設定すれば、FireFoxやLibreOfficeで日本語が入力できると思ったのに、残念ながら出来ませんでした。

12.それを助けてくれたのがこのページ。openSUSE13.2で日本をを使うための最後の設定
どうするかと言うと、xmlファイルを一つ削除するのだそうだ。ただ、この解説ページは、今はそれをしなくても日本語が使えると書いている。それは間違いで、今もやはり、このxmlファイルを削除しないといけない。

13.スタートボタンから、「ターミナル Konsole」を開き下記の内容を入力
sudo rm /usr/share/ibus/component/kimpanel.xml
[Enter]キーを押下して削除後、ibusを再起動するかopenSUSEを再起動すると日本語入力が可能になる。

14.日本語入力が出来るようになると、上の写真の右上と、右下にあるように、オレンジ色で「あ」と「A」の切り替え表示が現れる。日本語が使えない状態のときは、このオレンジのアイコンがない。このオレンジのアイコンが最初の現れたときは、神様に出会った気がした。

■PCでLinux 使うならどれにするか。個人的には、openSUSEをインストールしてみて、PC用ならopenSUSE, CentOS, Ubuntuの順番だ。サーバーなら、CentOSにする。  以上



2015年4月26日日曜日

Laravel5で複数チェックボックスのバリデーションを行う、required_without_all

Laravel5で開発中に、複数checkboxのvalidationが必要になった。少なくとも一つにチェックをつけているかどうかをバリデーションすることになった。

Laravel5には、そのためピタリなValidation ruleがある。hoge required_without_all:foo,bar,...というvalidation ruleがそれだ。hogeは、hoge以外のcheckboxが全て未チェックなら、チェックされなくてはならない。それは、つまり、少なくとも一つがチェックされていなければならないことと同じになる。

複数checkboxをvalidateするための、Request.php、Controller.php、test.blade.php、testconfirm.blade.phpの実例をご紹介します。

test.blade.php
{!! Form::checkbox('service0', '人間', null) !!}人間<br>
{!! Form::checkbox('service1', 'チンパンジー', null) !!}チンパンジー<br>
{!! Form::checkbox('service2', 'ゴリラ', null) !!}ゴリラ<br>
{!! Form::checkbox('service3', 'オランウータン', null) !!}オランウータン<br>

testconfirm.blade.php
{{ Input::get('service0') }}{!! Form::hidden('service0', Input::get('service0')) !!}
{{ Input::get('service1') }}{!! Form::hidden('service1', Input::get('service1')) !!}
{{ Input::get('service2') }}{!! Form::hidden('service2', Input::get('service2')) !!}
{{ Input::get('service3') }}{!! Form::hidden('service3', Input::get('service3')) !!}
// 戻るボタンで戻ったときに入力値を維持しているようにしている

Request.php
public static function rules() {
    return [
        'service0'=>'required_without_all:service1,service2,service3',
        'zip21'=>'required',
        'zip22'=>'required',
        'addr21'=>'required',
        'name'=>'required',
        'email'=>'required|email|confirmed',
        'content'=>'required'
    ];
}

Controller.php
// checkboxのチェックされなかった項目の特別な処理をする。 入力後、内容はメール送信している。
if(isset($input['service0'])){
    Session::put('service0', $input['service0']);
}else{
    Session::put('service0', '');
}

if(isset($input['service1'])){
    Session::put('service1', $input['service1']);
}else{
    Session::put('service1', '');
}

if(isset($input['service2'])){
    Session::put('service2', $input['service2']);
}else{
    Session::put('service2', '');
}

if(isset($input['service3'])){
    Session::put('service3', $input['service3']);
}else{
    Session::put('service3', '');
}


Laravel5のマニュアル http://laravel.com/docs/5.0/validation#available-validation-rules
 

2015年4月18日土曜日

input type="file"のカーソルを手指型にする

ファイルをアップロードする為の<input type="file" name="hata">は、ボタンにマウスを合わせたとき、カーソルの形状が矢印になる。
Web画面上でクリック可能を示すカーソルは、マウスを合わせたとき手指型が常識だと誰もが思っているだろう。なのに、ファイルアップロードのときのボタンはそうなっていない。

そこで、簡単にカーソルの表示を変える方法です。
cssファイルに、input.tegata { cursor:pointer; }と記述し、上記のhtmlを
<input type="file" class="tegata" name="hata">と書き換える。これで、ファイルをアップロードするときの参照ボタンにマウスを合わせると、カーソルが手指型になる。
ただし、chromeはだめなようです。

カーソルにはその他いろいろな型の指定があります。
cursor:pointer 手指型
cursor:default 矢印型
cursor:crosshair 十字型
cursor:move 移動用型
cursor:aouto  状況に応じて自動選択(初期値)
その他


PHP filter_var関数を使って、ログインをメールでもIDでも可能にする(Laravel5での開発で)

Laravel5で社内のシステムを開発するときに、ログインをメールアドレスでもIDでも出来るようにしたかった。そのとき使ったのが、filter_var関数。フィルタにFILTER_VALIDATE_EMAILを使えば簡単なスクリプトで、メールアドレスでもIDでもログインできるようになる。(ほとんど無いと思うけど特殊なメールアドレスには対応できません)

filter_var関数は、PHP5で使える関数で、指定したフィルタでデータをフィルタリング出来る。フィルタは、例えば、FILTER_VALIDATE_EMAILを使えば、メールの正しい型か否かを判断できる。その他、FILTER_VALIDATE_URL、FILTER_VALIDATE_INT、FILTER_VALIDATE_BOOLEAN、FILTER_VALIDATE_IP等がある。

下記がLaravel5で開発したときの実際のスクリプトです。

public function loginhandle(Request $request)
{
 // formのinputがメールかIDかを判定する。ここでfilter_varが役立つ。
 $field = filter_var($request->input('login'), FILTER_VALIDATE_EMAIL) ? 'email' : 'username';

 $remember = \Input::has('remember');
 if (\Auth::attempt([$field=> $request->input('login'), 'password' => $request->input('password')], $remember))
 {
  $admin = \Auth::user();
  return redirect('admintop');
 }

 return redirect('login')->withErrors(['error'=>'IDかメールアドレスかパスワードが違います']);
}

Laravel5用に書いたhtml部分(少し余分なものも入っているけど)
  {!! Form::open() !!}

    <input type="hidden" name="_token" value="{{ csrf_token() }}">

    {!! Form::label('login', 'メールかID') !!}
    {!! Form::text('login') !!}

    {!! Form::label('password', 'パスワード') !!}
    {!! Form::password('password') !!}

    {!! Form::submit('ログイン') !!}

    {!! Form::label('remember', 'パスワード保存') !!}
    {!! Form::checkbox('remember', '1', true) !!}

  {!! Form::close() !!}

参照:
PHPのドキュメント
楽に検証!値をチェックしてくれるfilter関数
filter_var関数でメールアドレスをバリデーションする



2015年4月5日日曜日

Laravel5利用中に使った「生年月日から年齢を計算する簡単な方法」

Laravel5で開発中に、生年月日から年齢を計算するときに使ったfloor()関数。

// form内のselectボックスで、年、月、日を取得し

$ymd = Request::input('birthy') . Request::input('birthm') . Request::input('birthd');

// $ymdは19880523のような文字列になっている。
// 下の2つのどちらの方法でも年齢が取得できる。今回の開発では、floor()関数を使った。

$nenrei = floor((date('Ymd')-$ymd)/10000); //floor()関数で整数値を取得する
$nenrei = (int)((date('Ymd')-$ymd)/10000); //整数型にキャストする

// floor()関数の動作定義は「最も近い最小の整数値を返す」という動作。引数に負の値を指定する場合にはちょっと注意。floor( -2.55 )は、-3になる。(int)-2.55なら、-2になる。

// floor()関数の同類関数: ceil() は値を切り上げる。round() は整数値に丸める。

/**
(int)の他に使用可能なキャスト
PHP の型キャストは、変換しようとする型を括弧で括り、キャストする変数の前に置く。
------------------------------------------------------------------------------
(int) -> 整数へのキャスト
(bool) -> 論理値へのキャスト
(float) -> floatへのキャスト
(string) -> 文字列へのキャスト
(array) -> 配列へのキャスト
(object) -> オブジェクトへのキャスト
(unset) -> NULLへのキャスト (PHP5)
(binary) -> 2進数へのキャスト(PHP5)
*/


2015年1月13日火曜日

パソコンには、Ubuntu14よりCentOSの方が楽でいい

CentOS7が出たらしいので古いCF-T5にインストールしたいと思った。が、CentOS7からは32ビット版が存在しないので、CF-T5にはインストールできない。入れるつもりになったので、古いバージョンの6.6でもいいと思いインストールした。

実は、2014年に一度このCF-T5にはUbuntu14をインストールした。会社のサーバーはずっとCentOSだったので、CentOSの使い勝手はわかっていたが、世間で評判のUbuntuを触ってみようとインストールしたものだった。

今回、CentOSをサーバーではなく、CentOSをパソコンとしてインストールした。サーバーアプリの代わりに、Officeアプリなどをインストールしただけ。サーバーの設定が不要な分手間が無い。

Ubuntu14とCentOS6.6(CentOS7が最新)を比べると、CentOS6.6の方が、インストールが簡単だ。日本語関連でさえ何もしなくてよい。日本語と英数の切り替えはWindowsと同じでいい。何の手間も無い。

無線LANもWLI-UG-GNMならUSBに差し込むだけでつながる。

動作速度も、Ubuntu14より、CentOS6.6の方が軽快だ。

インストールが簡単、日本語設定が何も必要ない、無線LANは差し込むだけ、動作も軽快、全体の使い勝手もいい。

これほどにいいCentOSをなぜ、日経LinuxなどのLinux系雑誌は、ユーザーに奨めないのだろう。Ubuntuばかり奨める。無知なのか、何か特別な利害関係でもあるのか。

僕は声を大にしていいたい、パソコンにLinuxをインストールするなら、初心者からベテランまでCentOSを使いましょう。楽ですよ、楽。