OmniAICreator/Qiita-1.07M huggingface dataset:
RuboCopでWarning以上の項目のみ検出する方法

# ユースケース
既に稼働しているRailsプロジェクトでRuboCopを導入してみたはいいものの、何千もの違反が検出されてしまった。ひとまずWarning以上の項目だけ確認したい、そんな時に。

# バージョン情報
v0.59.0以上

# コマンド（結論）
```
$ rubocop --fail-level W --display-only-fail-level-offenses
```
# 解説
`--fail-level W`
Rubocopの警告はRefactor, Convention, Warning, Error, Fatalの5段階に分かれており、指定した深刻度以上の違反が検出された場合にはエラーコードを伴って終了する、という意味。この場合はW以上はエラーと見なされます。

`--display-only-fail-level-offenses`
この記事の本題で、上記--fail-levelで指定した深刻度以上の項目のみ表示します。Wを指定しているので、ここではWarning以上の項目のみ検出されるという仕組み。

# 参考資料
[Basic Usage - RuboCop: The Ruby Linter that Serves and Protects](https://rubocop.readthedocs.io/en/latest/basic_usage/)
RuboCopのドキュメント。その他のコマンドはこちらに全て載っています。

[rubocopが一切使われていないRailsアプリにrubocopを段階的に導入していく際にやったこと/やりたいこと](https://qiita.com/kyohei_shimada/items/e739dec967eb5e61721c)
【キカガク流】人工知能・機械学習 脱ブラックボックス講座 - 初級　を学んで

###記事を書いたきっかけ
機械学習関係の勉強をしてきたが、後に残る形にしてこなかったので、
自身の理解を深める意味も込めて、記事を書いてみました。

###備考
１から１０まで要約するというより、気になったところだけまとめる。

---


##概念の紹介
・AI　⊃　機械学習　⊃　ディープラーニング の関係。
・AIを人間に例えると、わかりやすい。

|AI|機械学習|ディープラーニング
|---|---|---|---|
|人間と同等の仕事（機能）|人間の目、耳、口など個別の機能|判断を下すための手順の一つ|
||情報は数値として扱われている前提|左記の数値を元に、入力と出力の関係性を見出す|


##機械学習に必要な数学
|#|微分・積分|線形代数|確率統計
|---|---|---|---|
|ベイズ|○（積分）||○|
|機械学習|○（微分）|○||

##強化学習
・これはデータがない、ほとんどないというものに対して行われる学習手法。
・イメージは掃除ロボット。動きながら地図を作り、移動床面積が大きくなるように掃除するといった使われ方をしている。

##内挿、外挿
・与えられたデータ内を内挿という。
・与えられたデータ外を外挿という。（要は未来の値を予測する）
・機械学習はデータ内は保証するが、外は保証しないというもの。そのため、うまく学習させるには、学習データを増やして内挿しておく必要がある。
・時系列(株価予測）の場合には、縦軸となる価格が内挿か外挿かの判断基準となる。
※イメージとしては、
20代（最小）と30代（最大）のアンケートを収集: 40台の予測は外挿になる
20代（最小）と60代（最大）のアンケートを収集: 30台の予測は内挿になる

#微分
・微分で、接線の傾きが求まる。
・微分により求まる傾きが０であることを利用することで、ある関数の最小（最大）となる点が求まる。
　※単回帰でいうと、この関数は誤差を指す。
・微分で覚えておくべき点。
　・微分は導関数ともいう。
　・傾きの求め方は、yの増加分をxの増加分で割る。

```math
\frac{f(x_2)-f(x_1)}{x_2-x_1}
```
・上記と同じ意味の数式は以下の通り。

```math
\lim_{n \to 0}f(n)
```
・新たな記号の読み方はリミットで、n→0はnに０を代入すると考えてOK。

・偏微分とは多変数の微分を指しており、以下のように表記される。

```math
\frac{∂}{∂x}
```

・∂＝ラウンド（ディー）と呼ばれる。
・limと同じ意味だが、x以外を定数と仮定して微分するという意味になる。

・例題

```math
\frac{∂}{∂a}{3a^2} = 6a
```

-また微分は分けて考えることが出来るのが、特徴。

```math
\frac{∂}{∂x}({4{x_1}+3{x_2})} = \frac{∂}{∂x}{4{x_1}+\frac{∂}{∂x}3{x_2}}
```

##予測について
・予測とは、適切にパラメータを求めること。
・適切とは、評価関数、損失関数を最小化することを指す。
・単回帰における評価関数は、２乗誤差や絶対値誤差があるが、以下のことを念頭に。
　・ただ、絶対値誤差は関数が逆三角形の形になり、なめらかでない→微分ができない。
　・放射線を描く（なめらかな線が掛ける）２乗誤差を使う　→　微分ができる。

##予測におけるテクニック
・データの中心化（centering）を行うことがある。
・中心化をすると、真ん中を通ることができる。
・つまり数式で言えば、Y=ax+bがY=axとなるため、求めるべきパラメータが一つ減る。
・求め方は平均値を引くだけ

```math
{X_c} = x - \bar{x}
`
Gitの初歩的な使い方

●Gitの準備
$ git init
「init」は「initialize」の略で「初期化」という意味

●共有するファイルを選択する
$ git add ファイル名

●選択したファイルを記録する
$ git commit -m “コミットメッセージ”
このように記録することをコミットという

●リモートを登録する
$ git remote add リモート名 リモートのURL
Gitでは「リモート」という共有ファイルの置き場を使う
リモートにファイルをアップロードしたり、リモートからファイルをダウンロードすることで、開発者同士がファイルを共有できる

●リモートにファイルをアップロードする
$ git push リモート名 master
このアップロードをプッシュという

●リモートのファイルをダウンロードする
$ git pull リモート名 master
このダウンロードのことをプルという

●変更したファイルを把握する、addしたファイルを確認する
$ git status

●変更した内容を把握する
$ git diff

●自分や他人のコミットを確認する
$ git log

●自分や他人の変更内容を確認する
$ git log -p
Pythonで計算のおけいこ♪

# Pythonで計算のおけいこ♪

## はじめに
頑張りました！1時間で書いたので褒めてください！
前回、前々回同様、今回もなんでもいいからPythonで何か作りたいと言う衝動で書きました。
プログラミングを始めて3つ目なので大目に見てください。
今日は極めて計算が苦手な自分用に、ひたすら四則演算を出してくる簡単なコードです。

## 開発環境
Python

## 仕様
四則演算をランダムで出題します。間違えるまでひたすら出してきます。
間違えた時点で終了、と同時に正当数を表示します。

## 使い方
半角数字で回答する

```python
import random

def Addition():
    left = random.randint(1,1000)
    right = random.randint(1,100)
    correct_answer = left + right
    answer = int(input(str(left) + "+" + str(right) + "="))
    if answer == correct_answer:
        return True
    else:
        return False

def Subtraction():
    while True:
        left = random.randint(1,1000)
        right = random.randint(1,100)
        if left >= right:
            break;
    correct_answer = left - right
    answer = int(input(str(left) + "-" + str(right) + "="))
    if answer == correct_answer:
        return True
    else:
        return False

def Multiplication():
    left = random.randint(1,100)
    right = random.randint(1,10)
    correct_answer = left * right
    answer = int(input(str(left) + "×" + str(right) + "="))
    if answer == correct_answer:
        return True
    else:
        return False

def Division():
    left = random.randint(1,100)
    right = random.randint(1,10)
    back_answer = left * right
    answer = int(float(input(str(back_answer) + "÷" + str(right) + "=")))
    correct_answer = back_answer / right
    if answer == correct_answer:
        return True
    else:
        return False

score = 0
four_calculus = [Addition, Subtraction, Multiplication, Division]

while True:
    if four_calculus[random.randint(0,3)]():
        score += 1
        print("NEXT")
    else:
        print("FINISH")
        print("YOUR SCORE IS " + str(score))
        break;
```

## 終わりに
今回はスピード重視で作成しました。いつもはポテチをそばに置いていましたが今日は、寝る前にチャチャっと
書きました！やればできると言うことがわかりました。ただ、レベルを設定できるようにするのと、時間制限を儲けようと
思っていたのを妥協してしまったのはマイナス点ですね。
前回も言っていたような気がしますが、次回はネットを介したスクリプトを書きたいとおもっています！
順調に学べているようで、楽しいです！（聞いていない）
最近はコードの見やすさや簡略化を心がけようと思っているので、こここうしろよ！とかこれはこう書くのがセオリーだろ！
みたいなのがあったらぜひ教えてださい！！！！泣いて喜びます！！
以上、Pythonで計算おけいこ♪でした！
存在するフィールドだけが入ったオブジェクトを作る

あるオブジェクトがあるとします。
必須項目は必ずフィールドを作成し、そしてオプション項目は入ってきた時にだけフィールドが作られるようなオブジェクトを作りたいとしましょう。

## 普通に書く

```js
function getObject({require1, require2, optional1, optional2, optional3 }){

    const ret = {value1:require1, value2:require2 };
    if(optional1){
        ret.optionalValue1 = optional1;
    }
    if(optional2){
        ret.optionalValue2 = optional2;
    }
    if(optional3){
        ret.optionalValue3 = optional3;
    }
    return ret;
}

getObject({require1:1, require2:2, optional1:11 }); // {value1: 1, value2: 2, optionalValue1: 11}
getObject({require1:1, require2:2, optional2:22, optional3:33 }); // {value1: 1, value2: 2, optionalValue2: 22, optionalValue3: 33}
getObject({require1:1, optional1:11 }); // {value1: 1, value2: undefined, optionalValue1: 11}
```

requireフィールドは渡さないとundefinedができますが、optionalフィールドを渡さない場合はフィールドそのものが作られません。

しかし、ただ値を取り出したいだけなのに中にif文を延々並べないといけないので面倒ですね。
もっと簡単な書き方はないでしょうか。

## スプレッド演算子で書く

スプレッド演算子を使うとこう書けます。

```js
function getObject({require1, require2, optional1, optional2, optional3 }){
	return {
		value1:require1,
		value2:require2,
		...(optional1 && { optionalValue1:optional1 }),
		...(optional2 && { optionalValue2:optional2 }),
		...(optional3 && { optionalValue3:optional3 })
	}
}
```

ロジックがなくなってすっきりしましたね。
めでたしめでたし。

え？どんな需要があるのかって？
よくわからないけど自力で[JSON Feed](https://jsonfeed.org/)を作ったりするときに使えるかもしれません。


ちなみにアイデアの元ネタは[How to conditionally build an object in ES6](https://www.sanity.io/blog/how-to-conditionally-build-an-object-in-es6)という記事なのですが、そこで紹介されてる[ふたつの](https://gist.github.com/kmelve/48753be78333d5230f8ea3c1ccae899e#file-conditional-object-snippet1-js)[episodeParser関数](https://gist.github.com/kmelve/ac89b85cb578ee68f4d3ddb8238be8a1#file-conditional-object-snippet2-js)ってなにげに動作が同じじゃないんですよね。
[1000以上も拍手されてる](https://medium.freecodecamp.org/how-to-conditionally-build-an-object-in-javascript-with-es6-e2c49022c448)のに誰も突っ込んでないのだが大丈夫か。
Ajaxと非同期処理

##Ajaxとは
javascriptから非同期でサーバーへ通信を行い、データを取得できる技術。それを使って動的にウェブページの内容を書き換えることができる。Ajaxを使ったサイトとしてグーグルマップが有名。
例えば、ページの一部分しか変わらない処理なのに通常の通信の仕組み、リクエスト→サーバー側で処理→レスポンスでページ全体を読み込んでは効率が悪く処理に時間がかかる。こういうときに使える。

>[ウェブカツ！！](https://webukatu.com/?afid=p5lxu1kvh03rayd2ctjsw4e9bgzq8nom)
CloudFormationを使ってVPC S3エンドポイントを構築する

#はじめに
本記事では、AWS CloudFormation管理コンソールを使って、VPC S3エンドポイントを構築する手順を説明しています。（初心者向け）

本記事で掲載しているテンプレートの最新版は、下記に置いてます。
https://github.com/okubo-t/aws-cloudformation
#構成図
<img src="https://qiita-image-store.s3.amazonaws.com/0/283246/3cd7fe53-fdba-aebe-6034-e6fed1c29fc3.jpeg" width=50%>

#前提条件
下記の記事の構築手順で、VPCを構築していること。
[CloudFormationを使ってVPCを構築する](https://qiita.com/okubot55/items/b18a5dd5166f1ec2696c)

PJPrefixの値は、同一にすること。
#構築手順
１ AWS CloudFormation管理コンソールから、スタックの作成をクリックします。
<img src="https://qiita-image-store.s3.amazonaws.com/0/283246/e0c3e7c3-f478-18c7-2dc2-7e669d1b399d.png"　 width=50%>

２ 後述のテンプレートを選択します。
<img src="https://qiita-image-store.s3.amazonaws.com/0/283246/060a4709-622a-2394-de5f-ac2103045137.png"　 width=50%>

３ 各パラメータを入力します。
<img src="https://qiita-image-store.s3.amazonaws.com/0/283246/12476c52-dcb3-1810-65c2-dab1b78acb49.jpeg"　 width=70%>

|パラメータ名|用途|備考|
|:---|:---|:---|
|スタックの名前|テンプレートから作成するリソース一式の名前|例　prd-stack-nat-20180801|
|PJPrefix|構築するプロジェクトの環境を識別するために各コンポーネントの先頭に付与する識別子|例 qiita-prd|

4 後続は、デフォルトのまま次へ次へで、作成します。
状況が CREATE COMPLETEになれば、VPC S3エンドポイントの構築が完了です。
<img src="https://qiita-image-store.s3.amazonaws.com/0/283246/f919b748-e62b-9f47-0eed-a3ab499405f0.png"　 width=60%>

#テンプレート
```vpc-s3endpoint.yml
AWSTemplateFormatVersion: "2010-09-09"
Description: 
  VPCS3Endpoint Create

Metadata: 
  "AWS::CloudFormation::Interface": 
    ParameterGroups: 
      - Label: 
          default: "Project Name Prefix"
        Parameters: 
          - PJPrefix

# ------------------------------------------------------------#
# Input Parameters
# ------------------------------------------------------------# 
Parameters:
  PJPrefix:
    Type: String

Resources:
# ------------------------------------------------------------#
#  VPCS3Endpoint
# ------------------------------------------------------------#
  VPCS3Endpoint:
    Type: "AWS::EC2::VPCEndpoint"
    Properties:
      RouteTableIds: 
        - { "Fn::ImportValue": !Sub "${PJPrefix}-private-route-a" }
        - { "Fn::ImportValue": !Sub "${PJPrefix}-private-route-c" }
      ServiceName: !Sub "com.amazonaws.${AWS::Region}.s3"
      VpcId: { "Fn::ImportValue": !Sub "${PJPrefix}-vpc" }

# ------------------------------------------------------------#
# Output Parameters
# ------------------------------------------------------------# 
Outputs:
  VPCS3Endpoint:
    Value: !Ref VPCS3Endpoint
    Export:
      Name: !Sub "${PJPrefix}-vpcs3endpoint-id"
```
react-native linkとは何なのか？ react-native３分講座 

![alt](https://user-images.githubusercontent.com/26253721/39765058-e8d0eae4-531b-11e8-9305-4c852f269517.png)

何々react-nativeのデザインはnative baseというライブラリを使ってみるといいの？
それじゃあ
yarn add native-base
react-native link native-base
だ！

ちょっと待ったそこのあなた。今軽々しくreact-native linkを使いましたね。
react-native linkは、jsだけは実現できないos毎に分けて記述された、objective-cやjavaのコードを自動で設定してくれる便利コマンドですが、理解していないと落とし穴にはまりますよ。

今回は
「react-native linkは何をしているのか？」
をreact-native linkを「手動」で行いながら学んでいきます。

それでは手動でreact-native linkを行ってみましょう。
## Step 1
もし、ライブラリがnativeコードを含んでいる場合、フォルダの中に必ず、.xcodeprojというファイルがあります。
ファインダーで、node_modules以下の該当ライブラリのフォルダを開き、xcodeのLibrariesフォルダに、ドラッグ＆ドロップしましょう。
<img width="1280" alt="image1.png" src="https://qiita-image-store.s3.amazonaws.com/0/183835/de9f7527-bc7a-67ae-7cf0-6f1722255b4f.png">


## Step 2
次にxcodeのmainプロジェクトをクリックします。次に、xcodeの真ん中にあるタブからBuild Phasesをクリック。
「Link Binary With Libraries」の中にドラッグ＆ドロップします。
<img width="1280" alt="image2.png" src="https://qiita-image-store.s3.amazonaws.com/0/183835/72dd95a5-6e24-960f-798e-f9b5cc5beba5.png">


完了です。
## Step 3
一部のライブラリは以下の操作が必要です。
ライブラリはnative側で呼ばれますか？？それともjs側で呼ばれますか?
もし、js側で呼び出されるなら、このStepは読む必要はありません。

nativeから呼ばれない場合、ライブラリのheaderを知る必要があります。
headerを知るには、xcodeのmainプロジェクトをクリックし、、Build Settingsタブをクリックします。次にSearch Pathをクリックします。
するとHeader Search Pathが出てくるのでそのライブラリへのパスを含めましょう。
<img width="1353" alt="image3.png" src="https://qiita-image-store.s3.amazonaws.com/0/183835/8986606f-579a-8326-eefd-b4b41a2397d6.png">


以上！
簡単でしたね。
以上の３ステップがreact-native linkコマンドが行っていることです。

## おまけ
react-native linkされたライブラリが吐くエラーは「native」のエラーです。よってiosシミュレーターに詳細なエラー表示はされません
xcodeを開き、xcodeのログを確認しましょう。驚くほどわかりやすいエラーが書いてあります。

なのでreact-native linkしたのにうまくいかない。そんな時はxcodeからrunしてログを見ましょう。xcode左上の!のついた▲を押すとログを見れます。ログから赤文字を探してググりましょう。

ios シュミレーターのdebug > open systemlogではなく、xcodeのビルド時のログを見るため、xcodeを見た方が、より詳しくログが見れます。
初めてのテストコード

研修ということでRubyでの課題を進めていました。
基本的にはpythonでなら知ってる関数と同じことができるメソッドを探して進めていたんですが...

- test/unitを使ってテストコードを書く

じゃんけんの勝ち負けを判定するクラス、メソッドを書いて、それをテストするコードを書く課題。
テストコードはpythonでも書いたことがなく、クラスも自分で書くのは数回しかやってないから何から始めりゃいいのか。
とりあえずググって見様見真似で書いてみた。

```ruby:janken_class.rb
class Janken
  def hantei(p_hand,c_hand)
    if p_hand == c_hand
      return "あいこ"
    elsif (p_hand == "グー" && c_hand == "チョキ")\
      ||(p_hand == "チョキ" && c_hand == "パー")\
      ||(p_hand == "パー" && c_hand == "グー")
      return  "勝ち"
    else
      return  "負け"
    end
  end
end
```

このクラスを使って標準入力からg,c,p(グー、チョキ、パー)を入力してコンピュータ側でのランダムな手との対戦結果を表示するコード。

```ruby:janken.rb
require './janken_class'

player = gets.chomp
cpu = Random.rand(0...3)

gcp = {"g"=>"グー","c"=>"チョキ","p"=>"パー"}
hands = gcp.values

p_hand = gcp[player]
c_hand = hands[cpu]

janken = Janken.new
result = janken.hantei(p_hand,c_hand)

puts "あなたは#{p_hand}、私は#{c_hand}、#{result}です。"
```
そして問題のテストコード。

```rb:janken_test.rb
require 'test/unit'
require './janken_class'

class TC_janken < Test::Unit::TestCase
  def setup
    @obj = Janken.new
  end

  def test_draw_g
    check = @obj.hantei("グー","グー")
    assert_equal("あいこ",check)
  end
  def test_draw_c
    check = @obj.hantei("チョキ","チョキ")
    assert_equal("あいこ",check)
  end
  def test_draw_p
    check = @obj.hantei("パー","パー")
    assert_equal("あいこ",check)
  end
  def test_win_g
    check = @obj.hantei("グー","チョキ")
    assert_equal("勝ち",check)
  end
  def test_win_c
    check = @obj.hantei("チョキ","パー")
    assert_equal("勝ち",check)
  end
  def test_win_p
    check = @obj.hantei("パー","グー")
    assert_equal("勝ち",check)
  end
  def test_lose_g
    check = @obj.hantei("グー","パー")
    assert_equal("負け",check)
  end
  def test_lose_c
    check = @obj.hantei("チョキ","グー")
    assert_equal("負け",check)
  end
  def test_lose_p
    check = @obj.hantei("パー","チョキ")
    assert_equal("負け",check)
  end
end
```

1つずつメソッドを作らなくても１つのメソッド内で複数の場合をテストした方がよいとのご指摘により修正。

```rb:janken_test_modify.rb
require 'test/unit'
require './janken_class'

class TC_janken < Test::Unit::TestCase
  def setup
    @obj = Janken.new
  end
  def test_janken
  check = @obj.hantei("グー","グー")
  assert_equal("あいこ",check)
  check = @obj.hantei("チョキ","チョキ")
  assert_equal("あいこ",check)
  check = @obj.hantei("パー","パー")
  assert_equal("あいこ",check)
  check = @obj.hantei("グー","パー")
  assert_equal("負け",check)
  check = @obj.hantei("パー","チョキ")
  assert_equal("負け",check)
  check = @obj.hantei("チョキ","グー")
  assert_equal("負け",check)
  check = @obj.hantei("グー","チョキ")
  assert_equal("勝ち",check)
  check = @obj.hantei("チョキ","パー")
  assert_equal("勝ち",check)
  check = @obj.hantei("パー","グー")
  assert_equal("勝ち",check)
  end
end
```

test\unitについてはもっと公式リファレンス読み込んで理解しておきたい。


- Vimがやっぱり使いづらい

色々とコード書いてて、やっぱり使いづらい。特に普通のIDEみたいに手軽にコピペができないのがしんどい。クリップボードが使えない設定になってたからvim_gnomeインストールして設定もいじってみたけどうまくいかない。WSLだからかな...

- Ubuntu上からWindowsのファイルを操作

これには色々な方法があるみたいだけど、僕はUbuntuのホームディレクトリにwindowsのフォルダのシンボリックリンクを作ることにしました。

```
ln -s /mnt/c/Users/name ~/name
```
これ使えばもしかしたらwindows側のIDEからスクリプト書いてUbuntuで実行できるかも?
centos7 nodejs　インストール

nodeパージョン管理ツールからインストール

ツールはいろいろあるが今回はnodenvにする
nodenvにするにはnode-buildも必要なので合わせてインストール

対象物ダウンロード
git clone https://github.com/nodenv/nodenv.git ~/.nodenv
git clone https://github.com/nodenv/node-build.git ~/.nodenv/plugins/node-build

パスを通す
echo 'export PATH="$HOME/.nodenv/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(nodenv init -)"' >> ~/.bash_profile
source ~/.bash_profile

この時点完了、インストールされているか確認
nodenv -v

この記事を書いた時点V10が最新、v10にする
nodenv install 10.10.0
nodenv global 10.10.0

インストールされているか確認
node -v
C++のポインタの中身を知りたい

# 実行環境

```
wandbox
gcc 7.3.0
g++ prog.cc -Wall -Wextra -std=c++11 
https://wandbox.org/permlink/yj0ruS6pPwGgwAFY
```


# 知りたいもの

継承関係を持ついくつかの構造体が定義されているとする．

```cpp
struct A{
    int x;
    A(int _x):x(_x){ }
    virtual ~A(){ }
};

struct B1: public A{
    int y;
    B1(int _x, int _y):A(_x), y(_y){ }
    ~B1(){ }
};

struct B2: public A{
    int y;
    B2(int _x, int _y):A(_x), y(_y){ }
    ~B2(){ }
};
```

`~A()` に `virtual` が付いているから，プログラマはきっと
子クラスを親クラスのポインタに入れて利用するはず．

```cpp
    unique_ptr<A> p(new B1(1, 2));
```

`p` の中に `A` が入っているのか， `B1` が入っているのか，`B2` が入っているのか知りたい．

# 解決策

## typeid

https://cpprefjp.github.io/reference/typeinfo/type_info.html

typeid情報を使うと，実行時型情報を取り出すことが出来る．
`*p`の型情報と`B1`の型情報を取り出して比較すれば，先程の知りたい情報が得られる．

```cpp
    unique_ptr<A> p(new B1(1, 2));
    if (typeid(*p) == typeid(A))
        cout << "A" << endl;
    if (typeid(*p) == typeid(B1))
        cout << "B1" << endl;
    if (typeid(*p) == typeid(B2))
        cout << "B2" << endl;
```

実行すると `B1` と表示されるはず．

## 関数化

毎回 `typeid(*p) == typeid(B1)`と書くのも妙な気がしたので，テンプレートを使った関数にまとめた．

```cpp
template<typename T, typename U>
inline bool typeis1(const U& a1) {
    return typeid(a1) == typeid(T);
}
```

使い方は次のようになる．

```cpp
    unique_ptr<A> p(new B1(1, 2));
    if (typeis1<B1>(*p))
        cout << "B1" << endl;
    if (typeis1<B2>(*p))
        cout << "B2" << endl;
```

## ケアレスミスの回避

特に自分はうっかりミスをしてしまいがちなので，次のようなコードを書いてしまう．

コンパイルエラーも起きないし，ただ`false`が返るだけなので，ランタイムエラーにもならない．

```cpp
    unique_ptr<A> p(new B1(1, 2));

    // ポインタを渡している
    if (typeis1<B1>(p))
        cout << "typeis1<B1>(p)" << endl;
    
    unique_ptr<string> px(new string());
    
    // 無関係な型の値を渡している
    if (typeis1<B1>(*px))
        cout << "typeis1<B1>(*px)" << endl;
```

継承関係が成立していないならば，コンパイルエラーを吐き出すようにしたい．
これはメタ関数を使って実装できる．

```cpp
template<typename Derived, typename Base,
    typename enable_if<is_base_of<Base, Derived>::value>::type* = nullptr>
inline bool typeis2(Base& a1) {
    return typeid(a1) == typeid(Derived);
}
```

使い方は次のようになる．

```cpp
    unique_ptr<A> p(new B1(1, 2));
    unique_ptr<string> px(new string());

    if (typeis2<B1>(*p))
        cout << "typeis2<B1>(*p)" << endl;
    // コメントアウトを外すとコンパイルエラー
    // if (typeis2<B1>(p))
    //     cout << "typeis2<B1>(p)" << endl;
    // if (typeis2<B1>(*px))
    //     cout << "typeis2<B1>(*px)" << endl;
```

## おまけ

RTTI(実行時型情報)が利用できない場合(コンパイルフラグに`-fno-rtti`があるなど)、
typeidがソースコードに含まれるとコンパイルエラーになります。
phpenvインストール手順

## はじめに
複数のPHPのバージョン管理ができるphpenvを
mac環境に構築したので、その手順をまとめます。

## 環境
- MacOS X Yosemite 10.10.5 (古くてすいません... )

##1.homebrewをインストール
下記コマンドでhomebrewをインストール

```
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)
```
※homebrewについては、別途まとめます。

##2.phpenvをインストール
homebrewを使用してphpenvをインストール

```
$ brew install phpenv
```
が、うまくいかない... 
なので、直接githubからインストール

```
$ git clone https://github.com/CHH/phpenv.git
$ phpenv/bin/phpenv-install.sh
```
## 3.phpenvのパスを通す
.bash_profileに追加する。

```
$ vi ~/.bash_profile
```
２行追加

```
export PATH="$HOME/.phpenv/bin:$PATH"
eval "$(phpenv init -)
```
反映

```
$ source .bash_profile
```

インストール確認

```
$ phpenv --version
```

## 4.PHP-buildインストールする

```
git clone git://github.com/CHH/php-build.git $HOME/.phpenv/plugins/php-build
```

## 5.インストールできるPHPのバージョンを確認

```
phpenv install --list
```
今回は`5.6.38`と`7.2.10`の２つをインストールします。

## 6.ライブラリをインストール

各種必要なライブラリをインストール

```
$ brew install re2c
$ brew install openssl
$ brew install bison
$ brew install libxml2
$ brew install autoconf
$ brew install automake
$ brew install icu4c
$ brew install libjpeg
$ brew install libpng
$ brew install libmcrypt
```

## 7.PHP 5.6.38 をインストール

```
$ phpenv install 5.6.38
```

## 8.PHP 7.2.10 をインストール
そのままバージョンを指定してもインストールできませんでした。
openssl絡みの問題の模様...

```
$ PHP_BUILD_CONFIGURE_OPTS="--with-openssl=$(brew --prefix openssl)" phpenv install 7.1.8
```

## 9.PHPを指定
使用したいPHPのバージョンを指定して使用する

```
$ phpenv versions
$ phpenv global 5.6.38 # システム全体のPHPのバージョン変更
$ phpenv rehash

以下のコマンドで5.6.38が表示されることを確認
$ PHP --version
```


## 参考URL
https://qiita.com/fgnhssb/items/2263c79284c612c7d6ed
https://qiita.com/hokutoasari/items/2bb67525f6fb4ea82271
https://qiita.com/hokutoasari/items/2bb67525f6fb4ea82271
Ubuntu 18.04にsnapを利用してVisual Studio Codeをインストールする

# はじめに

本記事ではUbuntu 18.04にsnapを利用して、Visual Studio Codeをインストールする方法を示します。

Visual Studio Codeは、Windows, macOS, Linuxのクロスプラットフォームで動作するエディタです。様々なプログラミング言語に対応しています。また、エクステンションという仕組みでいろいろな機能を追加することができます。

snapとは、アーカイブフォーマットです。snapdというツールをサポートするLinuxディストリビューションで動作可能です。snapの中でライブラリが完結するため、システムに依存せずにインストールや更新が可能です。

近年、アプリケーションの巨大化が進んでいます。chromeはローリングリリースモデルで開発されており、ソースコードは400万行以上らしいです。その影響か、Ubuntu 18.10以降でChromiumはdebを廃止し、snapのみ提供するようです。snap内で依存関係が解決するとシステムとの連携をあまり考えなくていいのが一番の理由でしょう。

同じくローリングリリースモデルで開発されているVisual Studio Codeは月に1回メジャーバージョンがリリースされ、その1ヶ月の内にマイナーバージョンがリリースされています。そのためか、Visual Studio Codeもsnapが提供されています。今回はこれを利用します。

- Visual Studio Code is now available as a snap on Ubuntu
    - https://blog.ubuntu.com/2017/05/19/visual-studio-code-is-now-available-as-a-snap-on-ubuntu

# インストール

Ubuntu 18.04にコマンドラインでインストールする方法を示します。

napcraft.ioのVisual Studio Codeページの「Install」というボタンを押下すると、下記のコマンドが表示されます。それをシェルに入力します。

```
sudo snap install vscode --classic
```

- Visual Studio Code by Snapcrafters
    - https://snapcraft.io/vscode

下記のコマンドを実行し、「vscode」という行があればインストール完了です。

```
$ snap list
```

# 起動

アプリケーションの一覧から、また「code」と検索するとVisual Studio Codeのアイコンが表示されるので、それをクリックすると起動することができます。

# アップデート

snapは基本的に毎日自動アップデートされます。もし手動でアップデートしたい場合は下記のコマンドを実行してください。

```
$ sudo snap refresh vscode
```

# 注意 

※2018/9/19時点での情報です

snap経由でインストールしたVisual Studio Codeでは日本語入力ができないという問題があると、Twitter経由で連絡がありました。現時点でもこの問題が発生することを確認しています。
https://teratail.com/questions/121986

既にgithubにはissueが起票されていますが、まだ解決していないようです。
https://github.com/Microsoft/vscode/issues/51308

# 最後に

本記事ではUbuntu 18.04にsnapを利用してVisual Studio Codeをインストールする方法を示しました。snapを利用することで、システムの影響を受けることなく、最新のVisual Studio Codeを利用することができます。日本語入力ができない問題については続報を把握し次第お伝えする予定です。

# 参考情報

- Visual Studio Code
    - https://code.visualstudio.com/
- Snaps and snapcraft documentation
    - https://docs.snapcraft.io/
- snapcore/snapd
    - https://github.com/snapcore/snapd
- 25. Chromeのローディングの最適化、脆弱性報奨システム、ブラウザとマイクロカーネル
    - https://turingcomplete.fm/25
- 2018年5月21日　Ubuntu，ChromiumのサポートをSnapオンリーに変更へ
    - http://gihyo.jp/admin/clip/01/linux_dt/201805/21
node.jsのhttp通信用のライブラリ、requestでutf8以外のデータを取得したい。

# requestって？
名前の通り、HTTPやHTTPS通信を行うためのnpm公開されているライブラリです。
[これ](https://github.com/request/request)ですね！

node.jsの生の関数を使用してHTTP/HTTPS通信を実行しようとすると、実装がちょっと複雑になってしまうので重宝しています:relaxed:

そんな便利なライブラリなんですが、sjisのデータをダウンロードしようとするとちょっと困ったちゃんになってしまうので……
その備忘録的に対応策でも。

# node.jsでもutf8以外のデータをダウンロードしたい！

```raw_download.js
const request = require("request");
const jschardet = require('jschardet');;

const requestOption = {
  url: 'http://www.nisshin-oillio.com/',
};

request(requestOption, (error, response, body) => {
  console.log(body);
  console.log(jschardet.detect(body));
});
```

という訳でsjisのページをダウンロードしてみます。
URLは……偶然見つけたsjisのページであって、特に意図はありません。:scream:

```terminal
$ node index.js
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<HTML lang="ja">
<HEAD>
<TITLE>�A���̃`�J���@�����I�C���I</TITLE>

...

{ encoding: 'windows-1252', confidence: 0.95 }
```

jschardetを使用してエンコーディングを判定しています。
detectでデータのエンコードを見てみたんですが……encodingがwindows-1252に。
というかタイトルも化けてしまっています。

# どうしてこうなった？

結論から言うと、公式に書いてあります！

> encoding - encoding to be used on setEncoding of response data. If null, the body is returned as a Buffer. Anything else (including the default value of undefined) will be passed as the > encoding parameter to toString() (meaning this is effectively utf8 by default). (Note: if you expect binary data, you should set encoding: null.)

問答無用でresponseデータをutf8として変換してしまうんですね。
そこの変換処理の問題でTITLEの部分がバケてしまっていたり、encodingの判定結果がおかしいことになってしまっています。

# 対応策！

iconvでsjisのデータをutf8に変換するところまで入れています。

```request.js
const request = require("request");
const jschardet = require('jschardet');
const { Iconv } = require('iconv');

const requestOption = {
  url: 'http://www.nisshin-oillio.com/',
  encoding: null,
};

request(requestOption, (error, response, body) => {
  const utf8body = (new Iconv('SHIFT_JIS', 'UTF-8')).convert(body).toString();

  console.log(utf8body);
  console.log(jschardet.detect(utf8body));

  console.log(body);
  console.log(jschardet.detect(body));
});
```

```terminal
$ node index.js
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<HTML lang="ja">
<HEAD>
<TITLE>植物のチカラ　日清オイリオ</TITLE>

...

{ encoding: 'windows-1252', confidence: 0.95 }
<Buffer 3c 21 44 4f 43 54 59 50 45 20 48 54 4d 4c 20 50 55 42 4c 49 43 20 22 2d 2f 2f 57 33 43 2f 2f 44 54 44 20 48 54 4d 4c 20 34 2e 30 31 20 54 72 61 6e 73 ... >
{ encoding: 'SHIFT_JIS', confidence: 1 }
```

ちゃんとTITLEが表示されるようになりました！
そしてencoding未指定のため、bodyにはBufferが入ってきています。ので、後はエンコーディング的な処理でこねくり回してあげればOKです！
ゼロから始める音ゲーノーツツール作成　その3/3（設計　そこまで厳密でやってない）

#こんな人におすすめ
・人の設計を見てみたい、考え方を見てみたい
・音ゲーのノーツツール作成を考えている
・ツール作成に興味ある


#開発環境
Unity2017.4.8.1f
VisualStudio2017Community



#お品書き
・目指した設計と目標
・今回での利点と欠点

#今回の仕様
・ノーツが配置できる
・3種類のノーツがある。
・線上の上にノーツが配置される必要がある。
・吐き出す際は、どのノーツのタイプに関わらず、一つ一つのノーツに分割する必要がある。


#目指した設計と目標
設計思想としてClean Architectureを自分なりで理解と制作。
を行っていたのですが、最終的にできたのは、おそらく役割の分担が明確にできたクラス設計になるかと思います。


結果からいうと、以下の通り
よかった点
それぞれのクラスの役割が明確になったため、特定の機能を追加する際にどのクラスに追加が正しいかが明確になり
追加の動作をどこに実装しようかと考えた際に、どこに追加するのかが明確になった
クラスの役割が、明確になる利便性を理解した（気がする）
何か機能を追加する際に、Data側から作れば、表示部分はそこまで気にしなくてもいい（考えるときは表示部分から考える）

悪かった点
何かの変更内容に汎用的にはならなかった。
全てが追加追加のため、不要なソースも増えた。
当たり前かもしれないがDataクラスに変更が変わった際に、ほぼ全てが変更してしまう作りになっていた。

参考サイト
https://qiita.com/koutalou/items/07a4f9cf51a2d13e4cdc

#設計部分

View部分を状態によって切り替えを行い、Viewには、表示だけを行った。
しかし、当初、データの取得部分とデータの編集部分を、<b>全てDataAccesserを使用していた</b>ため、非常にFatなDataAccesserになってしまっていた。
というのも、このDataAccesserには、ノーツの編集に必要な情報と、描画の際に必要な加工部分が全て集約していたためです。

例えば、以下のような情報

``` data_accesser_propaty_sample.cs
//BPMと次のBPMの間の大きさ　ノーツの位置を決めるのに必要なプロパティ
public float BPM_Width
{
  get
  {
    return スクロールの長さ　/ BPMが何回表示されるか？
  } 
}

```
が<font color="#777777">10個</font>くらいあって気づいたら、<b>プロパティだけで、200行を超えていた。</b>

そこで、Dataを、ノーツと関係ないデータ、ノーツ関係のデータと、ノーツに対して編集を行うクラスでDataAccesserの役割を分割した。
そのData部分にも、Dataと編集して得るデータをとるためのクラスを間にかます事で分割を図った結果が以下の図。

View部分のざっくりクラス図
![NortsEditorクラス図View.jpg](https://qiita-image-store.s3.amazonaws.com/0/101366/88b77c57-878c-f9ba-80b8-d79cf2e3a3e6.jpeg)

Viewに関しては、StateSwitchクラスから、それぞれのViewクラスに対して呼び出しと、切り替え時にDataAccesserクラスを引数として渡します。
このクラス自身にDataAccesserをここで持つことで、読み込んでー＞編集の場合でも、新規ー＞編集の場合でも、どちらも同じ部分を参照として、そこから、データの格納部分と、編集部分をそれぞれ用意するだけで良いため、共通部分で持っています。


---


データ格納のざっくりクラス図
![NortsEditorクラス図データ格納.jpg](https://qiita-image-store.s3.amazonaws.com/0/101366/8673e1d7-674d-0422-4058-a60cf9ac9c68.jpeg)

Dataの格納に関しては、DataAccesserを通じて、基本的には行いますが、設定数値（スクロールの大きさ、BPMなど）を取得できるSafetyクラス、実際のノーツを管理するCollectiveクラスがあります。
Collective自身は、ノーツを複数管理しています。
理由としては、長押しタイプのノーツなどの複数のノーツによって構成されるタイプのものに合わせたため。

その先のOneEditorNorts部分では、主に、エディターの表示だけの情報を保持しており、OneNortsの参照を保持しています。
ノーツの純粋なデータとしては、このOneNorts部分のみが保持するつくりになっていいます。




##役割を分割している設計をしていった感じの所感。

分割するのは、役割をすごく明確にできていて変更箇所がすごく明確。便利。
一方何かのデータをとってくるのに、これの荒れ野これのってなって長くなりがち。

なので、2階層までに使う先のデータを取得できるくらいがたぶん限界、できれば、1階層くらいで使用できるものがあればいい感じになったのではないかと感じた。
Entity Framework　DB切断時にクエリが失敗した際にキャッチするExceptionの種類



業務で詰まったので忘備録で残させていただきます。

開発中のアプリケーションではEntity Frameworkを採用しています。

クエリでの問い合わせ(データの検索)時、およびデータの更新時の最中に
DB切断が起こってしまったとき、
エラーの内容が「SQL Serverの接続失敗」であることを明示したい。

EntityExceptionが発生することは分かっているのに、なかなか例外がキャッチできない。

調べていくと、
EntityExceptionには下記２種類存在することが判明。

・**System.Data** 名前空間の [Entity Exception クラス](https://docs.microsoft.com/ja-jp/dotnet/api/system.data.entityexception?redirectedfrom=MSDN&view=netframework-4.7.2)
・**System.Data.Entity.Core** 名前空間の [Entity Exception クラス](https://msdn.microsoft.com/ja-jp/library/system.data.entity.core.entityexception(v=vs.113).aspx)


最初前者でキャッチしようとするも通り過ぎてしまい、後者で対応できるのだと見つけるまで時間を要しました。
ちなみに前者後者の特徴は今だつかめていません。調べてみて掴めたら追記します。

処理としては、上記エラーをキャッチし、
ダイアログ表示&ログ出力としました。

ログはStackTraceのみだと発生した場所やメソッド名は分かりますが内容が分かりにくいため、
InnerExceptionも出力するようにしました。

以上
ランタイム "Tomcat9 (Java10)" が無効です。指定された Tomcat のインストール・ディレクトリーは存在しません。と言われた時の解決方法

# 概要
読者：Java or/and Eclipse 初心者を対象にしています
私：Java and Eclipse初心者
内容(事件)：以前研修でEclipseをダウンロード、インストールして、2週間ほったらかして最近研修に取りかかろうとしたら、エラーが出た時の話

#どういうエラー

**ランタイム "Tomcat9 (Java10)" が無効です。指定された Tomcat のインストール・ディレクトリーは存在しません。** と言われる。
詳しくみていきましょう。

#環境


|       product | version       |       
|:-----------------:|:------------------:|
| PC            |        MacBook Air (13-inch, 2017)|          
| OS           |            High Sierra 10.13.6 |           
| Eclipse            |   Oxygen.3a Release (4.7.3a)    下記参照        |

**※Eclipseのダウンロード、インストール方法**
[Pleiades - Eclipse プラグイン日本語化プラグイン ](http://mergedoc.osdn.jp/)ページから4.7oxygen64biyのJava Full Editionをダウンロード、インストールした。
前回研修時は簡単にTomcatが使用できて感動した。

#本日の事件
Eclipse起動後にメニューバーより[ファイル] > [新規] > [動的Webプロジェクト]をクリック
プロジェクト名に何か入力すると **ランタイム "Tomcat9 (Java10)" が無効です。指定された Tomcat のインストール・ディレクトリーは存在しません。**と表示される。

![スクリーンショット 2018-09-18 21.26.09.png](https://qiita-image-store.s3.amazonaws.com/0/158076/93a9ba1a-b507-f8da-1cf4-0a579c19b0f9.png)

#解決方法
メニューバーより[ファイル] > [新規] > [動的Webプロジェクト]をクリックした。
注目したのはターゲット・ランタイム
プルダウンみたいなメニューではよくわからかった。 [新規ランタイム..]をクリック
![スクリーンショット 2018-09-18 22.00.10.png](https://qiita-image-store.s3.amazonaws.com/0/158076/74143d85-1661-fb52-464a-8acbcdc8dcad.png)

ランタイム環境のタイプを選択画面で"Apache Tomcat v9.0" を選択し、[次へ]をクリック
**Tomcatのインストール・ディレクトリー：**は
下記の画像のようにEclipseの配下のtomcat/9を選択
![スクリーンショット 2018-09-18 22.03.05.png](https://qiita-image-store.s3.amazonaws.com/0/158076/e094e104-3413-cd29-5853-5de219745c5b.png)

完了ボタンをクリックして、再度動的にWebプロジェクトの作成から始めて、ターゲット・ランタイムを
Apache Tomcat v9.0に変更してからプロジェクト名を入力したら、**エラーは出なかった**

#おそらくエラー解消
もし、問題が解決していなかったら( =関連する別の問題が発生したら)記事を修正します。
読者の方も問題が解決しなかったらご連絡ください。
GoのフレームワークRevelを使ってみる(インストール編)

## はじめに

Goで何かアプリを作ってみたかったのでRevelというフレームワークを使ってみました。

サーバーを立ち上げるところまでやってみます。

## 前提

- macOS Sierra
- Goがインストール済み

## 手順

### Revelのインストール

公式ドキュメント通りでできました。
https://revel.github.io/tutorial/gettingstarted.html

Revelのインストール

```
$ go get github.com/revel/revel
```

コマンドラインツールをインストール

```
$ go get github.com/revel/cmd/revel
```

revelコマンドが使えるか確認

```
$ revel help
```

もしパスが通っていなければ下記を参考にやってみてください。

GOPATHを確認

```
$ go env GOPATH
```

僕の環境ではここでした

```
/Users/m1ul24/go
```

パスを通します
※僕はZshを使っているので.zshrcに記載しています。
Bashをお使いの方は.bash_profileか.bashrcに記述します。

```~/.zshrc
# Go
export GOPATH=$HOME/go
export PATH="$PATH:$GOPATH/bin"
```

設定を反映

```
$ source ~/.zshrc
```

revelコマンドが使えるか確認

```
$ revel help
```

### アプリケーションの作成

```
$ cd $GOPATH
$ revel new myapp
```

ブラウザからアクセスしてみます
http://localhost:9000

![localhost_9000_(Laptop with HiDPI screen).png](https://qiita-image-store.s3.amazonaws.com/0/261245/6b858911-8c2f-11d8-30c2-53e0f0bafa94.png)

おー！なんかダサいけど表示された！

ディレクトリ構成はこんな感じでした。

```
$ tree src/myapp
src/myapp
├── README.md
├── app
│   ├── controllers
│   │   └── app.go
│   ├── init.go
│   ├── routes
│   │   └── routes.go
│   ├── tmp
│   │   └── main.go
│   └── views
│       ├── App
│       │   └── Index.html
│       ├── debug.html
│       ├── errors
│       │   ├── 404.html
│       │   └── 500.html
│       ├── flash.html
│       ├── footer.html
│       └── header.html
├── conf
│   ├── app.conf
│   └── routes
├── messages
│   └── sample.en
├── public
│   ├── css
│   │   └── bootstrap-3.3.6.min.css
│   ├── fonts
│   │   ├── glyphicons-halflings-regular.ttf
│   │   ├── glyphicons-halflings-regular.woff
│   │   └── glyphicons-halflings-regular.woff2
│   ├── img
│   │   └── favicon.png
│   └── js
│       ├── bootstrap-3.3.6.min.js
│       └── jquery-2.2.4.min.js
└── tests
    └── apptest.go
```

インストールまではとても簡単にできました。
次は実際にアプリの作成をしてみたいと思います。
Python tips1 ~ 文字列操作

python tipsと題して、備忘録的にPythonのコードをまとめていく。今回は文字列操作について、ただし正規表現は扱わない（正規表現は苦手でこれから勉強していかないと。。。）


### 文字列の連結
```python
s = 'hello world'
## 連結
s + "!!!" # > hello world!!!
## 連続で連結
s + "!" * 3 # > hello world!!!
```

### 分割
```python
s = 'hello world'
s.split(' ') # >> ['hello', 'world']
```

### 文字列の長さ
```python
s = 'hello world'
len(s) # >> 11
```

### 文字列の抜き出し
```python
s = 'hello world'
s[0] # >> h
s[-1] # >> d
s[:5] # >> hello
s[:-3] # >> hello wo
s[2:5] # >> llo
```

### 文字列の桁揃え
```python
s = 'hello world'
## 文字列の桁揃え
ss = '1234'
ss.rjust(10, '0') # >> 0000001234
ss.rjust(10, '!') # >> !!!!!!1234
## 文字列の桁揃え >> 0指定
ss = '1234'
ss.zfill(10) # >> 0000001234
```

### 検索
文字列が含まれているかを判定

```python
s = 'hello world'
'e' in s # >> True
```

文字列を検索し、存在していた場合先頭文字のインデックスを返す

```python

s = 'hello world'
s.find('wor') # >> 6
```

文字列の先頭が一致しているかどうかを判定

```python
s = 'hello world'
startswith('hello') # >> True
```

文字列の後方が一致しているかどうかを判定

```python
s = 'hello world'
s.endswith('ld') # >> True
```

### 置換

```python
s = 'hello world'
s.replace('h', 'H') # >> Hello world
```

### 大文字　⇔　小文字

```python
s = 'HELLO WORLD'
s_low = s.lower() # >> hello world
s_upper = s.upper() # >> HELLO WORLD
```
SVA文法資料

サイバネットのWebサイトに機能検証に関する資料があるということを教えてもらいましたのでリンクを張っておきます。
[ゼロからはじめる！SVA(SystemVerilog Assertion)文法](https://www.cybernet.co.jp/lsi-mentor/methods/sva.html)

一通りの文法を説明したPDFをダウンロードすることもできます。（所属の会社名などを入力する必要があるので個人だと入手できるのかわかりませんが。）
macOS High Sierraでsedで上書き更新しようとして-iオプションを付けて実行したらsed: 1: "ファイルパス": invalid command code mとなったときの対応方法

```bash:上書き更新するときは「''」を引数に入れる
$ sed -i '' 's/hoge/fuga/g' {ファイルパス}
```



- 環境
    - OS:macOS High Sierra バージョン10.13.6
    - sed:BSDのsed

# 事象：sedに-iオプションを付けて実行したらsed: 1: "ファイルパス": invalid command code mとなった
```bash
$ sed -i 's/シェル/shell/g' ~/Desktop/shell_kind.sh 
sed: 1: "/Users/mana/Desktop/she ...": invalid command code m
```

# 理由：BSDのsedはバックアップ用の拡張子を指定しなければならないから
GNUのsedはなくていいけどBSDのsedは必要。

```bash
$ man sed
<省略>
     -i extension
             Edit files in-place, saving backups with the specified extension.  If a zero-length extension is given,
             no backup will be saved.  It is not recommended to give a zero-length extension when in-place editing
             files, as you risk corruption or partial content in situations where disk space is exhausted, etc.
<省略>

$ ls -l ~/Desktop/
total 8
-rw-r--r--@ 1 mana  staff  199  9 17 16:13 shell_kind.sh # <<< 変更前の内容のファイル
# こんな感じに使う
$ sed -i '.bak' 's/*/-/g' ~/Desktop/shell_kind.sh 
$ ls -l ~/Desktop/
total 16
-rw-r--r--  1 mana  staff  199  9 18 20:45 shell_kind.sh # <<< 変更された内容のファイル
-rw-r--r--@ 1 mana  staff  199  9 17 16:13 shell_kind.sh.bak # <<< 変更前の内容がバックアップとしてできる
```

- [参考:Sed: &#39;sed: 1: invalid command code R&#39; on Mac OS X &middot;  Mark Needham](https://markhneedham.com/blog/2011/01/14/sed-sed-1-invalid-command-code-r-on-mac-os-x/)

# 対応方法：「''」を引数に追加する。
```bash
$ sed -i '' 's/シェル/shell/g' ~/Desktop/shell_kind.sh
```
Item 85: Prefer alternatives to Java serialization

# 85.Javaでシリアライズするより、他の方法を考えよ
## シリアライズは脆弱
シリアライゼーションの根本的な問題は、攻撃可能な個所が大きすぎ、その個所もコンスタントに広がっているという点にある。
オブジェクトグラフ（参照による結びつきをもったオブジェクト群というイメージ）は、ObjectInputStreamのreadObjectメソッドで、復元される。
このメソッドでは、型がSerializableを実装している限り、クラスパス上のほぼすべての型のオブジェクトをインスタンス化することができる。
バイトストリームをデシリアライズする過程で、このメソッドはクラスパス上にありSerializeを実装しているあらゆる型のコードを実行しできる。よって、これらすべての型が攻撃対象となる。

### ガジェット、ガジェットチェーン
攻撃対象となりうるserializableなクラスから脆弱性を取り除いたとしても、アプリケーション自体はまだ脆弱であるかもしれない。
serializableな型のメソッドから、危険な処理をしうるメソッド（ガジェットと呼ばれる）を組み合わせて、ガジェットチェーンなるものを作れば、時に、任意のネイティブコードが実行できるようなことも起こる。実際に、2016年にSan Francisco Metropolitan Transit Agency Municipal Railwayに対してこの仕組みを使ったハックがなされた。

### デシリアライゼーションボム
上記のようにガジェットを用いずとも、デシリアライズに多大な時間がかかるストリームは簡単に作れて、これでDoS攻撃ができる。
そのようなストリームはデシリアライゼーションボムといわれる。

```java
// Deserialization bomb - deserializing this stream takes forever
static byte[] bomb() {
    Set<Object> root = new HashSet<>();
    Set<Object> s1 = root;
    Set<Object> s2 = new HashSet<>();
    for (int i = 0; i < 100; i++) {
        Set<Object> t1 = new HashSet<>();
        Set<Object> t2 = new HashSet<>();
        t1.add("foo"); // Make t1 unequal to t2
        s1.add(t1);  s1.add(t2);
        s2.add(t1);  s2.add(t2);
        s1 = t1;
        s2 = t2;
    }
    return serialize(root); // Method omitted for brevity
}
```
上記のコードでは、1つのHashSetが2つのHashSetの要素を持っているという構造が100階層続いている。
HashSetインスタンスを生成するときには、各要素のhashcodeを演算せねばならない。よって、2の100乗回のhashCodeの呼び出しが必要となり、全然処理が終わらなくなる。

## 対処法は？
シリアライズに関する、上記のような攻撃への対処はどのようにすればよいか？

### 他の仕組みを使う
**一番の方法はデシリアライズをしないことだ。**
**新たに書くシステムでJavaのシリアライズを使う理由は一つもない。**
バイトシーケンスとオブジェクトを翻訳するベターな仕組みが存在しており、それらはcross-platform structured-data representationsと呼ばれる。

#### JSONとProtobuf
代表的なcross-platform structured-data representationsはJSONとProtobufというものである。
JSONとProtobufで最も重要な相違点は、JSONはテキストベースで人間が読める形である一方、Protobufはバイナリでより効率的である点だ。

### 信頼できないデータはデシリアライズしない
レガシーなシステムの保守開発などでは、Javaでのシリアライズを避けられないかもしれない。
そういったときには、**信頼できないデータはデシリアライズしない**、という対策を取るべきだ。
特に、信頼できないソースからのRMIトラフィックは受け付けてはならない。

### デシリアライズ時のフィルタリング機能を使う
Javaでのシリアライズを避けられず、デシリアライズするデータの安全性も怪しい場合は、オブジェクトのデシリアライゼーションフィルタであるjava.io.ObjectInputFilter（Java9から導入され、6,7,8にもバックポートされた）を使用すべきだ。
これはストリームがデシリアライズされる前にフィルタリングしてくれる機能を提供してくれる。
クラス単位でリジェクトするかアクセプトするか決められる。この時、ホワイトリスト形式かブラックリスト形式か選択することができるが、ブラックリストは既知の脅威からしか防御できないのでホワイトリストを採用すべき。
フィルタリング機能は、過度なメモリの使用も防いでくれ、過度に深いオブジェクトグラフも防いでくれるが、前述のデシリアライゼーションボムを防ぐ機能はない。
赤外線リモコンを解析してネットワーク経由で送信する！- その1「はじめに」

どうもはじめまして。初Qiitaです。
Arduinoを触り始めて一ヶ月程度たちESPr_Developerを使ってなにか作りたいと思い、試行錯誤しながら赤外線信号をネット経由で送信するものを作ったので備忘録としても流れを書いていきたいと思います。

#INDEX
1. 赤外線リモコンを解析してネットワーク経由で送信する！- [その1「はじめに」](https://qiita.com/amosoisin/items/127ea07140cc88c5563d)
2. 赤外線リモコンを解析してネットワーク経由で送信する！- [その2「信号解析」](https://qiita.com/amosoisin/items/ad09f18b4f27a8ff0a69)
3. 赤外線リモコンを解析してネットワーク経由で送信する！- [その3「信号送信」](https://qiita.com/amosoisin/items/a1878284d5f49fa6b17a)
4. 赤外線リモコンを解析してネットワーク経由で送信する！- [その4「回路とESPr_Developerを使うための設定について」](https://qiita.com/amosoisin/items/c4ee1c1896f94fc23553)

#概要
1. ArduinoとProcessingを使って赤外線信号を解析した。(16進数で確認)
2. 解析した赤外線信号を送信する機能を作製。
3. ESPr_Developerを使いネット経由で送信できるようにする。

これが大まかな流れとなります。

# 使用したもの
- [ESPr® Developer（ピンソケット実装済）](https://www.switch-science.com/catalog/2652/)
- 抵抗器
- トランジスタ(PN222)
- 赤外線LED ([LIR053](https://www.marutsu.co.jp/pc/i/838249/))
- [Arduino UNO](https://www.switch-science.com/catalog/789/) (なくてもいいが、赤外線を解析するのに使いやすかったため使用)
- 赤外線受信モジュール(38kHz) なんでもいいと思う。。。たぶん
- microUSBケーブル(データ送信可能なもの、ESPrDevelopperとの接続用, typeB)
- microUSBケーブル(typeBであればなんでもいい、電源供給用、被覆して使った)
- 電池ボックス(単3×3本)
- アルカリ単3電池(1.5V)×3
- ブレッドボード (はんだ付けは面倒。。。)

#次へ
では次回は「[赤外線の解析](https://qiita.com/amosoisin/items/ad09f18b4f27a8ff0a69)」に入ります。
『増補改訂版Java言語で学ぶデザインパターン入門』をKotlinでやってみる（Prototype編）

## 【経緯】
[『増補改訂版Java言語で学ぶデザインパターン入門』をKotlinでやってみる](https://qiita.com/siroykht/items/f67b2c111e9b3b424f1e)の第六回目、Prototypeパターンです。

## 【コード】
Prototypeはクラスからインスタンスを生成するのではなく、インスタンスから別のインスタンスをコピーして生成するパターンです。
単語の通りPrototype（原型）からのインスタンスからコピーを作り出すデザインパターンです。[このあたり](http://thefinestartist.com/effective-java/11)の関係なのか、ProductインターフェースにCloneableインターフェースを実装するとエラー出て対応できなかったのでちょっと変えてます。


```Kotlin:UnderlinePen.kt
class UnderlinePen(ulp:String):Product,Cloneable {
    private var ulStr = ulp
    
    override fun use(s:String) {
        var length = s.toByteArray().size
        println("\"" + s + "\"")
        println("")
        
        for(i in 0..length+3) {
            println(ulStr)
        }
        println("")
    }
    
    override fun createClone():Product? {
        var p:Product? = null
        
        try {
            p = super.clone() as Product
        } catch(e:CloneNotSupportedException) {
            println(e.printStackTrace())
        }
        return p
    }
}
``````
```Kotlin:MessageBox.kt
class MessageBox(msg:String):Product,Cloneable {
    private var decochar:String = msg
    
    override fun use(s:String) {
        var length = s.toByteArray().size
        
        for(i in 0..length+3) {
            println(decochar)
        }
        
        println("")
        println(decochar + " " + s + " " + decochar)
        
        for(i in 0..length+3) {
            println(decochar)
        }
        println("")
    }
    
    override fun createClone():Product? {
        var p:Product? = null
        
        try {
            p = clone() as Product
        } catch(e:CloneNotSupportedException) {
            println(e.printStackTrace())   
        }
        return p
    }
}
``````

```Kotlin:Manager.kt
class Manager {
    private var showcase:HashMap<String, Product> = HashMap()
    
    fun register(name:String, proto:Product) {
        showcase.put(name, proto)
    }
    
    fun create(protoname:String):Product? {
        var p = showcase.get(protoname) as Product?
        return p?.createClone()
    }
}
``````

```Kotlin:Product.kt
interface Product  {
    public abstract fun use(str:String)
    public abstract fun createClone():Product?
}
```

```Kotlin:Main.kt
fun main(args: Array<String>) {
    // Here your code !
    
    var manager:Manager = Manager()
    var under:UnderlinePen = UnderlinePen("~")
    var aBox:MessageBox = MessageBox("*")
    var sBox:MessageBox = MessageBox("/")
    manager.register("strong message", under)
    manager.register("warning box", aBox)
    manager.register("slash box", sBox)
    
    var pStrong:Product? = manager.create("strong message")
    pStrong?.use("Hello, World.")
    
    var pWarning:Product? = manager.create("warning box")
    pWarning?.use("Hello, World.")
    
    var pSlash:Product? = manager.create("slash box")
    pSlash?.use("Hello, World.")
}
```
```:出力結果(改行削除)
"Hello, World."
"~~~~~~~~~~~~~~~~~"
*****************
* Hello, World. *
*****************
/////////////////
/ Hello, World. /
/////////////////
```
Pipenv をdockerで使うときに特定のパッケージが入らないようにしたかった。

DNNの学習などはもっぱらGPUマシンに nvidia-docker でFAだと思って最近dockerざんまいなのですが、そろそろ requirements.txt を卒業したかったので docker も pipenvに変えようとしたらハマった話。  
一応対策したがもっといい方法がある気がする。あって欲しい。

## 問題点

`pipenv install` すると、 docker イメージに含まれている **tensorflow-gpu** が参照できなくなる。

1. 開発環境(教師データ作成など)を pipenv で構築する。
2. Dockerfile　を [nvcr.io/nvidia/tensorflow](https://docs.nvidia.com/deeplearning/dgx/tensorflow-release-notes/overview.html) などをベースに作成する。
3. GPUマシンで `docker build` / `docker run` する。
4. GPUが使用されず、CPUのみで学習してしまう。(しばらくしてnvidia-smiで使用率チェックしたらGPU 0%でﾌｧｰｰｰｗｗｗってなる。)

```Dockerfile:Dockerfile
FROM nvcr.io/nvidia/tensorflow:18.05-py3

ENV PYTHONUNBUFFERED=1

RUN set -ex; \
    pip --no-cache-dir install \
        pipenv

WORKDIR /opt/app

# install dependencies
COPY Pipfile Pipfile.lock ./
RUN set -x; \
    pipenv install --system --verbose

# libraries
ADD ./src ./src

CMD [ "python", "src/task.py" ]
```

こういうイメージ。

どうやら、開発環境用にpipenvで入れている通常版のtensorflowをインストールして読み込んでしまうため、GPU版のtensorflowが使われないっぽい。

`pipenv install -d tensorflow` するという手もあるが、学習後の実行環境でも通常版のtensorflowは使用するため、dev指定はしたくない。


## 解決策

とりあえずこうした。

```Dockerfile:Dockerfile
# install dependencies
COPY Pipfile Pipfile.lock ./
# RUN set -x; \
#     pipenv install --system --verbose
RUN set -x; \
    pipenv lock -r > requirements.txt; \
    sed -i.bak '/^tensorflow/d' requirements.txt; \
    sed -i.bak '/^tensorboard/d' requirements.txt; \
    pip --no-cache-dir install -r requirements.txt
```

pipenvからrequirements.txtを吐いて、入れちゃ困るやつ抜いて、pipでインストール。
き、汚い。。。

## ひとり言

pipenvにrsyncの `--exclude` オプションみたいなやつないかな。本来のコンセプトと合わなくなるからそれはそれで汚いけど。
または、 `--system` オプションの時に既存インストールのパッケージを優先するオプションとか。
Elixirの"for"はリストのジェネレータ

# Elixir
みなさんElixir知ってますか！？
え？知らない？じゃあまずこれを・・・笑
[【fukuoka.ex】学生エンジニアがElixirに興味を持ったきっかけと初心者にオススメの勉強法](https://qiita.com/koyo-miyamura/items/86f1148e4a8a7c591e55)

前置きはおいといて、今回はスクリプト言語になれていると引っかかるであろう「関数型言語」Elixirのforの動作について共有しようと思います。

# やりたかったこと
Elixirの勉強のためにHackerRankのこの問題を解いているときに、文字列から「各文字を最後尾にずらしたリスト」を生成することをチャレンジしていました。
[Rotate String | HackerRank](https://www.hackerrank.com/challenges/rotate-string/problem)

```:例
abc -> ["bca", "cab", "abc"]
```

# Elixirのforの動作
さて、ここで問題ですが、fの値ってどうなると思います？

```elixir
f = for i <- 0..3, do: i*2
```

・・・実はfの値は「リスト」になります。

```elixir:実行結果
[0, 2, 4, 6]
```
これってちょっとモヤモヤしませんか？（わたしはモヤモヤしましたｗ）

Pythonで同様のことをしようとすると[]で囲まないといけないですよね？

```python
f = [i*2 for i in range(4)]
```

そもそも関数型であるElixirと一般的なスクリプト言語ではforの意味が異なります。

[内包表記 · Elixir School](https://elixirschool.com/ja/lessons/basics/comprehensions/)

> 最初に気づくのは for とジェネレータの使い方です。ジェネレータとは何でしょうか。リスト内包表記の x <- [1, 2, 3, 4] といった式のことです。次の値を生成する責任を負っています。
幸い、内包表記はリストだけに限定されず、実際列挙可能なものならどんなものにでも使えます

関数型でリストに対して繰り返し処理したい場合はEnum.mapを使うのがポイントみたいです！

# 文字列から「各文字を最後尾にずらしたリスト」の実装
これらを踏まえると冒頭の、文字列から「各文字を最後尾にずらしたリスト」は以下のように実装出来ます。

```elixir
    def get_rotations(s) do
        s = String.codepoints(s) # 1文字ずつ区切って配列にする
        for i  <- 1..length(s) do
            {left, right} = Enum.split(s, i)
            Enum.join(right ++ left)
        end
    end
```

関数の帰り値がforで終わるという感覚が関数型らしいですね

## 関数型を学ぶときは今までの常識はいったん忘れる
関数型言語はなるべく状態を持たずにデータの入出力関係を記述して目的を達成することを目指します。
そのため、状態を持つオブジェクト指向言語の考え方とは異なります。
個人的にはシェルスクリプトの感覚と近いのではないかなぁと思います。
（シェルスクリプトもオブジェクト指向言語との違いで苦手になる人多いっぽくて、こんな記事あるみたいですがｗ[プログラマーの君！ 騙されるな！ シェルスクリプトはそう書いちゃ駄目だ！！ という話](https://qiita.com/piroor/items/77233173707a0baa6360)）

オブジェクト指向に慣れているととっつきにくいですが、テストがしやすかったり状態を持たないことで並列実行しやすかったりと、関数型言語のメリットも結構あります。
それに関数型言語を１つ極めておくと、他の関数型言語さわる時にいいと思うので学生さんとか是非やってみてください！
Ethereum[CryptoZombies][構造体・関数・配列]

#関数

関数の作成は、次のように定義します。

```contract.sol
function eatHamburgers(string _name, uint _amount) {

}
```
`string` と `uint`という2つのパラメーターを持ちます。
グローバル変数と区別をつけるために、関数パラメーター変数名はアンダースコア(_)をつけるのが通例（必須ではありません）です。

関数は次のように呼び出します。

```contract.sol
eatHamburgers("vitalik", 100);
```


#Private関数
Solidityでは、関数はデフォルトで`public`になっています。つまり、誰でも（別のコントラクトから）自分で作成したのコントラクトの関数を呼び出して、実行できるということです。

これは、攻撃に対してコントラクトが脆弱になります。そのため、自分が使う関数はデフォルトで`private`にして、公開しても構わない関数だけを`public`に設定します。
Private関数は次のように定義します。

```contract.sol
uint[] numbers;

function _addToArray(uint _number) private {
  numbers.push(_number);
}
```
このように書くと、この関数はコントラクト内の他の関数からだけ呼び出して、numbers配列に格納できます。

Private関数は、Public関数のパラメータと同様に、関数名にアンダースコア(_)をつけるのが通例です。



#戻り値
関数の戻り値を設定する場合は次のように定義します。

```contract.sol
function sayHello() public returns (string) {
  string greeting = "What's up dog";
  return greeting;
}
```

Solidityでは関数の宣言に、戻り値の**型を含みます**（ここでは`string`です）。
しかし、このままだと誰からでもこの関数を編集することができてしまいます。
なので、次のように設定します。

- view関数

```contract.sol
function sayHello() public view returns (string) {
```

viewをつけると、**読み取りのみ**行うことができます。

- pure関数

```contract.sol
function _multiply(uint a, uint b) private pure returns (uint) {
  return a * b;
}
```

pureをつけると、アプリ内の**データにアクセスできなく**なります。

どのような時にpure/viewを使い分けるのか難しい場合には、
コンパイラが警告してくれるので、大丈夫です。


#構造体

pythonだと一つの変数(定数)にstringとintは入れることはできませんが、Solidityの構造体はstringもintもどちらも入れることができます。
structは以下のように作成します。

```contract.sol
struct Person {
  uint age;
  string name;
}
```


#配列
Solidityには、**固定長配列**と**可変長配列**、2種類の配列が用意されています。

```contract.sol
// 2要素の固定長配列：
uint[2] fixedArray;
// 文字列の固定長配列の例。5つの文字列を格納：
string[5] stringArray;
// 可変長配列 - 決まったサイズはないので、格納し続けることができます：
uint[] dynamicArray;
```

配列をpublicで指定すると自動的にgetter関数を作成します。
getter関数とは、外部から見れるようにする関数のことをいいます。

```contract.sol
Person[] public people;
```

上記は、Person構造体をpeople配列(パブリック配列)で指定するという意味です。
パブリック配列は、読み込みはできますが、書き込みはできません。
そのため、公開するコントラクトのデータを格納する時に便利です。

このままだと、people配列には何も入っていないので、次のように追加していきます。

```contract.sol
// 新しいPersonを作る：
Person satoshi = Person(172, "Satoshi");

// それを配列に格納する：
people.push(satoshi);
```

上記のコードを１行にまとめることができます。

```contract.sol
people.push(Person(16, "Vitalik"));
```

`array.push()`は配列の最後に何かを追加するので、要素は追加した順番になります。

```contract.sol
uint[] numbers;
numbers.push(5);
numbers.push(10);
numbers.push(15);
// 数字は [5, 10, 15]
```
2018年9月第2週　今週気になった記事まとめ

# 今週気になった記事まとめ
##■新卒入社後、約3年半で読んできた書籍たち
https://qiita.com/turmericN/items/5c09ce3b634c73c118e7?utm_campaign=popular_items&utm_medium=feed&utm_source=popular_items
星一つの本は全体的に読んでみた方が良さそうな感じがした。
ただAWSはやっぱり情報のアップデートが多すぎて入門の内容が常に変わるのが良くも悪くも・・・。

##■ソフトウェア設計についてのつぶやき
https://qiita.com/BlueEventHorizon/items/7b8dcf625ff5790ed1ef?utm_campaign=popular_items&utm_medium=feed&utm_source=popular_items
ほとんど設計業務を自分はやったことないので、イメージ付くところ付かないところあった。
今後の業務内容次第ではこういう部分をしっかり押さえておく必要は出てきそうだなぁ。

##■ムダにクリエイティブな"Hello World"の出力方法一覧(Java)
https://qiita.com/KMim/items/dfa1cde772f67ef50618?utm_campaign=popular_items&utm_medium=feed&utm_source=popular_items
どんだけ技術を費やしてHelloWorldを出すか・・・。自分の場合はLambdaあたりを使ったパターンが最上な気がする。

##■グーグルやマイクロソフトも協力、IT分野で活躍する女性の広告が米国で開始
https://japan.zdnet.com/article/35125403/
アメリカでそんなにIT分野の性別差があるイメージが無かった。
結構IT、ゲームの分野で女性のトップを見ることもあったし。
でも極めて珍しいパターンってことなのかな。

##■「ツイッターでつぶやけるボタン」を簡単に作成できるサービスをリリースしました【個人開発】
https://qiita.com/retoruto_carry/items/d6a173701c8e40f0c294?utm_campaign=popular_items&utm_medium=feed&utm_source=popular_items
大学三年生の個人開発でここまでやってるのが凄いなと。
自分はもちろんのこと、うちの人間でここまで技術的にもやる気的にもできる人間はどれだけいるのだろうか・・・。

##■「社員を管理しない、評価しない」 個人と会社の幸せを追求した社長が心に決めたこと
http://www.itmedia.co.jp/business/articles/1809/13/news011.html
凄く良いやり方だなとは思うけど、じゃあうちの会社でとか、他の会社でとなるとまた話は違うのだろうな。
この会社が培ってきた社風だったり文化だったり、所属している社員の精神性だったりがこのやり方を良きものとしているんだろうなと。

##■優秀な人を採用したがるのは、三流社長のやることだ
http://mag.executive.itmedia.co.jp/executive/articles/1809/13/news013.html
価値観というキーワードは組織を語るときに案外重く語られないイメージ。
大事という意識が当たり前すぎて逆に語られないというか。

##■主要都市部でのスマホ決済利用は4人に1人、ユーザー置き去りが浮き彫りに
http://www.itmedia.co.jp/mobile/articles/1809/12/news118.html
事業者側が優位なのに事が上手く回らない、ユーザ優位のが上手くいくっていうのは興味深い。

##■ビジネス版LINE「LINE WORKS」、個人のLINEアカウントで利用可能に
http://www.itmedia.co.jp/news/articles/1809/11/news118.html
2～3年前に導入検討して結果Office365にした時から凄いスピードで進化していて判断をミスったかなぁと(笑)
ただ当時はまだまだ出始めで選ぶにはなかなかハードルが高かったのは事実なので、先見性は無かったけど判断自体はしゃーないかな。

##■洗濯物たたみ機発売へ追い込み　10億円追加調達で不具合解消にめど
http://mag.executive.itmedia.co.jp/executive/articles/1809/12/news075.html
どういう機械なのかが分からなかったが、どういう感じで動くものなのか。
それなりにでかそうな気がするけど。

##■「鍵かけたっけ？」を解決する、施錠認識機能付きスマートキーカバー「SureKey」
https://techable.jp/archives/83096
鍵回すときとそうじゃないときのセンサの挙動をどうやって分けてるのかが気になる。

##■｢スマートフォンを充電し続けるとバッテリーが劣化する｣は迷信か？
https://www.lifehacker.jp/2018/09/stop-letting-your-smartphones-battery-die-before-you-ch.html
結局気にしないのが一番という。