Blog http://optimal-sdw.com/ ja CentOS7、8からAlmaLinuxへ http://optimal-sdw.com/blog/code-linux/article_102 <span>CentOS7、8からAlmaLinuxへ</span> <span><span lang="" about="/banana_people/1" typeof="schema:Person" property="schema:name" datatype="">@optimal-sdw.com</span></span> <span>2022/04/10(日) - 20:35</span> <div class="field field--name-field-last-update field--type-datetime field--label-above"> <div class="field--label">更新日時</div> <div class="field--item"><time datetime="2022-04-10T11:35:18Z">2022/04/10(日) - 20:35</time> </div> </div> <div class="field field--name-field-kanban field--type-text-long field--label-hidden field--item"><p><a href="https://optimal-sdw.com/blog/code-linux/article_102"><img alt="article_102_eye_catch" data-entity-type="file" data-entity-uuid="e918e95a-44f6-4317-9a26-2aff295fee70" src="/sites/default/files/inline-images/article_102.jpg" style="max-height:720px;max-width:1280px;width:100%;height:100%;object-fit:cover;" width="1280" height="720" loading="lazy" /></a></p> <p> </p> </div> <div class="field field--name-body field--type-text-with-summary field--label-hidden field--item"><p>CentOS8のサポートが2021年12月で終了しましたね。</p> <p>今後はCentOS StreamとしてRHELの先進開発環境のようなものとなり、安定版ではなくなります。</p> <p>クラウド環境、オンプレ環境問わずRHELのクローンであるCentOSを利用しているところは多いのではないかと思います。</p> <p>CentOS7のサポートはもう少し長く、2024年6月30日までサポートが続きますが、とはいえ移行計画を練らなければならない状況ではあると思います。</p> <p>移行先の一つの候補として注目されているのがAlma Linuxになります。</p> <p>CentOSと同じくRHELのクローンであり、安定したLinux OS環境を手に入れることが可能です。</p> <p>インストール方法もCentOSと変わらないため、利用してみてはいかがでしょうか。</p> <p>Ubuntu等のディストリビューションへ移行するよりも親和性が高いものと思料しております。</p> <p>ということでまずはAlma Linuxを使ってみましょうということで、インストール手順をご紹介いたします。</p> <p> </p> <hr /><h2 id="sec01">Alma Linuxのダウンロード</h2> <hr /><p>まずはAlma Linuxのiosイメージを公式サイトからダウンロードします。</p> <p><a href="https://www.centos.org/download/" rel="noopener noreferrer" target="_blank">https://almalinux.org</a></p> <p> </p> <p>iOSイメージをDVD等のメディアに焼いて、PCにインストールするか、Virtual Boxなどを利用して仮想マシンとしてインストールします。</p> <p>Virtual Boxなどを利用される際は、iosイメージファイルを仮想的なメディアドライブに指定することでインストール可能です。</p> <p>なお、最小インストール版のiosイメージをダウンロードされた場合でも、インターネットに接続できる環境下であれば、インストール作業内でインターネットからフルインストールすることも可能です。</p> <p> </p> <hr /><h2 id="sec02">Alma Linuxのインストール</h2> <hr /><p>Alma LinuxのiosイメージをDVDドライブ等から無事起動できますと、以下のようなインストーラの画面が開きます。</p> <p> </p> <p><img alt="alma linux install:select language" data-entity-type="file" data-entity-uuid="f6c69f22-28a1-43c2-a101-62c17c40a58c" src="/sites/default/files/inline-images/almalinux_install_001.png" style="max-width:678px; width:100%; height:100%;" width="1280" height="720" loading="lazy" /></p> <p> </p> <p>Alma Linuxにおける使用言語を選択します。使用言語を選択して「続行」ボタンをクリックします。</p> <p>各種設定を行うためのメニュー画面となるインストール概要画面が表示されます。</p> <p> </p> <p><img alt="alma linux install:menu" data-entity-type="file" data-entity-uuid="51c0d1e8-513e-4662-8951-022b83c7f4ee" src="/sites/default/files/inline-images/almalinux_install_002.png" style="max-width:678px; width:100%; height:100%;" width="1280" height="720" loading="lazy" /></p> <p> </p> <p>「インストール先」から初期インストールするディスク領域の設定を行います。</p> <p> </p> <p><img alt="alma linux install:disk" data-entity-type="file" data-entity-uuid="f331fab5-adad-472a-ad37-07c9e583b32f" src="/sites/default/files/inline-images/almalinux_install_003.png" style="max-width:678px; width:100%; height:100%;" width="1280" height="720" loading="lazy" /></p> <p> </p> <p>ローカルの標準ディスクに表示されているHard Diskを選択します。</p> <p>「完了」ボタンをクリックします。</p> <p>インストール概要画面に戻ります。</p> <p> </p> <p><img alt="alma linux install:menu" data-entity-type="file" data-entity-uuid="e4d8a2ef-1bd0-46dc-8e8f-7c3ecdef28af" src="/sites/default/files/inline-images/almalinux_install_004.png" style="max-width:678px; width:100%; height:100%;" width="1280" height="720" loading="lazy" /></p> <p> </p> <p>「ソフトウェアの選択」から初期インストールするソフトウェアを選択します。</p> <p> </p> <p><img alt="alma linux install:software" data-entity-type="file" data-entity-uuid="e2b11f6a-8766-452a-8344-baed953fd1a4" src="/sites/default/files/inline-images/almalinux_install_005.png" style="max-width:678px; width:100%; height:100%;" width="1280" height="720" loading="lazy" /></p> <p> </p> <p>Linuxでは最小限のインストールを行った場合、Windowsのようなグラフィカルな操作画面ではなく、コマンドプロンプトやPowerShellのようなコマンド入力のみの操作画面になります。</p> <p>WindowsのようなGUIをインストールするにはGnomeやKDEといったソフトウェアをインストールする必要があります。</p> <p> </p> <p>開発環境として利用する場合はサーバー、またはワークステーションが良いと思います。</p> <p>なお、最小構成で始めても自分自身でGnomeやKDEといったソフトウェアを後からインストールすることも可能です。</p> <p>※ 右側にさらにインストールするソフトウェアの詳細が表示されますので、必要なソフトウェアにチェックを入れます。</p> <p>インストールするソフトウェアの選択したあとは「完了」ボタンをクリックしてインストール概要画面に戻ります。</p> <p> </p> <p><img alt="alma linux install:menu" data-entity-type="file" data-entity-uuid="33c2fe94-36b6-4f47-b23b-b3c40f9c46c9" src="/sites/default/files/inline-images/almalinux_install_006.png" style="max-width:678px; width:100%; height:100%;" width="1280" height="720" loading="lazy" /></p> <p> </p> <p>続いて「時刻と日付」からタイムゾーンの設定を行います。</p> <p> </p> <p><img alt="alma linux install:time zone" data-entity-type="file" data-entity-uuid="95adc7e8-c788-4fd8-888c-60be2fb78cf8" src="/sites/default/files/inline-images/almalinux_install_007.png" style="max-width:678px; width:100%; height:100%;" width="1280" height="720" loading="lazy" /></p> <p> </p> <p>お住まいの地域を選択し、「完了」ボタンをクリックしてインストール概要画面に戻ります。</p> <p> </p> <p><img alt="alma linux install:menu" data-entity-type="file" data-entity-uuid="c60e5cae-79bb-47d8-a754-6016b56c411f" src="/sites/default/files/inline-images/almalinux_install_008.png" style="max-width:678px; width:100%; height:100%;" width="1280" height="720" loading="lazy" /></p> <p> </p> <p>続いて「ネットワークとホスト名」からネットワークの設定を行います。</p> <p> </p> <p><img alt="alma linux install:network" data-entity-type="file" data-entity-uuid="a25e48a6-cc8b-4abe-b9cd-ac2512e59e93" src="/sites/default/files/inline-images/almalinux_install_009.png" style="max-width:678px; width:100%; height:100%;" width="1280" height="720" loading="lazy" /></p> <p> </p> <p>Ethernetをオンにしてネットワーク接続を行います。また、画面左下にあるホスト名を編集します。通常はlocalhostで良いと思います。</p> <p>「完了」ボタンをクリックしてインストール概要画面に戻ります。</p> <p> </p> <p><img alt="alma linux install:menu" data-entity-type="file" data-entity-uuid="56ac7c4b-614e-409a-bf47-903ad4390cb1" src="/sites/default/files/inline-images/almalinux_install_010.png" style="max-width:678px; width:100%; height:100%;" width="1280" height="720" loading="lazy" /></p> <p> </p> <p>続いて「rootパスワード」からrootアカウントの設定を行います。</p> <p> </p> <p><img alt="alma linux install:create root user" data-entity-type="file" data-entity-uuid="6030a9d3-b7b2-476a-8120-24ba623b7b67" src="/sites/default/files/inline-images/almalinux_install_011.png" style="max-width:678px; width:100%; height:100%;" width="1280" height="720" loading="lazy" /></p> <p> </p> <p>rootアカウントとは、Linux系OSにおける管理者ユーザ「root」ユーザになります。そのrootユーザのパスワード設定を行います。</p> <p>ソフトウェアのインストールや設定など、管理者ユーザの権限が必要な場合にrootユーザを使います。</p> <p>※ WindowsにおけるAdministratorと同じようなユーザです。</p> <p>パスワードを入力して「完了」ボタンをクリックし、インストール概要画面に戻ります。</p> <p> </p> <p><img alt="alma linux install:menu" data-entity-type="file" data-entity-uuid="e5b7dc51-f9b7-4d68-825b-d780f2a4c805" src="/sites/default/files/inline-images/almalinux_install_012.png" style="max-width:678px; width:100%; height:100%;" width="1280" height="720" loading="lazy" /></p> <p> </p> <p>続いて「ユーザーの作成」から一般ユーザアカウントの作成を行います。</p> <p> </p> <p><img alt="alma linux install:create user" data-entity-type="file" data-entity-uuid="6dde2068-3703-4570-9b80-a90d314d8859" src="/sites/default/files/inline-images/almalinux_install_013.png" style="max-width:678px; width:100%; height:100%;" width="1280" height="720" loading="lazy" /></p> <p> </p> <p>ユーザ名、パスワードを入力して「完了」ボタンをクリックし、インストール概要画面に戻ります。</p> <p> </p> <p><img alt="alma linux install:menu" data-entity-type="file" data-entity-uuid="a312df65-8a0a-4445-8ada-da7b8efcd953" src="/sites/default/files/inline-images/almalinux_install_014.png" style="max-width:678px; width:100%; height:100%;" width="1280" height="720" loading="lazy" /></p> <p> </p> <p>一通り設定したところで「インストールの開始」ボタンをクリックします。</p> <p>設定内容に基づいてインストールが始まります。</p> <p> </p> <p><img alt="alma linux install:start" data-entity-type="file" data-entity-uuid="55b78373-d022-4130-8fe8-4f8af2fae747" src="/sites/default/files/inline-images/almalinux_install_015.png" style="max-width:678px; width:100%; height:100%;" width="1280" height="720" loading="lazy" /></p> <p> </p> <p>インストールが完了すると、以下の画面になりますので、「システムの再起動」ボタンをクリックします。</p> <p> </p> <p><img alt="alma linux install:reboot" data-entity-type="file" data-entity-uuid="bfbd43b9-464a-4ebe-9906-639a85707299" src="/sites/default/files/inline-images/almalinux_install_016.png" style="max-width:678px; width:100%; height:100%;" width="1280" height="720" loading="lazy" /></p> <p> </p> <p>再起動すると初期セットアップ画面が表示されます。</p> <p> </p> <p><img alt="alma linux install:licence" data-entity-type="file" data-entity-uuid="57c98b31-be0a-4329-9c97-c4c1eb376f56" src="/sites/default/files/inline-images/almalinux_install_017.png" style="max-width:678px; width:100%; height:100%;" width="800" height="600" loading="lazy" /></p> <p> </p> <p>「ライセンス情報」からライセンス情報の画面を開いて、ライセンスに同意します。</p> <p> </p> <p><img alt="alma linux install:licence info" data-entity-type="file" data-entity-uuid="a0ff4577-a4e7-4240-af01-775e2afadc18" src="/sites/default/files/inline-images/almalinux_install_018.png" style="max-width:678px; width:100%; height:100%;" width="800" height="600" loading="lazy" /></p> <p> </p> <p>「完了」ボタンをクリックし、初期セットアップ画面に戻ります。</p> <p> </p> <p><img alt="alma linux install:licence" data-entity-type="file" data-entity-uuid="4c5fd73b-0c05-49bb-a08f-c5c1b32a1c61" src="/sites/default/files/inline-images/almalinux_install_019.png" style="max-width:678px; width:100%; height:100%;" width="800" height="600" loading="lazy" /></p> <p> </p> <p>「設定の完了」ボタンをクリックし、初期セットアップを完了します。</p> <p>ログイン画面が表示されますので、先ほど作成したユーザでログインします。</p> <p> </p> <p><img alt="alma linux install:login 01" data-entity-type="file" data-entity-uuid="8ece252a-9d5d-4020-a2f8-fb20b3cdd10c" src="/sites/default/files/inline-images/almalinux_install_020.png" style="max-width:678px; width:100%; height:100%;" width="800" height="600" loading="lazy" /></p> <p> </p> <p><img alt="alma linux install:login 02" data-entity-type="file" data-entity-uuid="dae3e445-8951-4ebd-8cd2-0b18aef90869" src="/sites/default/files/inline-images/almalinux_install_021.png" style="max-width:678px; width:100%; height:100%;" width="800" height="600" loading="lazy" /></p> <p> </p> <p>ログインに成功しますと、ようこそ画面が表示されますので、画面に従って言語の選択等行なっていきます。</p> <p>基本的にはインストール設定の内容が初期表示されますので、「次へ」ボタンをクリックして進めていきます。</p> <p> </p> <p><img alt="alma linux install:initial setting01" data-entity-type="file" data-entity-uuid="86b5c17a-1608-4f45-a3a2-b6f03ffa43e5" src="/sites/default/files/inline-images/almalinux_install_022.png" style="max-width:678px; width:100%; height:100%;" width="1920" height="1200" loading="lazy" /></p> <p> </p> <p>キーボードレイアウトの選択です。日本語であれば日本語(かな漢字)を選択します。</p> <p> </p> <p><img alt="alma linux install:initial setting02" data-entity-type="file" data-entity-uuid="e915e081-4bb5-4b13-be43-3026158cf00d" src="/sites/default/files/inline-images/almalinux_install_023.png" style="max-width:678px; width:100%; height:100%;" width="1920" height="1200" loading="lazy" /></p> <p> </p> <p>位置情報の設定になります。基本的には位置情報サービスの利用は無いと思いますのでオフにします。</p> <p> </p> <p><img alt="alma linux install:initial setting03" data-entity-type="file" data-entity-uuid="2dd64571-e0f7-458b-a8ee-99e7316bb7f4" src="/sites/default/files/inline-images/almalinux_install_024.png" style="max-width:678px; width:100%; height:100%;" width="1920" height="1200" loading="lazy" /></p> <p> </p> <p>Googleアカウント等の設定です。最初はスキップしてしまって問題ありません。</p> <p> </p> <p><img alt="alma linux install:initial setting04" data-entity-type="file" data-entity-uuid="60d125c7-fb84-4a9d-8584-43c57d04317b" src="/sites/default/files/inline-images/almalinux_install_025.png" style="max-width:678px; width:100%; height:100%;" width="1920" height="1200" loading="lazy" /></p> <p> </p> <p>以下の画面が表示されればセットアップ完了です。</p> <p> </p> <p><img alt="alma linux install:initial setting05" data-entity-type="file" data-entity-uuid="de509596-11e4-4fbf-a94b-35867f68faf8" src="/sites/default/files/inline-images/almalinux_install_026.png" style="max-width:678px; width:100%; height:100%;" width="1920" height="1200" loading="lazy" /></p> <p> </p> <p>以上でAlma Linuxのインストールは完了です。</p> <p>あとは必要に応じて各種ソフトウェアを追加インストールしたり、ファイアウォールの設定等々行なっていきます。</p> <p>CentOS7と同じくyumコマンドでのインストールも可能ですが、ベースはCentOS8と同じですのでdnfコマンド推奨になります。</p> <p> </p> <p>具体的には以下の書籍が参考になると思いますので、CentOS7から移行される方はCentOS8の書籍をベースにAlma Linux環境に慣れていきましょう。</p> <p><iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=optimalsdwcom-22&amp;language=ja_JP&amp;o=9&amp;p=8&amp;l=as4&amp;m=amazon&amp;f=ifr&amp;ref=as_ss_li_til&amp;asins=B085KTYH49&amp;linkId=f060f674b83f80d50f3b503329631023" style="width:120px;height:240px;"></iframe></p> <p> </p> <p><iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=optimalsdwcom-22&amp;language=ja_JP&amp;o=9&amp;p=8&amp;l=as4&amp;m=amazon&amp;f=ifr&amp;ref=as_ss_li_til&amp;asins=B092C6R5ZP&amp;linkId=2d0886743223b4298249f4be04003944" style="width:120px;height:240px;"></iframe></p> <p> </p> <p><iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=optimalsdwcom-22&amp;language=ja_JP&amp;o=9&amp;p=8&amp;l=as4&amp;m=amazon&amp;f=ifr&amp;ref=as_ss_li_til&amp;asins=B08764382M&amp;linkId=b84a2e6ecacd2cba3470703399da57b2" style="width:120px;height:240px;"></iframe></p> </div> <div class="field field--name-field-blog-category field--type-entity-reference field--label-above"> <div class="field--label">カテゴリ</div> <div class="field--items"> <div class="field--item"><a href="/blog/code" hreflang="ja">Code</a></div> <div class="field--item"><a href="/blog/code-linux" hreflang="ja">Linux</a></div> </div> </div> <div class="field field--name-field-tags field--type-entity-reference field--label-hidden field--items"> <div class="field--item"><a href="/blog" hreflang="ja">Blog</a></div> </div> <div class="views-element-container form-group"><div class="view view-eva view-relation-article-list view-id-relation_article_list view-display-id-entity_view_1 js-view-dom-id-e025ea4111c043785b9c5964a163c5c58073adff68c21f00503bba3d29c66407"> <header> <h4>あわせて読みたい記事はこちら</h4> </header> <div id="views-bootstrap-relation-article-list-entity-view-1" class="grid views-view-grid"> <div class="row"> <div class="col-auto col-sm-auto col-md-6 col-lg-6 col-xl-6"> <div class="views-field views-field-title"><span class="field-content"><a href="/blog/code-virtual-technology/article_24" hreflang="ja">続:Hyper-VでCentOS7環境を作る</a></span></div><div class="views-field views-field-field-kanban"><div class="field-content"><p><a href="https://optimal-sdw.com/blog/code-virtual-technology/article_24"><img alt="article_24_eye_catch" data-entity-type="file" data-entity-uuid="9e5811a7-e51f-4e43-9725-f848b5db21c4" src="/sites/default/files/inline-images/article_24.jpg" style="max-height:720px;max-width:1280px;width:100%;height:100%;object-fit:cover;" width="1920" height="716" loading="lazy" /></a></p> <p> </p> </div></div> </div> </div> </div> </div> </div> Sun, 10 Apr 2022 11:35:18 +0000 @optimal-sdw.com 102 at http://optimal-sdw.com ガントチャートでタスクを管理(WBS、イナズマ線、クリティカルパス) http://optimal-sdw.com/blog/code-projectmanagement/article_101 <span>ガントチャートでタスクを管理(WBS、イナズマ線、クリティカルパス)</span> <span><span lang="" about="/banana_people/1" typeof="schema:Person" property="schema:name" datatype="">@optimal-sdw.com</span></span> <span>2021/10/31(日) - 18:36</span> <div class="field field--name-field-last-update field--type-datetime field--label-above"> <div class="field--label">更新日時</div> <div class="field--item"><time datetime="2021-11-23T09:36:13Z">2021/11/23(火) - 18:36</time> </div> </div> <div class="field field--name-field-kanban field--type-text-long field--label-hidden field--item"><p><a href="https://optimal-sdw.com/blog/code-projectmanagement/article_101"><img alt="article_101_eye_catch" data-entity-type="file" data-entity-uuid="8c5bf582-d118-4c9d-a791-fc23cf823963" src="/sites/default/files/inline-images/article_101.jpg" style="max-height:720px;max-width:1280px;width:100%;height:100%;object-fit:cover;" width="1920" height="1280" loading="lazy" /></a></p> <p> </p> </div> <div class="field field--name-body field--type-text-with-summary field--label-hidden field--item"><p>こんにちは。最近ふとWBSのテンプレートを作ってみたくなりまして、ExcelのVBAを使ってWBSからガントチャートを作成するテンプレートを作成いたしました。</p> <p>Windows10 Pro環境、MacBook Pro (M1 2020)環境において、Microsoft Office365環境下で動作確認済みとなります。</p> <p>古いExcelでは動作しない可能性もございますが、もし利用してみたいという方は以下のnoteにて配布中になります。</p> <p><a href="https://note.com/optimal_sdw_com/n/n0c5c05d698ff" rel="nofollow noopener noreferrer" target="_blank">Excel VBA - WBSとガントチャートでタスクを管理する</a></p> <p> </p> <p><img alt="win_mac_wbs_sample" data-entity-type="file" data-entity-uuid="569aed69-5366-412c-83f5-33b1901cd388" src="/sites/default/files/inline-images/win_mac_wbs_sample.png" style="max-height:720px;max-width:1280px;width:100%;height:100%;object-fit:cover;" width="2880" height="1800" loading="lazy" /></p> <p> </p> <p>タスク管理ツールにつきましては、Redmine、Backlog、Jiraなどのアプリケーションやサービスも多く存在しています。</p> <p>いまさらExcelで管理なんて非効率だとか、高度なタスク管理ができないなどの声もあるでしょうが、あえてExcelで作成したのは配布しやすく、個人でも組織でも利用しやすいメリットがあるためです。</p> <p>当該記事は高度なタスク管理ツールを既に導入済みの方々に向けたものでは無いことを予めご認識頂ければと存じます。</p> <p>また、システム開発以外のお仕事でもWBSでタスク管理を行っている方は多いのではないでしょうか。</p> <p> VBAのコードはプロテクトをかけておりませんので、確認することが可能です。</p> <p>イナズマ線をどのように引いているか、クリティカルパスをどのように引いているか、Excelにおけるマクロの参考にもなれば幸いです。</p> <p> </p> <hr /><h2 id="sec01">WBSとは</h2> <hr /><p>システム開発等の現場ではタスク管理ツールとしてWBSがよく使われています。</p> <p>おそらく誰でも一度はタスク管理を経験しているのではないかと思います。仕事におけるタスク管理はもちろん、小中高大と学校における時間割、試験前の学習ス計画、夏休み冬休みの学習計画等々、何か自身でやるべきことをリスト化して書き出して期日を決めたり、優先度を決めたりなど。</p> <p>タスク管理ツールとしてよく使われるのはやることを箇条書きにしたTODOリストですが、WBSもTODOリストの一種です。</p> <p><b>Work Breakdown Structureの略</b>で、単純にやることを列挙するのではなく、目的に必要な作業を漏れなく列挙し、構造化して見える化するための工夫を施したTODOリストになります。</p> <p>Work Breakdownとあるように、WBSでは大枠の作業をまず列挙して、それぞれを無理なく取り組めるサイズの作業に分解して列挙していきます。これによって大きなタスクを小さなタスクの集合体と捉えることができるため、必要な作業が漏れにくくなります。</p> <p>また、Structureとあるように、大きな作業を中くらいの作業、小さな作業へと分解しているため、全体として何をやれば目的を達成できるのか、必要な作業が構造化されて見えるようになります。</p> <p>通常のTODOリストでは目の前の見えている作業を列挙してしまいがちで、全体として何をしなければいけないのかが見えにくく、余裕をもって作業完了したつもりが最終的に作業漏れがあってスケジュールの遅延に繋がることもあります。</p> <p>非常に小さなタスクであれば単純なTODOリストでも作業漏れ等無く管理できるかもしれませんが、長期にわたって多人数で進めたりするような大きなプロジェクトのタスクになりますと、TODOリストで管理するのは非常に大変です。</p> <p>そのため、システム開発等の現場ではタスク管理ツールとしてWBSをよく利用します。</p> <p>また、単純なTODOリストやWBSとセットでよく使われるのがガントチャートになります。ガントチャートとはカレンダーにタスクの開始終了予定やそれらに対する実績を棒グラフ上に記述したもので、スケジュールを目で見てわかるようにしたものです。</p> <p>WBSとガントチャートはほとんどセットで利用されるため、昨今WBSと呼ばれているもののほとんどはガントチャートとセットになっていることが多いと思います。</p> <p> </p> <hr /><h2 id="sec02">WBSの作り方 - 概要</h2> <hr /><p>簡単にですがWBSの作り方についてご説明いたします。</p> <p>WBSを作るには、その名前の通り、目的のために必要なタスクを洗い出し、分解して、構造化して見えるようにすることが必要になります。</p> <h3>手順1:目的のために必要なタスクを洗い出す</h3> <p>例えば、システム開発であればウォーターフォールモデルにあるように、要件定義、基本設計、詳細設計、開発・単体テスト、結合テスト、システムテスト…と大枠のタスクがあります。まずはこれらのタスクを洗い出します。</p> <p>もちろん、システム開発以外のタスクにおいても利用できますので、例えば〇〇試験に向けての午前試験対策、午後試験対策等々の大枠のタスクを洗い出します。</p> <h3>手順2:手順1で洗い出したタスクをより細かい単位に漏れなく分解する</h3> <p>手順1で大枠のタスクを洗い出したあとは、それぞれの大枠のタスクでやるべきことをもう少し細かい粒度で洗い出します。</p> <p>要件定義であれば、現在の業務フローのまとめ、新業務フローのまとめ、機能一覧の作成、画面一覧や画面イメージの作成等々のタスクに分解していきます。</p> <p>そして、例えば「現在の業務フローのまとめ」タスクをさらに分解して、現在の〇〇業務フロー図作成、△△業務フロー図作成というように「現在の業務フローのまとめ」タスクを終わらせるには何を揃える必要があるのか?ということを考えながら漏れなく必要なタスクを洗い出していきます。</p> <h3>手順3:手順2で分解した作業をツリー構造によって階層化して表す</h3> <p>上記手順1、2で洗い出した作業をツリー構造によって階層化して記述します。ツリー構造とすることで、大作業、中作業、小作業と分けられ、中作業を終えるためにはどのような小作業が必要なのかを把握することができます。</p> <p>以上になります。</p> <p>タスクの分解の目安としては3段階までの分解にします。それ以上分解してしまうと、粒度が細かくなり過ぎて管理が難しくなります。</p> <p>もしも3段階以上細かくなるようであれば、大枠のタスクの単位でクローズアップしたWBSを作成します。例えば〇〇システム開発というプロジェクトにおいて、プロジェクト全体のタスクを管理するWBSのほかに、要件定義だけにフォーカスしたWBSや、基本設計にフォーカスしたWBSを作成します。</p> <p>そうすることで、全体スケジュールを把握しつつ、各フェーズ毎のスケジュールも細かく管理することができるようになります。</p> <p> </p> <hr /><h2 id="sec03">WBSのメリット</h2> <hr /><p>WBSは簡単に作成できそうですが1日2日がかりで作成することもあり、手間がかかる結構面倒なものです。しかしながら、その分メリットもあります。</p> <ol><li><strong>全体の見通しが良くなり、何をすればよいのかスコープが明確になる</strong></li> <li><strong>必要な作業の抜け漏れ、重複を防げる</strong></li> <li><strong>小さなタスクに分解することで作業を進めやすくなる</strong></li> </ol><p>WBSを作成するようになりますと、目的を達成するために必要なタスクを大枠で捉える力、分解する力が身につきます。また、それに伴いタスクを進めるにあたり並行作業できるもの、直列作業しかできないものなどが見えてくるようになり、ほかのタスクの完了待ち時間などを考えたスケジュールを組むことができるようになります。</p> <p>何となく1週間くらいでやれるだろう、1か月もあればできるだろうなんて考えていたタスクが、実は分解して個々のタスクに必要な作業量を見積もっていくと全然見通しが甘かったなんてことはよくあります。</p> <p>WBSを作成すると、それらの一つ一つのタスクを先立って考えることになりますので、漠然としていたスケジュール感が修正され、「ある程度」現実的なスケジュール感で計画することができるようになります。</p> <p>※ 「ある程度」としているのはWBSを作成しても正確なスケジューリングは難しいからです。</p> <p> </p> <hr /><h2 id="sec04">WBSの作り方 - タスク分解のコツ</h2> <hr /><p>WBSを作成する際は、何を目的としたプロジェクトのWBSかを意識して、そのプロジェクトの成果物や作業の流れに着目します。</p> <ol><li><strong>プロジェクトは何を目的としているか</strong></li> <li><strong>プロジェクトはどんな成果物を必要としているか</strong></li> <li><strong>プロジェクトはどのような作業の流れで進めるのか</strong></li> </ol><p>例えば、夏休みの学習計画であれば各教科の宿題、システム開発であれば要件定義書や基本設計書などのドキュメントにプログラムのソースコードなどが成果物に該当します。</p> <p>そして、その成果物を作成するためにはどんな作業が必要か?という観点で組み立てていきます。</p> <p>例えば要件定義書については業務フローを明確にして、業務の中で必要なアプリケーションの機能(入出力)を明らかにして、と作業の順番を考えます。</p> <p>具多的な進め方のステップは以下の通りです。</p> <ol><li><strong>WBS作成の準備 - WBS作成に必要な情報を収集する(プロジェクトで何をするのか?何が成果物か?前提条件は?)</strong></li> <li><strong>タスクの洗い出し - プロジェクトの成果物を用意するにあたり、どんな作業が必要なのか?必要な作業に漏れはないか?</strong></li> <li><strong>各タスクの工数見積もり - 各タスクにはどのくらいの人、どのくらいの時間が必要か?</strong></li> <li><strong>スケジュールの作成 - 各タスクの優先度、前後関係から作業順を決めて、必要な工数をもとに期日を決めてスケジュールする</strong></li> <li><strong>各タスクの役割分担を行う</strong></li> </ol><p>上記の手順でプロジェクトの計画段階でWBSを作成します。</p> <p>プロジェクトの計画段階では不確定要素も多く、粗いタスクの洗い出しになるかもしれませんが、粗くても全体をおさえることが大切です。全体をおさえるために必ずトップダウンでタスクの洗い出しを行います。</p> <p>また、末端タスクの詳細内容が判明しておらず、粗いものだったとしても、漏れなく必要な作業を捉えておくことが大切になります。</p> <p>例えば要件定義の場合、要件定義実施前なので当然具体的な業務の内容や必要なアプリの画面などについては情報が不足していると思います。</p> <p>しかしながら、業務フロー図を作成する(どの業務の?)、画面イメージを作成する(どの画面の?)、といった詳細不明でも必要になる作業はすべて洗い出しておく必要があります。</p> <p>各工程を通じて計画段階では不透明だったタスクについては明らかになった段階でWBSを詳細化していきます。</p> <p>WBSでタスクを洗い出す際は、粒度を揃えて分解するとわかりやすく使いやすいものになります。</p> <p>例えば要件定義、基本設計などの工程を1段階目、2段階目に業務フローなどの各種ドキュメント(中間成果物)、3段階目に中間成果物を作成するための作業項目など。</p> <p>メインの作業と、付帯作業にわけて考えると粒度を揃えやすくなります。メインの作業とは例えば「要件定義書を作成する」といった必要な成果物に直結する作業になります。付帯作業というのは技術情報の調査や現状のヒアリング、社内で必要な手続きや成果物のレビューなどです。</p> <p>また、切り出すタスクのボリュームについても30分や1時間など非常に短時間で終わるようなタスクは個々で管理すると大変ですので、半日から1日単位ぐらいのタスクになるようにするとよいと思います。</p> <p>簡単にWBSの書き方についてご説明いたしましたが、より詳しいWBSの書き方やテクニックにつきましては、いくつか書籍が出ておりますので、工数やスケジュールの見積もり方法を含め、より詳しい情報をお求めの方は書籍を参考にされると良いと思います。</p> <p> </p> <p>WBSについて、詳しい解説を必要とする方は以下の書籍がおすすめです。</p> <p><iframe frameborder="0" marginheight="0" marginwidth="0" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=optimalsdwcom-22&amp;language=ja_JP&amp;o=9&amp;p=8&amp;l=as4&amp;m=amazon&amp;f=ifr&amp;ref=as_ss_li_til&amp;asins=B013DKVEDU&amp;linkId=c471deb025a8e56a6571b1e08ba91186" style="width:120px;height:240px;"></iframe> <iframe frameborder="0" marginheight="0" marginwidth="0" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=optimalsdwcom-22&amp;language=ja_JP&amp;o=9&amp;p=8&amp;l=as4&amp;m=amazon&amp;f=ifr&amp;ref=as_ss_li_til&amp;asins=4798108499&amp;linkId=055034359d23243801d7b0f101451fde" style="width:120px;height:240px;"></iframe></p> <p> </p> <p>また、システムエンジニアの方など、システム開発におけるタスクの洗い出しについては、上記の書籍とあわせて以下の書籍が参考になると思います。</p> <p> </p> <p><iframe frameborder="0" marginheight="0" marginwidth="0" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=optimalsdwcom-22&amp;language=ja_JP&amp;o=9&amp;p=8&amp;l=as4&amp;m=amazon&amp;f=ifr&amp;ref=as_ss_li_til&amp;asins=B07JM11S69&amp;linkId=7dead964952a9af0198b3be8519a0d1c" style="width:120px;height:240px;"></iframe> <iframe frameborder="0" marginheight="0" marginwidth="0" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=optimalsdwcom-22&amp;language=ja_JP&amp;o=9&amp;p=8&amp;l=as4&amp;m=amazon&amp;f=ifr&amp;ref=as_ss_li_til&amp;asins=B07219DYD3&amp;linkId=75fe962318fd68b9eae78db8ab24696b" style="width:120px;height:240px;"></iframe></p> <p> </p> <hr /><h2 id="sec05">VBAで機能を実装する</h2> <hr /><p>ここから先はプログラミングに興味のある方、自分でもVBAを使ったマクロを作成してみたい方向けの内容になります。</p> <p>ExcelなどのMicrosoft Office製品ではマクロと言って、VBAという言語を用いてプログラミングによる機能開発をすることができるようになっています。</p> <p>Excelのオプションで開発タブをリボンに加えると、VBAに関する機能メニューが追加されます。</p> <p>VBAで機能開発するにあたって便利なのが「マクロの記録」機能です。マクロの記録機能を使いますと、オートシェイプを生成したり、背景色を変更したり、Excelファイル上の操作がそのままプログラムとして記録されます。</p> <p>これをうまく使うことでオートシェイプの操作にはどういうライブラリを使えば良いのかなどヒントを得ることが可能です。</p> <p>記録されたプログラムからVBAのリファレンスを確認することでさらに詳細の利用方法を知ることができます。</p> <p> </p> <hr /><h2 id="sec06">機能を実装する際にまずやること</h2> <hr /><p>何かしらの機能を実装する場合、まずはその機能に必要な情報が何かを考えます。</p> <p>プログラミングを学び始めたばかりですと、このような必要な情報を揃える作業に慣れていないため、何かを作ろうと考えてもそこから手も足も出ずに行き詰まってしまうことがしばしばあります。</p> <p>例えば今回作成したWBSについては、WBSとはどんなモノでどんな項目が必要か?ガントチャートとはどういうものか?イナズマ線とは?クリティカルパスとは?そもそもWBSは何を管理するものだった?等々、さまざまな情報が必要になります。</p> <p>このような情報を集めて整理することで、扱うデータ項目にどういうものが必要になるのかが見えてきます。</p> <p>まずはゆっくりでいいので、落ち着いて作りたいものに必要な項目を洗い出し、それらの項目を使ってどのような動きをさせたいのかじっくり考えてみましょう。</p> <p> </p> <hr /><h2 id="sec07">WBSに必要な項目</h2> <hr /><p>WBSを作成するにあたり、必要な項目を洗い出してみます。</p> <p>WBSは一種のToDo管理であり、「プロジェクト」における「やること」=「タスク」を管理します。そのタスクは「プロジェクトの工程」別に管理され、「誰が」「何を」「いつまで」にやるのか、実際には「何時着手」して「何時終えた」のか、「予定」、「実績」を管理するためによく使われます。</p> <p>予定より進んでいるのか、遅れているのか、現在の状態はなど、「進捗」を把握するためのツールです。予定より進んでいるのか、遅れているのかを判断するには何時から見て進んでいるのか、遅れているのか「基準となる日」が必要です。</p> <p>このようにWBSとは何ぞや?どんな情報必要だっけ?と考えると「」で括ったような単語から必要な情報が見えてきます。</p> <ul><li><strong>プロジェクト → プロジェクト名、プロジェクトの期間</strong></li> <li><strong>プロジェクトの工程 → タスクの大枠</strong></li> <li><strong>タスク → タスク名</strong></li> <li><strong>誰が → タスクの担当者</strong></li> <li><strong>何を → タスク</strong></li> <li><strong>何時まで → タスクの開始予定日、終了予定日</strong></li> <li><strong>何時着手 → タスクの開始日、終了日</strong></li> <li><strong>予定 → タスクの開始予定日、終了予定日</strong></li> <li><strong>実績 → タスクの開始日、終了日</strong></li> <li><strong>進捗 → 予定、実績、タスクの状態</strong></li> <li><strong>基準となる日 → 基準日</strong></li> </ul><p>上記のように作りたいものの特徴を列挙していくことを実践すると、これがデータベースに必要なテーブルであったりテーブルの項目になっていきます。</p> <p>今回はExcel VBAによる機能実装ですので、データベースではなく、情報を保持するのはExcelシートになります。</p> <p>上記の項目を元にWBSの一覧をレイアウトします。</p> <p> </p> <hr /><h2 id="sec08">ガントチャートに必要な項目</h2> <hr /><p>WBSをもとにガントチャート生成機能を実装するにあたり、必要な項目を洗い出します。</p> <p>ガントチャートは「カレンダー」上に「棒グラフ」で「タスクの予定と実績」を表示するもので、視覚的にタスクのスケジュールを把握できるようにしたものです。</p> <p>ということで必要な情報としては、以下の通りです。</p> <ul><li><strong>カレンダー</strong></li> <li><strong>棒グラフ</strong></li> <li><strong>タスクの予定と実績</strong></li> </ul><p>さらに詳細化していきます。</p> <p> </p> <hr /><h2 id="sec09">ガントチャートに必要な項目 - カレンダー</h2> <hr /><p>カレンダーに必要な情報としては、いつからいつまでのカレンダーが必要なのか、年月日、曜日、祝日は?会社独自のお休みの日は?などと考えていきます。</p> <p>さらに、カレンダーを表示するにあたり、見た目の情報も必要になります。通常の稼働日と区別するために、土日、祝日、非稼働日に色をつけて区別できるようにしたいですね。(一般的なカレンダーでは日曜日、祝日は赤で区別されていますね。)</p> <p>また、予定通りなのか遅れているのかを判断するのに基準日が必要でしたので、基準日がどの日付になっているのかも見た目でわかるようにしたいですね。</p> <p>上記のようなことを考えていくと、必要な情報は以下になります。</p> <ul><li><strong>カレンダーの期間 → プロジェクトの期間</strong></li> <li><strong>土日、祝日、非稼働日、基準日の見た目 → カレンダーの背景色あるいは文字色、罫線の色など</strong></li> </ul><p>上記情報が出てきたところで疑問が湧きます。それは「カレンダーを描画するための見た目の設定」をどこでどのように持つか?です。</p> <p>WBSに必要な項目を洗い出した際に、Excel VBAではExcelシートがデータベースのテーブルの代わりと申し上げたように、やはりこれらの設定値についてもExcelシートを使います。</p> <p>もちろん、プログラム内に固定値で色の情報などを持つこともできます。しかしながら、利用していく内にやはりここの色は赤よりも青がいい、灰色がいいなどと変更したくなるかもしれません。</p> <p>そういった変更を行う際に都度プログラムを修正するのは面倒ですね。なので設定用のExcelシートを作って、プログラムからはその値を読み取って利用するようにすれば、プログラムを変更しなくても見た目を変えることができます。</p> <p>これはVBAに限らず、アプリケーションを開発する上でよく使うテクニックの一つになります。エラーメッセージやボタン名などを設定ファイルにまとめておくことで、プログラムは変更せずとも表示する文言を変更したりすることができます。</p> <p>話が逸れましたが、プログラムをなるべく変更しなくても見た目や動きを変えることができる工夫があることを知っておいてください。</p> <p>ひとまずガントチャートを作るためのカレンダーについて情報整理できれば、WBSをもとにカレンダーを生成するところまで機能を作り込んでも問題ありません。</p> <p> </p> <hr /><h2 id="sec10">ガントチャートに必要な項目 - 棒グラフ</h2> <hr /><p>続いて棒グラフですが、棒グラフは縦向きでしょうか、横向きでしょうか。</p> <p>ガントチャートは年月日を縦軸にして、横軸にタスクを並べ、横軸のタスクが持つ予定や実績をもとに縦軸の年月日に合わせて棒グラフを描きます。そのため、棒グラフは横棒グラフになります。</p> <p>棒グラフを描くにはどうしたら良いでしょうか?</p> <p>Excelシートでできることを考えますと、背景色を塗る、あるいはオートシェイプで長方形の箱、あるいは太線などを用意すれば棒グラフになりそうですね。</p> <ul><li><strong>背景色を塗りつぶす</strong></li> <li><strong>オートシェイプを描く</strong></li> </ul><p>背景色を塗りつぶして棒グラフを作成する場合、1つのタスクを1行で表しているとすると、予定と実績をどのように1行の中で表せば良いでしょうか?</p> <p>例えばよくあるのは予定と実績の色を別々にして、予定の棒グラフを進捗率に応じて実績の色で塗りつぶしていく方法です。</p> <p>オートシェイプで棒グラフを用意する場合はどうでしょう?</p> <p>背景色を塗りつぶす方法と同じようにしようとすると、進捗率に応じて予定のオートシェイプ、実績のオートシェイプのサイズを調整して横一列に連結すれば同じようにできそうですね。</p> <p>もしくは、1行の中で予定に対応する棒グラフと、実績に対応する棒グラフの両方を並行して描画すると予定に対し、実績の棒グラフがいつから始まって、いつで終わっているかを見ることで先行着手したのか、予定通りなのか、遅れて着手したのかなど、一目瞭然ですね。</p> <p>この棒グラフを予定と実績で並行して描画する方法を二重線方式と言います。おそらく背景色を塗り潰すよりもわかりやすく、VBAでオートシェイプを描く方法さえわかれば、二重線方式で表すのが予定と実績に1対1でそれぞれの棒グラフが紐づくため、一番扱い易いと思います。</p> <p>ではオートシェイプで棒グラフを描くにあたって、必要な情報はどんなものが必要でしょうか?</p> <p>まずはVBAでオートシェイプを描く方法を知ることから始める必要がありますね。それからカレンダーに合わせて、オートシェイプを描き始める日付の位置、終端の位置をどのように取得すれば良いか、オートシェイプの色は固定か、設定値で変えるようにするか、設定値で変える場合は担当者毎に変えることができた方が良いか?などと考えていきます。</p> <ul><li><strong>VBAでのオートシェイプの取り扱い方</strong></li> <li><strong>オートシェイプを描画する際の開始と終了位置の取得</strong></li> <li><strong>オートシェイプの太さ、色などの設定値をどうするか</strong></li> </ul><p>ここでオートシェイプを描く方法を知るためのヒントとして、マクロの記録機能を有効活用します。</p> <p>Excelの開発タブを開いて頂き、まずはマクロの記録を開始します。続いて使いたいオートシェイプをシート上に描きます。最後にマクロの記録を停止します。</p> <p>上記の手順でVBAのコードが生成されているはずですので、使われているオブジェクト名やメソッド名を確認してみてください。</p> <p>そのままGoogle検索で「VBA オートシェイプ」みたいに検索して頂いても良いですが、オートシェイプは形も様々ですので、使いたいオートシェイプを実際にシートの上に描き、マクロの記録機能でどのようなオブジェクトを使っているのか、どのようなメソッドを使っているのか、名称を知った上で検索した方がより欲しい情報に辿り着くことができます。</p> <p>なお、Excelでは各セルには座標情報があり、どの列のどの行のセルなのか、セルの左端の位置、セルの上部の位置などを持っています。これらの情報とセルの幅や高さの情報を組み合わせて計算することで、セルの左から少し余白をあけてオートシェイプを描き始めたり、セルの上部位置+セルの高さの半分でセル中央位置に描画するなど可能になります。</p> <p>タスクの予定と実績を1行で描画する場合、1行の高さもそれなりに太くする必要があります。そのため、セルの高さを揃える方法なども調べる必要があります。</p> <p>また、棒グラフをどこからどこまで描くかは各タスクの予定と実績によって異なりますので、予定の値、実績の値といったWBSの項目に入力された値をどのように読み取ればよいか、その値からカレンダーの位置をどのように特定すれば良いかといった具体的な実装方法についても検討する必要があります。</p> <p>このように必要な情報について細かく考えていきますと、機能実装に必要なものが徐々に見えてくるようになります。</p> <p> </p> <hr /><h2 id="sec11">イナズマ線</h2> <hr /><p>イナズマ線は基準日から見て遅れているタスク、進んでいるタスクを把握し、全体を俯瞰してプロジェクト全体で遅延しているのか、進んでいるのか進捗状況を視覚的に見るための折れ線グラフです。</p> <p>基準日から遅れているタスク、進んでいるタスクに向かって線を引くため、基準日を中心に山と谷ができます。</p> <p>それらの山と谷を相殺した結果山へ向くのか、谷へ向くのかで全体の進捗を視覚的に判断することができます。</p> <p>イナズマ線に必要な情報としては、以下の通りです。</p> <ul><li>基準日より遅れているタスク <ul><li>タスクの開始予定日と進捗率から基準日より過去日付のタスク <ul><li>例:10日間かかるタスクの進捗率が20%の場合、2日間分の作業をしたことになるが、着手予定日+2日 < 基準日 となる状況であれば遅延している</li> </ul></li> </ul></li> <li>基準日より進んでいるタスク <ul><li>タスクの開始予定日と進捗率から基準日より未来日付のタスク <ul><li>例:基準日よりも未来日付に開始予定となっているタスクを既に進めている</li> </ul></li> </ul></li> <li>予定、実績棒グラフの座標</li> <li>基準日の座標</li> </ul><p>ガントチャートでイナズマ線を引くには、上記タスク情報の予定棒グラフまたは実績棒グラフの座標が必要になります。</p> <p>例えば、遅延タスクにおいては着手済みであれば実績棒グラフの座標を利用できますが、まだ未着手の場合は予定棒グラフの座標を使う必要があります。</p> <p>また、基準日から棒グラフのどの位置までイナズマ線を引くのかについては、開始予定日(開始日)とタスクに必要な期間、進捗率を利用することで定めることが可能です。</p> <p> </p> <hr /><h2 id="sec12">クリティカルパス</h2> <hr /><p>クリティカルパスとは、作業工程の中で遅延が発生すると全体が遅延する工程の関係性を表すものになります。</p> <p>例えば作業A、作業B、作業Cとあり、作業Bは前工程として作業Aが必要であり、作業Cは独立して作業可能とします。</p> <p>作業Cは独立しているため、仮に遅延が発生しても作業Bが終わる前に終われば全体の作業としては遅延しません。しかしながら、作業Aに遅延が発生すると作業Bも遅れてしまいます。全行程の中で完了予定日が最後の工程からこのような前工程の作業を繋いでいくと、それがクリティカルパスになります。</p> <p>ガントチャート上で実装するには、各タスクに前工程の紐づけ情報を持たせる必要があります。</p> <p>また、各タスクを特定するには、各タスクに一意となるNo.を持たせる必要があります。</p> <p>あとは一番完了予定日が遅いタスクから紐づけを辿ります。</p> <p>クリティカルパスを正しく把握するには各タスクをWBSとして一覧化する際にタスクの前後関係を把握しておく必要があります。</p> <p> </p> <hr /><h2 id="sec13">まとめ</h2> <hr /><p>WBSについての説明と、VBAで実装するときの考え方についてざっくりと説明させて頂きましたが、いかがでしょうか。</p> <p>もう少し詳細を知りたいという方は是非noteに添付してあるWBSテンプレートをダウンロードして頂き、実際にVBAのソースを読んでいただければと思います。</p> <p><a href="https://note.com/optimal_sdw_com/n/n0c5c05d698ff" rel="nofollow noopener noreferrer" target="_blank">Excel VBA - WBSとガントチャートでタスクを管理する</a></p> <p> </p> <p>WBSとは、Work Breakdown Structureの略です。</p> <p>Work Breakdownとあるように、WBSでは大枠の作業をまず列挙して、それぞれを無理なく取り組めるサイズの作業に分解して列挙していきます。</p> <p>これによって大きなタスクを小さなタスクの集合体と捉えることができるため、必要な作業が漏れにくくなります。</p> <p>また、Structureとあるように、大きな作業を中くらいの作業、小さな作業へと分解しているため、全体として何をやれば目的を達成できるのか、必要な作業が構造化されて見えるようになります。</p> <p> </p> <p>WBSのメリットは以下の通りです。</p> <ol><li><strong>全体の見通しが良くなり、何をすればよいのかスコープが明確になる</strong></li> <li><strong>必要な作業の抜け漏れ、重複を防げる</strong></li> <li><strong>小さなタスクに分解することで作業を進めやすくなる</strong></li> </ol><p>以下、WBSの作成手順になります。</p> <ul><li><strong>手順1:目的のために必要なタスクを洗い出す</strong></li> <li><strong>手順2:手順1で洗い出したタスクをより細かい単位に漏れなく分解する</strong></li> <li><strong>手順3:手順2で分解した作業をツリー構造によって階層化して表す</strong></li> </ul><p> </p> <p>WBSについて、詳しい解説を必要とする方は以下の書籍がおすすめです。</p> <p> </p> <p><iframe frameborder="0" marginheight="0" marginwidth="0" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=optimalsdwcom-22&amp;language=ja_JP&amp;o=9&amp;p=8&amp;l=as4&amp;m=amazon&amp;f=ifr&amp;ref=as_ss_li_til&amp;asins=B013DKVEDU&amp;linkId=c471deb025a8e56a6571b1e08ba91186" style="width:120px;height:240px;"></iframe> <iframe frameborder="0" marginheight="0" marginwidth="0" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=optimalsdwcom-22&amp;language=ja_JP&amp;o=9&amp;p=8&amp;l=as4&amp;m=amazon&amp;f=ifr&amp;ref=as_ss_li_til&amp;asins=4798108499&amp;linkId=055034359d23243801d7b0f101451fde" style="width:120px;height:240px;"></iframe></p> <p> </p> <p>また、プロジェクトマネージャー、システムエンジニア向けに、プロジェクトの全体工程を把握されたい方向けには以下の書籍がおすすめです。</p> <p> </p> <p><iframe frameborder="0" marginheight="0" marginwidth="0" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=optimalsdwcom-22&amp;language=ja_JP&amp;o=9&amp;p=8&amp;l=as4&amp;m=amazon&amp;f=ifr&amp;ref=as_ss_li_til&amp;asins=B07JM11S69&amp;linkId=7dead964952a9af0198b3be8519a0d1c" style="width:120px;height:240px;"></iframe> <iframe frameborder="0" marginheight="0" marginwidth="0" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=optimalsdwcom-22&amp;language=ja_JP&amp;o=9&amp;p=8&amp;l=as4&amp;m=amazon&amp;f=ifr&amp;ref=as_ss_li_til&amp;asins=B07219DYD3&amp;linkId=75fe962318fd68b9eae78db8ab24696b" style="width:120px;height:240px;"></iframe></p> <p> </p> <p>以上になりますが、WBSのサンプルがお役に立てば幸いです。</p> <p> </p> </div> <div class="field field--name-field-blog-category field--type-entity-reference field--label-above"> <div class="field--label">カテゴリ</div> <div class="field--items"> <div class="field--item"><a href="/blog/code" hreflang="ja">Code</a></div> <div class="field--item"><a href="/blog/code-projectmanagement" hreflang="ja">ProjectManagement</a></div> </div> </div> <div class="field field--name-field-tags field--type-entity-reference field--label-hidden field--items"> <div class="field--item"><a href="/blog" hreflang="ja">Blog</a></div> </div> <div class="views-element-container form-group"><div class="view view-eva view-relation-article-list view-id-relation_article_list view-display-id-entity_view_1 js-view-dom-id-6ff8d1f57760367955819addbaed9c94358ae351418dffbc0427c1adb1f41c93"> <header> <h4>あわせて読みたい記事はこちら</h4> </header> <div id="views-bootstrap-relation-article-list-entity-view-1--2" class="grid views-view-grid"> <div class="row"> <div class="col-auto col-sm-auto col-md-6 col-lg-6 col-xl-6"> <div class="views-field views-field-title"><span class="field-content"><a href="/blog/code-projectmanagement/article_99" hreflang="ja">システム開発プロジェクトの工程について(ウォータフォール基準)</a></span></div><div class="views-field views-field-field-kanban"><div class="field-content"><p><a href="https://optimal-sdw.com/blog/code-projectmanagement/article_99"><img alt="article_99_eye_catch" data-entity-type="file" data-entity-uuid="2a7d7cdc-a21a-4495-a4ec-5af60e9b35b5" src="/sites/default/files/inline-images/article_99.jpg" style="max-height:720px;max-width:1280px;width:100%;height:100%;object-fit:cover;" width="1893" height="683" loading="lazy" /></a></p> <p> </p> </div></div> </div> <div class="col-auto col-sm-auto col-md-6 col-lg-6 col-xl-6"> <div class="views-field views-field-title"><span class="field-content"><a href="/blog/code-projectmanagement/article_100" hreflang="ja">Wordによる基本設計書のテンプレート一式</a></span></div><div class="views-field views-field-field-kanban"><div class="field-content"><p><a href="https://optimal-sdw.com/blog/code-projectmanagement/article_100"><img alt="article_100_eye_catch" data-entity-type="file" data-entity-uuid="b0f2fa3e-1eca-4b78-a9d8-bee2e178db1f" src="/sites/default/files/inline-images/article_100.jpg" style="max-height:720px;max-width:1280px;width:100%;height:100%;object-fit:cover;" width="1280" height="853" loading="lazy" /></a></p> <p> </p> </div></div> </div> </div> </div> </div> </div> Sun, 31 Oct 2021 09:36:13 +0000 @optimal-sdw.com 101 at http://optimal-sdw.com Wordによる基本設計書のテンプレート一式 http://optimal-sdw.com/blog/code-projectmanagement/article_100 <span>Wordによる基本設計書のテンプレート一式</span> <span><span lang="" about="/banana_people/1" typeof="schema:Person" property="schema:name" datatype="">@optimal-sdw.com</span></span> <span>2021/05/16(日) - 07:49</span> <div class="field field--name-field-last-update field--type-datetime field--label-above"> <div class="field--label">更新日時</div> <div class="field--item"><time datetime="2021-05-15T22:49:48Z">2021/05/16(日) - 07:49</time> </div> </div> <div class="field field--name-field-kanban field--type-text-long field--label-hidden field--item"><p><a href="https://optimal-sdw.com/blog/code-projectmanagement/article_100"><img alt="article_100_eye_catch" data-entity-type="file" data-entity-uuid="b0f2fa3e-1eca-4b78-a9d8-bee2e178db1f" src="/sites/default/files/inline-images/article_100.jpg" style="max-height:720px;max-width:1280px;width:100%;height:100%;object-fit:cover;" width="1280" height="853" loading="lazy" /></a></p> <p> </p> </div> <div class="field field--name-body field--type-text-with-summary field--label-hidden field--item"><p>皆さんのお手元には基本設計書の雛型などは整備されておりますでしょうか?都度フォーマットから用意しているような状況でしょうか?</p> <p>私は2019年3月よりフリーランスエンジニアとして活動を始めましたが、 様々なプロジェクトに参加いたしますと、意外と設計書のテンプレートは整備されていないということです。</p> <p>そもそも設計書が存在していないとか、メンテ不能なPDF版で存在するとか、設計書のフォーマットがばらばらでメモ書きのような雑なものだったりなど。</p> <p>そのような現場に入った際に利用可能なテンプレートがあると便利だと思いませんか?</p> <p>書籍でも設計書の書き方や設計書として揃えるべきドキュメントの種類を学ぶことは可能です。むしろ、書籍のほうがまとまっており、初めての方が書き方を学ぶのであれば書籍のほうが良いかもしれません。</p> <p>しかしながら、それらの書籍の付録として配布されている設計書テンプレートにおいて、実際に現場で使えるテンプレートは今のところ出会ったことがありません。</p> <p>表紙と目次、見出しがちょっと記載されているだけで、何も無いに等しい状態のものがほとんどです。</p> <p>例えば以下のようなものです。</p> <p><img alt="cheap_template" data-entity-type="file" data-entity-uuid="f69b72c3-6be8-44bb-8e4e-941cb648f857" src="/sites/default/files/inline-images/cheap_template_0.png" style="max-height:720px;max-width:1280px;width:100%;height:100%;object-fit:cover;" width="1045" height="588" loading="lazy" /></p> <p>上記の状態では結局ゼロから書くのと変わらないですよね。</p> <p>設計書を書くのが初めての人は書籍等で書かなければならない要素について学べても、フォーマットを一からそろえるのは大変だと思っております。</p> <p>ということで現場で使える設計書テンプレートを提供できれば、以下のような方々にとって有益なものになるのではと考えております。</p> <p> </p> <ul><li>フリーランスエンジニアとして独立しようと考えている方</li> <li>設計書を初めて書く方</li> <li>会社内でまだ決まったテンプレートが無い方</li> <li>他のエンジニアはどういう設計書を利用しているのか気になる方</li> </ul><p> </p> <p>もちろんテンプレートだけ提供しても基本設計の全体像がわからないと思いますので、簡易的なものではありますが説明を加えつつ提供していきたいと思います。</p> <p> </p> <p>なお、テンプレート一式はnoteで公開中になります。当該記事と同じ説明を載せておりますので、テンプレートをダウンロードされたい方はnoteをご確認ください。</p> <p><a href="https://note.com/optimal_sdw_com/n/ndfa3af81043f" rel="nofollow noreferrer noopenner" target="_blank">テンプレートファイルを取得するにはこちら</a></p> <p> </p> <hr /><h2 id="sec01">基本設計書のテンプレートはExcelかWordか</h2> <hr /><p>ITエンジニアが記述する設計書の多くはExcelが多い印象です。</p> <p>Excelファイルのセル幅を縮めたいわゆるExcel方眼紙ベースの設計書ですね。</p> <p>というのも画面項目やDBのテーブル項目など、何かと表形式で書くものが多いため、Excelのほうが扱いやすいという背景があります。</p> <p>また、画面のスクリーンショットもExcelのほうが比較的添付しやすいです。</p> <p>しかしながら、お客様環境毎にプリンターが異なるため、Excelで記述すると印刷範囲のズレが生じ、それらの体裁を整えるのに非常に手間がかかるデメリットがあります。(※ 印刷設定はプリンターに依存します。印刷しないかもしれませんが納品物ですので)</p> <p>また、セルに記述した文章が印刷してみると隠れてしまっていて印刷されないということも起きやすいです。</p> <p>実際に過去の経験上、以下のような問題が生じ、最後に設計書全体の体裁を修正するだけで1週間程度時間をかけることがありました。</p> <p> </p> <ul><li>列幅のズレを修正</li> <li>セル内の文章が印刷範囲外へ飛び出しているのを折り返しに修正</li> <li>セル内の文章が印刷すると隠れてしまう箇所の修正</li> <li>上述の修正に伴う行幅の調整とそれに伴う1ページあたりの印刷範囲の修正</li> <li>Excel関数で参照している箇所のリンク切れ修正(シートの追加、削除、コピーを行っていると発生しがち)</li> </ul><p> </p> <p>ということで今回は印刷時の体裁面で悩まされることが無いように、Word文書でテンプレートを用意しようと考えています。(用意しました。)</p> <p>※ Wordが最適解というわけではありませんが、読み手が労せず読めてメンテナンス可能なツールで作成するということには意味があります。</p> <p>※ エンジニアがチームのエンジニアの為に用意する文書であれば、ファイル形式はそこまで問題にはならず、ただのテキスト文書に箇条書きでもExcelでもマークダウンでも正確に伝えられるなら問題ないと思います。</p> <p> </p> <hr /><h2 id="sec02">基本設計書に必要な各種仕様書</h2> <hr /><p>基本設計書に必要な仕様書は以下の通りです。</p> <p> </p> <ul><li>命名規則</li> <li>機能一覧</li> <li>処理機能記述</li> <li>画面一覧</li> <li>画面仕様書</li> <li>画面遷移図</li> <li>項目ラベル名一覧</li> <li>エラーメッセージ一覧</li> <li>帳票一覧</li> <li>帳票仕様書</li> <li>ファイル一覧</li> <li>ファイル仕様書</li> <li>外部インターフェース一覧</li> <li>外部インターフェース仕様書</li> <li>バッチ処理一覧</li> <li>バッチ処理仕様書</li> <li>システムメール一覧</li> <li>システムメール定義書</li> <li>DBテーブル一覧</li> <li>DBテーブル定義書</li> <li>DBビュー一覧</li> <li>DBビュー定義書</li> <li>ER図</li> <li>コード一覧</li> <li>セキュリティ仕様書</li> <li>ワークフロー一覧</li> <li>ワークフロー定義書</li> <li>アプリケーション仕様書</li> </ul><p> </p> <p>おおよそ上記が書ければ大抵のシステム開発において必要な情報が揃うと思います。</p> <p>予算が限られている、あるいは非常に小規模なシステム開発においては最低限以下の設計書があれば十分だと個人的には考えております。</p> <p> </p> <ul><li>命名規則</li> <li>機能一覧</li> <li>画面一覧</li> <li>画面仕様書</li> <li>画面遷移図</li> <li>帳票一覧</li> <li>ファイル一覧</li> <li>外部インターフェース一覧</li> <li>外部インターフェース仕様書</li> <li>バッチ処理一覧</li> <li>バッチ処理仕様書</li> <li>システムメール一覧</li> <li>システムメール定義書</li> <li>DBテーブル一覧</li> <li>DBテーブル定義書</li> <li>ER図</li> <li>コード一覧</li> <li>アプリケーション仕様書</li> </ul><p> </p> <p>※ 昨今ではフロントエンド開発とサーバーサイド開発の分業が進んでいることもあり、基本設計時にある程度API設計まで済ませているケースもありますが、どちらかというと詳細設計に近いものですので当該記事では割愛します。</p> <p> </p> <hr /><h2 id="sec03">命名規則</h2> <hr /><p>システムの機能や画面、帳票などに識別IDを付与する際のIDの付け方や、DBのテーブル名、項目名の付け方(IDはXXX_id、コードはやXXX_code、名称はXXX_nameなど)などを定義します。</p> <p> </p> <p><img alt="name_rule_agenda" data-entity-type="file" data-entity-uuid="482f5eb8-6fdb-47f6-83ac-8d0f309a54df" src="/sites/default/files/inline-images/naming_rule_agenda.png" style="max-height:720px;max-width:1280px;width:100%;height:100%;object-fit:cover;" width="1684" height="1200" loading="lazy" /></p> <p> </p> <p><img alt="name_rule_sample" data-entity-type="file" data-entity-uuid="5048c885-3672-403c-9ef4-7b620d6293b0" src="/sites/default/files/inline-images/naming_rule_screen.png" style="max-height:720px;max-width:1280px;width:100%;height:100%;object-fit:cover;" width="1684" height="1186" loading="lazy" /></p> <p> </p> <hr /><h2 id="sec04">機能一覧</h2> <hr /><p>社員情報一覧、社員情報詳細、組織情報一覧、組織情報詳細・・・といったシステム内で登場する機能を一覧表に列挙します。</p> <p>記述する粒度としては、一つの画面として成立するような機能、メニューの単位になるような大枠の機能で記述します。</p> <p>社員情報を一覧表示する画面単位の機能として、例えば社員情報を登録する画面で組織情報を入力する際に、入力補助機能として組織情報検索のポップアップ画面を表示する機能などがありますが、このようなポップアップ画面も一つの機能として機能一覧に記載します。</p> <p>しかしながら、社員情報一覧画面内にある社員情報の検索機能や出力結果の並び替え機能など、そのような細かい機能の単位で記述することはほとんどありません。</p> <p> </p> <p><img alt="function_list_sample" data-entity-type="file" data-entity-uuid="8ca214d7-2799-4600-8a52-24e98f1a134d" src="/sites/default/files/inline-images/function_list.png" style="max-height:720px;max-width:1280px;width:100%;height:100%;object-fit:cover;" width="1684" height="1186" loading="lazy" /></p> <p> </p> <hr /><h2 id="sec05">処理機能記述</h2> <hr /><p>機能一覧に記載した「機能」の処理の流れをフローチャートなどの図や説明を用いて記述します。</p> <p>例えば社員情報一覧であれば「画面を初期表示する」、「検索をする」、「検索条件をクリアする」、「検索結果を並び替える」、「検索結果の一覧表からデータを選択して詳細画面を表示する」などといった当該機能で起きるアクションに基づく「処理」それぞれの説明を記述します。</p> <p>初期表示であれば、メニューから当該画面に遷移して、デフォルトの検索条件である〇〇で社員情報マスタからデータを取得し、社員情報一覧に結果を描画する、あるいは初期表示時は検索結果を表示せず、検索条件の入力欄を描画するなど、処理の流れを記述します。</p> <p> </p> <p><img alt="function_detail_agenda" data-entity-type="file" data-entity-uuid="cd3df2bf-e030-45ce-8d04-71494f21fe71" src="/sites/default/files/inline-images/function_detail_agenda.png" style="max-height:720px;max-width:1280px;width:100%;height:100%;object-fit:cover;" width="1684" height="1186" loading="lazy" /></p> <p> </p> <p><img alt="function_detail_sample" data-entity-type="file" data-entity-uuid="f705be36-e633-44f4-9127-86a655bbb246" src="/sites/default/files/inline-images/function_detail.png" style="max-height:720px;max-width:1280px;width:100%;height:100%;object-fit:cover;" width="1684" height="1186" loading="lazy" /></p> <p> </p> <hr /><h2 id="sec06">画面一覧</h2> <hr /><p>システムで登場する画面を一覧表にまとめます。</p> <p>例えば社員情報一覧画面、社員情報詳細画面、社員情報入力補助画面、組織情報一覧画面、組織情報詳細画面、組織情報入力補助画面などを一覧にまとめます。</p> <p>社員情報の詳細情報を表示するような「詳細画面」は、照会画面、入力画面、入力内容確認画面、登録完了画面など、同一レイアウトで項目の入力可否の違いだけの画面パターンがあることが多いです。</p> <p>これらは一つ一つの画面として定義する場合もありますが、モードの違いとして一つの仕様書にまとめられることが多いです。</p> <p>レイアウトが大きく異なる場合や、わけたほうが記述しやすい場合もありますので、記述する粒度はプロジェクトや案件によって少し異なります。</p> <p> </p> <p><img alt="screen_list_sample" data-entity-type="file" data-entity-uuid="cb39a86b-b0fc-4f66-ae4f-d76fb1b8b6e9" src="/sites/default/files/inline-images/screen_list.png" style="max-height:720px;max-width:1280px;width:100%;height:100%;object-fit:cover;" width="1684" height="1198" loading="lazy" /></p> <p> </p> <hr /><h2 id="sec07">画面仕様書</h2> <hr /><p>画面一覧に記述した画面ひとつひとつの項目の並びや画面で発生するイベント、入力チェック仕様にDBの保存先など細かな定義を記述します。</p> <p>画面がユーザーインターフェースの中心となっている以上、当該仕様書が基本設計の大半を占めています。</p> <p>画面仕様書とDB設計があればシステム機能のほとんどを構築できると言っても過言ではないほど重要な仕様書です。</p> <p>画面仕様書を見ればどのような入力項目があり、どのようにデータベースへ保存するのかがわかります。</p> <p> </p> <p><img alt="screen_detail_agenda" data-entity-type="file" data-entity-uuid="1804fd87-d20f-41b9-99e2-506ae2e1a340" src="/sites/default/files/inline-images/screen_detail_agenda.png" style="max-height:720px;max-width:1280px;width:100%;height:100%;object-fit:cover;" width="1684" height="1198" loading="lazy" /></p> <p> </p> <p><img alt="screen_detail_image_sample" data-entity-type="file" data-entity-uuid="77bc7a81-671b-42cb-b40b-b2acc53bdc4e" src="/sites/default/files/inline-images/screen_detail_image.png" style="max-height:720px;max-width:1280px;width:100%;height:100%;object-fit:cover;" width="1684" height="1198" loading="lazy" /></p> <p> </p> <p><img alt="screen_detail_item_list" data-entity-type="file" data-entity-uuid="824c5ace-8e64-4c9d-b306-f85dabb4f4ad" src="/sites/default/files/inline-images/screen_detail_item_list.png" style="max-height:720px;max-width:1280px;width:100%;height:100%;object-fit:cover;" width="1684" height="1198" loading="lazy" /></p> <p> </p> <p><img alt="screen_detail_event_list" data-entity-type="file" data-entity-uuid="8116e6b3-5e2c-4d5c-a0a2-2f650d8503b6" src="/sites/default/files/inline-images/screen_detail_event_list.png" style="max-height:720px;max-width:1280px;width:100%;height:100%;object-fit:cover;" width="1684" height="1198" loading="lazy" /></p> <p> </p> <hr /><h2 id="sec08">画面遷移図</h2> <hr /><p>画面と画面のつながりを表した図になります。</p> <p>例えば共通メニューから社員情報一覧画面や組織情報一覧画面へ遷移し、一覧画面から社員情報詳細や組織情報詳細などの個々の詳細情報画面へ遷移するといった情報を図で記述します。</p> <p>よくある図としてはオートシェイプの四角と矢印を使って、四角を画面、矢印を遷移先の画面への繋ぎとして記述するものです。</p> <p> </p> <p><img alt="screen_transition_sample" data-entity-type="file" data-entity-uuid="e7fc6aee-3849-471b-bab6-37d945927516" src="/sites/default/files/inline-images/screen_transition.png" style="max-height:720px;max-width:1280px;width:100%;height:100%;object-fit:cover;" width="1684" height="1198" loading="lazy" /></p> <p> </p> <hr /><h2 id="sec09">項目ラベル名一覧</h2> <hr /><p>全画面で利用する項目名の一覧になります。</p> <p>例えば担当者名であったり担当者氏名だったり、同じ項目に対して似たような別の名称をつけてしまうことがありますが、一覧にまとめることでこのような表記揺れを防ぐことができます。</p> <p>また、実装面において多言語対応されるケースも多いと思います。昨今のフレームワークにおいては項目名にIDを指定すると、指定言語に応じて紐づくラベル名に自動変換してくれます。</p> <p>上記のような機能を利用する場合にも日本語の項目名と英語の項目名を同じIDに紐づけて一覧で定義します。</p> <p> </p> <p><img alt="item_label_list" data-entity-type="file" data-entity-uuid="c3e5890b-0057-476f-acb2-d8eef10812d9" src="/sites/default/files/inline-images/item_label_list.png" style="max-height:720px;max-width:1280px;width:100%;height:100%;object-fit:cover;" width="1684" height="1198" loading="lazy" /></p> <p> </p> <hr /><h2 id="sec10">エラーメッセージ一覧</h2> <hr /><p>エラーコードとエラーメッセージを一覧で定義します。</p> <p>こちらも項目ラベル名一覧と同様に日本語エラーメッセージ、英語エラーメッセージを同一のIDに紐づけて定義します。</p> <p>ワーニングも当該一覧に定義します。</p> <p> </p> <p><img alt="message_list" data-entity-type="file" data-entity-uuid="edd3d8fd-5a99-4582-8b32-713313fac13d" src="/sites/default/files/inline-images/message_list.png" style="max-height:720px;max-width:1280px;width:100%;height:100%;object-fit:cover;" width="1684" height="1198" loading="lazy" /></p> <p> </p> <hr /><h2 id="sec11">帳票一覧</h2> <hr /><p>システムで発行する帳票の一覧になります。</p> <p>帳票とは例えば申請書のような主に印刷して利用する固定レイアウトのものになります。</p> <p> </p> <p><img alt="report_list" data-entity-type="file" data-entity-uuid="2714abcc-a172-46e0-8541-c7102f5c6221" src="/sites/default/files/inline-images/report_list.png" style="max-height:720px;max-width:1280px;width:100%;height:100%;object-fit:cover;" width="1684" height="1198" loading="lazy" /></p> <p> </p> <hr /><h2 id="sec12">帳票仕様書</h2> <hr /><p>帳票一覧に記載した帳票のレイアウトを定義するものになります。</p> <p>画面仕様書と同じように項目の並びや、DBのどのテーブルからどのように値を出力するのかの定義に加え、印刷する際の用紙サイズや余白の定義も記載します。</p> <p> </p> <p><img alt="report_detail_agenda" data-entity-type="file" data-entity-uuid="a0f7beba-a602-41a1-b005-aaa63b721129" src="/sites/default/files/inline-images/report_detail_agenda.png" style="max-height:720px;max-width:1280px;width:100%;height:100%;object-fit:cover;" width="1684" height="1198" loading="lazy" /></p> <p> </p> <p><img alt="report_detail_image" data-entity-type="file" data-entity-uuid="80aad8ef-4750-4084-9f6c-1d1fbe472752" src="/sites/default/files/inline-images/report_detail_image.png" style="max-height:720px;max-width:1280px;width:100%;height:100%;object-fit:cover;" width="1684" height="1198" loading="lazy" /></p> <p> </p> <p><img alt="report_detail_config" data-entity-type="file" data-entity-uuid="9a5e8d9f-4881-4248-8701-3c98705e7023" src="/sites/default/files/inline-images/report_detail_config.png" style="max-height:720px;max-width:1280px;width:100%;height:100%;object-fit:cover;" width="1684" height="1198" loading="lazy" /></p> <p> </p> <p><img alt="report_detail_ref_data" data-entity-type="file" data-entity-uuid="49f91d78-5f6b-4d8c-947a-bdff6d18a5b1" src="/sites/default/files/inline-images/report_detail_ref_data.png" style="max-height:720px;max-width:1280px;width:100%;height:100%;object-fit:cover;" width="1684" height="1198" loading="lazy" /></p> <p> </p> <hr /><h2 id="sec13">ファイル一覧</h2> <hr /><p>システムで出力するファイルの一覧になります。</p> <p>主にユーザ操作によって出力するファイルを記述するものであり、ログファイルなどシステムの裏側で作られるファイルは含まれません。</p> <p>例えばCSVファイルのようなデータ出力を主としたファイルを一覧に記述します。</p> <p> </p> <p><img alt="file_list" data-entity-type="file" data-entity-uuid="198196bd-8f89-4758-a590-12b4832d2d66" src="/sites/default/files/inline-images/file_list.png" style="max-height:720px;max-width:1280px;width:100%;height:100%;object-fit:cover;" width="1684" height="1198" loading="lazy" /></p> <p> </p> <hr /><h2 id="sec14">ファイル仕様書</h2> <hr /><p>ファイル一覧に定義したファイルの詳細を定義するものになります。</p> <p>ファイルがテキストファイルなのかバイナリファイルなのか、テキストファイルであれば文字コードが何かなどを含め定義します。</p> <p> </p> <p><img alt="file_detail_agenda" data-entity-type="file" data-entity-uuid="d44bcbd6-f6b6-4ce5-a760-f6cb41ca6488" src="/sites/default/files/inline-images/file_detail_agenda.png" style="max-height:720px;max-width:1280px;width:100%;height:100%;object-fit:cover;" width="1684" height="1198" loading="lazy" /></p> <p> </p> <p><img alt="file_detail_image" data-entity-type="file" data-entity-uuid="2284bb0f-331e-42a1-a16f-71f74ecea669" src="/sites/default/files/inline-images/file_detail_image.png" style="max-height:720px;max-width:1280px;width:100%;height:100%;object-fit:cover;" width="1684" height="1198" loading="lazy" /></p> <p> </p> <p><img alt="file_detail_config" data-entity-type="file" data-entity-uuid="bcf826f8-e759-4306-960b-1ac0adaa1988" src="/sites/default/files/inline-images/file_detail_config.png" style="max-height:720px;max-width:1280px;width:100%;height:100%;object-fit:cover;" width="1684" height="1198" loading="lazy" /></p> <p> </p> <hr /><h2 id="sec15">外部インターフェース一覧</h2> <hr /><p>連携する外部システムの一覧になります。</p> <p>例えばGoogle Driveとの連携、クラウドサインといった外部サービスとの連携、自社の基幹システムとの連携等々、別のシステムとの連携を行う場合に記載します。</p> <p> </p> <p><img alt="ex_interface_list" data-entity-type="file" data-entity-uuid="ca8d751f-c897-4cf3-84e2-9149ef88d258" src="/sites/default/files/inline-images/ex_interface_list.png" style="max-height:720px;max-width:1280px;width:100%;height:100%;object-fit:cover;" width="1684" height="1198" loading="lazy" /></p> <p> </p> <hr /><h2 id="sec16">外部インターフェース仕様書</h2> <hr /><p>外部インターフェース一覧に記載した外部システムとの連携方法や連携するデータの項目レイアウトなどを定義します。</p> <p>バッチ処理で実装されることもあり、その場合はバッチ処理仕様書に詳細処理を記述し、連携するデータの項目レイアウトのみを外部インターフェース仕様書に記載します。</p> <p> </p> <p><img alt="ex_interface_detail_agenda" data-entity-type="file" data-entity-uuid="d63aaa9d-0181-4c90-93f6-b259d7581431" src="/sites/default/files/inline-images/ex_interface_detail_agenda.png" style="max-height:720px;max-width:1280px;width:100%;height:100%;object-fit:cover;" width="1684" height="1198" loading="lazy" /></p> <p> </p> <p><img alt="ex_interface_detail_image" data-entity-type="file" data-entity-uuid="98d1bbfb-e607-4557-a998-826668f7a4fa" src="/sites/default/files/inline-images/ex_interface_detail_image.png" style="max-height:720px;max-width:1280px;width:100%;height:100%;object-fit:cover;" width="1684" height="1198" loading="lazy" /></p> <p> </p> <p><img alt="ex_interface_detail_config" data-entity-type="file" data-entity-uuid="29ac1fa5-4203-4dad-9235-25a1de2894c0" src="/sites/default/files/inline-images/ex_interface_detail_config.png" style="max-height:720px;max-width:1280px;width:100%;height:100%;object-fit:cover;" width="1684" height="1198" loading="lazy" /></p> <p> </p> <p><img alt="ex_interface_detail_update_target" data-entity-type="file" data-entity-uuid="388d514f-8f0c-405e-82c5-ceb3ac4122f5" src="/sites/default/files/inline-images/ex_interface_detail_update_target.png" style="max-height:720px;max-width:1280px;width:100%;height:100%;object-fit:cover;" width="1684" height="1198" loading="lazy" /></p> <p> </p> <hr /><h2 id="sec17">バッチ処理一覧</h2> <hr /><p>システムで実行するバッチ処理の一覧になります。</p> <p>例えば日次でシステムから案内メールを送信したり、バックアップ処理を行ったり、比較的多量のデータを処理するプログラムをメインのシステムサービスとは別に独立実行するような処理の一覧です。</p> <p>処理に時間のかかるものが多いため、基本的にはユーザアクセスの少ない時間帯に実行することが多いです。</p> <p> </p> <p><img alt="batch_process_list" data-entity-type="file" data-entity-uuid="7b199d23-cba0-4fa6-b63d-7a9c5fa6390a" src="/sites/default/files/inline-images/batch_list.png" style="max-height:720px;max-width:1280px;width:100%;height:100%;object-fit:cover;" width="1684" height="1198" loading="lazy" /></p> <p> </p> <hr /><h2 id="sec18">バッチ処理仕様書</h2> <hr /><p>バッチ処理一覧に記載されたバッチ処理の詳細を記述します。</p> <p>日次なのか週次なのか月次なのかといった実行タイミングと、どのような処理を実行するのかを記述します。</p> <p> </p> <p><img alt="batch_process_agenda" data-entity-type="file" data-entity-uuid="d06375c3-64a5-4250-8d8a-31b3d53a5d69" src="/sites/default/files/inline-images/batch_process_agenda.png" style="max-height:720px;max-width:1280px;width:100%;height:100%;object-fit:cover;" width="1684" height="1198" loading="lazy" /></p> <p> </p> <p><img alt="batch_process_config" data-entity-type="file" data-entity-uuid="e3e3cf05-53d3-48d3-815c-e1293b051381" src="/sites/default/files/inline-images/batch_process_config.png" style="max-height:720px;max-width:1280px;width:100%;height:100%;object-fit:cover;" width="1684" height="1198" loading="lazy" /></p> <p> </p> <p><img alt="batch_process_update_target" data-entity-type="file" data-entity-uuid="a946b846-c013-4c5b-8081-bff41b3aac84" src="/sites/default/files/inline-images/batch_process_update_target.png" style="max-height:720px;max-width:1280px;width:100%;height:100%;object-fit:cover;" width="1684" height="1198" loading="lazy" /></p> <p> </p> <hr /><h2 id="sec19">システムメール一覧</h2> <hr /><p>システムから送信する通知メールの一覧になります。</p> <p>例えば「非標準ソフトウェアの利用申請承認依頼通知」など、システム上送信される通知にどのようなものがあるかを記載した一覧になります。</p> <p> </p> <p><img alt="mail_list" data-entity-type="file" data-entity-uuid="b4a94036-12d7-4928-842e-d00763b8973a" src="/sites/default/files/inline-images/mail_list.png" style="max-height:720px;max-width:1280px;width:100%;height:100%;object-fit:cover;" width="1684" height="1198" loading="lazy" /></p> <p> </p> <hr /><h2 id="sec20">システムメール定義書</h2> <hr /><p>システムメールの宛先、件名、本文について記述します。</p> <p>宛先はメールアドレス固定のケースよりも例えばログインユーザであったり、申請者や承認者といった何かしらの「ユーザ」を示す言葉で定義することが多いです。</p> <p>本文についても、固定の文章部分と差し替えて利用する部分がわかるように記述します。</p> <p> </p> <p><img alt="mail_detail_agenda" data-entity-type="file" data-entity-uuid="3b09b4fe-2d5e-4391-8133-2dbbe6611191" src="/sites/default/files/inline-images/mail_detail_agenda.png" style="max-height:720px;max-width:1280px;width:100%;height:100%;object-fit:cover;" width="1684" height="1198" loading="lazy" /></p> <p> </p> <p><img alt="mail_detail_header" data-entity-type="file" data-entity-uuid="e02a7535-2e51-471b-b01b-2cec3c30de1f" src="/sites/default/files/inline-images/mail_detail_header.png" style="max-height:720px;max-width:1280px;width:100%;height:100%;object-fit:cover;" width="1684" height="1198" loading="lazy" /></p> <p> </p> <p><img alt="mail_detail_body" data-entity-type="file" data-entity-uuid="da168ff1-e858-46a9-adfe-c60e8c2a8e86" src="/sites/default/files/inline-images/mail_detail_body.png" style="max-height:720px;max-width:1280px;width:100%;height:100%;object-fit:cover;" width="1684" height="1198" loading="lazy" /></p> <p> </p> <hr /><h2 id="sec21">DBテーブル一覧</h2> <hr /><p>データベース(DB)のテーブル名一覧です。</p> <p>社員情報テーブルや組織情報テーブル、それらを紐づける所属組織テーブルなどシステムに必要なデータを保存するテーブルを列挙します。</p> <p> </p> <p><img alt="table_list" data-entity-type="file" data-entity-uuid="78f886ff-7148-4d8c-9929-503d746d1f1d" src="/sites/default/files/inline-images/table_list.png" style="max-height:720px;max-width:1280px;width:100%;height:100%;object-fit:cover;" width="1684" height="1198" loading="lazy" /></p> <p> </p> <hr /><h2 id="sec22">DBテーブル定義書</h2> <hr /><p>DBテーブル一覧に記載したテーブルの項目レイアウトを定義します。</p> <p>レコードを一意に特定するためのキー項目は何か、項目のデータ型は数値なのか文字なのか日付なのかといった情報を記述します。</p> <p>このDBテーブル定義書をもとにCREATE TABLE文などを生成するため、重要な設計書の一つになります。</p> <p> </p> <p><img alt="table_detail_agenda" data-entity-type="file" data-entity-uuid="c00394f0-a478-4112-a350-6c805269fed7" src="/sites/default/files/inline-images/table_detail_agenda.png" style="max-height:720px;max-width:1280px;width:100%;height:100%;object-fit:cover;" width="1684" height="1198" loading="lazy" /></p> <p> </p> <p><img alt="table_detail_item_list" data-entity-type="file" data-entity-uuid="c20b9c46-ca5a-4520-8f3e-62262a969459" src="/sites/default/files/inline-images/table_detail_item_list.png" style="max-height:720px;max-width:1280px;width:100%;height:100%;object-fit:cover;" width="1684" height="1198" loading="lazy" /></p> <p> </p> <hr /><h2 id="sec23">DBビュー一覧</h2> <hr /><p>DBのビューの一覧です。</p> <p>ビューとは簡単に説明しますと、テーブルとテーブルを予め結合して、一つのテーブルのように見せるのがビューになります。</p> <p> </p> <p><img alt="view_list" data-entity-type="file" data-entity-uuid="27beb6a2-33d3-4e76-bc6b-48c95e686320" src="/sites/default/files/inline-images/view_list.png" style="max-height:720px;max-width:1280px;width:100%;height:100%;object-fit:cover;" width="1684" height="1198" loading="lazy" /></p> <p> </p> <hr /><h2 id="sec24">DBビュー定義書</h2> <hr /><p>DBビュー一覧に記述したビューの詳細を記述します。</p> <p>ビューを構成するテーブル名、それらの結合条件、および項目名を列挙します。</p> <p> </p> <p><img alt="view_detail_agenda" data-entity-type="file" data-entity-uuid="d191b83b-e44b-4055-bdd8-a1f8ace08311" src="/sites/default/files/inline-images/view_detail_agenda.png" style="max-height:720px;max-width:1280px;width:100%;height:100%;object-fit:cover;" width="1684" height="1198" loading="lazy" /></p> <p> </p> <p><img alt="view_detail_item_list" data-entity-type="file" data-entity-uuid="bff9bce5-93ba-4a64-8e19-27dfadabfbe1" src="/sites/default/files/inline-images/view_detail_item_list.png" style="max-height:720px;max-width:1280px;width:100%;height:100%;object-fit:cover;" width="1684" height="1198" loading="lazy" /></p> <p> </p> <hr /><h2 id="sec25">ER図</h2> <hr /><p>DBテーブルの関連図になります。</p> <p>例えば社員情報と組織の関連を表す場合、「社員」からみて所属する「組織」は複数あります。(例えばaさんがA部とB部を兼務するケース)</p> <p>「組織」からみて所属する「社員」も複数ですね。(例えば、A部にはaさん、bさん、cさんと複数の方がいます。B部にもaさん(兼務)、dさん、eさんと複数の方がいます。)</p> <p>上記のような関係を四角と線を用いてデータのつながりを表すのがER図です。</p> <p>データ1つに対して同じくデータが1つ紐づくのか1対1の関係、複数紐づく場合は1対多の関係になります。</p> <p>「多」を表す場合は、専用の記号あるいは「*」を利用します。</p> <p>例えば【社員】1-*【所属組織】*-1【組織】のようにオートシェイプなどで図を構築していきます。</p> <p>この図があるとテーブル間の関連が理解でき、データをどのように管理するかを把握することができるため、重要な設計書の一つになります。</p> <p>※ 個人的にはWordのオートシェイプではなく、VSCodeでdrawioをインストールし、記述したER図を画像取り込みして利用すると良いと思います。</p> <p><img alt="er_agenda" data-entity-type="file" data-entity-uuid="865081bf-b190-486b-a49a-532654baa255" src="/sites/default/files/inline-images/er_agenda.png" style="max-height:720px;max-width:1280px;width:100%;height:100%;object-fit:cover;" width="1684" height="1198" loading="lazy" /></p> <p> </p> <p><img alt="er_detail" data-entity-type="file" data-entity-uuid="18b241e2-897d-42d0-87dd-5108058b85ba" src="/sites/default/files/inline-images/er_detail.png" style="max-height:720px;max-width:1280px;width:100%;height:100%;object-fit:cover;" width="1684" height="1198" loading="lazy" /></p> <p> </p> <hr /><h2 id="sec26">コード一覧</h2> <hr /><p> </p> <p>システム全体で利用するフラグや区分の値を一覧化したものになります。</p> <p>例えば社員の分類として1:社員、2:契約社員、3:ビジネスパートナーのように区分を設けることがあります。</p> <p>これらの区分の値を一意に示すコード(1,2,3)とコードの名称(社員、契約社員、ビジネスパートナー)を記載します。</p> <p> </p> <p><img alt="code_list" data-entity-type="file" data-entity-uuid="652bc0be-b40f-4652-afa7-0ea503e00213" src="/sites/default/files/inline-images/code_list.png" style="max-height:720px;max-width:1280px;width:100%;height:100%;object-fit:cover;" width="1684" height="1198" loading="lazy" /></p> <p> </p> <hr /><h2 id="sec27">セキュリティ仕様書</h2> <hr /><p> </p> <p>システム全体のセキュリティ方針を記載します。</p> <p>XSS対応、パスワードソルト、社員情報の暗号化、社員情報一覧を表示するページのキャッシュ化無効等々どんな対策を実施するのかを記述します。</p> <p> </p> <p><img alt="security_agenda" data-entity-type="file" data-entity-uuid="7e60cf28-b44b-4c08-b26a-ed76086844ef" src="/sites/default/files/inline-images/security_agenda.png" style="max-height:720px;max-width:1280px;width:100%;height:100%;object-fit:cover;" width="1684" height="1198" loading="lazy" /></p> <p> </p> <p><img alt="security_detail" data-entity-type="file" data-entity-uuid="cdb647b1-a08e-4d77-a767-f7ccc1e64070" src="/sites/default/files/inline-images/security_detail.png" style="max-height:720px;max-width:1280px;width:100%;height:100%;object-fit:cover;" width="1684" height="1198" loading="lazy" /></p> <p> </p> <p><img alt="security_detail_auth" data-entity-type="file" data-entity-uuid="824f3265-defa-4874-9435-7e913b91143c" src="/sites/default/files/inline-images/security_detail_auth.png" style="max-height:720px;max-width:1280px;width:100%;height:100%;object-fit:cover;" width="1684" height="1198" loading="lazy" /></p> <p> </p> <hr /><h2 id="sec28">ワークフロー一覧</h2> <hr /><p> </p> <p>システムで利用するワークフローを一覧にまとめたものになります。</p> <p>社内IT機器の利用申請や研修申込申請などといった申請処理と承認処理を行う機能が必要な場合に記述します。</p> <p> </p> <p><img alt="wf_list" data-entity-type="file" data-entity-uuid="2ba00250-4d04-466f-ad52-3a4ba44c0888" src="/sites/default/files/inline-images/wf_list.png" style="max-height:720px;max-width:1280px;width:100%;height:100%;object-fit:cover;" width="1684" height="1198" loading="lazy" /></p> <p> </p> <hr /><h2 id="sec29">ワークフロー定義</h2> <hr /><p> </p> <p>ワークフロー一覧に記載したワークフローの詳細を記述します。ワークフロー機能が無ければ記述することはありません。</p> <p>例えば、PCの外部モニタを追加調達する際に、利用者がPCモニタの利用申請を行い、部門長が承認し、総務の機器調達チームのリーダーが承認するといった流れを定義します。</p> <p>誰が申請を行い、誰が承認するのか、申請する際、承認する際におけるシステムメールの有無、購入金額等によって承認者のルートが変わるのか否かなどを記述します。</p> <p> </p> <p><img alt="wf_detail_agenda" data-entity-type="file" data-entity-uuid="9fa92a28-9ce7-4ab7-905f-af029cd2c329" src="/sites/default/files/inline-images/wf_detail_agenda.png" style="max-height:720px;max-width:1280px;width:100%;height:100%;object-fit:cover;" width="1684" height="1198" loading="lazy" /></p> <p> </p> <p><img alt="wf_detail_flow" data-entity-type="file" data-entity-uuid="864ee074-78b0-4227-8ee3-07b7052f9dc2" src="/sites/default/files/inline-images/wf_detail_flow.png" style="max-height:720px;max-width:1280px;width:100%;height:100%;object-fit:cover;" width="1684" height="1198" loading="lazy" /></p> <p> </p> <p><img alt="wf_detail_flow_list" data-entity-type="file" data-entity-uuid="9c4b7b69-fe85-47f4-9932-ea468ceaa3ee" src="/sites/default/files/inline-images/wf_detail_flow_list.png" style="max-height:720px;max-width:1280px;width:100%;height:100%;object-fit:cover;" width="1684" height="1198" loading="lazy" /></p> <p> </p> <p><img alt="wf_detail_role" data-entity-type="file" data-entity-uuid="ac438b07-c3aa-438b-8b64-ab59fee805b4" src="/sites/default/files/inline-images/wf_detail_role.png" style="max-height:720px;max-width:1280px;width:100%;height:100%;object-fit:cover;" width="1684" height="1198" loading="lazy" /></p> <p> </p> <hr /><h2 id="sec30">アプリケーション仕様</h2> <hr /><p> </p> <p>アプリケーション仕様はシステムを構築する上での基本ルールを定義したものになります。</p> <p>例えば以下のような事柄を記述します。</p> <p> </p> <ul><li>システム構成(webサーバ、DBサーバ、帳票サーバ等々の構成)</li> <li>ファイル配置方式(ソースファイルのフォルダ階層など)</li> <li>開発モデル(プログラミング言語やフレームワークなど)</li> <li>処理フロー方式(画面とサーバ間の処理の流れ)</li> <li>メッセージ方式(多言語対応の有無、メッセージの表示方法)</li> <li>文字コード</li> <li>ログ出力方式</li> <li>例外処理方式</li> <li>入力チェック方式</li> <li>制御方式</li> <li>認証方式</li> <li>認可方式</li> <li>セッション管理</li> <li>DBアクセス方式</li> <li>採番方式</li> <li>排他制御方式</li> <li>ファイルアップロード、ダウンロード方式</li> <li>メール送信方式</li> </ul><p> </p> <p>フレームワークを採用する場合は基本的にはフレームワークの仕様にあわせた動きとなりますので、利用するフレームワークにおける特徴や注意事項を中心に記載します。</p> <p> </p> <p><img alt="application_detail_agenda" data-entity-type="file" data-entity-uuid="4c96cfa0-7752-4701-9424-57fc6c244648" src="/sites/default/files/inline-images/application_detail_agenda.png" style="max-height:720px;max-width:1280px;width:100%;height:100%;object-fit:cover;" width="1684" height="1198" loading="lazy" /></p> <p> </p> <p><img alt="application_detail_system" data-entity-type="file" data-entity-uuid="a17dff21-6f23-4556-8d56-ec9249d9fbd1" src="/sites/default/files/inline-images/application_detail_system.png" style="max-height:720px;max-width:1280px;width:100%;height:100%;object-fit:cover;" width="1684" height="1198" loading="lazy" /></p> <p> </p> <p><img alt="application_detail_directory" data-entity-type="file" data-entity-uuid="9ce04cda-f1cd-44a1-a468-b78c46c837ec" src="/sites/default/files/inline-images/application_detail_directory.png" style="max-height:720px;max-width:1280px;width:100%;height:100%;object-fit:cover;" width="1684" height="1198" loading="lazy" /></p> <p> </p> <p><img alt="application_detail_archi" data-entity-type="file" data-entity-uuid="f6cc3872-f6d8-48e4-9c7c-cf8f30306a68" src="/sites/default/files/inline-images/application_detail_archi.png" style="max-height:720px;max-width:1280px;width:100%;height:100%;object-fit:cover;" width="1684" height="1198" loading="lazy" /></p> <p> </p> <p><img alt="application_detail_role_list" data-entity-type="file" data-entity-uuid="4d11b98c-f9c6-4c02-a09b-b5cbd66f10b0" src="/sites/default/files/inline-images/application_detail_role_list.png" style="max-height:720px;max-width:1280px;width:100%;height:100%;object-fit:cover;" width="1684" height="1198" loading="lazy" /></p> <p> </p> <hr /><h2 id="sec31">基本設計書のテンプレートサンプルについて</h2> <hr /><p> </p> <p>簡単ですが基本設計書の構成につきましては上述にて説明いたしました。</p> <p>設計書のテンプレートにつきましては、以下noteにて公開中ですので是非参考にされてください。</p> <p>上記で紹介させて頂いた設計書28ファイルすべてダウンロード可能にしております。</p> <p><a href="https://note.com/optimal_sdw_com/n/ndfa3af81043f" rel="nofollow noreferrer noopenner" target="_blank">テンプレートファイルを取得するにはこちら</a></p> <p> </p> <p>以上です。</p> </div> <div class="field field--name-field-blog-category field--type-entity-reference field--label-above"> <div class="field--label">カテゴリ</div> <div class="field--items"> <div class="field--item"><a href="/blog/code" hreflang="ja">Code</a></div> <div class="field--item"><a href="/blog/code-projectmanagement" hreflang="ja">ProjectManagement</a></div> </div> </div> <div class="field field--name-field-tags field--type-entity-reference field--label-hidden field--items"> <div class="field--item"><a href="/blog" hreflang="ja">Blog</a></div> </div> <div class="views-element-container form-group"><div class="view view-eva view-relation-article-list view-id-relation_article_list view-display-id-entity_view_1 js-view-dom-id-a4b889370a953285b68fafb01e68c7d75092856d4c69ee92d4df66b39e398eeb"> <header> <h4>あわせて読みたい記事はこちら</h4> </header> <div id="views-bootstrap-relation-article-list-entity-view-1--3" class="grid views-view-grid"> <div class="row"> <div class="col-auto col-sm-auto col-md-6 col-lg-6 col-xl-6"> <div class="views-field views-field-title"><span class="field-content"><a href="/blog/code-projectmanagement/article_99" hreflang="ja">システム開発プロジェクトの工程について(ウォータフォール基準)</a></span></div><div class="views-field views-field-field-kanban"><div class="field-content"><p><a href="https://optimal-sdw.com/blog/code-projectmanagement/article_99"><img alt="article_99_eye_catch" data-entity-type="file" data-entity-uuid="2a7d7cdc-a21a-4495-a4ec-5af60e9b35b5" src="/sites/default/files/inline-images/article_99.jpg" style="max-height:720px;max-width:1280px;width:100%;height:100%;object-fit:cover;" width="1893" height="683" loading="lazy" /></a></p> <p> </p> </div></div> </div> </div> </div> </div> </div> Sat, 15 May 2021 22:49:48 +0000 @optimal-sdw.com 100 at http://optimal-sdw.com システム開発プロジェクトの工程について(ウォータフォール基準) http://optimal-sdw.com/blog/code-projectmanagement/article_99 <span>システム開発プロジェクトの工程について(ウォータフォール基準)</span> <span><span lang="" about="/banana_people/1" typeof="schema:Person" property="schema:name" datatype="">@optimal-sdw.com</span></span> <span>2020/09/22(火) - 07:46</span> <div class="field field--name-field-last-update field--type-datetime field--label-above"> <div class="field--label">更新日時</div> <div class="field--item"><time datetime="2020-09-21T22:46:14Z">2020/09/22(火) - 07:46</time> </div> </div> <div class="field field--name-field-kanban field--type-text-long field--label-hidden field--item"><p><a href="https://optimal-sdw.com/blog/code-projectmanagement/article_99"><img alt="article_99_eye_catch" data-entity-type="file" data-entity-uuid="2a7d7cdc-a21a-4495-a4ec-5af60e9b35b5" src="/sites/default/files/inline-images/article_99.jpg" style="max-height:720px;max-width:1280px;width:100%;height:100%;object-fit:cover;" width="1893" height="683" loading="lazy" /></a></p> <p> </p> </div> <div class="field field--name-body field--type-text-with-summary field--label-hidden field--item"><p>こんにちは。フリーエンジニアの山口です。</p> <p>前回の記事ではエンジニアとはこういうものだ、エンジニアになるためにはたくさんの勉強が必要、平均年収は。。。と長々と語りました。</p> <p>今回の記事ではエンジニアがシステム開発する際に行う一連の作業の流れを理解することで開発プロジェクトの全貌についてイメージを掴んで頂けたらいいなと思い、システム開発プロジェクトの工程についてご紹介したいと思います。</p> <p>主にシステム会社に入社したばかりの方、フリーランスのコーダーの方、これからエンジニアを目指そうと考えている方など、システム開発プロジェクトの参画経験が無い、あるいは一部の工程しか参画したことの無い方向けの記事になります。</p> <p>システム開発プロジェクトにはどのような工程があって、各工程で何をするのか、受託開発におけるプロジェクトの工程を例としてご紹介します。</p> <p>開発手法は日本で昔からよく利用されているウォーターフォール開発における工程になります。</p> <p>ウォーターフォール開発とはまさに滝のように1本の流れに沿って開発を進める手法で、各工程が完了したら後戻りしないのが基本です。要件を細かくドキュメントに定義し、システム設計も同じようにドキュメントにまとめ、それから開発を行う手法になります。そのため、動くシステムを見ることができるのはプロジェクトの終盤になります。</p> <p>ウォーターフォール開発のほかにアジャイル開発といって、大まかな要件を定義したあとに実際にプロトタイプシステムを開発し、プロタイプシステムに触れながら要件とのギャップを洗い出し、機能追加・修正・レビューを繰り返す手法もあります。</p> <p>ウォーターフォール開発と違い、早い段階でシステムに触れることができるため、要件のギャップを小さくできることが特徴です。</p> <p>アジャイル開発においてもウォーターフォール開発における要件定義から開発、テスト工程は存在しており、それらを短期間で繰り返しています。</p> <p>そのため、まずはウォーターフォール開発の工程でどのようなことを行うのかを学ぶとほとんどのシステム開発プロジェクトで応用することができます。※ ただし、アジャイル開発ではプロトタイプの開発に注力するため、詳細なドキュメント作成は行わないことがほとんどです。</p> <p>前置きが長くなりましたが、以下システム開発プロジェクトについてご紹介して参ります。</p> <p> </p> <hr /><h2 id="sec01">システム開発プロジェクトの流れについて</h2> <hr /><p>受託システム開発のプロジェクトは大まかに以下の流れに沿って始まります。</p> <p><b>提案 → プロジェクトの準備 → キックオフ</b></p> <p><b>要件定義 → 基本設計 → 詳細設計 → 開発 → テスト → マニュアル作成 → 受入・教育・リリース判定 → リリース</b></p> <p><b>運用保守</b></p> <p>いったんシステムをリリースするところでプロジェクトは終了を迎えます。</p> <p>あとは運用保守を別のプロジェクトチームあるいは別の会社が引き継ぐケースが多いです。</p> <p>ざっと上記がプロジェクトの流れになります。</p> <p>しかしながら、上記だけではいくつかの工程があることがわかっても、それぞれ何をやっているのかわからないですよね。</p> <p>順番にプロジェクトの各工程について詳細をみていきたいと思います。</p> <p> </p> <hr /><h2 id="sec02">システム開発プロジェクトの工程:提案</h2> <hr /><p>営業部が顧客と商談し、提案の機会を得ます。あるいは既存の顧客よりRFP(提案依頼書)を受けて提案を行います。</p> <p>提案依頼書にはどのような業務に関するシステムを構築したいのか、ざっくりとした機能リスト、システム構築に使うサーバー環境や開発言語、利用するユーザのPCスペックやOSの種類、ブラウザの種類などが書かれています。</p> <p>指定された技術で提案するのか、技術選定も含めて提案するのかはRFPに書かれた内容によって異なります。</p> <p>※ 自社サービス開発の場合は顧客への提案ではなく、社内提案になりますので企画からスタートになります。社内独自のルールはあると思いますが、システム開発における基本的な工程にさほど違いはないと思います。</p> <p> </p> <hr /><h2 id="sec03">システム開発プロジェクトの工程:プロジェクトメンバーのアサイン</h2> <hr /><p>提案が通った場合、プロジェクトのマネージャーがアサインされ、プロジェクトマネージャーと部門長の采配でプロジェクトリーダーおよびメンバーのアサインを行います。アサインとは社員の中からプロジェクトメンバーの採用を行うことを指します。</p> <p>小規模の企業においてはプロジェクトマネージャーが部門長を兼務しており、プロジェクトリーダーの選出とプロジェクトメンバーの選出を行います。</p> <p> </p> <hr /><h2 id="sec04">システム開発プロジェクトの工程:プロジェクトの準備</h2> <hr /><p>プロジェクトマネージャーはプロジェクトの準備を行います。プロジェクトの各工程で行う作業を洗い出し、大まかなスケジュールをたて、プロジェクト計画書を作成します。</p> <p>なお、この準備段階で起こりうるリスクを想定し、その対処方法をまとめておきます。また、WBS、議事録、QA管理、借用物管理、設計書のフォーマット、設計書の記述レベルをあわせるための規約づくりなどを行います。</p> <p>計画書には以下のような内容を記載します。</p> <ul><li><strong>プロジェクトの背景と目的</strong></li> <li><strong>プロジェクト範囲</strong></li> <li><strong>プロジェクト制約事項</strong></li> <li><strong>プロジェクト全体作業の流れ</strong></li> <li><strong>プロジェクトにおける成果物一覧</strong></li> <li><strong>プロジェクト標準(ドキュメントフォーマット、表記ルールなど)</strong></li> <li><strong>プロジェクトの進め方</strong></li> <li><strong>プロジェクトスケジュール(全体と直近作業の中日程)</strong></li> <li><strong>プロジェクトに必要な資源(開発PC、各種ツール、ソフトウェアライセンスなど)</strong></li> <li><strong>プロジェクト体制</strong></li> <li><strong>プロジェクト予算</strong></li> <li><strong>プロジェクトで想定されるリスクと対処法</strong></li> <li><strong>品質目標</strong></li> <li><strong>プロジェクトチーム目標</strong></li> </ul><p>計画書を作成した後は、プロジェクトメンバーの招集と情報共有を行います。</p> <p>※ 基本的にプロジェクト計画書はプロジェクトメンバーと一緒に作るものではなく、プロジェクトマネージャーが事前に準備するものになります。</p> <p>プロジェクトマネージャーはプロジェクトのメンバーと顔合わせを行います。同じ会社の社員同士でも一緒に仕事をするのは初めてということもありますので、自己紹介を含めプロジェクトの内容を確認します。</p> <p>ここでプロジェクトメンバーに大まかな全体スケジュールとドキュメント作成時の注意事項などを共有しておくことが非常に大切です。</p> <p>この工程がただの自己紹介で終わってしまうと、ドキュメント作成時に表記揺れの修正や異なるフォーマットで作られたドキュメントの修正作業など、無駄な作業が発生してしまう可能性が高くなります。</p> <p> </p> <hr /><h2 id="sec05">システム開発プロジェクトの工程:プロジェクトのキックオフミーティング</h2> <hr /><p>プロジェクトメンバー内での情報共有とは別にお客様とキックオフミーティングと呼ばれる打合せを行います。</p> <p>お客様側にも当然ながらプロジェクトメンバーが構成されており、お客様側のプロジェクト責任者、プロジェクトメンバーとの顔合わせを行います。</p> <p>当該ミーティングの目的は双方の認識合わせが主目的になります。</p> <p>プロジェクトの背景や目的、各メンバーの役割の確認、今後の打合せ方法や予定の確認、プロジェクト内で利用する共通ルール(※)の確認等を行います。</p> <p>※ 借用物の管理方法、メール送信時におけるルール(件名や添付資料のパスワードルール)、QA管理の方法、連絡先窓口など</p> <p>以下、当該ミーティング向け資料のサンプル抜粋になります。</p> <p> </p> <p><img alt="article_99_kickoff_agenda" data-entity-type="file" data-entity-uuid="c7bbb490-b46c-4ed7-a323-a3fd24c701af" src="/sites/default/files/inline-images/kickoff_agenda.png" style="max-width:640px;width:100%;height:100%;object-fit:cover;" width="2812" height="1580" loading="lazy" /></p> <p> </p> <p><img alt="article_99_kickoff_backborn" data-entity-type="file" data-entity-uuid="cbaddd3e-72a1-4e7a-afa8-b6c2db38917f" src="/sites/default/files/inline-images/kickoff_backborn.png" style="max-width:640px;width:100%;height:100%;object-fit:cover;" width="2815" height="1582" loading="lazy" /></p> <p> </p> <p><img alt="article_99_kickoff_target" data-entity-type="file" data-entity-uuid="62d48424-e32e-4d78-bf0c-3e471604b443" src="/sites/default/files/inline-images/kickoff_target.png" style="max-width:640px;width:100%;height:100%;object-fit:cover;" width="2812" height="1580" loading="lazy" /></p> <p> </p> <p><img alt="article_99_kickoff_system" data-entity-type="file" data-entity-uuid="09d215ab-a045-4982-a1de-04bb35089abc" src="/sites/default/files/inline-images/kickoff_system.png" style="max-width:640px;width:100%;height:100%;object-fit:cover;" width="2810" height="1586" loading="lazy" /></p> <p> </p> <p><img alt="article_99_kickoff_schedule" data-entity-type="file" data-entity-uuid="b221e2ee-c1e9-4e8d-9ec8-f66292f566c0" src="/sites/default/files/inline-images/kickoff_schedule.png" style="max-width:640px;width:100%;height:100%;object-fit:cover;" width="2809" height="1588" loading="lazy" /></p> <p>上記のような資料を用意してお客様とプロジェクトについて確認します。</p> <p>会社員エンジニアの方々は上記のような資料を作成する機会がそれなりに多いと思いますが、フリーランスのエンジニアになりますと、自身で直接受託開発を行っていない限り、あまり作成する機会はないかもしれません。</p> <p>しかしながら、システム構築の目的や背景、プロジェクトが目指すゴール、そしてシステム化対象範囲にスケジュール、コミュニケーション手段(会議体)などはランサーズのようなサイトで仕事を請負う際にも必要なことで、参考になるかと思います。</p> <p>PowerPointの資料では無くても、最低限箇条書きのテキスト資料で上記の目次内容を確認できるような資料を用意しておくと、どのようなプロジェクトにも役立つと思います。</p> <p> </p> <hr /><h2 id="sec06">システム開発プロジェクトの工程:要件定義</h2> <hr /><p>要件定義フェーズでは、お客様の現行業務の流れを確認し、これから開発するシステムを使ってどのような業務の流れにしたいのか、どのような課題解決を行っていきたいのかを整理する工程になります。</p> <p>提案の際に大まかな要望は頂いた上で提案を行うのですが、それだけでは具体的なシステム設計に落とすことができません。</p> <p>また、<b>当該フェーズはお客様が主体のフェーズになります。</b></p> <p>当該フェーズではお客様の要件を資料にまとめる作業をサポートするのがシステム開発側の役割になります。</p> <p>お客様が主体であることはキックオフミーティングで役割分担を説明する際にしっかり伝えましょう。</p> <p>あまり理解されていないお客様が多いのですが、お客様の業務の流れ、重要なポイントはお客様にしかわからないところですので、改善点を見出すにしてもお客様が主体にならないと、我々エンジニアがサポートできることは非常に限られてしまいます。</p> <p>業務の中でお客様が課題と感じていない課題を発見するのもこのフェーズになります。</p> <p>技術的なこと、プロジェクトの予算を視野に入れ、システムが壮大なものにならないように要件を整理します。</p> <p>当該フェーズにおける成果物は「要件定義書」になります。</p> <p>要件定義書には新しいシステムでの業務の流れや登場人物について記載します。何の業務で誰がどのような権限を行使して対象の処理を実施するのか、それらをまとめます。</p> <p>記載項目としては以下の通りです。</p> <ul><li><strong>システム名の定義</strong></li> <li><strong>システム化の目的</strong></li> <li><strong>システム化の範囲</strong></li> <li><strong>新業務に登場する人物と組織</strong></li> <li><strong>新業務フロー</strong></li> <li><strong>ビジネスルール</strong></li> <li><strong>業務用語辞書</strong></li> <li><strong>システム環境構成</strong></li> <li><strong>処理機能一覧</strong></li> <li><strong>画面一覧</strong></li> <li><strong>画面遷移図</strong></li> <li><strong>画面レイアウト</strong></li> <li><strong>帳票一覧</strong></li> <li><strong>帳票レイアウト</strong></li> <li><strong>システムメール一覧</strong></li> <li><strong>システムメール送信先定義</strong></li> <li><strong>外部システム関連図</strong></li> <li><strong>外部システムインターフェース一覧</strong></li> <li><strong>外部システムインターフェース定義</strong></li> <li><strong>エンティティ一覧</strong></li> <li><strong>エンティティ定義</strong></li> <li><strong>システムコード一覧</strong></li> <li><strong>品質要件</strong></li> <li><strong>セキュリティ要件</strong></li> <li><strong>運用・障害対策要件</strong></li> <li><strong>業務要件一覧</strong></li> <li><strong>業務運用要件</strong></li> <li><strong>データ移行要件</strong></li> </ul><p>以下は縦に業務のフローを記載した例になります。</p> <p> </p> <p><img alt="article_99_business_flow" data-entity-type="file" data-entity-uuid="a9d5fdff-a9bf-40ae-96fd-53068a65db74" src="/sites/default/files/inline-images/business_flow.png" style="max-width:640px;width:100%;height:100%;object-fit:cover;" width="2426" height="1480" loading="lazy" /></p> <p> </p> <p>登場人物や組織を縦軸にとって、横方向にフローを記述することもあります。業務フローの記述フォーマットは会社やプロジェクト毎に異なることが多いのですが、一度フォーマットを作っておくと流用することができ、作業も楽になります。</p> <p>また、このようなフロー図を記載することが多く、罫線を多用することからドキュメントはExcelファイルを使うことが多いです。最近ではGoogleスプレッドシートに記載するプロジェクトもあります。</p> <p>要件定義フェーズの段階でエンティティやある程度画面のイメージを定義できると、基本設計フェーズではそれらをベースに練り上げていくだけになりますので、要件定義フェーズは非常に重要なフェーズになります。</p> <p>アジャイル開発においてはドキュメントに細かく定義はしないものの、業務要件をしっかり押さえ、開発を行っていきます。</p> <p>「要件定義書」をベースに次フェーズ以降の設計書を作成していきます。</p> <p> </p> <hr /><h2 id="sec07">システム開発プロジェクトの工程:基本設計</h2> <hr /><p>基本設計フェーズでは、要件定義フェーズで作成した要件定義書をもとに実際にシステムの設計を行うフェーズになります。</p> <p>当該フェーズの成果物は「基本設計書」になります。主役は我々エンジニアです。</p> <p>基本設計書の役割は我々エンジニアがシステム開発する際にも利用しますが、どちらかというとお客様とシステム仕様を確認することを主目的としたドキュメントになります。</p> <p>各種画面のレイアウト、必要な項目、画面で発生するイベント(データの保存や入力補助ツールの呼び出しなど)、データの保存先などを定義します。</p> <p>お客様は業務に必要な画面が足りているか、入力項目や表示項目、表示名称に問題ないかチェックします。</p> <p>基本設計書に仕様をまとめて認識合わせを行うことで、後々仕様漏れなのかシステムのバグなのかの判定に役立てることができます。</p> <p>アジャイル開発ではこれらの認識合わせをプロトタイプシステムを使ったデモンストレーションで行います。</p> <p>要件定義書に記載した画面一覧や画面レイアウト、帳票一覧、帳票レイアウト、エンティティ定義などをベースに練り上げていきます。</p> <p>※ エンティティ定義とは例えば会社組織、社員、社員の所属、商品、商品の発注情報、請求情報等々、システムで利用する「情報やモノ」を定義したもので、DBにおけるテーブル設計に利用します。</p> <p>例えば画面レイアウトや画面項目定義は以下のような形で定義します。</p> <p> </p> <p><img alt="article_99_screen_layout" data-entity-type="file" data-entity-uuid="8b14ed12-679b-48fd-9dea-8cedafd58951" src="/sites/default/files/inline-images/screen_layout_0.png" style="max-width:640px;width:100%;height:100%;object-fit:cover;" width="783" height="441" loading="lazy" /></p> <p> </p> <p><img alt="article_99_screen_item" data-entity-type="file" data-entity-uuid="39a45878-05e1-428f-a6dd-312214212c34" src="/sites/default/files/inline-images/screen_item.png" style="max-width:640px;width:100%;height:100%;object-fit:cover;" width="3669" height="1473" loading="lazy" /></p> <p> </p> <hr /><h2 id="sec08">システム開発プロジェクトの工程:詳細設計</h2> <hr /><p>詳細設計フェーズでは基本設計フェーズで作成した基本設計書をもとにコーディングできるレベルの処理手順を設計するフェーズになります。もちろん主役は我々エンジニアです。</p> <p>当該フェーズの成果物は「詳細設計書」になります。</p> <p>DBのテーブルに至ってはDDLといってSQLのCREATE TABLE文を用意したり、画面から入力されたデータに対し、どのタイミングで入力チェックを行うか、どのように加工してどのテーブルへ保存するか、など詳細を記載します。</p> <p>基本設計書に対し、実装方法を肉付けしたようなドキュメントになりますので、お客様はあまり意識して参照することの無いドキュメントになります。</p> <p>詳細設計書を書くことでプロジェクトマネージャーはソースレビューとは別に実装方針の時点で誤りを発見したり、品質管理をすることができます。</p> <p>また、詳細設計書をベースに単体テストを実施することで将来バグが見つかった時に初期開発の瑕疵なのか、運用保守作業を起因としたバグなのか切り分けに利用されます。</p> <p> </p> <hr /><h2 id="sec09">システム開発プロジェクトの工程:開発(製造)</h2> <hr /><p>いよいよ開発フェーズです。当該フェーズの成果物は言わずもがなですね。</p> <p>はい、ソースコードです。プログラミングを行って実際にシステムを構築するフェーズです。</p> <p>製造という表現をされることもあるのですが、一般的な製造業とソフトウェアの開発は微妙に違うので私個人の感覚では製造といわれると若干の違和感なり抵抗感なりを感じてしまいます。</p> <p>それはさておき、開発フェーズはプロジェクトマネージャーによっては単体テストフェーズまでを含めて開発フェーズと呼ぶことがあります。</p> <p>私もそちらのほうが多い印象です。実際にすべてコーディングし終えてから単体テストフェーズへ進むよりも、画面を作成してテスト、データ取得ロジックを作ってテストなど、プログラミングとテストを繰り返すことが多いからです。</p> <p>ただ、スケジュールをたてる場合には開発とテストを明確にわけています。</p> <p> </p> <hr /><h2 id="sec10">システム開発プロジェクトの工程:単体テスト</h2> <hr /><p>開発フェーズでプログラミングを行った後は作った機能のテストを行います。</p> <p>当該フェーズでは「単体テスト仕様書」にテストケースを作成します。</p> <p>単体テストの「単体」とは一つひとつの機能を指しています。</p> <p>従って、単体テストとは一つひとつの機能が正しく動作するかを試すことを目的としており、それぞれの機能間の連携が正しく動作するかについては基本的にテストしません。</p> <p>例えばデータ保存処理が正しく動作することをテストしたり、データ取得処理が正しく動作することをテストします。</p> <p>データを取得処理で取得したデータをデータ保存処理に渡してデータ保存できることまでは確認しません。</p> <p>機能間の連携が正しく動作するかについては次フェーズの内部結合テストで行います。</p> <p>ただし、画面入力のテストについては画面とデータ保存等を行うサーバーサイドのプログラムの両方をそろえてテストすることが多く、単体テストであっても内部結合テストと同じようにテストすることがあります。</p> <p>また、昨今のシステム開発においては、プログラムによるテストの自動化が進んでおり、例えばJava言語における開発においてはJUnitといったテストツールを使い、テストプログラムからテスト対象の機能を呼び出し、正しい結果を得られることを確認します。</p> <p>テスト駆動型開発という手法で開発する場合には先にテストプログラムを作り、テストが通るようにメイン処理を作成していくので、開発フェーズと単体テストフェーズが同時進行になります。</p> <p>テストの結果はスクリーンショットで取得して、エビデンス(証跡)として残します。</p> <p>テストで発見されたバグについては修正を行い、再度テストを行います。</p> <p>テスト回数と発見されたバグの数は集計し、品質管理の指標として利用します。</p> <p>お客様にもどれだけのテストケース、どれだけのテスト数を行っていくつのバグを消化したのか共有します。</p> <p>バグが無いことに越したことはないのですが、<b>バグが全く無い場合はテストケース自体の品質が悪い、テストケースに漏れがある</b>ことを疑います。</p> <p>基本的に一定規模のシステムにおいては一定数のバグが含まれているのが通常で、<b>バグが見つかることは悪いことではありません。</b></p> <p>このフェーズでバグをしっかり見つけておかないと、後の工程でどつぼにハマります。</p> <p> </p> <hr /><h2 id="sec11">システム開発プロジェクトの工程:内部結合テスト</h2> <hr /><p>内部結合テストフェーズは開発した機能間のデータ連携をテストするフェーズになります。</p> <p>内部結合テストにおける成果物は「内部結合テスト仕様書」になります。</p> <p>結合テスト仕様書には一覧画面に登録データが表示できること、登録データを検索表示することができること、登録データの詳細表示画面へ遷移できることなど、各画面から必要な処理を呼び出して期待通りの結果となることをテストするためのテストケースを記載します。</p> <p>単体テストと同じくエビデンス(証跡)をスクリーンショットで取得します。</p> <p>ただし、操作前後の動きがわかるように取得する必要があるため、操作途中の動きからすべてスクリーンショットで取得します。</p> <p>基本は1アクション1スクリーンショットになりますが、エビデンス取得作業の負荷軽減のため操作を録画する手法もあります。</p> <p>また、開始時のデータベースの状態、データを保存したときの状態もエビデンスとして残します。</p> <p>そのため、画面上の表示結果だけではなく、DBのテーブルの状態もエビデンスとして取得する必要がありますので、この証跡集めは思っている以上に大変な作業になります。</p> <p> </p> <hr /><h2 id="sec12">システム開発プロジェクトの工程:外部結合テスト</h2> <hr /><p>外部結合テストフェーズは外部のシステムとの連携テストになります。</p> <p>例えば、メインのシステムとは別のサーバーにからシステムメールを送信したい場合は外部システムにメール送信リクエストを行います。</p> <p>メインシステムだけではなく、外部システムへのリクエストが正しく動作するかをテストする必要があり、このようなテストを外部結合テストと呼んでいます。</p> <p>メール送信の他、会社の基幹システムから社員や組織のマスタデータを連携してもらうといった場合も、データ受信が正しくできることを確認します。</p> <p>その他、GoogleDriveAPIを利用してファイル保存を行う場合、クラウドサインAPIを利用してクラウドサイン上で契約書の確認を行う場合など、外部システムを利用した機能はすべて外部結合テストフェーズで確認を行います。</p> <p>外部結合テストフェーズにおける成果物は「外部結合テスト仕様書」になります。</p> <p>内部結合仕様書と同じくテストケースを記載し、エビデンス(証跡)を取得します。</p> <p> </p> <hr /><h2 id="sec13">システム開発プロジェクトの工程:システムテスト</h2> <hr /><p>システムテストフェーズは実際にお客様の業務にあわせたシナリオでテストするフェーズになります。</p> <p>例えば、業務システムではバッチ処理といって日次、月次で特定の処理プログラムが自動的に実行されていたり、時には数分置きに動いている場合があります。</p> <p>これらの定期処理を動かしながら、システムの本番利用を開始したかのようにテストするのがシステムテストになります。</p> <p>実際の業務を行うようにテストを行うのが目的ですので、たくさんのケースを1日で消化するようなフェーズではなく、日数をかけてテストします。</p> <p>これにより、バッチ処理が特定時間のみ正しく動作しない、業務上発生するレアケースに対応していないといったことに気付くことがあります。</p> <p>システムテストフェーズにおける成果物は「システムテスト仕様書」になります。</p> <p>内部結合テストや外部結合テストに近いテストケースになります。</p> <p> </p> <hr /><h2 id="sec14">システム開発プロジェクトの工程:操作マニュアル作成</h2> <hr /><p>外部結合テストフェーズの終わり頃からシステムの操作マニュアルを作成します。そのため各フェーズと異なり、並行して作業するフェーズになります。</p> <p>当該フェーズでの成果物は「操作マニュアル」です。</p> <p>マニュアルには二種類あり、操作マニュアルと業務マニュアルがあります。</p> <p>エンジニアが作成するのは「操作」マニュアルです。</p> <p>システムの基本的な操作方法をマニュアルにまとめます。これをもとに業務マニュアルの作成やユーザ教育をお客様が行います。</p> <p>操作マニュアルは画面の共通部、例えばメインメニュー等の説明から始まり、各画面におけるリンクやボタンからどのような画面に遷移するのか、どのようなアクションが起きるのか、システム機能の操作方法を記述します。</p> <p>操作マニュアルでは○○業務を行うため〇〇メニューをクリックして、XX画面を開き、△△ボタンをクリックして・・・というような業務を行うための説明は記述しません。</p> <p>以下は非常に簡易的な操作マニュアルのサンプルになります。</p> <p>画面内の説明ポイントに番号を振り、番号に対応した説明を一覧表で記述します。</p> <p> </p> <p><img alt="article_99_manual_sample" data-entity-type="file" data-entity-uuid="e799c1e7-b94d-4b82-9670-016a1d76dabb" src="/sites/default/files/inline-images/manual_sample.png" style="max-width:640px;width:100%;height:100%;object-fit:cover;" width="1975" height="1865" loading="lazy" /></p> <p> </p> <hr /><h2 id="sec15">システム開発プロジェクトの工程:受入テスト、業務マニュアル作成、ユーザ教育、リリース判定</h2> <hr /><p>受入テスト、業務マニュアル作成、ユーザ教育、リリース判定はお客様が主体となって行う作業になります。</p> <p>受入テスト、業務マニュアルの作成はシステムテストフェーズの完了後に行います。</p> <p>プロジェクト期間の短縮のためにシステムテストフェーズと受入テストを並行して行うケースもあります。</p> <p>受入テストとは開発したシステムがお客様の業務要件を満たしているかどうか確認するテストになります。</p> <p>受入テストでは実際にお客様がシステムに触れるため、想定していた機能とのギャップにより変更要望が生じる可能性があります。</p> <p>当該フェーズにおけるエンジニアの役割としては受入テストのサポートとそれらの変更要望対応になります。</p> <p>お客様は受入テストと並行して業務マニュアルの作成を行います。</p> <p>また、業務マニュアルを利用して実際にシステムを利用するユーザに新業務の流れをレクチャーします。</p> <p> </p> <hr /><h2 id="sec16">システム開発プロジェクトの工程:データ移行とリリース準備</h2> <hr /><p>本番利用開始に向けて各種マスタデータの準備、今までの業務で蓄積してきたデータを新システムに移行するフェーズになります。</p> <p>お客様の受入テストと並行して作業することが多く、移行データの一部を受入テストおよびユーザ教育用データとして利用することがあります。</p> <p>受入テストおよびユーザ教育終了後、一度データをすべて消去して、再度移行データを取り込み、本番利用の準備をします。</p> <p>データ移行のためのツールはエンジニアが用意します。移行対象データはお客様側で用意します。</p> <p>CSVファイルやExcelファイルなど、何かしらフォーマットを定めて移行ツールを用意します。</p> <p> </p> <hr /><h2 id="sec17">まとめ</h2> <hr /><p>ざっとシステム開発プロジェクトの工程を紹介いたしましたがいかがでしょうか。</p> <p>個々のドキュメントの詳細まで説明を行うと1冊2冊の本が書けるぐらいのボリュームになってしまいますので、本当にざっくりと全体を紹介させて頂きました。</p> <p>システム開発プロジェクト全体を通してみると、プログラミングを行うフェーズは全体の一部で、それ以外の作業が多いことがわかるかと思います。</p> <p>なお、アジャイル開発ではイテレーションといって開発とレビューを繰り返しながらブラッシュアップしていきますので、ウォーターフォールに比べプログラミングを行う時間が多いと思います。</p> <p>開発手法によって多少の違いはありつつも、ウォーターフォール開発の各フェーズは基本的なシステム開発の工程になりますので、これらのフェーズを理解しておくとその他の開発手法でプロジェクトを進める場合も応用することができます。</p> <p>フリーランスの駆け出しエンジニアの方はWeb制作案件等を行っていることが多いと思いますが、Web制作案件のような要件が明確でミニマムなプロジェクトではいきなり開発とテストを行ってリリースということもあります。</p> <p>そのため、開発案件であればすべてが上述の工程を行うわけではなく、規模に応じて省略されるフェーズがあります。</p> <p>また、ドキュメントのボリュームも変わってきます。中規模案件はおおよそ半年~1年程度のプロジェクト期間になりますが、要件定義書は700~800ページ、基本設計書は1000ページを超えたりします。</p> <p>小さなプロジェクトでは手厚いドキュメントを作成しても費用が大きくなり過ぎてしまうため、ドキュメントは最小限にして開発を進めることが多いです。</p> <p>もう一度ウォーターフォール開発におけるプロジェクト全体の流れを確認すると以下の通りです。</p> <p> </p> <p><b>提案 → プロジェクトの準備 → キックオフ</b></p> <p><b>要件定義 → 基本設計 → 詳細設計 → 開発 → テスト → マニュアル作成 → 受入・教育・リリース判定 → リリース</b></p> <p><b>運用保守</b></p> <p> </p> <p>以上になります。</p> <p>説明不足な点も多々あるかと思いますが、参考になれば幸いです。</p> <p>大まかなプロジェクトの流れは掴んで頂けたかと思いますが、より詳細を知りたい方は以下の書籍がおすすめです。</p> <p> </p> <p><a href="https://www.amazon.co.jp/gp/product/B07JM11S69/ref=as_li_tl?ie=UTF8&amp;camp=247&amp;creative=1211&amp;creativeASIN=B07JM11S69&amp;linkCode=as2&amp;tag=optimalsdwcom-22&amp;linkId=8a82f413a96ce47fb4702120b563b363" target="_blank">プロジェクト実行ガイド大全</a><img alt="" border="0" height="1" src="//ir-jp.amazon-adsystem.com/e/ir?t=optimalsdwcom-22&amp;l=am2&amp;o=9&amp;a=B07JM11S69" style="border:none !important; margin:0px !important;" width="1" /></p> <p> </p> <p><iframe frameborder="0" marginheight="0" marginwidth="0" scrolling="no" src="https://rcm-fe.amazon-adsystem.com/e/cm?ref=tf_til&amp;t=optimalsdwcom-22&amp;m=amazon&amp;o=9&amp;p=8&amp;l=as1&amp;IS1=1&amp;detail=1&amp;asins=B07JM11S69&amp;linkId=298c4dba58d6f81b16d824053014f347&amp;bc1=ffffff&amp;lt1=_blank&amp;fc1=333333&amp;lc1=0066c0&amp;bg1=ffffff&amp;f=ifr" style="width:120px;height:240px;"></iframe></p> <p> </p> <p><a href="https://www.amazon.co.jp/gp/product/B07DNYZYG2/ref=as_li_tl?ie=UTF8&amp;camp=247&amp;creative=1211&amp;creativeASIN=B07DNYZYG2&amp;linkCode=as2&amp;tag=optimalsdwcom-22&amp;linkId=1a460b7eeee09e1f220d9a5e7fe1a2c5" target="_blank">システム開発をより速く確実に 本当に使える開発プロセス 改訂版</a><img alt="" border="0" height="1" src="//ir-jp.amazon-adsystem.com/e/ir?t=optimalsdwcom-22&amp;l=am2&amp;o=9&amp;a=B07DNYZYG2" style="border:none !important; margin:0px !important;" width="1" /></p> <p> </p> <p><iframe frameborder="0" marginheight="0" marginwidth="0" scrolling="no" src="https://rcm-fe.amazon-adsystem.com/e/cm?ref=tf_til&amp;t=optimalsdwcom-22&amp;m=amazon&amp;o=9&amp;p=8&amp;l=as1&amp;IS1=1&amp;detail=1&amp;asins=B07DNYZYG2&amp;linkId=dd56911ee246cdfaec1df9b9b22dbfb2&amp;bc1=ffffff&amp;lt1=_blank&amp;fc1=333333&amp;lc1=0066c0&amp;bg1=ffffff&amp;f=ifr" style="width:120px;height:240px;"></iframe></p> </div> <div class="field field--name-field-blog-category field--type-entity-reference field--label-above"> <div class="field--label">カテゴリ</div> <div class="field--items"> <div class="field--item"><a href="/blog/code" hreflang="ja">Code</a></div> <div class="field--item"><a href="/blog/code-projectmanagement" hreflang="ja">ProjectManagement</a></div> </div> </div> <div class="field field--name-field-tags field--type-entity-reference field--label-hidden field--items"> <div class="field--item"><a href="/blog" hreflang="ja">Blog</a></div> </div> <div class="views-element-container form-group"><div class="view view-eva view-relation-article-list view-id-relation_article_list view-display-id-entity_view_1 js-view-dom-id-7a0ac863372072979350c5d00bcfca9e3f54f05e35cc55eac2d089d16b4e0a98"> <header> <h4>あわせて読みたい記事はこちら</h4> </header> <div id="views-bootstrap-relation-article-list-entity-view-1--4" class="grid views-view-grid"> <div class="row"> <div class="col-auto col-sm-auto col-md-6 col-lg-6 col-xl-6"> <div class="views-field views-field-title"><span class="field-content"><a href="/blog/thought/article_98" hreflang="ja">エンジニアになるということ</a></span></div><div class="views-field views-field-field-kanban"><div class="field-content"><p><a href="https://optimal-sdw.com/blog/thought/article_98"><img alt="article_98_eye_catch" data-entity-type="file" data-entity-uuid="7f43e9fa-1475-41bb-863a-82450b23f215" src="/sites/default/files/inline-images/article_98.jpg" style="max-height:720px;max-width:1280px;width:100%;height:100%;object-fit:cover;" width="1919" height="1080" loading="lazy" /></a></p> <p> </p> </div></div> </div> </div> </div> </div> </div> Mon, 21 Sep 2020 22:46:14 +0000 @optimal-sdw.com 99 at http://optimal-sdw.com エンジニアになるということ http://optimal-sdw.com/blog/thought/article_98 <span>エンジニアになるということ</span> <span><span lang="" about="/banana_people/1" typeof="schema:Person" property="schema:name" datatype="">@optimal-sdw.com</span></span> <span>2020/08/10(月) - 04:45</span> <div class="field field--name-field-last-update field--type-datetime field--label-above"> <div class="field--label">更新日時</div> <div class="field--item"><time datetime="2020-08-10T19:45:00Z">2020/08/11(火) - 04:45</time> </div> </div> <div class="field field--name-field-kanban field--type-text-long field--label-hidden field--item"><p><a href="https://optimal-sdw.com/blog/thought/article_98"><img alt="article_98_eye_catch" data-entity-type="file" data-entity-uuid="7f43e9fa-1475-41bb-863a-82450b23f215" src="/sites/default/files/inline-images/article_98.jpg" style="max-height:720px;max-width:1280px;width:100%;height:100%;object-fit:cover;" width="1919" height="1080" loading="lazy" /></a></p> <p> </p> </div> <div class="field field--name-body field--type-text-with-summary field--label-hidden field--item"><p>2020年8月現在、プログラミングを学習する方、プログラミングで副業を始める方が非常に増えてきていますね。</p> <p>プログラミングが義務教育になったことや、コロナ禍で自粛生活が続き、リモートワークが普及していることが後押しになり、リモートワークでも比較的作業がしやすい職業としてエンジニアが注目されているのでしょう。</p> <p>また、一部のインフルエンサーの発信によってエンジニアは「稼げる職業」と認知されていることも一つ影響としてあるのでしょう。</p> <p>多くの人がプログラミングに興味を持ち、エンジニア人口が増えていくことは同じエンジニアとしては非常に喜ばしいことだと思います。</p> <p>しかしながら、<strong>しばしばエンジニアは「簡単になれる職業」と勘違いされている</strong>ように思います。</p> <p>SNS上で稼いでいる人たちの発信を受けて「簡単に稼げている」ようにみえているのかもしれませんが、そこに至るまでの道のりは決して「簡単」とは言えません。</p> <p>プログラミングを覚えること自体はそこまでハードルは高くありませんが、<strong>「プログラミングを覚えること = エンジニア」ではありません。</strong></p> <p>IT企業に就職すればエンジニアということでもありません。(就職がゴールではないからです。)</p> <p>また、一言に「エンジニア」といっても種類があることをご存じでしょうか?</p> <p>エンジニアとはそもそも何なのか、なぜプログラミングができてもエンジニアではないのか、エンジニアになるということはどういうことかについて紹介していきたいと思います。</p> <p> </p> <hr /><h2 id="sec01">エンジニアとは</h2> <hr /><p>エンジニアとは工学について専門的な知識やスキルを持つ人材を表す言葉です。</p> <p>私はさらに加えて専門的な知識やスキルを使って価値を創造し、顧客に価値を提供することができる人材をエンジニアと考えております。</p> <p>ここで紹介するのはエンジニアの中でもIT技術について専門的な知識やスキルを持つ人材、ITエンジニアを紹介します。</p> <p>ITエンジニアの職種は非常に細分化されており、約30種もの職種があります。</p> <p> </p> <p><strong>【エンジニアの主な役割】</strong></p> <ul><li><strong>研究開発</strong></li> <li><strong>企画・戦略</strong></li> <li><strong>プロジェクト管理</strong></li> <li><strong>設計・開発</strong></li> <li><strong>運用・保守</strong></li> <li><strong>サポート</strong></li> </ul><p><strong>【エンジニアの主な職種】</strong></p> <ol><li><strong>ITコンサルタント</strong></li> <li><strong>エンタープライズアーキテクト</strong></li> <li><strong>システムアーキテクト</strong></li> <li><strong>プロジェクトマネージャ</strong></li> <li><strong>プロジェクトリーダ</strong></li> <li><strong>システムエンジニア</strong></li> <li><strong>プログラマ</strong></li> <li><strong>テストエンジニア</strong></li> <li><strong>データベースエンジニア</strong></li> <li><strong>フロントエンドエンジニア</strong></li> <li><strong>バックエンドエンジニア</strong></li> <li><strong>マークアップエンジニア</strong></li> <li><strong>アプリケーションエンジニア</strong></li> <li><strong>QA・QCエンジニア</strong></li> <li><strong>社内SE</strong></li> <li><strong>ブリッジSE</strong></li> <li><strong>インフラエンジニア</strong></li> <li><strong>ネットワークエンジニア</strong></li> <li><strong>サーバーエンジニア</strong></li> <li><strong>クラウドエンジニア</strong></li> <li><strong>セキュリティエンジニア</strong></li> <li><strong>フィールドエンジニア</strong></li> <li><strong>サポートエンジニア</strong></li> <li><strong>セールスエンジニア</strong></li> <li><strong>制御・組み込みエンジニア</strong></li> <li><strong>Webデザイナ</strong></li> <li><strong>研究開発エンジニア</strong></li> </ol><p>これだけ細分化されてしまうと、これからエンジニアを目指す人にとっては何がなんだかよくわからないと思います。</p> <p>ここではそれぞれの職種について細かな説明は省きますが、正直なところ実際の現場ではほとんど兼務になります。</p> <p>集約すると大まかにITエンジニアの職種は以下の通りです。</p> <ol><li><strong>ITコンサルタント</strong></li> <li><strong>アーキテクト</strong>(エンタープライズアーキテクト、システムアーキテクト)</li> <li><strong>プロジェクトマネージャ</strong>(プロジェクトリーダ)</li> <li><strong>システムエンジニア</strong>(プログラマ、アプリケーションエンジニア、フロントエンドエンジニア、バックエンドエンジニア、データベースエンジニア、テストエンジニア、QA・QCエンジニア、ブリッジSE)</li> <li><strong>インフラエンジニア</strong>(ネットワークエンジニア、サーバーエンジニア、クラウドエンジニア、セキュリティエンジニア)</li> <li><strong>制御・組み込みエンジニア</strong></li> <li><strong>研究開発エンジニア</strong></li> <li><strong>Webデザイナ</strong>(マークアップエンジニア)</li> <li><strong>その他のエンジニア</strong>(フィールドエンジニア、サポートエンジニア、セールスエンジニア、社内SE)</li> </ol><p> </p> <p>***** ***** *****</p> <p><strong>ITコンサルタント</strong>はITの知識を以って顧客の抱える課題を見出したり、課題解決のためにIT技術を取り入れた業務改善を提案したりするのが主な業務になります。</p> <p><strong>アーキテクト</strong>はハードウェア・ソフトウェアを含めシステム構成全体の設計を行い、システムのライフサイクルを管理するのが主な業務になります。会社のビジネスモデルと照らし合わせ、経営戦略の視点から会社全体のシステムを最適化するエンタープライズアーキテクト、個々のシステムにおける設計を管理するシステムアーキテクトがあります。</p> <p><strong>プロジェクトマネージャ</strong>はプロジェクトに必要な資源(人、モノ、金、時間)の管理、スケジュール管理、リスク管理、顧客へのプロジェクト状況の報告、成果物の品質管理などが主な業務になります。一般的にはシステム開発経験を経てから就く職種なのですが、システム開発のスキルよりも人やお金、時間の管理が重要になるため、優秀なシステム開発者であってもプロジェクトマネージャが務まるとは限らず、キャリアパス上の特異点のような職種です。</p> <p><strong>システムエンジニア</strong>は上記の中で一番多岐にわたる業務を行います。詳細は後述しますが、ITエンジニアといえば大抵はこのシステムエンジニアを指していることが多いと思っております。</p> <p><strong>インフラエンジニア</strong>はITエンジニアの中でもネットワークの構築やサーバ機器の設置、仮想環境による開発プラットフォームの提供などが主な業務になります。ソフトウェア開発を主業務としていないことから技術系エンジニアと呼ばれることが多く、ソフトウェアを開発する開発系エンジニアと区別されることが多いです。</p> <p><strong>制御・組み込みエンジニア</strong>は家電や車などに搭載されている制御系システムの開発が主な業務になります。エンベデッドシステムエンジニアとも呼ばれます。</p> <p><strong>研究開発エンジニア</strong>はロボットの開発やゲーム機、スマートフォンの開発などハードウェアとソフトウェアの両方を新たに製品として生み出すための研究と開発を主な業務としています。</p> <p><strong>Webデザイナ</strong>は企業のホームページ作成等におけるデザインを主な業務としています。</p> <p><strong>その他のエンジニア</strong>は社内システムにおけるサポートデスク、コールセンター業務、顧客先に設置されたサーバーメンテナンスやプリンターのメンテナンス、ソフトウェア販売の営業などを主な業務としています。社内SEは自社システムの開発を担当することもありますが、多くは社内システムの運用業務やサポートが中心となり、ヘルプデスク業務に近いのが実情です。</p> <p>***** ***** *****</p> <p> </p> <p>昨今の「エンジニアになりたい」人の話を聞くと、Webアプリケーションあるいはスマートフォンアプリの開発がしたいと話しており、上記の職種の中において当てはまるのはシステムエンジニアだと思います。</p> <p>Web制作、スマホアプリ開発、業務系アプリケーションの開発など、事業内容によって扱う技術が異なりますし、担う役割についても異なってきますが、顧客要件をもとに設計を行い、開発し、テストを行い、システム開発に必要なありとあらゆることを行う点は変わりありません。</p> <p>しかしながら、フリーランス向けエージェント会社のサイトや転職サイト等で職種紹介される際、システムエンジニアは以下のような説明をされることが多く、現場の実態とはちょっと違った定義になります。</p> <p> </p> <p><strong>「お客様がどんなものを作りたいかを聞き出し、設計書を書いてプログラマへ指示をする人」</strong></p> <p> </p> <p>なぜ上記のような定義になるのか不思議でなりませんが、私の中でシステムエンジニアはプログラミングはもちろん、要件定義、設計・開発、テスト、運用保守それぞれの工程すべてができる人をシステムエンジニアと考えております。</p> <p>「設計書を書いてプログラマへ指示をする人」で務まるわけが無いのです。</p> <p>むしろ、<strong>「お客様がどんなものを作りたいかを聞き出し、設計し、システム構築できるプログラマ」こそがシステムエンジニア</strong>です。</p> <p>状況に合わせてシステムの設計者になり、プログラマになり、テスターになり、ありとあらゆることができてシステムエンジニアだと思っています。</p> <p> </p> <p>事実、実際のプロジェクトにおいて設計を渡すだけで終わったり、ほとんどプログラミングをしないといった状況は少ないです。</p> <p>私の経験において、設計者が開発をしない場面に遭遇したのはオフショアを利用してコスト削減したいプロジェクトに参加したときだけです。</p> <p>※ オフショアとは海外のエンジニアを採用すること。特に日本人よりも単価が安くなることが見込める国のエンジニアを利用します。</p> <p> </p> <p>「設計をプログラマに渡すだけ」がシステムエンジニアだとすると、顧客とプログラマの間に無駄に人を挟んでしまっているため、大きな認識齟齬が生じやすく顧客の望むシステムを構築できない可能性が高くなります。</p> <p>顧客が何を望んでいるのか、どのような機能を実現したいと考えているのか、その詳細についての情報が欠落した設計をもとに開発することになるためです。</p> <p> </p> <p>皆さん、伝言ゲームは知っておりますでしょうか?</p> <p>あれと同じで人を介せば途中で表現に使う言葉も変わり、そもそもどのような表情・口調で語られた内容であったのか、そういった細かな情報は失われていきます。※ 言語化すると情報は失われていくものです。</p> <p>そのため、設計と開発を分断し、上記のような認識の齟齬が生じやすい仕事をするのがシステムエンジニアだというのであれば、価値提供ができない可能性が高く、それはもうエンジニアとは言えません。</p> <p> </p> <hr /><h2 id="sec02">エンジニアに必要な知識</h2> <hr /><p>エンジニアとして働くうえで必要になる知識は山ほどあります。</p> <p>例えばプログラミング言語の他にもシステムを設計するためにはデータモデリングを学ぶ必要があります。</p> <p>また、ウォーターフォール開発やアジャイル開発などの開発手法、開発に必要な設計書の種類や書き方、どのような工程を経てシステムをリリースするのか等、本当に盛沢山です。</p> <p>ざっと書き連ねると以下のとおりです。</p> <p><strong>【画面表示に関する言語】</strong></p> <ul><li><strong>HTML</strong></li> <li><strong>CSS</strong></li> </ul><p><strong>【画面におけるアクションを制御する言語】</strong></p> <ul><li><strong>JavaScript</strong></li> <li><strong>TypeScript</strong></li> </ul><p><strong>【システム機能のロジックを記述する言語(いずれか数言語)】</strong></p> <ul><li><strong>PHP</strong></li> <li><strong>Java</strong></li> <li><strong>Python</strong></li> <li><strong>Ruby</strong></li> <li><strong>Perl</strong></li> <li><strong>JavaScript</strong></li> <li><strong>TypeScript</strong></li> <li><strong>Go</strong></li> <li><strong>Kotlin</strong></li> <li><strong>Swift</strong></li> <li><strong>C++</strong></li> <li><strong>C#</strong></li> <li><strong>VB</strong></li> </ul><p><strong>【データベース(画面入力データ等を保存するための箱)】</strong></p> <ul><li><strong>MySQL(MariaDB)</strong></li> <li><strong>PostgreSQL</strong></li> <li><strong>Oracle</strong></li> <li><strong>SQL Server</strong></li> </ul><p><strong>【データベースを操作するための言語】</strong></p> <ul><li><strong>SQL</strong></li> </ul><p><strong>【テキストエディタ、統合開発ツール】</strong></p> <ul><li><strong>VSCode</strong></li> <li><strong>eclipse</strong></li> <li><strong>VisualStudio</strong></li> <li><strong>IntelliJ</strong></li> </ul><p><strong>【バージョン管理ツール】</strong></p> <ul><li><strong>Git</strong></li> <li><strong>SVN</strong></li> </ul><p><strong>【サーバーに関する知識】</strong></p> <ul><li><strong>Linux</strong></li> <li><strong>Windows Server</strong></li> <li><strong>Apache</strong></li> <li><strong>Nginx</strong></li> </ul><p><strong>【Webに関する知識】</strong></p> <ul><li><strong>HTTPリクエストとレスポンス</strong></li> <li><strong>TCP/IP</strong></li> <li><strong>MIME</strong></li> <li><strong>POP3</strong></li> <li><strong>SMTP</strong></li> <li><strong>Ajax</strong></li> <li><strong>XSSなどセキュリティ対策</strong></li> <li><strong>AWSなどのクラウド環境</strong></li> </ul><p><strong>【プロジェクトおよび設計・開発の知識】</strong></p> <ul><li><strong>データモデリング</strong></li> <li><strong>排他制御</strong></li> <li><strong>オブジェクト指向</strong></li> <li><strong>フローチャート(処理手順の図式化)</strong></li> <li><strong>ウォータフォール開発、アジャイル開発などの開発手法</strong></li> <li><strong>設計書の種類(要件定義書、基本設計書、詳細設計書、テスト仕様書など)</strong></li> <li><strong>システムのテスト方法</strong></li> <li><strong>WBSの書き方</strong></li> <li><strong>フレームワークの知識(JavaならSpring、PHPならLaravelなど)</strong></li> <li><strong>CMSの知識(WordPress、Drupalなど)</strong></li> <li><strong>SEO</strong></li> <li><strong>仮想化技術(Docker、Vagrantなど)</strong></li> <li><b>マイクロサービスアーキテクチャ</b></li> </ul><p> </p> <p>上述のプログラミング言語や知識につきましては、IT企業へ就職するための必須条件ではありませんし、フリーランスとして働くための必須条件でもありません。</p> <p>プログラミング言語についてはJavaScriptの他にやりたいことに応じて覚えれば十分だと思います。</p> <p>例えばAndroidアプリの開発であればKotlin、iOSアプリであればSwift、一般的なWebアプリケーションにおいてはPHPやJavaなど。</p> <p>Web制作など限られた分野、限られた作業を行うだけであれば必要な技術も限られてきます。</p> <p>最低限HTML、CSS、JavaScriptの知識があればWebデザイナのデザインを元にHTMLやCSSを書くコーダーとしてランディングページ(LP)作成案件の受注は可能だと思います。</p> <p>ただし、CMSの導入からやるとなれば、WordPressなどのCMSの知識、PHP、デザイン知識、SEOの知識、DB、SQL、LinuxとApache、Nginxあたりの知識など、一通り知識が必要になります。</p> <p> </p> <p>また、<strong>必要な技術すべての内容を暗記する必要はありません。</strong>Googleで検索して調べれば解決することも多くあります。</p> <p>※ Googleで検索すればすべて答えがあるという認識は間違いです。基本的にはオーダーメイドな1点ものを作るわけですから、テクニックを調べることができても、お客様の要件を満たすための答えは自分で導く必要があります。</p> <p> </p> <p>案件によって上記以外にも必要になる知識は当然あります。</p> <p>これだけ幅広い知識を必要とするエンジニアですが、それぞれの技術は常に進化しており、過去に学んだ知識も常にアップデートが必要になります。</p> <p>そのため、エンジニアは常に学習が必要と言っても過言ではない職業になります。</p> <p> </p> <hr /><h2 id="sec03">エンジニアの年収は?</h2> <hr /><p>国税庁の平均給与所得をみると<strong>全体平均で441万円</strong>程度になるようです。</p> <p><strong>情報通信業においては622万円</strong>程度になるようです。</p> <p>そう考えるとIT関連の業種に従事している人の給与は比較的高いと言えますね。</p> <p><a href="https://www.nta.go.jp/information/release/kokuzeicho/2019/minkan/index.htm" rel="nofollow noopener noreferrer" target="_blank">平成30年分民間給与実態統計調査結果について</a></p> <p><a href="https://www.nta.go.jp/publication/statistics/kokuzeicho/minkan2018/minkan.htm" rel="nofollow noopener noreferrer" target="_blank">標本調査結果</a></p> <p>なお、国税庁の調査では<strong>年収1000万円を超えている人は給与所得者全体で5%</strong>しかいないことがわかります。(以下資料の20ページ)</p> <p><a href="https://www.nta.go.jp/publication/statistics/kokuzeicho/minkan2018/pdf/001.pdf" rel="nofollow noopener noreferrer" target="_blank">民間給与実態統計調査</a></p> <p>SNS上ではよくエンジニアは年収1000万円は簡単に稼げるという話がありますが、上述の資料からもわかるように会社員として給与を貰う場合は簡単ではないことがわかります。</p> <p> </p> <p>また、<strong>フリーランスエンジニアの平均年収は862万円</strong>になります。(<a href="https://freelance.levtech.jp/" rel="nofollow noopener noreferrer" target="_blank">レバテック</a>)</p> <p>平均年収と表記がありますが、<strong>会社員と違ってフリーランスは経費や保険料を自己負担しますので、「年商」が正しい</strong>表記と思います。</p> <p>例えば単価75万円(税込)の案件を12か月行えば売上900万円です。</p> <p>経費、保険料、確定拠出年金のことも考えると、<strong>年商900万円程度で会社員の年収500~600万円程度</strong>と考えたほうが良いでしょう。</p> <p>※ 会社員の方は経費や保険料を会社に負担してもらっています。会社員には給与明細には見えない利益があることを知っておく必要があります。</p> <p> </p> <p>複数エージェント会社の案件募集内容を参照するとわかりますが、<strong>単価75万円(税込)は決して高い単価ではなく、JavaやPHPエンジニアの単価としては平均的な単価</strong>になります。</p> <p>よくSNSでフリーランスエンジニアになれば稼げると言われますが、上記の通りフリーランスエンジニアも会社員エンジニアと収入にさほど大差はありません。</p> <p>会社員との違いは、収入の頭打ちが会社員よりフリーランスエンジニアのほうが高い位置にあるということです。</p> <p>継続して案件を受注できるのであれば、運用次第では会社員よりも大きな収入を得られる可能性はあります。</p> <p> </p> <p>若手でスキルの高い人は年次のせいで平均給与以下となることもあり、十分な経験とスキルを持っていればフリーランスエンジニアになったほうが収入が高くなるケースもあるでしょう。</p> <p>ただし、会社員と違って信用が低く、すべて自分で賄う必要がありますので、単純にフリーランスになれば良いということではありません。</p> <p>特に、お客様は即戦力を必要としており、会社員を育てるのとは違い、フリーランスを育てようとは思っておりません。</p> <p>フリーランスになればスキルアップできるという話もよくありますが、これは自ら進んで技術習得しなければ戦えないということを意味しております。</p> <p> </p> <p> </p> <hr /><h2 id="sec04">エンジニアになるのは簡単か?</h2> <hr /><p>私は、<strong>エンジニアは「簡単になれる職業」では無い</strong>と考えております。</p> <p>プログラミングが少しできるようになったところで「エンジニア」とは言えないからです。</p> <p>システムを開発し提供することで、あるいは様々なシステムを連携利用することで価値を創造し、<strong>「誰かの課題解決のために尽力する」のがエンジニア</strong>と考えています。</p> <p>従って、プログラミング言語であるJavaやPHP、JavaScriptなどの扱いを覚えただけではまだ見習いプログラマであり、エンジニアとしての入り口に立ったばかりです。</p> <p> </p> <p>IT企業に就職して「エンジニア」の肩書を手に入れるだけでは本当の意味でエンジニアになれたとは言えません。</p> <p>お客様の声を聞き、要件を整理して設計に落とし込み、設計からプログラムを作り、要件を満たすシステムとして構築する。</p> <p>上記のことができるようになって初めて一人前のエンジニアです。</p> <p> </p> <p><strong>プログラミングはお客様の課題解決のためにシステムを構築するための手段</strong>です。</p> <p>目的は課題解決でありシステムを構築することは手段の一つでしかありません。費用対効果からExcelファイルや、Googleスプレッドシートで事足りるケースもあります。</p> <p>そのため、プログラミング学習ばかりでは課題解決能力は育ちません。</p> <p><strong>課題解決能力を育てるためには実務経験が必要です。</strong>関わったプロジェクトの数、期間、お客様の数などで課題解決能力の伸びも変わってきます。</p> <p>※ ロールプレイングによる学習もできますが、生の課題に比べると本当に困っている当事者が目の前に存在しないため、生の経験には劣ります。この課題解決能力を育てるのが一番難しいところです。</p> <p> </p> <p>しかしながら、SNS上での「未経験、わずか3か月で月収50万円」などといった発信を鵜呑みにして「簡単に」稼げるという認知の歪みが生じ、さらに歪んで「簡単になれる職業」と考えている方が増えているように思います。</p> <p>これらの発信には学習期間が含まれておらず、あくまでエンジニアという肩書で働き始めてから〇か月と言っている場合があり、学習期間をいれると2年以上かかっている場合もあります。</p> <p> </p> <p>また、実際には参画したプロジェクトの他メンバーの協力があっての結果であったり、何かしらのコミュニティですでに実績のある方のサポートがあっての結果だったりします。</p> <p>発信内容の表面だけを受け取り、簡単に稼げるならエンジニアになろうと安易な気持ちでプログラミングを始めてしまうと、途中で挫折しエンジニアになることを諦めてしまう方々も少なくないのではと思っております。</p> <p>プログラミング学習が思うように進まない、あるいはプログラミングが少しできるようになったものの、それを使って課題解決する方法がわからず案件受注に繋げられないで挫折など。</p> <p>これらはすべてエンジニアになるために必要な学習が「簡単」であると誤解されているために起きている事象と推測しております。</p> <p> </p> <p>エンジニアは学習さえすれば誰でも手が届く職業だと思いますが、本業ではなく片手間の副業だけでエンジニアを目指そうとしている人、すぐにマネタイズの結果を求めようとする人は、一人前のエンジニアとして十分なスキル習得に結びつかず、高単価のお仕事は任せてもらえない可能性が高いです。</p> <p>低単価の案件は「作業」が多く、課題解決の場面に出合うことも少ないです。</p> <p>従って、「エンジニア」を目指すのであればIT企業に就職して数年間経験を積むのが良いと思います。</p> <p> </p> <hr /><h2 id="sec05">エンジニアになるには?</h2> <hr /><p>エンジニアになるためには<strong>IT企業に就職してシステム開発経験を積むのが一番良い</strong>と考えております。</p> <p>プログラミング言語の扱い方やテクニックについてはGoogle検索で解答を得ることができますが、例えばデータモデリングなどの「設計」についてはGoogleで検索したところで最適解はありません。</p> <p>目の前のお客様が求めているシステムに必要な機能はシステム要件を聞いたあなたにしか解答を出せないからです。</p> <p><strong>検索しても答えのないことに対応する力を身につける</strong>には、実務経験を多く重ねることで学ぶしかありません。</p> <p> </p> <p>実務経験を重ねると全く同じシステムは無いにしても、過去に開発したシステムと似たような機能や要望に直面することがあり、過去の設計経験が活きてきます。</p> <p>この実務経験を得るのに最適な環境はIT企業の職場だと考えています。</p> <p>強制的に毎日開発業務に関わることができ、すでに幾度とプロジェクト経験を積んだ先輩社員が近くにいるため、経験者から学ぶことができる環境だからです。</p> <p> </p> <p>フリーランスのエンジニアになりたい方も、いきなりフリーランスになるよりも会社員を経験したほうが良いと考えています。</p> <p>特に比較的参入障壁の低いWeb制作を始める人が多いですが、Web制作でいきなりフリーランスになると、Web制作以外は全くできないエンジニアになる可能性があります。</p> <p>フリーランスのエンジニアになりたいのに会社員になるなんて嫌だと考えている方も多いかもしれませんが、遠回りのようで会社員経験が一番の近道だと思っています。</p> <p> </p> <p>ただし、例えば決まったシナリオに沿って値を入力して結果を記録するだけのテスターやドキュメント整理など、自身の目的とは逸れた案件に長く身をおいても、効率的なスキルアップはできないと思います。</p> <p>会社内の事情もあると思いますが、機会があれば積極的にいろんなフェーズを経験しましょう。</p> <p>中には10年と同じシステムの運用を続けているような人もいらっしゃいます。それ自体が悪いことではありませんが、フリーランスとして様々な企業のスポット対応を行うとなると、他のシステムを全く知らず、10年エンジニアを続けていてもスキル不足と判断されてしまう可能性があります。</p> <p>最終的に特定分野のエキスパートになるにしても、最初はまんべんなく経験しておくと幅が広がり、特定分野で作業する場合にも前後のつながりがわかることで大いに役立ちます。</p> <p> </p> <p>簡易的なものですが、IT企業へ就職するためのステップとしては以下の通りです。</p> <ol><li><strong>エンジニアになぜなろうとしているのか、目指すエンジニアの方向性を確認する(Web制作、スマホアプリ、Webアプリケーション開発など)</strong></li> <li><strong>コンピュータサイエンスを学ぶ(まずは基本情報技術者試験、欲を言えば応用情報技術者試験)</strong></li> <li><strong>プログラミングを学ぶ(HTML、CSS、JavaScript、SQL、Java or PHP or Python or...etc)</strong></li> <li><strong>改めてなりたいエンジニアの方向性とターゲットとするIT企業を確認する</strong></li> <li><strong>ポートフォリオを作成する(Web制作、スマホアプリ、Webアプリケーションなど)</strong></li> <li><strong>就職活動を行う(自社開発系、SIer系、SES系、Webデザイン事務所など)</strong></li> </ol><p> </p> <p>エンジニアになるために重要なのは、まず自身がどうしてエンジニアになりたいのか?をはっきりさせることです。</p> <p>Web制作者になりたいのか、スマホアプリの開発者になりたいのか、IT技術を用いたビジネスを行いたいのか、それらによって学ぶべきスキルセットが変わってきます。</p> <p>しかしながら、初学者にとってはWeb制作やスマホアプリ開発などの仕事内容がいまいち想像できず、具体的な方向性を決めるのが難しい方もいると思います。</p> <p> </p> <p>エンジニアとしての具体的な方向性を決めるのに役立つのが基本的なIT技術に関する知識です。</p> <p>エンジニアを目指す上で基本的なIT技術に関する知識は必須です。それらを身につけるにはコンピュータサイエンスの基礎学習が大事です。</p> <p>手っ取り早く全体を網羅するには国家試験である<strong>基本情報技術者試験</strong>や<strong>応用情報技術者試験</strong>などの教材を利用して学ぶのが良いと思います。</p> <p>プログラミング学習する前に基本的なIT技術について理解を深めておくと、学習効率は高くなります。</p> <p> </p> <p>ただし、国家試験は実務ができることを保証するものではありませんので、いわゆる資格マニアにならないように気を付ける必要があります。</p> <p>試験テクニックを詰め込んでもあまり意味はなく、むしろ実務を行う際に思考が固くなり多方面から考えることができなくなる弊害を生む可能性があります。</p> <p> </p> <p>また、ある程度基礎的な知識をすでに持っている方で、エンジニアの方向性に悩んでいる方は、例えばレバテックのようなエージェント会社が紹介している案件をみれば、必要なスキルやどのくらいの単価で募集しているのか確認することができます。</p> <p>スマホアプリ開発の案件募集内容をみればReact Nativeであったり、Pythonであったり、Kotlinであったり、必要なスキルが記載されています。</p> <p>そういった情報を元にどのくらい稼ぎたいのか、何を学ぶ必要があるのかをリサーチします。就職したい企業が決まっているのであれば、当該企業の事業内容に関連したスキルをリサーチします。</p> <p>※ 自分がどういった企業で働きたいのか5社くらいに絞込みましょう。たくさんの会社に応募している人は「どこでもいい」感が履歴書などに表れてしまいますので、ここで働きたいと思える企業をしっかり探しましょう。</p> <p> </p> <p>自分が必要とする技術について目星がついたところでオンライン教材または書籍など自分にあった学習方法でプログラミングを学びます。</p> <p>例えばProgateやドットインストール、paizaといった<strong>オンライン学習サイト</strong>があります。</p> <p>CodeCampやLABOTといった<strong>企業で働く実際のIT技術者が講師として教えてくれるスクール</strong>も存在します。</p> <p>※ スクール出身者が実務経験もなくアルバイトとして講師を務めているようなスクールや、就職することだけが目的のスクールは実務をこなすためのスキルセットが身につきませんので、スクール選びは情報収集を念入りにしましょう。また、スクールの利用は書籍等に比べると費用が段違いにかかります。借金してまで通うようなものでは無いので、まずは手ごろな書籍から始めることをお奨めいたします。</p> <p> </p> <p>上記のような学習サイトや教材、スクールを利用してまずは最低限のスキルを身につけます。</p> <p>最低限のスキルを身につけていることを証明するにはポートフォリオとして何かアプリケーションを作成してみることです。</p> <p>加えて最低限の知識を有することを証明するには基本情報技術者試験や応用技術者試験に合格しておくとプラスになります。</p> <p> </p> <p>ポートフォリオを作成する際に注意したいことは、就職したい企業にあわせてポートフォリオを用意することです。</p> <p>例えばスマホアプリの開発をメインにしている企業に「WordPressでサイト作ってみました!」とアピールするよりも、「Androidアプリを公開しています!」とアピールしたほうが良いことは自明だと思います。</p> <p>※ WordPressでのポートフォリオ作成よりは素でHTMLとCSSを書けるコーダー兼デザイナーさんのほうが好まれると思います。</p> <p>※ 業務系システムの開発などを目指す人はWebアプリケーションを作成しましょう。オンライン家計簿や掲示板などを作ってみるとよいでしょう。</p> <p> </p> <p> </p> <hr /><h2 id="sec06">エンジニアになった先に何を目指すか</h2> <hr /><p>IT企業でプロジェクトを何度か経験することでシステム開発スキルは独りで学習を続けるよりも飛躍的に伸びていきます。</p> <p>入社した企業にもよりけりですが、3年から5年程度経験すればプロジェクト期間が半年ほどの小さな案件を2,3回、1年程度の中規模案件を1,2回は経験できるのではないかと思料しております。</p> <p>一通りプロジェクトの工程を学び、一人でもシステム開発できるようになればエンジニアとして十分なスキルを身につけたと言えると思います。</p> <p> </p> <p>そうなった後に同じ企業で働き続け管理職を目指すのか、転職して別の技術を学びながらシステム開発に従事していくのか、フリーランスまたは法人として起業するのか、様々な道があります。</p> <p>仮に同じ会社で働き続ける場合、別の企業へ転職する場合、年収1000万円以上の給与所得者はIT業界にかかわらず全体の5%ですから、年収の伸びはあまり期待できません。</p> <p>そのため、エンジニアとして十分なスキルを手に入れた後は、貴方自身の着地点を見定めて、進む道を考えてみましょう。</p> <p> </p> <p>家族の生活を支える十分な収入があれば問題ないのか、それとも法人を設立し、従業員を雇い、従業員の生活を支えるぐらいまで成功したいのか、どのぐらい稼ぐ必要があるのか。</p> <p>もしも1000万円以上稼ぎたい場合はフリーランスのエンジニアに挑戦してみるのが良いと考えております。</p> <p> </p> <p>IT企業でひとしきりスキルを磨いた人は、フリーランスになったとしてもエージェント会社を通して仕事を受注すれば安定して稼ぐことができると思います。</p> <p>実際に私自身は会社員として最終年収は約900万円でしたが、フリーランス1年目の2019年の年商は10ヶ月で約850万円、2年目の2020年は7月末までの売上で700万円を超えております。</p> <p>このままのペースであれば2020年は年商1200万円以上になる見込みであり、経費を除いても会社員の頃の最終年収とさほど変わらないぐらいになる見込みです。</p> <p>SNS上では依然としてWeb制作案件が人気ですが、Web制作案件は単価が低く、SEOコンサルとしての付加価値や案件数を稼がなければ難しいでしょう。</p> <p> </p> <p>もっとネットビジネスを学び、エージェント会社を通した仕事から個人で仕事を請け負うようにシフトしていけば年商ではなく年収として1000万円を超えていけるでしょう。</p> <p>※ 準委任契約の業務委託よりも請負契約の業務委託は個人事業主にとってリスクの大きな契約になる可能性が高く、必ず自身の契約書を用意しましょう。</p> <p>※ 税金や契約に詳しくなるまではエージェント会社を通した働き方を中心に経験を積むのが安全だと思います。</p> <p> </p> <p>どうしてもフリーランスの働き方が性に合わないとなった場合は、十分に育ったスキルを持っているので、IT企業へ再就職することも可能だと思います。</p> <p> </p> <hr /><h2 id="sec07">まとめ</h2> <hr /><p>ITエンジニアになるということは、<strong>システムを開発し提供することで、あるいは様々なシステムを連携利用することで価値を創造し、「誰かの課題解決のために尽力する」</strong>ことができる人材になるということです。</p> <p>システムエンジニアとは<strong>「お客様がどんなものを作りたいかを聞き出し、設計し、システム構築できるプログラマ」</strong>です。</p> <p>決して<strong>「設計書をプログラマに渡して指示をするだけの人」ではありません。</strong></p> <p>エンジニアになるためには<strong>「検索しても答えのないことに対応する力を身につける」</strong>必要があり、そのために<strong>「IT企業に就職してシステム開発経験を積むのが一番良い」</strong>と考えています。</p> <p> </p> <p>IT企業に就職するためには以下のステップで学習し、就職活動を行います。</p> <ol><li><strong>エンジニアになぜなろうとしているのか、目指すエンジニアの方向性を確認する(Web制作、スマホアプリ、Webアプリケーション開発など)</strong></li> <li><strong>コンピュータサイエンスを学ぶ(まずは基本情報技術者試験、欲を言えば応用情報技術者試験)</strong></li> <li><strong>プログラミングを学ぶ(HTML、CSS、JavaScript、SQL、Java or PHP or Python or...etc)</strong></li> <li><strong>改めてなりたいエンジニアの方向性とターゲットとするIT企業を確認する</strong></li> <li><strong>ポートフォリオを作成する(Web制作、スマホアプリ、Webアプリケーションなど)</strong></li> <li><strong>就職活動を行う(自社開発系、SIer系、SES系、Webデザイン事務所など)</strong></li> </ol><p>※ オンライン教材または書籍など自分にあった学習方法でプログラミングを学びます。</p> <p>※ ポートフォリオは就職したいIT企業にあわせて作成します。</p> <p> </p> <p>エンジニアとして十分なスキルを身につけた後は、貴方自身の着地点を見定めて、進む道を考えてみましょう。</p> <p>家族の生活を支える十分な収入があれば問題ないのか、それとも法人を設立し、従業員を雇い、従業員の生活を支えるぐらいまで成功したいのか、どのぐらい稼ぐ必要があるのか。</p> <p>仮にフリーランスのエンジニアを目指すのであれば、最初はエージェント会社を通して案件受注したほうが無難です。</p> <p> </p> <p>以上</p> </div> <div class="field field--name-field-blog-category field--type-entity-reference field--label-above"> <div class="field--label">カテゴリ</div> <div class="field--items"> <div class="field--item"><a href="/blog/thought" hreflang="ja">Thought</a></div> </div> </div> <div class="field field--name-field-tags field--type-entity-reference field--label-hidden field--items"> <div class="field--item"><a href="/blog" hreflang="ja">Blog</a></div> </div> <section> </section> <div class="views-element-container form-group"><div class="view view-eva view-relation-article-list view-id-relation_article_list view-display-id-entity_view_1 js-view-dom-id-86c029ec33bd0ad37f6313e1edc8b30ff9400c5e28f90918b82a2c0b41503675"> <header> <h4>あわせて読みたい記事はこちら</h4> </header> <div id="views-bootstrap-relation-article-list-entity-view-1--5" class="grid views-view-grid"> <div class="row"> <div class="col-auto col-sm-auto col-md-6 col-lg-6 col-xl-6"> <div class="views-field views-field-title"><span class="field-content"><a href="/blog/freelance/article_16" hreflang="ja">個人事業主、フリーランスとして開業する際に必要なこと</a></span></div><div class="views-field views-field-field-kanban"><div class="field-content"><p><a href="https://optimal-sdw.com/blog/freelance/article_16"><img alt="article_16_eye_catch" data-entity-type="file" data-entity-uuid="b7c8772a-f543-45ec-b6c4-3a46aa282a4e" src="/sites/default/files/inline-images/article_16.jpg" style="max-height:720px;max-width:1280px;width:100%;height:100%;object-fit:cover;" width="1920" height="1080" loading="lazy" /></a></p> <p> </p> </div></div> </div> <div class="col-auto col-sm-auto col-md-6 col-lg-6 col-xl-6"> <div class="views-field views-field-title"><span class="field-content"><a href="/blog/freelance/article_18" hreflang="ja">青色申告特別控除額、基礎控除額の変更について(2020年 令和2年分確定申告から)</a></span></div><div class="views-field views-field-field-kanban"><div class="field-content"><p><a href="https://optimal-sdw.com/blog/freelance/article_18"><img alt="article_18_eye_catch" data-entity-type="file" data-entity-uuid="f2d8e2c8-b049-4090-97fe-8a29ac8d9395" src="/sites/default/files/inline-images/article_18.jpg" style="max-height:720px;max-width:1280px;width:100%;height:100%;object-fit:cover;" width="1919" height="1080" loading="lazy" /></a></p> <p> </p> </div></div> </div> </div> </div> </div> </div> Sun, 09 Aug 2020 19:45:00 +0000 @optimal-sdw.com 98 at http://optimal-sdw.com http://optimal-sdw.com/blog/thought/article_98#comments フリーランス2年目は予定納税に注意しましょう。 http://optimal-sdw.com/blog/freelance/article_96 <span>フリーランス2年目は予定納税に注意しましょう。</span> <span><span lang="" about="/banana_people/1" typeof="schema:Person" property="schema:name" datatype="">@optimal-sdw.com</span></span> <span>2020/07/13(月) - 08:06</span> <div class="field field--name-field-last-update field--type-datetime field--label-above"> <div class="field--label">更新日時</div> <div class="field--item"><time datetime="2020-07-12T23:06:41Z">2020/07/13(月) - 08:06</time> </div> </div> <div class="field field--name-field-kanban field--type-text-long field--label-hidden field--item"><p><a href="https://optimal-sdw.com/blog/freelance/article_96"><img alt="article_96_eye_catch" data-entity-type="file" data-entity-uuid="4076de9d-7831-42f9-b6c4-43f47c1eb502" src="/sites/default/files/inline-images/article_96_0.jpg" style="max-height:720px;max-width:1280px;width:100%;height:100%;object-fit:cover;" width="1920" height="632" loading="lazy" /></a></p> <p> </p> </div> <div class="field field--name-body field--type-text-with-summary field--label-hidden field--item"><p>個人事業主、フリーランスとして活動を始めた初年度には事業税の支払いと予定納税がありません。</p> <p>しかし、2年目になりますと、事業税の支払いと予定納税の支払いが発生します。</p> <p>そのため、税金の支払いタイミングが異なってきますので、キャッシュフローに注意する必要があります。</p> <p>月商をそのまま生活費として利用している人は特に注意です。</p> <p>税金を納めるタイミングでお金が無い!なんてことにならないようにしましょう。</p> <p>月商から納税枠、経費枠、余剰枠、生活費枠としっかりお金の管理をしましょう。</p> <p>本記事では予定納税について紹介したいと思います。</p> <p> </p> <hr /><h2 id="sec01">予定納税とは</h2> <hr /><p>予定納税とは、前年度の確定申告で算出された所得税をもとに、「今年度の所得税も同じぐらい納めることになるはずだ」という予測をもとに今年度の確定申告より前に納税する仕組みのことです。</p> <p>予定納税の対象者は前年度所得税が15万円を超える方が対象になります。</p> <p>詳細はどこで確認すればよいかというと、国税庁のWebページですね。</p> <p><a href="https://www.nta.go.jp/taxes/shiraberu/taxanswer/shotoku/2040.htm" rel="nofollow noopener noreferrer" target="_blank">No.2040 予定納税</a></p> <p> </p> <hr /><h2 id="sec02">予定納税額はいくら納めればいいの?</h2> <hr /><p>具体的にいくら納めるかといいますと、前年度のおおよそ2/3ぐらいになります。</p> <p>例えば前年度の所得税が18万円だったとすると、12万円を先に納める必要があります。</p> <p>詳細は税務署からの通知に記載されております。</p> <p> </p> <hr /><h2 id="sec03">予定納税額はいつ納めるの?</h2> <hr /><p>予定納税を納める時期は、毎年7月と11月の2回に分けて納税する必要があります。</p> <p>1年目は所得税の支払いタイミングは確定申告の後になりますので、2020年の収入に対する所得税は2021年3月~4月の支払タイミングになります。</p> <p>しかしながら、2年目となりますと、2020年の収入に対する所得税の支払いタイミングは2020年7月、11月と確定申告後の2021年3月~4月になります。</p> <p>※ 2020年はコロナ禍により確定申告の時期が1か月遅れているため、予定納税のタイミングも1か月ずれています。</p> <p> </p> <hr /><h2 id="sec04">源泉徴収されている場合でも納める必要はあるの?</h2> <hr /><p>予定納税は源泉徴収されていても支払う必要があります。</p> <p>フリーのシステムエンジニアであれば源泉徴収されることはあまりありませんが、仮に2年目のお仕事が源泉徴収されている場合、報酬額のうち100万円以下については約10%、報酬額の内100万円を超える部分については約20%を徴収されます。(お客様側の経理都合で源泉徴収される場合があります。)</p> <p>上記の支払いを行っても予定納税は支払う必要がありますので、前払いしなければならない所得税額が1年目よりも非常に大きくなる場合があります。</p> <p>もちろん確定申告で払い過ぎた所得税は還付されるわけですが、支払いタイミングが前倒しになっている分、1年目と同じ感覚でお金の管理をしているとキャッシュフローが大きくことなるため必要なタイミングでお金が無いという事態が発生する可能性があります。</p> <p>例えば前年の月商70万円程度、今年度は月商70万円で源泉徴収有りとなると、毎月7万円の納税が発生し、これだけでも84万円先に納税しなくてはなりません。さらに予定納税額をあわせると100万円程度先に納める必要があります。</p> <p>トータルの収入としては問題なくても、支払いタイミングが前倒しになるといきなり生活苦になる可能性があります。</p> <p> </p> <hr /><h2 id="sec05">まとめ</h2> <hr /><ul><li>予定納税とは前倒しで納める所得税</li> <li>予定納税の対象者は前年度所得税が15万円を超える方</li> <li>予定納税を納める時期は、毎年7月と11月の2回</li> <li>予定納税は源泉徴収されていても支払う必要がある</li> <li>支払いタイミングが前倒しになるため、キャッシュフローに注意</li> </ul><p>1年目と2年目は納税タイミングが異なりますので、キャッシュフローに注意してお金の管理をしっかりしましょう。</p> </div> <div class="field field--name-field-blog-category field--type-entity-reference field--label-above"> <div class="field--label">カテゴリ</div> <div class="field--items"> <div class="field--item"><a href="/blog/freelance" hreflang="ja">Freelance</a></div> </div> </div> <div class="field field--name-field-tags field--type-entity-reference field--label-hidden field--items"> <div class="field--item"><a href="/blog" hreflang="ja">Blog</a></div> </div> <section> </section> <div class="views-element-container form-group"><div class="view view-eva view-relation-article-list view-id-relation_article_list view-display-id-entity_view_1 js-view-dom-id-a12552bf43b6e0160dc658e28c3c47cb66048babb384afc35e8044c96664b640"> <header> <h4>あわせて読みたい記事はこちら</h4> </header> <div id="views-bootstrap-relation-article-list-entity-view-1--6" class="grid views-view-grid"> <div class="row"> <div class="col-auto col-sm-auto col-md-6 col-lg-6 col-xl-6"> <div class="views-field views-field-title"><span class="field-content">- 関連記事はありません。 </span></div> </div> </div> </div> </div> </div> Sun, 12 Jul 2020 23:06:41 +0000 @optimal-sdw.com 96 at http://optimal-sdw.com http://optimal-sdw.com/blog/freelance/article_96#comments 【CentOS】rpmパッケージのインストール、更新、削除コマンドについて http://optimal-sdw.com/blog/code-linux/article_95 <span>【CentOS】rpmパッケージのインストール、更新、削除コマンドについて</span> <span><span lang="" about="/banana_people/1" typeof="schema:Person" property="schema:name" datatype="">@optimal-sdw.com</span></span> <span>2020/05/28(木) - 01:35</span> <div class="field field--name-field-last-update field--type-datetime field--label-above"> <div class="field--label">更新日時</div> <div class="field--item"><time datetime="2020-05-27T16:35:50Z">2020/05/28(木) - 01:35</time> </div> </div> <div class="field field--name-field-kanban field--type-text-long field--label-hidden field--item"><p><a href="https://optimal-sdw.com/blog/code-linux/article_95"><img alt="article_95_eye_catch" data-entity-type="file" data-entity-uuid="612d84b1-c8dc-4b7f-9d04-4aa9a05f6b81" src="/sites/default/files/inline-images/article_95.jpg" style="max-height:720px;max-width:1280px;width:100%;height:100%;object-fit:cover;" width="1919" height="1080" loading="lazy" /></a></p> <p> </p> </div> <div class="field field--name-body field--type-text-with-summary field--label-hidden field--item"><p>Linux環境にてrpmパッケージをインストールする際のコマンドになります。</p> <p>rpmとはRed Hat Package Managerの略で、Red Hat Linuxのために開発されたパッケージ管理方式になります。</p> <p>ソフトウェアを一つのファイルにまとめて配布するためのファイル形式の仕様と、パッケージをシステムに導入する管理ツールで構成されています。</p> <p>ソフトウェアをインストールするためのファイル形式の一つです。</p> <p>頻繁に利用するわけではないですが、何かをインストールしようとしたときにいつも忘れがちなので備忘録として載せます。</p> <p> </p> <hr /><h2 id="sec01">rpmパッケージをインストールする</h2> <hr /><p>rpmパッケージをインストールするコマンドです。</p> <p> </p> <pre> <code class="language-xml">$ sudo rpm -ivh インストールパッケージファイル名.rpm</code> </pre> <p> </p> <hr /><h2 id="sec02">rpmパッケージをアップデートする</h2> <hr /><p>rpmパッケージをアップデートするコマンドです。</p> <p> </p> <pre> <code class="language-xml">$ sudo rpm -Uvh 更新パッケージファイル名.rpm</code> </pre> <p> </p> <hr /><h2 id="sec03">rpmパッケージをアンインストールする</h2> <hr /><p>rpmパッケージをアンインストールするコマンドです。</p> <p> </p> <pre> <code class="language-xml">$ sudo rpm -evh 削除パッケージ名</code> </pre> <p> </p> <hr /><h2 id="sec04">まとめ</h2> <hr /><p>rpmコマンドの各種オプションはinstall(インストール)するので(-i)、Update(更新)するので(-U)、erase(削除、deleteじゃないんだ。。。)するので(-e)と英語の頭文字で覚えておくと忘れにくいです。</p> <p>ちなみに(-v)はパッケージ名のview(表示)、(-h)は進捗率を#(hash ハッシュ)で表示します。</p> <p> </p> <pre> <code class="language-xml">$ sudo rpm -ivh インストールパッケージファイル名.rpm $ sudo rpm -Uvh 更新パッケージファイル名.rpm $ sudo rpm -evh 削除パッケージ名</code> </pre> <p> </p> </div> <div class="field field--name-field-blog-category field--type-entity-reference field--label-above"> <div class="field--label">カテゴリ</div> <div class="field--items"> <div class="field--item"><a href="/blog/code" hreflang="ja">Code</a></div> <div class="field--item"><a href="/blog/code-linux" hreflang="ja">Linux</a></div> </div> </div> <div class="field field--name-field-tags field--type-entity-reference field--label-hidden field--items"> <div class="field--item"><a href="/blog" hreflang="ja">Blog</a></div> </div> <section> <h2>コメントを追加</h2> <drupal-render-placeholder callback="comment.lazy_builders:renderForm" arguments="0=node&amp;1=95&amp;2=comment&amp;3=comment" token="ZYNxPiMsobBysQHKqCmjPtjvfpcaPueCkbQMvxeruQ0"></drupal-render-placeholder> </section> <div class="views-element-container form-group"><div class="view view-eva view-relation-article-list view-id-relation_article_list view-display-id-entity_view_1 js-view-dom-id-a9c028f40f9b32b3c236618469a12f52c3d74e6aefb9780b907a0bfdcfa9a5e9"> <header> <h4>あわせて読みたい記事はこちら</h4> </header> <div id="views-bootstrap-relation-article-list-entity-view-1--7" class="grid views-view-grid"> <div class="row"> <div class="col-auto col-sm-auto col-md-6 col-lg-6 col-xl-6"> <div class="views-field views-field-title"><span class="field-content"><a href="/blog/code-linux/article_27" hreflang="ja">CentOS7にChromeをインストールする</a></span></div><div class="views-field views-field-field-kanban"><div class="field-content"><p><a href="https://optimal-sdw.com/blog/code-linux/article_27"><img alt="article_27_eye_catch" data-entity-type="file" data-entity-uuid="76b75cf4-86c5-4675-b7e5-8db9a4cc9543" src="/sites/default/files/inline-images/article_27.png" style="max-height:720px;max-width:1280px;width:100%;height:100%;object-fit:cover;" width="1920" height="726" loading="lazy" /></a></p> <p> </p> </div></div> </div> <div class="col-auto col-sm-auto col-md-6 col-lg-6 col-xl-6"> <div class="views-field views-field-title"><span class="field-content"><a href="/blog/code-php/article_28" hreflang="ja">CentOS環境にPHPをインストールする方法</a></span></div><div class="views-field views-field-field-kanban"><div class="field-content"><p><a href="https://optimal-sdw.com/blog/code-php/article_28"><img alt="article_28_eye_catch" data-entity-type="file" data-entity-uuid="721ecbfe-3333-40ac-a8cd-2307951da4d4" src="/sites/default/files/inline-images/article_28.jpg" style="max-height:720px;max-width:1280px;width:100%;height:100%;object-fit:cover;" width="1920" height="861" loading="lazy" /></a></p> <p> </p> </div></div> </div> <div class="col-auto col-sm-auto col-md-6 col-lg-6 col-xl-6"> <div class="views-field views-field-title"><span class="field-content"><a href="/blog/code-linux/article_40" hreflang="ja">【yumの基本】CentOS環境でyumを使ってソフトウェアをインストール、アンインストールしたり、インストール済みライブラリを調べたりする方法</a></span></div><div class="views-field views-field-field-kanban"><div class="field-content"><p><a href="https://optimal-sdw.com/blog/code-linux/article_40"><img alt="article_40_eye_catch" data-entity-type="file" data-entity-uuid="4ec1f3fd-655b-4f57-81b3-133c2138324c" src="/sites/default/files/inline-images/article_40_0.jpg" style="max-height:720px;max-width:1280px;width:100%;height:100%;object-fit:cover;" width="1920" height="680" loading="lazy" /></a></p> <p> </p> </div></div> </div> </div> </div> </div> </div> Wed, 27 May 2020 16:35:50 +0000 @optimal-sdw.com 95 at http://optimal-sdw.com http://optimal-sdw.com/blog/code-linux/article_95#comments 【Hyper-V】ホストOSからCentOS7のデスクトップにファイルをコピペする方法(クリップボード共有) http://optimal-sdw.com/blog/code-virtual-technology/article_94 <span>【Hyper-V】ホストOSからCentOS7のデスクトップにファイルをコピペする方法(クリップボード共有)</span> <span><span lang="" about="/banana_people/1" typeof="schema:Person" property="schema:name" datatype="">@optimal-sdw.com</span></span> <span>2020/04/19(日) - 16:42</span> <div class="field field--name-field-last-update field--type-datetime field--label-above"> <div class="field--label">更新日時</div> <div class="field--item"><time datetime="2020-04-25T19:42:47Z">2020/04/26(日) - 04:42</time> </div> </div> <div class="field field--name-field-kanban field--type-text-long field--label-hidden field--item"><p><a href="https://optimal-sdw.com/blog/code-virtual-technology/article_94"><img alt="article_94_eye_catch" data-entity-type="file" data-entity-uuid="e3d3e342-f28b-450f-909d-8e0f488cfbae" src="/sites/default/files/inline-images/article_94.jpg" style="max-height:720px;max-width:1280px;width:100%;height:100%;object-fit:cover;" width="1920" height="747" loading="lazy" /></a></p> <p> </p> </div> <div class="field field--name-body field--type-text-with-summary field--label-hidden field--item"><p>当該記事では、Hyper-Vで構築したCentOS7環境にxrdp経由でアクセスすることで、ホストOSであるWindows環境からCentOS環境へファイルをコピペする方法をご紹介致します。</p> <p><a href="https://optimal-sdw.com/blog/code-virtual-technology/article_24">「続:Hyper-VでCentOS7環境を作る」</a>でHyper-Vで構築したCentOS7環境にxrdpを使ってアクセスすることでファイル共有できるようにする方法をご紹介致しましたが、xrdp 0.9.11では不具合の為接続できませんでした。</p> <p>2020年4月19日現在ではxrdpのバージョンは0.9.13となっており、hvsockを利用したアクセスに関する不具合は解消しております。</p> <p>上記の記事で記載した設定はxrdp 0.9.10での設定方法になりますので、そのまま残し、新しい設定方法は本記事でご紹介致します。</p> <p> </p> <hr /><h2 id="sec01">xrdp, xorgxrdpのインストール</h2> <hr /><p> </p> <p>前回の記事のおさらいです。CentOS7のインストール手順は省きます。Hyper-Vの使い勝手を良くするためにファイル共有と解像度共有をリモートデスクトップ接続を使って仮想マシン接続することで実現するため、CentOS7にxrdpとxorgxrdpをインストールします。</p> <p>基本的にrootユーザでの作業になります。su - root でrootユーザになってから作業します。</p> <p> </p> <p>・yumの更新と必要な開発ツールのインストール</p> <pre> <code class="language-xml"># yum -y install finger cmake patch gcc make autoconf libtool automake pkgconfig openssl-devel gettext file pam-devel libX11-devel libXfixes-devel libjpeg-devel flex bison gcc-c++ libxslt perl-libxml-perl xorg-x11-font-utils xmlto-tex git libXrandr-devel nasm xorg-x11-server-devel xorg-x11-server-Xorg libXfont2-devel</code></pre> <p> </p> <p>・gitからxrdp, xorgxrdp のダウンロード</p> <pre> <code class="language-xml"># cd # mkdir git # cd git # mkdir neutrinolabs # cd neutrinolabs # git clone --recursive https://github.com/neutrinolabs/xrdp.git # git clone https://github.com/neutrinolabs/xorgxrdp.git </code></pre> <p> </p> <p>・xrdpのインストール</p> <p>※ vsock, fuse, ipv6以外はオプションで。</p> <pre> <code class="language-xml"># cd xrdp # ./bootstrap # ./configure --enable-vsock --enable-fuse --enable-ipv6 --enable-jpeg --enable-pixman --enable-pam # make # make install</code></pre> <p> </p> <p>・xorgxrdpのインストール</p> <pre> <code class="language-xml"># cd xorgxrdp # ./bootstrap # ./configure XRDP_CFLAGS=-I~/git/neutrino/xrdp/common XRDP_LIBS=" " # make # make install </code></pre> <p> </p> <hr /><h2 id="sec02">xrdp, xorgxrdpの設定、およびその他の関連する設定作業</h2> <hr /><p> </p> <p>・xrdp.iniの設定</p> <p>xrdp.iniを編集します。【before】のパラメータが変更対象です。【after】以下のように修正します。</p> <p>xrdp 0.9.10との違いはportにvsockを指定し、use_vsockパラメータはfalseのままにすること、max_bppも32のままで問題無いことです。</p> <pre> <code class="language-xml"># cd /etc/xrdp # vi xrdp.ini</code></pre> <p>【before】<br /> port=3389<br /> security_layer=negotiate<br /> crypt_level=high<br /> bitmap_compression=true</p> <p> </p> <p>【after】<br /> port=vsock://-1:3389<br /> security_layer=rdp<br /> crypt_level=none<br /> bitmap_compression=false</p> <p> </p> <p>・sesman.iniの設定</p> <p>sesman.iniを編集します。【before】のパラメータが変更対象です。【after】以下のように修正します。</p> <pre> <code class="language-xml"># vi sesman.ini</code></pre> <p>【before】<br /> X11DisplayOffset=10<br /> FuseMountName=thinclient_drives</p> <p> </p> <p>【after】<br /> X11DisplayOffset=0<br /> FuseMountName=shared_drives</p> <p> </p> <p>・Xwrapper.configファイルの作成</p> <p>Xwrapper.configファイルを作成します。</p> <pre> <code class="language-xml"># echo "allowed_users=anybody" &gt; /etc/X11/Xwrapper.config</code></pre> <p> </p> <p>・hv_sock.confファイルの作成</p> <p>hv_sock.confファイルを作成します。</p> <pre> <code class="language-xml"># echo "hv_sock" &gt; /etc/modules-load.d/hv_sock.conf</code></pre> <p> </p> <p>・xrdp session カラープロファイルの作成</p> <pre> <code class="language-xml"># vi /etc/polkit-1/localauthority/50-local.d/45-allow-colord.pkla</code></pre> <pre> <code class="language-xml">[Allow Colord all Users] Identity=unix-user:* Action=org.freedesktop.color-manager.create-device;org.freedesktop.color-manager.create-profile;org.freedesktop.color-manager.delete-device;org.freedesktop.color-manager.delete-profile;org.freedesktop.color-manager.modify-device;org.freedesktop.color-manager.modify-profile ResultAny=no ResultInactive=no ResultActive=yes</code></pre> <p> </p> <p>・日本語キーボードの設定</p> <pre> <code class="language-xml"># cd /etc/xrdp # curl https://www.mail-archive.com/xrdp-devel@lists.sourceforge.net/msg00263/km-e0010411.ini &gt; km-e0010411.ini # cp km-e0010411.ini /etc/xrdp/km-0411.ini # cp km-e0010411.ini /etc/xrdp/km-e0200411.ini # cp km-e0010411.ini /etc/xrdp/km-e0210411.ini</code> </pre> <p> </p> <p>・ファイヤーウォールの設定</p> <pre> <code class="language-xml"># firewall-cmd --permanent --add-port=3389/tcp # firewall-cmd --permanent --add-port=3389/udp # firewall-cmd --reload</code></pre> <p> </p> <p>・SELinuxの設定</p> <p>※ SELinuxはひとまずpermissiveにして、エラー情報だけ捕捉するようにします。</p> <p>SELinux Trouble shooterで表示されるxrdpに関するエラーを解消し、そのあとenforcingに戻すと良いと思います。</p> <pre> <code class="language-xml"># vi /etc/selinux/config</code> </pre> <p>【before】<br /> SELINUX=enforcing</p> <p> </p> <p>【after】<br /> SELINUX=permissive</p> <p> </p> <p>・サービスの自動起動設定</p> <pre> <code class="language-xml"># systemctl enable xrdp # systemctl enable xrdp-sesman # systemctl start xrdp-sesman # systemctl start xrdp </code></pre> <p> </p> <p>あとはCentOSを一度シャットダウンして、PowerShellから以下のコマンドを実行し、仮想マシンの再起動と接続をするのみです。</p> <p>【Power Shell】</p> <pre> <code class="language-powershell">Set-VM -VMName "仮想マシンの名称" -EnhancedSessionTransportType HvSocket</code></pre> <p> </p> <hr /><h2 id="sec03">Hyper-VからのCentOS7起動</h2> <hr /><p>Hyper-VマネージャーからCentOSへ接続すると、CentOSの起動とともに解像度や共有オプションの画面が表示されます。</p> <p>これにより解像度が低解像度に固定されていた問題が解消されます。</p> <p><img alt="centos_access" data-entity-type="file" data-entity-uuid="2864fb25-146b-45c2-a821-9bb06a495df5" src="/sites/default/files/inline-images/centos_access.png" style="max-width:400px;width:100%;height:100%;" width="411" height="340" loading="lazy" /></p> <p>接続ボタンをクリックするとxrdpのログインフォームが開きます。</p> <p><img alt="centos_xrdp_login_form" data-entity-type="file" data-entity-uuid="84fa723a-8b95-4548-8b98-18d0c815ec9f" src="/sites/default/files/inline-images/centos_xrdp_login_form.png" style="max-width:400px;width:100%;height:100%;" width="384" height="272" loading="lazy" /></p> <p>Xorgを選択して、CentOSのユーザとパスワードを指定してログインします。</p> <p> </p> <p><img alt="centos_xvnc_login" data-entity-type="file" data-entity-uuid="3e173059-5013-417b-b8c3-8501ce58c758" src="/sites/default/files/inline-images/centos_xvnc_login.png" style="max-width:400px;width:100%;height:100%;" width="384" height="272" loading="lazy" /></p> <p> </p> <p>この状態でホストOSからファイルをコピーして、CentOSのデスクトップにファイルを貼り付けることができます。</p> <p> </p> <p>以上です。</p> </div> <div class="field field--name-field-blog-category field--type-entity-reference field--label-above"> <div class="field--label">カテゴリ</div> <div class="field--items"> <div class="field--item"><a href="/blog/code" hreflang="ja">Code</a></div> <div class="field--item"><a href="/blog/code-virtual-technology" hreflang="ja">Virtual technology</a></div> </div> </div> <div class="field field--name-field-tags field--type-entity-reference field--label-hidden field--items"> <div class="field--item"><a href="/blog" hreflang="ja">Blog</a></div> </div> <section> <h2>コメントを追加</h2> <drupal-render-placeholder callback="comment.lazy_builders:renderForm" arguments="0=node&amp;1=94&amp;2=comment&amp;3=comment" token="2tmngiNG-EW7H0lXIF0A4fGR99wKDMkXAtGRvEZoY8w"></drupal-render-placeholder> </section> <div class="views-element-container form-group"><div class="view view-eva view-relation-article-list view-id-relation_article_list view-display-id-entity_view_1 js-view-dom-id-4c47eda8a4f0bd80cfe1c25bbf52961a599bd10775be5de61e3c1f5e92479920"> <header> <h4>あわせて読みたい記事はこちら</h4> </header> <div id="views-bootstrap-relation-article-list-entity-view-1--8" class="grid views-view-grid"> <div class="row"> <div class="col-auto col-sm-auto col-md-6 col-lg-6 col-xl-6"> <div class="views-field views-field-title"><span class="field-content"><a href="/blog/code-virtual-technology/article_17" hreflang="ja">Hyper-VでCentOS7環境を作る</a></span></div><div class="views-field views-field-field-kanban"><div class="field-content"><p><a href="https://optimal-sdw.com/blog/code-virtual-technology/article_17"><img alt="article_17_eye_catch" data-entity-type="file" data-entity-uuid="a9c6c3e5-728f-4a73-966c-eeda7a3b7717" src="/sites/default/files/inline-images/article_17.jpg" style="max-height:720px;max-width:1280px;width:100%;height:100%;object-fit:cover;" width="1920" height="824" loading="lazy" /></a></p> <p> </p> </div></div> </div> <div class="col-auto col-sm-auto col-md-6 col-lg-6 col-xl-6"> <div class="views-field views-field-title"><span class="field-content"><a href="/blog/code-virtual-technology/article_24" hreflang="ja">続:Hyper-VでCentOS7環境を作る</a></span></div><div class="views-field views-field-field-kanban"><div class="field-content"><p><a href="https://optimal-sdw.com/blog/code-virtual-technology/article_24"><img alt="article_24_eye_catch" data-entity-type="file" data-entity-uuid="9e5811a7-e51f-4e43-9725-f848b5db21c4" src="/sites/default/files/inline-images/article_24.jpg" style="max-height:720px;max-width:1280px;width:100%;height:100%;object-fit:cover;" width="1920" height="716" loading="lazy" /></a></p> <p> </p> </div></div> </div> </div> </div> </div> </div> Sun, 19 Apr 2020 07:42:47 +0000 @optimal-sdw.com 94 at http://optimal-sdw.com http://optimal-sdw.com/blog/code-virtual-technology/article_94#comments 【Java】gzipやwgetなどの外部プロセスを実行する方法 http://optimal-sdw.com/blog/code-java/article_93 <span>【Java】gzipやwgetなどの外部プロセスを実行する方法</span> <span><span lang="" about="/banana_people/1" typeof="schema:Person" property="schema:name" datatype="">@optimal-sdw.com</span></span> <span>2020/03/23(月) - 00:57</span> <div class="field field--name-field-last-update field--type-datetime field--label-above"> <div class="field--label">更新日時</div> <div class="field--item"><time datetime="2020-03-22T15:57:50Z">2020/03/23(月) - 00:57</time> </div> </div> <div class="field field--name-field-kanban field--type-text-long field--label-hidden field--item"><p><a href="https://optimal-sdw.com/blog/code-java/article_93"><img alt="article_93_eye_catch" data-entity-type="file" data-entity-uuid="e2b087b6-9130-4221-9a8b-dc9c00f0f2fb" src="/sites/default/files/inline-images/article_93.jpg" style="max-height:720px;max-width:1280px;width:100%;height:100%;object-fit:cover;" width="1920" height="925" loading="lazy" /></a></p> <p> </p> </div> <div class="field field--name-body field--type-text-with-summary field--label-hidden field--item"><p>Javaで外部プロセスを実行する方法についてご紹介いたします。</p> <p>例えばgzipコマンドやwget、curlコマンド、nkfコマンド等の外部プロセスを実行する方法になります。</p> <p>これらの外部プロセスをJavaから利用する際の注意点としましては、実装方法次第でお見合い(デッドロック)状態となってしまう可能性があることです。</p> <p>外部プロセスの標準出力、標準エラーがバッファサイズを超えてしまう可能性があり、そのような状況になると外部プロセスは標準出力への出力ができず、待ち状態となってしまいます。</p> <p>また、Javaプログラム上で外部プロセスの終了を待つようにしていると、外部プロセスはバッファが空くのを待っており、Javaプログラム側はプロセス終了を待っているという状態になってしまう可能性があります。</p> <p>それらの状況を回避することを考慮した実装方法をご紹介いたします。</p> <p> </p> <hr /><h2 id="sec01">実装方法概要</h2> <hr /><p>Java1.4以前はRuntimeを利用しておりましたが、1.5以降からはRuntimeクラスではなくProcessBuilderクラスが推奨されます。</p> <p>外部プロセスを実行する場合、外部プロセスの標準出力、標準エラーはProcessクラスのInputStreamクラスが受け手になります。</p> <p>このInputStreamクラスを読み込まずにいると、外部プロセスの標準出力、標準エラーがバッファサイズを超えてしまう可能性があり、そのような状況になると外部プロセスは標準出力への出力ができずに待ち状態が続く原因となります。</p> <p>さらにJavaプログラム上で外部プロセスの終了を待つようにしていると、外部プロセスはバッファが空くのを待っており、Javaプログラム側はプロセス終了を待っているというデッドロックが発生します。</p> <p>従って、外部プロセスを実行する場合は標準出力と標準エラーをJava側で読み込むようにするか、そもそもファイルへ出力するなど、外部プロセスの標準出力、標準エラー出力が待ち状態とならないように工夫する必要があります。</p> <p> </p> <hr /><h2 id="sec02">Javaで外部プロセスを実行するサンプル(1)</h2> <hr /><p>外部プロセスを実行するサンプルコードです。</p> <p>標準出力、標準エラーをJavaと同じ標準出力、標準エラーに出力する場合は以下のようになります。</p> <p>外部プロセスの実行内容がJavaのログに残るため、外部プロセスの実行内容を取得する必要が無い場合はこちらが良いかもしれません。</p> <pre> <code class="language-java">public static void main(String[] args) { java.io.File dir = new File("/tmp"); String[] Command = {"tar","cvzf", "test.tar.gz", "test"}; long timeOutSec = 5 * 60; // 5分でタイムアウト boolean isFinished = processDone(Command, dir, timeOutSec); } public static boolean processDone(String[] Command, File dir, long timeOutSec) { List&lt;String&gt; cmdArray = Arrays.asList(Command); ProcessBuilder builder = new ProcessBuilder(cmdArray); // 作業ディレクトリ builder.directory(dir); // 標準エラーを標準出力へ統合 builder.redirectErrorStream(true); // Javaと同じ標準出力に統合 builder.inheritIO(); Process p = null; boolean isFinished = false; try { p = builder.start(); isFinished = p.waitFor(timeOutSec, TimeUnit.SECONDS); // プロセスが正常終了するまで待機 } catch (InterruptedException e) { System.out.println(e.getMessage()); } catch (IOException e) { System.out.println(e.getMessage()); } finally { if (Objects.nonNull(p) &amp;&amp; p.isAlive()) { p.destroy(); } } return isFinished; }</code></pre> <p> </p> <hr /><h2 id="sec03">Javaで外部プロセスを実行するサンプル(2)</h2> <hr /><p>外部プロセスを実行するサンプルコードです。</p> <p>標準出力、標準エラーをファイルに出力する場合は以下のようになります。</p> <p>外部プロセスの実行内容がファイルに残るため、外部プロセスの実行内容を取得する場合やJavaのログとは分離して管理したい場合はこちらが良いと思います。</p> <pre> <code class="language-java">public static void main(String[] args) { java.io.File dir = new File("/tmp"); String[] Command = {"tar","cvzf", "test.tar.gz", "test"}; long timeOutSec = 5 * 60; // 5分でタイムアウト boolean isFinished = processDone(Command, dir, timeOutSec); } public static boolean processDone(String[] Command, File dir, long timeOutSec) { List&lt;String&gt; cmdArray = Arrays.asList(Command); ProcessBuilder builder = new ProcessBuilder(cmdArray); // 作業ディレクトリ builder.directory(dir); // 標準エラーを標準出力へ統合 builder.redirectErrorStream(true); // logファイルに出力 File log = new File("command.log"); builder.redirectOutput(log); // builder.redirectOutput(Redirect.appendTo(log)); // ファイルへ追記の場合 Process p = null; boolean isFinished = false; try { p = builder.start(); isFinished = p.waitFor(timeOutSec, TimeUnit.SECONDS); // プロセスが正常終了するまで待機 } catch (InterruptedException e) { System.out.println(e.getMessage()); } catch (IOException e) { System.out.println(e.getMessage()); } finally { if (Objects.nonNull(p) &amp;&amp; p.isAlive()) { p.destroy(); } } return isFinished; }</code></pre> <p> </p> <hr /><h2 id="sec04">Javaで外部プロセスを実行するサンプル(3)</h2> <hr /><p>外部プロセスを実行するサンプルコードです。</p> <p>以下のサンプルは標準出力と標準エラーの出力先をProcessのInputStreamに設定し、読み込み内容を破棄しています。</p> <p>外部プロセスが実行できればよく、出力内容は全く不要の場合はこちらでも良いと思います。</p> <p>しかしながら、出力内容が不要な場合、上記(1)、(2)のいずれかでも問題無く、わざわざ読み込んで破棄する方法を選択する必要は無いと思います。外部プロセスの出力結果をJavaプログラム上で利用したい場合も直接Streamを読み込むより、ファイルに出力した内容を読み込むほうが外部プロセスの結果が残るので良いと思います。</p> <pre> <code class="language-java">public static void main(String[] args) { java.io.File dir = new File("/tmp"); String[] Command = {"tar","cvzf", "test.tar.gz", "test"}; long timeOutSec = 5 * 60; // 5分でタイムアウト boolean isFinished = processDone(Command, dir, timeOutSec); } public static boolean processDone(String[] Command, File dir, long timeOutSec) { List&lt;String&gt; cmdArray = Arrays.asList(Command); ProcessBuilder builder = new ProcessBuilder(cmdArray); // 作業ディレクトリ builder.directory(dir); // 標準エラーを標準出力へ統合 builder.redirectErrorStream(true); boolean isFinished = false; try { Process p = builder.start(); try { new Thread(() -&gt; { try (InputStream is = p.getInputStream()) { // 読み込むだけで何もしない while (is.read() &gt;= 0); } catch (IOException e) { throw new UncheckedIOException(e); } } ).start(); isFinished = p.waitFor(timeOutSec, TimeUnit.SECONDS); // プロセスが正常終了するまで待機 } catch (InterruptedException e) { System.out.println(e.getMessage()); } finally { if (p.isAlive()) { p.destroy(); } } } catch (IOException e) { System.out.println(e.getMessage()); } return isFinished; }</code> </pre> <p> </p> <hr /><h2 id="sec05">まとめ</h2> <hr /><p>Javaで外部プロセスを実行する場合はProcessBuilderクラスを利用します。</p> <p>外部プロセスの標準出力、標準エラーの出力先をJavaの標準出力へ統合するか、個別のlogファイルに出力するようにして、外部プロセスが標準出力、標準エラーを出力できるようにします。</p> <pre> <code class="language-java">ProcessBuilder builder = new ProcessBuilder(cmdArray); // まずは標準エラーを標準出力へ統合する builder.redirectErrorStream(true); // ファイルへ出力する場合はログファイルを指定する File log = new File("command.log"); builder.redirectOutput(log);</code></pre> <p> </p> <pre> <code class="language-java">ProcessBuilder builder = new ProcessBuilder(cmdArray); // まずは標準エラーを標準出力へ統合する builder.redirectErrorStream(true); // Javaの標準出力へ統合する場合 builder.inheritIO();</code></pre> <p> </p> <p>以上</p> </div> <div class="field field--name-field-blog-category field--type-entity-reference field--label-above"> <div class="field--label">カテゴリ</div> <div class="field--items"> <div class="field--item"><a href="/blog/code" hreflang="ja">Code</a></div> <div class="field--item"><a href="/blog/code-java" hreflang="ja">Java</a></div> </div> </div> <div class="field field--name-field-tags field--type-entity-reference field--label-hidden field--items"> <div class="field--item"><a href="/blog" hreflang="ja">Blog</a></div> </div> <section> <h2>コメントを追加</h2> <drupal-render-placeholder callback="comment.lazy_builders:renderForm" arguments="0=node&amp;1=93&amp;2=comment&amp;3=comment" token="m8WJdp0OwOP8hHc_vuOeCCceEyWgsmUzNOJuoeOf-H4"></drupal-render-placeholder> </section> <div class="views-element-container form-group"><div class="view view-eva view-relation-article-list view-id-relation_article_list view-display-id-entity_view_1 js-view-dom-id-a94115773517e43c6316b97817617a7c7cf5959d96e0148615ce15e31820a13a"> <header> <h4>あわせて読みたい記事はこちら</h4> </header> <div id="views-bootstrap-relation-article-list-entity-view-1--9" class="grid views-view-grid"> <div class="row"> <div class="col-auto col-sm-auto col-md-6 col-lg-6 col-xl-6"> <div class="views-field views-field-title"><span class="field-content"><a href="/blog/code-java/article_90" hreflang="ja">【Java】Google Drive APIで大きいサイズのファイルをダウンロードする方法</a></span></div><div class="views-field views-field-field-kanban"><div class="field-content"><p><a href="https://optimal-sdw.com/blog/code-java/article_90"><img alt="article_90_eye_catch" data-entity-type="file" data-entity-uuid="fe390087-a4ea-4c93-afd6-5e5216feaaa0" src="/sites/default/files/inline-images/article_90.jpg" style="max-height:720px;max-width:1280px;width:100%;height:100%;object-fit:cover;" width="1920" height="765" loading="lazy" /></a></p> <p> </p> </div></div> </div> </div> </div> </div> </div> Sun, 22 Mar 2020 15:57:50 +0000 @optimal-sdw.com 93 at http://optimal-sdw.com http://optimal-sdw.com/blog/code-java/article_93#comments 【PHP】ファイルダウンロード処理を記述する場合の注意点 http://optimal-sdw.com/blog/code-php/article_92 <span>【PHP】ファイルダウンロード処理を記述する場合の注意点</span> <span><span lang="" about="/banana_people/1" typeof="schema:Person" property="schema:name" datatype="">@optimal-sdw.com</span></span> <span>2020/03/22(日) - 21:48</span> <div class="field field--name-field-last-update field--type-datetime field--label-above"> <div class="field--label">更新日時</div> <div class="field--item"><time datetime="2020-03-22T12:48:59Z">2020/03/22(日) - 21:48</time> </div> </div> <div class="field field--name-field-kanban field--type-text-long field--label-hidden field--item"><p><a href="https://optimal-sdw.com/blog/code-php/article_92"><img alt="article_92_eye_catch" data-entity-type="file" data-entity-uuid="9dfbec5b-ebc2-4e67-9646-1cc2a0001eaf" src="/sites/default/files/inline-images/article_92.jpg" style="max-height:720px;max-width:1280px;width:100%;height:100%;object-fit:cover;" width="1920" height="899" loading="lazy" /></a></p> <p> </p> </div> <div class="field field--name-body field--type-text-with-summary field--label-hidden field--item"><p>PHPにおけるファイルダウンロード処理のサンプルを紹介致します。</p> <p>PHPでファイルダウンロードをする際、ファイルサイズが小さければさほど問題になりませんが、大きなファイルをダウンロードする場合はバッファリングに注意する必要があります。</p> <p>実装方法次第ではPHPに割り当てられたメモリでは処理できず、ファイルダウンロードに失敗します。</p> <p>簡単なテストではなかなか気付かないため、予め知っておくと他の言語においても同様の注意を払うようになります。</p> <p> </p> <hr /><h2 id="sec01">ファイルダウンロード処理のサンプル</h2> <hr /><p>ファイルダウンロード処理のサンプルコードになります。</p> <pre> <code class="language-php">function download($dir, $file_name, $rename, $mime_type) { // ex. dir: /tmp/download/ // ex. file_name: test.pdf $fullpath = $dir . $file_name; // ファイルを読み込みできない場合はエラー if (!is_readable($fullpath)) { die($fullpath); } // mimeタイプの指定が無い場合はoctet-streamを設定 if (empty($mime_type)) { $mime_type = "application/octet-stream"; } // ダウンロードファイル名の設定 if (empty($rename)) { $rename = $file_name; } // Content-Typeにmimeタイプを設定 header('Content-Type: ' . $mimeType); // mimeタイプの自動判定の抑止 header('X-Content-Type-Options: nosniff'); // ダウンロードファイルのサイズ header('Content-Length: ' . filesize($fullpath)); // ダウンロード時のファイル名 header('Content-Disposition: attachment; filename="' . $rename . '"'); // 出力バッファリングをすべて無効化する while (ob_get_level()) { ob_end_clean(); } // 出力 readfile($fullpath); exit; }</code> </pre> <p>ダウンロード対象のファイル名はサーバー上のテンポラリフォルダ内で一意となる文字列を使っていることが多いと思います。</p> <p>そのため、rename変数にダウンロード時のファイル名を渡すことで、サーバー上のファイル名とは異なるファイル名でダウンロードさせることができます。</p> <p>readfileの直前にバッファリングを無効化しております。</p> <p>これがないと大きなサイズのファイルをダウンロードする際に、ファイル内容をすべてバッファに読み込もうとしてしまい、バッファサイズを超えてしまった場合はエラーになってしまいます。</p> <p>公式のマニュアルにも注意書きされているので詳細はこちらをご参照ください。</p> <p><a href="https://www.php.net/manual/ja/function.readfile.php" rel="noopener noreferrer nofollow" target="_blank">公式マニュアル(readfile)</a></p> <p>意識していないと忘れがちな部分であり、テスト時に小さなサイズのファイルばかり試していると気づかない部分ですので、異なる言語を扱う際もバッファリングされるかどうかに注意しましょう。</p> <p>以上です。</p> </div> <div class="field field--name-field-blog-category field--type-entity-reference field--label-above"> <div class="field--label">カテゴリ</div> <div class="field--items"> <div class="field--item"><a href="/blog/code" hreflang="ja">Code</a></div> <div class="field--item"><a href="/blog/code-php" hreflang="ja">PHP</a></div> </div> </div> <div class="field field--name-field-tags field--type-entity-reference field--label-hidden field--items"> <div class="field--item"><a href="/blog" hreflang="ja">Blog</a></div> </div> <section> <h2>コメント</h2> <article data-comment-user-id="0" id="comment-2" about="/comment/2" typeof="schema:Comment" class="js-comment"> <mark class="hidden" data-comment-timestamp="1600701311"></mark> <footer> <article typeof="schema:Person" about="/banana_people/0"> </article> <p><span rel="schema:author"><span lang="" typeof="schema:Person" property="schema:name" datatype="">匿名 (未認証ユーザー)</span> が 2020/08/26(水) - 17:07 に投稿</span> <span property="schema:dateCreated" content="2020-08-26T08:07:58+00:00" class="hidden"></span> </p> <a href="/comment/2#comment-2" hreflang="ja">パーマリンク</a> </footer> <div> <h3 property="schema:name" datatype=""><a href="/comment/2#comment-2" class="permalink" rel="bookmark" hreflang="ja">変数名の指摘</a></h3> <div property="schema:text" class="field field--name-comment-body field--type-text-long field--label-hidden field--item"><p>if (!is_readable($file_path)) { die($fullpath); }<br /> は<br /> if (!is_readable($fullpath)) { die($fullpath); }<br /> の間違いですかね。</p> </div> <drupal-render-placeholder callback="comment.lazy_builders:renderLinks" arguments="0=2&amp;1=default&amp;2=ja&amp;3=" token="7OAx7JI9dMyaaReEQk4KGIjN80NpRfh_3ze9FE2ncc8"></drupal-render-placeholder> </div> </article> <div class="indented"> <article data-comment-user-id="349" id="comment-7" about="/comment/7" typeof="schema:Comment" class="js-comment"> <mark class="hidden" data-comment-timestamp="1600814427"></mark> <footer> <article typeof="schema:Person" about="/banana_people/349"> </article> <p><span rel="schema:author"><span lang="" about="/banana_people/349" typeof="schema:Person" property="schema:name" datatype="">approver</span> が 2020/09/22(火) - 00:36 に投稿</span> <span property="schema:dateCreated" content="2020-09-21T15:36:19+00:00" class="hidden"></span> </p> <p class="visually-hidden"><span lang="" typeof="schema:Person" property="schema:name" datatype="">匿名 (未認証ユーザー)</span> による「<a href="/comment/2#comment-2" class="permalink" rel="bookmark" hreflang="ja">変数名の指摘</a>」への返信</p> <a href="/comment/7#comment-7" hreflang="ja">パーマリンク</a> </footer> <div> <h3 property="schema:name" datatype=""><a href="/comment/7#comment-7" class="permalink" rel="bookmark" hreflang="ja">Re: 変数名の指摘</a></h3> <div property="schema:text" class="field field--name-comment-body field--type-text-long field--label-hidden field--item"><p>ご指摘の通り変数名が間違っておりました。</p> <p>本文のサンプルは修正いたしました。</p> <p>よろしくお願いいたします。</p></div> <drupal-render-placeholder callback="comment.lazy_builders:renderLinks" arguments="0=7&amp;1=default&amp;2=ja&amp;3=" token="Ba8NtPw9WGxfH0b6RPo42rgPbBFcCKe15GKrz5YERBk"></drupal-render-placeholder> </div> </article> </div> <h2>コメントを追加</h2> <drupal-render-placeholder callback="comment.lazy_builders:renderForm" arguments="0=node&amp;1=92&amp;2=comment&amp;3=comment" token="g2PgVxDFSIuQKdkmVIeEepo1PoHZNpkHBYObCFNlw-g"></drupal-render-placeholder> </section> <div class="views-element-container form-group"><div class="view view-eva view-relation-article-list view-id-relation_article_list view-display-id-entity_view_1 js-view-dom-id-dd7eae105e9cf52f17d9e7d163f911533eb335f67ad38bccfddefbc76cfe6374"> <header> <h4>あわせて読みたい記事はこちら</h4> </header> <div id="views-bootstrap-relation-article-list-entity-view-1--10" class="grid views-view-grid"> <div class="row"> <div class="col-auto col-sm-auto col-md-6 col-lg-6 col-xl-6"> <div class="views-field views-field-title"><span class="field-content">- 関連記事はありません。 </span></div> </div> </div> </div> </div> </div> Sun, 22 Mar 2020 12:48:59 +0000 @optimal-sdw.com 92 at http://optimal-sdw.com http://optimal-sdw.com/blog/code-php/article_92#comments