読者です 読者をやめる 読者になる 読者になる

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

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

iOSでsubmitボタンが消えた!!buttons.cssのせい?!

うそのような、ほんとの話。

ボタンが消えたんです。iOS上でのみ。

PCでもAndroidでも、問題なく見えているのに、
iPhoneとかiPadではボタンが忽然と消えたんです。

でも、見えないだけでボタンは存在してて。
「この辺にボタンアッタヨネ~」ってところを
タップすると反応する、という何とも不思議な現象。

これをなんとか解決したいと思います。

■状況

手っ取り早く言うと、cakePHPにbuttons.cssを使ってボタンを作ってます。

現象としては、

  <iOS8では・・・>
     PC、iPhoneともに、ボタンが見えていた。

  <iOS9になると・・・>
     ボタン消えた!!

いろんなところをググったけど、おなじ現象の人は見当たらず。

<環境>
 ・php 5.4
 ・cakePHP 2.5.8
 ・buttons.css(1.0?)
    ※「2.0 comming soon!」ってなってたから、たぶん1.x?。
 ・iOS 9.2

■buttons.cssとは。。。

ボタンを作るためのcssライブラリです。
詳しくはここでー。
unicorn-ui.com


■で。

使ってるソースは一緒。

echo $this->Form->submit('送信', array(
            'name'=>'smt', 
            'div'=>false, 'label'=>false,
            'class'=>'button button-rounded button-flat-caution'));


実行すると、こんな感じで出力されるはずだった。

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

iOS8までは、こんな感じでちゃんと出てたのに。

iOSアップデートしたとたん、消えたんですわ。

不思議だ・・・


■解決法

いろいろやってみたけど、一番簡単な解決法は

echo $this->Form->button('送信', array(
            'name'=>'smt', 'type'=>'submit', 
            'div'=>false, 'label'=>false,
            'class'=>'button button-rounded button-flat-caution'));

にすること。やったことは以下の2ステップです。


① FormHelper:submit → FormHelper:button

② 'type'=>'submit'の追加



■検証してみる。

出力されるHTMLがどう変わるか。

FormHelper:submit

<input name="smt" class="button button-rounded button-flat-caution" type="submit" value="送信">

FormHelper:button

<button name="smt" type="submit" class="button button-rounded button-flat-caution">送信</button>


・・・ふむ。タグが変わっただけで、動作も変わらない。
やってみれば一発なんだけど、それまでは
・Buttons.cssの中身を変更するか
・Buttons.cssのアップデートを待つか
iOSのアップデートを待つか
なんて考えてた。

iOSのバグなんじゃない?!
とか思ってたけど、、、実際のところは謎のまま。

とりあえず、事象は解消されたから、これでいいかな?

他の解決方法をお持ちの方、ぜひコメントお願いします!!

Heroku ことはじめ

すみません。前回の投稿と前後します。
実は、だいぶ前(日付見たら2015/7/11作成だとか)に下書きしてたやつです。。。
なので、随所で画面がちょっと古いです。。。ゴメンナサイm(_ _)m
ついでなのでUPしときます。。。


今回は、うちの旦那からの依頼です。

「Heroku使って、javaアプリ載せたいねん。
 でもGitとMavenがめんどくさいねん。教えて。」

なんてことだ。。。

Mavenjavaなら使ったことありますが・・・
HerokuとGitは未着手です。


Herokuについては、こちら(↓)が詳しいのですが、

無料で使える範囲はこちらをご参照ください。
HerokuでWebアプリ開発を始めるなら知っておきたいこと(1) 無料のスペック - アインシュタインの電話番号


大雑把にまとめると、

  • Paas(Platform as a Service)です
  • ある程度までなら無料で使えて、面倒な設定をやってくれてるサーバです
  • ちょっといろいろやってみたかったらアドオンを入れればできます
  • でも、そのいろいろにはお金がかかります

   (よくあるよね。ゲームとかで早く進めたかったら課金、的な。)

  • そのおかげで、多くの人が無料の恩恵にあずかれます

   (課金してくれた人、ありがとう)



ちょっと話がそれましたが、こんな感じでしょうか。

・・・まだよくわかんないな。

とりあえず触ってみるか。



と、いうわけで、さっそく、今回の先生をご紹介します。
qiita.com


Javaのための準備のページが用意されているようなので、
以下のサイトを参考に進めていきます。

devcenter.heroku.com


ページはこちら。
f:id:azuki-milk-lush:20150710160955p:plain

準備としては
1)Herokuのアカウント作成
2)Java8のインストール
3)Maven3のインストール
です。
※2015/9ごろから、Gradleにも対応したようです。

1)Herokuのアカウント作成

Herokuはレンタルサーバーの便利版的な印象です。
と、いうことは、とりあえずアカウントが必要になるということで。
早速登録してみましょう。

1-1. HerokuのページへGo!

 www.heroku.com

 真ん中の「Sign up for free」をポチします。
 ※右上にも「Sign up」ありますよ~
 f:id:azuki-milk-lush:20150710114915p:plain

1-2. 名前とメアドを入力して、

「Create Free Account」ボタンを押下する
f:id:azuki-milk-lush:20150710115025p:plain

1-3. メール到着!

 こんな感じのメールが来ます。
 リンクをぽちしていただければ、パスワード入力画面に遷移します。
f:id:azuki-milk-lush:20150710170844p:plain

1-4. パスワード入力

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

1-5. Welcome!

パスワードを入力するとWelcome画面が表示されます。
さらに、メールアドレスが書かれている部分をクリックすると・・・
f:id:azuki-milk-lush:20150710170448p:plain

この画面が出たらひとまずOK。
アカウントの作成はできたと思われます。
f:id:azuki-milk-lush:20150710170302p:plain

2)Java8のインストール

いつものあそこ。
そう、ここから、OSに合わせてダウンロードしてください。
Java SE Development Kit 8 - Downloads
※ ライセンスに同意するのを忘れないでね。

いけたか確認してみましょう!
コマンドプロンプト

java -version

こんな感じで出たらちゃんと反映されてます。

java version "1.8.0_45"
Java(TM) SE Runtime Environment (build 1.8.0_45-b15)
Java HotSpot(TM) 64-Bit Server VM (build 25.45-b02, mixed mode)

3)Maven3のインストール

3-1.ダウンロード

ここからダウンロード。
お好きな形式を選択してください。

mavenインストール

3-2.インストール

解凍すると、「apache-maven-3.2.5」っていう名前のフォルダがいるので、
コピーしてC直下に置くことにします。

3-3.環境変数(PATH)設定

PATHの設定を行います。

Windows8.1の場合

Windowsキー」を右クリック>「システム」>
「システムの詳細設定」>「環境変数

から編集してください。

設定するのは以下の2つです。

JAVA_HOME

  JDKのインストール場所です。
  あずきはProgramFiles以下のため、

  C:\Program Files\Java\jdk1.8.0_45\bin

  と書き込みます。
  ※「JAVA_HOME」という変数が存在しない場合は「追加」などから
   新規作成してください。

②PATH

  あずきはC直下なので、この通り。
  C:\apache-maven-3.2.5\bin
  
  ※「PATH」はだいたい、もういます。
   小文字の「path」でも同じ意味です。
   その場合は、区切り文字として「;(セミコロン)」をつけて
   編集(追記)してください。

3-4.インストールの確認

ここまでできたら、コマンドプロンプトを新しく立ち上げ、

mvn --version

と入力してみてください。(Windowsの場合)

こんな感じでバージョン情報が表示されていれば、
インストール完了です。

Apache Maven 3.2.5 (12a6b3acb947671f09b81f49094c53f426d8cea1; ...)
Maven home: C:\apache-maven-3.2.5\bin\..
Java version: 1.8.0_45, vendor: Oracle Corporation
Java home: C:\Program Files\Java\jdk1.8.0_45\jre
Default locale: ja_JP, platform encoding: MS932
OS name: "windows 8.1", version: "6.3", arch: "amd64", family: "dos"


で、とりあえず準備ができました。
次からいろいろデプロイして試してみたいと思います。

参考:
Apache Maven3 (3.2.5) インストール手順 (Windows) | WEB ARCH LABO

【Java】 WARファイルをHerokuにデプロイしたい

最近、Herokuを使い倒したいあずきです。

今回やりたいこと。


WARファイルをHerokuにデプロイしたい

以下の2点も追加でやってみたいと思います。

  • Gradleを使ってみる
  • プロジェクトの編集はeclipseで行う

この内容が不要な方は・・・下の方まで飛んでくださいw
※一番下の「続きを読む」をクリックしていただけると、
 下の手順から飛べます。

手順は以下の通りです。
eclipseは既に用意されているものとします。

1)Herokuアカウント取得
2)Gradleインストール
3)Gradleプロジェクトの作成
4)eclipseプロジェクトの作成
5)アプリケーションプログラムの作成
6)WARの作成
7)Herokuへのデプロイ
8)まとめ

続きを読む

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