Laravel.shibuya

Kentarou Takeda
Kentarou Takeda代表取締役 at 株式会社ユーマインド
バリデーション駆動開発(仮称)で
プロジェクトメンバー全員を幸せにした話
Laravel/オレオレ両対応
アジェンダ
話すこと
開発フェーズに特有の「厄介ななバグ」
「バリデーション」の適用範囲を考える
php/Laravel での実装例
テスト駆動開発との併用
話さないこと
Laravel のValidation
自己紹介
@KentarouTakeda
サーバサイド
php / node.js / TypeScript
Laravel / express / AWS Lambda
PostgreSQL / MySQL
インフラ
RHEL / CentOS / AmazonLinux / Chef / Ansible
フロントエンド
TypeScript
Angular / jQuery / Hexo
心がけていること
担当業務の範囲にとらわれず、
幅広い視野で全体の効率アップを図りたい。
API / ネットワーク/ インターフェース
人/ 部署/ 会社
「厄介なバグ」とは?
影響範囲が広い
再現が取れない
利用者への影響が大きい
事例「ソシャゲのガチャ機能」
開発は「サーバ」「アプリ」「デザイナー」の3名
抽選はサーバ側の「ガチャAPI」が行う
ガチャAPIの返却に応じてアプリ上で入手演出
素材は随時追加・デザイナー単独でcommit
バグ報告
「回す」ボタンを押した瞬間にクラッシュ。
演出まで進まない=画面には何の情報も無い
頻度は100回に1回程度。
外部スタッフからの報告
クラッシュログ入手困難
最初に誰に相談するか?
考えられる原因
特定条件で「サーバ」が規格外のレスポンス
特定条件で「アプリ」が未定義プロパティを参照
特定の「素材」が破損している?
最初に誰に相談するか?
些細なバグの裏で、こんなことが起きている?
「誰に相談すれば良いんだろう?」
「自分ではありません!」
「相談したら怒られた…」
「例のバグ、進捗どうですか?」
「全員に相談、するしかないな…」
「また人のバグで時間取られるのか…」
「厄介なバグ」例えばこういう指針
困るのは誰か?
自分<自分以外の誰か
遭遇するのは誰か?
自分<自分以外の誰か
原因箇所を特定できるのは誰か?
自分以外の誰でも<自分のみ
「厄介なバグ」をどう対処するか?
人海戦術で原因探し!
出さないように気をつける!
あらかじめ可能性を潰しておく。
今回はどこに問題があったのか?
今回はどこに問題があったのか?
特定条件で「サーバ」が規格外のレスポンス
というバグが存在したこと。
今回はどこに問題があったのか?
特定条件で「サーバ」が規格外のレスポンス
というバグが存在したこと。
というバグの可能性が存在したこと。
可能性を潰す
IT用語辞典バイナリ
バリデーション
https://www.sophia-it.com/content/バリデーション
入力されたデータが、あるいはプログラミング言
語やマークアップ言語の記述が、規定された文法
に即して、または要求された仕様にそって、適切
に記述されているかどうかを検証することであ
る。
“
“
バリデーションが必要な値とは?
外部から入力された値
信頼できない値
信頼できない値
自分の書くプログラムに
100%の信頼を持てますか?
JSON Schema
https://json-schema.org/
JSONへの型定義
JSONが特定の型を満たしているか検証
JSON Schema is a vocabulary that allows you to
annotate and validate JSON documents.
“
“
ガチャAPI
gatcha: # ガチャAPIは
type: "object" # オブジェクトを返却する
properties:
cardIds: # cardIds プロパティは
type: "array" # 配列型を取り
items:
type: "integer" # それぞれの値は整数
minimum: 1000 # 最小値は1000
maximum: 2999 # 最大値は2999
minItems: 1 # 配列の要素数は最小で1個
minItems: 3 # 最大で3個(1~3個のカードが出てくるガチャ)
bonusId: # bonusId というプロパティは
type: "integer" # 整数を取り
minimum: 3000 # 3000以上
maximum: 4999 # 4999以下
required: # 必須プロパティは
- "cardIds" # cardIds のみ(ボーナスは無い時もある)
additionalProperties: false # 上記で定義された以外のプロパティは存在
PHP での実装
$ composer require justinrainbow/json-schema
$validator = new Validator();
$validator->validate($response, $schema, $options);
if(true !== $validator->isValid()) {
throw new Exception("サーバ側のバグ!");
}
echo json_encode($response);
status=200 であれば必ず安全
安全でない場合必ず必ずstatus=500
可能性を一つ潰した
事例「Webアプリのマイページ」
Laravel案件、2名体制。
サーバエンジニア
ルーティングやコントローラーを担当
Webデザイナー
Bladeテンプレートへhtmlをコーディング
バグ報告
プロフィールに「氏名」を登録した状態でマイページ
にアクセスすると以下のエラーが表示されます。
ErrorException (E_ERROR)
Undefined variable: firstName
(View: /var/www/resources/views/mypage/index.blade.php)
考えられる原因
テンプレート側のtypo
正しくは$ rst_name だった
コントローラー側のバグ
$ rstName の初期化漏れ
今回はどこに問題があったのか?
今回はどこに問題があったのか?
コントローラー側のバグ
$ rstName の初期化漏れ
というバグが存在したこと。
今回はどこに問題があったのか?
コントローラー側のバグ
$ rstName の初期化漏れ
というバグが存在したこと。
というバグの可能性が存在したこと。
※コーダーはプログラマーの想像以上にエラー画面に
ビビってます。
ビューに渡す値を検証
class MypageController extends Controller {
public function index(Request $request) {
/* ビューに渡す値を準備する */
/* ここでバリデーション? */
return view('mypage.index', $data);
}
}
何の保証にもならない。
(仕組み化して一括で防ぎたい)
コントローラーではオブジェクトを返
却するのみ
class MypageController extends Controller {
public function index(Request $request) {
/* ビューに渡す値を準備する */
return $data;
}
}
ビュー適用
class ApplyViewMiddleware {
public function handle($request, Closure $next) {
$response = $next($request);
/* 実際は abort() や RedirectResponse の際の処理が必要 */
$name = Route::currentRouteName(); // ビュー名 = ルート名
$response = new Response(view($name, $content));
return $response;
}
}
バリデーション
class ValidationMiddleware {
public function handle($request, Closure $next) {
$response = $next($request);
$name = Route::currentRouteName(); // バリデーション名 = ルート
$isValid = $this->valication($response,$this->getSchema($nam
if($isValid) {
abort(500, "コントローラー側のバグ!")
} else {
return $response;
}
}
ミドルウェア適用
afterミドルウェアなので定義は逆順。
namespace AppHttp;
use IlluminateFoundationHttpKernel as HttpKernel;
class Kernel extends HttpKernel {
protected $middlewareGroups = [
'web' => [
/**/
AppHttpMiddlewareApplyView::class, // ビュー適用が先
AppHttpMiddlewareValidation::class, // バリデーションが後
],
]
}
バリデーションとテスト
テスト駆動開発(TDD)
[DO03] 50 分でわかるテスト駆動開発
https://www.slideshare.net/decode2017/do03-50/9
TDDのサイクル
1. 次の目標を考える
2. その目標を示すテストを書く
3. そのテストを実行して失敗させる(Red)
4. 目的のコードを書く
5. 2.で書いたテストを成功させる(Green)
6. テストが通るままでリファクタリングを行う
(Refactor)
7. 1~6を繰り返す
TDDと黄金の回転
Red, Grren, Refactor
https://www.slideshare.net/decode2017/do03-
50/10
出力の検証=テスト
バリデーション駆動開発
1. 次の目標を考える
2. その目標を示すテストバリデーションを書く
3. そのテストバリデーションを実行して失敗させる
4. 目的のコードを書く
5. 2.で書いたテストバリデーションを成功させる
6. テストが通るままでリファクタリングを行う
7. 1~6を繰り返す
「ガチャAPI」
目標「ガチャAPIが存在する」
// ApiTest.php
class ApiTest extends TestCase {
/** @test */
public function gatcha() {
$this->post('/api/gatcha', [])->assertStatus(200);
}
}
テストをパスする最小限のコード
# api.schema.yml
gatcha:
// ApiController.php
class ApiController {
public function gatcha() {
}
}
次の目標「返却はcardIdsというプロ
パティを持つ」
gatcha:
+ type: "object"
+ properties:
+ cardIds:
class ApiController {
public function gatcha() {
+ return [
+ 'cardIds' => null,
+ ];
}
}
次の目標「cardIdsは配列」
gatcha:
type: "object"
properties:
cardIds:
+ type: "array"
class ApiController {
public function gatcha() {
return [
- 'cardIds' => null,
+ 'cardIds' => [],
];
}
}
次の目標「cardIdsの各要素(略)」
gatcha:
type: "object"
properties:
cardIds:
type: "array"
+ items:
+ type: "integer"
+ minimum: 1000
+ maximum: 2999
+ minItems: 1
+ minItems: 3
class ApiController {
public function gatcha() {
return [
- 'cardIds' => [],
+ 'cardIds' => [1000, 1001, 1002],
];
}
}
開発体験
最小限のテストコード
Red -> Green -> Refactor
仕様・実装・テストが同時に出来上がっていく
共有可能な成果物
「ガチャAPI」
今回はどこに問題があったのか?
今回はどこに問題があったのか?
特定条件で「アプリ」が未定義プロパティを参照
というバグが存在したこと。
今回はどこに問題があったのか?
特定条件で「アプリ」が未定義プロパティを参照
というバグが存在したこと。
というバグの可能性が存在したこと。
TypeScript
https://github.com/bcherny/json-schema-to-
typescript
{
"title": "Example Schema",
"type": "object",
"properties": {
"firstName": {
"type": "string"
},
"lastName": {
"type": "string"
},
"age": {
"description": "Age in years",
"type": "integer",
"minimum": 0
},
"hairColor": {
"enum": ["black", "brown", "blue"],
"type": "string"
}
},
"additionalProperties": false,
export interface ExampleSchema {
firstName: string;
lastName: string;
/**
* Age in years
*/
age?: number;
hairColor?: "black" | "brown" | "blue";
}
C#
https://www.newtonsoft.com/jsonschema
{
"$schema": "http://json-schema.org/draft-03/schema#",
"title": "Country",
"description": "A nation with its own government, occupying a
"type": "object",
"properties": {
"flag": {
"$ref": "flag.json"
},
"cities": {
"type": "array",
"description": "A large town",
"items": {
"$ref": "city.json"
},
"uniqueItems": true
},
"population": {
"type": "integer",
"description": "The number of people inhabiting this count
"minimum": 1000,
namespace generated
{
using System;
using com.cvent.country.entities;
using generated;
using System.Collections.Generic;
using Cvent.SchemaToPoco.Core.ValidationAttributes;
using System.ComponentModel.DataAnnotations;
// A nation with its own government, occupying a particular
public class Country
{
// Used as the symbol or emblem of a country
public Flag Flag { get; set; }
// A large town
public HashSet<City> Cities { get; set; }
// The number of people inhabiting this country
[Required()]
[MinValue(1000)]
クライアントへの適用
ビルドが通っていれば確実に安全
安全でない場合ビルドで落ちる
心がけていること
担当業務の範囲にとらわれず、
幅広い視野で全体の効率アップを図りたい。
API / ネットワーク/ インターフェース
業務/ 人/ 部署/ 会社
仕組み化で解決。
サーバサイドは仕組み化に取り組みやすい立ち位置。
1 of 60

Recommended

phpspecで始めるBDD by
phpspecで始めるBDDphpspecで始めるBDD
phpspecで始めるBDDYuuki Takezawa
10.3K views39 slides
Responsableを使ったadr実装 by
Responsableを使ったadr実装Responsableを使ったadr実装
Responsableを使ったadr実装Kenjiro Kubota
1.3K views39 slides
Pythonを中心としたチーム開発 by
Pythonを中心としたチーム開発Pythonを中心としたチーム開発
Pythonを中心としたチーム開発Ryo Takahashi
8.9K views50 slides
C#の書き方 by
C#の書き方C#の書き方
C#の書き方信之 岩永
9.1K views47 slides
Java SE 9の紹介: モジュール・システムを中心に by
Java SE 9の紹介: モジュール・システムを中心にJava SE 9の紹介: モジュール・システムを中心に
Java SE 9の紹介: モジュール・システムを中心にTaku Miyakawa
145.2K views104 slides
Klocwork カスタムチェッカー紹介 by
Klocwork カスタムチェッカー紹介Klocwork カスタムチェッカー紹介
Klocwork カスタムチェッカー紹介Masaru Horioka
825 views22 slides

More Related Content

What's hot

Kubo100903 by
Kubo100903Kubo100903
Kubo100903kubo
283 views21 slides
PHPUnit でテスト駆動開発を始めよう by
PHPUnit でテスト駆動開発を始めようPHPUnit でテスト駆動開発を始めよう
PHPUnit でテスト駆動開発を始めようYuya Takeyama
16.1K views58 slides
最近の単体テスト by
最近の単体テスト最近の単体テスト
最近の単体テストKen Morishita
15.6K views73 slides
Phpstudy44 Zend Frameworkが抱えている問題は多い。 by
Phpstudy44 Zend Frameworkが抱えている問題は多い。Phpstudy44 Zend Frameworkが抱えている問題は多い。
Phpstudy44 Zend Frameworkが抱えている問題は多い。sasezaki
1.3K views13 slides
Klocwork 2017.1アップデート by
Klocwork 2017.1アップデートKlocwork 2017.1アップデート
Klocwork 2017.1アップデートMasaru Horioka
528 views27 slides
Javaのログ出力: 道具と考え方 by
Javaのログ出力: 道具と考え方Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方Taku Miyakawa
74.3K views67 slides

What's hot(20)

Kubo100903 by kubo
Kubo100903Kubo100903
Kubo100903
kubo283 views
PHPUnit でテスト駆動開発を始めよう by Yuya Takeyama
PHPUnit でテスト駆動開発を始めようPHPUnit でテスト駆動開発を始めよう
PHPUnit でテスト駆動開発を始めよう
Yuya Takeyama16.1K views
最近の単体テスト by Ken Morishita
最近の単体テスト最近の単体テスト
最近の単体テスト
Ken Morishita15.6K views
Phpstudy44 Zend Frameworkが抱えている問題は多い。 by sasezaki
Phpstudy44 Zend Frameworkが抱えている問題は多い。Phpstudy44 Zend Frameworkが抱えている問題は多い。
Phpstudy44 Zend Frameworkが抱えている問題は多い。
sasezaki1.3K views
Klocwork 2017.1アップデート by Masaru Horioka
Klocwork 2017.1アップデートKlocwork 2017.1アップデート
Klocwork 2017.1アップデート
Masaru Horioka528 views
Javaのログ出力: 道具と考え方 by Taku Miyakawa
Javaのログ出力: 道具と考え方Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方
Taku Miyakawa74.3K views
tech talk about JS #0 by Hika Maeng
tech talk about JS #0tech talk about JS #0
tech talk about JS #0
Hika Maeng640 views
nGrinder3 : だれもが簡単にできる性能テスト by JunHo Yoon
nGrinder3 : だれもが簡単にできる性能テストnGrinder3 : だれもが簡単にできる性能テスト
nGrinder3 : だれもが簡単にできる性能テスト
JunHo Yoon1.4K views
静的解析ツールKlocwork によるCERT-C/CWE対応 by Masaru Horioka
静的解析ツールKlocwork によるCERT-C/CWE対応静的解析ツールKlocwork によるCERT-C/CWE対応
静的解析ツールKlocwork によるCERT-C/CWE対応
Masaru Horioka1K views
anyenv + phpenv + php-build が便利すぎる件 by y-uti
anyenv + phpenv + php-build が便利すぎる件anyenv + phpenv + php-build が便利すぎる件
anyenv + phpenv + php-build が便利すぎる件
y-uti11.8K views
テスト駆動開発入門 by Shuji Watanabe
テスト駆動開発入門テスト駆動開発入門
テスト駆動開発入門
Shuji Watanabe7.7K views
レビューで保守性のためにした コメントをふりかえってみた by Takhisa Hirokawa
レビューで保守性のためにした コメントをふりかえってみたレビューで保守性のためにした コメントをふりかえってみた
レビューで保守性のためにした コメントをふりかえってみた
Takhisa Hirokawa385 views
VMの歩む道。 Dalvik、ART、そしてJava VM by yy yank
VMの歩む道。 Dalvik、ART、そしてJava VMVMの歩む道。 Dalvik、ART、そしてJava VM
VMの歩む道。 Dalvik、ART、そしてJava VM
yy yank14.5K views
静的解析Klocwork とJenkins CIの連携 by Masaru Horioka
静的解析Klocwork とJenkins CIの連携静的解析Klocwork とJenkins CIの連携
静的解析Klocwork とJenkins CIの連携
Masaru Horioka1.8K views
GTMF 2015: バグを減らそう。テストを楽にしよう。静的解析が開発者を救う。 | 日本シノプシス合同会社 by Game Tools & Middleware Forum
GTMF 2015: バグを減らそう。テストを楽にしよう。静的解析が開発者を救う。 | 日本シノプシス合同会社GTMF 2015: バグを減らそう。テストを楽にしよう。静的解析が開発者を救う。 | 日本シノプシス合同会社
GTMF 2015: バグを減らそう。テストを楽にしよう。静的解析が開発者を救う。 | 日本シノプシス合同会社
CakePHP - The point of upgrade by Yasuo Harada
CakePHP - The point of upgradeCakePHP - The point of upgrade
CakePHP - The point of upgrade
Yasuo Harada1.9K views
なぜ、PHPのmbstring.func_overloadをdeprecatedにするのに5年かかったのか? - 慢心、環境の違い by sasezaki
なぜ、PHPのmbstring.func_overloadをdeprecatedにするのに5年かかったのか? - 慢心、環境の違い なぜ、PHPのmbstring.func_overloadをdeprecatedにするのに5年かかったのか? - 慢心、環境の違い
なぜ、PHPのmbstring.func_overloadをdeprecatedにするのに5年かかったのか? - 慢心、環境の違い
sasezaki9.8K views
PHP Conference Japan 2010 : Zend Framewrok by sasezaki
PHP Conference Japan 2010 : Zend FramewrokPHP Conference Japan 2010 : Zend Framewrok
PHP Conference Japan 2010 : Zend Framewrok
sasezaki1.5K views

Similar to Laravel.shibuya

Laravel における Blade 拡張のツラミ by
Laravel における Blade 拡張のツラミLaravel における Blade 拡張のツラミ
Laravel における Blade 拡張のツラミShohei Okada
2.2K views19 slides
IDEを目指す開発者コンソール by
IDEを目指す開発者コンソールIDEを目指す開発者コンソール
IDEを目指す開発者コンソールminoaw
1.7K views8 slides
Travis CIですぐに始める継続的インテグレーション by
Travis CIですぐに始める継続的インテグレーションTravis CIですぐに始める継続的インテグレーション
Travis CIですぐに始める継続的インテグレーションYusuke Ando
1.6K views38 slides
MakeGoodで快適なテスト駆動開発を by
MakeGoodで快適なテスト駆動開発をMakeGoodで快適なテスト駆動開発を
MakeGoodで快適なテスト駆動開発をAtsuhiro Kubo
1.2K views28 slides
PHP版レガシーコード改善に役立つ新パターン #wewlc_jp by
PHP版レガシーコード改善に役立つ新パターン #wewlc_jp PHP版レガシーコード改善に役立つ新パターン #wewlc_jp
PHP版レガシーコード改善に役立つ新パターン #wewlc_jp Yahoo!デベロッパーネットワーク
41.8K views97 slides
pi-1. プログラミング入門 by
pi-1. プログラミング入門pi-1. プログラミング入門
pi-1. プログラミング入門kunihikokaneko1
241 views65 slides

Similar to Laravel.shibuya(20)

Laravel における Blade 拡張のツラミ by Shohei Okada
Laravel における Blade 拡張のツラミLaravel における Blade 拡張のツラミ
Laravel における Blade 拡張のツラミ
Shohei Okada2.2K views
IDEを目指す開発者コンソール by minoaw
IDEを目指す開発者コンソールIDEを目指す開発者コンソール
IDEを目指す開発者コンソール
minoaw1.7K views
Travis CIですぐに始める継続的インテグレーション by Yusuke Ando
Travis CIですぐに始める継続的インテグレーションTravis CIですぐに始める継続的インテグレーション
Travis CIですぐに始める継続的インテグレーション
Yusuke Ando1.6K views
MakeGoodで快適なテスト駆動開発を by Atsuhiro Kubo
MakeGoodで快適なテスト駆動開発をMakeGoodで快適なテスト駆動開発を
MakeGoodで快適なテスト駆動開発を
Atsuhiro Kubo1.2K views
pi-1. プログラミング入門 by kunihikokaneko1
pi-1. プログラミング入門pi-1. プログラミング入門
pi-1. プログラミング入門
kunihikokaneko1241 views
Apexコアデベロッパーセミナー(Apexコード)071010 by stomita
Apexコアデベロッパーセミナー(Apexコード)071010Apexコアデベロッパーセミナー(Apexコード)071010
Apexコアデベロッパーセミナー(Apexコード)071010
stomita3K views
Javaで1から10まで書いた話(sanitized) by Tokuhiro Matsuno
Javaで1から10まで書いた話(sanitized)Javaで1から10まで書いた話(sanitized)
Javaで1から10まで書いた話(sanitized)
Tokuhiro Matsuno12.4K views
テストしなイカ? Seleniumで自動ブラウザテスト by Ohishi Mikage
テストしなイカ? Seleniumで自動ブラウザテストテストしなイカ? Seleniumで自動ブラウザテスト
テストしなイカ? Seleniumで自動ブラウザテスト
Ohishi Mikage1.6K views
レガシーなWebアプリケーションと向き合う by Yuta Ohashi
レガシーなWebアプリケーションと向き合うレガシーなWebアプリケーションと向き合う
レガシーなWebアプリケーションと向き合う
Yuta Ohashi1.6K views
Ruby on Rails 入門 by Yasuko Ohba
Ruby on Rails 入門Ruby on Rails 入門
Ruby on Rails 入門
Yasuko Ohba11.3K views
CodeIgniter東京勉強会 2011.05.14 by Takako Miyagawa
CodeIgniter東京勉強会 2011.05.14CodeIgniter東京勉強会 2011.05.14
CodeIgniter東京勉強会 2011.05.14
Takako Miyagawa3.2K views
Introduction to Continuous Test Runner MakeGood by Atsuhiro Kubo
Introduction to Continuous Test Runner MakeGoodIntroduction to Continuous Test Runner MakeGood
Introduction to Continuous Test Runner MakeGood
Atsuhiro Kubo1.2K views
Java SE 再入門 by minazou67
Java SE 再入門Java SE 再入門
Java SE 再入門
minazou6719K views
How to manage Cakephp @CakePHP_Fukuoka_2 by ichikaway
How to manage Cakephp @CakePHP_Fukuoka_2 How to manage Cakephp @CakePHP_Fukuoka_2
How to manage Cakephp @CakePHP_Fukuoka_2
ichikaway921 views
Inside frogc in Dart by Goro Fuji
Inside frogc in DartInside frogc in Dart
Inside frogc in Dart
Goro Fuji1.5K views
【XDev】A-2 アジリティ向上のためのツール活用 by 智治 長沢
【XDev】A-2 アジリティ向上のためのツール活用【XDev】A-2 アジリティ向上のためのツール活用
【XDev】A-2 アジリティ向上のためのツール活用
智治 長沢798 views
第4回勉強会 単体テストのすすめ by hakoika-itwg
第4回勉強会 単体テストのすすめ第4回勉強会 単体テストのすすめ
第4回勉強会 単体テストのすすめ
hakoika-itwg9.4K views

Recently uploaded

システム概要.pdf by
システム概要.pdfシステム概要.pdf
システム概要.pdfTaira Shimizu
44 views1 slide
Najah Matsuo Self Introduction by
Najah Matsuo Self IntroductionNajah Matsuo Self Introduction
Najah Matsuo Self IntroductionNajahMatsuo
10 views29 slides
lt.pptx by
lt.pptxlt.pptx
lt.pptxtomochamarika
85 views13 slides
JISTA月例会2023年12月 書籍『3カ月で改善!システム障害対応実践ガイド』ご紹介+失敗学と障害対応と私 by
JISTA月例会2023年12月 書籍『3カ月で改善!システム障害対応実践ガイド』ご紹介+失敗学と障害対応と私JISTA月例会2023年12月 書籍『3カ月で改善!システム障害対応実践ガイド』ご紹介+失敗学と障害対応と私
JISTA月例会2023年12月 書籍『3カ月で改善!システム障害対応実践ガイド』ご紹介+失敗学と障害対応と私修治 松浦
195 views36 slides
onewedge_companyguide1 by
onewedge_companyguide1onewedge_companyguide1
onewedge_companyguide1ONEWEDGE1
32 views22 slides
SSH超入門 by
SSH超入門SSH超入門
SSH超入門Toru Miyahara
405 views21 slides

Recently uploaded(7)

Najah Matsuo Self Introduction by NajahMatsuo
Najah Matsuo Self IntroductionNajah Matsuo Self Introduction
Najah Matsuo Self Introduction
NajahMatsuo10 views
JISTA月例会2023年12月 書籍『3カ月で改善!システム障害対応実践ガイド』ご紹介+失敗学と障害対応と私 by 修治 松浦
JISTA月例会2023年12月 書籍『3カ月で改善!システム障害対応実践ガイド』ご紹介+失敗学と障害対応と私JISTA月例会2023年12月 書籍『3カ月で改善!システム障害対応実践ガイド』ご紹介+失敗学と障害対応と私
JISTA月例会2023年12月 書籍『3カ月で改善!システム障害対応実践ガイド』ご紹介+失敗学と障害対応と私
修治 松浦195 views
onewedge_companyguide1 by ONEWEDGE1
onewedge_companyguide1onewedge_companyguide1
onewedge_companyguide1
ONEWEDGE132 views
how query cost affects search behavior translated in JP by Tobioka Ken
how query cost affects search behavior translated in JPhow query cost affects search behavior translated in JP
how query cost affects search behavior translated in JP
Tobioka Ken10 views

Laravel.shibuya