OmniAICreator/Qiita-1.07M huggingface dataset:
JavaScriptの型判定モジュールを書く

# TL; TD;
JavaScriptの型は勝手に変わったり判定が難しかったりすのでisUtilとしてまとめる。
大体は標準関数に渡すだけ何を返すかは標準関数任せ。
例外は投げられないようにして返り値はすべてbooleanにした(はず)。

## 実装
```js:isUtil.js
const isUtil={
    isUndefined: (target)=>{ return target===void 0; },
    isNull: (target)=>{ return target==null; },                                                

//    isObject:   (target)=>{ return typeof target==='object';   }, nullに対応
    isObject:   (target)=>{ return target === null ? false : typeof target==='object'; },
    isBoolean:  (target)=>{ return typeof target==='boolean';  },
    isString:   (target)=>{ return typeof target==='string';  },
    isNumber:   (target)=>{ return typeof target==='number';  },                                                             
    isFunction: (target)=>{ return typeof target==='function'; },                                       

    isTrue:  (target)=>{ return target===true; }, // return 'true'=> false                                                                     
    isFalse: (target)=>{ return target===false; },
    isArray: (target)=>{ return Array.isArray(targert); },

    isEmpty: (target)=>{
        if( target==null ) return true;
        else if( target.length!=null && target.length===0 ) return true; // return "", [] => true;                                             
        else if( typeof target==='object' && Object.keys(target).length===0 ) return true; // {} => true;                                      
        else return false;
    },
    isInstance: (target)=>{
        try{
            if( {} instanceof target ){}
            return true;
        }
        catch(e){ return false; }
    }
}

module.exports=isUtil;
```
判定は厳密なので`"true"`はfalseを返す。`isNumber("1")`も`false`。
例外は`isNull=(target)=>{ return target==null; }`

## 検証用コード
```js:isUtil/test/isFunc.js
const func=function(){}
const arrFunc=()=>{};
const asyncFunc= async ()=>{};
const arrAsyncFunc= async function(){};

console.log(typeof arrFunc);
console.log(typeof arrAsyncFunc);
console.log(typeof func);
console.log(typeof asyncFunc);

console.log(typeof null);
```

## 一応テストもあるよ
走らせる前に答えを考えてみてね。

```js:isUtil/test/isInstance.js
'use strict'
const isUtil=require('../../isUtil');

const aa={};
const a = class{};
const f = function(){};
const func=()=>{};

console.log(isUtil.isInstance(Date));
console.log(isUtil.isInstance(RegExp));

console.log(isUtil.isInstance(new Date));
console.log(isUtil.isInstance(new RegExp));

console.log(isUtil.isInstance(''));
console.log(isUtil.isInstance(String));
console.log(isUtil.isInstance(String('')));

console.log(isUtil.isInstance(f));
console.log(isUtil.isInstance(func));

console.log(isUtil.isInstance(a));
console.log(isUtil.isInstance(aa));
```

# 最後に
どこかに上げるほどのものでもないと思うのでコピペして使ってください。
どのブラウザでも動くと思いますが実行環境はNodeを想定しています。
**例外が投げられれた**、思った返り値にならないなどの報告はコメントでおねがいします
BUWでPHPを実行してみる

# コマンドラインで実行してみる
```
php hoge.php
```

# 開発用Webサーバーの機能を使ってみる
開発用Webサーバーを起動します。
このコマンドを実行したディレクトリがサーバーのドキュメントルートになります。

```
php -S localhost:8000
```

起動したWebサーバーには、

```
http://localhost:8000
```
とブラウザに入力してアクセスできます。
例えば、hello.phpにアクセスするには、ブラウザの入力欄に

```
http://localhost:8000/hello.php
```
と入力します。

Webサーバーの終了は、Ctrl + c で行います。
TimeMachine のバックアップHDD移行

# 概要
これまで外付けHDDにパーティション切って500GBのTimeMachine領域を確保していたけど、HDDを買い換えてTimeMachine領域も1TBに拡張して移行することに。バックアップファイルの新HDDへの転送について、[Apple公式サイトの方法](https://support.apple.com/ja-jp/HT202380)ではうまくいかなかったので、その備忘録。要は、データのコピーにディスクユーティリティを用いるということ。

# ハマった状況
約500GBのバックアップファイルを単純にドラッグ&ドロップでコピーしたら、空き容量が1TBあったにもかかわらず、容量不足で止まってしまった。コピー自体に一晩かかって、朝にこのエラー表示を見るのは悲しい。また、コピーされたファイルを見る限り、TimeMachineでバックアップを取っていた期間と比較しても、短い期間のコピーしかできていない模様。

どうやらTimeMachineでは、差分バックアップにハードリンクを用いているようなんだけど、普通のコピーを用いると、それらが別々のファイルとしてコピーされてしまっているように見える。ううむ。。。

# 解決策
[kamosidheのブログ - Time Machineバックアップデータを転送する2つの方法](
http://kamosidhe.hatenablog.com/entry/2way_to_transfer_time_machine_data)にもありますが、macOS付属のディスクユーティリティにある「復元」機能を使って、新HDDに既存のTimeMachine領域を復元することで無事転送できました。
PyMieScatt > Mie_ab() > 漸化式 > Downward recurrence > 誤差の増大の対策

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 16.04 LTS desktop amd64
TensorFlow v1.2.1
cuDNN v5.1 for Linux
CUDA v8.0
Python 3.5.2
IPython 6.0.0 -- An enhanced Interactive Python.
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
scipy v0.19.1
geopandas v0.3.0
MATLAB R2017b (Home Edition)
ADDA v.1.3b6
gnustep-gui-runtime v0.24.0-3.1
```

Numpy実装による球粒子の光散乱コードPyMieScatt関連。
Mie_ab()

https://github.com/bsumlin/PyMieScatt/blob/master/PyMieScatt/Mie.py
http://pymiescatt.readthedocs.io/en/latest/forward.html#Mie_ab


### Reference

- Bohren C.F. and D. R. Huffman, "Absorption and Scattering of Light by Small Particles", John Wiley, New York, NY (1983)
- PDF: [MATLAB Functions for Mie Scattering and Absorption, Research Report No. 2002-08, June 2002](https://omlc.org/software/mie/maetzlermie/Maetzler2002.pdf) by Christian Mätzler


### Downward recurrence

https://github.com/bsumlin/PyMieScatt/blob/master/PyMieScatt/Mie.py#L82

```py
  Dn = np.zeros(int(nmx),dtype=complex)
  for i in range(int(nmx)-1,1,-1):
    Dn[i-1] = (i/mx)-(1/(Dn[i]+i/mx))
```

UpwardでなくDownward Recurrenceなのは何故か?

### 数値計算のつぼ

@ 数値計算のつぼ by 二宮市三さん、吉田 年雄さん、長谷川 武光さん、秦野ヤスヨさん、杉浦 洋さん、桜井 鉄也さん
p35

> 漸化式の解の一般形は
> $x_i = \alpha (1/3)^i + \beta (-5)^i$
> と書かれる。
> ...
> 誤差の増大の対策は、漸化式を逆進することである。適当な値 i=nを設定してy_{n+1} = 0, y_n = 1とおき、この２つを初期値として漸化式を逆向きにy_{n-1}, y_{n-2}, ..., y_0を計算する。


### Bohren and Huffman (1983)

- Bohren C.F. and D. R. Huffman, "Absorption and Scattering of Light by Small Particles", John Wiley, New York, NY (1983)

p127

> Threre are two of possible shemes for calculating $D_n(mx)$ in (4.88): upward recurrence ... and downward recurrence ... Kattawar and Plass (1967) have shown that $D_n$ is numerically stable with respect to downward recurrence; that is, if $e_n$ is the error in $D_n$, then the error in $D_{n-1}$ generated from (4.89) is such that $|e_{n-1}| << |e_n|$.

[Kattawar, G.W. and G. N. Plass, Electromagnetic Scattering from Absorbing Spheres, vol.6, pp.1377-1382, Applied Optics, 1967.](https://www.osapublishing.org/ao/abstract.cfm?uri=ao-6-8-1377)
Markdown, Ubuntu > GitHubからのコピペ > 表形式, コード形式

```txt:動作環境
Ubuntu 16.04 LTS
```

GitHubからQiitaへのコピペの方法は２種類ある。

以下に関しては、2018年3月17日現在の実装なので、将来どうなるかは不明。

例として以下のコードのL82-L84をコピー(Ctrl+c)して使う。
https://github.com/bsumlin/PyMieScatt/blob/master/PyMieScatt/Mie.py#L82

### Ctrl+v (仮称: 表形式)

```
|   Dn = np.zeros(int(nmx),dtype=complex) |
|:--|
|   for i in range(int(nmx)-1,1,-1): |
|     Dn[i-1] = (i/mx)-(1/(Dn[i]+i/mx)) |
```

以下のようにレンダリングされる。

|   Dn = np.zeros(int(nmx),dtype=complex) |
|:--|
|   for i in range(int(nmx)-1,1,-1): |
|     Dn[i-1] = (i/mx)-(1/(Dn[i]+i/mx)) |


### Ctrl+Shift+v (仮称: コード形式)

```
  Dn = np.zeros(int(nmx),dtype=complex)
  for i in range(int(nmx)-1,1,-1):
    Dn[i-1] = (i/mx)-(1/(Dn[i]+i/mx))
```

Qiita記事にする時はこちらを使うと便利。
Rspec の小ネタ集


次から次へと発見しては忘れていくので、備忘録を作ることにしました。
また発見があったら追記していくつもりです。

## letで定義したら、expect() でも expect{} でもいい感じ

変数としても、ブロックとしても評価できます、素晴らしい。
状態遷移のテストがとてもすっきり書けました。

```ruby
context 'state1 -(action)-> state2' do
  let(:item){
    item= create(:item)
    item.action
  }
  
  # 遷移後の結果を確認する
  it { expect(item.aasm_state).to eq 'state2'}
  # 遷移の副作用（たとえば履歴保存とか）を確認する
  it { expect{ item }.to change{ ItemHistory.count }.by(1) }
end
```

## let! の存在を忘れるな

忘れると、以下のようなダサい before節が書かれたりします。

```ruby
let(:items){
  list= create_list(:item, 10)
  # いろいろセットアップしている
}

describe 'Item.some_aggregate_method' do
  before { items } # let! にすればこの行がいらない
  it { expect(Item.some_aggregate_method).to eq 10 }
end
```

let! で書けば、変数が呼ばれているかどうかに関わらず評価されるので、意味もなく変数を呼ばなくてよくなります。


## Hash#with_indifferent_access はステキ

Faker とかのデータで `undefined method hogehoge for nil:NilClass` とか怒られる場合。
Hashのキーが Symbol なのに String でアクセスしようとしてるとかその逆とかありがちです。
Hash#with_indifferent_access と言っておくと、Symbol / String どちらでも見つけてくれるので、ハッピーです。

```ruby
let(:user){
  auth= Faker::Omniauth.google.with_indifferent_access
  User.create_with_omniauth(auth)
}
it { expect(user).to be_valid }
```

テストとしては緩くする行為なので、見逃し原因にならないように注意は必要ですが。


## ActiveRecord::Relation は配列と比較可能

scope のテストで良くあるというか、気づく前から使ってました。
match_array とかも問題なく使えます。

```ruby
it 'self.sort' do
  list= create_list(:item, 3)
  list= [ list[1], list[2], list[0] ] # 期待値 <= これは配列
  expect(Item.sort).to eq list # expect の中は ActiveRecord::Relation だけど大丈夫
end

```

## Factory で after_initialize が発火しない

build でも create でも、after_initialize は呼んでくれませんでした。
Factory の定義で明示的に呼べばOKです。

```ruby
FactoryGirl.define do
  factory :item do
    after(:build){|item|
      item.send(:do_something)
    }
  end
end

```
Bash on Ubuntu on WindowsでPHPのインストール

# パッケージ情報を更新します。
```
sudo apt-get update
sudo apt-get upgrade
```

# PHPの実行環境をインストールします。
```
sudo apt-get install php
```

### バージョンを確認します。
```
php -v
```

PHPのバージョン情報が表示されたらインストールは成功です。
styled-componentsを使った雑なReact Presentational Componentの書き方

最近、仕事でReactを書く機会が多くなってきて色々試しているうちに書き方が落ち着いてきました。


**[注意]**

本来はクラス毎にStyledComponentsのインスタンスを作った方がいいです。自分がVueライクな感じで雑に書くための記法です。

この表記ですと、**子コンポーネントに同じクラス名があたったときに、親コンポーネントのスタイルが当たる**ので完全なscopedなスタイルにはなりません。
（@nabeliwoさんにコメントいただきました。ありがとうございます！）

既にHTMLが存在しているときに雑にReactに移植するときの途中段階とかで役立つ書き方です

```jsx:TodoItem.jsx
import React from 'react'
import styled from 'styled-components'

const TodoItem = ({
  className,
  title,
  description,
  onDestroy,
}) => (
  <div className={className}>
    <div className='title'>{title}</div>
    <div className='description'>{description}</div>
    <span className='close'></span>
  </div>
)

export default styled(TodoItem)`
  margin: 12px 0;
  padding-bottom: 12px;
  border-bottom: 1px solid #e5e5e5;

  .title {
    font-weight: bold;
    font-size: 15px;
  }

  .description {
    opacity: 0.8;
    font-size: 12px;
  }
`
```

## ポイント
- styled-componentsでCSSのsyntaxのままJS内に埋め込めるようになったこと
    - 今までCSS in JSはキャメルケースのスタイルが嫌だったので使ってなかった。
    - 少なくともVSCodeでは[プラグイン](https://github.com/styled-components/vscode-styled-components)があってうまく動いてる
- styled-componentsで作ったスコープの中でのみ効くスタイルを書く
    - CSS Modulesの考え方から
    - classNameに勝手に割り振ってくれて擬似的なスコープが出来る。
    - exportで吐き出す時に書いて、一箇所にスタイルをまとめる
        - [公式のサンプル](https://github.com/styled-components/styled-components#example)では各パーツごとに定数を定義していって、それを組み合わせる形にしているので推奨される書き方ではなさそう
    - **子コンポーネントに同じクラス名があたったときに、親コンポーネントのスタイルが当たる**ので完全なscopedなスタイルではない
- HTML, CSS, JSが1ファイルになる
    - Vue.jsライクなファイル構成になる。半年前ぐらいまでVue.jsばっか書いてたから嬉しい
- AtomicDesignの尺度とは違う。もう少しざっくり書く時に使える。
    - アプリケーションを作り始めるタイミングではこのぐらいのサイズ感で書くと早い（気がする）
- Componentがでかくなるとファイルを分けたくなるので、小さく保つ意識が持てるかも

## TypeScript

```tsx:TodoItem.tsx
import * as React from 'react'
import styled from 'styled-components'

const TodoItem : React.StatelessComponent<{
  className?: string
  title?: string
  description?: string
  onDestroy?: Function
}> = ({
  className,
  title,
  description,
  onDestroy,
}) => (
  <div className={className}>
    <div className='title'>{title}</div>
    <div className='description'>{description}</div>
    <span className='close'></span>
  </div>
)

export default styled(TodoItem)`
  margin: 12px 0;
  padding-bottom: 12px;
  border-bottom: 1px solid #e5e5e5;

  .title {
    font-weight: bold;
    font-size: 15px;
  }

  .description {
    opacity: 0.8;
    font-size: 12px;
  }
`
```

Reactはv16、参考例のTypeScriptはv2.7を対象にしています。
ランチャーの位置を変更する[On Ubuntu 16.04 LTS]

ランチャーの位置がデフォルトでは、画面左端となっていて、２画面で利用している私にとって、画面の境にあることになるので、ちょっと気になります。
そこで、画面の下の方に表示されるように設定します。

#前提条件
- Ubuntu 16.04.03 LTS Desktop版

#gsettingsによる変更方法

以下のコマンドを実行すると、画面下に移動します。

```
$ gsettings set com.canonical.Unity.Launcher launcher-position Bottom

```

ちなみに、戻す方法は以下となります。

```
$ gsettings set com.canonical.Unity.Launcher launcher-position Left

```

以上です。
デザイナーの僕がなぜVimmerになったか

# Vimとの出会い
去年の2017年3月に転職して、それまではずっとAtomを使っていた。
というか、他のエディターはSublime textかBracketsぐらいしか知らなかった。
Vimというものすら知らなかった。

でも仕事柄Gitは毎日のように使うので、CUIには慣れたし、
凄いエンジニアは大体皆Vimを使っているので、何となく凄いエディターなんだろうなーというのは分かったので、とても興味が湧いたのがきっかけでした。

何しろ、**優れたデザイナー程物まねが上手い**とよく聞かされていたので、凄いエンジニアが使っているんなら凄いエディターなんだろうなーと、何となく直感で思った。

# モードの概念に四苦八苦する
Vimを触って最初に苦労したのは、「モードの概念が分からない」でした。
**「ノーマルモード、インサートモード、ビジュアルモード、コマンドモード」とか言われても、何言ってるか分からないし、何やってるか分からない！**でしたｗ
何しろ、GUIのエディターにはそんな概念はないので。
なので最初は、[ここの記事を印刷して、MacにVimのコマンドを貼って気合で覚えたｗ](https://qiita.com/hide/items/5bfe5b322872c61a6896)

# .vimrcの改造にはまる
次第にモードの概念にも慣れてきたので、**.vimrc**なるものがあるのを覚える。
**ここに色々と書き込めば、Vimを思うように改造できるらしいぞ！**と。
もうMacにVimコマンドを貼る必要はなくなっていたので、次は思うようにVimを改造したいと考えるようになっていた。

# プラグインのインストールにはまる
Vimはプラグインをインストールして、色々と改造できることを知った。
ネットの記事だとNeobundleの記事が多いけど、最新はdeinを使うらしいので、僕はdeinでプラグインをインストールすることにした。
社内のエンジニアでも「Neobundle辞めてdeinにしたい」って人がいるけど、僕deinですよーって言ったら、
**まずVimmerのデザイナーなんて普通いないですよｗ**と言われるようになっていたｗ

でも、なんか次第にVimの動作が遅くなってきたので、社内のベテランエンジニアに相談したら**プラグインの入れすぎですねー**とアドバイスを貰ったので、必要なさそうなプラグインは消して、今は必要最小限のプラグインだけ入れている。
とりあえず、Vimは自動で閉じタグを入れてくれないので、**Emmet**と、必要最小限のSyntax highlight系のプラグインだけ入れている。

# 脱NERDTreeへの苦難
それでも、**NERDTree**だけは外すことが出来なかった。
でも、そもそもVimmerはディレクトリ構造とか頭の中に入っている人が多いので、あえてNERDTreeを入れてない人が多いし、僕もさっさとNERDTreeからは脱却したいと思っていた。
そんな時`:e .`でディレクトリを可視化出来る事を知った。
おかげでNERDTreeからは無事脱却することができましたｗ

# シェルもVimで使いたいと考えるようになっていた
僕は[香り屋版MacVim](https://github.com/splhack/macvim-kaoriya)を使っているのですが、次第になるべくMacVimでシェルスクリプトを使いたいと考えるようになっていた（Gitとか、yarnとか、gemとか、bundle installとか）
そんな時`:terminal`でMacVimでもターミナルを実行できることを知る。
でもこれは、ドラッグして過去のログが見れなかったので、使うのをやめた。
おとなしくシェル使いますｗ（欲を言えば、bashからzshに移行したい）

# 自分のVimレベルを知りたくなってきた
もう実務で使うのはVim一択だったので、そろそろ自分のレベルが知りたくなったので、ネットで色々と検索して[こんなサイトを見つけた](https://qiita.com/hachi8833/items/7beeee825c11f7437f54)
ここの記事だと、僕はLevel6ぐらいらしい（真のVimmerからすると、小学校1～2年生の中間ぐらいかな？）

# Vimでも不便だと感じたこと
そんなVimでも不便だと思うことはある。
それは、**検索や置換がやりにくい**事。
開いているファイルの検索や置換は出来るけど、ディレクトリの検索や置換はできなかった（調べたらできそうだけど）
なのでそういう時は、おとなしく`git grep`を使っています。

# 追伸
そんな僕のVimは、こんな感じです。
https://github.com/cookboys/MacVim
Python3でNEMのAPIを叩く-005-XEMの価格を日本円で表示する

#はじめに
[前回](https://qiita.com/oden_umai/items/51f483e717ee306c2a5f)では「/account/get」APIを使用して、NEMのアドレスからXEMの枚数などを取得しました。
今回は応用技で、XEMの枚数を取得して価格を日本円で表示するプログラムを紹介します。

処理の流れは以下の通りです。
1.NEMのアドレスからXEMの枚数を取得する
2.取引所のAPIを使ってXEMの日本円価格を取得する
3.1と2を掛け算する

1は[前回](https://qiita.com/oden_umai/items/51f483e717ee306c2a5f)やりましたね。取引所のAPIはZAIFを使用します。

#使うAPI
ZAIFのAPIを使って、XEMの日本円価格を取得しようと思います。
以下のURLを開くと、
https://api.zaif.jp/api/1/ticker/xem_jpy

以下のJSONデータが返ってきます。
※2018年3月17日時点の価格です

```json:json
{"last": 35.91, "high": 40.9876, "low": 35.5209, "vwap": 37.2726, "volume": 38072152.9, "bid": 35.95, "ask": 35.987}
```

このデータを活用します。サンプル1でコードと解説を載せますね。

#サンプル1:ZAIFからXEMの日本円価格を取得する
##コード
実行環境が無い方はpaizaで試せます。
https://paiza.io/ja

```python:Python3
import requests
import json

zaif_xem_api = 'https://api.zaif.jp/api/1/ticker/xem_jpy'
xem_jpy = requests.get(zaif_xem_api).json()
print(json.dumps(xem_jpy,indent=4))
```

##結果の例
```json:json
{
    "high": 40.9599,
    "volume": 37915944.3,
    "ask": 35.9,
    "bid": 35.83,
    "last": 35.9,
    "vwap": 37.255,
    "low": 35.5209
}
```

##解説
APIの仕様はZaif Exchange APIドキュメントで解説されていますが、それぞれの値の意味を引用します。

>| キー | 詳細 | 型 |
|:--|:--|:--|
| last | 終値 | float |
| high | 過去24時間の高値 | float |
| low | 過去24時間の安値 | float |
| vwap | 過去24時間の加重平均 | float |
| volume | 過去24時間の出来高 | float |
| bid | 買気配値 | float |
| ask | 売気配値 | float |
(引用元)http://techbureau-api-document.readthedocs.io/ja/latest/public/2_individual/4_ticker.html

XEMの価格を知りたいので、過去24時間の加重平均が分かる「vwap」を使いましょう。サンプル2で「vwap」を使って、XEMの枚数を掛け算します。

#サンプル2:XEMの価格を日本円で表示する
##コード
実行環境が無い方はpaizaで試せます。
https://paiza.io/ja

```python:Python3
import requests
import json

# 1.NEMのアドレスからXEMの枚数を取得する
node = 'http://104.128.226.60:7890' #テストネットのノードです
api = '/account/get'
parameter = 'address=TCJC5VFBIYF5TKEUS273XS7IXUKJ36I3JCJQ7WOH'
url = str(node + api + '?' + parameter)
nem_account = requests.get(url).json()

# 2.取引所のAPIを使ってXEMの日本円価格を取得する
zaif_xem_api = 'https://api.zaif.jp/api/1/ticker/xem_jpy'
xem_rate = requests.get(zaif_xem_api).json()

# 3.1と2を掛け算する
xem_jpy = (nem_account['account']['balance'] / 1000000) * xem_rate['vwap']

# 結果表示
print('xemの価格：' + str(xem_jpy) + '円')
print('↓参考↓')
print('xemの枚数：' + str(nem_account['account']['balance'] / 1000000) + 'xem')
print('xemの1枚あたりの価格：' + str(xem_rate['vwap']) + '円')
```

##結果の例
```
xemの価格：3065.00259円
↓参考↓
xemの枚数：82.7xem
xemの1枚あたりの価格：37.0617円
```

##解説
サンプル1でAPIの使い方を解説したので、あまり解説することはありませんが、、、

xemの枚数が小数点付きで返ってこないので、xemの枚数を割る1000000してから1枚あたりの日本円価格と掛け算しています。

```python:Python3
# 3.1と2を掛け算する
xem_jpy = (nem_account['account']['balance'] / 1000000) * xem_rate['vwap']
```

#次回
[Python3でNEMのAPIを叩く-006-アカウントが作成したモザイク定義を取得<準備編>](https://qiita.com/oden_umai/items/a835355fcbdbaefb8936#_reference-f07092d42e3d5b50dbbe)
Google Chromeインストール[On Ubuntu 16.04 LTS]

Ubuntuには、firefoxがデフォルトブラウザとしてインストールされていますが、いつも利用しているChromeが使いたいので、インストールしました。

#前提条件
- Ubuntu 16.04.3 LTS

#インストール
それでは、インストールしていきます。

##Chromeのリポジトリを追加する。
Chromeのリポジトリを追加します。

```
$ sudo sh -c 'echo "deb http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list'
```

##公開鍵の登録
公開鍵をダウンロード＆追加登録します。

```
$ sudo wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | sudo apt-key add -
```

###パッケージリストのアップデート
パッケージリストを更新します。

```
$ sudo apt-get update
```

###Google Chromeのインストール
最後にGoogle Chromeをインストールします。

```
$ sudo apt-get install google-chrome-stable
```

###起動確認
ターミナルで以下のコマンドを実行すると起動します。

```
$ google-chrome
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/100712/bda626b3-25ad-04c9-e951-c8042b780861.png)

あとは、Launcherに登録しておけば、次回からはGUIベースで起動できます。
以上です。
Emacs: recentf を ido 等のインターフェイスで使う

# recentf-find-file.el

`recentf` はメニュー式なので、普段使いの ido で使いたいと思い書いたものです。

icomplete, icicles, ivy 等でも動くようですが、 zlc では動きませんでした。

テストしていて気づいたのですが icicles では 
`icicle-recent-file` というのがはじめからあるようです。

# インストール

こちらから[ダウンロード](https://gist.github.com/s-fubuki/8f8d292683efd52aab18cc182513d068)し、 `load-path` の通ったディレクトリに配置して
 `init.el` に以下の 1行を追加して、空いているキーにバインドすれば OK です。
勿論 recentf の設定がないと動きません。

```emacs-lisp:init.el
(require 'recentf-find-file)
(global-set-key "\C-cr" 'recentf-find-file)
```


# recentf の参考設定
参考までに自分の設定です。

```emacs-lisp:init.el
(setq recentf-max-saved-items 300)                 ; max
(setq recentf-exclude '("ido\\.last" "bookmarks")) ; 除外するファイル
(global-set-key [f11] 'recentf-open-files)
(recentf-mode)
(recentf-open-files)
(define-key recentf-dialog-mode-map " "      'next-line))
(define-key recentf-dialog-mode-map [?\S-\ ] 'previous-line)
```

# 動作確認している Emacs のバージョン
>  GNU Emacs 25.3.1 (i686-w64-mingw32) of 2017-09-18
Ubuntu 16.04 で python3.6-dev のインストールに失敗する場合の対処法

Ubuntu 16.04 で python3.6-dev のインストールが必要になった際、以下のようにエラーになることがあります。

```
$ sudo apt-get install python3.6-dev
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
E: パッケージ python3.6-dev が見つかりません
E: 'python3.6-dev' に一致するパッケージは見つかりませんでした
E: 正規表現 'python3.6-dev' ではパッケージは見つかりませんでした
```

このような場合は以下のようにするとインストールできます。

```
sudo add-apt-repository ppa:deadsnakes/ppa
sudo apt-get update
sudo apt-get install python3.6-dev
```

### 参考になった記事
[How do I install Python 3.6 using apt-get?](https://askubuntu.com/questions/865554/how-do-i-install-python-3-6-using-apt-get)
CentOS7でネットワークに接続する方法

CentOS7をVirtualBoxで動かしていて、はじめにネットワークに接続できなかったが、これをやったらできるようになりました！

起動して、
`nmcli d`

![nmcli_d.png](https://qiita-image-store.s3.amazonaws.com/0/107200/b513cc51-cbc9-4eaf-6b01-9ea1fb6180c9.png)
このように出力されます。

この、CONNECTIONがdisconnectedになっていたら接続されていません。

`nmcli con on enp0s3`
と、ここでは打ちます。（enp0s3はそれぞれの環境に置き換えてください。）

もう一度、
`nmcli d`
で確認してみてください。

自動接続するには、
`nmcli con mod enp0s3 connection.autoconnect yes`

接続されたことを確認するために、
`curl inet-ip.info`でグローバルipを確かめたり、ping接続してみたりしてください。

##参考文献

Life with open mind「NetworkManagerの設定変更、nmtuiとnmcliについてまとめたよ！」
[http://blog.yuryu.jp/2014/07/networkmanager-nmtui-nmcli.html](http://blog.yuryu.jp/2014/07/networkmanager-nmtui-nmcli.html)

ikechampionのブログ「NetworkManagerの設定（CentOS7に慣れる）」
[http://ikechampion.hatenablog.com/entry/2014/07/23/195958](http://ikechampion.hatenablog.com/entry/2014/07/23/195958)
【edgeバグ】backgroundで入れたsvg画像がウィンドウサイズによって幅が変わってしまう問題【未解決】

どうも、フロントエンドエンジニアのくらげです。
今回、webサイトを作っていて、svg画像の表示がどうしてもうまく生かず、予想外に時間を取られたので共有しておこうかと思います。

## やりたかったこと
illustratorで書き出したsvgのアイコンを、固定サイズで画面に表示させたかった。

## 問題
chromeだと問題なく表示された。
が、edgeでみてみると、svg画像が切れて表示されている...
もう少し調べてみると、ウィンドウ幅を変えるたびに切れたり切れなかったりする。
つまりウィンドウの比率によって画像サイズが変わっている？？？

## コード
```html
<div class="box">
  <p>mozimozimozi</p>
</div>
```

```css
.box {
  background-color: blue;
  width: 500px;
  height: 70px;
  font-size:24px;
  color: #FFFFFF;
  position: relative
}
.box::after {
  content: "";
  position: absolute;
  top: 5px;
  right: 5px;
  width: 10px;
  height: 10px;  
  background-image: url(ここに画像指定);
}

```

## やってみたこと
- svgデータにwidthとheightの情報を追加してみる。
- illustratorで画像を書き出し直す。
- 擬似要素のbefore,afterのbackgroundに表示させていた部分をやめる
- background-sizeを指定する

どれも解決できず。

## 代価案
- imgタグで入れる
- svgタグで入れる
- 切れても大丈夫なように少し余白をつけて書き出す

結局、今回はimgタグで入れることにしました。
imgタグで入れた場合、ウィンドウサイズを変えても、上記のような問題は起こりませんでした。
また、会社の同期は書き出し段階で少し隙間を作って書き出したと言っていました。

もし、この問題の原因や解決方法を知っておられる方いらっしゃったら教えていただけると嬉しいです。
gitについて全然理解できてなかったので、基本のキをまとめてみた

## gitってなに？
ファイルの変更履歴を記録する、バージョン管理システムのこと

## 頻出用語の意味 Part1
### リポジトリ  
ディレクトリ、ファイル、変更履歴を保管する場所

#### リモート（共有）リポジトリ
サーバー上に存在し、複数の利用者で共有するリポジトリ

#### ローカルリポジトリ
作業者の手元に存在するリポジトリ

### 作業ツリー（作業ディレクトリ、ワーキングツリー）
作業者が実際に作業するときに使用しているディレクト

### ステージングエリア（インデックス）
編集したファイルをリポジトリへ保存する前に一時的に保管する場所
変更されたファイルだけが保管される

### コミット
変更を確定し、ローカルリポジトリに反映させること
ステージングエリアにあるファイルをローカルリポジトリへ渡す

```ruby:ターミナル
git commit [オプション]
```

### プッシュ(push)
ローカルリポジトリでの変更をリモートリポジトリへ反映させること
変更されたファイルをリモートリポジトリに渡す

```ruby:ターミナル
git push [オプション]
```

### プル(pull)
他の人が登録した変更記録をローカルリポジトリに反映させること
リモートリポジトリに保管された変更ファイル、変更履歴をローカルリポジトリに持ってくる

```ruby:ターミナル
git pull [オプション]
```
### クローン(clone)
ローカルで作業を進めるために、リモートリポジトリをローカルリポジトリにコピーすること

```ruby:ターミナル
git clone [オプション]
```

### ブランチ
メインとなる変更履歴の流れとは別に、枝分けし変更棋歴を分岐させて記録していくもの

```ruby:ターミナル
git checkout -b ブランチ名    ### 新たなブランチを作成し、そのブランチに切り替える場合
```

### マージ
別ブランチで変更した履歴を、メインとなる変更履歴の流れと合体させること

```ruby:ターミナル
git merge ブランチ名
```


## チーム開発の流れとgitコマンド
<img width="1379" alt="スクリーンショット 2018-03-17 8.45.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/242288/c85952d8-d8d9-d0a6-e596-fdada8621150.png">


今回は、複数人でのチーム開発を想定し、チーム開発の流れとgitコマンドの使い方を図を用いて説明します。

⓪ プロジェクトリーダーがサーバー上に`リモートリポジトリ`を作成します。
① 開発者Aさんは作成されたリモートリポジトリを`git clone`コマンドで自分のローカル環境にコピーしてきて、`ローカルリポジトリ`が出来上がります。
② 開発者Aさんは、自分の作業用ブランチを作成（きります）します。
③ 開発者Aさんは、割り振られた担当の作業を`ワークツリー`上で行います。
④ 開発者Aさんは、編集作業が完了すると`git add`コマンドで、変更されたファイルを`ステージングエリア`へ移します。
⑤ 開発者Aさんは、`ステージングエリア`に移されたファイルを `git commit`コマンドでローカルリポジトリへ記録します。
⑥ 開発者Aさんは、ローカルリポジトリに反映された変更記録を`git push`コマンドでリモートリポジトリへ送信します。
⑦ 開発者BさんもAさん同様、変更記録をリモートリポジトリへ送信します。
　 開発リーダーは、Bさんの変更履歴を確認して、メインの`ブランチ`にBさんの変更履歴を`マージ`します。
⑧ 開発リーダーは、Bさんのときと同様にAさんの変更履歴を確認し、Aさんの変更履歴をメインの`ブランチ`に`マージ`します。
⑨ 開発者Aさんは、次なる編集作業を行うべく、`git pull`コマンドで、現状(AさんBさんの変更が記録された状態)のリモートリポジトリをロカールリポジトリへ持ってきます。

以降は、②から⑨の繰り返しとなります。
Python3.6で仮想通貨API で情報を取得

#1 APIのアカウント作成

#2 Pythonコード取得
https://www.satori.com/livedata/channels/cryptocurrency-market-data

```python
#!/usr/bin/env python

from __future__ import print_function

import sys
import time

from satori.rtm.client import make_client, SubscriptionMode

endpoint = "wss://open-data.api.satori.com"
appkey = undefined
channel = "cryptocurrency-market-data"

def main():
    with make_client(endpoint=endpoint, appkey=appkey) as client:
        print('Connected to Satori RTM!')

        class SubscriptionObserver(object):
            def on_subscription_data(self, data):
                for message in data['messages']:
                    print("Got message:", message)

        subscription_observer = SubscriptionObserver()
        client.subscribe(
            channel,
            SubscriptionMode.SIMPLE,
            subscription_observer)

        try:
            while True:
                time.sleep(1)
        except KeyboardInterrupt:
            pass


if __name__ == '__main__':
    main()
```

#3 Python 2.7.6以後の環境構築：Python 3
* [CentOS7にPython3をインストール](https://qiita.com/estaro/items/5a9e4eb8f0902b9977e3)

```bash
sudo yum install -y https://centos7.iuscommunity.org/ius-release.rpm

yum search python36
sudo yum install python36u python36u-libs python36u-devel python36u-pip

cd ~/
wget https://bootstrap.pypa.io/get-pip.py
sudo python get-pip.py

# Python 3 Library
sudo python3.6 -m pip install satori-rtm-sdk

```

#4 実行

```bash
[centos@zzeng-test1 ~]$ python3.6 aaa.py
Connected to Satori RTM!
Got message: {'exchange': 'Bitstamp', 'cryptocurrency': 'BTC', 'basecurrency': 'USD', 'type': 'market', 'price': '8499.73', 'size': None, 'bid': '8491.83', 'ask': '8499.73', 'open': '8265.05', 'high': '8613.06', 'low': '7914.08', 'volume': '15827.26995771', 'timestamp': '1521243406'}
Got message: {'exchange': 'POLONIEX', 'cryptocurrency': 'GAME', 'basecurrency': 'BTC', 'type': 'market', 'price': '0.00014728', 'size': None, 'bid': '0.00014785', 'ask': '0.00014967', 'open': None, 'high': '0.00014989', 'low': '0.00013951', 'volume': '8.66189614', 'timestamp': None}
Got message: {'exchange': 'HitBTC', 'cryptocurrency': 'EOS', 'basecurrency': 'ETH', 'type': 'market', 'price': '0.008410', 'size': None, 'bid': '0.008383', 'ask': '0.008427', 'open': '0.008405', 'high': '0.008535', 'low': '0.008241', 'volume': '19129.43', 'timestamp': '1521243310'}
Got message: {'exchange': 'OKCoin', 'cryptocurrency': 'ETC', 'basecurrency': 'USD', 'type': 'market', 'price': '19.071', 'size': None, 'bid': '19.021', 'ask': '19.3', 'open': None, 'high': '19.559', 'low': '18.251', 'volume': '341.857', 'timestamp': '1521243410884'}
```
RHEL7からのサービス管理(systemd)を使ってオラクル自動起動設定をしてみた

RHEL7よりサービスの管理方法が、initからsystemdに変更されました。
私もOracleの自動起動設定を追加してみたので、手順を記載します。

#１．設定ファイル作成
##環境変数を設定するファイルを作成
事前にenv等で、パスを確認し、自身の環境を設定

```
# vi /etc/sysconfig/env.oradb

ORACLE_BASE=/opt/app/oracle/
ORACLE_HOME=/opt/app/oracle/product/バージョン/dbhome_1　　
ORACLE_SID=XXX
```



##Listener起動用ファイルを作成
書式[ サービス名.service ]

後に自分がサービス状態の確認をする際のサービス名としても使用するので分かりやすく指定したほうが良い。例では、oralsnr.serviceとした

```
# vi /etc/systemd/system/oralsnr.service

[Unit]
Description = Oracle Listener　←タイトル的なもの
After=network.target　　　　　　←このサービスより前に起動しておくサービスを設定
　　　　　　　　　　　　　　　　　　Beforeの場合は対象サービスより前にこのサービスを起動
[Service]
Type=forking　　　　　　　　　　 ←バックグラウンドに処理を引き渡すタイプの起動判断設定
EnvironmentFile=/etc/sysconfig/env.oradb　　　　　　←環境変数ファイルのパス
ExecStart=/opt/app/oracle/product/バージョン/dbhome_1/bin/lsnrctl start　　←サービス起動時のコマンド
ExecStop=/opt/app/oracle/product/バージョン/dbhome_1/bin/lsnrctl stop　　　←サービス停止時のコマンド
Restart=always　　　　　　　　　←サービス停止時は常に再起動を試みる
User=oracle　　　　　　　　　　 ←実行する際のユーザ
Group=oinstall                ←実行する際のグループ

[Install]
WantedBy=multi-user.target　　←サービスをenableにした際に自動起動用のショートカットを作成してくれる
```


##DB起動用ファイルを作成
Listener起動用の設定と同様に設定を行う

```
# vi /etc/systemd/system/oradb.service

[Unit]
Description=Oracle databaes service
After=network.target oralsnr.service　　　　　　←lsnrは先に起動するように設定

[Service]
Type=forking
EnvironmentFile=/etc/sysconfig/env.oradb
ExecStart=/opt/app/oracle/product/バージョン/dbhome_1/bin/dbstart /opt/app/oracle/product/バージョン/dbhome_1
ExecStop=/opt/app/oracle/product/バージョン/dbhome_1/dbhome_1/bin/dbshut /opt/app/oracle/product/バージョン/dbhome_1
Restart=always
User=oracle
Group=oinstall

[Install]
WantedBy=multi-user.target
```

#２．設定
##サービスファイルを systemd に反映
```
# systemctl daemon-reload
```

##サービスの自動起動設定
```
# systemctl enable oralsnr
Created symlink from /etc/systemd/system/multi-user.target.wants/oralsnr.service to /etc/systemd/system/oralsnr.service.
```

```
# systemctl enable oradb
Created symlink from /etc/systemd/system/multi-user.target.wants/oradb.service to /etc/systemd/system/oradb.service.
```

#３．起動確認
再起動

```
shutdown -r now
```

起動完了後、oracleのステータス確認

```
# systemctl status oralsnr.service
```

```
# systemctl status oracdb.service
```

「.service」を除いて、「systemctl status oracdb」にしても確認できる。状態がrunningになっていれば起動完了。

#ちなみに
***・設定ファイルについて***
設定ファイルの格納先の「/usr/lib/systemd/system/」と「/etc/systemd/system/」の違いは、「/usr/lib/systemd/system/」がデフォルトのサービス格納先、「/etc/systemd/system/」が自身で設定を変更する際の格納先。
「/usr/lib/systemd/system/」に入っているサービスの設定を書き換えたいと思ったら、「/etc/systemd/system/」にコピーして使用する。

***・自動起動順序について***
オラクルが完全に立ち上がってから、業務APを起動させたいと思った際は、systemdのみでの設定は難しい。なぜなら、systemdではバックグラウンドプロセスの起動状態まで監視しないからだ。
「Type=forking」は、バックグラウンドに処理を引き渡すタイプの起動タイプだが、フロント側が起動した時点で、起動完了とみなしてしまう。Before、Afterで起動順序を決めていても、オラクルのバックグラウンドプロセスが完全に立ち上がっていなければ、業務APもコケてしまうだろう。
もし、設定をしたいのであれば、スクリプトの修正をするか、強引にはなるが、timer設定で、業務APプロセスを遅らせるなどの方法はある。


#参考資料
[RHEL 7 における systemd の概要](https://access.redhat.com/ja/articles/1379593)
[Systemd入門(4) - serviceタイプUnitの設定ファイル]
(http://enakai00.hatenablog.com/entry/20130917/1379374797)
Windows 10 ツールリスト 2018年4月版

まもなく新年度。新入社員さんや新入生さんのWindows環境のセットアップの機会も増えると思い、備忘録を残します。

# ターゲットOS

+ Windows 10 Pro Creators Update (1703)


# テキストエディタ

+ 秀丸エディタ 64bit版 ver 8.77
+ Sublime Text 64bit版 ver 3.0
+ Visual Studio Code x64版 ver 1.21.0

> 新しいテキストエディタが次々と登場する中、新旧何が良いのか試行錯誤中です。 :wink: 

# ターミナル

+ Tera Term 64bit版 ver 4.98
+ RLogin x64版 ver 2.23.2

> これまでTera Termのお世話になって来ましたが、RLoginに浮気をしてみました。RLoginは接続先設定の保存やタグ切り替え機能があり重宝しています。

# 比較(diff)ツール

+ WinMerge 64bit版 ver 2.14.0.148+-jp-148 with 日本語Extention

# バイナリ・エディタ

+ Stirling ver 1.3.1

> 1999年6月開発終了。 lzh形式での配布しかないためWin10 Creators Updateでは展開できませんでした。わざわざUbuntuでlzhを展開してWin10へ持っていくという一手間が必要でした。さりとて、現時点で漢字も扱えるバイナリ・エディタで適当なものを見つけることができませんでした。"Binary Editor BZ" が良いのでしょうか？

# git

+ Atrassian SourceTree for Windows ver 2.4.8.0

# 画面キャプチャ

+ Monosnap ver 3.0.6

> Windows版 Skitch は2015年12月以降、開発停止。2016年1月以降、ダウンロード停止。Skitchと似たようなアプリを探した結果、Monosnapにたどり着きました。今のところ機能に不満なし。
文字列のダブルクォーテーションの扱いに関して

#パースエラー
以下のコマンドのエラーの原因を考えてみましょう

```bash
ruby -e " 100.times{|n| puts "a" } "
```

シンタックスハイライトを見ればわかる通り、aの部分をも文字列として扱いたいのに途中でダブルクォーテーションが使われているため、以下のようなエラーが表示されます。(ruby 2.5.0p0 (2017-12-25 revision 61468) [x86_64-linux]を使用しました。)

```
-e:1:in `block in <main>': undefined local variable or method `a' for main:Object (NameError)
	from -e:1:in `times'
	from -e:1:in `<main>'
```

おもな回避方法は２つあります。

#シングルクォーテーションに置き換える
以下の二つのコードはエラーが出ずにきちんと表示されます。

```bash
ruby -e '100.times.do{|n| puts "a"}'
```

```bash
ruby -e "100.times.do{|n| puts 'a'}"
```
上のコードははじめと終わり、下のコードは２番目と３番目をシングルクォーテーションに置き換えました。もし、はじめのダブルクォーテーションだけを置き換えたら何が起こるでしょうか？

```bash
ruby -e '100.times{|n| puts "a"}"
```

文字列のはじめを表すシングルクォーテーションしかないため、エンターを押してもコマンドが終わってないものだと認識され、入力の続きを求められます。
こういう場合は```Ctrl + D```一回使って終わらせましょう。（押す回数は一回で大丈夫です）

#エスケープシークエンスを使う。
ダブルクォーテーションを使った文字列の中でどうしても、ダブルクォーテーションを使いたいというときがあると思います。そういう時に使うのがエスケープシーケンスです。
使い方は文字列として扱いたいダブルクォーテーションの前にバッククォート(Windowsなら￥)を入れるだけです。

```bash
ruby -e "100.times{|n| puts \"a\"}"
```
Golangでhttp.getをリトライする

再帰処理をしてリトライする。

リトライ数が増えるたびに10秒タイムアウトを伸ばす

```main.go
func HttpGet(url string, reTry int) *http.Response,error {
	client := &http.Client{Timeout: time.Duration(10*(10-reTry)) * time.Second}
	resp, err := client.Get(url)
	if err != nil {
		if reTry == 0 {
			return nil,error
		}
		return HttpGet(url, reTry-1)
	}
}
```

PS.再帰処理ってほとんど有用性無いような気がするのは俺だけ？
エンジニアの新人育成—「とにかくテキスト化！」で プロジェクト理解、実装理解を伸ばそう。


ビギナーのプロジェクト理解や実装理解の部分を伸ばしたい。
だけど「理解」というものは、プログラムのようにコードでは見えるものではないだけに、教え方にコツがいる。

そのために「テキスト化」が良いんじゃないかと思い、実践している。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/edd1c325-0a96-1ce2-2305-65bb34db25fc.png)

# 前提

- アジャイル開発
  - 朝会、夕会 (スタンドアップミーティング) をやっている

# 例

- 朝会、夕会の内容をテキストにしてもらう
- 実装やプロジェクトに関して、何かの説明をしたら、テキスト化してもらう。
- 会議やミーティングの内容をテキストにまとめてもらう

これをチームがチェックして、添削する。
間違っているところがあったら、口頭やチャットツールなどで指摘して、またテキストを修正してもらう。

# 狙い

- インプットとアウトプットをセットにすることで、ビギナーの基本的な理解を深めたい。
  - インプットだけではなかなか身につかない
- ビギナーが理解できたかどうかを、チームが目に見える形で確認できるようにしたい。
  - 「分かったかどうかが、分からない状態」を避けたい。
- ビギナーの学習コストを最大化して、チームのコストを最小化したい。
  - テキスト化には時間とコストがかかるが、テキストの添削は一瞬で終わらせやすい。(うまくいけば)
- 10の理解で100進んでもらうよりも、20の理解で50進んでもらった方が、圧倒的に手戻りが少ない。

実感として、かなり効果があるんじゃないかと思っている。

# 合言葉は「とにかくテキスト化」。

「じゃあ、テキストにまとめてください」を口癖にする感じ。

# ミニ朝会での例

## 今までのやり方

ビギナーにプロジェクトや実装理解を深めてもらう機会として、朝会の後に「ミニ朝会」というのを開いて、ビギナーが気になる点、分からない点をキャッチアップしていた。

(参考 [エンジニアの新人教育 〜メンターとビギナーの日々是セッション〜 - Qiita](https://qiita.com/YumaInaura/items/128d1e37f7f72f176d87) )

## 問題点

- 口頭で話しながら手厚く教えることは、チームの時間的、エネルギー的なコストが大きい。(本当はそうしたいが、出来ないこともある)
- チームのコストを最大化することで、逆にビギナーの学習成果を最小化してしまっている恐れがある。
- ビギナーが本当に理解できたかどうかをチェックする仕組みがない。
- 「気になることがなかった時」にキャッチアップできない。

最初の段階では、手厚いやり方は良いかもしれないが、この方法をずっと続けるのは難しそうに感じた。

## ボトルネック

- 朝会、夕会は実装理解の大きなチャンスだと思うが、この時間が学習システムとして働かず、大きな空白になっているのではないかと考えた
  - 目の前に金塊があるのに、毎日、持ち帰らない状態。
- まずはチャンスを最大に活かしてもらいたいと思った。
- 「まずはコストを支払って、理解すること」「理解の姿勢を持つところ」「金塊を持ち帰るところ」から始めてもらう。




## 具体的な手順

### 1.テキスト化

- 朝会・夕会で分かった内容をビギナーにテキスト化してもらう
- メンターがそれをチェックする

### 2.キャッチアップ

- ツッコミどころがあれば指摘する
  - テキストの添削や、口頭での指摘をおこなう
- 他にも気になること、分からないことがあれば教える
  - 図を描いたり、演説調で話したり、ビギナーのディスプレイを指出ししながら話したり

### 3.またテキスト化

- 理解を修正、オーバーライドした内容を、ビギナーにテキスト化してもらう

### 4.またキャッチアップ

- メンターがまたそれをチェックする

### 5.一粒で二度美味しい

Pivotal(ストーリーの内容をメモする場所)とかに記載してもらえば、記録は残るし、ビギナーの理解は深まるし、悪くない。

## 余談

朝会に参加するというのは、ものすごく難易度が高いと、個人的に思っている。
リアルタイムに、一瞬一瞬でやりとりされる情報をキャッチして、実装理解・状況理解のモデルを頭で組み立てつつ、自分の言うことも考える必要がある。

ちょっとしたスキがあると、自分の思考だけにとらわれて、上の空になりがちだ。

「朝会に自然に参加できるようになったなら、チームへのコミット度は一人前」ぐらいの、リトマス試験紙のようなものだと思っている。

# まとめ

コスト配分や、その種類について考えよう。

たとえばこの例でいうと、ビギナーに大きなコストを支払ってもらうことが、ビギナーとチーム、両方のメリットを最大化してくれると思った。

# イラスト

- [金の延べ棒のイラスト | かわいいフリー素材集 いらすとや](http://www.irasutoya.com/2014/04/blog-post_3912.html)








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
progatePHPレッスン１、HTMLレッスン１終了。

JAVAをやっていたんだけど有料コンテンツになったのでとりあえず他の言語も有料部分までやって、それから有料版に移行しようと考え中。

何で無料なのにPHPのレッスン1終わってHTMLに移行したかっていうと、HTMLに関してもうちょっとしっかり学習しておかないとPHPだけやっても導入の仕方を理解しきれないと思ったので。

htmlの本って結構分厚かったりして全部読み切れなかったりするからすごい部分的にかいつまんでwebサイト作ってたけど、勉強しなおすとやっぱり勉強できてないなと感じる

progateは安いしわかりやすいし結構要点を抑えてあるから辞書みたいな本とにらめっこして全部覚えていくよりはいいんじゃないかなと思う
Rubyでのダブルクオーテーション(")をエスケープ処理する方法

```sh
ruby -e "puts \"a\""
```

:point_up:

導入よりコードを‥

参考:
[バックスラッシュ記法によるエスケープ - 文字列 - Ruby入門](https://www.rubylife.jp/ini/string/index2.html
"")

ブクマの様子:
[はてなブックマーク - バックスラッシュ記法によるエスケープ - 文字列 - Ruby入門](http://b.hatena.ne.jp/entry/s/www.rubylife.jp/ini/string/index2.html
"")


導入文をここに書く
ここに書く内容が[人気の記事ページ](http://qiita.com/popular-items)やはてブなどでシェアされる際の概要文となる

:point_up:
How to use Tornado as python web framework #2 - tornado-JSON

# Overview

[How to use Tornado as python web framework](https://qiita.com/ainamori/items/44deede7182027d225d2)の続き

Tornado を使って INPUT/OUTPUTの　validation checkが入ったAPIを作ってみる

# Requirements

- Python 3.4 or Higher
- Tornado
- tornado-JSON

Python, Tornado は前述の記事でインストール済みだが、
INPUT/OUTPUT validation を実装するに辺り[tornado-JSON](https://github.com/hfaran/Tornado-JSON)を使用する。

前の記事で、requirements.txt に以下の行を追加すれば、Docker Imageの作り直しで
tornado-JSONがインストールされる。

```
$ ls
Dockerfile  __init__.py  requirements.txt
$ cat requirements.txt
tornado==4.5.3
tornado-JSON==1.3.2
...

なお、Dockerを使わず、Bare-Metalな環境で使っている場合は以下のようにしてインストールする。
CentOSでPython34などを使っている場合は pip3 を使う。

```
 pip install tornado-JSON
```

# How to use - tornado-JSON解説

[こちら](https://qiita.com/kishi-yama/items/ad3f23b9703f8c7c6167)の記事に
tornado-json自体の使い方は記載されているので、tornado-json のデモの使い方などについては割愛する。

## Enhanced using

### APIドキュメントの自動生成ロジック解説

[こちら](http://tornado-json.readthedocs.io/en/latest/docgen.html)に```tornado_json.api_doc_gen```が呼ばれれば生成する、と記載があるが
具体的に作られるのかはDemoを見ろ、と有るのでどこでやっているのかと思ったが
hello_world.py の```generate_docs=True``` の部分だった。

```
application = Application(routes=routes, settings={}, generate_docs=True)
```

Applicationを呼ぶ際にこのパラメータを付ける事で```tornado_json.api_doc_gen```tornado_json.api_doc_gen```が呼び出され、
起動ディレクトリにAPI_Documentation.md が作られる。

### handler の使い方

同じくDemoを見ると以下のようになっている。
ここをそれぞれapp.py等の起動ディレクトリを起点にディレクトリを指定するようだ。
つまり以下の内容は helloworld ディレクトリを import 及び search 対象とする、ということ。

```
import helloworld
routes = get_routes(helloworld)
```

後は、ディレクトリにある.pyファイルに ViewHandler, APIHandler が入っている物を取り出すようになる。

### Plain/Text の返し方

ViewHandlerを使えば plain/text がセットされる、とあるが
return をどう書けば良いかというと以下の通り

```
class ReturnTextHandler(ViewHandler):
    """Return POST body by 'plain/txt' format"""
    def post(self):
        self.write(self.request.body)
        self.flush()
```

return で単純に request.body を渡したり self.success のような
helloworld等にあるサンプルを貼り付けるだけでは駄目のようだ。
エンジニアリングでよく使う英単語

#エンジニアリングでよく使う英単語
##概要
エンジニアリング中でよく出会う単語はどこでも一定数は同じだと思います。
似た意味の単語や、使うに辺り注意が必要な単語は予め把握しているといいと思います。

##意味の近い単語
###name/title
**name** は名前 - 人・物etc 物理的に実態があるものに対して利用することが多い
**title** はタイトル - 表題・題名etc 物理的に実態がないものに対して利用することが多い

###id/code
**id** はIDentification (身元確認) の略、文字や数字に多少の意味を持つことが多い 例「USER01」(userの1番目と推測できる)
**code** は符号、記号、暗号特定の意味を持つものを暗号化する際、何かしらの認証に用いるための暗号文などに用い、法則などを知らない限りそこから意味はわからない 例「v9j83hs」
どちらも重複しないように一人一人に別々の文字列を割り当てるということは共通


###user/member/admin
**user** 人・アカウントのことを指す
**member** なにかに属しているuser
**admin** 管理権限を持っているuser
roleを使用する際は、owner,super_user,manager等の役職を用いることが多い

###contact/request/send
**contact** は「問い合わせ」連絡を取る、接触する、くらいの軽い感じ
**request** は「申請」依頼、要請。規定のものに対して、返答を求める、硬いイメージ
**send**　は「送る」という行為そのもの
フォーム関係で利用するが、意味や役割は異なる。

###faq/questions
**faq**　はFrequently Asked Questionsの略、多くの人が当てはまる中でわからない人がいるものに対しての質問解答のイメージ。
**questions**　当てはまる人がたまにいるので、事前に答えを書いておくというイメージ。
どちらも「よくある質問」にされることが多いが、かまえ方が異なる。

###voices/case
**voices**　は個人(toC)の意見、あくまでも個人の1意見。感覚ベース
**case**　は企業・プロジェクト(toB)、実際にあった事実に基づく情報。実績ベース

###update/upgrade/edit
**update**　は改訂・更新、
**edit**　は編集、updateするためにeditをするというイメージ
**upgrade**　は等級・品質などを上げること。versions等向上する更新。

###category/genre
**category** 範疇、部門、区分、種類、元はギリシャ語の「告訴、断定」
**genre**　類型、形式、様式、元はフランス語の「種類」
正直どちらも似ていますが、categoryの方が大きい種類、genreの方が小さい種類の使い方をされているイメージがあります。
小型犬categoryのチワワというgenreのようなイメージ。
小型犬genreのチワワというcategoryという使われ方には違和感がある。

###info/news
**info**　informationの略、情報、知識 全員に向けて発信するお知らせ
**news**　報道、情報 特定の対象に向けて発信するお知らせ

##注意が必要な単語
rails限りですが、table定義にて使用するのに注意が必要な単語をいくつか共有します。
###type
STIを用いる際にtableのclassを格納するために予約されている。
categoryやgenreで代用する
###write
seed_fuの中にあるWriterClassとかぶるため、初期データをseed_fuから入れることが出来ない。
通常のseedから入れることで対応可能。
https://github.com/mbleigh/seed-fu/blob/master/lib/seed-fu/writer.rb

###class
予約語です。
部類という意味なら、rank、grade、
学級、組という意味なら、roomなどに変えるとよいでしょう。

###delete
予約語です。
削除済みかを判断するなら、is_deletedにしてfalseなら生きている。
trueなら削除済みとするのが良いと思います。

###open
予約語です。
開いている・公開状態ならis_openにしてtrueなら開いている。
trueなら閉じているとするのが良いと思います。

####予約語とは
railsが既にその名前を利用(予約)している言葉です。
予約語を使用とした場合、使用することが出来ずにエラーになってしまいます。
どんな予約語があるかは、調べてみるといいかもしれません。
http://source.hatenadiary.jp/entry/2016/12/15/131754

##意見がほしい単語
###自分がフォローしている人
自分の事をフォローしている人はフォロワー。
逆に自分の事をフォローしている人を総称して何というのがベストなのか。

###descriptionを利用しているgem
gemの中でdescriptionというカラムがアレば自動で説明文として扱う。
という機能を持ったgemがあったはずなのですが思い出せず。。。
Rails用にruby-onbuildにyarnを追加してbuildするdockerfile

Dockerイメージの[ruby:2.4-onbuild](https://hub.docker.com/_/ruby/)でRails5.1を動かすためのDockerfileサンプル。
ruby-onbuildにyarnを追加する情報が少なそうだったので書き残す。

### ポイント
0. ruby公式イメージはdebianベース
1. yarn向けにnodejsのバージョンが足りないため現在の最新版node9を追加
2. yarnリポジトリを追加してインストール

※依存関係の用意が不足しているとbuildエラー`E: Unable to locate package yarn`等が出る。

### 結果こんな感じ

``` shell:Dockerfile
# WORKDIR = /usr/src/app
FROM ruby:2.4-onbuild

RUN bundle config --delete frozen \
 && apt-get update -qq && apt-get install -y build-essential \
 && curl -sL https://deb.nodesource.com/setup_9.x | bash - \
 && apt-get install -y nodejs \
 && curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - \
 && echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list \
 && apt-get update && apt-get install yarn \
 && rm -rf /var/lib/apt/lists/*
```

### 参照
Cannot install yarn from docker image ruby:2.3-slim · Issue #2888 · yarnpkg/yarn
https://github.com/yarnpkg/yarn/issues/2888

Installation | Yarn
https://yarnpkg.com/lang/en/docs/install/

Installing Node.js via package manager | Node.js
https://nodejs.org/en/download/package-manager/#debian-and-ubuntu-based-linux-distributions
vscode tips(適宜更新)

## 概要
vscodeのインストールを自動化してどの環境でも簡単に設定できるようにしたい。

extensionはUIのマーケットプレイスからしかインストールしたことなかったので、chefやansibleなどでextensionのインストールの自動化ってどうやってするのかなと思い調査。

### install方法

```
% code --install-extension <extension id>
```

でインストールはcliからすることができる模様。
ちなみにextension idはUnique Identifierの事を指しているようで```package.json```の```publisher```.```name```で生成されている(気がする)。
複数インストールしたい場合

```
% code --install-extension <extension id> --install-extension <extension id2>
```
のように指定する必要が今のところある模様(1.21.0)

ちなみに既存のインストールされているextensionのリストは

```
code --list-extensions
```
確認できる。

## キーボードショートカット
公式
https://vscode-doc-jp.github.io/docs/getstarted/keybindings.html
 
### 画面の分割と統合
分割 : `cmd + \`　, command: workbench.action.splitEditor
結合 : 2つのグループのエディタを結合 -> defaultでは特に定義されていないので自分で設定して(自分はcmd + ') command: workbench.action.joinTwoGroups

### 画面移動系
`cmd + option + ←→`: 画面移動

### タグジャンプ
定義先へジャンプ : `cmd + click`
定義から使用されている所へジャンプ(正確にはすべての参照先を検索) : `shift+f12`, command: editor.action.referenceSearch.trigger
ソースを移動した後移動元へに戻る: `ctrl + -`
逆に戻る: `ctrl + shift + -`
workbench.action.navigateForward
### 見た目をいい感じにする調整
パンくずリスト: `breadcrumbs.enabled`をtrue

### 以前いたファイルに戻る
タグジャンプしたあとに元いたページに戻りたい時が結構ある。
戻る: workbench.action.navigateBack
進む: workbench.action.navigateForward

## Docker Extension on リモートホスト(Linux)
vscode 1.35以上対応

remote developmentについては記載しない。

vscodeではDockerのimageやcontainerなどがvscode上を管理できる拡張を[msが提供](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-docker)している。

1.35未満では対象はローカルホストのみであったが、remote developmentが導入されてリモートのdockerdを管理できるようになった。下記に適用方法を記載する。

- remoteにdocker extensionをインストールする。
- settings.json(ユーザー設定)に下記設定を追加する。

```settings.json
"remote.extensionKind": {
    "ms-azuretools.vscode-docker": "workspace"
  }
```
- リモートホストのdockerdを一般ユーザー(sshでアクセスするユーザー)からアクセス可能にする。
    - [Post-installation steps for Linux](https://docs.docker.com/install/linux/linux-postinstall/)

自分の環境(CentOS7)の場合更にリモートホストを再起動しなくちゃだめだったけど上の設定をすればリモートホストdockerdをvscodeから操作することができた。

### 参考リンク
公式のドキュメントに普通に書いてあった。
https://code.visualstudio.com/docs/editor/extension-gallery#_browse-and-install-extensions
はぁまたインターネッツに重複した情報を流してしまった。。。
forやforeachを使わずにList<List<T>>をList<T>にする

`List<List<T>>`を`List<T>`にする（Listを平坦化する）必要があったので、LINQを使って一発で
変換できないか調べたところ、いい方法がありました。

```cs:Program.cs
using System.Collections.Generic;
using System.Linq;

namespace ConsoleApplication
{
    public class Human
    {
        public string Name { get; set; }
        public List<int> Numbers { get; set;}

        public Human(string name, List<int> results)
        {
            Name = name;
            Numbers = results;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            List<Human> Humans = new List<Human>()
            {
                // 適当なインスタンスを作成
                new Human("Yamada", new List<int>(){ 150, 40, 180, 110, 20 }),
                new Human("Sato", new List<int>(){ 120, 80, 140, 130, 120, 180, 340 }),
                new Human("Suzuki", new List<int>(){ 10, 20, 40 })
            };

            //Humansリスト内の全ての要素のList<int> NumbersをひとつのList<int>にまとめたい
            // 冗長なコードの例1
            List<int> BadSample1 = new List<int>();
            foreach (Human human in Humans)
            {
                foreach (int num in human.Numbers)
                {
                    BadSample1.Add(num);
                }
            }

            // 冗長なコードの例2
            List<int> BadSample2 = new List<int>();
            foreach (Human human in Humans)
            {
                BadSample2.AddRange(human.Numbers);
            }

            // LINQを使った例
            // HumansのNumbersのリストの列挙を作成
            List<List<int>> AllNumbers = Humans.Select(h => h.Numbers).ToList();

            // List<List<T>>をList<T>にする（Listを平坦化する）
            List<int> AllNum = AllNumbers.SelectMany(a => a).ToList();

            // List<Human>から一発でList<int>に変換する
            List<int> allNum = Humans.SelectMany(x => x.Numbers).ToList();
        }
    }
}
```
JavaScriptのparseInt()とNumber()の違い

Angularを利用していて、stringをnumに変換するときに、疑問がわいたので調べてまとめたメモ。

挙動の違いから。

```js
parseInt("20px"); // => 20
parseInt("10100", 2); // => 二進法なので 4 + 16 = 20
parseInt("2e1"); // => 2

Number("20px"); // => NaN
Number("2e1"); // => 2 x 10^1 なので、 20
```

(注) AngularでparseIntを利用する場合、tslintを有効にしていると、第二引数に基数を指定しないと、エラーが出る場合がある。

parseIntは、**数値を含む文字列のうち、数字部分を取り出し、数値に変換する。**

Numberは、**数値を含む文字列の意味を解釈し、数値に変換する。文法に合わない文字列の時は、NaNを返却する。**


# 参考

- [What is the difference between parseInt() and Number()?](https://stackoverflow.com/questions/4090518/what-is-the-difference-between-parseint-and-number)
- [JavaScriptのToNumberとparseInt/parseFloatの仕様と実装の違い](http://d.hatena.ne.jp/mindcat/20091012/1255354167)
VBA(C#)でExcelの条件付書式の罫線の取得・設定に失敗する

## 課題
エクセルの条件付き書式をコードに落とし込むために
現在の情報を取得しようとしたところ、LineStyleの取得の部分で
以下のようなエラーが発生してしまいました。

```
実行時エラー '1004':
Boder クラスの LineStyle プロパティを取得できません。
```

以下のコードで再現しました。

```vb
Sub Test()
   Dim fc As FormatCondition
   Set fc = Range("A1").FormatConditions(1)
   MsgBox fc.Borders(xlEdgeTop).LineStyle
End Sub
```

## 原因
通常のセル(Range)に罫線をセットする場合、以下の場所が選択できます。

|名前|	値|	説明|
|---|---:|---|
|xlDiagonalDown	|5	|範囲内の各セルの左上隅から右下への罫線
|xlDiagonalUp	|6	|範囲内の各セルの左下隅から右上への罫線
|xlEdgeBottom	|9	|範囲内の下側の罫線
|xlEdgeLeft	|7	|範囲内の左端の罫線
|xlEdgeRight	|10	|範囲内の右端の罫線
|xlEdgeTop	|8	|範囲内の上側の罫線
|xlInsideHorizontal	|12	|範囲外の罫線を除く、範囲内のすべてのセルの水平罫線
|xlInsideVertical	|11	|範囲外の罫線を除く、範囲内のすべてのセルの垂直罫線

参照: [MSDN XlBordersIndex 列挙 (Excel)](https://msdn.microsoft.com/ja-jp/vba/excel-vba/articles/xlbordersindex-enumeration-excel)

しかし、条件付き書式における罫線は上下左右の４つしかありません。
ここで再現コードの

```c#
fc.Borders(xlEdgeTop).LineStyle
```

の部分に戻ると、xlEdgeTop は上記の表で 8 になるので、対応する Border がないために
値の取得ができないんですね。

## 解決
xlEdgeTop 等の列挙子を使わず、1～4の数字で指定すると取得できました。

```c#
fc.Borders(1).LineStyle
```

位置と数字は以下のように対応します。

|位置|値|
|---|--:|
|左|1|
|右|2|
|上|3|
|下|4|

C# では型キャストが必要です。

```c#
using Excel = Microsoft.Office.Interop.Excel;

...

Excel.FormatCondition fc = ...;
var border = fc.Borders[(Excel.XlBordersIndex)1];
```

## 参考
[Excel Q&Aサロン](http://excelfactory.net/excelboard/excelvba/excel.cgi?mode=all&namber=184865&rev=0)で回答いただきました。ありがとうございました。

## 余談
一応解決はできたんですが、なにかもっと正しい方法があるような気もします。
ご存知の方はぜひコメントください。
import error！パスを通す？？pythonあるある。

#import errorってなんやねん
*それはあまりに突然の出来事だった----*

```python3:エラーメッセージ
>>> import <モジュール>
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named <モジュール>
```

マウス操作ができるpyautoguiを使いたかった。ただそれだけだったのだが、一行目で否定された。突然すぎる。
多分原因は、python3で開発しているにも関わらず、python2用を使おうとしたからだと思います。（python3でも同じだと思うよってどっかの記事で言ってたんだもん(´・ω・｀)）

#問題解決する。パスを通すとは
**Pythonのスクリプトとして以下を実行**

```python3:捜索場所を確認する
import sys
print(sys.path)
```

↓pipを使ってインストールした人↓

```python3:保存先を確認する
pip show <モジュール>
```

捜索場所とは、例えばopenCVやpyautoguiをインストールしたらどこかに保存されます。
その保存された先が捜索場所のうちのどれかであればimportすることができます。

しかし、保存先の場所は捜索場所の一覧の中には含まれていませんでした。
そこで保存先の場所を捜索場所に追加します。

```python3:保存先の追加
import sys
sys.path.append('保存先の場所')
```

こうして保存先の追加がされました！！
これを**パスを通す**と言います。
**パス**とはいわゆるアドレスです

#最後にimportしてみる
ちゃんとできましたか？？
*-----こうして物語は幕を閉じた。*
Windowsでもglobで取得するパスは「/」区切り、、、でハマった

Windowsでもglobで取得するパスは例えば

```js
let jpgPath = 'C:/hoge/fuga.jpg'
```

と言った感じで`/`区切りになる。
ところが`path.sep`はWindowsでは`\`となるので`split`が期待通りにならない。
そこで、

```js
path.join(jpgPath)
```

とすると`/`が`\`に変換されるので

```js
let array = path.join(jpgPath).split(path.sep)
```
`split`が期待通りに動いてくれる。
プログラミング初心者〜Rails開発環境構築〜

プログラミング初心者、かつ、去年出産し5ヶ月の娘がいる新米ママですが、
突如プログラミングを学ぼうと決心いたしました！
よろしくお願いします。


今日はPRESSBLOG社長の溝口氏[@yasainet](https://twitter.com/yasainet)にご指導いただき、
Mac OS 10.13.2でRuby On Railsの開発環境を構築。

とりあえずやってみよう精神でまさに勢いだけでスタートし、
スカイプでバシバシ指導していただきながら、
(スカイプの使い方すらわからなかったんですけどねw)

プログラミングの第一歩を踏み出すことが出来ました。


と言っても、入力したコマンドは完全に理解できたわけではなく、
今日はプログラミングに対する私の意気込みを書かせていただきます！


#なぜプログラミングを学ぼうと思ったのか
初心者、かつ、新米ママの私にとって、プログラミングとはとんでもなく高いハードルでしょう。
それを理解した上でプログラミングを学ぶ理由とは、
**『私にとっての重要な選択肢となるから』**です。


今は育児のため仕事は育児休業をしており、
保育園に入園でき次第、仕事復帰の予定です。
東京都在住、職種はアパレル販売員をしております。

・・・果たして入園なんて出来るのでしょうか
待機児童数や倍率を聞くと、むしろ入園できる気がしません、
入園出来なかった場合、私は仕事を辞めるしかありません。
でもそこで、いろいろな働き方の選択肢があったなら、、と思ったときに、
真っ先に浮かんできたのがプログラミングです。

決して簡単なことではありませんが、
選択肢って努力次第で自分で広げることが出来るはずですよね。

こんな超初心者の初投稿をお読みいただきありがとうございました。

今後同じような不安を抱えているママさんたちの参考にもなればと思いますので、
次回以降は具体的な記載などもしていきます。

母ちゃん頑張っちゃいます〜！！