ysku's blog

ウェブ・無線通信・組み込みとか

福岡でUber使ってみた!【みんなのUber】

福岡でUber使ってきました!

2月5日の10時からなんと「福岡市」でライドシェアの検証プログラムが始まりました!
この検証プログラムは日本で初めての試みみたいです!
詳しくは以下のブログを確認してください!

Japan | Latest News & Stories | Uber Blog


自分自身は東京では使用したことなく、今回が初めてのUberの利用でした。

まず、以下のリンクからアプリをダウンロードしました。

Uber

Uber

  • Uber Technologies, Inc.
  • 旅行
  • 無料

開くと登録が求められますが、Facebookとの連携も可能で簡単でした。
次にクレジットカードの登録を求められました。(今回の検証プログラムということもあり、お金を取られることはないみたいです)

すると以下のような画面が!
f:id:yusuke1581:20150205184123p:plain
ほぼリアルタイムで動いていました!見ているだけで面白い笑

「乗車場所を設定する」を選択と目的地の設定をして、「みんなのUberを依頼する」を選択すると、配車完了!
あとは画面を見ながら待つだけ!
f:id:yusuke1581:20150205184105p:plain

キタキター!笑
f:id:yusuke1581:20150205184112p:plain

みんなのUberでは、東京で行われているサービスと異なり、ドライバーが自家用車を使っているので、どれか戸惑いました。
ドライバーさんは自分の名前を確認するとドアを開けてくれ、テンションMAXで乗車!
ドライバーさんの自家用車なので中は普通な感じでした。
f:id:yusuke1581:20150205184309j:plain

安全運転で目的地まで到着!
便利!笑
しかも楽しい!
f:id:yusuke1581:20150205190649p:plain
乗車後にはドライバーさんに対するレビューや評価を行えました。


【ドライバーさん側は?】
ドライバーさんにいろいろ伺ったのですが、まとめると以下のような感じでした。
・賃金が高め
タクシー免許不要で、普通のバイトより稼げると興奮気味でした。
・簡単に使える
お客さんが配車を依頼した時点でスマホ画面上のマップに位置が表示され、ナビゲーションに従って目的地まで運転するだけでとてもシンプルと言っていました。
・暇なときに出来る
ドライバーさんは他の職業をしているのですが、時間があるときにアプリを起動すればドライバーを務められるそうです!(これは海外版と同じみたいですね)

【乗る側は?】
・アプリのクオリティーが高い
ユーザビリティが高く、初めて利用する自分も簡単に操作できました。
乗る前から乗った後まで、良いUXを提供していると思いました。
(ただ、自分のプロモコードを表示させるのがわかりにくかった部分はありました)

・料金
タクシーより安ければ乗るかなーといった印象でした。今回は無料なので良かったのですが、実際にどうなるかはわからないです。米国のUberでは課金制はアルゴリズムを使い、祝日などのかき入れ時やラッシュアワー悪天候時は、料金がどんどん割増になる制度を取っているみたいです。

・リスク
事故は日本での規定はわからないですが、サンフランシスコUberの規定では、自前の車を使用している運転手が事故に遭った場合、その運転手に過失がなければ、乗客に賠償金は支払われないとのことで、もしものことを考えると少し怖いかなと思いました。

・楽しい
個人的にマップ上に複数の車が表示されて動いているのを見るだけで楽しかったです。特に配車を依頼して車が自分のいる位置まで来るときはたまらなかったです笑

以上が、福岡でUberを使ってみた感想になります!福岡市に住んでる人はぜひ一度利用してみてください!

参考記事:http://punta.jp/archives/23141

CakePHPのForm Helperの使い方

f:id:yusuke1581:20141112005253j:plain
簡単にまとめてみました.

<?php
        echo $this->Form->input('name_last', array(
                'label' => false,  → 生成されるinputタグをlabelで囲むかどうかを指定
                'type' => 'text', → フォームに入力される値のタイプ(ex text, checkbox, file, etc...)
                'class' => 'form-control form-name',  → inputタブにつけるクラスの指定
                'div' => array( → 生成されるinputタグを囲むdiv要素へのクラスを指定
                        'class' => 'input input-name',
                ),
                'placeholder' => '姓', → フォーム内に表示される文字列の指定
        ));
?>

モデル上での他のモデルを呼び出す【cakephp2.X】

f:id:yusuke1581:20141112005253j:plain
CakePHPを使用していて,あるモデル上で他のモデルを使用したいということがあったのでメモ

以下の2つモデルがあり,
・FirstModel.php
・SecondModel.php
一つ目のモデル内で,二つ目のモデルを使用するとする.
この場合,以下のようにしたらできるとのこと.

<?php
App::uses('AppModel', 'Model');
class FirstModel extends AppModel {
        
        public function test() {
                // SecondModelの呼び出し
                App::import('Model', 'SecondModel');
                $secondModel = new SecondModel();
                // 適当にfindを使ってみる
                $data = $secondModel->find('first');

以上がcakephpにおいて,あるモデル内で他のモデルを呼び出す方法でした.

POSTされるデータ構造【CakePHP2.x】

f:id:yusuke1581:20141112005253j:plain

適当なメモです.
postされるデータのフォームによる違いに関してです.

以下の様なテーブルがあるケース
テーブル名:tests
カラム:
・id
・name

ビューの実装

echo $this->Form->create('test', array(
      'type' => 'post',
));
/* ケース1 */
echo $this->Form->input('name', array(
        'type' => 'text',
));
/* ここまで */

/* ケース2 */
echo $this->Form->input('name', array(
        'type' => 'text',
        'name' => 'hoge',
));
/* ここまで */

$options = array(
	'label' => 'submit',
);
echo $this->Form->end($options);

ケース1の出力
f:id:yusuke1581:20141227224723p:plain

ケース2の出力
f:id:yusuke1581:20141227224735p:plain

nameを指定することで,inputタグのnameの部分が両ケースで異なります.


実際にpostしてみたときのデータ構造は以下のようになります.
ケース1でpostされたデータの構造

Array ( [Test] => Array ( [name] => hoge ) )

ケース2でpostされたデータの構造

Array ( [hoge] => hoge )

簡単なメモでした.

HTML5のvalidateとCakePHP

f:id:yusuke1581:20141112005253j:plain
モデルにて$validateを定義すると,viewに実装したformにてバリデーションが行われるわけですが,ちょっと面倒な部分があったのでメモ.

例えば以下のようなバリデーションルールを作成し,

public $validate = array(
	'name' => array(
		'notEmpty' => array(
		        'rule' => 'notEmpty',
			'message' => 'hoge',
                ),
        ),
);

ビューに以下のようなフォームを実装した場合,

<?php
	echo $this->Form->create();
	echo $this->Form->input('name', array(
		'type' => 'text',
	));
	$options = array(
		'label' => 'submit',
	);
	echo $this->Form->end($options);
?>

f:id:yusuke1581:20141227025108p:plain
このように入力する前からフォームが赤い枠で囲われてしまいます.

実際に出力された要素を見てみると以下のようになっていました.
f:id:yusuke1581:20141227025358p:plain
required属性(入力必須であることをブラウザに知らせる)が指定されていて,これが初期状態から赤い枠で囲われてしまう原因となっています.

required属性を出力させないようにするにはどうしたらいいかと言うと,モデルにて定義したバリデーションルールに'allowEmpty' => trueにすれば解決します.
実際のコードは以下のようになります.

public $validate = array(
	'name' => array(
		'notEmpty' => array(
		        'rule' => 'notEmpty',
			'message' => 'hoge',
                        'allowEmpty' => true,
                ),
        ),
);

これで赤枠が取り除かれます.

ただ,'allowEmpty' => trueにすると,フォームが空の状態でもsubmit出来てしまいます.
どうすればいいんでしょ...

バリデーション【CakePHP2.5】

f:id:yusuke1581:20141112005253j:plain
CakePHPのバリデーションに関するメモ
コントローラにてvalidateを行いたい場合の実装方法です.

Userというモデルがあると仮定しています.
テーブル名:Users
カラム
・name(名前)
・tel(電話番号)
(メモであるため、簡略的に作っています)

使い方
1)ビュー側の実装
フォームを作成します.
test.ctp

// 入力フォームの作成
<?php
    echo $this->Form->create('User', array(
        'type' => 'post',
        'url' => 'test',
        'novalidate' => true,   // HTML5でのバリデーション機能の無効
    ));
?>
<?php
    echo $this->Form->input('name', array(
        'label' => 'name',
        'type' => 'text',
    ));
?>
<?php
    echo $this->Form->input('tel', array(
        'label' => false,    // falseにするとlabelが作成されません
        'type' => 'tel',
    ));
?>
<?php
    $options = array(
        'label' => 'next',
    );
    echo $this->Form->end($options);
?>

2)コントローラ側の実装
だいぶ適当です.
ビューのtest.ctpにてsubmitボタンが押された場合,このコントローラにて処理が行われるようにしています.

<?php
App::users('AppController', 'Controller');

class UsersController extends AppController {

    public function test() {
        if ($this->request->is('post')) {

            // モデルにpostされたデータをセット
            $this->User->set($this->request->data);

            if ($this->User->validates()) {
                // バリデートが成功した場合
            } else {
                // 失敗した場合
            }
        }
    }
}

コントローラでバリデートを行う際に使用するのは,「validates()」です.
ちなみに「validate()」を使用すると,モデルにて設定しているバリデーションの条件の配列が返されます.

3)モデル側の実装

<?php
App::uses('AppModel', 'Model');

class User extends AppModel {

    public $validate = array(
        // 2つの条件を設ける場合
        'name' => array(
            'notEmpty' => array(
                'rule' => 'notEmpty',
                'message' => 'required'
            ),
            'between' => array(
                'rule' => array('between', 1, 20),
                'message' => '20文字以内で入力してください',
            ),
        ),
        // 条件1つのみの場合
        'tel' => array(
            'rule' => 'numeric',
            'message' => '数字を入力してください',
        ),
    );
}

ここでnameやtelで指定しているのですが,これはviewのinputで指定している名前になります.
よくわからないですが,以下のようにviewのinputに別のnameを与えてもvalidateを行えます.

<?php
    echo $this->Form->input('name', array(
        'label' => 'name',
        'type' => 'text',
        'name' => 'hoge',
    ));
?>

また他のモデルを使用するために,以下のようにドット記法を使用してもvalidateが行えるようでした.

<?php
    echo $this->Form->input('Post.name', array(
        'label' => 'name',
        'type' => 'text',
        'name' => 'hoge',
    ));
?>

以上が簡単なメモになります.

Webサイトのアクセス制限【CakePHP 2.x .htaccess】

f:id:yusuke1581:20141112005253j:plain
サイトの開発段階では関係者以外のアクセスを制限します.
その方法を簡単にメモしました.

  • Apache Configファイル設定
# vi /etc/httpd/conf/httpd.conf

.htaccessを有効にします.

AllowOverride None

AllowOverride All

AllowOverrideをNoneにしてあると、今からアクセス制限を行う.htaccessファイルが完全に無視されてしまいます.
これはCakePHPの初期設定でAllにされているかと思います.

その後、設定ファイルを再ロードにより有効化します.

# /etc/rc.d/init.d/httpd reload
  • ログインユーザ設定

ログインユーザの登録

# htpasswd -b -c /etc/httpd.conf/.htpasswd [ユーザ名] [パスワード]

ここでは、
ユーザ名:hoge
パスワード:hogehoge
とします.

オプション

  • c:新しいパスワードファイルの作成
  • b:パスワードを、対話式入力ではなくて、コマンドライン引数として指定

ユーザ名が登録されているかを確認します

# cat /etc/httpd/conf/.htpasswd
  • パスワード制限設定

ここでは、/var/www/html/cakeディレクトリ以下のファイルに制限を加えていく場合を考えます.

/var/www/html/cakeディレクトリ内の.htaccessファイルを書き換えます.

変更前

<IfModule mod_rewirte.c>
     RewirteEngine on
     RewriteRule     ^$   app/webroot/              [L]
     RewriteRule     (.*)   app/webroot/$1        [L]
</IfModule>

変更後

AuthuserFile  /etc/httpd/conf/.htpasswd
AuthGroupFile    /dev/null
AuthName “secret page”
AuthType Basic
require user hoge  (先ほど登録したユーザ名)

<IfModule mod_rewirte.c>
     RewirteEngine on
     RewriteRule     ^$   app/webroot/              [L]
     RewriteRule     (.*)   app/webroot/$1        [L]
</IfModule> 

以上になります.