OmniAICreator/Qiita-1.07M huggingface dataset:
VirtualBoxがAPFSに対応したようです

[以前VirtualBoxになんとかしてmacOS Catalinaをインストールしようと言う記事](https://qiita.com/ykgeek/items/3098074c91da6943ef00)を書きましたが2019/12/11にリリースされたバージョン6.1からAPFSでのブートに対応したようです。

理論上何も考えずにmacOSがVirtualBoxにインストールできるはずなので試してみました。

**ライセンス違反にならないようMac上のVirtualBoxにインストールするようにしてください。**

# TL;DR
結論から言えば以前に比べれば遥かに簡単にインストールできます。
しかしアップデートで起動できなくなるかもしれません。

**2020/2/23 追記
VirtualBox自体のアップデートが何度か来ていたので試しにもう一度試したところ、今度はうまく行きました。不具合が解決されたのかは分かりませんが、アップデートはスナップショットを取った上で行った方が良いかもしれません。**

# インストール手順
## インストールディスクを用意する
これがなければ話になりません。
インストールディスクの作成方法は[こちら](https://qiita.com/ykgeek/items/d1ed297c00577ba215ef)をご覧ください。

## 仮想マシンを作成する
APFSに対応したとは言えOSの選択項目にCatalinaはありません。
macOS 10.13 High Sierra (64-bit)構成がCatalinaの環境に近いため、こちらをベースにしていきます。そこからさらにいくつか変更する箇所があります。

- ストレージの容量は最低30GBにする
- ビデオメモリを128MBに変更する
- インストールディスクをセットする
- USBポートを3.0対応にする(VirtualBoxにextensionを入れる必要があります。)

メモリとプロセッサーはできるだけ多めに設定しておくと使いやすくなります。

## インストールする
仮想マシンを作成したらインストールディスクからmacOSを起動します。

インストールを始める前にインストール先のディスクを初期化します。
今回はAPFSでフォーマットしましたがおそらくHFS+(Mac OS Extended)でも問題ないと思います。(途中でAPFSに変換されますが…)
インストール先のディスクを初期化しておかないとmacOSインストール時にインストール先としてディスクが表示されません。

ディスクを初期化したらいつも通りにインストールをしてください。
インストールが終わればいつも通り使うことができます。

# 注意事項
macOSを使用している際にVirtualBoxが異常終了したことがあり、その後OSが自動的に起動しませんでした。おそらく正常終了しなかったことによりmacOSの起動場所の情報が失われたためブートに失敗したと思われます。この場合はEFIシェルから直接ブートすれば起動できます。
(リカバリー領域で起動できたため起動ディスクを指定して再起動することができました。)

またOSのインストール後アップデートを行いましたが、アップデートのためにリブートしたところ起動しなくなりました。まだVirtualBoxの挙動が安定していないようです。アップデートは控えたほうがいいかもしれません。

**2020/2/23 追記
VirtualBox自体のアップデートが何度か来ていたので試しにもう一度試したところ、今度はうまく行きました。不具合が解決されたのかは分かりませんが、アップデートはスナップショットを取った上で行った方が良いかもしれません。**

# あとがき
以前に比べれば簡単にmacOSをVirtualBoxの仮想マシンにインストールできるようになりました。課題もありますが気軽にmacOSを仮想マシンで遊ぶことができるようになりそうです。
もし間違いなどがあればご指摘いただければ幸いです。


# Reference
https://www.virtualbox.org/wiki/Changelog-6.1#v0
https://qiita.com/ykgeek/items/3098074c91da6943ef00
【地方在住】こうしてIT未経験からプログラマーに転職しました。

##28歳で販売士からプログラマーへ
この記事は他業種からプログラマーへ転職を考えている人向けに書いています。
情報系の学校出身でない人がプログラマーになろうとしたら、最近であれば『スクールに通って』『自分でサービスを作ってみて』という意見が多い気がします。
私の場合は上記に当てはまらなかったのでこういうケースもあるということで誰かの参考になればと思います。

※本記事は文字ばかりです。

##転職前の状況
・音楽系専門学校卒業後、販売士として7年ほど働く。
・28歳の時に転職活動を開始。妻と子供がいる。
・10代の頃からアメブロで10年ほど日記を書いていたのでブラインドタッチ可能。
・専門学校時代に簡単なExcelとWordの資格を取得。
・魔法のiらんどやjimdoでバンドのHPを編集するのが楽しかった。
・編集といってもHTMLやCSSを使うわけでもなくテンプレートを組み合わせるくらい。
・東京に行くのは難しい。
・現在年収は300万円くらい。給料は少しくらい下がってもいい。

##いきなり転職活動を始めました
この見出しが結論ですが、プログラマーになると決めたので早速転職活動を始めました。
**自分がプログラマーに向いているか企業に判断してもらおう**と考えました。転職が成功すればプログラマーとして素質がある。失敗すれば向いていない。そう割り切ることにしました。
とりあえず転職サイトに登録して未経験のプログラマーを募集している会社に片っ端から履歴書を送りました。
この年齢だと職務履歴書も提出を求められるのですが、履歴書も含めパソコンで作成しました。パソコンを使えるアピールに使えると思ったからです。また印刷するだけなので一度作ると後は楽でした。

当然かと思いますが大体不合格になります。それでもめげずに応募を続け、最終的に20通くらい応募しました。そこから3社ほど面接まで行き、唯一内定を貰えた会社に滑りこむことが成功し晴れてIT業界の一員になることが出来ました。

##会社により採用条件も様々
面接まで行った会社では『東京に行けるのであれば採用する』また別の会社では『給料は出せないけどうちのスクールに通ってそのあと契約社員という形でいいのであれば採用する』と言われました。会社を選べる立場ではないのですが、妻子持ちに上記の条件はなかなか難しくお断りしました。確かに東京へ行けば仕事が多いためそういう条件を出されることは多いようです。また、未経験でかつ大してスキルもないアラサー男に対してそうそういい条件もないようです。
しかし最終的に入社した会社は『入社後の研修期間も給料は出す』『その後正社員登用する』といった破格の条件であり無事入社することが出来ました。その会社は入社試験があり、公務員試験のような問題を筆記で解きました。あとから聞いた話ではそこの点数がそこそこ良かったようで入社できたようです。

##プログラマーになって
そろそろプログラマーになり5年ほどになります。研修で初めてJavaに触れ、そこで人生初の『Hello World』を出した時の感動は今も忘れません。最初はわからないこともわからず、ちょっとした言葉の意味もわからず、多少なり馬鹿にされながらしがみつきました。家族を養わなければいけないということがモチベーションになったことは間違いないですが、純粋にプログラミングをするのが楽しかったです。勉強をするとしただけ自分に返ってくるのも性に合っていたようで、プログラマーになって良かったと思います。

ということでいきなり転職活動をしてみるというのも手かと思います。スクールで勉強もよいと思いますが、仕事としてプログラミングをしたほうがはるかにスキルが身に付きます。いきなり開発をやらせてもらえるかは運になりますが、その辺は開発をしたい！と強く主張して希望を叶えられるよう動ければと思います。

こんな内容ですが、誰かの参考になればと思います。
Vue.js（build版コンパイル）で gsapエラー

## 概要
Vue.jsで画面遷移時のトランジションアニメーション実装してみようってことで、
`<transition>`タグのイベントフックとgsapを使って、動作検証してみることに。
（導入メモは[こちら](https://qiita.com/mksm_wrk/items/37c084776f87dbc8ffe1)）

`serve`でコンパイルしていたプレビューではうまくトランジションアニメーションしていたのに、
`build`でコンパイルしたものを確認すると・・動いてない・・だと！

ライブプレビューの罠。

## エラー内容

コンソールには下記のエラー
`Invalid scaleY tween of 0 Missing plugin? gsap.registerPlugin()`

同じようなことを質問している人はいるみたいだが・・
https://greensock.com/forums/topic/21874-invalid-scaley-tween-of-0-missing-plugin-gsapregisterplugin/

地味にハマったので、解決法を書いておきます。


#### 画面遷移時トランジション ソース（Before）※エラー出て動かないver
```vue
# App.vue

<template>
    <div id="app" class="l-app">
        <transition v-on:enter="enter" v-on:leave="leave" v-bind:css="false">
            <router-view />
        </transition>
        <Gnav />
    </div>
</template>

<script>
import Gnav from '@/components/Gnav.vue'
import { TimelineMax, TweenMax, Power4 } from 'gsap'

export default {
    components: {
        Gnav,
    },
    methods: {
        enter(el, done) {
            const tl = new TimelineMax({
                onComplete: done
            })

            tl.set(el, {
                y: window.innerWidth * 1.5,
                scale: 0.8,
                transformOrigin: '50% 50%'
            })

            tl.to(el, 0.5, {
                y: 0,
                ease: Power4.easeOut
            })

            tl.to(el, 1, {
                scale: 1,
                ease: Power4.easeOut
            })

        },
        leave(el, done) {

            TweenMax.to(el, 1, {
                y: window.innerHeight * 1.5,
                ease: Power4.easeOut,
                onComplete: done
            })
        }
    }
}
</script>
```

・・・特にトリッキーなことは・・してないと思うのだが・・・
`Missing Plugin`っていうのをヒントにつぶしていきました。




## 【原因】gsapの書き方間違い
importの仕方が悪いのか？と思い、gsapのサイトを改めて確認。
すると、どうやら、gsap(v3)ではモジュールの呼び出し方も、メソッドの書き方も変わってる・・・！

▼v3公式リリース
https://greensock.com/3-release-notes

アナウンス通りに書きなおしてみると・・・<b>動いたーー</b>

#### 画面遷移時トランジション ソース（After）※修正して動いたver
```vue
<script>
import gsap from 'gsap'

export default {
  methods: {
    enter: function(el, done) {

      let tl = gsap.timeline({    //Timelineの生成の書き方変わった！
        onComplete: done
      })
      tl.set(el, {
        y: window.innerWidth * 1.5,
        scale: 0.8,
        transformOrigin: '50% 50%'
      })
      tl.to(el, {
        duration: 0.4,    //durationも中に！
        y: 0,
        ease: 'power4.easeout'    //easingの書き方も変わった！
      })
      tl.to(el, {
        duration: 0.8,
        scale: 1,
        ease: 'power4.easeout'
      })

    },
    leave: function(el, done) {

      gsap.to(el, {    //TweenMax.to() ではない！
        duration: 0.8,
        y: window.innerHeight * 1.5,
        ease: 'power4.easeout',
        onComplete: done
      })

    }
  }

}
</script>
```

というわけで、vue.js特に関係なかったわけですが、
いつまでも昔の書き方で動くと思うなよっていう戒めですね。
気をつけたいと思いました。
Ctrl+C で止まらないpythonプログラム

この記事は [鈴鹿高専 Advent Calendar 2019](https://adventar.org/calendars/4146) にも登録しました。
# 経緯
- [#procon30](https://twitter.com/search?q=%23procon30&src=typed_query)の出場作品での出来事
- 組み込み系のコードをpython __2.7__で書いていた
- 自分がセンサ類のモジュール3つを担当した
- モジュール単体では、`Ctrl+C`で正常終了した（定期的なセンシングのため、デーモンプロセスと考えておk）
- 全体制御を👨‍💻に任せていた
- 統合テストでは`Ctrl+C`でも終了しない
- 👨‍💻は問題を放置し、__`Ctrl+Z`と`kill -9`で強引に__プロセスを終了させていた
- __本選後__に原因を発見し、今でも忘れられないので記事にする

## 問題のプログラム
👨‍💻は参照渡し時にイミュータブル（変更不可）な変数は変更されないことを知らなかったらしい。（[ドキュメント](https://docs.python.org/ja/2.7/reference/datamodel.html)）


```python:main.py
import os
import threading
import time
import foo_1   # foo_1.py

std_lock = threading.Lock()   # 標準入力時の排他制御

if __name__ == "__main__":
    foo_1_thread = threading.Thread(target=foo1.foo_1,args=(std_lock,))
    foo_1_thread.start()
    while True:
        try:
            with std_lock:
                print("thread name:{0}, ident:{1}".format("main", threading._get_ident()))
            time.sleep(1)
        except KeyboardInterrupt:
            break
```

```python:foo_1.py
import time
import threading

terminate = False

def foo_1(std_lock):
    while False == terminate:   # while == True じゃ止まんないから変えといたYo!^^　by👨‍💻
        with std_lock:
            print("thread name:{0}, ident:{1}, terminate:{2}".format("foo_1", threading._get_ident(),terminate))
        time.sleep(1)
```
```:実行結果
$ python main.py
thread name:foo_1, ident:140618926196480, terminate:False
thread name:main, ident:140618956166976
thread name:main, ident:140618956166976
thread name:foo_1, ident:140618926196480, terminate:False
thread name:main, ident:140618956166976
thread name:foo_1, ident:140618926196480, terminate:False
^C
thread name:foo_1, ident:140618926196480, terminate:False
thread name:foo_1, ident:140618926196480, terminate:False
thread name:foo_1, ident:140618926196480, terminate:False
^Z
[1]  + 15221 suspended  python main.py
```

## 止め方
リスト型はミュータブル（変更可能）なので、`terminate = False`を`terminate = [False]`にして、`terminate[0]`をいじれば止まる。

が、そんな止め方はイケてないので、[`threading.Thread`](https://docs.python.org/ja/3/library/threading.html)を継承し、スレッドをデーモンに設定して止まるようにした。

```python:main.py変更箇所
- foo_1_thread = threading.Thread(target=foo1.foo_1,args=(std_lock,))
+ foo1_thread = foo_1.foo_1(std_lock)
```
```python:foo_1.py
import time
import threading

class foo_1(threading.Thread):
    def __init__(self,std_lock):
        super(foo_1, self).__init__()
        self.daemon = True
        self.std_lock = std_lock
    
    def run(self):
        while True:
            with self.std_lock:
                print("thread name:{0}, ident:{1}".format("foo_1", threading._get_ident()))
            time.sleep(1)
```

```:実行結果
$ python qiita_test.py
thread name:foo_1, ident:140555638449920
thread name:main , ident:140555668420416
thread name:foo_1, ident:140555638449920
thread name:main , ident:140555668420416
thread name:foo_1, ident:140555638449920
thread name:main , ident:140555668420416
^C
```
ドキュメントは英語でもちゃんと読みましょう
apt updateでGPG エラーが出たら

# GPGエラーが出た

`apt update`でパッケージリストをアップデートする際に以下のようなエラーが出ることがある．

```
W: 署名照合中にエラーが発生しました。リポジトリは更新されず、過去のインデックスファイルが使われます。GPG エラー: https://apt.repos.intel.com/intelpython binary/ InRelease: 公開鍵を利用できないため、以下の署名は検証できませんでした: NO_PUBKEY ACFA9FC57E6C5DBE
W: https://apt.repos.intel.com/intelpython/binary/InRelease の取得に失敗しました  公開鍵を利用できないため、以下の署名は検証できませんでした: NO_PUBKEY ACFA9FC57E6C5DBE
```

# エラーの原因

公開鍵を登録していない，もしくは登録していた公開鍵の有効期限が切れたことが原因．
公開鍵を登録さえすれば解決する．

# 解決法

次のコマンドで公開鍵の登録ができる．

```terminal
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys <公開鍵>
```

今回の場合は<公開鍵>の部分に```ACFA9FC57E6C5DBE```を入れれば良い．

## うまく行かない場合

上記のコマンドを打っても下のようにうまく動作しない場合がある．

```
Executing: /tmp/tmp.QDLh95UeD3/gpg.1.sh --keyserver
keyserver.ubuntu.com
--recv-keys
ACFA9FC57E6C5DBE
gpg: 鍵7E6C5DBEをhkpからサーバkeyserver.ubuntu.comに要求
gpg: 鍵サーバのタイムアウト
gpg: 鍵サーバからの受信に失敗しました: 鍵サーバのエラー
```

多くの場合はファイアウォールが原因になっている．

```apt-key adv```は，標準ではポート11371で通信をするため，ファイアウォールにブロックされることがある．

### ポート開放する場合

Ubuntuなら以下のコマンドでポートを開放できる

```terminal
sudo ufw allow <ポート番号>
```

### 通信するポートを変える場合

ポートの開放ができない場合，もしくはポートを開けたくない場合は開いているポートで通信を行う．

```terminal
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:<ポート番号> --recv-keys <公開鍵>
```

<ポート番号>は開いていればどこでも良い．
よく分からなければ，80にしておけばたいてい通る．

# まとめ

```apt update```でGPGエラーが出た場合の解決法をまとめた．
僕がこのエラーに初めて遭遇したときは，ファイアウォールにブロックされていると分かるまでにかなり時間がかかった．
誰かの作業の参考になればと思う．

# 余談

先日，新規マシンの環境構築中にGPGエラーが出た．
公開鍵の期限は切れていないし，ファイアウォールを切ってもつながらない，と色々と原因探しをしていたのだが，よくよく考えてみればLANケーブルを繋いでいなかった．
環境設定，環境構築時には冷静になろう．
flycheck-smlsharpをつくった

2017年末に作っていて記事にしとこうと思ったのに忘れてた。

# GitHubレポジトリ

[flycheck-smlsharp](https://github.com/yonta/flycheck-smlsharp)

# これは何？

![demo](https://raw.githubusercontent.com/yonta/flycheck-smlsharp/media/screenshot2.gif)

EmacsのflycheckでSML#コンパイラを使うパッケージ。
ファイルを保存したときに、SML#コンパイラを呼び出して静的解析の結果を得る。

[flymake-smlsharpを作っているκeenさん](http://keens.github.io/blog/2015/04/23/smlsharpwotsukattesmlnoon-the-flyerrorchekkingu/)がいたので、自分が使っているflycheckでも欲しいと思って作った。

# インストール方法

GitHubを見て。

leaf.elを使ってれば、楽ちんでインストールできる。

```elisp
(leaf flycheck-smlsharp :require t
  :el-get (flycheck-smlsharp
           :url "https://github.com/yonta/flycheck-smlsharp.git"))
```

# 制限

ファイルを変更するたびにflycheckが走る、オンザフライの静的解析を実現できなかった
flycheckはオンザフライのチェックを行うとき、ソースファイルをコピーした一時ファイルを作って静的解析を行おうとする。
一方で、SML#のコンパイラがソースファイルを静的解析するためには、ソースファイル（.sml）以外にもインタフェースファイル（.smi）が必要である。
普通は、このソースファイルとインタフェースファイルの名前が一致する必要がある。[^1]
よって、オンザフライのチェックを実現するには、一時ファイルの名前を取得して、同じ名前のインタフェースファイルをコピーして作る必要がある。
今回はそこまで行っていない。

[^1]: C言語のソースとヘッダーの関係のように、ソースファイルの中で自身のインタフェースファイルの指定もできる。指定がなかった場合は、コンパイラは同じ名前のインタフェースファイルを探す。指定しないほうが他SMLコンパイラとの互換性もあるため、指定してないSML#ソースファイルが多いのが実情である。


# 参考文献

作るにあたって参考にしたサイトや記事など。
これを紹介したくて、この記事を書いた。

- [flycheck公式](http://www.flycheck.org/en/latest/developer/developing.html) -  [Githubソース](https://github.com/creichert/flycheck-sml/blob/master/flycheck-sml.el)
    - flycheckの公式開発ドキュメントとGithubにあるソース。
    - 開発ドキュメントは簡単な例しかなく、Gihubソースのコメントドキュメントを頑張って読んだ。
    - ソースコードが1万行を越えるためか、Firefoxが重たくなるのに耐えながらgrepした。
- [rx EmacsWiki](https://www.emacswiki.org/emacs/rx) - [Github](https://github.com/typester/emacs/blob/master/lisp/emacs-lisp/rx.el)
    - flycheckが使っている正規表現。
    - SRE（S-expression Regular Expression）互換の表現も多い。
    - 独自表現が多く、[途中にある例](https://github.com/typester/emacs/blob/master/lisp/emacs-lisp/rx.el#L56)を参考に手探りで調べた。
- [κeenのHappy Hacκing Blog | Lispエイリアンの狂想曲 - 
SMLSharpを使ってSMLのon-the-flyエラーチェック](http://keens.github.io/blog/2015/04/23/smlsharpwotsukattesmlnoon-the-flyerrorchekkingu/)
    - SML# + flymakeなcheckerを作成している。
    - 基本方針はこれと同じで、SML#コンパイラのオプション機能を利用してつくった。
    - flymakeはコンパイラの複数行メッセージ取得が難しいとのこと。
- [へびやんず・てすと・だいありぃ - Standard ML のコードをリアルタイムにチェックする (Emacs + Flycheck + MLton)](http://hebiyan.hatenablog.com/entry/2016/03/20/145258)
    - MLton + flycheckなcheckerを作成している。
    - flycheckで複数行を取得する方法が**めちゃくちゃ**参考になった。
    - MLtonへの依存があり、MLtonのコンパイル速度が遅いことが問題点になる。
- [nrnrnrさんによるflycheck-sml](https://github.com/creichert/flycheck-sml/blob/master/flycheck-sml.el)
    - MLton + flycheckなcheckerを作成している。
    - へびやんさんより簡易版。
- [flycheck-ocaml](https://github.com/flycheck/flycheck-ocaml)
    - OCamlプログラミングサポートMerlin + flycheckなcheckerを作成している。
    - flycheckの拡張の作り方の大雑把な把握に役立った。

- [みずぴー日記 - SML# + annot: 式の型を表示するコンパイラ拡張をリリースしました](http://mzp.hatenablog.com/entry/2012/07/12/214256)
    - SML#（古い） + 独自elispな型情報出力を作成している
    - SML#コンパイラ自体に工夫を加える必要があるため、コンパイラバージョンアップへの追従が難しい。
    - 型推論結果を使って変数の型を知れるのは強力なため、今後のコンパイラサポートを期待したい。
    - 他にもファイルのアウトラインなど、コンパイラのサポートによって実現できる機能はたくさんあると思われる。
一部のviewでしか、表示させたくないものがあるときの対処法　if

## URLごとに表示を変えたいとき

request.path.include?()を使うと良い。()の中の文字がURLに入っているかいないかを判断する。

```erb

<%if request.path.include?("mypage")%>
　<li class="nav-item active">
　　<%= link_to '「ものを作る」', new_mypage_product_path, class:"nav-link"%>
　</li>
<%end%>
```

参考 https://qiita.com/Yohei_Shiina/items/ed39dfd74895d54f3cf2
AWSのEC2で間違えてインスタンスを終了した話

# インスタンスを終了してしまった
rails sで

>Oops
VFS connection does not exist 

これが出てきたのでAWSのEC2のほうでインスタンスを「停止」しようとしたら間違えて「終了」を押してしまう。

# どうなるか
AWSのサポートに復旧したいと問い合わせてもバックアップがないと無理ですと言われる。
バックアップなどをとっておらず無事に一週間分の作業が消える。
ただただつらい。

# 解決策
バックアップやスナップショットなどをとっておけばよかった。
こまめにcommit , pushをしておけばよかった。




PS.ほかの対処法知っている人いたら教えてください
エンジニア歴5ヶ月の私がここまでよく使っているGitコマンド集

# はじめに
エンジニアに転職して5ヶ月ほど経ちました。
働き始めて思ったのが意外とGUIツールなどを使ってるエンジニアは多いなということなのですが、私は基本的にコマンドのみで作業してますので、これまでに多用しているGitコマンドについてまとめてみました。

## プロジェクト開始

まずはここから。

```
$ git clone ＜クローンしたいリポジトリのURL＞
```

git initする機会はこれまでほとんどありませんでしたので、基本的にここがスタート地点になってます。（まだ、2プロジェクト目くらいですが。。）



##  Pushまでの流れ

``` 
$ git add ファイルパス
```

``` 
$ git add .
```

変更があったファイルをステージングエリアに追加にするコマンドです。言い換えると、変更があったファイルをコミットできる状態にするコマンドということになります。

なのでいくらローカルでファイルを変更しようとgit addしていないとコミットはできません。



git add . はローカルで変更があったファイル全て（gitignoreしているものは除く）を一括でステージングエリアに追加することができます。

これはかなり便利なコマンドになりますが、稀に予期しないファイルを上げてしまう場合もあるので最初のうちは注意が必要かと思います。（僕は2回くらいやらかしました。）



``` 
$ git status
On branch develop
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

	modified:   docker/db/data/ib_buffer_pool

Changes not staged for commit:
  (use "git add/rm <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

	modified:   docker/db/data/ib_logfile0
```

流れ的に次はgit commitっぽいのですが、先ほどの予期しないファイルをコミットしないためにもこのコマンドでコミット前によく確認したりしています。

上がステージングエリア上がっているファイルで、下がファイルの変更はしているがまだgit addされていないファイルになります。

私は心配性のためこのコマンドも多用しています。



``` 
$ git commit -m "コミットコメント"
```

コミットの際のコミットコメントはプロジェクトによって決まりがあったりするので、それに従いましょう。



``` 
$ git push origin 現在のブランチ名
```

上記コマンドでコミットの内容をリモートへと反映させることができます。



``` 
$ git pull origin リモートブランチ名
```

複数人開発の場合、ブランチが日々更新されていくことになりますので、その変更を自分のローカルへと取り込んでいく必要があります。


### コミット漏れに気付いたら

````
$ git commit --ammend --no-edit
````

現在ステージング状態のものを直前のコミットに含めることができます。

あ、ここ修正するの忘れてた、、みたいなときに便利。



````
$ git commit --amend -m "直前のコミットのコメントを修正"
````

おまけでこちらも便利。


### git pullとほぼ同じ

````
$ git fetch
````

````
$ git merge origin/develop
````

最近はgit pullよりこちらを使っています。

ちなみにorigin/developと origin developの違いを最近ようやく理解しました。。

この記事が分かりやすかったです。

https://qiita.com/uasi/items/69368c17c79e99aaddbf


## コミットログ

````
$ git log --oneline
````

gitのログが1行で表示されます。


## ブランチ操作

``` 
$ git branch
* develop
  master
```

``` 
$ git branch -a
* develop
  master
  remotes/origin/HEAD -> origin/master
  remotes/origin/master
```

現在どのブランチにいるかを確認するために使用します。

-a オプションでリモートのブランチも見れます。

このコマンドはかなり多用してます。


````
$ git checkout ブランチ名
````

既存のローカルブランチを切り替えます。



````
$ git checkout -b 新しいブランチ名
````

ブランチを新しく作成してそちらに切り替えます。



````
git branch -D ブランチ名
````

ブランチを削除します。



````
$ git checkout -b develop origin develop
````

リモートのdevelopブランチを元に新しくローカルブランチを作成します。

なんかローカルでわけわからなくなったときに一旦ローカルを無かったことにして作り直したりしてました。笑



## 退避

````
$ git stash
````

コミットはせずに現在の作業を退避させるときに利用します。

かなり使います。

````
$ git stash -u
````

ちなみにこのオプションをつければ追跡してないファイルも含めて退避させることができます。便利！

````
$ git stash list
````

現在避難させているリストを確認できます。

````
$ git stash pop
````

その中から一番最近のものを復活させ、そのstashしているリストの中から削除します。



````
$ git stash apply
````

こちらは復活させてかつstashしているリストにも残したままにしておきます。

stashは結構たまるので私はpopの方をよく使います。


## おまけ

VSCodeの場合はGit GraphやGitLensなどのおすすめプラグインがあるので、この辺入れておくと色々と助けになってくれるかと思います。
【Rails6】Webpacker::Manifest::MissingEntryErrorが出たときの対処法

# はじめに
Rails6ではwebpackerが標準サポートとなりました。webpakerのインストールにはパッケージマネージャーであるyarnを使用します。そのため，yarnが正常にインストールされていない環境でwebpakerをインストールしようとするとエラーが生じます。

・yarnの「パッケージのバージョンが不一致」によるエラーの解決方法について説明します。

その他のエラーに関しては，@NaokiIshimuraさんの以下の記事で詳しく説明してくれています。
・[Rails6 開発時につまづきそうな webpacker, yarn 関係のエラーと解決方法](https://qiita.com/NaokiIshimura/items/8203f74f8dfd5f6b87a0)

#開発環境
Rails 6.0.1

#エラー
`rails webpacker:install`を実行後 log には "Webpacker successfully installed" と表示されていたのですが，javascriptを使用するページにローカルサーバーでアクセスすると以下のようなエラーが出ました。

```
ActionView::Template::Error (Webpacker can't find application in /Users/username/projects/my_app/public/packs/manifest.json. Possible causes:
1. You want to set webpacker.yml value of compile to true for your environment
   unless you are using the `webpack -w` or the webpack-dev-server.
2. webpack has not yet re-run to reflect updates.
3. You have misconfigured Webpacker's config/webpacker.yml file.
4. Your webpack configuration is not creating a manifest.
Your manifest contains:
{
}
):
     7:      <meta name="viewport" content="width=device-width,initial-scale=1">
     8: 
     9:     <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %>
    10:     <%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' %>
    11:   </head>
    12: 
    13:   <body>
```

以下のコマンドをRailsアプリのディレクトリ内で実行しましたがうまくいかず...

```
yarn　　　　　　 # 解決しなかった

yarn install　 # 解決しなかった

yarn upgrade　　# 解決しなかった
```

#解決方法

ホームディレクトリ内でyarnを最新のヴァージョンに更新

```
brew install yarn
```

その後，アプリディレクトリ内で

```
rails install yarn
```

エラーが出なくなりました！
初心者によるプログラミング学習ログ 185日目

#100日チャレンジの185日目

twitterの100日チャレンジ#タグ、#100DaysOfCode実施中です。
すでに100日超えましたが、継続。

100日チャレンジは、ぱぺまぺの中ではプログラミングに限らず継続学習のために使っています。

185日目は

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">おはようございます<br>185日目<br><br>webサイトコーディング課題<br>最近やっていなかったvue.jsをudemyでさらっと復習<a href="https://twitter.com/hashtag/100DaysOfCode?src=hash&amp;ref_src=twsrc%5Etfw">#100DaysOfCode</a> <a href="https://twitter.com/hashtag/%E9%A7%86%E3%81%91%E5%87%BA%E3%81%97%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%A8%E7%B9%8B%E3%81%8C%E3%82%8A%E3%81%9F%E3%81%84?src=hash&amp;ref_src=twsrc%5Etfw">#駆け出しエンジニアと繋がりたい</a> <a href="https://twitter.com/hashtag/%E6%97%A9%E8%B5%B7%E3%81%8D%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8?src=hash&amp;ref_src=twsrc%5Etfw">#早起きチャレンジ</a></p>&mdash; ぱぺまぺ@webエンジニアを目指したい社畜 (@yudapinokio) <a href="https://twitter.com/yudapinokio/status/1206302185601916928?ref_src=twsrc%5Etfw">December 15, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
v-bindでaタグの属性値を動的に表現する。 ❏Vue.js❏

`v-bind:属性="データのプロパティ"`とかで動的に表現できるみたい。

しかも`:属性="データのプロパティ"`と省略可。

<br>
実際に見ていくぅ！

開発環境はJSFiddle
https://qiita.com/ITmanbow/items/9ae48d37aa5b847f1b3b

```html:html
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>

<div id="app">
  <a :href="url">google</a>
</div>
```

```javascript:javascript
new Vue({
  el: "#app",
  data: {
    url: "https://google.com"
  }
})
```

【出力結果】
`google`
クリックするとちゃんとgoogleに飛びます。

#複数の属性を指定したい場合

`【結論】オブジェクトを渡してあげる。`

```html:html
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>

<div id="app">
  <a v-bind="googleObject">google</a>
</div>
```

```javascript:javascript
new Vue({
  el: "#app",
  data: {
    googleObject: {
      href: "https://google.com",
      id: 3
    }
  }
})
```

idが3でgoogleに飛ぶaタグが完成します。

以上！

<br>
ではまた！
いつか都会に出たときに思い出すポモドーロ

「知ってる知ってる。ポモドーロテクニックっていう時間管理術があるって。
25分集中、5分休憩のあれでしょ？別に集中できてるし鬱陶しい、いらないわ」

そんな時もありますよね、でもいっつもそうではないはず。いろんな仕事がたくさんあって集中できない、手探りで進めなければならない、などなど

そんな人に向けて、最近思い出したように始めてみたポモドーロで1日が充実してきた話。

## きっかけ
1. 転職直後で、覚えなければならないことが多い
2. ドキュメントやソースコードから様々な情報を整理していかなければならない
3. わからないことが多く気分的にあまり進んでる感じがしない
4. あんまり集中できてる気がしない
5. 現在の状態と状況をハッキリ言語化できず、漠然と危機感を覚える
6. 時間区切ってみっか

## とりあえず、ダウンロード
これがシンプルでいいなぁ。

> tomato one
https://apps.apple.com/jp/app/tomato-one-free-focus-timer/id907364780?mt=12

## さっそく使ってみる
それにあたって、自分ルールを決めてみた
### ルール
1. slackで本日のスレッドを立て、25分ごとにやったこと、次やることを書いていく
2. 気になったことなどはノートにメモ
3. 1日の最後に、何にどのくらい使ったか実績をだす

これを2週間続けてみた。


## 効果
- 目的意識を持って25分に取り組むようになる
- 休憩の5分で前25分を振り返り、次の一手を決めるようになる
- だらっと数時間たってしまった、ということがなくなる
- 作業ログを見ればどのように1日を過ごしたかがわかる。
- 見積もりに対する実績のズレが見えてくる

結果、あまり集中できず、不満足な1日は少しずつ減ってきたように感じます。
それは自分がやっていることがハッキリ見えるようになったからなのではないでしょうか。

まだまだ発展途上なあなた、
8時間しかない労働時間が濃いか薄いか。
まずはそれをハッキリさせるところから始めてみませんか？
CodeDeployとGitHubの認証方法

以下のようなエラーが出たが、言われていることは定番なのに、意外と解決まで時間かかったのでまとめておく。

## 出たエラー

```
Could not download bundle at 'https://api.github.com/repos/[company_name]/[private_repo]/tarball/[commit_id]' after 3 retries. Server returned codes: 404 'Not Found'; 404 'Not Found'; 404 'Not Found'; 404 'Not Found'.
```

こんな感じ。
CodeDeploy Agentの中や、CodeDeploy>デプロイ>[デプロイID]>イベントログの中から見える。

エラーの意味としては、GitHubのプライベートレポジトリを見る権限がなかったので、ソースコードを引っ張ってこれなかったということ。

## やったこと
今回は退職者のGitHubアカウントにアクセストークンが紐付いていたことに気が付かず、そのアカウントをOganazationから外してしまったという初歩的な原因。なので、それを作り直してあげた。

## 手順
### 1. GitHubでキーの作り直し
会社の管理アカウントにログインします(もしくは、ログインできる人にこの手順1だけお願いします)。
キーを作るURL
https://github.com/settings/tokens

そうするとこんな画面が出るので、右上をクリック
<img width="1041" alt="スクリーンショット_2019-12-16_20_10_15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74581/0e93b5aa-b809-3850-3858-7e7103ee8683.png">

次にアクセスを許可する範囲を設定します。
とりあえず一番上のフルアクセスなら問題ないですが、ちゃんとしたい人は何を許可すべきかしっかり確認してください。
アクセスの範囲設定は、キーを作成後でも修正できますので、最初はフルアクセスで一旦許可して、最後に調整することをおすすめします。
<img width="1085" alt="スクリーンショット 2019-12-16 20.10.45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74581/17937cca-313b-14d7-e2e6-ba8a4b0177ca.png">

アクセス範囲が決まったら、「Generate token」という緑のボタンを押して、キーの作成が完了です。


### 2. CodeDeployに1で作ったキーを設定する
CodeDeployのアプリケーションの作成方法は公式が詳しく説明してくれているので、こちらを参考にしてください。
https://docs.aws.amazon.com/ja_jp/codedeploy/latest/userguide/deployment-steps-server.html

このGitHub連携のところが私は詰まりました。7番目の手順！！
https://docs.aws.amazon.com/ja_jp/codedeploy/latest/userguide/integrations-partners-github.html#github-behaviors

私がやったのは7-1。(どれやればいいんだ..って悩んだのは私だけでしょうかw)
> GitHub アカウントに対する AWS CodeDeploy アプリケーションの接続を作成するには、ウェブブラウザの別のタブで GitHub からサインアウトします。[GitHub token name (GitHub トークン名)] に、この接続を識別する名前を入力し、[GitHub に接続] を選択します。アプリケーションの GitHub を操作することを CodeDeploy に許可するよう求めるメッセージがウェブページに表示されます。ステップ 10 に進みます。

この、 **「ウェブブラウザの別のタブで GitHub からサインアウトします。」** というのがめちゃめちゃ重要です！！
ログアウトしていないと、自分のGtiHubアカウントに紐付いてしまうので、ログアウトしないといけないんですね。
よくわかってなくて、キー入れるところあった！って思ってホイホイやったら、自分に紐付いて二の舞になるところでしたｗ

じゃあログアウトしちゃって、どうレポジトリの内容持ってくるんだ？ってなるんですが、そこで1で作ったトークンの出番です！
1で作ったキーを入力してReturnすると、別ウィンドウでAWS CodeDeployの認証を求める画面が出てきます。
これを承認すると、1でキーを作ったアカウント(会社の管理アカウント)にログインしてなくてもCodeDeployを許可することになります。
(もう承認しちゃって画像なくてごめんなさい。。)

これで連携が完了したので、デプロイできるか試してみてください〜

この設定は1つのCodeDeployアプリケーションに対して1回だけで良かったはずです！
同じレポジトリの同じ権限設定のもので良ければ1つのキーを同じように使っちゃっても大丈夫だと思います。
違うレポジトリ内容の場合は違うキーにした方が安全かな〜って個人的には思っていますが、運用の兼ね合いだと思うので臨機応変に設定してみてください。

## まとめ
ちょーカンタンにですが、CodeDeployのエラーはあまり記事がないので、書いてみました！とても少数派だと思いますが、誰かの役にたったらラッキーです :pray: 
最近はAWS公式のドキュメントがどんどんアップデートされるので、諦めずに覗いてみるのがいい感じだなって思っています。
RUNTEQ入学前にやっておいた方が良いこと

RUNTEQのカリキュラムは難しいので`事前にやっておいた方が良い内容`を記載します。
分量が多いですがこの内容をある程度やれると、
RUNTEQの課題で苦しまずに`スムーズに突破`できるかと思います。

## 入学者のレベル

[RUNTEQブログ](https://blog.runteq.jp/runteqnews/2150/)でも紹介されている通り、下記の教材で一通り学習した方が多いです。
・`Railsチュートリアル`
・`現場で使える Ruby on Rails 5速習実践ガイド`（以下、現場Rails）

しかし、いきなりこれら2つに取り組むと挫折してしまう方もいると思うので、
対象者別に`何から始めれば良いか`個人的な意見を記載します。

## 対象者
A. 他のプログラミングスクールなどでRubyやGitでの開発経験がある
B. SIerなどのIT業界でJavaやGitでの開発経験があるが、Rubyの開発経験はない
C. 完全未経験

## 対象者別

#### A. 他のプログラミングスクールなどでRubyやGitでの開発経験がある
Ruby on RailsやGitでの開発経験がある方は`Railsチュートリアル`や`現場Rails`の内容を見て、
不明点がないかどうかを確認してください。

Railsチュートリアルでは`MiniTest`でのテストコード実装があります。
RUNTEQでは`RSpec`という別のテストフレームワークを利用するので、そこまで学習していなくても問題ありません。

現場Railsでは`1~7章`までの内容は押さえておいてください。

#### B. SIerなどのIT業界でGitやJavaなどの経験があるが、Rubyの開発経験はない

現場Rails`1章`にRubyの文法についての解説があるので、不明点がないかを確認してください。
知識不足を感じた場合は、
「`たのしいRuby`（`15章Hashクラス`まで、難しい部分は飛ばしてOK）」等の書籍でRubyの基礎を習得してください。

問題がなければ、現場Rails`2~4章`のRailsでのアプリケーション開発やRailsチュートリアルに挑戦してください。

Railsにまだ馴染みがなければ、現場RailsではViewテンプレートに`slim`を使用しているので、Railsチュートリアルの`2章、7章`などの`erb`での開発を先に経験した方が良いかもしれません。

・`Linuxコマンド`（cd, mkdir, rm, pwdなど）に馴染みがなければ、`LPICレベル1`の参考書を見てみるのも良いと思います。

#### C. 完全未経験
基礎的な内容から学習して行きましょう。
・ Progate（入門用。特に`コマンドライン、HTML・CSSコース`）
・ ゼロからわかるRuby超入門（`ほぼ全て`のページが対象）
・ たった2日で楽しく身につく HTML/CSS入門教室
・ プロになるためのWeb技術入門（Webアプリケーションの仕組みを理解）
・ たのしいRuby(`15章Hashクラスまで`、難しい部分は飛ばしてOK)
・ スッキリわかる SQL 入門（DB、テーブル作成、レコード内容更新・削除まで）
・ Udemy Git： もう怖くないGit！チーム開発で必要なGitを完全マスター（不定期でセールあり）
https://www.udemy.com/course/unscared_git/

これらのWeb, SQL, Git, Rubyの内容が理解できたら、
Railsチュートリアルの`1~7章`で`erb`によるRailsアプリの作成を経験してください。
Railsチュートリアルは`8章以降`の`認証系の話`から内容が難しくなります。
一度、現場Railsの`1~4章`を学習した後、残りの章に取り組むことをお勧めします。

## 共通の注意事項

RubyやRails、SQLの学習をする際は、実際にコマンドを実行して挙動を確かめてください。
これをするとしないとでは理解度に差があります。

MacBookではTerminalを開き、Rubyであれば`irb`などでコードを実行しましょう。

[![Image from Gyazo](https://i.gyazo.com/ca1fa02d40a7be238b1f275ea2d397f8.gif)](https://gyazo.com/ca1fa02d40a7be238b1f275ea2d397f8)

作成したRailsアプリでは`rails console`で`User`と`user`のクラスやメソッドを確認したり、親クラスを確認するとイメージがつきます。

[![Image from Gyazo](https://i.gyazo.com/4af6ffa6426122bee7d6014be3886034.gif)](https://gyazo.com/4af6ffa6426122bee7d6014be3886034)

また`binding.irb`でデバッグし、各処理においてその時点で扱っているオブジェクトの内容が何かを確認してみましょう。
[![Image from Gyazo](https://i.gyazo.com/155072bc4c9b718a958288a0bd6dabfd.gif)](https://gyazo.com/155072bc4c9b718a958288a0bd6dabfd)

## 番外編

### CSS構成
下記のブログ記事が非常に参考になります。
[CSSができる人とできない人では何が違うのか？(レイアウト編)](https://blog.mitsuruog.info/2018/03/how-to-learn-css-1/amp/index.html)

### gem jbuilder
`rails generate controller(or scaffold)`コマンド実行時に、`jbuilder`がGemfileに記載されているとJSON形式での出力処理を記載するので、コードがやや複雑になります。
初学者の方はこのgemをGemfileから削除して`bundle install`を再実行してから`rails generate`を実行することをお勧めします。

### MacBook
`そもそもMacがない`という方は、買いましょう。
MacbookProでもAirでも好きな方で大丈夫です。
メモリは`16GB`にした方が良いです。
キー配列は日本語でも英字でも好みで大丈夫です。
blueloungeのフリップスタンドは買った方が良いです。

### MacOS
最新のOSより、1つ前の安定版を使った方が良いです。
2019年12月時点では`Catalina`より`Mojave`をお勧めします。

### Vim
テキストエディタは`Atom`や`VSCode`や`SublimeText`など何を使用しても大丈夫ですが、
`Vim`というヒトカゲルートを進みたい方はTerminalで`vimtutor`と入力してください。
`j`や`k`キーを押してドキュメントを読んで強くなってください。

### Silicon Valley
エモいので`Prime`で観ましょう。
作って理解するOS_メモリ管理の仕組み(3章まとめ)

メモリの管理機能についてメモ
#メモリの種類
**ROM**...Read Only Memoryの略。消去不可と消去可がある。
**RAM**...Random Access Memoryの略。揮発性のデータを保持。
#キャッシュ
学習前の理解で合ってるので略
#セクション
プログラムが、その内容ごとに分けられる単位。大きく分けてProgram(コード), Const(更新されないデータ), Data(変数的な), BBS(初期値未設定の変数)。最初の２つはROM。

#メモリの効率的な利用方法
##メモリホール
複数のプロセスを連続してメモリに展開すると、最初はいいが、特定のメモリの終了や新たなメモリの開始に伴って、使用されない（最小のメモリ領域を要求するプロセスでも展開不可能な）メモリ領域ができてしまう。これを**メモリホール**という。
##論理アドレスと物理アドレス
同じアドレス（論理アドレス）を指定しているつもりのプロセスでも、実際にはOSによって割り当てられた、プロセス固有の物理アドレスが利用される。そのアドレス変換は**MMU(Memory Management Unit)**によって行われる。
##ページとページ変換
MMUがアドレス変換を行う範囲のことを**ページ**と呼び、アドレス変換はページ単位で行われるので、**ページ変換**とも呼ぶ。どのページの、どのオフセットへ変換されるかはページ（変換）テーブルとビットマスキングで実現される。
#仮想メモリ
すべてのメモリ領域に対してページを割り当てると、もうそれ以上できることがなくなってしまうので、ここで**仮想メモリ**を考える
**ページアウト**...メモリに空きがない状態でページフォルトが発生すると、OSはメモリに空き容量を確保するため、使用頻度の少ないページを選択し、外部記憶装置に保存
**ページイン**...対照的に、外部記憶装置からページデータをメモリへコピーすること
これらにより、実際には確保されていないページでも、外部記憶装置への一時保存を通せばのページを仮想的に拡張していることになる（実は使いまわしてるだけだけと理解）
デザインに心がないエンジニアがOOUIの手法を使ってデザインをし直してみた

## OOUIとは

OOUI（Object Oriented User Interface）、つまり、オブジェクト指向ユーザーインターフェースのことです。

詳しくは[上野学さん](https://twitter.com/manabuueno)の[OOUI – オブジェクトベースのUIモデリング](https://www.sociomedia.co.jp/7279)の記事を読んでください。

実例、歴史、手法まで紹介されています。

今回はこちらの記事に則って、開発中のアプリケーションを見直していきたいと思います。

## 現在の状態

、、、。笑

<img width="810" alt="Screen Shot 2019-12-03 at 11.01.58 PM.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261934/b3653ea4-efec-0d1c-12d4-8e504a8f8a0f.png">

一応、単語帳アプリなんですが、見て分かる通り、デザインに心がないのがバレバレですね。
基本的には、単語帳のリストがあって、選択すると単語カード画面になるようなもので、もちろん編集機能などをそなえているものを作成予定。

## KAIZEN手順

1. オブジェクトの抽出とスコープ定義
2. ビューの定義と設計
3. レイアウトとインタラクションの設計

### KAIZEN1 オブジェクトの抽出とスコープ定義

> UIのモデリングにおいては、ユーザーが意識している／意識すべき概念だけを定義できればよいでしょう。
 
> オブジェクト（エンティティ）を抽出するためには、ユーザーがそのドメインで何をどのように行なっているかや、業務の内容（事業に対する位置付け、役割、フロー、入出力される情報など）をよく把握していなければなりません。

#### ユーザが意識すべき概念の列挙

- 単語帳を選ぶ
- 単語帳を作成する
- 単語帳を編集する
- 単語帳を削除する
- 単語カードを見る
- 単語カードを裏返す
- 単語カードを暗記済みにする
- 単語カードを作成する
- 単語カードを編集する
- 単語カードを削除する

#### 「何をどのように」の列挙

先程列挙したものを名詞（青）、動詞（赤）に色付けして、名詞ごとに分類しました。
<img width="445" alt="Screen Shot 2019-12-04 at 12.06.07 AM.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261934/666bd3f6-ea32-5a5c-9484-0ac544a0e2ab.png">

### KAIZEN2 ビューの定義と設計

オブジェクトとビューの関係を見直しました
<img width="536" alt="Screen Shot 2019-12-04 at 12.27.30 AM.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261934/33371e9d-d5f8-0dfe-6209-f90edcef8b37.png">

## 最終的に、、、

こうなりました！（いいのかどうかはわからない、、）
<img width="593" alt="Screen Shot 2019-12-16 at 6.23.23 PM.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261934/e329d559-2729-b355-d3e4-39dc6499a1de.png">

### 変更点として、、、

単語一覧Viewが単語Viewの前になりました。
→単語帳を手にとった時も、単語の全体感があって、ざっとある中からここから始めようとかの動作の流れになるんじゃないかなと思ってます。

単語編集画面を削除しました。
→同じ対象のオブジェクトに対して、見るっていう動作と編集する動作って画面を分ける必要がないんじゃないかなって思いました。

## 参考記事
[OOUI – オブジェクトベースのUIモデリング](https://www.sociomedia.co.jp/7279)
[オブジェクトベースなUI設計を学んだら視点がガラリと変わった話](https://note.com/utaroriginal/n/n5b1d15d0ab71)

勝手ながら、ジャカルタでTwitter経由でお声がけいただき、とてもわかりやすいスライドでデザイン素人の私に丁寧に教えていただいた [yutaroMurakami さん](https://twitter.com/WeiweYu)にはとても感謝しています。

## 最後に
デザイン部分は普段は関わらないド素人です。
見様見真似でやらせていただいたので、色々教えて下さい。どしどし待ってます。
(reason: Address already in use)エラーで怒られた話。

今回、自分用のメモとして書きますので、悪しからず（笑）<br>

### はじめに
PHPのビルトインサーバーを起動しようとしたところエラーが出ました。
きちんとプロセスを終了しないで、別のプロジェクトに入ってしまったため、プロセスが残ってしまったのが原因のようです、、、気をつけなくちゃ。

### 実行したこと
```
$ php -S localhost:ポート番号 -t ./
```

↓ターミナルで実行したら、下記の文言のエラーが出ました。

### エラーの内容

```
Failed to listen on localhost:ポート番号 (reason: Address already in use)
```
ポート番号がすでに使われているよ！！と怒られてしまいました、、
## 解決方法

```
$ lsof -i:ポート番号
```
特定のポート番号で実行中のコマンドを調べるコマンドです。
or

```
$ ps -f
```
これで自分が実行しているプロセスの一覧が表示されます。

上記のどちらかをターミナルで実行後すると該当のポート番号のPIDが確認できます。
確認ができたら、下記のPIDの箇所に置き換えて実行。




```
$ kill -9 PID
```
-9は、強制終了のオプションです。
ポート番号がしっかりKillできたことが確認できたら、再度サーバーを起動する。


```
$ php -S localhost:ポート番号 -t ./
```

サーバーが起動できたら、実際に確認してみてください。

```
http://localhost:ポート番号
```


多分、サーバー起動できていると思います。

### まとめ
今回、初めて書きました。自分用で残すことにしましたが、もし同じようなエラーがでた方の助けに少しでもなれば嬉しいです。また、誤字、脱字がありましたら、ご指摘のほどよろしくお願い致します。
【Vue.js】Vue-CLI(4.1.1)でSCSSを読み込む手順

## はじめに
Vue-CLIを使ってSCSSファイルを読み込むための記事は数多くヒットするのですが、古い情報も多いです。

そのため、自分が**Vue-CLI 4.1.1**でうまくいった手順を残しておきます。

## この記事が役に立つ方
- Vue-CLI4.1.1でSCSSを読み込みたい方

## この記事のメリット
- 無事SCSSが読み込めるようになる

## 環境
```yaml
OS: macOS Catalina 10.15.1
zsh: 5.7.1
Vue: 2.6.10
vue-cli: 4.1.1
```
## 手順
### 1.新規プロジェクト作成
まずはVue-CLIで新しく生成します。

今回プロジェクト名は**test**とします。

※長ったらしくなりますが、一応全て載せておきます。

```
$ vue create test
```

```
Vue CLI v4.1.1
? Please pick a preset: 
  MyStandard (node-sass, babel, router, vuex, eslint) 
  default (babel, eslint) 
❯ Manually select features 
```

```
? Check the features needed for your project: 
 ◉ Babel
 ◯ TypeScript
 ◯ Progressive Web App (PWA) Support
 ◉ Router
 ◉ Vuex
❯◉ CSS Pre-processors
 ◉ Linter / Formatter
 ◯ Unit Testing
 ◯ E2E Testing
```

```
? Use history mode for router? (Requires proper server setup for index fallback in product
ion) (Y/n) y
```

```
? Pick a CSS pre-processor (PostCSS, Autoprefixer and CSS Modules are supported by default
): 
  Sass/SCSS (with dart-sass) 
❯ Sass/SCSS (with node-sass) 
  Less 
  Stylus 
```

```
? Pick a linter / formatter config: (Use arrow keys)
❯ ESLint with error prevention only 
  ESLint + Airbnb config 
  ESLint + Standard config 
  ESLint + Prettier 
```

```
? Where do you prefer placing config for Babel, ESLint, etc.? 
❯ In dedicated config files 
  In package.json 
```

```
? Pick additional lint features: (Press <space> to select, <a> to toggle all, <i> to inver
t selection)
❯◉ Lint on save
 ◯ Lint and fix on commit
```

```
? Where do you prefer placing config for Babel, ESLint, etc.? 
❯ In dedicated config files 
  In package.json 
```

最後の設定保存はお好みで良いと思います。

---
### 2.SCSSファイルの用意

ここからはこの記事の通りに実施でOKでした。（助かりました！）
[Vue CLI 3でグローバルなSCSSを読み込ませる - Qiita](https://qiita.com/pinalto/items/d2eeda06d49740d905ca)

SCSSの構成は、今回説明用なのでかなりシンプルにしておきます。

#### メイン
`test/src/assets/sass/main.scss`

#### 変数定義・mixinなど直接スタイル定義しないもの
`test/src/assets/sass/prepends.scss`
 
---
### 3.`main.js`に追記

```javascript:main.js
require('@/assets/sass/main.scss')
```
`main.scss`を読み込みます。

---
### 4.`vue.config.js`を作成

```shell
touch vue.config.js
```
`test`ディレクトリ直下に移動し、`vue.config.js`を作成します。

※`package.json`があるディレクトリです。

---
### 5.`vue.config.js`に追記

```javascript:vue.config.js
module.exports = {
  css: {
    loaderOptions: {
      scss: {
        prependData: '@import "./src/assets/sass/prepends.scss";'
      }
    }
  }
};
```
こちらに`prepends.scss`を読み込みます。

---
### 6.`yarn serve`

```shell
yarn serve
```
`vue.config.js`に追記した後はビルドし直す必要があります。

**以上です！**
これで無事にSCSSが読み込める状態になっているはずです:point_up:



## おわりに
最後まで読んで頂きありがとうございました:bow_tone1:

どなたかの役に立てれば幸いです:relaxed:

## 参考にさせて頂いたサイト（いつもありがとうございます）
[Vue CLI 3でグローバルなSCSSを読み込ませる - Qiita](https://qiita.com/pinalto/items/d2eeda06d49740d905ca)
日本語ファイル名を含む Mercurial リポジトリの Git リポジトリ移行

今動かしてみたらエラーになる。
あるえ？

---

Bitbucket が Mercurial のサポートをやめるので、もろもろの Mercurial リポジトリを Git リポジトリへ変換しています。
ただ、convert だと日本語ファイル名を含む Mercurial リポジトリを Git リポジトリに移行するとファイル名が文字化けするので、そうならないように以下の手順で移行しました。 Thanks [@shuichigoto](https://twitter.com/shunichigoto)
MSYS をインストール済みで、MSYS のコンソールを起動するものとします。
MSYS コンソール起動後、以下のコマンドを実行。

```
pacman -S python2 python2-pip
pacman -S msys/libcrypt-devel
pip2 install mercurial
mkdir hg2git
cd hg2git
git clone https://github.com/frej/fast-export
mkdir togit
cd togit
git init
../fast-export/hg-fast-export.sh -r /path/to/Mercurial/repo --force --fe cp932
```
パッケージマネージャーYarn


![スクリーンショット 2019-12-12 17.21.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/446210/5a91c2b9-40b9-8bdd-48f2-dccf4c8383c4.png)


**Yarn**はFacebook、Google、Exponent、Tildeによって開発された新しい**`JavaScriptパッケージマネージャー`**で、Yarn開発者が直面したnpmの問題解決を目的としているらしい。


##まずHomebrewをインストール

Homebrewとは、Macのためのパッケージ管理システムです。
パッケージ化されている様々な便利な機能をインストールして使えるようにしたり、そのパッケージがバージョンアップされたら新しいバージョンに更新したり、いらなくなったらそのパッケージをアンインストールしたりすることができます。


### インストール手順

[Homebrew](https://brew.sh/index_ja)を開きます。
![スクリーンショット 2019-12-16 16.03.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/446210/fa165353-6e88-d168-e793-cdabaab98aa3.png)

ターミナルを開き、コマンドをコピーして、実行します。

ダウンロードが完了したら、下記コマンドでインストールされたか確認しましょう。

```
brew --version
```

```
Homebrew ◯.◯.◯
```

上記の様に表示されれば、インストール完了。


## yarn をインストール

```
brew install yarn
```

```
yarn -v
```

インストールできていることを確認。

package.json からパッケージをインストールすることができます。
cd コマンドで package.json と同じ階層へ移動し、以下のコマンドを実行します。

```
yarn
```

もしくは

```
yarn install
```

## npm とは

Node.jsのパッケージを管理するもの
Node Package Manager の略

### node.js とは

JavaScriptは本来クライアントサイドで動く言語。HTMLで書かれたページに動きをつけたりする。
Node.jsはサーバサイドで動くJavaScriptである。

### packageとは

npmが管理するpackageとは、Node.jsの予め用意された便利な機能をまとめたもの。
ライブラリみたいな感じ。




##参考

[Yarn：Facebook発のパッケージマネジャーはnpmに代わるスタンダードになるか](https://www.webprofessional.jp/yarn-vs-npm/)

[Yarn の使い方。インストールの方法から使い方まで解説します。](https://original-game.com/yarn-how-to-use/#m_heading-0)
gitで特定のファイルを直接コミットする。addなしで

`git commit .gitignore` のように、`git commit ファイル名`とすることで、
addによるステージングなしで直接コミットできます。
設定ファイルを少し書き換えたときに便利です。

gitのmanに記載がありますが気付きませんでした。
Scrapyはいいぞぉって話

## はじめに
こんにちは。この記事は、[MYJLabアドベントカレンダー16日目](https://qiita.com/advent-calendar/2019/myjlab)です。
2日連続なので息切れ気味ですが、はりきって僕の推しツールを布教したいと思います。
前回の記事では分析環境である[JupyterLabの紹介](https://qiita.com/marutaku0131/items/9881d0430462e655a701)をしました。本当にいいツールなのでぜひ使ってください。今日は分析に入る前の段階、データ収集で使うツールについて紹介をします。

## スクレイピング・クローリングについて
皆さんは、機械学習などでデータを収集する時にどのような手段でデータを収集してくるでしょうか？ 個人で開発しているとデータを買うわけにもいかず、かといって自分で一からデータを作ることもできません。僕の場合は、データに困ったらとりあえずスクレイピングするようにしています。  
[スクレイピング](https://ja.wikipedia.org/wiki/%E3%82%A6%E3%82%A7%E3%83%96%E3%82%B9%E3%82%AF%E3%83%AC%E3%82%A4%E3%83%94%E3%83%B3%E3%82%B0)とは、Webページ上から必要な情報を抽出する技術のことです。類似の技術にクローリングがありますが、人によってスクレイピングとクローリングの差はまちまちです。本記事では、以下のように分類します。

* **クローリング**: リンクを辿ってWebページにアクセスする技術
* **スクレイピング**: Webページから必要な情報を抜き出す技術


通常、抜き出したい情報が１つのWebページで完結することはないので、クローリングとスクレイピングは一緒に行うことがほとんどです。例えば、マルコフ連鎖で嘘ニュースを作るためにYahooニュースのデータを収集したいとします。
Yahooニュースのページは主に２つのページに分類できます。

1. ニュース記事を一覧表示するページ
2. ニュースの詳細を表示するページ

全てのニュースを収集したい場合は、以下のような処理をします。

1. ニュース記事の一覧表示ページを取得
2. 一覧表示ページからニュース詳細を表示するページのリンクを取得
3. 2で取得したリンクにアクセス
4. 必要な情報を取得する
5. 2〜4を繰り返す

この処理を行うことで欲しいニュースの情報を取得することができます。しかし、これらの作業をコードにすると雑魚エンジニアの僕は中々に可読性の低いコードを生み出してしまいます。しかも、クローリングで意識しなければいけないことはこれだけではありません。

* リクエスト失敗時に時間をあけてリトライを行う
* robots.txtで決められているスクレイピングしてはいけないページを避ける
* 取得した情報をデータベースやAWS s3に保存する
* 取得した画像はリサイズしてから保存したい
* サーバに負荷をかけないように時間を空ける
* でもドメインが違うなら同時リクエストしたい
* JavaScriptをレンダリングしてからスクレイピングしたい
* その他多数

これらのことを意識しながらコードが綺麗に書けるほど僕はできたエンジニアではありません。
しかし、こんな悩みは**Scrapy**があれば簡単に解決します。


## Scrapyについて
[Scrapy](https://docs.scrapy.org/en/latest/)とは、Pythonでウェブクローリングとウェブスクレイピングをするためのフレームワークです。監視から自動テストまで行えるすごいやつです。
上で挙げたようなクローリング・スクレイピングのめんどくさい処理を勝手にやってくれます。さらにスクレイピングするためのコードの雛形も自動で作ってくれるので、統一感のある(?)コードを書くことができます。

## Scrapyの仕組み
正直、Scrapyの使い方は[Tutorial](https://docs.scrapy.org/en/latest/intro/tutorial.html)を見てもらうのが一番早いので、割愛します。ここでは、個人的に分かりづらかったScrapyの仕組みについて頑張って説明したいと思います。
Scrapyは以下のような仕組みで動いています。

[![Screenshot from Gyazo](https://gyazo.com/e2954a386344f0c1a065b4e0bc384a21/raw)](https://gyazo.com/e2954a386344f0c1a065b4e0bc384a21)

この図だと少し分かりづらいと思うので頑張って説明します。
Scrapyは主に6つのパーツから成り立っています。

### Engine
Engineは、Scrapyのデータの流れを制御する役割を担っています。Scrapyはイベントドリブンなネットワークプログラミングフレームワークであるtwistedで書かれています。engineは特定のアクションが発生した時にイベントをトリガーします。

### Scheduler
Schedulerは、エンジンから受け取ったリクエストをためていおいてタイミングをコントールするパーツです。上の図では、②③⑧がschedulerの仕事になります。

### Downloader
Downloaderの仕事は、Webページを取得し、それをEngineを通じてSpiderに渡すことです。Webサイトへのアクセスは必ずこのDownloaderを通じて行われます。

### Spider
Spiderは、開発者が主に手を加えるパーツで、要素の抽出や保存などを行います。ScrapyはItemという単位でデータを管理していて、SpiderのなかでItemオブジェクトを返せばデータの保存が始まり、Requestオブジェクトを返せば再度クローリングをします。

### Item pipeline
Item pipelineは、Spiderで抽出されたアイテムを処理する役割を担っています。アイテムをMySQLに保存したり、クレンジングするのはItem pipelineの役割です。

### Middleware 
Middlewareは、各パーツ間でのやりとりの間に位置しているパーツです(上の図では紺色のパーツ)。Middlewareは、Download MiddlewareとSpider Middlewareの二種類があり、それぞれで役割が違います。

## 終わりに
まとまりのない記事になってしまいましたが、Scrapyをなんとなく感じていただけたら幸いです。他にもScrapyには便利な機能がたくさんあるので、興味をもったら是非調べてみてください。
Pythonクローリング＆スクレイピング 第4章まとめ

#はじめに
「Pythonクローリング＆スクレイピング［増補改訂版］データ収集・解析のための実践開発ガイド」の学習まとめ
今回の第4章は「実用のためのメソッド」という章題でクローラーを作る際の注意点などを中心とした内容だった

#4.1 クローラーの特性
##4.1.1 状態を持つクローラー
- ログインが必要なサイトをクロールする場合はCookieに対応するクローラーを作る
 - PythonのRequestsライブラリはSessionオブジェクトを使うことでCookieをサーバーに自動で送信してくれる

- Referer
  - 一つ前に閲覧したページのURLをサーバに送るためのHTTPヘッダー
  - (例)Googleの検索結果からQiitaにアクセスしたときにChromeの検証ツールで確認するとこんな感じになってる
<img width="778" alt="referrer.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253705/769bbe79-1ebd-483f-d1ee-611beed070b1.png">

## 4.1.2 JavaScriptを解釈するクローラー
SPA(Single Page Application)として作られたサイトなどをクロールするにはJavaScript
を解釈する必要がある。そのためにはSeleniumやPuppeteerなどのブラウザを自動操作するためのツールを使う
また、ChromeやFireFoxなどのブラウザにはGUIなしで実行できるヘッドレスモードがあり、クローラの作成に役立てることができる

## 4.1.3 不特定多数のWebサイトを対象とするクローラー
Googlebotとかのこと。特定のサイトを対象とするクローラーよりも難易度が高い。
ページ構造に依存しない仕組みが必要。

#4.2 収集したデータの利用に関する注意
##4.2.1 著作権
クローラーを作成するときに注意するべき著作権→複製権・翻案権・公衆送信権
`2009年の著作権法改正によって、情報解析を目的とした複製や検索エンジンサービスの提供を目的とした複製・翻案・自動公衆送信が、著作権者の許諾なく行えるようになってい`る
##4.2.2 利用規約と個人情報
サイトの規約を守ろうねというお話。
個人情報については個人情報保護法にもとづいて管理する。

#4.3 クロール先の負荷に関する注意
クロール先に負荷をかけない方法について。
[岡崎市立中央図書館事件 - Wikipedia](https://ja.wikipedia.org/wiki/岡崎市立中央図書館事件)
こんな事件があったとは
##4.3.1 同時接続数とクロール間隔
- 同時接続数
 - 最近のブラウザあ1ホストあたり最大6の同時接続を張るが、クローラーは長時間複数のページを取得するのでこれよりも減らすべし
- クロール間隔
 - 慣例的に1秒以上の間隔を設けるのが望ましい。例：国会図書館の運用するクローラー
 - RSS・XMLなどのHTML以外に情報を取得する手段がある場合はそちらを使用する。

##4.3.2 robots.txtによるクローラーへの指示
- robots.txt
 - Robots Exclusion Protocolという標準化された形式でクローラーへの指示(ディレクティブ)を記述する
 - Pythonの標準ライブラリurllib.robotparserにはrobots.txtパースするためのRobotFile
Parserクラスがある
- robots metaタグ
 - HTMLのmetaタグにクローラーへの指示を記述する`<meta name="robots" content="<属性の値>">`
 - 属性の値にはページ内のリンクをたどることを許可しない`nofollow`,保存することを許可しない`noarchive`,検索エンジンにインデックスを許可しない`noindex`がある

いつもスクレイピングさせていただいているnetkeibaさんに関してはrobots.txtもmetaタグでの指示も特にないっぽい

##4.3.3 XMLサイトマップ
クローラーにクロールしてほしいURLを指示するXMLファイル
リンクを辿ってクローリングするより効率的
robots.txtのSitemapディレクティブに記述する

##4.3.4 連絡先の明示
クローラーが送信するリクエストのUser-AgentヘッダーにメールアドレスやURLなどの連絡先を記述することができる

##4.3.5 ステータスコードとエラー処理
クロール先に余計な負荷をかけないためにもエラー処理が重要
エラーが出たときにリトライする場合にはリトライ間隔を指数関数的に増やすなどの対策をする
エラー処理は定型的な記述が多いが、tenacityというライブラリを使うことで簡潔に記述することができる

#4.4 繰り返しの実行を前提とした設計
##4.4.1 更新されたデータだけを取得する
- HTTPのキャッシュポリシー
   - HTTPサーバーはレスポンスにキャッシュに関するヘッダーをつけることでキャッシュポリシーを細かく指定することができる
   - これらのヘッダーは「強いキャッシュ」「弱いキャッシュ」の2種類に分けられる。
        - 強いキャッシュ→Cache-Control(キャッシュしてもよいか、など細かい指定)、Expires(コンテンツの有効期限)クライアント側はキャッシュが有効な間はリクエストを送らない。有効期限中はキャッシュされたレスポンスを使う。
        - 弱いキャッシュ→Last-Modified(最終更新日),ETag(識別子)クライアント側は毎回リクエストは送るが、更新されていない場合はキャッシュされたレスポンスを使う。
   - PythonではCacheControlというライブラリでキャッシュに関する処理を簡潔に扱える `pip install "CacheControl[filecache]"`


##4.4.2 クロール先の変化を検知する
- 正規表現でバリデーションする
- JSON Schemaでバリデーションする
    - Pythonではjsonschemaというライブラリを使うことで、JSON SchemaというJSON形式でバリデーションのルールを記述をすることができる`pip install jsonschema`

こういった方法で変化が検知できた場合、メールで通知するなどしてクローラーを終了させる。
#4.5 まとめ
省略

#おわりに
やる気が出ずに投稿間隔が空いてしまいましたが、とりあえず生存確認がてら(?)の記事ということで
stylusで乱数を生成する方法と、特定の範囲内で値を返す関数

タイトルの通りだけど、なかなか見つけられなかったので、メモ

## stylusで乱数を生成
これは簡単で、

```
  transform translateX(unit(floor(math(0, 'random') * 3), "px"))
```

例えば上のように書くと、
`translateX`の値が0~2pxの間で出力される。
ちなみに`math(0, 'random')`で0~1未満の数値がランダムで生成されて（JSの`Math.random()`と同じ）
それに3を掛けたものを stylusの`floor()`関数で小数点以下切り捨てている感じ。
最後にunit関数でpxを後ろに繋げている。ちなみに`+ 'px'`とかやってもエラーになる。


## 特定の範囲内で値を返す関数の作り方
上が分かれば、こんな物が作れる

```
random(min, max)
  return floor(math(0, 'random') * (max - min + 1) + min)
```

これで、3~10の間で乱数を生成したければ、

```
.test
  $x = unit(random(3,10), 'px')
  transform translateX($x)
```

とすれば、
コンパイルされて

```css
.test
  transform: translateX(4px);
```

となる。

参考：https://github.com/stylus/stylus/issues/876
linuxでサスペンドシャットダウンスリープできないとき

# 参考

[プロのためのLinuxシステム構築・運用技術](https://amzn.to/3dcqsjp)

#(12/18)linuxを入れ直して色々いじってるうちにまただめになったので考察
**考察その１**
ログアウトするときにセッションを保存するが、その際に何らかの理由でセッションを保存できないプログラムがある。サスペンド失敗するときは決まってsleepサービスがActive状態にある。つまりセッションの保存がうまく行かなかったときにsleepサービスがActiveになる。
**考察その２**
purgeをしたときに、セッション管理に重要な何かも一緒に削除してしまった。怪しいなと思うのが、自動開始アプリケーション(デーモン）だ。NVIDIAのグラフィック系かネットワーク系のデーモンのような気がする。
**考察その３**
すこし様子をみて回復の見込みがなさそうなときは、linuxカーネルをいじることにする。


# いろいろ試しましたが、linuxカーネルを一つずつ下げて確認していく方法がベストかと思います。


```terminal:UbuntuにはGUIでカーネルをインストールできる便利なukuuというツールがあるのでいれる。
sudo apt-add-repository -y ppa:teejee2008/ppa
sudo apt update
sudo apt install ukuu
```




# エラーログをみる
`/var/log/syslog `の該当の時刻をみれば一発でわかるとおみます。

以下、シャットダウンエラーです。

```
Dec 16 17:09:34 PC kernel: [22044.679009] traps: xfsm-shutdown-h[10988] general protection fault ip:7f199cbaf98d sp:7ffdd3909ed0 error:0 in libc-2.27.so[7f199cb18000+1e7000]
```


# sudo systemctl suspendもできないとき
つぎのようにしかられます。

```
Failed to suspend system via logind: There's already a shutdown or sleep operation in progress
```
すでにシャットダウンかスリープが実行してるという意味。これはどういうことか。

そこで`systemctl`コマンドでsleepユニットの状態を確認する。


```
systemctl list-unit-files | grep sleep
> sleep.target
systemctl status sleep.target
>Loaded: loaded (/lib/systemd/system/sleep.target; static; vendor preset: enabled)
   Active: active since Mon 2019-12-16 19:47:47 JST; 20min ago
     Docs: man:systemd.special(7)
```

statusがアクティブならsleepをオフにする。

```
sudo systemctl disable sleep
```

これでsleepできると思う。

```
sudo systemctl suspend
```

# 答え
`xfce4-power-manager`と`light-locker`が原因でした。light-lockerの不具合でディスプレイがオフにならずsuspend処理が中断するようです。ほかにやることがあるので、とりえあえずこれで良しとした。

```
sudo apt purge xfce4-power-manger light-locker
```

# それでもだめならこうだ
Linuxカーネルが強制終了します。サスペンドができないということはシャットダウンも恐らくできないでしょうから、このコマンドで必ず再起動することができます。**コマンドを行う前に未保存のものがないか必ず確認してから行ってください。**

```
su
echo 1 > /proc/sys/kernel/sysrq
echo c > /proc/sysrq-trigger

```


# また駄目になった(12/17)
archlinuxのbbsでlinuxカーネルを更新したらsuspendできなくなったという人がいるようなので
、これはカーネルの問題なのかもしれない。
https://bbs.archlinux.org/viewtopic.php?id=250863
1対nのcsvを1対1に変換するシェルスクリプト

```
1,hoge,hoge,....
2,fuga,fuga,....
3,piyo,piyo,....
```

みたいなcsvを

```
1,hoge
1,hoge
.....
2,fuga
2,fuga
.....
3,piyo
3,piyo
```

みたいに置き換えます。

```shell:sample.sh
cat $1 | while read line
do
arr=( `echo ${line} | tr -s ',' ' '` )
for ((i=0; i < ${#arr[@]}-1; i++)) {
  echo "${arr[0]},${arr[$i+1]}"
}
done
```

↑のsample.shをどこかに保存して、実行してcsvファイルか何かに吐きだしてあげればOKです。
実行コマンドはこんな具合に。

```shell:実行
$ sh sample.sh hoge.csv >> fuga.csv
```
pythonのrandomモジュールで相性判定プログラムを作る。

#はじめに

###これは、初心者による遊びです。

気軽に読んでみてください。

今回は、ネットでよく見かける気になるあの子との相性を判定するプログラムを作ってみました。


#プログラム作成
それでは作っていきます。

今回目指すのは、「判定したい2人の名前を入力し、その2人の相性を％であらわす」というものです。

％表示の部分にrandomモジュールを使用します。

このモジュールには0以上1未満の乱数を表示するrandom機能があります。今回はこれを使用します。

プログラムの動きを簡単にまとめると、以下のようになります。
①2人の名前を入力してもらい、それを受け取る。
②乱数を使って、％に変換
③結果を出力

これらをプログラムに直すと以下のようになります。

```Python
import random#randomをインポート
male = input('男性の名前を入力してください: ')#①
female = input('女性の名前を入力してください: ')#②

p = random.random()#②
p = p*100#②
p = int(p)#%％表示の小数点以下を切り捨て
print(male,'と',female,'の相性は、',p,'％です')#③
```
これにて完成です！！

ちなみに、これを実行すると以下のような画面になります。
![python画像.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547733/4293670c-4226-52d1-e567-1159fab47ae7.png)

太郎、ドンマイ。

#終わりに
今回は、ネットにもよくある相性判定プログラムを作ってみました。

今回作ってみてわかったことは、めちゃくちゃ簡単なプログラムで作られているということと、こんな簡単なプログラムでも、人を一喜一憂させられることができるということですね～。


最後まで読んでいただきありがとうございました！！！
何かアドバイスなどあればコメントお願いします！！！
App Services と SNAT


この記事は [Microsoft Azure Tech Advent Calendar 2019(https://qiita.com/advent-calendar/2019/microsoft-azure-tech) の16日目の記事です。今回はよくご質問を頂いた1つであるApp Services と SNATについて記載します。

#####よくあるご質問
App ServicesからSQL Database や他のサービスへの接続がタイムアウトした、もしくはパフォーマンスが低下する問題が発生した。アプリケーション側は何も変更していないのになぜこうした事象が発生するのか。

##### 原因
SNATポートの枯渇を引き起こし、外部への通信ができないため。

#####SNATとその動作
App Servicesのアプリケーションは1つ以上のApp Serviceワーカー インスタンスによってホストされています。このワーカーインスタンスに対して、インターネットIPアドレスは割り当てられておらず、外部IPアドレスに接続するためには、スタンプ (App Service を構成する各ロールインスタンスをホストする、ゲストOS の集合体) のロードバランサーを利用してネット ワークアドレス変換（SNAT）を実行する必要があります。

以下のようなイメージです。
App Service のWorker Instance <-> Load Balancer <-> Internet、外部サービス

Azure の Outbound connections
https://docs.microsoft.com/ja-jp/azure/load-balancer/load-balancer-outbound-connections

App Service から外部への接続に関して、同じ宛先に対して複数の通信が発生する場合、それぞれの通信にてSNATポートが使用されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309963/ec43902b-145e-f131-49f2-92b3ee82a0c1.png)

もし、複数の通信が発生した場合でもそれぞれ異なる宛先となる場合には1つのSNATポートが共有されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309963/b07a0b9f-c8b2-c502-a7ba-66e917908531.png)

SNATポートは各スタンプごとに65536個と制限があり、他のお客様と共有されています。
現在の仕様では、SNATポートは各インスタンスごとに128個まで確保され、その後、必要に応じてベストエフォートにてSNATを確保しようとします。
しかしながら、確保できない状況となった場合、外部への接続が失敗する状況となります。

#####対処
一時的にでも問題の解消が必要な場合には、以下の対処策が有効になることが考えられます。

・スケールアウト（インスタンスごとのSNATポートが確保できるから）
・ASEを利用する（専有環境であり、他のお客様の影響を受けることなくSNATポートを確保できるから）

もし継続して発生する場合には、コネクションプールを用いてSNATポートの利用数を再現する、HttpClientオブジェクトを再利用するようにアプリケーション側の変更が必要です。

なお、現時点にてSNAT数を確認できるメトリック情報は公開されていません。
ただし、該当App Service の「問題の診断と解決」から 「TCP Connections」を確認することで、各インスタンスごとのOutbound Connections数が確認可能です。こちらを基におおよその状況は確認できるため、もし外部サービスへの接続失敗など発生した場合には、確認してみて下さい。


#### 参考URL
以下の記事にてより詳細な動作が記載されています。参考させていただいたので、ご紹介させて下さい。

HttpClientをusingで囲わないでください
https://qiita.com/superriver/items/91781bca04a76aec7dc0

SNAT with App Service
https://4lowtherabbit.github.io/blogs/2019/10/SNAT/