2015-03-09

Modern.ie を Ubuntu で使う方法(IEを使った実行テストができます)

とんでもなく前回の投稿から時間が開いてしまいました。
もちろんいろんな開発をしていると「お!これはブログにのっけようかな。」というアイデアも浮かぶのですが、なかなか実行には移すのは難しいものですね。
さてさて、というわけで今回はそんな重い腰をあげ、私の大好きなOS「Ubuntu(14.04)」内でInternet Explore 11 を起動し、ローカル環境のサイトへアクセスする方法を備忘録的にお届けしたいと思います。




最終結論: Microsoftさん心からありがとう!(詳しくないけど社長が交代したからこんないいものがでてきたのかな?)

【前提条件】

Ubuntu に VirtualBox がインストールされていること。(Oracleにも感謝^^)


では、まずModern.ie に必要となるファイルを以下のサイトからダウンロードしましょう。

https://www.modern.ie/ja-jp


【ダウンロード方法】

※注:ダウンロードするファイルの容量はバカでかいので注意が必要です。私はパーティションの関係上いろいろなファイルを消す羽目になりました(汗)


1.ではまず、「仮想マシン」をクリックします。


2.画面下のバーチャルマシンを選びましょう(私の場合はWindows 7 の IE 11です。)


3.次にプラットフォームです。Linux用を選びましょう。


4.手順が楽なので、一番上の single-file を選んでダウンロードを実行します。


先ほど書きましたがダウンロードは時間がかかると思います。
気長に待ちましょう。

・・・


さぁ、ダウンロード が完了したら解凍して、「IE11 - Win7.ova」というファイルを取り出します。
では次からはVirtualBox へこのファイルをインポートする手順を紹介しましょう。(簡単ですけど)


 【VirtualBox へのインポート】


1.VirtualBoxを起動します。

2.仮想アプライアンスのインポートをクリックし、先ほどの 「IE11 - Win7.ova」を選択すると自動で開始されます。


※私の場合その他の設定はデフォルトで実行しました。
以上でインポートは完了です。
次は実際に起動をしましょう。

VirtualBox に IE11 - Win7と表示されているのでそこからWindowsを起動します。
ほんの少し時間はかかりますが・・・




はい。Ubuntu内で Windows 7 が起動しました!

ではここからは、このWindows 7内のIE 11 から起動元であるUbuntuのローカルホストを表示する方法をご紹介します。


【ローカルホスト参照する方法】

1.スタートメニューから Command Prompt(コマンドプロンプト)を実行します。



2.「ipconfig」と入力しエンターキーを押すといろいろな情報が表示されるので、その中にある「Default Gateway」の横に表示されている文字列を覚えておきましょう。(以下の例では 10.0.2.2です。)


3.では次に host 情報を変更するためにNotepad を開きます。(スタートメニューから 「Notepad」で出てきます)。

※この時通常どおり起動すると権限の関係から保存ができませんので、以下のように右クリックして「Run as administrator」から起動します。つまり管理者権限で実行するということですね。



4.Windows がOKかどうか尋ねてくるので、Yesをクリックしましょう。



5.ではやっと host ファイルの変更です。Notepadの「File」→「Open」をクリック。
その中から「C\Windows\System32\drivers\etc」のフォルダにある 「hosts」というファイルを開きましょう。

※もしこのフォルダに何も表示されない場合は、右下にあるドロップボックスの「All Files」を選択してください。

6.次に host ファイルの設定です。以下のようにファイルの最後に設定を書き込みます。(10.0.2.2は先ほど確認した Default Gateway になります。)



※私の場合は Ubuntu にも開発用ドメインを設定もしているので「****.dev」のようなアドレスも追加されていますが、必要なければ localhost のみで問題ありません。

7.さぁ、少し長かったですがこれで hostファイルの設定が完了です。このファイルを保存して Windows を再起動しましょう。


次にIEを開いた際には http://localhost/ へアクセスが可能なはずです。
お疲れ様でした。


【おまけ】

Modern.ie を使っていてまず最初にとまどったのですが、キーボード配列の違いから

1.:(半角コロン)
2.@(半角アットマーク)

の入力方法がわかりませんでした。

結論から言うと、

「:」は「Shift + ;(セミコロン)」で、
「@」は「Shift + 2(←テンキーではない方)」

で入力が可能です。ちょっと不便ですが実行テストだけなので覚えておいたほうがいいですね。
(もしかすると日本語化できるのかな?)


 【おまけ2】

次に困ったのが「コピペ」です。
そう。Ubuntu上でクリップボードにコピーしたテキストを Windows内でペーストしたい、、、けどできなかったので調べてみると、VirtualBoxの方で設定することでコピペが可能なようです。

手順としては、

画面中央の「一般」をクリックすると設定画面が出てくるので、「高度」タブを選択、

「クリップボードの共有」を「ホストOSからゲストOSへ」にして OKを押せば完了です。

※ちなみにその下はドラッグ&ドロップの設定です。お好みでここも設定しておくと便利ですよ。




以上です。
お疲れ様でした。^^





2014-10-09

Laravelでローカリゼーションするなら「Translation Manager」がすごく便利!(多言語翻訳ファイルも紹介してます)

さて今回はLaravelのローカリゼーションに関する便利なパッケージを発見したので備忘録として使い方+αをお届けしたいと思います。

実際少し前にLaravelを英語と日本語でローカリゼーションする機会があったのですが、この作業が地味に大変なんです。

つまり、英語のファイルと日本語のファイルが(もちろん)別れているため、一回一回キーを追加したり探したりする必要があります。

いつか自分で管理パッケージをつくろうかと思っていたらやはり先に同じことを考えている人がいたようですね。
さすがはLaravelです。^-^


出典:M. Adiputra


最終結論: ローカリゼーションが必要でなくてもバリデーション用にも使えるパッケージでした!


まず今回使わせていただくパッケージの紹介から。

barryvdh/laravel-translation-manager

※この作者は他にも「laravel-debugbar」や「laravel-ide-helper」などの有名なパッケージを作成しているようですね。心から感謝です。m_ _m



では、早速インストールしましょう。

Laravelをインストールしたフォルダ直下にある「composer.json」を開いて以下のように require にパッケージを追加します。

composer.json

"require": {
(その他のパッケージ),
"barryvdh/laravel-translation-manager": "0.1.x"
},


そして、コマンドから `compser update` を実行しましょう。
自動でパッケージがインストールされます。


そして、パッケージを使えるように設定をします。

app/config/app.php

'providers' => array( (その他のパッケージ),  'Barryvdh\TranslationManager\ManagerServiceProvider',
),
※追記

すみません。migrationする作業が抜けていました。T_T
以下を実行してDBに専用テーブルを作成してください。

php artisan migrate --package="barryvdh/laravel-translation-manager"


つぎに通常のパッケージインストールではあまり使わない以下のコマンドを実行してパッケージ内にある config ファイルをLaravel本体へコピーします。

php artisan config:publish barryvdh/laravel-translation-manager

※注: なぜかわかりませんが、私の場合存在するはずの 


vendor/barryvdh/laravel-translation-manger/src/config/
vendor/barryvdh/laravel-translation-manger/src/config/config.php

が見つかりませんでした。
もし同じことが発生していたら configフォルダを作成し、その中にconfig.php をコピペしてください。


そして、 app/routes.php に

Route::group(array('before' => 'auth_admin'), function() {
    Route::controller('translations', 'Barryvdh\TranslationManager\Controller');
});

を追加すると、http://***.com/translations にアクセスできるようになります。


※もし本番環境で表示したくない場合は、App::isLocal() などを使って場合分けをしたほうがいいですね。



使い方

※まだ app/lang/ja を作っていない場合はフォルダを作成しましょう。


まず、画像にある「import groups」をクリックしましょう。すでに「lang」登録されている単語を抽出します。



それが完了したら、ページを再読み込みすれば以下のようにどのファイルを編集するかを選択できるようになりますのでクリックしましょう。


あとは単語一覧が表示されるので個別に編集していくだけです。
(※まだファイル自体には反映されてません次の「ファイルへの反映」をみてください)




ファイルへの反映

ページには「publish translations」ボタンを押すとファイルに反映されると書いてますが実際はできなかった(おそらく権限を変更すればいけるのかな?)のでもうひとつの方法である「コマンドでの反映」をご紹介します。

コマンドでLaravelをインストールしているフォルダへ移動し、

php artisan translation:export ***

を実行しましょう。
言語ファイルに変更が反映されます。


※ ***は .phpをぬいたファイル名。例えば「messages」「validation」です。


はい!
ということで Translation Manager の紹介は終了です。


おまけ

世界各国の翻訳データを集めたファイルが以下のページからダウンロードできます。
もし、サイト内容が日本だけでなく世界に向けたものなら言語ファイルだけでも追加しておいて損はしないかもしれませんね。

https://github.com/caouecs/Laravel4-lang



Thank you barryvdh and caouecs!
You guy's works must save my time when developing websites.:)))

2014-10-01

Laravel の独自パッケージを作成する手順

ここのところ多忙のためブログ投稿をサボってしまっていますが、Laravel(CakePHP)は常に触っていて、知れば知るほどその便利さがよくわかっきている今日このごろです。

さて、そんな多忙な中なのになぜブログ投稿をするのか?というと今はクライアント様の判断待ちで、さらにタイトルにある独自パッケージの作成方法を備忘録として残しておきたかったからです。

以前作成したこがあるのにやることが多くて忘れてしまっていました(汗)
ということで今回はLaravelの独自パッケージの作成法をまとめてみたいと思います。


[最終結論] Laravel 5.0ではもっと楽にできればいいなー^^


では、早速作業を開始しましょう。
前提としまして、パッケージの名前は、

sukohi/hoge

として話をすすめていきます。
これは、「ベンダー名(あなたの名前)/パッケージ名」になります。

では、ターミナルを開いて Laravelがインストールされている場所(artisanのあるフォルダ)まで移動して以下を実行してください。

php artisan workbench sukohi/hoge --resources


実行が完了すると、

laravel
├ app
├ bootstrap
├ public
├ vendor
└ workbench

という形で workbench フォルダが作成されています。
では、この中にある以下のフォルダを開きましょう。

laravel/workbench/sukohi/hoge/src/Sukohi/Hoge/

このフォルダで独自クラスの作成&「HogeServiceProvider.php」の設定をします。

では、独自クラスを作成しましょう。このサンプルでは「Hoge.php」です。
フォルダ構成は以下のようになります。


Sukohi
 └ Hoge
   ├ Hoge.php
   └ HogeServiceProvider.php


そして、このHoge.php 内にご自身でやりたいことができるようプログラムを作成しましょう。
書き方は通常のPHPクラスとまったく同じですが、クラス名とファイル名は同じにする必要があります。また、ネームスペースをいれることにも注意してください。


(Hoge.php)

<?php namespace Sukohi\Hoge;

class Hoge {

    // Something...

}


では、次に「HogeServiceProvider.php」の設定を見ていきましょう。
やることは2つ。
register() と provides() メソッドにそれぞれ決まり文句を追加するだけです。

1.register()

 public function register()
  {
  $this->app['hoge'] = $this->app->share(function($app)
  {
   return new Hoge;
  });
  }

※「hoge」「Hoge」はあなたのパッケージ名に置き換えてください。


2.provides() 

 public function provides()
 {
  return array('hoge');
 }


はい。
これでここの作業は終了です。


では、次に以下のような形でクラスを呼び出せるように Facades を作成しましょう。

Hoge::method();

HogeServiceProvider.phpがあるフォルダに「Facades」というフォルダを作成し、さらにその中に「Hoge.php」を作成してください。
フォルダ構成は以下のようになります。

Sukohi
 └ Hoge
   ├ Facades 
   ├ Hoge.php
   └ HogeServiceProvider.php

そして Hoge.phpの中に以下のプログラムを書き込みましょう。


<?php namespace Sukohi\Hoge\Facades;

use Illuminate\Support\Facades\Facade;

class Hoge extends Facade {

  /**
   * コンポーネントの登録名を取得
   *
   * @return string
   */
  protected static function getFacadeAccessor() { return 'hoge'; }

}

※太字の部分がベンダー名とパッケージ名になります。大文字/小文字に気をつけてください。



では、次に Laravel からこのパッケージを呼び出せるように設定しましょう。
(いつものパッケージを composer からインストールしたときの手順と同じです。^-^)

Laravel/app/config/app.php 

を開いて、配列の providers の最後に「HogeServiceProvider」を登録し、

'providers' => array(

 (他のパッケージ), 
 'Sukohi\Hoge\HogeServiceProvider', 

),


さらに同じファイルにある「エイリアス」も設定します。


'aliases' => array(

 (他のパッケージ), 
  'Hoge' => 'Sukohi\Hoge\Facades\Hoge',

),


はい!
これでパッケージが完成しました。
もしエラーがでるようなら、フォルダの階層がまちがっていないか(←これは私のことです^^)、もしくは composer dump-autoload 、 composer update などをするとうまくいくことがあるようです。

ということで少し複雑でしたが、独自パッケージを作成手順でした。
ちなみに、フリーランスとしてプログラムの著作権をすべて渡してしまう約束の場合、こういったパッケージの開発は私はしません。全部持って行かれるのが悔しいパッケージは後のことを考えると便利ですが作成するのに少し時間がかかるので。(笑)
なので、プロジェクトとは別でゼロからパッケージを作成するようにしています。
でも、これってプロジェクトにとってもマイナスなんだけどなー。。。
この辺みんなはどうしてるんでしょう?

とにかくお疲れ様でした。



[参考ブログ(というかほぼ訳しただけ)]

http://culttt.com/2013/06/24/creating-a-laravel-4-package/

Thank you the author(s) of Culttt.com.
Your tip is really useful!
So I've just followed your twitter. :)))

2014-08-10

Laravelのキャッシュが消えない!

こんにちは。
ちょうど今、珍しく私の住んでいる地域に台風が直撃しているようです。
みなさんもくれぐれもお気をつけ下さいね。

さてさて、今回は数日前にリニューアル公開したインフォブログランキングの作業中に起こった「Laravelのキャッシュが消えない現象」についてご紹介しようと思います。

(はい。最近Laravel漬けになっています。知れば知るほど「すごいなー」とつぶやいています^^)





[最終結論: バグではないけど、別の仕様を追加してほしい]


まず、私に起こった問題は以下のようなものでした。


日付が変わると新しいデータをDBから取得して、それをまたキャッシュとして保存する。

↓↓↓

でもキャッシュが削除されず同じデータのまま。


つまり、その日ごとにデータを表示したかったのでその都度DBにアクセスをせずキャッシュを利用した、ということです。

実際のプログラムは以下。

if(Cache::has('key')) {

    return Cache::get('key');

}

// DBからデータを取得

$dt = Carbon::tomorrow();    // 明日の日付を取得
Cache::put('key', $value, $dt);
return $value;


前回紹介したCarbonを使っています。
※現在はより便利なCache::remember() を使っています。


一見問題なさそうなのですが、、、?
実はこれではキャッシュが消えなくなる(可能性を持っている)のです。


なぜなら、元々Laravelのキャッシュの有効期限はタイムスタンプではなく、「分」を使っているから

なのです。

つまり、上の例でいうと、

1.Laravelは、$dt を使って明日が始まる時間まで何分かを取得。
2.その分数を有効期限とするキャッシュを作成

???

やっぱり問題ないのでは、、、?

これが大有りなんです。


なぜなら、Carbon(dateTime)から分を取得するとき intval() で数字が切り下げになってしまう

のです。

そう!
つまり、キャッシュはまだ日付が変わっていないのに有効期限が切れて削除され、そしてその当日のデータ(すでに保存されているものと同じデータ)をまた新しく保存してしまうというものです。

インフォブログランキングは手前味噌ですが、なかなかページビューが多いサイトなのでこの僅かな時間に新しいアクセスがあり、キャッシュがうまく更新されていないという状況でした。


???

でも、新しいキャッシュができたとしてもまた、明日までの有効期限だからすぐに新しいデータに置き換わるのでは???


実は、これもそうでもないんです。

結論からいうと、

分数がゼロの時はキャッシュは永遠に保存されてしまう

からなのです。
つまり、分がintval()で切り下げられてキャッシュを保存し、そのキャッシュが削除ときには残り時間は予定の時間まで1分未満になります。

その1分未満はintval() でゼロに変換されてキャッシュが消えない状態になってしまうということですね。

ということで、インフォブログランキングをよろしく Laravelでキャッシュを使用する時にはお気をつけ下さい。^-^

※おそらく間違いはないと思っていますが、自信がない部分もありますのでこの記事に修正が必要でしたらぜひ教えてください。よろしくお願いいたします。m_ _m

ではでは〜。




2014-08-07

PHPで日付を扱うなら Carbonライブラリが便利すぎる!!

個人的にまた災難が起こってしまった後、はじめての投稿になります。
みなさんもお体にはくれぐれもお気をつけ下さい(汗)

さて、今回はPHPの日付に関する記事になります。
というのも、最近ハマっているPHPフレームワーク「Laravel 4」には Carbonが標準搭載されているようで、これを使ったらもう昔には戻れない!と思ったのでぜひ紹介&備忘録としてその使い方を公開したいと思います。




[最終結論] 直感的に使えるのでとても便利です!なんならLaravel以外での開発でも使っていこうと思いました。


では、使い方に行く前に注意点を少し。
Laravel での使用を想定しているので、基本的に static な使い方で書いてます。
必要に応じて new Carbon(); してインスタンスを作ってくださいね。
あと、PHPは5.3以上必要です。

また、よく使うだろうというものだけで、全てのメソッドは網羅していません。詳しくはCarbon(英語) を確認してください。


1.基本的な使い方。


・今の時間は?

 Carbon::now();

・今日が始まる時間を知りたい

 Carbon::today(); // (例)2014-08-07 00:00:00

・じゃあ、昨日は?

 Carbon::yesterday(); // (例)2014-08-06 00:00:00

・明日も教えて。

 Carbon::tomorrow(); // (例) 2014-08-08 00:00:00

・タイムスタンプがほしいんだけど?

 Carbon::today()->timestamp; // (例) 1407337200



2.足したり引いたりする使い方。


・今からちょうど一日後/前の時間は?

 Carbon::now()->addDay();
 Carbon::now()->subDay();

・3日後/前

 Carbon::now()->addDays(3);
 Carbon::now()->subDays(3);

 ※その他にも

 秒: second(s)
 分: minute(s)
 時間: hour(s)
 年: year(s)
 月: month(s)

 でも同様のメソッドが用意されています。

 例) addSecond(), subYears(5)


3.文字列から指定する使い方。

・次の水曜日は?
 
 new Carbon('next wednesday');

・今週の木曜日は?

 new Carbon('this thursday');

 ※この辺は英語の知識が必要になりますね。昔学校で習ったはずですが、、、(笑)


4.各種データを取得する使いかた。

 $dt = Carbon::now();
   
 $dt->year;
 $dt->month;
 $dt->day;
 $dt->hour;
 $dt->minute;
 $dt->second;
 $dt->daysInMonth;

 ※いつものごとく、月($dt->month)の数字はゼロから始まるので+1が現在の月のようです。
 ※逆に上記に数字を代入することで時間をセットすることもできるようです。便利!


5.多分必要になった時にとても感謝するだろう使い方。


・年齢

 Carbon::createFromDate(1980, 1, 1)->age;

・週末?

 if (Carbon::now()->isWeekend()) {

  echo 'パーティ!'; // 本家のサンプルにこう有ります(笑)

 }

・もう過ぎた?まだ?

 $dt = Carbon::now()->subDay();
 
 if ($dt->isPast()) {

  echo 'もう過ぎた!';

 }


 $dt = Carbon::now()->addDay();
 
 if ($dt->isFuture()) {

  echo 'まだ!';

 }

・タイムゾーンが知りたい

 Carbon::now()->timezoneName;


6.アロー演算子「->」の使い方。

 $dt = Carbon::now();
   
 echo $dt->year(1975)
     ->month(5)
     ->day(21)
     ->hour(22)
     ->minute(32)
     ->second(5);

 ※Laravelのように一気にかけるのはコードがスッキリして好きです。^^


と、ざっとこんな感じですね。
あとは日付の比較やBetween を使った便利なものもありますが、すこし複雑になるので気になった方は本家のCarbonのGitHubページをご覧ください。

それにしても技術は確実に進歩していっています。
より簡単に高度なプログラムが、しかも直感的に使えるようになってきていますね。

なお、Carbon はMITライセンスなので、開発者にはホントにありがたいです。
Brian Nesbittさん、ありがとうございます。


ということで以上です。
お疲れ様でした!


2014-07-03

AWS で"eb init" せず push するための設定

最近は新しい技術に触れる機会が多いのでとても刺激的な日常を過ごしています。^-^
ここのところ、新しいものをあまり勉強する機会がなかったのですが、自分のもっているスキルがいかに古くなってしまっているかを実感させられています。

(しかも嬉しいことに新しいことを学ぶ楽しさを思い出させてくれました。)

・・・ということで今回はAWS(Amazon Web Services) のGit を使ったデプロイシステム「EB」で、すでに作成されたレポジトリに後からアクセスする方法です。





[最終結論]: amazon が提供する zipファイルの中にしっかりと専用のファイルが入っていました。(汗)



では、まず前提としてなぜ "eb init" を使わないか、というと今回の案件の前任者がすでに作成していたので、新しくリポジトリを作成する必要がなかったからです。

もし、まだリポジトリを作成してない方はこのページは全く関係ないので注意してください。そして、もちろん git と eb はインストール済みという前提ですので、こちらも注意してくださいね。



では、順を追って実際の作業を説明します。


1.まず、AWS Elastic Beanstalk Command Line Tool からEBのパッケージをダウンロードして解凍しておきましょう。


2.ターミナル/コマンドプロンプト(以下のようなやつです)を開いて push したいプロジェクトまで移動しましょう。



例) cd /move/to/your/path


3.以下のコマンドを実行しましょう。


/(EBパッケージを解凍したフォルダ)/AWSDevTools/(Linux か Windows。←環境に合わせて選択)/AWSDevTools-RepositorySetup.sh

※Ubuntuなどの場合、もしかすると sudo とかが必要かも。


4.以下のコマンドを実行

git aws.config


5.以下の情報を入力

 ・パブリックキー
 ・シークレットキー
 ・リージョン(東京とか)
 ・AWS(EB)内のアプリケーションの名前
 ・環境

これで成功すれば、その場所で


git aws.push


とコマンドを打てば自動でデプロイしてくれます。
さらに、本番環境とテスト環境をもっている場合、


git aws.push --environmentの名前


とすると該当する環境の違う方へもデプロイができるそうです。(、、、が私は一度も試しておりません。^^;)


[参考ページ(というよりほぼ日本語訳にして丸写し。。)]:




Dan Hoerst, I appreciate you and your tip.
I could solve my problem earlier than I expected because of you!! :)


最後に、昔住んでたバンクーバーホテルの裏にあった図書館です。帰りたい、、、(笑)



2014-06-26

PHP + JavaScript(jQuery) でチャットするComet を作ったみた【ダウンロード可】

最近、おかげさまでホントに色々な案件に携わらせてもらっていて開発者としてまだまだレベルアップを感じている今日このごろです。^-^

ということで、今回は前々から気になっていた 擬似的なComet によるチャットシステムが必要になり、この部分は今後もきっと必要になる機会が多いんじゃないかと思いましたので、PHPとJSをパッケージ化して GitHub にアップしてみました。



使い方は README.md をご覧ください。(書き方はむちゃくちゃですが^^;)

[GitHub(Comet)]: https://github.com/SUKOHI/Comet/tree/master


[参考URL]: http://rewish.jp/blog/tech/php_with_jquery_comet

今回↑のページにはお世話になりました。ありがとうございます。 m_ _m


[追記]: 実際にテストページを作ってみました。





「 こんな短いブログ記事初めて(笑) 」