SlideShare uma empresa Scribd logo
1 de 49
Baixar para ler offline
ClojureではじめるSTM入門
      @athos0220
    並列/並行基礎勉強会
自己紹介
@athos0220

趣味でClojure触ってます

正直STMとかまともに使ったことないわー

付け焼刃に勉強したので間違ってるところあ
るかも(´・ω・`)

→生温かくご指摘お願いします
What’s STM?
STMとは
Software Transactional Memory
ソフトウェアトランザクショナルメモリは、データベーストラン
ザクションに似た並行性制御機構であり、並列計算を行う際の
共有メモリへのアクセス法である。
この機構はロックベースの同期を用いた並行性制御の代替手段と
して機能し、ノンブロッキングな方法で実装される物もある。
                                Wikipediaより


楽観的:
  他のスレッドを気にせずとりあえず実行してみる
  変なことになったらリトライする

最近盛んに研究されている(らしい)
ロックの利点と欠点
利点

 いつロックを取得し、解除するかを陽に制御できる

 開発者にとって馴染みがある方法

 多くのプログラミング言語でサポートされている

欠点

 ロックのとる順序によってデッドロックが起こる

 優先度逆転が起こる

 composableでない
STMの利点と欠点
利点

 デッドロックや優先度逆転が起きない

 楽観的なので並行性が向上する

 composableである(ネストできる)

欠点

 リトライが頻発することでパフォーマンスが悪くなる

 余分なオーバーヘッドがかかる

 トランザクション内では副作用を避ける必要がある
各言語での対応状況
言語(処理系)組込み

 Clojure, Haskell, Perl6(Pugs)

ライブラリ

 C, C++, C#, Common Lisp, Java, OCaml,
 Python, Scala, Smalltalk

どの入門書にもSTMの解説があるのはClojure
だけ
How to use STM
   in Clojure
STMの基本構文・関数
(dosync <body>):<body>をトランザクションで
実行

(ref <val>):トランザクション内で変更が可能な
参照(Ref型)を生成

(deref <ref>):Refにくるまれた値をデリファレ
ンス。@<ref>は糖衣構文

(ref-set <ref> <val>):Refの値を変更する。
dosyncの外で使うとエラーになる
STMを使ったコード
                    (def counter (ref 42))
                             counter

                              42
         Thread A                               Thread B

(dosync                                (dosync
  (let [v @counter]                      (let [v @counter]
    (when (<= v 100)                       (when (<= v 100)
      (ref-set counter                       (ref-set counter
               (inc v)))))                            (inc v)))))
STMを使ったコード
                    (def counter (ref 42))
                             counter

                              42
         Thread A                               Thread B

(dosync                                (dosync
  (let [v @counter]                      (let [v @counter]
    (when (<= v 100)                       (when (<= v 100)
      (ref-set counter                       (ref-set counter
               (inc v)))))                            (inc v)))))
STMを使ったコード
                    (def counter (ref 42))
                             counter

                              42
         Thread A                               Thread B

(dosync                                (dosync
  (let [v @counter]                      (let [v @counter]
    (when (<= v 100)                       (when (<= v 100)
      (ref-set counter                       (ref-set counter
               (inc v)))))                            (inc v)))))

            42
STMを使ったコード
                    (def counter (ref 42))
                             counter

                              42
         Thread A                               Thread B

(dosync                                (dosync
  (let [v @counter]                      (let [v @counter]
    (when (<= v 100)                       (when (<= v 100)
      (ref-set counter                       (ref-set counter
               (inc v)))))                            (inc v)))))

            42                                     42
STMを使ったコード
                    (def counter (ref 42))
                             counter

                              42
         Thread A                               Thread B

(dosync                                (dosync
  (let [v @counter]                      (let [v @counter]
    (when (<= v 100)                       (when (<= v 100)
      (ref-set counter                       (ref-set counter
               (inc v)))))                            (inc v)))))

            43                                     42
STMを使ったコード
                    (def counter (ref 42))
                             counter

                              42
         Thread A                               Thread B

(dosync                                (dosync
  (let [v @counter]                      (let [v @counter]
    (when (<= v 100)                       (when (<= v 100)
      (ref-set counter                       (ref-set counter
               (inc v)))))                            (inc v)))))

            43      この時点の変更はBからは見えない
                                 42
STMを使ったコード
                    (def counter (ref 42))
                             counter

                              42
         Thread A                               Thread B

(dosync                                (dosync
  (let [v @counter]                      (let [v @counter]
    (when (<= v 100)                       (when (<= v 100)
      (ref-set counter                       (ref-set counter
               (inc v)))))                            (inc v)))))

            43                                     42
STMを使ったコード
                    (def counter (ref 42))
                             counter

                              42
         Thread A                               Thread B

(dosync                                (dosync
  (let [v @counter]                      (let [v @counter]
    (when (<= v 100)                       (when (<= v 100)
      (ref-set counter                       (ref-set counter
               (inc v)))))                            (inc v)))))

            43      他で値が変更されていなければコミット
                                 42
STMを使ったコード
                    (def counter (ref 42))
                             counter

                              43
         Thread A                               Thread B

(dosync                                (dosync
  (let [v @counter]                      (let [v @counter]
    (when (<= v 100)                       (when (<= v 100)
      (ref-set counter                       (ref-set counter
               (inc v)))))                            (inc v)))))

            43                     コミット!           42
STMを使ったコード
                    (def counter (ref 42))
                             counter

                              43
         Thread A                               Thread B

(dosync                                (dosync
  (let [v @counter]                      (let [v @counter]
    (when (<= v 100)                       (when (<= v 100)
      (ref-set counter                       (ref-set counter
               (inc v)))))                            (inc v)))))

                                                   42
STMを使ったコード
                    (def counter (ref 42))
                             counter

                              43
         Thread A                               Thread B

(dosync                                (dosync
  (let [v @counter]                      (let [v @counter]
    (when (<= v 100)                       (when (<= v 100)
      (ref-set counter                       (ref-set counter
               (inc v)))))                            (inc v)))))

                                                  43
STMを使ったコード
                    (def counter (ref 42))
                             counter

                              43
         Thread A                               Thread B

(dosync                                (dosync
  (let [v @counter]                      (let [v @counter]
    (when (<= v 100)                       (when (<= v 100)
      (ref-set counter                       (ref-set counter
               (inc v)))))                            (inc v)))))

                                                  43
STMを使ったコード
                    (def counter (ref 42))
                             counter

                              43
         Thread A                               Thread B

(dosync                                (dosync
  (let [v @counter]                      (let [v @counter]
    (when (<= v 100)                       (when (<= v 100)
      (ref-set counter                       (ref-set counter
               (inc v)))))                            (inc v)))))

Aが値を変更したので失敗                                      43
STMを使ったコード
                    (def counter (ref 42))
                             counter

                              43
         Thread A                               Thread B

(dosync                                (dosync
  (let [v @counter]                      (let [v @counter]
    (when (<= v 100)                       (when (<= v 100)
      (ref-set counter                       (ref-set counter
               (inc v)))))                            (inc v)))))

  トランザクションを最初からやり直す                                43
STMを使ったコード
                    (def counter (ref 42))
                             counter

                              43
         Thread A                               Thread B

(dosync                                (dosync
  (let [v @counter]                      (let [v @counter]
    (when (<= v 100)                       (when (<= v 100)
      (ref-set counter                       (ref-set counter
               (inc v)))))                            (inc v)))))

                                                   43
STMを使ったコード
                    (def counter (ref 42))
                             counter

                              43
         Thread A                               Thread B

(dosync                                (dosync
  (let [v @counter]                      (let [v @counter]
    (when (<= v 100)                       (when (<= v 100)
      (ref-set counter                       (ref-set counter
               (inc v)))))                            (inc v)))))

                                                   43
STMを使ったコード
                    (def counter (ref 42))
                             counter

                              43
         Thread A                               Thread B

(dosync                                (dosync
  (let [v @counter]                      (let [v @counter]
    (when (<= v 100)                       (when (<= v 100)
      (ref-set counter                       (ref-set counter
               (inc v)))))                            (inc v)))))

                                                  44
STMを使ったコード
                    (def counter (ref 42))
                             counter

                              43
         Thread A                               Thread B

(dosync                                (dosync
  (let [v @counter]                      (let [v @counter]
    (when (<= v 100)                       (when (<= v 100)
      (ref-set counter                       (ref-set counter
               (inc v)))))                            (inc v)))))

                                                  44
STMを使ったコード
                    (def counter (ref 42))
                             counter

                              44
         Thread A                               Thread B

(dosync                                (dosync
  (let [v @counter]                      (let [v @counter]
    (when (<= v 100)                       (when (<= v 100)
      (ref-set counter                       (ref-set counter
               (inc v)))))                            (inc v)))))

                コミット!                             44
ClojureのSTM観
       Thread A                              Thread B
                            a
... @a ...
                                    ... (ref-set a ...) ...
... (ref-set b ...) ...
                                b
                                       ... (ref-set b ...) ...
  ... (ref-set c ...) ...       c
   トランザクションは更新するRefを集めていく
   途中で他のトランザクションが手を出しているRefに触ったらアボート
   →リトライ
   すべてのRefを集めて最後まで行ければゴール→コミット
ClojureのSTM観
       Thread A                              Thread B
                            a
... @a ...
                                    ... (ref-set a ...) ...
... (ref-set b ...) ...
                                b
                                       ... (ref-set b ...) ...
  ... (ref-set c ...) ...       c
   トランザクションは更新するRefを集めていく
   途中で他のトランザクションが手を出しているRefに触ったらアボート
   →リトライ
   すべてのRefを集めて最後まで行ければゴール→コミット


writeが多いとリトライが頻発して性能低下
Under the hood of STM
Version Clock
すべてのトランザクションで共有するクロック

トランザクションの開始やリトライ、コミット
のたびにインクリメントされる

各トランザクションは自分が開始されたときの
クロックの値を記録する

コミット時にはそのときのクロックの値をRefに
記録する
Ref
いわゆるAtomic Object

主に以下で構成されている

 値の履歴をもつリングバッファ

 ref-setしたが未コミットのトランザクション

 Refを参照・更新する際に使われるロック
in-transaction values
トランザクション内でアクセスしたRefとその値
をローカルに記録する

 Refを更新するときはローカルな値を更新する

 Refから値を読み出すとき、

  ローカルな値があればそれを読み出す

  なければ、Refの履歴をたどってトランザ
  クション開始以前の値を読み出す
MVCC
多版型同時実行制御 (Multiversion Concurrency Control)

  トランザクションの実行中、他のトランザクションが既に
  更新した値を読み出すと一貫性がなくなる

  これを防ぐには以下のような方法がある(2つめがMVCC)

     他が更新済みの値を読み出そうとした時点でアボート
     してリトライ

     値の履歴をとっておいて、トランザクション開始時ま
     で って値を読み出す

  1つめの方法はリトライの可能性が高くなる
write skew
      MVCCで起こる現象

      複数のトランザクション間で不変条件を破るような変更が行
      われたときに発生
                        不変条件

                    @a + @b <= 3
        Thread A                     Thread B

(dosync                     (dosync
  (when (<= (+ @a @b) 2)      (when (<= (+ @a @b) 2)
    (ref-set a (inc a))))       (ref-set b (inc b))))
write skew
      MVCCで起こる現象

      複数のトランザクション間で不変条件を破るような変更が行
      われたときに発生
                        不変条件

                    @a + @b <= 3
        Thread A                     Thread B

(dosync                     (dosync
  (when (<= (+ @a @b) 2)      (when (<= (+ @a @b) 2)
    (ref-set a (inc a))))       (ref-set b (inc b))))

AとBで違うRefを変更しているので両者ともコミットに成功する
           コミット後、不変条件は成り立たなくなる
ensure
      write skewの問題は、暗に存在する「コミットする
      まで変更されない」という条件が破られるために発
      生する
      Clojureでは (ensure <ref>) で、それ以降コミットが
      完了するまで<ref>が変更されないことを保証する
        Thread A                     Thread B
(dosync                     (dosync
  (when (<= (+ @a @b) 2)      (when (<= (+ @a @b) 2)
    (ensure b)                  (ensure a)
    (ref-set a (inc a))))       (ref-set b (inc b))))
  ensureしているRefが他方に変更されればリトライ
Contention management
       Thread A                              Thread B
                            a
... @a ...
                                    ... (ref-set a ...) ...
... (ref-set b ...) ...
                                b
                                       ... (ref-set b ...) ...
  ... (ref-set c ...) ...       c
Contention management
       Thread A                              Thread B
                            a
... @a ...
                                    ... (ref-set a ...) ...
... (ref-set b ...) ...
                                b
                                       ... (ref-set b ...) ...
  ... (ref-set c ...) ...       c

 2つのトランザクションが同じRefをつかもうとしたとき、どちら
 を生かし、どちらをアボートするか?
Contention management
       Thread A                              Thread B
                            a
... @a ...
                                    ... (ref-set a ...) ...
... (ref-set b ...) ...
                                b
                                       ... (ref-set b ...) ...
  ... (ref-set c ...) ...       c

 2つのトランザクションが同じRefをつかもうとしたとき、どちら
 を生かし、どちらをアボートするか?

 戦略次第で性能が大きく左右される
Contention managementの戦略
Contention managementの戦略


 Agressive: 相手を殺す
Contention managementの戦略


 Agressive: 相手を殺す

 Polite: 自分が死ぬ
Contention managementの戦略


 Agressive: 相手を殺す

 Polite: 自分が死ぬ

 Karma: あまり仕事をしていない方が死ぬ
Contention managementの戦略


 Agressive: 相手を殺す

 Polite: 自分が死ぬ

 Karma: あまり仕事をしていない方が死ぬ

 Priority: 年功序列。若いやつが死ぬ
Contention managementの戦略


    Agressive: 相手を殺す

    Polite: 自分が死ぬ

    Karma: あまり仕事をしていない方が死ぬ

    Priority: 年功序列。若いやつが死ぬ

ClojureのContention managementはPriority+α
まとめ
ロックを使って同期するのは辛い

STM!STM!

 Clojureなら初心者でもSTM使えます

ただし、writeが多いと性能低下するなど、問題
点もある → 銀の弾丸ではない

しかし、将来的にはGCのように適用範囲は広
がっていくのでは…?
参考文献

M. Herlihy and N. Shavit. “The Art of Multiprocessor Programming,
Revised Reprint.” Morgan Kaufmann Publishers Inc. 2012

M. Fogus and C. Houser, “The Joy of Clojure.” Manning Pubns Co.
2011

Nielsen, Peder RL, and Patrick T. Kristiansen. "Benchmarking
Contention Management Strategies in Clojure’s Software." Artificial
Intelligence 8.3 (1977): 323-364.

R. Mark Volkmann. “Software Transactional Memory.” http://
java.ociweb.com/mark/stm/article.html

Mais conteúdo relacionado

Mais procurados

Project Loom - 限定継続と軽量スレッド -
Project Loom - 限定継続と軽量スレッド - Project Loom - 限定継続と軽量スレッド -
Project Loom - 限定継続と軽量スレッド - Yuichi Sakuraba
 
トランザクションをSerializableにする4つの方法
トランザクションをSerializableにする4つの方法トランザクションをSerializableにする4つの方法
トランザクションをSerializableにする4つの方法Kumazaki Hiroki
 
9/14にリリースされたばかりの新LTS版Java 17、ここ3年間のJavaの変化を知ろう!(Open Source Conference 2021 O...
9/14にリリースされたばかりの新LTS版Java 17、ここ3年間のJavaの変化を知ろう!(Open Source Conference 2021 O...9/14にリリースされたばかりの新LTS版Java 17、ここ3年間のJavaの変化を知ろう!(Open Source Conference 2021 O...
9/14にリリースされたばかりの新LTS版Java 17、ここ3年間のJavaの変化を知ろう!(Open Source Conference 2021 O...NTT DATA Technology & Innovation
 
Redisの特徴と活用方法について
Redisの特徴と活用方法についてRedisの特徴と活用方法について
Redisの特徴と活用方法についてYuji Otani
 
Akkaとは。アクターモデル とは。
Akkaとは。アクターモデル とは。Akkaとは。アクターモデル とは。
Akkaとは。アクターモデル とは。Kenjiro Kubota
 
InnoDBのすゝめ(仮)
InnoDBのすゝめ(仮)InnoDBのすゝめ(仮)
InnoDBのすゝめ(仮)Takanori Sejima
 
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」Takuto Wada
 
テスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるなテスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるなKentaro Matsui
 
OSS についてあれこれ
OSS についてあれこれOSS についてあれこれ
OSS についてあれこれTakuto Wada
 
tcpdumpとtcpreplayとtcprewriteと他。
tcpdumpとtcpreplayとtcprewriteと他。tcpdumpとtcpreplayとtcprewriteと他。
tcpdumpとtcpreplayとtcprewriteと他。(^-^) togakushi
 
ファントム異常を排除する高速なトランザクション処理向けインデックス
ファントム異常を排除する高速なトランザクション処理向けインデックスファントム異常を排除する高速なトランザクション処理向けインデックス
ファントム異常を排除する高速なトランザクション処理向けインデックスSho Nakazono
 
入門core.async
入門core.async入門core.async
入門core.asyncsohta
 
本当は恐ろしい分散システムの話
本当は恐ろしい分散システムの話本当は恐ろしい分散システムの話
本当は恐ろしい分散システムの話Kumazaki Hiroki
 
WebSocketのキホン
WebSocketのキホンWebSocketのキホン
WebSocketのキホンYou_Kinjoh
 
C++の話(本当にあった怖い話)
C++の話(本当にあった怖い話)C++の話(本当にあった怖い話)
C++の話(本当にあった怖い話)Yuki Tamura
 
それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?Yoshitaka Kawashima
 
Go言語のスライスを理解しよう
Go言語のスライスを理解しようGo言語のスライスを理解しよう
Go言語のスライスを理解しようYasutaka Kawamoto
 
Isolation Level について
Isolation Level についてIsolation Level について
Isolation Level についてTakashi Hoshino
 
トランザクションの設計と進化
トランザクションの設計と進化トランザクションの設計と進化
トランザクションの設計と進化Kumazaki Hiroki
 
トランザクションスクリプトのすすめ
トランザクションスクリプトのすすめトランザクションスクリプトのすすめ
トランザクションスクリプトのすすめpospome
 

Mais procurados (20)

Project Loom - 限定継続と軽量スレッド -
Project Loom - 限定継続と軽量スレッド - Project Loom - 限定継続と軽量スレッド -
Project Loom - 限定継続と軽量スレッド -
 
トランザクションをSerializableにする4つの方法
トランザクションをSerializableにする4つの方法トランザクションをSerializableにする4つの方法
トランザクションをSerializableにする4つの方法
 
9/14にリリースされたばかりの新LTS版Java 17、ここ3年間のJavaの変化を知ろう!(Open Source Conference 2021 O...
9/14にリリースされたばかりの新LTS版Java 17、ここ3年間のJavaの変化を知ろう!(Open Source Conference 2021 O...9/14にリリースされたばかりの新LTS版Java 17、ここ3年間のJavaの変化を知ろう!(Open Source Conference 2021 O...
9/14にリリースされたばかりの新LTS版Java 17、ここ3年間のJavaの変化を知ろう!(Open Source Conference 2021 O...
 
Redisの特徴と活用方法について
Redisの特徴と活用方法についてRedisの特徴と活用方法について
Redisの特徴と活用方法について
 
Akkaとは。アクターモデル とは。
Akkaとは。アクターモデル とは。Akkaとは。アクターモデル とは。
Akkaとは。アクターモデル とは。
 
InnoDBのすゝめ(仮)
InnoDBのすゝめ(仮)InnoDBのすゝめ(仮)
InnoDBのすゝめ(仮)
 
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
 
テスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるなテスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるな
 
OSS についてあれこれ
OSS についてあれこれOSS についてあれこれ
OSS についてあれこれ
 
tcpdumpとtcpreplayとtcprewriteと他。
tcpdumpとtcpreplayとtcprewriteと他。tcpdumpとtcpreplayとtcprewriteと他。
tcpdumpとtcpreplayとtcprewriteと他。
 
ファントム異常を排除する高速なトランザクション処理向けインデックス
ファントム異常を排除する高速なトランザクション処理向けインデックスファントム異常を排除する高速なトランザクション処理向けインデックス
ファントム異常を排除する高速なトランザクション処理向けインデックス
 
入門core.async
入門core.async入門core.async
入門core.async
 
本当は恐ろしい分散システムの話
本当は恐ろしい分散システムの話本当は恐ろしい分散システムの話
本当は恐ろしい分散システムの話
 
WebSocketのキホン
WebSocketのキホンWebSocketのキホン
WebSocketのキホン
 
C++の話(本当にあった怖い話)
C++の話(本当にあった怖い話)C++の話(本当にあった怖い話)
C++の話(本当にあった怖い話)
 
それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?
 
Go言語のスライスを理解しよう
Go言語のスライスを理解しようGo言語のスライスを理解しよう
Go言語のスライスを理解しよう
 
Isolation Level について
Isolation Level についてIsolation Level について
Isolation Level について
 
トランザクションの設計と進化
トランザクションの設計と進化トランザクションの設計と進化
トランザクションの設計と進化
 
トランザクションスクリプトのすすめ
トランザクションスクリプトのすすめトランザクションスクリプトのすすめ
トランザクションスクリプトのすすめ
 

Mais de sohta

Clojureシンタックスハイライター開発から考えるこれからのlispに必要なもの
Clojureシンタックスハイライター開発から考えるこれからのlispに必要なものClojureシンタックスハイライター開発から考えるこれからのlispに必要なもの
Clojureシンタックスハイライター開発から考えるこれからのlispに必要なものsohta
 
入門Transducers
入門Transducers入門Transducers
入門Transducerssohta
 
Clojure Language Update (2015)
Clojure Language Update (2015)Clojure Language Update (2015)
Clojure Language Update (2015)sohta
 
入門ClojureScript
入門ClojureScript入門ClojureScript
入門ClojureScriptsohta
 
プログラミング言語Clojureのニャンパスでの活用事例
プログラミング言語Clojureのニャンパスでの活用事例プログラミング言語Clojureのニャンパスでの活用事例
プログラミング言語Clojureのニャンパスでの活用事例sohta
 
REPLライフをもっと快適に
REPLライフをもっと快適にREPLライフをもっと快適に
REPLライフをもっと快適にsohta
 
genuine-highlighter: マクロを認識するClojure向けのシンタックスハイライター
genuine-highlighter: マクロを認識するClojure向けのシンタックスハイライターgenuine-highlighter: マクロを認識するClojure向けのシンタックスハイライター
genuine-highlighter: マクロを認識するClojure向けのシンタックスハイライターsohta
 
Macros in Clojure
Macros in ClojureMacros in Clojure
Macros in Clojuresohta
 
Clojureによるバイトコードプログラミング
ClojureによるバイトコードプログラミングClojureによるバイトコードプログラミング
Clojureによるバイトコードプログラミングsohta
 

Mais de sohta (9)

Clojureシンタックスハイライター開発から考えるこれからのlispに必要なもの
Clojureシンタックスハイライター開発から考えるこれからのlispに必要なものClojureシンタックスハイライター開発から考えるこれからのlispに必要なもの
Clojureシンタックスハイライター開発から考えるこれからのlispに必要なもの
 
入門Transducers
入門Transducers入門Transducers
入門Transducers
 
Clojure Language Update (2015)
Clojure Language Update (2015)Clojure Language Update (2015)
Clojure Language Update (2015)
 
入門ClojureScript
入門ClojureScript入門ClojureScript
入門ClojureScript
 
プログラミング言語Clojureのニャンパスでの活用事例
プログラミング言語Clojureのニャンパスでの活用事例プログラミング言語Clojureのニャンパスでの活用事例
プログラミング言語Clojureのニャンパスでの活用事例
 
REPLライフをもっと快適に
REPLライフをもっと快適にREPLライフをもっと快適に
REPLライフをもっと快適に
 
genuine-highlighter: マクロを認識するClojure向けのシンタックスハイライター
genuine-highlighter: マクロを認識するClojure向けのシンタックスハイライターgenuine-highlighter: マクロを認識するClojure向けのシンタックスハイライター
genuine-highlighter: マクロを認識するClojure向けのシンタックスハイライター
 
Macros in Clojure
Macros in ClojureMacros in Clojure
Macros in Clojure
 
Clojureによるバイトコードプログラミング
ClojureによるバイトコードプログラミングClojureによるバイトコードプログラミング
Clojureによるバイトコードプログラミング
 

Último

自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineerYuki Kikuchi
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...博三 太田
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfFumieNakayama
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)UEHARA, Tetsutaro
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)Hiroshi Tomioka
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfFumieNakayama
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?akihisamiyanaga1
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NTT DATA Technology & Innovation
 

Último (8)

自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 

ClojureではじめるSTM入門