【C++】template 統合スレ -- STL/Boost/Loki, etc.
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
NGNG以下のスレッドを統合するスレです。
STLスレッド
Part1 http://pc.2ch.net/tech/kako/1004/10042/1004287394.html
Part2 http://pc3.2ch.net/test/read.cgi/tech/1026793823/
【C++】Boost使い集まれ!
http://pc3.2ch.net/test/read.cgi/tech/1033830935/
Generic Programming with C++ Template
http://pc.2ch.net/tech/kako/1008/10085/1008593126.html
関連スレ、その他リンクは >>2-5 あたりに。
0757デフォルトの名無しさん
NGNG> 2つの型が同じかどうか判定することってできるでしょうか
boostの、<boost/type_traits.hpp>をインクルードして、
boost::is_same<T, U>::value
でいけるようだが、中身を見ても何をしているのか解らなかった・・・。
0758729
NGNG結局、色々やるには自分で作った方がいいという結論になったのですが、
上記の物は参考にはなりました。
ありがとうございました。
//構造的にはこんな感じ
template <typename _Elem> class tree
{
tree *parent;
list<tree*> m_child;
_Elem m_element;
};
0759デフォルトの名無しさん
NGNGホントにキタ━━━━━━(゚∀゚)━━━━━━ !!!!!
0760デフォルトの名無しさん
NGNGスレ違いかもしれんけど、いい知恵を貸してください。
COMなんかで使用する BSTR は ATLインターナル等を読む限り、
「長さをプレフィックスとするOLECHAR型の文字列」だそうです。
~~~~~~~~~~~~~~~~~~~~~~~~~~
で、これを std::basic_string で表現したいと思い、
char_traits をいじり始めたのですが、
「長さをプレフィックスとする」の部分で躓きました。
このような長さを先頭にもつ文字列を basic_string で表現する
うまい手段があったら教えてください。
0761デフォルトの名無しさん
NGNGbasic_stringで表現するより、
別のクラスにしてbasic_stringと相互?変換できるようにするほうが楽じゃないの?
0762デフォルトの名無しさん
NGNG0763デフォルトの名無しさん
NGNGそれとももっと適した板があるなら教えてくだたい
0764デフォルトの名無しさん
NGNGシェルスクリプトならUNIX板とかLinux板とかでないかね
0765デフォルトの名無しさん
NGNGどっちみち、一般のヒープ管理関数じゃなくてSysAllocStringで確保しなきゃいけないわけだし、
プレフィックス部分はポイントされている番地より「前」に存在するわけだし、
いじるならchar_traitsじゃなくてallocatorのほうではないか。
char_traitsはそのままstd::char_traits<wchar_t>でいい気がする。
0766デフォルトの名無しさん
NGNG(const char* __s, ios_base::openmode __mod = ios_base::in)
ファイル名が、なぜ wchar_t でなく char なのでしょうか?
0767デフォルトの名無しさん
NGNG#include <iostream>
#include <memory>
class A
{
public:
void Print(void){ std::cout << "OK" << std::endl; }
};
int main()
{
std::auto_ptr< A > ptr( new A() );
void (A::*method)(void) = A::Print;
(ptr->*method)(); // ここや
return 0;
}
0768デフォルトの名無しさん
NGNG探すことにならんか?
0769デフォルトの名無しさん
NGNGptrはA型へのポインタだから、当然Aの中にmethodというメンバ
がないとエラーになる。
struct A {
int i;
}
std::auto_ptr<A> ptr(new A);
int j;
ptr->j;
としているのと極端に言えば同じ。
0770デフォルトの名無しさん
NGNG0771デフォルトの名無しさん
NGNG(a->*method)();
としたら通るね。ということは、std::auto_ptrの->演算子の多重定義
の問題なのだろう。
->の先がメンバー関数へのポインタだった場合、正常に解釈して
くれないのでは。
0772766
NGNG0773デフォルトの名無しさん
NGNGにしれ
0774デフォルトの名無しさん
NGNGauto_ptr<> には operator->* というメンバ関数はないので
どのコンパイラでも無理だ。
0775デフォルトの名無しさん
NGNG((*ptr).*method)() が通るという事は、.*は定義されているのかな。
0776デフォルトの名無しさん
NGNG(*ptr)の時点で A* になってる
0777デフォルトの名無しさん
NGNG0778デフォルトの名無しさん
NGNGなるほどよく理解できました。
そしたら、((*ptr.get()).*method)();が通る理由も理解できます。
0779767
NGNG神
ってゆーかその手に気付かなかった自分が恥ずかしいよ。
->が定義されてるなら->*も自動だと思ったんだけどそうじゃなかったんだな。
ためしに->*を定義してみたらなかなか面白いことになったけどいまいち使いどころがわかんね。
0780デフォルトの名無しさん
NGNG0781デフォルトの名無しさん
NGNGできるよ。
0782デフォルトの名無しさん
NGNG->*が定義できるのだから、今度の新しい標準C++はstd::auto_ptrにも
定義して欲しいものだ。
0783デフォルトの名無しさん
NGNG作ろうと思ったら、boost::bind 完全再生産、くらいのレベルで大変なんだけど、
なんであんな規格なんだろう。
0784デフォルトの名無しさん
NGNG. .* :: ?: sizeof # ##
で全部?
0785デフォルトの名無しさん
NGNG->が返すのは生ポインタだよね。
0786デフォルトの名無しさん
NGNGtypeid
0787デフォルトの名無しさん
NGNGこんな感じかと
#include <iostream>
#include <functional>
class A
{
public:
int b;
void hoge( int v ){ std::cout << b << v << std::endl; }
public:
template< typename type >
type& operator ->*( type A::*p ){ return this->*p; }
template< typename type >
std::binder1st< std::mem_fun1_t< type, A, int > >
operator ->*( type (A::*p)( int ) ){ return std::bind1st( std::mem_fun1( p ), this ); }
};
int main()
{
A a;
int A::* pb = &A::b;
a->*pb = 10;
void (A::*phoge)( int ) = A::hoge;
(a->*phoge)( 20 );
}
0788デフォルトの名無しさん
NGNGthrow 演算子もできないような気もするが……できるならサンプルプリーズ
0790デフォルトの名無しさん
NGNG凄すぎ。このコードを理解するように努めてみます。
0791784
NGNG忘れてました。ども。
そういえば、std::XXX_cast<> 達はキャスト「演算子」なのですかね。
だとしたらオーバーロードできない、でいいと思うけど。
>>788
手元のプログラミング言語C++ 第2版では、throw は演算子じゃなくて式(の一部)のようです。
第3版がほすぃ・・・。
0792デフォルトの名無しさん
NGNGこの使用は抑止した方がいいのでしょうか?
#include<list>
#include<iostream>
#include<string>
#include<vector>
using namespace std;
int main()
{
list< vector<string> > a,a2;
vector<string > s,s2;
s.push_back("111");
s2.push_back("222");
a.push_back(s);
a2.push_back(s2);
a.erase(a2.begin()); //aのeraseでa2の反復子を削除する。
//list<T>::eraseのソースをみると
//_Mysize--;となっているが、
//_Mysize=size();としないと矛盾しないか?(debbugerのsizeも0,1になってる)
cout << "a size:" << (*(a.begin())).size() << std::endl;
cout << "a2 size:" << (*(a2.begin())).size() << std::endl;//a2の要素は削除されてる
//これはbegin()とend()から計算してるから大丈夫。
cout << "*a.begin():" << *(*(a.begin())).begin() << std::endl;//111
}
0793デフォルトの名無しさん
NGNG実装的にその方が楽なんよ。
STLは計算効率至上主義だからそういう風になってるんだと思われ。
ほんとはそういうまねは出来ない方がいい。
0794792
NGNGちと勘違いしてたんで、修正した。
サイズ等の状態数を管理するのって危険が伴うのにそれを完全に排除してない
方が悪い気がするんだけど。
//上と同じ
int main()
{
list< vector<string> > a,a2;
vector<string > s,s2;
s.push_back("111");
s2.push_back("222");
a.push_back(s);
a2.push_back(s2);
a.erase(a2.begin()); //aのeraseでa2の反復子を削除する。
cout << "aのeraseでa2の先頭の反復子を削除する" << std::endl;
cout << "a.size() :" << a.size() << std::endl; // VC 0 ,GCC 1
cout << "a2.size():" << a2.size() << std::endl; // VC 1 ,GCC 0
cout << "(*a::begin()).size()) :" << (*(a.begin())).size() << std::endl; // VC 1 ,GCC 0
cout << "(*a2::begin()).size()):" << (*(a2.begin())).size() << std::endl; // VC 1 ,GCC 0
cout << "*(*(a.begin())).begin() :" << *(*(a.begin())).begin() << std::endl;//111
//cout << "*(*(a2.begin())).begin():" << *(*(a2.begin())).begin() << std::endl;//
}
0795794
NGNGよくみたらミスってました...。
cout << "(*a::begin()).size()) :" << (*(a.begin())).size() << std::endl; // VC 1 ,GCC 1
cout << "(*a2::begin()).size()):" << (*(a2.begin())).size() << std::endl; // VC 0 ,GCC 0
であってると思います。
0796デフォルトの名無しさん
NGNGSequence::erase の Precondition を破っているので、
未定義動作でしょうがないと思われ。
0797デフォルトの名無しさん
NGNGICU使いたいんですけど
STLportのスタティックライブラリにする必要あります?
経験者の方教えてください。
0798794
NGNG同じ型のコンテナ内の反復子を矛盾なく削除できる関数として
機能したほうがいいと思うんだけど。
その代わり、多少パフォーマンスは下がってしまうか。
コンテナが反復子の状態数を保存してるときは
反復子を操作(削除)するときに
管理しているコンテナに通知して処理するほうが望ましい結果が得られる。
0799デフォルトの名無しさん
NGNGあったら教えてください。
0800デフォルトの名無しさん
NGNGhttp://user.ecc.u-tokyo.ac.jp/~g940455/wp/boost/index.html
http://www.emaki.minidns.net/Programming/tools/Boost/
http://www.kmonos.net/alang/boost/
0801デフォルトの名無しさん
NGNGttp://www.kmonos.net/alang/boost/
0802デフォルトの名無しさん
NGNGiteratorは基本的に自分が属するContainerがどれであるかを知らないし、
Containerは基本的に自分の上のiteratorがどこかに存在しているかどうかを
知らないし、
algorithmは自分が操作する対象がどんなsequenceであるかを知らない…
という形にすることで可能な限り一般性を高める、というのが
STLの方向性だと思うので、↓の是非は別にして、
> コンテナが反復子の状態数を保存してるときは
> 反復子を操作(削除)するときに
> 管理しているコンテナに通知して処理するほうが望ましい結果が得られる。
これはSTLに求める性質としてはお門違いではないかと。
0804794
NGNG一般的な反復子にはもちろん同意だが、
コンテナ内のtypedef(または定義)されたiteratorを
削除するときは違う。
a.insert(a2.begin()) -> は問題ない
a.erase(a2.begin()) -> a2側に通知が必要
STLの性質を求めてるんじゃなくて、
結果が正しくなることを求めてる。
0805デフォルトの名無しさん
NGNG0806デフォルトの名無しさん
NGNG自分で勝手に自分がどのコンテナオブジェクトに属しているかを知っている
イテレ−タを使ってアクセスされるリストクラスでも作って使っとけアホ。
0807デフォルトの名無しさん
NGNG> listのeraseで自分のコンテナ以外の反復子を削除できるようなのですが、
自分のコンテナ以外の反復子を指す要素は削除「できない」。実装によっては
たまたま削除されてしまうかもしれないが、その辺りの動作は未定義。
それをふまえて。
> a.insert(a2.begin()) -> は問題ない
a.insert(a2.begin, value) か? a.erase(a2.begin()) と同じ程度には問題あるだろう。
> 結果が正しくなることを求めてる。
sqrt( "弐" ) とやったら "1.41421356" と返すのが正しい結果だ、
と主張してそれを求めてるのに等しいことは自覚してるか?
無論、sqrt( "弐" ) と同じでコンパイルエラーになるとか、最悪でも
実行時エラーになったら嬉しいのは確かだし、(だからSTLPortの
Debug版とかはかなり重宝されている。) staticメンバ関数を使って
list<T>::erase(a2.begin()) と書けるiterator/container はそれなりに便利だろう。
が、それはSTLの範疇じゃない。
0808807
NGNG○反復子の指す要素
0809デフォルトの名無しさん
NGNGひとこと余計なんだよ。
カスが。
0810デフォルトの名無しさん
NGNG保護違反が発生するのですが、STLはExeをまたがって使用できないのですか?
環境は .Net STLはMS製です。
0811デフォルトの名無しさん
NGNGMSの作るのDLL/EXEは、MSVCRT.DLLを使わない限り、ヒープを個別に
持つことになる。片方でnew/mallocしたものを他方でdelete/freeすると
当然おかしなことになる。
MSVCRT.DLLを使うか、またがってnew/deleteをしないよう
気をつけるしかない。
0812デフォルトの名無しさん
NGNGlist<N>::iteratorの比較をしたい場合には、どのようにしたら良いのでしょう?
list<N>::iterator il; // Nは適当なクラス
set<list<N>::iterator> lset;
lset.insert(il); // 必要なilを適宜追加する。ここでの重複を省きたい。
(とりあえずコンパイル通すために)以下のようにiteratorの比較をしています
bool operator < (const std::list<N>::iterator lhs, const std::list<N>::iterator rhs)
{ return &(*lhs) < &(*rhs); }
g++(2.96〜3.2)では通るのですが、Intel Compiler(icc)では、
# error: no operator "<" matches these operands
# operand types are: const std::list<N, std::allocator<N>>::iterator
# < const std::list<N, std::allocator<N>>::iterator
とはじかれてしまいます。
どうすれば解決するかご指摘いただけないでしょうか?
0813デフォルトの名無しさん
NGNGstruct compare_dereferenced_address : std::binary_function< bool , Iterator , Iterator >
{
  bool operator () const ( const Iterator& lhs , const Iterator& rhs )
  { return &(*lhs) < &(*rhs); }
};
set<list<N>::iterator,compare_dereferenced_address<list<N>::iterator> > lset;
Interl Compiler 持ってないから、実験はできないけど、
とりあえず行儀よくしてやったら治らないかね?
0815812
NGNG治りました。ありがとうございます。
binary_functionにあまり馴染んでないせいか(必要にかられて本を調べる程度)
set<list<N>::iterator,compare_dereferenced_address<list<N>::iterator> > lset;
こんな風に宣言できることすら思いつきませんでした。
0816デフォルトの名無しさん
NGNG0817813
NGNG0818812
NGNGset<list<N>::iterator,compare_dereferenced_address<list<N>::iterator> > lset;
とすると確かに通るのですが、挙動不審です。
どうも元の set<list<N>::iterator> との型の互換で失敗しているようです。
この辺のデバッグが非常に面倒なプログラムなので、
できれば素の、set<list<N>::iterator>のまま通したいところです。切実に、、
せっかく
bool operator < (const std::list<N, std::allocator<N> >::iterator lhs,
const std::list<N, std::allocator<N> >::iterator rhs)
{ return &(*lhs) < &(*rhs); }
と、operator用意しているのに、何で使ってくれへんの? と悲鳴をあげつつ
以下がエラーメッセージ全文となります。うざったくてすんません。
どうか、もちょっとだけアドバイスを下さいませ。
/opt/intel/compiler70/ia32/include/functional(134): error: no operator "<" matches these operands
operand types are: const std::list<N, std::allocator<N>>::iterator
< const std::list<N, std::allocator<N>>::iterator
return (_Left < _Right);
^
detected during:
instantiation of "bool std::less<_Ty>::operator()
(const _Ty &, const_Ty &) const [with _Ty=std::list<N, std::allocator<N>>::iterator]"
at line 471 of "/opt/intel/compiler70/ia32/include/xtree"
instantiation of "std::_Tree<_Traits>::_Pairib std::_Tree<_Traits>::insert(const std::_Tree<_Traits>::value_type &)
[with _Traits=std::_Tset_traits<std::list<N, std::allocator<N>>::iterator,
std::less<std::list<N, std::allocator<N>>::iterator>,
std::allocator<std::list<N, std::allocator<N>>::iterator>, false>]"
0819デフォルトの名無しさん
NGNG> とすると確かに通るのですが、挙動不審です。
> どうも元の set<list<N>::iterator> との型の互換で失敗しているようです。
失敗じゃネェよ。そいつらは違う型だ。
set<list<N>::iterator>を使ってたところで全部同じ型を使うように汁。
0820デフォルトの名無しさん
NGNG多分
template<typename T> void function( tmpl<T> t ) { ... }
という定義があれば tmpl<T> t; function(t); で見つけられるけど、
template<typename T> void function( tmpl<T>::type t ) { ... }
では tmpl<T>::type t; function(t); では見つからないはず。
# スマートポインタを ptr<T>::shared とか ptr<T>::auto とか ptr<T>::locked
# とか書きたいけど書けねぇなぁ、という議論で見かけた気がする。
ので素直に、
1: set<list<N>::iterator> を(名前は適切なものをつければいいが) set_of_N_iter に置換
2: typedef set<list<N>::iterator,compare_dereferenced_address<list<N>::iterator> >
set_of_N_iter;
しとけ。
あるいは、iteratorの比較関数をtemplateにしないで
bool operator<( const list<N>::iterator& i, const list<N>::iterator& j ) { ... }
と一個一個書いていけばいいような気もするが。
0821812
NGNG>set<list<N>::iterator>を使ってたところで全部同じ型を使うように汁。
ごもっともです。
それでうまくいかなかったのは、やはり元のコードがbuggyだったせいかと。
>820
>bool operator<( const list<N>::iterator& i, const list<N>::iterator& j ) { ... }
>と一個一個書いていけばいいような気もするが。
これはどうも無理でした。
>では tmpl<T>::type t; function(t); では見つからないはず。
つまり、見つけられた(コンパイラ)の方がたまたまだったというわけでしょうか……
>ので素直に、 (中略) しとけ。
はい、そうしますわ。こつこつバグ治します。
0822デフォルトの名無しさん
NGNGttp://groups.yahoo.com/group/boost/files/
とか見ていると、smart_ptr とか singleton とか
いい感じに Loki を取り込んでいってますな。
あと、次期 boost::lexical_cast 萌え
ところで、ここのコードって勝手に使っていいのかな?
0823デフォルトの名無しさん
NGNG素朴な疑問なんだけどさあ、iteratorってお互いの大小関係って
比較できたっけ?
==か!=でしか比較できなかったような気がするんだが。
0824デフォルトの名無しさん
NGNG1.std::set<Elem, Op>
2.std::set c(Op)
のどちらかでしか比較基準は指定できないよ。これを使わず
operator< を定義しても使ってはくれない。
0825デフォルトの名無しさん
NGNG> 素朴な疑問なんだけどさあ、iteratorってお互いの大小関係って
> 比較できたっけ?
だから812氏は苦労して { return &(*lhs) < &(*rhs); } なんて奇怪な
比較関数を作ってるんじゃねーの?
> のどちらかでしか比較基準は指定できないよ。これを使わず
> operator< を定義しても使ってはくれない。
set<T> とやったら比較ポリシーは std::less<T> になるから、
operator < が呼ばれる。つーか、キミ、勉強し直せ。
0826820
NGNG追実験。。
> >bool operator<( const list<N>::iterator& i, const list<N>::iterator& j ) { ... }
> >と一個一個書いていけばいいような気もするが。
Comeau のオンラインコンパイラで試してみたら、
namespace std {
bool operator<( const list<int>::iterator& i, const list<int>::iterator& j ) { ... }
}
とstdの中に突っ込んで置いたら一応コンパイルは通ったぞい。
猛烈に行儀が悪いので、止めた方が無難だが。
0827デフォルトの名無しさん
NGNG0828812
NGNG通りました! まさにピンポイントなアドバイス!
>猛烈に行儀が悪いので、止めた方が無難だが。
よそのコンパイラでお行儀悪くするためにはコツが必要なのですね。
ありがとうございます。
>827
なるほど。const list<N>::iteratorではなく、const vector<N>::iteratorの場合、
operator < を作る必要がなかったので不思議に思っていました。
勉強になりました。
0829デフォルトの名無しさん
NGNG0830デフォルトの名無しさん
NGNGもうstlport使わなくてよくなるかな
0831デフォルトの名無しさん
NGNG0832デフォルトの名無しさん
NGNG0833デフォルトの名無しさん
NGNG0834デフォルトの名無しさん
NGNGstl なんか使いませんとも。
0835デフォルトの名無しさん
NGNG抜き出すにはどうすればよいですか?
片方に含まれる、両方に含まれる、どちらにも含まれる、で
処理を分けるようなこともしたいです。
0836デフォルトの名無しさん
NGNGソート済みなら
std::set_union()
std::set_intersection()
std::set_defference()
が使えるかと。
0837デフォルトの名無しさん
NGNG片方にのみ含まれる - std::set_difference()
どちらにも含まれる - std::set_intersection()
両方の集合の和 - std::set_union()
但しこれらのアルゴリズムは必ず std::vectorを sort() してから
呼び出さなければならない。
0838デフォルトの名無しさん
NGNG0839836
NGNG0840仕様書無しさん
NGNG0841デフォルトの名無しさん
NGNG両方あった方が良い(w
0842デフォルトの名無しさん
NGNG勘違いしている馬鹿発見。
0843デフォルトの名無しさん
NGNGVC7にSTLportを導入した、つもりなんですが
どうも上手くいっていないみたいです。
ちゃんとSTLportが使われているかチェックする方法はないですか?
インクルードディレクトリを切り替えてlistの性能比較とかしても差がないし、
iostreamもSTLport版を使うようにし他場合、
#define _STLP_USE_DYNAMIC_LIB してできた実行ファイルを
Dependency Walkerで調べたらstlport_vc745.dllが表示されると
思っていたんですが、表示されませんでした。思い違いでしょうか?
インストールが上手くいっていないだけですか?
0844デフォルトの名無しさん
NGNGstd の変わりに _STL ネームスペースを使って正常にコンパイル
できるかどうかチェックする。
0846デフォルトの名無しさん
NGNGSGI系のアダプタである _STL::compose1 とか _STL::compose2 が
コンパイルできるか確かめてみる方法もあるよ。
0847デフォルトの名無しさん
NGNGfor(int i=0;i<10;++i) cin >> x[i];
を for で回さないでなんか algorithm 使って出来ないですかね?
std::vector x(10);
std::transform(x.begin(), x.end(), x.begin(), bind1st(std::mem_fun(&std::istream::operator>>), &std::cin));
で逝けるかなぁと思ったんですけど、
no matching function for call to `mem_fun(<unknown type>)'
と gcc-3.2.1 に言われてしまって…
まぁ完全に趣味なんで別に for で回せばいいんですけどね。
0848デフォルトの名無しさん
NGNG#include <iterator>
std::copy_n( std::istream_iterator<T>(cin), x.size(), x.begin() );
0849848
NGNG0850デフォルトの名無しさん
NGNGやってみたけど11個数字を入れないと終了しないよ。
STLport。
0851デフォルトの名無しさん
NGNG多分それがだめなのは、operator>>の戻り値型がstd::istreamだから
だろう。
0852デフォルトの名無しさん
NGNGファンクタを作ったらだめかい?
template <typename T>
struct input {
T operator()(T& t) {
std::cin >> t;
}
};
int main()
{
std::vector<int> x(10);
std::transform(x.begin(), x.end(), x.begin(), input<int>());
std::copy(x.begin(), x.end(), std::ostream_iterator<int>(std::cout, " "));
}
0853848
NGNGおー、ほんとだ。istream_iterator って operator* じゃなくて
コンストラクタと operator++ のタイミングで読まれるのか。使いにくいな。
0854デフォルトの名無しさん
NGNGtemplate <typename T>
struct Input {
T operator()(T& t) {
std::cin >> t;
return t;
}
};
0855デフォルトの名無しさん
NGNGtemplate< typename T >
struct input_from_cin
{
T operator () ()
{
T temp;
cin >> temp;
return temp;
}
};
int main()
{
vector< int > v;
generate_n( back_inserter( v ) , 10 , input_from_cin< int >() );
copy( v.begin() , v.end()
, ostream_iterator< int >( cout , " " ) );
}
0856847
NGNG>>848
copy_n は知らなんだです。gccのSTLにはあるみたいなんで良さそうですね。
でも確かに >>853 のような事に
>>851
それだと <unknown type> なんですか?そもそもこのエラーメッセージが良く分からんっす。
ちゃんと iostream は include してるから未知って事は無いと思うんですが…
>>852
まぁもちろんファンクタ作ればいいんですが、なんとなく一行野郎で行きたかったんで…
>>855
そうなんですが、一行野郎を目指したら個数を指定する為に無理矢理行き着いたのが
transform でして…可読性はゼロですけどね(w
■ このスレッドは過去ログ倉庫に格納されています