OmniAICreator/Qiita-1.07M huggingface dataset:
Haskellでは末尾再帰にする必要が無いのかという疑問 #Haskell

[昨日の記事](http://qiita.com/Tatsuki-I/items/9f416dc4edbb9161c780)に対して[arowM](http://qiita.com/arowM)さんから

>実はHaskellの場合は遅延評価の影響で、末尾再帰にしても
>
>`fact' x y = fact' (x - 1) (x * y)`
>の `(x - 1)` とか `(x * y)` とかが評価されずに残り続けてしまうので、あまりうまみがなかったりっていう話もあります。
>http://d.hatena.ne.jp/kazu-yamamoto/20091122/1258899591
>
>もしかしたら最近のGHCの状況では話は別かもしれないです。
>そのへんはきっと誰かが教えてくれるはず。

というコメントがありました([arowM](http://qiita.com/arowM)さん、ありがとうございました).

僕もこの記事を読んだ事がありましたが, 通常の再帰と末尾再帰で圧倒的に体感時間の差があったため, もうこの事を忘れて勢い余って投稿してしまいました. 

もしかしたら末尾再帰を理解した事が嬉しすぎて時間が経つのが早く感じてしまったのじゃないかと思ったので, ちゃんと検証していきたいと思います.

##検証開始

と言っても大それた事をするわけではありません. ただプログラムの実行時間を計るだけです.
測定に使うのはMacの`time`コマンドです. 
引数にコマンドや実行ファイルを与えると, そのコマンドを実行して実行にかかった時間を教えてくれます.

##ソースコード

では次に比較に使うプログラムです.

###通常再帰

```hs:fib1.hs
fib :: Integer -> Integer
fib 0 = 1
fib 1 = 1
fib n = fib (n - 1) + fib (n - 2)

main = print $ fib 35
```

###末尾再帰

```hs:fib2.hs
fib' :: Integer -> Integer
fib' n = fib'' n 1 1
    where
        fib'' n x y
            | n == 0 = 1
            | n == 1 = x
            | otherwise = fib'' (n - 1) (x + y) (x)

main = print $ fib' 35
```

はい, 例によってまたフィボナッチ数列です.
好きなんですよ, フィボナッチ数列.

##測定

ではこれから測定をしていきたいと思います.
測定に使ったマシンはMacBook Pro (Retina, 15-inch, Mid 2014)で, CPUは2.2 GHz Intel Core i7です.

まずは1回目

```bash:実行結果
time ./fib1      
14930352
./fib1  1.81s user 0.02s system 98% cpu 1.845 total

time ./fib2      
14930352
./fib2  0.00s user 0.01s system 45% cpu 0.016 total
```

......圧倒的ですね

もう5回ずつやった結果の表が以下の通りです.

###測定結果

|回数|通常再帰(sec)|末尾再帰(sec)|
|--:|--:|--:|
|1|1.845|0.016|
|2|1.910|0.015|
|3|1.893|0.008|
|4|1.842|0.009|
|5|1.870|0.008|
|6|1.892|0.008|
|平均|1.8753|0.0107|

170倍以上の差が出ていますね.
正直ここまで差が出るとは思いませんでした. 

ちなみにCPU使用率の平均は通常再帰が`98.67%`, 末尾再帰が`57.33%`でした.

##~~結論~~

~~最新のGHCではどうやら末尾再帰最適化(?)が行われているっぽいですね.
もう少し詳しく調べてみようと思います.~~

##追記

[SaitoAtsushi](http://qiita.com/SaitoAtsushi)さんから

>これはそもそも同じ計算量ではないです。 式変形の段階でアルゴリズムが変わっています。 以前に似たような事例を見て解説記事を書いたことがあるので参考にしてください。
>
>》[フィボナッチ関数の計算量 - 主題のない日記](http://saito.hatenablog.jp/entry/20090208/1234085992)

という指摘をいただきました.
実際に実行過程を追っていきたいと思います.
(申し訳ありません, 通常再帰は左側優先, 末尾再帰は右側優先で計算してしまいました. 計算結果と計算量に差はありませんので, ご了承下さい)

```hs:通常再帰実行過程
fib 5
↓
(fib 4) + (fib 3)
↓
(fib 4) + ((fib 2) + (fib 1))
↓
(fib 4) + ((fib 2) + 1)
↓
(fib 4) + (((fib 1) + (fib 0)) + 1) 
↓
(fib 4) + (((fib 1) + 1) + 1)
↓
(fib 4) + ((1 + 1) + 1)
↓
(fib 4) + (2 + 1)
↓
(fib 4) + 3
↓
((fib 3) + (fib 2)) + 3
↓
((fib 3) + ((fib 1) + (fib 0))) + 3
↓
((fib 3) + ((fib 1) + 1)) + 3
↓
((fib 3) + (1 + 1)) + 3
↓
((fib 3) + 2) + 3
↓
(((fib 2) + (fib 1)) + 2) + 3
↓
(((fib 2) + 1) + 2) + 3
↓
(((fib 1) + (fib 0)) + 1) + 2) + 3
↓
(((fib 1) + 1) + 1) + 2) + 3
↓
(((1 + 1) + 1) + 2) + 3
↓
((2 + 1) + 2) + 3
↓
(3 + 2) + 3
↓
5 + 3
↓
8
```

引数5で22回の計算でした. 

```hs:末尾再帰実行過程
fib 5
↓
fib' 5 1 1
↓
fib' (5 - 1) (1 + 1) 1
↓
fib' (5 - 1) 2 1
↓
fib' 4 2 1
↓
fib' (4 - 1) (2 + 1) 2
↓
fib' (4 - 1) 3 2
↓
fib' 3 3 2
↓
fib' (3 - 1) (3 + 2) 3
↓
fib' (3 - 1) 5 3
↓
fib' 2 5 3
↓
fib' (2 - 1) (5 + 3) 3
↓
fib' (2 - 1) 8 3
↓
fib' 1 8 5
↓
8
```

同じく引数5で14回の計算でした.

これは差が出て当然ですね......
申し訳ありませんでした.
また近いうちに, 計算量が同じ関数を用いて試したいと思います.
[SaitoAtsushi](https://qiita.com/SaitoAtsushi)さん, ありがとうございました.
【Salesforce初心者】Apex開発でハマった(already output)事件

ハマりましたね。。初級のトラップ笑
already outputというDEBUGメッセージに。

コード①

```
Map<Integer, List<String>> mapA = new Map<Integer, List<String>>();
List<String> liststr = new List<String>();

liststr.add('a');
liststr.add('b');

//System.debug(liststr);

mapA.put(1, liststr);

liststr.clear();

liststr.add('c');
liststr.add('d');

mapA.put(2, liststr);

System.debug(liststr);
System.debug(mapA);
```

コード②

```
Map<Integer, List<String>> mapA = new Map<Integer, List<String>>();
List<String> liststr = new List<String>();

for (Integer j =0; j<2; j++){
liststr.clear();
for (Integer i = 0; i<2; i++){
liststr.add('a'+i);
}
mapA.put(j, liststr);
}
//System.debug(liststr);
System.debug(liststr);
System.debug(mapA);

```

上記の二つのコード（実際同じだけど）、をコンソール上で実行したら、

```
DEBUG|(c, d)
DEBUG|{1=(c, d), 2=(already output)}
```

'a'と'b'がなぜ入らないのかなと結構悩んでました笑
毎回clearしているし。

で、理由は
MapAにputしているのは、Listの中の値ではなくて、
そう！参照しているアドレスだから！
以上。笑
SQL Server Management StudioでSQL SeverのローカルDBへ接続


ちょっとした量のCSVなどのデータを加工して使用したいときに、ローカルDBでさくっとやりたい場合がある。やり方はすごく簡単

１．cmdで「sqllocaldb info」と叩いてローカルサーバ名を確認

２．SQL Server Management Studioで「(localdb)\取得したローカルサーバ名」で接続完了（認証は「Windows認証」を選択）
![image](https://qiita-image-store.s3.amazonaws.com/0/41877/c896a98e-6fca-2b79-81a7-a6c5ff6d0f8d.png)
Android 処理をサクッとDelayしたい時


メインスレッド

```
new Handler(Looper.getMainLooper()).postDelayed(() -> {
        // do something
        
}, 5000);
```

サブスレッド

```
HandlerThread handlerThread = new HandlerThread("hoge");
handlerThread.start();
new Handler(handlerThread.getLooper()).postDelayed(() -> {
        // do something

}, 5000);
```
PurePerlとは何を意味するのか？

Perlの調べ物をしているとしばしばpureperl、ピュアPerlなどという謎単語が出てきます。
それについてのまとめ。

[PurePerl](https://wiki.suikawiki.org/n/PurePerl)
>
[1]XS を使わず純粋に Perl だけで書かれていることを、 pure perl といいます。
[2]XS 版と pure perl 版があるとき、前者を Hoge::XS、後者を Hoge::PP のように命名する慣習があります。
[3] PP 版は XS 版より動作速度で劣ることもありますが、 可搬性に優れ扱いやすいため好まれることがよくあります。

[What defines "Pure Perl"?](http://www.perlmonks.org/?node_id=709757)


[Unicode::Japanese \- Convert encoding of japanese text \- metacpan\.org](https://metacpan.org/pod/Unicode::Japanese)

>
use Unicode::Japanese qw(PurePerl);
If you want to explicitly take the pure perl implementation, pass 'PurePerl' to the argument of the use statement.
【メモ】「Ｒ」をGUIで扱う統計ソフト「RKWard」をUbuntuで使う準備。

## RKWardについて

「RKWard」は、GUIでRを使った分析ができる統計ソフトで、SPSSのようにスプレッドシート形式のインターフェイスで直接データの入力や編集も可能です。しかも出力はHTML+SVGという優れものです(一部の環境では、画像が表示されず、保存されます)。

## 本体のインストール
「RKWard」は、ubuntuの標準リポジトリに登録されているので、

> apt install rkward

でインストールすることができます。

## プラグインのインストール
優れたソフトフェアではあるものの、現在、いくつかの分析は実装されていません。Rのスクリプト自体を走らせることもできるので、いくらでも新しい分析手法が使えるのですが、せっかくGUIで分析ができるので、同じ操作で分析できた方がいいです。
幸い、分散分析（anova）とペアワイズのｔ検定などが、プラグインとして公開されています。

RKWardのオフィシャルページからリンクで飛べるサードパーティー・プラグインのリストに上がっているプラグインには、debian/ubuntu用のdebファイルと、リポジトリを利用したインストール方法が掲載されています。しかし、プラグインによってリポジトリのアドレスが違うこともあります。
調べたところ、

> r-other-rkward-rk.anova
> r-other-rkward-rk.clusteranalysis
> r-other-rkward-rk.cohenkappa
> r-other-rkward-rk.factoranalysis
> r-other-rkward-rk.gitinstall
> r-other-rkward-rk.multidimensionalscaling
> r-other-rkward-rkwarddev
> r-other-rkward-ximple

に関しては、**https://distribute.kde.org/rkward/deb**が[最新のようです](https://mail.kde.org/pipermail/rkward-users/2017-March/001205.html)

これに基づいて、インストール方法を整理しておきます。

>sudo echo "deb https://distribute.kde.org/rkward/deb unstable main" | sudo tee -a /etc/apt/sources.list
>sudo echo "deb-src https://distribute.kde.org/rkward/deb unstable main" | sudo tee -a /etc/apt/sources.list


または、「ソフトウェアとアップデート」を起動し、「他のソフトウェア」タブで「追加」を押し、「リポジトリの完全なAPTライン」ダイアログの「APTライン」入力フィールドに、

> deb https://distribute.kde.org/rkward/deb unstable main

と入力して、「ソースを追加」をクリック。もう１つの

> deb-src https://distribute.kde.org/rkward/deb unstable main

も同様にして追加しておきます。

つづいて、PGPキーをインポートするためのrkward-keyringパッケージをインストールします。

> sudo apt install rkward-keyring


「ソフトウェアとアップデート」を使用した場合は、追加した時点で更新が走りますが、ターミナルからコマンドラインでリポジトリを追加した場合は、

> sudo apt update

で、リストを更新しておきます。

プラグインのインストールは、通常通り

> sudo apt install [hogehoge]

で、[hogehoge]の部分を、上のプラグンイン名称にします。


ここで「RKWard」を起動し、「Settings」→「Congfigure RKWard」→「Plugins」→「Configure Active Plugins」をクリックします。すると、先ほどのプラグインが自動的に検出されるので、ダイアログの指示通りに登録します。

## リポジトリの登録

さて、この段階でインストールされている「RKWard」は最新版でないこともあります。2017年5月16日段階では、0.6.4.1でした。しかし、この時点での最新版は、0.6.5です。

そこで、「RKWard Official Stable Releases」をリポジトリに登録し更新します。

> sudo add-apt-repository ppa:rkward-devel/rkward-stable
> sudo apt update

更新ファイルがあれば、通常の手続きで、

> sudo apt upgrade -y

を実行します。そうすると、すべての更新がインストールされます。

## 最後に
リポジトリを更新してからインストールすればよさそうなものなのですが、そうした場合、「RKWard」を起動した際に、肝心のRが読み込めず、分析が行えないというエラーが発生してしまいました。
そういうわけですので、この手順がよさそうです。
OnsenUIをつかってアプリを作る


## 通知アイコンを作成する

[Onsen UIテーマローラ](http://components.onsen.io/)
[【Monaca】Onsen UIのツールバーのメニューアイコンにバッジを表示する](http://hatopp.wpblog.jp/archives/385)
[OnsenUI : Tabbar with badger notification](http://stackoverflow.com/questions/25110895/onsenui-tabbar-with-badger-notification)
AndroidでGSONを利用してArrayListを保存する

AndroidでArrayListを保存する際、SQLiteを使うほどでもない単純な場合は、
JSONにしてPreferenceに保存すると便利です。

また、JSONへ変換する際にはGSON(Google製ライブラリ)を使うとさらに楽になると思います。
https://github.com/google/gson

今回は`ArrayList<String>`型を変換して保存します。

### GSONの導入

Android Studioにて、gsonライブラリをgradleで導入。

```java
dependencies{
      ...
      ...
      compile 'com.google.code.gson:gson:2.7' //少し古いかも
}
```

### 読み込み

```java
private ArrayList<String> arrayList;
SharedPreferences pref = getSharedPreferences("pref", MODE_PRIVATE);
Gson gson = new Gson();
arrayList = gson.fromJson(pref.getString(SAVE_KEY, ""), new TypeToken<ArrayList<String>>(){}.getType());
```

もしpreferenceに未保存の状態の処理も分岐させたいならこんな感じに

```java
private ArrayList<String> arrayList;
SharedPreferences pref = getSharedPreferences("pref", MODE_PRIVATE);
Gson gson = new Gson();
String json = pref.getString(SAVE_KEY, "");
if(json.equals("[]"))
{
    arrayList = new ArrayList<>();
}
else
{
    arrayList = gson.fromJson(json, new TypeToken<ArrayList<String>>(){}.getType());
}
```

### 書き込み

```java
SharedPreferences pref = getSharedPreferences("pref", MODE_PRIVATE);
Gson gson = new Gson();
pref.edit().putString(SAVE_KEY, gson.toJson(arrayList)).apply();
```
ログ "Setting the background color on UITableViewHeaderFooterView has been deprecated." を消す

# 起こった現象

xib ファイルからインスタンス化したカスタムな UITableViewHeaderFooterView を表示すると下記のログが出力される。表示に影響はない。

>Setting the background color on UITableViewHeaderFooterView has been deprecated. Please use contentView.backgroundColor instead.

# 解決方法

* xib 上で UITableViewHeaderFooterView のサブクラスを作成したときに backgroundColor が White Color に設定されているので、 default に変更する
* コード上での backgroundColor の設定をやめる

![スクリーンショット 2017-05-17 20.34.20.png](https://qiita-image-store.s3.amazonaws.com/0/92385/0076b895-7fbc-f44c-50c2-a89598fb495c.png)

# 参考
https://ringosoftware.wordpress.com/2014/05/13/%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0%E3%83%98%E3%83%83%E3%83%80%E3%83%BC%E3%83%93%E3%83%A5%E3%83%BC%E3%81%A7%E3%81%AE%E3%82%A8%E3%83%A9%E3%83%BC%E3%80%8Cbackgroundcolor%E3%80%8D%E3%81%8C%E3%81%AA/
Tangoで２眼表示する


Vuforia[^1] にはCardboardをはじめとした２眼用のプリセットがいくつか用意されている．
まぁざっくりとTangoでそういう感じのことをしたい．


# カメラを２個用意する

２眼のためにはカメラが２つ必要， まずは `Tango Camera` を２つ置く．
さらに名前をよしなに変えておく．今回は `StereoCameraLeft` と `StereoCameraRight` にした．
あとは（気分的な問題で）親を作っておく．

Hierarchy は次のようになった．
![スクリーンショット 2017-05-17 19.58.21.png](https://qiita-image-store.s3.amazonaws.com/0/178486/f9fc78eb-3a5b-c679-7332-6a7140717720.png)


# 各カメラのViewport Rectを設定する

以下に `StereoCameraLeft` と `StereoCameraRight` の設定を置いておく．
基本的に同じだが，特筆すべき点は `Viewport Rect` の値．
縦横サイズ（W,H）を半分にして，Y+（上）に`0.25`だけずらしている．
`StereoCameraRight` においては，画面の右側になるようにX+に`0.5`している．

<img src=https://qiita-image-store.s3.amazonaws.com/0/178486/72acf1d4-f9a8-ea2d-fe85-75a0908f7a62.png width=400> <img src=https://qiita-image-store.s3.amazonaws.com/0/178486/8a3d952d-ff73-2c23-7e0e-f7dac3e31c04.png width=400>

# ２眼になる

これで視差なし２眼になる．

<img src=https://qiita-image-store.s3.amazonaws.com/0/178486/4eed23cd-8186-0dd3-e821-2a31be47f323.jpeg width=600>



# 視差

また，両カメラの位置を現実世界換算で6.41cmくらい[^2]ずらしておくと視差あり２眼になるが，
IPD警察の警邏に対応するための調整機能の搭載をお勧めする．

<img src=https://qiita-image-store.s3.amazonaws.com/0/178486/94b515d0-c0f9-5464-7d68-9df20d2c8e5b.png width=600>


<br>

---

<br>


余談だが，２眼を作ったところで上手く填まるARグラスを持ち合わせていないので，
有識者がおられたらご教授願いたい．

Phab 2 Pro

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">Phab 2 ProでHADOをTangoに移植しようとしてみたものの，6.4インチディスプレイを2眼にしても人間の瞳孔間距離より長いので，全く見えないということがわかった．大は小を兼ねない． <a href="https://t.co/aaw83NXULb">pic.twitter.com/aaw83NXULb</a></p>&mdash; Izumi Shirosaki (@izugch4423) <a href="https://twitter.com/izugch4423/status/863956224546447364">2017年5月15日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>


Zenfone AR

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">ハマらなかったり，デカすぎたり，ピッタリ合わんなあ． <a href="https://t.co/DZoCDgwe9c">pic.twitter.com/DZoCDgwe9c</a></p>&mdash; Izumi Shirosaki (@izugch4423) <a href="https://twitter.com/izugch4423/status/864806238659399680">2017年5月17日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>


<br>




---



[^1]: https://developer.vuforia.com/

[^2]: https://www.dh.aist.go.jp/database/head/index.html 瞳孔間幅
LPIC Lv1 学習日記_03

本日のハイライト

•テキストデータ内の文字列を検索するにはgrepコマンドを使用
-nオプションでは行番号を表示する。

•正規表現について
正規表現とは記号や文字列を組み合わせて目的のキーワードを検索するためのパターンを作り検出する手段
例: '^a.*o$' 先頭がaで末尾がoの文字列を検索

主なメタキャラクタ

「.」任意の文字に一致
「^」行の先頭(^文字)
「$」行の末尾(文字$)
「*」直前の文字が0回以上の繰り返しに一致
「?」直前の文字が0回もしくは1回の繰り返しに一致
「+」直前の文字が1回以上の繰り返しに一致
「[]」[]内の文字グループに一致
例:
[abAB]a,b,A,Bいずれかに一致
[^abAB]a,b,A,B以外のいずれかに一致
[a-bA-B]a,b,c,d,A,B,C,Dいずれかに一致

「\」メタキャラクタを文字として使う場合に使用
例:
'^a.*.$' これは「.」がメタキャラクタとして扱われているためエラー
'^a.*\.$' これは「.」が文字として扱われているため「.」が末尾の文字列を検索する指定として機能する

•egrepコマンドはgrepコマンドより高度な文字列検索を行う
-vオプションは条件に一致しない行を検索する

•行末の#を指定する場合は'#$'となるが、bashでは#以降の文字列をコメントとして無視するため'\#$'としてエスケープするなどしなければならない

•fgrepコマンドはgrepコマンド同様に文字列を検索するコマンドだが、こちらは正規表現を使用しない
git で間違ってリビジョンを消してしまった時にできること

# はじめに

つい先日、masterブランチを開発ブランチにマージした際にやらかしてしまい。
開発ブランチ上のコミットが消えて（見えなくなって）、かなり焦ることがありました。
その際、.git配下のファイルから復帰が出来たので、その時のメモになります。

# やらかしたこと

## なにをしていたか
* 開発ブランチで開発中だった
* hotfix 対応があった
* hotfix 対応部分を開発ブランチに取込もうと、マージした
* 冗長なコミットに気付く
* ログを綺麗にしようと思いたち、リビジョンを戻した
```shell-session
  git reset --hard <revision>
  ```
* 冗長なコミットをまとめて修正
* まとめて push 
```shell-session
git push -f origin <開発ブランチ>
  ```

正確に把握していない（ボーっと作業していた）ので、
なにか間違いがありそうですが、たぶんこんな感じです。


## ・・・ここ３日で作ったコミットが、ない！？
リモートリポジトリを眺めていて異変に気付きました。

「あれ？ブランチ間で差分が出てない。」

「開発ブランチにしかないコミットがあるはずなのに？」

「・・・ここ３日で作ったコミットが、ない！？」

久しぶりに心臓が冷える思いがしました。。
GWに出勤して作ったのに・・。


# 何をして復旧したか？

## git を信じて revision ログを探す
心臓は冷えましたが、「git なら残っているはず」と信じて、
.git 以下のファイルを見てみました。
以下、ほぼ名前からの推測と勘で、目的のファイルに一発で
辿り着きました。

***直感的な名付けとフォルダ分けがされていて本当～～～～に助かりました。***
さすが git様。
ありがとう、いいツールです。

以下、見て行った順に画像を貼ります。

### .git 
![01.dotgit.png](https://qiita-image-store.s3.amazonaws.com/0/16382/4db5381c-e203-ee87-8e42-15cdbd23f17d.png)
ここは、フォルダ名を信じて logs を見ます。

### .git/logs
![02.logs.png](https://qiita-image-store.s3.amazonaws.com/0/16382/3d29c1a1-6d2a-9752-d98a-7c414925e65c.png)
HEADではないので、refs を見てみます。

### .git/logs/refs
![03.refs.png](https://qiita-image-store.s3.amazonaws.com/0/16382/578d8108-fefe-fd89-6434-6eec69113050.png)
remoteではないので、heads を見てみます。

### .git/logs/refs/heads
![04.heads.png](https://qiita-image-store.s3.amazonaws.com/0/16382/549e9297-ac82-7d7e-f1d3-50b319c5a93a.png)
featureフォルダが見えました。かなり期待が持てますね。。どきどき
※ ちなみに、feautreってなんでしょうね。

### .git/logs/refs/heads/feature
画像は割愛していますが、ありました。feature 毎のファイルが。
さっそく、やらかしたfeatureと同名のファイルを見てみます・・！


### repository
![repository.png](https://qiita-image-store.s3.amazonaws.com/0/16382/456c3149-2485-3950-53ea-bb1b20446163.png)
きました・・。
コミット時のリビジョンが残っています・・・。

これで、git reset すれば・・！どきどき

```shell-session
git reset --hard <revision>
```

### 復旧しました！

私の場合は、この作業でやらかす前に戻ることができました！
（３日分の作業が無駄にならずに済みました・・！）


# 教訓
フォルダ分け、名付けは本当に大事。


こんなミスを他の人が犯すのかは疑問ですが（苦笑）
どなたかの参考になれば幸いです。
Emek çilingir

http://ankaraemekcilingir.com/
Ankara Emek çilingir kendi sektöründe en iyi ve en kaliteli hizmeti vermek amacıyla Emek Mahallesin’de hizmet vermeye başladı. Emek çilingir gün geçtikçe yükselen bir performans yakaladı Alanında tecrübeli ve uzman kadrosu ile çilingir ile alakalı problemleri profesyonelce, müşteri memnuniyeti önceliği ile çözer.7 gün 24 saat, gece gündüz hizmetinizdedir. Ankara’nın neresinde olursanız olun servislerimiz kısa sürede içerisinde emrinizde.7/24 Hizmet Hattı 0555 699 08 09  Kaliteli, uygun ve üstün hizmette hoşgeldiniz.
Ankara Emek Çilingir,Emek Çilingir,EmekAnahtarcı,Ankara Emek Anahtarcı,
【新人エンジニア向け】Vimに興味を持ってもらうための話

# はじめに

* `Vim`を使い始めて3年経つ新人が更なる新人に対して`Vim`を売り込むための話
* 興味を持ってもらうための話なのでポジティブな部分多めです
* 新人向けなので深い話はしないです
* 少しでも興味を持って「使ってみようかな？」と思ってもらえれば幸いです
* ~~（あとせっかくなので前々から気になってたqiitaのスライドモードを使ってみたかった）~~

---

# Vimとは

エディタです。
それ以上でも以下でもないです。

* メリット
    * UNIX系に標準で入ってるので入れるコストがない
    * 拡張性が高くできないことはない
    * 拡張しない素の状態でもできることが多い
    * エディタ自体が軽量なので重いファイルもサクッと開ける
* デメリット
    * 操作が独特で初見の感想「使いづらい」
    * `Vim`である必要がなく「それ`Sublime`でできるよね？」ってこともよくある

---

# できるようになること

* 入力したい箇所に移動するのが爆速
* 先頭・末尾に何度も同じ文字を書かなくても一括で入力可能
* 連番を振るのが楽

![QGU0Yo4JZ7.gif](https://qiita-image-store.s3.amazonaws.com/0/67471/a89c242c-f909-c00c-4749-bbeaf4bc0837.gif)

---

# 早速触ってみよう

ターミナルを開いて以下を入力

```bash
vim hoge.txt
```

真っ暗い画面が出てきたら成功です。

---

# 文字を入力して保存してみよう

`i`を押して入力モードにする
`hoge`と入力
`esc`を押してノーマルモードにする
`:`を押してコマンドモードにする
`wq`を押して保存して終了
やることはこれだけ。ね？簡単でしょ？

![R3I4ytZnSa.gif](https://qiita-image-store.s3.amazonaws.com/0/67471/c47f421f-aa06-e20f-81f6-b0673f293b53.gif)

---

# 覚えなきゃいけないこと

`Vim`にはモードが4つあるのでそれらの役割を覚える必要があります

* ノーマルモード
    * 1番基本的な状態。何か操作が終わったらノーマルモードに戻っておくことが望ましい。
* インサートモード
    * ノーマルモードの次によく使うモード。文字列を入力するためのモード。
* コマンドモード
    * `Vim`に対してコマンド（司令）を渡すモード。保存したり終了したり置換したり…。
* ビジュアルモード
    * 範囲選択をする時などに主に使用するモード。

何か困ったらとりあえず`esc`連打しておけば何とかなります。

---

# 図解

![Vimのモード遷移図.png](https://qiita-image-store.s3.amazonaws.com/0/67471/ea4051ce-368c-0c8d-00c9-22905ef8471e.png)

---

# 動画の解説

![QGU0Yo4JZ7.gif](https://qiita-image-store.s3.amazonaws.com/0/67471/a89c242c-f909-c00c-4749-bbeaf4bc0837.gif)

* インサートモードでhogeを入力
* `yy`で現在の行をヤンク（コピー）
* `10p`で10行ペースト
* `gg`で先頭に移動
* `Ctrl + v`でビジュアルモードに移行（矩形選択モード）
* `G`で末尾まで選択
* `I`でインサートモードに移行
* 0を入力し`esc`でノーマルモードに移行
* `Ctrl + v`でビジュアルモードに移行（矩形選択モード）
* `G`で末尾まで選択
* `g Ctrl + a`で選択箇所をインクリメント
* `Ctrl + v`でビジュアルモードに移行（矩形選択モード）
* `G`で末尾まで選択
* `$`で行末まで選択
* `A`でインサートモードに移行
* hogeを入力し`esc`でノーマルモードに戻る

---

# おまけ

`.vimrc`というファイルを生成してホームにおいておけば、これが拡張するためのカスタマイズファイルとなります。
世の中にはありとあらゆる`.vimrc`が転がってますのではじめは有名なものをまんまコピーするといいかもしれないですね。
そこから自分好みにカスタマイズしていくと段々自分だけの秘伝のタレが整っていきます。
最近作業マシンを引っ越したのですがエディタに関しては`.vimrc`を持っていくだけで済んだのでとてもお手軽でした。

---

# おわりに

いかがでしたでしょうか？
お世辞にもとっつきやすいとは言えないですが、使いこなしたら便利そうなのが伝われば嬉しいです。
実際に業務で本番サーバに入って何か操作をする際には必須スキルとなってきますので、リテラシーだと思って最低限の操作だけは押さえておきましょう。
それでは快適な`Vim`ライフを:smile:
scssの配列ループ＋変数でカテゴリ色分けなどを簡単にするよ！

配列＆ループを使って、同じようなものをコード少なくしたい。。。
試してみたら、コケるポイントがあったので、メモメモ。

#やりたかったこと。

こんな感じのものがあって、

```ruby:雰囲気オブジェクト
{
  category: cate1,
  color: color1
},
{
  category: cate2,
  color: color2
},
{
  category: cate3,
  color: color3
}
```

これを、scssの配列を使って↓こんな感じにしたい。

```ruby:仕上げたいcss
.list-cate1{
  background: color1;
}
.list-cate2{
  background: color2;
}
.list-cate3{
  background: color3;
}
```

#やったこと。

##前提。
色は変数で設定しておきます。

```ruby:scss：色の変数設定
$cateColor-cate1: #cate1なカラー;
$cateColor-cate2: #cate2なカラー;
$cateColor-cate3: #cate3なカラー;
```


##こちらができたやり方です。
カテゴリ名と色の変数をそれぞれ順番をそろえて配列に入れます。

```ruby:scss：配列に設置
$categories: "cate1", "cate2", "cate3";
$color: #{$cateColor-cate1}, #{$cateColor-cate2}, #{$cateColor-cate3};
```

indexを使って、それぞれ取り出します。

```ruby:scss：CSS書き出し部分ループ
@each $category in $categories {
  $n: index($categories, $category);
  $color: nth($color, $n);
    .cate-#{$category} {
    background: $color;
  }
}
```


##こちらではうまくいかなかったです。

```ruby:scss：CSS書き出し部分ループ　例1
@each $category in $categories {
  .cate-#{$category} {
    background: $cateColor-#{$category};
  }
}
```
```ruby:css：結果
コンパイルエラー
$cateColor-　ってなんやねん。知らんわ。
```

それを乗り越えても、いったん色変数を配列にいれず、ループの中で変数名を作り出しても変数の文字列のまま吐き出されるようです...

```ruby:scss：CSS書き出し部分ループ　例2
@each $category in $categories {
  $colorName: "$cateColor-#{$category}";
  $color: #{$colorName};
  .cate-#{$category} {
    background: $color;
  }
}
```

```ruby:scss：CSS書き出し部分ループ　例3
@each $category in $categories {
  $colorName: "$cateColor-#{$category}";
  $color: unquote($colorName);
  .cate-#{$category} {
    background: $color;
  }
}
```

```ruby:css：例2&3の結果
.cate-cate1 {background: $cateColor-cate1; }
.cate-cate2 {background: $cateColor-cate2; }
.cate-cate3 {background: $cateColor-cate2; }
```

。。。。変数が文字列のままコンパイルされてるやんTT。


#参考
http://5509.hatenablog.com/entry/2012/03/01/021535
ありがとうございました。（あ、、、2012年。。。。）


#※追記　－　シンプルになった！
volkuwabaraさんに教えていただきまして、参考先をもとに修正しました！
コードスッキリ～。

```ruby:scss：連想配列使えたよ!
$categoryColors:(
  cate1: #{$cateColor-cate1},
  cate2: #{$cateColor-cate2},
  cate3: #{$cateColor-cate3}
);

@each $category, $color in $categoryColors {
  .cate-#{$category} {
    background: $color;
  }
}
```
##参考
http://qiita.com/kid84/items/568b0c8d8dd9aafcd706
ありがとうございます！！
ViewPagerの使い方(Android)~Fragmentページを作る~

#○ 事前準備として
##FragmentStatePagerAdapterクラスを作成
役割：viewPagerに必要なFragmentページを渡す

```CustomFragmentStatePagerAdapter.java
public CustomFragmentStatePagerAdapter extends FragmentStatePagerAdapter{//FragmentStatePageAdapterを継承(*1)
  
  private SparseArray<Fragment> mFragmentArray;
  private List<HogeData> mHogeDataList;
  
  public CustomFragmentStatePagerAdapter(FragmentManager fm,List<HogeData> dataList){
    super(fm);
    mFragmentArray = new ArrayList<>(); //返却するFragmentのList初期化
    mHogeDataList = dataList; //ここでデータを保持しておく　//FragmentはgetItemで作成
  }

　　　　@Override
  public HogeFragment getItem(int position){ //Fragmentのページを返却する実装を書く
　　　　　　　　 HogeFragment fragment = mFragmentArray.get(position);
        if (fragment != null) {
            return fragment; //すでにFragmentを作っていたらリサイクルして使用する
        }
        fragment = HogeFragment.createInstance(mHogeDataList.get(position));
        mFragmentArray.append(position, fragment);
        return fragment;
　　　}

  @Override
  public getCount(){  //mViewPager.setAdapterするときにここを参照してページ数を決める
    return mHogeDataList.size();
  }

  @Override
  public getPageTitle(){  //tabLayoutと連携しているときmViewPager.setAdapterしたときにここの文言をタブに表示する
    return title;
  }

  public void setHogeDataList(List<HogeData> dataList) {
    mHogeDataList = dataList;
    notifyDataSetChanged();//データを変更した時に呼ぶ//すべてのfragmentページが再生成される
  }
}
```

>(補足)
*1 Fragmentを使用する時のViewPagerのAdapterは`FragmentStatePagerAdapter`と`FragmentPagerAdapter`がある。Stateの方はFragmentの状態のみを保持する。メモリ節約したい時はStateを使うみたい

#○ 使用例
```
ViewPager mViewPager;
CustomFragmentStatePagerAdapter mAdapter;
TabLayout mTabs; //tabLayoutを連携させる時

mViewPager.setAdapter(mAdapter);
mViewPager.setOffscreenPageLimit(2);　　　　//左右の保持するFragment数を設定、デフォルトは1
mTabs.setupWithViewPager(mViewPager); //tabLayoutと連携する場合

//補足
mPager.setCurrentItem(3); //ページ変更
mTabs.addOnTabSelectedListener();//Tabが選択された時のリスナー
```
参考資料
https://developer.android.com/reference/android/support/v4/app/FragmentPagerAdapter.html //公式HP
http://k-1-ne-jp.blogspot.jp/2013/12/viewpagerfragmentstatepageradapter.html //ViewPagerを使ってみる(FragmentStatePagerAdapterを利用する）
Elixirでエラトステネスの篩を実装してみた

先日参加させていただいた勉強会 [Go&Elixirでつくる分散アプリケーション](https://classmethod.connpass.com/event/55140/) にて
エラトステネスの篩というアルゴリズムをGo言語で実装した例を紹介していました。
(実はその勉強会で初めてこのアルゴリズムを知りました ^^;)

エラトステネスの篩はある指定された整数以下の素数を見つけるためのアルゴリズムとなります。
詳細は[Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%A8%E3%83%A9%E3%83%88%E3%82%B9%E3%83%86%E3%83%8D%E3%82%B9%E3%81%AE%E7%AF%A9)をご参照ください

勉強会での例ではGoのチャンネルを使って実装されていたので、
Elixirでは子プロセスを生成し、そちらで値のフィルタリングをしていくという
方法で実装みたいと思います。

# 実装

```ex:erastosthenes.exs
defmodule Erastosthenes do

  def sieve(prime, next, last?) do
    receive do
      n when rem(n, prime) == 0 ->
        sieve(prime, next, last?)
      n ->
        send next, n
        next = if last? do
          # 自身が最後の篩だったら次の篩を生成する
          {pid, _} = spawn_monitor Erastosthenes, :sieve, [n, next, true] 
          pid
        else
          next
        end
        sieve(prime, next, false)
    end
  end

  def output do
    receive do
      n ->
        IO.puts "#{n} is prime."
        output()
    end
  end
end

opid = spawn Erastosthenes, :output, []
{spid, _} = spawn_monitor Erastosthenes, :sieve, [2, opid, true]

2..100
|> Stream.map(&(send spid, &1))
|> Enum.to_list
```

それぞれの篩は以下の値を保持するようにしています
- 素数
- 次の篩、もしくは出力用プロセスのpid
- 自身が最後の篩かどうか

`sieve` を子プロセスとしてどんどん生成いき、
大元から渡された値を篩にかけていきます。
渡された値が自身の素数で割り切れなかったら次の素数の篩に送ります。
もし自身が最後の篩の場合、割り切れなかった値は
素数なので次の素数の篩を生成しています。


実行結果がこちら

```console
$ iex
iex(1)> c"erastosthenes.exs"
3 is prime.
5 is prime.
7 is prime.
11 is prime.
13 is prime.
17 is prime.
19 is prime.
23 is prime.
29 is prime.
31 is prime.
37 is prime.
41 is prime.
[Erastosthenes]
43 is prime.
47 is prime.
53 is prime.
59 is prime.
61 is prime.
67 is prime.
71 is prime.
73 is prime.
79 is prime.
83 is prime.
89 is prime.
97 is prime.
```

親プロセスでreceiveしていないため、iexで実行しないと
全部出力するまえに実行が終了してしまうのでわざわざiexで実行しています :sweat:

また最初の素数である2だけは最初に篩を作ってあげる必要があるので、
出力に表示されていないです :sweat: :sweat: 

# まとめ的な何か

今回は生spawnを使って書いてみましたが、
sieve関数で状態を保持する必要があるのでAgentを使ったほうがよかったかなと
思っています。

また出力のとこも微妙になってしまったのがなんとも残念です。
(Elixir力が足りない。。。)

何かご指摘等いただけますと嬉しいです。
機械学習スライドまとめのまとめ

# 機械学習メモ
大学の研究で機械学習をやりたいと思っているので
機械学習について学んだことをメモしていきたいと思っています。

**やろうと思っていることや意気込み** →ここは飛ばしておっけい。
機械学習って何？？という初心者が
機械学習でやりたいこと・できること・を学び
開発環境の決定などを自分用のメモとして残しておきます。


使われている機械学習の知識
自動運転・レコメンド機能・言語ルールと組み合わせて言語理解・不正検知

社会問題・ビジネス課題

したいこと
たくさんのデータの中からもらって未来予測

ここでは例として株orFXを目的としてもいいのかもしれない。

自分の行動を予測して
何の日に何をすればいいか教えてくれる秘書システム
コンシェルジュサービス

マッチングシステム

# 本編
**強化学習**
成功報酬というものを与えて、プログラムがその高い報酬を手に入れるためにどのようにすればいいか工夫するもの

**見ようと思っているスライドのまとめのまとめ**　→いつか必要なものだけをまとめておく。
機械学習が素早く学べるコンテンツとライブラリ20選: http://ur0.link/DyG9
今すぐにでも機械学習・ディープラーニングの勉強を始められるスライド１１：　http://ur0.link/DyGH
機械学習はじめの一歩に役立つ記事のまとめ：　http://ur0.link/DyGX

# 単語メモ
* ライブラリ・・・すでに使えるプログラムの部品をいっぱい集めたファイル

**ライブラリ一覧**
* tensorflow　: Googleが作ったニューラルネットワークの最新ライブラリ　計算をデータフローやグラフで表すことができる。ディープラーニングにも用いられている。
* scikit-learn : 統計学・パターン認識・データ解析の技法が豊富に使うことができる。機械学習の基盤となっているライブラリ
* Theano : 多次元配列を含んでいる数式を定めて最適化して使うことができる機械学習ライブラリ。チュートリアルが豊富
* Pattern : 貴秋学習のアルゴリズムだけではなく、データを集めて、分析するのを援助するためのツールも提供している。GoogleやTwitterなどのWebサービスからデータを集めてくるときに役に立つ。
* Caffe : 画像をはじめとする視覚的なものを機械学習するときに有用なライブラリ
* NumPy : 数値計算を効率的に処理するためのライブラリ。配列の操作がとても簡単になるので行列計算には必須である。
* SciPy : 様々な科学計算が実装されたライブラリであり内部でNumPyを利用している。
* matplotib : グラフ描画のライブラリである内部でNumPyを利用している

**開発環境作成するために必要なもの**
* pyenv : Pythonのバージョン切り替えを管理できるコマンドラインツール
* virtualenv : プロジェクトごとの仮想環境ツール
* homebrew : OSX上で動くパッケージ管理システム→ターミナルから簡単にソフトウェアをインストールできるようにするもの
* PyPI(pip) : Pythonのパッケージ管理ツール。ぱいぱいと呼ぶ必須ツールである。デフォルトでインストールされている。


# TensorFlowとPython開発環境用作成の目処
気持ちとしてはtensorflowを使っての開発を行いたいと思っているので
tensorflowを使うためにはどのような開発環境を作って行く必要があるのか調べていく。

pythonの環境構築からTensorFlowのインストール: http://ur0.link/DyJe
機械学習の初心者でもすぐに出来るTensorFlowのインストール方法: http://ur0.link/DyK9
Python3(Anaconda)でtensorFlow環境を構築して見る : http://ur0.link/DySU
MacでPythonを使って「機械学習」を学ぶための環境構築　http://ur0.link/DyT9

# 次回への課題
本日はスライド探しに力を注いだ。
次回はスライドを実際に見て機械学習はどのように進めて行くのか or
機械学習のための開発環境作成をやっていきたいと思っている。
iOS/Safariでiframe内にBootstrap3のModalを表示する時のアレ

`<iframe>` の中で Twitter Bootstrap3 の Modal を表示する際、スクロールを考慮した位置に正しく表示しようと思い下記のように`$(this)`の`top`を変更したところ、iOS/Safari の環境でのみmodalの表示アニメーション完了と同時に画面が大きく下にスクロールしてしまい、Modalの表示位置もおかしくなる不具合が発生していました。

下記は現象発生時のjavascriptと（無理矢理）解決した方法です。

# Environment

UserAgent: `Mozilla/5.0 (iPhone; CPU iPhone OS 10_2_1 like Mac OS X) AppleWebKit/602.4.6 (KHTML, like Gecko) Version/10.0 Mobile/14D27 Safari/602.1`

| 発生環境 | 発生バージョン |
| --- | --- |
| bootstrap | 3.3.7 |
| Device| iPhone7 |
| iOS | 10.2.1 |

# Buggy

```javascript
$('.hoge-button').click(function(e) {
  e.preventDefault();
  var $modal = $('#hogeModal');
  $('#hogeModal').on('show.bs.modal', function (e) {
    var iframe = window.top.document.querySelector('iframe');
    if (iframe) {
      var rect = iframe.getBoundingClientRect();
      $(this).css('top', -rect.top); //set modal position
    }
  });
  $modal.modal();
});
```

# Solved

```javascript
$('.hoge-button').click(function(e) {
  e.preventDefault();
  var $modal = $('#hogeModal');
  var scrollPos = {x: window.parent.scrollX, y: window.parent.scrollY};
  $('#hogeModal').on('show.bs.modal', function (e) {
    var iframe = window.top.document.querySelector('iframe');
    if (iframe) {
      var rect = iframe.getBoundingClientRect();
      $(this).css('top', -rect.top); //set modal position
    }
  });
  $('#hogeModal').on('shown.bs.modal', function (e) {
    window.parent.scrollTo(scrollPos.x, scrollPos.y); // for iOS Safari Auto Scrolling bug
  });
  $modal.modal();
});
```
Sqlite Command Note

### Open DB For Read/Write 
`$ sqlite3 myDatabase.sqlite`

### You can see for special command with `.help`
`sqlite> .help`

### Create Table
`sqlite> CREATE TABLE tblGeneral ([general_no] INTEGER NOT NULL,
[general_name] TEXT NOT NULL,PRIMARY KEY(general_no,general_name));`

### Delete Data From Table
`sqlite> delete from tblGeneral;`

### Import Data From CSV to Table
`sqlite> .separator "," /* To separate column in table */`
`sqlite> .import tblGeneral.CSV tblGeneral`

### Exit DB
If your process is finish need to exit that db
`sqlite> .exit`
若手エンジニアがビジネス寄りの展示会で感じたこと(その2)

[若手エンジニアがビジネス寄りの展示会で感じたこと(その１)](http://qiita.com/yan_hisa_/items/111deebea38dbf4b7101)の続きです。

#備えあれば憂い無し
イベントに出展するにあたり、用意しておくと役に立つものを紹介する。

# 資料
- 説明シナリオ
- FAQ
- 操作マニュアル
- シフト表
- 会場マップ（パンフレット）
- アンケート

説明シナリオ、FAQ、操作マニュアルは当日の説明で慌てないために用意しておきたい。
シフト表、会場マップは説明員が迷わないために作成、確保しておく。
アンケートは生の声を聞くためには必須。併せてバインダーも忘れずに。名刺をアンケートに貼れるようにすると時短になる。

# 持ってきていそうで忘れがちなものたち
- ガムテープ
- マジック
- 電源タップ
- ゴミ袋

ガムテープは万能選手である。名札にも使える、イベント後の梱包に使える、メモにも使える。
マジックはガムテープとペアで使うことが多かったです。
会場で十分に電源が用意されていることは少ない。PCやWi-Fi、タブレットを充電しておくためにも１つは用意しておきたい。
昼食時のゴミや撤収のときに出たゴミをまとめるために、ゴミ袋は持参しておく。

# 領収書
各自で領収書を切っているとイベント後の処理が大変
お財布を１つにしておくか、領収書を逐次集めておく
仕組みを作っておいた方がいい。

#担当者間連絡
今となっては当たり前のツールであるが、
LINE、Slack等で随時連絡を取り合えるようにしておくこと。（社内規定で阻まれることも･･･）

#最後に
展示会終了時には1日立ちっぱなしで、疲労困憊でしょう。
そんなときに役立つ品々を紹介しました。
忘れ物、落とし物なく帰路についてもらえると幸いです。
Ruby 複数行の入力を受け取る　改行なしで受け取る


#複数行の入力を受け取る

``` ruby
input = readlines

# 入力
# 120
# 115
# 122
# 116
# 119
# 117

print input 
# 出力結果
# ["120\n", "115\n", "122\n", "116\n", "119\n", "117 "]

puts input
# 出力結果
# 120
# 115
# 122
# 116
# 119
# 117 
```

#複数行の入力を改行なしで受け取る

```ruby
input = readlines.map &:chomp

# 入力
# 120
# 115
# 122
# 116
# 119
# 117

print input 
# 出力結果
# ["120", "115", "122", "116", "119", "117"]

puts input
# 出力結果
# 120
# 115
# 122
# 116
# 119
```
moshiをkotlinで使ってて、JSONのマッピングがうまくいかないときの対処法

moshiのバージョン1.5で、 `@Json(name = "ts") val timestamp: String` のようにフィールドとプロパティ名を別にして対応づけたんですが、うまくいきませんでした。

どうやら moshi1.5から moshi-kotlin というモジュールが加わったので、それを使わないといけないっぽいです。

[Kotlin’s a great language for JSON – Square Corner Blog – Medium](https://medium.com/square-corner-blog/kotlins-a-great-language-for-json-fcd6ef99256b)

## 対処法

gradleに `compile 'com.squareup.moshi:moshi-kotlin:1.5.0'` を追加し、

```kotlin
val moshi = Moshi.Builder()
        .add(KotlinJsonAdapterFactory())
        .build()
```

としたらうまくいきました。
rbenvでruby2.4.1を入れる(メモ)

# ruby 2.4.1が入らなかった

```bash
$ rbenv install 2.4.1
ruby-build: definition not found: 2.4.1

The following versions contain `2.4.1' in the name:
  rbx-2.4.1

See all available versions with `rbenv install --list'.

If the version you need is missing, try upgrading ruby-build:

  cd ~/.rbenv/plugins/ruby-build && git pull && cd -
```

2.4.1が入らない。
なんでや :angry: :anger: 

```bash
$ rbenv install --list
# 略
2.3.3
2.3.4
# 略
2.4.0
2.5.0 beta
```

インストール一覧に出てこない... :thinking: 

# rbenvをアップデートする

```bash
$ rbenv update
$ rbenv install --list
2.3.3
2.3.4
2.4.0-dev
2.4.0-preview1
2.4.0-preview2
2.4.0-preview3
2.4.0-rc1
2.4.0
2.4.1
2.5.0-dev
```

あった :laughing: 

```bash
$ rbenv install 2.4.1
```

できた :laughing:
VSCodeとReactを使っている時に、EmmetでJSファイル内のHTMLタグを展開する

ありそうでなかったので投稿

VSCodeで`ファイル -> 基本設定 -> 設定`で以下のJSONをいい感じに挿入すると
JS、JSXファイルでVSCode組み込みのEmmetが略語を展開してくれる。（TABキーで展開）

```JSON
{
    "emmet.syntaxProfiles": {
        "javascript": "jsx"
    }
}
```

情報源っぽいの（正確なのが思い出せない・・・）
https://code.visualstudio.com/updates/v1_5#_settings-to-enabledisable-emmet-for-languages
PayPal Sandbox環境でPayPalのアダプティブペイメントAPIを使用して分割支払いを実装しようとすると、エラー「Account not found. Unilateral receiver not allowed in chained payment is restricted (アカウントが見つかりません。チェーン型支払いで許可されていないメールアドレス未登録/未確認の受取人が制限されています)」が出るのはなぜですか?

このエラーは、使用されたメールアドレスがPayPal Sandboxアカウントに関連付けられていないことを示しています。

この問題を解決するには、APIコールの支払い先メールアドレスが、有効なSandboxアカウントに登録されていることを確認してください。メールアドレスは本物ではなくてもかまいませんが、PayPalアカウントとして存在している必要があります。
<br>
PayPalではテクニカルサポートの部署がありますので、何かPayPal実装関連の質問や技術的な質問がありましたら、下記URLで記事を検索してみてください。
https://jp.paypal-techsupport.com/
上記URLの一番下の「お問い合わせ」リンクをクリックしてまたは下記URLをアクセスして質問を送信してください。
https://jp.paypal-techsupport.com/app/ask
PayPal定期支払い設定の使用中、初回の支払いの一部が遅延することがありますが、なぜですか?

定期支払いはバッチジョブで処理され、バッチ処理のタイミングによっては遅延が発生することがあります。取引処理用に関連する設定が選択されると、支払いが行われます。
<br>
PayPalではテクニカルサポートの部署がありますので、何かPayPal実装関連の質問や技術的な質問がありましたら、下記URLで記事を検索してみてください。
https://jp.paypal-techsupport.com/
上記URLの一番下の「お問い合わせ」リンクをクリックしてまたは下記URLをアクセスして質問を送信してください。
https://jp.paypal-techsupport.com/app/ask
PayPal定期請求の更新中に、エラー「Subscription Profiles not supported by Recurring Payment APIs (購読設定は定期支払いAPIではサポートされていません)」が出るのはなぜですか?

基本的な購読ボタンの設定IDは、[GetRecurringPaymentsProfileDetails API](https://developer.paypal.com/docs/classic/api/merchant/GetRecurringPaymentsProfileDetails_API_Operation_NVP/?mark=getrecurringpaymentsprofiledetails)ではサポートされていません。このAPIは、[CreateRecurringPaymentsProfile API](https://developer.paypal.com/docs/classic/api/merchant/CreateRecurringPaymentsProfile_API_Operation_NVP/?mark=createrecurringpaymentsprofile)経由で、エクスプレス チェックアウト(APIベースの決済ソリューション)により作成された、購読または定期支払いのアカウント設定でのみ機能します。

[即時支払い通知(IPN)](https://developer.paypal.com/docs/classic/ipn/gs_IPN/)経由で基本的な購読情報を収集し、自分のデータベースに格納するか、お使いのPayPalアカウントで情報を表示することをおすすめします。
<br>
PayPalではテクニカルサポートの部署がありますので、何かPayPal実装関連の質問や技術的な質問がありましたら、下記URLで記事を検索してみてください。
https://jp.paypal-techsupport.com/
上記URLの一番下の「お問い合わせ」リンクをクリックしてまたは下記URLをアクセスして質問を送信してください。
https://jp.paypal-techsupport.com/app/ask
PayPalでログイン（Login with PayPal）のリダイレクトURLを設定する方法を教えてください。

指定された[redirect_uri](http://developer.paypal.com/docs/rest/api/identity/)の要素は、プロトコル、ホスト、ポート、およびコンテキストパスを含め、すべて、登録されている復帰URLに一致する必要があります。お客さまの復帰URLは、[Developer Portal(デベロッパーポータル)](http://developer.paypal.com/)にログインして、[「My Apps & Credentials (アプリ・認証情報)」](https://developer.paypal.com/developer/applications)ページで確認できます。

アカウントとコードに矛盾があると、Redirect_uriエラーが発生します。変更する場合は、必ずお客さまのアカウントおよびコードで同じ更新を適用してください。値の更新には数時間かかる場合があります。
<br>
PayPalではテクニカルサポートの部署がありますので、何かPayPal実装関連の質問や技術的な質問がありましたら、下記URLで記事を検索してみてください。
https://jp.paypal-techsupport.com/
上記URLの一番下の「お問い合わせ」リンクをクリックしてまたは下記URLをアクセスして質問を送信してください。
https://jp.paypal-techsupport.com/app/ask
PayPal PHP SDKを「Sandboxでの使用」から「本番」に切り替える方法を教えてください。

PayPal PHP SDKを「Sandboxでの使用」から「本番」に切り替える方法は以下のとおりです。
1. 以下の2つの方法のいずれかの方法ｄ、SDKのモードを「live」に設定します。
a.	[Sdk_config.ini](http://github.com/paypal/PayPal-PHP-SDK/blob/master/sample/sdk_config.ini#L24)を使用: 
 ![image](https://www.paypal-knowledge.com/library/PAYPAL/TECHNICAL_SUPPORT/FAQ1992/1sdk_configini.png)
b.	[APIContext](https://github.com/paypal/PayPal-PHP-SDK/blob/master/sample/bootstrap.php#L74)を使用: 
 ![image](https://www.paypal-knowledge.com/library/PAYPAL/TECHNICAL_SUPPORT/FAQ1992/2APIContext.png)  
2. 本番環境の**clientId**と**secret**を有効にします。これは、Sandboxと本番環境では動作が大きく異なるためです。
a.	[デベロッパーポータル](http://developer.paypal.com/)にログインします。
b.	**[Dashboard(ダッシュボード)]**をクリックします。
c.	**「My Apps & Credentials (アプリ・認証情報)」**で、編集するアプリを選択します。
d.	アプリを、**Sandbox**から**Live**に切り替えます。
e.	表示されている本番環境のAPI認証情報を使用して、SDKまたはショッピングカートの認証情報を設定します。
<br>
PayPalではテクニカルサポートの部署がありますので、何かPayPal実装関連の質問や技術的な質問がありましたら、下記URLで記事を検索してみてください。
https://jp.paypal-techsupport.com/
上記URLの一番下の「お問い合わせ」リンクをクリックしてまたは下記URLをアクセスして質問を送信してください。
https://jp.paypal-techsupport.com/app/ask
shellスクリプトではまったところ


まとまったshellscriptを書いて最近はまったところ  
忘れることが多いのでメモ  
  
> **trapは記述した以降の処理しかtrapできない**   

    
時間がかかる処理なんだけど、  
外からkillされた時でもbackupしてほしいとかいう時に使うんですが、  
スクリプトの中にtrapが出る前にkillされたりすると、発動しない  
あたり前といえば当たり前。  
  
```
#!/bin/sh

#処理A 
#ここで exit 1としてもtrapに行かない

trap backup 0 1 9

#処理B ここで exit 1とかやるとtrapされる
```
      
> **複数行のものを引数に与える時は"で囲む**   
  

これも久々に思い出しったって感じ。  
そういえばそーだなーって。  
  

```
#!/bin/sh

list=`ls -la ./`

func $list   #これだと初めの1行しか持って行かれない
func "$list" #全部を処理したい場合はこうする
```
  
> **グローバル、ローカル変数を意識する**   

負債的な感じのながーいshellscriptとかを分割するんだけど  
関数内であっても同じ変数名だとスコープが同じ。  
  

```
#########
#mainA.sh
#!/bin/sh

. ./func.sh

val="test"

funcA val 
echo val #この結果は "A"

#########
#mainB.sh
#!/bin/sh

. ./func.sh

val="test"

funcB val 
echo val #この結果は "test"


##########
#func.sh
#!/bin/sh
funcA(){
  val=$1        #これだとvalを変更すると全部のvalが変更されてしまう。
  val="A"
}

funcB(){
  local val=$1  #localをつけるとスコープが変わる
  val="B"
}
```
DBFlowの使い方(Androidライブラリ)

#○ 事前準備として
##データベース定義クラス作成
```AppDatabase.java
@Database(name = AppDatabase.NAME, version = AppDatabase.VERSION)　//用意されているDatabaseアノテーションを使用する　(*１)
public class AppDatabase {

  public static final String NAME = "AppDatabase";

  public static final int VERSION = 1;
}
```
>(補足)
*1 ここでアノテーションつけてname=データベース名,version=バージョンを指定すると、ビルド時に（クラス名）_Databaseクラスが作成される。

##テーブル定義クラス作成
```User.java
@Table(database = AppDatabase.class)　//用意されているTableアノテーションを使用する(*2)
public class User extends BaseModel{ //用意されているBaseModelを継承しておく

  @PrimaryKey // 少なくとも一つ必要 //　データの更新、削除、追加の時の比較に使用されるはず
  UUID id; 

  @Column　//　カラム定義(PrimaryKeyの場合は省略できる)
  String name;

  @Column(defaultValue = "20")//デフォルト値を設定できる
  int age;

  @Column
  private String nickName; //privateで定義するときは必ずgetterとsetterを用意する。(*3)

  public void setNickName(String nickName) {
    this.nickName = nickName;
  }

  public String getNickName() {
    return nickName;
  }
}
```
>(補足)
*2 ここでアノテーションつけてname=データベース名,を指定すると、ビルド時に<クラス名>_Tableクラスが作成される。
*3 <クラス名>\_Tableでgetterとsetterメソッドが使用される。booleanの場合はis<変数名>とset<変数名>でメソッドの定義をする。


#○ 使用例
```
User user = new User();
user.id = UUID.randomUUID();
user.name = "Andrew Grosner";
user.age = 27;

// BaseModelを継承しているテーブルなら、これらのメソッドが使用可能になる
user.insert(); //DBにデータ追加
user.update(); //DBのデータ更新
user.delete(); //DBのデータ削除
user.save(); //DBにデータ追加,存在していたらデータ更新

// select文
List<User> users = SQLite.select()
                    .from(User.class)
                    .where(User_Table.age.greaterThan(18))
                    .queryList();
```

(参考資料)
https://agrosner.gitbooks.io/dbflow/content/	公式HP
http://chocolattips.hatenablog.com/entry/2017/01/31/000000 【Android】DBFlowの基本的な使い方
PayPal Sandbox環境へのPayPalアダプティブペイメントAPIコールを作成しようとして、エラー「認証に失敗しました。API認証情報が間違っています」が出るのはなぜですか?

このエラーは、お客さまが、APIテスト用認証情報の代わりに、SandboxのAPI認証情報を使用していることを示しています。

この問題を解決するには、PayPal SandboxアカウントからAPI認証情報を使用する必要があります。以下の手順を参照して行ってください。

1. [PayPalアカウント](https://www.paypal.com/)にログインします。
2. [API署名](https://www.sandbox.paypal.com/us/cgi-bin/webscr?cmd=_profile-api-signature)にアクセスします。
3. 次のAppIDを入力してください:APP-80W284485P519543T

サンプルのAPI認証情報とアダプティブペイメントのサンプルアプリケーションを使用していない場合は、REST APIアプリケーションではなく[Classic APIアプリケーションを作成する](https://www.paypal-knowledge.com/infocenter/index?page=content&id=FAQ1633&expand=true&locale=en_US)必要があります。

アダプティブペイメントAPIコールを行う場合は、[Making Your First Call(初回コールの実行)](https://developer.paypal.com/docs/classic/adaptive-payments/gs_AdaptivePayments/#call)を参照してください。
<br>
PayPalではテクニカルサポートの部署がありますので、何かPayPal実装関連の質問や技術的な質問がありましたら、下記URLで記事を検索してみてください。
https://jp.paypal-techsupport.com/
上記URLの一番下の「お問い合わせ」リンクをクリックしてまたは下記URLをアクセスして質問を送信してください。
https://jp.paypal-techsupport.com/app/ask
MBP(Late 2016)上のVMware Fusion 8でVMがBlackOutして苦労した話

# 状況の簡単な説明
MBP(Late 2016)上のVMware Fusion 8で仮想マシンにRancherOSをインストールしようとしたら、画面が真っ黒でCDROM（ISO）から起動できない！（コンソール見えない！）って状況に陥ってしまった。

<img width="832" alt="スクリーンショット 2017-05-17 16.17.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/35591/2c4c5fe7-d89d-6af1-e283-2f494aa0bb09.png">

調べたところIntel GPUとドライバ周りの問題みたいで、Intel GPUのレンダリングに関するオプションをvmxファイルに書き込むことで改善できた。

# 環境
- **Hardware**
  - Macbook Pro 13inch Late 2016 (with Touch Bar)
- **Software**
  - macOS Sierra 10.12.4
  - VMware Fusion 8.5.6
  - ISO for VM : [RancherOS 1.0.1](https://releases.rancher.com/os/v1.0.1/rancheros.iso)

# 対応内容の要約
作成した仮想マシンのvmxファイルをエディタで開き、次の1行を追記してからファイルを保存し、そのあと仮想マシンを起動する。

`mks.enableGLBasicRenderer = "FALSE"`

<img width="832" alt="スクリーンショット 2017-05-17 16.19.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/35591/0d1132de-6dd9-e0ea-6c4d-3cbf6808e61a.png">

# 詳細
RancherOSを新規でインストールしたいと思って、ISOファイルをダウンロードして、新規VMを作成したが起動で失敗してしまった。

正確にいうと、起動エラーが出るわけではなくVMのコンソール画面が真っ黒でなにも表示されない状態になってしまう（画面が出ないのでフリーズしてしまったと最初は思っていた）。

別に所有していたMBP Mid 2013で試したところ、同じバージョンのVMware Fusionで同じバージョンのRancherOSが起動した。これは個別環境の問題かな？と思い、VMware Fusionの再インストールやISOのmd5チェックサム確認、macOSのユーザ切り替えなどを一通り試したが全て効果なし。

ここでGoogle先生に頼り検索してみたが有益な情報はあまり見つからない。RancherOSが起動しないって話は海外のサイトにはいくつか投稿されているのだが、どれもBoot自体は成功しているみたいで自分の状況には当てはまらないものばかりだった。

色々キーワードを変えながら検索を繰り返したところ、最終的にVMwareコミュニティで同じ環境（MBP Late 2016/macOS 10.12.4/VMware Fusion 8.5.6）で同様の問題に直面したという投稿をすることができた。

対応内容は上記の要約の通り。

このオプションのことを調べると、あまり詳細な情報は見つからなかったんだが、どうもIntel GPUを使用する環境で起動しようとしてるOSがVer1.2以前のIntel VA-APIドライバを使用しようとしている時に必要となるオプションのようだった（このへんはあまり私自身がGPU周りに詳しくないので十分に理解できていない・・・）。

`Macbook Pro 13inch Late 2016 (with Touch Bar)`はグラフィックに`Intel Iris Graphics 550`を使用しているが、一部のOSではこのGPU環境で使用するのに明示的に`mks.enableGLBasicRenderer`を`False`にしないといけない場合がある・・・のだろうと認識している。

尚、vmxファイルは仮想マシンの編集（設定変更）などにより上書きされてしまうことがあるので注意が必要である。

# 参考

- [VMware Fusion black screen on boot | VMware Comminities](https://communities.vmware.com/thread/560746)
  - この問題の解決方法の元ネタ 
- [VMware Fusion 仮想マシンの .vmx ファイルの編集 (2078678) | VMware Knowledge Base](https://kb.vmware.com/selfservice/microsites/search.do?language=en_US&cmd=displayKC&externalId=2078678)
  - vmxファイルの編集方法 
- [VMware Horizon Client for Linux の 使用 | Horizon Client 4.4](https://www.vmware.com/content/dam/digitalmarketing/vmware/ja/pdf/horizon-client-linux-44-document.pdf)
  - mks.enableGLBasicRendererについての参考情報
PayPal[購読]ボタンのしくみを教えてください。

**定期支払い - 購読ボタン**の作成および使用に関する詳しいガイドは、[ここ](https://developer.paypal.com/webapps/developer/docs/classic/paypal-payments-standard/integration-guide/subscribe_buttons/)をクリックしてご覧ください。このガイドでは、購読ボタンのさまざまな機能を説明しており、多数の例やシナリオも提供しています。  
**PayPalペイメント スタンダード**とお客さまのECサイトまたはECアプリケーションとの統合(インテグレーション)に関するガイドは、[ここ](https://developer.paypal.com/webapps/developer/docs/classic/paypal-payments-standard/integration-guide/wp_standard_overview/)をクリックしてご覧ください。
<br>
PayPalではテクニカルサポートの部署がありますので、何かPayPal実装関連の質問や技術的な質問がありましたら、下記URLで記事を検索してみてください。
https://jp.paypal-techsupport.com/
上記URLの一番下の「お問い合わせ」リンクをクリックしてまたは下記URLをアクセスして質問を送信してください。
https://jp.paypal-techsupport.com/app/ask
（PayPal）ホスト型ボタンをSandboxから本番環境に移行する際に注意することを教えてください。

Sandboxから本番環境に移行する際は、本番環境のPayPalサイトで新しいホスト型ボタンを作成する必要があります。これにより、ボタンの hosted_button_idの値が正しく設定されます。
PayPalペイメントスタンダードでは、PayPalのサイトでボタンを作成し、保存することができます。これらのホスト型ボタンには、隠れ変数の hosted_button_idがあり、値に数値を持ちます。このID番号は、マーチャント、デベロッパーが作成した特定のボタンを指しています。また、このIDは、特定のPayPalアカウントに固有です。
暗号化されていないボタンのコードは以下のとおりです。business変数の行は、PayPalシステムが、支払いを入金するPayPalアカウントを決定する方法を示します。以下の例で、お客さまの業務用メールアドレスが、本稼働のPayPalアカウントのメールアドレスであり、Sandboxアカウントのメールアドレスではないことを確認してください。

```
<form action="https://www.paypal.com/cgi-bin/webscr" method="post" target="_blank">
   <input type="hidden" name="cmd" value="_cart">
   <input type="hidden" name="business" value="seller@business.com">
   <input type="hidden" name="item_name" value="testing_handling">
   <input type="hidden" name="item_number" value="test">
   <input type="hidden" name="amount" value="0.01">
   <input type="hidden" name="handling" value="0.01">
   <input type="hidden" name="shipping" value="0.01">
   <input type="hidden" name="lc" value="US">
   <input type="hidden" name="bn" value="PP-BuyNowBF">
   <input type="image" src="btn_buynow_LG.gif" border="0" name="submit" alt="PayPal - The safer, easier way to pay online!">
      <img alt=" border="0" src="pixel.gif" width="1" height="1">
   <input type="hidden" name="add" value="1">
</form>
```

以下にホスト型ボタンのコードを示します。

```
<form target="paypal" action="https://www.paypal.com/cgi-bin/webscr" method="post">
   <input type="hidden" name="cmd" value="_s-xclick">
   <input type="hidden" name="hosted_button_id" value="353581">
   <input type="image" src="https://www.paypal.com/en_US/i/btn/btn_cart_LG.gif" border="0" name="submit" alt=">
      <img alt=" border="0" src="https://www.paypal.com/en_US/i/scr/pixel.gif" width="1" height="1">
</form>
```

以前は、デベロッパーがSandbox環境でボタンを作成し、それらのボタンを自分のウェブサイトや環境で本稼働させる場合は、HTMLフォームのアクションの値をhttps://www.sandbox.paypal.com/cgi-bin/webscr からhttps://www.paypal.com/cgi-bin/webscr へ変更するだけでした。Sandboxで別のメールアドレスを使用した場合も、本稼働の準備ができたときにこの値を更新する必要がありました。
しかし、Sandboxで作成されたホスト型ボタンについては、 hosted_button_id の値が、本番環境のPayPalサイトで作成されたボタンと必ずしも同じであるとは限りません。お客さまの実装環境で本稼働させる準備ができましたら、本番環境のPayPalサイトで、新しいホスト型ボタンを作成する必要があります。
これを行わないと、本稼働環境での支払いが別のPayPalアカウントに入金されてしまいます。また、 hosted_button_id の値が本番サイトのデータベースで検出されない場合は、買い手がボタンをクリックした際にエラーが発生する可能性があります。

<br>
PayPalではテクニカルサポートの部署がありますので、何かPayPal実装関連の質問や技術的な質問がありましたら、下記URLで記事を検索してみてください。
https://jp.paypal-techsupport.com/
上記URLの一番下の「お問い合わせ」リンクをクリックしてまたは下記URLをアクセスして質問を送信してください。
https://jp.paypal-techsupport.com/app/ask
PayPal決済ボタンに使用されている「charset」とは何ですか?また、サポートされている文字セットも教えてください。

ボタンフォームフィールドを使用して拡張ASCII文字をPayPalに渡す場合は、文字エンコーディングを識別する「charset」フォーム変数を含める必要があります。これにより、お客さまのデータが正しく読み取られ、同じエンコーディングで応答が戻されます。
PayPalは、次の文字セットをサポートしています。

- Big5 (台湾の繁体中国語)
- EUC-JP
- EUC-KR
- EUC-TW
- gb2312 (簡体中国語)
- gbk
- HZ-GB-2312 (香港の繁体中国語)
- ibm-862 (ユーロ記号付きヘブライ語)
- ISO-2022-CN
- ISO-2022-JP
- ISO-2022-KR
- ISO-8859-1 (西ヨーロッパ言語)
- ISO-8859-2
- ISO-8859-3
- ISO-8859-4
- ISO-8859-5
- ISO-8859-6
- ISO-8859-7
- ISO-8859-8
- ISO-8859-9
- ISO-8859-13
- ISO-8859-15
- KOI8-R (キリル文字)
- Shift_JIS
- UTF-7
- UTF-8
- UTF-16
- UTF-16BE
- UTF-16LE
- UTF16_PlatformEndian
- UTF16_OppositeEndian
- UTF-32
- UTF-32BE
- UTF-32LE
- UTF32_PlatformEndian
- UTF32_OppositeEndian
- US-ASCII
- windows-1250
- windows-1251
- windows-1252
- windows-1253
- windows-1254
- windows-1255
- windows-1256
- windows-1257
- windows-1258
- windows-874 (タイ)
- windows-949 (韓国)
- x-mac-greek
- x-mac-turkish
- x-mac-centraleurroman
- x-mac-cyrillic
- ebcdic-cp-us
- ibm-1047

 
注: 上記の文字セットのいずれかを使用している場合、場合によってはPayPalアカウントにログインしてボタンのエンコーディング言語を変更する必要があります。ボタンのエンコーディング言語を変更するには、以下の手順を行ってください。
1. [ここ](http://www.paypal.com/)をクリックしてPayPalアカウントにログインします。
2. **[アカウント設定]**をクリックします。
3. **[販売ツール]**をクリックします。
4. **[PayPalボタンの言語コード化]**をクリックします。
5. **[その他のオプション]**をクリックします。
6. **エンコーディング言語**を選択します。
7. **[保存]**をクリックします。
OS基礎の基礎をまとめてみた。

#何故書いたのか
OSの歴史を課題として出されたのだが、その前にまずOSって具体的にどんな構成で成り立っているのか、そもそも有名所ってどこがあったっけと言ったスーパー初歩的疑問点がわんさかとあったので軽くまとめてみました。

# OSとは
##OSの定義
 OSとはオペレーティングシステム（OperationSystem）の事。
 PCすべてのハードとソフトを管理し、利用者が利用しやすいようにサービスしてくれるソフトを指しています。
##OSはハードウェアを操作している
OSは、普段当たり前だと思う機能を提供しています。
たとえば、

- キーボードから文字を入力すると、入力した文字が画面に表示される。
- マウス・タッチパッドなどで画面を操作できる。
- イヤフォンを指すと、イヤフォンから音が聞こえる。

などです。

人間に例えると、 **パソコン本体は「体」**で、 **OSは「脳」の役割** を果たしています。

具体的に言うとOSは司令塔の役割をしていて、CPU、メモリ、ハードディスク、ディスプレイ、キーボード、周辺装置に至るまで、パソコンに入っているすべてのハードウェアを管理しています。

なので、「OSの入っていないパソコンはパソコンじゃない！」といわれるらしいです。

ていうか、そもそもハードウェアそれぞれの役割は以下の画像がすごくわかりやすく説明していたので、載せておきます。

![ハードウェアまとめ.png](https://qiita-image-store.s3.amazonaws.com/0/130302/0fcd7c6c-e3db-ed94-c097-c67544d90123.png "ハードウェアまとめ.png")

PC買うときに必須の知識だ。

これらに対して司令を出しているというわけですね。

##OSの構成
ここからはOSの構成についての概要を説明していきます。

では、具体的にどのようなOSで構成されているのでしょうか。

箇条書きで書いて見ると、

- ブートローダー
- カーネル
- デーモン
- シェル
- デスクトップ環境
- アプリケーション

と言ったようになっています。

これらへの理解が「OSへの理解」へと繋がり、ひいては「コンピュータの理解」へと繋がるとのこと。

では、一つ一つ概要を記入していく。

##ブートローダー(boot loader)
 **コンピュータを起動したときによびだされて(boot)、OSとかを動かす仕事(load)をしているプログラムのこと。** 

イメージは眠っているOSを叩き起こすお仕事をしている目覚まし役。

電源入れてからOS起動までの流れ的には、

電源投入
↓
BIOS起動
↓
ブートローダー起動
↓
OS起動

参考：http://wa3.i-3-i.info/word15558.html


##カーネル
 **OSの中核部分として頑張っているソフトウェア**
 
ちょっと具体的に言うと、ソフトウェアとハードウェアの仲立ちをしている。
たとえば、ハードウェアといえばCPU、メモリ、ハードディスクなどあるが、これらをソフトウェアが直接イジクルのではなくて、カーネルが代わりにやってくれている。

他にも

- プロセス管理
- 空間管理
- 時間管理
- 割り込み処理
- ファイルシステム
- ネットワーク

などの役割も担っているOSの中核となるソフトウェアなのです。

参考：http://wa3.i-3-i.info/word15.html

##デーモン
**メモリ上で「さぁ、いつでもかかってこい」と待機している常駐プログラムのUNIX系OSにおける呼び名**

「デーモン」の呼び名は「悪魔(demon)」の意味ではなく「守護神(daemon)」の意味から来るなんちゃっていいやーつ。

WindowsOSでは、「サービス」がUnix系OSにおける「デーモン」となる。

参考：http://wa3.i-3-i.info/word11000.html

##シェル
**人間からの入力をコンピュータに伝えるプログラムのこと。わかりやすく言うと、「コマンドプロンプト」や「ターミナル」のこと。**

ソフトウェアからの司令は直接カーネルが受けることができるが、人間からの司令はシェルを通してカーネルにお願いしないといけない。

そのカーネルと人間の翻訳をおこなっているのがシェルとなっている。

参考：http://wa3.i-3-i.info/word11219.html

##デスクトップ環境
**名前の通りデスクトップを提供してくれるソフトウェア**

画面を見ながら、簡単にファイルを操作したり設定を変えたりすることができるのはこのソフトウェアのおかげ。

一般ユーザーにとって、一番使いやすくしてくれているソフトウェアなのだと。

##アプリケーション

OSはアプリケーションなしでは基本的な機能しか提供していないため、**一般のユーザーが使いやすいように様々なソフトウェアがセット**になっています。

例えば、ファイル管理、ブラウザ、各種設定、メールなどの標準アプリケーションなどです。

#OSの有名所
##Windows
Microsoft社が開発したOS。
世界で一番ユーザーの多いOS。
Windows95、98、Me、2000、XP、Vista、XP、7、8、8.1、10
の順でアップデートし続けている。

##MacOS
Apple社の開発したOS。
GUIの元祖。
「Mac OS X」からはUnixをベースに開発されているのでUnixとは親戚関係にある。

##DOS
1980年に登場した最も古いOS。
「コマンドプロンプト」をシステムに採用している。
ディス・オペレーティング・システムの略であり、HDDの使用を前提として開発された。
現在ではwindowsの一機能としてMS-DOSノカタチで残っている。

##UNIX
1969年にAT&T社が開発した無料のOS。
オープンソース化されており、その流れの中で様々な派生OS（LinuxやFreeBSD）が生まれている。

##Linux
UNIXのベースを参考に１から作り出されたOS。
1から作り出されたといえど、OSの深部まで行かないとその違いはほぼに当たらないらしい。
特にコマンドなどもUNIXとほぼおなじのよう。
このOSをもとにUbuntu、CentOS、MacOS Xなどつくられている。
これらはLinux系OSとよばれている。

##Ubuntu
Linuxをベースに開発されたOS。
2004年から無償で提供されている。