SlideShare a Scribd company logo
Photo by Steven Libralon on Unsplash
—
(Shengyou Fan)
PHPCon China 2018
2018/05/19
—
•
• Laravel
• JetBrains
•
• PHP / Laravel
shengyoufan@gmail.com
Laravel
—
2014
Laravel
30
https://www.laravel-dojo.com/
Laravel
—
2013 6900
3
PHP Day Laradiner
Laradebut
LaravelConf Taiwan
—
2017 7/8 ( )
450
—
•
•
•
•
•
Photo by Austris Augusts on Unsplash
—
• Boilerplate
• Scaffolding
• Code snippet
Photo by Markus Spiske on Unsplash
—
{ }
$ composer create-project 
{vendor/package}
—
•
•
•
$ cp .env.example .env
$ artisan key:generate
$ artisan package:discover
$ composer require {vendor/package}
—
#
# ~/.composer/config.json
{
"repositories": [
{
"type": "...",
"url": "..."
}
]
}
#
$ composer create-project {vendor/package}
Composer
•
•
Composer
—
#
# ./composer.json
{
"scripts": {
"post-root-package-install": [
"..."
],
"post-create-project-cmd": [
"..."
],
"post-autoload-dump": [
"..."
]
}
}
#
$ composer run-script {event}
• Command Events
• Installer Events
• Package Events
• Plugin Events
https://getcomposer.org/doc/articles/scripts.md
—
• tag Push
•
• Composer
• Script Events
—
• Laravel laravel/laravel
• Symfony symfony/website-skeleton
• Zend zendframework/skeleton-application
• Yii yiisoft/yii2-app-basic
HTTP index.php
public/
vendor/
PHP
app/
bootstrap/
config/
database/
resources/
storage/
tests/
routes/
Laravel
PHP League skeleton
—
http://thephpleague.com		
https://github.com/thephpleague/skeleton	
PHP League
PHP Package
development standard
—
http://php-pds.com/		
https://github.com/php-pds	
PHP Package development
standard Package
—
Laravel artisan
—
CRUD
• https://laravelvoyager.com/
• https://www.getcraftable.com/
• https://backpackforlaravel.com/
—
https://github.com/jonathantorres/construct
—
Editor/IDE
(Code Snippet)
—
Editor/IDE
—
•
•
Photo by rawpixel on Unsplash
—
if () {
// ...
} elseif () {
//...
} else {
//...
}
if()
{
//...
}
else if()
{
//...
}
else
{
//...
}
PHP-FIG
—
PHP-FIG PHP Standards
Recommendations PSR-1
PSR-2
https://www.php-fig.org
PSR-1
—
PSR-1: Basic Coding Standard
PSR-1
‣ <?php <?=
‣ PHP BOM UTF-8
‣ symbols ( … )
side-effects ( .ini … )
‣ (Namespaces) PSR-4
‣ (StudlyCaps)
‣
‣ (camelCase)
https://www.php-fig.org/psr/psr-1/
—
(camelCase)
# Foo.php
<?php
namespace VendorModel;
class Foo
{
public function fooBar()
{
// method body
}
}
PSR-2
—
‣ PSR-1
‣ 4 tabs
‣ 120
80
‣ namespace use
‣
‣
‣ (Visibility) abstract
final static
‣
‣
‣
PSR-2: Coding Style Guide
PSR-2
https://www.php-fig.org/psr/psr-2/
PSR-2
—
else elseif
elseif else if
<?php
#
if ($expr1) {
// if body
} elseif ($expr2) {
// elseif body
} else {
// else body;
}
#
for ($i = 0; $i < 10; $i++) {
// for body
}
foreach ($iterable as $key => $value) {
// foreach body
}
for foreach
PSR-12
—
PSR-12: Extended Coding Style Guide
PSR-12 )
PHP 7
EditorConfig
—
Editor/IDE
.editorconfig
—
• ini
• UTF-8 LF
• [ ]
( .gitignore)
• (/)
• # ;
# This file is for unifying the coding style for
different editors and IDEs
# editorconfig.org
root = true
[*.php]
charset = utf-8
indent_size = 4
indent_style = space
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true
CodeSniffer
—
Code Sniffer
—
PHP
# phpcbf
$ wget https://.../phpcbf.phar
$ chmod a+x phpcbf.phar
# phpcbf
$ [php] bin/phpcbf.phar --standard=PSR2 
--runtime-set ignore_errors_on_exit 1 
--runtime-set ignore_warnings_on_exit 1 
{src}
# php-cs-fixer
$ wget http://.../php-cs-fixer-v2.phar
$ chmod a+x php-cs-fixer-v2.phar
# php-cs-fixer
$ [php] php-cs-fixer.phar fix {src} 
--rules=@PSR2
—
phpcbf php-cs-fixer
Editor/IDE
Editor/IDE
—
Editor/IDE
—
…
• Code Quality
• Code Analysis
Photo by rawpixel on Unsplash
—
PHP Linter Editor/
IDE
https://github.com/JakubOnderka/PHP-Parallel-Lint
Mess Detector
—
https://phpmd.org/
Copy/Paste Detector
—
( )
https://github.com/sebastianbergmann/phpcpd
PHPStan
—
https://github.com/phpstan/phpstan
phpqa
—
https://github.com/EdgedesignCZ/phpqa
Code Inspection
—
Code Inspection
PHP Quality Assurance
—
PHP Quality
Assurance
https://phpqa.io/
Awesome PHP
—
Code
Quality Static Analysis
PHP
https://github.com/ziadoz/awesome-php
—
• Unit Test
• Feature Test
• Browser Test
• API spec and testing
Photo by Jaron Nix on Unsplash
Unit Test
—
Class method
# Class
class Linker
{
public function autolink($text)
{
// ...
return ...
}
}
Unit Test
—
Class method
# Class
class LinkerTest extends TestCase
{
public function testAutolink()
{
// arrange
$text = '...';
$target = new Linker();
$expected = '...';
// act
$actual = $target->autolink($text);
// assert
$this->assertEquals($expected, $actual);
}
}
Unit Test
—
Unit Test
—
Laravel PHPUnit
VSCode PHPUnit
Recca Tsai
https://marketplace.visualstudio.com/
items?itemName=recca0120.vscode-
phpunit
Feature Test
—
# Class
class PostController extends Controller
{
public function store(Request $request)
{
Post::create($request->all());
return redirect()->route('...')
->with('message', 'Success');
}
}
Feature Test
—
# Class
class PostControllerTest extends TestCase
{
use RefreshDatabase;
use WithoutMiddleware;
public function testPostStoreAction()
{
$data = [
'title' => '...',
'content' => '...',
];
$response = $this->post('...', $data);
$response->assertRedirect('...');
$this->assertDatabaseHas('...', $data);
}
}
Feature Test
—
Feature Test
Browser Test
—
# dusk
$ composer require --dev laravel/dusk
#
$ artisan dusk:install
# Browser Tests
$ artisan dusk:make {test}
headless
Browser Test
—
#
public function testSuccessSubmitForm()
{
$this->browse(function (Browser $browser) {
$browser->visit('...')
->assertSee('...')
->type('...', '...')
->pause(1000)
->press('...')
->assertPathIs('...')
->screenshot('...');
});
}
Browser Test
—
API Spec and Testing
—
API Spec
Postman NewmanAPI Spec
(Ex. Swagger)
Dredd API Server
Request
Response
API Spec
(Ex. Swagger)
—
https://codeception.com		
https://codecept.io
—
http://www.phpspec.net/en/stable/	
	http://behat.org/en/latest/
—
• Pre-commit hooks
• Continuous integration
Photo by Jehyun Sung on Unsplash
Pre-commit hooks
—
VCS
https://git-scm.com/docs/githooks	
https://www.atlassian.com/git/tutorials/git-hooks	
$ vim .git/hooks/{script}
grumphp
—
grumphp PHP
pre-commit
# grumphp
composer require --dev phpro/grumphp
# grumphp
# grumphp.yml
parameters:
git_dir: .
bin_dir: vendor/bin
tasks:
phpcs: ~
phpcsfixer2: ~
phpcpd: ~
phpmd: ~
phan: ~
phpunit: ~
https://github.com/phpro/grumphp
grumphp
—
grumphp git pre-
commit phpcs phpunit…
Editor/IDE
—
Editor/IDE VCS
pre-commit hooks
Continuous integration
—
CI
• / /
• /
• /
CI
• CI
• CI
• CI
Image from: http://www.seleniumeasy.com/jenkins-tutorials/what-is-continous-integration
CI
—
StyleCI Nitpick CI CI
CI phpdbf php-
cs-fixer
https://styleci.io/	
https://nitpick-ci.com/
CI
—
SonarQube CI
CI CodeSniffer
Copy/Paste Detector Mess Detector
CI
—
CI
—
—
沒有銀彈
—
最小施力點
—
建立團隊共識
—
https://www.youtube.com/user/shengyou/	
https://www.slideshare.net/shengyou/	
https://medium.com/@shengyou/
Ad

Recommended

[PHP 也有 Day] 垃圾留言守城記 - 用 Laravel 阻擋 SPAM 留言的奮鬥史
[PHP 也有 Day] 垃圾留言守城記 - 用 Laravel 阻擋 SPAM 留言的奮鬥史
Shengyou Fan
 
以 Laravel 經驗開發 Hyperf 應用
以 Laravel 經驗開發 Hyperf 應用
Shengyou Fan
 
Running node.js as a service behind nginx/varnish
Running node.js as a service behind nginx/varnish
thiagoalessio
 
2018 RubyHACK: put git to work - increase the quality of your rails project...
2018 RubyHACK: put git to work - increase the quality of your rails project...
Rodrigo Urubatan
 
2018 the conf put git to work - increase the quality of your rails project...
2018 the conf put git to work - increase the quality of your rails project...
Rodrigo Urubatan
 
Write php deploy everywhere
Write php deploy everywhere
Michelangelo van Dam
 
Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp
Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp
Matthew Davis
 
Converting Your Dev Environment to a Docker Stack - php[world]
Converting Your Dev Environment to a Docker Stack - php[world]
Dana Luther
 
Toolbox of a Ruby Team
Toolbox of a Ruby Team
Arto Artnik
 
Converting Your Dev Environment to a Docker Stack - Cascadia
Converting Your Dev Environment to a Docker Stack - Cascadia
Dana Luther
 
Using Ansible as Makefiles to unite your developers
Using Ansible as Makefiles to unite your developers
thiagoalessio
 
Mojolicious lite
Mojolicious lite
andrefsantos
 
Ruby on Rails and Docker - Why should I care?
Ruby on Rails and Docker - Why should I care?
Adam Hodowany
 
What makes me "Grunt"?
What makes me "Grunt"?
Fabien Doiron
 
SDPHP - Percona Toolkit (It's Basically Magic)
SDPHP - Percona Toolkit (It's Basically Magic)
Robert Swisher
 
NLIT 2011: Chef & Capistrano
NLIT 2011: Chef & Capistrano
nickblah
 
Kotlin 1.2: Sharing code between platforms
Kotlin 1.2: Sharing code between platforms
Kirill Rozov
 
Usando o Cloud
Usando o Cloud
Fabio Kung
 
Vagrant plugin development intro
Vagrant plugin development intro
Budh Ram Gurung
 
Nodejs Intro - Part2 Introduction to Web Applications
Nodejs Intro - Part2 Introduction to Web Applications
Budh Ram Gurung
 
Nodejs Intro Part One
Nodejs Intro Part One
Budh Ram Gurung
 
Release with confidence
Release with confidence
John Congdon
 
Capistrano deploy Magento project in an efficient way
Capistrano deploy Magento project in an efficient way
Sylvain Rayé
 
PROCESS WARP「プロセスがデバイス間で移動する」仕組みを作る
PROCESS WARP「プロセスがデバイス間で移動する」仕組みを作る
祐司 伊藤
 
ApacheCon 2014 - What's New in Apache httpd 2.4
ApacheCon 2014 - What's New in Apache httpd 2.4
Jim Jagielski
 
Angular2 ecosystem
Angular2 ecosystem
Kamil Lelonek
 
ChefConf 2012 Spiceweasel
ChefConf 2012 Spiceweasel
Matt Ray
 
Syncing up with Python’s asyncio for (micro) service development, Joir-dan Gumbs
Syncing up with Python’s asyncio for (micro) service development, Joir-dan Gumbs
Pôle Systematic Paris-Region
 
Development Workflow Tools for Open-Source PHP Libraries
Development Workflow Tools for Open-Source PHP Libraries
Pantheon
 
PHP selber bauen
PHP selber bauen
Walter Ebert
 

More Related Content

What's hot (20)

Toolbox of a Ruby Team
Toolbox of a Ruby Team
Arto Artnik
 
Converting Your Dev Environment to a Docker Stack - Cascadia
Converting Your Dev Environment to a Docker Stack - Cascadia
Dana Luther
 
Using Ansible as Makefiles to unite your developers
Using Ansible as Makefiles to unite your developers
thiagoalessio
 
Mojolicious lite
Mojolicious lite
andrefsantos
 
Ruby on Rails and Docker - Why should I care?
Ruby on Rails and Docker - Why should I care?
Adam Hodowany
 
What makes me "Grunt"?
What makes me "Grunt"?
Fabien Doiron
 
SDPHP - Percona Toolkit (It's Basically Magic)
SDPHP - Percona Toolkit (It's Basically Magic)
Robert Swisher
 
NLIT 2011: Chef & Capistrano
NLIT 2011: Chef & Capistrano
nickblah
 
Kotlin 1.2: Sharing code between platforms
Kotlin 1.2: Sharing code between platforms
Kirill Rozov
 
Usando o Cloud
Usando o Cloud
Fabio Kung
 
Vagrant plugin development intro
Vagrant plugin development intro
Budh Ram Gurung
 
Nodejs Intro - Part2 Introduction to Web Applications
Nodejs Intro - Part2 Introduction to Web Applications
Budh Ram Gurung
 
Nodejs Intro Part One
Nodejs Intro Part One
Budh Ram Gurung
 
Release with confidence
Release with confidence
John Congdon
 
Capistrano deploy Magento project in an efficient way
Capistrano deploy Magento project in an efficient way
Sylvain Rayé
 
PROCESS WARP「プロセスがデバイス間で移動する」仕組みを作る
PROCESS WARP「プロセスがデバイス間で移動する」仕組みを作る
祐司 伊藤
 
ApacheCon 2014 - What's New in Apache httpd 2.4
ApacheCon 2014 - What's New in Apache httpd 2.4
Jim Jagielski
 
Angular2 ecosystem
Angular2 ecosystem
Kamil Lelonek
 
ChefConf 2012 Spiceweasel
ChefConf 2012 Spiceweasel
Matt Ray
 
Syncing up with Python’s asyncio for (micro) service development, Joir-dan Gumbs
Syncing up with Python’s asyncio for (micro) service development, Joir-dan Gumbs
Pôle Systematic Paris-Region
 
Toolbox of a Ruby Team
Toolbox of a Ruby Team
Arto Artnik
 
Converting Your Dev Environment to a Docker Stack - Cascadia
Converting Your Dev Environment to a Docker Stack - Cascadia
Dana Luther
 
Using Ansible as Makefiles to unite your developers
Using Ansible as Makefiles to unite your developers
thiagoalessio
 
Ruby on Rails and Docker - Why should I care?
Ruby on Rails and Docker - Why should I care?
Adam Hodowany
 
What makes me "Grunt"?
What makes me "Grunt"?
Fabien Doiron
 
SDPHP - Percona Toolkit (It's Basically Magic)
SDPHP - Percona Toolkit (It's Basically Magic)
Robert Swisher
 
NLIT 2011: Chef & Capistrano
NLIT 2011: Chef & Capistrano
nickblah
 
Kotlin 1.2: Sharing code between platforms
Kotlin 1.2: Sharing code between platforms
Kirill Rozov
 
Usando o Cloud
Usando o Cloud
Fabio Kung
 
Vagrant plugin development intro
Vagrant plugin development intro
Budh Ram Gurung
 
Nodejs Intro - Part2 Introduction to Web Applications
Nodejs Intro - Part2 Introduction to Web Applications
Budh Ram Gurung
 
Release with confidence
Release with confidence
John Congdon
 
Capistrano deploy Magento project in an efficient way
Capistrano deploy Magento project in an efficient way
Sylvain Rayé
 
PROCESS WARP「プロセスがデバイス間で移動する」仕組みを作る
PROCESS WARP「プロセスがデバイス間で移動する」仕組みを作る
祐司 伊藤
 
ApacheCon 2014 - What's New in Apache httpd 2.4
ApacheCon 2014 - What's New in Apache httpd 2.4
Jim Jagielski
 
ChefConf 2012 Spiceweasel
ChefConf 2012 Spiceweasel
Matt Ray
 
Syncing up with Python’s asyncio for (micro) service development, Joir-dan Gumbs
Syncing up with Python’s asyncio for (micro) service development, Joir-dan Gumbs
Pôle Systematic Paris-Region
 

Similar to PHPCon China 2018 - 好孩子的 PHP 撰碼指南 (20)

Development Workflow Tools for Open-Source PHP Libraries
Development Workflow Tools for Open-Source PHP Libraries
Pantheon
 
PHP selber bauen
PHP selber bauen
Walter Ebert
 
Starting Out With PHP
Starting Out With PHP
Mark Niebergall
 
Laravel level 0 (introduction)
Laravel level 0 (introduction)
Kriangkrai Chaonithi
 
Living With Legacy Code
Living With Legacy Code
Rowan Merewood
 
Dependency management with Composer
Dependency management with Composer
Jason Grimes
 
Composer for Busy Developers - php|tek13
Composer for Busy Developers - php|tek13
Rafael Dohms
 
Debugging: Rules And Tools - PHPTek 11 Version
Debugging: Rules And Tools - PHPTek 11 Version
Ian Barber
 
An Introduction to the Laravel Framework (AFUP Forum PHP 2014)
An Introduction to the Laravel Framework (AFUP Forum PHP 2014)
daylerees
 
composer_talk_20160209
composer_talk_20160209
Bradley Wogsland
 
PHP Development Tools
PHP Development Tools
Antony Abramchenko
 
Php core. get rid of bugs and contribute
Php core. get rid of bugs and contribute
Pierre Joye
 
Leveraging Composer in Existing Projects
Leveraging Composer in Existing Projects
Mark Niebergall
 
Composer Helpdesk
Composer Helpdesk
Sven Rautenberg
 
Shifting gears with Composer
Shifting gears with Composer
Javier López
 
Throwing Laravel into your Legacy App™
Throwing Laravel into your Legacy App™
Joe Ferguson
 
Workshop quality assurance for php projects - phpbelfast
Workshop quality assurance for php projects - phpbelfast
Michelangelo van Dam
 
Let's creating your own PHP (tejimaya version)
Let's creating your own PHP (tejimaya version)
Kousuke Ebihara
 
OSDC.TW - Gutscript for PHP haters
OSDC.TW - Gutscript for PHP haters
Lin Yo-An
 
Debugging: Rules & Tools
Debugging: Rules & Tools
Ian Barber
 
Development Workflow Tools for Open-Source PHP Libraries
Development Workflow Tools for Open-Source PHP Libraries
Pantheon
 
Living With Legacy Code
Living With Legacy Code
Rowan Merewood
 
Dependency management with Composer
Dependency management with Composer
Jason Grimes
 
Composer for Busy Developers - php|tek13
Composer for Busy Developers - php|tek13
Rafael Dohms
 
Debugging: Rules And Tools - PHPTek 11 Version
Debugging: Rules And Tools - PHPTek 11 Version
Ian Barber
 
An Introduction to the Laravel Framework (AFUP Forum PHP 2014)
An Introduction to the Laravel Framework (AFUP Forum PHP 2014)
daylerees
 
Php core. get rid of bugs and contribute
Php core. get rid of bugs and contribute
Pierre Joye
 
Leveraging Composer in Existing Projects
Leveraging Composer in Existing Projects
Mark Niebergall
 
Shifting gears with Composer
Shifting gears with Composer
Javier López
 
Throwing Laravel into your Legacy App™
Throwing Laravel into your Legacy App™
Joe Ferguson
 
Workshop quality assurance for php projects - phpbelfast
Workshop quality assurance for php projects - phpbelfast
Michelangelo van Dam
 
Let's creating your own PHP (tejimaya version)
Let's creating your own PHP (tejimaya version)
Kousuke Ebihara
 
OSDC.TW - Gutscript for PHP haters
OSDC.TW - Gutscript for PHP haters
Lin Yo-An
 
Debugging: Rules & Tools
Debugging: Rules & Tools
Ian Barber
 
Ad

More from Shengyou Fan (20)

[JCConf 2024] Kotlin/Wasm:為 Kotlin 多平台帶來更多可能性
[JCConf 2024] Kotlin/Wasm:為 Kotlin 多平台帶來更多可能性
Shengyou Fan
 
[GDG Kaohsiung DevFest 2023] 以 Compose 及 Kotlin Multiplatform 打造多平台應用程式
[GDG Kaohsiung DevFest 2023] 以 Compose 及 Kotlin Multiplatform 打造多平台應用程式
Shengyou Fan
 
[JCConf 2023] 從 Kotlin Multiplatform 到 Compose Multiplatform:在多平台間輕鬆共用業務邏輯與 U...
[JCConf 2023] 從 Kotlin Multiplatform 到 Compose Multiplatform:在多平台間輕鬆共用業務邏輯與 U...
Shengyou Fan
 
[Kotlin 讀書會第五梯次] 深入淺出 Kotlin 第一章導讀
[Kotlin 讀書會第五梯次] 深入淺出 Kotlin 第一章導讀
Shengyou Fan
 
[WebConf Taiwan 2023] 一份 Zend Engine 外帶!透過 Micro 讓一次打包、多處運行變得可能
[WebConf Taiwan 2023] 一份 Zend Engine 外帶!透過 Micro 讓一次打包、多處運行變得可能
Shengyou Fan
 
How I make a podcast website using serverless technology in 2023
How I make a podcast website using serverless technology in 2023
Shengyou Fan
 
[Effective Kotlin 讀書會] 第八章 Efficient collection processing 導讀
[Effective Kotlin 讀書會] 第八章 Efficient collection processing 導讀
Shengyou Fan
 
[MOPCON 2022] 以 Kotlin Multiplatform 制霸全平台
[MOPCON 2022] 以 Kotlin Multiplatform 制霸全平台
Shengyou Fan
 
[JCConf 2022] Compose for Desktop - 開發桌面軟體的新選擇
[JCConf 2022] Compose for Desktop - 開發桌面軟體的新選擇
Shengyou Fan
 
Using the Exposed SQL Framework to Manage Your Database
Using the Exposed SQL Framework to Manage Your Database
Shengyou Fan
 
[COSCUP 2022] 讓黑畫面再次偉大 - 用 PHP 寫 CLI 工具
[COSCUP 2022] 讓黑畫面再次偉大 - 用 PHP 寫 CLI 工具
Shengyou Fan
 
[COSCUP 2022] Kotlin Collection 遊樂園
[COSCUP 2022] Kotlin Collection 遊樂園
Shengyou Fan
 
初探 Kotlin Multiplatform
初探 Kotlin Multiplatform
Shengyou Fan
 
簡化 JVM 上雲 - 透過 Azure Spring Cloud 提升開發、發佈及服務監控效率
簡化 JVM 上雲 - 透過 Azure Spring Cloud 提升開發、發佈及服務監控效率
Shengyou Fan
 
[PHP 也有 Day #64] PHP 升級指南
[PHP 也有 Day #64] PHP 升級指南
Shengyou Fan
 
以 Kotlin Multiplatform Mobile (KMM) 開發跨平台行動應用
以 Kotlin Multiplatform Mobile (KMM) 開發跨平台行動應用
Shengyou Fan
 
Composer 經典食譜
Composer 經典食譜
Shengyou Fan
 
老派浪漫:用 Kotlin 寫 Command Line 工具
老派浪漫:用 Kotlin 寫 Command Line 工具
Shengyou Fan
 
[Kotlin Serverless 工作坊] 單元 4 - 實作 RSS Aggregator
[Kotlin Serverless 工作坊] 單元 4 - 實作 RSS Aggregator
Shengyou Fan
 
[Kotlin Serverless 工作坊] 單元 3 - 實作 JSON API
[Kotlin Serverless 工作坊] 單元 3 - 實作 JSON API
Shengyou Fan
 
[JCConf 2024] Kotlin/Wasm:為 Kotlin 多平台帶來更多可能性
[JCConf 2024] Kotlin/Wasm:為 Kotlin 多平台帶來更多可能性
Shengyou Fan
 
[GDG Kaohsiung DevFest 2023] 以 Compose 及 Kotlin Multiplatform 打造多平台應用程式
[GDG Kaohsiung DevFest 2023] 以 Compose 及 Kotlin Multiplatform 打造多平台應用程式
Shengyou Fan
 
[JCConf 2023] 從 Kotlin Multiplatform 到 Compose Multiplatform:在多平台間輕鬆共用業務邏輯與 U...
[JCConf 2023] 從 Kotlin Multiplatform 到 Compose Multiplatform:在多平台間輕鬆共用業務邏輯與 U...
Shengyou Fan
 
[Kotlin 讀書會第五梯次] 深入淺出 Kotlin 第一章導讀
[Kotlin 讀書會第五梯次] 深入淺出 Kotlin 第一章導讀
Shengyou Fan
 
[WebConf Taiwan 2023] 一份 Zend Engine 外帶!透過 Micro 讓一次打包、多處運行變得可能
[WebConf Taiwan 2023] 一份 Zend Engine 外帶!透過 Micro 讓一次打包、多處運行變得可能
Shengyou Fan
 
How I make a podcast website using serverless technology in 2023
How I make a podcast website using serverless technology in 2023
Shengyou Fan
 
[Effective Kotlin 讀書會] 第八章 Efficient collection processing 導讀
[Effective Kotlin 讀書會] 第八章 Efficient collection processing 導讀
Shengyou Fan
 
[MOPCON 2022] 以 Kotlin Multiplatform 制霸全平台
[MOPCON 2022] 以 Kotlin Multiplatform 制霸全平台
Shengyou Fan
 
[JCConf 2022] Compose for Desktop - 開發桌面軟體的新選擇
[JCConf 2022] Compose for Desktop - 開發桌面軟體的新選擇
Shengyou Fan
 
Using the Exposed SQL Framework to Manage Your Database
Using the Exposed SQL Framework to Manage Your Database
Shengyou Fan
 
[COSCUP 2022] 讓黑畫面再次偉大 - 用 PHP 寫 CLI 工具
[COSCUP 2022] 讓黑畫面再次偉大 - 用 PHP 寫 CLI 工具
Shengyou Fan
 
[COSCUP 2022] Kotlin Collection 遊樂園
[COSCUP 2022] Kotlin Collection 遊樂園
Shengyou Fan
 
初探 Kotlin Multiplatform
初探 Kotlin Multiplatform
Shengyou Fan
 
簡化 JVM 上雲 - 透過 Azure Spring Cloud 提升開發、發佈及服務監控效率
簡化 JVM 上雲 - 透過 Azure Spring Cloud 提升開發、發佈及服務監控效率
Shengyou Fan
 
[PHP 也有 Day #64] PHP 升級指南
[PHP 也有 Day #64] PHP 升級指南
Shengyou Fan
 
以 Kotlin Multiplatform Mobile (KMM) 開發跨平台行動應用
以 Kotlin Multiplatform Mobile (KMM) 開發跨平台行動應用
Shengyou Fan
 
Composer 經典食譜
Composer 經典食譜
Shengyou Fan
 
老派浪漫:用 Kotlin 寫 Command Line 工具
老派浪漫:用 Kotlin 寫 Command Line 工具
Shengyou Fan
 
[Kotlin Serverless 工作坊] 單元 4 - 實作 RSS Aggregator
[Kotlin Serverless 工作坊] 單元 4 - 實作 RSS Aggregator
Shengyou Fan
 
[Kotlin Serverless 工作坊] 單元 3 - 實作 JSON API
[Kotlin Serverless 工作坊] 單元 3 - 實作 JSON API
Shengyou Fan
 
Ad

Recently uploaded (20)

Python Conference Singapore - 19 Jun 2025
Python Conference Singapore - 19 Jun 2025
ninefyi
 
Cyber Defense Matrix Workshop - RSA Conference
Cyber Defense Matrix Workshop - RSA Conference
Priyanka Aash
 
The Future of Technology: 2025-2125 by Saikat Basu.pdf
The Future of Technology: 2025-2125 by Saikat Basu.pdf
Saikat Basu
 
Artificial Intelligence in the Nonprofit Boardroom.pdf
Artificial Intelligence in the Nonprofit Boardroom.pdf
OnBoard
 
Connecting Data and Intelligence: The Role of FME in Machine Learning
Connecting Data and Intelligence: The Role of FME in Machine Learning
Safe Software
 
9-1-1 Addressing: End-to-End Automation Using FME
9-1-1 Addressing: End-to-End Automation Using FME
Safe Software
 
Security Tips for Enterprise Azure Solutions
Security Tips for Enterprise Azure Solutions
Michele Leroux Bustamante
 
OpenACC and Open Hackathons Monthly Highlights June 2025
OpenACC and Open Hackathons Monthly Highlights June 2025
OpenACC
 
Edge-banding-machines-edgeteq-s-200-en-.pdf
Edge-banding-machines-edgeteq-s-200-en-.pdf
AmirStern2
 
Enabling BIM / GIS integrations with Other Systems with FME
Enabling BIM / GIS integrations with Other Systems with FME
Safe Software
 
FIDO Seminar: Evolving Landscape of Post-Quantum Cryptography.pptx
FIDO Seminar: Evolving Landscape of Post-Quantum Cryptography.pptx
FIDO Alliance
 
You are not excused! How to avoid security blind spots on the way to production
You are not excused! How to avoid security blind spots on the way to production
Michele Leroux Bustamante
 
Information Security Response Team Nepal_npCERT_Vice_President_Sudan_Jha.pdf
Information Security Response Team Nepal_npCERT_Vice_President_Sudan_Jha.pdf
ICT Frame Magazine Pvt. Ltd.
 
AI VIDEO MAGAZINE - June 2025 - r/aivideo
AI VIDEO MAGAZINE - June 2025 - r/aivideo
1pcity Studios, Inc
 
MuleSoft for AgentForce : Topic Center and API Catalog
MuleSoft for AgentForce : Topic Center and API Catalog
shyamraj55
 
Securing Account Lifecycles in the Age of Deepfakes.pptx
Securing Account Lifecycles in the Age of Deepfakes.pptx
FIDO Alliance
 
Powering Multi-Page Web Applications Using Flow Apps and FME Data Streaming
Powering Multi-Page Web Applications Using Flow Apps and FME Data Streaming
Safe Software
 
"How to survive Black Friday: preparing e-commerce for a peak season", Yurii ...
"How to survive Black Friday: preparing e-commerce for a peak season", Yurii ...
Fwdays
 
OWASP Barcelona 2025 Threat Model Library
OWASP Barcelona 2025 Threat Model Library
PetraVukmirovic
 
ReSTIR [DI]: Spatiotemporal reservoir resampling for real-time ray tracing ...
ReSTIR [DI]: Spatiotemporal reservoir resampling for real-time ray tracing ...
revolcs10
 
Python Conference Singapore - 19 Jun 2025
Python Conference Singapore - 19 Jun 2025
ninefyi
 
Cyber Defense Matrix Workshop - RSA Conference
Cyber Defense Matrix Workshop - RSA Conference
Priyanka Aash
 
The Future of Technology: 2025-2125 by Saikat Basu.pdf
The Future of Technology: 2025-2125 by Saikat Basu.pdf
Saikat Basu
 
Artificial Intelligence in the Nonprofit Boardroom.pdf
Artificial Intelligence in the Nonprofit Boardroom.pdf
OnBoard
 
Connecting Data and Intelligence: The Role of FME in Machine Learning
Connecting Data and Intelligence: The Role of FME in Machine Learning
Safe Software
 
9-1-1 Addressing: End-to-End Automation Using FME
9-1-1 Addressing: End-to-End Automation Using FME
Safe Software
 
Security Tips for Enterprise Azure Solutions
Security Tips for Enterprise Azure Solutions
Michele Leroux Bustamante
 
OpenACC and Open Hackathons Monthly Highlights June 2025
OpenACC and Open Hackathons Monthly Highlights June 2025
OpenACC
 
Edge-banding-machines-edgeteq-s-200-en-.pdf
Edge-banding-machines-edgeteq-s-200-en-.pdf
AmirStern2
 
Enabling BIM / GIS integrations with Other Systems with FME
Enabling BIM / GIS integrations with Other Systems with FME
Safe Software
 
FIDO Seminar: Evolving Landscape of Post-Quantum Cryptography.pptx
FIDO Seminar: Evolving Landscape of Post-Quantum Cryptography.pptx
FIDO Alliance
 
You are not excused! How to avoid security blind spots on the way to production
You are not excused! How to avoid security blind spots on the way to production
Michele Leroux Bustamante
 
Information Security Response Team Nepal_npCERT_Vice_President_Sudan_Jha.pdf
Information Security Response Team Nepal_npCERT_Vice_President_Sudan_Jha.pdf
ICT Frame Magazine Pvt. Ltd.
 
AI VIDEO MAGAZINE - June 2025 - r/aivideo
AI VIDEO MAGAZINE - June 2025 - r/aivideo
1pcity Studios, Inc
 
MuleSoft for AgentForce : Topic Center and API Catalog
MuleSoft for AgentForce : Topic Center and API Catalog
shyamraj55
 
Securing Account Lifecycles in the Age of Deepfakes.pptx
Securing Account Lifecycles in the Age of Deepfakes.pptx
FIDO Alliance
 
Powering Multi-Page Web Applications Using Flow Apps and FME Data Streaming
Powering Multi-Page Web Applications Using Flow Apps and FME Data Streaming
Safe Software
 
"How to survive Black Friday: preparing e-commerce for a peak season", Yurii ...
"How to survive Black Friday: preparing e-commerce for a peak season", Yurii ...
Fwdays
 
OWASP Barcelona 2025 Threat Model Library
OWASP Barcelona 2025 Threat Model Library
PetraVukmirovic
 
ReSTIR [DI]: Spatiotemporal reservoir resampling for real-time ray tracing ...
ReSTIR [DI]: Spatiotemporal reservoir resampling for real-time ray tracing ...
revolcs10
 

PHPCon China 2018 - 好孩子的 PHP 撰碼指南