�ŏI��ƂȂ��15��ł́ARust�ɂ�����f�[�^�x�[�X�V�X�e���̗��p���Љ�܂��B�����܂ł̃T���v���ł̓f�[�^�\�[�X��JSON�t�@�C����Web Storage�ł������A�����Ńf�[�^�\�[�X�Ƀf�[�^�x�[�X���g���悤�ɂ��ăA�v�����������܂��B
���̋L���͉������ł��B����o�^�i�����j����ƑS�Ă������������܂��B
�A�ځFWeb�A�v�������Ŋw�ԁA����Ŗ𗧂�Rust����
�@�{�A�ڂ̃T���v���R�[�h��GitHub�Ō��J���Ă��܂��B����������_�E�����[�h���Ă݂Ă��������B
�@����́AWeb�A�v���̃f�[�^���f�[�^�x�[�X�ɕۑ�����悤�ɉ��ς��܂��B����܂ł́AWeb�A�v���̎d�g�݂ɏW�����邽�߂ɁA�f�[�^���e�L�X�g�t�@�C���ɕۑ����Ă��܂����B���p�I��Web�A�v���ł́A�p�t�H�[�}���X����S���Ȃǂ��l������A�f�[�^�x�[�X�ւ̕ۑ����K�{�ƂȂ�܂��B��11���ȂǂŒ��Ă����Aactix-web��Web�A�v���Ɏ������܂��B
�@Rust�ł́ASQL�n��NoSQL�n�̑o���ɂ��āA�f�[�^�x�[�X���p�̂��߂̃N���[�g���[�����Ă��܂��BSQL�n���ASQL�����L�q���Ē��ڃN�G���s����^�C�v�ƁAORM�i���L�̕⑫���Q�Ɓj�ɂ���ăf�[�^�x�[�X�ւ̃A�N�Z�X�𒊏ۉ�����^�C�v�Ȃǂɕ�����܂��B�f�[�^�x�[�X�ɕۑ�����f�[�^�̍\���╡�G���A�v���O���~���O�����ł̓����̗e�Ղ��Ȃǂ����Ă��āA�ǂ̃N���[�g�𗘗p���邩�����߂邱�ƂɂȂ�܂��B
ORM�̓I�u�W�F�N�g�W�}�b�s���O�iObject-Relational Mapping�j�̗��ŁA�I�u�W�F�N�g�w���v���O���~���O�ƃ����[�V���i���f�[�^�x�[�X�Ԃ̌݊�������̂��߂̋Z�p�ł��BORM�ɂ́A�v���O���~���O����̃N���X�ƃf�[�^�x�[�X�̃e�[�u�����}�b�s���O���邱�ƂŁA�N�G���ڋL�q���Ȃ��Ƃ��f�[�^�x�[�X�𗘗p�ł���Ƃ��������b�g������܂��B
�@SQL�n�f�[�^�x�[�X�̍ŏ��̑I�����Ƃ��āASQLite�AMySQL�APostgreSQL�Ȃǂ�RDBMS�ɓ��������N���[�g�̗��p������܂��BSQLite�Ȃ�sqlite�AMySQL�Ȃ�mysql�APostgreSQL�Ȃ�postgres�Ƃ����悤�ɂ��̂��̃Y�o���̃N���[�g�ł��B���p����RDBMS�����܂��Ă���A�����͗L�͂ȑI�����ɂȂ�ł��傤�B������RDBMS�������I�ł���Ƃ��A�J���Ɩ{�ԂŊ����ς��Ƃ������ꍇ�ɂ́A���ɏЉ��SQLx���������ׂ��ł��B
�@SQLx�́A��ORM�^�C�v��SQL�f�[�^�x�[�X�N���[�g�ł��B�����ɁA�uSQLx is not an ORM!�v�Ƃ������Ă���悤�ɁAORM���T�|�[�g���܂���B���̂���SQL���̋L�q���K�v�ł����A�R���p�C�����ɃN�G���̐��������`�F�b�N����d�g�݂�������Ă��܂��B�����Ńe�[�u���ƍ\���̂̃t�B�[���h���o�C���h����ȂǁAORM�ł͂Ȃ��ł�������ɏ�����g������̗ǂ��������܂��B�������ɂ��Ή����Ă���A�������^�C����Tokio��Actix�ɑΉ�����ȂǁA���L���T�|�[�g�ƂȂ��Ă��܂��B
�@Diesel�́ARust�̂��߂�ORM�^�C�v�̃f�[�^�x�[�X�N���[�g�ł��B�o���2015�N��Rust�Ƃقڎ������ɂ��Ă���A�����Ԃɂ킽��Rust�ɂ�����f�[�^�x�[�X�A�N�Z�X�̂��߂̃N���[�g�Ƃ��ė��p����Ă��܂��B�L�x�Ȏ��тƏ[�������@�\�������ł����A�d�l���c��ł����y�ɓ�������ɂ̓n�[�h���������悤�ł��B�܂��A�������ɑΉ����Ă��Ȃ��ȂǁA�p�t�H�[�}���X��v�������ꍇ�ɂ͓K���Ȃ��Ƃ�����_������܂��B
�@SeaORM���ARust�̂��߂�ORM�^�C�v�̃f�[�^�x�[�X�N���[�g�ł��B2021�N�̃����[�X��Diesel�ɒx��Ă̓o��ł����ASQLx������I�ɗ��p���Ă���̂Ŕ������ɑΉ����Ă���A���ꂪDiesel�ɑ���A�h�o���e�[�W�ƂȂ藘�p�҂�L���Ă��܂��B
Tokio�́ARust�ɂ���������s�̂��߂̃��C�u�����ł��B�����^�C���Ɗ�����܂��BRust�ɂ�Future�Ƃ��������s�̃T�|�[�g������܂����A���s�Ɋւ��Ă͊O���̃����^�C���Ɉˑ����Ă��܂��B���̈��Tokio�ł���Aasync-std��Actix�Ȃǂ��g���錻���_�ł��A���т̂���Tokio���g���邱�Ƃ������悤�ł��B
�@NoSQL�n�Ƃ��ẮAMongoDB�̂��߂�mongodb�ARedis�̂��߂�redis�ȂǁA���ɑO�҂�MongoDB�ɂ������̃h���C�o�ł���̂ŁANoSQL�n�f�[�^�x�[�X��Rust�Ŏg�������Ƃ����ꍇ�ɂ͗L�͂ȑI�����ł��傤�B
�@�{�L���ł́AGitHub��Star����Diesel�ɕC�G���A�����̕~������r�I�ႭActix�ɂ��Ή����Ă���Ȃǂ̗��R�ŁASQLx�ɂ��f�[�^�x�[�X�A�N�Z�X�����グ�܂��B���p����RDBMS���A���炩���߃C���X�g�[���A�K�v�ȃZ�b�g�A�b�v���ς܂��Ă����Ă��������B�Ȃ��A�{�L���ł̓f�[�^�x�[�X��SQLite�𗘗p����Ƃ��ĉ����i�߂܂��BMySQL��PostgreSQL�𗘗p����ꍇ�ɂ��ẮA�K�v�ɉ����Č��y���܂��B
�@SQLx�����p����ɂ́ACLI�c�[���isqlx-cli�j���C���X�g�[�����Ă����ƕ֗��ł��Bcargo install�R�}���h�ɂāA�ȉ��̂悤��CLI�c�[�����C���X�g�[�����܂��B--features�I�v�V�����ŁASQLite���g�����Ƃ����Ă��܂��B
% cargo install sqlx-cli --no-default-features --features sqlite
�@SQLite���g���ꍇ�ɂ́Asqlx database create�R�}���h�Ńf�[�^�x�[�X���쐬���Ă����܂��B���炩���߁A�v���W�F�N�g�̃��[�g�iactix-posts�j�Ɉړ����Ă����Ă��������B�f�[�^�x�[�X�t�@�C������database.db�Ƃ��āA--database-url�I�v�V�����Ŏw�肵�܂��B�܂��A���ϐ�DATABASE_URL��ݒ肵�Ă����Ă������ł��B
% sqlx database create --database-url "sqlite:./database.db"
�@�Ȃ��A�f�[�^�x�[�X���폜����ɂ́Asqlx database drop�R�}���h�����s���܂��B
�@�����āA�}�C�O���[�V�����p�̃t�@�C�����쐬���܂��B�}�C�O���[�V�����Ƃ́A�f�[�^�x�[�X�̃X�L�[�}�i�\���j��V���̃o�[�W�����Ԃňڍs�����邱�Ƃ������܂��B�����ł́A�e�[�u���������Ȃ���ԂɁA���炩�̃e�[�u����lj�����A���邢�͂��̋t�Ƒ�����悢�ł��傤�B�}�C�O���[�V�����́Asqlx migrate add�R�}���h�Œlj����܂��B-r�I�v�V�������w�肷��ƁA�o�[�W�����A�b�v�ɉ����Č��ɖ߂����߂̃t�@�C�����쐬����܂��B�܂��A�����Ŏw�肷��create_posts_table�́A�e�[�u�����쐬����i�폜����j�}�C�O���[�V�����ł��邱�Ƃ��Ӗ����Ă��܂��B
% sqlx migrate add -r create_posts_table Creating migrations/20241110044413_create_posts_table.up.sql Creating migrations/20241110044413_create_posts_table.down.sql
�@�}�C�O���[�V�����t�@�C���́A�쐬�����migrations�t�H���_�ɒu����܂��B�����ł͏ڂ����G��܂��A�}�C�O���[�V�����t�@�C���ɂ͓������܂܂�邱�Ƃɒ��ӂ��Ă��������B����ɂ���āA�}�C�O���[�V�����̎��n�Ǘ�����܂��B
�@�쐬���ꂽ�t�@�C���̓R�����g�s�݂̂Ŏ����I�ɋ�Ȃ̂ŁA�}�C�O���[�V�����̖ړI�ł���e�[�u���쐬��DDL�������X�g1�̂悤�ɋL�q���܂��Bid����L�[�Ƃ��āA���̑��̃t�B�[���h�ɑS�Ĕ�NULL�����t�^���܂��B
CREATE TABLE posts ( id INTEGER PRIMARY KEY, posted DATETIME NOT NULL, sender TEXT NOT NULL, content TEXT NOT NULL );
�@���ɖ߂����߂̃t�@�C���ɂ��A�e�[�u���폜��DDL�����L�q���Ă����܂��i���X�g2�j�B
DROP TABLE posts;
�@�t�@�C���������ł�����Asqlx migrate run�R�}���h�Ń}�C�O���[�V���������s���܂��Brun�́A�o�[�W�����A�b�v�̃}�C�O���[�V���������s����T�u�R�}���h�ł��B
% sqlx migrate run --database-url sqlite:./database.db Applied 20241110044413/migrate create posts table (539.545µs)
�@�uApplied�c�v�Əo�͂����A�e�[�u���͍쐬����Ă��܂��B������ASQLite��CLI�c�[���ł���sqlite3�R�}���h�Ŋm���߂Ă݂܂��傤�Bpragma table_info(posts)�R�}���h�̎��s�ŁA�e�t�B�[���h���o�͂����ΐ����ł��B
% sqlite3 database.db SQLite version 3.43.2 2023-10-10 13:08:14 Enter ".help" for usage hints. sqlite> .tables �e�[�u���̕\�� _sqlx_migrations posts sqlite> pragma table_info(posts); �X�L�[�}�̕\�� 0|id|INTEGER|0||1 1|posted|DATETIME|1||0 2|sender|TEXT|1||0 3|content|TEXT|1||0 sqlite> .q �I��
�@���ɖ߂��Ƃ��̃R�}���h�͈ȉ��̂悤�ɂȂ�܂��B�e�[�u�����������čŏ������蒼���ۂɗL�p�ł��B
% sqlx migrate revert --database-url sqlite:./database.db
�@����܂ł̉�Ɠ��l�ɁA�����f�[�^��o�^���Ă����܂��B�ŏ��Ɉꗗ�\���ɂĊ�{�I�ȓ�����m�F�ł���悤�ɂ��邽�߂ł��B�����f�[�^�́ACSV�`���Ń��X�g3�̂悤�ɗp�ӂ��܂��B
id,posted,sender,content 1,2024-11-09 01:23:45,Nao,����ɂ��́B\n�܂�Rust����Ă܂��B\n�v���Ԃ�Ȃ̂ŋ�J���Ă܂��B 2,2024-11-10 12:34:56,Shino,����͂����l�ł��B\n����Rust�����ς�ł��B 3,2024-11-11 22:33:44,Yuutan,Rust�ʔ��������I\n�����قǂ͂܂�����B
�@�����f�[�^�́A�ȉ��̂悤��sqlite3�R�}���h�Ŏ�荞�߂܂��B
% sqlite3 ./database.db SQLite version 3.43.2 2023-10-10 13:08:14 Enter ".help" for usage hints. sqlite> .mode csv CSV���[�h�ɐ�ւ� sqlite> .import seed.csv posts --skip 1 �擪�s���X�L�b�v���ăC���|�[�g sqlite> select * from posts; ��荞���ʂ��m�F 1,"2024-11-09 01:23:45",Nao,"����ɂ��́B\n�܂�Rust����Ă܂��B\n�v���Ԃ�Ȃ̂ŋ�J���Ă܂��B" 2,"2024-11-10 12:34:56",Shino,"����͂����l�ł��B\n����Rust�����ς�ł��B" 3,"2024-11-11 22:33:44",Yuutan,"Rust�ʔ��������I\n�����قǂ͂܂�����B" sqlite> .q �I��
�@��������AWeb�A�v���Ƀf�[�^�x�[�X�����āAWeb API��Ή������܂��B
�@�A�v����SQLx���g����悤�ɁA�ˑ��W��lj����܂��B
% cargo add sqlx --features "sqlite runtime-tokio chrono" % cargo add dotenv
�@cargo add sqlx�R�}���h��--features�I�v�V�����́A�f�[�^�x�[�X��sqlite�A�������^�C����tokio�A�����Ǘ���chrono�A���ꂼ��𗘗p����w��ƂȂ��Ă��܂��B���̃f�[�^�x�[�X���g���ꍇ�ɂ́Amysql�Apostgresql�Asqlserver�ȂǂɕύX���܂��B
�@dotenv�́APython�ARuby�Ȃǂł��p��������ϐ��̂��߂̃��C�u�����ł��B.env�t�@�C���Ɋ��ϐ����L�q���Ă����������荞�ނ��Ƃ��ł���̂ŁA���ϐ��������ƂɎg�����������Ƃ��Ȃǂɕ֗��ł��B�����ł́A�v���W�F�N�g�̃��[�g��.env�t�@�C����p�ӂ��A������DATABASE_URL���ϐ����L�q���Ă������Ƃɂ��܂��i���X�g4�j�B
DATABASE_URL=sqlite:./database.db
�@���ϐ�DATABASE_URL�́A�f�[�^�x�[�X���ƂɈȉ��̂悤�ɐݒ�ł��܂��B���[�U�[���A�p�X���[�h�A�z�X�g���A�|�[�g�ԍ��A�f�[�^�x�[�X���͎��ۂ̊��ɍ��킹��K�v������܂��B
DATABASE_URL=sqlite:./database.db SQLite DATABASE_URL=mysql://mysql:password@localhost:3306/database MySQL DATABASE_URL=postgres://postgres:password@localhost:5432/database PostgrSQL
�@�f�[�^�x�[�X�𗘗p����ɂ́A�܂��ڑ��v�[�����A�v���ɓ������܂��B�ڑ��v�[���Ƃ́A��ʓI�ɂ̓R�l�N�V�����ƌĂ����̂ŁA�v�͐ڑ����Ǘ�����I�u�W�F�N�g�ł��i���X�g5�j�B
// ���O��Ԃ���荞�� use dotenv; use sqlx::sqlite::SqlitePool; use std::env; �c���c #[actix_rt::main] async fn main() -> Result<()> { �c���c // (1)���ϐ�DATABASE_URL�̎擾�Ɛڑ��v�[���̍쐬 dotenv::dotenv().expect(".env�̓ǂݍ��ݎ��s"); // .env�̓ǂݍ��� let database_url = env::var("DATABASE_URL") // DATABASE_URL�̎擾 .expect("DATABASE_URL���Z�b�g����Ă��܂���"); let pool = SqlitePool::connect(&database_url).await.unwrap(); // �ڑ��v�[���̍쐬 HttpServer::new(move || { let tera = Tera::new("templates/**/*.html").unwrap(); App::new() .app_data(web::Data::new(tera)) // (2)���[�e�B���O�ɐڑ��v�[����o�^���� .app_data(web::Data::new(pool.clone())) �c���c // (3)�f�[�^�x�[�X��API��o�^���� .service( web::scope("/api/db") .service(handler::api_index_db) .default_service(web::to(handler::api_not_found)) ) �c���c
�@���ϐ�DATABASE_URL���擾���A��������ڑ��v�[�����쐬���鏈�����i1�j�ł��Bdotenv::dotenv()�̌Ăяo���ŁA.env�t�@�C��������ϐ����擾���A�Z�b�g���܂��Benv::var()�̌Ăяo���ŃZ�b�g���ꂽ���ϐ����擾���܂��B�����ꂩ�����s����v���O�������I�����܂��BSqlitePool::connect()���\�b�h�ɐڑ��������n�����ƂŁA�ڑ��v�[�����쐬����܂��B
�@�쐬���ꂽ�ڑ��v�[���́A���[�e�B���O�ŌĂяo�����n���h���[���Ŏ���K�v������̂ŁAweb::Data�\���̂Ƀ��b�v�����ڑ��v�[�����Aapp_data���\�b�h�ɂēo�^���܂��Bapp_data���\�b�h�̓����ɂ��ẮA��3������4���ŏЉ�Ă���̂ŁA��������Q�Ƃ��Ă��������B
�@�Ō�ɁA�f�[�^�x�[�X�ł�API�ƂȂ�n���h���[�������[�e�B���O�ɓo�^���܂��Bservice���\�b�h�̎g��������3���ŁAscope���\�b�h�̎g��������6���ŏЉ�Ă���̂ŁA��������Q�Ƃ��Ă��������B�����ł́A"/api"���O��"/api/db"��o�^���Ă��邱�Ƃɒ��ӂ��Ă��������B
�@�n���h���[���ł́A�ڑ��v�[��������ăf�[�^�A�N�Z�X�����Ăяo���܂��B���X�g6�́A�S���擾�̊�api_index_withdb�ł��B
use sqlx::sqlite::Sqlite; use sqlx::pool::Pool; #[get("/posts")] // (1)������web::Data�\���̂�lj����Đڑ��v�[������� pub async fn api_index_withdb(pool: web::Data<Pool<Sqlite>>, query: web::Query<Queries>) -> impl Responder { let param = query.into_inner(); // (2)�ڑ��v�[�������o���ăf�[�^�x�[�X�A�N�Z�X�����Ăяo�� let pool = pool.get_ref(); let posts = data::get_all_db(pool.clone()).await; // (3)�ȍ~�̓t�@�C���łƓ����Ȃ̂ŏȗ� let mut ary = Vec::new(); �c���c }
�@�n���h���[���ł́A�i1�j�̂悤��app_data���\�b�h�Œlj����ꂽweb::Data�\���̂����܂��B�i2�j�ł́A���b�v���Ă���Pool<Sqlite>�\���̂ւ̎Q�Ƃ�get_ref���\�b�h�Ŏ��o���Adata::get_all_withdb���\�b�h�ɗ^���Ă��܂��B���̃��\�b�h�͌�q���܂����A�f�[�^�x�[�X�ł̈ꗗ�擾���ł��Bawait���t���Ă���̂́A���̊��͔����Ƃ��č쐬���邩��ł��B
�@�i3�j�ȍ~�́A�t�@�C���łƓ����ł��B�z�z�T���v�����Q�Ƃ��Ă��������B
�@��L��data::get_all_withdb���́Adata.rs�t�@�C���Ƀt�@�C���łƓ����悤�ɋL�q���܂��i���X�g7�j�B
use sqlx::sqlite::Sqlite; use sqlx::pool::Pool; // (1)�f�[�^�x�[�X�p�̍\���̂�p�� #[derive(Debug, Clone)] pub struct Post { pub id: i64, // ID pub posted: NaiveDateTime, // ���e���� pub sender: String, // ���e�Җ� pub content: String, // ���e���e } // (2)�f�[�^�x�[�X�ł̈ꗗ�擾�� pub async fn get_all_withdb(pool: Pool<Sqlite>) -> Vec<Message> { // (3)�N�G���̍쐬�Ɣ��s let posts = sqlx::query_as!( Post, "select id, posted, sender, content from posts order by posted desc" ) .fetch_all(&pool) .await.unwrap(); // (4)Vec<Post>����Vec<Message>���쐬���ĕԂ� let mut messages: Vec<Message> = Vec::new(); for post in posts { let message = Message {id: post.id as i32, posted: post.posted.to_string(), sender: post.sender, content: post.content}; messages.push(message); } messages }
�@�f�[�^�x�[�X�ɂ�posts�e�[�u�����쐬���܂������A���̃e�[�u����Message�\���̂ƌ݊���������܂���i�����t�B�[���h�Ȃǂ��܂ނ��߁j�B���̂��߁A�i1�j�̂悤�ɕʂ�Post�\���̂��`���A���݂Ƀt�B�[���h��ϊ����Ă��Ƃ肵�܂��B
�@�f�[�^�x�[�X�ł̈ꗗ�擾��get_all_withdb���i2�j�ł��BSQLx�̊��͔��ł���̂ŁA�����ƂȂ��Ă��܂��B�����ɁA�n���h���[������n�����ڑ��v�[�������܂��B
�@�N�G�������Ĕ��s���Ă���̂��i3�j�ł��BSQLx�ɂ̓N�G�����s�̕��@���������A�傫�������ă}�N�����g���������g�����Aquery���g����query_as���g�����̌v4�p�^�[���ɕ�����܂��B�����ł́A���S�ɃN�G�����ʂ��\���̂Ƀ}�b�v�ł���query_as!�}�N���̗�������܂��B
�@query_as!�}�N���́A�����̍\���̂̃t�B�[���h�ƃN�G�������̃t�B�[���h���������Ή����Ă��邩�ǂ����A�^���܂߂ăr���h���Ƀ`�F�b�N���܂��B�Ⴆ��SQLite�̏ꍇ�A��ȃt�B�[���h�̌^�i�Ƃ��̐���j��Rust�ɂ�����^�͕\1�̂悤�ɑΉ����܂��B
SQLite�^ | Rust�^ | ���l |
---|---|---|
integer | i64 | i32�Ȃǂ͎g�p�ł��Ȃ� |
text not null | String | NULL�łȂ����Ƃ��ۏ���Ă���̂� |
text | Option<String> | NULL�ł���ꍇ�ɂ�None�ƂȂ� |
datetime | chrono::NativeDateTime | ���t�����Ǘ���chrono���w�肵���ꍇ |
�\1�FSQLite�̌^��Rust�̌^�̑Ή� |
�@�^�̕s��v������R���p�C���G���[�ƂȂ�̂ŁA���݂��Ȃ��t�B�[���h��^�������Ă��Ȃ������Ƃ��������O�ɉ���ł��܂��B
�@�X�V�n�����Ă݂܂��傤�i���X�g8�j�B
pub async fn create_withdb(pool: Pool<Sqlite>, mut message: Message) -> Message { // Message��Post�ɕϊ����� let post = Post { id: 0, posted: NaiveDateTime::parse_from_str(&message.posted, "%Y-%m-%d %H:%M:%S").unwrap(), sender: message.sender.clone(), content: message.content.clone()}; // (1)query!�}�N���ŃN�G���s let result = sqlx::query!( "insert into posts(posted, sender, content) values (?, ?, ?)", post.posted, post.sender, post.content) .execute(&pool) .await.unwrap(); // (2)�}�����R�[�h��id���Z�b�g���ĕԂ� message.id = result.last_insert_rowid() as i32; message }
�@�X�V�n�ł́A���ʂ��\���̂Ƀ}�b�v����K�v���Ȃ��̂ŁAquery_as!�}�N���ɑւ��query!�}�N�����g���܂��B�i1�j�̂悤�Ɋ�{�I�Ȏg�����͓����ł����A�}�N���̈����ɍ\���̂��Ȃ����ƁAfetch�n���\�b�h�ł͂Ȃ�execute���\�b�h���g�����Ƃ��قȂ�܂��B�܂��A�N�G�����p�����[�^�[���܂ނ̂ŁA�������}�N���̈����Ɋ܂߂Ă��܂��B
�@�i2�j�ł́A�N�G�����ʂ���last_insert_rowid���\�b�h���Ăяo���č쐬�������R�[�h��id���擾���A���̖߂�l�Ɋ܂߂Ă��܂��B�Ȃ��APostgreSQL�ł�returning���Ō��ʂ�Ԃ����Ƃ��ł���̂ŁA���̏ꍇ��query_as!�}�N�����g���Č��ʂ��}�b�v����A���l�̏����ƂȂ�܂��B�܂��A�N�G���p�����[�^�[��$1, $2�c�c�ƂȂ�܂��B
�@���̑���API�n���h���[���\�b�h��f�[�^�x�[�X�A�N�Z�X���ɂ��ẮA�z�z�T���v�����Q�Ƃ��Ă��������B�܂��A�A�v�����N������curl�R�}���h�Ȃǂ��烊�N�G�X�g�s���ē�����m�F���Ă݂Ă��������B
�@����́ARust�ɂ�����f�[�^�x�[�X�V�X�e���̗��p���Љ�܂����B�ɂ߂ėe�ՂɁA������Rust�Ȃ�ł͂̈��S�����������f�[�^�x�[�X�A�N�Z�X���ł��邱�Ƃ����`���ł����̂ł͂Ȃ����Ǝv���܂��B
�@����ɂāAWeb�A�v���J����ʂ���Rust�̊��p�@���Љ��{�A�ڂ͏I���ƂȂ�܂��B�ǎ҂ɁA����Ȃ�����l����ꂽRust�ɂ��Web�A�v���J���̖��͂������ł����`���ł����Ȃ�K���ł��B
WINGS�v���W�F�N�g
�L����� WINGS�v���W�F�N�g���^�c����A�e�N�j�J�����M�R�~���j�e�B�[�i��\�R�c�ˊ��j�B���Web�J������̏��Ё^�L�����M�A�|��A�u�����L����|����B2021�N10�����_�ł̓o�^�����o�[��55�l�ŁA���݂����M�����o�[���W���B�����̂�����́A�ǂ��ǂ����咸�������B�����A�L�������B
�E�T�[�o�[�T�C�h�Z�p�̊w�ю� - WINGS�ihttps://wings.msn.to/�j
�ERSS�ihttps://wings.msn.to/contents/rss.php�j
�EX: @WingsPro_info�ihttps://x.com/WingsPro_info�j
�EFacebook�ihttps://www.facebook.com/WINGSProject�j
Copyright © ITmedia, Inc. All Rights Reserved.