OmniAICreator/Qiita-1.07M huggingface dataset:
DXライブラリでゲーム開発するための、初めにやっておくべき初期設定10選

DXライブラリという、ゲームプログラミング向けライブラリで初めにやっておくべき初期設定を簡易的な説明を添えつつ列挙してみました。

とりあえずこれさえ設定しておけばあとはゲーム開発に専念できる！って感じです。参考までにどうぞ。

※**Windows版を基準としているので、Android版やiOS版では使えない関数があるかもしれません。**

※**.NET版を使用してるので、C++で使用する場合は``DX.``を削除してコピペしてください。**

# ChangeWindowMode

```cs
DX.ChangeWindowMode(DX.TRUE);
```
ウィンドウモードにするか、フルスクリーンモードにするかで変更できます。``DX.TRUE``でウィンドウモード、``DX.FALSE``でフルスクリーンモードです。

GPUの性能が飛躍的に向上した今日では、もはやフルスクリーンモードでゲームを起動する必要が無いですし、他のアプリと同時使用など考えるとデメリットの方が多いような気がします。**ウィンドウモードでも、プライマリモニターと同じ解像度のウィンドウを用意することで仮想フルスクリーンとしてふるまうこともできます**。

# SetGraphMode

```cs
DX.SetGraphMode(1280, 720, 32); // 内部解像度を1280x720px、32bitカラーにする
```

**内部**解像度を変更します。第1引数に横解像度、第2引数に縦解像度、第3引数に色深度を指定できます。フルスクリーンモードの場合モニターに表示される解像度もこの値になります。ウィンドウモードの場合後述の``SetWindowSizeExtendRate``も考慮されてクライアント領域がこの値のウィンドウが生成されます。

ちなみに第4引数があって、それを使用するとリフレッシュレートを変えることができます。が、そのリフレッシュレートに対応していないモニターの場合、~~ナナカクラッシュ！~~してしまうので非推奨です(自転車でふっとばされることはないのでそこはご安心を(？))。

# SetWindowSizeExtendRate

```cs
DX.SetWindowSizeExtendRate(1.5); // ウィンドウ拡大率を1.5倍にする
```

ウィンドウモードで、ウィンドウの拡大率を指定します。1が等倍で、``SetGraphMode``で指定された値と同じウィンドウが生成されます。たとえば、前節の``SetGraphMode``に1.5倍すると、1920x1080px相当のウィンドウが生成されます。

# SetWaitVSyncFlag

```cs
DX.SetWaitVSyncFlag(DX.TRUE); // 垂直同期する
```

描画内容を垂直同期信号に合わせて転送するか否かを設定できます。端的に説明すると、垂直同期をしないとチラついたり、映像がなみついたりすることがあります。もちろん垂直同期をしないことにもメリットがあるので、フレームレートが変動しても良いゲームロジックであれば、これはユーザーに選択させるのがベストでしょう(垂直同期をしないと、垂直同期信号を無視することになるので、フレームレートはリフレッシュレートを超えることになり、CPUとGPUが全力で仕事をします。僕とは大違いです。)。


# SetUseTransColor

```cs
DX.SetUseTransColor(DX.FALSE); // アルファチャンネルのない画像で透過しない
```

**DXライブラリでは、デフォルトの設定で画像の真っ黒(#000000)な部分を透過します**(アルファチャンネルがない場合)。アルファチャンネルのついていないpng画像を使用するときにたいへんお節介な機能なので(自分の意図してない表示になるかも)、**この記事ではこの機能を無効化することを強く推奨**します。


# SetUseDirect3DVersion

```cs
DX.SetUseDirect3DVersion(DX.DX_DIRECT3D_11_FEATURE_LEVEL_11_1); // Direct3D 11.1を使う
```

Direct3Dのバージョンを明示的に設定することができます、ふつうはDXライブラリが自動的に選択しますが、自分で選択したい場合はここで設定しましょう(どちらかというと、デバッグ時にDirect3D 9を指定して確認する、といった使い方をする方が多いような気がします)。


# SetAlwaysRunFlag

```cs
DX.SetAlwaysRunFlag(DX.TRUE); // ウィンドウが非アクティブになったときでもゲームループする
```

ウィンドウが非アクティブになったときでもゲームループを進めるか否か設定できます。これもGPUの性能が飛躍的に向上した今日では停止する意味は皆無と言って過言ではないでしょう。

# SetWindowText

```cs
DX.SetWindowText("なんかすごいゲーム"); // ウィンドウタイトルを「なんかすごいゲーム」にする
```
ウィンドウタイトルを設定できます。初期状態では「DxLib」なのでせっかくなので自慢のタイトルにしてしまいましょう。


# SetDoubleStartValidFlag

```cs
DX.SetDoubleStartValidFlag(DX.TRUE); // 多重起動を許可する
```

ソフトウェアの多重起動を許可するか否か設定できます。これはケースバイケースですが、とくにセーブデータを扱うゲームなどでは多重起動できないように禁止しておく方が良いかもしれません。

# SetMainWindowClassName

```cs
DX.SetMainWindowClassName("NankaSugoiGame");
```

ウィンドウクラス名を任意のものに設定します。実は、**デフォルトの状態ではDXライブラリを使ったソフトウェアを同時に起動することができません**。この問題を回避するにはこの関数を呼び出して任意の文字列に変更する必要があります。所謂名前空間的な。衝突を避けるためにできるだけ長い文字列の方が良いかもしれません。

# さいごに

ここで紹介した一部の関数は、リファレンスページにも載っていない非公開関数です。使い方はその関数名と引数に渡す変数名でなんとなくわかるとおもいます。

非公開関数はかなりの数があって、かなり便利な関数もあるのでここでとっておきのページを紹介します。

dxライブラリ隠し関数のページ - CCS Wiki https://densanken.com/wiki/index.php?dx%A5%E9%A5%A4%A5%D6%A5%E9%A5%EA%B1%A3%A4%B7%B4%D8%BF%F4%A4%CE%A5%DA%A1%BC%A5%B8

DXライブラリ制作者様も非公開な関数が多いことを認めてるらしく、リファレンスの作成が追いついていないようです……。非公開関数も併用してこそDXライブラリの真価を発揮するので、リファレンスページやこのWikiを活用しながら、ゲーム制作を進めると良いでしょう。
React イベント

イベントハンドラーがない場合


```
<button onClick={()=>{alert('hogehoe'}}

```



イベントハンドラーがある場合

```

state={
 name:'tetete'
}


switchNameHandler={()=>{
  this.setState={name:hogogogo}

}}


<button onClick={this.switchNameHandler}

```


イベントハンドラーに引数を渡す場合

```
state={
 name:'tetete'
}


switchNameHandler={(info)=>{
  this.setState={name:info}

}}


<button onClick={()=>{this.switchNameHandler("aaaa")}}
                    
                    or

<button onClick={this.switchNameHandler.bind(this,"hhhh")}

```
React if文構築の方法

即時関数を用いる場合

```
 { (()=>{
          if(this.state.persons[0].name !=="genki"){
            return <p>Wrong</p>;
          }else{
            return <p>none</p>
          }
        })()
      }

```


三項演算子を利用する方法

```

  　　　{ 
          this.state.showPersons === true ?
            <div>
              <Person
                name={this.state.persons[0].name}　
                age={this.state.persons[0].age}  />
              <Person
                name={this.state.persons[1].name}
                age={this.state.persons[1].age}
                click={this.switchNameHandler.bind(this, "Max!!")}
                changed={this.nameChangedHandler} >
                My Hobbies: Racing
              </Person>
              <Person
                name={this.state.persons[2].name}
                age={this.state.persons[2].age}/> 
             </div> :null
       }

```


引用: https://www.yoheim.net/blog.php?q=20180409
【Rails】bootstrapでページネーション機能を作成する

##gemのインストール

``kaminari``のgemをインストールします。

```ruby
gem 'kaminari'
gem 'kaminari-bootstrap', '~> 3.0.1' #bootstrap3用
```
```terminal
$ bundle install
```
インストール後、サーバーを再起動します。

##ymlファイルの作成

``config/locales``に``kaminari_ja.yml``を作成し、以下を記載します。


```kaminari_ja.yml
ja:
  views:
    pagination:
      first: "&laquo; 最初"
      last: "最後 &raquo;"
      previous: "&lsaquo; 前"
      next: "次 &rsaquo;"
      truncate: "..."
```

##コントローラーの変更
```ruby
class PostsController < ApplicationController
  def index
    @posts = Post.all
  end
```
以下のように変更します。

```ruby
PER = 5 　#区切りたいところを決める

class PostsController < ApplicationController
  def index
    @posts = Post.page(params[:page]).per(PER)
  end
```

##ビューの変更

挿入したい箇所に以下を記入します。

```erb:
    <div class="paginate text-center">
      <%= paginate @like_posts %>
    </div>
```

### 追記：中央寄せ
自動でpagenationクラスが作成されますので
以下の方法で、中央寄せ出来ます。

```css

.pagination {
  justify-content: center;
}
```
##完成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456505/778ae100-0fcd-c7aa-53dc-0276e5d3ed5f.png)



**以上で、ページネーション機能が作成出来ます！**
sudoが実行できない...

sudoコマンドを使おうと思ったら

```
sudo: /private/etc/sudoers.d is owned by uid 501, should be 0
```
えーーー、使えない----!!
いつ、何故、何で使えなくなったのか、全く心辺りがないっ！！涙
かなり格闘したが、調べながら何とか解決...
###まずは、スーパーユーザに切り替える

```bash:
$ su
#パスワードを求められるので入力
```
もしpasswordを入れてもsorryが返される場合は下記URL参照でルートユーザを有効にしてください。
参考: https://support.apple.com/ja-jp/HT204012
###visudoコマンド等でsudoersを見る

```bash:
# root and users in group wheel can run anything on any machine as any user
root            ALL = (ALL) ALL
%admin          ALL = (ALL) ALL
```
変更していなければ、sudoは「root」および「adminグループ」権限で実行するものだと書いてあります。
しかし、エラー文の通り、何故か権限を持っていないので、/private/etc/sudoers.dの権限を変更しましょう。
chownコマンドでファイルやディレクトリの所有者、所属グループを変更できます。

```bash
chown -R root:admin /private/etc/sudoers.d
#chown -R [ユーザ]:[グループ] [ファイルやディレクトリ]
```
参考: http://raining.bear-life.com/linux/chown%E3%81%A7%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%84%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E3%81%AE%E6%89%80%E6%9C%89%E8%80%85%E3%82%92%E5%A4%89%E6%9B%B4%E3%81%99%E3%82%8B

これで解決しました。
AWS EC2　LAMP環境構築


#作成環境
　-　AmazonLinux
　-　Apache
　-　MySQL
　-　PHP

#前提条件
 - AWSアカウントを持っている
 - EC2インスタンス起動済み
 - Macならターミナル　、WindowsならTeraTermからアクセスしている
 
　　※EC2インスタンスを立ち上げた時点でLinux環境は完了

#インストール
```
[ec2-user@ip-・・・・・・・・・・・~]$ sudo yum update -y
```
これから頻繁に使う「yum」コマンドのアップデート
 　　※「-y」のオプションは実行の確認全てに「YES」と答える設定
<br>


 
```
[ec2-user@ip-・・・・・・・・・・・~]$ sudo yum install -y httpd24 php70 mysql-server php70-mysqlnd php70-mbstring
```
**httpd24**：Apache本体
**php70**：PHP本体
**mysql-server**：MySQL（DB）本体
**php70-mysqlnd**：MySQLドライバ　phpMyAdminなどでMySQLに接続する為に必要

上記をインストール

#確認
インストールができているか確認
###Apache
```
[ec2-user@ip-・・・・・・・・・・・~]$ httpd -v
Server version: Apache/2.4.33 (Amazon)
Server built:   May 23 2018 19:02:39
```
###PHP
```
[ec2-user@ip-・・・・・・・・・・・~]$ php -v
PHP 7.0.30 (cli) (built: May 10 2018 17:39:13) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2017 Zend Technologies
```
###MySQL
```
[ec2-user@ip-・・・・・・・・・・・~]$ mysql --version
mysql  Ver 14.14 Distrib 5.5.60, for Linux (x86_64) using readline 5.1
```

#起動
###Apache
```
[ec2-user@ip-・・・・・・・・・・・~]$sudo service httpd start
                                              [  OK  ]
```
Webブラウザから**EC2のIPアドレス**にアクセスして、Apacheのテストページが表示されていればOK


###PHP
```
[ec2-user@ip-・・・・・・・・・・・~]$sudo vi /var/www/html/phpinfo.php
```
viコマンドでphpファイルを作成及び、編集

```
<?php
   echo phpinfo();
?>
```
phpinfo.phpに上記を記載
AWSコンソールでセキュリティグループの設定し

Webブラウザにて、**EC2のIPアドレス/phpinfo.php**にアクセス
phpinfoの表示を確認する

PHPの設定をしたい場合は[こちら]()

###MySQL
```
[ec2-user@ip-・・・・・・・・・・・~]$sudo service mysqld start
Starting mysqld:                                [  OK  ]

```
MySQLを起動

```
[ec2-user@ip-・・・・・・・・・・・~]$mysql -u root -p



　mysql　>
```

MySQLにログイン
左側が**mysql**になっていれば、ログイン状態

```
　mysql　>exit
Bye
```
MySQLよりログアウト
左側が**[ec2-user@ip-・・・・・・・・・・・~]**になっていればOK


<br>

以上でLAMP環境の構築は完了
ここにあるのは最低限の設定でのインストールと起動確認だけ
<br>
[SwiftUI]NavigationLinkのアクセサリを非表示にするには

SwiftUIでは、画面遷移の方法としてNavigationLinkと呼ばれる機能が存在します。
これは、遷移後のViewと表示するViewを指定することでpush遷移を提供するviewです。
NavigationLinkは以下のように、Listの中で使うこともできます。

```swift

struct ContentView: View {
    var body: some View {
        NavigationView {
            List {
                Text("cat")
                Text("dog")
                NavigationLink(destination: Text("detail")) {
                    Text("fox")
                }
            }
        }
    }
}
```

しかし、Listの中でNavigationLinkを利用すると自動的に矢印のアクセサリ（UIKitで言う`UITableViewCell.AccessoryType.detailDisclosureButton`）が表示されます。

<img width="584" alt="スクリーンショット 2019-10-12 22.29.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24979/ac922f04-2bb4-7e80-6c8a-da44b4aea30f.png">

これを非表示にするには、以下のようにStackの中でNavigationLinkと表示Viewを入れてNavigationLinkではEmptyViewを返すようにします。

```swift

struct ContentView: View {
    var body: some View {
        NavigationView {
            List {
                Text("cat")
                Text("dog")
                HStack {
                    Text("fox")
                    NavigationLink(destination: Text("detail")) {
                        EmptyView()
                    }
                }
            }
        }
    }
}
```

レイアウトによってはVStackとHStackを使い分ける必要があるかと思います。
AWS EC2作成からSSH接続

##前提条件
AWSアカウントを持っていて、AWSコンソールにアクセスできる

##EC2の作成
- AWSコンソールにアクセス
- サービスよりEC２へ
- インスタンスの作成
- ***Amazon Linux AMI 2018.03.0 (HVM), SSD Volume Type - ami-92df37ed***を選択して、インスタンスを作成

***※キーペアを作成した場合、保存場所を忘れないように！
　　接続するのに使います***

####作成後のダッシュボード画面
<img width="1427" alt="スクリーンショット 2018-06-24 9.33.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/256775/3f9a9694-dda2-9f5b-e947-d054118a172d.png">

- 作成したインスタンスを選択後、接続ボタンをクリック
- 接続方法が表示される

####一部抜粋
```
インスタンスにアクセスするには:
SSH クライアントを開きます。 (PuTTY を使用した接続の方法を確認)
プライベートキーファイル (＊＊＊.pem) を見つけます。ウィザードが、インスタンスを作成するために使用するキーを自動的に検出します。
SSH が機能するには、キーが公開されていないことが必要です。必要な場合は次のコマンドを使用します。
chmod 400 ＊＊＊.pem
インスタンスに接続するには、パブリック DNS を使用します。
EC2インスタンス名が表示されている
例:　
ssh -i "プライベートキー" ec2-user@"EC2のパブリックDNS名"
ほとんどの場合、上のユーザー名は正確ですが、AMI の使用方法を読んで AMI 所有者がデフォルト AMI ユーザー名を変更していないことを確認してください。
インスタンスへの接続に関してアシスタンスが必要な場合は、接続ドキュメントを参照してください。
```
##ターミナルでの接続
```
$ キーペアのあるディレクトリに移動

$ chmod 400 ＊＊＊.pem

$ ssh -i "＊＊＊.pem" ec2-user@"EC2のパブリックDNS名"

The authenticity of host 'ec2-＊-＊-＊-＊.ap-northeast-1.compute.amazonaws.com (＊.＊.＊.＊)' can't be established.
ECDSA key fingerprint is SHA256:aDABcIu4l1SfKoEZwPpyGPcrXvmh2kiaIvaGxpkOazY.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'ec2-＊-＊-＊-＊.ap-northeast-1.compute.amazonaws.com,＊.＊.＊.＊' (ECDSA) to the list of known hosts.

       __|  __|_  )
       _|  (     /   Amazon Linux AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-ami/2018.03-release-notes/
11 package(s) needed for security, out of 13 available
Run "sudo yum update" to apply all updates.
[ec2-user@ip＊＊＊＊ ~]$ 
```

＄マークの左側が**[ec2-user@ip＊＊＊＊ ~]**になっていれば、SSH接続が完了
Spotify APIでアーティストを指定して楽曲一覧をPythonで取得する

嵐さんがサブスクリプション解禁したため、Spotify APIを使って楽曲情報を取得しました。

こちらの記事を一部参考にしています。
[Spotify APIで楽曲情報やアーティスト情報を取得してみた](https://qiita.com/nochifuchi/items/29ac2664fc174a56c4b4#api%E3%82%AD%E3%83%BC%E3%81%AE%E5%8F%96%E5%BE%97)

##Spotify APIに登録
API利用のためにClient IDとSeclet Clientが必要なので取得する。

Spotifyのアカウントを取得していない場合は[サイト](https://www.spotify.com/jp/)から取得。
その後、[Spotify for developers](https://developer.spotify.com/)にてSpotifyアカウントでログイン。

Dashboardに移動し、「CREARE A CLIENT ID」より
・App or Hardware Name：アプリケーション名
・App or Hardware Description：説明文
・What are you building?：利用用途？
を入力すると、Client IDとSeclet Clientが取得できる。

##アーティストIDを取得する
今回は直接アーティストIDを指定する。

Spotifyよりアーティストを検索。
詳細からアーティストリンクをコピー。artistの後ろ22桁の英数字がID。

##楽曲情報を取得する
取得したClient ID、Seclet Client、アーティストIDを利用し、情報を取得する。

はじめにSpotify APIのライブラリspotipyをインストール。

```
pip install spotipy
```

一覧を取得します。
今回はタイトルと発売日と楽曲IDを取得する。

```artist_songs.py
import spotipy
from spotipy.oauth2 import SpotifyClientCredentials
import sys
import pprint

client_id = '取得したClient ID'
client_secret = '取得したClient Secret'
artist_id = '取得したいアーティストID'

# 認証を行う
client_credentials_manager = spotipy.oauth2.SpotifyClientCredentials(client_id, client_secret)
spotify = spotipy.Spotify(client_credentials_manager=client_credentials_manager)

# アーティストに紐づく楽曲一覧を取得する
# album_type：‘album’, ‘single’, ‘appears_on’, ‘compilation’から選択可能
# country：発売国
# limit：取得する楽曲数
results = spotify.artist_albums(artist_id, album_type='single', country='JP', limit=20)

# ほしい情報を配列で取得する
artist_songs = []
for song in results['items'][:len(results)]:
    data = [
        '曲名：'+ song['name'], 
        '発売日：'+ song['release_date'], 
        'id：'+ song['id']]
    artist_songs.append(data)
pprint.pprint(artist_songs)
```

実行すると下記の通り。

```実行結果
[['曲名：Monster', '発売日：2010-05-19', 'id：0rDRRzBNKrzfgBa64kg0iF'],
 ['曲名：truth', '発売日：2008-08-20', 'id：3uVtXUio0J76jVElcXYHbP'],
 ['曲名：Happiness', '発売日：2007-09-05', 'id：5ydLlz0lePqmscLjd0Kw9I'],
 ['曲名：Love so sweet', '発売日：2007-02-21', 'id：5Vc35N1lqdE7xzwpEtwrBz'],
 ['曲名：A・RA・SHI', '発売日：1999-11-03', 'id：39X0fGQUhTkwg43DcSzZs7']]
```

今回の例は現在5曲のみ解禁されている嵐さんなので、limitの設定しなくてもいいかもしれません。
楽曲ごとのIDを取得できたので次は楽曲情報を取得していろいろ遊ぼうと思います。
DjangoでHello world (初学者がどこまで理解できるか(1))

#Djangoで"Hello world"までやってみよう

Djangoのインストールは実施済として記載していきます。
HTML, CSS, Javascriptとの連携までやっていきます。その第１回目。
参考：https://docs.djangoproject.com/ja/2.2/intro/tutorial01/
##Djangoが使用できる環境を用意
```py
$ django-admin startproject practice
$ cd practice ; tree ./
.
├── manage.py
└── practice
    ├── __init__.py
    ├── settings.py
    ├── urls.py
$ mv practice/ config/
```
・`practice`という、Djangoが使用できる環境(フォルダ)を作りました。
  その配下には、`manage.py`ファイルと、`practice`フォルダがあります。
  practiceフォルダが2つあるとややこしいので、配下のフォルダを変更します。
  (`practice`フォルダを`config`に)

・`manage.py`：Djangoで実行する際に使用するコマンド(スクリプト)です。

configフォルダ配下には、以下4つのファイルが自動で作成されます。
・`__init__.py`：pythonのパッケージだよと、教える空っぽのファイル。
・`settings.py`：設定を管理するファイル。
・`urls.py`：作ったアプリケーションの、URLへのパスを管理するファイル。
・`wsgi.py`：webサーバーとの接続口
　＊WSGI = Web Server Gateway Interfaceの略

```py
#### practice/manage.py
****
def main():
#第二引数を'config.settings'に変更
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings')
****
```

```py
#### practice/config/wsgi.py
****
def main():
#第二引数を'config.settings'に変更
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings')
****
```

```py
#### practice/config/settings.py
****
def main():
#'config.urls'に変更
    ROOT_URLCONF = 'config.urls'
****
#'config.wsgi.application'に変更
    WSGI_APPLICATION = 'config.wsgi.application'
****
```

##アプリケーションを作る
```py
$ python manage.py startapp myapplication
$ tree ./myapplication/
myapplication/
├── __init__.py
├── admin.py
├── apps.py
├── migrations
│   └── __init__.py
├── models.py
├── tests.py
└── views.py
```
・`admin.py`：「ブラウザで編集できる管理ページ」、に関するファイル。
・`apps.py`：アプリケーションとDjango環境の接続口。
・`models.py`：アプリケーションとデータベースの接続口。
・`tests.py`：テストを書く場所。
・`views.py`：ビュー(画面への出力)への挙動。

##アプリケーションのビューを設定
```py
#### practice/myapplication/views.py
from django.http import HttpResponse

#index関数にHTTPリクエストがあったら、"Hello, world."のHTTPレスポンスを返す
def index(request):
    return HttpResponse("Hello, world.")
```

##アプリケーションのURLをDjango環境に設定
```py
#アプリケーションのフォルダに、"urls.py"を作成
$ touch ./myapplication/urls.py ; cd ./myapplication ; tree
.
├── __init__.py
├── admin.py
├── apps.py
├── migrations
│   └── __init__.py
├── models.py
├── tests.py
├── urls.py
└── views.py
```

```py
#### practice/myapplication/urls.py

#path関数を呼び出し
from django.urls import path
from . import views

#URLに、「myapplication/」の後に何も指定しなければ、views.pyに記載の、index関数が呼び出される
#このURLパターンには、indexという名前をつける
urlpatterns = [
    path('', views.index, name='index'),
]
```


```py
#### practice/config/urls.py

from django.contrib import admin
from django.urls import include, path

urlpatterns = [
#URLで、myapplication/へのアクセス依頼があれば、myapplication/のurls.pyを呼び出す
    path('myapplication/', include('myapplication.urls')),
    path('admin/', admin.site.urls),
]
```
これにより、URLで「http://****/apps/」アクセスがあれば、
`practice/config/urls.py` -> `practice/myapplication/urls.py` -> 
`practice/myapplication/views.py`の順で、HTTPリクエストが届く仕組みができた。

##さいごに
```py
#### practice/
$ python manage.py runserver

*****
*****
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
```
開発環境用サーバーを起動させ、ブラウザで`http://127.0.0.1:8000/myapplication`を検索。
"Hello, world."と表記があればOKです。
axios

```html:axios
<html>
<head>
  <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
</head>
<script>
const request = axios.create({
/**
無料のAPIサービスにデータ登録し発行されたエンドポイント
データが消えている場合は
https://jsonstorage.netで以下のデータを登録しエンドポイントを再取得する。
 [
  { "name": "山田", "age": 20, "genderId": 0, "skillIds": [0, 1, 2] }, 
  { "name": "吉田", "age": 30, "genderId": 1, "skillIds": [0, 1, 2, 3] },
  { "name": "佐藤", "age": 40, "genderId": 0, "skillIds": [0] }
 ]
*/
  baseURL: 'https://jsonstorage.net/api/items/a8e80302-1cfd-49be-aca6-095e68da8a2f'
});

request.get().then(res => {
  const gender = {0: '男', 1: '女'};
  for (const user of res.data) {
   console.log(user.name);
   console.log(gender[user.genderId]);
  }
});
</script>
</body>
</html>
```
JavaScriptのボタンをクリックした際のイベント処理

| 目次|
|:-:|
|   記述の仕方(例)|
|   inputについて|
|   thisを関数の引数にすると面白いことができそう|
| inputを使わず、buttonを使う場合  |

## 記述の仕方(例)
- HTML内で完結させる場合

```html:html
<input type="button" value="ボタン" onclick="console.log(`Hello`)">
```
`実行結果:Hello`

- 外部ファイルに関数を用意する場合

```html:html
<input type="button" value="ボタン" onclick="func()">
```

```javascript:js
const func = () => {
    console.log("Hello");
}
```
`実行結果:Hello`

- 関数を複数実行もできる

```html:html
<input type="button" value="ボタン" onclick="func();func2">
```

```javascript:js
const func = () => {
    console.log("Hello");
}
const func2 = () => {
    console.log("World");
}
```
`実行結果:Hello World`

## inputについて
`<FORM></FORM>`を構成する部品タグ。
`type`でボタンやチェックボックス等の形を指定する。
`value`でボタン上に表示するテキストを指定。
`onclick`ではクリックされた際のイベント処理について記述する。

## thisを関数の引数に指定すると面白いことができそう

```html:html
<input type="button" value="ボタン" onclick="func(this)">
```

```javascript:js
let func = (button) => {
    console.log(button.value);
}
```
`実行結果:ボタン`
`this`は状況によってその中身が変化する変数。
宣言する必要はなく単体で利用できる。
今回は`button`の属性`value`を指定しました。

- これによりボタンの上に表示されている文字をクリック後に変更することができる

```html:html
<input type="button" value="ボタン" onclick="func(this)">
```

```javascript:js
let func = (button) => {
    console.log(button.value = "OK!");
}
```
`実行結果:OK!`

## inputを使わず、buttonを使う場合

```html:html
<button id="btn">ボタン</button>
```

```javascript:js
const x = document.getElementById(`btn`);

x.addEventListener(`click`, func = () => {
    console.log("OK!");
});
```
`実行結果:OK!`
Android Studio エディタの文字フォントと色を変更する方法

デフォルトのフォントやカラー・スキームではなく、
自分好みの使い慣れた見た目に変更したい場合。

## フォントを変更する

Android Studioメニューバーより

```
ファイル＞設定＞エディター＞フォント
```

## 色を変更する

Android Studioメニューバーより

```
ファイル＞設定＞エディター＞カラー・スキームの切り替え
```

なお、好みのスキームがデフォルトで入っていない場合は
http://color-themes.com/?view=index
のようなサイトからダウンロードして、
歯車アイコンから「インポート」すればよい。

私の場合はMonokaiが好きなのでダウンロードして使っている。
http://color-themes.com/?view=theme&id=563a1a7680b4acf11273ae94
ちなみに、ダウンロード時にブラウザのウイルスチェックで警告が出るが、私は問題なくインストールして使えている。

カラー・スキーム適用後、細かくカスタマイズしたい場合は、
デフォルトのカラー・スキームをコピーして別名で作成し、自分用に変更すればよい。
たとえばフォントを変更するなら

```
ファイル＞設定＞エディター＞カラー・スキームの切り替え＞コンソール・フォント
```

で、複製したスキームを選べば、詳細を変更できる。
GitHubでUnityのプロジェクトを管理したいときの.gitignoreの設定


リポジトリを新しく作る時の設定で
![github.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368850/41d54342-c6ab-8d33-4e10-e6a8c67d9036.png)
.gitignoreの設定でUnityを選ぶと
![gitignore.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368850/32f67a56-a41e-76f3-20e2-724ed0f0140c.png)
このようにUnityのプロジェクトにあわせた.gitignoreを自動で追加してくれます。
Nuxt.js+VuetifyでSASS変数の上書きが反映されない場合の確認事項

タイトル通りですが、対象読者はNuxt.jsにVuetify（@nuxtjs/vuetify）をインストール後、VuetifyのSASS変数を変更するためにvariables.scssを作成したけど反映されずに困ってる方です。

結果的には[@nuxtjs/vuetify](https://www.npmjs.com/package/@nuxtjs/vuetify) のページをじっくり読めば問題なかったのですが、要点だけ書いておきます。

# 1. customVariablesの設定
[nuxtjs/vuetifyのcustomVariables](https://www.npmjs.com/package/@nuxtjs/vuetify#customvariables)部分を読むと、customVariablesオプションについて以下のように書かれてます。

>Provide a way to customize Vuetify SASS variables.

一例として以下のようにサンプルが載ってます。

```nuxt.config.js
  vuetify: {
    customVariables: ['~/assets/variables.scss']
  }
```
※　customVariablesはNuxt.jsをインストールする際、テンプレートにVuetifyを選択すると最初から記述されてます。


# 2. treeShake: trueの設定
Nuxt.jsを開発モードで起動した場合、以下の内容通りcustomVariablesを設定するだけではvariables.scssの内容は反映されません。

>Provide a way to customize Vuetify SASS variables.
>Only works with tree-shaking.

実はこの[tree-shaking](https://www.npmjs.com/package/@nuxtjs/vuetify#treeshake) はリンク先の記載通りデフォルトではproductionモードでしか機能しないため、yarn run devのように開発モードで実行すると機能しません。そのため上記で設定したvariables.scssが反映されずになんで？？？？となったのがこの記事投稿のきっかけでした。

最終的にはnuxt.config.jsにtreeShake: trueの一文を加えるだけでOKでした。

```nuxt.config.js
  vuetify: {
    customVariables: ['~/assets/variables.scss'],
    treeShake: true,
  }
```

```variables.scss
// Ref: https://github.com/nuxt-community/vuetify-module#customvariables
//
// The variables you want to modify
$font-size-root: 20px;

```
※　[Vuetifyに設定されてるSASS変数一覧はこちら](https://github.com/vuetifyjs/vuetify/tree/master/packages/vuetify/src/styles/settings)

これでassets/variables.scssを変更して保存すれば自動的にコンパイルされて変更内容が画面に反映されるようになりました。ただしコンパイル時間は若干かかります。

# 最後に
恐らくこの問題はNuxt.jsのインストール時のテンプレートにVuetifyを選択した人が一番ハマりやすいと思います。理由はnuxt.config.jsにcustomVariablesのオプションは最初から記載してあり、ご丁寧にassets/variables.scssも用意してるのにtreeShakeについては全く記述がないからです。



# 参考
- https://www.npmjs.com/package/@nuxtjs/vuetify
- https://stackoverflow.com/questions/57517212/nuxt-vuetify-variables-scss-not-being-compiled
【SFDX】VSCodeでSFDXコマンドの不便さを解消する

# TL;DR
SF開発でVSCode使ってるけど、本番環境へのデプロイとかが簡単に出来ない
独自のコマンドを作ることで、主に本番環境への操作を楽にしたい

# 背景
VSCodeでSalesforceCLIコマンドを使ってSF開発をしていると、以下の問題に直面します。
**本番環境へのデプロイが、右クリックから出来ない！！！**

Spring'19から、本番環境へのデプロイにはテスト実行が必須(NoTestRun指定不可)となりました。
これにより、右クリック > "SFDX:Deploy source to Org"が使えなくなりました。（Sandboxには可能）

つまり、

```bash
sfdx force:source:deploy -p force-app -l NoTestRun
```

は、本番環境ではエラーとなり、

```bash
sfdx force:source:deploy -p force-app -l RunSpecifiedTests -r "TESTCLASSNAME"
```

と、Apexクラスに対するテストクラスを指定する必要があリます。
しかし、一度に複数のApexクラスを修正している時など、テストクラスを全部指定するのは面倒。
かと言って、変更セットで上げたりするのも、VSCode使ってるのになんだかなぁとなる。

その他にも細々とした不便さを感じることがあったので、解消するためのコマンド関数を作成しaliasを作ってみました。

# 解決方法
.bashrcに以下の通りデプロイ用関数を定義した

```bash
function deploy2SF() {
    SRC_DIR='./src';
    TARGET_DIR=$SRC_DIR'/classes/';
    # srcフォルダの確定
    if [ ! -d $SRC_DIR ]; then
        SRC_DIR='force-app';
        TARGET_DIR=$SRC_DIR'/main/default/classes/';
    fi

    TEST_NAMES='';
    TEMPSTR='';
    # Testクラスを列挙する
    if [ ! -d $TARGET_DIR ]; then
        # ダミーテストクラス(組織に作成済み)
        TEST_NAMES='NoRunTest';
    else
        while read file; do
            TEMPSTR=${file##*/};
            if [$TEST_NAMES -eq '']; then
                TEST_NAMES=${TEMPSTR%.*};
            else
                TEST_NAMES+=','${TEMPSTR%.*};
            fi
        done < <(find $TARGET_DIR -type f -name *Test*.cls)
    fi
    echo $TEST_NAMES;
    # source:deployだと、モジュールごとに履歴流れるのでやめた
    #sfdx force:source:deploy -p $SRC_DIR -l RunSpecifiedTests -r $TEST_NAMES;

    # Force.com時同様、プロジェクト一括デプロイ方式(mdapi:deploy)に統一 => srcフォルダ配下にpackage.xml突っ込んでzipファイルごとデプロイする
    cp manifest/package.xml $SRC_DIR/
    sfdx force:mdapi:deploy -d $SRC_DIR -l RunSpecifiedTests -r $TEST_NAMES;
    rm $SRC_DIR/package.xml
}

alias sfdeploy=deploy2SF
```

このaliasにより、clssessフォルダにあるApexクラスをデプロイする際に同フォルダ内の全テストクラスを一括指定することが出来ます。

尚、「NoRunTes」クラスはこんな感じ

```Java
@isTest
public class NoRunTest {
    @isTest
    static void test001() {}
}
```

その他にもいくつか関数を作ったので、Gistに上げておきます。
https://gist.github.com/shinya-ochi/8dc747c5acc97c514fffd1e8a7bf173c

## まとめ
基本、自前の関数で何とかするのが手っ取り早い。
我々はなぜ監視を行うのか【第三章】～自動復旧編～

# はじめに
【前回】-> [我々はなぜ監視を行うのか【第二章】～監視システムチューニング編～](https://qiita.com/taro-hida/items/d6d5d25d49080eee17f6)

# 【第三章】～自動復旧編～
本当に対応が必要な障害が発生した時だけ自分宛ての通知をするようにしたAだが、もっと監視運用の効率化に欲が出てきてしまった。
思いついたのが、対応の自動化だ。Aは最近アイマスクを購入し、睡眠の質に凝っていた。極力起きたくない。楽をしたい。

Zabbixなどの監視システムには、「アクション」という機能が搭載されている。
アラート発生時、自動的にNginxの再起動等を実施することができる。
[実際の設定についての記事(Apacheの再起動の場合)](https://qiita.com/mishikawan/items/bcec485a1c427154edf6)

考えてみれば、障害発生時にたたき起こされた際、WEBサーバであるNginxの再起動を実施すると治ることが多かった。
毎度毎度、決まりきったサービス再起動を行うためにたたき起こされるのは面倒だ。Aは寝ていたい。

ということで、Aは「Nginx再起動」というアクションを作成し、各WEBサービスのアラート発生時のアクションとして登録した。

現在の監視システムのアラート発生時のフローとしては、以下のような設定となる

```
1.   アラートが発生する
2.   1度目の通知が、監視システムの「アクション」機能へと飛ぶ
3.1  60秒後に復旧していれば、通常監視に戻る
4.2  60秒後も復旧していなければ、Aへ通知が飛ぶ
```

「アクション」を登録することにより、Aは自分で対応していた復旧作業の大部分をシステムに任せることに成功した。
AがチューニングしたZabbixも、どこか誇らしげに見えた。

もしNginx再起動で復旧しない場合は、Aに通知が飛ぶ。
その場合、Nginxが原因でなかったり、Nginxを再起動しようとしていたものの失敗して、Nginxのステータスがfailedになっていたりする。
このような場合はAの手による障害対応が必要となるので、通知を飛ばす。
これを飛ばさないと、障害がほったらかされた状態になってしまうので大変だ。

Aは少し楽しくなってきて、色んなところに監視を追加していった。

- WEBサービスが死んでいると思って確認したら、原因はDBサーバが過負荷になっていたことにあった。DBサーバにもMysqlプロセスに関する監視を設定し、アクションとしてMysqlの再起動を設定する。
- WEBサービスが死んでいると思ったら、サーバ自体が死んでいた。PING監視を設定する。環境はAWS上にあるインスタンスなので、PING監視のアクションとしてインスタンスの再起動を設定する。

Aの日常的な負担は少しずつ減っていって、復旧も迅速に行えるようになった。
一次対応の大部分をシステムに任せることに成功したAの業務は、障害のそもそもの根本原因を探る業務、二次対応がメインになっていった。

Aは頑張ってくれている監視システムにご褒美を上げようとインスタンスタイプをひとつ上げてみたが、無駄な出費が増えたのでCloudwatch経由で上司に通知が行って怒られた。

# まとめ

- 通知を行ったのち、毎度同じような対応をしている場合は、<b>通知先をシステムとし</b>、システムによる自動実行を設定する。

メリットとして、

・障害対応時のミスが減少する
・手動対応よりも迅速に復旧が行える
・人の負担を減らすことができる
・担当者が通知に気づかないことによる、障害対応漏れを減らせる

などが挙げられる。

以上のような効果が、システム監視を設定することにより得られる。


# あとがき
次回は、切り分けのための監視設定編を予定...。
Drupal 8 の検索で Solrを利用する

Elasticsearchなども流行ってますが、案件でやるときの定番はSolrかなぁということで、Drupal8で、Solr検索を導入してみます。

感覚的には１万を超えるノードで検索機能があるときはMySQLの全文検索は厳しいなぁとおもってます。Solrだったら10万とかでも余裕ですね。
※Cronのインデックス更新の負荷は要注意ですけど

まずは、Solrを動かすために必要なJavaをいれます。今回はSolrの6系を入れるので、Javaは1.8です。

```
#  yum install java-1.8.0-openjdk	
```

元々Javaの1.7が入っていたので、1.8を使用するように変更します。

```
# alternatives --config java                                                                               

There are 2 programs which provide 'java'.

  Selection    Command
-----------------------------------------------
*+ 1           /usr/lib/jvm/jre-1.7.0-openjdk.x86_64/bin/java
   2           /usr/lib/jvm/jre-1.8.0-openjdk.x86_64/bin/java

Enter to keep the current selection[+], or type selection number: 2
```

Javaのインストールと設定ができたので、Solrをインストールします。

```
# wget http://ftp.jaist.ac.jp/pub/apache/lucene/solr/6.6.2/solr-6.6.2.tgz  
# tar xzf solr-6.6.2.tgz 
# ./solr-6.6.2/bin/install_solr_service.sh solr-6.6.2.tgz 
``````

testというコアを作ります。コアを作るときは、solrユーザになる必要があります。

```
# /etc/init.d/solr start

# su - solr 
$ cd /opt/solr/bin/
$ ./solr create_core -c test 
```

つづいて、Drupal で Solrを利用するためのモジュールをいれます。

```
$ drush en search_api
$ drush en search_api_solr

Project search_api_solr contains 2 modules: search_api_solr_defaults, search_api_solr.
Module search_api_solr doesn't meet the requirements to be enabled.                                                     [error]
Solr search requires the solarium/solarium library.                                                                     [error]
```

solarium が必要と怒られたので、composer でいれます。

```
$ composer require drupal/search_api_solr
```

すると、モジュールが入ります。

```

$ drush en search_api_solr
The following extensions will be enabled: search_api_solr
Do you really want to continue? (y/n): y
search_api_solr was enabled successfully.                                                                               [ok]
```

モジュールが提供する、Solrの設定ファイルを、Solrに読み込ませます。

```
# cp -R /home/drupal/html/hiqvc/modules/contrib/search_api_solr/solr-conf/6.x/*  /var/solr/data/test/conf/
# /etc/init.d/solr restart
```


あとは、管理画面の「環境設定」 > 「Search API」 で「Add Server」を押下し、先ほどインストールしたSolrの情報を入力し、「Add Index」で、インデックスしたいものを選択すれば完了です。
Markdownをコンソール上でプレビュー

## 何がしたかったのか？

昭和生まれなもんで、GUIとかよう使われへん（エセ関西弁）

## 入手方法

https://github.com/tksmiura/miro

ここに入っているmiroというファイルをパスの通っておくところにコピーするだけ

## 実行方法

```
$ miro <markdown file>
```

## 実行結果

<img width="522" alt="test_screenshot1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79353/b30a6dda-25dc-2e45-f984-9ad342aec26c.png">
<img width="522" alt="test_screenshot2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79353/ce662c8d-6d7a-7cb7-3403-a555f56cb472.png">

listとかテーブルとかちょっと頑張った。

## 課題

* ユニコード対応（誰だ絵文字とか考えたやつ！ 
https://qiita.com/yumetodo/items/54e1a8230dbf513ea85b)
* もう令和なので、考え方を改める
大容量のtsvデータを分割する。

#とある事情より25GBもの容量のデータを処理しなくてはならず、それを処理しようと色々やってみたお話。

まずは素直に、、、これをやってみた。

```python
import pandas as pd
data=pd.read_csv( 'ファイル名.tsv', delimiter='\t' )
```

>無限に終わらん、、、、待ってるのつらい、、、



次にやってみたこと
DASKというのを使うと早くなるとの噂をきき使ってみる。

```python

import dask.dataframe as ddf
import dask.multiprocessing

df_dask = ddf.read_csv( 'ファイル名.tsv',parse_dates=True) 
df_dask = df_dask.compute()
display(df_dask.tail())
print(df_dask.info())
```

>変わらなくね？？？？遅くね？？？



次にチャンクで区切ってみる。

```python:
reader = pd.read_csv('ファイル名.tsv', skiprows=[0, 1], chunksize=10000000)
df = pd.concat((r for r in reader), ignore_index=True)
```
>pd.concatにめっちゃ時間がかかり、耐えられなくなる。



####そうだまずはデータの行数を調べようと思って、ターミナルで下を入れてみたところ、
`wc -l ファイル名.tsv
`

1億行を超えてることがわかった。

###最終的に選んだ手法

データ分割しちゃおっと!

 `split -l 1000000 ファイル名.tsv [お好みの名前]`
こうした後に、たくさんできたファイルの名前の後ろに`.tsv`をつけて、、、

分割に成功。
Template Method Pattern C# 8.0風味

# Template Method Pattern C# 8.0風味

C# 8.0の機能を活用して、今までのパターンを書き換えることができそうなので、少し記事を書いてみます。
新手法なのか、機能の悪用なのかは、今のところ判断しかねているところです(^^;

## 調理前（C# 7.3以前)

3つの抽象メソッドを順番に呼ぶ`Execute()`メソッドを持つ、単純なサンプルです。

```csharp
public abstract class AbstractWorker {

    protected abstract void Begin();
    protected abstract void Do();
    protected abstract void End();

    public void Execute() {
        Begin();
        Do();
        End();
    }
}

public class MyWorker : AbstractWorker {

    protected override void Begin() => Console.WriteLine("▽▽▽");
    protected override void Do() => Console.WriteLine("Do");
    protected override void End() => Console.WriteLine("△△△");

    public static AbstractWorker Create() => new MyWorker();
}
```

## 調理後（C# 8.0風味）

抽象クラスで書いていた箇所を、C# 8.0 で追加された**インターフェイスの既定メンバー** 機能で置き換えたものです。

```csharp
public interface IWorker {

    protected void Begin();
    protected void Do();
    protected void End();

    sealed void Execute() {
        Begin();
        Do();
        End();
    }
}

public class MyWorker : IWorker {

    void IWorker.Begin() => Console.WriteLine("▽▽▽");
    void IWorker.Do() => Console.WriteLine("Do");
    void IWorker.End() => Console.WriteLine("△△△");

    public static IWorker Create() => new MyWorker();
}
```

インターフェイスでは既定で`public`かつ`abstract`のため、多少の違いはあるものの、ほぼほぼ同じ書き方で同じ機能を実現できました。

## まとめ

C# 8.0 にてインターフェイスメンバーの既定実装の機能が追加されました。これはインターフェイスのバージョンアップを容易にするための機能です。

ですが、それだけでない機能追加があることも見逃せません。みなさんも新たな機能で何ができるか試してみて、何か見つけたらQiitaで教えてください。
【C#】配列の定義

配列の定義方法を忘れてしまいそうなので、自分用にメモ

# 方法1: 配列を定義してから、値を代入する。

```c#
int[] xList = new int[3];
xList[0] = 0;
xList[1] = 4;
xList[2] = 2;
```

# 方法2: 配列の定義と代入をワンライナーで行う。

```C#
int[] yList = new int[3] { 1, 5, 2 };
```


# まとめ
ホントにメモ！！
NLog 日付ログファイルのローテーションを同じフォルダで行う

#はじめに
NLogでログファイル名を日付にして保存期間ありにしたいときの設定方法です。
NLogの[file targetのドキュメント](https://github.com/nlog/nlog/wiki/File-target )には、
ローテーションがDateのときは、archiveFileは別のフォルダにしなければいけないと説明があります。
CurrentFileに日付ファイル名を指定して、同じフォルダのままできないかと思い、設定の組み合わせを見つけました。

#環境
Windows10 Professional 1903 
Microsoft Visual Studio Enterprise 2019 Version 16.3.1
Microsoft .NET Framework Version 4.7.2
Microsoft Visual C# 7.0
NLog for .Net Framework 4.5 ver.4.6.7

#Example
```xml:NLog.config
  <targets>
    <target xsi:type="File" name="MyFile" fileName="C:\hoge\Log\${date:format=yyyyMMdd}.log"
                layout="${longdate} :${level} ${logger}:: ${message} ${exception}"
                encoding="UTF-8"
            archiveFileName="C:\hoge\Log\{#}.log"
            archiveNumbering="Date"
            archiveDateFormat="yyyyMMdd"
            maxArchiveFiles="7"
            concurrentWrites="true" 
    />
  </targets>

  <rules>
    <logger name="*" minlevel="Info" writeTo="MyFile" final="true" />
  </rules>
```
ローテーションの**archiveEvery="Day"**を指定しないようにすると、archiveが実行されないで、CurrentFileに日付を指定してもうまくローテーションができました。
#logフォルダの結果
* ログ出力実行前
 ----------------------------------------------------
![logfolder3](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/512964/15a609bb-66ea-3ef7-387d-ee68dfae75d8.png)

 
* ログ出力実行後
 -----------------------------------------------------
![logfolder4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/512964/9ef2784b-e1e4-1f29-7e37-64efcbddd53c.png)

currentFile(20191012.log)とarchiveFileの7ファイルを残して削除ができました。
EC2のLaravel6.0環境 VueとLaravelでのTIPS　AWS/Laravel連載(10.5)

# LaravelのシーディングにFakerを入れる

[連載９回目](https://qiita.com/rf_p/items/a79b038fdea63b0ac5cb)で初期値でhoge, fugaという値を入れました。
実際テストする中だといちいちダミーの名前やタイトル、文章等を考えるのは一苦労です。

そこで便利なのがFaker。
Laravelだと最初からcomposer.jsonに入っているので、install不要です。

そしてシーディングだけでなく、Laravelのfactoryという仕組みを作って汎用性のある書き方をしてみます。

```powershell
$ php artisan make:factory PostFactory --model=Post
```

```php:database/factories/PostFactory.php
<?php

/** @var \Illuminate\Database\Eloquent\Factory $factory */

use App\Post;
use Faker\Generator as Faker;

$factory->define(Post::class, function (Faker $faker) {
    return [
        'title'   => $faker->sentence,
        'content' => $faker->paragraph,
    ];
});
```

```php:database/seeds/PostsTableSeeder.php
...
     public function run()
     {
        $posts = factory(App\Post::class, 3)->create();
     }
```

```powershell
$ php artisan db:seed
```

これで３件分のダミーデータが生成されます。

```powershell
php artisan tinker
Psy Shell v0.9.9 (PHP 7.2.22 — cli) by Justin Hileman
>>> Post::all();
[!] Aliasing 'Post' to 'App\Post' for this Tinker session.
=> Illuminate\Database\Eloquent\Collection {#3084
     all: [
       App\Post {#3085
         id: 1,
         title: "hoge",
         content: "fuga",
         created_at: null,
         updated_at: null,
       },
       App\Post {#3086
         id: 2,
         title: "Repellendus odit qui facilis ea sint.",
         content: "Est eos sed amet quibusdam. Et voluptatem voluptatem et accusantium qui.",
         created_at: "2019-10-12 21:05:10",
         updated_at: "2019-10-12 21:05:10",
       },
       App\Post {#3087
         id: 3,
         title: "Neque rerum ut molestiae aut sequi.",
         content: "Rem exercitationem doloremque facilis et sed qui blanditiis. Dolorem ea quo in voluptatem. Distinctio tempora dolor culpa reprehenderit fuga voluptas omnis. Animi voluptas repudiandae rem quisquam eligendi dolores. Quibusdam iste aut possimus.",
         created_at: "2019-10-12 21:05:10",
         updated_at: "2019-10-12 21:05:10",
       },
       App\Post {#3088
         id: 4,
         title: "Soluta est iure ex sequi a aspernatur.",
         content: "Eos et voluptatem sint tempore. Rerum voluptates quis est fugit voluptas sit voluptatem consequuntur. Voluptas sapiente illo quo optio.",
         created_at: "2019-10-12 21:05:10",
         updated_at: "2019-10-12 21:05:10",
       },
     ],
   }
>>>
```

[GitHub - fzaninotto/Faker: Faker is a PHP library that generates fake data for you](https://github.com/fzaninotto/Faker)

# Vue開発の際は

[連載10回目](https://qiita.com/rf_p/items/dc10a33ff70f216886ff)でVue.jsを入れました。
デバッグはChromeの開発者ツールだけだといろいろしんどいので、Vue.jsのdevtoolsを入れるのをオススメします。

[Vue.js devtools](https://chrome.google.com/webstore/detail/vuejs-devtools/nhdogjmejiglipccpnnnanhbledajbpd?hl=ja)

入れるとこんな感じで、Chromeの開発者ツールに「Vue」タブが追加され、開発が捗ります。

<img width="1232" alt="vue.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199678/f26e7dbf-42f5-d2d0-107a-4b1a8a954a42.png">
OpenBLASのソースをコンパイルしてローカルにインストールする

OpenBLASを[公式ページ](https://www.openblas.net/) からダウンロードして解凍。

```bash:terminal
$ curl -LO http://github.com/xianyi/OpenBLAS/archive/v0.3.7.tar.gz
$ tar -xvf v0.3.7.tar.gz
```

解凍したフォルダに移動して、下記のコマンドを打つと
OpenBLAS-0.3.7/bin, OpenBLAS-0.3.7/include, OpenBLAS-0.3.7/libに
インストールされる。

```bash:terminal
$ cd OpenBLAS-0.3.7
$ make 
$ make install PREFIX=$(pwd)
```

参考：
https://github.com/xianyi/OpenBLAS/wiki/User-Manual
macOS Catalinaで（古い）VMware Fusion だと画面が真っ暗になった。

私は古いバージョンのVMware Fusion 7をしつこく使ってるんですが、macOS Catalinaにアップデートしたところ、仮想マシンの画面が真っ暗になってしまいました。

一回他のバージョンのVMware Fusionをインストールして云々という情報もあったので試したんですが自分の環境ではうまくいきませんでした。

最新版にするお金をかけるほど使ってないんですよね〜悩みますね。

ふと仮想マシンのライブラリ画面をみるとこちらではプレビューできてます。あれ？じゃぁ動いていないわけじゃなくて画面だけの問題？？

そういえばVNC使える設定あったよなと設定してみました。

<img width="752" alt="スクリーンショット 2019-10-12 20.42.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51116/2f46621b-4ef2-4b07-7d3f-d093fdec6961.png">

MacのほうはFinder＞移動＞サーバーへ接続から、vnc://127.0.0.1:5901で接続したところうまくいきました！
zabbixのlog監視で日付サブディレクトリにあるログファイルを取得したい。

# ログの出力先が日付のディレクトリ

Windows上のパッケージアプリをログ監視する必要があり、そのアプリはログファイルの出力先が日付のディレクトリを作成して、その中にファイル名YYYYMMDDHHMMSS.logで出力するとってもファンキーな仕様でした。

# zabbixでのアイテム指定

まず、試したのがlogrt
これは正規表現が使えるらしいので以下の様に指定してみた。

仮にC:\logs\YYYYMMDD\とした場合

```
key:log[C:\logs\.*\.*/.log]
```

しかし、動かない、どうやらlogrtは最後の\から後のファイル名に対してのみ正規表現が使えるらしい。
......なにーーー！ってことはサブディレクトリを毎日作られたら、ログ取得できないじゃん！

# 仕方がないので

監視対象のWindows側の日次のバッチ処理で、翌日の日付のシンボリックリンク作って対応しました。

```bat
mklink /D C:\logs\YYYYMMDD\ C:\logs
```

こうしておけばアプリは日付のディレクトリにlogを吐いてるつもりでも、実際はC:\logsにファイルが出力されます。
ついでも昨日のシンボリックリンクは掃除のため削除するようにしておく。

この状態ならzabbixで

```
key:log[C:\logs\.*/.log]
```

としてすれば、ログを吸い上げてくれましたとさ、めでたしめでたし。

# その他

LLDってのを使うと動的にアイテム作れるらしいのでできるっぽいけど試してません。
初心者によるプログラミング学習ログ 124日目

# 100日チャレンジの124日目

Twitterの100日チャレンジ#タグ、#100DaysOfCode実施中です。
すでに100日超えましたが、継続。

100日チャレンジは、ぱぺまぺの中ではプログラミングに限らず継続学習のために使っています。

124日目は、

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">おはようございます<br>124日目<br><br>メンターさんの課題<br>udemyで架空のwebサイト作成のうち、ヘッダーにロゴとテキスト配置<br><br>仕事で帰りが遅く、寝落ちもしたので作業進まず…<a href="https://twitter.com/hashtag/%E6%97%A9%E8%B5%B7%E3%81%8D%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8?src=hash&amp;ref_src=twsrc%5Etfw">#早起きチャレンジ</a><a href="https://twitter.com/hashtag/100DaysOfCode?src=hash&amp;ref_src=twsrc%5Etfw">#100DaysOfCode</a> <a href="https://twitter.com/hashtag/%E9%A7%86%E3%81%91%E5%87%BA%E3%81%97%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%A8%E7%B9%8B%E3%81%8C%E3%82%8A%E3%81%9F%E3%81%84?src=hash&amp;ref_src=twsrc%5Etfw">#駆け出しエンジニアと繋がりたい</a></p>&mdash; ぱぺまぺ@webエンジニアを目指したい社畜 (@yudapinokio) <a href="https://twitter.com/yudapinokio/status/1181678716730007553?ref_src=twsrc%5Etfw">October 8, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
可変クラスの作り方 Rails Slim

## はじめに
可変クラスを作るテクニック（？）を忘れないようにまとめておきたいと思います。

## 可変クラスの作り方
### slim
slimで書くことが多いので、slimでまとめます。

ポイントとしては下記の形で書くことです。

* "固定クラス　+　可変クラス"

```ruby.html.slim
.btn.outline.active class="#{a[num]}"
/ 固定クラス：　.btn.outline.active
/ 可変クラス：　#{a[num]}
```

---
### 会社紹介

**株式会社 Mosaica**  
最先端テクノロジーで社会課題を解決し、持続可能な未来を創造する IT カンパニー。
AI ソリューション、クラウド統合、DX 推進、経営コンサルティングなど包括的なサービスでビジネス変革を支援しています。  

詳しくは [公式サイト](https://mosaica.co.jp/) までお気軽にご相談ください。
公式サイト： https://mosaica.co.jp/
docker-compose・VSCodeを使ったXdebug環境構築方法

# 概要
　docker-compose・VSCodeを使ったXdebug環境構築方法を調べるとたくさんの情報が得られます。しかし、それらの情報を元に環境構築をやってみても、なかなか上手くいかずにかなりの時間悩んでいました。
　そこで、私と同じような状況の人の助けになればと思い、上手く動くようになった方法を紹介したいと思います。現在進行形でdockerの勉強をしている状況なので、Dockerfile等の中身に関してはお粗末だと思いますが、今回はXdebugの環境構築がメインなので悪しからず。また、記載してる箇所は必要最低限の部分のみにしてあります。

# 各種ファイルの中身紹介
#### Dockerfile
```dockerfile
FROM centos:centos6.9
EXPOSE 80
RUN yum update -y && \
  yum install -y vim
# php
RUN yum install -y http://rpms.famillecollet.com/enterprise/remi-release-6.rpm && \
  yum install -y --enablerepo=remi,remi-php73 php php-devel php-mbstring php-pdo php-gd php-xml php-mcrypt php-xdebug php-pear php-xmlrpc php-pecl-apcu php-pecl-xdebug php-cli php-gd php-mysqlnd php-intl
# apache
RUN yum install -y httpd httpd-tools httpd-devel httpd-manual
```
#### docker-compose.yml
```yml
version: "3"
services:
  web:
    build:
      context: .
      dockerfile: Dockerfile
    volumes:
      - ./app:/home/app
    working_dir: /home/app
    ports:
      - "80:80"
```
#### php.ini

最下部に追記
remote_host に関しては mac と windows で書き方が異なるので注意
また、windows に関しては pro のみ動作確認済み

```ini
[XDebug]
zend_extension=/usr/lib64/php/modules/xdebug.so
xdebug.dump_undefined = 1
xdebug.remote_enable = 1
xdebug.default_enable = 1

; mac
xdebug.remote_host=docker.for.mac.host.internal
; windows
xdebug.remote_host=docker.for.win.host.internal

xdebug.remote_port=9000
xdebug.remote_handler=dbgp
xdebug.remote_mode=req
xdebug.remote_autostart = On
xdebug.remote_log="/tmp/xdebug_log"
```
#### 15-xdebug.ini

この部分をコメントアウトしただけ

```ini
; zend_extension=xdebug.so
```
#### launch.json(VSCode の PHP Debug の設定)

```json
{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "Listen for XDebug",
      "type": "php",
      "request": "launch",
      "port": 9000, //php.iniで設定したxdebug用のport番号
      "pathMappings": {
        // {docker上のdocument root}:{ローカルのdocument root}
        "/home/app": "${workspaceFolder}/app",
        "stopOnEntry": true,
        "log": true
      }
    }
  ]
}

```

# 注意点
　いろいろ試行錯誤するなかでポイントだと思った点は、Xdebug で使用するポート番号を Dockerfile や docker-compose.yml に記載しないことです。私は、これを記載していたためうまく動きませんでした。もし、Xdebug を実行してもブレークポイントで止まらないなど上手く動作していない場合は、この点を確かめてみてください。

**＊以下のように記載しないように注意**

**Dockerfile**

```dockerfile
EXPOSE 80 9000
# ↑ 9000 を書いてはダメ
```

**docker-compose.yml**

```yml
ports:
  - "80:80"
  - "9000:9000" # ← 9000 を書いてはダメ
```

以上、参考になればうれしいです。
【初心者むけ】C++基本事項

最近C++を触り始めたので基本的なことをメモとして残します。

# Hello Worldの出し方

何はともあれ入り口としてのHello World

エディタで以下のように書き、

```c++:hello.cpp
#include <iostream>
using namespace std;

int main(){
  cout << "Hello World!!" << endl;
  return 0;
}
```

ターミナル/コマンドプロンプトでファイルのあるディレクトリまで移動して、

```
g++ -o hello.exe hello.cpp
```

と叩くとhello.cppがhello.exeにコンパイルされます。

その後同じディレクトリにて、

```
./hello.exe
```
とコマンドを入力すると...

```
Hello World!!
```

これでOKですね。


# Hello Worldの中身解説


それぞれの要素に分解して見ていきましょう。
まず、最初の

```
# include ...
```

ですが、
...の部分にあるヘッダファイルをインクルードすることによってライブラリを利用します。

この場合はmain関数の中にある

```
cout,endl
```

を利用するために

```
#include <iostream>
```

としてiostreamをインクルードします。


次に、main関数を宣言します。

```
int main(){
```

C++において、関数は返り値、関数名(引数)、{手続き}、という形で関数を定義します。
この場合は intという返り値で、mainという関数、()の中が空白なので引数はなし、{}の中身についてはこれから解説していきます。



また、インクルード文の直後にある

```
using namespace std;
```

についてですが、

C++という言語は名前空間というものを持っており、例外もあるのですが、基本的に標準ライブラリはstd名前空間に含まれます。

coutやendlもこの名前空間に含まれるので、本来は

```
std::cout << "Hello, World" << std::endl;
```

と書かなければなりません。


```
  cout << "Hello World!!" << endl;
```

しかし、例えば競技プログラミングなどの競技性が高いものにおいてこのように記述するのは冗長で時間の無駄なので、上記のように書いています。

なので、ググった時に出てくる競プロ勢のコードなどでは上記のような書き方をしているはずです。

そして最後の

```
return 0;
}
```

についてですが、main関数においては慣例的に、return 0という表記をしています。

※10/12修正
~~C++において、戻り値なしのreturnや関数末尾のreturn省略は「return 0;」と同じ扱いとなっており、~~
こちらは誤りでした。

コメント欄のご指摘通り、
>>main関数内でreturnが省略された場合のみ、main関数は暗黙的に0を返すとみなされます
それ以外の場合、戻り値がある関数でreturnが省略された場合の動作は未定義動作になります

とのことです。
ご指摘ありがとうございました。
【JavaScript】数値のみを含む配列を sort() メソッドで並び替えるときは sort() メソッドの引数に比較関数を与える

こちらの記事は Zenn に移行しました。
[https://zenn.dev/ndjndj/articles/1e0de3f7d782f1](https://zenn.dev/ndjndj/articles/1e0de3f7d782f1)
RubyMineでJavaScriptのimport文の波括弧前後の空白設定を行う

デフォルトの設定だと、リフォーマットした時に勝手にずれてしまいましたので、コードスタイルの設定をいじります。


下の画像のように、
Preferences
-> Editor
-> Code Style
-> JavaScript
-> Spaces タブ
-> ES6 import/export braces にチェックで解決します。

<img width="1005" alt="名称未設定.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283730/a6afa6d7-dd56-a4fc-3635-ab47dd3808dc.png">

※ RubyMine に限らず、JetBrains IDE であればどれでも同じ設定かもしれません。

---

参考：[Format Space within braces for ES6 import/export – IDEs Support (IntelliJ Platform) | JetBrains](https://intellij-support.jetbrains.com/hc/en-us/community/posts/115000204010-Format-Space-within-braces-for-ES6-import-export)
Rails new したらこんなメッセージが表示されたので、調べてみた1.【chromedriver-helper is deprecated after 2019-03-31.】2.【Ruby Sass has reached end-of-life and should no longer be used.】

記事を移転させました。
[Rails new したらこんなメッセージが表示されたので、調べてみた1.【chromedriver-helper is deprecated after 2019-03-31.】2.【Ruby Sass has reached end-of-life and should no longer be used.】 | Bamboo Note](https://bamboo-note.tokyo/Ruby%20on%20Rails/rails-new-error-messages/)
rootへのルーティング設定方法

#目的
アプリの開発で仕様するrootメソッドの使い方をアウトプットを目的に備忘録的に残します。

#ルーティング設定を行う
Railsアプリを作成、起動後「http://localhost:3000/」 にアクセスすると「public.index.html」に記載された内容が呼び出されています。
ただ、この状態はルートへアクセスしたときに用意したhtmlファイルを返しているだけです。

もしルートにアクセスした場合に特定のアクションを実行させたい場合、「root」メソッドを使ったルーティングを設定する必要があります。
そこで、ルーティングを設定して特定のアクションを実行し、viewを表示する方法を紹介していきます。

ルーティングの設定のため「config/routes.rb」ファイルを編集します。
indexアクションのビューをrootに設定されるように追記します。

```ruby:config/routes.rb
root to: 'home#index'
```

#まとめ
rootメソッドを定義することによって特定のアクションを実行することができます。
[Oracle Cloud] OCI に自動ログインするbookmarklet

#OCI にワンクリックで自動ログインしたいときに使用するbookmarklet

Oracle Cloud Infrastructureにuserid/passwordの入力をスキップして自動ログインしたい場合に使用するbookmarkletです、IDCSでログインします。
複数アカウントを切り替えてloginしたい時に便利。
bookmark自体が流出するとセキュリティリスクになるので気を付けて使いましょう。
パスワードは手入力のままにしておいてもよいかもしれません。

```javascript:OCIlogin
javascript:(function(d, i, v) {
  location.href = 'https://console.us-ashburn-1.oraclecloud.com/%3Ftenant=<テナント名>&provider=OracleIdentityCloudService';
  d[i]("idcs-signin-basic-signin-form-username")[v] = "<ユーザーID>";
  d[i]("idcs-signin-basic-signin-form-password")[v] = "<パスワード>";
  d[i]("idcs-signin-basic-signin-form-submit").click();
})(document, "getElementById" ,"value");
```
このJavaScriptをFirefoxブックマークのURL欄に登録しておいて、あとはそのbookmarkをクリックするだけでオラクルクラウドに自動でloginします。

[参考URL] http://neos21.hatenablog.com/entry/2016/02/13/155454

※ bookmarkletを2回クリックしないとログインできないことがある気がする。

bugfix: bookmarklet中の ? 文字は %3F にescapeしないとjavascriptが動かないbrowserがあるので?を修正。
[参考URL] http://blog.6vox.com/2014/02/ios7chromebookmarklet.html
[暗号通貨自動売買] TVExtBotスタートガイド4(決済&認証キー登録編)

TVExtBot for 暗号通貨(以下、TVExtBot)の決済および認証キー登録方法について説明します。
前回の記事をまだ見ていない方はこちらをどうぞ
 :point_right: [TVExtBotスタートガイド1(設定編)](https://qiita.com/tvextbot/items/5cc7e8028879b706b5e7)
 :point_right: [TVExtBotスタートガイド2(Pineスクリプト編)](https://qiita.com/tvextbot/items/969510a1940cedce8d44)
 :point_right: [TVExtBotスタートガイド3(注文メッセージ作成及び設定編)](https://qiita.com/tvextbot/items/07c82d50f880bdc4c818)

<font color="green">🎁**Bybit 取引手数料15%割引&特典**
Bybit取引所の**アフィリエイトリンク**を使ってアカウントを新規登録していただくと、**取引手数料15%割引**と**最大90ドルの登録特典**がいただけます。
 :point_right: [アフィリエイトリンク](https://www.bybit.com/en-US?affiliate_id=5246&group_id=0&group_type=1)
 :point_right: [登録特典ページ](https://www.bybit.com/ja-JP/prize_page/)
</font>

# 暗号通貨決済方法

① 初めてTVExtBotをインストールして設定のAPIキー登録画面を表示すると、一部の取引所に鍵が掛かっています。
![스크린샷 2020-09-25 12.41.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402678/343894bb-525b-8021-6f7a-1235a9eb6345.png)
② 認証キー登録画面を表示します。
<font color="red">※ FREEバージョン、PREMIUMバージョン、PREMIUM+バージョンがあります。<br>PREMIUM+はPREMIUMと機能は同じですが、自動売買が可能なボラティリティ・ブレイクアウト戦略を提供します。</font>
![스크린샷 2020-09-28 09.10.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402678/3f3806ca-6780-9ad9-7bf7-d20f067ab65c.png)
購入を希望するバージョンをの[決済]ボタンをクリックし、決済画面へ移動します。

③ 決済画面でメールを入力し、[Continue]ボタンをクリックします。
![스크린샷 2020-09-25 12.49.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402678/7dae4fa0-b996-0d7d-d567-bd6913aab79b.png)
<font color="Red">※ 入金確認後、入力したメールにて認証キーをお送りいたします。</font>

④ 決済するコインの種類を選択します。（ライトコイン(LTC)を選択します。）
![스크린샷 2020-09-25 12.50.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402678/674f658c-c2d1-973d-3d59-e9ef6ede82b6.png)
※ 決済可能なコインは <font color="Red">BTC, BCH, ETH, LTC</font> です。
<font color="Red">※ 手数料が安いコインをご選択ください。</font>

⑤ ライトコイン(LTC)の送金金額と送金アドレスが表示されます。
![스크린샷 2020-09-25 12.52.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402678/5d6dbe88-ba2b-ebf8-a5ad-4b082f1e8cf7.png)
送金金額と送金先アドレスをコピーして、自分のウォレット、もしくは取引所から出金手続きを行います。

⑥ 入金を確認すると、③で入力したメールにて認証キーをお送りいたします。
<font color="blue">※ 手動で認証キーを送りしますので、少々時間がかかる場合がございます。</font>

# 認証キー登録

⑦ 認証キーが送られてきたら、設定の認証キー登録画面にてメールと認証キーを登録して[認証]ボタンをクリックします。
![스크린샷 2020-09-28 09.14.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402678/a2b3cc1e-1379-1db6-3b8d-3c4d0a148bc3.png)
⑧ APIキー登録画面を表示すると、取引所の鍵が解除されていることを確認できます。
![APIキー登録画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402678/d8180d3c-93e2-2336-307f-8dfda7943b94.png)
※ 上記決済可能なコイン以外のコインで決済を行いたい場合は、メール(<tvextbot@gmail.com>)にて問い合わせください。
</font>

-以上-