supermannerの落書き

基礎からおさらい。おさらいが何よりも大事なのです。ふわっとした知識、撲滅!

1年でLaravelとCakePHP3を使った話

この記事はdots.女子部 Advent Calendar 201622日目の記事です。

業務でたまたまこの1年は上記の2つをよく使ってきた(前半Laravel/ココ最近Cake3)ので、それぞれのメリットデメリット、イイなと思う点等を比較してお送りしていきたいと思います。

githubのスター数

https://github.com/cakephp/cakephp https://github.com/laravel/laravel

圧倒的Laravelですね!さすが今一番乗ってる(?)と言われてるPHPフレームワークです 勉強会等でもLaravelは積極的に取り上げられている他, twitter界隈でも優しい感じの偉い人が多いイメージが有りますね。

Laravel

好きな点

では次に個人的にイイと思うLaravelの利点を紹介していきたいと思います。

ViewComposer

viewComposerの詳しいドキュメントはコチラ

何がイイかというとViewロジックをごっそり分離できる点です。 どのtemplateにどの情報を紐付けるか、やUAでのだしわけ等もこちらのcomposerを使えばスッキリ書くことが出来ます。

MiddlewareとServiceProvider

Middlewareを作成してServiceProviderに登録し使用するという手法はさまざまなフレームワークでも取り入れられているしそうですが、とりわけLaravelはスッキリ完結でわかりやすいコード体系なのではないかと思います。だいぶ前に書いた記事がまさにそうですが、簡単かつ直感的に共通コードを抜き出せるのは, 大きいと思います。

うーんな点

Repositoryパターン

https://bosnadev.com/2015/03/07/using-repository-pattern-in-laravel-5/ ココで結構詳しく書いてくれています。 共通して使うModel寄りビジネスロジックは注入して使うのがスタンダードな模様なのですが、 EntityとTable系のつながりが見えづらいかな?と思いました。後述しますがCakeはこの辺が直感的でわかりやすいです。

CakePHP3について

Cake歴はまだそんなにないのですが、1ヶ月ほどつかってみて良いなと思った点をあげます

好きな点

Hashが素晴らしい

CakeのHashクラスは相当強力です。ナマで書くと相当な行数になってしまうようなループも、このHash関数で一発できれいに記載できます http://api.cakephp.org/3.3/class-Cake.Utility.Hash.html

ORMの挙動がわかりやすい

これは好き好きあると思うのですが、自分はCake3のORMは割と好きです。 Modelとしては1Entityを扱い, TableRegistoryはtable全体に対して働くのが直感的

うーんな点

共通コンポーネント

ComponentとBehaviorはまだつっこんで使っていないのですが、Laravelのほうがきれいな階層としてかけそうな気がする。。

RequestParamsに対するValidatorがいない

Laravelで言うところのvalidator::makeで作成するあいつがいません。 Cakeはsave時にEntityに対してvalidationが働き、もしinvalidな値であればfalseを返す、というような挙動をとります。 すぐに検知したいタイプの私としては, とっても気持ち悪いです。。。。

両方使ってみて

つきなみな言葉ですが、一長一短ではあります。 ただ、自分はシンプルと直感的、またコアコードが読みやすいというのをかんがみてLaravelのほうがすきだな、と思いました。 とは言えCakeも3になって私のしっているCakeとは大きく変わっていたのでこれからが楽しみです。

Laravelにおける, ExceptionとMiddlewareGroupの問題

とても長いことブログを書いていなかったのですが、久しぶりにググり力をためされるTipsを得たので、
他のものと合わせて記載しておこうかなと思います。
最近はLaravelを使うことが多いのでLaraveのことを書きたいと思います。

Exception/HandlerとAuthGuardUserについて

未だに最適解がわからない

背景

よくあるHeaderのグローバルナビにログイン状態を表示していたのですが、そこのログイン判定を

\Auth::guard('user')->check();

な感じで行っていました。そのため、404なrouteにアクセスしたり等の `Exceptions/Handler.php` でハンドリングされるエラーにかかった時、
全ユーザーが未ログイン状態の表示になってしまいました。。。。

方法1(ボツった方)

ググり力を駆使した結果Kernel.phpをいじれというのを見かけました。具体的には

$middlewareGroups = [
    'web' => [
        \Illuminate\Session\Middleware\StartSession::class,
        \Illuminate\View\Middleware\ShareErrorsFromSession::class
    ]
];

middlewareGroupsにいたこの2個を

$middleware = [
    \Illuminate\Session\Middleware\StartSession::class,
    \Illuminate\View\Middleware\ShareErrorsFromSession::class
]

もちろんすべてのHTTPリクエストに対して働くので, 取得できました。

問題

これ、私大きく勘違いしていたのですが、Laravelの標準で、webのmiddlewareGroupは設定されていたのですね。
確かに、セッションを使いたくないリクエストもあるかもしれません。。。。
指摘されるまで気づかず、Qiitaに投稿してしまった(現在は削除済み)
危険そうだなと思ったのでこの方法は取らないことに。

方法2

ということで結局、menu部分は非同期で取得することにしました。
大本が404でも、メニュー部分はきっちりrouting通過できるので....。

結局...

Exceptionに引っかかったときはそこで処理は一旦終わりだという方針なのでしょうか。
良い感じに処理順を指定Groupのみで変更できないんですかね。
いい方法があるよという方はぜひ教えていただきたいです...!!!!!

おまけ

久しぶりにQiitaも書きました(*´ω`*) マニュアル or コードをよく読まないとこういうしょうもないところにハマります。。。という自戒の念をこめて!
qiita.com

Milkcocoa Girls ! Milkcocoa Meetup vol10 に行ってきました

勉強会ラッシュです。
今回は普段dots.女子部で一緒に運営をやっている りほやん氏 と ちゃんとく氏, あおいちゃん氏がLTをするということで、
発表を聞きに行きました。

Milkcocoaとは?

Milkcocoa | リアルタイムアプリ・IoTやるならMilkcocoa

> Milkcocoaは、IoTデバイス・スマートフォン・PC間で簡単にリアルタイムなデータのやり取りが出来るようになるクラウドプラットフォームです。
とあるように、自前で用意しようと思うと骨が折れる部分を完全に担ってくれるようです!

では、本題のLTについて覚えている限り書いていこうと思います。

MILKCOCOAでエクスペクトパトローナムする話/ りほやん氏

まずは、りほやんの乾杯から始まります!!

お題は、ハリーポッターの魔法をワンド(スマホ)で使ってしまおう!といったもの。
milkcocoaはリアルタイム通信ができるので、
スマホから座標を取得し、発表スライドにギミックを反映させる」
といった内容でした。
Talkie.jsを使用してスライド作成していたのでそのまま
発表中にいろいろな魔法がスライドに現れますw

作り方に関しては「まず、サンプルを全コピします!」と言っておりましたw

もちろん題材も面白かったのですが、なにより確かになぁと感心させられたことは
「milkcocoaの実装がらくらくできる分、アイデア勝負」
と言っていたことです。たしかに、らくらく実装ということは発展させるアイデアがよくないと死んでしまう可能性もありますからね。。。

Milkcocoaと戯れてみたお話 / あおいちゃん氏

次はあおいちゃんの発表。本日がLTデビュー戦だそうです!

主に、どういう形で今回milkcocoaを学習したかをまとめてくださっていました。
まずはgithub本家をみて学習されたそう。
「JSだけで動くからGithub.ioとかで使うと便利そう!」と、次なる制作への意欲を燃やしていました!
チュートリアルあるあるな掲示板で学習のアウトプット。
お手軽にこういったものを試せるのも、milkcocoaの利点なのかもしれませんね。

おひぃボタンをつくる(仮) / みほ氏

このセクションは本当に賑やかでしたw
みほさんが作成したのは「へぇボタン」ならぬ「おひぃ」をならすGAYAというサービス
※現在Basic認証かけられていて実践はできない模様...残念
このような感じで、手持ちのデバイスからボタンをおすとリアルタイムで画面にコメントと、
あと音声が反映されます。

なかでも今回の参加者はみんな「おひぃ↑」ボタンに激ハマり。
本当によい音声素材でした。(みほさんの会社の方だそう)
時間配分としてはmilkcocoaにかけた時間はなんと5%だそうです!

こんなところからもお手軽さが伺えますね!

milkcocoaでウェーイする / ちゃんとく氏

最後はちゃんとく氏のお誕生日を祝うツール
本来milkcocoaはリアルタイム通信を20台で行えるらしいのですが、今回はちょっとしたトラブルでlocalhostでたちあげたため、
このような乖離が生まれてしまいましたとのことですw

使用された技術は

とのことです。
実際の動画をとってくださった方がいらっしゃいました!

ちゃんとく氏も、実際に苦労したのはViewの部分で、milkcocoaではほとんど躓かなかったそうです。

勉強会の雰囲気について

今回は今までの勉強会より少し小規模で、アット・ホームな雰囲気で行われたようです。
過去の勉強会はこちら
mlkcca.connpass.com

今回はアイデア豊富で面白いLTが多かったことも手伝って、和気あいあいとした雰囲気で発表のセクションがおわりました。

懇親会にも参加したのですがLTされた方が発表中ちょっとしたトラブルで思うように動かなかったということを話した時に、
皆でその問題を解決しよう!とわいわいあつまって原因をさぐり、無事解決した時にはおお!と思いました。
勉強会に顔を出すようになったのは最近の話なので、いつもちょっとドキドキしながら懇親会等にでるのですが、
レベルや技術の垣根を超えてLTの内容や、JSのお話ができたきがします。
まだ勉強会とか言ったことはないんだけども、言ってみたいという方、おすすめします!!!!

まとめ

懇親会でエバンジェリストののびすけさんから伺ったお話ですが、極力難しいことを意識せずに、作りたいものを作りたいひとが作ることができるように作られたもののようです。
りほやん氏もLT中にいっていましたが、アイデア勝負でどのようにも変身できるすごいサービスだなと思いました!
Javascriptやweb socket等に普段馴染みのない方でも、もっと言ってしまえばプログラミングをしたことないんだけど作ってみたいものがある方でも、かなり障壁低く動くものが作れるのではないでしょうか。
GWを利用して私もなにか作ってみたいと思いました!

おまけ

今回のイベントのtogetter
togetter.com

会場の21cafeさん
geechs-magazine.com

PyLadies Tokyo Meetup #11 に参加しました

お久しぶりです。
大分長いことブログをサボっていました...。

今日は四月だし、なにか新しいことを始めたいなと思い、
pyladies-tokyo.connpass.com
こちらの勉強会に参加させていただきました!

まずはじめに、@nobolisさんのセッションからスタートです。

Pythonとはなにか、からおすすめ書籍、オススメ勉強会等
Python1年生に有益な情報を教えていただきました!
中でも、twitterにメモった私がおお!と思ったものを何点か紹介します!

  • Pythonはバッテリー付属と言われている
  • ラズパイもPython
  • PerlPythonは設計思想がまったく反対
  • Pythonistaは親切な人が多いw

Pythonはドキュメントをかけたり、データ解析から、WEBアプリまでなんでもござれ。
ラズパイは周りの知り合いがみんなnodeでやりたがっているので其のイメージが強いですが、
Pythonで動いていたんですね。

中でもPerlPythonの設計思想の違いは興味深く聞けました!!

つぎに@maayaさんによる、はじめてのPython講座!

Pythonのコンソールの使い方をきいたあとに、Pycharmをつかって画像を取得し
保存するというスクリプトをみんなで一から追っていきました。
今回は、私のように普段WEBアプリを作っていたり、業務系アプリを作っている方等
プログラミングが仕事の方と、そうでない方が半分ずついらっしゃったのですが、
初めての方にもとても丁寧に指導されているのが印象的でした!
私も久しぶりにIDEを使用したので、生粋のVimmerですがIDEもたまにはいいな、と思いながら
色々と触っておりました〜。

ライセンスをかけたじゃんけん

最後にJetBrains IDE プレゼント抽選会でのじゃんけん!
私は昔InteliJ使いだった時期もあり欲しかったのですが割と序盤で負けましたwww
いいさ、私にはvimがある...

参加してみて

今回は入学式ということで、全くプログラムを書いたことのない方でもPythonから始めてみようと思えるような勉強会だったと思います!
経験者の方であれば、PyLadiesの雰囲気や、どのMeetupがどれくらいのレベル感の内容を実施されているのかもも感じられてよかったと思います。
なにより、運営のお二人がとても丁寧で、印象がよかったのがとても心に残りました。
次はもうちょっと踏み込んだ内容のMeetupに参加してみたいです。
中級者からは輪読会にも参加できるらしいので、当面のPythonの目標は輪読会参加、とさせていただきます^0^

nodeのmodule.exportとexportについておさらい

大分日付があいてしまった....。

今年はアドベントカレンダーに参加してみました!
こちらの8日目の記事を書かせていただいてます。qiita.com


実はもう1回自分のターンがあるのですが、そこで最近はじめたnodeを使ってみようかなと思い
ふわっとした部分を落としこむために今回のエントリを書きます。

nodeのmoduleについて

ブラウザで使用するJSについては外部JSはscriptタグを用いてよみこんできますが、
node.jsではrequire('/path/to/module')という形で読み込みます。
私は、普段の開発ではPHPでサーバサイドを記述することが多いのですが、
一般的なMVCフレームワークでいうところの, controllerからmodelのmethodを呼び出す感覚
みたいなものと思うとやりやすいなと思いました。
まぁ、よく使う機能がきちんと一つのmoduleとしてカプセル化できていれば当たり前ですね...。
JSではよくゴミコードを書きなぐっているので気をつけなければ、と思います。

exportsとmodule.exports

node.jsの学習の仕方として大きく間違っている可能性大なのですが、
PHPで昔作ったWEBアプリを載せ替えてみようとおもい、expressにリプレイスする計画を立てました。
とりあえず初期状態のコードをリーディングしてると、module.exportsに出会います。
よくmodule.exportsとexportsは一緒だから、迷ったらmodule.exportsを使えと
書いている記事を見ますが、この2この違いに関しては次こちらの記事が分かりやすかったです。

d.hatena.ne.jp

exportsをあえて使う要素があまり見当たらないような...????
例えばですが

exports.apple = 1;
exports.banana = 2;

単純にこういうプロパテイ定義だけをしたい時とかですかね....???

var fruits = { apple: 1, banana: 2};
module.exports = fruits;

こっちのほうがいい気もする...

※exportsはオブジェクトとか突っ込めない

先ほどの記事でありました、最後に全滅していた例。
結局exportsにつっこむのは、module.exports = {}というオブジェクトの参照にたいして
プロパティにアクセス掛けて突っ込んでいるので、exportsそのものを書き換えてしまう行為をすると残念な感じになる
ということらしいです。

exports = {
    have: function(food) {
        console.log('i have ' + foor);
    },
    cook: function(food) {
        console.log('i cook ' 
    }
}

こういうことしても、requireされるのは{}になっちゃうってことですね。

さて, 話を戻して先述の記事で、結局module.exportsの値を返す様になってると解説されていましたね。
だからみなさん、わからなければmodule.exportsを使いましょうと言っていたわけか。
直感的にnewとかして使いたいときはexportsだとわかりにくいコードになりそうです。

ECMAScript6のブロックスコープで遊んでみた

先日, ECMAScriptのイベントに遊びに行きました!
そこで色々と話しを聞いて興味を持ったので自分でも新機能をちょいちょい試しています。

今回は便利だなーとおもった構文の一つ、「let命令」で特にいいなとおもったものを試しました。

従来の即時関数を使ったテクニック

Javascriptのスコープは、

  • グローバルスコープ
  • 関数スコープ

のみなので、前回の記事のようなスコープをちょっと気を付けてやる必要がありました。tofumental.hateblo.jp

ここで、汚染を防ぐために即時関数でカプセル化っぽくしてあげるのが定石ぽいです。
(私はガンガンのJSerじゃないので, 何が定石かは調べつつですが)
参考になるのはこちらのQiitaqiita.com

var hogehoge = (function (sweets, drink) {
    var myBody = sweets + drink;
    console.log(myBody);
    return myBody;
}('odango', 'matcha'))

console.log(myBody);

myBodyはnot definedになり、グローバルの変数は汚染されてないことになります。
この処理を即時関数化せず、だらだらっっとかいてると当然のごとく汚染されます。

ECMAScript6での記法

ここで、ECMAで書くとどうなるかというと

{
    let Mybody = 'dango' + 'matcha';
    console.log(Mybody);
}

console.log(Mybody);

以上!スコープでくくってやるだけで同じ効果が得られます!

おまけ

今回の実行コマンド

 babel-node hogehoge.js --presets es2015

babelを入れて実行しましたよー(^O^)

速習ECMAScript6: 次世代の標準JavaScriptを今すぐマスター!

速習ECMAScript6: 次世代の標準JavaScriptを今すぐマスター!

JSの変数スコープについて

大分お久しぶりです。

クライアントサイドを始めとして、jsの既存のコードをメンテする機会がふえてきたんですが、元のコードに「おまじない」だとか「なんかしらんけどうごく」とか書いてると、「いやいやおまじないじゃねーよ!!!理由があるんだよ!!!!!」とつっこみたくなります。

 

今回はjsのスコープについて基本的なことをおさらいがてらメモしようと思います。

まずは、よっぽどのことでも起きない限りだれでもパッと見て直感的にわかるタイプのコード 

var monster = 'poppo';

function getRareMonster() {
    var monster = 'pika';
    return monster;
}

console.log(getRareMonster());
console.log(monster);

当たり前ですが、レアモンスターをゲットする方は'pika'がはいってきます。

では次です

monster = 'poppo';

function getRareMonster() {
    console.log(monster);
    var monster = 'pika';
    return monster;
}
getRareMonster();

この位置で、monsterには一体何が入ってるでしょう。
poppo???pika????
実行してみましょう。

% node monster.js
undefined

undefinedなんです。これグローバル変数はいると思った人がなんでだろーっておもって無理やりなんかしら代入して処理進めたら大変なことになります。
というのも、javascriptの言語仕様的に、ローカル変数はスコープ内で有効となるのです。
背後でvarによって変数定義されていると、monsterは関数内ですでに「ローカル変数: monster」として有効になるのです。
そしてまだ何も代入されてないのでundefined。
ローカルスコープ内で無闇矢鱈に変数を色んな所でぼこぼこつかったりすると死んでしまうので注意が必要だった、というお話でした。
もちろん、名前がかち合ってなかったらどんどんスコープを滝登してグローバルスコープをよんでくれます。

var monster = 'poppo';

function getRareMonster() {
    console.log(monster);
    var rareMonster = 'pika';
    return monster;
}

getRareMonster();

この場合はグローバルスコープが読まれます。