OmniAICreator/Qiita-1.07M huggingface dataset:
Terraform✖️CodePipeline でプルリクエストからのマージに対応する

はたです。最近TerraformでAWS構築する機会が増えています。
ついでにCI/CD環境をAWSのCode系サービスで実現しているのですが、プルリクエストからのマージをフックしてCodePipelineを走らせるにはどうすればいいのかな？を調べたので備忘録します。

https://www.terraform.io/docs/providers/aws/r/codepipeline_webhook.html
https://developer.github.com/v3/activity/events/types/#pullrequestevent

簡単に紹介するため aws_codepipeline_webhook の記述だけ記載します。
ポイントはfilterですね。
上記URLにGithubのpull request event詳細がわかるので、それを参考にfilterの設定をしています

任意のブランチ(今回はdevelop)のプルリクエストがマージされた(プルリクが閉じられmergedフラグがtrue)の場合のaws_codepipeline_webhookの書き方

``` 
resource "aws_codepipeline_webhook" "webhook" {
  name            = "test-webhook"
  target_pipeline = aws_codepipeline.codepipeline.name
  target_action   = "Source"
  authentication  = "GITHUB_HMAC"

  authentication_configuration {
    secret_token = "xxxxxxxxxxxxx"
  }

  filter {
    json_path    = "$.action"
    match_equals = "closed"
  }

  filter {
    json_path    = "$.pull_request.merged"
    match_equals = "true"
  }

  filter {
    json_path    = "$.pull_request.base.ref"
    match_equals = "develop"
  }
}
```

今回はここまで、良いTerraform生活を。
[Swift] pre-commit でコミット時に SwiftFormat を適用する

## Tl;Dr
[SwiftFormat](https://github.com/nicklockwood/SwiftFormat)は [pre-commit](https://github.com/pre-commit/pre-commit) に対応しているので `.pre-commit-config.yaml` を作成し、

```yaml:.pre-commit-config.yaml
repos:
-   repo: https://github.com/nicklockwood/SwiftFormat
    rev: 0.44.2
    hooks:
    -   id: swiftformat
```

 `pre-commit install`すればコミット時に適用してくれるようになる。
![CDF672A6-9B7B-43A7-A75B-7B6857080291.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29653/8e5cb32f-7b20-5c10-345a-69393a23f5e8.png)

## なぜ？
通常の iOSアプリプロジェクトであれば [SwiftFormat](https://github.com/nicklockwood/SwiftFormat) は Xcode における Build Phases に組み込んで適用するのがセオリーといえる。

しかし、Swift Package Manager の場合、Xcodeプロジェクトは`Package.swift`およびディレクトリツリーから自動生成するため、Xcodeの設定を変更するやり方はあまりベターではない（Xcode 11.4 から[LSP](https://github.com/apple/sourcekit-lsp/#getting-started) が同梱されるようになったことから、そもそも Xcode の利用はオプショナルになりつつもある）。

そのため、Git の pre-commit でフックするやり方も考えられる。

## pre-commit
[pre-commit](https://github.com/pre-commit/pre-commit) は Python製のツールで、Git の pre-commit にフックするスクリプトを管理するためのエコシステムのようなものらしい。Swift Package Manager が Swift 製のライブラリを管理するエコシステムであれば、それの pre-commit hook 版、といったところだろうか。

以下の記事がわかりやすかった。
[Python製のツールpre-commitでGitのpre-commit hookを楽々管理！！](https://dev.classmethod.jp/tool/git/python-git-pre-commit/)

## 導入
[pre-commit](https://github.com/pre-commit/pre-commit) 自体は Homebrew でインストールできるので `brew install pre-commit` するだけでよい。

あとは冒頭に書いたように`.pre-commit-config.yaml`を作成し、`pre-commit install`すれば導入は完了である。

私のリポジトリでは`Makefile`と`Brewfile`を用意し、`make setup`の1コマンドで導入できるようにしている。

```makefile:Makefile
setup:
  brew bundle
  pre-commit install
```

```ruby:Brewfile
brew "pre-commit"
```

## 使い方
コミット時に [SwiftFormat](https://github.com/nicklockwood/SwiftFormat) により変更が入った場合、**コミットは失敗して変更自体はアンステージされた状態**になる。

冒頭の画像の再掲となるが、 `Failed` と右上に表示されているのはそういう意味である。
![CDF672A6-9B7B-43A7-A75B-7B6857080291.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29653/8e5cb32f-7b20-5c10-345a-69393a23f5e8.png)

そのため、適用された変更は`git add`でステージした上で再度コミットする必要がある。

## 補足
[SwiftFormat](https://github.com/nicklockwood/SwiftFormat) の README には[通常のpre-commit hook](https://github.com/nicklockwood/SwiftFormat#git-pre-commit-hook) を利用した手順も記載されている。

```bash:pre-commit
#!/bin/bash
git diff —diff-filter=d —staged —name-only | grep -e ‘\(.*\).swift$’ | while read line; do
  swiftformat “${line}”;
  git add "$line";
done
```

このスクリプトは `swiftformat` を実行後に自動的に `git add` する作りになっているため、 [pre-commit](https://github.com/pre-commit/pre-commit) のようにコミットに失敗したらステージして再度コミットする、といった手間がない。

一方、ファイル全体を`git add`されてしまう為、部分的にステージ（`git add -p`）・コミットしたい場合などに、意図しなかった変更までコミットしてしまうリスクもある。

このあたりはトレードオフではあるが、個人的には [pre-commit](https://github.com/pre-commit/pre-commit) の方が安全であると感じる。

## 終わりに
*Swift Package Manager のプロジェクトでも、SwiftFormat で一貫したコードスタイルを。*
【Ubuntu】ROS kineticのインストール

#ROSのインストール手順

Ubuntu 16.04へROS(kinetic)をインストールするところから
ワークスペースを作成するところまでを掲載．
内容は [ROS公式サイト](http://wiki.ros.org/)から抜粋したもの．

###1. ROSのインストール

```shell
sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
sudo apt-key adv --keyserver 'hkp://ha.pool.sks-keyservers.net:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654
sudo apt-get update
sudo apt-get install ros-kinetic-desktop-full -y
```
インストール後，依存関係を設定するために下記コマンドを実行して環境設定を実施．

###2. 環境設定

```shell
sudo rosdep init
rosdep update
echo "source /opt/ros/kinetic/setup.bash" >> ~/.bashrc
source ~/.bashrc
```

###3. ワークスペースの作成
ここではワークスペースの名前を```catkin_ws```としていますが，
好きな名前でも大丈夫．
その場合は```catkin_ws```の部分を自分で入力した名前に置き換えて実行が必要．

```shell
mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/src
catkin_init_workspace
cd ~/catkin_ws/
catkin_make
echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc
source ~/.bashrc
```

###4. おわりに
以上で，ROSのインストールとワークスペースの作成は完了
git等からROSのプログラムをダウンロードして場合は```~/catkin_ws/src/```の中に追加していく
C言語　scanfで数値をやり取りするときに＆をつける理由

##参照する場所を扱うのがポインタ
ポインタは使って参照する場所（アドレス）を受け渡しするための型です。


##scanf関数で&をつける理由
C言語で作られたプログラムとお話するために使っているのが、__terminal__という通訳。
※Windowsだとコマンドプロンプト

ここから数値を入力したり、プログラムとやり取りをしています。

scanfはterminalとやり取りをするためにあるプログラムです。
以下の書き方はterminalに対して、変数のポインタを渡しています。

__「住所を渡すから、その中に値を入れて返してね！」__

ということをやっています。

```c
scanf("%d",&a);
```
もし、＆を付けないで、変数自体を渡したらどうなるでしょうか。
これは、住所ではなく、箱の中身を渡していることと一緒です。（厳密にいえば箱の中身のコピー）

__箱の中身（中身のコピー）を渡されてもterminalは中身を入れ替えることができません。__

terminalに対して、変数を渡してもterminalは変更を加えることができません。

なのでscanfではポインタを渡せるように&を付けてやり取りをしています。

###参考
&つけが必要な変数の正体 - 苦しんで覚えるC言語
https://9cguide.appspot.com/15-03.html
EC2からRDS Redshiftに接続するとき同一VPCならばセキュリティグループに登録するIPアドレスはEC2のプライベート IPで

題名通り

普段はリモートの環境や他拠点サーバから接続しているので
RDS Redshiftにぶら下げたセキュリティグループにはその拠点のグローバルIPを登録していたが、
EC2で立ち上げたインスタンスからも登録するのはグローバルIPだろうと設定したがつながらず・・

```
PHP Warning:  pg_connect(): Unable to connect to PostgreSQL server: could not connect to server: Connection timed out
        Is the server running on host "xxxxxxxxxx.xxxxxxxxxx.ap-northeast-1.redshift.amazonaws.com" (nnn.nn.nn.nnn) and accepting
        TCP/IP connections on port 5439? in bbbbb.php on line 123
```
という感じでエラーになった場合、
EC2-->RDSの場合で同一VPCならば、セキュリティグループにはEC2のプライベートIPアドレスを登録しましょう。
【boto3】EC2インスタンスをタグでフィルタリング

boto3のresourceでEC2をNameタグでフィルタリングしたい場合、
`tag:(タグキー)`という形式で指定する。

`Name`タグが`web-server01`のインスタンスは下記のように取得。


```python

ec2_r = boto3.resource('ec2')
inst_resources = ec2_r.instances.filter(
        Filters=[
            {'Name': 'tag:Name', 'Values': 'web-server01' }
        ])
```


`System`タグが`web`の場合は下記のように。

```python
inst_resources = ec2_r.instances.filter(
        Filters=[
            {'Name': 'tag:System', 'Values': 'web' }
        ])
```
babylonでvrm その3

#概要

babylon.jsでvrm表示してみた。
動かして見た。

#写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/927c2f0c-9a40-74af-f066-b996f88ace5b.png)


#成果物

https://embed.plnkr.co/i1yUWQZ9y5mHm71i9wOp/


以上。
アプリケーション作成で詰まった箇所

# 環境
`Ruby 2.6.5`
`Rails 5.2.4`
`Docker 19.03.5`
`bundler 2.1.4`

## bundler問題

[別途記事](https://qiita.com/hiro266/items/db0fc63a08168148293b#bundler%E3%81%AE%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E3%82%92%E5%A4%89%E6%9B%B4%E3%81%97%E3%81%9F%E3%82%89%E3%82%A8%E3%83%A9%E3%83%BC)

## フラッシュメッセージ

表示される

```ruby:user_sessions_controller.rb
redirect_back_or_to root_url, success: 'ログインしました'
```

表示されない

```ruby:user_sessions_controller.rb
redirect_to root_path, success: 'ログアウトしました'
```

### 解決法

```ruby:application_controller.rb
# 追加
add_flash_types :danger, :success, :warning
```

### 原因

調査中
そもそも`add_flash_types`の指定がないとBootstrapに対応した`success` `info` `warning` `danger` の4つのキーが使用できないはずなのに`redirect_back_ro_to`だと表示されるのは4つのキーがデフォルトで備わっているからなのか？

## 文字コードがlatin1による文字化け

データベース内で文字化けするだけであって、取り出して使用する場合は文字化けしないのでとりあえず放置。

## jQueryのclickイベントでdocument使用時のみ発火しない

### 試したこと

**`turbolinks`が原因か？**


・`Gemfile.lock`から`turbolinks`削除
・`application.js`から読み込み削除
・`application.html.slim`から読み込み削除
[参考資料](https://kossy-web-engineer.hatenablog.com/entry/2018/11/29/093958)

・`docker-compose bundle update`
・`docker-compose build`
・コンテナの再起動
→変わらず

### 原因

~~調査中~~
**remote: true & application.jsの`//= require rails-ujs`**

remote: trueで送信するとrails-ujsのjQueryがなんかしてるっぽくclickイベントが使用できない。

### 解決法

remote: trueをやめるかclickイベントをやめる。
今回はclickイベントを使用せず実装する。

## ransackで関連付けしたモデルからも検索をかけたい

postsテーブルのtitle、body、tagsテーブルのtagの3つのカラムから検索をかけたい。

### 原因

`join` `関連付け`の検索ワードが出てこず若干詰まったこと

### 解決法

訂正前

```slim
= f.search_field :title_or_body_or_cont, class: "form-control mr-sm-2", placeholder: '検索ワード'
```

訂正後

```slim
= f.search_field :title_or_body_or_tags_tag_cont_any, class: "form-control mr-sm-2", placeholder: '検索ワード'
```

関連付けしてあることが前提！

## active_link_toがroot_pathが絡むとうまく動作しない

### 原因
リンク先に`root`が絡むとactive_link_toがうまく動作しないようです。
[参考記事](https://qiita.com/nemochu33/items/81c375fcaacb6c7866ca)

### 解決法

```ruby:
li.nav-item
  = active_link_to admin_root_path, class: "nav-link", active: [['admin/users'], ['index','edit','show']] do
    i.fas.fa-user.mr-3
    p
      |  ユーザー一覧
```

activeにしたいコントローラ/アクションを記載`active: [[コントローラ名], [アクション名]]`
例：`active: [['admin/users'], ['index','edit','show']]`
ネストしてある場合は親も記述。
Figmaとコードのテーマを統一する

## きっかけ

デザイナーの想定するデザインと100％同じ実装するのは意外と難しい

Figmaに備わってるLocalStyles。ここで設定しても、再度コードに反映させる作業が必要。
というか、面倒なのである程度規模が小さいと手抜きがち、、、

コーディングで、文字の大きさやカラーの違いが発生するのを抑えたい

↓figmaで値を一括に設定できるLocal Styles
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273096/0bfd1a75-000c-e33a-db33-082b231ed13e.png" alt="image.png"></img>

## gatsbyでの解決案

今回はfigma+gastbyでスタイルを統一させるため、以下の二つのオープンソースを利用する

https://www.figma.com/community/plugin/797015796747379907/Theme-UI
https://github.com/LekoArts/figma-theme-ui

Theme-UIを使うことでテーマを作成することができる。↓

```javascript:theme.js

module.exports = {
  fonts: {
    body: '-apple-system, BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji"',
    heading: 'inherit',
  },
  fontSizes: [12, 14, 16, 20, 24, 32],
  fontWeights: {
    body: 400,
    heading: 700,
  },
  lineHeights: {
    body: 1.5,
    heading: 1.125,
  },
  colors: {
    text: '#000',
    background: '#fff',
    brand: {
      primary: '#07c',
      secondary: '#30c',
    },
    teal: [null, '#e6fffa', '#b2f5ea', '#81e6d9'],
  }
}

```

次にfigma側にfigma-theme-uiのプラグインを導入する

インストールは[ここから可能](https://www.figma.com/community/plugin/797015796747379907)

プラグイン画面から、gatsby側で作成した`theme.js`をインポートすることができるようになる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273096/a4bec45a-2099-babf-ac4c-c7cef02d6fd8.png)

↓テーマを利用した例。
右側でフォントサイズやカラーを調節しないで済む

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273096/9811d8d5-4244-ce8e-cd86-1759f72ecbfa.png)

今回試したfigmaのサンプルはこちらにあります
https://www.figma.com/file/3ssINtJDhpWwJnz8ABcsID/Theme-UI-example?node-id=0%3A1

## 課題

figma側からコードに変換する機能はまだ実装されてなさそうです

## その他のフレームワーク

tailwind用のがあります。 https://github.com/impulse/tailwindcss-figma-plugin
babylonでvrm その2


#概要

babylon.jsでvrm表示してみた。
動かして見た。

#写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/6d19ddb1-8123-d54c-a7f9-ceda4eef5c77.png)


#成果物

https://embed.plnkr.co/pp9ytZOjZvwpNDlt1B1P/

以上。
babylonでvrm

#概要

babylon.jsでvrm表示してみた。

#写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/d5393a41-d58f-8d40-f584-0a2b68c8c658.png)


#成果物

https://embed.plnkr.co/yAojTVDANpUeEKXODiDA/

以上。
Cakephp4.x AjaxからのPOSTにアクセスできない対処

Cakephp3.xでは下記URLの記事を参考にアクセスできていたのすが、4.xだと空になってしまう。
4.xでは、Json、XMLで入力されたデータにアクセスする場合、オプション機能でそれをデコードが必要でした。

CakePHP + AjaxでのPOSTで受け取った情報が空になる原因
https://blog.supersonico.info/?p=3172

**Cakephp 3.x**

```php:cakephp3.x&sample.php
//セキュリティコンポーネントを一時無効
if ($this->params['action'] == アクション名) {
	$this->Security->csrfCheck = false;
	$this->Security->validatePost = false;
}
//getDate（）で受け取り
$post_data = $this->request->getData();

```

**Cakephp 4.x**

```php:cakephp4.x&sample.php
//セキュリティコンポーネントを一時無効
if ($this->params['action'] == アクション名) {
	$this->Security->csrfCheck = false;
	$this->Security->validatePost = false;
}
//input()のオプション機能でデコードし受け取り
$post_data = $this->request->input('json_decode');

```
参考:
リクエストとレスポンスオブジェクト
PUT、PATCH または DELETE データ
https://book.cakephp.org/4/ja/controllers/request-response.html
COTOHA でキーワードの抽出 (Ruby)

[COTOHA API Portal](https://api.ce-cotoha.com/contents/index.html) の使用例です。

```rb:key_word.rb
#! /usr/bin/ruby
# -*- encoding: utf-8 -*-
#
#	key_word.rb
#
#					Feb/27/2020
#
# ---------------------------------------------------------------------
require 'faraday'
require 'json'
#
load 'get_config.rb'
load 'get_token.rb'
# ---------------------------------------------------------------------
def read_string_proc (file_in)
#
	str_out=""
	File.open(file_in,"r:UTF-8") do |ff|
		while line=ff.gets
			str_out += line
		end
	end
#
	return	str_out
end
# ---------------------------------------------------------------------
STDERR.puts	"*** 開始 ***"
#
file_in = ARGV[0]
puts file_in
doc = read_string_proc (file_in)
#
config = get_config_proc()
#
access_token = get_token_proc(config)
#	
#
headers={
    "Content-Type": "application/json",
    "Authorization": "Bearer " + access_token
    }
#
data = {
    "document": doc,
    "type": "default"
    }

str_json = JSON.generate(data)
#
url = config['url_base'] + "v1/keyword"
#
con = Faraday.new 
res = con.post do |req|
	req.url url
	req.headers = headers
	req.body = str_json
	end
#
	puts res.status
	dict_aa=JSON.parse(res.body)
#
	dict_aa['result'].each {|unit|
		str_out = unit['form'] + "\t" + unit['score'].to_s
		puts str_out
	}
#
STDERR.puts	"*** 終了 ***"
# ---------------------------------------------------------------------
```

get_config.rb get_token.rb はこちら
[COTOHA API で構文解析 (Ruby)](https://qiita.com/ekzemplaro/items/4ccb52f670f81cb69411)

実行結果

```text
$ ./key_word.rb akai_rousoku.txt
*** 開始 ***
akai_rousoku.txt
200
猿	135.52966
蝋燭	83.9601
花火	78.08584
亀	43.078
火	42.81965
*** 終了 ***
```
DHCP->固定IPにしたサーバにアクセスできなくなったとき

# すべてのポートに届かない

GUIから変更したのがダメみたい。
/etc/network/iptabesを書き換えよう

参考：
[Static IP Configuration on Ubuntu 16\.04 \| Snel\.com](https://www.snel.com/support/static-ip-configuration-ubuntu-16-04/)

# Dockerの80番だけ届かない
-p 80:3000のように起動したコンテナに入るときにERR_CONNECTION_REFUSEDとなる場合。

理由はわからないがIptablesをリセットし、

参考
[networking \- Port 80 connection refused \- Ask Ubuntu](https://askubuntu.com/questions/676434/port-80-connection-refused)

リセット用スクリプト参考
[Linux: Reset iptables firewall rules – Ali Aboosaidi](http://insanelabs.net/linux/linux-reset-iptables-firewall-rules/)

さらに`systemctl restart docker`をしてiptablesを作り直すと直る

再起動するともう一度Iptablesのリセット->Dockerデーモンの再起動やり直し
OWASP dependency check と認証プロキシと私

# OWASP dependency checkとは  
[ここ](https://www.pupha.net/archives/3692/)が一番わかり易いサイトかと思います。  
同サイトでも記載されているように、あるモジュールに対して、既知の脆弱性を持ったライブラリを  
使っていないかをチェックするツールとなっています。  

元はJavaアプリや.NETアプリ向けのツールで、今はプロトとして以下のものも対応しつつある状態。  
* Python アプリケーション  
* Ruby アプリケーション  
* PHP (Composer) アプリケーション  
* Node.js アプリケーション

# 実行環境
OS:CentOS 7.7
OWASP dependency check：5.3.0

# 現象
CLI版を使ったのですが、[マニュアル](https://jeremylong.github.io/DependencyCheck/dependency-check-cli/arguments.html)に従って、  
Proxyサーバ、Proxyポート、Proxy認証の情報を引数に指定し実行したところ、バラバラとExceptionが。。。  
その中に以下のような見覚えのあるエラーメッセージを発見。
``` Caused by: java.io.IOException: Unable to tunnel through proxy. Proxy returns "HTTP/1.1 407 Proxy Authentication Required" ```  
はて。。。Proxy情報を指定しているのにProxy Authenticatio Requiredが出るとなると。。。

# 原因
Java 8 Update 111からjava.netパッケージのHTTPS接続の際のトンネリングにBasic認証を使用できない設定がデフォルトとなっていることが原因でした。
``` 参考URL： https://www.oracle.com/technetwork/java/javase/8u111-relnotes-3124969.html```

ただ解決方法はあって、以下のオプションをJavaの実行時につければいいとのこと。
``` -Djdk.http.auth.tunneling.disabledSchemes="" ```

# 解決方法
解決方法はわかったものの、これをOWASPのツールとしてどう適用するかって話がわからない。
OWASP dependency check のCLI版は、シェルスクリプトだったので、そっと中を覗いてみると、
実行時のパラメタにJAVA_OPTSという環境変数を与えていることが判明。

#結論
以下のようにして実行すればよい。
``` 
export JAVA_OPTS="${JAVA_OPTS} -Djdk.http.auth.tunneling.disabledSchemes=\"\""
dependency-check.sh --project 【プロジェクト名】 --scan 【スキャン対象ディレクトリパス】 --proxyserver 【プロキシサーバ名】 --proxyport 【プロキシポート】 --proxypass 【プロキシ認証パスワード】 --proxyuser 【プロキシ認証ID】
 ```
VSCodeで選択した数値を増減/文字列をトグルできる拡張機能「Incrementor」

https://marketplace.visualstudio.com/items?itemName=nmsmith89.incrementor

例えばCSSを書いている時、 margin の数値を 1px ずつ増減したいことがあるかと思います。
あるいは JavaScript で true としているところを false に書き換えたいことがあるかもしれません。
Incrementor という拡張機能が入っていると、ホットキーを叩くだけで数値の増減や文字列のトグルが可能になります。
![demo-main.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247023/e1aa4760-d11e-f1d1-5529-5f17753c2ad8.gif)

# 機能

## 数値
数値を、1、0.1、または10ずつ増加または減少できます。

## 文字列
ユーザー設定 `incrementor.enums` (後述)に登録した単語でトグルさせることが出来ます。

# 使用法
インクリメント/デクリメントは1つまたは複数のカーソルで機能します。選択範囲がない場合、キャレットの下の数値/単語を選択します。
選択した単語の上でホットキーを押すか、コマンドパレットからコマンドを実行して使います。
コマンドパレットから一々コマンドを実行するのは非常に手間なので専らホットキーでの使用になるかと思います。
一応以下のコマンドが用意されています。

```
Incrementor: Increment by 1
Incrementor: Decrement by 1
Incrementor: Increment by 0.1
Incrementor: Decrement by 0.1
Incrementor: Increment by 10
Incrementor: Decrement by 10
```

デフォルトではキーが割り当てられていないので、ホットキーを使用するにはVSCodeのショートカットキーの設定 (keybindings.json) を編集して割り当てを行います。
ドキュメントにサンプルの割り当て設定が用意されています。

```json
[{
  "command": "incrementor.incByOne",
  "key": "ctrl+up"
},
{
  "command": "incrementor.decByOne",
  "key": "ctrl+down"
},
{
  "command": "incrementor.incByTenth",
  "key": "ctrl+alt+up"
},
{
  "command": "incrementor.decByTenth",
  "key": "ctrl+alt+down"
},
{
  "command": "incrementor.incByTen",
  "key": "ctrl+alt+cmd+up"
},
{
  "command": "incrementor.decByTen",
  "key": "ctrl+alt+cmd+down"
}]
```

# 拡張設定
いくつかの設定が用意されています。増減値を変更したりなどが出来ます。
このうち`incrementor.enums`がトグルする単語の辞書設定です。
以下のように設定します。

```json
"incrementor.enums": [
  [
    "false",
    "true"
  ],
  [
    "let",
    "const"
  ]
],
```

設定すると、例えば `false` を選択して `incrementor.incByOne` の割り当てキーを押した時に `true` にトグルされます。
COTOHA で固有名詞の抽出 (Ruby)

[COTOHA API Portal](https://api.ce-cotoha.com/contents/index.html) の使用例です。

```rb:proper_noun.rb
#! /usr/bin/ruby
# -*- encoding: utf-8 -*-
#
#	proper_noun.rb
#
#					Feb/27/2020
#
# ---------------------------------------------------------------------
require 'faraday'
require 'json'
#
load 'get_config.rb'
load 'get_token.rb'
# ---------------------------------------------------------------------
STDERR.puts	"*** 開始 ***"
#
config = get_config_proc()
#
access_token = get_token_proc(config)
#	
sentence = "特急はくたかで富山に向かいます。それから、金沢に行って、兼六園に行きます。"
#
headers={
    "Content-Type": "application/json",
    "Authorization": "Bearer " + access_token
    }
#
data = {
    "sentence": sentence,
    "type": "default"
    }

str_json = JSON.generate(data)
#
url = config['url_base'] + "v1/ne"
#
con = Faraday.new 
res = con.post do |req|
	req.url url
	req.headers = headers
	req.body = str_json
	end
#
	puts res.status
	dict_aa=JSON.parse(res.body)
#
	dict_aa['result'].each {|unit|
		puts unit['form']
	}
#
STDERR.puts	"*** 終了 ***"
# ---------------------------------------------------------------------
```

get_config.rb get_token.rb はこちら
[COTOHA API で構文解析 (Ruby)](https://qiita.com/ekzemplaro/items/4ccb52f670f81cb69411)

実行結果

```text
$ ./proper_noun.rb
*** 開始 ***
200
富山
金沢
兼六園
*** 終了 ***
```
C言語のchar、int、文字列の関係

##はじめに
C言語には文字列を記憶する変数がない。

##文字変数はある。
それが__char__。
「キャラ」とか「チャー」とか読む。

##charも結局は数字
charは文字を文字コードに変換し、数字として扱う。また、数字を文字に変換し、文字として扱う。
その行き来をさせるための約束事を含んだint型の進化系です。

文字コードとは、文字に1対1で対応する番号をつけて表現する方法のことです。
char型変数に文字を代入するとコンパイルするときに文字コードに対応した数字に置き換えられます。
人間からみて文字で入力されているだけで、機械からすれば数字です。

要するに char型は普通の整数型と全く同じ!!!
ただ、入出力のときに文字に置き換えているだけです。

```c
int main(void)
{
    // int型の配列を宣言
    int arr[] = {65, 66, 67, 68, 69};

    // %dと%cで出力すると？
    for(int i =0; i < 5; i++){
        printf("%d : %c\n", arr[i], arr[i]);
    }
    return 0;
}
```
結果

```terminal
65 : A
66 : B
67 : C
68 : D
69 : E
```
文字が数字に、数字が文字に置き換えられましたね。
これがcharの本質です。

##文字列は文字変数の配列
C言語では、文字列の最後に特別な値を記憶しておくことで文字列を扱います。
この様な文字を特に__EOS__（End of String）と呼ぶことがあります。
C言語の場合、'\0'がEOSとして扱われます。'\0'は、数値としては0にあたります。

##文字列を出力する%sはループ処理
文字列を出力する%sは、先頭のポインタを受け取り、EOSまでを表示するループ処理です。

```c
int main(void)
{
    char arr1[] = "aiueo";
    char arr2[] = "ai\0ueo";

    printf("%s\n", arr1);
    printf("%s\n", arr2);
    return 0;
}

```
結果

```terminal
aiueo
ai
```
'\0'の手前で止まっていますね。
\はエスケープという仕組みで、機械に対する命令なのか、文字としての数字なのかを判断するようになっています。


##charとintの本質的な違い：データサイズ
__※コメントより指摘いただきました。未定義だそうです。詳しくはコメントを御覧ください__

宣言時に確保されるデータサイズが異なります。char型は数値ではありますが、保持できる領域は-128~128まで。それ以上の数値は扱えません。

###char
サイズ：１バイト
表現できる値：-128 〜 128

で、この中の一部の値が文字に対応しており、
「文字として表示する」ことで、アルファベット等の文字が表示されます。

###int
サイズ：４バイト
表現できる値：-2147483648 〜 2147483647




##まとめ
- char型はint型と数値を扱っているという意味で同じ。人間が見て表示するときに置き換えているだけ。
- 違いとしては、確保されるデータサイズが違う。
- 文字列はcharの配列にEOSを足したもの。


###参考
文字の扱い方 - 苦しんで覚えるC言語
https://9cguide.appspot.com/14-01.html
COTOHA API で構文解析 (Ruby)

[COTOHA API Portal](https://api.ce-cotoha.com/contents/index.html) の使用例です。

```py:parsing.rb
#! /usr/bin/ruby
# -*- encoding: utf-8 -*-
#
#	parsing.rb
#
#					Feb/27/2020
#
# ---------------------------------------------------------------------
require 'faraday'
require 'json'
#
load 'get_config.rb'
load 'get_token.rb'
# ---------------------------------------------------------------------
STDERR.puts	"*** 開始 ***"
#
config = get_config_proc()
#
access_token = get_token_proc(config)
#	
sentence = "特急はくたか"
#
headers={
    "Content-Type": "application/json",
    "Authorization": "Bearer " + access_token
    }
#
data = {
    "sentence": sentence,
    "type": "default"
    }

str_json = JSON.generate(data)
#
url = config['url_base'] + "v1/parse"
#
con = Faraday.new 
res = con.post do |req|
	req.url url
	req.headers = headers
	req.body = str_json
	end
#
	puts res.status
	dict_aa=JSON.parse(res.body)
#
	dict_aa['result'].each {|unit|
		unit['tokens'].each {|token|
			str_out = token['form'] + "\t" + token['pos']
			puts str_out
		}
	}
#
STDERR.puts	"*** 終了 ***"
# ---------------------------------------------------------------------
```

```rb:get_config.rb
# -*- encoding: utf-8 -*-
#
#	get_config.rb
#
#					Feb/27/2020
#
# ---------------------------------------------------------------------
require 'dotenv'
#
# ---------------------------------------------------------------------
def get_config_proc()
	Dotenv.load
	config = {}
	config["grantType"] = "client_credentials"
	config["clientId"] = ENV["CLIENT_ID"]
	config["clientSecret"] = ENV["CLIENT_SECRET"]
	config["url_publish"] = ENV['ACCESS_TOKEN_PUBLISH_URL']
	config["url_base"] = ENV['DEVELOPER_API_BASE_URL']
#
	return config
end
# ---------------------------------------------------------------------
```

```rb:get_token.rb
# -*- encoding: utf-8 -*-
#
#	get_token.rb
#
#					Feb/27/2020
#
# ---------------------------------------------------------------------
require 'faraday'
require 'json'
#
# ---------------------------------------------------------------------
def get_token_proc(config)
	str_json = JSON.generate(config)
#
	headers={
		"Content-Type": "application/json"
		}
#
	con = Faraday.new 
	res = con.post do |req|
		req.url config['url_publish']
		req.headers['Content-Type'] = 'application/json'
		req.body = str_json
	end
#
	dict_aa=JSON.parse(res.body)
	access_token = dict_aa['access_token']
#
	return access_token
end
# ---------------------------------------------------------------------
```

実行結果

```text
$ ./parsing.rb 
*** 開始 ***
200
特急	名詞
は	動詞語幹
く	動詞接尾辞
たか	名詞
*** 終了 ***
```
windowsでanaconda環境をコマンドプロンプトからでも使用可能にする

# まずはAnacondaのインストール
1. [Anaconda](https://www.anaconda.com/distribution/)からpython3.7の方のディストリビューションをダウンロードする．
2. ダウンロードしたものを実行するとGUIインストーラーが出てくるが，特にこだわりがなければデフォルトのままポチポチしていってインストール完了

PyCharmとかJupyter使うならそれらで個別にanacondaインタプリタにpathを通すのでここまでで終わりの話．
でもcmdで`python -v`ってしてもエラーが出るはず．pathが通ってないから．

# Pathを通す
コントロールパネルから以下のpathを通す

```
C:\Users\hoge\Anaconda3
C:\Users\hoge\Anaconda3\Scripts
C:\Users\hoge\Anaconda3\Library\bin
```

# おしまい
多分これで，cmdからでも`import numpy``とかできるようになってると思います．
追加で使いたいモジュールがあれば，conda（pipより便利）でインストールしてください．
[Anaconda でよく使うコマンド一覧](https://qiita.com/naz_/items/84634fbd134fbcd25296)

# 最後に
(PyCharmなど便利なIDEがあるこのご時世に)cmdでanaconda環境が使用できて何が嬉しいか説明します．

超小さなローカルアプリを作るとします．
ホスティングもしないし，DBも構うつもりもないとするとき，データはcsvファイルなどでローカルで扱うと楽です．
そのときに，javascriptやphpよりpythonやcでロジックを書いた方が幸せという人は少なくないと思います（フロントのことを考えなくて良いから）．

フロントとのつなぎ方としてはjs上でサブルーチン走らせてそこでpythonプログラムを実行すれば良い感じになります．

そのpythonを走らせるときにプログラムでnumpyやpandasなどのモジュールを使用する際，cmdでanaconda環境が使えないとエラーが出ます．

サブルーチンはcmdだからです．

って感じで，「サービス・アプリ」なんて荘厳な名前をつけるのは憚られるような超内輪ローカルおもちゃを開発する際に重宝されるtipsの紹介でした．
喫煙室の換気扇を自動化したい　その①

# はじめに
こんにちはRHEMS技研の宮内です！
最近、喫煙室の換気扇がタバコを吸い終わったあともつきっぱなしなのがしばしばあり、一定時間人がいなかったら自動でOFFにするようにしたいとのことで、

今回は学習も兼ねESP32を用いて_換気扇のOFFスイッチの自動化_をしてみようと思います！

# 仕組み
まずはESPr® Developer 32で試作品を作って見ました。センサーはHC-SR04(超音波距離センサー)を使い、換気扇の下の距離を測り人がいないようならサーボモータを動かしOFFスイッチを押す。といった感じです。

~~SwichBotを使うのは簡単らしく却下されました、、~~

コードはこちらになります

```C
#include <HCSR04.h>
#include <ESP32Servo.h>

int TRIG = 15;                    //trigger　pin
int ECHO = 14;                    //echo pin
int s_pin = 17;                   //サーボモータの信号ピン
int minUs = 500, maxUs = 2400;        //最小0.5ms最大2.4msの制御パルス
int pos = 0;                         //基準となる角度0度
unsigned int t = 0;


Servo myservo;
UltraSonicDistanceSensor distanceSensor(TRIG, ECHO);



void setup () {
  Serial.begin(115200);
  myservo.setPeriodHertz(50);           //50Hzを入力
  myservo.attach(s_pin, minUs, maxUs);
}

void servo()
{
  Serial.println("換気扇を止めます");
  myservo.write(180);                 //180度まで回転
  delay(1000);
  myservo.write(5);                   //5度まで回転
  delay(1000);
}


void loop () {

  double dis = distanceSensor.measureDistanceCm();
  Serial.println(dis);
  (dis <= 50) && (t = 0);       //人がいる
  (dis >= 100) && (t = (t <= 4) ? (t + 1) : ({servo(); 0;}));       //人がいない(5分いないならスイッチoff)

  delay(60000);        //1分刻みで確認
}

```
ライブラリは距離センサは[こちら](https://github.com/Martinsos/arduino-lib-hc-sr04/blob/master/src/HCSR04.h)、サーボモータは[こちら](https://platformio.org/lib/show/4744/ESP32Servo)のものを使わせていただいています。

配線はこんな感じです
![kannkisenn 1_ブレッドボード.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562536/f43905e9-3c47-a294-f5b6-2b59ddfc0baa.jpeg)


図ではArduinoを使っているので、4pin → 14pin、5pin → 15pin、7pin → 17pin、5v → VoutpinにそれぞれESPr® Developer 32へ置き換えてください。
HC-SR04は5V起動、ESPr® Developer 32は3.3V起動とめんどくさいですがそこは1kΩ抵抗を3個使い合わせています。

#詰まった箇所
ESP32でサーボモータを使う際に参考になるものを探したが、実際しっかり180度回るものがなかったりと結構時間がかかった、、今回使わせていただいたライブラリなら制御パルスなどをしっかり合わせれば楽に角度を変更できるのでオススメです！

#さいごに
今回、喫煙する人にだいたい換気扇の下で吸うと聞きまずはこれを作ってみました。
ですが吸う時に移動する人や、下で吸わない人に対応できていないため次はPIR(人感センサ)を用いて作ってみたいと思います！
ではその➁でお会いしましょ〜✋
入力フォームに文字を表示させたい

入力フォームに文字を表示させる方法です。
なんとなく忘れやすいので、共有します。

# 導入前
```
<input type="text">
```

# placeholderを使う
```
<input type="text" placeholder="ここが入力欄に表示されます">
```
placeholderを使うと入力欄に文字が表示されます。
文字を入力すると消えます。

# valueを使う
```
<input type="text" value="ここが入力欄に表示されます">
```
valueを使うと入力欄にあらかじめ入力された状態になります。
文字を入力しても消えません。
iOSアプリに必要なデータをCoreDataでbundleする

iOSアプリで読み取り専用データをbundleするための方法

# データ作成
実際に使うものと同様のデータモデルで作成する。

https://qiita.com/kenmaz/items/818d61cd0ece8664c017
の設定をしておくと、SQLiteのファイルパスがログに出力されるので便利。

サイズを小さくするためにVACUUMする。

```sql
sqlite> VACUUM;
```


# Bundleのやり方
普通にSQLiteのファイルをドラッグアンドドロップしてbundleする。

~~書き込みたい場合は Application Support とかにコピーしてから使う必要があるが、読み取り専用なのでその必要はない。
ただし、sqliteの一時ファイルである Hogehoge.sqlite-wal と Hogehoge.sqlite-shm も一緒にbundleしてあげる必要がある。
これが存在しないと、Unable to open って怒られる。
両方とも空ファイルでOK。
<img width="301" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44356/bcc368f7-0542-b3cb-6a56-a22d325d50dc.png">~~

↑のはiOS11で開けないですよってクラッシュすることが判明。
iOS13でもなんかwarnちょいちょい出てたし、やはりきちんとApplication Supportにコピーすべきっぽい。
-walと-shmは空ファイル作成すれば良いのでbundleする必要はない。

# 読み込み
```swift
private(set) lazy var container: NSPersistentContainer? = {
    let container = NSPersistentContainer(name: "Bundle")
    
    let dbBaseUrl = try! FileManager.default
        .url(for: .applicationSupportDirectory, in: .userDomainMask, appropriateFor: nil, create: true)
        .appendingPathComponent("Bundle")
    let dbUrl = dbBaseUrl.appendingPathExtension("sqlite")
    
    if !FileManager.default.fileExists(atPath: dbUrl.path) {
        do {
            for fileExtension in ["sqlite-wal", "sqlite-shm"] {
                try "".write(to: dbBaseUrl.appendingPathExtension(fileExtension), atomically: false, encoding: .utf8)
            }

            let source = Bundle.main.url(forResource: "Bundle", withExtension: "sqlite")!
            try FileManager.default.copyItem(at: source, to: dbUrl)
        } catch {
            for fileExtension in ["sqlite", "sqlite-wal", "sqlite-shm"] {
                try? FileManager.default.removeItem(at: dbBaseUrl.appendingPathExtension(fileExtension))
            }
            
            なんやかんやしてユーザーに失敗したことを伝える
            return nil
        }
    }
    
    let description = NSPersistentStoreDescription()
    description.url = dbUrl
    description.isReadOnly = true
    
    container.persistentStoreDescriptions = [description]

    container.loadPersistentStores(completionHandler: { (_, error) in
        if let error = error { fatalError("Unresolved error \(error)") }
    })
    return container
}()
```
UbuntuにGeForceを入れてサスペンドできない場合の解決例

Ubuntu 18.04にGeForce GTX 1650 SUPERを導入し、nvidia-driver-440をインストールした。
その際に、起動やGPUの動作には問題なかったが、サスペンドとそこからの復帰ができなくなっていた。

## 解決法
まず、[Ubuntu 18.04 LTSとNVIDIAドライバーの組み合わせでサスペンド・レジュームができるようにする](https://www.terakin.com/ja/blog/archives/134)の方法を踏襲する。

### `/etc/default/grub`の書き換え

`sudo gedit /etc/default/grub`で開き、おそらく

```
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
```
となっているところを

```
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash nomodeset nouveau.modeset=0"
```
と書き換える。

### `/etc/X11/xorg.conf`の作成

`sudo gedit /etc/X11/xorg.conf`で開き、

```
Section "Device"
     Identifier     "Screen0"
     Driver         "nvidia"
     VendorName     "NVIDIA"
     BoardName      "自分のGPUの型番"
     Option         "NvAGP" "1"
 EndSection
```
を入力し、保存する。 `"自分のGPUの型番"`の部分は、`"GeForce GTX 1650 SUPER"`や`"GeForce GTX 1050 Ti"`のように書く。

### `/etc/modprobe.d/blacklist.conf`に追加

`sudo gedit /etc/modprobe.d/blacklist.conf`で開き、最終行に

```
blacklist intel_agp
```
の一文を追加する。

### `/etc/modprobe.d/blacklist-nvidia-usb.conf`の作成
以上を変えるだけでもサスペンドはできるようになるが、自分の環境では復帰時のエラー（`device failed to resume`等）によって起動まで時間がかかるようになってしまった。
そこで[こちら](https://askubuntu.com/questions/1155263/new-install-desktop-ubuntu-19-04-shows-error-message-ucsi-ccg-0-0008-failed-to)を参考に、`ucsi_ccg`というモジュールを無効にした。
`sudo gedit /etc/modprobe.d/blacklist-nvidia-usb.conf`で開き、

```
blacklist ucsi_ccg
```
を入力し、保存する。
このモジュールはGPUのType Cコントローラーらしいので、Type C出力がないGPUだとバグるのかもしれない（よくわからない）。

### 再起動
以上の変更のあと、`reboot`で再起動する。
そうすると通常通りのサスペンド→復帰ができるようになる。
Docker PHP(7.3) Apacheを使ってxdebugを動かす際にハマった

# 概要

- [Docker/PHP公式イメージ](https://hub.docker.com/_/php)を使用してxdebugを動かそうと試みたもののうまく動かず半日ほど飛ばす。~~こっちだと[Docker(Nginx + php-fpm-alpine) + Laravel(6.0)をXdebugでステップ実行する](https://qiita.com/ProjectEuropa/items/d28d88c2f5eefb89a8e0)瞬殺だったのに~~

## 理由

- php.iniに記述したxdebugの設定が反映されない。

## 対応

- php.iniではなくdocker-php-ext-xdebug.iniにxdebugの設定を記述する

以下記述例

```docker-php-ext-xdebug.ini
zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20180731/xdebug.so
xdebug.remote_enable=1
xdebug.remote_autostart=1
xdebug.remote_host=docker.for.mac.host.internal
xdebug.remote_handler=dbgp
xdebug.remote_port=9020
xdebug.remote_log=/var/log/xdebug.log
xdebug.remote_connect_back=0
```
XLSXWriterの導入

## 参考
- [PHP-XLSXWriterの導入とはじめの一歩](https://armageddooon.hatenablog.com/entry/2018/12/07/115733)

## 環境
- PHP 5.6
- Laravel 5.4
- LaravelExcel 2.1
- XLSXWriter


LaravelExcelを利用し、DBから取得したデータをExcelファイルに書き込んでExportする処理を作っていたが、データ件数が大量になると

`Allowed memory size of ○○○○○ bytes exhausted`

というメモリオーバーのエラーが出た。

PHPでExcelファイルを作成する際にはしばしばぶち当たるこの問題。
今回は顧客の要望をまったく満たせないパフォーマンスだったので、ライブラリをXLSXWriterに変更してみた。

パッケージのインストール

```
composer require mk-j/PHP_XLSXWriter
```

簡単な使い方

```php

use XLSXWriter;

// 中略

// シート名
const SHEET_NAME = 'ユーザーリスト';

// ヘッダー情報
const SHEET_HEADER = [
    'ID' => 'integer',
    'NAME' => 'string',
    'BIRTHDAY' => 'yyyy/mm/dd',
];

$writer = new XLSXWriter();

// ヘッダー行の書き込み
$writer->writeSheetHeader(self::SHEET_NAME, self::SHEET_HEADER);

// データ行書き込み
foreach ($dataList as $data) {
    $writer->writeSheetRow(self::SHEET_NAME, $data);
}

// 出力
$filePath = './tmp/user_list.xlsx';
$writer->writeToFile($filePath);

// XLSXWriterはストレージに保存するしか方法がない？ようなので、Exportしたい時は出力後ファイル削除
if (file_exists($filePath)) {
    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename="' . basename($filePath) . '"');
    header('Expires: 0');
    header('Cache-Control: must-revalidate');
    header('Pragma: public');
    header('Content-Length: ' . filesize($filePath));
    $readFile = readfile($filePath);
    if ($readFile) {
        unlink($filePath);
    }
}
exit;
```
SwiftUIでCustom Colorを定義する

# はじめに
SwiftUIを使っていて良く使う色を自分で定義したいなーと思ったのでやりました

# AssetにColorを設定
`Assets.xcassets`を開いて右クリックのメニューから`New Color Set`を選択します。
そうすると色のAssetが出来ますので、名前とRGB値を思った感じに設定してあげてください。
`Show the Attribute incepector`から設定出来ます。（分からんという人は右ペインにあるタブにあるので、確認してみてください)

設定する際に`Color`部分の`Input Method`を`8-bit Hexadecimal`にすると幸せになれると思います。
デフォルトの`Floating point`だと0.0-1.0の設定でやりづらいです。

# Swift側でAssetを読み込む
`extension`を使って作った色を読み込みます。
引数に文字列でAssetに設定した色の名前を与えればOKです。

``` Swift
extension Color {
    static let costomColor = Color("CustomeColor")
}
```

# 使う側
他の色と同じように使えます。

``` Swift
Text("Hello World").foregroundColor(Color.fontColor)
```
LT用: イケメンデスクトップを目指して

![スライド1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420547/e500697d-99dd-bdf3-9241-ede3bee14029.png)
![スライド2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420547/4be68933-e41a-38f4-1a84-7698b3a118d5.png)
![スライド3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420547/fe23ec17-9f5b-5158-da5b-a5298e2bef3e.png)
![スライド4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420547/d4b33e82-8bcb-a0aa-1506-8d63eaa87f04.png)
![スライド5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420547/17faba5e-d8df-8849-d9c1-bc0dea388ac7.png)
![スライド6.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420547/85cb01cf-4298-3643-c6f0-7e58502fd50d.png)
![スライド7.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420547/630d9f61-3b45-645b-1c0f-149c6fb1e594.png)
![スライド8.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420547/120ee2c8-f17d-5f1c-9932-46325533659f.png)
Kotlin入門:Enumクラス

##Enumクラス
`Enum`クラスを使用することで、特定の値から構成される型を表現できます。
`Enum`クラス(列挙型)は`class`ブロックに`enum`修飾子を付与して宣言します。

入力例:

```Kotlin
enum class Season{
    SPRING,
    SUMMER,
    AUTUMN,
    WINTER
}
fun main(){
     val season = Season.SPRING
     println(season)
     println(season is Season)
}
```
実行結果は以下の通りです。

```Kotlin
SPRING
true
```
`Enum`クラスの配下では定数を(`,`)カンマ区切りで列挙するだけです。
列挙値には「列挙型.列挙定数」でアクセスします。


###プロパティ、メソッド
列挙型もクラスの一種なのでプロパティを持たせることができます。

```Kotlin
enum class Season(val value:String){
    SPRING("春"),
    SUMMER("夏"),
    AUTUMN("秋"),
    WINTER("冬")
}
fun main(){
     val season = Season.SPRING
     println(season)
     println(season.value)
}
```
実行結果は以下の通りです。

```Kotlin
SPRING
春
```

`Enum`クラスは暗黙的に`private`とみなされます。
したがって、クラス外部から「SPRING("春")」のような呼び出しはできません。


以下はメソッドを持たせた例です。

```Kotlin
enum class Seasons{
    SPRING{
        override fun getSeason():String ="春"
    },
    SUMMER{
        override fun getSeason():String ="夏"
    },
    AUTUMN{
        override fun getSeason():String ="秋"
    },
    WINTER{
        override fun getSeason():String ="冬"
    };  //セミコロンに注意
    //メソッドの定義
    abstract fun getSeason():String
}
fun main(){
    for(season in Seasons.values()){
        println(season.getSeason())
    }
}
```

実行結果は以下の通りです。

```Kotlin
春
夏
秋
冬
```

`Enum`ブロックの配下でメソッドを終了するには末尾を
(`;`)セミコロンで終了しなければなりません。
ピンキリなSIer案件でピンな方を引くためのチェックリスト

**ピンな方を引く≒キリな方を遠ざける**

## ピンキリチェックリスト19項目

面接？面談？でプロジェクトのアサイン権限をもつ人に以下の可否 `OK or NG` を確認する。

| 項目                       | 内容                                                                                    |
| -------------------------- | --------------------------------------------------------------------------------------- |
| PC                         |**自分ラップトップ** 持ち込み可<br>もしくは**まともなPC**の支給                            |
| 入出力デバイス             | **モニター、キーボード、マウス／トラックパッド** 持ち込み可                                  |
| メモリ                     | **16GB以上**                                                                              |
| CPU                        | インテルの場合**第7世代以降**(4K出力可なGPU)                                                    |
| VCS                        | **Git**                                                                                |
| チャットツール             | **Slack**, **Mattermost** 等 インテグレーション機能が充実してるもの。                              |
| コード／タスク管理         | **GitLab**, **GitHub** 等 Git連携できるもの                                                   |
| ビルド／テスト             | **CI/CD環境**を構築して回していること                                                     |
| コーディング規約           | チームメンバーに浸透していること                                                        |
| コードフォーマッターの使用 | チームメンバーに浸透していること                                                        |
| ドキュメント               | 表計算ソフトに書かないこと                                                              |
| UML                        | 表計算ソフトに書かないこと                                                                  |
| テストエビデンス           | 表計算ソフトに書かないこと                                                              |
| 進捗管理                   | 表計算ソフトに書かないこと                                                              |
| 服装                       | スーツ強制じゃないこと                                                                  |
| その他                    | イヤホン／ヘッドホン着用OK                                                      |
| リモートワーク             | 可能なこと※「する、しない」は置いといて「できる」環境が整備できていること |
| 自社開発             | 自社開発なこと |
| サビ残しないこと|してる人がいたら注意できる空気であること|


- ピンキリ度

| `OK`数 | 結果     |
| ---------------- | --------- |
| 0..2             | キリキリ  |
| 3..5             | キリ     |
| 6..14            | ピンキリ |
| 15..max-1              | ピン     |
| max              | ピンピン     |

## 後記

みなさんの体感ピンキリ度に近かったでしょうか？  
ピンキリ度の結果に「ピンキリ」って「ピン」か「キリ」どっちやねん？って感じですが...😂
ピンピン案件探しの一助になれたら幸いです。

追伸: 「ピンキリチェックリストにこんな項目あるよー」等教えていただけるとありがたいです。
Git Clone時に「error: filename in tree entry contains backslash:」

#Git Errorは突然に
ちょっと環境が特殊かもしれませんが、、
Sambaで共有しているLinuxの作業ディレクトリ上に
WindowsのGitクライアントから `git clone` すると、下記のようなエラーが出ました。

`error: filename in tree entry contains backslash:`

#調べると、、
ドキュメンテーションより
>`core.protectNTFS`がtrueに設定されている場合、
>NTFSファイルシステムで問題を引き起こす可能性のあるパスのチェックアウトを許可しません。
>Windowsではデフォルトはtrue、それ以外ではfalseです。

#設定変更
```shell
git config --global core.protectNTFS false
```

うちの環境が特殊ですよね。。:sob:

#参考
https://github.com/civetweb/civetweb/issues/812
https://git-scm.com/docs/git-config/en
#自分用メモ　FlutterでIntlパッケージを使う（超簡易）

#FlutterでIntlパッケージを使う（超簡易

###インストール
[Intlリファレンス](https://pub.dev/packages/intl#-installing-tab-)

```yaml:pubspec.yaml

dependencies:
  flutter:
    sdk: flutter
  intl: ^0.16.1
```
###NumberFormatを使う
```dart
var formStr = "#0.00";
var formatter = numFormat(formatStr);
var targetNum = 43;

print(formatter(targetNum));
```
**結果**
>43.00

- ***#*** :可能なら表示されない桁
- 0 :必ず表示される桁
- その他 :[リンク](https://pub.dev/documentation/intl/latest/intl/NumberFormat-class.html)参照

###DateFormatを使う
ここで詰まった。
デフォルト言語の"en-US"以外を使う場合は初期化のためのメソッドを使う必要がある。
[参照リンク](https://api.flutter.dev/flutter/intl/DateFormat-class.html)

```dart:main.dart
import 'package:intl/date_symbol_data_local.dart';

void main() => initializeDateFormatting("ja-JP",null)
    .then((_)=> runApp(MyApp());
```

気をつけないといけないのは、最初の行のimport。
IDEの自動インポートに慣れてると忘れてしまうけど、これは自動でインポートされないので自分で書く必要がある。
ちなみに他の方法もあって、上記は一番シンプルなやり方で、ローカルにデータファイルをimportしている。
###↓他のimport法

```dart
//↓ブラウザ外で動かしていて、ファイルシステムにデータを置く場合
import 'package:intl/date_symbol_data_file.dart';

//↓ブラウザで動かしていて、サーバーからデータを読み取る場合
import 'package:intl/date_symbol_data_http_request.dart';
```

実はNumberFormatでも引数にローカル記号を入れると各国それぞれの記法に対応出来るらしいんだけど、まあ日本語なら特に問題ないよね

###詳細な使い方（本格的なローカライズなど）
[こちらの方の記事](https://medium.com/flutter-jp/intl-beb5b9e8ee73)に詳しい方法が載ってます。
ローカライズの対応までやりたいならこちらの記事を参照されたし。

とにかくDateFormatで日本語を使いたいだけならぼくの記事を参照にするだけで十分です。
PHP開発用のVisual Studioコード

私は個人的にPHPStormを開発用のメインIDEとして使用していますが、作業中の最高のIDEについて議論し始めました.VSCodeを使用する人もいれば、PHPStormを使用する人もいます。議論のため、VSCodeが完全なPHP開発IDEとして動作するようにプラグインの検索を開始しました。

While I personally use PHPStorm as my main IDE for development, we started debating the best IDE at work, some use VSCode, others use PHPStorm, because of the discussion, I started searching for plugins to make VSCode behave as a full PHP development IDE.

私の検索では、このブログ投稿に出会いました
In my search I came across this blog post

[vscode php development](https://blog.theodo.com/2019/07/vscode-php-development/)

このブログを読んで、私はインストールしました：
Reading this blog, I installed:

* [PHP Inteliphense](https://marketplace.visualstudio.com/items?itemName=bmewburn.vscode-intelephense-client)
* [xdebug](https://marketplace.visualstudio.com/items?itemName=kakumei.php-xdebug)

残りについては、 `settings.json`の指示に従っただけです。
For the rest, I just followed the instructions for the `settings.json`

私が行った唯一の追加手順は、常にdockerを使用し、マシンにローカルにPHPがインストールされていないため、「組み込みのphp検証」を無効にすることです。
The only extra step I took, is disabling the `built-in php validation` because I always use docker, and don´t have PHP installed locally on my machine.

##### VscodeおよびDocker用にXdebugを構成する

私は通常、開発環境にdockerを使用するため、xdebugの設定には時間がかかりました。さまざまなブログやstackoverflowの質問にアクセスした後、これが私の「launch.json」設定です
Since I usually make use of docker for my development enviroment, configuring xdebug took me a while, after visiting various blogs and stackoverflow questions, this is my `launch.json` config

```json
{
        "name": "Listen for XDebug",
        "type": "php",
        "request": "launch",
        "port": 9000,
        "log": true,
        "externalConsole": false,
        "pathMappings": {
            "/application": "${workspaceFolder}"
        },
        "ignore": [
            "**/vendor/**/*.php"
        ]
    }
```
[fuxide](https://dev.to/fuxide/setting-up-xdebug-for-vscode-in-an-docker-environment-27a9)ブログ投稿へのクレジット。これは設定の参照に使用します。
Credits to  [fuxide](https://dev.to/fuxide/setting-up-xdebug-for-vscode-in-an-docker-environment-27a9) blog post, that I use for reference for the config.

何らかの理由で変数の監視は機能しませんが、これらはデバッガの一般的なセクションに表示されます
For some reason the variable watches don´t work, but these are visible in the general section of the debugger

CLIを使用するのが好きなので、gitプラグインをインストールしたくありませんでしたが、職場の友人からの推奨に従って、[gitkraken](https://www.gitkraken.com) を試してみます。
I did not want to install any git plugin, because I like using the CLI, but per recommendation from my friends at work, I´ll give [gitkraken](https://www.gitkraken.com) a try.

世の中の読者にとって、どのIDEが開発にお気に入りですか？
For the readers out there, what IDE is your favorite for development?
Mediumを無料で無制限に読む方法

# 参考

[こちらが参考になります！](https://amzn.to/2TUZhD8)

# やりかた

## Chrome版
https://manojvivek.github.io/medium-unlimited/download/

ここからzipファイルをダウンロードして`解凍したフォルダ`を以下の手順で読み込む


その他のツール >> 拡張機能　>> デベローパーモードON >> パッケージ化されていない拡張機能を読み込む

## Firefox版
https://addons.mozilla.org/ja/firefox/addon/medium-unlimited-read-for-free/
おみくじでjavascriptを勉強

次の現場でjavascriptを使うことになったので、少しでも触れるようになっておこうと勉強し始めました。
手始めに、よくある「おみくじ」アプリを作ってみます
アプリと言えるほど大層なものではなく、ただweb上で表示するだけですが笑

#htmlコード(index.html)
```html
<html>
    <head>
        <meta http-equiv="content-type" charset="utf-8">
    </head>
    <body>
        <h1>簡単おみくじ</h1>
        <input type="button" id="getResult" value="ボタンを押すとおみくじが引けるよ">
        <div id="result"></div>
        <script src="script.js"></script>
    </body>
</html>
```

javascriptを適用したい場所に`script`を差し込んでやると、そこに反映してくれるようです。
でもcssと同様で、`head`に書くのが一般的なのかな？とも。
これは今後勉強していって気づけばいいですね。

#javascriptコード(script.js)
```javascript

let omikuji = {
    items: ["大吉", "吉", "中吉", "小吉", "末吉", "凶"],
    getResult: function() {
        let results = this.items;
        return results[Math.floor(Math.random() * results.length)]
    }
}
//console.log(omikuji.getResult())

let getResult = document.getElementById("getResult");
let result = document.getElementById("result");

getResult.addEventListener("click", function() {
    let done = omikuji.getResult();
    switch (done) {
        case "大吉":
            result.innerHTML = "おめでとう！結果は「" + done + "」でした";
            break;
        default:
            result.innerHTML = "結果は「" + done + "」でした";
    }
})
```

変数の宣言、条件分岐、関数の作成、HTMLの操作を取り入れました。
基礎的な事は豊富に学べたかなと思います。

#変数の宣言
javascriptでは`let`で変数を宣言する必要があるようです。
pythonでは宣言なしで使えたので、少し煩わしさがあります。
なお、定数を使用する際は`const`で宣言するみたいです。
事前に宣言する分、管理しやすいのがメリットですね。

#条件分岐
他の言語でもある`if`文でも良かったのですが、より簡単にまとめられる`switch`文を今回は使いました。
「if hoge = hogehoge」と書くより、`case`で結果だけ書く方が楽ですね。
ここでは、それぞれのcaseで`break`を書くことが注意です。
仮に下に書いたcaseにも該当すると、下が優先されてしまうからです。
caseに該当しない処理は`default`で書いてあげます

#関数
関数は`function`で定義してあげます。
また`items: []`のように関数内で変数を宣言する際は、
`let 変数名 = `ではなく`変数名: `になるのも注意です。

`Math.floor()`は、整数に直してくれます
`Math.random()`は、0-1内でランダム数字を作ります。


#HTMLの操作
HTML側の操作をできるのがjavascriptの醍醐味です。
今回はたくさんある操作の中で、3つ使ってみました。

`document.getElementById(htmlのid)`
これはhtmlで宣言した`id`をとってこれます。
つまり該当のid箇所に操作を加えることができます。

`addEventListener(“ユーザー動作”, 操作)`
ユーザーの動作を引き金として、次の操作を実行できます。
今回は”ユーザー動作”に`click`を入れました。
これはユーザーが画面クリックした時を、起点にしたいがためです。

`innerHTML`
HTML側に文章を渡すことができます。
html表記がそのまま使えるのでかなり便利ですね。

#実行結果はこうなります
![EA1E6052-F8A8-4786-B685-F6910538705C.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498092/8aaacf6f-4ccd-98eb-f98d-aeb7254fca37.jpeg)

![9E1600C5-884E-4440-861E-1C6C91BCF9EC.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498092/8f55875d-f7be-54f6-4f42-a14de308121f.jpeg)

以上です!
TECH::EXPERTを卒業後、転職して半年間の振り返り

#内容
　・私
　・TECH::EXPERTに通うことになった経緯
　・TECH::EXPERTでの学習したこと
　・TECH::EXPERTから転職活動
　・転職してから今までの半年間で
　・TechExpert学んだことから実際の業務に活かせたこと
　・TECH::EXPERTに金を払う価値があったのか
　・最近思うこと
　・今興味があること・宣伝

#私
　男・２０代前半
　新卒で証券会社の営業として就職
　転職を決意してTECH::EXPERT50期に
　９月入社でインターネット広告会社でエンジニアとして働き始める
　現在は社内向けマーケティング分析ツールに関わり、フロントエンドとバックエンドを担当している

#TECH::EXPERTに通うことになった経緯
　証券会社で働く中でAIやGAFA・BAT、アメリカ・中国ではNET系の企業が凄い事を知った
　また営業をしていたが、1年間の中で仕事を楽しいと思った瞬間がなかったので転職を決意した。

　今時のIT企業（チームラボとかを想像していたと思う）に転職したかった、
　営業のまま転職という選択肢もあったが、外回りが単純にだるかったのと
　プログラミングが出来ると、将来的に副業や週４勤務が出来るのではという安易な発想で
　未経験からのエンジニア転職を決意した。

　転職を考え始めてから、１ヶ月くらいでRubyの入門書をやってみたが以外と抵抗がなかった
　しかし独学だけで転職までいけるか微妙だと思ったためプログラミングスクールに通うことに決めた

　TECH::EXPERTに決めた理由は、一番人気だったからとチーム開発がカリキュラムにあったから
　くらいだと思う（今思えばTECH::EXPERTの広告戦略が上手だった説が濃厚）

　当時はお金がなかったため休職という形をとって、給料が出ている状態で
　会社の寮から教室に通っていた（時効なのでご勘弁）

#TECH::EXPERTでの学習したこと
　４月 ~ 6月くらい？なので覚えてないこともあるが
　基礎カリキュラム・応用カリキュラム・チーム開発で学んだこと
　　Ruby
　　Ruby on Rails
　　HTML(haml)
　　CSS（sass）
　　Javascript(jQuery)
　　AWS
　　git
　　アジャイル開発（チーム開発）
　チーム開発でPMになった（転職活動で使えると確信していたので）

#TECH::EXPERTから転職活動
　キャリアアドバイザーのYさんに死ぬほどお世話になった。
　新卒の就活の時から就活に対して謎の自信があったので、強気の条件を出して転職活動をしていたと思う
　　・給料年間３５０万ぐらい
　　・自社開発のみ

　面接ではこんな内容で話した気がする
　　・自作のアプリ
　　・チーム開発でPMの話
　　・持っている資格
　　・プログラミング・プログラマーに対して思っていること

　おそらく受けた会社は２０社くらいだった（条件を絞ったので受けれる求人が少なかった）
　６月初めから〜７月末くらいまで転職活動をしていた、そろそろ条件を緩めるか悩んでいた所に
　今の会社と渋谷のベンチャー企業から内定をいただいた。
　今の会社を選んだのは給料と機械学習プロダクトがあり、最新技術を追っていることだった。

#転職してから今までの半年間で
　やったこと
　　・マーケティング分析ツール開発
　　　・新機能開発（２機能）
　　　・既存機能の改善要望対応（細かい修正を含め10~20箇所くらい）
　　　・新UIの開発（UIの刷新）
　　・来期新卒研修カリキュラムの作成
　　
　学んだこと
　　・python
　　　・Flask
　　　・pandas
　　・vue
　　　・vuetify
　　・docker
　　・統計検定３級（３級勉強中）

　前職との違い
　　・出社１０時は神である
　　・体育会系ノリがない
　　・オフィスが今風
　　・スプリントで仕事が動いている
　　今のところマイナスのギャップはない

#TechExpert学んだことから実際の業務に活かせたこと
　活かせたこと
　　・Git(めっちゃ使う)
　　・フロントエンド（vueの前提知識になっている）
　　・バックエンド（CRUDやオブジェクト指向の理解に役立っている）
　　・アジャイル開発（実際の現場もアジャイル開発で動いている）
　　・朝と夕方のタスクを紙に書いて整理する習慣（これが一番役に立っているかも）
　　・わからないことはとりあえず調べてから人に聞くスタンス（自走する習慣がついたので）

　活かせなかったこと
　　・RubyとRubyonRailsは使えなかった（言語が違った）　
　　・jQuery（オワコン？）
　　・AWS（業務で使うのはもっとレベルが高かった）
　　・テスト（もっとちゃんとやっておけばよかった）

#TECH::EXPERTに金を払う価値があったのか
　結論から言うと、私はTECH::EXPERTに大満足だ、50万くらいお金がかかったが十分リターンがあった
　　・プログラミングの基礎がしっかりと学べた事
　　・高額のお金を払ったことで自分で退路を絶ったこと
　　・希望通り、予想以上の会社に転職できた事
　　・働き初めても自走する習慣がついた事
　　・この通りかなと思った（https://www.youtube.com/watch?v=bIOW48GgVC4）

#最近思うこと
　・機械学習は数学や統計の知識が必須ぽいので簡単に手を出すべきじゃないなぁ
　・pandasを使いこなせるようになりたいなぁ
　・AR・VRにすごい興味があるので、2年後くらいにはそっち方面に転職しようかなぁ
　・エンジニアのたまに訪れる快感は麻薬説あるなぁ
　・ツイッターのフォロワー伸ばしたいなぁと研究したいなぁ（ツイッターAPIとか？）
　・1000万エンジニアになるのは副業が必要かなぁ
　・外資の企業に転職したいなぁ（Adobeとかがいいかなぁ）
　・週４勤務は結構ありえそうだなぁ


#今興味があること・宣伝

　ツイッター頑張ってます：https://twitter.com/ar_tokki
　いろんなセミナーに顔だしてます：https://techplay.jp/
　InstagramのARエフェクト作ってます：https://www.instagram.com/ar_tokki/?hl=ja

インスタとかツイッターとかQiitaとかフォローしてくれると嬉しいです