<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Borikatsu</title>
    <description>The latest articles on DEV Community by Borikatsu (@borikatsu).</description>
    <link>https://dev.to/borikatsu</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1153645%2F4812b314-6a9e-48b2-af7b-4cd1987e33ef.png</url>
      <title>DEV Community: Borikatsu</title>
      <link>https://dev.to/borikatsu</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/borikatsu"/>
    <language>en</language>
    <item>
      <title>wsl2 の設定備忘録</title>
      <dc:creator>Borikatsu</dc:creator>
      <pubDate>Fri, 06 Oct 2023 12:06:49 +0000</pubDate>
      <link>https://dev.to/borikatsu/wsl2-noshe-ding-bei-wang-lu-1afk</link>
      <guid>https://dev.to/borikatsu/wsl2-noshe-ding-bei-wang-lu-1afk</guid>
      <description>&lt;p&gt;個人用備忘録。OS は Ubuntu 前提です&lt;/p&gt;




&lt;h2&gt;
  
  
  目次
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
root 以外のユーザをデフォルト起動ユーザにしたい

&lt;ul&gt;
&lt;li&gt;基本設定&lt;/li&gt;
&lt;li&gt;Windows Terminal での設定&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;
GUI の有効化

&lt;ul&gt;
&lt;li&gt;Chromiumのインストール&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;sshの鍵設定&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  root 以外のユーザをデフォルト起動ユーザにしたい
&lt;/h2&gt;

&lt;h3&gt;
  
  
  基本設定
&lt;/h3&gt;

&lt;p&gt;VSCode とかで wsl に接続した際にデフォルト起動ユーザを変更する方法。&lt;br&gt;
&lt;a href="https://learn.microsoft.com/en-us/windows/wsl/wsl-config#user-settings"&gt;公式の方法&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ubuntu にログインして conf の設定を変更するだけ&lt;br&gt;
※hoge の部分はユーザ名&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ sudo vi /etc/wsl.conf
[user]
default=hoge
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Windows Terminal での設定
&lt;/h3&gt;

&lt;p&gt;[設定] → [Ubuntu] → [コマンドライン]&lt;br&gt;
を開いて起動コマンドを変更する。&lt;br&gt;
※hoge の部分はユーザ名&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# デフォルト
C:\WINDOWS\system32\wsl.exe -d Ubuntu

# 変更後
C:\WINDOWS\system32\wsl.exe -d Ubuntu --user hoge
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  GUI の有効化
&lt;/h2&gt;

&lt;p&gt;Windows 10 から利用できるようになった Windows Subsystem for Linux GUI を利用。&lt;br&gt;&lt;br&gt;
最新版の wsl でなければ更新。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# 管理者権限が必要
&amp;gt; wsl --update

# バージョン確認
&amp;gt; wsl --version
WSL バージョン: 1.2.5.0
カーネル バージョン: 5.15.90.1
WSLg バージョン: 1.0.51 # GUI機能が利用可能
MSRDC バージョン: 1.2.3770
Direct3D バージョン: 1.608.2-61064218
DXCore バージョン: 10.0.25131.1002-220531-1700.rs-onecore-base2-hyp
Windows バージョン: 10.0.22621.2428
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;X11 アプリケーションをインストールして GUI が wsl から利用できるか確認。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ sudo apt update
$ sudo apt install -y x11-apps

電卓が起動すればWSLgを利用できる状態
$ xcalc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Chromiumのインストール
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo apt install -y libgtk2.0-0 libgtk-3-0 libnotify-dev libgconf-2-4 libnss3 libxss1 libasound2 libxtst6 xauth xvfb libgbm-dev fonts-ipafont
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  sshの鍵設定
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# keychain インストール
$ sudo apt-get install keychain

$ 起動設定
$ vi ~/.bashrc
/usr/bin/keychain -q --nogui $HOME/.ssh/id_rsa
source $HOME/.keychain/$HOST-sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>wsl</category>
    </item>
    <item>
      <title>クリーンアーキテクチャと DDD を意識したパッケージ構成についての思案</title>
      <dc:creator>Borikatsu</dc:creator>
      <pubDate>Sat, 16 Sep 2023 06:57:04 +0000</pubDate>
      <link>https://dev.to/borikatsu/kurinakitekutiyato-ddd-woyi-shi-sitapatukezigou-cheng-nituitenosi-an-29bp</link>
      <guid>https://dev.to/borikatsu/kurinakitekutiyato-ddd-woyi-shi-sitapatukezigou-cheng-nituitenosi-an-29bp</guid>
      <description>&lt;p&gt;プロジェクトを新しく始める時、既存のイケてないアプリケーションのリファクタリングを始めたい時、アプリケーションのパッケージ構成について頭を悩まされることが増えた。&lt;/p&gt;

&lt;p&gt;でも結局のところ、どういうパッケージ構成でアプリケーションを作ればいいのかわからない。何がベストなのかもわからない。&lt;/p&gt;

&lt;p&gt;そんな自分への備忘録&lt;/p&gt;




&lt;h1&gt;
  
  
  目次
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;クリーンアーキテクチャと DDD の違い&lt;/li&gt;
&lt;li&gt;そもそもなぜアーキテクチャ設計に考えを巡らせる必要があるのか&lt;/li&gt;
&lt;li&gt;構成案&lt;/li&gt;
&lt;li&gt;
各層の役割

&lt;ul&gt;
&lt;li&gt;インフラ層&lt;/li&gt;
&lt;li&gt;アプリケーション層&lt;/li&gt;
&lt;li&gt;ドメイン層&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;外部オブジェクトとの I/F について&lt;/li&gt;

&lt;li&gt;所感&lt;/li&gt;

&lt;/ul&gt;




&lt;h1&gt;
  
  
  クリーンアーキテクチャと DDD の違い
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://qiita.com/seiya2130/items/69801fc2637eef596137" rel="noopener noreferrer"&gt;クリーンアーキテクチャとは&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;コンポーネントをレイヤー毎に分割することで各レイヤの関心事を分離する&lt;/li&gt;
&lt;li&gt;各層の依存関係は内側へと向かう(内側に依存する)&lt;/li&gt;
&lt;li&gt;抽象的な interface を外側に向けて提供することで、制御の流れと依存関係を逆転させる&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;a href="https://x-tech.pasona.co.jp/media/detail.html?p=9208" rel="noopener noreferrer"&gt;DDD(ドメイン駆動設計)とは&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;アプリケーションが扱うビジネスにおける「知識」や「ルール」、「要求」をドメインモデルとして表現する&lt;/li&gt;
&lt;li&gt;ビジネスロジックを流出させないことで、ビジネスの成長と共にドメインモデルも習熟していく&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;クリーンアーキテクチャはアプリケーションの設計をどのように行うべきかを説く設計思想。&lt;/p&gt;

&lt;p&gt;一方、ドメイン駆動設計はアプリケーションにおけるドメインモデルを定義し、それをどのように成長させていくかに着目している開発手法。&lt;/p&gt;

&lt;p&gt;だと思っている。&lt;/p&gt;




&lt;h1&gt;
  
  
  そもそもなぜアーキテクチャ設計に考えを巡らせる必要があるのか
&lt;/h1&gt;

&lt;p&gt;具体化するために自問自答。&lt;/p&gt;

&lt;p&gt;Q. アーキテクチャ設計の必要性とは？&lt;br&gt;
A. 保守しやすいアプリケーションを作るため&lt;/p&gt;

&lt;p&gt;Q. 保守しやすいアプリケーションとは？&lt;br&gt;
A. コードのメンテナンス性が高い&lt;/p&gt;

&lt;p&gt;Q. メンテナンス性が高いコードとは？&lt;br&gt;
A. 各コードの責務が分離されており、変更を加えても影響範囲が小さいこと&lt;/p&gt;

&lt;p&gt;Q. より具体的には？&lt;br&gt;
A. ユニットテストが書きやすい&lt;/p&gt;

&lt;p&gt;なんとなく腑に落ちたので、ユニットテストが書きやすいアーキテクチャを目標にパッケージ構成を考えてみる。&lt;/p&gt;




&lt;h1&gt;
  
  
  構成案
&lt;/h1&gt;

&lt;p&gt;各層配下のディレクトリはドメイン単位で作成する。&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

root
├── application
│   └── usecase(ユースケースの実態)
│       └── mapper(プレゼンテーション層とアプリケーション層間のマッパー)
├── domain
│   ├── adapter(各層との緩衝材)
│   │   ├── in(ユースケースの抽象化)
│   │   │   └── input(ユースケースの入力用DTO)
│   │   └── out(インフラ層の操作の抽象化)
│   └── model(ドメインモデルの格納)
│       ├── entity(値オブジェクトなどの集合体)
│       └── value(値オブジェクトや区分オブジェクト)
├── infrastructure
│   ├── datasource(データベース)
│   │   ├── adapter(インフラ層の操作の実態)
│   │   ├── entity(ORM Entity)
│   │   ├── mapper(DTOへの変換)
│   │   └── repository(データベース操作の実態)
│   ├── externalapi(外部API)
│   │   ├── adapter
│   │   ├── config(WebClientのコンフィグ)
│   │   ├── mapper
│   │   ├── request
│   │   └── response
│   └── transfer(外部ストレージ)
└── presentation
    ├── controller
    │   ├── request
    │   └── response
    └── handler(コントローラー共通処理)


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h3&gt;
  
  
  参考
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://little-hands.hatenablog.com/entry/2017/10/11/075634" rel="noopener noreferrer"&gt;ドメイン駆動 + オニオンアーキテクチャ概略[DDD]&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://zenn.dev/morio_pg/articles/16777261720294644011" rel="noopener noreferrer"&gt;DDD を意識した際の package 構成&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://wkrzywiec.medium.com/ports-adapters-architecture-on-example-19cab9e93be7" rel="noopener noreferrer"&gt;Ports &amp;amp; Adapters architecture on example&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://qiita.com/gki/items/91386b082c57123f1ba0" rel="noopener noreferrer"&gt;Clean Architecture で分からなかったところを整理する&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;h1&gt;
  
  
  各層の役割
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flm8d3v8b64l5j1yb4c8r.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flm8d3v8b64l5j1yb4c8r.jpg" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;おなじみの図を元に考える。&lt;/p&gt;
&lt;h2&gt;
  
  
  インフラ層
&lt;/h2&gt;

&lt;p&gt;ORM で管理する 各データオブジェクトを entity に格納して repository で DB 操作を実装する。(ここでいう entity は DDD における entity ではない)&lt;/p&gt;

&lt;p&gt;例えば Spring Data JPA なら以下のような形。&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

@Entity
public class UserEntity {
  @Id
  @Column
  String id;

  @Column
  String name;
}

public interface UserRepository extends JpaRepository&amp;lt;UserEntity, String&amp;gt; {}



&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;repository から得られるデータはインフラ層のみが知るべき I/F であるため、mapper を介してドメイン層の I/F へ変換を行う adapter を実装することで インフラ層をドメイン層に依存させる。(依存性の逆転)&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

public class UserAdapterImpl implements UserAdapter {
    @Override
    public UserId save(User user) {
        UserEntity savedUser = userRepository.save(mapper.toEntity(user));
        return UserId.from(savedUser.getId());
    }
}


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h3&gt;
  
  
  datasource 以外のパッケージについて
&lt;/h3&gt;

&lt;p&gt;externalapi、transfer でも基本的な考えは同じ。&lt;/p&gt;

&lt;p&gt;外部との I/F を繋ぐ adapter をドメイン層に依存する形で定義し、entity となるクラスを用意して mapper で DTO へ変換する。&lt;/p&gt;

&lt;p&gt;例えば外部 API なら API の response が entity に当たり、外部ストレージなら Stream、IO などという具合。&lt;/p&gt;


&lt;h2&gt;
  
  
  アプリケーション層
&lt;/h2&gt;

&lt;p&gt;アプリケーションにおけるドメインオブジェクトのユースケースの定義。(ユーザーの登録、参照、更新、削除)&lt;/p&gt;

&lt;p&gt;プレゼンテーション層からの入力を受け付けるための I/F として input クラスをドメイン層に用意する。&lt;/p&gt;

&lt;p&gt;ユースケース単位にクラスを作成していき、handle や execute など共通メソッドを実装してプレゼンテーション層から利用する。&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

public class AddUserImpl implements AddUser {
    public UserId handle (AddUserInput input) {
        User user = User.from(input);
        return userAdapter.save(user);
    }
}


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;




&lt;h2&gt;
  
  
  ドメイン層
&lt;/h2&gt;

&lt;p&gt;隣接するアプリケーション層とインフラ層それぞれをドメイン層に依存させるためのインターフェースを定義する。&lt;/p&gt;

&lt;p&gt;具体的には、ヘキサゴナルアーキテクチャのポートアンドアダプターのようにアプリケーション層からの input とインフラ層への output を adapter という名称でパッケージを切る。&lt;/p&gt;

&lt;h3&gt;
  
  
  ドメインオブジェクトについて
&lt;/h3&gt;

&lt;h4&gt;
  
  
  value
&lt;/h4&gt;

&lt;p&gt;Enum などの区分オブジェクト や UserId などの値オブジェクトを表現する。&lt;br&gt;
(DDD における ValueObject)&lt;/p&gt;

&lt;h4&gt;
  
  
  entity
&lt;/h4&gt;

&lt;p&gt;値オブジェクトや区分オブジェクトの集合体としてドメインオブジェクトを構成する。&lt;br&gt;
(DDD における Entity)&lt;/p&gt;




&lt;h1&gt;
  
  
  レイヤー間の I/F について
&lt;/h1&gt;

&lt;p&gt;プレゼンテーション層からの入力値をそのままドメインオブジェクトに変換することは難しいが、インフラ層の ORM Entity をドメインオブジェクトに変換するのは比較的容易いと感じた。&lt;/p&gt;

&lt;p&gt;例えば、ユーザのドメインオブジェクトには名前とメールアドレスのフィールドがあるので DB にも 2 カラム定義している。&lt;/p&gt;

&lt;p&gt;しかし、ユースケースとしてはメールアドレスだけ登録すればユーザ登録が可能。名前は後から設定でも OK、というようなパターン。&lt;/p&gt;

&lt;p&gt;そのため、ユースケース用の専用 DTO を input として用意したが、インフラ層の DTO は ORM Entity から DDD Entity へ直接変換する構成を取った。&lt;/p&gt;

&lt;p&gt;また、構成を合わせるという意味では、ORM Entity の格納場所はインフラ層ではなくドメイン層の adapter/out 配下に定義するのが綺麗かとも考えたが、ORM の概念をドメイン層に持ち出したくなかったのでインフラ層側に entity を配置している。&lt;/p&gt;

&lt;p&gt;この点については運用しながら最適な構成を模索するような形で様子見をしたい。&lt;/p&gt;




&lt;h1&gt;
  
  
  所感
&lt;/h1&gt;

&lt;p&gt;これが正解であることはきっとないが、いったん今の自分が考えられるベストな構成であると思いたい。&lt;/p&gt;

&lt;p&gt;この構成を元にサンプル API アプリケーションを作って本当にテストコードが書きやすいのかを検証する。&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>ddd</category>
    </item>
    <item>
      <title>UbuntuにJavaの開発環境構築</title>
      <dc:creator>Borikatsu</dc:creator>
      <pubDate>Thu, 14 Sep 2023 12:09:18 +0000</pubDate>
      <link>https://dev.to/borikatsu/ubuntunijavanokai-fa-huan-jing-gou-zhu-2b1o</link>
      <guid>https://dev.to/borikatsu/ubuntunijavanokai-fa-huan-jing-gou-zhu-2b1o</guid>
      <description>&lt;p&gt;Ubuntu に Java(jdk)をインストールする。&lt;br&gt;
バージョン管理は apt の pkg マネージャーに任せる。&lt;/p&gt;

&lt;p&gt;会社の PC 設定する時に毎回調べたり、個人 PC の設定忘れがちなのでメモとして。&lt;/p&gt;




&lt;h2&gt;
  
  
  目次
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;やること&lt;/li&gt;
&lt;li&gt;jdk のインストール&lt;/li&gt;
&lt;li&gt;環境変数の設定&lt;/li&gt;
&lt;li&gt;バージョン切替するとき&lt;/li&gt;
&lt;li&gt;切替後の確認&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  やること
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;jdk インストール&lt;/li&gt;
&lt;li&gt;環境変数の設定&lt;/li&gt;
&lt;li&gt;バージョン切替&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;バージョン切替は付録的な話&lt;/p&gt;




&lt;h2&gt;
  
  
  jdk のインストール
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# 提供バージョンの確認
$ sudo apt search openjdk-.*-jdk$

# 利用するバージョンをインストール
## 11と17をインストール
$ sudo apt install -y openjdk-11-jdk openjdk-17-jdk

# インストール確認
$ java --version
openjdk 17.0.8.1 2023-08-24
OpenJDK Runtime Environment (build 17.0.8.1+1-Ubuntu-0ubuntu120.04)
OpenJDK 64-Bit Server VM (build 17.0.8.1+1-Ubuntu-0ubuntu120.04, mixed mode, sharing)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  環境変数の設定
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# profileに追記
$ echo '# JDK
JAVA_HOME=$(readlink -f /usr/bin/javac | sed "s:/bin/javac::")
export JAVA_HOME
PATH=$PATH:$JAVA_HOME/bin
export PATH' | tee -a ~/.profile &amp;gt; /dev/null

# 再読み込み
$ source ~/.profile
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  バージョン切替するとき
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# 現在のバージョン
$ java --version
openjdk 17.0.8.1 2023-08-24
OpenJDK Runtime Environment (build 17.0.8.1+1-Ubuntu-0ubuntu120.04)
OpenJDK 64-Bit Server VM (build 17.0.8.1+1-Ubuntu-0ubuntu120.04, mixed mode, sharing)

# 切り替え可能なバージョン
$ sudo update-java-alternatives --list
java-1.11.0-openjdk-amd64      1111       /usr/lib/jvm/java-1.11.0-openjdk-amd64
java-1.17.0-openjdk-amd64      1711       /usr/lib/jvm/java-1.17.0-openjdk-amd64

# 11に切替
$ sudo update-java-alternatives --set java-1.11.0-openjdk-amd64
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  切替後の確認
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ java --version
openjdk 11.0.20.1 2023-08-24
OpenJDK Runtime Environment (build 11.0.20.1+1-post-Ubuntu-0ubuntu120.04)
OpenJDK 64-Bit Server VM (build 11.0.20.1+1-post-Ubuntu-0ubuntu120.04, mixed mode, sharing)

$  which java
/usr/bin/java

# 関連バイナリ全部切り替わっているか確認
$ ls -l /etc/alternatives/java*
lrwxrwxrwx 1 root root 43 Sep  9 16:58 /etc/alternatives/java -&amp;gt; /usr/lib/jvm/java-11-openjdk-amd64/bin/java
lrwxrwxrwx 1 root root 53 Sep  9 16:58 /etc/alternatives/java.1.gz -&amp;gt; /usr/lib/jvm/java-11-openjdk-amd64/man/man1/java.1.gz
lrwxrwxrwx 1 root root 44 Sep  9 16:58 /etc/alternatives/javac -&amp;gt; /usr/lib/jvm/java-11-openjdk-amd64/bin/javac
lrwxrwxrwx 1 root root 54 Sep  9 16:58 /etc/alternatives/javac.1.gz -&amp;gt; /usr/lib/jvm/java-11-openjdk-amd64/man/man1/javac.1.gz
lrwxrwxrwx 1 root root 46 Sep  9 16:58 /etc/alternatives/javadoc -&amp;gt; /usr/lib/jvm/java-11-openjdk-amd64/bin/javadoc
lrwxrwxrwx 1 root root 56 Sep  9 16:58 /etc/alternatives/javadoc.1.gz -&amp;gt; /usr/lib/jvm/java-11-openjdk-amd64/man/man1/javadoc.1.gz
lrwxrwxrwx 1 root root 44 Sep  9 16:58 /etc/alternatives/javap -&amp;gt; /usr/lib/jvm/java-11-openjdk-amd64/bin/javap
lrwxrwxrwx 1 root root 54 Sep  9 16:58 /etc/alternatives/javap.1.gz -&amp;gt; /usr/lib/jvm/java-11-openjdk-amd64/man/man1/javap.1.gz
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;大丈夫そう。イイネ！&lt;/p&gt;

&lt;p&gt;以上。&lt;/p&gt;

</description>
      <category>wsl</category>
    </item>
    <item>
      <title>Ubuntuにnode入れてバージョン管理</title>
      <dc:creator>Borikatsu</dc:creator>
      <pubDate>Sun, 10 Sep 2023 00:20:10 +0000</pubDate>
      <link>https://dev.to/borikatsu/ubuntuninoderu-retebaziyonguan-li-4ogk</link>
      <guid>https://dev.to/borikatsu/ubuntuninoderu-retebaziyonguan-li-4ogk</guid>
      <description>&lt;p&gt;Ubuntu に nodejs と npm と yarn 入れる。&lt;br&gt;
node と npm は &lt;a href="https://github.com/tj/n"&gt;n&lt;/a&gt; でバージョン管理する。&lt;/p&gt;

&lt;p&gt;会社の PC 設定する時に毎回調べたり、個人 PC の設定忘れがちなのでメモとして。&lt;/p&gt;


&lt;h2&gt;
  
  
  目次
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;やること&lt;/li&gt;
&lt;li&gt;n をインストールするまで&lt;/li&gt;
&lt;li&gt;node/npm を再インストール&lt;/li&gt;
&lt;li&gt;テンポラリの node と npm を削除&lt;/li&gt;
&lt;li&gt;yarn インストール&lt;/li&gt;
&lt;li&gt;結果&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  やること
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;n をインストールするためのテンポラリな node と npm をインストール&lt;/li&gt;
&lt;li&gt;n をインストールする&lt;/li&gt;
&lt;li&gt;node/npm を n で再インストール&lt;/li&gt;
&lt;li&gt;テンポラリな node と npm を削除&lt;/li&gt;
&lt;li&gt;yarn をインストール&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;れっつごー&lt;/p&gt;


&lt;h2&gt;
  
  
  n をインストールするまで
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# pkgマネージャーからnode/npmをインストール(テンポラリ利用)
$ sudo apt install -y nodejs npm

# n をインストール
$ sudo npm install n -g
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  node/npm を再インストール
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# 安定バージョン
$ sudo n stable

# 最新バージョン
$ sudo n latest

# バージョン指定
## リモートのバージョン確認
$ sudo n ls-remote | head
Listing remote... Displaying 20 matches (use --all to see all).
20.6.1
20.6.0
20.5.1
20.5.0
20.4.0
20.3.1
20.3.0
20.2.0
20.1.0

## 20.1.0を利用
$ sudo n 20.1.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  テンポラリの node と npm を削除
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ sudo apt purge -y nodejs npm
$ sudo apt autoremove -y
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  yarn インストール
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ npm install -g yarn
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  結果
&lt;/h2&gt;

&lt;p&gt;基本は安定板を利用。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ node -v
v18.17.1
$ npm -v
9.6.7
$ yarn -v
1.22.19
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;以上&lt;/p&gt;

</description>
      <category>node</category>
      <category>wsl</category>
      <category>npm</category>
    </item>
    <item>
      <title>Docker Desctop使わずにWSL2でDockerを使う</title>
      <dc:creator>Borikatsu</dc:creator>
      <pubDate>Thu, 07 Sep 2023 13:50:46 +0000</pubDate>
      <link>https://dev.to/borikatsu/docker-desctopshi-wazuniwsl2dedockerwoshi-u-gm</link>
      <guid>https://dev.to/borikatsu/docker-desctopshi-wazuniwsl2dedockerwoshi-u-gm</guid>
      <description>&lt;p&gt;&lt;a href="https://matsuand.github.io/docs.docker.jp.onthefly/desktop/faqs/#do-i-need-to-pay-to-use-docker-desktop"&gt;Docker Desktop を利用するには支払いが必要ですか&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;個人利用なら Docker Desktop は無料で利用できるが、ビジネス目的での利用だと少し制限がある。&lt;/p&gt;

&lt;p&gt;別に個人で利用している分には Docker Desctop を使い続ければいいのだが、使わずに WSL 上の Ubuntu にインストールして動かすこともできるらしかったので試してみた。&lt;br&gt;
（いつか個人利用でも有償になった時のために）&lt;/p&gt;


&lt;h2&gt;
  
  
  目次
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;さっそくインストールしてみよう&lt;/li&gt;
&lt;li&gt;起動設定&lt;/li&gt;
&lt;li&gt;できあがり&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  さっそくインストールしてみよう
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://docs.docker.com/engine/install/ubuntu/"&gt;Install Docker Engine on Ubuntu&lt;/a&gt;&lt;br&gt;
↑ Docker が公式で出している Ubuntu OS に Docker Engine をインストールする方法。&lt;br&gt;
書いてある通りに進めていけば Docker 動くようになるとのこと。めちゃ簡単。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.docker.com/engine/install/ubuntu/#install-using-the-repository"&gt;Install using the Apt repository&lt;/a&gt;&lt;br&gt;
↑ インストールするための準備コマンドが記載されている項目。&lt;/p&gt;

&lt;p&gt;若干ライブラリが足りてなかったりするので、&lt;br&gt;
&lt;a href="https://dev.to/felipecrs/simply-run-docker-on-wsl2-3o8"&gt;https://dev.to/felipecrs/simply-run-docker-on-wsl2-3o8&lt;/a&gt;&lt;br&gt;
を参考に以下のコマンドを実施。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Add Docker's official GPG key:
$ sudo apt-get update
$ sudo apt-get install ca-certificates curl gnupg lsb-release
$ sudo mkdir -p /etc/apt/keyrings
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

# Add the repository to Apt sources:
$ echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list &amp;gt; /dev/null

$ sudo apt-get update
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;そして、最新版で問題ないので以下のコマンドでインストール。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ちなみにバージョン指定してインストールする方法は以下。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;## バージョン情報の確認
$ apt-cache madison docker-ce | awk '{ print $3 }'
5:24.0.0-1~ubuntu.22.04~jammy
5:23.0.6-1~ubuntu.22.04~jammy
...

## インストールしたいバージョンを指定してインストール
$ VERSION_STRING=5:24.0.0-1~ubuntu.22.04~jammy
$ sudo apt-get install docker-ce=$VERSION_STRING docker-ce-cli=$VERSION_STRING containerd.io docker-buildx-plugin docker-compose-plugin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  起動設定
&lt;/h2&gt;

&lt;p&gt;まず Docker のデーモンを立ち上げる上での管理グループ &amp;amp; ユーザーを作成する。&lt;br&gt;
※Docker Desctop をインストールしたことがあるなら既に作成されているはずなのでこの手順は不要。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Ensures docker group exists
$ sudo groupadd docker

# Ensures you are part of it
$ sudo usermod -aG docker $USER
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;Ubuntu にログインするとデーモンが立ち上がるように bash に設定を追記&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ vi ~/.profile
if service docker status 2&amp;gt;&amp;amp;1 | grep -q "is not running"; then
    wsl.exe -d "${WSL_DISTRO_NAME}" -u root -e /usr/sbin/service docker start &amp;gt;/dev/null 2&amp;gt;&amp;amp;1
fi
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  できあがり
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ /usr/sbin/service docker status
 * Docker is running

$ docker --version
Docker version 24.0.6, build ed223bc

$ docker compose version
Docker Compose version v2.21.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ubuntu にログインして、Docker デーモンが起動していること、バージョン情報が表示されるので正常インストールされていることが確認できた。&lt;/p&gt;

</description>
      <category>wsl</category>
      <category>docker</category>
    </item>
    <item>
      <title>ガントチャートを楽に管理したい</title>
      <dc:creator>Borikatsu</dc:creator>
      <pubDate>Tue, 05 Sep 2023 12:42:29 +0000</pubDate>
      <link>https://dev.to/borikatsu/gantotiyatowole-niguan-li-sitai-2gb0</link>
      <guid>https://dev.to/borikatsu/gantotiyatowole-niguan-li-sitai-2gb0</guid>
      <description>&lt;p&gt;Excel でのガントチャート管理に疲れた。&lt;br&gt;
宗教的な理由からも Excel は嫌。&lt;/p&gt;

&lt;p&gt;Backlog とか Jira とか、タスク管理アプリでも WBS 作れるけど正直そんなに便利ではない。&lt;br&gt;
タスクの期限が変わったりすると、他タスクの期限全部調整するハメになったりするし。&lt;/p&gt;




&lt;h2&gt;
  
  
  目次
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;なんかいい案ないのかな&lt;/li&gt;
&lt;li&gt;お試し&lt;/li&gt;
&lt;li&gt;実際に使ってみた感想&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  なんかいい案ないのかな
&lt;/h2&gt;

&lt;p&gt;あった&lt;br&gt;
&lt;a href="https://qiita.com/asobinin_kinsan/items/e8552dcab508b414a19a"&gt;PlantUML におけるガントチャートの書き方&lt;/a&gt;&lt;br&gt;
↑ ふむふむ、なるほど、ふーんて感じ&lt;/p&gt;

&lt;p&gt;まあ plantUML なら使ったことある人多いだろうし、コードでガント管理できるのもエンジニアっぽくていい感じな気がする！！&lt;/p&gt;

&lt;p&gt;でも生成した画像をぱっとブラウザ上で見たりしたいけどできるのかな？&lt;br&gt;
↓&lt;br&gt;
多分できない&lt;/p&gt;




&lt;p&gt;他にもないかなと探していたら、こんなのもあるぽい&lt;br&gt;
&lt;a href="https://blog.picocake.com/index.php/2023/05/18/draw_gantt_with_mermaid/"&gt;Mermaid を使ってガントチャートを書こう。&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;・・・こっちのが主流ぽい？&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.classmethod.jp/articles/github-mermaid-markdown-cntrol/"&gt;GitHub で Mermaid 構文の表示機能が強化されていました&lt;/a&gt;&lt;br&gt;
Github でもサポートしてる。&lt;/p&gt;

&lt;p&gt;・・・Mermaid 試してみるか&lt;/p&gt;




&lt;h2&gt;
  
  
  お試し
&lt;/h2&gt;

&lt;p&gt;まずはセットアップ。以下の記事を参考にする。&lt;br&gt;
&lt;a href="https://qiita.com/sato_kana/items/2a13f19017576488f017"&gt;VSCode で Mermaid を扱う為の便利な拡張機能あれこれ&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;とりあえず以下を VScode の拡張機能としてインストールした（他は PDF にエクスポートとかする機能だったので、必要になったらでいいかなと）&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=bierner.markdown-mermaid"&gt;bierner.markdown-mermaid&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=bpruitt-goddard.mermaid-markdown-syntax-highlighting"&gt;mermaid-markdown-syntax-highlighting&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;さっそく VScode で qita の記事に書いてあるサンプルを開いてみた。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--mqRJ3iCh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/545y7ke74fatgpunnrbf.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--mqRJ3iCh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/545y7ke74fatgpunnrbf.PNG" alt="VScodeでの表示" width="800" height="301"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;良い感じやん！！&lt;br&gt;
そしてこれを Github にうｐすると、画像の状態でプレビューできるのかな？&lt;/p&gt;




&lt;p&gt;とりあえず適当に.md ファイル作ってさっきのコードペタっとして・・・&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--8Wv8jlG1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hpb4u0aba1qouup4yfcb.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--8Wv8jlG1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hpb4u0aba1qouup4yfcb.PNG" alt="Githubにコピペ" width="800" height="570"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;あら素敵&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--MVmCLZXS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8zfzcikhljjk33x9lfqu.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--MVmCLZXS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8zfzcikhljjk33x9lfqu.PNG" alt="Githubでの表示" width="800" height="297"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  実際に使ってみた感想
&lt;/h2&gt;

&lt;p&gt;Github 上だと、画像右上の ⇔ ボタンで拡大プレビューもできて使い勝手もよろしい。&lt;br&gt;
ただ、凝った見た目にはならないので、内々で使うものにとどめておくのがよいかな。&lt;/p&gt;

&lt;p&gt;後は、タスク名を変数にして、各タスクの開始日を a タスクの後、みたいにできるので差し込みタスクが来た時などにスケジュールのパズルがしやすい・・かも&lt;/p&gt;

</description>
      <category>markdown</category>
      <category>management</category>
    </item>
  </channel>
</rss>
