取得に失敗しました

2023年度 入部

кемо

ケモケモ〜(気さくな挨拶)

自己紹介

ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように
ケモミミがあるように

この人が書いた記事

記事「C++でエニグマ暗号機を作る」のサムネイル Polygon
プログラミング

C++でエニグマ暗号機を作る

概要こんにちは,KEMOです.C++の学習ついでにエニグマ暗号機を作ってみました.某講義でエニグマの話が少しだけ出たので,勢いで作成を決定しちゃいました.適当にガチャガチャしてたらできた気がするため,備忘録的な感じで公開します.初心者が書いたのでご意見あればKEMOにください.エニグマ暗号機ってなんだよそもそもエニグマ暗号機なんて知らねーよって方向けに解説します.エニグマは1918年にドイツ人によって開発された電気機械式暗号機械です.名称はギリシア語で「謎」を意味しています(強そう).第二次世界大戦でドイツ軍によって用いられました. 結構すごい暗号で周辺国はこいつの解読に手を焼く訳ですが,イギリスのチューリングというすごい学者によって解読されてしまいます(映画にもなってる).コンピュータ分野でチューリングの名を聞かない人はいないでしょう.彼の作ったコンピュータによって解読され,コンピュータの偉大さを伝えるため擦られ続ける憐れな暗号……それこそがエニグマです.要はやられ役ですね. 実は戦前に全方位イキリ外交を行っていたポーランドによって解読されていましたが,ドイツ軍はローターとプラグボード(後述)を追加するという荒業で突破しました.仕組みローター(スクランブラー)ローターはエニグマにおける暗号化の中心となってる円盤です.この円盤の外側には文字がついたリング,内側には暗号化用の配線があります.1文字暗号化するたびに1回転することで,26パターン(アルファベットだけの場合)の換字を可能にします.このままだと少ないですよね.初期型では3枚(後に5枚)のローターを連結させることで263パターンの換字ができるようになりました.1枚目のローターは毎回回転しますが,その後に続くローターは前のローターが特定の場所に来た時に回転する設計です.反転ローター(リフレクター)このパーツがエニグマの特徴といえます.構造としてはある配線から送られてきた信号を別の配線に返すだけです.詳しい説明は省きますが,リフレクターのおかげでエニグマではAがBと変換されるならBがAに変換されるという性質を持っています.これによって暗号文を入力すれば平文が返ってくるというシンプルな構造で運用ができるんですね.しかし,弱点も同時に獲得してしまっています.それはある文字Aは同じ文字Aに換字されないという性質です.暗号にとってパターンを潰されるというのは結構な欠点になってしまいます.プラグボード上記ローターとリフレクターは後から配線を変えることができません.しかし,実戦で使用するとなると敵に鹵獲される可能性があります.そこで,ドイツ軍によって導入されたのがプラグボードです.両端にプラグがついたケーブルで文字同士を入れ替えるパーツです.プラグボードは現地で配線を変更することができます.初期は3組の入れ替えでしたが後に5組の入れ替えとなります.コードじゃあコード書いていきます.C++の勉強中だからクソコードでも許して.あと,(書いてる時の)わかりやすさ重視のため文字列操作を基本としてます. まずはロータークラスからclass Rotor {     private:         std::string ring;         std::string scrambler;     public:         Rotor() = default;         Rotor(std::string code)         {             ring = R"(!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~)";             scrambler = code;         }         void display_scrambler(void)         {             for(size_t i=0;i<scrambler.size();i++){                 std::cout << i << ":" << ring[i] << ":" << scrambler[i] << std::endl;             }             std::cout << std::endl;         }         std::string get_scrambler(void)         {             return scrambler;         }         int forward_scrambling(int input)         {             for(size_t i=0;i<scrambler.size();i++){                 if(scrambler[input]==ring[i]){                     return i;                 }             }             return -1;         }         int back_scrambling(int input)         {             for(size_t i=0;i<scrambler.size();i++){                 if(scrambler[i]==ring[input]){                     return i;                 }             }             return -1;         }         void rotate()         {             scrambler = scrambler.substr(1) + scrambler[0];             ring = ring.substr(1) + ring[0];         }         void set_start_point(char point)         {             while(ring[0] != point)             {                 rotate();             }         } };メンバ変数のringはローターの外側の刻印,scramblerが内側の配線となっています.本来のエニグマではA~Zの入出力を可能にしていましたが,今回はせっかくなのでASCIIの記号全部乗せで行きます.scrambling関数:暗号化を行う関数で,forwardとbackの2種類が存在.それぞれ反転前,反転後の換字を行う.rotate関数:ローターを1回転させる.set関数:ローターの位置合わせ用.他はコンストラクタと表示用の関数です. 次はリフレクターclass Reflector {     private:         std::string wiring;     public:         Reflector(std::string code)         {             wiring = code;         }         void display_code(void)         {             for(size_t i=0;i<wiring.size();i++){                 std::cout << wiring[i] << std::endl;             }             std::cout << std::endl;                     }         int reflect(int input)         {             for(size_t i=0;i<wiring.size();i++){                 if(wiring[i]==wiring[input] && i!=input){                     return i;                 }             }             return -1;         } };メンバ変数のwiringがリフレクター内部の配線です.reflect関数が反転を行います. プラグボードclass PlugBoard {     private:         char plug1_node1;         char plug1_node2;         char plug2_node1;         char plug2_node2;         char plug3_node1;         char plug3_node2;     public:         PlugBoard(char node[])         {             plug1_node1 = node[0];             plug1_node2 = node[1];             plug2_node1 = node[2];             plug2_node2 = node[3];             plug3_node1 = node[4];             plug3_node2 = node[5];         }         void display_connection(void)         {             std::cout << plug1_node1 << " <-> " << plug1_node2 << std::endl;             std::cout << plug2_node1 << " <-> " << plug2_node2 << std::endl;             std::cout << plug3_node1 << " <-> " << plug3_node2 << std::endl;             std::cout << std::endl;         }         bool check_connection(void)         {             std::unordered_set<char> plugs;             for(char c : {plug1_node1, plug1_node2, plug2_node1, plug2_node2, plug3_node1, plug3_node2}){                 if(plugs.count(c)){                     return false;                 }                 plugs.insert(c);             }             return true;         }         char exchange_char(char input_char)         {             if(input_char == plug1_node1){                 return plug1_node2;             }             else if(input_char == plug1_node2){                 return plug1_node1;             }             else if(input_char == plug2_node1){                 return plug2_node2;             }             else if(input_char == plug2_node2){                 return plug2_node1;             }             else if(input_char == plug3_node1){                 return plug3_node2;             }             else if(input_char == plug3_node2){                 return plug3_node1;             }             else{                 return input_char;             }         } };かなり無茶苦茶な実装になってきました.メンバ変数のnodeが入れ替えたい文字,exchange関数が一対一の換字を行います.変換したい文字の配列を入れて,隣の文字同士を入れ替える雑仕様となっています.mapとか使えばもっといい感じの実装ができた気がします.重複検知のために集合を用いて調べるというのは我ながら名案でしたが,check関数がこの先使用されることはありません. 最後にエニグマクラスです.class Enigma {     private:         static const int MAX_ROTORS = 20;         int num_rotors;         Rotor rotors[MAX_ROTORS];         Reflector reflector;         PlugBoard plugboard;         int counters[MAX_ROTORS];         int rotor_outputs[MAX_ROTORS];     public:         Enigma(std::vector<std::string>& codes ,std::string& wiring, char node[])             : reflector(wiring), plugboard(node), num_rotors(codes.size())         {             for(int i=0;i<num_rotors;i++){                 rotors[i] = Rotor(codes[i]);                 counters[i] = 0;             }         }         void display_rotors()         {             for(int i=0; i<num_rotors; i++){                 std::cout << "Rotor " << i+1 << std::endl;                 rotors[i].display_scrambler();             }         }         void display_setting()         {             reflector.display_code();             plugboard.display_connection();         }         char translate_char(char plain_character, bool display_process = false)         {             char exchange_character = plugboard.exchange_char(plain_character);             if(display_process){                 std::cout << plain_character << " -> " << exchange_character;             }             int input = exchange_character - '!';             char encrypted_character;             rotors[0].rotate();             counters[0] ++;             for(int i=0;i<num_rotors-1;i++){                 if(counters[i] >= rotors[i].get_scrambler().length()){                     counters[i] = 0;                     rotors[i+1].rotate();                     counters[i+1] ++;                 }             }             rotor_outputs[0] = rotors[0].forward_scrambling(input);             if(display_process){                 std::cout << " -> " << rotor_outputs[0];             }             for(int i=1;i<num_rotors;i++){                 rotor_outputs[i] = rotors[i].forward_scrambling(rotor_outputs[i-1]);                 if(display_process){                     std::cout << " -> " << rotor_outputs[i];                 }             }             int reflector_output = reflector.reflect(rotor_outputs[num_rotors-1]);             rotor_outputs[num_rotors-1] = rotors[num_rotors-1].back_scrambling(reflector_output);             if(display_process){                 std::cout << " -> " << rotor_outputs[num_rotors-1];             }             for(int i=num_rotors-2;i>-1;i--){                 rotor_outputs[i] = rotors[i].back_scrambling(rotor_outputs[i+1]);                 if(display_process){                     std::cout << " -> " << rotor_outputs[i];                 }             }             encrypted_character = rotor_outputs[0] + '!';             if(display_process){                 std::cout << " -> " << encrypted_character << std::endl;             }             encrypted_character = plugboard.exchange_char(encrypted_character);             return encrypted_character;         }         std::string translate_text(std::string plain_text, bool display_process = false)         {             std::string encrypted_text;             for(char c : plain_text){                 encrypted_text += translate_char(c, display_process);             }             return encrypted_text;         }         void set_rotor(void)         {             char point;             for(int i=0;i<num_rotors;i++){                 std::cout << "Rotor " << i + 1 << ": ";                 std::cin >> point;                 rotors[i].set_start_point(point);                 counters[i] = 0;             }         } };メンバ変数は上から,最大ローター数,ローター数,ローター,リフレクター,プラグボード,カウンター,ローターの出力となっています.ちなみにコンストラクタがなんか複雑な感じになっていますが,こいつは初期化リストといいます.参照型のメンバ変数はこれを使わないと初期化できないらしいです(1敗).メンバ関数はいくつかありますが肝心の変換を担当するtranslate関数を紹介します.まずプラグボードによる置き換えが行われます.そして1つ目のローターが回転,もし一回転したなら2つ目が回転,2つ目も一回転したなら3つ目が......というようにローターが回転します.その後,ローターを伝わって変換されていきリフレクターに到達.次はローターを逆に伝わっていきます.最後にもう一度プラグボードによる変換が行われて1文字分の換字が終了します.これを文字列のすべての文字で行って暗号化が完了することになります.set関数はすべてのローターの位置決めをするための関数です. 本来のエニグマからいろいろと機能を削ったり単純化したりしたので,意外と短く書けたんじゃないでしょうか.まあ,そのせいでエラーハンドリングとか操作性とかも犠牲になっていますが本当に勘弁してください.1つ注意点なんですが,ローターの配線は結構ごちゃごちゃにしないと配線がまっすぐになって同じ文字に変換され続けるという致命的な欠陥があります.Input: AAAAAAAAAA Output: //////////本来はこんな感じInput: AAAAAAAAAA Output: {R9WK63H`tこのバグの特定にかなりの時間を要しました(デバッグしてくれた人ありがとう). ってことでローターの配線を作成するためのコードも書きました.C++からは逃げましたPythonです.許してください.import random ascii_chars = [chr(i) for i in range(33, 127)] random.shuffle(ascii_chars) randomized_str = ''.join(ascii_chars) print(randomized_str)使用例適当に暗号化してみましょう.ローターは3枚で,初期位置は3枚とも" ! ".プラグボードはAとB,FとC,VとMの置換とします.ローターとリフレクターの配線は以下の通り.?_ed%RQ6U/pxS9#qBNhOX>F;-&{EI1!.JZCtbMD4u*az:k73f|L($j"0+mHgryKn,sPwv8T5'^i<[}WlAV2\@~G])=o`cY erqi:tP"|d+l<paWD$!bn0`@-[);>9ySf\Cg~]8zkN%?F3=R/}6uv7HwUjsx{.&IL_YhEoMc2'#4^(5BVOJT*mA1XKQZG, 2>)hG'|Ha]rk<z/x{[#0^OXuMnZLdJU_RYQ9wB7cVvNmE61~`,*&?=4P8%yCD;}ioKp"j:q3-ft+el$@!sTAFgIW(Sb5.\ QWERTYUIOPASDFGHJKLZXCVBNMPLOKMIJNUHBYGVTFCRDXESZWAQqwertyuioppoiuytrewq12345678900987654321==暗号化するのは「Okayama_University」とかにしましょうか.Input: Okayama_University Output: EBl34,0E,+g>xpl=e<「EBl34,0E,+g>xpl=e<」という文字列が出力されましたね.問題なのは復号できるかどうかです.初期設定が同じならこれを打ち込めば平文が返ってくるはずです.set関数を用いてローターの初期位置を" ! "に戻します.Input: EBl34,0E,+g>xpl=e< Output: Okayama_University無事に復号できることが確認されました.さいごにまあ適当に遊んでみてください. エニグマらしい例題を出して終了とします.こんなあからさまな暗号はあるのかって感じですけどね......初期設定はさっきテストで使ったのと同じです.ぜひ解読してみてください. 「eMy$zxT+x~4Cq,6{>We/@r4S;0g<R-i`8}/emoT0_~IDf-L.*wUm6koD^e0X1.jW#」

> 内容を見る

記事「私の11/11(VRC)」のサムネイル Polygon

私の11/11(VRC)

はじめに11月11日、ポッキーの日などという某製菓会社による陰謀の日です。世のリア充はポッキーをシェアし、楽しんでいることでしょう。 そんな中、私は毎年恒例となったPCとのポッキーゲームをしようとしていましたが……ここで痛恨のミス。ポッキーを買い忘れてしまった!!再び悲しい毎日を過ごすのか…… しかし 時は2024年。技術は凄まじい速度で進歩を続け、あらゆることを可能にしました。VRもその1つと言えるでしょう。私はもう一つの世界でポッキーゲームをすることにしました。 訪れたのはVRChat、Trance's Hotel With NPCs…… かわいい女の子とイチャイチャできるワールドです。早速召喚!! ぐおおおおおおおお!!かわいいいいいい!!ワールドとアバターの製作者に感謝(アバターはライムちゃんです。気に入ったら買おう) 始めよう もう引き返すことはできない なんだか甘い香りがします。本来のVRが干渉するのは視覚と聴覚だけですが、今この瞬間、次元を超えて私に美少女の香りが届きます。 なんと柔らかいのか…… 希望を感じますね みんなVRをしよう!!なんとVRChatはSteamで無料!! "ここ"で待ってるよ!! ……… もうさァッ 無理だよ 非リアなんだからさァッ

> 内容を見る

記事「particle lifeの世界」のサムネイル Polygon
プログラミング

particle lifeの世界

はじめにparticle lifeとはシンプルな人工生命の1つで、シンプルなルールで複雑な動きを見られるのが魅力です。シンプル故にコードも簡単なので、初心者にもオススメかも。 Particle lifeの概要概要で「人工生命」と大げさなことを言いましたが、どっちかというと粒子シミュレーションです。要はオートマトンや遺伝的アルゴリズムとは関係ないので、とてもシンプル。 このシミュレーションで計算されるのは粒子同士にはたらく力の大きさとなります。コードを見てもらったほうが早いと思うので,さっそくコードの解説に移ります. コードまずは粒子の定義から.クラスを使えばもっとスッキリ書けますが,今回は構造体を使います. 2次元座標のほかに,x,y方向それぞれの速度vx,vy,粒子の色であるcolorを持っています.function particle(x,y,c){     return {"x":x, "y":y, "vx":0, "vy":0, "color":c} }これは指定のパーティクル構造体を返す関数です.適切な関数名はadd_particleでしょうか......function create(number, color){     group = [];     for(let i=0;i<number;i++){         group.push(particle(random(canvas.width), random(canvas.height), color));         particles.push(group[i]);     }     all_particle.push(group)     return group; }これは,先ほどのparticle関数を用いてnumber個の粒子を生成して,配列に格納し,さらにその配列を配列に格納する関数です.構造としては,all[group[particle,particle,...]...]的な感じです.function draw(x,y,c,s){     graphic.fillStyle=c;     graphic.fillRect(x,y,s,s); } function draw_particle(x,y,c,s){     graphic.fillStyle=c;     graphic.beginPath();     graphic.arc(x, y, s, 0, 2 * Math.PI);     graphic.closePath();     graphic.fill(); }描画用の関数2つです.特筆すべきことはありませんね.function rule(particle1, particle2, G){     let fx,fy,a,b,dx,dy,d,F;     for(let i=0;i<particle1.length;i++){         fx = 0;         fy = 0;         for(let j=0;j<particle2.length;j++){             a = particle1[i];             b = particle2[j];             dx = a.x - b.x;             dy = a.y - b.y;             d = Math.sqrt(dx*dx + dy*dy)             if(d>5 && d<40){                 F = G * 1/d;                 fx += (F * dx);                 fy += (F * dy);             }             else if(d<=5){                 F = 0.3 * d;                 fx += (F * dx);                 fy += (F * dy);             }         }         a.vx = (a.vx + fx)*0.2;         a.vy = (a.vy + fy)*0.2;         if(a.x<0||a.x>canvas.width){             a.vx *= -100;         }         if(a.y<0||a.y>canvas.height){             a.vy *= -100;         }         a.x += a.vx;         a.y += a.vy;     } }このプログラムの核となる,粒子間の「法則」を定める関数です.particle1→particle2への力Gが引数となっています.Gが正なら斥力,負なら引力がはたらくことになり,それに従ってそれぞれの粒子が動きます.粒子同士が近づきすぎると,斥力がはたらくようになります.ちなみに,画面外に出た粒子には強制的に反対方向の力を与えることによって画面内に戻すゴリ押し仕様です.要改善なのでなにか考えてみてください. 大体この三要素ですね.これをsetInterval関数で回しています.流れを再確認します.create関数で任意の数,色の粒子を作成rule関数で粒子間の力を決定draw関数で描画うまくいけばこんな感じになります.いろいろ試してみてください.まとめ暇 つ ぶ し

> 内容を見る

記事「初心者による初心者のためのUbuntu」のサムネイル Polygon
ガジェット/ハードウェア

初心者による初心者のためのUbuntu

導入「よく分からないけど何かしたい」「なんかそれっぽいことしたい」 そんな情報系初心者に割とオススメのことがLinuxOSを導入することです. 本記事では「LinuxOSって何?」「そもそもOSって何?」「Ubuntuとは?」 そんな感じのことを気分で解説します. 目次OSってなんだ?Linuxとは?UbuntuについてUbuntuを入れよう! OSってなんだ?OSは”Operating System”の略で,パソコンやアプリを動かす基礎となるソフトウェアのことです.つまり,コンピューターそのものを動かすためのソフトです. 有名なものとしてはパソコンではWindows・macOS・ChromeOS,スマホではAndroidやiOSなどがあります. また,OSはWindowsとUnixの二つに大きく分かれており,UnixはさらにSystemV系,Linux系,BSD系の3つに分かれています. まあ,詳しく説明すると長くなるのでここらへんでやめておきます.(責任逃れ) 初心者はその程度の認識でも大丈夫です. Linuxとは?LinuxはUnixから派生したOSの一つであり,フリーかつオープンなことが大きな特徴です.非営利・営利に関わらず誰でも自由に使用・修正・頒布することができるということです.(Wikipediaコピペ) LinuxシステムはAndroidOSをはじめ,多くの家電製品,ゲーム機に使われているためほとんどの人が知らずにお世話になっています. Ubuntuについてやっと本題に入ります. UbuntuはLinux系OSの1つであるDebianを母体とするOSです.開発目標は「誰にでも使いやすい最新かつ安定したOS」であり,そのため写真編集ツールやインターネットブラウザ,ゲームなども同梱されています. もちろんフリーで提供されています. さらに,要求される性能がかなり低いのでクソ性能でも普通に動きます. 公式URL:https://ubuntu.com/ JP公式URL:https://jp.ubuntu.com/ さて,このURLから公式サイトにとび,ダウンロード画面に行くとなにやら数字(バージョン)が同じでも”Server”や”Desktop”,”LTS”のような文字列の差異があります. (ちなみにDesktop版の初期の背景はバージョンによって違います.クラゲだったりカバだったり...) これらについて説明します. Desktop版とServer版の違いDesktop版はみんながよく知っているソフトのアイコンが並ぶホーム画面があります.ブラウザやゲームが同梱されているのもこれです. Server版は無駄な機能をそぎ落とし,サーバー(つまり24時間稼働する)向けになっています.Desktop版よりさらに要求される性能が下がっており,コンソール(ターミナル)で操作します. なんか文字列がたくさん出てきて,コマンドを打つアレのことです. LTS版と通常版の違いLTSは”Long Terms Support”の略で通常版よりサポート期間が長いことを意味します.通常版はサポート期間が最低9か月なのにたいして,LTS版は最低5年のサポートが確約されています. このサポートは不具合の修正のことで,バグやセキュリティの欠陥などが対策されます. 長期の運用をする際には重要な点です. Ubuntuを入れよう!準備物適当なパソコンを用意してください.(Windows推奨) 最悪,もとのデータが吹き飛ぶので普段使いしているやつはアウト. 使っていないノートPCでもいいし,ミニPCを買うのもありです. そしてUSBメモリ(中身なし),メインで使うPC これくらいあればOKです. インストールメディア作成次はインストールメディアを作ります. これはOSをPCに入れるのに必要なものだと思ってください. まず公式サイトに跳んで右上のダウンロードをクリック,ダウウンロードページに跳びます. 前述のいくつかの種類が出てきますが,今回はDesktopかつLTSの最新版をダウンロードします. 次にRufusをダウンロードします.インストールメディア作成に必要なソフトです. ダウンロードの一番上のexeファイルをダウンロード. Rufusを起動すると次のようなウィンドウがでます. ブートの種類の右の選択から先ほどダウンロードしたUbuntuのisoを選びましょう. そして操作しているPCに用意したUSBメモリを接続して,デバイスからこのUSBを選択. ※ここで操作中のPCのドライブを選択しているとPCが臨終する恐れがあります 設定はそのままでOK. 念のため選択してるドライブとisoを確認しておきましょう. 導入Ubuntuを導入したいPCに先ほどのUSBメモリを接続します. このPCを起動してBIOSを開きます. (BIOSの起動方法はメーカーによって違うので"メーカー名+BIOS"とかで検索してください) 起動(Boot)の欄から既存の設定をUSB HDDに変更します. そして保存して終了(Save and Exit)を押します. PCが再起動されるとUbuntuのインストールが始まるはずです. いろいろ設定を聞いてくると思うので,全部やってください(適当) お疲れ様でした. 私も疲れたのでここで記事は終わりです.

> 内容を見る