Enviar búsqueda
Cargar
コードの互換性と進化の両立
•
Descargar como PPTX, PDF
•
24 recomendaciones
•
11,270 vistas
Kohsuke Kawaguchi
Seguir
Jenkinsでつちかった、コードの互換性を保ちつつ様々な修正を加えていく技法を紹介します。
Leer menos
Leer más
Tecnología
Denunciar
Compartir
Denunciar
Compartir
1 de 61
Descargar ahora
Recomendados
OpenShift from Easy way to Hard ? Way
OpenShift from Easy way to Hard ? Way
ロフト くん
はじめての Cloud Foundry: .NET アプリケーションのはじめ方
はじめての Cloud Foundry: .NET アプリケーションのはじめ方
Akihiro Kitada
CyberAgent: How We Deployed Production Kubernetes Clusters on OpenStack witho...
CyberAgent: How We Deployed Production Kubernetes Clusters on OpenStack witho...
VirtualTech Japan Inc.
(続) はじめてのCloud Foundry
(続) はじめてのCloud Foundry
Tomohiro Ichimura
Introduction to Magnum (JP)
Introduction to Magnum (JP)
Motohiro OTSUKA
Kubernetes をいじって Hardware LoadBalancer で "type LoadBalancer" を実現してみた @Kuberne...
Kubernetes をいじって Hardware LoadBalancer で "type LoadBalancer" を実現してみた @Kuberne...
Masaya Aoyama
Container Networking Deep Dive
Container Networking Deep Dive
Hirofumi Ichihara
Cloud Foundry にアプリケーションを push する際の典型的な10のエラー
Cloud Foundry にアプリケーションを push する際の典型的な10のエラー
nota-ja
Recomendados
OpenShift from Easy way to Hard ? Way
OpenShift from Easy way to Hard ? Way
ロフト くん
はじめての Cloud Foundry: .NET アプリケーションのはじめ方
はじめての Cloud Foundry: .NET アプリケーションのはじめ方
Akihiro Kitada
CyberAgent: How We Deployed Production Kubernetes Clusters on OpenStack witho...
CyberAgent: How We Deployed Production Kubernetes Clusters on OpenStack witho...
VirtualTech Japan Inc.
(続) はじめてのCloud Foundry
(続) はじめてのCloud Foundry
Tomohiro Ichimura
Introduction to Magnum (JP)
Introduction to Magnum (JP)
Motohiro OTSUKA
Kubernetes をいじって Hardware LoadBalancer で "type LoadBalancer" を実現してみた @Kuberne...
Kubernetes をいじって Hardware LoadBalancer で "type LoadBalancer" を実現してみた @Kuberne...
Masaya Aoyama
Container Networking Deep Dive
Container Networking Deep Dive
Hirofumi Ichihara
Cloud Foundry にアプリケーションを push する際の典型的な10のエラー
Cloud Foundry にアプリケーションを push する際の典型的な10のエラー
nota-ja
Cloud Foundry V2を、もうちょっと深掘りしよう
Cloud Foundry V2を、もうちょっと深掘りしよう
Kazuto Kusama
自動化ハンズオン
自動化ハンズオン
VirtualTech Japan Inc.
CoreOS OEM on NIFTY Cloud - CoreOS Meetup Tokyo #1 #coreosjp
CoreOS OEM on NIFTY Cloud - CoreOS Meetup Tokyo #1 #coreosjp
雄也 日下部
どこよりも早い Spring Boot 1.2 解説 #渋谷Java
どこよりも早い Spring Boot 1.2 解説 #渋谷Java
Toshiaki Maki
Introduce that Best practices for writing Dockerfiles
Introduce that Best practices for writing Dockerfiles
Yukiya Hayashi
20150101勉強会 dokku alt
20150101勉強会 dokku alt
Shugo Numano
kpackによるコンテナイメージのビルド
kpackによるコンテナイメージのビルド
Masanori Nara
GitHubのリポジトリ(32個)を 覗いてみよう。 ただし、READMEだけね
GitHubのリポジトリ(32個)を 覗いてみよう。 ただし、READMEだけね
Naoto TAKAHASHI
st2-docker ことはじめ
st2-docker ことはじめ
Shu Sugimoto
Quarkus による超音速な Spring アプリケーション開発
Quarkus による超音速な Spring アプリケーション開発
Chihiro Ito
自前CF環境を整えよう 2013年11月版
自前CF環境を整えよう 2013年11月版
Kazuto Kusama
Githubを使って簡単に helm repoを公開してみよう
Githubを使って簡単に helm repoを公開してみよう
Shingo Omura
第18回Cloud Foundry輪読会用 Buildpackを使ってアプリを 載せるためのアプローチ
第18回Cloud Foundry輪読会用 Buildpackを使ってアプリを 載せるためのアプローチ
Takeshi Morikawa
On-premise コンテナ基盤と Hardware LB を使った "type LoadBalancer"
On-premise コンテナ基盤と Hardware LB を使った "type LoadBalancer"
Masaya Aoyama
Japan Container Day 2018
Japan Container Day 2018
Yoshio Terada
Jenkins x Kubernetesが簡単だと思ったら大変だった話
Jenkins x Kubernetesが簡単だと思ったら大変だった話
Masaki Yamamoto
Cloud foundry(v2)へアプリを載せ替え
Cloud foundry(v2)へアプリを載せ替え
Takeshi Morikawa
AlibabaCloudではじめるKubernetes
AlibabaCloudではじめるKubernetes
Shinya Mori (@mosuke5)
DockerCon参加報告 (`docker build`が30倍以上速くなる話など)
DockerCon参加報告 (`docker build`が30倍以上速くなる話など)
Akihiro Suda
BOSH-lite で 1VM Cloud Foundry
BOSH-lite で 1VM Cloud Foundry
i_yudai
爆速でAndroidアプリを ビルドするための仕組み DeNA TechCon #denatechcon
爆速でAndroidアプリを ビルドするための仕組み DeNA TechCon #denatechcon
Yosaku Toyama
第2回デザインパターン資料
第2回デザインパターン資料
gaaupp
Más contenido relacionado
La actualidad más candente
Cloud Foundry V2を、もうちょっと深掘りしよう
Cloud Foundry V2を、もうちょっと深掘りしよう
Kazuto Kusama
自動化ハンズオン
自動化ハンズオン
VirtualTech Japan Inc.
CoreOS OEM on NIFTY Cloud - CoreOS Meetup Tokyo #1 #coreosjp
CoreOS OEM on NIFTY Cloud - CoreOS Meetup Tokyo #1 #coreosjp
雄也 日下部
どこよりも早い Spring Boot 1.2 解説 #渋谷Java
どこよりも早い Spring Boot 1.2 解説 #渋谷Java
Toshiaki Maki
Introduce that Best practices for writing Dockerfiles
Introduce that Best practices for writing Dockerfiles
Yukiya Hayashi
20150101勉強会 dokku alt
20150101勉強会 dokku alt
Shugo Numano
kpackによるコンテナイメージのビルド
kpackによるコンテナイメージのビルド
Masanori Nara
GitHubのリポジトリ(32個)を 覗いてみよう。 ただし、READMEだけね
GitHubのリポジトリ(32個)を 覗いてみよう。 ただし、READMEだけね
Naoto TAKAHASHI
st2-docker ことはじめ
st2-docker ことはじめ
Shu Sugimoto
Quarkus による超音速な Spring アプリケーション開発
Quarkus による超音速な Spring アプリケーション開発
Chihiro Ito
自前CF環境を整えよう 2013年11月版
自前CF環境を整えよう 2013年11月版
Kazuto Kusama
Githubを使って簡単に helm repoを公開してみよう
Githubを使って簡単に helm repoを公開してみよう
Shingo Omura
第18回Cloud Foundry輪読会用 Buildpackを使ってアプリを 載せるためのアプローチ
第18回Cloud Foundry輪読会用 Buildpackを使ってアプリを 載せるためのアプローチ
Takeshi Morikawa
On-premise コンテナ基盤と Hardware LB を使った "type LoadBalancer"
On-premise コンテナ基盤と Hardware LB を使った "type LoadBalancer"
Masaya Aoyama
Japan Container Day 2018
Japan Container Day 2018
Yoshio Terada
Jenkins x Kubernetesが簡単だと思ったら大変だった話
Jenkins x Kubernetesが簡単だと思ったら大変だった話
Masaki Yamamoto
Cloud foundry(v2)へアプリを載せ替え
Cloud foundry(v2)へアプリを載せ替え
Takeshi Morikawa
AlibabaCloudではじめるKubernetes
AlibabaCloudではじめるKubernetes
Shinya Mori (@mosuke5)
DockerCon参加報告 (`docker build`が30倍以上速くなる話など)
DockerCon参加報告 (`docker build`が30倍以上速くなる話など)
Akihiro Suda
BOSH-lite で 1VM Cloud Foundry
BOSH-lite で 1VM Cloud Foundry
i_yudai
La actualidad más candente
(20)
Cloud Foundry V2を、もうちょっと深掘りしよう
Cloud Foundry V2を、もうちょっと深掘りしよう
自動化ハンズオン
自動化ハンズオン
CoreOS OEM on NIFTY Cloud - CoreOS Meetup Tokyo #1 #coreosjp
CoreOS OEM on NIFTY Cloud - CoreOS Meetup Tokyo #1 #coreosjp
どこよりも早い Spring Boot 1.2 解説 #渋谷Java
どこよりも早い Spring Boot 1.2 解説 #渋谷Java
Introduce that Best practices for writing Dockerfiles
Introduce that Best practices for writing Dockerfiles
20150101勉強会 dokku alt
20150101勉強会 dokku alt
kpackによるコンテナイメージのビルド
kpackによるコンテナイメージのビルド
GitHubのリポジトリ(32個)を 覗いてみよう。 ただし、READMEだけね
GitHubのリポジトリ(32個)を 覗いてみよう。 ただし、READMEだけね
st2-docker ことはじめ
st2-docker ことはじめ
Quarkus による超音速な Spring アプリケーション開発
Quarkus による超音速な Spring アプリケーション開発
自前CF環境を整えよう 2013年11月版
自前CF環境を整えよう 2013年11月版
Githubを使って簡単に helm repoを公開してみよう
Githubを使って簡単に helm repoを公開してみよう
第18回Cloud Foundry輪読会用 Buildpackを使ってアプリを 載せるためのアプローチ
第18回Cloud Foundry輪読会用 Buildpackを使ってアプリを 載せるためのアプローチ
On-premise コンテナ基盤と Hardware LB を使った "type LoadBalancer"
On-premise コンテナ基盤と Hardware LB を使った "type LoadBalancer"
Japan Container Day 2018
Japan Container Day 2018
Jenkins x Kubernetesが簡単だと思ったら大変だった話
Jenkins x Kubernetesが簡単だと思ったら大変だった話
Cloud foundry(v2)へアプリを載せ替え
Cloud foundry(v2)へアプリを載せ替え
AlibabaCloudではじめるKubernetes
AlibabaCloudではじめるKubernetes
DockerCon参加報告 (`docker build`が30倍以上速くなる話など)
DockerCon参加報告 (`docker build`が30倍以上速くなる話など)
BOSH-lite で 1VM Cloud Foundry
BOSH-lite で 1VM Cloud Foundry
Similar a コードの互換性と進化の両立
爆速でAndroidアプリを ビルドするための仕組み DeNA TechCon #denatechcon
爆速でAndroidアプリを ビルドするための仕組み DeNA TechCon #denatechcon
Yosaku Toyama
第2回デザインパターン資料
第2回デザインパターン資料
gaaupp
QuickDemo HashiCorp Terraform with Microsoft Azure and VMware vSphere
QuickDemo HashiCorp Terraform with Microsoft Azure and VMware vSphere
Wataru Unno
「AROW」お披露目(実用編)
「AROW」お披露目(実用編)
Drecom Co., Ltd.
Hyperledger Fabric 簡単構築ツール minifabricのご紹介 〜productionへの移行をminifabricで加速〜
Hyperledger Fabric 簡単構築ツール minifabricのご紹介 〜productionへの移行をminifabricで加速〜
Hyperleger Tokyo Meetup
Groovy Bootcamp 2015 by JGGUG
Groovy Bootcamp 2015 by JGGUG
Uehara Junji
GoF デザインパターン 2009
GoF デザインパターン 2009
miwarin
Flutterを体験してみませんか
Flutterを体験してみませんか
cch-robo
[1C5] Docker Comose & Swarm mode Orchestration (Japan Container Days - Day1)
[1C5] Docker Comose & Swarm mode Orchestration (Japan Container Days - Day1)
Masahito Zembutsu
Swift2 の新機能 Protocol Extension
Swift2 の新機能 Protocol Extension
Yuichi Adachi
FxUG in Toyama - ASphalt2 container -
FxUG in Toyama - ASphalt2 container -
Akio Katayama
FxUG in Toyama - ASphalt2 container -
FxUG in Toyama - ASphalt2 container -
Akio Katayama
ストリームデータ分散処理基盤Storm
ストリームデータ分散処理基盤Storm
NTT DATA OSS Professional Services
cocos2d-xとネイティブ間の連携
cocos2d-xとネイティブ間の連携
Tomoaki Shimizu
メルカリ・ソウゾウでは どうGoを活用しているのか?
メルカリ・ソウゾウでは どうGoを活用しているのか?
Takuya Ueda
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Yasutaka Kawamoto
Javaセキュアコーディングセミナー東京第3回講義
Javaセキュアコーディングセミナー東京第3回講義
JPCERT Coordination Center
Lithium Labo #1
Lithium Labo #1
Yusuke Ando
Angular ユーザーなら押さえておきたい! TypeScript と Visual Studio Code の基礎と活用
Angular ユーザーなら押さえておきたい! TypeScript と Visual Studio Code の基礎と活用
Akira Inoue
C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~
C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~
Fujio Kojima
Similar a コードの互換性と進化の両立
(20)
爆速でAndroidアプリを ビルドするための仕組み DeNA TechCon #denatechcon
爆速でAndroidアプリを ビルドするための仕組み DeNA TechCon #denatechcon
第2回デザインパターン資料
第2回デザインパターン資料
QuickDemo HashiCorp Terraform with Microsoft Azure and VMware vSphere
QuickDemo HashiCorp Terraform with Microsoft Azure and VMware vSphere
「AROW」お披露目(実用編)
「AROW」お披露目(実用編)
Hyperledger Fabric 簡単構築ツール minifabricのご紹介 〜productionへの移行をminifabricで加速〜
Hyperledger Fabric 簡単構築ツール minifabricのご紹介 〜productionへの移行をminifabricで加速〜
Groovy Bootcamp 2015 by JGGUG
Groovy Bootcamp 2015 by JGGUG
GoF デザインパターン 2009
GoF デザインパターン 2009
Flutterを体験してみませんか
Flutterを体験してみませんか
[1C5] Docker Comose & Swarm mode Orchestration (Japan Container Days - Day1)
[1C5] Docker Comose & Swarm mode Orchestration (Japan Container Days - Day1)
Swift2 の新機能 Protocol Extension
Swift2 の新機能 Protocol Extension
FxUG in Toyama - ASphalt2 container -
FxUG in Toyama - ASphalt2 container -
FxUG in Toyama - ASphalt2 container -
FxUG in Toyama - ASphalt2 container -
ストリームデータ分散処理基盤Storm
ストリームデータ分散処理基盤Storm
cocos2d-xとネイティブ間の連携
cocos2d-xとネイティブ間の連携
メルカリ・ソウゾウでは どうGoを活用しているのか?
メルカリ・ソウゾウでは どうGoを活用しているのか?
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
Javaセキュアコーディングセミナー東京第3回講義
Javaセキュアコーディングセミナー東京第3回講義
Lithium Labo #1
Lithium Labo #1
Angular ユーザーなら押さえておきたい! TypeScript と Visual Studio Code の基礎と活用
Angular ユーザーなら押さえておきたい! TypeScript と Visual Studio Code の基礎と活用
C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~
C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~
Más de Kohsuke Kawaguchi
Jenkins 2.0 (日本語)
Jenkins 2.0 (日本語)
Kohsuke Kawaguchi
Workflow, container, and beyond
Workflow, container, and beyond
Kohsuke Kawaguchi
Jenkins User Conference 東京 2015
Jenkins User Conference 東京 2015
Kohsuke Kawaguchi
JavaOne 2014: Next Step in Automation: Elastic Build Environment
JavaOne 2014: Next Step in Automation: Elastic Build Environment
Kohsuke Kawaguchi
On sharing ideas & sharing code
On sharing ideas & sharing code
Kohsuke Kawaguchi
Jenkins User Conference 2013: Literate, multi-branch, mobile and more
Jenkins User Conference 2013: Literate, multi-branch, mobile and more
Kohsuke Kawaguchi
Jenkins User Conference 2013 Palo Alto: Keynote
Jenkins User Conference 2013 Palo Alto: Keynote
Kohsuke Kawaguchi
Jenkins State of union 2013
Jenkins State of union 2013
Kohsuke Kawaguchi
How we made jenkins community
How we made jenkins community
Kohsuke Kawaguchi
第六回Jenkins勉強会
第六回Jenkins勉強会
Kohsuke Kawaguchi
Large scale automation with jenkins
Large scale automation with jenkins
Kohsuke Kawaguchi
Jenkins User Conference 2012 San Francisco
Jenkins User Conference 2012 San Francisco
Kohsuke Kawaguchi
Jenkins+Gitによる検証済みマージ(30分版)
Jenkins+Gitによる検証済みマージ(30分版)
Kohsuke Kawaguchi
ここ最近のJenkins新機能
ここ最近のJenkins新機能
Kohsuke Kawaguchi
Jenkins user conference 東京
Jenkins user conference 東京
Kohsuke Kawaguchi
Dev@cloudの実装
Dev@cloudの実装
Kohsuke Kawaguchi
Developer summit continuous deliveryとjenkins
Developer summit continuous deliveryとjenkins
Kohsuke Kawaguchi
Creating a Developer Community
Creating a Developer Community
Kohsuke Kawaguchi
Jenkins user conference 2011
Jenkins user conference 2011
Kohsuke Kawaguchi
プロジェクト現状報告・Rubyによるjenkinsプラグイン開発
プロジェクト現状報告・Rubyによるjenkinsプラグイン開発
Kohsuke Kawaguchi
Más de Kohsuke Kawaguchi
(20)
Jenkins 2.0 (日本語)
Jenkins 2.0 (日本語)
Workflow, container, and beyond
Workflow, container, and beyond
Jenkins User Conference 東京 2015
Jenkins User Conference 東京 2015
JavaOne 2014: Next Step in Automation: Elastic Build Environment
JavaOne 2014: Next Step in Automation: Elastic Build Environment
On sharing ideas & sharing code
On sharing ideas & sharing code
Jenkins User Conference 2013: Literate, multi-branch, mobile and more
Jenkins User Conference 2013: Literate, multi-branch, mobile and more
Jenkins User Conference 2013 Palo Alto: Keynote
Jenkins User Conference 2013 Palo Alto: Keynote
Jenkins State of union 2013
Jenkins State of union 2013
How we made jenkins community
How we made jenkins community
第六回Jenkins勉強会
第六回Jenkins勉強会
Large scale automation with jenkins
Large scale automation with jenkins
Jenkins User Conference 2012 San Francisco
Jenkins User Conference 2012 San Francisco
Jenkins+Gitによる検証済みマージ(30分版)
Jenkins+Gitによる検証済みマージ(30分版)
ここ最近のJenkins新機能
ここ最近のJenkins新機能
Jenkins user conference 東京
Jenkins user conference 東京
Dev@cloudの実装
Dev@cloudの実装
Developer summit continuous deliveryとjenkins
Developer summit continuous deliveryとjenkins
Creating a Developer Community
Creating a Developer Community
Jenkins user conference 2011
Jenkins user conference 2011
プロジェクト現状報告・Rubyによるjenkinsプラグイン開発
プロジェクト現状報告・Rubyによるjenkinsプラグイン開発
Último
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
atsushi061452
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
sn679259
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NTT DATA Technology & Innovation
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
CRI Japan, Inc.
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Hiroshi Tomioka
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
Toru Tamaki
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
Toru Tamaki
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
iPride Co., Ltd.
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
WSO2
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
CRI Japan, Inc.
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
iPride Co., Ltd.
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
iPride Co., Ltd.
Último
(12)
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
コードの互換性と進化の両立
1.
互換性とコード進化の両立 川口耕介 CloudBees, Inc. kk@kohsuke.org
/ @kohsukekawa ©2013 CloudBees, Inc. All Rights Reserved 1
2.
分散・独立・並行開発 ©2013 CloudBees, Inc.
All Rights Reserved 2
3.
http://commons.wikimedia.org/wiki/File:Close_up_of_Hand_Cut_Jigsaw_Puzzle.JPG ©2013 CloudBees, Inc.
All Rights Reserved 3
4.
実行時結合 ©2013 CloudBees, Inc.
All Rights Reserved 4
5.
共通ライブラリ ウェブアプリX モジュールA モジュールB ライブラリ v1.0 ライブラリ v2.0 ©2013
CloudBees, Inc. All Rights Reserved 5
6.
©2013 CloudBees, Inc.
All Rights Reserved 6
7.
©2013 CloudBees, Inc.
All Rights Reserved © いまいまさのぶ 7
8.
プラグイン機構 プラグイン プラグイン コア プラグイン プラグイン 様々なクラス ©2013 CloudBees, Inc.
All Rights Reserved … 80+のライブラリ 8
9.
拡張ポイント • コア interface Animal
{ void bark(); } • プラグイン @Extension class Dog implements Animal { void bark() { print(“ワン!”); } } ©2013 CloudBees, Inc. All Rights Reserved 9
10.
プラグインはコアをガンガン使う Project p =
…; Future<Build> f = p.scheduleBuild(); Build b = f.get(); ©2013 CloudBees, Inc. All Rights Reserved 10
11.
この苦しみから解脱する方法はないかと • お釈迦様の絵 • 徐々に蓄積してきたノウハウ・ツールを大公 開 ©2013
CloudBees, Inc. All Rights Reserved 11
12.
©2013 CloudBees, Inc.
All Rights Reserved mage © http://sfcitizen.com/blog/wp-content/uploads/2011/11/6302790910_c4eb865892_o-copy.jpg 12
13.
フィールドの隠蔽 class Point { int
x,y; } class Point { int getX(); int getY(); void setX(int); void setY(int); } ©2013 CloudBees, Inc. All Rights Reserved 13
14.
インターフェース?抽象クラス? interface Animal { void
bark(); } abstract class Animal { public abstract void bark(); } ©2013 CloudBees, Inc. All Rights Reserved 14
15.
インターフェース?抽象クラス? interface Animal { void
bark(); void bark(int times); } ©2013 CloudBees, Inc. All Rights Reserved 15
16.
インターフェース?抽象クラス? abstract class Animal
{ public abstract void bark(); public void bark(int times) { for (int i=0; i<times; i++) bark(); } } ©2013 CloudBees, Inc. All Rights Reserved 16
17.
ピンポンパターン abstract class Animal
{ @deprecated public void bark() { bark(1); } public void bark(int times) { for (int i=0; i<times; i++) bark(); } } ©2013 CloudBees, Inc. All Rights Reserved 17
18.
コンストラクタの肥大化 • 外部コードによる サブクラス化を許可 したい • GitSCMの例 public
GitSCM( String scmName, List<UserRemoteConfig> userRemoteConfigs, List<BranchSpec> branches, UserMergeOptions userMergeOptions, Boolean doGenerateSubmoduleConfigurations, Collection<SubmoduleConfig> submoduleCfg, boolean clean, boolean wipeOutWorkspace, BuildChooser buildChooser, GitRepositoryBrowser browser, String gitTool, boolean authorOrCommitter, String relativeTargetDir, String reference, String excludedRegions, String excludedUsers, String localBranch, boolean disableSubmodules, boolean recursiveSubmodules, boolean pruneBranches, boolean remotePoll, String gitConfigName, String gitConfigEmail, boolean skipTag, String includedRegions, boolean ignoreNotifyCommit, boolean useShallowClone) { ©2013 CloudBees, Inc. All Rights Reserved 18
19.
我慢してセッター class Foo { void
initXYZ(int x, int y, int z) { … } void initABC(String a, String b, String c) { … } } ©2013 CloudBees, Inc. All Rights Reserved 19
20.
コンフィグパターン class FooConfig { int
x,y,z; String a,b,c; } abstract class Foo { Foo(FooConfig config) { … } } ©2013 CloudBees, Inc. All Rights Reserved 20
21.
©2013 CloudBees, Inc.
All Rights Reserved mage © http://sfcitizen.com/blog/wp-content/uploads/2011/11/6302790910_c4eb865892_o-copy.jpg 21
22.
パッケージ越しにアクセスするた めにpublicなんだけど、 外部からは使わせたくない ©2013 CloudBees, Inc.
All Rights Reserved 22
23.
互換性用に@deprecatedとした コードを次のステップに進めたい ©2013 CloudBees, Inc.
All Rights Reserved 23
24.
だ をつ 修
ア 俺 し く 飾ク俺 て る 子セ ! 道 をス 具 © 小学館 ©2013 CloudBees, Inc. All Rights Reserved 24
25.
http://kohsuke.org/access-modifier/ • 独自のアクセスチェッカを定義する class 俺俺アクセス
extends AccessRestriction { public void instantiated(loc,target,listener) { listener.onError(null,loc, target+“インスタンス生成は禁止”); } } • サブタイプ、読み、書き、呼び出しなど6種 類 ©2013 CloudBees, Inc. All Rights Reserved 25
26.
http://kohsuke.org/access-modifier/ • 通常のアクセス修飾子と共に使う @Restricted(俺俺アクセス.class) public class
Foo { public String value; } • Mavenプラグインがクラスファイルを検査 ©2013 CloudBees, Inc. All Rights Reserved 26
27.
©2013 CloudBees, Inc.
All Rights Reserved 27
28.
バイナリ互換性を活用 interface Animal { void
bark(); } class Dog implements Animal { void bark() { print(“ワン”); } } Animal a = new Dog(); a.bark(); ©2013 CloudBees, Inc. All Rights Reserved 28
29.
バイナリ互換性を活用 interface Animal { void
bark(int n); } 1. new Dog()でInstantiationError class Dog implements Animal{ 2. Dog→Animalのキャストで ClassCastException void bark() { print(“ワン”); } 3. a.bark(3)でAbstractMethodError } 4. その他 Animal a = new Dog(); a.bark(3); ©2013 CloudBees, Inc. All Rights Reserved 29
30.
try { a.bark(3); } catch
(AbstractMethodError e) { // 互換性モード … } ©2013 CloudBees, Inc. All Rights Reserved 30
31.
ジェネリクス class Foo { List<Object>
getChildren() { … } } class Foo { List<String> getChildren() { … } } ©2013 CloudBees, Inc. All Rights Reserved 31
32.
ジェネリクス class Foo<T extends
X> implements Future<T> { T get() { … } } class Foo<T extends Y> implements Future<T> { T get() { … } } class Y extends X { … } ©2013 CloudBees, Inc. All Rights Reserved 32
33.
ジェネリクス型変更のルール • メソッド・フィールドのErasureが変わって いなければOK – T<X,Y,…> → T –
T extends X → X –… • 検査してくれるツールをいつかは書きたい ©2013 CloudBees, Inc. All Rights Reserved 33
34.
根底のルール foo/Foo.class invokevirtual org.example.Bar#method1(java.lang.String,int,int)boolean … org/example/Bar.class メソッド method1 (java.lang.String,int,int):boolean ©2013
CloudBees, Inc. All Rights Reserved 34
35.
参照解決のルール • メソッドへの参照 – クラス名: –
メソッド名: – 戻り値型: – パラメータ型: java.lang.String indexOf int java.lang.String,int • 関連事項 – アクセス修飾子 – 例外 ©2013 CloudBees, Inc. All Rights Reserved 35
36.
コード進化のパターン class Foo { X
get() { … } } class Foo { Y get() { … } } class Y extends X { … } ©2013 CloudBees, Inc. All Rights Reserved 36
37.
コード進化のパターン class Foo { X
get() { … } } class Foo { Y get() { … } X get() { … } } ©2013 CloudBees, Inc. All Rights Reserved 37
38.
Bridge Method Injectorプロジェクト
bit.ly/b-mi class Foo { @WithBridgeMethods(X.class) Y get() { … } } class Foo { Y get() { … } X get() { Y y=get(); return y; } } ©2013 CloudBees, Inc. All Rights Reserved 38
39.
応用 class Foo { @WithBridgeMethods(value=X.class, castRequired=true) Object
get() { … } } class Foo { Object get() { … } X get() { Object o=get(); return (X)o; } } ©2013 CloudBees, Inc. All Rights Reserved 39
40.
自分はルールを守っていても モジュールB ライブラリ 1.0 モジュールA ライブラリ 2.0 ©2013
CloudBees, Inc. All Rights Reserved 40
41.
シェーディング / パッケージ・リネーミング package
org.jenkinsci.foo; import org.acme.A; import org.acme.B; class Foo { private List<A> a = …; void bar() { new B().b(); } } ©2013 CloudBees, Inc. All Rights Reserved 41
42.
シェーディング / パッケージ・リネーミング package
org.jenkinsci.foo; import hidden.org.acme.A; import hidden.org.acme.B; class Foo { private List<A> a = …; void bar() { new B().b(); } } ©2013 CloudBees, Inc. All Rights Reserved 42
43.
シェーディング / パッケージ・リネーミング •
事後に – maven-shade-plugin • 事前に – 予めリネームしたやつをjarにパッケージしてお く ©2013 CloudBees, Inc. All Rights Reserved 43
44.
うまくいかない場合もある • 文字列操作でパッケージ名をいじっている • META-INF/… •
モジュールの公開APIから参照されている ©2013 CloudBees, Inc. All Rights Reserved 44
45.
©2013 CloudBees, Inc.
All Rights Reserved mage © http://sfcitizen.com/blog/wp-content/uploads/2011/11/6302790910_c4eb865892_o-copy.jpg 45
46.
ありがちなパターン class Foo { static
final Foo INSTANCE = new Foo(); … } class Bar { void bar() { doSomethingWith(Foo.INSTANCE); } } ©2013 CloudBees, Inc. All Rights Reserved 46
47.
逆立ちしたって無理! class Foo { static
Foo getInstance() { … } } class Bar { void bar() { doSomethingWith(Foo.INSTANCE); } } ©2013 CloudBees, Inc. All Rights Reserved 47
48.
©2013 CloudBees, Inc.
All Rights Reserved 48
49.
書き換え方 class Foo { @AdaptField(name=“INSTANCE”) static
Foo getInstance() { … } } Barのロード時に 書き換え class Bar { void bar() { doSomethingWith(Foo.INSTANCE); } } ©2013 CloudBees, Inc. All Rights Reserved 49
50.
Bytecode Compatibility Transformer
bit.ly/b-c-t class Foo { @AdaptField(name=“INSTANCE”) static Foo getInstance() { … } } foo.jar Foo.class 変換 定義 ©2013 CloudBees, Inc. All Rights Reserved 50
51.
Bytecode Compatibility Transformer
bit.ly/b-c-t • 実行時 – 変換定義 → byte[] transform(byte[] classFile) 独自class loader foo.jar bar.jar 変換 定義 ©2013 CloudBees, Inc. All Rights Reserved 51
52.
思わぬ落とし穴が! ©2013 CloudBees, Inc.
All Rights Reserved 52
53.
思わぬ落とし穴 class Foo { static
Foo INSTANCE; } class Bar extends Foo { void m() { System.out.println(INSTANCE); } Bar#INSTANCE } ©2013 CloudBees, Inc. All Rights Reserved 53
54.
プログラム変換の利点 • 思い切った書き換え • 予期しない変更に対応 ©2013
CloudBees, Inc. All Rights Reserved 54
55.
プログラム変換の欠点 • 独自のクラスローダが必要 ©2013 CloudBees,
Inc. All Rights Reserved 55
56.
http://commons.wikimedia.org/wiki/File:Light_Bulb.jpg ©2013 CloudBees, Inc.
All Rights Reserved 56
57.
一分で学ぶInvokedynamic • Java7の新しい機能 • 実行時リンク •
静的リンクと同じ速度 void foo() { +リンカの為の追 int x = 5; 加情報 String y = “hello”; Object o = intとstringからObjectを返す何か(x,y) return o; } +リンカの名前 ©2013 CloudBees, Inc. All Rights Reserved 57
58.
http://no-more-tears.kohsuke.org/ class Foo { void
foo() { Project p = new Project(); Future<Build> f = p.scheduleBuild(); Build b = f.get(); … } } ©2013 CloudBees, Inc. All Rights Reserved 58
59.
ビルド時にinvokedynamicに置き換え new Project() class Foo
{ Project.scheduleBuild() void foo() { Project p = [void→Project](this); Future<Build> f = [Project→Future] (p); Build b = [Future → Build](f); … Future.get() } } ©2013 CloudBees, Inc. All Rights Reserved 59
60.
実行時に適宜書き換え class Foo { void
foo() { Project p = Project.create(); Future<Build> f = p.scheduleBuild(0); Build b = f.value; … } } ©2013 CloudBees, Inc. All Rights Reserved 60
61.
まとめ 互換性とコードの進化は両立できる ©2013 CloudBees, Inc.
All Rights Reserved 61
Notas del editor
本当に実行するまでわからない
Jenkinsでも似たような問題に何度も遭遇した
でも進化しないといけない、どうするか。
コードの進化と互換性の狭間の苦しみからどう解脱するか。徐々に蓄積してきたノウハウ・ツールを大公開
コンパイルはできないが動く。ソースコード上の規則とバイナリ上の規則の違い。
プログラムを書き換えればいいじゃんか
Descargar ahora