SlideShare a Scribd company logo
1 of 140
Download to read offline
2014-07-01 FLOLAC’14
Commercial Uses of Functional Programming
Functional Programming as a means — not an end
01
01
✤ ICFP 2014: September 1~3
01
✤ ICFP 2014: September 1~3
✤ CUFP 2014: September 4~6
01
✤ ICFP 2014: September 1~3
✤ CUFP 2014: September 4~6
✤ 6-Hour Workday: July 1
01
✤ ICFP 2014: September 1~3
✤ CUFP 2014: September 4~6
✤ 6-Hour Workday: July 1
01
01
01
Worse is Better
01
Worse is Better
01
Worse is Better
Less is More!
Less is more!
λ
Closure ⊂ Value
Less is more!
λ
Closure ⊂ Value
f . g =
Less is more!
λ
Closure ⊂ Value
f . g =
x -> f (g x)
Less is more!
λ
Closure ⊂ Value
f . g =
x -> f (g x)
((+1) . (*2)) 3
Less is more!
λ
Closure ⊂ Value
function compose (f, g) {
return function (x) {
return f( g(x) )
}
}
f . g =
x -> f (g x)
((+1) . (*2)) 3
ANSI C Ada
Fortran Cobol
ANSI C Ada
Fortran Cobol
ANSI C Ada
Fortran Cobol
ANSI C Ada
Fortran Cobol
ANSI C Ada
Fortran Cobol
ANSI C Ada
Fortran Cobol
ANSI C Ada
Fortran Cobol
ANSI C Ada
Fortran Cobol
ANSI C Ada
Fortran Cobol
ANSI C Ada
Fortran Cobol
ANSI C Ada
Fortran Cobol
ANSI C Ada
Fortran Cobol
ANSI C Ada
Fortran Cobol
Generators: List Fusion
Generators: List Fusion
fibs = 1:1:[ x+y

| x <- fibs

| y <- tail fibs ]
take 6 (map (*10) fibs)
[10,10,20,30,50,80]
Generators: List Fusion
fibs = 1:1:[ x+y

| x <- fibs

| y <- tail fibs ]
take 6 (map (*10) fibs)
[10,10,20,30,50,80]
take 6 (map (*5) (map (*2) fibs))
[10,10,20,30,50,80]
Generators: List Fusion
fibs = 1:1:[ x+y

| x <- fibs

| y <- tail fibs ]
take 6 (map (*10) fibs)
[10,10,20,30,50,80]
take 6 (map (*5) (map (*2) fibs))
[10,10,20,30,50,80]
take 6 (map ((*5) . (*2)) fibs)
QuickCheck: PropertyTesting
QuickCheck: PropertyTesting
import Test.QuickCheck
prop :: [Int] -> [Int] -> Bool
prop xs ys =
reverse (xs ++ ys) ==
reverse xs ++ reverse ys
quickCheck prop -- Failed!
QuickCheck: PropertyTesting
import Test.QuickCheck
prop :: [Int] -> [Int] -> Bool
prop xs ys =
reverse (xs ++ ys) ==
reverse xs ++ reverse ys
quickCheck prop -- Failed!
reverse xs ++ reverse ys
QuickCheck: PropertyTesting
import Test.QuickCheck
prop :: [Int] -> [Int] -> Bool
prop xs ys =
reverse (xs ++ ys) ==
reverse xs ++ reverse ys
quickCheck prop -- Failed!
reverse xs ++ reverse ys
quickCheck prop -- Failed!
QuickCheck: PropertyTesting
import Test.QuickCheck
prop :: [Int] -> [Int] -> Bool
prop xs ys =
reverse (xs ++ ys) ==
reverse xs ++ reverse ys
quickCheck prop -- Failed!
reverse ys ++ reverse xs
quickCheck prop -- Passed!
Macros: Multi-Stage Programming
Macros: Multi-Stage Programming
import Text.InterpolatedString.Perl6
user = "world"
putStrLn [qq|
Hello, $user!
Your lucky number: { 6*7 }
|]
2011 20142004
2011 20142004
2005
2011 20142004
2005 2012
ES/9000 R46
4CPU, 8GB RAM
50MTWD
RS/6000 H70
340MHz 1MTWD
ES/9000 R46
4CPU, 8GB RAM
50MTWD
InfoPrint/4000 ID5
1000 PPM 15MTWD
RS/6000 H70
340MHz 1MTWD
ES/9000 R46
4CPU, 8GB RAM
50MTWD
InfoPrint/4000 ID5
1000 PPM 15MTWD
RS/6000 H70
340MHz 1MTWD
ES/9000 R46
4CPU, 8GB RAM
50MTWD
InfoPrint/4000 ID5
1000 PPM 15MTWD
RS/6000 H70
340MHz 1MTWD
ES/9000 R46
4CPU, 8GB RAM
50MTWD
COBOL RPG
PL/1 REXX SQL
InfoPrint/4000 ID5
1000 PPM 15MTWD
RS/6000 H70
340MHz 1MTWD
ES/9000 R46
4CPU, 8GB RAM
50MTWD
COBOL RPG
PL/1 REXX SQL
Content Manager OnDemand
Feb 2004
Content Manager OnDemand
Feb 2004
Content Manager OnDemand
Encode::IBM
Parse::AFP
Feb 2004
Content Manager OnDemand
Encode::IBM
Parse::AFP
Feb 2004
Content Manager OnDemand

Encode::IBM
Parse::AFP
Feb 2004
September 2004
September 2004
September 2004


September 2004


September 2004
SAX-style iterators


September 2004
SAX-style iterators
O(n) memory use


September 2004
SAX-style iterators
O(n) memory use
300KB/sec (my laptop)


September 2004
SAX-style iterators
O(n) memory use
300KB/sec (my laptop)
30KB/sec (production)


September 2004
SAX-style iterators
O(n) memory use
300KB/sec (my laptop)
30KB/sec (production)
Input: 25GB/day
Throughput: 2.5GB/day


September 2004
SAX-style iterators
O(n) memory use
300KB/sec (my laptop)
30KB/sec (production)
Input: 25GB/day
Throughput: 2.5GB/day
Deadline:
Feb 2005
October—November 2004
October—November 2004
October—November 2004
December 2004: Freenode
December 2004: Freenode
✤ “Yeah, CosmicRay recently ported GHC to AIX.”
December 2004: Freenode
✤ “Yeah, CosmicRay recently ported GHC to AIX.”
✤ “Defining a functor instance as liftM works I'm pretty sure, so… all
Monads are Functors (theoretically), instance Monad a => Functor a
where fmap = liftM would cover all monads.”
December 2004: Freenode
✤ “Yeah, CosmicRay recently ported GHC to AIX.”
✤ “Defining a functor instance as liftM works I'm pretty sure, so… all
Monads are Functors (theoretically), instance Monad a => Functor a
where fmap = liftM would cover all monads.”
✤ “Elaborate please? <- have only learned haskell for 5 days…”
December 2004: Freenode
✤ “Yeah, CosmicRay recently ported GHC to AIX.”
✤ “Defining a functor instance as liftM works I'm pretty sure, so… all
Monads are Functors (theoretically), instance Monad a => Functor a
where fmap = liftM would cover all monads.”
✤ “Elaborate please? <- have only learned haskell for 5 days…”
✤ “unsafeInterleaveIO is the best thing since sliced bread.”
December 2004: Freenode
✤ “Yeah, CosmicRay recently ported GHC to AIX.”
✤ “Defining a functor instance as liftM works I'm pretty sure, so… all
Monads are Functors (theoretically), instance Monad a => Functor a
where fmap = liftM would cover all monads.”
✤ “Elaborate please? <- have only learned haskell for 5 days…”
✤ “unsafeInterleaveIO is the best thing since sliced bread.”
✤ “What do I do with a compiler with exploding brains?”
December 2004: Freenode
✤ “Yeah, CosmicRay recently ported GHC to AIX.”
✤ “Defining a functor instance as liftM works I'm pretty sure, so… all
Monads are Functors (theoretically), instance Monad a => Functor a
where fmap = liftM would cover all monads.”
✤ “Elaborate please? <- have only learned haskell for 5 days…”
✤ “unsafeInterleaveIO is the best thing since sliced bread.”
✤ “What do I do with a compiler with exploding brains?”
✤ “Haskell has a solid niche as a PhD generator :)”
January 2005
January 2005
✤ OpenAFP.hs delivered —
Input: 25GB/day
Throughput: 500GB/day
DOM-Style selectors
O(1) Memory Use!
January 2005
✤ OpenAFP.hs delivered —
Input: 25GB/day
Throughput: 500GB/day
DOM-Style selectors
O(1) Memory Use!
January 2005
✤ OpenAFP.hs delivered —
✤ NTD$3k/hr * 3 months
Input: 25GB/day
Throughput: 500GB/day
DOM-Style selectors
O(1) Memory Use!
January 2005
✤ OpenAFP.hs delivered —
✤ NTD$3k/hr * 3 months
✤ “You don't need category theory, you need BC Pierce's
'Types and Programming Languages’”





Input: 25GB/day
Throughput: 500GB/day
DOM-Style selectors
O(1) Memory Use!
January 2005
✤ OpenAFP.hs delivered —
✤ NTD$3k/hr * 3 months
✤ “You don't need category theory, you need BC Pierce's
'Types and Programming Languages’”





Input: 25GB/day
Throughput: 500GB/day
DOM-Style selectors
O(1) Memory Use!
January 2005
✤ OpenAFP.hs delivered —
✤ NTD$3k/hr * 3 months
✤ “You don't need category theory, you need BC Pierce's
'Types and Programming Languages’”





✤ “My target language is huge. I need all the help I can get :)”
2005: Pugs
Feb 1: Started on Freenode #haskell
Lambdas & Camels joined in #perl6
Specification revised, iterated, tested
Concurrency, Coroutines, Commit Bits!
2006: Erdősing
YAPC: Worst is Best on targeting JS
OOPSLA: Reconciling the Irreconcilable
Succeeded by Moose & Rakudo
Perl 5 runtime became Modern Perl
Concluding talk: Optimizing for Fun
楽
⼟土
2007: S-Team
New tech stack: Jifty, Moose, and GHC
OpenAFP Utilities: Report Generation,
Extraction, Management, Distribution,
Conversion…
Enhanced & eventually replaced IBM
OnDemand with PDF-based workflow
2008: Socialtext
Midlife crisis — Becoming a PHB?
Hierarchical organization & culture —
can we change that with technology?
Decided to telecommute full time:

- ST (social workplace), or

- FB (social media)?
2009: SocialCalc
Worked with Dan Bricklin & friends
Summarized into three book chapters:

- Architecture of Open Source Applications

- Performance of Open Source Applications

- 500 lines or less (in progress)
EtherCalc: Backend of g0v.today
2010:Apple
Cloud Service Localization
Everything under NDA…
…with one single exception
May 2011
May 2011
✤ “Can you write me some code that takes a regular expression
and enumerates the domain it accepts?”
May 2011
✤ “Can you write me some code that takes a regular expression
and enumerates the domain it accepts?”
✤ “I think I can do this with the yices2 SMT solver and
the SBV Haskell library to turn regexes into
satisfiability problems, and so we can get all examples.
May 2011
✤ “Can you write me some code that takes a regular expression
and enumerates the domain it accepts?”
✤ “I think I can do this with the yices2 SMT solver and
the SBV Haskell library to turn regexes into
satisfiability problems, and so we can get all examples.
✤ But this is too much fun for an one-off script…

Would you mind if I do this pro bono so I can release
it into public domain? :-)”
SMT Constraint Solving
SMT Constraint Solving
✤ Genex: Regex as predicates on integer variables
/([AB]C)1/
SMT Constraint Solving
✤ Genex: Regex as predicates on integer variables
✤ Solve for [x, y, z, w]:
/([AB]C)1/
(x=‘A’ ∨ x=‘B’) ∧
(y=‘C’) ∧
(z=x) ∧ (w=y)
SMT Constraint Solving
✤ Genex: Regex as predicates on integer variables
✤ Solve for [x, y, z, w]:
✤ “ACAC”

“BCBC”
/([AB]C)1/
(x=‘A’ ∨ x=‘B’) ∧
(y=‘C’) ∧
(z=x) ∧ (w=y)
SMT Constraint Solving
✤ Genex: Regex as predicates on integer variables
✤ Solve for [x, y, z, w]:
✤ “ACAC”

“BCBC”
✤ Supports b 1 ^ $
/([AB]C)1/
(x=‘A’ ∨ x=‘B’) ∧
(y=‘C’) ∧
(z=x) ∧ (w=y)
A Regular Crossword
(ND|ET|IN)[^X]*
(DI|NS|TH|OM)*
.*(IN|SE|HI)
[CHMNOR]*I[CHMNOR]*
C*MC(CCC|MM)*
([^EMC]|EM)*
[CEIMU]*OH[AEMOR]*
[AM]*CM(RC)*R?
N.*X.X.X.*E
.*XHCR.*X.*
(RR|HHH)*.?
(...?)1*
.*XEXM*
[CR]*
[^C]*MMM[^C]*
(E|CR|MN)*
([^X]|XCC)*
.*OXR.*
.*PRR.*DDC.*
R*D*M*
.*(.)(.)(.)(.)4321.*
(RX|[^R])*
.*SE.*UE.*
.*LR.*RL.*
(S|MM|HHH)*
.*G.*V.*H.*
[^C]*[^R]*III.*
(HHX|[^HX])*
.(C|HH)*
.*DD.*CCM.*
P+(..)1.*
(O|RHH|MM)*
([^MC]|MM|CC)*
.*(.)C1X1.*
F.*[AO].*[AO].*
[^M]*M[^M]*
.*H.*H.*
.*
.*
A Regular Crossword
✤ Source: MIT Mystery Hunt 2013
(ND|ET|IN)[^X]*
(DI|NS|TH|OM)*
.*(IN|SE|HI)
[CHMNOR]*I[CHMNOR]*
C*MC(CCC|MM)*
([^EMC]|EM)*
[CEIMU]*OH[AEMOR]*
[AM]*CM(RC)*R?
N.*X.X.X.*E
.*XHCR.*X.*
(RR|HHH)*.?
(...?)1*
.*XEXM*
[CR]*
[^C]*MMM[^C]*
(E|CR|MN)*
([^X]|XCC)*
.*OXR.*
.*PRR.*DDC.*
R*D*M*
.*(.)(.)(.)(.)4321.*
(RX|[^R])*
.*SE.*UE.*
.*LR.*RL.*
(S|MM|HHH)*
.*G.*V.*H.*
[^C]*[^R]*III.*
(HHX|[^HX])*
.(C|HH)*
.*DD.*CCM.*
P+(..)1.*
(O|RHH|MM)*
([^MC]|MM|CC)*
.*(.)C1X1.*
F.*[AO].*[AO].*
[^M]*M[^M]*
.*H.*H.*
.*
.*
A Regular Crossword
✤ Source: MIT Mystery Hunt 2013
✤ Solved in ~40 lines of Haskell with Genex!(ND|ET|IN)[^X]*
(DI|NS|TH|OM)*
.*(IN|SE|HI)
[CHMNOR]*I[CHMNOR]*
C*MC(CCC|MM)*
([^EMC]|EM)*
[CEIMU]*OH[AEMOR]*
[AM]*CM(RC)*R?
N.*X.X.X.*E
.*XHCR.*X.*
(RR|HHH)*.?
(...?)1*
.*XEXM*
[CR]*
[^C]*MMM[^C]*
(E|CR|MN)*
([^X]|XCC)*
.*OXR.*
.*PRR.*DDC.*
R*D*M*
.*(.)(.)(.)(.)4321.*
(RX|[^R])*
.*SE.*UE.*
.*LR.*RL.*
(S|MM|HHH)*
.*G.*V.*H.*
[^C]*[^R]*III.*
(HHX|[^HX])*
.(C|HH)*
.*DD.*CCM.*
P+(..)1.*
(O|RHH|MM)*
([^MC]|MM|CC)*
.*(.)C1X1.*
F.*[AO].*[AO].*
[^M]*M[^M]*
.*H.*H.*
.*
.*
A Regular Crossword
✤ Source: MIT Mystery Hunt 2013
✤ Solved in ~40 lines of Haskell with Genex!(ND|ET|IN)[^X]*
(DI|NS|TH|OM)*
.*(IN|SE|HI)
[CHMNOR]*I[CHMNOR]*
C*MC(CCC|MM)*
([^EMC]|EM)*
[CEIMU]*OH[AEMOR]*
[AM]*CM(RC)*R?
N.*X.X.X.*E
.*XHCR.*X.*
(RR|HHH)*.?
(...?)1*
.*XEXM*
[CR]*
[^C]*MMM[^C]*
(E|CR|MN)*
([^X]|XCC)*
.*OXR.*
.*PRR.*DDC.*
R*D*M*
.*(.)(.)(.)(.)4321.*
(RX|[^R])*
.*SE.*UE.*
.*LR.*RL.*
(S|MM|HHH)*
.*G.*V.*H.*
[^C]*[^R]*III.*
(HHX|[^HX])*
.(C|HH)*
.*DD.*CCM.*
P+(..)1.*
(O|RHH|MM)*
([^MC]|MM|CC)*
.*(.)C1X1.*
F.*[AO].*[AO].*
[^M]*M[^M]*
.*H.*H.*
.*
.*
N H P E H A S
D I O M O M T H
F O X N X A X P H
M M O M M M M R H H
M C X N M M C R X E M
C M C C C C M M M M M M
H R X R C M I I I H X L S
O R E O R E O R E O R E
V C X C C H H M X C C
R R R R H H H R R U
N C X D X E X L E
R R D D M M M M
G C C H H C C
SmallCheck: Enumerated Series
SmallCheck: Enumerated Series
✤ Type-Level Literals: Numbers and Symbols











xs :: [Matching "a?b?c?"]
xs = list 100 series
[,a,b,ab,c,ac,bc,abc]
SmallCheck: Enumerated Series
✤ Type-Level Literals: Numbers and Symbols











✤ Check properties for all strings matching a regex
xs :: [Matching "a?b?c?"]
xs = list 100 series
[,a,b,ab,c,ac,bc,abc]
QuickCheck: Random Sampling
QuickCheck: Random Sampling
✤ Regular Expressions and XML Schemata:
generate (matching rfc2822)
"9%az4@rar1do04jkd1.agzy.org"
QuickCheck: Random Sampling
✤ Regular Expressions and XML Schemata:
generate (matching rfc2822)
"9%az4@rar1do04jkd1.agzy.org"
putStr . showXmlTree =<<

generate . matchingRNG =<<

loadRNG “book.rng”
<?xml version="1.0" encoding="UTF-8"?><book>
<author>o09a-_6w@tnj.qom.today</author>
<author>3qd9g02xlu@swbr.kmly.eu</author>
<author>z6ckxi8@jtm.cbopios.asia</author>
</book>
2012: LiveScript
Feb 1: @gkz forked @satyr’s fork of .coffee
“Like a smaller language within Perl 6,
struggling to get out…”
May 1: ST joined PeopleFluent at Bedford
June 1: CoffeeRedux by @michaelficarra
Launched JS2LS: @clkao, @gkz, @mpgutta
Coco
2013: MoeDict
Feb 1: Revised MoE Dictionary in HTML5
- Every word linked to its definition
- Fair Use and CC0 as legal frameworks
moedict.tw: Android, iOS, Firefox OS
Holo, Hakka, Cross-Strait Language DB
萌典
May 2014: CUFP Program Committee
May 2014: CUFP Program Committee
✤ “I enjoyed @simonmar's slides The Haxl Project at
Facebook and the related /r/haskell discussions.
May 2014: CUFP Program Committee
✤ “I enjoyed @simonmar's slides The Haxl Project at
Facebook and the related /r/haskell discussions.
✤ It’s a reasonably easy-to-understand Commercial
Use of Functional Programming that I plan to
talk about in my FLOLAC’14 talk.
May 2014: CUFP Program Committee
✤ “I enjoyed @simonmar's slides The Haxl Project at
Facebook and the related /r/haskell discussions.
✤ It’s a reasonably easy-to-understand Commercial
Use of Functional Programming that I plan to
talk about in my FLOLAC’14 talk.
✤ Would it make sense to invite @simonmar to
the CUFP keynote?”
Fighting Spam with Pure Functions
Fighting Spam with Pure Functions
✤ Nov 2012: Simon Marlow joins Facebook
Fighting Spam with Pure Functions
✤ Nov 2012: Simon Marlow joins Facebook
✤ Jan 2013: FXL — Subset of ML, interpreted in C++
Fighting Spam with Pure Functions
✤ Nov 2012: Simon Marlow joins Facebook
✤ Jan 2013: FXL — Subset of ML, interpreted in C++
If (Average(Map(Reputation, 

PreviousSharedUrls(User, 5))) < 0)
Then [WarnUser, LogRequest] Else []
Fighting Spam with Pure Functions
✤ Nov 2012: Simon Marlow joins Facebook
✤ Jan 2013: FXL — Subset of ML, interpreted in C++
✤ Aug 2013: Haxl compiler implemented in GHC
Fighting Spam with Pure Functions
✤ Nov 2012: Simon Marlow joins Facebook
✤ Jan 2013: FXL — Subset of ML, interpreted in C++
✤ Aug 2013: Haxl compiler implemented in GHC
✤ Jun 2014: Deployed and Open Sourced
Fighting Spam with Pure Functions
✤ Nov 2012: Simon Marlow joins Facebook
✤ Jan 2013: FXL — Subset of ML, interpreted in C++
✤ Aug 2013: Haxl compiler implemented in GHC
✤ Jun 2014: Deployed and Open Sourced
✤ Sep 2014: There is no fork @ ICFP
FXL on Haxl
If (Average(Map(Reputation, 

PreviousSharedUrls(User, 5))) < 0)
Then [WarnUser, LogRequest] Else []
FXL on Haxl
If (Average(Map(Reputation, 

PreviousSharedUrls(User, 5))) < 0)
Then [WarnUser, LogRequest] Else []
FXL on Haxl
If (Average(Map(Reputation, 

PreviousSharedUrls(User, 5))) < 0)
Then [WarnUser, LogRequest] Else []
Marlow et al, The Haxl Project at Facebook
FXL on Haxl
If (Average(Map(Reputation, 

PreviousSharedUrls(User, 5))) < 0)
Then [WarnUser, LogRequest] Else []
Marlow et al, The Haxl Project at Facebook
Concurrency & Caching
Concurrency & Caching
✤ With the Applicative Do macro:
fun :: Haxl String
fun = [ado|
x <- fetch “A”
y <- fetch “B”
z <- fetch y
x ++ y ++ z
|]
Concurrency & Caching
✤ With the Applicative Do macro:
fun :: Haxl String
fun = [ado|
x <- fetch “A”
y <- fetch “B”
z <- fetch y
x ++ y ++ z
|]
fetch
“A”
fetch
“B”
Concurrency & Caching
✤ With the Applicative Do macro:
fun :: Haxl String
fun = [ado|
x <- fetch “A”
y <- fetch “B”
z <- fetch y
x ++ y ++ z
|]
fetch
“A”
fetch
“B”
H A
Concurrency & Caching
✤ With the Applicative Do macro:
fun :: Haxl String
fun = [ado|
x <- fetch “A”
y <- fetch “B”
z <- fetch y
x ++ y ++ z
|]
fetch
“A”
fetch
“B”
H A
fetch
“A”
H
cached
Concurrency & Caching
✤ With the Applicative Do macro:
fun :: Haxl String
fun = [ado|
x <- fetch “A”
y <- fetch “B”
z <- fetch y
x ++ y ++ z
|]
fetch
“A”
fetch
“B”
H A++
fetch
“A”
H
cached
++
HAH
Recap
Recap
✤ Generators: List Fusion

Recap
✤ Generators: List Fusion

✤ QuickCheck: Property Testing

Recap
✤ Generators: List Fusion

✤ QuickCheck: Property Testing

✤ Macros: Multi-Stage Programming
main :: IO ()
Functional Programming as a means —
main :: IO a
Functional Programming as a means —
main :: IO a
Functional Programming as a means —
newtype IO a =
IO ( State# RealWorld
-> (# State# RealWorld, a #))
main :: IO a
Functional Programming as a means —
newtype IO a =
IO ( State# RealWorld
-> (# State# RealWorld, a #))
main :: State# RealWorld
-> (# State# RealWorld, a #)
main :: IO a
Functional Programming as a means —
newtype IO a =
IO ( State# RealWorld
-> (# State# RealWorld, a #))
main :: State# RealWorld
-> (# State# RealWorld, a #)
to observe the world,
main :: IO a
Functional Programming as a means —
newtype IO a =
IO ( State# RealWorld
-> (# State# RealWorld, a #))
main :: State# RealWorld
-> (# State# RealWorld, a #)
to observe the world,
to change it, and to create a new value.

More Related Content

More from Audrey Tang

Social Innovation & Digital Transformation
Social Innovation & Digital TransformationSocial Innovation & Digital Transformation
Social Innovation & Digital TransformationAudrey Tang
 
Stories from the Future of Democracy
Stories from the Future of DemocracyStories from the Future of Democracy
Stories from the Future of DemocracyAudrey Tang
 
TEDxTaipei 2017: 社會企業
TEDxTaipei 2017: 社會企業TEDxTaipei 2017: 社會企業
TEDxTaipei 2017: 社會企業Audrey Tang
 
唐鳳政務委員業務工作報告
唐鳳政務委員業務工作報告唐鳳政務委員業務工作報告
唐鳳政務委員業務工作報告Audrey Tang
 
資訊服務採購契約範本 修正明細對照 1060713
資訊服務採購契約範本 修正明細對照 1060713資訊服務採購契約範本 修正明細對照 1060713
資訊服務採購契約範本 修正明細對照 1060713Audrey Tang
 
服務型智慧政府推動計畫 v9
服務型智慧政府推動計畫 v9服務型智慧政府推動計畫 v9
服務型智慧政府推動計畫 v9Audrey Tang
 
共通性應用程式介面規範
共通性應用程式介面規範共通性應用程式介面規範
共通性應用程式介面規範Audrey Tang
 
打造一站式的防救災資訊整合平臺
打造一站式的防救災資訊整合平臺打造一站式的防救災資訊整合平臺
打造一站式的防救災資訊整合平臺Audrey Tang
 
開放政府聯絡人第11次協作會議簡報
開放政府聯絡人第11次協作會議簡報開放政府聯絡人第11次協作會議簡報
開放政府聯絡人第11次協作會議簡報Audrey Tang
 
第7次協作會議會後會簡報v6.0
第7次協作會議會後會簡報v6.0第7次協作會議會後會簡報v6.0
第7次協作會議會後會簡報v6.0Audrey Tang
 
臨時動議:社會企業連繫會議分組
臨時動議:社會企業連繫會議分組臨時動議:社會企業連繫會議分組
臨時動議:社會企業連繫會議分組Audrey Tang
 
議程及歷次列管表
議程及歷次列管表議程及歷次列管表
議程及歷次列管表Audrey Tang
 
討論案一:中、南、東部在地社企會談規劃情形
討論案一:中、南、東部在地社企會談規劃情形討論案一:中、南、東部在地社企會談規劃情形
討論案一:中、南、東部在地社企會談規劃情形Audrey Tang
 
報告案四之一:創櫃板協助社會企業籌資之推動現況
報告案四之一:創櫃板協助社會企業籌資之推動現況報告案四之一:創櫃板協助社會企業籌資之推動現況
報告案四之一:創櫃板協助社會企業籌資之推動現況Audrey Tang
 
報告案四之二:國發基金運用資金協助社會發展辦理方式
報告案四之二:國發基金運用資金協助社會發展辦理方式報告案四之二:國發基金運用資金協助社會發展辦理方式
報告案四之二:國發基金運用資金協助社會發展辦理方式Audrey Tang
 
報告案二:組團參加2017年社會企業世界論壇辦理進度報告
報告案二:組團參加2017年社會企業世界論壇辦理進度報告報告案二:組團參加2017年社會企業世界論壇辦理進度報告
報告案二:組團參加2017年社會企業世界論壇辦理進度報告Audrey Tang
 
報告案三 :SEWF申辦2019進度說明
報告案三 :SEWF申辦2019進度說明報告案三 :SEWF申辦2019進度說明
報告案三 :SEWF申辦2019進度說明Audrey Tang
 
2017-06-17 臺灣網路治理論壇
2017-06-17 臺灣網路治理論壇2017-06-17 臺灣網路治理論壇
2017-06-17 臺灣網路治理論壇Audrey Tang
 
行政院數位國家創新經濟推動小組設置要點
行政院數位國家創新經濟推動小組設置要點行政院數位國家創新經濟推動小組設置要點
行政院數位國家創新經濟推動小組設置要點Audrey Tang
 
DIGI⁺ 數位政府
DIGI⁺ 數位政府DIGI⁺ 數位政府
DIGI⁺ 數位政府Audrey Tang
 

More from Audrey Tang (20)

Social Innovation & Digital Transformation
Social Innovation & Digital TransformationSocial Innovation & Digital Transformation
Social Innovation & Digital Transformation
 
Stories from the Future of Democracy
Stories from the Future of DemocracyStories from the Future of Democracy
Stories from the Future of Democracy
 
TEDxTaipei 2017: 社會企業
TEDxTaipei 2017: 社會企業TEDxTaipei 2017: 社會企業
TEDxTaipei 2017: 社會企業
 
唐鳳政務委員業務工作報告
唐鳳政務委員業務工作報告唐鳳政務委員業務工作報告
唐鳳政務委員業務工作報告
 
資訊服務採購契約範本 修正明細對照 1060713
資訊服務採購契約範本 修正明細對照 1060713資訊服務採購契約範本 修正明細對照 1060713
資訊服務採購契約範本 修正明細對照 1060713
 
服務型智慧政府推動計畫 v9
服務型智慧政府推動計畫 v9服務型智慧政府推動計畫 v9
服務型智慧政府推動計畫 v9
 
共通性應用程式介面規範
共通性應用程式介面規範共通性應用程式介面規範
共通性應用程式介面規範
 
打造一站式的防救災資訊整合平臺
打造一站式的防救災資訊整合平臺打造一站式的防救災資訊整合平臺
打造一站式的防救災資訊整合平臺
 
開放政府聯絡人第11次協作會議簡報
開放政府聯絡人第11次協作會議簡報開放政府聯絡人第11次協作會議簡報
開放政府聯絡人第11次協作會議簡報
 
第7次協作會議會後會簡報v6.0
第7次協作會議會後會簡報v6.0第7次協作會議會後會簡報v6.0
第7次協作會議會後會簡報v6.0
 
臨時動議:社會企業連繫會議分組
臨時動議:社會企業連繫會議分組臨時動議:社會企業連繫會議分組
臨時動議:社會企業連繫會議分組
 
議程及歷次列管表
議程及歷次列管表議程及歷次列管表
議程及歷次列管表
 
討論案一:中、南、東部在地社企會談規劃情形
討論案一:中、南、東部在地社企會談規劃情形討論案一:中、南、東部在地社企會談規劃情形
討論案一:中、南、東部在地社企會談規劃情形
 
報告案四之一:創櫃板協助社會企業籌資之推動現況
報告案四之一:創櫃板協助社會企業籌資之推動現況報告案四之一:創櫃板協助社會企業籌資之推動現況
報告案四之一:創櫃板協助社會企業籌資之推動現況
 
報告案四之二:國發基金運用資金協助社會發展辦理方式
報告案四之二:國發基金運用資金協助社會發展辦理方式報告案四之二:國發基金運用資金協助社會發展辦理方式
報告案四之二:國發基金運用資金協助社會發展辦理方式
 
報告案二:組團參加2017年社會企業世界論壇辦理進度報告
報告案二:組團參加2017年社會企業世界論壇辦理進度報告報告案二:組團參加2017年社會企業世界論壇辦理進度報告
報告案二:組團參加2017年社會企業世界論壇辦理進度報告
 
報告案三 :SEWF申辦2019進度說明
報告案三 :SEWF申辦2019進度說明報告案三 :SEWF申辦2019進度說明
報告案三 :SEWF申辦2019進度說明
 
2017-06-17 臺灣網路治理論壇
2017-06-17 臺灣網路治理論壇2017-06-17 臺灣網路治理論壇
2017-06-17 臺灣網路治理論壇
 
行政院數位國家創新經濟推動小組設置要點
行政院數位國家創新經濟推動小組設置要點行政院數位國家創新經濟推動小組設置要點
行政院數位國家創新經濟推動小組設置要點
 
DIGI⁺ 數位政府
DIGI⁺ 數位政府DIGI⁺ 數位政府
DIGI⁺ 數位政府
 

Recently uploaded

Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CVReal Time Object Detection Using Open CV
Real Time Object Detection Using Open CVKhem
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...Martijn de Jong
 
Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024The Digital Insurer
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)Gabriella Davis
 
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 businesspanagenda
 
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 DiscoveryTrustArc
 
Manulife - Insurer Innovation Award 2024
Manulife - Insurer Innovation Award 2024Manulife - Insurer Innovation Award 2024
Manulife - Insurer Innovation Award 2024The Digital Insurer
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processorsdebabhi2
 
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 DevelopmentsTrustArc
 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobeapidays
 
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 AutomationSafe Software
 
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.pdfUK Journal
 
Top 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live StreamsTop 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live StreamsRoshan Dwivedi
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...Neo4j
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityPrincipled Technologies
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerThousandEyes
 
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 2024Rafal Los
 
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 FresherRemote DBA Services
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...apidays
 
GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdflior mazor
 

Recently uploaded (20)

Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CVReal Time Object Detection Using Open CV
Real Time Object Detection Using Open CV
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 
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
 
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
 
Manulife - Insurer Innovation Award 2024
Manulife - Insurer Innovation Award 2024Manulife - Insurer Innovation Award 2024
Manulife - Insurer Innovation Award 2024
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
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
 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
 
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
 
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
 
Top 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live StreamsTop 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live Streams
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivity
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
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
 
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
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
 
GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdf
 

Commercial Uses of Functional Programming