{"id":19903560,"url":"https://github.com/noraworld/devlog","last_synced_at":"2025-07-01T01:33:47.635Z","repository":{"id":45660497,"uuid":"340569378","full_name":"noraworld/devlog","owner":"noraworld","description":"A repository where articles for developers are managed","archived":false,"fork":false,"pushed_at":"2025-06-18T06:58:06.000Z","size":1326,"stargazers_count":4,"open_issues_count":4,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-06-18T07:35:28.586Z","etag":null,"topics":["blog","developer-blog","developer-blogs","developers-web","devlog","devlogs","github","markdown"],"latest_commit_sha":null,"homepage":"https://noraworld.github.io/devlog/","language":"SCSS","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/noraworld.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null},"funding":{"github":"noraworld"}},"created_at":"2021-02-20T05:24:49.000Z","updated_at":"2025-06-18T06:58:09.000Z","dependencies_parsed_at":"2025-05-03T00:31:19.858Z","dependency_job_id":"227cee0e-8697-44f6-b428-b73f03f9834a","html_url":"https://github.com/noraworld/devlog","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/noraworld/devlog","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/noraworld%2Fdevlog","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/noraworld%2Fdevlog/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/noraworld%2Fdevlog/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/noraworld%2Fdevlog/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/noraworld","download_url":"https://codeload.github.com/noraworld/devlog/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/noraworld%2Fdevlog/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":262879218,"owners_count":23378576,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["blog","developer-blog","developer-blogs","developers-web","devlog","devlogs","github","markdown"],"created_at":"2024-11-12T20:24:24.252Z","updated_at":"2025-07-01T01:33:47.596Z","avatar_url":"https://github.com/noraworld.png","language":"SCSS","readme":"# 技術記事置き場 (日本語)\n日本語の技術記事のマスタデータを管理するためのリポジトリである。\n\n[このリポジトリの GitHub Webhook のステータス](https://github.com/noraworld/developers-blog-content-ja/settings/hooks/285310144)\n\n## Git リポジトリで管理する理由\nQiita のような技術記事を投稿するプラットフォームはいろいろあるし、なんなら技術記事専用のプラットフォームでなくとも、はてなブログのようなブログプラットフォームに投稿することもできる。\n\nしかし、これらのプラットフォームがサービス終了したり、または、すでに利用しているプラットフォームよりも魅力的に感じた別のプラットフォームを見つけたりした際に、今まで投稿したすべての記事を移行しなければならない。サービスが終了してしまえばデータは失われるし、別のプラットフォームに移行する際はデータの移行がめんどくさいと感じる。データの安全性・利便性を考慮して、技術記事のマスタデータは Git で管理したいと思った。\n\n## Git リポジトリで管理しようと思ったきっかけ\nきっかけとしては、メインで利用するプラットフォームを Qiita から Zenn に移行しようと思ったことである。そのため、技術記事のマスタデータとしての役割を果たすが、現時点ではディレクトリ構成やファイル構成などは Zenn のフォーマットに準拠する形で管理されている。\n\n2016 年 2 月 16 日に Qiita に技術記事を初投稿してから 2021 年 2 月 20 日現在でちょうど 5 年経つが、この 5 年間、技術記事は Qiita に投稿してきた。\n\nQiita は SEO がとにかく強力で、かなりの頻度で Qiita の記事がヒットするし、検索クエリによっては自分自身の技術記事がトップに表示されることも稀ではない。だからたくさんの人に見てもらえるし、IT 企業へのアピールにも利用できるし、逆に「Qiita の記事を拝見しました」というメッセージを企業側からいただくこともある。\n\nしかし、知名度や転職の材料にはなるが、いくら Qiita で記事を投稿しても、お金を稼ぐことはできない。それで Qiita から Zenn に移行しようと決めた。1 ヶ月ほど前に友人が Zenn に技術記事を投稿しているのを見て、Zenn について調べてみると、GitHub リポジトリをマスタデータとして記事を投稿できる点と、お金を稼ぐことができる点に魅力を感じて移行を決意した。実際、Zenn としても、[情報を発信するエンジニアが対価を得られるようにすることをコンセプトとしている](https://zenn.dev/about)。\n\n「移行」という言葉を使用しているが、実際には Qiita はやめない。今のところは、今後も継続して Qiita に投稿しようと思っている (つまり Qiita と Zenn の同時投稿) が、あくまでメインは Zenn で、Qiita はサブみたいな位置づけにしようと思っている。Qiita は知名度向上や転職材料のために継続し、Zenn は副業として技術記事でお金を稼ぐため、あるいはマスタデータとして Git で技術記事を管理するついでとして、開始する。\n\nなお、Qiita への投稿は自動で行われる。GitHub Webhook \u0026 GitHub API v3 \u0026 Qiita API v2 を利用して、このリポジトリに記事が追加されたら自動投稿される仕組みになっている。詳細は下記を参照のこと。\n\n[Qiita に投稿する技術記事を GitHub で管理する方法](https://zenn.dev/noraworld/articles/github-to-qiita)\n\n## リポジトリ内で使用する言語について\nこのリポジトリは日本語の技術記事を管理するためのリポジトリなので、README や Git のコミットメッセージも日本語で記述することにする。このリポジトリ内でわざわざ英語を使用する必要はないし、そのほうがわかりやすいと思うからである。\n\n## 過去記事 (Qiita に直接投稿していた記事) について\nQiita に直接投稿していた過去記事に関しては、**編集履歴含め** このリポジトリに移行した。\n\n編集履歴を追いながらすべての記事を Git に移行するのは骨が折れた。Qiita の記事をすべてダウンロードできるツールがあったのだから、それを使って一気に移行すれば良かったものを、編集履歴も管理したいからという理由で手動で移行したらとんでもなく大変な作業になってしまった。事前にどれだけ大変かを把握してから作業するか判断すべきだった。もうこんなエンジニアらしからぬ苦痛な作業は今後しないようにしよう。\n\nそれはさておき、過去記事の移行が完了した時点で 399 commits だった。そしてこの項を README に追加する変更で合計 400 commits だ。ここからは Git で管理するのをメインとし、Qiita へは API 経由で投稿する。\n\n## 執筆の方法\n久しぶりに技術記事を執筆するときに忘れてしまうのでメモしておく。\n\nまず始めに Zenn で slug 名が重複していないことを確認する。ブラウザで `https://zenn.dev/link/articles/\u003cSLUG_NAME\u003e` にアクセスして 404 Not Found が返ってくることを確認する。記事が見つかった場合は slug 名が重複しているので別の名前を検討する。\n\n以下のコマンドを実行しテンプレート付きのファイルを新規作成する。\n\n```shell\nnpx zenn new:article --slug \u003cSLUG_NAME\u003e\n```\n\n## 執筆する際のアドバイス\n* 最初に見出しだけを書く\n    * 上から順番に文章を書こうとするとダラダラと長く書きがちになるので\n* 見出しの次に実行するコマンドやコードだけを書く\n* 画像や表が必要な場合は文章を書く前に追加する\n* 最後に必要な文章を付け足す\n* 文章はなるべく短く簡潔に書き、補足情報は重要な文章と混ざらないようにする\n    * 可読性向上のため\n\n## Zenn における記事執筆時のルールについて\n### HTML を使用しない\nQiita と違って、Zenn では HTML を解釈しないので、以下のような理由で HTML を使用することはできない。\n\n* リンクを新しいタブで開かせる\n* 画像のサイズを設定する\n* 文字を着色する\n* `\u003cdetails\u003e` タグを利用した、折りたたみ表現\n\n### 絵文字はマルチバイト文字を使用する\nZenn では `:smile:` のようなショートコードでの記法では絵文字に変換されない。そのため `😀` のようにマルチバイトの絵文字を直接入力する必要がある。\n\n### 記事内リンクに絶対パスを使用しない\n絶対パスを指定すると Zenn の URL になってしまうため、相対パスで表現する。\n\nこれにより、どこに記事を公開しても、記事内のリンクは常に参照できるようになる。今後、Zenn 以外のプラットフォームに移行する際に少しでも楽をするため。\n\nただし、自分自身の他の技術記事に関しては、Qiita のようにプラットフォーム独自に記事 ID を生成して URL に使用している場合があるため対応不可能。そのため、現時点ではとりあえず、自分自身の他の技術記事のリンクは Zenn の絶対パスを指定することにする。\n\n相対パスだと、Qiita からアクセスできなくなってしまう (リンク切れになってしまう) ので、絶対パスを指定するしかない。\n\n### 画像を Zenn にアップロードしない\n他のプラットフォームへの移行柔軟性を考えると、画像もプラットフォームに直接アップロードするのは得策ではない。\n\nなぜなら、そのプラットフォームが運営されている限りは、画像の URL に外部 URL を使用しても参照できるが、そのプラットフォームが終了してしまうとリンク切れになってしまうからである。\n\nそのため、画像も GitHub に置きたいと考えているが、GitHub はストレージサービスではないため、1 つのリポジトリであまり多くのストレージを使うのは良くない。\n\n[私のディスク容量はいくつですか？](https://docs.github.com/ja/github/managing-large-files/what-is-my-disk-quota)\n\nそのため、画像専用のリポジトリを作り、そこに画像を置くのが良いのではないかと考えている。そのリポジトリのストレージを使いすぎてしまったら、また新しいリポジトリを作成する、といった具合に。\n\n### Zenn 独自の Markdown 拡張記法は使用しない\nZenn オリジナルの記法は使用しないようにする。理由は以下の通り。\n\n* 他のプラットフォーム (Qiita) との互換性のため\n* Zenn から別のプラットフォームに今後移行することになった際に記事を修正する手間を極力減らすため\n\n別のプラットフォームへの移行だけを考慮するなら、移行時に全記事内の Zenn 独自記法を変換するマイグレーションスクリプトを用意すれば良いが、Qiita との同時投稿をしているため、Qiita 側でおかしな表記になるのを避けたい。\n\n一応、Zenn の Markdown 記法についての記事のリンクをここに貼っておく。あくまで参考程度に。\n\n[ZennのMarkdown記法](https://zenn.dev/zenn/articles/markdown-guide)\n\nついでに Zenn CLI の利用方法 (ディレクトリ構造) も参考になるのでここに貼っておく。\n\n[Zenn CLIで記事・本を管理する方法](https://zenn.dev/zenn/articles/zenn-cli-guide)\n\n### topics に記号は利用可能\ntopics に記号が入っていると、`zenn preview` ではエラーが出るが、一部の記号は無視しても問題なさそう。例としては以下のようなものが挙げられる。\n\n* Node.js\n* docker-compose\n\n上記の 2 つはアイコンもちゃんと設定されていたので、むしろ積極的に使うべき topics だろう。\n\nただし、不用意に記号を入れたり、以下のようにバージョンを入れたりするのは得策ではないだろう。\n\n* Ruby3\n* Ruby-3\n* Ruby3.0\n* Ruby-3.0\n\n見た目があまり美しくないというのと、アイコンが設定されないため。\n\n#### 注意点\nただし、topics にスペースを入れると、Qiita に投稿されないので (スペースを含むタグは Qiita では不正なので) 使用しないこと。\n\n### 記事のタイトルは 70 文字まで\n60 文字を超えると `zenn preview` でエラーが出るが、実際には 70 文字まで設定可能。60 文字を超えてもプレビューでエラーが出るだけで、デプロイは成功する。\n\nしかし 70 文字を超えるとデプロイに失敗し記事が公開されない。\n\n### slug のルール\nslug (ファイル名、かつ、Zenn の記事の URL になるもの) は以下のルールに従う。\n\n* 半角英数字とハイフンの組み合わせ\n* 12 〜 50 文字の範囲内\n\nこれは `zenn new:article --slug \u003cSLUG\u003e` を実行せずに手動でファイル名を作ったとしても、このルールを守っていないとエラーになって Zenn に投稿できない。\n","funding_links":["https://github.com/sponsors/noraworld"],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnoraworld%2Fdevlog","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnoraworld%2Fdevlog","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnoraworld%2Fdevlog/lists"}