SlideShare une entreprise Scribd logo
1  sur  26
Télécharger pour lire hors ligne
mbed ではじめる組み込み Haskell
プログラミング
mbed ではじめる組み込み Haskell
プログラミング
mbed ではじめる組み込み Haskell
プログラミング
mbed ではじめる組み込み Haskell
プログラミング
mbed ではじめる組み込み Haskell
プログラミング
Kiwamu OkabeKiwamu OkabeKiwamu OkabeKiwamu OkabeKiwamu Okabe
わたしはだれ?わたしはだれ?わたしはだれ?わたしはだれ?わたしはだれ?
☆ Twitter: @master_q☆ Twitter: @master_q☆ Twitter: @master_q☆ Twitter: @master_q☆ Twitter: @master_q
☆ Metasepiプロジェクト主催☆ Metasepiプロジェクト主催☆ Metasepiプロジェクト主催☆ Metasepiプロジェクト主催☆ Metasepiプロジェクト主催
☆ Ajhc Haskellコンパイラ開発者☆ Ajhc Haskellコンパイラ開発者☆ Ajhc Haskellコンパイラ開発者☆ Ajhc Haskellコンパイラ開発者☆ Ajhc Haskellコンパイラ開発者
☆ Debian Maintainer☆ Debian Maintainer☆ Debian Maintainer☆ Debian Maintainer☆ Debian Maintainer
☆ 参照透明な海を守る会会員☆ 参照透明な海を守る会会員☆ 参照透明な海を守る会会員☆ 参照透明な海を守る会会員☆ 参照透明な海を守る会会員
☆ 前はデジタルサイネージの開発してました☆ 前はデジタルサイネージの開発してました☆ 前はデジタルサイネージの開発してました☆ 前はデジタルサイネージの開発してました☆ 前はデジタルサイネージの開発してました
☆ その昔はコピー機のOSをNetBSDで☆ その昔はコピー機のOSをNetBSDで☆ その昔はコピー機のOSをNetBSDで☆ その昔はコピー機のOSをNetBSDで☆ その昔はコピー機のOSをNetBSDで
今日はHaskellよりmbedに焦点今日はHaskellよりmbedに焦点今日はHaskellよりmbedに焦点今日はHaskellよりmbedに焦点今日はHaskellよりmbedに焦点
☆ 一昨日OSC Hokkaidoが開催されました☆ 一昨日OSC Hokkaidoが開催されました☆ 一昨日OSC Hokkaidoが開催されました☆ 一昨日OSC Hokkaidoが開催されました☆ 一昨日OSC Hokkaidoが開催されました
☆ Haskellの話はその時の資料をどうぞ!☆ Haskellの話はその時の資料をどうぞ!☆ Haskellの話はその時の資料をどうぞ!☆ Haskellの話はその時の資料をどうぞ!☆ Haskellの話はその時の資料をどうぞ!
http://bit.ly/mbedhaskhttp://bit.ly/mbedhaskhttp://bit.ly/mbedhaskhttp://bit.ly/mbedhaskhttp://bit.ly/mbedhask
☆ 今日はmbed側の話をさせてください☆ 今日はmbed側の話をさせてください☆ 今日はmbed側の話をさせてください☆ 今日はmbed側の話をさせてください☆ 今日はmbed側の話をさせてください
おしながきおしながきおしながきおしながきおしながき
☆ [1] Haskell言語とは☆ [1] Haskell言語とは☆ [1] Haskell言語とは☆ [1] Haskell言語とは☆ [1] Haskell言語とは
☆ [2] mbedにおけるHaskell開発環境☆ [2] mbedにおけるHaskell開発環境☆ [2] mbedにおけるHaskell開発環境☆ [2] mbedにおけるHaskell開発環境☆ [2] mbedにおけるHaskell開発環境
☆ [3] mbed+Haskellデモ☆ [3] mbed+Haskellデモ☆ [3] mbed+Haskellデモ☆ [3] mbed+Haskellデモ☆ [3] mbed+Haskellデモ
☆ [4] デモの実装概要☆ [4] デモの実装概要☆ [4] デモの実装概要☆ [4] デモの実装概要☆ [4] デモの実装概要
☆ [5] デモの実装詳細☆ [5] デモの実装詳細☆ [5] デモの実装詳細☆ [5] デモの実装詳細☆ [5] デモの実装詳細
☆ [6] これからの課題など☆ [6] これからの課題など☆ [6] これからの課題など☆ [6] これからの課題など☆ [6] これからの課題など
[1] Haskell言語とは[1] Haskell言語とは[1] Haskell言語とは[1] Haskell言語とは[1] Haskell言語とは
☆ 強い型を使えるプログラミング言語☆ 強い型を使えるプログラミング言語☆ 強い型を使えるプログラミング言語☆ 強い型を使えるプログラミング言語☆ 強い型を使えるプログラミング言語
☆ コンパイルエラー↑ / 実行時エラー↓☆ コンパイルエラー↑ / 実行時エラー↓☆ コンパイルエラー↑ / 実行時エラー↓☆ コンパイルエラー↑ / 実行時エラー↓☆ コンパイルエラー↑ / 実行時エラー↓
参考:「数理科学的バグ撲滅方法論のすすめ」
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/
なんでまたHaskell組み込み?なんでまたHaskell組み込み?なんでまたHaskell組み込み?なんでまたHaskell組み込み?なんでまたHaskell組み込み?
☆ アプリでエラー → SEGV → 再起動できる☆ アプリでエラー → SEGV → 再起動できる☆ アプリでエラー → SEGV → 再起動できる☆ アプリでエラー → SEGV → 再起動できる☆ アプリでエラー → SEGV → 再起動できる
☆ 低レイヤーでエラー → システム停止☆ 低レイヤーでエラー → システム停止☆ 低レイヤーでエラー → システム停止☆ 低レイヤーでエラー → システム停止☆ 低レイヤーでエラー → システム停止
☆ 低レイヤーを強い型で安全に設計したい!☆ 低レイヤーを強い型で安全に設計したい!☆ 低レイヤーを強い型で安全に設計したい!☆ 低レイヤーを強い型で安全に設計したい!☆ 低レイヤーを強い型で安全に設計したい!
☆ Ajhc Haskellコンパイラを開発中☆ Ajhc Haskellコンパイラを開発中☆ Ajhc Haskellコンパイラを開発中☆ Ajhc Haskellコンパイラを開発中☆ Ajhc Haskellコンパイラを開発中
☆ http://ajhc.metasepi.org/☆ http://ajhc.metasepi.org/☆ http://ajhc.metasepi.org/☆ http://ajhc.metasepi.org/☆ http://ajhc.metasepi.org/
このプレゼンで前提とする環境このプレゼンで前提とする環境このプレゼンで前提とする環境このプレゼンで前提とする環境このプレゼンで前提とする環境
☆ Debian GNU/Linux sid amd64☆ Debian GNU/Linux sid amd64☆ Debian GNU/Linux sid amd64☆ Debian GNU/Linux sid amd64☆ Debian GNU/Linux sid amd64
☆ 他のディストリでも大丈夫だと思います☆ 他のディストリでも大丈夫だと思います☆ 他のディストリでも大丈夫だと思います☆ 他のディストリでも大丈夫だと思います☆ 他のディストリでも大丈夫だと思います
☆ WindowsとMacもひょっとしたら同じ?☆ WindowsとMacもひょっとしたら同じ?☆ WindowsとMacもひょっとしたら同じ?☆ WindowsとMacもひょっとしたら同じ?☆ WindowsとMacもひょっとしたら同じ?
[2] mbedにおけるHaskell開発環境[2] mbedにおけるHaskell開発環境[2] mbedにおけるHaskell開発環境[2] mbedにおけるHaskell開発環境[2] mbedにおけるHaskell開発環境
詳細: http://bit.ly/mbedhask詳細: http://bit.ly/mbedhask詳細: http://bit.ly/mbedhask詳細: http://bit.ly/mbedhask詳細: http://bit.ly/mbedhask
ファームウェア書き込みファームウェア書き込みファームウェア書き込みファームウェア書き込みファームウェア書き込み
http://mbed.org/blog/entry/Debugging-from-GDB-using-pyOCD/
https://github.com/mbedmicro/mbed/tree/master/workspace_tools/
debugger
http://mbed.org/blog/entry/Debugging-from-GDB-using-pyOCD/
https://github.com/mbedmicro/mbed/tree/master/workspace_tools/
debugger
http://mbed.org/blog/entry/Debugging-from-GDB-using-pyOCD/
https://github.com/mbedmicro/mbed/tree/master/workspace_tools/
debugger
http://mbed.org/blog/entry/Debugging-from-GDB-using-pyOCD/
https://github.com/mbedmicro/mbed/tree/master/workspace_tools/
debugger
http://mbed.org/blog/entry/Debugging-from-GDB-using-pyOCD/
https://github.com/mbedmicro/mbed/tree/master/workspace_tools/
debugger
ぼくは"make gdbwrite"一発でビルド+ファー
ム書込ができるように設定しています
ぼくは"make gdbwrite"一発でビルド+ファー
ム書込ができるように設定しています
ぼくは"make gdbwrite"一発でビルド+ファー
ム書込ができるように設定しています
ぼくは"make gdbwrite"一発でビルド+ファー
ム書込ができるように設定しています
ぼくは"make gdbwrite"一発でビルド+ファー
ム書込ができるように設定しています
クラウドコンパイラは使えないの?クラウドコンパイラは使えないの?クラウドコンパイラは使えないの?クラウドコンパイラは使えないの?クラウドコンパイラは使えないの?
いくつか課題があって実現していませんいくつか課題があって実現していませんいくつか課題があって実現していませんいくつか課題があって実現していませんいくつか課題があって実現していません
☆ AjhcコンパイラがGCCに依存している☆ AjhcコンパイラがGCCに依存している☆ AjhcコンパイラがGCCに依存している☆ AjhcコンパイラがGCCに依存している☆ AjhcコンパイラがGCCに依存している
☆ クラウドコンパイラがコマンドを呼べない☆ クラウドコンパイラがコマンドを呼べない☆ クラウドコンパイラがコマンドを呼べない☆ クラウドコンパイラがコマンドを呼べない☆ クラウドコンパイラがコマンドを呼べない
妄想: クラウドコンパイラ+Ajhc妄想: クラウドコンパイラ+Ajhc妄想: クラウドコンパイラ+Ajhc妄想: クラウドコンパイラ+Ajhc妄想: クラウドコンパイラ+Ajhc
mbed.org側修正が必要になってしまいます...mbed.org側修正が必要になってしまいます...mbed.org側修正が必要になってしまいます...mbed.org側修正が必要になってしまいます...mbed.org側修正が必要になってしまいます...
[3] mbed+Haskellデモ[3] mbed+Haskellデモ[3] mbed+Haskellデモ[3] mbed+Haskellデモ[3] mbed+Haskellデモ
☆ mbedでRSSリーダーを作ってみました☆ mbedでRSSリーダーを作ってみました☆ mbedでRSSリーダーを作ってみました☆ mbedでRSSリーダーを作ってみました☆ mbedでRSSリーダーを作ってみました
☆ redditのRSSをLCDにヘッドライン表示☆ redditのRSSをLCDにヘッドライン表示☆ redditのRSSをLCDにヘッドライン表示☆ redditのRSSをLCDにヘッドライン表示☆ redditのRSSをLCDにヘッドライン表示
☆ 動画は以下のURLから観れます☆ 動画は以下のURLから観れます☆ 動画は以下のURLから観れます☆ 動画は以下のURLから観れます☆ 動画は以下のURLから観れます
http://bit.ly/mbedmovhttp://bit.ly/mbedmovhttp://bit.ly/mbedmovhttp://bit.ly/mbedmovhttp://bit.ly/mbedmov
[4] デモの実装概要[4] デモの実装概要[4] デモの実装概要[4] デモの実装概要[4] デモの実装概要
[5] デモの実装詳細[5] デモの実装詳細[5] デモの実装詳細[5] デモの実装詳細[5] デモの実装詳細
ソースコードはこちらソースコードはこちらソースコードはこちらソースコードはこちらソースコードはこちら
https://github.com/ajhc/demo-cortex-m3/tree/master/mbed-nxp-
lpc1768/samples/Haskell_Http
https://github.com/ajhc/demo-cortex-m3/tree/master/mbed-nxp-
lpc1768/samples/Haskell_Http
https://github.com/ajhc/demo-cortex-m3/tree/master/mbed-nxp-
lpc1768/samples/Haskell_Http
https://github.com/ajhc/demo-cortex-m3/tree/master/mbed-nxp-
lpc1768/samples/Haskell_Http
https://github.com/ajhc/demo-cortex-m3/tree/master/mbed-nxp-
lpc1768/samples/Haskell_Http
Haskell→C言語 呼び出しHaskell→C言語 呼び出しHaskell→C言語 呼び出しHaskell→C言語 呼び出しHaskell→C言語 呼び出し
foreign import ccall "c_extern.h wait_us" delayUs :: Int -> IO ()foreign import ccall "c_extern.h wait_us" delayUs :: Int -> IO ()foreign import ccall "c_extern.h wait_us" delayUs :: Int -> IO ()foreign import ccall "c_extern.h wait_us" delayUs :: Int -> IO ()foreign import ccall "c_extern.h wait_us" delayUs :: Int -> IO ()
C言語の構造体を型として扱うC言語の構造体を型として扱うC言語の構造体を型として扱うC言語の構造体を型として扱うC言語の構造体を型として扱う
newtype {-# CTYPE "gpio_t" #-} GpioT = GpioT ()
foreign import primitive "const.sizeof(gpio_t)" gpio_t_size ::
Int
foreign import ccall "c_extern.h gpio_init" c_gpio_init :: Ptr
GpioT -> Int -> Int -> IO ()
gpioInit :: Int -> Int -> IO (Ptr GpioT)
gpioInit name direction = do tag <- mallocBytes gpio_t_size
c_gpio_init tag name direction
return tag
newtype {-# CTYPE "gpio_t" #-} GpioT = GpioT ()
foreign import primitive "const.sizeof(gpio_t)" gpio_t_size ::
Int
foreign import ccall "c_extern.h gpio_init" c_gpio_init :: Ptr
GpioT -> Int -> Int -> IO ()
gpioInit :: Int -> Int -> IO (Ptr GpioT)
gpioInit name direction = do tag <- mallocBytes gpio_t_size
c_gpio_init tag name direction
return tag
newtype {-# CTYPE "gpio_t" #-} GpioT = GpioT ()
foreign import primitive "const.sizeof(gpio_t)" gpio_t_size ::
Int
foreign import ccall "c_extern.h gpio_init" c_gpio_init :: Ptr
GpioT -> Int -> Int -> IO ()
gpioInit :: Int -> Int -> IO (Ptr GpioT)
gpioInit name direction = do tag <- mallocBytes gpio_t_size
c_gpio_init tag name direction
return tag
newtype {-# CTYPE "gpio_t" #-} GpioT = GpioT ()
foreign import primitive "const.sizeof(gpio_t)" gpio_t_size ::
Int
foreign import ccall "c_extern.h gpio_init" c_gpio_init :: Ptr
GpioT -> Int -> Int -> IO ()
gpioInit :: Int -> Int -> IO (Ptr GpioT)
gpioInit name direction = do tag <- mallocBytes gpio_t_size
c_gpio_init tag name direction
return tag
newtype {-# CTYPE "gpio_t" #-} GpioT = GpioT ()
foreign import primitive "const.sizeof(gpio_t)" gpio_t_size ::
Int
foreign import ccall "c_extern.h gpio_init" c_gpio_init :: Ptr
GpioT -> Int -> Int -> IO ()
gpioInit :: Int -> Int -> IO (Ptr GpioT)
gpioInit name direction = do tag <- mallocBytes gpio_t_size
c_gpio_init tag name direction
return tag
C言語ヘッダのアドレス設定を参照C言語ヘッダのアドレス設定を参照C言語ヘッダのアドレス設定を参照C言語ヘッダのアドレス設定を参照C言語ヘッダのアドレス設定を参照
foreign import primitive "const.LPC_GPIO0_BASE"
addr_LPC_GPIO0_BASE :: Int
pinName :: Int -> Int -> Int
pinName major minor = addr_LPC_GPIO0_BASE + major * 32 + minor
led1 :: Int
led1 = pinName 1 18 -- P1.18
foreign import primitive "const.LPC_GPIO0_BASE"
addr_LPC_GPIO0_BASE :: Int
pinName :: Int -> Int -> Int
pinName major minor = addr_LPC_GPIO0_BASE + major * 32 + minor
led1 :: Int
led1 = pinName 1 18 -- P1.18
foreign import primitive "const.LPC_GPIO0_BASE"
addr_LPC_GPIO0_BASE :: Int
pinName :: Int -> Int -> Int
pinName major minor = addr_LPC_GPIO0_BASE + major * 32 + minor
led1 :: Int
led1 = pinName 1 18 -- P1.18
foreign import primitive "const.LPC_GPIO0_BASE"
addr_LPC_GPIO0_BASE :: Int
pinName :: Int -> Int -> Int
pinName major minor = addr_LPC_GPIO0_BASE + major * 32 + minor
led1 :: Int
led1 = pinName 1 18 -- P1.18
foreign import primitive "const.LPC_GPIO0_BASE"
addr_LPC_GPIO0_BASE :: Int
pinName :: Int -> Int -> Int
pinName major minor = addr_LPC_GPIO0_BASE + major * 32 + minor
led1 :: Int
led1 = pinName 1 18 -- P1.18
LEDのON/OFFLEDのON/OFFLEDのON/OFFLEDのON/OFFLEDのON/OFF
pinOutput :: Int
pinOutput = 1
initLed :: Int -> IO (Ptr GpioT)
initLed name = gpioInit name pinOutput
ledOn, ledOff :: Ptr GpioT -> IO ()
ledOn l = gpioWrite l 1
ledOff l = gpioWrite l 0
pinOutput :: Int
pinOutput = 1
initLed :: Int -> IO (Ptr GpioT)
initLed name = gpioInit name pinOutput
ledOn, ledOff :: Ptr GpioT -> IO ()
ledOn l = gpioWrite l 1
ledOff l = gpioWrite l 0
pinOutput :: Int
pinOutput = 1
initLed :: Int -> IO (Ptr GpioT)
initLed name = gpioInit name pinOutput
ledOn, ledOff :: Ptr GpioT -> IO ()
ledOn l = gpioWrite l 1
ledOff l = gpioWrite l 0
pinOutput :: Int
pinOutput = 1
initLed :: Int -> IO (Ptr GpioT)
initLed name = gpioInit name pinOutput
ledOn, ledOff :: Ptr GpioT -> IO ()
ledOn l = gpioWrite l 1
ledOff l = gpioWrite l 0
pinOutput :: Int
pinOutput = 1
initLed :: Int -> IO (Ptr GpioT)
initLed name = gpioInit name pinOutput
ledOn, ledOff :: Ptr GpioT -> IO ()
ledOn l = gpioWrite l 1
ledOff l = gpioWrite l 0
lwIPをHaskellでラップlwIPをHaskellでラップlwIPをHaskellでラップlwIPをHaskellでラップlwIPをHaskellでラップ
ストリーム処理ストリーム処理ストリーム処理ストリーム処理ストリーム処理
receiveAll :: Ptr TCPSocketConnectionT -> IO [String]
receiveAll tcp = unsafeInterleaveIO receiveAll' where
receiveAll' = do
s <- tcpSocketConnection_receive tcp
if s == "" then return [] else do
s' <- unsafeInterleaveIO receiveAll'
return $ s:s'
receiveAll :: Ptr TCPSocketConnectionT -> IO [String]
receiveAll tcp = unsafeInterleaveIO receiveAll' where
receiveAll' = do
s <- tcpSocketConnection_receive tcp
if s == "" then return [] else do
s' <- unsafeInterleaveIO receiveAll'
return $ s:s'
receiveAll :: Ptr TCPSocketConnectionT -> IO [String]
receiveAll tcp = unsafeInterleaveIO receiveAll' where
receiveAll' = do
s <- tcpSocketConnection_receive tcp
if s == "" then return [] else do
s' <- unsafeInterleaveIO receiveAll'
return $ s:s'
receiveAll :: Ptr TCPSocketConnectionT -> IO [String]
receiveAll tcp = unsafeInterleaveIO receiveAll' where
receiveAll' = do
s <- tcpSocketConnection_receive tcp
if s == "" then return [] else do
s' <- unsafeInterleaveIO receiveAll'
return $ s:s'
receiveAll :: Ptr TCPSocketConnectionT -> IO [String]
receiveAll tcp = unsafeInterleaveIO receiveAll' where
receiveAll' = do
s <- tcpSocketConnection_receive tcp
if s == "" then return [] else do
s' <- unsafeInterleaveIO receiveAll'
return $ s:s'
えっと何がうれしいの?えっと何がうれしいの?えっと何がうれしいの?えっと何がうれしいの?えっと何がうれしいの?
main = do
ethernetInitDhcp
ethernetConnect 12000
ethernetGetIpAddress
tcp <- tcpSocketConnection_connect host 80
tcpSocketConnection_send_all tcp $ "GET /hoge.txt HTTP/1.0nn"
r <- receiveAll tcp
main = do
ethernetInitDhcp
ethernetConnect 12000
ethernetGetIpAddress
tcp <- tcpSocketConnection_connect host 80
tcpSocketConnection_send_all tcp $ "GET /hoge.txt HTTP/1.0nn"
r <- receiveAll tcp
main = do
ethernetInitDhcp
ethernetConnect 12000
ethernetGetIpAddress
tcp <- tcpSocketConnection_connect host 80
tcpSocketConnection_send_all tcp $ "GET /hoge.txt HTTP/1.0nn"
r <- receiveAll tcp
main = do
ethernetInitDhcp
ethernetConnect 12000
ethernetGetIpAddress
tcp <- tcpSocketConnection_connect host 80
tcpSocketConnection_send_all tcp $ "GET /hoge.txt HTTP/1.0nn"
r <- receiveAll tcp
main = do
ethernetInitDhcp
ethernetConnect 12000
ethernetGetIpAddress
tcp <- tcpSocketConnection_connect host 80
tcpSocketConnection_send_all tcp $ "GET /hoge.txt HTTP/1.0nn"
r <- receiveAll tcp
☆ この時"r"には単なるリストが返ってくる☆ この時"r"には単なるリストが返ってくる☆ この時"r"には単なるリストが返ってくる☆ この時"r"には単なるリストが返ってくる☆ この時"r"には単なるリストが返ってくる
☆ このリストを単に読むと☆ このリストを単に読むと☆ このリストを単に読むと☆ このリストを単に読むと☆ このリストを単に読むと
☆ lwIPが自動的にパケットを読んでくれる!☆ lwIPが自動的にパケットを読んでくれる!☆ lwIPが自動的にパケットを読んでくれる!☆ lwIPが自動的にパケットを読んでくれる!☆ lwIPが自動的にパケットを読んでくれる!
☆ このリストをRSSパーサに直接突っ込める☆ このリストをRSSパーサに直接突っ込める☆ このリストをRSSパーサに直接突っ込める☆ このリストをRSSパーサに直接突っ込める☆ このリストをRSSパーサに直接突っ込める
パケット読みとパーサを直結合パケット読みとパーサを直結合パケット読みとパーサを直結合パケット読みとパーサを直結合パケット読みとパーサを直結合
[6] これからの課題など[6] これからの課題など[6] これからの課題など[6] これからの課題など[6] これからの課題など
☆ mbedのAPIはC++☆ mbedのAPIはC++☆ mbedのAPIはC++☆ mbedのAPIはC++☆ mbedのAPIはC++
☆ Haskellから直接C++を呼べない☆ Haskellから直接C++を呼べない☆ Haskellから直接C++を呼べない☆ Haskellから直接C++を呼べない☆ Haskellから直接C++を呼べない
☆ 今はmbed APIをCで書き直したり (涙☆ 今はmbed APIをCで書き直したり (涙☆ 今はmbed APIをCで書き直したり (涙☆ 今はmbed APIをCで書き直したり (涙☆ 今はmbed APIをCで書き直したり (涙
☆ 簡単にmbed APIをHaskellラップしたい☆ 簡単にmbed APIをHaskellラップしたい☆ 簡単にmbed APIをHaskellラップしたい☆ 簡単にmbed APIをHaskellラップしたい☆ 簡単にmbed APIをHaskellラップしたい
☆ クラウドコンパイラ使いたいなぁ...☆ クラウドコンパイラ使いたいなぁ...☆ クラウドコンパイラ使いたいなぁ...☆ クラウドコンパイラ使いたいなぁ...☆ クラウドコンパイラ使いたいなぁ...
Metasepiメンバー紹介 #1Metasepiメンバー紹介 #1Metasepiメンバー紹介 #1Metasepiメンバー紹介 #1Metasepiメンバー紹介 #1
☆ @dec9ue さん☆ @dec9ue さん☆ @dec9ue さん☆ @dec9ue さん☆ @dec9ue さん
☆ jhcのGCを解析してくれました☆ jhcのGCを解析してくれました☆ jhcのGCを解析してくれました☆ jhcのGCを解析してくれました☆ jhcのGCを解析してくれました
☆ 組込対応はGCの改造が不可欠でした☆ 組込対応はGCの改造が不可欠でした☆ 組込対応はGCの改造が不可欠でした☆ 組込対応はGCの改造が不可欠でした☆ 組込対応はGCの改造が不可欠でした
☆ その他GC関連について相談にのってくれる☆ その他GC関連について相談にのってくれる☆ その他GC関連について相談にのってくれる☆ その他GC関連について相談にのってくれる☆ その他GC関連について相談にのってくれる
☆ 最近はHDL屋さんになって忙しそう...☆ 最近はHDL屋さんになって忙しそう...☆ 最近はHDL屋さんになって忙しそう...☆ 最近はHDL屋さんになって忙しそう...☆ 最近はHDL屋さんになって忙しそう...
Metasepiメンバー紹介 #2Metasepiメンバー紹介 #2Metasepiメンバー紹介 #2Metasepiメンバー紹介 #2Metasepiメンバー紹介 #2
☆ @mzp さん☆ @mzp さん☆ @mzp さん☆ @mzp さん☆ @mzp さん
☆ なごやこわい☆ なごやこわい☆ なごやこわい☆ なごやこわい☆ なごやこわい
☆ 関数型言語や証明言語にとても強い☆ 関数型言語や証明言語にとても強い☆ 関数型言語や証明言語にとても強い☆ 関数型言語や証明言語にとても強い☆ 関数型言語や証明言語にとても強い
☆ Xen上で動くMini-OSをHaskell化中☆ Xen上で動くMini-OSをHaskell化中☆ Xen上で動くMini-OSをHaskell化中☆ Xen上で動くMini-OSをHaskell化中☆ Xen上で動くMini-OSをHaskell化中
☆ github.com/mzp/mini-os-with-ajhc☆ github.com/mzp/mini-os-with-ajhc☆ github.com/mzp/mini-os-with-ajhc☆ github.com/mzp/mini-os-with-ajhc☆ github.com/mzp/mini-os-with-ajhc
☆ Ajhcの不具合にさくっとpatchをくれたり☆ Ajhcの不具合にさくっとpatchをくれたり☆ Ajhcの不具合にさくっとpatchをくれたり☆ Ajhcの不具合にさくっとpatchをくれたり☆ Ajhcの不具合にさくっとpatchをくれたり
同人誌にコンパイラの記事書きました同人誌にコンパイラの記事書きました同人誌にコンパイラの記事書きました同人誌にコンパイラの記事書きました同人誌にコンパイラの記事書きました
http://www.paraiso-lang.org/ikmsm/http://www.paraiso-lang.org/ikmsm/http://www.paraiso-lang.org/ikmsm/http://www.paraiso-lang.org/ikmsm/http://www.paraiso-lang.org/ikmsm/
☆ Lensライブラリの解説☆ Lensライブラリの解説☆ Lensライブラリの解説☆ Lensライブラリの解説☆ Lensライブラリの解説
☆ パーサの解説☆ パーサの解説☆ パーサの解説☆ パーサの解説☆ パーサの解説
☆ 圏論とモナド☆ 圏論とモナド☆ 圏論とモナド☆ 圏論とモナド☆ 圏論とモナド
☆ 囲碁AI☆ 囲碁AI☆ 囲碁AI☆ 囲碁AI☆ 囲碁AI
☆ Ajhcコンパイラの開発秘話 <= コレ書いた☆ Ajhcコンパイラの開発秘話 <= コレ書いた☆ Ajhcコンパイラの開発秘話 <= コレ書いた☆ Ajhcコンパイラの開発秘話 <= コレ書いた☆ Ajhcコンパイラの開発秘話 <= コレ書いた
立ち読み/購入したい方は声かけてください!立ち読み/購入したい方は声かけてください!立ち読み/購入したい方は声かけてください!立ち読み/購入したい方は声かけてください!立ち読み/購入したい方は声かけてください!

Contenu connexe

Tendances

【20211202_toranoana.deno#3】denoでFFI
【20211202_toranoana.deno#3】denoでFFI【20211202_toranoana.deno#3】denoでFFI
【20211202_toranoana.deno#3】denoでFFI虎の穴 開発室
 
GoCon 2015 Summer GoのASTをいじくって新しいツールを作る
GoCon 2015 Summer GoのASTをいじくって新しいツールを作るGoCon 2015 Summer GoのASTをいじくって新しいツールを作る
GoCon 2015 Summer GoのASTをいじくって新しいツールを作るMasahiro Wakame
 
ドリコムを支える課金ライブラリを支えるJenkins
ドリコムを支える課金ライブラリを支えるJenkinsドリコムを支える課金ライブラリを支えるJenkins
ドリコムを支える課金ライブラリを支えるJenkinsGo Sueyoshi (a.k.a sue445)
 
社内ツールが支えるドリコムの社内勉強会文化 #metabenkyokai
社内ツールが支えるドリコムの社内勉強会文化 #metabenkyokai社内ツールが支えるドリコムの社内勉強会文化 #metabenkyokai
社内ツールが支えるドリコムの社内勉強会文化 #metabenkyokaiGo Sueyoshi (a.k.a sue445)
 
Python におけるドメイン駆動設計(戦術面)の勘どころ
Python におけるドメイン駆動設計(戦術面)の勘どころPython におけるドメイン駆動設計(戦術面)の勘どころ
Python におけるドメイン駆動設計(戦術面)の勘どころJunya Hayashi
 
PHP 8 と V8 (JavaScript) で速さを見比べてみよう!
PHP 8 と V8 (JavaScript) で速さを見比べてみよう!PHP 8 と V8 (JavaScript) で速さを見比べてみよう!
PHP 8 と V8 (JavaScript) で速さを見比べてみよう!shinjiigarashi
 
PyCon JP 2012 hands-on セッション/ FlaskによるWebアプリケーションの実装とプログラミングツール
PyCon JP 2012 hands-on セッション/ FlaskによるWebアプリケーションの実装とプログラミングツールPyCon JP 2012 hands-on セッション/ FlaskによるWebアプリケーションの実装とプログラミングツール
PyCon JP 2012 hands-on セッション/ FlaskによるWebアプリケーションの実装とプログラミングツールAtsuo Ishimoto
 
Pelicanによる www.python.jpの構築
Pelicanによる www.python.jpの構築Pelicanによる www.python.jpの構築
Pelicanによる www.python.jpの構築Atsuo Ishimoto
 
Markup Template Engine introduced Groovy 2.3
Markup Template Engine introduced Groovy 2.3Markup Template Engine introduced Groovy 2.3
Markup Template Engine introduced Groovy 2.3Uehara Junji
 

Tendances (11)

【20211202_toranoana.deno#3】denoでFFI
【20211202_toranoana.deno#3】denoでFFI【20211202_toranoana.deno#3】denoでFFI
【20211202_toranoana.deno#3】denoでFFI
 
Get along with Git
Get along with GitGet along with Git
Get along with Git
 
GoCon 2015 Summer GoのASTをいじくって新しいツールを作る
GoCon 2015 Summer GoのASTをいじくって新しいツールを作るGoCon 2015 Summer GoのASTをいじくって新しいツールを作る
GoCon 2015 Summer GoのASTをいじくって新しいツールを作る
 
ドリコムを支える課金ライブラリを支えるJenkins
ドリコムを支える課金ライブラリを支えるJenkinsドリコムを支える課金ライブラリを支えるJenkins
ドリコムを支える課金ライブラリを支えるJenkins
 
社内ツールが支えるドリコムの社内勉強会文化 #metabenkyokai
社内ツールが支えるドリコムの社内勉強会文化 #metabenkyokai社内ツールが支えるドリコムの社内勉強会文化 #metabenkyokai
社内ツールが支えるドリコムの社内勉強会文化 #metabenkyokai
 
Python におけるドメイン駆動設計(戦術面)の勘どころ
Python におけるドメイン駆動設計(戦術面)の勘どころPython におけるドメイン駆動設計(戦術面)の勘どころ
Python におけるドメイン駆動設計(戦術面)の勘どころ
 
Git 仕組み 入門
Git 仕組み 入門Git 仕組み 入門
Git 仕組み 入門
 
PHP 8 と V8 (JavaScript) で速さを見比べてみよう!
PHP 8 と V8 (JavaScript) で速さを見比べてみよう!PHP 8 と V8 (JavaScript) で速さを見比べてみよう!
PHP 8 と V8 (JavaScript) で速さを見比べてみよう!
 
PyCon JP 2012 hands-on セッション/ FlaskによるWebアプリケーションの実装とプログラミングツール
PyCon JP 2012 hands-on セッション/ FlaskによるWebアプリケーションの実装とプログラミングツールPyCon JP 2012 hands-on セッション/ FlaskによるWebアプリケーションの実装とプログラミングツール
PyCon JP 2012 hands-on セッション/ FlaskによるWebアプリケーションの実装とプログラミングツール
 
Pelicanによる www.python.jpの構築
Pelicanによる www.python.jpの構築Pelicanによる www.python.jpの構築
Pelicanによる www.python.jpの構築
 
Markup Template Engine introduced Groovy 2.3
Markup Template Engine introduced Groovy 2.3Markup Template Engine introduced Groovy 2.3
Markup Template Engine introduced Groovy 2.3
 

Similaire à mbedではじめる組み込みHaskellプログラミング

Debianを用いたCortex-M3マイコン開発事例のご紹介
Debianを用いたCortex-M3マイコン開発事例のご紹介Debianを用いたCortex-M3マイコン開発事例のご紹介
Debianを用いたCortex-M3マイコン開発事例のご紹介Kiwamu Okabe
 
Google container builderと友だちになるまで
Google container builderと友だちになるまでGoogle container builderと友だちになるまで
Google container builderと友だちになるまでlestrrat
 
Starting qt5beta at_raspberry_pi Qtnagoya#6
Starting qt5beta at_raspberry_pi Qtnagoya#6Starting qt5beta at_raspberry_pi Qtnagoya#6
Starting qt5beta at_raspberry_pi Qtnagoya#6Kazuo Asano (@kazuo_asa)
 
コードの自動修正によって実現する、機能開発を止めないフレームワーク移行
コードの自動修正によって実現する、機能開発を止めないフレームワーク移行コードの自動修正によって実現する、機能開発を止めないフレームワーク移行
コードの自動修正によって実現する、機能開発を止めないフレームワーク移行gree_tech
 
Dive into the Cloud with our buddy, lovely PHP!
Dive into the Cloud with our buddy, lovely PHP!Dive into the Cloud with our buddy, lovely PHP!
Dive into the Cloud with our buddy, lovely PHP!Sotaro Omura
 
PlayFramework 2.0 Javaと WebSocketでつくる リアルタイムMVC Webアプリケーション
PlayFramework 2.0 Javaと WebSocketでつくる リアルタイムMVC WebアプリケーションPlayFramework 2.0 Javaと WebSocketでつくる リアルタイムMVC Webアプリケーション
PlayFramework 2.0 Javaと WebSocketでつくる リアルタイムMVC WebアプリケーションKazuhiro Hara
 
ホームディレクトリに埋もれた便利なコードをさがせ!
ホームディレクトリに埋もれた便利なコードをさがせ!ホームディレクトリに埋もれた便利なコードをさがせ!
ホームディレクトリに埋もれた便利なコードをさがせ!Yohei Fushii
 
Getting Started GraalVM / GraalVM超入門 #jjug_ccc #ccc_c2
Getting Started GraalVM / GraalVM超入門 #jjug_ccc #ccc_c2Getting Started GraalVM / GraalVM超入門 #jjug_ccc #ccc_c2
Getting Started GraalVM / GraalVM超入門 #jjug_ccc #ccc_c2tamtam180
 
Getting Started GraalVM (再アップロード)
Getting Started GraalVM (再アップロード)Getting Started GraalVM (再アップロード)
Getting Started GraalVM (再アップロード)tamtam180
 
HaskellではじめるCortex-M3組込みプログラミング
HaskellではじめるCortex-M3組込みプログラミングHaskellではじめるCortex-M3組込みプログラミング
HaskellではじめるCortex-M3組込みプログラミングKiwamu Okabe
 
ReVIEWとLibreOfficeとOMakeで本を書きましょう!
ReVIEWとLibreOfficeとOMakeで本を書きましょう!ReVIEWとLibreOfficeとOMakeで本を書きましょう!
ReVIEWとLibreOfficeとOMakeで本を書きましょう!Kiwamu Okabe
 
シラサギハンズオン 1015 1016
シラサギハンズオン 1015 1016シラサギハンズオン 1015 1016
シラサギハンズオン 1015 1016Yu Ito
 
Metahub for github
Metahub for githubMetahub for github
Metahub for githubSuguru Oho
 
Wiki設置するならgitit!
Wiki設置するならgitit!Wiki設置するならgitit!
Wiki設置するならgitit!Kiwamu Okabe
 
GitHub勉強会~事前準備~
GitHub勉強会~事前準備~GitHub勉強会~事前準備~
GitHub勉強会~事前準備~Shintaro Mizuno
 
20120324 git training
20120324 git training20120324 git training
20120324 git trainingTakeshi AKIMA
 
Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京
Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京
Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京hecomi
 

Similaire à mbedではじめる組み込みHaskellプログラミング (20)

Debianを用いたCortex-M3マイコン開発事例のご紹介
Debianを用いたCortex-M3マイコン開発事例のご紹介Debianを用いたCortex-M3マイコン開発事例のご紹介
Debianを用いたCortex-M3マイコン開発事例のご紹介
 
Google container builderと友だちになるまで
Google container builderと友だちになるまでGoogle container builderと友だちになるまで
Google container builderと友だちになるまで
 
Starting qt5beta at_raspberry_pi Qtnagoya#6
Starting qt5beta at_raspberry_pi Qtnagoya#6Starting qt5beta at_raspberry_pi Qtnagoya#6
Starting qt5beta at_raspberry_pi Qtnagoya#6
 
コードの自動修正によって実現する、機能開発を止めないフレームワーク移行
コードの自動修正によって実現する、機能開発を止めないフレームワーク移行コードの自動修正によって実現する、機能開発を止めないフレームワーク移行
コードの自動修正によって実現する、機能開発を止めないフレームワーク移行
 
Dive into the Cloud with our buddy, lovely PHP!
Dive into the Cloud with our buddy, lovely PHP!Dive into the Cloud with our buddy, lovely PHP!
Dive into the Cloud with our buddy, lovely PHP!
 
PlayFramework 2.0 Javaと WebSocketでつくる リアルタイムMVC Webアプリケーション
PlayFramework 2.0 Javaと WebSocketでつくる リアルタイムMVC WebアプリケーションPlayFramework 2.0 Javaと WebSocketでつくる リアルタイムMVC Webアプリケーション
PlayFramework 2.0 Javaと WebSocketでつくる リアルタイムMVC Webアプリケーション
 
ホームディレクトリに埋もれた便利なコードをさがせ!
ホームディレクトリに埋もれた便利なコードをさがせ!ホームディレクトリに埋もれた便利なコードをさがせ!
ホームディレクトリに埋もれた便利なコードをさがせ!
 
Getting Started GraalVM / GraalVM超入門 #jjug_ccc #ccc_c2
Getting Started GraalVM / GraalVM超入門 #jjug_ccc #ccc_c2Getting Started GraalVM / GraalVM超入門 #jjug_ccc #ccc_c2
Getting Started GraalVM / GraalVM超入門 #jjug_ccc #ccc_c2
 
Getting Started GraalVM (再アップロード)
Getting Started GraalVM (再アップロード)Getting Started GraalVM (再アップロード)
Getting Started GraalVM (再アップロード)
 
HaskellではじめるCortex-M3組込みプログラミング
HaskellではじめるCortex-M3組込みプログラミングHaskellではじめるCortex-M3組込みプログラミング
HaskellではじめるCortex-M3組込みプログラミング
 
GTC Japan 2017
GTC Japan 2017GTC Japan 2017
GTC Japan 2017
 
ReVIEWとLibreOfficeとOMakeで本を書きましょう!
ReVIEWとLibreOfficeとOMakeで本を書きましょう!ReVIEWとLibreOfficeとOMakeで本を書きましょう!
ReVIEWとLibreOfficeとOMakeで本を書きましょう!
 
シラサギハンズオン 1015 1016
シラサギハンズオン 1015 1016シラサギハンズオン 1015 1016
シラサギハンズオン 1015 1016
 
Metahub for github
Metahub for githubMetahub for github
Metahub for github
 
Wiki設置するならgitit!
Wiki設置するならgitit!Wiki設置するならgitit!
Wiki設置するならgitit!
 
GitHub勉強会~事前準備~
GitHub勉強会~事前準備~GitHub勉強会~事前準備~
GitHub勉強会~事前準備~
 
RancherとGitOps的な話
RancherとGitOps的な話RancherとGitOps的な話
RancherとGitOps的な話
 
Haskellでプレゼン
HaskellでプレゼンHaskellでプレゼン
Haskellでプレゼン
 
20120324 git training
20120324 git training20120324 git training
20120324 git training
 
Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京
Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京
Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京
 

Dernier

Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Danieldanielhu54
 
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
新人研修のまとめ       2024/04/12の勉強会で発表されたものです。新人研修のまとめ       2024/04/12の勉強会で発表されたものです。
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。iPride Co., Ltd.
 
PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000Shota Ito
 
UPWARD_share_company_information_20240415.pdf
UPWARD_share_company_information_20240415.pdfUPWARD_share_company_information_20240415.pdf
UPWARD_share_company_information_20240415.pdffurutsuka
 
20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directoryosamut
 
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxIoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxAtomu Hidaka
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略Ryo Sasaki
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムsugiuralab
 
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。iPride Co., Ltd.
 

Dernier (9)

Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Daniel
 
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
新人研修のまとめ       2024/04/12の勉強会で発表されたものです。新人研修のまとめ       2024/04/12の勉強会で発表されたものです。
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
 
PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000
 
UPWARD_share_company_information_20240415.pdf
UPWARD_share_company_information_20240415.pdfUPWARD_share_company_information_20240415.pdf
UPWARD_share_company_information_20240415.pdf
 
20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory
 
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxIoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
 
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
 

mbedではじめる組み込みHaskellプログラミング

  • 1. mbed ではじめる組み込み Haskell プログラミング mbed ではじめる組み込み Haskell プログラミング mbed ではじめる組み込み Haskell プログラミング mbed ではじめる組み込み Haskell プログラミング mbed ではじめる組み込み Haskell プログラミング Kiwamu OkabeKiwamu OkabeKiwamu OkabeKiwamu OkabeKiwamu Okabe
  • 2. わたしはだれ?わたしはだれ?わたしはだれ?わたしはだれ?わたしはだれ? ☆ Twitter: @master_q☆ Twitter: @master_q☆ Twitter: @master_q☆ Twitter: @master_q☆ Twitter: @master_q ☆ Metasepiプロジェクト主催☆ Metasepiプロジェクト主催☆ Metasepiプロジェクト主催☆ Metasepiプロジェクト主催☆ Metasepiプロジェクト主催 ☆ Ajhc Haskellコンパイラ開発者☆ Ajhc Haskellコンパイラ開発者☆ Ajhc Haskellコンパイラ開発者☆ Ajhc Haskellコンパイラ開発者☆ Ajhc Haskellコンパイラ開発者 ☆ Debian Maintainer☆ Debian Maintainer☆ Debian Maintainer☆ Debian Maintainer☆ Debian Maintainer ☆ 参照透明な海を守る会会員☆ 参照透明な海を守る会会員☆ 参照透明な海を守る会会員☆ 参照透明な海を守る会会員☆ 参照透明な海を守る会会員 ☆ 前はデジタルサイネージの開発してました☆ 前はデジタルサイネージの開発してました☆ 前はデジタルサイネージの開発してました☆ 前はデジタルサイネージの開発してました☆ 前はデジタルサイネージの開発してました ☆ その昔はコピー機のOSをNetBSDで☆ その昔はコピー機のOSをNetBSDで☆ その昔はコピー機のOSをNetBSDで☆ その昔はコピー機のOSをNetBSDで☆ その昔はコピー機のOSをNetBSDで
  • 3. 今日はHaskellよりmbedに焦点今日はHaskellよりmbedに焦点今日はHaskellよりmbedに焦点今日はHaskellよりmbedに焦点今日はHaskellよりmbedに焦点 ☆ 一昨日OSC Hokkaidoが開催されました☆ 一昨日OSC Hokkaidoが開催されました☆ 一昨日OSC Hokkaidoが開催されました☆ 一昨日OSC Hokkaidoが開催されました☆ 一昨日OSC Hokkaidoが開催されました ☆ Haskellの話はその時の資料をどうぞ!☆ Haskellの話はその時の資料をどうぞ!☆ Haskellの話はその時の資料をどうぞ!☆ Haskellの話はその時の資料をどうぞ!☆ Haskellの話はその時の資料をどうぞ! http://bit.ly/mbedhaskhttp://bit.ly/mbedhaskhttp://bit.ly/mbedhaskhttp://bit.ly/mbedhaskhttp://bit.ly/mbedhask ☆ 今日はmbed側の話をさせてください☆ 今日はmbed側の話をさせてください☆ 今日はmbed側の話をさせてください☆ 今日はmbed側の話をさせてください☆ 今日はmbed側の話をさせてください
  • 4. おしながきおしながきおしながきおしながきおしながき ☆ [1] Haskell言語とは☆ [1] Haskell言語とは☆ [1] Haskell言語とは☆ [1] Haskell言語とは☆ [1] Haskell言語とは ☆ [2] mbedにおけるHaskell開発環境☆ [2] mbedにおけるHaskell開発環境☆ [2] mbedにおけるHaskell開発環境☆ [2] mbedにおけるHaskell開発環境☆ [2] mbedにおけるHaskell開発環境 ☆ [3] mbed+Haskellデモ☆ [3] mbed+Haskellデモ☆ [3] mbed+Haskellデモ☆ [3] mbed+Haskellデモ☆ [3] mbed+Haskellデモ ☆ [4] デモの実装概要☆ [4] デモの実装概要☆ [4] デモの実装概要☆ [4] デモの実装概要☆ [4] デモの実装概要 ☆ [5] デモの実装詳細☆ [5] デモの実装詳細☆ [5] デモの実装詳細☆ [5] デモの実装詳細☆ [5] デモの実装詳細 ☆ [6] これからの課題など☆ [6] これからの課題など☆ [6] これからの課題など☆ [6] これからの課題など☆ [6] これからの課題など
  • 5. [1] Haskell言語とは[1] Haskell言語とは[1] Haskell言語とは[1] Haskell言語とは[1] Haskell言語とは ☆ 強い型を使えるプログラミング言語☆ 強い型を使えるプログラミング言語☆ 強い型を使えるプログラミング言語☆ 強い型を使えるプログラミング言語☆ 強い型を使えるプログラミング言語 ☆ コンパイルエラー↑ / 実行時エラー↓☆ コンパイルエラー↑ / 実行時エラー↓☆ コンパイルエラー↑ / 実行時エラー↓☆ コンパイルエラー↑ / 実行時エラー↓☆ コンパイルエラー↑ / 実行時エラー↓ 参考:「数理科学的バグ撲滅方法論のすすめ」 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/
  • 6. なんでまたHaskell組み込み?なんでまたHaskell組み込み?なんでまたHaskell組み込み?なんでまたHaskell組み込み?なんでまたHaskell組み込み? ☆ アプリでエラー → SEGV → 再起動できる☆ アプリでエラー → SEGV → 再起動できる☆ アプリでエラー → SEGV → 再起動できる☆ アプリでエラー → SEGV → 再起動できる☆ アプリでエラー → SEGV → 再起動できる ☆ 低レイヤーでエラー → システム停止☆ 低レイヤーでエラー → システム停止☆ 低レイヤーでエラー → システム停止☆ 低レイヤーでエラー → システム停止☆ 低レイヤーでエラー → システム停止 ☆ 低レイヤーを強い型で安全に設計したい!☆ 低レイヤーを強い型で安全に設計したい!☆ 低レイヤーを強い型で安全に設計したい!☆ 低レイヤーを強い型で安全に設計したい!☆ 低レイヤーを強い型で安全に設計したい! ☆ Ajhc Haskellコンパイラを開発中☆ Ajhc Haskellコンパイラを開発中☆ Ajhc Haskellコンパイラを開発中☆ Ajhc Haskellコンパイラを開発中☆ Ajhc Haskellコンパイラを開発中 ☆ http://ajhc.metasepi.org/☆ http://ajhc.metasepi.org/☆ http://ajhc.metasepi.org/☆ http://ajhc.metasepi.org/☆ http://ajhc.metasepi.org/
  • 7. このプレゼンで前提とする環境このプレゼンで前提とする環境このプレゼンで前提とする環境このプレゼンで前提とする環境このプレゼンで前提とする環境 ☆ Debian GNU/Linux sid amd64☆ Debian GNU/Linux sid amd64☆ Debian GNU/Linux sid amd64☆ Debian GNU/Linux sid amd64☆ Debian GNU/Linux sid amd64 ☆ 他のディストリでも大丈夫だと思います☆ 他のディストリでも大丈夫だと思います☆ 他のディストリでも大丈夫だと思います☆ 他のディストリでも大丈夫だと思います☆ 他のディストリでも大丈夫だと思います ☆ WindowsとMacもひょっとしたら同じ?☆ WindowsとMacもひょっとしたら同じ?☆ WindowsとMacもひょっとしたら同じ?☆ WindowsとMacもひょっとしたら同じ?☆ WindowsとMacもひょっとしたら同じ?
  • 8. [2] mbedにおけるHaskell開発環境[2] mbedにおけるHaskell開発環境[2] mbedにおけるHaskell開発環境[2] mbedにおけるHaskell開発環境[2] mbedにおけるHaskell開発環境 詳細: http://bit.ly/mbedhask詳細: http://bit.ly/mbedhask詳細: http://bit.ly/mbedhask詳細: http://bit.ly/mbedhask詳細: http://bit.ly/mbedhask
  • 9. ファームウェア書き込みファームウェア書き込みファームウェア書き込みファームウェア書き込みファームウェア書き込み http://mbed.org/blog/entry/Debugging-from-GDB-using-pyOCD/ https://github.com/mbedmicro/mbed/tree/master/workspace_tools/ debugger http://mbed.org/blog/entry/Debugging-from-GDB-using-pyOCD/ https://github.com/mbedmicro/mbed/tree/master/workspace_tools/ debugger http://mbed.org/blog/entry/Debugging-from-GDB-using-pyOCD/ https://github.com/mbedmicro/mbed/tree/master/workspace_tools/ debugger http://mbed.org/blog/entry/Debugging-from-GDB-using-pyOCD/ https://github.com/mbedmicro/mbed/tree/master/workspace_tools/ debugger http://mbed.org/blog/entry/Debugging-from-GDB-using-pyOCD/ https://github.com/mbedmicro/mbed/tree/master/workspace_tools/ debugger ぼくは"make gdbwrite"一発でビルド+ファー ム書込ができるように設定しています ぼくは"make gdbwrite"一発でビルド+ファー ム書込ができるように設定しています ぼくは"make gdbwrite"一発でビルド+ファー ム書込ができるように設定しています ぼくは"make gdbwrite"一発でビルド+ファー ム書込ができるように設定しています ぼくは"make gdbwrite"一発でビルド+ファー ム書込ができるように設定しています
  • 10. クラウドコンパイラは使えないの?クラウドコンパイラは使えないの?クラウドコンパイラは使えないの?クラウドコンパイラは使えないの?クラウドコンパイラは使えないの? いくつか課題があって実現していませんいくつか課題があって実現していませんいくつか課題があって実現していませんいくつか課題があって実現していませんいくつか課題があって実現していません ☆ AjhcコンパイラがGCCに依存している☆ AjhcコンパイラがGCCに依存している☆ AjhcコンパイラがGCCに依存している☆ AjhcコンパイラがGCCに依存している☆ AjhcコンパイラがGCCに依存している ☆ クラウドコンパイラがコマンドを呼べない☆ クラウドコンパイラがコマンドを呼べない☆ クラウドコンパイラがコマンドを呼べない☆ クラウドコンパイラがコマンドを呼べない☆ クラウドコンパイラがコマンドを呼べない
  • 11. 妄想: クラウドコンパイラ+Ajhc妄想: クラウドコンパイラ+Ajhc妄想: クラウドコンパイラ+Ajhc妄想: クラウドコンパイラ+Ajhc妄想: クラウドコンパイラ+Ajhc mbed.org側修正が必要になってしまいます...mbed.org側修正が必要になってしまいます...mbed.org側修正が必要になってしまいます...mbed.org側修正が必要になってしまいます...mbed.org側修正が必要になってしまいます...
  • 12. [3] mbed+Haskellデモ[3] mbed+Haskellデモ[3] mbed+Haskellデモ[3] mbed+Haskellデモ[3] mbed+Haskellデモ ☆ mbedでRSSリーダーを作ってみました☆ mbedでRSSリーダーを作ってみました☆ mbedでRSSリーダーを作ってみました☆ mbedでRSSリーダーを作ってみました☆ mbedでRSSリーダーを作ってみました ☆ redditのRSSをLCDにヘッドライン表示☆ redditのRSSをLCDにヘッドライン表示☆ redditのRSSをLCDにヘッドライン表示☆ redditのRSSをLCDにヘッドライン表示☆ redditのRSSをLCDにヘッドライン表示 ☆ 動画は以下のURLから観れます☆ 動画は以下のURLから観れます☆ 動画は以下のURLから観れます☆ 動画は以下のURLから観れます☆ 動画は以下のURLから観れます http://bit.ly/mbedmovhttp://bit.ly/mbedmovhttp://bit.ly/mbedmovhttp://bit.ly/mbedmovhttp://bit.ly/mbedmov
  • 13. [4] デモの実装概要[4] デモの実装概要[4] デモの実装概要[4] デモの実装概要[4] デモの実装概要
  • 14. [5] デモの実装詳細[5] デモの実装詳細[5] デモの実装詳細[5] デモの実装詳細[5] デモの実装詳細 ソースコードはこちらソースコードはこちらソースコードはこちらソースコードはこちらソースコードはこちら https://github.com/ajhc/demo-cortex-m3/tree/master/mbed-nxp- lpc1768/samples/Haskell_Http https://github.com/ajhc/demo-cortex-m3/tree/master/mbed-nxp- lpc1768/samples/Haskell_Http https://github.com/ajhc/demo-cortex-m3/tree/master/mbed-nxp- lpc1768/samples/Haskell_Http https://github.com/ajhc/demo-cortex-m3/tree/master/mbed-nxp- lpc1768/samples/Haskell_Http https://github.com/ajhc/demo-cortex-m3/tree/master/mbed-nxp- lpc1768/samples/Haskell_Http
  • 15. Haskell→C言語 呼び出しHaskell→C言語 呼び出しHaskell→C言語 呼び出しHaskell→C言語 呼び出しHaskell→C言語 呼び出し foreign import ccall "c_extern.h wait_us" delayUs :: Int -> IO ()foreign import ccall "c_extern.h wait_us" delayUs :: Int -> IO ()foreign import ccall "c_extern.h wait_us" delayUs :: Int -> IO ()foreign import ccall "c_extern.h wait_us" delayUs :: Int -> IO ()foreign import ccall "c_extern.h wait_us" delayUs :: Int -> IO ()
  • 16. C言語の構造体を型として扱うC言語の構造体を型として扱うC言語の構造体を型として扱うC言語の構造体を型として扱うC言語の構造体を型として扱う newtype {-# CTYPE "gpio_t" #-} GpioT = GpioT () foreign import primitive "const.sizeof(gpio_t)" gpio_t_size :: Int foreign import ccall "c_extern.h gpio_init" c_gpio_init :: Ptr GpioT -> Int -> Int -> IO () gpioInit :: Int -> Int -> IO (Ptr GpioT) gpioInit name direction = do tag <- mallocBytes gpio_t_size c_gpio_init tag name direction return tag newtype {-# CTYPE "gpio_t" #-} GpioT = GpioT () foreign import primitive "const.sizeof(gpio_t)" gpio_t_size :: Int foreign import ccall "c_extern.h gpio_init" c_gpio_init :: Ptr GpioT -> Int -> Int -> IO () gpioInit :: Int -> Int -> IO (Ptr GpioT) gpioInit name direction = do tag <- mallocBytes gpio_t_size c_gpio_init tag name direction return tag newtype {-# CTYPE "gpio_t" #-} GpioT = GpioT () foreign import primitive "const.sizeof(gpio_t)" gpio_t_size :: Int foreign import ccall "c_extern.h gpio_init" c_gpio_init :: Ptr GpioT -> Int -> Int -> IO () gpioInit :: Int -> Int -> IO (Ptr GpioT) gpioInit name direction = do tag <- mallocBytes gpio_t_size c_gpio_init tag name direction return tag newtype {-# CTYPE "gpio_t" #-} GpioT = GpioT () foreign import primitive "const.sizeof(gpio_t)" gpio_t_size :: Int foreign import ccall "c_extern.h gpio_init" c_gpio_init :: Ptr GpioT -> Int -> Int -> IO () gpioInit :: Int -> Int -> IO (Ptr GpioT) gpioInit name direction = do tag <- mallocBytes gpio_t_size c_gpio_init tag name direction return tag newtype {-# CTYPE "gpio_t" #-} GpioT = GpioT () foreign import primitive "const.sizeof(gpio_t)" gpio_t_size :: Int foreign import ccall "c_extern.h gpio_init" c_gpio_init :: Ptr GpioT -> Int -> Int -> IO () gpioInit :: Int -> Int -> IO (Ptr GpioT) gpioInit name direction = do tag <- mallocBytes gpio_t_size c_gpio_init tag name direction return tag
  • 17. C言語ヘッダのアドレス設定を参照C言語ヘッダのアドレス設定を参照C言語ヘッダのアドレス設定を参照C言語ヘッダのアドレス設定を参照C言語ヘッダのアドレス設定を参照 foreign import primitive "const.LPC_GPIO0_BASE" addr_LPC_GPIO0_BASE :: Int pinName :: Int -> Int -> Int pinName major minor = addr_LPC_GPIO0_BASE + major * 32 + minor led1 :: Int led1 = pinName 1 18 -- P1.18 foreign import primitive "const.LPC_GPIO0_BASE" addr_LPC_GPIO0_BASE :: Int pinName :: Int -> Int -> Int pinName major minor = addr_LPC_GPIO0_BASE + major * 32 + minor led1 :: Int led1 = pinName 1 18 -- P1.18 foreign import primitive "const.LPC_GPIO0_BASE" addr_LPC_GPIO0_BASE :: Int pinName :: Int -> Int -> Int pinName major minor = addr_LPC_GPIO0_BASE + major * 32 + minor led1 :: Int led1 = pinName 1 18 -- P1.18 foreign import primitive "const.LPC_GPIO0_BASE" addr_LPC_GPIO0_BASE :: Int pinName :: Int -> Int -> Int pinName major minor = addr_LPC_GPIO0_BASE + major * 32 + minor led1 :: Int led1 = pinName 1 18 -- P1.18 foreign import primitive "const.LPC_GPIO0_BASE" addr_LPC_GPIO0_BASE :: Int pinName :: Int -> Int -> Int pinName major minor = addr_LPC_GPIO0_BASE + major * 32 + minor led1 :: Int led1 = pinName 1 18 -- P1.18
  • 18. LEDのON/OFFLEDのON/OFFLEDのON/OFFLEDのON/OFFLEDのON/OFF pinOutput :: Int pinOutput = 1 initLed :: Int -> IO (Ptr GpioT) initLed name = gpioInit name pinOutput ledOn, ledOff :: Ptr GpioT -> IO () ledOn l = gpioWrite l 1 ledOff l = gpioWrite l 0 pinOutput :: Int pinOutput = 1 initLed :: Int -> IO (Ptr GpioT) initLed name = gpioInit name pinOutput ledOn, ledOff :: Ptr GpioT -> IO () ledOn l = gpioWrite l 1 ledOff l = gpioWrite l 0 pinOutput :: Int pinOutput = 1 initLed :: Int -> IO (Ptr GpioT) initLed name = gpioInit name pinOutput ledOn, ledOff :: Ptr GpioT -> IO () ledOn l = gpioWrite l 1 ledOff l = gpioWrite l 0 pinOutput :: Int pinOutput = 1 initLed :: Int -> IO (Ptr GpioT) initLed name = gpioInit name pinOutput ledOn, ledOff :: Ptr GpioT -> IO () ledOn l = gpioWrite l 1 ledOff l = gpioWrite l 0 pinOutput :: Int pinOutput = 1 initLed :: Int -> IO (Ptr GpioT) initLed name = gpioInit name pinOutput ledOn, ledOff :: Ptr GpioT -> IO () ledOn l = gpioWrite l 1 ledOff l = gpioWrite l 0
  • 20. ストリーム処理ストリーム処理ストリーム処理ストリーム処理ストリーム処理 receiveAll :: Ptr TCPSocketConnectionT -> IO [String] receiveAll tcp = unsafeInterleaveIO receiveAll' where receiveAll' = do s <- tcpSocketConnection_receive tcp if s == "" then return [] else do s' <- unsafeInterleaveIO receiveAll' return $ s:s' receiveAll :: Ptr TCPSocketConnectionT -> IO [String] receiveAll tcp = unsafeInterleaveIO receiveAll' where receiveAll' = do s <- tcpSocketConnection_receive tcp if s == "" then return [] else do s' <- unsafeInterleaveIO receiveAll' return $ s:s' receiveAll :: Ptr TCPSocketConnectionT -> IO [String] receiveAll tcp = unsafeInterleaveIO receiveAll' where receiveAll' = do s <- tcpSocketConnection_receive tcp if s == "" then return [] else do s' <- unsafeInterleaveIO receiveAll' return $ s:s' receiveAll :: Ptr TCPSocketConnectionT -> IO [String] receiveAll tcp = unsafeInterleaveIO receiveAll' where receiveAll' = do s <- tcpSocketConnection_receive tcp if s == "" then return [] else do s' <- unsafeInterleaveIO receiveAll' return $ s:s' receiveAll :: Ptr TCPSocketConnectionT -> IO [String] receiveAll tcp = unsafeInterleaveIO receiveAll' where receiveAll' = do s <- tcpSocketConnection_receive tcp if s == "" then return [] else do s' <- unsafeInterleaveIO receiveAll' return $ s:s'
  • 21. えっと何がうれしいの?えっと何がうれしいの?えっと何がうれしいの?えっと何がうれしいの?えっと何がうれしいの? main = do ethernetInitDhcp ethernetConnect 12000 ethernetGetIpAddress tcp <- tcpSocketConnection_connect host 80 tcpSocketConnection_send_all tcp $ "GET /hoge.txt HTTP/1.0nn" r <- receiveAll tcp main = do ethernetInitDhcp ethernetConnect 12000 ethernetGetIpAddress tcp <- tcpSocketConnection_connect host 80 tcpSocketConnection_send_all tcp $ "GET /hoge.txt HTTP/1.0nn" r <- receiveAll tcp main = do ethernetInitDhcp ethernetConnect 12000 ethernetGetIpAddress tcp <- tcpSocketConnection_connect host 80 tcpSocketConnection_send_all tcp $ "GET /hoge.txt HTTP/1.0nn" r <- receiveAll tcp main = do ethernetInitDhcp ethernetConnect 12000 ethernetGetIpAddress tcp <- tcpSocketConnection_connect host 80 tcpSocketConnection_send_all tcp $ "GET /hoge.txt HTTP/1.0nn" r <- receiveAll tcp main = do ethernetInitDhcp ethernetConnect 12000 ethernetGetIpAddress tcp <- tcpSocketConnection_connect host 80 tcpSocketConnection_send_all tcp $ "GET /hoge.txt HTTP/1.0nn" r <- receiveAll tcp ☆ この時"r"には単なるリストが返ってくる☆ この時"r"には単なるリストが返ってくる☆ この時"r"には単なるリストが返ってくる☆ この時"r"には単なるリストが返ってくる☆ この時"r"には単なるリストが返ってくる ☆ このリストを単に読むと☆ このリストを単に読むと☆ このリストを単に読むと☆ このリストを単に読むと☆ このリストを単に読むと ☆ lwIPが自動的にパケットを読んでくれる!☆ lwIPが自動的にパケットを読んでくれる!☆ lwIPが自動的にパケットを読んでくれる!☆ lwIPが自動的にパケットを読んでくれる!☆ lwIPが自動的にパケットを読んでくれる! ☆ このリストをRSSパーサに直接突っ込める☆ このリストをRSSパーサに直接突っ込める☆ このリストをRSSパーサに直接突っ込める☆ このリストをRSSパーサに直接突っ込める☆ このリストをRSSパーサに直接突っ込める
  • 23. [6] これからの課題など[6] これからの課題など[6] これからの課題など[6] これからの課題など[6] これからの課題など ☆ mbedのAPIはC++☆ mbedのAPIはC++☆ mbedのAPIはC++☆ mbedのAPIはC++☆ mbedのAPIはC++ ☆ Haskellから直接C++を呼べない☆ Haskellから直接C++を呼べない☆ Haskellから直接C++を呼べない☆ Haskellから直接C++を呼べない☆ Haskellから直接C++を呼べない ☆ 今はmbed APIをCで書き直したり (涙☆ 今はmbed APIをCで書き直したり (涙☆ 今はmbed APIをCで書き直したり (涙☆ 今はmbed APIをCで書き直したり (涙☆ 今はmbed APIをCで書き直したり (涙 ☆ 簡単にmbed APIをHaskellラップしたい☆ 簡単にmbed APIをHaskellラップしたい☆ 簡単にmbed APIをHaskellラップしたい☆ 簡単にmbed APIをHaskellラップしたい☆ 簡単にmbed APIをHaskellラップしたい ☆ クラウドコンパイラ使いたいなぁ...☆ クラウドコンパイラ使いたいなぁ...☆ クラウドコンパイラ使いたいなぁ...☆ クラウドコンパイラ使いたいなぁ...☆ クラウドコンパイラ使いたいなぁ...
  • 24. Metasepiメンバー紹介 #1Metasepiメンバー紹介 #1Metasepiメンバー紹介 #1Metasepiメンバー紹介 #1Metasepiメンバー紹介 #1 ☆ @dec9ue さん☆ @dec9ue さん☆ @dec9ue さん☆ @dec9ue さん☆ @dec9ue さん ☆ jhcのGCを解析してくれました☆ jhcのGCを解析してくれました☆ jhcのGCを解析してくれました☆ jhcのGCを解析してくれました☆ jhcのGCを解析してくれました ☆ 組込対応はGCの改造が不可欠でした☆ 組込対応はGCの改造が不可欠でした☆ 組込対応はGCの改造が不可欠でした☆ 組込対応はGCの改造が不可欠でした☆ 組込対応はGCの改造が不可欠でした ☆ その他GC関連について相談にのってくれる☆ その他GC関連について相談にのってくれる☆ その他GC関連について相談にのってくれる☆ その他GC関連について相談にのってくれる☆ その他GC関連について相談にのってくれる ☆ 最近はHDL屋さんになって忙しそう...☆ 最近はHDL屋さんになって忙しそう...☆ 最近はHDL屋さんになって忙しそう...☆ 最近はHDL屋さんになって忙しそう...☆ 最近はHDL屋さんになって忙しそう...
  • 25. Metasepiメンバー紹介 #2Metasepiメンバー紹介 #2Metasepiメンバー紹介 #2Metasepiメンバー紹介 #2Metasepiメンバー紹介 #2 ☆ @mzp さん☆ @mzp さん☆ @mzp さん☆ @mzp さん☆ @mzp さん ☆ なごやこわい☆ なごやこわい☆ なごやこわい☆ なごやこわい☆ なごやこわい ☆ 関数型言語や証明言語にとても強い☆ 関数型言語や証明言語にとても強い☆ 関数型言語や証明言語にとても強い☆ 関数型言語や証明言語にとても強い☆ 関数型言語や証明言語にとても強い ☆ Xen上で動くMini-OSをHaskell化中☆ Xen上で動くMini-OSをHaskell化中☆ Xen上で動くMini-OSをHaskell化中☆ Xen上で動くMini-OSをHaskell化中☆ Xen上で動くMini-OSをHaskell化中 ☆ github.com/mzp/mini-os-with-ajhc☆ github.com/mzp/mini-os-with-ajhc☆ github.com/mzp/mini-os-with-ajhc☆ github.com/mzp/mini-os-with-ajhc☆ github.com/mzp/mini-os-with-ajhc ☆ Ajhcの不具合にさくっとpatchをくれたり☆ Ajhcの不具合にさくっとpatchをくれたり☆ Ajhcの不具合にさくっとpatchをくれたり☆ Ajhcの不具合にさくっとpatchをくれたり☆ Ajhcの不具合にさくっとpatchをくれたり
  • 26. 同人誌にコンパイラの記事書きました同人誌にコンパイラの記事書きました同人誌にコンパイラの記事書きました同人誌にコンパイラの記事書きました同人誌にコンパイラの記事書きました http://www.paraiso-lang.org/ikmsm/http://www.paraiso-lang.org/ikmsm/http://www.paraiso-lang.org/ikmsm/http://www.paraiso-lang.org/ikmsm/http://www.paraiso-lang.org/ikmsm/ ☆ Lensライブラリの解説☆ Lensライブラリの解説☆ Lensライブラリの解説☆ Lensライブラリの解説☆ Lensライブラリの解説 ☆ パーサの解説☆ パーサの解説☆ パーサの解説☆ パーサの解説☆ パーサの解説 ☆ 圏論とモナド☆ 圏論とモナド☆ 圏論とモナド☆ 圏論とモナド☆ 圏論とモナド ☆ 囲碁AI☆ 囲碁AI☆ 囲碁AI☆ 囲碁AI☆ 囲碁AI ☆ Ajhcコンパイラの開発秘話 <= コレ書いた☆ Ajhcコンパイラの開発秘話 <= コレ書いた☆ Ajhcコンパイラの開発秘話 <= コレ書いた☆ Ajhcコンパイラの開発秘話 <= コレ書いた☆ Ajhcコンパイラの開発秘話 <= コレ書いた 立ち読み/購入したい方は声かけてください!立ち読み/購入したい方は声かけてください!立ち読み/購入したい方は声かけてください!立ち読み/購入したい方は声かけてください!立ち読み/購入したい方は声かけてください!