OmniAICreator/Qiita-1.07M huggingface dataset:
docker-compose.yml for using Memcached via PHP 7.1

```:structure
Docker/
  ├ docker-compose.yml
  └ phpapache/
    └ Dockerfile
    └ html/
      └ index.php
```

```yml:docker-compose.yml
version: '3'
services:
  web:
    container_name: myserver
    build:
      context: ./phpapache
    volumes:
      - ./phpapache/html:/var/www/html
    tty: true
    ports:
      - "80:80"

  memcached:
    container_name: mymemcached
    image: memcached:latest
    ports:
      - "11211:11211"
```


```docker:phpapache/Dockerfile
FROM php:7.1-apache
RUN apt-get update \
    && apt-get install -y libmemcached-dev zlib1g-dev \
    && pecl install memcached-3.0.4 \
    && docker-php-ext-enable memcached
CMD ["/usr/sbin/apache2ctl", "-D", "FOREGROUND"]
```


```php:html/index.php
<?php                                                                                                                                                                                          
$mc = new Memcached();                                                             
$mc->addServer("mymemcached", 11211);                                              
$mc->add("key1", "value1");                                                        
$mc->add("key2", "value2");                                                        
$mc->add("key3", "value3");                                                        
                                                                                   
echo "key1 : " . $mc->get("key1") . "\n";                                          
echo "key2 : " . $mc->get("key2") . "\n";                                          
echo "key3 : " . $mc->get("key3") . "\n";   
```

```bash
$ docker-composer up --build
```

Then access to http://localhost
Excel > 名前定義 > 名前による数式の定義 > link:使用例 | メリットとデメリット | 考えられる用途 | テーブル+列名参照(構造化参照)

```txt:動作環境
Windows 8.1 Pro (64bit) 
Excel (Office 365)
```

### 名前に基づく数式

参照していたファイルの中に変数名での計算式を定義しているようなセルが見つかった。

名前を定義できるようだ。

### link:使用例

- [名前定義 セル範囲に名前をつける](https://kokodane.com/kihon13.htm) @ なんだ！カンタン！Excel塾
    - 名前を付けたセル、数式、定数を変更する時

情報感謝です。

### メリットとデメリット

- メリット
    - 数式が変数名に基づくため、式の可読性が上がる
- デメリット
    - 名前変更などの操作について閲覧者の学習が必要

通常のセル参照のファイルと比べて、閲覧者が「名前管理」機能の操作を習得しておく必要がある。

多くの人が編集するファイルの場合、この機能を使うかどうか、考えものである。

### 考えられる用途

- 定数に名前をつける
    - 変数(行ごとの値）への適用はできない?
        - 未調査


### テーブル+列名参照(構造化参照)

@tenmyo さんの[コメント](https://qiita.com/7of9/items/32f147b6ebbb8db0046c/#comment-de03176e508ec86d7a0a)にて構造化参照について言及いただきました。

情報感謝です。

将来必要になった時に調べようと思います。
Typescript 3.4のconstアサーションを試す

## はじめに
TypeScript 3.4を勉強中です。
https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-4.html
今回はconstアサーションについてです。

## JavaScriptのconst
JSのconstは再代入不可であり、いわゆる定数ではありません。

```javascript
const x = { a: 1 };
x.a = 2; // xの再代入はしていない
```

Object.freezeを使うと、freezeしたプロパティへの変更はできなくなります。

```javascript
const x = Object.freeze({ a: 1 });
x.a = 2; // TypeError (strict modeの場合)か、無視される

const y = Object.freeze({ a: { b: 2 } });
y.a.b = 3; // エラーにはならない
```

`{ a: { b: 2 } }` のようなネストしたオブジェクトの場合は、[deep-freeze](https://www.npmjs.com/package/deep-freeze)のようなライブラリを使ってfreezeすることができますが、一般的にはパフォーマンスに影響があるようです。

## TypeScriptのconstアサーション
TS 3.4のconstアサーションを使うとオブジェクトのプロパティをread-onlyにできます。

```typescript
const x = { a: 1 } as const;
x.a = 2; // read-onlyエラーになる

const y = { a: { b: 2 } } as const;
y.a.b = 3; // read-onlyエラーになる
```

再帰的なオブジェクトにも効いてくれるようです。Object.freezeとは違ってコンパイル時のチェックですので、やっていることは全く違いますが、多くのケースでは有用ではないかと思われます。

## おわりに
TS 3.4の他の機能も今後調べてみようと思います。上記の例は[TypeScript Playground](https://www.typescriptlang.org/play/index.html)で手軽に試せますので、試してみてください。

試しに、

```javascript
const z = Object.freeze({ a: 1 });
z.a = 2;
```

とやったら、read-onlyのエラーになりました。Object.freezeの型推論もできているのですね。
Virtual-Box  Host-OS ～Guest-OSのping失敗

「やりたいこと」
web-client　から　http指定してweb-serverにアクセスする。
その際にweb-serverを名前解決するＤＮＳサーバーを設定したい。
（DNS-serverとweb-server　はCentOSで設定したい）
![0520-kousei.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416420/b99614d9-4d47-125a-3d8b-c83692f84d34.jpeg)

「環境」
ハードウェア用品としては全てwindos-PCしか持ち合わせていないため
Virtual-Box、CentOSをインストールし、Guest-OS(Cent-OS)としてＤＮＳサーバ設定を試みることとしました。

DNS-serverのHost-OSは192.168.1.100に設定。
![0520-1.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416420/e51886ff-c5c1-71e2-6c60-a2898a4aca77.jpeg)
![0520-2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416420/9e956cf6-3c15-b33f-2748-fa8a9a950ec6.jpeg)

また次のとおり、DNS-serverのGuest-OSは192.168.1.6に設定した。
![0520-3.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416420/781ad78c-6a72-eae3-c021-d6ef9f6695f4.jpeg)


ここでまず初歩的な問題にぶつかっております。
DNS-serverはHost-OS とGuest-OS　を　ブリッジアダプタで設定していますが

![0520-5.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416420/aa92e27f-1b6a-5370-11ca-99882a6e9428.jpeg)

Host-OS →　Guest-OSはpingが通過しません。
![0520-6.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416420/b896d95d-8a9b-f4fd-c973-22e86dd9f0e7.jpeg)

Guest-OS　→　Host-OS →　にもpingが通過しません。
![0520-4.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416420/913883ec-9fe6-a2bd-3f37-964d73990e98.jpeg)




一応Host-OS　と　Guest-OSのping許可にはしてあります。
![0520-7.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416420/34ca4e27-19ac-92c7-20cd-275b176762c8.jpeg)


ルータを介しての通信まではまだほど遠く
ＰＣ内の「Host-OS ～　Guest-OSはpingが疎通失敗」という事象になっている。
　　　　↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑まずはこれを解決したいです。

なにかお気づきの点がありましたらご指摘ください。
...
PythonでJSON出力する際、日本語が文字化けする件

##### ●動作環境
- Winodws 10(Pro 64bit)
- Python 3.6.7

##### ●事象
Pythonにて、json.dump()でJSONファイルを出力すると日本語が化ける

##### ●原因
書込みの際、文字エンコーディングをUTF-8に指定していないため

##### ●対応
Python標準のcodecsモジュールで書込み時のエンコーディングを
UTF-8に指定することで解決 
(2021/02/19 コードサンプルを修正）

```
import codecs
import json

# ファイル書き込み先用オブジェクトを生成
# なお、これよりもwith句を用いたほうが、クローズ忘れを防げます
JSONFile = '/hoge/hoge.json'
fw = codecs.open(JSONFile , 'w', 'utf-8')

# JSON書き出し
dict = {"ほげ":"ほげ"}
json.dump(dict, fw, ensure_ascii=False)

# 書き込みオブジェクトを閉じる
fw.close()

# /hoge/hoge.jsonに書き出されていることを確認
```
Cordova --- axios で BLOB ファイルをダウロードする

#Platform
- cordova

#Library
- axios
    - https://github.com/axios/axios

#Usage
```javascript:downloadBlob.js
const axios = require('axios');
const downLink = 'your_blob_download_url';
var myFileName = 'myZip.zip';

axios({
    method: 'get',
    url: downLink,
    headers: {
        'Access-Control-Allow-Headers': '*',
        'Access-Control-Allow-Origin': '*'
    },
    responseType: 'arraybuffer'
}).then((response)=>{
    var blob = new Blob([response.data], { type: 'application/zip' }); // *1 type-> MIME Types
    window.resolveLocalFileSystemURL(downloadPath, (fileEntry) => { // *2
        fileEntry.getFile(myFileName, {create: true}, (entry)=>{ //*2
            entry.createWriter((fileWriter)=>{ // *3
                fileWriter.write(blob); // *3
                resolve();
            },(error)=>{
                reject(error);
            });
        });
    });
}).catch((reason)=>{
    reject(reason);
});
```

# Reference
****1*** https://developer.mozilla.org/ja/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Complete_list_of_MIME_types
****2*** https://cordova.apache.org/docs/en/latest/reference/cordova-plugin-file/
****3*** https://cordova.apache.org/docs/en/2.7.0/cordova/file/filewriter/filewriter.html
**axios** https://github.com/axios/axios
Gitリポジトリを作った後にやること

# これは何
- 自分用のメモ
- AWS環境の構築をしたりLambda Functionを書くためにGitリポジトリを作った直後、この設定だけはやっておく
- macOS での作業を想定

# git-secrets 設定

AWSのアクセスキーを外部に漏らさないために設定する

[クラウド破産しないように git-secrets を使う](https://qiita.com/pottava/items/4c602c97aacf10c058f1)

``` sh
$ cd /path/to/your/repository
$ git secrets --install
```

# .gitignore 作成

gitignore.io もしくは gibo を使って .gitignore を生成する。

- [gitignore.io](https://www.gitignore.io/)
- [gibo](https://github.com/simonwhitaker/gibo)

``` sh
## gitignore.io を使う場合
## macOSのターミナルで .gitignore にコピペする
$ pbpaste > .gitignore
```
``` sh
## gibo を使う場合
# gibo list で対応するフォーマットを探す
$ gibo list

# gibo dump で .gitignore 出力
$ gibo dump macOS >> .gitignore
$ gibo dump Python >> .gitignore
$ gibo dump VirtualEnv >> .gitignore
```

## (Optional) .envrc を退避

[direnv](https://github.com/direnv/direnv) で環境変数にAWSのクレデンシャルを埋めている場合は .gitignore に追記する

``` sh
$ echo "*.envrc" >> .gitignore
```
MenuItemのRoleはどう決まっているのか？

WPFのMenuItemのRoleプロパティについて、どういったMenuItemがどのRoleになるのかの解説が（ざっと見た限り）なかったので、画像入りでメモ。

# サンプル
```xaml:MainWindow.xaml
<Window x:Class="WpfApp2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d" Title="MainWindow" Height="100" Width="200">
    <Window.Resources>
        <Style TargetType="MenuItem">
            <Setter Property="Header" Value="{Binding Role, RelativeSource={RelativeSource Self}}"/>
        </Style>
    </Window.Resources>
    <Menu  VerticalAlignment="Top">
        <!--TopLevelHeader-->
        <MenuItem>
            <!--SubmenuHeader-->
            <MenuItem>
                <!--SubmenuItem-->
                <MenuItem/>
            </MenuItem>
            <!--SubmenuItem-->
            <MenuItem/>
        </MenuItem>
        <!--TopLevelItem-->
        <MenuItem/>
    </Menu>
</Window>
```

上記のようなXAMLを記述した場合の表示結果は以下の通り。
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123548/bfc8644b-4a2f-091a-c630-e78a5d0d9477.png)


# まとめると
* Menuの子要素であればTopLevel〇〇、そうでなければSubmenu〇〇
* 自身が子要素を持てば〇〇Header, 持たなければ〇〇Item

# 備考
通常だとTopLevelHeaderになる要素でも、IsCheckable = trueならばTopLevelItemになります。[参考:MenuItem.cs](https://referencesource.microsoft.com/#PresentationFramework/src/Framework/System/Windows/Controls/MenuItem.cs)
npmパッケージのserveで立てたローカルサーバーでReact Appを確認する方法

#概要
npmパッケージのserveを使ってローカルに立ち上げたサーバーでReact Appを確認する方法です．
主に，ビルドしたファイル群をリモートのサーバーにデプロイする前にローカル環境で確認したい人向けです．

##環境
Node.js >= 6
npm >= 5.2 

##React開発環境のセットアップ
```
npx create-react-app my-app
cd my-app
npm start
```
ブラウザで http://localhost:3000/ にアクセスしてこんな感じの画面が出てこれば無事にセットアップ完了です．
ctr+cで開発用サーバーを終了してください．

<img width="1354" alt="スクリーンショット 2019-05-20 15.06.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390000/d9f5df9e-62ff-f46f-6602-7e968597110a.png">

##Reactのビルド
```
npm run build
```
ホスティングするファイル群がbuildディレククトリに生成されます．

##serveのインストール
```
npm install serve -g
```

##ローカルサーバー立ち上げ
```
serve -s ./build
```
デフォルトのポートが5000なので， http://localhost:5000 にアクセスすればビルドしたReact Appが確認できます．
docker-composeでサクッと始めるRuby on Rails

## TL;DR

掲題の通りですが、`docker` + `docker-compose`を使ってローカルにRails環境をセットアップします

※ n番煎じかわかりませんが、自分用ということで…

## 準備

mac + Docker for Macです

* macOS 10.14.5
* docker 18.09.2
* docker-compose 1.23.2

※ Docker for Macは[こちら](https://docs.docker.com/docker-for-mac/)から

### ディレクトリ構成

```
.
├── .env
├── docker
│   └── nginx
│       └── etc
│           └── nginx
│               └── conf.d
│                   └── default.conf
└── docker-compose.yml
```

#### docker-compose.yml

```yaml
version: '3'
services:
  app:
    image: ruby:latest
    volumes:
      - .:/app:cached
    tty: true
    depends_on:
     - db
  nginx:
    image: nginx:alpine
    volumes:
      - .:/var/www:cached
      - ./docker/nginx/etc/nginx/conf.d:/etc/nginx/conf.d
    ports:
      - "8001:80"
    depends_on:
      - app
  db:
    image: mysql:5.7
    volumes:
      - mysql:/var/lib/mysql
    environment:
      - MYSQL_DATABASE=${MYSQL_DATABASE}
      - MYSQL_USER=${MYSQL_USER}
      - MYSQL_PASSWORD=${MYSQL_PASSWORD}
      - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}

volumes:
  mysql:
    driver: local
```

#### .env

```
MYSQL_DATABASE=testdb
MYSQL_USER=testuser
MYSQL_PASSWORD=testpass
MYSQL_ROOT_PASSWORD=testrootpass
```

#### docker/nginx/etc/nginx/conf.d/default.conf

```
server {
    listen 80;
    listen [::]:80 ipv6only=on;
    server_name http;
    root /var/www/public;

    location / {
        proxy_pass http://app:3000;
    }
}
```

## 手順

### ローカル

```
$ docker-compose up -d
$ docker-compose ps
$ docker-compose exec app bash
```

### appコンテナ

以降はappコンテナ内でのオペレーション

```
# cd /app
# gem install rails
# rails new .
```

### 再びローカル

以下のようにGemfileを一部編集（マウントしてるのでローカルで編集する）

```
# gem 'mini_racer', platforms: :ruby
```

↓

```
gem 'mini_racer', platforms: :ruby
```

### 再びappコンテナ

コンテナ内で続き

```
# cd /app
# bundle install
# rails s -b 0.0.0.0
```

## 動作確認

http://localhost:8001 にアクセスして「Yay! You’re on Rails!」確認できればOK

## まとめ

`-b 0.0.0.0` オプションの必要性に気づけず、地味に502で時間浪費しました…

[GitHub](https://github.com/halnique/rails-docker-compose)にも上げたので、cloneしてもらえばすぐに手順のコマンドから試せそうです

（`.env`は`.env.example`から自分で作ってね）

自分用でRailsアプリケーション作りながらメンテしていくかもしれません
データサイエンティストになるための(一変数)複素解析入門-第一回-

#初めに
今回,Qiitaに初めて投稿させていただきます.
私が理学系出身ということもあり,データサイエンスで利用する数学について不定期かつバラバラに,そのmotivationと軽い解説を行います. また,時には論文解説も含めた最新の研究も紹介できたら,と思います.
内容としましては,関数解析,それに絡めて,複素解析(もちろん一変数)やフーリエ解析,また,測度論や確率・統計や位相幾何の基礎知識について解説できたら,と思います.
今回は,複素解析について軽い解説を行いたいと思います.
#なぜ複素？

##複素数の定義
複素数の定義は今更,説明いらないかと思いますが一応書いておくと
複素数$z$は実数$x,y$を用いて,
           $z=x+iy$　　        (1)
と書けるもののことでここで$i$は虚数のことで二乗すると$-1$になるようなもののことです.
##複素数がいる理由
数学的議論は取り除いてイメージだけを伝えるとするなら,複素解析-複素数範囲の微積分-がいる大きな理由の一つに「積分範囲を虚数まで広げることにより実数範囲だけでは考えれなかった積分を行うため.」というものがあります.
ちょうど,高校生の時に習ったような二次方程式の判別式$D$が負の時,虚数範囲なら解を持つのはおぼえているでしょうか.根本的な考え方は異なるけれど,虚数範囲まで拡大することで,計算がスムーズに行えるようになるのには違いないはずだと思います.
#複素数の微分
##微分の定義と正則性
複素数$z$に対して微分は
$f'(z)=\displaystyle\lim_{z \to a}\frac{f(z)-f(a)}{z-a}$   (2)
と,定義されます.この時,$f$は点$a$で(複素)微分可能といいます.
また,ここで重要な単語があり,点$a$を含む「近傍」で(複素)微分可能な時,$f$は点$a$で「正則」であるという.この概念は非常に重要なので覚えておいてください.
近傍の意味は,数学的には位相空間論の知識がいるのでイメージだけ伝えておくと,点$a$を含む「近傍」とは点$a$を含むある複素平面の範囲$A$が常に存在していることを指す用語である.
すなわち,$A$をいくら狭めてもそれより小さい$A$(ややこしいので後者を$A'$と仮に置く.)が常にあるような状況を指す単語である.

今回は短いですがこの辺りにしておきます.
次回はコーシー・リーマン関係式と正則性の関係から述べたいと思います.
コンピュータのプログラムとは

# コンピュータの性質
- 一度に一つのことを行う
 - 制御部の動作がシンプルになるので、設計が容易になる。
 - 動作を追うことが容易になる。
 - 並行処理が有効な場面では、スピードの面で不利になる。
 - 複雑な処理の場合、制御部を通じた処理手順が増える。

厳密な動作を行う必要がある組み込み系コンピュータでは、この性質が重要になってくる。

# プログラムとは
データの移動、データの計算を`いつ`、`どのような`場合に実行するのかを決めるのがプログラム

# コンピュータの性能を表す数値
1. スループット
1秒間あたりの処理の数
単位は`1/秒`
クロック周波数も同じ単位を持っている。
例：3.6GHzは1秒間に36億回クロック信号を発生させる。

2. レイテンシ
処理を指示してから最初の結果を得られるまでにかかった時間
応答時間あるいは遅れ時間とも呼ばれる。
単位は`秒`

# プログラムの条件の例（`いつ`、`どのような`をどこで判断するのか）
- 計算結果が0になった
 - ゼロフラグ（ZF）が1になる
- 計算の結果桁上りが出た
 - キャリーフラグ（CF)が1になる

`フラグ`と呼ばれる一種のメモリを参照することで条件が満たされたかどうか判断する。

# 最小完全セットという考え方
演算機能には以下の3つが最低限必要となる。
1. 加算
2の補数表現を使うことで、減算（つまり`ー`)を表すことができる
2. シフト
ビット単位を左右にずらす
3. 論理演算
AND,OR,NOT,XOR

上記3つを加えたものを`ALU(Arithmetic and Logic Unit)`と呼ぶ

# アセンブリ言語とC言語
コンピュータの種類によって異なるアセンブリ言語を、一つの統一された表現に言い換えたのがC言語

C言語

```
if (a == b) {
①
} else {
②
}
③
```

アセンブリ言語
cmp: compare
jz: jump zero
jmp: jump

```
cmp a,b
jz ①
処理②
jmp ③
処理①
処理③
```
# 参照
[コンピュータのしくみ2019](https://www.fisdom.org/F00000081/)
console.log の落とし穴：console.log にはオブジェクトの参照が渡るので気を付けよう

# TL; DR
`console.log()`に大きなオブジェクトや配列を渡すと、`console.log()`を呼び出した時点での値ではなく、コンソールでそれをクリック展開した時点で評価した値が表示される。

# もう少し詳しく
`console.log()`に大きなオブジェクトを渡すとコンソール上で省略されて表示されますが、その省略表示を展開すると、**`console.log()`が呼び出された時点の値ではなく、展開したその時点で評価した値が表示されます**。

つまり例えばあるオブジェクトに操作を施す**前**に`console.log`を書いていても、実行終了後のコンソールには操作を施した**後**のオブジェクトが表示されるということです。

要はオブジェクトへの参照を保持しているような挙動です（[参考](https://developer.mozilla.org/ja/docs/Web/API/Console/log#Parameters)）。

# 例
（以下の例ではわかりやすさのため常に省略表示される`console.dir`を使っています）

`obj.a`をに値を代入する前後でログを取っているのに、代入後の値しか取れていません。

```Javascript
let obj = {
  a: 'foo'
}

console.dir(obj) // => {a: 'bar'}
obj.a = "bar"
console.dir(obj) // => {a: 'bar'}
```

確認した限りではChrome, Firefox, Edge, IE11の2019年5月現在の最新バージョンで再現できました。

##### Chrome74
![console_log_chrome.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123809/fb063b7b-48e0-7916-753d-00d65fc4bb4d.png)

##### FireFox66
![console_lof_FF.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123809/67dd020e-d947-4b08-ff4c-2f1e61890a2e.png)

ちなみにChromeでは、横の`i`アイコンをホバーすると「値はたったいま評価されたものだよ」と教えてくれます。

![chrome_tip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123809/1c62c751-96e9-bd4a-dca3-a3627b698668.png)

# なぜ呼び出した時点の値を教えてくれないのか

[このStack Overflow](https://stackoverflow.com/questions/5223513/why-doesnt-console-log-take-a-snapshot-of-the-passed-variables)では、

- 各時点でのオブジェクトを保持しておくとすると、メモリや計算量的にヤバいから
- 参照ではなく文字列として保持しておくとすると、循環参照があった場合にマズいから

などの理由が指摘されていました。

# ではどうすればいいか

##### ① コピーを渡す

```JavaScript
let obj = {
  a: 'foo'
}

console.dir({...obj}) // => {a: 'foo'}
obj.a = "bar"
console.dir(obj) // => {a: 'bar'}
```

スプレッド構文で（シャロー）コピーを作って渡しているため、`obj.a`は後の変更の影響を受けません。

![solution.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123809/85cad7d4-c966-2b69-f119-2d363d1fa545.png)

ただし[コピーは1段階の深さで行われる](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Spread_syntax#spread_in_array_literals)ため、`obj`がネストしている場合ネストされた部分は変更の影響を受けてしまいます。
その場合は何らかのライブラリのディープコピー用関数を用いるしかなさそうです。

##### ② 一度文字列に変換する
[MDN](https://developer.mozilla.org/ja/docs/Web/API/Console/log#%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%AE%E3%83%AD%E3%82%B0)にあった解決法です。

```Javascript
let obj = {
  a: 'foo'
}

console.log(JSON.parse(JSON.stringify(obj)));
obj.a = "bar"
console.log(JSON.parse(JSON.stringify(obj)));
```

ただし文字列にする関係上、**循環参照があった場合はエラーになります**。

##### ③ ブレークポイントを使う

欲しい所で止めれば当然その時点の値が取れます。

##### ④ プロパティの値を渡す

追跡したいプロパティ`a`の値がプリミティブ型なら`console.log(obj.a)`のようにやるのが簡単ですね。

##### ⑤ オブジェクトを変化させない

オブジェクトがイミュータブルであればいつ`console.log`を取っても同じ値が表示されます！


他にも良い方法があれば是非教えてください。

# まとめ
`console.log()`で大きなオブジェクトや配列のデバッグをするときは、参照が渡る挙動をすることを忘れないようにしましょう（私は忘れて混乱することがありました）。
Dockerでubuntu とMongoDBを起動する

Dockerを理解する上での基礎コマンドなど、勉強時のメモです。

1.Dockerの起動
---
ubuntuイメージを起動
---
```
//ubuntuイメージ。topコマンドを実行
$docker container run -t ubuntu top
```

ホスト(ローカル）にイメージがダウンロードされ、Topコマンドが表示されます。
→ubuntuはインストールしていないが、ホストのカーネルを用いてコンテナが起動し、ubuntuの"top”コマンドを実行していることがわかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319276/b60ff5c7-b4a5-15e2-9ca1-5e7965678819.png)

Dockerにログイン
---
```
$ docker exec -it [CONTAINER ID] bash
root@[CONTAINER ID]:/#  //コンテナへのターミナル画面が出てきます。
root@[CONTAINER ID]:/# ps  -ef //コンテナのプロセスのみが表示
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 04:35 pts/0    00:00:00 top
root        18     0  1 04:55 pts/1    00:00:00 bash
root        28    18  0 04:55 pts/1    00:00:00 ps -ef
```
※SSHではなくカーネルの機能を使って操作されている。

2.複数のコンテナ起動
--
nginxコンテナ起動
---
※Docker Hubからイメージがダウンロードされます。

```
$docker container run --detach --publish 8080:80 --name nginx nginx
```

[dockerコマンドオプション]
--detach : バックグラウンド起動

nginxにアクセス
---

**http://localhost:8080**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319276/e8e0d0f7-0c7a-ee80-ebb4-d84ed75008ea.png)

MongoDBコンテナ起動
---
```
$docker container run --detach --publish 8081:27017 --name mongo mongo
$docker ps //起動中のコンテナ確認
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS                     NAMES
56d7b0e62ee5        mongo:3.4           "docker-entrypoint.s…"   About a minute ago   Up About a minute   0.0.0.0:8081->27017/tcp   mongo
99750ad2b8a7        nginx               "nginx -g 'daemon of…"   7 minutes ago        Up 7 minutes        0.0.0.0:8080->80/tcp      nginx
d9b218aee00a        ubuntu              "top"                    34 minutes ago       Up 34 minutes                                 admiring_swanson
```
→複数のコンテナが起動しているよ！

コンテナの停止
---
```
$ docker ps //稼働しているコンテナの確認
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS                     NAMES
56d7b0e62ee5        mongo:3.4           "docker-entrypoint.s…"   About a minute ago   Up About a minute   0.0.0.0:8081->27017/tcp   mongo
99750ad2b8a7        nginx               "nginx -g 'daemon of…"   7 minutes ago        Up 7 minutes        0.0.0.0:8080->80/tcp      nginx
d9b218aee00a        ubuntu              "top"                    34 minutes ago       Up 34 minutes                                 admiring_swanson

$ docker stop 56d 997 d9b //停止コマンド
56d
997
d9b
$ docker ps　//コンテナが停止
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
$ docker system prune //残っているプロセスなども削除
WARNING! This will remove:
        - all stopped containers
        - all networks not used by at least one container
        - all dangling images
        - all dangling build cache
Are you sure you want to continue? [y/N] y
```
Rubyでのクローラー作成

# Rubyでのクローラー作成

### はじめに
まだ、Rubyでの開発経験、業務経験がものすごく浅い新米プログラマーです。自分が業務で学んだことのアウトプットの場としてここに記事を残したいと思います。アドバイスや誤認訂正などがありましたら是非お願いします。


### クローラーとは
以下の参考サイトによると
 WEB上のファイルを収集するためのプログラムのようです。

参考文献
https://www.seohacks.net/basic/terms/crawler/

### クローラーの中で起こっていること
クローラープログラムがどんなステップを踏んでいるのか大枠をまとめます

1. そのサイトに取得しているurlを基にしてアクセス
2. Nokogiriでのhtml解析が行われる
3. 自分が収集したい情報をhtmlのエレメントパスなどで指定をし取得
4. 取得情報をcsvなどのファイル形式で出力する

### 実際のコード
上司に概要を教えていただき、細かいところを自分で詰めて書きました。
 
#### 必要なgemファイル
いかに示すgemが必要になります。プログラムの冒頭に書いてください。


``` ruby:crawler.rb
require 'open-uri'
require 'nokogiri'
require 'csv'
```

### クローラーの中身
#### 設定
サイトでの一覧ページから各々の詳細ページに飛び、その中にあるexample_nameを取得するという形式でクロールしてます。

コードに移ります。require文以下に書き足してください。
何をしているかをコメントでできるだけ残しました。

``` ruby:crawler.rb
class Crawler

  def run
　　＃csvファイルを書き出すのに必要
    File.open('example.csv','w') do |csv|  
    
      (1..100).each do |id|
　　
        url = example_url(id)   # privateメソッドに飛びurlを取得
        uri = URI.parse(url) 

        html = uri.read  # サーバにアクセス
        doc = Nokogiri::HTML.parse(html) #そのページの要素を分解

        sleep(0.5) #インターバルを置いておかないと相手サーバーに負荷をかけるので必ず必要!!!　
    
　　　　　　　#　.searchは複数要素を検索 .atは単数要素検索 カッコ内には取得したい情報のエレメントパスを入力       
              example_name = doc.search('.box > h3').first.text  

              
              # csvファイルに出力

              csv << [
                "#{id}",
                  "#{example_name}",
                  "#{url}\n"
              ].join(',')     #csv形式はカンマで分かれている形式（Comma-separated-value）のため要素を,でつなぐ

          end
      end
    end
  end

private

   def example_url(id)
    "https://example.com/index/id=#{id}"
   end

end
```

### 実際にプログラムを走らせる
``` ruby:crawler.rb

crawler = Crawler.new
crawler.run
    
```

```
bundle exec ruby プログラム名
```
で実際にプログラムを走らせます。gemを使っているので実行前にそのgemを読み込むというステップが必要です。そのステップは、
**bundle exec** 
が担ってくれます。私はここを知らずにずっと悩んでました。

また、プログラムが実行されるとcsvファイルが新しく作成されます。
私は、同名のファイルをカレントディレクトリにマニュアルで作成して、プログラムを走らせれば作成したファイルに書き出されると思いました。しかし、今回の書き方では新規ファイルが別に作成されます。なので、csv形式のファイルを用意しなくても大丈夫でした。

### 終わりに
今回作成したこのプログラムは、インターン先で初めて任せていただいた仕事でした。色々と処理の仕方で上司から学ぶことや、自分の知識不足が認識できたので、勉強していきたいと思います。誰かの参考になれば幸いです。
【蟻本】Lake Counting p.36 をPython3で書いてみた

プログラミングコンテストチャレンジブック（通称蟻本・アリ本）第2版のp.36のLake Counting (POJ No.2386) をPython3で書いてみました。

```python
N, M = 10, 12
field = [['W', '.', '.',  '.', '.', '.', '.', '.', '.', 'W', 'W', '.'],
         ['.', 'W', 'W', 'W', '.', '.', '.', '.', '.', 'W', 'W', 'W'],
         ['.', '.', '.', '.', 'W', 'W', '.', '.', '.', 'W', 'W', '.'],
         ['.', '.', '.', '.', '.', '.', '.', '.', '.', 'W', 'W', '.'],
         ['.', '.', '.', '.', '.', '.', '.', '.', '.', 'W', '.', '.'],
         ['.', '.', 'W', '.', '.', '.', '.', '.', '.', 'W', '.', '.'],
         ['.', 'W', '.', 'W', '.', '.', '.', '.', '.', 'W', 'W', '.'],
         ['W', '.', 'W', '.', 'W', '.', '.', '.', '.', '.', 'W', '.'],
         ['.', 'W', '.', 'W', '.', '.', '.', '.', '.', '.', 'W', '.'],
         ['.', '.', 'W', '.', '.', '.', '.', '.', '.', '.', 'W', '.']]

def dfs(x, y):
    # 今いるところを、に置き換える
    field[x][y] = '.'
    
    # 移動する8方向をループ
    for dx in range(-1,2):
        for dy in range(-1,2):
            # x方向にdx y方向にdy 移動した場所を (nx, ny) とする
            nx = x + dx
            ny = y + dy
            
            # まずnx と ny が庭の範囲内かどうかを判定 (ここはC++とは違う書き方をしなければならない)
            if 0 <= nx and nx <= N-1 and 0 <= ny and ny <= M-1:
                # field[nx][ny] が水溜まりかどうかを判定
                if field[nx][ny] == 'W':
                    dfs(nx, ny)
                
def solve():
    res = 0
    for i in range(N):
        for j in range(M):
            if field[i][j] == 'W':
                # W が残っているならそこから dfs を始める
                dfs(i, j)
                res += 1
            
    print(res)

solve()
```
Linuxコマンドを検索したときに @IT を検索結果から除外する

# 結論

* AlfredのGoogle検索コマンドで `@IT` がでなくなるように設定する

# 設定

* Alfred の Web Search で Add Custom Search を行う

    * Search URL
        * `https://www.google.co.jp/search?hl=ja&as_q={query}+-www.atmarkit.co.jp`
    * Title
        * Linuxコマンド検索
    * Keyword
        * help

    * TitleとKeywordは好きなようにすれば良いと思う
* 使用例
    * `help find シンボリックリンク 検索`
        * こうすると、一番上に@ITが出てきたのがいなくなる。とても平和である。

# 蛇足

* やたら表示が遅いし、広告が表示されるしで、ウザさが極まっているので@ITには自重していただきたい。
Ubuntu18.04にmysql-server8.0をaptでインストールできるようにするのじゃ

# クイックガイド

1. [公式](https://dev.mysql.com/downloads/repo/apt/)が提供しているパッケージをダウンロードする
2. 認証用の公開鍵を[ダウンロード](https://dev.mysql.com/doc/refman/8.0/en/checking-gpg-signature.html)する
3. インストール&認証を行う

# パッケージのダウソ&インストール

パッケージ本体を`curl`でダウンロードして、ついでにインストールしておく。そのままだとこれ**secure**じゃねーぞって怒られるので、[こちら](https://dev.mysql.com/doc/refman/8.0/en/checking-gpg-signature.html)のページから、**GPG**鍵をコピーしておきます。ファイル名は`mysql_pubkey.asc`とかにしました。

```bash
cd /tmp
curl -LOS https://dev.mysql.com/get/mysql-apt-config_0.8.13-1_all.deb
curl -LOS https://kiwing.ddns.net/public/mysql_pubkey.asc
sudo dpkg -i mysql-apt-config_0.8.13-1_all.deb
sudo apt-key add mysql_pubkey.asc
sudo apt update
sudo apt upgrade
sudo apt install mysql-server libmysqlclient-dev


# 以下、Django連携用...
sudo apt install default-libmysqlclient-dev libmysqlclient21
pip install mysqlclient
```

以上、個人用メモでした！ちゃんちゃん
VirtualBox上にk3osを構築してみる

k3osとは、k3sのシステムを構築する上で必要最小限のものをインストールしたLinux OSみたいな感じです。今回は、それをmacのVirtualBox上にインストールしてみました。

https://k3os.io/

![](https://raw.githubusercontent.com/mba-hack/images/master/k3os-virtualbox-01.png)

k3sとは、k8s(kubernetes)の軽量版です。k8sとは、各サーバーを仮想環境下(コンテナ)で実行し、それをサービスを使うような感覚で連携させることができるシステムみたいなイメージです。k8sの使用感は、OpenShift, IBM Cloudなどを使ってみると実感しやすいかもしれません。

もう少し具体的な説明です。例えば、DBサーバーやWebサーバーなど様々なものがありますが、構築する手順はある程度、定型的です。しかし、アプリをインストールして、起動し、ユーザーを作って、初期設定を終えるという手順を毎回やるのは手間ですし、サーバーを連携、連結させるにも一苦労で、連携に必要な認証情報は毎回違います。これらのサーバー構築及び連結を、まさにサービスを使うような感覚で、簡単に、かつ視覚化、自動化したシステムをk8sと呼びます。ただ、dockerもそうですが、k8sは、重いですし、ディスクをすごく圧迫します。そこで、k8sの軽量であるk3sが便利というわけです。(おそらく

```sh
# https://github.com/rancher/k3os
# インストーラーをダウンロード
$ curl -LO https://github.com/rancher/k3os/releases/download/v0.2.1/k3os-amd64.iso

# ログインユーザーはrancherです。

# ディスクにインストールします。
$ sudo os-config
# rancherのパスワードを設定します。
# 設定はEnterでdefaultを選択していけばいいです。最後のdisk install[y/N]はyにしなければなりません。
```

virtualboxの設定からインストーラーisoをアンマウントします。

再起動すると、sdaにインストールしたk3osが起動します。

先程、設定したパスワードでログインします。
Qiitaなど気になる記事まとめ

色々リンク集

2018.05
[私が爆速で開発するために心がけていること](https://qiita.com/zonomaa/items/70e0ac0d4d6432ad7e11#fn1)

2018.05
[Qiitaで良い記事を書く技術](https://qiita.com/t12u/items/8c28484100dfd3a6351b#%E6%9B%B8%E3%81%8D%E6%89%8B%E3%81%AB%E3%81%A8%E3%81%A3%E3%81%A6%E6%9B%B8%E3%81%8D%E3%82%84%E3%81%99%E3%81%8F%E6%9B%B8%E3%81%8F)

2018.05
[新しく言語を学ぶときに心がけていること](https://qiita.com/hiraike32/items/40ef06f85f6a63828985)

[【未経験から転職】「28歳+空白期間1年+高卒+プログラミング経験なし」が、自社開発の企業からスカウト頂いてエンジニア転職する４ヶ月間の体験談](https://qiita.com/ryoutaku/items/3749b957f2f41545ad09)


# リンク：UIUXについて（人間中心設計　→　心理学）

人間中心設計：訪れるユーザーの体験を軸にWebサイトを調査→分析→設計→評価して、Webサイトを改善していく


[UX白書](http://site.hcdvalue.org/docs)
[ユーザーインタビュー： 実施の理由・方法・タイミング](https://u-site.jp)
[UX MILKは国内外のUX情報を毎朝お届けする、全てのクリエイターのためのUXメディアです。](https://uxmilk.jp)

書籍：UIUXについて
[UXデザインの教科書](https://www.amazon.co.jp/UXデザインの教科書-安藤-昌也/dp/4621300377)
[IA/UXプラクティス モバイル情報アーキテクチャとUXデザイン](https://www.amazon.co.jp/dp/486246324X/)
[インタフェースデザインの心理学 ―ウェブやアプリに新たな視点をもたらす100の指針](https://www.amazon.co.jp/dp/4873115574)
[続・インタフェースデザインの心理学 ─ウェブやアプリに新たな視点をもたらす+100の指針](https://www.amazon.co.jp/dp/4873117712)

磨いて光らせる UX入門
https://www.slideshare.net/susieyy/ux-32650807

UX（ユーザーエクスペリエンス）とは？UXを正しく理解するための全知識【保存版】
https://ux-jump.com/about-ux

# jQuery

slick.jsを使用したスライダをスマホでは適用させてPCでは静止画表示にする方法
https://www.genius-web.co.jp/blog/cat-101/customization-method-of-slick.html

#ガイドライン・設計

HTML作成の効率化（1）-設計編（HTMLのモジュール化など）
https://websas.jp/column/html_efficiency-01

ATOMIC DESIGNは長期的なサイト運営にむいていると思った
https://suppon.innovator.jp.net/entry/atomic_design

スタイルガイドを作成する時のメモ
https://qiita.com/AsagiriDesign/items/a8535870f9b68d712187

質の高いスタイルガイドを作成するために考えておくべきこと
https://www.tam-tam.co.jp/tipsnote/html_css/post14750.html
PC初期設定

PCを新調するにあたって、仕事内容かかわらず必要となるものをメモしておきます
自分用メモになります

## 便利ツール
まずはこれらを入れよう。
ダウンロードするだけ、必須の便利ツール

- 日本語が変換しやすい[Google 日本語入力 – Google - Google.co.jp](https://www.google.co.jp/ime/)
- Webブラウザ[GoogleChrome](https://www.google.com/intl/ja_ALL/chrome/)
- [超便利！10個以上コピーを記憶してくれるMacアプリ【Clipy（クリッピー）】](https://www.infact1.co.jp/staff_blog/webmarketing/14006/)
- Todoツール [Microsoft To Do](
https://apps.apple.com/app/apple-store/id1274495053?mt=8)
- (GitHub App)[https://desktop.github.com/]


## homebrew
まずはHomebrewを導入しましょう。
ターミナルで下記コマンドを入力することでHomebrewをインストールできます。

※インストール時にXcodeが入っている必要があるので、入っていない方はAppStoreからXcodeを導入しておきましょう。

```
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

## npm

[npm入門](https://qiita.com/maitake9116/items/7825d90c09f3e2f87dea)

```
brew install npm
```


## iterm2
#### サイトからダウンロード
[iTerm2 - macOS Terminal Replacement](https://www.iterm2.com/)

#### fish-shellを導入
[fish-shell](https://github.com/fish-shell/fish-shell)
[iTerm2とfish shellを使ったターミナル環境構築のはじめの一歩](https://techblog.lclco.com/entry/2018/02/27/083000)

```
$ brew install fish
$ fish -v
```

インストールが完了したらデフォルトシェルを変更する必要があります。設定後、次回起動時からは bash ではなく、fish が起動されるようになります。

```
# `/etc/shells`に`/usr/local/bin/fish`を追記
$ echo /usr/local/bin/fish | sudo tee -a /etc/shells
# デフォルトシェルを fish に変更
$ chsh -s /usr/local/bin/fish
```

## 設定ファイルを作る
*※この工程はfish_shellを使っている場合は無し*
[.bash_profileと.bashrcのまとめ](https://qiita.com/takutoki/items/021b804b9957fe65e093)
[本当に正しい .bashrc と .bash_profile の使ひ分け](https://qiita.com/magicant/items/d3bb7ea1192e63fba850)

```
// .bash関連の隠しファイルがあるか確認
ls -a
// なければ作る
touch ~/.bashrc
touch ~/.bash_profile
```

## nodebrew
nodeのバージョン管理はできたほうがいいので、まず入れましょう
[node.jsのversionを管理するためにnodebrewを利用する](https://qiita.com/sinmetal/items/154e81823f386279b33c)

```
brew install nodebrew
// nodebrew 有効化
// 以下のコマンドを実行し、 nodebrew 1.0.1 と Usage などが表示されることを確認した上で、
nodebrew
// 以下のコマンドでセットアップを実行します。
nodebrew setup
```

### パスを通すため設定ファイルを編集

```:.bash_profile
// nodebrewのパスを通す
export PATH=$HOME/.nodebrew/current/bin:$PATH
```

```
source ~/.bash_profile
```

※ｚｓｈを使っている場合は、 .zshrc に PATH を追加します。
vim で .zshrc を開き
```
vim ~/.zshrc
```

i を押してインサートモードにし、以下を貼り付けた上で esc を押してから :wq と入力してエンターを押し保存します。

```
export PATH=$HOME/.nodebrew/current/bin:$PATH
```

*※fish_shellを使っていたら以下だけでパス設定OK*

```
set -x PATH $HOME/.nodebrew/current/bin $PATH
```

#### 参考
[Term2の導入方法＆初期設定や使い方まとめ](http://vdeep.net/iterm2)

## プログラミング用フォントのインストール
RictyをMacにインストールする
homebrewを使うと簡単です。

```
brew tap sanemat/font

# rictyをインストールします
brew install ricty
```

## Visual Studio
コード書いている時の予測変換がAtomよりいいので乗り換えました
Microsoft製なので敬遠していたけど、無料でとても優秀
テキストエディタとしても使えるし、htmlも、Markdownも、プログラミングも利用できる。
拡張機能が豊富で、「Markdownで書く→pdfやhtmlで出力する」という使い方が超便利。

[ダウンロード](https://visualstudio.microsoft.com/ja/)

## メモ帳

#### Microsoft OneNote
とても使いやすいおすすめのノート。スマホバージョンなどもあって同期も便利。
[ダウンロード](https://itunes.apple.com/jp/app/microsoft-onenote/id784801555?mt=12)

### mi
簡単なメモやファイルの作成はこれがシンプルで便利
[ダウンロード](https://www.mimikaki.net/)

### Gravit Designer
無料で優秀なデザインツール
https://www.designer.io/en/
DX系の技術に対する情報収集先をまとめてみる

# はじめに
仕事でKubernetesをはじめとするCloud Native関連技術を使いこなす必要があるのだが、この辺の技術は非常に足が速く流行り廃りが激しいと感じている。
新しい技術が登場するたびに気になることも出てきたり、それなりに最新情報をキャッチアップしておかないと乗り遅れてしまうというプレッシャーがある。
そこで情報収集先の情報をまとめてみることにした。
(似たような記事もあるかもしれませんが、自分なりにまとめないとイマイチ染み込まないのでご了承ください)
# Web系企業・エンジニア技術ブログ
まずはDX系の技術を使いこなしている方々が一番参考になると思う。
彼らが自社サービスを改善していくにあたりぶつかった課題、どんな事を気にしているか、などをリサーチできる。

* [クックパッド開発者ブログ](https://techlife.cookpad.com/)
* [Hatena Developer Blog](https://developer.hatenastaff.com/)
* [サイボウズ式 | 新しい価値を生み出すチームのメディア](https://cybozushiki.cybozu.co.jp/)
* [Mercari Engineering Blog](https://tech.mercari.com/)
* [Blog - LINE ENGINEERING](https://engineering.linecorp.com/ja/blog/)
* [Yahoo! JAPAN Tech Blog](https://techblog.yahoo.co.jp/)

* [Uber Engineering Blog](https://eng.uber.com/)
* [Airbnb Engineering & Data Science – Medium](https://medium.com/airbnb-engineering)
* [Netflix TechBlog – Medium](https://medium.com/netflix-techblog)
* [Facebook Code - Facebook Engineering Blog](https://code.fb.com/)

* [Amazon Web Services ブログ](https://aws.amazon.com/jp/blogs/news/)
* [Blog | Microsoft Azure](https://azure.microsoft.com/en-us/blog/)

* [クラスメソッド発「やってみた」系技術メディア | Developers.IO](https://dev.classmethod.jp/)
* [InfoQ: Software Development News, Videos & Books](https://www.infoq.com/)
# 推進団体など
Cloud Nativeといえばここは押さえておきたいところ。
* [Blog Archives - Cloud Native Computing Foundation](https://www.cncf.io/category/blog/)
# さいごに
随時追加していく予定です。
とりあえずメモレベルでしかありませんが、今後とも長い目で見ていただけると助かります。
memento pattern

# memento pattern
## ケース
オブジェクトの状態を元に戻したいとき

## 結果
### pros
カプセル化を壊さない。
Original class を汚さない

### cons

言語によってはnarrow インターフェイス, wideインターフェイスを区別していない
memento objectのコストが高い場合もある


## example
```
class Originator {
    func createMemento() -> NarrowMementoProtocol {
        let m = Memento()
        // m.state = self.state
        return m
    }

    func setMemento(memento: NarrowMementoProtocol) {
        guard let m = memento as? NarrowMementoProtocol else { return }
        // self.state = m.state
    }
}

class CareTaker {
    private var mementos: [NarrowMementoProtocol]

    func do() {
        let originator = Originator()
        let memento = originator.createMemento()
        mementos.append(memento)
        // originator.doSomething
    }

    func undo() {
        let originator = Originator()
        let memento = mementos.last // TODO: nil care
        originator.setMemento(memento)
        // originator.undoSomething
    }
}

protocol NarrowMementoProtocol { // empty protocol }

class Memento: NarrowMementoProtocol {
    var state: State
}
```
プログラミングで理解しづらい単語とか

#静的型付けと動的型付け
プログラムを実行前に型検査を行うのが静的な型付け、静的型付けであり、プログラムを実行しながら型検査を行うのが動的な型付け、動的型付けである。
ただし、静的型付け言語と分類されている言語であっても、部分的に動的（プログラム実行中）に型の検査を行う言語もあるため、あくまで”分類”すればという意味合いで捉えて良いと思う。

#変数の型

#値の型（データ型）

#プリミティブ型とそれ以外

#リテラル
数値や文字列など変数に代入などする「値」そのもの。

#ミュータブルとイミュータブル
ミュータブル・・・可変
イミュータブル・・・不変
（個人的な考え。コードを読んだり、テストするときは、「世の中は基本的にミュータブルである」と思って深く探るようにしている。）
php-master-changes 2019-05-19

今日はドキュメントの整理、chr() 呼び出し時の引数の誤りについてのエラーメッセージの修正があった！

# 2019-05-19
## petk: [ci skip] Join Zend engine docs-alike files to readme
- https://github.com/php/php-src/commit/256100a9b57113915c4ea7f203a9d094eaa129a0
- [7.4~]
- Zend Engine に関するドキュメントを Zend/README.md へ統合

## carusogabriel: Make chr ZPP failure message consistent with ext/standard
- https://github.com/php/php-src/commit/714d9fc358640069bda5540c2b1136a6241c4c94
- [7.4~]
- [chr()](https://www.php.net/manual/ja/function.chr.php) 呼び出し時の引数の誤りについてエラーメッセージを修正

## petk: Move CODING_STANDARDS to CODING_STANDARDS.md
- https://github.com/php/php-src/commit/fafcdc4d57b8f5f7090ab4fd489f94fa41a3295e
- CODING_STANDARDS を CODING_STANDARDS.md へリネーム

## petk: [ci skip] Migrate Coding standards docs to Markdown
- https://github.com/php/php-src/commit/f45b61b8988b5b2d80dd4a1df7edd04282cf319a
- [7.4~]
- CODING_STANDARDS.md の中身をマークダウン化

## carusogabriel: Fix tests related to [714d9fc358640069bda5540c2b1136a6241c4c94](https://github.com/php/php-src/commit/714d9fc358640069bda5540c2b1136a6241c4c94)
- https://github.com/php/php-src/commit/0cc63b9d2d31b3aeefed21cd486188ba149f31a7
- [chr() のエラーメッセージ修正](#carusogabriel-make-chr-zpp-failure-message-consistent-with-extstandard) のテストでマージミスで消えていた部分の修正

## carusogabriel: Fix test related to [714d9fc358640069bda5540c2b1136a6241c4c94](https://github.com/php/php-src/commit/714d9fc358640069bda5540c2b1136a6241c4c94)
- https://github.com/php/php-src/commit/53d1a42c322053cd22488ebb451e2708bc3fefa6
- [chr() のエラーメッセージ修正](#carusogabriel-make-chr-zpp-failure-message-consistent-with-extstandard) のテストを修正
element ui selectboxの値に応じて動的にvalidate

例えば セレクトボックスが 1 を選択している場合のみ、
テキストフィールドを表示し、バリデートしたい。

# 考え方

・フォーム送信前に、自前でバリデートを用意。
・通ったらそのまま。通らなければエラー文を追加し、 return。

参考
https://koty.hatenablog.com/entry/2018/12/11/051226

```

<template>

<el-form :model="form" ref="form">

    <el-form-item prop="type" label="使う・使わない">
        <el-select v-model="form.type" filterable placeholder="Select">
            <el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value">
            </el-option>
        </el-select>
    </el-form-item>



    <el-form-item :error="originalValidate" v-if="form.type" prop="form" label="使うときだけ入力">
        <el-input v-model="form.text"></el-input>
    </el-form-item>

    <el-button @click="onClick">保存</el-button>


</el-form>

</template>


<script>

    export default {
        data() {
            return {
                options: [{
                    value: true,
                    label: '使う'
                }, {
                    value: false,
                    label: '使わない'
                }],
                form: {
                    type: true,
                    text: ''
                },
                originalValidate: ""
            };
        },
        methods: {
            onClick: function() {

                //フォーム送信前に自分でヴァリデートさせる
                this.originalValidate = "";


                //タイプが0でない場合のみ以下を実行
                if (this.form.type) {

                    //テキストがない場合
                    //ここで自分のオリジナルヴァリデートを書く必要がある
                    if(this.form.text.length === 0){

                        //このエラーが表示される
                        this.originalValidate = "入力必須です";
                        return;
                    }

                }

                var form = this.$refs.form;
                form.validate(isValid => {

                    // 保存処理
                    this.$message({
                        message: '保存しました',
                        type: 'success'
                    });
                });
            }
        }

    }
</script>

```
mediator pattern

# mediator pattern

オブジェクトがどのように協調するかを抽出。

## ケース
formと各input

## 結果
### pros

要素の結合がなくなる


## example
```
class FormMediator {
    func inputChanged()
}

class TextInput {
    private let mediator: FormMediator

    init(mediator: FormMediator) {
        self.mediator = mediator
    }

    func acceptInput() {
        mediator.inputChanged() // selfを渡してmediatorに何が変わったかを伝えるのもあり
    }
}

class CheckboxInput {
    private let mediator: FormMediator

    init(mediator: FormMediator) {
        self.mediator = mediator
    }

    func changed() {
        mediator.inputChanged() // selfを渡してmediatorに何が変わったかを伝えるのもあり
    }
}

class OrdinaryFormMediator: FormMediator {
    private let textInput: TextInput
    private let textInput: CheckboxInput

    func inputChanged() { // elementを引数でもらうのもあり
        // something like
        // textInput.disable()
    }
}
```

observer patternで通知するのもあり
AWSにおける認証認可の種類整理

##はじめに
自分の説明用にAWSサービスに対するIAMのアクセス制御のについて整理したいと思います。

##参考ドキュメント
https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/reference_aws-services-that-work-with-iam.html

##種類

認証の種類としては、大きく3つに分類できます。
- 基本的なIAM認証
    - IAMユーザのID/パスワードでの認証
    - IMAユーザのAccess Key/Secret Access Keyでの認証
- 一時認証情報(Temporary credentials)
    - IDフェデレーション、クロスアカウントロール。、サービスロールを使用した認証
- サービスにリンクしたロール
    - AWSサービスに付与されたIAMロールによる認証

認可としては、大きく2つに分類できます。
- アイデンティティベースのポリシー
    - IAMポリシーにアクセス制御を記述してIAMユーザ、IAMグループ、IAMロールに付与する形で認可。管理ポリシーとインラインポリシーの2パターンあり。
- リソースベースのポリシー
    - AWSリソースに対して、インラインでポリシーを付与して認可

https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/access_policies.html

##認証

###基本的なIAM認証
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78184/44612521-e3fa-775f-cfb1-8bdb66a7cfa4.png)

###一時認証情報
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78184/2767ade5-8ad4-8f0d-c52f-8ba54e30e9cd.png)

##サービスにリンクされたロール
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78184/366f6251-788b-9de4-228c-cc12234b4abb.png)

##認可

###アイデンティティベースのポリシー
上記3つのパターンは、アイデンティティベースのポリシーとなる

###リソースベースのポリシー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78184/b21d9539-de36-fee8-0854-e91beb746182.png)

##最後に
投稿内容は私個人の意見であり、所属企業・部門見解を代表するものではありません。
Xcodeのバージョンを下げたらビルドするときに選択できるシュミレーターが全部なくなった！

swiftのバージョンの関係でXcodeの最新バージョンから10.1へダウングレードすることにまりました

するとどうでしょうビルドボタンの横にあるシュミレーターが全部なくなっていました！！！　　　

*これだけになってました*
<img width="283" alt="スクリーンショット 2019-05-20 13.22.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249334/234f6843-8a66-da8c-9ec2-528b8a16851d.png">


ずっと調べていて「原因がわからない〜」と思っていたら

<img width="452" alt="スクリーンショット 2019-05-20 13.18.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249334/0733e4aa-c185-4a0a-1f9b-33bcb927bfa0.png">

ビルド設定でXcodeが対応していないiOSのバージョンを選択しているだけでした

Xcodeのバージョンを変えたときにシュミレーターが消えていたらビルド設定を見直してみましょう
jQuery メソッド イベント まとめ

#jQueryとは?
Javascriptを簡単に扱うライブラリです。
##ファイルの読み込み
HTMLファイルのheadファイル内に下記のように書きます。
今回は、別ファイル(main.js)を読み込んでそこにjQueryのコードを書いていきます。
※スクリプトを読み込む場合は

```
<head>
    ...
    <title>タイトル</title>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script>
    <script src="./main.js"></script>
</head>
```
##基本文法

```
$(function() {
　セレクタ = 処理対象となるDOM要素を指定するやり方
　メソッド = 処理
});
```
##メソッドチェーン
メソッドは、ドットで繋げて複数書くことができる

```
$('#main').css('color', 'blue').fadeOut(3000);
```
##idやclassを指定する

```:html.index
<ul>
    <li id="list">青色文字</li>
    <li class="list">赤色文字</li>
    <li></li>
</ul>
```

```:main.js
$('#lists > .list').css('color', 'blue')
$('.list').css('color', 'red')
```
###その他セレクタの指定方法

```
$('#list') //直下の子要素
$('.list, p') //複数の要素
$('#main').parent() //親要素を指定する
$('#main').children() //子要素を指定する
$('').next() //その次の要素を指定する
$('').prev() //その前の要素を指定する
$('').siblings() //兄弟要素を指定する 
```
###要素にcssを当てる

```
$('#main').css('color', 'blue')
```
###特定のcssを適用させたり外したり
addClass/removeClass

```
$("p").addClass("CSSクラス名");
```
削除する場合

```
$("p").removeClass("CSSクラス名");
```
###属性の値を指定する
.attr

```
$('a').attr('href');
```

```
$('a').attr('href', 'https://〇〇.jp/'); //書き換え
```
###タグの中身を書き換える

```
$('p').text('最高です'); //p要素を書き換える
$('p').html('<a href="#">リンク名</a>'); //p要素をaタグに書き換える
```
###値を書き換える
helloがgoodbyeに書き換わる

```
<input type="text" value="hello">

$('input').val('goodbye');
```
###中身を無くす

```
$('p').empty //要素の中身を無くす
$('p').remove //要素自体を無くす
```
###新しく要素を作る

```
var li = $('<li>').text('NEW TEXT');
```
###エフェクト

```
$('要素').hide(); //要素を隠す
$('要素').show(); //要素を表示
$('要素').fadeIn(); //フワッと表示
$('要素').fadeOut(); //フワッと消す
$('要素').toggle(); //表示<=>消す
引数に時間などを指定できるオプションが使える
```
###コールバック関数
〜が終わった後に処理を行う

```
$('要素').fadeOut(800, function() {
//フワッと消えたあとの処理を書く
});
```
###イベント
指定された要素が〜されたら処理を実行する

```
$('要素').click(function) {
//要素がクリックされたときの処理を書く
});
```
|イベント一覧  |イベント発生タイミング  |
|---|---|
|.dblclick()  |ダブルクリックされた時  |
|.keydown()  |キーを押し下げた時  |
|.keyup()  |押し下げたキーを離した時  |
|.mouseover()  |要素にマウスカーソルに乗った時  |
|.mouseout()  |要素からマウスカーソルが離れた時  |
上記の他にもありますので　[jQuery公式サイト](https://api.jquery.com/)　をご確認ください。
###フォームで使うイベント
#nameのフォームがフォーカスが当たった時は背景赤になり、外れたら背景白になるコード

```
$('#name').focus(function() {
    $(this).css('background', 'red');
});
$('#name').blur(function() {
    $(this).css('background', 'white');
});
```
Ubuntuのバージョン確認

今まで、/etc/os-releaseで確認していましたが、コマンドで一発でも確認可能です。

```
$lsb_release -a

No LSB modules are available.
Distributor ID:	Ubuntu
Description:	Ubuntu 14.04.6 LTS
Release:	14.04
Codename:	trusty
```

各項目のみ表示する場合は以下のオプションを指定します。「No LSB modules are available.」
は特に無視しても良いそう。（lsbパッケージをインストールすると表示されなくなる。）

```
Distributor ID
lsb_release -i

Description
lsb_release -d

Release
lsb_release -r

Codename
lsb_release -c
```

以上です。
#Slack でスレッドへの投稿は他のメンバーに通知されるのかどうか試してみた ( Mac アプリ )

# 結論

# 一、 スレッドへの投稿は他メンバーには通知されない。

アプリのアイコンにも赤丸はつかない。

![image](https://user-images.githubusercontent.com/13635059/57993024-243a8500-7af2-11e9-818b-319ab46057f4.png)

# 一、スレッドへの投稿で「以下にも投稿する」でチャンネルの表に出しても、他メンバーには通知されない。

だが、アプリのアイコンに「赤丸」の未読状態はつく。

![image](https://user-images.githubusercontent.com/13635059/57992727-ba6dab80-7af0-11e9-9097-a1646f1d930c.png)

# 一、「他のメンバーが参加しているスレッド」では、参加しているメンバーに対してアプリアイコンの「赤丸」がつく。

![image](https://user-images.githubusercontent.com/13635059/57993035-35839180-7af2-11e9-8d87-e0a3617121ff.png)

![image](https://user-images.githubusercontent.com/13635059/57993077-6bc11100-7af2-11e9-9b55-d3c6a2f586b3.png)


# つまり

(通知のポップアップは出ない)
(アプリの赤丸はつく場合とつかない場合がある)
(結論としては「Slackがなんだか良い塩梅にしてくれる」)




# 環境

Macアプリ (通知を受ける側)

# 通知設定

デフォルト
![image](https://user-images.githubusercontent.com/13635059/57992326-6eba0280-7aee-11e9-99c8-74e9e735346c.png)


# やったこと

この右上の通知ポップが出てくるかのテスト

![image](https://user-images.githubusercontent.com/13635059/57992396-dc662e80-7aee-11e9-9a87-aa16bb286d96.png)


# スレッドへの投稿だと @here も無効になるみたいです

![image](https://user-images.githubusercontent.com/13635059/57992517-8b0a6f00-7aef-11e9-8d07-91bbb2f3a1d7.png)


# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/1934








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
ソフト プロトタイプのプログラミング言語変更で迷った

# 背景
- ソフトウェアのプロトタイプを作った。
- 深く考えずに、そのプログラミング言語を選択した。理由: 簡単だったから。
- プロトタイプを改良したいが、その言語では機能不足だと後からわかった。
- プロトタイプの言語を変更したい。

# プログラミング言語の変更を迷った理由
- その言語では機能不足だと後からわかるという事態を繰り返したくない。
- **その言語でできること** と **プロトタイプに実装したい動作** が、結びつかない。
だから言語が選択できない。⇒ 自分の頭が悪いだけ。。

# どの言語を選んだの？ ⇒ 選ぶのを止めた。
- Electron にしようと思う。
- 理由: 　**プロトタイプに実装したい動作** に似た動作が、Electronで実現された例あり。それだけ。自分の頭が悪いと分かっています（涙
- どうしたらいいのよ。
【備忘】[VScode][Insiders]Remote-SSH がうまくいかない

# 結論

- setting.jsonにこれ入れているとダメ見たいです。
- path使って、Opensshを呼び出していますが、ここの設定によってくるっていたよう

```
"terminal.integrated.env.windows": {
        "PATH": "${env:PATH}"
 },
```

# 出てきたエラー

## 左下にでたもの
- unreachable or not Linux x86_64 (操作可能なプログラムまたはバッチ ファイルとして認識されていません。)
- cmd.exe /c (type "C:\Users\works\AppData\Local\Temp\vscode-linux-multi-line-command-

## Remote-SSHの出力LOG
 
```shell
"uname" terminal command done
apply-scheduler: unreachable or not Linux x86_64. (操作可能なプログラムまたはバッチ ファイルとして認識されていません。)
Confirming that apply-scheduler is a valid reachable host
Running type "C:\Users\works\AppData\Local\Temp\vscode-linux-multi-line-command-apply-scheduler.sh" | ssh  apply-scheduler to confirm the host platform
> 
> 'ssh' は、内部コマンドまたは外部コマンド、
> 操作可能なプログラムまたはバッチ ファイルとして認識されていません。
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
"uname" terminal command done
apply-scheduler: unreachable or not Linux x86_64. (操作可能なプログラムまたはバッチ ファイルとして認識されていません。)
```
Magic Leap MagicScript Landscape Application. URI schema

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

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

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

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


**Create Project**

```
magic-script init my-uri org.magicscript.uri "URI"
cd my-uri
```

**Code**

Change app.js

```javascript
import { LandscapeApp, ui } from 'lumin';
const { UiText, EclipseLabelType, Alignment, 
                         HorizontalTextAlignment } = ui;

export class App extends LandscapeApp {
  onAppStart (initArg) {
    const prism = this.requestNewPrism([0.5, 0.5, 0.5]);
    let uri = initArg.getUri();
    let value = 'Not URI';

    if (uri)
    {
        uri = uri.split("://");
        value = `App:${uri[0]} \nArgs:${uri[1]}`;
    }

    const text = UiText.CreateEclipseLabel(
      prism,
      value,
      EclipseLabelType.kT7
    );
    text.setAlignment(Alignment.CENTER_CENTER);
    text.setTextAlignment(HorizontalTextAlignment.kCenter);
    prism.getRootNode().addChild(text);
  }
}

```
Change manifest.xml

```xml
<manifest xmlns:ml="magicleap"
          ml:package="org.magicscript.uri"
          ml:version_name="0.0.1"
          ml:version_code="1">
  <application ml:visible_name="URI"
               ml:application_type="untrusted"
               ml:sdk_version="1.0">
    <component ml:name=".universe"
               ml:visible_name="URI"
               ml:binary_name="bin/index.js"
               ml:type="Universe">
      <mode ml:shareable="true"/>
      <icon ml:model_folder=""
            ml:portal_folder=""/>
      <schema ml:name="my-uri://" />
    </component>
    <uses-privilege ml:name="MagicScript"/>
  </application>
</manifest>
```

**Build**

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

**Run**
Access with Helio Browser. Click on Startup.
http://tokufxug.sakura.ne.jp/magicscript/uri.html

**Reference**
getUri() (MagicScript API)
https://docs.magicscript.org/lumin.InitArg.html#getUri

Manually Declare your Manifest and Privileges
https://creator.magicleap.com/learn/guides/declare-your-manifest

magicscript
https://www.magicscript.org/

Thanks!