OmniAICreator/Qiita-1.07M huggingface dataset:
Dockerイメージ作成してみた 1  CentOSにTomcatをインストールする。

Dockerイメージを作成します。CentOSにTomcatを入れたコンテナをDockerイメージとして登録したときの備忘録です。


CentOSのコンテナ起動
---
下記コマンドで起動します。

```
//Dockerコンテナ起動
$ docker run -it -d -p 18080:8080 -v /Users/XX/Documents/docker/TestWeb1 --name tomcat centos
Unable to find image 'centos:latest' locally
latest: Pulling from library/centos
8ba884070f61: Pull complete 
Digest: sha256:b5e66c4651870a1ad435cd75922fe2cb943c9e973a9673822d1414824a1d0475
Status: Downloaded newer image for centos:latest
4cc4cac67447d9a7d83712b1d04b1f58da192e04e761f1bbaeec51c37996efb8

//コンテナ起動確認
$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                     NAMES
4cc4cac67447        centos              "/bin/bash"         21 seconds ago      Up 19 seconds       0.0.0.0:18080->8080/tcp   tomcat

```

起動したCentOSのコンテナにTomcatをインストール
---

1.ローカルにトムキャットをダウンロード(curlコマンドを利用)

```
$curl -o http://www-eu.apache.org/dist/tomcat/tomcat-9/v9.0.6/bin/apache-tomcat-9.0.6.tar.gz

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   256  100   256    0     0    305      0 --:--:-- --:--:-- --:--:--   306

```

2.コンテナ(CentOS)にローカルPCにダウンロードしたTomcatをコピー

```
$docker cp apache-tomcat-9.0.6.tar.gz tomcat:/opt/
(docker cp <ホスト側のファイル> <コンテナ名>:<コンテナ内のコピー先ディレクトリ>)
```
※コンテナ(CentOS)からCurlすることも可能だが、今回はローカルからコピー

3.コンテナ(CentOS)にログインしTomcatをインストール

```
$docker exec -it tomcat bash //コンテナにログイン
--以下コンテナでの操作
# yum install -y java //javaインストール
# cd /opt/ 
# tar zxf apache-tomcat-9.0.6.tar.gz
# cd apache-tomcat-9.0.6
# ./bin/startup.sh //Tomcat起動
```

4.tomcat起動確認
ブラウザでローカルホストを接続：http://localhost:18080/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319276/aff52e96-2843-ccd2-270d-6acd8534b037.png)
**起動出来てた！！**


続きは別の記事で説明します。


参考URL
---
https://knowledge.sakura.ad.jp/14427/
時刻を扱うLinuxの標準ライブラリの関数についてのメモ

CTIME(3)にある一部関数についての備忘録

# 使用する型と構造体

## time_t型

unixtimeを入れる型。
私の環境では８バイトの整数型で実装されている模様。

## tm構造体

```C
struct tm {
    int tm_sec;    /* Seconds (0-60) */
    int tm_min;    /* Minutes (0-59) */
    int tm_hour;   /* Hours (0-23) */
    int tm_mday;   /* Day of the month (1-31) */
    int tm_mon;    /* Month (0-11) */
    int tm_year;   /* Year - 1900 */
    int tm_wday;   /* Day of the week (0-6, Sunday = 0) */
    int tm_yday;   /* Day in the year (0-365, 1 Jan = 0) */
    int tm_isdst;  /* Daylight saving time */
};
```

# 使用する関数

## char *ctime(const time_t *timep)

time_t型の値を受けとって、それに対応するローカルタイムの文字列表現を返す。

#### 例

```C
#include <stdio.h>
#include <time.h>

int main(int argc, char *argv[]) {
    time_t now = time(NULL);
    printf("%s", ctime(&now));
}
```
出力

```
Sun May 19 20:23:47 2019
```


## struct tm *gmtime(const time_t *timep)

time_t型の値を受け取って、それに対応するUTCのtm構造体のポインタを返す。
#### 例

```C
#include <stdio.h>
#include <time.h>

int main(int argc, char *argv[]) {
	time_t now = time(NULL);
	struct tm *hoge = gmtime(&now);
	printf(
			"%d-%d-%d %d:%d:%d\n",
			hoge->tm_year+1900,
			hoge->tm_mon+1,
			hoge->tm_mday,
			hoge->tm_hour,
			hoge->tm_min,
			hoge->tm_sec
	);
}
```

出力

```
2019-5-19 14:39:29
```

## struct tm *localtime(const time_t *timep)

time_t型の値を受け取って、それに対応するローカルタイムのtm構造体のポインタを返す。
#### 例
```C
#include <stdio.h>
#include <time.h>

int main(int argc, char *argv[]) {
	time_t now = time(NULL);
	struct tm *hoge = localtime(&now);
	printf(
			"%d-%d-%d %d:%d:%d\n",
			hoge->tm_year+1900,
			hoge->tm_mon+1,
			hoge->tm_mday,
			hoge->tm_hour,
			hoge->tm_min,
			hoge->tm_sec
	);
}
```

出力

```
2019-5-19 23:45:2
```

## char *asctime(const struct tm *tm)

tm構造体のポインタを受け取って、それに対応する時刻の文字列表現を返す。

#### 例
```C
#include <stdio.h>
#include <time.h>

int main(int argc, char *argv[]) {
	time_t now = time(NULL);
	printf("%s", asctime(localtime(&now)));
}
```
出力

```
Sun May 19 20:23:47 2019
```

## 参考
CTIME(3)のmanページ
【蟻本】部分和問題 p.34 をPython3で書いてみた

プログラミングコンテストチャレンジブック（通称蟻本・アリ本）のp.34の部分和問題をPython3で書いてみました。

```Python
def main():
    n = int(input())
    a = list(map(int, input().split()))
    k = int(input())

    # i まででsumを作って、残り i 以降を調べる
    def dfs(i, sum_):
        if i == n:
            return sum_ == k

        # a[i]　を使わない場合
        if dfs(i + 1, sum_):
            return True

        # a[i] を使う場合
        if dfs(i + 1, sum_ + a[i]):
            return True

        # a[i] を使う使わないに拘らずkが作れないのでFalseを返す
        return False

    def solve():
        if dfs(0, 0):
            print('Yes')
        else:
            print('No')
            
    solve()
main()
```
VBAでPL/SQLのPackageを解析する【作成中】

自分用メモです。
現状、コメントを取り除いた文字列をデバッグ出力するだけのサンプルになっています。
加筆していきます。


```vb:PK_ANALYZE.vb
Option Explicit

Enum LineStatus
    OutOfPackage
    InOfPackage
    InOfPF
    InOfPFBegin
    InOfBlockComment
End Enum

Enum PackageType
    Package
    PackageBody
End Enum


Sub PK_ANALYZE()
    Dim FSO As New FileSystemObject
    Dim TSRead As TextStream
    Dim TSWrite As TextStream
    Dim SqlNameRead As String
    Dim SqlNameWrite As String
    Dim TargetLine As String
    Dim TempString As String
    Dim LStatus As LineStatus
    Dim TStatus As LineStatus ' ブロックコメント直前の状態を保存
    
    SqlNameRead = "C:\Sample\PKG_TESTB.sql"
    SqlNameWrite = "C:\Sample\PKG_TESTB_.sql"
    
    Set TSRead = FSO.OpenTextFile(SqlNameRead, ForReading)
    Set TSWrite = FSO.OpenTextFile(SqlNameWrite, ForWriting, True)
    
    Debug.Print "----------"
    
    Do While Not TSRead.AtEndOfStream
        TargetLine = TSRead.ReadLine
        TempString = TargetLine
        
        
        ' ブロックコメント外の場合、判定から行コメントを取り除く
        ' 下記パターンは考慮しないものとする
        ' /*
        '  *  BLOCK COMMENT
        '  */ STATEMENT -- COMMENT
        If (LStatus <> InOfBlockComment) And (InStr(TempString, "--") > 0) Then
            TempString = Left(TempString, InStr(TempString, "--") - 1)
        End If
        
        
        ' ブロックコメント内でブロックコメント末尾を発見した場合はそこまでをブロックコメントとする
        If LStatus = InOfBlockComment Then
            If InStr(TempString, "*/") > 0 Then
                TempString = Right(TempString, Len(TempString) - InStr(TempString, "*/") - 1)
                LStatus = TStatus
            Else
                TempString = ""
            End If
        End If
        
        Do While (LStatus <> InOfBlockComment) And (InStr(TempString, "/*") > 0)
            If InStr(InStr(TempString, "/*"), TempString, "*/") > 0 Then
                ' ブロックコメント外で途中にブロックコメントがある場合は取り除く
                TempString = Left(TempString, InStr(TempString, "/*") - 1) & Right(TempString, Len(TempString) - InStr(InStr(TempString, "/*"), TempString, "*/") - 1)
            Else
                ' ブロックコメント開始だけがあった場合は、そこまでを判定対象とする
                TempString = Left(TempString, InStr(TempString, "/*") - 1)
                TStatus = LStatus
                LStatus = InOfBlockComment
                Exit Do
            End If
        Loop
        
        Debug.Print TempString
        
        
        Select Case LStatus
        ' パッケージ外
        Case LineStatus.OutOfPackage

        Case LineStatus.InOfPackage
        
        Case LineStatus.InOfPF
        
        Case LineStatus.InOfPFBegin
        
        Case LineStatus.InOfBlockComment
        
        End Select
        TSWrite.WriteLine TargetLine
    Loop
    
    TSRead.Close
    TSWrite.Close
    
    Set TSRead = Nothing
    Set TSWrite = Nothing
End Sub
```
ログイン時に環境情報を表示したい！！【備忘録】

初心者エンジニアの備忘録です。

# 概要
teratermでログインした時に環境の情報が一目で分かるようにしたかったので、調べて、実行したことをまとめました。

# 手順
### ①/etc/motdを編集
/etc/motdを編集する。

```
vi /etc/motd
```

必要な情報を書く。

### ②ログインする
teratermを開きなおす。
次のように書いた内容が表示される。

```
Last login: Sun May 19 23:41:41 2019 from 192.168.10.3
##################################
必要な情報を書く!!

##################################
[root@localhost ~]#
```
Unityの学習にはYouTube検索も活用すると良い理由

## Unityの学習にはYouTube検索も活用すると良い理由
プログラミングで分からないことがあった場合Web検索をするのが普通だと思います。

しかし、Unityをやっていて分からないことがあった場合はYouTubeで検索してみるのもとてもおすすめです。

理由はUnityではGUI操作の割合がコーディングに対して同じくらい必要となるからです。（もちろん場合によりますが）

テキストでGUI操作を理解するのは少し効率が悪いです。
ぜひYouTubeも活用してみてください。
## 終わりに
私は現在、Web3のサービスの開発をしています。詳しくはこちらの記事をご覧下さい。
        [無料でイーサリアムが当たる、Web3時代の寄付サイトを作った話](https://note.com/kenroda/n/n814347fbdcd7)
プログラミング初心者必見！クライアントサイドプログラムとサーバーサイドプログラムの違いとは？

今回の記事は、プログラミング初心者の方のために、クライアントサイドプログラムとサーバーサイドプログラムの違いと、Webに関する基本的な用語について説明していきます。

####クライアントサイドプログラムとサーバーサイドプログラムの違い

クライアントサイドプログラムとサーバーサイドプログラムの違いは、そのプログラムがブラウザ上で動作するのか、それともサーバー上で動作するのかということです。

* クライアントサイドプログラム

クライアントサイドプログラムはWebブラウザ上で動作するプログラムです。このプログラムを作るために使われるプログラミング言語としては、javascriptやCSSがあります。これらはクライアントサイドの言語とも言われ、これらで書かれたプログラムの部分はwebサーバーから結果がブラウザに返ってきて、ブラウザ側で処理するときに動作します。

* サーバーサイドプログラム

サーバーサイドプログラムはWebサーバー上で動作するプログラムです。このプログラムを作るために使われるプログラミング言語としては、PHP,Python,Rubyがあります。これらはサーバーサイドの言語とも言われ、これらで書かれたプログラムの部分はwebサーバーで処理するときに動作します。


####Webに関する基本的な用語
* webページとは

webページとは、情報を1枚のページにまとめ、インターネット上で公開している文書のことです。簡単にいうと、1ページごとにブラウザーで表示されている画面のことです。

* webサイトとは

webサイトとは、webページをまとめたものです。
例えば、住宅会社のwebサイトなら、
1,トップページ
2,企業紹介ページ
3,施工内容
4,お問い合わせページ
などと、住宅会社に関する情報を種類ごとにページを分けて、成り立っています。
つまり、複数のwebページを関連づけて集めたものがwebサイトということです。
また、webサイトは略してサイトとよばれたり、ホームページとも呼ばれます。


* Webサーバーとは

Webサイトを表示するために必要となる情報を格納しておく場所のことです。
普段Webページ（もしくはサイト）を見るときに、ユーザはブラウザ(Internet Explorer、Google Chrome、Safari 、Firefoxなど)を使用し、「このwebページ（もしくはサイト）を見たい」というリクエストを送ります。ブラウザからリクエストが送られると、Webサーバは、サイトの表示に必要なデータ（レスポンス）をブラウザに送り返します。

* web開発とは

webサイトを訪れた人に何かしらの便利な機能を提供するwebサービス（webシステム）を開発することです。
Webサービスの例としては、FacebookやtwitterのようなSNSや口コミ情報が集まっているサイトやAmazonなどのECサイト、GoogleやYahooなどの検索サイトが挙げられます。
Jetson Nanoで遊ぶためのコスト

# はじめに

Jetson Nanoを購入したため金銭的および時間的なコストを紹介する。

# 金銭的なコスト

経験上、あまりコスト削減すべきでないのは「電源」と「SDカード」である。

電源をケチると電力が足らずに不安定になり万病の元である。公式ページに推奨は5V,2Aの電源と書かれていたが、モジュールを追加することを考えると最低3Aはあったほうが良い。実際にワットチェッカーでサンプル動作時に計測すると10Wを超えることがある(無線LAN+カメラ付き)。

SDカードは容量と速度に注目。スワップ領域の作成や各種データを置くことを考えると最低32GBは必要となる。速度が遅いとすべての作業がそのまま遅くなるためV90対応のもの(転送速度90MB/s)を探したが数万円することから断念した。消耗品であることも考慮して5000円未満のものを探し最終的にV30対応の128GBとした。

電源タップは新たに購入した。差し込み口の余裕は心の余裕である。電源を指す場所がないと都度探すことになり作業が中断してしまう。最近では三端子の電源口に加えてUSBによる給電も増えているので、Jetson Nano専用にタワー型電源タップを用意した。

ワットチェッカーは電力確認用として持っておくのは便利。万が一15Aを超えるようなことがあれば別の電源を購入する予定である。

| 品名                                 | 価格     | 備考 |
|--------------------------------------+----------|----|
| Jetson Nano                          | 14,472円 | |
| Jetson Nano用金属ケース | 3,799円 | 2019年6月10日 |
| ~~Raspberry PI用電源セット (5V 3.0A)~~   |  1,580円 | |
| ACアダプター(5V 4.0A)   |  1,580円 | 2019年6月10日|
| microSDXC 128GB UHS-1 U3 V30           |  3,980円 | |
| 7インチ Raspberry Pi用タッチモニター |  8,960円 | |
| 電源タップ タワー式 ACx8個 USBx4個   |  3,760円 | |
|キーボード (トラックポイント付き) | 0円(流用) |
|無線LAN (バッファロー WLI-UC-G301N) | 0円(発掘) |
|~~無線LAN~~ | 3,024円 | 安定しないので取り外し |
|~~FAN (Noctua NF-A4x20 PWM)~~ | 2,660円 |  購入ミス |
| FAN (Noctua NF-A4x20 5V PWM) | 2,792円 |  2019年6月16日 |
| ネジ M3x15mm (FAN取り付け用) | 496円 | 2019年6月16日|
|ワットチェッカー | 0円(発掘) |
|カメラ(Logicool C920)| 0円(流用) | |
| ~~合計~~ | ~~32,752円~~ | 2019年5月19日現在 |
| ~~合計~~| ~~38,932円~~ | 2019年6月4日現在 | 
| ~~合計~~| ~~44,311~~円 | 2019年6月8日現在 | 
| 合計| 47,103円 | 2019年6月16日現在 | 

~~またこの後買ったほうが良いと思っているのは無線LANとFAN。古い無線LANは通信速度が遅い&電力増加の主原因であり、またFANに関しては一度熱くなりすぎてシャットダウンしたため夏を越すために必要と考えている。~~ 2019年6月4日にFANと無線LAN(ドングル)が届いた。FANはネジを購入するのを忘れてお預け状態。無線LAN(ドングル)は不安定なので取り外し(6/5)。そろそろノートPCが買える金額に近づいた(6/8)。FANを間違えて12V PWMを購入したため再度5V PWMを購入(6/16)。


なおランニングコストはワットチェッカーを信じるならば今のところ1日あたり数円程度。1ヶ月経過して52.50円(6/23)。

# 時間的なコスト

無線LANに使ったモジュールが古いためか、あるいはクロックを上げていないせいか現時点では切り分けできていないが、とにかくネットワークの通信速度が遅い(100〜200kB/s)。そのため導入直後のパッケージのアップデート(`sudo apt update`後に `sudo apt upgrade`)に時間を要した。最終的にセットアップに要した時間は下記の通り。

| 項目 | 時間 |備考|
|-----+-----+----|
| 配線 | 10分 ||
| イメージダウンロード | 約30分 |JetPack 4.2|
| イメージ書き込み | 約35分 |balenaEtcherを使用|
| 起動 | 3分 ||
| 起動後設定 | 10分 ||
| パッケージ更新 | 数時間 |apt upgrade|
| その他インストール | 数時間 | Tensorflow, PyTorch etc.|

実際には上記の作業を数回繰り返している。これは自分のこだわりのせいだが、以下のような信念を持つ人はたぶん同じことになるので注意。

- `apt-get`と`pip3`を混同させたくない人
- 非公式レポジトリでパッケージ管理を不安定にさせたくない人
- `pip3 install`に`sudo`を使いたくない人
【Unity】 キャラクターのポーズ編集用エディター拡張

<p class="youtube"><iframe width="560" height="315" src="https://www.youtube.com/embed/-SawrAFcilc" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></p>



<!--
https://qiita.com/sator_imaging/items/9355378607157da67286
-->


Unity で DCC ツールっぽいスケルトンを表示して、キャラクターのポーズが編集できるようになるエディター拡張。


<!--more-->


Maya 使えます、だけどポーズは Unity でずっと付けてきました IK ないんですかね？？ と言われ…


Maya とか Unity とか、良い感じでやっといて下さい。だと上手くいかないことが多いですね、思ったよりも。勉強になります。


申請が通ればアセットストアに並びます。



<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">ポーズエディター説明書 <a href="https://twitter.com/hashtag/unity3d?src=hash&amp;ref_src=twsrc%5Etfw">#unity3d</a><br><br>キャラのルートに Pose Editor を追加して…<br>・クリックで選択<br>・Shift+クリックで追加選択<br><br>※ FKのみ<br>※ 指とか骨階層を選んで一括回転、は出来ない<br>（Unity自体がそういう仕様）<br><br>忙しい中数時間かけた力作 <a href="https://t.co/vFQv5EbZME">pic.twitter.com/vFQv5EbZME</a></p>&mdash; サトー (@sator_imaging) <a href="https://twitter.com/sator_imaging/status/1130020198533259264?ref_src=twsrc%5Etfw">2019年5月19日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>



※ IKは未対応。




--

#### こちらもどうぞ


- [Scene Timeline - Asset Store](https://assetstore.unity.com/packages/tools/animation/scene-timeline-110178)
   <iframe
      class="embed-card embed-webcard"
      scrolling="no"  frameborder="0"
      style="
         display: block;  border: none;
         margin: 10px 0px;
         width: 100%; height: 155px;
         max-width: 500px;
      "
      src="https://hatenablog-parts.com/embed?url=https://assetstore.unity.com/packages/tools/animation/scene-timeline-110178">
   </iframe>



- [Terrain FBX Exporter - Asset Store](https://assetstore.unity.com/packages/tools/terrain/terrain-fbx-exporter-143116)
   <iframe
      class="embed-card embed-webcard"
      scrolling="no"  frameborder="0"
      style="
         display: block;  border: none;
         margin: 10px 0px;
         width: 100%; height: 155px;
         max-width: 500px;
      "
      src="https://hatenablog-parts.com/embed?url=https://assetstore.unity.com/packages/tools/terrain/terrain-fbx-exporter-143116">
   </iframe>



- [Substance Painter Generator: Faked Rounded Corners on Normal Map](https://gumroad.com/l/Stmg_RoundCorner)
   <iframe
      class="embed-card embed-webcard"
      scrolling="no"  frameborder="0"
      style="
         display: block;  border: none;
         margin: 10px 0px;
         width: 100%; height: 155px;
         max-width: 500px;
      "
      src="https://hatenablog-parts.com/embed?url=https://gumroad.com/l/Stmg_RoundCorner">
   </iframe>






--
- [#VTuber関連まとめ - Qiita](https://qiita.com/sator_imaging/items/5d3b4466a2a1539184d0)
   <iframe
      class="embed-card embed-webcard"
      scrolling="no"  frameborder="0"
      style="
         display: block;  border: none;
         margin: 10px 0px;
         width: 100%; height: 155px;
         max-width: 500px;
      "
      src="https://hatenablog-parts.com/embed?url=https://qiita.com/sator_imaging/items/5d3b4466a2a1539184d0">
   </iframe>
Railsチュートリアルmemo


# Rails チュートリアル (2019/04/28～2019/05/19)

- 環境
 - Windows 10 Home
 - VSCode 1.34.0
 - Ruby 2.5.5p157 (2019-03-15 revision 67260) [x64-mingw32]
 - Rails 5.2.3
 - PostgreSQL 11.2　※development,testでも使用

#### Gemfile
```ruby:Gemfile

source 'https://rubygems.org'
git_source(:github) { |repo| "https://github.com/#{repo}.git" }

ruby '2.5.5'
gem 'rails', '~> 5.2.3'
gem 'bootstrap-sass', '3.3.7'
gem 'pg', '>= 0.18', '< 2.0'
gem 'puma', '~> 3.11'
gem 'sass-rails', '~> 5.0'
gem 'uglifier', '>= 1.3.0'
gem 'duktape'
gem 'coffee-rails', '~> 4.2'
gem 'jquery-rails', '4.3.1'
gem 'turbolinks',   '5.0.1'
gem 'jbuilder', '~> 2.5'
gem 'bcrypt', '3.1.12'
gem 'bootsnap', '>= 1.1.0', require: false
gem 'faker', '1.9.1'
gem 'carrierwave',             '1.2.2'
gem 'mini_magick',             '~> 4.8'
gem 'will_paginate',           '3.1.7'
gem 'bootstrap-will_paginate', '1.0.0'

group :development, :test do
  gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]
end

group :development do
  gem 'web-console', '>= 3.3.0'
  gem 'listen',                '3.1.5'
  gem 'spring',                '2.0.2'
  gem 'spring-watcher-listen', '2.0.1'
end

group :test do
  gem 'rails-controller-testing', '1.0.2'
  gem 'minitest',                 '5.10.3'
  gem 'minitest-reporters',       '1.1.14'
  gem 'guard',                    '2.13.0'
  gem 'guard-minitest',           '2.4.4'
end

group :production do
  gem 'fog-aws'
end

# Windows does not include zoneinfo files, so bundle the tzinfo-data gem
gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]
```

---

### その他

####micropost投稿内容の改行を反映させる

```ruby:_micropost.html.erb
  :
<%= safe_join(micropost.content.split("\n"), tag(:br)) %>
  :
```
アプリにオンボーディング(アプリの紹介)を実装しよう


# オンボーディングとは？
簡単にいうとプロモーションのようにアプリの機能などを紹介するものです。アプリをダウンロード、アップデートをして初めて開いたときに

- こういう機能がありますよ！
- プロフィール写真を登録しよう！
- 通知を受け取ろう！

などの画面が表示されたことがあると思いますが、それがいわゆるオンボーディング(onboarding)です。
この画面や工程を踏むことでユーザにアプリの魅力や使い方を伝え、より多くのユーザに定着させることができます。


ここではその実装方法を簡単ではありますが紹介したいと思います。

# 実装(基本編)

まずはざっくりとイメージしてください。アプリを起動し、もしオンボーディング画面を表示する必要があればその画面を表示、なければ通常の画面を表示になると思います。

```AppDelegate.swift

class AppDelegate: UIResponder, UIApplicationDelegate {

  func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions:
 [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

  if UserDefaults.standart.shouldDisplayOnboarding {
    // onboardingの画面に移動
    self.window?.rootViewController = OnboardingViewController()
    self.window?.makeKeyAndVisible()
  }
  return true
}

```

オンボーディングを表示するべきかどうか変数として保持し、アプリ全体で利用する可能性も考えるとUserDefaultsに保存するのがいいのではないでしょうか。以下のような実装を行えばその呼び出しや書き込みもスムーズだと思います。

```UserDefaults+Extensions.swift
import UIKit

private struct UserDefaultsKey {
  static let shouldDisplayOnboarding = "com.hogehoge.shouldDisplayOnboarding"
}

extension UserDefaults {
  var shouldDisplayOnboarding: Bool {
    get { return !self.bool(forKey: UserDefaultsKey.shouldDisplayOnboarding) }
    set { self.set(!newValue, forKey: UserDefaultsKey.shouldDisplayOnboarding) }
  }
}
```

あとはオンボーディングの終了時に以下のように判定値を変更してあげればオンボーディングの実装が完了します。

```.swift
  UserDefaults.standard.shouldDisplayOnboarding = false
```

# 実装(応用編)
オンボーディングは多くの場合、複数の画面を用意し、それを横にスクロールしながら進めていくものが多い気がします。となると、基本編のように`AppDelegate`で`rootViewController`に`OnboardingViewController`画面をセットするだけでは終わらないかと思われます。ここからはその対処処法の例を紹介しようと思います。
Onboardingをそのものを管理する`OnboardingController`を作成し、Onboardingでの画面の生成は表示を任せれば良い。オンボーディングが終了した時の処理は呼び出し元で実装を行うようにする。

```AppDelegate.swift

class AppDelegate: UIResponder, UIApplicationDelegate {

  func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions:
 [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

  if UserDefaults.standart.shouldDisplayOnboarding {
    // onboardingの画面に移動
    let onboardingController = OnboardingController()
    onboardingController.beginOnboarding(window: self.window!, {
      // ここでonboardingが完了した時の処理を書く. 
      // ここではTopViewControllerを表示するように実装している。
      self.window?.rootViewController = TopViewController()
      self.window?.makeKeyAndVisible()
    }
  }
  return true
}
```


```OnboardingController.swift


final class OnboardingController {
  typeAlias ComplitionHandler = () -> Void

  lazy var pageViewController: UIPageViewController = {
    let pageViewController = UIPageViewController()
    // pageViewControllerの実装
    return pageViewController 
  }()

  var handler: ComplitionHandler?

  func beginOnboarding(window: UIWindow, complition: () -> Void) {
    self.handler = complition
    window.rootViewController = self.pageViewController
    window.makeKeyAndVisible()
  }

  private func endOnboarding() {
    self.handler?()
  }
}

```

# 参考文献
直接的なコードの利用はないが、ベースの設計は以下のソースを元に考案した。
https://github.com/google/iosched-ios
WSL上へのh8300クロスコンパイル環境構築


# やりたいこと
組み込みOSの勉強のために，参考文献[1]の内容を順に進めたい．でも，windwosマシンしかないので，環境はWSLで進めました．
最終的に，無事Hello World! までできました．

# 手順
```
# buildutils のビルド
# http://core.ring.gr.jp/pub/GNU/binutils/ から最新版をダウンロード
tar xvzf builtutils-2.31.tar.gz
cd ./buildutils-2.31
./configure --target=h8300-elf --disable-nls
sudo make install

# gcc のビルド
# http://core.ring.gr.jp/pub/GNU/gcc/ から最新版をダウンロード
tar xvzf gcc-8.2.0
sudo apt install libgmp-dev
sudo apt install libmpc-dev
sudo apt install libmpfr-dev
./configure --target=h8300-elf --disable-nls --disable-threads --disable-shared --enable-languages=c
make all-gcc
sudo make install-gcc

# k8write のビルドは文献[1]通りでOK．
cd {kzload.mot のパス}
{h8writeのパス}/h8write -3069 -f20 kzload.mot /dev/ttyS{シリアルポート番号}
```

# 躓いたポイント
## cc の configure エラー
文献[1]の通りに進めると，gccの configure で --with-gmp, --with-mpc, --with-mpfr をつけるように言われますが，パッケージのインストールをすれば configure は無事に完了するようになりました．

## gcc の make エラー
configure はクリアしたものの，そのあとの make で，libgcc.mvars が見つからないというエラーで止まります．文献[2] に従って，make の代わりに make all-gcc とすると大丈夫です． sudo make install も同様に sudo make install-gcc とします．

## h8write 実行時に FATAL:Can not open the input file.
motファイルを相対パスで指定すると，なぜかこうなるらしいです．motファイルのあるパスで，k8write側をパス指定して実行すると解決しました．

## h8write 実行時に FATAL:Can not to set line speed and put Query mode.
マイコンボード側が正しく書き込みモードになっていなかったようです．ACアダプタの抜き差しで直りました．

## h8write 実行時に FATAL:Can not open the line to the H8/OS system.
シリアルの指定が間違っているときに，こうなりました．


# 参考文献
[1] 坂井弘亮, 「12ステップで作る組み込みOS自作入門」, カットシステム
[2] [Linux Forums \[SOLVED\] gcc make error, missing 'libgcc.mvars'](http://www.linuxforums.org/forum/applications/172812-solved-gcc-make-error-missing-libgcc-mvars.html)
出来る方から片付ける

# I am Mac user
- 私マックユーザーです。前職でgit使用した際もマックだった。職場でも全員マックだった
- なのでAtlassian社製の[sourcetree](https://ja.atlassian.com/software/sourcetree)を使用していた。そして思い出した（最近本当に物忘れが激しいような気がする...）
- 早速DL、そしてインスコ（今もまだある言葉なのだろうか？）

# マックにリポジトリを作成

- （最近買った）MacbookAir以下MBAのホームにsourcetreeにてリポジトリ`git_repo`を作成
    - ローカルリポジトリを作成
    - ![スクリーンショット 2019-05-19 14.31.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138216/a3ed38e3-8d15-1c9c-5db1-a706e57ae3fe.png)
    - ![スクリーンショット 2019-05-19 14.34.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138216/616f7256-3450-a070-8f3c-d8c5c340c7b0.png)

- [１番初めに作成した`hello.go`](https://qiita.com/ouraboros/items/6ebdd724b903b6efc76f#3%E4%B8%80%E5%85%88%E3%81%9A%E5%8B%95%E3%81%8B%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B)を`git_repo`に移動
- すぐにsourcetree上の`git_repo`に「１」（マウスオーバーするとファイル変更）が表示される
    - ![スクリーンショット 2019-05-19 14.40.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138216/6dabebf2-1f83-2f54-cc84-8386205ed1ef.png)
- [参考にさせてもらったサイト（Qiita内）](https://qiita.com/kyoyyy/items/161b6905f45bee2efe21#%E3%82%B9%E3%83%86%E3%83%BC%E3%82%B8%E3%83%B3%E3%82%B0)の図と同じように、以前使用していた時と同じイメージしやすいようにステージを表示させる
    - ![スクリーンショット 2019-05-19 14.58.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138216/6fb4dd01-2000-4535-e2b7-c9f878b78654.png)
    - 作業ディレクトリとステージングの2つに分割されて表示される
        - ![スクリーンショット 2019-05-19 15.03.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138216/6224e962-1e0c-e086-bf36-859f4b875d69.png)

    - ディレクトリへ追加した`hello.go`にチェックを入れると、ステージングへ移動される
        - ![スクリーンショット 2019-05-19 15.04.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138216/b2eb02ab-ccbe-cec2-65dc-eaf3fb5e103c.png)

    - コミットメッセージにメッセージ「add first file」を記載
    - コミット押すとユーザー紐付けが表示されるので必要項目を入力（ここはGithubと同じにしています）
        - ![スクリーンショット 2019-05-19 15.07.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138216/b4a701ae-17ee-f0f8-9b16-b7a424e2918c.png)

    - 更に何か書くところを求めてきた（以前使用している時にこんな表示あったかな？）コミットメッセージは既に記載したので何も書かずにコミットをクリック
        - ![スクリーンショット 2019-05-19 15.12.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138216/9aff961e-e2c8-cf9b-4f4a-bd1266fd8bfc.png)

    - と思ったら警告出た。なのでさっきと同じ内容を書いてみる（さっきのコミットメッセージとは違うのかな？
        - ![スクリーンショット 2019-05-19 15.14.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138216/750536ce-2703-489c-76d6-d5ba95112dbd.png)
        - なので先ほど空の部分に同じ文言を記載しコミット実施。出来た。


# sourcetreeとGithubを連携
- 設定＞アカウント＞追加＞ホスト：GitHubを選択
- 「アカウントを接続」をクリック
- 途中で切れてしまったけど、ローカルリポジトリの内容をリモートリポジトリへプッシュ出来なかった
- ちょっと色々あったのでひとまず今日はこれで終わり。お休みなさい
【Chapter 2.1】文系大学生が読み解くDeep Learning Book

# 【Chapter 2.1】文系大学生が読み解くDeep Learning Book

## 概要

数学的素養がほとんど高校生止まりの
とある文系大学生が著名な[Deep Learning Book](http://www.deeplearningbook.org/)
を読み解いていきたいと思います。（＝翻訳・まとめ・解釈）

## Chapter 2.1 Scalars, Vectors, Matrices and Tensors / スカラー, ベクトル, 行列　と テンソル

### スカラーとは

1つの数値で表すことができ、

実数Rのものと、

$$
s \in \mathbb{R}
$$

自然数のもの

$$
n \in \mathbb{N}
$$

がある。

### ベクトルとは

数字の配列

$$
x = \left(
  \begin{array}{c}
    x_1 \\\\
    x_2 \\\\
    \vdots \\\\
    x_n
  \end{array}
\right)
$$

### 行列とは

二次元の配列であり、

高さm,幅n,のベクトルAは、


$$
A \in \mathbb{R}^{m \times n}
$$

行列Aに関しては、


$$
A = \left(
  \begin{array}{cccc}
    a_{11} & a_{12} \\\\
    a_{21} & a_{22}
  \end{array}
\right)
$$

### テンソルとは

多次元の配列であり、

(i, j, k)に位置する座標軸のテンソルAは


$$
A_{i,j,k}
$$

### 転置とは

行と列を入れ替える処理のこと。


$$
( A^{T} ) \_{i,j}  = A\_{j,i}
$$


### 行列同士の足し算について

同じ形（行数と列数が同じ）であれば、可能。

$$
A\_{i,j} = B\_{i,j} + C\_{i,j}
$$

### ブロードキャスト

自動で行・列を拡張して計算を行う手法。

$$
A\_{i,j} = B\_{i,j} + C\_{j}
$$

上の例では、ベクトルBが全ての行に対して計算処理が行われている。

## 最後に

間違いやご指摘などが御座いましたらご教示願います！

## 参考文献

http://www.ritsumei.ac.jp/~kutsumi/lectures/2014/cal2/notation.pdf
https://qiita.com/capybara/items/2d5f387996a5bd275fbf
Magic Leap MagicScript Landscape Application. QuadNode

**Prepare**
Magic Leap One
https://www.magicleap.com/magic-leap-one

mlsdk v.0.20.0
https://creator.magicleap.com/downloads/lumin-sdk/overview

magic-script-cli v2.0.1
https://www.npmjs.com/package/magic-script-cli

magic-script-polyfills v2.2.0
https://www.npmjs.com/package/magic-script-polyfills

image file
https://tokufxug.sakura.ne.jp/magicscript/sadao.png


**Create Project**

```
magic-script init my-quad org.magicscript.quad "Quad"
cd my-quad
mkdir res
```
Put png file in res folder.

**Code**
Change app.package

```
DATAS = "digest.sha512.signed" : "." \
        "bin/" : "bin/" \
        "res/" : "res/"
OPTIONS = package/minApiLevel/2
```
Change app.js

```javascript
import { LandscapeApp, Desc2d, utils } from 'lumin';

export class App extends LandscapeApp {
  onAppStart () {
    const prism = this.requestNewPrism([0.5, 0.5, 0.5]);
    const id = prism.createPlanarEGLResourceId(1024, 1024);
    const quad = prism.createQuadNode(id);
    const tex_id = prism.createTextureResourceId(
      Desc2d.DEFAULT, "res/sadao.png");
    const [w, h] = prism.getSize();
    quad.setLocalScale([w, h, 1]);
    quad.setLocalPosition([-w / 2, -h / 2, 0]);
    quad.setBackFaceCulls(false);
    quad.setIsOpaque(true);
    quad.setRenderResource(tex_id);
    quad.setTexCoords(quad.getTexCoords().reverse());
    prism.getRootNode().addChild(quad);
  }
}
```

**Build**

```
magic-script build -i
```

**Run**

```
magic-script run --port=10000
```

**Reference**
QuadNode (MagicScript API)
https://docs.magicscript.org/lumin.QuadNode.html

magicscript
https://www.magicscript.org/

Thanks!
ちょっとLinuxを始めてみようと考えている人のためのVirtualBox 

# 
初投稿です。
仕事ではよくLinuxを使うのでコマンドラインとか諸々の勉強もかねてLinux環境を用意してみようかなと思っているけど家にあるのはWindowsのみで、、、といった感じだったのでVirtualBox使ってみました。


# Linuxを使ってみる方法
実際にLinuxを使ってみる方法はいくつかあります。

## A. LinuxをPCにインストールする
よくスペックの古いパソコンを再利用する方法のひとつとしてLinux関連の雑誌で取り上げられてますね。
OSを入れ替える必要があるので手間ですが、おうちに使っていないパソコンがあればありだと思います。

## B. Windows Subsystem for Linux(WSL)を使う
Windows10にはWSLと呼ばれるサブシステムがあり、こちらを使うことでWindowsOS上でLinuxの実行環境を実現することができます。
詳細については本記事では取り上げませんが、コマンドラインの勉強や文書作成など小さなことをする分には最も手軽な選択肢かと思います。

## C. VirtualBoxを使ってLinux仮想環境を用意する
VirtualBoxと呼ばれる仮想化技術を用いてLinuxを使う方法です。
アプリ開発したりインフラ構築を試験的に行ったりとそれなりにいろいろ試したいことがあったので今回はVirtualBoxを使った方法を採用しました。

# VirtualBoxを用いたLinux環境構築
とりあえず私のマシンスペックと手順をざっくりと説明します。
## スペック
OS : Windows10 Pro
CPU : Intel Corei7
メモリ : 16GB
ストレージ : HDD 500GB

## 手順
### 1. LinuxOS(Ubuntu)をダウンロード
[公式サイト](https://jp.ubuntu.com/download)よりダウンロードできます。
今回はUbuntu Desktop 18.04.2 LTSをダウンロードしました。

### 2. VirtualBoxをインストール
[公式サイト](https://www.virtualbox.org/wiki/Downloads)よりWindows hostsを選択してダウンロードし、exeファイルを起動します。
また同様にExtension Packもインストールします。
この時VirtualBox本体とExtension Packのバージョンはそろえること。


### 3. VirtualBoxにLinuxを入れる
① VirtualBoxを起動します。

② 仮想マシンの作成
「新規」をクリックします。
任意の名前を入力し、タイプを「Linux」、バージョンを手順1でインストールしたOS、ここでは「Ubuntu（64bit）」にして次へを押します。
![仮想マシンの作成1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412663/e0d78b15-717b-2fdc-a68c-031e416e0de1.png)

メモリを設定します。作業に十分なメモリを確保したいので8GBほど用意します。
![仮想マシンの作成2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412663/59bb0a3d-aa9c-73ad-01dd-953b8f21c925.png)

仮想ハードディスクを設定します。
ここに仮想環境で作業したファイルなどが格納されます。
ここでは「仮想ハードディスクを作成する」を選択します。
![仮想マシンの作成3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412663/2196631b-b2c6-494f-481f-40337774b3bd.png)

その後、仮想ハードディスクの設定画面になりますが、ハードディスクのファイルタイプはVDI、ストレージのタイプは可変サイズを選択します。容量はとりあえず10GBに設定します。

設定が完了し、作成した仮想マシンが画面左に表示されます。
![仮想マシンの作成4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412663/0a2959c9-41f6-3b46-5eb9-dd25b38320e6.png)

③ 仮想マシンの起動
作成した仮想マシンをクリックし、ストレージを確認します。
光学ドライブが「空」になっているので「ディスクイメージを選択」をクリックしてダウンロードしたLinuxOSを選択します。

その後、「起動」を押すとubuntuが起動します。
あとは初期設定など行えば今後はVirtualBox上でLinuxが動かせます。

## 補足
動きがかくかくしているときはビデオメモリを最大まで上げましょう。初期値は16MBとかになってるのでこれを128MBくらいまで上げればだいぶ滑らかになります。

# おわりに
とりあえずこれでLinux環境が用意できました。スペックがある程度高いPCがあれば無料でLinux環境が手軽に用意できるのはうれしいですね。
Build input file cannot be found と言われた時の対処法

初めまして。iOSエンジニアの[伊藤です](https://twitter.com/gaikitan?lang=ja)
今回は、あまり頻発するエラーではありませんが、プロジェクト名などを変更した時に正しくビルド先を設定出来ていない時に表示される上記のエラーの解決方法について記事を書こうと思います。



```
Build input file cannot be found: 'Info.plist の path' 
```

Project名 > Generalを参照すると、下記のような文言が表示されているのではないでしょうか

<img width="551" alt="スクリーンショット 2019-04-29 15.15.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179565/009d8728-4184-a7a6-d28f-1e00f3854eb7.png">


プロジェクト名の変更や、Info.plistのpathを変更した時に、プロジェクトに設定されているinfo.plistの参照元と、実態の在りかが異なっている時に表示されるようです。

したがって、info.plistのpathを正しく設定してあげれば直る可能性が高いです。

上記の `Choose Info.plist File...`　をタップして、変更のあったinfo.plistをchooseするか、現在Xcodeがビルドしようとしているinfo.plistのpathに設定し直してあげればなおります。
デザインパターンを学習しよう【0. デザインパターンの基本】

株式会社オズビジョンのユッコ (@terra_yucco) です。
このところ 1 日 1 記事を書いてみて思ったのですが、そんなに書けることがないし、結構大したことのない内容も多い。実務は知っていることの切り貼りでなんとでもなってしまっている感がありますが、もう少し基礎を固める必要を感じました。

前職が C 言語で、現職もなんとなくの PHPer なので、正直オブジェクト指向というものに自信がありません。そのためこの機会にオブジェクト指向を学びなおすとともに、デザインパターンをもう一度きちんと学びなおしてみようと思いました。 

# 教材

他にも良書、良教材はあるでしょうが、以下のサイトをまずは使っていきます。

- [TECHSCORE デザインパターン](https://www.techscore.com/tech/DesignPattern/index.html/)

選んだ理由は以下の通り。

- 23 あるデザインパターン全てが掲載されている
- Java で書かれているので、PHP に置き換える段階でさらに理解が深まりそう
    - どうしても困ったら [PHP によるデザインパターン](http://d.hatena.ne.jp/shimooka/20141211/1418298136) を参照しようと思います

## [0. デザインパターンの基本](https://www.techscore.com/tech/DesignPattern/foundation/foundation1.html/)

自分の学習メモとして、上記ページの要約を書いていきます。

### 0.1 はじめに

オブジェクト指向とは「事象とは、様々なオブジェクトの相互作用である」ととらえること。
実体を伴わない定義はクラス、実体を伴う状態になったものがオブジェクト。
例えば以下のような場合には、対応するクラスからそれぞれ記載のオブジェクトが生成されており、それらが相互作用することで事象が発生していることになる。

- クラス「人」、オブジェクト「あなたの友達の太郎君」
- クラス「自動販売機」、オブジェクト「3丁目の公園の自動販売機」

>あなたの友達の太郎君が、3丁目の公園の自動販売機でジュースを買う

オブジェクト指向に基づいたプログラミングは、再利用しやすい形の設計を最初に十分に検討し実現することができれば、**「生産性 (再利用性)」「信頼性」の向上という恩恵をもたらすことができる**。

### 0.2 デザインパターンとは

「デザインパターン」という言葉がしばしば指すのは「オブジェクト指向における再利用のためのデザインパターン」という本に記載されているもののこと。(通称 GoF 本)
「よく出会う問題とそれに対処する良い設計」を 23 パターン定義。

### 0.3 デザインパターンのメリット

1. 先人の知恵が凝縮されたパターン (前述の 23 パターン) のため、その知恵を利用した「再利用性の高い柔軟な設計」ができるようになる
2. デザインパターンを知っている技術者同士の意思疎通が簡単になる (パターンを知っていれば、詳細を説明しなくてもどのパターンで実装するかだけを共有すればよい)

デザインパターンを学べばその内容がそのまま日々の業務で使える、というわけではない。考え方を学ぶことで日々の業務が改善され、より再利用性の高い設計が行えるようになるというもの。

### [0.4 設計への利用について](https://www.techscore.com/tech/DesignPattern/foundation/foundation2.html/)

推奨：実際に設計に行き詰まったとき「良いアイディアを与えてくれそうなもの」を探すためにカタログ (23 種の一覧表) を見ること
ただし「無理にパターンに当て嵌める」のはアンチパターン。
23 パターンしかないものがそのまま使えることはそうそうない。前述の通り、考え方を学び、設計のエッセンスを自分の設計に取り入れていくことが大事。

デザインパターンを思い出すべきシーン：

#### クラスの抽出

現実世界に存在するものをクラス化するのは難しくないが、概念をクラスに抽出するのは難しい。デザインパターンの中には「戦略」や「状態」を抽出するものがある。このようなパターンを知っておくと、概念の抽出をうまく行えるようになる。

- Strategy パターン: 「戦略」
- State パターン: 「状態」

#### 実装とインタフェースの切り分け

変数の宣言時に具象クラスを使っていると、柔軟性が少し低下する。インターフェースや抽象クラスを使うことの素晴らしさが、デザインパターンの学びによって実感できるはず。

#### 再利用性を高める

オブジェクト指向における再利用性とは大きく以下の 2 つ。

- 継承
    - 親クラスの内容を子クラスに引き継ぐこと 
- オブジェクトコンポジション
    - 別のオブジェクトが持つ機能を組み合わせて利用すること

GoF のデザインパターンでは、オブジェクトコンポジション推奨。(必要な機能がオブジェクトの組み合わせで満たせるのが理想のため)
※デザインパターンでよく出てくる「委譲」も、オブジェクトコンポジションの一種

#### 変更に強くする

あらかじめ起こりうる追加や変更を想定することで、仕様追加・仕様変更に柔軟に対応できる設計を実現する。そのための方法がデザインパターンには含まれている。

## Conclusion

デザインパターンの基本の部分をまずは見ていきました。この時点ではまだ具体的なパターンに踏み込んでいないので腹落ちしていない部分も多々あります。

## Next Action

まずは順番に [1. Iteratorパターン](https://www.techscore.com/tech/DesignPattern/Iterator/Iterator1.html/) から見ていこうと思います。
業務処理の概念整理

業務をシステムで実現する際の概念を整理したいので、そのノート的な投稿


1.必要だと思われる概念群
■複数処理の関係
　・開始条件(制約、トリガー)、処理、完了条件

■一つの処理の内容
　・抽出、追加、更新、削除、計算

→SQL + 手続き言語で実現するのだろう

■処理の結果
　・正常終了、異常終了
　　①オペレーション
　　②ネットワーク
　　③マシン障害
　　④プログラム不具合
　　⑤パラメータ不具合
　　⑥データ異常

■一つの業務における処理の位置づけ
　・実行、再実行

■処理終了時に行われること
　・基準日の変更

2.各概念の理解
データベース連携フォーム

未来電子でインターンをしている141uです。

今回、僕はデータベース連携フォームを作るのに際し、HTMLの知識の振り返りもしました。

formタグはHTMLでメールフォームを作るときに使いますが、必ず必要になる属性があります。

それはaction属性とmethod属性です。

action属性でフォームの送信データの送信先を設定します。

method属性でフォームデータの送信方法を設定します。

そのmethod属性にもGET送信とPOST送信の二種類の送信方法があります。

GET送信とは属性値をgetにした送信方法で、サーバー側にあるデータの取得に適しています。

POST送信とは属性値をpostにした送信方法で、ユーザー側が情報を送信するのに適しています。

また、秘匿性の高い情報を扱うときにも適しています。

このように用途によって使い分けることができます。

これから取り組もうと思っているデータベース連携フォームは、index.pyとinput.pyとconfirm.pyとcomplete.pyの四つのファイルを使うことになると思います。

index.pyは入力された情報が一覧で見れ、input.pyは入力画面、confirm.pyは確認画面、complete.pyは登録完了のお知らせを表示させます。

また、input.pyの段階でバリデーションをして入力不備をなくします。

それをコードに反映させなくてはいけないのでif文を使うことになると思います。

また、セルとして表示させるときはthタグやtdタグを使います。

thタグは見出しになるので太字になります。

<img width="788" alt="スクリーンショット 2019-05-19 22.37.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276221/9be5e13c-b472-5b59-a786-bcb5a9eb613d.png">

いまのところ、input.pyのだいたいの大枠ができたので明日以降はもっと進められるよう頑張ります！

また、間違っている点があればご指摘していただけると助かります！
Dockerについて調べてみました１


企業を色々調べていると
至る企業でDockerという言葉が出てきてなんだこれは！？となっていました。
なので一度しっかり調べてみました。

##Dockerってなに？
Docker社が提供する、
コンテナ型の仮想環境を作成、配布、実行するためのプラットフォームのこと。

ここで、コンテナ型？仮想環境・・？？とハテナが浮かんだので、
再度調べ直してみました。

##仮想化ってなに？
PCの中に仮想PCを起動するというのが仮想化です。

もう少し詳しく書くと、

従来の仮想化はホストOS上に仮想化ソフト/ハイパーバイザを使用して、
仮想マシン/ゲストOSを立ち上げ、
その仮想マシンの中でミドルウェアの環境構築をし、
プログラムを実行してアプリケーションを動かすという構造になっている。
（色々図解してくれている記事などもあり、とても頭に入ってきやすかったです）

→つまり、仮想化のメリットって物理的にマシンの設置台数を節約出来ますし、
　管理の作業効率を高めることができる。

##Dockerのメリットとは？
仮想化について調べていると、
仮想化だけで十分便利なのでは？と思ったのですが、
Dockerについて改めて調べて見るとDockerの方が良いのでは、となりました。

上には上にがいるな・・という気持ちです！

→なぜかと言うと、
　Dockerが提供するのはコンテナ型仮想化です。

　従来のホスト型仮想化とは異なり、ゲストOSを起動せずに、
　ホストOSの上に動作しているDockerEngineからコンテナと呼ばれる
　ミドルウェアの環境構築がされた実行環境を作成し、
　その中でアプリケーションを動作させることが出来ます。

→つまり、圧倒的に軽量に動作させることができるのがコンテナ型仮想化。


##メリットをもう少し詳しく

仮想化によって実行環境を共有することはできるけど、
従来のホスト型仮想化では、動作が重く共有するファイルも軽量とも言えないらしく・・

Dockerのコンテナ型仮想化は、軽量な動作と環境ファイル共有を実現しているとのこと。
プログラムの実行環境を管理するための仕組みとしてDockerがあり、
それを共有するための仕組みとしてDockerHubなどのサービスがある。

Dockerを使用することの一番のメリットはソフトウェアの実行環境を、複雑な構造でも、
Dockerを使って管理することで、簡単にどんなマシンにでも共有できるというところです！


##終わり
Dockerって本当に便利なんだなぁと思いました。
Dockerとはについては一通り調べたので、
インストール方法や使用方法についても調べようと思います。
SSHできるサーバーへのSCPを使わないファイル転送方法とその速度比較

# SCPプロトコルは非推奨

> なお開発チームはscpプロトコルは時代遅れで柔軟性がなく、修正が容易ではないとし、sftpやrsyncなどを使ってファイル転送することを奨励している。

[「OpenSSH 8.0/8.0p」リリース、scpプロトコルに関連した脆弱性を修正 | OSDN Magazine](https://mag.osdn.jp/19/04/22/164000)

# SCPを使わないファイル転送

## [1] SFTP

SFTPは対話型でファイル転送を行える。バッチファイルを書くことで非対話でのファイル転送も行える。

### .ssh/configを使わないで接続

`-C` で圧縮して転送を行える。

```shell
$ sftp -C -P 10022 -i ~/.ssh/id_ecdsa john@example.com
```

### .ssh/configを使った接続

```shell
$ sftp -C example
```

あらかじめ`.ssh/config`へ設定を書いておく。

```shell:.ssh/config
Host example
  HostName example.com
  Port 10022
  User john
  IdentityFile ~/.ssh/id_ecdsa
```

### ファイル操作

コマンドの接頭辞に `l` をつけるとローカルの操作コマンドになる。


```shell:ローカルディレクトリの操作
# ファイルの一覧
lls
# 現在のディレクトリ
lpwd
# ディレクトリの移動
lcd sample
# ディレクトリ作成
lmkdir foodir

# ファイルの転送(アップロード)
put sample.txt
# ディレクトリの転送(アップロード)
put -r sample/
```

```shell:リモートディレクトリの操作
# ファイルの一覧
ls
# 現在のディレクトリ
pwd
# ディレクトリの移動
cd sample
# ディレクトリ作成
mkdir foodir

# ファイルの取得(ダウンロード)
get sample.txt
# ディレクトリの取得(ダウンロード)
get -r sample/
```

### バッチを使ったSFTPによる非対話型のファイル操作

以下の記事を参照

[バッチファイルを書いてSFTPサーバへのファイル配置を自動化する - Qiita](https://qiita.com/sasaplus1/items/619283711399c55306b6)

## [2] Rsync + SSH

Rsyncのオプションについてユーザ

- `-a`: コピー元と同一条件でコピー
- `-hv`: 人間に読みやすいように詳細を出力
- `-z`: 圧縮して転送

### .ssh/configを使った接続

サーバのホームディレクトリ内にある `sample-dir/` を手元マシンのカレントディレクトリへコピーする。

```shell:ディレクトリのダウンロード
rsync -ahvz example:~/sample-dir/ .
```

手元マシンのカレントディレクトリにある `sample-dir/` をサーバーのホームディレクトリへコピーする。

```shell:ディレクトリのアップロード
rsync -ahvz ./sample-dir/ example:~/
```

### .ssh/configを使わないで接続

サーバのホームディレクトリ内にある `sample-dir/` を手元マシンのカレントディレクトリへコピーする。

```shell:ディレクトリのダウンロード
rsync -ahvz -e 'ssh -p 10022 -i ~/.ssh/id_ecdsa ' john@example.com:~/sample-dir/ .
```

手元マシンのカレントディレクトリにある `sample-dir/` をサーバーのホームディレクトリへコピーする。

```shell:ディレクトリのアップロード
$ rsync -ahvz -e 'ssh -p 10022 -i ~/.ssh/id_ecdsa ' ./sample-dir/ john@example.com:~/
```

## [3] SSH + tarball

tarのオプションにハイフンをつけないとおじさん扱いされる。

[お前のtarオプション指定は古い - Qiita](https://qiita.com/junjis0203/items/6bb48184b508045e69da)

```Shell:アップロード
$ tar -czvf - ./aa | ssh example tar -xzvf -
```

```Shell:ダウンロード
$ ssh example "tar -czvf - ./sysFiles/" | tar -xzvf -
```

## 転送速度の比較

### randomなデータの1GB x 5ファイルの転送

ddで`/dev/urandom`から生成しようとしたところ、小さいサイズのファイルしか生成されなかったのでopensslで生成した。

```shell:サンプルファイルを生成
for i in {1..5}
do
  time openssl rand 1073741824 > temp${i}.bin &
done
```

### 結果

Rsyncが若干早いように見えるが、誤差ともとれるので判断しにくい。ファイルサイズとファイル数を増やして実験したい。

| 回数 | SSH+tarball | Rsync+SSH | SFTP |
|:--|:--|:--|:--|
| 1 | real    2m38.834s | real    2m33.605s | real    2m40.634s |
| 2 | real    2m41.456s | real    2m30.869s | real    2m38.730s |
| 3 | real    2m42.166s | real    2m34.490s | real    2m40.162s |
| 実行コマンド | `time sh -c 'tar -czvf - ./temp*` | `ssh example tar -xzvf -'`  | `time rsync -ahvz -e 'ssh' ./temp* example:~/`  | `time sftp -C -b bat example`  |

## 参考URL

- [sftpでディレクトリごと転送する - pockestrap](https://pocke.hatenablog.com/entry/2013/01/26/150100)
- [Linuxコマンド【 sftp 】安全なファイル転送 - Linux入門 - Webkaru](https://webkaru.net/linux/sftp-command/)
- [巨大ファイルを作成する | monolithic kernel](https://blog.mono0x.net/2013/02/16/large-files/)
因果関係モデルと仮説モデル（シンギュラリティを目指した空想アルゴリズムその2）

　この記事ではpython + TensorFlow + Keras +αで人工知能のアルゴリズムについて書いておりますが、実現できていないアイディアベースのものを書いています。
　今何かを解決したい人向きではないのでご了承ください。

　逆に今人工知能を研究してて今後のテーマを探している人は読んでみて情報提供か研究テーマにしてもらえると嬉しいです。

　今のAIで相関関係は分かるが因果関係は分からないという説明をよく聞きます。
　現在の機械学習は統計的に相関関係があるかどうかを図っているだけなので当たり前と言えば当たり前と言えます。
　その導き出した相関関係を因果関係かどうか確認するためには機械学習で与えられた学習データだけでは判別できないことが多いと思います。(場合によっては判別できるかもしれませんが)

　因果関係なのかどうかを調べるためには追試が必要だと思います。与えられたXとYで統計的に有意な相関関係があった場合には、システムから、同じ条件でXを外したらYが変わるか、Yを外したらXが変わるかというデータを求めるようにすればいいと思います。

　(既に与えられたデータの中にそれが確認できるデータがあるなら、自分で再度相関関係があるかどうかを再計算すればいいと思います。株価計算のロジックなら、その会社が出てくる新聞記事を全てCNNで特徴量抽出したものを掛け合わせて回帰分析し、相関関係や因果関係が見いだせれば、より信憑性の高い予測ができるかもしれません)

　そしてそのデータを与えられれば再度機械学習での追試によって、XとYは因果関係があるか、逆の因果関係なのか、またはただの相関関係があるのかを機械的に算出すればいいのではないかと思います(データがなく、人間側で判別できる時には単純に人間から因果関係があるかどうかを渡してもいいかもしれませんが)

　そしてゆくゆくは因果関係にあるものを大量に集めてデータベースを作り、(あればその学習済モデルもセットにして)活用すれば、知識をデータにして分岐を全てプログラミングするより、はるかに軽量でエキスパートシステムができるのではないでしょうか。

 そして、この因果関係データベースに含まれる単語だけをDoc2Vecで学習させて、類似度を測れば、因果関係間の相対的な類似度が分かり、問いに対してより類似度が高いと思われる因果関係からヒントを得て、抽象度の高い、より一般的な類推をするモデルが作れるのではないでしょうか。これはうまくいけば問題の仮説を立てるのに近いことをコンピューターにさせることができるのではないかと思うのです。
　
　この両方のモデルを実現する技術力がまだないので、これから考察を進めていきたいと思いますが、ご意見等あれば是非お願いいたします。
青空文庫から作品をスクレイピングする

### 動機
機械学習で学んだことをアウトプットするために自動文章作成でもやろうと思い立つ。
そのためのデータ集めに青空文庫のデータをスクレイピングした結果、それなりに時間がかかったので覚書きを残しておく。
### 使うツール
- BeautifulSoupライブラリ
- 青空文庫API　[青空文庫APIサーバーのご紹介](https://qiita.com/ksato9700/items/626cc82c007ba8337034)


###コード
hoge.htmlとしてデータを保存。

```python:
book_id = "937"
!wget http://pubserver2.herokuapp.com/api/v0.1/books/{book_id}/content?format=html -O hoge.html
```

BeautifulSoup を使ってファイルを読み込み。
**このときshift_jisじゃないとエラー吐くので注意**

```python:
# BeautifulSoup 導入　

from bs4 import BeautifulSoup
soup = BeautifulSoup(open("hoge.html",encoding="shift_jis"))

# find(タグネーム、保有している属性,etc...)
# 本文が書かれている<div>を取り出す
main_text=soup.find("div","main_text").text

print(main_text)
```

ルビ　例：蜻蛉（とんぼ）と全角スペースを取り除く。

```python:
import re
result = re.sub(r'([\（|\(][0-9|a-z|ぁ-ん]*[\）|\)])', "", main_text)
result2 = re.sub(r'　', "", result)
print(result2)
```

###この先の展望
IDを用いてデータを取り出す。

```python:
# 夢野久作の作品IDのスクレイピングを目指す
# 作品数154個
from bs4 import BeautifulSoup
!wget https://www.aozora.gr.jp/index_pages/person96.html -O index.html
soup = BeautifulSoup(open("index.html",encoding="utf-8"))
ol=soup.find("ol").text

import re
num1 = re.findall('(\（.+[0-9]+\）)+', ol)
num2 = re.findall('([0-9]{3})', ol)
print(num2)
print(len(num2))

#['937', '238', '467', '914', '531', '237', '467', '919', '467', '466', '466', '214', '467', '210', '211', '212', '467', '928', '467', '929', '930', '932', '466', '466', '212', '449', '209', '466', '468', '940', '921', '213', '467', '922', '112', '923', '223', '466', '467', '467', '456', '107', '212', '211', '214', '108', '924', '230', '237', '437', '213', '209', '210', '213', '477', '934', '466', '238', '210', '212', '209', '920', '935', '210', '211', '212', '936', '112', '212', '230', '211', '213', '466', '210', '230', '466', '213', '210', '467', '467', '467', '938', '213', '213', '213', '214', '209', '466', '467', '467', '939', '466', '209', '467', '467', '209', '212', '211', '467', '210', '211', '467', '444', '214', '467', '467', '210', '467', '214', '467', '211', '918', '915', '238', '210', '105', '230', '917', '916', '467', '467', '467', '467', '467', '467', '237', '926', '211', '913', '467', '211', '927', '110', '212', '212', '209', '467', '467', '111', '467', '210', '467', '942', '214', '933', '467', '212', '925', '112', '211', '213', '941', '213', '931']
#154
```
お前らのHTTPS通信はばれている

## はじめに
皆さん社内で5chみてたりyoutubeみてたり遊んだりしてたらバレる可能性がありますよっというお話です。
「HTTPは通信が暗号化されていないから内容がバレるのはしってるけど、HTTPS通信は暗号化されてるからバレないんじゃないの？」と思ったアナタ！
この記事を読んでみて誤解を解消しましょう！

## 想定環境
- 社内
- インターネットに出るにはProxyが必要

皆さん職場で使用しているPCはご自分でセットアップされたでしょうか。
IT系の企業ならいざしらず、他の業種ならばなぜか知らんがすでに職場においてあるPCを使ってるとか
すでにセットアップされたPCを受け取ったとかが多いと思います。
それか大企業なら社内環境構築用のCDが準備されているかもしれませんね。
皆さんが把握しているしていないに関係なく、社内PCからインターネットに出る際にはプロキシを経由することが多いと思います。
理由はいろいろありますが、主に2つの理由からです。
- 社内から社外にでるHTTP/HTTPS通信の経路を限定でき、守りやすい
- プロキシ内にキャッシュを保持しており、過去にアクセスしたページにはキャッシュで応答することによって高速化を図ることができる

## 実験環境
- Squid
- CentOS7

今回はプロキシとして定評のあるSquidを用いて環境を作っていきます。

## 結果
インストール方法や設定方法は他の記事に委ねるとして早速結果です。
対象のURLはqiitaトップのタイムラインとしましょう。（https://qiita.com/timeline）


### HTTP
ログ結果
```
1555247311.535    136 ::1 TCP_MISS/301 401 GET http://qiita.com/timeline　yamada - HIER_DIRECT/54.168.202.35 text/html
```

キャプチャ結果
![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214515/62ae5012-17d6-01e2-bf50-b76f142f3078.jpeg)


もちろんHTTP通信ですのでドメイン名やパス名はおろかやり取りした内容もすべて確認することができます。

### HTTPS
ログ結果
```
1555247249.034    615 ::1 TCP_TUNNEL/200 6133 CONNECT qiita.com:443 yamada - HIER_DIRECT/13.230.107.52 -
```

キャプチャ結果
![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214515/bdf941ad-ab57-8d3f-c03f-44db9b4af9a1.jpeg)

あれ・・・みえてる？？

そーなんです。たとえHTTPS通信であってもドメイン名まで（qiita.com）はわかるんです！！
よくよく考えればプロキシに接続する先のサーバを教えなきゃいけないですもんね。。。

まぁ暗号化されているのでドメイン名以降のパスまではわかりません。
でも社内のサーバ管理者には**yamadaさんはqitaにアクセスしているんだな**まではわかることになります。

したがって。。。
youtubeであればwww.youtube.com
5chであれば5ch.net
でプロキシサーバのログでフィルタリングをかければあなたが具体的に何を見ているかまでわからなくても明らかに業務に関係ないサイトを見てる場合はわかることになります。

## 結論
業務に関係のないサイトを見る場合は自己責任で！
[小ネタ]fishでaws-cliの補完機能を使うための手順

# はじめに
bash -> fishに変更した場合、aws-cliの補完機能を有効にする方法

# 手順
~~~ bash
# 位置を特定します
$ which aws_completer

# 存在しない場合は作成します
$ vim ~/.config/fish/config.fish

# aws_completerのパスはwhichで調べたパスに適時変更しconfig.fishに追記して保存します
$ complete -c aws -f -a '(begin; set -lx COMP_SHELL fish; set -lx COMP_LINE (commandline); /usr/local/bin/aws_completer; end)'

#確認
$ aws s + tab

~~~


これで、良いfish Lifeを過ごせます。
![Screenshot from 2019-05-19 22-02-07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216527/8e281aee-5aca-c8b1-4b8b-ce1f7541739f.png)
【Rails】データベースの型の変更・置き換え（Postgresql）

個人開発中のアプリケーションのデータベースの型を変更しようとしたら、herokuの本番環境のみ、エラーが出てしまいました。

この時のエラーの解決方法を解説します。

# 環境
- 言語：Ruby 2.5.3
- フレームワーク：Rails 5.2.3
- データベース（development/test)：Mysql
- データベース（production）:Postgresql
- デプロイ:Heroku

調べていながら分かったのですが、development環境とproduction環境で異なるデータベースを利用するケースは少ないのですね。
プログラミングスクールでは、環境構築の学習コストを抑えるため、このように教わったのですが、いずれはデータベースを統一しようと思います。

# マイグレーション実行とエラー

下記マイグレーションを実行したところ、

```ruby
class ChangeDataRateToPost < ActiveRecord::Migration[5.2]
  def change
    add_column :posts, :new_rate, :float
  end
end
```

`rails db:migrate` →　OK
`heroku run rails db:migrate` → エラー

```
PG::DatatypeMismatch: ERROR:  column "rate" cannot be cast automatically to type double precision
HINT:  You might need to specify "USING rate::double precision".
```
Postgresqlはデータの型の変更がうまくいきませんでした。

# 問題の切り分け

## 1.マイグレーション内容の変更

エラー内容から、データ型を変更するときは`USING`というオプションをつけて型を変更する必要があるようです。

## 2.環境ごとに異なるマイグレーションの実行

development環境のマイグレーションは上手く実行できているので、`USING`のオプションをつけたマイグレーションの実行は`production環境`のみで行う必要があります。


# マイグレーションやり直し

[PostgreSQL vs. Rails migration: How to change columns from string to integer](https://makandracards.com/makandra/18691-postgresql-vs-rails-migration-how-to-change-columns-from-string-to-integer)を参考に

```ruby
# integer型への変更(変更前の型は記載しなくて良い)
change_column :table_name, :column_name, 'integer USING CAST(column_name AS integer)'
```
下記のマイグレーションを変更しました。

```ruby
class ChangeDataRateToPost < ActiveRecord::Migration[5.2]
  def up
    # 環境ごとにマイグレーションを分ける
    if Rails.env.development? || Rails.env.test?
      change_column :posts, :rate, :float
    else Rails.env.production?
      # 本番環境はusingオプションを追加
      change_column :posts, :rate, 'float USING CAST(rate AS float)'
    end
  end
  
  def down
    change_column :posts, :rate, :string
  end
```
`rails db:migrate` →　OK
`heroku run rails db:migrate` → エラー

 *herokuの環境は事前に確認できないため、リスクの高い方法です。staging環境を用意してから実行するのが望ましいようです。

# 今後の課題
1.development/test/production/全ての環境で同一のデータベースを利用する。
2.staging（ステージング環境）を用意して、production環境に手を加えずに挙動確認が可能な環境を構築する。

# 最後に

2018年12月にプログラミングを始め、プロテインの口コミ共有サービスを開発しています。一目見ていただけたら嬉しいです。

「SuppleBox - プロテイン特化型口コミ共有サービス -」
URL： https://supplebox.tokyo
GitHub： https://github.com/yuki0920/supplebox
Rails vaildates uniquness

以下のようなモデルがあるとする。


```create_access_permission.rb
class CreateAccessPermission < ActiveRecord::Migration
  def change
    create_table :project_expirations do |t|
      t.reference :user
      t.datetime :expired_at

      t.timestamps
    end
  end
end

```

このモデルは、あるユーザに対してアクセスパーミッションを発行する時に使われる。
このパーミッション自体は `expired_at`に値が入っていない場合に有効。
レコードが作成された段階では `expired_at`に値はない。

## validation
ユーザに、有効なアクセス権を重複して付与しないようにしたい。
そこで、以下のような validationを書いていた。

```rb
class AccessPermission
  validate :not_duplicate_permission

  def not_duplicate_permission
    self.where(user_id: user_id).where.not(expired_at: nil).exist?
  end
end
```

けど、以下のようにかけることを知った。
（なぜか `nil`との掛け合わせで `uniqueness`を検証することは出来ないと思いこんでいた。）

```rb
class AccessPermission
  validates :uniqueness, :user_id, { scope::expired_at }
end
```

## より簡潔に
さらにこんなふうなメソッドがあることを知った

```rb
class AccessPermission
  validates_uniqueness_of :user_id, scope: expired_at
end
```

さらにさらにより多くのカラムとの組み合わせも実現できる。
（今回のモデルの場合は必要ないけど、）

```rb
class SampleModel
  validates_uniqueness_of :user_id, scope: [:expired_at, :email]
end
```


さらに組み合わせ時の条件も指定できる

```rb
class SampleModel
  validates_uniqueness_of :email, conditions: -> { where.not(deleted_at: nil) }
end
```
Dockerでちょっぴりつまづいたところ3つ

<h1>１．Encountered errors while bringing up the project.</h1>
<h3>対処法</h3>
Dockerの再起動で直った

<h3>メモ</h3>
Dockerのアイコンをクリック⇨Quit Docker Desktop(⌘+Q)

<h3>参考</h3>
https://sqlazure.jp/r/tips/1546/

<h1>２．node.jsがインストールできない</h1>

<h3>対処法</h3>
Dockerfile Rubyのバージョンを2.4.5に

<h3>メモ</h3>
`RUN apt-get update -qq && apt-get install -y build-essential nodejs`

ここをうまく変えればバージョン変える必要ないかも？
※もっとスマートなやり方があれば教えていただきたいです…！

<h1>3.rails_web_1が起動しない</h1>

<h3>対処法</h3>

tmp/pid/server.pidを削除

<h3>メモ</h3>
サーバー起動時のIDを保存するファイルらしい　
これがたまにサーバーの起動を妨げる
何故、”振り返り”を行うのか？

# はじめに
**皆さん、”仕事の振り返り”ってやっていますか？**

別の言葉で言い換えると、PDCA回してますか？になるかと思います。

偏見ですが、多くの人が忙しさのため、振り返りをやっていないと思います。私も時間をとって振り返りを行うということはほとんどしていません。
（にもかかわらず、リーダーという立場上、メンバーには振り返りの実施を要求したりしていますｗｗそんな訳なので、メンバーもきっと振り返りをやっていないでしょうｗｗ（偏見））

では、何故、振り返りを行わないのか？
忙しいというのはもちろんですが、それと同じ位、振り返りの意義・価値を理解できていないからだと考えます。
そして、まさしく私は振り返りの意義や価値を自分の言葉で端的に答えることができませんでした。
そこで、この問いに対して、自分なりの考えをまとめたので記事にしようと思います。

# なぜ、振り返りが必要なのか？
それは、**「成果（結果）を出し続けるため」**です。

仕事には必ずプロセスがあり、仕事の成果とはそのプロセスの出力です。
そして、振り返りとはこのプロセスをチェックし、改善することにあたります。
プロセスのチェック、改善は継続的に成果を出し続けるために欠かせません。

振り返りが結果ではなくプロセスを対象としているということは、つまり、良い成果が得られた場合でも振り返りは必要ということになります。
このとき、振り返りができないようであれば二度と同じ成果は得られないでしょうし、本質を理解してきちんと振り返りができれば自身の成長に繋がると思います。

# 終わりに
振り返りが成果を出し続けるための活動と捉えると、その重要性が感じられるのではないでしょうか。
また、周囲で成果を出し続けている人に関心を向けてみてください。その人は他の人よりプロセスを熟知（重視）していませんか？

多くのビジネスマンは多忙のため、DoDoDoDoDo......と結果指向になりがちですが、この記事がプロセス指向のきっかけになれば幸いです。
私もこれを機に少し仕事の成果の見方を変えてみようと思います。