SlideShare a Scribd company logo
1 of 48
C2C++11 〜Level 1 〜
安全なコードを求めて
株式会社ムラサメ研究所
みやたけ ゆき
自己紹介
みやたけゆき
 主な開発言語 C++、アセンブラ、GPGPU、シェー
ダー、Java、スマホネイティブ
 最近のC++開発案件
MOゲームサーバ(boost.asio)
3Dゲームエンジンfor iOS&Android(OpenGLES2.0)
動画エンコーディング(h264)
3Dレンダリングエンジンfor Windowd(DirectX11)
セキュリティーソフト for Windows
ゲーム(cocos2d-x)、UNITY用 C++プラグイン
ゲーム(コンシュマー)
 C++11歴は 5ヶ月。それまでは生ポインターと
memcpyを愛用
題字(花文字)
睦月 翔子
花文字アーティスト
花文字とは、龍や鳥等の開運絵柄を用い
て即興で描く文字です。オーダーメイド
の開運アイテムとして人気がございます。
http://hana-moji.jp/
はじめに
 C言語は最も利用されている言語だが、メモリ
やポインタ等を抽象化せずに直接使用してき
たため、それらの不具合やセキュリティ問題
が多い
 C++では、速度を損なわずに それらを抽象化
し、安全で高速なコードを提供する
 今回はLevel1 という事で、危険性の高いポイ
ンタやメモリを中心に、C++の安全なコード
に変更する方法を書く
 今回のメインターゲットは、C言語に満足して、
C++11に移行出来てない人、具体的には生ポ
インタやmemcpyを書いている技術者
ポインタ
過去の問題
 過去において、各社が独自にスマートポインタを作っ
ていた
 各社インタフェースが違い習得コストが高い
 それぞれにに癖があり、むしろ余計にメモリリークを
していた事も・・
お前は今までにprintfしたCComPtrの参照カウンタの
数を覚えているか?
 スレッドセーフでないもの、オーバーヘッドの大きい
もの等があった
 auto_ptrには問題がある、boostライブラリは導入が
大変だ
標準化されたので安心して使いましょう!!
問題
 C言語でよく難しいと言われる代表が
ポインタ
 C言語で不具合が最もいものが
ポインタ
下記のコードは問題がある。何故?
char *p = new char[10];
・・・何かの処理
delete[] p;
答え
char *p = new char[10];
・・ここで例外発生したらpが開放されない
delete[] p;
このような過ちは熟練者でもよくやってしま
う。
生ポインタは使うべきではない
unique_ptr
先ほどの例は unique_ptrを使うと
unique_ptr<char[]> p(new char[10]);
・・・何かの処理
これでOK。スコープを抜けると デストラクタで処
理されるので 明示的にdeleteする必要もないし
例外発生時も正しく デストラクタが開放してくれる
ポインタはunique_ptrに置き換えるべき
unique_ptr
 unique_ptrでラップしたポインタは、普
通のポインタのように扱う事が出来る
 生ポインタと実行速度は変わらない
 互換性等の為に、生のポインタが欲しい場
合はp.get() で取得できる
 release()メソッドを呼べば、ポインタと
の関係性を破棄(unique_ptrのスコープ
が消えてもdeleteされない)
従来のポインタとの互換性も十分
おまけ
 C++14では make_uniqueが追加された
unique_ptr<char[]> =
make_unique<char[]>(20); // 配列数を指定
newが不要になった
newに対応したdeleteがないと気持ち悪い人に朗報
 カスタムデーリータを設定する事が出来る
例えばファイルハンドルがスコープ外に出たらcloseするとか
 参照カウンタをもったポインタは
shared_ptr&weak_ptrを使う
ポインタは全て、スマートポインタに変えるべき
配列
宣言
C言語では配列は
int a[10];
C++では
std::array<int,10> ar;
二次元配列
int aa[10][2];
std::array<std::array<int,2>, 10> aar;
配列の順番が逆になる事に注意
配列の順番が逆になる のが気になる人は
Sprout とか使うといいらしいよ
概要
std::array<int,10> ar;
ar[1] = 10;
普通の配列と同じように使える
中身は配列なのでオーバーヘッド無し
宣言は多少面倒だが
std::arrayを使いましょう
std::arrayを使うメリット
 配列数を取得
std::array
ar.size()
生配列
sizeof(a)/sizeof(*a)
あるいは
std::size(a)
簡潔でわかりやすい
std::arrayを使うメリット
 アルゴリズム
std::array
ar.fill(5);
生配列
std::fill(std::begin(a), std::end(a), 5);
簡潔でわかりやすい
std::arrayを使うメリット
 比較
std::array
if( ar1 == ar2 )
生配列
if( std::equal(std::begin(a1),
std::end(a1), std::begin(a2)))
簡潔でわかりやすい
std::arrayを使うメリット
 範囲外アクセス
std::array
ar.at(100); // throw std::out_of_range
ar[100]; // 不正アクセス
生配列
a [100]; // 不正アクセス
atを使うと範囲外アクセスで例外発生
std::arrayを使うメリット
 型の安全性
std::array
void hoge(std::array<int,5> &a) // int 5個配列以外
はコンパイルエラー
生配列
void hoge(int *a) // どんなサイズでもOKになるので、
安全でない
void hoge(int (&a)[5]) // int 5個配列以外はコンパイ
ルエラー
生配列の文法はわかりにくい
まとめ
 実はC++11になると、生配列も機能
拡張され、stl::algorithm を使えば、
std::arrayとほぼ同じ事が出来る
 だが、std::arrayを使う方がコード
も読みやすいしデメリットはないの
で積極的に使うべき
おまけ
 C++17では std::make_arrayが提案されている
std::array<int,4> a{{0,1,2,3}};
が std::make_arrayを使うと
auto a(std::make_array(0,1,2,3));
と書け、要素数や型を指定しなくてもよくなる
https://gist.github.com/lichray/6034753
ここに実装例があるので、上記のコードを参考にすれば
C++11でも std::make_arrayを使用する事が可能
使ってますが とっても便利です!
memcpy
memcpy
 memcpyは最も危険な関数の一つ。
memcpyによるバッファオーバーラ
ンで苦しんだCゲンガーは多い
 memcpyは原始的で、型も無視し機
械的にメモリをコピーする
 C++ではmemcpyを極力使わず
std::copyや代入演算子等の安全なも
のを使うべきだ
構造体のコピー
struct A{
int a[10]:
}a;
struct B{
int a[100]:
}b;
memcpy( a, b, sizeof(B) );
当然 バッファオーバーラン!!
構造体のコピーは単純に
a=b;
と、代入演算子を使いましょう
当然、この場合は型が違うのでコンパイルエラー
型が同じであれば当然コピー出来ます
配列のコピー
int a[10],b[100];
memcpy( a, b, sizeof(b) );
当然バッファオーバーランします
配列は std::arrayを使うんでしたね
std::array<int,10> a;
std::array<int,100> b;
a=b;
代入演算子を使いましょう
当然、この場合は型が違うのでコンパイルエラー
同じ型であれば当然コピー出来ます
配列の一部コピー
int a[10],b[100];
memcpy( a+2, b+2, sizeof(int)*10 );
当然バッファオーバーランします
std::array<int,10> a;
std::array<int,100> b;
std::copy(std::begin(b)+2, std::begin(b)+12,
std::begin(a)+2);
ダメです。メモリリークします
std::copyを使っても安心できません
ただし、Clangだと上記のコードで aの範囲
チェックされているようで、リークしません!!
Clangすばらしい!
まとめ
 構造体のコピーは代入で
 配列はarrayを使えば代入でOK
 途中のコピーはstd::copyで。ただし、
バッファオーバーランには気をつけて
ね
 std::copyはstlコンテナ(vector等)とも
相性が良いのでそちらを使うべき
 どうしても原始配列を使う場合も、フ
リー関数を使えばSTLアルゴリズムを使
える
おまけ 速度比較
 memcpyは連続領域を一括コピーする
一般的には、レジスタの最大サイズでコ
ピーを行うため高速である
 代入やstd::copyでは基本1要素毎のコピー
であるため、速度はmemcpyより遅い事も
ある
 しかし構造体には アラインがあり、
memcpyはアラインまでコピーする為、場
合によっては 代入のほうが速い
速度差が顕著な場合を除いて、危険な
memcpyを使うべきではない
cast
cast
 C言語のcastは1種類で、意図しない
castをする可能性がある
 C++には const_cast、static_cast、
dynamic_cast、reinterpret_cast
の4つがあり、それぞれに何を意図し
たcastかを指定出来る
const_cast
 constとvolatileを外すcast
void a(const int&n){
const_cast<int&>(n)=5;
}
こんな事書くと constで渡してるのに値を書き換えられてしまう!!
よっぽどな事が無い限り使ってはいけない非常に危険なcast
個人的にはvolatileの制御で時々使うがマニア向け
volatile int flag; // flagは最適化対象外になる
int *p = const_cast<int*>(&flag); // pは最適化対象
参考:
http://qiita.com/YukiMiyatake/items/1191ab03b6c0b5a22876
最も使ってはならないcast
dynamic_cast
 実行時にキャストが行われる
class A{virtual void boo(){};};
class B : public A{};
class C{virtual void boo(){};};
B bb;
A *a = dynamic_cast<A*>(&bb);
B *b = dynamic_cast<B*>(a);
C *c = dynamic_cast<C*>(a);
B*からA*へのアップキャストは安全
A*からB*へのダウンキャストは危険をともなう場合がある
A*からC*は継承関係がないのでエラー値 nullが返って来る
なるべく使わないcast
static_cast
 コンパイル時に決定されるキャスト
double d = static_cast<double>(3) / 2;
コンパイル時に確定される、非常に安全な
キャスト
暗黙的な変換等あるいは
void*からの変換を行う
どんどん使ってよろしい cast
reinterpret_cast
 最解釈キャスト
float f = 1.0f;
int f0 = *(reinterpret_cast<int*>(&f));
強制的になんでもキャストする(型を無視)
上記は f0には 1ではなく、そのCPUの浮動小数1.0fのバ
イトデータが入る
(ex 0x3f800000)
継承関係があってもアップキャスト、ダウンキャスト等
を行わない
最も不具合を出す危険なcast
まとめ
 C++で追加された4つのキャストを使う事
 static_cast以外を使う時は、設計ミスをし
ている可能性を疑おう
 実行時エラーが起きた際に キーワードで検
索で絞れる
C++スタイルのキャストを使っていると不
具合も探しやすい
 他人がソースを読む場合に意図が伝わる
つまり、C++のキャストを使うべき
explicit
explicit
 引数1つのコンストラクタ=型変換コ
ンストラクタ
が存在する場合は、暗黙的型変換が
行われるので、それを阻止する事が
できる
explicit
class A{
public:
A( int n ){cout << "construct " << n << endl; };
};
auto main() -> int {
[](const A &a){}(2);
return 1;
};
const A& の引数を期待しているが intで渡せる
暗黙的型変換により intから class Aが 暗黙的に生成されている!!
一般的には、明示的な型変換しか受け付けないほうが良い
暗黙的型変換を想定していない場合は 禁止すべきだ
explicit
class A{
public:
explicit A( int n ){};
};
と、explicitを使えば暗黙的型変換はコンパイルエ
ラーになる
もちろん、明示的にキャストすればOK
[](const A &a){}(static_cast<A>(2));
特別な意図がないかぎりは、型変換コンストラク
タは explicitするべき
型エイリアス
型エイリアス
 今までは typedefを使い型を定義し
ていたが、型が一番右に来て直感的
に分かりにくい
 また、関数や配列の場合は一番右で
もなく真ん中に来るので更にわかり
にくい
 typedefではテンプレートを使えない
 using 型 = ほげ;
と、直感的に分かりやすく書ける!
型エイリアス
// typedef
typedef int hoge1;
typedef int hoge2[10];
typedef hoge1 (*hoge3)(hoge2);
// 型エイリアス
using hoge1 = int;
using hoge2 = int[10];
using hoge3 = hoge1(*)(hoge2);
どちらも同じ動作をするが、明らかに型エイ
リアスのほうが可読性が高い
template
// typedef
template<class T>
typedef std::map<int, T> int_map;
int_map<double> m;
// コンパイルエラー
// 型エイリアス
template<class T>
using int_map= std::map<int, T>;
int_map<double> m;
// OK
typedefでは テンプレートに対応出来ない
enum class
enum class
 基本は enum
 enum classはスコープがついている
ので名前がかぶらなくなった
 内部型のデフォルトが処理系依存で
なくなった
 intへの暗黙的キャストがなくなり安
全性が増した
スコープ
int A;
enum hoge{
A, // int Aとシンボルがぶつかりエラー
B
};
enum class hoge2{
A, // スコープを持つのでかぶらない
B
};
以前のenumは、スコープを持たないため、他のシンボ
ルとかぶる為、namespaceを付けたり、サフィックスを
つけてたが
enum classでは独自スコープを持つため 問題ない
暗黙的型変換
enum class hoge {
A, B
};
int a = hoge::A; // コンパイルエラー
enumではintへの暗黙的型変換は許可されているが
enum class では許可されない
static_castで内部型に明示的にキャストする
// enum classの内部型
using hoge_t = std::underlying_type<hoge>::type ;
hoge_t a = static_cast<hoge_t>(hoge::A);
最後に
 C++11の機能を使うにあたって、まず
は安全なコードを意識しましょう
 生ポインタはスマートポインタに変更
 配列は std::arrayを使用する
 memcpyの使用を避ける
 castはC++のキャストを使う
 typedefより 型エイリアスを使う
 列挙は enum classを使う

More Related Content

What's hot

Xeon PhiとN体計算コーディング x86/x64最適化勉強会6(@k_nitadoriさんの代理アップ)
Xeon PhiとN体計算コーディング x86/x64最適化勉強会6(@k_nitadoriさんの代理アップ)Xeon PhiとN体計算コーディング x86/x64最適化勉強会6(@k_nitadoriさんの代理アップ)
Xeon PhiとN体計算コーディング x86/x64最適化勉強会6(@k_nitadoriさんの代理アップ)
MITSUNARI Shigeo
 
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
Takeshi Yamamuro
 
ぱっと見でわかるC++11
ぱっと見でわかるC++11ぱっと見でわかるC++11
ぱっと見でわかるC++11
えぴ 福田
 
Boost.Coroutine
Boost.CoroutineBoost.Coroutine
Boost.Coroutine
melpon
 

What's hot (20)

Async design with Unity3D
Async design with Unity3DAsync design with Unity3D
Async design with Unity3D
 
Xeon PhiとN体計算コーディング x86/x64最適化勉強会6(@k_nitadoriさんの代理アップ)
Xeon PhiとN体計算コーディング x86/x64最適化勉強会6(@k_nitadoriさんの代理アップ)Xeon PhiとN体計算コーディング x86/x64最適化勉強会6(@k_nitadoriさんの代理アップ)
Xeon PhiとN体計算コーディング x86/x64最適化勉強会6(@k_nitadoriさんの代理アップ)
 
Cloud TPU Driver API ソースコード解析
Cloud TPU Driver API ソースコード解析Cloud TPU Driver API ソースコード解析
Cloud TPU Driver API ソースコード解析
 
フラグを愛でる
フラグを愛でるフラグを愛でる
フラグを愛でる
 
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
 
競技プログラミングにおけるコードの書き方とその利便性
競技プログラミングにおけるコードの書き方とその利便性競技プログラミングにおけるコードの書き方とその利便性
競技プログラミングにおけるコードの書き方とその利便性
 
基礎からのCode Contracts
基礎からのCode Contracts基礎からのCode Contracts
基礎からのCode Contracts
 
UniRxことはじめ
UniRxことはじめUniRxことはじめ
UniRxことはじめ
 
Hello Dark-Side C# (Part. 1)
Hello Dark-Side C# (Part. 1)Hello Dark-Side C# (Part. 1)
Hello Dark-Side C# (Part. 1)
 
新しい並列for構文のご提案
新しい並列for構文のご提案新しい並列for構文のご提案
新しい並列for構文のご提案
 
LLVM最適化のこつ
LLVM最適化のこつLLVM最適化のこつ
LLVM最適化のこつ
 
コルーチンの使い方
コルーチンの使い方コルーチンの使い方
コルーチンの使い方
 
SSE4.2の文字列処理命令の紹介
SSE4.2の文字列処理命令の紹介SSE4.2の文字列処理命令の紹介
SSE4.2の文字列処理命令の紹介
 
「FPGA 開発入門:FPGA を用いたエッジ AI の高速化手法を学ぶ」
「FPGA 開発入門:FPGA を用いたエッジ AI の高速化手法を学ぶ」「FPGA 開発入門:FPGA を用いたエッジ AI の高速化手法を学ぶ」
「FPGA 開発入門:FPGA を用いたエッジ AI の高速化手法を学ぶ」
 
ぱっと見でわかるC++11
ぱっと見でわかるC++11ぱっと見でわかるC++11
ぱっと見でわかるC++11
 
Boost.Coroutine
Boost.CoroutineBoost.Coroutine
Boost.Coroutine
 
Misrac20150523
Misrac20150523Misrac20150523
Misrac20150523
 
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭するCEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
 
Emcjp item33,34
Emcjp item33,34Emcjp item33,34
Emcjp item33,34
 
Live Coding で学ぶ C# 7
Live Coding で学ぶ C# 7Live Coding で学ぶ C# 7
Live Coding で学ぶ C# 7
 

Viewers also liked

面接時における心構えとマナー 荒谷 朋哉
面接時における心構えとマナー 荒谷 朋哉面接時における心構えとマナー 荒谷 朋哉
面接時における心構えとマナー 荒谷 朋哉
mourikousuke
 

Viewers also liked (7)

おそらく明日から役にたつC++11新機能
おそらく明日から役にたつC++11新機能おそらく明日から役にたつC++11新機能
おそらく明日から役にたつC++11新機能
 
面接時における心構えとマナー 荒谷 朋哉
面接時における心構えとマナー 荒谷 朋哉面接時における心構えとマナー 荒谷 朋哉
面接時における心構えとマナー 荒谷 朋哉
 
ゲーム開発経営ゲーム
ゲーム開発経営ゲームゲーム開発経営ゲーム
ゲーム開発経営ゲーム
 
センパイ!このプログラムクラッシュするんですけど。。。
センパイ!このプログラムクラッシュするんですけど。。。センパイ!このプログラムクラッシュするんですけど。。。
センパイ!このプログラムクラッシュするんですけど。。。
 
BoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうかBoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうか
 
Effective Modern C++勉強会#4 Item 17, 18資料
Effective Modern C++勉強会#4 Item 17, 18資料Effective Modern C++勉強会#4 Item 17, 18資料
Effective Modern C++勉強会#4 Item 17, 18資料
 
C++ ポインタ ブートキャンプ
C++ ポインタ ブートキャンプC++ ポインタ ブートキャンプ
C++ ポインタ ブートキャンプ
 

Similar to C2C++11Level1

cocos2d-xにおけるBox2Dの利用方法および便利なツール
cocos2d-xにおけるBox2Dの利用方法および便利なツールcocos2d-xにおけるBox2Dの利用方法および便利なツール
cocos2d-xにおけるBox2Dの利用方法および便利なツール
Tomoaki Shimizu
 

Similar to C2C++11Level1 (14)

ももち浜TECHカフェ:OpenCVとKinectで作ろう壁面タッチパネル
ももち浜TECHカフェ:OpenCVとKinectで作ろう壁面タッチパネルももち浜TECHカフェ:OpenCVとKinectで作ろう壁面タッチパネル
ももち浜TECHカフェ:OpenCVとKinectで作ろう壁面タッチパネル
 
Unity C#3からC#6に向けて
Unity C#3からC#6に向けてUnity C#3からC#6に向けて
Unity C#3からC#6に向けて
 
Siv3Dで楽しむゲームとメディアアート開発
Siv3Dで楽しむゲームとメディアアート開発Siv3Dで楽しむゲームとメディアアート開発
Siv3Dで楽しむゲームとメディアアート開発
 
cocos2d-x 3.0 + C++11で始めるゲーム開発超入門
cocos2d-x 3.0 + C++11で始めるゲーム開発超入門cocos2d-x 3.0 + C++11で始めるゲーム開発超入門
cocos2d-x 3.0 + C++11で始めるゲーム開発超入門
 
競技プログラミングのためのC++入門
競技プログラミングのためのC++入門競技プログラミングのためのC++入門
競技プログラミングのためのC++入門
 
boost - std - C#
boost - std - C#boost - std - C#
boost - std - C#
 
ソフトウェア工学2023 10 デバッグ
ソフトウェア工学2023 10 デバッグソフトウェア工学2023 10 デバッグ
ソフトウェア工学2023 10 デバッグ
 
C++0x総復習
C++0x総復習C++0x総復習
C++0x総復習
 
Cocos2d xをさらにさわってみよう!
Cocos2d xをさらにさわってみよう!Cocos2d xをさらにさわってみよう!
Cocos2d xをさらにさわってみよう!
 
cocos2d-xとネイティブ間の連携
cocos2d-xとネイティブ間の連携cocos2d-xとネイティブ間の連携
cocos2d-xとネイティブ間の連携
 
MISRA-C2012とISO/IEC 9899:2011 at OSCNagoya2013
MISRA-C2012とISO/IEC 9899:2011 at OSCNagoya2013MISRA-C2012とISO/IEC 9899:2011 at OSCNagoya2013
MISRA-C2012とISO/IEC 9899:2011 at OSCNagoya2013
 
1075: .NETからCUDAを使うひとつの方法
1075: .NETからCUDAを使うひとつの方法1075: .NETからCUDAを使うひとつの方法
1075: .NETからCUDAを使うひとつの方法
 
ガールアックス:リアルタイム通信処理の効率的な実装
ガールアックス:リアルタイム通信処理の効率的な実装ガールアックス:リアルタイム通信処理の効率的な実装
ガールアックス:リアルタイム通信処理の効率的な実装
 
cocos2d-xにおけるBox2Dの利用方法および便利なツール
cocos2d-xにおけるBox2Dの利用方法および便利なツールcocos2d-xにおけるBox2Dの利用方法および便利なツール
cocos2d-xにおけるBox2Dの利用方法および便利なツール
 

Recently uploaded

2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx
2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx
2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx
ssuserbefd24
 

Recently uploaded (12)

論文紹介:ViTPose: Simple Vision Transformer Baselines for Human Pose Estimation
論文紹介:ViTPose: Simple Vision Transformer Baselines for Human Pose Estimation論文紹介:ViTPose: Simple Vision Transformer Baselines for Human Pose Estimation
論文紹介:ViTPose: Simple Vision Transformer Baselines for Human Pose Estimation
 
論文紹介: Exploiting semantic segmentation to boost reinforcement learning in vid...
論文紹介: Exploiting semantic segmentation to boost reinforcement learning in vid...論文紹介: Exploiting semantic segmentation to boost reinforcement learning in vid...
論文紹介: Exploiting semantic segmentation to boost reinforcement learning in vid...
 
Intranet Development v1.0 (TSG LIVE! 12 LT )
Intranet Development v1.0 (TSG LIVE! 12 LT )Intranet Development v1.0 (TSG LIVE! 12 LT )
Intranet Development v1.0 (TSG LIVE! 12 LT )
 
Amazon Cognitoで実装するパスキー (Security-JAWS【第33回】 勉強会)
Amazon Cognitoで実装するパスキー (Security-JAWS【第33回】 勉強会)Amazon Cognitoで実装するパスキー (Security-JAWS【第33回】 勉強会)
Amazon Cognitoで実装するパスキー (Security-JAWS【第33回】 勉強会)
 
ロボットマニピュレーションの作業・動作計画 / rosjp_planning_for_robotic_manipulation_20240521
ロボットマニピュレーションの作業・動作計画 / rosjp_planning_for_robotic_manipulation_20240521ロボットマニピュレーションの作業・動作計画 / rosjp_planning_for_robotic_manipulation_20240521
ロボットマニピュレーションの作業・動作計画 / rosjp_planning_for_robotic_manipulation_20240521
 
部内勉強会(IT用語ざっくり学習) 実施日:2024年5月17日(金) 対象者:営業部社員
部内勉強会(IT用語ざっくり学習) 実施日:2024年5月17日(金) 対象者:営業部社員部内勉強会(IT用語ざっくり学習) 実施日:2024年5月17日(金) 対象者:営業部社員
部内勉強会(IT用語ざっくり学習) 実施日:2024年5月17日(金) 対象者:営業部社員
 
5/22 第23回 Customer系エンジニア座談会のスライド 公開用 西口瑛一
5/22 第23回 Customer系エンジニア座談会のスライド 公開用 西口瑛一5/22 第23回 Customer系エンジニア座談会のスライド 公開用 西口瑛一
5/22 第23回 Customer系エンジニア座談会のスライド 公開用 西口瑛一
 
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
 
20240523_IoTLT_vol111_kitazaki_v1___.pdf
20240523_IoTLT_vol111_kitazaki_v1___.pdf20240523_IoTLT_vol111_kitazaki_v1___.pdf
20240523_IoTLT_vol111_kitazaki_v1___.pdf
 
2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx
2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx
2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx
 
クラウド時代におけるSREとUPWARDの取組ーUPWARD株式会社 CTO門畑
クラウド時代におけるSREとUPWARDの取組ーUPWARD株式会社 CTO門畑クラウド時代におけるSREとUPWARDの取組ーUPWARD株式会社 CTO門畑
クラウド時代におけるSREとUPWARDの取組ーUPWARD株式会社 CTO門畑
 
論文紹介:Deep Occlusion-Aware Instance Segmentation With Overlapping BiLayers
論文紹介:Deep Occlusion-Aware Instance Segmentation With Overlapping BiLayers論文紹介:Deep Occlusion-Aware Instance Segmentation With Overlapping BiLayers
論文紹介:Deep Occlusion-Aware Instance Segmentation With Overlapping BiLayers
 

C2C++11Level1