【激突】関数型言語 VS オブジェクト指向言語2
■ このスレッドは過去ログ倉庫に格納されています
0001営利利用に関するLR審議中@詳細は自治スレへ
2012/04/07(土) 21:26:47.61一部には関数型言語を崇拝している人もいます
どちらが上なのか、この際はっきりさせましょう
前スレ http://toro.2ch.net/test/read.cgi/tech/1331328955/
0752デフォルトの名無しさん
2012/05/13(日) 18:30:14.35奇特な人が居るから質問するんだけど、
あのIDEモドキを立ち上げずにプログラム実行する方法無いの?
それと動的型付けで実行が遅いから、せめてボトルネックだけでも
C/C++で書いて実行できないとトイプログラムでしか
使いモノにならないと思うけど、簡単にC/C++のライブラリとリンクできるの?
0753デフォルトの名無しさん
2012/05/13(日) 19:25:11.00headlessといって、サーバーなどの用途に使う目的でIDE抜きで起動したり、
その際に指定した.stファイルを読み込んだり実行できる機能があります。
またGNU Smalltalkのように、標準入出力から使うことに特化して開発された
特殊な処理系もあるのでこういう処理系を最初から選ぶのもよいでしょう。
ただIDE抜きの使い方は他の言語と同様の使い方ができるというメリットがあると反面、
Smalltalkの独自の機能や優位性をかなりスポイルする使い方ということにもなるので
他の言語が選択できる状況であるならば、よほどSmalltalkを使い慣れた人でもなければ
そこまでしてSmalltalkを使うメリットはあまりないような気もします。
GNU SmalltalkやAmber Smalltalkといった特殊なSmalltalk処理系を使っての
Smalltalk入門があまり推奨されないのも同様の理由です。
SmalltalkからC/C++で書いた関数をコールするにはいくつか方法がありますが、
たとえば、商用のSmalltalkであるVisualWorksにはDLL and C Connectという方法が使えます。
http://www.cincomsmalltalk.com/pdf/DLLandCConnectGuide.pdf
PharoやSqueakではVMプラグインを書いてバイトコードを拡張したり、FFIが使えます。
http://wiki.squeak.org/squeak/1448
http://wiki.squeak.org/squeak/1414
0754デフォルトの名無しさん
2012/05/13(日) 19:48:37.96なぜかOOの話がでてますが関数型の話でOOは関係ありません。
OOPLでも同じ表現ができるというだけです。
で、本題ですが、最終的な目的としては下のようなラムダ演算ができる言語は
存在しないのかという話です。
( 0 (lambda () "true" ) ) 0関数はlambdaを評価せず、nilを返す
( 1 (lambda () "true" ) ) 1関数はlambdaを評価し"true"を返す
( 2 (lambda () "true" ) ) 1関数はlambdaを評価し"true"を返す
( (- 1 1 ) (lambda () "true" ) ) 0関数を評価する事になるのでlambda
0755727
2012/05/13(日) 19:54:33.33( 0 (lambda () "true" ) ) 0関数はlambdaを評価せず、nilを返す
( 1 (lambda () "true" ) ) 1関数はlambdaを評価し"true"を返す
( 2 (lambda () "true" ) ) 1関数はlambdaを評価し"true"を返す
( (- 1 1 ) (lambda () "true" ) ) 0関数を評価する事になるのでlambdaを評価しない
( (+ 1 1 ) (lambda () "true" ) ) 2関数を評価する事になるのでlambdaを評価しない
数値を関数化できないかというのは、数値を評価したとき、このような
振る舞いをするように数値を定義できなる言語は無いかという事でした。
尤も、言語レベルで最初から数値をチャーチ数と同じように評価できるなら
新たに関数として数値を再定義できる必要は無いんですが。
0756デフォルトの名無しさん
2012/05/13(日) 20:00:39.51時代遅れってアホか、通信・製造・金融・保険・政府。
お前がしらんだけで第一線で新規開発されとるわ。
国内企業なら、東洋ビジネスエンジニアリングとかが導入してんだぞ。
0757デフォルトの名無しさん
2012/05/13(日) 20:17:42.17拡張メソッド定義してるだけなので、実質「Execute(0, fun () -> printnf "zero")」と同じ
type System.Int32 with
member x.Execute func = match x with 0 -> () | n -> func()
> (0).Execute (fun () -> printfn "zero");;
val it : unit = ()
> (1).Execute (fun () -> printfn "one");;
one
val it : unit = ()
> (1 - 1).Execute (fun () -> printfn "zero");;
val it : unit = ()
0758デフォルトの名無しさん
2012/05/13(日) 20:19:29.56Integer と () -> Bool は違う型なので、
同じ数値(関数)の型が文脈に応じて変化する言語でなければ不可能。
0759727
2012/05/13(日) 20:19:44.31( 0 (lambda () "true" ) ) 0関数はlambdaを評価せず、nilを返す
( 1 (lambda () "true" ) ) 1関数はlambdaを評価し"true"を返す
( 2 (lambda () "true" ) ) 2関数はlambdaを評価し"true"を返す
( (- 1 1 ) (lambda () "true" ) ) 0関数を評価する事になるのでlambdaを評価しない
( (+ 1 1 ) (lambda () "true" ) ) 2関数を評価する事になるのでlambdaを評価する
0760デフォルトの名無しさん
2012/05/13(日) 20:20:46.22できる言語はあるかと聞いているのですが?
あとboolは関係ないですよね
0761デフォルトの名無しさん
2012/05/13(日) 20:24:09.03じゃあ Integer と (() -> a) -> a
それはともかく、関数型とか全然関係なくって
まともな静的型なら無理って言ってるんだけど、
動的型しか使った事無い馬鹿には分からないかな?
0762デフォルトの名無しさん
2012/05/13(日) 20:25:17.06だから、できない言語の事は聞いてなくて、出来る言語はあるかと聞いてるんですけど。
0763デフォルトの名無しさん
2012/05/13(日) 20:29:16.10スレ違いだし問題としても糞詰まらんから
どっか行けって言ってんだけど?
0764デフォルトの名無しさん
2012/05/13(日) 20:29:54.03nilと値じゃなくてoption型使ってるけど
type System.Int32 with
member x.Execute func = match x with 0 -> None | n -> func() |> Some
> (0).Execute (fun () -> "zero");;
val it : string option = None
> (1).Execute (fun () -> "one");;
val it : string option = Some "one"
> (1 - 1).Execute (fun () -> 1 - 1);;
val it : int option = None
0765デフォルトの名無しさん
2012/05/13(日) 20:32:20.89NGにしたいんでトリでも付けてもらえます?
スレ違い以前に話が通じないので
0766デフォルトの名無しさん
2012/05/13(日) 20:42:57.75まず日本語の通じないお前がどっか行けよ
0767デフォルトの名無しさん
2012/05/13(日) 20:44:48.51オブジェクトで出来てもあんまり嬉しくないんですが・・・
0768デフォルトの名無しさん
2012/05/13(日) 20:46:00.83型付けの問題だって理解できない自分の低能さを
日本語の問題にすり替えるなよw
0769デフォルトの名無しさん
2012/05/13(日) 20:52:46.02「コンセントの付いている車はありますか?」
「軽トラなら無理です」
お前が言ってるのはこういう事だという自覚は有るのか?
普通は「あります」「ありません」この2択だろ
頭おかしいな
0770デフォルトの名無しさん
2012/05/13(日) 20:53:58.75Int32はラッパークラスとかではなく、プリミティブかつオブジェクトなんだけど。
まぁそれでもダメというならどうしようもない。
0771デフォルトの名無しさん
2012/05/13(日) 20:55:35.08これアリなら難しくも何ともないじゃん
(|.) 0 _ = Nothing
(|.) x f = Just $ f ()
main = do
print $ 0 |. (\_ -> "zero")
print $ 1 |. (\_ -> "one")
print $ (1 - 1) |. (\_ -> "zero")
print $ (1 + 1) |. (\_ -> "two")
0772デフォルトの名無しさん
2012/05/13(日) 20:57:08.31すいません。
関数と互換性をもってて欲しいんですよ。
0773デフォルトの名無しさん
2012/05/13(日) 21:06:51.99てっきり拡張メソッド的なものを要求してるのかと思ってた。
Scalaなら暗黙型変換あるからできそうな気がする。
0774デフォルトの名無しさん
2012/05/13(日) 21:08:02.77なるほど。Scalaですか、調べてみます。
0775デフォルトの名無しさん
2012/05/13(日) 22:46:41.690776デフォルトの名無しさん
2012/05/14(月) 00:37:38.04可読性皆無のコード書く御題で
型付けの弱さを競うスレはここですか?
時代に逆行してて笑えるwww
0777デフォルトの名無しさん
2012/05/14(月) 01:46:05.41何か前提がおかしいんだろうね。
元々何がしたかったのか聞ければよいんだけど、
彼にそういった振る舞いが出来るとも思えないしなぁ。
0778デフォルトの名無しさん
2012/05/14(月) 07:07:11.76オブジェクトとしてなら「出来ている」認定してるっぽい処だな。
0779デフォルトの名無しさん
2012/05/14(月) 07:40:52.01別に不思議でもなんでもない
もちろん出題者は底なしのアホだけど
0780デフォルトの名無しさん
2012/05/14(月) 17:54:42.36等確率N種類のカードをコンプするのに必要なガチャ回数のM回試行時の頻度分布から、
最小および最大のガチャ回数と最多頻度のガチャ回数を抽出して出力するコードを書き、
N=10、M=1000000のときの結果とその算出にかかった時間を示せ。
遅い処理系ではMを減らした際の結果を示しても構わないがその旨を明記すること。
0781デフォルトの名無しさん
2012/05/14(月) 18:47:07.65関数型 VS 手続き型 って感じになりそう
0782デフォルトの名無しさん
2012/05/14(月) 19:41:29.94最低 10ガチャ、最高 156ガチャ、頻度最多は 23ガチャで 45475回出現。
1.8GHz Core i7 で 66秒程度。(CogVM 使用)
| N M histo cards time |
N := 10.
M := 1000000.
histo := Bag new.
cards := 1 to: N.
time := [
M timesRepeat: [
| player |
player := Bag new.
[player add: cards atRandom; includesAllOf: cards] whileFalse.
histo add: player size]
] timeToRun.
^{time. histo min. histo max. histo sortedCounts first} "=> {66128 . 10 . 156 . 45475->23} "
0783デフォルトの名無しさん
2012/05/14(月) 19:54:50.29これで、できてると言ってる訳ではなくて、
数値を関数化してラムダ演算をするのが目的であって
オブジェクトで雰囲気が近いことできても仕方ない
という事を書いたつもりです。
最終的な目標は>>759の様な(欲を言えばチャーチ数)演算が
できる言語を見つける事です。
>>775
よく知らないので、調べてる最中ですよ。
0784デフォルトの名無しさん
2012/05/14(月) 20:17:53.30型無しラムダな処理系なら、学生演習レベルのものならいくらでもあるだろ。
0785デフォルトの名無しさん
2012/05/14(月) 21:01:05.790786デフォルトの名無しさん
2012/05/14(月) 21:07:37.59存在すればどちらでも構いません。
ただし誤解されてるかもしれませんが、
チャーチ数というのは、f x.x を直に表現できて
欲しいと思ってる訳ではなく。0なら f x.xと同じ振る舞いを
して欲しいという話で、今までの話とは大きく違いません。
チャーチ数と今までの話は、2以上の時、1回関数が評価されるのか、
2回評価されるのか程度の違いの意味で書いてます。
0787デフォルトの名無しさん
2012/05/14(月) 21:14:35.72×2回評価されるのか
○その数だけ評価されるのか
0788デフォルトの名無しさん
2012/05/14(月) 21:50:45.36再起でよいんじゃないの?
0789デフォルトの名無しさん
2012/05/14(月) 22:49:56.49型なしラムダ計算でやりたいことがかける?
もしそうならLazy Kやunlambdaを使えばできるな。
0790デフォルトの名無しさん
2012/05/15(火) 00:51:10.23関数名が数値型だったら特別扱いすりゃいいだけだろ
0791デフォルトの名無しさん
2012/05/15(火) 08:00:22.83変数名が値だったらって何か変だぞ
変数は単に置き換えるのが目的であって
置き換えた後にどのような演算が出来るかというと、確かに何でも出来ると思う
しかしLispは要らない
0792デフォルトの名無しさん
2012/05/15(火) 10:10:16.800793デフォルトの名無しさん
2012/05/15(火) 10:31:41.96変数zを(\ f x -> x)に置き換えることはできる
なら定数を使わない言語を考えるのが普通で
定数の定義を書きかえるのは変だ
0794デフォルトの名無しさん
2012/05/15(火) 14:05:34.62いずれにしろ、リテラルの意味を再定義できる言語、というのは珍しいが、無いわけじゃない。
Forthなんかモード切り替えで、"100" というワードが 10 進にも 16 進にも解釈される、
っていう仕様だったと思ったし。
0795デフォルトの名無しさん
2012/05/15(火) 16:30:18.62>( 0 (lambda () "true" ) ) 0関数はlambdaを評価せず、nilを返す
>( 1 (lambda () "true" ) ) 1関数はlambdaを評価し"true"を返す
>( 2 (lambda () "true" ) ) 2関数はlambdaを評価し"true"を返す
>( (- 1 1 ) (lambda () "true" ) ) 0関数を評価する事になるのでlambdaを評価しない
>( (+ 1 1 ) (lambda () "true" ) ) 2関数を評価する事になるのでlambdaを評価する
こう言ってるから、処理系の持ってる整数型はそのまま使いたいんだろうと思う。
その上で、整数値を関数としても定義したいと。
良く分からないのは、整数値を関数で定義せず、
引数で渡せばよさそうなものなのに、なぜそうしないかだな。
0796795
2012/05/15(火) 16:41:00.21単純に整数をfunctorにしたいんだろう。
分からないのは、普通ならパラメータで渡せば直ぐ済むのに、
なぜそうしないかだとおもう。
その辺の説明が何も無いから、誰も答えられないんだと思う。
0797デフォルトの名無しさん
2012/05/15(火) 18:43:21.09http://ideone.com/0LiFz
0798デフォルトの名無しさん
2012/05/15(火) 18:49:15.951.6GHz Core i5 で 3.5秒 (GHC 7.0.4)
最小10, 最大162, 最多頻度23(45003回)
import Control.Applicative
import Data.Ord
import Data.List
import Data.HashTable as H
import System.Random.Mersenne
cardNum = 10
iterateNum = 1000000
count n = (+ n) . sum . map (length . f) . zip [1..n-1]
where f (x,p) = let q = fromIntegral x / fromIntegral n
in takeWhile (< p) $ iterate (\x -> x + (1-x) * q) q
0799798
2012/05/15(火) 18:50:05.32main = do
ht <- new (==) hashInt :: IO (HashTable Int Int)
gen <- newMTGen Nothing
mapM_ (trial ht gen) [1..iterateNum]
xs <- sort <$> H.toList ht
print $ (fst $ head xs, fst $ last xs, maximumBy (comparing snd) xs)
where
trial ht gen _ = do n <- count cardNum <$> (randoms gen :: IO [Double])
incr ht n =<< H.lookup ht n
incr ht k Nothing = H.insert ht k 1
incr ht k (Just v) = H.update ht k (v + 1) >> return ()
0800デフォルトの名無しさん
2012/05/15(火) 20:22:09.35R
N = 10
M = 100000 (!= 1000000)
Intel(R) Atom(TM) CPU N455 @ 1.66GHzで、
user system elapsed
180.467 0.084 180.719
最小 10、最大 130、最頻値は4548回の23。
gacha <- function(N, M) {
print(system.time(t <- table(sapply(1:M, function(x) {
count <- 0
card <- logical(length=N)
while(!all(card)) {
count <- count + 1
card[sample(N, size=1)] <- T
}
count
}))))
print(t[1])
print(t[length(t)])
print(t[which.max(t)])
}
0801デフォルトの名無しさん
2012/05/15(火) 23:05:25.41JavaScriptで多分ベタなOOP
Core2Duo(3.16GHz) Node.js(Windows)で
試行回数=1000000 所要時間=1398msec 最小=10 最大=144 平均=29 最頻=23(44951回)
ソース(※こっちは10000回)
http://ideone.com/DkeKE
0802デフォルトの名無しさん
2012/05/15(火) 23:14:59.88コードそのものよりもNode.jsがspidermonkeyより
44倍も速いのが興味深い
0803デフォルトの名無しさん
2012/05/15(火) 23:30:56.130804デフォルトの名無しさん
2012/05/15(火) 23:32:18.16各処理系の乱数の質の差が反映されているのか。
0805デフォルトの名無しさん
2012/05/15(火) 23:52:23.55さすがに速い
http://ideone.com/WPpbW
同じプログラムでも試行ごとに最大値はばらつくみたいね
0806デフォルトの名無しさん
2012/05/16(水) 00:08:03.51せめて void gacha(int n, int m, RESULT *r); くらいにロジック分離しようぜ。
0807デフォルトの名無しさん
2012/05/16(水) 12:23:32.14しかもx86,x64,ARMに特化されたかなり先進的なJITだしね。
0808デフォルトの名無しさん
2012/05/16(水) 13:57:24.59結局Scalaで望みのことが出来たの?
それとも、実はSmalltalk辺りのOOPLで
やりたいことは既に出来てて、あとは
「関数型言語で出来ないことがOOPLで出来る!OOPサイコー!!」
って言い出すタイミングをはかってるの?
0809デフォルトの名無しさん
2012/05/17(木) 16:49:24.16せめてこういうスレのトイプログラムの御題でくらいは
存在感を出さないとね。
0810デフォルトの名無しさん
2012/05/17(木) 16:53:53.950811デフォルトの名無しさん
2012/05/17(木) 19:18:25.65Intに限らず任意の型で同じことが言えるのでチャーチ数は関係ない
0812デフォルトの名無しさん
2012/05/17(木) 19:53:36.50加算や減算ができるなら
チャーチ数で無くても文句無いんだろう、多分
ただし>>797のプログラムはチャーチ数でないと
加算減算が出来ないから成立しない
0813デフォルトの名無しさん
2012/05/17(木) 20:37:57.990814デフォルトの名無しさん
2012/05/18(金) 00:44:10.29静的言語は一貫していない
0815デフォルトの名無しさん
2012/05/18(金) 01:54:17.00それぞれで代表一つ以外は全て潰し
最後に決定戦とすべき
0816デフォルトの名無しさん
2012/05/18(金) 07:15:42.96スレが幾つ在っても足りんだろ
0817デフォルトの名無しさん
2012/05/18(金) 07:52:12.43評判の良いやつだけで潰しあえ
0818デフォルトの名無しさん
2012/05/18(金) 07:55:27.260819デフォルトの名無しさん
2012/05/18(金) 08:10:51.950820デフォルトの名無しさん
2012/05/18(金) 21:20:26.37判定する関数を書くのに苦労してた。
短く書けるとウワサのScalaですらそのレベルなんて、
静的型付け言語はダメダメだなぁ。
0821デフォルトの名無しさん
2012/05/18(金) 21:56:20.82def sorted[T:Ordering](xs:List[T]) : Boolean =
xs match { case x::y::zs => implicitly[Ordering[T]].lt(x, y) && sorted(y::zs); case _ => true }
型指定は面倒だね。
暗黙の型変換を定義すればもう少し簡潔になるかも。
0822デフォルトの名無しさん
2012/05/18(金) 22:32:39.960823デフォルトの名無しさん
2012/05/18(金) 22:38:39.58def sorted[T](xs:List[T], f:(T,T)=>Int) : Boolean =
xs match { case x::y::zs => f(x, y) >= 0 && sorted(y::zs); case _ => true }
0824デフォルトの名無しさん
2012/05/18(金) 22:44:02.030825デフォルトの名無しさん
2012/05/18(金) 22:52:26.14二分探索を使う前とかに調べるじゃん
0826デフォルトの名無しさん
2012/05/18(金) 22:53:00.87それなら十分許容範囲だね。
0827デフォルトの名無しさん
2012/05/18(金) 22:55:38.83引数と返り値の型は推論してくれないんだっけ?
0828デフォルトの名無しさん
2012/05/18(金) 22:56:20.290829デフォルトの名無しさん
2012/05/18(金) 23:33:06.68ソートしとけよ
してないなら、まずソートしろ
0830デフォルトの名無しさん
2012/05/18(金) 23:37:28.63同じ計算量だと思ってる男の人って...
0831デフォルトの名無しさん
2012/05/18(金) 23:57:52.40静的型チェックのメリットと釣り合わない
0832デフォルトの名無しさん
2012/05/19(土) 00:44:54.270833デフォルトの名無しさん
2012/05/19(土) 01:06:57.97釣り合う物を取り返そうとしたら保険の意味がなくなる
0834デフォルトの名無しさん
2012/05/19(土) 01:10:31.94ソートされてるかどうかわからない
なんてことになる設計がダメだしされてるんだろ
0835デフォルトの名無しさん
2012/05/19(土) 01:27:57.13オブジェクト指向で静的型のJavaですよー
public static<T extends Comparable<? super T>> boolean sorted(List<T> xs) {
for (int i = 1; i < xs.size(); i++) {
if (xs.get(i-1).compareTo(xs.get(i)) > 0) return false;
}
return true;
}
0836デフォルトの名無しさん
2012/05/19(土) 03:31:46.880837デフォルトの名無しさん
2012/05/19(土) 04:29:01.17SequenceableCollection >> isSorted
self overlappingPairsDo: [:a :b | a <= b ifFalse: [^false]]. ^true
0838デフォルトの名無しさん
2012/05/19(土) 07:54:30.96全ての隣り合う組を比較するようなダメコードを書くダメプログラマは
まさかこのスレには居ないよね?
0839デフォルトの名無しさん
2012/05/19(土) 09:09:24.99コードの長さはあまり関係なくないか?
考えた処理をサクサクとコード化できるか、だと思う
0840デフォルトの名無しさん
2012/05/19(土) 10:06:00.60>>833
保険というか、コンパイラに一部の整合性のチェックを任せられるので
作業量増加と引き換えに、開発者が気を使う要素が減る
トレードオフで負担を変化させる
[作業量が減る][気を使う要素が減る]どちらの開発効率が良いかは
ケースバイケースだと思うが
0841デフォルトの名無しさん
2012/05/19(土) 10:58:17.400842デフォルトの名無しさん
2012/05/19(土) 15:29:10.77もしかしてHaskellについて言ってるなら、遅延評価だから途中で止まる
無限リストで試せば分かる
Prelude> isSorted [1,0..]
False
0843デフォルトの名無しさん
2012/05/20(日) 09:55:31.76もしかしてSmalltalkについて言ってるなら、どうせ遅過ぎてウンコだから
そんなところ気にしても仕方ない
メッセージング(笑)
0844デフォルトの名無しさん
2012/05/20(日) 13:40:56.75Smalltalkerかアラン・ケイになんか嫌なことでもされたか?
0845デフォルトの名無しさん
2012/05/20(日) 13:47:01.48なんで使うことってあまりないんだろうね。
0846デフォルトの名無しさん
2012/05/20(日) 14:11:04.260847デフォルトの名無しさん
2012/05/20(日) 14:15:09.70「N種類のカードをアトランダムにコンプするまで引く作業をM回繰り返して集計」
ってただそれだけのことをSmalltalkみたいにそのまんまに書き下すことも可能なのかな。
HaskellにもMultiSet(SmalltalkでいうところのBag)とかあるよね?
0848デフォルトの名無しさん
2012/05/20(日) 14:18:36.97内部で勝手に遅延評価してるってだけだから
そんな言語の話をしたってしょうがない。
遅延評価をしたい場面が無いって話をしてる。
0849デフォルトの名無しさん
2012/05/20(日) 14:34:00.38あ?政府から海運業、通信、保険、金融、音響。
お前がしらんだけで実際いろんな所で使われとるわ。
英語が読めん奴が覆いから日本人の開発者が少ないだけ。
0850デフォルトの名無しさん
2012/05/20(日) 14:34:50.90こういうイデオムはgetterのあるオブジェクト指向プログラミングだとよくある。
getterがないと値参照から関数呼び出しを引き起こせないので、
単に関数呼び出しをすることになってしまう。
ただしそのような場合でも遅延評価イデオムと呼ぶ場合もある。
例えば上に出たamotized sortは挿入時にやるべき並び替えを最後までやらずに、
細かい部分はサボって後回しにして、後でまとめてやっている。
こういうのは遅延実行の一種。
0851デフォルトの名無しさん
2012/05/20(日) 14:42:50.92Smalltalkという実行環境が現存してると思ってんだろ
うんで「Smalltalkでググっても見つからないよー」とw
Linuxと同じように純粋なSmalltalkは存在しないのにな。
0852デフォルトの名無しさん
2012/05/20(日) 14:45:54.09よしわかった。
具体t系な実行環境を言ってくれ。
それに対して、使われているかいないか
判断することにしよう。
■ このスレッドは過去ログ倉庫に格納されています