| CARVIEW |
AI?`???b?g?v???O?????ŁASpring AI?J???̊?{?I?ȗ???????????FSpring AI?Ŏn?߂鐶??AI?v???O???~???O?i2?j
Java?~Spring AI?Ŏn?߂?AI?v???O???~???O?̓???A?ځB?O??́ASpring AI??????܂ł̗?????Љ?܂????B????́ASpring AI?̎?ȓ????ł???AI?`???b?g???s????ł̊?{?I?ȗ???ƁA???̗????ɕK?v?ƂȂ??{?I?ȊT?O????????܂??B
???̋L???͉??????ł??B????o?^?i?????j????ƑS?Ă????????????܂??B
?A?ځFSpring AI?Ŏn?߂鐶??AI?v???O???~???O
?{?A?ڂ̃T???v???R?[?h??GitHub?Ō??J???Ă??܂??B??????????_?E?????[?h???Ă݂Ă????????B
?ڎ?
ChatClient?Ƃ??̑S?̑?
?@Spring AI?ł̃v???O???~???O?ɂ????Ċ?{?ƂȂ?N???X??ChatClient??????܂??BSpring AI?̃??t?@?????X?Ȃǂ?????ƁA?`???b?g?̂??߂̃N???X??ChatModel??????܂??BChatModel??ChatClient?????ŗ??p????Ă???̂ŁAChatModel?ł̎???̑?????ChatClient???g???Ă??????\?ł??B????ɁAChatModel?𗘗p????R?[?h???Љ??Ă???P?[?X?ł??A?قƂ?ǂ?ChatModel?ł͂Ȃ?ChatClient?𗘗p????????֗??ł??B???̂??ߖ{?L???ł́AChatClient?𒆐S?ɏЉ?Ă????܂??B
?@ChatClient?́A?ȉ??̂悤?ȃN???X?𗘗p???āA????̈Ӗ??????߂??A???̉?AI?i?l?H?m?\?j???f??????擾???܂??B
- Media?F?摜?≹???Ȃǃe?L?X?g?f?[?^?ȊO?̃??\?[?X?B???????A????????Spring AI?̊T?O?ł͂Ȃ??ASpring Framework?̋??ʗv?f
- Message?FSpring AI??ň???AI???f???ւ̎????w???A?܂??͉??ʂȂǂ̃??b?Z?[?W???
- Prompt?FAI?ɂ?????u?v?????v?g?v?Ɠ??l?ŁA??????Message??ێ??ł???
- Advisor(s)?FChatClient API?S?̂??ǂ̂悤??AI?t???[?????[?N?Ƃ??ċ@?\???邩?Ȃǂ̃??[????⏕?@?\???Ǘ?
?@?}1?́A?????̊W???܂Ƃ߂????̂ł??B?܂??́A??̓I?ȃR?[?h??????O?ɁA?傴???ςȃN???X?̊W??c?????Ă????????B
ChatClient?ɂ???{?I?ȃ`???b?g?v???O????
?@????ł́A??̓I?ȃ`???b?g?v???O???????쐬???Ă݂܂??傤?B???X?g1?́A?ȒP?ȃe?L?X?g?ɂ?鎿??Ƃ???ɉ???AI?`???b?g?v???O?????̗?ł??B
// ?E?E(?ȗ?)
@ShellMethod(key = "chat-client")
public String chatClientPrompt(String message){
// (1) ?œK??ChatModel?̎擾
ChatModel model = context.getBean(ChatModel.class);
// (2) ChatClient?C???X?^???X?̍쐬
ChatClient client = ChatClient.builder(model).build();
// (3) ???b?Z?[?W?̍쐬
UserMessage userMessage = new UserMessage(message);
// (4) ?v?????v?g?̍쐬
Prompt prompt = new Prompt(userMessage);
// (5) ???N?G?X?g?f?[?^?̍쐬
ChatClient.ChatClientRequestSpec request = client.prompt(prompt);
// (6) ?????̎??s
ChatClient.CallResponseSpec response = request.call();
// (7) ???????ʂ̎擾
return response.content();
}
?@?i1?j?ł́AChatModel???擾???܂??B?????ł?ChatModel?Ƃ́A?u?ǂ?AI?x???_?[?⌾?ꃂ?f?????g?p???邩?v?Ƃ??????AAPI???s???̊e??p?????[?^?[?ƁA???ۂ?API?????s???邽?߂̃C???X?^???X??ێ????邽?߂̃C???X?^???X?Ɨ???????Ƃ悢?ł??傤?B
?@?Ȃ??ASpring Framework?̗??p?o?????Ȃ??????ƁAcontext.getBean?????????Ă???̂??^??Ɏv??????????܂???B?????ł???context?Ƃ́ASpring?ɂ?????ApplicationContext?ł??BApplicationContext?́A?A?v???P?[?V?????S?̂ŃC???X?^???X???Ǘ????Ă???A??????ChatModel.class???w?肷?邱?ƂŁA???̃A?v???P?[?V?????ɓo?^????Ă???ChatModel?̃C???X?^???X???擾?ł??܂??B
?@?????̃C???X?^???X?????ۂɍ쐬???Ă???̂́ASpring Boot?t???[?????[?N?ł??B?O???A???????ɕK?v?Ȑݒ?t?@?C???Ƃ???application.properties?̋L?q???@?ȂǏЉ?܂??????A???̐ݒ?ɏ]????Spring Boot???œK?ȃC???X?^???X???쐬???܂??B???̂??߁A?v???O?????̗??p????getBean???\?b?h?????œK?ȃC???X?^???X???擾?ł??܂??B
?@ChatModel???擾?ł?????A????????ChatClient?̃C???X?^???X???쐬?ł???̂Łi2?j?AMessage?i3?j?APrompt?i4?j?C???X?^???X???A???N?G?X?g??g?ݗ??Ă܂??i5?j?B
?@???N?G?X?g?????ۂɑ??M????̂?call???\?b?h?̖????ł??i6?j?B???N?G?X?g?ւ̉?????CallResponseSpec?C???X?^???X?Ƃ??ĕԂ???܂??BCallResponseSpec?C???X?^???X?????content???\?b?h?Ō??ʁi??????j???擾?ł??܂??i7?j?B
?@?ȏ?𗝉???????A?T???v???????s???Ă݂܂??傤?B?ȉ??́A???X?g1???Ăяo???R?}???h?ƁA???̌??ʗ?ł??B
shell:>chat-client ?n???̉??g???̌????ɂ͎?ɂǂ?Ȍ??????l?????܂????H?Ȍ???50?????ȓ??ŋ????ĉ????? ?n?????g???̎?Ȍ????́A???????ʃK?X?̔r?o?????ł??B
?@?ȏ?ASpring AI?ɂ??R?[?h?̊?{?I?ȗ???𗝉??ł????Ƃ???ŁA????????̓??b?Z?[?W?A?v?????v?g?ȂǁA???N?G?X?g???\??????ʂ̗v?f?ɂ??Č??Ă????܂??B
???b?Z?[?W?ɂ???
?@Spring AI?ł́A?v?????v?g?ɓ??͂???鎿???w???Ȃǂ̃f?[?^??????ŕ??ނ??Ă??܂??B?????āA?????̖????iRole?j?????f?[?^??Message?ƌĂ?ł??܂??BMessage???̂??̂̓C???^?t?F?[?X?ł???A???ۂɂ͈ȉ??̂悤?Ȏ????N???X?𗘗p???邱?ƂɂȂ?܂??B
- UserMessage?iUSER?j?F????Ȃǃ??[?U?[?????p???邽?߂̃??b?Z?[?W?Ȃ?
- SystemMessage?iSYSTEM?j?F??b?S?̂̑O???V?X?e???I?ɕK?v?ȃ??b?Z?[?W?Ȃ?
- AssistantMessage?iASSISTANT?j?FAI????̉Ȃǂ̃??b?Z?[?W?Ȃ?
?@????ȊO?ɂ??O???c?[???Ƃ̘A?g?ɗ??p?ł???ToolResponseMessage?̂悤?ȃN???X??????܂????A??????͂??Ă͎???ȍ~?ʼn??߂ďЉ?܂??B??肠?????A?????ł?USER?ASYSTEM?AASSISTANT???b?Z?[?W?ɍi???āA???ꂼ??̖????𗝉????܂??B
?@?????̃`???b?g?V?X?e???ł́AAI?Ɨ??p?҂??R?~???j?P?[?V??????????ŋ??ʂ̑O?݂????Ă??܂??B?Ⴆ?ΐ}2?ł???A?i1?j?????̑O??ƂȂ?V?X?e???ւ̎w???ł??B?i2?j?̂悤?ɉł??Ȃ????₪?????Ă????ꍇ?ɂ??A?i1?j?̏????Ɋ?Â??āu??????܂???v?Ƃ????𑣂????Ƃ??ł??܂??B
?@????̖ړI????????AI?V?X?e???ł́A?K?????????p?҂̑S?Ă̎????AI???f??????????K?v?͂???܂???B?T?[?r?X?͈̔͊O?̎????w???ɂ͓????Ăق????Ȃ??Ƃ??????P?[?X??????܂??B???̂悤?ȏꍇ?́A?i1?j?̏?????w???́A???ڍׂɐݒ肳???ł??傤?B
?@?????āA???ꂼ??̗??p?҂???̓??͂ɉ????āi2?j?`?i5?j?̂悤?Ƀ??[?U?[?ƃV?X?e???Ƃ????b?Z?[?W?????????邱?ƂɂȂ?܂??B
?@???̂悤?ɁA???b?Z?[?W?ɖ????????????邱?ƂŁA?u???ꂼ??̃??b?Z?[?W???ǂ̂悤?Ɉ??????v?u?ė??p???K?v?ȏꍇ?ɂǂ?????悢???v?Ƃ????????Ƃ??AChatClient?????f?ł???悤?ɂȂ?킯?ł??B
???b?Z?[?W?̋?̗?
?@?ł́A?????̃??b?Z?[?W?𗘗p??????????Ă݂܂??傤?i???X?g2?j?B
// ?E?E(?ȗ?)
@ShellMethod(key = "message-create")
public String createMessage(String userText){
// (1) SYSTEM?̃??b?Z?[?W???쐬
SystemMessage systemMessage = new SystemMessage("???Ȃ??͐??Ƃ̂??߂?AI?A?V?X?^???g?ł??B?B???ȉ?s?m???ȏꍇ?ɂ́u?킩??܂???v?Ɠ????Ă????????B");
// (2) USER?̃??b?Z?[?W???쐬
UserMessage userMessage = new UserMessage(userText);
// (3) ?v?????v?g???쐬
Prompt prompt = Prompt.builder()
.messages(systemMessage,userMessage).build();
ChatModel model = context.getBean(ChatModel.class);
ChatClient client = ChatClient.builder(model).build();
ChatClient.CallResponseSpec response = client.prompt(prompt).call();
var result = response.chatResponse().getResult();
if(result != null){
// (4) ASSISTANT?̃??b?Z?[?W???擾
AssistantMessage message = result.getOutput();
return message.getText();
}
else{
return "?G???[";
}
}
?@???s????ƁA?ȉ??̂悤?ɂȂ?܂??B
shell:>message-create ???{?͍???C???t???ɂȂ?܂????H?f?t???ɂȂ?܂???
?킩??܂???B?C???t????f?t???̏????̓????́A???܂??܂Ȍo?ϗv?????A???ۓI?ȏɂ???ĉe??????邽?߁A??̓I?ȗ\???͓???ł??B
?@?i1?j?ł?SYSTEM?^?̃??b?Z?[?W???A?i2?j?ł͗??p?҂???̓??͂?????USER?^?̃??b?Z?[?W???A???ꂼ??쐬???Ă??܂??B?????āi3?j?ł́A?????̕????̃??b?Z?[?W?????????߂?Prompt???APrompt.Builder?ł܂Ƃ߂܂??B
?@?Ȃ??A?????ł?AI????̉?????content???\?b?h?ł͂Ȃ??AgetResult???\?b?h?Ŏ擾???Ă??܂??BgetResult???\?b?h?̖߂?l??ChatResult?^?\?\???????b?Z?[?W?͂??????A?????ɔ??????^?????܂I?u?W?F?N?g?ł??B?????ł́A????getOutput???\?b?h?Ń??b?Z?[?W?iAssistantMessage?I?u?W?F?N?g?j???擾???Ă??܂??B
?摜??p?????v?????v?g?̍쐬
?@?摜?????Ɏ??₵?????ꍇ??????܂??B???̏ꍇ?ɂ́AMedia?????b?Z?[?W?ɒlj????܂??B
?@?Ⴆ?A???X?g3?͎w?肵???摜?ɑ??Ď???ł???悤?ɂ?????ł??B
@ShellMethod(key = "message-image")
public String imageMessage(String filename,String userText){
File file = new File(filename);
ChatModel model = context.getBean(ChatModel.class);
ChatClient client = ChatClient.builder(model).build();
// (1) ?摜?t?@?C????Media?ɕϊ?
FileSystemResource resource = new FileSystemResource(file);
Media media = new Media(MimeTypeUtils.IMAGE_PNG, resource);
// (2) UserMessage?ɉ摜(???f?B?A)??Y?t
UserMessage userMessage = UserMessage.builder().text(userText).media(media).build();
// (3) Prompt???쐬
Prompt prompt = Prompt.builder()
.messages(userMessage)
.build();
return client.prompt(prompt).call().content();
}
?@?|?C???g?͈ȉ??̒ʂ?ł??B
?i1?jMedia?I?u?W?F?N?g???쐬????
?@?摜?t?@?C???𗘗p????ɂ́ASpring?t???[?????[?N?̋??ʌ^?ł???Resource?^?ɕϊ???????ŁA?^??錾????Media?I?u?W?F?N?g???쐬???܂??B
?@???????A?ǂ?Ȍ^?iMIME?^?C?v?j?ł??w??ł???킯?ł͂???܂???B?Ⴆ??OpenAI?̏ꍇ?A?摜?ł???Ζ?肠??܂???ł??????APDF?iPortable Document Format?j?͗??p?ł??܂???ł????B???̂??߁APDF?f?[?^???摜?ɕϊ?????A???????̓e?L?X?g?f?[?^?ɕϊ?????Ȃǂ̏??????J???҂??d???K?v??????܂??B
?@?Ȃ??A????̗?ł?OpenAI?𗘗p???Ă??܂????A???p?ł??郁?f?B?A?̐????́A???p????LLM???f???ɂ???Ă??قȂ?ꍇ??????܂??B??̓I?Ȑ????ɂ??ẮASpring AI???h?L???????g???Q?Ƃ??Ă????????B
?i2?jUseMessage?I?u?W?F?N?g???쐬????
?@?????āA????????Media?I?u?W?F?N?g?Ɋ?Â??āAUserMessage?I?u?W?F?N?g???쐬???܂??B??قǂ?text???\?b?h?Ń??[?U?[????̃??b?Z?[?W???w?肷?邾???ł??????A?????ł?media???\?b?h?ʼn摜?𑩂˂Ă??܂??B
?i3?jPrompt?I?u?W?F?N?g??????
?@???Ƃ́APrompt?ɑ???UserMessage??g?ݍ???ŏI???ł??B?O?q?????悤?ɁABuilder?N???X???g???ăC???X?^???X???쐬???邱?ƂŁA???܂??܂Ȍ^?̈??????K?v?ȏꍇ?ł??C???X?^???X?????₷???Ȃ??Ă??܂??B
?@?ȏ?𗝉???????A?T???v???????s???Ă݂܂??傤?B?ȉ??́A???s?R?}???h?Ƃ??̌??ʂł??B
shell:>message-image image.png ???̉摜?ŋL????Ă???????͉??ł??? ???̉摜?́AQuick2PDF?Ƃ????T?[?r?X?̏Љ?y?[?W?̂悤?ł??B??ȓ????͈ȉ??̒ʂ?ł??F // (?ȗ?) ???̃T?[?r?X?́A??Ƃ??????I??PDF??????菕???????邱?Ƃ?ړI?Ƃ??Ă??܂??B
?@?摜???̕????f?[?^?Ȃǂ??擾?ł??AAI-OCR?̂悤?Ȏg???????ł??܂??B???????A???̏ꍇ?́A???ʂ?AI?x???_?[???Ƃ?OCR?iOptical Character Recognition?j?̐??\?ɂ????E?????\????????܂??B?p?r?ɉ?????AI?x???_?[???g????????Ȃǂ̕K?v???o?Ă??邩??????܂???B
???????l???????`???b?g?v???O????
?@?????܂ł́A?P???̖₢??????O??Ƃ????R?[?h???Љ?܂??????A?Ⴆ?Ή摜?t?@?C???Ȃǂ͖???w?肷??͖̂ʓ|?ł????A?????????V?X?e?????b?Z?[?W?͏???Ɉ?x???????s?????悢?͂??ł??B
?@?????Ŗ{?߂ł́A????????????????b?̗???Љ?܂??B????ɂ́AAdvisor?@?\?̈?ł???MessageChatMemoryAdvisor???g???܂??B
?@Advisor?Ƃ́A?`???b?g?S?̂̉?b???L??????Ƃ??̃??[?????Ǘ????邽?߂̊?Ղł??BAdvisor??ݒ肷?邱?ƂŁA???炩???ߗp?ӂ??ꂽ???[????O??Ƃ??????쐬???Ă????悤?ɂȂ?܂??BMessageChatMemoryAdvisor?́A?܂??Ƀ`???b?g?̓??e???L?????邽?߂̃??[???ł??B
?@?ł́A??̓I?ȗ?????Ă????܂??i???X?g4?j?B
@ShellMethod(key = "client-start")
public String startClient(String systemMessage){
ChatModel model = context.getBean(ChatModel.class);
// (1) ChatMemory?C???X?^???X???擾
ChatMemory chatMemory = context.getBean(ChatMemory.class);
// (2) ??????ۑ?????Advisor?C???X?^???X???쐬
MessageChatMemoryAdvisor chatAdvisor = MessageChatMemoryAdvisor.builder(chatMemory).build();
this.client= ChatClient.builder(model)
.defaultAdvisors(chatAdvisor) // (3) ChatClient?ɐݒ?
.build();
var response = client.prompt(new Prompt(new SystemMessage(systemMessage))).call();
return response.content();
}
@ShellMethod(key = "client-user")
public String textPrompt(String message){
return client.prompt(new Prompt(new UserMessage(message))).call().content();
}
?@?`???b?g????ۑ?????̂́AChatMemory?I?u?W?F?N?g?̖????ł??B????܂łƓ??????AgetBean???\?b?h?o?R?ŃC???X?^???X???擾???܂??BSpring Boot?ł́A?f?t?H???g??MessageWindowChatMemory?I?u?W?F?N?g???擾???܂??BMessageWindowChatMemory?̓`???b?g???????Ǘ????邽?߂̃N???X?ł??B
?@???Ƃ́A?쐬????ChatMemory????ɁAAdvisor?iMessageChatMemoryAdvisor?j???쐬???i2?j?AChatClient?ɑg?ݍ??ނ????ł??i3?j?B
?@?ȏ?𗝉???????A?T???v???????s???Ă݂܂??傤?B?ȉ??͎??s?R?}???h?ƁA???̌??ʂł??B
shell:>client-start ???Ȃ??͊ȒP?ȎZ??????????AI?{?b?g?ł?
?͂??A?ȒP?ȎZ???ɂ??ċ????邱?Ƃ??ł??܂??B?ǂ?Ȗ???g?s?b?N?ɂ??Ċw?т????ł????H?????Z?A?????Z?A?|???Z?A????Z?A?܂??͑??̂??Ƃł????v?ł??B
shell:>client-user 1+1??
1 + 1 ?? 2 ?ł??B???????̎Z???̖?肪????A???m?点?????????I
shell:>client-user ???̌??ʂ?3???|???Ă???????
2 ?? 3 ???|????ƁA2 ?~ 3 = 6 ?ł??B???????Ɍv?Z?????????Ƃ?????????Ă????????I
shell:>client-user ???̌??ʂ?4???|???Ă???????
6 ?? 4 ???|????ƁA6 ?~ 4 = 24 ?ł??B????Ɍv?Z?????????Ƃ?????A???m?点?????????I
shell:>client-user ?ŏ??̑????Z???ʂ?2???????Ă???????
?ŏ??̑????Z?̌??ʂ? 2 ?ł????̂ŁA?????? 2 ????????ƁA2 + 2 = 4 ?ł??B???Ɍv?Z?????????Ƃ?????????Ă????????I
?@???Ȃ݂ɁAMessageWindowChatMemory?N???X?ł̓f?t?H???g??20?̃??b?Z?[?W?𗚗??Ƃ??ĕۑ????܂??B???̒l??ύX????ɂ́A???X?g5?̂悤?ȃR?[?h??Spring?̐ݒ?t?@?C???ɑ??Ēlj????܂??B
// (1) Spring Framework?p?̐ݒ?N???X
@Configuration
public class ChatConfiguration {
// (2) Bean?Ƃ??Đݒ?
@Bean
ChatMemory chatMemory(){
return MessageWindowChatMemory.builder()
.maxMessages(2) // (3) ?ő嗚??ێ?????ύX
.build();
}
}
?@@Configuration?A?m?e?[?V?????i1?j?́A???̃N???X??Spring?̐ݒ?t?@?C???ł??邱?Ƃ????????̂ł??B
?@???Ƃ́ASpring Context??ň?????Bean?C???X?^???X?Ƃ??āAMessageWindowChatMemory??o?^???܂??B???̗?ł́AMessageWindowChatMemory?̗???ێ?????2?ɐݒ肵?Ă??܂??i3?j?B
?@???̂悤??Configuration?p?̃N???X??ʂɒ?`???邱?ƂŁA??قǂ̃R?[?hChatMemory?𗘗p????R?[?h?ɂ͉????ύX?????????A???ۂ̓????ύX???邱?Ƃ??ł??܂??B
?@?ȏ?𗝉???????A??????x????????Ŏ??s???Ă݂܂??傤?B?ȉ??́A???s?R?}???h?Ƃ??̌??ʂł??B
shell:>client-start ???Ȃ??͊ȒP?ȎZ??????????AI?{?b?g?ł?
????ɂ??́I?ȒP?ȎZ?????????邨??`???????܂??B?ǂ?Ȗ??????????????ł????H?????Z?A?????Z?A?|???Z?A????Z?̒?????I??ł????????B?܂??A??̓I?Ȗ?肪????????Ă????????ˁB
shell:>client-user 1+1??
1 + 1 ?? 2 ?ł??I???Ɏ??₪????????Ă????????ˁB
shell:>client-user ???̌??ʂ?3???|???Ă???????
1 + 1 ?̌??ʂł??? 2 ?? 3 ???|????ƁA2 ?~ 3 = 6 ?ɂȂ?܂??B
shell:>client-user ???̌??ʂ?4???|???Ă???????
?O??̌??? 6 ?? 4 ???|????ƁA6 ?~ 4 = 24 ?ɂȂ?܂??B
shell:>client-user ?ŏ??̑????Z???ʂ?2???????Ă???????
?ŏ??̑????Z?̌??ʂ? 6 ?ł????̂ŁA????? 2 ????????ƁA6 + 2 = 8 ?ɂȂ?܂??B
?@???̂悤?ɁA??????2?????????Ȃ????߁A?Ӑ}???????ʂɂȂ炸?ɁA?u?ŏ??̑????Z???ʁv??2?O?̌??ʂł???u6?v?Ƃ????l???g???Ă??܂??Ă??܂??B???????A?ŏ??Ɏw?肵??SYSTEM???b?Z?[?W?͕ێ?????܂??̂ň??S???Ă????????B???̂悤?ɁAMessage?̖????ɂ???ĐU?镑????ς???Ȃǂ̎?????Advisor?ɂ???čs???܂??B
?܂Ƃ?
?@????́AAI?`???b?g?Ɏ????w???𑗂?܂ł̗???ɂ??ďЉ?܂????B???????A???ۂ̃V?X?e???ł?AI???f?????Ԃ??e?L?X?g?????̂܂g???ƕs?s?????????邱?Ƃ?????܂??B
?@?????Ŏ???́A???̂悤?Ȍ??ʂ??v???O???????????₷???悤?ɁA???̃t?H?[?}?b?g???J?X?^?}?C?Y???邽?߂̗??p???@?𒆐S?ɉ?????܂??B
?M?ҏЉ?
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.
?A?C?e?B???f?B?A????̂??m?点
??IT eBook
?ҏW??????̂??m?点
RSS?ɂ???
?A?C?e?B???f?B?AID?ɂ???
???[???}?K?W???o?^
??IT?̃??[???}?K?W???́A ???????A???ׂĖ????ł??B???Ѓ??[???}?K?W???????w?ǂ????????B
ITmedia?̓A?C?e?B???f?B?A??????Ђ̓o?^???W?ł??B
???f?B?A?ꗗ | ????SNS | ?L???ē? | ???₢???킹 | ?v???C?o?V?[?|???V?[ | RSS | ?^?c??? | ?̗p??? | ??????







