OmniAICreator/Qiita-1.07M huggingface dataset:
jupyter/r-notebook で devtools::install_github() すると Installation failed: error in running command でコケる


hoxo-m 氏の [pforeach](https://github.com/hoxo-m/pforeach) を docker コンテナ [jupyter/r-notebook:c54800018c2c](https://hub.docker.com/r/jupyter/r-notebook/) でインストールしようとしたら tarball の展開でコケた…。Jupyter Project が提供する立派な公式コンテナなのに…。

### 解決策

1. options(unzip = 'internal') する
2. Sys.setenv(TAR = "/bin/tar") する

```R
> install.packages("devtools", repos="https://cran.ism.ac.jp/") # 統数研に感謝
> getOption('unzip') # 
''
> options(unzip = 'internal')
> getOption('unzip')
'internal'
> Sys.getenv("TAR")
'/bin/gtar'
> Sys.setenv(TAR = "/bin/tar") # https://github.com/conda-forge/r-devtools-feedstock/issues/4
> Sys.getenv("TAR")
'/bin/tar'
```

コンテナとか Jupyter の問題というより [conda で作った環境の問題っぽい？](https://github.com/conda-forge/r-devtools-feedstock/issues/4)。jupyter/r-notebook に gtar とか入っとらん。

他のバージョンのコンテナで起きる問題かどうかとか何も検証しとらんけど困った人がおったら辿り着けるように置いとくね。

### Reference

1. Jupyter notebook official r-notebook container: https://hub.docker.com/r/jupyter/r-notebook/
2. hoxo-m/pforeach: https://github.com/hoxo-m/pforeach
3. R で超簡単に並列処理を書けるパッケージ pforeach を作った: http://d.hatena.ne.jp/hoxo_m/20141222/p1
4. 'unzip' must be a single character string when calling install_github: https://github.com/r-lib/devtools/issues/406
5. `install_github` fails in conda environment on Linux: https://github.com/conda-forge/r-devtools-feedstock/issues/4


ねえちょっと聞いてる？
ASTERIA WARPでサーバーにファイルを送る便利な方法

ASTERIA WARPのサーバーにデータやテンプレートのファイルを置こうとすると、どうしてもFTPとかSSHとか考えますが、もっと手軽な便利な方法をいくつか紹介します。

# ユーザーのホームフォルダに転送する

ユーザーのホームフォルダ以下のファイルは、フローデザイナーでログインしたときに左下のファイルペインで見ることができます。
![filepane.png](https://qiita-image-store.s3.amazonaws.com/0/41603/257c7b46-a634-61a6-e207-5b4e2fdf9798.png)

ここにファイルをドラッグ＆ドロップすればファイルを転送します。もちろん逆方向＝ダウンロードもできますので、わざわざコンソール開いたりFTPツールを使うよりもお手軽簡単です。

![filepanedd.png](https://qiita-image-store.s3.amazonaws.com/0/41603/f725faa1-6bf3-bb5c-312a-da0dbc9c12dd.png)

# JDBCドライバや自分で開発したコンポーネントを転送する

JDBCドライバや自分で開発したコンポーネントは、ホームフォルダではなくて、インストールフォルダやシステムフォルダになります。ここはさすがにファイルペインでは見えません。
こういうファイルは実は、「ツール」-「外部ライブラリの追加・削除」から転送できるんです。

![addjar.PNG](https://qiita-image-store.s3.amazonaws.com/0/41603/90652407-dba6-d2ca-9a41-b2383a3f62eb.png)

このメニューを選ぶとパスワードを入力するダイアログに「asu」のパスワードを入力すると下のダイアログが出てきます。

![driverupload.png](https://qiita-image-store.s3.amazonaws.com/0/41603/9b1a65dd-c425-353a-0243-309573ed61ee.png)

ここでファイルを選んでアップロードボタンクリックで転送できちゃいます。ただし、ライブラリを追加することになるので、サービスの再起動はお忘れなく。
あと、上で書いたように「asu」のパスワードを知らなければ使えませんので注意してください。まぁ、システムライブラリにファイルを置くので当たり前ですね。
PythonでInstagramAPIを使って画像取り込んだ

#Instagram APIとは
[Instagram API](https://www.instagram.com/developer/)とはその名の通り、Instagramが提供するAPIです。
下記のデータの取得ができます(2018/4/19現在)。
データの取得方法は[ここ](https://www.instagram.com/developer/endpoints/)を参照してください。

- User
    - **ユーザ自身の情報**
    - **ユーザ自身が投稿した最新のメディア**
- Media
    - 指定した場所の近くで投稿されたメディア
- Comments
    - ユーザ自身が投稿したメディアについてコメント
- Tags
    - 指定したタグオブジェクトの情報
    - タグの検索
    - 指定したタグがついたメディア
- Locations
    - ロケーションの情報
    - 指定したロケーションで投稿されたメディア
    - ロケーションオブジェクトの検索

太字の機能のみ審査なしで利用可能です。

#ファイル構造
root/
　┣images/ #画像取り込むフォルダ
　┣configs.py #ユーザ情報設定
　┗api.py

#ユーザ情報設定(configs.py)

```configs.py
CLIENT_ID = "[]"
CLIENT_SECRET = "[]"
ACCESS_TOKEN = "[]"

```

#画像取得プログラム(api.py)

```api.py
from configs import *

import requests
from PIL import Image
from io import BytesIO

# APIのURL
url = "https://api.instagram.com/v1/users/self/media/recent/?access_token={}".format(ACCESS_TOKEN)

# レスポンス(JSON型)
response = requests.get(url).json()

# レスポンスに格納されている各データに対する処理
for d in response['data']:
    # 画像のID
    image_id = d['id']
    # 画像のURL
    image_url = d['images']['standard_resolution']['url']
    # 画像のURLからのレスポンス
    image_response = requests.get(image_url)
    # レスポンスを変換
    img = Image.open(BytesIO(image_response.content))
    # 保存
    img.save('images/%s.jpg' % (image_id), 'JPEG', quality=100, optimize=True)
```

これでimagesフォルダに自身の投稿メディアが保存されます。
【turorial】AWS Cloud9で作成したEC2インスタンスにSSH接続

2018/04/19に実施。

１．EC2ダッシュボードで「キーペアの作成」をクリック。
![1.jpg](https://qiita-image-store.s3.amazonaws.com/0/247425/aab41210-9070-5029-4376-6725eb4b7227.jpeg)

２．キーペア名を入力して「作成」をクリック。
![2.jpg](https://qiita-image-store.s3.amazonaws.com/0/247425/4e484f36-7f78-1c1f-1121-9e1632124f22.jpeg)

３．ポップアップアップが表示される。任意の場所に保存。
![3.jpg](https://qiita-image-store.s3.amazonaws.com/0/247425/af1edf40-54f5-438c-dadb-57d071a4c278.jpeg)

４．ダウンロードしたpemファイルから、パブリックキーを取得。

```
ssh-keygen -y
Enter file in which the key is(): →pemファイルのパスを指定。
```

５．AWS Cloud9で「~/.ssh/authorized_keys」を編集。

```
vim ~/.ssh/authorized_keys
```
最下部に「４．」のパブリックキーを貼り付け。

６．SSHで接続。

```
ssh -i "(pemファイル名)" ec2-user@(パブリックDNS)
```

終わり。
Macのシステム環境値の調査方法とその簡略化

# 概要
Macの設定を変更するには２つの方法がある。
それは、GUI(システム環境設定など)とコマンド「defaults」である。
初期設定をする際には、いちいちGUIでやるよりもコマンドでやるほうが楽だし
shellやAnsibleなどのツールで一括実行もできるし、そうしたい。
でも、そのためにはパラメータ名と値が必要になるから、
今回はその調査方法とその簡略化について説明します。

# ポイント
調査方法は簡単だが何度も行う必要があるため以下のような手間がかかる。
それを解消すること。
* defaultsに出力される情報は大量でみづらい
* 目的の設定がどれであるかわかりづらい
* 手順が複数あるので面倒

# 解決方法

## 1. 以下のshellを任意のディレクトリに保存する

```shell:exec.sh
#!/bin/sh

if [ "$1" = 1 ]
then
# write read-list
defaults read > global-list-new.txt
defaults -currentHost read > currentHost-list-new.txt

# check diff
echo 'currentHost'
diff currentHost-list.txt currentHost-list-new.txt
echo 'global'
diff global-list.txt global-list-new.txt

else
# write read-list
defaults read > global-list.txt
defaults -currentHost read > currentHost-list.txt
fi

```

## 2.保存したshellを実行する

```
1.ファイルを保存したディレクトリへ移動
cd [保存したディレクトリ]

2.設定値書き出し
./exec.sh

3.確認したい設定をGUIで変更

4. 設定値書き出し＆差分確認
./exec.sh 1
```

## 3.表示される情報を確認する
currentHost以下が個別設定
global以下が全体設定

```text:例
currentHost
15c15
<         "com.apple.trackpad.threeFingerDragGesture" = 0;
---
>         "com.apple.trackpad.threeFingerDragGesture" = 1;
global
226c226
<         TrackpadThreeFingerDrag = 0;
---
>         TrackpadThreeFingerDrag = 1;
2570c2570
<         TrackpadThreeFingerDrag = 0;
---
>         TrackpadThreeFingerDrag = 1;
```
# 備考
shellを実行すると
一時ファイルとして同じディレクトリに以下のファイルが生成されますが、
削除しても問題ありません。

```
global-list.txt
global-list-new.txt
currentHost-list.txt
currentHost-list-new.txt
```

# 参考
[システム環境設定をターミナル（defaultsコマンド）から設定する方法（一般）](https://ottan.xyz/system-preferences-terminal-defaults-2-4643/)
ネットワークに接続できない原因の追及法

# ipconfig で Windows のネットワークの構成を確認する

①コマンドプロンプトを開く

②ipconfig と打ち込む

③IPアドレスとサブネットマスクとデフォルトゲートウェイの値におかしな点がないか確認する。
※IPアドレスが「自動構成」になっている場合は注意が必要。重複している可能性があります。



# ipconfig /all で Windows のネットワークの構成を確認する

①コマンドプロンプトを開く

②ipconfig と打ち込む

③設定されている値の中で、おかしなものがないか確認する。
※「自動構成」のIPアドレスと、IPアドレスがある場合は注意が必要。自動構成のIPアドレスの後ろに「（優先）」、IPアドレスの後ろに「（重複）」とある場合は、自分の設定しているIPアドレスが他のPCでも使用されているということです。どちらかのIPアドレスを変える必要があります。



# インターネットプロトコルのプロパティを確認する

①コントロールパネルを開く

②イーサネットで右クリック

③プロパティを選択

④「この接続は次の項目を使用します」の下のチェックボックスの中で、自分の使用しているインターネットプロトコルのバージョンにチェックが入っているかどうか確認する。

⑤チェックボックスの中で、使用していないインターネットプロトコルのバージョンにチェックが入っていないかどうか確認する。
例）IPv4しか使用することはないのに、IPv6にチェックが入っている。

⑥使用するインターネットプロトコルのバージョンの項目をクリック。

⑦IPアドレス、サブネットマスク、デフォルトゲートウェイ、DNSサーバーの設定におかしな点がないか確認。
※デフォルトゲートウェイの四つ目の値は、大抵「1」になることが多いです。それ以外の三つはIPアドレスと同じ値になります。
※優先DNSサーバーは、たいていデフォルトゲートウェイと同じ値になります。



# 一度無効にしてみる

①コントロールパネルを開く

②イーサネットで右クリック

③「無効にする」を選択

④イーサネットで右クリック

⑤「有効にする」を選択



# PC自体を再起動してみる
matplotlibで複数のグラフを描画したい

それぞれplotすることもできるが，subplotの描き方について，よく使いそうなものをちょこっと纏める．
jupyter notebookを使っている想定で，縦にグラフを並べたい．
statsmodels.api.graphicsを使って，時系列tsの偏自己相関関数と信頼限界をプロットする場面．

# 均等割ならadd_subplotが好き

subplotでもできるけど

```python
import matplotlib.pyplot as plt
import numpy as np
import pandas
import statsmodels.api as sm

# ts にはSeries形式でデータがあるものとする．リストやndarrayでも良いけど
N         = len(ts)
pacf      = sm.tsa.pacf(ts, nlags=500)
intervals = pandas.DataFrame( [(2/np.sqrt(N-i), -2/np.sqrt(N-i),) for i in range(len(pacf))]
                            , columns=['plus','minus']
                            )

fig = plt.figure(figsize=(9,16),dpi=200)  # 縦長の領域を指定
ax1 = fig.add_subplot(211)                # 縦に2,横に1のsubplotを並べるうち上(1番目)
ax2 = fig.add_subplot(212)                # 縦に2,横に1のsubplotを並べるうち下(2番目)
sm.graphics.tsa.plot_pacf(ts, lags=len(pacf), ax=ax1)
ax2.plot(pacf, '-o')
intervals.plot(ax=ax2)

plt.show()
```

# 上1/3と下2/3にそれぞれplotする場合などは，gridspecで

```python
import matplotlib.gridspec as gridspec
import matplotlib.pyplot as plt
import numpy as np
import pandas
import statsmodels.api as sm

# ts にはSeries形式でデータがあるものとする．リストやndarrayでも良いけど
N         = len(ts)
pacf      = sm.tsa.pacf(ts, nlags=500)
intervals = pandas.DataFrame( [(2/np.sqrt(N-i), -2/np.sqrt(N-i),) for i in range(len(pacf))]
                            , columns=['plus','minus']
                            )

fig = plt.figure(figsize=(9,16),dpi=200)  # 縦長の領域を指定
G   = gridspec.GridSpec(3,1)              # 3行1列のグリッドに切る感じ
ax1 = plt.subplot(G[:1,0])                # ndarrayのスライス形式で上からグリッド1つ分を指定
ax2 = plt.subplot(G[1:,0])                # ndarrayのスライス形式で1以降のグリッドを指定
sm.graphics.tsa.plot_pacf(ts, lags=len(pacf), ax=ax1)
ax2.plot(pacf, '-o')
intervals.plot(ax=ax2)

plt.show()
```
Working Agreementやってる？

3カ月のプロジェクトをScrumで回すという試みを現在進行形でやっており、アジャイルコーチにWorking Agreement作っていこう！というように言われ、わーきんぐあぐりーめんと？という状態だったのでメモ。

#Working Agreementとは
チームでの決め事のこと。必ずチーム全員で合意を取ること。

#Working Agreementの例
・会議中に携帯はさわらない
・残業はしない
・テストはモデル必須。E2Eは画面系があれば必須。
・レビューは〇〇さんがやる
・レビューが通過したものだけマージ化
・月曜日にスプリント計画とふりかえりを行う
・毎日10:15にデイリースクラムを行う
・もし時間をずらせば参加できる場合、時間をずらす
・プロダクトバックログはRedmineに登録する（お客様用）
・チームのプロダクトバックログ、スプリントバックログはアナログで行う
・振り返りでWorking Agreementの見直しを行う
などなど

#Working Agreementを決めるときの注意点
アクションに繋がらないスローガンのようなものはダメ。（例：相手を尊重する、等）
ルールは具体的に、判断できるようなものを目指す。計測できることが望ましい。
ルールを決めるためのルール、ルールを変更するためのルールなども決めておく。

#参考
[認定スクラムマスター研修を受けたのでその整理](http://chronosdeveloper.hatenablog.com/entry/2015/12/23/025133)
機械学習論文読みメモ_123


[Real-Time Adaptive Image Compression](https://arxiv.org/abs/1705.05823)
本論では損失ありの画像圧縮手法について、機械学習に基づく手法を提案する。
この手法はリアルタイムで、かつどの既存の圧縮手法よりも圧縮効率が良い。
この手法はautoencoderにインスパイアされたpyramid型の特徴抽出を行う。
またモジュールとして量子化したデータに応じたencodingとcodelengthの調整を行う
Adaptive codingとexpected codelength regularizationが存在する。

[Unsupervised Pixel-Level Domain Adaptation with Generative Adversarial Networks](https://arxiv.org/abs/1612.05424)
ラベル付けを要求することなくdomain adaptionを行う手法を提案する。
こうした手法は主に、２つのドメイン間のマッピングを学習させる事を通して
実現する。
本論ではこれをGANに基づくアプローチを用いることで実現する。
この手法ではsource domainの画像をあたかもtarget domainの画像かのように変換する
タスクを学習する。
この手法でシミュレーションで作成した画像を現実的な画像へ変換する事を可能にする。

[Generalization in Deep Learning](https://arxiv.org/abs/1710.05468)
Deep learningモデルの理論研究は長く行われてきた。
まず表現力に関して言えばuniversarityが以前より示されており、
手製の特徴に対して指数的なアドバンテージがある。
一方学習可能性に関してもnon-convexityの枠を超えた特性が発見されている。
今回扱うgeneralizationに関しては、従来deep netは予測に関して良い性能が出せず、
学習データに過剰適合しやすい事が知られており、そこから汎化性能に関する研究
がさかんに行われてきた。
compact表現の文脈においては、ある一定の仮定を満たすクラスはそれを満たさないものと比較して
高い汎化性能を持つ事が分かっている。
しかし一方で、成功しているdeep netモデルは多くがランダムなラベルを全て記憶可能なキャパシティ
を持っており、汎化性能が高いとは言えない。
この現象はapparent paradoxという名で知られている。
本論ではこの現象の説明を試み、それを通してなぜその不安定性、頑健性のなさ、
記憶容量の大きさにも関わらず成功しているdeep netが存在するのかを説明する。
Sales

今日は画面作成のためプログラムをうっていった。打ち間違えとかがあって途中で動かなくなったりしてエラーが多かったので困難しました。
これからもミスしてもいいのでミスしながら覚えていきたいです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249283/c83970b7-a2ad-1280-1241-21b520574212.png)
riot.js routerを使ったメモ帳

### 1. riotがサポートしているルータといっても、完全に独立した機能として提供されている。

```html
<script src="https://rawgit.com/riot/route/master/dist/route.min.js"></script>
```
```js
 //ready
 route.start(true);///
 route.base('/guest/apps/note/');///if default the # 
```
```js
 //usage
 route('/'+this.d.id)/// route(path) //jump to the path
 route(function(id){ console.log(id) })///route(caller) //catch
```

### 2. urlはpushStateを使って変更される。但し、第三者から同様のurlで機能させるにはサーバの設定が、なお必要。
http://riotjs.com/api/route/#customize-router

### 3. 全部
```html
<script src="//gnjo.github.io/riot.js"></script>
<script src="https://rawgit.com/riot/route/master/dist/route.min.js"></script>
<app>
 <div f>
  <div l><div a>id:{now.id}</div><div ref="code" contenteditable="plaintext-only" oninput="{input}"></div></div>
  <div r><li each="{d in ds}" onclick="{jump}">{d.id}</li><li onclick="{add}">+</li></div> 
 </div>
</app>

<style>
 [a]{border-bottom:1px solid}
 [f]{display:flex;flex-direction:row}
 [f]{position:fixed;top:0;left:0;width:100vw;height:100vh}
 [f]>*{height:auto;padding:0.5rem;overflow-y:scroll}
 [l]{width:70%}
 [r]{width:30%} 
</style>
```
```js
let fn={}; fn.rid=()=>{return 'x'+Math.random().toString(36).slice(-8)}
;
riot.tag('app',false,function(opts){
 let self=this,code=null,f=fn.rid,f2=(me)=>{return self.ds.indexOf(me)}
 self.ds=opts.ds;
 self.now=self.ds[0]
 self.one('mount',()=>{code=self.refs.code;code.textContent= self.ds[0].data}) 
 self.input=function(ev){
  let i=f2(self.now); self.now.data=ev.target.textContent;self.ds[i]=self.now
 }
 self.add=()=>{let id=f(); self.ds.push({id:id,data:id}) }
 self.jump=function(){
  self.now=this.d; code.textContent=self.now.data; code.focus();
  route('/'+this.d.id)///
 }
 route((id)=>{  self.update(); })/// 
})
;
route.start(true);///
route.base('/guest/apps/note/');///if comment out,then the default #**** 
let data=[
  {id:'xxxx',data:'xxxx'}
 ,{id:'yyyy',data:'yyyy'}
 ,{id:'zzzz',data:'zzzz'}]
;
riot.mount('app',{ds:data})
;
```
機械学習論文読みメモ_122


[Neural Color Transfer between Images](https://arxiv.org/abs/1710.00756)
視覚的に類似したセマンティクスを持つ画像に対するcolor transferを考える。
提案手法は画像間のセマンティクスをマッチングする構造と、
空間方向の色変化と全体の整合性を維持するような局所線形構造を
どちらも持たせたネットワークを用いる。

[Visual Attribute Transfer through Deep Image Analogy](https://arxiv.org/abs/1705.01088)
大きく異なったappearanceを持つが似たsemantic structureを持つ画像間のvisual attribute transferを考える。
具体的には、色調、トーン、styleなどの画像間遷移を考える。
提案手法は画像間のsemanticなマッチングを、Deepnetから得られる特徴間のマッチングを通して行う。
それらマッチした特徴を利用して最終的な画像遷移を行う。

[Deep Variational Information Bottleneck](https://arxiv.org/abs/1612.00410)
Information bottelneckに関するvariational approximationを提案する。
Information bottleneckでは、入力に対するエンコーダを学習させ、そのエンコード表現の
複雑さに制約をかけながら、出力に対する相互情報量を最大化させる。
本論ではこの表現に対する変分表現を与え、reparametarization trickを用いた表現による
効率的な学習を実現した。
モデル作ったら NoMethodError: undefined method `using_object_ids?' のエラーが出た時の解決方法

# using_object_ids? というメソッドがないと言われている時
```
NoMethodError: undefined method `using_object_ids?'
```


has_many
belongs_to

これらの設定が間違っている可能性が高いです。

has_manyで定義しているのに ”todo” といった単数系で書いていたり

```
has_many :todo
```

belongs_toで定義しているのに "todos" といった複数形で書いていたりしないかチェックしましょう

```
belongs_to :todos
```
Link > Wandbox:ファイルを読込みできる | C言語:includeにてcsvファイルを配列として読込む

```txt:動作環境
Windows 10 Pro (64bit) バージョン 1709
Google Chrome バージョン: 65.0.3325.181（Official Build） （64 ビット）
```

### Wandbox > ファイルを読込みできる

@tenmyo さんの[コメント](https://qiita.com/7of9/items/30188d50e33df6c35066#comment-6427418db7aaf4e7b98c)
にてWandboxにてファイル読込みできることを知りました。

ありがとうございます。

### #include "data.csv"

@tenmyo さんのコードでは以下のようにされています。

```c
int X[][3] = {
#include "data.csv"
};
```

csvファイルを配列にセットする方法ですね。
この方法により、データ切替えが簡単にできます。

関連: [c++ builder XE4, 10.2 Tokyo > .csvからリストをstatic const String[]へ読取り / "//"でコメントアウトもできる](https://qiita.com/7of9/items/cb2fdeba5ad0d232311e)
【超簡単】CentOS7にKVMをインストール

# はじめに
OSインストール時にKVMをインストールすることが可能だが、そこでし忘れた場合でも、後から追加でインストールできる。（OS再インストールなんてしなくていい）

# 動作確認環境
CentOS7.3(GUI)

# コマンド
以下1コマンドのみ。

```
yum install -y qemu-kvm qemu-img virt-manager libvirt libvirt-python libvirt-client virt-install virt-viewer
```

# 確認
アプリケーション > システムツール で仮想マシンマネージャがあれば成功している。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/221948/e5b2160f-e7f5-417d-f9b3-a237d484dacb.png)
【Raspberry Pi】ngrokのインストールからローカル環境の公開まで

##概要
[Heroku](https://www.heroku.com/)に登録したけど、無料枠等考えると、実験的に小さいアプリをいっぱい作る際はローカル環境をそのまま公開するほうが便利と思い、[ngrok](https://ngrok.com/)もインストールしてみました。

##参考にしたサイト

- [ルーターを超えてリモートホストに接続できる ngrok（無料）を使って Raspberry Pi を IoT ハブにする方法](http://netbuffalo.doorblog.jp/archives/4974284.html)

##前提条件

- モデル : Raspberry Pi 3 Model B
- OS : Raspbian Stretch

```Bash:
$ uname -a
Linux raspberrypi 4.14.33-v7+ #1109 SMP Tue Apr 10 17:28:38 BST 2018 armv7l GNU/Linux
```

##事前準備
いつもの手順と、動作確認用のWebサーバをインストール。

```Bash:
$ sudo apt-get update
$ sudo apt-get upgrade

$ sudo apt-get install apache2
```

##ngrokのインストール
[公式サイト](https://ngrok.com/)からダウンロードして、インストールします。

```Bash:
$ wget https://bin.equinox.io/c/4VmDzA7iaHb/ngrok-stable-linux-arm.zip
$ unzip ngrok-stable-linux-arm.zip
$ sudo mv ngrok /usr/local/bin/
$ ngrok version
ngrok version 2.2.8
```

##動作確認
例として、Webサーバ（ポート80）をngrok.comで公開します。

```Bash:
$ ngrok http 80
ngrok by @inconshreveable                                       (Ctrl+C to quit)

Session Status                online
Session Expires               7 hours, 59 minutes
Version                       2.2.8
Region                        United States (us)
Web Interface                 http://127.0.0.1:4040
Forwarding                    http://cfbcxxxx.ngrok.io -> localhost:80
Forwarding                    https://cfbcxxxx.ngrok.io -> localhost:80

Connections                   ttl     opn     rt1     rt5     p50     p90
                              0       0       0.00    0.00    0.00    0.00
```

ブラウザで Forwarding に表示された http または https のアドレスにアクセスできれば成功です。
終了するにはCTRL+Cを押下します。

##関連ページ
[【Raspberry Pi】Heroku CLIのインストールからアプリのデプロイまで](https://qiita.com/sunaga70/items/593ddb3e1eb36774bc5d)
yumdownloader コマンドを使って rpm をダウンロードする

インターネット接続環境がないが、とあるパッケージのアップデートをしたい場合に対応した場合のメモ
手順としては以下。

+ インターネットへの接続可能な環境でインスタンスを作成。こちらはパッケージをインストールしたい環境と同じもので作成
+ 起動したインスタンスで`yumdownloader`を使って rpm をダウンロード
+ アップデートをしたいインスタンスに SCP などでコピー
+ `yum localinstall` でインストール

以下より2点のみ抜粋。

## 起動したインスタンスで`yumdownloader`を使って rpm をダウンロード

[yum を使用して、パッケージをインストールせずにダウンロードだけ行う ](https://access.redhat.com/ja/solutions/395763)


```bash
# yum-utils パッケージ未導入であればインストール
$yum install yum-utils

# kernel をダウンロード
$sudo yumdownloader kernel.x86_64

# ローカルディレクトリにダウンロードされる
$ls
kernel-4.9.91-40.57.amzn1.x86_64.rpm
```

## `yum localinstall` でインストール

```bash
# localinstall コマンドで yum installする
$sudo yum localinstall ./kernel-4.9.91-40.57.amzn1.x86_64.rpm

# kernel だったので reboot
$sudo reboot

# 稼働中の kernel が変わっていることを確認
$uname -r
4.9.91-40.57.amzn1.x86_64

```

なお、`man`を見ると localinstall は指定した rpm をインストールするが依存関係がある場合には解決しようとするようなので、依存する rpm は併せてダウンロードしておき、一緒にインストールしないと依存関係解消の際にネットワーク接続エラーになって問題になると思われる。

```bash
$man yum

・・・
       localinstall
              Is  used  to  install  a set of local rpm files. If required the
              enabled repositories will be used to resolve dependencies.  Note
              that  the  install  command  will do a local install, if given a
              filename. This command is maintained for legacy reasons only.
```

また、以下にあるようにリポジトリを同じネットワーク内に作ることで`yum install`コマンドでインストールが出来るように出来るようです(未検証)

[インターネットと疎通がないマシンに yum で RPM をインストールする](http://blog.amedama.jp/entry/2015/08/31/203556)
【エラー】Check failed: stream->parent()->GetConvolveAlgorithms(&algorithms)


#事象
cudnn系のエラー。
#解決

とりあえず下げれば動いた。

```
pip install tensorflow-gpu==1.5.0
```

#環境
python3.6
ubuntu
cuda9
cudnn 入ってない。
http://pandazx.hatenablog.com/entry/2017/03/21/144832
tensorflow-gpu1.7.0

https://github.com/tensorflow/models/issues/1064
すごいC言語のマクロ __is_constexpr

# はじめに
linuxカーネルで使われているC言語マクロの[紹介記事](https://qiita.com/satoru_takeuchi/items/3769a644f7113f2c8040)を見て、自分も[ソースコード](https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/include/linux/kernel.h?h=v4.17-rc1)を眺めていたら面白いマクロを見つけたので紹介します。

# マクロの機能
```c:include/linux/kernel.h
#define __is_constexpr(x) \
        (sizeof(int) == sizeof(*(8 ? ((void *)((long)(x) * 0l)) : (int *)8)))
```
非常に短いマクロですがこのマクロはxが定数式であるかどうかを判定します。
定数式とは、例えば配列の宣言のときに使えるやつらです
実際試してみると、

```c:test.c
#include<stdio.h>
#define Def 10
#define __is_constexpr(x) \
	        (sizeof(int) == sizeof(*(8 ? ((void *)((long)(x) * 0l)) : (int *)8)))

enum test{Enum};
int main(){
	int Val = 10;
	const int Const_val = 10;
	
	int a = __is_constexpr(Val);
	int b = __is_constexpr(Const_val);

	int c = __is_constexpr(10);
	int d = __is_constexpr(Def);
	int e = __is_constexpr(Enum);
	printf("%d %d %d %d %d\n",a,b,c,d,e);
	return 0;
}
```

```bash:output
0 0 1 1 1
```

変数を入れると0を返しますが、ソースに書き込まれている数や、defineされている数、enumの場合は１を返す、つまりtrueになっていることが分かります。

# 原理
マクロの本体は次のようになっています

```c:macro
(sizeof(int) == sizeof(*(8 ? ((void *)((long)(x) * 0l)) : (int *)8)))
```

まず、次の部分に着目します

```c
(long)(x) * 0l
```

これは、xが定数式であれば定数式の0であり、そうでなければ定数式ではない0です。

```c
((void *)((long)(x) * 0l)) 
```

次に先程の値を(void *)にキャストします。ここでC言語の規格を確認すると
> Nullポインタ定数とは、定数式である0またはそれを(void *)にキャストしたもの。

と書いてあります。定数式の0を(void *)にキャストするとNullポインタ定数になります。しかし、定数式でない0をキャストしてもNullポインタ定数にはなりません。0番地を差すポインタとなります[^1]。


```c
8 ? ((void *)((long)(x) * 0l)) : (int *)8
```

するとこのコードはxが定数式のとき

```c
8 ? [ヌルポインタ定数] : (int *)8
```

となり、xが定数式でないと

```c
8 ? [voidを指すポインタ] : (int *)8
```

となります。

この三項演算子の型を考えます。普通、二番目の式と三番目の式は同じ型でなければなりません。一方がNULLであったりしたらどうなるのか、c言語のマニュアルには次のように書いてあります。

> 一方がNullポインタ定数で、もう一方がポインタであったら、もう一方の型を返す。
>
> 一方がvoidを指すポインタで、もう一方がポインタであったら、voidでない方のポインタがvoidへのポインタに変換されて、voidへのポインタを返す。

つまりxが定数式であったら三項演算子はintへのポインタを返し、そうでないとvoidへのポインタを返します。

以上より、xが定数式のときマクロの本体は

```c
(sizeof(int) == sizeof(*[intへのポインタ])
```

定数式でないときは


```c
(sizeof(int) == sizeof(*[voidへのポインタ])
```

となります。`sizeof(void)`は1であるので[^2]、前者はtrueで後者はfalseです。定数式であるかどうかが判別できました。

更にいうと、sizeof演算子の比較の結果は定数式になると定められており、このマクロは定数式を返すことになります。

```c:test.c
#include<stdio.h>
#define __is_constexpr(x) \
		        (sizeof(int) == sizeof(*(8 ? ((void *)((long)(x) * 0l)) : (int *)8)))

int main(){
	if( __is_constexpr(__is_constexpr(10))){
		printf("yes\n");
	}else{
		printf("no\n)");
	}
	return 0;
}
```

```bash:output
yes
```

# まとめ
c言語の規格の隅をついたすごいマクロです。LinuxカーネルのようなC言語で書かれた巨大なプログラムは、少ない言語機能で非常に多彩なことを実現しており驚くばかりです。



[^1]: Nullポインタというのはどこも指していないことが保証されているポインタであり、大抵の実装では0番地ですが規格上はどこでも良いものです

[^2]: コメントで教えて頂きましたが、sizeof(void)が1であるというのはGNU拡張であるそうです
Unityとperception Neuronを使ってMMDモデルを動かす

#下準備

MMD for UnityをDL
Unityを開き「Resources」「MMDLoader」をprojectをD&D(ドラッグ&ドロップ)

#MMDモデルファイル(.pmd)読み込み

MMD4Mecanim試してみる
作成者サイトからDL
パッケージをunityにインポート
一度unityを起動し直す
MMDフォルダをprojectにD&D
pmd(pmx)ファイルの名前が同じファイル(青アイコン)をクリック
PCLライセンスに同意後インスペクターが表示される
モーションファイル(vmd)を先ほどのインスペクターにD&D
processをクリック
しばらくして変換が終了するとprefabができているので
ヒエラルキーにD&D


#perception NeuronでMMDを動かす
モデル(prefab)を選択。RigのAnimation TypeをHumanoidに。Applyをクリック
シーンのモデルをクリック。インスペクターのscriptのphysics Engineを[Bullet Physics]に

PerceptionNeuronUnityIntegration.unitypackageをインポート
Assets/Neuron/Scripts/Mocap内のNeuronAnimatorInstanceスクリプトをモデルにアタッチ。Connect To Axisにチェック。
エラーになるのでスクリプトのResouces.LoadAssetAtPathをResouces.Loadに変更


#調整
①カメラからの画角がずれる。
②キャラの動きがおかしい
sipsで画像ファイルの簡易チェックを行うAppleScript

画像ファイル専用の簡易データチェッカーです。

Finderで選択しているファイル・フォルダをSIPSにかけて、次のように出力します。bit数、プロファイル違いなどを見つけるのに使います。

```
ファイル数：16
16 space: CMYK
16 profile: Japan Color 2011 Coated
16 format: psd
16 bitsPerSample: 8
```

コードは以下。


```applescript
use AppleScript version "2.4"
use scripting additions
use framework "Foundation"

tell application "Finder"
	set {myFiles, myResList, myResultText, myResult, myDelim} to {{}, {}, "", "", "\" \""}
	set mySel to selection
	
	repeat with i in mySel
		set myPath to POSIX path of (i as alias)
		if (class of i) is folder then
			set myResList to myResList & digFolder(myPath) of me
		else
			set myResList to myResList & myPath
		end if
	end repeat
	
	set myResultText to "\"" & retStrFromArrayWithDelimiter(myResList, myDelim) of me & "\""
	set myResult to "ファイル数：" & (count of myResList) & return & (do shell script "sips -g format -g space -g profile -g bitsPerSample " & myResultText & " | sed -e 's:^/.*$::g' -e '/^$/d' | sort -br | uniq -c | sed -e 's:^ *::g' ")
	log myResult -- 単体で使うにはdisplay alertなどにする
end tell


(* ここからサブ *)

on digFolder(myPath)
	set digItem to do shell script "find " & quoted form of myPath & " -type f ! -name '.*' | sed -e 's://:/:g'"
	return every paragraph of digItem
end digFolder

-- 以下ぴよまるより

on retStrFromArrayWithDelimiter(aList, aDelim)
	set anArray to current application's NSArray's arrayWithArray:aList
	set aRes to anArray's componentsJoinedByString:aDelim
	return aRes as text
end retStrFromArrayWithDelimiter

```

参考：http://piyocast.com/as/archives/669
ターミナルの操作

#はじめに
学生でプログラミングを学んでいます！
今回はターミナルで使うコマンドや、デザインの変更方法などをまとめました
自分のメモ用に作成したものですが、皆様の参考になれば幸いです。

##今回ターミナルで学んだこと
- どのようなコマンドがあるのか
- デザイン変更の仕方

##コマンドでどのようなことができるか
コマンドの使い方とどのような動きをするかをまとめてみました
コマンドは大文字小文字の区別があるため間違えて打つとエラーになります
###cd
ディレクトリの移動の際に使用するコマンド
ドキュメントに移動したい場合は
`cd Documents`
この方法で移動することが可能
よく使うものとして
一つ前のディレクトリに戻るコマンド
`cd ..`
###ls
現在いるディレクトリの中身を開くコマンド
ドキュメントを開く場合
`ls Documents`
この方法でドキュメントの中身を見ることが可能
###mkdir 
現在いるディレクトリにディレクトリを作成するコマンド
sampleというディレクトリを作る場合
`mkdir sample`
この方法でディレクトリを作成できる
###rm
現在いるディレクトリ内の指定したファイルを削除するコマンド
sampleというファイルを削除する場合
`rm sample`
ディレクトリも削除することができる
sampleというディレクトリを削除する場合
`rm -r sample`
この方法で指定したファイルまたはディレクトリが削除できる
###mv
現在いるディレクトリ内のファイルまたはディレクトリの名前を変更するコマンド
sampleというファイルまたはディレクトリをmasterという名前に変更する場合
`mv sample master`
またこのコマンドは現在いるディレクトリ内のファイルまたはディレクトリを移動することができる
sampleというファイルまたはディレクトリをDocumentsに移動する場合
`mv sample Documents`
移動する際の注意としては、移動先のディレクトリが現在いるディレクトリ内にない場合名前変更になる
###cp
現在いるディレクトリ内のファイルをコピーするコマンド
sampleというファイルをmasterという名前でコピーする場合
`cp sample master`
また、sampleというディレクトリをmasterという名前でコピーする場合
`cp -r sample master`
###pwd
現在いるディレクトリまでのパスを表示するコマンド
`pwd`
と入力すると
現在Documentsにいる場合
`/Users/UserName/Documents`
という実行結果が返ってくる
###man
コマンドのマニュアルを開くことができる
ls　コマンドを調べたい場合
`man ls`
manモードを閉じる場合はqキーを押す
###find
現在いるディレクトリにあるファイルやディレクトリの中身を検索する場合に使用するコマンド
sampleというファイルまたはディレクトリの中身を検索する場合
`find sample`
###clear
ターミナルに書かれた今までの実行結果をすべて画面上から消す
しかし実行された行動はリセットされない
`clear`
###exit
ターミナルを終了するコマンド
サーバーなどを起動している際はこのコマンドを入力して終了する
`exit`
###cat
ファイルの中身をターミナル上で表示するコマンド
sampleというファイルを開く場合
`cat sample`
表示するだけなので編集などは不可
注意としては、画像ファイルなどを開こうとするとよくわからないことになる
###curl
大雑把に言うとHTML、webなどのファイルをダウンロードするコマンド
`curl http://www.example.com/`
この方法でexample.comのHTMLをターミナル上に表示できる
しかしこれはあくまで一例で他にできることも数多くある
##ターミナルのデザイン変更
おそらく初期のターミナルはこのようなデザインになっていると思います
<img width="569" alt="スクリーンショット 2017-12-23 11.45.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/164519/513e973a-32f8-7ee6-5a7e-a0328cd91a26.png">
これを・・・
<img width="504" alt="スクリーンショット 2017-12-25 23.24.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/164519/fc57ac59-311a-5806-3601-9f947846cdce.png">
このように自分好みに変更することができます
###変更方法
まずはターミナルの環境設定を開きます
<img width="323" alt="スクリーンショット 2017-12-25 23.23.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/164519/6e643890-c291-face-fda3-2e17c21b9487.png">
その後プロファイルのタブを開くと様々なテンプレートが置いてあります
そのテンプレートを自分好みの文字サイズ、フォントに変更します
ここで忘れてはならないのが
<img width="193" alt="スクリーンショット 2017-12-25 23.30.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/164519/eac66dca-dbdf-bb4b-d61e-51065228e85d.png">
ここで自分が編集したテンプレートを選択しデフォルト設定しておくことと
<img width="481" alt="スクリーンショット 2017-12-25 23.32.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/164519/697d61b7-e09c-d974-59c4-5c731f49a941.png">
一般タブの中にある起動時に開くウインドウを自分が編集したものにしておくことです
起動時に開くのみを自分の編集したテンプレートにした場合
起動時は間違いなく編集した状態でターミナルが開かれますが、一度ターミナルを閉じてDockから再び起動した場合デフォルトで選択されているものが開かれてしまうからです
UserEventAgentのCPU使用率について

#UserEventAgent
AppleCareに問い合わせてみたところスポットライト検索などで再インデックスの際に起こったりする現象らしいが、どうも気にくわない。
特にOSを再インストールした後やアップデートかけた後でなくても急に現れるし、現状の対処法として日本の文献で公式の物が見当たらないらしいのだ（AppleCare担当者談、彼も英語を翻訳してなんとなくしか把握していない）

唯一効果があると思われるディスクユーティリティのFirst Aidを行うとしばらくは大人しくなるがここのところ何度か頻繁に発生しており、ファンはシューシュー回るし作業は当然捗らない。MacBookProをメインマシンとして使っているなんちゃってエンジニアの私にはゆゆ式自体である。（音楽制作もUnityも行わなければならない、つまるところ重いファイルを扱う作業が多い）

一回きりとか何かのタイミングに起こるのが予見できるなら防げるが、UserEventAgentに関してはAppleCare側の予測が曖昧すぎると思う。思わぬタイミングでタイムロスを取られてしまったらクライアントに迷惑をかける可能性だってあるし、何と言ってもクライアントに説明のしようがない（そういう仕様です、などと言えない。PCは壊れるものだから待っててというようなものである。）。

使用しているマシンもRetina, 13-inch, Mid 2014でありそろそろ替え時ではあるが、十分に使えるスペックを有している。

そもそもラップトップを使用していないのはフリーランスとして身軽に動くためであったし、単純に私がデザイナーでないからであるからではあるが、なんとしてもこのバグを早期解消してほしい。

というわけでUserEventAgentの件で迷惑を被ったAppleユーザーの方、ぜひお力をお貸しください。おそらく1度は遭遇していると思われるこの現象、どうやって切り抜けてきましたか？:frowning2:

<img width="666" alt="スクリーンショット 2018-04-19 02.31.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/95487/7661176d-9089-f64a-df65-af27aaaaee8d.png">
Railsで特定のページでのみscrollify.jsを使う方法

# scrollify.jsとRailsの相性がよくない問題
セクションごとにスムーズスクロールしてくれるプラグインであるscrollify.jsですが、Rails(turbolinks)との相性が悪く、思った通りに動いてくれません。

というのも、普通スムーズスクロールを設定したいページは、トップページとか特定のページだけですよね。そのページでだけscrollifyを動かそうと、そのビューのscriptタグ内で初期化しても、turbolinksの影響なのかすべてのページでスクロールが制御されてしまいます。

# 解決法
turbolinksがオン、セクションのクラス名がboxであることが前提です。

```javascript:JavaScript
  $(document).on('turbolinks:load', function() {

    if ($(".box").length) { // そのページにboxクラスの要素が存在するならscrollifyを有効にする
      $.scrollify.enable();
      $.scrollify({
        section: ".box",
        // 各設定
      });

    } else { // 存在しないなら無効化する
      $.scrollify.disable();
    }

  });
```
ReactのUTについて 

# ReactのUTのポイント

- Reactのコンポーネントは、ほとんどが状態を持たないfunctionalコンポーネントとなっていて、引数で受け取ったデータに対しては毎回同じビューが返される。従って、まずはコンポーネントが正しいデータをレンダリングしているかをテストすることが大事。
- コンポーネントは、上記のような特徴を持っていることから、基本的には入力のデータと出力のデータだけを気にすれば良いので、テストが容易。
- コンポーネントは、データを出力するだけのものではないので、必要に応じてインタラクションのテストも書く。

---

# ReactのUTに必要なツール

## この2つが定番
- **Jest**（テスティングフレームワーク）　※Jasmineなど他のフレームワークでも可
- **enzyme**（テストユーティリティ）　

## 各ツールの連携用 
- jest-enzyme
- enzyme-adapter-react-16

## Jestのスナップショットを行う場合は必要
- react-test-renderer

※ create-react-appを使う場合は、Jestがデフォルトで使えるようになっている。特にBabelなどの設定を行う必要はない。enzymeを使う場合は、別途インストールが必要。

---

# Jestについて

- Jasmineをベースに作られたテスティングフレームワーク。マッチャがほぼ同じ。Facebook製だが、Reactのためのものではない。
- Node.js上のjsdomで実行されるので、コマンドベースでテストが行える。Karmaのようなテストランナーは必要ない。
- テストダブル、スナップショットテストに対応。
- 公式ドキュメントは完全日本語対応。

---

#enzymeについて

- Facebookも認めるテストユーティリティ。airbnb製。ReactのUTの記述を簡単にしてくれるもの。
- コンポーネントをshallow（浅い）レンダリングしてくれる（紐づいた子コンポーネントを無視してテストできる）。もちろんフルレンダリングでのテストもできる。
- jQueryライクなセレクタが最強。jsxへのアクセスが楽になる。

---

# 補足

サンプル
https://github.com/maechabin/enzyme-sample

詳細をブログにまとめました
https://mae.chab.in/archives/60066
MIDIデバイスを認識して、メッセージを受信する

MIDIデバイスを認識して、デバイス名をアラート画面に、メッセージをInnerHTMLで表示しています。

エラー時のコールバック関数は省いているのでシンプルです。


```js:javascript
navigator.requestMIDIAccess().then(function(midiAccess) {
	var inputs = [];
	var inputIterator = midiAccess.inputs.values();
	for (var i = inputIterator.next(); !i.done; i = inputIterator.next()) {
		inputs.push(i.value);
	}
	alert(inputs[0].manufacturer + inputs[0].name);
	inputs[0].onmidimessage = function(e) {
		test.innerHTML = (e.data[0] + " " + e.data[1] + " " + e.data[2] + " ");
	};
});
```

ちなみに、ステータスバイトを上位と下位で分けて出力する場合はビット演算子を利用して、こんな感じにします。

```js:function(e)内のプログラム
var highNibble = (e.data[0] & 240) >> 4;
var lowNibble = e.data[0] & 15;
test.innerHTML = (highNibble + " " + lowNibble + " " + e.data[1] + " " + e.data[2]);
```
Python3で2次方程式を解くには

# Python3で2次方程式を解くには

## 2次方程式とは

一般的に $ ax^2 + bx + c =  0$ のように表されます。
これを解くには、2次方程式の解の公式を思い出します。

## 2次方程式の解の公式
$x_1=\frac{-b+\sqrt{b^2-4ac}}{2a}$ と　$x_2=\frac{-b-\sqrt{b^2-4ac}}{2a}$

2次方程式は2つの解を持ちます。
と言うことは、方程式の両辺を等しくする$x$の値が2つあることになります。
(その２つが同じということもあり得ます)

## pythonで解いてみる

```python
# solving a quadratic equation

def solv_quadratic_equation(a, b, c):
    """ 2次方程式を解く  """
    D = (b**2 - 4*a*c) ** (1/2)
    x_1 = (-b + D) / (2 * a)
    x_2 = (-b - D) / (2 * a)
    
    return x_1, x_2

if __name__ == '__main__':
    a =input('input a: ')
    b =input('input b: ')
    c =input('input c: ')
    
    print(solv_quadratic_equation.__doc__)
    x1, x2 = solv_quadratic_equation(float(a) , float(b) , float(c))
    
    print('x1:{}'.format(x1))
    print('x2:{}'.format(x2))
```
### 例1
こちらは解が２つとも数値で返る例

$ x^2 + 2x + 1 =  0$

```python
input a: 1
input b: 2
input c: 1
 2次方程式を解く  
x1:-1.0
x2:-1.0

```

### 例2

こちらは解が複素数で返る例

$ x^2 + 2x + 3 =  0$


```python
input a: 1
input b: 2
input c: 3
 2次方程式を解く  
x1:(-0.9999999999999999+1.4142135623730951j)
x2:(-1-1.4142135623730951j)
```
Debian busterに存在しないnpmをスクリプトを使わずにインストールする

#前置き

(2019-07追記)この記事はbusterがまだ開発版でnpmがパッケージ化がされていなかったときに書かれたものです。ただし[busterリリース版のnpmは5.8.0と古い](https://packages.debian.org/buster/npm)ので、別途npmの新バージョンが欲しい場合には有効な記事かもしれません。(追記終わり)

Debian busterには[nodejs](https://packages.debian.org/ja/buster/nodejs)パッケージは収録されているのですが、[npm](https://packages.debian.org/ja/sid/npm)は何故かsidかjessieにしか含まれていません。npmぐらい無いと使い物にならないので、それをインストールする方法を見るために[公式サイト](https://www.npmjs.com/get-npm)をあたると「node.jsインストールしたらnpmも入ってるよ」としか書かれてないわけです。また、[Node.jsが推奨するインストール方法](https://nodejs.org/en/download/package-manager/#debian-and-ubuntu-based-linux-distributions)には以下のようなものが書かれています。

```shell-session
$ curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -
```

……お前、ルート権限で動かすスクリプトをネットで拾ってこさせて中身を見せる余地も与えずに実行させる気かよと。挙句にその中でパッケージを勝手にインストールされて野良リポジトリも登録されると「お前、Debian様がお護りになっている/usrを誰のお赦しを得て勝手に漁って……お前ぇぇぇ!!!!!!?!?!?」って怒りに震えませんか? 私はなる。

もう少し調べると、npmの[npmパッケージ](https://www.npmjs.com/package/npm)のページに単独でインストールする方法が書かれてはいましたが、こうです。

```shell-session
$ curl -L https://www.npmjs.com/install.sh | sh
```

怖いってば。

そしてこのスクリプト、仕方のないことなのですが、多様なシステムや古いランタイムを識別するといった、Debianにインストールするのに必要のない処理が多数含まれているので、簡単ですが必要なエッセンスを抜き出して記事としてまとめることにしました。

# 手順

インストールスクリプトである`https://www.npmjs.com/install.sh`がやっていることと照らし合わせながら進めていきます。

## 前提

* nodejsランタイムはDebian busterが提供しているものを使います。結果、`/usr`にインストールされます。
* npmは`/opt/npm`にrootでインストールします。
* 以下の作業は全てrootで行います。

## nodejsインストール

```shell-session
# apt install nodejs
```

## ダウンロード

```shell-session
# wget http://registry.npmjs.org/npm/-/npm-5.8.0.tgz
# printf '%s  %s\n' 5e4bfb8c2e7ada01dd41ec0555d13dd0f446ddb2 npm-5.8.0.tgz |sha1sum -c -
```

スクリプトではnpmのtarballの在り処を「メタデータJSONを`https://registry.npmjs.org/npm/latest`からダウンロードしてsedスクリプトで`tarball`の値をスクレイプする」という方法で取得しています。ところで記事を書いている時点ではtarballの在り処はHTTPSではないのですが、スクリプトではメタデータにあるshasumを使ってダウンロードを検証するということはしていません(マジかよ)。shasumなどのtarball自体のメタデータはJSON Pointerでいうと`/dist`に格納されていますので、上記のSHA1を信用しないなら確認しましょう。

今後npmが更新されてもこの記事を見ながらインストールする分にはバージョンは5.8.0のままで良いです。どうせすぐ後に`npm i -g npm`で更新されます。

## 展開・configure

```shell-session
# tar -xzf npm-5.8.0.tgz
# cd package
```

npmに含まれているconfigureスクリプトはnpmがはじめに内部で使用するnpmrcを生成するものなのですが、引数を順次npmrcに書き込んでいくという単純なものなので、cat(1)で代えています。グローバルの設定ファイルは`/etc/opt/npmrc`と`/etc/opt/npmignore`に、キャッシュ置き場は`/var/cache/opt/npm`とします。

```shell-session
# cat <<_heredoc >npmrc
prefix=/opt/npm
globalconfig=/etc/opt/npmrc
globalignorefile=/etc/opt/npmignore
_heredoc
# cat <<_heredoc >/etc/opt/npmrc
cache=/var/cache/opt/npm
_heredoc
# touch /etc/opt/npmignore
# mkdir -p /var/cache/opt/npm
```

## インストール

```shell-session
# export NO_UPDATE_NOTIFIER=1
# node bin/npm-cli.js install -g
```

`NO_UPDATE_NOTIFIER=1`をしないと、npmのupdate-notifierというパッケージが`/root/.config`以下に設定を作って若干ウザいです。

そしてインストールされたnpmで速攻npm自体を更新します。

```shell-session
# /opt/npm/bin/npm install -g npm
```

この時ついでにyarnも入れとくと良いんじゃないでしょうか

```shell-session
# /opt/npm/bin/npm install -g yarn
```

これでnpmのインストール自体はOKです。気分によっては、`/opt/bin`にバイナリへのリンクを入れときます。

```
# mkdir -p /opt/bin
# cd /opt/bin
# ln -s ../npm/bin/* ./
```

この後各プロジェクトでPATHに`/opt/npm/bin`やら`/opt/bin`やらを入れるようにしておわりです。
React Native error and resolve

```react:error
unable to load script from assets index.android.bundle
```
解決法

mkdir android/app/src/main/assets

react-native bundle --platform android --dev false --entry-file index.js --bundle-output android/app/src/main/assets/index.android.bundle --assets-dest android/app/src/main/res

---
error
bash: adb: command not fount
解決法
macの場合 ./bash_profileに android-studioのsdkのpassをかく
######export PATH="~/Library/Android/sdk/platform-tools":$PATH

---
error?
react-native run-android or Live Reload しても変更が反映されない。もうすでに書いてないコードの内容をずっと表示させ続けるerror?
解決方法
adb kill-server
adb start-server
ここでadb devicesを確認するとofflineになってたがonlineにする方法がわからない
ケーブルを抜いて差し直したらonlineになって使えるようになった 力技だからだめなきがする

---
error
Could not run adb reverse: spawnSync adb ENOENT
解決法
sdkのlocationの場所が悪かったらしい＞
export ANDROID_HOME=~/Library/Android/sdk
WebAPIの独自Headerを "X-" から始めるのはありかなしか

APIサーバーの仕様を検討している時に、headerに入れる独自パラメータの名前について一悶着（自己完結）あったので、メモ。

# 何を悩んだのか

例えば、URLには含みたくない `secret` のようなリクエストパラメータについて、独自にキー名を決めようと思います。

こんな感じ。

```
X-Secret : {secret}
```

なんなら良く使うあいつでも良いです。

```
X-Api-Key : {api-key}
```

で、なんかいい名前ないかなぁと思ってググってたら、こんなやりとりを見つけました。

[stackoverflow / Custom HTTP headers : naming conventions
](https://stackoverflow.com/questions/3561381/custom-http-headers-naming-conventions)

> On June 2012, the deprecation of recommendation to use the "X-" prefix has become official as RFC 6648.

このやり取りの質問とベストアンサーだけ見て「なんだって！独自ヘッダに `X-` をつけるのは常識じゃないの？時代遅れなの！？」と色めき立ち、RFC本体を確認したり他にこれに関する情報がないか探したりしました。

こんな所でつまるのは私だけかもしれませんが、その時の記録。

# 結局、WebAPIの独自Headerを "X-" から始めるのはありかなしか

結論：**あり**

そもそもdeprecatedになった経緯が、
> 非標準のフィールドが標準になったときに発生した不便さのためです。

ということらしい。("X-"で始まるものがそのまま標準になるということは、力のあるor力をつけた企業・サービスが使っていたり、それを使うのが慣習になっていたと推測。)  
推測するに2パターンの不便さがあって、  
**ケース1:**
今まで独自ヘッダ `X-Secret` なんかを定義して、例えばパスワードの送信時のフィールドとして使っていたとする。これが急に標準ヘッダとして `Secret` がRFCで定義されたと。しかも意味が違って、標準の方ではここに鍵情報を入れる事になっていたりすると、 `X-Secret` の中身がどっちの意味で入ってきたか分かりにくい。
まだ対象のクライアントが限定的で、今までの独自ヘッダとしてしか使わないだろうと断言できるならまだしも、公開APIの場合は呼び出し側がどっちの意味で使っているのか確認が難しい。
  
**ケース2:**
あるサービスが `X-Secret` というヘッダを使っていた所、影響力が大きく他のサービスも同じく使いだした。そのうち `X-Secret` ヘッダはほぼ標準と言ってもいいほど一般的に使われるようになったとする。そのうちRFCで `Secret` が `X-Secret` の置き換えのヘッダフィールドとして定義され、今後は `Secret` を使うことを推奨される。ただ、RFCを皆が皆チェックして読むわけではないので、結局業界標準(RFC的には非標準)になってしまった `X-Secret` を使い続ける勢が後を絶たない。結局受ける側もずっと両対応し続けることになるし、送る側もどっちを送るのが正解かを悩み続けることになる。

じゃあどうすべきかというと、被らないような名前をつけるようにしましょう、というのが一つ。  
例えば、組織のドメイン名やサービス名を含んだり、標準化はされなさそうなwordを選んだり。上記の例で言うと、 `kusuwada-Secret` とか。
もしくは `himitsu-no-Secret`とか。。。いや冗談です。  
これだと、1. のケースでは自分が使っていたヘッダに似た標準フィールドができてもConfusingではなくなるし、2. のようにそのフィールドが一般的に広く使われるほど広まることは考えにくい。

ただ、"X-" から始まる名前をつけることにより、そのヘッダが独自定義のものであることがわかりやすい、と言うのは大きなメリット。  
なので、**被らなそうな"X-"から始まるフィールド名をつける**というのが、無難な選択肢かと。  
ただ、今後広まってほしい・標準化したいと考えているフィールド名を付ける場合は、**"X-"から始めない**というのが良さそう。ただ標準化を狙いに行くような企業・サービスは滅多にないと思うので、大半の開発者は前者のほうを選択するのがよろしいかと。

ということで、結論は**あり**、ただしかぶりにくそうな名前にしておくのを推奨、かな。

最初のstackoverflowのやり取りも、ちゃんと読んでいけばそんな感じの内容の発言をしている人がいた。英語フィルターがかかって読み飛ばしていたわ・・・。

# 参考リンク
* [stackoverflow / Custom HTTP headers : naming conventions
](https://stackoverflow.com/questions/3561381/custom-http-headers-naming-conventions)
  * 今回のきっかけになった会話
* [RFC6648: Deprecating the "X-" Prefix and Similar Constructs in Application Protocols](https://tools.ietf.org/html/rfc6648)
  * 問題のRFC
* [Mozilla > Web technology for developers HTTP HTTP headers](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers)
  > Custom proprietary headers can be added using the 'X-' prefix, but this convention was deprecated in June 2012, because of the inconveniences it caused when non-standard fields became standard in RFC 6648;

* [上記の日本語版](https://developer.mozilla.org/ja/docs/Web/HTTP/Headers)
  > 'X-' 接頭辞を使用して独自のヘッダーを追加できますが、この慣習は 2012 年 6 月に非推奨になりました。これは、 RFC 6648 で非標準のフィールドが標準になったときに発生した不便さのためです。
画面から入力した文字をリアルタイムにSlackに連携する

#システムについて
社内システムの1機能に、入力したコメントをSlackに連携してリアルタイムに伝達するものを組み込みました。社内の総務部にSlackなどのチャットツールを導入し利用してもらうには教える側のコストと教わる側のコストの両方が必要になります。利用している社内システムの画面から利用できればその両方のコストをなくすことができます。

開発を行っている社員は客先常駐しており、自社へ戻ることは多くはありません。社内システムの利用しやすさやしづらさ、また機能の追加要望など総務部の利用者の声を聞き取りたい考えは持っていますが、面と向かって話す時間が取れないのが実情です。普段利用している社内システムの中に、開発部へ声を届ける仕組みを組み込んでしまえばこの問題は解消されると考えました。

それではリアルタイムのSlack連携の実装方法について説明します。

#画面からコメントを入力する
社内システムに1画面追加しています。簡単な注意文言と\<textarea\>で入力画面を作成しています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/197844/43bb8274-1a16-aebc-26e7-ecab37a15c3a.png)

#Slackでコメントを受け取る
入力したコメントがそのままSlackで表示されます。このSlackを開発部が利用者の声として拾い上げます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/197844/60c8987d-02ee-4792-381b-5a67407b1896.png)

#Slack側設定
![image.png](https://qiita-image-store.s3.amazonaws.com/0/197844/ce143610-3438-7e54-ec98-ab371ed82580.png)
着信Webフックを利用します。英語表記はincoming-webhookです。

いくつか設定項目はあるのですが、ソース側で上書き設定できるものもあります。上書き設定できるものはそうした方が有益です。無料版Slackでは10個までのアプリ連携しか登録できません。そこにチャンネルや名前やアイコンなどを個別に指定してしまうと、すぐに10個制限に達してしまいます。Slack側では上書きされる前提の設定としておきソース側で上書きしてしまえば、実際無制限に着信Webフックを使い倒すことができるのです。


|設定名|設定値|上書き可否|
|:----|:----|:----|
|チャンネルへの投稿|Slackのチャンネル名を指定する|可能|
|Webhook URL|指定されるURLを呼び出すよう実装する|-|
|説明ラベル|この着信Webフックの説明にあたる。任意でよい|-|
|名前をカスタマイズ|Slackの発言者名となる|可能|
|アイコンをカスタマイズする|Slackの発言者アイコンとなる|可能|
|メッセージをプレビューする|上記設定のプレビュー表示。設定を上書きすれば上書きされたものでSlackに表示される|-|

#入力画面側実装（javascript）

<details><summary>クリックしてコードを表示する</summary><div>

```javascript
$(function() {

	$("#commentButton").click( function(){

		// 送信内容チェック
		if ($("#comment").val().length == 0) {
			alert("内容が書かれていません");
			return;
		}

		// 注意事項了承チェック
		if (!$("#attentionCheck").prop("checked")) {
			alert("注意事項に了承いただいていません");
			return;
		}

		// 注意事項了承チェックを初期化
		$("#attentionCheck").prop("checked", false);

		// 内容送信
		var JSONData = {
				"text": $("#comment").val(),
				"username": "UMI利用者",
				"icon_emoji": ":raising_hand:",
				"channel": "#XXXX"
		};
		$.ajax({
			type : 'post',
			url : 'https://hooks.slack.com/services/XXXXXX/XXXXXX/XXXXXXXXXX',
			data: {
				"payload": JSON.stringify(JSONData)
			},
			scriptCharset: 'utf-8',
		})
		.then(
				// 正常時の処理
				function(data) {
					alert("送信が完了しました");
				},
				// 異常時の処理
				function() {
					alert("何かしらの問題により送信に失敗しました");
				}
		);
	});

});
```

</div></details>

|変数名|対応する設定項目|備考|
|:---|:---|:---|
|text|Slackの発言コメントそのもの|
|username|名前をカスタマイズ|
|icon_emoji|アイコンをカスタマイズ|[アイコン一覧](https://www.webpagefx.com/tools/emoji-cheat-sheet/)|
|channel|チャンネルへの投稿|

#Slack連携の利用例
上記のような意見箱としてだけでなく、以下のようなシステムと絡めた利用をすることで保守工数を削減することも考えられます。このときも上書き設定していることで、名前やアイコンを変更したり、投稿チャンネルを別のものにしたりといったカスタマイズが可能となります。

- システムエラーが発生したときにSlack連携する
- アカウントロックがかかったユーザ情報をSlack連携する
複合代入演算子の処理順にある罠

タイトルが結論だが，複合代入演算子では，現在の値を処理するのは最後というお話．

改めて書く必要はないが，落とし穴に落ちてしばらく悩んでしまったのでメモ．
初心者に説明する際に注意するかと言われるとそうはしないと思う．

## よくある複合代入演算子の説明

```cpp
auto i {4};
// same after calculation
i = i * (5 + 3) / 2; // (1)
i *= (5 + 3) / 2;    // (2)
```

(1)式と(2)式は等価である.

## うまくゆかない例

```cpp
auto i1 {4}, i2 {4};

i1 = i1 * (2 + 3) / 2; // (1)'
i2 *= (2 + 3) / 2;    // (2)'
```

(1)'式では，iが計算の始めに入っている．ここでは`/2` によって割った際に割り切れている．
計算結果は10である．

(2)'式では，先にi以外の演算が行われる．ここでは`/2`によって割った際に0方向に丸められる．
計算結果は8である．

## 原因と対策

原因は先程も述べたが，計算順が異なるために実は同一となっていない．
正しい等価な式は以下の通り．

```cpp
auto i {0};

i = i * ((2 + 3) / 2);
i *= (2 + 3) / 2;
```

最後に演算される点に注意しよう．

もし，最初に変数を読む必要があれば複合代入演算子は用いれない点にも注意が必要だ．
必要なのに，複合代入演算子に変えようとしてはいけない．
ProgateでのRuby学習　Lesson１【変数】

変数とは《値を入れておく箱のようなもの》
※Progateより引用

初心者の私にとってはなぜそんな箱が必要なのかが分かりませんでした。
勉強を進めていくと、自分のスペルミスでプログラムが実行されなかったり、
何度も同じことを打ち込む作業があり、
そういった場合に「そう言うことか！」と実感したのでした。

##⑴代入
では実際、変数という箱に値を入れていきます！

**必要なもの**
**・箱の名前(変数名)**
**・箱の中に入れるもの(値)**

では『name』という変数名の箱の中に『mario』という値を入れます。
marioという値を変数nameへ**代入**することで、変数が定義される。

コード：name = "mario"
　　　：number = 31

慣れるまでは『 = 』この記号はイコールとして見てしまうことが多かったのですが、
この場合はイコールではなく、**代入する**という意味を表します。
代入する値が文字列の場合はダブルクォーテーションで囲む、数値の場合はそのまま。


代入した値を出力するには、出力する命令putsを使います。

コード　：puts name
　　　　：puts number
画面表示：mario
　　　　：31

⚠️誤った例
コード　：puts "name"
　　　　：puts "number"
表示画面：name
　　　　：number
※変数名をダブルクォーテーションで囲んで出力しようとすると、
代入した値marioや31ではなく、nameやnumberという文字列として表示されてしまうので注意。

また、変数名は自由に決められますが、いくつか決まりごとが。
**・数字からスタートしない**
　◎name
　×1name

**・２語以上を繋げる時にはアンダーバーを使う**
　◎total_price
　×total.price（ドットなどは使えません）

基本的に変数名は英単語で、代入した値が分かりやすいようなものにすると、
使用する際に分かりやすいです


##(2)変更
1度定義した変数を変更する場合は、元々記入した変数のところまで遡って、
代入した値を書き直すことも出来ますが、量が多い時にはこりゃ大変！
変数を変更したいところで値だけを変更することで、
それ以降のプログラムは同じ変数を使ったとしても値が更新されています。

例①
変数名colorの変数にredという値が入っていたが、途中でyellowという値に変更する場合。

コード
color = "red"
puts color
color = "yellow"
puts color

表示画面
red
yellow

例のように、colorの値がredからyellowに変更されています。
**上から順に**更新されていくのです。

例②
定義した変数を使って、その変数自体に変化を与え、変数の値を変更する。

コード
number = 5
puts number
number = number + 3
puts number

表示画面
5
8

元々、5という値を代入していたnumberという変数に、
3をプラスして8という値に変更しました。

**⚠️省略をする書き方があります。**
number = number + 3
number += 3
この上記２つのコードは同じ意味を表します。
プラスだけでなく、マイナスや掛ける場合にもこの省略形が使えます！

##(3)変数展開
ここまではputsを使い、代入した値だけを出力してきましたが、
文字列の中に#{変数名}とすることで変数を入れ込むことが出来ます！

例③
コード
name = "mario"
puts "私の名前は#{name}です"
age = 31
puts "年齢は#{age}歳です"

表示画面
私の名前はmarioです
年齢は31歳です

こんな感じで文字列に変数を入れ込むことを**変数展開**と言います。


最後に
**変数を使うメリットとは？**
**・同じ要素(変数)を何度も繰り返し使うことができる**
　普段の生活で繰り返し使うようなことってあまりないかもしれませんが、
　コードを書いていくと何度も同じ要素を使うことがあります。きっと。
　※まだぜんっぜんコードなんて書いたことがないので説得力がありませんw
**・変更があった場合に、直す箇所が少なくて済む**
　私なんて特に打ち間違いが多いので、同じ内容を繰り返す場合など、
　その都度打ち込んでいる訳ではないので、打ち間違いが格段に少なくなるはずです。
　※そもそもの変数に代入した値を打ち間違えてたら全部間違っちゃうのでそこは注意、と言いつつ私やっちゃいそう。


プログラミングの世界っていろんなことが柔軟に行えるようになってるんですね〜
勉強進めていくのが楽しみ楽しみ。
Laravelのwith()とload()

# 概要
Laravelのwith()とload()についてどう使い分けるのかわからなかったので調べて理解したことを書く。[公式ドキュメント](https://laravel.com/docs/5.2/eloquent-relationships#eager-loading)を参考にしているのでそちらも併せて確認するとより理解が深まると思う。

# 共通していること
どちらもリレーションを解決したい時に使用する。取得できる結果は両者同じ。
それらが故に使っている時に混乱したわけでもあるが。

# 違っている部分

## あだ名
with()の方は、Eager Loadingと呼ばれ、
load()の方は、Lazy Eager Loadingと呼ばれる。

## メソッドを使う位置
with()はget()とかall()とかの終端操作の前に使用する。

```php:withの使い方
$books = App\Book::with('author')->get();
```

load()は終端操作の後に使用する。例ではall()の後でload()を行っている。

```php:loadの使い方
$books = App\Book::all();

if ($someCondition) {
    $books->load('author', 'publisher');
}
```

# 使い分け
実際動くなら取得結果が変わらないしどっちを使ってもいいよね、と思ったが自分なりに使い分ける方法を考えた。
with()は共通して連結される場合に利用し、loadは共通ではない連結条件の指定に利用すると見通しの良いコードにすることができると思う。

以下でシミュレーションをする。
ニューステーブル - タグテーブル - カテゴリ(大分類)テーブルというリレーションがあることを想定する。ニュースがどのカテゴリに属すかを取得するためにはタグテーブルを介さないといけない。
ここで、カテゴリがスポーツに属するデータとテクノロジに属するデータを取得するためには以下のようにする。

```php
$news   = News::with(タグテーブルとの連結)->get();
$sports = $news->load(カテゴリがスポーツに属すような連結);
$tech   = $news->load(カテゴリがテクノロジに属すような連結);
```

ニュースに紐づくカテゴリを取得するためには、タグテーブルの連結は共通しているので、with()で連結させる。そして、スポーツに属する、などの連結の情報は場合によるためload()を利用する。このload()の中身を差し替えるだけでコンテキストにあった記述ができて、コードの見通しが良くなると思う。

# 参考
https://laravel.com/docs/5.2/eloquent-relationships#eager-loading
何も知らない人間がIT系の職場に投げ込まれて泣きそうになった話

#**自己紹介**
医療機器メーカーの開発３年目です。
２年目の前半までは、要件定義や仕様検討など上流の開発を行っていました。
２年目の後半で、ある医療機器の一つの機能の仕様検討から設計/実装/検証まですべてを任されました。
大学は工学部で応用物理学を専攻しており、研究室は理論系で、ペンと紙をずっと使って計算しているような感じでした。(最終学歴は修士です)

#**ITエンジニアの言ってることが全く分からない**
実装の大半は外部委託するので、実装の段階で共栄会社の方と何度も打ち合わせをするのですが、相手の言ってることが全くわかりませんでした。それこそ、
外国語を聞いてる感じ・・・
バイナリ、インスタンス、バッファ、インクルード・・・などなど
ある程度勉強した今だからこそこれらのワードは基礎の基礎だということは分かるけれども、情報系の授業も受けたこともなければ、パソコンやプログラミングに一切興味なかった私からすると、何がなんだかわかりませんでした＞＜
・・・でも、これは言い訳かもしれませんね・・
ちゃんと学生の頃から幅広く興味を持って勉強している人からすれば、これくらいのワードは知っていて当然なのかもしれません
自分の勉強不足を後悔しました・・・

でも今さら後悔したところで時すでに遅し！！
目の前の打ち合わせをなんとかしなければなりません。
めちゃくちゃ恥をかきながら、めちゃくちゃ呆れられながら、一から訊いてなんとかやり切りました。


#**ITの勉強をしようと心に誓った**
その日から必死こいてソフトの勉強を始めましたが、そんなすぐ身につくわけでもなく、恥をかく日々が続きました・・・
そんな中、なんとか実装も終え、いまは基礎中の基礎は身についたかな？って感じです。
それでもまぁ、IT系専門学生１年目レベルでしょうが・・・
自分で実装することの楽しさも知りました。
なので、これから空いてる時間を使って、ITの勉強をしようと思っています。
備忘録的な感じでここに残せていけたらいいな・・・と

#**今後の目標**
とりあえず、１０月に応用情報技術者の試験があるみたいなので、それに合格することを目標とします。
基本情報技術者試験から受けるべきかもしれませんが、おじさんがそれ受けに行くの恥ずかしいなぁ・・・って
専門学生１年目でそれに合格するの目標だって話や、情報系の大学なら卒業するだけその資格もらえるみたいなので、きっと若い人ばかりなんだろうなって＞＜

あとは何か言語を学んでいくつもりです。
仕事ではC++を使いましたが、それは仕事で自然と身につくと思うのでそれ以外のやつ！！
候補は３つです。
　○ python：機械学習系に強いそうなので・・・ちょっと興味ある！！
　　　　　　　あと、自分の数学の知識も生かせそう？
　○ swift：appleが好きだから・・・
　○ C# ：仕事でも使う機会ある

自分の考えてるアプリを作れるようになるっていう明確な目標がもてるswiftにしようかぁ〜と思っています！！
これも１０月までかな？？

あとは、明確な方法を定めるのみです！！
laravel & vue.js エラー解消方法

#アクセスしたらエラー
###エラー内容
The stream or file "/var/www/html/sample/storage/logs/laravel.log"
could not be opened: failed to open stream: Permission denied

###解消方法
chmod 777 storage/logs

#アクセスしたらエラー2
###エラー内容
file_put_contents(/var/www/html/sample/storage/framework/sessions/Q42lrnTVyYSWv3PY8x4U27V5PLwD8d1qoX5EQ51c):
failed to open stream: Permission denied

###解消方法
chmod 777 storage/framework/sessions/

#アクセスしたらエラー3
###エラー内容
file_put_contents(/var/www/html/sample/storage/framework/views/1ce3e04b775dbb480db046db9ec317424bc554f2.php):
failed to open stream: Permission denied

###解消方法
chmod 777 storage/framework/views/
RubyでBeep音を鳴らしてメロディーを流す（その1）

# なぜこんなことを考えたのか
以前働いていた職場では、終礼およそ15分前にアラームとしてBeep音が鳴るようになっていました。
その時にふと「ただ同じ音が繰り返されるのは面白くない」と思ったのが事の始まりです。
Rubyを選んだのは特に意味はありません。

# RubyでBeep音を鳴らすには
こちらのサイトを参考にさせて頂きました。

[Ruby で Win32 API](https://www.kunihikokaneko.com/free/ruby/rubywin32api.html)

そんでもって鳴らすには下記のように。

``` Ruby:beep.rb
require 'Win32API'
beep = Win32API.new('kernel32', 'Beep', %w(i i), 'i')
beep.call(262, 500)
```
Callメソッドの第1引数に「周波数」、第2引数に「鳴らす時間」、おそらくmsecです。
意外と簡単ですね。

# 音階を鳴らす
まず音楽知識ゼロなのでおなじみのドレミはどの周波数なのか調べました。

こちらを参考にしました。
[ビープ音サンプル - コンピュータを楽しもう！！](http://tarosay.hatenablog.com/entry/20110304/1299258129)

一般的にはラの音を基準にしているようです（440hz）
この440hzを基準に半音×n個移動したときの計算式を作ります。

`周波数 = 440 * 2の（ n / 12 ）`

となり、これをRubyに直すと

`hz = 440 * ( 2** ( n / 12 ) )`

になります。
これを使ってド～シを鳴らしてみます。

``` Ruby:melody.rb
require 'Win32API'
beep = Win32API.new('kernel32', 'Beep', %w(i i), 'i')
#ド
hz=440 * ( 2** (-9/12))
beep.call(hz, 500)
#ド＃
hz=440 * ( 2** (-8/12))
beep.call(hz, 500)
#レ
hz=440 * ( 2** (-7/12))
beep.call(hz, 500)
#レ＃
hz=440 * ( 2** (-8/12))
beep.call(hz, 500)
#ミ
hz=440 * ( 2** (-5/12))
beep.call(hz, 500)
#ファ
hz=440 * ( 2** (-4/12))
beep.call(hz, 500)
#ファ＃
hz=440 * ( 2** (-3/12))
beep.call(hz, 500)
#ソ
hz=440 * ( 2** (-2/12))
beep.call(hz, 500)
#ソ＃
hz=440 * ( 2** (-1/12))
beep.call(hz, 500)
#ラ
hz=440 * ( 2** (0/12))
beep.call(hz, 500)
#ラ＃
hz=440 * ( 2** (1/12))
beep.call(hz, 500)
#シ
hz=440 * ( 2** (2/12))
beep.call(hz, 500)
```

これでメロディが作れますね！
GoogleTestをC言語で使う方法

# C言語でもGoogleTestを使いたい
## GoogleTest
GoogleTestは、Googleが開発した、C++用ユニットテストフレームワークです。
Googleと名のつくだけで良さそうな雰囲気がしてしまいますが、
実際使っている人を見ても使いやすそう。

ダウンロードはココから:[http://code.google.com/p/googletest/](http://code.google.com/p/googletest/)

---

## C言語で使える？
C++用ということでC言語では使えないのかと、C言語のプロジェクトを扱う私は落胆していたのですが、
どうもそんなことはないようです。

[GoogleTestをC言語で使う方法をハックしてみた ](http://futurismo.biz/archives/316/)

テスト関数はcppで作成し、
Cのヘッダファイルを
```
extern”C”{}
```
で囲うだけで良いらしい。

まだ実践したわけではないですが、試してみようと思います。