OmniAICreator/Qiita-1.07M huggingface dataset:
JavaScript でエルビス演算子を使ってみる

## 概要

```php
val = a ?: b;
```
このように `左の値が true と解釈されるものだったら左の値`を、`false と解釈されるものだったら右の値`を返すエルビス演算子 (elvis operator) ですが、JavaScript で使う際の備忘録として記しておきます。

## エルビス演算子
いきなり結論ですが JavaScript ではこう書けますね。

```javascript
val = a || b;
```

単純に if 文使ったり、三項演算子使うよりコードがシンプルになりますね。

```javascript
// 上のコードを if文で書く
if (a) {
  val = a;
} else {
  val = b;
}

// 上のコードを三項演算子で書く
val = a ? a || b;
```

三項演算子が更に省略されていると覚えておけば問題なく `||` を使えそうです。

## || と && の挙動

ここからはちょっと気になったので調べたことですが、

```javascript
const a = 1; // truthy
const b = 0; // falsy
const val = a || b;
console.log(val); // 1
```

`左の値が true 、右の値が false` と解釈される場合、当然`左の値`が返ります。

`左の値が true 、右の値も true` と解釈される場合は？

```javascript
const a = 1; // truthy
const b = 2; // truthy
const val = a || b;
console.log(val); // 1
```

これも、`左の値`が返ります。どちらかの値が true だったらいいので先頭の条件を評価した時点で値が返されてますね。

では、左右の値はこのままで、論理演算子を `||` から `&&` に変更してみると？

```javascript
const a = 1; // truthy
const b = 2; // truthy
const val = a && b;
console.log(val); // 2
```

`右の値`が返りました。 `&&` なので、先頭の条件から精査して、最後に true と解釈される条件が返されるからですね。

## ちなみに...
最後に、ほんとにちなみにですが、エルビス演算子の由来は、`?:` が[エルビス・プレスリーさん](https://www.google.com/search?q=%E3%82%A8%E3%83%AB%E3%83%93%E3%82%B9%E3%83%97%E3%83%AC%E3%82%B9%E3%83%AA%E3%83%BC&rlz=1C5CHFA_enJP743JP743&source=lnms&tbm=isch&sa=X&ved=0ahUKEwiImuPmudnfAhXXAIgKHaCBBUsQ_AUIDygC&biw=1440&bih=790)の顔文字に似ているところから来ているらしいです。(言われてみると `?` がリーゼントヘアーで `:`が目っぽく見える...）
会社を変えたとしても価値ある人材でありたい

友人が、「転職する気がなくても読んでおいたほうがいい」と強く念押ししていた書籍を購入。
[転職の思考法。]((https://www.amazon.co.jp/%E3%81%93%E3%81%AE%E3%81%BE%E3%81%BE%E4%BB%8A%E3%81%AE%E4%BC%9A%E7%A4%BE%E3%81%AB%E3%81%84%E3%81%A6%E3%81%84%E3%81%84%E3%81%AE%E3%81%8B-%E3%81%A8%E4%B8%80%E5%BA%A6%E3%81%A7%E3%82%82%E6%80%9D%E3%81%A3%E3%81%9F%E3%82%89%E8%AA%AD%E3%82%80-%E8%BB%A2%E8%81%B7%E3%81%AE%E6%80%9D%E8%80%83%E6%B3%95-%E5%8C%97%E9%87%8E-%E5%94%AF%E6%88%91/dp/4478105553))


<img src="https://images-na.ssl-images-amazon.com/images/I/51IxoAFLzYL._SX341_BO1,204,203,200_.jpg" width="300">

この本は社会人として働き続ける上での知恵を説いている本なので、生き残る術を身につけるためにも役立つ内容でした。私は1年前に今の事業会社に転職して3社目なのでまだ転職を意識していないですが、読了して自分の考え方にまた変化が出てきたので良かったです。

自分の備忘録的にまとめつつ、決意表明も少し書き記します。

## 会社を変えても価値のあるスキルをどれだけ持っているか
自分のマーケットバリュー（市場価値）を測る上で重要な項目の9つあるうちの1つ。
結構このキーワードに大事なことが集約されていると思うし、会社員として働き続ける上で常に意識しなければいけない点だと思いました。
会社に帰属している以上コミットメントしてアウトプットしているけれども、それは自分自身のスキルを高めるものなのか、それともその"企業に所属している自分"のスキルを高めるものなのかによって大きく変わります。後者の場合は、そのスキルが市場価値を高めることにつながらないので、注意が必要です。特に分業化が進んでいる大企業などはルーチンワークが作業の大部分を占めていたり、会社の風習で習慣となっているデザイナースキルとは直接関係のない仕事などが増えてくると、本来高めたいスキルに割く時間が減ってしまいます。

## 自分はbeing型（どんな人でありたいか、どんな状態でありたいか）の人間だった
人間はtodo型とbeing型の2パターン存在していて、99%の人間はbeing型である。と書かれていて、自分の中の霧が少し薄くなったような感覚になりました。ホリエモンと落合さんの「10年後の仕事図鑑」という本を読んだ時、「自分の好きなもの（夢中になるもの）を掛け合わせて専門性を高めることでオリジナリティを出し、その個性を前面に出して戦っていく」といったような内容が書かれており、その重要性を理解したものの自分に当てはめたときにこれと言ったものが浮かびませんでした。
で、この本を読んだ時、あぁそれが指していたのはtodo型の人間への道しるべなのかも知れないと理解しました（解釈の仕方が間違っているかもしれませんが...）
だからこの本に書かれているようにbeing型の人間は「心からやりたいこと」がなくても悲観する必要はなく、自分の状態と環境の状態を整えつつ、小さなやりたいことから見つけていけばいいのだと思いました。




## 20代は専門性、30代は経験、40代は人的資産でキャリアを作れ
20代というともうすぐ終わってしまうんだけれども（笑）、30歳になる2019年は専門性を高めることに集中する一年にと決めました。その理由は現職での専門性がまだまだ高められていないと危惧しているからです。具体的な目標でいうと[HTML5プロフェッショナル認定試験 Level2](https://html5exam.jp/outline/lv2_v2.html)の合格。試験内容はほぼJavascriptでしかもソースコードを読み解いて答える問題が多いとのことなので、普段業務でJSのソースに慣れていないと時間が足りずにタイムリミットが来てしまうそう...。
私の場合は、HTML5とSassを使ったコーディングやたまにUI設計をするといった業務内容なのでJSはほぼ使うことがないです。前職では、jQueryやNode.jsなどに触れる機会があったのですが、使わなくなってからほぼ忘れていてまずいなぁと思っていました。でもこの本を読んで、専門性を高めることの重要に改めて気付かされ、Webデザイナーの私が高めたいものがJSだったのでこれを機に受験します。

![S__35119106.jpg](https://qiita-image-store.s3.amazonaws.com/0/225425/cc363d46-e1fa-29f2-31a7-e3fcb5d46007.jpeg)

ひとまずこの2冊の本を読み返して忘れ去られていたJS脳を呼び起こし、認定教材となっているテキスト、[HTML教科書 HTML5プロフェッショナル認定試験 レベル2 スピードマスター問題集 Ver2.0対応](https://www.shoeisha.co.jp/book/detail/9784798154626)で実力をつけつつ、試験に臨みたいと思います。

最後にこの本を通して、自分の心に刺さったキーワードを備忘録がてら書き記しておきます。
この本から学ぶことがとても多かったので紹介してくれた友人には感謝です。

- 他人の作った船に自分の人生を預けるな
- 伸びている（成長が見込める）産業にピボットする
- 他の会社でも通用する「レアな経験」がどれだけあるか。その経験は、世の中からどれだけ「強いニーズ」があるのか。
- 自分の所属しているマーケットに成長性はあるか
- 「働きやすさ」は「マーケットバリュー」と相反しない。むしろ長期的には一致する

## リンク
- [転職の思考法 - Amazon公式サイト](https://www.amazon.co.jp/%E3%81%93%E3%81%AE%E3%81%BE%E3%81%BE%E4%BB%8A%E3%81%AE%E4%BC%9A%E7%A4%BE%E3%81%AB%E3%81%84%E3%81%A6%E3%81%84%E3%81%84%E3%81%AE%E3%81%8B-%E3%81%A8%E4%B8%80%E5%BA%A6%E3%81%A7%E3%82%82%E6%80%9D%E3%81%A3%E3%81%9F%E3%82%89%E8%AA%AD%E3%82%80-%E8%BB%A2%E8%81%B7%E3%81%AE%E6%80%9D%E8%80%83%E6%B3%95-%E5%8C%97%E9%87%8E-%E5%94%AF%E6%88%91/dp/4478105553)
- [HTML5プロフェッショナル認定試験 - 公式サイト](https://html5exam.jp/outline/lv2_v2.html)
Pythonでシェルコマンド実行

# subprocessを使う

- 下記で ' ls -l 'が実行できます。


```python
import subprocess

cmd = 'ls -l'
print(subprocess.check_call(cmd.split()))
```

# 他の例

- mv とかで　「引数リストが多すぎます」のエラーが出た時の対処
    - xargsを使えばシェルで対応できるけど、シェルに慣れてない人はこっちの書き方のほうがわかりやすいはず...

```python
import os
import subprocess

d = os.listdir('./dir')

for dd in d:
    cmd = 'mv ./dir/' + dd + ' ./dir_new/'
    subprocess.check_call(cmd.split())
        
```
Xdの勉強会に出たのでそのまとめ

先月、Xdの勉強会に出席してきたので、その内容のまとめ記事になります。

## 1限目：基本的な操作
### 事前に
Xdはバージョンアップも日々すすんでいて、使いやすいツールになっていってはいるけれども、そもそもWebやアプリを作成するツールなので、イラストや写真編集、動画編集で細かいことは出来ない。なので、細かく作り込む必要があれば、迷わずに他のツールのイラレやフォトショを使うべき。

### 操作性
基本的な操作はほとんど、ツールバーにあるもので操作を行える。つまりは、操作が簡単。

### プラグインが使える
2018年10月からプラグインが使えるようになった模様。なので、自分の使いやすいようにカスタマイズできそう。
（ついこの間は無かったのに、バージョンアップ早いなぁ。。。）

### リピードグリッド
マウス操作だけでパーツを複製できる。
中身も入れ替え可能。詳細は下記。
https://helpx.adobe.com/jp/xd/help/create-repeating-elements.html

### 自動アニメーション
どうやら、Xd側が判断して自動でアニメーションをつけてくるそう。
（ちょっと勉強しなきゃ）

### プロトタイプ共有
ボタンを押した時の、遷移先のだったり、表示の確認が出来る。
コメントを残すことも出来るので、修正指示を出すのに使える。

### デザイン共有
主にコーダーが使う。CSSを書くのに必要な情報を読み取ることが出来る。

## 2限目：テクニカルディレクター目線での使い方
### テクニカルディレクターとは
デザイナーとコーダーの間に入り、デザインを見比べて、どこをCMSにするべきか、パーツはどう分けるていくかなど、技術的なことも含めてデザイナーと話をする。また、コーダーに指示を出したりするポジションの人。

### 主な使い方
プロトタイプ共有で遷移が出来るので、パーツをクリックした先に、パーツに対しての指示などが書いてあるアートボードに、コーダーに渡すように使っていました。

情報を伝達していった時の認識のズレが発生すると、何度も作り直しになったりするので、プロトタイプ共有をうまく使うことによって伝達ミスの軽減に繋がりそう。


## 3限目：デザイン業務以外の使い方
アニメーションや、遷移する表現ができ、共有も簡単にできるので、工夫して下記のような使い方も出来る。

・電子マニュアル
・タッチパネル
・動画
・条件分岐プレゼン
・絵コンテ
・スライドショー

要するに、勉強するコストが低いうえに、手軽にアニメーションなどを取り入れたデータを作れるので、使い方によって、簡単に今どきな感じの資料作成に役立てるということかと思いました。

## まとめ
自分で勉強した時よりも、バージョンアップが進んでいてビックリしました。
これからにも期待です。
そして、共有系の機能は、実務にも使えますし、（ドライブにアップさせれるのでセキュリティ的な話はクリアしなければいけないですが）導入して使っているというお話が聞けたので勉強になりました。
OpenFaceを使ってみる

# OpenFace
動画・画像の顔解析ツール

- GitHub
    - https://github.com/TadasBaltrusaitis/OpenFace

# Dockerを使いましょう

- 直接インストールするのはめんどくさい

- ちなみに上のURLにやり方は載ってます


# やり方

- まずはターミナルを2つ起動しておく
    - 1つ目(Terminal_1)、2つ目(Terminal_2)とします

### Terminal_1

- Dockerイメージを作成し、コンテナの中に入る

```bash
$ docker run -it --rm algebr/openface:latest
``` 

### Terminal_2

- 確認

```bash
$ docker ps
CONTAINER ID  IMAGE  COMMAND  CREATED  STATUS  PORTS  NAMES
3a73fbce562e  algebr/openface:latest  "/bin/bash"  About a minute ago  Up About a minute  musing_wiles
```

- ローカル側からDocker側へコピー
    - 「3a73fbce562e」の部分は上記のCONTAINER IDに適宜変更する

```bash
$ docker cp samples/sample1.jpg 3a73fbce562e:/home/openface-build
```

### Terminal_1

- 実行する

- 単一画像の場合
    
```bash
$ build/bin/FaceLandmarkImg -f sample1.jpg
```

- 複数画像の場合

```bash
$ build/bin/FaceLandmarkImg -f sample1.jpg -f sample2.jpg 
```

- ディレクトリの場合

```bash
$ build/bin/FaceLandmarkImg -fdir ./sample_dir
```

- デフォルトだと、processedディレクトリに実行結果が保存されるので変更したい場合は
「out_dir」オプションを使用する

```bash
$ build/bin/FaceLandmarkImg -fdir ./sample_dir -out_dir ./output_dir
```

- 連々書いたけど、下記の開発者のGitHubを見ればすぐわかる。
    - https://github.com/TadasBaltrusaitis/OpenFace/wiki/Command-line-arguments
[メモ]goのfor

```golang
package main

import "fmt"

func main() {
	// rangeを回すループ
	hoge := []int{1,2,3}
	
	for _, v := range hoge {
		fmt.Printf("%v", v)
	}


	// 古典的ループ
	for i := 0; i < 10; i++ {
		if (i % 2 ==1) {
			continue
		}
		fmt.Printf("%v", i)	
	}

	// 条件式ループ
	count := 1
	for count < 100 {
		fmt.Printf("%v", count)
		count++
	}

	// 無限ループ
	for {
		fmt.Print("infinite loop")
		break		
	}
}
```


こんな感じの条件式に構造体の状態を用いたループもできる。
Go言語で作るインタプリタより抜粋

```golang

	for !p.curTokenIs(token.RBRACE) && !p.curTokenIs(token.EOF) {
		stmt := p.parseStatement()
		if stmt != nil {
			block.Statements = append(block.Statements, stmt)
		}
		p.nextToken()
	}

```
railsでvuejsを使うための下準備

#初めに
vue.jsを使おうと思ったが最初の設定が若干めんどくさかったので忘備録として残しておく

#やりかた

まずyarnがインストールされてなくてはいけないのでインストールする

ubuntuではyarnをインストールしてもバージョンに関して怒られたりした

それで最終的に以下のやり方でうまくいった

```
curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list
sudo apt-get update
sudo apt-get install yarn
```

これでyarnに関しては大丈夫だと思う

```
rails new app_name
```

をして

そのあとgemfileに

```ruby 
gem 'webpacker', github: 'rails/webpacker'
```

を加えてbundle install

そしたら

```
bin/rails webpacker:install
```

をする

おそらくうまくインストールできると思うので

そしたら

```
rails webpacker:install:vue
```

をする。

これでおそらくVuejsの設定は大丈夫なはず。


#エラーが出る

これでとりあえずは良いのですが実際にvue.jsのコードを使って何かしようとすると

You are using the runtime-only build ....

みたいなエラーが出て何も表示されなかったりする。

これの解決方法としては

packsの中にある使おうとしているファイルのimportを

```
import Vue from 'vue/dist/vue.esm.js';
```

とすれば表示される。


これは単一コンポーネントのファイルで出るエラーなんだとか


とりあえずこれで初期設定は大丈夫
webpackでパッケージしたJavaScriptファイルの動的読み込み(Node.js)

## はじめに

NodeJSで実行されるJavaScriptプログラムで、特定のフォルダに保存したJavaScriptファイル(webpackでパッケージ済み)を動的に読み込む方法を調査したので、ここにメモする。

## 前提環境

Mac 10.14.2
node 11.4.0
npm 6.5.0

npmにてdevDependencies(npm i -D 〜)として以下をインストール
@babel/cli: 7.2.3
@babel/core: 7.2.2
@babel/preset-env: 7.2.3

## 実施したこと

### 読み込まれる側のJavaScript

index.js

```JS
export default class AddJS {
    ・・・
}
```

webpack.config.jsは下記で実施した。

```JS
module.exports = {
  mode: 'development',
  entry: './src/index.js',
  output: {
    filename: 'bundle.js',
    path: __dirname + '/dist'
  },
  module: {
    rules: [
      {
        test: /\.js$/,
        use: [
          {
            loader: 'babel-loader',
            options: {
              presets: [
                '@babel/preset-env'
              ]
            }
          }
        ]
      }
    ]
  }
}
```

パッケージを行うコマンドは以下である。

```
$ webpack
```

### JavaScriptの読み込み側

ADD_JS_PATHに保存されたJavaScriptファイルを読み込むコードを下記する。

```JS
 import(ADD_JS_PATH + fileName)
    .then(AddJS => {
      let obj = new AddJS.default()
        ・・・
    })
    .catch(e => {
      console.log('error : ', e)
    })
```

export default classで宣言したJavaScriptファイルを読み込む際は`<クラス名>.default`で読み込む必要があるため注意。

requireで読み込むこともできるようだが、importとrequireの混在だとうまく読み込めないこともあるようなのでimportを利用することにした。

コンパイルは下記のコマンドで実施した。

```
$ babel src --out-dir dist && cp src/config.json dist/
```
このとき.babelrcには下記のように記載した。

```
{
  "presets": ["@babel/preset-env"]
}
```

上記でコンパイルを行うと以下のエラーが出た。

```
Support for the experimental syntax 'dynamicImport' isn't currently enabled (xx:yy):
```

babelのdynamic-import-nodeプラグインが必要であることが分かったため追加する。

```
$ npm i -D dynamic-import-node
```
上記により下記が追加された。
babel-plugin-dynamic-import-node: 2.2.0

.babelrcは以下のように修正する。

```
{
  "presets": ["@babel/preset-env"],
  "plugins": ["dynamic-import-node"]
}
```

これで読み込む側のJavaScriptのコンパイルができるようになった。

### 読み込みの動作確認

読み込み処理を実施すると以下のエラーが出た。

```
TypeError: AddJS is not a constructor
```

読み込まれる側のJavaScriptにconstructorを定義していても上記エラーとなってしまう。
色々調べると以下のサイトを見つけた。

https://stackoverflow.com/questions/48901262/unable-to-import-module-after-bundling-with-web-pack

このサイトからwebpack.config.jsに"libraryTarget: 'commonjs2'"の記載を追加すれば良さそうなことが分かったため実施した。

webpack.config.js

```JS
module.exports = {
  mode: 'development',
  entry: './src/index.js',
  output: {
    filename: 'bundle.js',
    path: __dirname + '/dist',
    libraryTarget: 'commonjs2'
  },
  module: {
    rules: [
      {
        test: /\.js$/,
        use: [
          {
            loader: 'babel-loader',
            options: {
              presets: [
                '@babel/preset-env'
              ]
            }
          }
        ]
      }
    ]
  }
}
```

再度JavaScriptを読み込む処理を実施した結果、無事読み込めるようになった。
JavaScriptでおみくじプログラム

こちらの YouTubeで利用したサンプルプログラムです。

JavaScriptでおみくじプログラムを作ってみよう
https://www.youtube.com/watch?v=AJC4Ap0XsYI&feature=youtu.be


```
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>おみくじ</title>

    <style>
        body {
            background-color: rgb(181, 241, 153);
        }
        p {
            text-align: center;
            font-size: 2em;
            margin-top: 100px;
        }
    </style>
</head>
<body>
    <script>
        // 大吉・吉・中吉・小吉・末吉・凶・大凶
        let kujis = ['大吉', '吉', '吉', '吉', '中吉', '中吉', '小吉', '小吉', '小吉', '末吉', '末吉', '凶', '凶', '大凶'];
        //console.log(kujis[0]);
        let kuji = Math.floor(Math.random() * kujis.length);
        //console.log(kuji);

        document.write('<p>あなたの今年の運勢は、' + kujis[kuji] + 'です</p>');
    </script>
</body>
</html>
```
Homebrew CaskでWeb APIのテストに便利なPostmanをインストールする

- 環境
    - macOS Big Surバージョン11.1
    - Homebrew 3.0.0

# Homebrewでインストール前の準備をする。
```bash
# アップデートする。
$ brew update
Updated 3 taps (homebrew/core, homebrew/cask and homebrew/cask-fonts).
==> New Formulae
# ...省略...

# 健康診断する。
$ brew doctor
Your system is ready to brew.

# Postmanを探す
$ brew search postman
==> Casks
postman
```

# Postmanをインストールする。
```bash
$ brew install postman
Updating Homebrew...
==> Auto-updated Homebrew!
Updated 1 tap (homebrew/core).
==> Updated Formulae
Updated 1 formula.

==> Downloading https://dl.pstmn.io/download/version/8.0.5/osx64
######################################################################## 100.0%
==> Installing Cask postman
==> Moving App 'Postman.app' to '/Applications/Postman.app'
🍺  postman was successfully installed!

```

[Lunchpad]にPostmanが追加されました。
![スクリーンショット 2019-01-06 23.18.06.png](https://qiita-image-store.s3.amazonaws.com/0/159761/a8cf732f-76fe-875a-4f29-c1e735eb5ad4.png)

# Windowsでインストールする場合
[Postmanをインストールする - Qiita](https://qiita.com/ponsuke0531/items/03483449ea0df505a540)
Python開発の"常識"として知っておきたい、Pipenv

# Pipenvとは？

Pythonのプロジェクト管理ツールです。

例えるならば、

- JavaのMaven/Gradle
- node.jsのnpm/Yarn
- Railsのbundler

などに当たるものです。

## 何ができるのか？

Pipenvは、例えば以下のようなことができます。

- 本番用／開発用それぞれ向けにライブラリのバージョンを `Pipfile` に残せます。
    - Pythonそのもののバージョンも含めて、残せます。
    - `Pipfile.lock`も残して、常に同じ結果にできます。(`requirements.txt`だけでは大変手間！）
    - バージョンの指定は、`requirements.txt`同様、厳密にしたり柔軟にしたりできます。

- `Pipfile` に合わせて、自動でプロジェクト用の仮想環境を作れます。
    - virtualenvと連携して作成されます。
    - 作った環境は、エディタ（VS CodeやPyCharmなど）からも認識されます。
    - その他ツール（CircleCIやtoxなど）などとの連携も増えてきているようです。
    - もしpyenvをインストールしておけば、指定したPythonバージョンを自動で用意してくれます。

- `Pipfile` は `requirements.txt` からインポート/エクスポートできるので、すぐ始められます。
    - `requirements.txt` は `pip freeze`で作れるので、なくても大丈夫
    - anacondaなどのPythonディストリビューションを使っていても、再利用できます。

その他機能もあるので、具体的には[本家サイト](#本家サイト)も見てみてください。
2017年ぐらいからの、比較的新しいツールですが、
トップページにあるリンク（目次）を見るだけでも、十分な機能とドキュメントが用意されているのがわかります。

個人的に、使い心地もよく気に入っています。ぜひ使ってみてください。

## 本家サイト

ドキュメント（英語）
https://pipenv.readthedocs.io/en/latest/

ドキュメント（日本語訳）
https://pipenv-ja.readthedocs.io/ja/translate-ja/

Github
https://github.com/pypa/pipenv

# Pipenvを使ってみる

## インストール

システム全体に関わるパッケージが壊れないよう、`--user`オプションを付けています。

```bash
$ pip install --user pipenv
```

```bash:気にしない人向け
$ pip install pipenv
```

```bash:Macユーザ向け
$ brew install pipenv
```

## 使い方

### プロジェクトを新規作成する場合

実行すると、`Pipfile`が作成されます。

```bash:Python3系の場合
$ pipenv --three
```

```bash:Python2系の場合
$ pipenv --two
```

```bash:Pythonのバージョンを指定したい場合
$ pipenv --python 3.6.5
```

### `requirements.txt`が既にあるプロジェクトの場合

[プロジェクトを新規作成する場合](プロジェクトを新規作成する場合)と全く同じです。
`requirements.txt`があれば読み込んで、`Pipfile`を作成し、かつインストールも行います。

明示的にパスを指定することも可能です。
`-r path/to/requirements.txt`を追加してください。

### ライブラリを新たにインストールする場合

基本的には、よくある`pip`によるインストールコマンドを`pipenv`に読み替えるだけです。
実行すると、更新された`Pipfile`と`Pipfile.lock`が作成されます。

```bash:最新バージョンをインストール
$ pipenv install requests
```

```bash:開発用にインストール
$ pipenv install --dev autopep8
```

```bash:バージョンを厳密に指定
$ pipenv install "requests==2.20.0"
```

```bash:マイナーバージョンの違いを許容
$ pipenv install "requests~=2.20.0" # 2.20.1がインストールされる
```

```bash:開発中のモジュールをeditableモードでインストール（※要setup.py）
$ pipenv install --dev -e .
```

### 仮想環境を作成する

`git clone`などで`Pipfile`などをダウンロードしてきた場合に実行します。
[プロジェクトを新規作成する場合](プロジェクトを新規作成する場合)を実行済みならば、既に作成済みの状態です。

```bash:開発向け仮想環境
$ pipenv install --dev
```

```bash:本番と同じ仮想環境
$ pipenv install
```

```bash:デプロイ（Pipfile.lockを更新せずエラーにする）
$ pipenv install --deploy
```

もし仮想環境をリセットしたければ、削除して再作成すればよいです。

```bash:削除
$ pipenv --rm
```

### 仮想環境を使う

１コマンド実行すればよいならば、以下を実行します。

```bash
$ pipenv run <コマンド> <オプション>...
```

作成された仮想環境をactivateするならば、以下を実行します。

```bash
$ pipenv shell
```

もし、よく使うコマンドがあれば、`Pipfile`にショートカットを書いておくことができます。
CIツールなどと連携する際に有用そうです。

```ini:Pipfile
[scripts]
hello = "python -c \"print('Hello')\""
```

と書いた前提で、以下を実行します。

```bash
$ pipenv run hello
```

```bash:出力結果
Hello
```

### `requirements.txt`を作成する

実行すると、依存ライブラリ含めてバージョン付きで生成されます。

```bash
$ pipenv lock -r > requirements.txt
```

## 参考
[本家サイト](#本家サイト)

A Better Pip Workflow
https://www.kennethreitz.org/essays/a-better-pip-workflow

pipfile-vs-setuppy
https://pipenv-ja.readthedocs.io/ja/translate-ja/advanced.html#pipfile-vs-setuppy
はじめての Ruby on Rails 環境構築とキャッチアップメモ <2019.01>

最近、Ruby on Rails のお仕事をもらったので、
RubyとRailsの環境構築とキャッチアップでやったことを備忘する。

# 前提

- Mac　OS High Sierra
- homebrew インストール済み

# 環境構築メモ

最初、systemに入っているrubyで環境構築を進めていたが、
root権限が必要だったりで少しハマり、最終的にrbenvを入れる形に落ち着いた。

### ruby インストールまで

関連ツールをbrewでインストール。

```
$ brew install rbenv ruby-build rbenv-communal-gems
```

rbenvコマンドの有効化、パスを通すために `.bash_profile　` に以下を追記

```
# rbenv PATH　
if which rbenv > /dev/null; then eval "$(rbenv init -)"; fi
export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init -)"
```

現時点の安定版2.6.0をインストールしてデフォルトに設定。

```
# インストール可能なversion確認
$ rbenv install -l

# 安定版をインストール
$ rbenv install 2.6.0

# デフォルト利用のrubyを2.6.0に設定
$ rbenv rehash
$ rbenv global 2.6.0
$ rbenv versions
  system
* 2.6.0 (set by /Users/[USER-NAME]/.rbenv/version)
```

- 参考記事:
  - [【2018年版】macにrbenvを入れてrubyを管理できるようにしちゃう](https://qiita.com/Alex_mht_code/items/d2db2eba17830e36a5f1)
  - [Homebrewのインストールとrbenvのインストールまで Mac編](https://qiita.com/is-lab/items/e0443b79da117ed48294)
  - [MacにHomeBrew,rbenv,bundlerをインストールする](https://qiita.com/shinkuFencer/items/3679cfd966f6a61ccd1b)


### rails インストールまで

```
$ gem install bundler
$ gem install rails
$ rails -v
Rails 5.2.2

# 後のキャッチアップで利用するライブラリ
$ gem install sqlite3
```

# キャッチアップメモ

Rubyもはじめてだったので、dot-installの以下２講座の全レッスンを心を無にして写経。

- [Ruby入門 (全26回)](https://dotinstall.com/lessons/basic_ruby_v3)
- [Ruby on Rails 5入門 (全28回)](https://dotinstall.com/lessons/basic_rails_v3)

有料会員に課金して倍速で動画聞く効率化作戦も考えたが、普通の再生速度でも適宜、動画止めたりしないとついていけなかったので、無課金で十分という感想。
（女性の説明に切り替えらてテンション高める目的なら課金するのもいいかも。)

# やってみた感想

参考記事、ドットインストールのおかげで約半日くらいRailsの概況は掴めたつもり。
あとは実践を積みながら、なんとかやる予定。
2019年はRailsと仲良くなってたくさん開発するぞい！
[PHP]staticメソッドとは

#staticメソッドとは
一般的に、クラスはインスタンス化して使うことが多いが、インスタンス化しなくても使える、メソッドを定義する方法。

#今回のコード
```php5:staticメソッドの例
<?php
class Hoge {
  public static function getMessage() {
    echo "staticメソッドからの出力です";
  }
}

Hoge::getMessage();
```
```text:実行結果
staticメソッドからの出力です
```
今回は、インスタンス化せずに、文字列を表示させるだけのメソッドを作成した。

#呼び出し方法
```text:staticメソッドの呼び出し
クラス名::メソッド名();
```
見慣れない:（コロン）二つという記法なので注意。

#さいごに
Laravelのシステムでよく見た、「::」はこれのことだったのかとスッキリしたので、簡単ながら以上を共有してます。

[参考サイト](https://dotinstall.com/lessons/basic_php_v2/34122)

#関連記事
[クラス定義、インスタンス化などの基本について](https://qiita.com/riotam/items/cb5406daa9a1c6a694da)
[クラス継承について](https://qiita.com/riotam/items/08e05965a327bc805d69)
[クラス内のアクセス権について](https://qiita.com/riotam/items/fdc9d8d050c01c0a8e6b)
『〇〇というファイルの、▲▲という行の下に、■■と追記』を自動化し簡単に再現したい

# Qiitaの記事や、各種チュートリアルを見てると掲題の表現がしばしば現れる
Qiitaでいうと、下記のような表現を見かける。

```package.json
  "scripts": {
  "watch:server": "browser-sync init", // 追加
  ...
```

## プロジェクト作成時に共通な部分は再利用したい
チュートリアル後に「なんか作ってみよう」とした時に、共通の設定部分とかまた設定したりするのは一苦労しますよね。
今後もプロジェクトの初期化時に再利用できる部分は再利用したいなー、って思うことあるんじゃないでしょうか(ありますよね...?
※再利用するまでの共通設定にある程度時間がかかる想定でいます。
ここで、再利用の方法は多々あると思うので、いくつか思いついた方法をメモしておきます。
最終的に2の方法「初期化スクリプトを利用する方法(★部分)」で進めていきます。

### プロジェクトの再利用方法

1. ある程度チュートリアルを終えた状態のプロジェクトなどをコピーして保存、今後はそれをコピーしてプロジェクトを作成する方法
2. プロジェクトで行う手順を、shellscriptなどで自動化し、プロジェクト作成時にそのスクリプトを実行する方法★
3. 何度もコマンドを使い体に覚え込ませることで、脳内キャッシュを利用する方法

### それぞれの再利用方法の特徴
1. シンプルなコピー
  - もっともシンプルで強力な方法
  - 実行環境が変わった場合に弱め e.g. ビルド結果のファイルが環境依存, コピーするファイル多い
  - 出来上がった環境はコピーできるが、システムに行った変更などをコピーし忘れる恐れがある
2. 初期化スクリプトを利用する方法★
  - ファイルをちょこっと変更するなどの、手動では簡単な操作ですら、自動化するのは億劫
  - ビルドは実行するマシンごとに行われるので、1の方法よりは環境依存が少ない(もちろんないという意味ではない)
3. 体育会系な方法
  - 脳内キャッシュ少なめだときつい(言い訳



## どうやって実現するか
### Linuxのsed(Stream EDitor)コマンドを用いて、特定行を編集する!!
先人方の「いや、それだけ？」って声が聞こえてきます。
もう少々先にある本題を読んでも、同じことを思うかもしれませんがご容赦ください(逃げ

### 『〇〇というファイルの、▲▲という行の下に、■■と追記』をsedで自動化した例
『「package.json」というファイルの、「    "scripts": {」という行の下に、「"watch:server": "browser-sync init",」と追記』と読み替えて、みましょう。
早速sedで書いてみましょう。

```:sedによる文字列追加の構文
sed -e "/▲▲/a ■■" 〇〇 -i
```

簡単やん、って思いました。(フラグ

```:残念なsed(そのまま入れてみた)
sed -e "/    "scripts": {/a "watch:server": "browser-sync init"," package.json -i
```

動かない...!!(迫真
### 「いや、ダブルクォートをエスケープしなさい」って聞こえてきそうです。
バックスラッシュをつけてダブルクォートをエスケープしてみる。

```:sed(ダブルクォートの前に\つけてエスケープしてみた)
sed -e "/    \"scripts\": {/a \"watch:server\": \"browser-sync init\"," package.json -i
```

追加されたっ...!!



#このsed作るだけで達成感感じてしまい、チュートリアルの続きができない
## このsedを簡単に生成したくなりました

この黒魔術的なファイルを作成します。

```:/usr/local/bin/add
target=`echo $1| sed -e "s/\"/\\\\\\\\\"/g"`
addText=`echo $2| sed -e "s/\"/\\\\\\\\\"/g"`
file=`echo $3| sed -e "s/\"/\\\\\\\\\"/g"`
sed -e "/${target}/a ${addText}" ${file}

echo "sed -e \"/${target}/a ${addText}\" ${file} -i"
```

実行権限を与えてあげます。

```
chmod +x /usr/local/bin/add
```

```:使い方
//add '■■' '▲▲' '〇〇'
add '  "scripts": {' '"watch:server": "browser-sync init",' package.json 
//すると下記のsedが出力されます(ついでにsedによる変換例も出力されます)
//sed -e "/\"scripts\": {/a \"watch:server\": \"browser-sync init\"," package.json -i
```

# まとめ
使い方、の部分に書いた方法で、エスケープにかかるひと手間をなくしてくれるスクリプトを作りました。
追記の方法だけ作成しましたが、変更に関しても同様の方法で実装できると思います。
より良い方法等ご存知でしたら、ご教授いただけると幸いです。



##備考 Macのsedの場合

BSD系のsedは,Linuxのものと別の挙動をするため
GNUのsedをインストールするといいかも。

```
brew install gnu-sed
```

gnu-sedをsedコマンドとして使うようにする場合は.bashrcにPATH追記

```:.bashrc
//下記を追記
export PATH="/usr/local/opt/gnu-sed/libexec/gnubin:$PATH"
```
JavaScript 文字・文字列が大文字（小文字）かどうか判定する方法いろいろ


タイトル通りJavaScriptで文字・文字列の大文字小文字を調べる方法を色々。

### 正規表現で

```JavaScript
//正規表現で 文字列すべてが大文字かどうか
const isUpperCase = str => {
  return /^[A-Z]+$/g.test(sr)
}
console.log(isUpperCase('AA')) // true
console.log(isUpperCase('aa')) // false
console.log(isUpperCase('Aa')) // false
```

```JavaScript
//string.matchを使った正規表現で文字列がすべてが大文字ならtrue
const isUpperCase = str => {
  const arr = str.match(/^[A-Z]+$/)
  return arr ? true : false
}
console.log(isUpperCase('ABC')) // true
console.log(isUpperCase('abc')) // false
console.log(isUpperCase('Abc')) // false
```


### String.toUpperCaseして比較する
```JavaScript
//String.toUpperCase/String.toLowerCase を使って
const isUpperCase = str => {
  return str === str.toUpperCase() ? true : false
}
console.log(isUpperCase('STR')) // true
console.log(isUpperCase('stR')) // false
console.log(isUpperCase('str')) // false
```

### UTF-16 コードを使って判定
```JavaScript
//AからZのcharCodeAtの値の範囲から
const isUpperCase = str => {
  const codeA = 'A'.charCodeAt()
  const codeZ = 'Z'.charCodeAt()
  const code = str.charCodeAt()
  return codeA <= code && code <= codeZ
}
console.log(isUpperCase('A')) // true
console.log(isUpperCase('B')) // true
console.log(isUpperCase('Z')) // true

console.log(isUpperCase('a')) // false
console.log(isUpperCase('b')) // false
console.log(isUpperCase('z')) // false


//上記を利用して配列のいずれかに大文字が含まれるか
console.log(['A', 'B', 'c'].some(isUpperCase)) //true

//配列のすべてが大文字かどうか
console.log(['A', 'B', 'c'].every(isUpperCase)) //false

```

### 大文字の文字列と照らし合わせて
```JavaScript
//ABC...Zの文字列に合致するか
const strAtoZ = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
const isUpperCase = arr => {
  for (let i = 0; i < strAtoZ.length; i++) {
    if (arr === strAtoZ[i]) {
      return true
    }
  }
  return false
}
console.log(isUpperCase('A')) // true
console.log(isUpperCase('a')) // false

//配列にして
const isUpperCase = str => {
  const arr = STR.split('')
  return arr.indexOf(str) >= 0 ? true : false
}
console.log(isUpperCase('A')) // true
console.log(isUpperCase('a')) // false
```
【Ruby】paizaスキルチェックの値取得・出力サンプルコードを読み解く

##はじめに
初めてpaizaスキルチェックに挑戦したとき、[サンプルコード](https://paiza.jp/guide/samplecode)を見てもさっぱりわかりませんでした。
というわけで、こちらのサンプルコードを読み解いていこうと思います。

```ruby:サンプルコード
input_line = gets.to_i
input_line.times do
  s = gets.chomp.split(" ")
  print "hello = #{ s[0] } , world = #{ s[1] }\n"
end
```

###この記事の対象とする人

* [Progate](https://prog-8.com)のRubyは一通りした上でスキルチェックにチャレンジしたけど意味がわからなかった。
* 標準入力ってなんだよ……。

##そもそも入力される値とか期待する出力って何？

###入力される値

この値が与えられます。一行ずつ入力されるという風に考えればいいです。

```text
2
2,5
3,4
```

>このテストケースでは、最初の値は、その後入力される行数を示す(2行の入力がある) 
>2行目以降は、helloとworldの値が[,]区切りで書かれています。

###期待する出力

「こんな風に表示するコードを書いてね」という見本です。

```text
hello = 2 , world = 5
hello = 3 , world = 4
```

今回は、`hello = ? , world = ?`というように2行書かれるようです。

##サンプルコードを読み解く

さて、ではサンプルコードの解説です。


```ruby
input_lines = gets.to_i
```

`input_lines`は変数です。なんでもいいですが、わかりやすく書きましょう。
`gets`によって入力された値（ここでは、１行目の**2**）が取得できます。……が、そのままだと`"2"`という文字列なので、計算などには使えません。そこで、to_iメソッドで`2`という整数に変換します。

```ruby
input_lines.times {
  # 省略
}
```

`input_lines = 2`なので、`2.times {}`と同じです。つまり、{}で囲まれた処理を2回繰り返すよ、という意味です。
処理が何度繰り返されるかは場合によって変わりますが、ちゃんと最初の行で示されるので、ここまでの流れはどんなスキルチェックでも変わらないと思います。


```ruby
  s = gets.chomp.split(",")
```

sは変数です。
2回目の`gets`では`"2,5\n"`という文字列が取得できます。`chomp`によって改行コード（`\n`）を取り除きます。さらに`split(",")`で、`"2,5"`という文字列を`,`で区切って`["2", "5"]`という2つの配列にします。
この配列を変数`s`に格納します。

ただし、この配列は数の配列ではなく文字列の配列です。
今回は文字列の一部として使うので問題ないですが、計算などで使う場合は注意が必要です。


```ruby
  print "hello = ",s[0]," , world = ",s[1],"\n"
```

`print`は`puts`とは違い、行末に改行がないので、最後に`"\n"`と書いています。
以下の書き方でも同じように出力できます。

```ruby
  puts "hello = #{s[0]}, world = #{s[1]}"
```

##その他

###確認のために`p`を使う
基本的に文字列などを表示するときは`puts`や`print`を使います。しかし、コードを書いていると文字列なのか数なのかわからなくなることがあります。
`p`を使うと、文字列は`""`に囲まれて表示されます。そのため、スキルチェックの途中段階では`p`で出力するとよいです。


###`gets`について

`gets`で取得する値の単位は**一行ずつ**です。例えば、

```text
5
1 2 3
1 2 10
```

と入力される場合、

```ruby
p gets
p gets
p gets
```

というコードを書くと、

```text
"5\n" 
"1 2 3\n" 
"1 2 10\n"
```

という出力になります。
`p`で出力した場合は改行コードも表示されます。

また、上記で出てきたメソッド`to_i`, `chomp`, `split`を使うと、以下のように表示されます。

```ruby
p gets.to_i
p gets.chomp
p gets.chomp.split(" ")
```

↑コード　出力↓

```text
5
"1 2 3"
["1", "2", "10"]
```


###スキルチェックに関するリンク

今回の内容に直接的に関係があるわけではありませんが、スキルチェックを解くにあたって以下のリンクが参考になると思います。

* [paizaの問題を解くときに使えるテクニック1(Ruby編)](https://qiita.com/ryuchan00/items/9da4f8b62d6af3f29b4a)
* [paizaで戦うために便利なRubyのメソッド](https://qiita.com/hiromichinomata/items/a7532468b673246650da)

##おわりに

間違った内容があれば、コメントでご指摘いただけるとありがたいです。
クラス内でのアクセス権とは

#いきなり結論
アクセス権は3種類。
「public」「private」「protected」
##public
どこからでもアクセス可能。
##private
そのクラス内からのみアクセス可能。
子クラスからのアクセスは不可。
##protected
そのクラスと、親子クラスからのみアクセス可能。
#ついでにPHPでの記述例
```php5:public
class Hoge {
  public $hoge; //プロパティ
  public function sayHi(){ //メソッド
    return hoge;
  }
}
```
```php5:private
class Hoge {
  private $hoge; //プロパティ
  private function sayHi() { //メソッド
    return hoge;
  }
}
```
```php5:protected
class Hoge {
  protected $hoge; //プロパティ
  protected function sayHi() { //メソッド
    return hoge;
  }
}
```

簡単ですが以上です。
request.getRequestDispatcherのパスの注意点

修飾名が以下の場合でも

/dev/WebContent/jsp/result.jsp

画面遷移の際のパスは

```
request.getRequestDispatcher("/WebContent/jsp/result.jsp").forward(request,response );
```

上記記述ではなく

```
request.getRequestDispatcher("/jsp/result.jsp").forward(request,response );
```
WebContentを省いた記述をする。
WebContentがあると404エラーとなる。
Railsコンソールの表示を変更するHirbとPryのインストール方法メモ

#はじめに
以下のサイトから抜粋したメモ書きです｡
詳細が知りたい場合は､下記サイトを参考にして下さい｡

[参考サイト1]
(https://wonderwall.hatenablog.com/entry/2015/08/07/211122)
awesome_pointも解説されています｡

[参考サイト2]
(https://ruby-rails.hatenadiary.com/entry/20141024/1414081224)
pryの概要からコマンド､さらにはgemのデバック機能まで解説されています｡

[参考サイト3]
(https://qiita.com/AknYk416/items/6f0bec58712edaf4940e)
pry-byebugの使用方法が解説されています｡

##【インストール手順】
1.project作成
2.Gemfile編集(下記)
3.Bundlerでgemをインストール
```$ bundle install
```4.Pryではルートディレクトリに.pryrcを作成

# Hirb
```ruby:Gemfile
【追記】
group :development, :test do
gem ‘hirb’			# モデルの出力結果を表形式で表示するGem
gem ‘hirb-unicode’	# 日本語などマルチバイト文字の出力時の出力結果のずれに対応
```
有効化

```
irb(main):> Hirb.enable
```

# pry

[ドキュメント(github)](https://github.com/pry/pry/wiki/FAQ#awesome_print)

```ruby:Gemfile
【追記】
group :development, :test do
  gem 'pry-rails'  			# rails console(もしくは、rails c)でirbの代わりにpryを使われる
  gem 'pry-doc'    			# methodを表示
  gem 'pry-byebug' 			# デバッグを実施(Ruby 2.0以降で動作する)
  gem 'pry-stack_explorer'	# スタックをたどれる
```

4.Pryではルートディレクトリ(GemfileがあるDir)に.pryrcを作成

>rails consoleにPryを使用している場合、このままでは起動時にHirbが有効にならないため.pryrcに下記設定（PryのWiki参照）

```ruby:.pryrc
begin
  require 'hirb'
rescue LoadError
  # Missing goodies, bummer
end

if defined? Hirb
  # Slightly dirty hack to fully support in-session Hirb.disable/enable toggling
  Hirb::View.instance_eval do
    def enable_output_method
      @output_method = true
      @old_print = Pry.config.print
      Pry.config.print = proc do |*args|
        Hirb::View.view_or_page_output(args[1]) || @old_print.call(*args)
      end
    end

    def disable_output_method
      Pry.config.print = @old_print
      @output_method = nil
    end
  end

  Hirb.enable
end
```

Hirb.enableが書いてあるから有効化されてる｡

##Pryのコマンド
```
  find-route         See which urls match a given controller.
  recognize-path     See which route matches a url.
  show-middleware    Show all middleware (that rails knows about).
  show-model         Show the given model.
  show-models        Show all models.
  show-routes        Show all routes in match order.
```

困ったらhelpコマンド

```
pry(main):> help
```

エイリアス

```ruby:.pryrc
if defined?(PryByebug)
  Pry.commands.alias_command 's', 'step'
  Pry.commands.alias_command 'n', 'next'
  Pry.commands.alias_command 'f', 'finish'
  Pry.commands.alias_command 'c', 'continue'
end
```
[PHP]クラスの継承

#今回のコード
```php5:例
<?php

class User { //こっちが親クラス
  public $name; //プロパティ

  public function __construct($name) { //コンストラクター
    $this->name = $name;
  }
  public function sayHi() { //メソッド
    echo "hi, $this->name!（こっちはUserクラスから）<br>";
  }
}

class AdminUser extends User { //こっちは子クラス
  // プロパティやコンストラクターはオーバーライド
  public function sayHi() {
    echo "hi, $this->name!（こっちはAdminUserクラスから）";
  }
}

$user1 = new User("太郎"); //親クラスからインスタンス化
$user2 = new AdminUser("次郎"); //子クラスからインスタンス化

$user1->sayHi();
$user2->sayHi();
```
```text:実行結果
hi, 太郎!（こっちはUserクラスから）
hi, 次郎!（こっちはAdminUserクラスから）
```
#親クラスと子クラス
クラスの継承の場合、元になる方のクラスを親、継承する方のクラスを子と呼ぶ。
今回のコードの場合、Userクラスの方が「親」、AdminUserクラスの方が「子」にあたる。
#子クラスの書き方
```php5:上記の例より抜粋
class AdminUser extends User {
}
```
AdminUserというクラス名なので、普通通り「class AdminUser」と記述。
その後に、Userクラスを引き継ぐという意味で「extends User」とすると継承できる。


[参照サイト](https://dotinstall.com/lessons/basic_php_v2/34120)
C言語の可変長引数を取る関数サンプル

C言語のstdargが難しいので、自分なりのサンプルを作成してみました。`man stdarg`でstdargライブラリのマニュアルも合わせてご確認ください。

```c
#include <stdio.h>
#include <stdarg.h>

int sum(int num1, ...) {
    va_list list;
    int n;
    int sum = num1;
    if (sum == 0) return 0;
    va_start(list, num1);
    while (1) {
        n = va_arg(list, int);
        if (n == 0) break;
        sum += n;
    }
    va_end(list);
    return sum;
}


int main() {
    int res = sum(1,2,3,4,5,6,7,8,9,10,0);
    printf("sum = %d\n", res);
    return 0;
}
```
新しいデバイスを利用するときに心がけていること

CPU、ネットワークIC,グラフィックICなど新しいチップを利用する場合ののリスクを回避する経験則を記録する。
すべての場合にそうしているというわけではない。

# １. ハードウェアの不具合
 特定の機器とつながらない
３ヶ月くらい様子を見る。
３箇所くらいから情報を収集する。
繋ぎたい相手の機器で利用しているICとソフトの版を持っている。
　
# ２. デバイスドライバ（ソフトウェアの不具合）
３ヶ月くらい様子を見る。
３箇所くらいから情報を収集する。
他のOSのデバイスドライバの様子も調べる。Windowsはうまく動いているが、情報開示がなく、Linuxのドライバがうまく作れないことあるかも。

# ３. 対応していなOS、ソフトの存在。
対応すべきOS、ソフトの版の一覧を持っている。

Linuxであれば、Suse Linuxがドライバの提供が早かった。
Linuxのドライバがあっても、他のOSへの移植が難しい場合もあるらしい。　

# 参考文献
無線地域網(WLAN)設計・導入・運用・保守に必要な技能と情報
https://qiita.com/kaizen_nagoya/items/d0f37f6f517fa28b5d02

一覧の一覧( The directory of directories of mine.) Qiita(100)
https://qiita.com/kaizen_nagoya/items/7eb0e006543886138f39

プログラマが知っていると良い「公序良俗」
https://qiita.com/kaizen_nagoya/items/9fe7c0dfac2fbd77a945

小川清最終講義、小川清最終講義（再）計画, Ethernet(100) 英語(100) 安全(100)
https://qiita.com/kaizen_nagoya/items/e2df642e3951e35e6a53

＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞
This article is an individual impression based on the individual's experience. It has nothing to do with the organization or business to which I currently belong.
# 文書履歴
ver. 0.01 初稿 20190107午前
ver. 0.02 編集リクエスト受諾および参考文献追記 20190107　昼
ver. 0.03 ありがとう追記 20230614
### 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
####  Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.
DeployGateでチーム内にiOSアプリを配布したい！

某スタートアップのお手伝いをしていて、そのときにDeployGateの設定をしました。
今回はDeployGateを使うときの手順書です。

# アカウントをつくる

まずはDeployGateのアカウントを作ります。
いろいろプランがあるのですが、今回は個人開発者向けプランのFREEで登録します。
https://deploygate.com/

# ipaファイルをつくる

Xcodeのdevice選択の部分をGeneric iOS Deviceにして、XcodeのArchiveを押して動作完了を待ちます。

![fd0f12b8d1b7a9062c5b4d0663fc66a9.jpg](https://qiita-image-store.s3.amazonaws.com/0/155459/b62648cb-aec7-61c7-9c45-b8b48c8e4ab0.jpeg)

こんな画面になったらDestribute Appを押します。
いろいろ設定するところがあるので必要に応じて選択していきます。
今回はDevelopmentを選択し、ほかはデフォルトのままで作成します。

# ipaファイルをアップロード
DeployGate上にアップロードボタンがあるので先程作成したipaファイルをアップロードします。

# 端末の登録
アップロードできると配布用のQRコードかメールが送れるようになります。
これらのリンクをiPhoneで開くと、構成プロファイルのインストールを要求されたりするのでこれに従います。

# UUIDの取得
開発端末のUUIDを取得します。
DeployGateの各アプリ画面にUUIDをエクスポートするというボタンがあるのでそこをクリックするとダウンロードが始まります。
https://qiita.com/takahi5/items/01fab840deb3c238cb76

# Apple Developer accountの作成
やっていない人はアカウントを作成します。

# App IDの作成
アプリのIDを作ってない場合はApple Developer siteから作成します。
参考: https://i-app-tec.com/ios/ios-app-ids.html

# Provisioning Profileの作成
こちらもやってない場合は作成します。
参考: https://i-app-tec.com/ios/provisioning-profile.html

# Provisioning ProfileにUUIDを登録
↑で作ったProvisioning ProfileのEditをクリック。
エクスポートしたUUIDをこちらにアップロードします。

# ipaをアップロード
先程と同じ手順で再度ipaファイルを作成、DeployGateにアップロードします。
デバイス登録画面を開いて、プロビジョニングファイルのところが登録済になっていれば成功です。

１から構築するときでもめちゃくちゃ簡単にできてすごく便利ですね！
自動化できるともっと楽になるので早く構築したいです！

## 参考
https://qiita.com/k_kinukawa/items/bbb3e98239e51fc3c803
https://qiita.com/takahi5/items/01fab840deb3c238cb76
CodeceptJSのwithin()が最高だという話（と注意点）

CodeceptJSには `within()` という強力な機能があります。
簡単に言うと、セレクタのルートノードを固定してくれる機能で、コンポーネント単位のテストに非常に有用です。

雑すぎる例ですが、二つのdivに同じ名前の要素があり、片方を選びたいことは多いでしょう。

```html

<div>
  <div id="content1">
    <button>ボタン1</button>
    <button>ボタン2</button>
    <button>ボタン3</button>
  </div>
  <div id="content2">
    <button>ボタン1</button>
    <button>ボタン2</button>
    <button>ボタン3</button>
  </div>
</div>
```

こういう場合に、 `within()` を使うとすっきり書くことが出来ます。

```javascript

// withinを使わない場合

I.click(locate('#content1').find('button').withText('ボタン1'))
I.click(locate('#content1').find('button').withText('ボタン2'))
I.click(locate('#content1').find('button').withText('ボタン3'))
I.click(locate('#content2').find('button').withText('ボタン1'))
I.click(locate('#content2').find('button').withText('ボタン2'))
I.click(locate('#content2').find('button').withText('ボタン3'))

// withinを使う場合
within('#content1', () => {
  I.click('ボタン1')
  I.click('ボタン2')
  I.click('ボタン3')
})
within('#content2', () => {
  I.click('ボタン1')
  I.click('ボタン2')
  I.click('ボタン3')
})
```

`within()`を使った時に`locate()`すらも登場しなくなっているのは、対象となる要素が1つに限定されたので、 [Semantic Locator](https://codecept.io/locators#semantic-locators) を利用できるようになったからです。


## 注意点

### within()のネストはできない

出来ません。諦めて下さい。

### 後から増えた要素は見つけられない

例えば、上記のケースで、 `ボタン3` をクリックすると `ボタン4` が増えるようなjavascriptが仕込まれていたとします。


```html

<div>
  <div id="content1">
    <button>ボタン1</button>
    <button>ボタン2</button>
    <button id=button3>ボタン3</button>
  </div>
</div>

<script>
$('#button3').on('click', function() {
  $(this).parent().append('<button>ボタン4</button')
})
</script>
```

このとき、同じ`within()`の中でボタン4まで押しに行くと失敗します。

```javascript

// 失敗するパターン
within('#content1', () => {
  I.click('ボタン1')
  I.click('ボタン2')
  I.click('ボタン3')
  I.click('ボタン4')
})
```

一度withinを抜けて、また入り直せばOKです。

```javascript

// 大丈夫なパターン
within('#content1', () => {
  I.click('ボタン1')
  I.click('ボタン2')
  I.click('ボタン3')
})
within('#content1', () => {
  I.click('ボタン4')
})

```

なので、「ボタン3を押したらボタン4が出てくるかどうかを検証する」ようなテストの場合、アサーションだけwithinの外に書かないといけないです。この仕様だけちょっと気に食わないですね……！

```javascript
// 失敗するやつ
within('#content1', () => {
  I.click('ボタン1')
  I.click('ボタン2')
  I.click('ボタン3')
  I.waitForText('ボタン4')
})

// 成功するやつ
within('#content1', () => {
  I.click('ボタン1')
  I.click('ボタン2')
  I.click('ボタン3')
})
I.waitForText('ボタン4')

```
GitlabからGCP Cloud Source Repositories へ連携する

# はじめに

Gitlab から Cloud Source Repositories へソースコードを同期します。
同期したあとは、Cloud Source Repositories から Cloud Buildに連携して、デプロイ自動化を行ったりできます！ 

※ プロバイダが、GitHubかBitBucketであれば、GCP標準で外部リポジトリ接続のサービスが提供されています。


# 手順

## 【GCP側操作】  リポジトリ作成

* コンソール > Cloud Source Repositories で 新しいリポジトリを作成します
* ここでは、 **新しいリポジトリを作成** を選択します。 (Gitlabは外部リポジトリ連携が標準で不可のため)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/108052/1b55a18b-b113-126f-4612-ef71641da0f2.png)

* 以下を指定
    * リポジトリ名
    * プロジェクト: GCPのプロジェクトを指定

![image.png](https://qiita-image-store.s3.amazonaws.com/0/108052/fe8dea62-00fd-e4e3-1901-280bda085202.png)


## 【GCP側操作】  Gitlabからのアクセスするための user/passを発行

* リポジトリにコードを追加 ページで以下を選択
    * ローカル Git リポジトリからコードを push
    * 手動で生成した認証情報

![image.png](https://qiita-image-store.s3.amazonaws.com/0/108052/2ad4e85d-4e8c-fc02-49eb-7d4321e4a56d.png)

* **Git 認証情報を生成して保存します。** をクリック
    * アカウント確認があるので、OKして進む
    * Google Cloud Developer からの権限承認がでるので、OKしてすすむ

![image.png](https://qiita-image-store.s3.amazonaws.com/0/108052/ac1ee6aa-9f83-d453-c9cf-6bfdbe1db90f.png)

* コピー&ペーストできるコマンドを ターミナルで実行 (※ bashでやるのがよいです。私はzshだとうまく行かなかったので)

```
eval 'set +o history' 2>/dev/null || setopt HIST_IGNORE_SPACE 2>/dev/null
 touch ~/.gitcookies
 chmod 0600 ~/.gitcookies

 git config --global http.cookiefile ~/.gitcookies

 tr , \\t <<\__END__ >>~/.gitcookies
source.developers.google.com,FALSE,/,TRUE,****************************************************
__END__
eval 'set -o history' 2>/dev/null || unsetopt HIST_IGNORE_SPACE 2>/dev/null
```

* ~/.gitcookies にパスワードが生成されています。 これを後ほど Gitlab側の操作で使用します
    * サンプル:  (**=** で区切られています)
    * [user].gmail.com : user
    * [password] : password

```
$ cat .gitcookies 
source.developers.google.com    FALSE   /   TRUE    2147483647  o   [user].gmail.com=[password]
```


## 【Gitlab側操作】  同期設定を行う

* Setting > Repository を選択
* 以下を設定して、 *Mirror repository* をクリック

![image.png](https://qiita-image-store.s3.amazonaws.com/0/108052/94418468-a393-1d77-7dbe-60c4579b9444.png)



| 項目                  | 値                                                                              |                                 |
|-----------------------|---------------------------------------------------------------------------------|---------------------------------|
| Git repository URL    | https://[user].gmail.com@source.developers.google.com/p/[project]/r/[repositry] | "@の前にuser (例はgmail)" URLは |
| Mirror direction      | Push                                                                            | Gitlab → GCP                    |
| Authentication method | Password                                                                        |                                 |
| Password              | [password]                                                                      |                                 |


* くるくるマークをクリックして、Errorが発生せず、 Last update の時間が表示されれば、ソースは同期完了です！

![image.png](https://qiita-image-store.s3.amazonaws.com/0/108052/a8b8f5c3-aca7-d49c-2957-936bb8a9618a.png)
macOS mojaveをクリーンインストールしてからvimをビルドするまで

年末年始にmojaveをアップデートしたときにアップデートが固まるトラブルがあり、クリーンインストールしました。
まっさらな状態からvimをビルドしたのですが、これは開発環境構築手順として便利だと思うのでまとめます。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">新しい環境でvimがビルドできると人心地がつく <a href="https://t.co/7pSkZbJF8z">pic.twitter.com/7pSkZbJF8z</a></p>&mdash; sasaki (@yysaki) <a href="https://twitter.com/yysaki/status/1079321738771496961?ref_src=twsrc%5Etfw">2018年12月30日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

## 前提
* macOS mojave 10.14.2
* vimのソースコードは `ghq get vim/vim` で取得する

## 手順

以下Terminal.appのコマンドライン上で実行します。

### gitのインストール

``` bash
xcode-select --install
```

### homebrewのインストール

``` bash
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

### ghqのインストール

``` bash
brew install ghq
```

追記:
初稿では`go get`による方法を記載してましたが、　@EqualL2　さんのより手数の少ない手順に書き換えました。ありがとう御座います。

### vimのビルド

vimをmake, make installします。
なお、vimのHEADをコマンド一発でインストールできると個人的に便利なので、以下のようにaliasを定義しています。

``` bash
function makeInstallLatestVim() {
  ghq get vim/vim --update;
  pushd `ghq list vim/vim --full-path`;
  git checkout master;

  ./configure \
    --with-features=huge \
    --enable-luainterp \
    --with-lua-prefix=/usr/local \
    --enable-perlinterp \
    --enable-pythoninterp \
    --enable-python3interp \
    --enable-rubyinterp \
    --enable-fail-if-missing;

  make;
  sudo make install;
  popd
}

alias vup=makeInstallLatestVim

```

このaliasを使ってvimをインストールします。
LuaおよびPython3を有効にしたいため、homebrewで事前にインストールしておきます。

``` bash

brew install lua
brew install python3
vup
```

以上です。

## おまけ
自分個人のvimrcの設定手順です。

### dotfilesを取得

``` bash
cd ~/
git clone https://github.com/yysaki/dotfiles.git
cd dotfiles/
sh setup.sh link
git clone https://github.com/Shougo/dein.vim.git ~/.vim/dein/repos/github.com/Shougo/dein.vim
```

vimを起動して以下を実行:

``` vim
:call dein#install()<CR>
:q<CR>
```

### iTerm2のインストール
最初の方で引用したtweetの画像は、 iTerm2のicebergテーマを使ってスクショしています。

* https://www.iterm2.com/
* https://github.com/Arc0re/Iceberg-iTerm2


こちらの設定手順は割愛します。
AWS lambdaを使ってBatchにjobを投げる

## 本記事でやること
- Pythonで書いたlambda functionでAWS Batchにジョブを投げる。

本記事でやらないことは以下の通りなので、他の記事を参照してください。

- lambdaやBatchにアクセスするためのIAMロールの作成
- lambda functionの作成の仕方
- AWS Batchのコンピューティング環境やジョブ定義などの環境構築（過去の記事で紹介しているので[こちら](https://qiita.com/kurakura0916/items/a6f9615da5eeabb3e0dc?fbclid=IwAR1mXnddoEGHTVm5DvdfBJFsqmMe7RiyBBLhMOg1u96GRjm_FL_2Bv37RRU)を参照してください）

## 対象読者
- AWSの各サービスの役割を一通り知っている方
- AWS lambdaとAWS Bathをいじって何か動くものを作ってみたい方
- Python入門者

## 使用言語
Python 3.6.3


## AWS Batchにジョブを送るlambdaスクリプト

以下が、AWS Batchにジョブを送るlambdaのスクリプトになっています。
`get_revision`メソッドは、ジョブ定義の最新のrevisionを取得する役割のメソッドになっています。
`get_job_params`メソッドでは、`lambda_handler`メソッドでジョブを送る際のジョブ名やジョブキュー、ジョブ定義のパラメータを作成するメソッドになっています。

また、関数外で定義しているARNには、AWS Batch / lambda / CloudWatchへのFullAccess権限が付与されています。

```python:lambda_function
import logging
import boto3

LOGGER = logging.getLogger()
LOGGER.setLevel(logging.INFO)

ARN = "arn:aws:batch:ap-northeast-1:hogehoge"


def lambda_handler(event, _context):
    LOGGER.info(event)

    client = boto3.client("batch")

    params = get_job_params(event, client)

    client.submit_job(
        jobName=params["JOB_NAME"],
        jobQueue=params["JOB_QUEUE"],
        jobDefinition=params["JOB_DEFINITION"]
    )


def get_revision(client, job_definition_name):
    job_definitions = \
        client.describe_job_definitions()['jobDefinitions']

    revision_num = 1

    for job in job_definitions:
        if job["jobDefinitionName"] == job_definition_name:
            if job["revision"] > revision_num:
                revision_num = job["revision"]

    return revision_num


def get_job_params(event, client):
    params = {}
    job_definition_name = "test-batch-job"
    revision_num = get_revision(client, job_definition_name)

    params["JOB_NAME"] = "test-job"
    params["JOB_QUEUE"] = ARN + ":" + "job-queue/s3_get_bucket_list"
    params["JOB_DEFINITION"] = "test-batch-job" + ":" + str(revision_num)

    return params

```

## 実行及び確認
今回は定期的にBatchを動かすことを想定しているので、CloudWatch eventsを使って定期的にlambdaを起動しジョブを送ります。（エラーが発生し実行されない場合はCloudWatch logsを使ってエラー内容を確認しながら修正をしていきました。）

以下、AWSコンソールでCloudWatch eventsのルール（いつlambdaを起動するのか）を定めます。ルールが作成されたらlambdaが起動しますのでAWS Batchのコンソール画面で正常にジョブが送信されたことを確認します。

<img width="1440" alt="スクリーンショット 2019-01-06 21.03.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/270991/93e1f1ae-5ece-df9e-c3f5-856508e53372.png">

以下、該当のジョブキューでのジョブのステータスがSUCCEEDEDになっていることが確認できれば無事完了です。

<img width="1412" alt="スクリーンショット 2019-01-06 21.08.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/270991/dbad0aac-17ba-62be-c14e-471770a71301.png">


## なぜlambdaを使ってAWS Batchにジョブを送るのか
AWS Batchを定期的に動かしたいだけであれば、lambdaからではなくCloudWatch eventsにBatchを登録すれば達成できます。
しかし、「S3の該当バケットにファイルがPUTされたことを確認しBatchを動かしたい」などBatchを動かしたいある一定の条件がある場合にlambdaが非常に役立ちます。
S3のバケット及びファイルを確認するlambdaスクリプト、Batchにジョブを送るlambdaスクリプトと役割を分けたlambdaを用意し、「S3の該当バケットにファイルがPUTされたことを確認したらBatchにジョブを送るlambdaを起動する」といった具合にlambda同士を連携させることができれば上記を達成することができます。
つまり、lambdaを使えば、諸AWSサービスの状態を確認しBatchにジョブを送ることが可能になります。

## 終わりに
今回はただlambdaを使ってBatchにジョブを送るスクリプトを作成しましたが、S3の状態を監視しある一定の条件を満たした場合にジョブを送る様なlambdaスクリプトを時間がある時に作成したいと思います。
GCEのstackdriver-logging-agentを止める

GCEでContainer-Optimized OSのバージョンをcos-stable-66-10452-89-0からcos-stable-71-11151-71-0に上げたところ、stackdriver-logging-agentというコンテナが起動するようになりました。

stackdriver-logging-agent経由でfluentdが動いており、f1-microでRailsのアプリを動かしているとメモリを圧迫してやっかいなので、手作業ですが止めることにしました。

Systemdにサービスとして登録されているようです。

```
systemctl list-units | grep stack

stackdriver-logging.service   loaded active   running   Fluentd container for Stackdriver Logging

sudo systemctl stop stackdriver-logging.service
```

はじめから起動しないオプションでもあればよいのですが。
ギブスサンプリング メモ

#ギブスサンプリングについて
参考：http://www.mit.edu/~ilkery/papers/GibbsSampling.pdf
間違っていたら教えていただけると幸いです．

##概要
###ギブスサンプリングを行う目的
ベイズ推定で事後分布を推定する際に，周辺分布の算出に積分が必要になる．
しかし，積分するのが難しいことがあるため，周辺分布のサンプリングをギブスサンプリングによって行う．
→ギブスサンプリングというサンプリング手法を用いれば周辺分布のサンプルを近似でき，周辺分布の性質を再現できる！

つまり，ギブスサンプリングは「分布から$N$個サンプリングすれば，分布の特性がわかる」というマルコフ連鎖モンテカルロ法の考え方をベースにしている．

この時周辺分布からどうやってサンプリングをするのか？
→ここでギブスサンプリングの出番

##説明
一つの確率変数を選択し，それ以外の確率変数を固定し，選択した確率変数の値をサンプリングする．これを繰り返し確率変数を変更しながら行うことによって，最終的に周辺分布のサンプリングを行った場合の同じようなサンプリングが行えるようになる．

##例を使ったアルゴリズムの説明
例を用いてギブスサンプリングを説明すると．．．
確率変数$X_1,X_2,X_3$があるとする．（サイコロでのイメージ）
($X_1=1,2,3,4,5,6$,$X_2=1,2,3,4,5,6$,$X_3=1,2,3,4,5,6$)
この時，いろんな組み合わせの$X_1,X_2,X_3$のデータがあるとする．

**STEP1**
まず$x_1^{(0)},x_2^{(0)},x_3^{(0)}$の初期値を決める．（多くの場合，事前分布より定める）
今回はそれぞれ3,4,5とする

**STEP2**
以下の式よりサンプリングを繰り返す
$x_1^{(i)}\sim p(X_1=x_1|X_2=x_2^{(i-1)},X_3=x_3^{(i-1)})$
$x_2^{(i)}\sim p(X_2=x_2|X_1=x_1^{(i)},X_3=x_3^{(i-1)})$
$x_3^{(i)}\sim p(X_3=x_3|X_1=x_1^{(i)},X_2=x_2^{(i)})$

例ではまず以下のよりサンプリングを行う．

$x_1^{(1)}\sim p(X_1=x_1|X_2=4,X_3=5)$

→この時，$X_2=4,X_3=5$の場合，$X_1$が1から6の中でどの値になりそうかの確率を知っているとする．サイコロである場合は全て$1/6$

実際のデータでも，$X_2=4,X_3=5$の時，$X_1$が取る1から6の値は大体それぞれ$1/6$の確率で出現している（はず）．サンプリングの結果$x_1^1=2$であったとする．

次に以下よりサンプリングを行う．

$x_2^{(1)}\sim p(X_2=x_2|X_1=2,X_3=5)$
サンプリングの結果$x_2^{(1)}=1$であったとする．

また，次のサンプリングを行う．

$x_3^{(1)}\sim p(X_3=x_3|X_1=2,X_2=1)$

以上の$x_1,x_2,x_3$それぞれをサンプリングする操作を繰り返していくことによって，$x_1,x_2,x_3$のパターンを多く取得できる．
ただし，サンプリング開始直後のサンプリングは最終的に得たい周辺分布のサンプルを表していないことが多いため，ある程度サンプリングが安定してきてからのサンプルを用いるのが良い．
OpenSUSE Leap 42.3事始め

## OpenSUSE Leap 42.3の概要

## 使い方色々
### パッケージ管理
GUIで行う場合は、YaSTからsoftware managementを選択する。
CUIで行う場合は

```bash
zypper install
```

### バージョンの確認
デスクトップで、KInfocenterを立ち上げる事でOSの版、KDE Plasmaの等が確認できる。

コマンドラインなら

```bash
more /etc/os-relsease
```

## トラブルシューティング

### pyenvでanacondaを入れたらデスクトップが立ち上がらなくなった
パッケージ管理アプリからもpython3は入れられるし、IPython3, jupyterも使えるがちょっと古いし、リンクされるBLAS/LAPACKも最適なものではないように思えたので、pyenvで最新のanacondaを入れることにした。
諸々の設定を済ませて、再起動したところデスクトップが立ち上がらなくなった。ここまでが背景。

pyenvを使っているとき、`export PYENV_ROOT`でpyenvを入れたディレクトリを指定して、`export PATH=${PYENV_ROOT}/bin:$PATH`でPATHに反映させ、`eval "$(pyenv init -)"`で初期化する。この一連の過程でqt5の設定を書き換えてしまう。
既にKDEデスクトップが立ち上がっていれば良いが、`.bashrc`や`.bash_profile`に記載してログイン初期の内に読み込んでしまうと、KDEの起動がうまくいかない。

これを避けるために、python関係(ipython, jupyter等)を使う直前に一連の設定をaliasで呼び出すようにした。
例えば、

```bash
alias pyenv_activate='export PYENV_ROOT="${HOME}/.pyenv"; export PATH=${PYENV_ROOT}/bin:$PATH; eval "$(pyenv init -)"'
```
を`.bashrc`に記載しておいて、端末から`pyenv_activate`を叩けば、その端末内では適切なPATHが設定されて、anacondaが使える。