あずきみるくのあずきはニガテ - for Engineer

ひよっこプログラマがやってみたことやハマっちゃったことなど、備忘録的な感じで書いていきます。

eclipseとSVNの連携あれこれ

SVNの設定はこちらをご参照ください。
Subversion - Linuxにインストールして、Windowsで使えるまで - あずきみるくのあずきはニガテ - for Engineer
Subversion - ベーシック認証でいいっすか? - あずきみるくのあずきはニガテ - for Engineer

んで、今回はeclipseで作成しているプロジェクトを新規にSVNに登録したり、
既存のプロジェクトをチェックアウトしたりする流れ。

ちなみに、SVNの使い方や用語解説などは割愛しております。



<環境>
pleiadeseclipse 4.4 LUNA)
Subversive -SVN チーム・プロバイダー 3.0.0(eclipseプラグイン
SVN 
 
 ※pleiadesをインストールした時点で、SVNを扱う
 Subversiveというプラグイン?はインストールされているようです。
 もし、単体(pleiadesではない)を使用している場合は、
 「ヘルプ」>「eclipseマーケットプレース」から
 インストールしてください。



1)既存プロジェクトの共用

SVNリポジトリは作成されていることを前提とします。

で、

いま、ふつーに作っているeclipseのプロジェクトを
SVNで共用したい、

って時のやり方。



プロジェクトエクスプローラで右クリック
>「チーム」>「プロジェクトの共用」を選択します。

f:id:azuki-milk-lush:20160114172233p:plain

今回はSVNを使用するので、「SVN」を選択します。

で、次へ。


以下、画像はURLなどに説明用文言を入力しているため、
エラーになっていますが、そこは気にせず、必要項目を
入力していってください。



SVNのURL、ユーザ名、パスワードを入力します。
※画像の訂正
  (誤)http://(SVNサーバのIP)/svn/(SVNリポジトリ名)/trunk
  (正)http://(SVNサーバのIP)/svn/(SVNリポジトリ名)
 trunkは「拡張」タブで設定されているので、ここでは書かなくてもOKです。

f:id:azuki-milk-lush:20160114172654p:plain
※「認証の保管」にチェックを入れておくと、後々楽かも。

で、次へ。


f:id:azuki-milk-lush:20160114173641p:plain

シンプルモードのままでいいのですが、「参照」ボタンを押下して、
「trunk」を選択します。


で、次へ。



コメントはそのままでOKなので、
「完了」ボタンを押下します。


プロジェクトエクスプローラにて、
こんな感じに表示されていればOKです。

f:id:azuki-milk-lush:20160114174145p:plain


2)既存プロジェクトの取り込み

既にSVNにプロジェクトとして登録されているものを
eclipseに取り込んで編集したい、

もしくは、

既に動いているプロジェクトに途中から参画する

って時のやり方。

「ウィンドウ」>「パースペクティブを開く」>
SVNリポジトリエクスプローラー」

を開きます。

f:id:azuki-milk-lush:20160114181302p:plain

SVNリポジトリー」にて右クリック>
「新規」>「リポジトリロケーション」で以下のポップアップが表示されます。

f:id:azuki-milk-lush:20160118120100p:plain

URL、ユーザ名、パスワードを入力します。

すると、こんな感じで取り込めます。
f:id:azuki-milk-lush:20160120114155p:plain

あとは「trunk」を右クリック>「チェックアウト」とすると、
eclipse上のプロジェクトエクスプローラーなどで
ソースを編集、コミットetcすることができるようになります。


とりあえず、今回はここまで~。

【java】 Apache POI を使ってみた。- 実装編② 既存のExcelファイルを編集して出力

POIの実装編です。
今までのはこちら。

【java】 Apache POI を使ってみた。- インストール編 - あずきみるくのあずきはニガテ - for Engineer

【java】 Apache POI を使ってみた。- 実装編① Excelを新規作成して出力 - あずきみるくのあずきはニガテ - for Engineer


なんかいちいちタイトル長くてほんま、すんません m(_ _)m

今度は既存のファイルに追加してみようと思います。
いつもの環境はこちら。

<環境>


で、ソース。

package sample;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import org.apache.poi.EncryptedDocumentException;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;

public class Sample2 {

    public static void main(String[] args) throws IOException {

        // 変更元を取込
        FileInputStream in 
            = new FileInputStream("C:\\Temp/Sample1.xlsx");

        Workbook book = null;
        try {
	    // 今回、WorkBookはWorkbookFactoryを使って作成します
	    book = WorkbookFactory.create(in);

	} catch (EncryptedDocumentException e1) {
	    e1.printStackTrace();

	} catch (InvalidFormatException e1) {
   	    e1.printStackTrace();
	}

	// 「サンプル」という名前のシートを取得
	Sheet sheet = book.getSheet("サンプル");

	// 1行目取得 ※Excel上、行番号は1からスタートしてますが、
	// ソース内では0からのスタートになっているので要注意!
	Row row = sheet.getRow(0);

	// 1つ目のセルを取得 ※行と同じく、0からスタート
	Cell a1 = row.getCell(0);    // Excel上、「A1」の場所

	// 値をセット
	a1.setCellValue("POIのテスト_変更後");

	// ここから出力処理
	FileOutputStream out = null;
	try {
	    // 出力先のファイルを指定
	    out = new FileOutputStream("C:\\Temp/Sample1.xlsx");
	    // 上記で作成したブックを出力先に書き込み
	    book.write(out);

	} catch (FileNotFoundException e) {
	    System.out.println(e.getStackTrace());

	} finally {
	    // 最後はちゃんと閉じておきます
	    out.close();
	    book.close();
	}
    }
}

ポイントは
WorkBookの作成時に「WorkbookFactory」を使う
こと。
それ以外は基本的に大きくは新規作成時と変わらないイメージ。


で、出力後、ちゃんと変更されていることも確認できました。

f:id:azuki-milk-lush:20151111145737p:plain



<参考>
いつもお世話になっております。
ここは本当に詳しく書いてくださってます。
もっといろいろやってみたいときはぜひ、参考にしてください!

www.javadrive.jp

【java】 Apache POI を使ってみた。- 実装編① Excelを新規作成して出力

今回は実装編です。

インストールとプロジェクトの設定はこちらで行っています。

azuki-milk.hatenablog.com


環境は前回と同じ。こちらです。

<環境>

とりあえず、新規で何か書いて出力してみたいと思います。
ついでに文字色とか、スタイルも変えてみよう・・・


ワークブックを扱うクラスは「HSSFWorkbook」や「XSSFWorkbook」が
あるそうですが、、、

HSSFWorkbook : Excel2003まで
XSSFWorkbook : Excel2007以降

っていう違いがあるそうです。


そんなわけで、書いてみました。

package sample;


import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class Sample1 {

  public static void main(String[] args) throws IOException {

    // Excel2007以降の「.xlsx」形式のファイルの素を作成
    Workbook book = new XSSFWorkbook();

    // シートを「サンプル」という名前で作成
    Sheet sheet = book.createSheet("サンプル");

    // 1行目作成 ※Excel上、行番号は1からスタートしてますが、
    // ソース内では0からのスタートになっているので要注意!
    Row row = sheet.createRow(0);

    // 1つ目のセルを作成 ※行と同じく、0からスタート
    Cell a1 = row.createCell(0);  // Excel上、「A1」の場所

    // 値をセット
    a1.setCellValue("POIのテスト");

    // セルのスタイルを変えてみようと思います・・・
    CellStyle style =  book.createCellStyle();
    // フォント
    Font font = book.createFont();
    // ROSE色にしてみる
    // IndexedColorsにはいろんな色が設定されてます
    font.setColor(IndexedColors.ROSE.getIndex());
    // セルにセット!!
    style.setFont(font);
    a1.setCellStyle(style);

    // ここから出力処理
    FileOutputStream out = null;
    try {
	// 出力先のファイルを指定
	out = new FileOutputStream("C:\\Temp/Sample1.xlsx");
	// 上記で作成したブックを出力先に書き込み
	book.write(out);
    
    } catch (FileNotFoundException e) {
	System.out.println(e.getStackTrace());

    } finally {
	// 最後はちゃんと閉じておきます
	out.close();
	book.close();
    }
  }
}


で。出力された結果がこちら。
A1のセルにちゃんと設定した値が表示されており、
さらに文字色も設定されていますね☆
(ROSEってちょっと見にくい色だな・・・w)

f:id:azuki-milk-lush:20151111142751p:plain


では、次回は既存のファイルに変更を加えてみようと思います。



<参考>
いつもお世話になっております。
ここは本当に詳しく書いてくださってます。
もっといろいろやってみたいときはぜひ、参考にしてください!

www.javadrive.jp

【java】 Apache POI を使ってみた。- インストール編

javaからExcelが触れないかなー、と思ってたら、、、

たどり着きました。POI。


ポイとか、ピーオーアイとか呼ばれるらしいですが、
個人的には「ぽい」の方がかわいくて好きです。

さて、早速試してみたいと思います。

ちなみに、環境はこちら。

<環境>

1)POIダウンロード

まずはこちらからダウンロードします。
Apache POI - Download Release Artifacts


ほんとはソースがあった方が見やすいんだろうけど、
今回はバイナリ版で落とします。

赤枠部分をぽち。

f:id:azuki-milk-lush:20151111112419p:plain


すると、こんな画面になります。
HTTP経由で落とすので、赤枠内のどこでもOKなので、
ポチしてダウンロードしてください。

f:id:azuki-milk-lush:20151111112631p:plain

2)インストール

ダウンロードできたら、次はインストールです!

とりあえず、解凍すると、「poi-3.13」というフォルダができます。

中身はこんな感じでした。

f:id:azuki-milk-lush:20151111113637p:plain


ちなみに、「poi-3.13/lib」の中身。

f:id:azuki-milk-lush:20151111113708p:plain


ついでに、「poi-3.13/ooxml-lib」の中身。

f:id:azuki-milk-lush:20151111113826p:plain


で、これを「poi-3.13」のフォルダごと、
適当にCドライブ直下にでもおいておきます。

実際に使用する時はeclipseにてクラスパスを通すので、
このままおいておきます。

3)プロジェクトの作成

eclipseにて、プロジェクトを作成します。
「新規」>「プロジェクト」>「Javaプロジェクト」で、
プロジェクト名は「PoiSample」とでもしておきます。

f:id:azuki-milk-lush:20151111115115p:plain

4)クラスパスの設定

作成した「PoiSample」を右クリックして、一番下にある
「プロパティー」を選択します。

f:id:azuki-milk-lush:20151111115247p:plain


で、左側のメニューから「Javaのビルドパス」を選択すると、
こんな画面になります。

f:id:azuki-milk-lush:20151111115337p:plain


「外部Jar追加」を選択します。

f:id:azuki-milk-lush:20151111130812p:plain


エクスプローラが開くので、「poi-3.13-20150929.jar」を
選択して追加します。
※他のjarも依存関係がありそうなので、気になるようでしたら
 追加しておいてください。
 (ただ、簡単な操作だけであればメインのjarだけでも
  大丈夫そうです。。。)

訂正:これだけだとエラーになります。
   全部のjarを突っ込んで頂ければ動くかと。。。
   (「lib」フォルダ、「ooxml-lib」フォルダの中のjarも
    一緒によろしくです)

f:id:azuki-milk-lush:20151111131011p:plain


はい、追加されました。

f:id:azuki-milk-lush:20151111131343p:plain

とりあえず、これでeclipse(プロジェクト)の設定まで
できました。


次では早速、コードを書いてみたいと思います!


実装編はこちら
azuki-milk.hatenablog.com
azuki-milk.hatenablog.com

cakePHP2 - Model名をDB名と違うのんにしたい!

<環境>
 php5
 cakePHP2.5.8



お久しぶりです。
めっきり「ぴちぱー」のあずきです。
ちょっと暇ができると、すぐ更新したがります。


今日はcakePHPでDB接続する時、DB名を直接Model名に設定しないやり方です。


なんでこんなことがしたいのか。


cakePHPを見てると、DB名とModel名って連動されていることが多いようです。
そういう命名規則?と思ってました。
(実際そうなんだろうけど)

でも、
Model名 = Controller名 とか、対になったりしてるわけで。

ってことは、
ブラウザに表示されるURLにDB名出しちゃうん?

・・・それはやだ!!

って経緯です。


そんな時の対処法です。


結論から言っちゃうと、
テキトーな名前で作ったModelに

public $name = "(使いたいテーブル名)";

って書きゃいいのです。
で、Controllerでは、ここで作ったModelをApp::importして使う。
ポイントはこれだけです。

                                                                                                                                          • -

以下詳細。(読み飛ばし可w)

仮に、テーブル名を「Samples」とします。
※テーブル名は複数形にします。cakeを使っている以上、これは譲れません。


通常のDBアクセス時の記述法は下記の通りです。
※テーブル「Samples」にアクセスして、すべてのカラムを取得します
※画面表示するところは割愛してます


/app/Controller/SamplesController.php

<?php
class SamplesController extends AppController {
 
    function beforeFilter(){
        parent::beforeFilter();
    }
 
    function index(){
        $results = $this->Samples->find('all');
    }
}

/app/Model/Sample.php

<?php
Class Sample extends AppModel{
	public $name = "Sample";
}  


これだと、ブラウザからアクセス?する時のURLは

http://localhost/(プロジェクト名)/Samples

になります。


あらやだ。
テーブル名「Samples」が表に出ちゃってますね。

cakeが分かる方ならば、
サーバに侵入して、「Samples」ってテーブルを見に行ったら、
他の人のこの情報が入ってるんだな、
なんて想像されてしまうかもしれません。
(いや、そんなことしないかもしれないけど)

セキュリティUPには、なるべく脅威を減らしたい。



ってわけで、できれば

http://localhost/(プロジェクト名)/Test

ってURLでアクセスしてほしい、ってなったとします。

この時、先程作った

/app/Controller/SamplesController.php
/app/Model/Sample.php

は使いません。


新しく、以下の2つを作ります。
/app/Controller/TestController.php
/app/Model/Test.php



中身はこんな感じ。

/app/Controller/TestController.php

<?php
App::import('Model', 'Test');
class TestController extends AppController {
 
    function beforeFilter(){
        parent::beforeFilter();
    }
 
    function index(){
    	$Test = new Test;
        $results = $Test->find('all');
    }
}

/app/Model/Test.php

<?php
Class Test extends AppModel{
    public $name = "Sample";
}  


以上です。

ちなみに、Controllerにてimportせずに、以下のように記載すると、、、

<?php
class TestController extends AppController {
 
    function beforeFilter(){
        parent::beforeFilter();
    }
 
    function index(){
        $results = $this->Test->find('all');
    }
}

「Test」というテーブルを探しに行ってました。

public $name = "Sample";

の一文が効かなかったってことです。

new のタイミングで「Sample」テーブルを使う、っていうのを
認識しに行っているのでしょうか?

そこのところはよくわかりません。

とりあえず、importを使うとうまくいきました。



これでDB名を表(URL)に出すことなく、
DBアクセスできるようになりました。


んでも、こんな感じで使っていると、フレームワークのありがたみとか、
よくわかんなくなってきますよね。。。


でも、あずき的には、フレームワークはあくまで
ツールだと思っているので、プロジェクトや、やりたいことに合わせて
機能の取捨選択をしていくのもありなのかな、って思っています。
あんまり自信ないけど。


そんなわけで今後ともよろしくお願いしますm(_ _)m

PHP 文字列の連結はどの方法が早い?

PHPです。

文字列の方法が何個かあるんですけど・・・
実際、どれを使うのがはやいんでしょう?

ってことで、調べてたら、こんなサイトを見つけました。

www.sound-uz.jp

で、自分でもやってみよーと思って、コードを拝借して、
やってみました。

方法は

1. 「.=」で連結
2. 「.」で連結
3. 無連結
4. 配列に突っ込んでいって、最終的に文字列にする


<?php
// 連結用文字列
$str1 = "select * from ";
$str2 = "update aaa set aaa = 'aaa'";
$str3 = "select aaa from aaa where aaa = 'aaa'";
$count = 10000;  //繰り返す回数

// 現在の時間をマイクロ秒単位で返す関数
function getmicrotime(){
    list($msec, $sec) = explode(" ", microtime());
    return ((float)$sec + (float)$msec);
}

// 追記編
$time1 = getmicrotime();
for($n = 0; $n < $count; $n++){
    $str = $str1;
    $str .= $str2;
    $str .= $str3;
}
$time1 = getmicrotime() - $time1;

// 連結編
$time2 = getmicrotime();
for($n = 0; $n < $count; $n++){
    $str = $str1.$str2.$str3;
}
$time2 = getmicrotime() - $time2;

// 非連結編
$time3 = getmicrotime();
for($n = 0; $n < $count; $n++){
    $str = "$str1$str2$str3";
}
$time3 = getmicrotime() - $time3;

// 配列に突っ込んでから文字列に変換
$time4 = getmicrotime();
for($n = 0; $n < $count; $n++){
  $arr = array();
  $arr[] = $str1;
  $arr[] = $str2;
  $arr[] = $str3;
  $str = implode($arr);
}
$time4 = getmicrotime() - $time4;


// 見栄え良くテーブルに出力
?>
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf8">
<title>文字列連結実行速度比較</title>
</head>
<body>
<table border="2">
 <caption>文字列連結<br> <?php echo $count; ?> 回の実行速度比較</caption>
 <tr>
  <td>.=</td>
  <td> <?php echo $time1; ?> </td>
 </tr><tr>
  <td>.</td>
  <td> <?php echo $time2; ?> </td>
 </tr><tr>
  <td>非連結</td>
  <td> <?php echo $time3; ?> </td>
 </tr><tr>
  <td>implode</td>
  <td> <?php echo $time4; ?> </td>
 </tr>
</table>
</body>
</html>

結果はこんな感じ

1回目
f:id:azuki-milk-lush:20150615131058p:plain
2回目
f:id:azuki-milk-lush:20150615131117p:plain
3回目
f:id:azuki-milk-lush:20150615131122p:plain


平均して、順番に並べてみるとこんな感じでした。

No 連結方法 3回の実行時間の平均
3 無連結 0.00143694877625
2 「.」で連結 0.00159462292989
1 「.=」で連結 0.00225273768107
4 配列に突っ込んでいって、最終的に文字列にする 0.00629607836405

まあ、無連結は連結してないからそんなもんで。
意外にも「.」で連結するのが早かったんですね。

javaとかの場合、「+」で文字列を結合するのは
時間がかかりすぎて敬遠してました。
「.」もこの類かと思って敬遠しがちだったのですが、
認識を改める必要がありそうです。

ちなみに。。。

2つめのおまけです。単に幾つかの文字列を連続して出力(表示)するだけならば、
「 echo $str1, $str2, $str3; 」が連結が無いだけに高速です。

というのもありました。
表示用なら連結する必要はないのですね。
ふむふむ。


というわけで、このへんでー。

SVNに急に拒否された。。。(T_T)

SVNにコミットしようとしたところ、

「対象のコンピューターによって拒否されたため、接続できませんでした」

というメッセージが表示され、急に動かなくなりました。。。

そんな時、見るポイントを備忘録。

<環境>
CentOS
apache 2.4

1)そもそもSVNのサービス動いてる?

そもそも論です。こいつが動いてないとお話になりません。

確認するコマンドは以下。

# これをたたく
netstat -ln

# こんな感じで出てくる。「3690」がSVN
tcp 0 0 0.0.0.0:3690 0.0.0.0:* LISTEN 

で、3690が動いているか確認。

動作していなければ、たたき起こす。

svnserve -d

これでも動かなかった・・・

2)apacheは?

そうそう、そういえば、認証機能を付けるために、あずきはSVNapacheに載せているのでした。azuki-milk.hatenablog.com

apacheが起動してないと意味ありません。

で、apache再起動


・・・しーん

3)VMごと再起動しちゃえ!!

あずきのところは、SVNapacheVMに乗っかっています。
いわばPC再起動。

/sbin/reboot

しばらくたってからアクセスするとつなげるようになりました。


・・・いまいち何が原因なのかわからないけど、
とりあえず備忘録。

久しぶりに書いた割に、ずいぶん乱暴・・・ごめんなさい m(_ _ )m

Macで [mcrypt_module_open()] が見つかりません

環境設定は苦手です。。。あずきです。。。

できないながらも、粛々と進めてたPHP案件です。
が、Windowsでは、しれっと動いていた、
mcrypt_module_open()」


いざ、もじゅーるを何の気なしにmacに入れて動かそうとしたところ、、、

Call to undefined function mcrypt_module_open()

と、怒られました。

隣の環境設定のプロ曰く、WindowsPHPでは自動的に落としてきてくれるモノだそうですが、LinuxMacでは手動で入れてやらねばならないそうです。

・・・仕方ないので入れますorz

前回も使ったHomebrewを使うと楽なようです。
Homebrewの設定方法はこちらをご参照ください。azuki-milk.hatenablog.com

たたいたコマンドはこちら

$ brew search mcrypt
  libtomcrypt mcrypt php53-mcrypt php54-mcrypt php55-mcrypt php56-mcrypt
  homebrew/php/php53-mcrypt homebrew/php/php55-mcrypt
  homebrew/php/php54-mcrypt homebrew/php/php56-mcrypt
$ brew install php55-mcrypt

$ brew search mcrypt で、該当するモジュールを探し・・・
$ brew install php55-mcrypt で「php55-mcrypt 」を取り込む、って感じです。

phpの後の数字はおそらくバージョンです。
あずきのPCにはPHP5.5が入っているので、「php55-mcrypt 」を選択しました。


すると、こんな感じで出てきます。

==> Installing php55-mcrypt from josegonzalez/homebrew-php
==> Installing dependencies for php55-mcrypt: mhash, mcrypt
==> Installing php55-mcrypt dependency: mhash
==> Downloading https://downloads.sourceforge.net/project/mhash/mhash/0.9.9.9/mhash-0.9.9.
######################################################################## 100.0%
==> ./configure --prefix=/usr/local/Cellar/mhash/0.9.9.9
==> make install
🍺  /usr/local/Cellar/mhash/0.9.9.9: 17 files, 504K, built in 119 seconds
==> Installing php55-mcrypt dependency: mcrypt
==> Downloading https://downloads.sourceforge.net/project/mcrypt/MCrypt/2.6.8/mcrypt-2.6.8
######################################################################## 100.0%
==> Patching
patching file src/rfc2440.c
==> Downloading https://downloads.sourceforge.net/project/mcrypt/Libmcrypt/2.5.8/libmcrypt
######################################################################## 100.0%
==> ./configure --prefix=/usr/local/Cellar/mcrypt/2.6.8 --mandir=/usr/local/Cellar/mcrypt/
==> make install
==> ./configure --prefix=/usr/local/Cellar/mcrypt/2.6.8 --with-libmcrypt-prefix=/usr/local
==> make install
🍺  /usr/local/Cellar/mcrypt/2.6.8: 15 files, 448K, built in 2.9 minutes
==> Installing php55-mcrypt
==> Downloading https://www.php.net/get/php-5.5.22.tar.bz2/from/this/mirror
######################################################################## 100.0%
==> /usr/local/opt/php55/bin/phpize
==> ./configure --prefix=/usr/local/Cellar/php55-mcrypt/5.5.22 --with-php-config=/usr/loca
==> make
==> Caveats
To finish installing mcrypt for PHP 5.5:
  * /usr/local/etc/php/5.5/conf.d/ext-mcrypt.ini was created,
    do not forget to remove it upon extension removal.
  * Validate installation via one of the following methods:
  *
  * Using PHP from a webserver:
  * - Restart your webserver.
  * - Write a PHP page that calls "phpinfo();"
  * - Load it in a browser and look for the info on the mcrypt module.
  * - If you see it, you have been successful!
  *
  * Using PHP from the command line:
  * - Run "php -i" (command-line "phpinfo()")
  * - Look for the info on the mcrypt module.
  * - If you see it, you have been successful!
==> Summary
🍺  /usr/local/Cellar/php55-mcrypt/5.5.22: 3 files,  56K, built in 107 seconds

これのありがたいところは、その後のフォローまで書いてくれているところ。
「To finish installing mcrypt for PHP 5.5:」以下の手順に従って、やっていきます。

1)ext-mcrypt.ini  の確認と設定

「/usr/local/etc/php/5.5/conf.d/ext-mcrypt.ini 」が作られてるよ、ってあるので、実際に作られているか見に行ってみる。

できてたね。

中身は。。。

[mcrypt]
extension="/usr/local/opt/php55-mcrypt/mcrypt.so"

こんだけ。

で、これを
/usr/local/etc/php/5.5/php.ini
に加える。

2)確認

phpinfoで確認する方法でいきたいと思います。
「Using PHP from a webserver:」の方ね。

2−1. Apache再起動

再起動します。
あずきはMacの標準のApacheを使っているので。。。

$ sudo apachectl restart

と叩きます。

2−2. phpinfoの確認

てきとーにこんなファイルを作って、実行。

<?php
phpinfo();

f:id:azuki-milk-lush:20150426115732p:plain

いけたっぽい。


いやー、WindowsMacっていろいろちがうんだね。
Windowsはいろいろやってくれてることにびっくりです。。。

cakePHPでCSV取込 - 困ったこといろいろ

PHPにはCSVを取り込む便利な関数がいろいろあるようで。
最初は定番と言われるものを使ってたのですが・・・

いろいろ問題が発生してきました。
その流れとともに、解決方法をメモメモします。
<環境>
PHP 5.4
cakePHP 2.5.8

1)そもそも、どの関数を使うのがいいの?

あずきは最初、何も考えないまま定番?の「fopen して fgetcsv」を使ってました。
これ → PHP: fgetcsv - Manual

だって、検索したら最初に出てくるんだもん。

が、しかし、、、
CSVの区切り文字をスペース区切りやタブ区切りにも対応したい」
となったとき、fgetcsvの第3引数、「delimiter」には1文字しか指定できないのです。

fgetcsv(ファイルポインタ, length, delimiter(ここ、ね));

「\s」とか「\t」とか、書けないんですよ。
これを指定すると、
「1文字だけって言ってるでしょ!!」っておこられる。

じゃあ、どうやって区切り文字を実現するか。
仕方ないんで、ごりごり切りましたよ。
・・・「preg_split」で。。。
残念ですね。


なんか他にやりようがないか、しらべていたら、こんな記事を見つけました。
【PHP】その CSV 変換、本当に「fgetcsv」でいいの? (フェンリル | デベロッパーズブログ)
ふむ。とても興味深い。見てるとワクワクしますねw
CSV取込だけでもこんなに方法があるんですね。
オススメは「SplFileObject::READ_CSVとな。
調べてみます。

2)SplFileObject

どうやらファイル全般、扱えるようですが、ことCSVに関しては、
「SplFileObject::READ_CSV
という、すてきな物が用意されているようです。

ただ、同時に気になる記事も見つけました。
zBlog
なんと、

SplFileObjectではsjisCSVが処理できないからUTF-8にするしかない

だそうです。

ついでに言うと、SplFileObjectを使って実装したところ、

  • 最終行の改行も登録される
  • 空行も登録される

という問題が発覚しました。

fgetcsvなら上手いことやってくれたのに。

意外と問題が多いです。
が、当初の目的の区切り文字は簡単に変更できそうです。
乗りかけた船なので、乗り切っちゃいます。

3)区切り文字を変更する

案外、簡単にできました。

 $file = new SplFileObject($filepath); 
 $file->setFlags(SplFileObject::READ_CSV);
 $file->setCsvControl($delimiter, $enclosure);  // ←ここです。

マニュアルはこちら
PHP: SplFileObject::setCsvControl - Manual

区切り文字(delimiter)だけでなく、囲み文字(enclosure)も楽々設定できます。

ここはさくさく解決したので、SplFileObjectの問題を解決しに行きます。

4)SJISのファイルも読み込みたい

Excelで作られたCSVは基本的にエンコードSJIS(Shift−JIS)になるようです。
とりあえず、これも読み込みできるように。

こうなりました。

$str = mb_convert_encoding($str, "UTF-8", "auto");

・・・ええ、「mb_convert_encoding」使っただけです。

ただ、ここで注意!!
このまま実行すると・・・
「Unable to detect character encoding」ってエラーが発生する可能性があります。
ってか、発生しましたorz

mb_convert_encoding関数でUnable to detect character encodingというエラーが出る件 - 大人になったら肺呼吸
こちらの先生の教えに従い、「mb_language("Japanese");」を足します。

mb_language("Japanese");
$str = mb_convert_encoding($str, "UTF-8", "auto");

こうなりました。これで、’auto’の呪縛から逃れることができます。

5)空行や改行も読まれる

めんどくさいです。。。
SplFileObjectのマニュアルのページに
「SplFileObject::SKIP_EMPTY」なるものを見つけ、
ちょっとだけ小躍りしましたが、、、つかえませんでした。
使えないんですよ!!

ここは、力技で押し切ります。

後で、全部まとめたソース書いてますので、そちらをご覧ください。

できた!!

以上のもやもやを取り込んでみたソースがこちらです。

$file = new SplFileObject($filepath); 
$file->setFlags(SplFileObject::READ_CSV);
$file->setCsvControl($delimiter, $enclosure);

foreach ($file as $key => $line) {
      // 空行をチェックするための配列とフラグを初期化
      $tmp_array = array();
      $set_flg = false;

      foreach( $line as $str ){
          // エンコードをすべてUTF-8に変換
          mb_language("Japanese");
          $str = mb_convert_encoding($str, "UTF-8", "auto")
          $tmp_array[] = Sanitize::clean($str);
      }
      // 空行かどうかチェック
      foreach($tmp_array as $tmp){
          if(!empty($tmp)){
              $set_flg = true;
          }
      }
      // 空行でなければ登録する
      if($set_flg){
           $records[] = $tmp_array;
      }    
}
 return $records;  // よみこんだやつ

うーん。。。やっぱり力技な所が気になります。

いい方法をご存知の方がおられたら、ぜひご教授くださいm(_ _ )m


おまけ:ファイルサイズチェックしたい

ファイルサイズに上限を設けておくと、もんのすごい重いファイルを読み込まされるリスクが減ります。
そんなわけで、こんなチェックもできるよ、ってことで。

// ファイルサイズチェック(50KBまで)
        $size = filesize($file_path);
        if(!$size || $size > 100000){
           echo 'ファイルサイズが1MBを超えています';
        }

なんて簡単なんでしょ。


取込の次は、きっと出力です。
こちらも問題まみれだと思うので、頑張ります!!

ご覧になった皆様からのありがたいコードレビュー?!もよろしくお願いいたしますw

PHP - 電話番号の確認と一緒にフォーマットもしてくれたらちょー便利♫

電話番号・・・悩ましいです。

固定と携帯で桁数も違うし、固定に至っては(⚪︎桁)⚪︎桁ー⚪︎桁 っていうのが、市外局番によって異なる、という。。。なんともチェックしづらい項目なのです。(個人的に)

そんなあずきに共感していただけるあなた。
そんなあなたにご紹介です。

qiita.com


ここで紹介されている関数を使えば、あら、不思議。

「031-23-45678」なんてふざけた切り方してても、ちゃんとなおしてくれる。
いやー、ほんとにありがたいです。

おかげで3人日位(てきとー)の工数が浮きました。

どうでもいいけど、この業界って基本的に「人月」で計算するよね。
某SPA小売業では「人時」で計算してました。
業界によって、仕事の区切りが違うからなんだろね。