ITの隊長のブログ

ITの隊長のブログです。Rubyを使って仕事しています。最近も色々やっているお(^ω^ = ^ω^)

【Angular】コンパイルエラー 「@types/jasmine/index.d.ts」

ERROR in [default] /Users/user/node_modules/@types/jasmine/index.d.ts:39:37 
A parameter initializer is only allowed in a function or constructor implementation.

ERROR in [default] /Users/user/node_modules/@types/jasmine/index.d.ts:39:45 
Cannot find name 'keyof'.

ERROR in [default] /Users/user/node_modules/@types/jasmine/index.d.ts:39:51 
'=' expected.

いつもの通りにAngular cliを使って、ng init && ng serveとかでコンパイルしたら上のエラーが発生した。

なんぞこれ? なんか実装ミスった?

わかりやすそうなメッセージは「A parameter initializer is only allowed in a function or constructor implementation.」だと思ったから、これでググッたところ、typescriptのエラーだって。よくわからん。

で、泣きそうになっていたら、下記issueを発見。

github.com

おうおうおう。

A workaround that I’ve found is to change to version 2.5.41. I guess that the problem is in the last update of the jasmine typings

ありがたい。さっそくpackage.jsonjasmineのバージョン箇所を書き換える。

^2.2.30となっているはず。これを2.5.41へ変更する。

  "devDependencies": {
    "@types/jasmine": "2.5.41",

これで、npm installをタイプしてアップデートすればおk.

ふぅ。1時間orz.

【Angular2.x】bodyタグにclassを追加・削除したりする

Angularでは、Component外のDOMにアクセスする方法は用意されていないらしい。

なので、色々ググってみてやりかたをみているとhackっぽくて

  1. 'body'というセレクタを持つComponentを作る
  2. Angularのライブラリをhackしてアクセスできるようにする

という感じ。うーん。どうしたもんか。

単純にdocumentから取れんのか。。。取れた!?

let body = document.getElementsByTagName('body');
body[0].classList.add('added-class-name');
body[0].classList.remove('remove-class-name');

これだけみると普通のJavaScriptですが、Angularのコード内でやっているからちょっと違和感ある。

うん。修正することができました。でもこんな記事みたこと無いけどな。やっちゃダメなのかな?

【読書メモ】未来を拓く君たちへ

仲の良い同僚から、この本オススメ!といい、借りて読みました。1時間ぐらいで読めると思います。

未来を拓く君たちへ (PHP文庫)

未来を拓く君たちへ (PHP文庫)

ぶっちゃけると、私が読む本ってだいたいエンジニア向けなので、あまりこういう表紙の本を好んで買って読んだりしませんでした。ええ、食わず嫌いってやつです。

で、感想なんですが、すごく面白い。 目からウロコってやつですかね?

内容自体はぶっ飛んでいる内容ではありますが、ちゃんと説明を書いていることで、腑に落ちることが多く、合わせて文章も短くて短時間で読めることができると思います。すごく読みやすかったです。なんて本だ。

内容は是非読んでほしいので、目次メモだけ。

  • 「悔いの無い人生」を生きるために
  • 「満たされた人生」を生きるために
  • 「香りある人生」を生きるために
  • 「大いなる人生」を生きるために
  • 「成長し続ける人生」を生きるために

あとは感想メモ ※本の内容を模写せず、自分が記憶した内容をメモしているので、もしかすると人によっては意図の解釈が違うかもしれないので、ご了承下せぇ。

  • 「人生」は登山だって
    • 辛くてやめたくなったり、頂上と思ってまだ中間だったりと、色々キツイことがあるが、登りきるまでが人生。
    • だから人は成長し続けなければならない。止まってはいけない。
  • 「志」を持って生きよ。
    • 「志」ってなんですか? って人はまさしく読んでみるべし。私もまだ曖昧だけど、一生懸命生きようとは思った。
  • 「成功する」はわからない。でも「成長する」ことはできる。
    • これまで味わった不幸なことは、すべて「それがあったから」に置き換えることができる。そう解釈することができる。
  • 人生はいつ終わるかわからない、明日死んでしまうかもしれない。常に「死」を意識すること。
    • スティーブ・ジョブズも言っていたような気がする
    • 「過去」や「未来」にとらわれてはいけない。
    • 「死」は不安なことではない。「人生の終わり」は誰でもあるから、それを意識することで「今」という一瞬を大切に生きることができる。「今」を「生き切る」ことが大事。
  • 仕事は些細なことであっても、それがあることで人を幸せにすることができる。
    • 今やっている仕事は辛いもの? それとも誰かを喜ばせる、楽しませるもの?(搾取される意味ではないと思う)
    • 書籍では、大きな石を切断する職業(よくわからんから大工でもいいよ)の2人が話すことを例に出す
      • 一人は「この忌々しい大きな石を切るのが大変なんだ!」と話す
      • 一人は「多くの人々の安らぎの場となる、素晴らしい教会を作っているのです」と話す
    • この辺は「7つの習慣」とかでも書いてそうな話。win-winの関係とかの内容とマッチするのでは?
  • 出会う人すべては縁がある
    • 嫌な人でも、縁があって出会ってきた。出会いの縁は大切にしなければならない。
    • これだけが納得いかない点。実際にそういう人はいるが(いわゆる腐れ縁ってやつ)、私が正直にその人に向き合うことでその人も正直に答えてくれるという。そんなことってあるかなー? イメージできないorz
  • 世界を変えたいなら、一人ひとりが意識しなければならない
  • 人生の終わりは「死」ではない、「成長の終わり」

後半は話が壮大になったり、要はスケールがでかくなって「お・・・おう」ってなったりしますが、しかし前述通り、ちゃんと説明してくれるので、「?」のまま終わる本ではありませんでした。すごくいい本だと思います。今度買ってこ。(借り物なので)

未来を拓く君たちへ (PHP文庫)

未来を拓く君たちへ (PHP文庫)

【CakePHP3.x】AuthがかかったController::Actionをテストしようとしたらハマった

ログ残し。

qiita.com

ここを参考にテストを実行する。

<?php
//...
    private function setAuthSession()
    {
        $this->session([
            'Auth' => [
                'id' => 1,
                'email' => 'xxx@gmail.com',
                'password' => 'Lorem ipsum dolor sit amet',
                'created' => '2017-01-31 14:43:15',
                'modified' => '2017-01-31 14:43:15'
            ]
        ]);
    }

    public function testLoginRequiredPageNotAccess()
    {
        $this->get('/contact/login-required');
        $this->assertRedirect(['controller' => 'users', 'action' => 'login']);
    }

    /**
     * Test contact pre register
     *
     * @return void
     */
    public function testLoginRequiredPageAccess()
    {
        $this->setAuthSession();
        $postData = ['test'];
        $this->post('/contact/login-required', $postData);
        $response = json_decode($this->_response->body(), true);
    }
// ...

よーし、これを実行すれば。。。と思ったら失敗。testLoginReequiredPageNotAccess()は失敗してもいいけど、その下のメソッドは失敗しちゃ困る。なぁーぜぇー?

これだけで1時間程潰してしまったが、AuthComponentを読んでみたらわかった。

<?php
// ...
class AuthComponent extends Component

    //...
    public function authCheck(Event $event)
    {
        if ($this->_config['checkAuthIn'] !== $event->name()) {
            return null;
        }

        /* @var \Cake\Controller\Controller $controller */
        $controller = $event->subject();

        // ...

        $isLoginAction = $this->_isLoginAction($controller); // ここがfalse

        if (!$this->_getUser()) { // ここがfalse
            if ($isLoginAction) { // ここもfalse
                return null; // 未ログインで返り値
            }
            $result = $this->_unauthenticated($controller);
            if ($result instanceof Response) {
                $event->stopPropagation();
            }

            return $result;
        }
        // ...
    }
// ...

省略しているが、$isLoginActionは「ログインページへのアクセスなら~」をチェックしているので、今回は関係ない(ログインページのテストではないので)。

ということは、$this->_getUser()でfalseが返ってくるのが困るってことだ。こいつの中を覗く。

<?php
// ...
class AuthComponent extends Component
{
    // ...
    public function user($key = null)
    {
        $user = $this->storage()->read();
        if (!$user) {
            return null;
        }

        if ($key === null) {
            return $user;
        }

        return Hash::get($user, $key);
    }
    // ...

this->storage()->read()のところで、セッションから値を取得しているようだ。要するにログインしているとAuthの名前をkeyとしてセッションに保存しているはずなので、それが取れていないということである。

うーん? 何故?

(°ω°・・・・( ゚д゚)ハッ!

思い出しました。

このプロジェクトではログインフォームを2つ用意していて、それぞれ管理者用とユーザー用で分けていました。

そのとき、セッションのkeyの値が被るとおかしくなるとCakePHP2.xから知っていたので、Auth keyをそれぞれAuth.AdminAuth.Userとしていました。

ということは

<?php
    // ...
    private function setAuthSession()
    {
        $this->session([
            'Auth.User' => [ // ここを変更
                'id' => 1,
                'email' => 'xxx@gmail.com',
                'password' => 'Lorem ipsum dolor sit amet',
                'created' => '2017-01-31 14:43:15',
                'modified' => '2017-01-31 14:43:15'
            ]
        ]);
    }
    // ...

セッションのkeyを変更してみて、テストを実行してみると。

うまくいきましたぁー!ヾ(´∀`)ノキャッキャ

はぁ...先週の1時間。