OmniAICreator/Qiita-1.07M huggingface dataset:
Windows 上のUbuntu Linuxその他で動かすHPCベンチマーク

Twitter上にアップロードしたベンチマーク結果のまとめ。
ベンチマークソフトは
[YAMADABenchmarkSuite](https://qiita.com/telmin_orca/items/2d30323a7c96db929ecf)の「RyzenをHPCで使おうとしたベンチマーク」から流用。

以下は、STREAMというメモリ帯域幅を見るプログラムの実行結果。
配列のサイズを1M～64Mぐらいに変えながら実行。
実行回数は50回

スクリプトは以下の通り。
\\$ for i in 1 2 4 8 16 32 64; do echo \\$i ; ./stream_cxx.out --numtimes 50 --arraysize $i\M ; done

# ASRock Phantom Gaming 4 with Ryzen5 3600X(6C12T)
ASRock Phantom Gaming 4
Ryzen5 3600X 6C12T
AMD X570 Chipset DDR4-2666 CL19-19-19 (16GBx2 = 32GB)
1TB-SSD Crucial P1 (NVMe)
6TB-HDD WDC WD60EZAZ(5400rpm) 256MB-Cache 4K-Sector
Windows10 Pro 1903 Build 18362.418
 with Debian 10.1(Buster)
![alt](https://pbs.twimg.com/media/EHuV0NcUcAED_zm?format=jpg)
最初だけ圧倒的に速い。これはキャッシュに全部載ってたに違いない。
最初のデータをカットして多少見やすくしてみる。
![alt](https://pbs.twimg.com/media/EHuXMBDUYAEuQA4?format=jpg)
妙に伸びるのはキャッシュの威力よね、これ。

# Acer Nitro5 Corei5 8300H
Acer Nitro5 AN515-52-F58G
Core i5 8300H 2.30GHz \[Boost 4.0GHz\] (Coffee Lake) 
HM370 Chipset DDR4-2666/16GB
1TB-HDD(5400rpm)+16GB Optane
Windows10 Home 1803 Build 17134.829
 with Ubuntu 18.04 LTS
![alt](https://pbs.twimg.com/media/D-orpzLVUAAxiLA?format=jpg)
Corei5だからそれなりの性能だろうと思ってたら何なんだこの結果は。
ゲーミングノートは妙にはえぇぞ。なんでこんなに速度を稼げるんだ？

# Deskmini A300 Ryzen5 2400G
ASRock Deskmini A300
Ryzen5 2400G DDR4-2400/16GB
CT500MX599SSD1/465GB
Windows10 Pro 1809 Build 17763.557
 with Ubuntu 18.04 LTS
![alt](https://pbs.twimg.com/media/D-kBFjzU4AUN0NV?format=jpg)
これが自分のメイン機。
先日組んだばかりで、小さくてパワフルなのがお気に入りだった。
しかし、Corei5に負けているとは知らなかった。
とっても悔しいったらないぞ。

# Critea VF-AG Corei7 4700MQ
Core i7-4700MQ 2.4GHz (Haswell)
MicroStar MS-1758 HM386 Chipset
DDR3 PC3-12800/16GB
HGST HTS545050A7E380
Windows10 Pro 1903 Build 18362.207
 with Ubuntu 18.04 LTS
![alt](https://pbs.twimg.com/media/D-pdau4U0AEUPh6?format=jpg)
自分がサブ機で使ってる大型ノートPC。
消費税が上がる前に駆け込みで買ったせいでトラブルが多かったが、
当時頑張って投資した分、スピードは今でも普通に使えるレベル。

# Sandy Bridge Corei7 2600K
Core i7-2600K DDR3 PC3-12800/16GB
Colorful SL300 148GB
Intel H67 Express Chipset
Windows10 Pro 1903 Build 18362.207
 with Ubuntu 18.04 LTS
![alt](https://pbs.twimg.com/media/D-kIv_rUIAAi_ts?format=jpg)
現在はストリーミングを見るために使ってるロートル機。
実はDeskminiが完成するまでずっとメイン機だったPC。
正直な所、ブラウザで動画見てると度々ひっかかるのでそろそろ使うのが苦しいところ。

# SONY VAIO Core i7 620M
Core i7-620M DDR3 PC3-8500/8GB
TOSHIBA THNSNA480GESC 480.1GB
Intel HM55 Chipset
Windows10 Home 21H2 Build 19044.1620
 with Debian 11.3 (Bullseye)
![alt](https://pbs.twimg.com/media/D-kIv_rUIAAi_ts?format=jpg)
車載で酷使してたVAIOを退役させたのでWSL2を入れてみた。SSDは70%台まで劣化してるが、バッテリーは優秀な充電制御でまだ元気。SPECTRAとかMELTDOWNのパッチは出ていないはずだが、どこで使おう。
for /f を応用させた　お掃除バッチ

for /f を利用して
更新日時が昨日までのtxtファイルを削除する

トークンの切り出しを行う関係上、空白の存在するファイル名には未対応
for のオプション　/f　は　in で指定する文字列に
" " で指定するトークンを切り出し、変数に格納し、doに処理させる。

```cmd:clean.cmd
@echo off

rem 環境変数の遅延展開
setlocal enabledelayedexpansion

rem 作業フォルダを移動
c:
cd c:\temp

rem date /t コマンドの第一トークンを取得
for /f "tokens=1" %%a in ('date /t') do set HONJITSU=%%a

rem dirコマンド(タイムフィールド:最終更新日)にて該当するファイルを抽出する。
rem 4行分はスキップし、第一トークンから第四トークンまでを 変数b(c,d,e)に順次格納する
rem 区切り文字はdelimsで指定する（ここでは空白文字）

for /f "skip=4 tokens=1-4 delims= " %%b in ('dir /tw "???????????.txt"') do (

rem dir コマンドの結果、はリストに"個のファイル"が出るまで
if "%%c"=="個のファイル" goto END

rem 更新日を取得
set KOUSHINBI=%%b

rem 取得した本日の日付と該当するファイルの更新日が異なれば...削除しなはれ
if not "!HONJITSU!"=="!KOUSHINBI!" (
@echo %%e:::::deleting
del /Q %%e
) else (
@echo %%e::::notDelete
)
)
endlocal
:END
pause
```

ちなみに先月までのものを・・・・としたければ日付の判定部で
`"!HONJITSU:~0,-3!"=="!KOUSHINBI:~0,-3!"`
のようにすればよい
【SpringBoot】メールを送信する

`spring-boot-starter-mail`を使ってmailを送信します。
SpringBootは2.0.9で書いています。

# 依存を追加
`spring-boot-starter-mail`の依存を追加します。

```xml:pom.xml
    <!-- 省略 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-mail</artifactId>
        </dependency>
    <!-- 省略 -->
```

# 設定を追加
`spring.mail`配下に以下を設定します。
この設定ではGmail / GSuiteユーザーにのみメールを送信できます（後述）。

```yaml:application.yml
spring:
  mail:
    host: aspmx.l.google.com
    port: 25
```

## ここで設定した内容について
今回はテスト用ということで、Googleの制限付き Gmail SMTP サーバーを使ってメール送信を行なっています。
この設定では、GmailまたはGSuiteユーザーのみにメール送信が可能です。
Gmail SMTP サーバーに関する詳細はドキュメントを参照してください。

- [プリンタ、スキャナ、アプリからメールを送信する \- G Suite 管理者 ヘルプ](https://support.google.com/a/answer/176600?hl=ja)

## 補足
SpringBootにおけるmail関連設定の詳細はドキュメントの`# Email`に載っています。

- [Appendix A\. Common application properties](https://docs.spring.io/spring-boot/docs/2.0.9.RELEASE/reference/html/common-application-properties.html)

# テスト用の送信コードを追加
以下を追加することで起動時にメールを送ることができます。

```java
import org.springframework.mail.MailException;
import org.springframework.mail.MailSender;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.stereotype.Component;

@Component
public class MailUtil {
    private final MailSender mailSender;

    public MailUtil(MailSender mailSender) {
        this.mailSender = mailSender;

        this.sendMail();
    }

    public void sendMail() {
        SimpleMailMessage mailMessage = new SimpleMailMessage();
        mailMessage.setFrom("test@test.jp"); // 送信元メールアドレス
        mailMessage.setTo(/* 送信先メールアドレス */);
        mailMessage.setCc(/* ccに入れるメールアドレス */);
        mailMessage.setBcc(/* bccに入れるメールアドレス */);
        mailMessage.setSubject("テスト用表題");
        mailMessage.setText("ローカルから送る用テストメッセージ");

        try {
            mailSender.send(mailMessage);
        } catch (MailException e) {
            // TODO: エラー処理
        }
    }
}
```

# 送信結果
以下のようにメールを受け取ることができます。
![スクリーンショット 2019-07-05 20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280230/cabee00f-c74d-0d85-c5f5-c698cbc95291.png)
sudo apt --fix-broken install時のエラー

`apt upgrade`実行時にエラーでハマったときのメモ。


# 問題

```
$ sudo apt upgrade
Reading package lists... Done
Building dependency tree       
Reading state information... Done
You might want to run 'apt --fix-broken install' to correct these.
The following packages have unmet dependencies:
 libhdf5-openmpi-dev : Depends: libopenmpi-dev but it is not installed
 mpi-default-bin : Depends: openmpi-bin but it is not installed
 mpi-default-dev : Depends: libopenmpi-dev but it is not installed
E: Unmet dependencies. Try 'apt --fix-broken install' with no packages (or specify a solution).
```

言われたとおり`apt --fix-broken install`を実行してみる。

```
$ sudo apt --fix-broken install
Reading package lists... Done
Building dependency tree       
Reading state information... Done
Correcting dependencies... Done
The following additional packages will be installed:
  libopenmpi-dev openmpi-bin
Suggested packages:
  openmpi-doc gfortran
The following NEW packages will be installed:
  libopenmpi-dev openmpi-bin
0 upgraded, 2 newly installed, 0 to remove and 8 not upgraded.
8 not fully installed or removed.
Need to get 0 B/1013 kB of archives.
After this operation, 5607 kB of additional disk space will be used.
Do you want to continue? [Y/n] 
Preparing to unpack .../libopenmpi-dev_2.1.1-8_amd64.deb ...
Unpacking libopenmpi-dev (2.1.1-8) ...
dpkg: error processing archive /var/cache/apt/archives/libopenmpi-dev_2.1.1-8_amd64.deb (--unpack):
 trying to overwrite '/usr/bin/opal_wrapper', which is also in package openmpi 4.0.0-2
dpkg-deb: error: paste subprocess was killed by signal (Broken pipe)
Preparing to unpack .../openmpi-bin_2.1.1-8_amd64.deb ...
Unpacking openmpi-bin (2.1.1-8) ...
dpkg: error processing archive /var/cache/apt/archives/openmpi-bin_2.1.1-8_amd64.deb (--unpack):
 trying to overwrite '/usr/bin/ompi_info', which is also in package openmpi 4.0.0-2
dpkg-deb: error: paste subprocess was killed by signal (Broken pipe)
Errors were encountered while processing:
 /var/cache/apt/archives/libopenmpi-dev_2.1.1-8_amd64.deb
 /var/cache/apt/archives/openmpi-bin_2.1.1-8_amd64.deb
E: Sub-process /usr/bin/dpkg returned an error code (1)
```

エラーが出て実行できない...


# 解決策

上記のエラーの最後に書いてある`.deb`ファイルをエラーを強制的に無視してインストール。

```
$ sudo dpkg --force-all -i /var/cache/apt/archives/libopenmpi-dev_2.1.1-8_amd64.deb
$ sudo dpkg --force-all -i /var/cache/apt/archives/openmpi-bin_2.1.1-8_amd64.deb
```
ActiveDirectory 管理シェル ユーザ情報取り出し

ActiveDirectory 管理シェルで、ユーザ情報を引き出すのに苦労したのでメモ

通常表示される値（メンバ）は少なすぎて、例えば、拠点とか事業所とか
そんな値は取れない
中に格納されている値はもっとたくさんあるはずなのにね

やっと辿り着いた引数が、`Properties`
`-Properties DistinguishedName` などとやると、名前が取れるが、１項目しか取れない 
ということで

```powershell
Get-ADUser -Filter * -Properties * | Select-Object Name,DistinguishedName,mail
```
などで好きなものが取れる

後は、

```powershell
Export-Object -NoTypeInformation -Path C:¥hoge.csv -Encoding:Default
```
なんかで、csv出力可能

やっとスッキリした
M5StackからmicroSDにアクセスし、CSVファイル内の数値を読み込む

M5StackにはLCDディスプレイとmicroSDスロットが付いているため、何か集めたデータを手軽に表示するのにピッタリです。
そこで、microSDカードに入ったCSVファイル内の数値を読み込む方法について説明したいと思います。

ここでは、以下のようなデータの入った、Data.csvというファイルの3列目の数字を取得することを目指します。

<img width="652" alt="スクリーンショット 2019-07-05 19.52.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412023/9aafb5b4-ac52-0eb9-271c-39439e243de5.png">


#M5StackからmicroSDにアクセスし、CSVファイル内の数値を読み込む
まずM5StackからmicroSDにアクセスします。
このコードを書くことで、Data.csvファイルにアクセスすることができます。

```SDReader.cpp
void loop() {
  File file = SD.open("Data.csv");

```
続いて、CSVファイルに入っている文字を読み込みます。

続いて、読み込んでいる文字が何列目にあるのかを知るために、読み込んだ文字がカンマであるかどうかを調べます。そしてカンマである場合には、カウンターの値を１つ増やすことにします。今回はint型でconnma_countという文字を用意しました。
そしてカウンターの値が、2で割って余りが0になる時から、文字をカウントします。

```SDReader.cpp

    buf[0] = file.read();
    if(connma_count%2==0 && connma_count>2){
      value[buf_number] = buf[0];
      buf_number++;
    }
     if (buf[0] == ',') {
      connma_count++;
    }
   
   ```
ここで注意するポイントとして、読み込んだ文字を繰り返し用いたい場合には、毎回read()関数を使わずに、一度変数に代入してからその変数を使うようにして下さい。毎回read()を使うと、実行する度に読み込んでいる値が次の文字に更新されてしまいます。

read()関数を一度実行すると、開いたファイルから受け取ったデータを１バイト分だけ返します。そして、もう一度実行すると今度は、すでに読み込んだ文字の次の文字を読み込んで値を返します。
Arduinoなどでよく使うSerial.read()なんかも同じ動きをしていて、loop()内でそれを繰り返すから、シリアルモニタで文字が続いて表示されるのですね。僕はSDカードファイルの読み込みが初めてだったこともあり、今までいい加減に扱っていたread()関数がどのように動いているかを知るいい機会になりました。

そして、カンマが次の区切りになった時に、数値の計算と配列への格納を行いました。こうすることで、セル内の値を数値として扱えるようになります。

```SDReader.cpp
 if(connma_count%2==1&&connma_count>3)
    {
      value = ctoi(value[0])*100+ctoi(value[1])*10+ctoi(value[2]) ;
     }

```
ここで使用したctoi()は、char型の数字をint型に変換するために指定した変数です。

```SDReader.cpp
int ctoi(char c) {
	switch (c) {
		case '0': return 0;
		case '1': return 1;
		case '2': return 2;
		case '3': return 3;
		case '4': return 4;
		case '5': return 5;
		case '6': return 6;
		case '7': return 7;
		case '8': return 8;
		case '9': return 9;
		default: return 0;
	}
}
```
突然localhostに繋がらなくなった→Docker Machineの謎の消失が原因でした

### 発端

<b>環境</b>
OS：Mac OS Mojave ver.10.14.5
Docker：Docker Desktop Version 2.0.0.3
→使用イメージ：php:7.3-apache

体調の都合で初めて在宅業務を行うことになり、さ〜いつも通りdocker起動してlocalhostで作業するぞ〜とURLを叩くと、5分以上待ってもlocalhostを待機して一向にアクセスできない。
curlを叩いてみても…

```
$ curl http://localhost/
```

これもいくら待ってもエラーすら表示されず、ずっと処理を続けている。
このままでは作業が進まない！マズい！

### 原因究明
・会社では問題なく作業できていたので、ネットワークの問題？
　→テザリングでの接続を試すも効果なし、IPアドレスやポートの設定におかしな点はなし
・apacheが起動してないかも？
　→apacheの再起動や、設定ファイル等におかしな点がないか調べるも、解決せず
　
なかなか解決しない中で、Docker MachineのIPアドレスがlocalhostのIPアドレスと一致しているか調べるとよいとの情報を見つけ、コマンドを入力します。すると…

```
$ docker-machine ip
Error: No machine name(s) specified and no "default" machine exists
$
```

<b>Docker Machineがない...?</b>

```
$ docker-machine ls
NAME   ACTIVE   DRIVER   STATE   URL   SWARM   DOCKER   ERRORS
$
```
Why...?

### 解決
ひとまず上司に上記の状況を相談し、じゃあDocker Machine作り直そうということに。

```
docker-machine create --driver virtualbox default
```

作成されたか確認します。

```
$ docker-machine ls
NAME      ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER     ERRORS
default   -        virtualbox   Running   tcp://192.168.99.100:2376           v18.09.7   
```

ちゃんと作成されていますね。
再度localhostにアクセス。

```
$ curl localhost
<html><body><h1>It works!</h1></body></html>
$
```

接続できました。

Docker Machineが消えた理由は未だ不明です…(´･ω･`)
ど素人ができる限りのタイトルを作ってみた

#　はじめに

[未来電子テクノロジー](https://www.miraidenshi-tech.jp/intern-content/program/)でインターンをさせていただいているgk-fujirinと申します。三度の飯より自転車が大好きです。
全くのプログラミング初心者であるため、内容に誤りがあるに違いありません。
もし、誤りがあれば修正するのでどんどん指摘してもらえると嬉しいです。

#　学習状況
現在はprogateの道場編初級をクリアしたところです。
学習を始めて３週間ですが、遅々として進みません。
しかし、ここまで続けているということは、少なからず楽しさを見出しているということかもしれませんね。

書籍でタイトルが重要であるように、ウェブページでもタイトルが重要だと思うので、タイトルの作成方法を復習してみようと思います。

##　通常のタイトル
まずは、htmlでタイトルをつくります。ついでにクラスも

```ruby:qiita.rb
puts '<div class="header-logo">ど素人のタイトル</div>'
```

続いて、CSSを作成。タイトルが左上に来るようにします。
また、フォントサイズやpaddingも。
ちなみに、paddingは枠線の内側の余白を作りたいときに使います。marginは逆に外側です。
paddingとmarginの違いがなかなか覚えられません。

```ruby:qiita.rb
puts '.header-logo{
  float:left;
  font-size:36px;
  padding:20px 40px 20px 40px;
}'
```
完成！
 

##　下線のあるタイトル
Progateの初級編で下線を引くことを覚えたので、試してみます。
htmlはそのままで、CSSにborder-bottomを入力します。
solidは一本線です。doubleと打ってみたら、二重線になったので大発見をしたような心地です。


```ruby:qiita.rb
puts '.header-logo{
  float:left;
  font-size:36px;
  padding:20px 40px 20px 40px;
　border-bottom:　3px solid black;
}'
```
完成！

#おわりに
先週に比べれば、１センチほどは知識が増えたかなと思います。
誰かが言っていたのですが、プログラミングには、「こうしてみたらどうなるだろう？」
という好奇心が大事だと聞いた気がします。

doubleが二重線を指すという当たり前のことを見つけただけですが、世の中の凄いプログラマーの方々は、こうした小さな発見を積み重ねて巨人になったんだと思います。

２週間後の成長をお楽しみに。退化しているかもしれませんが...
サムネイル付きスライドショー的なものを作ってみる。

## 本記事では、簡単にサムネイル付きスライドショー的なものの作り方の実装を紹介していきます。
形式は、haml,scss,JavaScript(jQuery)となっています。ご注意ください。

####　ファイルを用意する
- index.html.haml（以下名前は適当）
- index.scss
- index.js

としておきます。

```haml:index.html.haml
.show__contents__item-mainImage
  %img.owl-lazy{:src => "https://static.mercdn.net/item/detail/orig/photos/m57633610047_1.jpg?1558747626"}/
   .show__contents__item-thumbnails
     %img.is-higher-width{:src => "https://static.mercdn.net/item/detail/orig/photos/m57633610047_1.jpg?1558747626"}/
     %img.is-higher-width{:src => "https://static.mercdn.net/item/detail/orig/photos/m57633610047_2.jpg?1558747626"}/
     %img.is-higher-width{:src => "https://static.mercdn.net/item/detail/orig/photos/m57633610047_4.jpg?1558747626"}/
     %img.is-higher-width{:src => "https://static.mercdn.net/item/detail/orig/photos/m57633610047_1.jpg?1558747626"}/
     %img.is-higher-width{:src => "https://static.mercdn.net/item/detail/orig/photos/m57633610047_2.jpg?1558747626"}/ 
```

このように作っておきます。
構造としては、div(mainImage)の下に、img(class:owl-lazy)div(thumbnails)の下に、(class:is-higher-width)があります。

```scss:index.scss

scssは、省略します。大きさなどを指定するくらいで、特別指定することはないです。
```

```index.js
$(function(){
  $('img.is-higher-width').mouseover(function(){
   var $thisImg = $(this).attr('src');
   $('img.owl-lazy').attr({src:$thisImg});
  });
 });
```

以上のように書くと、サムネ写真にマウスが触れたときに、メイン画像が切り替わると思います。

js部分について、解説しておくと、

```js
$('img.is-higher-width').mouseover(function(){
```
サムネ画像(img.is-higher-width)にマウスが乗ったとき、

```js
var $thisImg = $(this).attr('src');
```

this=(img.is-higher-width)の要素のsrc要素をattrで取得し、$thisImgに代入

```js
$('img.owl-lazy').attr({src:$thisImg});
```

(img.owl-lazy)メイン画像に、サムネ画像のsrc要素をattrで当てる

以上のようなロジックを組んでいます。

上記手法を使って実装しましたが、見た目とサーバーサイドの実装との兼ね合いの上、slick.jsを用いて、再実装しています。後日、あらためて記事にできればと思います。
StreamingAssetsのファイルがそのまま組み込まれるとは限らない (unity, android でハマったこと)

# 前提
- unity 2018.4.3f1
- ターゲットプラットフォーム: **Android**

# これまでの理解
- StreamingAssetsのファイルは、ビルドを経て勝手にエンコードされるなどの変化がなく、アプリにそのまま組み込まれる。

# わかったこと
- gzip圧縮したファイルをStreamingAssetsに入れると、ビルド時にデコードされて拡張子(.gz)も外されます。
    - つまり、組み込まれるファイル名とファイル形式が変化します。
- ビルドオプションの"Compression Method"には影響されません。
- エディター上の実行時はgzip圧縮されたファイルが使われます。
- PC向けのビルドではgzip圧縮されたまま組み込まれます。

### 参考
- StreamingAssetsのzipファイルは、勝手に展開されることはありませんでした。
- [実証コードっぽいものがこちらにあります。](https://qiita.com/tetr4lab/items/9d8add90c46828ea4e5e)

### 推測
- apkファイルはzipアーカイブで、StreamingAssetsはAndroid実機上で展開されず、必要時にアーカイブから抽出されます。
- 「もともと圧縮状態で保持しているのだから二重に圧縮する必要はない」ということなのでしょうね。
ローカル変数とグローバル変数について（入門者）

# ローカル変数、グローバル変数 
　ローカル変数とは、あるところで使われている変数名を別のところで使っても、違う変数として扱われるものである。一方グローバル変数とは、プログラム中のどこで使われていても、名前が同じであれば、必ず同じ変数として扱われるものである。

## 書き方

まず書き方として変数名は仮にaとすると、

ローカル変数： a
グローバル変数：$a

## 実際に動かす

```index.rb
a = 0      #ローカル変数
$a = 0     #グローバル変数

require_revative "input"     #input.rbファイルを読み込む

#出力結果
p a        # => 0
p $a       # => 1
```

```input.rb
a = 1
$a = 1
```

# まとめ
グローバル変数はプログラムのどこからでも書き換えることができるので、一般的には好まれない。また、ローカル変数は最初に何かを代入されたときに初期化され、初期化されていないローカル変数を参照しようとするとエラーがでる。

## 追記
以下のコメントで、[__scivola__](https://qiita.com/scivola)さんにご指摘していただいた点で、
>厳密にはローカル変数は初期化されていなくとも、代入式が__存在__していれば__宣言__される。
>

以下のコードをお借りすると、

~~~ruby
if false
  a = 1
end

p a # => nil　→ エラーは出ない
~~~

代入式 a = 1は実行されず、初期化はされていない。しかし、宣言はされているのでエラーは出ない。また、宣言はされているが代入されていないローカル変数はnilになるとのこと。

[__scivola__](https://qiita.com/scivola)さんご指摘あありがとうございました。
Javaのラムダ式をStreamAPI以外でも使う

#Javaのラムダ式をStreamAPI以外でも使う
Javaのラムダ式をStreamAPIで使う方は多いかと思いますが、
ラムダ式を使えるのは、ConsumerやFunctionと言ったjava8で新たに追加されたInterfaceだけではありません。
ラムダ式は関数型Interfaceならば利用することが可能で、
かつJavaにおいてメソッドが一つしか定義されていないInterfaceは関数型Interfaceです。

## 具体例
例えば、Springのjdbcで使うResultSetExtractor<T>を見てみましょう。
このInterfaceには以下のメソッドしかありません。

```java
T	extractData(ResultSet rs)
```

よって、java7までは以下のように書いていたコードを

```java
Entity entity = jdbc.query(sql,new ResultSetExtractor<Entity>() {
 @Override  
     public Entity extractData(ResultSet rs) throws SQLException,  
            DataAccessException {  
      if(!rs.next()){
        return null;
      }else{
        Entity result = new Entity();
        //setValue from resultSet
        return result;
      }
    });  
});


```

以下のように書くことが出来ます。

```java

Entity entity = jdbc.query(sql, rs -> {
    if(!rs.next()){
       return null;
    }else{
      Entity result = new Entity();
      //setValue from resultSet
      return result;
    }
  }
});

```
大分すっきりしますね。
ただ慣れていないと何の無名クラスを作っているのか分からなくなる恐れはあるかなと思います。
チーム状況次第化も知れません。

## まとめ
* 既存のInterfaceでもメソッド一つなら関数型としてラムダ式で書ける
* 可読性については微妙なところなので状況を見て。
MacでNode.jsの環境構築をする

何番線じか分かりませんがMacでNode.jsの導入メモです。
※記載されているバージョンは2019/7/4のものとなります。

##Homebrewのインストール
Mac用のパッケージマネージャです。
下記のURLからスクリプトをコピーしてターミナルで実行してインストールします。

![スクリーンショット 2019-07-05 19.21.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392337/547d5681-e5c0-0c9e-cdb8-6d2aa4b6c4a4.png)
https://brew.sh/index_ja.html

Homebrewのバージョン確認

```
$ brew -v

Homebrew 2.1.6
Homebrew/homebrew-core (git revision 33fa; last commit 2019-07-04)
Homebrew/homebrew-cask (git revision b3f55; last commit 2019-07-04)
```

##nodebrewのインストール
Node.jsのバージョン管理ツールです。
以下のコマンドでインストールします。

```
$ brew install nodebrew
```

ディレクトリ作成

```
$ mkdir -p ~/.nodebrew/src
```

##nodeBrewでNode.jsをインストール

最新版

```
＄ nodebrew install-binary latest
```
安定版

```
$ nodebrew install-binary stable
```

PATHを通す
```
$ echo 'export PATH=$HOME/.nodebrew/current/bin:$PATH' >> ~/.bash_profile
```

※PATHを通したらターミナル再起動します。

インストールされているかどうか確認

```
$ nodebrew ls

v12.6.0

current: none
```

currentがnoneとなっているので、
バージョンを指定する。

バージョン指定

```
$ nodebrew use v12.6.0
```

nodeのバージョンを確認する

```
$ node -V
v12.6.0
```

バージョンが表示されれば無事完了です。
逆行列法(Inverse Matrix Method)

## はじめに

これは筆者の勉強まとめページですので、指摘しまくってい頂けると幸いです

##そもそも回帰とは
とあるデータに対してどのような値を取りうるか予測をすること。

##逆行列法

逆行列法は $$ A・x = b$$ のような行列方程式に対して解を求めるような手法である。
一般的は $$ x = A^{-1}・b $$
のようにAの逆行列を適用することにより、解を求めるのだが、そもそもAの逆行列が必ず存在するとは限らない。
そこで、Aの転置行列の性質を用いることにより、以下のように解を算出することができる。$$ 
x = (^{t}A・A)^{-1}・^{t}A・b $$ のように解を算出することができる。
これを用いて実際に回帰問題を解いてみた。

```python
# ライブラリのインポート

import matplotlib.pyplot as plt
import numpy as np
import tensorflow as tf

# セッションの設定

sess = tf.Session()

# 教師データの作成

x_vals = np.linspace(0, 10, 100)
y_vals = x_vals + np.random.normal(0, 1, 100)

# 行列の初期化 2x100の行列Aを作成 1x100の行列bを作成

x_vals_column = np.transpose(np.matrix(x_vals))
ones_column = np.transpose(np.repeat(1, 100))
A = np.column_stack((x_vals_column, ones_column))

b = np.transpose(np.matrix(y_vals))


# 定数のtensorを作成

A_tensor = tf.constant(A)
b_tensor = tf.constant(b)

# 逆行列法の適用

tA_A = tf.matmul(tf.transpose(A_tensor), A_tensor)
tA_A_inv = tf.matrix_inverse(tA_A)
product = tf.matmul(tA_A_inv, tf.transpose(A_tensor))
solution = tf.matmul(product, b_tensor)

solution_eval = sess.run(solution)

slope = solution_eval[0][0]
y_intercept = solution_eval[1][0]

print("slope = ", str(slope))
print("y_intercept = ", str(y_intercept))

best_fit = []
for i in x_vals:
    
    best_fit.append(slope * i + y_intercept)

plt.plot(x_vals, y_vals, "o", label = "Data")
plt.plot(x_vals, best_fit, "r-", label = "Best fit line", linewidth = 3)
plt.legend(loc = "upper left")
plt.show()
```

![Unknown.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/257254/f79dbc21-b9eb-5904-8d51-99c34b3e5060.png)
実行すると、ランダムな点に対してフィットした直線が得られた。
Rails チュートリアル 10章 演習 10.4.1 でつまづいた点

#Railsチュートリアル 第10章 演習10.4.1について
Railsチュートリアル 第10章の演習10.4.1にで、adminユーザーをWeb経由で変更できないことを確認するテストを書きます。
一旦adminユーザーを変更可能にするため、

```app/controllers/users_controller.rb
def user_params
      params.require(:user).permit(:admin,:name,:email,:password,:password_confirmation)
    end
```

このようにして:adminをの変更を許可しました。

テストは以下の通りに書きました。

```test/controllers/users_controller_test.rb
  test "shuold not allow the admin attribute to be edited via the web" do
    log_in_as(@other_user)
    assert_not @other_user.admin?
    patch user_path(@other_user), params: {
                                    user: { password:              @other_user.password,
                                            password_confirmation: @other_user.password,
                                            admin: true } }
    assert_not @other_user.reload.admin?
  end
```

テストの結果は、REDを期待してましたが、、GREENになってしまいました。
adminの変更を許可したので、テストの最終行の

```test/controllers/users_controller_test.rb
  assert_not @other_user.reload.admin?
```

の部分が通らない予定でしたが通ってしまいました。


必死にググってみてもなかなか原因がわからず、英語でググってみました。
すると僕と全く同じところでつまづいてる方の質問がstack overflowにありました。

どうやら原因は、テストで password と password_confirmation を @other_user を経由して呼び出そうとしていたところにあったようです。
パスワードは has_secure_password によって守られているので@other_userから呼び出すことはできないそうです。

なので、テストを以下のように変更しました。

```test/controllers/users_controller_test.rb
test "shuold not allow the admin attribute to be edited via the web" do
    log_in_as(@other_user)
    assert_not @other_user.admin?
    patch user_path(@other_user), params: {
                                    user: { password:              "password",
                                            password_confirmation: "password",
                                            admin: true } }
    assert_not @other_user.reload.admin?
  end
```

直接パスワードを入力することによって(Railsチュートリアルではパスワードを"password"にしている)、admin を true に変更できました。
その結果、テストは期待通りにREDになりました。

最後に :adminをpermitから外して、テストがGREENになることを確認して終了です。
【Android Studio】このチェックマークは何だ？と思ったらブックマークだった

環境
macOS High Sierra 10.13.6
Android Studio 3.4.1

気付けばファイル名の横にチェックマークらしきものが付いていました。
<img width="239" alt="スクリーンショット 2019-06-20 11.43.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120102/084f2b8b-1a16-5ba0-67de-68205134fcb9.png">
警告かなと思いましたがそうでもないようです。
[IntelliJ IDEAのオンラインドキュメント](https://www.jetbrains.com/help/idea/symbols.html)
を見てみるとそれらしきマークと説明がありました。

>Anonymous bookmark – a check sign bookmark. Bookmarks are used for quick navigation within a file or across the entire project.

どうやらブックマークのようです。

そんなものあるの？と、
Android Studioのメニューを見るとありました。
**Navigate → Bookmarks**
多分間違ってF3押して追加してしまったのでしょう。
触れるだけで動作してしまうTouch Barが悪い

**知らないうちにブックマークしている方も多いかもしれません。**

ブックマーク。　ファイルが増えてくると地味に便利なのでは。
よく開くファイルをブックマークしておくと探す手間が省けます。

使用方法（Macです）
プロジェクトに表示されているファイル名をタップ、または編集中のファイルをアクティブにして
**F3でブックマーク**。**もう一度F3で解除**。
**command + F3で一覧表示**。
メニューからでも操作できます。
（編集中のファイルをブックマークした場合、**カーソル行がブックマーク**されるようです）


プレビュー表示もされますし、そのファイルを開くことも出来ます。
（ファイル名の横にチェックマーク付かないのもありますがブックマークには追加されているようです）
@ViewScopedにメモリを喰い潰された話

## 環境
Webアプリケーション

* Java 8
* Java EE 7 (Payara 4)
* JSF 2.2

## 現象
OutOfMemoryでアプリケーションが死んだ。
閉じた画面の管理Beanがずっと生存しててR.I.P.

怪しい部分

* セッションタイムアウト時間が長い
* 一部管理ビーンがメモリ喰う

## 当初の流れ
### よくある説明
|アノテーション|名前空間|生存期間|
|:-:|:-:|:-:|
|`@RequestScoped`|javax.enterprise.context.RequestScoped|1回のHTTPリクエスト/レスポンス|
|`@ViewScoped`|javax.faces.view.ViewScoped|ビューが同じである間|
|`@SessionScoped`|javax.enterprise.context.SessionScoped|セッション開始～終了|
|`@ApplicationScoped`|javax.enterprise.context.ApplcationScoped|アプリケーションが起動している間|
|`@Dependent`|javax.enterprise.context.Dependent|インジェクトされた先のスコープに依存|
|`@ConversationScoped`|javax.enterprise.context.ConversationScoped|開始と終了を任意に指定できる|
|`@FlowScoped`|javax.enterprise.context.FlowScoped|あらかじめ定義したフローの開始から終了まで|

### 自分の理解
ほ～ん。
**`@ViewScoped`は画面開いたら生成して、閉じたら廃棄してくれるんか便利。**
`@SessionScoped`にログインユーザーの情報持たせて、`@ViewScoped`で業務画面作ればいいんだな。

`web.xml`でセッションが保持する`View`数も指定できると。

```xml
/web.xml
    <context-param>
        <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
        <param-value>sever</param-value>
    </context-param>
    <context-param>
        <param-name>com.sun.faces.numberOfLogicalViews</param-name>
        <param-value>20</param-value>
    </context-param>
    <context-param>
        <param-name>com.sun.faces.numberOfViewsInSession</param-name>
        <param-value>20</param-value>
    </context-param>
```
上限超えたら解放されるんか把握。

とかやってたら、破棄されたはずの`@ViewScoped`の管理ビーンがめっちゃ生存しててメモリが圧殺された。

### 実際
どうやら以下のパターンでないと`@ViewScoped`の管理ビーンは解放されないらしい。

* 結果が得られないポストバック
* セッションの有効期限切れ

だから以下のパターンでは生存する。

* 別のページへのGET
* ページ更新
* セッション内の最大論理ビュー数を超えたとき (期限切れになるけど破棄されない)

### 解決策
標準の`@ViewScoped`じゃなくて[OmniFaces @ViewScoped](http://showcase.omnifaces.org/cdi/ViewScoped)を使う。
`OmniFaces`の`@ViewScoped`アノテーション使うだけで、ブラウザの`unload`イベントを拾ったら解放してくれる。
デフォルトの依存関係になるべく影響を与えないように作られてるので`@ViewScoped`使うためだけにでも導入していいかなと。

## あとがき
Viewっていわれると画面単位に管理してくれるのかなと安直に考えちゃったけど、そもそも画面単位じゃなくてコンポーネントツリー単位だから画面閉じたら解放してくれるとか期待するのが間違ってるよねって話。

最大論理ビュー数を超えても破棄されないのは罠な挙動だけど。  

~~そもそもセッション長く保持するな＆巨大にするな~~

## 参考文献
[jsf-2 – セッションが期限切れになるまで期限切れの@ViewScoped Beanが破棄されない理由](https://codeday.me/jp/qa/20190307/368326.html)
[stack overflow : JSF 2.2 Memory Consumption: Why does Mojarra keep the ViewScoped Beans of the last 25 Views in Memory?
](https://stackoverflow.com/questions/31959982/jsf-2-2-memory-consumption-why-does-mojarra-keep-the-viewscoped-beans-of-the-la)
phpの繰り返し文での配列でやらかした

phpの繰り返し文の配列でやらかしたので、投稿します。

#いきなりですが、問題です！！！

下記のコードで、`print_r($result_code)`で出力されるものはどれでしょうか？
（PHPのバージョンは`５．６`です）

```
$execution_results = ['success','failure'];

foreach ($execution_results as $execution_result) {

    if ($execution_result == 'success') {
        $result_code['success_code'] = '成功！';
    }

    if ($execution_result == 'failure') {
        $result_code['failure_code'] = '失敗！';
    }

    print_r($result_code);
}
```

1.
ループの1回目：`Array ( [success_code] => 成功！ )`
ループの2回目：`Array ( [failure_code] => 失敗！ )`

2.
ループの1回目：`Array ( [success_code] => 失敗！ )`
ループの2回目：`Array ( [failure_code] => 成功！ )`

3.
ループの1回目：`Array ( [success_code] => 成功！ )`
ループの2回目：`Array ( [failure_code] => 成功！ )`

4.
ループの1回目：`Array ( [success_code] => 失敗！ )`
ループの2回目：`Array ( [failure_code] => 失敗！ )`

　
　
　
　
　
#正解は...

###ありません！！！

察しの良い方は、わかったかもしれませんが、

###(ん？`1.`だろ)って思ったあなた

僕と同じでやらかすかもしれません。

実際に出力されるものは、下記になります。

ループの1回目：`Array ( [success_code] => 成功！ )`
ループの2回目：`Array ( [success_code] => 成功！ [failure_code] => 失敗！ ) `

#解説

繰り返し文の中で、配列をループ毎に初期化していないので、前回のループで、追加された値が配列に残っています。

1回目のループでは、`[success_code] => 成功！ `が`$result_code`に追加されて、
2回目のループでは、`[failure_code] => 失敗！ `が`$result_code`に追加されます。

なので、2回目に出力されるのは、

`Array ( [success_code] => 成功！ [failure_code] => 失敗！ ) `

になります。

#最後に

ここまで読んでくれた方が僕と同じやらかしをしないように、お祈りしています。
marp nextで中央揃えをする

# marp nextで中央寄せをする

HTMLで書いてもいいけど中央寄せするページが複数あるならこれでもいいかもしれない

````markdown
---
marp: true
paginate: true
theme: default
style: |
    section.title * , h1{
        text-align: center;
    }
---
<!-- _class: title -->
<!-- このページだけ中央寄せ -->
# title
author
day

---

````
##　備考

* 本来はthemeそのものをいじったほうが楽なのでは？
* 4:3にするなら
```markdown
section{
    width: 960px;
    height: 720px;
}
```
とかついかしてやればいい（これもthemeいじったほうが...）
Android Fragmentから呼ばれたActivityのonActivityResult()でrequestCodeを受け取るときの注意点

#TL;DR
受け取った `requestCode` の下位16ビットを取得する...だけです。

```MainActivity.kt
class MainActivity : AppCompatActivity() {
    …
    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        val newRequestCode = requestCode and 0xffff

        if (newRequestCode == "比較対象") {
            // 処理
        }
        …
    }
}
```

#背景
`Fragment#startActivityForResult()` で呼んだ`Intent`を`FragmentActivity#onActivityResult()`で処理をしたかったができない。

具体的には、`Fragment#startActivityForResult()`の第二引数に`requestCode`に`1`を指定したのですが、`FragmentActivity#onActivityResult()`の第一引数で受け取られる値は`65537`でした。

どういうことなのかさっぱりわからなかったところ、[この記事](http://y-anz-m.blogspot.com/2012/05/support-package-fragment.html)に救われました。

#解決方法

なるほど。

`requestCode`によってActivityから呼ばれたのかFragmentから呼ばれたのかを判別しているんですね。
なので、今回のように`requestCode`を`1`に指定した場合`65537`で返ってくるので、その値の下位16ビットを取得する必要があるようです。

具体的には、下記のようになります。

```playground.kt
fun main() {
    val requestCode = 65537
    val newRequestCode = requestCode and 0xffff
    println("newRequestCode: $newRequestCode")
}
```
```実行結果...
newRequestCode: 1
```

これで、`FragmentActivity#onActivityResult()`の条件式で比較できるようになりました。

#おわりに
公式をガリガリ読んでいけるようになりたい。。。
annotateの使い方

## 導入方法

Gem を導入する。

```ruby:Gemfile
group :development do
  # Access an interactive console on exception pages or by calling 'console' anywhere in the code.
  gem 'listen', '>= 3.0.5', '< 3.2'
  gem 'web-console', '>= 3.3.0'
  # Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring
  gem 'spring'
  gem 'spring-watcher-listen', '~> 2.0.0'
  gem "annotate" -追加
end
```

```
$ bundle install
```


## 設定ファイルを作成する

以下のコマンドを実行すると、設定が書き込めるlib/tasks/auto_annotate_models.rakeが作成される。

```
$ bundle exec rails g annotate:install
```

## あとは参照

> https://qiita.com/kou_pg_0131/items/ae6b5f41c18b2872d527
Rails バリデーションとは？使い方、例まとめ

##はじめに
RailsでDBに値を保存する際、無意味なデータや想定外のデータの登録を防ぐ「バリデーション」。備忘録として、書き方や例をまとめてみます。

##バリデーションとは
先にも書きましたが、データを保存する前に、無効なデータでないことを検証する機能のこと。門番みたいなものですね。
空のデータが保存されないようにしたり、数字以外は保存できないようにしたり、文字数に制限を設けたり……保存するデータに制限をかける時に使います。

##基本的な書き方
Railsではモデルクラスに、`validates`メソッドで指定します。

```
validates :カラム名(シンボルで指定),検証ルール（こちらもシンボルで指定）
```

これだけでは理解しづらいので、次から例を用いて書いていきます。
ユーザーモデルにname,age,email,genderのデータを追加していく例になります。

###空データを登録できないようにする→presence
```user.rb
class User < ApplicationRecord
  validates :name, presence: true
end
```

###文字数の制限を設ける→length
```user.rb
class User < ApplicationRecord
  validates :name, presence: true, length: { maximum: 50 }
end
```
ここでは名前の長さの上限を50文字にしました。下限や範囲の指定もできます。

```ruby
#長さの下限を2文字に設定→minimum
validates :name, length: { minimum: 2 }
#長さの範囲を2-50文字→in .. 
validates :name, length: { in: 2..50 }
#長さを5文字に指定→is
validates :name, length: { is: 5 }
```

###数値のみを許可する→numericality、空を許可するallow_blank
ageカラムは数字のみ、空でも構わない例です。

```user.rb
class User < ApplicationRecord
  validates :name, presence: true, length: { maximum: 50 }
  validates :age, numericality: { only_integer: true }, allow_blank: true
end
```
`numericality`は、デフォルトでは小数も許容してしまいます。ageカラムでは整数のみ許可したいので、 `only_integer`を。
また、`numericality`は空を許可しないため、空を許可する場合は`allow_blank: true`を追加します。（空を許可せず、数値のみを許可する場合は`numericality`のみ、 `presence: true`は無くても良い。）

###同一データは一つのみ許可する→uniqueness
emailカラムには同じデータを登録できないようにします。

```user.rb
class User < ApplicationRecord
  validates :name, presence: true, length: { maximum: 50 }
  validates :age, numericality: { only_integer: true }, allow_blank: true
  validates :email, presence: true, uniqueness: true, format: { with: /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z/i}
end
```
ここでは`uniqueness: true`を用いました。`format:`では、文字列が条件に適しているかの検証を行います(ここでは割愛させていただきます)。

###特定の値が含まれているか確認する→inclusion
genderカラムに、1~3(1:male, 2:female, 3:other)のいずれかの数字が保存されるとします。

```user.rb
class User < ApplicationRecord
  validates :name, presence: true, length: { maximum: 50 }
  validates :age, numericality: { only_integer: true }, allow_blank: true
  validates :email, presence: true, uniqueness: true, format: { with: /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z/i}
  validates :gender, presence: true, inclusion: { in: 1..3 }
end
```
##おわりに
ほんの一部ではありますが、validationについてまとめてみました。
まだまだ知らないことだらけですが、日々勉強していきます…！

初心者ですので、間違っている点等あればご指摘いただけますと幸いです。

######参照元:  Rails Guids(https://railsguides.jp/active_record_validations.html)
1分で理解するScriptable Render Pipeline(SRP)の概略と使い方

# TL;DR

- 今までProjectSettingsで設定していた項目を、いい感じにしてくれる機能
- HDRP(高画質)とLWRP(軽量)という2つの構築済みSRPで気軽に使える
- Standard Sharderが使えないなど、一部制約もあったりするので注意

# はじめに

Scriptable Render Pipeline(SRP)のなんとなくの雰囲気を知るためのメモです。
参考リンクも付けているので、正確な情報は各自調べてください。

# 用語

- ビルドインレンダーパイプライン
    - 従来の描画システム
- SRP: Scriptable Render Pipeline
    - いい感じにカスタマイズが出来る機能
    - 基本的に構築済みSRPを調整する形で使うことが推奨されている
- HDRP: High Definition Render Pipeline
    - SRPの高画質な構築済みSRP
    - Shader GraphとPost-Processingが含まれている
- LWRP: Lightweight Definition Render Pipeline
    - SRPの軽量な構築済みSRP
    - Shader GraphとPost-Processingが含まれている
    - 全てのVRプラットフォームに対応

# どこから導入できるの？

Unity2019.xだとプロジェクトの新規作成時に選べる。

<img width="600" alt="スクリーンショット 2019-07-05 18.16.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55365/b6d81fc0-0c23-f4c5-ca7b-d53d13379651.png">

- HDRPはビルドイン/LWRPと互換性がないため、この時点で決定する必要がある(多分)
- サンプルシーンに設定済みのSRPが含まれる

既存のプロジェクトに導入する場合は、PackageManagerから。

<img width="600" alt="スクリーンショット 2019-07-05 18.21.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55365/287ad1bd-7634-bc5d-18ef-ee66c23c5374.png">

- Core RP Library
    - SPRを熟知している人が構築済みSRPを使わずにカスタマイズする時に使うライブラリ。
    - 構築済みSRPを使う場合は不要
- High Definition RP
    - HDRP
- Lightweight RP
    - LWRP

LWRPの場合使えないシェーダーがあるが、以下のメニューより良い感じに置き換えてくれる

<img width="600" alt="スクリーンショット 2019-07-05 18.31.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55365/06476c6d-cb0e-df00-7338-13c54f3774d2.png">


# どこで紐付いてるの？

Graphic Settingsで設定できる

<img width="600" alt="スクリーンショット 2019-07-05 18.13.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55365/d84d792a-ea39-abec-20b1-638d742bb640.png">

Quality Settingsで設定していたような項目が、SRP用のScriptableObjectで設定できるようになった感じ。

<img width="917" alt="スクリーンショット 2019-07-05 16.55.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55365/7618a94d-482f-4aa3-5082-e59e5b0907a1.png">
_左: SRP未設定状態のQuality Settings, 右: LWRP-HightQuality_

<img width="482" alt="スクリーンショット 2019-07-05 17.36.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55365/035ba735-eb3c-9081-475f-2cfe9ff0ea3a.png">
_SPRを適用すると設定項目が減る_



# 参考

- [Scriptable Render Pipeline# - Unity マニュアル](https://docs.unity3d.com/ja/2018.1/Manual/ScriptableRenderPipeline.html)
- [【Unity】既存のプロジェクトにLightweight RenderPipelineを導入する - テラシュールブログ](http://tsubakit1.hateblo.jp/entry/2018/09/07/221355)
- [軽量レンダーパイプライン ― リアルタイムパフォーマンスの最適化 – Unity Blog](https://blogs.unity3d.com/jp/2018/02/21/the-lightweight-render-pipeline-optimizing-real-time-performance/)
Mac OS安装LLVM

## 简介
mac OS系统并没有LLVM工具，但是安装Xcode之后能调用基本的LLVM编译命令如clang，而如果想要调用llc等命令的话只能下载并安装完整的LLVM工具。

## 编译环境
- OS: mac OS 10.14.3

另外还需要`CMake`工具，可以使用`brew install cmake`进行安装 

## 安装步骤
1) 获取LLVM源代码，放置在`~/llvm/`

```bash
> cd ~
> svn co http://llvm.org/svn/llvm-project/llvm/trunk llvm
```

2) 获取Clang源代码，放置在`~/llvm/tools/clang/`

```bash
> cd ~/llvm/tools
> svn co http://llvm.org/svn/llvm-project/cfe/trunk clang
```

3) （Optional）获取extra Clang tools代码，源代码放置在`~/llvm/tools/clang/tools/`

```bash
> cd ~/llvm/tools/clang/tools
> svn co http://llvm.org/svn/llvm-project/clang-tools-extra/trunk extra
```

4) （Optional）获取Compiler-RT代码，源代码放置在`~/llvm/projects/`

```bash
> cd ~/llvm/projects
> svn co http://llvm.org/svn/llvm-project/compiler-rt/trunk compiler-rt
```

5) （Optional, wasm used）获取lld代码，源代码放置在`~/llvm/tools/`

```bash
> cd ~/llvm/tools
> svn co http://llvm.org/svn/llvm-project/lld/trunk lld
```

6) 建立`build`目录并且在该目录下进行编译，注意LLVM禁止源码内编译（in-tree build is not supported）

```bash
> cd ~/llvm
> mkdir build
> cd build
> cmake -G "Unix Makefiles" \
  -DCMAKE_BUILD_TYPE=Release \
  -DCMAKE_EXPORT_COMPILE_COMMANDS=ON \
  -DLLVM_BUILD_LLVM_DYLIB=ON \
  --enable-optimized \
  --enable-targets=host-only \
  ../../llvm
> make
```

- -G = 指定生成编译器
- -DCMAKE_BUILD_TYPE = 调试版本（Debug）或者发布版本（Release）
- -DCMAKE_EXPORT_COMPILE_COMMANDS = 是否输出编译命令
- -DLLVM_BUILD_LLVM_DYLIB = 是否添加libLLVM共享库

更多的编译项可以参考[LLVM的编译文档](http://llvm.org/docs/CMake.html)和[CMake的官方文档](https://cmake.org/documentation/)。

## 配置环境变量
在`~/.bash_profile`中添加`～/llvm/build/bin`，然后运行一下，就可以愉快地玩耍了。

```bash:.bash_profile
export PATH=${PATH}:~/llvm/build/bin
```
```bash
> source ~/.bash_profile
```

## 参考
[Getting Started: Building and Running Clang](http://clang.llvm.org/get_started.html)
[LLVM for Grad Students](https://www.cs.cornell.edu/~asampson/blog/llvm.html)
【WEBAPI】WeatherAPI使ってグラフィカルな気温表示アプリ作ってみようぜ

今年も暑苦しい季節が訪れようとしてます。
エルニーニョがうんたらで例年よりかは、かなり涼しめらしいですが
みなさんが暑さで倒れないように温度を中途半端に取得してくれるアプリ作ってみました。

## Links
[DEMO](https://weatherreporrrrr.herokuapp.com/)
[GitHub](https://github.com/TK-bone/WeatherReporrrrr)

## Program
* PHP
* JavaScript
* HTML
* CSS

## WEBAPI
* [Weather API](https://openweathermap.org/api)

## Library&Framework
* [jQuery](https://jquery.com/)
* [Chart.js](https://www.chartjs.org/)

## Tools
* [Git](https://git-scm.com/)
* [GitHub](https://github.co.jp/)
* [Heroku](https://jp.heroku.com/)

## 作業フロー
### Weather API key取得
Weather APIと通信するためにはAPIkeyを取得しなければいけません。
下記記事参考にさせて頂きました。
[【Rails/JS】無料API「OpenWeatherMap」で天気予報を表示する](https://qiita.com/mikan3rd/items/a5bc87a2242e67cf17a4)
取得したAPIkeyは後ほど使用しますので保存しておいて下さい。
### Ajaxでリクエスト送ってみる
```JavaScript
$(function(){
    let API_KEY = "********";
    let city = "Tokyo";
    let url = '//api.openweathermap.org/data/2.5/forecast?q=' + city + ',jp&units=metric&APPID=' + API_KEY;
    $.ajax({
        url: url,
        dataType: "json",
        type: 'GET',
    })
    .done(function(data) {  
        console.log(data);
    })
    .fail(function(data) {
        alert("OpenWeatherMapAPI Communication failure");
    });
});
```
上記のようなコードの変数API_KEYに先程入手したKEYの値を入れ正常にリクエストが送信されるとjsonが返ってくると思います。
※keyを取得した場合だと少しの間時間を空けないと認証されない事があるみたいです。

### データを整形してHTMLで出力させる。

私の場合は
APIへリクエストを送りjson取得
↓
取得したjsonをAjaxでPHPへ渡して整形
↓
整形されたデータをChartjsへ渡してグラフ化
というフローを行いました。

### 公開
GitHubでバージョン管理をしていたのでリモートリポジトリへpushしてHerokuでデプロイして公開完了です。
GitHubからHerokuへのデプロイ方法は下記記事参考にさせて頂きました。
[heroku 初級編 - GitHub から deploy してみよう -](https://qiita.com/sho7650/items/ebd87c5dc2c4c7abb8f0)

## 最後に
最近は水に飽きてきてミネラルウォーターにポッカレモンを突っ込んで飲んでます。
みなさんも水分補給は怠らないように気をつけて下さい。
Laravel wasChangedの検証


[isDirty() vs wasChanged() – ララジャパン](https://www.larajapan.com/2019/07/05/isdirty-vs-waschanged/)

この記事読んで、これは`wasChanged`だけでいいのでは？と思ったので検証

```php
>>> $group = App\Group::first();
=> App\Group {#3333
     id: 10,
     name: "Aグループ",
     mailaddress: "hoge@example.com",
     prefectures_id: 13,
     city: "千代田区",
     address: "大手町一丁目",
     telephone: "03XXXXXXXX",
     created_at: "2019-01-09 12:09:56",
     updated_at: "2019-06-17 07:58:21",
   }
```

値を変更してみる

```php
>>> $group->name = "hoge"
=> "hoge"
>>> $group->isDirty("name")
=> true
>>> $group->wasChanged("name")
=> false
```

既に期待値と違う。これでは`wasChanged`を`isDirty`の代わりに使うことはできない・・・
wasだし仕方ない。

saveしてみる

```php
>>> $group->save()
=> true
>>> $group->isDirty("name")
=> false
>>> $group->wasChanged("name")
=> true
>>> $group->getChanges()
=> [
     "name" => "hoge",
     "updated_at" => "2019-07-05 18:10:02",
   ]
```

変更前のデータは残ってないんだな。

## 以前試した時の記事

- [LaravelのEloquentでカラムの変更情報を取得 - Qiita](https://qiita.com/tmf16/items/e9169b416ab4011a3a09)
BitriseのCocoaPods install stepでエラーが出て困った話

## こんなエラーが出た
```
/Users/vagrant/.rbenv/versions/2.5.3/lib/ruby/site_ruby/2.5.0/rubygems.rb:283:in `find_spec_for_exe': can't find gem cocoapods (= 1.x.x) with executable pod (Gem::GemNotFoundException)
	from /Users/vagrant/.rbenv/versions/2.5.3/lib/ruby/site_ruby/2.5.0/rubygems.rb:302:in `activate_bin_path'
	from /Users/vagrant/.rbenv/versions/2.5.3/bin/pod:23:in `<main>'
```

## 解決策
ググると、Cocoapodsを再インストールしろっていうのが出てくる。
`Run CocoaPods Install` ステップの前に`Script`ステップを差し込んで、再インストールしたら直った。

![Bitrise Workflow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39487/63091751-1994-99c5-7916-8b507eb23c7f.png)

直ったので上のスクリプトはまた消しました。
Firefoxでtext-align:justifyが効かないとき

Firefoxで`text-align: justify`等均等割り付のstyleが適用されないことが有りました。
修正方法は簡単
`html`に`lang="ja"`を設定するだけでした。

```
<!DOCTYPE html>
<html lang="ja">
<head></head>
<body>

</body>
</html>

```
【テンプレ】JavaでMySQL接続

単純な接続確認用

```
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class MySQLPractice {

	public static void main(String[] args) {
		Connection con = null;
        try {
            // MySQLに接続
            con = DriverManager.getConnection("jdbc:mysql://localhost:8880/database", "root", "pass");
            System.out.println("MySQLに接続できました。");
        } catch (SQLException e) {
            System.out.println("MySQLに接続できませんでした。");
        } finally {
            if (con != null) {
                try {
                    con.close();
                } catch (SQLException e) {
                    System.out.println("MySQLのクローズに失敗しました。");
                }
            }
        }
	}
}
```
OTRSのアップデート

## データのバックアップ

OTRSのバックアップスクリプトでアプリ、コンフィグ、データをバックアップ

```
# /opt/otrs/scripts/backup.pl -d /backup/otrs/
Backup /backup/otrs//yyyy-mm-dd_hh-mm/Config.tar.gz ... don
Backup /backup/otrs//yyyy-mm-dd_hh-mm/Application.tar.gz ... done
Dump MySQL data to /backup/otrs//yyyy-mm-dd_hh-mm/DatabaseBackup.sql.gz ... done
```
## アップデート
以下を参考にして、OTRS6 Community Editionの最新のパッチを当ててみました。

Updating OTRS
https://doc.otrs.com/doc/manual/admin/6.0/en/html/updating.html

### 起動中のサービスの確認と停止

```
# systemctl list-unit-files -t service

# systemctl stop crond.service
# systemctl stop httpd.service 
# systemctl stop postfix.service

# /opt/otrs/bin/Cron.sh stop otrs
done

# su -c "bin/otrs.Daemon.pl stop" -s /bin/bash otrs

Manage the OTRS daemon process.

Daemon stopped
```

### otrsのシステムバックアップ
バックアップしたいディレクトリで、

```
# cp -p /opt/otrs/Kernel/Config.pm .
# cp -p /opt/otrs/var/stats/* .
```


### otrsのアップデート
パッケージをダウンロードしたディレクトリで、

```
# rpm -Uvh otrs-6.0.xx-01.noarch.rpm
準備しています...              ################################# [100%]
Check OTRS user ... otrs exists.
usermod: 変更はありません
usermod: 変更はありません
更新中 / インストール中...
   1:otrs-6.0.xx-01                   ################################# [ 50%]

Next steps: 

[restart web server]
 systemctl restart apache2.service

[install the OTRS database]
 Make sure your database server is running.
 Use a web browser and open this link:
 http://otrs-server/otrs/installer.pl

[start OTRS daemon and corresponding watchdog cronjob]
 /opt/otrs/bin/otrs.Daemon.pl start
 /opt/otrs/bin/Cron.sh start

((enjoy))
 Your OTRS Team

整理中 / 削除中...
   2:otrs-6.0.xx-01                   ################################# [100%]
```

### マイグレーションスクリプトの実行
データベースのアップデートやチェックが走る

```
# cd /opt/otrs/
# ll scripts/
# su -c "scripts/DBUpdate-to-6.pl" -s /bin/bash otrs

 Migration started ... 

--- 中略 ----

 Migration completed!
```

### インストールパッケージのアップデート
特になしの場合は、不要？

```
# su -c "bin/otrs.Console.pl Admin::Package::UpgradeAll" -s /bin/bash otrs

There are no installed packages

Done.
```

## サービス再開

```
# systemctl start crond.service
# systemctl start httpd.service
# systemctl start postfix.service
```
## OTRSのサービス再開

```
# su -c "bin/otrs.Daemon.pl start" -s /bin/bash otrs
# su -c "bin/Cron.sh start" -s /bin/bash otrs
(using /opt/otrs) done
```
5分後に、デーモンが動いているか確認

```
# su -c "bin/otrs.Daemon.pl status" -s /bin/bash otrs

Manage the OTRS daemon process.

Daemon running
```
ブラウザからOTRSにログインして、footerの「powered by OTRS<sup>TM</sup>」の上にあるマークに、オンマウスして、OTRSバージョンを確認する。
【Maven】OWASP Dependency Checkで警告を抑制する

# やること
OWASP Dependency Checkでは、`failBuildOnCVSS`を指定することで任意のスコア以上の脆弱性があった場合にビルドを失敗させることができます。
一方、このチェックで引っ掛けて欲しくない脆弱性も有ったりします（e.g. Windows環境でのみ発生するが、使う環境がWindowsでない場合など）。

```xml:pom.xml
<!-- 省略 -->
<plugin>
    <groupId>org.owasp</groupId>
    <artifactId>dependency-check-maven</artifactId>
    <version>5.0.0</version>
    <configuration>
        <!-- CVEスコア8以上で落とす設定 -->
        <failBuildOnCVSS>8</failBuildOnCVSS>
    </configuration>
    <executions>
        <execution>
            <goals>
                <goal>check</goal>
            </goals>
        </execution>
    </executions>
</plugin>
<!-- 省略 -->
```

ということで、一部脆弱性に関する警告を抑制（無視）する設定をします。

# やり方
SuppressionFileを用意した上で`configuration`に`suppressionFiles`を設定すればできます。

## SuppressionFileを用意する
まず抑制する内容について記述したSuppressionFileを用意します。
ファイル名は任意ですが、今回は`owasp-dependency-check-suppressions.xml`としています。
このファイルの内容は現在自分がやっているプロジェクトから取ってきたものです（コメントに関しては一部修正しているので実際はもっと詳細に調査しています）。

```xml:owasp-dependency-check-suppressions.xml
<?xml version="1.0" encoding="UTF-8"?>
<suppressions xmlns="https://jeremylong.github.io/DependencyCheck/dependency-suppression.1.2.xsd">
    <!-- OWASPの脆弱性チェックで無視する内容（xmlnsの最新版は1.3だが、1.3だとエラーが出て機能しないため1.2にしている） -->
    <suppress>
        <notes><![CDATA[
        Spring Security 5.0.5と任意のバージョンのSpring Securityを組み合わせた時に発生する脆弱性。
        このプロジェクトではSpring Security 5.0.5を使っていないため無視する。
        ]]></notes>
        <cve>CVE-2018-1258</cve>
    </suppress>
    <suppress>
        <notes><![CDATA[
        MySqlのコネクションに関する脆弱性。
        このプロジェクトでは特に問題にはならないため無視する。
        ]]></notes>
        <cve>CVE-2018-3258</cve>
    </suppress>
    <suppress>
        <notes><![CDATA[
        Windows環境でTomcatを動かした場合に発生する脆弱性。
        このプロジェクトはプロダクション環境がWindowsでないため無視する。
        ]]></notes>
        <cve>CVE-2019-0232</cve>
    </suppress>
</suppressions>
```

### 補足
`dependency-suppression`は1.3が記事公開時点で最新かつ公式のサンプルもこのバージョンが指定されていますが、1.2を指定しないと複数環境で動かなかったので、今回は1.2を指定しています（[エラーに関して自分が書いた記事です](https://wrongwrong163377.hatenablog.com/entry/2019/07/05/174012)）。

## configurationにsuppressionFilesを設定する
次に`configuration`内に用意したファイルのパスを設定することで、設定が有効になります。
`owasp-dependency-check-suppressions.xml`はpomと同じ階層に置いた場合を想定しています。
`suppression`を有効にした状態でチェックをした場合、Reportにもその内容は表示されなくなります。

```xml:pom.xml(追記後)
<plugin>
    <groupId>org.owasp</groupId>
    <artifactId>dependency-check-maven</artifactId>
    <version>5.0.0</version>
    <configuration>
        <failBuildOnCVSS>8</failBuildOnCVSS>
        <suppressionFiles>
            <suppressionFile>owasp-dependency-check-suppressions.xml</suppressionFile>
        </suppressionFiles>
    </configuration>
    <executions>
        <execution>
            <goals>
                <goal>check</goal>
            </goals>
        </execution>
    </executions>
</plugin>
```

# より詳しい内容
今回はCVEを個別に設定しましたが、他にも様々な設定方法が有るので、より詳しくは公式サイトを参照してください。
SuppressionFileをURLで指定するだとか、あるpackageからの内容を無視するといったことも可能です。

- [dependency\-check – Suppressing False Positives](https://jeremylong.github.io/DependencyCheck/general/suppression.html)
論理演算子5本ノック

一度まとめておきたかった。
Pythonで書いたのでPythonタグにしましたがJavaScriptとかRubyでも同じです。

## 1
```python
>>> True or False and False
```
<details><summary>答え</summary><div>

```python
True
```

or(論理和)よりもand(論理積)が優先される

```python
True or (False and False)
(True or False)
True
```
</div></details>

## 2
```python
>>> False or not True and False
```
<details><summary>答え</summary><div>

```python
False
```

not(否定)が最優先

```python
False or (not True) and False
False or (False and False)
(False or False)
False
```
</div></details>

## 3
```python
>>> True or Hoge
```
<details><summary>答え</summary><div>

```python
True
```

短絡評価(左辺のTrueを見ただけで答えが定まるため右辺を評価しない)なのでHogeが未定義でもエラーにならない
</div></details>

## 4
```python
>>> 1 or not 1
```
<details><summary>答え</summary><div>

```python
1
```

andとorは最後に評価した値を返すのでbool型とは限らない
</div></details>

## 5
```python
>>> 0 or not 0
```
<details><summary>答え</summary><div>

```python
True
```

notはboolを返す
</div></details>