メインコンテンツにスキップ
$ yarn dev --turbopack
▲ Next.js 15.3.1
- Local: http://localhost:3000
 
import { getAllPosts } from './lib/markdown'
import PostCard from './components/PostCard'
 
export default async function Home() {
const posts = await getAllPosts()
return (
<main className='max-w-4xl mx-auto'>
{posts.map(post => (
<PostCard key={post.id} post={post} />
))}
</main>
)
}
 
$ git add -A
$ git commit -m 'feat: add blog posts'
[main abc1234] feat: add blog posts
3 files changed, 142 insertions(+)
$ yarn dev --turbopack
▲ Next.js 15.3.1
- Local: http://localhost:3000
 
import { getAllPosts } from './lib/markdown'
import PostCard from './components/PostCard'
 
export default async function Home() {
const posts = await getAllPosts()
return (
<main className='max-w-4xl mx-auto'>
{posts.map(post => (
<PostCard key={post.id} post={post} />
))}
</main>
)
}
 
$ git add -A
$ git commit -m 'feat: add blog posts'
[main abc1234] feat: add blog posts
3 files changed, 142 insertions(+)
$ yarn dev --turbopack
▲ Next.js 15.3.1
- Local: http://localhost:3000
 
import { getAllPosts } from './lib/markdown'
import PostCard from './components/PostCard'
 
export default async function Home() {
const posts = await getAllPosts()
return (
<main className='max-w-4xl mx-auto'>
{posts.map(post => (
<PostCard key={post.id} post={post} />
))}
</main>
)
}
 
$ git add -A
$ git commit -m 'feat: add blog posts'
[main abc1234] feat: add blog posts
3 files changed, 142 insertions(+)
package main
 
import (
"fmt"
"net/http"
"encoding/json"
)
 
type Article struct {
ID int `json:"id"`
Title string `json:"title"`
Body string `json:"body"`
}
 
func getArticles(w http.ResponseWriter,
r *http.Request) {
articles := fetchAll()
json.NewEncoder(w).Encode(articles)
}
 
$ go run main.go
Server listening on :8080
 
$ docker compose up -d
✓ Container postgres started
✓ Container redis started
✓ Container app started
package main
 
import (
"fmt"
"net/http"
"encoding/json"
)
 
type Article struct {
ID int `json:"id"`
Title string `json:"title"`
Body string `json:"body"`
}
 
func getArticles(w http.ResponseWriter,
r *http.Request) {
articles := fetchAll()
json.NewEncoder(w).Encode(articles)
}
 
$ go run main.go
Server listening on :8080
 
$ docker compose up -d
✓ Container postgres started
✓ Container redis started
✓ Container app started
package main
 
import (
"fmt"
"net/http"
"encoding/json"
)
 
type Article struct {
ID int `json:"id"`
Title string `json:"title"`
Body string `json:"body"`
}
 
func getArticles(w http.ResponseWriter,
r *http.Request) {
articles := fetchAll()
json.NewEncoder(w).Encode(articles)
}
 
$ go run main.go
Server listening on :8080
 
$ docker compose up -d
✓ Container postgres started
✓ Container redis started
✓ Container app started
use axum::{Router, Json, extract::State};
use serde::{Deserialize, Serialize};
 
#[derive(Serialize, Deserialize)]
struct Post {
id: i32,
title: String,
published: bool,
}
 
async fn list_posts(
State(pool): State<PgPool>,
) -> Json<Vec<Post>> {
let posts = sqlx::query_as("
SELECT * FROM posts")
.fetch_all(&pool).await.unwrap();
Json(posts)
}
 
$ cargo run --release
Compiling blog-api v0.1.0
Finished release [optimized]
Running `target/release/blog-api`
listening on 0.0.0.0:3000
use axum::{Router, Json, extract::State};
use serde::{Deserialize, Serialize};
 
#[derive(Serialize, Deserialize)]
struct Post {
id: i32,
title: String,
published: bool,
}
 
async fn list_posts(
State(pool): State<PgPool>,
) -> Json<Vec<Post>> {
let posts = sqlx::query_as("
SELECT * FROM posts")
.fetch_all(&pool).await.unwrap();
Json(posts)
}
 
$ cargo run --release
Compiling blog-api v0.1.0
Finished release [optimized]
Running `target/release/blog-api`
listening on 0.0.0.0:3000
use axum::{Router, Json, extract::State};
use serde::{Deserialize, Serialize};
 
#[derive(Serialize, Deserialize)]
struct Post {
id: i32,
title: String,
published: bool,
}
 
async fn list_posts(
State(pool): State<PgPool>,
) -> Json<Vec<Post>> {
let posts = sqlx::query_as("
SELECT * FROM posts")
.fetch_all(&pool).await.unwrap();
Json(posts)
}
 
$ cargo run --release
Compiling blog-api v0.1.0
Finished release [optimized]
Running `target/release/blog-api`
listening on 0.0.0.0:3000
$ python manage.py runserver
Watching for file changes...
Starting development server at
http://127.0.0.1:8000/
 
from django.db import models
 
class Article(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
published = models.BooleanField()
created_at = models.DateTimeField(auto_now_add)
 
def __str__(self):
return self.title
 
$ pytest -v
tests/test_api.py::test_get_posts PASSED
tests/test_api.py::test_create_post PASSED
tests/test_auth.py::test_login PASSED
========= 3 passed in 0.42s =========
$ python manage.py runserver
Watching for file changes...
Starting development server at
http://127.0.0.1:8000/
 
from django.db import models
 
class Article(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
published = models.BooleanField()
created_at = models.DateTimeField(auto_now_add)
 
def __str__(self):
return self.title
 
$ pytest -v
tests/test_api.py::test_get_posts PASSED
tests/test_api.py::test_create_post PASSED
tests/test_auth.py::test_login PASSED
========= 3 passed in 0.42s =========
$ python manage.py runserver
Watching for file changes...
Starting development server at
http://127.0.0.1:8000/
 
from django.db import models
 
class Article(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
published = models.BooleanField()
created_at = models.DateTimeField(auto_now_add)
 
def __str__(self):
return self.title
 
$ pytest -v
tests/test_api.py::test_get_posts PASSED
tests/test_api.py::test_create_post PASSED
tests/test_auth.py::test_login PASSED
========= 3 passed in 0.42s =========
const [theme, setTheme] = useState('dark')
const [query, setQuery] = useState('')
 
useEffect(() => {
const saved = localStorage.getItem('theme')
if (saved) setTheme(saved)
}, [])
 
async function fetchData(endpoint: string) {
const res = await fetch(endpoint)
if (!res.ok) throw new Error(res.statusText)
return res.json()
}
 
interface Post {
id: string
title: string
date: string
tags: string[]
}
 
$ kubectl get pods
NAME READY STATUS
blog-api-7d4f8 1/1 Running
blog-web-3a2b1 1/1 Running
const [theme, setTheme] = useState('dark')
const [query, setQuery] = useState('')
 
useEffect(() => {
const saved = localStorage.getItem('theme')
if (saved) setTheme(saved)
}, [])
 
async function fetchData(endpoint: string) {
const res = await fetch(endpoint)
if (!res.ok) throw new Error(res.statusText)
return res.json()
}
 
interface Post {
id: string
title: string
date: string
tags: string[]
}
 
$ kubectl get pods
NAME READY STATUS
blog-api-7d4f8 1/1 Running
blog-web-3a2b1 1/1 Running
const [theme, setTheme] = useState('dark')
const [query, setQuery] = useState('')
 
useEffect(() => {
const saved = localStorage.getItem('theme')
if (saved) setTheme(saved)
}, [])
 
async function fetchData(endpoint: string) {
const res = await fetch(endpoint)
if (!res.ok) throw new Error(res.statusText)
return res.json()
}
 
interface Post {
id: string
title: string
date: string
tags: string[]
}
 
$ kubectl get pods
NAME READY STATUS
blog-api-7d4f8 1/1 Running
blog-web-3a2b1 1/1 Running

About

ブログの著者について

techarm

techarm

はじめまして、techarmです。ソフトウェアエンジニアとして10年以上、Web開発を中心にさまざまなプロジェクトに携わってきました。

技術スタック

直近数年の実務で使用している技術です。

言語
GoRustPythonTypeScript
フロントエンド
ReactNext.js
インフラ
AWSGCPDocker
CI/CD
GitHub ActionsCircleCICodemagic
モバイル
Capacitor

ブログについて

日々の開発で学んだことや技術的な知見を、このブログでアウトプットしています。僕自身が困ったことや試行錯誤した経験が、同じ課題に向き合う開発者の方の手助けになれば嬉しいです。

最近はAI駆動開発を取り入れながら日々の開発を行っています。そのノウハウや実践的なTipsも、今後このブログで発信していく予定です。

趣味

読書と映画鑑賞が好きです。そして何より、新しい技術を学んで実際に手を動かして試すことが一番の楽しみです。