k01ken’s b10g

He110 W0r1d!

プログラミング言語のRustを使ってみる

開発環境は、Windows 10 Pro。

1.公式サイトへアクセス
www.rust-lang.org

2.「はじめる」ボタンをクリック
f:id:k01ken:20200605185616p:plain

3.『Rustup:Rustインストーラおよびバージョン管理ツール』の欄の『RUSTUP-INIT.EXE(64-BIT)をダウンロードする』をクリックし、インストーラをダウンロード。
f:id:k01ken:20200605185828p:plain

4.ダウンロードしたインストーラ(rustup-init.exe)をクリックして起動。コマンドプロンプトが起動するので、Enterキーをクリック。インストールが開始されます。インストールが終わったら、Enterキーを押すと、自動的に、コマンドプロンプトが消えます。
f:id:k01ken:20200605190221p:plain

5.コマンドプロンプトを起動して、『cargo』と入力して、Enterキーをクリックして、以下のように表示されたら、インストールは成功している。
f:id:k01ken:20200605191630p:plain

今度は、簡単なプログラムを作ってみます。

6.コマンドプロンプトを起動して、以下のコマンドを入力する

cd c:\ && mkdir rust && cd rust

7.公式サイトに基づいてプログラムを書きます。コマンドプロンプト上で、以下のコマンドを入力。
以下はプロジェクトを作成するプログラムです。

cargo new hello-rust

実行後にファイル自体を見てみると、rustディレクトリ内に、hello-rustディレクトリが作成されています。ソースコード自体は今回は書く必要がなくて、srcディレクトリ内に、main.rsが自動生成されています。
f:id:k01ken:20200605192225p:plain

8.コマンドプロンプトに、以下のコマンドを入力。

cd hello-rust

9.いよいよ、ビルドしていきます。カレントディレクトリは、main.rsのあるディレクトリではなくて、Cargo.tomlファイルのあるディレクトリに設定するようです。

cargo run

f:id:k01ken:20200605192914p:plain
出力されました。実行後にファイルを見てみると、targetディレクトリが生成されていて、その中の、debugディレクトリ内に、hello-rust.exeという名前の実行ファイルが生成されています。

CakePHP3で、外部キーを規約による指定とは別にしたい場合

開発環境は、WIndows10 Pro(64bit) + PHP 7.2.12 + CakePHP 3.7.9。

例えば、usersテーブルのidとdirectmessagesテーブルのuser_idが標準で関連づけているところを、directmessagesテーブルの別のidのsessionidカラムと関連づけたかったので、メモ。

※事前に、手動で外部キーとして指定したいカラムには、外部キーを貼っておくこと。

例えば、1対多の関係の場合は、それぞれのModelのTableのinitializeメソッド内に、

UsersTable.php

$this->hasMany('新しいモデル名',[
  'className' => '関連づけるモデル名',
  'foreignKey' => '子テーブルの外部キー名'
]);

具体例:

$this->hasMany('SessionIdInDirectmessages',[
  'className' => 'Directmessages',
  'foreignKey' => 'sessionid'
]);


DirectmessagesTable.php

$this->belongsTo('新しいモデル名',[
  'className' => '相手側のモデル名',
  'foreignKey' => '子テーブルの外部キー名',
  'joinType' => '接続するタイプ'
]);

具体例:

$this->belongsTo('SessionUsers', [
  'className' => 'Users',
  'foreignKey' => 'sessionid',
  'joinType' => 'INNER'
]);

実際に読み込む際は、

<?php

# クラス外に指定
use Cake\ORM\TableRegistry;

# コントローラやモデルのクラス内に
$UsersTable = TableRegistry::getTableLocator()->get('Users');
$response = $UsersTable->find()->where(['Users.id' => 1]);
$response->contain(['SessionIdInDirectmessages']);
?>


参考リンク
アソシエーション - モデル同士を繋ぐ - 3.8

TypeScriptを使ってみる

開発環境は、Windows 10 Pro(64bit)。

node.jsを事前にインストールしていることが前提条件です。

TypeScriptは、JavaScriptを静的型付けとオブジェクト指向で書けるようなスクリプトで、最終的にJavaScriptに変換して使います。

1.以下のコマンドを入力して、ディレクトリを作成して、カレントディレクトリにします。

cd c:\ && mkdir ts_test && cd ts_test

2.以下のコマンドを入力して、TypeScriptをインストールします。

npm install -g typescript

3.以下のコマンドを入力して、TypeScriptがインストールしたのかチェックします

tsc -v

Version 3.7.4でした。

4.TypeScriptのコードを書きます。greeter.tsで保存します。
公式サイトのチュートリアルからコードを拝借します。
TypeScript in 5 minutes · TypeScript

function greeter(person) {
    return "Hello, " + person;
}

let user = "Jane User";

document.body.textContent = greeter(user);

5.以下のコマンドを入力して、コンパイルします。

tsc greeter.ts

そうすると、同じディレクトリにgreeter.jsが作成されています。

6.使用する際は、HTML内のscriptタグのsrc属性にgreeter.jsを指定するだけでOKです。


テキストエディタVisual Studio Codeを使っているんですが、拡張プラグインのTSLintをインストールしておくと、TypeScriptのファイルを変更した場合、リアルタイムで検証して、おかしい場合は、波線で知らせてくれるので便利です。

参考リンク
TypeScript - JavaScript that scales.
まずは5分で学ぶ!TypeScriptことはじめ | Developers.IO
TypeScript再入門「がんばらないTypeScript」で、JavaScriptを“柔らかい”静的型付き言語に(gfx執筆) - エンジニアHub|若手Webエンジニアのキャリアを考える!

ESLintを使ってJavaScriptのコードをチェックする

開発環境は、Windows 10 Pro(64bit)。

node.jsを事前にインストールしていることが前提条件です。

ESLintは、JavaScriptのための静的検証ツールです。

1.ディレクトリを作成し、カレントディレクトリを移動する

cd c:\ && mkdir eslint_test && cd eslint_test

2.以下のコマンドを入力し、ESLintをインストールする

npm install -g eslint

3.以下のコマンドを入力し、きちんとインストールされているかチェックする

eslint -v

4.検証用のコードを書き、test.jsで保存します。

function hello(name){
  document.body.testContent = "Hello ," + nama + "!";
}

hello("World");

5.以下のコマンドを入力し、.eslintrc.jsonを作成する

copy nul .eslintrc.json

6. .eslintrc.jsonに中身を入れる

{
  "extends": ["eslint:recommended"],
  "plugins": [],
  "parserOptions": {},
  "env": {"browser": true},
  "globals": {},
  "rules": {}
}

7.以下のコマンドを入力し、ESLintを起動する

eslint test.js

チェック結果
f:id:k01ken:20200111223929p:plain


テキストエディタVisual Studio Codeを使っているんですが、拡張プラグインのESLintをインストールしておくと、JavaScriptのファイルを変更した場合、リアルタイムで検証して、おかしい場合は、波線で知らせてくれるので便利です。
f:id:k01ken:20200111224700p:plain

参考リンク
ESLint 最初の一歩 - Qiita

Mochaを使ってJavaScriptのテストコードを書いて検証してみる

開発環境は、Windows 10 Pro(64bit)。

node.jsを事前にインストールしていることが前提条件です。

Mocha
Mocha - the fun, simple, flexible JavaScript test framework

1.テスト用のディレクトリを作成するため、コマンドプロンプト上で以下のコマンドを入力。

cd c:\ && mkdir mocha_test && cd mocha_test

2. 以下のコマンドを入力して、package.jsonを作成する。質問に対してはすべてEnterキーで返す。

npm init

3.以下のコマンドを入力して、Mochaをインストールする

npm install -D mocha

続いて、以下のコマンドを入力して、shouldをインストールします

npm install -D should

4.テストコードを入れるためにtestディレクトリを作成する

mkdir test

5.テストするためのコードを書いて、index.jsとして保存します。

var index = {
  addition : function(a,b){
    return a+b;
  }
};

module.exports = index;

6.テストコードを書いて、testディレクトリ内に、index.test.jsとして保存します。

var should  = require('should');
var index = require('../index.js');

describe('index', function(){
  it('3+4=7', function(){
    index.addition(3,4).should.equal(7);
  });
});

7.package.jsonのscriptsのtestの値をmochaに変更します。

  "scripts": {
    "test": "mocha"
  },

8.以下のコマンドを入力して、テストを実行します。

npm test

テスト結果
f:id:k01ken:20200110223858p:plain
テストがうまく通りました。


参考リンク
gulpで自動テストとコード圧縮 - Qiita

CakePHP3でログイン時のチェックボックスの有無によってクッキーの寿命を変更する

開発環境は、Windows 10 Pro(64bit) + PHP 7.2.12 + CakePHP 3.7.9。

今回の記事はCakePHP3のAuthComponentを使用した前提で作っていきます。
以下のチュートリアルに基づいて、作っておいてください。
https://book.cakephp.org/3/ja/tutorials-and-examples/cms/authentication.html


CakePHP3のAuthComponentを使用した場合、ログイン時に、発行するクッキーは、/config/app.phpのSessionの欄内の設定に基づき、作られます。デフォルトでは、ログインした際に、ブラウザを閉じたら寿命が終わるクッキーを発行しますが、設定によっては、指定の期間の間、寿命の続くクッキーを発行することができます。

今回は、チェックボックスによって、この寿命を切り替えたいと思います。

/config/app.php内のSessionの欄を以下のように書き換えます。

<?php
    'Session' => [
        'defaults' => 'php',
        'cookie' => 'twiclone_cookie', // 任意の文字列
        'timeout' => 259200, // 180days(分で計測する)
        'cookieTimeout' => 259200, // 180days
        'autoRegenerate' => false, // 自動でセッションを再生成するのをやめる
        'checkAgent' => false, // trueにすると毎回セッションが切れることがある
        'ini' => [
            'session.cookie_lifetime' => 15552000, //180days
            'session.gc_divisor' => 15552000,
            'session.gc_maxlifetime' => 15552000, //180days
        ],
        'use_cookies' => 1, // SessionをCookieにも保存する
        'cookie_lifetime' => 15552000 //180days
    ],
?>

次に、/src/Application.phpを開きます。Application内のbootstrap関数内で、以下のコードを入れます。

<?php
  if(env("REQUEST_URI") === "/users/login" && isset($_POST["login_saved"]) && $_POST["login_saved"] == 0){
    Configure::write('Session.timeout', 0);
    Configure::write('Session.cookie_lifetime', 0);
    Configure::write('Session.ini',[
      'session.cookie_lifetime' => 0,
      'session.gc_divisor' => 0,
      'session.gc_maxlifetime' => 0
    ]);
  }
?>


login.ctpを以下にように書き換えます。

<?= $this->Form->create('f', ['id' => 'login_form']) ?>
<?= $this->Form->control('email') ?>
<?= $this->Form->control('password') ?>
<?= $this->Form->checkbox('login_saved') ?>
<?= $this->Form->button('ログイン') ?>
<?= $this->Form->end() ?>

JavaScript部分(jQueryで)

  $(document).on('submit', '#login_form', function(e){
    let checkbox_value = document.forms.f.login_saved.checked ? 1 : 0;
  });

CakePHP3で/config/app.phpのデータを読み書きをする

開発環境は、Windows 10 Pro(64bit) + PHP 7.2.12 + CakePHP 3.7.9。

/config/app.php内の設定内容(設定内容を連想配列としてreturnで返している。今回はSessionというキーで値を読み込んでみます。Sessionの欄をコントローラなどで取得したい場合、コントローラ内に以下のようなコードを書きます。

<?php
// コントローラの上部(useのある部分)
use \Cake\Core\Configure;

// アクション内に
echo Configure::read('Session');
?>

設定を新たに追加する、上書きしたい場合は、

<?php
// コントローラの上部(useのある部分)
use \Cake\Core\Configure;

// アクション内に
echo Configure:write('Name', 'Value');
?>

という風にします。

■参考リンク
CakePHP3で設定ファイルapp.phpの設定値を取得する | 完璧になんてなれない
https://book.cakephp.org/3/ja/development/configuration.html#namespace-Cake\Core