SlideShare uma empresa Scribd logo
1 de 20
Baixar para ler offline
SQLアンチパターン読書会
17章:スパゲッティクエリ
2014/4/3(木)
@makopi23
イメージ
複雑に絡み合い、解読や修正が困難なSQLクエリ
3
 17.1 目的: SQLクエリの数を減らす
 SQLプログラマーが最も多く直面する問題
どのようにして目の前の仕事を1つのクエリで実現するか
 解決策はシンプルにしたい
タスクを1つのクエリで解決することで、クエリを「優雅に」
「効率的に」書くことを目的とする。
4
 17.2 アンチパターン
 SQLは非常に表現力に優れた言語・・・
➢ 1つのクエリやステートメントで多くのことを実現できる
➢ だからといって、1つのクエリですべてのタスクを処理
することを強制するものではない
複雑な問題をワンステップで解決しようとする複雑な問題をワンステップで解決しようとする
5
 17.2.1 意図に反した結果 (1/5)
● デカルト積 (Cartesian product)
➢ クエリで指定する2つのテーブルが関連(リレーション
シップ)を制限する条件を持たないときに生まれる。
➢
この条件がないと、2つのテーブルを結合することに
よって、1つのテーブルの各行が、もう1つのテーブルの
すべてのテーブルのすべての行とペアになってしまう。
➢ いわゆる、直積集合 (Cross Join)。
6
 17.2.1 意図に反した結果 (2/5)
同じテーブル2つに対し、
prodcut_idをキーにJOIN・・・
⇒ 直積(デカルト積)が発生
その製品の修正済みのバグ数が11件、
未修整のバグが7件であるはずなのに、
両方とも 77件 (= 11件 × 7件)となっている。
■ Spaghetti-Query/anti/cartesian.sql
7
 17.2.1 意図に反した結果 (3/5)
SELECT p.product_id,
COUNT(f.bug_id) AS count_fixed,
COUNT(o.bug_id) AS count_open
FROM BugsProducts p
INNER JOIN Bugs f ON p.bug_id = f.bug_id AND f.status = 'FIXED'
INNER JOIN BugsProducts p2  USING (product_id)
INNER JOIN Bugs o ON p2.bug_id = o.bug_id AND o.status = 'OPEN'
WHERE p.product_id = 1
GROUP BY p.product_id;
FROM BugsProducts p
INNER JOIN Bugs f ON p.bug_id = f.bug_id AND f.status = 'FIXED'
INNER JOIN Bugs o ON p2.bug_id = o.bug_id AND o.status = 'OPEN'
INNER JOIN BugsProducts p2
●BugsProducts p
●Bugs f
➢ bug_idで結合
➢ statusが'FIXED'
●BugsProducts p2
●Bugs o
➢ bug_idで結合
➢ statusが'OPEN'
■ Spaghetti-Query/anti/cartesian.sql
FIXEDとOPEN
のバグの組み合
わせを制限する
条件なし。。。
8
11行の修正済み(FIXED)バグが、
7行の未修整(OPEN)バグと
すべてペアに
11行の修正済み(FIXED)バグが、
7行の未修整(OPEN)バグと
すべてペアに
9
■ cartesian-no-group.sql の Select句を Select * に変更した結果
 17.2.1 意図に反した結果 (5/5)
10
 17.2.2 さらなる弊害
● 1つのクエリで複数のタスクを行おうとすると・・・
➢
意図しない結果が導かれる
➢ クエリの記述や修正、デバッグが難しくなる
➢ 実行時のコストが上がる
(手の込んだSQLは最適化処理などが難しくなる)
11
 17.3 アンチパターンの見つけ方
● SUM関数やCOUNT関数の結果があり得ないくら
いに大きくなってるのはなぜ?
● このお化けみたいに複雑SQLクエリを書くのに、丸
1日かかったよ!
●
このレポート出力には、もう何も追加できない。この
SQLクエリを書き直すのは手間がかかりすぎる
● このクエリに、もう1つDISTINCTを追加してみよう
●
(実行時間が長すぎる!)
12
17.4 アンチパターンを用いてもよい場合
●
単一のクエリをデータソースに結び付けてアプリケーション
にデータを表示するような、プログラミングフレームワーク
やビジュアルコンポーネントライブラリ、レポートツールを
使っている場合
➢ ただ、レポートの要件が1つのSQLクエリで実現するにはあ
まりにも複雑な場合は、レポートを複数作成した方がよいか
もしれない
● 複数の結果を1つのソート順で表示させるために、1つの
クエリから複雑な結果を得たい場合
➢ SQLクエリでは、ソート順を簡単に指定できる
➢ 複数のクエリ結果をソートするするには、アプリケーション
コードを書くよりもDBでソートした方が効率的な場合が多い
13
 17.5 解決策:分割統治を行う
● 節約の原則(the law of parsimony)
➢
まったく同じ予測をする2つの競合する理論があるとき
は、単純な方が優れている。
● この原則をSQLに当てはめると・・・
➢
まったく同じ結果セットを生む2つのクエリを選択できる
場合は、単純なクエリを選ぶべき。
14
 17.5.1 ワンステップずつ (1/2)
SELECT p.product_id, COUNT(f.bug_id) AS count_fixed
FROM BugsProducts p
LEFT OUTER JOIN Bugs f ON p.bug_id = f.bug_id AND f.status = 'FIXED'
WHERE p.product_id = 1
GROUP BY p.product_id;
SELECT p2.product_id, COUNT(o.bug_id) AS count_open
FROM BugsProducts p2
LEFT OUTER JOIN Bugs o ON p2.bug_id = o.bug_id AND o.status = 'OPEN'
WHERE p2.product_id = 1
GROUP BY p2.product_id;
FROM BugsProducts p
INNER JOIN Bugs f ON p.bug_id = f.bug_id AND f.status = 'FIXED'
INNER JOIN Bugs o ON p2.bug_id = o.bug_id AND o.status = 'OPEN'
INNER JOIN BugsProducts p2
SELECT p.product_id,
COUNT(f.bug_id) AS count_fixed,
COUNT(o.bug_id) AS count_open
WHERE p.product_id = 1 GROUP BY p.product_id;
USING (product_id)
デカルト積を避けるために、クエリを分割デカルト積を避けるために、クエリを分割
Spaghetti-Query/anti/cartesian.sql
Spaghetti-Query/soln/split-query.sql
15
 17.5.1 ワンステップずつ (2/2)
● クエリ分割は様々なメリットをもたらす
➢
デカルト積が生じない。
➢ 新たな要件が追加された場合、すでに複雑なクエリをさ
らに複雑にするより、単純なクエリを新たに書く方がは
るかに簡単。
➢ 一般的に、SQLエンジンは複雑なクエリよりも単純なク
エリの方がスムーズかつ確実に実行できる。
➢
コードレビューなどでは、シンプルな複数のクエリを説明
する方が、1つの複雑なクエリを説明するより簡単。
16
 17.5.2 UNIONを用いる
複数のクエリの結果は、UNIONによって1つの結果セットにまとめられる。
2つのサブクエリの結果を区別するための
列として、status列を使用している。
UNIONは、両方のサブクエリの列に互換性が
あるときにのみ使用できる。
17
 17.5.3 CASE式とSUM関数を組み合わせる
条件ごとの集約を1つのクエリでシンプルに行うために、CASE式とSUM
関数を組み合わせる方法がよく使われる。
18
 17.5.4 上司の問題を解決する
最前の解決策は、上司から求められたタスクを分割して処理すること。
■誰かが取り扱っている製品の数:
SELECT COUNT(*) AS how_many_products FROM Products;
■バグを修正した開発者の数:
SELECT COUNT(DISTINCT assigned_to) AS how_many_developers
FROM Bugs WHERE status = 'FIXED';
■開発者1人あたりの平均バグ修正数:
SELECT AVG(bugs_per_developer) AS average_bugs_per_developer
FROM (SELECT dev.account_id, COUNT(*) AS bugs_per_developer
FROM Bugs b INNER JOIN Accounts dev
ON b.assigned_to = dev.account_id
WHERE b.status = 'FIXED' GROUP BY dev.account_id) t;
■修正したバグの中で顧客から報告されたバグの数:
SELECT COUNT(*) AS how_many_customer_bugs
FROM Bugs b INNER JOIN Accounts cust ON b.reported_by = cust.account_id
WHERE b.status = 'FIXED' AND cust.email NOT LIKE '%@example.com';
19
 17.5.5 SQLを用いたSQLの自動的な記述
■ コラム: 複数のUPDATEステートメント生成
【例】 列 last_used の値を、各コンピュータが使用された最新の日付に設定する:
SELECT CONCAT('UPDATE Inventory '
' SET last_used = ''', MAX(u.usage_date), '''',
' WHERE inventory_id = ', u.inventory_id, ';') AS update_statement
FROM ComputerUsage u
GROUP BY u.inventory_id;
● 複雑なSQLクエリを分割すると、データの値によっ
てわずかに異なる、似たようなクエリをいくつも生
成することがある。
➢ それは煩わしいので、「コード生成」を行いましょう。
➢ 「コード生成」は、新しいコードを手で書くには非常に労
力がかかるような場面で効果的。
20
まとめ
SQLSQLでは、1行のコードで複雑な問題を解決できでは、1行のコードで複雑な問題を解決でき
ると思える場合があります。ると思える場合があります。
しかし、状況に応じてクエリを分割することも検討しかし、状況に応じてクエリを分割することも検討
するようにしましょう。するようにしましょう。

Mais conteúdo relacionado

Mais procurados

學習樹 心智圖的學習與應用
學習樹 心智圖的學習與應用學習樹 心智圖的學習與應用
學習樹 心智圖的學習與應用Hsing-Cheng Tsai
 
Windows PowerShell によるWindows Server 管理の自動化 v4.0 2014.03.13 更新版
Windows PowerShell によるWindows Server 管理の自動化 v4.0 2014.03.13 更新版Windows PowerShell によるWindows Server 管理の自動化 v4.0 2014.03.13 更新版
Windows PowerShell によるWindows Server 管理の自動化 v4.0 2014.03.13 更新版junichi anno
 
【領導管理】10種摧毀團隊的領導方式 (10 leadership traits that will kill your company)
【領導管理】10種摧毀團隊的領導方式 (10 leadership traits that will kill your company)【領導管理】10種摧毀團隊的領導方式 (10 leadership traits that will kill your company)
【領導管理】10種摧毀團隊的領導方式 (10 leadership traits that will kill your company)周建良 Zhou Jian Liang
 
讀書筆記-你會問問題嗎?
讀書筆記-你會問問題嗎?讀書筆記-你會問問題嗎?
讀書筆記-你會問問題嗎?Henry Lee (李桓瑞)
 
設計書自動生成への取り組み~手書き設計書から脱却するには?~
設計書自動生成への取り組み~手書き設計書から脱却するには?~設計書自動生成への取り組み~手書き設計書から脱却するには?~
設計書自動生成への取り組み~手書き設計書から脱却するには?~SystemIntegrator2
 
なぜリアクティブは重要か #ScalaMatsuri
なぜリアクティブは重要か #ScalaMatsuriなぜリアクティブは重要か #ScalaMatsuri
なぜリアクティブは重要か #ScalaMatsuriYuta Okamoto
 
Active Directory and Single Sign On for Oracle Analytics Cloud AnDSummit19
Active Directory and Single Sign On for Oracle Analytics Cloud AnDSummit19Active Directory and Single Sign On for Oracle Analytics Cloud AnDSummit19
Active Directory and Single Sign On for Oracle Analytics Cloud AnDSummit19Becky Wagner
 
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」Takuto Wada
 
Paper: Oracle RAC Internals - The Cache Fusion Edition
Paper: Oracle RAC Internals - The Cache Fusion EditionPaper: Oracle RAC Internals - The Cache Fusion Edition
Paper: Oracle RAC Internals - The Cache Fusion EditionMarkus Michalewicz
 
MySQL 5.7にやられないためにおぼえておいてほしいこと
MySQL 5.7にやられないためにおぼえておいてほしいことMySQL 5.7にやられないためにおぼえておいてほしいこと
MySQL 5.7にやられないためにおぼえておいてほしいことyoku0825
 
Getting optimal performance from oracle e-business suite presentation
Getting optimal performance from oracle e-business suite presentationGetting optimal performance from oracle e-business suite presentation
Getting optimal performance from oracle e-business suite presentationBerry Clemens
 
Sql server 2016 always on 可用性グループ new features
Sql server 2016 always on 可用性グループ new featuresSql server 2016 always on 可用性グループ new features
Sql server 2016 always on 可用性グループ new featuresMasayuki Ozawa
 
Dd and atomic ddl pl17 dublin
Dd and atomic ddl pl17 dublinDd and atomic ddl pl17 dublin
Dd and atomic ddl pl17 dublinStåle Deraas
 
JobSchedulerでのジョブの多重実行・排他制御
JobSchedulerでのジョブの多重実行・排他制御JobSchedulerでのジョブの多重実行・排他制御
JobSchedulerでのジョブの多重実行・排他制御OSSラボ株式会社
 
彼得前書 第一章 你們要聖潔
彼得前書 第一章 你們要聖潔彼得前書 第一章 你們要聖潔
彼得前書 第一章 你們要聖潔查經簡報分享
 
Introduction of Business Use-Case and Business Flowin Requirement Development
Introduction of Business Use-Case and Business Flowin Requirement DevelopmentIntroduction of Business Use-Case and Business Flowin Requirement Development
Introduction of Business Use-Case and Business Flowin Requirement DevelopmentKent Ishizawa
 
約翰一書 第三章:彼此相愛
約翰一書第三章:彼此相愛約翰一書第三章:彼此相愛
約翰一書 第三章:彼此相愛查經簡報分享
 

Mais procurados (20)

學習樹 心智圖的學習與應用
學習樹 心智圖的學習與應用學習樹 心智圖的學習與應用
學習樹 心智圖的學習與應用
 
Windows PowerShell によるWindows Server 管理の自動化 v4.0 2014.03.13 更新版
Windows PowerShell によるWindows Server 管理の自動化 v4.0 2014.03.13 更新版Windows PowerShell によるWindows Server 管理の自動化 v4.0 2014.03.13 更新版
Windows PowerShell によるWindows Server 管理の自動化 v4.0 2014.03.13 更新版
 
【領導管理】10種摧毀團隊的領導方式 (10 leadership traits that will kill your company)
【領導管理】10種摧毀團隊的領導方式 (10 leadership traits that will kill your company)【領導管理】10種摧毀團隊的領導方式 (10 leadership traits that will kill your company)
【領導管理】10種摧毀團隊的領導方式 (10 leadership traits that will kill your company)
 
讀書筆記-你會問問題嗎?
讀書筆記-你會問問題嗎?讀書筆記-你會問問題嗎?
讀書筆記-你會問問題嗎?
 
設計書自動生成への取り組み~手書き設計書から脱却するには?~
設計書自動生成への取り組み~手書き設計書から脱却するには?~設計書自動生成への取り組み~手書き設計書から脱却するには?~
設計書自動生成への取り組み~手書き設計書から脱却するには?~
 
なぜリアクティブは重要か #ScalaMatsuri
なぜリアクティブは重要か #ScalaMatsuriなぜリアクティブは重要か #ScalaMatsuri
なぜリアクティブは重要か #ScalaMatsuri
 
Active Directory and Single Sign On for Oracle Analytics Cloud AnDSummit19
Active Directory and Single Sign On for Oracle Analytics Cloud AnDSummit19Active Directory and Single Sign On for Oracle Analytics Cloud AnDSummit19
Active Directory and Single Sign On for Oracle Analytics Cloud AnDSummit19
 
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
 
Paper: Oracle RAC Internals - The Cache Fusion Edition
Paper: Oracle RAC Internals - The Cache Fusion EditionPaper: Oracle RAC Internals - The Cache Fusion Edition
Paper: Oracle RAC Internals - The Cache Fusion Edition
 
MySQL 5.7にやられないためにおぼえておいてほしいこと
MySQL 5.7にやられないためにおぼえておいてほしいことMySQL 5.7にやられないためにおぼえておいてほしいこと
MySQL 5.7にやられないためにおぼえておいてほしいこと
 
Getting optimal performance from oracle e-business suite presentation
Getting optimal performance from oracle e-business suite presentationGetting optimal performance from oracle e-business suite presentation
Getting optimal performance from oracle e-business suite presentation
 
Sql server 2016 always on 可用性グループ new features
Sql server 2016 always on 可用性グループ new featuresSql server 2016 always on 可用性グループ new features
Sql server 2016 always on 可用性グループ new features
 
1親職教育
1親職教育1親職教育
1親職教育
 
Dd and atomic ddl pl17 dublin
Dd and atomic ddl pl17 dublinDd and atomic ddl pl17 dublin
Dd and atomic ddl pl17 dublin
 
保羅書信總論
保羅書信總論保羅書信總論
保羅書信總論
 
JobSchedulerでのジョブの多重実行・排他制御
JobSchedulerでのジョブの多重実行・排他制御JobSchedulerでのジョブの多重実行・排他制御
JobSchedulerでのジョブの多重実行・排他制御
 
彼得前書 第一章 你們要聖潔
彼得前書 第一章 你們要聖潔彼得前書 第一章 你們要聖潔
彼得前書 第一章 你們要聖潔
 
Introduction of Business Use-Case and Business Flowin Requirement Development
Introduction of Business Use-Case and Business Flowin Requirement DevelopmentIntroduction of Business Use-Case and Business Flowin Requirement Development
Introduction of Business Use-Case and Business Flowin Requirement Development
 
約翰一書 第三章:彼此相愛
約翰一書第三章:彼此相愛約翰一書第三章:彼此相愛
約翰一書 第三章:彼此相愛
 
約翰福音第10章(下)
約翰福音第10章(下)約翰福音第10章(下)
約翰福音第10章(下)
 

Semelhante a SQLアンチパターン読書会 「スパゲッティクエリ」

少しずつ手厚くして不具合や仕様漏れを防ぐために
少しずつ手厚くして不具合や仕様漏れを防ぐために少しずつ手厚くして不具合や仕様漏れを防ぐために
少しずつ手厚くして不具合や仕様漏れを防ぐためにFumiya Sakai
 
タイムボックス制約付きインクリメンタル開発
タイムボックス制約付きインクリメンタル開発タイムボックス制約付きインクリメンタル開発
タイムボックス制約付きインクリメンタル開発HIDEKAZU MATSUURA
 
Application Architecture for Enterprise Win Store Apps with DDD Pattern
Application Architecture for Enterprise Win Store Apps with DDD PatternApplication Architecture for Enterprise Win Store Apps with DDD Pattern
Application Architecture for Enterprise Win Store Apps with DDD PatternAtsushi Kambara
 
【17-C-2】 クラウド上でのエンタープライズアプリケーション開発
【17-C-2】 クラウド上でのエンタープライズアプリケーション開発【17-C-2】 クラウド上でのエンタープライズアプリケーション開発
【17-C-2】 クラウド上でのエンタープライズアプリケーション開発lalha
 
WTM53 phpフレームワーク いまさらcodeigniter
WTM53 phpフレームワーク いまさらcodeigniterWTM53 phpフレームワーク いまさらcodeigniter
WTM53 phpフレームワーク いまさらcodeigniterMasanori Oobayashi
 
Build 番号の自動更新スクリプトについて #cocoa_kansai
Build 番号の自動更新スクリプトについて #cocoa_kansaiBuild 番号の自動更新スクリプトについて #cocoa_kansai
Build 番号の自動更新スクリプトについて #cocoa_kansaiTomohiro Kumagai
 
Japan Container Day 2018
Japan Container Day 2018Japan Container Day 2018
Japan Container Day 2018Yoshio Terada
 
Scala + Finagleの魅力
Scala + Finagleの魅力Scala + Finagleの魅力
Scala + Finagleの魅力Kota Mizushima
 
はじめてのAngular その1
はじめてのAngular その1はじめてのAngular その1
はじめてのAngular その1純一 榮枝
 
初心者向け SQLite の始め方
初心者向け SQLite の始め方初心者向け SQLite の始め方
初心者向け SQLite の始め方suno88
 
Session3 - LabVIEW NXG Training Course
Session3 - LabVIEW NXG Training CourseSession3 - LabVIEW NXG Training Course
Session3 - LabVIEW NXG Training CourseYusuke Tochigi
 
【SQiP2014】システム操作インターフェイス最適化によるテスト自動化ROI向上
【SQiP2014】システム操作インターフェイス最適化によるテスト自動化ROI向上【SQiP2014】システム操作インターフェイス最適化によるテスト自動化ROI向上
【SQiP2014】システム操作インターフェイス最適化によるテスト自動化ROI向上Tatsuya Ishikawa
 
iOSやAndroidアプリ開発のGoodPractice
iOSやAndroidアプリ開発のGoodPracticeiOSやAndroidアプリ開発のGoodPractice
iOSやAndroidアプリ開発のGoodPracticeKen Morishita
 
Swift を振り返ってみよう #cswift
Swift を振り返ってみよう #cswiftSwift を振り返ってみよう #cswift
Swift を振り返ってみよう #cswiftTomohiro Kumagai
 
レガシーコード改善ガイド 第7章 いつまでたっても変更作業が終わりません
レガシーコード改善ガイド 第7章 いつまでたっても変更作業が終わりませんレガシーコード改善ガイド 第7章 いつまでたっても変更作業が終わりません
レガシーコード改善ガイド 第7章 いつまでたっても変更作業が終わりませんTakahiro Okada
 
VSCodeで始めるAzure Static Web Apps開発
VSCodeで始めるAzure Static Web Apps開発VSCodeで始めるAzure Static Web Apps開発
VSCodeで始めるAzure Static Web Apps開発Yuta Matsumura
 
iOSアプリケーションの Unit Test
iOSアプリケーションの Unit TestiOSアプリケーションの Unit Test
iOSアプリケーションの Unit TestKatsumi Kishikawa
 

Semelhante a SQLアンチパターン読書会 「スパゲッティクエリ」 (20)

少しずつ手厚くして不具合や仕様漏れを防ぐために
少しずつ手厚くして不具合や仕様漏れを防ぐために少しずつ手厚くして不具合や仕様漏れを防ぐために
少しずつ手厚くして不具合や仕様漏れを防ぐために
 
タイムボックス制約付きインクリメンタル開発
タイムボックス制約付きインクリメンタル開発タイムボックス制約付きインクリメンタル開発
タイムボックス制約付きインクリメンタル開発
 
Application Architecture for Enterprise Win Store Apps with DDD Pattern
Application Architecture for Enterprise Win Store Apps with DDD PatternApplication Architecture for Enterprise Win Store Apps with DDD Pattern
Application Architecture for Enterprise Win Store Apps with DDD Pattern
 
【17-C-2】 クラウド上でのエンタープライズアプリケーション開発
【17-C-2】 クラウド上でのエンタープライズアプリケーション開発【17-C-2】 クラウド上でのエンタープライズアプリケーション開発
【17-C-2】 クラウド上でのエンタープライズアプリケーション開発
 
ScalaMatsuri 2016
ScalaMatsuri 2016ScalaMatsuri 2016
ScalaMatsuri 2016
 
Coderetreat
CoderetreatCoderetreat
Coderetreat
 
WTM53 phpフレームワーク いまさらcodeigniter
WTM53 phpフレームワーク いまさらcodeigniterWTM53 phpフレームワーク いまさらcodeigniter
WTM53 phpフレームワーク いまさらcodeigniter
 
Build 番号の自動更新スクリプトについて #cocoa_kansai
Build 番号の自動更新スクリプトについて #cocoa_kansaiBuild 番号の自動更新スクリプトについて #cocoa_kansai
Build 番号の自動更新スクリプトについて #cocoa_kansai
 
Japan Container Day 2018
Japan Container Day 2018Japan Container Day 2018
Japan Container Day 2018
 
エコSmalltalk
エコSmalltalkエコSmalltalk
エコSmalltalk
 
Scala + Finagleの魅力
Scala + Finagleの魅力Scala + Finagleの魅力
Scala + Finagleの魅力
 
はじめてのAngular その1
はじめてのAngular その1はじめてのAngular その1
はじめてのAngular その1
 
初心者向け SQLite の始め方
初心者向け SQLite の始め方初心者向け SQLite の始め方
初心者向け SQLite の始め方
 
Session3 - LabVIEW NXG Training Course
Session3 - LabVIEW NXG Training CourseSession3 - LabVIEW NXG Training Course
Session3 - LabVIEW NXG Training Course
 
【SQiP2014】システム操作インターフェイス最適化によるテスト自動化ROI向上
【SQiP2014】システム操作インターフェイス最適化によるテスト自動化ROI向上【SQiP2014】システム操作インターフェイス最適化によるテスト自動化ROI向上
【SQiP2014】システム操作インターフェイス最適化によるテスト自動化ROI向上
 
iOSやAndroidアプリ開発のGoodPractice
iOSやAndroidアプリ開発のGoodPracticeiOSやAndroidアプリ開発のGoodPractice
iOSやAndroidアプリ開発のGoodPractice
 
Swift を振り返ってみよう #cswift
Swift を振り返ってみよう #cswiftSwift を振り返ってみよう #cswift
Swift を振り返ってみよう #cswift
 
レガシーコード改善ガイド 第7章 いつまでたっても変更作業が終わりません
レガシーコード改善ガイド 第7章 いつまでたっても変更作業が終わりませんレガシーコード改善ガイド 第7章 いつまでたっても変更作業が終わりません
レガシーコード改善ガイド 第7章 いつまでたっても変更作業が終わりません
 
VSCodeで始めるAzure Static Web Apps開発
VSCodeで始めるAzure Static Web Apps開発VSCodeで始めるAzure Static Web Apps開発
VSCodeで始めるAzure Static Web Apps開発
 
iOSアプリケーションの Unit Test
iOSアプリケーションの Unit TestiOSアプリケーションの Unit Test
iOSアプリケーションの Unit Test
 

SQLアンチパターン読書会 「スパゲッティクエリ」