OmniAICreator/Qiita-1.07M huggingface dataset:
foreachで連想配列の要素を変更したい場合は参照渡しする


#参照渡しとは
この内容については、[独習PHP 第3版](https://www.amazon.co.jp/%E7%8B%AC%E7%BF%92PHP-%E7%AC%AC3%E7%89%88-%E5%B1%B1%E7%94%B0-%E7%A5%A5%E5%AF%9B/dp/479813547X)で以下のように説明されています。
>変数に値を格納→厳密にはコンピュータ上に用意されたメモリに格納

>メモリにはそれぞれの場所を表す番号（アドレス）が振られている。

>変数とは、値の格納先（アドレス）に対してつけられた名札みたいなもの

>「=」演算子で変数を代入する＝メモリ上の値を別のアドレスにコピーする

```php:ref_val.php
<?php
$x = 1;
$y = $x;   // $xの値を$yにコピー
$x = 5;    // $xの値を変更
print $y;  // 結果：1（$xの変更に影響しない）
?>
```
![参照渡し_概念1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/692199/a3fac59e-59b0-5314-cd87-9bc5f01234c5.png)

>一方、参照（リファレンス）による代入は、メモリ上のアドレスそのものを引き渡す代入のこと

```php:ref_ref.php
<?php
$x = 1;
$y = &$x;   // $xのアドレスを$yにコピー
$x = 5;    // $xの値を変更
print $y;  // 結果：5（$xの変更に影響する）
?>
```
![参照渡し_概念2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/692199/07149f3e-50b3-33a6-97c5-94cbb8a212f3.png)

#foreach命令→デフォルトでは配列要素を値渡し

```php:foreach_val.php
<?php
$data = ['渋谷区','豊島区','品川区','新宿区'];
foreach($data as $value){
   $value = '東京都'.$value;
}
print_r($data) // 結果：Array([0] => 渋谷区、[1] => 豊島区、[2] => 品川区、[3] => 新宿区
?>
```
したがって、連想配列の要素を変更したい場合は「&」をつけて参照渡しする

```php:foreach_ref.php
<?php
$data = ['渋谷区','豊島区','品川区','新宿区'];
foreach($data as &$value){
   $value = '東京都'.$value;
}
print_r($data) // 結果：Array([0] => 東京都渋谷区、[1] => 東京都豊島区、[2] => 東京都品川区、[3] => 東京都新宿区
?>
```
## 参考文献

この記事は以下の情報を参考にして執筆しました。

- [独習PHP 第3版](https://www.amazon.co.jp/%E7%8B%AC%E7%BF%92PHP-%E7%AC%AC3%E7%89%88-%E5%B1%B1%E7%94%B0-%E7%A5%A5%E5%AF%9B/dp/479813547X)
import torchで「OSError:[WinError 126] 指定されたモジュールが見つかりません。」が出た時の対処

#はじめに
これまでテーブルデータの機械学習を中心に勉強してきましたが、画像処理についても勉強するために書籍「Pytorchによる発展ディープラーニング」を購入しました。さっそく、サンプルコードを実行するべくPytorchをインストールしましたが、コード実行時にモジュールのimportエラーが発生しました。事象の解消になかなか苦戦したので対処法を残します。

**※ちなみにQiita初投稿です**

#実行環境
OS: Windows10
Anaconda3環境(Python3.7.6)

#発生した事象
まず、[Pytorch](https://pytorch.org/get-started/locally/)の公式サイトにて、自分の環境に該当するPytorchのインストールコマンドを確認し、Anaconda Prompt上でコマンドを実行。

自分の場合は以下のコマンド
（バージョンはpytorch==1.6.0　torchvision==0.7.0）

```
conda install pytorch torchvision cpuonly -c pytorch
```

Pytorchのインストール完了後に、書籍付属のサンプルコードをJupyter Notebook上で実行したところ以下のエラーが**「import torch」**の行で発生。
（conda listコマンドにてPytorchがちゃんとインストールされていることは確認済み）

```
OSError:[WinError 126] 指定されたモジュールが見つかりません。 Error loading "C:\Users\●●●\anaconda3\lib\site-packages\torch\lib\asmjit.dll" or one of its dependencies.
```

#試したこと

いろいろと試しましたが結果、④の旧バージョンPytorchのインストールで解決しました。

###①condaではなくpipでインストール
以下の記事で、pipでインストールし直したところ、エラーが出なくなったと書かれていたためpipで再度インストール。

[【python】import torchがエラーで失敗した時の対処方法](https://trend-tracer.com/pytorch/)

しかし、pipでインストールし直すも事象は解消せず。

###②Anacondaの再インストール
モジュールがインストールされるフォルダ内にPytorchのモジュールがちゃんと存在していたため、環境変数のpathがしっかりと通せていない、もしくはPythonのバージョンの影響と想定。しかし、Anacondaを再度インストールするも事象は解消せず。

###③CUDAの再インストール
CUDAを半年ほど前にインストールした際には、自分のPCのOSがまだWindows8.1でした。その後、OSをWindows10へアップデートしたため、それが悪さをしていると想定。しかし、Windows10対応のCUDAを再度インストールするも事象は解消せず（そもそも、実行したサンプルコードではGPUの使用がないので関係ない？）。

###④旧バージョンのPytorchをインストール
海外の記事で、旧バージョンのPytorchをインストールしたところ解消したという事例を見つけたので試してみました。

[error while import pytorch module. (The specified module could not be found.)
](https://stackoverflow.com/questions/63187161/error-while-import-pytorch-module-the-specified-module-could-not-be-found)

自分の場合は以下のコマンド
（バージョンはpytorch==1.5.0　torchvision==0.6.0）

```
conda install pytorch==1.5.0 torchvision==0.6.0 -c pytorch
```

結果、これで今回のエラーが出る事象は解消しました！サンプルコードも実行できました。

#解決に数日かかりました
文章で書くと一瞬で解決したように見えますが、自分は②、③でAnacondaやCUDAのバージョンをいろいろと変えて再インストールするのに時間を費やしたため、解決に数日かかってしまいました。
（最初から④を試していれば速攻で解決してたんでしょうけど…）

同じような事象が発生したという日本語の記事も少なかったので今回メモとして残しておきます。同じ事象で困っている方は参考にして下さい。
【備忘録】Tableau Onlineにおけるデータソースのファイルサイズについて

## 概要
　Tableau Onlineにて、データソースのファイルサイズが、実ファイル（tdsxファイル）のサイズとサーバー上のデータソースのサイズと一致していなかったことに対する調査内容を共有します。


## 事象
Tableau Onlineからダウンロードしたデータソースのファイル（tdsxファイル）のサイズが下記に示すように、165MBでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/7a4dc830-c070-d0d8-d9da-b62dcf8f31d9.png)

ただ、Tableau Online上では339MBと表示されており、実ファイルのサイズと一致しておりませんでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/4395ab24-31c7-5872-a723-5bba348bc1cf.png)

## 調査内容
ダウンロードしたtdsxファイルの拡張子をzipに変更し展開するとTableau Online上の339MBとほぼ一緒であるため（一致していない理由は単なる換算方法の相違の可能性もあるが）、Tableau Online上では解凍後のサイズで換算されていると推測できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/e9a49022-3c17-47f7-a0ab-afaf52a0337d.png)
mariadb(mysql)起動しなくなった場合

OS: centos7

```
journalctl -xe

 8月 14 23:09:01 cent74 mariadbd[8773]: 2020-08-14 23:09:01 0 [Note] InnoDB: Using SSE4.2 crc32 instructions
 8月 14 23:09:01 cent74 mariadbd[8773]: 2020-08-14 23:09:01 0 [Note] InnoDB: Initializing buffer pool, total size = 134217728, chunk size = 134
 8月 14 23:09:01 cent74 mariadbd[8773]: 2020-08-14 23:09:01 0 [Note] InnoDB: Completed initialization of buffer pool
 8月 14 23:09:01 cent74 mariadbd[8773]: 2020-08-14 23:09:01 0 [Note] InnoDB: If the mysqld execution user is authorized, page cleaner thread pr
 8月 14 23:09:01 cent74 mariadbd[8773]: 2020-08-14 23:09:01 0 [ERROR] InnoDB: Upgrade after a crash is not supported. The redo log was created
 8月 14 23:09:01 cent74 mariadbd[8773]: 2020-08-14 23:09:01 0 [ERROR] InnoDB: Plugin initialization aborted with error Generic error
 8月 14 23:09:02 cent74 mariadbd[8773]: 2020-08-14 23:09:02 0 [Note] InnoDB: Starting shutdown...
 8月 14 23:09:02 cent74 mariadbd[8773]: 2020-08-14 23:09:02 0 [ERROR] Plugin 'InnoDB' init function returned error.
 8月 14 23:09:02 cent74 mariadbd[8773]: 2020-08-14 23:09:02 0 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
 8月 14 23:09:02 cent74 mariadbd[8773]: 2020-08-14 23:09:02 0 [Note] Plugin 'FEEDBACK' is disabled.
 8月 14 23:09:02 cent74 mariadbd[8773]: 2020-08-14 23:09:02 0 [ERROR] Unknown/unsupported storage engine: InnoDB
 8月 14 23:09:02 cent74 mariadbd[8773]: 2020-08-14 23:09:02 0 [ERROR] Aborting
 8月 14 23:09:02 cent74 systemd[1]: mariadb.service: main process exited, code=exited, status=1/FAILURE
 8月 14 23:09:02 cent74 systemd[1]: Failed to start MariaDB 10.5.5 database server.
-- Subject: Unit mariadb.service has failed
-- Defined-By: systemd
```

上記ファイルを削除

/var/lib/mysql/ib_logfile0
/var/lib/mysql/ib_logfile1
/var/lib/mysql/ib_logfile101

# 再起動
```
systemctl restart mariadb
```
ransack でカラム同士を比較する

# まとめ

下記の ransacker とパラメータの組み合わせで `(model.column_A <= model.column_B) = TRUE` が条件に追加されます。同じテーブルのカラム同士の比較を条件に加えることができます。

```ruby:モデルに書くransacker
ransacker "compare", args: %i[parent ransacker_args] do |parent, args|
  columns = args.values
  Arel::Nodes::Grouping.new(
    Arel::Nodes::InfixOperation.new(
      '<=',
      parent.table[columns[0].to_sym], parent.table[columns[1].to_sym]
    )
  )
end
```

```ruby:パラメータ
'q' => {
    'c' => {
        '0' => {
            'a' => {'0' => {'name' => 'compare',
                            'ransacker_args' => {
                                '0' => 'column_A',
                                '1' => 'column_B'
                            }
            }
            },
            'p' => 'true',
            'v' => {'0' => {'value' => 1}
            }
        }
    }
}
```

v3.2.1 で動作することを確認してます。
https://github.com/activerecord-hackery/ransack/releases/tag/v3.2.1
v4.0.0 以降は未検証。

# 解説

## ransacker

```ruby
ransacker "compare", args: %i[parent ransacker_args] do |parent, args|
  columns = args.values
  Arel::Nodes::Grouping.new(
    Arel::Nodes::InfixOperation.new(
      '<=',
      parent.table[columns[0].to_sym], parent.table[columns[1].to_sym]
    )
  )
end
```

ransacker で追加の ransack 用のメソッドを用意してあげます。
`args: %i[parent ransacker_args]` で `ransacker_args` を使えるようにして、ブロック引数にも `args` を書いて、ブロックの中で使えるようにします。
`Arel::Nodes::Grouping` は `()` に引数の結果を収めてくれます。これを書かないと SQL の式が成り立たないです。
`Arel::Nodes::InfixOperation` は第一引数に演算子をとって、第二引数と第三引数を演算する式を返します。
この ransacker は `(model.column_A <= model.column_B)` という式を作ります。


## パラメータ

```ruby
'q' => {
    'c' => {
        '0' => {
            'a' => {'0' => {'name' => 'compare',
                            'ransacker_args' => {
                                '0' => 'column_A',
                                '1' => 'column_B'
                            }
            }
            },
            'p' => 'true',
            'v' => {'0' => {'value' => 1}
            }
        }
    }
}
```

Advanced Mode を使います。
比較するだけなので p や v は不要に思えますが、a p v の３つが揃わないと ransack が条件として追加してくれないようなので p や v も書きます。
a の name には素直に追加した ransacker のメソッド名を書きます。
ransacker_args には比較したいカラムを書きます。
p は true、value は 1 にします。でも、value は何でもいいです。

## 考察

ransacker_args を使わないと、比較するカラムの組み合わせの数だけ ransacker を書かないといけなくなりますが、このように ransacker_args を使えばコンパクトに書けます。
便利ですね。
yukicoder contest 261 参戦記

# yukicoder contest 261 参戦記

## [A 1168 Digit Sum Sequence](https://yukicoder.me/problems/no/1168)

増えていったりしないので、何も考えずに99回ループを回せば OK.

```python
N = int(input())

for _ in range(99):
    N = sum(int(c) for c in str(N))
print(N)
```

## [B 1169 Row and Column and Diagonal](https://yukicoder.me/problems/no/1169)

解けず.
【Python】データサイエンス100本ノック（構造化データ加工編） 027 解説

- データサイエンス100本ノックをやりきる会を作りました🎉
- こちらの[Slack招待URL](https://join.slack.com/t/data-science-100nocks/shared_invite/zt-gfncg9vm-8W8b3UrDg8R~TKaqUkQpgw)からご参加ください！！
- ぜひ一緒に励まし合いながら、データサイエンス100本ノックをやり切りたいと思っています！

##Youtube
[動画解説](https://youtu.be/OX0x8hhWy94)もしています。

##問題
P-027: レシート明細データフレーム（df_receipt）に対し、店舗コード（store_cd）ごとに売上金額（amount）の平均を計算し、降順でTOP5を表示せよ。

##解答
```:コード
df_receipt.groupby('store_cd').amount.mean().reset_index().sort_values('amount', ascending=False).head(5)
```

##出力
|  | store_cd | amount |
|--:|:--|--:|
| 28 | S13052 | 402.867470 |
| 12 | S13015 | 351.111960 |
| 7 | S13003 | 350.915519 |
| 30 | S14010 | 348.791262 |
| 5 | S13001 | 348.470386 |

##解説
・PandasのDataFrame/Seriesを使用します。
・同じ値を持つデータをまとめて処理し、同じ値を持つデータの合計や平均などを確認したい時に使用します。
・**'groupby'は、同じ値や文字列を持つデータをまとめて、それぞれの同じ値や文字列に対して、共通の操作（合計や平均など）を行いたい時に使います。**
・**'.amount.mean()'は、amountの平均値を表示させます。**
・**'.reset_index()'は、'groupby'によってバラバラになったインデックス番号を0始まりの連番に振り直す操作を行いたい時に使います。**
・**'.sort_values('amount', ascending=False)'で'amount'を降順に表示しています。**

※こちらのコードでも同様の結果を出力します  

```:コード
df_receipt.groupby('store_cd').agg({'amount':'mean'}).reset_index().sort_values('amount', ascending=False).head(5)
```
【Docker】コンテナ構築時に、MySQLデータベースが立ち上がらない


#エラー内容

```shell
ERROR: for db  Cannot start service db: Ports are not available: listen tcp 0.0.0.0:3306: bind: address already in use
```

どうやら、すでにポート番号3306が使われている様子

#まずは、プロセス確認

```shell
$ sudo lsof -i -P | grep "LISTEN"
rapportd    315     user    4u  IPv4 0xb08837e7170ea82d      0t0    TCP *:59397 (LISTEN)
rapportd    315     user    5u  IPv6 0xb08837e7098fcf3d      0t0    TCP *:59397 (LISTEN)
com.docke 19101     user   10u  IPv4 0xb08837e717a7d30d      0t0    TCP localhost:56362 (LISTEN)
com.docke 19102     user   50u  IPv6 0xb08837e709900c7d      0t0    TCP *:8080 (LISTEN)
mysqld    20618     _mysql   21u  IPv4 0xb08837e7180b7e4d      0t0    TCP localhost:3306 (LISTEN)
```

とりま、ID指定して停止。

```shell
$ kill -9 20618 

$ docker-compose up -d --build
ERROR: for db  Cannot start service db: Ports are not available: listen tcp 0.0.0.0:3306: bind: address already in use
```

まだダメ、、、。
mysqldはまだ起動していた。

そこで、思い出した。

他のプロジェクトで、

```shell
$ mysql.server start
```

していたことを。

# エラー解決

mysql自体を止めましょう

```shell
$ mysql.server stop
```

```shell
$ docker-compose up -d --build

Starting db ... done
```

成功！
Carbonを用いて期間検索機能を作る

##はじめに
日付検索する時にDBには年月日時分秒まで登録されているけど期間（年月日）で検索したい時ありませんか。
そんな時はCarbonを使って検索機能を作りましょう。

##Carbonを用いて期間検索機能を作る
ある事柄が始まった日時`$period[start_at]`の検索で、検索期間（年月日）のはじめを`$request['start_at_from']`、検索期間（年月日）の終わりを`$request['start_at_to']`として$requestの配列で受け取ったとします。

`$period['start_at_from']`と`$period['start_at_to']`は（2020-08-13のように）年月日で受け取っているとしてCarbonを用いて`00:00:00`と日時分を仮置きします。

```php:
//2020-08-13
$period['start_at_from']
//2020-08-13 00:00:00
Carbon::parse($period['start_at_from'])
```

`startOfDay()`メソッドで1日の中の一番初めの時刻（00:00:00）、`endOfDay()`メソッドで1日の中の一番終わりの時刻（23:59:59）を取得できます。

```php:
//2020-08-13 00:00:00
Carbon::parse($period['start_at_from'])->startOfDay());
//2020-08-13 23:59:59
Carbon::parse($request['start_at_to'])->endOfDay()); 
```

`where`は第一引数にカラム名、第二引数に比較演算子、またはSQLで使うオペレータ、第三引数に比較する値を指定します。
上記までのものも合わせて下記に実装をまとめます。

```php:Controller.php
use Carbon\Carbon;

public function periodSearch(Request $request)
{
    $inputs = $request->validatedValues();
    
    $this->where('start_at', '>=', Carbon::parse($request['start_at_from'])->startOfDay()); 
    $this->where('start_at', '<=', Carbon::parse($request['start_at_to'])->endOfDay()); 
         } 

return view('periodSearch', ['period'=> $period]);
```


##おわりに
Carbonは日時を操作するのに大変便利なので使いこなせるようにCarbonはどんなことができるか調べておくと良いかもしれません。
Juliaで乱数生成器の状態をセーブ/ロードする

# はじめに
確率過程を扱う数値計算をしていると、乱数生成器の状態を保存したり、過去に保存した状態を再利用したくなることがあります。（例：モンテカルロシミュレーションを中断/再開する。）ここでは、そのような操作をJuliaで行う方法をメモしておきます。環境は

- OS: Windows 10
- Juliaのバージョン: 1.5.0

です。

# 乱数生成器の初期化
乱数生成器にシード値を与えて初期化するには以下のようにします。

```julia
using Random, Random.DSFMT

seed = 1234
rng = MersenneTwister(seed)
```

# JLD2パッケージ
ひとつの安直な方法は、乱数生成器の状態をまるっと保存してしまうことです。ここでは[JLD2パッケージ](https://github.com/JuliaIO/JLD2.jl)を使用してみます。このパッケージを利用すると`@save`マクロで

```julia
using JLD2

@save path something1 something2 something3
```

のようにして、だいたいどんな型の変数でも保存できます。ファイルを読み込むときは

```julia
using FileIO

data = load(path)
```

とします。`data`は変数名をkeyにもつ辞書形式になっており、

```julia
something1 = data["something1"]
something2 = data["something2"]
something3 = data["something3"]
```

で値を取り出せます。



# 乱数生成器をセーブ/ロード
一例として、

1. 乱数を5個生成
2. 乱数生成器をファイルに保存
3. 乱数生成器をファイルから読み込み
4. 乱数を5個生成

という操作を考えます。

```julia
function sampling_with_interruption(rng)
    x = zeros(10)

    # 1. 乱数を5個生成
    for i in 1:5
        x[i] =  rand(rng)
    end

    # 2. 乱数生成器をファイルに保存
    filename = "somewhere/rng.jld2"
    @save filename rng

    # 3. 乱数生成器をファイルから読み込み
    data = load(filename)
    rng = data["rng"]

    # 4. 乱数を5個生成
    for i in 6:10
        x[i] =  rand(rng)
    end
    return x
end
```

この比較対象として、中断を挟まずに乱数を10個生成したものを考えます。

```julia
seed = 1234
rng1 = MersenneTwister(seed)
rng2 = MersenneTwister(seed)

x1 = rand(rng1, 10)
x2 = sampling_with_interruption(rng2)
```

`x1 == x2`は`true`となることが確かめられます。これで、乱数生成を伴う計算を中断しても、適切に再開できるようになりました。
Qiitaに本当に必要だったもの

Qiita、それは日本ITエンジニアの主戦場。たぶん。
私も今Qiitaに記事を書こうとしている。
ただし私が書こうとしている内容はQiitaの否定だ。

ぶっちゃけQiitaはもうだめだ。
新しい記事を書こうという気になれないし記事を読みたいとも思わない。
というかなるべく検索で上位にQiitaが引っかからないようにしてほしいとさえ思う。
なぜだろう？

それは記事が粗製乱造されるから。
そして放置されるから。
そしてそれを運営が推奨しているから。

昔からそうで今もそう。
そしてこれからもそうなのだろう。
でも、なぜそうなっているのだろうか。

Qiitaには編集リクエストをする機能がある。
記事をよりよくするためには必須の機能であり試したことのある人もいくらかはいるだろう。
私も編集リクエストをして受け入れられたことがある。
[XMind ファイルをタブインデントでテキストファイル変換する(XSLT)](https://qiita.com/NAKADANobuhiro/items/9536172cb608a610397c)
![FireShot Capture 010 - 「XMind ファイルをタブインデントでテキストファイル変換する(XSLT)」の編集履歴 - Qiita - qiita.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12244/e58681be-95e6-b508-fe4e-27b649d26d5c.png)
https://qiita.com/NAKADANobuhiro/items/9536172cb608a610397c/revisions/2

が、例えそれが受け入れられても無駄なのだ。
なぜならQiitaはそれを評価しない。
![FireShot Capture 013 - nandaka_furari - Qiita - qiita.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12244/e6ddeba6-2234-3454-55c3-575d7ba11bab.png)
というか自分が何に編集リクエストを送ったかすら分からない。
ここでは「新しい記事を粗製乱造すること」だけが正義なのだ。

例えばあなたが今この記事を読んで訂正したい箇所があったとして、それで編集リクエストをしたい気持ちになるだろうか？
何も評価されないのに。
そう、この記事自身も粗製乱造のうちの一種であり、これにも編集リクエストが来ることはないだろう。
ずっと粗製乱造記事としてウェブの海を漂うのだ。
そしてそのうちQiitaとともに消え去ってしまう。
それはそう遠くない未来だ。

もちろんQiitaに愛着のある人も多いだろうが、残念ながらその愛は無駄になる。

でも、そうならないようにする手が一つだけある。
そう、答えは単純だ。
編集リクエストが受け入れられたならばそれを実績としてきちんと表示するようにする、という事だ。
たったそれだけだ。
ついでにもう一つ言うなら、より多く編集した人をランキング化してメールで送る、という事も効果的だろう。

ただ、この案が受け入れられるかというと、どうだろう。
私ははっきり言えば…絶望している。
最適化コンパイラへのいざない (2) マルチパスコンパイラ

### 記事一覧
1. [はじめに](https://qiita.com/uint256_t/items/abda5583ce31cd842698)
2. マルチパスコンパイラ (この記事)
3. [定数に関する最適化](https://qiita.com/uint256_t/items/a0d050894927b618daa3)
4. [プログラムの構造](https://qiita.com/uint256_t/items/7d4556cb8f5997b9e95c)

### 対象読者

- コンパイラの内部構造について興味がある方
- コンパイラに関して精通している方（批評お待ちしております）

# ワンパスコンパイラ

突然ですが，初めてコンパイラを作るのであれば，大抵次のような構造になると思います．

![ワンパスコンパイラ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/69622/42490d50-4a80-6278-017e-366f20472450.png)

図中の赤い部分は，どんなにシンプルなコンパイラでも含まれているだろうという意味を込めたものです．字句解析や中間言語生成はそれぞれ構文解析やコード生成と区別化がつかなくなっている場合もあるかと思います．

ここで図中に，*一つのパス*と書かれているのが気になった方もいるかと思います．

## パス

プログラムのとある表現（ソースコードや中間言語）は，ある操作を施されて別の表現へと移っていきます．この時，ある操作やそれを行うためのルーチン群のことを**パス**と呼びます．

この説明だと，ASTが中間言語へ変換されるのも一つのパスだと数えられないのか？という疑問が浮かびます．
しかし，おそらくシンプルなコンパイラならば，字句解析からコード生成までが逐次行われていて，「構文解析が完全に済んだから，ASTに対してコード生成を始めよう」，というような構造にはなっていないかと思います．そういう意味で，シンプルなコンパイラはワンパスと言われています．逆にそのような構造ではなくて，段階ごとにしっかり分離された設計になっているのならば，次に説明するマルチパスコンパイラであると言えます．

# マルチパスコンパイラ

マルチパスコンパイラは以下のような構造をしています．

![multi pass compiler.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/69622/a88b29a7-bf34-6d08-417c-c4e2eaceacca.png)

マルチという言葉の通りパスが複数ありますね．何が増えたのかというと，最適化パスが増えています．
ワンパスコンパイラのような逐次処理では困難だったコンパイル単位での処理が，マルチパスコンパイラでは可能になります．最適化が実装しやすくなるので，マルチパスコンパイラは最適化コンパイラとも呼ばれます．

# 実例

世の中で使われているコンパイラはマルチパスのものが多いですが，実際どのような構造なのでしょうか．
具体例を見たほうが分かりやすい方も多いと思うので紹介します．

## GCC

![gcc internal](https://upload.wikimedia.org/wikipedia/commons/0/0b/Gcc.JPG)
[GNU C Compiler Internals/GNU C Compiler Architecture](https://en.wikibooks.org/wiki/GNU_C_Compiler_Internals/GNU_C_Compiler_Architecture)

画像はgccの内部構造です．一目見るだけでマルチパスだとわかります．[GIMPLE](https://gcc.gnu.org/onlinedocs/gccint/GIMPLE.html)や[RTL](https://en.wikipedia.org/wiki/Register_transfer_language)など見慣れない言葉もあるかと思いますが，とりあえず今は気にしなくて大丈夫でしょう．

## LLVM

![llvm internal](https://jonathan2251.github.io/lbd/_images/9.png)

[Design and Implementation of a TriCore Backendfor the LLVM Compiler Framework (p.10)](https://reup.dmcs.pl/wiki/images/7/7a/Tricore-llvm-slides.pdf)

画像はLLVMの構造です．(LLVMはコンパイラ基盤なので，中間言語以降を対象にしていると思えばよいです．)
とにかくたくさんの工程を経てアセンブリが出力されていることが分かります．この画像では中間言語(LLVM-IR)に対する最適化が描かれていないので，実際にはもっと長くなります．

一つ一つのパスは広大で，小さなコンパイラほどの規模を持ちます．私は高校3年生の時の通学時間をスマホでLLVMのソースコードリーディングをすることに割きましたが，どのパスも最後まで読むことはできませんでした．もっとコードリーディングが上手くなりたいですね．

# 次の記事

coming soon

いよいよ具体的な最適化手法の説明に入ります．まずは身近で簡単なものからです．
CAELinux2020のREADMEファイルについて

原文はこちら
[README.txt](https://sourceforge.net/projects/caelinux/)

# CAELINUX 2020公式リリース

CAELinux 2020配布フォルダー（リンク先はこちら：[https://sourceforge.net/projects/caelinux/files/CAELinux2020/](https://sourceforge.net/projects/caelinux/files/CAELinux2020/)）

ここでは、Xubuntu 18.04をベースにしており、すべての最新のアップデートとすべてのCAELinuxコアパッケージがインストールされたライブ起動可能なUSBフラッシュドライブのCAELinux2020 ISOイメージの新しいバージョンが見つかります。

FEAの場合：Code-Aster 14.4を備えたSalome-Meca 2019だけでなく、FreeCAD、Calculix LauncherまたはCAE GUIに統合されたCalculix 2.15+。

数値流体力学の場合：Code-Saturne 5.3を備えたSalome-CFD 8.5、またはHelyxOS Guiを備えたOpenFOAM v7。

広範囲なマルチフィジックスFEAの場合: ElmerGUIを備えたElmer FEM。

数学とプログラミングの場合：GNUコンパイラ、Qt4と5、Python 3、Perl、OctaveとR環境、Spyder3、OctaveGUI、RKWard、RCmdr、wxMaximaインタフェースの完全なスイートを持っています。

エレクトロニクスと制御の場合：Arduino 1.8.13、Kicad、OpenModelicaのダイナミックシステムシミュレータがあります。

3Dプリント（OpenSCAD、Meshlab、Cura）やPCBフライス加工（Pcb2Gcode、CadPy、DXF2GCode、Flatcam、Inkscape、Gcodetools、Inkscapeレーザーツール）に必要なすべてのツールと同様に、FreeCAD、LibreCAD、Salome、CAMLab、PyCam、CamoticsなどのCAD-CAMソフトウェアパッケージも豊富に用意されており、設計やプロタイプにも対応しています。

----------------------

インストール:配布フォルダー[https://sourceforge.net/projects/caelinux/files/CAELinux2020/GettingStarted.html/download](https://sourceforge.net/projects/caelinux/files/CAELinux2020/GettingStarted.html/download)にあるGettingStarted.htmlファイルをお読みください。

ISOイメージをダウンロードするには、7zアーカイブの3つの部分（ファイルcaelinux2020.sio.7z.001から.002）のそれぞれをダウンロードし、7zipを使用してISOを解凍する必要があります。

次に、md5sumをチェックして、イメージが壊れていないか確認してください。

CAELinux 2020 ISOイメージはDVDには収まらず、サイズの関係上、USBフラッシュディスクの作成には特別な手順が必要となりますのでご注意ください。

テストでは問題なく動作したため、[Ventoy](https://www.ventoy.net/)を使用して起動可能なUSBフラッシュディスクを作成することをオススメします。

CAELinux 2020を仮想マシンにインストールしたい場合は、VirtualBOXが一部のパッケージソフトウェア（主にSalomeCFD）ではうまく動作しないため、VMWare PlayerまたはWorkstationを使用することを強くオススメします。

ご意見があれば、下記のフォーラムに投稿してください：
[http://caelinux.com/](http://caelinux.com/)
図解!!!えてこでも分かるFirebase連携[Firebase SDK snippet]

Firebaseの連携するとき

「あの連携するために必要なコードどこやねん!!!!!!!!」
……てなることありません？？

ありますよね？？

そんなあなたのためにエテコ(猿)でも分かるように**Firebase SDK snippetをゲットする方法**を図解で説明します!!

まずトップページへ。

![スクリーンショット 2020-08-14 22.13.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550650/6aee7d7d-ad5b-f85d-99f8-7f504dfe05fb.png)
▲どれかプロジェクト選んでください。



そしたらこんな感じのページへ移動するはずです。

![スクリーンショット 2020-08-14 22.13.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550650/49660bd0-6286-8572-7ee1-44281599197d.png)
▲アクセス数すくなっ!!



次はこの左側の設定ボタンから「プロジェクトを設定」を選びましょう。

![スクリーンショット 2020-08-14 22.14.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550650/8669ee21-d7c1-4829-64f4-164eccfbbaad.png)
▲ふひひ。


そしたらこんな感じのページに出るわけです。
![sbづいfsbっdfbsUIF.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550650/d377022a-dd47-1941-16a5-749d1fadc6dd.png)
▲ふうむ。



このページをどんどん下へ進んでいきましょう。

そしたら[Firebase SDK snippet]と言う項目があります。
ここのラジオボタンで「CDN」を選択です!!

![スクリーンショット 2020-08-14 22.14.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550650/224e86ef-42f8-c4bd-b545-b97548441cb2.png)

▲はい!!目的のコードゲットです!!!右下の方の`ver firebaseConfig`で始まってるやつですね!!!!
UnityでのLiDARセンサー対応端末判定について


#何がしたいのか

現状iPadPro2020モデル、iPhone12ProMax(予定)のみ搭載のLiDARセンサーの搭載有無判定をUnityで判定したい
備忘録となります。

#実装方法
ARFoundation3.5以降から実装されているARMeshManagerではLiDARセンサーを使用して環境スキャンを行うことで現実空間のメッシュを生成しています。
よって、ARMeshManagerが使用できるかどうかでLiDARセンサー有無が判定できます。




```C#:CheckSupport.cs
using UnityEngine;
using UnityEngine.XR;
using UnityEngine.XR.ARFoundation;

public class CheckSupport : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        var activeLoader = LoaderUtility.GetActiveLoader();
        if (!(activeLoader && activeLoader.GetLoadedSubsystem<XRMeshSubsystem>() != null))
        {
            //LiDAR端末でない時の処理
        }
    }
}
```

#まとめ
LiDARセンサー有無も問題なく取れます
【Django】Modelのテーブル名／カラム名を指定する方法

# はじめに
DjangoのModelで任意のテーブル名、カラム名を指定してデータベースにアクセスする方法について記載します。

# 環境
Django 3.0.x

# テーブル名
DjangoのModelは、「アプリケーション名\_クラス名」がデフォルトのテーブル名となります。
以下の例では、「アプリケーション名\_Employee」がテーブル名となります。

```
from django.db import models

class Employee(models.Model):
  first_name = models.CharField()
  last_name = models.CharField()
```

任意のテーブル名を指定する場合は、Modelの内部クラスMetaのメタデータオプションでテーブル名を指定します。

```
from django.db import models

class Employee(models.Model):
  first_name = models.CharField()
  last_name = models.CharField()

  class Meta:
    db_table = '従業員'             # テーブル名：'従業員'
```

# カラム名
DjangoのModelは、フィールド名がデフォルトのカラム名となります。
以下の例では、「first_name」と「last_name」がカラム名となります。

```
from django.db import models

class Employee(models.Model):
  first_name = models.CharField()
  last_name = models.CharField()

  class Meta:
    db_table = '従業員'
```

任意のカラム名を指定する場合は、各フィールドのフィールドオプションでカラム名を指定します。

```
from django.db import models

class Employee(models.Model):
  first_name = models.CharField(db_column='名')  # カラム名：'名'
  last_name = models.CharField(db_column='姓')   # カラム名：'姓'

  class Meta:
    db_table = '従業員'
```

# おわりに
各オプションの詳細については、Django公式サイトにも説明がありますので、
そちらも参考にしていただければと思います。
新しいmapを使ってみた

# はじめに
Apple Developer DocumentationをみるとMapKit中に[struct Map](https://developer.apple.com/documentation/mapkit/map)が増えています。
どうもSwiftUIで直接mapが表示できるようになったようです。
実際に作ってみました。
サンプルプロジェクトは[github](https://github.com/FromF/MapSwiftUI)にアップしてあります。

# コードの解説

[サンプルプロジェクト](https://github.com/FromF/MapSwiftUI)のポイントを紹介します。

## Mapを表示する

```swift
@State var coordinate = MKCoordinateRegion(center: CLLocationCoordinate2D(latitude: 36.0, longitude: 138), latitudinalMeters: 2000000, longitudinalMeters: 2000000)
Map(coordinateRegion: $coordinate)
```

Mapを表示するには、表示したい位置情報(`coordinate`)を指定すると表示できます。

## ピンを表示する
ピンを表示するには、[MapAnnotationProtocol](https://developer.apple.com/documentation/mapkit/mapannotationprotocol)を実装する必要があるようです。
今回は、下記のような構造体を用意しました。（ネーミングが悪くてすみません）

```swift
struct AnnotationItemStruct:Identifiable{
    // ID(識別子)
    let id = UUID()
    // 緯度経度
    let coordinate:CLLocationCoordinate2D
}
```

次にピンの配列を作成します。

```swift
@State var annotationItems: [AnnotationItemStruct] = []
```

最後にピンに位置情報を追加します。

```swift
let annotationItem = AnnotationItemStruct(coordinate: coordinate)
self.annotationItems.append(annotationItem)
```

実際にピンをmapに表示できるようにmapを修正します。

```swift
Map(coordinateRegion: $coordinate, annotationItems: annotationItems) { annotationItem in
    // annotationItemsから１つ取りだした情報からピンを打つ
    MapPin(coordinate: annotationItem.coordinate)
}
```

# 参考
- [HowTo—— Swift2.0在视图中显示地图](https://zhuanlan.zhihu.com/p/158111570)
- [Fucking SwiftUI](https://fuckingswiftui.com/#map)
【Rails】ハッシュや配列に特定要素が存在するか判別 [ActiveRecord] [has_attribute?]

ハッシュや配列の中に特定の要素が存在するか確認する方法です。
emailが登録されていなかったら登録、されていたらメッセージ、みたいなイメージです。

##任意のハッシュを判別

このようなハッシュを例にします。
`nil` `empty` に注目です。

```ruby
@user = {
 "id" => 1,
 "name" => "Taro",
 "age" => 26,
 "from" => nil,
 "sex" => "",
 "created_at" => Sun, 21 Aug 2020 09:55:05,
 "updated_at" => Sun, 21 Aug 2020 09:55:05
}
```

##has_attribute?で判別

特定の要素自体があるかどうか判別します。
`has_attribute?`でこのような結果が得られます。

```ruby
@user.has_attribute?(:name) # => true
@user.has_attribute?(:from) # => true
@user.has_attribute?(:sex) # => true
@user.has_attribute?(:userid) # => false
```

少しややこしいのが、中身が `nil` `empty` だとしても結果は`true`というところです。
要素自体があるかないかの判別ということです。

##attribute_present?で判別

特定の要素の中身が存在するか判別します。
`attribute_present?`でこのような結果が得られます。

```ruby
@user.attribute_present?(:name) # => true
@user.attribute_present?(:from) # => false
@user.attribute_present?(:sex) # => false
@user.attribute_present?(:userid) # => エラー
```

要素は存在する前提で、中身が空かどうか判別します。

##参考

ActiveRecordやハッシュ・配列などで使えるメソッドは他にもたくさんありますよー
https://api.rubyonrails.org/classes/ActiveRecord/AttributeMethods.html
e（ネイピア数）ーなぜを解決するー

ネイピア数って結構機械学習の勉強をしている際に出てくるため、現時点の理解でまとめておきます。
調べても数学の問題を解くための動画やサイトが多くてなぜ？？使うか。なぜ？？必要なのかという本質的な部分が見えてきていないのが正直なところです。

##ネイピア数を使う意味って何？
ネイピア数を使うことによって理想的な理論を表す際に使われる。
πなどと同じく超越数と言い、なんとなく使われるイメージ。。。。。
ここを理解するには、定義をおさらいする必要がありそうですが、僕はとりあえずあとで。。
youtubeで鈴木貫太郎さんが出していた動画がわかりやすかったのでおすすめです。

##ネイピア数って何
ネイピア数とは自然対数の底・超越数のこと。
性質としては、
；数値で表すと、2.71828182846
となります。


ちなみに幅広く機械学習で出てくるため抑える必要があるなと。。。

##現時点で必要かなと感じている数学的知識について
①指数関数
②二項定理
③ネイピア数の定義について　などなど

内容薄いですが、今後更新していく予定です笑笑
私を５歳児だと思ってScikit-learnのPermutation_Importanceを教えてください。

###Scikit-learnのPermutationImportanceを使ってみた

`PermutationImportance`のライブラリーは、今までは、`ELI5`[ELI5公式ドキュメント](https://eli5.readthedocs.io/en/latest/blackbox/permutation_importance.html)というライブラリーでした。
（ELI5とはExplain Like I'm 5.（私を5歳児だと思って説明して）の略です。）
最近、`Scikit-Learn0.22`から`PermutationImportance`が実装されました。今までサポートベクターで計算した後は、特徴量の何が寄与したかよくわからなかったのですが、今後は、`PermutationImportance`で特徴量の何が重要か見ることができるようになりました。

`PermutationImportance`は、簡単に言うと、特徴量の中の一つを選ぶ、その中の値をシャッフルして意味のない数値にします。そのデータを用いて精度を求め、正しい特徴量のデータセットと精度の比較をし、選んだ特徴量がどれくらい精度に影響しているのか計算するものです。

計算するのは結構簡単でした。
`sklearn.inspection`から`permutation_importance`をインポートします。
サポートベクターでパラメーターを`oputuna`で最適化して作ったインスタンス`optimised_regr`と、データセットを、`permutation_importance`の引数として読み込ませて計算するだけでした。

```python
#ここからsklearnのpermutation_importanceです
from sklearn.inspection import permutation_importance
result = permutation_importance(optimised_regr, X_test_std, y_test, n_repeats=10, n_jobs=-1, random_state=0)

#結果をPandasのデータフレームに入れて、表示します
df = pd.DataFrame([boston.feature_names,result.importances_mean,result.importances_std],index=['Featue','mean','std']).T
df_s = df.sort_values('mean',ascending=False)
print(df_s)
```
結果を`pandas`に読み込んで表にしてみました。

|  |Featue|mean|std|
|---:|------:|:---------|:--------|
|5 |       RM|    0.466147|    0.066557|
|12 |   LSTAT |   0.259455 |  0.0525053|
|8  |     RAD |   0.141846  | 0.0203266|
|9  |     TAX|    0.113393   |0.0176602|
|7  |     DIS |  0.0738827|   0.0178893|
|10 | PTRATIO  | 0.0643727 |  0.0205021|
|6  |     AGE   |0.0587429  |  0.010226|
|4  |     NOX|   0.0521941   |0.0235265|
|2  |   INDUS |  0.0425453|   0.0185133|
|0  |    CRIM  | 0.0258689 | 0.00711088|
|11 |       B   | 0.017638  |0.00689625|
|3 |    CHAS |  0.0140639|  0.00568843|
|1 |       ZN | 0.00434593|  0.00582095|

サポートベクターでの計算だと、今まではどの特徴量が影響していたかわかりませんでしたが、`permutation_importance`が実装されたので、これでどの特徴量が影響しているか、よくわかるようになりました。
Nuxt.jsをやってて眼からウロコだったこと

4月からプログラマーになったエラです。

「Javascriptって、まあ聞いたことあるけど」
「Vueって、まあ聞いたことあるけど」
……みたいな感じから今はNuxt.jsを今やってます。

こんな感じなので、勉強中に「??」となることが多く、勉強してるだけで毎日目からウロコです。

……てことで、ためになったことをまとめていきます。

##1.layout/default.vueを他ページでも使うことができる

以下のようなdefault.vueがあったとき

```layout/default.vue
<template>
  <div>
    <nav class="navbar navbar-expand-lg navbar-light bg-light mb-3">
      <div class="container">
        <a class="navbar-brand" href="/">Task List</a>
      </div>
    </nav>
    <div class="container">
      <Nuxt />
    </div>
  </div>
</template>

<script>
  export default {}
</script>

<style>
.container {
  margin: 0 auto;
  max-width: 480px;
}
</style>
```

この`<Nuxt />`と言う部分に他のVueファイルが適用されます。

たとえば`pages/index.vue`のファイル、つまり`http://localhost:3000`にアクセスしたとき、もし`pages/index.vue`が以下のようであれば

```pages/index.vue
<template>
  <div>
    <router-link class="btn btn-light" to="/form">
      投稿画面
    </router-link>
    <br><br>
    <ul class="list-group list-group-flush">
      <li class="list-group-item" v-for="message in messages">
        <div>
          {{ message.name }}
        </div>
        <div>
          {{ message.message }}
        </div>
      </li>
    </ul>
  </div>
</template>

<script>

  export default {
    data() {
      return {
        
      }
    },
    computed:{
      messages(){
        return this.$store.state.chat.messages
      }
    },
    async mounted() {
     await this.$store.dispatch("chat/getMessages")
    },
  }
</script>

<style>
</style>
```

こんな感じ↓↓になります。

![スクリーンショット 2020-08-14 21.48.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550650/f03adffb-2e74-6b53-95b3-512d96815004.png)

まあ、つまり`layout/default.vue`内で定義した大枠のなかに`pages/index.vue`という小さな枠組みが入ってるわけです。

でどういう仕組みで入ってるかって言うと`layout/default.vue`の`<Nuxt />`って言う部分に`pages/index.vue`の中身が入ってくるわけです。

うーん、なるほど。

##2.Vuex Router

これはNuxt.jsに限った話じゃないですが状態管理Vuex Routerが便利です。

Vuex Routerは簡単に言うと

- storeディレクトリにjsファイルを作る
- そのjsファイルでデータを管理する

ってかんじですね。

例えばこんな感じ↓。

```store/chat.js
export const state = () => {
    return {
      messages: []
    }
}
  
export const mutations = {
    ADD_MESSAGE(state,message){
      state.messages.unshift(message)
    },
    LOAD_MESSAGE(state,messages){
      state.messages = messages
    } 
}
  
export const actions = {
    async getMessages({commit}){
      const db = this.$fb.firestore()
      const result = await db.collection("messages").get()
      commit("LOAD_MESSAGE",result.docs.map((d)=>d.data()))
    },
}
```


そして一つ決まりがあってそれは**このjsファイルは、stateとmutationとactionsをexportするのがきまり**ってことです!

詳しい説明はいったん置いといて、**この3つ絶対export必要**ってことだけ覚えといてください!!

[VuexのMutationとActionの切り分け](https://qiita.com/frost_star/items/4620957fce888150e4cc)



##あとがき

あとは以下のことも分かりました。

すみません完全に走り書きです。

↓のことはのちのち記事にします!!

```
[アクセス制御をやりたい場合]
nuxt.jsでナビゲーションガードはむり。
やるならmountedでv-ifでユーザー認証をした方がいい。
大規模な開発ならlayoutできちんとやった（mountedでv-ifでnuxtタブごと消すと良い）ほうがいい。
```
UnityでLightingがうまくいかないときのトラブルシューティング

#はじめに
こんにちは、ZeniZeniです。
最近はVRChatなりClusterなりが有名になり、Unityを使ってワールドを作る人が増えていると思います。
そんなワールドづくりには必須の工程、LightのBakeがあります。
ただこの工程割と躓くポイントが多いと思います。（影がBakeされなかったり特定のオブジェクトだけLightがBakeされなかったり…）
この記事ではその躓きポイントというか気をつけるポイントをまとめてみました。

またこの記事ではLightingの最適化に関わる話はしません。
影の描画方法(ShadowMaskとかSubtractiveとかの)や反射光については別記事を参照してください。

#確認場所
今回はUnity2019.4を用いて説明します。
異なるバージョンだと設定項目の名前や場所が変わっていると思いますので気をつけてください。

##Lightingウィンドウ
Unity EditorのWindow->Rendering->Lighting Settingsから開くことができます。
環境光の調整や、LightのBakeをどれくらいの精度で行うかの設定をします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281560/485bdb07-fa87-3da6-e775-f323bbd91677.png" width="400">
ここのMixedLightingの設定がオフになっているとBakeができません。すぐにオンにしましょう。
ここがオフになっていると、LightコンポーネントのModeでBakedやMixedが下図のように選択できない状態になっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281560/59a98317-d5c7-017b-df35-2fd7160bb7c5.png)


##Qualityウィンドウ
Unity EditorのEdit->Project Settings->Qualityから開くことができます。
リアルタイムに描画するライトの数や影の描画方法、精度を設定します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281560/c506a741-6c18-8fde-20e0-b98d9f92b0bb.png" width="400">

##Lightコンポーネント
光源です。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281560/953593ca-903c-2348-5a42-d80ac1816083.png" width="400">
ここのmodeがMixedかBakedになっているか確認してください。なっていないとBakeができません。
またShadow TypeをHard ShadowsかSoft Shadowsにしてください。No Shadowsになっていると影がBakeされません。
（光だけならNo ShadowsでもBakeされます。）


##MeshRendererコンポーネント
光や影を受ける物体です。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281560/66736da0-4f07-635c-d1f5-d8e2c9e413e1.png" width="400">
ここのLighting項目で、Cast ShadowsをOffにしているとこの物体の影が生成されません。Onにしましょう。
またReceive Shadowsをオンにしないと影がこの物体にBakeされません。オンにしましょう。

##fbx Import Settings
Projectウィンドウのfbxファイルを選択するとInspectorに表示されます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281560/f33d97f8-01c1-b4e8-6401-661dcfd2a5c3.jpeg" width="400">

これ一番気づきにくいと思うんですが、ここのGenerate Lightmap UVsをオンにしないとこのfbxを使っている物体に光も影もBakeできません。Realtimeのライトの影響は受けるのがほんと紛らわしいんですよね。

##Lightトグル
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281560/e86b10b3-cc65-c7ef-8a33-93b29926f5f0.jpeg" width="400">
これはSceneビューだけの影響ですが、ここのトグルがオフになっているとSceneビューではLightの影響を受けない画面になります。
まだLightのBakeを一度もしてない場合は光に当たっていないところは真っ暗で作業しにくいので、オフにしておくと便利です。

#おわりに
とりあえず僕が思いつく限りのことを書いてみました。
もしかしたら他にも原因はあるかもしれません。
もしありましたら編集リクエストかコメントを飛ばしてくださると嬉しいです。
php.ini ディレクティブ モードと設定ファイル

PHP でファイルアップロード処理を実装する場合
雑に `.htaccess` で `post_max_size` や `upload_max_filesize` を変更したり
メモリでコケたら `ini_set()` で `memory_limit` を変更することがある
あるよね？
（環境構築時に要件に応じた設定ができていれば、それがベストなんだろうけど）

今回、`upload_tmp_dir` ディレクティブを変更する際、恥ずかしながら初めてモードの存在を知ったので
自分への戒め

# PHP ディレクティブ モード
PHP ディレクティブには
以下のいずれかのモードが定義されており、モード毎に変更を指定可能な方法が異なる
https://www.php.net/manual/ja/configuration.changes.modes.php

例えば `upload_tmp_dir` ディレクティブは `PHP_INI_SYSTEM` モードであるため
`.htaccess` や `ini_set()` では**変更できない**
https://www.php.net/manual/ja/ini.list.php

# 設定ファイル
|設定ファイル|区分|影響範囲|備考|
|---|---|---|---|
|[php.ini](https://www.php.net/manual/ja/configuration.file.php)|PHP|全体||
|httpd.conf|Apache|全体||
|.htaccess|Apache|ディレクトリ単位||
|web.config|IIS|ディレクトリ単位||
|[.user.ini](https://www.php.net/manual/ja/configuration.file.per-user.php) |PHP|ディレクトリ単位|PHP 5.3.0 以降|
|[ini_set()](https://www.php.net/manual/ja/function.ini-set.php)|PHP|スクリプトレベル||


ただし、Web サーバ（Apache、IIS）により使用できる設定ファイルが異なる

例えば `PHP_INI_PERDIR` モードのディレクティブを変更する場合
よくある Apache サーバの場合は `.htaccess` や `httpd.conf` を使用できるが
Windows 上で稼働している IIS サーバの場合は `web.config` を使用して設定を行う必要がある
または `.user.ini` を使用した PHP 側での変更も可能
【Node.js mysql】mysql接続　データを取り出す

##【ゴール】
mysql接続　データを取り出す


##【開発環境】
■ Mac OS catalina
■ Homebrew 2.4.9
■ mysql Ver 8.0.21

##【実装】

###appを作成
＊***homebrewのインストールが事前に必要です***
＊***mysqlのインストールが事前に必要です***
＊mysqlのコマンドも合わせて覚えれます


```mac.terminal
// ディレクトリ作成

$ mkdir js
$ cd js
$ npm init -y
$ npm install express
$ npm install ejs
$ npm isntall mysql
$ touch server.js
$ touch app.ejs

// mysql でDATABASEを作成

$ mysql -u root -p
$ mysql> CREATE DATABASE JS;
$ use JS;
$ CREATE TABLE User (id int auto_incremet, name char(10));
$ INSERT INTO User value (1, tarou);
```

###コーディング
①
■　npmのmysqlを読み込み。
■「createCOnnection」で({})内の任意のDBに接続

②
■　cosnt sql = データベースへの命令を定数へ
■「query」メソッドで、DBへ命令
■「if(err) throw err;」はエラーがあっても挙動させる
■「err, result」にDBからのデータが格納されています

```server.js
const express = require('express');
const app = express();

// ①　〜
const mysql = require('mysql');
const connection = mysql.createConnection({
  host: 'localhost',
  user: 'root',
  password: 'あなたのsqlのパスワード',
  database: 'JS'
});
// ここまで

function views (){
  app.set('views', 'views'),
  app.set('view enigine', 'ejs');
}

app.get('/', (req, res) => {
　// ②　〜
  const sql = 'select * from User id = 1';
  connection.query(sql, (err, result) => {
    if(err) throw err;
    console.log(result);
    views();
    res.render('app', {user: result} );
  })
　// ここまで②
})

app.listen(3000, (req, res) => {
  console.log('success');
})
```

```js:app.ejs
<%= user.id %>
<%= user.name %>
```

###確認
＊localhost 3000接続

```mac.terminal
$ node app.js
success
```

以上


##【合わせて読みたい】

■ 【HOMEBREW】 Mac OSのパッケージマネージャーについて node.jsやってたら学んだ事
https://qiita.com/tanaka-yu3/items/65dac47443cc08914a86

■【node.js】 node.jsインストール 芋っていたけど、簡単だった件...
JavaScript
https://qiita.com/tanaka-yu3/items/739db5ffed24a8d9ae4b

■DBonline
https://www.dbonline.jp/
[Elixir]文字列中のパタン出現頻度をカウントする

Elixirで文字列の頻度を求めたいと思って調べた際の実装メモです

### 求めたいパタンが1通りの場合
例:関数alter_altarは入力`seq`について、`R`の出現頻度を求めています。

```elixir
  def alter_altar(_n, seq) do
    r_count = Regex.scan(~r/R/, seq)
            |> Enum.count
```

`Regex.scan`については下記を参照
https://hexdocs.pm/elixir/Regex.html#scan/3

説明:
`Regex.scan(~r/求めたいパタン/)`とします。
`Regex.scan`を実行したままだと、マッチしたパタンを要素とするリストになっています。
例:入力`WWWRRRWWWRRRRRRRW`
に対して、`Regex.scan(~r/R/)`を実行すると以下になります。

```elixir
[["R"], ["R"], ["R"], ["R"], ["R"], ["R"], ["R"], ["R"], ["R"], ["R"]]
```
このため、`Enum.count`で頻度を求めます。
`Enum.count`については下記を参照。
https://hexdocs.pm/elixir/Enum.html#count/1

### 求めたいパタンが複数の場合
上記を複数パタンに拡張します。※ほぼほぼBag of Wordsです

```elixir
defmodule Main do
  def frequency_dist(patterns, seq) do
    frequency_dist = Enum.map(patterns, fn pattern -> Regex.scan(~r/#{pattern}/, seq) end)
                |> Enum.map(fn x -> Enum.count(x) end)
  end

 def main do
    patterns = IO.read(:line) |> String.trim() |> String.split()
    seq = IO.read(:line) |> String.trim()
    IO.inspect frequency_dist(patterns,seq)
 end
end
```

関数`frequency_dist`は頻度を求めたい文字列パタンのリスト`patterns`と対象文字列`seq`の入力に対し、出現頻度のリストを返します。
例:
入力:
W R E F
WERWWWRRRRRRRRRRRRRRRR
に対して、以下の結果になります。

```bash
[4, 17, 1, 0]
```

#### 補足:
同じようにパタンを求める関数として、`Regex.run`があります。
https://hexdocs.pm/elixir/Regex.html#run/3

しかし、`Regex.run`はマッチした最初のパタンを返します。
例:入力`WWWRRRWWWRRRRRRRW`
に対して、`Regex.run(~r/R/)`を実行すると以下になります。

```elixir
["R"]
```
こちらは出現頻度のカウントではなく、パタンの存在判定等に使えそうです。


サンプルは以下の問題を説いたときのものです
[D - Alter Altar](https://atcoder.jp/contests/abc174/tasks/abc174_d)
CRUDとresourcesメソッド~3密どころではない関係~

【概要】
----------------------------------------

<b>1.結論</b>

<b>2.CRUD,resourcesメソッドとは何か</b>

<b>3.なぜCRUD,resourcesメソッドが必要か</b>

<b>4.ここから学んだこと</b>

<b>5.余談</b>

<br>

1.結論
----------------------------------------

⭐️<b>webアプリケーション</b>に必要な<b>4つの概念</b>（<b>7つのアクション</b>）の主要機能⭐️

<b>Create</b>＝<b>new</b>+<b>create</b>
<b>Read</b>＝<b>index</b>+<b>show</b>
<b>Update</b>＝<b>edit</b>+<b>update</b>
<b>Delete</b>＝<b>destroy</b>

<br>
2.CRUD,resourcesメソッドとは何か
----------------------------------------

●CRUDとは、
<b>Create</b>:登録機能
<b>Reading</b>:参照機能
<b>Update</b>:変更機能
<b>Delete</b>:削除機能
の処理の頭文字を取ったものです！
<br>
●resourcesメソッドとは”CRUD"を実現するためのメソッドで、
<b>new</b>:新規作成
<b>create</b>:保存
<b>index</b>:一覧表示
<b>show</b>:詳細表示
<b>edit</b>:編集
<b>update</b>:更新
<b>destroy</b>:削除
のRuby on Railsの慣習的な7つのアクションが1セットになったメソッドになります！
<br>
3.なぜCRUD,resourcesメソッドが必要か
----------------------------------------

結論から申し上げますと、
<b>webアプリケーションを作るために必須の概念とアクションなんです！</b>

CRUDは4つの概念（規則）であり、
resourcesメソッドはCRUDを行うための行動（アクション）なんです。
Amazonでも、楽天でも、Twitterでもこのアクションは必ず入っています！

むしろ入っていないと、一般的に我々が使用している
Webアプリケーション機能を果たせません！

CRUDのそれぞれの概念に対応しているアクションが全てあるので、
3密どころか7密ですね笑

<br>
4.ここから学んだこと
----------------------------------------
<br>
i)CRUDの４つの概念をさらに細かく7つのアクションに落とし込むことで
　一つの概念をより細かいアクションで理解することができました！

ii)Webアプリケーションを作るには基本的な考え方があり、
　その仕組み作りの部分でCRUDを基本に肉付けしていくという
　フレームワークを知ることができました！
<br>

<b>5.余談</b>
----------------------------------------
では、Railsにその本来備わっている7つのメソッド以外に
どうやってroute.rbにアクションをつけるかということは
次回の”collection,memberメソッド”をお楽しみに！
<br>
vimでterraform-lspを使いたい

# はじめに
vimに入門しました。terraformの勉強を始めたんですが、lspとやらが便利とのことなので試してみることにしました。

# 環境

|||
| ---- | ---- |
| OS | macOS Catalina 10.15.5 |
| 管理ツール | Homebrew |
| plugin管理 | dein |
| terraform | 0.12.5 |

### 注意

terraformのバージョンは、`0.12.20`より小さくしておいてください。
参考
・[hashicorp/terraform-ls](https://github.com/hashicorp/terraform-ls)
・[juliosueiras/terraform-lsp](https://github.com/juliosueiras/terraform-lsp)

# 下準備

terraform-lspを動かすためのLSPを用意しなければなりません。[coc.nvim](https://github.com/neoclide/coc.nvim)をインストールします。プラグイン管理はdeinを利用しているため、以下を追記しました。

```
call dein#add('neoclide/coc.nvim', {'merged':0, 'rev': 'release'})
```

coc.nvimを動かすためにはnodeが必要です。インストール済みでない場合は、homebrewでインストールしましょう。

```
$ brew install node
```

これで下準備は完了です。

# インストール

terraform-lspを利用するためには、goが必要です。インストールしていない場合は、homebrewでインストールしましょう。

```
$ brew install go
```

[juliosueiras/terraform-lsp](https://github.com/juliosueiras/terraform-lsp)を利用します。またterraform-lspは`~/.bin`にセットアップされるため、初回はパスを通す必要があります。

```
# terraform-lspのインストールとセットアップ
$ git clone https://github.com/juliosueiras/terraform-lsp
$ cd terraform-lsp
$ GO111MODULE=on go mod download
$ make
$ make copy

# パスを通す
echo 'export PATH=$PATH:~/.bin' >> ~/.bash_profile
source ~/.bash_profile
```

プラグインのインストールが完了したら、`coc`の設定をしていきましょう。vimで以下のコマンドを叩くと、`~/.vim/coc-setting.json`を編集することができます。

```
:CocConfig
```

terraform-lspのVim Supportより
[Vim Support](https://github.com/juliosueiras/terraform-lsp/blob/master/docs/editors/vim.md)

```~/.vim/coc-setting.json
{
	"languageserver": {
		"terraform": {
			"command": "terraform-lsp",
			"filetypes": [
				"terraform",
				"tf"
			],
			"initializationOptions": {},
			"settings": {}
		}
	}
}
```

# 使い方

[juliosueiras/terraform-lsp](https://github.com/juliosueiras/terraform-lsp)で利用方法の動画あるので確認してください。
3D printerを買ったので動作確認で参考になったサイトメモ

主にCURAに関連するものばかり
# Raspberry pi4でCURAを入れてコントローラーとして使う
インストールができなかったので、このスレッドを辿った先に投稿してあるarm版CURAを使用した
https://www.raspberrypi.org/forums/viewtopic.php?t=245946#p1501682
https://www.dropbox.com/sh/s43vqzmi4d2bqe2/AAASiiMZ-POarJas3LXTn5Rca/Linux-armhf?dl=0&subfolder_nav_tracking=1

# モデルが途中で台から剥がれてしまう
台の温度設定が低すぎる
PLAは冷却されると収縮するため、冷却速度が早いと台から剥がれてしまう。
台の温度設定があるのでPLA素材に応じで温度を設定する。PLA購入時にメーカーサイトを見れば記載されている

# 糸引をしている
糸引はノズルが移動しているときにPLAが垂れてしまうことで発生する
そのため、PLAの引き込み距離や速度を上げてやることで解消できる
http://flashforge.co.jp/troubleshooting_top/model/cowwebbing/

# 一つのモデルで温度設定を振ってみる、速度を振ってみて出来の確認をする
PLA材質の特性を図りたい場合など、同一モデルで複数の設定を使って試したい場合があると思います。
数十分の時間　 x 設定分　モデルを作成するよりも、一つのモデルの中で設定を変えて行った方が効率的でしょう。
CURAの拡張の後処理のメニューで、適応レイヤー毎に設定を変更することが可能なのでこれを活用してみると良い

https://note.com/y_labo/n/nf36e9f2d7cd1

# 色々細かい設定
https://note.com/y_labo/n/nee490a276494
https://garchiving.com/adaptivelayer-of-cura/
https://voltechno.com/blog/3dprinting-cura/#Print_Speed_造形速度

CURAは細かい設定が多くて、設定が出力結果に与える影響が全然わからないので先駆者たちの記事が大変参考になります。
人事がプログラミングをかじってみる #2変数

お盆ですね～。お仕事お休みですが都内在住で外出もできないので、おうちでプログラミングをちょっとだけ頑張っております。

背景は前回の記事をご覧ください。 
https://qiita.com/Ayanaru/items/87d5516f7005d24bf0ea

今回は、変数。

#変数とは
変数(variable) は、値を代入することができるハコみたいなもの。いろいろ便利みたいです。今回はその魅力に迫ります。

#データに名前をつけられる

例えば、一人X円でY人でした。合計いくらでしょう？
合計金額 = X x Y
これをPythonで書くとこうなります。

```python
total_price = price * count
```
変数の名前は自由に設定でき、英単語を使ってわかりやすく表現できます。
この値を代入できるXやYみたいなものを「変数」といいます。

例えば、飲み会で集まる金額を毎回計算してくれるシステムを作るとします。
一人3000円で30人だったらそれを入力して、合計金額の「90000」だけ出力。

```python
price = 3000 #ユーザーが金額を入力する
people = 30  #ユーザーが人数を入力する
total_price = price * people  #式に変数が代入される
print(total_price)  #「90000」と表示される
```

この後に別の値を代入すると、上書きされます。
次は一人5000円で10人にしてみましょう。

```python
price = 5000
people = 10
total_price = price * people
print(total_price)  #「50000」と表示される
```

前回学んだことを応用して、表示を文章にすることもできます。
「本日のお会計は50000円です。」と文章で表示させましょう。

```python
print ('本日のお会計は' + str(total_price) + '円です。')
# 「本日のお会計は50000円です。」と表示される
```

strはstringの略。「文字列」という意味です。
**出力したい文中に数値がある場合は、str()を使います。**


#同じ値を繰り返し使える
例えば正方形の面積の計算

```python
length = 5 #一辺の長さ
area = length * length #面積を求める式
print(area)  #25
```
数値が大きくなっても、一辺の数字を入力すれば、面積が出力される。
大きい数字を繰り返し入力する必要がなくなります。

```python
length = 123456 
area = length * length
print(area)  #15241383936
```

簡単な例だけ見ているとあまり実感はわかないので、エンジニアが実際にどんなときに変数を使うのか、今回も聞いてみました。

#変数を使うメリット

ウェブサイトの中で何回も同じデータを読み込みたい箇所がある場合、何ヶ所もそのデータを入力することになってしまいます。また、そのデータに変更があった場合、何ヶ所も同じことをアップデートしないといけません。

でも変数を使えば、最初に定義している変数を直すだけ、つまり、一ヶ所直すだけで、残り全部反映されるわけです！！

これだけでも、膨大なデータや複雑な計算を繰り返すとき、プログラミングがすごく役に立つことが想像できました。

そんなところで今回は、ここまで。最後まで読んでいただきありがとうございました。
iOSのネットワーク接続状態の検出にはReachabilityよりシンプルなNWPathMonitorを使いましょう。

iOSでネットワーク接続状態の取得といえば`Reachability`を使うといった印象が強くありませんか。

`Reachability`を使うには、まず
https://developer.apple.com/library/archive/samplecode/Reachability/Introduction/Intro.html
からApple の提供しているサンプルコードをダウンロードして・・・なんて手間がありましたが、もっと手軽に利用できるApple標準のクラスがありました。

# 簡単にネットワーク接続のモニタリングが可能
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">ライブラリいらずで、iOSのネットワーク接続状態監視にはNWPathMonitor使うとよいことを知った。30行くらいで書ける。 <a href="https://t.co/X6e8C0YAq8">pic.twitter.com/X6e8C0YAq8</a></p>&mdash; Natsui@🏡iOSエンジニア (@MeSummery) <a href="https://twitter.com/MeSummery/status/1294243597399687169?ref_src=twsrc%5Etfw">August 14, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# NWPathMonitor
ネットワークの接続状態やネットワークインターフェースなどの情報をモニタリングできる`Network framework`のクラス。**iOS 12.0以降から利用可能。**
https://developer.apple.com/documentation/network/nwpathmonitor

# 実装ステップ
利用箇所でまずフレームワークをインポートしておきましょう。


```swift
import Network
```

### モニタリング用クラスのインスタンス化
解放されるとコールバックが受け取れないので、`ViewController`のプロパティなどとして保持しておきましょう。

```swift

let monitor = NWPathMonitor()
```

`requiredInterfaceType`引数を指定して、ネットワークインターフェース別にモニタリングすることも可能です。

```swift
let wifiMonitor = NWPathMonitor(requiredInterfaceType: .wifi)
```
サポートしているインターフェースのタイプは以下に記載があります。
https://developer.apple.com/documentation/network/nwinterface/interfacetype

### ネットワーク接続状態の変更をハンドリングする

```swift

monitor.pathUpdateHandler = { path in
    if path.status == .satisfied {
        // Connected
    }
}
```
後述しますが、モニタリングは通常バックグラウンドキューで指定して実行されます。
**クロージャー内でUIを操作する場合には、メインスレッドで行うようにしましょう。**

### ネットワーク接続状態のモニタリングを開始する
モニタリングイベントを配信するための`DispatchQueue`を定義して、モニタリングを開始します。

```swift

private let queue = DispatchQueue(label: "com.sample")
monitor.start(queue: queue)
```

# ソースコード全体
```swift
import UIKit
import Network

final class ViewController: UIViewController {

    private let monitor = NWPathMonitor()
    private let queue = DispatchQueue(label: "com.sample")

    override func viewDidLoad() {
        super.viewDidLoad()

        monitor.pathUpdateHandler = { path in
            if path.status == .satisfied {
                print("Connected")
            } else {
                print("Not Connected")
            }
        }

        monitor.start(queue: queue)
    }
}

```

# まとめ
動画で載せたデモアプリの実装ですが、`ViewController`内を30行前後で書くことができました。
iOS12以降対応ですし、実用性もばっちりですね。
「ネットワーク接続状態の検出には`NWPathMonitor`！」が定着すれば良いなと思います。

以上です :tada:
ありがとうございました。
入力フォームの文字をtwitterに共有する方法

## 完成版
![スクリーンショット 2020-08-14 20.34.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613591/b1e9caab-2f81-3305-6eca-780628d2f60b.png)
入力してボタンを押すと、
![スクリーンショット 2020-08-14 20.36.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613591/c01729ae-64b5-10bc-a1c8-adc42f7e2e83.png)
このようにご自身のTwitterアカウントに文字が入力されている状態です。

## 作成 
使用環境： HTML5

```html:index.html
<!--入力フォーム-->
<input type="text" id="content">
<!--ご自身のTwitterアカウントへ行きます-->
<button id="twitter" class="btn" type="button">Tweet</button>

<script>
  // twitter共有機能
        document.getElementById("twitter").addEventListener('click', function(event) {
        event.preventDefault();
        var left = Math.round(window.screen.width / 2 - 275);
        var top = (window.screen.height > 420) ? Math.round(window.screen.height / 2 - 210) : 0;
        window.open(
            "https://twitter.com/intent/tweet?text=" + encodeURIComponent(document.getElementById("content").value),
            null,
            "scrollbars=yes,resizable=yes,toolbar=no,location=yes,width=550,height=420,left=" + left + ",top=" + top);
    });
</script>    
```
これで共有機能が完成しました。

bootstrapやCSSを導入するとtwitterのボタンらしくなります
使用環境： HTML5 Bootstrap4

```html:index.html
<!--buttonスタイルを整える-->
<button id="twitter" class="btn" style="background-color:#00aced; color:white;" type="button"><i class="fab fa-twitter"></i> Tweet</button>

<input type="text" id="content">
<script>
  // twitter共有機能
        document.getElementById("twitter").addEventListener('click', function(event) {
        event.preventDefault();
        var left = Math.round(window.screen.width / 2 - 275);
        var top = (window.screen.height > 420) ? Math.round(window.screen.height / 2 - 210) : 0;
        window.open(
            "https://twitter.com/intent/tweet?text=" + encodeURIComponent(document.getElementById("content").value),
            null,
            "scrollbars=yes,resizable=yes,toolbar=no,location=yes,width=550,height=420,left=" + left + ",top=" + top);
    });
    
</script>

<!--bootstrap導入-->
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.6/umd/popper.min.js"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js"></script>
<script defer src="https://use.fontawesome.com/releases/v5.7.2/js/all.js"></script>
    
```
![スクリーンショット 2020-08-14 21.02.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613591/82cf195e-ce3b-a6ff-a2c2-7ae8dd617d5b.png)

先程よりtwitterのボタンらしくなりました。

##参考
text_areaの内容をtwitterにシェアする　https://teratail.com/questions/172448