SlideShare ist ein Scribd-Unternehmen logo
1 von 46
Downloaden Sie, um offline zu lesen
Pursuing the strong,
not so silent type
A Haskell story
by Katie Miller (@codemiller)
Software Engineer at Facebook
"The limits of my language
mean the limits of my world"
- Ludwig Wittgenstein
strong static types
Source: Ruin Raider on Flickr, CC BY-NC-ND 2.0
more than 1 million
requests/second
def	
  haskell_spammer(user,	
  friend,	
  post)	
  
	
  	
  if	
  talking_about_haskell(post)	
  &&	
  
	
  	
  	
  	
  	
  	
  	
  num_common_friends(user,	
  friend)	
  <	
  5	
  &&	
  
	
  	
  	
  	
  	
  	
  	
  most_friends_like_ruby(friend)	
  
	
  	
  	
  	
  block_post	
  
	
  	
  else	
  
	
  	
  	
  	
  do_nothing	
  
	
  	
  end	
  
end	
  
continuous deployment
FXL
functional
efficient data fetching
automatic batching
and concurrency
HaskellSpammer	
  =	
  
	
  	
  If	
  (TalkingAboutHaskell(postContent)	
  &&	
  
	
  	
  	
  	
  	
  	
  NumCommonFriends(userId,	
  friendId)	
  <	
  5	
  &&	
  
	
  	
  	
  	
  	
  	
  MostFriendsLikeRuby(friendId))	
  
	
  	
  	
  	
  Then	
  BlockAction	
  Else	
  @[]	
  
NumCommonFriends(x,	
  y)	
  =	
  
	
  	
  Length(Intersect(FriendsOf(x),	
  FriendsOf(y)))	
  
20x speedup
Haskell
Is Haskell academic?
Source: https://xkcd.com/1312
reasoning about code
haskellSpammer	
  ::	
  Haxl	
  Bool	
  
haskellSpammer	
  =	
  	
  
	
  	
  talkingAboutHaskell	
  .&&	
  
	
  	
  numCommonFriends	
  .<	
  5	
  .&&	
  
	
  	
  mostFriendsLikeRuby	
  
	
  	
  where	
  
	
  	
  mostFriendsLikeRuby	
  =	
  do	
  
	
  	
  	
  	
  friends	
  <-­‐	
  getFriends	
  
	
  	
  	
  	
  rubyFriends	
  <-­‐	
  filterM	
  friendLikesRuby	
  friends	
  
	
  	
  	
  	
  return	
  (length	
  rubyFriends	
  >=	
  
	
  	
  	
  	
  	
  	
  length	
  friends	
  `div`	
  2)	
  
	
  	
  friendLikesRuby	
  friend	
  =	
  
	
  	
  	
  	
  hasAssoc	
  friend	
  likeAssoc	
  rubyPage
user-defined data types
hasAssoc	
  ::	
  Int	
  -­‐>	
  Int	
  -­‐>	
  Int	
  -­‐>	
  Bool	
  
hasAssoc	
  id	
  assoc	
  target	
  =	
  ...
hasAssoc	
  ::	
  Int	
  -­‐>	
  Int	
  -­‐>	
  Int	
  -­‐>	
  Bool	
  
hasAssoc	
  id	
  assoc	
  target	
  =	
  ...
newtype	
  Id	
  =	
  Id	
  Int	
  
newtype	
  AssocId	
  =	
  AssocId	
  Int
hasAssoc	
  ::	
  Int	
  -­‐>	
  Int	
  -­‐>	
  Int	
  -­‐>	
  Bool	
  
hasAssoc	
  id	
  assoc	
  target	
  =	
  ...
newtype	
  Id	
  =	
  Id	
  Int	
  
newtype	
  AssocId	
  =	
  AssocId	
  Int
hasAssoc	
  ::	
  Id	
  -­‐>	
  AssocId	
  -­‐>	
  Id	
  -­‐>	
  Bool	
  
hasAssoc	
  id	
  assoc	
  target	
  =	
  ...
data	
  Language	
  =	
  Ruby	
  |	
  Haskell	
  |	
  Php
data	
  Language	
  =	
  Ruby	
  |	
  Haskell	
  |	
  Php
likesLanguage	
  ::	
  Language	
  -­‐>	
  Id	
  -­‐>	
  Bool
data	
  Language	
  =	
  Ruby	
  |	
  Haskell	
  |	
  Php
likesLanguage	
  ::	
  Language	
  -­‐>	
  Id	
  -­‐>	
  Bool
likesLanguage	
  Ruby	
  userId	
  =	
  
	
  	
  hasAssoc	
  userId	
  likesAssoc	
  1995	
  ||	
  
	
  	
  hasAssoc	
  userId	
  likesAssoc	
  2005
data	
  Language	
  =	
  Ruby	
  |	
  Haskell	
  |	
  Php
likesLanguage	
  ::	
  Language	
  -­‐>	
  Id	
  -­‐>	
  Bool
likesLanguage	
  Ruby	
  userId	
  =	
  
	
  	
  hasAssoc	
  userId	
  likesAssoc	
  1995	
  ||	
  
	
  	
  hasAssoc	
  userId	
  likesAssoc	
  2005
likesLanguage	
  Haskell	
  userId	
  =	
  
	
  	
  hasAssoc	
  userId	
  likesAssoc	
  42
data	
  Language	
  =	
  Ruby	
  |	
  Haskell	
  |	
  Php
likesLanguage	
  ::	
  Language	
  -­‐>	
  Id	
  -­‐>	
  Bool
likesLanguage	
  Ruby	
  userId	
  =	
  
	
  	
  hasAssoc	
  userId	
  likesAssoc	
  1995	
  ||	
  
	
  	
  hasAssoc	
  userId	
  likesAssoc	
  2005
likesLanguage	
  Haskell	
  userId	
  =	
  
	
  	
  hasAssoc	
  userId	
  likesAssoc	
  42
likesLanguage	
  Php	
  _	
  =	
  
	
  	
  False
Is Haskell difficult to learn?
expectations
Is Haskell a panacea?
blockAustralians	
  ::	
  Haxl	
  SyncResponses	
  
blockAustralians	
  =	
  do	
  
	
  	
  textMap	
  <-­‐	
  textArr	
  
	
  	
  let	
  text	
  =	
  HashMap.lookupDefault	
  ""	
  "main_text"	
  textMap	
  
	
  	
  	
  	
  	
  	
  numBadWords	
  	
  	
  =	
  length	
  $	
  filter	
  (`Text.isInfixOf`	
  text)	
  aussieTerms	
  
	
  	
  	
  	
  	
  	
  numBadPhrases	
  =	
  length	
  $	
  filter	
  (`Text.isInfixOf`	
  text)	
  aussieSayings	
  
	
  	
  if	
  numBadWords	
  <	
  2	
  &&	
  numBadPhrases	
  <=	
  0	
  
	
  	
  then	
  return	
  noResponses	
  
	
  	
  else	
  
	
  	
  	
  	
  	
  	
  if	
  numBadWords	
  <	
  4	
  &&	
  numBadPhrases	
  <	
  2	
  
	
  	
  	
  	
  	
  	
  then	
  return	
  requireCaptcha	
  
	
  	
  	
  	
  	
  	
  else	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  if	
  numBadWords	
  <	
  5	
  &&	
  numBadPhrases	
  <	
  3	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  then	
  return	
  $	
  responses	
  [warnUser,	
  requireCaptcha]	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  else	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  if	
  numBadWords	
  <	
  7	
  &&	
  numBadPhrases	
  <	
  4	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  then	
  return	
  warnUser	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  else	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  if	
  numBadWords	
  <	
  8	
  &&	
  numBadPhrases	
  <	
  5	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  then	
  return	
  $	
  responses	
  [warnUser,	
  blockAccess]	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  else	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  if	
  numBadWords	
  <	
  10	
  &&	
  numBadPhrases	
  <	
  6	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  then	
  return	
  blockAccess	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  else	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  if	
  numBadWords	
  <	
  13	
  &&	
  numBadPhrases	
  <	
  7	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  then	
  return	
  $	
  responses	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  [	
  blockAccess	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  ,	
  enrollInFakeAccountCheckpoint	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  ]	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  else	
  return	
  $	
  responses	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  [	
  blockAccess	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  ,	
  enrollInFakeAccountCheckpoint	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  ,	
  requireCaptcha	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  ]	
  
	
  	
  	
  	
  where	
  
	
  	
  	
  	
  	
  	
  aussieTerms	
  =	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  [	
  "Acca	
  Dacca"	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  ,	
  "ambo"	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  ,	
  "arvo"	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  ,	
  "Aussie"	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  ,	
  "bangaroo"
blockAustralians	
  ::	
  Haxl	
  SyncResponses	
  
blockAustralians	
  =	
  do	
  
	
  	
  textMap	
  <-­‐	
  textArr	
  
	
  	
  let	
  text	
  =	
  HashMap.lookupDefault	
  ""	
  "main_text"	
  textMap	
  
	
  	
  	
  	
  	
  	
  numBadWords	
  	
  	
  =	
  length	
  $	
  filter	
  (`Text.isInfixOf`	
  text)	
  aussieTerms	
  
	
  	
  	
  	
  	
  	
  numBadPhrases	
  =	
  length	
  $	
  filter	
  (`Text.isInfixOf`	
  text)	
  aussieSayings	
  
	
  	
  if	
  numBadWords	
  <	
  2	
  &&	
  numBadPhrases	
  <=	
  0	
  
	
  	
  then	
  return	
  noResponses	
  
	
  	
  else	
  
	
  	
  	
  	
  	
  	
  if	
  numBadWords	
  <	
  4	
  &&	
  numBadPhrases	
  <	
  2	
  
	
  	
  	
  	
  	
  	
  then	
  return	
  requireCaptcha	
  
	
  	
  	
  	
  	
  	
  else	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  if	
  numBadWords	
  <	
  5	
  &&	
  numBadPhrases	
  <	
  3	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  then	
  return	
  $	
  responses	
  [warnUser,	
  requireCaptcha]	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  else	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  if	
  numBadWords	
  <	
  7	
  &&	
  numBadPhrases	
  <	
  4	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  then	
  return	
  warnUser	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  else	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  if	
  numBadWords	
  <	
  8	
  &&	
  numBadPhrases	
  <	
  5	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  then	
  return	
  $	
  responses	
  [warnUser,	
  blockAccess]	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  else	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  if	
  numBadWords	
  <	
  10	
  &&	
  numBadPhrases	
  <	
  6	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  then	
  return	
  blockAccess	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  else	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  if	
  numBadWords	
  <	
  13	
  &&	
  numBadPhrases	
  <	
  7	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  then	
  return	
  $	
  responses	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  [	
  blockAccess	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  ,	
  enrollInFakeAccountCheckpoint	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  ]	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  else	
  return	
  $	
  responses	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  [	
  blockAccess	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  ,	
  enrollInFakeAccountCheckpoint	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  ,	
  requireCaptcha	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  ]	
  
	
  	
  	
  	
  where	
  
	
  	
  	
  	
  	
  	
  aussieTerms	
  =	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  [	
  "Acca	
  Dacca"	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  ,	
  "ambo"	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  ,	
  "arvo"	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  ,	
  "Aussie"	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  ,	
  "bangaroo"
results
ideas worth pursuing
community
Haxl team
past and present
Louis Brandy
Jonathan Coens
Andrew Farmer
Kubo Kováč
Jake Lengyel
Simon Marlow
Katie Miller
Bartosz Nitka
Jon Purdy
Aaron Roth
Zejun Wu
Noam Zilberstein
More about Haxl
Haxl on GitHub
'Fighting spam with Haskell' blog post
'There is no Fork' ICFP paper and presentation
'The Road to Running Haskell at Facebook Scale'
presentation
Wired article
The End
by Katie Miller (@codemiller)
Software Engineer at Facebook

Weitere ähnliche Inhalte

Was ist angesagt?

Jonathan Worthington – Perl 2010 Rit Rakudo
Jonathan Worthington – Perl 2010 Rit RakudoJonathan Worthington – Perl 2010 Rit Rakudo
Jonathan Worthington – Perl 2010 Rit Rakudorit2010
 
DEF CON 23 - amit ashbel and maty siman - game of hacks
DEF CON 23 - amit ashbel and maty siman - game of hacks DEF CON 23 - amit ashbel and maty siman - game of hacks
DEF CON 23 - amit ashbel and maty siman - game of hacks Felipe Prado
 
Corephpcomponentpresentation 1211425966721657-8
Corephpcomponentpresentation 1211425966721657-8Corephpcomponentpresentation 1211425966721657-8
Corephpcomponentpresentation 1211425966721657-8PrinceGuru MS
 
Profiling and monitoring ruby & rails applications
Profiling and monitoring ruby & rails applicationsProfiling and monitoring ruby & rails applications
Profiling and monitoring ruby & rails applicationsJano Suchal
 
Temporary Cache Assistance (Transients API): WordCamp Birmingham 2014
Temporary Cache Assistance (Transients API): WordCamp Birmingham 2014Temporary Cache Assistance (Transients API): WordCamp Birmingham 2014
Temporary Cache Assistance (Transients API): WordCamp Birmingham 2014Cliff Seal
 
神に近づくx/net/context (Finding God with x/net/context)
神に近づくx/net/context (Finding God with x/net/context)神に近づくx/net/context (Finding God with x/net/context)
神に近づくx/net/context (Finding God with x/net/context)guregu
 
Modern Getopt for Command Line Processing in Perl
Modern Getopt for Command Line Processing in PerlModern Getopt for Command Line Processing in Perl
Modern Getopt for Command Line Processing in PerlNova Patch
 
Cache is King - RailsConf 2019
Cache is King - RailsConf 2019Cache is King - RailsConf 2019
Cache is King - RailsConf 2019Molly Struve
 
What's New in the PHP Driver
What's New in the PHP DriverWhat's New in the PHP Driver
What's New in the PHP DriverMongoDB
 
An (Inaccurate) Introduction to Python
An (Inaccurate) Introduction to PythonAn (Inaccurate) Introduction to Python
An (Inaccurate) Introduction to PythonNicholas Tollervey
 
ONE MORE TIME ABOUT CODE STANDARDS AND BEST PRACTICES
ONE MORE TIME ABOUT CODE STANDARDS AND BEST PRACTICESONE MORE TIME ABOUT CODE STANDARDS AND BEST PRACTICES
ONE MORE TIME ABOUT CODE STANDARDS AND BEST PRACTICESDrupalCamp Kyiv
 
Password Security
Password SecurityPassword Security
Password SecurityAlex Hyer
 
How to get rid of terraform plan diffs
How to get rid of terraform plan diffsHow to get rid of terraform plan diffs
How to get rid of terraform plan diffsYukiya Hayashi
 
Dependency Injection with PHP and PHP 5.3
Dependency Injection with PHP and PHP 5.3Dependency Injection with PHP and PHP 5.3
Dependency Injection with PHP and PHP 5.3Fabien Potencier
 
Tulsa techfest2010 security
Tulsa techfest2010   securityTulsa techfest2010   security
Tulsa techfest2010 securityJason Ragsdale
 

Was ist angesagt? (19)

Spock
SpockSpock
Spock
 
Jonathan Worthington – Perl 2010 Rit Rakudo
Jonathan Worthington – Perl 2010 Rit RakudoJonathan Worthington – Perl 2010 Rit Rakudo
Jonathan Worthington – Perl 2010 Rit Rakudo
 
DEF CON 23 - amit ashbel and maty siman - game of hacks
DEF CON 23 - amit ashbel and maty siman - game of hacks DEF CON 23 - amit ashbel and maty siman - game of hacks
DEF CON 23 - amit ashbel and maty siman - game of hacks
 
Corephpcomponentpresentation 1211425966721657-8
Corephpcomponentpresentation 1211425966721657-8Corephpcomponentpresentation 1211425966721657-8
Corephpcomponentpresentation 1211425966721657-8
 
Perl object ?
Perl object ?Perl object ?
Perl object ?
 
Profiling and monitoring ruby & rails applications
Profiling and monitoring ruby & rails applicationsProfiling and monitoring ruby & rails applications
Profiling and monitoring ruby & rails applications
 
Temporary Cache Assistance (Transients API): WordCamp Birmingham 2014
Temporary Cache Assistance (Transients API): WordCamp Birmingham 2014Temporary Cache Assistance (Transients API): WordCamp Birmingham 2014
Temporary Cache Assistance (Transients API): WordCamp Birmingham 2014
 
神に近づくx/net/context (Finding God with x/net/context)
神に近づくx/net/context (Finding God with x/net/context)神に近づくx/net/context (Finding God with x/net/context)
神に近づくx/net/context (Finding God with x/net/context)
 
Modern Getopt for Command Line Processing in Perl
Modern Getopt for Command Line Processing in PerlModern Getopt for Command Line Processing in Perl
Modern Getopt for Command Line Processing in Perl
 
Cache is King - RailsConf 2019
Cache is King - RailsConf 2019Cache is King - RailsConf 2019
Cache is King - RailsConf 2019
 
What's New in the PHP Driver
What's New in the PHP DriverWhat's New in the PHP Driver
What's New in the PHP Driver
 
An (Inaccurate) Introduction to Python
An (Inaccurate) Introduction to PythonAn (Inaccurate) Introduction to Python
An (Inaccurate) Introduction to Python
 
What Is Security
What Is SecurityWhat Is Security
What Is Security
 
ONE MORE TIME ABOUT CODE STANDARDS AND BEST PRACTICES
ONE MORE TIME ABOUT CODE STANDARDS AND BEST PRACTICESONE MORE TIME ABOUT CODE STANDARDS AND BEST PRACTICES
ONE MORE TIME ABOUT CODE STANDARDS AND BEST PRACTICES
 
mod_rewrite
mod_rewritemod_rewrite
mod_rewrite
 
Password Security
Password SecurityPassword Security
Password Security
 
How to get rid of terraform plan diffs
How to get rid of terraform plan diffsHow to get rid of terraform plan diffs
How to get rid of terraform plan diffs
 
Dependency Injection with PHP and PHP 5.3
Dependency Injection with PHP and PHP 5.3Dependency Injection with PHP and PHP 5.3
Dependency Injection with PHP and PHP 5.3
 
Tulsa techfest2010 security
Tulsa techfest2010   securityTulsa techfest2010   security
Tulsa techfest2010 security
 

Andere mochten auch

Haskell is Not For Production and Other Tales
Haskell is Not For Production and Other TalesHaskell is Not For Production and Other Tales
Haskell is Not For Production and Other TalesKatie Ots
 
High-Performance Haskell
High-Performance HaskellHigh-Performance Haskell
High-Performance HaskellJohan Tibell
 
Efficient Immutable Data Structures (Okasaki for Dummies)
Efficient Immutable Data Structures (Okasaki for Dummies)Efficient Immutable Data Structures (Okasaki for Dummies)
Efficient Immutable Data Structures (Okasaki for Dummies)Tom Faulhaber
 
Tugas ekonomi islam
Tugas ekonomi islamTugas ekonomi islam
Tugas ekonomi islamAna Tamara
 
Adv 420 vogue Megan Dacey
Adv 420 vogue Megan Dacey Adv 420 vogue Megan Dacey
Adv 420 vogue Megan Dacey Megan Dacey
 
Blue Ocean Strategy - Case Seats2meet.com
Blue Ocean Strategy - Case Seats2meet.comBlue Ocean Strategy - Case Seats2meet.com
Blue Ocean Strategy - Case Seats2meet.comJeroen van der Schenk
 
PRIV by BlackBerry Secure Android Smartphone Advertising Images
PRIV by BlackBerry Secure Android Smartphone Advertising ImagesPRIV by BlackBerry Secure Android Smartphone Advertising Images
PRIV by BlackBerry Secure Android Smartphone Advertising ImagesBlackBerry
 
Designing Online Engagement to Collaborate with Your Community
Designing Online Engagement to Collaborate with Your CommunityDesigning Online Engagement to Collaborate with Your Community
Designing Online Engagement to Collaborate with Your CommunityNTEN
 
Anatomiadelosgrandesvasos 140512182826-phpapp01
Anatomiadelosgrandesvasos 140512182826-phpapp01Anatomiadelosgrandesvasos 140512182826-phpapp01
Anatomiadelosgrandesvasos 140512182826-phpapp01DaniJesus Anillo Quintana
 
Impacto de las TICs en la cultura de la mediación a distancia para la educaci...
Impacto de las TICs en la cultura de la mediación a distancia para la educaci...Impacto de las TICs en la cultura de la mediación a distancia para la educaci...
Impacto de las TICs en la cultura de la mediación a distancia para la educaci...pamela
 
AdvancedSearch101
AdvancedSearch101AdvancedSearch101
AdvancedSearch101Troy Hitt
 
Letter for internship (1)
Letter for internship (1)Letter for internship (1)
Letter for internship (1)badiuzaman
 
Control de Asistencia (Presencia), Planificacion de Horarios para la contrucción
Control de Asistencia (Presencia), Planificacion de Horarios para la contrucciónControl de Asistencia (Presencia), Planificacion de Horarios para la contrucción
Control de Asistencia (Presencia), Planificacion de Horarios para la contrucciónantonio-902
 
インタビュー記事
インタビュー記事インタビュー記事
インタビュー記事Nakayasu
 
amoxicilin determination by Hplc .prepared by :Razhan Salah othman
amoxicilin determination by Hplc .prepared by :Razhan Salah othman amoxicilin determination by Hplc .prepared by :Razhan Salah othman
amoxicilin determination by Hplc .prepared by :Razhan Salah othman shaqlawa institude
 

Andere mochten auch (19)

Haskell is Not For Production and Other Tales
Haskell is Not For Production and Other TalesHaskell is Not For Production and Other Tales
Haskell is Not For Production and Other Tales
 
High-Performance Haskell
High-Performance HaskellHigh-Performance Haskell
High-Performance Haskell
 
Efficient Immutable Data Structures (Okasaki for Dummies)
Efficient Immutable Data Structures (Okasaki for Dummies)Efficient Immutable Data Structures (Okasaki for Dummies)
Efficient Immutable Data Structures (Okasaki for Dummies)
 
Tugas ekonomi islam
Tugas ekonomi islamTugas ekonomi islam
Tugas ekonomi islam
 
Adv 420 vogue Megan Dacey
Adv 420 vogue Megan Dacey Adv 420 vogue Megan Dacey
Adv 420 vogue Megan Dacey
 
Rhona Hutton
Rhona HuttonRhona Hutton
Rhona Hutton
 
Blue Ocean Strategy - Case Seats2meet.com
Blue Ocean Strategy - Case Seats2meet.comBlue Ocean Strategy - Case Seats2meet.com
Blue Ocean Strategy - Case Seats2meet.com
 
Robotique Quebec
Robotique QuebecRobotique Quebec
Robotique Quebec
 
PRIV by BlackBerry Secure Android Smartphone Advertising Images
PRIV by BlackBerry Secure Android Smartphone Advertising ImagesPRIV by BlackBerry Secure Android Smartphone Advertising Images
PRIV by BlackBerry Secure Android Smartphone Advertising Images
 
Designing Online Engagement to Collaborate with Your Community
Designing Online Engagement to Collaborate with Your CommunityDesigning Online Engagement to Collaborate with Your Community
Designing Online Engagement to Collaborate with Your Community
 
Anatomiadelosgrandesvasos 140512182826-phpapp01
Anatomiadelosgrandesvasos 140512182826-phpapp01Anatomiadelosgrandesvasos 140512182826-phpapp01
Anatomiadelosgrandesvasos 140512182826-phpapp01
 
Image180314132400
Image180314132400Image180314132400
Image180314132400
 
Impacto de las TICs en la cultura de la mediación a distancia para la educaci...
Impacto de las TICs en la cultura de la mediación a distancia para la educaci...Impacto de las TICs en la cultura de la mediación a distancia para la educaci...
Impacto de las TICs en la cultura de la mediación a distancia para la educaci...
 
AdvancedSearch101
AdvancedSearch101AdvancedSearch101
AdvancedSearch101
 
Karen Rojas
Karen RojasKaren Rojas
Karen Rojas
 
Letter for internship (1)
Letter for internship (1)Letter for internship (1)
Letter for internship (1)
 
Control de Asistencia (Presencia), Planificacion de Horarios para la contrucción
Control de Asistencia (Presencia), Planificacion de Horarios para la contrucciónControl de Asistencia (Presencia), Planificacion de Horarios para la contrucción
Control de Asistencia (Presencia), Planificacion de Horarios para la contrucción
 
インタビュー記事
インタビュー記事インタビュー記事
インタビュー記事
 
amoxicilin determination by Hplc .prepared by :Razhan Salah othman
amoxicilin determination by Hplc .prepared by :Razhan Salah othman amoxicilin determination by Hplc .prepared by :Razhan Salah othman
amoxicilin determination by Hplc .prepared by :Razhan Salah othman
 

Ähnlich wie Pursuing the Strong, Not So Silent Type: A Haskell Story

Temporary Cache Assistance (Transients API): WordCamp Phoenix 2014
Temporary Cache Assistance (Transients API): WordCamp Phoenix 2014Temporary Cache Assistance (Transients API): WordCamp Phoenix 2014
Temporary Cache Assistance (Transients API): WordCamp Phoenix 2014Cliff Seal
 
Speed Things Up with Transients
Speed Things Up with TransientsSpeed Things Up with Transients
Speed Things Up with TransientsCliff Seal
 
Adventures in Optimization
Adventures in OptimizationAdventures in Optimization
Adventures in OptimizationDavid Golden
 
Introduction à CoffeeScript pour ParisRB
Introduction à CoffeeScript pour ParisRB Introduction à CoffeeScript pour ParisRB
Introduction à CoffeeScript pour ParisRB jhchabran
 
Refactor like a boss
Refactor like a bossRefactor like a boss
Refactor like a bossgsterndale
 
Introdução ao Perl 6
Introdução ao Perl 6Introdução ao Perl 6
Introdução ao Perl 6garux
 
Redis for the Everyday Developer
Redis for the Everyday DeveloperRedis for the Everyday Developer
Redis for the Everyday DeveloperRoss Tuck
 
Php tutorial handout
Php tutorial handoutPhp tutorial handout
Php tutorial handoutSBalan Balan
 
Bag Of Tricks From Iusethis
Bag Of Tricks From IusethisBag Of Tricks From Iusethis
Bag Of Tricks From IusethisMarcus Ramberg
 
Drupal & javascript
Drupal & javascriptDrupal & javascript
Drupal & javascriptAlmog Baku
 
Unit testing with zend framework PHPBenelux
Unit testing with zend framework PHPBeneluxUnit testing with zend framework PHPBenelux
Unit testing with zend framework PHPBeneluxMichelangelo van Dam
 
Unit testing with zend framework tek11
Unit testing with zend framework tek11Unit testing with zend framework tek11
Unit testing with zend framework tek11Michelangelo van Dam
 
Zend Framework Study@Tokyo #2
Zend Framework Study@Tokyo #2Zend Framework Study@Tokyo #2
Zend Framework Study@Tokyo #2Shinya Ohyanagi
 
Learning Perl 6 (NPW 2007)
Learning Perl 6 (NPW 2007)Learning Perl 6 (NPW 2007)
Learning Perl 6 (NPW 2007)brian d foy
 
Desarrollo de módulos en Drupal e integración con dispositivos móviles
Desarrollo de módulos en Drupal e integración con dispositivos móvilesDesarrollo de módulos en Drupal e integración con dispositivos móviles
Desarrollo de módulos en Drupal e integración con dispositivos móvilesLuis Curo Salvatierra
 
Difference between mysql_fetch_array and mysql_fetch_assoc in PHP
Difference between mysql_fetch_array and mysql_fetch_assoc in PHPDifference between mysql_fetch_array and mysql_fetch_assoc in PHP
Difference between mysql_fetch_array and mysql_fetch_assoc in PHPVineet Kumar Saini
 

Ähnlich wie Pursuing the Strong, Not So Silent Type: A Haskell Story (20)

Temporary Cache Assistance (Transients API): WordCamp Phoenix 2014
Temporary Cache Assistance (Transients API): WordCamp Phoenix 2014Temporary Cache Assistance (Transients API): WordCamp Phoenix 2014
Temporary Cache Assistance (Transients API): WordCamp Phoenix 2014
 
Speed Things Up with Transients
Speed Things Up with TransientsSpeed Things Up with Transients
Speed Things Up with Transients
 
Adventures in Optimization
Adventures in OptimizationAdventures in Optimization
Adventures in Optimization
 
Introduction à CoffeeScript pour ParisRB
Introduction à CoffeeScript pour ParisRB Introduction à CoffeeScript pour ParisRB
Introduction à CoffeeScript pour ParisRB
 
Refactor like a boss
Refactor like a bossRefactor like a boss
Refactor like a boss
 
Introdução ao Perl 6
Introdução ao Perl 6Introdução ao Perl 6
Introdução ao Perl 6
 
Redis for the Everyday Developer
Redis for the Everyday DeveloperRedis for the Everyday Developer
Redis for the Everyday Developer
 
Php 101: PDO
Php 101: PDOPhp 101: PDO
Php 101: PDO
 
PHPSpec BDD for PHP
PHPSpec BDD for PHPPHPSpec BDD for PHP
PHPSpec BDD for PHP
 
Php tutorial handout
Php tutorial handoutPhp tutorial handout
Php tutorial handout
 
Bag Of Tricks From Iusethis
Bag Of Tricks From IusethisBag Of Tricks From Iusethis
Bag Of Tricks From Iusethis
 
Mongo à la Resque
Mongo à la ResqueMongo à la Resque
Mongo à la Resque
 
Drupal & javascript
Drupal & javascriptDrupal & javascript
Drupal & javascript
 
Unit testing with zend framework PHPBenelux
Unit testing with zend framework PHPBeneluxUnit testing with zend framework PHPBenelux
Unit testing with zend framework PHPBenelux
 
Unit testing with zend framework tek11
Unit testing with zend framework tek11Unit testing with zend framework tek11
Unit testing with zend framework tek11
 
Zend Framework Study@Tokyo #2
Zend Framework Study@Tokyo #2Zend Framework Study@Tokyo #2
Zend Framework Study@Tokyo #2
 
PHP PPT FILE
PHP PPT FILEPHP PPT FILE
PHP PPT FILE
 
Learning Perl 6 (NPW 2007)
Learning Perl 6 (NPW 2007)Learning Perl 6 (NPW 2007)
Learning Perl 6 (NPW 2007)
 
Desarrollo de módulos en Drupal e integración con dispositivos móviles
Desarrollo de módulos en Drupal e integración con dispositivos móvilesDesarrollo de módulos en Drupal e integración con dispositivos móviles
Desarrollo de módulos en Drupal e integración con dispositivos móviles
 
Difference between mysql_fetch_array and mysql_fetch_assoc in PHP
Difference between mysql_fetch_array and mysql_fetch_assoc in PHPDifference between mysql_fetch_array and mysql_fetch_assoc in PHP
Difference between mysql_fetch_array and mysql_fetch_assoc in PHP
 

Kürzlich hochgeladen

Not a Kubernetes fan? The state of PaaS in 2024
Not a Kubernetes fan? The state of PaaS in 2024Not a Kubernetes fan? The state of PaaS in 2024
Not a Kubernetes fan? The state of PaaS in 2024Anthony Dahanne
 
Enhancing Supply Chain Visibility with Cargo Cloud Solutions.pdf
Enhancing Supply Chain Visibility with Cargo Cloud Solutions.pdfEnhancing Supply Chain Visibility with Cargo Cloud Solutions.pdf
Enhancing Supply Chain Visibility with Cargo Cloud Solutions.pdfRTS corp
 
SoftTeco - Software Development Company Profile
SoftTeco - Software Development Company ProfileSoftTeco - Software Development Company Profile
SoftTeco - Software Development Company Profileakrivarotava
 
Sending Calendar Invites on SES and Calendarsnack.pdf
Sending Calendar Invites on SES and Calendarsnack.pdfSending Calendar Invites on SES and Calendarsnack.pdf
Sending Calendar Invites on SES and Calendarsnack.pdf31events.com
 
Exploring Selenium_Appium Frameworks for Seamless Integration with HeadSpin.pdf
Exploring Selenium_Appium Frameworks for Seamless Integration with HeadSpin.pdfExploring Selenium_Appium Frameworks for Seamless Integration with HeadSpin.pdf
Exploring Selenium_Appium Frameworks for Seamless Integration with HeadSpin.pdfkalichargn70th171
 
SpotFlow: Tracking Method Calls and States at Runtime
SpotFlow: Tracking Method Calls and States at RuntimeSpotFlow: Tracking Method Calls and States at Runtime
SpotFlow: Tracking Method Calls and States at Runtimeandrehoraa
 
Simplifying Microservices & Apps - The art of effortless development - Meetup...
Simplifying Microservices & Apps - The art of effortless development - Meetup...Simplifying Microservices & Apps - The art of effortless development - Meetup...
Simplifying Microservices & Apps - The art of effortless development - Meetup...Rob Geurden
 
Amazon Bedrock in Action - presentation of the Bedrock's capabilities
Amazon Bedrock in Action - presentation of the Bedrock's capabilitiesAmazon Bedrock in Action - presentation of the Bedrock's capabilities
Amazon Bedrock in Action - presentation of the Bedrock's capabilitiesKrzysztofKkol1
 
Global Identity Enrolment and Verification Pro Solution - Cizo Technology Ser...
Global Identity Enrolment and Verification Pro Solution - Cizo Technology Ser...Global Identity Enrolment and Verification Pro Solution - Cizo Technology Ser...
Global Identity Enrolment and Verification Pro Solution - Cizo Technology Ser...Cizo Technology Services
 
Best Angular 17 Classroom & Online training - Naresh IT
Best Angular 17 Classroom & Online training - Naresh ITBest Angular 17 Classroom & Online training - Naresh IT
Best Angular 17 Classroom & Online training - Naresh ITmanoharjgpsolutions
 
Post Quantum Cryptography – The Impact on Identity
Post Quantum Cryptography – The Impact on IdentityPost Quantum Cryptography – The Impact on Identity
Post Quantum Cryptography – The Impact on Identityteam-WIBU
 
Osi security architecture in network.pptx
Osi security architecture in network.pptxOsi security architecture in network.pptx
Osi security architecture in network.pptxVinzoCenzo
 
Strategies for using alternative queries to mitigate zero results
Strategies for using alternative queries to mitigate zero resultsStrategies for using alternative queries to mitigate zero results
Strategies for using alternative queries to mitigate zero resultsJean Silva
 
Tech Tuesday Slides - Introduction to Project Management with OnePlan's Work ...
Tech Tuesday Slides - Introduction to Project Management with OnePlan's Work ...Tech Tuesday Slides - Introduction to Project Management with OnePlan's Work ...
Tech Tuesday Slides - Introduction to Project Management with OnePlan's Work ...OnePlan Solutions
 
What’s New in VictoriaMetrics: Q1 2024 Updates
What’s New in VictoriaMetrics: Q1 2024 UpdatesWhat’s New in VictoriaMetrics: Q1 2024 Updates
What’s New in VictoriaMetrics: Q1 2024 UpdatesVictoriaMetrics
 
SAM Training Session - How to use EXCEL ?
SAM Training Session - How to use EXCEL ?SAM Training Session - How to use EXCEL ?
SAM Training Session - How to use EXCEL ?Alexandre Beguel
 
Tech Tuesday - Mastering Time Management Unlock the Power of OnePlan's Timesh...
Tech Tuesday - Mastering Time Management Unlock the Power of OnePlan's Timesh...Tech Tuesday - Mastering Time Management Unlock the Power of OnePlan's Timesh...
Tech Tuesday - Mastering Time Management Unlock the Power of OnePlan's Timesh...OnePlan Solutions
 
Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...
Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...
Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...Angel Borroy López
 
Real-time Tracking and Monitoring with Cargo Cloud Solutions.pptx
Real-time Tracking and Monitoring with Cargo Cloud Solutions.pptxReal-time Tracking and Monitoring with Cargo Cloud Solutions.pptx
Real-time Tracking and Monitoring with Cargo Cloud Solutions.pptxRTS corp
 
2024 DevNexus Patterns for Resiliency: Shuffle shards
2024 DevNexus Patterns for Resiliency: Shuffle shards2024 DevNexus Patterns for Resiliency: Shuffle shards
2024 DevNexus Patterns for Resiliency: Shuffle shardsChristopher Curtin
 

Kürzlich hochgeladen (20)

Not a Kubernetes fan? The state of PaaS in 2024
Not a Kubernetes fan? The state of PaaS in 2024Not a Kubernetes fan? The state of PaaS in 2024
Not a Kubernetes fan? The state of PaaS in 2024
 
Enhancing Supply Chain Visibility with Cargo Cloud Solutions.pdf
Enhancing Supply Chain Visibility with Cargo Cloud Solutions.pdfEnhancing Supply Chain Visibility with Cargo Cloud Solutions.pdf
Enhancing Supply Chain Visibility with Cargo Cloud Solutions.pdf
 
SoftTeco - Software Development Company Profile
SoftTeco - Software Development Company ProfileSoftTeco - Software Development Company Profile
SoftTeco - Software Development Company Profile
 
Sending Calendar Invites on SES and Calendarsnack.pdf
Sending Calendar Invites on SES and Calendarsnack.pdfSending Calendar Invites on SES and Calendarsnack.pdf
Sending Calendar Invites on SES and Calendarsnack.pdf
 
Exploring Selenium_Appium Frameworks for Seamless Integration with HeadSpin.pdf
Exploring Selenium_Appium Frameworks for Seamless Integration with HeadSpin.pdfExploring Selenium_Appium Frameworks for Seamless Integration with HeadSpin.pdf
Exploring Selenium_Appium Frameworks for Seamless Integration with HeadSpin.pdf
 
SpotFlow: Tracking Method Calls and States at Runtime
SpotFlow: Tracking Method Calls and States at RuntimeSpotFlow: Tracking Method Calls and States at Runtime
SpotFlow: Tracking Method Calls and States at Runtime
 
Simplifying Microservices & Apps - The art of effortless development - Meetup...
Simplifying Microservices & Apps - The art of effortless development - Meetup...Simplifying Microservices & Apps - The art of effortless development - Meetup...
Simplifying Microservices & Apps - The art of effortless development - Meetup...
 
Amazon Bedrock in Action - presentation of the Bedrock's capabilities
Amazon Bedrock in Action - presentation of the Bedrock's capabilitiesAmazon Bedrock in Action - presentation of the Bedrock's capabilities
Amazon Bedrock in Action - presentation of the Bedrock's capabilities
 
Global Identity Enrolment and Verification Pro Solution - Cizo Technology Ser...
Global Identity Enrolment and Verification Pro Solution - Cizo Technology Ser...Global Identity Enrolment and Verification Pro Solution - Cizo Technology Ser...
Global Identity Enrolment and Verification Pro Solution - Cizo Technology Ser...
 
Best Angular 17 Classroom & Online training - Naresh IT
Best Angular 17 Classroom & Online training - Naresh ITBest Angular 17 Classroom & Online training - Naresh IT
Best Angular 17 Classroom & Online training - Naresh IT
 
Post Quantum Cryptography – The Impact on Identity
Post Quantum Cryptography – The Impact on IdentityPost Quantum Cryptography – The Impact on Identity
Post Quantum Cryptography – The Impact on Identity
 
Osi security architecture in network.pptx
Osi security architecture in network.pptxOsi security architecture in network.pptx
Osi security architecture in network.pptx
 
Strategies for using alternative queries to mitigate zero results
Strategies for using alternative queries to mitigate zero resultsStrategies for using alternative queries to mitigate zero results
Strategies for using alternative queries to mitigate zero results
 
Tech Tuesday Slides - Introduction to Project Management with OnePlan's Work ...
Tech Tuesday Slides - Introduction to Project Management with OnePlan's Work ...Tech Tuesday Slides - Introduction to Project Management with OnePlan's Work ...
Tech Tuesday Slides - Introduction to Project Management with OnePlan's Work ...
 
What’s New in VictoriaMetrics: Q1 2024 Updates
What’s New in VictoriaMetrics: Q1 2024 UpdatesWhat’s New in VictoriaMetrics: Q1 2024 Updates
What’s New in VictoriaMetrics: Q1 2024 Updates
 
SAM Training Session - How to use EXCEL ?
SAM Training Session - How to use EXCEL ?SAM Training Session - How to use EXCEL ?
SAM Training Session - How to use EXCEL ?
 
Tech Tuesday - Mastering Time Management Unlock the Power of OnePlan's Timesh...
Tech Tuesday - Mastering Time Management Unlock the Power of OnePlan's Timesh...Tech Tuesday - Mastering Time Management Unlock the Power of OnePlan's Timesh...
Tech Tuesday - Mastering Time Management Unlock the Power of OnePlan's Timesh...
 
Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...
Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...
Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...
 
Real-time Tracking and Monitoring with Cargo Cloud Solutions.pptx
Real-time Tracking and Monitoring with Cargo Cloud Solutions.pptxReal-time Tracking and Monitoring with Cargo Cloud Solutions.pptx
Real-time Tracking and Monitoring with Cargo Cloud Solutions.pptx
 
2024 DevNexus Patterns for Resiliency: Shuffle shards
2024 DevNexus Patterns for Resiliency: Shuffle shards2024 DevNexus Patterns for Resiliency: Shuffle shards
2024 DevNexus Patterns for Resiliency: Shuffle shards
 

Pursuing the Strong, Not So Silent Type: A Haskell Story

  • 1. Pursuing the strong, not so silent type A Haskell story by Katie Miller (@codemiller) Software Engineer at Facebook
  • 2.
  • 3. "The limits of my language mean the limits of my world" - Ludwig Wittgenstein
  • 5. Source: Ruin Raider on Flickr, CC BY-NC-ND 2.0
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11. more than 1 million requests/second
  • 12. def  haskell_spammer(user,  friend,  post)      if  talking_about_haskell(post)  &&                num_common_friends(user,  friend)  <  5  &&                most_friends_like_ruby(friend)          block_post      else          do_nothing      end   end  
  • 14. FXL
  • 18. HaskellSpammer  =      If  (TalkingAboutHaskell(postContent)  &&              NumCommonFriends(userId,  friendId)  <  5  &&              MostFriendsLikeRuby(friendId))          Then  BlockAction  Else  @[]   NumCommonFriends(x,  y)  =      Length(Intersect(FriendsOf(x),  FriendsOf(y)))  
  • 20.
  • 25. haskellSpammer  ::  Haxl  Bool   haskellSpammer  =        talkingAboutHaskell  .&&      numCommonFriends  .<  5  .&&      mostFriendsLikeRuby      where      mostFriendsLikeRuby  =  do          friends  <-­‐  getFriends          rubyFriends  <-­‐  filterM  friendLikesRuby  friends          return  (length  rubyFriends  >=              length  friends  `div`  2)      friendLikesRuby  friend  =          hasAssoc  friend  likeAssoc  rubyPage
  • 27. hasAssoc  ::  Int  -­‐>  Int  -­‐>  Int  -­‐>  Bool   hasAssoc  id  assoc  target  =  ...
  • 28. hasAssoc  ::  Int  -­‐>  Int  -­‐>  Int  -­‐>  Bool   hasAssoc  id  assoc  target  =  ... newtype  Id  =  Id  Int   newtype  AssocId  =  AssocId  Int
  • 29. hasAssoc  ::  Int  -­‐>  Int  -­‐>  Int  -­‐>  Bool   hasAssoc  id  assoc  target  =  ... newtype  Id  =  Id  Int   newtype  AssocId  =  AssocId  Int hasAssoc  ::  Id  -­‐>  AssocId  -­‐>  Id  -­‐>  Bool   hasAssoc  id  assoc  target  =  ...
  • 30. data  Language  =  Ruby  |  Haskell  |  Php
  • 31. data  Language  =  Ruby  |  Haskell  |  Php likesLanguage  ::  Language  -­‐>  Id  -­‐>  Bool
  • 32. data  Language  =  Ruby  |  Haskell  |  Php likesLanguage  ::  Language  -­‐>  Id  -­‐>  Bool likesLanguage  Ruby  userId  =      hasAssoc  userId  likesAssoc  1995  ||      hasAssoc  userId  likesAssoc  2005
  • 33. data  Language  =  Ruby  |  Haskell  |  Php likesLanguage  ::  Language  -­‐>  Id  -­‐>  Bool likesLanguage  Ruby  userId  =      hasAssoc  userId  likesAssoc  1995  ||      hasAssoc  userId  likesAssoc  2005 likesLanguage  Haskell  userId  =      hasAssoc  userId  likesAssoc  42
  • 34. data  Language  =  Ruby  |  Haskell  |  Php likesLanguage  ::  Language  -­‐>  Id  -­‐>  Bool likesLanguage  Ruby  userId  =      hasAssoc  userId  likesAssoc  1995  ||      hasAssoc  userId  likesAssoc  2005 likesLanguage  Haskell  userId  =      hasAssoc  userId  likesAssoc  42 likesLanguage  Php  _  =      False
  • 37.
  • 38. Is Haskell a panacea?
  • 39. blockAustralians  ::  Haxl  SyncResponses   blockAustralians  =  do      textMap  <-­‐  textArr      let  text  =  HashMap.lookupDefault  ""  "main_text"  textMap              numBadWords      =  length  $  filter  (`Text.isInfixOf`  text)  aussieTerms              numBadPhrases  =  length  $  filter  (`Text.isInfixOf`  text)  aussieSayings      if  numBadWords  <  2  &&  numBadPhrases  <=  0      then  return  noResponses      else              if  numBadWords  <  4  &&  numBadPhrases  <  2              then  return  requireCaptcha              else                      if  numBadWords  <  5  &&  numBadPhrases  <  3                      then  return  $  responses  [warnUser,  requireCaptcha]                      else                              if  numBadWords  <  7  &&  numBadPhrases  <  4                              then  return  warnUser                              else                                      if  numBadWords  <  8  &&  numBadPhrases  <  5                                      then  return  $  responses  [warnUser,  blockAccess]                                      else                                              if  numBadWords  <  10  &&  numBadPhrases  <  6                                              then  return  blockAccess                                              else                                                      if  numBadWords  <  13  &&  numBadPhrases  <  7                                                      then  return  $  responses                                                                        [  blockAccess                                                                        ,  enrollInFakeAccountCheckpoint                                                                        ]                                                      else  return  $  responses                                                                        [  blockAccess                                                                        ,  enrollInFakeAccountCheckpoint                                                                        ,  requireCaptcha                                                                        ]          where              aussieTerms  =                      [  "Acca  Dacca"                      ,  "ambo"                      ,  "arvo"                      ,  "Aussie"                      ,  "bangaroo"
  • 40. blockAustralians  ::  Haxl  SyncResponses   blockAustralians  =  do      textMap  <-­‐  textArr      let  text  =  HashMap.lookupDefault  ""  "main_text"  textMap              numBadWords      =  length  $  filter  (`Text.isInfixOf`  text)  aussieTerms              numBadPhrases  =  length  $  filter  (`Text.isInfixOf`  text)  aussieSayings      if  numBadWords  <  2  &&  numBadPhrases  <=  0      then  return  noResponses      else              if  numBadWords  <  4  &&  numBadPhrases  <  2              then  return  requireCaptcha              else                      if  numBadWords  <  5  &&  numBadPhrases  <  3                      then  return  $  responses  [warnUser,  requireCaptcha]                      else                              if  numBadWords  <  7  &&  numBadPhrases  <  4                              then  return  warnUser                              else                                      if  numBadWords  <  8  &&  numBadPhrases  <  5                                      then  return  $  responses  [warnUser,  blockAccess]                                      else                                              if  numBadWords  <  10  &&  numBadPhrases  <  6                                              then  return  blockAccess                                              else                                                      if  numBadWords  <  13  &&  numBadPhrases  <  7                                                      then  return  $  responses                                                                        [  blockAccess                                                                        ,  enrollInFakeAccountCheckpoint                                                                        ]                                                      else  return  $  responses                                                                        [  blockAccess                                                                        ,  enrollInFakeAccountCheckpoint                                                                        ,  requireCaptcha                                                                        ]          where              aussieTerms  =                      [  "Acca  Dacca"                      ,  "ambo"                      ,  "arvo"                      ,  "Aussie"                      ,  "bangaroo"
  • 44. Haxl team past and present Louis Brandy Jonathan Coens Andrew Farmer Kubo Kováč Jake Lengyel Simon Marlow Katie Miller Bartosz Nitka Jon Purdy Aaron Roth Zejun Wu Noam Zilberstein
  • 45. More about Haxl Haxl on GitHub 'Fighting spam with Haskell' blog post 'There is no Fork' ICFP paper and presentation 'The Road to Running Haskell at Facebook Scale' presentation Wired article
  • 46. The End by Katie Miller (@codemiller) Software Engineer at Facebook