ZhgChg.Li

Plane.so:無料でSelf-Hosted対応のAsana/Jira類似プロジェクト管理ツール|効率的なScrum運用を実現

プロジェクト管理で課題を抱えるチーム向けに、Plane.soが無料でSelf-Hosted可能なAsana/Jira代替ツールを提供。Scrumフローと連携し作業効率を最大化し、透明性と進捗管理を強化します。

Plane.so:無料でSelf-Hosted対応のAsana/Jira類似プロジェクト管理ツール|効率的なScrum運用を実現
本記事は AI による翻訳です。お気づきの点があればお知らせください。

Plane.so 無料オープンソースでセルフホスティング対応のAsana/Jira類似プロジェクト管理ツール

Plane.so プロジェクト管理ツールの使い方紹介と Scrum プロセスとの連携方法

️⚠️️️️⚠️️️️⚠️️️️2025年アップデート️ ⚠️️️️⚠️️️️⚠️️️️

Plane.soの使用は推奨されません。理由は、Plane.soは当初オープンソースプロジェクトとセルフホスティングのサポートで成長しましたが、その後のバージョンで多くの機能が有料プランに移行されました。セルフホスティングでも機能を有効にするには証明書の購入が必要で、ユーザー数にも制限があります。これは当初の期待とは異なります。また、料金プランが非常に複雑で、終身プラン、Pro、Businessなどがあり、料金を支払っても新しいプランが次々と出てきて、新機能が新プラン限定になる可能性もあります。

背景

Asana

前職のPinkoiで初めてAsanaのプロジェクト管理ツールの強さを実感しました。社内プロジェクト管理やチーム間の協力において、Asanaは人と人、人とタスクの依存関係を解消し、協力の効率を高める役割を果たしています。

前職では、プロダクトチームから経営・ビジネスチーム(例:HRBP、Finance、Marketing、BD…)まで、すべてのチームにチーム公開のProjectがあり、チーム間の単一の協力入口として機能していました。ほかのチームが支援を必要とする場合、そのProject内に直接Taskを作成(テンプレートTaskからも可能)します(通常、「Need Help!」セクションがあります)。チーム内でTaskを受け取った後、対応を進めていきます。

経営チームとのクロスチーム協力では、調達や採用プロセスなどのタスクを直接作成し、それを通じて進捗を追跡できます。ビジネスチームとの協力では、マーケティング活動の計画やエンジニアリング支援が必要なタスクなどがあります。

Asanaや類似のプロジェクト管理ツールがない場合:

  • あらゆることにおいて、相手チームと直接コミュニケーションを取る必要があります。P0の案件は直接のやり取りが最も効果的ですが、日常的には90%がP0案件ではありません。大小問わずすべてを直接対面で話すのは非効率であり、相手の作業フローを中断してしまいます

  • タスクの進行状況が不透明で、対話している双方だけが状況を把握しています。複数人でのタスクの場合は、コミュニケーションで進捗を何度も確認するしかありません。また、管理者もメンバーのタスクを把握しづらく、合理的な割り当てが難しいです。

  • タスクの割り当てについて、日常では多くのタスクが届き、優先度は高いものから低いものまでさまざまで、方向性も多岐にわたります。ツールがあれば、同じ種類の問題を収集・分類でき、後でまとめて解決することが可能です。日常の業務管理も重要なタスクを見つけやすくなります。

  • タスクの引き継ぎでは、ツールがタスクの詳細や進行状況を記録します。もし他の人の協力が必要な場合でも、タスクの内容から迅速に引き継ぐことができます。

プロジェクト管理に戻ると、Asanaは柔軟で多次元かつ自動化されたプロジェクト管理ツールを提供しており、ニーズに応じて自由に組み合わせて使用できます。

Asanaの使い方は多岐にわたります。以下にいくつかの使用例を挙げますが、まずはニーズを明確にしてから関連するAsanaの例を参考にすることをお勧めします。

Asana 台湾の代理店も完全な教育トレーニングを提供しており、興味があればお問い合わせください。

(本記事に広告はありません)

例1

チームプロジェクト Project

チームプロジェクト Project

  • To Do: 今週と来週に始まるタスク

  • In Progress: 進行中の項目

  • Review: 完了し、スプリントレビュー待ち

  • Backlog: タスクプールであり、毎週ここからタスクを選んで実行します

チーム Scrum プロジェクト

チーム Scrum プロジェクト

チームのメインプロジェクトとは別に、Scrumプロジェクトを作成してタスクを管理します(Asanaのタスクは複数のプロジェクトに同時に追加可能)。各スプリントのタスク実行内容を振り返ります。

例2

例二では、SectionをSprintの区分として使用し、毎週1つのSectionを作成してタスクをドラッグします。さらに、Labelで他の状態をマークします。

現実に戻る

前述の通り、上記は前職のPinkoiでAsanaプロジェクト管理ツールを使っていたケースです。ここ数ヶ月、プロジェクト管理ツールのない環境に戻ってみて、ツールが仕事の効率にどれほど重要かを改めて実感しています。

現在の環境には最新のプロジェクト管理ツールがなく、調達(支出管理が必要)、内部統制問題(完全な社内ネットワーク)、および個人情報監査の制限(オンプレミス必須)により、直接Asanaを導入できません。

以上の環境制約を踏まえ、まずはオープンソースでセルフホスティング対応のプロジェクト管理ツールに絞って探しました。見つかった解決策はRedmine、OpenProject、Taigaなどでしたが、いくつか試した結果、機能不足やUI/UXの使いにくさで期待外れでした。そんな中、偶然2023年1月に新しくリリースされたPlane.soというプロジェクト管理ツールを見つけました。

ついでにこのサイトもおすすめします。Self-Hosted をサポートするサービスが多数掲載されています:

awesome-selfhosted
自分のサーバーでホストできるフリーソフトウェアのネットワークサービスとウェブアプリケーションのリスト awesome-selfhosted.net

ここまで説明しましたが、以下本文を開始します。

目次

本文は以下の内容で構成されています:

  • Plane.so 紹介

  • Plane.so 操作ガイド

  • Plane.so x Scrum ワークフローフロー例

  • 付録

必要に応じてご確認ください。Docker Self-Hosted 自己構築の手順については、次の記事「Plane.so Docker Self-Hosted 自架紀錄」をご参照ください。

Plan.so 紹介

紹介

Plane は 2022 年に設立された、アメリカ・デラウェア州とインドに拠点を持つスタートアップ企業です。現在、LinkedinGithub を見ると、開発者の大部分がインドにいることがわかります。同社は現在、400万ドルのシードエンジェル資金を調達しており(OSS Capital が投資)。

現在 Plane は Github のプロジェクト管理カテゴリで第1位を占めており、AGPL-3.0 ライセンスでオープンソース化されています。初版は2023年1月にリリースされ、現在も開発段階で正式なリリース版はまだ提供されていません。

ご注意: ⚠️ オープンソースは無料と同義ではありません ⚠️ GithubやGitlabのように、Asana、Jira、ClickupなどGithubに似た多くのプロジェクト管理ツールがありますが、Gitlabに匹敵する十分に使いやすいオープンソース製品はまだありません。Planeの目標は、プロジェクト管理ツールのGitlabになることです。

  • 約2〜3週間ごとに開発版を更新しており、一部の調整は大きく異なる場合やまだセキュリティ上の問題があることがあります。

  • 多言語対応(中国語)は現在サポートされていません。

  • Self-Hosted をサポートしています

  • 現在、公式にはCloudからSelf-Hostedへのエクスポート・インポートは提供されておらず、API連携で自分で実装する必要があります。そのため、Self-Hostedのローカル利用を検討している場合は、Cloudは試用版としてのみ利用することをおすすめします。

  • macOSアプリ、iOSアプリ、Androidアプリも現在活発に開発中です。

Planeのプロダクトロードマップは公式サイト情報を参照してください:

<https://sites.plane.so/plane/459cfcdf-dc9c-49a6-9d4b-a89f91440189/?board=kanban>

https://sites.plane.so/plane/459cfcdf-dc9c-49a6-9d4b-a89f91440189/?board=kanban

オープンソースリポジトリ:

プラン

Planeはクラウド版サービスを提供しており、料金は0ドルから始まります。Proプランでは、より多くのフレームワークや統合、自動化機能が利用可能です。

また公式は$799の早期ライフタイムプランを推進しており、有料サポートに興味のあるチームは直接こちらを参照できます

Community Edition(公式略称 CE版)、Self-Hosted版も同様に$0から利用可能です。ただし、上級機能を使うにはPro版の購入が必要ですが、Self-Hostedに対応しています

フレームワーク

Plane.so は Asana の多次元の柔軟性とは異なり、以下のフレームワークで構成されており、プロジェクト管理に使用されます:

  • Issues:Asanaのタスクと同様に、すべての作業はIssueとして作成し、処理を割り当てたり記録として残したりします。

  • Cycles:スプリントに似ており、1つのイテレーション期間またはバージョンを指します。各Issueは1つのCycleにのみ所属できます。

  • Modules:プロジェクト、モジュール、カテゴリ機能。各Issueに複数のModulesを追加可能。

  • Layouts & Views:ガントチャート、カレンダー、カンバン、リスト、シートモードでIssuesを表示できます。また、フィルター条件や表示方法をViewとして保存し、素早く確認できます。

  • Inbox:Issue Proposed フローでは、提案された Issue を作成し、承認されて初めて実際にプロジェクト内の Issue として作成されます。承認されなければ直接却下されます。

  • Pages:簡単なドキュメント機能で、仕事や製品の事項を記録できます。

  • Drive:Google Driveのチームファイル機能に似ています。

現在の無料版およびCE(セルフホスト)版にはこの機能はありません。

Plane.so 操作チュートリアル

私たちは迅速かつ無料で、直接Plane Cloudバージョンを使い始めることができます:

ワークスペース

  • 初めて Plane.so にアクセスすると、最初に Workspace を作成する必要があります。

  • Workspace は Asana のワークスペースと同様で、1つのアカウントで複数の Workspace に参加できます。

  • 小規模な会社で複数のチームが使用する場合は、同じ Workspace 内で利用可能です。

  • 大企業の複数チームで利用する場合、Plane には Asana のようなチーム機能やプロジェクトのグループ分け機能がありません。同じ Workspace 内だとプロジェクトが混乱するため、チームごとに Workspace を分けることをおすすめします。

作成後は Workspace のドロップダウンメニューから別の Workspace に切り替えたり、Workspace 設定にアクセスしたりできます:

設定は以下の通りです:

  • General Workspace アバター、名前、URL

  • Billing and plans 料金とプラン

  • Integrations サードパーティ連携、現在無料版ではGithubとSlackの連携のみ提供されています

  • Imports インポート機能は現在、Jira と Github Project のインポートのみ対応しています。

  • Exports エクスポート機能は、現在 csv、excel、json 形式のエクスポートのみ対応しています。

  • Webhooks APIトークン、自分でAPIを接続する方法

重要な設定は Members で、チームメンバーを Workspace に招待する必要があります:

身分別:

  • Guest/Viewer は現在の機能として大きな違いはなく、Issue、Comment、Emoji の閲覧のみ可能です。異なる組織のメールアドレスの外部ユーザーは Guest、同じ組織のユーザーは Viewer となります。

  • Member はすべての機能を操作できます

  • Admin は Settings にアクセスできます

Home ホームページ

  • Home ワークスペース全体のすべてのプロジェクトとメンバーの状況

  • Analytics 全メンバー、Issues 分析

  • Projects すべてのプロジェクト

  • All Issues すべてのプロジェクトのIssues

  • Active Cycles すべてのプロジェクトの現在のCycle状況

  • Notifications Issues通知

プロジェクト

Projects に入り、すべての公開および参加している Projects を確認します:

  • Project 名称、概要、カバー画像、プレフィックス(Issue エイリアス例: APP-1

  • Project 権限:Public ワークスペースに参加している全メンバーが閲覧・参加可能;Private 招待されたメンバーのみ参加可能

  • Lead:プロジェクトの主要担当者

Project 右上の「…」でできること:

  • お気に入りに追加し、Pinをマイフェイバリット(Your Projectsの上)に固定

  • Publishは公開用の外部リンクを生成します。公式のRoadmap Projectと同様です。

  • Draft Issues 保存された下書きのIssuesを表示する

  • Archives 封鎖されたIssuesを表示する

その他の設定:

  • General:プロジェクトの一般設定

  • Members:プロジェクトメンバーと権限管理

  • States:プロジェクトのIssueステータス(後述)

  • Labels:プロジェクトのラベル管理

  • Features:有効にする機能の制御(デフォルトでInbox機能は無効)

  • Estimates:プロジェクトの見積もり時間設定(後述)

  • Integrations:サードパーティ連携(Workspaceで事前に有効化が必要)

  • Automations:現在の無料版では、一定期間経過したClosed Issuesの自動アーカイブと、一定期間経過した未完了Issuesの自動クローズのみがサポートされています。

Issues(課題)

  • ログイン後、左側の Projects から Project を作成できます。

  • Asanaとは異なり、PlaneのIssueは一つのProjectにしか追加できません。

  • 右上の角で表示モードを切り替え可能です。

  • デフォルトではすべてのサブイシューが展開されます。もし煩雑に感じる場合は、Display -> Show sub-Issues のチェックを外してください。

「Create Issue」をクリックしてIssueを作成開始:

  • ドラフトとして保存できるIssues

  • 文字スタイルとコードブロックのサポート

  • Markdownに対応しています

  • テキストの回り込みをサポートし、画像を直接ドラッグ&ドロップでアップロード可能

  • 複数の担当者をサポート(Asanaより便利で、Asanaは1つのタスクに対して担当者が1人のみ対応)

  • Priorityを選択すると、異なるPriorityごとに異なるハイライトスタイルが適用されます(現在、Priorityのカスタマイズはできません)

  • Modules を選択すると、複数の Modules を追加できます。例えば、ログイン最適化App などです。(設定は後ほど説明します)

  • Cycleを選択すると、どのスプリントで行うかを一つだけ選べます。例:W22S222024–05 …(設定は後で説明します)

  • 現在はカスタムIssueプロパティをサポートしていません。

  • 「Add parent」を選択し、このIssueをサブIssueとして親Issueに追加します。

  • Labelsの選択(別名タグ機能)

  • Start Date、Due Date を選択します…(現在、正確な時間の指定や繰り返し課題には対応していません)

  • Estimate(別名 Scrum ストーリーポイントまたは投入予定リソース)を選択します。Estimate は Settings で調整・追加可能ですが、現在は Estimate 欄を1つだけ有効にでき、Estimate の値は6つまでに制限されています。(公式ロードマップでは2024年第2四半期にこの機能が改善される予定です)

  • Issueの状態を選択します。状態はSettingsで調整・追加できます:

AIを使ってIssue内容を作成:

  • 「作成」横のAIボタンをクリックしてプロンプトを入力すると、デフォルトのIssue内容が自動生成されます。「Use this response」をクリックすると、Issueの説明に反映されます。

Issue 作成後、リストでクリックすると Issue Preview ウィンドウが表示され、そこから展開して Issue Full-Screen ページに入ることができます:

クリックしてIssueのフルスクリーン詳細ページを開く:

  1. 画像プレビューはドラッグ移動や右クリックで新しいウィンドウで拡大可能(現在はクリックでの拡大はできません)

  2. クリックしてサブイシューを追加できます(サブイシューは現在、並べ替えやセクション機能に対応していません)

  3. 絵文字の追加(現在は👍👎😀💥😕✈️👀の7種類のみ)

  4. アップロードされた添付ファイル(画像に限らず、画像は現在プレビュー機能がなく、クリックして表示する必要があります)

  5. コメントディスカッションエリア(現在、中国語入力は自動送信されます。詳細は記事末の解決策をご参照ください)

  6. このIssueの変更通知を購読/解除する

  7. Relates to 関連付け可能なIssues

  8. Blocking は、このIssueによって実行が妨げられているIssueをマークできます(現在は特別な機能はありません)

  9. Blocked by は、このIssueの実行を妨げているIssueをマークできます(現在は特別な機能はありません)

  10. Duplicate of 重複したIssueをマークする(現在は特別な機能なし)

  11. Labels は素早くタグ付けやラベル作成ができます

  12. Links 関連リンクには、FigmaやGoogleドキュメントなどの外部リンクを追加できます。

  13. Issueの削除とアーカイブ

サイクル周期

  • ホームページには現在のCycleとその進行状況、バーンダウンチャートが表示されます。

  • 今後のCycleと完了したCycle

  • 現在はCycleを手動で作成する必要があります。

  • 例えば、2週間ごとに1つのスプリントを作成し、SXXとして期間を指定します。

  • Cycleの期間は繰り返し設定できません。

  • Cycleの期間は過去の日付を選択できません。

  • Issueは一つのCycleにしか追加できません。

  • クリックしてCycleの詳細を表示できます。上部で異なる表示方法やフィルターを使ってIssuesを確認できます。

  • 右側にはバーンダウンチャートと進捗状況があります

  • Assignees、Labels、StatesによってIssuesを確認できます

Modules モジュール

  • Modules はプロジェクトのまとめ、OKR 目標、職能分類(Design、FE、BE、App など)として使用できます。

  • プロジェクトのリードとメンバーを設定可能です。

  • プロジェクトの進捗とIssueの状態は異なり、PlannedとPausedの状態が追加されています。

  • 日付範囲を設定可能です。

  • クリックしてモジュールの詳細を表示できます。上部では異なる表示方法やフィルターを使ってイシューを確認できます。

  • 右側にはバーンダウンチャートと進捗状況があります

  • Assignees、Labels、States によってイシューを確認できます

  • Module にリンクを追加できます

ビュー

  • よく使うフィルター条件や表示モードを View として作成でき、ここから直接素早く確認できます。

  • Viewの上部でも異なる表示方法やフィルターを使ってIssuesを確認できます。

Pages 簡易ドキュメント

  • Pages はWYSIWYGドキュメントエディタを提供しており、簡単にドキュメントを作成したり画像を挿入したりできます。

  • 現在は目次やカテゴリ機能をサポートしていないため、ドキュメントが増えると非常に混乱します。

  • ドキュメント権限:Public はすべてのプロジェクトメンバーが閲覧可能、Private は自分のみ閲覧可能。

Notifications Issues 個人通知機能

  • 購読しているIssuesの状態変更、内容の更新、新しいコメントがあった場合に通知されます

  • デフォルトで自分が作成した、割り当てられた、リードしているプロジェクトのIssuesはすべて購読されます。

  • 現在はSlackやサードパーティの通知には対応していません。

現在はEmail通知のみ対応しています:

  • プロフィール写真 -> 設定 -> プリファレンス -> Email からメール通知を有効にできます

ダークモード

  • アバター -> 設定 -> 環境設定 -> テーマ から Plane テーマを選択できます

公式マニュアル

その他の操作や使用の詳細は公式ドキュメントをご参照ください。

⚠️⚠️声明⚠️⚠️

以上は2024–05–25 v0.20-Dev版の使用紹介です。公式は引き続き新機能の開発とユーザー体験の改善に努めており、上記の機能制限は将来的に改善される可能性があります。最新バージョンでの体験を優先してください。

開発中のプロジェクトにはバグや体験上の問題があることが避けられません。Plane.soチームにどうかご理解とご協力をお願いします。不明点や問題があれば、下記にてご報告ください:

Plane.so x Scrum ワークフローの例

アーキテクチャ

  • 各チームにはそれぞれのWorkspaceがあります。

  • 各チームには主要な製品プロジェクトがあります。

  • Projects:マーケティング広告プロジェクト、カスタマーサポートプロジェクト、外部協力プロジェクトなど、製品の主要開発プロジェクトとは別に作成可能です。

  • Modules:Function Modules(設計、フロントエンド、バックエンド、アプリ)を作成し、チームリードが追跡しやすくします。OKRやプロジェクト目標をModuleとして設定(コンバージョン率向上、OKR-1 GMV向上など)。

  • Cycle:Sprintの周期に合わせてCycleを作成します。例えば、毎週1回のSprintの場合、W12 または週の月曜日の日付である 2024–05–27 を作成できます。

  • 現在はCycleを自動作成できないため、毎月または毎週、あらかじめ今後のCycleを作成する必要があります。

  • どんな作業でも必ずIssueを作成してください。

  • Issueには可能であればStart Date & Due Date、Modules、Priorityを追加してください。

  • もしIssueがIn-ProgressとCycleの間を繰り返している場合(1つのCycleで完了しない場合)、Issueを細分化してプロジェクト管理をしやすくすることを検討してください。

フロー

  • スプリント期間:1週間

  • Backlog:作業やアイデアはすべてIssueとして作成し、StateをBacklogに設定、EstimateとPriorityを入力

  • 毎週月曜日のスプリントプランニングミーティング:バックログからイシューを選び、実行中のイシュー(To Do または In progress)を確認し、優先度や見積もりを設定して、今回のスプリントに割り当て、サイクルに追加する

  • スプリント中に割り込みで実行するIssueがある場合も、必ず今週のCycleに直接追加する必要があります。

  • Daily Stand-up:毎朝15分間でそれぞれのIssueの進捗状況を手短に共有する

  • Issue実行準備中、実行開始状態をToDo/In Progressに変更

  • IssueのステータスをDoneに変更するか、Reviewステートを新たに追加する

  • 毎週金曜日のスプリントレビュー会議:今週のIssueを単純にレビュー(来週の計画ではない)、完了したIssueを素早く振り返り、将来の集計のためにEstimateが記入されていることを確認します。

  • 毎週金曜日にはできるだけCycle内のすべてのIssueが完了していることを確認し、未完了のIssueは次週のCycleに追加するか、Pending/Cancelに変更してください

  • 上記のプロセスを継続的に反復し、すべてのIssuesとProjectsを管理する

⚠️⚠️声明⚠️⚠️

上記はあくまでワークフローの例です。完璧なプロセスは存在せず、チームに合ったプロセスが重要です。Plane.soが提供する構造を参考にして、最適なプロジェクト管理方法を見つけてください。

附録

API

Plane.so はクリーンなフロントエンドとバックエンドの分離アーキテクチャを採用しているため、充実したAPIが利用可能です。Workspace Settings で API Tokens を作成し、APIリクエストヘッダーに X-API-Key を設定することで使用できます。APIエンドポイントのリクエスト方法は公式の API ドキュメント を参照してください。

しかし、公式ドキュメントはまだ整備されておらず、多くのリクエスト方法は記載されていません。最も早い方法はブラウザの開発者ツールで Network リクエストを確認し、公式がどのように API を呼び出しているかを見ることです。自分のキーを使えば利用可能です。

Issue コメントで中国語を入力すると、変換確定後すぐに送信されてしまう問題

公式にIssueを立ててソースコードを確認しましたが、修正の可能性は低そうです。最初から選択した言語を考慮しておらず、キーボードのEnterイベントで直接コメントを送信する仕様になっています。

ブラウザー拡張機能の回避策:

こちらは自作のWorkaround JavaScriptスクリプトで、Enterキーのイベントをフックします。

1.まずはJavaScriptブラウザインジェクト拡張機能をインストールしてください:

以上は Chromium 共通の拡張機能であり、他のブラウザでも同様の JavaScript Inject ツールを探すことができます。

  1. Plane.soに戻り、拡張機能をクリック -> 「+」をクリック

  1. Plane.soに以下のJavaScriptを注入する
document.addEventListener('keydown', function(event) {
 if (event.key === 'Enter' \\|\\| event.keyCode === 13) { // event.keyCode は古いブラウザ用
  const focusedElement = document.activeElement;
  const targetButtons = focusedElement.parentElement.parentElement.parentElement.parentElement.parentElement.querySelectorAll('button[type="submit"]');
   if (targetButtons.length > 0 && targetButtons[0].textContent.trim().toLowerCase() === "comment") {
    console.log("HIT");
    // アクティブな要素にフォーカスを当て、カーソルを末尾に移動
    focusedElement.focus();
    if (window.getSelection) {
     var range = document.createRange();
     var selection = window.getSelection();
     range.selectNodeContents(focusedElement);
     range.collapse(false);
     selection.removeAllRanges();
     selection.addRange(range);
    }
    event.stopImmediatePropagation();
   }
 }
},true);

  • コードを貼り付けた後、「Save」を押して保存します。

Plane.soに戻って(リロード)、Issueを開き、コメント機能をテストします。

  • Enterキーでの選択は自動送信されなくなりました。スペースキー+Shift+Enterで改行でき、コメントは手動で「Comment」をクリックして送信します。

⚠️⚠️⚠️セキュリティ問題⚠️⚠️⚠️

Plane.soはまだ開発段階の新しい製品であり、安全性やセキュリティに問題があるか不明なため、重要なデータをアップロードしないことをお勧めします。サービスに重大な問題が発生した場合、データ漏洩のリスクがあります。もしくはSelf-Hostedでローカルネットワーク内のみで利用してください。

Plane Self-Hosted 自己ホスティング設定ガイド

Post MediumからZMediumToMarkdownを使って変換。

GitHub で編集
この記事を改善
本記事は Medium で初公開
オリジナルを読む
この記事をシェア
リンクをコピー · SNS でシェア
ZhgChgLi
著者

ZhgChgLi

An iOS, web, and automation developer from Taiwan 🇹🇼 who also loves sharing, traveling, and writing.

コメント