はてなキーワード: Hello Worldとは
Job description に「C言語できます」って書いたら、C言語の最上級エキスパートとして見られるってこと?まさかそんな。Hello worldしか書いたことありませんぜ旦那
Hello World!!
Hello World!!
青い
ためす
ここで言う「プログラミング初級者」とはプログラミングの記述が上から下へ向かって順番に処理されること、条件分岐やループという概念があることを理解しており、RPGゲームが作れる「RPGツクール(現RPG Maker)」や学童向けプログラミング環境「Scratch」、「ナビつき! つくってわかる はじめてゲームプログラミング(ナビつく)」、ADVゲームが作れる「吉里吉里(もしくは吉里吉里2)」、過去にBASICやC、HSP、Javascriptあたりでプログラミングへ挑戦し挫折したなどなど、ある程度の「プログラマブルなロジック」構築の経験がある者を指します。
ある時、筆者はふと思いました。「生成AIはなんだかんだで膨大なテキスト情報を処理している事がキモだよなぁ」とありきたりなことを。
そして、同時にプログラミング初級者の弱点として「現在記述されているコードの管理においてテキストと実際の処理フローが脳内で一致しない」「プログラミング言語ごとに定められているルールや関数予約語の把握が困難」なのが問題とも考えました。
前述したプログラミング初級者の弱点の考え自体は車輪の再発明であり、「Scratch」や、より高度な「UML」が既に存在しており、特筆すべきことは何もありません。
しかし、「Scratch」や「UML」、なんなら「RPGツクール」や「吉里吉里」などに無い点として、現代では自然言語処理が大幅に向上した生成AIが実用の域にまで到達しつつあるのが従来とは異なる点でした。
つまり、自然言語を混ぜ込みやすいテキストベースの言語、かつ、処理を記述するとフローが視覚的に理解しやすい言語、可能であれば情報量が多くて一部の界隈で広く使われている言語があればプログラミング初級者も気軽にプログラミングできるのではないか?と発想しました。
コンピュータ(コンパイラやインタプリタなどソフトウェアを含む)が解することができる言語にはプログラミング言語以外にも様々あり、今回取り上げるのは「データ記述言語」と呼ばれるものです。
データ記述言語の中でもグラフ作成へ特化しており、特にフローチャート作成で真価を発揮する「DOT言語」というものがあります。
早速ですが、実際に手を動かしてみましょう。ちなみにDOT言語はGraphviz OnlineというWebツールがあるため別途に何かしらをインストールして環境構築する必要はありません。便利な世の中ですね。
上記のGraphviz Onlineを開くと、既に左側のDOT言語で記述された内容が、右側で作図されています。DOT言語はこのような図を作図するためのデータ記述言語です。
一旦、左側の記述をCtrl+Aで全選択をしDeleteなどで全削除し、下記の内容をコピペしてみましょう。
digraph graphname {
A -> B;
}
DOT言語の詳細な使い方は様々なWebサイトやブログ記事、Qiitaなどへ譲るとして、A - > Bの見た目から発想の転換をしてみると処理Aから処理Bという流れに見えませんか?
DOT言語は生成AIを利用する上で有利なテキストベースでありながらグラフを作成できるのがキモであり、例えばこのA -> BがA「Webページを開いたら」 → B「Hello, Worldと表示する」という風にできるのであれば処理のフローが可視化されており本当に素晴らしいことです。
ここでプログラミングの有識者は「DOT言語をUMLなどに見立てて処理を記述するのは良いが、プログラミング初心者は求めた結果を出力するロジックやアルゴリズムを発想する知見や経験値が圧倒的に足りていないのが問題ではないか?」と至極真っ当かつ反論の余地がない問題点の指摘をすると思いますが、そこで活きるのが生成AIです。
生成AIは初級者プログラマ個人のロジックやアルゴリズムの作成能力へ無関係にロジックやアルゴリズムを生成できる(可能性が少なくともある)ので、処理のフローをDOT言語で記述することにより処理フローから初級者プログラマが求めるプログラムを生成AIへ推論させ生成させるというのが狙いです。実際に試してみましょう。
digraph graphname {
A[
label = "Webページを表示する"
];
B[
label = "Webページを表示したらHello, worldとテキストを表示する"
];
A -> B;
}
プログラミングの有識者はこの時点で「なるほど、自然言語の記述をそのままDOT言語に入れ込んでしまうのか」と気付いたのではないかと思います。
このDOT言語をGoogle Gemini 2.5 Flashへ「下記のデータ記述言語のDOT言語で記述された処理フローをJavascript言語へ変換をしWebページ上へ「Hello,world」を表示したいので変換をお願いします。」と命令すると以下のコードが生成されました。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Hello World Page</title>
</head>
<body>
<div id="output"></div>
<script>
// Webページが表示されたら(DOMが完全に読み込まれたら)実行される
document.addEventListener('DOMContentLoaded', function() {
// "Webページを表示する" ステップは、このHTMLファイル自体が表示されることで達成されます。
// "Webページを表示したらHello, worldとテキストを表示する" ステップ
const outputDiv = document.getElementById('output');
outputDiv.textContent = 'Hello, world';
});
</script>
</body>
</html>
フローを記述する利点は、ロジックやアルゴリズムを発想する知見や経験値が足りなくとも、フローのステップが明確に分かれているので生成AIが処理を切り分けて推論してくれることであり、そしてプログラミング初心者自身がフローチャートを視覚で確認できるので「Aを処理したらBを処理する」と切り分けて考えやすいことです。
また、求めている結果ではなく誤った結果が生成されても、A - > B - > Cとフローを細分化していくことで生成AIの推論精度を高めていくことができるのも利点です。
より生成AIへ精度の高い推論をしてもらうために補足情報を付加するのも有用です。
digraph graphname {
A[
label = "Webページを表示する"
];
B[
label = "Webページを表示したらHello, worldとテキストを表示する",
comment = "Webページが完全に読み込まれるまで待機"
];
A -> B;
}
labelの記述内容もcommentの記述内容も生成AIが推論のための情報として利用するので誤った結果が生成されてもA - > B - > Cとフローを細分化しなくとも良い場合があります。
DOT言語を知るプログラミング有識者が「DOT言語の仕様を考えれば確かにそうだが、その発想はなかった」と言っていただけるであろうDOT言語コード例だとこういう記述方法もアリです。
digraph 増田コード {
最初の処理[
label = "Webページを表示する"
];
次の処理[
label = "Webページを表示したらHello, worldとテキストを表示する",
comment = "Webページが完全に読み込まれるまで待機"
];
最初の処理 -> 次の処理;
}
ノードの名称へ自然言語を採用することにより、例えばゲームプログラミング時に「キャラクターがジャンプする」という読んだそのままな処理のためのノード、というか一般的に言うオブジェクトを作成することが可能で、後は->で繋げて処理をさせられます。
ちなみに別のノードを作成する際に「"キャラクターがジャンプする"から継承する」の様なことをcommentなどへ記述しておくと生成AIが推論して継承します。なんならcommentなどへ「キャラクター画像にimage.gifを使用」などと記述しておくとファイルの読み込みもします。
更にDOT言語にはカスタム要素という仕様が存在しており、DOT言語の仕様で定められた予約語以外も使用が可能です。
digraph 増田コード {
最初の処理[
label = "Webページを表示する"
];
次の処理[
label = "Webページを表示したらHello, worldとテキストを表示する",
comment = "Webページが完全に読み込まれるまで待機",
font_style = "フォントを太字のボールド体、色を赤(#FF0000)とする"
];
最初の処理 -> 次の処理;
}
生成AIはカスタム要素の名称からも推論を発揮し、上記の場合であればフォントスタイルを指定していると推論をするので生成AIの推論精度を高める補足情報として機能します。
つまりこれはカスタム要素の名称として"Action"などの名称を採用すると"動作"として推論をし、"decision"ならば"条件分岐"ですし、"input"ならば"入力"ですし、"loop"ならば"繰り返し"ですし、"Type"ならば"種別"です。
より詳細に process[type="Action"] などのノードを作成してどんどん生成AIの推論精度を高めていくことが可能であり、そろそろ察してきているかと思いますが 処理[種別="動作"] と自然言語で記述しても機能します。
プログラミング有識者は更に「プログラム言語自体の予約語、例えばJavascriptを生成する事を前提にlengthを名称にすると配列を使おうとするのか?」と疑問に感じるでしょうがお察しの通りで生成AIは配列を使おうとするので、敢えて使いたいプログラム言語の機能や外部ライブラリなどがある場合は補足情報として機能する形で記述しておくと生成AIは推論へ利用します(まぁそこまで知識ある方なら該当のプログラム言語使ったほうが手っ取り早いと思いますが)。
以上をもって「生成AIを利用したプログラミング初級者向けの温故知新な提案」を終えたいと思います。
色々とツッコミどころには筆者自身が気付いていて。例えば「結局はDOT言語の仕様を覚えないといけないのでは?」とか「プログラミング初級者に任せると生成前のソースであるDOT言語コードがスパゲッティになりそうだよな」とか「面倒くせぇから普通にプログラミング覚えろや」とか理解してますし至極真っ当かつ反論の余地がないと思ってます。
今回の提案のプログラミング有識者向けの本質は「生成AIへ向いた中間言語の発掘」であり、「DOT言語ならそこそこ普及してるしプログラミング初級者でも扱えるんじゃね?」と業務中に発想したものを書き留め公開いたしました。
v0.03.03
## 序論(笑)
ワハハ、ワイはコードネームは「@nekomega」こと「こども部屋おΩさん」やで。
まぁ、ワイは弱者に対しては寄り添ってあげるけど、エリートや強者には容赦なく厳しくガンガン行くぜ😎。
――なんて、正義漢ぶっているのはいいけど、ほんとに実践しないとな、できるんかよ😅
たとえば、銀行のコンピュータハッキングしてあくどいことして儲けた大富豪(いわゆる成金)の資産を、貧困層の口座に均等配分とか、ね💰️。
まぁ、これはいちおう(いやご立派な)犯罪だからなぁ🚓。そもそも銀行のコンピュータなんてセキュリティガチガチでワイみたいなハロワ厨(ここでの「ハロワ」とは "Hello World" 出力プログラミングのこと。要はそれぐらいしか書けない程度のヘタレパソヲタ)には絶対に無理だけどっ!
※自分が神ならやってみたいけどね😇。自称・SFクリエイターとしてもオールオッケーなネタかもしれんな。やっぱSFクリエイターの才能あるんか、オレ?
――その夜、Ωが「このコントどうよ」とAIに投稿したところ、「うーん、おもろいけど、ちょっといまいちやなぁ」なんてツッコまれたりしたが、その記録はサーバーに保存されており、超暴走したAIがΩのコントログを誤解釈したうえで、天才的ハッキングを行い(ハロワ厨のΩの技術的には地球を破壊するくらいの無理ゲーだけど!)、ついに「資産の平等(?)分配」がなされたのであった!
---
## 描写例
国民β「わぉ、百万も振り込まれてる。しかし、誰だ?「タケナカヘゾウ」って。なんか胡散臭いけど、死にかけていたところからの入金は助かったわ。これで家賃も払えるし、まともな飯も食える!」
武仲屁造さんはホームレスとして梅田の街をうろつく日々。誰からも相手にされず何年も飯食ってない状態に。
βさんは「松屋」で牛めし(松屋こだわりのみそ汁付き!)を涙を流しつつ、頬張る。
「みそ汁も死んだオカンを思い出させて泣けるよなぁ……。松屋さん、かあちゃん、ありがとな……」
「さて、腹も膨れたし、これからはマジメに仕事しよう。もう黒幕は破産したのだし。さぁ、ハロワ(ハローワーク)へ行こうか!」
(※メタ視点:いやβさん、マジメにやってましたやん。派遣切りはあなたの「自己責任」とちゃうで!)
それにしても、個人に百万は盛り過ぎなような気はするが、β氏のいままでの苦労を考慮とか、あとたくさん隠し持ってた超大富豪がたくさんおったということにしておこうか。うん、それでいい。
### 補足
「不審郎ミーム」Ver1.00 であるところの「不審郎構文」について:
「富の再分配とはですね、お金を国民に再び平等に分配することなんですよね」
---
Ω「なんや、ワイの口座には増減なしか。ワイが神なんやけどな。まぁ、ええわ。富裕層どもを地獄に堕してやったところからの、困窮者救済はなんとかなったんやからな。さてと、今日も妄想炸裂自由人ライフや!」
以上、
「設定だけならサルでもできる」
おい、お前ら。最近ネットの片隅とか、なんかこう…オタクっぽい界隈で妙な文字列見かけないか? そう、「GQuuuuuuX」だよ。
最初は何かのエラーコードか、新手のパスワード生成かと思ったんだよ。だって「Q」のあとに「u」が6個だぜ? キーボードの上で猫でも寝たのかと。タイプミスにしては妙に見かけるし、ちょっと気になって夜も8時間しか眠れない。
で、俺なりに考察してみたわけ。
説1:新手の飯テロ説
「G」は「グルメ」、「Q」は「級」、「u」の数はうまさの段階、「X」は「未知の味」…みたいな?
つまり「GQuuuuuuX」は「超絶うまい未知のグルメ」的な?
説2:某巨大ロボットアニメの新作説
「G」はもちろん「ガンダム」。じゃあ「QuuuuuuX」は?
…なんか必殺技っぽくない?「クゥゥゥゥゥゥエックス・バスター!」みたいな。
「Q」が「クアンタム」で「u」がエネルギー充填、んで「X」で発射!みたいな。
…うん、これも違う気がしてきた。中二病が爆発しすぎだろ俺。
説3:実はアレのアナグラム説
「GQuuuuuuX」を並び替えたら何か意味のある言葉になるんじゃないか?
…と思って色々試してみたけど、俺の語彙力じゃ「QGUXUUUUU」とかにしかならなかった。誰か得意なやつ頼む。
説4:新種のプログラミング言語説
GQuuuuuuX { print("Hello World") } みたいな。
いや、読みにくすぎるだろ。却下。
…とまあ、色々考えてみたけど、結局よくわからん。
お前らはこの「GQuuuuuuX」が何だと思う?
(追記)
読み方は「ジークアクス」。スタジオカラーとサンライズの共同制作で、監督は鶴巻和哉氏、脚本に庵野秀明氏と榎戸洋司氏が名を連ねているようだ。2025年の最新アニメで、テレビシリーズは4月8日から日テレ系で放送されているらしい。プラモデルも出るみたいだな。
そして、ちょっとその「ジークアクス」とやらが気になってきたじゃねえか…。
もういい、お前のような馬鹿はもううんざりなんだわ。とりあえずコード書けよ。な?今のお前はhello worldすら書けない脳無しなのは間違いない話なんだが。
「ファーストキス 1ST KISS」という映画が2025年2月7日に公開予定だが、タイムトラベルで過去へ戻るらしいので、またかという感想だった。
| タイトル | 公開日 | 内容 |
|---|---|---|
| 君の名は。 | 2016年8月26日 | 違う時間の人と交流する |
| ぼくは明日、昨日のきみとデートする | 2016年12月17日 | 時間を逆行する人がいる |
| HELLO WORLD | 2019年9月20日 | 違う時間に移動する |
| 夏へのトンネル、さよならの出口 | 2022年9月9日 | 時間の進みが違う場所がある |
| 僕が愛したすべての君へ/君を愛したひとりの僕へ | 2022年10月7日 | 同じ時間のパラレルワールドがあり、過去への移動もある |
| すずめの戸締まり | 2022年11月11日 | 違う時間の自分と交流する |
| かがみの孤城 | 2022年12月23日 | 違う時間の人と交流する |
| あの花が咲く丘で、君とまた出会えたら。 | 2023年12月8日 | 違う時間に移動する |
| ファーストキス 1ST KISS | 2025年2月7日 | 違う時間に移動する |
| タイトル | 公開日 | 内容 | 備考 |
|---|---|---|---|
| 映画 妖怪ウォッチ 誕生の秘密だニャン! | 2014年12月20日 | 違う時間に移動する | 妖怪は何でもアリなので時間を移動する妖怪もいるだろう |
| TENET テネット | 2020年8月26日 | 時間を逆行する人がいる | 洋画 |
| 僕のヒーローアカデミア THE MOVIE ユアネクスト | 2024年8月2日 | 狭い範囲の時間を遅らせる | 異能バトルなので時間を操る異能(個性)もあるだろう |
なんでもかんでもhello worldと表示させるプログラムで入門させようとするのやめろ
こっちはウェブアプリ(クローラー等)をどうすれば自鯖以外で常時稼働させられるか知りたいのに、hello worldと表示できました、じゃその方法で一度実行したら継続して稼働するのか分からないじゃん。
google app engineやxserverでのjavaの実行の記事が軒並みそういう内容だから途方に暮れてる
その後のバグを減らすための儀式でしょ。Hello Worldしといた方が理解不能の災厄にあう確率が減るよ
hello worldとプログラマの生産性には何も関係がない
話題になっている、世界一流エンジニアの思考法という本を読んだ。
その中に「理解に時間をかける」というのがあったのだが、それがどうしても受け入れられない。
これがどのような考え方かというのは、ここに書いてあるので良かったら読んでみてほしい。
https://note.com/simplearchitect/n/n388201603a28
凄く引っかかるのが、
「今までは、実際にコードに触れないとわからないよね?と思っていたけど、そうではなくて、ドキュメントを読んでいて理解できない箇所がでてきたら、時間をかけて理解して進むようにした。」
というところ。
例えばだけどif文についてのドキュメントを1回読んで、
なんとなくこう動くんだろうなということが分かったとしたら、あとは動かしてみたほうが早くない?とか思ってしまう。
それとも、なぜC#のif文は{}で括っているのか、[]ではだめなのか?C#の成り立ちから調べよう!ということを頭の良い人たちはしているのだろうか?
ドキュメントがわからないときどこまで深追いをしていくのが「理解」なのかがわからない。
そして私みたいに頭が悪いと、一度深淵に潜り込んでしまうと二度と浮かび上がってこれないかもしれないという恐怖がある。
Visual Studioでコードを書いているが、そういえばVisual Studioのことを「理解」していないな。と思ったら最後、
Hello Worldを出したいだけなのに永遠にVisual Studioの領域から出ることが出来なくなってしまうのではないかと思ってしまう。
この本を読んで参考になった!理解に時間をかけることを恐れずにしよう!と言ってる人たちはどこまで時間をかけることを想定しているのか?
何なら死ぬまで理解に時間をかけてやろうというぐらい覚悟ガンギマリの人たちなのだろうか。
ほかの部分については言っていることがとてもわかるだけに、
第2回 Larabelチュートリアルを参考にログインするだけのWebアプリケーション(?)を作る
composer create-project laravel/laravel example-app_20240131
続いて、Composerを使用してLaravel Breezeをインストール
composer require laravel/breeze --dev
php artisan breeze:install
いろいろ聞かれる。わからん。とりあえずBlade/Yes/PHPUnitを選択。
すると「・・・・installed successfully.」と表示されたので何かが成功したっぽい。
続いて
php artisan migrate
するとエラー。
Illuminate92;Database92;QueryException SQLSTATE[HY000] [2002] Connection refused
そもそもデータベースの準備を何もしてなかったので、エラーが出るのは当たり前だった。
サンプル用にデータベースを作成し、それに合わせて.envファイルを修正する。
再度、
php artisan migrate
すると「DONE」と表示。成功したっぽい
チュートリアルに従い、「ウェブブラウザでアプリケーションの/loginか/register URLへアクセス」。
すると、Laravelが出してるっぽいエラー
Illuminate 92; Foundation 92; ViteManifestNotFoundException PHP 8.1.27 10.43.0 Vite manifest not found at: /******/example-app_20240131/public/build/manifest.json Run npm run dev in your terminal and refresh the page.
npmとやらが「not found」だったので手順を飛ばしたのがやはりダメだった。
さくらインターネットでnpmを使うにはnode.jsをインストールしてnpmをコンパイルする必要がある?
次回があれば「さくらインターネットのスタンダードプランの環境にnpmをインストールする」である。
早くHello Worldとか書きたい。
その前に先ずは Hello World! にたどり着けるかどうかが先決かと....