OmniAICreator/Qiita-1.07M huggingface dataset:
ネストとアソシエーション

##ネスト##
ネストとは入れ子構造とも呼ばれ、ある記述の中に入れ子構造で別の記述をする方法です。
ルーティングでいうと、あるコントローラへのルーティングの記述の中に、別のコントローラへのルーティングを記述するということを指します。

Q.そもそもネストは何のために使うの？
**A.コメント機能を実装する際に、どのツイートに対するコメントなのかをパスから判断できるようにするため**

pictweetでルーティングをネストさせる一番の理由はアソシエーション先のレコードのidをparamsに追加してコントローラに送るためです。今回の場合、**コメントと結びつくツイートのidをparamsに追加**している。

**＜ネスト使用前＞**

```routes.rb
resources :tweets
resources :comments, only: [:create]
resources :users, only: [:show]
```
rake routesで中身を見ると、、、
comments POST   /comments(.:format)
→この状態だと、どのツイートに対するコメントなのかが分からない。


**＜ネスト使用後（ネストした箇所をdo 〜 endで囲む）＞**

```routes.rb
resources :tweets do
  resources :comments, only: [:create]
end
resources :users, only: [:show]
```

rake routesで中身を見ると、、、
tweet_comments POST      **/tweets/:tweet_id**/comments(.:format)
→どのツイートに対するコメントかが分かる。ここでは「:tweet_id」に対するコメントであることが分かる。
実際のツイートの詳細画面のURLは下記のようになっている。

http://localhost:3000/tweets/11
よって、この詳細画面でコメントをすると、下記のようなURLになる。
http://localhost:3000/tweets/11/comments
以上より、ネストを実施することで tweetsのidが「11」のツイートに対してコメントをするということが分かる。


##アソシエーション##
モデル間の関連付け（主従関係）を管理する機能のことで、定義しておくことでモデルをまたいだデータの呼び出しをより簡単に行うことができるようになります。

＜重要＞
モデルが複数生成された時点で、「各モデル間で主従関係はどうなっているのか」は意識的に見ておくこと。
つまり、has_manyなのかbelongs_toのいずれの関係になっているのかを明確にさせておくこと。モデルが増えれば増えるほど、この主従関係がややこしくなってくるはずなので先に考えていた方がベター。後の呼び出しも楽になる。


###１．アソシエーションを定義する###
・モデルクラスにhas_many , belongs_toを定義
■has_many :　〜〜
→記述しているモデルクラスは〜〜を複数保有している（一対多の関係）

```ruby
@tweets = current_user.tweets.page(params[:page]).per(5).order("created_at DESC")
→現在ログイン中のユーザー（current_user）が保有しているtweets情報（.tweets）をインスタンスとして「全て」取得
```

current_userには、現在ログインしているユーザーのレコード1つがuserクラスのインスタンスとして入っている。よって、上記の記述によって、**現在ログインしているユーザーの投稿したツイート全てを取得することができる。**
※tweetsが複数形になっていることに注目。これはuserとtweetsが「一対多の関係」なので、複数形になっている。これが単数形だとインスタンスを呼び出せない。

■belongs_to :　〜〜
→記述しているモデルクラスは〜〜に帰属している、紐付いて複数の情報が存在している。
tweet = Tweet.find(1)
tweet.user
→**usersテーブルに対して、idがtweet（インスタンス変数）のuser_idと等しいレコードを取得。**

###２．アソシエーションを実装する###
【アソシエーション未使用】
user = User.find(1)
Tweet.where(user_id: user.id)

【アソシエーション使用】
user = User.find(1)
user.tweets


＜意味＞
usersテーブルのidが「1」のレコードをuserという変数に代入
つまり、userはuserクラスから生成された「インスタンス」
よって、user.tweetsという記述が可能になり、ここではusersテーブルのidが「1」のユーザーが保有している（投稿している）ツイート（tweets）を「全て」取得する、という記述になっている。
両方意味は同じだが、分かりやすさ・読みやすさが一目瞭然。

これだと直感的に分かりやすい。

```ruby:sample.rb
<%= tweet.user.nickname %>
```

tweetのuser_idと同じidを持つユーザーのnicknameを取得している。
もっと簡単に言うと、**このtweetを投稿したユーザーのnicknameを取得している。**
何回も読んで直感的に理解できるようにしよう


【include】
includes(:モデル名)で使われるメソッド（コントローラクラスで使われる）
→これを使うことによって、データの処理回数が減り、ページの遷移のスピードが早くなる。SQLサーバに負担をかけすぎるとサーバートラブルが発生したり、ページ遷移のスピードが遅くなる。includesメソッドは開発側もユーザーも双方とっても利便性が上がるので、使った方が良い。基本的にアソシエーションと一緒に使うというイメージで問題なし。
def index
　@tweets=Tweet.includes(:user).page(params[:page]).per(5).order("created_at DESC")
end
上記のように、使いたいインスタンスメソッド内で、記述することで、そのインスタンスメソッド内だけで適応される。
Neo4j(Docker)でconfをいじる

## 目的
 Neo4j(Docker)でconfをいじる.

## 前提
* brewでneo4jをインストール済み
* Dockerがインストール済み(筆者はMacアプリ版を使用)

※neo4jとDockerがインストールされていれば, 問題ないと思います.
操作は少し変わるかもしれませんが

## Docker neo4jイメージをダウンロード
DockerHubにある公式Dockerイメージをダウンロードする.

```
❯❯❯ docker pull neo4j
Using default tag: latest
latest: Pulling from library/neo4j
4fe2ade4980c: Pull complete 
6fc58a8d4ae4: Pull complete 
819f4a45746c: Pull complete 
6b424cc95557: Pull complete 
7b0c76e0ed27: Pull complete 
e668f80bbb60: Pull complete 
1a539cb3038a: Pull complete 
Digest: sha256:a96d81360ab435fa61941844a484144aadd9034f0684437ce02e12e2b461230f
Status: Downloaded newer image for neo4j:latest
```



## conf
https://neo4j.com/docs/operations-manual/current/installation/docker/

```
docker run \                                                                   
    --detach \
    --publish=7474:7474 --publish=7687:7687 \
    --volume=$HOME/neo4j/data:/data \
    --volume=$HOME/neo4j/logs:/logs \
    --volume=$HOME/neo4j/conf:/conf \
    neo4j:3.0
```


```
docker run --rm \                                                                                                        
    --volume=$HOME/neo4j/conf:/conf \
    neo4j:3.0 dump-config
```

confフォルダに**neo4j-wrapper.conf**, **neo4j.conf**が生成される.

neo4j.confをいじります.

```neo4j.conf
# Bolt connector
dbms.connector.bolt.type=BOLT
dbms.connector.bolt.enabled=true
dbms.connector.bolt.tls_level=OPTIONAL
# To have Bolt accept non-local connections, uncomment this line
# dbms.connector.bolt.address=0.0.0.0:7687

# HTTP Connector. There must be exactly one HTTP connector.
dbms.connector.http.type=HTTP
dbms.connector.http.enabled=true
# To accept non-local HTTP connections, uncomment this line
#dbms.connector.http.address=0.0.0.0:7474

# HTTPS Connector. There can be zero or one HTTPS connectors.
dbms.connector.https.type=HTTP
dbms.connector.https.enabled=true
dbms.connector.https.encryption=TLS
# To accept non-local HTTPS connection, change 'localhost' to '0.0.0.0'
dbms.connector.https.address=localhost:7473
```


### 使用目的に合わせて, アンコメントもしくは, localhost:0.0.0.0に変更する

```neo4j.conf(抜粋)
# To have Bolt accept non-local connections, uncomment this line
# dbms.connector.bolt.address=0.0.0.0:7687
```

```neo4j.conf(抜粋)
# To accept non-local HTTP connections, uncomment this line
dbms.connector.http.address=0.0.0.0:7474
```

```neo4j.conf(抜粋)
# To accept non-local HTTPS connection, change 'localhost' to '0.0.0.0'
dbms.connector.https.address=localhost:7473
```
過去の遺産をPWA対応したはなし

#過去に作ったクソアプリをPWA対応にする

未だにさくらインターネットのレンタルサーバーではPython3系動きません。が、まぁ過去に作ったクソアプリケーションをなんとかしたい。とりあえずPWA対応の練習に使えばいいんじゃないかと思ってはじめました。

#準備

##必要なファイル一式について

・index.html エンドポイント
・manifest.json マニフェストが書かれたファイル
・service-worker.js 色々処理を書くやつ
・icon.png アイコン

サーバーのディレクトリスクショ

<img width="257" alt="スクリーンショット 2018-11-09 10.53.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/71585/da108a93-dd2c-fc41-6851-f28a4b4d42e0.png">


基本的に既に他の人が解説しているので、
細かい解説はすべて省略します。

```manifest.json

{
    "short_name": "QRさん",
    "name": "QRコードクリエイトアプリ",
    "display": "standalone",
    "start_url": "index.html",
    "background_color": "#333",
    "theme_color": "#fff",
    "icons": [
        {
            "src": "icon.png",
            "sizes": "192x192",
            "type": "image/png"
        }
    ]
}

```

"sizes": "192x192"　が存在していないとバナーが追加されないそうです。


```service-worker.js

self.addEventListener('install', function(e) {
  console.log('[ServiceWorker] Install');
});

self.addEventListener('activate', function(e) {
  console.log('[ServiceWorker] Activate');
});

self.addEventListener('fetch', function(event) {});
```

ここまで出来たらあとは index.htmlに以下を追加するだけ。

head 内にこういう形で追加。

```index.html

<head>
<link rel="manifest" href="manifest.json">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black">
<meta name="apple-mobile-web-app-title" content="QRさん">
<link rel="apple-touch-icon" href="icon.png">
</head>

```

Service-workerは以下のように書き入れます。

```index.html

  <script>
  if ('serviceWorker' in navigator) {
      navigator.serviceWorker.register('service-worker.js').then(function(registration) {
          console.log('ServiceWorker registration successful with scope: ', registration.scope);
      }).catch(function(err) {
          console.log('ServiceWorker registration failed: ', err);
      });
  }
  </script>
```


ちなみにSSL化されていない場合は使えません。

#PWA対応成功後

https://app.jiriki.co.jp/qr/

こういう感じでホームへ追加することなります。

ホームに追加するとアプリっぽい挙動になるのは面白いですよね。

![2018-11-09 10.15.58.png](https://qiita-image-store.s3.amazonaws.com/0/71585/a841f77b-dcc8-d074-ca1b-f66a90ab216b.png)


PWA対応進めてこれホントにホームに追加できるのかな？
という不安はChromeのツールで確認可能です。

<img width="301" alt="スクリーンショット 2018-11-09 10.55.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/71585/a402aac0-c3ca-b98d-73d0-c4359099f958.png">



これを踏まえてWordpressのサイトやブログも片っ端からPWA対応してみましたとさ。
Swift イニシャライザ

## イニシャライザとは
**型のインスタンス化を初期化する**
すべてのプロパティはインスタンス化の完了までに値が代入されていなければならないため、プロパティの宣言時に初期値を持たないプロパティはイニシャライザ内で初期化する必要がある。

### 定義方法
initキーワードで宣言し、引数と初期化に関する処理を定義する。

```swift

init(引数){
   初期化処理
}
```

次の例では、selfIntroduction型に定義したイニシャライザを用いて、selfIntroduction型のインスタンスを初期化している。

```swift

struct selfIntroduction {
    var name: String
    var age: Int
    
    init(name: String, age: Int) {
        self.name = name
        self.age = age
    }
}

var val = selfIntroduction(name: "kunio", age: 21)
print(val.name)
print(val.age)

```
## すべての型に共通のイニシャライザ
### 失敗可能イニシャライザ
- 初期化の失敗を考慮したイニシャライザ
- 戻り値はOptional型（初期化に失敗した場合にnilを返す）

失敗可能イニシャライザはinitキーワードに?を加えてinit?(引数)のように定義する。
初期化の失敗はreturn nilで表し、イニシャライザはnilを返す。

```swift

struct Item {
    let id: Int
    let title: String
    
    init?(dictionary: [String: Any]) {
        guard let id = dictionary["id"] as? Int,
        let title = dictionary["title"] as? String else {
            return nil
        }
        self.id = id
        self.title = title
    }
}

let dictionaries: [[String: Any]] = [
    ["id": 1, "title": "ABC"],
    ["id": 2, "title": "DEF"],
    ["id": 3, "title": "GHI"],
    ["title": "JKL"]
]

for dictionary in dictionaries {
    if let item = Item(dictionary: dictionary) {
        print(item)
    } else {
        print("エラー: \(dictionary)")
    }
}
```

随時更新
Windowsマシンにnvmを使ってNodeJSを入れる

Windows Lover PHPer Nな人です！
今日は元気にNodeJSをWindowsに入れるよ！

なんかよく、「Windowsにはbrewがない！糞だ！！」とディスってくる人がいます（実話）が、
Windowsには[Chocolatey](https://chocolatey.org/)というおちゃめな子がちゃんといるので、
全然クソじゃないというか、使いやすいです。


# Chocolatyを入れる

Windowsのコマンドプロンプトを「管理者権限」で実行し、下記コマンドを実行します。

```
@"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))" && SET "PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin"
```

※上記コマンドは、[Chocolatyのinstallページ](https://chocolatey.org/install)にも書いてます


# nvmを入れる

```
choco install nvm
```

nvmはNodeJSのバージョン管理ツールだよ

# nvmを使ってnodejsを入れる

```
nvm install v10.10.0
nvm use 10.10.0
```

# NodeJSが入った？

```
node -v
# v10.10.0
```

楽しい　✌('ω'✌ )三✌('ω')✌三( ✌'ω')✌
使ってみるぞ Elixir(0) コードネームをつける

業務で Elixir を使ってみるぞ、という話です。なにはともあれ名前をつけましょう。

# コードネーム
これがないと盛り上がりません。Elixir はどうやら Final Fantasy 系のキーワードを使うようです。大学院生のころにFF4やFF5あたりをやりました。でも、そんなにゲームにのめり込むタイプじゃないのでピンとくるのがないので困ります。一つ印象的なのが「せっかく新しい武器を手に入れたのに、使ってみても相手のダメージが 1 にしかならない」やつです。縁起が悪いからと周辺には反対されました。でも使います。

![excaliper.jpg](https://qiita-image-store.s3.amazonaws.com/0/260320/bd8121a3-d2bd-0f50-5803-7a7cbb9c46fa.jpeg)

コードネームは **ex-caliper** です。

英語で *X* は「バツ」の意味、つまり *ex-hogehoge* で「元hogehoge」の意味になります。例えば別れた元妻のことを *ex-wife* なんて言います。まさに日本語で言うところの「バツイチ」な感じです。Elixir 系のプロジェクトは *ex* つけるみたいなので *excaliper* から *ex* を分離すると *caliper* が残ります。

はて caliper ってなんでしょう？ 調べると、長さを計測する器具を全般に言うらしいです。ノギスなんかも Caliper というみたいです。さらに日本語でいうところのコンパス、それも円を描くほうじゃなくて長さを取り出す二股の針2本の計測器具も Caliper[^Caliper] って言うらしいです。

とすると *ex*-*caliper* は「元コンパス」ってことになりゃあしないでしょうか。つまり、使われなくなって機能を失った caliper を ex-caliper と言うだろう、と。

写真は古参のエンジニアに頼んで使い古したコンパスを撮影してもらったものです。これ、*ex* は **X** の発音であるというのにもかけて X 状にしてあります。

さあ、これで準備ができました。

# 参考文献
以下で Inside caliper や Outside caliper を見て下さい。ちなみにいわゆるノギスは Vernier caliper って呼ぶようです。
[^Caliper]: [Caliper (Wikipedia)](https://en.wikipedia.org/wiki/Calipers)
Python関係の自分用メモ

# pandas

行ごとに nan の個数を数える。

     df.isnull().sum(axis=1)

表を横に連結する。

     df_new = pd.concat([df1, df2], axis=1)

文字コードを意識して読み込む

     df= pd.read_csv("japanese.csv",encoding="SHIFT-JIS")

エクセルファイルの特定のシートを開く

     xlsx_df = pd.ExcelFile(xlsx_file, encoding='utf8')
     sheet1_df = xlsx_df.parse(sheet1)

欠損値を穴埋めする（直前の値を使って埋めていく）

     df_method.fillna(method='ffill')
resolveJsonModuleのtypeofメモ

タイトルのまま、[TypeScript 2.9](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-9.html)にて追加されたresolveJsonModuleについてのメモ。
tsconfig.jsonの設定を変更することにより、jsonファイルから型解決した状態で値を取得でき、わざわざjson用のinterfaceを作成しなくてもよくなった。

[Angular公式のHttpClientのJSONデータを取得する](https://angular.jp/guide/http#json%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B)を例にあげると、jsonファイルさえあれば、interfaceはtypeofすることでまかなえる。

```json:config.json
{
  "heroesUrl": "api/heroes",
  "textfile": "assets/textfile.txt"
}
```

```typescript:config/config.service.ts
// export interface Config {
//   heroesUrl: string;
//   textfile: string;
// }
export type Config = typeof import('../../assets/config.json');
```
もちろん、分けて書くこともできる。

```typescript:分けて書く
import config from '../../assets/config.json';
export type Config = typeof config;
```


---
話は前後するが、angular/cliで作成したプロジェクトであれば、プロジェクト直下にあるtsconfig.jsonのcompilerOptionsに下記内容を追加することによって利用できるようになる。


```json:/tsconfig.json(抜粋)
{
・・・
  "compilerOptions": {
・・・
    "resolveJsonModule": true,
    "esModuleInterop": true
  }
}
```
php-master-changes 2018-11-08

今日は ext/sqlite3 の不要な文字列コピー除去とテスト修正、do_bind_inherited_class と do_bind_class の統合、ext/gettext の Mac/FreeBSD でのテストこけ修正、Travis ビルド設定の修正、テスト時の一時ファイル除去の修正があった！

# 2018-11-08
## cmb69: Avoid needless string duplication
- https://github.com/php/php-src/commit/b7b3a65e1db210570fe7df8bec43ee4c29620ba3
- ext/sqlite3 で、不要な文字列コピーの除去
- SQLite3 の `@name` 記法というのがあり、そのサポートを行う [PR](https://github.com/php/php-src/pull/3636) 上で指摘されてたやつ

## morrisonlevi: Remove do_bind_inherited_class; use do_bind_class
- https://github.com/php/php-src/commit/74d15b535afda508f498428262e423d46de7553d
- do_bind_inherited_class と do_bind_class を統合
- 中身一緒すぎた

## mizunashi-mana: Add putenv for setlocale for gettext tests
- https://github.com/php/php-src/commit/632b6e7aac207194adc3d0b41615bfb610757f41
- ext/gettext のテストで、Mac や FreeBSD などでは [setlocale()](http://php.net/manual/ja/function.setlocale.php) だけだと正常に言語が切り替わらず、[putenv()](http://php.net/manual/ja/function.putenv.php) も[必要だった](http://php.net/manual/ja/function.gettext.php)ので修正
- [これ](https://qiita.com/sj-i/items/b0d3e58798583f18597f#sj-i-fixed-incorrect-restoring-of-ldflags)やった時になんかテストこけるなーと思ってはいた（gettext の PHP マニュアル側に記載があるとは思いもせず）

## nikic: Use new option name in travis/compile.sh
- https://github.com/php/php-src/commit/50e7e3a653eb62c3c38c48a8812839c037c6f3e3
- Travis ビルド時の freetype のオプションを `--with-freetype-dir=/usr ` から `--enable-freetype` へ修正

## mizunashi-mana: Skip SQLite3::loadExtension tests if SQLITE_OMIT_LOAD_EXTENSION defined
- https://github.com/php/php-src/commit/705a31b4e5e1c38eec5d15b5b5938b6b889a6282
- ext/sqlite3 の幾つかのテストへ SKIPIF を追加
- 差分だけ見るとコミットコメントがよく分からないが、SQLITE_OMIT_LOAD_EXTENSION が定義されていない場合のみ loadExtension が[定義される](https://github.com/php/php-src/blob/b7b3a65e1db210570fe7df8bec43ee4c29620ba3/ext/sqlite3/sqlite3.c#L336)

## mizunashi-mana: Clean testfile
- https://github.com/php/php-src/commit/c180c8c3bdeaa40a6526ed4d3511ae34e0daa379
- ext/bz2 のあるテスト時、一時ファイルを掃除していなかったのを修正
独自ドメイン+個人サイト・ブログ運用より、Qiitaに記事を書くべき理由。それは「SEOの強さ」と「保守運用コスト」。

# 実は、独自ドメインの新規運用はSEO的に難しい。

「独自ドメインはSEOに強い」という流説が出回っているが、少なくとも2018年現在、そんなことはまったくない。

そもそも独自ドメインでサイトを作っただけでは、Googleにインデックスさえされないことさえある。なのでSEOも自分で考えていかなければいけない。

QiitaやはてなブログやMediumなどのソーシャル、プラットフォームのほうがはるかに強い。特に我らがQiitaの強さは皆、実感して分かっているはずだ。

# 保守運用の話。個人サイトはあなたがやめたら終わり。

長年の保守運用というのは、並大抵のことではない。

たとえば10年の間でいちどでも飽きたり、やめてしまったりしたら終わりだ。

独自ドメインは他の人に取られるかもしれないし、あなたのサイトはいったんGoogle検索からは消えてゆく。この世界から存在しなくなる。

そこでサイトを復帰させようとすると、また新規にスタートするぐらいのコストがかかる。

# サービスの持続可能性

- Google
  - かなり長い間、なくならない気がする。もしかしたら永遠に。
  - だけどGoogle+もBlogspotもSEOにはすごく弱い感じがする。
- Github
  - かなり長い間、なくならない気がする。
  - GitHub Gistに何か技術記事を書くことも出来るけれど、SEO的には弱い。
  - Mediumのインポート機能と組み合わせて使う方法はある。([１年前に投稿したQiita記事に習いたてのSEO対策をしたら意外と効果が出た話 - Qiita](https://qiita.com/rorensu2236/items/868d481b408710640146))
- Qiita / はてなブログ / Medium などのプラットフォーム
  - 数年でなくなる可能性もある
  - だけどSEOはすごく強い
  - いざとなったら記事のエクスポートをするなどして、コンテンツ自体は代替サービスに移行可能 (Qiitaにはエクスポート機能がない‥まさか‥そんなはずは‥)
- 個人サイト
  - 非常になくなりやすい
  - SEOに弱い
  - 長期の場合、保守運用のコストが並大抵じゃない


**あれ、個人サイト・個人ブログって、良いところなくない‥？**

# みんなQiitaに記事を書こう

言いたいことはそれだけだ。あとは頼んだ。

# 預けられるけれど、引き出せない銀行。

ユーザーが書いた記事のコンテンツは「情報財産」なので、Qiitaにもエクスポート機能が追加されることを激しく希望。

(「Qiitaサポートフォームに意見を送ろう」っていう返信がつく確率は25%)

# あわせて読みたい？

- [「自分ググラビリティ」を上げて「情報アウトプット富豪」になろう。Github Qiita Twitter などのアカウント名を統一すべき理由。横断的検索性、スケーラビリティを確保しよう。 - Qiita](https://qiita.com/YumaInaura/items/191eef45306150458fbc)

# あわせて読みたい。

- [１年前に投稿したQiita記事に習いたてのSEO対策をしたら意外と効果が出た話 - Qiita](https://qiita.com/rorensu2236/items/868d481b408710640146)
- [SEOに強いメディアが自然にできると勘違いしている人に伝えたいCMS選定（自作）のコツ - Qiita](https://qiita.com/karaagedaisuki/items/52f707bffbaf580b6cdb)
- [全ての開発者がQiitaへのアウトプットをやめるべき理由 - Qiita](https://qiita.com/qiitadaisuki/items/2160a390ce91283707a1#comment-ceb6c8857b1cbc4c78d8)
  - もちろん、逆の考え方もあるよ。
  - `これについては自分は逆で、Qiita等のサイトは閉鎖や流行り廃りのリスクがありますが「個人サイトはあなたがやめない限り終わらない」という見方です。`
- [Qiitaでお金が稼げるなら質の高い記事がもっと増えるのではないかという提言 - Qiita](https://qiita.com/HiromuMasuda0228/items/aa3729882cb59fda9838)
  - すごく夢のある話。でも夢じゃない。現実になるといい。イマジン。








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
gitlab


# gitlab for mac

docker
 preference
  File Sharing
     /Users -->  /Users/tetsuya

docker run --detach     --hostname gitlab.example.com    --publish 443:443 --publish 81:80   --name gitlab     --restart always     --volume /Users/tetsuya/gitlab/config:/etc/gitlab     --volume /Users/tetsuya/gitlab/logs:/var/log/gitlab     --volume /Users/tetsuya/gitlab/data:/var/opt/gitlab    gitlab/gitlab-ce:latest

# 参考URL
https://qiita.com/masakura/items/e29f1dd4794bcaf066ce
https://qiita.com/ntoreg/items/e1e63077ef0fef1f3ccc
https://sqlazure.jp/r/tips/1546/
sortコマンドやcolumnコマンドで区切り文字にタブ文字を指定する

sortで`-k`オプションを指定するときに区切り文字を明示したかったのだけど、エスケープシーケンスのつもりで`'\t'`を指定すると、以下のようにエラーになってしまう。

```shell-session
$ cat hoge | sort -t '\t' -k 5nr
sort: multi-character tab `\\t'
```

次のようにして`printf`コマンドでタブ文字を吐き出してやるとタブを区切り文字に指定できた。

```shell-session
$ cat hoge | sort -t "`printf '\t'`" -k 5nr
```

`column`コマンドの場合は以下のような感じ。

```shell-session
$ column -t -s "`printf '\t'`"
```

macOSのbash, sh(bashのPOSIXモード), dashで確認した。
この世界でのJavaの歴史

# はじめに
世の中には「あれ？異世界転生しちゃったかな？」みたいな歴史の認識をしている人がいます。
なので少しJavaについてこの世界の歴史を連ねていきたいかなと。

# JavaとJavaScriptの関連性
これって意外と最近の人認識ズレてること多くて、実はJavaとJavaScriptに全く関係がないと言ったらそれはそれで嘘になるんですよね。
何故JavaScriptって言う名前になったかというと元々はLiveScriptと言う名前で開発されていたのですが、JSが初めて実装されたNetScape2.0を発表した時にNetScape社とJavaの開発元であるSun　Microsystems社は業務提携契約を結んでいたんですね。当時、マルチプラットフォームで動作するJavaの人気は非常に高く、Javaに書き方を寄せていたこともあり、Javaに肖ってJavaScriptと言う名前を使いたいと、サンに申請したのが許可されたと。
こういった経緯があってJavaScriptの名前がついたので、まあ先祖の偉人の名前を貰った、みたいな。まあそんな程度の関係性はあるんですよね。

**まあ、言語としては何も関係ないですが**

# Javaの歴史
## 1995年
 Javaが産声を上げます。

* マルチプラットフォーム
* 高速なVM
* 中間言語へコンパイルしインタプリタで実行

と言った非常にユニークな昨日と当時はまだ黎明期で企業がバックボーンに付いてることが重要だったのですが、UNIXベンダーとして名を馳せていたサン・マイクロシステムズがバックボーンに居たということで非常に人気が出ます。

## 1999年
　この年になって皆様お馴染みのエディションに分かれることになります。

* Java SE
    - Java Standard Edition
* Java EE
    - Java Enterprise Edition
* Java ME
    - Java Mobile Edition

この3つに分かれ、JavaEEには企業向けの有償サポートをつけることとなります。

## 2006年
この時期になってOSS化の波を受けてサンはOpenJDKを設立します。
　そもそもJavaと言うのはSun以外でもJDKやSDKを作成することができて、それをサンがJavaとして認めることでJavaになります。
　それは企業だけではなくコミュニティでも同様で、コミュニティがクローズドなライセンスで公開されることを恐れ、サンがコードを寄贈する形でOpenJDKは発足しました。

## 2007年
 この年Androidが発表されます。AndroidはJavaでOSや、アプリケーションを記述することができることを証明できる大きな実例となり、再び注目されます。（まあこのあとのOralceとの裁判でJavaは棄てられてしまいましたが）
 同時にJavaFXと言うGUIアプリケーションも発表され、現在まで使われてきたSwingを置き換える形となりました。（発表のみで公開は翌年。）

このように2007年はJavaにとって大きな躍進となる年でした。

## 2009年
　この年、世界に衝撃が走りました。なんと、前述のように大きな巻き返しをしていたJavaを持つサンマイクロシステムズがOracleによって買収されてしまったのです。
　(正直同時に買収先として噂されていたIBMに買収されていたらどれだけ良かったものかと思いますが）
 今後の問題の全ての原因となる大きな起点になりました。
　この買収のゴタゴタでJavaの開発は停滞し、Javaの次のバージョンは2011年と大きく間が開いてしまうのでした。

## 2011年
　Oracleに買収されてから初のJavaが出ます。
　大きな変更としてはSwingへの仕様変更、Fork/Join Frameworkにより並列化の機能が強化されました。

## 2014年
Java 8が発表されます。
　関数型の要素であるラムダやインターフェースの機能の追加、関数型へ対応するインターフェースの追加など
　インターフェースと関数のアップデートが非常に印象的なアップデートとなりました。

## 2017年
Java 9を発表します
　発表と同時に

* 開発サイクルを向上させるため半年ごとにバージョンを上げること。
* 長期サポートの有料化（60万円/プロセッサー）
* LTSバージョンの非発表

というOracleの伝家の宝刀マネタイズが炸裂してしまいます。
本当に改悪なので一生Java 8をサポートして頂きたい。

## 2018年
今年ですね
ついにJava11が出てしまいました。
OpenJDKの方もJava11のLTSを出すと言う発表はありませんし、Oracleも何も言っていません。
蛇口をひねれば出る水のように存在していたJavaは廃れてしまうのか今後が不安です。
このような行き先不透明な言語は他の人に勧められないし新しい人は入ってこないしで衰退する未来しか見えません。

ついにJavaと別れるときが来たのかもしれません。

それではまた。
EKReminder変数が勝手に更新されて厄介だと言う話

最近、リマインダーのアプリを作っているけどEKReminderの仕様？なのか厄介だった点が出てきた。
それは、EKReminderは`eventStore.save`を実行すると、アプリ内に変数として保持している値も自動で更新されると言うこと。

例えば、

```
var hogeReminders: [EKReminder]
```

```Manager.swift

func save(reminder: EKReminder, completion: @escaping (_ isSuccess: Bool) -> Void) {
        print(reminder.title)              // "HogeHoge"
        print(hogeReminders.first?.title)  // ""
        self.eventStore.requestAccess(to: .reminder) { (granted, error) in
            if granted == false { completion(false); return }
            do {
                try self.eventStore.save(reminder, commit: true) // ここでプロジェクト内の変数も全て更新される？
                print(reminder.title)              // "HogeHoge"
                print(hogeReminders.first?.title)  // "HogeHoge"
                completion(true)
            } catch {
                completion(false)
            }
        }
    }
```

```ViewController.swift

override func viewDidLoad() {
        var manager = Manager()
        manager.save(reminder: hogeReminders.first!) { (isSuccess) in
            
        }
}

```

hogeRemindersを保持しておいて、保存後の値と比較し更新されたらRemindersTableViewを更新しようと処理を書いた。けど、値が更新されたことを確認できたなかった（`hogeReminders != reminders`では既にhogeRemindersが自動更新された後だからダメ）のでちょっと悩みました。

もし間違ってたり、良い解決策があったら教えてください。
MySQLのデータを取り出す

先日phpMyAdminを用いてMySQLのいろはを勉強しました。

まずは、データベースに登録したデータをウェブ上に取り出すことができたので、備忘録を兼ねてアウトプットしていきたいと思います。

※コード間違いがある可能性があります。
その際はご指摘くださるとありがたいです。

##手順

####１.データベースへの接続

```php:index.php
<?php
    $db = new mysqli('アドレス', 'ユーザー名', 'パスワード', 'データベース名');
    if ($db->connect_error) {
        echo $db->connect_error;
        exit();
    } else {
        $db->set_charset("utf8");
    }

    echo "<table>";
 
 ```

####２.データベース（form）内の4つのカラム（number,name,age,ex）内のデータを取り出す。

```php:index.php
  $sql = "SELECT number,name,age,ex  FROM form";
    if ($result = $db->query($sql)) {
        
        while ($row = $result->fetch_assoc()) {
            echo "<tr><td>" . $row["number"] . "</td><td>" . $row["name"] . $row["age"] . $row["ex"] . "</td></tr>";
        }
        
 ```

####３．結果を閉じて、データベースを切断

```php:index.php
      $result->close();
    }
    echo "</table>";

    //データベース切断
    $db->close();
?>
 ```


今回は、データベース内にあるデータを取り出すコードを記載しました。

次は、データベースにデータを登録できるように勉強していきたいと思います。
Blenderで複数のテクスチャを1つのテクスチャにまとめる(UVマップを統合してテクスチャをベイクする)

#概要
複数のテスクチャに分けられたものを1つのテクスチャにしたい。
既存のテクスチャから新しいUVマップで1枚のテクスチャを作成したい。

#環境
Blender 2.79b
Windows10

#手順
1. 複数のマテリアルを統合するオブジェクトを選択してマテリアルを新規作成する。
2. 新しいUVマップを作成する。
3. 新しく作成したマテリアルを選択してUVマップエディタを開く。
4. 新しいUVマップを設定して、UVマップを整理する。
5. UVマップエディタで新しい画像を作成する。
6. ベイクでテクスチャを選択して実行する。

参考
https://www.youtube.com/watch?v=YHS0afjnCLE
Python超初心者が一人ヌメロン作ってみた


Pythonを勉強するために『退屈なことはPythonにやらせよう』という本を読み始めました。
読み進めていくと、数当てゲームを作ってみようというのがあって、昔テレビで見たヌメロンという数当てゲームを思い出しました。

ネットで作り方を調べてみたら、結構多くの方が作っていらっしゃってましたが、勉強ということで見ずに作りました。今回は３桁で作りました。

ちなみに、ヌメロンとは重複のない順列を当てるゲームです。
とりあえず、対戦相手は作らずに自己完結型の物を作りました。
(対戦相手がいないとヌメロンとは言えないかもしれないが。。。)

全体的にごり押しの拙いコードですがご覧ください。
批評していただけるとありがたいです。

```ruby:numeron.py
import random

count=int(0)
while True:
    sec100 = random.randint(0, 9)
    sec10 = random.randint(0, 9)
    sec1 = random.randint(0, 9)

    if sec100 == sec10 or sec100 == sec1:
        count = count + 1
    if sec10 == sec100 or sec10 == sec1:
        count = count + 1
    if sec1 == sec100 or sec1 == sec10:
        count = count + 1

    if count==0:
        break

    count=0

eat = int(0)
bite = int(0)

try:
    while True:
        ans100 = int(input(">"))
        ans10 = int(input(">>"))
        ans1 = int(input(">>>"))

        if sec100 == ans100:
            eat = eat + 1
        if sec10 == ans10:
            eat = eat + 1
        if sec1 == ans1:
            eat = eat + 1

        if sec100 == ans10 or sec100 == ans1:
            bite = bite + 1
        if sec10 == ans100 or sec10 == ans1:
            bite = bite + 1
        if sec1 == ans100 or sec1 == ans10:
            bite = bite + 1

        print("eat:" + str(eat), end=" ")
        print("bite:" + str(bite))


        if eat == 3:
            print("あなたの勝利！")
            break

        eat=0
        bite=0

except EOFError:
    pass

```

先人たちのコードを拝見したら、なんと簡潔なことか。。。
まあ、ゆくゆくは人工知能を搭載したいです。

拙い記事、コードを見ていただきありがとうございました！
MongoDBでコレクション内の1つのフィールドの値のリストを取得したい

# Collection.distinct(フィールド, 条件)
次のような`collection`があったとします。

```javascript
> db.users.find()
{ "_id" : ObjectId("5b35deacfdf5eb3c9470f72a"), "name" : "aaa", "age" : 10, "address": {"country": "Japan"}, "histories": [{"country": "UK"}, {"country": "Korea"}] }
{ "_id" : ObjectId("5b3c84da8db0b59d619d12a3"), "name" : "bbb", "age" : 20 , "address": {"country": "US"}, "histories": [{"country": "Canada"}] }
{ "_id" : ObjectId("5b4d8769077d2201603c5e26"), "name" : "ccc", "age" : 30 , "address": {"country": "UK"}, "histories": [{"country": "China"}] }
{ "_id" : ObjectId("5b63b6b20ace659bf75c31c8"), "name" : "ddd", "age" : 40 , "address": {"country": "Japan"}, "histories": [{"country": "Brazil"}] }
```
`_id`のリストだけ取りたかったりということ、ありますよね・・・？
今まで私は

```javascript
> const users = db.users.find().select('_id')
> const ids = users.map(u => u._id)
```
とかしていました。
これが`distinct`という便利な関数のおかげで1行で済みますし、**クエリの速度も数倍から数十倍高速**です。

```javascript
> const ids = db.users.distinct('_id')
[
    ObjectId("5b35deacfdf5eb3c9470f72a"),
    ObjectId("5b3c84da8db0b59d619d12a3"),
    ObjectId("5b4d8769077d2201603c5e26"),
    ObjectId("5b63b6b20ace659bf75c31c8")
]
```

`distinct`は、第二引数にfindの条件を入れられます。

```javascript
> db.users.distinct('_id', {age: {$gte: 30}})
[
    ObjectId("5b4d8769077d2201603c5e26"),
    ObjectId("5b63b6b20ace659bf75c31c8")
]
```

Node.js用MongoDBライブラリのmongooseを使っているならば、次のどちらの書き方でも使えます。
個人的には第二引数にfind条件を渡すのは他のmongooseのメソッドと違うので、1つ目の書き方が好きです。

```javascript
User.find({age: {$gte: 30}}).distinct('_id')
// or
User.distinct('_id', {age: {$gte: 30}})

// 一応これも使えるっぽいです・・・
User.find().distinct('_id', {age: {$gte: 30}})
```


また、ネストされているフィールドに対しても使えるので便利です。

```javascript
> db.users.distinct('address.country')
["Japan", "US", "UK"]
// 配列の中身からも取って来れます
> db.users.distinct('histories.country')
["UK", "Korea", "Canada", "China", "Brazil"]
```

以上、distinctのススメでした！
AWS Organizationsが想像したものと違った

## 想像したものとは

前提として、基本1サービス1個人=1アカウントで不自由しないだろうと思っていた

別に複数作るのは個人の自由だが、サービスにそれを強要されることはないと思っていた

## AWS Organizationsのヘルプを見ると

https://aws.amazon.com/jp/organizations/faqs/

> 1 つの AWS アカウントが複数の組織のメンバーになることはできますか?
>
> いいえ。1 つの AWS アカウントが同時に複数の組織のメンバーになることはできません。

ということは、フリーランスのような、1個人が複数の組織に所属する場合、組織ごとにアカウントを作成するか、用意してもらったアカウントを使わなければいけない、というルールを強制されることになります。

## アドバイス的な話

組織に属する可能性がある人は基本的にこの仕様を理解しておいたほうがいいと思いました。
Using yaml.dumper without Alias by PyYAML - PyYAML の yaml.dumpでaliasを無効にする

# Overview

PyYAMLを使ってyaml dumpをしていると
**&id001** や **\*id001** と言った出力を見かけたことがないだろうか。

非常に簡単な例を挙げると以下のようなものだ。

## サンプルコード

```python
import yaml

sample_dict = {
    "username": "User",
    "password": "Password",
}
yaml_data = [sample_dict, sample_dict]

print(yaml.dump(yaml_data))
```

## 出力結果

```
$ python sample.py 
- &id001 {password: Password, username: User}
- *id001
```
## 期待した動作

```
$ python sample.py 
- {password: Password, username: User}
- {password: Password, username: User}
```

## サンプルコード2

YAMLファイルを生成するならば
より読みやすい出力にすることが多いと思われるので
default_flow_style = False としたサンプルも貼っておく

```python
import yaml

sample_dict = {
        "username": "User",
        "password": "Password",
    }
yaml_data = [sample_dict, sample_dict]

print(yaml.dump(yaml_data, default_flow_style=False,))
```

## 出力結果2


```
$ python sample.py 
- &id001
  password: Password
  username: User
- *id001
```

# 原因

平たく言うとバグ。若しくは仕様のようだ。
トップページに事例付きで解説が書いてある。

https://pypi.org/project/pyaml/

同様の問題を抱えている人は少なくなく
Qiitaでも[こちら](https://pypi.org/project/pyaml/)で対処法が記載されていたり、
[Issue103](https://github.com/yaml/pyyaml/issues/103)、及び[Issue104](https://github.com/yaml/pyyaml/issues/104)でチケットが上がっている。

残念ながら2018年11月現在においてもこの問題は解消されておらず
WorkArround対応となっている。

[Issue104](https://github.com/yaml/pyyaml/issues/104)に記載があるが
**yaml.dump(data, ignore_aliases=True)** を実装すると、逆にAliasの有るYAMLを読み込んだ際に
無限ループに陥ってしまうらしく、双方をええ具合によろしくやってくれる方法はまだ無いようだ。

従ってWork Arroundで対処する必要がある。

# 対処方法

```YAML
- &id001
 password: Password
 username: User
- *id001
```

```python
import yaml
from pathlib import Path

"""Load yaml file"""
yaml_data = Path().parent.joinpath('sample.yml').open('r')
data = yaml.load(yaml_data)

"""Solution1"""
class NoAliasDumper(yaml.Dumper):
    def ignore_aliases(self, data):
        return True

out1 = yaml.dump(data, Dumper=NoAliasDumper)
print(out1)

"""Solution2"""
noalias_dumper = yaml.dumper.Dumper
noalias_dumper.ignore_aliases = lambda self, data: True
out2 = yaml.dump(data, Dumper=noalias_dumper)
print(out2)
```

```
python sample_read.py 
- {password: Password, username: User}
- {password: Password, username: User}

- {password: Password, username: User}
- {password: Password, username: User}
```

どちらで対処するかはお好みで。
なお、Dumper を SafeDumperにすることはできるが
yaml.dump を yaml.safe_dumpにはできない。
yaml.safe_dumpにすると以下のようなエラーが出てしまう

```
TypeError: dump_all() got multiple values for keyword argument 'Dumper'
```

# 参考リンク

- https://qiita.com/podhmo/items/4dcb6215719ed6197450
- https://github.com/yaml/pyyaml/issues/103
- https://github.com/yaml/pyyaml/issues/104
- https://pypi.org/project/pyaml/
- http://signal0.com/2013/02/06/disabling_aliases_in_pyyaml.html
- https://pyyaml.org/wiki/PyYAMLDocumentation#Scalars
LPC812で液晶ディスプレイ（aqm0802)に文字を表示

##130円マイコンで液晶ディスプレイに表示
秋月電子で130円で売られているマイコンであるLPC812( LPC812M101JD20)に定番のI2Cデバイスである液晶ディスプレイ（aqm0802)をつなげて文字を表示させてみました。
##実際の配線
![P_20181107_212611_vHDR_Auto.jpg](https://qiita-image-store.s3.amazonaws.com/0/313830/c90b975d-67d6-751f-dcf6-85bbe648ca3e.jpeg)

##プログラムは流用
これは、「ボクのlpc810工作ノート」にあるaqm0802の表示プログラムを少し変更することで表示出来るようになります。ここのポイントはLPC812M101JD20だとI2Cの物理ピンが9番ピンと8番ピンである、PIO0_10とPIO0_11が使われることになります。よって、以下のようにします。
ソースは、ラトルズの「ボクのlpc810工作ノート」のサポートページに書籍でしようのソースがダウンロードできます。
http://www.rutles.net/download/433/
その中からlcdprotoを使います。以下、lcdprotoのmain,cの48-49は置き換えて、二行は追加します。これでI2Cは動作するかと思います。

##ソースはの差分
変更追加部(main.c:48行あたり)
はじめ2行は置き換えてください。後半2行は置き換えた行のあとに追加してください。

```cpp
 Chip_SWM_MovablePinAssign(SWM_I2C_SDA_IO, 11);//LPC812
 Chip_SWM_MovablePinAssign(SWM_I2C_SCL_IO, 10);//LPC812
---
 Chip_IOCON_PinSetI2CMode(LPC_IOCON,IOCON_PIO10,PIN_I2CMODE_FASTPLUS);
 Chip_IOCON_PinSetI2CMode(LPC_IOCON,IOCON_PIO11,PIN_I2CMODE_FASTPLUS);
```

##I2Cのポイント
I2CはPIO_10がSCL、PIO_11がSDAとなります。
<img width="335" alt="lpc812i2cpin.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/313830/e6787dfb-dec9-458f-48a8-c52e79d71e54.jpeg">

##開発環境
IDEは以下のものを使用しております。
MCUXpresso IDE v10.2.1 [Build 795] 

##参考書籍
「ボクのLPC810工作ノート」
https://www.amazon.co.jp/%E3%83%9C%E3%82%AF%E3%81%AELPC810%E5%B7%A5%E4%BD%9C%E3%83%8E%E3%83%BC%E3%83%88-%E9%88%B4%E6%9C%A8%E5%93%B2%E5%93%89/dp/4899774338

https://www.rutles.net/products/detail.php?product_id=719
AWS Amplifyのログイントークン保存先をsessionStorageに変更する

AWS Amplifyを使って認証機能を実装したアプリケーションで、タブを閉じるごとにユーザをログアウトさせたい場合の設定


## Amplify.configure

AWS Amplifyの設定初期化時に、Auth -> storage にsessionStorageを指定。

```ts
import Amplify from 'aws-amplify';

Amplify.configure({
    Auth: {
        identityPoolId: 'XX-XXXX-X:XXXXXXXX-XXXX-1234-abcd-1234567890ab',
        region: 'XX-XXXX-X',
        identityPoolRegion: 'XX-XXXX-X',
        userPoolId: 'XX-XXXX-X_abcd1234',

        // OPTIONAL - customized storage object
        storage: window.sessionStorage,
    }
});
```

※ 今回はsessionStorage設定したが、localStorage、sessionStorageと互換性があるインターフェースを持った独自のオンメモリストアclassを指定することもできそう

## 確認

devtools上でも、cognitoのログイントークンがsessionStorageに保存されていることが確認できた。
<img width="877" alt="スクリーンショット 2018-11-09 2.58.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/79414/2e361c6b-8bcf-2c2e-957b-37cf5905749c.png">


## 参考

https://aws-amplify.github.io/docs/js/authentication

https://github.com/aws-amplify/amplify-js/issues/925
Vue.jsのバグ（仕様）

Vueではデータバインディング内部で JavaScript 式が使えます。

> [Vue.js は全てのデータバインディング内部で JavaScript 式を完全にサポートします](https://jp.vuejs.org/v2/guide/syntax.html#JavaScript-%E5%BC%8F%E3%81%AE%E4%BD%BF%E7%94%A8)

なので以下の式では `YES`が表示されます。

```html
{{true ? 'YES' : 'NO' }}
```

では次の式では何が表示されるでしょうか？通常の感覚だと `}}` が表示されそうですが結果は`)+"`となります。

```html
{{true ? '}}' : '{{' }}
```

また以下の式は`{{`が表示されますが

```html
{{ '{{' }}
```

次の式は`)+""+_s(`が表示されます。

```html
{{ '}}' + '{{' }}
```

というように実際には**JavaScript 式を完全にサポートしてない**ので注意しましょう。
備忘録　pandas dataframeのplot()機能をお手軽に使う

# pandasでDataFrame.plot()を簡単に使います

## 準備
以下をインポートしておきましょう

```python:header.py
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib as mpl
```

## pandas df をプロットする

df用のデータは別途用意しておいてください

```python:plotter.py

df=np.DataFrame(list)#適当にdfを定義する

# X軸に列を指定して、すべてのプロットを同じグラフに描画する
df.plot( x='指定列名')

#X軸に列を指定して、プロット毎にグラフを分ける
df.plot(x='指定列名', subplots=True, sharex=True)

# 表示と終了
plt.show()
plt.close('all')
```
##こんな感じで表示されました
![Figure_2.png](https://qiita-image-store.s3.amazonaws.com/0/312064/37d1d0d0-1139-a125-3742-e8c5b5bb4b1b.png)
![Figure_1.png](https://qiita-image-store.s3.amazonaws.com/0/312064/fcb5010f-6686-ab1c-ebb8-11ef3e269e27.png)

[こちらの記事が非常に分かりやすくて参考になります](https://note.nkmk.me/python-pandas-plot/)
Anacondaでpythonのバージョンを使い分ける

普段python3.x系を使ってるのに、急に2.7を使わなくちゃいけなくなった場合

anacondaを使ってバーションを切り替える。

そもそもpython2つもpcに入れられんのかっていう初心者な疑問もある。。。
競合しちゃいそうじゃん！！

仮想で入れれば問題ないらしい
これからその設定をしていく！(macで)

#####仮想環境インストール
コマンドで

```
$ conda create -n py27 python=2.7 anaconda
```
これで終わり。
Anacondaのパス/env/py27ができる

確認は

```
$ conda info -e
```

#####切り替え
切り替えの仕方は、起動とほぼ変わらん。
入る

```
$ conda activate py27
$ jupyter lab
```
出る

```
$ conda deactivate
```

#####番外編
全パッケージの確認

```
$ conda list
```
Anaconda自体のアップデート

```
$ conda update -n base conda
```
Anaconda全パッケージのアップデート

```
$ conda update --all
```
Anaconda特定パッケージのアップデート

```
$ conda update pandas
```
pandasを任意のパッケージ名に変える。
sftpで fatal: bad ownership or modes for chroot directory と言われた

#問題
fatal: bad ownership or modes for chroot directoryと言われた。なぜ？
#解決
chrootする時に、該当フォルダ自体が(中身は関係ない） 

```
chown root:root フォルダ
chmod 755 フォルダ
```

にしないといけない
#ref
https://qiita.com/y_takeshita/items/ff67ff9725b07ab5f926
https://serverfault.com/questions/584986/bad-ownership-or-modes-for-chroot-directory-component
Ruby !!（ダブルエクスクラメーション, びっくり, exclamation）について

# Ruby `!!`の使い方
Rubyのコードを読むことが最近多く、結構`!!`←これを見かけます。
最初わかんなくて調べたので、わかる範囲まとめます。

こんな感じで使われます。

```ruby:name.rb
class Name
  def initialize(first_name, last_name, middle_name=nil)
    @first_name = first_name
    @middle_name = middle_name
    @last_name = last_name
  end
  
  def has_middle_name?
    !!@middle_name  # <= ここ！!
  end
end

Name.new("George", "Washington").has_middle_name?        #=> false
Name.new("Barack", "Obama", "Hussein").has_middle_name?  #=> true
```
なんやそれって感じなので
`!!`の挙動を確認して、`!!`を使う目的を整理してみます。


## 挙動
### `!`について
- 真偽値を逆にするメソッド
- `nil`は`false`として判断されるので、`true`になる
- それ以外の文字列や整数は`true`として判断されるので、`false`になる
  
### `!!`の挙動
```console
irb(main):001:0> !true
=> false                    # trueの逆
irb(main):002:0> !false
=> true                     # falseの逆
irb(main):003:0> !nil
=> true                     # nilは真偽値として判断するとき、falseとみなされる。そのfalseの逆
irb(main):004:0> !'hatena'
=> false                    # 文字列は真偽値として判断するとき、trueとみなされる。そのtrueの逆
irb(main):005:0> !!true
=> true                     # true → false → true
irb(main):006:0> !!false
=> false                    # false → true → false
irb(main):007:0> !!nil
=> false                    # nil(false) → true → false
irb(main):008:0> !!'hatena'
=> true                    # 'hatena'(true) → false → true
```
単純に`!！`は、`!`が2回繰り返されているだけのようですね
そのため、`true`であれば、`true`が返るというように元の真偽値が返ります。
1つずつ挙動を追えば、特に難しいことはしてないってわかりました。

じゃあ、なんでわざわざ`!!`を使うのかって疑問が出てきました。

## `!!`を使う目的
調べて、自分が考えた`!!`を使う目的です。

Ruby（他の言語でもそうである場合が多いと思いますが、、）では、基本的に`?`がメソッド名の最後に来る場合、そのメソッドは真偽値(`true`/`false`)を返すメソッドであると普通のエンジニアは考えます。

そのため、例としてあげている`has_middle_name?`などのように`!!`をつけないと、`nil`を返してしまうと、

```
メソッド名の最後が`?`であれば、真偽値を返すメソッドである
```

という認識に対して、実際の挙動がずれてしまいます。
それを避けるために、そして厳格に`true`/`false`を返すために`!!`を使うようです。

(もちろん、if文の条件に`nil`が入ったとしても、ちゃんと`false`として判断してくれるので`!!`を使わなくても挙動に違いはないと思います。)


今後自分で実装する場合に、`!!`を使っていこうと思います。

## 参考
参考にさせていただきました、ありがとうございます。

- [6 Ruby Best Practices Beginners Should Know](https://www.codementor.io/ruby-on-rails/tutorial/6-ruby-best-practices-beginners-should-know)
- [Rubyの否定演算子2つ重ね「!!」（double-bang）でtrue/falseを返す](https://techracho.bpsinc.jp/hachi8833/2016_11_15/28993)
Javascriptで自分のPrivate IPアドレスを取得

WebRTCを使ってJavascriptから自分のPriavte IPアドレスを取得する事ができるようだ。

* [Can You Get A Users Local LAN IP Address Via JavaScript?](https://stackoverflow.com/questions/20194722/can-you-get-a-users-local-lan-ip-address-via-javascript)

```javascript

// Vender Prefixありバージョンの場合も考慮
window.RTCPeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection;
// RTCPeerConnectionコネクションを作成。NAT越えは不要なのでiceServersは未指定
var pc = new RTCPeerConnection({iceServers:[]}), noop = function(){};      
// データチャンネルを作成
pc.createDataChannel('');
// Offer送信
pc.createOffer(pc.setLocalDescription.bind(pc), noop);
pc.onicecandidate = function(ice) {
  if (ice && ice.candidate && ice.candidate.candidate) {
　　　　　　　　　　　　console.log(ice.candidate.candidate);
      // 正規表現を使ってIPアドレスだけ抜き出す。
      var myIP = /([0-9]{1,3}(\.[0-9]{1,3}){3}|[a-f0-9]{1,4}(:[a-f0-9]{1,4}){7})/.exec(ice.candidate.candidate)[1];
      console.log(myIP);
      pc.onicecandidate = noop;
  }
};

```

WebRTCはブラウザ同士でP2Pの通信ができる仕組みなのだけど、お互いにやり取りするときに、自分のIPなどを含む情報(Session Description Protocol[SDP])をやり取りする。

```
candidate:0 1 udp 2122260223 192.168.xxx.xxx 64980 typ host generation 0 

```

この情報から自分のIPアドレス情報を抜き出す事でPrivateIPアドレスの取得を実現しているようだ。


下記の記事が参考になった。

* [WebRTCの簡易シグナリング
](https://qiita.com/massie_g/items/f5baf316652bbc6fcef1)


現在、Chromeだとipアドレスが取得出来なくなっていた。``ice.candidate``の出力内容にChromeとFirefoxの場合で違いがあるようだ。localhostとインターネット越しにつなぐ場合も結果が違うようだ。

[mDNS を利用したWebRTC のローカル IP 隠蔽機能](https://medium.com/@voluntas/mdns-%E3%82%92%E5%88%A9%E7%94%A8%E3%81%97%E3%81%9Fwebrtc-%E3%81%AE%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB-ip-%E9%9A%A0%E8%94%BD%E6%A9%9F%E8%83%BD-ebc6329f26d4)

によるとChromeや、Safariだと、IPアドレスではなく、UUID.local形式になるようだ。
複数の画像をリサイズして共有するショートカット

# はじめに
出先などでiPhoneで撮影した大量の画像を、まとめてメールで送ったり、まとめてSlackで共有したりしたいときに、画像を縮小してJPGにした上で、iOSの「共有」メニューから共有できるようにする「ショートカット」（「ショートカット」アプリで使うもの）です。

# 課題
最近のiPhoneはカメラの解像度が高いため、写真のファイルサイズが大きく、大量の画像をまとめてネットワーク越しに送信（共有）するときに、ギガを食ってしまうし、時間がかかるし、結果バッテリも消費する（それほどでもない？）という三重苦に見舞われます。
もちろん、オリジナルの状態で共有しなければならない場合は我慢するしかないですが、出先から速報的に情報共有する目的であれば、ある程度解像度を落とした画像でも十分なことも多いです。
また、最近のiPhoneでは、デフォルト設定ではHEIC形式で保存されるため、そのままSlackに共有すると適切に表示されない経験などをしました。

# 提案手法
このような課題に対し、iOSの様々な処理を組み合わせて（少し）複雑な処理を可能にするアプリ「Shortcuts」（日本名「ショートカット」）を使って、複数の画像を選択し、全ての画像を縮小した上で、JPGに変換して、iOSの「共有」メニューから任意のアプリで扱えるようにしました。

- [画像縮小（サイズ選択）→共有](https://www.icloud.com/shortcuts/1e497ed0f6d84f02a00441b916c16557)
    - このショートカットを実行すると、まず画像をどの大きさに縮小したいのかを聞いてきます。サイズは以下の5つから選べます。
        - 512
        - 768
        - 1024
        - 1536
        - 2048
    - 次に、「写真」アプリの画面から、画像を選択するよう促されます。画像は複数選択可能です。
    - 画像を選択すると、ショートカットがそれぞれの画像の縦横を取得し、縦が大きい画像は縮小後の縦が先に選択したサイズに、横が大きい画像は縮小後の横が先に選択したサイズに、それぞれなるように縮小します。このとき、アスペクト比は保たれます。
    - 縮小した画像は、続いてJPGに変換されます。
    - 最後に、iOSの「共有」メニューを呼び出します。「共有」メニューから呼び出せる任意のアプリで、縮小したJPGを共有することができます。
    - **問題点**
        - としては、このショートカットをウィジェットから呼び出せるようにした際、画像を縮小するサイズを選択する部分が、適切に表示されません。「タップして残りを表示↑」なる表示が出るのですが、手元の環境ではタップできません。

- [画像縮小（1024）→共有](https://www.icloud.com/shortcuts/45e3b17c0a114d66a71b011b0977871d)
    - このショートカットを実行すると、上のショートカットであった画像を縮小するサイズを聞く処理がなく、いきなり「写真」アプリの画面から、画像を選択するよう促されます。画像は複数選択可能です。
    - 画像を選択すると、ショートカットがそれぞれの画像の縦横を取得し、縦が大きい画像は縮小後の縦が1024に、横が大きい画像は縮小後の横が1024に、それぞれなるように縮小します。このとき、アスペクト比は保たれます。
    - 縮小した画像は、続いてJPGに変換されます。
    - 最後に、iOSの「共有」メニューを呼び出します。「共有」メニューから呼び出せる任意のアプリで、縮小したJPGを共有することができます。
    - 上のショートカットには前述のような**問題点**があったので、苦肉の策です。

# 結果
TBD

# まとめ
以上です。
最近のQiitaの記事の質が下がってきている事への考察

ここ最近、Qiita上でクソ記事書くなとか、炎上YouTuberとか、今後必要になる～～とか、全ての開発者が～～とか、
そしてそれらの記事に対する反論記事にアンサー記事、言ってしまえばこの記事だってそうなるけども
そういうモノが多い気がしませんか

Qiitaって、そういう目的のサイトだったんでしょうか？
確かにPHP触らない人は基本PHPの記事は見ないし、C#について調べている最中にHaskellの記事は読まない。
Pythonで機械学習しようとしてる人は3Dオブジェクトが云々の記事を見ないし、AWSマスターだと言える人はAWS初心者向けはあまり開かない。
そのため、記事のジャンルによってはいいねの数も付きやすさも変わって、大衆受けするものがトレンド入りしやすくなるし、まして"全ての開発者"なんて広い主語の記事は大体の人は気になって見に行くし、結果いいねが付きやすくなる。
大人数のユーザーを持つOrganizationは組織票でつくこともある。
そこについてはしっかり理解していますし、恐らく他のQiitaユーザーも分かってやっているのだと思います。

じゃあQiitaはバズる記事を書けばいいのでしょうか?単純に自分が有名になるだけの記事を書けばいいのでしょうか?自分がこのフレームワークつかって、ここで失敗したからバッドナレッジってことで、同じところで躓いた他の人の助けになるような事を書いたり、自分で実装した処理を「このサービスと言語でこんな風に実装しました!」って事書いたり、僕はこんなサービスリリースしました!ロジックはこうこうこんな感じです!って紹介したりして、そういう記事を増やすことで、こんな処理したいけどどうすれば・・って人が検索した時にQiitaでの記事を見つけて前進出来たり、あーこの人はこんな所で失敗したんだな・・自分は気をつけようって他人の経験から学ぶ事が出来たり、こんなサービスはこういう風に動いてるんだなぁって見た人のノウハウになったり、
そういう目的が主となっているんじゃなかったんでしょうか

確かに、今後こんなプログラムが必要だ!って言われたら気になって見てしまいますし、その記事は面白いでしょう。
全ての開発者はこの言語を学べ!気になりますね、そうかこんな言語が今需要あるのか。見てて楽しいですね。
でもそれってQiitaの目指す所なのですか。プログラムに関する再利用性・汎用性の高い情報が集まる場をつくろうとしているサイトで必要ですか。いらないとは言いません、私も面白いとは思っています、ですが、今回の事をきっかけとして、またQiitaの本来求められた姿を取り戻せるように、記事の質を変えていきませんか。


#補足
たくさんのコメント、反論意見に同調意見ありがとうございます
この記事に対する意見を、また記事として書く、ではなくコメントとしてたくさん頂けてるということは少しなりとも皆様の考えに私の意見が反映されているのではないかと考えています。

私も、目を離したすきにここまで伸びてるとは思わず、全員に返信は時間もないのでこちらに書かせていただきます
記事の質が高い低い、言葉の強さに関して、執筆中確かに感情的になっていたせいもあってそのような言葉使いになってしまったことは申し訳ありません。

また、運営側にどうしてほしい、というよりはイチユーザーとして記事を書く時は少しでも私の意見を思い出していただきたいという思いが強く、記事にさせていただきました。

通報・ミュート機能があるからそうすべきとの意見に関してですが、上でも書いてある通り私も、今回の記事で題に上がるような記事は楽しく見させていただいていること。
その他に、意図的に質の低い記事を書こうとしている人はいない。そう考えているため通報に関しては考えていないです。もちろん、悪意を持って記事を書いている方がいれば通報や運営側からのユーザー削除などの措置があると思います。
質のいい記事を書いている人だけが意識すればよい、との意見に関しても同じように、意図して質の低い記事を書こうとしている人はいないと考えているので、「この記事を見た方に伝われば良い」として述べています。

Paizaランクが高い人のみかけるようにすればよいのか?とありましたが、私はむしろ初心者こそ記事を書いていくべきと考えていまして、理由としては初心者である自身はどこで躓いて、どう解決したか、それらのナレッジを共有することが他ユーザーにとっても有益なことであると思っています。もちろん、技術力の高い方の書く記事もとても重要です、どちらも重要ですが、初心者である私目線で考えた場合、初心者こそ記事を〜〜という意見になっています。
勘違いされないようにもう一度読んでいただきたいのですが、レベルの低い人が書くレベルの低い記事が質の低い記事ではなく、誰かの記事を真似て同じような事しか書かれていない記事や、コメントで完結する内容を述べた記事を、ここでいう質の低い記事として私は捉えていますし、そのように書いてあります。
とはいえ、誰かの記事に対するアンサー記事でも、とても面白いものも見受けられます。ポジティブな感想ですので、例としてトレンド入りしている記事をリンクとして貼っておきます。
[「今後必要になるプログラム言語」を読むに当たって](https://qiita.com/pik/items/1c95d69debee4aedffea)
[重要な自然言語](https://qiita.com/Gaccho/items/e12e998b0a1788d55f5f)

また、@koshian2さんのコメントがとても納得でき、興味深い事が書かれており私の記事以上に考察されています。(私の記事の質が低い事が原因でもあります・・)

意見記事としてあげたものですので、これに対する反論や同調意見などはもっと見てみたいと考えているので、どれだけ単純な事でもよいです。この記事を読んで、何か思う事があればぜひ教えていただけませんか。
Vue.jsのnested dataをwatchする

# 環境
- Vue 2.5.17

# dataに定義されている連想配列の内部をwatchしたい
### ダメな例

```js
new Vue({
  el: '#app',
  data: {
    obj: {
      message: ''
    },
    result: ''
  },
  watch: {
    obj.message: function(val){
      this.result = val;
    }
  }
});
```

`obj.message`はキー名としてアウト。。。
じゃあどうやって監視するのか調べたところ

- handlerでobj全体を監視する方法
- 文字リテラルでキー名を指定する方法
  
があった。

### handlerでobj全体を監視する方法
```js
new Vue({
  el: '#app1',
  data: {
    obj: {
      message: '',
      other: ''
    },
    result: ''
  },
  watch: {
    obj: {
      handler: function(val) {
        this.result = val.message;
      },
      deep: true
    }
  }
});
```
この場合はobjの他の要素も監視されるので扱いには注意。

### 文字リテラルでキー名を指定する方法
```js
new Vue({
  el: '#app2',
  data: {
    obj: {
      message: '',
      other: ''
    },
    result: ''
  },
  watch: {
    'obj.message': function(val) {
      this.result = val;
    }
  }
});
```
この場合はobj.messageのみが監視される。

jsfiddleに上記コードを書いた、結構便利だったので検証などで利用していきたい。。。
[https://jsfiddle.net/nakata_kazuhiro/5y1rctap/31/](https://jsfiddle.net/nakata_kazuhiro/5y1rctap/31/)


# 参考
[Vue.js 公式](https://jp.vuejs.org/v2/api/#watch)
[vue.js 2.x その0009 watchで配列(array)や連想配列(object)を監視する](http://motomichi-works.hatenablog.com/entry/2017/04/08/164548)
DBの更新をインスタンスにreloadする

別に大した話ではないのだけど、よく忘れたり、あれ？ってなるときがあるので備忘録。

## DBの更新をActiveRecordインスタンスにロードし忘れる
良くRspecで値が更新されたかどうか系をテストしたりするときに忘れることが多い気がする。

例えば、

```ruby
describe do
  before do
    @user = User.find(1)
  end

  it do
    User.first.update(name: 'hoge')
    expect(@user.name).to eq 'hoge'
  end
end
```
これはテストが通らないはず。

`update`してる下に`@user.reload`するか、`@user.update`とARのインスタンスから更新処理を実行するようにすれば良い。（いろいろツッコミどころ満載だけど気にしない）

とりあえず、**ActiveRecordインスタンス経由で更新が行われなかった場合、そのインスタンスに更新の影響は反映されない。反映させたいのなら`reload`しろ**ということをちょっと覚えておきたかった
[MySQL] 外部キーを動的に削除

# 概要
本記事を通して実行すると動的に外部キーを削除できるようになる！

~~railsのridgepoleを使うとデータベースを再作成するときに外部キー制約エラーが発生して、都度外部キーを削除しないといけない場面が発生。開発をしている最中のため、外部キーが増えた時のメンテナンスも大変になってしまうため動的に削除できないかを検討。~~
(05/20追記) ridgepoleの使い方が間違えていたみたいです。。


だけど...ネットで情報が全くない！！！
静的に削除する記事は見かけたが、意外とMySQLで動的外部キー削除の記事が見当たらなかったので、Qiitaに備忘録として残すことにした。

そもそもストアドプロシージャの情報が少なすぎる...。
あまり活用されていないのかな？？

# 実行環境の情報
- MySQL 5.7
- **ストアドプロシージャを利用**
- **rootユーザーで実行**


# ストアドプロシージャー実装

1. 外部キー情報を保持しているシステムテーブル`information_schema.key_column_usage`の制約(constraint_name)カラムを検索。`fk_`から始まる名前を外部キーとして扱い**テーブル情報**と**制約名**を取得する。

1. 取得した情報を元に`ALTER TABLE [テーブル名] DROP FOREIGN KEY [制約名]`文を動的に作成して実行する。

```sql:drop_foreign_key.sql

DROP PROCEDURE IF EXISTS DropForeignKey;

DELIMITER //
CREATE PROCEDURE DropForeignKey()
BEGIN
  DECLARE _table_name VARCHAR(64);
  DECLARE _constraint_name VARCHAR(64);
  DECLARE _done INT DEFAULT FALSE;
  DECLARE cur CURSOR FOR
    SELECT table_name, constraint_name
    FROM information_schema.key_column_usage
    WHERE constraint_name LIKE 'fk_%';
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET _done = TRUE;

  OPEN cur;
  read_loop: LOOP
    FETCH FROM cur INTO _table_name, _constraint_name;

    IF _done THEN
      LEAVE read_loop;
    END IF;

    SET @stmt = CONCAT('ALTER TABLE ', _table_name, " DROP FOREIGN KEY ", _constraint_name);
    PREPARE statement FROM @stmt;
    EXECUTE statement;
    DEALLOCATE PREPARE statement;
  END LOOP;
  CLOSE cur;

END//
DELIMITER ;

CALL DropForeignKey;
DROP PROCEDURE DropForeignKey;
```

# 実行コマンド

```bash
$ mysql -u root -pdummy -D database -e "source drop_foreign_key.sql"
```

# 参考文献
- ストアドプロシージャの基本的ななにか
https://qiita.com/setsuna82001/items/e742338eb93e3a48ba46

- 初心者からのMySQLストアドプロシージャ＆ファンクション入門
http://proengineer.internous.co.jp/content/columnfeature/7078

- ストアドプロシージャについての公式ドキュメント
https://dev.mysql.com/doc/refman/5.7/en/create-procedure.html
ヘッダーオンリー C++ DNG/TIFF ローダ TinyDNGLoader で .tx テクスチャを読む

漢なら tx テクスチャ(tiled TIFF テクスチャ)を自作のレンダラで読みたいですね!!

.tx は, OpenImageIO で作成できるテクスチャ形式で, 事前に tile 化 + mipmap 処理をします.
Arnold とかで使われていたりします.

https://docs.arnoldrenderer.com/display/A5AFMUGJPN/Tx+Manager

やりましょう!

できました.

https://github.com/syoyo/tinydngloader

<blockquote class="twitter-tweet" data-lang="ja"><p lang="en" dir="ltr">Added API of loading DNG/TIFF from memory, and also added support for decoding OIIO&#39;s .tx(tiled ZIP-ed TIFF texture) in header-only C++ DNG loader library TinyDNGLoader! 🎉🎉🎉㊗️㊗️㊗️㊗️💪💪💪💪😎😎😎😆😆😆🍺🍺🍺 <a href="https://t.co/sgLCGM7SEc">https://t.co/sgLCGM7SEc</a> <a href="https://t.co/yRiU1YXCfO">pic.twitter.com/yRiU1YXCfO</a></p>&mdash; Syoyo Fujita ⚡️ No ray tracing No life (@syoyo) <a href="https://twitter.com/syoyo/status/1060522576898715649?ref_src=twsrc%5Etfw">2018年11月8日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>




## .tx 構造
 
LDR 画像(jpg など)を maketx で処理すると, ZIP 圧縮の tiled TIFF がデフォルトになります.
(maketx のオプションでフォーマットを変えることができる? かも? OpenImageIO のソースを見ればわかるでしょう)

TinyDNGLoader はもともとはデジカメとかの DNG 画像(10 ~ 16bit Bayer 画像とか)のローダーを目指して作成していましたが, DNG も中身は TIFF フォーマットであるので, 多少の変更で .tx を読むことができました.

また, TinyDNGLoader では, 今までは FILE ポインタからパースをしていましたが, メモリ上から TIFF 画像をパースできるようにもしました. 現状は読み込んだ画像は全部 De-tile して一枚の画像(のレイヤー)にしていますが, タイルへのオフセットだけを保持しておき, 遅延読み込みをするという拡張もしやすくなっています.

### 少しハマった点

maketx では 64x64 のタイルサイズで mipmap を作っていきますが, 1x1 くらいになるまで繰り返すので, 画像サイズが 16x16 だけども tile size が 64x64 でデータが保存されているとかがあります.
TIFF の場合, 1 画像に 1 tile だけの場合は画像データへのオフセット値の取り方が異なります(TileOffset tag で取得したオフセットを使う)


## TODO

* HDR 画像や, 12bit 画像などを maketx で処理するとどうなるか調べる
* Tile の画像のまま読み込むオプションをつける
* 遅延読み込みできるようにする.
* 優秀な若人さまが, **人類史上最速で優秀なレンダラ書き若人へと昇華なされるスキーム**を確立する旅に出たい.
Macで「.htaccess」のようにドットから始まるファイルを表示・非表示する方法（メモ用）

PHPの学習に伴い、開発環境を構築するにあたり、知る機会があったので、メモしておきたいので以下に記録する。
ターミナルにて、それぞれに状況に応じて、以下のコマンドを実行。


##表示にする場合

まず、最初に以下のコマンドを実行

``` terminal
$ defaults write com.apple.finder AppleShowAllFiles true
````

次に下記のコマンドを実行すると、Finderで確認してみる。

``` terminal
$ killall Finder
```


##非表示にする場合

最後尾にfalseと書いてあるので、非表示目的のコマンドであるのは分かりやすい。
同じく、最初にこれを実行する。

```
$ defaults write com.apple.finder AppleShowAllFiles false
```
次に同じく下記のコマンド実行すると、非表示になる。Finderで確認できる。

``` terminal
$ killall Finder
```