OmniAICreator/Qiita-1.07M huggingface dataset:
ESLint 環境構築

# ESLint の導入
## インストール
```bash
npm init -y
npm i -D eslint
```
## コードスタイルの設定
```bash
$(npm bin)/eslint --init
```
### 選択
#### ESLintをどのように使用しますか？
```bash
? How would you like to use ESLint? 
  To check syntax only 
  To check syntax and find problems 
❯ To check syntax, find problems, and enforce code style
```
#### あなたのプロジェクトはどんな種類のモジュールを使っていますか？
```bash
❯ JavaScript modules (import/export) 
  CommonJS (require/exports) 
  None of these
```
#### あなたのプロジェクトはどのフレームワークを使っていますか？
```
  React 
❯ Vue.js 
  None of these
```
#### コードはどこで実行されますか？
```bash
❯◉ Browser
 ◯ Node
```
#### プロジェクトのスタイルをどのように定義しますか？
```bash
  Use a popular style guide 
❯ Answer questions about your style 
  Inspect your JavaScript file(s)
```
#### あなたはあなたの設定ファイルをどのようなフォーマットにしたいですか？
```bash
❯ JavaScript 
  YAML 
  JSON
```
#### どのスタイルの字下げを使用しますか？
```bash
  Tabs 
❯ Spaces
```
#### 文字列にはどのような引用符を使用しますか？
```bash
  Double 
❯ Single
```
#### どのような行末を使用しますか？
```bash
❯ Unix 
  Windows
```
#### セミコロンが必要ですか。
```bash
(Y/n) Y
```
#### あなたはあなたの設定ファイルをどのようなフォーマットにしたいですか？
```bash
❯ JavaScript 
  YAML 
  JSON
```
`Successfully created .eslintrc.js`
### 除外の設定
```bash
echo 'node_modules/
dist/
vendor/' > .eslintignore
```
### package.json に scripts を追加
```bash
vi package.json
```
```json
  "scripts": {
    "lint:fix": "eslint . --fix",
    "lint": "eslint ."
  },
```
### ESLint の実行
```bash
npm run lint
```
### ESLint の自動修正
```bash
npm run lint:fix
```
## 設定ファイル
### シンプルな設定の見本
```bash
echo 'module.exports = {
  'env': {
    'browser': true,
    'es6': true,
  },
  'extends': 'standard',
  'globals': {
    'Atomics': 'readonly',
    '$': 'readonly',
    'SharedArrayBuffer': 'readonly',
  },
  'parserOptions': {
    'ecmaVersion': 2015,
    'sourceType': 'module',
  },
  'plugins': [
    'vue',
  ],
  'rules': {
    'semi': ['error', 'always'],
    'comma-dangle': [2, 'always-multiline'],
    'no-var': 'error',
  },
};
' > .eslintrc.js
```
### IDE の拡張機能に ESLint がある場合は入れる
### IDE の拡張機能に HTMLhint がある場合は入れる
Go言語のMethod

Goの各タイプ（structなど）にmethodを作成することは可能です。

methodの定義には、receiverというものを指定する必要があります。
どのタイプからmethodを呼び出すかという感じです。

#定義
##値渡し
func (receiver変数名 receiver型)　method名(変数名1　変数型1, ..., 変数名n　変数型n) (戻り値1 戻り値型, ..., 戻り値n 戻り値型n) {
   //do something
}

例：

```go

type Address struct {
	prefecture, city, street string
}

type User struct {
	userID   int32
	userName string
	Address
}

func (user User) getUserAddress() (fullAddress string) {
	return user.prefecture + user.city + user.street
}

func main() {

	user := User{
		userID:   1000,
		userName: "yahama",
		Address: Address{
			prefecture: "千葉県",
			city:       "千葉市",
			street:     "花見区",
		},
	}

	fmt.Println(user.getUserAddress())
}

```

出力：
>千葉県千葉市花見区

##参照渡し（ポインター）
func (receiver変数名 *receiver型)　method名(変数名1　変数型1, ..., 変数名n　変数型n) (戻り値1 戻り値型, ..., 戻り値n 戻り値型n) {
   //do something
}

例：

```go

type Address struct {
	prefecture, city, street string
}

type User struct {
	userID   int32
	userName string
	Address
}

func (user User) getUserAddress() (fullAddress string) {
	return user.prefecture + user.city + user.street
}

func (user *User) changeUserAddress(newPrefecture, newCity, newStreet string) {
	user.prefecture = newPrefecture
	user.city = newCity
	user.street = newStreet
}

func main() {

	user := User{
		userID:   1000,
		userName: "yahama",
		Address: Address{
			prefecture: "千葉県",
			city:       "千葉市",
			street:     "花見区",
		},
	}

	//住所変更
	user.changeUserAddress("埼玉県", "さいたま市", "xx区")

	fmt.Println(user.getUserAddress())
}

```

出力：
>埼玉県さいたま市xx区

#methodのパラメータは不定の場合は、「...」でスライスで渡す

ただし、注意したいのは、最後のパラメータのみ「...」が利用できます。

例：

```go

type User struct {
	userID   int32
	userName string
}

func (user User) getUserWorkedDays(year int16, workedDay ...string) (workedDayCount int) {
	return len(workedDay)
}

func main() {

	user := User{
		userID:   1000,
		userName: "yahama",
	}

	fmt.Println("出勤日数:", user.getUserWorkedDays(2019, "01/10", "01/20", "01/22", "02/11", "02/22", "03/01"))
}
```

出力：
>出勤日数: 6

#タイプ別名でmethod作成
type 別名 既存タイプ
例： 

```go

type Age int

func (age Age) getBirthdayYear() (birthdayYear int) {
	t := time.Now()
	//int(age)で型変換
	return t.Year() - int(age)
}

func main() {

	var userAge Age = 21
	fmt.Println(userAge.getBirthdayYear())
}
```

出力：
>1998

#function型のパラメータ
メソッドのパラメータは関数型でもいけます。
関数も型の一種からです。

```go

func compute(fn func(float64, float64) float64) float64 {
	return fn(3, 4)
}

func main() {
	hypot := func(x, y float64) float64 {
		return math.Sqrt(x*x + y*y)
	}
	fmt.Println(hypot(5, 12))

	fmt.Println(compute(hypot))
	fmt.Println(compute(math.Pow))
}
```

出力：
>13
>5
>81

#匿名メソッドを利用してclosuresメソッドの作成
メソッドの中で匿名メソッドを定義している書き方です。
https://tour.golang.org/moretypes/25

``` go

func adder() func(int) int {
	sum := 0
	return func(x int) int {
		sum += x
		return sum
	}
}

func main() {
	pos, neg := adder(), adder()
	for i := 0; i < 10; i++ {
		fmt.Println(
			pos(i),
			neg(-2*i),
		)
	}
}

```

出力：

>0 0
>1 -2
>3 -6
>6 -12
>10 -20
>15 -30
>21 -42
>28 -56
>36 -72
>45 -90

以上
FelicaのIDmをAutoHotkeyで取得する

__AutoHotkeyでFelicaのIDmを取得するというのを`felicalib.dll`を使って行うソースです。__

公式サンプルをAutoHotkeyで動作するようにしたものです。

単純にIDmを確認する用途の他、
小規模事務所でのログ記録（PCの利用履歴を個人ごと）など、ちょっとした履歴作成のサポートになるかと思います。

一応、AutoHotkeyのこの機能を利用して、Felicaを置いている間だけ利用できる業務アプリ、という使い方をしています。



```AutoHotkey:Felica.ahk
; FelicaのIDmを返します。   （16進8バイト（文字数では半角16文字）の文字列）
; エラー等では 空欄 を返します。
get_FelicaIDm()
{
    Global DebugMode		; 0:エラーを表示しない。   1:エラーを表示する
    Global Error_text		; エラー発生時、その内容をセットします。
    Error_text =

    ; Felica DLLとの接続処理
    ;
    DLL_path = %A_ScriptDir%\felicalib.dll
	if(FileExist(DLL_path)=="")
    {
        Error_text = felicalib.dllが見つからない。(A)
        Goto ExitProc
    }

    hModule := DllCall("LoadLibrary", str, DLL_path)  ;DLLをロードする

    tmp_NULL = 
    DLL_pasori_open_path = %A_ScriptDir%\felicalib\pasori_open
    pasorip := DllCall(DLL_pasori_open_path, "Str", tmp_NULL)	; pasori = flib.pasori_open() # PaSoRi と接続
    ;msgbox, pasorip:%pasorip%
    if(pasorip==0)
    {
        Error_text = felicalib.dllが見つからない。(B)
        Goto ExitProc
    }

    ; Felicaリーダーとの接続処理
    ;
    DLL_pasori_init_path = %A_ScriptDir%\felicalib\pasori_init
    ret_link := DllCall(DLL_pasori_init_path, "Int", pasorip)
    ;msgbox, ret_link:%ret_link%
    if(ret_link!=0)		; Felicaリーダー側との関係でのエラー。  接続無し、など。
    {
        Error_text = Felicaリーダー側との関係でのエラー。  接続無し、など。
        Goto ExitProc
    }


    ;
    ; Felicaリーダーとの接続オッケーのケース
    ;


    DLL_felica_free_path = %A_ScriptDir%\felicalib\felica_free
    DllCall(DLL_felica_free_path, "Ptr", felicap)


    ; ポーリング処理
    ;
    SystemCode_Any := 0xffff
    DLL_felica_polling_path = %A_ScriptDir%\felicalib\felica_polling
    felicap := DllCall(DLL_felica_polling_path, "Ptr", pasorip, "UShort", SystemCode_Any, "UChar", 0, "UChar", 0)	; felica = flib.felica_polling(pasori, 0xFFFF, 0, 0) # FelCa を読む
    ;msgbox, felicap:%felicap%
    if(felicap==0)		; Felicaが置いてないケースなど、ポーリング不可の状態
    {
        Error_text = Felicaが置いてないケースなど、ポーリング不可の状態
        Goto ExitProc
    }


    ;IDm読み取り処理
    ;
    VarSetCapacity(idm_bytes, 64, 0)	; 変数 idm_bytes に、64バイトの大きさを確保します
    DLL_felica_getidm_path = %A_ScriptDir%\felicalib\felica_getidm
    DllCall(DLL_felica_getidm_path, "Ptr", felicap, "Ptr", &idm_bytes)

    Idm_text =
    Loop, 8
    {
        tmp_no := A_Index - 1
        tmp_Idm_byte := NumGet( idm_bytes, tmp_no, "UChar")
        tmp_16text := "00" . Format("00{1:X}", tmp_Idm_byte)
        StringRight, tmp_text, tmp_16text, 2
        Idm_text .= tmp_text
        ;msgbox, Idm_text : %Idm_text%     tmp_Idm_byte : %tmp_Idm_byte%
    }

    if(DebugMode==1)
    {
        msgbox, Idm_text : %Idm_text%
    }
    Goto ExitProc





    ExitProc:
        DLL_pasori_close_path = %A_ScriptDir%\felicalib\pasori_close
        DllCall(DLL_pasori_close_path, "Ptr", pasorip)	; flib.pasori_close(pasori) # PaSoRi と切断
        DllCall("FreeLibrary", UInt, hModule)  ;開放する

        if(DebugMode==1 && Error_text!="")
            msgbox, エラー : %Error_text%

		Return, %Idm_text%
}
```
シンプルな理由!jQueryが読み込まれない時

こんにちは[@yukifreeworld12](https://twitter.com/yukifreeworld12)です。

今回RailsでjQueryが読み込まれず原因を探すのに苦労したのですが原因がシンプルなものだったので1つの確認事項のメモとして書きました。

##問題
ヘッダーにBootstrapのTooltipsを使おうとしたが上手くいかずデベロッパーツールでConsoleを確認したところ以下のエラーが表示されjQueryが読み込まれていない
![スクリーンショット 2019-03-09 15.56.57.png](https://qiita-image-store.s3.amazonaws.com/0/333231/86d47e9c-8f6c-f68b-3e69-d164091f3b9f.png)


##原因
app/assets/javascript/application.js
・jqueryが読み込まれる順番が原因

```
//= require rails-ujs
//= require activestorage
//= require turbolinks
//= require bootstrap-sprockets
//= require jquery
//= require_tree .
```
↓　変更　　require jqueryが下にあるので一番上に持ってくる

##解決
これでjQueryが読み込まれちゃんと表示されました

```
//= require jquery
//= require rails-ujs
//= require turbolinks
//= require activestorage
//= require bootstrap-sprockets
//= require_tree .
```
GKEにおけるクラスタノードとサブネットの関係

※2019/03/09時点の情報です。

GKEにおけるクラスタノードとサブネットのIPアドレス周りを少し調べたのでメモ。

結果として、クラスタノードを作るときに指定するサブネットは、クラスタノード専用にするものとしてネットワーク設計するのが良さそう。
また、サービスをVPC内に公開する場合、このサブネットからIPを払い出すことになる。

## 検討の前提

- ネットワーク`network1`を作成する。
- サブネットワーク`subnetwork1` `192.168.0.0/24`を作成する。
- クラスタは`subnetwork1`で動かす。
- コンテナのサービスはVPC内部向けに公開する。インターネットへは公開しない。
- システム用に割り振られたネットワーク範囲が狭い（限りがある）。
- サブネットはGKE以外でも利用する予定がある。

## やりたいこと

- 利用するIPアドレスを可能な範囲で管理、制御したい。

## 検証したこと

### 1. サブネットはそのままに、クラスタノードのIP範囲を狭められるか
サブネットワークは`192.168.0.0/24`だが、クラスタノードが使うIP範囲は`192.168.0.0/29`のようにサブネットの一部に絞れるか。

結論は、**できない**。

クラスタ作成時に[`IPAllocationPolicy`](https://cloud.google.com/kubernetes-engine/docs/reference/rest/v1beta1/projects.locations.clusters#ipallocationpolicy) の`nodeIpv4CidrBlock`を指定できるが、これはクラスタ作成時にサブネットを作成する場合のみ指定できる。

```yaml:deployment-manager-cluster.yaml
ipAllocationPolicy:
  useIpAliases: true
  createSubnetwork: true
  nodeIpv4CidrBlock: 192.168.0.0/29
```

サブネットを事前に作っておくか、クラスタ作成時に作るかだけの違いであり、クラスタノードを作成時に指定するサブネットと、クラスタノードが使うサブネットは一致する。

### 2. 公開用IPとクラスタノード用IPのサブネットを分けられるか

VPC内にサービスを公開する場合にInternal Load Balancerを利用すると、`loadBalancerIP`を指定することになる。これにサブネット外のIPアドレスを指定できるか。

```yaml:deployment.yaml
apiVersion: "v1"
kind: "Service"
metadata:
  name: "my-service"
  namespace: "default"
  annotations:
    cloud.google.com/load-balancer-type: "Internal"
  labels:
    app: "sample"
spec:
  ports:
    - name: "http"
      protocol: "TCP"
      port: 80
      targetPort: 80
  selector:
    app: "sample"
  type: "LoadBalancer"
  loadBalancerIP: "192.168.0.11"
```

結論は、**できない**。

サブネット外のIPアドレスを指定してみたところ範囲外のためエラーとなった。
Internal Load Balancerを利用する場合は、ノード内のIPアドレスを付与する必要がある。


他にも何か調べたら、随時追記予定。
オフラインリアルタイムどう書く E31 の問題


オフラインでリアルタイムに「どう書く」をやるイベント( https://yhpg.doorkeeper.jp/events/86766 )を行っています。

問題は「ぐるぐる数」という名前で、詳細は
http://nabetani.sakura.ne.jp/hena/orde31rotnum/
です。

実装ができた方はこちらのコメント欄からリンクを張っていただくと見つけやすくて助かります。

似たような問題をもっと解きたいという方は、
https://nabetani.hatenadiary.com/entry/yhpg_list
に過去問リンク集がありますので、そちらをご覧になると良いと思います。

次回の [E32 〜 Final? 〜](https://yhpg.doorkeeper.jp/events/88379) は 4月6日。
obnizに6台のサーボをスマートに直刺しする方法

#■obniz色々やりすぎてピン数不足で困っていませんか?
obnizに***普通にサーボを直接接続する場合***、サーボ1台で3ピン使うので4台でobnizの12の総てのピンを使い切ってしまいますよね。サーボの制御に使う***pwmは6台搭載しているのに、ピン数不足に阻まれて4台止まり***という残念な状況も。そこで今回は、サーボの電源を外部から供給することで使用するピン数を減らして、***直接接続できるサーボの台数を6台まで拡張する方法を紹介***します。***ピンヘッダのみで実現しますので、非常にスマートに接続を拡大***できます。ちよっと***半田付け***あります。

***【Before】普通にサーボを直接接続した場合は4台でぱんぱん***
![WIN_20190309_12_26_39_Pro.jpg](https://qiita-image-store.s3.amazonaws.com/0/234533/ba3e5bb2-9148-54f2-385c-e985ddba8e88.jpeg)
***【After】今回紹介する方法では、こんなにスマートに6台まで直接接続できるようになります***
![WIN_20190309_12_37_27_Pro.jpg](https://qiita-image-store.s3.amazonaws.com/0/234533/b7f453ac-6401-cb47-84ad-b90c22a7ab0a.jpeg)
#■材料
***① ピンソケット×2***
***② ロングピンヘッダ 3列×8ピン　(1列×8ピンを3段接着等でも可)***
***リード線、メッキ線で半田付けします***
#■手順概要
いたって簡単です。
***① obnizの11番ピンの横にピンソケットを追加して電源を引き出します。***
***② ピンヘッダのgndとvccが6台のサーボに供給されるよう配線します。***
#■手順詳細
![image.png](https://qiita-image-store.s3.amazonaws.com/0/234533/98deceb2-7dee-439c-4d3e-bd6410f5b3e4.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/234533/6df863ea-cf3d-6938-a079-0afbca79a80b.png)
#■(参考)電源は外部供給になるのでwired関数から電源ピンを削除してください
![image.png](https://qiita-image-store.s3.amazonaws.com/0/234533/a2a04051-e9db-273b-88af-7429561b2200.png)
#■6サーボ直刺し、2足歩行ロボットへの適用例
2軸2足+2腕=6サーボの2足歩行ロボットです。
(ピンヘッダ部の光っているピンは予備で1つ増やしたものです)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/234533/ff6ed6e3-fde3-0958-7dda-7855a64f74a1.png)
#■実際の歩行動画も見てやって下さい
https://youtu.be/eRAcpms_dWc

#■まとめ
サーボ6台までであればこの方法が最もスマートだと思います。また、この方式にすることにより、6つの空きピンも捻出することができましたので、さらに色々なセンサーなんかも余裕で追加することができます。尚、今回ピンヘッダで作った3端子部分はサーボ限定ではなく、他のデバイスでも活用できます。
【初心者向け】複数モーダルの設置方法

モーダルを複数設置する場合、「modal01」「modal02」...とIDやClassを付与して設置するとコード量が増えてしまいますよね。
複数設置する場合はこのように書いてみましょう。
#jQuery

```
// モーダルが複数ある場合
$(function () {
  // モーダルのボタンをクリックした時
  $('.modal_trigger .modal_btn').on('click', function() {
    var btnIndex = $(this).index(); // 何番目のモーダルボタンかを取得
    $('.modal_area .modal_box').eq(btnIndex).fadeIn(); // クリックしたモーダルボタンと同じ番目のモーダルを表示する
  });

  // ×やモーダルの背景をクリックした時
  $('.modal_close , .modal_bg').click(function(){
    $('.modal_box').fadeOut(); // モーダルを非表示にする
  });
});
```

#Demo
[モーダル複数設置](http://practice.back.jp/modal/)

#まとめ

同じページ内に複数のブロックで使用する可能性もありますので、Classで運用してあげると楽かなと思います。（遭遇する頻度は少ないと思いますが。。。）
モーダルだけではなく、複数あるものはまとめて書いてしまうと何かと楽です。
正しく怠けましょう。
ギタリストやベーシストがオブジェクト指向を完全に理解するための記事

# ギタリストやベーシストがオブジェクト指向を完全に理解するための記事
## はじめに
皆さん初めまして、そーとくと申します。
今回がQiita初投稿になります。普段はTwitterに生息していてPythonなどを良しなに書いております。
さて、今回の記事ですが、タイトル通り<b>ギタリストやベーシスト向けのオブジェクト指向解説記事</b>となっております。
どちらかの経験しかない方はここで「は？」と思われるかもしれませんが、実はギターやベースの演奏とオブジェクト指向にはあるとても分かりやすい共通点があるので、今回はそれを解説していけたらなと思います。
また、この記事では***オブジェクト指向を完全に理解することはできません***、タイトル詐欺、誠に反省しております。
初学者向けにわかりやすく解説することが目的であり、また自分自身完全に理解したとは言えない立場のため、間違いだらけの記事になっているかもしれませんが、その場合優しく指摘いただけると幸いです。
## この記事の対象者
+ ギタリスト
+ ベーシスト
+ オブジェクト指向が全く分からない人

##　この記事が対象としていない人
+ 楽器が全くわからない人
+ オブジェクト指向を完全に理解した人

## オブジェクト指向って？
wikioediaによると
> オブジェクト指向（オブジェクトしこう、英: object-orientation）は、ソフトウェア工学構想の一つであり、ソフトウェア設計とプログラム記述の際に用いられる考え方あるいは概念（コンセプト）である。

とのことです。
ここにある通り、オブジェクト指向とは大まかに言ってしまえばプログラミングをする上での考え方のようなものです。
後述しますが、設計やチーム開発をする上でこの考え方は非常に役に立つことが多いです。
また、オブジェクト指向型言語と呼ばれるもの、特にJavaは非常にオブジェクト指向が強い言語であり、ある程度の理解がないと実装がうまくいかないことが多いです。
(良く忘れられがちですが、Pythonもオブジェクト指向言語です、私は主にPythonを書いているので、本記事でコードを用いて解説するときはPythonを使います。)
具体的にはどんな概念かというと大雑把に<b>ある目的を実現する実態</b>を<b>目的を実現するための複数のオブジェクト</b>に分けて実装するといった考え方だと私は理解しています。
例えば、電卓アプリを実装するときに、入力を受け取るオブジェクト、入力から計算結果を出すオブジェクト(これも目的の計算内容によってさらにわかれたりする。)、出力を返すオブジェクト、という風に分解して個別に実装して、最後にまとめるといったイメージです。

## 楽器との共通点
ここまで読んできて、ギタリスト・ベーシストの皆さんはなんとなく<b>あれ</b>に似てるなあと思ったりしたんじゃないでしょうか？そう、<b>あれ</b>ですよ<b>あれ</b>。
***エフェクター***です。
エフェクターやアンプ、ギター、あるいはギタリストであるあなた自身は、それぞれ音の加工や入力、出力といった<b>独立した役割を持ったオブジェクト</b>と考えることができます。
では、さらにわかりやすいように実際にあなたのエフェクターボードをオブジェクト指向的に書いてみましょう。(以下のコードは実際には動作しません、わかりやすく記述するためのデモです。)

あなたのギターはムスタング、エフェクターはブルースドライバーとメタルゾーンとかつないでるとしましょう。アンプはジャズコとします。
あなたはこれらのオブジェクトを用いて最終的に「入力した音に対していい感じの出力を返す」ような機能を実装したいとしましょう。オブジェクト指向ではこのように書きます。

```Sound.py
#ギターのクラス
class Musutang:
    @staticmethod
    def pickup('''なんか引いた音'''):
        #音を増幅して出力する処理
        return cleansound #クリーントーン

#エフェクターの基本のクラス
class Effector:
    #エフェクターの基本構造を書きます
    @staticmethod
    def Efect('''入ってくる音'''):
        #エフェクターの基本処理

#エフェクターのクラスを引き継ぐクラス        
class BluesDriver(Effector):
    #オーバーライドします
    @staticmethod
    def Effect('''入ってくる音'''):
        #音をカッコよくする処理
        return bluessound

class MetalZone(Effector):
    #オーバーライドします
    @staticmethod
    def Effect('''入ってくる音'''):
        #音を変態にする処理
        return metalsound

#アンプのクラス
class amp:
    @staticmethod
    def JazzChorus('''入ってくる音'''):
        #音を増幅して出力する処理
        return mixedsound #最後にアンプから出てくる音


#実際にクラスを組み合わせて動かすメソッド
def main():
    sound = input()
    clean = Musutang.pickup(sound)
    blues = BlusesDriver.Effect(clean)
    metal = MetalZone.Effect(blues)
    mixed = amp.JazzChorus(metal)

    return mixed

#おまじない
if __name__ == '__main__':
    main()

```
コーディング規約もへったくれもないクッソ適当なコードですが、雰囲気は大体これでつかんでいただけると思います。
実際に実装するときは別の機能は別のファイルに書いて、importなどを使って呼び出したりします。

## 何がうれしいのか
オブジェクト指向を使うと、例えば実装するときに機能別に専門家を割り振ることができます。
ギターの例でいえば、演奏するあなたは多くの場合、エフェクターやアンプの内部構造を知っていることは少ないと思います。
しかしあなたには、ギターを弾く(命令を出して)という機能があります。また、反対にエフェクターの作成者は必ずしもギタリストである必要はなく、回路のプロフェッショナルであることが求められます。
このように、お互い専門領域以外のことをよく知らなくても<b>自分が作ることのできる機能</b>だけを全員が作れば、最終的に良い音を出せるエフェクターボードやシステムが完成するというのがオブジェクト指向の利点であると考えられます。
他にも、コード全体の見通しがよくなったり、機能の追加や拡張がしやすいといった様々なメリットがあります。
これを機に、ギタリストのあなたもオブジェクト指向プログラミング、始めてみてはいかがでしょうか？
excel 関数 文字列同じかどうか EXACT

■A列とB列の文字列が同じかどうかか確認する
C列に以下の内容を入れる。
=EXACT(A1,B1)
正しい場合、「TRUE」
誤っている場合、「FALSE」

■「TRUE」「FALSE」の表記を変更したい場合
C列に以下の内容を入れる。
=IF(EXACT(A1,B1),"正","誤")
正しい場合、「正」
誤っている場合、「誤」
Java開発の基礎知識　メモ書き

#開発の流れ
javaの開発は、
①ソースコードの作成、②コンパイル、③実行の３ステップで行います。
それぞれのスッテプを詳しく追っていく。

##①ソースコードの作成
Javaが定める文法に従いコンピュータへの命令を記述していく。

```java
public class Lesson {
    public static void main(String[] args) {
    }
}
```

のように記述し、人が読める状態のプログラムをソースコード(source code)、ソースという。

②コンパイル
コンピュータは、CPUがプログラミングを解釈しながら指示どおりに動く。しかし、CPUは人が書いたソースコードを直接読んで動くことはできない。CPUが解釈できるようにマシーン言語と呼ばれるプログラムに変換する必要がある。その変換する処理がコンパイルである。コンパイルすることにより、バイトコードという状態に変換する。この処理の際に、ソースコードの確認も行われ、誤りがあればコンパイルは失敗し、誤りの箇所が表示される。この処理はコンパイラと呼ばれる変換ソフトウェアが行う。

③実行
コンパイルが無事完了したら、インタプリタと呼ばれるソフトウェアに対してバイトコードの実行を指示する。インタプリタはJVM(Java Virtual Machine)という仕組みを内部に持っており、バイトコードを読み込みながら、それをマシーン言語に変換してCPUに送る。これにより、コンピュータはソースコードの指示した通りに動作する。


#参考文献
「スッキリわかるJava入門]第二版 
著者：中山清喬 と国本大悟　発行所：株式会社インプレス

eclipseでの開発の手順は下記リンクを参考して下さい
https://www.javadrive.jp/eclipse3/step/
メッセージの外出し(Spring boot)

###手順１~applicaton.propertiesの設定~
src/main/resources/application.propertiesに以下の様に書きます。
日本語環境でロケールがjaの場合、messages_ja.propertiesを読み込む。

```application.properties
spring.messages.basename=messages  //ファイル名（拡張子不要）
spring.messages.cache-duration=-1
spring.messages.encoding=UTF-8 

```

###手順２~messages.propertiesの設定（メッセージ用ファイル）~
src/main/resources/messages.propertiesを作成

**messages.properties**というファイルがないと messageSource の auto-configuration が実行されないため、起動時にエラーメッセージ出るので、空ファイルを作成しておくこと。

##多言語化

多言語化する時には、messagesの後ろにロケールを示す文字、例えば英語（en）なら、`messages_en.properties`,日本語なら`messages_ja.properties`のようにファイルを用意することになります。 
今回は日本語を意味するロケール`messages_ja.properties`を作成。

```messages_ja.properties

# ハローワールド
hello.world=ハローワールド

```

###手順3~Java側での参照~

MessageSource をプロパティとして定義する。

```java:UserController.java

@Controller
public class UserController {

@Autowired
protected MessageSource messageSource;

@RequestMapping("/")
public String hello(Model model) {

     model.addAttribute("Msg", messageSource.getMessage("hello.world", null, Locale.JAPAN));
     return "hello";
   }

}
```

###手順4~HTML + thymeleafでの参照~

```hello.html

<h1 th:text="${Msg}">XXXXX</h1>

```


###その他~HTML＋tymeleafで直接参照する~

```hello.html

<h1 th:text="#{hello.world}">XXXXX</h1>

```
PHP7ではrandではなくrandom_intを使えとrecommendされる

php7のコードの中にrandを使用している部分があり、PhpStormのrecommendが出ていたため確認をしました。


## rand
簡単ですが乱数を生成してくれます。
[PHP: rand - Manual](http://php.net/manual/ja/function.rand.php)

```php
<?php
echo rand(0, 10);
```

あらためてマニュアルを確認すると、下記の警告が記載されていました。
> 警告
この関数が生成する値は、暗号学的に安全ではありません。そのため、これを暗号として使ってはいけません。暗号学的に安全な値が必要な場合は、random_int() か random_bytes() あるいは openssl_random_pseudo_bytes() を使いましょう。

## random_int
暗号理論的に安全な乱数を生成してくれるといった感じでしょうか。
[random_int - PHP](http://php.net/manual/ja/function.random-int.php)

> random_int — Generates cryptographically secure pseudo-random integers

[PHP rand() vs. random_int()](https://stackoverflow.com/questions/44228718/php-rand-vs-random-int)

まあこれだけ見るとすごろくを作る時はどっちでも良いって感じですかね。ただPhpStormにrecommend出されるのは気になります。

## randとrandom_intの違いをもう少し
### randは引数なしでも実行可能

```php
<?php
echo rand(); // 689881472

echo random_int(); // fatal error
```

### random_intはExceptionをスローする
randに文字列のaを渡すとwarningが発生しますが、random_intの場合はExceptionがスローされます。(詳細は上記のマニュアルへ)

```php
try {
    rand('a', 2);
} catch (Error $e) {
    var_dump($e->getMessage());
}

// PHP Warning:  rand() expects parameter 1 to be integer, string given in /Users/bunta.fujikawa/workspace/laravel-exercise/test.php on line 10

try {
    random_int('a', 2);
} catch (Error $e) {
    var_dump($e->getMessage());
}

// string(60) "random_int() expects parameter 1 to be integer, string given"
```

### 速度はrandの方が早い
こちらのstackoverflowで検証している方がいました。randの方が倍近く早いそうな。
[PHP rand() vs. random_int()](https://stackoverflow.com/questions/44228718/php-rand-vs-random-int)
Swift MkMapViewで地図アプリ作成してみた（13）- 簡単なんでAppleWatchとも連動してみた

#記事一覧
[Swift MkMapViewで地図アプリ作成してみた（記事一覧）](https://qiita.com/rain_00_00_09/items/3151b3faf2303fe78312)

#Watch Kitを追加する
New -> Targetを選択する。
<img width="750" alt="image1.png" src="https://qiita-image-store.s3.amazonaws.com/0/362635/9ba95c12-e96e-23f8-e33a-7474e66e9cbb.png">

WatchKit Appを選択してNext。
<img width="750" alt="image2.png" src="https://qiita-image-store.s3.amazonaws.com/0/362635/481c2d8a-8dc8-7000-3486-b6893c5e8880.png">

Product Nameを入力する。
iPhone側と異なる名前を選定する必要がある。
<img width="750" alt="image3.png" src="https://qiita-image-store.s3.amazonaws.com/0/362635/8b262a81-223e-34d7-9247-312197eae541.png">

Watch KitのstoryboadにLabelを追加する。
<img width="750" alt="image4.png" src="https://qiita-image-store.s3.amazonaws.com/0/362635/9d1aa502-d712-938b-a5c4-c46c28a3efb8.png">

AppleWatchのシミュレータを追加するため、赤線をクリックする。
<img width="750" alt="image7.png" src="https://qiita-image-store.s3.amazonaws.com/0/362635/bd4408fc-b828-9ff3-dd70-b0c29c05346b.png">

Add Additional Simulators...をクリックする。
<img width="750" alt="image8.png" src="https://qiita-image-store.s3.amazonaws.com/0/362635/df908fe5-9391-5b18-ad22-76719fe3c31e.png">

Device Typeで任意のApple Watchを選択し、Paired Simulator Nameを設定する。
<img width="750" alt="image9.png" src="https://qiita-image-store.s3.amazonaws.com/0/362635/fb9e5bb8-12df-34f0-3500-5797e192b568.png">

追加したAppleWatchシミュレータを選択する。
<img width="750" alt="image5.png" src="https://qiita-image-store.s3.amazonaws.com/0/362635/32057f0f-3891-fe9e-ae37-1d726c333a1f.png">

▶︎でPCシミュレータを起動する。
<img width="750" alt="image6.png" src="https://qiita-image-store.s3.amazonaws.com/0/362635/fa4d9bc9-f91b-207b-8917-989f092b6efb.png">

#デバイスで実行する

AppleWatchとBluetooth接続しているiPhoneをライトニングケーブルでMacに接続している状態であれば、画像の様にiPhone+AppleWatchの実行デバイスを選択できる。
<img width="750" alt="image11.png" src="https://qiita-image-store.s3.amazonaws.com/0/362635/05cf3a81-c73e-38b6-d51d-8282d89cd4ad.png">

▶︎で実行すると、iPhoneと（多少時間がかかるが）AppleWatch側にもアプリがインストールされる。
![image13.png](https://qiita-image-store.s3.amazonaws.com/0/362635/ac4fbc26-9b29-364c-939d-8500e1273ef1.png)


iPhoneとAppleWatch側のアプリはそれぞれ単独で実行できる。
今回はAppleWatch側はTextで"Label"としか表示できないアプリとなる。

＃影響力の武器は勧められた本（技術者にも営業力は必要）

#記事一覧
[Swift MkMapViewで地図アプリ作成してみた（記事一覧）](https://qiita.com/rain_00_00_09/items/3151b3faf2303fe78312)
Font AwesomeでWebページにアイコンを載せよう！

こんにちは。
未来電子テクノロジー(https://www.miraidenshi-tech.jp/intern-content/program/)
でインターンをしているodattiです。

僕はいま、HTMLとCSSについて学習しています。
今回は、Webサイト上のボタンに使われるアイコン
![IMG_0379.JPG](https://qiita-image-store.s3.amazonaws.com/0/365933/82bc358a-219b-5538-2f1a-d320e3a6b6d5.jpeg)
　　　　　　　　　　　　　↑こういうものです

を載せたいときに使うFont Awesomeについてご紹介します。
僕はプログラミング初心者ですので、間違っていることがあればどんどん指摘してください。すぐに訂正します。

#Font Awesomeとは
Font Awesomeのページ(https://fontawesome.com/v4.7.0/)
をのぞいてみると、
**Font Awesome gives you scalable vector icons that can instantly be customized**
とあります。
アイコンを絵としてではなく、文字として利用することができるツールなんですね。
文字として利用できることの利点は、customized。
つまり、**大きさや色などを自分で調節できちゃう**ということなんです。

ここからは、HTMLとCSSでFont Awesomeのアイコンを表示させる方法について説明します。

##1. Font AwesomeのCSSファイルを読み込む
使いたいアイコンを見つけたら、CSSファイルを読み込みます。
そして、リンクをHTMLのファイルに貼ります。

##2.spanタグにfaクラスとfa-(アイコン名)クラスを指定
どちらのクラスも別々に指定しましょう。

実は、たったこれだけのステップで、Webページにアイコンを表示させることができます。
アイコンの種類は600種類以上と豊富なので、Webページをよりおしゃれで個性的にできると思います。


#おわりに
以上、Font Awesomeの概要と、使用方法について説明しました。
とても便利ですので、Webページにアイコンを載せたいときは、ぜひ使ってみてください！
Automation Anywhere Community Editionについて

エンタープライズ向けのRPAプラットフォームとして認知されてきたAuotmation Anywhere Enterpriseに、
無償のCommunity版がリリースされました。

Community版の使用が認められる対象ユーザの範囲によっては、
プライベートでも色々と出来る気がしましたので、簡単なまとめを作ってみました。

2019年3月4日発表のプレスリリース
[Automation Anywhere Launches Free Community Edition for Small Businesses, Developers and Students](
https://www.automationanywhere.com/company/press-room/automation-anywhere-launches-free-community-edition-for-small-businesses-developers-and-students)

下記ページからダウンロードが可能。
[従来版(ver11)のCommunity Editionはこちら](https://www.automationanywhere.com/lp/community-edition-11)
[次世代版のA2019 Community Editionはこちら](https://www.automationanywhere.com/lp/rpa-editions-comparison)

上記ページにある比較表の和訳（原文も必ず確認してください）

|        |       AA ENTERPRISE DIGITAL WORKFORCE PLATFORM |    AA COMMUNITY EDITION    |
|:-----------------|:------------------:|:------------------:|
| 含まれるもの             |              Enterprise - RPAツール<BR>IQ bot - AI OCR的なもの<BR>Bot Insight (解析、可視化ツール)<br>Bot Store - Botのマーケットプレース<br>モバイルアプリ |        Enterprise - RPAツール<BR>IQ bot - AI OCR的なもの<BR>Bot Insight (解析、可視化ツール)<br>Bot Store - Botのマーケットプレース<br>モバイルアプリ        |
| 対象ユーザ           |           中～大企業 |       小規模の企業、開発者、学生<br><br>小規模の企業の定義: 250台以下かつ250ユーザかつ年間売上$500万（約5.5億円）までの企業       |
| ライセンス形態             |              ライセンス形態 有償 （年間のサブスクリプション）<br> 30日間の無償トライアルも有り |        無償        |
| 運用形態               |                オンプレミス、クラウド、ハイブリッド |         クラウドのみ         |
| Bot作成上の制限             |             無制限 |       2デバイスのみ対応<br>(開発用クライアントの数？要確認)       |
| 作成できるBot数          |           無制限  |      無制限        |
| テクニカルサポート          |           電話、eメール、チケットによるサポート対応、<br>A-Peopleでのコミュニティサポート、<br>Customer Success ManagerによるDedicatedなサポート  |      A-Peopleでのコミュニティサポート        |
| トレーニング           |           Automation Anywhere University （E ラーニング）、講師によるトレーニ ング、社内講師の育成コース  |      Automation Anywhere University （E ラーニング）        |

Community版の制限事項としては、1つの組織で5台までしか使用できないことと、
Community版ユーザが使えるIQ Botでは月に100ページまでしか処理できないそうです。

EラーニングサイトのAutomation Anywhereで、無償でトレーニングが受講できるほか、Community Edition用の日本語化されたチュートリアルも公開されています。
https://university.automationanywhere.com/
PHPのパスが通らなくなった際の解決方法（dyld: Library not ~~~~)

ターミナルでphp-vでバージョンを確認しようとした時に以下のエラー？が発生した

dyld: Library not loaded: /usr/local/opt/gettext/lib/libintl.8.dylib
  Referenced from: /usr/local/opt/php@7.1/bin/php


解決方法（以下、手順）

````
$ brew install wget
````

```
brew uninstall --force gettext
```

```
brew install gettext
```

以上で、php-vをしてみる

```
PHP 7.1.26 (cli) (built: Feb 26 2019 10:27:57) ( NTS )
Copyright (c) 1997-2018 The PHP Group
```

無事に回復
document.write()を使わない方法

「`document.write()`は使わない方がいい」は、言われ続けて久しいと思いますが、じゃあどうすればいいか考えてみました。


# `document.write()` は使わない方がいい理由


[MDN `document.write()`](https://developer.mozilla.org/ja/docs/Web/API/Document/write)説明ページにはどんなことが書かれているかというと、

>  deferred または asynchronous のスクリプト内では無視

→非同期の使い勝手が悪いですね

> Chrome55からキャッシュされていないHTTP の場合、`document.write()`を通じて挿入された&lt;script&gt;要素は実行されない

→そもそも期待通りに処理が動かない可能性がある

など動作が特殊で、期待通り動かないことがあるということ強調されています。

さらに[W3Cはdocument.write](https://www.w3.org/TR/2011/WD-html5-20110525/apis-in-html-documents.html#document.write)のHTML5での使用を非推奨としていて、

HTMLパーサーに影響を与えるよーとか、実行しても無視されるか例外が投げられることがあるよーとか、ネットワークの待ち時間に依存するよーなどなど書いてありました。

やっぱり使うのはダメそうです。

# document.write()に代わるHTML挿入方法

## Element.insertAdjacentHTML

この記事を書く時に、私自身初めて知った挿入方法です。[MDNのページはこちら](https://developer.mozilla.org/ja/docs/Web/API/Element/insertAdjacentHTML
)。

古くからある？一般的な？と言って正しいか悩みますが、innerHTMLを高機能にしたようなものと感じました。
innerHTMLは、

```javascript
Element.innerHTML = '<p>hello!</p>';
``` 
というイコールを使ってコンテンツの挿入を行いますが、これは 

```javascript
Element.insertAdjacentHTML('beforebegin', '<p>hello!</p>');
``` 
のように第1引数にElementからの相対位置、第2引数に挿入するコンテンツを指定します。

innerHTMLではElement内のコンテンツをまるっと書き換えるだけでしたが、insertAdjacentHTMLでは細かな挿入位置の指定ができるのが魅力です。ほかにも Element.insertAdjacentTEXTもあるので、用途に合わせて使えそうです。

もうinnerHTMLいらないかも・・。


## appendChild & insertBefore

[appendChild](https://developer.mozilla.org/ja/docs/Web/API/Node/appendChild) はノードの一番下にノードを追加できます。

```javascript
// Elementの子ノードリストの一番下に追加する
const inserted_child = Element.appendChild(child);
```

[insertBefore](https://developer.mozilla.org/ja/docs/Web/API/Node/insertBefore)は指定した要素の前に、ノードを追加できます。

```javascript
// Elementの子ノード<h2>の直前に追加する
const inserted_child = Element.insertBefore(child, Element.querySelector('h2'));
```

nextSiblingを使って直後に追加もできます。

```javascript
// Elementの子ノード<h2>の直後に追加する
const inserted_child = Element.insertBefore(child, Element.querySelector('h2').nextSibling);
```

# これにて解決、解決。じゃない。

ちょっと待てと。

&lt;body&gt;内で `<script>document.write()</script>` をしていたときは、
```document.write()``` 実行した場所にコンテンツが挿入されていたじゃないか！

上記の例であった、`Element`を取得する必要があるけどそのやり方には全く触れてないじゃないか！

ということで、番外編：scriptが実行された位置の取得もご興味ある方はご覧ください。



## 解決方法その1:document.currentScript

```html
<div>
 <script>
    const current = document.currentScript;
    const a = document.createElement('a')
    current.parentNode.appendChild(a);
 </script>
 <!-- ここに<a>が挿入される -->
</div>
```

## 解決方法その2:document.scripts[document.scripts.length-n]

currentScriptが取れない場合です。IE11ではcurrentScriptが利用できません。

```html
<div>
 <script>
    const current = document.scripts[document.scripts.length-n];
    const a = document.createElement('a')
    current.parentNode.appendChild(a);
 </script>
 <!-- ここに<a>が挿入される -->
</div>
```

`document.scripts.length-n` の `-n` は減算です。nは数字になり、少なくとも`document.scripts`はプロパティlengthを持っているのでその分`-1`する必要があります。

が・・この方法はうまくいかないかもしれない・・ちょっと検証ができたらまた更新します。
 
# これにて解決、解決。かな・・？

もっといい方法があるかもしれない・・・。
コメントでアドバイスいただけたら嬉しいです。
CA.swift #8 に参加しました

先日参加してきたサイバーエージェントさんのイベントの簡単なまとめです。

# イベント概要

サイバーエージェントのiOSエンジニアによる勉強会。
RxSwift、ReactiveSwift関連内容を中心とした特集回とのことでした。

## イベント名
[CA.swift #8][1]

## Twitter ハッシュタグ
[ca_swift][2]

## 発表テーマ／登壇者

- 『ViewModel設計パターンの比較と分類』／[yimajo][3]
- 『RxSwiftのDisposable達をご紹介！』／[matsuokah_][4]
- 『Introduction to RIBs』／[dekatotoro][5]
- 『RxSwift・ReactiveSwiftの比較や動向』／[shin8484][6]
- 『RxSwift を用いた設計で、配信コンテンツを不正利用から守る』／[AkkeyLab][7]

# 詳細

## 『ViewModel設計パターンの比較と分類』
[RxSwift研究読本][11]

ゲストスピーカーの今城氏のは「RxSwift研究読本」を執筆されている方。
最近は[note][12]の有料記事も書き始めたとか。

イベントのハッシュタグ[ca_swift][2]でつぶやかれた内容を画面の右に表示させており、リアルタイムで随時コメントを受けつつ進めるというスタイル。
音声読み上げされていて全てスルーせずやり取りしていて面白いです。

内容的にはRxSwiftのざっくりした歴史と、４つのViewModelのパターンを紹介していました。

- [sergdort][13]
- [kickstarter][14]
- [Functional Swift Conference 2018][15]
- 上記のViewModelが避けている「クラス指向的ViewModel」

4つ目はアンチパターンとして紹介され、「逆こんまり状態」と表現されてました。
つぶやき状況から察するに「RxSwift研究読本」を読むとより理解できそうです。

## 『RxSwiftのDisposable達をご紹介！』
[RxSwiftのDisposable達をご紹介！][8]

Disposable の種類・特徴を紹介されていました。
正直なところこのあたりはあまり気にしたことがなかったですが、実行順や効率などはなるほどと思いました。
最近追加されたRxAtomicについても触れられており、Cのラッパーでinline関数になっているというのは興味深かったです。

## 『Introduction to RIBs』
[Introduction to RIBs][18]

Uberが公開しているアーキテクチャのフレームワーク[「RIBs」][16]の紹介です。
Router、Interactor、Builderの集合体ということで、
View、Presenter、Componentもオプションとして加わる場合があります。
特徴として、大規模なモバイルアプリ用、テスト容易性、責務と依存関係が明確、
OCPの原則などが挙げられるそう。

RIBを一つの塊としてツリー構造で捉えられていて、UI層とは一致しなくて良いためUIKitに依存しないライフサイクルの管理ができるとのこと。

今回はじめて知ったのですが、試してみたことのある方は会場に結構いて、試してみたいと思いました。

## 『RxSwift・ReactiveSwiftの比較や動向』
[RxSwift・ReactiveSwiftの比較や動向][9]

RxSwiftとReactiveSwiftの両方を使ったことのある方による発表でした。
それぞれ別のプロダクトでこの両者を使うというのはなかなか貴重ですね。

印象としては、ReactiveSwiftの方が良い意味で「固い」感じがしましたが、RxSwiftの方が資料が多くシェアも多いので苦労しそうに感じました。

## 『RxSwift を用いた設計で、配信コンテンツを不正利用から守る』
[RxSwift を用いた設計で、配信コンテンツを不正利用から守る][10]

[VueFlux][17]ベースで個人開発している動画視聴アプリについて、RxSwiftを用いて動画の不正利用を防ぐアプローチを考えたというもの。
URL変更を購読する、IPアドレス変更を購読するというアプローチを紹介しつつ、やはり暗号化かな、、と。

#### おわりに

いままで勉強会には参加してこなかったのですが、外に出るのは刺激もあり学びもあるので、今後は少しでも時間を見つけて足を運んでみようかとおもいました。

[1]:https://cyberagent.connpass.com/event/120746/
[2]:https://twitter.com/hashtag/ca_swift?src=hash
[3]:https://twitter.com/yimajo
[4]:https://twitter.com/matsuokah_
[5]:https://github.com/dekatotoro
[6]:https://github.com/shin8484
[7]:https://twitter.com/AkkeyLab
[8]:https://speakerdeck.com/matsuokah/rxswiftfalsedisposableda-wokoshao-jie-e5e83286-9ffa-4291-b183-6a3b4f608f04
[9]:https://speakerdeck.com/shin8484/rxswifttoreactiveswift-bi-jiao-todong-xiang
[10]:https://speakerdeck.com/akkeylab/ca-dot-swift-number-8-protect-against-unauthorized-use-with-rxswift
[11]:https://swift.booth.pm/
[12]:https://note.mu/yimajo
[13]:https://github.com/sergdort/CleanArchitectureRxSwift
[14]:https://github.com/kickstarter/ios-oss
[15]:http://2018.funswiftconf.com/
[16]:https://github.com/uber/RIBs
[17]:https://github.com/ra1028/VueFlux
[18]:https://speakerdeck.com/dekatotoro/introduction-to-ribs-3b45bce6-abe4-4698-93b4-a353597787e7
シェルスクリプトの作成〜実行

##概要
普段の業務をスクリプトにして集計やコンテナの立ち上げなどを自動実行させることができるようになったのですが、久しぶりにスクリプトを作成しようとした際に色々と忘れていたので簡単にファイルの作成〜実行をまとめておきます。


###ファイルを作成
```bash:ターミナル
touch test.sh
```
###ファイルを開く
- vimを使いたい人

```bash:ターミナル
vim test.sh
```

- 普段使っているEditorを使いたい人

```bash:ターミナル
open test.sh
```

###ファイルの編集
- 今回はtouchコマンドを使ってtest2というファイルを生成をするスクリプトを実行できるようにします。

```bash:test.sh
#!/bin/bash

touch test2
```

###作成したファイルに実行権限を付与
- 以下のようにlsコマンドに`-l`オプションをつけることでそのファイルに与えられている権限を確認することができます
- `r`は読み込み権限。`w`は書き込み権限(左から 2～4 文字目ファイル所有者の権限)
- 実行権限に当たる`x`がないので付与する必要がある。付与することでファイル内に記載したスクリプトを実行できるようになります。

```:ターミナル（権限の確認）
$ ls -l test.sh
-rw-r--r--@ 1 matsunagatakahisa  staff  23  3  9 12:55 test.sh
```
- chomdコマンドに`+付与する権限　権限を付与したいファイル名`を渡すことで以下のように実行権限を付与することが可能です。


```:ターミナル（権限の付与①）
$ chmod +x test.sh
$ ls -l test.sh
-rwxr-xr-x@ 1 matsunagatakahisa  staff  23  3  9 12:55 test.sh
```

- ちなみに以下のような形でも権限を付与することができます。
- ①のコマンドで権限を付与した時との違いが分かるでしょうか？<br>
`① -rwxr-xr-x@　→　② -rwxr--r--@`<br>
②ではxの数が減っていることがみて取れます。これは権限付与対象をファイル作成者に限定したからです。
`-rwxr-xr-x`の2～4 文字目が**ファイル所有者への権限**、5~7文字目が**グループへの権限**、8~10文字目が**その他への権限**を表しています。また、744という数字は左から順に**ファイル所有者への権限**、**グループへの権限**、**その他への権限**を指定する箇所となっています。そして1~7の数字はそれぞれ、どのような権限を与えるかを表します。

```:ターミナル（権限の付与②）
$ chmod 744 test.sh
$ ls -l test.sh
-rwxr--r--@ 1 matsunagatakahisa  staff  23  3  9 12:55 test.sh
```

|0|1|2|3|4|5|6|7|
|:--:|:--:|:--:|:--:|:--:|:--:|:--:|:--:|
| ---  | --x|  -w- |-wx|r--|r-x|rw-|rwx|

###作成したファイルの実行
コマンドを実行するディレクトリ内にもし作成したシェルスクリプトのファイルが存在すれば
以下を実行することでスクリプトが実行されます。もし、現在いるディレクトリ以外でもこのスクリプトを実行する際はpathを設定する必要があります。

```:ターミナル（ファイルの実行）
$ ./test.sh
```
###参考
https://shellscript.sunone.me/tutorial.html
https://eng-entrance.com/linux-permission-basic
Apacheとかなしでxdebug(PHP7) on docker

xdebugを素のalpine+phpで入れる最小構成。

```Dockerfile 
FROM alpine:latest

RUN apk update \
	&& apk add php7
	
# for Xdebug
RUN apk add php7-xdebug
# イメージによっては RUN apk add php7-pecl-xdebug
COPY xdebug.ini  /etc/php7/conf.d/xdebug.ini
```

```xdebug.ini
zend_extension=/usr/lib/php7/modules/xdebug.so

[XDebug]
xdebug.remote_autostart=1
xdebug.remote_enable=1
# 自分のpcのIP address
xdebug.remote_host=192.168.254.163

xdebug.remote_port=9001
xdebug.remote_log=/tmp/xdebug.log
xdebug.remote_mode=req
xdebug.idekey=xdebug
xdebug.remote_handler=dbgp
```
ModelMapperの使い方(Spring boot)

メモメモ。

###ModelMapperの使いどころ
新規ユーザ作成が一番わかりやすい。
入力されたユーザ情報とユーザのEntity(DTO）をマッピングする。


今入っている案件のStrutsを使ったレガシープロジェクトではこんな感じ。
受け取ったフォーム情報からせっせか書き換えるイメージ。

```java:modelMapperを使わない場合

@PostMapping("/new")
    public String newUser(@Validated @ModelAttribute("userForm") UserForm form, BindingResult br) {

        User user = User.builder()
                .name(form.getName())
                .email(form.getEmail())
                .birthDay(form.getBirthDay())
                .zip(form.getZip())
                .address(form.getAddress())
                .build();

```

modelMapperを使用すると

```java:ModelMapperを使用すると

@PostMapping("/new")
    public String newUser(@Validated @ModelAttribute("userForm") UserForm form, BindingResult br) {

         ModelMapper modelMapper = new ModelMapper();
        // 入力値からDTOを作成する
        val inputUser = modelMapper.map(form, User.class);

```

スッキリ！！
使用するにはbuild.gradleやpom.xml等の依存関係の設定ファイルへ以下のような記述が必要になります。

```build.gradle
dependencies {

    // modelmapper
    compile "org.modelmapper:modelmapper:0.7.5"


}
```
困ったときは直近だけログを見るのはやめよう

ログをきちんと確認しろよという自分への戒めのために投稿します。
直近のログだけ見ていて、本当の原因に気付けなかった話です。。。

####第１章 迷走期####
Xcodeで開発をしていて、前日までログイン画面が表示されてたのに突然表示されない事がありました

コンソールログを見ると下記の様に表示されていました

```
2019-03-09 12:57:12.024808+0900 chatroom[18152:6340556]  - <AppMeasurement>[I-ACS036002] Analytics screen reporting is enabled. Call +[FIRAnalytics setScreenName:setScreenClass:] to set the screen name or override the default screen class name. To disable screen reporting, set the flag FirebaseScreenReportingEnabled to NO (boolean) in the Info.plist
2019-03-09 12:57:12.098794+0900 chatroom[18152:6340493] Unknown class LoginViewController in Interface Builder file.
2019-03-09 12:57:12.138554+0900 chatroom[18152:6340574] 5.16.0 - [Firebase/Analytics][I-ACS023007] Analytics v.50500000 started
2019-03-09 12:57:12.138614+0900 chatroom[18152:6340574] 5.16.0 - [Firebase/Analytics][I-ACS023008] To enable debug logging set the following application argument: -FIRAnalyticsDebugEnabled (see http://goo.gl/RfcP7r)
2019-03-09 12:57:12.179250+0900 chatroom[18152:6340563] [MC] System group container for systemgroup.com.apple.configurationprofiles path is /private/var/containers/Shared/SystemGroup/systemgroup.com.apple.configurationprofiles
2019-03-09 12:57:12.180278+0900 chatroom[18152:6340563] [MC] Reading from public effective user settings.
2019-03-09 12:57:12.485241+0900 chatroom[18152:6340575] TIC Read Status [1:0x0]: 1:57
2019-03-09 12:57:12.485309+0900 chatroom[18152:6340575] TIC Read Status [1:0x0]: 1:57
2019-03-09 12:58:00.111466+0900 chatroom[18152:6340493] Status bar could not find cached time string image. Rendering in-process.
```

ログを見て、「Status bar could not find cached time string image. Rendering in-proces」で検索をしていました。
それで、Viewを貼りなおしたり、Controller名が変わっていないか等の確認していました。
最終的には、Deployment Infoの欄のHide status barにチェックが入っているか確認までしましたが、解消されませんでした。
結果的に2時間近く、答えに近づかない作業をしてしまいました。

####第２章 転換期####

このままだと埒が明かないと思い、ログを上から見ていたら、こんな記述がありました

```
Unknown class LoginViewController in Interface Builder file.
```

この記述でググって見るとこんな投稿がありました

[[Xcode7] 「Unknown class xxxxx in Interface Builder file.」が出る](https://qiita.com/eidera/items/f6fd3b1088d7bd6fe523)

こちらに記載がある通り、LoginViewControllerのインスペクタを見てみました
すると、カスタムクラスのModule名が「None」になっていたのです。
もともと記載していたのに消えてしまっていました。
そして、Module名を元に戻すとログイン画面が表示されました。

####第３章 成長期####

ログを上からキチンと見ていれば、15分くらいで解決していた事象でした。
直近のエラーが発生して止まったところだけを見たのが今回の原因です。
困った時はデータ、画面の流れを追うためにログを上から見て、流れを追っていくことも必要だと感じました。

あと、ログレベル付けたいと単純に思いました（笑）
色々調べてみようと思います。

####参照####

[[Xcode7] 「Unknown class xxxxx in Interface Builder file.」が出る](https://qiita.com/eidera/items/f6fd3b1088d7bd6fe523)
※Qiitaの記事です
漢字を画像として出力【Ruby/Cairo 編】

Python と OpenCV を使って漢字一字の画像ファイルを作るという以下の記事を拝見して，Ruby と Cairo の組み合わせならどう書くかな，というのが本記事の主旨です。
[漢字を画像として出力【備忘録】 - Qiita](https://qiita.com/U1KURI/items/879bd5437786674a9019)

# cairo

Ruby には cairo という gem があります。広く使われているベクターグラフィックスライブラリーの Cairo を Ruby で簡単に扱えるようにしたものです。

Ruby の cairo を知るには Rubyist Magazine の以下の記事が役に立ちます。
[cairo： 2 次元画像描画ライブラリ](https://magazine.rubyist.net/articles/0019/0019-cairo.html)

だいぶ前の記事なので一部内容が古くなっているところもありますが，現在でも良い入門記事だと思います。

まずこれを

```
gem install cairo
```

でインストールしておきます。

# コード

```rb
require "cairo"

size = 16

surface = Cairo::ImageSurface.new Cairo::FORMAT_ARGB32, size, size
context = Cairo::Context.new surface

context.move_to 0, size * 0.88
context.set_font_size size
context.select_font_face "IPAexGothic"
context.show_text "永"

surface.write_to_png "a.png"
```

`context` に対して操作しているところは，見ればだいたい何をやっているか分かりそうですが，

```rb
context.move_to 0, size * 0.88
```

における `0.88` という謎の定数が気持ち悪いですね。
漢字のグリフ（字形データ）は正方形の枠を基準に設計されていますが，ここで使っている IPAexGothic をはじめ，多くの日本語フォントで，その正方形の左上から 88% 下に下がったところにグリフの座標原点が設定されているためです。
Progate PHP学習Ⅰを終えたので、実践できそうなことを絞り出してみる

[未来電子テクノロジー](https://www.miraidenshi-tech.jp/intern-content/program/)でインターンをしている[りく](https://qiita.com/rikukaikuu)です。

HTML,CSSとは違い、PHPという全く違う世界に触れたので、ここでPHPを使って何かに使えないかを足りない頭で考えてみようと思います。
#配列について
配列とは、箱を作って、その箱の中にデータを入れることです。
ここで注意したいのは、箱の順番です。
例えば、一番最初に入れた物を取り出そうとするとするとき、1個目のデータが欲しい場合は[0]としなければなりません。
なぜなら、配列のデータは先頭が[0]からスタートするからです。
そのため、[1]と打った場合は、2個目に入れたデータが出てくるので注意しましょう。
ちなみに、下のコードは「連想配列」といって、配列と同じく複数のデータをまとめて管理するのに便利です。

```php

$scores =array('数学'=>70,'英語'=>90,'国語'=>80);
    $scores['国語']+=5;
    echo $scores['国語'];
```
>（https://prog-8.com/php/study/1/11#/32 より引用）

この結果、85と出力されます。

#配列の活用法
配列の説明を見て考えていると、「これを使えば、いろんなことを言ってくるプログラムができるのでは？」と思いました。

```php:talk.php
<?php
$talk = array('かっこいい！', 'ださすぎて引く');
$num = rand(0,1);
echo $talk[$num];
?>
```
こうすれば、プログラムの方が自分でどの言葉をしゃべるのか選択してくれるので、ちょっとわくわくしません？
まあ、何をしゃべるかはこっち側で書くから会話とはほど遠いんですけど。
でも、決まったことしかしゃべってこない村人Aとか、「私が町長です。」としか言わないやつとかよりは、話し甲斐があるのではないかなと思います。
もし、誤りや無駄な文があれば修正するので、指摘してくれると助かります。
LESSでCSSを簡単に！LESSの使い方と便利な機能

[未来電子テクノロジー](https://www.miraidenshi-tech.jp/intern-content/program/)でインターンをしているyukako_nishimuraです。

# LESSって何？
LESSとは、CSSをより簡単に書けるようにした拡張言語です。
LESSを使うことで、より楽にCSSをかけるようになります。

# LESSってどうやって使うの？
LESSを使う方法は2通りあります。

## サーバー側でコンパイル

### lessのインストール
`npm install -g less`

### lessで書いたスタイルシートをcssのスタイルシートに変換

`lessc styles.less > styles.css`

LESSをCSSに変換します。
次に、HTMLの`<head>`タグ内に、

```html 
<link rel="stylesheet" href="styles.css" />
```
を挿入し、変換したCSSファイルを適用して完了です。

## クライアント側でコンパイル

HTMLに以下を挿入します。

```html
  <link rel="stylesheet/less" type="text/css" href="styles.less" />
    <script src="http://cdnjs.cloudflare.com/ajax/libs/less.js/3.9.0/less.min.js" ></script>
```
これだけで`styles.less`に書いたスタイルがクライアント側でCSSに変換されます。
いちいち書き直すたびに手動で変換しなくていいので楽ちんですね。

# LESSってどう便利なの？

## 変数が使える
LESSでは`@変数名`で自由に変数をつくって、使うことができます。

### 変数の代入
`@変数名 値`

例えば、
`@fontsize 10px`
とすると、`@fontsize`に10pxという値が代入できます。

### 変数の参照
プロパティ値などに
`@変数名`
を使うと、変数値を参照できる。

例えば
`font-size: @fontsize;`
とすると、変数の値が参照され、
`font-size: 10px;`
と同じ結果になります。
四則演算もできるので、簡単に綺麗なレイアウトを作れそうですね。

### セレクタ名やプロパティ名も変数で定義できる
実はセレクタ名やプロパティ名も変数で定義できていしまいます。

```css

@変数名: 文字列;

@{変数名}{
    プロパティ: 値;
    プロパティ: 値;    
}
```
参照時に変数名を`{}`で囲うことにだけ注意が必要です。

## プロパティをまとめる（ミックスイン）

共通するプロパティをわざわざ書くのって、ちょっと非効率ですね。
LESSではプロパティをまとめて、名前を付けることができます。

```css
.名前{
    プロパティ: 値;
    プロパティ: 値;
    プロパティ: 値;    
}
```
定義したプロパティの塊（ミックスイン）は、

```css
#header{
    プロパティ: 値;
    プロパティ: 値;
    .名前();  
}
```
とすることで、他のセレクタにもミックスインで定義したプロパティを適用できます。
オブジェクト指向言語の継承に似てますね。

また関数みたいに引数をつかうこともできます。

```css
.名前(@引数1;@引数2){
    プロパティ: 値;
    プロパティ: 値;
    プロパティ: 値;    
}
#header{
    .名前(値1;値2);  
}
```

## 関数が用意されている
例えば、16進数の色の表現にあまり詳しくない人にとっては、同じ系統の色を指定するのも一苦労ですよね。
しかし、用意された関数を使えば、同じ系統の色で少し暗い色を簡単に指定できます。

```less
@darker darken(色,暗くする％)
```

他にも[公式サイトの関数ページ](http://lesscss.org/functions/)に便利な関数がたくさんのっています。

## 階層的な書き方
こんなHTMLがあったとしましょう。

```html
<div>
  <h1>header1
  <a class="class1">anchor</a>
</div>
    
```
divの下のタグh1とクラスclass1をそれぞれ装飾したいです。
またdiv全体に統一したデザインも使いたいです。
CSSなら並べて定義しないといけません。

```css
div{}
div>h1{}
div>.class1{}
```
しかし、lessならこれを階層的に定義できます。

```css

div{
　h1{
　}
  .class1{
  }  
}
```
記述量も減り、理解しやすいですね。
bcrypt→deviseに既存システムのログイン周りを変更。DBを引き継ぐためにしたこと。

## やり方
①deviseを導入する。
②password_digestカラムをencrypted_passwordにリネームする。

具体的には、以下のコマンドでuserモデルを変更する。

```
rails g migration rename_password_digest_column_to_encrypted_password
```

```
class RenamePasswordDigestColumnToEncryptedPassword < ActiveRecord::Migration
  def change
    rename_column :password_digest, :encrypted_password, :users #テーブル名の指定を忘れない！！
  end
end
```

## やりたかったこと

既存システムのログイン周りを、bcryptを使用した全部手書きからdeviseログインに移行。DBのデータは引き継ぐ。


## なんでしたかったの

2000人くらい登録者がいるサービスのログインとかセッションをdeviseに任せたくなった（初心者なので作った時devise知らなかった）

## なんでできるの

デバイスもパスワードの暗号化にbcryptを使っているので、暗号化されたカラム名だけが異なる。

なのでカラム名を変更してあげればok。

## 注意

ユーザーは再度ログインが必要になる。大した問題ではないだろう。
[Flutter] ML KitのAndroidX問題解決。

こんにちは
今週グーグルのMLKITを使うことがあり、Flutterで試している中、
色んな問題解決をここに整理してみたいとおもいます。

```yaml
dependencies:
 firebase_ml_vision:
 image_picker:
```

上のようにDependenciesをGetして使うと最近のバージョンのライブラリーを持ってきます。

でも、ここで問題がありました。

firebase_ml_visionやimage_pickerもAndroidXにMigrate必要があります。

#こんなエラー
##一つ目

```gradle
def PLUGIN = "firebase_ml_vision";
def ANDROIDX_WARNING = "flutterPluginsAndroidXWarning";
gradle.buildFinished { buildResult ->
    if (buildResult.failure && !rootProject.ext.has(ANDROIDX_WARNING)) {
        println '         *********************************************************'
        println 'WARNING: This version of ' + PLUGIN + ' will break your Android build if it or its dependencies aren\'t compatible with AndroidX.'
        println '         See https://goo.gl/CP92wY for more information on the problem and how to fix it.'
        println '         This warning prints for all Android build failures. The real root cause of the error may be unrelated.'
        println '         *********************************************************'
        rootProject.ext.set(ANDROIDX_WARNING, true);
    }
}

```

##二つ目

```terminal
Unresolved Reference: FirebaseVisionLabelDetectorOptions
```

#FlutterでAndroidXへのMigration方法。
##エラー「一つ目」を解決した方法。
まず、私が以前書いてことを参加してください。

[[Android] Android Xに乗り換え](https://qiita.com/Dreamwalker/items/7330832d57e96cb3ada5)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/137182/ca34d8d9-55d9-94f8-5992-794d96e16065.png)

これにするとAndroidNativie開発ようにかえます。
後、AndroidのBuild System として使うGradleがBuildされます。

そとあと、

![image.png](https://qiita-image-store.s3.amazonaws.com/0/137182/c18c7e6f-28fb-7c77-d0b0-0b7a2b42dcf0.png)

これしたらまず、解決です。

##エラー「一つ目」を原因分析。

最近のfirebase_ml_visionはAndroidXです。


```gradle

android {
    compileSdkVersion 28

    defaultConfig {
        minSdkVersion 16
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }
    lintOptions {
        disable 'InvalidPackage'
    }
    dependencies {
        api 'com.google.firebase:firebase-ml-vision:19.0.2'
        implementation 'androidx.annotation:annotation:1.0.2'
        implementation 'androidx.exifinterface:exifinterface:1.0.0'
    }
}

```


##エラー「二つ目」を解決した方法。

これは後で書いてみたいと、思ってます。

つづく。。
「クラウドへの複数ファイル一括アップロード」＋python

##モチベーション
[「クラウドへの複数ファイル一括アップロード」を試す](https://qiita.com/atmaru/items/8187ea2d6eac4c03b49a)にてCLIからはアップロードできたので、プログラム(python)から実行する。

##環境
- RaspberryPi3B+
- Raspbian 9.8
- Python 2.7.13
- boto3

##
```
pi@raspberrypi:~ $ python
Python 2.7.13 (default, Sep 26 2018, 18:42:22)
[GCC 6.3.0 20170516] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import boto3
>>> bucket_name = "atsmaru-bucket"
>>> s3 = boto3.resource('s3')
>>> s3.Bucket(bucket_name).upload_file('/home/pi/test.jpg', 'test1.jpg')

```
アップロードできました
![image.png](https://qiita-image-store.s3.amazonaws.com/0/29032/5751280b-a423-e474-14ec-c0385085804f.png)

ファイル化して実行させても同じ結果と」なります。

```uploadPicToS3.py
import boto3
bucket_name = "atsmaru-bucket"
s3 = boto3.resource('s3')
s3.Bucket(bucket_name).upload_file('/home/pi/test.jpg', 'test1.jpg')
```

```
$ python uploadPicToS3.py
```
【Rails】pluralizeによる単数複数形変形

Railsのpluralizeは使用頻度高いけど忘れがちなのでメモ

#pluralize
単数形と複数形の変換できる


`<名詞>.pluralize`

例
`pluralize(1, "error")`
=>"1 error"

`pluralize(5, "error")`
=>"5 errors"


`pluralize(2, "woman")`
=> "2 women"

`pluralize(3, "erratum")`
=> "3 errata"


#参考

http://railsdoc.com/references/pluralize
SOLIDで開発できるようになりたい (作成中)

SRPとかOOPとか言われて、泣きそうになった:sob:

WEBサービスのビジネスが上手くいくことと、
そんな小難しい技術論は関係無いっ:rage:て
スケールしてから本物プログラマにリプレイスしてらう！って言いたいけど
知らないままでは言えないので学んでいきたい:pouting_cat:

◆まずは動画で(オープン/クローズドの原則)
https://www.youtube.com/watch?v=cUV1nXPfjFY

あーなるほど。すごくコウハイの気持ちがわかる。すごくすっきりした。


◆
https://www.youtube.com/watch?v=2WZDk89Ga8g


https://www.youtube.com/watch?v=NXZkBe9XDk4
Windowsのツールバーにピン留めしたはずのツールが、再起動すると外れる問題の対処法

Windows OSを使っている人は、良く使うツールをツールバーにピン留めしてショートカットにしていることと思います。
最近、ツールバーにピン留めしておいたツール（Cygwin Terminal）が、翌日PCを立ち上げたときにそのツールだけツールバーから外されてしまう現象に悩まされていました。
OSのバグか？と思いつつ毎回再登録していたのですが、毎日の作業が苦痛になり、ネット検索してみたところ、

1. ツールバーにピン留め
2. すぐにピン留めを外す
3. ピン留めを外した状態でOSを再起動
4. 再びツールバーにピン留め

を試してみるといいよというアドバイスを見つけ、試してみたところ再起動してもピン留めが消えなくなりました。
VirtualBoxをバージョンアップしたときにツールバーのアイコンが消えて、ピン留めし直すことがあったけど、似たような原因なのかもしれません。

参考： https://answers.microsoft.com/ja-jp/windows/forum/all/%E8%B5%B7%E5%8B%95%E6%99%82%E3%81%AB%E3%82%BF/3c46e1bb-2a81-46f5-b643-3701da88101b

元の質問者は、上記方法では解決せず、セキュリティソフトを無効にしたことで解決したようです。