キャリアの悩み
エンジニアを目指してPythonを勉強し始めた頃、理由はとてもシンプルでした
「稼げるかもしれない」「エンジニアになりたい」
――ただそれだけ。
初めてコードが読めるようになったときは、パズルが解けたみたいに楽しくて、
「スキルを身につけてエンジニアになれば、きっと全部解決する」と思っていました
でも実際にエンジニアになってみると、そこには想像以上にレベルの高い人たちがゴロゴロいる
なんなら、大学で4年間みっちり学んできた人たちと同じ現場で肩を並べる
――そんな現実に直面しました
ChatGPTにコードを出してもらい、ちょっと直すだけなら一見「できた」ように見える
けれども、そのコードは、たいてい「動けばいい」レベルで、読みづらく、保守性もゼロ
もしそんなものを会社に出したら――
「負の遺産」を残して、後輩や後任に迷惑をかけるだけ
「コードが書ける」と「現場で役立つコードを書ける」のあいだには、思っていた以上に深くて広い谷がある
そして、現場で役立つコードとは、ただ動くだけのコードではありません
・後から読む人が理解しやすいこと
・再利用できる汎用性があること
・将来の変更にも耐えられる柔軟性を持っていること
そういうコードこそが、本当に“現場で使えるコード”なんだと痛感しました
正解がひとつじゃない世界
「自分は向いていないんじゃないか」
「もっと勉強しないとダメなんじゃないか」
同じ課題に対しても、人によってアプローチも設計も全く違う だからこそ、上を見ればキリがなく、常に「自分は足りない」と感じてしまうのです
忘れていませんか?
でも、考えすぎて立ち止まってしまうのは本末転倒 ですよね
――プログラミングを始めたときのように
「謎を解く感覚」「パズルがどんどんハマっていく感覚」
あのワクワクを、もう一度思い出してもいいはずです
だからこそ、たまには 「役に立たなさそうなこと」をPythonでやってみる のがいいんじゃないかと思うんです。
※個人の見解です
ということで、作りました ”無駄な物をたのしく作る”という課題で‥
家に落ちていた『蝦』という文字を Blenderでピチピチに蘇生させた

家に落ちていたのは、まさかの「蝦」という一文字
ゴキブリじゃなくてホッとしたけど、スルーはできなかった
なぜなら最近、エビ欲がMAXだったから
結果、私の頭の中で「蝦」がピチピチに蘇生しただけじゃ飽き足らず、
—— Blenderでまで作ってしまった今日この頃。。
ポイント
jump_amplitude = 0.05
wave_amplitude = 0.05 # クネクネ強め
jump_frequency = 2 * math.pi / 10
wave_frequency = 2 * math.pi / 15 # 速めに変化させる
「ピチピチの速さ」 🦐🦐
→ wave_frequency
「飛び跳ね感」(ジャンプ動作)🦐🦐🦐
jump_amplitude と jump_frequency
「ピチピチ」感の源 🦐
頂点変形(math.sin(v.co[0]*20))と wave_amplitude
# ------------------------------
# シェイプキーで激しいクネクネ
# ------------------------------
kanji_obj.shape_key_add(name="Basis")
wave_key = kanji_obj.shape_key_add(name="Wave")
# Waveシェイプキーの頂点に変位を設定(X座標で位相をずらす)
for i, v in enumerate(wave_key.data):
v.co[1] += math.sin(v.co[0]*20) * wave_amplitude # 20倍で暴れる
全体コード
背景の色や文字の色は各自で設定してみてください〜
全体コードはこちら↓
import bpy
import math
# ------------------------------
# 設定
# ------------------------------
kanji_list = ["蝦", "蝦", "蝦", "蝦"]
font_path = "/System/Library/Fonts/ヒラギノ角ゴシック W6.ttc"
size_x, size_y, size_z = 0.03, 0.05, 0.01
gap_x, gap_y = 0.035, 0.055
start_frame = 1
end_frame = 120
jump_amplitude = 0.05
wave_amplitude = 0.05 # クネクネ強め
jump_frequency = 2 * math.pi / 10
wave_frequency = 2 * math.pi / 15 # 速めに変化させる
# ------------------------------
# 既存オブジェ削除
# ------------------------------
for obj in bpy.data.objects:
bpy.data.objects.remove(obj, do_unlink=True)
# ------------------------------
# 漢字オブジェ作成
# ------------------------------
objs = []
for i, char in enumerate(kanji_list[:4]):
row = i // 2
col = i % 2
txt_data = bpy.data.curves.new(name=f"Text_{char}", type='FONT')
txt_data.body = char
txt_data.font = bpy.data.fonts.load(font_path)
txt_data.extrude = size_z
obj = bpy.data.objects.new(name=f"Kanji_{char}", object_data=txt_data)
obj.scale = (size_x, size_y, size_x)
obj.location = (col * gap_x, -row * gap_y, 0)
bpy.context.collection.objects.link(obj)
objs.append(obj)
# ------------------------------
# 漢字結合
# ------------------------------
for o in objs:
o.select_set(True)
bpy.context.view_layer.objects.active = objs[0]
bpy.ops.object.convert(target='MESH')
bpy.ops.object.join()
kanji_obj = bpy.context.active_object
# ------------------------------
# 白色マテリアル
# ------------------------------
mat = bpy.data.materials.new(name="WhiteMaterial")
mat.use_nodes = True
nodes = mat.node_tree.nodes
links = mat.node_tree.links
bsdf = nodes.get("Principled BSDF") or nodes.new(type="ShaderNodeBsdfPrincipled")
bsdf.inputs["Base Color"].default_value = (1,1,1,1)
output = nodes.get("Material Output") or nodes.new(type="ShaderNodeOutputMaterial")
links.new(bsdf.outputs[0], output.inputs[0])
kanji_obj.data.materials.append(mat)
# ------------------------------
# シェイプキーで激しいクネクネ
# ------------------------------
kanji_obj.shape_key_add(name="Basis")
wave_key = kanji_obj.shape_key_add(name="Wave")
# Waveシェイプキーの頂点に変位を設定(X座標で位相をずらす)
for i, v in enumerate(wave_key.data):
v.co[1] += math.sin(v.co[0]*20) * wave_amplitude # 20倍で暴れる
# ------------------------------
# アニメーション
# ------------------------------
for frame in range(start_frame, end_frame + 1):
bpy.context.scene.frame_set(frame)
# 10フレームに1回ジャンプ
jump = jump_amplitude * math.sin(jump_frequency * (frame - start_frame))
kanji_obj.location[1] = jump
# クネクネ激しく
wave_key.value = 0.5 + 0.5 * math.sin(wave_frequency * (frame - start_frame))
wave_key.keyframe_insert(data_path="value")
bpy.context.scene.frame_start = start_frame
bpy.context.scene.frame_end = end_frame
最後まで、見ていただきありがとうございました。