The document discusses functional programming concepts in Frege, a purely functional programming language for the JVM. It provides examples of defining and composing functions, pattern matching, lazy evaluation, pure functions, and Java interoperability. It also discusses Frege's type system and use of monads to encapsulate effects like mutation and I/O.
JDD2015: Frege - how to program with pure functions - Dierk KönigPROIDEA
FREGE - HOW TO PROGRAM WITH PURE FUNCTIONS
Frege is a Haskell for the JVM. It is so pure that it does not even have assignments in the language! What sounds silly at first is actually extremely beneficial for code to stay correct under composition, refactoring, and parallel execution. This tutorial touches on the various benefits of this approach but mainly focusses on the practical side of development: how to program with the help of purity and how to make it accessible to Java projects.
Be prepared to see a lot of live coding.
This is a whirlwind tour of the FP land and is primarily meant for developers wanting to embark on their functional programming journey. Java is used to understand most of the concepts, however, where it falls short to explain certain concepts such as lazy evaluation, currying and partial function application, de-structuring and pattern-matching, Scala or Groovy or Clojure or even Haskell are used to demonstrate it.
Inspirations for this presentation were drawn from a couple of sprints in one of our internal projects in which we had the freedom of choosing our own technical solutions.
We go through premature optimisation, silver-bullet antipattern, duplication and null-pointer hell.
In the end other antipatterns are swiftly mentioned.
JDD2015: Frege - how to program with pure functions - Dierk KönigPROIDEA
FREGE - HOW TO PROGRAM WITH PURE FUNCTIONS
Frege is a Haskell for the JVM. It is so pure that it does not even have assignments in the language! What sounds silly at first is actually extremely beneficial for code to stay correct under composition, refactoring, and parallel execution. This tutorial touches on the various benefits of this approach but mainly focusses on the practical side of development: how to program with the help of purity and how to make it accessible to Java projects.
Be prepared to see a lot of live coding.
This is a whirlwind tour of the FP land and is primarily meant for developers wanting to embark on their functional programming journey. Java is used to understand most of the concepts, however, where it falls short to explain certain concepts such as lazy evaluation, currying and partial function application, de-structuring and pattern-matching, Scala or Groovy or Clojure or even Haskell are used to demonstrate it.
Inspirations for this presentation were drawn from a couple of sprints in one of our internal projects in which we had the freedom of choosing our own technical solutions.
We go through premature optimisation, silver-bullet antipattern, duplication and null-pointer hell.
In the end other antipatterns are swiftly mentioned.
Pure functions and immutable objects @dev nexus 2021Victor Rentea
aaaaThis presentation focuses on two of the most advanced design tools in your toolbox, whatever the language or framework you might be using. After understanding the basics, we'll see how these concepts can be used in real-world scenarios to simplify those several most complex use-cases in your application. At the end of a mix of slides and live-coding, you'll finally understand the power of these ideas and become prepared to apply them in your day-to-day work.
Along the way, we'll introduce concepts like Side Effects, Idempotency, Referential Transparency, Pure Functions and Deep/Shallow Immutability. Also, we'll talk about the powerful Functional Code / Imperative Shell architecture that you can use for your complex workflows.
Prepare for an entertaining, highly interactive session that will answer all your questions.
Written in Java and spoken in English.
Le slide deck de l'Université que nous avons donnée avec Rémi Forax à Devoxx France 2019.
Comme promis, Java sort sa version majeure tous les 6 mois. Le train passe et amène son lot de nouveautés. Parmi elles, certaines sont sorties : une nouvelle syntaxe pour les clauses switch et l'instruction de byte code CONSTANT_DYNAMIC. D'autres sont en chantier, plus ou moins avancé : une nouvelle façon d'écrire des méthodes de façon condensée, un instanceof 'intelligent', des constantes évaluées au moment où elles sont utilisées. Les projets progressent. Loom, et son nouveau modèle de programmation concurrente que l'ont peut tester avec Jetty. Amber, qui introduit les data types et des nouvelles syntaxes. Valhalla, dont les value types donnent leurs premiers résultats. S'il est difficile de prévoir une date de sortie pour ces nouveautés, on sait en revanche qu'une fois prêtes elles sortiront en moins de 6 mois. De tout ceci nous parlerons donc au futur et en public, avec des démonstrations de code, des slides, du code, de la joie et de la bonne humeur !
Groovy's AST Transformation is a compile time meta-programming technique and allows developer to hook into compilation process and add new fields or methods, or modify existing methods.
Kotlin is a JVM language developed by Jetbrains. Its version 1.0 (production ready) was released at the beginning of the year and made some buzz within the android community. This session proposes to discover this language, which takes up some aspects of groovy or scala, and that is very close to swift in syntax and concepts. We will see how Kotlin boosts the productivity of Java & Android application development and how well it accompanies reactive development.
What is functional programming? This talk sets out to demystify the functional programming paradigm, debunk common myths, and reveal examples of why FP is advantageous compared to imperative programming.
The Jetbrain's Kotlin language cheat sheet, created by ekito and launched for the Toulouse's devfest - https://www.ekito.fr/people/kotlin-cheat-sheet/
This paper helps you keep the main feature of the Kotlin language, under the hand. Just download it & print it !
Vladimir Romanov - How to write code that is easy to read and change? What should you do when you see a piece of code written years ago which is hard to understand? In my experience, this boils down to 4 principles that I would like to share along with some examples in Apex
Kotlin advanced - language reference for android developersBartosz Kosarzycki
StxNext Lightning Talks - Mar 11, 2016
Kotlin Advanced - language reference for Android developers
This presentation contains the second talk on Kotlin language we had at STXNext. We try go deeper into language specifics and look at the positive impact new syntax can have on boilerplate removal and readability improvement.
Kotlin really shines in Android development when one looks at “Enum translation”, “Extension functions”, “SAM conversions”, “Infix notation”, “Closures” and “Fluent interfaces” applied to lists. The talk, however, compares language-specifics of Java & Kotlin in terms of “Type Variance”, “Generics” and “IDE tools” as well.
We present real-world example based on Stx-Insider project written in Kotlin which incorporates Dagger 2, Kotterknife, Retrofit2 and is composed of 5+ Activities.
Full agenda
Live templates
Enum translation
Calling extension functions from Kotlin/Java
Constructors with backing fields
Warnings
F-bound polymorphism
Variance (Covariance/Contravariance)
Variance comparison in Kotlin/Java/Scala
Annotation processing - KAPT
SAM conversions
Type equality
Lambda vs Closure
Reified generics
Fluent interfaces
Infix notation
Static extension methods in Kotlin
Generic types
Sealed classes
Dokka - documentation in Kotlin
J2K converter
Real-world example
Reflection
Presentation is accompanied with an example project (StxInsider):
https://github.com/kosiara/stx-insider
Software Transactional Memory (STM) in Frege Dierk König
Frege is a Haskell for the JVM. It is a perfect fit for supporting STM as an approach to concurrency since it can guarantee through the type system that transactions are free of side effects and more.
FregeDay: Design and Implementation of the language (Ingo Wechsung)Dierk König
Talk by Ingo Wechsung at the FregeDay 2015, Sept 11th, Basel, Switzerland, covering general characteristics of the language, history, and important design decisions.
Pure functions and immutable objects @dev nexus 2021Victor Rentea
aaaaThis presentation focuses on two of the most advanced design tools in your toolbox, whatever the language or framework you might be using. After understanding the basics, we'll see how these concepts can be used in real-world scenarios to simplify those several most complex use-cases in your application. At the end of a mix of slides and live-coding, you'll finally understand the power of these ideas and become prepared to apply them in your day-to-day work.
Along the way, we'll introduce concepts like Side Effects, Idempotency, Referential Transparency, Pure Functions and Deep/Shallow Immutability. Also, we'll talk about the powerful Functional Code / Imperative Shell architecture that you can use for your complex workflows.
Prepare for an entertaining, highly interactive session that will answer all your questions.
Written in Java and spoken in English.
Le slide deck de l'Université que nous avons donnée avec Rémi Forax à Devoxx France 2019.
Comme promis, Java sort sa version majeure tous les 6 mois. Le train passe et amène son lot de nouveautés. Parmi elles, certaines sont sorties : une nouvelle syntaxe pour les clauses switch et l'instruction de byte code CONSTANT_DYNAMIC. D'autres sont en chantier, plus ou moins avancé : une nouvelle façon d'écrire des méthodes de façon condensée, un instanceof 'intelligent', des constantes évaluées au moment où elles sont utilisées. Les projets progressent. Loom, et son nouveau modèle de programmation concurrente que l'ont peut tester avec Jetty. Amber, qui introduit les data types et des nouvelles syntaxes. Valhalla, dont les value types donnent leurs premiers résultats. S'il est difficile de prévoir une date de sortie pour ces nouveautés, on sait en revanche qu'une fois prêtes elles sortiront en moins de 6 mois. De tout ceci nous parlerons donc au futur et en public, avec des démonstrations de code, des slides, du code, de la joie et de la bonne humeur !
Groovy's AST Transformation is a compile time meta-programming technique and allows developer to hook into compilation process and add new fields or methods, or modify existing methods.
Kotlin is a JVM language developed by Jetbrains. Its version 1.0 (production ready) was released at the beginning of the year and made some buzz within the android community. This session proposes to discover this language, which takes up some aspects of groovy or scala, and that is very close to swift in syntax and concepts. We will see how Kotlin boosts the productivity of Java & Android application development and how well it accompanies reactive development.
What is functional programming? This talk sets out to demystify the functional programming paradigm, debunk common myths, and reveal examples of why FP is advantageous compared to imperative programming.
The Jetbrain's Kotlin language cheat sheet, created by ekito and launched for the Toulouse's devfest - https://www.ekito.fr/people/kotlin-cheat-sheet/
This paper helps you keep the main feature of the Kotlin language, under the hand. Just download it & print it !
Vladimir Romanov - How to write code that is easy to read and change? What should you do when you see a piece of code written years ago which is hard to understand? In my experience, this boils down to 4 principles that I would like to share along with some examples in Apex
Kotlin advanced - language reference for android developersBartosz Kosarzycki
StxNext Lightning Talks - Mar 11, 2016
Kotlin Advanced - language reference for Android developers
This presentation contains the second talk on Kotlin language we had at STXNext. We try go deeper into language specifics and look at the positive impact new syntax can have on boilerplate removal and readability improvement.
Kotlin really shines in Android development when one looks at “Enum translation”, “Extension functions”, “SAM conversions”, “Infix notation”, “Closures” and “Fluent interfaces” applied to lists. The talk, however, compares language-specifics of Java & Kotlin in terms of “Type Variance”, “Generics” and “IDE tools” as well.
We present real-world example based on Stx-Insider project written in Kotlin which incorporates Dagger 2, Kotterknife, Retrofit2 and is composed of 5+ Activities.
Full agenda
Live templates
Enum translation
Calling extension functions from Kotlin/Java
Constructors with backing fields
Warnings
F-bound polymorphism
Variance (Covariance/Contravariance)
Variance comparison in Kotlin/Java/Scala
Annotation processing - KAPT
SAM conversions
Type equality
Lambda vs Closure
Reified generics
Fluent interfaces
Infix notation
Static extension methods in Kotlin
Generic types
Sealed classes
Dokka - documentation in Kotlin
J2K converter
Real-world example
Reflection
Presentation is accompanied with an example project (StxInsider):
https://github.com/kosiara/stx-insider
Software Transactional Memory (STM) in Frege Dierk König
Frege is a Haskell for the JVM. It is a perfect fit for supporting STM as an approach to concurrency since it can guarantee through the type system that transactions are free of side effects and more.
FregeDay: Design and Implementation of the language (Ingo Wechsung)Dierk König
Talk by Ingo Wechsung at the FregeDay 2015, Sept 11th, Basel, Switzerland, covering general characteristics of the language, history, and important design decisions.
Quick into to Software Transactional Memory in FregeDierk König
Frege is a Haskell for the JVM and can as such support STM with all the benefits of a purely functional language. In particular, Frege guarantees through the type system that no transactional variable (TVar) can be accessed outside a transaction and no side effect can happen inside a transaction.
FregeDay: Parallelism in Frege compared to GHC Haskell (Volker Steiss) Dierk König
Frege is a Haskell for the JVM and thus uses the JVM features to implement the Haskell abstractions of parallelism. This leads to some interesting findings regarding absolute performance and relative speedup from parallelism that Volker Steiss presented at the FregeDay 2015, Basel, Switzerland.
Video at https://www.youtube.com/watch?v=S-4sYwGY3Sk
FregeDay: Roadmap for resolving differences between Haskell and Frege (Ingo W...Dierk König
Diskusssion of what kind of differences there are between Haskell 2010 and Frege, how difficult they are to resolve, what their impact is, and what to do about them. Also: how to allow essential differences that will never work outside the JVM and demarcate them from supposed-to-be vanilla Haskell.
JDD2015: Frege - Introducing purely functional programming on the JVM - Dierk...PROIDEA
FREGE - INTRODUCING PURELY FUNCTIONAL PROGRAMMING ON THE JVM
Frege is a Haskell for the JVM. In Frege you program with pure functions, immutable values,
and isolated effects only. This talk gives you a first impression of what this paradigm means to the programmer and how it makes your code robust under composition, allows refactoring without fear, and becomes safe for parallel execution.
This introduction leads you through the benefits that make Frege unique between the JVM languages. It is followed up by the Frege tutorial that provides more detail and examples.
Clojure is a new dialect of LISP that runs on the Java Virtual Machine (JVM). As a functional language, it offers great benefits in terms of programmer productivity; as a language that runs on the JVM, it also offers the opportunity to reuse existing Java libraries. Simon’s interest is in using Clojure to build desktop applications with the Java Swing GUI library. In this presentation Simon discusses how the power of Clojure can be applied to Swing, and whether it hits the sweet spot.
This is the slide for what I shared in JS Group meetup, 2014, Taiwan. It covers what JavaScript could do for making the program more "functional", the benefits, price and the limitation.
This presentation was given online in July 2017 and will be given at the NY Java SIG later this year. It progressively builds on Java 8 concepts using puzzles and coding to give students confidence in their Java 8 stream/lambda skills. Handouts and code in https://github.com/boyarsky/java-8-streams-by-puzzles
ZIO: Powerful and Principled Functional Programming in ScalaWiem Zine Elabidine
This is an introduction of purely functional programming type safe abstractions that provide a variety of features for building asynchronous and concurrent applications data structures built on ZIO.
You'll learn by examples about the power of functional programming to solve the hard problems of software development in a principled, without compromises.
The Art of the Pitch: WordPress Relationships and SalesLaura Byrne
Clients don’t know what they don’t know. What web solutions are right for them? How does WordPress come into the picture? How do you make sure you understand scope and timeline? What do you do if sometime changes?
All these questions and more will be explored as we talk about matching clients’ needs with what your agency offers without pulling teeth or pulling your hair out. Practical tips, and strategies for successful relationship building that leads to closing the deal.
"Impact of front-end architecture on development cost", Viktor TurskyiFwdays
I have heard many times that architecture is not important for the front-end. Also, many times I have seen how developers implement features on the front-end just following the standard rules for a framework and think that this is enough to successfully launch the project, and then the project fails. How to prevent this and what approach to choose? I have launched dozens of complex projects and during the talk we will analyze which approaches have worked for me and which have not.
Builder.ai Founder Sachin Dev Duggal's Strategic Approach to Create an Innova...Ramesh Iyer
In today's fast-changing business world, Companies that adapt and embrace new ideas often need help to keep up with the competition. However, fostering a culture of innovation takes much work. It takes vision, leadership and willingness to take risks in the right proportion. Sachin Dev Duggal, co-founder of Builder.ai, has perfected the art of this balance, creating a company culture where creativity and growth are nurtured at each stage.
Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...Jeffrey Haguewood
Sidekick Solutions uses Bonterra Impact Management (fka Social Solutions Apricot) and automation solutions to integrate data for business workflows.
We believe integration and automation are essential to user experience and the promise of efficient work through technology. Automation is the critical ingredient to realizing that full vision. We develop integration products and services for Bonterra Case Management software to support the deployment of automations for a variety of use cases.
This video focuses on the notifications, alerts, and approval requests using Slack for Bonterra Impact Management. The solutions covered in this webinar can also be deployed for Microsoft Teams.
Interested in deploying notification automations for Bonterra Impact Management? Contact us at sales@sidekicksolutionsllc.com to discuss next steps.
LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...DanBrown980551
Do you want to learn how to model and simulate an electrical network from scratch in under an hour?
Then welcome to this PowSyBl workshop, hosted by Rte, the French Transmission System Operator (TSO)!
During the webinar, you will discover the PowSyBl ecosystem as well as handle and study an electrical network through an interactive Python notebook.
PowSyBl is an open source project hosted by LF Energy, which offers a comprehensive set of features for electrical grid modelling and simulation. Among other advanced features, PowSyBl provides:
- A fully editable and extendable library for grid component modelling;
- Visualization tools to display your network;
- Grid simulation tools, such as power flows, security analyses (with or without remedial actions) and sensitivity analyses;
The framework is mostly written in Java, with a Python binding so that Python developers can access PowSyBl functionalities as well.
What you will learn during the webinar:
- For beginners: discover PowSyBl's functionalities through a quick general presentation and the notebook, without needing any expert coding skills;
- For advanced developers: master the skills to efficiently apply PowSyBl functionalities to your real-world scenarios.
Search and Society: Reimagining Information Access for Radical FuturesBhaskar Mitra
The field of Information retrieval (IR) is currently undergoing a transformative shift, at least partly due to the emerging applications of generative AI to information access. In this talk, we will deliberate on the sociotechnical implications of generative AI for information access. We will argue that there is both a critical necessity and an exciting opportunity for the IR community to re-center our research agendas on societal needs while dismantling the artificial separation between the work on fairness, accountability, transparency, and ethics in IR and the rest of IR research. Instead of adopting a reactionary strategy of trying to mitigate potential social harms from emerging technologies, the community should aim to proactively set the research agenda for the kinds of systems we should build inspired by diverse explicitly stated sociotechnical imaginaries. The sociotechnical imaginaries that underpin the design and development of information access technologies needs to be explicitly articulated, and we need to develop theories of change in context of these diverse perspectives. Our guiding future imaginaries must be informed by other academic fields, such as democratic theory and critical theory, and should be co-developed with social science scholars, legal scholars, civil rights and social justice activists, and artists, among others.
Accelerate your Kubernetes clusters with Varnish CachingThijs Feryn
A presentation about the usage and availability of Varnish on Kubernetes. This talk explores the capabilities of Varnish caching and shows how to use the Varnish Helm chart to deploy it to Kubernetes.
This presentation was delivered at K8SUG Singapore. See https://feryn.eu/presentations/accelerate-your-kubernetes-clusters-with-varnish-caching-k8sug-singapore-28-2024 for more details.
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...James Anderson
Effective Application Security in Software Delivery lifecycle using Deployment Firewall and DBOM
The modern software delivery process (or the CI/CD process) includes many tools, distributed teams, open-source code, and cloud platforms. Constant focus on speed to release software to market, along with the traditional slow and manual security checks has caused gaps in continuous security as an important piece in the software supply chain. Today organizations feel more susceptible to external and internal cyber threats due to the vast attack surface in their applications supply chain and the lack of end-to-end governance and risk management.
The software team must secure its software delivery process to avoid vulnerability and security breaches. This needs to be achieved with existing tool chains and without extensive rework of the delivery processes. This talk will present strategies and techniques for providing visibility into the true risk of the existing vulnerabilities, preventing the introduction of security issues in the software, resolving vulnerabilities in production environments quickly, and capturing the deployment bill of materials (DBOM).
Speakers:
Bob Boule
Robert Boule is a technology enthusiast with PASSION for technology and making things work along with a knack for helping others understand how things work. He comes with around 20 years of solution engineering experience in application security, software continuous delivery, and SaaS platforms. He is known for his dynamic presentations in CI/CD and application security integrated in software delivery lifecycle.
Gopinath Rebala
Gopinath Rebala is the CTO of OpsMx, where he has overall responsibility for the machine learning and data processing architectures for Secure Software Delivery. Gopi also has a strong connection with our customers, leading design and architecture for strategic implementations. Gopi is a frequent speaker and well-known leader in continuous delivery and integrating security into software delivery.
24. Define a Function
frege>
times
a
b
=
a
*
b
frege>
times
3
4
12
frege>
:type
times
Num
α
=>
α
-‐>
α
-‐>
α
25. Define a Function
frege>
times
a
b
=
a
*
b
frege>
(times
3)
4
12
frege>
:type
times
Num
α
=>
α
-‐>(α
-‐>
α)
no types declared
function appl.
left associative
tell the inferred
type
typeclass
only 1
parameter!
return type is
a function!
thumb: „two params
of same numeric type
returning that type“
no comma
27. Reference a Function
frege>
twotimes
=
times
2
frege>
twotimes
3
6
frege>
:t
twotimes
Int
-‐>
Int
No second
argument!
„Currying“, „schönfinkeling“,
or „partial function
application“.
Concept invented by
Gottlob Frege.
inferred types
are more specific
28. Function Composition
frege>
twotimes
(threetimes
2)
12
frege>
sixtimes
=
twotimes
.
threetimes
frege>
sixtimes
2
frege>
:t
sixtimes
Int
-‐>
Int
29. Function Composition
frege>
twotimes
(threetimes
2)
12
frege>
sixtimes
=
twotimes
.
threetimes
frege>
sixtimes
2
frege>
:t
sixtimes
Int
-‐>
Int
f(g(x))
more about this later
(f ° g) (x)
31. Pattern Matching
frege>
times
0
(threetimes
2)
0
frege>
times
0
b
=
0
unnecessarily evaluated
shortcuttingpattern matching
32. Lazy Evaluation
frege>
times
0
(length
[1..])
0
endless sequence
evaluation would never stop
Pattern matching and
non-strict evaluation
to the rescue!
33. Pure Functions
Java
T
foo(Pair<T,U>
p)
{…}
Frege
foo
::
(α,β)
-‐>
α
What could
possibly happen?
What could
possibly happen?
34. Pure Functions
Java
T
foo(Pair<T,U>
p)
{…}
Frege
foo
::
(α,β)
-‐>
α
Everything!
State changes,
file or db access,
missile launch,…
a is returned
35. Pure Functions
can
be
cached
(memoized)
can
be
evaluated
lazily
can
be
evaluated
in
advance
can
be
evaluated
concurrently
can
be
eliminated
in
common
subexpressions
can
be
optimized
38. pure native encode java.net.URLEncoder.encode :: String -> String
encode “Dierk König“
native millis java.lang.System.currentTimeMillis :: () -> IO Long
millis ()
millis ()
past = millis () - 1000
Does not compile!
Frege -> Java
This is a key distinction between Frege and
other JVM languages!
even Java can be pure
40. Type System
Ubiquitous static typing allows
global type inference and thus more
safety and less work for the programmer
You don’t need to specify any types at all!
But sometimes you do anyway…
42. Mutable
I/O
Mutable
Mutable
Keep the mess out!
Pure Computation
Pure Computation
Pure Computation
Ok, these are Monads. Be brave. Think of them as contexts
that the type system propagates and makes un-escapable.
Thread-
safe by
design!
Checked
by
compiler
45. Zipping
addzip
[]
_
=
[]
addzip
_
[]
=
[]
addzip
(x:xs)
(y:ys)
=
(x
+
y
:
addzip
xs
ys
)
use as
addzip
[1,2,3]
[1,2,3]
==
[2,4,6]
Pattern matching
feels like Prolog
Why only for the (+) function?
We could be more general…
47. High Order Functions
zipWith
f
[]
_
=
[]
zipWith
f
_
[]
=
[]
zipWith
f
(x:xs)
(y:ys)
=
(f
x
y
:
zipWith
xs
ys
)
use as
zipWith
(+)
[1,2,3]
[1,2,3]
==
[2,4,6]
and, yes we can now define
addzip
=
zipWith
(+)
invented by Gottlob Frege
53. Frege is different
No More But
state no state (unless declared)
statements expressions (+ „do“ notation)
assignments definitions
variables ST monad as „agent“
interfaces type classes
classes & objects algebraic data types
inheritance parametric polymorphism
null references Maybe
NullPointerExceptions Bottom, error
56. Why Frege
Robustness under parallel execution
Robustness under composition
Robustness under increments
Robustness under refactoring
Enables local and equational reasoning
Best way to learn FP
58. Gottlob
Frege
"As I think about acts of integrity and grace,
I realise that there is nothing in my knowledge
that compares with Frege’s dedication to truth…
It was almost superhuman.“ —Bertrand Russel
"Not many people managed to create a revolution
in thought. Frege did.“ —Graham Priest
Lecture on Gottlob Frege:
http://www.youtube.com/watch?v=foITiYYu2bc