公式サイトを確認すると、最新版のバージョンは3.5.1となっています。

フロントを構築する場合は、最新のjQueryを使わないと駄目とのこと。
なるほど、勉強になりますね。
随机应变 ABCD: Always Be Coding and … : хороший
公式サイトを確認すると、最新版のバージョンは3.5.1となっています。

フロントを構築する場合は、最新のjQueryを使わないと駄目とのこと。
なるほど、勉強になりますね。
viewportの指定で例えば以下の様に設定していたとする。
<meta content='width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0, shrink-to-fit=no' name='viewport' />
user-scalable:ズームの操作
-> ユーザーがズームできるかどうかの設定。
-> 初期値はyes。yes=1,no=0。
maximum-scale 最大倍率
-> 最小拡大比率の設定。
-> デフォルトは1.6で指定可能範囲は0より大きく、10までの値。
つまり、「maximum-scale=1.0, user-scalable=0」だと、ユーザのズームを禁止しており、仕様にもよるが、多くの場合、ユーザエクスペリエンス上、望ましくないとのこと。
なるほど、プロの領域やな。
まず、analytics-*-*.p12ファイルですが、publicには置けないので、resourcesフォルダの下にstaticフォルダを作成し、そこに置きます。
※storageやpublicに置かない様にする。

続いて、google-api-php-clientをインストールします。
githubで最新を確認する。この記事を書いている時点では^2.7が最新です。
https://github.com/googleapis/google-api-php-client
$ composer require google/apiclient:”^2.7″
AdminController.php (*test)
L resource_path(‘static/analytics-*-*.p12’)で、p12を指定する
public function index(){
$client = new Google_Client();
$client->setApplicationName("Client_Library_Examples");
$client->setDeveloperKey(resource_path('static/analytics-*-*.p12'));
dd($client->getAccessToken());
$user = Auth::user();
return view('admin.index',compact('user'));
}
nullが返ってくるとOKっぽい。

テスト環境と同じ様に書いてみます。
use Google_Client;
use Google_Service_Analytics;
$service_account_email = '*.iam.gserviceaccount.com';
$key = file_get_contents(resource_path('static/analytics-*-*.p12'));
$profile = '*';
$client = new Google_Client();
$analytics = new Google_Service_Analytics($client);
$cred = new Google_Auth_AssertionCredentials(
$service_account_email,
array(Google_Service_Analytics::ANALYTICS_READONLY),
$key
);
$client->setAssertionCredentials($cred);
if($client->getAuth()->isAccessTokenExpired()){
$client->getAuth()->refreshTokenWithAssertion($cred);
}
Class ‘App\Http\Controllers\Google_Auth_AssertionCredentials’ not foundのエラー

issueに原因が載ってます。
https://github.com/GoogleCloudPlatform/nodejs-docs-samples/issues/158
Oh, I've just found https://github.com/google/google-api-php-client/blob/master/UPGRADING.md So it's the docs at https://developers.google.com/analytics/devguides/reporting/core/v3/quickstart/service-php that are wrong.
GoogleDevコンソールで、「サービス アカウント キーの作成」からjsonファイルを作成して、以下に書き換えます。
use Google_Client;
use Google_Service_Analytics;
$profile = '*';
$client = new Google_Client();
$client->setScopes(array('https://www.googleapis.com/auth/analytics.readonly'));
$client->setSubject('*.iam.gserviceaccount.com');
$client->setAuthConfig(array(
'type' => 'service_account',
'client_email' => '*.iam.gserviceaccount.com',
'client_id' => '*',
'private_key' => "-----BEGIN PRIVATE KEY-----***-----END PRIVATE KEY-----\n"
));
$analytics= new Google_Service_Analytics($client);
$result = $analytics->data_ga->get(
'ga:' . $profile,
'yesterday',
'0daysAgo',
'ga:pageviews',
array(
// "dimensions" => 'ga:pageTitle',
"dimensions" => 'ga:pagePath',
"sort" => '-ga:pageviews',
"max-results" => '10',
)
);
$data = $result->rows;
dd($data);

これでいけました。結局p12は使わない。
う〜ん、AnalyticsAPIは使うの緊張する。
mysql> describe users;
+—————————+—————–+——+—–+———+—————-+
| Field | Type | Null | Key | Default | Extra |
+—————————+—————–+——+—–+———+—————-+
| id | bigint unsigned | NO | PRI | NULL | auto_increment |
| name | varchar(255) | NO | | NULL | |
| email | varchar(255) | NO | UNI | NULL | |
| email_verified_at | timestamp | YES | | NULL | |
| password | varchar(255) | NO | | NULL | |
| two_factor_secret | text | YES | | NULL | |
| two_factor_recovery_codes | text | YES | | NULL | |
| remember_token | varchar(100) | YES | | NULL | |
| current_team_id | bigint unsigned | YES | | NULL | |
| profile_photo_path | text | YES | | NULL | |
| created_at | timestamp | YES | | NULL | |
| updated_at | timestamp | YES | | NULL | |
| role_id | int | NO | | NULL | |
+—————————+—————–+——+—–+———+—————-+
$ php artisan make:middleware IsAdmin
app/Http/Middleware/Kernel.php
protected $routeMiddleware = [
'auth' => \App\Http\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
'can' => \Illuminate\Auth\Middleware\Authorize::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class,
'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
'IsAdmin'=>\App\Http\Middleware\IsAdmin::class,
];
app/Models/Users.php
public function isAdmin(){
if($this->role_id == 1){
return true;
}
return false;
}
route
Route::get('/', function () {
$user = Auth:: user();
if($user->isAdmin()){
echo "this user is admin";
}
// return view('welcome');
});
挙動確認
isAdmin.php
use Illuminate\Support\Facades\Auth;
public function handle(Request $request, Closure $next)
{
$user = Auth::user();
if(!$user->isAdmin()){
return redirect()->intended('/');
}
return $next($request);
}
$ php artisan make:controller AdminController
AdminController.php
public function __construct(){
$this->middleware('IsAdmin');
}
public function index(){
return view('admin.index');
}
route
use App\Http\Controllers\AdminController;
Route::get('/admin', [App\Http\Controllers\AdminController::class, 'index']);
もしくはrouteで制御
Route::group(['middleware' => ['auth','IsAdmin'] ], function(){
Route::get('/admin', [App\Http\Controllers\AdminController::class, 'index']);
});
思い出したーーーーーー
### ポジ表示、ネガ表示
-ネガは陰画、ポジは陽画
-実際の明暗とは逆になっている画像で、明るい所が黒く、暗い所が白い画像
元画像

photoshopで画像を開く

photoshop [command + i]

DICカラー
L DIC社が提供
アイソレーション
– 全体1に対して、余白0.5と言われている

変形(長体・平体・斜体・回転)、間隔の変更、書体の変更、色の変更、装飾(影・縁取り・立体表示)、アイソレーション範囲内での他要素の表示、視認性を低下させる背景の使用、文中での使用
用語知らないと、ビビりまくるな
$ cp .env.example .env.testing
$ php artisan key:generate –env=testing
// test用のDB接続
$ vi .env.testing
$ rm ./tests/Feature/ExampleTest.php
$ rm ./tests/Unit/ExampleTest.php

app/Actions/Fortify/CreateNewUser.php
return User::create([
'name' => $input['name'],
'company' => $input['company'],
'role_id' => 1,
'email' => $input['email'],
'password' => Hash::make($input['password']),
]);
CreateNewUser.phpと同じようなことを書いていく
$ php artisan make:test UserRegisterTest
tests/Feature/UserRegisterTest.php
public function testUserRegister()
{
$email = 'hogehoge@gmail.com';
$this->post(route('register'), [
'name' => 'testuser',
'company' => 'test company',
'email' => $email,
'password' => 'password',
'password_confirmation' => 'password'
])
->assertStatus(302);
$this->assertDatabaseHas('users', ['email' => $email]);
}
$ vendor/bin/phpunit –testdox
PHPUnit 9.4.3 by Sebastian Bergmann and contributors.
User Register (Tests\Feature\UserRegister)
✔ User register
Time: 00:00.354, Memory: 26.00 MB
OK (1 test, 2 assertions)
なるほど、わかったようなわかってないようなw
strict
'use strict'; // 厳密なエラーチェック
定数 // 再代入不可
const price = 10; console.log(price * 3);
変数 // letを使う varは古い書き方
let price = 10; price = 30; console.log(price * 3);
無名関数
const sum = function(a, b, c){
return a + b + c;
}
const total = sum(1, 2, 3) + sum(4, 5, 6);
console.log(total);
arrow function
const sum = (a, b, c) => a + b + c;
### テストコードの目的
– テストなしにリリースするのが不安な時
– 保守性の向上
– 障害時に不具合をテストコードで再現する
### テストコードの対象
– セキュリティ上重要な箇所(権限管理、決済、メール)
– 重要度の高いユースケース
– 複雑なロジックやトリッキーなコード
– 止むを得ずパッチを当てたところ
– 自動化した方が早いところ(手作業でのアカウント作成などを省略する)
– 例外処理(意図的にバグを発生させる時)
※シンプルなロジックや重要度の低いコードのテストは優先度が下げるか省略も検討する
### テストコードの留意点
– 閾値の境界、条件分岐の網羅
– before afterを検証する
– テストコードはシンプルにする
– privateメソッドはテストしない
なるほど、枠組みは大体理解しました。
一個作っておいて、追加/加筆することで、ノウハウを蓄積していく。
## 目次
– 方針
– マークアップ(HTML)
– スタイルシート
– 画像スライス
– SP対応
– フォーム
– その他
– 表示速度の改善
– その他
### 作っていく中で気になった点
ID・Class名
L 原則としてBEM+FLOCSSのルールに従って命名
CSS プロパティの順序
box-sizing margin、padding width、min-width、max-width height、min-height、max-height background、background-color、background-image、background-repoeat、background-position、background-size border、border-width、border-style、border-color、border-radius outline、outline-width、outline-style、outline-color table-layout、border-collapse、border-spacing、empty-cells、caption-side box-shadow list-style、list-style-type、list-style-image、list-style-position overflow opacity、visibility display、box-flex float、clear position、top、right、bottom、left、z-index color font-size、font-weight、font-style、line-height、letter-spacing text-align、text-decoration、text-shadow vertical-align content zoom その他
フォント周りの単位指定
L font-size:remで指定
PNG-32(24)
L 透過色がある画像に使用
画像ファイルの圧縮
L compressor.ioを使う
ちょっとずつクオリティを上げていきたいですね。JSの最新版の書き方もやっておかないといけないな。
よし、次行こう。Next:テストコードの書き方
$ npm install suggestrap
まず二次元の連想配列のJsonデータを作成します。
json.php
L getメソッドで”ja”を受け取ったら配列を返します
$array = array(
array("id"=>1, "age"=>32, "name"=>"Jack"),
array("id"=>2, "age"=>41, "name"=>"Jackie"),
array("id"=>3, "age"=>41, "name"=>"James"),
array("id"=>4, "age"=>20, "name"=>"Jake"),
array("id"=>5, "age"=>28, "name"=>"Jane"),
);
$json = json_encode($array);
$query = $_GET['query'];
if(strpos($query,'ja') !== false){
print $json;
}
index.html
L inputの入力値をqueryとしてgetメソッドで渡します。
<!DOCTYPE html>
<html lang="en">
<head>
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<input id="target" type="text">
<script src="/node_modules/suggestrap/lib/suggestrap.js"></script>
<script>
var req = {
target: "target",
url: "http://192.168.33.10:8000/json.php?query=%QUERY",
key: "name"
};
var option = {
minlength: 2,
wildcard: "%QUERY",
delay: 400,
count: 5,
id: "suggestrap"
};
var suggestrap = new Suggestrap(req, option);
</script>
</body>
</html>

あああ、なるほど、検索のサジェストは、入力したqueryをajaxで渡して、それをDBからひっぱてきて表示してるのね。
仕組みがわかった。完全に理解した。なるほどねー。
もっと凄い技術使ってるのかと思ったら、普通の仕組みだ。
さて、フォントやるかー。