OmniAICreator/Qiita-1.07M huggingface dataset:
use-context-selectorの紹介

## はじめに

過去の話になりますが、React Redux v6というものがありました。v5ではlegacy contextを使っていたのですが、React v16.3でContext APIが登場したため、それに追従したものです。その頃にはConcurrent Modeの計画もあり（当初はAsync Reactと呼ばれていました）、Context APIをうまく使うことで、Concurrent Modeにおけるある潜在的な問題（Tearingと呼ばれます）を解決できるはずとなりました。それは、Contextにstateを入れて、Reactに更新の伝搬を任せるという方法でした。

しかし、この方法はReact Hooksが登場して困ったことになりました。 Hooksで更新の伝搬を止める方法がなかったのです。React Reduxは止むなくcontextにstoreを入れる方法に戻してv7をリリースしました。Tearingの問題の解決はあきらめた形になります。

## RFC 119

React Contextの更新の伝搬の問題を解決する方法としてuseContextSelectorが提案されています。

<https://github.com/reactjs/rfcs/pull/119>

React Redux界隈では期待されていますが、議論は進んでいません。この提案方式では、Tearingの問題だけでなく、[stale props](https://react-redux.js.org/api/hooks#stale-props-and-zombie-children)の問題も解決できます。

## use-context-selector

しかし、オープンソースの世界です。代替品を実装しました。

<https://github.com/dai-shi/use-context-selector>

userlandの実装では、stale propsは解決できないのですが、実際はそれほど問題にならないか、workaroundがあることが多いと思います。

## 使い方

```javascript
import { createContext, useContextSelector } from 'use-context-selector';

const context = createContext(null);
```

React.createContextの代わりにライブラリからimportしたcreateContextを使います。

```jsx
const StateProvider = ({ children }) => {
  const [state, setState] = useState({ count1: 0, count2: 0 });
  return (
    <context.Provider value={[state, setState]}>
      {children}
    </context.Provider>
  );
};
```

Providerの使い方は通常と同じです。

```jsx
const Counter1 = () => {
  const count1 = useContextSelector(context, v => v[0].count1);
  const setState = useContextSelector(context, v => v[1]);
  const increment = () => setState(s => ({
    ...s,
    count1: s.count1 + 1,
  }));
  return (
    <div>
      <span>Count1: {count1}</span>
      <button type="button" onClick={increment}>+1</button>
    </div>
  );
};
```

contextを利用するコンポーネントでは、useContextの代わりにuseContextSelectorを使います。こうすることで、selectした結果が変わらない限り、context valueの更新の伝搬は止まります。

### おわりに

実は、use-context-selectorの実装アイデアは、RFC119が提案されてから考えたわけではありません。[react-tracked](https://github.com/dai-shi/react-tracked)を実装する段階ですでに課題はあり、試行錯誤の上、実装していました。そこから、Proxyによるstate usage trackingを取り除いてシンプルにしたものが本ライブラリです。

Tearingの問題については、[こちらのリポジトリ](https://github.com/dai-shi/will-this-react-global-state-work-in-concurrent-mode)にリンクやチェックツールがあるので、興味がある方はご覧ください。
ラズパイ4で128GBのmicroSDを使用する場合のNOOBS起動の対処法

##### 追記(2020/3/14)

公式の書き込みツール「Raspberry Pi Imager v1.2」を試してみたが、
所有していた128GBのmicroSDではRaspbianは起動できなかった。
Ubuntu 18.04.4(Pi3/4)は起動できた。

#問題
通常の手順通りにNOOBSをmicroSDにコピーした状態でラズパイを起動
結果、何も表示されない。

#原因
32GBを超えるSDカードはフォーマット形式が「exFAT」となっており、
ラズパイではフォーマット形式「FAT32」にしか対応しておらず、認識されなかった。

#対処法
以下の手順でフォーマット形式を「FAT32」に変更することで起動した。

1. microSDを「SDFormatter」でフォーマット（デフォルト設定）
2. microSDを「guiformat.exe」でフォーマット形式を「FAT32」に変更（デフォルト設定）
3. NOOBSをmicroSDにコピー
4. microSDをラズパイ４に接続
5. ラズパイ４を起動

#参考サイト
上記に記載した対処法は公式サイトにも記載されています。
https://www.raspberrypi.org/documentation/installation/sdxc_formatting.md
Swiftで可変のラベルが入ったスクロールビューの高さをAutoLayoutで調整する

##やりたいことの概要
１画面では収まり切らないとても長い文章を表示するときに、UIScrollViewは便利です。しかしその文章の長さを後で変えたり、異なるデバイスで見る際は、UILabelの高さを明確に決められません。

自分が作成したマッチングアプリの利用規約を載せるときに、この問題にあたりました。最初は大きめに高さを確保する方法を採用しましたが、最後までスクロールしたときに謎な空白ができてしまいます。

今回はコードによるオートレイアウトのみで、scrollViewのcontentSizeを最適化する方法をまとめます。

##コード

```Rule.swift
import Foundation
import UIKit

class RuleView: UIView {
    
    let scrollView = UIScrollView()
    let label = UILabel()
    
    required override init(frame:CGRect){
        super.init(frame:frame)
        backgroundColor = .white
        addSubview(scrollView)
        scrollView.addSubview(label)
    }
    
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    override func layoutSubviews() {
        super.layoutSubviews()
        scrollView.frame = frame
        scrollView.contentSize.width = frame.width
        scrollView.bounces = false
        scrollView.indicatorStyle = .default
        scrollView.scrollIndicatorInsets = UIEdgeInsets(top: 10, left: 0, bottom: 10, right: 0)
        scrollView.backgroundColor = UIColor.white
        
        label.font = UIFont.systemFont(ofSize: 15.0)
        label.backgroundColor = .white
        label.numberOfLines = 0
        label.translatesAutoresizingMaskIntoConstraints = false
        label.firstBaselineAnchor.constraint(equalTo: self.topAnchor, constant: 30.0).isActive = true
        label.leftAnchor.constraint(equalTo: self.leftAnchor, constant: 10.0).isActive = true
        label.rightAnchor.constraint(equalTo: self.rightAnchor, constant: -10.0).isActive = true
    }
    
    //ViewControllerから呼び出される
    func setText(text: String) {
        label.text = text
        label.sizeToFit()
     //下に空けたい隙間によって値を調節する
        label.bottomAnchor.constraint(equalTo: scrollView.bottomAnchor, constant: -100.0).isActive = true
    }
    
    
}
```

labelとscrollViewの高さは最初は指定せず、textが渡された時点でlabelの高さを決めて、最後にscrollViewの下端とlabelの下端の距離を調節します。

この順番を変えるとエラーがおきました。setTextは何回呼び出してもいいので、途中でテキストが変わる場合も安心です。
【Pytorch】LinearとConv1dってどっちが速いの？

# 結論
基本的にはLinearのほうが速い。

# 調べること
LinearとConv1dはどちらが速いのかざっくり調べる

# コード
###Linear
```python
class LinearNet(nn.Module):

    def __init__(self, dim):
        super().__init__()
        self.layer = nn.ModuleList([nn.Linear(dim, dim) for _ in range(5)])

    def forward(self, x):
        for l in self.layer:
            x = l(x)
        return x


start = time.time()
for _ in range(1000):
    l(xl)
print('Linear time: ', time.time() - start)

```

###Conv1d
```python
class Conv1dNet(nn.Module):

    def __init__(self, dim):
        super().__init__()
        self.layer = nn.ModuleList([nn.Conv1d(dim, dim, 1) for _ in range(5)])

    def forward(self, x):
        for l in self.layer:
            x = l(x)
        return x


start = time.time()
for _ in range(1000):
    c(xc)
print('Conv1d time: ', time.time() - start)
```

# 検証と結果
以下、LinearNetで計算するtensorのshapeをsl、Conv1dNetで計算するtensorのshapeをscとする

####sl = (100, 256), sc = (100, 256, 1)
Linear time:  0.1228024959564209
Conv1d time:  1.3837506771087646

####sl = (100, 1, 256), sc = (100, 256, 1)
Linear time:  0.17534923553466797
Conv1d time:  1.3661222457885742

####sl = (100, 1024, 256), sc = (100, 256, 1024)
Linear time:  12.256186962127686
Conv1d time:  15.45792818069458

####sl = (500, 256), sc = (500, 256, 1)
Linear time:  0.1238257884979248
Conv1d time:  3.9731435775756836

####sl = (100, 512), sc = (100, 512, 1)
Linear time:  0.12459373474121094
Conv1d time:  4.35028600692749

# まとめ
1次元のデータを扱うときはLinearを使ったほうが速い。
バッチサイズと計算する次元が増えるほどその傾向が顕著。
しかし、計算しない次元が大きくなるとその差は縮まっていく。検証していないが、おそらくある点で越すだろうと予測される
Rに画像データを取り込む（RasterLayerクラス生成）

##はじめに
・統計フリーソフトRで画像をいろいろ処理する方法を習ったけど、そもそもRに画像を取り込む方法を記した記事が見当たらなかったのでメモ。

##今回やりたいこと
・**画像データ（PNG）→Rに取り込み**
・取り込む画像はとりあえず、いらすと屋の画像

##RasterLayerクラスのオブジェクト生成
・**raster**パッケージ(Robert J. Hijmans et al., 2019)
・参考：The Comprehensive R Archive Network "raster package"
URL: https://cran.r-project.org/web/packages/raster/raster.pdf

サンプル画像 test.png（いらすと屋）
![eto_nezumi_family.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433560/c1903e69-9f52-05e5-dcae-45a8080569ce.png)

・rasterパッケージのインストール
`library(raster)`

・raster関数でRasterLayerクラスのオブジェクトを生成する。
`file = "C:\\Users\\xxx\\test.png"`
`x <- raster(file)`

・結果（0～256のグレースケール）
`plot(x)`
![eto_nezumi_family2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433560/d0d5f2b8-3f17-b809-d5ca-2ecdd8085c57.png)
>`x`
class      : RasterLayer 
band       : 1  (of  4  bands)
dimensions : 400, 400, 160000  (nrow, ncol, ncell)
resolution : 1, 1  (x, y)
extent     : 0, 400, 0, 400  (xmin, xmax, ymin, ymax)
crs        : NA 
source     : C:/Users/xxx/test.png 
names      : test 
values     : 0, 255  (min, max)


####使えそうな引数
・band = 整数. multi-layer fileの場合、使用したいbandのレイヤを指定
・crs = 4文字の文字列. CRS（座標参照系）を指定
・resolution = 1 or 2個の数値ベクトル. 解像度を指定
DNS66に追加するDomain List


```
https://warui.intaa.net/adhosts/hosts.txt
https://warui.intaa.net/adhosts/hosts_lb_ipv6.txt
```

hosts2ch, 280Blockerのやつは対応してないらしい。

消えない場合は

https://qiita.com/tekityuu449/items/9f822fa0fee4951b5a27

この記事を読もう。
【自分メモ】Cloud9上のMySQLのバージョンをあげる方法

#はじめに
ドットインストールで「AWS Cloud9入門」を学習している時に、Cloud9上のMySQLのバージョンアップをする手順がありました。
未来の自分のためのメモ。

##はじめるよ

###MySQLのバージョン確認
```
mysql --version
```

###MySQLのアンインストール
```
sudo yum -y remove mysql-config mysql55-server mysql55-libs mysql55
```

###MYSQLのインストール
```
sudo yum -y install mysql57-server mysql57
```

###設定ファイル（my.conf）を編集
```
sudo vi /etc/my.cnf
```

1. ｉを押してINSERTモードに。これで編集できるようになる。
2. 以下を追記。これが何なのかはわからない(2019/12/08現在)
3. escキーを押して`:wq`と入力→`Enter`で保存

```my.cnfに追記するやつ
[mysqld]
character-set-server=utf8mb4

[client]
default-character-set=utf8mb4
```

###MySQLサーバを起動
```
sudo service mysqld start
```

###MySQLデータベースのアップグレード
```
sudo mysql_upgrade -u root --force
```

###MySQLのrestart
~~ちょっと何言ってるか分かんない~~
おそらくアップデートしたしデータベース再起動しとくやつ。

```
sudo service mysqld restart
```

実行結果見たら再起動してるっぽ！

```
Stopping mysqld:                                           [  OK  ]
Starting mysqld:                                           [  OK  ]
```

###サーバ起動したら自動起動する設定
```
sudo chkconfig mysqld on
```

###MySQLにrootでログイン
```
mysql -u root
```

##おわったよ
`sudo`コマンドについてこれから勉強頑張りますえ
イーサネットの規格

イーサネットの種類には大きく分けて２種類あります。

メタルケーブルと光ファイバーケーブルです。



■メタル（ツイストペア）ケーブル
メタルケーブル（別名ツイストペアケーブル）は、一本のケーブルの中に８本の銅線が２本ずつ撚り合わせて、４対１本のケーブルになっています。伝送距離は100mまでです。

また、メタルケーブルにも２種類あってケーブル部分をアルミ箔でシールド処理しているSTP（Shielded Twist Pair）ケーブルとシールド処理していないUTP（Unshielded Twist Pair）ケーブルがあります。<br>UTPケーブルは家電量販店などで見かけるいわゆるLANケーブルです。価格が安いのが魅力ですが、電磁ノイズに弱いというデメリットがあります。それを克服したのがSTPケーブルです。ケーブルをシールド処理して、内部及び外部の電磁ノイズの影響を軽減してくれます。価格もそれなりにするのもあってか工場などの過酷な環境で利用されているようでなかなか見る機会はないでしょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527590/3e6d59ac-467b-a320-4a4a-fd343fad567d.png)
画像：ツイストペアケーブル


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527590/1a820bf5-f373-74eb-a029-9d243abcf7cd.png)
画像：規格表


○○BASE-Tや○○BASE-TXのように、BASEの後ろにTがついている規格はメタルケーブルを使用する規格で、この「T」はツイストペアケーブルのT です。
そのほかにも「カテゴリ○○」、なんて書いてありますが、数字が大きくなるにつれて伝送速度が速い規格に対応しています。カテゴリによっては芯数が違うものがありますが、目にすることはないかもしれません。



<br>
<br>
<br>
■光ファイバーケーブル
光ファイバーケーブルはガラスを細い管にしたもので、光信号を伝送します。光ファイバーケーブルは光の屈折率が高い「コア」と、屈折率がやや低い「クラッド」という同芯２層で構成されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527590/7fa697ce-b78c-7ba4-3a94-c663b972ea58.png)


光ファイバーには「マルチモード光ファイバ（MMF）」と「シングルモード光ファイバ（SMF）」の２種類があります。２つの違いは光信号が通るコアの直径（コア径）です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527590/ee3a8739-4007-69e5-3d72-920670976524.png)


MMFはコア径が50㎛か62.5㎛の光ファイバーケーブルです。短波長を使用する規格でよく見られ、コア径が大きいため、光の伝送路が分散します。そのため、SMFと比べて伝送損失が大きくなってしまいます。しかし、SMFより価格が安く、取り回しがしやすいため、近距離の伝送で使用されます。

SMFはコア径が8~10㎛の光ファイバーケーブルです。光の伝送路が一つになっています。そのため、長距離伝送や大容量のデータ伝送もできるようになっています。伝送距離はなんと70㎞まで届きます。


○○BASE-SX/SRや○○BASE-LX/LRとなっている規格は光ファイバーケーブルを使用する規格で、BASEの後ろについている「S」や「L」でレーザーの種類が分かります。「S」はShort Wavelength（短波長）「L」はLong Wavelength（長波長）を表しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527590/4c8643f0-6744-9176-5706-f28fe18e5b87.png)





ツイストペアケーブルと光ファイバーケーブルの主な特徴
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527590/893a2f25-08b4-86e3-29f7-47c4b69ae4e1.png)





#参考文献：インフラ／ネットワークエンジニアのためのネットワーク技術＆設計入門 第2版　みやたひろし著
・https://www.amazon.co.jp/dp/B07TB1MBJV/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1
参考画像：４枚
・https://www.google.com/url?sa=i&source=images&cd=&ved=2ahUKEwiS8fyszKjmAhWUHXAKHSUtAeAQjRx6BAgBEAQ&url=https%3A%2F%2Fdensenkan.com%2Fknow%2Flan.html&psig=AOvVaw31M08K2aHiQ3zJ398XarXG&ust=1575981916747231
・https://images-na.ssl-images-amazon.com/images/I/31udUKtfrXL.jpg
・https://www.allied-telesis.co.jp/products/list/convert/images/img_convert_know_06.jpg
・https://www.tdk.co.jp/techmag/knowledge/200811u/img/kl081101u.gif
SwiftからLambdaを経由してs3に画像をアップロードする

##やりたいこと
SwiftからAPIGatewayとLambdaを経由してs3に画像をアップロードします。
あまり大したことはやっていませんが、細かいところで詰まったので、まとめておきます。
##フロントエンド（Swift）

```imageUpload.swift
 func uploadImage(image: UIImage) { 
     //画像のリサイズ
     let height = image.size.height 
     let width = image.size.width 
     let reSize  = CGSize(width: 200, height: 200*height/width) 
     let resizedImage = image.reSizeImage(reSize: reSize) 
      
     if let data = resizedImage.jpegData(compressionQuality: 1.0) { 
         let encodedString = data.base64EncodedString()        
         let endURL = "APIGateWayで作成したURLを入力" 
         var parameters = [String: String]() 
         parameters["body"] = encodedString 
         
         let apimanager = APIManager(url: endURL, method: .post, parameters: parameters, view: nil) |
         apimanager.request(fail: { () in 
             print ("成功")
         }, success: { (json: JSON) in 
             print ("失敗")      
         })     
     } 
 } 
```

```APIManager.swift
import Foundation
import Alamofire
import SwiftyJSON

struct APIManager {
    
    let url: String
    let method: HTTPMethod
    let parameters: Parameters?
    
    init(url: String, method: HTTPMethod, parameters: Parameters?, view: UIViewController?) {
        self.url = url
        self.method = method
        self.parameters = parameters
    }
    
    func request(fail: @escaping () -> Void, success: @escaping (_ data: JSON) -> Void) {
        
        Alamofire.request(self.url, method: self.method, parameters: self.parameters, encoding: JSONEncoding.default, headers: headers).responseJSON { response in
            
            if (response.error != nil) {
                fail()
                return
            }
            guard let object = response.result.value else {
                fail()
                return
            }
            let json = JSON(object)
            if let _ = json["errorMessage"].string {
                fail()
                return
            }
            success(json)
        }
 }

```

##サーバーサイド（Node.js）

```imageUpload.js
const aws = require('aws-sdk')
const s3 = new aws.S3()

exports.handler = (event, context, callback) => {

  const fileData = event.body.replace(/^data:\w+\/\w+;base64,/, '')
  let requestBody = Buffer.from(fileData, 'base64')

  s3.putObject({
    Body: requestBody,
    Bucket: 'バケット名', 
    ContentType: 'image/jpeg',
    Key: 'image/hoge'
  }).promise()

    .then((result) => {
      let resp = {
                statusCode: 200,
                body: result,
                headers: {},
                isBase64Encoded: false
      }; 
    
      callback(null, resp)
    })
    .catch((err) => {
        callback(err)
    })
}

```
##アップロードした画像の取得について
画像の取得にもずっとLambdaを使って取得しており、画像表示の遅さに悩んでいました。画像の取得に関してはRoute53でドメインとs3を繋げて、Lambdaを使わずに行うのが速いです。
filter対象の値への変更は返り値に反映される

[配列内の特定条件の値群のみ先頭or末尾に集める並び替え - Qiita](https://qiita.com/khsk/items/bf92b29531fcab77bc2a)

で並び替えたものの、どこまでが並び替えられた値なのかを知っておきたくなったので、オブジェクトなのをいいことにマークすることに

# コード

```js
const priority = ['dog', 'cat', 'human']

const target = [
    {id:'caw'},
    {id:'pig'},
    {id:'dog'},
    {id:'car'},
    {id:'cat'},
    {id:'bird'},
    {id:'human'},
]

console.log(target2.filter( a => { 
    if (priority.includes(a.id)) {
        a.isSorted = true
        return true
    }
     }).concat(target2.filter( b => !priority.includes(b.id))))

```

```js
[
  {
    "id": "dog",
    "isSorted": true
  },
  {
    "id": "cat",
    "isSorted": true
  },
  {
    "id": "human",
    "isSorted": true
  },
  {
    "id": "caw"
  },
  {
    "id": "pig"
  },
  {
    "id": "car"
  },
  {
    "id": "bird"
  }
]
```

***

たまたまオブジェクト対象だったのでboolを生やすことにしましたが、filter中のこのような変更が可能だったのかが多少不明瞭でした。

filterのMDNでは

>filter() は呼び出された配列を変化させません。
>
filter() によって処理される配列要素の範囲は、callback が最初に呼び出される前に設定されます。filter() の呼び出しが開始された後に追加された配列要素に対しては、callback は実行されません。既存の配列要素が変更または削除された場合、callback に渡される値は filter() がそれらを参照した時点での値になります。削除された配列要素を参照することはありません。

とありますが、感覚的には`const array`なイメージですね。
内部の値への干渉はできるのですが、

[Array.prototype.filter() - JavaScript | MDN#初期の配列への影響 (変更、追加、削除)](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/filter#%E5%88%9D%E6%9C%9F%E3%81%AE%E9%85%8D%E5%88%97%E3%81%B8%E3%81%AE%E5%BD%B1%E9%9F%BF_%E5%A4%89%E6%9B%B4%E3%80%81%E8%BF%BD%E5%8A%A0%E3%80%81%E5%89%8A%E9%99%A4)

地味に`callback(element)`を変更するサンプルがなかったので残しておきます。
64日目 pip install tensorflowしたら2.0がやってきました。

Telsorflowをインストールしたので、さっそく実行。
しかしエラーで動かない！？

```
$ python calc1.py 
2019-12-08 20:09:10.641892: I tensorflow/core/platform/cpu_feature_guard.cc:142] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA
2019-12-08 20:09:10.667849: I tensorflow/compiler/xla/service/service.cc:168] XLA service 0x7fac4a3c0dc0 executing computations on platform Host. Devices:
2019-12-08 20:09:10.667893: I tensorflow/compiler/xla/service/service.cc:175]   StreamExecutor device (0): Host, Default Version
Traceback (most recent call last):
  File "calc1.py", line 12, in <module>
    sess = tf.Session()
AttributeError: module 'tensorflow' has no attribute 'Session'
```

#`Session`なんて知らないよ？？？
調べてみました。最近のTensorflowはSessionいらずになったらしい。

AttributeError: module 'tensorflow' has no attribute 'Session'について
https://ja.stackoverflow.com/questions/59780/attributeerror-module-tensorflow-has-no-attribute-session%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6


###もしやと思ってバージョンを見てみたら・・・

```
$ pip list | grep tensorflow
tensorflow                         2.0.0              
tensorflow-estimator               2.0.1 
```

###`pip install tensolflow`でインストールされたのは、`tensolflow2.0.0`  だったのでした。

参考にしたのは「Pythonによるスクレイピング＆機械学習 開発テクニックBeautifulSoup、scikit-learn、TensorFlowを使ってみよう」https://www.socym.co.jp/support/s-1079

よくみたら、インストール時に`conda install -c conda-forge tensorflow=1.1.0` とバージョンを指定していました。しまったなあ。
 
###tensolflow2.0.0で動くように修正してみます。

```calc1.py 
import tensorflow as tf
a = tf.constant(1234)
b = tf.constant(5000)

add_op = a + b

#sess = tf.Session()
#res = sess.run(add_op) 
#print(res)

tf.print(add_op)
```

記述が簡単になったならいいんじゃないかな。

```実行結果
$ python calc1.py 
2019-12-08 20:16:15.480543: I tensorflow/core/platform/cpu_feature_guard.cc:142] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA
2019-12-08 20:16:15.512089: I tensorflow/compiler/xla/service/service.cc:168] XLA service 0x7ffedb3c6c60 executing computations on platform Host. Devices:
2019-12-08 20:16:15.512124: I tensorflow/compiler/xla/service/service.cc:175]   StreamExecutor device (0): Host, Default Version
6234
```

結果は得られたけれど、足し算するのに数秒かかって、謎のメッセージがやたらでる。
このメッセージを調べてみると、pipではだいたいどのパソコンでも動くやつがインストールされるけど遅い。ソースからビルドすると各環境で最適化されるので速くなるかもしれない、とのこと。なるほど。あとで何とかしよう。
(30分)
JavaScriptでWebSocket通信をしてみた

# 概要
WebSocketとは、HTTPベースでクライアント、サーバー相互通信を実現する技術です

前回実施したC#でWebSocketでサーバーからクライアントへの通知をするサンプルに対し
クライアント側はWebブラウザで実施されることがほとんどと思われるため
JavaScriptでクライアント側を作成し、前回作成したC#のサーバー間で通信させてみました。

前回記事
[C#でWebSocketのサンプルを動かしてみた](https://qiita.com/Zumwalt/items/53797b0156ebbdcdbfb1)

クライアント側のJavaScriptでは大まかに以下の手順で通信を実施します

１．WebSocketの接続を確立する
サーバー側のURLを引数に渡し、接続を確立する

```
var connection = new WebSocket(サーバーURL);
```
２．サーバー側からの通知を受信する
リスナを定義し、サーバーからの通知を受け取る

```
connection.onmessage = function(event) {
	//event.data でサーバーからの通知を受信 
};
```

# webSocket通信を試してみた
上記の説明どうり、JavaScriptでWebSocketの接続を確立後、サーバーからの通知を受信するリスナを定義し、サーバからの通知をを画面に表示するようにしました。
サーバーは前回のC#サンプルをそのまま使用しています。

### クライアント側の実装（JavaScript）
```:webSocketTest.html

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
  </head>
  <body>
    <p>WebSocketサンプル</p>
	<input id="eventType">
	<input id="dispMsg">
  </body>
</html>

<script type="text/javascript">

	//WebSocket接続
	var connection = new WebSocket("ws://localhost:8000/ws/");

	//接続通知
	connection.onopen = function(event) {
		document.getElementById( "eventType" ).value = "通信接続イベント受信";
		document.getElementById( "dispMsg" ).value = event.data;
	};
	 
	//エラー発生
	connection.onerror = function(error) {
		document.getElementById( "eventType" ).value = "エラー発生イベント受信";
		document.getElementById( "dispMsg" ).value = error.data;
	};
	 
	//メッセージ受信
	connection.onmessage = function(event) {
		document.getElementById( "eventType" ).value = "メッセージ受信";
		document.getElementById( "dispMsg" ).value = event.data;
	};
	  
	//切断
	connection.onclose = function() {
		document.getElementById( "eventType" ).value = "通信切断イベント受信";
		document.getElementById( "dispMsg" ).value = "";
	};
</script>

```

### サーバ側の実装（C#）
前回の記事と同様の処理です、参考までに掲載しています

```:serverTest.cs

static async Task Run()
{
    //Httpリスナーを立ち上げ、クライアントからの接続を待つ
    HttpListener s = new HttpListener();
    s.Prefixes.Add("http://localhost:8000/ws/");
    s.Start();
    var hc = await s.GetContextAsync();

    //クライアントからのリクエストがWebSocketでない場合は処理を中断
    if (!hc.Request.IsWebSocketRequest)
    {
        //クライアント側にエラー(400)を返却し接続を閉じる
        hc.Response.StatusCode = 400;
        hc.Response.Close();
        return;
    }

    //WebSocketでレスポンスを返却
    var wsc = await hc.AcceptWebSocketAsync(null);
    var ws = wsc.WebSocket;

    //１０回のレスポンスを返却
    for (int i = 0; i != 10; ++i)
    {
        //1回のレスポンスごとに2秒のウエイトを設定
        await Task.Delay(2000);
        
        //レスポンスのテストメッセージとして、現在時刻の文字列を取得
        var time = DateTime.Now.ToLongTimeString();

        //文字列をByte型に変換
        var buffer = Encoding.UTF8.GetBytes(time);
        var segment = new ArraySegment<byte>(buffer);

        //クライアント側に文字列を送信
        await ws.SendAsync(segment, WebSocketMessageType.Text,
          true, CancellationToken.None);
    }

    //接続を閉じる
    await ws.CloseAsync(WebSocketCloseStatus.NormalClosure,
      "Done", CancellationToken.None);
}

```
### 実行してみる
上記ができたら、サーバを事前に動かしておき、Webブラウザで上記クライアント側となるJavaScript付きのHTMLを実行すると、サーバへ要求がなされます。
成功すると、以下のようにサーバ側の現在時刻が2秒間隔でWebブラウザに表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172093/eba78345-2bc3-15fc-9985-846969d9b185.png)

以上
大学祭でシステムを作った話（背景・結論編）

## INIAD-FESとは
自分が通っている（といっても、今年1年間休学していますが・・・）東洋大学は、白山・川越・朝霞・板倉・赤羽台と5つのキャンパスがあり、同一日程でそれぞれ大学祭を実施しています。
INIAD-FESはそのうちの、赤羽台キャンパスの大学祭です（INIADはFaculty of **I**nformation **N**etworking for **I**nnovation **A**nd **D**esign ・・・情報連携学部の略で「イニアド」と読みます）

赤羽台キャンパスは、INIADの設置（2017年）と同時に開設されたキャンパスで、他キャンパスからは学部移転などがない（再来年春に朝霞から移転してきます）ので、まだ3年目の大学祭です。
なので、実は大学祭自体もかなり手探りの状態です。
[INIAD](https://www.iniad.org/)や[INIAD-FES](https://iniadfes.com)については、それぞれ公式サイトをご覧ください

## 情報が欲しかった
いかんせん新設キャンパスの大学祭なので、そもそもどんな人たちが来るのかがイマイチわかってない節がありました。
（高齢化率が高い北区ですが、大学のそばで団地の建て替えが進んでいて、実はファミリー層も多く住んでいる）

そこで、INIAD-FESにどんな年代の人が来ているかや、サークルなどの企画でどういったものが人気なのかなどを分析したいと・・・

## 去年のお話
第2回の時から（同じことを意図していたのかはわかりませんが・・・）QRコードを発行して、企画などの受付で読み取り、来場のスタンプや来場者の属性（性別や年代など）と紐づけて分析するようなシステムが運用されていました。（自分は去年はIoTフル活用の脱出ゲームを作るのに夢中でした）
そこで、そのシステムをブラッシュアップするような感じで作ってやろう！ということになりました。

## 作ったシステム
- 来場者管理システム（QRコードで来場者の属性や企画の履歴を管理するシステム）
- デジタルパンフレットアプリ（スマホのアプリとして、企画の情報や構内のマップを表示できるアプリ）
- 企画管理システム（アプリやWebサイトに供給する企画情報のデータ管理や、来場者管理システムの権限管理のためのシステム）

## 運用してみて
**技術的な話は翌日以降のアドベントカレンダーで出すので、お楽しみに！**
今年のINIAD-FESは実行委員会の立ち上がりが遅かったこともあり、直前まで内容などの変更が相次ぎ、紙のパンフレットを担当していた広報部がかなりてんわやんわしているような感じだったのですが、これらのシステムは、企画管理システムで変更した内容がすぐに反映されるので、柔軟に対応できたなと思います。
それと、デジタルパンフレットアプリには、プッシュ通知の機能があるので、放送などで伝えられなかった企画などの宣伝を届けることができるなど、一歩進んだ情報発信ができたと思います。

さらに、去年はサークルなどにデータを提供していなかったのですが、今年はサークルに、それぞれ実施した企画の来場者についての情報を提供できるように作ったので来年に活用してほしいなぁとか思ってます。

一方で、やっぱり立ち上がりが遅かった影響でアプリの利用率が芳しくなかったという反省があります。
来年はもうちょっと周知して是非使ってほしいな・・・
取引先の法人→個人レコードタイプの変更

# はじめに
比較的最近にSalesforceをさわり始めた者が書いているので、ごく初心者向けの内容です。
データローダを使って取引先のレコードタイプを法人から個人に変更するときに、公式ヘルプの記載通りにやったら怒られたので、備忘も兼ねて書きます。

# 公式ヘルプの内容
確認した公式のヘルプは[法人取引先から個人取引先、および、個人取引先から法人取引先へ変更する方法](https://help.salesforce.com/articleView?id=000330088&language=ja&type=1&mode=1)です。

内容をざっくりまとめると、下記のようになります。
1. レコードタイプを更新したい取引先のIDとレコードタイプを出力する
2. 変更したい先(法人→個人であれば個人取引先)のレコードタイプのsfidを確認する
3. 1で取得した取引先のレコードタイプに、2で確認したレコードタイプのIDを指定して更新する

ただ、上記の手順で更新をかけようとしたところ、以下のエラーで怒られてしまいました。
> account cannot be converted to person-account

# レコードタイプ変更に必要だったこと
ヘルプ通りに進めたはずが…せめて変換に失敗した理由を出力して欲しいと思いましたが、仕方がありません。
諸々確認した結果、私がレコードタイプを変更したかったデータの場合、更新には以下の3作業(?)が必要でした。
1. 取引先責任者を作成する
2. 更新したい取引先と、取引先責任者の「所有者」を合わせる
3. 「親取引先」を空にする

<b>1. 取引先責任者を作成する</b>
更新をかけようとしている取引先の取引先責任者を作成します。

そらそうでしょと言われそうですが、ヘルプに書いてなかったのでうまいこと作ってくれるのかと思っていました…。

<b>2. 更新したい取引先と、取引先責任者の「所有者」を合わせる</b>
取引先の所有者が違っていると更新に失敗します。

自分は検証環境で更新に成功した上で、本番でいざ更新！をして失敗して気づきました。
本番環境のデータ所有者はお客様なのに、取引先責任者の作成が自分(システム管理者)になっていたためです。

<b>3. 「親取引先」を空にする</b>
公式ドキュメントの[個人取引先の使用に関する考慮事項](https://help.salesforce.com/articleView?id=account_person_behavior.htm&type=5)に、
> 個人取引先は取引先階層に含めることはできません

とあるので、親取引先は空にしておく必要があるようです。

検証環境で適当なデータで変換テストをしたときに失敗して確認しました。
法人→個人へ変換を依頼されるようなデータですと、そもそも親取引先は入っていないことが多そうですし、実データの場合はあまり気にしなくても良いかもしれませんね。

# 更新手順まとめ
上記を踏まえて、今自分が使用している取引先レコードタイプ法人→個人変更フローが以下になります。

1. 更新したい取引先(以下取引先)の所有者を確認し、親取引先が入力されていたら空にする
2. 取引先の取引先責任者を作成する
3. 2の取引先責任者の所有者を、取引先の所有者と同じにする
4. 個人取引先のレコードタイプのsfidを確認する
5. 更新したい取引先のIDとレコードタイプをデータローダで出力する
6. 5で出力した取引先のレコードタイプを4で確認した個人取引先のsfidに書き換える
7. 6を使ってデータローダで取引先を更新する
8. 取引先情報の更新が必要になっていないか確認する(取引先名や個人取引先のみの必須項目など)

# おわりに
自分が取引先レコードタイプ変更で引っかかった点についてまとめました。
今の所は対応件数が多くない(手順を忘れた頃にくる)のでデータローダでちまちま対応していますが、手動更新に恐怖を感じるタイプなので、折を見てボタンポチーでできるようにしようと思います。
データ分析　python 

勉強のアウトプットとして

#内容
・データ分析で用いられる基本的なライブラリの概要
・初歩的コード

##ライブラリ
データ分析で用いられるライブラリとしては以下の三つがあります。かっこは慣習用語
・pandas (pd)
・numpy (np)
・matplotlibのpyplot (plt)

###pandas
pandasはデータの読み込み、データの簡単な情報の確認、データを整えたり、欠損地の確認や削除、集計ができるライブラリ

###numpy
python従来の数値計算よりも高速に処理してくれる、数値計算のアルゴリズムを楽に組んでくれるライブラリ

###matplotlib
二次元グラフや三次元グラフなどのグラフを支援してくれる描画ライブラリ

##初歩的なコード
```python
import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
%matplotlib inline #現行のブラウザに表示

df = pd.read_csv("ファイル名") #ファイルの中のcsvを読み取る
df = pd.read_csv("ファイル名",header=None)　#headerを指定することで見出しをつけるかつけないか設定できる
df.head() #csvファイルの最初の五行を読み取る
df.tail() #csvファイルの最後の五行を読み取る
#関数の引数に値を指定すると指定した行まで読み取ることができる
df.head(10) #csvファイルの最初から10行目まで読み取る
df.tail(10) #csvファイルの最後から10行目まで読み取る
df.shape #ファイルの行列数を計算するプロパティ
df.describe() #最小最大値、標準偏差、平均などの基本統計量を計算する関数
df.info() #文字列や整数、浮動小数点数の型を調べてくれる関数
df["列名"]　#特定の列(カラム)を抽出
df[["列名","列名",...,"列名"]] #特定の列(カラム)を複数抽出
df[df["列名"] 条件式] #条件を満たすカラムを抽出
df[df["y"]>=df["y"].mean()] #"y"というカラムからyの平均以上を抽出
df["列名"].sort_values(by="y",accending=False) #yについて降順にソート
df["列名"][df["列名"]条件式] #右のかっこの条件沿った左のカラムを抽出
df["列名"].plot() #横軸を行番号、縦軸を指定した列名の数値の折れ線グラフを生成
df["列名"].plot(figsize=(横,縦))　#figsizeでグラフの大きさ比率を設定
df["列名"].plot(figsize=(横,縦),title="タイトル名") #タイトルの設定
ax = df["列名"].plot(figsize=(横,縦),title="タイトル名")
ax.set_xlabel("ラベル名") #x軸のラベル名を設定
ax.set_ylabel("ラベル名") #y軸のラベル名を設定
df["列"].plot.hist() #ヒストグラムを生成、列を階級で分けて度数を調べてくれる
df["列"].plot.hist(grid=True) #グリッド線の追加
plt.axvline(x=数値,color="色") #垂直な線を書く

plt.axvline(x=df["y"],color="red") 
df["y"].plot.hist()                #グラフを重ねて書く

plt.axvline(x=df["y"],color="red") 
df["y"].plot.hist()                
plt.savefig("ファイル名.拡張子")　#グラフを保存

df[["列名1","列名2"]].boxplot(by="列名1") #boxplotで指定した引数の項目ごとの列名2の数のばらつきを調べる箱ひげ図
df.isnull() #nullがある欄を確認
df.isnull().any() #カラムに対してnullがあるかないかを確認
df.isnull().sum() #カラムに対してnullの個数をカウント
df["列名"].value_counts() #数値の個数を出力
df.fillna() #null値を具体的な数値にすべて変換
df.dropna(subset=["列名"])　#列に対してnullがあった場合、該当する行を削除
df[["列名1","列名2"]].corr() #二つの列の相関関係を出力
df.plot.scatter(x="列名",y="列名",figsize=(5,5)) #散布図をプロット
```
enebular と LINE Things で懐にやさしい IoT

この記事は 「[enebular Advent Calendar 2019](https://qiita.com/advent-calendar/2019/enebular)」の 9 日目の記事です。
\# そして 11/28 開催の [enebular developer meetup](https://enebular.connpass.com/event/152742/) で登壇した内容です。

# 背景的な何か
2 年前に作った、仮想マシンの稼働状況や電源操作を手元で行えるようにした ESP8266 製の[仮想マシン用物理電源ボタン](https://speakerdeck.com/horihiro/espr-r-developerdezuo-ru-namofalse)🤔、これを今の技術スタック＆違う切り口で作ってみました。

\# 参考ですが、当時作成した仮想マシン用物理電源ボタンの概要図です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90361/184318a5-ada3-586c-8bb9-212f5f8db348.png)
アイコンはアレなのですが、2 年前の話ですのでご容赦を🙇‍♂️


# 今回作ったもの
enebular と LINE Things を使って出社／退社を検知し、仮想マシンの電源を制御してみました。
\# タイトルの「懐にやさしい」は、仮想マシンの料金が節約できる、、、てことで。。。

## 材料

- enebular<br>
    - LINE Bot
    - 仮想マシンの電源を制御する
- LINE Things
    - ESP32 製
    - [LINE Things Starter for ESP32](https://github.com/line/line-things-starter/tree/master/esp32) ベース
        - 追加したコードは、定期的に BLE Notification を出すだけ
    - 職場に設置
        - Wi-Fi 不要
- 仮想マシン
    - 今回の制御対象
    - Azure VM

## こんな風に動く
ざっくりとこんな感じ。
### 出社時
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90361/976548e8-c19e-0152-bae4-1a7e6fecc9af.png)

1. LINE Things からの BLE Notification がスマホの LINE アプリと LINE Platform を経由して、LINE Bot である enebular に到達
2. enebular の Flow で、VM の電源が入っていなければ、電源オン。

### 退社時
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90361/106f6801-a5c5-8ec8-02c1-bf448151fa4c.png)

1. LINE Things からの BLE Notification が enebular に届かなくなる
2. 一定時間 (例えば 5 分とか) enebular へ BLE Notification が届かなければ、VM の電源オフ


# enebular で作成した LINE bot フロー
全体像はこのような感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90361/779d004d-c7c2-192a-f0fe-4d39d94c5ce0.png)
## 頑張ったところ

### Function ノードの徹底排除<br>

Function ノードの多用は、[Node-RED のアンチ パターンの 1 つ](https://qiita.com/zuhito/items/442a8b99c597150f8472#1-%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E8%83%BD%E5%8A%9B%E3%81%8C%E5%BF%85%E8%A6%81%E3%81%A8%E3%81%AA%E3%82%8Bfunction%E3%83%8E%E3%83%BC%E3%83%89%E3%82%92%E5%A4%9A%E7%94%A8%E3%81%99%E3%82%8B) です。
なので、今回徹底的に排除して、Change ノードに置き換えました。
\# 結果 Change ノードだらけになって、やや複雑です。。。

### サブ フローの使用
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90361/fd5170a5-43df-eef5-a43e-1fcca27539ea.png)

REST API の実行とその前準備、後処理などは決まった処理になるので、[サブ フロー](https://nodered.jp/docs/user-guide/editor/workspace/subflows)として切り出してみました。
Node-RED に触れてから 4 年くらいは経つのですが、サブ フローの存在を初めて知りました😅

### LINE ボットとしてのユーザーとのインタラクション
実は、仮想マシンの電源オフ時は、一度 LINE アプリを介してユーザーに確認を入れています。
その確認で電源オフまでの時間を延長したり、即電源オフにしたり、一定時間無視されたら強制オフにしたり、と割と頑張って表現してみました。

# 作ってみて思うこと
enebular/Node-RED に代表されるビジュアル プログラミングで、↑みたいに変に頑張りすぎると、今回フローみたいに、一見何が何だかわからないフローになってしまいます。
ビジュアル プログラミングで表現するためには、できるだけシンプルなプログラムを考える、何か別の脳みそが必要なのかもしれないですね。。。
キックオフミーティング

##初めてキックオフミーティングに参加して思ったこと。


###キックオフミーティングとは
プロジェクトのスタート。
目的や概要、スケジュール、工程、コストなどをお客様と一緒に認識合わせをするミーティングです。

###実際に行ってみて思ったこと
私は以前営業を経験していました。
もちろん上流工程と営業は全く違います。
ただお客様の舵取りは似ていると思いました。
そこで、プロジェクトを実際に始めるに当たって注意したいことをまとめました。

###注意点
1.一貫性を保つ
2.決めらる部分はこちらで決める
3.ENDを設ける
4.お客様に選択させる

#####1.一貫性を保つ
まず1の理由は、当然ですが持っていくべき書類持っていかないとか、文言が揺れているなどするとお客様は悩んでしまいます。

以前、お客様の提出物に要求定義書と要件定義書が入っていたんですが、要件定義書作成が間に合わずに要求定義書だけを見せて、「これをブラッシュアップしたものを次回お持ちします」と言って少し誤魔化したのですが、要件定義書の確認が翌週末までに設定していたので、「あれ？今日もらえないんですか？いつ貰えるんですかね？？私はこの書類を確認する必要あるんですよね？？？」と当然なツッコミが入りました。

完全にお客様が不安になってますね。

良くはないですが、まだ工程が遅れているわけではなかったので、それを説明して事なきをえました。

ただこういう不信感が一つ一つ積み重なることで、「この人たちに任せられない。指示を出してコントロールしていかなければ！！」と、システムのことは分からない中であれこれ指示を出してしまい、それが原因で工程が遅れることはしばしばあるのかもしれません。

完全にお客様の不安を取り除くのはプロジェクトがリリースされてある程度時間がかからないと難しいかもしれません。

ただ、一番不安に思っているのはお客様なので上流のエンジニアが味方になって安心させる必要があるのかなと思いました。

なので余計な部分で不安にさせないことが重要だと思いました。

#####2.決めらる部分はこちらで決める
お客様は当然ですが自身の業務がメインになります。

システムを導入する理由の多くは、自分の今やっている事業や仕事を簡潔にしたり、お客様へお出しするサービスを増やすことなどが考えられます。

なのでシステムは業務を補うものなので、システムについては良く分からない人の方が多いです。

またメインの業務とプロジェクトを掛け持つお客様もおります。

当然メインの業務の方が忙しいですから、私たちエンジニアが決められる部分は決めていく方がありがたいような気がしました。

そして、相談しないといけない部分はお客様の目にすぐ分かるように一覧することで、よりスピーディに工程をこなすことができるようになると思います。

また明確になっていればお客様からも指摘がしやすく、すごく仕事がしやすくなると思います。

それが一つ一つ安心感に変わり、信頼に繋がります！！

#####3.ENDを設ける
これはかなり重要です。

例えば友人から「この日空いてない？」というふに誘われると結構恐怖に感じることがあります。

なぜなら1時間でも無駄にしたくないからです。

だから「この日空いてない？」と言われると一日潰れるのかな？と構えます。

逆に「この日の昼頃、1~2時間空いてない？」などの聞き方をされたほうが、他の予定を前後に移すことができます。

設計などを起こすさいに、どうしてもお客様に決めてもらわないといけないことも多いです。

ただ、お客様は常にメインの業務で忙しいです。

なので、忙しいこと前提に考えれば、ENDを設けることは重要だと思います。

ENDによって優先順位が変わってくるからです。

なかなかお客様に対してENDを決めるのは気が引けるかもしれませんが、その方がお客様も合わせやすいと思いますので、しっかり伝えることが大事だと思いました！

ただしENDの伝えるさいは注意が必要で、お客様のタイミングによっては「こっちだって忙しいだよ!そんなの守れるか！！」と思われたら最悪です。

なので「ENDは○○日までを考えてます。ただ、○○様もお忙しいと思いますので、仮に○○日が難しければご連絡ください。こちらでも対応できるか考えますので。」と助け舟をしっかり出しますよ！という風に言ってあげるとお客様は非常に安心して、相談もしてくれると思います。

一番最悪なのは、相談もなしにENDを破られることです。

そういうお客様もいるかもしれませんが、コミュニケーションがしっかり取れて入ればそういったこともなくなるはずです。

#####4.お客様に選択させる
こちらが最後になります。

**お客様に選択させる**というのはどういうことか。

2.の**決めらる部分はこちらで決める**と多少矛盾しますが、「仮にあっちとこっちどちらが良いですか？」と聞き、お客様に決めてもらうということは、細かいですがお客様の満足度をあげる非常に重要なテクニックです。

お客様はわがままです。

ラクしたい。めんどくさいのはやってもらいたい。

けど、自分のものを作りたい。あーしたい。こーしたい

つまりめんどくさいのは嫌だけど、自分が納得できるものは作りたいということです。

まぁ当然です。

ただ工数や予算がかかるので、後ろには倒せない。

なのでお客様に提案しつつお客様に決めてもらうという形が、一番お客様も自分で納得して決めているという部分で納得感を持ってもらえると思います。

納得感が高まると、それが達成していけば満足感に変わっていきます。

なのでリリース後は達成感と満足感を持ってくれるのではないでしょうか？？？


担当者の方が満足感と達成感を持ってシステムをリリースすることは、ただリリースするのと大きく違います。

ちょっと話は変わりますが、皆さんも一晩中語れる大好きなものが一つや二つはあると思います。

大好きなものが共通していたら、夢中でそのことについて話しませんか？

お客様が仮に満足感と達成感で満ちていたら、同僚や同業の友人などに「実は新しいプロジェクトを俺が主導で作ったんだよね！！」という会話もあるかもしれません。

かなり楽観的ですが、そこから紹介だってありえます。

おそらく、私が勤めている会社がそんな感じなのかなと。

社長がそういう思いでお客様とシステムを作り上げているので、紹介が切れないのかなと。

なので、お客様に満足してもらえるようなシステムを作ることが大事だな〜と初めてキックオフミーティングを通してわかりました！！
整数問題を解く

整数問題のメモ。※解法の正しさは保証しません。

# 問題
以下を満たす自然数$p$と自然数$x$および$y$の組を求めよ。

```math
p^{2} = x^{3} + y^{3}. 
```

# 解答

## 右辺

右辺を因数分解する。

```math
x^{3} + y^{3} = (x+y) ^{3} - 3xy(x+y) = (x+y)(x^{2} + y^{2} - xy). 
```

右辺は

* $x+y$, 

* $x^{2} + y^{2} - xy$.

の積で表せることが分かった。

## 左辺

右辺が2つの式の積で表せることが分かったので、左辺も同様に2つの式の積で表す必要がある。$p$は素数なので、以下のパターンで尽きる。

* $1 \times p^{2}$, 

* $p \times p$. 

$(-1) \times (-p^{2})$および$(-p) \times (-p)$のパターンについては、 $x+y > 0$であることから排除できる。

## 組み合わせ

上記の結果を組み合わせると、以下のパターンを考えればよい。

1. $1 = x + y$, $p^{2} = x^{2} + y^{2} - xy$, 

1. $p^{2} = x + y$, $1 = x^{2} + y^{2} - xy$, 

1. $p = x + y = x^{2} + y^{2} - xy$

### パターン1

$x \geq 1$, $y \geq 1$のため、$x + y \geq 2$である。したがって、 $x+y=1$を満たす自然数$x$, $y$の組は存在しない。

### パターン2

以下のように式変形する。

```math
0 = x^{2} + y^{2} - xy - 1 = (x-y)^{2} + xy - 1. 
```

$(x - y)^{2} \geq 0$であるから、

```math
(x-y)^{2} = 1 - xy \geq 0
```
となる。この不等式を満たす自然数$x$, $y$は、$x=y=1$のみである。このとき、

```math
p^{2} = x + y = 2
```
となるが、これを満たす素数$p$は存在しない。

### パターン3

$y = p - x$を代入して、$p$と$x$の2次方程式に変形する。

```math
0 = -p + x^{2} + y^{2} - xy = -p + x^{2} + (p-x)^{2} - x(p-x) = 3x^{2} - 3px + p^{2} - p. 
```

$x$は実数解を持つので、判別式$D$は$0$以上でなければならない。

```math
D = (-3p) ^{2} - 4\cdot 3 \cdot (p^{2} - p) = -3p^{2} + 12p = -3p(p-4) \geq 0. 
```

$p$は素数のため、上記条件式を満たすのは$p=2, 3$のみ。$p$を代入して、$x$を求める。

* $p=2$の場合

    ```math
    3x^{2} - 6x + 2 = 0. \Rightarrow x = 1 \pm \frac{\sqrt{(-6) ^{2} - 4\cdot 3 \cdot 2}}{6} = 1 \pm \frac{\sqrt{3}}{3}. 
    ```

* $p=3$の場合

    ```math
    3x^{2} - 9x + 6 = 3(x-1)(x-2) = 0. \Rightarrow x = 1, \,\, 2. 
    ```

$x$が自然数であるという条件を満たすのは、$p=3$の場合のみである。

## 解

$3 = p = x + y$、$x=1, 2$のため、

```math
p=3, \quad (x, y) = (1,2), \,\, (2,1)
```
を得る。上記は$p$は素数、$x$および$y$が自然数という条件を満たす。
pm2を使っているからnodeアプリでlog4jは使わなくていい？

pm2で動かすこと前提のnodeアプリを書いていて、ログをそのままconsole.logとconsole.errorの2種類を使い分けるか、log4jを入れてきっちり分けるかで悩んだ結果、前者のconsoleを直に叩く方式にした。

## console直のメリット

- ライブラリを入れなくてもいい

## log4jのメリット

- stdout stderrの他に細かくログレベルを切り替え出来る
- ログにタイムスタンプを入れる事が簡単に出来る


pm2の機能で、ログにタイムスタンプを入れる事が出来るからconsoleでいいかな。
【Objective-C】コード上からボタンを追加する。

objective-cにおいて、画面にボタンを追加する場合、storybordから追加することができる。

しかし、動作などを追加する場合storybordとコードをつなげる必要があり、
ボタンを多く追加すると個人的には見づらくなってくる。

できれば、コードだけで確認がしたいため、
今回は、コード上からボタンを追加する方法についてまとめてみようと思います。

#ボタンの設定
UIButton をコード上で使用することで、ボタンを追加することができます。
追加する時に、各状態になった場合のボタンのタイトル、色などを指定することができます。

```
    //ボタンの宣言
    UIButton *button = [[UIButton alloc]init];

    //タイトル・テキスト色・画像　通常
    [button setTitle:@"ボタン" forState:UIControlStateNormal];
    [button setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
    [button setImage:[UIImage imageNamed:@"image"] forState:UIControlStateNormal];

    //タイトル・テキスト色・画像　押下中
    [button setTitle:@"押下中" forState:UIControlStateHighlighted];
    [button setTitleColor:[UIColor blackColor] forState:UIControlStateHighlighted];
    [button setImage:[UIImage imageNamed:@"image"] forState:UIControlStateHighlighted];
    
　　 //タイトル・テキスト色・画像　選択中
    [button setTitle:@"選択中" forState:UIControlStateSelected];
    [button setTitleColor:[UIColor blackColor] forState:UIControlStateSelected];
    [button setImage:[UIImage imageNamed:@"image"] forState:UIControlStateSelected];

    //タイトル・テキスト色・画像　無効中
    [button setTitle:@"無効" forState:UIControlStateDisabled];
    [button setTitleColor:[UIColor blackColor] forState:UIControlStateDisabled];
    [button setImage:[UIImage imageNamed:@"image"] forState:UIControlStateDisabled];

    //フォントサイズ
    [button.titleLabel setFont:[UIFont systemFontOfSize:30]];
    //背景色
    [button setBackgroundColor:[UIColor redColor]];

    //画面に追加
    [self.view addSubview:button];


```

#枠線の設定
枠線の色は setBorderColor 、枠線の太さは setBorderWidth 、角丸の丸みは setCornerRadius 、
で指定するができます。

```
　　 //枠線の色
    [button.layer setBorderColor:[UIColor blackColor].CGColor];
    //枠線の太さ
    [button.layer setBorderWidth:2.0];
    //角丸の指定
    [button.layer setCornerRadius:5.0];
```

#押下時の動作
ボタンを選択した時の動作を追加する場合、 -(void)関数名:(UIButton *)button で動作を指定して、
ボタン追加時に addTarget で関数を指定する必要あります。

```
//押下時の動作
[button addTarget:self action:@selector(button_select:) forControlEvents:UIControlEventTouchUpInside];

-(void)button_select:(UIButton *)button {
    //ボタンを選択中に変更する。
    button.selected = true;

　　//ボタンを無効中に変更する
    button.enabled = false;
}

```

#実行結果

<img width="499" alt="スクリーンショット 2019-12-08 17.54.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431502/594b4290-a2a7-ccb0-330a-2fbb3c8cc7d2.png">

#参考
https://developer.apple.com/documentation/uikit/uibutton
https://qiita.com/hatapu/items/99e6a8b19f890f0fec9f
https://iphone-tora.sakura.ne.jp/uibutton.html
Vue.jsのv-bindでhtmlを渡したい

## 問題
Titleコンポーネントを作った際に`<br>`付きの値を渡したら`<br>`ごと反映されてしまった

<img width="1208" alt="スクリーンショット 2019-12-08 20.05.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447438/13f374fe-5203-2de4-0b46-e400526a3fef.png">

```vuejs:Title.vue
<template>
  <div class="title">
    <p class="title__lead__top">{{ top }}</p>
    <h2 class="title__catch">{{ catchCopy }}</h2>
    <p class="title__lead__bottom">
      {{ bottom }}
    </p>
  </div>
</template>

<script>
export default {
  name: "Title",
  data() {
    return {};
  },
  props: {
    top: {
      type: String,
      require: false,
      default: "top"
    },
    catchCopy: {
      type: String,
      require: true
    },
    bottom: {
      type: String,
      require: false,
      default: "bottom"
    }
  }
};
</script>

<style scoped></style>
```

```vuejs:Home.vue
<Title
top="キャッチコピー説明(top)"
catch-copy="キャッチコピー<br>キャッチコピー02<br>キャッチコピー03"
bottom="キャッチコピー説明(bottom)"
></Title>
```

## 解決方法
文字列をそのまま渡してしまっていたのでv-htmlディレクティブをつかう

<img width="1053" alt="スクリーンショット 2019-12-08 20.14.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447438/99f0be68-07dc-d4ab-06c3-d2627857ede8.png">


```vuejs:Title.vue
<template>
  <div class="title">
    <p class="title__lead__top">{{ top }}</p>
    <h2 class="title__catch" v-html="catchCopy"></h2>
    <p class="title__lead__bottom">
      {{ bottom }}
    </p>
  </div>
</template>

<script>
export default {
  name: "Title",
  data() {
    return {};
  },
  props: {
    top: {
      type: String,
      require: false,
      default: "top"
    },
    catchCopy: {
      type: String,
      require: true
    },
    bottom: {
      type: String,
      require: false,
      default: "bottom"
    }
  }
};
</script>

<style scoped></style>

```
改定後Oracle Master Silver12c合格体験記

#本記事の目的
OracleMaster Silver12cに合格したので、これから受験する方に向けて合格のためにしたことを共有。

#スペック
- 業務では簡単なSQLを書く程度。DBAの経験なし。IT業界3年目。
- IT系の資格は基本情報技術者、Oracle Master Bronze 12cのみ。

#受験結果
1回目の受験で69%合格（合格ライン64%）。

#合格するまでに実施したこと
合計勉強時間は60時間程度。期間は5週間。
電子書籍を購入し、通勤時間や暇な隙間時間を利用してスマホ勉強した。

| 教材     | 　   投下時間  　  |
|:-----------------|:------------------:|
| [11gの白本](https://www.amazon.co.jp/%E3%80%90%E3%82%AA%E3%83%A9%E3%82%AF%E3%83%AB%E8%AA%8D%E5%AE%9A%E8%B3%87%E6%A0%BC%E8%A9%A6%E9%A8%93%E5%AF%BE%E7%AD%96%E6%9B%B8%E3%80%91ORACLE-MASTER-Silver-DBA11g-%E8%A9%A6%E9%A8%93%E7%95%AA%E5%8F%B7/dp/4797361867/)             |         25時間        |
| [12cの黒本](https://www.amazon.co.jp/%E3%82%AA%E3%83%A9%E3%82%AF%E3%83%AB%E3%83%9E%E3%82%B9%E3%82%BF%E3%83%BC%E6%95%99%E7%A7%91%E6%9B%B8-Silver-Oracle-Database-12c/dp/4798143561)           |       30時間       |
| Oracleセミナー動画 [前編](https://www.youtube.com/watch?v=AsY3n7j8krI) [後編](https://www.youtube.com/watch?v=urHpEoSEQM4)            |        3時間        |        ◎        |
| [@ITの記事](https://www.atmarkit.co.jp/ait/series/8646/)               |         3時間        |

まずは以下のリンクを参考に改定後の試験範囲を理解し、上記の教材を問題演習中心で理解を深めていく。正解率100%にするまで何周かすれば合格する。
[改定後黒本範囲対応表](https://qiita.com/fam_taro/items/449d5571a18faae81fc9)
[Oracleホームページ](https://education.oracle.com/ja/oracle-database-12c-administration/pexam_1Z0-062)

#感想
ユーザー管理、SQL loader、Oracle Data Pumpの問題が思ったより出題された。落ちたかと思ったが問題演習の解説に記載されていたことを絞り出すように思い出して何とか解いていったのが良かったかもしれない。
Railsプロジェクトで大切だとかんじたこと

## はじめに

## Issueを作成する
実装する内容・機能などをGitHubのIssueを使って、管理することです。
Issueのタイトルのところに、実装する内容を書き、詳細部分でより細かく作業内容を分割し、マークダウンでチェック項目を作っていました。Issueを作ることにより、残り実装しなければいけないことがどれだけあるのかを視覚的に確認できるので、順番にそのIssueを無くしていく感じで、進めていくと順調にプロジェクトを進めることができます。

## Kanbanによるプロジェクト管理
作成したIsuueをKanbanで、タスクのように管理できます。Issueを作成していない場合は、Kabanにカードを自分で追加することもできます。Kanbanを3つの部分に分けます。`to do` `in progress` `done` に分けて、管理してました。Kanbanでプロジェクトを管理することで、チーム開発をする際など相手がいま取り組んでいる内容がわかりやすくなります。また、個人制作でも自分が取り組んでいる内容がわかりやすくなるので、人からアドバイスを受ける際によりいいアドバイスがもらえるかもしれません。

## 開発環境とプロダクション環境の差異をできるだけなくすこと
ローカル環境で、プロジェクトを作ってすべて完成したら本番環境へデプロイしようと思っている方いませんか？
ローカルで動いているプロジェクトを本番環境に移したら、動かなくなったなどよくあることだと思います。ローカル環境とプロダクション環境は、設定が違ったりするのでローカル環境で動くからと安心してはいけないと思います。なので、最初時間がかかると思いますが、面倒くさがらずに本番環境で動くように設定をしてから、プロジェクトを作り始めることをお勧めします。


## さいごに
Railsのプロジェクトを通して、プロジェクトの管理はやっぱり大事なんだなと再認識しました。
もっとタスクに対して、期限を付けることで効率的に作業を進められたかなって思います。
[The Go Programming Language Specification] String literals

# Go
Golangのspecificationの日本語訳と、ちょっとした遊びぐらいのコードを載せていく感じで進めようと思うので、
すでにGolangでコードを書いている人にはつまらないかもしれないです

また、間違っている部分があればぜひご指摘いただけると嬉しいです🙇‍♂️

#### 想定する読者層
- Golang初めてそこまで期間が経っていない
- 英語の公式読むの辛い
    - https://golang.org/ref/spec


### String literals
本記事は公式のドキュメントを参考にしています

- https://golang.org/ref/spec#String_literals

String literals はcharacter(文字)の結合された集まりです

### Stringの宣言方法
String literals は2つの宣言方法があります ` のバッククウォートもしくは、 " ダブルクウォートを使う方法です

```golang
s := `string`
s := "string"
```

２つの宣言方法の違いは、 ` のバッククウォートを使った場合には改行を含んだ文字列を代入できたり、Unicodeなどをそのままの文字列（raw literal）で表現できる点です


```golang
s := `string
                      string
            hoge`
fmt.Println(s)
```
```text
string
                      string
            hoge
```
https://play.golang.org/p/uq4xE49Edge

```golang
package main

import (
	"fmt"
)

func main() {
	q := `\u65e5本\U00008a9e`
	fmt.Println(q)
	s := "\u65e5本\U00008a9e"
	fmt.Println(s)
}
```

```text
\u65e5本\U00008a9e
日本語
```
https://play.golang.org/p/BLZFiPY-yzl

"（ダブルクウォート）ではエラーが発生します

ちなみに他の言語では '（シングルクウォート）で宣言しようとした場合にはgolangでは　int32(rune) で宣言されるので注意してください

```golang
r := 'a'
fmt.Println(r)
```
```text
97
```
https://play.golang.org/p/PndDpnj565h

rune が何かを知りたい人は以前書いた記事を参考にしてみてください
https://qiita.com/mergit/items/5c5888c5cdc626ff815d
Maplat Coreでマーカーの画像を変更する（ピン単位）

Maplat Advent Calendar 8日目は、Maplat Coreでマーカーの画像を変更する方法です。
まずは、ピン単位でマーカー画像を置き換える方法です。
今日の動くものはここで確認できます。 => [CodeSandBox Maplat Advent Calendar day 8](https://codesandbox.io/s/maplat-advent-calendar-day8-f153g)

今日のベースは静的POI指定の[6日目のコード](https://codesandbox.io/s/maplat-advent-calendar-day6-ewdi1)をベースに改造しますが、動的定義でも同じ設定を動的に追加すれば動作します。

まずは、置換え用ピン画像であるところの`parts/blue_marker.png`と`parts/red_marker.png`を追加しましょう。
続いて、今日はピン単位でのマーカー指定方法ということで、ピン毎にマーカーが変わっているのをわかりやすくするため、POIを一つ追加しました。

```poi.json
{
  "main": {
    "pois": [
      {
        "id": "castle",
        "lat": 36.243881,
        "lng": 139.543517,
        "name": "館林城",
        "icon": "parts/blue_marker.png",
        "selected_icon": "parts/red_marker.png"
      },
      {
        "id": "shrine",
        "lat": 36.25163,
        "lng": 139.528562,
        "name": "愛宕神社"
      }
    ]
  }
}
```

見ていただいて分かる通り、1つ目のPOIに`icon`属性及び`selected_icon`属性が指定されていますが、これにより、1つ目のPOIのみマーカー画像が差し変わります。

![スクリーンショット 2019-12-08 20.07.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10108/3090a06a-a6eb-da2b-88a3-88c7b2353fab.png)

明日は、POIレイヤー全体でマーカー画像を差し替える方法について説明します。
インターン生から見た「VACAN」

#### はじめに

みなさん、こんにちは。私は株式会社バカンで、現在インターンとして働いています。
都内の大学で情報工学を学んでいる、ラーメンと読書と映画鑑賞が好きな大学３年生です。

今回がQiita初投稿ということもあり少し緊張しています。本記事は「https://qiita.com/advent-calendar/2019/vacan 」
9日目（12/9）の記事です。

何を書けばいいかと悩みましたが、せっかくなのでインターンならではの目線で、どんな仕事を普段やっているのか、バカンってどんなところなのか、また、スタートアップでのインターンがどのようにして今の自分に活きているかなどのお話をしていきたいと思います。

#### バカンでの仕事内容

私がバカンでやっている仕事の紹介をします。私は、大学で専攻している分野が情報系ということもあり、主にエンジニアの業務のサポートをしています。バカンには、プロダクトを自社開発しているため、それらをお客様の元へ届ける前の検査が必須になります。私は、その際の検査やデータ解析などの手伝いをしています。
今はだいぶ慣れてきましたが、はじめのうちは何もかもが初めてで、大変でした…:joy:

エンジニアのサポートを主に行なっていますが、最近では他のお仕事を任せていただける機会も増えてきました。
たとえば、展示会や企業イベントへの参加、はんだごてを用いてのハードウェア制作、展示会で使用するモックの作成、インスタグラムの更新、、など。
中でも、展示会でブースに立って企業の方を相手にお話をするという経験は、とても緊張しましたが、がむしゃらに取り組んだ結果、その後の商談に繋がるきっかけを作ることができました。自分の新たな可能性も発見でき、とてもいい機会だったことを今でもよく覚えています。

バカンでは、インターンでも挑戦したいと手を挙げれば、どんどんチャレンジできるカルチャーがあるので、インターン生が成長できるような配慮がなされています。このような素晴らしい体制が整っていることが、のびのびと、自分らしく働ける秘訣なのかもしれません。

#### ユニークな仲間たち
ここで趣向を変えて、私たちがいつも使っている装置をご紹介します。
もうほとんど仲間感覚です。
多くの仲間がいますが、ここでは３人の仕事仲間を紹介します:sparkles:

- ##### １人目　３Dプリンター
 <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540730/c936f3d2-e838-cf06-3da3-2b0531e347c4.jpeg"width=40%>
この熊は私が初めて３Dプリンターを使った時に作ったものです。
この頃は既存のデータを使用していましたが、今ではfusion360を用いてデザインからできるようになりました。今では相棒です。　

- ##### ２人目　はんだごて
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540730/9e943b82-ed23-f778-913c-f2e4e0de19ec.jpeg"width=40%>
中学生ぶりに使いました。ハードウェアチームにとっては家族同然の存在。

- ##### ３人目　レーザーカッター
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540730/d83e5025-8d2d-bb34-4235-35b7d283e32f.jpeg"width=40%>
新入りですが、最近オフィスにできた作業スペースを独り占めしているボスです。

写真を見ていただくと分かる通り、これらを初めて見た人のほぼ全員が、「これ何！？」とか「すご！」と、つぶやいています。私はもう見慣れてしまいましたが、はじめの頃は同じことを思っていました。スタートアップ企業でこれだけの機器が揃っているのは珍しいのではないでしょうか…？:eyes:
そして、毎日よく働いています。いつもありがとうございます。

#### 笑顔で働ける環境
バカンがなぜ過ごしやすいと思えるのか。理由の１つとしてあげられるのは、社内での交流が多いからだと思っています。
バカンは、社内・個人単位で様々なイベントが頻繁に企画されています。年に２回の合宿をはじめとして、英語だけ使ってokな飲み会「English Night」やスポーツが好きなメンバーは皇居ランに出かけたりもします。ランチや終業後に飲みに行ったりすることも大事なコミュニケーションの一つであり、そんな環境が自然と出来上がっていることがとても素敵だと思います。
また、バカンにはメンター制度があり、インターン生一人につき一人のメンターがつきます。仕事上の相談はもちろん、大学の勉強や私生活で不安に思うことがあれば、忙しい中でも時間を作って相談に乗ってくれます。悩んでいるときにすぐに相談できることで、安心して過ごすことができるのです。

#### 9ヶ月前と、今
バカンでインターンを初めてから、あっという間に約９ヶ月が経ちました。インターンを始めたての頃は、大学の勉強や私生活と上手にバランスが取れるか不安でした。メンターや他の社員さんに支えていただきながら、日々試行錯誤し、今では仕事の進め方などを自分の中で上手に管理することが、だんだんできるようになってきました。
バカンというスタートアップ企業でのインターンは、この9ヶ月間で私を何倍も成長させてくれたと思います。物事に正確性を求めると、どうしても時間がかかってしまい、速さを求めるとどこかに足りない部分が見つかってしまう…。この２つのバランスを保つのは簡単なことではなかったですが、スタートアップ企業で働くことで、「爆速で仕上げ、その後に改善をし続ける」「自分ができることは積極的に挑戦する」「全体のリソースを減らすために自分にできることは何かを常に意識する」という考え方を知りました。
バカンで学んだことはもっとたくさんありますが、これらのことを仕事だけでなく私生活でも意識するようになってから、生活の質が向上したように思います。

#### 新しい居場所
バカンは、とても暖かい場所です。初めてバカンに来た時に感じた思いに間違いはなかったと、今の自分が教えてくれます。家族、友達、サークル、そしてバカン。自分の居場所が一つ増えたような、そんな安心感があります。
自分の感じていることを言葉にして表現することは難しいですが、今回「https://qiita.com/advent-calendar/2019/vacan 」
というすばらしいイベントに参加することができ、自分の思いを発信する機会を設けて頂けたことを、光栄に思います。技術的なことは今回は書くことができませんでしたが、社内で開かれている勉強会などで学んだことを生かして、近いうちに記事を書きたいなと思っています:thumbsup:

そして最後に、バカンでは一緒に働くメンバーを募集しています！記事を読んで、バカンって素敵なところだな、って思った方は、ぜひ！こちら（https://www.wantedly.com/companies/vacancorp ）
ものぞいて見てください。お待ちしています:relaxed: