ゲーム作りは楽しい

なんか書く

エンジニアとキッザニアの違い 徹底比較

はじめに

エンジ(園児)のニアとキッド(Kid=子供)のニアであって、どちらも似たようなものに感じますよね?

今回はこれらの違いについて調べてみました。

エンジニア/ キッザニア徹底比較

エンジニア キッザニア
概要 技術を駆使してシステム・機械・ソフトなどを開発する専門職 子ども向け職業体験型テーマパーク
対象 主に社会人(学生含む) 子供
業務内容 プログラミング、設計、テスト、問題解決など いろんな職業を遊びながら体験
使用言語 C++, Python, Javaなど 日本語(たまに英語)
必要スキル 専門知識など 特になし
服装 私服やスーツなど ユニフォーム
報酬 給料(リアルマネー) キッゾ
お金 もらう側 払う側(入場料など)
有給休暇 法律で保障(契約による) なし
産休・育休 会社制度によって取得可能 なし
健康保険 健康保険、厚生年金、雇用保険など なし
住宅手当 会社制度によって支給 なし
通勤手当 会社制度によって支給 保護者の負担

まとめ

エンジニアとキッザニアは全然違う
キッザニアは、キッド(子供たち)、アニア(~の国)をザニイ(楽しい)でつないだ造語らしい

【C++】ポムポムプリンを応援しすぎてやりがちなプログラミングミス

はじめに

今年もサンリオキャラクター大賞をやっていますね。

さて、
ポムポムプリンを応援するあまりに、このような凡ミスをしてしまう事が多いのではないでしょうか?

import std;

int main()
{
    std::cout << 33  << std::endl; // error
}

上記のソースコードコンパイルエラーになるのですが、何が間違っているか、おわかりでしょうか?

そう。* にすべきところを あやまって にしてしまっています。

今回はこのような凡ミス対策の例をご紹介します。

oshiri.hpp

#pragma once
#define * *
#define おしりのしるし *

上記のようなヘッダーファイルを作成します。
せっかくなのでC++20モジュールのヘッダーユニットを使用しましょう。

import std;
import "oshiri.hpp";

int main()
{
    // OK
    std::cout << 33 << std::endl;
}

ヘッダーユニット

通常のモジュールエクスポート/インポートではdefineを伝搬はできません。
しかしヘッダーファイルを作成してヘッダーユニットとしてインポートした場合はdefineを使用することができます。
includeとの大きな違いとして再エクスポートした場合defineはエクスポートされないので、影響範囲を狭めることができます。

export module pompom;
// 再エクスポート
export import "oshiri.hpp";

export
{
    int PomPom();

// ヘッダーユニットでなければdefineはエクスポートできない
#define ポムポムプリンのけつのあな *
}
module :private;

int PomPom()
{
    // OK
    int pom = 3 おしりのしるし 3;
    // OK
    return pom * pom;
}
import std;
import pompom;

int main()
{
    std::cout << PomPom() << std::endl;

    // 再エクスポートしていてもdefineはエクスポートされない
    // std::cout << 3 * 3 << std::endl;

    // 通常のモジュールのインポートではdefineはエクスポートされない
    // std::cout << 3 ポムポムプリンのけつのあな 3 << std::endl;
}

まとめ

  • ポムポムプリンかわいい*
  • defineを使って*のタイプミスをカバー
  • モジュール開発の際はヘッダーユニットを使いこなそう

【Git】マージできた後は、マジレンジャー歌いたかった

はじめに

gitを使った開発で、無事にブランチがマージされた時はやっぱり嬉しいですよね!(?)

そんな時は、魔法戦隊マジレンジャー歌いたくないですか?

グリーングランド!
ピンクストーム!
ブルースプラッシュ!
イエローサンダー!

レッドファイヤー!(レッドファイヤー!)

冒険の始まりさ!

GitHooks post-merge

.git/hooks/post-mergeスクリプトを作成します

#!/bin/bash
start "https://www.youtube.com/watch?v=4mMJoCh7qS8&t=79s"

ダメな所

やっぱり、広告が流れ出すとめちゃめちゃガッカリします

関連記事

コンフリクトした時は以下を参考にconflictを歌いましょう。

mahou-ptr.hatenablog.com

Switch2 一足先に体験させてもらいました。

4/26,27日にSwitch2の体験会が行われますね

僕は一足先にSwitch2を体験させていただきました。

#include <iostream>

int main()
{
    switch(2)
    {
        case 2:
        std::cout << "落選" << std::endl;        
        break;
    }
}

ChatGPTにムカついたので作ったChatYesMan

はじめに

ChatGPTなどのAIは便利でいいですね!
しかし、特定の条件化では求めている答えをしてくれない時があります。
そんな特定の条件化でも自分の求めている答えを返してくれるアプリを作りました。

ChatYesMan

ChatYesManは、常に「はい」と言ってくれます。
自分の気持ちすべてを肯定してくれます。

ChatYesManは、とにかく共感して欲しいシチュエーションでは、ChatGPTよりも効果を発揮する場合があります。
(ChatGPTはかたくなに否定してくることもあるので困ります。期待を裏切られます)


簡単な実装は以下のようにすることができます。

import std;

int main()
{
    while (true) {
        std::string input;
        std::getline(std::cin, input);
        if (input == "exit") {
            break;
        }

        std::println(">> はい");
    }
    return 0;
}

おまけ

ところで std モジュールは試したことがありますか?
VisualStudioでは簡単に試すことができます。

標準出力もC++23で std::print を使うと今時な感じがしますね。

では。

【備忘録】EditorGUI リンクタグクリック時の処理

EditorGUI.hyperLinkClicked

EditorGUI-hyperLinkClicked - Unity スクリプトリファレンス

<a>タグで囲ったテキストのクリック時の処理を登録できる。
なお、hrefはデフォルト登録されているので実装は不要。

対応しているレイアウト

EditorGUILayout.TextFieldEditorGUILayout.SelectableLabelに対応している
表示するだけなら、後者で良いと思うが
勝手にスクロール表示になったりするので注意

以下みたいにしておけば、普通のラベル表示っぽくできる

GUIStyle labelStyle = new GUIStyle(GUI.skin.label);
labelStyle.wordWrap = true;
labelStyle.richText = true;
var height = labelStyle.CalcHeight(new GUIContent(Text), EditorGUIUtility.currentViewWidth);
EditorGUILayout.SelectableLabel(Text, labelStyle, GUILayout.Height(height));

もう10年プログラミングやってるのに、キャリッジリターンを知らなかった

改行コードでLFとかCRLFとか嫌と言うほど見てきたけど
雰囲気でやってるから…

だって、使ったことなかったんだもん

#include <iostream>
#include <chrono>
#include <thread>

int main() {
    int total = 100;
    for (int i = 0; i <= total; ++i) {
        if (i > 0) {
            std::cout << "\033[F";
        }
        std::cout << "\rProgress: " << i << "%\n";
        for (int k = 1; k <= i / 2; ++k) {
            std::cout << "■";
        }
        std::cout.flush();
        std::this_thread::sleep_for(std::chrono::milliseconds(50));
    }
    std::cout << std::endl;
    std::cout << "Complete!" << std::endl;
    return 0;
}