OmniAICreator/Qiita-1.07M huggingface dataset:
Djangoの画面個別templateからstaticファイルを参照する時にハマった話

# はじめに
* 当記事は下記の環境にて動作を確認しています。  
 1. Python 3.6.2  
 2. Django 1.11.4

---

# 結論
個別画面のtemlateでもstaticファイルを扱うときは{% load static %}を書こう！

---

# Djangoのtemplateからstaticファイルを参照するには？
[Djangoのチュートリアル](https://docs.djangoproject.com/ja/1.11/intro/tutorial06/)には下記のように記載されています。

```html:sample.html
{% load static %}

<link rel="stylesheet" type="text/css" href="{% static 'polls/style.css' %}" />
```

この{% load static %}を書いておくことによって、
以降のstaticでsetting.pyで指定した静的フォルダのパスを指定できますよ、
という話なんですが…。

例えば下記のようなtemplateを作成します。

```html:base.html
{% load static %}
<!DOCTYPE html>
<html lang="{{ LANGUAGE_CODE|default:"en-us" }}">
<head>
<meta charset="UTF-8">
<title>{% block title %}Register{% endblock %}</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link href="{% static 'css/bootstrap.min.css' %}" rel="stylesheet">
<link href="{% static 'css/bootstrap-theme.css' %}" rel="stylesheet">
<script src="{% static 'js/jquery-3.2.1.min.js' %}"></script>
<script src="{% static 'js/bootstrap.min.js' %}"></script>
{% block extrahead %}{% endblock %}
</head>
<body>
  <div class="container">
    {% block content %}
      {{ content }}
    {% endblock %}
  </div>
</body>
</html>
```

```html:extend.html
{% extends "base.html" %}

{% block title %}タイトル{% endblock title %}

{% block content %}
    <img src="{% static 'graph.png' %}">
{% endblock content %}
```

実は上記コードでは、graph.pngは表示できません。
実際に画面表示してみると、TemplateSyntaxErrorが表示されます。

---

# なんで表示できないの？
[stack overflow](https://stackoverflow.com/questions/22650371/django-is-it-impossible-to-static-tag-into-block-tag)に似たような質問がありました。

継承したtemplateでロードしていても、
継承先のtemplateでももう一度、ロードするtemplateタグを書かないといけないようです。
つまり上記の例で言うと、extend.htmlを下記のように修正すればOKです。

```html:extend.html
{% extends "base.html" %}
{% load static %}

{% block title %}タイトル{% endblock title %}

{% block content %}
    \<img src="{% static 'graph.png' %}">
{% endblock content %}
```

---

# 参考URL
Djangoのチュートリアル  
https://docs.djangoproject.com/ja/1.11/intro/tutorial06/  

stack overflow  
https://stackoverflow.com/questions/22650371/django-is-it-impossible-to-static-tag-into-block-tag
プライベートリポジトリからのgit cloneで403


# 事象
何も考えずに`git clone`してみた

```
git clone https://github.com/username/private-repository.git
```

そしたら403が返ってきた

```
error: The requested URL returned error: 403 Forbidden while accessing https://github.com/usrname/private-repository.git/info/refs
```

# 解決法

これでプライベートリポジトリからクローンできた

```
git clone https://username@github.com/username/private-repository.git
```

# 参考
https://stackoverflow.com/questions/24008982/git-access-to-private-repository-using-https
kubernetesでreplicasを2にしたり、rolling-updateするとpodがpendingのままになってしまった時の対処


rolling-update出来ないなんてkubernetesの左腕を落とされたようなもんだよ、とほほ…と渋々deploymentの更新を`kubectl delete -f somedeployment.yaml && kubectl create -f somedeployment.yaml`という原始的なコマンドでやっていたわけですが(もちろんダウンタイムが発生)、pendingにならない方法を見つけたので書いておきます
というかドキュメントちゃんと読んだ人は何でそんなこと知らずに使ってんだという感じなんでしょうがGitHub issueに同じような書き込みしてる英語圏の人々がたくさんいたので英語が読めないとか関係なくやつらも読んでいない(確信)

rolling-updateをした時に作成されるpodで合計数が2になったり、deployment.yamlにreplicas: 2を設定すると後から作成されるpodのステータスがpendingのままお亡くなりになってしまった疲れからか不幸にも黒塗りの高級車に追突してしまう。後輩をかばいすべての責任を負った三浦に対し、車の主、暴力団員谷岡に言い渡された示談の条件とは…。


※イメージ
Pendingしてるpodをdescribeするとこんなエラーが出ている

```
No nodes are available that match all of the following predicates:: Insufficient cpu (1)
```

理由は、`kubectl describe nodes/指定node名`の下の方に出てくるCPU Requestsという数値が100%を超えてしまうような設定や動作になっているためPendingのままになる

例えば小さいnode上のk8sが使っているpodがCPU Requests80%使っている場合、利用者が追加できるのは20%分のCPU Requestsしかない
APIサーバー、フロントエンドWebサーバーがそれぞれ1pod10%ずつ利用する設定になっている場合、applyやreplaceで新pod1つ追加されるだけで110%使用することになりPendingのままになる
Rolling-updateしたいなら10%を5%にしてしまえばいい

```
Allocated resources:
  (Total limits may be over 100 percent, i.e., overcommitted.)
  CPU Requests  CPU Limits      Memory Requests Memory Limits
  ------------  ----------      --------------- -------------
  878m (87%)    248m (24%)      700816Ki (40%)  854416Ki (49%)
Events:         <none>

```

### CPU Requestsで使用する数値設定

```
    1 apiVersion: apps/v1beta1 # for versions before 1.6.0 use extensions/v1beta1
    2 kind: Deployment
    3 metadata:
    4   name: spa-web-nginx
    5 spec:
    6   replicas: 1
    7   template:
    8     metadata:
    9       labels:
   10         app: spa-web-nginx
   11     spec:
   12       containers:
   13       - name: spa-web-nginx-container
   14         image: somerepository/spa-web-nginx-build:v6
   15         ports:
   16         - containerPort: 80
   17         resources:
   18           limits:
   19             cpu: "1"
   20           requests:
   21             cpu: 50m # デフォルト100m使っていたので半分の50mに設定する

```

replicasは1なのでrolling-updateしても問題なくdeploymentの更新もできる
50mにしたのでreplicasを2にしても両pods動作する(CPU Requestsギリギリだったのでrolling-updateは動かなくなる)




### 雑なコマンドメモ

nodeを一覧取得

```
kubectl get nodes
```

nodeのdescribe

```
kubectl describe nodes/nodeのNAME
```

deploymentの更新

```
kubectl apply -f somedeployment.yaml
kubectl replace -f somedeployment.yaml
```


### 所感
人権を取り戻した
疲れた、ドキュメントは各自読んでくれリンクは置く
pengingと書いてしまいペンギンしていた:penguin:

### 調べたページ
https://kubernetes.io/docs/tasks/configure-pod-container/assign-memory-resource/
https://kubernetes.io/docs/tasks/configure-pod-container/assign-cpu-resource/
https://kubernetes.io/docs/tasks/administer-cluster/cpu-default-namespace/
https://stackoverflow.com/questions/45573825/pod-will-not-start-due-to-no-nodes-are-available-that-match-all-of-the-followin
静的ファイル配信するだけ nginx on docker

# 手順

## HTMLを置く
```html:./public/index.html
Hello, World!
```

## nginxのコンフィグファイルを書く
```text:./server.conf
server {
  listen 80;
  server_name localhost;

  server_tokens off;

  access_log /root/logs/access.log;
  error_log /root/logs/error.log;

  location / {
    root /root/public;
  }
}
```


## Dockerfileを書く

```text:./Dockerfile
FROM nginx

ADD ./server.conf /etc/nginx/conf.d/default.conf

RUN mkdir /root/logs
RUN chmod 755 -R /root

CMD ["nginx", "-g", "daemon off;"]
```

- default.confを上書きしている


## イメージを作る
```bash
$ docker build -t simple-nginx .

$ docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
simple-nginx        latest              57e237b6b8c0        14 minutes ago      107MB
nginx               latest              b8efb18f159b        3 weeks ago         107MB
```


## コンテナを作って起動
```bash
$ docker run -d -p 80:80 -v $(pwd)/public:/root/public --name your-container-name simple-nginx

$ docker ps -a

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
71dd9f3a6583        simple-nginx        "nginx -g 'daemon ..."   3 seconds ago       Up 2 seconds        0.0.0.0:80->80/tcp   your-container-name
```


## もう見れるはず
http://localhost


## bash
```bash
$ docker exec -it your-container-name bash
```

# その他

## コンテナ操作
```bash
$ docker stop your-container-name
$ docker start your-container-name
$ docker rm your-container-name
```

## イメージを消す
```bash
$ docker rmi simple-nginx
```
AIX使用時の備忘録（コマンド補完、コマンド履歴編）

# AIX使用時の備忘録（コマンド補完、コマンド履歴編）
AIX使用時に毎回忘れてしまうので備忘録として残します。
コマンド補完、コマンド履歴は、emacsモードを使用。

## emacsモードの使用方法
以下のコマンドでemacsモードを切替。

| emacsモード| コマンド |
|:-----------------|:------------------|
| ON  | `set -o emacs` |
| OFF | `set +o emacs` |

## コマンド履歴
emacsモードにおいて以下のコマンドを実施。

| コマンド|意味|
|:-----------------|:------------------|
| `[Ctrl] + p` | 前のコマンド |
| `[Ctrl] + n` | 次のコマンド |

## コマンド補完
emacsモードにおいて 、`[Tab]` ではなく、`[Esc]`を使用。
【Swift4】（国際化対応）NSLocalizedStringをString extensionで実装する


既に当たり前のextensionだと思いますが、備忘録として書いておきます。

下記のような感じで使用します。

```swift
print( "多言語化".localized )   // "Multilingualization"
```

extensionは下記の通り。

```swift
import Foundation

extension String
{
    // 多言語対応
    // 対象言語の「Localizable.strings」ファイルがない場合は、(Base)が使用されます。
    // 指定の文字列が「Localizable.strings」にない場合は、commentが採用されます。本実装では元の文字列が選択されます。
    var localized: String
    {
        return NSLocalizedString(self, tableName: nil, bundle: Bundle.main, value: "", comment: self)
    }
}
```

NSLocalizedStringではdefaultが効いているので、ごちゃごちゃ書かないで

```swift
var localized: String
{
   return NSLocalizedString(self, comment: self)
}
```
で大丈夫です。

注意したいのは最初に「Localizable.strings」ファイルを作った時に「info.plist」の「Localization native development region」が「en」（英語）になっていることです。

例えば
「Localization native development region」が「en」
「Localizable.strings」のBaseを日本語
「Localizable.strings」のEnglishを（もちろん）英語
で作成すると日本語環境でもBaseの日本語はパスされて英語が表示されます。

「Localizable.strings」のBaseを英語
「Localizable.strings」のJapaneseを作成することで
日本語環境は日本語、それ以外は英語を表示することができます。
Visual Studio でのリモートデバッグ（Linux）

Visual Studio 2015 以降，リモートデバッグがサポートされました．
ターゲットの Linux 環境でコンパイルし GDB 上で実行し，その GDB を Visual Studio のデバッガのインタフェイスを使って操作できるようになっています．

# 新規プロジェクト作成
![newproject.PNG](https://qiita-image-store.s3.amazonaws.com/0/5837/6ca9d79d-d1ee-bfd6-8ea4-d4f1ec73817f.png)

# コードを書く
![code.PNG](https://qiita-image-store.s3.amazonaws.com/0/5837/4782180e-1c78-d8d2-17ec-8f1a425ab425.png)

標準 C／C++ ライブラリに含まれないようなものは，Visual Studio 上は構文エラーとして見えます．
とはいえコードのコンパイルと実行はターゲットの Linux 上で実行されるため，ターゲットの環境で g++ などを叩いてコンパイルできるコードであれば問題ありません．

![syntaxerror.PNG](https://qiita-image-store.s3.amazonaws.com/0/5837/1451eaba-3520-c976-978e-6e70d3ef25bc.png)

どうしても気になる人はターゲットシステムからヘッダファイル一式を持ってきて適当なディレクトリに放り込んでプロジェクトプロパティのインクルードディレクトリに追加しておけば良いです．

2017.08.20 追記：
ネットワークドライブや Samba 共有でも可．Visual Studio がヘッダファイルを読み込め，解析できれば構文エラーは消えます．

Visual Studio を使っている以上は IntelliSense の世話になりたいですよね．

なお，よく使われるものについては `$(ISenseIncludePath)` に入っています．

`$(ISenseIncudePath)`
 はデフォルトでは以下のような感じです．（Visual Studio のバージョンにより異なります）

* C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\IDE\VC\Linux\include\usr\include\c++\5
* C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\IDE\VC\Linux\include\usr\include\x86_64-linux-gnu\c++\5
* C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\IDE\VC\Linux\include\usr\include\c++\5\backward
* C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\IDE\VC\Linux\include\usr\lib\gcc\x86_64-linux-gnu\5\include
* C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\IDE\VC\Linux\include\usr\local\include
* C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\IDE\VC\Linux\include\usr\lib\gcc\x86_64-linux-gnu\5\include-fixed
* C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\IDE\VC\Linux\include\usr\include\x86_64-linux-gnu
* C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\IDE\VC\Linux\include\usr\include

# 実行
プロジェクトをビルドし実行します．

そのままではコンソール出力が見えないので，Linux 環境のコンソールを開いておきます．

![linux_console.PNG](https://qiita-image-store.s3.amazonaws.com/0/5837/658c542c-3aca-69d2-1222-c281c1d164c0.png)

初めてリモートデバッグを使用する場合は接続先を指定する画面が出ます．

![ssh.PNG](https://qiita-image-store.s3.amazonaws.com/0/5837/3729fd8c-19eb-32c0-a7e0-021d62b1df5d.png)

実行できるとこんな感じ．
![console_out.png](https://qiita-image-store.s3.amazonaws.com/0/5837/e65a6196-d7a9-2109-0ba3-4fd363aac67f.png)

デフォルトではターゲット環境で gdbserver を起動し，それに Visual Studio から接続します．

gdbserver が見つからないと言われたら gdbserver を入れておきましょう．

![gdbserver_notfound.PNG](https://qiita-image-store.s3.amazonaws.com/0/5837/62612d9f-2755-6443-bdd4-5cd78d4aca54.png)

```
% zypper in gdbserver
とか
% apt-get install gdbserver
```

# デバッガの操作
おなじみの画面・操作で変数ウォッチャ，逆アセンブリ，コールスタックを使うことが出来ます．

![break.PNG](https://qiita-image-store.s3.amazonaws.com/0/5837/b6cc4806-bf0b-7a5e-21b7-48341f6b0df4.png)
Docker Machineで構築した環境に実機端末でアクセスする

Docker Machineを使用してローカル環境で開発している際にスマホ端末で確認したくなった際のメモです
(http://qiita.com/horikeso/items/2a53cbacd0d6154a7fb8 で作った環境です)

コメントでngrokが良いということでそちらでも試してみました。
http://qiita.com/horikeso/items/87ebd3722039dc7b0c21

---

##  docker-machineはデフォルトで192.168.99.100になるのでこれにローカルIPからポートフォワーディングします。

* 管理者権限でコマンドプロンプトを実行
* ローカルIP確認

```bat
ipconfig
```
```
～～～～～～
IPv4 アドレス . . . . . . . . . . . .: 192.168.0.5
～～～～～～
```
* ローカルIPからポートフォワーディング
 
```bat
netsh interface portproxy add v4tov4 listenport=80 listenaddress=192.168.0.5 connectport=80 connectaddress=192.168.99.100
```
* 設定確認

```bat
netsh interface portproxy show v4tov4
```

```
ipv4 をリッスンする:         ipv4 に接続する:

Address         Port        Address         Port
--------------- ----------  --------------- ----------
192.168.0.5     80          192.168.99.100  80
```

* 設定削除（ローカルIPが変わった場合等にここで設定した転送設定を削除する際に行います）

```bat
netsh interface portproxy reset
```

あとはファイアウォールの設定で受信の80番ポートを開放して
同じローカルのネットワーク内のスマホ端末から
http://192.168.0.5
にアクセスするだけです。

---

ファイアウォールの設定方法（Windows10）

コントロール パネル\すべてのコントロール パネル項目\Windows ファイアウォール
↓
左側メニューの詳細設定
↓
受信規則の設定を右クリック
↓
新しい規則（N）

* 規則の種類
ポート

* プロトコルおよびポート
TCP
特定のローカルポート 80

* 操作
接続を許可する（A）

* プロファイル
プライベート
パブリック

※プライベートだけでは私はつながりませんでした。
※送信の規則は設定する必要はありませんでした。
chromeのheadless browserを試してみる

# Headless browser

> Headless Chrome が Chrome 59 に搭載されます！これは Chrome をヘッドレス環境で実行する手段です。Chrome をクローム（ブラウザーのUIのこと）なしに実行します！ヘッドレス Chrome によって、Chromium とそのエンジン Blink が提供するモダンなウェブプラットフォームの機能すべてがコマンドラインにもたらされるのです。
https://developers.google.com/web/updates/2017/04/headless-chrome?hl=ja

この記事にあるようにテストしたり色々な用途があります。今回はwebRTCのクライアントとして試すためにまずはセットアップ。

## セットアップ
chrome59以上が入っていればalias貼るだけで動きます。

```
alias chrome="/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome"
alias chrome-canary="/Applications/Google\ Chrome\ Canary.app/Contents/MacOS/Google\ Chrome\ Canary"
alias chromium="/Applications/Chromium.app/Contents/MacOS/Chromium"
```

## とりあえずCLIで動かす
かんたんに動かすだけなら実装もせず動きます。

```
$ chrome --headless --disable-gpu --screenshot https://www.chromestatus.com/
```

## nodeで動かそう
幾つか必要なものがあります。

```
"async": "^2.5.0",
"asyncawait": "^1.0.6",
"chrome-launcher": "^0.6.0",
"chrome-remote-interface": "^0.24.4",
"lighthouse": "^2.4.0"
```
この辺ですね、npmでよしなに入れてください。
[コードはコチラ](https://github.com/jumbo-in-Jap/chrom_headless)

このように動きます。 localhost:9222でもコンソールが立ち上がるので、そちらも合わせてみてください。
起動時にnode7以上だとオプションで --harmony-async-awaitが必要でした。こらはnode7.6以上だと要らないのかな、asyncが正式にサポートされていそう。

```
HanedaKentarou-no-MacBook-Pro.local X_X  ~/Documents/workspace/web/skyway_multi (master)
% node  --harmony-async-await index.js                                                            [21:07:22]
Launcher setup
run setup
Title of page: HOME | CYOKODOG
```
【Android】AndroidのJavaコードをKotlinに変換する

JavaでコーディングされたAndroidアプリのコードをKotlinのコードに変換し、
アプリに起動するまでについて


■動画でまとめてみましたので、ご覧ください
https://www.youtube.com/watch?v=ZLxHyrmqs1c
[![IMAGE ALT TEXT HERE](https://qiita-image-store.s3.amazonaws.com/0/192949/a9ae6954-fedc-c3f0-b472-6ab56a9ab7ea.png)](https://www.youtube.com/watch?v=ZLxHyrmqs1c)


■動画でも紹介している手順を紹介します

手順 1．KotlinプラグインをAndroidStudioにインストールする
　1-1．AndroidStudioの設定から[Plugins]→[Install JetBrains plugin]を選択
　1-2．Kotlinを選択してインストール
　1-3．AndroidStudioを再起動
![kotlinプラグインインストール.PNG](https://qiita-image-store.s3.amazonaws.com/0/192949/a9ae6954-fedc-c3f0-b472-6ab56a9ab7ea.png)


手順 2．JavaのコードをKotlinに変換する
　2-1. [Code]→[Convert Java File to Kotlin File]を選択
![kotlin変換.PNG](https://qiita-image-store.s3.amazonaws.com/0/192949/37e7b6a4-3028-3554-ae6f-16a48d2cc7dc.png)
　2-2. Kotlinのコードに変換されたことをかくにんした後、gradleBuildファイルに必要なコードを記述するためにConfigureをクリックする
![kotlinConfigure.PNG](https://qiita-image-store.s3.amazonaws.com/0/192949/dce66d5e-896c-6b6e-e4cb-bdbf96373136.png)

手順3.アプリを起動する
![kotlin起動完了.PNG](https://qiita-image-store.s3.amazonaws.com/0/192949/b62c0f91-8432-20af-f392-142c7d42f89c.png)

■実行環境
・Android Studio 2.3.3
・PC Mac
・スマホキャプチャソフト Vysor　

■投稿者ページ
HP:http://nana-h.hatenablog.com/

■紹介動画
https://www.youtube.com/watch?v=ZLxHyrmqs1c
djangoでGentelellaを使う


**作成中**

おしゃれなダッシュボード作成に向けた試行の記録。
フロントエンド用パッケージ管理ツールのbower経由でGentelellaをインストールする。OSはwindows 10 home edition。

## bowerのインストール
bowerをインストールするため、先に下記のサイトから対応するnode.jsをダウンロードしてインストールする。 
> install node.js
> <https://nodejs.org/ja/download/>  

node.jsを使ってbowerをインストール
```npm install bower -g```  

bowerを初期化
```bower init```  

## Gentelellaのインストール
作業ディレクトリに移動
```cd project/path```
vue-routerでパラメータ付きルートを設定する方法 in Laravel

###■ルートの定義

JSファイルでvueやvue-routerのimport等色々やる

```javascript
// resources/assets/js/app.js

// vueとvue-routerのインポート
import Vue from 'vue'
import VueRouter from 'vue-router'

// VueRouterを使いますという宣言
Vue.use(VueRouter);

// vue-routerのインスタンス生成 ここでパスを設定する
const router = new VueRouter({
	mode: 'history',
    routes: [
    	// パラメータ付きの場合はコロンを使ってパラメータを表現する
        { path: '/articles/:id', component: require('./components/Articles/Show.vue') },
    ]
});
```
###■Componentでパラメータを使う

コンポーネント側では```this.$route.params```でパラメータを受け取れる。
今回パラメータはidのみなので```this.$route.params.id```で取得可能。

```html

//Show.vue
<template>
	<div>
	    <div>
	    	<h2>{{article.title}}</h2>
	        <p>
	            {{ article.content }}
	        </p>
	    </div>
    </div>
</template>

<script>
    export default {
    	// メソッドの実行
        created() {
            this.getArticle()
        },
        // メソッド&テンプレート内で使う変数を定義
        data() {
            return {
                article: ''
            }
        },
        // (読み込み時に)実行するメソッド
        methods: {
            getArticle() {
            	// this.$route.params.idをaxiosで非同期接続するパスのパラメータに設定している
                axios.get('/api/article/' + this.$route.params.id).then(res =>  {
                    this.article = res.data
                });
            }
        }
    }
</script>

```

こちらのリファンレスを参照しました。
https://router.vuejs.org/ja/essentials/dynamic-matching.html

以上。
RESTとは何か

Web API や Webアプリについての話で、REST(RESTful, REST API)という言葉をよく聞きます。今までぼんやりとしか理解していなかったのですが、APIを作ることになったので詳しく調べてみました。

## RESTとは
RESTは REpresentational State Transfer の略で、RESTはデザインのルールの事を指していて、RESTfulなサービスとは以下の６つのルールに則ったデザインの事を言います。

* **クライアントとサーバーの区別** ： サービスを提供するサーバーと、それを消費するクライアントという区別があること
* **Statelessである** ： クライアントからの１つのリクエストは、そのリクエストを実行するための必要な情報をすべて含んでいなければならない。つまり、サーバーはクライアントのセッション情報を保持しない。クライアントの状態をサーバで管理しないということ
* **Cacheable** ： サーバー側はクライアントに、リクエストがキャッシュされるかどうかを示さなければならない。
* **階層システム** ： クライアントとサーバーの通信を標準化し、２つの仲介者が代わりにレスポンスを返せるようにする。例えば、proxyサーバーは、通信が標準化されてるからこそできる。クライアント側はエンドサーバーがレスポンスを返すかproxyサーバーが返すかの区別がつかない（これはシステムがいつも同じに見えていいこと）。
* **統一されたインターフェイス** ： URIによって指し示されるリソースを、HTTPのGETやPOSTなどのメソッドを指定するという統一されたインターフェイス。
* **コードオンデマンド** ： ６つのうち唯一オプショナルなルール。サーバーは、文脈に合わせて実行ファイルやスクリプトをクライアントに提供することができる

## RESTfulなサービス
このようなルールは、元々wwwが使用するプロトコルであるHTTPプロトコルにフィットするようにデザインされました。
RESTfulなサービスで大事なことは、リソースという概念です。URIによって識別される"リソース"に対して、GET/POST/PUT/DELETE のメソッドを用いて働きかけます。GETでリソースについての情報を得る、POSTで新しいリソースを作る、PUTでリソースを更新し、DELETEでリソースを消去する、などのようにです。

RESTはデータ・フォーマットの指定を特にしていませんが、最近はJSONが主流ですね。

## 参考
* [What is REST .com](http://whatisrest.com/rest_constraints/index)
* [Designing a RESTful API with Python and Flask](https://blog.miguelgrinberg.com/post/designing-a-restful-api-with-python-and-flask)
* [REST について調べたまとめ](http://d.hatena.ne.jp/LukeSilvia/20091025/p1)
[クイズ]javascriptと仲良くなるための一歩　第３３話「スコープ」

#問題

##第1問

```js
var x = 1;
function f(){
  console.log("[a]" + x);
}
f(); //=> [a]?
```

##第2問

```js
var x = 1;
function f(){
  console.log("[a]" + x);
  var x = 2;
  console.log("[b]" + x);
}
f(); //=> [a]?
     //   [b]?
```


:mouse:
:cow:
:tiger:
:rabbit:
:dragon_face:
:snake:
:horse:
:sheep:
:monkey_face:
:bird:
:dog:
:boar:
:mouse:
:cow:
:tiger:
:rabbit:
:dragon_face:
:snake:
:horse:
:sheep:
:monkey_face:
:bird:
:dog:
:boar:

#答え

##第1問

```js
var x = 1;
function f(){
  console.log("[a]" + x);
}
f(); //=> [a]1
```

##第２問

```js
var x = 1;
function f(){
  console.log("[a]" + x);
  var x = 2;
  console.log("[b]" + x);
}
f(); //=> [a]undefined
     //   [b]2
```
クラスと型の関係

swift3.0を使って初めてプログラミングを勉強しているが、プログラミングの方法を勉強するのより、プログラミングで使われている概念を理解するのが難しいと感じる。


今日はクラスと型がごちゃごちゃになってきた。初めは全然違うものというふうに理解できていたが、だんだんごちゃごちゃになってきた。



#型では

let message = ""

でmessageはstring型であることが宣言できる

let message:String 
でも大丈夫


let message =String()でも宣言できるようだ。


#クラスでは(クラスからインスタンス作る)

var senshi = Ninngenn()
でNinngennクラスからインスタンスを作成し、senshiに代入



これがそもそもなんか似てる。




それ以外にもなんかごっちゃになってくるのが
Timerを使うとき
var timer:Timer?と書いてTimerのインスタンスを作っている
このTimerはクラスなのか型なのか

上で書いたようなルールに沿って判定するとTimerは型だ　謎である。



なんか概念が理解できてないからわからない疑問のような気がする。
そもそも型やクラスってなんだったっけ？

クラスという考え方が出てきたのがオブジェクト指向ってのが出てきてかららしい。
オブジェクト指向の概念がわかっていないからなんかよくわからないのか？



ここまできて、色々本を漁っていると
「コーディングを支える技術　成り立ちから学ぶプログラミング作法」って本にそれらしいことが書いてありそう


p.189に「クラスとは」という部分がある。

クラスとはいろんな言語で異なる意味に使われるが、
少なくともC++では<b>「「クラスはユーザが定義できる型のこと」」</b>とのこと


クラスと型は同じか？







さらに調べたこと

Intをcommand+クリックで調べてみた

```
public struct Int : SignedInteger, Comparable, Equatable {

    /// Create an instance initialized to zero.
    public init()

    /// Creates an integer from its big-endian representation, changing the
    /// byte order if necessary.
    public init(bigEndian value: Int)
```
と書いてあった


struct とは構造体のこと
Intは構造体の一つということ

構造体とは

Swiftの構造体はクラスと同じような機能を持つため、書式もほとんど同じです。ただ、クラスと
違って継承はできません。

「詳細！Swift3 iPhoneアプリ開発入門ノート」より


やはりクラスと型は同じなのか
TensorFlow + Kerasでフレンズ識別する - その4: 顔周辺の切り出し編

判定の精度を向上させるため、入力された画像から顔の位置を検出し、その周辺のみの情報を使って判定を行うようにする。

## OpenCVとGoogle Cloud Vision API
顔を検出する方法は色々考えられるが、今回は実装の簡単さからOpenCVかGoogle Cloud Vision APIを使うことを検討した。

|Library/API |検出成功数(枚) |誤検知数(個) |
|------------|-------------|-----------|
|Cloud Vision API|53 / 71|0|
|OpenCV(default)|36 / 71|85|
|OpenCV(alt)|24 / 71|2|

手元にあったテスト用のコスプレ画像71枚を使って、検出精度を比較してみたところ、Google Cloud Vision APIが圧倒的に精度が良かったので、今回はGoogle Cloud Vision APIを使うことにした。

## Google Cloud Vision APIを使った顔検出

Google Cloud Platformのアカウント設定と認証情報の設定については省略。

```
from google.cloud import vision
from google.cloud.vision import types

def detect_faces(image_path):
    client = vision.ImageAnnotatorClient()
    with open(image_path, 'rb') as file:
        image = types.Image(content=file.read())
        annotations = client.face_detection(image=image).face_annotations

    face_boxes = []
    for annotation in annotations:
        x_s = [vertex.x for vertex in annotation.bounding_poly.vertices]
        y_s = [vertex.y for vertex in annotation.bounding_poly.vertices]
        face_boxes.append((min(x_s), min(y_s), max(x_s), max(y_s)))
    return face_boxes
```

Google Cloud Vision APIは、普通にHTTPリクエストを発行して利用することもできるが、pipでインストールできるクライアントライブラリを使うと非常にシンプルに実装できる。

https://cloud.google.com/vision/docs/reference/libraries#client-libraries-install-python

`ImageAnnotatorClient`の`face_detection`を呼び出すと、与えた画像から検出された顔のリストを取得できる。リストに含まれる各アノテーションには、`bounding_poly`というプロパティがあり、ここに検出された顔の座標が含まれている。名前の通り、ポリゴン(多角形)として表現されているのだが、ここではポリゴンの全頂点のx, yそれぞれの最小値と最大値を求めて、そこからそのポリゴンを含む矩形に変換している。次のステップで画像分類をさせる際に入力させる画像は矩形である必要があるからだ。

## 顔の周辺(マージンつき)を切り出す

```
from PIL import Image
...

max_margin = 0.2

faces = detect_faces(image_path)
if len(faces) > 0:
    image = Image.open(image_path).convert("RGB")

    x1, y1, x2, y2 = faces[0]
    w = x2 - x1
    h = y2 - y1

    spaces_x = min(x1, image.width - x2, int(float(w) * max_margin))
    spaces_y = min(y1, image.height - y2, int(float(h) * max_margin))
    margin = min(spaces_x, spaces_y)

    img2 = image.crop((
        x1 - margin,
        y1 - margin,
        x2 + margin,
        y2 + margin
    ))
```

単純に検出された顔の座標で切り取ってしまうと、コスプレの特徴である髪型や衣装がほとんど含まれず、判定の精度が下がってしまうため、検出された範囲よりも20%ほど広めにクロップを行う。

処理とUI/UXの簡略化のため、顔が複数検出された場合でも、APIが返した最初の顔のみを利用するようにしている。

## 切り出した顔周辺の画像を使って分類をする

```
image = img2.resize((image_size, image_size), Image.ANTIALIAS)
image = np.asarray(image, dtype=np.float32).reshape(image_size, image_size, 3)
image /= 255.0

result = model.predict(np.array([image]), 1)[0]
for i, score in enumerate(result):
    print("Category-%d: %.2f"%(i, score))
```

あとは、[前回](http://qiita.com/croquette0212/items/1f52913cc861ae8cebad)同様の方法で、学習済みモデルを使って分類を行う。

## Webサービス化へ
ここまでで、とりあえず入力した画像についてそこそこの精度でフレンズ判定をできるようなプログラムのベースができたので、次はFlaskを使ってWebサービス化をしてみる。
SmartHRで従業員情報をAPIから取得する

# 人事労務系システムの課題
皆さん、人事労務系のシステムは何をお使いですか？
この辺の部分はシステム化するのにはなかなか厄介な部分だと思います。
勤怠系、労務系のシステムが厄介な理由を下記にあげてみます。
ざっと考えただけでも下のようなものが考えられます。

* 確定申告（源泉徴収）の書類提出時は紙出力でなければならない
* 給与明細が人単位で異なるし、昇給した場合などの対応が必要
* 勤怠管理が自己申告
* 結婚などで名字が変わる場合
* 引っ越しなどで従業員の住所が変わる場合

今回はSmartHRという人事労務サービスを検証しようと思います。
このサービス、人事・労務系システムでWebhookやAPIを提供しているのはなかなか興味深かったので
どんなことができるのか試してみようと思いました。
今回は別システムと連動することを考慮して従業員情報をAPIから取得することを試してみます。

気になる料金の方は次のようになっているようです。
下の料金表は年額で一括払いの場合です。
一括払いだと２ヶ月分得のようです。
50人を超えた場合は500円/人らしいです。

![スクリーンショット 2017-08-19 16.42.23.png](https://qiita-image-store.s3.amazonaws.com/0/55077/e37b8765-ba6b-2382-fc52-1890f285d0fd.png)

１５日お試しプランで無料で検証してみます。

管理画面は次のようになっています。

![スクリーンショット 2017-08-19 17.17.11.png](https://qiita-image-store.s3.amazonaws.com/0/55077/045877a0-a562-3e09-dd3e-15c59ecdde09.png)

最低限必須そうなものは揃ってそうです。

* 従業員の登録
* 源泉徴収・年末調整・給与明細
* 従業員のマイナンバーの登録
* 入社・退社手続き
* 扶養控除の手続き
* 従業員の住所・氏名変更
* 勤怠管理表のテンプレ

# WebHookでのSlack連携
また、手続きした情報をSlack通知することもできるようです。
（個人情報なのでSlackチャンネルの取扱は厳重に・・・）
手続き履歴が残せる＆Slackに一元管理できるので労務管理者の負担が減りそうです。
設定方法は下記参考
[SmartHR が「Slack」「チャットワーク」「HipChat」の連携に対応しました](https://smarthr.jp/update/4210)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/55077/ed409b2a-8b1a-326a-be91-fe460bfae4ed.png)

#従業員情報をAPIから取得してみる 
まず、新規の従業員を登録してみます。
「従業員管理」→「新規登録する（手入力）」で適当な社員情報を作成します。
![スクリーンショット 2017-08-19 18.28.43.png](https://qiita-image-store.s3.amazonaws.com/0/55077/11ec5f24-6465-cbd4-7561-57a26a60318a.png)


APIの利用にはアクセストークンを払い出す必要があります。
管理画面右上の「共通設定」を押します。
![スクリーンショット 2017-08-19 18.05.56.png](https://qiita-image-store.s3.amazonaws.com/0/55077/5eae03d2-df3d-59ea-0ba0-c7adf1b8ebf5.png)

「アプリケーション連携」→「アクセストークン」でアクセストークンを払い出します。
アクセストークンは一度しか表示されないので厳重に管理してください
![スクリーンショット 2017-08-19 18.05.36.png](https://qiita-image-store.s3.amazonaws.com/0/55077/06579abe-70cc-e3b4-aca4-c5f649808971.png)

SmartHRのAPIドキュメントにアクセス
[SmartHR API Specification](https://developer.smarthr.jp/api/index.html)

APIリクエストは次のようなフォーマットになっているようです。

```
curl https://(TENANT_ID).smarthr.jp/?access_token=(ACCESS_TOKEN)
```

* TENANT_IDは管理画面アクセス時のURL先頭に付随しているIDです。
* ACCESS_TOKENは先程払い出したアクセストークンです。

社員番号を取得するには次のようなAPIをリクエストします。

```
https://(TENANT_ID).smarthr.jp/api/v1/crews/(社員番号)/?access_token=(ACCESS_TOKEN)
```

![スクリーンショット 2017-08-19 18.23.21.png](https://qiita-image-store.s3.amazonaws.com/0/55077/ce9fc88b-ab43-9460-836b-d01a55017b0e.png)

取れました

# 所感
個人的に惜しいと思ったのは勤怠管理登録APIがなかったので
それがあればIoTで勤怠管理できるのになぁと思いました。
[GIt] GitとGitHub×GitHub Desktopを用いたバージョン管理：リポジトリの作成

GitとGitHubを用いたバージョン管理の方法まとめ。
リポジトリの作成について。


## 事前準備
1. バージョン管理用のGitHubの[アカウント作成](https://github.com/)
2. GitHub Desktopを[ダウンロード](https://desktop.github.com/)



## リモートリポジトリの作成
GitHub上にリモートリポジトリを作成する。

### [GitHub] 作業手順
1. アカウントログイン後、右上の緑色のボタン "New New repository" をクリック
2. "Repository name" に任意のリポジトリ名を入力
3. "Create repository" ボタンをクリック



## ローカルリポジトリの作成
GitHubで作成したリポジトリを作業者のローカル環境にcloneする。

### [GitHub Desttop] 作業手順
1. GitHub DesktopでClone画面を表示する（左上の+ボタンをクリック）
2. "Clone"タブを選択
3. cloneするリポジトリを選択
4. "Clone リポジトリ名"ボタンをクリック
5. ローカルリポジトリを作成したいディレクトリを選択
6. "Clone"ボタンをクリック

### コマンドでcloneして、後からGitHub Desttopに紐付ける場合の作業手順
※最初からGitHub Desktopで作業している場合は必要なし

#### GitHub管理画面
1. "Your repositories"（アカウント画面右カラム） から先程作成したリポジトリを探してクリック
2. clone URL をコピー

#### ターミナル
1. ターミナルでローカルリポジトリを作成したいディレクトリに、カレントディレクトリを変更
2. ディレクトリがきちんと移動していることを確認し、 git clone を実行

```bash:ターミナル
cd {任意のディレクトリ}
pwd # ディレクトリを確認
git clone {clone URL}
```

#### GitHub Desktop
1. GitHub DesktopでClone画面を表示する（左上の+ボタンをクリック）
2. "Add"タブを選択
3. cloneしたディレクトリを選択
4. "Create & Add Repository"ボタンをクリック
http://localhostが勝手にhttps://localhostにリダイレクトされて困っている時の対処法


これ、非常に困ってたんですが、結論から言うと

1. キャッシュを削除
2. HSTS.plistを削除
3. 履歴を削除

の３つで解決しました。
（もしかしたらどれかは不要かもです。）

###1. キャッシュを削除
Safariのメニューの「開発」から「キャッシュを空にする」を選択してキャッシュを削除します。
「開発」タブがでない人はSafariの「環境設定」 -> 「詳細」で開発タブを見せるように設定しましょう。

##2. HSTS.plistを削除
`~/Library/Cookies/HSTS.plist`を削除。

##3. 履歴を削除
`https://localhost`にアクセスしたSafariの履歴を全て削除しました。


以上の３手順で解決しました。よかった。
/proc の environ を見やすくする

Linux であるプロセスに「どんな環境変数が設定されてるのかな？」とか「ちゃんと設定した環境変数が反映されてるかな？」という場合に `/proc/{PID}/environ` を確認することがあります。
が、このファイル、null (`\0`) （less で見ると `^@` になります）区切りの `NAME=VALUE` となっており、grep は `--text` をつけないと Binary ファイルだからとマッチしたかどうかしか表示されない、`--text` をつけても結局1行なので全部が表示されるだけなので `--color` をつけてマッチした箇所に色をつけたりしてました。もっと良い方法があるだろうと思いつつも頻繁に実行するわけでもないのでまあいいやって。

ある時ふと sed で `'s/\x00/\n/g'` したらあっさり改行区切りにできました。

```bash
sed 's/\x00/\n/g' /proc/$$/environ
```

以上、小ネタでした。
ESLint v4.5.0

前 [v4.4.0] | 次 [v4.6.0]

<blockquote class="twitter-tweet" data-lang="ja"><p lang="en" dir="ltr">ESLint v4.5.0 has been released: <a href="https://t.co/7ID8OEXWG8">https://t.co/7ID8OEXWG8</a></p>&mdash; ESLint (@geteslint) <a href="https://twitter.com/geteslint/status/898737713817321472">2017年8月19日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

ESLint 4.5.0 がリリースされました。
小さな機能追加とバグ修正が行われています。

質問やバグ報告等ありましたら、お気軽にこちらまでお寄せください。

> 🏢 [日本語 Issue 管理リポジトリ](https://github.com/eslint/eslint-jp)
> 👫 [日本語サポート チャット](https://gitter.im/eslint/eslint-jp)
> 🏢 [本家リポジトリ](https://github.com/eslint/eslint)
> 👫 [本家サポート チャット](https://gitter.im/eslint/eslint)

# 🚀 本体への機能追加

今回はありません。

# 🔧 オプションが追加されたルール

## [#9105]: [indent] `ignoreNodes`

特定のASTノードを無視するためのオプションが追加されました。

```js
/* eslint indent: [error, 4, { ignoredNodes: ["ConditionalExpression"] }] */

//✔ GOOD
var a = foo
      ? bar
      : baz;

var a = foo
                ? bar
: baz;
```

# ✒️ `eslint --fix` をサポートしたルール

今回はありません。

----

[v4.4.0]: http://qiita.com/mysticatea/items/923ed52b83b41b0b07f2
[v4.6.0]: http://qiita.com/mysticatea/items/fa2f38f3ce8b5ea9e56f
[#9105]: https://github.com/eslint/eslint/issues/9105
[#9999]: https://github.com/eslint/eslint/issues/9999
[indent]: http://eslint.org/docs/rules/indent
[xxxx]: http://eslint.org/docs/rules/xxxx


<!-- 
![JSCS Icon](http://jscs.info/favicon.ico) JSCS 互換ルールです。
-->
Jenkinsで容量が圧迫されるときの対処法

# Jenkinsで容量が圧迫されるときの対処法
- Jenkinsにはビルド履歴が保存しているため、デフォルト設定だとドライブが圧迫される場合などがあります。
- 圧迫した際の簡単な対処方法を記載します。

## 対処方法概要
1. ジョブのワークスペース 及び ビルド履歴の保存場所の変更
2. ビルド履歴削除のプラグイン

### 1.ジョブのワークスペース 及び ビルド履歴の保存場所の変更
[Jenkinsの管理]⇒[システムの設定]⇒[高度な設定]⇒[ビルド・ルートディレクトリ]
![01-min.png](https://qiita-image-store.s3.amazonaws.com/0/162829/000e5984-d1ce-4dd3-d92f-fa225e457d97.png)

- 変更前
![02_default-min.png](https://qiita-image-store.s3.amazonaws.com/0/162829/8745cfdc-b8af-8bcd-8420-81614535c458.png)

- 変更後
![03_default.png](https://qiita-image-store.s3.amazonaws.com/0/162829/add304f0-d6da-03ea-b934-1e1dbc08b654.png)


### 2.ビルド履歴削除のプラグイン
#### プラグイン名
- Discard Old Build plugin

#### 設定方法
1. [古いビルドの破棄]を選択
2. [ビルドの保存日数] または [ビルドの保存最大数] に任意の設定を実施する
![04_default-min.png](https://qiita-image-store.s3.amazonaws.com/0/162829/e4c88b64-4cf9-d534-d490-90f3425843ab.png)
Django で makemigrations したら無限に migration ファイルが作られる問題の解決方法

Django のプロジェクトで

```
class Task(models.Model):
    remind_task = models.OneToOneField('RemindTask', blank=True, null=True)
    …


class RemindTask(models.Model):
    …
```
という感じで適当にRelationを持ったモデルがあって、 `RemindTask` は以前から作ってあって、今回 `Task` モデルに新しく `remind_task` のフィールドを追加するという状況。
ここで、

```
$ python manage.py makemigrations
```

をすると

```
$ python manage.py makemigrations
Migrations for 'your_app':
  your_app/migrations/0003_auto_20170819_1648.py
    - Alter field remind_task on task
```

となって、特に問題なし。
この後にさらにmakemigrationをすると

```
$ python manage.py makemigrations
Migrations for 'your_app':
  your_app/migrations/0004_auto_20170819_1649.py
    - Alter field remind_task on task
```

あれ、また同じファイルが作られる…
もう一回やると

```
$ python manage.py makemigrations
Migrations for 'your_app':
  your_app/migrations/0005_auto_20170819_1650.py
    - Alter field remind_task on task
```

あれ、、まただ。。。
何度やっても同じmigrationファイルが永遠に作られ続ける…

どうなってるんだーって何日も考えていたんだけど、ようやく答えがわかった。。

以前に `RemindTask` モデルを作ったときに

```
class remindtask(models.Model):
    …
```

と名前を間違えてしまい、この状態で `makemigrations` したようで、このモデルの migration ファイルが

```
migrations.CreateModel(
    name='remindtask',
    …
```

となっていた…
(その後にmodels.pyの名前を `RemindTask` に変えた模様)

このままでもDBには正しくテーブルが作られて、アプリケーションも問題なく動いていたので気づかなかった。。

```
migrations.CreateModel(
    name='RemindTask',
    …
```

と書き直したら

```
$ python manage.py makemigrations
No changes detected
```

になりました。

https://github.com/django/django/tree/master/django/db/migrations 
Djangoのバグかなーと思ってこのあたり読んでましたが、関係なかったですね…
Wordpress meta_query でカスタムフィールドの値が無い投稿を取得するときにハマったこと

## 問題

`WP_Query` 
を使って カスタムフィールドの値がゼロ または **値が設定されていない** 投稿を取得したかったけど、何度 `meta_query` を見直しても取得できなかった

### 動かなかった $args

```php
$args = [
    'post_type' => 'custom_post_type',
    'post_status' => 'publish',
    'meta_query' => [
        'relation' => 'AND',
        [
            'key' => 'custom_field_1',
            'value' => 'A',
        ],
        [
            'relation' => 'OR',
            [
                'key' => 'custom_field_target',
                'value' => '0',
            ],
            [
                'key' => 'custom_field_target',
                'compare' => 'NOT EXISTS',
            ],
        ]
    ],
    'orderby' => 'meta_value',
    'meta_key' => 'custom_field_target',
    'order' => 'ASC',
    'posts_per_page' => -1,
];
```

これの何がいけないかわかります…？

## 解決

```php
    'orderby' => 'meta_value',
    'meta_key' => 'custom_field_target',
```

これが悪さをしていました。実装上、不要な orderby なので削除したら動くように。

## 原因

生成されたクエリを読んでいると、 `'orderby' => 'meta_value'` が指定されていると、

```sql
SELECT 
  wp_posts.* 
FROM 
  wp_posts 
  /* ↓ meta_value で orderby するための JOIN */
  LEFT JOIN wp_postmeta ON (
    wp_posts.ID = wp_postmeta.post_id
  ) 
  /* ↓ meta_query のための JOIN */
  LEFT JOIN wp_postmeta AS mt1 ON (wp_posts.ID = mt1.post_id) 
/*...中略...*/
WHERE 
  1 = 1 
  AND (
    wp_postmeta.meta_key = 'custom_field_target' /* ！！ */ 
    AND (
        /* ここに meta_query で指定した条件 */
    )
 )
/*...略...*/
```

…というクエリになるので、`NOT EXISTS`を使っても無意味になる、と。
license is deprecated!（homebrew-cask の警告）

こんにちは。
homebrew-cask（の formula）では license stanza は deprecated だそうです。license stanza 付きの formula がシステム内にインストールされていると警告が出るようです。

```console
$ brew cask list
Warning: Calling Hbc::DSL#license is deprecated!
There is no replacement.
/usr/local/Homebrew/Library/Homebrew/cask/lib/hbc/cask_loader.rb:19:in `block in load'
 :
```

対処には、最新の formula が対処済みになっていることを確かめた後、内部に残存する古い formula も一掃するために、reinstall すると良いと書いてありました（下記は qlmarkdown の例）。

```console
$ brew cask cat qlmarkdown | grep -e '^[^#]*license '
$ brew cask reinstall qlmarkdown
```


- 参考 (https://github.com/caskroom/homebrew-cask/issues) ：
 - "[Deprecate `license`](https://github.com/caskroom/homebrew-cask/issues/17437)" #17437
 - "[Can't `brew cask list`](https://github.com/caskroom/homebrew-cask/issues/37267)" #37267


なお内部に残存する古い license stanza 付きの formula の存在を調べるには、下記のようにすれば良いようです。

```console
$ find $(brew --prefix)/Caskroom -name "*.rb" | xargs grep -l -e '^[^#]*license ' | awk -F '/' '{print $NF}' | sort | uniq
qlimagesize.rb
qlmarkdown.rb
$ find $(brew --prefix)/Caskroom -name "*.rb" | xargs grep -e '^[^#]*license '
/usr/local/Caskroom/qlimagesize/.metadata/latest/20150119125325.768/Casks/qlimagesize.rb:  license :oss
/usr/local/Caskroom/qlmarkdown/.metadata/1.3.5/20151221120913.754/Casks/qlmarkdown.rb:  license :bsd
/usr/local/Caskroom/qlmarkdown/.metadata/1.3.5/20160718025719.538/Casks/qlmarkdown.rb:  license :bsd
```
aws-sdk for Rubyを使ってCloudFrontのinvalidationをリクエストする

S3にjsonをあげて、取得するときはCloudFront経由にする構成を作っています。
jsonを更新/削除する際にCloudFrontのキャッシュを削除したかったのですが、余り記事が引っかからなかったので備忘までにメモしておきます。

## 前提
* Ruby 2.3.0
* aws-sdk 2.10.22

※　sdkのversionが1の場合は、Clientのクラスやapiのパラメータが異なりますので、[こちら](http://docs.aws.amazon.com/AWSRubySDK/latest/AWS/CloudFront.html)をご覧ください。


## コード
Railsアプリケーションで削除するclassを作ったので、そのまま貼ります。

```ruby:lib/clients/cloud_front.rb
module Clients
class CloudFront
  include Singleton

  @@instance = Aws::CloudFront::Client.new(
    region: ENV['AWS_DEFAULT_REGION'],
    access_key_id: ENV['AWS_ACCESS_KEY_ID'],
    secret_access_key: ENV['AWS_SECRET_ACCESS_KEY']
  )

  # CloudFrontのInvalidationを作成する
  # @see http://docs.aws.amazon.com/sdkforruby/api/Aws/CloudFront/Client.html#create_invalidation-instance_method
  #
  # @param [Array[String]] paths キャッシュオブジェクトのパスの配列
  # @return [String] 結果のメッセージ
  def self.create_invalidation(paths=[])
    # 非同期のAPIをcall
    ret = @@instance.create_invalidation({
      distribution_id: ENV['AWS_CLOUD_FRONT_DISTRIBUTION_ID'],
      invalidation_batch: {
        paths: {
          quantity: paths.size,
          items: paths
        },
        # api callを同定するためのユニークな文字列
        # @see http://docs.aws.amazon.com/cloudfront/latest/APIReference/API_CreateInvalidation.html#API_CreateInvalidation_RequestSyntax
        caller_reference: Time.now.to_s
      }
    })

    # invalidationの作成に成功したときは、
    # レスポンスのinvalidation.statusにInProgressが入る
    if ret.blank? or ret.invalidation.blank? or ret.invalidation.status != 'InProgress'
      Rails.logger.warn "Fail to delete cache of #{paths.join(', ')}"
      Rails.logger.warn "Response from CloudFront: #{ret.inspect}"
      return 'キャッシュの削除に失敗しました。'
    end

    'キャッシュの削除を開始しました。しばらく待って確認してください。'
  end

end
end
```

## 補足1: メソッドのレスポンスについて
invalidationのcallは元々非同期ですし、削除に失敗したからと言ってアプリケーションを止めたくなかったので、私の場合はメッセージを返してコントローラーでflashに入れるようにしています。場合によっては例外出してもいいかもしれません。

## 補足2: メソッドの引数について
引数経由で渡しているオブジェクトのpathですが、同じversionのS3クライアント（``Aws::S3::Resource``）やWeb consoleとは異なり、冒頭の'/'が必須になるのでご注意ください。

* NG
  * v1/hoge.json
* OK
  * /v1/hoge.json
CreatorsUpdateが失敗する

**ドメインに参加しているPC** が
CreatorsUpdateが「権限がないのでダメです」のエラーコードで
出来ない時にやってみて出来た話

#セキュリティソフトが邪魔している？
たまにセキュリティソフトとの相性が悪く、動かないこともあるので
一旦セキュリティソフトを止めてCreatorsUpdateをやってみる

#それでもダメな場合
自分がダメだった
##ドメインから抜ける
ローカルに全ての権限を持つアカウントがいるかどうか、
ログインできるかどうか確認してから
ドメインから抜ける(ワークグループに)
ワークグループの名前はなんでも良い。迷った場合は「WORKGROUP」
抜けたら再起動、ローカルにいるアカウント(administratorの権限持ってるやつ)で入る
**ローカルでCreatorsUpdateを実行する。**

#自分はこれでできた
ローカルからもう一度ドメインに入ることを忘れずに。
当たったかどうかは設定→ディスプレイ→夜間モードがあるかどうかで判別してます。
全体的に **管理者権限で実行** し、
ドメインに入るとかは人事権(アカウント操作をする権利)を持つアカウントで操作すること。

#とはいえ
とはいえ、まれにいろんな問題が起こるらしく.....。
SSID変わったりとか、変わったりとか、変わったりとか、、、、。
めったにないけどね。
CreatorsUpdateは自己責任で！
How Appropriate Property Valuation can Help You

Real estate is one of the most complicated businesses, but it is also one of the best ways to get financial assistance when you really need it. So, if you are ready to use your property for getting equity out of it, then first you should go for property evaluation. Those who do not know its importance must understand that a poor valuation report can ruin the monetary value of their property. For instance, let's say that you have finalized the discounts and interest rates with the bank but all of a sudden you find that your property has got a poor evaluation. After that, your bank will offer you less equity on your property.
![thumb-1920-435117.jpg](https://qiita-image-store.s3.amazonaws.com/0/197989/5f9da97e-ede8-de0a-38c9-466bf9ed6f00.jpeg)
Getting less equity out of property means that you are going to make lesser money on next purchase. Hence, make sure that you get a good property valuation and before a valuer is coming to see your property do your homework so that you can engage the valuer and get good results. Along with the evaluation, a property appraisal is also very important. It starts with getting a good market value of your home and then the lender can schedule a time to inspect your property and give you an appraisal report accordingly.

A good appraisal report of property<b> (</b><a href="http://www.2he.com.br/"><b>laudo de avaliacao de imovel</b></a><b>)</b> can protect you and the lender that you are not overpaying for the property, and helps establish a good value of that property. There are hundreds of options available when it comes to choosing a right source to get property evaluation assistance but choosing the best can offer you multiple benefits and positive results.

2H Engineering is one such leading consultancy which has been offering accuracy and support in terms of property evaluation and appraisal reports for its valuable clients. They have a team of experienced engineers, real estate experts, and market researchers who work hard to assist you in the inspection and evaluation process. They not only serve you for the real estate requirements but can also help you with the most reliable equipment evaluation <b>(</b><a href="http://www.2he.com.br/avaliacaoempresasmaquinas.php"><b>avaliação de equipamentos</b></a><b>)</b> services at the best price.

<b>About 2H Engineering:</b>

2H Engineering is the leading name in the property valuation<b> (</b><a href="http://www.2he.com.br/avaliarimovel.php"><b>avaliação de imóveis</b></a><b>)</b> and appraisal services, which has been serving its clients for years and helping them getting the best deal on their property.

To know more, log on to <a href="http://www.2he.com.br/"><b>2he.com.br</b></a>.<br><br>
オフラインでのJenkinsのプラグインアップロード

# オフラインでのJenkinsのプラグインアップロード
※ ここに書いたのと別な方法として、JenkinsのPluginフォルダに hpi ファイルを置いてもアップロード出来るらしいです。

## 事前準備
- 事前に実施すべきこととして、アップロードしたいプラグインの依存関係確認と本体と依存関係のあるプラグインのダウンロードを実施しておく
- Jenkinsのプラグインは複数のプラグインで構成されているものもあり、その場合は依存関係のあるプラグインをすべてアップロードする必要があります。

### Pluginの依存関係確認
#### Jenkinsのページを開く
- 上部の[Plugins]を選択
![01_jenkins.png](https://qiita-image-store.s3.amazonaws.com/0/162829/0d31ca44-5984-189f-5e05-2cb9a82784cf.png)


#### Jenkinsのプラグインページ確認
- 検索したいプラグインを設定し、検索
![02_jenkins-plugin-min.png](https://qiita-image-store.s3.amazonaws.com/0/162829/22f8e257-90c5-13d7-8c2a-42d0069689b7.png)

- アップロードしたいプラグインを選択
![03_jenkins-subversion.png](https://qiita-image-store.s3.amazonaws.com/0/162829/313a2be2-ea68-8777-bf21-abab05d13cbf.png)

#### 依存関係を確認
- プラグインのページの[Dependencies]がプラグインの依存関係
- 事前に、この依存関係のあるプラグインをアップロードしたいJenkinsに入れておく必要があります。
- また、プラグインは入れ子になっている可能性もあるため、その場合は、すべての依存関係を確認します。
- [Dependencies]のリンクでプラグインページに飛ぶので依存関係がなくなるまで確認します。
![04_jenkins-dependencies.png](https://qiita-image-store.s3.amazonaws.com/0/162829/fccbdf64-b05c-d868-bc70-0372b740db10.png)


### Pluginのダウンロード
#### プラグインのページから[Archives]を選択
![05_jenkins-arck.png](https://qiita-image-store.s3.amazonaws.com/0/162829/187765ae-318f-e11a-78a3-0df08e220971.png)

#### 取得したいバージョンをダウンロード
- 新たにプラグインを適用する場合は、最新バージョンであれば問題ないとおもいます。
- 依存関係にあるバージョンは無視して最新バージョンをアップロードで問題ありませんでした。
- ![06_jenkins-arck.png](https://qiita-image-store.s3.amazonaws.com/0/162829/8d5fc374-fc63-acc9-2180-1918b50eebd6.png)


## Jekinsへプラグインのインストール
### Jenkinsを開く
- [Jenkinsの管理]を選択




### プラグインの管理
- [プラグインの管理]を選択
![02_プラグインの管理-min.png](https://qiita-image-store.s3.amazonaws.com/0/162829/24bf6a70-2955-231c-bc6e-1f0326058651.png)

### プラグインのアップロード
※プラグインをアップロードする場合は最下層の依存関係を持っているプラグインからアップロードします。
1. ダウンロードしたプラグインを[ファイル]に設定
2. [アップロード]ボタン押下
3. 成功すると、成功画面に遷移します。
![03_プラグインの選択-min.png](https://qiita-image-store.s3.amazonaws.com/0/162829/747495d1-74fd-02e9-6dfc-294dec1879bf.png)
ansibleでのyum updateがGPG key errorでコケたときの解消法

## 状況
vagrantで用意したcentos7環境に以下のようなansible playbookを流す。

```YAML
- name: yum update
  yum:
    name: '*'
    state: latest
```

するとこんなエラーが発生。

```
warning: /var/cache/yum/x86_64/7Server/puppetlabs-pc1/packages/puppet-agent-1.7.0-1.el7.x86_64.rpm: Header V4 RSA/SHA1 Signature, key ID ef8d349f: NOKEY
Retrieving key from file:///etc/pki/rpm-gpg/RPM-GPG-KEY-puppetlabs-PC1


The GPG keys listed for the "Puppet Labs PC1 Repository el 7 - x86_64" repository are already installed but they are not correct for this package.
Check that the correct key URLs are configured for this repository.


 Failing package is: puppet-agent-1.7.0-1.el7.x86_64
 GPG Keys are configured as: file:///etc/pki/rpm-gpg/RPM-GPG-KEY-puppetlabs-PC1
```

`"Puppet Labs PC1 Repository el 7 - x86_64"`は既に入ってるけどキーが違うよ的な？

## 解決方法

yumモジュールで問題のパッケージを先にinstallすればOKでした。
URLを直接指定することでインストールが可能です。

```YAML
---
# rpmのインストールを追加
- name: install rpm
  yum: 
    name: https://yum.puppetlabs.com/puppetlabs-release-pc1-el-7.noarch.rpm 
- name: yum update
  yum:
    name: '*'
    state: latest
```

## まとめ
yum updateからハマるとは。。。
ひとまずはansibleライフのはじまり！

## 参考

http://docs.ansible.com/ansible/latest/yum_module.html
http://qiita.com/dayflower/items/21c64a6f5da155a5ade3
http://qiita.com/teru855/items/cfe4b71bf1af14b9b05a
オレオレ証明書を使って開発してるんだけどhttpsを受け付けてくれない時


## 最初に
Webアプリを開発していてこう言うことはないでしょうか?

1. 自前のPCをサーバーと同じ環境にした。
2. ログインとかあるしssl使った
3. なぜか接続できない

あるいは、
1. 久しぶりにやったら、警告が出た
2. 証明書を作り直したけど治らない

これには、Google Chromeのセキュリティによる、ブロックがかかっています。

## 解除方法
1. https://~ でアクセス
2. 赤丸のところをクリック!!
![スクリーンショット 2017-08-19 15.50.37.png](https://qiita-image-store.s3.amazonaws.com/0/192654/353fb16f-6717-a46d-230a-14e8f800ae8e.png "スクリーンショット 2017-08-19 15.50.37.png")
3. 一番下の「〇〇にアクセスする」をクリック!!
![スクリーンショット 2017-08-19 15.56.42.png](https://qiita-image-store.s3.amazonaws.com/0/192654/c9aae184-d4e8-121a-f05f-4f6c1ef68b06.png "スクリーンショット 2017-08-19 15.56.42.png")
4. 表示される
Yumに慣れたRedHat系OS使いのためのAPT(パッケージマネージャ)コマンド入門(Debian, Ubuntu)

## 環境

下記の環境で確認しました。（/etc/os-releaseより抜粋）

```
NAME="Ubuntu"
VERSION="16.04.3 LTS (Xenial Xerus)"
```

## apt? apt-get? apt-cache? aptitude?

すべてRedHat系OSでいうところの`yum`にあたるものです。
歴史的な理由により複数ありますが、安心して最新の`apt`を使いましょう。


> apt は APT から提供されているもう一つのコマンドラインベースフロントエンドで、apt-get の持っていた設計上のミスを克服しています。
> https://debian-handbook.info/browse/ja-JP/stable/sect.apt-get.html

※aptコマンドが使えない（インストールされていない/できない）方はこの記事の対象外となります。ごめんなさい。

## dpkg

`apt`と`dpkg`の関係は、`yum`と`rpm`と同じようなものです。（普段使う分にはその認識で問題なし）

RedHat系OSにて、いつもは`yum`を使いつつ特定の用途で`rpm`を使うように、Debian系OSでは`apt`を使いつつ特定の用途で`dpkg`を使います。

## 対応表

挙動が全く同じわけではなく、同じ用途で使える、という意味での対応表です。

|内容|yum |apt|
|:-:|:-:|:-:|
|インストール|yum install package|apt install package|
|アンインストール|yum remove package|apt remove package|
|パッケージをアップデート|yum update package|apt install --only-upgrade package|
|すべてアップデート|yum update|apt update <br> apt upgrade|
|アップデート対象を調べる|yum check-update|apt update <br> apt --show-upgraded upgrade|
|パッケージ検索| yum search package|apt search package|
|パッケージの情報|yum info package|apt show package|
|インストール済みの一覧|rpm -qa|dpkg -l|
|ファイルが含まれるパッケージ|rpm -qf filename|dpkg -S filename|
|パッケージに含まれるファイル|rpm -ql package|dpkg -L package|
|ファイルを指定してインストール|rpm -i package|dpkg -i package|

※`--show-upgraded`は`-u`でもよい

## 補足：apt update(リポジトリの更新)について

Debian系のOSでは、パッケージの更新の前に`apt update`でリポジトリを最新の状態に更新するのが作法。

`yum clean all`や`yum makecache`と同等のコマンドだが、yumの場合は勝手に更新してくれている。(yum.confで設定可能)


## 最後に
対応表は、必要に応じて追加していきます。
JenkinsをWindowsにオフラインインストールする

# JenkinsをWindowsにインストール
- JenkinsのWindowsへのオフラインでのインストール方法
- ネットが使用できない環境にインストールする必要があったのでメモ

## Jenkinsのダウンロード

- Jenkinsのダウンロード方法


### Downloadへ移動
1. Jenkinsのページを開く(https://jenkins.io/)
2. [Download]ボタン
![01_ダウンロード.png](https://qiita-image-store.s3.amazonaws.com/0/162829/20af85f2-3e83-7e9f-4c53-d07ed7860644.png)


### 指定のOSを選択
![02_ダウンロード.png](https://qiita-image-store.s3.amazonaws.com/0/162829/ae9f8e97-32ef-fd74-8a3b-8bf7f37a5b4b.png)

## Jenkinsのインストール
- Jekinsをインストールする


### インストール開始
![01_install-start.png](https://qiita-image-store.s3.amazonaws.com/0/162829/dd399fef-d5e7-7466-ac42-e84ed886ab9f.png)

### インストール先の選択
![02_install-selectDir.png](https://qiita-image-store.s3.amazonaws.com/0/162829/2b1ca184-98a6-1e73-726b-167f4730b293.png)

### インストール実行
![03_install-exec.png](https://qiita-image-store.s3.amazonaws.com/0/162829/b685320a-701b-0c51-12bd-2618450763ab.png)

### インストール完了
![04_install-end.png](https://qiita-image-store.s3.amazonaws.com/0/162829/0eeeb5c5-0221-e515-148f-06b8e178804f.png)

## Jenkinsの初回設定
- Jenkinsの初回設定(http://localhost:8080)

### ロック解除
#### 管理者パスワードファイルの確認
![11_set-admin.png](https://qiita-image-store.s3.amazonaws.com/0/162829/8ce4902c-a0ca-9189-2571-bc38ccb939ab.png)


#### 管理者パスワードファイルを開く
![12_set-admin.png](https://qiita-image-store.s3.amazonaws.com/0/162829/aea413bf-c8e9-06af-e460-3a3d3bb55753.png)
![13_set-admin.png](https://qiita-image-store.s3.amazonaws.com/0/162829/17b4d44f-0391-5fc8-68e6-6263a099373c.png)


#### 管理者パスワードをJenkinsに設定
![14_set-admin.png](https://qiita-image-store.s3.amazonaws.com/0/162829/52320064-1b1e-f71a-1b71-16b13bff0565.png)


### Offlineインストール設定
- Jenkinsにインストールするプラグインの選択

#### Offlineインストール時の設定を指定
- プロキシ設定が不要な場合はスキップ
![14_set-plugin.png](https://qiita-image-store.s3.amazonaws.com/0/162829/c600c928-467b-18d9-441a-52d6c924943b.png)

### ユーザー作成
- 初回ユーザーを作成する

#### ユーザー作成
![15_set-user-min.png](https://qiita-image-store.s3.amazonaws.com/0/162829/cf217d4f-4965-5324-6b38-d1489633f971.png)

※Jenkinsへの繁栄に時間がかかる時があり↓のエラー画面になることがあります。
  しばらく待つか、[Retry]ボタンを押して、何度かユーザー作成をやりなおすと、OKになります。
![15_set-error-min.png](https://qiita-image-store.s3.amazonaws.com/0/162829/1d72579f-615f-5036-ea6f-0c9f8e68e183.png)


## Jenkinsの開始
### Jenkinsの開始(http://localhost:8080/)

### Jenkinsの開始完了
![16_jenkins-min.png](https://qiita-image-store.s3.amazonaws.com/0/162829/fa6db147-1116-4044-b67b-11d488111eb8.png)