Skeyllのブログ

インディーデベロッパー

【Unity】スクリプトで様々な形のSpriteを作成する

 UnityではTexture2DからSpriteを作成することができる。Texture2D自体はインスタンスを作るだけで作成できるため、スクリプトから自在にSpriteを作成することができる。
 ちなみにSpriteというものはUnityでUIのイメージ画像や2Dモデルとして使用されているものだ。これをImageやSpriteRenderに設定することで画像(外部から取り込んだものも含む)を画面に表示している。

f:id:Skeyll:20200726130226p:plain

環境:Windows10、Unity 2019.2f
コード: BlogSample/Unity/Sprite at master · skeyll/BlogSample · GitHub

Spriteを作成

Sprite.Createを使うことでSpriteを作成することができる。引数のタイプには種類があり、すくなくとも(Texture2D texture, Rect rect, Vector2 pivot)の三つは指定する必要がある。
 Texture2Dの作成自体は簡単であり、高さと幅を指定してコンストラクタで新しくインスタンスを生成するだけでいい。これで作成したものをそのままCreateの引数に指定してもいいが、別途色を変更することもできる。

using UnityEngine;

public class SpriteCreater : MonoBehaviour{
    //UnityEditer上で2D→Spriteを作成し、それをアタッチする
    [SerializeField] SpriteRenderer testSprite;
    void Start() {
        CreateSquare(9);
    }

    void CreateSquare(){
        //(Width, height)
        Texture2D texture2D = new Texture2D (128, 128);

        //最初から色を付けたい場合はテクスチャの各ピクセルに色を入れていく
        //単色の場合はあとからカラーを指定して変更することもできる。その場合は以下Sprite.Createまで不要
        int pixelAmount = 128 * 128; //テクスチャの高さや幅はピクセル数を表すので総ピクセルは両辺の積
        Color[] changedPixels = new Color[pixelAmount];
        for (int i = 0; i < pixelAmount; i++) {
            changedPixels.SetValue(Color.white, i);
        }

        texture2D.SetPixels (changedPixels);
        texture2D.Apply();

        Sprite sprite = Sprite.Create(texture2D, new Rect(0, 0, texture2D.width, texture2D.height), new Vector2(0.5f, 0.5f));
        
       testSprite.sprite = sprite;
    }
}

四角形以外のSpriteを作成

 Texture2Dには高さと幅、そして色と画像の表示方法に関する設定以外を指定することができない。そのため、実際は正四角形以外のSpriteを作成することはできないが、表示したくない部分の色に透明を指定することで疑似的に他の形のSpriteを作成する。
 なおPixelは左下を原点として左から右へ、下から上へと添え字が与えられる。底辺の長さと剰余計算を使えばだいたいの場合で理想の形を作ることができる。

一部が欠けた長方形

using UnityEngine;

public class SpriteCreater : MonoBehaviour{
    [SerializeField] SpriteRenderer testSprite;
    void Start() {
        CreateNewTexture(9);
    }
    void CreateNewTexture(int commandAmount){
        //Pure rectangle
        int width = 65 * commandAmount;
        int row = 1 + commandAmount / 7;
        int height = 65 * row;
        //Create rextangle texture
        Texture2D texture2D = new Texture2D (width, height);
        //Rectangle pixels
        int pixelAmount = width * height;
        //Amount of colored pixels in a low 
        int clearBaundary = 6 - (commandAmount % 6);
        //Create array for color
        Color[] changedPixels = new Color[pixelAmount];
        //input color
        for (int i = 0; i < pixelAmount; i++) {
            if(i >= pixelAmount / row){
                changedPixels.SetValue(Color.white, i);
            }else if (width / clearBaundary <= i % width){
                changedPixels.SetValue(Color.clear, i);
            }else{
                changedPixels.SetValue(Color.white, i);
            }
        }
        //Create texture with pixels
        Texture2D newTexture = new Texture2D (texture2D.width, texture2D.height, TextureFormat.RGBA32, false);
        newTexture.filterMode = FilterMode.Point;
        newTexture.SetPixels (changedPixels);
        newTexture.Apply();
        //Create sprite of texture
        Sprite sprite = Sprite.Create(newTexture, new Rect(0, 0, texture2D.width, texture2D.height), new Vector2(0.5f, 0.5f));
        testSprite.sprite = sprite;
    }
}

三角形

using UnityEngine;

public class SpriteCreater : MonoBehaviour{
    [SerializeField] SpriteRenderer testSprite;
    void Start() {
        CreateTriangle();
    }    
    void CreateTriangle(){
        //Pure rectangle
        int width = 65;
        int height = 65;
        //Create rextangle texture
        Texture2D texture2D = new Texture2D (width, height);
        //Rectangle pixels
        int pixelAmount = width * height;
        //The part of clear
        int heightCount = 0;
        //Create array for color
        Color[] changedPixels = new Color[pixelAmount];
        bool putColor = false;
        //input color
        for (int i = 0; i < pixelAmount; i++) {
            if((height * heightCount) == i){
                heightCount += 1;
                putColor = false;
            }else if((height * heightCount) - heightCount == i){
                putColor = true; 
            }
            if(putColor){
                changedPixels.SetValue(Color.white, i);
            }else{
                changedPixels.SetValue(Color.clear, i);
            }
        }
        //Create texture with pixels
        Texture2D newTexture = new Texture2D (texture2D.width, texture2D.height, TextureFormat.RGBA32, false);
        newTexture.filterMode = FilterMode.Point;
        newTexture.SetPixels (changedPixels);
        newTexture.Apply();
        //Create sprite of texture
        Sprite sprite = Sprite.Create(newTexture, new Rect(0, 0, texture2D.width, texture2D.height), new Vector2(0.5f, 0.5f));
        testSprite.sprite = sprite;
    }
}

まとめ

 スクリプトから動的にSpriteを作成するのはブロックの形が定まっていないテトリスやおえかきアプリなどで使えるかもしれない。UIのImageと2DモデルとしてのSpriteは同じ画像描写だが描画方法が異なっており、画像を動かす場合はSpriteRenderを利用した方がパフォーマンスがよくなる。しかし、SpriteはせいぜいScaleが変更できるぐらいで、動的に描画したものを変更することは難しく、例えばLayoutGroupで描画しているものを変更することはできない。
 そのため、操作可能な所持アイテムの入ったサイズが変化するインベントリ(例えば最大装填数が変わる銃のマガジンのようなもの)をゲーム中に作成するためにこのコードを書いたが、インベントリ内に綺麗にアイテムを並べる手間や、サイズの調整が難しいSpriteでアイテムをインベントリに合うサイズで生成する手間などのために使うことはなかった。インベントリをGUIで、動かすアイテムをSpriteで二重に作成した方が明らかに楽だからだ。
 しかし、ネットを検索してもSprite作成に関して出てくるのは正四角形か、元画像を上書きする形での操作ばかりであったためこの記事を作成した。役に立つかはわからないが、使い道があれば幸いだ。

参考
Unity - Scripting API: Texture2D
Unity - Scripting API: Sprite
[https://kan-kikuchi.hatenablog.com/entry/Texture2DToSprite:title=Texture2DからSpriteを生成する【Unity】 - (:3[kanのメモ帳]]
Textureをスクリプトから編集してみる - のしメモ アプリ開発ブログ
Unityで学ぶ画像処理【色の変換編】 - のしメモ アプリ開発ブログ

シンギュラリティの丘、ゾンビのさまよう街

 AIへの期待は年を追うごとに高まっている。ビジネス誌が「AI」の素晴らしさを語り、「Python」や「機械学習」という単語を通してAIに遭遇する。データサイエンティストは高収入であり、今最も旬な職業だと喧伝される。
 しかし、具体的なAIの事情について知るものは少ない。人は時間も体力もなく、実際に勉強することは難しい。だから、「AI」に期待を抱いて、シンギュラリティ(技術的特異点)を待望する。プログラミング言語Python」は人々の暮らしを大きく変えてくれるはずだ。人は労働から解放されて、あらゆる煩雑な仕事はAIが対処する。政治問題や学問研究すらもAIがこなしてくれるはずだ、と淡い夢が語られる。


 こうした考えと現実の間には大きな乖離が存在する。通常、人が人工知能と言われて想像するものは汎用人工知能と言われるものだ。ロボットの知能を担い、未知の問題を謎解くSF風なスーパーコンピュータが真っ先に浮かぶ。しかし、これは現在話題に上がるような「AI」とは全くの別物だ。ビジネスの文脈で語られる「AI」はプログラムを発展させたものであり、何かしらのデータやルールを元に結果を予測するものでしかない。無からは何も生まれない。「AI」とてそれは同じで人間の手で材料を用意してやる必要がある。
 「AI」に最も重要なのは何をデータとして与えるかという選択だ。データに偏りがあれば、分析結果にも偏りが生まれてしまう。機械学習の手法は他者が提供してくれるかもしれないが、「データ」は自然発生するものではない。学習の手ほどきでサンプルの集め方も解説されているかもしれないが、ビジネスは多岐にわたり、目的によっても扱べきデータも異なる。結局、「AI」といってもコンピュータの補助がある統計学にすぎず、そのビジネス分野の潤沢な知識と使用者のセンスがあってはじめて効果を発揮する。


 では、汎用人工知能はどうだろうか。いまだ実用化には至ってはいないが、技術の発展により人を焚きつけて一層の研究が行われている。もし、汎用人工知能が実現したらSFのような、未来予想として語られような世界は訪れるのだろうか。


 実現した場合のことを予想してみよう。AIは完璧であり、全ての最適化問題が解決される。AIがAIを開発して現在の比ではない以上の技術成長が起こる。AIが仕事を担い、人々は生産から解放される。分配もAIによって行われ、政治はAIが取って代わり真の平等が達成される。
 社会主義の理想ではないか。たった30年前に全てを否定されたにも関わらず、全く異なる文脈で全く同じ夢を見る。しかし、今回は人間ではなく、機械なのだから汚職は行われず、より優れた施策が行われるはずだ。

 生産活動はAIによって最適化が実現するため、資源が有効活用される。時間や金銭的な余裕が増えて人口は増加する。生産は拡大されるが、やがて生産の限界を迎えて人口の調整を提言される。筋肉は人類の敵だ!消費エネルギーが増えるために運動は否定されて、最低限の栄養摂取で生きることが良しとされる。労働から解放されたために知能が衰えて、肉体的にも退化したゾンビが街を徘徊するだろう。

 いや、そんなことはない。調整すればいいのだから、不都合な未来は防ぐことができるはずだ。人類がAIを従えた世界が訪れる。人の好みを元にAIが研究を行い、新商品を提案する。人類の欲望が完全に満たされる理想的な未来への舵取りが人間主体で行われる。
 しかし、これまでの歴史は失敗と成功の繰り返しが築き上げてきた。優れた文化や物が普及して、競争に敗れたものは歴史の影に忘れられる。無謀な国家や個人の盛衰が人類史の軸には存在する。変化とは未知の遭遇だ。AIが導き出した答えも競争に晒されるのだろうか。より優れた知能ならばより多くの答えを求め出すだろう。その全てを比較してみるのだろうか。
 AIは完全無欠だ!必ずや競争に勝ち上がるはずの答えだけが導き出されるはずだ!はたして、完全とは一体なんであろうか。万能論的な考えは人類史の中でも珍しいものではなく、隆盛のたびに否定されてきた。人は全てを知ることはできない。それはコンピュータでさえ同じだ。ある線分上に存在する点を全て抜き出すように、プログラムを書けばコンパイラがエラーを吐くか、無限ループを起こしてプログラムは停止する。データには必ず恣意性が生まれる。それがたとえAIにより収集されるのだとしても全てをデータとして扱うことはできない。

 結局AIは人類の知能を補助するものでしかないのだ。生産活動がAIによって効率化されることはあっても、全てに取って代わることはない。何を行うかは人間が決定するしかなく、結果は個人に帰属する。たとえ導入のコストが十分に低くなったとしても、その恩恵は一部のものしか受け取ることができず、人々が労働からは解放されることはない。あらゆるものにAIが導入された成熟したAI社会が実現したとしても、全ての者が経営者となり競争のリスクだけが大きくなった社会になるに違いない。


 もちろん、誇張して注目を集めるのは発展させるためには有効だ。期待されるほど資金や優秀な人材は集まる。しかし、夢や理想の未来が待っているとは限らない。現在のAI研究は情報工学やIT企業の研究所の中だけで行われている。データと対峙して、人間の脳を解析して、最適化問題の解決に邁進する。こうした情勢の中でシンギュラリティを迎えた時、人類史は平坦な丘を歩み始める。そうして動物農場の家畜へと成り果てた自己を目撃することになるだろう。



参考
真のAI「汎用人工知能」(AGI)とは? フィクションか現実か:“人のようなAI”は実現するか【前編】 - TechTargetジャパン データ分析
人工知能 - Wikipedia
F.A.ハイエク 西山千明訳『隷属への道』(春秋社 2008)
F.A.ハイエク 気賀 健三、古賀 勝次郎訳『自由の条件』(春秋社 2007)
ウィリアム・H. マクニール 増田 義郎、佐々木 昭夫訳『世界史 上・下』(中公文庫 2008)

【ゲーム開発】プログラミングを無料で独学する方法とそのコツ【主にC#】

 プログラミングをネットを利用して無料で学ぶ方法を紹介する。人によって学びやすい方法が異なると思うので教育機関や本、有料オンライン講座を利用しない第三の学習方法として参考にして欲しい。

 

私の情報

 プログラミング歴は一年強。HTMLとCSSガラケースマホで5年強(『おーぷんあぷり(一日のpv5千)』や『チェンクロ情報局(2万)』など。今はない)、統計学のためにRとVBAをそれぞれ半年やっていたことがある。しかし、同時期にAndroidアプリを作ろうとしてEclipseでhelloworldを出せずに挫折しており、今回はじめたときも何一つわからなかったため全くの初学者と大差ないように思う。

 現在使用している言語はC#、Rust、JavaScriptなど。Unityというゲーム制作ソフトでプログラミングをはじめて、3ヶ月ほど入門書(3000円強)やチュートリアルサイトを眺めてはコピペを繰り返していた。実情としてほとんど理解ができず、入門書にいたっては付属のサンプルファイルをそのまま利用することも多く、あまり意味はなかった。それから2週間かけてC#の基礎を学び、そのつど学習しながら5か月かけて1つアプリを作成。現在は2作目を制作中。

★昔のホームページ(20個ぐらい作ってたうちでデータが残っていたもの。)
auガラケー向けのアプリサイト(なぜかauガラケー以外のアクセスを禁止していた)
f:id:Skeyll:20200501200408p:plain
MHP2G攻略サイト(途中で投げた気がする)
f:id:Skeyll:20200501200420p:plain
昔よくあったウェブサイトを登録するランキングサイト
f:id:Skeyll:20200501200427j:plain

プログラミング言語を選ぶ

 どの言語も大して変わらないので自分が制作したいものに合わせて言語を選ぶのがいい。言語による違いは方言のようなもので、二つ目を学習する時は感覚的に理解することができる。

 選ぶ方法としてはホームページを作りたいのならPHPJavaScript、ゲームならC#C++InstagramYoutubeのようなWebサービスならGO言語など、「〇〇(作りたいもの) プログラミング言語」で検索すれば学習に向いている言語が見えてくる。これは各言語が特定のものしか作れないというわけではない。その言語を使って特定のものを開発する道具(フレームワークやライブラリ)が存在するため、それを利用するために学習すべき言語が違うにすぎない。もし、自分で全てやるのだという場合は好きなものを選ぶのがいい。

 個人差があるかもしれないが、必要は発明の母というように必要が差し迫っていないと学習は進まない。特に一人でやる場合は学習意欲の維持が非常に難しいため、単にプログラミングを覚えたいという目的でプログラミングをはじめてもその他のあらゆる学習と同じようにうまくいかない場合が多いだろう。そのため、入門する言語を選ぶというよりは、学習のためのあまり大規模すぎないことでプログラミングで実現したいことを探す方が大切かもしれない。

 言語が決まったら「プログラミング言語 環境構築 VSCode」で検索してプログラミングを始める準備をしよう。VSCode(Visual  Studio Code)というのはマイクロソフトが開発しているソースコードエディタで、プログラミングに特化したメモ帳アプリのようなものである。無料なうえに簡単に使用でき、軽くて拡張性も高いので、特にこだわりがなければおすすめだ。

 

五つの学習ステップ

 私がC#でプログラミングを始めたため、参考例として示しているものはC#のものが多い。しかし、どの言語であっても基本的な考え方は同じだと予想できるので、適宜類似したサイトを探してほしい。

 

1.プログラミングとは何か?

 プログラミングを理解するためにはプログラミングに関する知識のネットワークを構築する必要がある。外国語と同じようなもので、そのものに関する知識が少なければ正しく理解できない。語形や語順の変化というものは他との比較で評価されるのであり、プログラミングにおいても雑多な知識が理解の助けとなる。

 まずはドットインストールやProgateを利用して一月ぐらいかけて概観を学ぶ。これらを見ても理解できることは多くないかもしれないが、完全ににわかるまでやる必要はない。他とのつながりで見えてくることも多いため、途中で立ち止まるよりは期間を開けて二回やるのがいい。

 あまりに何一つ理解できない場合は「プログラミング ハードウェア 勉強」、「プログラミング 用語 英語」、「オブジェクト指向 関数言語」など学習する上で見つけたプログラミングに関係のありそうな言葉で検索して直接関係のないIT周りの知識を増やすのがいいかもしれない。これらはプログラミングをやるならばいつかは必ず学ぶことになる上に、理解するかどうかではなく知識的な部分が多い。そのため無駄になることはなく、手軽に知識を増強することができる。



言語の学習

一週間で身につくC#言語の基本

時々文章の欠落や誤字があるが短くてプログラミングの概要を知るのに良い。C、C ++、Javaに加えてSQLもある。



・ [https://prog-8.com/:title=Progate | プログラミングの入門なら基礎から学べるProgate[プロゲート]]

利用したことがないのでわからないが、おすすめされているのをよくみる。



ドットインストール

Unityの入門期間に利用したが初学者にはやや難関かもしれない。理解できずにコピペしていた記憶がある。



その他周辺知識

新人SEのための「プログラムが動く仕組み」(第1回) | 日経クロステック(xTECH)

ハードウェアに関する記事。ググって出てきたここの記事はよく見ていた。基本的に文書ばかりであまり混み入った話はしないため手軽に読める。飛ばし飛ばしであっても次何かの理解を助けるため有用。



コンピュータの基礎知識 | ++C++; // 未確認飛行 C

より詳しい解説。別方向からの解説も欲しい場合に(より難解なため3ヶ月目ぐらいでないとわからないかも)。ハードウェアの知識は一見無駄に見えるが、プログラミングそのもののイメージが掴みやすくなったり、プログラムを書く時に効率の良さを意識しやすくなる。



連載:C#入門 第8回 式と演算子 - @IT

ここもいくつか見た記憶がある。パソコンに向かって本格的に取り組む必要もないため、気まぐれに見るのもいいかもしれない。



オブジェクト指向と10年戦ってわかったこと - Qiita

初心者の頃はQiita(プログラミング情報を寄稿するサイト)やはてなブログで伸びている(星やいいねが多い)記事をよく見ていた。概念的なことへの理解はほとんどプログラムに役に立たないが、概念について語る場合プログラミングの概観にも当然として触れるため知識自体は増える。コードについて考えるのに疲れた時はたまに検索して眺めている。



「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典

プログラミングの用語を専門用語をあまり使わずに解説しているサイト。初学者がつまずきそうな用語ならたいてい載っているため異なった視点からの説明が必要な場合に使える。



IT用語辞典 e-Words

プログラミングの用語をよりきっちりと解説しているサイト。わからない単語が出てきたらとりあえずネットで検索するとここか上記のサイトが出てくるのでなんとなくどういう意味なのかを理解するとより理解が進むかもしれない。



そのほかにも見ていたが、こうした周辺知識に関するメモは取っていなかったため参考文献に関するメモが残されていなかった。ここに書いたものは参考まで記憶していた一部でしかないが、気まぐれに検索して眺めてから学習に戻るとより一層理解が進むことが何度もあった。そのため周辺知識を増やすこと自体には一定の効果はあると思う。

★学んだことはOnenoteにメモしている。すべてを記憶できるわけではないので、実際にプログラミングしているときにメモを見返して書くことも多い。

f:id:Skeyll:20200501195905p:plain
 

②実際にプログラミングする

 チュートリアルをやったところで何かが作れるようになるわけではない。知識を定着させるには利用する必要がある。そのため実際に何かを作ってみるのがいい。注意点としては何かを作るには、初学者の想像している5倍の時間が必要だということだ。そのためはじめに作るものはあまり規模が大きくなく、一週間程度で作れると考えているものがいい。また、これは練習としてやると途中で投げる理由ができるため、確実に制作したいものの中で簡単に作れそうなものを選ぶのが良い。

 理解の進展が見えるのに3か月はかかる。これは英語だろうが、数学だろうが同じだ。人間は3か月継続しなければ実力の向上を実感することは難しい。もちろんはじめは上記の入門サイトやチュートリアルを見ながら必要な機能を作っていくのもよい。しかし、重要なのは実現したい機能を一つずつ張り付けるのでなく、なぜそれを使うのかという理解の中でプログラムを構築する必要がある。コピペがうまくなったところで結局はチュートリアルと同様のことをしているにすぎず、何かを考えて作り出す力はつかないからだ。

 何かを制作するときにすべきことはメモをとることだ。やるべきこと、やったことをメモしておくことで継続力は大きく変わる。人がプログラムの製作を断念する最も大きな理由は、何をすべきかがわからなくなることにあると思う。人は何かをやるか考えるよりも惰性的な作業の繰り返しを望む生き物だ。そのため、あらかじめ何かをやるべきかを思いついた時点でメモしておけば、作業を始めるさいに無駄なエネルギーを消費してからプログラミングに取り書かなくてすむ。

 たとえばホームページを作っていて新しく追加するものを思いついたならメモ帳にその内容を羅列しておく。それを実際にどのように実現すべきかが想定できるのならば、「画像を取り込む」、「画像を使ってボタンを作成する」などそれぞれ作業内容によってわけるのもいいと思う。これは必ずしも翌日にやる必要はなく、やるべきことが多ければ一月後に取り組むことかもしれない。しかし、メモしておくことで、次回作業に取り組む自分に課題を与えるだけでなく、致命的な作業のし忘れを防ぐことができる。

 やった内容のメモを取る意味は過去の変更内容を見返せることだ。作業内容を常に覚えているとも限らないため、記録として残しておくとバグが発生した際や変更意図がわからない場合役立つことがある。また、前日の作業力や、これまでの労力が目に見えることが単純なモチベーションへと繋がる。実際の作業現場ではQA票や工程管理表と呼ばれているそうだ。主Githubというソースコードの変更を記録するサービスもあるのでプログラミングに慣れてきたら利用するのもいいだろう。

★私はOnenoteLibreOfficeにメモを取っている。

 f:id:Skeyll:20200501200814p:plain f:id:Skeyll:20200501200826p:plain



プログラミング技術の参考として使えるもの

++C++; // 未確認飛行 C

日本語で公式ドキュメントのような解説と公式より豊富な例がある。



SE の雑記 | SQL Server の情報をメインに Microsoft 製品の勉強内容を日々投稿

SQL(データベース)について学んでいる時によく眺めていた。



現代の JavaScript チュートリアル

プログラマとして信用できる人がおすすめしていた。



  あらゆる言語に共通しているが、知りたいことがはっきりとしている場合は利用しているフレームワークや言語+公式ドキュメント、公式リファレンスとつけて検索して公式の仕様を見た方が簡潔でわかりやすい場合が多い。異なる例、説明を探す場合や無作為的に知識を増やしたい場合にこうした第三者の情報を当たるのがいいだろう。

 初心者(が書いた)や覚書と書かれた記事は多くの場合、理解よりも混乱をもたらしたため途中からは開かないようにしていた。書いている本人も知識が曖昧であるためわかりにくいことが多い。また、ページ内に参考文献や他サイトへのリンクがないものに関しても、情報として価値が高くないことが多いためざっと眺めてリンクがなければそれ以上は見ない場合が多い。プログラミングは第一発信源でもない限り必ず参考にしたものが存在する。もし、記述内容をより詳しく知りたい場合やその根拠を知りたい場合参考が書かれていなければそれ以上知ることができないかもしれない。また講演や自分発の知識であったのだとしても、学習意欲があるのならば親切のためにその他の情報源を示すという学術上の慣例を踏襲するはずである。したがって、リンクのない情報は情報としての価値が低いということはあながち間違いではないと思う。

 

③問題を解決する

 プログラミングをしていると必ずエラーに遭遇する。慣れないうちは独力で解決するのが難しいため、ネットを利用して解決することになる。たいていエラーコードでそのまま検索すれば解決方法が見つかるが、簡単に見つからない場合は探し方を工夫するか、質問して解決することになる。私自身質問して解決したことがないので、実際にどうかはわからないがわかる他者に聞いた方がより早く、簡単に解決できるであろう。

 しかし、一見手間がかかりそうな検索だけで解決することにも利点は存在する。簡単に解決方法が見つからないということは、解決手段を自分で模索する必要があるということである。解決の過程で多くの情報を得るだけでなく、自分で策を尽くす必要もある。結果としてその模索がプログラミング能力の向上に繋がる。実際私もはじめての作品を作っているときに1週間同じ問題について悩むことが2回あったが明確な技術の成長を感じる契機でもあった。様々なことを試し、考えるため自分で引き出すことができる技術の幅が広がる。また自分で考えるため応用力も伸びる。時間と心に余裕があるのならば独力で解決してみるのもいいかも知れない。

 これはわからないことを解決する場合も同じだが、how to・the way・やり方などをつけたり、発生している問題(ページ 無限に更新されるなど)を単語レベルで表現して検索することが多い。GoogleだけでなくYouTubeで検索すると参考になる動画が検索上位に表示されることもある。日本語にはないが英語では解決方法が見つかることもあるため、その他の言語でも検索をかけてみるのもいいかも知れない。



プログラミングについて質問できるサイト

teratail【テラテイル】|ITエンジニア特化型Q&Aサイト

日本語でプログラミングについて質問できるサイト。いつも眺めるだけだが、高圧的な人も少なく、親切に教えてくれることが多い。どうしても解決できなければ聞いてみるのもいいかも知れない。



Stack Overflow - Where Developers Learn, Share, & Build Careers

英語で質問できるサイト。エラーコードで検索すると出てくることが多い。日本語で質問するより母数が多いためこちらの方が解答が早くつくかもしれない。



Discordredditにもプログラミング関連のコミュニティが存在するため、そちらを利用するのもいいかも知れない。

 

④とにかく実現する

 プログラミング初心者のうちは、とにかく目的を達成すべきだろう。私の場合半年間同じプロジェクトに触り、その後も更新するため全く知識が違う時期の自分の書いたコードを触ることが多々ある。後からより優れた書き方や効率的な方法がわかることがあるが、はじめからもっとも優れたプログラムを書くことを目指していては何一つ学習が進まない。ある程度プログラムがわかれば自然と効率化の問題に発展するわけで、はじめから完璧である必要はない。最適化が必要になれば変更すればよく、とにかく実現さえしてしまえばプログラミングへの理解は確実に進むのである。

 一度感覚を掴んでしまえばプログラミングとの距離は近くなる。この世のあらゆるものが段階を踏む必要があり、プログラミングに限っては最初から最も優れた人間と同じでなければならないということもないだろう。



良いコードを書く技術(まとめ) - Qiita

実現さえできれば良いわけではあるが、後から自分も見返して時には変更を加えることもある。そのためこうした書き方に関する知識も頭のどこかにあった方がいいかも知れない。なお、プログラム自体にメモ書きとしてコメント(//や<--ではじまる文章)を残すことがあるが英語で書くことをおすすめする。はじめは難しくとも、そのうち慣れて検索する際の英語力の向上やコードを公開した時により多くの人間から意見がもらえるようになる。



中途半端に優秀なプログラマが「正しいプログラミングテクニック」だと妄信しがちな3つポイント - 分裂勘違い君劇場 by ふろむだ

この人の文章はメモによく残されている。もちろん好き勝手にやるのもいいかもしれないが、独りよがりであっては他者と仕事ができないため、プログラミング時に意識すべき一つの意見としてよく参考にしている。

 

⑤技術の穴を埋める

 プログラミングが少しずつわかってくると、自分の理解の範囲内だけで課題を解決するようになる。それ以外を知らないということもあるが、それが最も楽な方法だからだ。そうなってはもはやプログラミングの技術力向上は停滞しまう。より優れた方法や書き方があるのかもしれないのに、それを指摘してくれる人も存在しない。

 したがって、自分で定期的に新しい技術を学習する必要がある。学習するときに見かけた知識を派生的に学ぶこともあるが、私は尊敬するプログラマのブログや発言をそのきっかけにしたり、学習総合サイトから気になる単語を選んで学習している。プログラミングの技術は日々刷新されており、学習し終えるということはない。プログラミングをはじめるということは、人生をかけた趣味が一つできるということも意味している

 

あとがき

 この文章を書いたのはSNSで「プログラミング」と検索すると情報商材の広告ばかりが目につくことに端を発する。ネットの情報は多くが自由アクセスできる。ことプログラミングに関しては情報の多くが無料で公開されているものだと認識していた。もちろん全てではないが、基本的なことはほとんどの場合知ることができた。

 たった一年で全てが変わってしまった。情報を販売する潮流が生まれたのだ。もちろんそれが価値のあるものならばいいのだが、たいていは全くそうではない。「高卒」や「文系」ならいざ知らず、「小学生」までがプログラミングの入門方法を販売している。はたして彼らはプログラマなのだろうか。具体的な実績を公開しているものはおらず、GitHubソースコードをアップロードしてバージョン管理するためのサービス)のアカウントを公開しているものもいない。情報商材を購入した者の行き着く先は情報商材の販売であり、プログラミングスクールを卒業したと謳ってやることがプログラミングスクールの紹介だ。プログラミングを学習する目的は情報商材販売の渦に巻き込まれることなのだろうか。

 もちろん、情報の販売それ自体が悪だとは思わない。現に日本でも江戸時代から情報の非対称性を利用したビジネスは確認されている。しかし、そうしたビジネスが自由をイメージさせるプログラミングで行われていることには違和感を覚えた。あなたが十分に知識があるのならば自分で判断すればいい。私も初心者の頃には検索結果に戸惑わされて、多くの時間を費やした。しかし、今ではその錯誤にすら金銭が必要なのだ。

 私自身教育者でも熟練プログラマでもない。これはたんに学習する過程で気が付いた効率的な学習方法に過ぎない。プログラミングの学習には300~1000時間必要だという記述を数多く見たが、これを見てその時間が半分になるわけではない。他のあらゆるものも会得するには、そのぐらいの労力と時間が必要だと経験が教えてくれる。しかし、学習方法の模索に費やす必要がなくなれば、その分学習時間は確実に短くてすむはずだ。

 五つ学習段階として示したが、三つ目が終わる頃に三ヶ月〜半年が経ち技術サイトに書いてあることを自力で読む力はついているレベルに達していると思う。私の歩んだ道が正しいのかはわからないが、そのあと量をこなし、そうして学び続けることの大切さに気が付いたというのを残りの二つで示した。どの段階を脱プログラミング初心者というのかはわからないが、何かを作っているうちに突然道が開ける日が来るはずだ。

 私も最初は何一つプログラミングがわからなかった。自分はプログラミングではなく、将来はアイディアだけでやっていく、だがプログラミングを知っている方が適切なアイディアが出せるからと苦渋を三ヶ月舐めた。しかし、峠さえ超えれば悩んでいたことが嘘かのように取り組めるようになった。だから、プログラミングをはじめるのなら全く理解できなくとも三ヶ月は諦めずにプログラミングに取り組んでほしい。プログラミングが難解なのではなく、知識のネットワークがないためにわからないだけなのだ。この文章プログラミング習得の助けになれば幸いだ。

日本生まれ、日本育ち、私は異邦人

 最近、自分が「外国人」になりつつあるのを感じる。自分の見知った言葉が全く異なる意味を持って発されることが増えた。「自粛」、「責任」もそうだが、私がもっと違和感を覚えたのは「言論の自由」という言葉だ。


 言論の自由という言葉は歴史と密接に関わりがある。日本に限って言えば、大戦中に日本政府の検問があり、政府の意向に沿わないあらゆる出版物が出版を禁止、または改訂させられた。異端分子の芽は摘んでおこうという考えからだ。
もちろん、大戦中にはあらゆる自由が存在しなかった。反戦を訴えるものは秘密警察に暴行され、集会は危険思想を生むとして即座に解散させられた。言論の自由は「表現の自由」とも言われることもあり、その名の通りあらゆる表現を保障したものだ。

 たしかに表現の自由は人が自由に発言すること、いかなる思想を抱こうが国が介入しないことを保障した。そして、これを広義に受け取り、国民も他者の表現を尊重すべきだとする考えは決して悪いことではない。しかし、表現の自由を「人はあらゆることを自由に発言でき、かつ、この発言は必ずしも好意的に受け止められるべきだ」とする使われ方には苛立ちを覚えた過去がある。

 人の悪口を言って回る人間は嫌われて当然だ。見境なく攻撃すれば反撃を喰らうのは自然なことだろう。小学生ですら発言には責任を持ち、言葉で他者を傷つけたならば謝罪を要求される。しかし、責任という言葉が自分が背負うものではなく、自分より目下のものに追わせるものになり、やがて「表現の自由」の意味を変化させた。ヘイトスピーチを批判する行為は「表現の自由」の侵害として現代ではあってはならないこととされる。


 もちろん、これは現代日本に限った話ではない。フリードリヒ・ハイエクは『自由の条件』の中で「自由」という言葉の意味が社会主義者によって変化させられたことを嘆いた。元来、自由(Liberty)は他者の抑圧のない状態のことを指した。今にも崖から落ちそうな人間も次に取り得る選択肢を自分で得られる限りにおいては自由だった。やがて社会主義者があらゆる欲望を実現させられる「自由」を説いた。「自由」に空を飛び回ゆユートピアを訴えて、やがて自由の意味は変化していった。

 現代ではあらゆる概念が無知を理由に書き換えられつつある。「壁ドン」の意味を誤用だと怒れるものには哀れみの目を向けられ、「ギガがなくな」らないものは恥ずかしい人間の烙印を押される。誰もが発言しうる現代では、言葉の意味の変化が早くなった。


 いや、言葉がある概念のイデアであるという事実がそもそも間違っているのかもしれない。我々は言葉が特定の事象と結び付けられているものと考えがちだ。しかし、我々は一時代にしか生きておらず、言葉の意味の変遷を経験していない。当然現代で古文調で話す者はおらず、江戸っ子も存在しない。昔から言葉の意味は都合良く組み替えられて、最も流通した意味が現在広く使われているだけかもしれない。 いずれにせよ広辞苑で「正しい日本語」を学んだ人間は、今急速に「異邦人」になりつつある。

 好んで新たな意味に迎合するつもりも、輪に加わって言葉の意味を訂正する気も起こらない。変化を目撃しているにも関わらず、驚きや悲しみはほとんどない。ときどき苛立ちは感じることはあったが、最近はそれすらもなくなった。言葉を交わせなくなる事実より、変化を客観的に見つめられている事実が自分が「異邦人」たる理由なのかもしれない。

恋は慣れのはてに、愛は日常に

 好みは経験の集積から生まれる。ほかの多くのものと同じ後天的なものだ。ある食べ物が好きだと感じた場合それと似た料理を以前から好きだろうし、第一印象のいい人間はもともと好意のあった人物の面影を持っているだろう。何かを好きになるというのはそれなりの理由がある。

 どのように好みが形成されるかはわからない。経験をもとに無作為に取捨が繰り返されて好みが作られていくのかもしれないし、組み合わせで好みが一意的に決まっていくのかもしれない。しかし、好きになるという行為が先天的な、本能的に行為ではないということはいえる。
 そうした価値基準が先天的なものでないことを示す例はいくつかある。たとえば鳥のヒナは初めて見たものを親だと思いこむ。これを刷り込みという((厳密にはいくつか条件があり、種によっては動くものであったり、鳴き声を出すものなど異なっている。また刷り込みというように親と認識するまである程度の期間が必要)(1))。対象が誰であっても親鳥だと覚えるのだ。はじめて見たものを基準に安全かどうかの境界線を引いていく。先天的に庇護者を記憶して生まれてくるのではない。成長の過程で自分を取り巻く環境について学習する。
 子供は恐れを知らない。痛みを通して危険なものを覚えていく。北海道で生まれ育った人間はゴキブリを恐れることがない。誰もゴキブリが恐怖の対象だと教えないからだ。生き物が本能で恐怖を感じるのなら、なぜどう猛な生き物であっても子供期間は警戒心がないのだろうか。
 もちろん遺伝的影響も唱える説もある。例えばセロトニントランスポーターという不安を抑制する遺伝子の量が人種や地域によって違うという説だ(2)。他にもマウスは世代間で心的外傷が遺伝するという研究結果がある(3)。だが、人間の場合でこうした本能的なものが遺伝するという説を立証しているものは存在しない。
 仮に先天的に人間の情緒や価値観が決まっているのなら、現代の社会システムは全て無価値となる。善悪問わずあらゆる行為に遺伝子の影響が大きく見られるのなら全ての行為は必然的なってしまうからだ。しかし、貧困にあえいだ窃盗犯は泥棒の遺伝子を受け継いでいるのではない。貧困にこそその原因が存在する。人間というものは後天的に形成されていくものなのである。

 では、好みとは一体何だろうか。まずは人間以外の場合を考える。我々は生き物を飼育した際に、飼い主と飼育されるペットの間の信頼を懐くという言葉で表現する。これは生き物や個体によって程度の差はあるだろうが、懐いていないペットは飼い主に心を開いていないと言えるだろう。たとえ爬虫類のような人間との共存が本来ありえない生き物であっても、主人の手から餌をもらっているとそのうち敵ではないとみなすものである。爬虫類が決して懐くことはないのは、本来的に仲間を必要としないからであり、外敵ではないと見なすのは主人とペットの間の最大の信頼関係であろう。
 あらゆる生き物は一朝一夕で懐くことはない。長い時間をかけて自分が敵ではないと示し続けてはじめて信頼関係が築かれる。たった一回好意を示しても壁を解き崩すことはできず、長い時間だけかけても危害を加えていれば距離は離れていく。長期間にわたって相手に好意を示し続けてはじめて信頼というものが生まれる。結局のところ懐くというのは相手が自分に善をもたらす相手だと知ることなのである。
 これは人間にとっても同じである。ある体験を繰り返すたびにだんだんと慣れていき、やがてそれは好みへと変わっていく。なんとも思わなかった音楽が聴くたびに良く思えてくるのはその音楽に慣れた結果だ。コーヒーが好きなのは舌が麻痺したのではなく苦味に慣れた結果だ。若者が教師やタレントに恋をするのは、同級生よりもその相手についての方がよく知っているからだ。なにも感じない広告でさえも繰り返し見るたびに自然とその商品に手を伸ばしてしまうようになる。結局のところ何かが自分の中を侵食していくことが好きという感情の源泉になっている。
 もちろんある経験を繰り返したからといって必ず好きになるわけではない。その結果が好きと嫌いどちらかになるかは、さまざまな条件に左右される。例えば尊敬する相手の口癖が移り、好意を抱いている相手が好きなものは自然と好きになる。憂鬱時にする食事は決して美味しくはなく、嫌な思いをした場所は決して心地よくはない。ある行為が他の要素と結びつくことによって、それ単体であれば全く好みでなかったものに愛着を抱いたり、逆に好みであったものが嫌いに転じてしまう。

 そうした幾度とない試練の先には愛が存在する。愛とは何かについて深く知ることだ。個々の部分について好意の積み重ねが愛を作り出す。あることで嫌な思いをしたとしてもなお好きであり続けるのは、他の部分に対する好きがその一度の経験を補ってありあまるほど存在するからだ。全く知らないものや突拍子のないもので挫折すれば、それは嫌いのまま終わってしまう。だが、すでに好みの体系を築いたものであれば、数多くの経験がその挫折を打ち消すであろう。これは対人関係でも同じことだ。知ることがなければ好きになることはありえず、多くを好きにならなければ愛が生まれることもない。好きという感情が慣れの延長線上に存在するように、愛は好きの先にのみ存在している。
 だが、愛は一度成立すれば永遠に続くというものでもない。好きになったものであってもやがては色あせてしまう。それはより好きなものが現れる場合もあるだろうし、好きであることで得られる幸福感が薄れていく場合もあるだろう。家庭における愛が成立しうる条件はただ一つであり、崩壊する理由がさまざまな理由もここにある。ありのままを受け入れるだけでは、その情熱はいつかは尽きてしまう。なにかを愛し続けるには、常に慣れの過程を繰り返さなければならないのである。
 あるものが好きだとしても毎日全く同じことを続けていてはそれを好きであり続けることはできない。愛せるものを手にしたと立ち止まってしまえば、やがてそれはなんともない日常へと変わる。なにかを好きであり続けるためには常に変化し、より多くを知る必要がある。すでに知っていることについてさらに知ろうとすることは難しい。前進するたびに大きな試練が待ち受けるであろう。しかし、その試練を乗り越えることで一層強固な愛が生まれる。好きとは決して心地よさに安住することではない。より強固な愛を手にしようと奮闘する戦いこそが「好き」なのである。



参考
(1)刷り込み(すりこみ)とは - コトバンク
(2)日本人はセロトニントランスポーターが少ないという話の出典 - 発声練習
(3)親が受けたストレスの影響が子供に遺伝するメカニズムが解明される - GIGAZINE
セロトニントランスポーター遺伝子とは。日本人に不安症や心配性が多いわけ。 | Exist
ザイオンス効果の用語説明|ferret
ミラーリングとは - コトバンク

The GOD AIM (ENG)


f:id:Skeyll:20190815214136p:plain

f:id:Skeyll:20190815214353j:plain



app info

The aim training app for mobile fps game.
Can customize a wepon recoil, a position and size of UI button ,camera sensi, and ON/OFF of shoothing sound and player model.
Have three tarining modes.
ReaderBoard(only Hard).
You can play The GOD AIM if your phone is off-line.
app file is about 20MB

exp game modes

youtu.be

Standard
・Target apper randomly
・At hit 6 targets, the amount of target increase
・point
hit
10+(2*combo count)

miss
minus 5
reset combo count

React
・Target apper randomly
・At hit 10 targets, the amount of target increase
・point
hit
10+(2*combo count)

miss
minus 5
reset combo count

can't hit and a target disapper
minus 5
reset combo count


Track
・Move on holizeon randomly
・At stopping ,the target speed get faster
・point
hit
10+(combo count)

miss
minus 5
reset combo count


Download

Android
play.google.com
iOS
plz wait for a little


Release note

ver 1.33
Change the timing sing in PlayGame
Fix LeaderBoard

ver 1.32
Delete the method to export a game record as a image
Stop getting permission about strage
Rewrite PraivacyPolicy to detail
Add the background image to display a game record for Dark Theme
Change the method of "Auto Shooting"
Change the way to instantiate target (only internal change)
(Maybe) Fix LeaderBoard

ver 1.31
Fix about target bug

ver 1.3 (thx suggestion!)
Change the single shoot system ( from tap to un-tap)
Add some cusutomize button for changing recoil and camera sensi
Display the parameter of recoil and camera sensi

ver 1.23
Change the shoot system for fixing the bug that can't perform at single shoot.

ver 1.22 
Fix the problem that user can't sing in GooglePlayService
Change the shooting order ( from "shooting sound, hit target, recoil" to "hit target , shooting sound , recoil)
Reduce ads


ver 1.21
Add PrivacyPolicy
Change the title image (hitting mark from "O" of GOD to "A" of AIM)

ver 1.2
Release

【Discord】プリンセスコネクトクランバトル凸管理BOT【プリコネ】

 Discordの凸管理BOT。現在できることは「予約」、「予約表示」、「予約一覧表示」、「予約削除」、「予約全削除」、「予約者に通知」。
スプレッドシートとの連携予定。使用言語はPython。必要な機能や疑問があればツイッターまで。

BOT運用には初期設定時にパソコンが必要(スマホだけでもがんばればできる)。運用だけならプログラミング関係の知識は不要。導入に必要な時間は30分〜1時間。
導入例、
f:id:Skeyll:20190826095721p:plain

BOTトークンの取得

Discord Developer Portal
 上記ページにアクセスし、NewApplycationより利用するアプリを作成。ここで設定したNAMEやアイコンは自分以外は見ることがないので適当でいい。
f:id:Skeyll:20190816152820p:plain

 左側のBot、AddBotから新しいBOTトークンを作成。ここで作成したBOTBOTを呼び出した際にチャット欄に表示される。
Bot作成後のページ下部にあるPamissionでBotに権限を渡すことができる。配布するBotでは権限の必要なことはしないのでチェックしなくてもいい。
f:id:Skeyll:20190816152847p:plain

 トークンのIDを使うのでコピーもしくはClick to Reveal TokenをクリックしてでてきたIDをコピーする。なお、このIDを公開するとBOTを乗っ取られるので知らない人には教えない方がいい。
f:id:Skeyll:20190818175231p:plain



BOT用のスクリプトをダウンロード

 ここのPrincessConnect以下のファイルを全てダウンロードする。Rawを右クリックして「名前を付けてリンク先を保存する。」で保存できる。そしてPrincessConnect.pyの上の方のTOKEN = ‘TOKENID’の部分を先ほどコピーしたIDに変更する。

f:id:Skeyll:20190818200729p:plain


BOTのコードを変更する

 入力時のキーワードや返信内容を変更する場合はコード上で””で囲っている部分を変更すると変わる。ただし「rsv」のように最初にくるキーワードが普段使うような単語だと普段のチャットで起動してしまうことがあるので日本語や名前等を使う場合は注意。
f:id:Skeyll:20190901084748p:plain


 もし大幅な変更を加える場合は更新方法が二つある。一つ目はメモ帳等でコードを変更してからherokuで起動してherokuのコンソール上でエラーを確認する方法。二つ目はPython環境をパソコン上に構築してコードが起動するか確認したあとにheroku上で確認する方法。プログラミングに興味がない場合は一つ目の方法がおすすめ。


 あとは公式サイトを見ればだいたいわかる(とくにAPIの部分)。


 DiscordBOTにはPython以外にもJavascriptC#などでライブラリ(Discord用の機能を簡単に導入できるもの)が用意されているので、得意な言語があるならそちらを使うといいかもしれない。


BOTを常駐させる

 Herokuというリモートサーバーを借りてリモートサーバー上でプログラムを起動して24時間運用する(2019年8月現在の利用料金は月1000時間無料。つまり、二つ以上利用しなければ常に無料)。導入方法は下記を参照。(※クレカを登録しなければ750時間まで無料なので20日強で限界が来る。仮に登録しても自動で課金されることはない)
Pythonで実用Discord Bot(discordpy解説) - Qiita
注意点
・procfileは名前をつけて保存する際に""で名前を囲う。
・procfileのDiscordbot.pyはスクリプトのpyファイルと同じ名前にする(上のものをそのまま利用する場合はPrincessConnect.pyで大文字小文字も合わせる。)
・普段プログラムを触らないなら2つ目の方法を利用する。(その際ファイルは直接Github上で追加する)
Githubはパブリックではなく、プライベートで作る。(IDを載せるため)


初期コマンド

 チャットを特定の単語から始めることでBOTが反応する。特定の単語が先頭なら数字が先でも他の単語が先でも可。
・rsv 1 - 5
 凸予約。数字の順番は自由。同じ番号は同一の投稿で予約できない。
 例 rsv 124、rsv421
・fin 1 - 5
 指定した予約リストから名前を消す。予約していないものが一つでもあれば削除はされるが通知がでない。
 例 fin 143
・rsv list 1 - 5
 指定したリストを表示。数字の順番は自由だが昇順で表示。
 例 rsv 15 list
・rsv!
 リスト5つ全て表示する。
・rsv END
 全てのリストからすべての名前を消す。
・ment 1-5
 特定のリストに含まれる人全員にmentionを送る。 例 ment 123
・cmd
 コマンドとその説明の一覧を表示。


参考
Rapptz/discord.py: An API wrapper for Discord written in Python.
https://github.com/Rapptz/discord.py
Welcome to discord.py — discord.py 1.2.3 documentation
https://discordpy.readthedocs.io/en/latest/index.html
Pythonで実用Discord Bot(discordpy解説) - Qiita
https://qiita.com/1ntegrale9/items/9d570ef8175cf178468f
Pythonのif文による条件分岐の書き方 | note.nkmk.me
https://note.nkmk.me/python-if-elif-else/
【VOICEROID解説】Python環境でDiscord Botを作る。 Part1 前準備編 discord.py rewrite 修正版 - Niconico Video
https://www.nicovideo.jp/watch/sm33794231
python - Pythonで二次元配列の中の各要素のn番目だけを取り出して、要素として並べたい - スタック・オーバーフロー
https://ja.stackoverflow.com/questions/47331/pythonで二次元配列の中の各要素のn番目だけを取り出して-要素として並べたい

プライバシーポリシー  ©Skeyll 2019- All Rights Reserved.