はじめにの前に
こんにちは。初めて記事を書くので文章下手だったらすみません...
あとQiita以外にもZennとかnoteとかいろんなサービスがあってどれがいいか迷ってるんですよ。使い分けとかあったら教えて欲しいです!(とりあえず今回は全部に書いてみようと思っています!)
はじめに
本題に入ります。
8月11日から16日までセキュリティ・キャンプ2025 ジュニアに参加してきました!
https://www.ipa.go.jp/jinzai/security-camp/2025/camp/junior/index.html
これに参加するために書いた応募課題を晒していこうと思います!(めっちゃ遅れたけど)
来年以降にジュニアに参加するみなさんの参考になればとてもうれしいです!!!
※一応応募課題は公開していない情報などもあるので、そのあたりの情報は今回は書きません。ごめんなさいm(_ _)m
課題について
課題のURLはこちらです。
https://www.ipa.go.jp/jinzai/security-camp/2025/camp/junior/sbn8o1000000c6pu-att/kadai_junior.txt
今回は聞かれたことが5問ありました。それぞれの問題について目的とぼくの回答を載せます。
1問目
1問目は「未経験言語でプログラミングしてください」という問題でした。おそらくこれは新しい言語に挑戦する姿勢・吸収力を確認することが目的だと思われます。
ぼくは、Javaを使ってプログラミングをしてみようと考えました。
そこでまず、Javaの環境構築をしました。参考にしたサイトは、https://qiita.com/kojiro513/items/a02fe957069e86fd39fd です。
途中で、VSCodeの拡張機能を入れたときに2回JDKをインストールしそうになったので、最初にインストールしたJDKを消そうと考えて、https://docs.oracle.com/javase/jp/16/install/installation-jdk-macos.html#GUID-F9183C70-2E96-40F4-9104-F3814A5A331F を見ながらアンインストールしました。
そこで、VSCodeの拡張機能の方からもう一度JDKをインストールしました。そして、
javac -version
というコマンドで、JDKがインストールされてるか確認しました。
そこからは、VSCodeのナビゲーションに沿ってJava Projectを作成しました。
ナビゲーション通りとりあえずデバッグをしようとしたら、.NETSDKがインストールされてない、twxs.cmake拡張機能をアンインストールすることを推奨、Docker拡張機能はContainer Toolsになりつつあるので、今すぐインストールして試すことができると3つ通知が来たので、全てすることにしました。まず.NET SDKはMicrosoft公式ページからインストールしました。そして、CMake拡張機能をアンインストールして、最後にDocker関係のことをしました。.NETがインストールされたか確認するために、dotnetというコマンドを使いました。これで準備ができたはずなので、もう一度デバッグボタンを押してみました。しかし、.NETのSDKが開けないと出てきたので、一度VSCodeを再起動してみました。すると、Hello, World!と表示されました!
次に、Javaを使って素数判定プログラムを作ってみました。このサイトを参考にしながらプログラミングしました: https://qiita.com/automation2025/items/bac9c319b8c98d91d9ea
このようなプログラムを書きました。
入力1:
public class Prime {
public static void main(String[] args) {
int number = 10;
if ( number % 2 == 0 ) {
System.out.println(number + "は素数ではありません。");
} else {
System.out.println(number + "は素数です!");
}
}
}
出力1
JavaTutorial % /usr/bin/env /Library/Java/JavaVirtualMachines/temurin-21.jdk/Contents/Home/bin/java -XX:+ShowCodeDetailsInExceptionMessages -cp /User
s/username/Developer/JavaTutorial/bin Prime
10は素数ではありません。
しかしこれでは、偶数と奇数の判定になってしまっていることに気づいたので、2から決めた数字まで、全ての数字で割り算をしてみるようにしました。
入力2:
public class Prime {
public static void main(String[] args) {
int number = 37;
int count = 2;
while (count < number) {
if ( number % count == 0 ){
System.out.println(number + "は素数ではありません。");
break;
} else {
count++;
if (count == number) {
System.out.println(number + "は素数です!");
}
}
}
}
}
出力2-1:
JavaTutorial % cd /Users/username/Developer/JavaTutorial ; /usr/bin/env /Library/Java/JavaVirtualMachines/temurin-21.jdk/C
ontents/Home/bin/java -XX:+ShowCodeDetailsInExceptionMessages -cp /Users/username/Developer/JavaTutorial/bin Prime
3は素数です!
出力2-2:
JavaTutorial % cd /Users/username/Developer/JavaTutorial ; /usr/bin/env /Library/Java/JavaVirtualMachines/temurin-21.jdk/C
ontents/Home/bin/java -XX:+ShowCodeDetailsInExceptionMessages -cp /Users/username/Developer/JavaTutorial/bin Prime
15は素数ではありません。
このようにしっかりと判定することができました!
もう一つBMIの計算のプログラムを作ろうと思いました。
入力:
public class BMI {
public static void main(String[] args) {
String name = "econanringo";
double weight = xx.x;
double height = x.xx;
double bmi = weight / (height * height);
System.out.println(name + "さんのBMIは" + bmi + "です!");
}
}
出力:
JavaTutorial % /usr/bin/env /Library/Java/JavaVirtualMachines/temurin-21.jdk/Contents/Home/bin/java -XX:+ShowCodeDetailsInExc
eptionMessages -cp /Users/username/Developer/JavaTutorial/bin BMI
econanringoさんのBMIはxx.xxxxxxxxxxxxxxxです
また、入力機能も入れたかったので、自分で入力して計算できるようにしました。
入力:
import java.util.Scanner;
public class Input {
public static void main(String[] args) {
System.out.println("あなたの名前を入力してください(ニックネーム可):");
Scanner iname = new Scanner(System.in);
String name = iname.next();
System.out.println("あなたの身長を入力してください(cm):");
Scanner iheight = new Scanner(System.in);
double height = iheight.nextDouble() / 100;
System.out.println("あなたの体重を入力してください(kg):");
Scanner iweight = new Scanner(System.in);
double weight = iweight.nextDouble();
double bmi = weight / (height * height);
System.out.println(name + "さんのBMIは"+ bmi + "です!");
}
}
出力:
JavaTutorial % /usr/bin/env /Library/Java/JavaVirtualMachines/temurin-21.jdk/Contents/Home/bin/java -XX:+ShowCodeDetailsInExc
eptionMessages -cp /Users/username/Developer/JavaTutorial/bin Input
あなたの名前を入力してください(ニックネーム可):
econanringo
あなたの身長を入力してください(cm):
xxx(非公開)
あなたの体重を入力してください(kg):
xx(非公開)
econanringoさんのBMIはxx.xxxxxxxx(非公開)です!
2問目
2問目は「今までのバグの経験を振り返ってみてください」という問題でした。おそらくこれは、問題解決力・論理的思考力を見ることが目的だと思われます。
- ぼくは競技プログラミングをしています。これはバグではなくエラーに近いですが、そこでPythonでif文を使うときに、
if x = 0:
print(“A”)
などとしてしまって、代入と比較をよく間違えてしまい、よくエラーが出てしまいます。
だから、x == 0に修正するとうまくいきました。 - Flutterを使って、Firebaseを使う時に、このような例外がよく発生します。
Unhandled Exception: (corenot-initialized) Firebase has not been correctly initialized
これの解決方法を調べたところ、GoogleService-Info.plistをXcodeのプロジェクトの中にあるRunnerを入れることで解決できました。
3問目
3問目は面倒な作業と自動化の発想について聞かれました。おそらくこれはコンピュータ活用の発想力・日常に問題意識を持てるかを確認することが目的だと思われます。あと、これについては講義であった「オリジナルのコマンドを作ろう!」の内容に近かったのでそれについて聞かれているとも思います!
- ぼくが使っていたパソコンは、ストレージが少なくて、いつもキャッシュや不要なファイルを消しながらプログラミングなどをしていました。しかし、それを毎回するのが面倒でした。
そこで、キャッシュやログデータなどが溜まっているフォルダをsudo rm -rf
で削除して、さらに、それをcron
で定期的にすれば自動でキャッシュやログを削除することができると考えました。 - ぼくのパソコンは、スクリーンショットを撮るとデスクトップに保存されていきます。しかも、名前が長くて、時間しか分からず大変です。そこで、ファイル名を最初から変更する方法はわかりませんでしたが、
/Documents/screenshots
という自分で作ったフォルダに保存することはできました。 - プログラムを書いているときに、コードを整形するのが面倒です。そこで、prettierやeslintなどを使うことで、簡単に自動でプログラムの整形ができました。
4問目
4問目はプログラミングで作ったものについて聞かれました。おそらくこれは受講者のプログラミングのスキルレベルや経験を把握することが目的だと思います。
ぼくは、ほぼ毎日プログラミングをしています。学校ではRaspberry Piを使って電子工作をよくしていて、家では、Webアプリケーションを作ったり、iOS, Androidアプリケーションの作り方について学んだりしています。
ぼくは次のようなWebページ・アプリを作りました。
- 非公開(言語はJavaScriptを中心に使って、Reactというフレームワークを使って作りました。900行くらい) URL非公開
- 非公開(TypeScriptを主に使って、Next.jsというフレームワークを使って作りました。また、Firebase Authentication, Firebase Cloud Firestoreも使いました。2400行くらい) URL非公開
- Cellect(CELLというコミュニティで開催されているXのスペースでの感想や質問などの投稿アプリ)(アーカイブサイト同様TypeScript, Next.js, Firebase Auth, Firebase Cloud Firestoreを使って作りました。2200行くらい)https://cellect.vercel.app/
- Studia(勉強サポートアプリ)(開発中)(こちらも、TypeScript, Next.js, Firestore, Firebase Authを使って作りました。600行くらい)https://studia-econan.vercel.app/
5問目
5問目はキャンプ中に作りたいものについて聞かれました。おそらくこれはモチベーションやアイデア力、また個人開発でしたいことについてイメージできているのかについて把握することが目的だと思われます。
ぼくは、炎上を防ぎたい人や、不快なものを見たくないような方たちに使ってもらえるSNSを作りたいと思っています。炎上しそうなポストかどうかはAIを使って判断して、炎上しそうなポストは、あらかじめポストする人に警告を表示します。ポストは、炎上する覚悟がある場合はポストすることもできるようにします。
また、そういうポストなどを見たくない人にも使ってもらえるように、見たくない設定をしたら炎上しそうなポストや不適切なポストはフィルタリングされて表示されるようなSNSを作りたいです。
Flutterを使って、Web、iOS、Androidの全てに対応させたいです。また、認証やデータベースなどは、Firebaseを使って作ろうと思っています。炎上しそうかどうか判断するAIは、ChatGPTのAPIを使って作る予定です。アプリの動作は添付しているフローチャートのとおりです。
また、この作品には、次のような懸念される問題があります。
・炎上しそうかどうかを判断するために使うChatGPT APIが、投稿内容を読み取るときに、もし個人情報が含まれてしまっていたら、学習に利用されてしまう可能性や、そもそも個人情報を投稿してしまう可能性。→これは、Google CloudのCloud Data Loss Prevention APIを利用したり、プライバシーポリシーや同意画面を設置することで解決できると思います。
・不正ログインや、不正アクセス、なりすましなどが起こる可能性→Firebase Authenticationで多要素認証を有効にしたり、強いパスワードでしか登録できないようにすることで解決できると考えます。
・Firestoreに保存されているユーザーデータや投稿データが自分以外も勝手に編集・削除できる可能性→Firestoreのセキュリティルールをより強固なものにしたり、投稿するときにユーザーのuidを保存することでデータが書き換えられていない証明をしたり、Firebase AppCheckを利用することで解決できると思います。
また、職場体験でこのアプリのNext.js版を作って職場の方に頂いたアドバイスで、今あるSNSのXやInstagramなどで使える拡張機能として作ると、もっと使ってもらえるというアドバイスや、SNSを作るならもっと炎上のない平和なSNSや、静かなSNSなど、もっと世界観をつくるとさらによくなるというアドバイスをいただいたので、このアドバイスも考えながら作っていきたいです。
また、これは炎上を防ぐだけですが、ChatGPTのAPIを使っているので、応用して、炎上を防ぐのはもちろん、アプリでポストする内容を管理できるようなものを作りたいです。具体的には、単語やアプリの説明を入力したら、ChatGPTがバズりそうなポストを考えて、そのアプリからChatGPTが考えたポストも投稿できるような機能を作ります。
おわりに
今までのセキュキャンのパンフレットを見て今までの参加者の声を見たら、質も大事だけど量も大事っぽい文章が結構書いてあります。ですので、とりあえずたくさん書いてみてそこから質も上げていくのが大事だと思いました。
また、主査の方のアドバイスも毎年書かれているので、ぜひそれも読んでみてください!(結構ぼくはこれを参考にしました。
もし何か質問などがありましたら、遠慮なくXのDMで質問してください!(きたものはほとんど目を通すようにしてます。あと、答えられない質問があったらごめんなさい。ほとんど答えられるように努力します!)
同じような内容をnoteやZennでも書いてるのでもしよければ見てください!
最後まで読んでくださりありがとうございました!
(Xなどで感想をつけてポストしてくださるとこれからがんばろうと思っている方々の目につくかもしれないのでもしよければお願いします!)