Skip to content

Commit 07a44d9

Browse files
authored
Merge pull request #1 from ut-code/docs-python
Python3章までのドキュメントを追加
2 parents a982136 + e5a0f78 commit 07a44d9

File tree

8 files changed

+1285
-18
lines changed

8 files changed

+1285
-18
lines changed

app/[docs_id]/markdown.tsx

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
import Markdown, { Components } from "react-markdown";
2+
import remarkGfm from "remark-gfm";
3+
import { Prism as SyntaxHighlighter } from "react-syntax-highlighter";
4+
5+
export function StyledMarkdown({ content }: { content: string }) {
6+
return (
7+
<Markdown remarkPlugins={[remarkGfm]} components={components}>
8+
{content}
9+
</Markdown>
10+
);
11+
}
12+
13+
// TailwindCSSがh1などのタグのスタイルを消してしまうので、手動でスタイルを指定する必要がある
14+
const components: Components = {
15+
h1: ({ node, ...props }) => (
16+
<h1 className="text-2xl font-bold my-4" {...props} />
17+
),
18+
h2: ({ node, ...props }) => (
19+
<h2 className="text-xl font-bold mt-4 mb-3 " {...props} />
20+
),
21+
h3: ({ node, ...props }) => (
22+
<h3 className="text-lg font-bold mt-4 mb-2" {...props} />
23+
),
24+
h4: ({ node, ...props }) => (
25+
<h4 className="text-base font-bold mt-3 mb-2" {...props} />
26+
),
27+
p: ({ node, ...props }) => <p className="mx-2 my-2" {...props} />,
28+
ul: ({ node, ...props }) => (
29+
<ul className="list-disc list-outside ml-6 my-2" {...props} />
30+
),
31+
ol: ({ node, ...props }) => (
32+
<ol className="list-decimal list-outside ml-6 my-2" {...props} />
33+
),
34+
li: ({ node, ...props }) => <li className="my-1" {...props} />,
35+
a: ({ node, ...props }) => <a className="link link-info" {...props} />,
36+
strong: ({ node, ...props }) => (
37+
<strong className="text-primary" {...props} />
38+
),
39+
code: ({ node, className, ref, style, ...props }) => {
40+
const match = /language-(\w+)/.exec(className || "");
41+
if (match) {
42+
// block
43+
return (
44+
<SyntaxHighlighter
45+
language={match[1]}
46+
PreTag="div"
47+
className="px-4! py-4! m-0!"
48+
// style={todo dark theme?}
49+
{...props}
50+
>
51+
{String(props.children).replace(/\n$/, "")}
52+
</SyntaxHighlighter>
53+
);
54+
} else if (String(props.children).includes("\n")) {
55+
// 言語指定なしコードブロック
56+
return (
57+
<SyntaxHighlighter
58+
PreTag="div"
59+
className="px-4! py-4! m-0!"
60+
// style={todo dark theme?}
61+
{...props}
62+
>
63+
{String(props.children).replace(/\n$/, "")}
64+
</SyntaxHighlighter>
65+
);
66+
} else {
67+
// inline
68+
return (
69+
<code
70+
className="bg-base-200 border border-base-300 p-1 rounded font-mono "
71+
{...props}
72+
/>
73+
);
74+
}
75+
},
76+
pre: ({ node, ...props }) => (
77+
<pre
78+
className="bg-base-200 border border-primary mx-2 my-2 rounded-lg font-mono text-sm overflow-x-auto"
79+
{...props}
80+
/>
81+
),
82+
hr: ({ node, ...props }) => <hr className="border-primary my-4" {...props} />,
83+
};

app/[docs_id]/page.tsx

Lines changed: 2 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import { notFound } from "next/navigation";
22
import { readFile } from "node:fs/promises";
33
import { join } from "node:path";
4-
import Markdown, { Components } from "react-markdown";
54
import { ChatForm } from "./chatForm";
5+
import { StyledMarkdown } from "./markdown";
66

77
export default async function Page({
88
params,
@@ -24,22 +24,9 @@ export default async function Page({
2424

2525
return (
2626
<div className="p-4">
27-
<Markdown components={components}>{mdContent}</Markdown>
27+
<StyledMarkdown content={mdContent} />
2828
<ChatForm />
2929
</div>
3030
);
3131
}
3232

33-
// TailwindCSSがh1などのタグのスタイルを消してしまうので、手動でスタイルを指定する必要がある
34-
const components: Components = {
35-
h1: ({ node, ...props }) => (
36-
<h1 className="text-2xl font-bold my-4" {...props} />
37-
),
38-
h2: ({ node, ...props }) => (
39-
<h2 className="text-xl font-semibold my-3" {...props} />
40-
),
41-
h3: ({ node, ...props }) => (
42-
<h3 className="text-lg font-medium my-2" {...props} />
43-
),
44-
p: ({ node, ...props }) => <p className="my-2" {...props} />,
45-
};

app/sidebar.tsx

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,13 @@ export function Sidebar() {
1010
</h2>
1111
<ul className="menu w-full">
1212
<li>
13-
<Link href="/1">1</Link>
13+
<Link href="/python-1">python-1</Link>
14+
</li>
15+
<li>
16+
<Link href="/python-2">python-2</Link>
17+
</li>
18+
<li>
19+
<Link href="/python-3">python-3</Link>
1420
</li>
1521
</ul>
1622
</div>

docs/python-1.md

Lines changed: 173 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,173 @@
1+
# 第1章: Pythonへようこそ:環境構築と基本思想
2+
3+
プログラミング経験者にとって、新しい言語を学ぶ上で最も重要なことの一つは、その言語特有の「流儀」や設計思想を理解することです。この章では、Pythonの開発環境を構築し、Pythonがどのような考え方で作られているのかを探ります。
4+
5+
## Pythonのインストールとバージョン管理
6+
7+
Pythonを始めるには、まずお使いのコンピュータにPythonをインストールする必要があります。しかし、プロジェクトごとに異なるバージョンのPythonを使いたい場面は頻繁にあります。そこで、複数のPythonバージョンを簡単に切り替えて管理できる **`pyenv`** の利用を強く推奨します。
8+
9+
**`pyenv` とは?**
10+
`pyenv` は、システム全体に影響を与えることなく、ユーザーのホームディレクトリ内で複数のPythonバージョンを管理できるツールです。これにより、「プロジェクトAではPython 3.9を、プロジェクトBではPython 3.11を使う」といったことが容易になります。
11+
12+
### インストール手順(macOS/Linuxの例):
13+
Homebrew(macOS)やgitを使って簡単にインストールできます。
14+
15+
1. **pyenvのインストール:**
16+
17+
```bash
18+
# Homebrewの場合 (macOS)
19+
brew install pyenv
20+
```
21+
22+
2. **シェルの設定:**
23+
インストール後、以下のコマンドをシェルの設定ファイル(`.zshrc`, `.bash_profile`など)に追加します。
24+
25+
```bash
26+
eval "$(pyenv init --path)"
27+
eval "$(pyenv init -)"
28+
```
29+
30+
3. **Pythonのインストール:**
31+
利用可能なバージョンを確認し、特定のバージョンをインストールします。
32+
33+
```bash
34+
# インストール可能なバージョンの一覧を表示
35+
pyenv install --list
36+
37+
# 例として Python 3.11.5 をインストール
38+
pyenv install 3.11.5
39+
```
40+
41+
4. **バージョンの切り替え:**
42+
`pyenv` を使うと、ディレクトリごと、またはグローバルに使用するPythonのバージョンを切り替えられます。
43+
44+
```bash
45+
# このディレクトリでは 3.11.5 を使う
46+
pyenv local 3.11.5
47+
48+
# グローバルで 3.11.5 を使う
49+
pyenv global 3.11.5
50+
```
51+
52+
Windowsユーザーの方は、`pyenv`のWindows版である **`pyenv-win`** を利用すると同様の環境を構築できます。
53+
54+
55+
## 対話モード(REPL)の活用
56+
57+
Pythonには **REPL** (Read-Eval-Print Loop) と呼ばれる対話モードが備わっています。これは、コードを1行書くたびに即座に実行・評価し、結果を返してくれる機能です。他の言語での経験者にとっても、新しいライブラリの動作確認や、ちょっとした文法のテストに非常に便利です。
58+
59+
ターミナルで `python` と入力するだけで起動します。
60+
61+
```python
62+
$ python
63+
Python 3.11.5 (main, Aug 24 2023, 15:09:47) [Clang 14.0.3 (clang-1403.0.22.14.1)] on darwin
64+
Type "help", "copyright", "credits" or "license" for more information.
65+
>>> message = "Hello, Python!"
66+
>>> print(message)
67+
Hello, Python!
68+
>>> 1 + 2 * 3
69+
7
70+
>>> exit()
71+
```
72+
73+
より高機能なREPLとして **IPython****Jupyter Notebook** も人気があります。これらはコード補完や履歴管理、インラインでのグラフ描画など、さらに強力な機能を備えています。
74+
75+
76+
## スクリプトの実行方法
77+
78+
一連の処理をまとめて実行する場合は、`.py` という拡張子を持つファイルにコードを記述します。例えば、`hello.py` というファイルを以下のように作成します。
79+
80+
**hello.py**
81+
82+
```python
83+
def main():
84+
print("Hello from a Python script!")
85+
86+
if __name__ == "__main__":
87+
main()
88+
```
89+
90+
`if __name__ == "__main__":` は、このスクリプトが直接実行された場合にのみ `main()` 関数を呼び出すためのお決まりの書き方です。他のスクリプトからモジュールとしてインポートされた際には `main()` は実行されません。
91+
92+
このスクリプトを実行するには、ターミナルで以下のようにコマンドを入力します。
93+
94+
```bash
95+
python hello.py
96+
```
97+
98+
出力結果:
99+
100+
```
101+
Hello from a Python script!
102+
```
103+
104+
105+
## Pythonの禅 (The Zen of Python)
106+
107+
Pythonには、その設計哲学を端的に表した **「The Zen of Python」** という短い詩のような文章があります。これはPythonの思想を理解する上で非常に重要です。対話モードで `import this` と入力すると表示されます。
108+
109+
```python
110+
>>> import this
111+
The Zen of Python, by Tim Peters
112+
113+
Beautiful is better than ugly.
114+
Explicit is better than implicit.
115+
Simple is better than complex.
116+
Complex is better than complicated.
117+
Flat is better than nested.
118+
Sparse is better than dense.
119+
Readability counts.
120+
...
121+
```
122+
123+
「美しいは醜いより良い」「明示的は暗黙的より良い」「シンプルは複雑より良い」といった言葉は、Pythonでコードを書く上での指針となります。Pythonらしいコードとは、**読みやすく、シンプルで、意図が明確なコード**であると言えます。
124+
125+
## パッケージ管理ツール `pip` と仮想環境 `venv`
126+
127+
Pythonの強力なエコシステムは、豊富なサードパーティ製パッケージ(ライブラリ)によって支えられています。これらのパッケージを管理するのが **`pip`** です。
128+
129+
**`pip`** はPythonの標準パッケージインストーラで、例えばデータ分析で人気の `pandas` をインストールするには、以下のコマンドを実行します。
130+
131+
```bash
132+
pip install pandas
133+
```
134+
135+
しかし、プロジェクトAでは `pandas` のバージョン1.0が必要で、プロジェクトBでは2.0が必要、といった依存関係の衝突が起こる可能性があります。これを解決するのが **仮想環境** です。
136+
137+
**`venv`** は、プロジェクトごとに独立したPython環境を作成するための標準モジュールです。仮想環境を有効にすると、`pip` でインストールしたパッケージはその環境内にのみ保存され、他のプロジェクトやシステムのPython環境を汚染しません。
138+
139+
**仮想環境の作成と利用:**
140+
141+
1. **作成:** プロジェクトディレクトリで以下のコマンドを実行します。(`.venv` は仮想環境を保存するディレクトリ名で、慣例的によく使われます)
142+
143+
```bash
144+
python -m venv .venv
145+
```
146+
147+
2. **有効化 (Activate):**
148+
149+
```bash
150+
# macOS / Linux
151+
source .venv/bin/activate
152+
153+
# Windows (Command Prompt)
154+
.\.venv\Scripts\activate
155+
```
156+
157+
有効化すると、プロンプトの先頭に `(.venv)` のような表示が追加され、このターミナルセッションでは仮想環境が使われていることが分かります。
158+
159+
3. **パッケージのインストール:**
160+
この状態で `pip install` を実行すると、パッケージは `.venv` ディレクトリ内にインストールされます。
161+
162+
```bash
163+
(.venv) $ pip install requests
164+
```
165+
166+
4. **無効化 (Deactivate):**
167+
仮想環境から抜けるには `deactivate` コマンドを使います。
168+
169+
```bash
170+
(.venv) $ deactivate
171+
```
172+
173+
`pyenv` でPythonのバージョンを管理し、`venv` でプロジェクトごとのパッケージを管理する。この2つを組み合わせることが、現代的なPython開発の基本スタイルです。

0 commit comments

Comments
 (0)