OmniAICreator/Qiita-1.07M huggingface dataset:
6月６日授業課題2

#今回はオブジェクトについてあまり理解出来ていないカプセル化についてしらべました。

#カプセル化とは
カプセル化とは、オブジェクトの持つ任意のメンバーを隠ぺいすることです。
これによって、オブジェクトを利用する側は、オブジェクトの詳細な処理の内容を
意識することなく、そのオブジェクトのインターフェイスだけを利用すること。

#カプセル化をする目的
オブジェクトを使用する側はそのオブジェクトを使用するためのインターフェイスとなるメンバーのみを意識するだけでよく。それによって、オブジェクトの直感的に理解することができたり本来アクセスしてはいけないメンバーを間違って使用するなどを防止することができます。
オブジェクトの状態を正常に保ち続けたり処理の内容を変更したとき、その影響を受ける範囲を特定することができたりします。

#ポイント
1.オブジェクト指向の中核概念その1: 実装の隠蔽（カプセル化）。

2.外（クラス利用側）から見た振る舞いと中身（実装側）はわけて考える。

3.中身は隠す（利用者に見せない）。
pythonで3ヶ月前の1日を取得

苦手だったpythonでの日時操作に少し慣れてきたのでメモ。timedeltaではmonthの加減ができないらしく、`import time`と`datetime.fromtimestamp(time.mktime(hogehoge))`つかってる記事をたくさん見かけたが、以下でいけるんじゃないの？

# と、その前に超基本のnow()とtoday()

```python
import datetime

today = datetime.datetime.today()
print today.year # 2017
print today.month # 8
print today.day # 10

now = datetime.datetime.now()
print now.hour # 8
print now.minute # 44
print now.second # 55
pirnt now.microsecond # 665

```

# もっと基本: 日時オブジェクトの作成

```python
import datetime

d = datetime.datetime(2017, 8, 10)
print d # 2017-08-10 00:00:00

t = datetime.time(12, 33, 59)
print t # 12:33:59

```

# これも基本: timedelta
timedeltaオブジェクトはdatetimeオブジェクトの差で生成される。日、秒、マイクロ秒のデータが内部的に保存されており、days, seconds, microsecondsメソッドを使用することにより情報を取得することができる。**年や月は保存されていない。**

```python
import datetime

d1 = datetime.datetime(2017, 8, 10)
d2 = datetime.datetime(2017, 8, 1)
diff = d1 - d2
print diff.days # 9

dt = datetime.timedelta(days=9)
d3 = d1 - dt
print d3 # 2017-08-01

```

# 本題: 3ヶ月前の初日を取得
`today = datetime.datetime.today()`ってしといて`datetime.datetime(today.year, today.month - 3, 1)`でええんちゃうん。

```python
import datetime

today = datetime.datetime.today()
three_months_ago = datetime.datetime(today.year, today.month - 3, 1)

```

こっちのほうが簡単だと思うんだけどな〜

# おまけ: strftime
datetimeオブジェクトを文字列にする場合にstrftimeを使うみたいだけど0が省略されないので嫌だ。

```python
import datetime

today = datetime.datetime.today()

print today.strftime('%y年%m月%d日'） # 2017年08月10日

print str(today.year) + '年' + str(today.month) + '月' + str(today.day) + '日' # 2017年8月10日

```
Lumberyardに触れる(2)-インストール編

※2018年1月18日時点の情報です

[← Lumberyardに触れる(1)-Lumberyard紹介編](https://qiita.com/OrotiYamatano/items/e612ddb8608301f09361) 　　　　　[Lumberyardに触れる(3)-文字表示編 →](https://qiita.com/OrotiYamatano/items/e1c6cfd60fc72ac70b18)
#はじめに
このLumberyardに触れるでは
実際に触ってどの様にしてゲームを作る事が出来るか学んでいきます。
下の物を実際に作成して行こうと思います。
ビルドは行わず既存のもので作成していきます。

タイトル表示(文字表示、スタートフラグ)
↓
キャラクターを操作して目的地まで行く(キーボード検出、マウス検出)
↓
クリア文字表示(クリアフラグ)

#インストール手順
公式サイトからダウンロードする。
(2018年1月18日時点バージョンは1.12.0.1)
https://aws.amazon.com/jp/lumberyard
![image.png](https://qiita-image-store.s3.amazonaws.com/0/173560/b45fd6f9-711f-f7d9-af4b-ed3c51310892.png)

下のようなエラーが出る場合もありますが多分問題ないので続けます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/173560/b0d47aba-f285-fe7a-20ec-f121a7a08cb4.png)

Lumberyardエディターをクリックすると、
米Amazonアカウントの入力を求められるので作成し、ログインする。

完了
![image.png](https://qiita-image-store.s3.amazonaws.com/0/173560/edb9433b-62d3-7eb5-6076-664093480a35.png)

#レベル作成
レベル、Unityで言うところのプロジェクトを作成していきます。
Newから新規作成する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/173560/295b17c3-05a5-4f2b-f159-f269e2f5dabc.png)

適当なレベル名と地面を使うのでUseTerrainにチェックを付けて地形を生成します。
今回は1メートル＝1テクセル、マップ広さは512*512メートルにします。OKして次へ。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/173560/ddd78fcd-c16b-96bd-e0ee-2ad1154a975d.png)

1テクセルあたりのピクセル数を決めます。
1テクセル1024*1024に今回はしておきます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/173560/4282388d-12b9-2394-2e1b-25045348939d.png)
作成できました。
しかし、今回必要のない海が出来ていますので消します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/173560/d08e8f1d-a015-3eb9-c0f9-349ec8a9cf3b.png)

#海を消す
Tools>Terrain Editorをクリック

![image.png](https://qiita-image-store.s3.amazonaws.com/0/173560/be6543c3-f392-0ebc-2d22-c43f9adfe59d.png)

Modify>Remove Oceanをクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/173560/38ec0b48-efc0-4975-d43a-644168063c16.png)

消えました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/173560/f904194c-e92f-7d4f-00c3-f0d13c6b6aa6.png)

#機能説明
##操作画面

![image.png](https://qiita-image-store.s3.amazonaws.com/0/173560/44265e9a-6fb9-4e32-f089-e262d894d622.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/173560/78489bd1-7d1e-2ed4-5061-9af7c2da6c80.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/173560/624f340b-3d07-b38d-0320-4df70f5b7bc5.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/173560/4e4c40c4-c8b3-b8f1-1fcf-26a7037c555d.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/173560/eb4b0517-8094-46f8-07f9-995847ee275e.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/173560/a52f8024-22b0-4e9d-be91-860d34f3ea0b.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/173560/b020707c-d8cf-d3b8-5f2e-daec9a04c827.png)

ゲームビューの操作は、ほぼFPSゲームと同じように操作ができます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/173560/932d0035-b712-4885-9609-48b7db37ab3b.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/173560/8f682a8c-b740-2dca-0248-65fadc2a90b8.png)

#今回のまとめ
インストールからレベルの作成までを行いました。
次回は文字の表示を行っていきます。
C#のアクセス修飾子について少し勉強しました

#はじめに
このブログは授業で受けた内容のまとめや感想などを書いています。

今回はC#のアクセス修飾子について調べて書いた記事になります。

---
#項目
・まずクラスって何？
・アクセス修飾子

---
#まずクラスって何？
クラスとはC#でとても重要になってくるもので、フィールドとアクション(メソッドや関数メンバ)を一つの単位にとしてまとめているデータ構造です。
基本的にクラスごとに機能(オブジェクト)を作り、それを組み合わせて、一つのプログラムになっていきます。

---

#アクセス修飾子
アクセス修飾子は、メンバーのアクセスを制限するときに使います。
アクセス修飾子は大きく分けて５つあります。

**`public`**
publicはアクセス制限がないアクセス修飾子です。なので、誰でもアクセスできます。

**`protected`**
protectedは継承したクラス限定でアクセスできるようになる修飾子です。

**`internal`**
internalはこの型と同じアセンブリに属しているクラスのみアクセスできる修飾子です。

**`protected internal`**
protected internalはこの型と同じアセンブリに属していて尚且つ継承したクラス限定でアクセスできる修飾子です。上の二つを合わせているだけですね('ω')ノ

**`private`**
privateは自身のメンバのみアクセスすることができます。

---

#最後に
アクセス修飾子はまだあまり使えてないので。今後触っていき、どの場所でどのアクセス修飾子を使えばいいか分かるようになればいいなと思っています(*´Д｀)
pythonで電話番号を正規表現で

スクレイピングしてきたraw_htmlから電話番号を抜き出すときの正規表現。いわゆる通常の000−000−0000というような3桁3桁4桁のハイフンありだけでなく、、、

- 00-0000-0000
- 0000-00-0000
- 0120-000-000

更には、

- (00)0000-0000
- (0120)000000

のような、ハイフンの代わりに（）であったり、ハイフンがなかったりのパターンにも対応する。

# コード

```python
import re

url = 'http://www.hogehoge'
result = urlfetch.fetch(url)
raw_html = result.content

pattern = r'^\d{2,4}-|)|）\d{2,4}-\d{3,4}'
tel_number = re.findall(pattern, raw_html)
```

普通の電話番号、フリーダイヤル、FAXがリストになって返ってくるのでどうやって電話番号だけにするかが課題。最初に電話番号、TEL、フリーダイヤルとかで`split`しておけばいいんじゃなかろうかと思われる。**（このままではハマる。下のハマったを参照。）**

# エラー対応
## `error: unbalanced parenthesis`
`pattern = r'^\d{2,4}-|)|）\d{2,4}-\d{3,4}'`の半角括弧閉じをエスケープしないとダメ
`pattern = r'^\d{2,4}-|\)|）\d{2,4}-\d{3,4}'`でOK。
ていうか、`[-)）]`ってすればエスケープいらない。**最終的にはバックスラッシュ必要だった。ハマったの最後を参照。**
[Unbalanced parenthesis python](https://stackoverflow.com/questions/10318248/unbalanced-parenthesis-python)

# ハマった
`pattern = r'^\d{2,4}[-)）]\d{2,4}-\d{3,4}'`から苦闘した。
## `^`つけっぱ事件
`raw_html`が`??0120-000-000`なのにずっと先頭に`^`をつけっぱで検出できずムダにハマった。馬鹿ですね。

## `[-)）]`が上手くいかない
全角かっこのとじる「）」を検出できない。トチ狂って`[-)）]*`を`.*`としてみた。
当然、`ダイヤル（0120）000-000　電話（03）0000-0000`は`0120）000-000　電話（03）0000-0000`と抜き出される。
あれ？なんで？？みたいな。
さらにさらに、最後に`$`をつけるという極めつけ。結果は変わりません。

## `raw_html`を半角に変換する

```python
import re
import unicodedata

url = 'http://www.hogehoge'
result = urlfetch.fetch(url)
raw_html = unicodedata.normalize('NFKC', result.content)

pattern = r'\d{2,4}[-)]*\d{2,4}-\d{3,4}$'
tel_number = re.findall(pattern, raw_html)
print tel_number
```

`ダイヤル（0120）000-000　電話（03）0000-0000` -> `03）0000-0000`
なんだかいいカンジになってきた。`$`が邪魔して、フリーダイヤル部分が取れてないので`$`をとる。

## 全角カッコをunicodeで書いてみる
ログに`u'0120\uff09000-000\u3000\u96fb\u8a71\uff0803\uff090000-0000'`を発見。もしかして。。。

```python
pattern = r'[(\uff08]{0,1}\d{2,4}[-)\uff09]{0,1}\d{2,4}-{0,1}\d{3,4}'
```

で、いけるんじゃね？ -> ダメ。
`\`でエスケープしたりいろいろ試したけど、結局`unicodedata.normalize('NFKC', hoge)`で半角にして処理することにした。

## 最終的なコード（正規表現部分のみ）

```python
pattern = r'[(]{0,1}[0-9]{2,4}[)-(]{0,1}[0-9]{2,4}[)-]{0,1}[0-9]{3,4}'
```

1. `\d`は[0-9]に変更。`\d`は知ってればわかるけど一見何なのかわからないので。
2. 00(0000)0000に対応。

そうすると`raise error, v # invalid expression`。。。どこがエラーなのか？

```python
pattern = r'[\(]{0,1}[0-9]{2,4}[\)\-\(]{0,1}[0-9]{2,4}[\)\-]{0,1}[0-9]{3,4}'
```

[]内の), -, (にバックスラッシュを入れて解決。
`ダイヤル（0120）000-000　電話（03）0000-0000` -> `[u'(0120)000-000', u'(03)0000-0000']`
めでたしめでたし。

# おまけ: ループを回すときはコンパイルしておく

```python
pattern = re.compile(r'hogehoge')

for i in iter:
    # do something
    tel_number = pattern.findall(raw_html)
```

こうしておくと速いらしい。

# 参考
[メールアドレスから電話番号まで！知っておきたいPHP正規表現６選](https://blog.codecamp.jp/php_regular_expression)
[Pythonの正規表現の基本的な使い方](http://uxmilk.jp/41416)
urlfetch.fetchで取得したcontentの文字コード

`urlfetch.fetch(url)`でGETしたレスポンスを`.content`すると文字化けしていて日本語でスクレイピングできない。そんなときどうするか？

1. contentの文字コードを特定する。
2. urlfeth.fetchのheadersを指定する。
3. unicodeにdecodeする。

# 文字コードの特定
ChromeでURLを開いてConsole -> Networks -> Response HeaderでContent-Typeを確認。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/160946/84452273-fe61-4957-972f-e90cf632fe03.png)

# headersの指定
Content-Typeをそのままコピペ（当然、クォーテーションは自分で入れる）。上の場合の文字コードはEUC-JPだった。

```python
import urlfetch

response = urlfetch.fetch(
    url=url,
    headers={'Content-Type': 'text/html; charset=EUC-JP'})
```

# decodeする
この場合、`response.content`の文字コードはEUC-JPなのでunicodeにデコードすればスクレイピングがうまくいく。

```python
raw_html = response.content  # このままだとEUC-JP
raw_html = response.content.decode('euc-jp')  # これでunicodeになる。
```

# Encode, Decodeについてようやく理解した
`.encode`, `.decode`の引数に`unicode`が出てくることはない。つまり、文字コードはunicodeを中継して変換することになる（ということにして理解した）。

encodeはunicodeを引数の文字コードにする。
unicode -> utf-8 : `text.encode('utf-8')`
unicode -> euc-jp : `text.encode('euc-jp')`

decodeは引数の文字コードをunicodeにする。
utf-8 -> unicode : `text.decode('utf-8')`
euc-jp -> unicode : `text.decode('euc-jp')`

エンコードしたらstr（'hogehoge'）で、デコードしたらunicode（u'hogehoge'）で文字列操作すれば良い。

# 参考
[Pythonで日本語文字列 (UnicodeとUTF-8, Shift-JIS, EUC-JPなどの相互変換)](http://blog.livedoor.jp/yawamen/archives/51566670.html)
Windows 10 > vmx86を停止する > net stop vmx86

```txt:動作環境
Windows 10 Pro (64bit) バージョン 1803 (April 2018 Update)
```

VMWare workstationのバグにより、vmx86を停止する必要がある。

PowerShell(管理者権限)にて下記コマンドでvmx86を停止できるようだ。


```
>net stop vmx86

VMWare vmx86 サービスは正常に停止されました。
```
AWS Summit 2018 Tokyo AWS のEdgeネットワーク入門 のメモ

基本的に [他のサイト] (https://dev.classmethod.jp/cloud/aws/awssummit-2018-day2-h1-1-17-aws-edge-network/) のほうが詳しいので、個人的に注目したポイントだけ記載。
## エッジロケーションとは
リージョンとは別で、世界に幅広く展開をしている高速レスポンスを実現するための拠点

## Cloud Frontとは
大容量キャパシティをもつ地理的に分散したサーバー群からコンテンツをキャッシュしたり代理配信をするサービス
- ユーザーに物理的距離が一番近いロケーションからWebコンテンツを返す
- エッジサーバーでコンテンツのキャッシングを行いオリジン(元のWebサーバ)の負荷をオフロード
- デフォルトで AWS Shield が導入されている。(DDoS攻撃対策)
Nuxt.jsでVue carouselを使用した時に画像が読み込めない解決策

## 結論
- CarouselとSlideをそれぞれ別箇にimportする

## 発生した問題

Guide通りにComponentをimportしてslideタグ内に画像を挿入すると
`ReferenceError: document is not defined`
が発生する。

```vue
<template>
    <div>
        <carousel>
            <slide>
                <img src="@/assets/image/sample1.jpeg">
            </slide>
            <slide>
                <img src="@/assets/image/sample2.jpeg">
            </slide>
        </carousel>
    </div>
</template>

<script>
import { Carousel, Slide } from 'vue-carousel';
export default {
  ...
  components: {
    Carousel,
    Slide
  }
  ...
};
</script>
```

## 解決法
Carousel・SlideそれぞれのComponentをそれぞれ別箇にimportする

```vue
<script>
import Carousel from 'vue-carousel/src/Carousel.vue'
import Slide from 'vue-carousel/src/Slide.vue'
export default {
  components: {
    Carousel,
    Slide
  }
}
</script>
```
jsとpythonのディープコピー

JSのオブジェクトが参照渡しであることに知らずにハマったあと、Pythonでも参照渡しでループを回してlistの要素が全て同じ、みたいな事例に出くわしたので整理のために書いておく。

# JSでハマったコード
mapDataをLeftとRightとで別に持ちたかったが、GETするたびにresultが更新される → 参照渡しなので、LeftもRightも同じになってしまっていた。

```javascript:
// 以下、ajaxでGETしたときのコールバック
svg = _setSvgArea( id );

if ( id == "#mapLeft" ) {

  // 1. _getJapanMapがオブジェクトを返す。
  mapDataLeft = _getJapanMap( result, JAPAN_MAP );

  } else if ( id == "#mapRight" ) {

  // 2. もう一回GETすると、resultが更新されるとmapDataLeftも更新されてしまう。
  mapDataRight = _getJapanMap( result, JAPAN_MAP );

};
```

## jQueryの$.extendで解決。

```javascript
mapDataLeft = $.extend(true, {}, _getJapanMap( result, JAPAN_MAP ) );
```

# pythonで出くわしたコード
この場合はループの中の`column`が参照渡し先。`medicine['medicine_name']`などで値を更新すると、前のループで`append`した`column`まで更新されてしまう。

```python
for medicine in medicines:
  column = GET_MEDICINES_MESSAGE['column']
  column['text'] = medicine['medicine_name']
  columns.append(column)
```

## copyモジュールのdeepcopyで解決。

```python
from copy import deepcopy
.
.
for medicine in medicines:
  column = GET_MEDICINES_MESSAGE['column']
  column['text'] = medicine['medicine_name']
  columns.append(deepcopy(column))
```

# 結局は、どういうときにディープコピーが必要になるのか？

~~**変数や関数でつくったオブジェクト（辞書）**をループで回すなど繰り返し処理するときにディープコピーを使う。~~
**変数や関数でつくったオブジェクト（辞書）**をループで回すなど繰り返しで値を代入するときにディープコピーを使う。
授業学習　課題

#今回は継承についてまとめました

#継承（インヘリタンス）
継承とは、既に存在するクラス（基本クラス）を継承して、新しいクラス（派生クラス）を作成できる機能です。これによって、派生クラスは基本クラスを持つ機能を継承することができます。

#スーパークラス
スーパークラスとは、オブジェクト指向においてクラスの親子関係が成り立つ場合の親側のクラスのことである。


#派生クラス
サブクラスとは、オブジェクト指向において、クラスの親子関係が成り立つ場合の子側のクラスのことである。

#継承関係とは

継承関係の例として、「人間」と「学生」という2つのクラスについて考えて見ましょう。

「学生」は「人間」の一部です。 すなわち、「学生」ならば必ず「人間」としての特徴を備えています。 それとは逆に「人間」だからといって必ずしも「学生」であるとはいえません。 つまり、「学生」は「人間」の特別な場合である(「人間⊃学生」という包含関係が成り立つ)といえます。

例えば、「人間」には「名前」、「年齢」などの属性があります。 (ここでは簡単化のためこの2つの属性のみを考えます。) 「学生」は人間の一部分ですから、当然この2つの属性を備えています。 それに加え、「学生」は「学籍番号」という属性を持っています。

このように、あるクラス A がクラス B を包含するような関係にあるとき、 この関係を継承関係と呼び、 「B は A を継承する」とか「B は A から派生する(導出される)」といいます。 また、このとき、クラス A のことを「基底クラス（base class）」 または「スーパークラス（super class）」と呼び、 クラス B のことを「派生クラス（derived class）」 または「サブクラス（sub class）」と呼びます。

[参考にしたサイト](http://ufcpp.net/study/csharp/oo_inherit.html)
YAMAHAルーター rtx830がv6プラス（map-e）に対応したのでONU直下に配置してみた

# 序章
うちでは去年からDMM光のv6プラスを使っているのですが、対応しているルーターが少なく、止むを得ずONU直下にI-O DATAのWN-AX1167GRを挟んで使っていました。
こんな感じ↓。（WN-AX1167GRはWIFIすべて切ってただ挟むだけの運用）

|ONU| - |WN-AX1167GR| - |RTX1200| - |wifiルーター| - |PC|


ただ、YAMAHAルーターでも非公式の方法でV6プラスに対応できるらしいのですが、セッション数が劇的に減ってしまうなど制限があるらしく諦めていました。（ブラウザでタブ開くなどたくさんセッション貼られるようなことが出来なくなってしまう）

# 本題
ですが、[先月5/24にv6プラス対応のRTX1210/RTX830用ファームウェアが公開](https://cloud.watch.impress.co.jp/docs/news/1123742.html)されたとのことで少々遅れてしまったのですが早速試してみることにしました！

ここで一つ問題が。私は昔からRTX1200を使っており、RTX1200にも同様のファームウェアが来ていたので設定できるだろうと思い込み、v6プラス方式の設定をあれこれ試行錯誤してみるもなぜかエラーが。。
いろいろ調べてみるとどうやらRTX1200は[map-e方式は対応していないとのこと。](https://www.yokoweb.net/2016/10/09/yamaha-rtx1200-ipv6/)
買い換えろということか…ということで急遽RTX830を購入！4万円の出費でしたがI-O DATAをネットワークから排除するためには致し方なし（RTX1210は流石に高くて断念(T_T)）

ちなみに、まだv6プラスはWebコンソールのGUIから設定できないみたいなので公式サイトから設定コマンドを取ってきてCUIで設定します。
http://www.rtpro.yamaha.co.jp/RT/docs/v6plus/index.html

```
# IPv6関連設定
ipv6 prefix 1 ra-prefix@lan2::/64
ipv6 lan1 address ra-prefix@lan2::1/64
ipv6 lan1 rtadv send 1 o_flag=on
ipv6 lan1 dhcp service server
ipv6 lan2 dhcp service client ir=on
dns server dhcp lan2

# IPv4関連設定
ip route default gateway tunnel 1
ip lan1 address 192.168.100.1/24
tunnel select 1
 tunnel encapsulation map-e # <- start map-e用のポートセービングIPマスカレード設定！
 ip tunnel mtu 1460
 ip tunnel nat descriptor 1000
 tunnel enable 1
nat descriptor type 1000 masquerade
nat descriptor address outer 1000 map-e #　<- end map-e用のポートセービングIPマスカレード設定！
dhcp service server
dhcp server rfc2131 compliant except remain-silent
dhcp scope 1 192.168.100.2-192.168.100.191/24

# IPv4フィルター関連設定
ip tunnel secure filter in 200030
ip tunnel secure filter out 200099 dynamic 200080 200082 200083 200084 200098 200099
ip filter 200030 pass * 192.168.100.0/24 icmp * *
ip filter 200099 pass * * * * *
ip filter dynamic 200080 * * ftp
ip filter dynamic 200082 * * www
ip filter dynamic 200083 * * smtp
ip filter dynamic 200084 * * pop3
ip filter dynamic 200098 * * tcp
ip filter dynamic 200099 * * udp

# IPv6フィルター関連設定
ipv6 lan2 secure filter in 200030
ipv6 lan2 secure filter out 200099 dynamic 200080 200081 200082 200083 200084 200098 200099
ipv6 filter 200030 pass * * icmp6 * *
ipv6 filter 200099 pass * * * * *
ipv6 filter dynamic 200080 * * ftp
ipv6 filter dynamic 200081 * * domain
ipv6 filter dynamic 200082 * * www
ipv6 filter dynamic 200083 * * smtp
ipv6 filter dynamic 200084 * * pop3
ipv6 filter dynamic 200098 * * tcp
ipv6 filter dynamic 200099 * * udp
```

# 終章
無事IPv4にしか対応していないサイトも閲覧できるようになり、ネットワーク構成もシンプルになりました。超スッキリ！
|ONU| - |RTX830| - |wifiルーター| - |PC|

最後にスピードテストもしてみます。私の賃貸マンションでは残念ながら最大100Mbpsしかでないので速度はお察しです。でも満足いく速度は出ている。ちなみにWN-AX1167GRを挟んでいたときと特に速度に変わりは無い。でもこの結果に後悔はありません。ネットワークはシンプルが一番です！
以上！
<img width="526" alt="スクリーンショット 2018-06-06 11.26.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/106116/7e3cef26-eec5-08aa-9e32-43d331916ed1.png">
エスケープ処理って何？

#エスケープ処理って何？

　エスケープ処理ってよく聞くのですが、初心者からするとなんの処理？って思いますよね。  
わたしもよく分からなかったので調べて自分なりにまとめてみました。

##エスケープ処理とは
　簡単にいうと文字列の処理のことです。エンジニアからすると基本中の基本らしいです。  

**エスケープ**
* HTML上で特殊文字を表示するための処理
例えば、HTMLの場合

| 表示 | エスケープ |
|------|------------|
| >    | &lt        |
| <    | &gt        |
| "    | &quot      |
| '    | &#039      |

このように買ってに変換してくれるのがエスケープです。


##エスケープをする理由
　それではどうしてこのような処理をしなければならないのか？  
もしフォームなどでユーザーが文字を送信するといった場合に、ユーザーが内部のプログラミング上にコードを入力することが出来てしまうといった危険性があります。  
なので、ユーザーが入力できるようなサイトを作った場合には、必ず必要な処理になります。


##使用例

```
{$変数名|escape:"html"}
```

このように書くとエスケープ処理が行われます。



##まとめ
　少しでも分かっていただけたでしょうか？エスケープ処理とは、特殊文字をエスケープ文字に変換することですね。 そのおかげで悪意なユーザーからのアクセスに対応できます。 
実際にサイトを作ったりする際とても重要なことなので、覚えておきましょう。
railsのローカル開発中にスマホで確認する方法（Mac限定）（テザリングでもOK）

railsで開発しているときに、
ローカルで変更したものをそのままスマホで参照してレイアウト確認などをする方法です。

ネットのトラフィックは8割方スマホになっているらしいので、
PCの画面を綺麗にするよりも
スマホの画面を綺麗にする方が何倍も効果が高いと思います。


# 前提
・railsアプリを作っていて、もう動いている。
**・スマホと開発PCが同じLAN上にある**


## 必要なものインストール

```terminal:ターミナル
curl get.pow.cx | sh
```

```terminal:ターミナル
gem install powder
```

## URL取得

```terminal:ターミナル
powder link
Your application is now available at http://narou-osusume.test/
```
ここで取得した以下のURLを少し変えるとスマホ参照可能になります。
**http://narou-osusume.test/**

## IP取得
（※inetという記述が幾つかあるかもしれないです。試して繋がる奴を探してください）

```terminal:ターミナル

ifconfig

~~~省略~~~
inet 192.168.12.3
~~~省略~~~
```

## スマホ参照URL
先ほど取得したURLを以下のように変える
**http://narou-osusume.test/**
↓
**http://narou-osusume.192.168.12.3.xip.io/**

このURLにスマホでアクセスすると、
ローカル環境へスマホでアクセスできます。

##追記
テザリングでもいけた！！


### 参考
https://morizyun.github.io/blog/pow-guard-rails/index.html
プレゼンテーションの指摘メモ

授業でした内容を自分のメモとして書き残します。

---

2018/06/04（月）の授業内容

---

■ A

1. ペルソナ設定
2. カスタマージャーニーマップ
3. 成果目標
4. プロトタイプ
5. 質疑応答

・ 成果目標の過程がわかりやすい
・ ( メンバー全員に ) 苦労した点は？
　　⇒ ペルソナ設定とカスタマージャーニーマップ作成の擦り合わせ他

■ B

・ プロトタイプに、実際のデータを書いておく
・ 発表の練習をすること

■ C

・ セールスポイントはもっと主張すること
・ 発表の練習はしたか？

■ D

・ 「 詳細を知ることができる 」とは、どこまで詳細なのか？
・ 規模は？
・ セールスポイントが弱い（ 何かを付随すると良いのでは？ ）

■ F

1. ペルソナ設定
2. カスタマージャーニーマップ
3. 解決策
4. セールスポイント
5. 成果目標
6. 競合サイト、アプリ等

・ 発表者の圧がすごい
・ １番の売りの、次の売りは？

■ G

＋ 時代洞察スライド

・ 要素を足していくと良い
・ 遊び感覚では？
　　⇒ 成果目標に沿っていたので有り
・ 留学生対象である
　　⇒ 差別化できて良い

■ H

＋ 訴求ポイント
－ 問題抽出

・ もっと大げさに、視聴者を納得させる
・ 特徴などをもっと細かく分かりやすく


〇 マネタイズ

ネット上の無料サービスから収益をあげる方法のこと（ [コトバンク](https://kotobank.jp/word/%E3%83%9E%E3%83%8D%E3%82%BF%E3%82%A4%E3%82%BA-188831)から引用 ）

そのアプリケーションは
・ どこから収益がでるのか
・ どの時点で売上がでるのか
を考える必要がある

---

最後までお読みいただきありがとうございました。
AWS 認定ソリューションアーキテクトのアソシエイト (新版)取得した話

6月のAWSサミット参加ついでにソリューションアーキテクトのアソシエイト (新版)取得してきました。

#ソリューションアーキテクトのアソシエイト (新版)について

2018年2月にソリューションアーキテクト（アソシエイト）の試験が刷新され新版になりました。
https://aws.amazon.com/jp/certification/certified-solutions-architect-associate/

問題数が55問から65問に、試験時間が80分から130分に拡大されています。
旧版は2018年8月12日までしか受験できないとのこと。



#勉強した方法

他の記事等にもありますが、現時点ではこの本しか対策本がないのでこれを一通り読みました。

「合格対策 AWS認定ソリューションアーキテクト - アソシエイト」
 http://amzn.asia/5kSHt0x 

2016/8/17に発行された本なので試験内容をカバーできていないのと情報が古い部分があるので、
ネットで調べつつ読んだ方がいいと思います。

### 対策本に乗っていないこのあたり部分も勉強しました

* Amazon Aurora
* Amazon Redshift
* Amazon ECS
* AWS Lambda
* AWS Storage Gateway
* ALBとNLB
* Amazon Kinesis
* NATゲートウェイ
* EFS
* AWS CloudTrail

#試験の流れ

（注）AWSサミット会場での受験なので他と違うかもしれません。

会場に着くと、身分証明書2枚提示を求められます。（免許証とクレジットカード等）
時間になるとノートPCのある席に案内され手渡されたコードを画面に入力すると試験開始。
画面上部に残り時間が出ているので、それを気にしながら選択問題を回答していきます。
問題にフラグをつけて後で見返すこともできます。

全問回答終わったら終了ボタンを押すとアンケートが表示され、
アンケートに答え終わるとすぐに合否が表示されます。
継承

#継承（インヘリタンス）
**継承**とはオブジェクトの持つ核データや各機能を別のオブジェクトを継承することができます。

**基底クラス（スーパークラス）**
・クラスの親子関係が成り立つ場合の親側のクラス

**派生クラス（サブクラス）**
・クラスの親子関係が成り立つ場合の子側のクラス

**オーバーライド**
・基底クラスから継承された派生クラスにおいて、メンバ関数を独自の機能で上書きすること。オーバーライドを可能にするには、引数の型、引数の数が同じでないといけない。※オーバーロードという類似の言葉がある。

**オーバーロード**
・引数や戻り値が異なるが名称が同一のメソッドを複数定義するというオブジェクト指向プログラミングのテクニック。
#継承関係とは
あるクラス A がクラス B を包含するような関係にあるとき、 この関係を継承関係と呼び、 「B は A を継承する」とか「B は A から派生する(導出される)」といいます。 また、このとき、クラス A のことを「基底クラス」 または「スーパークラス」と呼び、 クラス B のことを「派生クラス」 または「サブクラス」と呼びます。
[jQuery] ホバーしてからｎ秒後に発火するイベントの作り方

#やりたいこと

爆弾の画像 :bomb: を用意して、その画像に３秒間カーソルがホバーし続けたら爆発した画像に代わるイベントを実装します。

#どんなときに使えるか

例えば EC サイトで商品一覧を表示させて、カーソルが商品の上に乗ったときに商品の詳細情報や拡大写真などを表示させたいとします。このイベントをカーソルが乗った瞬間（０秒後）に発火させてしまうと、意図せずカーソルが乗ってしまった商品に対しても処理が走ってしまい、すごく使いづらく感じます。このような場合に発火までの待機時間を設定できると便利かなと思います。

#ソースコード

##html

爆弾の画像と爆発の画像の２種類を用意ます。

```time_bomb.html
<img id="bakudan" src="bakudan.png">
<img id="bakuhatsu" src="bakuhatsu.png">
```

##css

爆弾画像の下に爆発画像を重ね、爆発は透明にしておきます。

```style.css
#bakudan {
  z-index: 1;
}
#bakuhatsu {
  z-index: 0;
  opacity: 0;
  pointer-events: none;
  position: absolute;
  top: 0px;
  left: 0px;
}
```

##jQuery

カーソルが画像に乗ったとき、変数 timeBomb にsetTimeout の関数を代入します。途中でカーソルが外れたら setTimeout をキャンセルします。
今回は発火後でもカーソルが外れたら画像が元に戻るようにしました。

```time_bomb.js
var timeBomb;
$('#bakudan').hover(
  function() {
    timeBomb = setTimeout(function() {
      $('#bakudan').css('opacity', '0')
      $('#bakuhatsu').css('opacity', '1')
    }, 3000)
  }, function() {
    $('#bakudan').css('opacity', '1')
    $('#bakuhatsu').css('opacity', '0')
    clearTimeout(timeBomb)
  }
)
```

clearTimeout がないとイベントがキャンセルできず、一瞬でもカーソルが乗ると３秒後にイベントが発火してしまうので注意です。

以上となります。
2018/05/09（水）の授業内容復習

授業でした内容の不明な点を調べ、自分のメモとして書き残します。

**※ すごく自分がわかるようにまとめています。ご注意ください。**

---

2018/05/09の授業内容（おそらく）

---

〇 **記事の概要**

CHAPTER3_オブジェクト指向ってなに？ より

- 3-1 クラスをマスターしよう
- 3-2 クラスの機能を掘り下げる
- 3-3 継承をマスターしよう

※「 3-1 クラスをマスターしよう 」は、
C 言語の復習らしいので、今回の記事では記述しない


〇 **3-2 クラスの機能を掘り下げる**

■ アクセス修飾子

（ 同 PDF 内での表現が自分にとってわかりやすかったため、その表現を使用する ）

- public<br>
全公開！！！！！
- internal<br>
サークル内まで
- protected<br>
友達まで
- private<br>
非公開

**まとめ**
アクセス権の指定を記述していない場合、private/internal に設定される
最初は、public/private を覚えておけば良いであろう


■ コンストラクター（ Constructor ）

コンストラクターは「 返値のないメソッド 」と書かれている

1. new でインスタンスを作成する
2. C# はそれに対応するコンストラクターを検索し、自動的に呼び出す

コンストラクターに、必要な初期化処理等を用意しておけば、new すると自動的にそれらは実行される

**まとめ**
コンストラクターを使用すると、簡単にインスタンスを作成して必要な設定ができる


■ オーバーロード（ OverLoad ）

*同名のメソッドを引数の数で切り分けて使用可能にすること（ 先生より ）*

*同じメソッドをいくつも用意すること（ 教科書より ）*


■ デストラクタ（ Destructor ）

**コンストラクター ⇔ デストラクタ**

インスタンスが削除される時に実行される処理

**まとめ**
初心者はあまり使用しないであろう


■ プロパティ（ Property ）

値の取得と変更のための処理を組み込む事ができるフィールド

```:exe

フィールドの宣言
{
     get { ……値の取得…… }
     set { ……値の変更…… }
}

```


〇 3-3 継承をマスターしよう

**継承（ Inheritance - インヘリタンス ）**

（ 例 ： 先生より）
Person クラス（ 基本クラス ） ⇒ PowerPerson クラス（ 派生クラス ）

PowerPerson クラスは Person クラスを継承している

**オーバーライド（ OverRide ）**
基本クラスのメソッドを上書き変更する


---

最後までお読みいただきありがとうございました。
Python - Zip , Unzip File with python 3

#<b>INTRODUCTION</b>
Hey guys! How have you been doing? I hope you are doing good :). Ok, Let get into our today topic. Recently , I have been working on the python project which related to Compression , Extracting file and I think it is a useful function of python so I want to share it with you.Ok, Let's get started.

#<b>GET STARTED</b>


###<b>1. Zip File </b>

Many people when they are working with Zip file , they only use Python <b>zipFile</b> Library. But today I will introduce you to another library which is <b>shutil</b>. It is really simple and easy to compress a file. 

<b>Example </b> 

Before is my project structure. 

<img width="334" alt="Screen Shot 2018-06-06 at 10.50.44 AM.png" src="https://qiita-image-store.s3.amazonaws.com/0/211896/4374b927-5ccd-9b1d-65e7-a2f212fa34a6.png">

let say , I want to zip the <b>.txt file</b>. We can do it like this (see below code)


```python
import shutil

zipOutputName = "archive"
fileType = "zip"
path = "./testZip"
fileName = "XN92RSUKPS.txt"

shutil.make_archive(zipOutputName,fileType,path,fileName)
```

1. First you need to import shutil Library
2. zipOutputName : is the output name of your zip file.
3. fileType : type of compression.
4. path : the path to the file or directory
5. fileName : file that we need to zip.

We also can zip the whole directory (see below code)

```python
import shutil

zipOutputName = "archive"
fileType = "zip"
path = "."
fileName = "testZip"

shutil.make_archive(zipOutputName,fileType,path,fileName)
```

###<b>2. Unzip File </b>
Ok, after we learn how to compress file. Now it time to learn how to extract file. This time we will use zipFile library.

```python

import zipfile

zipfilePath = ("./archive.zip")
zip = zipfile.ZipFile(zipfilePath)
zip.extractall(".")
zip.close()
```
1. So to unzip , first we import zipfile library
2. Then we need to provide file / directory path.
3. after that we give the output path to extractall method.
【授業学習】クラスメンバー

#今回はC#では基本のクラスのメンバーについて少しまとめます。

#概要
クラスとはオブジェクトを作るための設計図のようなもので、 オブジェクト指向プログラミングの中心となるものです。

#メンバー
クラスにはいろいろな種類のメンバーがあります。
メンバーの種類の概要を次に示します。

・定数
クラスに関連付けられている定数値

・フィールド
クラスの変数

・メソッド
クラスによって実行可能な計算とアクション

・プロパティ
クラスの名前付きプロパティの読み取りと書き込みに関連付けられているアクション

・インデクサー
配列など、クラスのインスタンスのインデックス作成に関連付けられているアクション

・イベント
クラスによって生成可能な通知

・演算子
クラスによってサポートされている変換と式の演算子

・コンストラクター
クラスのインスタンスまたはクラス自体を初期化するために必要なアクション

・ファイナライザー
クラスのインスタンスが完全に破棄される前に実行するアクション

・種類
クラスで宣言される、入れ子にされた型

#ユーザー補助
 アクセシビリティには 5 つの有効な形式があります。 これらの概要を次に示します。

・public
アクセスは制限されません。

・protected
アクセスは、このクラスまたはこのクラスから派生したクラスに制限されます。

・internal
アクセスは、現在のアセンブリ (.exe、.dll など) に制限されます。

・protected internal
アクセスは、それを含んでいるクラスまたは含んでいるクラスから派生されたクラスに制限されます。

・private
アクセスはこのクラスに制限されます。

・private protected
アクセスは、それを含んでいるクラスまたは同じアセンブリ内のそれを含んでいる型から派生されたクラスに制限されます。

#まとめ
それぞれのクラスのメンバーの効果、ユーザ補助の意味を今回は覚えるために今回投稿しました。
これからそれぞれの意味を覚えていきたいと考えています。
esa.io > 移行 > Evernoteからesa.ioへ > Excelを経由することで表形式を移行

```txt:動作環境
Windows 10 Pro (64bit) バージョン 1803 (April 2018 Update)
Google Chrome バージョン 66.0.3359.181（Official Build） （64 ビット）
Excel 2016
```

### 症状

Evernote上で書いた表形式。
選択して、esa.ioへそのまま貼っても表でなく、文字列として貼付けされる。

どうするか。

### 対処

Excelを経由する

1. Evernoteで選択、コピー
2. Excelに貼付け
3. Excelで選択、コピー
4. esa.ioへ貼付け

セル内の改行などは2行に分かれる。

希望通りの書式でない場合、Excelで修正することになるだろうか。
phpのエクステンションが入ってるかどうかの確認

今phpからエクセル出力をやろうとしてるんだけど、こういうphpSpreadsheetというライブラリがあって、


https://phpspreadsheet.readthedocs.io/en/develop/#installation


で、インストール要件に


>PHP extension php_zip enabled
>PHP extension php_xml enabled
>PHP extension php_gd2 enabled (if not compiled in)


とあるんですが、これを確認するのってどうやるか。


サーバーに入って

```
php -m
```

でいいんですね。
6月６日授業課題１

#今回は授業できちんと理解が出来なかったインターフェースについてまとめます。

#インターフェースとは
インターフェースとは、英語の「Interface」が由来となって作られた言葉です。
Interfaceを直訳すると「境界面」「接点」などの意味があります。インターフェースは、異なる2つのものを仲介するという意味を持っています。
人間同士の関係に使用することはなく、種類が異なる機器同士あるいはコンピューター機器同士、コンピューターとプログラムを結びつける共用部分を指すために使われます。ハード同士をつなげるためのコネクターなどの装置自体をインターフェースと呼ぶこともあります。
#インターフェースの定義文

```ruby:
interface インターフェース名
{
  メソッド・プロパティの宣言
}
```

#インターフェースの実装はクラスの継承と同じ構文
```ruby:
class クラス名 : インターフェース名
{
  クラスの定義
}
```
#インターフェースに挙げられる特徴

1.メンバー変数を持つことが出来ない。

2.static メソッドを持つことが出来ない。

3.宣言したメソッド・プロパティはすべてpublic abstractになる。

4.1つのクラスが複数のインターフェースを実装できる。
この４つが挙げられる
オブジェクト指向についてのまとめ

#はじめに
このブログは授業で受けた内容のまとめや感想などを書いています。

今回はC#の授業で習ったオブジェクト指向を簡単にまとめた記事になります。

#オブジェクト指向
オブジェクト指向はアプリケーションを開発する手法の一つです。
ざっくり説明すると
一つ一つの処理をオブジェクトという部品にわけ、それを組み合わせて一つのものを作る手法です。

さて、みなさんはエイリアンソルジャーというゲームをご存知ですか？
![title.jpg](https://qiita-image-store.s3.amazonaws.com/0/249281/9aef6a11-2952-8b73-b137-e418976a9027.jpeg)
1995年にセガが販売したゲームなのですが
なぜ急にゲームの話を出してきたんだ？と思った方もいるのでしょう。
ですが、**このゲームは凄くオブジェクト指向と関係しているからです。**
このゲームの敵で出てくるエイリアンなのですが、一つ一つの関節をオブジェクトにして動かしています
![eirian.jpg](https://qiita-image-store.s3.amazonaws.com/0/249281/dc33e6a5-2f57-ab0e-46a8-3c1e27b21ae3.jpeg)
上の触手が一本だけ生えている敵の触手の各関節がオブジェクトです。
**この一つ一つの関節という部品をうまく組み合わせ、その敵の動きを作っています。**

---
#カプセル化
カプセル化はオブジェクトの持つ任意のメンバーを隠ぺいすることです。
これをすることによって、オブジェクト詳細な処理の内容を意識することなく、そのオブジェクトのインターフェイスだけを利用することができます。
つまり触られたくないメンバーをアクセス修飾子を使って隠ぺいすることで、勝手にその情報を書き換えられないようにすることもできます。

---

#継承
継承とは、既に存在するクラスを継承して
新しいクラスを作成することができる機能です。
既に存在するクラスは「親クラス」や「スーパークラス」と呼ばれることが多いです。
簡単に言うと
親の持っているものをそのまま子供が使えるようにしているといった感じです。

---

#最後に
今回はカプセル化と継承のほうをまとめさせてもらいましたが、まだまだ色々あるのでそちらの方もまとめていこうと思います。
授業学習　課題

#今回は授業でそこまで理解できていなかったインターフェイスのことについてまとめます。

#インターフェイスとは
コンピューターと周辺機器を接続するための規格や仕様、またはユーザーがコンピューターなどを利用するための操作方法や概念のこと。物と物との間の仲介をする部分のことです。

###教科書に書いてある例の僕らの身近な自動販売機で例えます。

自動販売機の中の仕組みは見えませんが、お金の投入口、返却口、商品を選択するためのボタンとなるインターフェイスを持っています。
このインターフェイスを通じて利用者は自動販売機を使用することができます。

自動販売機の持っている[お金の投入口][お金の返却口][商品選択ボタン]の３つのインターフェイスが共通していれば、利用者は対象となるオブジェクトがどのようなものであっても、お金を払ってほしい商品を購入するという目的を達成することができます

#C#でのインターフェイスの定義
```
interface インターフェース名
{
  メソッド・プロパティの宣言
}
```
###インターフェースの実装はクラスの継承と同じ構文で行います。
```
class クラス名 : インターフェース名
{
  クラスの定義
}
```
クラスとよく似ていますが、インターフェースには以下に挙げるような特徴があります。

1)メンバー変数を持つことが出来ない。

2)static メソッドを持つことが出来ない。

3)宣言したメソッド・プロパティはすべてpublic abstractになる。

4)1つのクラスが複数のインターフェースを実装できる。
C#のデータ型について

#はじめに
授業で学んだ事のメモとして使います。

#データ型
###C#のデータ型について
データ型には数値、文字列など様々な種類がある。
VisualC#で使用できるデータ型は[値型]と[参照型]の二種類ある。

###値型
変数の値を直接格納する。
値型に属するデータ型には、
sbyte 
範囲は-128~127で、符号付き8ビット整数
short
範囲は-32768~32767で、符号付き16ビット整数
int
範囲は-2147483648~2147483647で、符号付き32ビット整数
long
範囲は-9223372036854770000~9223372036854775807で、符号付き64ビット整数
byte
範囲は0~255で、符号なしビット整数
ushort
範囲は0~65535で、符号なし16ビット整数
uint
範囲は0~4294967295で、符号なし32ビット整数
ulong
範囲は0~18446744073709551615で、符号なし64ビット整数
float
浮動小数点型
範囲は±1.5e-45~±3.4e38(おおよその範囲)で、有効桁数7桁
double
浮動小数点型
範囲は±5.0e-324~±1.7e308(おおよその範囲)で、有効桁数15~16桁
bool
true/false(ブール値)
※真か偽の格納のみを目的とした変数の作成にはbool型が適している
char
範囲はU+0000~U+ffffで、Unicode16ビット文字
decimal
範囲は±1.0×10-28~±7.9×1028で、有効桁数28~29桁
の型がある。

###参照型
変数が持っているのは参照情報だけで、実体は別の場所に確保される。
参照型には、
object
string
の型がある。
addChild(_:), addSubview(_:)のあとは、didMove(toParent:)を呼びましょう

**addSubView**までで良いと思っていた……。知らなかった。

```swift
// UIViewControllerのクラスで
addChild(someViewController)
view.addSubview(someViewController.view!)
someViewController.didMove(toParent: self)
```

（参考）
https://www.slideshare.net/asakahara/container-viewcontroller
https://qiita.com/yimajo/items/a5e16fa0f9c332a55ccf
https://qiita.com/edo_m18/items/8b6b457f82b185ab1f6a

（追記）
ちゃんとドキュメントに書いてあるので、読んでおくべし。。。
[didMove(toParent:) - UIViewController | Apple Developer Documentation](https://developer.apple.com/documentation/uikit/uiviewcontroller/1621405-didmove)
MSIインストーラーで詳細ログを出力する

WindowsのMSIインストーラーがおかしいので、ログを出力する方法を調べてみたら、msiexecというコマンドでできるらしい。

```
> msiexec /i myinstaller.msi /l*v c:\installer.log
```

``-i <インストーラファイルパス>`` で、インストーラーの指定、``-l*v <ログファイルのパス>`` で冗長なログ出力とその出力先を指定する。

詳しくはMSのサイトで。
https://msdn.microsoft.com/ja-jp/library/windows/desktop/aa367988(v=vs.85).aspx
IntelliJのScalaコンパイラで、挙動が怪しい部分

# 環境
* Scala 2.12.5
* IntelliJ IDEA 2018.1 (Community Edition)
* JRE: 1.8.0_152-release-1136-b20 amd64

# for式のジェネレータ部分にリテラル識別子を使うと、IntelliJの構文チェックツールではエラーだが、ビルド＆実行ができる

for式のジェネレータ部分に、リテラル識別子を使いました。

```scala
def sampleOpt(i: Int): Option[Int] = Some(i)

val a = for (
  `type` <- sampleOpt(10)
) yield `type` * 2
println("a=" + a) //⇒ a=Sample(20)
```


IntelliJ IDEAのエディタウィンドウでは、"Cannot resolve symbol `type"というエラーが表示されました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/37903/13091933-f55a-e644-52bd-c31a1b673712.png)

しかし、ビルド＆実行はできました。


# `build.sbt`の設定が間違っていても、別モジュールのテストクラスを参照できてしまう。
作成中
react native    Module `KKKK` does not exist in the Haste module map

# react native で
`react native    Module `KKKK` does not exist in the Haste module map`

と怒られた


#解決策

importするときのパスを間違えていただけだったのでパスを修正すると解決した。
エラー文にgithubのissueを参照しろみたいなのが出てくるのでとても焦ったがしょうもない原因だった。
自分は
`　import TweetCard from "TweetCard";
`
 と記述したがreact native   は下記のように記述しないと認識してくれないらしい。

`import TweetCard from "./TweetCard";`
Salesforceのカスタムボタンでjqueryを使わずにちょっとした入力ダイアログを作る

# 概要

　Salesforce Classicのリストビューや詳細画面でJavaScript実行のカスタムボタンでちょっとした入力値をユーザに入力させてからApex、Webserviceの処理させたい時ありませんか？
　今まだとボタン内でjqueryを読み込んでからリッチなUIを作ってたり、いっそうVisualforceページに置き換えたりしてませんか？こうした大掛かりな実装しなくても、HTML5タグ＋querySelectorで簡単に実装できます


# 実装イメージ
![custom-button.gif](https://qiita-image-store.s3.amazonaws.com/0/30522/c412d74c-bc48-e5d6-ac1e-6d963c1df827.gif)

# 実装概要

bodyタグにdialogタグと入力項目タグを挿入して、それらを表示するだけです
styleは入れていないですが、同じ要領でスタイルも埋め込めばいい感じに仕上がります

```html
<body>
  ~~ 中略 ~~
  <dialog class="qiita-dialog" open="">
    <p>qiitaは好きですか？</p>
    <select style="width: 100%;">
      <option value="love">好き</option>
      <option value="very_love">大好き</option>
    </select>
    <button id="qiita-save-btn">save</button>
    <button id="qiita-close-btn">close</button>
  </dialog>
</body>
```

# コード

```javascript

// dialogの初期化
const _eleExistDialog = document.querySelector("dialog.qiita-dialog");
if (_eleExistDialog) {
  _eleExistDialog.remove();
}

// bodyタグを取得
const eleBody = document.querySelector("body");

// dialogを作成
const eleDialog = document.createElement("dialog");
eleDialog.classList.add("qiita-dialog");

// 説明文を作成
const eleDespTxt = document.createElement("p");
eleDespTxt.textContent = "qiitaは好きですか？";
eleDialog.appendChild(eleDespTxt);

// 選択リストを作成
const eleSelect = document.createElement("select");
eleSelect.style.width = "100%";

// 選択リストの選択肢を作成
const eleOption1 = document.createElement("option");
eleOption1.value = "love";
eleOption1.textContent = "好き";
eleSelect.appendChild(eleOption1);

// 選択リストの選択肢を作成
const eleOption2 = document.createElement("option");
eleOption2.value = "very_love";
eleOption2.textContent = "大好き";
eleSelect.appendChild(eleOption2);
eleDialog.appendChild(eleSelect);

// 保存ボタンを作成
const eleSaveBtn = document.createElement("button");
eleSaveBtn.id = "qiita-save-btn";
eleSaveBtn.textContent = "保存";
// 保存ボタンのイベント
eleSaveBtn.onclick = function() {
    console.log("click save button");
    /**
     * webserviceをコールするなどの処理
     *
     **/
    eleDialog.close();
}
eleDialog.appendChild(eleSaveBtn);

// 閉じるボタンを作成
const eleCloseBtn = document.createElement("button");
eleCloseBtn.id = "qiita-close-btn";
eleCloseBtn.textContent = "閉じる";
eleCloseBtn.onclick = function() {
    console.log("click close button");
    eleDialog.close();
}
eleDialog.appendChild(eleCloseBtn);

// dialogをbodyに追加
eleBody.appendChild(eleDialog);
// モーダル表示
eleDialog.showModal();
```
Androidのmapbox sdkを6.xにしたら Static interface methods are only supported starting with Android N (--min-api 24): com.mapbox.geojson.Geometry com.mapbox.geojson.Geometry.fromJson(java.lang.String) エラー


AndroidのmapboxのSDKのバージョンを6系に上げたところ以下のエラーが出力されビルドできませんでした。

```
Static interface methods are only supported starting with Android N (--min-api 24): com.mapbox.geojson.Geometry com.mapbox.geojson.Geometry.fromJson(java.lang.String)
```

まさかmin sdk versionを24にしないといけないのかと思い絶望しましたが、appのbuild.gradleに以下を記述することでビルドできるようになりました。

```
// android{}内に追記
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
```

参考
https://github.com/mapbox/mapbox-gl-native/issues/11735
Ruby | オブジェクトを表示する時の 16進数って何なの？ ( Object#inspect / Object#to_s )

エンコードされた object_id っぽい。

値を2倍 ( 左に1bitシフト ) して16進数にしたもののようだ。

```rb
o = Object.new

p o # #<Object:0x00007f9a3081f098>

p o.object_id # 70150107756620

p o.object_id << 1 # 140300215513240

p (o.object_id << 1).to_s(16) # "7f9a3081f098"
```

# 参考

- [In Ruby, why does inspect() print out some kind of object id which is different from what object_id() gives? - Stack Overflow](https://stackoverflow.com/questions/2818602/in-ruby-why-does-inspect-print-out-some-kind-of-object-id-which-is-different)

- [Class: Object (Ruby 2.5.1)](http://ruby-doc.org/core-2.5.1/Object.html#method-i-to_s)
>The default to_s prints the object's class and an encoding of the object id. 








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Anacondaで32bitのPython環境を作るときに必要な設定

# 背景
Pythonで作ったアプリケーションをexe化するのにcx_Freezeを使っています。
開発は64bitのPythonを使っているのですが、アプリケーションが動作するPCが32bit環境だと、また1からPythonの環境を作り直してexe化する必要があります。
32bitのPython環境を構築する際に必要な手順を備忘録としてメモします。

# 前提条件
+ OS : Windows10
+ Shell : nyagos
+ conda version : 4.5.4

# 32bit環境構築手順
1. 環境変数CONDA_FORCE_32bitを1に設定
1. AnacondaでPythonの仮想環境を作成。このときの環境名は32bitであることを明示しておくとわかりやすい
1. 現環境を作成した32bit Pythonに設定
1. Pythonを起動してMSC v.1900 32 bit (Intel)が見えたらインストールできている
1. 環境変数CONDA_FORCE_32bitをもとに戻す

```terminal
$ set CONDA_FORCE_32BIT=1
$ conda create -n py36_32bit python=3.6.5
$ source activate py36_32bit
$ python
Python 3.6.5 |Anaconda, Inc.| (default, Mar 29 2018, 13:23:52) [MSC v.1900 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> exit()
$ set CONDA_FORCE_32BIT=
```

[ここの記事](https://stackoverflow.com/questions/33709391/using-multiple-python-engines-32bit-64bit-and-2-7-3-5?utm_medium=organic&utm_source=google_rich_qa&utm_campaign=google_rich_qa)を何回も見ているので、自分なりに手順をまとめてみました。
Positional Encoding (sinusoid) の実装に関するメモ

##ポイント
* Positional Encoding (sinusoid) を実装し、具体的な数値で確認。

##レファレンス
[1. Attention Is All You Need](https://arxiv.org/abs/1706.03762)

##数式

![image.png](https://qiita-image-store.s3.amazonaws.com/0/254604/c98bbb51-acf6-9e82-c998-b790aa071e62.png)
　　　　
    　　　　　（参照論文より引用）

##サンプルコード
```python
def get_lookup_table(length, n_units):
  lt = np.array([[pos / np.power(10000, 2.0 * i / n_units) \
                  for i in range(int(n_units / 2))] \
                          for pos in range(length)])
  lt = np.repeat(lt, 2, axis = 1)
  
  lt[:, 0::2] = np.sin(lt[:, 0::2])
  lt[:, 1::2] = np.cos(lt[:, 1::2])
  
  return tf.convert_to_tensor(lt)
  
def positional_encoding(batch_size, length, n_units):
  pos = tf.tile(tf.expand_dims(tf.range(length), 0), \
                   [batch_size, 1])
  
  lt = get_lookup_table(length, n_units)
  
  return tf.nn.embedding_lookup(lt, pos)
  

batch_size = 2
length = 10
n_units = 6

pe = positional_encoding(batch_size, length, n_units)

with tf.Session() as sess:
  print (sess.run(pe))
```

##結果
[[[ 0.          1.          0.          1.          0.
    1.        ]
  [ 0.84147098  0.54030231  0.04639922  0.99892298  0.00215443
    0.99999768]
  [ 0.90929743 -0.41614684  0.0926985   0.99569422  0.00430886
    0.99999072]
  [ 0.14112001 -0.9899925   0.1387981   0.9903207   0.00646326
    0.99997911]
  [-0.7568025  -0.65364362  0.18459872  0.98281398  0.00861763
    0.99996287]
  [-0.95892427  0.28366219  0.23000171  0.97319022  0.01077197
    0.99994198]
  [-0.2794155   0.96017029  0.27490927  0.96147017  0.01292625
    0.99991645]
  [ 0.6569866   0.75390225  0.31922465  0.94767907  0.01508047
    0.99988628]
  [ 0.98935825 -0.14550003  0.36285241  0.93184662  0.01723462
    0.99985147]
  [ 0.41211849 -0.91113026  0.40569857  0.91400693  0.0193887
    0.99981202]]

 [[ 0.          1.          0.          1.          0.
    1.        ]
  [ 0.84147098  0.54030231  0.04639922  0.99892298  0.00215443
    0.99999768]
  [ 0.90929743 -0.41614684  0.0926985   0.99569422  0.00430886
    0.99999072]
  [ 0.14112001 -0.9899925   0.1387981   0.9903207   0.00646326
    0.99997911]
  [-0.7568025  -0.65364362  0.18459872  0.98281398  0.00861763
    0.99996287]
  [-0.95892427  0.28366219  0.23000171  0.97319022  0.01077197
    0.99994198]
  [-0.2794155   0.96017029  0.27490927  0.96147017  0.01292625
    0.99991645]
  [ 0.6569866   0.75390225  0.31922465  0.94767907  0.01508047
    0.99988628]
  [ 0.98935825 -0.14550003  0.36285241  0.93184662  0.01723462
    0.99985147]
  [ 0.41211849 -0.91113026  0.40569857  0.91400693  0.0193887
    0.99981202]]]
Google Java Style Guide

Googleが様々な言語の[コーディング規約](https://github.com/google/styleguide)（Style Guide）を公開していることを最近知りました。[Javaのコーディング規約](https://google.github.io/styleguide/javaguide.html)についてざっと見てみて、興味深かった点をまとめてみました。

#### 2 Source files basics

非ASCII文字をコード中に記述するときにUnicodeエスケープするかどうかは、どちらの方が理解しやすいかによる。(2.3.3 Non-ASCII characters)

```java
String unitAbbrev = "μs"; // "\u03bcs"とすると理解しにくいためUnicodeのまま記述する。
```

#### 3 Source file structure

ワイルドカード `*` を使った`import` は `static` かどうかに関わらず使わない。(3.3.1 No wildcard imports)

#### 4 Formatting

`if ` や  `for` などで使うブレース `{}` は中身がからであっても省略しない。(4.1.1 Braces are used where optional)

空でないブロックは下記のようにK&Rスタイルで記述する。(4.1.2 Nonempty blocks: K&R style)

```java
if (condition()) {
  method();
} else if (condition()) {
  method();
}
```

`if`、`try` などで複数ブロックで構成されていない限り、空のブロックは `{}` と簡略化できる。(4.1.3 Empty Blocks: may be concise)

インデントには2つのスペースを用いる。(4.2 Block indentation: +2 spaces)

1行は100文字以内に収まるようにする。(4.4 Colum limit: 100)

1行が長い場合に改行するときは4文字以上のスペースを入れる。(4.5.2 Indent continuation lines at least +4 spaces)

予約語 ( `for` など) と `(` の間、`}` と予約語 ( `else` など) の間、`{` の前にはスペースを入れる。(4.6.2 Horizontal whitespaces)

#### 5 Naming

特別な意味を持つプレフィックスやサフィックスは使わない。例：`name_`、`mName` (5.1 Rules common to all identifiers)

略語など一般的に大文字で構成される単語もキャメルケースにする。例：`XmlHttpRequest` (5.3 Camel case: defined)

既にキャメルケースで広まっている名称はそのまま残してもよい。例：`YouTubeImporter` (5.3 Camel case: defined)
GitHubで通知が来るタイミングまとめ

[GitHubでメール通知が送られるタイミングをまとめたドキュメント](https://help.github.com/articles/about-notifications/)の抄訳です。

## GitHubの通知には2種類ある
1. **Participating notification**
    * 自分が直接的に関わっている議論やアクティビティに関する通知
2. **Watching notification**
    * 自分がWatchしているリポジトリや議論に関する通知

## それぞれ通知が来るタイミングは？
### Participating notificationのタイミング
次のような時にあなたは通知を受け取ります：

* 自分の所属するチームあるいは自分自身が
    * メンション（ `@blabla` みたいなの) された
    * PR (Pull Request) レビューの要請を受けた
    * あるファイルのオーナーであり、かつ誰かがそのファイルに変更を加えるPRを投げた
* 自分の購読しているPRに
    * 誰かがコミットした
    * approveまたはchange requestするレビューが提出された
* 自分の購読している会話にコメントが追加された
* 自分の所属するチームの親となるチームがメンションされた
* 自分がIssueあるいはPRにアサインされた
* 自分がIssueあるいはPRを、オープン・コメント・クローズした
* 自分がteam discussionを作成・返信した

### Watching notificationのタイミング
次のような時にあなたは通知を受け取ります：

* 自分のWatchしているリポジトリについて
    * IssueあるいはPRが開かれた
    * Open状態のissueあるいはPRに対して、コメントが追加された
    * コミットに対してコメントが追加された
    * Releaseが追加された
    * あるPRに、approveまたはchange requestするレビューが提出された
* 自分のWatchしているチームについて
    * Team discussionの投稿・返信があった
* 自分のWatchしているチームおよびその親チームについて
    * Team discussionに新規投稿・編集・返信があった

**以上。**
通知のタイミングを把握して、コミュニケーションを円滑化しましょう！
JavaScriptの日付文字列生成

備忘用。

##お試し（CodePen）
<p data-height="365" data-theme-id="0" data-slug-hash="NzrqQq" data-default-tab="js,result" data-user="fujisystem" data-embed-version="2" data-pen-title="Make DateString" class="codepen">See the Pen <a href="https://codepen.io/fujisystem/pen/NzrqQq/">Make DateString</a> by fujisystem (<a href="https://codepen.io/fujisystem">@fujisystem</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

## 解説
<pre>
#YYYY 西暦4桁
#YY   西暦2桁
#MMM  Abbreviations of Months
#MM   月数字2桁(zero-padding)
#M    月数字2桁
#DD   日数字2桁(zero-padding)
#D    日数字2桁
#EEE  曜日
#eee  day Of Week
#hh   時数字2桁(zero-padding)
#h    時数字2桁
#mm   分数字2桁(zero-padding)
#m    分数字2桁
#ss   秒数字2桁(zero-padding)
#s    秒数字2桁
</pre>

## 総括・ハマりポイント
- 特にないけど、JavaScriptのDateは5/31 ⇒ (前月) ⇒ 4/31(存在しない) ⇒ 5/1(繰り上がり）となるみたい。Javaのapache.CommonのDateUtils#addMonthsと挙動が違う。
というより、[Calendar](https://docs.oracle.com/javase/jp/8/docs/api/java/util/Calendar.html)クラスの挙動が繰り上がらない挙動みたい。

```text
例: 最初に1999年8月31日に設定されたGregorianCalendarを考えます。add(Calendar.MONTH, 13)を呼び出すと、カレンダが2000年9月30日に設定されます。8月に13か月を追加すると翌年の9月になるため、Addルール1によってMONTHフィールドが9月に設定されます。DAY_OF_MONTHはGregorianCalendarでは9月の31日にはできないため、Addルール2によってDAY_OF_MONTHがもっとも近い可能な値の30に設定されます。これは小さいフィールドですが、GregorianCalendarで月が変更されるときに変更が予定されているため、DAY_OF_WEEKはルール2によっては調整されません。
```
ドスパラ製ゲーミングノートにUbuntuを入れる時の罠と対策

# はじめに

週末に秋葉原でドスパラの「[GALLERIA GCF1060GF-E](https://www.dospara.co.jp/5shopping/detail_prime.php?tg=13&tc=143&ft=&mc=7952&sn=0&tb=2)」を買って
Ubuntuを入れたんですが想像以上にインストールが厳しかったのでメモを残しておこうと思います

インストール時に参考にさせてもらった記事です。
ここの記事のおかげでGCF1060GF-Eが文鎮にならずに済みました。ありがとうございます。 :pray:
https://qiita.com/delete/items/2ee2a19f0e75d83313ac


# 必要なもの

* GALLERIA GCF1060GF-E
* 有線LAN環境
* LANケーブル
* 2GBくらいのUSBメモリ

# 目標

とりあえずUbuntuをインストールする。

# 罠

* Rufusで作ったイメージでインストールするとうまく起動しない(ISOモードだと失敗するのでDDモードで作成する)
* Ubuntu 17.04はインストールはできてもまともに起動しない(何もできない)
* Kernel 4.16.5とグラフィックドライバは一度にインストールする必要がある
* グラフィックドライバ(nvidia-390)を入れるまでBluetooth、Wi-Fiは動かない
* タッチパッドは結局動かない

MSI GS65 Stealth Thinの記事に書いてあったほどきつい印象はなかったので、
GALLERIAの方は正解の方法はいくつかある気がします。
まぁこっちはCUDAとか入れてないんで全然楽なんですが。

# インストール手順
* Ubuntu 16.04インストールメディアを作成する
* Ubuntu 16.04をインストールする
* カーネルのバージョンを上げる
* nvidia-390をインストールする
* Wi-Fi, Bluetoothのセットアップ

# Ubuntu 16.04のインストールメディアを作成。

https://www.ubuntulinux.jp/News/ubuntu1604-ja-remix
https://rufus.akeo.ie/

日本語のLive CDとRufusでインストールメディア(USBメモリ)を作成しましょう。
**作成するときにDDモードで作成しておいてください。**

# Ubuntu 16.04をインストールする

ここは普通にインストールします。
デュアルブートとかするつもりはないのでWindowsを消しました。
サードパーティ製のアプリ云々はとりあえずチェックなしで進めました。

インストール後は解像度が低く、無線LANにつなげないので
LANケーブルを挿してネットワークにつなげましょう
ネットに繋げたら `apt update` と `apt upgrade` を実行しておきます。

```
$ sudo apt update
$ sudo apt upgrade
```
updateは途中でコアダンプして失敗しますが気にせずupgradeしちゃいましょう。
upgradeが終わったらupdateも成功するようになりました。


# カーネルのバージョンを上げる

```
$ sudo apt-add-repository -y ppa:teejee2008/ppa
$ sudo apt install ukuu
$ ukuu-gtk
```

GUIの画面が立ち上がるので、4.16.5を選択してInstallボタンを押し、
新しく出てくるウィンドウで `Close Window` 的なメッセージが出るまで待つ。

**ここで再起動したらログインできなくなるので、グラフィックドライバのインストールが終わるまで再起動は待ちましょう**

# グラフィックドライバを入れる

```
$ sudo add-apt-repository ppa:graphics-drivers
$ sudo apt update
$ sudo apt install nvidia-390
```

ここまで来たら再起動してOKです。

再起動すると、Wi-Fiに繋げられたり、Bluetooth機器を接続できるようになります。


# 残った問題

* タッチパッドが動かない  

これは、特に問題を感じていない(もともとタッチパッド苦手な人)のでそのままです。
気になったらまた調べてみようと思います。 

* Bluetoothのマウスが接続されない

今までUbuntuでBluetoothがまともに使えた試しがないので使ってなかったんですが
たまたまいつも使っている無線マウスを仕事場に持って行って、間に合せにBluetoothマウスを繋げていたら
突然繋がらなくなってWi-Fiも繋がらなくなったという事象が発生しました。
マウス、キーボードは有線 or 非Bluetoothの無線のものをおすすめします。

# まとめ

カーネルのアップデートとグラフィックドライバのインストールを一度に行うというあたりがキモかと思います。
そこに気づくまでに10時間以上浪費していたりしますが・・・とりあえず、やっとまともに使えるようになりました。
TouchScriptのジェスチャーイベントをObservableに変換する拡張メソッド


```

    public static IObservable<Unit> TapAsObservable(this TapGesture gesture)
    {
        return Observable.FromEventPattern<EventHandler<EventArgs>, EventArgs>(
            h => h.Invoke,
            h => gesture.Tapped += h,
            h => gesture.Tapped -= h)
            .AsUnitObservable();
    }
```

こゆこと


参考
https://github.com/neuecc/UniRx/blob/master/Assets/Plugins/UniRx/Examples/Sample09_EventHandling.cs
macbook pro 2010にubuntu18.04をインストールする

macbook pro 2010 に ubuntu 18.04 をインストールしたときのメモです。

以下、OSのインストールを伴う内容なのでデータなどは自己責任でバックアップしておいてください。

# 何があったか
- アップグレード後、または、インストールする時、マウスポインタは出ているが、画面はコンソールのまま、数秒おきに8行ぐらいのメッセージを出力し続けて使えなくなった。
- インストール後、内蔵のwifiを認識しない
- ファンが回らない

# 対処方法
心配な方はファンが回るようになるまで、macbook proを浮かせて扇風機などで冷却しながら対処したほうが良いと思います。

## コンソールのままになる件
### インストール時
下記、リンクを参考に、インストールディスクから起動させた grub のオプションを変更する。
https://ubuntuforums.org/showthread.php?t=2390492

install のセクションを選択した状態で ``` e ``` キーを押して、編集モードに入ったあと、linuxの行の ``` --- ``` の前に下記を追記する。

> nouveau.modeset=0 

この状態で起動させるといつものGUIが起動してインストールをすることができる

### インストール後
そのまま起動しても、同様のメッセージが出続けて使えません。
(自分はここでアップデートが失敗したと思ってクリーンインストールしてしまいました)

fn+option+control+2 を同時に押してコンソールに入ります。

**相変わらず、メッセージが出続けてキー入力を横取るらしくタイミングが合わないとうまくコンソールに切り替わらなかったり、ログインユーザー名を入力できません。**

**根気強くやりましょう**

ログインできたら

```bash
sudo vi /etc/default/grub
```

を実行して、
```conf
GRUB_CMDLINE_LINUX=""
```
を
```conf
GRUB_CMDLINE_LINUX="nouveau.modeset=0"
```
とします。

**ファイルを書き換えている途中、相変わらずメッセージが出続けて内容がめちゃくちゃになりますが、その状態で保存しても実際にはキー入力したもの以外は反映されていません。**

**自分を信じて、根気強くやりましょう**


その後、変更を反映させるために、下記コマンドを実行して再起動させます。

```bash
sudo update-grub2
```
## wifiが認識しない
https://ubuntuforums.org/showthread.php?t=2269723
ここを参考に実行。
ただ、ネットワークに繋がっていないので、有線で接続するか、携帯のbluetoothテザリングでパッケージをインストールします。

再起動後、2回に1回位ネットワークが何も見つからない状態になりますが、何度か再起動しているうちに接続できるようになります。
原因は追っていないのでわかりません。

## ファンが回っていない
https://ineed.coffee/3838/a-beginners-tutorial-for-mbpfan-under-ubuntu/
ここを参考に、ソースをビルドしてインストールします。
systemdに登録して自動実行されるようにします。
自分の場合、再起動しないとファンが回ってくれませんでした。
Uncaught TypeError: Cannot set property 'value' of undefinedの解決への試行錯誤

Javascriptで動的にhtml, CSS記述時に発生したerrorへの対処の備忘録

1． DOM生成前に読み込んでいないか確認
→scriptの位置変えたり， DOMContentLoaded使ったり

2． getElementsByClassNameをいじるときは配列になることを注意