SlideShare uma empresa Scribd logo
1 de 79
Baixar para ler offline
Dancerで
Webアプリ再入門

    Hokkaido.pm#7
    Yoshihiro Sasaki
自己紹介
自己紹介
@aloelight
自己紹介
@aloelight

札幌在住
自己紹介
@aloelight

札幌在住

PerlでWebアプリ開発
自己紹介
@aloelight

札幌在住

PerlでWebアプリ開発

サーバ保守・運用
まず初めに
まず初めに

@riywoさん
まず初めに

     @riywoさん

お越し頂きありがとうございます!
今回のテーマは
Webアプリ再入門
Dancer
使ってみました
AWS Health Info
AWS Health Info
• Twitterアカウントでログイン
AWS Health Info
• Twitterアカウントでログイン
• AWS Service Healthをチェック
AWS Health Info
• Twitterアカウントでログイン
• AWS Service Healthをチェック
• 登録者にお知らせ
間に合いませんでした!
  てへぺろ☆(・ω<)
• 表側のみ作ってあって、裏側の@送信
 とかないです
• 表側のみ作ってあって、裏側の@送信
 とかないです

• でも、ドメインを勢いで取ったので後
 で実装します
• 表側のみ作ってあって、裏側の@送信
 とかないです

• でも、ドメインを勢いで取ったので後
 で実装します

• さくらVPSで動かしてます
アジェンダ
1. Dancerの紹介

2. Dancerの基本文法

3. AWS Health Infoのソースを読む
Dancerの紹介
Dancerの特徴
Dancerの特徴
• Sinatra系のPerl製WAF
Dancerの特徴
• Sinatra系のPerl製WAF
• すっごくシンプル
Dancerの特徴
• Sinatra系のPerl製WAF
• すっごくシンプル
• 豊富なプラグイン
Dancerの特徴
• Sinatra系のPerl製WAF
• すっごくシンプル
• 豊富なプラグイン
• 意外と豊富なドキュメント
まずはインストールする
$ cpanm Dancer
Hello, world
use Dancer;

get '/' => sub {
    return 'Hello, world';
};

dance;
$ ./hello.pl
$ curl localhost:5000
Hello, world
簡単ですね!
もう少し複雑な
プロジェクトのときは?
$ dancer -a MyApp
シンプル
シンプル
シンプル
• 基本は use Dancer するだけ
シンプル
• 基本は use Dancer するだけ
• Dancer.pmがexportする関数を使う
シンプル
• 基本は use Dancer するだけ
• Dancer.pmがexportする関数を使う
• クラス構成もシンプル
EXPORTS
config         redirect
cookie        request
debug         send_error
forward       set
get           session
layout        template
param         uri_for
post          その他諸々
豊富なプラグイン
豊富なプラグイン
豊富なプラグイン
• Dancer::Plugin 94件
豊富なプラグイン
• Dancer::Plugin 94件
• Mojolicious::Plugin 102件
豊富なプラグイン
• Dancer::Plugin 94件
• Mojolicious::Plugin 102件
• Catalyst::Plugin 320件
豊富なプラグイン
• Dancer::Plugin 94件
• Mojolicious::Plugin 102件
• Catalyst::Plugin 320件
• Amon2::Plugin 12件
メジャーなPlugin
メジャーなPlugin
• Dancer::Plugin::Database
メジャーなPlugin
• Dancer::Plugin::Database
• Dancer::Plugin::DBIC
メジャーなPlugin
• Dancer::Plugin::Database
• Dancer::Plugin::DBIC
• Dancer::Plugin::Email
メジャーなPlugin
• Dancer::Plugin::Database
• Dancer::Plugin::DBIC
• Dancer::Plugin::Email
• Dancer::Plugin::Thumbnail
メジャーなPlugin
• Dancer::Plugin::Database
• Dancer::Plugin::DBIC
• Dancer::Plugin::Email
• Dancer::Plugin::Thumbnail
• Dancer::Plugin::Facebook
もっと知りたい方は
      Dancer plugins ecosystem
http://advent.perldancer.org/2011/17
Pluginの作り方
package Dancer::Plugin::LinkBlocker;
use Dancer ':syntax';
use Dancer::Plugin;

register block_links_from => sub {
    my $conf = plugin_setting();
    my $re = join( '|', @{ $conf->{hosts} } );
    before sub {
        if ( request->referer && request->referer =~ /$re/ )
{
            status 403 || $conf->{http_code};
        }
    };
};

register_plugin;
1;
ドキュメント
ドキュメント
ドキュメント
• Dancer::Introduction
ドキュメント
• Dancer::Introduction
• Dancer::Tutorial
ドキュメント
• Dancer::Introduction
• Dancer::Tutorial
• Dancer::Cookbook
ドキュメント
• Dancer::Introduction
• Dancer::Tutorial
• Dancer::Cookbook
• Dancer::Plugins
ドキュメント
• Dancer::Introduction
• Dancer::Tutorial
• Dancer::Cookbook
• Dancer::Plugins
• Dancer::Deployment
httpd.conf
<VirtualHost *:80>
    ServerName www.example.com
    DocumentRoot /srv/www.example.com/public
    ServerAdmin you@example.com

    <Directory "/srv/www.example.com/public">
        AllowOverride None
        Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
        Order allow,deny
        Allow from all
        AddHandler cgi-script .cgi
    </Directory>

    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ /dispatch.cgi/$1 [QSA,L]

    ErrorLog /var/log/apache2/www.example.com-error.log
    CustomLog /var/log/apache2/www.example.com-access_log common
</VirtualHost>
Dancerの基本文法
Routing
get '/' => sub {
    return 'Hello, world';
};

any ['get','post'] =>   '/' => sub {
    ...
};
Routing
get '/user/:name' => sub {
    my $name = param 'name';
};

get '/user/*'     => sub {
    my ($name) = splat;
};
Request Parameters
get '/' => sub {
    my $id = param 'id';
};

post '/' => sub {
    my $id   = param 'id';
    my $file = upload('file');
    # Dancer::Request::Upload object
    $file->copy_to('/path/to/flie');
};
Request Parameters
# GET /entry/foo?id=bar
get '/entry/:id' => sub {
    my $id = param 'id';
    # $id => foo
};

# 追記 paramsを使えばデータソース別に取れます
# perldoc Dancer::Request
# Fetching_only_params_from_a_given_source
Config
set 'tmdpir' => '/tmp/myapp';
get '/' => sub {
    my $config = config;
    return $config->{appname};
};
Cookie
get '/login' => sub {
    my $id       = param 'id';
    my $password = param 'password';
    if ( $id       eq 'cto'
      && $password eq 'onagatani' )
    {
        cookie 'logged_in' => 1;
        redirect '/';
    }
};
Session
set session      => 'YAML';
set session_dir => '/tmp/sessions';
set session_name => 'sid';
# default dancer.session

get '/login' => sub {
    my $id       = param 'id';
    my $password = param 'password';
    if ( $id       eq 'cto'
      && $password eq 'onagatani' ) {
        session 'user' => { name => 'onagatani' };
        redirect '/';
    }
};
Template
set template => ‘template_toolkit’;
get '/' => sub {
    my $id = param 'id';
    template 'index', { id => $id };
};
注意
Dancer::Template::Simple
  IF, LOOPがありません
D::T::TemplateToolkit
こちらを代わりに使いましょう
Database
use Dancer::Plugin::Database;

get '/entry/:id' => sub {
    my $id = param 'id';
    my $data =
      database->quick_select(
        'entry', { id => $id } );
};
Redirect
get '/foo' => sub {
    redirect '/myaction';
};

get '/bar' => sub {
    # internal redirect
    forward '/myaction';
};
Logging
set logger => 'console';
set log    => 'debug';
get '/logging' => sub {
    core    'foo';
    debug   'bar';
    info    'baz';
    warning 'hoge';
    error   'piyo';
};
AWS Health Infoの
  ソースを読む
ご清聴ありがとうございました

Mais conteúdo relacionado

Mais procurados

Perlで伝統芸能
Perlで伝統芸能Perlで伝統芸能
Perlで伝統芸能
hitode909
 
SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...
SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...
SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...
Naoya Ito
 
Scripting Layer for Android + Perl
Scripting Layer for Android + PerlScripting Layer for Android + Perl
Scripting Layer for Android + Perl
Naoya Ito
 
『How to build a High Performance PSGI/Plack Server』のその後と ISUCON3を受けての話題
『How to build a High Performance PSGI/Plack Server』のその後と ISUCON3を受けての話題『How to build a High Performance PSGI/Plack Server』のその後と ISUCON3を受けての話題
『How to build a High Performance PSGI/Plack Server』のその後と ISUCON3を受けての話題
Masahiro Nagano
 
CGI::Application::Dispatch
CGI::Application::DispatchCGI::Application::Dispatch
CGI::Application::Dispatch
Hideo Kimura
 
about Thrift
about Thriftabout Thrift
about Thrift
Naoya Ito
 
Titanium Mobile
Titanium MobileTitanium Mobile
Titanium Mobile
Naoya Ito
 
Perl Hobby Programming - Games::BeLike::EightBIT ターミナルで8ビット風ゲームをつくろう
Perl Hobby Programming - Games::BeLike::EightBIT ターミナルで8ビット風ゲームをつくろうPerl Hobby Programming - Games::BeLike::EightBIT ターミナルで8ビット風ゲームをつくろう
Perl Hobby Programming - Games::BeLike::EightBIT ターミナルで8ビット風ゲームをつくろう
keroyonn
 
ReVIEWとLibreOfficeとOMakeで本を書きましょう!
ReVIEWとLibreOfficeとOMakeで本を書きましょう!ReVIEWとLibreOfficeとOMakeで本を書きましょう!
ReVIEWとLibreOfficeとOMakeで本を書きましょう!
Kiwamu Okabe
 
Open Source System Administration Framework - Func
Open Source System Administration Framework - FuncOpen Source System Administration Framework - Func
Open Source System Administration Framework - Func
Gosuke Miyashita
 

Mais procurados (20)

Perlで伝統芸能
Perlで伝統芸能Perlで伝統芸能
Perlで伝統芸能
 
SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...
SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...
SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...
 
FuelPHPで3種のprofilerを使ってみた
FuelPHPで3種のprofilerを使ってみたFuelPHPで3種のprofilerを使ってみた
FuelPHPで3種のprofilerを使ってみた
 
The master plan of scaling a web application
The master plan ofscaling a web applicationThe master plan ofscaling a web application
The master plan of scaling a web application
 
Scripting Layer for Android + Perl
Scripting Layer for Android + PerlScripting Layer for Android + Perl
Scripting Layer for Android + Perl
 
WordPress のキャッシュ機構
WordPress のキャッシュ機構WordPress のキャッシュ機構
WordPress のキャッシュ機構
 
FuelPHPをさわってみて
FuelPHPをさわってみてFuelPHPをさわってみて
FuelPHPをさわってみて
 
Flask勉強会その1
Flask勉強会その1Flask勉強会その1
Flask勉強会その1
 
『How to build a High Performance PSGI/Plack Server』のその後と ISUCON3を受けての話題
『How to build a High Performance PSGI/Plack Server』のその後と ISUCON3を受けての話題『How to build a High Performance PSGI/Plack Server』のその後と ISUCON3を受けての話題
『How to build a High Performance PSGI/Plack Server』のその後と ISUCON3を受けての話題
 
Sinatra and heroku for mac
Sinatra and heroku for macSinatra and heroku for mac
Sinatra and heroku for mac
 
CGI::Application::Dispatch
CGI::Application::DispatchCGI::Application::Dispatch
CGI::Application::Dispatch
 
about Thrift
about Thriftabout Thrift
about Thrift
 
Titanium Mobile
Titanium MobileTitanium Mobile
Titanium Mobile
 
Rails3.1rc4を試してみた
Rails3.1rc4を試してみたRails3.1rc4を試してみた
Rails3.1rc4を試してみた
 
Perl Hobby Programming - Games::BeLike::EightBIT ターミナルで8ビット風ゲームをつくろう
Perl Hobby Programming - Games::BeLike::EightBIT ターミナルで8ビット風ゲームをつくろうPerl Hobby Programming - Games::BeLike::EightBIT ターミナルで8ビット風ゲームをつくろう
Perl Hobby Programming - Games::BeLike::EightBIT ターミナルで8ビット風ゲームをつくろう
 
Tottoruby 20110903
Tottoruby 20110903Tottoruby 20110903
Tottoruby 20110903
 
Perl Casual #1 - Config Pit
Perl Casual #1 - Config PitPerl Casual #1 - Config Pit
Perl Casual #1 - Config Pit
 
ReVIEWとLibreOfficeとOMakeで本を書きましょう!
ReVIEWとLibreOfficeとOMakeで本を書きましょう!ReVIEWとLibreOfficeとOMakeで本を書きましょう!
ReVIEWとLibreOfficeとOMakeで本を書きましょう!
 
Pyramid入門
Pyramid入門Pyramid入門
Pyramid入門
 
Open Source System Administration Framework - Func
Open Source System Administration Framework - FuncOpen Source System Administration Framework - Func
Open Source System Administration Framework - Func
 

Destaque

理解したつもりになるGit入門
理解したつもりになるGit入門理解したつもりになるGit入門
理解したつもりになるGit入門
Yoshihiro Sasaki
 
これからのPerlプロダクトのかたち(YAPC::Asia 2013)
これからのPerlプロダクトのかたち(YAPC::Asia 2013)これからのPerlプロダクトのかたち(YAPC::Asia 2013)
これからのPerlプロダクトのかたち(YAPC::Asia 2013)
goccy
 
"Ops Tools with Perl" 2012/05/12 Hokkaido.pm
"Ops Tools with Perl" 2012/05/12 Hokkaido.pm"Ops Tools with Perl" 2012/05/12 Hokkaido.pm
"Ops Tools with Perl" 2012/05/12 Hokkaido.pm
Ryosuke IWANAGA
 
Google trends to_irc
Google trends to_ircGoogle trends to_irc
Google trends to_irc
rarere
 
Perl 非同期プログラミング
Perl 非同期プログラミングPerl 非同期プログラミング
Perl 非同期プログラミング
lestrrat
 

Destaque (20)

テーマ「最適化」
テーマ「最適化」テーマ「最適化」
テーマ「最適化」
 
YAPCレポートの舞台裏
YAPCレポートの舞台裏YAPCレポートの舞台裏
YAPCレポートの舞台裏
 
Use Carton
Use CartonUse Carton
Use Carton
 
理解したつもりになるGit入門
理解したつもりになるGit入門理解したつもりになるGit入門
理解したつもりになるGit入門
 
YAPC::AsiaとHokkaido.pm
YAPC::AsiaとHokkaido.pmYAPC::AsiaとHokkaido.pm
YAPC::AsiaとHokkaido.pm
 
YAPC::Asia 2013 - CPAN Testers Reports の情報を上手に使う
YAPC::Asia 2013 - CPAN Testers Reports の情報を上手に使うYAPC::Asia 2013 - CPAN Testers Reports の情報を上手に使う
YAPC::Asia 2013 - CPAN Testers Reports の情報を上手に使う
 
テーマ「なんでもないようなこと」
テーマ「なんでもないようなこと」テーマ「なんでもないようなこと」
テーマ「なんでもないようなこと」
 
これからのPerlプロダクトのかたち(YAPC::Asia 2013)
これからのPerlプロダクトのかたち(YAPC::Asia 2013)これからのPerlプロダクトのかたち(YAPC::Asia 2013)
これからのPerlプロダクトのかたち(YAPC::Asia 2013)
 
Plack::Request with Encoding
Plack::Request with EncodingPlack::Request with Encoding
Plack::Request with Encoding
 
Asset Pipeline for Perl
Asset Pipeline for PerlAsset Pipeline for Perl
Asset Pipeline for Perl
 
PHPカンファレンス北海道_20160416
PHPカンファレンス北海道_20160416PHPカンファレンス北海道_20160416
PHPカンファレンス北海道_20160416
 
Takao.mt 2013
Takao.mt 2013Takao.mt 2013
Takao.mt 2013
 
"Ops Tools with Perl" 2012/05/12 Hokkaido.pm
"Ops Tools with Perl" 2012/05/12 Hokkaido.pm"Ops Tools with Perl" 2012/05/12 Hokkaido.pm
"Ops Tools with Perl" 2012/05/12 Hokkaido.pm
 
Games::* - Perlで 「ゲーム」しよう #hokkaidopm
Games::* - Perlで 「ゲーム」しよう #hokkaidopmGames::* - Perlで 「ゲーム」しよう #hokkaidopm
Games::* - Perlで 「ゲーム」しよう #hokkaidopm
 
Google trends to_irc
Google trends to_ircGoogle trends to_irc
Google trends to_irc
 
Currying in perl
Currying in perlCurrying in perl
Currying in perl
 
CPAN/便利モジュール
CPAN/便利モジュールCPAN/便利モジュール
CPAN/便利モジュール
 
Perl 非同期プログラミング
Perl 非同期プログラミングPerl 非同期プログラミング
Perl 非同期プログラミング
 
変数、リファレンス
変数、リファレンス変数、リファレンス
変数、リファレンス
 
cpanfile
cpanfilecpanfile
cpanfile
 

Semelhante a Using Dancer

Rails and twitter #twtr_hack
Rails and twitter #twtr_hackRails and twitter #twtr_hack
Rails and twitter #twtr_hack
i7a
 
Ruby on Rails Tutorial Chapter8-10
Ruby on Rails Tutorial Chapter8-10Ruby on Rails Tutorial Chapter8-10
Ruby on Rails Tutorial Chapter8-10
Sea Mountain
 

Semelhante a Using Dancer (20)

Silex入門
Silex入門Silex入門
Silex入門
 
swooleを試してみた
swooleを試してみたswooleを試してみた
swooleを試してみた
 
Rails and twitter #twtr_hack
Rails and twitter #twtr_hackRails and twitter #twtr_hack
Rails and twitter #twtr_hack
 
WordBench京都12月、WordCampUSからのWP REST APIな話
WordBench京都12月、WordCampUSからのWP REST APIな話WordBench京都12月、WordCampUSからのWP REST APIな話
WordBench京都12月、WordCampUSからのWP REST APIな話
 
<第1回>Laravelハンズオンセミナー
<第1回>Laravelハンズオンセミナー<第1回>Laravelハンズオンセミナー
<第1回>Laravelハンズオンセミナー
 
Inside mobage platform
Inside mobage platformInside mobage platform
Inside mobage platform
 
GMO TECHNOLOGY BOOT CAMP2015(PHP編)
GMO TECHNOLOGY BOOT CAMP2015(PHP編)GMO TECHNOLOGY BOOT CAMP2015(PHP編)
GMO TECHNOLOGY BOOT CAMP2015(PHP編)
 
20150207コデアルエンジニア学生向けハッカソン就活イベント発表資料
20150207コデアルエンジニア学生向けハッカソン就活イベント発表資料20150207コデアルエンジニア学生向けハッカソン就活イベント発表資料
20150207コデアルエンジニア学生向けハッカソン就活イベント発表資料
 
初めてのPadrino
初めてのPadrino初めてのPadrino
初めてのPadrino
 
Laravelの認証について
Laravelの認証についてLaravelの認証について
Laravelの認証について
 
恋に落ちるデプロイツール
恋に落ちるデプロイツール恋に落ちるデプロイツール
恋に落ちるデプロイツール
 
ZabbixのAPIを使って運用を楽しくする話
ZabbixのAPIを使って運用を楽しくする話ZabbixのAPIを使って運用を楽しくする話
ZabbixのAPIを使って運用を楽しくする話
 
オンプレを少しずつコンテナ化する
オンプレを少しずつコンテナ化するオンプレを少しずつコンテナ化する
オンプレを少しずつコンテナ化する
 
Haikara
HaikaraHaikara
Haikara
 
Dockerイメージ構築 実践テクニック
Dockerイメージ構築 実践テクニックDockerイメージ構築 実践テクニック
Dockerイメージ構築 実践テクニック
 
Mina 20130417
Mina 20130417Mina 20130417
Mina 20130417
 
今日から使い始めるChef
今日から使い始めるChef今日から使い始めるChef
今日から使い始めるChef
 
APIMeetup 20170329_ichimura
APIMeetup 20170329_ichimuraAPIMeetup 20170329_ichimura
APIMeetup 20170329_ichimura
 
Ruby on Rails Tutorial Chapter8-10
Ruby on Rails Tutorial Chapter8-10Ruby on Rails Tutorial Chapter8-10
Ruby on Rails Tutorial Chapter8-10
 
【アシアル塾】PHPオブジェクト指向再入門・第一回クラスとオブジェクト
【アシアル塾】PHPオブジェクト指向再入門・第一回クラスとオブジェクト【アシアル塾】PHPオブジェクト指向再入門・第一回クラスとオブジェクト
【アシアル塾】PHPオブジェクト指向再入門・第一回クラスとオブジェクト
 

Último

Último (11)

知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 

Using Dancer