Zenet Tech Blog 技術系の話を中心にまとめた株式会社ゼネットのテックブログです 2024-03-25T09:38:24+09:00 zenet-tech Hatena::Blog hatenablog://blog/26006613699554460 S/4HANA Cloudの拡張開発について~In-App拡張~ hatenablog://entry/6801883189091782220 2024-03-25T09:38:24+09:00 2024-03-25T09:38:24+09:00 はじめに 拡張方式の紹介 In-App拡張 Side-by-Side拡張 機能の紹介 カスタム項目 カスタムCDSビュー カスタム分析クエリ カスタムタイル まとめ 参考資料 はじめに この記事ではSAP(企業内の全ての業務を一元的に管理するシステム)の一つである、S/4HANA Cloudの拡張機能の一つであるIn-App拡張について記載しています。 もう一つの拡張方式であるSide-by-Side拡張については過去の記事をご覧ください。 media.zenet-web.co.jp 拡張方式の紹介 In-App拡張 SAP S/4HANA Cloud内に提供されている、カスタマイズ用アプリケ… <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/z/zenet-tech/20240325/20240325093629.png" width="500" height="266" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <p><br /><ul class="table-of-contents"> <li><a href="#はじめに">はじめに </a></li> <li><a href="#拡張方式の紹介"> 拡張方式の紹介 </a><ul> <li><a href="#In-App拡張"> In-App拡張</a></li> <li><a href="#Side-by-Side拡張"> Side-by-Side拡張</a></li> </ul> </li> <li><a href="#機能の紹介">機能の紹介</a><ul> <li><a href="#カスタム項目">カスタム項目</a></li> <li><a href="#カスタムCDSビュー">カスタムCDSビュー</a></li> <li><a href="#カスタム分析クエリ">カスタム分析クエリ </a></li> <li><a href="#カスタムタイル">カスタムタイル</a></li> </ul> </li> <li><a href="#まとめ">まとめ</a></li> <li><a href="#参考資料">参考資料</a></li> </ul> <h3 id="はじめに">はじめに </h3> <p>この記事ではSAP(企業内の全ての業務を一元的に管理するシステム)の一つである、S/4HANA Cloudの拡張機能の一つであるIn-App拡張について記載しています。</p> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/a/a-yamagishi_pn/20230220/20230220184348.png" /></p> <p>もう一つの拡張方式であるSide-by-Side拡張については過去の記事をご覧ください。</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fmedia.zenet-web.co.jp%2Fentry%2F2023%2F03%2F24%2F133606" title="S/4HANA Cloudの拡張開発について - Zenet Tech Blog" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://media.zenet-web.co.jp/entry/2023/03/24/133606">media.zenet-web.co.jp</a></cite></p> <h3 id="拡張方式の紹介"> 拡張方式の紹介 </h3> <h4 id="In-App拡張"> In-App拡張</h4> <p>SAP S/4HANA Cloud内に提供されている、カスタマイズ用アプリケーションを用いて拡張する方式です。 </p> <p>S/4HANA Cloudの環境内で、画面項目の追加や、レポートフォームの作成など簡易的に拡張できるのが特徴ですが、バージョンアップの影響を受けることがあります。</p> <h4 id="Side-by-Side拡張"> Side-by-Side拡張</h4> <p>Side-by-Side拡張とは、SAP S/4HANA Cloudとは別にSAP社が提供している、SAP Business Technology Platform(通称:BTP)を用いて、システム外に拡張する方式です。</p> <p>この記事では、前者のIn-App拡張について紹介します。</p> <h3 id="機能の紹介">機能の紹介</h3> <h4 id="カスタム項目">カスタム項目</h4> <p>S/4HANA Cloudの各伝票のヘッダや明細単位で、画面上に新しく項目を追加することができます。</p> <p>追加した項目は各伝票に関連する帳票やAPIのデータソースに追加することも可能です。</p> <p>「受注伝票→出荷伝票」などSAP標準として備わっている範囲であれば、自動で後続伝票に値を引き継ぐ設定もできます。</p> <h4 id="カスタムCDSビュー">カスタムCDSビュー</h4> <p>S/4HANA Cloud上ではオンプレのようにSE11やSE16のようにテーブルを自由に閲覧できる機能がなく、標準であるレポートや管理機能のアプリを使用して各伝票などのデータを見る必要があります。</p> <p>しかし実際に見たい項目がないこともあり、SAPが標準で用意している標準ビューから業務目的に沿うビューを作成するために使用します。</p> <p>カスタムCDSビューを作成するだけでは、ユーザや開発者は自由にデータを見ることができないため、後述のカスタム分析クエリでレポートアプリを作成するか、API公開することでOdataAPIとしてデータ取得を行えるようにすることが必要です。</p> <h4 id="カスタム分析クエリ">カスタム分析クエリ </h4> <p>カスタム分析クエリとはデータベースから欲しいデータを直感的に引き出すことができる機能です。</p> <p>通常のデータベースの場合、内部結合や外部結合、必要なデータのみを持ってくるためにはどのパラメータが必要なのかを考えてSQL等を書かなければなりませんが、カスタム分析クエリの場合はどのデータをどの条件で持っていきたいかを選択するだけで済みます。</p> <p>処理に時間がかかるクエリの処理工数を指定する機能もあり、新しいデータを追加する「ランタイム拡張性」もサポートされています。また、ゼロを含む行や列を非表示にする設定も可能です。</p> <p>また、プレビュー機能を備えており欲しいデータが要求通りのものになっているかを確認することも容易にできます。</p> <h4 id="カスタムタイル">カスタムタイル</h4> <p>カスタムタイル上に設定したURLをS/4HANACloud上の画面から接続することができる機能です。</p> <p>BTPで開発したアプリケーションやレポート、さらに外部のWEBサイトまで、幅広いコンテンツをホームページから直接起動することができます。また、要件に合わせて名前、アイコン、色をカスタマイズすることもできます。</p> <p>カスタムタイルを活用することで、頻繁に使用する機能をホームページ上に配置し、ユーザーは複雑な検索を行うことがなく、必要な情報に素早くアクセスすることがきます。</p> <h3 id="まとめ">まとめ</h3> <p>In-App拡張はSide-by-Side拡張と異なり、ABAPやJavaを使わず簡易的にS/4HANA Cloudをカスタマイズすることができます。</p> <p>前回の記事も併せてご覧いただき、In-App拡張とSide-by-Side拡張を選択する際の参考となれば幸いです。</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fmedia.zenet-web.co.jp%2Fentry%2F2023%2F03%2F24%2F133606" title="S/4HANA Cloudの拡張開発について - Zenet Tech Blog" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://media.zenet-web.co.jp/entry/2023/03/24/133606">media.zenet-web.co.jp</a></cite></p> <p> </p> <h3 id="参考資料">参考資料</h3> <p>・SAP S/4HANA Cloud の拡張と統合</p> <p><a href="https://help.sap.com/docs/SAP_S4HANA_CLOUD/0f69f8fb28ac4bf48d2b57b9637e81fa/7139c1648de84c0bbd7637589ed7c92a.html">https://help.sap.com/docs/SAP_S4HANA_CLOUD/0f69f8fb28ac4bf48d2b57b9637e81fa/7139c1648de84c0bbd7637589ed7c92a.html</a></p> <p> </p> z-ebisawa_st 【Excel】 文字列の正確な比較をするならEXACT関数 ! hatenablog://entry/6801883189089200481 2024-03-13T08:43:27+09:00 2024-03-13T08:43:27+09:00 こんにちは。システム事業部の遠藤です。 先日チーム内でとあるExcelの関数について話題があがりました。ズバリ、「EXACT関数」です。今回は意外と気づかない落とし穴にも、気付くことが出来るこの関数についてご紹介したいと思います。 文字列を比較する際皆さんはどのように比較していますか?自分は設計書のデータを突合せて比較し実装に漏れがないかチェックすることが暫しあります。そのチェック時にはいつも比較したい2つのセルを「=」で比較していました。早速ですが、以下のデータを「=」で比較した場合結果はどのように返ってくると思いますか? 結果は下記のようになります。「=」では大文字・小文字の区別がされない… <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/z/zenet-tech/20240312/20240312140248.png" width="500" height="266" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <p><br /><br />こんにちは。システム事業部の遠藤です。</p> <p>先日チーム内でとあるExcelの関数について話題があがりました。<br />ズバリ、「<strong>EXACT関数</strong>」です。<br />今回は意外と気づかない落とし穴にも、気付くことが出来るこの関数についてご紹介したいと思います。</p> <p> </p> <p>文字列を比較する際皆さんはどのように比較していますか?<br />自分は設計書のデータを突合せて比較し実装に漏れがないかチェックすることが暫しあります。<br />そのチェック時にはいつも比較したい2つのセルを「=」で比較していました。<br />早速ですが、以下のデータを「=」で比較した場合結果はどのように返ってくると思いますか?</p> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/k/k-ebana/20240308/20240308191647.png" width="329" height="175" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <p> </p> <p>結果は下記のようになります。<br />「=」では大文字・小文字の区別がされないため全てTRUEとなって返ってきます。</p> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/k/k-ebana/20240308/20240308191725.png" width="337" height="175" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <p>※#1の比較で使用している数式「=B2=D2」</p> <p> </p> <p> </p> <p>これでは大文字と小文字の区別を付けたい場合、不十分となってしまいます。<br />しかし、冒頭でご紹介した「EXACT関数」ではそんな落とし穴にも対応しています。<br />下記が「EXACT関数」で比較した結果です。<br />項番3と4では期待通り大文字・小文字を区別してFALSEを返してくれます!</p> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/k/k-ebana/20240308/20240308191833.png" width="353" height="179" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <p>※#1の比較で使用している数式「=EXACT(B2,D2)」</p> <p> </p> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/k/k-ebana/20240308/20240308191925.png" width="337" height="316" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <p> </p> <p> </p> <p>いかがでしたでしょうか。意外と気づかない差異にも「EXACT関数」では気付くことが出来ます!<br />初見の方はこれからセルを比較する際には是非参考にしてみてください。</p> k-ebana 【SAP】ABAPの基本的な命令について紹介します hatenablog://entry/6801883189065986466 2024-02-13T09:46:38+09:00 2024-02-13T09:46:38+09:00 はじめに ABAPの基本的な命令 イベントブロック イベントブロックとは イベントブロックの種類 定義・宣言命令 TYPES命令 DATA命令 テーブルからのデータの読み込み命令 READ TABLE命令 繰り返し処理を行う命令 DO命令 WHILE命令 LOOP命令 無限ループ 繰り返し処理を強制終了させる命令 CONTINUE命令 CHECK命令 EXIT命令 終わりに はじめに 前回は、SAPにおける開発言語である「ABAP」について解説する記事を書かせていただきました。 media.zenet-web.co.jp今回はそのABAPにおける基本的な命令について、紹介していきます。 SAP… <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/z/zenet-tech/20240213/20240213094505.png" width="500" height="266" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><br /> </p> <ul class="table-of-contents"> <li><a href="#はじめに">はじめに</a></li> <li><a href="#ABAPの基本的な命令">ABAPの基本的な命令</a><ul> <li><a href="#イベントブロック">イベントブロック</a><ul> <li><a href="#イベントブロックとは">イベントブロックとは</a></li> <li><a href="#イベントブロックの種類">イベントブロックの種類</a></li> </ul> </li> <li><a href="#定義宣言命令">定義・宣言命令</a><ul> <li><a href="#TYPES命令">TYPES命令</a></li> <li><a href="#DATA命令">DATA命令</a></li> </ul> </li> <li><a href="#テーブルからのデータの読み込み命令">テーブルからのデータの読み込み命令</a><ul> <li><a href="#READ-TABLE命令">READ TABLE命令</a></li> </ul> </li> <li><a href="#繰り返し処理を行う命令">繰り返し処理を行う命令</a><ul> <li><a href="#DO命令">DO命令</a></li> <li><a href="#WHILE命令">WHILE命令</a></li> <li><a href="#LOOP命令">LOOP命令</a></li> <li><a href="#無限ループ">無限ループ</a></li> </ul> </li> <li><a href="#繰り返し処理を強制終了させる命令">繰り返し処理を強制終了させる命令</a><ul> <li><a href="#CONTINUE命令">CONTINUE命令</a></li> <li><a href="#CHECK命令">CHECK命令</a></li> <li><a href="#EXIT命令">EXIT命令</a></li> </ul> </li> </ul> </li> <li><a href="#終わりに">終わりに</a></li> </ul> <div class="section"> <h3 id="はじめに">はじめに</h3> <p>前回は、SAPにおける開発言語である「ABAP」について解説する記事を書かせていただきました。<br /> <iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fmedia.zenet-web.co.jp%2Fentry%2F2023%2F02%2F27%2F100346" title="【SAP】SAP専用言語であるABAPはどのようなことができるのか - Zenet Tech Blog" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://media.zenet-web.co.jp/entry/2023/02/27/100346">media.zenet-web.co.jp</a></cite></p><p>今回はそのABAPにおける基本的な命令について、紹介していきます。<br /> SAPやABAPに興味を持つ人の一助となりましたら幸いです。</p> </div> <div class="section"> <h3 id="ABAPの基本的な命令">ABAPの基本的な命令</h3> <div class="section"> <h4 id="イベントブロック">イベントブロック</h4> <p>このセクションではイベントブロックとは何か、また各イベントブロックでどのような処理がされるかを紹介いたします。</p> <div class="section"> <h5 id="イベントブロックとは">イベントブロックとは</h5> <p>イベントブロックとは、プログラム実行時に処理されるイベントキーワードごとのまとまりを指します。<br /> そのイベントキーワード内の処理が終了したら次のイベントキーワード内の処理を行います。</p><p>例:</p> <pre class="code ABAP" data-lang="ABAP" data-unlink>INITIALIZATION. &#34;イベントキーワード [処理A] AT SELECTION-SCREEN. &#34;イベントキーワード [処理B] START-OF-SELECTION. &#34;イベントキーワード [処理C]</pre><p>あるイベントキーワードの直後からその次のイベントキーワードの直前までがイベントブロックとなります。<br /> 処理Aがすべて終了した後に処理Bが実行されます。処理Cについても同様です。</p> </div> <div class="section"> <h5 id="イベントブロックの種類">イベントブロックの種類</h5> <p>イベントブロックの中でも、使用頻度の多いイベントブロックを紹介します。</p><p>・INITIALIZATION<br /> プログラム実行時に一度だけ実行されるイベントブロックになります。<br /> 選択画面、メイン処理が実行される前に処理が行われます。<br /> そのため、選択画面の入力項目に初期値を設定するなどの処理を行なったりします。</p><p>・AT SELECTION-SCREEN<br /> 選択画面で実行ボタン、Enterキー押下時に実行されるイベントブロックになります。<br /> 選択画面で入力した値のチェックなどの処理を行います。</p><p>・START-OF-SELECTION<br /> メイン処理を行うイベントブロックになります。<br /> データの登録、更新、取得、帳票出力などの処理を行います。</p><p>他に一覧画面のヘッダの部分の処理を行う「TOP-OF-PAGE」、フッターの部分の処理を行う「END-OF-PAGE」などもありますが、今回は実際にプログラム作成を行なった中でもっとも使用頻度が多かった3つを紹介させていただきました。</p> </div> </div> <div class="section"> <h4 id="定義宣言命令">定義・宣言命令</h4> <p>このセクションではABAPにおける変数の宣言と、その変数のデータ型等の定義を行うために使用される命令を紹介します。</p> <div class="section"> <h5 id="TYPES命令">TYPES命令</h5> <p>ABAPでは、後述する変数宣言の際に使用する基本データ型や構造、テーブルデータ型等をプログラム中で定義することができます。その際に使用される命令が「TYPES命令」です。</p> <br><p><基本データ型の定義><br /> TYPESキーワードに続けて、事前定義のABAPデータ型やABAPディクショナリに登録されているデータ型を指定します。</p><p>・構文</p> <pre class="code ABAP" data-lang="ABAP" data-unlink>TYPES &lt;データ型名&gt; TYPE &lt;データ型&gt;.</pre><p>・例文</p> <pre class="code ABAP" data-lang="ABAP" data-unlink>TYPES: TYP_BNAME TYPE XUBNAME, &#34;ユーザ名 TYP_TEXT10 TYPE C LENGTH 10, &#34;文字型(10文字) TYP_NUMBER TYPE P LENGTH 4 DECIMALS 2. &#34;数字型(4バイト、小数点以下2桁)</pre><p><構造の定義><br /> ・構文</p> <pre class="code ABAP" data-lang="ABAP" data-unlink>TYPES: BEGIN OF &lt;構造名&gt;, &lt;項目名1&gt; TYPE &lt;データ型&gt;, &lt;項目名2&gt; TYPE &lt;データ型&gt;, END OF &lt;構造名&gt;.</pre><p>・例文</p> <pre class="code ABAP" data-lang="ABAP" data-unlink>TYPES: BEGIN OF TYP_ST_USR02, BNAME TYPE USR02-BNAME, &#34;ユーザ名 GLTGV TYPE USR02-GLTGV, &#34;有効開始日 GLTGB TYPE USR02-GLTGB, &#34;有効終了日 END OF TYP_ST_USR02.</pre><p><テーブルデータ型の定義><br /> ・構文</p> <pre class="code ABAP" data-lang="ABAP" data-unlink>TYPES &lt;テーブルデータ型名&gt; TYPE &lt;テーブル種類&gt; OF &lt;データ型&gt;.</pre><p>・例文</p> <pre class="code ABAP" data-lang="ABAP" data-unlink>TYPES TYP_IT_USR02 TYPE STANDARD TABLE OF TYP_ST_USR02.</pre><p>・テーブル種類<br /> テーブル種類には次の5つが存在します。</p> <ul> <li>STANDARD TABLE</li> <li>SORTED TABLE</li> <li>HASHED TABLE</li> <li>ANY TABLE</li> <li>INDEX TABLE</li> </ul> </div> <div class="section"> <h5 id="DATA命令">DATA命令</h5> <p>ABAPでは「DATA命令」を使用して変数宣言することで、任意のデータ型の変数を作成することができます。</p><p>・構文</p> <pre class="code ABAP" data-lang="ABAP" data-unlink>DATA &lt;変数名&gt; TYPE &lt;データ型&gt;</pre><p>・例文</p> <pre class="code ABAP" data-lang="ABAP" data-unlink>DATA: ZBNAME TYPE XUBNAME VALUE &#39;USER01&#39;, &#34;ユーザ名(VALUEキーワードで初期値を設定) ZTEXT10 TYPE C LENGTH 10, &#34;文字型(10文字) ZNUMBER TYPE P LENGTH 4 DECIMALS 2, &#34;数字型(4バイト、小数点以下2桁) ZST_USR02 TYPE TYP_ST_USR02, &#34;TYPES命令で定義した構造の変数を作成 ZIT_USR02A TYPE STANDARD TABLE OF TYP_ST_USR02, &#34;TYPES命令で定義した構造から内部テーブルを作成 ZIT_USR02B TYPE TYP_IT_USR02. &#34;TYPES命令で定義したテーブルデータ型から内部テーブルを作成</pre> </div> </div> <div class="section"> <h4 id="テーブルからのデータの読み込み命令">テーブルからのデータの読み込み命令</h4> <p>このセクションではテーブル内のデータを読み込むために使用される命令を紹介します。</p> <div class="section"> <h5 id="READ-TABLE命令">READ TABLE命令</h5> <p>ABAPにおける「READ TABLE命令」は、内部テーブルから特定のレコードを読み取るために使用する命令です。</p><p><オプションの一例><br /> ・INTO <作業領域><br />  読み取ったレコードを指定した格納先に格納できます。<br />  作業領域に格納する場合、対象の内部テーブルと同じ構造を持つ作業領域を格納先に指定する必要があります。</p><p>・TRANSPORTING <項目名> INTO <変数><br /> 読み取ったレコードのうち、指定した項目のみを指定した変数に格納します。</p><p>・TRANSPORTING NO FIELDS<br />  レコードをどこにも格納しない場合に利用します。<br />  存在チェックなど、後続処理で読み取ったレコードを使用しない場合に使用します。</p><p>・WITH KEY <項目名> = <指定の値><br />  内部テーブルから指定した条件を持つレコードを取得します。<br />  条件を満たすレコードが複数ある場合、インデックス番号が小さいレコード(内部テーブルの上にあるレコード)が取得されます。</p><p>・INDEX <INDEX番号><br />  指定したインデックスの行からレコードを取得します。<br />  内部テーブルのインデックス行より大きい値を指定するとエラーとなるため、事前に内部テーブルのレコード数を取得して指定するなどの対応が必要です。</p><p>・BINARY SERCH<br />  内部テーブルをバイナリ検索(二分探索)します。<br />  内部テーブルのレコード件数が膨大な場合、通常検索よりもパフォーマンス面で優位となりますが、事前に対象の内部テーブルをソートしておく必要があります。</p><p><使用例></p> <pre class="code ABAP" data-lang="ABAP" data-unlink>READ TABLE it_example WITH KEY exkey1 = &#39;example&#39; INTO wk_example</pre><p>→内部テーブル「it_example」から項目「exkey1」の値が'example'の<br />  レコードを読み込み、作業領域「wk_example」に格納します。<br /> <br /> </p> </div> </div> <div class="section"> <h4 id="繰り返し処理を行う命令">繰り返し処理を行う命令</h4> <p>このセクションでは、繰り返し処理を行う際に使用される命令を紹介します。</p> <div class="section"> <h5 id="DO命令">DO命令</h5> <p>DO命令は、終了命令(EXIT)が読み込まれるまでの間、または指定した実行回数分「DO.」~「ENDDO.」の中に書かれた処理を繰り返し実行する命令です。<br /> 実行回数の指定は省略することができます。その場合は終了命令(EXIT)が読み込まれるまでの間、「DO.」~「ENDDO.」間に書かれた処理を繰り返し実行します。</p><p>例:1から15までの数を列挙する処理<br /> 実行回数の指定なしの場合:</p> <pre class="code ABAP" data-lang="ABAP" data-unlink>DATA NUM TYPE I. NUM = 1. DO. WRITE / NUM. NUM = NUM + 1. IF NUM &gt;= 15. EXIT. ENDIF. ENDDO.</pre><p>実行回数の指定ありの場合:</p> <pre class="code ABAP" data-lang="ABAP" data-unlink>DATA NUM TYPE I. NUM = 1. DO 15 TIMES. WRITE / NUM. NUM = NUM + 1. ENDDO.</pre> </div> <div class="section"> <h5 id="WHILE命令">WHILE命令</h5> <p>WHILE命令は、指定した条件が偽となるまでの間「WHILE.」~「ENDWHILE.」の中に書かれた処理を繰り返し実行する命令です。</p><p>例:1から15までの数を列挙する処理</p> <pre class="code ABAP" data-lang="ABAP" data-unlink>DATA NUM TYPE I. NUM = 1. WHILE NUM &lt;=15. WRITE / NUM. NUM = NUM + 1. ENDWHILE.</pre> </div> <div class="section"> <h5 id="LOOP命令">LOOP命令</h5> <p>LOOP命令は、内部テーブル内のすべてのレコードに対して「LOOP.」~「ENDLOOP.」の中の処理を実行する命令です。</p><p>例:内部テーブルに格納されているすべての内容を列挙する処理</p> <pre class="code ABAP" data-lang="ABAP" data-unlink>LOOP AT (内部テーブル) INTO (構造). WRITE: / (構造)-(項目A), (構造)-(項目B), (構造)-(項目C). ENDLOOP.</pre> </div> <div class="section"> <h5 id="無限ループ">無限ループ</h5> <p>繰り返し処理が終了せずに無限に繰り返される状態のことを「無限ループ」といいます。<br /> 発生するとサーバに負荷がかかり、サーバ全体の処理速度が極端に遅くなるため、影響が広範におよぶことになります。<br /> 無限ループが発生する例:</p> <ul> <li>繰り返し回数を指定しないDO命令において繰り返す処理内にEXIT命令がない場合</li> <li>繰り返し回数を指定しないDO命令において繰り返す処理がEXIT命令にたどり着くことができない場合</li> <li>WHILE命令において指定した条件が常に真のままとなる場合</li> </ul> </div> </div> <div class="section"> <h4 id="繰り返し処理を強制終了させる命令">繰り返し処理を強制終了させる命令</h4> <p>このセクションでは、前述の繰り返し処理を中断する際に使用される命令を紹介します。</p> <div class="section"> <h5 id="CONTINUE命令">CONTINUE命令</h5> <p>CONTINUE命令は、DO命令やWHILE命令、LOOP命令といった繰り返し処理を実行する命令において、それ以降の繰り返し処理をスキップして次の繰り返し処理をはじめから実行させる命令です。<br /> 次の例では処理A、処理Bは必ず実行されますが、処理CはIFの条件を満たす場合CONTINUE命令によってスキップされて実行されないことがあります。</p><p>例:</p> <pre class="code ABAP" data-lang="ABAP" data-unlink>DO. 【処理A】 【処理B】 IF (条件). CONTINUE. ENDIF. 【処理C】 ENDDO.</pre> </div> <div class="section"> <h5 id="CHECK命令">CHECK命令</h5> <p>この命令はループ中の現在のレコードの処理を条件付きで終了させ次のレコードの処理を開始させます。<br /> 条件には論理式を用いることができます。<br /> 条件に当てはまる場合、CHECK命令の後ろに他の命令文が存在していてもその命令は処理されません。</p><p>例:</p> <pre class="code ABAP" data-lang="ABAP" data-unlink>LOOP itab_b INTO wk_b. CHECK wk_b-number &lt; 3. WRITE wk_b-number. &#34;wk_b-numberが3未満の場合処理されない ENDLOOP.</pre> </div> <div class="section"> <h5 id="EXIT命令">EXIT命令</h5> <p>この命令はループの次のレコードが存在していても即座に無条件で現在のループ処理そのものを終了させます。<br /> ループ内で別にループ処理を行っている場合、現在のループ処理を終了させます。<br /> 例:</p> <pre class="code ABAP" data-lang="ABAP" data-unlink>LOOP itab_c INTO wk_c. cnt_number = cnt_number + wk_c-number. IF cnt_number &gt;= 3. EXIT. ENDIF. WRITE wk_c-number. &#34;cnt_numberが3以上になるとループが終了するので処理されない ENDLOOP.</pre> </div> </div> </div> <div class="section"> <h3 id="終わりに">終わりに</h3> <p>今回はABAPにおける基本的な命令について紹介させていただきました。<br /> この記事が皆様の一助となりましたら幸いです。</p><p>「そもそもSAPとは?」という方は以下の記事をご覧ください。<br /> <iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fmedia.zenet-web.co.jp%2Fentry%2F2023%2F02%2F10%2F105603" title="多くの企業で導入されているSAP ERPとは? - Zenet Tech Blog" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://media.zenet-web.co.jp/entry/2023/02/10/105603">media.zenet-web.co.jp</a></cite></p> </div> h-sato_st 開発者視点でSalesforceを紹介してみる hatenablog://entry/6801883189063842609 2024-01-09T10:32:41+09:00 2024-01-09T10:32:41+09:00 システム事業部土屋です。業務でセールスフォースを利用しているので、セールスフォースの認知度を上げるべく紹介をしたいと思います。 はじめに セールスフォースという名前を聞いたことはあるが、実際どんなことに使えるのか?どんなことが出来るのか?など、知らない方も多いかと思います。 https://www.salesforce.com/jp/products/what-is-salesforce/ セールスフォース公式には「マーケティングから営業へ有望なリードだけを提供し、受注後は顧客を理解した満足度の高いサポートサービスを提供することが出来るようになります。」と書かれていますが、これは導入を検討して… <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/z/zenet-tech/20240109/20240109103115.png" width="500" height="266" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <p> </p> <p>システム事業部土屋です。<br />業務でセールスフォースを利用しているので、セールスフォースの認知度を上げるべく紹介をしたいと思います。</p> <h4 id="はじめに"> <br />はじめに</h4> <p>セールスフォースという名前を聞いたことはあるが、実際どんなことに使えるのか?どんなことが出来るのか?など、知らない方も多いかと思います。</p> <p><a href="https://www.salesforce.com/jp/products/what-is-salesforce/">https://www.salesforce.com/jp/products/what-is-salesforce/</a></p> <p>セールスフォース公式には「マーケティングから営業へ有望なリードだけを提供し、受注後は顧客を理解した満足度の高いサポートサービスを提供することが出来るようになります。」と書かれていますが、これは導入を検討している人向けの説明です。</p> <p>この記事では、開発担当目線でセールスフォースというプラットフォームの特徴を説明したいと思います。</p> <h4 id="1データベースについて">1.データベースについて</h4> <p>セールスフォースは顧客管理(CRM)や営業支援(SFA)を行うためのソフトウェアとして提供されているため、データベースは必須です。<br />Oracleなどではテーブルを作成等を行うためにはクエリを使用しますが、セールスフォースではテーブル(※)作成用の画面が提供されているため、SQLを知らない人でも簡単に作成することが出来ます。<br />また、テーブルに紐付いたWeb画面を、項目をドラッグアンドドロップで配置することで作成できる機能も標準で準備されています。<br />コーディングの必要が無いため、システム開発経験のない方でも、自分で必要なテーブルや画面を作成することが可能です。</p> <p>(※)セールスフォースではテーブルではなく「オブジェクト」ですが、ほぼ同等のものなので、ここでは便宜上テーブルと記載します。</p> <p> </p> <p>また、「ユーザ」「取引先」「商談」など、一般的によく使われるテーブルは「標準オブジェクト」としてあらかじめ用意されていて、カスタマイズも可能です。</p> <p>例:取引先オブジェクト(リスト表示イメージ)</p> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/k/knakai_z/20231221/20231221085823.png" width="1200" height="423" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <h4 id="2Web画面の作成について">2.Web画面の作成について</h4> <p>ただ、1.で説明した標準のWeb画面は非常にシンプルなものしか作成できません。<br />そのため、実際の業務に使用する画面としては不十分・不満足となるケースも多々あります。<br />その際にはJavaなどと同様に、独自のアプリケーションをコーディングして作成することが出来ます。<br />セールスフォース開発では、セールスフォース用に調整された独自の言語が用意されていますが、JavaでのWebシステム開発と同じようにコーディングが行えるため、何かしらのWebシステム開発経験があれば慣れるのも容易だと思います。</p> <p>例:開発者コンソール</p> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/k/knakai_z/20231221/20231221092120.png" width="1017" height="484" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <h4 id="3学習環境について">3.学習環境について</h4> <p>セールスフォースでは自主学習用に<a href="https://trailhead.salesforce.com/ja" target="_blank">Trailhead</a>という、無料の学習サービスが提供されています。<br />学習コースは<a href="https://trailhead.salesforce.com/ja/content/learn/trails/force_com_dev_beginner" target="_blank">初心者向け</a>だけでなく、上級者向けなどレベルや目的に合わせたコースが用意されています。<br />また、実際にコーディングやテーブル作成が行える学習用環境も無料で利用できます。<br />Trailheadで学習をしっかり行えば、セールスフォースの資格取得することも可能です。</p> <h4 id="最後に">最後に</h4> <p>セールスフォースはクラウドサービスであることから、データ処理における制限等もあり、注意すべき点はありますが、上手く使えば従来のJava開発よりもスピーディーにシステムを提供出来たりします。<br />興味があればTrailheadでセールスフォースに触れてもらえると幸いです。</p> knakai_z 数式で考える進捗管理 hatenablog://entry/6801883189062326635 2023-12-01T14:08:22+09:00 2023-12-01T22:36:51+09:00 はじめに システム事業部 石塚です。 進捗管理について数式で考えてみたいと思います。 進捗管理は数式だけできるものではありませんが、若年層の方が作業を任されたときにお役に立ててもらえれば幸いです。 作業状況把握の方法または、作業依頼受領時の見通し確認の方法と考えていただければ。 私も現場でご縁のあった年長の方にご教示いただき、作業状況の把握が分かりやすくなりました。 進捗管理の数式 進捗管理に必要な数式は以下になります。 見積もりやWBS・小日程を作成するときには自然と利用する数式です。 例えば、500本のプログラムを毎日5本ずつ10人が作成した場合に、完成までどのくらい日数がかかるか。 以下… <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/z/zenet-tech/20231129/20231129115254.png" width="500" height="266" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <p> </p> <p><strong><br />はじめに</strong></p> <p>システム事業部 石塚です。</p> <p>進捗管理について数式で考えてみたいと思います。</p> <p>進捗管理は数式だけできるものではありませんが、若年層の方が作業を任されたときにお役に立ててもらえれば幸いです。</p> <p>作業状況把握の方法または、作業依頼受領時の見通し確認の方法と考えていただければ。</p> <p>私も現場でご縁のあった年長の方にご教示いただき、作業状況の把握が分かりやすくなりました。</p> <p> </p> <p><strong>進捗管理の数式</strong></p> <p>進捗管理に必要な数式は以下になります。</p> <p>見積もりやWBS・小日程を作成するときには自然と利用する数式です。</p> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/t/t-ishizuka_hk/20231128/20231128110101.png" width="244" height="92" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <p>例えば、500本のプログラムを毎日5本ずつ10人が作成した場合に、完成までどのくらい日数がかかるか。</p> <p>以下のように簡単に算出できます。</p> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/t/t-ishizuka_hk/20231128/20231128110159.png" width="248" height="108" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <p>(作業量)500本のプログラム<br />(生産性)5本/日<br />(要員数)10人<br /><br /></p> <p><strong>作業遅延の仕組み</strong></p> <p>経験がない人はいないと思いますが、作業では進捗の遅延(作業遅延)が発生します。作業遅延は数式にすると以下で表せます。</p> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/t/t-ishizuka_hk/20231128/20231128110623.png" width="261" height="91" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <p>これは作業量、生産性、要員数が計画の想定と違っていたという状況です。<br />考えられる理由としては<br />(作業量)500本のプログラムが急遽1000本になった。<br />(生産性)毎日5本作る見込みが実際は2本が精いっぱいだった。<br />(要員数)10人でする予定が5人になった。</p> <p>理由はともかく数式の左辺が右辺より大きくなる。</p> <p>これが作業遅延発生の仕組みです。</p> <p> </p> <p><strong>作業遅延対策</strong></p> <p>仕組みを理解すると作業遅延対策は明確になります。<br />作業量の削減、生産性の向上、要員数を増すことが遅延の解消になります。</p> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/t/t-ishizuka_hk/20231128/20231128110933.png" width="272" height="95" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <p>極端な言い方をすれば、遅れを解消するには左辺内容を計画が立てられた状態よりも良い状態にすればいいのです。</p> <p> </p> <p><strong>進捗の管理</strong></p> <p>ここまでが数式で考える進捗管理です。</p> <p>今回の説明では期間を重点に置き説明してきましたが、数式を組み替えれば好きな要素を中心に考えることも可能です。</p> <p>この数式を使えば依頼を受けるときに、その計画が妥当性を判断することもできます。早い段階で、計画の誤りを検知することで対策が軽くなります。</p> <p> </p> <p><strong>最後に</strong></p> <p>問題を出したいと思います。</p> <p>この問題を通して、上記の数式の利用と遅延の怖さを再確認してください。<br /><span style="color: #000000;">【問題】</span><br />2週間(10日間)で、1000個のブロックを毎日100個ずつ10人(1人当たり10個)で作成する予定の作業がある。</p> <p>1週間(5日間)を経過した時点で進捗率は予定の80%となっていた。<br />残り1週間で作業を完了させるためには、最初の1週間の何%増しで作業をしなければいけないか。</p> <p> </p> <p class="otantogglecls">【答えと解説】</p> <div> <p>50%増しになります。</p> <p> </p> <p>問題の状況を単純化して以下の表のよう整理しました。</p> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/t/t-ishizuka_hk/20231130/20231130094806.png" width="866" height="119" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <p>進捗管理の数式で考えると予定は以下になります。</p> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/t/t-ishizuka_hk/20231130/20231130094841.png" width="270" height="125" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <p>(作業量)1000個のブロック<br />(生産性)10個/日<br />(要員数)10人</p> <p>実績を確認すると5日目を終えた時点で400個(予定500個の80%)作成しています。予定では毎日100個作る計画でしたが、毎日作ることができたのは80個でした。</p> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/t/t-ishizuka_hk/20231130/20231130095013.png" width="271" height="126" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <p>(作業量)400個のブロック<br />(生産性)<span style="color: #000000;">8個/日</span><br />(要員数)10人</p> <p>では残り5日(6日以降)で残っている600個を作るためにはどうしたら良いでしょうか?何もしなければ2.5日超過してしまいます。</p> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/t/t-ishizuka_hk/20231130/20231130095155.png" width="275" height="128" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <p>600個を5日で作るためには毎日120個作ることができれば作り切れます。</p> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/t/t-ishizuka_hk/20231130/20231130095336.png" width="278" height="129" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/t/t-ishizuka_hk/20231130/20231130095820.png" width="866" height="118" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <p>では毎日120個作れるようにするにはどうすれば良いでしょうか?<br />1人が作る個数を12個/日にする。(生産性↑)</p> <p>または、作る人の数を15人にする。(要員数↑)</p> <p>こうすれば5日で作る終えることができます。</p> <p> </p> <p>問題の最初の1週間の何%増しか?ということについては、5日目までの毎日80個作っていた実績値と、6日目以降の120個を作るとした算出値を使って50%増しとなります。</p> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/t/t-ishizuka_hk/20231130/20231130103059.png" width="316" height="96" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <p> </p> <p> </p> <p> </p> </div> <p> <script src="https://code.jquery.com/jquery-2.2.1.min.js"></script> <script> $(function(){ var strOpen = '[クリックして表示]'; var strClose = '[隠す]'; $('.otantoggleopn').append(' <span style="color: #00F; font-size: 80%">' + strClose + '</span>'); $('.otantogglecls').append(' <span style="color: #00F; font-size: 80%">' + strOpen + '</span>').next().css('display', 'none'); $('.otantoggleopn, .otantogglecls').click(function(){ var $this = $(this); $this.next().slideToggle(400); if($this.children('span').text() == strClose) { $this.children('span').text(strOpen); } else { $this.children('span').text(strClose); }; }); }); </script> </p> t-ishizuka_hk 【ITパスポート】短期間&学習費用0円でOK。非エンジニアも学んで損なし♪ hatenablog://entry/6801883189056542925 2023-11-13T16:09:27+09:00 2023-11-13T22:44:48+09:00 こんにちは。情報管理部デザイナーの斉藤です。 デザイナー暦※※年、ゼネットに入社してもうすぐ1年になります。仕事はデザインが主で、エンジニアの知識は必須ではありません。 でも皆さんの会話に参加したい思いでIT初心者の資格「ITパスポート」を取得したいと思い立ち、超絶ギリギリの点数ですが、合格できました。 私のような非エンジニアでも短期間&学習費用0円で合格できる、ITパスポートのあれこれと学習法、学んだ感想をお伝えしたいと思います。 目次 1. まず、ITパスポートとは? 2. 合格基準と合格率 3. 受験申込について 4. 受験当日の持ち物 5. オススメの教材と学習方法 6. 学んで良かっ… <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m-saito_st/20231113/20231113092834.png" width="500" height="266" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <p> </p> <p>こんにちは。情報管理部デザイナーの斉藤です。</p> <p>デザイナー暦※※年、ゼネットに入社してもうすぐ1年になります。仕事はデザインが主で、エンジニアの知識は必須ではありません。 でも皆さんの会話に参加したい思いでIT初心者の資格「ITパスポート」を取得したいと思い立ち、超絶ギリギリの点数ですが、合格できました。</p> <p>私のような非エンジニアでも短期間&学習費用0円で合格できる、ITパスポートのあれこれと学習法、学んだ感想をお伝えしたいと思います。</p> <p> </p> <div style="display: inline-block; position: relative; padding: 1.8em 1em .5em; margin: 2em 0; border: solid 3px #1f286f; background: #FFFFFF;"><strong><span style="position: absolute; display: inline-block; top: -1px; left: -3px; padding: 0px 9px; height: 25px; line-height: 25px; font-size: 17px; background: #1f286f; color: #ffffff;">目次</span></strong> <p><strong><a href="#1st">1. まず、ITパスポートとは?</a></strong></p> <p><strong><a href="#2nd">2. 合格基準と合格率</a></strong></p> <p><strong><a href="#3rd">3. 受験申込について</a></strong></p> <p><strong><a href="#4th">4. 受験当日の持ち物</a></strong></p> <p><strong><a href="#5th">5. オススメの教材と学習方法</a></strong></p> <p><strong><a href="#6th">6. 学んで良かったこと</a></strong></p> </div> <p> </p> <style> .artivle_title{ padding:5px 10px; border-left:#1f286f 10px solid; } </style> <h2 class="artivle_title" id="1st"><strong>1. まず、ITパスポートとは?</strong></h2> <p><strong>ITを利活用するすべての社会人・これから社会人となる学生が備えておくべき、 ITに関する基礎的な知識が証明できる国家試験です。</strong></p> <p>(ITパスポート公式サイトより)</p> <p> </p> <p><strong><a href="https://www3.jitec.ipa.go.jp/JitesCbt/index.html" target="_blank">ITパスポート公式サイトはこちら</a></strong></p> <p> </p> <p><strong>初級者向けとはいえ、立派な国家資格です。</strong><br /><strong>合格すると荘厳な合格証が郵送で届き、嬉しいです♪</strong></p> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m-saito_st/20231107/20231107155611.jpg" width="309" height="416" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <p> </p> <p> </p> <p> </p> <h2 class="artivle_title" id="2nd"><strong>2. 合格基準と合格率</strong></h2> <p><span style="text-decoration: underline;"><span style="font-size: 150%; color: #1f286f; text-decoration: underline;"><strong>  合格基準  </strong></span></span></p> <p><strong>【総合評価点】</strong><br /><strong>600点/1000点満点</strong></p> <p><strong>【分野別評価点】</strong><br /><strong>ストラテジ系  300点/1000点満点</strong><br /><strong>マネジメント系 300点/1000点満点</strong><br /><strong>テクノロジ系  300点/1000点満点 </strong></p> <p> </p> <p>100問出題されて1000点満点ですので、60問正解すれば合格となるのかと思いますが、100問のうちの<span style="text-decoration: underline;">8問は無加点</span>だそうです。</p> <p>また、【分野別評価点】分野ごとに1000点満点換算での300点以上獲得が必須となりますので、ココもなかなか手強いところです。不得手分野も頑張らないといけません。</p> <p>どんな問題がどの分野に相当するかは、後にも紹介する<strong><a href="https://www3.jitec.ipa.go.jp/JitesCbt/index.html" target="_blank">「ITパスポート過去問道場」</a></strong>をひたすらこなしていくと分かってきます。</p> <p>また、<strong>試験時間は120分</strong>です。100問を120分で答えなければならないため、<strong>1問あたり1.2分</strong>が目安となります。</p> <p> </p> <p><span style="text-decoration: underline;"><span style="font-size: 150%; color: #1f286f; text-decoration: underline;"><strong>    合格率   </strong></span></span></p> <p>公式サイトには累代の受験者数や合格者数が掲出されています。<br />近年の合格率は40〜50%程度あるようですが、今年(令和5年春)の試験では約20%程度です。 <br />実際、私が受験したのは今年ですが、過去問に比較して難しかったように思います。 (点数が低かった言い訳にもなりますが・・)これからの傾向が気になりますね。</p> <p> </p> <p> </p> <p> </p> <h2 class="artivle_title" id="3rd"><strong>3. 受験申込について</strong></h2> <p><strong>● 受験申し込みは以下の公式サイトより行います。</strong></p> <p><strong><a href="https://www3.jitec.ipa.go.jp/JitesCbt/index.html" target="_blank">【ITパスポート試験】情報処理推進機構</a></strong></p> <p>受験は随時可能です。 希望日と会場を選択して申込みを行います。 </p> <p> </p> <p><strong>● 受験費用:7500円(税込)</strong></p> <p> </p> <p>私はmacでクレジットカード決済の申し込みを行なったところ、エラーとなってしまいました。そこで電話で問い合わせたところ、「macではエラーがよく起こる」とのことで、「『IT』でしょう?」と 少しばかり苛立ちましたが、スマホ(iOS)ではスムーズに決済が完了できました。</p> <p> </p> <p> </p> <p> </p> <h2 class="artivle_title" id="4th"><strong>4. 受験当日の持ち物</strong></h2> <p>以下の2点が<strong>必須</strong>です。</p> <p><span style="font-size: 120%;"><strong>❶確認票</strong></span> <br />(受験申込が完了するとダウンロード・印刷が可能になります。)</p> <p>この「確認票」には <br /><strong>・受験番号</strong><br /><strong>・利用者ID </strong><br /><strong>・確認コード</strong> <br />が記載されており、当日にこれらが判明しないと受験ができません。 <br />「確認票」をITパスポートのwebサイトで確認するには、サイトのID/パスワードが必要となるため、 申込が完了したらすぐにダウンロードしておくのがオススメです。</p> <p>当日この情報が分からないと、受験することが出来ず帰されます。</p> <p> </p> <p><span style="font-size: 120%;"><strong>❷本人確認書類</strong></span></p> <p>以下よりいずれかが必要です。</p> <p><strong>A.パスポート</strong><br /><strong>B.運転免許証(仮運転免許証を含む)</strong><br /><strong>C.住民基本台帳カード(顔写真付き)、マイナンバー個人番号カード(顔写真付き)</strong><br /><strong>D.特別永住者証明書、在留カード</strong><br /><strong>E.身体障害者手帳(顔写真付き)</strong><br /><strong>F</strong>※<strong>.社員証(要件あり)</strong><br /><strong>G</strong>※<strong>.学生証(要件あり)</strong></p> <p>※の社員証、学生証は要件を満たしている必要がありますので、詳細は以下をご確認ください。<br /><a href="https://www3.jitec.ipa.go.jp/JitesCbt/html/examination/order.html#honnin" target="_blank">https://www3.jitec.ipa.go.jp/JitesCbt/html/examination/order.html#honnin</a></p> <p> </p> <p> </p> <p>会場に持ち込むことができるものは、以下のみです。</p> <p>●ハンカチ・ポケットティッシュ <br />●目薬 <br />●確認票</p> <p>当然ですが<strong>スマホ</strong>や<strong>デバイス型の時計</strong>も事前にロッカーに入れる、カバンにしまうなどが必要になります。<br /><br /></p> <p> </p> <p> </p> <h2 class="artivle_title" id="5th"><strong>5. オススメの教材と学習方法</strong></h2> <p>私はあまりにもギリギリ合格でしたので、ちゃんと合格した方々に社内でアンケートしてみました。</p> <p>ITパスポートをこの3年内に取得した10名に聞いています。</p> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m-saito_st/20231110/20231110180309.png" width="1154" height="596" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m-saito_st/20231110/20231110180750.png" width="1154" height="595" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m-saito_st/20231110/20231110180745.png" width="1155" height="595" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <p> </p> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m-saito_st/20231110/20231110180742.png" width="1155" height="595" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <p>アンケートの結果から、学習期間は<strong>2ヶ月以内に集中</strong>して行うのが良いことが分かります。</p> <p>私自身の学習は以下の通りです。</p> <p>そもそものスキル・・・IT知識なし・社会人※※年(長いです)<br />学習した教材・・・・・<strong>過去問道場のみ</strong><br />学習した時間・・・・・30〜40時間<br />学習した期間・・・・・1ヶ月未満<br />学習にかかった費用・・<strong>0円</strong></p> <p> </p> <p>上記の学習で超絶ギリギリながら、受験<strong>1回目で合格</strong>しました。</p> <p>アンケート結果でも100%の利用率でしたが、<strong><a href="https://www3.jitec.ipa.go.jp/JitesCbt/index.html" target="_blank" rel="noopener">「ITパスポート過去問道場」</a></strong>がとっても有効であることがお分かり頂けるかと思います。</p> <p>どんなところが素晴らしいかというと・・・</p> <p><strong>●平成21年春期からの過去問全てを網羅している。</strong><br /><strong>●全て解説がされている</strong><br /><strong>●正解率が更新されていく。</strong><br /><strong>●模擬試験形式の出題もできる。</strong></p> <p>ことが挙げられるかと思います。</p> <p> </p> <p>ただし平成21年からの過去問全てをこなすとなると、2600問を解かなくてはなりません。1問を1分で解いても43時間かかります。</p> <p>そこで、歳若き先輩方から頂戴したアドバイスは・・・</p> <p><span style="font-size: 150%; color: #1f286f;"><strong>過去4年間の問題を正解率100%にすべし。</strong></span></p> <p> </p> <p>ITはすごいスピードで刻々と進化するものですから、当然かもしれません。例えば、IOTに関する出題は古い過去問では見られません。</p> <p> </p> <p> </p> <p> </p> <h2 class="artivle_title" id="6th"><strong>6. 学んで良かったこと</strong></h2> <p>ITパスポートでは、業界を超えてITが避けて通れない分野となっている今、仕事をする上で必要になるであろう知識を身につけることができます。</p> <p>ITに関わらず、プロジェクトのマネージメントや決算報告書の読み方、会社組織や法律についてもかじることとなります。</p> <p>社会経験が長い私においては、今まで何となく理解していた事が間違っていたり、点在していた知識が繋がったり、ひたすら過去問を解いていくだけでも随分と発見がありました。</p> <p>新社会人や学生の方は、もっとフレッシュに楽しく学習できるのではないかと思いますので、ぜひ挑戦してみてください!</p> <p> </p> <p> </p> m-saito_st 今何が起こっているのか?「CAHT GPT エフェクト 破壊と創造のすべて」読んでみた hatenablog://entry/820878482970864691 2023-09-27T11:34:34+09:00 2023-09-27T11:41:14+09:00 システム事業部田丸です。今、話題に出ない日はない生成AI。会社の本棚に置いてあったのでふと読んでみたところ、色々と考えさせられてしまいました。生成AIの今を切り取った本を読んだ今の自分のリアクションの備忘も兼ね書籍紹介させていただきます。気になった人は今読んで! 【書籍紹介】 bookplus.nikkei.com 発行元:日経BP発行日:2023/06/26 ※当ブログ記載時点より3ヶ月前と割と最近ですが、生成AIの進化スピードは速い。この先もっと状況は変わるかもしれませんが、今の状況をとらえるには良いと思います。 【こんな本です】著書より抜粋 「生成AIがもたらす変化の最前線を国内外で取材… <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/z/zenet-tech/20230927/20230927112717.png" width="500" height="266" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <p> </p> <p>システム事業部田丸です。<br />今、話題に出ない日はない生成AI。会社の本棚に置いてあったのでふと読んでみたところ、色々と考えさせられてしまいました。生成AIの今を切り取った本を読んだ今の自分のリアクションの備忘も兼ね書籍紹介させていただきます。<br />気になった人は今読んで!</p> <p><br /><span style="font-size: 150%;"><strong>【書籍紹介】</strong></span></p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fbookplus.nikkei.com%2Fatcl%2Fcatalog%2F23%2F06%2F08%2F00856%2F" title="<6/26新刊>『ChatGPTエフェクト 破壊と創造のすべて』" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://bookplus.nikkei.com/atcl/catalog/23/06/08/00856/">bookplus.nikkei.com</a></cite></p> <p> </p> <p>発行元:日経BP<br />発行日:2023/06/26</p> <p> </p> <p>※当ブログ記載時点より3ヶ月前と割と最近ですが、生成AIの進化スピードは速い。この先もっと状況は変わるかもしれませんが、今の状況をとらえるには良いと思います。</p> <p> </p> <p><strong><span style="font-size: 150%;">【こんな本です】</span></strong><br />著書より抜粋</p> <p> </p> <blockquote> <p>「生成AIがもたらす変化の最前線を国内外で取材しそこから見えてきたものを詳しく解説した1冊です」</p> </blockquote> <p> </p> <p>CHAT GPTなどの生成AIが今まさに巻き起こしている<span style="color: #ff0000;">「エフェクト=変化=創造的破壊」</span>と未来の予見とともに記されています。<br />良し悪しではなく事実ベースでの記事やインタビューが多数掲載されている本です。<br />とにかく今こういうことが起こっているというのを把握し、想像を膨らませるのにも良いかなと思います。</p> <p><br /><span style="font-size: 150%;"><strong>【興味深かった点】</strong></span></p> <p>冠されている題名に則り、生成AIによる<span style="color: #ff0000;">エフェクト</span>(変化)について言及されている箇所やキーワードを重点的にさらってみました。中でも興味深かった点をいくつか挙げます。</p> <p> </p> <p><strong><span style="text-decoration: underline;">・生成AIは言語を使う領域への影響力大!</span></strong></p> <p> 生成AIは特に言語の領域で成長目覚ましい状況ですが、つまり<span style="color: #ff0000;">言語を取り扱う領域すべてにおいて影響力がある</span>とも言えます。すなわちホワイトカラーの職種すべてに影響ありということですね。潜在的な破壊力(創造力)は相当なものがあると感じました。</p> <p><br /><strong><span style="text-decoration: underline;">・教育の評価観点が変わる?</span></strong><br /> ChatGPTがかなり精度の高い論文を書いたなどニュースにもなっており、教育(学問)の世界にも波紋を呼んでます。これからの教育における被評価者(学生)への評価観点も生成AIを使う前提で、以下のように変わると予見されています。</p> <p> </p> <p>     <span style="color: #2196f3;"><strong>論文そのものの評価   &lt;&lt;&lt;  独創的なテーマ設定ができているか?</strong></span></p> <p> </p> <p>つまり論文記述は作業であり、論文の起点となる観点の<span style="color: #ff0000;">独創性や創造性に評価の重きが置かれる</span>ことになるであろうということですね。独創性を誰がどうやって判断するんだろうという疑問もありますが。。。</p> <p><br /><strong><span style="text-decoration: underline;">・検索ビジネスの衰退</span></strong></p> <p> 生成AIの出現により、検索方式が大きく変わりました。検索も便利ではありますが、欲しい情報を得るため第二、第三キーワードに何を持ってくるかなどのいわゆる「検索技術」が必要でした<span style="color: #ff0000;">(※)</span>。<br /> ですがCHAT GPTだと口語体で質問しても答えが返ってくる世界になっています。<br />今、大きなエフェクトになっているのは、検索結果の中に広告を表示することで収益を得るビジネスモデルが覆されかねない状況であるということ。CAHTGPTは回答を生成するため、今までのSEO対策や、ページ内の広告表示などが不要になります。検索を生業とする某ビッグテックも緊急事態を示すコードレッドを社内に宣言しています。<br />向こう何年も盤石であろうと思っていた<span style="color: #ff0000;">巨大企業さえも、新たに出現した技術で揺らいでしまう</span>のはまさに創造的破壊だと思いました。</p> <p><span style="color: #ff0000;">(※)</span>生成AIへの質問にもより精度を高めたり限定化するためのテクニック(プロンプトエンジニアリング)はあります。こちらについては本書を参照ください。</p> <p><br /><span style="text-decoration: underline;"><strong>・大手企業の導入の取り組み</strong></span></p> <p> パナソニックではCIOの会議で生成AIの導入を即決したそうです。AI倫理面を含めた規則の整備やセキュリティも整備も早くからまとめることで社内での迅速な展開に成功しているようです。<span style="color: #ff0000;">「使ってみて価値を体験する」</span>ことに重きを置きつつも、規則や規制対応もしっかりと行うという、生成AIの「使いながら育てる」といった特性を見極めた組織的な取り組みはさすがだなと思いました。</p> <p><br /><span style="font-size: 150%;"><strong>【思ったこと】</strong></span><br /><strong><span style="text-decoration: underline;">・「創造性」の価値が変わるかも</span></strong><br /> 今まで我々が「創造」と定義していた考えや、行為の多くが生成AIの出現により「作業」に成り代わっていきそうな気配を感じました。今後は「創造」が意味するところの純度が上がっていくのではないかと思います。</p> <p> </p> <p><strong><span style="text-decoration: underline;">・「再定義」が重要</span></strong><br /> 変化の波に乗るのも重要かつ不可避です。しかし、迎合するのではなくゆるぎない部分も持つことが新技術や価値観を受容する際には必要だと思いました。周辺環境も見定め取り入れながら、既存の物事の価値や意味を「再定義」することが今重要なフェーズではないかと思います。</p> <p> </p> <p><strong><span style="text-decoration: underline;">・今後起こりそうな議論</span></strong><br /> 完全なる想像ですが、生成AIというもはや新種の生き物の出現に対し、個人単位ではなく社会単位での価値観が問われているのではないかと思いました。全世界的に「社会(人間は)どう思っていないといけないんだっけ?」みたいな議論が、水面下で静かに行われていきそうな気配を感じています。かつてクローン技術が出てきた時に生命倫理としてどうか?みたいな議論があったかと思います。それに類似する情報倫理(大きく言えば人間観みたいなもの)に関わる議論がより盛り上がっていきそうな気がしています。</p> <p> </p> <p><span style="font-size: 150%;"><strong>【おわりに】</strong></span></p> <p>人類はどうあるべきかみたいな壮大なことまで思いめぐらしてしまいましたが、私自身もこの変化の時代、いろいろなことを再定義する視点をもって日々暮らしてゆこうと思います。妙なコラムみたいになりましたが、本書はまさに今をとらえている内容なので、気になった方はすぐ読んでみてください!色々と想像も膨らみ単純に面白いです!</p> <p> </p> s-tamaru ベテラン層にお薦め!「クラウドファースト・アーキテクチャー設計ガイド」 読んでみた hatenablog://entry/820878482956615408 2023-08-23T13:24:11+09:00 2023-08-23T13:24:11+09:00 システム事業部田丸です。世の中のシステム構築においてクラウド利用はもはやスタンダードですね。しかし、システム構成上ほんとに使う意義があるのか、何のために使っているのか疑問を抱くような構成も良く見聞きします。そのあたりを非常にわかりやすく解説してくれている本に出会ったので紹介します。少しでも皆さんの知的好奇心をくすぐることができればと思います! 【書籍紹介】 「クラウドファースト・アーキテクチャ設計ガイド」 https://www.kinokuniya.co.jp/f/dsg-01-9784822237813 著者:鈴木雄介 氏2016年8月29日 第一版 第一刷 発行 ※現時点2023年から7… <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/z/zenet-tech/20230823/20230823132131.png" width="500" height="266" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <p><br /><br />システム事業部田丸です。世の中のシステム構築においてクラウド利用はもはやスタンダードですね。しかし、システム構成上ほんとに使う意義があるのか、何のために使っているのか疑問を抱くような構成も良く見聞きします。そのあたりを非常にわかりやすく解説してくれている本に出会ったので紹介します。少しでも皆さんの知的好奇心をくすぐることができればと思います!</p> <h4 id="書籍紹介"><strong>【書籍紹介】</strong></h4> <p>「クラウドファースト・アーキテクチャ設計ガイド」</p> <p><a href="https://www.kinokuniya.co.jp/f/dsg-01-9784822237813">https://www.kinokuniya.co.jp/f/dsg-01-9784822237813</a></p> <p>著者:鈴木雄介 氏<br />2016年8月29日 第一版 第一刷 発行</p> <p>※現時点2023年から7年も前ですが内容は原理原則に沿ったものであり内容的に古くなることは無いのだろうと思います。</p> <h4 id="こんな本です">【こんな本です】</h4> <blockquote> <p>~「はじめに」から抜粋~</p> <p>"クラウド技術を前提に「いかにしてシステムを構築するのか」を考えるための本です"</p> </blockquote> <p>クラウド技術が台頭した背景も踏まえ、システム構築の考え方のポイントがちりばめられています。クラウドも「あくまでも道具である」という前提に立った文体なので、押しつけがましくなく非常に読みやすかったです。</p> <p> </p> <h4 id="重要だと思ったポイント">【重要だと思ったポイント】</h4> <p>重要点は色々ありますが、本の作者(著者)というものは概ね先頭と最後に重要なメッセージを残すのでそこから2点抜粋し紹介します。</p> <p> </p> <p><span style="text-decoration: underline;"><strong>①クラウドファーストな考えかたとは?(はじめに より)</strong></span></p> <p>インフラのサービス化、ミドルウェアのプラットフォーム化、システム構成のコード化 という <span style="color: #ff0000;">クラウドサービスの特性を前提にシステム開発を考える事</span>。 土台として<span style="color: #ff0000;">「解決すべき課題に適しているのか?」</span>という発想で考える事が重要。</p> <p> </p> <p><strong><span style="text-decoration: underline;">②クラウドファーストにおけるエンジニア(6章 より)</span></strong></p> <h5 id="マインドセットをシステムづくりからITサービス運営にシフト"><span style="color: #ff0000;">・マインドセットを「システムづくり」から「ITサービス運営」にシフト!</span></h5> <p>ものを作ること自体が価値ではなく、作ったものによってどれだけの価値を創出するかが肝。<span style="text-decoration: underline;"><span style="color: #ff0000; text-decoration: underline;">技術者個々がITサービス運営を担っているというマインドが必要</span></span>。</p> <h5 id="エンジニアが進むべき2つの道"><span style="color: #ff0000;">・エンジニアが進むべき2つの道</span></h5> <p>進むべき道はスペシャリストかゼネラリストの二つに大別されるが、どちらも具備すべき共通スキルがありそれがとても重要。表にすると以下のような感じ。</p> <p> </p> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/s/s-tamaru/20230809/20230809211857.png" width="791" height="258" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <h4 id=""> </h4> <h4 id="思ったこと">【思ったこと】</h4> <p>本書を読んで強く思ったことは以下3点です。</p> <h5 id="設計とは道具に踊らされないこと"><span style="text-decoration: underline;">①設計とは道具に踊らされないこと</span></h5> <p>クラウドでもオンプレでも技術はあくまでも技術であり、道具。新しい道具を使いたいがためのシステムづくりではなく、システム(サービス)が価値を創出するのに最適な道具選びと、使い方を考える。つまり<span style="color: #ff0000;">「適用領域」を考える</span>というのが設計の肝なのだと認識しました。あくまでも<span style="color: #ff0000;">「ITサービスが最大限価値を発揮するには?」</span>のスタンスをとることが重要だと思います。</p> <h5 id="クラウドは利用という概念が重要"><span style="text-decoration: underline;">②クラウドは「利用」という概念が重要 </span></h5> <p>クラウドはITシステム資産を<span style="color: #ff0000;">「所有する」ではなく「利用する」</span>という考え方。クラウドプロバイダ側でない限りはエンジニアも利用者のうちの一人。「作る」というより、うまく利用する、うまく組み合わせるという発想に切り替えると良いかと思いました。</p> <h5 id="新しい常識技術道具はすぐやってくる"><span style="text-decoration: underline;">③新しい常識(技術・道具)はすぐやってくる</span></h5> <p>最早ですが生成AIや自動化など新たなキーワードが出てきています。気づけばスタンダードになっていて変化に取り残されるなんてことがないようにミーハーでもよいので最新のところに目を向けたり触れたり、意識張っていこうと思います。</p> <h4 id="さいごに">【さいごに】</h4> <p>本書は紹介した内容以外にも、クラウドとアジャイル開発との親和性や、ウォーターフォールとの対比や開発体制など含め広く、わかりやすく記述されています。ある程度キャリアを踏まれた方やクラウドの特性を知りたい方に特にお薦めします!</p> <p> </p> s-tamaru 自分が思う静的型付けの恩恵 hatenablog://entry/820878482954131717 2023-08-21T09:18:31+09:00 2023-08-21T09:18:31+09:00 目次 型制約がある環境のありがたさ データ生成の流れを作りやすくなる チェックが通れば安全が確保しやすくなる 自分でコードを設計して制御できるのがいい! 型制約がある環境のありがたさ 型制約があると、データの記述が書きやすくなります。まず、このデータ記述の基礎にある考えの型システムから説明していきます。 型システムの型検査は、コードの型を見て使われている型が正しいのかをチェックしてくれます。整数しか入らない部分に整数が入れられていないか、文字列しか入らないところに文字列しか入れられていないかを見ていきます。 下記は使う方を誤ったRubyで書かれたコードとTypeScriptのコードになります。… <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/z/zenet-tech/20230809/20230809103905.png" width="500" height="266" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <h1 id="目次">目次</h1> <ul> <li>型制約がある環境のありがたさ</li> <li>データ生成の流れを作りやすくなる</li> <li>チェックが通れば安全が確保しやすくなる</li> <li>自分でコードを設計して制御できるのがいい!</li> </ul> <h1 id="型制約がある環境のありがたさ">型制約がある環境のありがたさ</h1> <p>型制約があると、データの記述が書きやすくなります。まず、このデータ記述の基礎にある考えの型システムから説明していきます。</p> <p>型システムの型検査は、コードの型を見て使われている型が正しいのかをチェックしてくれます。整数しか入らない部分に整数が入れられていないか、文字列しか入らないところに文字列しか入れられていないかを見ていきます。</p> <p>下記は使う方を誤ったRubyで書かれたコードとTypeScriptのコードになります。</p> <pre class="code lang-ruby" data-lang="ruby" data-unlink><span class="synPreProc">def</span> <span class="synIdentifier">addNumbers</span>(a, b) a + b <span class="synPreProc">end</span> <span class="synComment"># 正常に動く</span> addNumbers(<span class="synConstant">5</span>, <span class="synConstant">10</span>) <span class="synComment"># 実行時エラーが吐かれる</span> addNumbers(<span class="synConstant">5</span>, <span class="synSpecial">&quot;</span><span class="synConstant">10</span><span class="synSpecial">&quot;</span>) </pre> <pre class="code lang-typescript" data-lang="typescript" data-unlink><span class="synStatement">function</span> addNumbers<span class="synStatement">(</span>a: <span class="synType">number</span><span class="synStatement">,</span> b: <span class="synType">number</span><span class="synStatement">)</span>: <span class="synType">number</span> <span class="synIdentifier">{</span> <span class="synStatement">return</span> a + b<span class="synStatement">;</span> <span class="synIdentifier">}</span> <span class="synType">const</span> result <span class="synStatement">=</span> addNumbers<span class="synStatement">(</span><span class="synConstant">5</span><span class="synStatement">,</span> <span class="synConstant">10</span><span class="synStatement">);</span> <span class="synSpecial">console</span>.log<span class="synStatement">(</span>result<span class="synStatement">);</span> <span class="synType">const</span> result <span class="synStatement">=</span> addNumbers<span class="synStatement">(</span><span class="synConstant">5</span><span class="synStatement">,</span> <span class="synConstant">&quot;10&quot;</span><span class="synStatement">);</span> <span class="synComment">// 型エラー: 文字列型の引数が期待される数値型に代入されています</span> <span class="synSpecial">console</span>.log<span class="synStatement">(</span>result<span class="synStatement">);</span> </pre> <p>上記は足し算を実装したコードです。Rubyは1回目のaddNumberのコードは正常に動くのですが、2回目のaddNumberのコードでエラーが吐かれます。</p> <p>TypeScriptもエラーが吐かれますが、Rubyと違うのはJavaScriptにコンパイルする前にエラーが吐かれます。</p> <p>動的型付け言語だと、実行時に初めてエラーが出る仕組みになっています。これは、コードを読み込んで、実行するときにRubyの方で解釈をして機械に命令を実行する仕組みにしています。</p> <p>型システムの型検査はコンパイル前にコンパイルするコードの型をすべてチェックします。コードを実行する前に型の違いで動くことをコンパイル時にチェックできれば実行する手前で検知することができます。</p> <p>Rubyに比べるとTypeScriptの方、つまり動的型付け言語よりも静的型付け言語のほうが作りづらいように見えます。ですが、静的型付け言語にもコーダーにとって恩恵があります。</p> <h1 id="恩恵1-データ生成の流れを作りやすくなる">恩恵1: データ生成の流れを作りやすくなる</h1> <p>データの動きを自分で制御できるのはコーダーにとって大きな恩恵です。</p> <p>先程の例文のコードでは数字の型検査をしていて単純なコードになっていますが、これが自分の作った型や、特定のハッシュの形でコーディングをしたい場合は動的型付けだけだと制御しづらいです。</p> <p>例えば、<code>{"total": number, "count": number}</code>の型を使ってtotal×countの計算をしてもらうコードを作ったとしましょう。</p> <pre class="code lang-ruby" data-lang="ruby" data-unlink><span class="synPreProc">def</span> <span class="synIdentifier">total_count_mult</span>(x) x[<span class="synConstant">:total</span>] * x[<span class="synConstant">:count</span>] <span class="synPreProc">end</span> <span class="synComment"># 動作する</span> puts total_count_mult({<span class="synSpecial">&quot;</span><span class="synConstant">total</span><span class="synSpecial">&quot;</span>: <span class="synConstant">20</span>, <span class="synSpecial">&quot;</span><span class="synConstant">count</span><span class="synSpecial">&quot;</span>: <span class="synConstant">2</span>}) <span class="synComment"># 動作する</span> puts total_count_mult({<span class="synSpecial">&quot;</span><span class="synConstant">total</span><span class="synSpecial">&quot;</span>: <span class="synConstant">20</span>, <span class="synSpecial">&quot;</span><span class="synConstant">count</span><span class="synSpecial">&quot;</span>: <span class="synConstant">2</span>, <span class="synSpecial">&quot;</span><span class="synConstant">hello</span><span class="synSpecial">&quot;</span>: <span class="synConstant">10</span>}) </pre> <p>Rubyコード</p> <pre class="code lang-typescript" data-lang="typescript" data-unlink><span class="synStatement">function</span> total_count_mult<span class="synStatement">(</span>x: <span class="synIdentifier">{</span><span class="synConstant">&quot;total&quot;</span>: <span class="synType">number</span><span class="synStatement">,</span> <span class="synConstant">&quot;count&quot;</span>: <span class="synType">number</span><span class="synIdentifier">}</span><span class="synStatement">)</span>: <span class="synType">number</span> <span class="synIdentifier">{</span> <span class="synStatement">return</span> x<span class="synIdentifier">[</span><span class="synConstant">&quot;total&quot;</span><span class="synIdentifier">]</span> * x<span class="synIdentifier">[</span><span class="synConstant">&quot;count&quot;</span><span class="synIdentifier">]</span> <span class="synIdentifier">}</span> <span class="synComment">// 動作する</span> total_count_mult<span class="synStatement">(</span><span class="synIdentifier">{</span><span class="synConstant">&quot;total&quot;</span>: <span class="synConstant">10</span><span class="synStatement">,</span> <span class="synConstant">&quot;count&quot;</span>: <span class="synConstant">20</span><span class="synIdentifier">}</span><span class="synStatement">)</span> <span class="synComment">// エラーになる</span> total_count_mult<span class="synStatement">(</span><span class="synIdentifier">{</span><span class="synConstant">&quot;total&quot;</span>: <span class="synConstant">10</span><span class="synStatement">,</span> <span class="synConstant">&quot;count&quot;</span>: <span class="synConstant">20</span><span class="synStatement">,</span> <span class="synConstant">&quot;hello&quot;</span>: <span class="synConstant">10</span><span class="synIdentifier">}</span><span class="synStatement">)</span> </pre> <p>TypeScriptコード</p> <p>Rubyでは"hello"というキーを追加しても動きますが、TypeScriptではエラーが起こります。一見すると、TypeScriptのほうが使いづらいし、同じようなデータの型でなんでエラーが起こるかと見えるでしょう。</p> <p>ですが、total_count_multを作った人は<code>{"total": number, "count": number}</code>という引数で設計をしているので、使う側の<code>{"total": 20, "count": 2, "hello": 10}</code>は設計書の意図とは違うんです。</p> <p>自作のhash型を入れると返り値はnumberが帰って来るという意図をきちんと伝えてその上で実行することで、データの流れが見やすくなります。こうすることで、作っている最中にエラーが起こってもどこでバグが起こっているかが見やすくなります。</p> <h1 id="恩恵2-チェックが通れば安全が確保しやすくなる">恩恵2: チェックが通れば安全が確保しやすくなる</h1> <p>更にデータのコードの型が正しいと証明されることで、バグの発生原因を減らすことができます。</p> <p>バグの発生の原因の一つに、意図しない使い方をされるケースがあります。数値型をいれなければならないところに文字列を入れたらバグが起こります。恩恵1で出したtotal_count_multだと型が違う場合にエラーが起こるのは、使ってほしい使い方をしていないのがエラーの原因になっています。</p> <p>型をチェックさせるコンパイラーが通ったということはコンパイラーが定めた静的型付けのルールに則ったコードになっていることの証明になります。これは、もとの原理は違うにしても、linterを通したらpushできる仕組みに似ています。</p> <p>コンパイラーが通れば、少なくとも型に依存した処理はエラーがなく本番運用したとしても、バグを起こす可能性を減らすことができます。</p> <h1 id="恩恵3-自分でコードを設計して制御できるのがいい">恩恵3: 自分でコードを設計して制御できるのがいい!</h1> <p>自分のコードを設計をして、設計通りに制御できることで、コンピューターを思い通りに動かしやすくします。</p> <p>型の生成方法を自分で制御できるということは、データ型にあったアルゴリズムを作りやすくなります。アルゴリズムは基本的にデータ構造と手順が一対多になる構造になっています。例えば、ソートアルゴリズムも基本的に配列と特定の整理する手順が一対一になっています。</p> <p>ソートアルゴリズムを実現するために、データ構造を定めてデータ構造にあった手順を人間が作らないといけないです。このデータ構造と手順を人間側ですべて設計を決定することでコンピューター側はデータの型が正しいかを検査し、それ通ったコードを実行します。</p> <p>この方法は、初学者からは面倒だし、挫折する原因になり一見そんな手間をかける必要がないように見えます。しかし、人間はミスをする生き物です。そのミスを実行時に発見するのと、ミスを発生する前に見つけるのとは、実行時に修正するよりも発見してもらったほうが仕様を覚えていれば直しやすく品質も保てます。</p> <p>すべてを人間側で設計、実装を担うことで機械は静的型付けのルールに則った方法を取ることで正確に実行することができます。もちろん、コンピューター科学の基礎を身に着けていれば、もっと品質を上げることができます。</p> <p>また、型システムの逃げ道に逃げずに作り込むことで長い目で見れば保守しやすいコードを作りやすくなります。コードが途中で粗悪なコードに置き換わったとしても型システム関わるものだったら止めることができます。また、TypeScriptのany, Rustのunsafeのような逃げ道を使うにしても、それを使う意図を常に問われればコードの品質も上げることができます。</p> <h1 id="コンピュータを自分が思ったとおりに作れるようにする">コンピュータを自分が思ったとおりに作れるようにする</h1> <p>どんな制作物でも自分の思ったとおりに作る、動かすことが大前提になります。コンピューターならなおさら自分のコントロール下に置く必要があります。</p> <p>型システムは制御を過去の知見をもとに整理されたシステムです。C言語の時の静的型付けとは毛色は違いますが、厳密な静的型付けにすれば少なくとも型によるバグに悩まされることがすくなくなるはずです。</p> <p>なにかを作るときに一番ストレスになるのは、作っているものが自分の制御下に置かれないことだ。ここでいう制御下に置かれない状態とは、厳密に自分の作ったものが自分が思った通りに動かないことを指します。これは整数で動くはずのコードが文字列でも動いてしまった時も同様です。</p> <p>意図しない事態でも動くことが制御されていないということになるかは、「自分が想定した動きをしていない」からです。</p> <p>整数で動くはずのコードが文字列でも動くことは、コードを使っている側から見れば文字列も正常であると認識してしまう。すると、テストをしていたのが整数だけだったのに文字列も追記した途端にテストがされていない状態になります。</p> <p>これが恐ろしいのは、いつの間にか文字列も正しいということが広がって、文字列も許容することになり、テストする範囲が広がってしまいます。自分が設計したものとは違うコードが自分が知らない間に作られてします。</p> <p>動的型付け言語では言語上これが許されます。これにはメリットがあります。作っている本人が文字列でも使えるように考えているのならば作る手間は減ります。動的型付けは実行するときに型が決定するので、それを踏まえれば引数が文字列の場合でも、ハッシュ型でも使えると想定していれば問題はありません。</p> <p>しかし、これは非常に高度なプログラミング能力を必要とされます。型を作るパターンの把握とそこで使われるメソッドの把握、アプリケーション全体の把握を必要とします。高度なプログラミング能力がないと正確に作ることを困難にします。</p> <p>静的型付け言語の型システムを使えれば、プログラムを作る体験を向上してくれるでしょう。少なくとも、自身が型システムについて理解を深めれば技術が向上しやすくなるはずです。</p> <h1 id="参考資料">参考資料</h1> <ul> <li><a href="https://ja.wikipedia.org/wiki/%E5%9E%8B%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0">型システム</a></li> <li><a href="https://ja.wikipedia.org/wiki/%E5%8B%95%E7%9A%84%E5%9E%8B%E4%BB%98%E3%81%91">動的型付け</a></li> </ul> eizi_hosi deadlock発生時の読み解き方(mysql5.7) その3 インサートインテンションロックによるデッドロック hatenablog://entry/820878482952096429 2023-08-15T12:57:51+09:00 2023-08-15T12:57:51+09:00 はじめに システム事業部堤田です。 前々回の記事で、deadlockが発生した際、mysql上でコマンドshow engine innodb status;実行後に出力されるログの読み取り方を、前回の記事でmysqlのテーブルや行に対してどのような時にロックが発生するのかというので、ロックモードの一部について解説を行いました。今回の記事はそれらの集大成という事で、実際にインサートインテンションロックが原因で発生したdeadlockについて解説を行いました。 前回の記事:deadlock発生時の読み解き方(mysql5.7) 前々回の記事: deadlock発生時の読み解き方(mysql5.7)… <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/z/zenet-tech/20230809/20230809093007.png" width="500" height="266" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <h2 id="はじめに">はじめに</h2> <p>システム事業部堤田です。</p> <p>前々回の記事で、deadlockが発生した際、mysql上でコマンド<code>show engine innodb status;</code>実行後に出力されるログの読み取り方を、前回の記事でmysqlのテーブルや行に対してどのような時にロックが発生するのかというので、ロックモードの一部について解説を行いました。今回の記事はそれらの集大成という事で、実際にインサートインテンションロックが原因で発生したdeadlockについて解説を行いました。</p> <p><a href="https://media.zenet-web.co.jp/entry/2023/02/08/101115">前回の記事:deadlock発生時の読み解き方(mysql5.7)</a> <a href="">前々回の記事: deadlock発生時の読み解き方(mysql5.7) その2 Innodbのロックモードについて</a></p> <p>事象が発生したのは本番環境ですが、流石にその内容は持ってこれませんでしたので検証環境を用意して(ほぼ)同様のDeadlockを発生させました。用意したテーブルの情報、実際に行った操作、結果をそれぞれ記載します。何故ほぼなのかは、最後に説明します。 日本語でも英語でも、詳細な解説や事例が載っている記事がなかなか見つからず、調査、検証に苦労しました。まだまだ疑問に残っている部分はありますが、事象のエッセンスは全て盛り込みました。deadlockについて理解が深まるような内容になっていれば幸いです。</p> <h2 id="deadlockの解説">deadlockの解説</h2> <h3 id="Databaseの構成">Databaseの構成</h3> <pre class="code lang-mysql" data-lang="mysql" data-unlink><span class="synStatement">CREATE</span> <span class="synStatement">TABLE</span> books (id <span class="synType">int</span> <span class="synStatement">NOT</span> <span class="synSpecial">NULL</span> <span class="synStatement">PRIMARY</span> <span class="synStatement">KEY</span>, title <span class="synType">varchar(</span><span class="synConstant">255</span><span class="synType">)</span>, x_id <span class="synType">int</span>); </pre> <p><code>x_id</code>は結局必要なカラムではありませんので、内容としては無視してください。後述していますが、事象の再現として断念したprimary key以外のindexにて、インサートインテンションロックをかけようと検証した際の名残です。</p> <h3 id="実際に行った操作">実際に行った操作</h3> <p>事前のテーブルの状態は下記の通りです。</p> <pre class="code lang-mysql" data-lang="mysql" data-unlink><span class="synStatement">select</span> * <span class="synStatement">from</span> books; +----+--------+------+ | id | title | x_id | +----+--------+------+ | <span class="synConstant">10</span> | apatch | <span class="synSpecial">NULL</span> | | <span class="synConstant">20</span> | beach | <span class="synSpecial">NULL</span> | | <span class="synConstant">30</span> | chair | <span class="synSpecial">NULL</span> | +----+--------+------+ </pre> <p>T(1)は後述しているLATEST DETECTED DEADLOCK中の(1) TRANSACTIONを, T(2)は(2) TRANSACTIONになります。</p> <ol> <li>T(1): <code>update books set title="xxx" WHERE id BETWEEN 11 AND 19;</code></li> <li>T(2): <code>update books set title="yyy" WHERE id BETWEEN 21 AND 29;</code></li> <li>T(1): <code>insert into books (id, title) values (25, "docker")</code></li> <li>T(2): <code>insert into books (id, title) values (15, "javascript")</code> このタイミングでDeadlockが発生します。</li> </ol> <p><figure class="figure-image figure-image-fotolife" title="DL発生までのシーケンス図"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/k/k-tsutsumida_pn/20230714/20230714204752.png" alt="DL&#x767A;&#x751F;&#x307E;&#x3067;&#x306E;&#x30B7;&#x30FC;&#x30B1;&#x30F3;&#x30B9;&#x56F3;" width="1200" height="477" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>DL発生までのシーケンス図</figcaption></figure></p> <h3 id="deadlockのログ">deadlockのログ</h3> <pre class="code lang-mysql" data-lang="mysql" data-unlink>----------------------<span class="synComment">--</span> <span class="synComment">LATEST DETECTED DEADLOCK</span> ----------------------<span class="synComment">--</span> <span class="synComment">2023-07-03 22:06:37 0x7f22581c1700</span> *** (<span class="synConstant">1</span>) TRANSACTION: TRANSACTION <span class="synConstant">31596</span>, ACTIVE <span class="synConstant">21</span> sec inserting mysql <span class="synStatement">tables</span> <span class="synStatement">in</span> <span class="synStatement">use</span> <span class="synConstant">1</span>, locked <span class="synConstant">1</span> <span class="synStatement">LOCK</span> WAIT <span class="synConstant">3</span> <span class="synStatement">lock</span> struct(s), <span class="synStatement">heap</span> size <span class="synConstant">1136</span>, <span class="synConstant">2</span> <span class="synStatement">row</span> <span class="synStatement">lock</span>(s) MySQL thread id <span class="synConstant">22</span>, OS thread handle <span class="synConstant">139785483310848</span>, query id <span class="synConstant">74112</span> localhost root <span class="synStatement">update</span> <span class="synStatement">insert</span> <span class="synStatement">into</span> books (id, title) <span class="synStatement">values</span> (<span class="synConstant">25</span>, <span class="synConstant">&quot;docker&quot;</span>) *** (<span class="synConstant">1</span>) WAITING <span class="synStatement">FOR</span> THIS <span class="synStatement">LOCK</span> <span class="synStatement">TO</span> BE GRANTED: RECORD LOCKS space id <span class="synConstant">898</span> page <span class="synStatement">no</span> <span class="synConstant">3</span> n bits <span class="synConstant">72</span> <span class="synStatement">index</span> <span class="synStatement">PRIMARY</span> of <span class="synStatement">table</span> `biz3_dev`.`books` trx id <span class="synConstant">31596</span> lock_mode X locks gap before rec <span class="synStatement">insert</span> intention waiting Record <span class="synStatement">lock</span>, <span class="synStatement">heap</span> <span class="synStatement">no</span> <span class="synConstant">4</span> PHYSICAL RECORD: n_fields <span class="synConstant">5</span>; compact format; info bits <span class="synConstant">0</span> <span class="synConstant">0</span>: len <span class="synConstant">4</span>; hex <span class="synConstant">8000001e</span>; <span class="synStatement">asc</span> ;; <span class="synConstant">1</span>: len <span class="synConstant">6</span>; hex 000000007b6b; <span class="synStatement">asc</span> {k;; <span class="synConstant">2</span>: len <span class="synConstant">7</span>; hex e6000001e90110; <span class="synStatement">asc</span> ;; <span class="synConstant">3</span>: len <span class="synConstant">5</span>; hex <span class="synConstant">6368616972</span>; <span class="synStatement">asc</span> chair;; <span class="synConstant">4</span>: SQL <span class="synSpecial">NULL</span>; *** (<span class="synConstant">2</span>) TRANSACTION: TRANSACTION <span class="synConstant">31597</span>, ACTIVE <span class="synConstant">16</span> sec inserting mysql <span class="synStatement">tables</span> <span class="synStatement">in</span> <span class="synStatement">use</span> <span class="synConstant">1</span>, locked <span class="synConstant">1</span> <span class="synConstant">3</span> <span class="synStatement">lock</span> struct(s), <span class="synStatement">heap</span> size <span class="synConstant">1136</span>, <span class="synConstant">2</span> <span class="synStatement">row</span> <span class="synStatement">lock</span>(s) MySQL thread id <span class="synConstant">26</span>, OS thread handle <span class="synConstant">139785483851520</span>, query id <span class="synConstant">74113</span> localhost root <span class="synStatement">update</span> <span class="synStatement">insert</span> <span class="synStatement">into</span> books (id, title) <span class="synStatement">values</span> (<span class="synConstant">15</span>, <span class="synConstant">&quot;javascript&quot;</span>) *** (<span class="synConstant">2</span>) HOLDS THE <span class="synStatement">LOCK</span>(S): RECORD LOCKS space id <span class="synConstant">898</span> page <span class="synStatement">no</span> <span class="synConstant">3</span> n bits <span class="synConstant">72</span> <span class="synStatement">index</span> <span class="synStatement">PRIMARY</span> of <span class="synStatement">table</span> `biz3_dev`.`books` trx id <span class="synConstant">31597</span> lock_mode X Record <span class="synStatement">lock</span>, <span class="synStatement">heap</span> <span class="synStatement">no</span> <span class="synConstant">4</span> PHYSICAL RECORD: n_fields <span class="synConstant">5</span>; compact format; info bits <span class="synConstant">0</span> <span class="synConstant">0</span>: len <span class="synConstant">4</span>; hex <span class="synConstant">8000001e</span>; <span class="synStatement">asc</span> ;; <span class="synConstant">1</span>: len <span class="synConstant">6</span>; hex 000000007b6b; <span class="synStatement">asc</span> {k;; <span class="synConstant">2</span>: len <span class="synConstant">7</span>; hex e6000001e90110; <span class="synStatement">asc</span> ;; <span class="synConstant">3</span>: len <span class="synConstant">5</span>; hex <span class="synConstant">6368616972</span>; <span class="synStatement">asc</span> chair;; <span class="synConstant">4</span>: SQL <span class="synSpecial">NULL</span>; *** (<span class="synConstant">2</span>) WAITING <span class="synStatement">FOR</span> THIS <span class="synStatement">LOCK</span> <span class="synStatement">TO</span> BE GRANTED: RECORD LOCKS space id <span class="synConstant">898</span> page <span class="synStatement">no</span> <span class="synConstant">3</span> n bits <span class="synConstant">72</span> <span class="synStatement">index</span> <span class="synStatement">PRIMARY</span> of <span class="synStatement">table</span> `biz3_dev`.`books` trx id <span class="synConstant">31597</span> lock_mode X locks gap before rec <span class="synStatement">insert</span> intention waiting Record <span class="synStatement">lock</span>, <span class="synStatement">heap</span> <span class="synStatement">no</span> <span class="synConstant">3</span> PHYSICAL RECORD: n_fields <span class="synConstant">5</span>; compact format; info bits <span class="synConstant">0</span> <span class="synConstant">0</span>: len <span class="synConstant">4</span>; hex <span class="synConstant">80000014</span>; <span class="synStatement">asc</span> ;; <span class="synConstant">1</span>: len <span class="synConstant">6</span>; hex 000000007b66; <span class="synStatement">asc</span> {f;; <span class="synConstant">2</span>: len <span class="synConstant">7</span>; hex e30000019d0110; <span class="synStatement">asc</span> ;; <span class="synConstant">3</span>: len <span class="synConstant">5</span>; hex <span class="synConstant">6265616368</span>; <span class="synStatement">asc</span> beach;; <span class="synConstant">4</span>: SQL <span class="synSpecial">NULL</span>; *** WE ROLL BACK TRANSACTION (<span class="synConstant">2</span>) </pre> <p>注目すべきはTRANSACTION (1)と(2)、HOLDS THE LOCK(S)のロックの原因です。</p> <ul> <li>TRANSACTION (1) <ul> <li><code>insert into books (id, title) values (25, "docker")</code></li> <li>(1) WAITING FOR THIS LOCK TO BE GRANTED: <ul> <li><code>RECORD LOCKS space id 898 page no 3 n bits 72 index PRIMARY of table</code>biz3_dev<code>.</code>books<code>trx id 31596 lock_mode X locks gap before rec insert intention waiting</code></li> </ul> </li> </ul> </li> <li>TRANSACTION (2) <ul> <li><code>insert into books (id, title) values (15, "javascript")</code></li> <li>(2) WAITING FOR THIS LOCK TO BE GRANTED:</li> <li><code>RECORD LOCKS space id 898 page no 3 n bits 72 index PRIMARY of table</code>biz3_dev<code>.</code>books<code>trx id 31597 lock_mode X locks gap before rec insert intention waiting</code></li> </ul> </li> <li>(2) HOLDS THE LOCK(S): <ul> <li><code>RECORD LOCKS space id 898 page no 3 n bits 72 index PRIMARY of table</code>biz3_dev<code>.</code>books<code>trx id 31597 lock_mode X</code></li> </ul> </li> </ul> <p>TRANSACTION (1)と(2)両方供インサートインテンションロックであることが<code>lock_mode X locks gap before rec insert intention waiting</code>から分かります。</p> <p>また、HOLDS THE LOCKS(S)にて、booksテーブルのprimary key(id)に対して、X(排他)ロックがかかっている事も分かります。<code>index PRIMARY of table</code>biz3_dev<code>.</code>books<code>trx id 31597 lock_mode X</code> 。</p> <p>TRANSACTION (1)と(2)でギャップロックを用意して、同じくTRANSACTION (1)と(2)でお互いのギャップロックに対してINSERTを行っている為、インサートインテンションロックが原因でデッドロックとなっているというのが、今回の事象となります。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/k/k-tsutsumida_pn/20230714/20230714204619.png" alt="DL&#x767A;&#x751F;&#x307E;&#x3067;&#x306E;index&#x306E;&#x5909;&#x9077;&#xFF08;&#x524D;&#x534A;&#xFF09;" width="678" height="404" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p><figure class="figure-image figure-image-fotolife" title="DL発生までのindexとロックの動き"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/k/k-tsutsumida_pn/20230714/20230714205658.png" alt="DL&#x767A;&#x751F;&#x307E;&#x3067;&#x306E;index&#x306E;&#x5909;&#x9077;&#xFF08;&#x5F8C;&#x534A;&#xFF09;" width="874" height="394" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>DL発生までのindexとロックの動き</figcaption></figure></p> <h3 id="解説を終えて">解説を終えて</h3> <p>さて、検証環境を用意して(ほぼ)同様のデッドロックを用意したと記載をしましたが、これは本番ではもう少し複雑な状況でデッドロックが発生していた為です。その状況を検証環境で用意する事が厳しかった事と、解説の記事である事から簡易的な内容で紹介する事になりました。</p> <p>本番では、インデックスレコードの対象となっているのがprimary keyではなく、foreign keyでかつNOT NULLとなっておりまして、HOLDS THE LOCKSでのロック内容にも、インサートインデックスロックが発生しているとありました。この難しい点は3つあります。</p> <ol> <li>INSERT句で行を挿入しているというのにforeign key側でギャップロックを発生させて、foreign key側の行に対してインサートインテンションロックを発生させないといけない点。</li> <li>HOLDS THE LOCK(S)を発生させる処理もインサートインテンションロックとなるようにする必要がある点。</li> <li>HOLDS THE LOCK(S)でインサートインテンションロックをかけた際にギャップロックとなるようにし、そのギャップロックの部分にINSERT処理を行ってインテンションロックをかけないといけない点。</li> </ol> <p>書いててややこしいですね。何とか1と2を発生させる事は出来たのですが、3を満たす方法や状況がついに分からなく、その点は妥協した事になります。本番でも稀にしか発生しないdeadlockとなっておりまして、新たにログを取る事も難しいですし、記録してあるログも手順等は無いという状況で色々と試しましたが、見つかりませんでした。最終手的にコピペミスなのではと疑って終わる事にしました。</p> <p>今回の執筆中に、いくつかブログネタを見つけましたので、そのネタをまとめる内にもし再現方法が分かれば載せようとは思いますが少し悔いが残る形となってしまったのは残念です。</p> <h2 id="おわりに">おわりに</h2> <p>幸いこのdeadlockは発生しても片方はロールバックによってトランザクション中の処理が全て無かったことにされ、もう片方は正常に成功するようになっていた事と、失敗した処理も成功するまで再実行できるようになっていましたので、データに不整合が発生したり、実行されなければいけない処理が実行されなくなるというようなことはありませんでした。この事象を発生させないようにするには、トランザクション分離レベルを変更する事もありますが、そうするとケースによってはデータの不整合が発生してしまうのを許容してしまう事になるため、処理の整理が必要になりました。この処理の整理もかなり骨が折れそうな作業でして、リレーショナルデータベースはACID特性を活かしてデータを保存する仕組みですが、厳密に実装するとなると相当に奥が深い問題なのだと改めて感じることが出来ました。</p> <p>ひとえにdeadlockの発生といっても、対処方法は様々で根本から解消したり、回避したり、発生することを許容するなどある事を知れたのは今後の考え方としても役立つかなと思いました。「解説を終えて」でも記載しましたが、まだまだ理解しきれていない部分もあります。その部分については、頭の片隅に置いて何か思いついた時に改めて取り組んでいこうかと思います。</p> k-tsutsumida_pn deadlock発生時の読み解き方(mysql5.7) その2 Innodbのロックモードについて hatenablog://entry/4207112889969105349 2023-08-09T09:27:49+09:00 2023-08-09T09:27:49+09:00 はじめに システム事業部堤田です。 前回、業務で発生したdeadlockの原因について調査を行い、調べた内容についてブログにて整理を行いました。 今回は、前回の記事では記載しきれなかったインテンションロックについて記載をしていきます。 この記事にて、自身の理解を深めると供に同じように困っている人の一助になれば幸いです。 前回の記事:deadlock発生時の読み解き方(mysql5.7) 今回の記事で、実際発生したdeadlockのログについての解説も行う予定でしたが、その解説に必要なMySQLの用語の整理を含めると記載量が多くなりましたので分けることにしました。 deadloockログを読み解… <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/z/zenet-tech/20230809/20230809092024.png" width="500" height="266" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <h2 id="はじめに">はじめに</h2> <p>システム事業部堤田です。</p> <p>前回、業務で発生したdeadlockの原因について調査を行い、調べた内容についてブログにて整理を行いました。 今回は、前回の記事では記載しきれなかったインテンションロックについて記載をしていきます。 この記事にて、自身の理解を深めると供に同じように困っている人の一助になれば幸いです。</p> <p><a href="https://media.zenet-web.co.jp/entry/2023/02/08/101115">前回の記事:deadlock発生時の読み解き方(mysql5.7)</a></p> <p>今回の記事で、実際発生したdeadlockのログについての解説も行う予定でしたが、その解説に必要なMySQLの用語の整理を含めると記載量が多くなりましたので分けることにしました。 deadloockログを読み解くために、MySQLのロックモードである、インテンションロック、レコードロック、ギャップロック、ネクストキーロック、インサートインテンションロックを説明します。</p> <p>それぞれのロックモードの特徴を踏まえた上で、次の記事にてインサートインテンションロックが原因で発生したDeadlockについて実例を用いて解説していきます。</p> <h3 id="インテンションロックについて">インテンションロックについて</h3> <p>公式リファレンスの説明は<a href="https://dev.mysql.com/doc/refman/5.7/en/innodb-locking.html#innodb-intention-locks:title">こちら</a>より。 MySQL5.7の日本語はありませんが、<a href="https://dev.mysql.com/doc/refman/8.0/ja/innodb-locking.html#innodb-intention-locks">MySQLの8.0だと日本語の説明もあります</a>ので、併せてご確認下さい。</p> <p>インテンション(<a href="https://eow.alc.co.jp/search?q=intention">intention</a>)には意図、目的等の意味があり、これからデータを挿入、更新、削除等をする前に行やテーブルに対してロックをかけようとする(実際にはロックはかけない)事をインテンションロックと呼んでいるそうです。</p> <p>InnoDBには、2つのロックタイプがありそれぞれ、共有(S)ロック、排他(X)ロックと呼びます。それぞれの説明は<a href="https://dev.mysql.com/doc/refman/8.0/ja/innodb-locking.html#innodb-shared-exclusive-locks">こちら</a>の通りです。</p> <blockquote><pre><code>共有 (S) ロックでは、ロックを保持するトランザクションによる行の読み取りが許可されます。 排他 (X) ロックでは、ロックを保持するトランザクションによる行の更新または削除が許可されます。 </code></pre></blockquote> <p>行の読み取りの前にIS(インテンション共有)ロックを、更新・削除時には IX(インテンション排他) ロックをかけてその対象の行が利用できる状態であれば、実際にロックをかけて処理を始めます。 ただ、インテンションロックが競合した場合、そのまま処理が出来る場合と出来ない場合があります。その際のマトリックスが下記のようになります。</p> <p><figure class="figure-image figure-image-fotolife" title="テーブルレベルのロックタイプの互換性"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/k/k-tsutsumida_pn/20230530/20230530203449.png" width="186" height="252" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>テーブルレベルのロックタイプの互換性</figcaption></figure></p> <p>今回の事象の場合、2つのトランザクションでどちらもXロックを取得後、お互いのトランザクションでXロックの部分に対してIX(インテンション排他)ロックをかけようとした為、デッドロックとなってしまったという内容となります。</p> <h3 id="レコードロック-Record-Locks">レコードロック (Record Locks)</h3> <p>公式リファレンスの説明は<a href="https://dev.mysql.com/doc/refman/5.7/en/innodb-locking.html#innodb-record-locks">こちら</a>。</p> <p>インデックスレコード上にセットするロックとなります。INSERT, UPDATE, DELETE句で発生するロックとなります。</p> <p>レコードロックはインデックスレコードに対して常に行われるロックとなり、テーブルにindexを用意しなくともInnodbが用意している<code>hidden clustered index</code>を使ってロックがされるようになっています。hidden clustered indexについては詳しく調べていませんので、興味ある方はお調べ下さい。</p> <p>INSERTでindexを設定しているカラムを追加する際や、updateやdeleteのWHERE句でカラムを指定してそれがindexの場合、そのレコードがロックされます。</p> <h3 id="ギャップロック-Gap-Locks">ギャップロック (Gap Locks)</h3> <p>公式リファレンスの説明は<a href="https://dev.mysql.com/doc/refman/5.7/en/innodb-locking.html#innodb-gap-locks">こちら</a></p> <p><code>A gap lock is a lock on a gap between index records, or a lock on the gap before the first or after the last index record.</code> インデックスレコードとインデックスレコードの間(のメモリ空間の)ロックや、最初のインデックスレコードより前、もしくは最後のインデックスレコードの後ろの空間というようにある空間に対してロックをかける事をギャップロックと呼びます。</p> <p>例として、公式リファレンスに記載の内容を解説します。</p> <ol> <li>事前準備として10, 20, 30の実際のindex値を持つ行を用意します。途中のindex空間は未だ値が入っていない空白の部分です。</li> <li>Transactionを開始して、<code>SELECT c1 FROM t WHERE c1 BETWEEN 10 and 20 FOR UPDATE</code> を実行すると、ここでギャップロックが発生します。</li> <li>更に、別のTransactionでt.c1に対して、15の値をINSERTしようとすると、10から20までの範囲全てにロックがかかっている(ギャップロック)為、処理がストップされます。</li> </ol> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/k/k-tsutsumida_pn/20230714/20230714220008.png" alt="&#x30AE;&#x30E3;&#x30C3;&#x30D7;&#x30ED;&#x30C3;&#x30AF;&#x306E;&#x4F8B;" width="907" height="368" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>SELECT FOR UPDATEやUPDATE, DELETE句はギャップロックが発生する対象となります。また、ギャップロックは空振り(検索対象が0件だった場合)の場合でもギャップロックが発生しますので注意が必要です。 先ほどの例と同様場合、次の場合にギャップロックが発生します。</p> <ol> <li>SELECT FOR UPDATEを用いて、<code>WHERE id = 5;</code>にて、SQLを実行後、別のトランザクションにてidが9以下ののレコードに対してISNERT処理を行おうとした場合。</li> <li>SELECT FOR UPDATEを用いて、<code>WHERE id = 15;</code>にて、SQLを実行後、別のトランザクションにてidが11から19までのレコードに対してISNERT処理を行おうとした場合。</li> <li>SELECT FOR UPDATEを用いて、<code>WHERE id = 35;</code>にて、SQLを実行後、別のトランザクションにてidが31以上のレコードに対してISNERT処理を行おうとした場合。</li> </ol> <p>ギャップロックはトランザクション分離レベルと関わりがあり、こちらを検討することで処理のパフォーマンスが改善したりできます。ただし、データの整合性が崩れる場合もあるので注意となっています。こちらはファジーリードやファントムリード等が関係しますが、今回の内容とは関わりが薄いので割愛します。</p> <h3 id="ネクストキーロック-Next-Key-Locks">ネクストキーロック (Next Key Locks)</h3> <p>公式リファレンスの説明は<a href="https://dev.mysql.com/doc/refman/5.7/en/innodb-locking.html#innodb-next-key-locks">こちら</a>。</p> <p>ネクストキーロックは、レコードロックとギャップロックの組み合わせとあります。フーンなるほどと思いましたが、イマイチイメージをつかむのが難しかったです。 何故なら、ギャップロックでロックさせる際に、idが15に挿入する処理を行いましたが、当然レコードロックにあたるidが15の部分にもロックがかかっている為です。</p> <p>何度もリファレンスを読み返しましたが、まるで分からず時間だけが過ぎる日々でしたが、ありがたいことにネット社会。私と同様に悩んだ方がいてその方もnext key lockについて検証を行い、推測ですが違いを解説されていました。その内容では、ギャップロックの場合は、そのギャップが広がる(狭まる場合もあるかも)可能性があり、ネクストキーロックはギャップを固定できるというものでした。ブログの内容はこちら。 <a href="https://note.com/shift_tech/n/n69aeeac656f9">ギャップロック、ネクストキーロックを起こして挙動を確認してみた</a> 。 実例も踏まえて、非常に分かりやすい内容となっていますのでこちらもチェックして貰えますと幸いです。</p> <p>こちらの記事で理解を深めた結果、ギャップロックとネクストキーロックでの特徴をつかむことが出来ました。</p> <p>ギャップロックは、実データのインデックス値を参照してギャップの範囲が決まる特徴がある。</p> <p>ネクストキーロックは、ギャップロック同様に実データのインデックス値を参照してギャップの範囲を決めますが、末尾のインデックスには改めてインデックスレコードを置いて、ギャップが広がらないようにする特徴がある。</p> <h3 id="インサートインテンションロック-Insert-Intention-Locks">インサートインテンションロック (Insert Intention Locks)</h3> <p>公式リファレンスの説明は<a href="https://dev.mysql.com/doc/refman/5.7/en/innodb-locking.html#innodb-insert-intention-locks">こちら</a></p> <blockquote><p>An insert intention lock is a type of gap lock set by INSERT operations prior to row insertion. This lock signals the intent to insert in such a way that multiple transactions inserting into the same index gap need not wait for each other if they are not inserting at the same position within the gap.</p></blockquote> <p>自分なりにこの分を訳すと次のようになります。</p> <blockquote><p>インサートインテンションロックは、ギャップロックの一種で、INSERT句にて、行の挿入を行う直前にsetされるロックです。 このロックは、複数のトランザクションが同じindexギャップ(お互いロック待ちの必要が無い)に対して、同じ位置のindex以外のindexにINSERT処理をしようとした際に発生します。</p></blockquote> <p>特に2行目の意味がよく分かりませんね。その後に続く解説も確認して自分なりに解釈しましたが、ギャップロックがかかっている範囲に対して、INSERT処理を行おうとするとインサートインテンションロックとなるという事だと判断しました。</p> <p>例ですと、id = 4, id = 7のレコードがあるテーブルに対して、2つのトランザクションでそれぞれid = 5とid = 6にINSERTするのは、当然ロックはかかりませんが、id が 5から6の範囲でギャップロックをかけた後に別のトランザクションでid = 5 or 6にINSERTしようとするとインサートインテンションロックになります。という事を記載してありました。</p> <p>ギャップロックがかかっている領域に対してINSERTで行を挿入しようとすると発生するロックという事です。</p> <h2 id="ロックモードについて調べてみて">ロックモードについて調べてみて</h2> <p>デッドロックが発生する原因を調査して、それぞれの特徴を区別できるまでMySQLのリファレンスを読み漁りましたが、中々説明を読むだけでは腑に落ちる事が少なかったので苦労しました。</p> <p>DBスペシャリストの勉強はしていたのですが、実践の知識はまだまだ足りないなと思い知りました。今回の調査で初めてインテンションロックという言葉も知りましたし。。まぁただ、それもそのはずで、インテンションロックはストレージエンジンであるInnodbで使われるロックの種類の一つであり、Innodbを使う上では知っておく必要がある知識ではありますが、データベース全般に関する知識ではなかったからです。当たり前ですが、DBスペシャリストはデータベースの知識としての共通項になっていて、実践となると実践用に特化した別の技術や知識が必要になるという事を改めて感じた一件となりました。</p> <p>今回ストレージエンジンについても非常に勉強になりました。これに取り組む前は、indexが絡むことでデッドロックが発生するケースがある等想像も出来ていませんでした。調査や検証にかなり時間を費やしてしましましたので、願わくばより分かりやすいリファレンスが用意される事、特に例が充実される事を祈ります。</p> <p>また、この記事で解説したロックモードは次回の記事で必要になるインサートインテンションロックまでです。リファレンスを見ると、他にもAUTO-INCロックや、空間インデックスの述語ロックもあります。今後、もしかしたら解説として付け加えるかもしれませんが、他にもロックモードがあるという事は知っておいてもらえればと思います。</p> <p>次の記事は、実際にインサートインテンションロックによって、デッドロックが発生した事象についての具体的な説明をしますので、こちらの記事を見返しながら理解を深めていってもらえれば幸いです。</p> <p>また、翻訳や解釈等記載内容にご指摘ある場合は随時受け付けておりますので、何かありましたら遠慮なくコメントして頂けると幸いです。</p> k-tsutsumida_pn ブランチのチェックアウトができない!? そんなときの解決策 hatenablog://entry/820878482942165102 2023-08-02T15:22:24+09:00 2023-08-02T15:22:24+09:00 git checkoutを実行したらエラー 解決策1つ目:git commit 解決策2つ目:git stash 番外編 git clean git checkoutを実行したらエラー こんにちは。ゼネットの江積です。 gitにてブランチのチェックアウトをしようと、git checkoutコマンドを実行したらこのようなエラーが error: Your local changes to the following files would be overwritten by checkout : 原因のファイル名 これは、このままcheckoutするとローカルブランチにあるファイルの変更内容が失わ… <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/z/zenet-tech/20230621/20230621093550.png" width="500" height="266" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <ul> <li><span style="text-decoration: underline;">git checkoutを実行したらエラー</span></li> <li><span style="text-decoration: underline;">解決策1つ目:git commit</span></li> <li><span style="text-decoration: underline;">解決策2つ目:git stash</span></li> <li><span style="text-decoration: underline;">番外編 git clean</span></li> </ul> <p> </p> <h3 id="git-checkoutを実行したらエラー" style="text-align: left;"><span style="color: #e94b24;">git checkoutを実行したらエラー</span></h3> <p>こんにちは。ゼネットの江積です。</p> <p style="text-align: left;">gitにてブランチのチェックアウトをしようと、git checkoutコマンドを実行したらこのようなエラーが</p> <blockquote> <p>error: Your local changes to the following files would be overwritten by checkout :</p> <p>原因のファイル名</p> </blockquote> <p>これは、このままcheckoutするとローカルブランチにあるファイルの変更内容が失われてしまう状況のため起こるエラーです。</p> <p> </p> <p><br /><br /></p> <p style="text-align: left;">このようなときはcommit かstashコマンドを実行することで解決できるのでご紹介します。</p> <p> </p> <h3 id="解決策1つ目git-commit" style="text-align: left;"><span style="color: #e94b24;">解決策1つ目:git commit</span></h3> <p>commitコマンドで、邪魔になっているファイルの変更を確定してリモートブランチ(Git)に反映させることで解決できます。</p> <p>手順は、普段リモートブランチへ反映させる時と同じです。</p> <blockquote> <p>git add 追加するファイル名</p> <p>git commit -m "コミットメッセージ"</p> <p>git push origin ローカルブランチ名:リモートブランチ名</p> </blockquote> <h4 id=""> </h4> <h4 id="-1"> </h4> <h3 id="解決策2つ目git-stash" style="text-align: left;"><span style="color: #e94b24;">解決策2つ目:git stash</span></h3> <p>「リモートブランチに反映はさせたくない」そんな時もあると思います。</p> <p>そんな時は、stashコマンドで変更内容を退避させましょう。</p> <blockquote> <p>git stash</p> </blockquote> <p>上記のコマンドを入力するだけで完了です。</p> <p>退避させた内容は、git stash listで確認できますし、</p> <p>git stash applyもしくはgit stash popでブランチに戻すこともできます。</p> <h4 id="-2"> </h4> <h4 id="-3"> </h4> <h3 id="番外編-git-clean" style="text-align: left;"><span style="color: #e94b24;">番外編 git clean</span></h3> <p>最初に挙げたエラーではなく、以下のエラーが出る場合があります。</p> <blockquote> <p><span style="color: #1d1c1d; font-family: NotoSansJP, Slack-Lato, Slack-Fractions, appleLogo, sans-serif; font-size: 14px; font-style: normal; font-variant-ligatures: common-ligatures; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #f8f8f8; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial; display: inline !important; float: none;">error: The following untracked working tree files would be overwritten by checkout:</span></p> <p>原因のファイル名</p> </blockquote> <p>これは、ブランチ内に未追跡(存在するはずがない)ファイルがあるために起こるエラーです。</p> <p> </p> <p>私の場合は、直前にコンフリクトの対応をしている中で、あるはずのない他ブランチのファイルが突然現れたことでエラーが起きてしまいました。</p> <p> </p> <p>このエラーは、 stashで退避、もしくはファイルが必要なければcleanコマンドを使って未追跡ファイルを削除するのもありです。</p> <p>git clean -f</p> <p>上記のコマンドを入力することで、現在いるブランチ内の全ての未追跡ファイルが削除されます。</p> <p>これでブランチの移動が可能になります。</p> <p> </p> <p>stashの場合は、uオプションを使用しないと退避できないので注意です。</p> <blockquote> <p>git stash -u </p> </blockquote> <p> </p> <p> </p> <h3 id="まとめ" style="text-align: left;"><span style="color: #e94b24;">まとめ</span></h3> <p>エラーでブランチ移動ができないときは</p> <p style="text-align: left;">1. commitで変更内容をリモートブランチに反映</p> <p>2. stashで変更内容を退避させる</p> <p> </p> <p>参考</p> <p><a href="http://engineer-memo.goodhead.work/pages/242#title_516">http://engineer-memo.goodhead.work/pages/242#title_516</a></p> y-ezumi_st IT未経験者が勉強会に参加してみた~物理セキュリティ~ hatenablog://entry/820878482941329432 2023-08-01T13:42:04+09:00 2023-08-01T13:42:04+09:00 引用:https://www.irasutoya.com/2014/09/blog-post_865.html 目次 1. はじめに 2. 本題 講師紹介 物理セキュリティって何? 3. まとめ 4. 参考 1. はじめに はじめまして、株式会社ゼネットの浅沼です。 今回私は、「物理セキュリティ」についての勉強会に参加してきました。 勉強会では、以下の二点が分かりました。 物理セキュリティとは何か 現場レベルの物理セキュリティ対策 物理セキュリティやITセキュリティに興味のある方は、ご一読ください。 2. 本題 講師紹介 〇お名前 ヨッシーさん 〇職歴 1年目はメーカーの開発職。 5年目に部署… <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/z/zenet-tech/20230627/20230627181704.png" width="500" height="266" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <p> </p> <p><span style="color: #999999;"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/c/c-asanuma_st/20230616/20230616195410.png" width="509" height="337" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></span></p> <p><span style="color: #999999;">引用:<a href="https://www.irasutoya.com/2014/09/blog-post_865.html" style="color: #999999;">https://www.irasutoya.com/2014/09/blog-post_865.html</a></span></p> <p> </p> <p>目次</p> <ul class="table-of-contents" style="box-sizing: border-box; margin: 1em 0px; padding: 1em 1em 1em 2em; border: 1px solid #dfe5e7; color: #333333; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif; font-size: 16px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; background-color: #ffffff; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"> <li>1. はじめに</li> <li style="box-sizing: border-box;"> 2. 本題 <ul style="box-sizing: border-box; margin: 0px 0px 0px 1.5em; padding: 0px;"> <li style="box-sizing: border-box;">講師紹介</li> <li style="box-sizing: border-box;">物理セキュリティって何?</li> </ul> </li> <li>3. まとめ</li> <li style="box-sizing: border-box;">4. 参考</li> </ul> <h3 id="1はじめに"><span style="color: #673ab7;">1. はじめに</span></h3> <p><span style="color: #333333; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif; font-size: 16px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; background-color: #ffffff; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial; display: inline !important; float: none;">はじめまして、株式会社ゼネットの浅沼です。</span></p> <p>今回私は、「<span style="color: #ff5252;">物理セキュリティ</span>」についての勉強会に参加してきました。</p> <p>勉強会では、以下の二点が分かりました。</p> <ul> <li>物理セキュリティとは何か</li> <li>現場レベルの物理セキュリティ対策</li> </ul> <p>物理セキュリティやITセキュリティに興味のある方は、ご一読ください。</p> <h4 id=""> </h4> <p> </p> <h3 id="2本題"><span style="color: #673ab7;">2. 本題</span></h3> <p><span style="text-decoration: underline;">講師紹介</span></p> <p>〇お名前 </p> <p>ヨッシーさん</p> <p>〇職歴 </p> <p>1年目はメーカーの開発職。</p> <p>5年目に部署異動があり、保守部門、SI部門、営業、製品開発を経験。</p> <p>現在は都内でフリーランスのセキュリティエンジニア。</p> <p> </p> <p><span style="text-decoration: underline;">物理セキュリティって何?</span></p> <p>物理セキュリティとは、主に情報を管理しているPCや設備のような</p> <p><strong>実体があるもの(触れることができるもの)</strong>に対して行うセキュリティ対策です。</p> <p> </p> <p>従来物理セキュリティは、外部からの侵入による強盗などから、人命を守る役割がありましたが、</p> <p>近年「情報を守る」という観点からも考えられるように変化してきました。</p> <p> </p> <p>勉強会では具体的な物理セキュリティ対策として、</p> <ul> <li>ダミーの防犯カメラを作業場に設置する</li> <li>PCの移動が頻繁にない場合、PCと机をワイヤーで固定する</li> <li>センサーを利用して、持ち出した場合にアラートが鳴るようにする</li> <li>アラートのソフトウェアを導入し、ケーブルが抜かれるなど特定の動作が行われた場合にアラートが鳴るように設定する</li> </ul> <p>などの対策を紹介してくださりました。</p> <p> </p> <p> </p> <h3 id="3まとめ"><span style="color: #673ab7;">3. まとめ</span></h3> <p>具体的な物理セキュリティ対策を紹介してくださったので、</p> <p>対策方法のイメージが湧きやすく、IT未経験者の私でも理解しやすかったです。</p> <p> </p> <p>特定の動作をするとアラートが鳴るような物理セキュリティ対策があることを初めて知りました。</p> <p>現場を守るための物理セキュリティを私の動作ミスなどで、</p> <p>現場を混乱させるものにしないよう気を付けたいです。</p> <p> </p> <p>勉強会の最後にセキュリティ対策を学ぶコンテンツとして、「<strong>Hack The Box</strong>」をおすすめしていただきました。「Hack The Box」は、マシンのセキュリティホールを突いて点数を稼ぐ、ゲーム方式のコンテンツです。気になった方はぜひ、触ってみてください。</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fwww.hackthebox.com%2F" title="Hacking Training For The Best" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://www.hackthebox.com/">www.hackthebox.com</a></cite></p> <p> </p> <p>また、今回私は「<strong>connpass</strong>」でIT勉強会を探して参加しました。</p> <p>様々な勉強会が日々開催されているので、<span style="color: #333333; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif; font-size: 16px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; background-color: #ffffff; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial; display: inline !important; float: none;">興味があるものに参加してみてはいかがでしょうか。</span></p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fconnpass.com%2F" title="connpass - エンジニアをつなぐIT勉強会支援プラットフォーム" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://connpass.com/">connpass.com</a></cite></p> <p> </p> <h3 id="4参考"><span style="color: #673ab7;">4. 参考</span></h3> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fdmji.co.jp%2Fmedia%2Fwhat-is-physical-security%2F%23outline__1" title="物理セキュリティとは?「対策の考え方」や「具体例」を紹介!" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://dmji.co.jp/media/what-is-physical-security/#outline__1">dmji.co.jp</a></cite></p> c-asanuma_st 【Java Servlet/JSP】新人が分かった!リダイレクトとフォワードの違いと使い方 hatenablog://entry/820878482941619167 2023-07-31T14:46:34+09:00 2023-07-31T14:46:34+09:00 こんにちは!ゼネットの中川です。 今回はリダイレクトとフォワードの違いと使い方について説明していこうと思います。 この記事はこんな人におすすめです。 Java Servletの勉強してるけど、リダイレクトとフォワードって何? どんな時にリダイレクトとフォワードを使うの? 私も研修でリダイレクトとフォワードの違いが分からなかったのですが、理解を深めることができたので紹介したいと思います。 結論 研修中であった出来事 自分の回答 回答のServletB リダイレクト説明 フォワード説明と使用例 まとめ 結論 渡すデータがなく、同じアプリケーションの別機能を使い画面に遷移したい場合はリダイレクトを使… <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/z/zenet-tech/20230623/20230623100001.png" width="500" height="266" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <p>こんにちは!ゼネットの中川です。</p> <p>今回はリダイレクトとフォワードの違いと使い方について説明していこうと思います。</p> <p>この記事はこんな人におすすめです。</p> <p> </p> <ul> <li>Java Servletの勉強してるけど、リダイレクトとフォワードって何?</li> <li>どんな時にリダイレクトとフォワードを使うの?</li> </ul> <p> </p> <p>私も研修でリダイレクトとフォワードの違いが分からなかったのですが、理解を深めることができたので紹介したいと思います。</p> <p> </p> <ul class="table-of-contents"> <li><a href="#結論">結論</a></li> <li><a href="#研修中であった出来事">研修中であった出来事</a><ul> <li><a href="#自分の回答">自分の回答</a></li> <li><a href="#回答のServletB">回答のServletB</a></li> <li><a href="#リダイレクト説明">リダイレクト説明</a></li> </ul> </li> <li><a href="#フォワード説明と使用例">フォワード説明と使用例</a></li> <li><a href="#まとめ">まとめ</a></li> </ul> <h3 id="結論"><span style="color: #1f286f;">結論</span></h3> <ul> <li>渡すデータがなく、同じアプリケーションの別機能を使い画面に遷移したい場合はリダイレクトを使うといい</li> <li>JSP、サーブレット、HTMLに状態を遷移したい場合はフォワードを使うといい</li> </ul> <p> </p> <p>実際にどんな問題点からこのような結論がでたのかコードを使いながら説明していきます。</p> <p> </p> <p> </p> <h3 id="研修中であった出来事"><span style="color: #1f286f;">研修中であった出来事</span></h3> <p>今までページの遷移の時はフォワードを利用して演習を解いていました。しかし、回答例を見たときにリダイレクトを用いて実装をしていました。</p> <p>回答と見比べたときに気づいたこととして同じような処理を2つ書いていたことが分かかりました。</p> <p> </p> <p>今回は簡単なソースコードを利用して状況を説明したいと思います。</p> <p>最初に自分自身が作ったコードです。</p> <h4 id="自分の回答">自分の回答</h4> <p>ServletA</p> <pre class="code lang-java" data-lang="java" data-unlink=""><span class="synPreProc">package</span> controller; <span class="synPreProc">import</span> java.io.IOException; <span class="synPreProc">import</span> javax.servlet.RequestDispatcher; <span class="synPreProc">import</span> javax.servlet.ServletException; <span class="synPreProc">import</span> javax.servlet.http.HttpServlet; <span class="synPreProc">import</span> javax.servlet.http.HttpServletRequest; <span class="synPreProc">import</span> javax.servlet.http.HttpServletResponse; <span class="synType">public</span> <span class="synType">class</span> ServletA <span class="synType">extends</span> HttpServlet{ <span class="synPreProc">@Override</span> <span class="synType">protected</span> <span class="synType">void</span> doGet(HttpServletRequest req, HttpServletResponse resp) <span class="synType">throws</span> ServletException, IOException { String word = <span class="synConstant">"Hello World"</span>; req.setAttribute(<span class="synConstant">"word"</span>, word); RequestDispatcher dispatcher = req.getRequestDispatcher(<span class="synConstant">"initialScreen.jsp"</span>); dispatcher.forward(req, resp); } } </pre> <p>ServletB</p> <pre class="code lang-java" data-lang="java" data-unlink=""><span class="synPreProc">package</span> controller; <span class="synPreProc">import</span> java.io.IOException; <span class="synPreProc">import</span> javax.servlet.RequestDispatcher; <span class="synPreProc">import</span> javax.servlet.ServletException; <span class="synPreProc">import</span> javax.servlet.http.HttpServlet; <span class="synPreProc">import</span> javax.servlet.http.HttpServletRequest; <span class="synPreProc">import</span> javax.servlet.http.HttpServletResponse; <span class="synType">public</span> <span class="synType">class</span> ServletB <span class="synType">extends</span> HttpServlet{ <span class="synPreProc">@Override</span> <span class="synType">protected</span> <span class="synType">void</span> doPost(HttpServletRequest req, HttpServletResponse resp) <span class="synType">throws</span> ServletException, IOException { String word = <span class="synConstant">"Hello World"</span>; req.setAttribute(<span class="synConstant">"word"</span>, word); RequestDispatcher dispatcher = req.getRequestDispatcher(<span class="synConstant">"initialScreen.jsp"</span>); dispatcher.forward(req, resp); } } </pre> <p>JSP</p> <pre class="code JSP" data-lang="JSP" data-unlink="">&lt;!DOCTYPE HTML&gt; &lt;%@ page contentType="text/html;charset=UTF-8" %&gt; &lt;html&gt; &lt;head&gt; &lt;title&gt;初期画面&lt;/title&gt; &lt;meta charset = "UTF-8"&gt; &lt;/head&gt; &lt;body&gt; &lt;h1&gt;初期画面&lt;/h1&gt; &lt;% String word = (String)request.getAttribute("word"); %&gt; &lt;p&gt;&lt;%= word %&gt;&lt;/p&gt; &lt;form action = "./ServletB" method = "POST"&gt; &lt;input type = "submit" value = "送信"&gt; &lt;/form&gt; &lt;/body&gt; &lt;/html&gt;</pre> <p>Web.xml</p> <pre class="code web.xml" data-lang="web.xml" data-unlink="">&lt;web-app&gt; &lt;servlet&gt; &lt;servlet-name&gt;ServletA&lt;/servlet-name&gt; &lt;servlet-class&gt;controller.ServletA&lt;/servlet-class&gt; &lt;/servlet&gt; &lt;servlet-mapping&gt; &lt;servlet-name&gt;ServletA&lt;/servlet-name&gt; &lt;url-pattern&gt;/ServletA&lt;/url-pattern&gt; &lt;/servlet-mapping&gt; &lt;servlet&gt; &lt;servlet-name&gt;ServletB&lt;/servlet-name&gt; &lt;servlet-class&gt;controller.ServletB&lt;/servlet-class&gt; &lt;/servlet&gt; &lt;servlet-mapping&gt; &lt;servlet-name&gt;ServletB&lt;/servlet-name&gt; &lt;url-pattern&gt;/ServletB&lt;/url-pattern&gt; &lt;/servlet-mapping&gt; &lt;/web-app&gt;</pre> <p>画面</p> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/s/s-nakagawa_st/20230615/20230615184532.png" width="656" height="352" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <p>実際にフォワードを利用してJSPに遷移するようにしたものです。ServletAとServletBを見てみると同じような処理をしていることが分かると思います。流れとしては</p> <p>URL→ServletA→JSP→送信ボタンを押す→ServletB→JSP</p> <p> </p> <p>次に回答のServletBを見てみると</p> <h4 id="回答のServletB">回答のServletB</h4> <p>回答は</p> <pre class="code lang-java" data-lang="java" data-unlink=""><span class="synPreProc">package</span> controller; <span class="synPreProc">import</span> java.io.IOException; <span class="synPreProc">import</span> javax.servlet.ServletException; <span class="synPreProc">import</span> javax.servlet.http.HttpServlet; <span class="synPreProc">import</span> javax.servlet.http.HttpServletRequest; <span class="synPreProc">import</span> javax.servlet.http.HttpServletResponse; <span class="synType">public</span> <span class="synType">class</span> ServletB <span class="synType">extends</span> HttpServlet{ <span class="synPreProc">@Override</span> <span class="synType">protected</span> <span class="synType">void</span> doPost(HttpServletRequest req, HttpServletResponse resp) <span class="synType">throws</span> ServletException, IOException { resp.sendRedirect(<span class="synConstant">"./ServletA"</span>); } } </pre> <p>URL→ServletA→JSP→送信ボタンを押す→ServletB→<strong>ServletA→JSP</strong></p> <p>と遷移するといった流れになりました。</p> <p> </p> <p>画面で見たときは見た目は同じなのですが、フォワードの場合同じ処理をしているというのが分かると思います。</p> <p> </p> <p>次にフォワードとリダイレクトの説明とメリット、デメリットを説明します。</p> <p> </p> <h4 id="リダイレクト説明">リダイレクト説明</h4> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/s/s-nakagawa_st/20230616/20230616185640.png" width="518" height="424" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <p><br /><br /></p> <p>リダイレクトは最初ユーザからリクエストが送られ、サーバはユーザに対してこのURLでリクエストを返してと返します。</p> <p>その後、もう一度ユーザはサーバから言われたURLでリクエストをし、サーバが処理をするという流れになっています。</p> <p> </p> <p>リダイレクトをするメリットとしては</p> <ul> <li>外部サーバのページに移動できる</li> </ul> <p>また、デメリットとしては</p> <ul> <li>リクエスト、レスポンスを2往復するので、性能的に悪い</li> <li>リクエストスコープに値を格納しても、データを渡すことができない</li> </ul> <p> </p> <p> </p> <h3 id="フォワード説明と使用例"><span style="color: #1f286f;">フォワード説明と使用例</span></h3> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/s/s-nakagawa_st/20230616/20230616190000.png" width="530" height="320" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <p><br /><br /></p> <p>フォワードの場合はユーザからのリクエストが送られてきたあと、サーバはユーザに対してレスポンスを返すという流れになっています。</p> <p> </p> <p>フォワードをする上でのメリットは</p> <ul> <li>リダイレクトと比べ通信の往復が少ないので性能的に優れている</li> <li>リクエスト情報を引き継ぐことができる</li> <li>JSP、サーブレット、HTMLでも遷移先に指定することができる</li> </ul> <p>デメリットは</p> <ul> <li>URLが遷移先画面で変化しない</li> </ul> <p> </p> <p> </p> <h3 id="まとめ"><span style="color: #1f286f;">まとめ</span></h3> <ul> <li>渡すデータがなく、同じアプリケーションの別機能を使い画面に遷移したい場合はリダイレクトを使うといい</li> <li>JSP、サーブレット、HTMLに状態を遷移したい場合はフォワードを使うといい</li> </ul> <p> </p> <p> </p> <p>今回の例題ではフォワードの時に短い処理を2回違うサーブレットで同じ処理を書いていました。今回は短い処理でしたが、データベース処理や他のクラスを利用するなどの処理が増えると冗長になり後々困ってくると思います。</p> <p> </p> <p>リダイレクトとフォワードの違いを理解して使いこなせるようになりましょう!</p> <p> </p> s-nakagawa_st Java初学者が「Java言語で学ぶデザインパターン入門」を読んでみて理解できたものは? hatenablog://entry/820878482942168458 2023-07-27T14:27:54+09:00 2023-07-27T14:27:54+09:00 はじめに プログラミング経験ゼロ、Javaを学習し始めて3か月目の新人が「Java言語で学ぶデザインパターン入門」を読んだ感想を共有したいと思います。 はじめに 結論 本の概要と感想 自分なりに考えるデザインパターンの必要性 Adapterパターンから学ぶ継承と委譲とは 継承とは 委譲とは 最後に 参考文献 結論 この本を読んでみて、Java初学者にはすべてを理解することはできませんでしたが、いくつか理解することは可能でした! その中でも「Adapterパターン」と呼ばれるパターンがあり、今まで何気なく使っていた継承の意味を理解することがました。 しかしまだ、デザインパターンの必要性を感じるほ… <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/z/zenet-tech/20230619/20230619175810.png" width="500" height="266" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <h3 id="はじめに"><span style="color: #ff5252;"><strong><span style="text-decoration: underline;">はじめに</span></strong></span></h3> <p>プログラミング経験ゼロ、Javaを学習し始めて3か月目の新人が<span style="color: #000000;"><strong>「Java言語で学ぶデザインパターン入門」</strong></span>を読んだ感想を共有したいと思います。</p> <p> </p> <ul class="table-of-contents"> <li><a href="#はじめに">はじめに</a></li> <li><a href="#結論">結論</a></li> <li><a href="#本の概要と感想">本の概要と感想</a></li> <li><a href="#自分なりに考えるデザインパターンの必要性">自分なりに考えるデザインパターンの必要性</a></li> <li><a href="#Adapterパターンから学ぶ継承と委譲とは">Adapterパターンから学ぶ継承と委譲とは</a><ul> <li><a href="#継承とは">継承とは</a></li> <li><a href="#委譲とは">委譲とは</a></li> </ul> </li> <li><a href="#最後に">最後に</a></li> <li><a href="#参考文献">参考文献</a></li> </ul> <p> </p> <h3 id="結論"><span style="text-decoration: underline; color: #ff5252;">結論</span></h3> <p>この本を読んでみて、Java初学者にはすべてを理解することはできませんでしたが、いくつか理解することは可能でした!</p> <p>その中でも<strong>「Adapterパターン」</strong>と呼ばれるパターンがあり、今まで何気なく使っていた継承の意味を理解することがました。</p> <p>しかしまだ、デザインパターンの必要性を感じるほどプログラミングの経験がないため、ある程度経験を重ねてから読む必要がありそうです。</p> <p> </p> <p> </p> <h3 id="本の概要と感想"><span style="text-decoration: underline; color: #ff5252;">本の概要と感想</span></h3> <p>そもそもデザインパターンとは、<strong>ソフトウェア設計時に繰り返して起こる問題に対して解決する方法のこと</strong>を指しています。</p> <p>デザインパターンは数多く存在しますが、この本では23個のデザインパターンを整理していて分かりやすい解説でした。</p> <p> </p> <p>この本は以下の構成で書かれています。</p> <blockquote> <p>・パターン説明</p> <p>・サンプルプログラム(解説)</p> <p>・パターンに出てくる登場人物</p> <p>・考えを広げるためのヒント</p> <p>・関連しているパターン</p> <p>・この章で学んだこと</p> </blockquote> <p> </p> <p> </p> <p>なかでも理解しやすかった点はクラスを物語の登場人物に例えて説明してくれているところです。サンプルプログラムが理解できなかった時に理解の手助けをしてくれます。</p> <p>また、この本に登場するプログラムは身近なものをプログラミング化してあるため、親近感がわきます。</p> <p> </p> <p> </p> <h3 id="自分なりに考えるデザインパターンの必要性"><span style="text-decoration: underline; color: #ff5252;">自分なりに考えるデザインパターンの必要性</span></h3> <p>研修中にコードを書く上で、<strong>できるだけわかりやすいコードを書くように!</strong></p> <p>と言われてきました。</p> <p>これは、実務に出た際にバグや実装の修正をするのは、必ずしも書いた本人とは限らないためです。また、何年後かに自分で見た際に複雑なコードだと、修正に作った時と同じ分かかってしまいます。</p> <p><strong><span style="text-decoration: underline; color: #333333;">これを解決してくれるのがデザインパターンなのではないでしょうか。</span></strong></p> <p> </p> <p> </p> <h3 id="Adapterパターンから学ぶ継承と委譲とは"><span style="text-decoration: underline; color: #ff5252;">Adapterパターンから学ぶ継承と委譲とは</span></h3> <p>今回私がこの本を読んで理解できたAdapterパターンを紹介しようと思います。</p> <p>Adapterパターンはもともと存在するクラスを再利用できるものだそうです。継承と委譲がAdapterの役割を担っています。</p> <p>今回は継承と委譲で理解したことを自分なりの言葉で紹介したいと思います。分かりやすくするために会議に出席する人を例にします。</p> <ul> <li> <h4 id="継承とは">継承とは</h4> </li> </ul> <figure class="figure-image figure-image-fotolife mceNonEditable" title="継承"> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m-nakayama_st/20230616/20230616193303.png" width="430" height="406" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <figcaption class="mceEditable"></figcaption> </figure> <p>会議に出席する人が意見を発表するために知識人から情報を聞いて発表するというのが継承の役割です。</p> <ul> <li> <h4 id="委譲とは">委譲とは</h4> </li> </ul> <figure class="figure-image figure-image-fotolife mceNonEditable" title="委譲"> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m-nakayama_st/20230616/20230616193355.png" width="498" height="429" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <figcaption class="mceEditable"></figcaption> </figure> <p>部下に知っている情報を託して代わりに会議に出席してもらうというのが今回の委譲の役割です。</p> <p> </p> <p>会議で発表を聞く人は発表内容を知ることができたら誰が発表しても困りません。</p> <p>このように、何かで補って使いたい形にするというのがAdapterパターンですが、二つの違いは発表する人が、情報を得た本人なのか、本人から依頼された人なのかという違いのようです。</p> <p> </p> <p> </p> <h3 id="最後に"><span style="text-decoration: underline; color: #ff5252;">最後に</span></h3> <p>初学者には少し難しい内容ですが、一通りJavaを学び終えてオブジェクト指向に興味がある方、似たようなソースコードを書くようになったけどパターン化できないのかなと感じた方はぜひこの本を手に取ってみてください!新しい発見が見つかるはずです。</p> <p>私もこの本がより理解できるよう学びを進めたいと思います。</p> <p> </p> <p> </p> <h3 id="参考文献"><span style="text-decoration: underline; color: #ff5252;"><strong>参考文献</strong></span></h3> <p> </p> <div class="freezed"> <div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/dp/B09HK66P5X?tag=hatena-22&amp;linkCode=osi&amp;th=1&amp;psc=1" class="hatena-asin-detail-image-link" target="_blank" rel="noopener"><img src="https://m.media-amazon.com/images/I/41xgZhdHu7L._SL500_.jpg" class="hatena-asin-detail-image" alt="Java言語で学ぶデザインパターン入門第3版" title="Java言語で学ぶデザインパターン入門第3版" /></a> <div class="hatena-asin-detail-info"> <p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/dp/B09HK66P5X?tag=hatena-22&amp;linkCode=osi&amp;th=1&amp;psc=1" target="_blank" rel="noopener">Java言語で学ぶデザインパターン入門第3版</a></p> <ul class="hatena-asin-detail-meta"> <li><span class="hatena-asin-detail-label">作者:</span><a href="https://d.hatena.ne.jp/keyword/%B7%EB%BE%EB%20%B9%C0" class="keyword">結城 浩</a></li> <li>SBクリエイティブ</li> </ul> <a href="https://www.amazon.co.jp/dp/B09HK66P5X?tag=hatena-22&amp;linkCode=osi&amp;th=1&amp;psc=1" class="asin-detail-buy" target="_blank" rel="noopener">Amazon</a></div> </div> </div> <p> </p> m-nakayama_st JAVAで"メソッドsize() は型 String で未定義です"エラーが出てきた時の解決法! hatenablog://entry/820878482941600351 2023-07-26T10:28:32+09:00 2023-07-26T10:28:32+09:00 1.はじめに 2.解決方法 ・型をArrayListにする ・インスタンスをArrayListにする 3.そもそもsize()ってなに? 4.length()と何が違うか 5.おわりに 6.参考記事 1.はじめに こんにちは。ゼネットの川村です。 コードを書くときにエラー解決で時間を使いすぎてしまいますよね! "メソッド size() は型 String で未定義です"エラーの対処法を書きます。 この記事が皆さんのお役に立てれば幸いです。 タイトルで起こしたミスは ArrayListのインスタンスクラスのメソッドを Stringクラスのインスタンスで呼び出そうとしたのが原因 以下にコードを記載… <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/z/zenet-tech/20230623/20230623104442.png" width="500" height="266" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /><br /><br /></p> <ul class="table-of-contents"> <li><a href="#1はじめに">1.はじめに</a></li> <li><a href="#2解決方法">2.解決方法</a><ul> <li><a href="#型をArrayListにする">・型をArrayListにする</a></li> <li><a href="#インスタンスをArrayListにする">・インスタンスをArrayListにする</a></li> </ul> </li> <li><a href="#3そもそもsizeってなに">3.そもそもsize()ってなに?</a></li> <li><a href="#4lengthと何が違うか">4.length()と何が違うか</a></li> <li><a href="#5おわりに">5.おわりに</a></li> <li><a href="#6参考記事">6.参考記事</a></li> </ul> <h3 id="1はじめに"><span style="color: #007396;">1.はじめに</span></h3> <p>こんにちは。ゼネットの川村です。</p> <p>コードを書くときにエラー解決で時間を使いすぎてしまいますよね!</p> <p>"メソッド size() は型 String で未定義です"エラーの対処法を書きます。</p> <p>この記事が皆さんのお役に立てれば幸いです。</p> <p> </p> <p>タイトルで起こしたミスは</p> <p><span style="font-size: 150%;"><strong>ArrayListのインスタンスクラスのメソッドを</strong></span></p> <p><span style="font-size: 150%;"><strong>Stringクラスのインスタンスで呼び出そうとしたのが原因</strong></span></p> <p> </p> <p>以下にコードを記載します。</p> <p>エラーとなったコード Question.java</p> <pre class="code lang-java" data-lang="java" data-unlink=""><span class="synPreProc">package</span> array; <span class="synPreProc">import</span> java.util.ArrayList; <span class="synType">public</span> <span class="synType">class</span> Question { <span class="synType">public</span> <span class="synType">static</span> <span class="synType">void</span> main(String args) { String list = <span class="synStatement">new</span> String(); //<span style="color: #000000;">Stringクラスのインスタンスをつかってしまっている</span> list.add(<span class="synConstant">"春"</span>); list.add(<span class="synConstant">"夏"</span>); list.add(<span class="synConstant">"秋"</span>); list.add(<span class="synConstant">"冬"</span>); System.out.println(list.size()); //"メソッドsize()は型Stringで未定義です"エラーが発生した場所<br />     } }</pre> <p>正解のコード Question.java</p> <pre class="code lang-java" data-lang="java" data-unlink=""><span class="synPreProc">package</span> array; <span class="synPreProc">import</span> java.util.ArrayList; <span class="synType">public</span> <span class="synType">class</span> Question {     <span class="synType">public</span> <span class="synType">static</span> <span class="synType">void</span> main(String[] args) {         <span style="color: #ff0000;">ArrayList</span>&lt;String&gt; list = <span class="synStatement">new</span> <span style="color: #ff0000;">ArrayList</span>&lt;&gt;(); //<span style="color: #000000;">ArrayListクラス</span>         list.add(<span class="synConstant">"春"</span>);         list.add(<span class="synConstant">"夏"</span>);         list.add(<span class="synConstant">"秋"</span>);         list.add(<span class="synConstant">"冬"</span>);         System.out.println(list.size());      //正常に処理される     } } </pre> <p><br /><br /></p> <h3 id="2解決方法"><span style="color: #007396;">2.解決方法</span></h3> <h5 id="型をArrayListにする">・型をArrayListにする</h5> <p>ArrayListの生成構文は以下になります。</p> <pre class="code 結果" data-lang="結果" data-unlink=""><span style="color: #ff0000;">ArrayList</span>&lt;データ型&gt; 変数名 = new <span style="color: #ff0000;">ArrayList</span>&lt;&gt;();</pre> <p>確認して欲しいのが『<span style="color: #ff0000;">型</span>』がArrayListかどうかです。</p> <p><strong>size()はArrayListで使うことが出来ます。</strong></p> <p>では、なんでArrayListで使えるかと言うと、ArrayListにsize()のメソッドがあるからです。</p> <p>それがわかるのが<a href="https://docs.oracle.com/javase/jp/8/docs/api/java/util/ArrayList.html#size--">リファレンスサイト</a>です。</p> <p> </p> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m-kawamura_st/20230615/20230615203046.png" width="548" height="338" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <p> </p> <h5 id="インスタンスをArrayListにする">・インスタンスをArrayListにする</h5> <p>次に確認して欲しいのが、『インスタンス』です。<br />参照するインスタンスもArrayListでなくては、size()は使用できません。</p> <p> </p> <p> </p> <h3 id="3そもそもsizeってなに"><span style="color: #007396;">3.そもそもsize()ってなに?</span></h3> <p>size()メソッドとは、配列の要素数(大きさ)を数えることが出来ます。</p> <pre class="code lang-java" data-lang="java" data-unlink=""><span class="synPreProc">import</span> java.util.ArrayList; <span class="synPreProc">import</span> forBlog.Questions; <span class="synType">public</span> <span class="synType">class</span> ArrayPractice {     <span class="synType">public</span> <span class="synType">static</span> <span class="synType">void</span> main(String[] args) {         ArrayList&lt;String&gt; list = <span class="synStatement">new</span> ArrayList&lt;&gt;();         list.add(<span class="synConstant">"春"</span>);         list.add(<span class="synConstant">"夏"</span>);         list.add(<span class="synConstant">"秋"</span>);         list.add(<span class="synConstant">"冬"</span>);         System.out.println(list.size());</pre> <p><strong>出力結果</strong></p> <pre class="code 結果" data-lang="結果" data-unlink="">4</pre> <p>このように要素数("春","夏","秋","冬"だと'4')が出力されました。</p> <p> </p> <p> </p> <h3 id="4lengthと何が違うか"><span style="color: #007396;">4.length()と何が違うか</span></h3> <p>length()は文字列や配列の長さを取得します。</p> <p>Stringクラスの中にlength()があるから使えます。</p> <pre class="code lang-java" data-lang="java" data-unlink=""><span class="synType">public</span> <span class="synType">class</span> ArrayPractice { <span class="synType">public</span> <span class="synType">static</span> <span class="synType">void</span> main(String[] args) { String hello =<span class="synConstant">"こんにちは"</span>; System.out.println(hello.length());</pre> <p><strong>出力結果</strong></p> <pre class="code 結果" data-lang="結果" data-unlink="">5</pre> <p><br />文字列の長さ("こんにちは"だと'5')がint型で出力されます。</p> <p> </p> <p> </p> <h3 id="5おわりに"><span style="color: #007396;">5.おわりに</span></h3> <p>メソッドはクラスの中で指定されたものしか使えません。</p> <p>私も、<a href="https://docs.oracle.com/javase/jp/8/docs/api/java/util/ArrayList.html#size--">リファレンスサイト</a>を読んで『型』『クラス』を理解しました。</p> <p>難しいですが、調べれば必ず身に付くので調べて、理解していきましょう!</p> <p> </p> <p> </p> <h3 id="6参考記事"><span style="color: #007396;">6.参考記事</span></h3> <p>ArrayList (Java Platform SE 8 )</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fdocs.oracle.com%2Fjavase%2Fjp%2F8%2Fdocs%2Fapi%2Fjava%2Futil%2FArrayList.html%23size--" title="ArrayList (Java Platform SE 8)" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://docs.oracle.com/javase/jp/8/docs/api/java/util/ArrayList.html#size--">docs.oracle.com</a></cite></p> <h4 id="5参考記事" style="box-sizing: border-box; color: #3d3f44; line-height: 1.5; clear: both; margin: 2em 0px 1em; font-size: 20.8px; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; background-color: #ffffff; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"></h4> <p> </p> m-kawamura_st 文系未経験は『試して理解 Linuxのしくみ』で「試すな」⁉ ~読み方のススメ~ hatenablog://entry/820878482942120889 2023-07-25T10:28:40+09:00 2023-07-26T10:27:14+09:00 目次 はじめに 「試して理解」なのに「試すな」とは? 本書で分かったこと さいごに はじめに こんにちは!今年の4月から、文系未経験でIT企業に入社した株式会社ゼネットの小椋です!今回はLinuxについての理解を深めようと思い「試して理解 Linuxのしくみ」(武内覚著 技術評論社)を読んでみました。 タイトルでは試すなと言っていますが、この本に書かれている実験パートはちゃんと自分で試したほうが良いです!!ではなぜこのようなタイトルをつけたのか。私がこの本を読んで思った、理解が深まる読み進め方を紹介したいと思います。 「試して理解」なのに「試すな」とは? 最初に申し上げた通り、この本を読みなが… <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/z/zenet-tech/20230621/20230621102605.png" width="500" height="266" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <p>目次</p> <ul class="table-of-contents"> <li><a href="#はじめに">はじめに</a></li> <li><a href="#試して理解なのに試すなとは">「試して理解」なのに「試すな」とは?</a></li> <li><a href="#本書で分かったこと">本書で分かったこと</a></li> <li><a href="#さいごに">さいごに</a></li> </ul> <p> </p> <h3 id="はじめに">はじめに</h3> <p style="text-align: left;"> こんにちは!今年の4月から、文系未経験でIT企業に入社した株式会社ゼネットの小椋です!今回はLinuxについての理解を深めようと思い<span style="color: #62c7c9;"><a href="https://gihyo.jp/book/2018/978-4-7741-9607-7" style="color: #62c7c9;"><span style="font-size: 150%;"><strong>「試して理解 Linuxのしくみ」</strong></span>(武内覚著 技術評論社)</a></span>を読んでみました。</p> <p> タイトルでは試すなと言っていますが、この本に書かれている実験パートは<span style="color: #ff0000;"><strong><u>ちゃんと自分で試したほうが良いです!!</u></strong></span>ではなぜこのようなタイトルをつけたのか。私がこの本を読んで思った、理解が深まる読み進め方を紹介したいと思います。</p> <p> </p> <p> </p> <h3 id="試して理解なのに試すなとは">「試して理解」なのに「試すな」とは?</h3> <p> 最初に申し上げた通り、この本を読みながら<span style="text-decoration: underline;"><span style="color: #00cc00; text-decoration: underline;">自分で動かしたほうが</span></span>、本書に書かれている通り<span style="text-decoration: underline; color: #00cc00;">学習効果が高い</span>と思うので試すべきです。</p> <p> しかしこの本は何の説明もなくGitHubから教材をダウンロードしLinuxを動かすところから始まります。</p> <p> そのためLinuxを使ったことがない、情報系の知識のない私にとって「<span style="color: #0000cc;">試し方」がわからない状態<span style="color: #000000;">でした…。</span></span>試せる状態になるまでに疲れてしまいますし、試しながら読んでも動くのに感動するだけで、よくわからないまま<span style="color: #0000cc;">時間ばかり過ぎていきます</span>。</p> <p>  そこで、試さずに1度<span style="color: #ff0000;">読んでみて</span>ください!本書はLinuxを動かした後の画像や、図表をふんだんに使って書かれており、試さずとも理解できるようになっています。さらに図表が多く字も大きいので<span style="color: #00cc00;"><strong>1日かからないでサクサク読み進められます</strong></span>。そのあとで<span style="color: #ff0000;">試して</span>、<span style="text-decoration: underline;"><strong>本書と自分の環境との違いを楽しんで理解していくのがオススメです!</strong></span></p> <p> </p> <p> </p> <h3 id="本書で分かったこと">本書で分かったこと</h3> <p> 本書はOSがコンピュータを動かすしくみを、Linuxを使って理解していくものになります。わたしは最初の実験を試したとき、なんでhello worldがでたのかもからず、その後のstraceコマンドも何を表示しているかわからずで、<span style="color: #0000cc;">試してもムリなのかと諦めてしまいそうでした…</span></p> <p>  しかしまず読むだけに集中して読み終えると、<span style="text-decoration: underline;"><strong><span style="color: #00cc00; text-decoration: underline;">最初のhello worldはダウンロードしたC言語のプログラムを実行していて、straceコマンドで文字が画面に表示されるまでにプロセスのメモリ領域を確保してwriteコマンドで画面に表示しているという流れが示されているんだ!</span></strong></span>とわかるようになり実験がより楽しくなります。(C言語は知りませんでしたが、どういう実行をしているコードか説明があるので<span style="color: #ff0000;">なんとかなります!</span>)</p> <p> メモリの効率的な確保の仕方や、処理が遅いときの原因などパソコンについて文系未経験でも楽しみながら、少しでもわかるようになる本なのでぜひ皆様も<strong><span style="color: #ff0000;">読んで</span></strong>みて、そして<span style="color: #ff0000;"><strong>試して</strong></span>みてください!</p> <p> </p> <p> 試すために必要なLinuxのインストール方法はこちらがオススメです♪</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Flearn.microsoft.com%2Fja-jp%2Fwindows%2Fwsl%2Finstall" title="WSL のインストール" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://learn.microsoft.com/ja-jp/windows/wsl/install">learn.microsoft.com</a></cite></p> <p>Linux のインストール方法を調べるとUSBにマウントや仮想環境など<span style="color: #0000cc;">難しい用語が飛び交い疲れます</span>。こちらはWindows限定になってしまうのですが、<span style="text-decoration: underline;"><strong>本書と同じUbuntuという環境</strong><strong>から始められる</strong></span>ので安心して試せます!</p> <p> </p> <p> </p> <h3 id="さいごに">さいごに</h3> <p> 一見わかりやすそうな本ですが、文系未経験が何も知らずに読むと大変な目にあったので、今回読み方のススメを書かせていただきました。</p> <p> この記事が皆様の勉強の一助になれば幸いです。</p> <p> </p> <p> </p> <p>参考資料</p> <p> </p> <div class="freezed"> <div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/dp/B079YJS1J1?tag=hatena-22&amp;linkCode=osi&amp;th=1&amp;psc=1" class="hatena-asin-detail-image-link" target="_blank" rel="noopener"><img src="https://m.media-amazon.com/images/I/51CPvtuv+wL._SL500_.jpg" class="hatena-asin-detail-image" alt="[試して理解]Linuxのしくみ ~実験と図解で学ぶOSとハードウェアの基礎知識" title="[試して理解]Linuxのしくみ ~実験と図解で学ぶOSとハードウェアの基礎知識" /></a> <div class="hatena-asin-detail-info"> <p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/dp/B079YJS1J1?tag=hatena-22&amp;linkCode=osi&amp;th=1&amp;psc=1" target="_blank" rel="noopener">[試して理解]Linuxのしくみ ~実験と図解で学ぶOSとハードウェアの基礎知識</a></p> <ul class="hatena-asin-detail-meta"> <li><span class="hatena-asin-detail-label">作者:</span><a href="https://d.hatena.ne.jp/keyword/%C9%F0%C6%E2%20%B3%D0" class="keyword">武内 覚</a></li> <li>技術評論社</li> </ul> <a href="https://www.amazon.co.jp/dp/B079YJS1J1?tag=hatena-22&amp;linkCode=osi&amp;th=1&amp;psc=1" class="asin-detail-buy" target="_blank" rel="noopener">Amazon</a></div> </div> </div> <p> </p> s-ogura_st 【Java】長さが変えられる配列「ArrayList」を使いこなそう!! hatenablog://entry/820878482942159444 2023-07-24T11:36:11+09:00 2023-07-24T11:36:11+09:00 はじめに ArrayListって? 使ってみよう! 宣言 格納 取得 削除 要素数の取得 おわりに 参考文献 はじめに 社会人1年目の平形です。 現在会社でjava研修を行っており、そのなかでリストの中でも特徴的な長さを変えられる配列「ArrayList」の扱い方に少し躓いたので利用方法について簡単にご紹介いたします。 ArrayListって? ArrayListはクラスの一つで、簡単に言うと配列です。ArrayListがなぜ特徴的なのかというと、要素数が決まっていないため、長さを自由に変えることができる(一般的には可変長配列と呼ばれる)からです! とても便利な配列なため、簡単な使い方をご紹介… <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/z/zenet-tech/20230621/20230621132339.png" width="500" height="266" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <ul class="table-of-contents"> <li><a href="#はじめに"> はじめに</a></li> <li><a href="#ArrayListって"> ArrayListって?</a></li> <li><a href="#使ってみよう"> 使ってみよう!</a><ul> <li><a href="#宣言">宣言</a></li> <li><a href="#格納">格納</a></li> <li><a href="#取得">取得</a></li> <li><a href="#削除">削除</a></li> <li><a href="#要素数の取得">要素数の取得</a></li> </ul> </li> <li><a href="#おわりに"> おわりに</a></li> <li><a href="#参考文献"> 参考文献</a></li> </ul> <ul> <li> <h3 id="はじめに"> はじめに</h3> </li> </ul> <p> 社会人1年目の平形です。</p> <p> 現在会社でjava研修を行っており、そのなかでリストの中でも特徴的な<span style="color: #ff0000;"><strong>長さを変えられる配列「ArrayList」</strong></span>の扱い方に少し躓いたので利用方法について簡単にご紹介いたします。</p> <p> </p> <ul> <li> <h3 id="ArrayListって"> ArrayListって?</h3> </li> </ul> <p>ArrayListはクラスの一つで、簡単に言うと配列です。ArrayListがなぜ特徴的なのかというと、要素数が決まっていないため、長さを自由に変えることができる(一般的には<span style="color: #ff0000;"><strong>可変長配列</strong></span>と呼ばれる)からです!</p> <p>とても便利な配列なため、簡単な使い方をご紹介いたします!</p> <p> </p> <ul> <li> <h3 id="使ってみよう"> 使ってみよう!</h3> </li> </ul> <ol> <li> <h4 id="宣言"><strong>宣言</strong></h4> </li> </ol> <p>ArrayListはクラスなのでこのようにインスタンスを生成する宣言をします。</p> <p><span style="font-size: 150%;">ArrayList&lt;<span style="color: #673ab7;"><strong>型の名前</strong></span>&gt; <span style="color: #ff5252;"><strong>変数名</strong></span> = new ArrayList&lt;&gt;();</span></p> <p><strong><span style="font-size: 150%;">例</span></strong></p> <pre class="code lang-java" data-lang="java" data-unlink=""><span style="color: #000000;"><span class="synPreProc">package</span> practice; <span class="synPreProc">import</span> java.util.ArrayList; <span class="synType">public</span> <span class="synType">class</span> sample { <span class="synType">    public</span> <span class="synType">static</span> <span class="synType">void</span> main(String[] args) { <span class="synComment">    //ArrayListの宣言</span>     ArrayList&lt;String&gt; sample = <span class="synStatement">new</span> ArrayList&lt;&gt;();     } } </span></pre> <p><span style="color: #000000;"><span style="color: #333333;"><span style="color: #666666;"><span style="color: #333333;">これで</span><span style="color: #1464b3;"><strong>String</strong>型</span><span style="color: #333333;">の要素を入れられる</span><span style="color: #ff5252;"><strong>sample</strong></span></span>と</span>い</span>う名前のArrayListができました!</p> <p>※「<strong><span style="color: #ff0000;">java.util.ArrayList</span></strong>」のインポートを忘れずに!!</p> <p> </p> <ol start="2"> <li> <h4 id="格納"><strong> </strong><strong>格納</strong></h4> </li> </ol> <p>配列にデータを格納するためにはこのようにaddメソッドを使います。</p> <p><span style="font-size: 150%;"><span style="color: #ff5252;"><strong>変数名</strong></span>.<span style="color: #ff0000;"><strong>add</strong></span>(<span style="color: #1464b3;"><strong>格納したいデータ</strong></span>);</span></p> <p><strong><span style="font-size: 150%;">例</span></strong></p> <pre class="code lang-java" data-lang="java" data-unlink=""><span style="color: #000000;"><span class="synPreProc">package</span> practice;</span> <span style="color: #000000;"><span class="synPreProc">import</span> java.util.ArrayList; <span class="synType">public</span> <span class="synType">class</span> sample { <span class="synType">public</span> <span class="synType">static</span> <span class="synType">void</span> main(String[] args) {     ArrayList&lt;String&gt; sample = <span class="synStatement">new</span> ArrayList&lt;&gt;(); <span class="synComment">    //ArrayListにデータを加える</span>     sample.add(<span class="synConstant">"おはよう"</span>);     } } </span></pre> <p>これで<span style="color: #ff5252;"><strong>sample</strong></span>に<span style="color: #1464b3;">“<strong>おはよう</strong>“</span>というデータを入れることができました!</p> <p>このデータはArrayListの0番目のindexに格納され、もう一度addメソッドを使うと次のデータは1番目に入るという仕組みになっています。</p> <p> </p> <ol start="3"> <li> <h4 id="取得"><strong> </strong><strong>取得</strong></h4> </li> </ol> <p>配列からデータを取得するためにはgetメソッドを使います。</p> <p><span style="font-size: 150%;"><span style="color: #ff5252;"><strong>変数名</strong></span>.<span style="color: #ff0000;"><strong>get</strong></span>(<span style="color: #286f2c;"><strong>index</strong><strong>番号</strong></span>);</span></p> <p><strong><span style="font-size: 150%;">例</span></strong></p> <pre class="code lang-java" data-lang="java" data-unlink=""><span style="color: #000000;"><span class="synPreProc">package</span> practice; <span class="synPreProc">import</span> java.util.ArrayList; <span class="synType">public</span> <span class="synType">class</span> sample { <span class="synType">public</span> <span class="synType">static</span> <span class="synType">void</span> main(String[] args) {     ArrayList&lt;String&gt; sample = <span class="synStatement">new</span> ArrayList&lt;&gt;();     sample.add(<span class="synConstant">"おはよう"</span>); <span class="synComment">    //ArrayListの0番目の要素を取り出す</span>     System.out.println(sample.get(<span class="synConstant">0</span>));     } }<br /></span></pre> <p><span style="color: #333333;"><strong><span style="font-size: 150%;">出力結果</span></strong></span></p> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/s/s-hirakata_st/20230616/20230616194228.png" width="491" height="68" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <p> </p> <p>これで<span style="color: #ff5252;"><strong>sample</strong></span>の0番目に格納されている<span style="color: #1464b3;">“<strong>おはよう</strong>“</span>というデータを取得することができました!</p> <p>※<strong><span style="color: #ff0000;">index番号は0から始まる<span style="color: #000000;">ため要注意です!</span></span></strong></p> <p> </p> <ol start="4"> <li> <h4 id="削除"><strong> </strong><strong>削除</strong></h4> </li> </ol> <p>配列からデータを取得するためにはremoveメソッドを使います。</p> <p><span style="font-size: 150%;"><span style="color: #ff5252;"><strong>変数名</strong></span>.<span style="color: #ff0000;"><strong>remove</strong></span>(<span style="color: #286f2c;"><strong>index</strong><strong>番号</strong></span>);</span></p> <p><strong><span style="font-size: 150%;">例</span></strong></p> <pre class="code lang-java" data-lang="java" data-unlink=""><span style="color: #000000;"><span class="synPreProc">package</span> practice; <span class="synPreProc">import</span> java.util.ArrayList; <span class="synType">public</span> <span class="synType">class</span> sample { <span class="synType">public</span> <span class="synType">static</span> <span class="synType">void</span> main(String[] args) {     ArrayList&lt;String&gt; sample = <span class="synStatement">new</span> ArrayList&lt;&gt;();     sample.add(<span class="synConstant">"おはよう"</span>); <span class="synComment">    //ArrayListの0番目を削除する</span>     sample.remove(<span class="synConstant">0</span>);     System.out.println(sample);     } } </span></pre> <p><span style="color: #000000;"><strong><span style="color: #666666; font-size: 150%;">出力結果</span></strong></span></p> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/s/s-hirakata_st/20230616/20230616194436.png" width="491" height="64" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <p> </p> <p>これで<span style="color: #ff5252;"><strong>sample</strong></span>の0番目に格納されている<span style="color: #1464b3;">“<strong>おはよう</strong>“</span>というデータを削除することができました!</p> <p> </p> <ol start="5"> <li> <h4 id="要素数の取得"><strong> </strong><strong>要素数の取得</strong></h4> </li> </ol> <p>配列からデータを取得するためにはsizeメソッドを使います。</p> <p><span style="font-size: 150%;"><span style="color: #ff5252;"><strong>変数名</strong></span>.<span style="color: #ff0000;"><strong>size</strong></span>();</span></p> <p><strong><span style="font-size: 150%;">例</span></strong></p> <pre class="code lang-java" data-lang="java" data-unlink=""><span style="color: #000000;"><span class="synPreProc">package</span> practice; <span class="synPreProc">import</span> java.util.ArrayList; <span class="synType">public</span> <span class="synType">class</span> sample { <span class="synType">public</span> <span class="synType">static</span> <span class="synType">void</span> main(String[] args) {     ArrayList&lt;String&gt; sample = <span class="synStatement">new</span> ArrayList&lt;&gt;();     sample.add(<span class="synConstant">"おはよう"</span>); <span class="synComment">    //ArrayListのサイズを表示する</span>     System.out.println(sample.size());     } } </span></pre> <p><span style="color: #000000;"><strong><span style="color: #666666; font-size: 150%;">出力結果</span></strong></span></p> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/s/s-hirakata_st/20230616/20230616194544.png" width="484" height="65" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <p> </p> <p>これで<span style="color: #ff5252;"><strong>sample</strong></span>の要素数を取得することができました!</p> <p> </p> <ul> <li> <h3 id="おわりに"><strong> おわりに</strong></h3> </li> </ul> <p>ArrayListはほかのリストと宣言方法や操作の仕方が違うため、戸惑ってしまうかもしれません。しかし、ArrayListには<strong><span style="color: #673ab7;">要素数が決まっていない</span></strong>という大きな特徴があり、そこが最も便利な点となっています。使い方をよく見極めてArrayListを使いこなしましょう!</p> <p> </p> <ul> <li> <h3 id="参考文献"><strong> 参考文献</strong></h3> </li> </ul> <p>9.6 ArrayListクラスについて</p> <p>  <a href="https://kanda-it-school-kensyu.com/java-basic-contents/jb_ch09/jb_0906/">https://kanda-it-school-kensyu.com/java-basic-contents/jb_ch09/jb_0906/</a></p> <p> </p> s-hirakata_st Rubyの開発業務を先輩社員に聞いてみた hatenablog://entry/820878482942169017 2023-07-21T09:15:47+09:00 2023-07-21T09:15:47+09:00 始めまして。ゼネット新人の高澤です。 現在、私はJava・JDBC・Servletを使ったWebアプリケーション開発の研修を受けています。研修の中でJavaの特徴であるオブジェクト指向の良さを感じながらも、他の言語との違いも知りたいと思いました。 そこで、ゼネットの強みであるRuby言語の開発業務について先輩社員にインタビューした内容を紹介したいと思います。 目次 Rubyの特徴について Rubyの開発業務について おわりに Rubyの特徴について (高澤)Rubyの特徴について教えてください。 (西島さん)私がRubyという言語が好きな理由でもあるんですが、「エンジニアが書いていて楽しい」と… <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/z/zenet-tech/20230621/20230621100816.png" width="500" height="266" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <p> </p> <p>始めまして。ゼネット新人の高澤です。</p> <p>現在、私はJava・JDBC・Servletを使ったWebアプリケーション開発の研修を受けています。研修の中でJavaの特徴であるオブジェクト指向の良さを感じながらも、他の言語との違いも知りたいと思いました。</p> <p>そこで、ゼネットの強みであるRuby言語の開発業務について先輩社員にインタビューした内容を紹介したいと思います。</p> <p> </p> <p><strong>目次</strong></p> <ul class="table-of-contents"> <li><a href="#Rubyの特徴について">Rubyの特徴について</a></li> <li><a href="#Rubyの開発業務について">Rubyの開発業務について</a></li> <li><a href="#おわりに">おわりに</a></li> </ul> <h3 id="Rubyの特徴について"><span style="color: #22ac38;">Rubyの特徴について</span></h3> <p>(高澤)Rubyの特徴について教えてください。</p> <p>(西島さん)私がRubyという言語が好きな理由でもあるんですが、「<strong><span style="color: #286f2c;">エンジニアが書いていて楽しい</span></strong>」ということを言語の開発コンセプトにしているという点です。一般的に言語を開発するときには並行処理がしやすいとか、型が厳格でバグが少なくなるとか、処理が高速であるとか、そういったことを考えると思いますが<strong><span style="color: #286f2c;">コードを書く楽しさを大切にしている点</span></strong>が最大の特徴だと思います。「好きこそものの上手なれ」という言葉があるように書いていて楽しい言語を使うことでプログラミングの能力が上達しやすいと感じますし、コミュニティも大きなものになっていっていると思います。</p> <p>(高澤)プログラムを書いて動くシステムができあがったときがとても楽しく、次に挑戦してみようと意欲が湧くのですが、書くことが苦痛で挫折してしまうこともありますよね。その点で書いているときも楽しくあろうとしているRubyは素晴らしく興味を引きますね。</p> <p>(西島さん)また、RubyというとRuby on RailsというWEBアプリケーション開発のフレームワークで効率的に開発ができるのも特徴です。このフレームワークを使い、規約に基づいてソースコードを書くことで<span style="color: #286f2c;"><strong>記述量を減らすことができます</strong></span>。</p> <p>(高澤)プログラマにとって、記述量の少ないコードで開発できるのはとても魅力的ですね!</p> <p>(西島さん)またソースコードもシンプルに書きやすいため、他の人が読んでも分かりやすく<span style="color: #286f2c;"><strong>保守性の高いプログラム</strong></span>が開発できます。</p> <p>(高澤)保守性の高いプログラムの重要性は研修で痛いほど感じるため、これも大きな魅力の1つと思います。</p> <p>(西島さん)最後にアジャイルと親和性が高いことも言えます。Railsですぐに動くアプリケーションが作ってみては、お客様のフィードバックを受け変更してという風にアイディアをすぐに形できます。トレンドや環境の変化が激しい世の中で、システムもそれに合わせて変化が必要なので時代に沿っている開発スタイルを実現しやすいです。</p> <p>(高澤)なるほど、技術の変化や競争が激しいIT業界でマッチした言語なのですね。</p> <p> </p> <p> </p> <h3 id="Rubyの開発業務について"><span style="color: #22ac38;">Rubyの開発業務について</span></h3> <p>(高澤)Rubyでの開発期間はどのくらいでしょうか。</p> <p>(西島さん)案件にもよりますが、およそ2か月~1年でまとまったシステムを作ってそれを繰り返す形です。作って終わりではなく、保守業務も行いながら開発を進めていくので、関係の長いお客様とは10年ほど続いています。</p> <p>(高澤)お仕事ではどのような業種のお客様がいらっしゃいますか。</p> <p>(西島さん)業種は公共、商社、保険、アミューズメントや研修など様々です。ですが、どのお客様も「とにかくアイディアを形にしたい」「システムを作るというよりはビジネスを成長させていきたい」という思いが共通していると思います。</p> <p>(高澤)どのようにアプリ開発をすることが多いのでしょうか。</p> <p>(西島さん)時代の流れや環境に合わせてシステムをお客様とともに形にしていくような開発が多いです。開発は私たちのようなエンジニアだけではなく<span style="color: #286f2c;"><strong>お客様と一緒にビジネスを考え、形にしていくもの</strong></span>だと思っています。「ただシステムを納品すればいい」という考え方ではなくお客様のビジネスが軌道にのってもらうことにやりがいを感じます。</p> <p> </p> <p> </p> <h3 id="おわりに"><span style="color: #22ac38;">おわりに</span></h3> <p> お客様のやりたいことやビジネスを成功させるために、変化が激しいIT業界に合わせRubyとアジャイルを用いてお客様の笑顔につなげていくという思いを強く感じました。<br />自分は大学でアジャイル開発をした経験があるのですが、Rubyはアジャイル開発と親和性が高いという一面を発見することができたことやお客様のビジネスの成功につなげやすい言語であることにとても興味を持ちました。<br />また、書くことの楽しさを大切にしていることや、フレームワークを用いて少ない記述量で開発可能という特徴にも魅力を感じ、今後Rubyを習得していきたいなと思いました。</p> <p> </p> <p> </p> <p> </p> y-takazawa_st 【Java基礎編】少数の乱数を生成する方法 hatenablog://entry/820878482941342068 2023-07-20T14:27:54+09:00 2023-07-21T09:14:28+09:00 皆さん始めまして、ゼネットの小野塚です。 私は現在Javaの研修を受けているのですが、研修中についつい忘れてしまうJavaで少数の乱数を生成する方法について記述していきます。 0~nの範囲で少数の乱数を生成する方法 解説. 例. 0~3の範囲で少数の乱数を生成する方法 まとめ 0~nの範囲で少数の乱数を生成する方法 import java.util.Random; public class Sample { public static void main(String[] args) { //○○には正の整数を代入してください。 int n = ○○; //importしたRandomクラスを… <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/z/zenet-tech/20230623/20230623110340.png" width="500" height="266" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <p>皆さん始めまして、ゼネットの小野塚です。</p> <p>私は現在Javaの研修を受けているのですが、研修中についつい忘れてしまうJavaで少数の乱数を生成する方法について記述していきます。</p> <ul class="table-of-contents"> <li><a href="#0nの範囲で少数の乱数を生成する方法">0~nの範囲で少数の乱数を生成する方法</a><ul> <li><a href="#解説">解説.</a></li> <li><a href="#例-03の範囲で少数の乱数を生成する方法">例. 0~3の範囲で少数の乱数を生成する方法</a></li> </ul> </li> <li><a href="#まとめ">まとめ</a></li> </ul> <p> </p> <p> </p> <h3 id="0nの範囲で少数の乱数を生成する方法">0~nの範囲で少数の乱数を生成する方法</h3> <pre class="code lang-java" data-lang="java" data-unlink=""><span class="synPreProc">import</span> java.util.Random; <span class="synType">public</span> <span class="synType">class</span> Sample { <span class="synType">public</span> <span class="synType">static</span> <span class="synType">void</span> main(String[] args) { <span class="synComment">//○○には正の整数を代入してください。</span> <span class="synType">int</span> n = ○○; <span class="synComment">//importしたRandomクラスを使用する。</span> Random random = <span class="synStatement">new</span> Random(); <span class="synComment">/*</span> <span class="synComment"> *メソッドnextDouble()では0~1のランダムな少数を生成することができる。</span> <span class="synComment"> *ここでnextDouble()に求めたい少数の乱数範囲であるnを乗算する。</span> <span class="synComment"> *nextDouble()*nは元の範囲にnを乗算するので0~nの範囲でランダムな少数を生成することができる。</span> <span class="synComment"> */</span> <span class="synType">double</span> number = random.nextDouble() * n; <span class="synComment">//生成した乱数をコンソールに出力する。</span> System.out.println(number); } } </pre> <h5 id="解説">解説.</h5> <p>上記のように記述することで0~nの範囲で少数の乱数を生成できます。今回のコードで一番覚えてほしいことは、nextDouble()メソッドは0~1の範囲で少数の乱数を生成し、これにnを乗算することで範囲を0~nに変えることができるということです。試しに範囲が0~3の場合でコードを記述し実行してみたいと思います。</p> <p> </p> <h5 id="例-03の範囲で少数の乱数を生成する方法">例. 0~3の範囲で少数の乱数を生成する方法</h5> <pre class="code lang-java" data-lang="java" data-unlink=""><span class="synPreProc">import</span> java.util.Random; <span class="synType">public</span> <span class="synType">class</span> Sample { <span class="synType">public</span> <span class="synType">static</span> <span class="synType">void</span> main(String[] args) { <span class="synType">int</span> n = <span class="synConstant">3</span>; Random random = <span class="synStatement">new</span> Random(); <span class="synComment">//生成した乱数を確認のためコンソールに出力する。</span> <span class="synStatement">for</span>(<span class="synType">int</span> i = <span class="synConstant">0</span>; i &lt; <span class="synConstant">10</span>; i++) { <span class="synType">double</span> number = random.nextDouble() * n; System.out.println("number = "+number); } } } </pre> <p>上記のコードを実行した結果は以下のようになります。</p> <pre class="code 実行結果" data-lang="実行結果" data-unlink="">number = 1.6561121496721563 number = 0.16663784924932834 number = 1.9702597947771134 number = 1.6397226476489655 number = 1.6170923440641378 number = 2.902650883877948 number = 1.3728498874549482 number = 0.41731004043200415 number = 0.00806840776610751 number = 0.46847089350652527</pre> <p>以上より0~3の範囲で正常に乱数が生成されていることが確認できました。また乱数を生成する際に、範囲の境界値であるnの値に負数を代入し、任意のマイナスの範囲で乱数を生成することもできるのでぜひ活用してみて下さい。</p> <p> </p> <p> </p> <h3 id="まとめ">まとめ</h3> <p>私はコードの書き方、使い方をすぐに忘れてしまうので、同じようにすでに学習したが忘れてしまった方や、始めて学習し乱数の生成方法を探している方などの参考になれば幸いです。</p> <p> </p> s-onozuka_st 読むと読まぬでは大違い「達人プログラマー(第2版)熟達に向けたあなたの旅」 hatenablog://entry/820878482941932766 2023-07-19T09:48:28+09:00 2023-07-19T09:48:28+09:00 はじめまして、ゼネットの清水です。 私は現在入社3か月目の新人で、プログラミング経験は大学でかじった程度です。 今回は「達人プログラマー(第2版)熟達に向けたあなたの旅」を読んだので、その感想を述べたいと思います。 達人プログラマー(第2版): 熟達に向けたあなたの旅作者:Thomas,David,Hunt,Andrewオーム社Amazon はじめに “達人プログラマー”とは 何度でも読み返したい おわりに はじめに 突然ですが、“達人プログラマー”と聞いたらどんな人を想像しますか? 私はどんな複雑な機能でも実装できる人だと考えていました。 もちろん間違いではないと思います。ですが私はこの本を… <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/z/zenet-tech/20230621/20230621104631.png" width="500" height="266" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <p> </p> <p>はじめまして、ゼネットの清水です。</p> <p>私は現在入社3か月目の新人で、プログラミング経験は大学でかじった程度です。</p> <p><span style="color: #333333; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif; font-size: 16px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; background-color: #ffffff; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial; display: inline !important; float: none;">今回は</span>「達人プログラマー(第2版)熟達に向けたあなたの旅」を読んだので、その感想を述べたいと思います。</p> <p> </p> <p><div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/dp/4274226298?tag=hatena-22&amp;linkCode=ogi&amp;th=1&amp;psc=1" class="hatena-asin-detail-image-link" target="_blank" rel="noopener"><img src="https://m.media-amazon.com/images/I/51I6qY0nswL._SL500_.jpg" class="hatena-asin-detail-image" alt="達人プログラマー(第2版): 熟達に向けたあなたの旅" title="達人プログラマー(第2版): 熟達に向けたあなたの旅"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/dp/4274226298?tag=hatena-22&amp;linkCode=ogi&amp;th=1&amp;psc=1" target="_blank" rel="noopener">達人プログラマー(第2版): 熟達に向けたあなたの旅</a></p><ul class="hatena-asin-detail-meta"><li><span class="hatena-asin-detail-label">作者:</span><a href="https://d.hatena.ne.jp/keyword/Thomas%2CDavid" class="keyword">Thomas,David</a>,<a href="https://d.hatena.ne.jp/keyword/Hunt%2CAndrew" class="keyword">Hunt,Andrew</a></li><li>オーム社</li></ul><a href="https://www.amazon.co.jp/dp/4274226298?tag=hatena-22&amp;linkCode=ogi&amp;th=1&amp;psc=1" class="asin-detail-buy" target="_blank" rel="noopener">Amazon</a></div></div></p> <ul class="table-of-contents"> <li><a href="#はじめに">はじめに</a></li> <li><a href="#達人プログラマーとは">“達人プログラマー”とは</a></li> <li><a href="#何度でも読み返したい">何度でも読み返したい</a></li> <li><a href="#おわりに">おわりに</a></li> </ul> <p> </p> <h3 id="はじめに"><span style="text-decoration: underline; color: #6a3906;"><strong>はじめに</strong></span></h3> <p>突然ですが、“達人プログラマー”と聞いたらどんな人を想像しますか?</p> <p>私はどんな複雑な機能でも実装できる人だと考えていました。</p> <p>もちろん間違いではないと思います。ですが私はこの本を読んで「なんと狭い視野でプログラマーの仕事を考えていたのだろう!」とハッとさせられました。</p> <p>“達人プログラマー“がどんな存在なのかを知りたい方、今後“達人”を目指したい方全員におすすめしたい一冊です。</p> <p> </p> <p> </p> <h3 id="達人プログラマーとは"><span style="text-decoration: underline; color: #6a3906;"><strong>“達人プログラマー”とは</strong></span></h3> <p>私がこの本を読んで一番驚いたことに、“達人プログラマー”のカバー範囲の広さがあります。</p> <p>「はじめに」で述べたとおり、私は“達人プログラマー“はプログラミングに関する達人なのだと考えていました。ですので、この本の内容も主にプログラミングのテクニックについてだろうと思っていました。</p> <p>しかし実際のところ、この本はプログラマーが関わる工程の端から端まで“達人”であるための考え方について述べていました。例えば、適切な設計方法、良いツールの選び方、チームで作業する際の注意点などです。</p> <p>今新人の私がプロジェクトで関われる工程はごく一部ですが、今後成長していくにつれて増えていくことと思います。その際は、ぜひ本書を読み返して達人の考え方をインプットし直したいと思いました。</p> <p>ですが、私がこの本をまた読み返したいと感じた理由はこれだけではありません。</p> <p>それについては次に述べています。</p> <p> </p> <p> </p> <h3 id="何度でも読み返したい"><span style="text-decoration: underline; color: #6a3906;"><strong>何度でも読み返したい</strong></span></h3> <p>この本には筆者からの問題や課題がたくさん掲載されています。</p> <p>例として一つ紹介します。</p> <blockquote> <p>あなたが日常的に使用している設計原則について考えてください。それは変更をしやすくすることを意図しているでしょうか。</p> </blockquote> <p>本書では章の末尾ごとに上記のような課題が出されます。</p> <p>この課題について、残念ながら今の私では答えることができません。</p> <p>ですが、プログラマーとしての経験を積んだ数年後の私であれば答えられるかもしれません。</p> <p>本書にはこのような、何度でも読み直してそのたびに考えてみたくなる問いがたくさんあります。</p> <p>以上のことからこの本は、読み返すたびに今の自分を見直すきっかけをくれるプログラマー人生に長く寄り添ってくれる一冊だと私は感じました。</p> <p> </p> <p> </p> <h3 id="おわりに"><span style="text-decoration: underline; color: #6a3906;">おわりに</span></h3> <p>研修中に先輩社員に「凄くプログラミングができるだけではだめだ」と言われたことがありました。</p> <p>その時、私は「プログラミング以外の部分を伸ばすにはどうしたらいいのだろう」ともやもやしました。</p> <p>この本を読んでプログラミング以外で大切なこと、それを身に着けるには今日から何をすれば良いかが少しわかった気がします。</p> <p>皆さんも何度も読み返せる本として、今後のプログラマー人生に寄り添う「達人プログラマー(第2版)熟達に向けたあなたの旅」を読んでみてはいかがでしょうか。</p> <p> </p> <p> </p> <p><span style="color: #6a3906;"><strong>参考文献</strong></span></p> <p><a href="https://www.amazon.co.jp/%E9%81%94%E4%BA%BA%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%83%BC-%E7%AC%AC2%E7%89%88-%E7%86%9F%E9%81%94%E3%81%AB%E5%90%91%E3%81%91%E3%81%9F%E3%81%82%E3%81%AA%E3%81%9F%E3%81%AE%E6%97%85-David-Thomas/dp/4274226298">David Thomas , Andrew Hunt , 村上 雅章 「達人プログラマー(第2版): 熟達に向けたあなたの旅」オーム社, 2020年</a></p> k-shimizu_st 【初心者向け】Servlet/JSP間で画面遷移できないときの対処法3選 hatenablog://entry/820878482941932959 2023-07-18T11:26:07+09:00 2023-07-18T11:26:07+09:00 1 はじめに 2 対処法 2.1 パスの誤字 2.2 フォワード/リダイレクトの使用ミス 2.3 Tomcatの不具合 3 まとめ 1 はじめに こんにちは、ゼネットの衣笠です。 私は現在、Javaの研修を行っているのですが、ServletからJSP に画面遷移させるとき、URLの表示が正しく反映されず画面遷移できないということが多くありました。 その際に画面遷移させることができた方法を3つご紹介したいと思います。 2 対処法 2.1 パスの誤字 一番多い間違いのパターンとして、パスの誤字があります。 確認すべき点としては2点あります。 まず、Web.xmlです。 ここで何かしら誤字をしており… <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/z/zenet-tech/20230623/20230623104622.png" width="500" height="266" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <p> </p> <ul class="table-of-contents"> <li><a href="#1はじめに">1 はじめに</a></li> <li><a href="#2対処法">2 対処法</a><ul> <li><a href="#21パスの誤字">2.1 パスの誤字</a></li> <li><a href="#22フォワードリダイレクトの使用ミス">2.2 フォワード/リダイレクトの使用ミス</a></li> <li><a href="#23Tomcatの不具合">2.3 Tomcatの不具合</a></li> </ul> </li> <li><a href="#3まとめ">3 まとめ</a></li> </ul> <h3 id="1はじめに"><span style="color: #007396;">1 はじめに</span></h3> <p> </p> <p>こんにちは、ゼネットの衣笠です。</p> <p> </p> <p>私は現在、Javaの研修を行っているのですが、ServletからJSP</p> <p>に画面遷移させるとき、URLの表示が正しく反映されず画面遷移できないということが多くありました。</p> <p> </p> <p>その際に画面遷移させることができた方法を3つご紹介したいと思います。</p> <p> </p> <p> </p> <h3 id="2対処法"><span style="color: #007396;">2 対処法</span></h3> <h4 id="21パスの誤字"><span style="color: #007396;">2.1 パスの誤字</span></h4> <p>一番多い間違いのパターンとして、パスの誤字があります。</p> <p> </p> <p>確認すべき点としては2点あります。</p> <p> </p> <p>まず、Web.xmlです。</p> <p>ここで何かしら誤字をしており、正しいパスの指定ができていないということが多いです。</p> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/e/e-kinugasa_st/20230615/20230615202212.png" width="886" height="170" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <p> </p> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/e/e-kinugasa_st/20230615/20230615202305.png" width="886" height="192" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <p> </p> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/e/e-kinugasa_st/20230615/20230615202319.png" width="886" height="200" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <p>次にServletです。</p> <p>JSPに遷移させるディスパッチにパスの指定をする際に誤字があると画面遷移ができません。</p> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/e/e-kinugasa_st/20230616/20230616183727.png" width="788" height="351" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <p>大文字・小文字/半角スペースも誤字となってしまうので、よく確認してみてください。</p> <p> </p> <h4 id="22フォワードリダイレクトの使用ミス"><span style="color: #007396;">2.2 フォワード/リダイレクトの使用ミス</span></h4> <p>画面遷移をさせる際にフォワードを使って遷移させる方法と、リダイレクトを使って遷移させる方法があるのですが、どちらを使うのか間違えてしまうとJSPに遷移することができません。</p> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/e/e-kinugasa_st/20230616/20230616183814.png" width="707" height="347" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <p>この2つの違いを理解するのは難しいですが、別の記事でも詳しく解説しているので参考にしてみてください。</p> <p> </p> <p>中川君記事URL</p> <p> </p> <h4 id="23Tomcatの不具合"><span style="color: #007396;">2.3 Tomcatの不具合</span></h4> <p>上記の2つの方法を試してみてもダメな場合は、もしかしたらTomcatに問題があるのかもしれません。</p> <p> </p> <p>Tomcatの問題への対処法を3点あげさせていただきます。</p> <p>※この対処法はすべてEclipseを使用している場合となります</p> <p> </p> <p>・コンテキスト除去・更新</p> <p>対象のプロジェクトを選択し、右クリック→Tomcatプロジェクト→コンテキストの定義を除去</p> <p>を選択した後に、また同じ手順で今度は「コンテキストの定義を更新」を選択します。</p> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/e/e-kinugasa_st/20230616/20230616185211.png" width="502" height="486" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <p> </p> <p>・デフォルトを復元</p> <p>対象のプロジェクトを選択し、上部のタブのプロジェクト→プロパティーを選択します。</p> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/e/e-kinugasa_st/20230616/20230616185124.png" width="641" height="309" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <p>ウィンドウが表示されるので左の欄からTomcatを探します。</p> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/e/e-kinugasa_st/20230616/20230616191806.png" width="617" height="484" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <p>Tomcatを選択出来たら「デフォルトを復元」を選択し、「適用して閉じる」を選択します。</p> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/e/e-kinugasa_st/20230616/20230616191843.png" width="618" height="492" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <p> </p> <p>・バージョンの確認</p> <p>対象のプロジェクトを選択し、上部のタブのウィンドウ→設定を選択します。</p> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/e/e-kinugasa_st/20230616/20230616185051.png" width="741" height="366" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <p>ウィンドウが表示されるので左の欄からTomcatを探します。</p> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/e/e-kinugasa_st/20230616/20230616191920.png" width="496" height="491" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <p><br /><br /></p> <p><br /><br /></p> <p>Tomcatバージョンという欄に今適用されているバージョンが選択されています。</p> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/e/e-kinugasa_st/20230616/20230616191944.png" width="498" height="495" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <p>インストールされているTomcatのバージョンと異なるものが選択されているとTomcatが動かないので、正しいバージョンを選択します。</p> <p> </p> <h3 id="3まとめ"><span style="color: #007396;">3 まとめ</span></h3> <p>画面遷移ができない際、どこが間違えてしまっているかわからないことがあると思うのですが、URLを見て、自分の想定していないURLになっていたら、ぜひ今ご紹介した方法を試してみてください。</p> <p> </p> <p>はじめはわからないことが多く、苦戦すると思いますが、一つ一つ乗り越えていきましょう!</p> <p> </p> <p> </p> <p>参考文献</p> <p> </p> <p>中川君記事URL</p> e-kinugasa_st ほんとに大丈夫!?もくもく会に参加してみた!! hatenablog://entry/820878482941626113 2023-07-14T17:40:40+09:00 2023-07-18T11:25:14+09:00 はじめまして!株式会社ゼネットの遠藤です! 私はIT業界に新卒未経験で入社したのですが、案の定研修で詰まり、 気分転換もかねて良い機会だったのでもくもく会に参加してみました! 今回の会では無料で軽食を頂けて且つITリテラシーの高い方と交流することが出来ました!! また人脈が広がったのは勿論、自分のモチベーションにも良い刺激となりました! もくもく会とは 参加する前のイメージ 参加までの流れ 当日のスケジュール 実際に参加してみて もくもく会とは まずもくもく会とは何か簡単にご説明いたします。 もくもく会とは、複数人が集まっておこなう勉強会や集会のことです。 「黙々(もくもく)と作業をする」とい… <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/z/zenet-tech/20230627/20230627181043.png" width="749" height="398" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>はじめまして!株式会社ゼネットの遠藤です!<br> 私はIT業界に新卒未経験で入社したのですが、案の定研修で詰まり、<br> 気分転換もかねて良い機会だったのでもくもく会に参加してみました!<br> 今回の会では<u><strong>無料で軽食を頂けて且つITリテラシーの高い方と交流することが出来ました!!</u></strong><br> また人脈が広がったのは勿論、<strong><u>自分のモチベーションにも良い刺激となりました!</u></strong></p> <ul class="table-of-contents"> <li><a href="#もくもく会とは">もくもく会とは</a></li> <li><a href="#参加する前のイメージ">参加する前のイメージ</a></li> <li><a href="#参加までの流れ">参加までの流れ</a></li> <li><a href="#当日のスケジュール">当日のスケジュール</a></li> <li><a href="#実際に参加してみて">実際に参加してみて</a></li> </ul> <h4 id="もくもく会とは">もくもく会とは</h4> <p>まずもくもく会とは何か簡単にご説明いたします。</p> <blockquote><p>もくもく会とは、複数人が集まっておこなう勉強会や集会のことです。 「黙々(もくもく)と作業をする」という意味から、もくもく会と呼ばれています。</p></blockquote> <p>企業が主催しているものから個人で主催しているものまで形式、内容も様々です。<br> 私は今回miracleave株式会社が主催する、もくもく会に参加しました!</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fwww.miracleave.co.jp%2F" title="miracleave株式会社" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://www.miracleave.co.jp/">www.miracleave.co.jp</a></cite></p> <p>以下が私が今回参加した企業さんのマイページです。<br> 是非併せて覗いてみてください!!</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fmirameet.connpass.com%2F" title="miracle rabbits" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://mirameet.connpass.com/">mirameet.connpass.com</a></cite></p> <h4 id="参加する前のイメージ">参加する前のイメージ</h4> <p>実際もくもく会に参加する前の個人的な偏見として</p> <ul> <li><p>よくわからない勧誘などがありそう、、</p></li> <li><p>結局マウントを取られるだけなのでは、、</p></li> <li><p>とっつきにくい人ばかりなのではないのか、、</p></li> </ul> <p>あまりもくもく会に対してそこまで良いイメージを抱けずに勝手にネガティブに捉えていました。<br> しかしながら参加した個人としては<strong>全くそんなことはありませんでした!!</strong><br> とても有意義な会でしたのでぜひ詳細をお話しします!</p> <h4 id="参加までの流れ">参加までの流れ</h4> <p>私は今回エンジニアをつなぐ IT勉強会支援プラットフォーム<strong>「connpas」</strong>から<br> 申し込みをおこない参加しました。<br> 簡単な流れとしてサイトに会員登録後、自分の希望の日付と内容を選択し申し込みという流れです!</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fconnpass.com%2F" title="connpass - エンジニアをつなぐIT勉強会支援プラットフォーム" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://connpass.com/">connpass.com</a></cite></p> <h4 id="当日のスケジュール">当日のスケジュール</h4> <p>以下が当日のスケジュールです。</p> <p>19:00~19:05 オープニング<br> 19:05~19:15 自己紹介&amp;もくもく内容発表<br> 19:15~19:25 参加者トークタイム※<br> 19:25~21:15 ~もくもくタイム~<br> 21:15~21:25 成果発表<br> 21:25~21:30 クロージング<br> ※(この日は「AIに仕事を奪われるのか」についてフリートークを行いました)<br> 参加者は主催者の方含め総勢7名でした。<br> 開発エンジニアからインフラ、SIer、フロントエンドエンジニアの方など<br> 多種多様な職種の方が参加されていました!<br> <u>ちなみに私は研修で躓いていたJavaのオブジェクト指向について学習を行いました!</u> <span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/y/y-endo_st/20230616/20230616183324.jpg" width="1200" height="900" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <h4 id="実際に参加してみて">実際に参加してみて</h4> <p>前述した通り、<u><strong>不快な思いをすることは一切なく</strong></u>終始和気あいあいとした雰囲気の中、<br> 皆さん軽食をもぐもぐしながら、もくもくと作業を行っていました!<br> また途中参加途中退出も可能で、急用で抜けている方や途中参加されている方も見受けられました。<br> もくもく会に参加するか迷っている方、不安に思っている方、ぜひ重い腰を上げてもくもく会に参加してみませんか??<br> きっと素晴らしい経験・出会いが待っているはずです!! 以下が私が今回参加した企業さんのマイページです。</p> y-endo_st 【エラー】Javaのfor文とJavaScriptのfor文を混同したら大変な事態に!解決方法を説明します【解決】 hatenablog://entry/820878482941922466 2023-07-13T10:55:09+09:00 2023-07-13T10:55:09+09:00 はじめまして。ゼネットの佐藤です。 新人として現在Java研修を受講しており、その中でJavaとJavaScriptを混同して使用したことで修正に多くの時間をかけることとなってしまいました。 その時に使った解決方法について多くの方に周知させていただければと思い、筆を執らせていただきました。 目次 解決方法 作業環境 何を行いたかったのか 起こったことと解決方法の詳細、所感 起こったこと 解決方法の詳細 所感 解決方法 結論から先に申し上げると、実装したい機能を細分化してJavaで行うものとJavaScriptで行うものに明確に分け、それぞれで独立した処理を行うことで解決しました。 以前はJav… <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/z/zenet-tech/20230621/20230621141031.png" width="500" height="266" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> <p>はじめまして。ゼネットの佐藤です。</p> <p>新人として現在Java研修を受講しており、その中でJavaとJavaScriptを混同して使用したことで修正に多くの時間をかけることとなってしまいました。</p> <p>その時に使った解決方法について多くの方に周知させていただければと思い、筆を執らせていただきました。</p> <p><strong>目次</strong></p> <ul class="table-of-contents"> <li><a href="#解決方法">解決方法</a></li> <li><a href="#作業環境">作業環境</a></li> <li><a href="#何を行いたかったのか">何を行いたかったのか</a></li> <li><a href="#起こったことと解決方法の詳細所感">起こったことと解決方法の詳細、所感</a><ul> <li><a href="#起こったこと">起こったこと</a></li> <li><a href="#解決方法の詳細">解決方法の詳細</a></li> <li><a href="#所感">所感</a></li> </ul> </li> </ul> <h3 id="解決方法">解決方法</h3> <p>結論から先に申し上げると、実装したい機能を細分化してJavaで行うものとJavaScriptで行うものに明確に分け、それぞれで独立した処理を行うことで解決しました。</p> <p>以前はJavaとJavaScriptの担当する箇所が混然となっていましたが、一度機能を細分化することで「Javaが担当する箇所」と「JavaScriptが担当する箇所」に担当箇所の分担が可能になりました。</p> <p>そうしたことで混同は解決され、機能についても思った通りのものを実装することができました。</p> <h3 id="作業環境">作業環境</h3> <ul> <li>Eclipse:Photon Release (4.8.0)</li> <li>Java:java8</li> <li>Tomcat:バージョン8.x</li> </ul> <h3 id="何を行いたかったのか">何を行いたかったのか</h3> <p>説明を単純化するために、以下のような仕様のWebアプリを作りたかったと仮定します。</p> <ul> <li>チャットの履歴を10件ずつ区切っておく</li> <li>区切ったチャットの背景色をそれぞれ違う色で塗りつぶす</li> </ul> <h3 id="起こったことと解決方法の詳細所感">起こったことと解決方法の詳細、所感</h3> <h4 id="起こったこと">起こったこと</h4> <p>Webアプリの作成のために、JSP内に以下のようなコーディングを行いました。</p> <pre class="code lang-jsp" data-lang="jsp" data-unlink><span class="synIdentifier">&lt;%@ </span><span class="synStatement">page</span><span class="synIdentifier"> </span><span class="synType">import</span><span class="synIdentifier">=</span><span class="synConstant">&quot;dto.TestDto&quot;</span><span class="synIdentifier">%&gt;</span> <span class="synIdentifier">&lt;%@ </span><span class="synStatement">page</span><span class="synIdentifier"> </span><span class="synType">import</span><span class="synIdentifier">=</span><span class="synConstant">&quot;java.util.ArrayList&quot;</span><span class="synIdentifier">%&gt;</span> <span class="synIdentifier">&lt;%@ </span><span class="synStatement">page</span><span class="synIdentifier"> </span><span class="synType">language</span><span class="synIdentifier">=</span><span class="synConstant">&quot;java&quot;</span><span class="synIdentifier"> </span><span class="synType">contentType</span><span class="synIdentifier">=</span><span class="synConstant">&quot;text/html; charset=UTF-8&quot;</span> <span class="synIdentifier"> pageEncoding=</span><span class="synConstant">&quot;UTF-8&quot;</span><span class="synIdentifier">%&gt;</span> <span class="synIdentifier">&lt;!DOCTYPE html&gt;</span> <span class="synIdentifier">&lt;</span><span class="synStatement">html</span><span class="synIdentifier">&gt;</span> <span class="synIdentifier">&lt;</span><span class="synStatement">head</span><span class="synIdentifier">&gt;</span> <span class="synIdentifier">&lt;</span><span class="synStatement">meta</span><span class="synIdentifier"> </span><span class="synType">charset</span><span class="synIdentifier">=</span><span class="synConstant">&quot;UTF-8&quot;</span><span class="synIdentifier">&gt;</span> <span class="synIdentifier">&lt;</span><span class="synStatement">title</span><span class="synIdentifier">&gt;</span>Insert title here<span class="synIdentifier">&lt;/</span><span class="synStatement">title</span><span class="synIdentifier">&gt;</span> <span class="synIdentifier">&lt;/</span><span class="synStatement">head</span><span class="synIdentifier">&gt;</span> <span class="synIdentifier">&lt;</span><span class="synStatement">body</span><span class="synIdentifier">&gt;</span> <span class="synIdentifier">&lt;%</span> ArrayList&lt;TestDto&gt; testList = (ArrayList&lt;TestDto&gt;)request.getAttribute(<span class="synConstant">&quot;testList&quot;</span>); <span class="synIdentifier">%&gt;</span> <span class="synIdentifier">&lt;%</span> <span class="synComment">// データベースから取得したデータをHTMLの構文に生成する処理 </span><span class="synIdentifier">%&gt;</span> <span class="synIdentifier">&lt;%</span> <span class="synComment">// 区切った位置を記録する配列の宣言 </span><span class="synIdentifier">%&gt;</span> <span class="synIdentifier">&lt;%</span> ArrayList&lt;Integer&gt; numList = <span class="synStatement">new</span> ArrayList&lt;&gt;(); <span class="synIdentifier">%&gt;</span> <span class="synIdentifier">&lt;%</span> <span class="synStatement">for</span> (<span class="synType">int</span> i = <span class="synConstant">0</span>; i &lt; testList.size() ; i++) { <span class="synIdentifier">%&gt;</span> <span class="synIdentifier">&lt;%</span> TestDto test = testList.get(i); <span class="synIdentifier">%&gt;</span> <span class="synIdentifier">&lt;%</span> <span class="synComment">// リストを10個ずつに区切る処理 </span><span class="synIdentifier">%&gt;</span> <span class="synIdentifier">&lt;%</span> <span class="synStatement">if</span> (i % <span class="synConstant">10</span> == <span class="synConstant">0</span>) { <span class="synIdentifier">%&gt;</span> <span class="synIdentifier">&lt;%</span> <span class="synComment">// 区切った位置をリストに記録する </span><span class="synIdentifier">%&gt;</span> <span class="synIdentifier">&lt;%</span> numList.add(i / <span class="synConstant">10</span>); <span class="synIdentifier">%&gt;</span> <span class="synIdentifier">&lt;</span><span class="synStatement">div</span><span class="synIdentifier"> </span><span class="synType">id</span><span class="synIdentifier">=</span><span class="synConstant">&quot;&lt;%= i %&gt;&quot;</span><span class="synIdentifier">&gt;</span> <span class="synIdentifier">&lt;%</span> } <span class="synIdentifier">%&gt;</span> <span class="synIdentifier">&lt;</span><span class="synStatement">p</span><span class="synIdentifier">&gt;&lt;%=</span> test.getId() <span class="synIdentifier">%&gt;</span>:<span class="synIdentifier">&lt;%=</span> test.getContent() <span class="synIdentifier">%&gt;&lt;/</span><span class="synStatement">p</span><span class="synIdentifier">&gt;</span> <span class="synIdentifier">&lt;%</span> <span class="synStatement">if</span> ((i + <span class="synConstant">1</span>) % <span class="synConstant">10</span> == <span class="synConstant">0</span>) { <span class="synIdentifier">%&gt;</span> <span class="synIdentifier">&lt;/</span><span class="synStatement">div</span><span class="synIdentifier">&gt;</span> <span class="synIdentifier">&lt;%</span> } <span class="synIdentifier">%&gt;</span> <span class="synIdentifier">&lt;%</span> } <span class="synIdentifier">%&gt;</span> <span class="synIdentifier">&lt;/</span><span class="synStatement">body</span><span class="synIdentifier">&gt;</span> <span class="synIdentifier">&lt;</span><span class="synStatement">script</span><span class="synIdentifier"> </span><span class="synType">type</span><span class="synIdentifier">=</span><span class="synConstant">&quot;text/javascript&quot;</span><span class="synIdentifier">&gt;</span> <span class="synSpecial"> &lt;% </span><span class="synComment">// 10個ずつに区切ったリストをそれぞれ色分けする処理 %&gt;</span> <span class="synSpecial"> </span><span class="synStatement">for</span><span class="synSpecial"> </span>(<span class="synIdentifier">let</span><span class="synSpecial"> i = </span>0<span class="synSpecial">; i &lt; &lt;%= numList.size</span>()<span class="synSpecial"> %&gt;; i++</span>)<span class="synIdentifier">{</span> <span class="synSpecial"> </span><span class="synStatement">if</span><span class="synSpecial"> </span>(<span class="synSpecial">&lt;%= numList.get</span>(<span class="synSpecial"> %&gt;i&lt;%= </span>)<span class="synSpecial"> %&gt; % </span>2<span class="synSpecial"> === </span>0)<span class="synIdentifier">{</span> <span class="synSpecial"> </span><span class="synStatement">document</span><span class="synSpecial">.getElementById</span>(<span class="synConstant">&quot;&lt;%= numList.get( %&gt;i&lt;%= ) %&gt;&quot;</span>)<span class="synSpecial">.style.backgroundColor = </span><span class="synConstant">&quot;#ff7f50&quot;</span><span class="synSpecial">;</span> <span class="synSpecial"> </span><span class="synIdentifier">}</span><span class="synSpecial"> </span><span class="synStatement">else</span><span class="synSpecial"> </span><span class="synIdentifier">{</span> <span class="synSpecial"> </span><span class="synStatement">document</span><span class="synSpecial">.getElementById</span>(<span class="synConstant">&quot;&lt;%= numList.get( %&gt;i&lt;%= ) %&gt;&quot;</span>)<span class="synSpecial">.style.backgroundColor = </span><span class="synConstant">&quot;#b0c4de&quot;</span><span class="synSpecial">;</span> <span class="synSpecial"> </span><span class="synIdentifier">}</span> <span class="synSpecial"> </span><span class="synIdentifier">}</span> <span class="synSpecial"> </span><span class="synIdentifier">&lt;/</span><span class="synStatement">script</span><span class="synIdentifier">&gt;</span> <span class="synIdentifier">&lt;/</span><span class="synStatement">html</span><span class="synIdentifier">&gt;</span> </pre> <p>その結果として様々なエラーが発生し、実行することができませんでした。</p> <p>こうしたことの他にもJavaとJavaScriptを組み合わせる試行錯誤の結果として様々なエラーが発生し、プログラムを正常に動かすことができなくなっていました。</p> <h4 id="解決方法の詳細">解決方法の詳細</h4> <p>こうした事態の根本的な解決をするために、冒頭でも述べたように私は実装したい機能を細分化してJavaで行うものとJavaScriptで行うものに明確に分け、それぞれで独立した処理を行うようにしました。</p> <p>以前は機能の分担についてあまり考えずに、JSPファイル内ですべての処理を完結することを意識してコーディングを行っていました。そうした結果、</p> <ul> <li>JavaとJavaScriptの担当する箇所が混然となってしまう</li> <li>エラーによってプログラムが正常に動かなくなってしまう</li> <li>一目で何を行っているのかがわからなくなってしまう</li> </ul> <p>という問題点が発生してしまいました。</p> <p>そこで機能を</p> <p> 機能1. Servletからのチャットデータの受け取り</p> <p> 機能2. チャットデータをHTMLの構文に成形</p> <p> 機能3. HTMLタグへのid属性付与</p> <p> 機能4. 組み立てられたチャットデータのJSPへの貼り付け</p> <p> 機能5. CSSの操作</p> <p>といったように細分化することで、「Javaのmodelクラスが担当する箇所」と「JavaScriptが担当する箇所」に担当箇所の分担が可能になりました。</p> <p>具体的には、以下のようにコーディングを行い、機能の分散を実現しました。</p> <p><strong>Javaのmodelクラス</strong></p> <pre class="code lang-java" data-lang="java" data-unlink><span class="synPreProc">package</span> model; <span class="synPreProc">import</span> java.util.ArrayList; <span class="synPreProc">import</span> dto.TestDto; <span class="synType">public</span> <span class="synType">class</span> TestHTML { <span class="synComment">// HTMLの構文に成形したリストを入れるフィールド変数を宣言する</span> <span class="synType">public</span> String listHTML = <span class="synConstant">&quot;&quot;</span>; <span class="synComment">// リストのHTMLの構文への成形をServletで行うようにした</span> <span class="synComment">// 機能1・2の実装</span> <span class="synType">public</span> TestHTML(ArrayList&lt;TestDto&gt; testList) { <span class="synStatement">for</span> (<span class="synType">int</span> i = <span class="synConstant">0</span>; i &lt; testList.size() ; i++) { TestDto test = testList.get(i); <span class="synComment">// リストを10個ずつに区切る処理</span> <span class="synComment">// 機能3の実装</span> <span class="synStatement">if</span> (i % <span class="synConstant">10</span> == <span class="synConstant">0</span>) { listHTML += <span class="synConstant">&quot;&lt;div id='&quot;</span> + i / <span class="synConstant">10</span> + <span class="synConstant">&quot;'&gt;&quot;</span>; } listHTML += <span class="synConstant">&quot;&lt;p&gt;&quot;</span> + test.getId() + <span class="synConstant">&quot;:&quot;</span> + test.getContent() + <span class="synConstant">&quot;&lt;/p&gt;</span><span class="synSpecial">\n</span><span class="synConstant">&quot;</span>; <span class="synStatement">if</span> ((i + <span class="synConstant">1</span>) % <span class="synConstant">10</span> == <span class="synConstant">0</span>) { listHTML += <span class="synConstant">&quot;&lt;/div&gt;&quot;</span>; } } } <span class="synComment">// 成形したリストを返すメソッド</span> <span class="synType">public</span> String getListHTML() { <span class="synStatement">return</span> listHTML; } } </pre> <p><strong>JSPファイル</strong></p> <pre class="code lang-jsp" data-lang="jsp" data-unlink><span class="synIdentifier">&lt;%@ </span><span class="synStatement">page</span><span class="synIdentifier"> </span><span class="synType">import</span><span class="synIdentifier">=</span><span class="synConstant">&quot;dto.TestDto&quot;</span><span class="synIdentifier">%&gt;</span> <span class="synIdentifier">&lt;%@ </span><span class="synStatement">page</span><span class="synIdentifier"> </span><span class="synType">import</span><span class="synIdentifier">=</span><span class="synConstant">&quot;java.util.ArrayList&quot;</span><span class="synIdentifier">%&gt;</span> <span class="synIdentifier">&lt;%@ </span><span class="synStatement">page</span><span class="synIdentifier"> </span><span class="synType">language</span><span class="synIdentifier">=</span><span class="synConstant">&quot;java&quot;</span><span class="synIdentifier"> </span><span class="synType">contentType</span><span class="synIdentifier">=</span><span class="synConstant">&quot;text/html; charset=UTF-8&quot;</span> <span class="synIdentifier"> pageEncoding=</span><span class="synConstant">&quot;UTF-8&quot;</span><span class="synIdentifier">%&gt;</span> <span class="synIdentifier">&lt;!DOCTYPE html&gt;</span> <span class="synIdentifier">&lt;</span><span class="synStatement">html</span><span class="synIdentifier">&gt;</span> <span class="synIdentifier">&lt;</span><span class="synStatement">head</span><span class="synIdentifier">&gt;</span> <span class="synIdentifier">&lt;</span><span class="synStatement">meta</span><span class="synIdentifier"> </span><span class="synType">charset</span><span class="synIdentifier">=</span><span class="synConstant">&quot;UTF-8&quot;</span><span class="synIdentifier">&gt;</span> <span class="synIdentifier">&lt;</span><span class="synStatement">title</span><span class="synIdentifier">&gt;</span>Insert title here<span class="synIdentifier">&lt;/</span><span class="synStatement">title</span><span class="synIdentifier">&gt;</span> <span class="synIdentifier">&lt;/</span><span class="synStatement">head</span><span class="synIdentifier">&gt;</span> <span class="synIdentifier">&lt;</span><span class="synStatement">body</span><span class="synIdentifier">&gt;</span> <span class="synIdentifier">&lt;%</span> <span class="synComment">// modelクラスで作成したリストを貼り付ける </span><span class="synIdentifier">%&gt;</span> <span class="synIdentifier">&lt;%</span> <span class="synComment">// 機能4の実装 </span><span class="synIdentifier">%&gt;</span> <span class="synIdentifier">&lt;%=</span> (String)request.getAttribute(<span class="synConstant">&quot;testList&quot;</span>) <span class="synIdentifier">%&gt;</span> <span class="synIdentifier">&lt;/</span><span class="synStatement">body</span><span class="synIdentifier">&gt;</span> <span class="synIdentifier">&lt;</span><span class="synStatement">script</span><span class="synIdentifier"> </span><span class="synType">type</span><span class="synIdentifier">=</span><span class="synConstant">&quot;text/javascript&quot;</span><span class="synIdentifier">&gt;</span> <span class="synSpecial"> &lt;% </span><span class="synComment">// 区切った位置の記録をJavaScript上で行うようにした %&gt;</span> <span class="synSpecial"> </span><span class="synIdentifier">let</span><span class="synSpecial"> numList = </span><span class="synIdentifier">[]</span><span class="synSpecial">;</span> <span class="synSpecial"> </span><span class="synStatement">for</span><span class="synSpecial"> </span>(<span class="synIdentifier">let</span><span class="synSpecial"> i = </span>0<span class="synSpecial">; i &lt; &lt;%= </span>(<span class="synStatement">int</span>)<span class="synSpecial">request.getAttribute</span>(<span class="synConstant">&quot;testListSize&quot;</span>)<span class="synSpecial"> %&gt; ; i++</span>)<span class="synSpecial"> </span><span class="synIdentifier">{</span> <span class="synSpecial"> </span><span class="synStatement">if</span><span class="synSpecial"> </span>(<span class="synSpecial">i % </span>10<span class="synSpecial"> === </span>0)<span class="synSpecial"> </span><span class="synIdentifier">{</span> <span class="synSpecial"> numList.push</span>(<span class="synSpecial">i / </span>10)<span class="synSpecial">;</span> <span class="synSpecial"> </span><span class="synIdentifier">}</span> <span class="synSpecial"> </span><span class="synIdentifier">}</span> <span class="synSpecial"> &lt;% </span><span class="synComment">// 10個ずつに区切ったリストをそれぞれ色分けする処理 %&gt;</span> <span class="synSpecial"> &lt;% </span><span class="synComment">// 機能5の実装 %&gt;</span> <span class="synSpecial"> </span><span class="synStatement">for</span><span class="synSpecial"> </span>(<span class="synIdentifier">let</span><span class="synSpecial"> i = </span>0<span class="synSpecial">; i &lt; numList.length; i++</span>)<span class="synIdentifier">{</span> <span class="synSpecial"> console.log</span>(<span class="synSpecial">numList</span><span class="synIdentifier">[</span><span class="synSpecial">i</span><span class="synIdentifier">]</span>)<span class="synSpecial">;</span> <span class="synSpecial"> </span><span class="synStatement">if</span><span class="synSpecial"> </span>(<span class="synSpecial">numList</span><span class="synIdentifier">[</span><span class="synSpecial">i</span><span class="synIdentifier">]</span><span class="synSpecial"> % </span>2<span class="synSpecial"> === </span>0)<span class="synIdentifier">{</span> <span class="synSpecial"> </span><span class="synStatement">document</span><span class="synSpecial">.getElementById</span>(<span class="synSpecial">numList</span><span class="synIdentifier">[</span><span class="synSpecial">i</span><span class="synIdentifier">]</span>)<span class="synSpecial">.style.backgroundColor = </span><span class="synConstant">&quot;#ff7f50&quot;</span><span class="synSpecial">;</span> <span class="synSpecial"> </span><span class="synIdentifier">}</span><span class="synSpecial"> </span><span class="synStatement">else</span><span class="synSpecial"> </span><span class="synIdentifier">{</span> <span class="synSpecial"> </span><span class="synStatement">document</span><span class="synSpecial">.getElementById</span>(<span class="synSpecial">numList</span><span class="synIdentifier">[</span><span class="synSpecial">i</span><span class="synIdentifier">]</span>)<span class="synSpecial">.style.backgroundColor = </span><span class="synConstant">&quot;#b0c4de&quot;</span><span class="synSpecial">;</span> <span class="synSpecial"> </span><span class="synIdentifier">}</span> <span class="synSpecial"> </span><span class="synIdentifier">}</span> <span class="synSpecial"> </span><span class="synIdentifier">&lt;/</span><span class="synStatement">script</span><span class="synIdentifier">&gt;</span> <span class="synIdentifier">&lt;/</span><span class="synStatement">html</span><span class="synIdentifier">&gt;</span> </pre> <p><figure class="figure-image figure-image-fotolife" title="実行後の画面"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/h/h-sato_st/20230616/20230616184201.png" alt="&#x5B9F;&#x884C;&#x5F8C;&#x306E;&#x753B;&#x9762;" width="824" height="684" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>実行後の画面</figcaption></figure></p> <p>これによって上記の問題点は解決され、機能についても思った通りのものを実装することができました。</p> <h4 id="所感">所感</h4> <p>この件を通して、私は</p> <ul> <li>集中しているときは視野が狭くなり、思考が固まりやすくなってしまうということ</li> <li>機能は一つのファイルに集約するのではなく、細分化したうえでそれぞれを異なるファイルで分担し合って処理を行わせた方が良いということ</li> </ul> <p>といったことに気づかされました。</p> <p>また、記事を書くにあたってコード自体についても先輩社員の方に見ていただいたのですが、</p> <ul> <li>サーバサイドとフロントサイドが密接にかかわってしまっていると、開発や保守の観点から見て懸念点がある</li> <li>システム開発は開発業務だけでなく設計とテストの工程も存在しているため、それを意識することでもっとよいコーディングを行うことができる</li> </ul> <p>とアドバイスをいただきました。次からはいただいたアドバイスを基に、設計とテストの工程を意識した開発を行っていきます。</p> <p>最後に、この記事が多くの人の役に立つことを願って筆を置かせていただきます。ご覧いただきありがとうございました。</p> h-sato_st まさに「Webの聖書」! IT初心者が『Webを支える技術』を読んでみた感想 hatenablog://entry/820878482941933346 2023-07-12T09:26:04+09:00 2023-07-12T09:26:04+09:00 はじめまして。株式会社ゼネットの渡辺と申します。 今回は、『Webを支える技術 HTTP、URI、HTML、そしてREST』という 技術書のご紹介です。 IT技術者の方にはWebの理解を深める一冊として、 そうでない方にとっても現在までのWebの歴史書として面白いので、 広く皆様にオススメ出来る一冊です! それでは、いってみましょう! 目次 1. どんな本なの? 2. 初心者には難しい?読んでみての感想 3. こんな人にオススメ! 4. 本書を読む上での注意点 終わりに 1. どんな本なの? この本は、今この記事を読んで下さっている皆様をはじめ、 世界中で広く使われているWebがどのように広ま… <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/z/zenet-tech/20230619/20230619164650.png" width="500" height="266" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <p>はじめまして。株式会社ゼネットの渡辺と申します。</p> <p> </p> <p>今回は、<strong>『Webを支える技術 HTTP、URI、HTML、そしてREST』</strong>という</p> <p>技術書のご紹介です。</p> <p>IT技術者の方には<span style="color: #ff0000;">Webの理解を深める一冊</span>として、</p> <p>そうでない方にとっても現在までの<span style="color: #ff0000;">Webの歴史書</span>として面白いので、</p> <p>広く皆様にオススメ出来る一冊です!</p> <p> </p> <p>それでは、いってみましょう!</p> <p> </p> <p><strong>目次</strong></p> <ul class="table-of-contents"> <li><a href="#1どんな本なの">1. どんな本なの?</a></li> <li><a href="#2初心者には難しい読んでみての感想">2. 初心者には難しい?読んでみての感想</a></li> <li><a href="#3こんな人にオススメ">3. こんな人にオススメ!</a></li> <li><a href="#4本書を読む上での注意点">4. 本書を読む上での注意点</a></li> <li><a href="#終わりに">終わりに</a></li> </ul> <p> </p> <p> </p> <h3 id="1どんな本なの">1. どんな本なの?</h3> <p>  この本は、今この記事を読んで下さっている皆様をはじめ、</p> <p>  世界中で広く使われている<span style="text-decoration: underline;">Webがどのように広まった</span>のか、</p> <p>  <span style="text-decoration: underline;">どんな技術が世界規模のシステムを支えているのか</span>について解説しています。</p> <p> </p> <p>  また、最後には理想的なWebサービスの設計についてもまとめられているので、</p> <p><strong>  「そもそもWebとはどういうものか」</strong>から<strong>Webを作っている技術</strong>、</p> <p>  そして<strong>サービスとしての提供</strong>まで、<span style="color: #ff0000;"><strong>Webの全てが網羅的に</strong></span>書かれています。</p> <p> </p> <p> </p> <h3 id="2初心者には難しい読んでみての感想">2. 初心者には難しい?読んでみての感想</h3> <p>  優れた本は、しばしば聖書(バイブル)と表現されますが、</p> <p><span style="color: #333333;">  </span><span style="text-decoration: underline;"><span style="color: #333333; text-decoration: underline;">本書はWebについての技術がまとめられている</span></span>点においても、</p> <p><span style="color: #333333;">  </span><span style="text-decoration: underline;"><span style="color: #333333; text-decoration: underline;">Webの起こり・黎明期から書かれている歴史書</span></span>という点においても、</p> <p>  まさしく<strong><span style="color: #ff0000;">聖書</span></strong>という表現がぴったりだと感じました。</p> <p> </p> <p>  Webの概要・歴史について書かれている序盤については、</p> <p><span style="color: #ff0000;">   多くの人にとって読みやすい</span>と思いますし、<span style="color: #ff0000;">かなり面白い</span>です。</p> <p> </p> <p>  今となっては世界中の人々が普通に使っているWebですが、</p> <p>  筆者はそれが「普通ではなかった時代」を考えたこともなかったので、</p> <p>  <span style="text-decoration: underline;"> ”SOAP/WS-* vs. REST” の世界標準を賭けた論争</span>の話などは、</p> <p>  昔の話ですが、とても新鮮に感じられました。</p> <p> </p> <p>  本書中盤以降は、「HTTP」や「URI」といった具体的な技術の詳細や</p> <p>  Webサービスの設計について書かれています。</p> <p> </p> <p>  こちらについては、具体的であるため<span style="color: #ff0000;">知識や学びは多い</span>ですが、</p> <p>  裏を返せば<span style="color: #0000cc;">IT専門用語が多く</span>、読み進めていくほど<span style="color: #0000cc;">高度な内容</span>になるので、</p> <p><strong><span style="color: #0000cc;">  本当に何も知らない方が読むには少々ハードルが高いかもしれません</span></strong>。</p> <p>  しかし、<span style="text-decoration: underline;">IT業界2か月の筆者が理解しながら読み進めることが出来る程度</span>なので、</p> <p><span style="color: #ff0000;">  </span><span style="text-decoration: underline;"><span style="color: #ff0000; text-decoration: underline;">そこまで気負うほどではないのかな</span></span>とも思います。</p> <p> </p> <p> </p> <h3 id="3こんな人にオススメ">3. こんな人にオススメ!</h3> <p>  真っ先にオススメしたいのは、<strong><span style="color: #ff0000;">IT技術者、IT業界志望者全員</span></strong>です。</p> <p>  フロントエンド・バックエンド問わず、</p> <p><strong>  Webに全く関わらないIT技術者はいない</strong>と思いますので、</p> <p>  業務の基礎になっているWebを学ぶことは、</p> <p><span style="color: #ff0000;">  業務理解や基礎固めという点で重要</span>だと思います。</p> <p> </p> <p>  また、<span style="color: #ff0000;">インターネットに興味がある人</span>にもオススメです。</p> <p>  「普段何気なく使っているインターネットやWebが一体どういうものだろう」と</p> <p><span style="color: #ff0000;">  </span><span style="text-decoration: underline; color: #ff0000;">一度でも</span>疑問を持ったことがある方であれば、<span style="color: #ff0000;">間違いなく</span>本書が回答になるでしょう。</p> <p> </p> <p> </p> <h3 id="4本書を読む上での注意点">4. 本書を読む上での注意点</h3> <p>  この本は2010年に出版され、現在(2023年6月)に至るまで、</p> <p><span style="color: #ff0000;"><strong>  一度も改定がされていません。</strong></span></p> <p>  ですので、<span style="text-decoration: underline;"><strong>情報が少々古い</strong>・<strong>現在の実情にそぐわない点</strong></span>がある</p> <p>  ということは念頭に置いて読まなければなりません。</p> <p> </p> <p>  また、Webサービスの設計についての解説部分では</p> <p>  実在するWebサービスをもとにして解説していますが、</p> <p><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #333333;">  そちらのサイトは</span></span>現在閲覧できない状態</span>ですので、</p> <p>  サイトを触りながら本書を読み進めるということは出来ない点にも注意です。</p> <p> </p> <p>  ですが、内容については現在にも通じる部分が多いですので、</p> <p><span style="color: #ff0000;"><strong>  「古いから」という理由だけ</strong>で読まないのは<strong>もったいない</strong></span>です。</p> <p> </p> <p> </p> <h3 id="終わりに">終わりに</h3> <p>  本書は、Webについての包括的な知識を学べる、まさしく<span style="color: #ff0000;"><strong>聖書</strong></span>になっていますので、</p> <p>  IT技術者などのWebに携わる方、<span style="color: #ff0000;">特にIT初心者・初学者の方</span>は、</p> <p>  まずは<span style="text-decoration: underline;">この本で一歩を踏み出す</span>というのも一つの手だと思います。</p> <p> </p> <p>  <strong>是非読んで、<span style="color: #ff0000;">現代の必須知識であるWebの知見を深めましょう</span>!</strong></p> <p> </p> <p> </p> <p>書籍リンク</p> <p> </p> <div class="freezed"> <div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/dp/B07JK7FZH2?tag=hatena-22&amp;linkCode=osi&amp;th=1&amp;psc=1" class="hatena-asin-detail-image-link" target="_blank" rel="noopener"><img src="https://m.media-amazon.com/images/I/51HNAhxudcL._SL500_.jpg" class="hatena-asin-detail-image" alt="Webを支える技術 ―― HTTP,URI,HTML,そしてREST WEB+DB PRESS plus" title="Webを支える技術 ―― HTTP,URI,HTML,そしてREST WEB+DB PRESS plus" /></a> <div class="hatena-asin-detail-info"> <p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/dp/B07JK7FZH2?tag=hatena-22&amp;linkCode=osi&amp;th=1&amp;psc=1" target="_blank" rel="noopener">Webを支える技術 ―― HTTP,URI,HTML,そしてREST WEB+DB PRESS plus</a></p> <ul class="hatena-asin-detail-meta"> <li><span class="hatena-asin-detail-label">作者:</span><a href="https://d.hatena.ne.jp/keyword/%BB%B3%CB%DC%20%CD%DB%CA%BF" class="keyword">山本 陽平</a></li> <li>技術評論社</li> </ul> <a href="https://www.amazon.co.jp/dp/B07JK7FZH2?tag=hatena-22&amp;linkCode=osi&amp;th=1&amp;psc=1" class="asin-detail-buy" target="_blank" rel="noopener">Amazon</a></div> </div> </div> <p> </p> t-watanabe_st Excel初心者が感動した効率化テクニック5選!! hatenablog://entry/820878482941342801 2023-07-11T10:28:25+09:00 2023-07-11T10:28:25+09:00 1. はじめに 2. 作業効率UP!便利なテクニック5選! その1 Ctrl + 1:作業時間短縮?書式設定の便利なショートカットキー その2 SUMIF:表計算が簡単に!条件に合わせ集計 その3 ROW:手打ち修正不要?項番を1発で作成! その4 リボンの操作:画面の見やすさアップ!作業を快適に進める小技 その5 ウィンドウ枠の固定:スクロール回数減!見やすい作業エリア! 3. 実際に使ってみた感想 4. 参考文献・参考記事 1. はじめに 皆さん、はじめまして。株式会社ゼネットの田口です。 今回はタイトルにもありますように、Excel初心者の私がExcel操作を学ぶ中で、 特に感動したテク… <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/z/zenet-tech/20230621/20230621152308.png" width="500" height="266" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <p> </p> <div style="background-color: #e6e6fa; border: 1px solid #000;"> <ul> <li><strong><a href="#info">1. はじめに</a></strong></li> <li><strong><a href="#collectionOfTechniques">2. 作業効率UP!便利なテクニック5選!</a></strong></li> <ol style="list-style: none;"> <li><strong><a href="#techniqueNo1">その1 Ctrl + 1:作業時間短縮?書式設定の便利なショートカットキー</a></strong></li> <li><strong><a href="#techniqueNo2">その2 SUMIF:表計算が簡単に!条件に合わせ集計</a></strong></li> <li><strong><a href="#techniqueNo3">その3 ROW:手打ち修正不要?項番を1発で作成!</a></strong></li> <li><strong><a href="#techniqueNo4">その4 リボンの操作:画面の見やすさアップ!作業を快適に進める小技</a></strong></li> <li><strong><a href="#techniqueNo5">その5 ウィンドウ枠の固定:スクロール回数減!見やすい作業エリア!</a></strong></li> </ol> <li><strong><a href="#impression">3. 実際に使ってみた感想</a></strong></li> <li><strong><a href="#references">4. 参考文献・参考記事</a></strong></li> </ul> </div> <p> </p> <p><span style="text-decoration: underline; font-size: 140%;"><strong id="info">1. はじめに</strong></span></p> <p style="margin: 5px;"> 皆さん、はじめまして。株式会社ゼネットの田口です。</p> <p style="margin: 5px;"> 今回はタイトルにもありますように、Excel初心者の私がExcel操作を学ぶ中で、</p> <p style="margin: 5px;"> 特に感動したテクニックを紹介させていただきます。</p> <p style="margin: 5px;"> これから、Excelを学んで行く方の参考になれば幸いです。</p> <p> </p> <p> </p> <p id="collectionOfTechniques"><strong><span style="text-decoration: underline; font-size: 140%;">2.作業効率UP!便利なテクニック5選!</span></strong></p> <ul> <li><strong id="techniqueNo1" style="font-size: 120%;">その1 Ctrl + 1:作業時間短縮?書式設定の便利なショートカットキー</strong></li> </ul> <p style="margin: 5px;">  <strong>罫線を一気に引いてしまいたい!</strong></p> <p style="margin: 5px;"><strong>  中央揃えをせずにセルを結合したい!</strong></p> <p style="margin: 5px;">  そんな方にまず試してほしいのが、<span style="color: #ff0000;"><strong>Ctrl + 1</strong></span>を使った書式変更です。</p> <p style="margin: 5px;">  使い方は簡単!<strong>編集したいセルを選択してCtrl + 1を押すだけ</strong>です。</p> <p style="margin: 5px;">  実際に、Ctrl + 1で表の罫線作成しているところを見てみましょう。</p> <figure class="figure-image figure-image-fotolife mceNonEditable" title="Ctrl + 1で罫線を引く"> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/r/r-taguchi_st/20230614/20230614201219.png" width="893" height="484" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <figcaption class="mceEditable">Ctrl + 1で表の罫線を引いてみる!</figcaption> </figure> <p style="margin: 5px;">  ばっちり罫線が引けていますね!</p> <p style="margin: 5px;">  ちなみに!線の種類と引く場所を決定できるショートカットキーがあります!</p> <p style="margin: 5px;">  線の種類は、<span style="color: #ff0000;"><strong>Alt ➡ S</strong></span>を押した後、<strong>十字キーで選択</strong>できます。</p> <p style="margin: 5px;">  罫線を引く場所は、種類が多くなってしまいますが・・・</p> <table style="margin-left: 5%;"> <tbody> <tr> <th style="background-color: deepskyblue; border: 1px solid #000;">線を引く場所</th> <th style="background-color: deepskyblue; border: 1px solid #000;">ショートカットキー</th> </tr> <tr style="text-align: center;"> <td style="background-color: #b0c4de; border: 1px solid #000;"><strong>外枠</strong></td> <td style="border: 1px solid #000;"><strong><span style="color: #ff0000;">Alt ➡ O</span></strong></td> </tr> <tr style="text-align: center;"> <td style="background-color: #b0c4de; border: 1px solid #000;"><strong>内側(十字)</strong></td> <td style="border: 1px solid #000;"><strong><span style="color: #ff0000;">Alt ➡ I</span></strong></td> </tr> <tr style="text-align: center;"> <td style="background-color: #b0c4de; border: 1px solid #000;"><strong>内側(水平)</strong></td> <td style="border: 1px solid #000;"><strong><span style="color: #ff0000;">Alt ➡ H</span></strong></td> </tr> <tr style="text-align: center;"> <td style="background-color: #b0c4de; border: 1px solid #000;"><strong>内側(垂直)</strong></td> <td style="border: 1px solid #000;"><strong><span style="color: #ff0000;">Alt ➡ V</span></strong></td> </tr> <tr style="text-align: center;"> <td style="background-color: #b0c4de; border: 1px solid #000;"><strong>右辺</strong></td> <td style="border: 1px solid #000;"><strong><span style="color: #ff0000;">Alt ➡ R</span></strong></td> </tr> <tr style="text-align: center;"> <td style="background-color: #b0c4de; border: 1px solid #000;"><strong>左辺</strong></td> <td style="border: 1px solid #000;"><strong><span style="color: #ff0000;">Alt ➡ L</span></strong></td> </tr> <tr style="text-align: center;"> <td style="background-color: #b0c4de; border: 1px solid #000;"><strong>上辺</strong></td> <td style="border: 1px solid #000;"><strong><span style="color: #ff0000;">Alt ➡ T</span></strong></td> </tr> <tr style="text-align: center;"> <td style="background-color: #b0c4de; border: 1px solid #000;"><strong>下辺</strong></td> <td style="border: 1px solid #000;"><strong><span style="color: #ff0000;">Alt ➡ B</span></strong></td> </tr> </tbody> </table> <p style="margin: 5px;">  で、<strong>マウス操作なし</strong>で選択可能です!</p> <p style="margin: 5px;">  Ctrl + 1で出来る事は沢山あるので、ぜひ色々と触ってみてください!</p> <p> </p> <ul> <li><strong id="techniqueNo2" style="font-size: 120%;">その2 SUMIF:表計算が簡単に!条件に合わせて集計</strong></li> </ul> <p style="margin: 5px;">  IF文だけでは、<strong>やや骨の折れる集計で活躍する</strong>のがこの関数です。</p> <p style="margin: 5px;">  使い方は、<strong>=SUMIF(検索範囲,検索条件,合計範囲)</strong>です。</p> <p style="margin: 5px;">  使いどころとしましては、</p> <p style="margin: 5px;"><strong>  A社の売上額を合計したい</strong></p> <p style="margin: 5px;"><strong>  2023年度6月の売上額を合計したい</strong></p> <p style="margin: 5px;"><strong>  東京都に本社を構える企業の売上額を合計したい</strong></p> <p style="margin: 5px;">  などの場面が挙げられます。</p> <figure class="figure-image figure-image-fotolife mceNonEditable" title="SUMIFの使い方"> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/r/r-taguchi_st/20230615/20230615154953.png" width="855" height="312" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <figcaption class="mceEditable">SUMIFの使い方</figcaption> </figure> <p style="margin: 5px;">  画像のように、簡単に合計値を求めることができます。</p> <p style="margin: 5px;">  ただし、求めるのは合計値ですので、<strong>合計範囲は数値</strong>でないといけません。</p> <p> </p> <ul> <li><strong id="techniqueNo3" style="font-size: 120%;">その3 ROW:手打ち修正不要?項番を1発で作成!</strong></li> </ul> <p style="margin: 5px;">  表を修正しているとき、画像のような状態になったことはありませんか?</p> <figure class="figure-image figure-image-fotolife mceNonEditable" title="ROWを使っていない場合"> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/r/r-taguchi_st/20230615/20230615163400.png" width="750" height="452" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <figcaption class="mceEditable">ROWを使っていない場合</figcaption> </figure> <p style="margin: 5px;">  これだと、項番を<strong>手打ちで修正</strong>する必要がありますね・・・</p> <p style="margin: 5px;">  そんな<strong>手間を削減</strong>してくれるのがROW関数です!</p> <p style="margin: 5px;">  ROWの優れた点は、<span style="color: #ff0000;"><strong>"行を追加・削除しても番号が崩れないこと"</strong></span>です!</p> <p style="margin: 5px;">  使い方は、何通りかありますが、今回紹介するのは</p> <p style="margin: 5px;"><strong>  =ROW() - n </strong>といった使い方です。</p> <p style="margin: 5px;">  これで、<strong>変更のたびに項番を修正</strong>する必要が無くなります!</p> <figure class="figure-image figure-image-fotolife mceNonEditable" title="項番をROW() - 2で指定した場合"> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/r/r-taguchi_st/20230615/20230615164447.png" width="757" height="452" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <figcaption class="mceEditable">項番をROW() - 2で指定した場合</figcaption> </figure> <p style="margin: 5px;">  行を挿入しただけですが、<strong>項番は崩れていません</strong>ね!</p> <p style="margin: 5px;">  さて、このROW関数ですが、他関数と組み合わせることで、より便利になります!</p> <p style="margin: 5px;">  組み合わせる関数は<strong>IF関数</strong>と<strong>ISBRANK関数</strong>です。</p> <p style="margin: 5px;">  <strong>=IF(ISBLANK(C3),"",ROW() -2)</strong></p> <p style="margin: 5px;">  これにより、<strong>タイトルが空白の場合</strong>は、<strong>項番を空白</strong>にできます!</p> <p> </p> <ul> <li><strong id="techniqueNo4" style="font-size: 120%;">その4 リボンの操作:画面の見やすさアップ!作業を快適に進める小技</strong></li> </ul> <p style="margin: 5px;">  <strong>作業スペースが狭くて、もどかしい!</strong>そんな経験はありませんか?</p> <p style="margin: 5px;">  そんな人は、リボンの操作を行ってみてください!</p> <p style="margin: 5px;">  広がる作業範囲は<strong>4行程度</strong>ですが、意外と役に立ちます。</p> <p style="margin: 5px;">  操作も簡単で、<strong>Ctrl + F1</strong> をするだけで、リボンの開閉が可能です。</p> <p> </p> <figure class="figure-image figure-image-fotolife mceNonEditable" title="リボンの操作方法"> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/r/r-taguchi_st/20230615/20230615165717.png" width="895" height="334" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <figcaption class="mceEditable">リボンの操作方法</figcaption> </figure> <p> </p> <ul> <li><strong id="techniqueNo5" style="font-size: 120%;">その5 ウィンドウ枠の固定:スクロール回数減!見やすい作業エリア!</strong></li> </ul> <p style="margin: 5px;">  表が長くなってしまい、<strong>自分が修正しているセルが何か分からない。</strong></p> <figure class="figure-image figure-image-fotolife mceNonEditable" title="ウィンドウ枠を固定していないと・・・"> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/r/r-taguchi_st/20230615/20230615184809.png" width="648" height="449" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <figcaption class="mceEditable">ウィンドウ枠を固定していないと・・・</figcaption> </figure> <p style="margin: 5px;">  そんな時は、<strong>ウィンドウ枠の固定</strong>!</p> <p style="margin: 5px;">  これで不要なスクロール回数が減り<strong>作業効率UP間違いなし</strong>です!</p> <p style="margin: 5px;">  方法は、<strong>固定したいセルを選択→表示タブ→ウィンドウ枠の固定</strong>をクリックです。</p> <p style="margin: 5px;">  <strong>ショートカットキー</strong>では、<span style="color: #ff0000;"><strong>Alt ➡ W ➡ F ➡ F</strong></span> で固定できます。</p> <figure class="figure-image figure-image-fotolife mceNonEditable" title="ウィンドウ枠の固定"> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/r/r-taguchi_st/20230615/20230615185612.png" width="795" height="484" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <figcaption class="mceEditable">ウィンドウ枠の固定</figcaption> </figure> <p style="margin: 5px;">  これで、自分が作業している<strong>セルの内容が一目瞭然</strong>ですね!</p> <p style="margin: 5px;">  ウィンドウ枠の固定は、</p> <p style="margin: 5px;">  <strong>選択したセルの<span style="color: #ff0000;">左辺<span style="color: #000000;">と</span>上辺</span>を基準に固定される</strong></p> <p style="margin: 5px;">  と覚えておきましょう!</p> <p> </p> <p> </p> <p><span style="text-decoration: underline; font-size: 140%;"><strong id="impression">3.実際に使ってみた感想</strong></span></p> <p style="margin: 5px;"> さて、Excelでの便利なテクニックを6個紹介させていただきましたが、いかがだったでしょうか?</p> <p style="margin: 5px;"> 私は紹介したテクニックの中にもある、Ctrl + 1 と ウィンドウ枠の固定を頻繁に使っています。</p> <p style="margin: 5px;"> とても便利なテクニックですね!</p> <p style="margin: 5px;"> SUMIFやROWなどの関数も表を作成するうえでお世話になると思いますので是非覚えて帰ってください!</p> <p style="margin: 5px;"> それでは、最後までご覧いただきありがとうございました。</p> <p> </p> <p> </p> <p><span style="text-decoration: underline; font-size: 140%;"><strong id="references">4.参考文献・参考記事</strong></span></p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fwww.microsoft.com%2Fja-jp%2Fbiz%2Fsmb%2Fcolumn-excel-sumif.aspx" title="これだけ覚えれば OK! Excel SUMIF 関数の使い方簡単解説 - Microsoft for business" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://www.microsoft.com/ja-jp/biz/smb/column-excel-sumif.aspx">www.microsoft.com</a></cite></p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fwww.tech-teacher.jp%2Fblog%2Fexcel-row%2F" title="【初心者向け】ROW関数の使い方を一挙解説!実践で使えるテクニックも紹介! - TechTeacher Blog" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://www.tech-teacher.jp/blog/excel-row/">www.tech-teacher.jp</a></cite></p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fexcelcamp.jp%2Fmedia%2Foperation%2Fcell%2F4462%2F" title="【神速】0.3秒でエクセルに罫線(枠線)を引くショートカットキーを解説!便利な隠しコマンドも紹介!" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://excelcamp.jp/media/operation/cell/4462/">excelcamp.jp</a></cite></p> <p> </p> r-taguchi_st 新人が「エンジニアのためのマネジメントキャリアパス~テックリードからCTOまでマネジメントスキル向上ガイド~」を読んだ感想 hatenablog://entry/820878482941928958 2023-07-10T11:01:15+09:00 2023-07-10T11:01:15+09:00 初めまして。ゼネットの山﨑です。 IT未経験で入社し、研修3ヶ月目になります。 まだIT業界、ましてキャリアについて理解が浅いです。 そこで将来のイメージを得るため、「エンジニアのためのマネジメントキャリアパス~テックリードからCTOまでマネジメントスキル向上ガイド~」を読んでみました。 本の紹介 感想 ①上司に上手く管理される方法 ②自己診断リストで自分の現状を知る おわりに 参考文献 本の紹介 エンジニアのためのマネジメントキャリアパス ―テックリードからCTOまでマネジメントスキル向上ガイド 作者:Camille Fournier オライリー・ジャパン Amazon 著者:Camille… <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/z/zenet-tech/20230619/20230619152608.png" width="500" height="266" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <p><span style="color: #000000;">初めまして。ゼネットの山﨑です。</span></p> <p><span style="color: #000000;">IT未経験で入社し、研修3ヶ月目になります。</span></p> <p><span style="color: #000000;">まだIT業界、ましてキャリアについて理解が浅いです。</span></p> <p><span style="color: #000000;">そこで将来のイメージを得るため、「エンジニアのためのマネジメントキャリアパス~テックリードからCTOまでマネジメントスキル向上ガイド~」を読んでみました。</span></p> <p> </p> <p><strong><ul class="table-of-contents"> <li><a href="#本の紹介">本の紹介</a></li> <li><a href="#感想">感想</a><ul> <li><a href="#上司に上手く管理される方法">①上司に上手く管理される方法</a></li> <li><a href="#自己診断リストで自分の現状を知る">②自己診断リストで自分の現状を知る</a></li> </ul> </li> <li><a href="#おわりに">おわりに</a></li> <li><a href="#参考文献">参考文献</a></li> </ul></strong></p> <p> </p> <h3 id="本の紹介"><span style="color: #1464b3;">本の紹介</span></h3> <div class="freezed"> <div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/dp/4873118484?tag=hatena-22&amp;linkCode=osi&amp;th=1&amp;psc=1" class="hatena-asin-detail-image-link" target="_blank" rel="noopener"><img src="https://m.media-amazon.com/images/I/51sEua-+ejL._SL500_.jpg" class="hatena-asin-detail-image" alt="エンジニアのためのマネジメントキャリアパス ―テックリードからCTOまでマネジメントスキル向上ガイド" title="エンジニアのためのマネジメントキャリアパス ―テックリードからCTOまでマネジメントスキル向上ガイド" /></a> <div class="hatena-asin-detail-info"> <p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/dp/4873118484?tag=hatena-22&amp;linkCode=osi&amp;th=1&amp;psc=1" target="_blank" rel="noopener">エンジニアのためのマネジメントキャリアパス ―テックリードからCTOまでマネジメントスキル向上ガイド</a></p> <ul class="hatena-asin-detail-meta"> <li><span class="hatena-asin-detail-label">作者:</span><a href="https://d.hatena.ne.jp/keyword/Camille%20Fournier" class="keyword">Camille Fournier</a></li> <li>オライリー・ジャパン</li> </ul> <a href="https://www.amazon.co.jp/dp/4873118484?tag=hatena-22&amp;linkCode=osi&amp;th=1&amp;psc=1" class="asin-detail-buy" target="_blank" rel="noopener">Amazon</a></div> </div> </div> <p> </p> <p><span style="color: #000000;">著者:Camille Fournier</span></p> <p><span style="color: #000000;">本の読みやすさ ★★★★★</span></p> <p><span style="color: #000000;">ITの知識がなくても読みやすい内容でした。メンターから経営幹部まで、幅広い管理職についての在り方が書かれています。</span></p> <p> </p> <p><span style="color: #000000;">この本を読んで、</span></p> <ul> <li> <p><span style="color: #000000;"><strong>上司は部下の望みを把握できないので、それを明確にして伝える姿勢が重要という考え方</strong></span></p> </li> </ul> <p><span style="color: #000000;">が参考になると感じました。</span></p> <p> </p> <p> </p> <h3 id="感想"><span style="color: #1464b3;">感想</span></h3> <p><span style="color: #000000;">題名にある通り、本書はマネジメント法について扱っています。</span></p> <p><span style="color: #000000;">しかしそれだけでなく、マネジメントされる側の視点も書かれていました。</span></p> <p><span style="color: #000000;">その中でも、今の私がためになると感じたポイントを2つ紹介します。</span></p> <p> </p> <h5 id="上司に上手く管理される方法"><span style="color: #000000;">①上司に上手く管理される方法</span></h5> <p><span style="color: #000000;">本書では「できる上司」がする管理の方法と、部下としてどんな状態が上手く管理されているのかについて載っています。</span></p> <p><span style="color: #000000;">この<span style="text-decoration: underline;">上司に上手く管理される方法を知り、自分のキャリアパスを叶えるために活用する</span>ことが大事だと感じました。</span></p> <p><span style="color: #000000;">特に、上司に求めるべきこととして、</span></p> <p> </p> <div style="height: 12px;"><span style="margin-left: 8px; padding: 6px 10px; background: #00947a; color: #ffffff; font-weight: bold; border-radius: 5px;">1対1のミーティング</span></div> <div style="border: 2px solid#00947a; padding: 25px 12px 10px; font-size: 1em; border-radius: 5px;"> <p><strong><span style="text-decoration: underline; color: #000000;">信頼関係を築き、定期的に話し合う場を作るため重要。</span></strong></p> <p><span style="color: #000000;">実際、3人以上いる状況では踏み込んだ話をするのが難しいので、月1回でもこのような機会があると助かると思いました。</span></p> </div> <div> </div> <p> </p> <div style="height: 12px;"><span style="margin-left: 8px; padding: 6px 10px; background: #00947a; color: #ffffff; font-weight: bold; border-radius: 5px;">フィードバックの提供</span></div> <div style="border: 2px solid#00947a; padding: 25px 12px 10px; font-size: 1em; border-radius: 5px;"> <p><strong><span style="text-decoration: underline; color: #000000;">昇進すると機会が減るので、積極的に聞き入れる。即時にもらうことで効果が上がる。</span></strong></p> <p><span style="color: #000000;">研修中でも指摘されないと気付かないことは多く、フィードバックの重要性を感じました。また上司から放置されていない安心感もあると思います。</span></p> </div> <p> </p> <p><span style="color: #000000;">などが挙げられていました。</span></p> <p><span style="color: #000000;">もし上司との関係に不満がある場合、このように具体的な改善案があると参考にしやすいと思います。</span></p> <p> </p> <h5 id="自己診断リストで自分の現状を知る"><span style="color: #000000;">②自己診断リストで自分の現状を知る</span></h5> <p>本書では最初に挙げたように、自分の望みを明確にし、伝えることが大事だと主張されています。</p> <p>そのためか、本書には自己診断リストが何回も登場し、上司や自分の現状についての質問を投げかけられます。</p> <p>これに答えることで</p> <div style="padding: 10px; border: 2px solid #3cb371; border-radius: 10px; -moz-border-radius: 10px; -webkit-border-radius: 10px;"> <p><strong><span style="color: #000000;">・今の自分が感じていることを言語化できる</span></strong></p> <p><strong><span style="color: #000000;">・これからどんなマネジメント職になりたいのか、理想像をイメージできる</span></strong></p> </div> <p>といった効果がありそうでした。</p> <p>自分の内面を言葉するのは難しいと思います。このリストを上手く使い、今の上司との関係をどう感じているのか、振り返って考える良い機会になると感じました。</p> <p> </p> <p> </p> <p> </p> <h3 id="おわりに"><span style="color: #1464b3;"><strong>おわりに</strong></span></h3> <p>本書は、上司に管理される側としても、管理職としての将来像をイメージするためにも、長く活用できそうな本だと思いました。</p> <p> </p> <p> </p> <p> </p> <h3 id="参考文献"><span style="color: #1464b3;"><strong>参考文献</strong></span></h3> <p>(著) Camille Fournier (訳) 武舎 広幸、武舎 るみ (まえがき) 及川 卓也『エンジニアのためのマネジメントキャリアパス~テックリードからCTOまでマネジメントスキル向上ガイド~』. オライリージャパン. 2018.</p> n-yamazaki_st 【5ステップで設定!】家電をしゃべって操作する方法【SwitchBotハブミニ】 hatenablog://entry/820878482941339143 2023-07-07T13:19:16+09:00 2023-07-07T13:19:16+09:00 ※この記事は約4分で読み終わります。 目次 【大きな悩み...】エアコンを家の外からつけたい! 【設定方法】SwitchBotハブミニの設定 ①コードをつなぐ。 ②SwitchBotのアカウント作成 ③アプリでWi-Fiの設定をする。 ④リモコンを登録する。 【自動化】SwitchBotの連携がすごい! 【自動】部屋の温度に応じてエアコンをつけたい 【まとめ】SwitchBotはおすすめ 【今回紹介した製品のリンク】 SwitchBotハブミニ SwitchBot 温湿度計プラス 【大きな悩み...】エアコンを家の外からつけたい! リモコンを使わずスマホを使ったり、Siriやアレクサに頼むだけ… <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/z/zenet-tech/20230625/20230625234957.png" width="500" height="266" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/z/z-ebisawa_st/20230616/20230616193524.jpg" width="1200" height="1015" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <p style="text-align: left;"><strong><span style="color: #ff0000;">※この記事は約4分で読み終わります。</span></strong></p> <p style="text-align: left;"><strong><span style="font-size: 200%;">目次</span></strong></p> <ul class="table-of-contents"> <li><a href="#大きな悩みエアコンを家の外からつけたい">【大きな悩み...】エアコンを家の外からつけたい!</a></li> <li><a href="#設定方法SwitchBotハブミニの設定">【設定方法】SwitchBotハブミニの設定</a><ul> <li><a href="#コードをつなぐ">①コードをつなぐ。</a></li> <li><a href="#SwitchBotのアカウント作成">②SwitchBotのアカウント作成</a></li> <li><a href="#アプリでWi-Fiの設定をする">③アプリでWi-Fiの設定をする。</a></li> <li><a href="#リモコンを登録する">④リモコンを登録する。</a></li> </ul> </li> <li><a href="#自動化SwitchBotの連携がすごい">【自動化】SwitchBotの連携がすごい!</a><ul> <li><a href="#自動部屋の温度に応じてエアコンをつけたい">【自動】部屋の温度に応じてエアコンをつけたい</a></li> </ul> </li> <li><a href="#まとめSwitchBotはおすすめ">【まとめ】SwitchBotはおすすめ</a></li> <li><a href="#今回紹介した製品のリンク">【今回紹介した製品のリンク】</a><ul> <li><a href="#SwitchBotハブミニ">SwitchBotハブミニ</a></li> <li><a href="#SwitchBot-温湿度計プラス">SwitchBot 温湿度計プラス</a></li> </ul> </li> </ul> <h3 id="大きな悩みエアコンを家の外からつけたい" style="text-align: left;">【大きな悩み...】エアコンを家の外からつけたい!</h3> <div style="text-align: left;">リモコンを使わずスマホを使ったり、Siriやアレクサに頼むだけでエアコンをつけられる生活って</div> <div> </div> <div style="text-align: left;"><strong>近未来的で</strong><br /><span style="color: #ff0000;"><span style="font-size: 32px;"><strong>めちゃくちゃ格好いい</strong></span></span></div> <div style="text-align: left;"> </div> <div style="text-align: left;">そんな子供心マックスな考えから<strong>SwitchBotハブミニ</strong>を購入しました。</div> <div> </div> <div> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/z/z-ebisawa_st/20230616/20230616193624.jpg" width="1200" height="1015" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> </div> <div> </div> <div>SwitchBotハブミニを使うとSiriに頼むだけでエアコンをつけてくれたり電気をつけてくれたりします。</div> <div> </div> <div>格好良くないですか????</div> <div> </div> <div>しかも、スマホで家電のリモコンをまとめられるならリモコンをなくしたとしても困ることはありません!</div> <div> </div> <div>ここからはSwitchBotハブミニの設定方法をご紹介します。</div> <div> </div> <h3 id="設定方法SwitchBotハブミニの設定" style="text-align: left;">【設定方法】SwitchBotハブミニの設定</h3> <h4 id="コードをつなぐ" style="text-align: left;">①コードをつなぐ。</h4> <p style="text-align: left;">箱を開けるとコードとSwitchBotハブミニが入っています。まずはお持ちの充電器等で電源を入れてください。</p> <p style="text-align: left;"> </p> <h4 id="SwitchBotのアカウント作成" style="text-align: left;">②SwitchBotのアカウント作成</h4> <p style="text-align: left;">お持ちのスマートフォンで公式アプリをダウンロードし、アカウントを作成します。</p> <div class="itunes-embed freezed itunes-kind-software" style="text-align: left;"><a href="https://apps.apple.com/us/app/switchbot/id1087374760?uo=4&amp;at=10l8JW&amp;ct=hatenablog" rel="nofollow" target="_blank"><img src="https://cdn.image.st-hatena.com/image/scale/b64653590ff0cf505fa5c55c4be281dabbcdee77/enlarge=0;height=200;version=1;width=200/https%3A%2F%2Fis2-ssl.mzstatic.com%2Fimage%2Fthumb%2FPurple126%2Fv4%2F92%2Ff0%2Ffe%2F92f0fe12-1e0c-79af-4e90-f01edec52b9a%2FAppIcon-0-0-1x_U007emarketing-0-0-0-8-0-0-sRGB-0-0-0-GLES2_U002c0-512MB-85-220-0-0.png%2F100x100bb.jpg" alt="SwitchBot" title="SwitchBot" class="itunes-embed-image" /></a> <div class="itunes-embed-info"> <p class="itunes-embed-title"><a href="https://apps.apple.com/us/app/switchbot/id1087374760?uo=4&amp;at=10l8JW&amp;ct=hatenablog" rel="nofollow" target="_blank">SwitchBot</a></p> <ul> <li class="itunes-embed-artist">wonderlabs, Incorporated</li> <li class="itunes-embed-genre">Lifestyle</li> <li class="itunes-embed-price">Free</li> <li class="itunes-embed-badge"><a href="https://apps.apple.com/us/app/switchbot/id1087374760?uo=4&amp;at=10l8JW&amp;ct=hatenablog" rel="nofollow" target="_blank"><img src="https://cdn.blog.st-hatena.com/images/theme/itunes/itunes-badge-appstore@2x.png" width="60px" height="15px" /></a></li> </ul> </div> </div> <p style="text-align: left;"><cite class="hatena-citation"><a href="https://apps.apple.com/us/app/switchbot/id1087374760">apps.apple.com</a></cite></p> <p style="text-align: left;"> </p> <p style="text-align: left;"><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fplay.google.com%2Fstore%2Fapps%2Fdetails%3Fid%3Dcom.theswitchbot.switchbot%26hl%3Den" title="SwitchBot - Apps on Google Play" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://play.google.com/store/apps/details?id=com.theswitchbot.switchbot&amp;hl=en">play.google.com</a></cite></p> <p style="text-align: left;"> </p> <h4 id="アプリでWi-Fiの設定をする" style="text-align: left;">③アプリでWi-Fiの設定をする。</h4> <p style="text-align: left;">・SwitchBotハブミニのボタンをライトが点滅するまで押し続けた後にアプリの次へボタンをします。</p> <p style="text-align: left;">・その後デバイス名(自由)、Wi-Fiを設定します。</p> <p style="text-align: left;"> </p> <h4 id="リモコンを登録する" style="text-align: left;">④リモコンを登録する。</h4> <p>※ここは少し面倒くさかったです。</p> <p> </p> <p style="text-align: left;">・アプリで登録したデバイスを選択</p> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/z/z-ebisawa_st/20230616/20230616183426.jpg" width="564" height="376" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <p> </p> <p style="text-align: left;"><br />・リモコンを追加を押す</p> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/z/z-ebisawa_st/20230616/20230616191013.jpg" width="612" height="1200" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <p> </p> <p style="text-align: left;">・エアコンを押す</p> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/z/z-ebisawa_st/20230616/20230616191051.jpg" width="603" height="1200" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <p style="text-align: left;"><br />・リモコン自動学習を押す</p> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/z/z-ebisawa_st/20230616/20230616183643.jpg" width="1125" height="357" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <p style="text-align: left;"><br />・今すぐ開始を押す</p> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/z/z-ebisawa_st/20230616/20230616191136.jpg" width="612" height="1200" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <p style="text-align: left;"><br />・SwitchBotハブミニに向けてリモコンのボタンを押す。</p> <p> </p> <p>⑤スマートスピーカー(Siriやアレクサなど)の設定</p> <p>アプリで</p> <p>オートメーション→+ボタン</p> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/z/z-ebisawa_st/20230616/20230616191202.jpg" width="603" height="1200" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <p> </p> <p>条件を追加:手動実行</p> <p>アクションを追加:エアコン→ON→✓</p> <p>シーン名:なんでもOK</p> <p>クラウドサービス:Siriショートカット→実行→エアコンをつけたいときに言うセリフを設定</p> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/z/z-ebisawa_st/20230616/20230616183752.jpg" width="602" height="1200" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <p style="text-align: left;"><br /><br /></p> <p style="text-align: left;">以上の5ステップで設定は完了です。</p> <p style="text-align: left;"> </p> <p style="text-align: left;">この5ステップを完了するとONのボタンを押すだけでスマホからエアコンをつけることができます。</p> <p style="text-align: left;"> </p> <h3 id="自動化SwitchBotの連携がすごい" style="text-align: left;">【自動化】SwitchBotの連携がすごい!</h3> <p style="text-align: left;">SwitchBotのすごさはこれだけではありません。</p> <p style="text-align: left;">SwitchBot製品は<strong><span style="font-size: 150%;">他のSwitchBot製品と</span></strong><strong><span style="font-size: 150%;">連携</span></strong><strong><span style="font-size: 150%;">することで</span></strong>より大きな影響力を及ぼします。</p> <p style="text-align: left;"> </p> <h4 id="自動部屋の温度に応じてエアコンをつけたい" style="text-align: left;">【自動】部屋の温度に応じてエアコンをつけたい</h4> <p style="text-align: left;"> </p> <p style="text-align: left;">ペットがいるけど会社がスマホ持ち込み禁止だから操作できない。仕事が忙しくていちいちつけたり消したりができない。</p> <p style="text-align: left;"> </p> <p style="text-align: left;">そんな人の悩みは、<strong><span style="font-size: 150%;">SwitchBot 温湿度計プラス</span></strong>と連携で解決することができます。</p> <p style="text-align: left;"> </p> <p style="text-align: left;"><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fwww.switchbot.jp%2Fpages%2Fmeterplus-learnmore" title="SwitchBot 温湿度計プラス 温湿度が一目でわかる" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://www.switchbot.jp/pages/meterplus-learnmore">www.switchbot.jp</a></cite></p> <p style="text-align: left;"> </p> <p style="text-align: left;">この温湿度計とリンクさせると部屋の温度に応じて自動でエアコンをつけることが可能です。</p> <p style="text-align: left;"> </p> <p style="text-align: left;">そのため、ペットがいる方でも寒暖差が強い日を気にせず安心して外出することができます。</p> <p style="text-align: left;"> </p> <h3 id="まとめSwitchBotはおすすめ" style="text-align: left;">【まとめ】SwitchBotはおすすめ</h3> <div style="text-align: left;">今回はSwitchBotハブミニ、SwitchBot 温湿度計プラスといった2つのSwitchBot製品についてご紹介しました。</div> <div style="text-align: left;"> </div> <div style="text-align: left;">SWITCHBOT株式会社は他にも</div> <div style="text-align: left;"> </div> <div style="text-align: left;"><span style="text-decoration: underline;">カーテンを自動で開閉する。</span></div> <div style="text-align: left;"><span style="text-decoration: underline;">外出先から戸締りを自動で管理する。</span></div> <div style="text-align: left;"><span style="text-decoration: underline;">外出中に自動で掃除を行う。</span></div> <div style="text-align: left;"> </div> <div style="text-align: left;">このようなことが可能な<span style="font-size: 150%; color: #ff0000;"><strong>生活を自動化するためのIoT製品</strong></span>が多くそろっています。</div> <div> </div> <div>そうです、格好良い生活を手に入れるための製品はまだまだあるということです!</div> <div style="text-align: left;"> </div> <div style="text-align: left;">ぜひ公式サイトをご覧になってスマートな自宅を作ってみてはいかがでしょうか。</div> <div> </div> <div style="text-align: left;"><strong><span style="font-size: 150%;">SwitchBot公式サイト</span></strong></div> <div style="text-align: left;"> <p style="text-align: center;"><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fwww.switchbot.jp%2F" title="SwitchBot(スイッチボット)| Japan公式サイト" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://www.switchbot.jp/">www.switchbot.jp</a></cite></p> </div> <div style="text-align: left;"> </div> <h3 id="今回紹介した製品のリンク" style="text-align: left;">【今回紹介した製品のリンク】</h3> <h5 id="SwitchBotハブミニ" style="text-align: left;"><span style="font-size: 150%;"><strong><span style="white-space: normal;">SwitchBotハブミニ</span></strong></span></h5> <p style="text-align: left;"><a href="https://www.switchbot.jp/products/switchbot-hub-mini">SwitchBot ハブミニ</a><cite class="hatena-citation"><a href="https://www.switchbot.jp/products/switchbot-hub-mini">www.switchbot.jp</a></cite></p> <p style="text-align: left;"> </p> <h5 id="SwitchBot-温湿度計プラス" style="text-align: left;"><strong><span style="font-size: 150%;">SwitchBot 温湿度計プラス</span></strong></h5> <p style="text-align: left;"><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fwww.switchbot.jp%2Fpages%2Fmeterplus-learnmore" title="SwitchBot 温湿度計プラス 温湿度が一目でわかる" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://www.switchbot.jp/pages/meterplus-learnmore">www.switchbot.jp</a></cite></p> <div style="text-align: left;"><span style="white-space: normal;"> </span></div> <div style="text-align: left;"><span style="white-space: normal;"> </span></div> <div style="text-align: left;"> </div> <div style="text-align: left;"> <p style="text-align: center;"> </p> </div> <div style="text-align: left;"><span style="white-space: normal;"> </span></div> <p style="text-align: left;"> </p> z-ebisawa_st 【新人インタビュー】先輩インフラエンジニアに聞いてみたITインフラの仕事の価値とやりがい hatenablog://entry/820878482941348185 2023-07-06T10:06:44+09:00 2023-07-06T10:06:44+09:00 インフラ系エンジニアとして活躍されている先輩社員に、新人社員がインタビューしました。 <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/z/zenet-tech/20230619/20230619141624.png" width="500" height="266" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <p><br />こんにちは。ゼネット新人の増山です。<o:p></o:p></p> <p>文系出身、<span lang="EN-US">IT</span>は全くの未経験ですが、入社してから基盤系の仕事に関心をもちました。<o:p></o:p></p> <p> </p> <p>今回はシステム事業部の田丸さんにインタビューをさせていただきました。<o:p></o:p></p> <p>田丸さんは基盤系(インフラ系)の仕事をされていて、主にクラウド案件などの<span lang="EN-US">IT</span>インフラに関わっていらっしゃいます。<o:p></o:p></p> <p><span lang="EN-US">IT</span>インフラの仕事へのお考えや、新人のころの経験について伺ってきました。<o:p></o:p></p> <ul class="table-of-contents"> <li><a href="#ITインフラは動いて当たり前">ITインフラは「動いて当たり前」</a></li> <li><a href="#非機能要件の価値とは">「非機能要件」の価値とは?</a></li> <li><a href="#新人のころの仕事は"> 新人のころの仕事は?</a></li> <li><a href="#新人のときに経験してよかったこと">新人のときに経験してよかったこと</a></li> <li><a href="#やりがいは変わっていく">「やりがい」は変わっていく</a></li> <li><a href="#おわりに">おわりに</a></li> </ul> <figure class="figure-image figure-image-fotolife mceNonEditable"> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/y/y-masuyama_st/20230616/20230616183734.jpg" width="1200" height="1032" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> </figure> <blockquote> <p>田丸さん プロフィール<o:p></o:p></p> <p><span lang="EN-US">2006</span>年入社<span lang="EN-US"> 17</span>年目<br /><o:p></o:p>入社後<span lang="EN-US">2</span>年程度、社内部署<span lang="EN-US">(</span>情報管理部<span lang="EN-US">)</span>に所属し社内サーバ管理や新人教育に携わる。<br /><o:p></o:p>以降は大手ベンダ配下で主に金融系の各種案件でサーバ構築や運用保守を経験。<br /><o:p></o:p>近年は同じく大手ベンダ配下で<span lang="EN-US">AWS</span>利用案件に参画中。</p> </blockquote> <p><span lang="EN-US"><o:p> </o:p></span></p> <h3 id="ITインフラは動いて当たり前"><span style="color: #22ac38;"><span lang="EN-US">IT</span>インフラは「動いて当たり前」</span><o:p></o:p></h3> <p>まずは、田丸さんが関わられている基盤系のお仕事について。<o:p></o:p></p> <p>「基盤系のつらいところは、『これが基盤の仕事です』と言いづらいことです」<o:p></o:p></p> <p>現代社会では、<span lang="EN-US">IT</span>インフラは水道やガスと同じ、動いて当たり前のものとされます。だからこそ基盤系の仕事は表に出にくい、何をしているか見えにくいといった特徴があります。<o:p></o:p></p> <p><span lang="EN-US">IT</span>インフラの仕事は、システム開発のための基盤を構築したり、すでに動いているシステムに手を加えたり、障害が発生した際に対応したりと、多岐にわたります。<o:p></o:p></p> <p>「障害対応となるとたしかに大変なんですが、そこが基盤系の腕の見せどころでもあります」<o:p></o:p></p> <p>当たり前と思われているからこそ、そこを支える仕事は重要。まさに縁の下の力持ちといえる魅力を感じました。<o:p></o:p></p> <p><span lang="EN-US"><o:p> </o:p></span></p> <h3 id="非機能要件の価値とは"><span style="color: #22ac38;">「非機能要件」の価値とは?</span><o:p></o:p></h3> <p>「運用保守が一番価値を生む」と考える田丸さん。<o:p></o:p></p> <p>「お客様からの問合せに対するレスポンスの速さや、対応できる引き出しの多さが価値になる」といいます。<o:p></o:p></p> <p>機能面以外の、システムの性能やどれだけ早く障害から回復できるかといった要件は、『非機能要件』と呼ばれます。<o:p></o:p></p> <p>「どれだけシステムが良くても、問合せの対応が遅かったりすぐ動かなくなったりするようなものを、お客様は使いたくはない。システムのフロント部分ばかりに目が行きがちですが、意外とそのすぐ裏で支えていたりもするのが基盤系でもあります」<o:p></o:p></p> <p>確かに、普段使うパソコンやスマートフォンがどれだけ便利でも、突然動かなくなったりなかなか回復しなかったりすると考えたら、あまり使いたいと思いません。<span lang="EN-US"><br /></span>非機能要件の重要さが感じられます。<o:p></o:p></p> <p><span lang="EN-US"><o:p> </o:p></span></p> <h3 id="新人のころの仕事は"><span style="color: #22ac38;"><span lang="EN-US"> </span>新人のころの仕事は?</span><o:p></o:p></h3> <p>まずは、私たちと同じような新人だったころのお話を伺いました。<o:p></o:p></p> <p>「新人の頃は、エンタープライズ向けのサーバ工場での勤務から始まりました。<span lang="EN-US"><br /></span>サーバ発注時に<span lang="EN-US">SE</span>が作成する、サーバの構成指定の内容チェックや、<span lang="EN-US"><br /></span>それに付随するサーバ組み立て作業費や工場からの搬送費といった各種必要経費の確認、現地作業者への指示書の発行業務などを行っていました。<span lang="EN-US"><br /></span>構成内容の不備や、経費手配などに抜け漏れがないかなどをチェックし、<span lang="EN-US"><br /></span>発注元の営業や<span lang="EN-US">SE</span>にチェック結果の連携や、不備あれば是正依頼などを行い、<span lang="EN-US"><br /></span>内容確定させ、生産ラインに生産指示を流すのが主な仕事です」<o:p></o:p></p> <p><span lang="EN-US"><o:p> </o:p></span></p> <p>始めての現場はイメージと全く違う環境だったそうです。配属されたばかりのころは、苦労したこともありました。<o:p></o:p></p> <p>「メールの文章が長文になってしまったり、電話では緊張してしまったり。どうすれば簡潔に伝えられるか悩んでいました」<o:p></o:p></p> <p>やはり新人のころは慣れないことだらけだったそうです。<o:p></o:p></p> <p>私もまだ入社して数か月で、毎日が慣れないことばかりです。与えられた目の前の仕事をこなすので精一杯という新人は、多いのではないでしょうか。<o:p></o:p></p> <p><span lang="EN-US"><o:p> </o:p></span></p> <h3 id="新人のときに経験してよかったこと"><span style="color: #22ac38;">新人のときに経験してよかったこと</span><o:p></o:p></h3> <p>メールや電話といえば新人の頭を悩ませるものの定番だと思いますが、田丸さんは上手な先輩のメールを真似して慣れていったといいます。<o:p></o:p></p> <p>「現場に出るとわかりますが、うまい人・優秀な人は絶対にまわりにいます。新人のうちは、そういう人を真似することがよい経験になります」<o:p></o:p></p> <p>新人のころに苦労した経験は「確実に今に生きている」と田丸さん。<o:p></o:p></p> <p>「先輩社員がいない環境でしたが、結果的にはよかった。次の環境でのハードルは低くなりました」<o:p></o:p></p> <p>また、新人のころから頑張っていてよかったことをお尋ねすると、「早起き」とのことでした。<o:p></o:p></p> <p>「それが当たり前だったので、頑張っていたかと言われると<span lang="EN-US">……</span>でも、朝早い習慣があるのは良いことだと思います。ゆとりをもって始業の準備ができますし、早くいるだけで周囲に認められる部分もあったりします」<o:p></o:p></p> <p>私も朝は早い方ですが、習慣があるとなんとなく自信が持てる気がしています。<span lang="EN-US"><br /></span>小さなことかもしれませんが、毎朝しっかり起きることは周囲からの信頼にも繋がると思いますので、私も大事にしていきたいです。<o:p></o:p></p> <p><span lang="EN-US"><o:p> </o:p></span></p> <h3 id="やりがいは変わっていく"><span style="color: #22ac38;">「やりがい」は変わっていく</span><o:p></o:p></h3> <p>最後に、やりがいを感じるときについて伺いました。<o:p></o:p></p> <p>「経験やフェーズによって変わる」と田丸さんは言います。<o:p></o:p></p> <p>「新人のころは、とにかく滞りなく正確に、与えられた仕事をこなすことがやりがいでした。今はより頭を使う作業が多くて、例えば障害の原因の根本を突き止めたりするとある種の達成感のようなものがあります。あとはやはり、お客様から感謝されるときにやりがいを感じます」<o:p></o:p></p> <p>経験量や立場が変わることで、やりがいを感じる瞬間も変わるようです。私も変化を実感できるようになりたいと思いました。<o:p></o:p></p> <p><span lang="EN-US"><o:p> </o:p></span></p> <h3 id="おわりに"><span style="color: #22ac38;">おわりに</span><o:p></o:p></h3> <p>基盤系は開発系と比べるとユーザから見えにくい部分ですが、だからこそのやりがいもあると思います。<o:p></o:p></p> <p>慣れないうちは大変なことも多いですが、経験したことは必ず今後の自分に生きてくるものだと、お話を伺っていて感じました。<o:p></o:p></p> <p>私も、未経験だからとかは関係なく、新人として恐れずチャレンジしていきたいです。<o:p></o:p></p> <p>お忙しい中お話を聞かせてくださった田丸さん、ありがとうございました!<o:p></o:p></p> y-masuyama_st 文系大学卒の新人がドライバ接続で『Class Not Found Exception:ドライバ名』のエラーが発生した時に確認すべきことをまとめてみた hatenablog://entry/820878482941930260 2023-07-05T14:55:48+09:00 2023-07-06T10:05:41+09:00 『Class Not Found Exception:ドライバ名』のエラーが発生したときの対処法をご紹介します! 目次 目次 はじめに 確認ポイント ①:ドライバを指定する部分の誤字脱字 ②:使用するドライバが作成しているプロジェクトのビルドパスにあるか ③:WEB-INFフォルダにlibフォルダ、および使用するドライバがあるか 『Class Not Found Exception:ドライバ名』ってどんなエラー? 終わりに 参考文献 はじめに こんにちは。ゼネットの山﨑です。 ラノベのような長ったらしいタイトルを見て「タイトル長いけど、自分が知りたい情報が載ってそうだし見るか!」と決めてくれた… <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/z/zenet-tech/20230621/20230621113435.png" width="500" height="266" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <p> </p> <p><strong>『Class Not Found Exception:ドライバ名』のエラーが発生したときの対処法をご紹介します!</strong></p> <p> </p> <h3 id="目次"><span style="color: #007396;"><strong>目次</strong></span></h3> <ul class="table-of-contents"> <li><a href="#目次">目次</a></li> <li><a href="#はじめに">はじめに</a></li> <li><a href="#確認ポイント">確認ポイント</a><ul> <li><a href="#ドライバを指定する部分の誤字脱字">①:ドライバを指定する部分の誤字脱字</a></li> <li><a href="#使用するドライバが作成しているプロジェクトのビルドパスにあるか">②:使用するドライバが作成しているプロジェクトのビルドパスにあるか</a></li> <li><a href="#WEB-INFフォルダにlibフォルダおよび使用するドライバがあるか">③:WEB-INFフォルダにlibフォルダ、および使用するドライバがあるか</a></li> </ul> </li> <li><a href="#Class-Not-Found-Exceptionドライバ名ってどんなエラー">『Class Not Found Exception:ドライバ名』ってどんなエラー?</a></li> <li><a href="#終わりに">終わりに</a><ul> <li><a href="#参考文献">参考文献</a></li> </ul> </li> </ul> <p> </p> <p> </p> <h3 id="はじめに"><span style="color: #007396;"><strong>はじめに</strong></span></h3> <p> こんにちは。ゼネットの山﨑です。</p> <p>ラノベのような長ったらしいタイトルを見て「タイトル長いけど、自分が知りたい情報が載ってそうだし見るか!」と決めてくれたそこのあなた! このブログに目をとめてくれてありがとうございます!</p> <p> このブログでは実際に私が『Class Not Found Exception:ドライバ名』のエラーが発生したときに、どこを確認して、どうやって対処したのかをご紹介します。確認してほしいポイントは後述する3点です。</p> <p> </p> <p> </p> <h3 id="確認ポイント"><span style="color: #007396;"><strong>確認ポイント</strong></span></h3> <h5 id="ドライバを指定する部分の誤字脱字"><strong>①:ドライバを指定する部分の誤字脱字</strong></h5> <p>誤字脱字。これは誰にでも起こりうるものですね。私も実際に「org.postgresql.Driver」とするところを「org.postgresol.Driver」(sqlにするはずがsolになっている)と書いてしまい、エラーを発生させました・・・。</p> <p> これの確認すべきところは簡単。DAOクラスのClass for Nameでドライバを指定している部分に誤字脱字がないかを確認するだけです。</p> <p> </p> <figure class="figure-image figure-image-fotolife mceNonEditable" title="↑「sql」とするはずが、「sol」となっている"> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/s/s-yamazaki_st/20230616/20230616193154.png" width="567" height="494" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <figcaption class="mceEditable">↑「sql」とするはずが、「sol」となっている</figcaption> </figure> <p><br /><br /></p> <p> </p> <h5 id="使用するドライバが作成しているプロジェクトのビルドパスにあるか"><strong>②:使用するドライバが作成しているプロジェクトのビルドパスにあるか</strong></h5> <p> 様々なプロジェクトを作成した人がやりがちなミス。ドライバの追加を忘れてしまったがために、エラーを発生させてしまう。</p> <p> </p> <p> </p> <p>ドライバがビルドパスに追加されているのかの確認は、以下の手順でできます。</p> <p> </p> <p><span style="color: #0000cc;">─────</span><strong>ビルドパスにドライバがあるか確認する方法</strong><span style="color: #0000cc;">──────</span></p> <p>① 作成しているプロジェクトを右クリック</p> <p><strong>② </strong>ビルドパス<strong>→</strong>ビルドパスの構成</p> <p>③ ライブラリをクリック</p> <p>④ 使用したいドライバがあるかを確認</p> <p> </p> <p>↓ ビルドパスの確認の仕方</p> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/s/s-yamazaki_st/20230616/20230616193232.png" width="566" height="573" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <p><span style="font-size: 150%;"><strong> ↓  ↓  ↓</strong></span></p> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/s/s-yamazaki_st/20230616/20230616193637.png" width="579" height="428" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <p> </p> <p><br /><br /></p> <p><br />ビルドパスにドライバがなかったら、確認と同じ手順で画像右側の「外部JARの追加」で追加しましょう!</p> <p> </p> <p> </p> <h5 id="WEB-INFフォルダにlibフォルダおよび使用するドライバがあるか"><strong>③:WEB-INFフォルダにlibフォルダ、および使用するドライバがあるか</strong></h5> <p> これは盲点。「ドライバをビルドパスに追加したからできるでしょ!」と思った矢先に発生するエラー。</p> <p> </p> <p> </p> <p>これの確認の仕方は確認ポイント②よりも簡単。確認手順は以下のとおりです。</p> <p> </p> <p><span style="color: #0000cc;">─────────<strong><span style="color: #000000;">libフォルダにドライバがあるか確認する方法</span></strong>──────────</span></p> <p>① 作成しているプロジェクトのWEB-INFフォルダを開く</p> <p>② libフォルダを開く(場合によってはlibフォルダがないときも。そんなときの対処法も後述しています。)</p> <p>③ libフォルダ直下にドライバがあるか確認する</p> <p> </p> <figure class="figure-image figure-image-fotolife mceNonEditable" title="WEB-INFフォルダにlibフォルダがない"> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/s/s-yamazaki_st/20230616/20230616193513.png" width="594" height="513" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <figcaption class="mceEditable">WEB-INFフォルダにlibフォルダがない</figcaption> </figure> <p><br /><br /></p> <figure class="figure-image figure-image-fotolife mceNonEditable" title="libフォルダの中のフォルダにドライバがある"> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/s/s-yamazaki_st/20230616/20230616193320.png" width="569" height="497" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p> <figcaption class="mceEditable">libフォルダの中のフォルダにドライバがある</figcaption> </figure> <p> </p> <p>ここで注意してほしいのが、libフォルダの直下にあるということ。libフォルダの中にあるフォルダの中にドライバがあってもエラーが発生します。</p> <p> </p> <p>libフォルダ直下にドライバがなかった場合は、以下の手順で追加しましょう。</p> <p> </p> <p><span style="color: #0000cc;"><strong>─────<span style="color: #000000;">libフォルダ直下にドライバを入れる方法</span>─────</strong></span></p> <p>① ダウンロードしたドライバが入っているフォルダをエクスプローラーからドラッグしてweb-infのlibフォルダに入れる</p> <p>② ドライバが入ったフォルダを開いて使いたいドライバを右クリック</p> <p>③ 移動(もしくは「リファクタリング<strong>→</strong>移動」)</p> <p>④ lib直下になるように移動させる</p> <p> </p> <p> </p> <p>WEB-INFフォルダにlibフォルダがないよという方は、WEB-INFフォルダにlibフォルダを自分で作ってから上記の手順でやるとできます。libフォルダの作成手順は</p> <p>プロジェクト右クリック→新規→フォルダ→名前を「lib」で作成</p> <p> </p> <p> </p> <h3 id="Class-Not-Found-Exceptionドライバ名ってどんなエラー"><span style="color: #007396;"><strong>『Class Not Found Exception:ドライバ名』ってどんなエラー?</strong></span></h3> <p> ここまで『Class Not Found Exception:ドライバ名』のエラーの対処法を見てきましたが、そもそもこのエラーは何を表しているのか。このエラーはわかりやすく言うと、使いたいドライバが見つからないよというエラーです。なので、ドライバの名前が間違いや、ドライバがプロジェクトに追加されていないと、このエラーがコンソール欄に表示されるのです。</p> <p> </p> <p> </p> <h3 id="終わりに"><span style="color: #007396;"><strong>終わりに</strong></span></h3> <p> 『Class Not Found Exception:ドライバ名』のエラーの対処法として誤字脱字といったありきたりなものから、少し操作しないと確認できないものまで見てきました。どれにも共通して言えることは、少し確認すれば対処できるというところ。ほんの少しの確認でこのエラーは解決できるということを知らせたく、このブログを作成しました。</p> <p> </p> <p> </p> <p> </p> <h4 id="参考文献"><span style="color: #007396;"><strong>参考文献</strong></span></h4> <p><a href="https://software.fujitsu.com/jp/manual/manualfiles/M080041/B1WN9531/09Z200/msg43/msg11839.htm">https://software.fujitsu.com/jp/manual/manualfiles/M080041/B1WN9531/09Z200/msg43/msg11839.htm</a></p> <p> </p> s-yamazaki_st