SlideShare une entreprise Scribd logo
1  sur  52
Télécharger pour lire hors ligne
Ajhc Haskell Compiler with 
Reentrant GC
Ajhc Haskell Compiler with 
Reentrant GC
Ajhc Haskell Compiler with 
Reentrant GC
Ajhc Haskell Compiler with 
Reentrant GC
Ajhc Haskell Compiler with
Reentrant GC
Kiwamu Okabe @ Metasepi ProjectKiwamu Okabe @ Metasepi ProjectKiwamu Okabe @ Metasepi ProjectKiwamu Okabe @ Metasepi ProjectKiwamu Okabe @ Metasepi Project
Who am I?Who am I?Who am I?Who am I?Who am I?
☆ http://www.masterq.net/☆ http://www.masterq.net/☆ http://www.masterq.net/☆ http://www.masterq.net/☆ http://www.masterq.net/
☆ Self employed software engineer☆ Self employed software engineer☆ Self employed software engineer☆ Self employed software engineer☆ Self employed software engineer
☆ Trade name := METASEPI DESIGN☆ Trade name := METASEPI DESIGN☆ Trade name := METASEPI DESIGN☆ Trade name := METASEPI DESIGN☆ Trade name := METASEPI DESIGN
☆ Founder of Metasepi Project☆ Founder of Metasepi Project☆ Founder of Metasepi Project☆ Founder of Metasepi Project☆ Founder of Metasepi Project
☆ A Debian Maintainer☆ A Debian Maintainer☆ A Debian Maintainer☆ A Debian Maintainer☆ A Debian Maintainer
☆ 10 years' experience in developing
OS using NetBSD
☆ 10 years' experience in developing
OS using NetBSD
☆ 10 years' experience in developing
OS using NetBSD
☆ 10 years' experience in developing
OS using NetBSD
☆ 10 years' experience in developing
OS using NetBSD
Demo: NetBSD driver in HaskellDemo: NetBSD driver in HaskellDemo: NetBSD driver in HaskellDemo: NetBSD driver in HaskellDemo: NetBSD driver in Haskell
☆ NetBSD audio driver play sound☆ NetBSD audio driver play sound☆ NetBSD audio driver play sound☆ NetBSD audio driver play sound☆ NetBSD audio driver play sound
☆ The driver's interrupt handler
rewrited using Haskell
☆ The driver's interrupt handler
rewrited using Haskell
☆ The driver's interrupt handler
rewrited using Haskell
☆ The driver's interrupt handler
rewrited using Haskell
☆ The driver's interrupt handler
rewrited using Haskell
☆ GC occurs in interrupt handler☆ GC occurs in interrupt handler☆ GC occurs in interrupt handler☆ GC occurs in interrupt handler☆ GC occurs in interrupt handler
☆ Watch the movie at following☆ Watch the movie at following☆ Watch the movie at following☆ Watch the movie at following☆ Watch the movie at following
https://www.youtube.com/watch?v=XEYcR5RG5cAhttps://www.youtube.com/watch?v=XEYcR5RG5cAhttps://www.youtube.com/watch?v=XEYcR5RG5cAhttps://www.youtube.com/watch?v=XEYcR5RG5cAhttps://www.youtube.com/watch?v=XEYcR5RG5cA
☆ Paper for Haskell Symposium 2014☆ Paper for Haskell Symposium 2014☆ Paper for Haskell Symposium 2014☆ Paper for Haskell Symposium 2014☆ Paper for Haskell Symposium 2014
http://metasepi.org/doc/metasepi-icfp2014.pdf
http://metasepi.org/doc/metasepi-icfp2014-demo.pdf
http://metasepi.org/doc/metasepi-icfp2014.pdf
http://metasepi.org/doc/metasepi-icfp2014-demo.pdf
http://metasepi.org/doc/metasepi-icfp2014.pdf
http://metasepi.org/doc/metasepi-icfp2014-demo.pdf
http://metasepi.org/doc/metasepi-icfp2014.pdf
http://metasepi.org/doc/metasepi-icfp2014-demo.pdf
http://metasepi.org/doc/metasepi-icfp2014.pdf
http://metasepi.org/doc/metasepi-icfp2014-demo.pdf
AgendaAgendaAgendaAgendaAgenda
☆ [1] Demo: NetBSD driver in Haskell☆ [1] Demo: NetBSD driver in Haskell☆ [1] Demo: NetBSD driver in Haskell☆ [1] Demo: NetBSD driver in Haskell☆ [1] Demo: NetBSD driver in Haskell
☆ [2] What's Metasepi?☆ [2] What's Metasepi?☆ [2] What's Metasepi?☆ [2] What's Metasepi?☆ [2] What's Metasepi?
☆ [3] What's Ajhc compiler?☆ [3] What's Ajhc compiler?☆ [3] What's Ajhc compiler?☆ [3] What's Ajhc compiler?☆ [3] What's Ajhc compiler?
☆ [4] Reentrancy and Context☆ [4] Reentrancy and Context☆ [4] Reentrancy and Context☆ [4] Reentrancy and Context☆ [4] Reentrancy and Context
☆ [5] Context Local Heap (CLHs)☆ [5] Context Local Heap (CLHs)☆ [5] Context Local Heap (CLHs)☆ [5] Context Local Heap (CLHs)☆ [5] Context Local Heap (CLHs)
☆ [6] How to write Haskell driver?☆ [6] How to write Haskell driver?☆ [6] How to write Haskell driver?☆ [6] How to write Haskell driver?☆ [6] How to write Haskell driver?
☆ [7] What's coming next?☆ [7] What's coming next?☆ [7] What's coming next?☆ [7] What's coming next?☆ [7] What's coming next?
[2] What's Metasepi?[2] What's Metasepi?[2] What's Metasepi?[2] What's Metasepi?[2] What's Metasepi?
http://metasepi.org/http://metasepi.org/http://metasepi.org/http://metasepi.org/http://metasepi.org/
☆ Unix-like OS designed by strong type.☆ Unix-like OS designed by strong type.☆ Unix-like OS designed by strong type.☆ Unix-like OS designed by strong type.☆ Unix-like OS designed by strong type.
☆ Using ML or more strong type lang.☆ Using ML or more strong type lang.☆ Using ML or more strong type lang.☆ Using ML or more strong type lang.☆ Using ML or more strong type lang.
Haskell http://www.haskell.org/Haskell http://www.haskell.org/Haskell http://www.haskell.org/Haskell http://www.haskell.org/Haskell http://www.haskell.org/
OCaml http://caml.inria.fr/OCaml http://caml.inria.fr/OCaml http://caml.inria.fr/OCaml http://caml.inria.fr/OCaml http://caml.inria.fr/
MLton http://mlton.org/MLton http://mlton.org/MLton http://mlton.org/MLton http://mlton.org/MLton http://mlton.org/
. . . and suchlike.. . . and suchlike.. . . and suchlike.. . . and suchlike.. . . and suchlike.
Why need Metasepi?Why need Metasepi?Why need Metasepi?Why need Metasepi?Why need Metasepi?
☆ We have already Linux or Windows.☆ We have already Linux or Windows.☆ We have already Linux or Windows.☆ We have already Linux or Windows.☆ We have already Linux or Windows.
☆ But the developers are suffering.☆ But the developers are suffering.☆ But the developers are suffering.☆ But the developers are suffering.☆ But the developers are suffering.
☆ If use the kernel changed by you,☆ If use the kernel changed by you,☆ If use the kernel changed by you,☆ If use the kernel changed by you,☆ If use the kernel changed by you,
☆ you will get many runtime error.☆ you will get many runtime error.☆ you will get many runtime error.☆ you will get many runtime error.☆ you will get many runtime error.
☆ Difficult even to reproduce it.☆ Difficult even to reproduce it.☆ Difficult even to reproduce it.☆ Difficult even to reproduce it.☆ Difficult even to reproduce it.
Doesn't OSS have good quality?Doesn't OSS have good quality?Doesn't OSS have good quality?Doesn't OSS have good quality?Doesn't OSS have good quality?
☆ "The Cathedral and the Bazaar"☆ "The Cathedral and the Bazaar"☆ "The Cathedral and the Bazaar"☆ "The Cathedral and the Bazaar"☆ "The Cathedral and the Bazaar"
☆ "Given enough eyeballs, all bugs are
shallow."
☆ "Given enough eyeballs, all bugs are
shallow."
☆ "Given enough eyeballs, all bugs are
shallow."
☆ "Given enough eyeballs, all bugs are
shallow."
☆ "Given enough eyeballs, all bugs are
shallow."
http://cruel.org/freeware/cathedral.htmlhttp://cruel.org/freeware/cathedral.htmlhttp://cruel.org/freeware/cathedral.htmlhttp://cruel.org/freeware/cathedral.htmlhttp://cruel.org/freeware/cathedral.html
☆ But if you develop your own product
re-using OSS...
☆ But if you develop your own product
re-using OSS...
☆ But if you develop your own product
re-using OSS...
☆ But if you develop your own product
re-using OSS...
☆ But if you develop your own product
re-using OSS...
Low quality out of OSS umbrellaLow quality out of OSS umbrellaLow quality out of OSS umbrellaLow quality out of OSS umbrellaLow quality out of OSS umbrella
Type safetyType safetyType safetyType safetyType safety
☆ Less runtime errors.☆ Less runtime errors.☆ Less runtime errors.☆ Less runtime errors.☆ Less runtime errors.
☆ "数理科学的バグ撲滅方法論のすすめ"☆ "数理科学的バグ撲滅方法論のすすめ"☆ "数理科学的バグ撲滅方法論のすすめ"☆ "数理科学的バグ撲滅方法論のすすめ"☆ "数理科学的バグ撲滅方法論のすすめ"
http://itpro.nikkeibp.co.jp/article/COLUMN/20060915/248230/http://itpro.nikkeibp.co.jp/article/COLUMN/20060915/248230/http://itpro.nikkeibp.co.jp/article/COLUMN/20060915/248230/http://itpro.nikkeibp.co.jp/article/COLUMN/20060915/248230/http://itpro.nikkeibp.co.jp/article/COLUMN/20060915/248230/
Kernel wants type desperatelyKernel wants type desperatelyKernel wants type desperatelyKernel wants type desperatelyKernel wants type desperately
☆ Kernels are developed with C lang.☆ Kernels are developed with C lang.☆ Kernels are developed with C lang.☆ Kernels are developed with C lang.☆ Kernels are developed with C lang.
☆ Error on user space => SEGV☆ Error on user space => SEGV☆ Error on user space => SEGV☆ Error on user space => SEGV☆ Error on user space => SEGV
☆ Error on kernel space => Halt!☆ Error on kernel space => Halt!☆ Error on kernel space => Halt!☆ Error on kernel space => Halt!☆ Error on kernel space => Halt!
☆ Should design kernel with the
greatest care.
☆ Should design kernel with the
greatest care.
☆ Should design kernel with the
greatest care.
☆ Should design kernel with the
greatest care.
☆ Should design kernel with the
greatest care.
☆ C language is safe?☆ C language is safe?☆ C language is safe?☆ C language is safe?☆ C language is safe?
Remember Heartbleed bug?Remember Heartbleed bug?Remember Heartbleed bug?Remember Heartbleed bug?Remember Heartbleed bug?
Should we use safer language than C?Should we use safer language than C?Should we use safer language than C?Should we use safer language than C?Should we use safer language than C?
== In English ==
"Preventing heartbleed bugs with safe programming languages"
http://bluishcoder.co.nz/2014/04/11/preventing-heartbleed-bugs-
with-safe-languages.html
== In Japanease ==
"安全なプログラミング言語を使って heartbleed を防ぐには"
https://github.com/jats-ug/translate/blob/master/Web/
bluishcoder.co.nz/2014/04/11/preventing-heartbleed-bugs-with-safe-
languages.md
== In English ==
"Preventing heartbleed bugs with safe programming languages"
http://bluishcoder.co.nz/2014/04/11/preventing-heartbleed-bugs-
with-safe-languages.html
== In Japanease ==
"安全なプログラミング言語を使って heartbleed を防ぐには"
https://github.com/jats-ug/translate/blob/master/Web/
bluishcoder.co.nz/2014/04/11/preventing-heartbleed-bugs-with-safe-
languages.md
== In English ==
"Preventing heartbleed bugs with safe programming languages"
http://bluishcoder.co.nz/2014/04/11/preventing-heartbleed-bugs-
with-safe-languages.html
== In Japanease ==
"安全なプログラミング言語を使って heartbleed を防ぐには"
https://github.com/jats-ug/translate/blob/master/Web/
bluishcoder.co.nz/2014/04/11/preventing-heartbleed-bugs-with-safe-
languages.md
== In English ==
"Preventing heartbleed bugs with safe programming languages"
http://bluishcoder.co.nz/2014/04/11/preventing-heartbleed-bugs-
with-safe-languages.html
== In Japanease ==
"安全なプログラミング言語を使って heartbleed を防ぐには"
https://github.com/jats-ug/translate/blob/master/Web/
bluishcoder.co.nz/2014/04/11/preventing-heartbleed-bugs-with-safe-
languages.md
== In English ==
"Preventing heartbleed bugs with safe programming languages"
http://bluishcoder.co.nz/2014/04/11/preventing-heartbleed-bugs-
with-safe-languages.html
== In Japanease ==
"安全なプログラミング言語を使って heartbleed を防ぐには"
https://github.com/jats-ug/translate/blob/master/Web/
bluishcoder.co.nz/2014/04/11/preventing-heartbleed-bugs-with-safe-
languages.md
"A safer systems programming language
could have prevented the bug."
"A safer systems programming language
could have prevented the bug."
"A safer systems programming language
could have prevented the bug."
"A safer systems programming language
could have prevented the bug."
"A safer systems programming language
could have prevented the bug."
[3] What's Ajhc compiler?[3] What's Ajhc compiler?[3] What's Ajhc compiler?[3] What's Ajhc compiler?[3] What's Ajhc compiler?
http://ajhc.metasepi.org/http://ajhc.metasepi.org/http://ajhc.metasepi.org/http://ajhc.metasepi.org/http://ajhc.metasepi.org/
☆ Ajhc := Arafura designed jhc☆ Ajhc := Arafura designed jhc☆ Ajhc := Arafura designed jhc☆ Ajhc := Arafura designed jhc☆ Ajhc := Arafura designed jhc
☆ jhc := John's Haskell Compiler☆ jhc := John's Haskell Compiler☆ jhc := John's Haskell Compiler☆ jhc := John's Haskell Compiler☆ jhc := John's Haskell Compiler
☆ http://repetae.net/computer/jhc/☆ http://repetae.net/computer/jhc/☆ http://repetae.net/computer/jhc/☆ http://repetae.net/computer/jhc/☆ http://repetae.net/computer/jhc/
☆ Jhc outputs binary that has low-
memory-footprint and runs fast.
☆ Jhc outputs binary that has low-
memory-footprint and runs fast.
☆ Jhc outputs binary that has low-
memory-footprint and runs fast.
☆ Jhc outputs binary that has low-
memory-footprint and runs fast.
☆ Jhc outputs binary that has low-
memory-footprint and runs fast.
Who is John?Who is John?Who is John?Who is John?Who is John?
☆ John Meacham☆ John Meacham☆ John Meacham☆ John Meacham☆ John Meacham
☆ http://repetae.net/☆ http://repetae.net/☆ http://repetae.net/☆ http://repetae.net/☆ http://repetae.net/
Why choose jhc?Why choose jhc?Why choose jhc?Why choose jhc?Why choose jhc?
Programs to print "hoge" on terminal.
The lesser depends on POSIX, the
smaller values.
Programs to print "hoge" on terminal.
The lesser depends on POSIX, the
smaller values.
Programs to print "hoge" on terminal.
The lesser depends on POSIX, the
smaller values.
Programs to print "hoge" on terminal.
The lesser depends on POSIX, the
smaller values.
Programs to print "hoge" on terminal.
The lesser depends on POSIX, the
smaller values.
Jhc is translator to C languageJhc is translator to C languageJhc is translator to C languageJhc is translator to C languageJhc is translator to C language
[4] Reentrancy and Context[4] Reentrancy and Context[4] Reentrancy and Context[4] Reentrancy and Context[4] Reentrancy and Context
☆ Metasepi needs language
implementation supporting reentrancy.
☆ Metasepi needs language
implementation supporting reentrancy.
☆ Metasepi needs language
implementation supporting reentrancy.
☆ Metasepi needs language
implementation supporting reentrancy.
☆ Metasepi needs language
implementation supporting reentrancy.
☆ Why?☆ Why?☆ Why?☆ Why?☆ Why?
Why need Reentrancy?Why need Reentrancy?Why need Reentrancy?Why need Reentrancy?Why need Reentrancy?
☆ There are 2 way for multitasking☆ There are 2 way for multitasking☆ There are 2 way for multitasking☆ There are 2 way for multitasking☆ There are 2 way for multitasking
☆ [A] Nonpreemptive multitasking☆ [A] Nonpreemptive multitasking☆ [A] Nonpreemptive multitasking☆ [A] Nonpreemptive multitasking☆ [A] Nonpreemptive multitasking
☆ [B] Preemptive multitasking☆ [B] Preemptive multitasking☆ [B] Preemptive multitasking☆ [B] Preemptive multitasking☆ [B] Preemptive multitasking
☆ Unix-like OS needs [B]☆ Unix-like OS needs [B]☆ Unix-like OS needs [B]☆ Unix-like OS needs [B]☆ Unix-like OS needs [B]
☆ [B] needs the hardware interrupts☆ [B] needs the hardware interrupts☆ [B] needs the hardware interrupts☆ [B] needs the hardware interrupts☆ [B] needs the hardware interrupts
☆ Interrupt handler should be reentrant☆ Interrupt handler should be reentrant☆ Interrupt handler should be reentrant☆ Interrupt handler should be reentrant☆ Interrupt handler should be reentrant
What's Reentrancy?What's Reentrancy?What's Reentrancy?What's Reentrancy?What's Reentrancy?
Reentrant code can be interrupted in the middle of its execution
and then safely called again ("re-entered") before its previous
invocations complete execution.
Reentrant code can be interrupted in the middle of its execution
and then safely called again ("re-entered") before its previous
invocations complete execution.
Reentrant code can be interrupted in the middle of its execution
and then safely called again ("re-entered") before its previous
invocations complete execution.
Reentrant code can be interrupted in the middle of its execution
and then safely called again ("re-entered") before its previous
invocations complete execution.
Reentrant code can be interrupted in the middle of its execution
and then safely called again ("re-entered") before its previous
invocations complete execution.
What's Context on C language?What's Context on C language?What's Context on C language?What's Context on C language?What's Context on C language?
☆ A set of registers and call stacks☆ A set of registers and call stacks☆ A set of registers and call stacks☆ A set of registers and call stacks☆ A set of registers and call stacks
Where Context come from?Where Context come from?Where Context come from?Where Context come from?Where Context come from?
What's Context switch?What's Context switch?What's Context switch?What's Context switch?What's Context switch?
The process of storing and restoring the state (context) of a
process or thread so that execution can be resumed from the same
point at a later time.
The process of storing and restoring the state (context) of a
process or thread so that execution can be resumed from the same
point at a later time.
The process of storing and restoring the state (context) of a
process or thread so that execution can be resumed from the same
point at a later time.
The process of storing and restoring the state (context) of a
process or thread so that execution can be resumed from the same
point at a later time.
The process of storing and restoring the state (context) of a
process or thread so that execution can be resumed from the same
point at a later time.
Support reentrancy with GCSupport reentrancy with GCSupport reentrancy with GCSupport reentrancy with GCSupport reentrancy with GC
☆ Metasepi uses strongly typed
language
☆ Metasepi uses strongly typed
language
☆ Metasepi uses strongly typed
language
☆ Metasepi uses strongly typed
language
☆ Metasepi uses strongly typed
language
☆ Strongly typed language sometimes
needs GC
☆ Strongly typed language sometimes
needs GC
☆ Strongly typed language sometimes
needs GC
☆ Strongly typed language sometimes
needs GC
☆ Strongly typed language sometimes
needs GC
☆ Most languages doesn't support
reentrancy with GC
☆ Most languages doesn't support
reentrancy with GC
☆ Most languages doesn't support
reentrancy with GC
☆ Most languages doesn't support
reentrancy with GC
☆ Most languages doesn't support
reentrancy with GC
☆ How to support reentrancy with GC?☆ How to support reentrancy with GC?☆ How to support reentrancy with GC?☆ How to support reentrancy with GC?☆ How to support reentrancy with GC?
Problem: Interrupt and GCProblem: Interrupt and GCProblem: Interrupt and GCProblem: Interrupt and GCProblem: Interrupt and GC
[5] Context Local Heap (CLHs)[5] Context Local Heap (CLHs)[5] Context Local Heap (CLHs)[5] Context Local Heap (CLHs)[5] Context Local Heap (CLHs)
☆ Idea: Isolate contexts by local heap☆ Idea: Isolate contexts by local heap☆ Idea: Isolate contexts by local heap☆ Idea: Isolate contexts by local heap☆ Idea: Isolate contexts by local heap
Isolated contexts are reentrant?Isolated contexts are reentrant?Isolated contexts are reentrant?Isolated contexts are reentrant?Isolated contexts are reentrant?
Let's define "Haskell Context"Let's define "Haskell Context"Let's define "Haskell Context"Let's define "Haskell Context"Let's define "Haskell Context"
Haskell Context on jhcHaskell Context on jhcHaskell Context on jhcHaskell Context on jhcHaskell Context on jhc
Haskell Context life cycle (jhc)Haskell Context life cycle (jhc)Haskell Context life cycle (jhc)Haskell Context life cycle (jhc)Haskell Context life cycle (jhc)
Interaction with C on jhcInteraction with C on jhcInteraction with C on jhcInteraction with C on jhcInteraction with C on jhc
Haskell Context on AjhcHaskell Context on AjhcHaskell Context on AjhcHaskell Context on AjhcHaskell Context on Ajhc
Haskell Context life cycle (Ajhc)Haskell Context life cycle (Ajhc)Haskell Context life cycle (Ajhc)Haskell Context life cycle (Ajhc)Haskell Context life cycle (Ajhc)
Interaction with C on AjhcInteraction with C on AjhcInteraction with C on AjhcInteraction with C on AjhcInteraction with C on Ajhc
[6] How to write Haskell driver?[6] How to write Haskell driver?[6] How to write Haskell driver?[6] How to write Haskell driver?[6] How to write Haskell driver?
☆ Language: Ajhc Haskell compiler☆ Language: Ajhc Haskell compiler☆ Language: Ajhc Haskell compiler☆ Language: Ajhc Haskell compiler☆ Language: Ajhc Haskell compiler
☆ Base code: NetBSD kernel☆ Base code: NetBSD kernel☆ Base code: NetBSD kernel☆ Base code: NetBSD kernel☆ Base code: NetBSD kernel
☆ Method: Snatch-driven development☆ Method: Snatch-driven development☆ Method: Snatch-driven development☆ Method: Snatch-driven development☆ Method: Snatch-driven development
Snatch-driven development #1Snatch-driven development #1Snatch-driven development #1Snatch-driven development #1Snatch-driven development #1
http://en.wikipedia.org/wiki/Snatcherhttp://en.wikipedia.org/wiki/Snatcherhttp://en.wikipedia.org/wiki/Snatcherhttp://en.wikipedia.org/wiki/Snatcherhttp://en.wikipedia.org/wiki/Snatcher
Snatch-driven development #2Snatch-driven development #2Snatch-driven development #2Snatch-driven development #2Snatch-driven development #2
To access out of GC heepTo access out of GC heepTo access out of GC heepTo access out of GC heepTo access out of GC heep
Generate code to access C structGenerate code to access C structGenerate code to access C structGenerate code to access C structGenerate code to access C struct
https://github.com/ajhc/struct2hshttps://github.com/ajhc/struct2hshttps://github.com/ajhc/struct2hshttps://github.com/ajhc/struct2hshttps://github.com/ajhc/struct2hs
$ struct2hs sys/dev/pci/auich_extern_SNATCHED.h | tail$ struct2hs sys/dev/pci/auich_extern_SNATCHED.h | tail$ struct2hs sys/dev/pci/auich_extern_SNATCHED.h | tail$ struct2hs sys/dev/pci/auich_extern_SNATCHED.h | tail$ struct2hs sys/dev/pci/auich_extern_SNATCHED.h | tail
offsetOf_Pdevinit_pdev_attach :: Int
p_Pdevinit_pdev_attach :: Ptr Pdevinit -> IO (Ptr (Ptr (FunPtr
(Int -> IO ()))))
p_Pdevinit_pdev_attach p = return $ plusPtr p $
offsetOf_Pdevinit_pdev_attach
foreign import ccall "dynamic" call_Pdevinit_pdev_attach ::
FunPtr (Int -> IO ()) -> Int -> IO ()
foreign import primitive "const.offsetof(struct pdevinit,
pdev_count)"
offsetOf_Pdevinit_pdev_count :: Int
p_Pdevinit_pdev_count :: Ptr Pdevinit -> IO (Ptr Int)
p_Pdevinit_pdev_count p = return $ plusPtr p $
offsetOf_Pdevinit_pdev_count
offsetOf_Pdevinit_pdev_attach :: Int
p_Pdevinit_pdev_attach :: Ptr Pdevinit -> IO (Ptr (Ptr (FunPtr
(Int -> IO ()))))
p_Pdevinit_pdev_attach p = return $ plusPtr p $
offsetOf_Pdevinit_pdev_attach
foreign import ccall "dynamic" call_Pdevinit_pdev_attach ::
FunPtr (Int -> IO ()) -> Int -> IO ()
foreign import primitive "const.offsetof(struct pdevinit,
pdev_count)"
offsetOf_Pdevinit_pdev_count :: Int
p_Pdevinit_pdev_count :: Ptr Pdevinit -> IO (Ptr Int)
p_Pdevinit_pdev_count p = return $ plusPtr p $
offsetOf_Pdevinit_pdev_count
offsetOf_Pdevinit_pdev_attach :: Int
p_Pdevinit_pdev_attach :: Ptr Pdevinit -> IO (Ptr (Ptr (FunPtr
(Int -> IO ()))))
p_Pdevinit_pdev_attach p = return $ plusPtr p $
offsetOf_Pdevinit_pdev_attach
foreign import ccall "dynamic" call_Pdevinit_pdev_attach ::
FunPtr (Int -> IO ()) -> Int -> IO ()
foreign import primitive "const.offsetof(struct pdevinit,
pdev_count)"
offsetOf_Pdevinit_pdev_count :: Int
p_Pdevinit_pdev_count :: Ptr Pdevinit -> IO (Ptr Int)
p_Pdevinit_pdev_count p = return $ plusPtr p $
offsetOf_Pdevinit_pdev_count
offsetOf_Pdevinit_pdev_attach :: Int
p_Pdevinit_pdev_attach :: Ptr Pdevinit -> IO (Ptr (Ptr (FunPtr
(Int -> IO ()))))
p_Pdevinit_pdev_attach p = return $ plusPtr p $
offsetOf_Pdevinit_pdev_attach
foreign import ccall "dynamic" call_Pdevinit_pdev_attach ::
FunPtr (Int -> IO ()) -> Int -> IO ()
foreign import primitive "const.offsetof(struct pdevinit,
pdev_count)"
offsetOf_Pdevinit_pdev_count :: Int
p_Pdevinit_pdev_count :: Ptr Pdevinit -> IO (Ptr Int)
p_Pdevinit_pdev_count p = return $ plusPtr p $
offsetOf_Pdevinit_pdev_count
offsetOf_Pdevinit_pdev_attach :: Int
p_Pdevinit_pdev_attach :: Ptr Pdevinit -> IO (Ptr (Ptr (FunPtr
(Int -> IO ()))))
p_Pdevinit_pdev_attach p = return $ plusPtr p $
offsetOf_Pdevinit_pdev_attach
foreign import ccall "dynamic" call_Pdevinit_pdev_attach ::
FunPtr (Int -> IO ()) -> Int -> IO ()
foreign import primitive "const.offsetof(struct pdevinit,
pdev_count)"
offsetOf_Pdevinit_pdev_count :: Int
p_Pdevinit_pdev_count :: Ptr Pdevinit -> IO (Ptr Int)
p_Pdevinit_pdev_count p = return $ plusPtr p $
offsetOf_Pdevinit_pdev_count
Access C struct in kernelAccess C struct in kernelAccess C struct in kernelAccess C struct in kernelAccess C struct in kernel
/* C code */
static int
auich_set_port(void *v, mixer_ctrl_t *cp)
{
struct auich_softc *sc;
sc = v;
return sc->codec_if->vtbl->mixer_set_port(sc->codec_if, cp);
}
/* C code */
static int
auich_set_port(void *v, mixer_ctrl_t *cp)
{
struct auich_softc *sc;
sc = v;
return sc->codec_if->vtbl->mixer_set_port(sc->codec_if, cp);
}
/* C code */
static int
auich_set_port(void *v, mixer_ctrl_t *cp)
{
struct auich_softc *sc;
sc = v;
return sc->codec_if->vtbl->mixer_set_port(sc->codec_if, cp);
}
/* C code */
static int
auich_set_port(void *v, mixer_ctrl_t *cp)
{
struct auich_softc *sc;
sc = v;
return sc->codec_if->vtbl->mixer_set_port(sc->codec_if, cp);
}
/* C code */
static int
auich_set_port(void *v, mixer_ctrl_t *cp)
{
struct auich_softc *sc;
sc = v;
return sc->codec_if->vtbl->mixer_set_port(sc->codec_if, cp);
}
-- Haskell code
foreign export ccall "auichSetPort"
auichSetPort :: Ptr AuichSoftc -> Ptr MixerCtrl -> IO Int
auichSetPort :: Ptr AuichSoftc -> Ptr MixerCtrl -> IO Int
auichSetPort sc cp = do
codecif <- peek =<< p_AuichSoftc_codec_if sc
f <- peek =<< p_Ac97CodecIfVtbl_mixer_set_port =<< peek
=<< p_Ac97CodecIf_vtbl codecif
call_Ac97CodecIfVtbl_mixer_set_port f codecif cp
-- Haskell code
foreign export ccall "auichSetPort"
auichSetPort :: Ptr AuichSoftc -> Ptr MixerCtrl -> IO Int
auichSetPort :: Ptr AuichSoftc -> Ptr MixerCtrl -> IO Int
auichSetPort sc cp = do
codecif <- peek =<< p_AuichSoftc_codec_if sc
f <- peek =<< p_Ac97CodecIfVtbl_mixer_set_port =<< peek
=<< p_Ac97CodecIf_vtbl codecif
call_Ac97CodecIfVtbl_mixer_set_port f codecif cp
-- Haskell code
foreign export ccall "auichSetPort"
auichSetPort :: Ptr AuichSoftc -> Ptr MixerCtrl -> IO Int
auichSetPort :: Ptr AuichSoftc -> Ptr MixerCtrl -> IO Int
auichSetPort sc cp = do
codecif <- peek =<< p_AuichSoftc_codec_if sc
f <- peek =<< p_Ac97CodecIfVtbl_mixer_set_port =<< peek
=<< p_Ac97CodecIf_vtbl codecif
call_Ac97CodecIfVtbl_mixer_set_port f codecif cp
-- Haskell code
foreign export ccall "auichSetPort"
auichSetPort :: Ptr AuichSoftc -> Ptr MixerCtrl -> IO Int
auichSetPort :: Ptr AuichSoftc -> Ptr MixerCtrl -> IO Int
auichSetPort sc cp = do
codecif <- peek =<< p_AuichSoftc_codec_if sc
f <- peek =<< p_Ac97CodecIfVtbl_mixer_set_port =<< peek
=<< p_Ac97CodecIf_vtbl codecif
call_Ac97CodecIfVtbl_mixer_set_port f codecif cp
-- Haskell code
foreign export ccall "auichSetPort"
auichSetPort :: Ptr AuichSoftc -> Ptr MixerCtrl -> IO Int
auichSetPort :: Ptr AuichSoftc -> Ptr MixerCtrl -> IO Int
auichSetPort sc cp = do
codecif <- peek =<< p_AuichSoftc_codec_if sc
f <- peek =<< p_Ac97CodecIfVtbl_mixer_set_port =<< peek
=<< p_Ac97CodecIf_vtbl codecif
call_Ac97CodecIfVtbl_mixer_set_port f codecif cp
AC'97 sound driverAC'97 sound driverAC'97 sound driverAC'97 sound driverAC'97 sound driver
HD Audio sound driverHD Audio sound driverHD Audio sound driverHD Audio sound driverHD Audio sound driver
BenchmarkBenchmarkBenchmarkBenchmarkBenchmark
(O) Original NetBSD 6.1.2 kernel
(S) The kernel includes AC'97 and HD Audio driver snatched by Ajhc
(N) (S) + using naive GC
(B4) (S) + having GC block 16 Byte
(B5) (S) + having GC block 32 Byte
(B6) (S) + having GC block 64 Byte
(O) Original NetBSD 6.1.2 kernel
(S) The kernel includes AC'97 and HD Audio driver snatched by Ajhc
(N) (S) + using naive GC
(B4) (S) + having GC block 16 Byte
(B5) (S) + having GC block 32 Byte
(B6) (S) + having GC block 64 Byte
(O) Original NetBSD 6.1.2 kernel
(S) The kernel includes AC'97 and HD Audio driver snatched by Ajhc
(N) (S) + using naive GC
(B4) (S) + having GC block 16 Byte
(B5) (S) + having GC block 32 Byte
(B6) (S) + having GC block 64 Byte
(O) Original NetBSD 6.1.2 kernel
(S) The kernel includes AC'97 and HD Audio driver snatched by Ajhc
(N) (S) + using naive GC
(B4) (S) + having GC block 16 Byte
(B5) (S) + having GC block 32 Byte
(B6) (S) + having GC block 64 Byte
(O) Original NetBSD 6.1.2 kernel
(S) The kernel includes AC'97 and HD Audio driver snatched by Ajhc
(N) (S) + using naive GC
(B4) (S) + having GC block 16 Byte
(B5) (S) + having GC block 32 Byte
(B6) (S) + having GC block 64 Byte
[7] What's coming next?[7] What's coming next?[7] What's coming next?[7] What's coming next?[7] What's coming next?
What's ATS language?What's ATS language?What's ATS language?What's ATS language?What's ATS language?
http://www.ats-lang.org/http://www.ats-lang.org/http://www.ats-lang.org/http://www.ats-lang.org/http://www.ats-lang.org/
☆ Dependent types☆ Dependent types☆ Dependent types☆ Dependent types☆ Dependent types
☆ Linear types☆ Linear types☆ Linear types☆ Linear types☆ Linear types
☆ Without any runtime☆ Without any runtime☆ Without any runtime☆ Without any runtime☆ Without any runtime
☆ Optional GC☆ Optional GC☆ Optional GC☆ Optional GC☆ Optional GC
☆ Developing at Boston University☆ Developing at Boston University☆ Developing at Boston University☆ Developing at Boston University☆ Developing at Boston University
☆ Designer := Hongwei Xi☆ Designer := Hongwei Xi☆ Designer := Hongwei Xi☆ Designer := Hongwei Xi☆ Designer := Hongwei Xi
Hongwei said... (cont.)Hongwei said... (cont.)Hongwei said... (cont.)Hongwei said... (cont.)Hongwei said... (cont.)
Date: Mon Dec 23 11:40 JST 2013
Hi Metasepi-chan,
I spent quite some time today browsing metasepi.org.
I am really interested in your Metasepi project, partly because I
myself wanted to implement NetBSD in ATS about 5 years ago.
Unfortunately, I never had time to get the project started as I
needed to spend so much time on ATS2. By the way, I had planned to
use the very same approach which you call "Snatch". I had also
considered Minix but I chose NetBSD because it was a real OS.
I think I know first-handedly the dilemma you are currently in. On
one hand, you want to be able to fully focus on writing the
kernel. On the other hand, you also need to add features to Ajhc
constantly to address all kinds of issues that keep popping up,
which undoubtedly makes it very difficult for you to focus.
Date: Mon Dec 23 11:40 JST 2013
Hi Metasepi-chan,
I spent quite some time today browsing metasepi.org.
I am really interested in your Metasepi project, partly because I
myself wanted to implement NetBSD in ATS about 5 years ago.
Unfortunately, I never had time to get the project started as I
needed to spend so much time on ATS2. By the way, I had planned to
use the very same approach which you call "Snatch". I had also
considered Minix but I chose NetBSD because it was a real OS.
I think I know first-handedly the dilemma you are currently in. On
one hand, you want to be able to fully focus on writing the
kernel. On the other hand, you also need to add features to Ajhc
constantly to address all kinds of issues that keep popping up,
which undoubtedly makes it very difficult for you to focus.
Date: Mon Dec 23 11:40 JST 2013
Hi Metasepi-chan,
I spent quite some time today browsing metasepi.org.
I am really interested in your Metasepi project, partly because I
myself wanted to implement NetBSD in ATS about 5 years ago.
Unfortunately, I never had time to get the project started as I
needed to spend so much time on ATS2. By the way, I had planned to
use the very same approach which you call "Snatch". I had also
considered Minix but I chose NetBSD because it was a real OS.
I think I know first-handedly the dilemma you are currently in. On
one hand, you want to be able to fully focus on writing the
kernel. On the other hand, you also need to add features to Ajhc
constantly to address all kinds of issues that keep popping up,
which undoubtedly makes it very difficult for you to focus.
Date: Mon Dec 23 11:40 JST 2013
Hi Metasepi-chan,
I spent quite some time today browsing metasepi.org.
I am really interested in your Metasepi project, partly because I
myself wanted to implement NetBSD in ATS about 5 years ago.
Unfortunately, I never had time to get the project started as I
needed to spend so much time on ATS2. By the way, I had planned to
use the very same approach which you call "Snatch". I had also
considered Minix but I chose NetBSD because it was a real OS.
I think I know first-handedly the dilemma you are currently in. On
one hand, you want to be able to fully focus on writing the
kernel. On the other hand, you also need to add features to Ajhc
constantly to address all kinds of issues that keep popping up,
which undoubtedly makes it very difficult for you to focus.
Date: Mon Dec 23 11:40 JST 2013
Hi Metasepi-chan,
I spent quite some time today browsing metasepi.org.
I am really interested in your Metasepi project, partly because I
myself wanted to implement NetBSD in ATS about 5 years ago.
Unfortunately, I never had time to get the project started as I
needed to spend so much time on ATS2. By the way, I had planned to
use the very same approach which you call "Snatch". I had also
considered Minix but I chose NetBSD because it was a real OS.
I think I know first-handedly the dilemma you are currently in. On
one hand, you want to be able to fully focus on writing the
kernel. On the other hand, you also need to add features to Ajhc
constantly to address all kinds of issues that keep popping up,
which undoubtedly makes it very difficult for you to focus.
Hongwei said... (cont.)Hongwei said... (cont.)Hongwei said... (cont.)Hongwei said... (cont.)Hongwei said... (cont.)
I would highly recommend that you use ATS to implement NetBSD
kernel. Unlike jhc, there is no semantics gap between ATS and C.
In particular, they both use the same native unboxed data
representation. Once you become familiar with ATS, you can readily
visualize the C code that your ATS source is to be compiled into.
ATS is truly an ideal language for the kind of "Snatch" approach
you want to take to re-write NetBSD. If you take the lead, then I
will be happy to "chip in" :)
I also spent some time reading documentation on jhc. Personally, I
feel that there is simply too much uncertainty to use it in real
kernel implementation. Features like GC could make the kernel
highly unpredictable, scaring away potential users.
I think that we both believe C is the right language for systems
programming. The problem with C is that it is too difficult to
write correct C programs. ATS is designed to allow the programmer
to correctly write the kind of C programs he or she wanted to
write in the first place. While jhc generates C code, the kind of
C code it generates may not be suited for kernel. This is what I
call a semantics gap.
I would highly recommend that you use ATS to implement NetBSD
kernel. Unlike jhc, there is no semantics gap between ATS and C.
In particular, they both use the same native unboxed data
representation. Once you become familiar with ATS, you can readily
visualize the C code that your ATS source is to be compiled into.
ATS is truly an ideal language for the kind of "Snatch" approach
you want to take to re-write NetBSD. If you take the lead, then I
will be happy to "chip in" :)
I also spent some time reading documentation on jhc. Personally, I
feel that there is simply too much uncertainty to use it in real
kernel implementation. Features like GC could make the kernel
highly unpredictable, scaring away potential users.
I think that we both believe C is the right language for systems
programming. The problem with C is that it is too difficult to
write correct C programs. ATS is designed to allow the programmer
to correctly write the kind of C programs he or she wanted to
write in the first place. While jhc generates C code, the kind of
C code it generates may not be suited for kernel. This is what I
call a semantics gap.
I would highly recommend that you use ATS to implement NetBSD
kernel. Unlike jhc, there is no semantics gap between ATS and C.
In particular, they both use the same native unboxed data
representation. Once you become familiar with ATS, you can readily
visualize the C code that your ATS source is to be compiled into.
ATS is truly an ideal language for the kind of "Snatch" approach
you want to take to re-write NetBSD. If you take the lead, then I
will be happy to "chip in" :)
I also spent some time reading documentation on jhc. Personally, I
feel that there is simply too much uncertainty to use it in real
kernel implementation. Features like GC could make the kernel
highly unpredictable, scaring away potential users.
I think that we both believe C is the right language for systems
programming. The problem with C is that it is too difficult to
write correct C programs. ATS is designed to allow the programmer
to correctly write the kind of C programs he or she wanted to
write in the first place. While jhc generates C code, the kind of
C code it generates may not be suited for kernel. This is what I
call a semantics gap.
I would highly recommend that you use ATS to implement NetBSD
kernel. Unlike jhc, there is no semantics gap between ATS and C.
In particular, they both use the same native unboxed data
representation. Once you become familiar with ATS, you can readily
visualize the C code that your ATS source is to be compiled into.
ATS is truly an ideal language for the kind of "Snatch" approach
you want to take to re-write NetBSD. If you take the lead, then I
will be happy to "chip in" :)
I also spent some time reading documentation on jhc. Personally, I
feel that there is simply too much uncertainty to use it in real
kernel implementation. Features like GC could make the kernel
highly unpredictable, scaring away potential users.
I think that we both believe C is the right language for systems
programming. The problem with C is that it is too difficult to
write correct C programs. ATS is designed to allow the programmer
to correctly write the kind of C programs he or she wanted to
write in the first place. While jhc generates C code, the kind of
C code it generates may not be suited for kernel. This is what I
call a semantics gap.
I would highly recommend that you use ATS to implement NetBSD
kernel. Unlike jhc, there is no semantics gap between ATS and C.
In particular, they both use the same native unboxed data
representation. Once you become familiar with ATS, you can readily
visualize the C code that your ATS source is to be compiled into.
ATS is truly an ideal language for the kind of "Snatch" approach
you want to take to re-write NetBSD. If you take the lead, then I
will be happy to "chip in" :)
I also spent some time reading documentation on jhc. Personally, I
feel that there is simply too much uncertainty to use it in real
kernel implementation. Features like GC could make the kernel
highly unpredictable, scaring away potential users.
I think that we both believe C is the right language for systems
programming. The problem with C is that it is too difficult to
write correct C programs. ATS is designed to allow the programmer
to correctly write the kind of C programs he or she wanted to
write in the first place. While jhc generates C code, the kind of
C code it generates may not be suited for kernel. This is what I
call a semantics gap.
Hongwei said...Hongwei said...Hongwei said...Hongwei said...Hongwei said...
I write this message in the hope that we could join effort in
doing something that has not been done up to now: Writing a real
kernel in (largely) functional style that can truly deliever
safety-wise as well as performance-wise.
Cheers,
--Hongwei
I write this message in the hope that we could join effort in
doing something that has not been done up to now: Writing a real
kernel in (largely) functional style that can truly deliever
safety-wise as well as performance-wise.
Cheers,
--Hongwei
I write this message in the hope that we could join effort in
doing something that has not been done up to now: Writing a real
kernel in (largely) functional style that can truly deliever
safety-wise as well as performance-wise.
Cheers,
--Hongwei
I write this message in the hope that we could join effort in
doing something that has not been done up to now: Writing a real
kernel in (largely) functional style that can truly deliever
safety-wise as well as performance-wise.
Cheers,
--Hongwei
I write this message in the hope that we could join effort in
doing something that has not been done up to now: Writing a real
kernel in (largely) functional style that can truly deliever
safety-wise as well as performance-wise.
Cheers,
--Hongwei
Follow me!Follow me!Follow me!Follow me!Follow me!
☆ http://jats-ug.metasepi.org/☆ http://jats-ug.metasepi.org/☆ http://jats-ug.metasepi.org/☆ http://jats-ug.metasepi.org/☆ http://jats-ug.metasepi.org/
☆ https://twitter.com/jats_ug☆ https://twitter.com/jats_ug☆ https://twitter.com/jats_ug☆ https://twitter.com/jats_ug☆ https://twitter.com/jats_ug
License of photos used #1License of photos used #1License of photos used #1License of photos used #1License of photos used #1
* ゴミ収集車 | Flickr - Photo Sharing!
https://www.flickr.com/photos/shuto/8816770503/
Copyright: 2013 Shuto Araki / License: CC BY 2.0
* Hooded Cuttlefish | Flickr - Photo Sharing!
https://www.flickr.com/photos/silkebaron/931247866/
Copyright: 2007 Silke Baron / License: CC BY 2.0
* Hooded Cuttlefish | Flickr - Photo Sharing!
https://www.flickr.com/photos/silkebaron/931381358/
Copyright: 2007 Silke Baron / License: CC BY 2.0
* Javi Recio y David Cabrera | Flickr - Photo Sharing!
https://www.flickr.com/photos/otakumunidad/5787704531/
Copyright: 2011 Otakumunidad Damned / License: CC BY 2.0
* Obsolete CDs | Flickr - Photo Sharing!
https://www.flickr.com/photos/automaciej/203064118
Copyright: 2006 Maciej Bliziński / License: CC BY-SA 2.0
* Рынок / Bazaar | Flickr - Photo Sharing!
https://www.flickr.com/photos/atbaker/81637
Copyright: 2004 Adam Baker / License: CC BY 2.0
* Cheonggyecheon Umbrellas | Flickr - Photo Sharing!
https://www.flickr.com/photos/traveloriented/13436873274
Copyright: 2014 travel oriented / License: CC BY-SA 2.0
* ゴミ収集車 | Flickr - Photo Sharing!
https://www.flickr.com/photos/shuto/8816770503/
Copyright: 2013 Shuto Araki / License: CC BY 2.0
* Hooded Cuttlefish | Flickr - Photo Sharing!
https://www.flickr.com/photos/silkebaron/931247866/
Copyright: 2007 Silke Baron / License: CC BY 2.0
* Hooded Cuttlefish | Flickr - Photo Sharing!
https://www.flickr.com/photos/silkebaron/931381358/
Copyright: 2007 Silke Baron / License: CC BY 2.0
* Javi Recio y David Cabrera | Flickr - Photo Sharing!
https://www.flickr.com/photos/otakumunidad/5787704531/
Copyright: 2011 Otakumunidad Damned / License: CC BY 2.0
* Obsolete CDs | Flickr - Photo Sharing!
https://www.flickr.com/photos/automaciej/203064118
Copyright: 2006 Maciej Bliziński / License: CC BY-SA 2.0
* Рынок / Bazaar | Flickr - Photo Sharing!
https://www.flickr.com/photos/atbaker/81637
Copyright: 2004 Adam Baker / License: CC BY 2.0
* Cheonggyecheon Umbrellas | Flickr - Photo Sharing!
https://www.flickr.com/photos/traveloriented/13436873274
Copyright: 2014 travel oriented / License: CC BY-SA 2.0
* ゴミ収集車 | Flickr - Photo Sharing!
https://www.flickr.com/photos/shuto/8816770503/
Copyright: 2013 Shuto Araki / License: CC BY 2.0
* Hooded Cuttlefish | Flickr - Photo Sharing!
https://www.flickr.com/photos/silkebaron/931247866/
Copyright: 2007 Silke Baron / License: CC BY 2.0
* Hooded Cuttlefish | Flickr - Photo Sharing!
https://www.flickr.com/photos/silkebaron/931381358/
Copyright: 2007 Silke Baron / License: CC BY 2.0
* Javi Recio y David Cabrera | Flickr - Photo Sharing!
https://www.flickr.com/photos/otakumunidad/5787704531/
Copyright: 2011 Otakumunidad Damned / License: CC BY 2.0
* Obsolete CDs | Flickr - Photo Sharing!
https://www.flickr.com/photos/automaciej/203064118
Copyright: 2006 Maciej Bliziński / License: CC BY-SA 2.0
* Рынок / Bazaar | Flickr - Photo Sharing!
https://www.flickr.com/photos/atbaker/81637
Copyright: 2004 Adam Baker / License: CC BY 2.0
* Cheonggyecheon Umbrellas | Flickr - Photo Sharing!
https://www.flickr.com/photos/traveloriented/13436873274
Copyright: 2014 travel oriented / License: CC BY-SA 2.0
* ゴミ収集車 | Flickr - Photo Sharing!
https://www.flickr.com/photos/shuto/8816770503/
Copyright: 2013 Shuto Araki / License: CC BY 2.0
* Hooded Cuttlefish | Flickr - Photo Sharing!
https://www.flickr.com/photos/silkebaron/931247866/
Copyright: 2007 Silke Baron / License: CC BY 2.0
* Hooded Cuttlefish | Flickr - Photo Sharing!
https://www.flickr.com/photos/silkebaron/931381358/
Copyright: 2007 Silke Baron / License: CC BY 2.0
* Javi Recio y David Cabrera | Flickr - Photo Sharing!
https://www.flickr.com/photos/otakumunidad/5787704531/
Copyright: 2011 Otakumunidad Damned / License: CC BY 2.0
* Obsolete CDs | Flickr - Photo Sharing!
https://www.flickr.com/photos/automaciej/203064118
Copyright: 2006 Maciej Bliziński / License: CC BY-SA 2.0
* Рынок / Bazaar | Flickr - Photo Sharing!
https://www.flickr.com/photos/atbaker/81637
Copyright: 2004 Adam Baker / License: CC BY 2.0
* Cheonggyecheon Umbrellas | Flickr - Photo Sharing!
https://www.flickr.com/photos/traveloriented/13436873274
Copyright: 2014 travel oriented / License: CC BY-SA 2.0
* ゴミ収集車 | Flickr - Photo Sharing!
https://www.flickr.com/photos/shuto/8816770503/
Copyright: 2013 Shuto Araki / License: CC BY 2.0
* Hooded Cuttlefish | Flickr - Photo Sharing!
https://www.flickr.com/photos/silkebaron/931247866/
Copyright: 2007 Silke Baron / License: CC BY 2.0
* Hooded Cuttlefish | Flickr - Photo Sharing!
https://www.flickr.com/photos/silkebaron/931381358/
Copyright: 2007 Silke Baron / License: CC BY 2.0
* Javi Recio y David Cabrera | Flickr - Photo Sharing!
https://www.flickr.com/photos/otakumunidad/5787704531/
Copyright: 2011 Otakumunidad Damned / License: CC BY 2.0
* Obsolete CDs | Flickr - Photo Sharing!
https://www.flickr.com/photos/automaciej/203064118
Copyright: 2006 Maciej Bliziński / License: CC BY-SA 2.0
* Рынок / Bazaar | Flickr - Photo Sharing!
https://www.flickr.com/photos/atbaker/81637
Copyright: 2004 Adam Baker / License: CC BY 2.0
* Cheonggyecheon Umbrellas | Flickr - Photo Sharing!
https://www.flickr.com/photos/traveloriented/13436873274
Copyright: 2014 travel oriented / License: CC BY-SA 2.0
License of photos used #2License of photos used #2License of photos used #2License of photos used #2License of photos used #2
* Jordan shooting Jenna with shield | Flickr - Photo Sharing!
https://www.flickr.com/photos/jasoneppink/80772834
Copyright: 2005 Jason Eppink / License: CC BY 2.0
* Imagine a world without trees | Flickr - Photo Sharing!
https://www.flickr.com/photos/aloshbennett/3480223314
Copyright: 2009 Alosh Bennett / License: CC BY 2.0
* Soyuz TM-19 Re-entry Capsule | Flickr - Photo Sharing!
https://www.flickr.com/photos/pasukaru76/10543300415
Copyright: 2013 Pascal / License: CC BY 2.0
* Do You Know Where Your Valves Are? | Flickr - Photo Sharing!
https://www.flickr.com/photos/thristian/371670597
Copyright: 2007 Timothy Allen / License: CC BY-SA 2.0
* Whirlpool | Flickr - Photo Sharing!
https://www.flickr.com/photos/59195512@N00/4697467290
Copyright: 2010 The Mighty Tim Inconnu / License: CC BY 2.0
* jumping for the sunset | Flickr - Photo Sharing!
https://www.flickr.com/photos/jorgempf/233188420
Copyright: 2006 Jorge / License: CC BY-SA 2.0
* DIY: Shutter Release Switch for Canon DSLRs | Flickr - Photo
Sharing!
https://www.flickr.com/photos/ivyfield/4763965911
Copyright: 2010 Yutaka Tsutano / License: CC BY 2.0
* Jordan shooting Jenna with shield | Flickr - Photo Sharing!
https://www.flickr.com/photos/jasoneppink/80772834
Copyright: 2005 Jason Eppink / License: CC BY 2.0
* Imagine a world without trees | Flickr - Photo Sharing!
https://www.flickr.com/photos/aloshbennett/3480223314
Copyright: 2009 Alosh Bennett / License: CC BY 2.0
* Soyuz TM-19 Re-entry Capsule | Flickr - Photo Sharing!
https://www.flickr.com/photos/pasukaru76/10543300415
Copyright: 2013 Pascal / License: CC BY 2.0
* Do You Know Where Your Valves Are? | Flickr - Photo Sharing!
https://www.flickr.com/photos/thristian/371670597
Copyright: 2007 Timothy Allen / License: CC BY-SA 2.0
* Whirlpool | Flickr - Photo Sharing!
https://www.flickr.com/photos/59195512@N00/4697467290
Copyright: 2010 The Mighty Tim Inconnu / License: CC BY 2.0
* jumping for the sunset | Flickr - Photo Sharing!
https://www.flickr.com/photos/jorgempf/233188420
Copyright: 2006 Jorge / License: CC BY-SA 2.0
* DIY: Shutter Release Switch for Canon DSLRs | Flickr - Photo
Sharing!
https://www.flickr.com/photos/ivyfield/4763965911
Copyright: 2010 Yutaka Tsutano / License: CC BY 2.0
* Jordan shooting Jenna with shield | Flickr - Photo Sharing!
https://www.flickr.com/photos/jasoneppink/80772834
Copyright: 2005 Jason Eppink / License: CC BY 2.0
* Imagine a world without trees | Flickr - Photo Sharing!
https://www.flickr.com/photos/aloshbennett/3480223314
Copyright: 2009 Alosh Bennett / License: CC BY 2.0
* Soyuz TM-19 Re-entry Capsule | Flickr - Photo Sharing!
https://www.flickr.com/photos/pasukaru76/10543300415
Copyright: 2013 Pascal / License: CC BY 2.0
* Do You Know Where Your Valves Are? | Flickr - Photo Sharing!
https://www.flickr.com/photos/thristian/371670597
Copyright: 2007 Timothy Allen / License: CC BY-SA 2.0
* Whirlpool | Flickr - Photo Sharing!
https://www.flickr.com/photos/59195512@N00/4697467290
Copyright: 2010 The Mighty Tim Inconnu / License: CC BY 2.0
* jumping for the sunset | Flickr - Photo Sharing!
https://www.flickr.com/photos/jorgempf/233188420
Copyright: 2006 Jorge / License: CC BY-SA 2.0
* DIY: Shutter Release Switch for Canon DSLRs | Flickr - Photo
Sharing!
https://www.flickr.com/photos/ivyfield/4763965911
Copyright: 2010 Yutaka Tsutano / License: CC BY 2.0
* Jordan shooting Jenna with shield | Flickr - Photo Sharing!
https://www.flickr.com/photos/jasoneppink/80772834
Copyright: 2005 Jason Eppink / License: CC BY 2.0
* Imagine a world without trees | Flickr - Photo Sharing!
https://www.flickr.com/photos/aloshbennett/3480223314
Copyright: 2009 Alosh Bennett / License: CC BY 2.0
* Soyuz TM-19 Re-entry Capsule | Flickr - Photo Sharing!
https://www.flickr.com/photos/pasukaru76/10543300415
Copyright: 2013 Pascal / License: CC BY 2.0
* Do You Know Where Your Valves Are? | Flickr - Photo Sharing!
https://www.flickr.com/photos/thristian/371670597
Copyright: 2007 Timothy Allen / License: CC BY-SA 2.0
* Whirlpool | Flickr - Photo Sharing!
https://www.flickr.com/photos/59195512@N00/4697467290
Copyright: 2010 The Mighty Tim Inconnu / License: CC BY 2.0
* jumping for the sunset | Flickr - Photo Sharing!
https://www.flickr.com/photos/jorgempf/233188420
Copyright: 2006 Jorge / License: CC BY-SA 2.0
* DIY: Shutter Release Switch for Canon DSLRs | Flickr - Photo
Sharing!
https://www.flickr.com/photos/ivyfield/4763965911
Copyright: 2010 Yutaka Tsutano / License: CC BY 2.0
* Jordan shooting Jenna with shield | Flickr - Photo Sharing!
https://www.flickr.com/photos/jasoneppink/80772834
Copyright: 2005 Jason Eppink / License: CC BY 2.0
* Imagine a world without trees | Flickr - Photo Sharing!
https://www.flickr.com/photos/aloshbennett/3480223314
Copyright: 2009 Alosh Bennett / License: CC BY 2.0
* Soyuz TM-19 Re-entry Capsule | Flickr - Photo Sharing!
https://www.flickr.com/photos/pasukaru76/10543300415
Copyright: 2013 Pascal / License: CC BY 2.0
* Do You Know Where Your Valves Are? | Flickr - Photo Sharing!
https://www.flickr.com/photos/thristian/371670597
Copyright: 2007 Timothy Allen / License: CC BY-SA 2.0
* Whirlpool | Flickr - Photo Sharing!
https://www.flickr.com/photos/59195512@N00/4697467290
Copyright: 2010 The Mighty Tim Inconnu / License: CC BY 2.0
* jumping for the sunset | Flickr - Photo Sharing!
https://www.flickr.com/photos/jorgempf/233188420
Copyright: 2006 Jorge / License: CC BY-SA 2.0
* DIY: Shutter Release Switch for Canon DSLRs | Flickr - Photo
Sharing!
https://www.flickr.com/photos/ivyfield/4763965911
Copyright: 2010 Yutaka Tsutano / License: CC BY 2.0
License of photos used #3License of photos used #3License of photos used #3License of photos used #3License of photos used #3
* 72C Duna SHEER MADNESS Lab Re-entry | Flickr - Photo Sharing!
https://www.flickr.com/photos/39416639@N02/12702229414
Copyright: 2014 TheBullethead / License: CC BY 2.0
* Supernova Remnant W49B | Flickr - Photo Sharing!
https://www.flickr.com/photos/gsfc/4479812068
Copyright: 2009 NASA Goddard Space Flight Center / License: CC
BY 2.0
* The Great Wall of China | Flickr - Photo Sharing!
https://www.flickr.com/photos/kk/2149165957
Copyright: 2007 kris krüg / License: CC BY-SA 2.0
* Headshift business card discussion | Flickr - Photo Sharing!
https://www.flickr.com/photos/criminalintent/2744040362
Copyright: 2008 Lars Plougmann / License: CC BY-SA 2.0
* Bali Indonesia | Flickr - Photo Sharing!
https://www.flickr.com/photos/julzart/9266448615
Copyright: 2013 julia Chapple / License: CC BY 2.0
* Scuba diving Indonesia - Bali - Komodo - Bunaken 2008 | Flickr -
Photo Sharing!
https://www.flickr.com/photos/39891373@N07/3666275538
Copyright: 2008 Ilse Reijs and Jan-Noud Hutten / License: CC BY
2.0
* 72C Duna SHEER MADNESS Lab Re-entry | Flickr - Photo Sharing!
https://www.flickr.com/photos/39416639@N02/12702229414
Copyright: 2014 TheBullethead / License: CC BY 2.0
* Supernova Remnant W49B | Flickr - Photo Sharing!
https://www.flickr.com/photos/gsfc/4479812068
Copyright: 2009 NASA Goddard Space Flight Center / License: CC
BY 2.0
* The Great Wall of China | Flickr - Photo Sharing!
https://www.flickr.com/photos/kk/2149165957
Copyright: 2007 kris krüg / License: CC BY-SA 2.0
* Headshift business card discussion | Flickr - Photo Sharing!
https://www.flickr.com/photos/criminalintent/2744040362
Copyright: 2008 Lars Plougmann / License: CC BY-SA 2.0
* Bali Indonesia | Flickr - Photo Sharing!
https://www.flickr.com/photos/julzart/9266448615
Copyright: 2013 julia Chapple / License: CC BY 2.0
* Scuba diving Indonesia - Bali - Komodo - Bunaken 2008 | Flickr -
Photo Sharing!
https://www.flickr.com/photos/39891373@N07/3666275538
Copyright: 2008 Ilse Reijs and Jan-Noud Hutten / License: CC BY
2.0
* 72C Duna SHEER MADNESS Lab Re-entry | Flickr - Photo Sharing!
https://www.flickr.com/photos/39416639@N02/12702229414
Copyright: 2014 TheBullethead / License: CC BY 2.0
* Supernova Remnant W49B | Flickr - Photo Sharing!
https://www.flickr.com/photos/gsfc/4479812068
Copyright: 2009 NASA Goddard Space Flight Center / License: CC
BY 2.0
* The Great Wall of China | Flickr - Photo Sharing!
https://www.flickr.com/photos/kk/2149165957
Copyright: 2007 kris krüg / License: CC BY-SA 2.0
* Headshift business card discussion | Flickr - Photo Sharing!
https://www.flickr.com/photos/criminalintent/2744040362
Copyright: 2008 Lars Plougmann / License: CC BY-SA 2.0
* Bali Indonesia | Flickr - Photo Sharing!
https://www.flickr.com/photos/julzart/9266448615
Copyright: 2013 julia Chapple / License: CC BY 2.0
* Scuba diving Indonesia - Bali - Komodo - Bunaken 2008 | Flickr -
Photo Sharing!
https://www.flickr.com/photos/39891373@N07/3666275538
Copyright: 2008 Ilse Reijs and Jan-Noud Hutten / License: CC BY
2.0
* 72C Duna SHEER MADNESS Lab Re-entry | Flickr - Photo Sharing!
https://www.flickr.com/photos/39416639@N02/12702229414
Copyright: 2014 TheBullethead / License: CC BY 2.0
* Supernova Remnant W49B | Flickr - Photo Sharing!
https://www.flickr.com/photos/gsfc/4479812068
Copyright: 2009 NASA Goddard Space Flight Center / License: CC
BY 2.0
* The Great Wall of China | Flickr - Photo Sharing!
https://www.flickr.com/photos/kk/2149165957
Copyright: 2007 kris krüg / License: CC BY-SA 2.0
* Headshift business card discussion | Flickr - Photo Sharing!
https://www.flickr.com/photos/criminalintent/2744040362
Copyright: 2008 Lars Plougmann / License: CC BY-SA 2.0
* Bali Indonesia | Flickr - Photo Sharing!
https://www.flickr.com/photos/julzart/9266448615
Copyright: 2013 julia Chapple / License: CC BY 2.0
* Scuba diving Indonesia - Bali - Komodo - Bunaken 2008 | Flickr -
Photo Sharing!
https://www.flickr.com/photos/39891373@N07/3666275538
Copyright: 2008 Ilse Reijs and Jan-Noud Hutten / License: CC BY
2.0
* 72C Duna SHEER MADNESS Lab Re-entry | Flickr - Photo Sharing!
https://www.flickr.com/photos/39416639@N02/12702229414
Copyright: 2014 TheBullethead / License: CC BY 2.0
* Supernova Remnant W49B | Flickr - Photo Sharing!
https://www.flickr.com/photos/gsfc/4479812068
Copyright: 2009 NASA Goddard Space Flight Center / License: CC
BY 2.0
* The Great Wall of China | Flickr - Photo Sharing!
https://www.flickr.com/photos/kk/2149165957
Copyright: 2007 kris krüg / License: CC BY-SA 2.0
* Headshift business card discussion | Flickr - Photo Sharing!
https://www.flickr.com/photos/criminalintent/2744040362
Copyright: 2008 Lars Plougmann / License: CC BY-SA 2.0
* Bali Indonesia | Flickr - Photo Sharing!
https://www.flickr.com/photos/julzart/9266448615
Copyright: 2013 julia Chapple / License: CC BY 2.0
* Scuba diving Indonesia - Bali - Komodo - Bunaken 2008 | Flickr -
Photo Sharing!
https://www.flickr.com/photos/39891373@N07/3666275538
Copyright: 2008 Ilse Reijs and Jan-Noud Hutten / License: CC BY
2.0
License of photos used #4License of photos used #4License of photos used #4License of photos used #4License of photos used #4
* Scuba diving Bali Nusa Lembongan | Flickr - Photo Sharing!
https://www.flickr.com/photos/39891373@N07/4177189387
Copyright: 2009 Ilse Reijs and Jan-Noud Hutten / License: CC BY
2.0
* Project 365 #56: 250210 Thanks For The Memory | Flickr - Photo
Sharing!
https://www.flickr.com/photos/comedynose/4388430444
Copyright: 2010 Pete / License: CC BY 2.0
* Audio Codec 97 - Wikipedia
http://ja.wikipedia.org/wiki/Audio_Codec_97#mediaviewer/%E3%83%
95%E3%82%A1%E3%82%A4%E3%83%AB:Realtek_alc655.jpg
Copyright: 2007 Futase tdkr / License: CC BY-SA 3.0
* 紙飛行機 | Flickr - Photo Sharing!
https://www.flickr.com/photos/32926922@N08/4281868756
Copyright: 2010 バイク便八王子立川所沢 / License: CC BY 2.0
* Antares Rocket With Cygnus Spacecraft Launches | Flickr - Photo
Sharing!
https://www.flickr.com/photos/gsfc/9807812154
Copyright: 2013 NASA Goddard Space Flight Center / License: CC
BY 2.0
* Scuba diving Bali Nusa Lembongan | Flickr - Photo Sharing!
https://www.flickr.com/photos/39891373@N07/4177189387
Copyright: 2009 Ilse Reijs and Jan-Noud Hutten / License: CC BY
2.0
* Project 365 #56: 250210 Thanks For The Memory | Flickr - Photo
Sharing!
https://www.flickr.com/photos/comedynose/4388430444
Copyright: 2010 Pete / License: CC BY 2.0
* Audio Codec 97 - Wikipedia
http://ja.wikipedia.org/wiki/Audio_Codec_97#mediaviewer/%E3%83%
95%E3%82%A1%E3%82%A4%E3%83%AB:Realtek_alc655.jpg
Copyright: 2007 Futase tdkr / License: CC BY-SA 3.0
* 紙飛行機 | Flickr - Photo Sharing!
https://www.flickr.com/photos/32926922@N08/4281868756
Copyright: 2010 バイク便八王子立川所沢 / License: CC BY 2.0
* Antares Rocket With Cygnus Spacecraft Launches | Flickr - Photo
Sharing!
https://www.flickr.com/photos/gsfc/9807812154
Copyright: 2013 NASA Goddard Space Flight Center / License: CC
BY 2.0
* Scuba diving Bali Nusa Lembongan | Flickr - Photo Sharing!
https://www.flickr.com/photos/39891373@N07/4177189387
Copyright: 2009 Ilse Reijs and Jan-Noud Hutten / License: CC BY
2.0
* Project 365 #56: 250210 Thanks For The Memory | Flickr - Photo
Sharing!
https://www.flickr.com/photos/comedynose/4388430444
Copyright: 2010 Pete / License: CC BY 2.0
* Audio Codec 97 - Wikipedia
http://ja.wikipedia.org/wiki/Audio_Codec_97#mediaviewer/%E3%83%
95%E3%82%A1%E3%82%A4%E3%83%AB:Realtek_alc655.jpg
Copyright: 2007 Futase tdkr / License: CC BY-SA 3.0
* 紙飛行機 | Flickr - Photo Sharing!
https://www.flickr.com/photos/32926922@N08/4281868756
Copyright: 2010 バイク便八王子立川所沢 / License: CC BY 2.0
* Antares Rocket With Cygnus Spacecraft Launches | Flickr - Photo
Sharing!
https://www.flickr.com/photos/gsfc/9807812154
Copyright: 2013 NASA Goddard Space Flight Center / License: CC
BY 2.0
* Scuba diving Bali Nusa Lembongan | Flickr - Photo Sharing!
https://www.flickr.com/photos/39891373@N07/4177189387
Copyright: 2009 Ilse Reijs and Jan-Noud Hutten / License: CC BY
2.0
* Project 365 #56: 250210 Thanks For The Memory | Flickr - Photo
Sharing!
https://www.flickr.com/photos/comedynose/4388430444
Copyright: 2010 Pete / License: CC BY 2.0
* Audio Codec 97 - Wikipedia
http://ja.wikipedia.org/wiki/Audio_Codec_97#mediaviewer/%E3%83%
95%E3%82%A1%E3%82%A4%E3%83%AB:Realtek_alc655.jpg
Copyright: 2007 Futase tdkr / License: CC BY-SA 3.0
* 紙飛行機 | Flickr - Photo Sharing!
https://www.flickr.com/photos/32926922@N08/4281868756
Copyright: 2010 バイク便八王子立川所沢 / License: CC BY 2.0
* Antares Rocket With Cygnus Spacecraft Launches | Flickr - Photo
Sharing!
https://www.flickr.com/photos/gsfc/9807812154
Copyright: 2013 NASA Goddard Space Flight Center / License: CC
BY 2.0
* Scuba diving Bali Nusa Lembongan | Flickr - Photo Sharing!
https://www.flickr.com/photos/39891373@N07/4177189387
Copyright: 2009 Ilse Reijs and Jan-Noud Hutten / License: CC BY
2.0
* Project 365 #56: 250210 Thanks For The Memory | Flickr - Photo
Sharing!
https://www.flickr.com/photos/comedynose/4388430444
Copyright: 2010 Pete / License: CC BY 2.0
* Audio Codec 97 - Wikipedia
http://ja.wikipedia.org/wiki/Audio_Codec_97#mediaviewer/%E3%83%
95%E3%82%A1%E3%82%A4%E3%83%AB:Realtek_alc655.jpg
Copyright: 2007 Futase tdkr / License: CC BY-SA 3.0
* 紙飛行機 | Flickr - Photo Sharing!
https://www.flickr.com/photos/32926922@N08/4281868756
Copyright: 2010 バイク便八王子立川所沢 / License: CC BY 2.0
* Antares Rocket With Cygnus Spacecraft Launches | Flickr - Photo
Sharing!
https://www.flickr.com/photos/gsfc/9807812154
Copyright: 2013 NASA Goddard Space Flight Center / License: CC
BY 2.0
License of photos used #5License of photos used #5License of photos used #5License of photos used #5License of photos used #5
* Boston à l'heure bleue | Flickr - Photo Sharing!
https://www.flickr.com/photos/ensh/4769294947
Copyright: 2010 Emmanuel Huybrechts / License: CC BY 2.0
* e-mail symbol | Flickr - Photo Sharing!
https://www.flickr.com/photos/gsi-r/5341765493
Copyright: 2007 Micky Aldridge / License: CC BY 2.0
* File:Göteborg in moon light.jpg - Wikipedia, the free
encyclopedia
http://en.wikipedia.org/wiki/File:G%C3%B6teborg_in_moon_light.jpg
Copyright: 2004 Amjad Sheikh / License: CC BY-SA 3.0
* Creative Commons BBB | Flickr - Photo Sharing!
https://www.flickr.com/photos/steren/2732488224
Copyright: 2008 Steren Giannini / License: CC BY 2.0
* Full body | Flickr - Photo Sharing!
https://www.flickr.com/photos/timothytsuihin/2852272823
Copyright: 2008 Timothy Tsui / License: CC BY-SA 2.0
* Boston à l'heure bleue | Flickr - Photo Sharing!
https://www.flickr.com/photos/ensh/4769294947
Copyright: 2010 Emmanuel Huybrechts / License: CC BY 2.0
* e-mail symbol | Flickr - Photo Sharing!
https://www.flickr.com/photos/gsi-r/5341765493
Copyright: 2007 Micky Aldridge / License: CC BY 2.0
* File:Göteborg in moon light.jpg - Wikipedia, the free
encyclopedia
http://en.wikipedia.org/wiki/File:G%C3%B6teborg_in_moon_light.jpg
Copyright: 2004 Amjad Sheikh / License: CC BY-SA 3.0
* Creative Commons BBB | Flickr - Photo Sharing!
https://www.flickr.com/photos/steren/2732488224
Copyright: 2008 Steren Giannini / License: CC BY 2.0
* Full body | Flickr - Photo Sharing!
https://www.flickr.com/photos/timothytsuihin/2852272823
Copyright: 2008 Timothy Tsui / License: CC BY-SA 2.0
* Boston à l'heure bleue | Flickr - Photo Sharing!
https://www.flickr.com/photos/ensh/4769294947
Copyright: 2010 Emmanuel Huybrechts / License: CC BY 2.0
* e-mail symbol | Flickr - Photo Sharing!
https://www.flickr.com/photos/gsi-r/5341765493
Copyright: 2007 Micky Aldridge / License: CC BY 2.0
* File:Göteborg in moon light.jpg - Wikipedia, the free
encyclopedia
http://en.wikipedia.org/wiki/File:G%C3%B6teborg_in_moon_light.jpg
Copyright: 2004 Amjad Sheikh / License: CC BY-SA 3.0
* Creative Commons BBB | Flickr - Photo Sharing!
https://www.flickr.com/photos/steren/2732488224
Copyright: 2008 Steren Giannini / License: CC BY 2.0
* Full body | Flickr - Photo Sharing!
https://www.flickr.com/photos/timothytsuihin/2852272823
Copyright: 2008 Timothy Tsui / License: CC BY-SA 2.0
* Boston à l'heure bleue | Flickr - Photo Sharing!
https://www.flickr.com/photos/ensh/4769294947
Copyright: 2010 Emmanuel Huybrechts / License: CC BY 2.0
* e-mail symbol | Flickr - Photo Sharing!
https://www.flickr.com/photos/gsi-r/5341765493
Copyright: 2007 Micky Aldridge / License: CC BY 2.0
* File:Göteborg in moon light.jpg - Wikipedia, the free
encyclopedia
http://en.wikipedia.org/wiki/File:G%C3%B6teborg_in_moon_light.jpg
Copyright: 2004 Amjad Sheikh / License: CC BY-SA 3.0
* Creative Commons BBB | Flickr - Photo Sharing!
https://www.flickr.com/photos/steren/2732488224
Copyright: 2008 Steren Giannini / License: CC BY 2.0
* Full body | Flickr - Photo Sharing!
https://www.flickr.com/photos/timothytsuihin/2852272823
Copyright: 2008 Timothy Tsui / License: CC BY-SA 2.0
* Boston à l'heure bleue | Flickr - Photo Sharing!
https://www.flickr.com/photos/ensh/4769294947
Copyright: 2010 Emmanuel Huybrechts / License: CC BY 2.0
* e-mail symbol | Flickr - Photo Sharing!
https://www.flickr.com/photos/gsi-r/5341765493
Copyright: 2007 Micky Aldridge / License: CC BY 2.0
* File:Göteborg in moon light.jpg - Wikipedia, the free
encyclopedia
http://en.wikipedia.org/wiki/File:G%C3%B6teborg_in_moon_light.jpg
Copyright: 2004 Amjad Sheikh / License: CC BY-SA 3.0
* Creative Commons BBB | Flickr - Photo Sharing!
https://www.flickr.com/photos/steren/2732488224
Copyright: 2008 Steren Giannini / License: CC BY 2.0
* Full body | Flickr - Photo Sharing!
https://www.flickr.com/photos/timothytsuihin/2852272823
Copyright: 2008 Timothy Tsui / License: CC BY-SA 2.0

Contenu connexe

Tendances

Functional IoT: Introduction
Functional IoT: IntroductionFunctional IoT: Introduction
Functional IoT: IntroductionKiwamu Okabe
 
Metasepi team meeting #20: Start! ATS programming on MCU
Metasepi team meeting #20: Start! ATS programming on MCUMetasepi team meeting #20: Start! ATS programming on MCU
Metasepi team meeting #20: Start! ATS programming on MCUKiwamu Okabe
 
ATS Programming Tutorial
ATS Programming TutorialATS Programming Tutorial
ATS Programming TutorialKiwamu Okabe
 
Web APIs in Node.js Core: Past, Present, and Future (JSConf EU 2019)
Web APIs in Node.js Core: Past, Present, and Future (JSConf EU 2019)Web APIs in Node.js Core: Past, Present, and Future (JSConf EU 2019)
Web APIs in Node.js Core: Past, Present, and Future (JSConf EU 2019)Igalia
 
Concurrency: The Good, The Bad and The Ugly
Concurrency: The Good, The Bad and The UglyConcurrency: The Good, The Bad and The Ugly
Concurrency: The Good, The Bad and The Uglylegendofklang
 
ATS/LF for Coq users
ATS/LF for Coq usersATS/LF for Coq users
ATS/LF for Coq usersKiwamu Okabe
 
Embedded application designed by ATS language
Embedded application designed by ATS languageEmbedded application designed by ATS language
Embedded application designed by ATS languageKiwamu Okabe
 
Functional IoT: Hardware and Platform
Functional IoT: Hardware and PlatformFunctional IoT: Hardware and Platform
Functional IoT: Hardware and PlatformKiwamu Okabe
 
Hands-on VeriFast with STM32 microcontroller
Hands-on VeriFast with STM32 microcontrollerHands-on VeriFast with STM32 microcontroller
Hands-on VeriFast with STM32 microcontrollerKiwamu Okabe
 
ATS programming on ESP8266
ATS programming on ESP8266ATS programming on ESP8266
ATS programming on ESP8266Kiwamu Okabe
 
Metasepi team meeting #19: ATS application on Arduino
Metasepi team meeting #19: ATS application on ArduinoMetasepi team meeting #19: ATS application on Arduino
Metasepi team meeting #19: ATS application on ArduinoKiwamu Okabe
 
Use Groovy&Grails in your spring boot projects
Use Groovy&Grails in your spring boot projectsUse Groovy&Grails in your spring boot projects
Use Groovy&Grails in your spring boot projectsParadigma Digital
 
Building reusable components with generics and protocols
Building reusable components with generics and protocolsBuilding reusable components with generics and protocols
Building reusable components with generics and protocolsDonny Wals
 

Tendances (14)

Functional IoT: Introduction
Functional IoT: IntroductionFunctional IoT: Introduction
Functional IoT: Introduction
 
Metasepi team meeting #20: Start! ATS programming on MCU
Metasepi team meeting #20: Start! ATS programming on MCUMetasepi team meeting #20: Start! ATS programming on MCU
Metasepi team meeting #20: Start! ATS programming on MCU
 
ATS Programming Tutorial
ATS Programming TutorialATS Programming Tutorial
ATS Programming Tutorial
 
Web APIs in Node.js Core: Past, Present, and Future (JSConf EU 2019)
Web APIs in Node.js Core: Past, Present, and Future (JSConf EU 2019)Web APIs in Node.js Core: Past, Present, and Future (JSConf EU 2019)
Web APIs in Node.js Core: Past, Present, and Future (JSConf EU 2019)
 
Concurrency: The Good, The Bad and The Ugly
Concurrency: The Good, The Bad and The UglyConcurrency: The Good, The Bad and The Ugly
Concurrency: The Good, The Bad and The Ugly
 
ATS/LF for Coq users
ATS/LF for Coq usersATS/LF for Coq users
ATS/LF for Coq users
 
Embedded application designed by ATS language
Embedded application designed by ATS languageEmbedded application designed by ATS language
Embedded application designed by ATS language
 
Functional IoT: Hardware and Platform
Functional IoT: Hardware and PlatformFunctional IoT: Hardware and Platform
Functional IoT: Hardware and Platform
 
Hands-on VeriFast with STM32 microcontroller
Hands-on VeriFast with STM32 microcontrollerHands-on VeriFast with STM32 microcontroller
Hands-on VeriFast with STM32 microcontroller
 
ATS programming on ESP8266
ATS programming on ESP8266ATS programming on ESP8266
ATS programming on ESP8266
 
Metasepi team meeting #19: ATS application on Arduino
Metasepi team meeting #19: ATS application on ArduinoMetasepi team meeting #19: ATS application on Arduino
Metasepi team meeting #19: ATS application on Arduino
 
ATS2 updates 2017
ATS2 updates 2017ATS2 updates 2017
ATS2 updates 2017
 
Use Groovy&Grails in your spring boot projects
Use Groovy&Grails in your spring boot projectsUse Groovy&Grails in your spring boot projects
Use Groovy&Grails in your spring boot projects
 
Building reusable components with generics and protocols
Building reusable components with generics and protocolsBuilding reusable components with generics and protocols
Building reusable components with generics and protocols
 

Similaire à Ajhc Haskell Compiler with Reentrant GC

Emacs verilog-mode is coming to Debian, again
Emacs verilog-mode is coming to Debian, againEmacs verilog-mode is coming to Debian, again
Emacs verilog-mode is coming to Debian, againKiwamu Okabe
 
Metasepi team meeting: Ajhc Project Overview
Metasepi team meeting: Ajhc Project OverviewMetasepi team meeting: Ajhc Project Overview
Metasepi team meeting: Ajhc Project OverviewKiwamu Okabe
 
Poster: Generate ATS interface from C code, and introduce linear type
Poster: Generate ATS interface from C code, and introduce linear typePoster: Generate ATS interface from C code, and introduce linear type
Poster: Generate ATS interface from C code, and introduce linear typeKiwamu Okabe
 
Does Infer dream of design by contract?
Does Infer dream of design by contract?Does Infer dream of design by contract?
Does Infer dream of design by contract?Kiwamu Okabe
 
Poster: Comparing ATS and VeriFast on RTOS system state
Poster: Comparing ATS and VeriFast on RTOS system statePoster: Comparing ATS and VeriFast on RTOS system state
Poster: Comparing ATS and VeriFast on RTOS system stateKiwamu Okabe
 
An OCaml newbie meets Camlp4 parser
An OCaml newbie meets Camlp4 parserAn OCaml newbie meets Camlp4 parser
An OCaml newbie meets Camlp4 parserKiwamu Okabe
 
Happy Programming with CoffeeScript
Happy Programming with CoffeeScriptHappy Programming with CoffeeScript
Happy Programming with CoffeeScriptEddie Kao
 
Dear compiler please don't be my nanny v2
Dear compiler  please don't be my nanny v2Dear compiler  please don't be my nanny v2
Dear compiler please don't be my nanny v2Dino Dini
 
Smart.js: JavaScript engine running on tiny MCU
Smart.js: JavaScript engine running on tiny MCUSmart.js: JavaScript engine running on tiny MCU
Smart.js: JavaScript engine running on tiny MCUKiwamu Okabe
 
flowr streamlining computing workflows
flowr streamlining computing workflowsflowr streamlining computing workflows
flowr streamlining computing workflowssahil seth
 
CRaSH the shell for the Java Virtual Machine
CRaSH the shell for the Java Virtual MachineCRaSH the shell for the Java Virtual Machine
CRaSH the shell for the Java Virtual MachineGR8Conf
 
CRaSH the shell for the Java Virtual Machine
CRaSH the shell for the Java Virtual MachineCRaSH the shell for the Java Virtual Machine
CRaSH the shell for the Java Virtual MachineeXo Platform
 
CRaSH the shell for the Java Virtual Machine
CRaSH the shell for the Java Virtual MachineCRaSH the shell for the Java Virtual Machine
CRaSH the shell for the Java Virtual MachineGR8Conf
 
Tips for Tackling a Legacy Codebase (ScotlandPHP 2021)
Tips for Tackling a Legacy Codebase (ScotlandPHP 2021)Tips for Tackling a Legacy Codebase (ScotlandPHP 2021)
Tips for Tackling a Legacy Codebase (ScotlandPHP 2021)James Titcumb
 
Kafka on Kubernetes: Keeping It Simple (Nikki Thean, Etsy) Kafka Summit SF 2019
Kafka on Kubernetes: Keeping It Simple (Nikki Thean, Etsy) Kafka Summit SF 2019Kafka on Kubernetes: Keeping It Simple (Nikki Thean, Etsy) Kafka Summit SF 2019
Kafka on Kubernetes: Keeping It Simple (Nikki Thean, Etsy) Kafka Summit SF 2019confluent
 
Apache Jackrabbit Oak on MongoDB
Apache Jackrabbit Oak on MongoDBApache Jackrabbit Oak on MongoDB
Apache Jackrabbit Oak on MongoDBMongoDB
 
Living the Best Life on a Legacy Project (phpday 2022).pdf
Living the Best Life on a Legacy Project (phpday 2022).pdfLiving the Best Life on a Legacy Project (phpday 2022).pdf
Living the Best Life on a Legacy Project (phpday 2022).pdfJames Titcumb
 

Similaire à Ajhc Haskell Compiler with Reentrant GC (20)

Emacs verilog-mode is coming to Debian, again
Emacs verilog-mode is coming to Debian, againEmacs verilog-mode is coming to Debian, again
Emacs verilog-mode is coming to Debian, again
 
Metasepi team meeting: Ajhc Project Overview
Metasepi team meeting: Ajhc Project OverviewMetasepi team meeting: Ajhc Project Overview
Metasepi team meeting: Ajhc Project Overview
 
Poster: Generate ATS interface from C code, and introduce linear type
Poster: Generate ATS interface from C code, and introduce linear typePoster: Generate ATS interface from C code, and introduce linear type
Poster: Generate ATS interface from C code, and introduce linear type
 
Does Infer dream of design by contract?
Does Infer dream of design by contract?Does Infer dream of design by contract?
Does Infer dream of design by contract?
 
Poster: Comparing ATS and VeriFast on RTOS system state
Poster: Comparing ATS and VeriFast on RTOS system statePoster: Comparing ATS and VeriFast on RTOS system state
Poster: Comparing ATS and VeriFast on RTOS system state
 
An OCaml newbie meets Camlp4 parser
An OCaml newbie meets Camlp4 parserAn OCaml newbie meets Camlp4 parser
An OCaml newbie meets Camlp4 parser
 
Happy Programming with CoffeeScript
Happy Programming with CoffeeScriptHappy Programming with CoffeeScript
Happy Programming with CoffeeScript
 
Dear compiler please don't be my nanny v2
Dear compiler  please don't be my nanny v2Dear compiler  please don't be my nanny v2
Dear compiler please don't be my nanny v2
 
Smart.js: JavaScript engine running on tiny MCU
Smart.js: JavaScript engine running on tiny MCUSmart.js: JavaScript engine running on tiny MCU
Smart.js: JavaScript engine running on tiny MCU
 
I35s
I35sI35s
I35s
 
flowr streamlining computing workflows
flowr streamlining computing workflowsflowr streamlining computing workflows
flowr streamlining computing workflows
 
CRaSH the shell for the Java Virtual Machine
CRaSH the shell for the Java Virtual MachineCRaSH the shell for the Java Virtual Machine
CRaSH the shell for the Java Virtual Machine
 
CRaSH the shell for the Java Virtual Machine
CRaSH the shell for the Java Virtual MachineCRaSH the shell for the Java Virtual Machine
CRaSH the shell for the Java Virtual Machine
 
CRaSH the shell for the Java Virtual Machine
CRaSH the shell for the Java Virtual MachineCRaSH the shell for the Java Virtual Machine
CRaSH the shell for the Java Virtual Machine
 
Tips for Tackling a Legacy Codebase (ScotlandPHP 2021)
Tips for Tackling a Legacy Codebase (ScotlandPHP 2021)Tips for Tackling a Legacy Codebase (ScotlandPHP 2021)
Tips for Tackling a Legacy Codebase (ScotlandPHP 2021)
 
Kafka on Kubernetes: Keeping It Simple (Nikki Thean, Etsy) Kafka Summit SF 2019
Kafka on Kubernetes: Keeping It Simple (Nikki Thean, Etsy) Kafka Summit SF 2019Kafka on Kubernetes: Keeping It Simple (Nikki Thean, Etsy) Kafka Summit SF 2019
Kafka on Kubernetes: Keeping It Simple (Nikki Thean, Etsy) Kafka Summit SF 2019
 
Apache Jackrabbit Oak on MongoDB
Apache Jackrabbit Oak on MongoDBApache Jackrabbit Oak on MongoDB
Apache Jackrabbit Oak on MongoDB
 
Os Bowkett
Os BowkettOs Bowkett
Os Bowkett
 
Living the Best Life on a Legacy Project (phpday 2022).pdf
Living the Best Life on a Legacy Project (phpday 2022).pdfLiving the Best Life on a Legacy Project (phpday 2022).pdf
Living the Best Life on a Legacy Project (phpday 2022).pdf
 
Doodling for-great-success
Doodling for-great-successDoodling for-great-success
Doodling for-great-success
 

Dernier

Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024The Digital Insurer
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Drew Madelung
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘RTylerCroy
 
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
 
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...gurkirankumar98700
 
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
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationMichael W. Hawkins
 
Developing An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of BrazilDeveloping An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of BrazilV3cube
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024The Digital Insurer
 
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Enterprise Knowledge
 
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfThe Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfEnterprise Knowledge
 
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
 
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure serviceWhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure servicePooja Nehwal
 
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
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Servicegiselly40
 
Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Paola De la Torre
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024The Digital Insurer
 
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxFactors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxKatpro Technologies
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking MenDelhi Call girls
 
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEarley Information Science
 

Dernier (20)

Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
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
 
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 
Developing An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of BrazilDeveloping An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of Brazil
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...
 
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfThe Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
 
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...
 
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure serviceWhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
 
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
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Service
 
Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024
 
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxFactors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men
 
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
 

Ajhc Haskell Compiler with Reentrant GC

  • 1. Ajhc Haskell Compiler with  Reentrant GC Ajhc Haskell Compiler with  Reentrant GC Ajhc Haskell Compiler with  Reentrant GC Ajhc Haskell Compiler with  Reentrant GC Ajhc Haskell Compiler with Reentrant GC Kiwamu Okabe @ Metasepi ProjectKiwamu Okabe @ Metasepi ProjectKiwamu Okabe @ Metasepi ProjectKiwamu Okabe @ Metasepi ProjectKiwamu Okabe @ Metasepi Project
  • 2. Who am I?Who am I?Who am I?Who am I?Who am I? ☆ http://www.masterq.net/☆ http://www.masterq.net/☆ http://www.masterq.net/☆ http://www.masterq.net/☆ http://www.masterq.net/ ☆ Self employed software engineer☆ Self employed software engineer☆ Self employed software engineer☆ Self employed software engineer☆ Self employed software engineer ☆ Trade name := METASEPI DESIGN☆ Trade name := METASEPI DESIGN☆ Trade name := METASEPI DESIGN☆ Trade name := METASEPI DESIGN☆ Trade name := METASEPI DESIGN ☆ Founder of Metasepi Project☆ Founder of Metasepi Project☆ Founder of Metasepi Project☆ Founder of Metasepi Project☆ Founder of Metasepi Project ☆ A Debian Maintainer☆ A Debian Maintainer☆ A Debian Maintainer☆ A Debian Maintainer☆ A Debian Maintainer ☆ 10 years' experience in developing OS using NetBSD ☆ 10 years' experience in developing OS using NetBSD ☆ 10 years' experience in developing OS using NetBSD ☆ 10 years' experience in developing OS using NetBSD ☆ 10 years' experience in developing OS using NetBSD
  • 3. Demo: NetBSD driver in HaskellDemo: NetBSD driver in HaskellDemo: NetBSD driver in HaskellDemo: NetBSD driver in HaskellDemo: NetBSD driver in Haskell ☆ NetBSD audio driver play sound☆ NetBSD audio driver play sound☆ NetBSD audio driver play sound☆ NetBSD audio driver play sound☆ NetBSD audio driver play sound ☆ The driver's interrupt handler rewrited using Haskell ☆ The driver's interrupt handler rewrited using Haskell ☆ The driver's interrupt handler rewrited using Haskell ☆ The driver's interrupt handler rewrited using Haskell ☆ The driver's interrupt handler rewrited using Haskell ☆ GC occurs in interrupt handler☆ GC occurs in interrupt handler☆ GC occurs in interrupt handler☆ GC occurs in interrupt handler☆ GC occurs in interrupt handler ☆ Watch the movie at following☆ Watch the movie at following☆ Watch the movie at following☆ Watch the movie at following☆ Watch the movie at following https://www.youtube.com/watch?v=XEYcR5RG5cAhttps://www.youtube.com/watch?v=XEYcR5RG5cAhttps://www.youtube.com/watch?v=XEYcR5RG5cAhttps://www.youtube.com/watch?v=XEYcR5RG5cAhttps://www.youtube.com/watch?v=XEYcR5RG5cA ☆ Paper for Haskell Symposium 2014☆ Paper for Haskell Symposium 2014☆ Paper for Haskell Symposium 2014☆ Paper for Haskell Symposium 2014☆ Paper for Haskell Symposium 2014 http://metasepi.org/doc/metasepi-icfp2014.pdf http://metasepi.org/doc/metasepi-icfp2014-demo.pdf http://metasepi.org/doc/metasepi-icfp2014.pdf http://metasepi.org/doc/metasepi-icfp2014-demo.pdf http://metasepi.org/doc/metasepi-icfp2014.pdf http://metasepi.org/doc/metasepi-icfp2014-demo.pdf http://metasepi.org/doc/metasepi-icfp2014.pdf http://metasepi.org/doc/metasepi-icfp2014-demo.pdf http://metasepi.org/doc/metasepi-icfp2014.pdf http://metasepi.org/doc/metasepi-icfp2014-demo.pdf
  • 4. AgendaAgendaAgendaAgendaAgenda ☆ [1] Demo: NetBSD driver in Haskell☆ [1] Demo: NetBSD driver in Haskell☆ [1] Demo: NetBSD driver in Haskell☆ [1] Demo: NetBSD driver in Haskell☆ [1] Demo: NetBSD driver in Haskell ☆ [2] What's Metasepi?☆ [2] What's Metasepi?☆ [2] What's Metasepi?☆ [2] What's Metasepi?☆ [2] What's Metasepi? ☆ [3] What's Ajhc compiler?☆ [3] What's Ajhc compiler?☆ [3] What's Ajhc compiler?☆ [3] What's Ajhc compiler?☆ [3] What's Ajhc compiler? ☆ [4] Reentrancy and Context☆ [4] Reentrancy and Context☆ [4] Reentrancy and Context☆ [4] Reentrancy and Context☆ [4] Reentrancy and Context ☆ [5] Context Local Heap (CLHs)☆ [5] Context Local Heap (CLHs)☆ [5] Context Local Heap (CLHs)☆ [5] Context Local Heap (CLHs)☆ [5] Context Local Heap (CLHs) ☆ [6] How to write Haskell driver?☆ [6] How to write Haskell driver?☆ [6] How to write Haskell driver?☆ [6] How to write Haskell driver?☆ [6] How to write Haskell driver? ☆ [7] What's coming next?☆ [7] What's coming next?☆ [7] What's coming next?☆ [7] What's coming next?☆ [7] What's coming next?
  • 5. [2] What's Metasepi?[2] What's Metasepi?[2] What's Metasepi?[2] What's Metasepi?[2] What's Metasepi? http://metasepi.org/http://metasepi.org/http://metasepi.org/http://metasepi.org/http://metasepi.org/ ☆ Unix-like OS designed by strong type.☆ Unix-like OS designed by strong type.☆ Unix-like OS designed by strong type.☆ Unix-like OS designed by strong type.☆ Unix-like OS designed by strong type. ☆ Using ML or more strong type lang.☆ Using ML or more strong type lang.☆ Using ML or more strong type lang.☆ Using ML or more strong type lang.☆ Using ML or more strong type lang. Haskell http://www.haskell.org/Haskell http://www.haskell.org/Haskell http://www.haskell.org/Haskell http://www.haskell.org/Haskell http://www.haskell.org/ OCaml http://caml.inria.fr/OCaml http://caml.inria.fr/OCaml http://caml.inria.fr/OCaml http://caml.inria.fr/OCaml http://caml.inria.fr/ MLton http://mlton.org/MLton http://mlton.org/MLton http://mlton.org/MLton http://mlton.org/MLton http://mlton.org/ . . . and suchlike.. . . and suchlike.. . . and suchlike.. . . and suchlike.. . . and suchlike.
  • 6. Why need Metasepi?Why need Metasepi?Why need Metasepi?Why need Metasepi?Why need Metasepi? ☆ We have already Linux or Windows.☆ We have already Linux or Windows.☆ We have already Linux or Windows.☆ We have already Linux or Windows.☆ We have already Linux or Windows. ☆ But the developers are suffering.☆ But the developers are suffering.☆ But the developers are suffering.☆ But the developers are suffering.☆ But the developers are suffering. ☆ If use the kernel changed by you,☆ If use the kernel changed by you,☆ If use the kernel changed by you,☆ If use the kernel changed by you,☆ If use the kernel changed by you, ☆ you will get many runtime error.☆ you will get many runtime error.☆ you will get many runtime error.☆ you will get many runtime error.☆ you will get many runtime error. ☆ Difficult even to reproduce it.☆ Difficult even to reproduce it.☆ Difficult even to reproduce it.☆ Difficult even to reproduce it.☆ Difficult even to reproduce it.
  • 7. Doesn't OSS have good quality?Doesn't OSS have good quality?Doesn't OSS have good quality?Doesn't OSS have good quality?Doesn't OSS have good quality? ☆ "The Cathedral and the Bazaar"☆ "The Cathedral and the Bazaar"☆ "The Cathedral and the Bazaar"☆ "The Cathedral and the Bazaar"☆ "The Cathedral and the Bazaar" ☆ "Given enough eyeballs, all bugs are shallow." ☆ "Given enough eyeballs, all bugs are shallow." ☆ "Given enough eyeballs, all bugs are shallow." ☆ "Given enough eyeballs, all bugs are shallow." ☆ "Given enough eyeballs, all bugs are shallow." http://cruel.org/freeware/cathedral.htmlhttp://cruel.org/freeware/cathedral.htmlhttp://cruel.org/freeware/cathedral.htmlhttp://cruel.org/freeware/cathedral.htmlhttp://cruel.org/freeware/cathedral.html ☆ But if you develop your own product re-using OSS... ☆ But if you develop your own product re-using OSS... ☆ But if you develop your own product re-using OSS... ☆ But if you develop your own product re-using OSS... ☆ But if you develop your own product re-using OSS...
  • 8. Low quality out of OSS umbrellaLow quality out of OSS umbrellaLow quality out of OSS umbrellaLow quality out of OSS umbrellaLow quality out of OSS umbrella
  • 9. Type safetyType safetyType safetyType safetyType safety ☆ Less runtime errors.☆ Less runtime errors.☆ Less runtime errors.☆ Less runtime errors.☆ Less runtime errors. ☆ "数理科学的バグ撲滅方法論のすすめ"☆ "数理科学的バグ撲滅方法論のすすめ"☆ "数理科学的バグ撲滅方法論のすすめ"☆ "数理科学的バグ撲滅方法論のすすめ"☆ "数理科学的バグ撲滅方法論のすすめ" http://itpro.nikkeibp.co.jp/article/COLUMN/20060915/248230/http://itpro.nikkeibp.co.jp/article/COLUMN/20060915/248230/http://itpro.nikkeibp.co.jp/article/COLUMN/20060915/248230/http://itpro.nikkeibp.co.jp/article/COLUMN/20060915/248230/http://itpro.nikkeibp.co.jp/article/COLUMN/20060915/248230/
  • 10. Kernel wants type desperatelyKernel wants type desperatelyKernel wants type desperatelyKernel wants type desperatelyKernel wants type desperately ☆ Kernels are developed with C lang.☆ Kernels are developed with C lang.☆ Kernels are developed with C lang.☆ Kernels are developed with C lang.☆ Kernels are developed with C lang. ☆ Error on user space => SEGV☆ Error on user space => SEGV☆ Error on user space => SEGV☆ Error on user space => SEGV☆ Error on user space => SEGV ☆ Error on kernel space => Halt!☆ Error on kernel space => Halt!☆ Error on kernel space => Halt!☆ Error on kernel space => Halt!☆ Error on kernel space => Halt! ☆ Should design kernel with the greatest care. ☆ Should design kernel with the greatest care. ☆ Should design kernel with the greatest care. ☆ Should design kernel with the greatest care. ☆ Should design kernel with the greatest care. ☆ C language is safe?☆ C language is safe?☆ C language is safe?☆ C language is safe?☆ C language is safe?
  • 11. Remember Heartbleed bug?Remember Heartbleed bug?Remember Heartbleed bug?Remember Heartbleed bug?Remember Heartbleed bug? Should we use safer language than C?Should we use safer language than C?Should we use safer language than C?Should we use safer language than C?Should we use safer language than C? == In English == "Preventing heartbleed bugs with safe programming languages" http://bluishcoder.co.nz/2014/04/11/preventing-heartbleed-bugs- with-safe-languages.html == In Japanease == "安全なプログラミング言語を使って heartbleed を防ぐには" https://github.com/jats-ug/translate/blob/master/Web/ bluishcoder.co.nz/2014/04/11/preventing-heartbleed-bugs-with-safe- languages.md == In English == "Preventing heartbleed bugs with safe programming languages" http://bluishcoder.co.nz/2014/04/11/preventing-heartbleed-bugs- with-safe-languages.html == In Japanease == "安全なプログラミング言語を使って heartbleed を防ぐには" https://github.com/jats-ug/translate/blob/master/Web/ bluishcoder.co.nz/2014/04/11/preventing-heartbleed-bugs-with-safe- languages.md == In English == "Preventing heartbleed bugs with safe programming languages" http://bluishcoder.co.nz/2014/04/11/preventing-heartbleed-bugs- with-safe-languages.html == In Japanease == "安全なプログラミング言語を使って heartbleed を防ぐには" https://github.com/jats-ug/translate/blob/master/Web/ bluishcoder.co.nz/2014/04/11/preventing-heartbleed-bugs-with-safe- languages.md == In English == "Preventing heartbleed bugs with safe programming languages" http://bluishcoder.co.nz/2014/04/11/preventing-heartbleed-bugs- with-safe-languages.html == In Japanease == "安全なプログラミング言語を使って heartbleed を防ぐには" https://github.com/jats-ug/translate/blob/master/Web/ bluishcoder.co.nz/2014/04/11/preventing-heartbleed-bugs-with-safe- languages.md == In English == "Preventing heartbleed bugs with safe programming languages" http://bluishcoder.co.nz/2014/04/11/preventing-heartbleed-bugs- with-safe-languages.html == In Japanease == "安全なプログラミング言語を使って heartbleed を防ぐには" https://github.com/jats-ug/translate/blob/master/Web/ bluishcoder.co.nz/2014/04/11/preventing-heartbleed-bugs-with-safe- languages.md "A safer systems programming language could have prevented the bug." "A safer systems programming language could have prevented the bug." "A safer systems programming language could have prevented the bug." "A safer systems programming language could have prevented the bug." "A safer systems programming language could have prevented the bug."
  • 12. [3] What's Ajhc compiler?[3] What's Ajhc compiler?[3] What's Ajhc compiler?[3] What's Ajhc compiler?[3] What's Ajhc compiler? http://ajhc.metasepi.org/http://ajhc.metasepi.org/http://ajhc.metasepi.org/http://ajhc.metasepi.org/http://ajhc.metasepi.org/ ☆ Ajhc := Arafura designed jhc☆ Ajhc := Arafura designed jhc☆ Ajhc := Arafura designed jhc☆ Ajhc := Arafura designed jhc☆ Ajhc := Arafura designed jhc ☆ jhc := John's Haskell Compiler☆ jhc := John's Haskell Compiler☆ jhc := John's Haskell Compiler☆ jhc := John's Haskell Compiler☆ jhc := John's Haskell Compiler ☆ http://repetae.net/computer/jhc/☆ http://repetae.net/computer/jhc/☆ http://repetae.net/computer/jhc/☆ http://repetae.net/computer/jhc/☆ http://repetae.net/computer/jhc/ ☆ Jhc outputs binary that has low- memory-footprint and runs fast. ☆ Jhc outputs binary that has low- memory-footprint and runs fast. ☆ Jhc outputs binary that has low- memory-footprint and runs fast. ☆ Jhc outputs binary that has low- memory-footprint and runs fast. ☆ Jhc outputs binary that has low- memory-footprint and runs fast.
  • 13. Who is John?Who is John?Who is John?Who is John?Who is John? ☆ John Meacham☆ John Meacham☆ John Meacham☆ John Meacham☆ John Meacham ☆ http://repetae.net/☆ http://repetae.net/☆ http://repetae.net/☆ http://repetae.net/☆ http://repetae.net/
  • 14. Why choose jhc?Why choose jhc?Why choose jhc?Why choose jhc?Why choose jhc? Programs to print "hoge" on terminal. The lesser depends on POSIX, the smaller values. Programs to print "hoge" on terminal. The lesser depends on POSIX, the smaller values. Programs to print "hoge" on terminal. The lesser depends on POSIX, the smaller values. Programs to print "hoge" on terminal. The lesser depends on POSIX, the smaller values. Programs to print "hoge" on terminal. The lesser depends on POSIX, the smaller values.
  • 15. Jhc is translator to C languageJhc is translator to C languageJhc is translator to C languageJhc is translator to C languageJhc is translator to C language
  • 16. [4] Reentrancy and Context[4] Reentrancy and Context[4] Reentrancy and Context[4] Reentrancy and Context[4] Reentrancy and Context ☆ Metasepi needs language implementation supporting reentrancy. ☆ Metasepi needs language implementation supporting reentrancy. ☆ Metasepi needs language implementation supporting reentrancy. ☆ Metasepi needs language implementation supporting reentrancy. ☆ Metasepi needs language implementation supporting reentrancy. ☆ Why?☆ Why?☆ Why?☆ Why?☆ Why?
  • 17. Why need Reentrancy?Why need Reentrancy?Why need Reentrancy?Why need Reentrancy?Why need Reentrancy? ☆ There are 2 way for multitasking☆ There are 2 way for multitasking☆ There are 2 way for multitasking☆ There are 2 way for multitasking☆ There are 2 way for multitasking ☆ [A] Nonpreemptive multitasking☆ [A] Nonpreemptive multitasking☆ [A] Nonpreemptive multitasking☆ [A] Nonpreemptive multitasking☆ [A] Nonpreemptive multitasking ☆ [B] Preemptive multitasking☆ [B] Preemptive multitasking☆ [B] Preemptive multitasking☆ [B] Preemptive multitasking☆ [B] Preemptive multitasking ☆ Unix-like OS needs [B]☆ Unix-like OS needs [B]☆ Unix-like OS needs [B]☆ Unix-like OS needs [B]☆ Unix-like OS needs [B] ☆ [B] needs the hardware interrupts☆ [B] needs the hardware interrupts☆ [B] needs the hardware interrupts☆ [B] needs the hardware interrupts☆ [B] needs the hardware interrupts ☆ Interrupt handler should be reentrant☆ Interrupt handler should be reentrant☆ Interrupt handler should be reentrant☆ Interrupt handler should be reentrant☆ Interrupt handler should be reentrant
  • 18. What's Reentrancy?What's Reentrancy?What's Reentrancy?What's Reentrancy?What's Reentrancy? Reentrant code can be interrupted in the middle of its execution and then safely called again ("re-entered") before its previous invocations complete execution. Reentrant code can be interrupted in the middle of its execution and then safely called again ("re-entered") before its previous invocations complete execution. Reentrant code can be interrupted in the middle of its execution and then safely called again ("re-entered") before its previous invocations complete execution. Reentrant code can be interrupted in the middle of its execution and then safely called again ("re-entered") before its previous invocations complete execution. Reentrant code can be interrupted in the middle of its execution and then safely called again ("re-entered") before its previous invocations complete execution.
  • 19. What's Context on C language?What's Context on C language?What's Context on C language?What's Context on C language?What's Context on C language? ☆ A set of registers and call stacks☆ A set of registers and call stacks☆ A set of registers and call stacks☆ A set of registers and call stacks☆ A set of registers and call stacks
  • 20. Where Context come from?Where Context come from?Where Context come from?Where Context come from?Where Context come from?
  • 21. What's Context switch?What's Context switch?What's Context switch?What's Context switch?What's Context switch? The process of storing and restoring the state (context) of a process or thread so that execution can be resumed from the same point at a later time. The process of storing and restoring the state (context) of a process or thread so that execution can be resumed from the same point at a later time. The process of storing and restoring the state (context) of a process or thread so that execution can be resumed from the same point at a later time. The process of storing and restoring the state (context) of a process or thread so that execution can be resumed from the same point at a later time. The process of storing and restoring the state (context) of a process or thread so that execution can be resumed from the same point at a later time.
  • 22. Support reentrancy with GCSupport reentrancy with GCSupport reentrancy with GCSupport reentrancy with GCSupport reentrancy with GC ☆ Metasepi uses strongly typed language ☆ Metasepi uses strongly typed language ☆ Metasepi uses strongly typed language ☆ Metasepi uses strongly typed language ☆ Metasepi uses strongly typed language ☆ Strongly typed language sometimes needs GC ☆ Strongly typed language sometimes needs GC ☆ Strongly typed language sometimes needs GC ☆ Strongly typed language sometimes needs GC ☆ Strongly typed language sometimes needs GC ☆ Most languages doesn't support reentrancy with GC ☆ Most languages doesn't support reentrancy with GC ☆ Most languages doesn't support reentrancy with GC ☆ Most languages doesn't support reentrancy with GC ☆ Most languages doesn't support reentrancy with GC ☆ How to support reentrancy with GC?☆ How to support reentrancy with GC?☆ How to support reentrancy with GC?☆ How to support reentrancy with GC?☆ How to support reentrancy with GC?
  • 23. Problem: Interrupt and GCProblem: Interrupt and GCProblem: Interrupt and GCProblem: Interrupt and GCProblem: Interrupt and GC
  • 24. [5] Context Local Heap (CLHs)[5] Context Local Heap (CLHs)[5] Context Local Heap (CLHs)[5] Context Local Heap (CLHs)[5] Context Local Heap (CLHs) ☆ Idea: Isolate contexts by local heap☆ Idea: Isolate contexts by local heap☆ Idea: Isolate contexts by local heap☆ Idea: Isolate contexts by local heap☆ Idea: Isolate contexts by local heap
  • 25. Isolated contexts are reentrant?Isolated contexts are reentrant?Isolated contexts are reentrant?Isolated contexts are reentrant?Isolated contexts are reentrant?
  • 26. Let's define "Haskell Context"Let's define "Haskell Context"Let's define "Haskell Context"Let's define "Haskell Context"Let's define "Haskell Context"
  • 27. Haskell Context on jhcHaskell Context on jhcHaskell Context on jhcHaskell Context on jhcHaskell Context on jhc
  • 28. Haskell Context life cycle (jhc)Haskell Context life cycle (jhc)Haskell Context life cycle (jhc)Haskell Context life cycle (jhc)Haskell Context life cycle (jhc)
  • 29. Interaction with C on jhcInteraction with C on jhcInteraction with C on jhcInteraction with C on jhcInteraction with C on jhc
  • 30. Haskell Context on AjhcHaskell Context on AjhcHaskell Context on AjhcHaskell Context on AjhcHaskell Context on Ajhc
  • 31. Haskell Context life cycle (Ajhc)Haskell Context life cycle (Ajhc)Haskell Context life cycle (Ajhc)Haskell Context life cycle (Ajhc)Haskell Context life cycle (Ajhc)
  • 32. Interaction with C on AjhcInteraction with C on AjhcInteraction with C on AjhcInteraction with C on AjhcInteraction with C on Ajhc
  • 33. [6] How to write Haskell driver?[6] How to write Haskell driver?[6] How to write Haskell driver?[6] How to write Haskell driver?[6] How to write Haskell driver? ☆ Language: Ajhc Haskell compiler☆ Language: Ajhc Haskell compiler☆ Language: Ajhc Haskell compiler☆ Language: Ajhc Haskell compiler☆ Language: Ajhc Haskell compiler ☆ Base code: NetBSD kernel☆ Base code: NetBSD kernel☆ Base code: NetBSD kernel☆ Base code: NetBSD kernel☆ Base code: NetBSD kernel ☆ Method: Snatch-driven development☆ Method: Snatch-driven development☆ Method: Snatch-driven development☆ Method: Snatch-driven development☆ Method: Snatch-driven development
  • 34. Snatch-driven development #1Snatch-driven development #1Snatch-driven development #1Snatch-driven development #1Snatch-driven development #1 http://en.wikipedia.org/wiki/Snatcherhttp://en.wikipedia.org/wiki/Snatcherhttp://en.wikipedia.org/wiki/Snatcherhttp://en.wikipedia.org/wiki/Snatcherhttp://en.wikipedia.org/wiki/Snatcher
  • 35. Snatch-driven development #2Snatch-driven development #2Snatch-driven development #2Snatch-driven development #2Snatch-driven development #2
  • 36. To access out of GC heepTo access out of GC heepTo access out of GC heepTo access out of GC heepTo access out of GC heep
  • 37. Generate code to access C structGenerate code to access C structGenerate code to access C structGenerate code to access C structGenerate code to access C struct https://github.com/ajhc/struct2hshttps://github.com/ajhc/struct2hshttps://github.com/ajhc/struct2hshttps://github.com/ajhc/struct2hshttps://github.com/ajhc/struct2hs $ struct2hs sys/dev/pci/auich_extern_SNATCHED.h | tail$ struct2hs sys/dev/pci/auich_extern_SNATCHED.h | tail$ struct2hs sys/dev/pci/auich_extern_SNATCHED.h | tail$ struct2hs sys/dev/pci/auich_extern_SNATCHED.h | tail$ struct2hs sys/dev/pci/auich_extern_SNATCHED.h | tail offsetOf_Pdevinit_pdev_attach :: Int p_Pdevinit_pdev_attach :: Ptr Pdevinit -> IO (Ptr (Ptr (FunPtr (Int -> IO ())))) p_Pdevinit_pdev_attach p = return $ plusPtr p $ offsetOf_Pdevinit_pdev_attach foreign import ccall "dynamic" call_Pdevinit_pdev_attach :: FunPtr (Int -> IO ()) -> Int -> IO () foreign import primitive "const.offsetof(struct pdevinit, pdev_count)" offsetOf_Pdevinit_pdev_count :: Int p_Pdevinit_pdev_count :: Ptr Pdevinit -> IO (Ptr Int) p_Pdevinit_pdev_count p = return $ plusPtr p $ offsetOf_Pdevinit_pdev_count offsetOf_Pdevinit_pdev_attach :: Int p_Pdevinit_pdev_attach :: Ptr Pdevinit -> IO (Ptr (Ptr (FunPtr (Int -> IO ())))) p_Pdevinit_pdev_attach p = return $ plusPtr p $ offsetOf_Pdevinit_pdev_attach foreign import ccall "dynamic" call_Pdevinit_pdev_attach :: FunPtr (Int -> IO ()) -> Int -> IO () foreign import primitive "const.offsetof(struct pdevinit, pdev_count)" offsetOf_Pdevinit_pdev_count :: Int p_Pdevinit_pdev_count :: Ptr Pdevinit -> IO (Ptr Int) p_Pdevinit_pdev_count p = return $ plusPtr p $ offsetOf_Pdevinit_pdev_count offsetOf_Pdevinit_pdev_attach :: Int p_Pdevinit_pdev_attach :: Ptr Pdevinit -> IO (Ptr (Ptr (FunPtr (Int -> IO ())))) p_Pdevinit_pdev_attach p = return $ plusPtr p $ offsetOf_Pdevinit_pdev_attach foreign import ccall "dynamic" call_Pdevinit_pdev_attach :: FunPtr (Int -> IO ()) -> Int -> IO () foreign import primitive "const.offsetof(struct pdevinit, pdev_count)" offsetOf_Pdevinit_pdev_count :: Int p_Pdevinit_pdev_count :: Ptr Pdevinit -> IO (Ptr Int) p_Pdevinit_pdev_count p = return $ plusPtr p $ offsetOf_Pdevinit_pdev_count offsetOf_Pdevinit_pdev_attach :: Int p_Pdevinit_pdev_attach :: Ptr Pdevinit -> IO (Ptr (Ptr (FunPtr (Int -> IO ())))) p_Pdevinit_pdev_attach p = return $ plusPtr p $ offsetOf_Pdevinit_pdev_attach foreign import ccall "dynamic" call_Pdevinit_pdev_attach :: FunPtr (Int -> IO ()) -> Int -> IO () foreign import primitive "const.offsetof(struct pdevinit, pdev_count)" offsetOf_Pdevinit_pdev_count :: Int p_Pdevinit_pdev_count :: Ptr Pdevinit -> IO (Ptr Int) p_Pdevinit_pdev_count p = return $ plusPtr p $ offsetOf_Pdevinit_pdev_count offsetOf_Pdevinit_pdev_attach :: Int p_Pdevinit_pdev_attach :: Ptr Pdevinit -> IO (Ptr (Ptr (FunPtr (Int -> IO ())))) p_Pdevinit_pdev_attach p = return $ plusPtr p $ offsetOf_Pdevinit_pdev_attach foreign import ccall "dynamic" call_Pdevinit_pdev_attach :: FunPtr (Int -> IO ()) -> Int -> IO () foreign import primitive "const.offsetof(struct pdevinit, pdev_count)" offsetOf_Pdevinit_pdev_count :: Int p_Pdevinit_pdev_count :: Ptr Pdevinit -> IO (Ptr Int) p_Pdevinit_pdev_count p = return $ plusPtr p $ offsetOf_Pdevinit_pdev_count
  • 38. Access C struct in kernelAccess C struct in kernelAccess C struct in kernelAccess C struct in kernelAccess C struct in kernel /* C code */ static int auich_set_port(void *v, mixer_ctrl_t *cp) { struct auich_softc *sc; sc = v; return sc->codec_if->vtbl->mixer_set_port(sc->codec_if, cp); } /* C code */ static int auich_set_port(void *v, mixer_ctrl_t *cp) { struct auich_softc *sc; sc = v; return sc->codec_if->vtbl->mixer_set_port(sc->codec_if, cp); } /* C code */ static int auich_set_port(void *v, mixer_ctrl_t *cp) { struct auich_softc *sc; sc = v; return sc->codec_if->vtbl->mixer_set_port(sc->codec_if, cp); } /* C code */ static int auich_set_port(void *v, mixer_ctrl_t *cp) { struct auich_softc *sc; sc = v; return sc->codec_if->vtbl->mixer_set_port(sc->codec_if, cp); } /* C code */ static int auich_set_port(void *v, mixer_ctrl_t *cp) { struct auich_softc *sc; sc = v; return sc->codec_if->vtbl->mixer_set_port(sc->codec_if, cp); } -- Haskell code foreign export ccall "auichSetPort" auichSetPort :: Ptr AuichSoftc -> Ptr MixerCtrl -> IO Int auichSetPort :: Ptr AuichSoftc -> Ptr MixerCtrl -> IO Int auichSetPort sc cp = do codecif <- peek =<< p_AuichSoftc_codec_if sc f <- peek =<< p_Ac97CodecIfVtbl_mixer_set_port =<< peek =<< p_Ac97CodecIf_vtbl codecif call_Ac97CodecIfVtbl_mixer_set_port f codecif cp -- Haskell code foreign export ccall "auichSetPort" auichSetPort :: Ptr AuichSoftc -> Ptr MixerCtrl -> IO Int auichSetPort :: Ptr AuichSoftc -> Ptr MixerCtrl -> IO Int auichSetPort sc cp = do codecif <- peek =<< p_AuichSoftc_codec_if sc f <- peek =<< p_Ac97CodecIfVtbl_mixer_set_port =<< peek =<< p_Ac97CodecIf_vtbl codecif call_Ac97CodecIfVtbl_mixer_set_port f codecif cp -- Haskell code foreign export ccall "auichSetPort" auichSetPort :: Ptr AuichSoftc -> Ptr MixerCtrl -> IO Int auichSetPort :: Ptr AuichSoftc -> Ptr MixerCtrl -> IO Int auichSetPort sc cp = do codecif <- peek =<< p_AuichSoftc_codec_if sc f <- peek =<< p_Ac97CodecIfVtbl_mixer_set_port =<< peek =<< p_Ac97CodecIf_vtbl codecif call_Ac97CodecIfVtbl_mixer_set_port f codecif cp -- Haskell code foreign export ccall "auichSetPort" auichSetPort :: Ptr AuichSoftc -> Ptr MixerCtrl -> IO Int auichSetPort :: Ptr AuichSoftc -> Ptr MixerCtrl -> IO Int auichSetPort sc cp = do codecif <- peek =<< p_AuichSoftc_codec_if sc f <- peek =<< p_Ac97CodecIfVtbl_mixer_set_port =<< peek =<< p_Ac97CodecIf_vtbl codecif call_Ac97CodecIfVtbl_mixer_set_port f codecif cp -- Haskell code foreign export ccall "auichSetPort" auichSetPort :: Ptr AuichSoftc -> Ptr MixerCtrl -> IO Int auichSetPort :: Ptr AuichSoftc -> Ptr MixerCtrl -> IO Int auichSetPort sc cp = do codecif <- peek =<< p_AuichSoftc_codec_if sc f <- peek =<< p_Ac97CodecIfVtbl_mixer_set_port =<< peek =<< p_Ac97CodecIf_vtbl codecif call_Ac97CodecIfVtbl_mixer_set_port f codecif cp
  • 39. AC'97 sound driverAC'97 sound driverAC'97 sound driverAC'97 sound driverAC'97 sound driver
  • 40. HD Audio sound driverHD Audio sound driverHD Audio sound driverHD Audio sound driverHD Audio sound driver
  • 41. BenchmarkBenchmarkBenchmarkBenchmarkBenchmark (O) Original NetBSD 6.1.2 kernel (S) The kernel includes AC'97 and HD Audio driver snatched by Ajhc (N) (S) + using naive GC (B4) (S) + having GC block 16 Byte (B5) (S) + having GC block 32 Byte (B6) (S) + having GC block 64 Byte (O) Original NetBSD 6.1.2 kernel (S) The kernel includes AC'97 and HD Audio driver snatched by Ajhc (N) (S) + using naive GC (B4) (S) + having GC block 16 Byte (B5) (S) + having GC block 32 Byte (B6) (S) + having GC block 64 Byte (O) Original NetBSD 6.1.2 kernel (S) The kernel includes AC'97 and HD Audio driver snatched by Ajhc (N) (S) + using naive GC (B4) (S) + having GC block 16 Byte (B5) (S) + having GC block 32 Byte (B6) (S) + having GC block 64 Byte (O) Original NetBSD 6.1.2 kernel (S) The kernel includes AC'97 and HD Audio driver snatched by Ajhc (N) (S) + using naive GC (B4) (S) + having GC block 16 Byte (B5) (S) + having GC block 32 Byte (B6) (S) + having GC block 64 Byte (O) Original NetBSD 6.1.2 kernel (S) The kernel includes AC'97 and HD Audio driver snatched by Ajhc (N) (S) + using naive GC (B4) (S) + having GC block 16 Byte (B5) (S) + having GC block 32 Byte (B6) (S) + having GC block 64 Byte
  • 42. [7] What's coming next?[7] What's coming next?[7] What's coming next?[7] What's coming next?[7] What's coming next?
  • 43. What's ATS language?What's ATS language?What's ATS language?What's ATS language?What's ATS language? http://www.ats-lang.org/http://www.ats-lang.org/http://www.ats-lang.org/http://www.ats-lang.org/http://www.ats-lang.org/ ☆ Dependent types☆ Dependent types☆ Dependent types☆ Dependent types☆ Dependent types ☆ Linear types☆ Linear types☆ Linear types☆ Linear types☆ Linear types ☆ Without any runtime☆ Without any runtime☆ Without any runtime☆ Without any runtime☆ Without any runtime ☆ Optional GC☆ Optional GC☆ Optional GC☆ Optional GC☆ Optional GC ☆ Developing at Boston University☆ Developing at Boston University☆ Developing at Boston University☆ Developing at Boston University☆ Developing at Boston University ☆ Designer := Hongwei Xi☆ Designer := Hongwei Xi☆ Designer := Hongwei Xi☆ Designer := Hongwei Xi☆ Designer := Hongwei Xi
  • 44. Hongwei said... (cont.)Hongwei said... (cont.)Hongwei said... (cont.)Hongwei said... (cont.)Hongwei said... (cont.) Date: Mon Dec 23 11:40 JST 2013 Hi Metasepi-chan, I spent quite some time today browsing metasepi.org. I am really interested in your Metasepi project, partly because I myself wanted to implement NetBSD in ATS about 5 years ago. Unfortunately, I never had time to get the project started as I needed to spend so much time on ATS2. By the way, I had planned to use the very same approach which you call "Snatch". I had also considered Minix but I chose NetBSD because it was a real OS. I think I know first-handedly the dilemma you are currently in. On one hand, you want to be able to fully focus on writing the kernel. On the other hand, you also need to add features to Ajhc constantly to address all kinds of issues that keep popping up, which undoubtedly makes it very difficult for you to focus. Date: Mon Dec 23 11:40 JST 2013 Hi Metasepi-chan, I spent quite some time today browsing metasepi.org. I am really interested in your Metasepi project, partly because I myself wanted to implement NetBSD in ATS about 5 years ago. Unfortunately, I never had time to get the project started as I needed to spend so much time on ATS2. By the way, I had planned to use the very same approach which you call "Snatch". I had also considered Minix but I chose NetBSD because it was a real OS. I think I know first-handedly the dilemma you are currently in. On one hand, you want to be able to fully focus on writing the kernel. On the other hand, you also need to add features to Ajhc constantly to address all kinds of issues that keep popping up, which undoubtedly makes it very difficult for you to focus. Date: Mon Dec 23 11:40 JST 2013 Hi Metasepi-chan, I spent quite some time today browsing metasepi.org. I am really interested in your Metasepi project, partly because I myself wanted to implement NetBSD in ATS about 5 years ago. Unfortunately, I never had time to get the project started as I needed to spend so much time on ATS2. By the way, I had planned to use the very same approach which you call "Snatch". I had also considered Minix but I chose NetBSD because it was a real OS. I think I know first-handedly the dilemma you are currently in. On one hand, you want to be able to fully focus on writing the kernel. On the other hand, you also need to add features to Ajhc constantly to address all kinds of issues that keep popping up, which undoubtedly makes it very difficult for you to focus. Date: Mon Dec 23 11:40 JST 2013 Hi Metasepi-chan, I spent quite some time today browsing metasepi.org. I am really interested in your Metasepi project, partly because I myself wanted to implement NetBSD in ATS about 5 years ago. Unfortunately, I never had time to get the project started as I needed to spend so much time on ATS2. By the way, I had planned to use the very same approach which you call "Snatch". I had also considered Minix but I chose NetBSD because it was a real OS. I think I know first-handedly the dilemma you are currently in. On one hand, you want to be able to fully focus on writing the kernel. On the other hand, you also need to add features to Ajhc constantly to address all kinds of issues that keep popping up, which undoubtedly makes it very difficult for you to focus. Date: Mon Dec 23 11:40 JST 2013 Hi Metasepi-chan, I spent quite some time today browsing metasepi.org. I am really interested in your Metasepi project, partly because I myself wanted to implement NetBSD in ATS about 5 years ago. Unfortunately, I never had time to get the project started as I needed to spend so much time on ATS2. By the way, I had planned to use the very same approach which you call "Snatch". I had also considered Minix but I chose NetBSD because it was a real OS. I think I know first-handedly the dilemma you are currently in. On one hand, you want to be able to fully focus on writing the kernel. On the other hand, you also need to add features to Ajhc constantly to address all kinds of issues that keep popping up, which undoubtedly makes it very difficult for you to focus.
  • 45. Hongwei said... (cont.)Hongwei said... (cont.)Hongwei said... (cont.)Hongwei said... (cont.)Hongwei said... (cont.) I would highly recommend that you use ATS to implement NetBSD kernel. Unlike jhc, there is no semantics gap between ATS and C. In particular, they both use the same native unboxed data representation. Once you become familiar with ATS, you can readily visualize the C code that your ATS source is to be compiled into. ATS is truly an ideal language for the kind of "Snatch" approach you want to take to re-write NetBSD. If you take the lead, then I will be happy to "chip in" :) I also spent some time reading documentation on jhc. Personally, I feel that there is simply too much uncertainty to use it in real kernel implementation. Features like GC could make the kernel highly unpredictable, scaring away potential users. I think that we both believe C is the right language for systems programming. The problem with C is that it is too difficult to write correct C programs. ATS is designed to allow the programmer to correctly write the kind of C programs he or she wanted to write in the first place. While jhc generates C code, the kind of C code it generates may not be suited for kernel. This is what I call a semantics gap. I would highly recommend that you use ATS to implement NetBSD kernel. Unlike jhc, there is no semantics gap between ATS and C. In particular, they both use the same native unboxed data representation. Once you become familiar with ATS, you can readily visualize the C code that your ATS source is to be compiled into. ATS is truly an ideal language for the kind of "Snatch" approach you want to take to re-write NetBSD. If you take the lead, then I will be happy to "chip in" :) I also spent some time reading documentation on jhc. Personally, I feel that there is simply too much uncertainty to use it in real kernel implementation. Features like GC could make the kernel highly unpredictable, scaring away potential users. I think that we both believe C is the right language for systems programming. The problem with C is that it is too difficult to write correct C programs. ATS is designed to allow the programmer to correctly write the kind of C programs he or she wanted to write in the first place. While jhc generates C code, the kind of C code it generates may not be suited for kernel. This is what I call a semantics gap. I would highly recommend that you use ATS to implement NetBSD kernel. Unlike jhc, there is no semantics gap between ATS and C. In particular, they both use the same native unboxed data representation. Once you become familiar with ATS, you can readily visualize the C code that your ATS source is to be compiled into. ATS is truly an ideal language for the kind of "Snatch" approach you want to take to re-write NetBSD. If you take the lead, then I will be happy to "chip in" :) I also spent some time reading documentation on jhc. Personally, I feel that there is simply too much uncertainty to use it in real kernel implementation. Features like GC could make the kernel highly unpredictable, scaring away potential users. I think that we both believe C is the right language for systems programming. The problem with C is that it is too difficult to write correct C programs. ATS is designed to allow the programmer to correctly write the kind of C programs he or she wanted to write in the first place. While jhc generates C code, the kind of C code it generates may not be suited for kernel. This is what I call a semantics gap. I would highly recommend that you use ATS to implement NetBSD kernel. Unlike jhc, there is no semantics gap between ATS and C. In particular, they both use the same native unboxed data representation. Once you become familiar with ATS, you can readily visualize the C code that your ATS source is to be compiled into. ATS is truly an ideal language for the kind of "Snatch" approach you want to take to re-write NetBSD. If you take the lead, then I will be happy to "chip in" :) I also spent some time reading documentation on jhc. Personally, I feel that there is simply too much uncertainty to use it in real kernel implementation. Features like GC could make the kernel highly unpredictable, scaring away potential users. I think that we both believe C is the right language for systems programming. The problem with C is that it is too difficult to write correct C programs. ATS is designed to allow the programmer to correctly write the kind of C programs he or she wanted to write in the first place. While jhc generates C code, the kind of C code it generates may not be suited for kernel. This is what I call a semantics gap. I would highly recommend that you use ATS to implement NetBSD kernel. Unlike jhc, there is no semantics gap between ATS and C. In particular, they both use the same native unboxed data representation. Once you become familiar with ATS, you can readily visualize the C code that your ATS source is to be compiled into. ATS is truly an ideal language for the kind of "Snatch" approach you want to take to re-write NetBSD. If you take the lead, then I will be happy to "chip in" :) I also spent some time reading documentation on jhc. Personally, I feel that there is simply too much uncertainty to use it in real kernel implementation. Features like GC could make the kernel highly unpredictable, scaring away potential users. I think that we both believe C is the right language for systems programming. The problem with C is that it is too difficult to write correct C programs. ATS is designed to allow the programmer to correctly write the kind of C programs he or she wanted to write in the first place. While jhc generates C code, the kind of C code it generates may not be suited for kernel. This is what I call a semantics gap.
  • 46. Hongwei said...Hongwei said...Hongwei said...Hongwei said...Hongwei said... I write this message in the hope that we could join effort in doing something that has not been done up to now: Writing a real kernel in (largely) functional style that can truly deliever safety-wise as well as performance-wise. Cheers, --Hongwei I write this message in the hope that we could join effort in doing something that has not been done up to now: Writing a real kernel in (largely) functional style that can truly deliever safety-wise as well as performance-wise. Cheers, --Hongwei I write this message in the hope that we could join effort in doing something that has not been done up to now: Writing a real kernel in (largely) functional style that can truly deliever safety-wise as well as performance-wise. Cheers, --Hongwei I write this message in the hope that we could join effort in doing something that has not been done up to now: Writing a real kernel in (largely) functional style that can truly deliever safety-wise as well as performance-wise. Cheers, --Hongwei I write this message in the hope that we could join effort in doing something that has not been done up to now: Writing a real kernel in (largely) functional style that can truly deliever safety-wise as well as performance-wise. Cheers, --Hongwei
  • 47. Follow me!Follow me!Follow me!Follow me!Follow me! ☆ http://jats-ug.metasepi.org/☆ http://jats-ug.metasepi.org/☆ http://jats-ug.metasepi.org/☆ http://jats-ug.metasepi.org/☆ http://jats-ug.metasepi.org/ ☆ https://twitter.com/jats_ug☆ https://twitter.com/jats_ug☆ https://twitter.com/jats_ug☆ https://twitter.com/jats_ug☆ https://twitter.com/jats_ug
  • 48. License of photos used #1License of photos used #1License of photos used #1License of photos used #1License of photos used #1 * ゴミ収集車 | Flickr - Photo Sharing! https://www.flickr.com/photos/shuto/8816770503/ Copyright: 2013 Shuto Araki / License: CC BY 2.0 * Hooded Cuttlefish | Flickr - Photo Sharing! https://www.flickr.com/photos/silkebaron/931247866/ Copyright: 2007 Silke Baron / License: CC BY 2.0 * Hooded Cuttlefish | Flickr - Photo Sharing! https://www.flickr.com/photos/silkebaron/931381358/ Copyright: 2007 Silke Baron / License: CC BY 2.0 * Javi Recio y David Cabrera | Flickr - Photo Sharing! https://www.flickr.com/photos/otakumunidad/5787704531/ Copyright: 2011 Otakumunidad Damned / License: CC BY 2.0 * Obsolete CDs | Flickr - Photo Sharing! https://www.flickr.com/photos/automaciej/203064118 Copyright: 2006 Maciej Bliziński / License: CC BY-SA 2.0 * Рынок / Bazaar | Flickr - Photo Sharing! https://www.flickr.com/photos/atbaker/81637 Copyright: 2004 Adam Baker / License: CC BY 2.0 * Cheonggyecheon Umbrellas | Flickr - Photo Sharing! https://www.flickr.com/photos/traveloriented/13436873274 Copyright: 2014 travel oriented / License: CC BY-SA 2.0 * ゴミ収集車 | Flickr - Photo Sharing! https://www.flickr.com/photos/shuto/8816770503/ Copyright: 2013 Shuto Araki / License: CC BY 2.0 * Hooded Cuttlefish | Flickr - Photo Sharing! https://www.flickr.com/photos/silkebaron/931247866/ Copyright: 2007 Silke Baron / License: CC BY 2.0 * Hooded Cuttlefish | Flickr - Photo Sharing! https://www.flickr.com/photos/silkebaron/931381358/ Copyright: 2007 Silke Baron / License: CC BY 2.0 * Javi Recio y David Cabrera | Flickr - Photo Sharing! https://www.flickr.com/photos/otakumunidad/5787704531/ Copyright: 2011 Otakumunidad Damned / License: CC BY 2.0 * Obsolete CDs | Flickr - Photo Sharing! https://www.flickr.com/photos/automaciej/203064118 Copyright: 2006 Maciej Bliziński / License: CC BY-SA 2.0 * Рынок / Bazaar | Flickr - Photo Sharing! https://www.flickr.com/photos/atbaker/81637 Copyright: 2004 Adam Baker / License: CC BY 2.0 * Cheonggyecheon Umbrellas | Flickr - Photo Sharing! https://www.flickr.com/photos/traveloriented/13436873274 Copyright: 2014 travel oriented / License: CC BY-SA 2.0 * ゴミ収集車 | Flickr - Photo Sharing! https://www.flickr.com/photos/shuto/8816770503/ Copyright: 2013 Shuto Araki / License: CC BY 2.0 * Hooded Cuttlefish | Flickr - Photo Sharing! https://www.flickr.com/photos/silkebaron/931247866/ Copyright: 2007 Silke Baron / License: CC BY 2.0 * Hooded Cuttlefish | Flickr - Photo Sharing! https://www.flickr.com/photos/silkebaron/931381358/ Copyright: 2007 Silke Baron / License: CC BY 2.0 * Javi Recio y David Cabrera | Flickr - Photo Sharing! https://www.flickr.com/photos/otakumunidad/5787704531/ Copyright: 2011 Otakumunidad Damned / License: CC BY 2.0 * Obsolete CDs | Flickr - Photo Sharing! https://www.flickr.com/photos/automaciej/203064118 Copyright: 2006 Maciej Bliziński / License: CC BY-SA 2.0 * Рынок / Bazaar | Flickr - Photo Sharing! https://www.flickr.com/photos/atbaker/81637 Copyright: 2004 Adam Baker / License: CC BY 2.0 * Cheonggyecheon Umbrellas | Flickr - Photo Sharing! https://www.flickr.com/photos/traveloriented/13436873274 Copyright: 2014 travel oriented / License: CC BY-SA 2.0 * ゴミ収集車 | Flickr - Photo Sharing! https://www.flickr.com/photos/shuto/8816770503/ Copyright: 2013 Shuto Araki / License: CC BY 2.0 * Hooded Cuttlefish | Flickr - Photo Sharing! https://www.flickr.com/photos/silkebaron/931247866/ Copyright: 2007 Silke Baron / License: CC BY 2.0 * Hooded Cuttlefish | Flickr - Photo Sharing! https://www.flickr.com/photos/silkebaron/931381358/ Copyright: 2007 Silke Baron / License: CC BY 2.0 * Javi Recio y David Cabrera | Flickr - Photo Sharing! https://www.flickr.com/photos/otakumunidad/5787704531/ Copyright: 2011 Otakumunidad Damned / License: CC BY 2.0 * Obsolete CDs | Flickr - Photo Sharing! https://www.flickr.com/photos/automaciej/203064118 Copyright: 2006 Maciej Bliziński / License: CC BY-SA 2.0 * Рынок / Bazaar | Flickr - Photo Sharing! https://www.flickr.com/photos/atbaker/81637 Copyright: 2004 Adam Baker / License: CC BY 2.0 * Cheonggyecheon Umbrellas | Flickr - Photo Sharing! https://www.flickr.com/photos/traveloriented/13436873274 Copyright: 2014 travel oriented / License: CC BY-SA 2.0 * ゴミ収集車 | Flickr - Photo Sharing! https://www.flickr.com/photos/shuto/8816770503/ Copyright: 2013 Shuto Araki / License: CC BY 2.0 * Hooded Cuttlefish | Flickr - Photo Sharing! https://www.flickr.com/photos/silkebaron/931247866/ Copyright: 2007 Silke Baron / License: CC BY 2.0 * Hooded Cuttlefish | Flickr - Photo Sharing! https://www.flickr.com/photos/silkebaron/931381358/ Copyright: 2007 Silke Baron / License: CC BY 2.0 * Javi Recio y David Cabrera | Flickr - Photo Sharing! https://www.flickr.com/photos/otakumunidad/5787704531/ Copyright: 2011 Otakumunidad Damned / License: CC BY 2.0 * Obsolete CDs | Flickr - Photo Sharing! https://www.flickr.com/photos/automaciej/203064118 Copyright: 2006 Maciej Bliziński / License: CC BY-SA 2.0 * Рынок / Bazaar | Flickr - Photo Sharing! https://www.flickr.com/photos/atbaker/81637 Copyright: 2004 Adam Baker / License: CC BY 2.0 * Cheonggyecheon Umbrellas | Flickr - Photo Sharing! https://www.flickr.com/photos/traveloriented/13436873274 Copyright: 2014 travel oriented / License: CC BY-SA 2.0
  • 49. License of photos used #2License of photos used #2License of photos used #2License of photos used #2License of photos used #2 * Jordan shooting Jenna with shield | Flickr - Photo Sharing! https://www.flickr.com/photos/jasoneppink/80772834 Copyright: 2005 Jason Eppink / License: CC BY 2.0 * Imagine a world without trees | Flickr - Photo Sharing! https://www.flickr.com/photos/aloshbennett/3480223314 Copyright: 2009 Alosh Bennett / License: CC BY 2.0 * Soyuz TM-19 Re-entry Capsule | Flickr - Photo Sharing! https://www.flickr.com/photos/pasukaru76/10543300415 Copyright: 2013 Pascal / License: CC BY 2.0 * Do You Know Where Your Valves Are? | Flickr - Photo Sharing! https://www.flickr.com/photos/thristian/371670597 Copyright: 2007 Timothy Allen / License: CC BY-SA 2.0 * Whirlpool | Flickr - Photo Sharing! https://www.flickr.com/photos/59195512@N00/4697467290 Copyright: 2010 The Mighty Tim Inconnu / License: CC BY 2.0 * jumping for the sunset | Flickr - Photo Sharing! https://www.flickr.com/photos/jorgempf/233188420 Copyright: 2006 Jorge / License: CC BY-SA 2.0 * DIY: Shutter Release Switch for Canon DSLRs | Flickr - Photo Sharing! https://www.flickr.com/photos/ivyfield/4763965911 Copyright: 2010 Yutaka Tsutano / License: CC BY 2.0 * Jordan shooting Jenna with shield | Flickr - Photo Sharing! https://www.flickr.com/photos/jasoneppink/80772834 Copyright: 2005 Jason Eppink / License: CC BY 2.0 * Imagine a world without trees | Flickr - Photo Sharing! https://www.flickr.com/photos/aloshbennett/3480223314 Copyright: 2009 Alosh Bennett / License: CC BY 2.0 * Soyuz TM-19 Re-entry Capsule | Flickr - Photo Sharing! https://www.flickr.com/photos/pasukaru76/10543300415 Copyright: 2013 Pascal / License: CC BY 2.0 * Do You Know Where Your Valves Are? | Flickr - Photo Sharing! https://www.flickr.com/photos/thristian/371670597 Copyright: 2007 Timothy Allen / License: CC BY-SA 2.0 * Whirlpool | Flickr - Photo Sharing! https://www.flickr.com/photos/59195512@N00/4697467290 Copyright: 2010 The Mighty Tim Inconnu / License: CC BY 2.0 * jumping for the sunset | Flickr - Photo Sharing! https://www.flickr.com/photos/jorgempf/233188420 Copyright: 2006 Jorge / License: CC BY-SA 2.0 * DIY: Shutter Release Switch for Canon DSLRs | Flickr - Photo Sharing! https://www.flickr.com/photos/ivyfield/4763965911 Copyright: 2010 Yutaka Tsutano / License: CC BY 2.0 * Jordan shooting Jenna with shield | Flickr - Photo Sharing! https://www.flickr.com/photos/jasoneppink/80772834 Copyright: 2005 Jason Eppink / License: CC BY 2.0 * Imagine a world without trees | Flickr - Photo Sharing! https://www.flickr.com/photos/aloshbennett/3480223314 Copyright: 2009 Alosh Bennett / License: CC BY 2.0 * Soyuz TM-19 Re-entry Capsule | Flickr - Photo Sharing! https://www.flickr.com/photos/pasukaru76/10543300415 Copyright: 2013 Pascal / License: CC BY 2.0 * Do You Know Where Your Valves Are? | Flickr - Photo Sharing! https://www.flickr.com/photos/thristian/371670597 Copyright: 2007 Timothy Allen / License: CC BY-SA 2.0 * Whirlpool | Flickr - Photo Sharing! https://www.flickr.com/photos/59195512@N00/4697467290 Copyright: 2010 The Mighty Tim Inconnu / License: CC BY 2.0 * jumping for the sunset | Flickr - Photo Sharing! https://www.flickr.com/photos/jorgempf/233188420 Copyright: 2006 Jorge / License: CC BY-SA 2.0 * DIY: Shutter Release Switch for Canon DSLRs | Flickr - Photo Sharing! https://www.flickr.com/photos/ivyfield/4763965911 Copyright: 2010 Yutaka Tsutano / License: CC BY 2.0 * Jordan shooting Jenna with shield | Flickr - Photo Sharing! https://www.flickr.com/photos/jasoneppink/80772834 Copyright: 2005 Jason Eppink / License: CC BY 2.0 * Imagine a world without trees | Flickr - Photo Sharing! https://www.flickr.com/photos/aloshbennett/3480223314 Copyright: 2009 Alosh Bennett / License: CC BY 2.0 * Soyuz TM-19 Re-entry Capsule | Flickr - Photo Sharing! https://www.flickr.com/photos/pasukaru76/10543300415 Copyright: 2013 Pascal / License: CC BY 2.0 * Do You Know Where Your Valves Are? | Flickr - Photo Sharing! https://www.flickr.com/photos/thristian/371670597 Copyright: 2007 Timothy Allen / License: CC BY-SA 2.0 * Whirlpool | Flickr - Photo Sharing! https://www.flickr.com/photos/59195512@N00/4697467290 Copyright: 2010 The Mighty Tim Inconnu / License: CC BY 2.0 * jumping for the sunset | Flickr - Photo Sharing! https://www.flickr.com/photos/jorgempf/233188420 Copyright: 2006 Jorge / License: CC BY-SA 2.0 * DIY: Shutter Release Switch for Canon DSLRs | Flickr - Photo Sharing! https://www.flickr.com/photos/ivyfield/4763965911 Copyright: 2010 Yutaka Tsutano / License: CC BY 2.0 * Jordan shooting Jenna with shield | Flickr - Photo Sharing! https://www.flickr.com/photos/jasoneppink/80772834 Copyright: 2005 Jason Eppink / License: CC BY 2.0 * Imagine a world without trees | Flickr - Photo Sharing! https://www.flickr.com/photos/aloshbennett/3480223314 Copyright: 2009 Alosh Bennett / License: CC BY 2.0 * Soyuz TM-19 Re-entry Capsule | Flickr - Photo Sharing! https://www.flickr.com/photos/pasukaru76/10543300415 Copyright: 2013 Pascal / License: CC BY 2.0 * Do You Know Where Your Valves Are? | Flickr - Photo Sharing! https://www.flickr.com/photos/thristian/371670597 Copyright: 2007 Timothy Allen / License: CC BY-SA 2.0 * Whirlpool | Flickr - Photo Sharing! https://www.flickr.com/photos/59195512@N00/4697467290 Copyright: 2010 The Mighty Tim Inconnu / License: CC BY 2.0 * jumping for the sunset | Flickr - Photo Sharing! https://www.flickr.com/photos/jorgempf/233188420 Copyright: 2006 Jorge / License: CC BY-SA 2.0 * DIY: Shutter Release Switch for Canon DSLRs | Flickr - Photo Sharing! https://www.flickr.com/photos/ivyfield/4763965911 Copyright: 2010 Yutaka Tsutano / License: CC BY 2.0
  • 50. License of photos used #3License of photos used #3License of photos used #3License of photos used #3License of photos used #3 * 72C Duna SHEER MADNESS Lab Re-entry | Flickr - Photo Sharing! https://www.flickr.com/photos/39416639@N02/12702229414 Copyright: 2014 TheBullethead / License: CC BY 2.0 * Supernova Remnant W49B | Flickr - Photo Sharing! https://www.flickr.com/photos/gsfc/4479812068 Copyright: 2009 NASA Goddard Space Flight Center / License: CC BY 2.0 * The Great Wall of China | Flickr - Photo Sharing! https://www.flickr.com/photos/kk/2149165957 Copyright: 2007 kris krüg / License: CC BY-SA 2.0 * Headshift business card discussion | Flickr - Photo Sharing! https://www.flickr.com/photos/criminalintent/2744040362 Copyright: 2008 Lars Plougmann / License: CC BY-SA 2.0 * Bali Indonesia | Flickr - Photo Sharing! https://www.flickr.com/photos/julzart/9266448615 Copyright: 2013 julia Chapple / License: CC BY 2.0 * Scuba diving Indonesia - Bali - Komodo - Bunaken 2008 | Flickr - Photo Sharing! https://www.flickr.com/photos/39891373@N07/3666275538 Copyright: 2008 Ilse Reijs and Jan-Noud Hutten / License: CC BY 2.0 * 72C Duna SHEER MADNESS Lab Re-entry | Flickr - Photo Sharing! https://www.flickr.com/photos/39416639@N02/12702229414 Copyright: 2014 TheBullethead / License: CC BY 2.0 * Supernova Remnant W49B | Flickr - Photo Sharing! https://www.flickr.com/photos/gsfc/4479812068 Copyright: 2009 NASA Goddard Space Flight Center / License: CC BY 2.0 * The Great Wall of China | Flickr - Photo Sharing! https://www.flickr.com/photos/kk/2149165957 Copyright: 2007 kris krüg / License: CC BY-SA 2.0 * Headshift business card discussion | Flickr - Photo Sharing! https://www.flickr.com/photos/criminalintent/2744040362 Copyright: 2008 Lars Plougmann / License: CC BY-SA 2.0 * Bali Indonesia | Flickr - Photo Sharing! https://www.flickr.com/photos/julzart/9266448615 Copyright: 2013 julia Chapple / License: CC BY 2.0 * Scuba diving Indonesia - Bali - Komodo - Bunaken 2008 | Flickr - Photo Sharing! https://www.flickr.com/photos/39891373@N07/3666275538 Copyright: 2008 Ilse Reijs and Jan-Noud Hutten / License: CC BY 2.0 * 72C Duna SHEER MADNESS Lab Re-entry | Flickr - Photo Sharing! https://www.flickr.com/photos/39416639@N02/12702229414 Copyright: 2014 TheBullethead / License: CC BY 2.0 * Supernova Remnant W49B | Flickr - Photo Sharing! https://www.flickr.com/photos/gsfc/4479812068 Copyright: 2009 NASA Goddard Space Flight Center / License: CC BY 2.0 * The Great Wall of China | Flickr - Photo Sharing! https://www.flickr.com/photos/kk/2149165957 Copyright: 2007 kris krüg / License: CC BY-SA 2.0 * Headshift business card discussion | Flickr - Photo Sharing! https://www.flickr.com/photos/criminalintent/2744040362 Copyright: 2008 Lars Plougmann / License: CC BY-SA 2.0 * Bali Indonesia | Flickr - Photo Sharing! https://www.flickr.com/photos/julzart/9266448615 Copyright: 2013 julia Chapple / License: CC BY 2.0 * Scuba diving Indonesia - Bali - Komodo - Bunaken 2008 | Flickr - Photo Sharing! https://www.flickr.com/photos/39891373@N07/3666275538 Copyright: 2008 Ilse Reijs and Jan-Noud Hutten / License: CC BY 2.0 * 72C Duna SHEER MADNESS Lab Re-entry | Flickr - Photo Sharing! https://www.flickr.com/photos/39416639@N02/12702229414 Copyright: 2014 TheBullethead / License: CC BY 2.0 * Supernova Remnant W49B | Flickr - Photo Sharing! https://www.flickr.com/photos/gsfc/4479812068 Copyright: 2009 NASA Goddard Space Flight Center / License: CC BY 2.0 * The Great Wall of China | Flickr - Photo Sharing! https://www.flickr.com/photos/kk/2149165957 Copyright: 2007 kris krüg / License: CC BY-SA 2.0 * Headshift business card discussion | Flickr - Photo Sharing! https://www.flickr.com/photos/criminalintent/2744040362 Copyright: 2008 Lars Plougmann / License: CC BY-SA 2.0 * Bali Indonesia | Flickr - Photo Sharing! https://www.flickr.com/photos/julzart/9266448615 Copyright: 2013 julia Chapple / License: CC BY 2.0 * Scuba diving Indonesia - Bali - Komodo - Bunaken 2008 | Flickr - Photo Sharing! https://www.flickr.com/photos/39891373@N07/3666275538 Copyright: 2008 Ilse Reijs and Jan-Noud Hutten / License: CC BY 2.0 * 72C Duna SHEER MADNESS Lab Re-entry | Flickr - Photo Sharing! https://www.flickr.com/photos/39416639@N02/12702229414 Copyright: 2014 TheBullethead / License: CC BY 2.0 * Supernova Remnant W49B | Flickr - Photo Sharing! https://www.flickr.com/photos/gsfc/4479812068 Copyright: 2009 NASA Goddard Space Flight Center / License: CC BY 2.0 * The Great Wall of China | Flickr - Photo Sharing! https://www.flickr.com/photos/kk/2149165957 Copyright: 2007 kris krüg / License: CC BY-SA 2.0 * Headshift business card discussion | Flickr - Photo Sharing! https://www.flickr.com/photos/criminalintent/2744040362 Copyright: 2008 Lars Plougmann / License: CC BY-SA 2.0 * Bali Indonesia | Flickr - Photo Sharing! https://www.flickr.com/photos/julzart/9266448615 Copyright: 2013 julia Chapple / License: CC BY 2.0 * Scuba diving Indonesia - Bali - Komodo - Bunaken 2008 | Flickr - Photo Sharing! https://www.flickr.com/photos/39891373@N07/3666275538 Copyright: 2008 Ilse Reijs and Jan-Noud Hutten / License: CC BY 2.0
  • 51. License of photos used #4License of photos used #4License of photos used #4License of photos used #4License of photos used #4 * Scuba diving Bali Nusa Lembongan | Flickr - Photo Sharing! https://www.flickr.com/photos/39891373@N07/4177189387 Copyright: 2009 Ilse Reijs and Jan-Noud Hutten / License: CC BY 2.0 * Project 365 #56: 250210 Thanks For The Memory | Flickr - Photo Sharing! https://www.flickr.com/photos/comedynose/4388430444 Copyright: 2010 Pete / License: CC BY 2.0 * Audio Codec 97 - Wikipedia http://ja.wikipedia.org/wiki/Audio_Codec_97#mediaviewer/%E3%83% 95%E3%82%A1%E3%82%A4%E3%83%AB:Realtek_alc655.jpg Copyright: 2007 Futase tdkr / License: CC BY-SA 3.0 * 紙飛行機 | Flickr - Photo Sharing! https://www.flickr.com/photos/32926922@N08/4281868756 Copyright: 2010 バイク便八王子立川所沢 / License: CC BY 2.0 * Antares Rocket With Cygnus Spacecraft Launches | Flickr - Photo Sharing! https://www.flickr.com/photos/gsfc/9807812154 Copyright: 2013 NASA Goddard Space Flight Center / License: CC BY 2.0 * Scuba diving Bali Nusa Lembongan | Flickr - Photo Sharing! https://www.flickr.com/photos/39891373@N07/4177189387 Copyright: 2009 Ilse Reijs and Jan-Noud Hutten / License: CC BY 2.0 * Project 365 #56: 250210 Thanks For The Memory | Flickr - Photo Sharing! https://www.flickr.com/photos/comedynose/4388430444 Copyright: 2010 Pete / License: CC BY 2.0 * Audio Codec 97 - Wikipedia http://ja.wikipedia.org/wiki/Audio_Codec_97#mediaviewer/%E3%83% 95%E3%82%A1%E3%82%A4%E3%83%AB:Realtek_alc655.jpg Copyright: 2007 Futase tdkr / License: CC BY-SA 3.0 * 紙飛行機 | Flickr - Photo Sharing! https://www.flickr.com/photos/32926922@N08/4281868756 Copyright: 2010 バイク便八王子立川所沢 / License: CC BY 2.0 * Antares Rocket With Cygnus Spacecraft Launches | Flickr - Photo Sharing! https://www.flickr.com/photos/gsfc/9807812154 Copyright: 2013 NASA Goddard Space Flight Center / License: CC BY 2.0 * Scuba diving Bali Nusa Lembongan | Flickr - Photo Sharing! https://www.flickr.com/photos/39891373@N07/4177189387 Copyright: 2009 Ilse Reijs and Jan-Noud Hutten / License: CC BY 2.0 * Project 365 #56: 250210 Thanks For The Memory | Flickr - Photo Sharing! https://www.flickr.com/photos/comedynose/4388430444 Copyright: 2010 Pete / License: CC BY 2.0 * Audio Codec 97 - Wikipedia http://ja.wikipedia.org/wiki/Audio_Codec_97#mediaviewer/%E3%83% 95%E3%82%A1%E3%82%A4%E3%83%AB:Realtek_alc655.jpg Copyright: 2007 Futase tdkr / License: CC BY-SA 3.0 * 紙飛行機 | Flickr - Photo Sharing! https://www.flickr.com/photos/32926922@N08/4281868756 Copyright: 2010 バイク便八王子立川所沢 / License: CC BY 2.0 * Antares Rocket With Cygnus Spacecraft Launches | Flickr - Photo Sharing! https://www.flickr.com/photos/gsfc/9807812154 Copyright: 2013 NASA Goddard Space Flight Center / License: CC BY 2.0 * Scuba diving Bali Nusa Lembongan | Flickr - Photo Sharing! https://www.flickr.com/photos/39891373@N07/4177189387 Copyright: 2009 Ilse Reijs and Jan-Noud Hutten / License: CC BY 2.0 * Project 365 #56: 250210 Thanks For The Memory | Flickr - Photo Sharing! https://www.flickr.com/photos/comedynose/4388430444 Copyright: 2010 Pete / License: CC BY 2.0 * Audio Codec 97 - Wikipedia http://ja.wikipedia.org/wiki/Audio_Codec_97#mediaviewer/%E3%83% 95%E3%82%A1%E3%82%A4%E3%83%AB:Realtek_alc655.jpg Copyright: 2007 Futase tdkr / License: CC BY-SA 3.0 * 紙飛行機 | Flickr - Photo Sharing! https://www.flickr.com/photos/32926922@N08/4281868756 Copyright: 2010 バイク便八王子立川所沢 / License: CC BY 2.0 * Antares Rocket With Cygnus Spacecraft Launches | Flickr - Photo Sharing! https://www.flickr.com/photos/gsfc/9807812154 Copyright: 2013 NASA Goddard Space Flight Center / License: CC BY 2.0 * Scuba diving Bali Nusa Lembongan | Flickr - Photo Sharing! https://www.flickr.com/photos/39891373@N07/4177189387 Copyright: 2009 Ilse Reijs and Jan-Noud Hutten / License: CC BY 2.0 * Project 365 #56: 250210 Thanks For The Memory | Flickr - Photo Sharing! https://www.flickr.com/photos/comedynose/4388430444 Copyright: 2010 Pete / License: CC BY 2.0 * Audio Codec 97 - Wikipedia http://ja.wikipedia.org/wiki/Audio_Codec_97#mediaviewer/%E3%83% 95%E3%82%A1%E3%82%A4%E3%83%AB:Realtek_alc655.jpg Copyright: 2007 Futase tdkr / License: CC BY-SA 3.0 * 紙飛行機 | Flickr - Photo Sharing! https://www.flickr.com/photos/32926922@N08/4281868756 Copyright: 2010 バイク便八王子立川所沢 / License: CC BY 2.0 * Antares Rocket With Cygnus Spacecraft Launches | Flickr - Photo Sharing! https://www.flickr.com/photos/gsfc/9807812154 Copyright: 2013 NASA Goddard Space Flight Center / License: CC BY 2.0
  • 52. License of photos used #5License of photos used #5License of photos used #5License of photos used #5License of photos used #5 * Boston à l'heure bleue | Flickr - Photo Sharing! https://www.flickr.com/photos/ensh/4769294947 Copyright: 2010 Emmanuel Huybrechts / License: CC BY 2.0 * e-mail symbol | Flickr - Photo Sharing! https://www.flickr.com/photos/gsi-r/5341765493 Copyright: 2007 Micky Aldridge / License: CC BY 2.0 * File:Göteborg in moon light.jpg - Wikipedia, the free encyclopedia http://en.wikipedia.org/wiki/File:G%C3%B6teborg_in_moon_light.jpg Copyright: 2004 Amjad Sheikh / License: CC BY-SA 3.0 * Creative Commons BBB | Flickr - Photo Sharing! https://www.flickr.com/photos/steren/2732488224 Copyright: 2008 Steren Giannini / License: CC BY 2.0 * Full body | Flickr - Photo Sharing! https://www.flickr.com/photos/timothytsuihin/2852272823 Copyright: 2008 Timothy Tsui / License: CC BY-SA 2.0 * Boston à l'heure bleue | Flickr - Photo Sharing! https://www.flickr.com/photos/ensh/4769294947 Copyright: 2010 Emmanuel Huybrechts / License: CC BY 2.0 * e-mail symbol | Flickr - Photo Sharing! https://www.flickr.com/photos/gsi-r/5341765493 Copyright: 2007 Micky Aldridge / License: CC BY 2.0 * File:Göteborg in moon light.jpg - Wikipedia, the free encyclopedia http://en.wikipedia.org/wiki/File:G%C3%B6teborg_in_moon_light.jpg Copyright: 2004 Amjad Sheikh / License: CC BY-SA 3.0 * Creative Commons BBB | Flickr - Photo Sharing! https://www.flickr.com/photos/steren/2732488224 Copyright: 2008 Steren Giannini / License: CC BY 2.0 * Full body | Flickr - Photo Sharing! https://www.flickr.com/photos/timothytsuihin/2852272823 Copyright: 2008 Timothy Tsui / License: CC BY-SA 2.0 * Boston à l'heure bleue | Flickr - Photo Sharing! https://www.flickr.com/photos/ensh/4769294947 Copyright: 2010 Emmanuel Huybrechts / License: CC BY 2.0 * e-mail symbol | Flickr - Photo Sharing! https://www.flickr.com/photos/gsi-r/5341765493 Copyright: 2007 Micky Aldridge / License: CC BY 2.0 * File:Göteborg in moon light.jpg - Wikipedia, the free encyclopedia http://en.wikipedia.org/wiki/File:G%C3%B6teborg_in_moon_light.jpg Copyright: 2004 Amjad Sheikh / License: CC BY-SA 3.0 * Creative Commons BBB | Flickr - Photo Sharing! https://www.flickr.com/photos/steren/2732488224 Copyright: 2008 Steren Giannini / License: CC BY 2.0 * Full body | Flickr - Photo Sharing! https://www.flickr.com/photos/timothytsuihin/2852272823 Copyright: 2008 Timothy Tsui / License: CC BY-SA 2.0 * Boston à l'heure bleue | Flickr - Photo Sharing! https://www.flickr.com/photos/ensh/4769294947 Copyright: 2010 Emmanuel Huybrechts / License: CC BY 2.0 * e-mail symbol | Flickr - Photo Sharing! https://www.flickr.com/photos/gsi-r/5341765493 Copyright: 2007 Micky Aldridge / License: CC BY 2.0 * File:Göteborg in moon light.jpg - Wikipedia, the free encyclopedia http://en.wikipedia.org/wiki/File:G%C3%B6teborg_in_moon_light.jpg Copyright: 2004 Amjad Sheikh / License: CC BY-SA 3.0 * Creative Commons BBB | Flickr - Photo Sharing! https://www.flickr.com/photos/steren/2732488224 Copyright: 2008 Steren Giannini / License: CC BY 2.0 * Full body | Flickr - Photo Sharing! https://www.flickr.com/photos/timothytsuihin/2852272823 Copyright: 2008 Timothy Tsui / License: CC BY-SA 2.0 * Boston à l'heure bleue | Flickr - Photo Sharing! https://www.flickr.com/photos/ensh/4769294947 Copyright: 2010 Emmanuel Huybrechts / License: CC BY 2.0 * e-mail symbol | Flickr - Photo Sharing! https://www.flickr.com/photos/gsi-r/5341765493 Copyright: 2007 Micky Aldridge / License: CC BY 2.0 * File:Göteborg in moon light.jpg - Wikipedia, the free encyclopedia http://en.wikipedia.org/wiki/File:G%C3%B6teborg_in_moon_light.jpg Copyright: 2004 Amjad Sheikh / License: CC BY-SA 3.0 * Creative Commons BBB | Flickr - Photo Sharing! https://www.flickr.com/photos/steren/2732488224 Copyright: 2008 Steren Giannini / License: CC BY 2.0 * Full body | Flickr - Photo Sharing! https://www.flickr.com/photos/timothytsuihin/2852272823 Copyright: 2008 Timothy Tsui / License: CC BY-SA 2.0