OmniAICreator/Qiita-1.07M huggingface dataset:
webプログラムの仕組み

#webプログラムの仕組み

**クライアントサイド**
ユーザーのwebブラウザ上のクリックや文字入力に応じて即座に画面上の表示やデータの変更を行う。
 
**サーバーサイド**
webブラウザからのリクエストに応じて、情報をサーバーに保存したりユーザ個別の情報を表示する


##1. クライアントサイド  + サーバーサイド
   - ログインフォームからサイトにログインする流れ
     1. クライアントサイドでフォームの入力をチェックする。誤脱があればサブミット処理を行わない。
     2. サーバーサイドでは、主な処理としてログイン認証処理を行う。しかしサーバー側でも入力チェックは必ず行う。



##2. サーバーサイドの管理画面 + 静的HTML
   - ブログ管理画面に文章を記述すると、それを元に静的HTMLが生成される
     1. サーバーサイドプログラムでwebsサイトの管理機能を作成
     2. ユーザーが閲覧するHTMLファイルを出力する



##3. サーバーサイドによる管理画面 + サーバーサイド画面
   - ECサイトの管理画面とショッピング画面
     1. webサイトの管理機能がサーバーサイドに存在する。（カメラ,値段10000円,在庫10個など）
     2. 上記の記録を元に、ユーザーが閲覧する画面が動的に生成される。



<br><br>

##サーバーサイドプログラミング

サーバーサイドで動作するプログラムは、ユーザーからのリクエストを受けたwebサーバーから呼び出され動的にwebページを生成して送信する。普通のwebサイトなどでは、あらかじめ作成されたファイルをリクエストに応じてそのまま表示するが、サーバーサイドプログラミングではその場でwebページのファイルを生成し、リクエストを返す。動的にwebページを生成して送信する方法には、CGI方式とApacheモジュール方式の２パターンがある。



##CGI方式
   - 「ユーザーからのリクエスト→プロセスの起動(Apache)→プロセスの実行(CGI)→プロセスの終了」と行った一連の流れを持つ。webサーバとは別プロセスで起動し、ユーザーからのリクエストを受けてプロセスを実行するたびに、プロセスの起動と終了を行う。webサーバとは別で起動するので、多くのユーザとシェアをするレンタルサーバなどでよく利用される。



##Apacheモジュール方式
   - Apacheはモージュルと呼ばれる小さなプログラムの集合体。その中に、サーバーサイドのプログラミングの実行環境を組み込むことで、Apacheのプロセスから直接プログラムの実行を行う。結果処理速度が速くなる。



- Apacheとは
  - webサービスを提供するソフトウェアのこと。サーバ用コンピュータにインストールし、サーバとして利用するためのソフトウェア。

###1. FastCGI方式
   - CGI方式では毎回プロセスの生成と破棄が行われるため処理効率が悪くなる。FastCGIでは一度起動したCGIプロセスをメモリ内に永続化させることでプロセスを再利用している。


###2. セッション変数

####ステートレス
   - webブラウザからのリクエストに対して、レスポンスを返した段階でプログラムを終了させる。サーバ側では保持すべき状態が残らない。情婦を複数画面で維持することはできない。




####ステートフル
- ユーザの入力情報を複数画面に渡って維持する仕組みのこと。情報の維持のためにセッション変数が利用される。


####セッション変数
   - アクセスしたユーザ一人一人に付与する、状態を保持する特別な変数を付与。
   - サーバに保存されたセッション変数はセッションキーと呼ばれるランダムな文字を使って呼び出せる。このセッションキーをCookieに保存することで複数の画面にまたがっても情報の保持ができる。URLの後ろに付与することでセッション維持する仕組みもある。



####セッション変数の問題点
 - セッションキーが漏洩することでユーザー情報の漏洩が生じる。セッションキーが漏洩しない仕組みづくりが必要となる。



##サーバーサイドのプログラミング言語

###PHP
   - テキスト処理得意とし、webに特化した機能が標準で盛り込まれている
   - HTMLにプログラムコードを埋め込むスタイル。

###Perl
   - CGIが流行した時の代表的なプログラミング言語。
   - 多くのレンタルサーバで簡単に利用できる。



###Ruby
   - 国産のプログラミング言語
   - オブジェクト指向プログラミング



###Java Servlet
   - servletコンテナと呼ばれるJavaによって作られたアプリケーションサーバ上で動作する。
   - パフォーマンスや安定性に優れ、決済システムなど高信頼性が求められるシステムに幅広く利用されている。





##データベース

サーバサイドでファイルを保存したり管理者にメールで送信することがある(データ情報や入力内容を保存するため)。大量の情報や再訪問時にユーザに表示する情報を保存する場合は、主にデータベースシステムを利用する。



###リレーショナルデータベース(RDBMS)
   - データベースのシステムはデータの読み書きや情報の集計、検索などを簡単な手続きで行える。
   - RDBMSはデータベースシステムの代表的なもので、表形式のデータ構造を持つ
   - 表と表はキーというデータを指し示す情報によって関係性を持つように設計されている。



###データベースをコントロールするSQL文
 - テーブル同士の関係性を元に必要な情報を検索したり情報を保存したりするなど、データベースを操作する処理はSQL文を利用して行う。



###プログラミング言語からデータベースに接続する方
 - 言語ごとに用意されているライブラリを利用して通信を行う。(Rubyの場合、mysql.rb)



###Webプログラムに利用される主なDB
   1. MySQL
   2. Oracle Database
   3. SQLite





##HTML以外に動的生成可能なデータ

画像やRSS、Flashなどを動的生成することもできる。



###Content-Type
  - クライアントにデータを送信する場合、データの種類を判別する場合にHTTPプロトコルに定められたContent-Typeヘッダを通じてファイルの種類を示す。


###MYMEType
  - データの種類を示す識別子のこと。Content-typeは項目のことで、MYMETypeは値そのもの。「Content-Type : text/plain」のようなもの。



静的ページでwebサーバからファイルをダウンロードする場合は、ファイルの拡張子を元にwebサーバが適切にMYMETypeをContent-Typeヘッダに付与するが、動的ページの場合はwebプログラムで設定する必要がある。
GoをWindows向けにビルドするときの注意点メモ

社内に向けてWindowsのCLIツールをgolangで書いたりなどしているが、その際に困ったことなど。
今後もハマることがあれば追加して行きたい。

### Windowsにtimezone.zipがないため`time.LoadLocation`でerrorになる。
A1. `time.LoadLocationFromTZData`を使う
A2. [4d63.com/tz](https://4d63.com/tz/index.html)を使う

[Githubにこの件のissueが立っている](https://github.com/golang/go/issues/21881)
Windows環境の場合`time.LoadLocation(s string)`は`$GOROOT\lib\timezoneinfo.zip`を参照するため、goをインストールしていない環境ではエラーとなる。パスは埋め込まれており変更できない。
`time.LoadLocationFromTZData`はtimezoneの情報をバイト列で渡せるのでbindataとして埋め込んで渡せば解決する。timezoneのbindataも埋め込んでパッケージ化されているのが`4d63.com/tz`である

自身のパッケージ内ではそれでよいが`github.com/go-sql-driver/mysql`などは`dns.go`の中で`time.LoadLocation`を読んでいたりする。
この場合はvendor配下(dep管理)を直接書き換えて対処している。

## 参考

ビルド全体についてはdtan4さんの[Go でツール書くときの Makefile 晒す](https://qiita.com/dtan4/items/8c417b629b6b2033a541)がとても参考になります。
AWS 料金

具体的な料金については変動があるため、記載しません。
利用の際はAWSの各サービスのサイトを確認しましょう。



##1.基礎##
実際の必要なリソースの量、使っているリソースの量に応じて料金を支払うということになります。

- 従量課金制
- 予約による値引き
- 使うほど値引き
- AWS拡大に応じて値下げ（スケールメリット）



##2.AWS無料利用枠##
一部のサービスは１年間、無料で利用できます。
詳細は↓のサイトを見て見ましょう、そして、とりあえず利用して見ましょう。
[AWS無料利用枠](https://aws.amazon.com/jp/free/)



##3.追加料金なし##
一部のサービスでは料金は発生しません。
例えば、Amazon VPC。
ただし、Amazon VPCにつくられたAmazon EC2などはもちろん料金は発生します。

他にはこんなサービスもあります。
・AWS Elastic Beanstalk
・AWS CloudFormation
・AWS IAM
・Auto Scalling
・AWS OpsWorks



##4.支払いの対象となるもの、ならないものの基本的な考え方##

- 支払いの対象となるもの
 - コンピューティング
 - ストレージ
 - 送信データ転送 →　AWS Data Transfer Out という明細で記載されます。
 
- 支払いの対象とならないもの
 - 受信データ転送
 - 同一リージョン間でのサービス間のデータ転送



##5.AWS間のデータ転送##

- インバウンドデータ転送は、すべてのリージョンにおけるすべてのアマゾンウェブサービス全体で無料です。
- 同じリージョン内のアマゾンウェブサービス間でのアウトバウンドデータ転送に料金はかかりません。



##6.見積もり##

提供しているツールは3つ。

- [簡易見積りツール](https://calculator.s3.amazonaws.com/index.html?lng=ja_JP) 
- [TCO計算ツール](https://aws.amazon.com/jp/tco-calculator/)
- [Pricing Calculator](https://calculator.aws/#/)


##7.請求ダッシュボード##
AWSアカウントを作成したら、「請求ダッシュボード」を登録することを忘れずに！

「請求アラートを管理する」をクリック。
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/280929/f94a20d7-fc6b-9807-f43d-390d82abdaca.png)

CloudWatch の画面が開くので、「請求アラームを作成すると」をクリックし、請求アラームに必要な条件を入力して設定してください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/280929/c725110c-38f8-b7fc-47a5-3d1c431917f3.png)



##8.料金の調べ方##

- <AWSサービス名> pricing　で検索しサービスごとに調べる。

- Amazon Web Services Simple Monthly Calculator を利用する。



##9.AWS Cost Explorer##
経済的変化を可視化できるツールです。

「コストエクスプローラーを起動」
![スクリーンショット 2019-02-04 19.31.50.png](https://qiita-image-store.s3.amazonaws.com/0/280929/c2426e5a-8b7b-1e1f-eeb2-4a37686988b3.png)

↓こんな感じ。
![スクリーンショット 2019-02-04 19.30.49.png](https://qiita-image-store.s3.amazonaws.com/0/280929/704fbad7-e35b-2d8d-70e8-0badb643d764.png)
Inno Setup で作ったインストーラーの再起動(Restart)設定

# はじめに

*こんにちは、のんびりエンジニアのたっつーです。*
*[ブログ](https://www.fast-system.jp/)を運営しているのでよろしければ見てください。*

[Inno Setup](http://inno-setup.sidefeed.com/) を用いて Setup.exe などを作る事は多いかと思いますが、再起動を促す設定がよくわからなかったので調べた結果をここに残しておきます。

# インストール時に再起動

- スクリプト設定

```ini
[Setup]
AlwaysRestart=Yes
```
- 実行結果（インストール完了後に表示）

![image.png](https://qiita-image-store.s3.amazonaws.com/0/227880/7605a8d6-e38f-7f76-fb65-8a9d54b50f7f.png)


# アンインストール時に再起動

- スクリプト設定

```ini
[Setup]
UninstallRestartComputer=Yes
```
- 実行結果（アンインストール完了後に表示）

![image.png](https://qiita-image-store.s3.amazonaws.com/0/227880/6621c75a-3705-06ca-f800-0238d080de00.png)

# 感想

Windows Installer / InstallSheild を使った事ありますが、Inno Setup はシンプルで使いやすいですね。GUIにこだわらないで設定項目をすべてスクリプトで記載するのもGUIの使い方を覚えなくてよいので結構いい感じ。

*よければ ブログ「[初心者向けUnity情報サイト](https://www.fast-system.jp/)」の方にも色々記載しているのでぜひご参照いただければと思います。*
[Ruby][初心者向け]Ruby開発環境周りのツールの名称や役割について

#◆はじめに

Ruby on Railsを学習し始めたのでメモ

〇参考になるかも知れない対象---------------
初学者

〇注意点---------------------------------
MacかWindowsで使用するツールが異なります。
が、ここではごちゃ混ぜで書いてます。
※いずれちゃんと分けて書く。

#◆RubyGems
######①何それ？
<font color="Red"><b>パッケージ管理ツール</b></font>のこと
######②何ができる？
gem形式のパッケージのダウンロードを行なったりインストールすることができる
######③どう使うの？
(win)コマンドプロンプト
(mac)ターミナル

でコマンドとして使用する。

例)gemコマンドを使用してRailsをインストール

```
$ gem install rails
```
######④備考
RubyGemsはRubyインストール時に標準でついてくる。
※Ruby1.9以上


#◆gem
######①何それ？
Rubyの<font color="Red"><b>パッケージ</b></font>、または<font color="Red"><b>ライブラリ</b></font>の呼び名

######②何ができるの？
gemにもよるが、
・パッケージが管理できる「bundler」 ※RubyGemとの違いは後述
・フレームワークの「Rails」
・SQLiteをRailsから利用するために必要な「sqlite3」

上記全てgem形式のパッケージという位置づけになる

######③どう使うの？

「bundler」を例に出して説明すると、、、、
後述します。。

######④注意点
そのgemがプロジェクト毎に適用されているのか、
それともOSにインストールされたRuby自体にgemが適用されているのか。

これらは後々問題になったりするので、上記の意識を持っていることは大切かも。

#◆Bundler
######①何それ？
gem形式のパッケージであり、
<b>「gemの依存関係とバージョンを管理するためのツール」</b>である

######②何ができる？
・プロジェクト毎にgemをインストールできる
・依存関係の解消　※下記参考
参考：https://www.sejuku.net/blog/19426
>例えばAというgemがあって、Aを使うにはBというgemを使う必要がある、そのgemを使うにはCというgemを….
となっている時、AはBに依存しており、BはCに依存しているということになります。
そうなった時、一つ一つのgemをインストールするのって面倒ですよね？
しかし、bundlerを使えば、依存関係のあるgemを一括でインストールしてくれます！
一括でインストールしたgemはすべて、依存関係が解決された状態で、インストールされています。

######③どう使うの？
コマンドライン、ターミナルからコマンドを叩いて使用する。

コマンドはいくつかありますが、
依存関係の説明のため、以下の二つを紹介
・「bundle init」
・「bundle install」

流れとしては、
①「bundle init」でGemFile(インストール先が記述されたファイル)を作成
②「bundle install」で①で作成したGemFileを基にインストールを行う
すると、、
③１つのgemしか記載していないのにも関わらず、必要な他のgemを勝手にインストールしてくれている…!?となる

・bundle init

```
$ bundle init
Writing new Gemfile to /Users/shun/RubySample/Gemfile
```
```gemFIle:GemFile
# frozen_string_literal: true
source "https://rubygems.org" ←インストール先
# gem "rails"
```

```
$bundle install
```

```
Fetching gem metadata from https://rubygems.org/……….
Fetching version metadata from https://rubygems.org/..
Fetching dependency metadata from https://rubygems.org/.
Resolving dependencies…
Using rake 12.0.0
Using concurrent-ruby 1.0.5
Using i18n 0.8.1
Using minitest 5.10.1
…省略
Using actionmailer 5.0.2
Using railties 5.0.2
Using sprockets-rails 3.2.0
Using rails 5.0.2
Bundle complete! 1 Gemfile dependency, 38 gems now installed.
Use bundle show [gemname] to see where a bundled gem is installed.
```
あるgemに依存関係があるgemがずらずらとインストールされています。

また、プロジェクトごとに違うgemを入れる場合や、プロジェクトごとに違うバージョンのgemを入れる場合はこう

```
$ bundle install --path vendor/bundle
```

<b>「–path vendor/bundle」</b>をつけると、gemを現在のフォルダの下のvendor/bundleにインストールしてくれる。ありがたい(^-^)


######④注意点

#◆rvm
######①何それ？
Ruby Version Managerの略




######②どう使うの？
######③注意点
Google Cloud Next DogRunメモ

## Room5 ML/AutoMLのメモです
### Q. 数値回帰や時系列予測のモデルはリリースされるの？
A. 期待しててね


### Q. TPUとGPUのメリットデメリットを教えて？
A. TPUはマトリックス演算ユニットが入ってるよ

### Q. Googleで用いられているTensorFlowLiteプロダクトがある？
A. 新しいプロダクトなので、わからない。Android Wearに入るらしい。

### Q. AutoML VisionはNASNetが元になっているが、NaturalLanguageやTranslationは何を元にしているの？？
A.[GoogleNeuralMachineTranskation](https://en.wikipedia.org/wiki/Google_Neural_Machine_Translation)がベース。あとはチューニングをしながら、顧客の要望に沿うようなデータを作成している。

### Q. TPUを使っている時のクラスタ構成がどうなっているのかわからないので教えて
A. VMと8コアが乗っていてTPUが演算をしてCPUがデータの受け渡しを行なっている。
TPUで処理できない内容はCPUで処理する。

### Q. TPU Estimatorと普通のEstimatorが統合されることはある？
A. 今後は統合しようとしている。CloudTPUを何台使うかなども設定できるようになるよ。
kerasでもCloudTPUを使える。最大限有効活用は出来ない。

### Q. EstimatorAPIに変換しないといけない？
A. EstimatorAPIを使うとよしなにしてくれる。TensorFlowをゴリゴリ書くのは辛いらしい。

### Q. ONNXとの関係性について。デベロッパ的にはどう思う？
A. グラフを標準化して共有出来るのは意味があること。

### Q. 機械学習によってエンジニアの仕事はなくなる？
A. 一部の仕事はなくなる可能性はある。AutoMLによって新たに生まれる仕事もあるのでは？
BottleのCookieの設定にはpathの設定が必要だった

### やろうとしたこと

PythonのWEBフレームワーク `Bottle` でログイン機能をつくろうとした
具体的にいえば、ログインでユーザー認証後に `Cookie` に `user_id` を設定する。


```python:app.py
@route('/')
def index():
        user_id = request.get_cookie('user_id', secret=SECRET_KEY)
        current_user = session.query(User).get(user_id) if user_id else None
        return template('templates/index',url=url, current_user=current_user)

@route('/users/login', method='GET')
def login_get():
        current_user = None
        user_id = request.get_cookie('user_id', secret=SECRET_KEY)
        redirect('/') if user_id
        return template('templates/users/login', url=url, current_user=current_user)

@route('/users/login', method='POST')
def login_post():
        current_user = None

        email = request.POST.getunicode('email')
        password = request.POST.getunicode('password')

        verified_user  = # ユーザー認証の処理
 
        # 認証が通ればオブジェクトが入る
        if verified_user is not None:
                response.set_cookie('user_id', verified_user.id, secret=SECRET_KEY)
                redirect('/')
        else:
                return template('templates/users/login', url=url, current_user=current_user)

```

### つまづいたこと

ログイン認証が通ったら、ルートパスにリダイレクトするんですが、ルートパスでログインしているときの表示に切り替わらない。
※　`current_user` が `None` か否かで判定しています。

### 原因

ログインの認証が通って、クッキーをセットしたときに `path` の設定も必要だったみたい。今回ログイン認証をして `Cookie` をセットしたときのパスは以下になります。

```python:app.py
@route('/users/login', method='POST')
def login_post():
```

そうなると、 `user_id` 変数が `/users` のパスにセットされるみたいで `/` のパスだと変数がとりだせないみたいです。知らんかった。

以下みたいに `path` を設定するとできるようになりました。

```python:app.py
@route('/users/login', method='POST')
def login_post():
        # 略
        if verified_user is not None:
                response.set_cookie('user_id', verified_user.id, secret=SECRET_KEY, path='/')
```

ちゃんとパスもをセットしないとだめなんですね。`Django` だとその辺設定しなくてよいので見落としていました。



### 参考にさせていただきました
[Pythonで一番小さいWEBフレームワークbottle.py その6(COOKIES)](http://www.denzow.me/entry/2017/12/09/103828)
【Unity】2Dゲーム入門！〜タップゲームを作ろう〜

はじめまして、ますみです！

[![自己紹介.png](https://www.umi-mori.jp/wp-content/uploads/2023/02/introduction_banner_2-2048x533.png)](https://bit.ly/banner_intro_masumi_creator_qiita)


# はじめに
はじめてUnityで2Dゲームを作る人向けのテキストです！
あえて重複する部分は説明を省略しているところもあります。

## サンプルゲーム
- 概要：`画面をタップ（クリック）して、障害物（りんご）をよけていくゲーム`
- 学べること
  - ジャンプ
  - タッチ
（クリック）
  - クローン
  - スコアの加算と表示
  - ゲームオーバーの表示
  - リトライボタン

![game.gif](https://qiita-image-store.s3.amazonaws.com/0/240280/c387c03a-7771-618b-c910-2a1f301fdf12.gif)

## 作る手順
<img width="800" alt="スクリーンショット 2018-10-13 14.56.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/240280/ea642a8a-7d08-6be5-db9f-6e480faacd1e.png">

## 具体的な作り方
バージョンによって、表示が少し異なるため、より近いバージョンのテキストをご利用くださいm(_ _)m

- [v2017.3.1f1](https://www.umi-mori.jp/article/unity/unity_start_17.php)

# 最後に
最後まで読んでくださり、ありがとうございました！
いかがだったでしょうか？

この記事を通して、少しでもあなたの学びに役立てば幸いです！

:::note info
【仕事の相談はこちら】
お仕事の相談のある方は、下記のフォームよりお気軽にご相談ください。

[問い合わせフォームはこちら](https://forms.gle/G5g1SJ7BBZw7oXYA7)

もしもメールでの問い合わせの方がよろしければ、下記のメールアドレスへご連絡ください。

info*galirage.com（*を@に変えてご送付ください）

🎁 「生成AI活用の無料相談券」もしくは「生成AIの社内ガイドライン（無料PDF）」を『公式LINE』で配布中 🎁
『生成AIを業務に活用したいけど、どうしたらいいかわからない』といった声を多くいただきます。

Galirageでは公式LINEにて、チャットやオンライン会議で「完全個別の生成AI活用無料相談会」を実施しております！
（期間限定で実施しているため、ご興味ある方はお早めに以下のLINE公式アカウントをご登録ください^^）
https://lin.ee/rvz6lMN

※ 予告なく、キャンペーンを終了する可能性がございますが、ご了承ください。

【業務内容】
具体的には、以下のお仕事を中心に受け付けております！（[詳しくはこちら](https://galirage.notion.site/Galirage-AI-c2f3945fafb0433d8d2fd03e56927fd8)）
1. 受託開発（例：生成AIを使った社内システムの開発）
2. コンサルティング（例：技術戦略のアドバイス）
3. 講演（例：社内研修、イベント登壇）

※ 特に「生成AIを使ったシステム開発のご依頼」が多く、ご好評いただいております。

【これまでの相談事例】
以下のようなご相談が多くあります。

🔑 機密情報を漏洩させないための、生成AIのシステム構築をお願いしたい。
🤖 自社データを用いたFAQチャットボットの作り方を知りたい。
💡 ChatGPTを、自分たちの事業にどのように活かせるか、アドバイスやアイデアが欲しい。
:::
# おまけ
エンジニアの仲間（データサイエンティストも含む）を増やしたいため、公式LINEを始めました🎉

「**一緒に仕事をしてくれる方**」「**友だちとして仲良くしてくれる方**」は、友だち追加をしていただけますと嬉しいです！（仲良くなった人たちを集めて、「ボードゲーム会」や「ハッカソン」や「もくもく会」もやりたいなと考えています😆）

とはいえ、みなさんにもメリットがないと申し訳ないので、特典を用意しました！

友だち追加後に、アンケートに回答してくれた方へ「**エンジニア図鑑（職種20選）**」のPDFをお送りします◎

https://lin.ee/hFUN4TL

[![](https://www.umi-mori.jp/wp-content/uploads/2023/10/line_banner_v2.png)](https://lin.ee/hFUN4TL)
NATルーターの作り方

おうちのNATルーターをFreeBSDで設定して使っているので、その設定について書いてみたいと思います。

以下をポリシーとしています。

* 最低限の機能しか持たせない
* 複雑なことはしない
* インターネット側ではLISTENしない
* 必要なサービスは内側のインターフェーでLISTENする
* インターネット側からのポートフォワードはしない

必要な機能は以下になります。

1. ISPからDHCPでIPアドレスとデフォルトルートとDNSをもらう
2. DHCPでもらったDNSにフォワードするサーバを上げる
3. 内側のクライアントのDHCPに答える
4. 内から外のNATを行う

![NAT_Router.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/b26025f3-aa7c-b6da-d855-97942af9631e.png)

使用する機器は二つのネットワークインターフェースがあるのが望ましいですが、[VLAN(with etherswitch)](https://qiita.com/yamori813/items/721eeea2af4b5b1f13f4)を使って二つのネットワークを設定して利用することもできます。

1番はdhclientを使います。dhclientは外側のインターフェースで立ち上げます。

2番はlocal-unboundを使います。dhclientのアドレス取得時のスクリプトで、フォワード先を設定ファイルに書き入れます。([メモ](https://qiita.com/yamori813/items/07ce0bf05208f93a729d))

3番はportsで入れられるdnsmasqを使います。dnsmasqはisc-dhcpくらべ設定が簡単なようです。dnsmasqはdnsの機能もありますが、dnsはunboundを使うのでdhcpだけで使います。

4番はカーネルのipfwを使っています。カーネルのpfでもできますしプロセスのnatdでもできるようです。12-STABLEで設定していたら動かなくて調べてみたらカーネルオプションのIPFIREWALL_DEFAULT_TO_ACCEPTが必要でした。

状態確認のために内側からだけtelnetで入れるようにしてあります。これはinetdのLISTENを内側だけにしています。

設定変えた時などは、netstatで確認して、ダブルチェックでポートスキャンサイトを使って変なポートが開いてないか確認してます。

パフォーマンスはスピードチェックのサイトを使って確認しいます。うちは遅い契約なので、ルーターがボトルネックにならずに契約スピードが出ています。

12-CURRENTの時期はipfwの調子が悪くて、11-STABLEを使っていたのですが、12-ALPHAになったので試してみたらちゃんと動くようになっていました。

ZRouterで設定をvendorディレクトリに入れてビルドしています。NATルーターが動作不良になると、原因を調べるにも事欠くので、同じ機種を2つ用意して、ロールバックできるようにひとつ前を残して焼きなおすようにしています。

20年以上前にFreeBSD 2.2で同じようなことをしていました。当時はdelegateを使っていました。OMRONを辞めたときにもう二度とBSDを使うことはないだろうと思っていたのが、またBSDを使うことができて嬉しかった記憶があります。

おまけ

ISPの接続がちゃんとできているかどうかを確認するために1分おきに下記のスクリプトを実行するようにしてみました。

```sh
#!/bin/sh

ROUTE=`netstat -rn | awk '/default/{print $2}'`

if [ -n "$ROUTE" ]; then

ping -c 1 ${ROUTE} >> /dev/null

if [ $? == 0 ]; then
gpioctl 18 0 
else
gpioctl 18 1
fi

else
gpioctl 18 1
fi
```

ISPへの疎通が無くなるとLEDが消えます。(このモジュールでは1でLEDが消えて、0で点灯します)

追記：消えてもあまり気づきにくいので、疎通がなく無くなると赤のLEDが点灯するような方法が良いと思います。

おまけ２

ポートフォワードは通常は行わないのですがVPNで外から入って何かしたい場合は、中にある[VPNサーバ](https://qiita.com/yamori813/items/e90727c5db56f9cc9294)に一時的にポートフォワードしてます。NATサーバとVPNサーバを同じところで動かすことは能力的には可能ですが、設定が複雑になるので別にしています。

おまけ３

こんな感じで実験用のサブネットをUSB Ethernetモジュールで設定してみました。

![NAT3PORT.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/566489bc-ebf9-2ee7-eac6-86359359c72d.png)

IIJのSEIL/X4も3ポートのようです。

デフォルトルートがこのモジュールになっていればarge0とue0の間はつうつうになりますが、もしDMZのような設定で分離したい時にはipfwなどで設定すると良いと思います。

ue0のip addressはインターフェースの認識が後の方になるのでrc.dのpoststartで設定する必要がありました。

Atheros(MIPS 24K)の無線ルータを有線だけで使っています。ファーンもなくてうるさくなく快適です。一般ご家庭で消費電力の大きいx86をルータとして使うのは愚行ではないかと思います。
CharacterController.IsGroundedの判定を楽に誤魔化す

ゲーム作ってる最中、坂を移動するときになんかおかしくなるな～と思って調べていたらCharacterController.IsGroundedの判定の精度がちょっとイマイチな事を知ったので、誤魔化した方法を書いていきます。

自分がやった方法としてはこんな感じです

```C#:PlayerController.cs
using UnityEngine;

public class PlayerController : MonoBehaviour {

CharacterController  charactercontroller;
float groundtime;
bool isgrounded;
void Start(){ charactercontroller = GetComponent<CharacterController>();}
void Update()
{
   if (charactercontroller.isGrounded)
        {
             
            groundtime = 0.0f;
            isgrounded = true;
        }
        else
        {
            groundtime += Time.deltaTime;
            if (groundtime >= 0.5f)
            { isgrounded = false; }
        }  
}
}
```

CharactercontrollerのisGroundedがもし0.5秒以上falseならisgroundedをfalseにする...的な感じにしてみました。
[【Unity】CharacterController IsGrounded の判定を改善する](https://qiita.com/toRisouP/items/9141f1bbc6f623db5fdd)

ぐぐったらこの方の記事が出てきたんですが、Raycast飛ばすのも重そうだしUniRXもわからないしなあ..って思ったので考えてみました。
【最終章】HTMLのcanvasとJavaScriptでお絵かきアプリを作る【線の太さ変更・太さインジケーター実装編】

お絵かきアプリ実装の最終章となります。

今回の記事は以下の1, 2と順番に実装してきた内容を元に作成しています。

1. [【初心者向け】HTMLのcanvasとJavaScriptでお絵かきアプリ作る【最低限の機能実装編】](https://qiita.com/tsuyopon_xyz/items/41ca2674afb8a6af0db7)
2. [HTMLのcanvasとJavaScriptでお絵かきアプリ作る【カラーパレット・消しゴム機能追加編】](https://qiita.com/tsuyopon_xyz/items/1df124d4ecec69bd4fff)

## 完成形

完成形は以下の画像のとおりです。

![draw-with-showing-indicator.gif](https://qiita-image-store.s3.amazonaws.com/0/289248/97ff59cd-aa90-f6db-5eed-e520cf2dc743.gif)

## レポジトリと、公開しているアプリ

- [レポジトリ](https://github.com/tsuyopon-xyz/drawing_app_part3)
- [公開しているお絵かきアプリ(パソコンでのみ動作可)](https://tsuyopon-xyz.github.io/drawing_app_part3/)

## 実装内容の解説

今回実装したアプリケーションの解説は「[HTMLのcanvasとJavaScriptでお絵かきアプリ【線の太さ機能編】](https://tsuyopon.xyz/2018/09/16/how-to-create-drawing-app-part3/)」に記述しています。

太さインジケーターの実装方法や、2枚のcanvasを重ねるテクニックについて解説しているので、興味を持たれた方は参考にしていただけたらと思います。

- [HTMLのcanvasとJavaScriptでお絵かきアプリ【線の太さ機能編】](https://tsuyopon.xyz/2018/09/16/how-to-create-drawing-app-part3/)
CoreGraphicsとCoreAnimationの役割

# CoreGraphics
Quartz技術(Apple提供の描画エンジン)を使った**描画のためのフレームワーク**

# CoreAnimation
Core Animation自体は、**描画テクノロジーではない。**
作成したコンテンツを操作したり、表示したりするためのテクノロジー。

# 参考

https://ja.wikipedia.org/wiki/Quartz

https://developer.apple.com/documentation/coregraphics

https://developer.apple.com/jp/documentation/DrawingPrintingiOS.pdf
React基本(リストの表示)

+ 概要
+ 解説
+ 補足

***

#概要
配列のようにデータを格納して表示することができます
https://qiita.com/tomi_shinwatec/items/cdd319d8fce8bdb829d0

```
import React, { Component } from 'react';
import logo from './logo.svg';
import './App.css';

class ListComponent extends React.Component {
  constructor(props,context){
      super(props,context)
      this.state = { items : [
          { value : 'apple' },
          { value : 'orange' },
          { value : 'banana' },
      ]}
  }
  RenderItems(){
      return this.state.items.map(_item => {
          return(
              <li>{_item.value}</li>
          )
      })
  }
  render(){
      return(
      <div>
          <ul>
          {this.RenderItems()}
          </ul>
      </div>
      )
  }
}

export default ListComponent;


```


#解説

###データ格納
複数のデータをループで入れられる。
`items`は何でも良い

```
  this.state = { items : [
          { value : 'apple' },
          { value : 'orange' },
          { value : 'banana' },
  ]}
```

###リストとキー
[自動]

```
 return this.state.items.map(key => {
          return(
              <li>{key.value}</li>
          )
      })
```

`map（）`によって関数を使用して数値の配列をとる
`items`を`key`として`value`を掃き出す
key名はなんでもいい


[手動の場合]

```
return(
        <ul>
            <li>{this.state.items[0].value}</li>
            <li>{this.state.items[1].value}</li>
            <li>{this.state.items[2].value}</li>
       </ul>
       );
```
`return`内には何かのタグで囲まないとエラーになるので`ul`で囲んでいます。
配列構造は普通のjavascriptと同じように使えます。


#補足
###データを書き換えたい時
```
constructor(props,context){
      super(props,context)
      this.state = { items : [
          { value : 'apple' },
          { value : 'orange' },
          { value : 'banana' },
      ]}
    

      this.state.items[1].value = 'grapes';
  }
```
これで2番目の`orange`が`grapes`に変更される
High SierraのModifier Keys設定はどこに格納されるか

Caps Lock不要派のみなさんこんにちは。
よくこういう設定しますよね。
<img width="780" alt="Screen Shot 2018-09-19 at 20.13.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/9676/5ac326a5-bc2b-b7f3-f342-3b567a4bc94f.png">

どこに設定されるのか調べたメモです。
OSバージョンはHigh Sierraです。

```shellsession
$ uname -sr
Darwin 17.7.0
```

未設定。

```shellsession
$ plutil -p ~/Library/Preferences/ByHost/.GlobalPreferences.*.plist
{
  "com.apple.mouse.tapBehavior" => 1
  "com.apple.trackpad.enableSecondaryClick" => 1
  "com.apple.trackpad.fiveFingerPinchSwipeGesture" => 2
  "com.apple.trackpad.fourFingerHorizSwipeGesture" => 2
  "com.apple.trackpad.fourFingerPinchSwipeGesture" => 2
  "com.apple.trackpad.fourFingerVertSwipeGesture" => 2
  "com.apple.trackpad.momentumScroll" => 1
  "com.apple.trackpad.pinchGesture" => 1
  "com.apple.trackpad.rotateGesture" => 1
  "com.apple.trackpad.scrollBehavior" => 2
  "com.apple.trackpad.threeFingerDragGesture" => 0
  "com.apple.trackpad.threeFingerHorizSwipeGesture" => 2
  "com.apple.trackpad.threeFingerTapGesture" => 0
  "com.apple.trackpad.threeFingerVertSwipeGesture" => 2
  "com.apple.trackpad.twoFingerDoubleTapGesture" => 1
  "com.apple.trackpad.twoFingerFromRightEdgeSwipeGesture" => 3
  "com.apple.trackpad.version" => 5
}
```

設定済み

```shellsession
$ plutil -p ~/Library/Preferences/ByHost/.GlobalPreferences.*.plist
{
  "com.apple.ColorSync.Devices" => {
  }
  "com.apple.keyboard.modifiermapping.1452-631-0" => [
    0 => {
      "HIDKeyboardModifierMappingDst" => 30064771300
      "HIDKeyboardModifierMappingSrc" => 30064771129
    }
  ]
  "com.apple.mouse.tapBehavior" => 1
  "com.apple.trackpad.enableSecondaryClick" => 1
  "com.apple.trackpad.fiveFingerPinchSwipeGesture" => 2
  "com.apple.trackpad.fourFingerHorizSwipeGesture" => 2
  "com.apple.trackpad.fourFingerPinchSwipeGesture" => 2
  "com.apple.trackpad.fourFingerVertSwipeGesture" => 2
  "com.apple.trackpad.momentumScroll" => 1
  "com.apple.trackpad.pinchGesture" => 1
  "com.apple.trackpad.rotateGesture" => 1
  "com.apple.trackpad.scrollBehavior" => 2
  "com.apple.trackpad.threeFingerDragGesture" => 1
  "com.apple.trackpad.threeFingerHorizSwipeGesture" => 0
  "com.apple.trackpad.threeFingerTapGesture" => 0
  "com.apple.trackpad.threeFingerVertSwipeGesture" => 0
  "com.apple.trackpad.twoFingerDoubleTapGesture" => 1
  "com.apple.trackpad.twoFingerFromRightEdgeSwipeGesture" => 3
  "com.apple.trackpad.version" => 5
}
```
React基本(入れ子のコンポーネント)

+ 概要
+ 解説

***

#概要
>
HTMLテンプレートのように、外枠となる部分を共通コンポーネントとして用意したい場合は下記のような記述で書けます。
https://qiita.com/tomi_shinwatec/items/cdd319d8fce8bdb829d0

```
import React, { Component } from 'react';
import logo from './logo.svg';
import './App.css';

// テンプレートとなるコンポーネント
class TemplateComponent extends React.Component {
  render() {
    return (
      <main>
        <header>
          <h2>{this.props.title}</h2>
        </header>
        <div>
          {this.props.children}
        </div>
        <footer>
          <p>copyright company</p>
        </footer>
      </main>
    )
  }
}

// コンテンツとなるコンポーネント
class ChildComponent extends React.Component {
  render() {
    return (
      <p>コンテンツテキストです。</p>
    )
  }
}

// 基本レイアウトコンポーネント
class MainComponent extends React.Component {
  render() {
    return (
      <section>
        <h1>Main Title</h1>
        <TemplateComponent title={'コンテンツタイトル'}>
          <ChildComponent />
        </TemplateComponent>
      </section>
    )
  }
}

export default MainComponent;

```


#解説
基本レイアウト>テンプレート>コンテンツというイメージ

###テンプレート
propsで変更できるようにする
基本外側だけのコンポーネント
`props.title`はあとあと入れる用、`props.childen`はコンテンツ用のコンポーネントを入れるためのもの

```
class TemplateComponent extends React.Component {
  render() {
    return (
      <main>
        <header>
          <h2>{this.props.title}</h2>
        </header>
        <div>
          {this.props.children}
        </div>
        <footer>
          <p>copyright company</p>
        </footer>
      </main>
    )
  }
}
```

###コンテンツ
`props.children`に入れるためのコンポーネント

```
class ChildComponent extends React.Component {
  render() {
    return (
      <p>コンテンツテキストです。</p>
    )
  }
}
```


###基本レイアウト
大枠となるためのコンポーネント
テンプレートコンポーネントはタグとして`<TemplateComponent></TemplateComponent>`のように表現できる
`childComponent`はそのままコンポーネントとして入れる

```
class MainComponent extends React.Component {
  render() {
    return (
      <section>
        <h1>Main Title</h1>
        <TemplateComponent title={'練習やで'}>
          <ChildComponent />
        </TemplateComponent>
      </section>
    )
  }
}
```
APT ( Advanced Package Tool ) について

以前から何の気なしに使っていた `apt` コマンド。
その外観を大まかに知ろうと調べた内容をまとめます。

# 1. APT とは
本記事のタイトルになっている [APT ( Advanced Package Tool )](https://ja.wikipedia.org/wiki/APT) とは、 Debian 用に開発されたパッケージ管理システムです。APT によってバイナリパッケージの依存関係の解消やアプリケーションのアップデート等が容易に行なえます。

APT はパッケージのダウンロードやインストールを行う際にリポジトリを参照しますが、公式なリポジトリはファイル`/etc/apt/sources.list`に、非公式なリポジトリはディレクトリ`/etc/apt/sources.list.d`直下に格納されます。リポジトリについて、詳しくは [`3. apt-line について`](#3-apt-line-について)で触れます。

APT を利用するためのツールとして、`apt` や `apt-get` 、`aptitude` 等が用意されていますが、以下でその違いについて触れます。

# 2. apt コマンド
Ubuntu でパッケージのインストールについて調べていると `apt` 以外にも `apt-get` や `aptitude`といったコマンドに出会った経験があるかと思います。

`apt` コマンドが登場したのは2014年4月1日にリリースされた apt 1.0 からであり、それ以前のバージョンでは、パッケージインストール等には `apt-get` 、パッケージ検索等には `apt-cache` が使われていました。apt 1.0 から登場した `apt` コマンドは、大まかには `apt-get` と `apt-cache` の機能を併せ持ったコマンドです。Debian 管理者ハンドブックを見てみると `apt` は `apt-get` が持っていた設計上のミスを克服しているそうで、Ubuntu 14.04 からは `apt` コマンドが推奨されているようです。

上述の `apt` 及び `apt-get/cache` は CUI で APT を使用するツールですが、`aptitude` は CUI だけでなく TUI でも APT を使用できます。CUI が苦手な人でも使えるよう開発されたのでしょうが、Ubuntu 16.04 からデフォルトでインストールされなくなったようです。

`apt` コマンドの用法に関しては以下の記事に詳しく載っています。

* [「apt-get」はもう古い？新しい「apt」コマンドを使ったUbuntuのパッケージ管理](https://linuxfan.info/package-management-ubuntu)
* [aptコマンドチートシート](https://qiita.com/SUZUKI_Masaya/items/1fd9489e631c78e5b007)

因みに、`apt` 、`apt-get` 、`aptitude` にはジョークコマンドが用意されているようですね。

* [スーパー牛さんパワー！-ぬいぐるみライフ？](https://mickey24.hatenablog.com/entry/20080808/1218161057)

試しに、次のコマンドを実行してみてください。気晴らしになるでしょうか。

```bash
$ apt moo; apt moo moo; apt moo moo moo
```

# 3. apt-line について
apt-line とはファイル `/etc/apt/sources.list` やディレクトリ `/etc/apt/sources.list.d` 直下のファイルに記されている次のような風体の行のことです。

```bash
deb http://us.archive.ubuntu.com/ubuntu xenial main restricted
```
[`1. APT とは`](#1-apt-とは)で触れたように、APT はパッケージのインストールや更新時にリポジトリを参照しますが、そのリポジトリの設定文 ( 1行スタイル ) が apt-line ( 俗称? ) です。

前述の設定文を deb822 スタイルで表記すると次のようになります。

```bash
Types: deb
URIs: http://us.archive.ubuntu.com/ubuntu
Suites: xenial
Components: main restricted
```
Types はパッケージの形式、URIs はリポジトリの場所を表します。通常、Suits には codename やバージョン名を、Components には main 、contrib 、non-free のどれかを記述します。因みに、1行スタイルの設定文は拡張子が`.list`のファイルに書き込みますが、deb822スタイルの設定文は拡張子が`.sources`のファイルに書き込む必要があります。

リポジトリの設定について、詳しくは次のコマンドで確認することが出来ます。

```bash
$ man sources.list
```

#参考文献
* [Apt-Devian Wiki](https://wiki.debian.org/Apt)
* [apt 1.0 | Michael Vogt's blog](https://mvogt.wordpress.com/2014/04/04/apt-1-0/)
* [第327回　aptコマンドを使ってみよう](https://gihyo.jp/admin/serial/01/ubuntu-recipe/0327?page=1)
* [Ubuntuにおけるapt , apt-get , aptitude の違いとは?](http://zaka-think.com/linux/ubuntu/ubuntu-apt-apt-get-aptitude/)
* [Repository-なんなんなん行く？](https://sites.google.com/site/teyasn001/ubuntu-12-10/ripojitori)
ファイルコピー

ないよりましなので書きました。

net use Z: \\user-PC\test 1111 /user:user-PC\user

cd %USERPROFILE%\desktop
xcopy /s/c/e/h/y * Z:\%COMPUTERNAME%\desktop\
cd %USERPROFILE%\Favorites
xcopy /s/c/e/h/y * Z:\%COMPUTERNAME%\Favorites\
cd %USERPROFILE%\Documents
xcopy /s/c/e/h/y * Z:\%COMPUTERNAME%\Documents\
cd %USERPROFILE%\Pictures
xcopy /s/c/e/h/y * Z:\%COMPUTERNAME%\Pictures\
cd %USERPROFILE%\Downloads
xcopy /s/c/e/h/y * Z:\%COMPUTERNAME%\Downloads\
atcoderのグラフ理論入門

AtcoderのABCレベルのグラフ問題について調べることがあったのでまとめます。

# ABCで出るグラフ問題
ABCの問題をざっと見ていったところ、以下のような問題が多いです。
### 最短経路問題
重みを持つ辺が出てきて、点に向かう最小コストを探索します。
基本的にはダイクストラ法で解けて、たまにベルマンフォード法が必要になります。
単一始点最短経路問題に帰着することで時間内に解けるような問題が頻繁に出るので、出来ると良いかもしれません。
以下典型っぽい問題です。

* [ABC035D トレジャーハント](https://abc035.contest.atcoder.jp/tasks/abc035_d)

ダイクストラで単一始点最短経路問題に帰着します。

* [ABC051D Candidates of No Shortest Paths](https://abc051.contest.atcoder.jp/tasks/abc051_d)

ダイクストラでも解けますし、ワーシャるフロイドを使っても解けます。最小コストだけでなく経路を使う問題です。

* [ABC061 D Score Attack](https://abc061.contest.atcoder.jp/tasks/abc061_d)

ベルマンフォードを使う問題です。

### 深さ優先探索、幅優先探索する問題
与えられたグラフを深さ優先探索や幅優先探索で探索する問題です。
組み合わせなど外の分野の問題と複合的に出ることも多いです。
以下典型っぽい問題です。

* [ABC036D 塗り絵](https://abc036.contest.atcoder.jp/tasks/abc036_d)

実態は木構造です。TreeDPと言われる解放を取ります。

* [ABC054C　One-stroke Path](https://abc054.contest.atcoder.jp/tasks/abc054_c)

接続性を探索で調べます。


グラフ問題は難しい問題も多いですが、マラソンや現実の問題にも応用しやすいので基礎は抑えておいて損はなさそうですね！
Ansible GalaxyのRoleに対するネーミングルールが変更になってた


Ansible Galaxyでのワークフローは、"ansible-role_name"で始まるリポジトリをGithubに登録し、Ansible Galaxy側で"ansible-"を取り除いた"role_name"を名前として登録する流れになっていました。

しばらくぶりにAnsible GalaxyにRoleを登録したところ、このネーミングルールが撤廃されてとまどったのでメモを残しておきます。

# 参考資料

* [公式Ansible Galaxyドキュメント - Role Metadata](https://galaxy.ansible.com/docs/contributing/creating_role.html#role-metadata)

# 解決方法

参考資料のドキュメントの先頭にあるように、"role_name"という項目が```meta/main.yml```に追加されています。

Optionalに分類されていますが、Githubのリポジトリ名がそのまま反映される事には違和感がありますし、従来のネーミングルールはとても良くできていたので事実上は必須ではないかなと思います。

改めてmeta/main.ymlを編集し、```$ git commit -m 'comment' && git push```をしておきました。

```markdown:meta/main.yml
galaxy_info:
  role_name: foo
  author: your name
```

Github上では"ansible-"で始まるリポジトリが、Ansible Galaxy関連のものだと分かりやすいので、このルール自体は撤廃されても自主的に守った方が良さそうです。

# 【閑話休題】Ansible Galaxyのすゝめ

何かしら前提はあったとしても、汎用的に設定が変更できるような、変数と処理フローが分離しているansible roleを作成した場合には、Ansible Galaxyに追加することを検討してみてください。

基本的なワークフローは、次のようなものです。
1. ```$ ansible-galaxy init <role name>``` で雛形roleディレクトリを作成
2. tasks/main.yml, defaults/main.yml などにファイルを配置し、roleを作成する
3. README.md ファイルを編集する
4. meta/main.yml を編集する
5. Githubに適当なディレクトリを作成し、commit & push する
6. Ansible GalaxyにGithub連携でログインし、追加

慣れないと余計なREADME.mdやmeta/main.ymlを記述するのが面倒そうですが、制約事項などはきちんと書くとして、自分が以前作ったファイルを元にするなどして、いくらか工程は省略できます。

Ansible Galaxyに登録されているRole自体は、羃等性に対する検討があまりされておらず、そのままでは使いずらいものがよくあります。
私自身もそんなRoleを登録していると思います。

しかし、そのまま使えずとも貴重な参考資料になることは間違いありません。
自分の成果を残す事は、自分の作業ログを残す事、コミュニティへの貢献という点でも、大切です。

公開すると叩かれる燃料を投下するだけという印象を持つようですが、叩くだけのような悪い人の事は気にせずに、足跡を残して実績を積み上げて欲しいなと思っています。
Drupal8 ドメイン変更で混乱した備忘

#The provided host name is not valid for this server.
![スクリーンショット 2018-09-19 19.18.05.png](https://qiita-image-store.s3.amazonaws.com/0/165099/0fca9c2d-b0f2-7cf9-14ed-25c613ee3e49.png)
この画面。

#ドキュメント通り設定したのに…
https://www.drupal.org/docs/8/install/trusted-host-settings
こちらにある通り、config.phpを書き換えましたが、どうもみてくれないようでした。



#ゴリ押し
```drupal-8.5.5/core/lib/Drupal/Core/DrupalKernel.php
  protected function initializeSettings(Request $request) {
    $site_path = static::findSitePath($request);
    $this->setSitePath($site_path);
    $class_loader_class = get_class($this->classLoader);
    Settings::initialize($this->root, $site_path, $this->classLoader);

    // Initialize our list of trusted HTTP Host headers to protect against
    // header attacks.
    $host_patterns = Settings::get('trusted_host_patterns', []);
    # ホワイトリスト追加 START
    $host_patterns[] = '^www\.example\.com$';
    $host_patterns[] = '^example\.com$';
    # ホワイトリスト追加 END
    if (PHP_SAPI !== 'cli' && !empty($host_patterns)) {
      if (static::setupTrustedHosts($request, $host_patterns) === FALSE) {
        throw new BadRequestHttpException('The provided host name is not valid for this server.');
      }
    }
```

下記の部分です

```DrupalKernel.php
    # ホワイトリスト追加 START
    $host_patterns[] = '^www\.example\.com$';
    $host_patterns[] = '^example\.com$';
    # ホワイトリスト追加 END
```

Drupal8詳しい人いたら教えてください…
ググっても答えが見つかりませんでした。config.phpを読まないという。
はじめてなElixir(8) プログラミング環境を整える

今回はプログラミング環境を整えます。
なんか先週末頑張りすぎたせいか前頭葉が痛いような気がしますし、楽に楽に…
なお、繰り返しますが、私自身、初学者です。良い子は真似してはいけません。

# これまでの環境
私は 11インチの MacBook Air (MacOS 10.13.6) を使ってます。これ、フライトなんかで前の方がリクライニングをガッツリしてきたときにぶつからない大きさなんで重宝してます。でも、いまは売ってないんですよね… 11インチの MBA は。

さすがにこれだけだと画面小さくて苦しいので、自宅と職場には Cinema Display を置いて、でかい画面で作業してます。「プログラミングElixir」は書籍と Kindle 版と両方購入してまして、kindle 版は移動中にも使えるようにと買ったのですが、kindle で読むと字が小さすぎてつらすぎです。結局 Cinema display で読んでます。紙媒体だけで良かったような。

Cinema display ででっかく開いた kindle 版プログラミングElixirの脇に、小さなターミナルを置いて vi をあげてプログラムを書いてます。んで、別ターミナルで iex してます。が、vi で素手でプログラム書いているとどうにも大変なので、もう少しマシにしようと思います。ちなみに vi と思っても vim なんですよね。

```
$ ls -l /usr/bin/vi
lrwxr-xr-x  1 root  wheel  3 Nov 23  2017 /usr/bin/vi -> vim
```

# Emacs で環境を整える（どうも失敗したっぽい）
普段は主に Emacs で読み書きしてるので（メールは mew.el）ここで elixir できると嬉しいです。
M-x package-install
で elixir-mode が入るといろんな記事に出てますが、package は見つかりません。alchemist も出てきません。記事はどれも2016年ごろの話で、Emacs の古いバージョン（23ぐらい？）を指してて、どうもメンテナンスがなされてないんじゃないか状態。brew で突っ込んだ Emacs (ver. 26)が悪いのかと、別のパッケージも試しましたけど、そこが原因ではなさそう。

しょうがないので単体の elixir-mode と alchemist を引いてきてインストールすると .ex ファイルは文法に従って色づいたけど、auto-completion が効かない。自分の init.el も大概いじってるし古い怪しいのも引きずってるので、なんかいろんな環境がコンフリクト起こしているかも。すぐに解決できないので、とりあえず放置な気分です。

当面 emacs で編集して、ターミナルで iex する形態でまずは我慢することにしたけど、時間のあるときにきちんとしないと効率悪くていかんなぁ… というところに落ち着きかけました。

# atom を使う
しかし、いくらなんでも今どきは何かの統合プログラミング環境があるだろう、ちょっと前は Eclipse とか聞いたよな、とか思い、知り合いの @nishiuchikazuma さんに聞くと「atom ってのを使ってます」とのこと。こういうときは一旦完全に環境をパクってしまって、使い慣れてきたら我が道を行くようにするほうが早そうです。

ちなみに google で検索すると
- elixir atom:    7,290,000 件
- elixir eclipse: 3,030,000 件
という結果でした。

## atom で環境設定
まず [atom](https://atom.io) 本体をダウンロードしてインストールします。これを立ち上げて package をインストールします。Elixir まわりだけでもいくつもありまして、そこは language-elixir というのを勧めてもらったのでそれを入れました。

なお auto-complete-elixir ってのもあって、合わせて入れるとコマンドの衝突が起こったので前者だけにしました。この他、Elixir とは直接関係ないのをオススメに従っていくつも入れてます。

テーマを選ぶと自分風の雰囲気の atom にできるそうです。まだ、my atom にはしてません。

# 参考文献

[Elixir入門　～12日目 eclipseでerlangのデバッグ環境を作る～](http://mcommit.hatenadiary.com/entry/2017/10/24/013425)

# 難参考文献
[はじめてなElixir(7)](https://qiita.com/kikuyuta/items/6d61b907d2cd1ce3aeea)
Xcode,Swiftのバイナリ互換性

2019/03/26

Xcode10.2とSwift5がリリースされ、以降はバイナリ互換性がとられるはずなので、以下の内容は古い内容となっています。関係者の方々、ありがとうございます。

https://swift.org/blog/swift-5-released/

---
以下古い内容

2018/10現在、Swiftのライブラリ、実行ファイルのバイナリはバージョン間の互換性が保証されておりません。ABI安定化がSwift5でということなので、もう少しの辛抱です。

参考: https://github.com/apple/swift/blob/master/docs/ABIStabilityManifesto.md
参考: https://swift.org/abi-stability/

とはいえ、現状どのXcodeバージョン間で互換性があるのかはっきりした情報が見つからず、ライブラリなんかを提供しているとあいまいで困るので調べてまとめました。

次の表の行と列は

- ビルドする側のswiftバージョン
- リンクしようとしたライブラリをビルドした側のswiftのバージョン

の組み合わせで、ビルドできる(OK)、ビルドエラー(NG)を書き出したものです。

|  Xcode     | swift | 3.1 | 4.0 | 4.0.2 | 4.0.3 | 4.1 | 4.1.2 | 4.2 | 4.2.1 | 5.0 |
|------------|:-----:|:---:|:---:|:-----:|:-----:|:---:|:-----:|:---:|:-----:|:---:|
| 8.3.3      | 3.1   | OK  | NG  |  NG   |  NG   | NG  |  NG   | NG  |  NG   | NG  |
| 9.0, 9.0.1 | 4.0   | NG  | OK  |  NG   |  NG   | NG  |  NG   | NG  |  NG   | NG  |
| 9.1        | 4.0.2 | NG  | NG  |  OK   |  OK   | NG  |  NG   | NG  |  NG   | NG  |
| 9.2        | 4.0.3 | NG  | NG  |  OK   |  OK   | NG  |  NG   | NG  |  NG   | NG  |
| 9.3, 9.3.1 | 4.1   | NG  | NG  |  NG   |  NG   | OK  |  OK   | NG  |  NG   | NG  |
| 9.4, 9.4.1 | 4.1.2 | NG  | NG  |  NG   |  NG   | OK  |  OK   | NG  |  NG   | NG  |
| 10.0       | 4.2   | NG  | NG  |  NG   |  NG   | NG  |  NG   | OK  |  OK   | NG  |
| 10.1       | 4.2.1 | NG  | NG  |  NG   |  NG   | NG  |  NG   | OK  |  OK   | NG  |
| 10.2       | 5.0   | NG  | NG  |  NG   |  NG   | NG  |  NG   | NG  |  NG   | OK  |

# まとめ

つまり、3.1から4.2.1の間では、以下のことが言えます。

- swift4.0とswift4.0.1, swift4.0.2の間は互換性がない
- それ以外は、swiftのメジャー、マイナーバージョンが同じであれば互換性がある。
- 上位互換のような、片方向の互換性がある組み合わせはない。
    - 例えば「x.0のバイナリはx.1でリンクできるが、逆はできない」のようなことは**ない**

# 補足

## バイナリ互換性がないと何が起きるか

バイナリの互換性がないframeworkなどをリンクしようとすると、次のようなエラーが出ます。

```bash

$ swiftc ../main.swift -I . -L . -llucky
../main.swift:1:8: error: module compiled with Swift 4.0 cannot be imported in Swift 4.1.2: /Users/gamako/Documents/work/sst/project/sdk/swift-version-check/build.9.0/./lucky.swiftmodule
import lucky

```

## ライブラリのswiftバージョンの確認方法

ライブラリフレームワークをビルドしたときのSwiftのバージョンは、`xxx.swiftmodule`ファイルには文字列として入っているようなので、次の方法で強引に取得することができるようです。

```bash
$ strings arm64.swiftmodule  | grep "Swift version"
4.1(4.1)/Apple Swift version 4.1 (swiftlang-902.0.48 clang-902.0.37.1)

```
## ソースコードの互換性

バイナリの互換性と、ソースコードの互換性は別の話題です。swift4.2のコンパイラは、swift3.1書式のソースコードをコンパイルすることができます。ただし、この場合swift4.2形式でバイナリを出力するため、swift3.1でリンクすることはできません。

# link

調べるのに使ったソースコード
https://github.com/gamako/swift-binary-compatibility-matrix
ionic で*ngForが動作しなかった時の対処法

初めてionicを使ってアプリ開発を行なっているのだが、`*ngFor`が動作せずにつまずいたことがあったので、メモがてら残しておく。

#動作環境

- macOS HighSierra 10.13.6
- ionic 4.1.2
- npm 6.4.1
- Node v10.10.0

##備考
ただのメモなのでionicのインストール等は記載しませんので、ご了承ください。
[ionicのサイトはこちら](https://ionicframework.com/)

#やろうとしたこと
ページの中にある機能を別のコンポーネントファイルに分けることで、コードをスッキリさせる！

まずは新しいコンポーネントを作成する。

```zsh:terminal
$ ionic g component hoge
```

続いて`app.module.ts`に下記を追加する。

```typescript:app.module.ts
import { ComponentsModule } from "../components/components.module";  ////←これを追加する

@NgModule({
  declarations: [...],
  imports: [
    ...
    ComponentsModule,  //←これを追加する
    ...
  ],
  bootstrap: [IonicApp],
  entryComponents: [... ],
  providers: [...]
})
```

それと呼び出したいページの`.ts`ファイルに下記を追加。

```typescript:index.ts
import { ComponentsModule } from "../../components/components.module";
```

作ったコンポーネントファイルのテンプレートはこんな感じ。

```html:hoge.html
<ion-list>
  <ion-card *ngFor="let card of cards">
    <ion-card-content>
      <ion-card-title>Hello World</ion-card-title>

      <p>The content for this card</p>
    </ion-card-content>
  </ion-card>
</ion-list>
```

```typescript:hoge.ts
export class HogeConponent {
  cards: Array<{title: string, note: string}>;

  constructor() {
    this.cards = [];
    for (let i = 1; i < 6; i++) {
      this.cards.push({
        title: 'title ' + i,
        note: 'test' + i,
      });
    }
  }

}

```

#今回発生した問題

ブラウザに表示された内容はこちら。
<img width="980" alt="ngFor.png" src="https://qiita-image-store.s3.amazonaws.com/0/200209/3a56def9-ff5a-3890-d5b0-dab5b4f0d04f.png">


```
Uncaught Error: Template parse errors:
Property binding ngForOf not used by any directive on an embedded template. Make sure that the property name is spelled correctly and all directives are listed in the "@NgModule.declarations". ("
```

直訳すると、ここで`*ngFor`なんて使えない（存在しない？）って怒られてるっぽいです。
なので既存のモジュールをインポートする必要があるそうなんですね...

ということでインポートしましょう。

```typescript:components.module.ts
import { CommonModule } from '@angular/common';

@NgModule({
	...
	imports: [CommonModule],
	...
})
```

これでなんとか動くようになりました！！
お疲れ様でした！！

#ちょっとした雑談
実は私AngularどころかJavaScriptですらほぼ初めて触るので、本当にわからないことだらけでこんな初歩的なことにつまづいてばかりです笑
ですがこれを通して技術力を上げれている気がするので、なんだかんだ毎日楽しんでます笑

#参考にした記事
[ANGULAR2: ERROR – CAN’T BIND TO ‘NGFOROF’ SINCE IT ISN’T A KNOWN PROPERTY](https://hassantariqblog.wordpress.com/2016/10/28/angular2-error-cant-bind-to-ngforof-since-it-isnt-a-known-property/)
Nim 最適化の方法と--optオプション (改訂版)

# 0 . 概要
前回、「Nimのベンチ&サイズの最適化と比較」だったか、そういう記事を書いていましたが、
あれはあんまりよい記事ではなかった(なんというか詳しくなかった)ので、再投稿という形で投稿します。
(前回の記事はもう消す予定です)

このページでは、

1 : 最適化の方法と--optオプションの使い方
2 : それぞれの効果と比較

を説明します。

# 1 . 最適化の方法と--optオプションの使い方

### 最適化

```console:Debug_Build
$ nim c <file>
```
普段よく使う、動作確認での使用が想定された一番手っ取り早いビルドです。
ビルドが非常に早いように設定されていますが、これではベンチマークもバイナリサイズもメモリ消費も最悪です。

これを最適化するには、

```console:Release_Build
$ nim c -d:release <file>
```

としましょう。
これが最も簡単な最適化です。
これでいつの日かブログのベンチマーク紹介ページで見た、あのNimの突っ走りが実現されます。
ただ、結果は最強なのですが、やはりビルド時間が Debug Build に比べ圧倒的に長いです。

### opt

続いて、--optオプションを加えて最適化を行います。
(使うときは必ずReleaseにするみたいです)

```console:Release+opt
$ nim c -d:release --opt:none <file>
$ nim c -d:release --opt:size <file>
$ nim c -d:release --opt:speed <file>
```

[Nim Compiler User Guide](https://nim-lang.org/docs/nimc.html) によると ( 僕には英語の読解力が殆どないので本当かどうか定かではありませんが ) 
どうやら「最適化を全く行わない ( none ) か、ベンチマーク優先の最適化 ( speed ) 、バイナリサイズ優先の最適化 ( size ) のどちらかを行う」みたいです。

# 2 . それぞれの効果と比較

さて、上記で紹介したいくつかの最適化方法を比較してみます。
評価は「ビルド時間」「ベンチマーク」「バイナリサイズ」の4点を比較して行いました。

(今回は比較のために、モジュールの再構築を行う `-f` オプションを使っています。)
### 比較用ソースコード
```nim
import times,math
var sins,coses,num : float64 = 0.0
let max = 10000000

let s = epochTime()

for i in 0..<max:
  num = float64(i)
  sins += num.sin
  coses+= num.cos
  
echo epochTime()-s
echo sins
echo coses
```

0~10000000(1000万)の数字の正弦&余弦を計算し、それぞれを足し合わせて出力するプログラムです。
( 正接はなんとなくオーバーフローが怖かった )
最初に出力された数値(実質的な計算時間)が小さいほど処理が早いといえます。

### 結果

|ビルドの方式|ビルド時間 ( sec )|計算時間 ( sec )|バイナリサイズ ( KB )|
|:-:|:-:|:-:|:-:|:-:|
|**Debug**|2.984|2.6712|594|
|**Release**|5.218|2.6713|215|
|**Release+none**|**2.671**|2.2338|200|
|**Release+size**|**2.767**|**1.9370**|**177**|
|**Release+speed**|5.249|**1.9527**|215|

```
nim c -f
(18943 lines compiled; 2.984 sec total; 37.039MiB peakmem; Debug Build)

2.671246767044067sec
594KB

--
nim c -d:release -f
(18943 lines compiled; 5.218 sec total; 26.121MiB peakmem; Release Build)

1.95266604423523sec
215KB

--
nim c -d:release --opt:none -f
(18943 lines compiled; 2.671 sec total; 26.078MiB peakmem; Release Build)

2.233848571777344sec
200KB

--
nim c -d:release --opt:size -f
(18943 lines compiled; 2.767 sec total; 29.969MiB peakmem; Release Build)

1.937044143676758sec
177KB

--
nim c -d:release --opt:speed -f
(18943 lines compiled; 5.249 sec total; 26.078MiB peakmem; Release Build)

1.95266318321228sec
215KB
```
### 見解
まず一言。
**Debug_Build ダメダメじゃん...** ビルド時間が圧倒的に早い、ってことじゃなかったのか..?

ビルド時間は**R+none**、**R+size**、**Debug**がリード。中でも最も早いのが上記2つ。
ほかの2つは5秒もかかってしまった。
[ 検証外ではありますが、2回目以降のコンパイルは**R+size**が圧倒的に早く、続いて**Debug**、**R+none**がリードしました。 ]


計算時間は**R+size**、**R+speed**が早いみたいです。**Release**だけではどうやら最強ではないみたい。
R+speed はベンチマークの最適化をするはずなんのに R+size と同値か...


バイナリサイズはやはり**R+size**が圧倒。Debug なかなか派手にやってる。

### 結果

とにかく、最適化するときは**--opt**を付けた方がいい。
動作確認するときも、**実は Debug よりも Release + opt のほうが効率的では？？**なんて単純に思ってしまう結果に。
Debug 涙目...



### 実行環境
OS : Windows 10 Home
CPU : Intel Core i5-8250U (1.60GHz,4コア)
RAM : 8GB (PC4-19200 DDR4 SDRAM)
ストレージ : SSD (PCIe NVMe/M.2)
Nim : 1.18.0

# 最後に
最近、何ヶ月ぶりかに某くそ辛いラーメンを食べました。
めちゃくちゃうまかったです。

しかし、そのあとプリンを食べたら、お腹壊してしまいました。
酷く辛い物を食べた後に、酷く甘いものは食べないようにしましょう。身体がびっくりします。

あ、プリンもおいしかったです。
lolipopでECCube4をインストールする時にphp7がデフォじゃなくて困った

超メモなので乱文失礼。

eccube側でそんな時の備えが用意されていたので一行の変更で済んだ。
やったこと。

# bin/consoleの一行目を以下に書き換える。

```
#!/usr/local/php7.1/bin/php
```

# インストール
```
bin/console eccube:install
```
ISUCON8に参加して予選通過してきました

先日、ISUCONに参加してきました。そして予選通過しました。
参加チームは学生でultra_fast_gopherです。(チーム名はslackのEmojiのultra_fast_parrotから<img src="https://cultofthepartyparrot.com/parrots/hd/ultrafastparrot.gif" width="25px">)
MOXという名前で参加しました。
今回でISUCONの参加は2回目です。前回は去年のISUCON7に参加しました。
自分以外のチームメイト二人は、初参加でした。去年はメンバーの都合上、社会人チームとして参加しました。
ところで、Qiitaはじめました。

## 事前準備
事前には1回ISUCON7の予選問題を解きましたが、そのときは自分は体調不良で参加できず・・・
使うものは事前に監視ツールとしてnetdataを決めていました。
4日前までどこで参加するかも決まっておらず、急いで新宿周辺の貸し会議室を借りました。(チームメイトが予約してくれました)

## 当日
朝、寝坊し9:30に新宿の貸し会議室待ち合わせだったのですが間に合いそう無く、特急ロマンスカー課金をし無事に9:30くらいに貸し会議室とは名ばかりのマンションの一室へ到着。チームメイトが一人は9:00くらいについており、また排水口が詰まったと言っていたチームメイトも程なくして到着。
まずはPC一式を広げ準備し、ネット環境は貸し会議室にあったポケットWi-Fiをへ接続。しかし、Pingが53msとSSHで作業するには厳しい感じの速度で、自前のポケットWi-Fiを使用。(こちらはPing20msくらいでまぁマシといった速度)

### 初動
最初にレギュレーションをざっと読み、チームメイトがSSH鍵の登録・Gitへ鍵の登録・ホスト名の変更などをやっていて、私は、netdataを各マシンにインストール。
問題を読んでいる際にチームメイトがNginxではなくh2oであるとの旨のことを言っており、自分はh2oを使ったことがないのでその周りは触れませんでした。
とりあえず何もしない状態でベンチを回したところ、fail。とりあえずなんとか動く状態にし、done。この時のスコアが1,500程度。また、このときに去年とは違いCPUが食い尽くされていることを確認。

### 11:00〜
次に実装を読みながらボトルネック箇所を探す作業。このところですでに11:00。
mariadbがCPUを食い尽くしていることが確認されたので2台目のサーバーにmariadbだけ切り分け。dbをAppサーバーと別にしたところで、初期化処理でfailするようになり、困惑。チームメイトが原因を特定し、init.shを2台目へ処理するよう修正。
チームメイトがh2oをalpで読めるようにするためにログフォーマットを編集。
お昼になりお腹も減り、頭も少し疲れてきたところで一旦お昼。近くのファミリーマートへ行き、各自適当にお昼ご飯を買い、戻り大会へ参加しながら食べることに。

### 13:00〜
お昼を食べながら見ているとgetEeventsの中でgetEventがループしなんども呼ばれていることに気づき、そこの修正を開始。また、存在意義がわからないsheetテーブルを撲滅すべく修正を開始。
そこで、チームメイトがreservationテーブルへのリクエストを1回にし、そこでベンチマークを回したところ、スコアが13,000超になり順位も7位へ。
getEventを修正してこんなにもスコアが変わるものなのか・・・

また、何度かベンチを回しているとmariadbが突如「too many connection.」と言ってきたので、Go側からmaxConnectionなどの設定を変更し、mariadbの方もそれに合わせコネクション数を変更。

さらに、ベンチを何度か回してるとランダムでfailに遭遇。どうやら、高速化されたことで整合性が取れずに死んだ模様・・・

### 15:00〜
この頃、私が修正した座席のランダム予約を昇順にし、Go側でchannelを使った実装にしたものを完成させる。が、バグがいくつかありチームメイトが修正を。これは申し訳ない気持ちだった。
また、ベンチを回したところベンチマーカーは座席予約がランダムではないとエラーを・・・
座席予約ってランダムじゃないとだめだったのかよ・・・と思いつつ、ベンチマーカーでこれを判断するのは大変だろうなぁと。

### 17:00〜
私の作業していたものと、チームメイトが作業していたものをマージ。このときにgitがconfrictを起こし、急いでマージさせる。マージが完了し、ギリギリのところでベンチを何度か回し、終了。
最後のスコアは13,628へ。
ベストスコアの24,680は何処へ・・・
![Screenshot_2018-09-15 ISUCON8 Portal(7).png](https://qiita-image-store.s3.amazonaws.com/0/293237/77de3eb6-8478-fefb-83aa-7488e311ac49.png)


## 感想
今回、ISUCONへ学生チームとして参加し、去年とは違った面白さがありました。
去年はネットワーク周りが主にボトルネックになっていたが、今年は処理周りがボトルネックになっていました。
今年のISUCONでは再起動テストなどがうまくできず本戦や来年以降は再起動テストをしっかりやりたいなぁといった感じです。また、今回は運良く予選通過できたのですが実際はGoのアプリケーションにランダムfailするバグが残っていて、これのバグを潰しきれていなかったのが失格になってしまうのでは・・・？といった感じで怖かったです。
ともあれ、無事予選を通過したことはとても嬉しいです。今回の予選を通過できたのは主にいいチームメンバーと組めたことかと思っています。

## 後日
今年のISUCONでは大会終了後にサーバーにアクセスできるだけでなく、ベンチマーカーも使える状態にしてもらえました。
GMOさん、ありがとうございます。ConoHa神!!!
ベンチマーカーも回るとのことで、少しアプリケーションやDBをいじってみたのですが、
- `reservations` の `user_id` にIndexを追加
- innoDBのバッファサイズを調整
- query cacheを調整
をやったところ、スコア47,981を叩き出せたので、大会中はもっとスコアを取れたと思います。
![Screenshot_2018-09-19 ISUCON8 Portal(1).png](https://qiita-image-store.s3.amazonaws.com/0/293237/3618ed11-276a-94c4-edb6-2b3847f85013.png)



## 私のISUCONの履歴
- ISUCON7: 何もわからずに終了
- ISUCON8: 学生チームとして参加し、予選通過 <- New!!!
Rubyの基本記述の仕方〜その１〜

学習の振り返りも兼ねて、Ruby言語の基本的な記述の方法を記載して行きます。

- 数と文字
-
コードの中に記載される内容は、原則「数」として認識されます。
言語として、文字として、認識してほしい場合は " " ダブルクォーテーションマークで囲みます。

```ruby:qiita.rb
day = 3 + 1
day = "3" + "1"
```
この場合、
上段は数字として認識されて計算の処理がされ「４」が、
下段は文字として認識されて計算されず並べられ「３１」が処理結果として返されます。


- 変数
-
Ruby言語では、好きな文字列を記載して「変数」として扱うことができます。

```ruby:qiita.rb
name = "kuma"
```
この場合、
nameと定義した変数は「kuma」という文字として定義できました。

- 基本原則：コードは上から順に処理される
-
また、Rubyに限らずプログラミング全般においてコードは上から順に処理されます。
同じ名前をつけた定義を連続して記述した際、より下に記載された内容が上書きされて処理されます。

```ruby:qiita.rb
name = "kuma"
name = "morikuma"
```
nameという変数は「kuma」だよという定義と「morikuma」だよという定義の二つが記載されていますが、
この場合、上からコードが処理されていくため、一度「kuma」で定義されたnameは「morikuma」に上書きされます。




- 式展開
-
定義した変数を文章中に引用したい時、この方法で記載します。
複数の箇所に共通の数字や文字など表示させたい時に、大元の変数を変えれば一度に変えられるので便利です。
定義した変数の名前を#{}で囲みます。

```ruby:qiita.rb
name = morikuma
puts = "私の名前は#{name}です。"
```
この場合、「私の名前はmorikumaです。」と表示が返ってきます。
表示させる内容をnameの変数から取っているので、変更が必要そうな箇所をこのように記述しておくことで、
後からnameの内容を変えることで後からの修正が楽です。






- 比較演算子(大小）
-
左辺と右辺の大小を比べる時に使う記述方法です。
※原則if文などの条件を表す際に使用します。これだけ記述してもエラーが返ります。

```ruby:qiita.rb
morikuma > 80     「morikuma」が８０よりも大きい
morikuma >= 80    「morikuma」が８０以上
morikuma < 80     「morikuma」が80よりも小さい
morikuma <= 80    「morikuma」が80以下

```


- 比較演算子（等号）
-
左辺と右辺が等しいか等しくないかを表す記述方法です。
※原則if文などの条件を表す際に使用します。これだけ記述してもエラーが返ります。

```ruby:qiita.rb
morikuma == 80    「morikuma」が８０と等しい時
morikuma != 80    「morikuma」が80と等しくない時

```
=がひとつだけの場合、変数の定義と認識されてしまうため、忘れずに二つ書きましょう。
また、等しくないを表す際には「！」を使用する点も注意です。



- if文
-
if　から始めると、条件が設定でき、該当するしないによって処理を変えることができます。

```ruby:qiita.rb
morikuma = 78
if morikuma > 60
  puts "よくできました"
end

```
定義されたmorikumaの値が、60以上だった場合「よくできました」とコメントを表示させる記述です。

- else
-
if文を記載していく際に、条件に合致しなかった際の処理を記載します。

```ruby:qiita.rb
morikuma = 78
if morikuma > 60
  puts "よくできました"
else puts "もっと頑張りましょう"
end
```
これで、morikumaが60以下の値になっても「もっと頑張りましょう」と表示させることができるようになりました。


- elsif
-
if文の中に、さらに条件を追加する為の記述方法です。

```ruby:qiita.rb
morikuma = 78
if morikuma > 60
  puts "よくできました"
elsif morikuma > 40
  puts "もう少しです"
else 
  puts "もっと頑張りましょう"
end
```
40より大きく、60以下のmorikumaだった場合に、「もう少しです」と返す記述を追加することができました。



今日はこのあたりで、失礼します。
ErrorUtils caught an error: "<![EX[["Tried to listen to element of type %s from %s: %s","click","Error","C...". Subsequent errors won't be logged; see https://fburl.com/debugjs.   のエラー



## WebページにFacebook投稿を埋め込んだ時のエラー

<img alt="スクリーンショット 2018-09-19 18.17.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/83896/1e0c3042-1a05-a8b7-5f49-2476bed9a431.png">

参照jsファイルはこんな感じ。
https://static.xx.fbcdn.net/rsrc.php/v3/yJ/r/XXXXXX.js


## エラーをなくす方法
Facebookに未ログインだと、このコンソールエラーが出る。

→　Facebookにログインすると消える。