OmniAICreator/Qiita-1.07M huggingface dataset:
僕、最弱でした!? ツイートでバトルするWebサイトを作って無双しようとしたら逆にボコボコにされた件 フォロワーを増やそうとしてももう遅い



## 概要
自分のツイートを選んでユーザーとバトルするwebサイトを作成

https://twibat.tontonton.work/


## デモ
お試し動画。松本人志さんと対戦してみたらこのザマです
<iframe width="560" height="315" src="https://www.youtube.com/embed/P8wYR5Byieo" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>


## 技術
* サーバサイド
  * Rails

* フロントエンド
  * React

* アニメーション
  * CSS
  * react-transition-group

* API
  * 公式TwitterAPI

* ホスティング
  * Heroku

* ssl
  * cloud flare

## ルール
* 直近30件のツイートを使用できる(ランダム)
* フォロワー数でユーザーのHP、攻撃力が決まる
* リツイート、いいねの数で攻撃力が上がる
* リツイート数でクリティカル率が上がる
* いいね数で回復力が上がる

## やりたかったけどやれなかったこと
### アニメーション
もう少し攻撃アニメーションのバリエーションやクオリティを上げたかったけど時間~~技術とセンス~~がなかった。アニメって難しいんですね・・・



初めて**react-transition-group**を使ったけれど、チンプンカンプンでステータス変更のタイミングを掴むまでかなり時間を要した。

この記事を何回も読んでやっと実装できた感じ

https://qiita.com/koedamon/items/2665ea80f19589aa2f7d

### Twitterロゴ
バトル要素に**Twitterバード**:hatched_chick:を使いたかったけど、ロゴの規約に違反するため断念。色を変えたりアニメーション利用はできないみたい

https://about.twitter.com/en/who-we-are/brand-toolkit

### カルーセル
スマホ向けにツイートのリストをcssで**scroll-snap**にしている。本当はカルーセルライブラリの**react-slick**とか使っていい感じにしたかったけど、ツイート削除すると以下のエラーが出てうまくいかなかった

```js
removeChild' on 'Node': The node to be removed is not a child of this node.
```

あとスクロールの初期位置を**scrollLeft**で補正しようとしたけど全く動かない。怠惰スクロール状態:sleepy:。なぜだ

### コンポーネントがファット
バトル画面のコンポーネントが600行くらいある。ソースが読みづらいから問題解析に時間がかかる。
コンポーネントを分けた上で実装すべきだった。

アニメーションの指定も関数指定だったり即時関数だったりでなんかごちゃごちゃしている。
もう終わりだよこのプログラム:sob:

```javascript
weapon() {
  return (
    <CSSTransition
      // 攻撃完了後
      onEntered={() => {
        this.setState({
          canAttack: false
        });
        this.enemyTurn();
      }}
・・・
  )
}

enemy() {
  return (
    <CSSTransition
      onEntered={this.enemyAttack}
      onExited={this.setUserHp}
・・・
  )
}
```

## まとめ
ほぼネタアプリ。暇つぶしにどうぞ
ローカルネットワーク上のPCを遠隔でシャットダウンする方法

#1.シャットダウンされる側PCのレジストリを設定する

リモートでシャットダウンをする場合、事前にシャットダウンされる側PCのレジストリを以下のように変更しておかないと、コマンドを実行しても拒否されます。

PCのレジストリキー

```
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System
```

名前："LocalAccountTokenFilterPolicy"、DWORD値："1"　　　の値を追加する


#2.バッチファイルを作成する

仮にシャットダウンコマンドを実行するPCをPC00
シャットダウンされる側PCをPC02とします。

次のようにターゲットPCの<IPアドレスorPC名>に対して、net useコマンドで
ネットワーク接続を確認し、続けてシャットダウンコマンドでPCをシャットダウンします。


```dosbatch:PC00_network_shutdown.bat
@echo off
set TARGET=PC02
set USER=user01
set PASS=password

net use \\%TARGET% /user:%USER% %PASS%
net use \\%TARGET% /delete"
shutdown /m %TARGET% /s /f /c "PC00→PC02を遠隔SD" -t 0

exit 0
```
VirtualBox（仮想環境）のセットアップ手順

Hack The Boxを楽しむ場合は、自前のパソコンに仮想環境を用意した方が良いので、仮想環境である VirtualBox のセットアップ手順をご紹介します。

別記事で「VMware Workstationのセットアップ手順」もご紹介しています。VMware Workstationを利用したい方は、以下記事をご確認ください。
・VMware Workstationのセットアップ手順

https://qiita.com/WhizOwl/items/ce699f6f4366465dbe2e

また、Hack the boxでペネトレーションテストを学習するために必要な環境の話は、以下記事をご確認ください。

https://qiita.com/WhizOwl/items/a72e547ccb0d053abedd

# Oracle VirtualBox（仮想環境）のセットアップ
では、VirtualBoxをセットアップしていきましょう。

セットアップは非常に簡単です。自分のOS環境にあったインストールプログラム（パッケージ）をダウンロードして実行後、基本的には「Next」の連打でOKです。

まずは、以下URLへアクセスします。

- Oracle VirtualBoxのダウンロード

　[https://www.virtualbox.org/wiki/Downloads](https://www.virtualbox.org/wiki/Downloads)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112588/e08c02d6-c9ce-c9e0-d499-2344a5492807.png)


VirtualBox のダウンロードページ上段にある platform packages の中から、自分の環境にあったインストールプログラム（パッケージ）をクリックします。私のパソコンはWindows 10 なので、Windows hosts をクリックして、プログラムをダウンロードしました。

インストールプログラムがダウンロードできたら、クリックして実行します。
MacOSの方も、導入手順は基本的に同じなので、以下流れで雰囲気を感じ取ってインストールをお願いします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112588/51cdeb10-cd72-5b85-aa02-528fe1a40c20.png)
インストール画面（ウィザード）が表示されたら、Next をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112588/0372eb8e-a629-f641-d9ba-883bb970447a.png)
Custom Setup 画面が表示されます。特に変更はありませんので、このまま「Next」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112588/99e9ef1d-67d9-034a-626b-808cf8d491de.png)
スタートメニューやショートカットの作成などの確認画面が表示されますが、ここも特に変更は不要なのです。
このまま「Next」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112588/cff9bb38-c8b0-8cc0-3492-1cf98e36cde8.png)
インストールに伴い一時的にネットワークが切断されますよ、という警告画面が表示されます。
切断されるとまずいアプリケーションなどあれば、それらを終了しておきましょう。特に問題なければ、「Yes」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112588/b5a0a86b-2f24-b887-62ce-20a7314383df.png)
インストールの準備ができました。「Install」をクリックして、インストールを開始しましょう。
インストールの途中で、以下画面のようなデバイスソフトウェアのインストール可否が聞かれます。
仮想マシンでUSBを使えるようにするためのデバイスソフトウェア（USBコントローラ）なので、「インストール」をクリックしておきましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112588/016c27fd-15e6-8745-c135-02dc15ab04eb.png)

あとは待つだけ。１分程度でインストールが完了します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112588/a3863e36-227d-c57e-ca16-b15f56af4a90.png)
インストールが完了すると上記画面が表示されますので、「Finish」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112588/08d2d97f-3644-8382-1130-8cb965bd1896.png)
上記のような「Oracle VM VirtualBox マネージャ」の画面が表示されれば、Virtualboxのインストールは、無事完了です。
なんだか、かわいくないペンギンがでてきましたね（笑）
いや、よく見たら、かわいいです。

はい、では今日はここまで！お疲れ様でした。

次回は、仮想マシン（ゲストOS）のセットアップしていきたいと思います。
【JavaScript】Ajaxを使うための色んな方法まとめ【これから学ぶ人用】


**どんな記事か**
Ajaxを行うための関数やライブラリが沢山あり、
初心者がAjaxを学ぶ時に、どれを使って学べばいいのか迷うと思ったので、
各方法の特徴をまとめました。

※ 各参考記事のリンクは、筆者の独断と偏見で選んでいます。
しかも、筆者が記事に書いたことがある内容は、優先的に筆者の記事へのリンクを貼ってあります。
より色んな観点で知るために、ぜひご自身でもググって調べてみてください。

# Ajaxとは？
JavaScriptでHTTP通信を行うための方法です。
主に自社サービスのサーバーにアクセスしたり、WebAPIを利用したりして、
Webサーバーからデータを取得するために使われています。
詳しくは他の記事で学んでください。

# Ajaxを行うための方法

**1. ライブラリを使わない方法**

### XMLHttpRequest
参考記事：[XMLHttpRequestについて。 もっと言えば、setRequestHeader() について。](https://qiita.com/H40831/items/69f06dc98a6c446c817c)

JavaScriptでAjaxをできるようにしてくれた、最初の仕組み。
記事にも書いたとおり、これのおかげでAjaxができるわけなので、これを理解していたら強いです。
ですが、使い方が複雑で、わざわざ覚える必要がない事も多い印象です。

### fetch
参考記事：[JavaScriptのFetch API について](https://qiita.com/sotasato/items/31be24d6776f3232c0c0)

素のJavaScriptでAjaxするための関数。XMLHttpRequestより簡単に使えます。
Ajaxの基礎的な部分や、他のライブラリでも活かせるような一般的な使い方を習得できるのでオススメですが、
まともに使えるようになったタイミングが遅かったせいなのか、
下記のライブラリと比べると、あまり一般的に使われているイメージは無いです。

<br>
**2. ライブラリを使う方法**

### jQueryのajax
```html:CDN
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
```
参考記事：[Ajaxの説明とJQueryによる簡易実装](https://qiita.com/aikasu/items/c2964443550f75dd24f0)

jQueryのライブラリには、Ajaxを実行するためのメソッドが含まれています。
なので、jQueryを使っているサイトでAjaxするなら、この方法がメジャーだと思います。
特徴として、このメソッドには、HTTP通信が成功・失敗したときに処理を続けるための書き方が複数あります。
選んだ書き方によっては、他のAjaxの書き方とガラっと変わってくるので、
応用力を身に着けたいときは、どの書き方で練習するべきかを気にしたほうがいいかもしれません。


### axios
```html:CDN
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
```
参考記事：[【Ajax】axiosを使って簡単にHTTP通信](https://www.willstyle.co.jp/blog/2751/)

Vus.jsやReactなどのフレームワークでAjaxを使いたいときに
よく使われてるイメージがあるライブラリです。
fetchよりもうほんの少しだけ、シンプルに使える印象があります。


<br>
**注：**
自分はAjaxのプロでもなんでもないので、参考意見は大歓迎です。
ご意見ありましたらコメントにお願いしますm(_ _)m

# Ajaxの習得方法
これからAjaxを習得するご予定ですか？

いきなりガッツリ本格的なWebAPIを使って練習しようとすると、
認証などの複雑な処理を行う必要があり、
シンプルなAjaxの使い方を理解する妨げになるとおもうので、
~~まずは[JSON GENERATOR](https://www.json-generator.com/)を使ってシンプルなJSON形式のデータをURLで配信し、
そのデータをAjax取得して変数に代入するような練習をしてみると良いとおもいます。~~
上記の方法が使えないようになっているようですので、
かわりに[JSONPlaceholder](https://www.agent-grow.com/self20percent/2019/11/04/intro-jsonplaceholder/)を利用してください。

**やり方**
以下のうち好きなURLに、GET方式やPOST方式でアクセスしてみて、取得したJSONをオブジェクト型に変換して変数に代入します。
- https://jsonplaceholder.typicode.com/todos （TODOリスト風のデータ）
- https://jsonplaceholder.typicode.com/posts （掲示板の投稿風のデータ）
- https://jsonplaceholder.typicode.com/comments （コメント欄風のデータ）

うまくいかずに詰まる部分があったら、Ajaxの使い方をググって自己解決できるようになると、
一人前のAjax使いになれると思いますm(_ _)m

参考記事：[HTTPとPOSTとGET](https://qiita.com/Sekky0905/items/dff3d0da059d6f5bfabf)

**補足**
サーバーが特定のURLにアクセスされたときにどういうデータを返してくるかは
サーバーサイドのプログラミングで決めることなので、
フロントエンドからAjaxを利用する際には、正しいアクセス先に、APIの作成者が決めているルールに基づいた内容のリクエストを送信して、レスポンスをきちんと変数に格納して扱うことができればAjaxの使い方は理解したと言っていいでしょう。

APIによって、例えば「POST方式のリクエストボディに、どういうレスポンスがほしいかの情報を入力する」など、使い方がそれぞれ決まっています。
なので、APIを使うには、Ajaxの使い方に加えて、そのAPI自体の使い方も理解する必要があります。（そのAPIの公式サイトで解説されている事が多いと思います。）

ちなみに、Ajaxは非同期処理になりますので
非同期処理について知らない場合、かなり悩むことになると思います。
下の記事の前半部分を読んでおくと、解決力が上がると思います。
参考記事：[【JavaScript】非同期処理とasync/await ~難しいこと抜きで、まず使いはじめるための知識~ ( ´ε` )💻](https://qiita.com/H40831/items/9bdaf7b66d7b48d626fc)
画面遷移に関係する処理を一元的に管理する

#・画面遷移の処理を別のファイルで一元的に管理するとなにがいいのか？

・ViewControllerから画面遷移の処理を別のファイルに記述することで、ViewController内の記述量が減少し、可読性が上がる。




###・実装
では、実際にどのように用いるかを見ていく。基本的には1画面1Storyboardで構成する。

今回のサンプルでは、FirstViewController(初期画面かつ遷移元画面)からSecondViewController（遷移先画面）への画面遷移を行う。また、SeceneDelegateを使わないので削除する。代わりに、AppDelegate.swiftに以下のような記述を行う。

###・AppDelegate.swiftの設定
```swift:AppDelegate.swift
import UIKit
@main
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?
    
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        
        let window = UIWindow(frame: UIScreen.main.bounds)
        self.window = window
        Router.showRoot(window: window)
        return true
    }
}
```


###・UIStoryboardのExtensionファイルの作成

```swift:Storyboard+.swift
//Storyboard生成をUIStoryboardのExtensionファイルを作成することで一箇所にまとめる
import UIKit

extension UIStoryboard {
//isInitialViewControllerが設定されているStoryboardを読み込む
  static var firstViewController: FirstViewController {
    UIStoryboard.init(name: "First", bundle: nil).instantiateInitialViewController() as! FirstViewController
  }

  static var secondViewController: SecondViewController {
    UIStoryboard.init(name: "Second", bundle: nil).instantiateInitialViewController() as! SecondViewController
  }
}

```

###・SecondViewController(遷移先画面)
```swift:SecondViewController.swift
import UIKit

final class SecondViewController: UIViewController {

//StoryboardからViewControllerをインスタンス化
   static func makeFromStoryboard() -> SecondViewController {
        let vc = UIStoryboard.secondViewController
        return vc
    }
}

```

###・Router(画面遷移の処理をまとめたファイルを作成する)

```Swift:Router.swift
import UIKit

final class Router {
//初期画面の表示をするスタティックメソッド
    static func showRoot(window: UIWindow) {
        window.rootViewController = UIStoryboard.firstViewController
        window.makeKeyAndVisible()
    }

 //SecondViewControllerへ遷移するスタティックメソッド
    static func showSecond(from: UIViewController) {
        let vc = SecondViewController.makeFromStoryboard()
        show(from: from, to: vc)
    }
}

//前の画面がNavigationControllerを設置していたらpushで、そうでない場合はmodalで遷移
private extension Router {
    static func show(from: UIViewController, to: UIViewController, animated: Bool = true) {
        if let nav = from.navigationController {
            nav.pushViewController(to, animated: true)
        } else {
            from.present(to, animated: true, completion: nil)
        }
    }
}
```

###・FirstViewController(遷移元画面)
```swift:FirstViewController.swift
import UIKit

final class FirstViewController: UIViewController {

  //StoryboardからViewControllerをインスタンス化
  static func makeFromStoryboard() -> FirstViewController {
    let vc = UIStoryboard.firstViewController
    return vc
  }
    
  @IBOutlet private weak var nextButton: UIButton! {
    didSet {
      nextButton.addTarget(self, action: #selector(tapNextButton(_:)), for: .touchUpInside)
    }
  }

  @objc func tapNextButton(_ sender: UIResponder) {
//次の画面へ遷移
    Router.showSecond(from: self)
  }
}

```
【非エンジニアOK】Udemyでおすすめのビジネススキル動画まとめ

この記事では、ビジネススキルが学べるユーデミーのおすすめ動画を紹介します。

- **エクセル操作スキルを徹底強化したい**
- **マーケティングのデータ分析スキルを身につけたい**

こういったニーズを持つ方が想定対象層です。
なおデータ分析のトピックが多数出てきますが、エンジニアとしてデータ分析を行なった経験がなくても問題ありません。
<font color="Red">初心者OK</font>かつ<font color="Red">評価が高い</font>もののみを厳選しました。

## ユーデミーのおすすめビジネス講座

### エクセルで学ぶビジネス・シミュレーション講座 マスターコース
・[【 初心者から財務プロまで 】エクセルで学ぶビジネス・シミュレーション講座 マスターコース](https://click.linksynergy.com/deeplink?id=Qw*xM8wv/u4&mid=47984&murl=https%3A%2F%2Fwww.udemy.com%2Fcourse%2Fexcel-master%2F)

事業マネージングや経営企画を担当している人にオススメしたいのがこの講座です。
見やすく説得力のある収益計画作成がExcelで作成出来るようになります。
**将来的な収支計画**だけでなく、**過去の損益計算書の分析**などもエクセルを使用しながら学べ、財務への理解が深まります。

- 売上がもしXくらいのペースで発生していけば利益はY程度になる
- この経費をX削減すれば一気に損益分岐点を超えられる

といった**数字の議論が即座に出来るようになる**のがポイントです。

### 【数字を味方につける：初級編】ビジネスの現場で使えるデータ分析

・[【数字を味方につける：初級編】ビジネスの現場で使えるデータ分析](https://click.linksynergy.com/deeplink?id=Qw*xM8wv/u4&mid=47984&murl=https%3A%2F%2Fwww.udemy.com%2Fcourse%2Fdata_nyumon%2F)

こちらの講座もエクセルデータ分析ですが、実際にビジネスの現場で生じた事例を基にして講座が設計されているのがキモです。

ショッピングモールやレンタルショップといった実際の店舗の課題である、

- **利益率を向上させるにはどうすれば良いのか**
- **売上を上げるにはどうすれば良いのか**
- **どのような顧客にどんな訴求を行えば良いのか**

といった内容をエクセルで定量的に考える力が身につきます。
なお、受講にあたり統計学の知識は不要で、Excelで簡単な関数を操作した経験があればOKです。

### Pythonによるビジネスに役立つWebスクレイピング


・[Pythonによるビジネスに役立つWebスクレイピング](https://click.linksynergy.com/deeplink?id=Qw*xM8wv/u4&mid=47984&murl=https%3A%2F%2Fwww.udemy.com%2Fcourse%2Fpython-web-scraping-with-beautifulsoup-selenium-requests%2F)

こちらの講座は、非エンジニアやプログラミング初心者向けに**WEBスクレイピング**を解説する講座です。
スクレイピングとは、ウェブページからプログラムで情報を取得していくことですね。
これを習得することで、**自動で営業リストを作ったり**、**SNSマーケティングのデータ分析をしたり**出来るようになります。
Pythonプログラミングの基礎が習得出来るので、これをスタート地点にして本格的にプログラミングの世界に飛び込んでいくことも可能です。

### 【ビジネスデータ集計を極める】エクセル関数マスターコース

・[【ビジネスデータ集計を極める】エクセル関数マスターコース](https://click.linksynergy.com/deeplink?id=Qw*xM8wv/u4&mid=47984&murl=https%3A%2F%2Fwww.udemy.com%2Fcourse%2Fexcel_function%2F)

- 事務処理にかかる時間を簡略化して、他の作業に集中したい
- 仕事で生じる単純作業をラクに終わらせたい

「【ビジネスデータ集計を極める】エクセル関数マスターコース」は、こういったニーズを持つ方に最適なコースです。

Excelで何でも手作業でタラタラやっているとミスの確率も上がりますし、何となく「仕事ができなさそう」という印象を与えてしまいます。
この講座で紹介されているような基本的な関数を習得しておくのはマストと言えます。

【講座で出てくる関数例】
・SUM
・IF
・VLOOKUP
・COUNT
・AVERAGE
・MEDIAN
・EOMONTH
・DATEIF
・TEXT
・WORKDAY
・SUBSITUTE
・INDIRECT

### 【エクセル・会計知識不要！】いきなりビジネスシュミレーション！　

・[【エクセル・会計知識不要！】いきなりビジネスシュミレーション！会計／ファイナンスが本職の方は受講しないで下さい](https://click.linksynergy.com/deeplink?id=Qw*xM8wv/u4&mid=47984&murl=https%3A%2F%2Fwww.udemy.com%2Fcourse%2Fmasukawa_009%2F)

この講座はビジネスシミュレーション講座でありながら、事前に会計知識もエクセル知識も要求**しない**のがポイントです。
それでいて、新規事業を始める時に必要な、売上や経費のシミュレーションがパパっと習得できます。
自分で起業や事業マネージングをしない方でも、上司とのディスカッションに定量的な根拠を持って望むことが出来るようになります。


## Udemyで学べるビジネススキル・仕事術

現在、ユーデミーで学べるビジネススキルはデータ分析やエクセル処理関連のものが主流です。
今回紹介したコンテンツはプログラミングの経験がなくても問題なく理解できるものに限定していますが、専門的な技術スキルを高めたい方は下の記事で紹介しているユーデミー動画講座もおすすめです。

・[株式投資の勉強になるオススメ動画まとめ](https://in-base.com/investment-movies)
・[【プログラミング初心者】費用対効果が高いUdemyのおすすめ動画講座まとめ](https://qiita.com/ykimura517/items/65df87dd77823fb2904d)
・[【英語面接&TOEIC】英語をゼロから学べるオススメのUdemyコースまとめ](https://qiita.com/ykimura517/items/10dd63677b1889d9d0c0)
・[【厳選】AWSをゼロから学べる初心者向けのオススメUdemyコースまとめ](https://qiita.com/ykimura517/items/4ecf80c05074b533896c)
・[Python初心者必見にオススメのAI・機械学習のUdemy動画まとめ](https://qiita.com/ykimura517/items/1664fb0b66b488280800)
【保存版】C#がイチから学べるオススメの超初心者向けUdemyコースまとめ

この投稿では、初心者が効率よくC#を習得できるUdemyのおすすめコースを紹介します。

- **Unityのゲーム開発にC#を活用したい**
- **仕事で Windows 用デスクトップアプリを開発する**
- **スマホのアプリをC#で作りたい**

C#は様々用途に活用できます。
自分のやりたいことに合わせて最適なコースを選択してみてください。

## ユーデミーのおすすめC#コース

### 経験ゼロからC#プログラミングがある程度出来るようになる方法【Windows Forms編】

・[経験ゼロからC#プログラミングがある程度出来るようになる方法【Windows Forms編】](https://click.linksynergy.com/deeplink?id=Qw*xM8wv/u4&mid=47984&murl=https%3A%2F%2Fwww.udemy.com%2Fcourse%2Fwinforminit%2F)

この講座は、<font color="Red">これまでC#を一切触ったことがない人</font>が最初に取り組むのにオススメです。

C#に限らず、プログラミングでは初心者はコードを書き始めるまでの**環境構築**で手こずることが多いです。
この講座は経験ゼロでも対応できるように、その「コードを書き始める以前」の部分をしっかり解説してくれています。
「**Visual Studioってなんやねん**」状態からのスタートでもOKです。

実際にWindows向けのデスクトップアプリを作成しながら、C#の文法と基本操作を学ぶことが出来ます。



### C#初心者が最初に身に着けるべき30の文法

・[C#初心者が最初に身に着けるべき30の文法](https://click.linksynergy.com/deeplink?id=Qw*xM8wv/u4&mid=47984&murl=https%3A%2F%2Fwww.udemy.com%2Fcourse%2Fcskihonnoki%2F)

「C#初心者が最初に身に着けるべき30の文法」はその名の通り、初心者が<font color="Red">**絶対に身につける必要がある文法**</font>を解説しています。


具体的には、if文やfor文といったものですね。
これらを理解していなければ開発が不可能です。

また、意外とちゃんと分かっていない**クラスやインスタンス（とそれらの違い）**、**継承**、**インターフェース**や**dispose**など初心者が引っかかりやすいポイントをちゃんと理解するのに最適です。
ゴリゴリのC#エンジニアには不要ですが、仕事でたま〜にC#を使っているレベルのエンジニアであれば、受講することで知識が体系的に整理されるはずです。

### 初心者でも最速でシゴトに使えるC#

・[初心者でも最速でシゴトに使えるC#！『最速でプログラミングを覚えて、ビジネスに役立つ』未経験者向けコース](https://click.linksynergy.com/deeplink?id=Qw*xM8wv/u4&mid=47984&murl=https%3A%2F%2Fwww.udemy.com%2Fcourse%2Fquick-csharp%2F)

「初心者でも最速で仕事に使えるC#」は、その名の通り**初心者が業務レベルで通用するC#スキルを学ぶ**ための講座です。
Windows アプリを作りながらVisual Studioの扱い方やC#の文法を学習していくのは他の講座と同じです。
この講座のポイントは**デバッグに重点が置かれている**ことです。
デバッグ（と言うか例外処理）こそ学生のプログラミングと業務プログラミングの最大の違いです。

納品するプロダクトの場合は、事前にバグを取り除いておくのは当然のこと、予期しない入力に対してもソフトウェアが正常に動作することが重要だからです。
正直デバッグや例外処理はあまり面白いものではないので、商用書籍やプログラミング教室では軽視されがちです。
しかし、これをしっかりこなしてこそ一人前の職業エンジニアと呼べます。


## C#で出来ること

冒頭でも触れましたが、C#では実に様々なことができます。
**ゲーム開発**、**スマホアプリ開発**、**デスクトップアプリ開発**など多種多様です。
あと最近熱いのは**VR関係の開発**ですかね。

僕の身の回りの話だと、工場で使用するカメラの自動制御アプリを開発するためにC#が使われていました。

従来はC#といえば.NET Frameworkを使って Windows で開発する言語というイメージでしたが、最近ではMacでもLinuxでも開発を進めることが容易になっています。

## UdemyのC#コースのメリット

C#は書籍などでも学ぶことはもちろんできますが、個人的にはUdemyをはじめとした動画コースをおすすめしています。
というのも**コースのレビューなどを見て評判が良いものを厳選**することができまるからです。
そして基本的に評判が良い講師は**第一線で働いているプロ**です。
また初心者にとっては、動画で画面を見ながら手を動かしながら学習ができるので挫折しにくいという点がメリットです。
ただデメリットとしては、動画講座ゆえにコードのコピーができないことが挙げられます。
（これは書籍の学習でも同じですが……）


## 【関連】Udemyおすすめ講座まとめ記事

・[【プログラミング初心者】費用対効果が高いUdemyのおすすめ動画講座まとめ](https://qiita.com/ykimura517/items/65df87dd77823fb2904d)

・[【未経験OK】Unity入門にオススメの勉強用Udemy（ユーデミー）動画まとめ](https://qiita.com/ykimura517/items/e40a5139abb73df3c794)

・[【Udemyあり】株式投資の勉強になるオススメ動画](https://in-base.com/investment-movies)

・[【非エンジニアOK】Udemyでおすすめのビジネススキル動画まとめ](https://qiita.com/ykimura517/items/b0e6aeb5b5d42af5e0b8)

・[Python初心者必見にオススメのAI・機械学習のUdemy動画まとめ](https://qiita.com/ykimura517/items/1664fb0b66b488280800)
【未経験OK】Unity入門にオススメの勉強用Udemy（ユーデミー）動画まとめ

今回の記事では、**Unity初心者におすすめのUdemy動画**をまとめてみました。
対象レベルは基本的に「ほとんどUnityに触った経験が無い人」を想定しています。
C#等のプログラミング言語の経験はあってもなくてもOKです。


## UdemyのおすすめUnityコース

### Unity ゲーム開発：インディーゲームクリエイターが教える C#の基礎からゲームリリースまで
・[Unity ゲーム開発：インディーゲームクリエイターが教える C#の基礎からゲームリリースまで【スタジオしまづ】](https://click.linksynergy.com/deeplink?id=Qw*xM8wv/u4&mid=47984&murl=https%3A%2F%2Fwww.udemy.com%2Fcourse%2Fstudio_shimazu_nfrpg%2F)

まずはゲーム開発の全体像を把握したいUnity未経験者にオススメなのがこのコースです。
Unityのインストールから始まり、**最終的にオリジナルゲームを実際にリリースする**ところまでやります。
C#での実装が出てきますが、こちらもC#の書き方（文法）の解説から入ってくれるので初心者フレンドリーです。
累計受講生10000人近いインストラクターの人気講座です。

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

・[一週間で身につくC#言語](https://click.linksynergy.com/deeplink?id=Qw*xM8wv/u4&mid=47984&murl=https%3A%2F%2Fwww.udemy.com%2Fcourse%2Fc-nmavhi%2F)

Unityコースと言うよりC#コースですが、「一週間で身につくC#言語」もオススメです。
Unityでは、ゲームを作る上でC#によるプログラミングは必ずしも必須ではありません。
しかし、Unityエンジニアとしてプロを目指すなら「C#未経験です」では中々通らないのが実情です。
現時点でプログラミング自体に抵抗感があるなら、一度集中的にC#を学習するのが結果的には近道です。

数あるC#講座の中でも、

- 開発環境構築
- 文法からしっかり解説
- 練習問題で定着

という三要素を満たしていることから、この講座は特にオススメです。

### Unityゲーム開発入門：Unityインストラクターが教えるマリオ風2Dアクションゲームを作成する方法

・[Unityゲーム開発入門：Unityインストラクターが教えるマリオ風2Dアクションゲームを作成する方法](https://click.linksynergy.com/deeplink?id=Qw*xM8wv/u4&mid=47984&murl=https%3A%2F%2Fwww.udemy.com%2Fcourse%2Fstudio_shimazu_sideview_action%2F)

この講座も先程のものと同じく累計受講者約10000人の嶋津講師のコースです。
こちらも

- Unityのインストール
- ショートカットキー
- C#の基本

といったコンテンツが含まれています。

こちらはアニメーションの作り方や切り替え、プレファブ化やオブジェクトの生成・表示切り替えといった内容に主眼が置かれています。
特に、マリオメーカーのようなステージ開発の解説に丸々1セッションが割かれているので2Dゲームを作成したい人はこれを選択しておけばOKです。

### Unity3D入門の決定版！RPG開発の基本をUnityインストラクターと共に進めるハンズオンコース

・[Unity3D入門の決定版！RPG開発の基本をUnityインストラクターと共に進めるハンズオンコース【スタジオしまづ】](https://click.linksynergy.com/deeplink?id=Qw*xM8wv/u4&mid=47984&murl=https%3A%2F%2Fwww.udemy.com%2Fcourse%2Funity3d_action_rpg_studio_shimazu%2F)

こちらは3Dゲーム作成に特化したコースになっています。

- キャラクター操作
- 攻撃
- ダメージ発生
- 敵キャラクターのAI
- アニメーション実装

など、RPGを初めとした3Dゲームの基本実装を習得することが可能です。
こちらもUnityやC#の基礎からスタートするので、初心者OKです。


## Unityで作れるゲーム

ここまでで紹介した動画コースを受講することでUnityで2Dゲームでも3Dゲームでも作って動かすことができるはずです。

昨今は**マリオ**や**白猫プロジェクト**、**ドラゴンクエスト**などの有名タイトルもUnityで作成されています。
もちろん個人開発の場合はデザインなどの作業量の都合もあり、ここまで大規模な作品を作ることは難しいです。
が、とりあえずは簡単なゲームを作成してみましょう。
もし今後Unity開発チームに JOIN したいと考えているのであれば、アピールポイントになります。

なお、Udemyの初心者向けのコースでは開発用の環境構築から説明してくれているので、初めに必要なものは基本的にPCのみです。
windowsでもmacでもOKです。


## UnityをUdemyで学ぶメリット

Unityを学ぶ方法はUdemyだけでなく書籍をはじめとして色々ありますが、やはり動画講座で学ぶのはやりやすいです。

- **現役のプロ講師に教わることができる**
- **評判の良いコースを厳選することができる**
- **講師の画面を動画で見ながら手を動かせるので挫折しにくい**

こういったメリットがあります。
（ただし一方でC#などのコーディングが必要になる場面ではコピー＆ペーストが使えないというデメリットもあります）

## Udemyおすすめ講座の関連記事
・[【プログラミング初心者】費用対効果が高いUdemyのおすすめ動画講座まとめ](https://qiita.com/ykimura517/items/65df87dd77823fb2904d)

・[【保存版】C#がイチから学べるオススメの超初心者向けUdemyコースまとめ](https://qiita.com/ykimura517/items/d3ab3df811f3c2739dee)

・[【Udemyあり】株式投資の勉強になるオススメ動画](https://in-base.com/investment-movies)

・[【英語面接&TOEIC】英語をゼロから学べるオススメのUdemyコースまとめ](https://qiita.com/ykimura517/items/10dd63677b1889d9d0c0)
iOS14.6をXcodeでビルドしたい時にUnsupprted OS versionになってしまうのを回避するやり方

#事象
iOS14.6にアップデートしちゃったけど、Xcode上で「Unsupprted OS version」と表示されビルド出来ない。

![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90301/a9154dd6-69e0-e00c-62e8-742c40d6820f.png)

#対処策
Device Supportのフォルダの"14.5"を複製し、"14.6"にリネームする。
"14.5"が無い場合は、Xcode 12.5.1をダウンロードしてから抽出する。

#手順
1. /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/　配下で14.5を複製する
![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90301/20d3a2be-384c-0829-6b55-c853e9910031.png)
![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90301/e010eef1-eff0-fd72-bd99-8a557a0ae087.png)

2. Xcodeを再起動すると警告が消えている
![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90301/93084743-b816-edf2-0674-49005736987a.png)


#参考記事
https://stackoverflow.com/questions/67863355/xcode-12-4-unsupported-os-version-after-iphone-ios-update-14-6

#所感
毎回困るんだよな。、やり方が裏技っぽいのでもう少しわかりやすくしてくださいよ。。
uGUIを使わない円形ゲージの作り方

# 初めに
Unityで円形ゲージを作成する方法を調べると、uGUI ImageのImage Type をFilledにしてFill Method を Radial 360 へ設定し、Fill Amountの値を変更する方法が最も多く出てきます。
この方法だと簡単に円形ゲージを作成できますが、2Dであるオブジェクトに追従したい場合に少々めんどくさいです。SpriteRendererの画像を変化させることで円形ゲージを作成する方法を紹介します。

# 手順
ゲージに使う画像を用意します。今回はいらすとやから円形の画像を引っ張ってきました。
![pop_kinitsu_100.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211264/dfd88437-d942-662e-db6f-51377f1ff256.png)
用意した画像をSpriteとしてUnityでインポートして、追従したいオブジェクトの子にします。
![HPGuagePost - SampleScene - PC, Mac & Linux Standalone - Unity 2020.3.7f1 Personal _DX11_ 2021_07_01 11_19_03 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211264/50795df0-dd11-3f6a-a40f-294777b1d0cf.png)
以下のShaderGraphを作成します。
![HPGuagePost - SampleScene - PC, Mac & Linux Standalone - Unity 2020.3.7f1 Personal _DX11_ 2021_07_01 10_58_42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211264/f572ef13-16b2-08fd-55a0-3c5bae49bb3a.png)
PolarCoordinatesノードのG成分に0.5を足すことで、中心の角度によって0~1にグラデーションさせています。これにStepノードを使うことによってある角度以上の領域が切り取られるような形になります。Ratioプロパティの値を0~1の範囲で変化させることで切り取る領域を変化できるようにしました。
ShaderGraphからマテリアルを作成して、ゲージ用のオブジェクトにあてます。
![HPGuagePost - SampleScene - PC, Mac & Linux Standalone - Unity 2020.3.7f1 Personal _DX11_ 2021_07_01 11_34_37 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211264/2a6a64de-5446-6a9f-c048-4a34b188b787.png)
マテリアルのRatioの値を変化させると表示される領域が変化します。
![gif_animation_001.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211264/3dc31c0d-7fc9-d1b8-8bea-06ae839df8e2.gif)
# おわりに
2Dでゲージをオブジェクトに追従させたいときにはキャンバス上のImageを操作するよりも単純だと思います。
【Google Cloud Day'21】「100 億人のユーザー行動からインサイトを得るための大規模分析基盤 〜BigQuery を活用して〜」を視聴して

100 億人のユーザー行動からインサイトを得るための大規模分析基盤 〜BigQuery を活用して〜
https://cloudonair.withgoogle.com/events/google-cloud-day-digital-21/watch?talk=d1-da-05
"KARTE では、これまで累計約 100 億人のユーザー行動を解析してきました。本セッションでは、KARTE において行動データを分析しインサイトを得るプロダクトについてご紹介し、プロダクトを支える大規模分析基盤についてご説明します。この基盤は BigQuery が主軸になっており、Partitioning・キャッシング・Column の最適化など運用における具体的な工夫点について解説致します。
"

<table>
	<tr>
		<th>質問</th>
		<th>返答</th>
	</tr>
	<tr>
		<th>KARTEのpocky eventは今後、パーティショニングテーブルの列削除機能がGAされたら、シャーディングでなくパーティショニングテーブルにしていくのでしょうか。</th>
		<td>ご指摘の通りです。現在では移行が可能になったたため、より効率的なテーブル構成にするためにパーティショニングへの移行を進めております。</td>
	</tr>
	<tr>
		<th>TrackサーバやアナライズサーバがGCEで、AdminはGKEな使い分けの理由はどんなところでしょうか。</th>
		<td>過去の移行の経緯によります。初期ではEC2で構築されており、2017年頃に解析サーバーをまずGCEに移行した背景があります。その後、管理画面をGKEに2019年頃に移行したため、別々になっております。</td>
	</tr>
	<tr>
		<th></th>
		<td>去年のGCDでもご紹介しておりますので、よろしければご参考ください（ https://speakerdeck.com/tikson/plaids-journey-with-multi-cloud-10128526-d75f-41de-98ec-27025f8d35a9 ）</td>
	</tr>
</table>

<table>
	<tr>
		<th>切り口</th>
		<th>内容</th>
	</tr>
	<tr>
		<th>KARTEについて</th>
		<td>一人一人に合ったUXを提供する</td>
	</tr>
	<tr>
		<th>KARTEのアーキテクチャ</th>
		<td>多いときは1000台近くGKEがスケールする。KARTE Pockyイベントがデータ分析の中心で、データレイク。</td>
	</tr>
	<tr>
		<th>BQのポイント</th>
		<td></td>
	</tr>
	<tr>
		<th>①について</th>
		<td>用途に応じて使い分けたいという要望があった。</td>
	</tr>
	<tr>
		<th>①について</th>
		<td>KARTE Pockyイベントは変更が容易にできる必要があった。そのためShardingTableである必要があった。セッションサマリはパーティショニングで使いたかった。</td>
	</tr>
	<tr>
		<th>②について</th>
		<td>KARTE Pockyイベントにたいして、クエリキャッシュがきかず、表示に時間がかかった。中間テーブルを作ることでこれが解決した。MaterializedViewを使う手段もあったが、テーブルの最大作成数やクエリの制約があり、要求を満たせなかった。自由度が高く、高速な検索ができる一般的なテーブルを使った。中間テーブルを分けることで、データを最小限にした。</td>
	</tr>
	<tr>
		<th>③について</th>
		<td>データ構造により、スロットもたくさん消費している。分析時の問題が右の画像。そこで、カラムを切り出した。カラムの切り出しで分析の効率化を実施し、コストも少なくなった。</td>
	</tr>
	<tr>
		<th>MLPipleineについて</th>
		<td></td>
	</tr>
</table>
【Google Cloud Day'21】「ぐるなびデータ基盤アーキテクチャのご紹介と Google Cloud を選択した理由とは」を視聴して

ぐるなびデータ基盤アーキテクチャのご紹介と Google Cloud を選択した理由とは
https://cloudonair.withgoogle.com/events/google-cloud-day-digital-21/watch?talk=d1-da-04

"・ぐるなびのデータ基盤の変遷
・データ基盤のアーキテクチャ紹介
・分析環境アップデートの経緯
・Cloud Composer を選択した経緯
・今後の展望・Google Cloud に期待すること
"

<table>
	<tr>
		<th>質問</th>
		<th>返答</th>
	</tr>
	<tr>
		<th>ETL選定時の基準で、冪等生についての考慮はあったでしょうか？</th>
		<td>冪等性については選定基準には入っていませんでした。データ基盤構築時には必須だとは思いますが、ジョブレベルで組み込んでいくイメージなのでツール自体に必要な機能としては上がりませんでした。</td>
	</tr>
	<tr>
		<th>選定基準ではCI/CDという文字はなかったと思いますが、実質的にはCI/CDを利用したかったと考えてよかったでしょうか（あったらごめんなさい）</th>
		<td>コードベースで管理したかったので、まずはgit管理を目指しました。またgitのPipelineを使ってgitに反映するとCloudComposerに自動で反映するようにしています。</td>
	</tr>
	<tr>
		<th>選定基準、全てクリアできており何よりだったかと思いますが、この中で一番重視せねばと考えた基準はどちらでしょうか。また、その理由も聞きたいです。</th>
		<td>運用工数を重視しました。障害対応に大きく時間を割くことが多くなっていたので、こちらを下げることを重要視しました。</td>
	</tr>
</table>

<table>
	<tr>
		<th>切り口</th>
		<th>内容</th>
	</tr>
	<tr>
		<th>ぐるなび概要</th>
		<td></td>
	</tr>
	<tr>
		<th>データ基盤の歴史</th>
		<td></td>
	</tr>
	<tr>
		<th>BQ導入理由</th>
		<td>AWS側のよさもあるので、それを活かして運用したかった。</td>
	</tr>
	<tr>
		<th>BQ導入後の課題</th>
		<td></td>
	</tr>
	<tr>
		<th>アーキテクチャ</th>
		<td></td>
	</tr>
	<tr>
		<th>運用について</th>
		<td></td>
	</tr>
	<tr>
		<th>課題</th>
		<td></td>
	</tr>
	<tr>
		<th>CloudComposer選定理由</th>
		<td></td>
	</tr>
	<tr>
		<th></th>
		<td></td>
	</tr>
</table>
MontezumaRevengeを動かす。

# 初めに
`pip install gym`
だけではMontezumaRevengeは動かないので最低限動かして
サンプル行動を取るレベルを確認する。

# 作業内容
## 1 最低限必要なものをインストールする。

```shell:
pip install gym==0.18.3
atari-py==0.2.9
pip install gym[atari]
```

## 2 MontezumaRevengeのROMをインストールする。

https://github.com/openai/atari-py#roms の
http://www.atarimania.com/rom_collection_archive_atari_2600_roms.html
にアクセスして、Roms.rarをDLする。
Roms.rarを解凍する。
Roms.rarの中には

- HC ROMS.zip
- ROMS.zip

があるので、ROMS.zipを解凍する。

以下のコマンドでMontezumaRevengeなどのROMをインストールする。
`python -m atari_py.import_roms Roms/ROMS`

## 3 簡単なプログラムでMontezumaRevengeを動かす。
```python:check_obs.py

import gym

#環境の作成
env = gym.make('MontezumaRevengeNoFrameskip-v4') 

#環境のリセット
    env.reset()
    #ゲームオーバーになるまで実行する。
    while True:
        #ゲーム環境を表示する。
        env.render()
        #行動を選択する。
        action = env.action_space.sample()
        #現在の状況に対して行動を行って次の状態、報酬、ゲーム状態などを受け取る
        obs, reward, done, _ = env.step(action)
        #done=True　ゲームが終了になったら環境を終わらせる。
        if done:
            break

```
サンプル行動を行うゲームを出力した
![Montezuma.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397568/ec06cf7b-bf31-bc7e-7828-d6b7972a9df8.gif)


# おまけ
OpenAIGymのrender()をgifとして保存する方法

```python:
import imageio
import gym

env = gym.make('MontezumaRevengeNoFrameskip-v4') 

# 画像配列の準備
images = []

env.reset()
while True:
    #配列に現在の状態をrgbデータで保存する。
    images.append(env.render(mode='rgb_array')) # 画像の追加
    env.render()
    action = env.action_space.sample()
    obs, reward, done, _ = env.step(action)

    if done:
        break
#保存されたrgbデータを保存するメソッドを使って保存する。
imageio.mimsave('./Montezuma.gif', images, 'GIF', **{'duration': 1.0/30.0})
print('gif_animation_saved')

```

---
render()のGIFの保存の仕方について参考。
https://note.com/npaka/n/n22e2f37953bc
FirebaseのOAuth認証エラー auth/unauthorized-domain

## 問題の状況

ログインボタンをクリックしても、コンソールに下記のエラーメッセージが表示され、firebaseのauth認証が通らない。

```
{
"code": "auth/unauthorized-domain",
"message": "This domain (xxxxxxxxx.vercel.app) is not authorized to run this operation. Add it to the OAuth redirect domains list in the Firebase console -> Auth section -> Sign in method tab."
}
```

## 解決方法

Firebaseの承認済みドメインに、デプロイ先のドメイン`xxxxxxxx.vercel.app`を追加することで解決。

![x.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166484/2b2683ec-afa4-b22d-36d7-dbd63c5c1895.jpeg)
リモートリポジトリ新規作成時のThere isn't anything to compare.の解決方法 


# はじめに

リモートリポジトリを新規作成して、
ローカルでgitの初期化(git init)して
gitのリモートリポジトリとの紐付け(git remote add)して
コミット・プッシュして
さあプルリクエストするぞ! といった矢先にエラー発生(涙)

![there isn't compare.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1656973/c996d7df-5838-bfb3-7686-7ce819506796.png)

> **There isn't anything to compare.**
> Nothing to compare, branches are entirely different commit histories

`(訳)`
**比較するものが何も有りません**
比較するものが無いです、ブランチは完全に異なるコミット履歴です

# リモートリポジトリ新規作成時の状態2パターン

* リモートリポジトリが空でファイルが存在しない場合
 
* リモートリポジトリに既に自動生成したファイルが存在している場合

リモートリポジトリ新規作成時の状態によって
その後の操作手順が異なります。

#間違った操作手順(原因)

* リモートリポジトリに既に自動生成したファイルが存在している場合

既にリモートリポジトリに自動生成したファイルが存在しているのに
クローンせずにリモートアッドして無理やりプッシュしたから。

```
1. git init
2. git remote add 
3. git add
4. git commit
5. git push
```

.gitignoreファイル・READEMEファイルを自動生成しているときは
最初にローカルリポジトリにクローンする必要があります。

# 正しい操作手順

* リモートリポジトリに既に自動生成したファイルが存在している場合

リモートリポジトリをクローンしてからファイルを追加管理していく

```
1. git init
2. git clone
3. git add
4. git commit
5. git push
```

* リモートリポジトリが空でファイルが存在しない場合

リモートアッドでリモートリポジトリを紐付けしてファイル管理を始める。
[間違った操作手順(原因)](#間違った操作手順原因)と同様の手順で正常にできます。

# 解決方法
もしこのエラーが発生してしまったら...

* 新しくローカルにクローンしてからコミット・プッシュをやり直す

希望するディレクトリで

```
1. git init
2. git clone
3. git add
4. git commit
5. git push
```

の順に操作していく。

* ローカルの内容を強制的にリモートリポジトリに反映する

以下の手順で強制的にmainブランチをmasterブランチの内容と同一にして、
強制的にリモートリポジトリのmainブランチにプッシュすると解決します。

※リモートリポジトリのmainブランチの内容が消えてしまうので
　バックアップを取るようにしてください。

```
git checkout master
// 強制的にmainブランチをmasterブランチの内容と同一にする
git branch main master -f    
git checkout main
// 強制的にリモートリポジトリのmainブランチにプッシュする
git push origin main -f
```

# 参考

https://stackoverflow.com/questions/23344320/there-isnt-anything-to-compare-nothing-to-compare-branches-are-entirely-diffe
CentOS 7でGitLabサーバーを構築する手順（httpとhttpsに対応）

# 構築手順
### ステップ１：GitLabのインストール

```bash
# 必要なパッケージをインストールする
sudo yum install -y curl policycoreutils-python openssh-server
sudo systemctl enable sshd
sudo systemctl start sshd

# ファイヤーウォールにhttpとhttpsを許可する
sudo systemctl start firewalld.service
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo systemctl reload firewalld

# postfixをインストールする
sudo yum install postfix
sudo systemctl enable postfix
sudo systemctl start postfix

# GitLabをインストールする
curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ee/script.rpm.sh | sudo bash

# GitLabサーバーのドメインを指定する
sudo EXTERNAL_URL="http://www.yourgitlabdomain.com" yum install -y gitlab-ee
```
--------------------------------

### ステップ２：https対応
GitLabはLet's Encryptに対応しているので、Let's EncryptでSSL化します。

```bash
# コンフィグをエディタで開く
sudo vi /etc/gitlab/gitlab.rb
```

コンフィグ内の次の設定を変更する。

```rb
external_url 'https://www.yourgitlabdomain.com'

letsencrypt['enable'] = true 

letsencrypt['contact_emails'] = ['email.address@email.com']

nginx['redirect_http_to_https'] = true
```

```bash
# コンフィグをリロードする。
sudo gitlab-ctl reconfigure
```
テキスト検索 grepコマンド

##grep コマンド
```
grep [patter] [file|directory]
```
ファイル内の文書を検索し検索パターンにマッチした結果を返す。


###find / grep の違い。
検索を行う関数の違いを把握しておく。

```
find -name ファイル名を検索しパスを返す
find -type f ファイルを検索しパスを返す
find -type d ディレクトリを検索しパスを返す
```
findコマンドはファイル名などに対し検索を実行してパスを返す。
ファイルの内容は検索しない。

###オプション

grep コマンドはファイルを指定し、ファイルの内容を検索
返ってくる結果はオプションにより異なります。

-l ファイルパスを返す
-n 検索にヒットした行数とその行の内容を返す
-r 再起的にディレクトリ内のファイルを検索


findはファイルを結果として返す。
grepはファイルを指定してテキストを検索する。

この2つのコマンドを合わせて使用することで、findで検索した特定の拡張子のファイル群の中身をgrepで検索することができる。
HMSのネイティブ広告の種類を指定する方法

# HMSのネイティブ広告の種類
HMSのネイティブ広告に以下の種類があります。

- 1080 x 607 pxの静止画広告
- 225 x 150 pxの静止画広告
- 640 x 360 pxの動画広告

# 設定方法
二つの作業が必要です。

1. ソースコードで要求する広告種類を指定する
2. HUAWEI Ads Publisher Consoleで広告IDのMedia typeを指定する

### 1. ソースコード
ネイティブ広告を要求するときに、以下のパラメータを渡し、広告種類を指定します。

|広告種類|パラメータ|
|:---:|:---:|
|1080 x 607 pxの静止画広告|DetailedCreativeType.BIG_IMG|
|225 x 150 pxの静止画広告|DetailedCreativeType.SMALL_IMG|
|225 x 150 pxの静止画広告（三枚）|DetailedCreativeType.THREE_IMG|
|640 x 360 pxの動画広告|DetailedCreativeType.VIDEO|

```kotlin
val nativeAdLoader = builder.setNativeAdOptions(adConfiguration).build()
val detailedCreativeTypeList: List<Int> = listOf({指定する広告の種類。たとえば、DetailedCreativeType.BIG_IMG})
val adRequestBuilder = AdParam.Builder().setDetailedCreativeTypeList(detailedCreativeTypeList)
nativeAdLoader.loadAd(adRequestBuilder.build())
```

### 2. HUAWEI Ads Publisher Console
HUAWEI Ads Publisher Consoleで広告IDのMedia typeを次のように指定します。

|広告種類|Media type|
|:---:|:---:|
|1080 x 607 pxの静止画広告|Single image|
|225 x 150 pxの静止画広告|Single image|
|225 x 150 pxの静止画広告（三枚）|Three images|
|640 x 360 pxの動画広告|Video|

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704548/03d0e864-7073-2351-37ce-b73cb475880d.png)


# 参考
HMS Ads Kit : https://developer.huawei.com/consumer/en/doc/development/HMSCore-Guides/publisher-service-native-0000001050064968
HMS Ads Kit API : https://developer.huawei.com/consumer/en/doc/development/HMSCore-References-V5/detailedcreativetype-0000001124696411-V5
HUAWEI Ads Publisher Service : https://developer.huawei.com/consumer/en/doc/distribution/monetize/addunit-0000001051321846
LINEEYE社LANIO調査

### ２つのタイプ
https://www.lineeye.co.jp/html/product_LA-7P-P_summary.html ドライ接点入力
https://www.lineeye.co.jp/html/product_LA-7P-A_summary.html 絶縁入力

### LANIOを検索する方法
「LANIOset.exe」の検索操作を「WireShark」で確認
UDP/30718に連続して２つのパケットをブロードキャストする
パケットは以下の２つ、ネットワークバイトオーダー
0x00 0x00 0x00 0xf6
0x4c 0x4e
https://www.lineeye.co.jp/html/product_LA-7P-P_spec.html
※ホームページのスペックとして以下の記載あり、実動作はUDPだったが。
ポート番号※4	TCP, 10003※5, 30704, 30718※6

### コマンド発行応答
https://www.lineeye.co.jp/pdf/LANIO_J42.pdf
第 19 章　入出力制御コマンド（ここにパケット詳細を記載）
19-2.　デジタル入出力モデルの制御コマンド
19-2-1.　ID 情報と入力状態の確認コマンド

### API関数
https://www.lineeye.co.jp/pdf/LANIO_J42.pdf
第 20 章　入出力関数ライブラリ（ここにWindowsDLL関数を記載）
https://www.lineeye.co.jp/html/download_utility.html#LANIOLIB
lanio_lib127.zip - LIBRARY.TXT

### 工場出荷設定
22-2.　出荷時の設定の戻し方
https://www.lineeye.co.jp/pdf/LANIO_J42.pdf

### Visual Studio Community
ワークロード
C++によるデスクトップ開発
オプション
最新のv142ビルドツール用C++MFC(x86およびx64)
正規表現について

##はじめに
バリデーションをかける時、正規表現を使って、特定の文字が含まれているかを確認したりする時に、そもそも正規表現の理解が浅いなと思って、正規表現についてまとめてみました。

よろしくおねがいします。

##正規表現とは
正規表現は文字列のパターンを表現するために用いられる表現手法で、文字列の一部分を抽出・置換えたり、文字列が制約を満たしているかを調べることができます。

通常の文字列とメタ文字を組み合わせてパターンを作って、そのパターンの文字列を探し出すことができます。

↑の具体的な使われ方としては、「パスワードを6文字未満にする」や「メールアドレスに＠をつけてないと登録ができない」などの機能に活用できるのです。


正規表現は「一つあればなんでもできる」という意味で、アーミーナイフ（缶切りやドライバーなどが一つになっている多機能な折り畳みナイフ）として例えられることがあるそうです。
それくらい便利で柔軟性があるということが分かりますね。


##具体的な活用シーン

もっと具体的にどのような場面で使われるのか、例をあげます。

webページに電話番号を登録するフォームがあるとします。
そこで太郎と次郎がユーザー登録をして電話番号を登録します。
するとデータベースには↓のように保存されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1552346/51f6eb4b-dfe8-affd-618e-d1b93f8215a3.png)

太郎はハイフンありで登録して、次郎はハイフンなしで登録していますね。

これだと管理がものすごく面倒になります。
できれば同じフォーマットで管理したいものです。

こういう時に正規表現を使って、保存する前にハイフンを取り除く処理をしてやると、全てハイフンなしの電話番号をデータベースに保存することができます。

このように、正規表現を使えば文字列に特定の文字が含まれているかどうか、特定の文字を取り除くなどの操作をすることができるのです。

##最後に
今回は正規表現とは！？みたいなところを見てきました。
正規表現は様々な言語でも取り扱われるものですが、次回はRubyにおいての正規表現についてメソッドやプログラムに適応させる方法を紹介したいと思います。
ローカルサービスをインターネットに公開 ― chisel

環境
---
- Ubuntu 21.04 (Cloud Server/Local Client)
- chisel 1.7.7

環境の例:
```plantuml
@startuml
nwdiag {
  network cloud{
      Proxy;
      ChiselServer [address = "<tunnel>server:8080\n<service>server:8443"];
      User [description = "<&person*1.5> Operator"];
  }
  network LAN{
      Proxy  [address = "proxy.local-domain:8080"];
      ChiselClient;
      Target [address="target:80"];
  }
}
@enduml
```

設置
---
```:ChiselServer/ChiselClient
curl -k https://i.jpillora.com/chisel! | bash
```
<details><summary>SSL詐称Proxy環境の場合</summary>

```:一度ファイルに落として下記編集後bashで実行
-  INSECURE="false"
+  INSECURE="true"
```
</details>


実行
---
```:ChiselServer
chisel server --port <serverTunnelPort> --reverse

# Example:
TNLPORT=8080
chisel server --port $TNLPORT --reverse
```

```:ChiselClient
chisel client <serverHost>:<serverTunnelPort> R:<serverListeningPort>:<targetAddress>:<targetPort>

# Example1
TNL=chiselserver.com:8080
TG=target.host:port
SVCPORT=8443
chisel client $TNL R:$SVCPORT:$TG

# Example2 - Proxy環境/TLSチェックしない場合
PROXY=http://proxy.host:9080
chisel client --tls-skip-verify --proxy $PROXY $TNL R:$SVCPORT:$TG

```

```plantuml
@startuml
actor "Operator" as op
participant "ChiselServer\nIP:$SVRHOST" as svr
participant "ChiselClient" as cli
participant "Target\nTCP:$TG" as tg

op->svr: chisel server ~--port $TNLPORT ~--reverse
svr->svr: $TNLPORT待ち受け
op->cli: chisel client $TNL R:$SVCPORT:$TG
svr <-cli: トンネル作成($SVCPORT)
svr -> svr: $SVCPORT待ち受け
op->svr: TCP接続($SVRHOST:$SVCPORT)
svr->cli:
cli->tg:TCP接続($TG)
@enduml
```

# HTTPサーバなどで問題が起こるケース
```plantuml
@startuml
actor "Operator" as op
participant "ChiselServer\nIP:$SVRHOST" as svr
participant "ChiselClient" as cli
participant "Target\nTCP:$TG" as tg

==NGケース==
op -x svr: [SSL] SSL証明書チェック失敗 ※ホスト名不一致
op -x tg:[HTTP:リダイレクト(HTTP➔HTTPS,IdPへのナビ等)] HTTP(to:アクセス不可アドレス/ポート)
op -x tg:[HTTP:絶対URLへのリンク] HTTP(to:アクセス不可アドレス/ポート)
op -x tg:[HTTP:APIの呼び出し] HTTP(to:アクセス不可アドレス)
op -> tg:[折り返し通信] 折り返し通信要求(折り返しURL)
op x- tg:折り返し通信(to:折り返しURL) ※一般にFirewallで阻害される
@enduml
```

参考
---
https://github.com/jpillora/chisel
[python] pandasでリストを横結合

## やりたいこと

* 2つのリストをキーとなる項目で横結合する

## ライブラリ

`pandas`

## 試してみる

* 左外部結合
* 右外部結合
* 内部結合

`SQL`でいうところの
* `left outer join`
* `right outer join`
* `inner join`

### サンプルデータ

```python:sample
import pandas as pd

# 購入リスト
data1 = [
    ['100', '2', 'りんご'],
    ['200', '3', 'みかん'],
    ['300', '1', 'もも'],
    ['500', '2', 'メロン']
]

df1 = pd.DataFrame(data=data1, columns=['商品ID', '個数', '商品名'])

# 価格リスト
data2 = [
    ['100', '150'],
    ['200', '100'],
    ['300', '200'],
    ['400', '300'],
]

df2 = pd.DataFrame(data=data2, columns=['商品ID', '価格'])
```

```python:サンプルデータ
# df1
  商品ID 個数  商品名
0  100  2  りんご
1  200  3  みかん
2  300  1   もも
3  500  2  メロン

#df2
  商品ID   価格
0  100  150
1  200  100
2  300  200
3  400  300
```

### 左外部結合

* `df1`全てと結合キーが一致する`df2`を返す

```python:構文
pd.merge(df1, df2, how="left", on="結合キー")
```

```python:sample_left_join
r = pd.merge(df1, df2, how="left", on="商品ID")
print(r)
```

```python:結果
  商品ID 個数  商品名   価格
0  100  2  りんご  150
1  200  3  みかん  100
2  300  1   もも  200
3  500  2  メロン  NaN
```
* 購入リストと一致する価格リスト（商品ID=100, 200, 300）と、購入リストにしかない商品ID=500が返ってくる
* 価格リストには商品ID=500はないので価格は`NaN`が返ってくる
* 購入リストには商品ID=400はないので返ってこない

### 右外部結合

* `df2`全てと結合キーが一致する`dt1`を返す

```python:構文
pd.merge(dtf, df2, how="right", on="結合キー")
```

```python:sample_right_join
r = pd.merge(df1, df2, how="right", on="商品ID")
print(r)
```

```python:結果
  商品ID   個数  商品名   価格
0  100    2  りんご  150
1  200    3  みかん  100
2  300    1   もも  200
3  400  NaN  NaN  300
```
* 価格リストと一致する購入リスト（商品ID=100, 200, 300）と、価格リストにしかない商品ID=400が返ってくる
* 購入リストには商品ID=400はないので個数と商品名は`NaN`が返ってくる


### 内部結合

* `df1`と`df2`の結合キーが一致するレコードを返す

```python:構文
pd.merge(df1, df2, how="inner", on="結合キー")
```

```python:sample_right_join
r = pd.merge(df1, df2, how="right", on="商品ID")
print(r)
```

```python:結果
  商品ID 個数  商品名   価格
0  100  2  りんご  150
1  200  3  みかん  100
2  300  1   もも  200
```
* 商品IDが一致する購入リストと価格リスト（商品ID=100, 200, 300）が返ってくる
[Rust]自身のIPアドレスを取得

表題の通り。

Windowsとそれ以外で使用するクレートを変えます。windows版`pnet`の場合、特定のライブラリを入れたりアプリケーションのインストールを要求されたりと面倒だったため。

それぞれ`is_XXX`系のメソッドで取得する内容を変更できます。

> You must have WinPcap or npcap installed (tested with version WinPcap 4.1.3) (If using npcap, make sure to install with the "Install Npcap in WinPcap API-compatible Mode")
> https://github.com/libpnet/libpnet

## Cargo.toml

```toml
[target.'cfg(unix)'.dependencies]
pnet = "*"
[target.'cfg(windows)'.dependencies]
ipconfig = "*"
```

## main.rs

```rust
#[cfg(target_os = "windows")]
fn get_ip_list() -> Vec<String> {
    use ipconfig;
    let mut ips: Vec<String> = Vec::new();
    match ipconfig::get_adapters() {
        Ok(adapters) => {
            for adapter in adapters {
                if adapter.oper_status() == ipconfig::OperStatus::IfOperStatusUp {
                    for address in adapter.ip_addresses() {
                        if !address.is_loopback() && address.is_ipv4() {
                            ips.push(address.to_string());
                        }
                    }
                }
            }
        }
        _ => {}
    }
    ips
}

#[cfg(not(target_os = "windows"))]
fn get_ip_list() -> Vec<String> {
    use pnet::datalink;
    let mut ips: Vec<String> = Vec::new();
    for interface in datalink::interfaces() {
        // 空ではなく、動作中である。
        if !interface.ips.is_empty() && interface.is_up() {
            for ip_net in interface.ips {
                // ループバックでなく、ipv4である
                if ip_net.is_ipv4() && !ip_net.ip().is_loopback() {
                    ips.push(ip_net.ip().to_string());
                }
            }
        }
    };
    ips
}

fn main() {
    println!("{:?}", get_ip_list());
}
```

### 結果

使用可能なIPの一覧が配列で表示されます。

```bash
["192.168.11.XXX", "10.XX.XX.XX"]
```
Power Automate Dektop<PAD>でExcelピボットテーブルを更新する方法

非エンジニアにとって、Excelのピボットテーブルは神ツールといえるでしょう。
ただ、元データを更新するたびに、切り貼り・更新・体裁整え・関係者に通知etc...面倒くさいので、Power Automate Desktop<PAD>を使って自動で更新する方法を考えました。
※ピボットテーブルを知らないエンジニア様はググってください。

<h1>更新のフロー概要</h1>
今回は2020-10～2021-2までが入っているピボットテーブルに2020-10～2021-3のデータを貼り付けて更新したいと思います

・元データを特定のフォルダに保存
・保存したデータを読み取り
・レポート用のファイルを開く
・ピボットテーブル読み込み用のテーブルに元データを貼り付け⇒不要な行を削除
・ピボットテーブル更新

PAD上でのフローはこちら
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624137/67fa411a-2dec-1eeb-d426-a8324964463c.png)
<h1>解説</h1>
まずファイルの解説です。
”売上レポート”というファイルがピボットテーブル作成用のファイルです。
同じ階層にある”売上レポート元データ”というフォルダの中に”元データ”というファイルを格納しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624137/ab78cd24-d491-548f-168d-12fd35ed40c8.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624137/ab47b0a5-cd90-b91d-37f9-878d98348046.png)

今回のデータはネットから適当なものを引っ張ってきて少し加工したものです。
（空白行も参照しているのでピボットに空白がありますが、完成品には無くなります。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624137/c895415b-2891-02d3-b330-6fe9b36520af.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624137/ef3d3ff2-05b5-f776-2185-0c4056eb06ea.png)

元データはテーブル化しており、ピボットテーブルの参照元も”テーブル1”としています。（※テーブルが分からない人はググってください。）
<b>テーブルを作成する際に今回の例だと行を50000行にして明細を追加した際に絶対に上回らないような広さにしています。後ほど詳しく解説します。</b>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624137/42f805ad-87c8-7e84-08b2-7eeea5e6e400.png)

現在、2021-2までの売上が入っているので今回の更新で2021-3のデータを追加したいと思います。
<h1>ピボットテーブルの参照範囲をテーブルにする</h1>
ピボットテーブルには色々な参照方法があるのですが、エクセル初心者の方がよく行っているのは、Sheet1!$A$1:$C$200みたいなシート名とセル範囲で参照の仕方です。
最初にピボットテーブルを作るときにデータがあるセルを選んだ状態で行うのですが、その際にエクセルが自動でデータが入っているエリアを指定してくれます。
セル範囲をピボットテーブルの参照場所としている場合に、新しい行が追加された時に”データソースの変更”をしなくてはいけません。
一方、ピボットテーブルの参照場所をテーブルにしておけば、行がいくら増えたとしてもその都度テーブル自体が拡張されるので、ピボットテーブルの更新をするだけで数値が変わります。
<h1>なぜテーブル範囲を50000行までにしているのか？</h1>
結論から言うと、<b>PADでテーブルより広いデータを貼り付けるとテーブルが消滅してしまうためです。</b>
なので予め広めのテーブルを用意しておいて、新規データを貼り付けた後に不要行を削除します。
そのあとにピボットテーブルを更新すれば完成です。
<h1>更新手順まとめ</h1>
広いテーブルにデータを貼り付ける
↓
貼り付けるファイルの最初の空白行からテーブルの最終行までを削除
↓
ピボットテーブルを更新する


★11行の”キーの送信”で行の削除をしています。詳しくは別の記事で書いていますのでよろしければご覧ください。
★12-13行でピボットデーブルがあるセルをアクティブ化→14行でピボットデーブルを更新しています
★更新時に不要の行が削除されているのでピボットテーブルの空白もなくなります。
JSON linesをGoで処理する


個人的メモ。

AWs Kinesis Firehose や AWS Comprehend の出力するデータが、一行ごとに独立したJSONになっている。

ちなみにこういうフォーマット。

```
{"File": "reject_reason_new.csv", "KeyPhrases": [{"BeginOffset": 0, "EndOffset": 9, "Score": 0.9999968409885279, "Text": "\\n\u4e0a\u4e0b\u306e\u9ed2\u8272\u90e8\u5206"}, {"BeginOffset": 11, "EndOffset": 17, "Score": 1.0, "Text": "\u4ee5\u4e0b\u306e\u6642\u9593\u5e2f"}], "Line": 32}
{"File": "reject_reason_new.csv", "KeyPhrases": [], "Line": 33}
{"File": "reject_reason_new.csv", "KeyPhrases": [{"BeginOffset": 1, "EndOffset": 11, "Score": 0.9573030141390197, "Text": "n53\u79d2\u301c2\u520647\u79d2"}], "Line": 34}
```

これって JSON Stream っていっていいんだっけ?  日常的にはこういう読み出しやらないんだけど、たまーにやることがあるのでメモだけしておく。  
  


```json.NewDecoder ``` をつかう。
ローカルファイルやS3 Objectからメモリに優しく読み取ること。


```go 
func parseJsonStream(stream io.Reader) {

	dec := json.NewDecoder(stream)
	for {
		logDataOneLine := KeyPhraseOneLine{}
		if err := dec.Decode(&logDataOneLine); err == io.EOF {
			break
		} else if err != nil {
			log.Error(err)
			continue
		}
                // なんかする

	}

}

// 1行ごとのJSON構造体
type KeyPhraseOneLine struct {
	File       string      `json:"File"`
	KeyPhrases []KeyPhrase `json:"KeyPhrases"`
	Line       int
}

type KeyPhrase struct {
	Score float64 `json:"Score"`
	Text  string  `json:"Text"`
}


```
LaravelのCollectionが空かどうか判定するとき


地味なミスをしていたので備忘録。


## 失敗ケース

`isset($collection)`, `empty($collection)`
などでは判定ができません。

試しに 

```php
{{ var_dump($collection) }}
```
とするとわかりますが、

```php
object(Illuminate\Database\Eloquent\Collection)#1533 (1) { ["items":protected]=> array(0) { } }
```

これはただの配列ではなく、 **Collection**ですもんね。
当たり前のことを忘れていました。


## 調整

ちゃんと`isEmpty()`というCollectionのメソッドを使います。
https://laravel.com/docs/8.x/collections#method-isempty


```php
$collection->isEmpty()
```

余談
Collectionのメソッドとプロパティ多すぎるですぜ...!

![スクリーンショット 2021-07-01 10.24.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/441432/0f4d2a95-8f42-1f4d-f641-b908eabc586a.png)
unity5.2の作法 その16 チュートリアル

#概要

unity5.2の作法、調べてみた。
チュートリアルやってみた。

#参考にしたページ

https://nn-hokuson.hatenablog.com/entry/2016/07/04/213231

#makefile

- Unityのスタートアップ画面で、プロジェクト名を「SampleShooting」、ゲームタイプに「2D」を選択
- menu->file->new sceneする。
- menu->file->save sceneでmainとする。
- 「＋ボタン」をクリックしてTypeに「Aspect Ratio」、Width&Heightに「9:16」と入力
- ロケットのスプライト（rocket）をシーンビューにドラッグ＆ドロップ
- 「Transform」項目のPositionを「0,-4,0」に設定
- menu->assetes->creates->c# scriptでRocketController.csつくる。
- ダブルクリックして、コードを書く。
- ヒエラルキーのrocketに、コードを重ねる。
- 「bullet」を選択し、シーンビューにドラッグ＆ドロップ
- menu->assetes->creates->c# scriptでBulletController.csつくる。
- ダブルクリックして、コードを書く。
- ヒエラルキーのbulletに、コードを重ねる。
- ヒエラルキービューから「bullet」を選択し、プロジェクトビューにドラッグ＆ドロップ
- 作成したファイル名を「bulletPrefab」に変更
- ヒエラルキービューから「bulletPrefab」を選択し、右クリック→「Delete」を実行
- ヒエラルキービューからrocketを選択し、インスペクタから「RocketControllerスクリプト」の項目を探し、「bullet Prefab」の欄に、プロジェクトビューから「bulletPrefab」をドラッグ＆ドロップ
- プロジェクトビューで「Rock」を選択し、インスペクタの「Sprite Mode」を「Multiple」に設定し、「Sprite Editor 」ボタンを押す、「Slice」ボタンを押す
- スライスされた隕石から１つを選択してシーンビューに配置
- menu->assetes->creates->c# scriptでRockController.csつくる。
- ダブルクリックして、コードを書く。
- ヒエラルキーのrock_0に、コードを重ねる。
- ヒエラルキービューから「rock_0」を選択し、プロジェクトビューにドラッグ＆ドロップ
- 作成したPrefabの名前を「RockPrefab」に変更
- ヒエラルキービューの「RockPrefab」を右クリックし「Delete」を選択
- ヒエラルキービューの「Create」→「Create Empty」で空のオブジェクトを生成
- menu->assetes->creates->c# scriptでRockGenerator.csつくる。
- ダブルクリックして、コードを書く。
- ヒエラルキーのgameobjectに、コードを重ねる。
- プロジェクトビューから「RockPrefab」を選択し、インスペクタのAddComponentをクリック、メニューから「Pysics2D」→「Circle Collider2D」を選択
- プロジェクトビューから「BulletPrefab」を選択し、インスペクタのAddComponentから「Pysics2D」→「Rigidbody2D」を選択
- Collider 2Dコンポーネントの「Is Trigger」にチェックを入れます。
- プロジェクトビューから「bulletPrefab」を選択し、インスペクタから「Bullet Controller (Script)」の中にある「Explosion Prefab」
- 爆発エフェクトのPrefabをドラッグ＆ドロップ
- ヒエラルキービューから「Create」→「UI」→「Text」を選択
- Textの名前を「Score」に変更
Anchors	Position	Font Size	Color
右上	(-20, -30, 0)	18	白
- ヒエラルキービューから「Create」→「UI」→「Text」を選択して、作成したTextの名前を「GameOver」に変更
Position	Width/Height	Text	Font Size	Alignment	Color
(0, 0, 0)	(160, 50)	なし	32	中央	白
- menu->assetes->creates->c# scriptでUIController.csつくる。
- ダブルクリックして、コードを書く。
- プロジェクトビューの「UIController」をヒエラルキービューの「Canvas」にドラッグ＆ドロップ
- プロジェクトビューから「background」をシーンビューに配置して、インスペクタからPositionを(0, 4.8, 0) に設定
- 「Order in Layer」を「-1」に設定
- menu->assetes->creates->c# scriptでBackgroundController.csつくる。
- ダブルクリックして、コードを書く。
- プロジェクトビューの「BackgroundController」をヒエラルキービューの「background」にドラッグ＆ドロップ
- 三角で実行。


以上。