SlideShare a Scribd company logo
1 of 59
Download to read offline
DroidKaigi 2017 3/9 18:00~
Kameron
🎉🎉🎉
•
• Kotlin
•
•
• 2.3 Eclipse
•
• 

• 

•
•
•
•
• Android
• Android
•
•
• Android Studio
• Build.gradle
•
• OS,
• ProGuard
• Google Play Console
Android Studio
Android Studio (ver2.3)
• Jetbrains IDE
• Eclipse
• ADT 



Android Studio
IDE 

• Android Studio 

Find Action
• Mac: ⌘ ⇧ A
• Windows: Ctrl Shift A

•
• Keymap


• Android Studio 

Search Everywhere
• Mac: ⇧ ⇧
• Windows:Shift Shift
•


• Save Actions
• Plugin ADB IDEA



public class CalcUtil {

public static int mod(int x, int y) {

if (y == 0) {

throw new
IllegalArgumentException("y != 0");

}

return x % y;

}

}
public class CalcUtilTest {



@Test

public void 余りのテスト() {


Assert.assertThat(3,Is.is(CalcUtil.mod(11, 4)));

}

}
Build.gradle
Build.gradle
•
• AndroidManifest 

Build.gradle
• AndroidManifest: 

• Build.gradle:
•
•
•
Suffix
buildTypes {

release {}

debug {

applicationIdSuffix ".debug"

}

}

productFlavors {

demo {

applicationIdSuffix ".demo"

}

full {

applicationIdSuffix ".full"

}

}
• 

• BuildConfig
buildTypes {

release {

buildConfigField "String", "ENDPOINT", ""https://hoge.com" "

}

debug {

applicationIdSuffix ".debug"

buildConfigField "String", "ENDPOINT", ""https://localhost" "

}

}



productFlavors {

demo {

buildConfigField "boolean", "DEMO", "true"

applicationIdSuffix ".demo"

}

full {

buildConfigField "boolean", "DEMO", "false"

applicationIdSuffix ".full"

}

}
buildTypes {

release {

buildConfigField "String", "ENDPOINT", ""https://hoge.com" "

}

debug {

applicationIdSuffix ".debug"

buildConfigField "String", "ENDPOINT", ""https://localhost" "

}

}



productFlavors {

demo {

buildConfigField "boolean", "DEMO", "true"

applicationIdSuffix ".demo"

}

full {

buildConfigField "boolean", "DEMO", "false"

applicationIdSuffix ".full"

}

}
• 



• src/demoDebug/
• src/debug/
• src/demo/
• src/main/
•
• app/src/main/res/values/strings.xml 

app/src/debug/res/values/strings.xml 

•
<string name=“app_name">Debug</string>
• :
•
•
•
• : ON/OFF
• / : ON/OFF
def major = 1

def minor = 0

def patch = 0

def build = 0



android {

defaultConfig {

versionCode major * 10000 + minor * 1000 + patch
* 100 + build

versionName "${major}.${minor}.${patch}"

}

}


• build.gradle
• Private Repository
• CI
•
• git
signingConfigs {

release {

storeFile file(“./filepath”)

keyAlias “test”

storePassword “test”

keyPassword “test”

}

}
• keystore.properties
storePassword=myStorePassword

keyPassword=mykeyPassword

keyAlias=myKeyAlias

storeFile=myStoreFileLocation
• build.gradle
signingConfigs {

debug {

def keystorePropertiesFile =
rootProject.file("keystore.properties")

def keystoreProperties = new Properties()

keystoreProperties.load(new
FileInputStream(keystorePropertiesFile))


keyAlias keystoreProperties['keyAlias']

keyPassword keystoreProperties['keyPassword']

storeFile file(keystoreProperties['storeFile'])

storePassword keystoreProperties['storePassword']

}

}
•
•
Log
• JakeWharton/timber
• Debug
• 

if (BuildConfig.DEBUG) {

Timber.plant(Timber.DebugTree())

}

Timber.d(“test”,”test”)
• facebook/stetho Chome
•
• mitmproxy
•
• python endpoint
• square/leakcanary
• Application 

Log Unit Test
• Log ClassLoader Log 

app/src/test/java/android/util/Log.java
public class Log {

public static int v(String tag, String msg) { return 0; }

public static int v(String tag, String msg, Throwable tr) { return 0; }

public static int d(String tag, String msg) { return 0; }

public static int d(String tag, String msg, Throwable tr) { return 0; }

public static int i(String tag, String msg) { return 0; }

public static int i(String tag, String msg, Throwable tr) { return 0; }

public static int w(String tag, String msg) { return 0; }

public static int w(String tag, String msg, Throwable tr) { return 0; }

public static int w(String tag, Throwable tr) { return 0; }

public static int e(String tag, String msg) { return 0; }

public static int e(String tag, String msg, Throwable tr) { return 0; }

}
ProGurad
ProGuard
•
•
•
public class MainActivity extends c {

private TextView m;

public MainActivity() {}

protected void onCreate(Bundle var1) {

super.onCreate(var1);

this.setContentView(2130968603);

this.m = (TextView)this.findViewById(2131427415);

this.m.setText("hello world");

}

}
64k
• 64k
• ProGuard
• Multidex
64k
ProGuard
• ProGuard
•
• a,b
• 

• Keep
ProGuard
• ProGuard
•
•
buildTypes {

debug {

minifyEnabled true

useProguard false

proguardFiles getDefaultProguardFile('proguard-
android.txt'),

'proguard-rules.pro'

}

}
• mapping.txt 

Google Play Console
OS,
OS,
•
•
•
•
• Support Library
• Android 6.0
•
• 

hotchemi/PermissionsDispatcher
Google Play Console
Google Play Console
• Google Play Google
• Android 

• Amazon Store au
• Google Play Console Play
Android
•
•
•
•
•
•
•
•
•
• 

• Google Play Console
• Beta
10
• Android Studio…
• Build.gradle
•
• Google Play Console
•
• ProGuard
•
•
• DroidKaigi/conference-app-2017
• JakeWharton/u2020
• Android Developers
少し幸せになる技術

More Related Content

What's hot

Using React with Grails 3
Using React with Grails 3Using React with Grails 3
Using React with Grails 3
Zachary Klein
 

What's hot (20)

Microservices for the Masses with Spring Boot, JHipster, and JWT - Rich Web 2016
Microservices for the Masses with Spring Boot, JHipster, and JWT - Rich Web 2016Microservices for the Masses with Spring Boot, JHipster, and JWT - Rich Web 2016
Microservices for the Masses with Spring Boot, JHipster, and JWT - Rich Web 2016
 
Atomic Designは「マルチ」で真価を発揮する
Atomic Designは「マルチ」で真価を発揮するAtomic Designは「マルチ」で真価を発揮する
Atomic Designは「マルチ」で真価を発揮する
 
Challenges in writing roboelectric tests
Challenges in writing roboelectric tests Challenges in writing roboelectric tests
Challenges in writing roboelectric tests
 
Deploying JHipster Microservices
Deploying JHipster MicroservicesDeploying JHipster Microservices
Deploying JHipster Microservices
 
Vaadin 8 によるオール java web アプリ開発の仕組みと実践
Vaadin 8 によるオール java web アプリ開発の仕組みと実践Vaadin 8 によるオール java web アプリ開発の仕組みと実践
Vaadin 8 によるオール java web アプリ開発の仕組みと実践
 
Workshop React.js
Workshop React.jsWorkshop React.js
Workshop React.js
 
Rockstar Android Testing (Mobile TechCon Munich 2014)
Rockstar Android Testing (Mobile TechCon Munich 2014)Rockstar Android Testing (Mobile TechCon Munich 2014)
Rockstar Android Testing (Mobile TechCon Munich 2014)
 
Using ReactJS in AngularJS
Using ReactJS in AngularJSUsing ReactJS in AngularJS
Using ReactJS in AngularJS
 
Angular 2 Migration - JHipster Meetup 6
Angular 2 Migration - JHipster Meetup 6Angular 2 Migration - JHipster Meetup 6
Angular 2 Migration - JHipster Meetup 6
 
Using React with Grails 3
Using React with Grails 3Using React with Grails 3
Using React with Grails 3
 
A tour of React Native
A tour of React NativeA tour of React Native
A tour of React Native
 
Alexey Buzdin "Maslow's Pyramid of Android Testing"
Alexey Buzdin "Maslow's Pyramid of Android Testing"Alexey Buzdin "Maslow's Pyramid of Android Testing"
Alexey Buzdin "Maslow's Pyramid of Android Testing"
 
React vs Angular: ups & downs (speaker Oleksandr Kovalov, Binary Studio)
React vs Angular: ups & downs (speaker Oleksandr Kovalov, Binary Studio)React vs Angular: ups & downs (speaker Oleksandr Kovalov, Binary Studio)
React vs Angular: ups & downs (speaker Oleksandr Kovalov, Binary Studio)
 
Bootiful Development with Spring Boot and Angular - Spring I/O 2017
Bootiful Development with Spring Boot and Angular - Spring I/O 2017Bootiful Development with Spring Boot and Angular - Spring I/O 2017
Bootiful Development with Spring Boot and Angular - Spring I/O 2017
 
Introduction to ReactJS
Introduction to ReactJSIntroduction to ReactJS
Introduction to ReactJS
 
React Native +Redux + ES6 (Updated)
React Native +Redux + ES6 (Updated)React Native +Redux + ES6 (Updated)
React Native +Redux + ES6 (Updated)
 
JavaScript, React Native and Performance at react-europe 2016
JavaScript, React Native and Performance at react-europe 2016JavaScript, React Native and Performance at react-europe 2016
JavaScript, React Native and Performance at react-europe 2016
 
Using JHipster for generating Angular/Spring Boot apps
Using JHipster for generating Angular/Spring Boot appsUsing JHipster for generating Angular/Spring Boot apps
Using JHipster for generating Angular/Spring Boot apps
 
The Road to Native Web Components
The Road to Native Web ComponentsThe Road to Native Web Components
The Road to Native Web Components
 
Deep dive into Android async operations
Deep dive into Android async operationsDeep dive into Android async operations
Deep dive into Android async operations
 

Viewers also liked

Magazine cover 2 editing
Magazine cover 2 editingMagazine cover 2 editing
Magazine cover 2 editing
bc05093848
 
TITUS 1- CALLED INTO HIS SERVICE - PS ALVIN GUTIERREZ - 4PM AFTERNOON SERVICE
TITUS 1- CALLED INTO HIS SERVICE - PS ALVIN GUTIERREZ - 4PM AFTERNOON SERVICETITUS 1- CALLED INTO HIS SERVICE - PS ALVIN GUTIERREZ - 4PM AFTERNOON SERVICE
TITUS 1- CALLED INTO HIS SERVICE - PS ALVIN GUTIERREZ - 4PM AFTERNOON SERVICE
Faithworks Christian Church
 

Viewers also liked (20)

Android lint-srp-practice
Android lint-srp-practiceAndroid lint-srp-practice
Android lint-srp-practice
 
Make your programs Free
Make your programs FreeMake your programs Free
Make your programs Free
 
Reducing Boilerplate and Combining Effects: A Monad Transformer Example
Reducing Boilerplate and Combining Effects: A Monad Transformer ExampleReducing Boilerplate and Combining Effects: A Monad Transformer Example
Reducing Boilerplate and Combining Effects: A Monad Transformer Example
 
7 key recipes for data engineering
7 key recipes for data engineering7 key recipes for data engineering
7 key recipes for data engineering
 
全てSになる -RxJavaとLWSを持ち込む楽しさ-
全てSになる -RxJavaとLWSを持ち込む楽しさ-全てSになる -RxJavaとLWSを持ち込む楽しさ-
全てSになる -RxJavaとLWSを持ち込む楽しさ-
 
Preparing for distributed system failures using akka #ScalaMatsuri
Preparing for distributed system failures using akka #ScalaMatsuriPreparing for distributed system failures using akka #ScalaMatsuri
Preparing for distributed system failures using akka #ScalaMatsuri
 
minneにおけるテスト〜リリース〜リリース後にやっている事の紹介
minneにおけるテスト〜リリース〜リリース後にやっている事の紹介minneにおけるテスト〜リリース〜リリース後にやっている事の紹介
minneにおけるテスト〜リリース〜リリース後にやっている事の紹介
 
What is tested by pre-launch (security) reports?
What is tested by pre-launch (security) reports?What is tested by pre-launch (security) reports?
What is tested by pre-launch (security) reports?
 
「ハイレベルメンバーを共創させたら何が起きるか?実験」結果報告会 スライド
「ハイレベルメンバーを共創させたら何が起きるか?実験」結果報告会 スライド「ハイレベルメンバーを共創させたら何が起きるか?実験」結果報告会 スライド
「ハイレベルメンバーを共創させたら何が起きるか?実験」結果報告会 スライド
 
Androidアプリのストレージ戦略
Androidアプリのストレージ戦略Androidアプリのストレージ戦略
Androidアプリのストレージ戦略
 
Magazine cover 2 editing
Magazine cover 2 editingMagazine cover 2 editing
Magazine cover 2 editing
 
TITUS 1- CALLED INTO HIS SERVICE - PS ALVIN GUTIERREZ - 4PM AFTERNOON SERVICE
TITUS 1- CALLED INTO HIS SERVICE - PS ALVIN GUTIERREZ - 4PM AFTERNOON SERVICETITUS 1- CALLED INTO HIS SERVICE - PS ALVIN GUTIERREZ - 4PM AFTERNOON SERVICE
TITUS 1- CALLED INTO HIS SERVICE - PS ALVIN GUTIERREZ - 4PM AFTERNOON SERVICE
 
Risco
RiscoRisco
Risco
 
アクセシビリティはじめました
アクセシビリティはじめましたアクセシビリティはじめました
アクセシビリティはじめました
 
BCU30 - Webでできるマルチメディア表現
BCU30 - Webでできるマルチメディア表現BCU30 - Webでできるマルチメディア表現
BCU30 - Webでできるマルチメディア表現
 
テストエンジニアと組織構造 @Cybozu
テストエンジニアと組織構造 @Cybozuテストエンジニアと組織構造 @Cybozu
テストエンジニアと組織構造 @Cybozu
 
実践アニメーション
実践アニメーション実践アニメーション
実践アニメーション
 
H2O x mrubyで人はどれだけ幸せになれるのか
H2O x mrubyで人はどれだけ幸せになれるのかH2O x mrubyで人はどれだけ幸せになれるのか
H2O x mrubyで人はどれだけ幸せになれるのか
 
Planificación 2° unidad 1 2016 hasta marzo
Planificación 2° unidad 1 2016 hasta marzoPlanificación 2° unidad 1 2016 hasta marzo
Planificación 2° unidad 1 2016 hasta marzo
 
Picón, mi pueblo
Picón, mi puebloPicón, mi pueblo
Picón, mi pueblo
 

Similar to 少し幸せになる技術

Unit & Automation Testing in Android - Stanislav Gatsev, Melon
Unit & Automation Testing in Android - Stanislav Gatsev, MelonUnit & Automation Testing in Android - Stanislav Gatsev, Melon
Unit & Automation Testing in Android - Stanislav Gatsev, Melon
beITconference
 
Java Unit Test and Coverage Introduction
Java Unit Test and Coverage IntroductionJava Unit Test and Coverage Introduction
Java Unit Test and Coverage Introduction
Alex Su
 

Similar to 少し幸せになる技術 (20)

Guide to the jungle of testing frameworks
Guide to the jungle of testing frameworksGuide to the jungle of testing frameworks
Guide to the jungle of testing frameworks
 
Android testing
Android testingAndroid testing
Android testing
 
Robotium Tutorial
Robotium TutorialRobotium Tutorial
Robotium Tutorial
 
멀티플랫폼 앱 개발과 테스팅
멀티플랫폼 앱 개발과 테스팅멀티플랫폼 앱 개발과 테스팅
멀티플랫폼 앱 개발과 테스팅
 
Unit testing without Robolectric, Droidcon Berlin 2016
Unit testing without Robolectric, Droidcon Berlin 2016Unit testing without Robolectric, Droidcon Berlin 2016
Unit testing without Robolectric, Droidcon Berlin 2016
 
Unit & Automation Testing in Android - Stanislav Gatsev, Melon
Unit & Automation Testing in Android - Stanislav Gatsev, MelonUnit & Automation Testing in Android - Stanislav Gatsev, Melon
Unit & Automation Testing in Android - Stanislav Gatsev, Melon
 
Guide to the jungle of testing frameworks
Guide to the jungle of testing frameworksGuide to the jungle of testing frameworks
Guide to the jungle of testing frameworks
 
Testing basics for developers
Testing basics for developersTesting basics for developers
Testing basics for developers
 
Tdd
TddTdd
Tdd
 
Java Unit Test and Coverage Introduction
Java Unit Test and Coverage IntroductionJava Unit Test and Coverage Introduction
Java Unit Test and Coverage Introduction
 
Make it test-driven with CDI!
Make it test-driven with CDI!Make it test-driven with CDI!
Make it test-driven with CDI!
 
Infinum Android Talks #15 - Garfield Android Studio Plugin - Be Smart, Be Lazy
Infinum Android Talks #15 - Garfield Android Studio Plugin - Be Smart, Be LazyInfinum Android Talks #15 - Garfield Android Studio Plugin - Be Smart, Be Lazy
Infinum Android Talks #15 - Garfield Android Studio Plugin - Be Smart, Be Lazy
 
Mockist vs. Classicists TDD
Mockist vs. Classicists TDDMockist vs. Classicists TDD
Mockist vs. Classicists TDD
 
Atlassian Groovy Plugins
Atlassian Groovy PluginsAtlassian Groovy Plugins
Atlassian Groovy Plugins
 
Having Fun with Kotlin Android - DILo Surabaya
Having Fun with Kotlin Android - DILo SurabayaHaving Fun with Kotlin Android - DILo Surabaya
Having Fun with Kotlin Android - DILo Surabaya
 
Kotlin - The Swiss army knife of programming languages - Visma Mobile Meet-up...
Kotlin - The Swiss army knife of programming languages - Visma Mobile Meet-up...Kotlin - The Swiss army knife of programming languages - Visma Mobile Meet-up...
Kotlin - The Swiss army knife of programming languages - Visma Mobile Meet-up...
 
Eric Lafortune - The Jack and Jill build system
Eric Lafortune - The Jack and Jill build systemEric Lafortune - The Jack and Jill build system
Eric Lafortune - The Jack and Jill build system
 
BarcelonaJUG2016: walkmod: how to run and design code transformations
BarcelonaJUG2016: walkmod: how to run and design code transformationsBarcelonaJUG2016: walkmod: how to run and design code transformations
BarcelonaJUG2016: walkmod: how to run and design code transformations
 
Crash wars - The handling awakens
Crash wars - The handling awakensCrash wars - The handling awakens
Crash wars - The handling awakens
 
Слава Бобик «NancyFx для самых маленьких»
Слава Бобик «NancyFx для самых маленьких»Слава Бобик «NancyFx для самых маленьких»
Слава Бобик «NancyFx для самых маленьких»
 

Recently uploaded

Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
panagenda
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
?#DUbAI#??##{{(☎️+971_581248768%)**%*]'#abortion pills for sale in dubai@
 

Recently uploaded (20)

The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
 
Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of Terraform
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 
Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : Uncertainty
 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
 
Deploy with confidence: VMware Cloud Foundation 5.1 on next gen Dell PowerEdg...
Deploy with confidence: VMware Cloud Foundation 5.1 on next gen Dell PowerEdg...Deploy with confidence: VMware Cloud Foundation 5.1 on next gen Dell PowerEdg...
Deploy with confidence: VMware Cloud Foundation 5.1 on next gen Dell PowerEdg...
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a Fresher
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
 

少し幸せになる技術