OmniAICreator/Qiita-1.07M huggingface dataset:
AmazonConnectの通話録音をSalesforceのケースに埋め込む方法

## 要約
　AmazonConnectとSalesforceの連携に利用される「Amazon Connect CTI Adapter v3.1 for Salesforce」を用いてAmazonConnectの通話録音をSFDCに連携する方法を紹介します。
　[公式サイト](https://docs.aws.amazon.com/ja_jp/connect/latest/adminguide/salesforce-integration.html)や[こちらのサイト](https://dev.classmethod.jp/cloud/amazon-connect-salesforce-call-recording/)に、SalesforceのToDoに埋め込む方法については記載されているので、今回はCaseに埋め込む方法を記載します。

## 注意
この記事はAmazonConnect CTI Adapter 3.8をベースに作られています、最新バージョンで残っているかはわかりません。

## 前提知識
・AmazonConnectのテスト通話ができる
・Salesforceの開発者環境を作成できる
・AmazonConnectとSalesforceを連携させることができる。(CTI Adapterをインストールできる)→[こちらの記事](https://dev.classmethod.jp/cloud/aws/tried-to-amazon-connect-cti-adapter-v2-for-salesforce-install-and-setting/)が参考になります。

## 設定
AmazonConnect側、Salesforce側の設定方法です。

### AmazonConnect側
①録音設定
通話を録音したい問合せフローにて、`設定→通話記録動作の設定`を追加します。
設定としては、エージェントか顧客か両方か聞きたい音声データを設定してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339600/17d74682-e24e-3ade-36ce-b686b794a985.png)

②権限設定
　Salesforceに埋め込んだ通話録音を聞くことができるユーザを制限します。AmazonConnectのユーザに対して設定するセキュリティプロファイルに、通話録音を聞くだけのプロファイルを追加します。
`セキュリティプロファイル→新しいセキュリティプロファイルの追加→メトリクス及び品質→録音された通話`のすべての項目にチェックを入れます。
　作成したセキュリティプロファイルをCCPでログインするユーザに対して追加してください。

### Salesforce側
①SalesforceへAmazonConnectのURLを連携する
　Salesforceへ管理者にてログインし、lightningの設定画面から`カスタムコード→カスタム設定→Toolkit for Amazon Connectの横のmanage`を選択(出ない場合にはAmazonConnect CTIadapterをインストールできているか確認してください)
　新規のボタンが2つあると思います、上の方のボタンを押し、**自分のAmazonConnectのインスタンスのURLを入れてください**
`例：https://hogehoge.awsapp.com`

②レイアウト上に通話録音画面を埋め込む
　Salesforceの管理画面から、`オブジェクトマネージャー>Case→ケースページのレイアウト`へと進んでください。
　デフォルトでいくつかレイアウトがあると思います。自分の使用するレイアウトをクリックしてください。
　その後、下記のような画面にて、`Visualforceページ`をクリックすると、**ACSFCCP_CallRecordingCase**というものがあると思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339600/4d75db41-4a31-fb09-0b39-c04a7bd04f4e.png)

　こちらを埋め込みたい場所においてください。

### レイアウト上にコンタクトフローID記入欄を埋め込む(任意)
　先ほどの`②レイアウト上に通話録音画面を埋め込む`と同様の画面にて、`項目`をクリックすると、**Amazon Connect Contact Id**という項目があります。こちらを同様に好きな場所にドラックすると埋め込めます。
　項目を入れる欄を追加したので、ケース作成時にIDを入れる様にできます。


## 使い方
　ケースの項目である**amazonconnect__AC_Contact_Id__c**に、AmazonConnect側のコンタクトID(12345678-0000-1111-2222-33334444aaaa等)を入れ、CCPに対して先ほどのAmazonConnect側で権限を追加したユーザでログインすると通話録音が現れます。
 そこで通話を聞くことができます。

## 聞けない場合
①CCPにログインしていない
　CCPにログインしないと聞けません。

②通話が終了してからすぐだと聞けない
　電話直後にはS3へのデータ保存が完了していないことがあるので、数分待ってみてください。
　またCCPをACW状態から変更しないと保存が完了しない可能性があるようです。

③権限が足りないといわれる
　AmazonConnectのインスタンスのURLが間違っていないか確認してください。
　
## さらなる拡張
　AmazonConnectのコンタクトIDを手打ちするのはとても面倒です。そのため、ケースの自動作成(AmazonConnect SFDC lambda パッケージを利用)をする際に、一緒に埋め込むことをお勧めします。

こちらはイメージですが、lambdaパッケージのjsonに下記のような項目が入るようにするといいかもしれません。`awsContactId`は自分のAmazonConnectのコンタクトIDが入っている変数のイメージです。

```
            "Details":{
                "Parameters":{
                    "sf_operation":"create",
                    "sf_object":"Case",
                    "Origin":"Phone",
                    "Status":"New",
                    "Subject":"test",
                    "Priority":"Low",
                    "amazonconnect__AC_Contact_Id__c":awsContactId, #amazon connect contactId
                }
            }
```
GitHubのユーザー名を変えたらSourcetreeのPUSHでremote: Invalid username or password.と言われた

##はじめに
今回が初めての投稿となります。情報について学んでいる大学4年生です。就活も終え、自主的に新しいことを学ぶ機会が増えたため、自身の忘備録として、また、私と同じように困っている方の助けになればと思い投稿します。まだまだ学習中のため、何か間違ったことを記述している際には、ご指摘よろしくお願いいたします。


##環境
macOS
Sourcetree ver3.1.2

##エラー前の行動
1. GitHubのユーザー名を変更
2. SourcetreeでCOMMIT
3. SourcetreeでPUSH

##解決策
SourceTreeの設定からリモートを開き、リモートリポジトリのパスを編集

【変更前】
```https://github.com/GitHubユーザ名/Githubリポジトリ名.git```

【変更後】
```https://GitHubユーザ名@github.com/GitHubユーザ名/Githubリポジトリ名.git```

##結果
再度GithubのIDとPASSを聞かれ、入力することでPUSHできるようになりました。
digdagでプラグイン作成時の注意点

# はじめに
digdagプラグイン作成時に期待しない挙動となり困った点がいくつかありました。
その中から2点ほど注意すべき点を紹介したいと思います。
digdagのバージョンはv0.9.37です。

# 注意する点
(1)CommandExecutorを使用する
(2)runTaskで投げる例外による挙動の違い

### (1)CommandExecutorを使用する
Dockerコンテナ上での使用を想定するオペレータの場合、コマンドの実行はCommandExecutorを介して行いましょう。
CommandExecutorを使用しない場合コンテナ上で動かすことは出来ません。
CommandExecutorの実装はDockerCommandExecutorで、workflowに`docker`が設定されているかどうかによってコンテナ実行するかの分岐処理が行われています。


```java:DockerCommandExecutor.java
public Process start(Path projectPath, TaskRequest request, ProcessBuilder pb)
    throws IOException
{
    // TODO set TZ environment variable
    Config config = request.getConfig();
    if (config.has("docker")) {
        return startWithDocker(projectPath, request, pb);
    }
    else {
        return simple.start(projectPath.toAbsolutePath(), request, pb);
    }
}
```

以下CommandExecutorを使用したプラグインの簡単な例です。

```scala:HogePlugin.scala
import java.util.{Arrays => JArrays, List => JList}

import io.digdag.spi._
import javax.inject.Inject

object HogePlugin {
  class HogeOperatorProvider @Inject()(
      commandExecutor: CommandExecutor
  ) extends OperatorProvider {
    override def get(): JList[OperatorFactory] = JArrays.asList(
      new HogeOperatorFactory(commandExecutor)
    )
  }
}

class HogePlugin extends Plugin {
  override def getServiceProvider[T](aClass: Class[T]): Class[_ <: T] = {
    if (aClass ne classOf[OperatorProvider]) null
    else classOf[HogePlugin.HogeOperatorProvider].asSubclass(aClass)
  }
}
```

```scala:HogeOperatorFactory.scala
class HogeOperatorFactory(
    commandExecutor: CommandExecutor
) extends OperatorFactory {
  override def getType: String = "hoge"

  override def newOperator(context: OperatorContext): Operator = {
    new HogeOperatorFactory.HogeOperator(context, commandExecutor)
  }
}

object HogeOperatorFactory {
  private class HogeOperator(
      context: OperatorContext,
      commandExecutor: CommandExecutor,
  ) extends BaseOperator(context) {
    override def runTask(): TaskResult = {
      val pb = new ProcessBuilder("/bin/ls", "-l")
      commandExecutor.start(workspace.getPath, request, pb)
    }
  }
}
```

`io.digdag.standards.operator. ShOperatorFactory`の実装がとても参考になります


### (2)runTaskで投げる例外による挙動の違い
Operatorを実装する場合はBaseOperatorを継承してrunTaskを実装すると思いますが、ここでスローする例外によって挙動が変わります。
`io.digdag.core.agent.OperatorManager`を見るとざっくり以下の3つに分かれているようです。

1. TaskExecutionException
2. ConfigException
3. 上記以外のRuntimeExceptionと、AssertionError


2と3は出力されるログの内容が異なるくらいのようですが、リトライを行いたい場合は1のTaskExecutionExceptionを投げる必要があります。

> An exception thrown when an expected exception happens.

また`io.digdag.spi.TaskExecutionException`に以上のように記載されていますが、予想可能な例外発生の場合はTaskExecutionExceptionをスローするべきです。TaskExecutionExceptionの場合、stacktraceを表示せず、またタスクの再実行も行われます。

最初何も気にせず適当にExceptionを投げていたらタスクが失敗しているにも関わらずステータスがPendingのままになってしまってました。こんなことにならないように気をつけてください。


# まとめ
ハマった場合はとりあえずdigdagのソースを読むのが一番の解決の近道でした。
`io.digdag.plugin.example.ExamplePlugin`にプラグインの参考実装があります。
また、[ワークフローエンジンDigdagのまとめ](https://qiita.com/hiroysato/items/d0fe5e2d88c267413a82) にプラグインがまとめられているので、参考に出来る実装はたくさんありそうです。

個人で作っているプラグインもあるのでよかったら参考にしてみてください。
https://github.com/tosametal/digdag-plugins
一人で始めるふりかえり - カイゼン・ジャーニーを読んで

# この記事について
- 一日/一週間/一ヶ月の終わりに
- 何かのPJが終わったときに
- ふりかえりたいときに  

ひとりでふりかえりを行うためにヒントを起きます。

初歩的な内容になっています。対象としては、

- ふりかえりのやり方がわからない方
- ふりかえりってどうやるんだっけ？となった方、基礎を再確認したい方

向けの内容だと思います。

# 参考図書
カイゼン・ジャーニー　を読み、ふりかえりパートの内容を参考にしています。
[カイゼン・ジャーニー たった1人からはじめて、「越境」するチームをつくるまで | 市谷 聡啓, 新井 剛 |本 | 通販 | Amazon](https://www.amazon.co.jp/%E3%82%AB%E3%82%A4%E3%82%BC%E3%83%B3%E3%83%BB%E3%82%B8%E3%83%A3%E3%83%BC%E3%83%8B%E3%83%BC-%E3%81%9F%E3%81%A3%E3%81%9F1%E4%BA%BA%E3%81%8B%E3%82%89%E3%81%AF%E3%81%98%E3%82%81%E3%81%A6%E3%80%81%E3%80%8C%E8%B6%8A%E5%A2%83%E3%80%8D%E3%81%99%E3%82%8B%E3%83%81%E3%83%BC%E3%83%A0%E3%82%92%E3%81%A4%E3%81%8F%E3%82%8B%E3%81%BE%E3%81%A7-%E5%B8%82%E8%B0%B7-%E8%81%A1%E5%95%93/dp/4798153346/ref=tmm_pap_swatch_0?_encoding=UTF8&qid=&sr=)

# ふりかえりって？
これまで行ってきたことから「気づき」を得て、学び、これからどう進んでいくかを決める活動のことです。

# ふりかえりで大事なこと
普段、業務が忙しいと手元しか見えなくなってきます。**あえて立ち止まり、考えること**で客観的な観点で見てやり方を捉え直すことができます。

# ふりかえりの目的  
大きく２つあります。

- 「プロセスのカイゼン」。仕事をよりうまくやれるようになるため
- 展開が予測しにくいような「不確実性の高い状況」の下でも前進していくため、不確実な状況を明らかにしていくため

取り組みのスタート時点で計画を綿密に立てたところで、進んでいく中で変更が頻発します。
こういった場合、計画に過度に依存した進め方よりも、経験から得られたことを計画づくりに随時反映させていくほうが結果的に前進できます。

# ふりかえりの方法
ふりかえりのやり方としてはKPT(Keep,Problem,Try)というフレームワークが有名です。
### KPT
##### Keep
続けたいこと、やってみてよかったことを挙げます。
Keepに挙げたものの、続けていくかどうかは別の判断になるものもあります。
Keepが挙がっていること自体を見るのも重要です。立ち上げ時や分の悪いプロジェクトだとKeepが無いということもあります。
ですが、**ふりかえり自体はできている**のです。ふりかえりすらできていなかったらカイゼンはできません。まずはふりかえりをしたことをKeepに挙げましょう:+1:
##### Problem
問題点を挙げます。
問題になる前に、見逃さないために「モヤモヤしていること」「気にかかっていること」も挙げるようにしましょう。
Problemではできるだけ具体的なことを挙げましょう。「しんどかった」等の感情では、状態の可視化はできますが手が打ちづらいです。
その問題によってどんな不都合や不利益が出ているのか問いかけてみて、より深い洞察を得ましょう。
##### Try
次に試したいことを挙げます。
Problemが多いとそれに対応するTryが多くなるかもしれませんが、全部やろうとするのは待ったほうがよいです。Tryを全部やろうとして、どれも中途半端になってしまっては効果的ではありません。
取り組むTryは、緊急度や重要度を見定めて、順番をつけるようにしましょう。
次のふりかえりまでの期間で、取り組める量のTryは変わってきます。どこまでやれるか、考えて決めましょう。

Problemを残していいのか？ですが、いったん置いてみましょう。
本当に問題の度合いが大きいなら、またProblemとして挙がってくるでしょう。
そのときには取り組む順番を挙げるほうがよい、と判断できます。

# ふりかえりの頻度
絶対的な基準はありません。
ふりかえりのTryは、実験とも言えます。実験の結果を得られて、評価できる期間が望ましいです。
3ヶ月だと、取り組み自体を忘れてしまいかねません。
毎日でもいいでしょう。ただ、期間が短すぎて効果があったのか判断できない場合があると思います。
アジャイル開発のスクラムを取り入れているなら、その周期に合わせるとリズムが取れてよいと思います。

# 2回目のふりかえり
2回目のふりかえりは、前回のTryの確認から初めましょう。
効果があって続けたほうが良さそうなものは、Keepに移動しましょう。
効果があるということは、Problemに変化があるということです。問題の度合いが減っていたり、解消しているか結果を見ましょう。
ふりかえりを続けていくと、Keepが増えていくはずです。ただし、Keepの捉え直しも、忘れないようにしましょう。
当時はKeepだったけど、形骸化してしまっているKeepを続ける必要はないので、Keepを止めるという判断も、ふりかえりの中で行いましょう。

また、ふりかえりを継続しているとProblemやTryに傾向が見えてくることがあります。
その場合、問題を個別に対処するのではなく、問題の根源に対して手を打つことを考えましょう。

# 一人でふりかえりを行う際の落とし穴
自分で気づけないものはどうしようもありません。
だから、他人に気づかせてもらう仕組みにしないといけないのです。
自分の経験や思考だけだと、自分自身限界になります。でも、他人の経験や思考を活かす仕組みにすれば、自分の限界は超えられます。
だから、ふりかえりをチームで行うのです。
Hedera Consensus Serviceの概要について

*※2019年7月8日公開*

N-Village CTOの林田です。　
**「ブロックチェーンを超える技術」**と話題の**Hedera Hashgraph**が、新しいAPIサービス[Hedera Consensus Service](https://www.hedera.com/hh-consensus-service-whitepaper.pdf)を発表しましたので、簡単に概要を確認したいと思います。

# Hedera Consensus Serviceとは何か

まずは [おさらい](https://qiita.com/rinrin0108/items/c0b37c1bfe8fe732672e#hedera-hashgraph%E3%81%A8%E3%81%AF) になりますが、Hedera Hashgraphの特徴は以下のとおりです。

> # Hedera Hashgraphとは
　Hedera Hashgraph（ヘデラ　ハッシュグラフ）とは、新しいコンセンサスアルゴリズムを採用した分散台帳技術（DLT）です。既存の分散台帳技術とは、次の点が異なるとされています。

> 1. **性能**
　1つのシャードで1秒あたり数十万回のトランザクションを捌くことができます。コンセンサスの待ち時間は数秒程度です。

> 2. **セキュリティ**
　aBFT＝非同期ビザンチンフォルトトラレントであり、コンセンサスアルゴリズムにおいて数学的にセキュリティ上の脆弱性が無いことが証明されています。ただし、他の分散台帳技術と同様、悪意を持ったメンバーがコミュニティの1/3を超えないことが前提です。

> 3. **ガバナンスと安定性**
　世界中から各業界の専門知識を持つ企業が集まり、Hedera Hashgraphを統制するための委員会を組織しています。2019年7月8日の時点では、「ドイツテレコム（Deutsche Telekom）」、「DLA Piper」、「マガジネ・ルイーザ社（Magazine Luiza）」、「野村ホールディングス株式会社」、「Swisscom Blockchain AG」の5社が公表されています。この強力なガバナンスによって、安定したプラットフォーム運営が可能です。

> 4. **公平性**
　PoWなど、他のコンセンサスアルゴリズムと異なり、特定のトランザクションの処理順を優先する余地がありません。いずれのトランザクションも発生順（厳密には、ネットワーク全体のノードの2/3が取引を受け取ったタイムスタンプの中央値）で処理されるため、公平性のある取引が可能です。

> 5. **規制の遵守**
　多くの政府が求める、KYCやマネーロンダリング防止（AML）のチェックが可能です。

ここでいう「公平性」、すなわち**処理順が保証される**ということが、今回のHedera Consensus Serviceのキーになります。
（「公平性」が担保される仕組みについては、[こちら](https://qiita.com/rinrin0108/items/ecd7399ea19bb03b1135#%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E3%81%AE%E5%87%A6%E7%90%86%E9%A0%86%E3%81%AE%E6%B1%BA%E5%AE%9A%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9)をご確認ください。）

既存の中央集権型システムであれば、中央サーバが処理順を保証していました。しかし、それでは中央サーバの管理者が処理順を操作できてしまいます。これは公平であるとはいえません。
また、他のブロックチェーン（コンセンサスアルゴリズム）では処理順が保証されません。これも公平であるとはいえません。

**すなわち、Hedera Hashgraphの特徴の一つである「公平性」の部分を切り出して、他のアプリケーションから使えるようにサービス化（API化）したものが、今回発表された「Hedera Consensus Service」です。**

# 公平性の価値

例えば、株のトレーディング系のシステムだと、1つでも早い取引順番を確保するために莫大なコストを支払っています（専用線の確保や地理的に近い位置にサーバを置くなど）。
それくらい、公平性＝取引の処理順番、というのは大切なのです。これは株式市場だけでなく、オークションやゲーム等にも当てはまります。

これまでは公平性が不透明だったこれらの中央集権型システムが、機密性やパフォーマンスを担保する中央集権の部分と、取引順の公平性を担保するHedera Consensus Serviceを使い分けることで、両方のいいとこ取りができるメリットを享受できるようになります。

例えば、Hyperledger Fabricで作ったアプリ（プライベート台帳、中央集権）において、取引順の公平性を担保したい部分をHedera Consensus Serviceを使って非中央集権化することにより、プライベート台帳の良さであるプライバシーと、公開台帳の良さである公平性を両方得られるというイメージです。

# Hedera Consensus Serviceの所感

確かに、タイムスタンプサービスは中央集権型より分散型の方が、公平性という点では明らかに優れていると思います。必要機能に応じて、中央集権型と分散型、ハイブリッドな構成を検討する価値は十分にあるな、と感じました。


---
内容に間違いがあればご指摘いただけますと幸いです。よろしくお願いいたします。
[Blender2.8] 特定のVertex Groupに対して、Pythonで色を塗る。

Blender Python Script を触り始めて2日目。

単一のメッシュ内で、複雑な選択をしているグループをBlenderで作り、頂点カラーの情報としてもたせることによって、他のツールでグループとして扱えるようにしたい。

あらかじめメッシュの一部をVertex Groupでグルーピングし、そのグループに対して特定の頂点カラーを塗る。頂点カラーは、メッシュのVertex Colorsにアクセスしても色の配列が返されるだけなので、bmesh経由で色を塗った。

##参考
[Blender PythonのMeshデータアクセスのチートシート]
(https://qiita.com/kenyoshi17/items/b93bbba6451e3c6017e5)
[Applying per vertex colors]
(https://blender.stackexchange.com/questions/60676/applying-per-vertex-colors-to-new-bmesh)

##コード

```python
import bpy
import bmesh
from random import uniform

# OBJECT MODE
bpy.ops.object.mode_set(mode='OBJECT', toggle=False)

obj_name   = "Cylinder"
group_name = "Group"
color1 = [0.0,1.0,0.0,1.0]
color2 = [1.0,0.0,0.0,1.0]

# OBJECT
obj  = bpy.data.objects[obj_name]

# MESH
mesh = obj.data

# BMESH
bm = bmesh.new()
bm.from_mesh(mesh)

# COLOR LAYER
color_layer = bm.loops.layers.color.new("color")

# SET GROUP INDEX
group_index = 0
gs = obj.vertex_groups
for g in gs:
    if g.name == group_name:
        group_index = g.index

# SELECT COLOR2 GROUP
color2_idlist = []
for v in mesh.vertices:
    for grp in v.groups:
        if grp.group == group_index:
            color2_idlist.append(v.index)

# PAINT COLORS
for face in bm.faces:
    for loop in face.loops:
        if loop.vert.index in color2_idlist:
            loop[color_layer] = color2
        else:
            loop[color_layer] = color1

# APPLY DATA
bm.to_mesh(mesh)
```

object.dataのmeshよりも、bmeshを経由させた方が、おそらく操作しやすい。

頂点を中心にしたデータ構造に一旦あらためて、そこから操作していくとかがやりやすいのだろうか。
javascriptでPCとスマホの表示を分ける（matchMedia）

#javascriptでPCとスマホの表示を分ける（matchMedia）

今日はお腹の腹痛が激痛で痛いので（重言）、ちょっと簡単で短めです。

##matchMediaって？
CSSの@mediaqueryみたいな指定の仕方ができるメソッド。
簡単に使い方をまとめます。

```javascript


  var mediaQuery = window.matchMedia("screen and (max-width: 1060px)");

  function checkBreakPoint(mediaQuery) {

    if (mediaQuery.matches) {
      // trueが返ったとき（この場合画面幅が10６０px以下のとき

    } else {
      // falseのとき（この場合画面幅が1060より大きいとき）
    }
```

window.matchMediaでmediaQueryを定義し、それをmatchesでチェックしている、ということです。
さらに、それをブレイクポイント変更時すぐに実行したい時は、
以下のように記述します。

```javascript
  mediaQuery.addListener(checkBreakPoint); //ブレイクポイントにきた瞬間コールバック関数を実行
```

これで魔法使いになれるそうです。

うう、何か当たったのかな、、、
Symbolオブジェクト

[JavaScript本格入門](https://www.amazon.co.jp/dp/477418411X/ref=cm_sw_r_tw_dp_U_x_wxAJCbT3GGKT9)(ISBN 978-4774184111)で基礎からJavaScriptを勉強するシリーズです。今回はChapter3からSymbolオブジェクトについてです。

# Symbolオブジェクト

symbol型はES2015から標準化されたデータ型です。

- [Mozilla-Symbol](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Symbol)

## 宣言

宣言は下記のように行います。
データ型はsymbolとなります。

```js
let sym = Symbol('説明');
console.log(typeof sym);      // 出力:symbol
```

## 特徴

インスタンス化するときに渡す引数はあくまでも`説明`です。
同じ説明を入力したとしてもSymbolオブジェクトは別のものとみなされます。
因みに説明は省略可能です。

```js
let sym1 = Symbol('Hello symbol');
let sym2 = Symbol('Hello symbol');
console.log(sym1 === sym2);         // 出力:false
```

## 使い道

じゃんけんプログラムを作るとして、3種類の決まり手を定義する必要があります。
下記のような実装の仕方が思い浮かびます。

```js:Symbolを使わない実装
const ROCK = 0;
const SCISSOR = 1;
const PAPER = 2; 
let userInput = PAPER;

if(userInput === ROCK) {
    console.log('you choose rock.');
} else if (userInput === SCISSOR) {
    console.log('you choose scissor.');
} else {
    console.log('you choose paper.');
}
```

この方法でも識別はできますが、しかしながらROCK, SCISSOR, PAPERの数値自体には何の意味もありません。
やりたいことは3種類の概念を識別したいだけです。
ここでsymbolの特徴がうまく使えます。

```js:Symbolを使った実装
const ROCK = Symbol();
const SCISSOR = Symbol();
const PAPER = Symbol();
let userInput = PAPER;

if(userInput === ROCK) {
    console.log('you choose rock.');
} else if (userInput === SCISSOR) {
    console.log('you choose scissor.');
} else {
    console.log('you choose paper.');
}
```

このような場合、symbolを使ったほうがバグを未然に防げそうです。
Symbolを使わない実装では、別の人が `const MONDAY = 0`を追加した場合に、`ROCK === MONDAY` が等しい概念となってしまい困ったことになりますが、Symbolの場合はそれが発生しません。
ROS2でEigen3を使う

[ROS2関係トップページへ](https://qiita.com/NeK/items/7ac0f4ec10d51dbca084)

ROS2をインストールするとEigen3もインストールされる．
このEigen3を使用する方法．
Eigen3の詳しい使用方法は[公式のdocument]やを参照のこと．

# package.xmlでEigen3に関する記述を追記
~~以下に関する記述を行う．~~ 

- ~~build_depend~~
- ~~test_depend~~
- ~~exec_depend~~

package.xmlで特別な記載はいらない．ヘッダにて機能を実現していてROSのpackageとして存在しているわけではないから，だと思う．

# CMakeLists.txtでEigen3に関する記述を追加
Eigen3はヘッダにて機能を実現している(らしい)．
よってインクルードファイルのあるディレクトリの指定のみでよく，ソースファイルに関する指定はいらない．

関係する指定はtarget_include_directoriesなのでここに追記．

```CMakeLists.txt
find_package(Eigen3 REQUIRED)

target_include_directories([ターゲット名]
  PUBLIC
    $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include> # 通常の指定
    $<BUILD_INTERFACE:${EIGEN3_INCLUDE_DIR}> # Eigen3用の指定
    $<INSTALL_INTERFACE:include> # 通常指定
)
```

ament_target_dependenciesに記述が必要そうだが，要らない(2019/7/6確認)


## libraryとしてnodeを作成する場合
上記に加えて以下をCMakeLists.txtに加える．
これによりlibraryを使用する方は${EIGEN3_INCLUDE_DIR}に関する記述なしで大丈夫(Eigen3を使用しているか否か気にせずにOKになる)．

```CMakeLists.txt
ament_export_include_dicectories(
  include
  ${EIGEN3_INCLUDE_DIR}
)
```


# ソースコードで使用
必要ファイルをインクルードすると使える．例としては，int型2x2行列

```
#include <Eigen/Dense>

....

  Eigen::Matrix2d m(2,2);
```

# 参考

- [公式のdocument]
  - [マクロについて](https://eigen.tuxfamily.org/dox/TopicPreprocessorDirectives.html)
- [Eigen ー C++で線形代数を！(2)](http://www.singularpoint.org/blog/c/eigen_2/)
- [【C++】Eigen関数一覧](https://qiita.com/kenichi-t/items/616b50e8366d5d341db9)

[公式のdocument]:http://eigen.tuxfamily.org/dox/
【Laravel5】テーブルのID全てを一次元配列の形で取得する


# テーブルのID全てを一次元配列の形で取得する

例としてここでは`users`テーブルのすべてのレコードのIDを一次元配列の形で取得します

## `pluck()`を使用した例（ver.が5.2以降）

> pluckメソッドは指定したキーの全コレクション値を取得します。

引用：[コレクション 5.5 Laravel](https://readouble.com/laravel/5.5/ja/collections.html#method-pluck)

`pluck()`でキーの全コレクションを取得したのちに`toArray()`メソッドで配列にしてやると取得できます。
ということで以下のように記述

```php
App\User::all()->pluck('id')->toArray();
```

以下[tinker](https://github.com/laravel/tinker)(laravel用REPL)で実行した際の様子

```
$ php artisan tinker
Psy Shell v0.9.9 (PHP 7.3.4-1+ubuntu18.04.1+deb.sury.org+3 — cli) by Justin Hileman
>>> App\User::all()->pluck('id')->toArray()
=> [
     1,
     2,
     3,
     4,
     5,
     6,
   ]
>>>
```

## `lists()`を使用した例（ver.が5.2以前）

もしLaravel5.2以前を使用している場合は`lists`メソッドが使えるようです

```php
App\User::where('id' ,'>' ,0)->lists('id')->toArray();
```

**※手元に環境がないので動作は未確認**

`lists`メソッドについて詳しくは以下を参照

- [Return collection from the query builder · Issue #10478 · laravel/framework](https://github.com/laravel/framework/issues/10478)
- [Laravel Collectionのpluckとlistsについてまとめ（5.2以降はpluck） - ハマログ](https://blog.e2info.co.jp/2017/01/03/laravel-collection-pluck-or-lists/)

# 【おまけ】バリデーションでテーブルにあるデータなのかをチェックする場合

例えば都道府県マスタ（`prefectures`テーブル）にあるIDか否かをチェックする場合は以下のように記述すればいけるはず。
以下は`UserRequest`クラスにバリデーションルールを記述する際の例

```UserRequest.php
    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            // ...
            'prefecture_id' => ['required', 'integer', Rule::in(Prefecture::all()->pluck('id')->toArray())],
        ];
    }
```

# 参考URL
- [php – Eloquent ORM laravel 5 IDの配列を取得する - コードログ](https://codeday.me/jp/qa/20190204/239633.html)
- [コレクション 5.5 Laravel](https://readouble.com/laravel/5.5/ja/collections.html#method-pluck)
- [Return collection from the query builder · Issue #10478 · laravel/framework](https://github.com/laravel/framework/issues/10478)
- [Laravel Collectionのpluckとlistsについてまとめ（5.2以降はpluck） - ハマログ](https://blog.e2info.co.jp/2017/01/03/laravel-collection-pluck-or-lists/)
HTMLーグループ分け要素まとめー　復習にどうぞ

HTMLーグループ分け要素まとめー

・header
・nav
・article
・section
・main
・aside
・footer
・div

『問題』さて、これらはどんな要素でしょうか？
、
、
、
、
、
、
、
　　※テストに出ます
【C# .NET】特殊ディレクトリの中身全部見たる

自分用備忘録に

##概要
本文ママ。
「ドキュメント」「デスクトップ」「ピクチャ」なんかの特殊ディレクトリの中身を
サブディレクトリ含めすべて取得する。
ここでは一例としてドキュメントの中身を全部見る

##コード
```Directory.cs

class Directory
{
    public void DetDirectory()
    {
        // 特殊ディレクトリのパスを取得
        string documentPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);

        // サブディレクトリ含めてパスを全部見る。丸裸よ。
        string documents = Directory.EnumerateFiles(documentFilePath, "*", SearchOption.AllDirectories);
    }
}
```

EnumerateFilesの第一引数に見たいフォルダのパス、第二引数に検索パターン、第三引数に検索オプションを指定する。
第二引数に拡張子を指定することで特定の拡張子のみを引っ張ることもできる。

以上ですワ
ScalaのLibraryをIntellij IDEAで使う時に注意すること

# やろうとしていたこと

Akka-httpを使って、Apiサーバー開発をしようとした。
練習がてら、git cloneしたものをみて学習しようとした。


# しかし

` import akka... ` 
でコード補完が効かない、、、！！！


1日くらいずっと試行錯誤していたが、、、、


# 結果

projectをopenではなく、importしたらできた。

<img width="464" alt="スクリーンショット 2019-07-05 16.34.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/220683/a33e22ca-5f20-92b2-0a3b-2b4f799ab317.png">

<img width="547" alt="スクリーンショット 2019-07-05 16.35.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/220683/f207f12e-71d9-cdf7-a4df-d5b9a7bf2b56.png">


# まとめ

Intellijでgit clone したScalaを開発する時、openではなくimportしよう。
自分で作ったディレクトリをdocker で -v したのに書き込めないときの回避策

# 概要

自分で `mkdir` したディレクトリを `-v` したのに、そのディレクトリに書き込めないときの回避策

# 結論

絶対パスで指定する。
相対パスだと、rootになっている。
公式ドキュメントを探しているが、まだみつかっていない。

```
$ mkdir hoge
$ docker run --rm -u=1000:1000 -v hoge:/data/hoge ubuntu:14.04 ls -l /data 
total 4
drwxr-xr-x 2 root root 4096 Jul  5 07:12 hoge

$ docker run --rm -u=1000:1000 -v $PWD/hoge:/data/hoge ubuntu:14.04 ls -l /data              
total 4
drwxr-xr-x 2 1000 1000 4096 Jul  5 07:12 hoge
```

## 原因

どうも2013年のこのissueらしい(2019年7月5日現在Open状態)

- [Add ability to mount volume as user other than root · Issue \#2259 · moby/moby · GitHub](https://github.com/moby/moby/issues/2259)
『Yukarinライブラリ』 yukarin, become-yukarin 概要・リポジトリ関係を整理してみた

# 概要
『誰でも好きなキャラの声に(Convert your voice to favorite voice)』yukarin, become-yukarin の処理概要・リポジトリ関係を説明します。
[旧手法でよければ become-yukarin だけでも音声変換はできます](https://qiita.com/atticatticattic/items/f1e4c671d73d815bbad2)が、本記事では新手法 yukarin を使って音声変換をすることを、前提にしています。  
yukarin のコマンド解説記事も書く予定ですが、本記事でざっくりとイメージを整理できればと思います。
(音声に関しては門外漢なので、説明に誤りがあるかもしれません。誤りなどあれば、ご指摘ください）

#### 備考
**イメージしやすいようにターゲット音声は"結月ゆかり"とします**

**リポジトリの呼称 *1**
2019/6頃、リポジトリの呼称が変わりました。
下記の3つの呼称は yukarin, become-yukarin を指していると考えてください。

- 『ディープラーニングの力で結月ゆかりの声になるリポジトリ』
- 『誰でもで結月ゆかりの声になるリポジトリ』
- 『誰でも好きなキャラの声になれるリポジトリ』


# 1. yukarin, become-yukarin ってどうやってんの？
下記の2段階で、音声変換をしています。これは、yukarin, become-yukarin で共通しています。

- 第1段変換『自分音声 -> ゆかり音声(低解像度)』に変換 
- 第2段変換『ゆかり音声(低解像度) - > ゆかり音声(高解像度) 』変換で高音質化 

<img width="998" alt="スクリーンショット 2019-07-05 16.31.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12429/008ab6e4-a841-ed9a-df08-294d0c3ef812.png">


### **1.1 第1段階 : 音響特徴量の変換**
<img width="1013" alt="1st_1.png" src="https://qiita-image-store.s3.amazonaws.com/0/12429/a6d35611-e358-d108-c74d-e72ed64cb6f9.png">

音声を「基本周波数」・「スペクトル包絡」・「非周期性指標」の3つに分解して、"自声->ゆかり"に『調整』することで、音声変換をします。
この『調整』部分をディープラーニングで処理しています。
ただし、この方法では高音質化には限界があるとのことで、次の第2段学習で高精度化をしているようです。

**参考記事**
[音声合成システム WORLD に触れてみる](https://qiita.com/ohtaman/items/84426cee09c2ba4abc22)

### **1.2 第2段階 : スペクトログラムの変換**
<img width="1012" alt="2nd_1.png" src="https://qiita-image-store.s3.amazonaws.com/0/12429/e5121a8f-7ade-4ab5-b0b7-d4b1d0de65c9.png">

スペクトログラムを画像に見立てて、「第一変換後のスペクトログラム」を元に「オリジナルゆかり音声で作ったスペクトログラム」に変換することで高音質化をしているようです。
詳しくわかっていないため、下記の開発者ブログを参照願います。
https://hiroshiba.github.io/blog/became-yuduki-yukari-with-deep-learning-power/

**参考論文？**
下記論文と第2段の処理は似ているようです。
[多層ニューラルネットワークを用いた声質変換アルゴリズムの提案](https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=2ahUKEwi8grS7m53jAhVMyYsBHbngAL8QFjAAegQIABAC&url=https%3A%2F%2Fjsai.ixsq.nii.ac.jp%2Fej%2Findex.php%3Faction%3Dpages_view_main%26active_action%3Drepository_action_common_download%26item_id%3D1148%26item_no%3D1%26attribute_id%3D1%26file_no%3D1%26page_id%3D13%26block_id%3D23&usg=AOvVaw2A6L-auI3sfH-b3s-rlcLi)


# 2. yukarin, become-yukarin って 2つあるけど、どっち使えばいいの？
現状でもっとも良い音声変換をするためには、**両方使います**。
両リポジトリで、"第1段学習"・"第2段学習"を行い、その学習結果を使って yukarin リポジトリのプログラムで音質変換を行います。

<img width="1002" alt="スクリーンショット 2019-07-05 16.38.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12429/5e5a36d7-4fe1-02d4-8233-2736d461d1d3.png">

詳細は下記のようになります。

<img width="1332" alt="スクリーンショット 2019-07-11 13.53.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12429/014f319f-31d3-7518-b94d-96d7dbc741b7.png">

# 最後に
わかりにくところがあれば、本当に遠慮なくご質問ください！
ぶっちゃけ、最初から 100% の記事を書くのは難しいので、80% ぐらいで投稿しちゃってます。
なので、皆さんのコメントで 100%にしてください！

#### *1 リポジトリ名の変更(2019/6頃)
- become-yukarin : 『ディープラーニングの力で結月ゆかりの声になるリポジトリ』-> 『誰でも好きなキャラの声になれるリポジトリ』
- yukarin『誰でもで結月ゆかりの声になるリポジトリ』 -> 『誰でも好きなキャラの声になれるリポジトリ』
現実的なフルダイブの構想

個人研究用のため書いた

参考
https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2568804/
https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4981830/
理解するためは、必ず読んでください

必要な物
LIFUで脳細胞を活性させる（色んな座標の脳細胞）
LIFUで体に送る信号を麻痺させる
eggで脳波を読み取る

LIFU以外ここまではSA〇とほぼ一緒という

かべ
eggがお金高い
Lifuを一点固定ではなく一点色んな座標で使いたい

解決法
トランジスターを使ってegg作ろう
Lifuは音波だから、**レンズ**をトランジスタもどき、ledcubeもどきで作る

#トランジスターを使ってegg作ろう
トランジスタを使ってegg役割をさせて強度が強すぎると他にトランジスタを使って比活性させて
超音波モジュールは起動のまま（体を活性を許可を急にしまうとケガする）にして
安く出来るかも

ソフトは
https://www.youtube.com/watch?v=kbX9FLJ6WKw
deeplearningに決まってる

#麻痺
麻痺は熱発生を使って可能らしいが機嫌なので使えない方向で考慮する
特にそれ以外思いつかない（汗）（今の個人の感想２０１９年７月５日１６時）

#自由座標超音波
Lifuは音波だから、**レンズ**をトランジスタもどき、ledcubeもどきで作る
それだけだ

#ほか
機器の目的は、医学用ではなく（医学用で作らない、ゲーム機として作る）（実習用的な）、マッサージ機のように低周波で動く
多分５万円～10万円しそ

LIFUこんなに研究あるのにいつまでも研究だけして低周波低熱刺激も記録ないとあれだし書いた

#やったらいいこと
疲れたおじいさんを元気に（物体と体が軽い状態でプレイできる）
体がなくてもいい
寝たポーズでゲーム
5感脳・PCインタフェース
遠距離でセックスして家族にばれないという仕組み
vrでエッチできるかも
vrでロールプレイがもっとできるかも
vrを社会・出会いものよりゲーム・オンラインゲームとして活用できる
お互い許可あるなら仮想空間内で犯罪やってもいい（いくつを除き）
中二病が痛くない多分、多分もしろロールプレイをすごいするためのものに近い
OpenCV-PythonでGstreamer使えるようにする

(これまた自分用のメモ書き)

#開発環境
Windows10
GStreamer1.16.0 64bit(MinGW版のdevelop/runtime両方)
CMake
VisualStudio2019
Python3.7.x 64bit


#やったこと

- OpenCVのコンパイル
 
OpenCV 4.1.0をWindowsでビルドする手順
https://qiita.com/KurozumiGH/items/ef8cca96a13444b7dcda

↑を参考に進める

1. CUDAはとりあえず使わないのでGitとPythonにPATH通しておく。
2. opencvとopencv_contribをgitから取得してCMakeGUIでconfitureする。
3. 以下パラメータ確認 

| Name             |Value              |
|:-----------------|:------------------|
| BUILD_opencv_python2| 無効 |
| BUILD_opencv_python3| 有効 |
| CPU_BASELINE|変更しない|
| CPU_DISPATCH|変更しない|
| GSTREAMER_app_LIBRARY|[gstreamer_root]/lib/gstapp-1.0.lib|
| GSTREAMER_base_LIBRARY|[gstreamer_root]/lib/gstbase-1.0.lib|
| GSTREAMER_glib_INCLUDE_DIR|[gstreamer_root]/include/glib-2.0|
| GSTREAMER_glib_LIBRARY|[gstreamer_root]/lib/glib-2.0.lib|
| GSTREAMER_glibconfig_INCLUDE_DIR|[gstreamer_root]/lib/glib-2.0/include|
| GSTREAMER_gobject_LIBRARY|[gstreamer_root]/lib/gobject-2.0.lib|
| GSTREAMER_gst_INCLUDE_DIR|[gstreamer_root]/include/gstreamer-1.0|
| GSTREAMER_gstreamer_LIBRARY|[gstreamer_root]/lib/gstreamer-1.0.lib|
| GSTREAMER_pbutils_LIBRARY|[gstreamer_root]/lib/gstpbutils-1.0.lib|
| GSTREAMER_riff_LIBRARY|[gstreamer_root]/lib/gstriff-1.0.lib|
| OPENCV_EXTRA_MODULES_PATH|～opencv_contrib/modules|
| WITH_GSTREAMER|有効|

PythonのパスやGStreamerのパスは環境パスに居れば勝手に入るようですが合ってるか確認

　4. 確認したらGenerateしてVisualStudio用のソリューション作成してOpen Projectでソリューション開く
　5. ソリューションエクスプローラーにあるbindingsの配下にopencv_python3があるのでビルドターゲットをReleaseに切り替えてからopencv_python3をビルド実行
　6. ビルド完了したら"\bin\Release"に出力されたDLL一式と"\lib\python3\Release\cv2.cp37-win_amd64.pyd"を"Python\Lib\site-packages\cv2"内に上書きする
　7. 以下実行して結果でGStreamer有効になってるのを確認

```
python -c "import cv2; print(cv2.getBuildInformation())"
General configuration for OpenCV 4.1.0 =====================================
  Version control:               4.1.0

~~省略~~
  Video I/O:
    DC1394:                      NO
    FFMPEG:                      YES (prebuilt binaries)
      avcodec:                   YES (58.35.100)
      avformat:                  YES (58.20.100)
      avutil:                    YES (56.22.100)
      swscale:                   YES (5.3.100)
      avresample:                YES (4.0.0)
    GStreamer:                   YES (1.16.0)
    DirectShow:                  YES
    Media Foundation:            YES
      DXVA:                      YES



```
Firewall 越しの Zabbix のフロントエンドにアクセス

# やりたいこと

最近、クラウド上にシステムを構築する場合が増えてきてませんか？
ネットワークアクセスが制限されていてsshアクセスしか許されていない場合もあると思います。
でも、監視ソフトウェアを導入した場合、アラート通知機能を利用するだけでなく、
ダッシュボードにもアクセスしたいと思いませんか？
私はアクセスしたいです。

**ssh アクセスしか許されてないファイアウォールを越えて
Zabbixのフロントエンドにアクセスしたいのです!!**

<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/68083/77b2f352-1781-992a-c2b2-5f54b7acf899.png">

# どうすればいいか？
**ssh ポートフォワーディング機能** を使えば解決！！

ssh ポートフォワーディング機能が何かというと、
ざっくり言えば、ローカルマシンへの特定ポートへのアクセスを
ssh通信経路で接続先の任意のポートに転送できる便利機能です
(逆方向もできるみたいですが、使ったことはありません)。
詳細についてはgoogle先生に聞いてもらえれば詳しく解説した記事が見つかると思います。

# 具体的な手順
## 1. サーバA から サーバB へのssh接続でポートフォワーディング
sshコマンドに`-L`オプションを指定して、ポートフォワーディングを設定します。この例では、ローカルの`12345`ポートへのアクセスをリモートの`127.0.0.1:9820`に転送しています。

```
% ssh -L 12345:127.0.0.1:9820 user@[サーバBのIPアドレス]
```

すると、以下の図のようにサーバAの`12345`ポートへのアクセスがサーバBの`9820`に転送されます。
<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/68083/b87b649b-a19f-6679-8ce0-e28d7e6df5aa.png">

## 2. 自端末からサーバAへのssh接続もポートフォワーディング

### 自端末がLinux系の場合
サーバAからサーバBへの接続同様にsshコマンドに`-L`オプションを指定して、ポートフォワーディングを設定します。　

```
% ssh -L 23456:127.0.0.1:12345 user@[サーバAのIPアドレス]
```

### 自端末がWindowsの場合
Teratermなら [設定] > [SSH転送]にポート転送を追加します。
![teraterm.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/68083/ee3ae31f-0414-0c02-6b8b-6e595605b231.png)


その結果、自端末の`23456`ポートへのアクセスがサーバAの`12345`ポートに転送され、既に設定済のサーバAからサーバBへのポートフォワーディングにより、さらにサーバBの`9820`に転送されます。
<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/68083/1acbcc3e-eba6-31b3-52db-0dd05dc8ee5b.png">


# 結果

ブラウザで `http://localhost:23456/zabbix/` にアクセスすると...
<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/68083/a8d4edc6-fa36-efe8-6779-c57d28f0f8c6.png">
Zabbix フロントエンドの認証画面にアクセスできました！！:smiley:
Qiitaの文字色はカラーコードでも指定できる

## まえおき
どうもこんにちは。
Qiita の記事の文字色は `<font>` タグの `color` 属性を指定することで色の装飾が可能です。すでによく利用されている方もたくさんいらっしゃるかと思います。

`color` 属性には、だいたい `red` とか `green` みたいな色の名前で指定することが多かったんですが、カラーコードでも使えました。

### 名前で指定
<font color="red">**ああああ**</font>

```
<font color="red">**ああああ**</font>
```

### カラーコードで指定する例
<font color="#1e90ff">**ああああ**</font>

```
<font color="#1e90ff">**ああああ**</font>
```

### `rgb()`関数

<font color="rgb(107, 142, 35)">**ああああ**</font>

```
<font color="rgb(107, 142, 35)">**ああああ**</font>
```


けっこう色の指定は自由がききそうです。

## あとがき
よく考えたらカラーコードが使えるのは当たり前のはずなんですが、なぜか今までやろうと思うことがありませんでした。100人に1人くらいは僕みたいな人もいるかもしれないと思って衝動的に記事にしてみました。

よろしければ記事執筆のお供にどうぞ。

## 参考
- [FONT－HTMLタグリファレンス](http://www.htmq.com/html/font.shtml)
- [HTML Color Picker](https://www.w3schools.com/colors/colors_picker.asp)
dm-multipathで使用するiscsiデバイスのwwid

##　初めに

dm-multipathをiscsiで使用しようとしてwwidの見つけ方で躓きました。めったにやりませんので備忘録として記載します。

FCにはWWNNやWWPNが有りますので分かりやすいですが、iSCSIでは？？となってしまいました。

どうも/dev/disk/by-idで分かると[ここ](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/storage_administration_guide/persistent_naming#persistent_naming-wwid)には書いてあるのですが、InquiryのVID/PIDとSerial Numberの組み合わせで作成されるようですが説明が良く分かりません。

##　例

以下CentOS7.6にRDX QuikStation8というデバイスを接続したバ場合の例です。

/dev/disk/by-idでは以下の様に表示されます。

```
# ls -l /dev/disk/by-id
lrwxrwxrwx. 1 root root  9 Jul  5 01:25 scsi-1TANDBERGRDX_SERIAL123 -> ../../sdb
```

[こちら](https://qiita.com/papillon/items/b4b77bf676840a0e74b8)の大変分かりやす記事を参考に/etc/multipath.confを編集していたのですが上で表示されている頭の"scsi-"等もwwidに含まれるものと勘違いしておりうまくいかないなーとなっておりました。

dm-multipathからLUNが認識されるwwidは認識されると/etc/multipath/wwidsに記録されるようです。

```
# cat /etc/multipath/wwids
# Multipath wwids, Version : 1.0
# NOTE: This file is automatically maintained by multipath and multipathd.
# You should not need to edit this file in normal circumstances.
#
# Valid WWIDs:
/1TANDBERGRDX_SERIAL123/
```
ここで認識されている頭の"1"がなんだか良く分かりませんが、後はVID+PID＋"_"+SerialNumberのようです。
[こちらのかた]はscsi_idというコマンドで調べられるとおっしゃっておられます、調べてみるとscsi_idは/lib/udev/scsi_idの事のようです。
実行すると今度は間にブランクが入ります。

```
# /lib/udev/scsi_id --whitelisted --device=/dev/sdb
1TANDBERGRDX             SERIAL123
```
/etc/multipath.confのbalcklistにwwwid ".*"等を記載した場合はVID/PIDのみ記載の場合は先頭の"1"の意味がはっきりしませんので

```
blacklist {
        wwid ".*"
}
blacklist_exceptions {
        wwid ".*TANDBERGRDX"
}
```

シリアルも指定したい場合は

```
blacklist {
        wwid ".*"
}
blacklist_exceptions {
        wwid ".*TANDBERGRDX.*SERIAL123"
}
```
等にすれば無難なようです。
【C# .NET】OutLookからファイルを添付してメールを送信

似たような記事もあるとは思うが、自分用の備忘録に投稿。

##概要
もはやタイトルの通り。
C#でOutLookを動かしてメールを指定したアドレスに送信する。
その際に任意のファイルを添付して送信。
プログラマ歴数か月のペーペーなのでコードが汚かったりおかしかったりしても堪忍な。
.NETframework 4.6.1どす

##準備
[NuGetパッケージマネージャー] → [ソリューションのNuGetパッケージの管理]で
「Microsoft.Office.Interop.Outlook」をドン。
これだけ。

##コード
```SendMail.cs
using OutLook = Microsoft.Office.Interop.Outlook;

namespace Mail
{
    class SendMail
    {
        public void sendMail()
        {
            var ol = new Outlook.Application();
            Outlook.MailItem mail = ol.CreateItem(Outlook.OlItemType.olMailItem) as Outlook.MailItem;
            mail.Subject = "メールタイトル";
            Outlook.AddressEntry currentUser = ol.Session.CurrentUser.AddressEntry;
            mail.Body = "メール本文";
            mail.Recipients.Add("送信先");
            mail.Attachment.Add("添付するファイルのパス");
            mail.Recipients.ResolveAll();
            mail.Send();
        }
    }
}
```

思ったよりも簡単でびっくり。
やったね。
AndroidでRecyclerViewが一番上までスクロールされたイベントをキャッチする


AndroidでRecyclerViewのスクロールが一番上まで戻った時にイベントを発火される方法を書きます。


## カスタムスクロールリスナーを実装する

```kotlin

class CustomScrollToTopListener(val layoutManager: GridLayoutManager) : RecyclerView.OnScrollListener() {

    companion object {
        private const val FIRST_POSITION = 0
    }

    private var scrollToTopListener: ScrollToTopListener? = null

    interface ScrollToTopListener {
        fun onScrollToTop()
    }

    override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
        super.onScrolled(recyclerView, dx, dy)

        val visiblePosition = layoutManager.findFirstVisibleItemPosition()
        if (visiblePosition == FIRST_POSITION && recyclerView.getChildAt(0).top == FIRST_POSITION) {
            // 先頭までスクロールしたとき
            scrollToTopListener?.onScrollToTop()
        }
    }

    fun setScrollToTopListener(listener: ScrollToTopListener) {
        this.scrollToTopListener = listener
    }
}

```


## リスナーをRecyclerViewにセットして更新する

あとはこのカスタムリスナーをRecyclerViewにセットするだけです。

```kotlin

val scrollListener = CustomScrollToTopListener(layoutManager)
scrollListener.setScrollToTopListener(object : CustomScrollToTopListener.ScrollToTopListener {
    override fun onScrollToTop() {
        // 一番上にスクロールしたときの処理を書く
    }
})

```

以上です。
プログラミングを始めて1週間目の感想



##はじめに

[未来電子テクノロジー](https://www.miraidenshi-tech.jp/intern-content/program/)でインターンをしている坂口です。
来年から、文系未経験者ながらSEになることが決まり、急遽1週間前からプログラミングを勉強し始めました。
まだまだ右も左も分からないような状況ですが、今回はそんな自分が1週間目でHTML&CSSを勉強して感じたことを書こうと思います。

##ページの全体像を把握するのが難しい

Progateを使ってHTML&CSSの中級編の道場コースまでクリアして、どのようにコードを書くか、どんなコードがどのような働きをするか、というのは大体理解できるようになってきました。

でも、実際にコードを書こうとすると、どこに書き込めば自分が思ったようなページになるのかが分からなくなるんです。例えば、CSSで幅や余白を設定しようと思った時とか。（marginとpaddingの違いとか特にややこしい。）ピクセルという単位も初耳だし…。

試行錯誤して、最終的には何とか思った通りのページができるんですが、そこまでの道のりがまだまだ長いです。こればっかりはもっと経験を積むしかないのかなーと思っています。

##プログラミングが言語と呼ばれる理由が分かった

私は普段から言語の学習に興味があり、専攻の英語や趣味でやっている中国語を勉強するのが好きなのですが、プログラミングを勉強するのもそれらの言語学習と似たような部分があるなと思いました。

インプットとアウトプットを繰り返して、知識として頭の中にある要素を構成して自分が意図したもの（文章）を作り上げる。この点では、自分がこれまでやってきた言語学習能力が、少なからずプログラミングにも生きるのではないかなと思います。今まで就活で、自分がプログラミングに向いてるかと聞かれたらふわっと「やる気はあります！」とか答えてたけど、今ならもっとマシな回答ができそう。

##英語できたらコードの意味大体分かる！

ここまでプログラミングで英語が使われているとは思わなかった！というのが率直な感想です。heightとかpositionとかopacityとか、コードの仕組みを知らなくても、英語が分かればなんとなくどういう機能なのか理解できるものだなーと。ずらずらと並んでいる英単語を見て思いました。この点でも、私は幸い英語には苦手意識がないので、プログラミングと前向きに向き合っていけそうです。

##まとめ

ということで、今回はプログラミング初心者の率直な感想をまとめてみました。
1週間実際に手を動かしてみて、まだまだ自分がプログラミングに向いてる向いてないを判断できるまでには至っていませんが、希望を持てる部分もあるので、これからもっと頑張ります！

また、プログラミング初心者であるため、内容に誤りがあるかもしれません。
もし、誤りがあれば修正するのでどんどん指摘してください。よろしくお願いいたします。
[1, 2, 3].map(&:to_s) という書き方のカラクリについて

# [1, 2, 3].map(&:to_s) という書き方

1.8.7 からできるらしい。

```ruby
[1, 2, 3].map(&:succ)  #=> 2, 3, 4
[1, 2, 3].map { |i| i.succ }  #=> 2, 3, 4
```

なぜこの記述ができるのか？
これを説明するには、以下に述べる 2つの仕組みを理解しておく必要がある。という話。

## Symbol#to_proc

Symbol#to_proc は Proc オブジェクトを返す

- 第一引数のオブジェクトをレシーバにして、自身の名前のメソッドを残りの引数を渡して呼び出す
- ちなみに lambda ではない ( `.labmda?  #=> false` )

`:to_s.to_proc` は例えば `proc { |*args| args.shift.public_send(self, *args) }` のような(※) proc になる

※ 実際に `public_send` が呼ばれるわけではなく自前で記述する場合の例示です

```ruby
proc1 = proc { |x| x.to_s }
proc2 = proc { |*args| args.shift.public_send(:to_s, *args) }
proc3 = :to_s.to_proc

proc1.call(5)  #=>"5"
proc2.call(5)  #=>"5"
proc3.call(5)  #=>"5"
```

## ブロックを渡すために & を使う

(これ、正式な呼び方あるのだろうか?)
ブロックを渡す箇所で代わりに `&` を頭につけてオブジェクトを渡すと、proc オブジェクトをブロックとして渡すことができる。

```ruby
plus_two = proc { |x| x + 2 }
[1, 2, 3].map(&plus_two)  #=> [3, 4, 5]
```

上記で「proc オブジェクトを」としているが、正確には `to_proc` に反応するオブジェクトであればなんでも良い。

```ruby
class PlusTwo
  def to_proc
    proc { |x| x + 2 }
  end
end
[2, 3, 4].map(&PlusTwo.new)  #=> [4, 5, 6]

module PlusThree
  module_function def to_proc
    proc { |x| x + 3 }
  end
end
[2, 3, 4].map(&PlusThree)  #=> [5, 6, 7]
```

なお、 Proc オブジェクト自体も `to_proc` に反応する。その結果として `self` を返す。

```ruby
plus_two = proc { |x| x + 2 }
plus_two == plus_two.to_proc  #=> true
```
React UI library の antd について (1) - Button 

[React UI library の antd について (1) - Button](https://qiita.com/sand/items/35422a669e6021cccb4f)
[React UI library の antd について (2) - Layout](https://qiita.com/sand/items/dd420202e6c7daaea667)
[React UI library の antd について (3) - redux-form](https://qiita.com/sand/items/a0cf3fa3a1a17741c06b)


---


React のUI libraryである**[antd](https://ant.design/)**を使ってみました。

antdの使い方はとても簡単です。componentsも種類が多いので助かります。

今回はインストールから説明したいと思います。例として**Button** componentsを使ってみます。


#１．インストール

まずCreate React Appで環境を作ります。最近は、npmでなくyarnを使うのが流れのようですね。
[Getting Started - Create React App](https://facebook.github.io/create-react-app/docs/getting-started)

```
yarn create react-app antd-demo
cd antd-demo
yarn start
```

この時点で、ブラウザでアクセスしインストールが正しく行われていることを確認します。

次に、antdをインストールします

```
yarn add antd
```

以上でインストールは終了です。


#２．Button components


[Button components](https://ant.design/components/button/)


いくつかの種類のButtonを並べてみます。importしてButtonタグを並べるだけです。簡単ですね。**antd.css**(App.css)をimportする必要があることに注意してください。


```JSX:src/App.js
import React, { Component } from 'react';
import Button from 'antd/es/button';
import './App.css';

class App extends Component {
  render() {
    return (
      <div className="App" style={{ margin: '10px'}}>
        <Button type="primary">Primary</Button>
        <Button>Default</Button>
        <Button type="dashed">Dashed</Button>
        <Button type="danger">Danger</Button>
        <Button type="link">Link</Button>
      </div>
    );
  }
}

export default App;
```


次に、antd.cssを使うためにApp.cssの先頭に以下の一行を挿入します。
webpackでnode_modules配下のcssをimportするときのpathにチルダ(~)を入れることによって、node_modules配下のパスを解決することができます。

```JSX:src/App.css
@import '~antd/dist/antd.css';
---
```


#３．実行画面

このレベルではMaterial-UIやBootstrapと大差ないですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61915/02ccaa79-1a6a-6cdb-822b-2707267bc332.png)


今回は以上です。
【Android】FloatingActionButtonのアイコンサイズを調整する方法

#はじめに
現在開発しているプロジェクトにて、FABボタンにセットしたアイコンサイズを調整（大きく表示）したいと要望がありました。

前提条件として、以下の記事で触れられている通り、FABのアイコンのデフォルトサイズは24dpになっています。
[【Android】Floating Action Button（FAB）のアイコンサイズは「24dp」！](https://qiita.com/CUTBOSS/items/f590c5e240ac37f2179e)

単純にFloatingActionButtonのsrcに画像をセットした場合はデフォルトでこのサイズに調整されてしまいます。
サイズを変更する方法を調べた結果、少しはまってしまったためメモとして対応した内容を記載します。

##SupportLibrary28以上を使っている場合
xmlファイルのFloatingActionButtonに下記を設定する。
これだけでアイコンサイズを調整できます。
`app:maxImageSize="xxdp"`


##SupportLibrary28未満を使っている場合
`app:maxImageSize`はSupportLibrary28から追加された設定項目なので、使えません。
うちのプロジェクトではSupportLibraryのバージョンをまだ上げたくなかったので、以下で対応する形にしました。

```xml:dimens.xml
<resources
    xmlns:tools="http://schemas.android.com/tools">

    <!-- FABアイコンサイズ -->
    <dimen name="design_fab_image_size" tools:override="true">xxdp</dimen>

</resources>
```

このように、dimens.xmlで元のサイズを上書きを許可した上で設定することで、サイズの変更が可能となります。


#おわりに
同じ件で困っている方の参考となれば幸いです。
他にいい方法を知っている方がいましたらコメント宜しくおねがいしますm(_ _)m
AzureのWindows Server 2019 Datacenter(英語)を日本語環境にします

ちょっとWindows Server 2019を使いたかったのでAzureで仮想マシンを立てたのですが英語環境でした。
日本語環境で使いたいので変更したときの手順です。

#デプロイ
まずAzureのVertualMachinesで新しい仮想マシンを追加します。
Windows Server 2019 Datacenter を選択してデプロイします。

結構速くて4分かからないくらいで起動しました。

#設定変更
リモートデスクトップ接続して、英語のOSだと確認します。

###Setting > Time & Language　を開く

####1.　Languageへ移動して

＋Add a language で日本語を選択して[Next]、[Install]をクリック
![language1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180278/96dc362b-6693-016a-aa9f-3ae22816bc65.png)

インストールがはじまり10分くらいかかります。
※以前は動かなかったようですが、2019年7月現在のバージョンは動きます。

入りました。
![language2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180278/fa5d7110-9ecc-ee4d-fb66-461dd979b885.png)


####2.　Speechへ移動して

Speech languageをJapaneseへ変更　（使わない気がするけど）
![speech.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180278/ff391cc8-98aa-0f1b-2b13-b6ae131d2fba.png)

####3.　Date & Timeへ移動して

Time zone を　(UTC+09:00) Osaka, Sapporo, Tokyo　へ変更
![timezone.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180278/c4619e26-2d61-6411-f7b8-d2aee707d283.png)

####4.　Regionへ移動して

Country or region がJapanになっていることを確認
Current formatもRecommendedもJapaneseになっていることを確認
![region.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180278/f5413cf0-92d4-f8ba-d59a-4b8ce9de1af7.png)

<b>右の Additional date, time, & regional settings をクリック！</b>
すると別Windowが開きます。

Regionをクリックしてさらにダイアログを表示
Administrativeタブを選択
Change system locale...でJapanese(Japane)を選択して[OK]をクリック
![region2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180278/d79c18ff-c408-a9b0-0a6c-e94f4b8371ff.png)

[Restart now]をクリックして再起動します。

#確認
日本語ですね。
![windows.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180278/a2b2c545-96d3-bc40-c438-4d71b23f9b42.png)


コマンドプロンプトのデフォルトコードページも変わってます。
![command_prop.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180278/7504baf9-5f82-0fb5-3e85-a4fe095ee93e.png)
実はこれがやりたかった。

以上です。
ionic + Vue.js でお試しに実装した時に初っ端からつまづいた時の備忘録

タイトル通り、ionic + Vue.js を使って実装した際に最初につまづいてしまったので備忘録がてら記事にしました。
背景としては体調不良でしばらく安静にしてましたが、体調も少しずつよくなってきたのでリハビリも兼ねてVue.jsを色々と触ったりしてました。

youtubeなどでも、ionicに関する動画も上がっておりどんなものか興味は以前からありました。

少し前にVue.js + Vuetifyを使ってみてとても良かったけど、Vue.js(vuex) + ionic で扱ってみたかったのもあったのでお試しで作った時のつまづいたポイントを紹介したと思います。

# package.jcon内の設定環境
```
    "@ionic/core": "^4.6.0",
    "@ionic/vue": "0.0.4",
    "core-js": "^2.6.5",
    "register-service-worker": "^1.6.2",
    "vue": "^2.6.10",
    "vue-router": "^3.0.3",
    "vuex": "^3.0.1"
```

# Vue環境を新しく立ち上げionicをnpmでインストール

- ひとまずは新しくvue-cliからプロジェクトを作成し

```
npm install ionic
```
を実行
- 実際ionicで使われるコンポーネントなどを設定しました。

# しかしchrome画面が真っ白。。。

- `npm run serve` しても以下のようなエラーがchromeのコンソールから出る

```
Uncaught TypeError: Cannot convert undefined or null to object
    at Function.keys (<anonymous>)
    at addIcons (chunk-ea2b3dce.js?d602:13)
    at appInitialize (ionic-vue.esm.js?481b:279)
    at Object.install (ionic-vue.esm.js?481b:687)
    at Function.Vue.use (vue.runtime.esm.js?2b0e:5101)
    at eval (main.js?56d7:12)
    at Module../src/main.js (app.js:10193)
    at __webpack_require__ (app.js:767)
    at fn (app.js:130)
    at Object.1 (app.js:10267)
```

- しかもターミナルからも以下のようなwarningも出ていることに気づく

```
warning  in ./node_modules/@ionic/vue/dist/ionic-vue.esm.js
"export 'ICON_PATHS' was not found in 'ionicons/icons'
```

え。。。ないの？
というより、chromeの画面が真っ白。。。。。泣

- どういうわけか、ionicをインストールするだけではダメだったっぽい

# エラーの調査
上記のエラーをもとに確認したところこんなissueがgithub上に上がっていたので、下記のurlの会話を見つつどんな解決方法があるか見てみました。
- 参考になったissue :  [https://github.com/ionic-team/ionic/issues/18640](https://github.com/ionic-team/ionic/issues/18640) 
- あれこれ追記するなどの話もあったのですが、辿っていくとpackage.jsonに追記すればOKとのことだったので以下のコマンドを入力

```
npm install ionicons@4.5.9-1
```

- `--save-dev` すればいいみたいですが、この辺は気にせず実行
- すると表示されました！！！（感動！）

# トライしたから見つかったエラー
- 「ま、お試しでw」という感覚値でやってみたので、エラーは出るだろうという前提で、何もしないよりはやってみようという精神でやってみました。（トライアンドエラーの精神）
-  個人差はあるかと思いますが、どこかに必ずつまずきポイントはあるかと思いますが、今回の場合は、ionicドキュメントも少なく日本語のページではその辺までカバーされてなかったのでその辺は若干苦労しました。
- 解決方法は英文でしか見つからないこともあるので、その辺は根気よく読んでみるのも一つの引き出しとして持つと世界がもっと広がるかもしれないです。
- （ちょっとだけですが、自身がついた気がしますが、これからもトライアンドエラーの精神で精進します）

初めての投稿なので、日本語的に問題があれば遠慮なくコメントいただきますと励みになります。
またこの記事が皆様のご参考になれれば幸いです。
Windows環境でWSLをつかってopensource COBOLする

# 概要

MicroSoftからWSLに関する発表が多々ある昨今、opensource COBOLのWindows環境での構築が楽になったのではと思い、WSL上でopensource COBOLをインストールしてみようと思います。

# WSL(Windows Subsystem for Linux)

まずはWSLを導入します。[本家ドキュメント](https://docs.microsoft.com/ja-jp/windows/wsl/install-win10)に書いてあるので特に問題はないと思います。
今回はディストリビューションとしてUbuntuを利用します。

# WSLでのビルド

パスワードの設定等、初期設定は割愛します。

opensource COBOLの入手はいつも通りgithubから引っ張ってきます。

```
nor51010@MSPC182:~$ git clone https://github.com/opensourcecobol/opensource-cobol.git
nor51010@MSPC182:~$ ls
opensource-cobol
```

ビルドに必要なツール類を準備します。

- 全般的な開発環境

```
nor51010@MSPC182:~$ sudo apt-get install build-essential
```

- ncurses

```
sudo apt-get install libncurses5 libncurses5-dev
```

- gmp

```
nor51010@MSPC182:~$ sudo apt-get install libgmp-dev
```

- bison, flex

```
nor51010@MSPC182:~$ sudo apt-get install bison flex
```

- gettext

```
nor51010@MSPC182:~$ sudo apt-get install gettext
```

- automake, autoconf

```
nor51010@MSPC182:~$ sudo apt-get install automake autoconf
```


まずはVBISAMをビルドしていきます。
特に問題なくmake installまで完了。
（ログは省略）

```
nor51010@MSPC182: opensource-cobol/vbisam/
nor51010@MSPC182:~/opensource-cobol/vbisam$ ./configure
nor51010@MSPC182:~/opensource-cobol/vbisam$ make
nor51010@MSPC182:~/opensource-cobol/vbisam$ sudo make install
```

本丸opensource COBOLのビルドへ。
必要なツールがそろっていれば問題なくクリア

```
nor51010@MSPC182:~/opensource-cobol/vbisam$ cd ../
nor51010@MSPC182:~/opensource-cobol$ ./configure --with-vbisam
nor51010@MSPC182:~/opensource-cobol$ make
nor51010@MSPC182:~/opensource-cobol$ sudo make install
```

確認もOK

```
nor51010@MSPC182:~/opensource-cobol$ cobc --version
opensource COBOL 1.5.2J
OSS Consortium's patched version of OpenCOBOL1.1(Feb.06 2009)
----
cobc (opensource COBOL) 1.5.2.0
Copyright (C) 2001-2009 Keisuke Nishida / Roger While
Built    Jul 05 2019 15:11:00
Packaged Feb 06 2009 10:30:55 CET
```

いつものHELLO WORLDを実行

```cobol:HELLO.cbl
       IDENTIFICATION              DIVISION.
       PROGRAM-ID.                 HELLO.
       DATA                        DIVISION.
       WORKING-STORAGE             SECTION.
       PROCEDURE                   DIVISION.
       MAIN-RTN.
           DISPLAY "HELLO WORLD!".
       MAIN-EXT.
           STOP RUN.
```

```
nor51010@MSPC182:~$ cobc HELLO.cbl
nor51010@MSPC182:~$ cobcrun HELLO
HELLO WORLD!
```

普通に動作してます。

# 雑感

WSLが使えるようになったことにより、仮想マシンを準備したり、Cygwinを入れたりしなくても、Windowsの標準機能のみで、opensource COBOLを動かせるようになりました。

とはいえ、WSLの上とはいえ、実行しているのはUbuntuですし、Linuxが苦手な人にはとっつきにくいと思われます。

次回はVisual Studio Codeとかと連携して、Windowsライクに使えるようにしてみたいと思います。

※普段CentOSばかりでUbuntuに慣れていないため、opensource COBOLのビルドより、必要なパッケージのインストールに時間がかかりました。
初めてのRuby4 　 〜オブジェクト指向〜

#オブジェクト指向
:point_up_tone1:オブジェクト指向とはプログラミングを書くときの基本となる考え方。
プログラムの処理の対象をオブジェクトとして考える。
（オブジェクトはデータ（変数）と手続き（メソッド）をまとめたもののこと）

###pablicとprivate
:eye:オブジェクト指向プログラミングではそれぞれのオブジェクトを外部に公開するかしないか制御する必要がある。
→メソッド一つ一つについて、公開・非公開を変更することができる:information_desk_person_tone2:

```例.
class AccessTest
 public
 def show 
   puts "public"
 end

 private
 def secret
  puts "private
 end
end


obj = AccessTest.new
obj.show => "public"
obj.secret :x:
```

:star:public : 以降のメソッドを公開にする。記述なしの場合はデフォルトでpublic
:star:private : 以降のメソッドを非公開にする。オブジェクトの外部からは呼び出せない。

＊
:snowflake:オブジェクトの内部 : オブジェクトクラスのメソッドの中（classからendまで）
:snowflake:オブジェクトの外部　: 内部以外のとこ

##attr_族
#####:sunny:attr_accessor
インスタンス変数を読み書きするメソッドを提供する文

```
class Recipe
 attr_accessor :title
end

recipe = Recipe.new
recipe.title = "cheese cake"
p recipe.title => "cheese cake"
```
下記とイコール

```
class Recipe
 def title = (t)
  @title = t
 end
 def title  
  @title 
 end

recipe = Recipe.new
recipe.title = "cheese cake"
p recipe.title => "cheese cake"
```

#####:sunny:attr_reader
読み込み用の公開メソッドを用意

```
class Recipe
 attr_reader :title
end

recipe = Recipe.new
p recipe.title
```

以下とイコール

```
class Recipe
 def title
  @title 
 end
end

recipe = Recipe.new
p recipe.title
```

#####:sunny:attr_writer
書き込み用の公開メソッドを用意

```
class Recipe
 attr_writer :title
end

recipe = Recipe.new
p recipe.title
```

以下とイコール

```
class Recipe
 def title = (t)
  @title = t
 end
end

recipe = Recipe.new
p recipe.title
```

##継承
すでに定義されているクラスを拡張して他のクラスの定義とする

例）BookクラスとMagazineクラスを作る。二つには共通することがある

```
class Book
 attr_accessor :genre, :price
end
```

```
class Magazine
 attr_accessor :genre, :price, :title
end
```

この場合、Magazineクラスを↓のようにしても同じ

```
class Magazine < Book
 attr_accessor :title
end
```

:helmet_with_cross:class Magazine < Book　によりMagazineクラスはBookクラスの性質を受け継ぐことができる。

:writing_hand_tone1:書き方

```
class クラス名 < 親クラス名
　クラスの定義
end
```
:point_up_2_tone1:継承したクラスは親クラスの全てのインスタンス変数、メソッドなどを受け継ぐ。


#####コーディングの際は重複が多くならないようにする
→動作を変更したい時にたくさん書き換えなきゃいけなくなるので・・:frowning2:
iOSのSafariの検証ツール（デベロッパーツール）でconsoleやら色々見たい

# iOSのSafariの検証ツール（デベロッパーツール）でconsoleやら色々見たい

iPhoneのSafariやWebViewでしか再現できないバグのjsのエラーを見たい！！

などの要望は下記のサイトの指示に従ってみると解決します。
↓　↓　↓
[iOSのSafariのWebインスペクタを使ってみる](https://www.tam-tam.co.jp/tipsnote/html_css/post12114.html)

### 必要なもの
- iOS端末
- Mac
- Lightningケーブル（USB端子のもの）