SlideShare ist ein Scribd-Unternehmen logo
1 von 52
Downloaden Sie, um offline zu lesen
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

Weitere ähnliche Inhalte

Was ist angesagt?

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
 

Was ist angesagt? (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
 

Ähnlich wie 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
 

Ähnlich wie 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
 

Kürzlich hochgeladen

Data governance with Unity Catalog Presentation
Data governance with Unity Catalog PresentationData governance with Unity Catalog Presentation
Data governance with Unity Catalog PresentationKnoldus Inc.
 
Genislab builds better products and faster go-to-market with Lean project man...
Genislab builds better products and faster go-to-market with Lean project man...Genislab builds better products and faster go-to-market with Lean project man...
Genislab builds better products and faster go-to-market with Lean project man...Farhan Tariq
 
A Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptxA Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptxLoriGlavin3
 
(How to Program) Paul Deitel, Harvey Deitel-Java How to Program, Early Object...
(How to Program) Paul Deitel, Harvey Deitel-Java How to Program, Early Object...(How to Program) Paul Deitel, Harvey Deitel-Java How to Program, Early Object...
(How to Program) Paul Deitel, Harvey Deitel-Java How to Program, Early Object...AliaaTarek5
 
UiPath Community: Communication Mining from Zero to Hero
UiPath Community: Communication Mining from Zero to HeroUiPath Community: Communication Mining from Zero to Hero
UiPath Community: Communication Mining from Zero to HeroUiPathCommunity
 
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxMerck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxLoriGlavin3
 
[Webinar] SpiraTest - Setting New Standards in Quality Assurance
[Webinar] SpiraTest - Setting New Standards in Quality Assurance[Webinar] SpiraTest - Setting New Standards in Quality Assurance
[Webinar] SpiraTest - Setting New Standards in Quality AssuranceInflectra
 
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptxThe Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptxLoriGlavin3
 
Long journey of Ruby standard library at RubyConf AU 2024
Long journey of Ruby standard library at RubyConf AU 2024Long journey of Ruby standard library at RubyConf AU 2024
Long journey of Ruby standard library at RubyConf AU 2024Hiroshi SHIBATA
 
Scale your database traffic with Read & Write split using MySQL Router
Scale your database traffic with Read & Write split using MySQL RouterScale your database traffic with Read & Write split using MySQL Router
Scale your database traffic with Read & Write split using MySQL RouterMydbops
 
Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...
Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...
Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...panagenda
 
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyesHow to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyesThousandEyes
 
Modern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
Modern Roaming for Notes and Nomad – Cheaper Faster Better StrongerModern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
Modern Roaming for Notes and Nomad – Cheaper Faster Better Strongerpanagenda
 
Generative Artificial Intelligence: How generative AI works.pdf
Generative Artificial Intelligence: How generative AI works.pdfGenerative Artificial Intelligence: How generative AI works.pdf
Generative Artificial Intelligence: How generative AI works.pdfIngrid Airi González
 
Generative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information DevelopersGenerative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information DevelopersRaghuram Pandurangan
 
Testing tools and AI - ideas what to try with some tool examples
Testing tools and AI - ideas what to try with some tool examplesTesting tools and AI - ideas what to try with some tool examples
Testing tools and AI - ideas what to try with some tool examplesKari Kakkonen
 
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc
 
Time Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directionsTime Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directionsNathaniel Shimoni
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsSergiu Bodiu
 
How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.Curtis Poe
 

Kürzlich hochgeladen (20)

Data governance with Unity Catalog Presentation
Data governance with Unity Catalog PresentationData governance with Unity Catalog Presentation
Data governance with Unity Catalog Presentation
 
Genislab builds better products and faster go-to-market with Lean project man...
Genislab builds better products and faster go-to-market with Lean project man...Genislab builds better products and faster go-to-market with Lean project man...
Genislab builds better products and faster go-to-market with Lean project man...
 
A Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptxA Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptx
 
(How to Program) Paul Deitel, Harvey Deitel-Java How to Program, Early Object...
(How to Program) Paul Deitel, Harvey Deitel-Java How to Program, Early Object...(How to Program) Paul Deitel, Harvey Deitel-Java How to Program, Early Object...
(How to Program) Paul Deitel, Harvey Deitel-Java How to Program, Early Object...
 
UiPath Community: Communication Mining from Zero to Hero
UiPath Community: Communication Mining from Zero to HeroUiPath Community: Communication Mining from Zero to Hero
UiPath Community: Communication Mining from Zero to Hero
 
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxMerck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
 
[Webinar] SpiraTest - Setting New Standards in Quality Assurance
[Webinar] SpiraTest - Setting New Standards in Quality Assurance[Webinar] SpiraTest - Setting New Standards in Quality Assurance
[Webinar] SpiraTest - Setting New Standards in Quality Assurance
 
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptxThe Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
 
Long journey of Ruby standard library at RubyConf AU 2024
Long journey of Ruby standard library at RubyConf AU 2024Long journey of Ruby standard library at RubyConf AU 2024
Long journey of Ruby standard library at RubyConf AU 2024
 
Scale your database traffic with Read & Write split using MySQL Router
Scale your database traffic with Read & Write split using MySQL RouterScale your database traffic with Read & Write split using MySQL Router
Scale your database traffic with Read & Write split using MySQL Router
 
Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...
Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...
Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...
 
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyesHow to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
 
Modern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
Modern Roaming for Notes and Nomad – Cheaper Faster Better StrongerModern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
Modern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
 
Generative Artificial Intelligence: How generative AI works.pdf
Generative Artificial Intelligence: How generative AI works.pdfGenerative Artificial Intelligence: How generative AI works.pdf
Generative Artificial Intelligence: How generative AI works.pdf
 
Generative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information DevelopersGenerative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information Developers
 
Testing tools and AI - ideas what to try with some tool examples
Testing tools and AI - ideas what to try with some tool examplesTesting tools and AI - ideas what to try with some tool examples
Testing tools and AI - ideas what to try with some tool examples
 
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
 
Time Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directionsTime Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directions
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platforms
 
How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.
 

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