OmniAICreator/Qiita-1.07M huggingface dataset:
iOSブラウザにてカットオフした際の3点リーダーの場所が予期せぬ場所に現れる！

##やりたかったこと
表示領域の関係で出したいテキストが長文だった際、カットオフすることが多いと思うが今回はスマホサイトのカットオフで２行もしくは３行でカットオフしたかったので、line-clampを使った。
ちなみにline-clampはwebkitにてサポートされているのでchromeとsafariで確認できる。PCはお仕事で採用できないが、スマホは十分だろう。
サーバー側で文字数を切らず、CSSで切るメリットは画面幅で文字数を変えたい時（幅がひろい端末にはより多く情報を見せたい時）にはCSSでないと無理だね！

参考
`Can I use... Support tables for HTML5, CSS3, etc`
http://caniuse.com/#search=clamp

#現象
PC
こちらがやりたかったこと
![スクリーンショット 2017-10-27 11.02.26.png](https://qiita-image-store.s3.amazonaws.com/0/94307/77538534-10ca-08af-6f1a-f7c7e51b2d22.png)

スマホ（割りとiOSのどのバージョンでも確認）
<img width="141" alt="IMG_C3D090CD8E97-1.jpeg" src="https://qiita-image-store.s3.amazonaws.com/0/94307/2406475e-4c5d-e18a-83e8-91de9c986776.jpeg">
本来であれば末尾に３点リーダーが来てほしいものだが、何故か真ん中あたりに表示される。。。
これはもう泣きが入る((o(;△;)o))
下記はその際のコードである。

コード
html

```html:html
<div class="box1">
<p><a href="#dummy" class="clamp2">123456789012345678901234567890123456789012345678901234567890</a></p></div>
```

style

```css:css
.box1{
width: 120px;
height: 100px;
border: 1px solid red;
}
a{ word-break: break-all; }
.clamp2{
display: -webkit-box;
overflow: hidden;
text-overflow: ellipsis;
-webkit-box-orient: vertical;
max-height: 2.8em;
-webkit-line-clamp: 2;
}
```

##対策
![IMG_53B10E04C13C-1.png](https://qiita-image-store.s3.amazonaws.com/0/94307/179ae483-7ef1-60ea-8fa6-9d66cfbede48.png)

コード
html

```html:html
<div class="box1">
<p><a href="#dummy" class="clamp2"><span>123456789012345678901234567890123456789012345678901234567890</span></a></p></div>
```

aタグの中身を<span>で囲むだけである。
styleの変更や追加は一切必要なかった（・ω・）/
##原因
不明。。。。
知っている方いたら教えて欲しいです(ノД`)・゜・。
Effective C# 社内勉強会 - #1 アクセス可能なデータメンバの代わりに常にプロパティを使用すること

この記事は、[Effective C# 社内勉強会](https://qiita.com/ykoji1112/items/0fbb470d6e2242035bcd)において、参加者が疑問に思った点、質問があった点をまとめたものです。

新人と、プログラム経験年数3,4年目あたりの、あまり技術向上に興味のない人が参加するとどのようなことになるか、コーヒーでも飲みながら読んでいただければ。

また、これからEffective C# を読む人の一助になれば。

そして、参加者の備忘録として。

なお、Effective C# の内容を記述したものではありませんので、本の内容を知りたい方は他ブログを参照して下さい。

#項目1 アクセス可能なデータメンバの代わりに常にプロパティを使用すること
#####やはり、予習は必要か？
1ページ読むのに1時間かかりました…
予習必要なしの形式で始める予定であったが、予習は必要かもしれない。

参加者は、普段VB.NETで開発している、かつC#を触ったことが無い人が多数。そして、C++やJavaも経験がないので、波括弧を使う文法も初めてです。次からは、書いてあるプログラムを写経するぐらいは指示しようかと思った。なんとなくでもいいから、C#の雰囲気を掴んで欲しい。

#####疑問点
- [データメンバ](https://qiita.com/toshi0607/items/801a0d37fb48313cbdbd)とは

 →クラスのフィールドとして宣言された変数

- アクセス可能なデータメンバ

　→publicなデータメンバ、あるいは継承元のprotectedなデータメンバ

- [getアクセサー、setアクセサー](http://e-words.jp/w/%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B5.html)とは

　→getアクセサーとは、オブジェクト内部のメンバ変数を外部から参照するためのメソッド
　→setアクセサーとは、オブジェクト内部のメンバ変数を外部から設定するためのメソッド

- [アクセス修飾子](https://docs.microsoft.com/ja-jp/dotnet/csharp/programming-guide/classes-and-structs/access-modifiers)とは

- プロパティ（プロパティといえば、Form画面をデザインする時のプロパティペインにある項目という認識だった）とは
- 独自のgetメソッドあるいはsetメソッドを用意することもやめましょう→なんで？
→本文にあるから熟読してね。

- インターフェースとは
→「使い方」とか「振る舞い」のような意味。

- データに直接アクセスしているかのようなインターフェースとしてメンバを公開できる
　→使っている側としては、instance.Name = "ほげ"　のようにアクセスできるが、プロパティでも同じように公開できる。
- [オブジェクト指向](https://qiita.com/tutinoco/items/6952b01e5fc38914ec4e)とは
- [データバインド](https://www.weblio.jp/content/%E3%83%87%E3%83%BC%E3%82%BF%E3%83%90%E3%82%A4%E3%83%B3%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0)とは
- [リフレクション](https://qiita.com/dolls/items/c7b3cf2520baae158a3a)とは

- [プロセス、スレッド](https://ja.wikipedia.org/wiki/%E3%82%B9%E3%83%AC%E3%83%83%E3%83%89_(%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF))とは
- [バッキングストア](https://docs.microsoft.com/ja-jp/dotnet/csharp/programming-guide/classes-and-structs/using-properties)とは
- [抽象クラス](http://ufcpp.net/study/csharp/oo_abstract.html)とは
- [リスト](https://www.ipentec.com/document/document.aspx?page=csharp-use-list-generics)とは
- [ハッシュ](http://ufcpp.net/study/algorithm/col_hash.html)とは
- [バイナリ互換性](http://e-words.jp/w/%E3%83%90%E3%82%A4%E3%83%8A%E3%83%AA%E4%BA%92%E6%8F%9B.html)とは
- JITコンパイラによって[インライン化](https://ja.wikipedia.org/wiki/%E3%82%A4%E3%83%B3%E3%83%A9%E3%82%A4%E3%83%B3%E5%B1%95%E9%96%8B)される

#####感想
疑問点から、現在の技術力が垣間見えますね。

「下手糞の上級者への道のりは、己が下手さを知りて一歩目」

Chapter1を読み終わるのに、２週にわたり延べ４時間程度。
このペースだと１年以上かかる計算になりますね。
ただ、１センテンスずつ、踏みしめながら理解していかないと、後々つまづく事になることが容易に予想されるので…

プロセス、スレッド、バイナリ、リスト、ハッシュ、バイナリ、JITコンパイラ、インライン化とは何なのか、しっかり理解して次に進むことができました。
「インライン化」とか、さらっと本文に出てきてもこれで大丈夫。
Reactを簡単に試せる環境を手に入れる

# はじめに

社内の勉強会などでReactを手軽に試せる環境がほしいという声が上がったので、ReactやReduxを試すことのできる環境を構築する方法をまとめました。
手軽に試すという意味ではjsfiddleでも良いかなと思いましたが、ファイルを分割して（実際のプロジェクトと同じ構成で）動作を試したり、なるべく本番と近いビルド構成で試したかったりと、手軽とは言え求める最低水準があることにも気づきました。
ここでは、有名な https://github.com/kriasoft/react-starter-kit を利用して、ローカルマシーンでReactやReduxを試すことのできる環境を構築する方法を紹介します。

# スターターキット

https://github.com/kriasoft/react-starter-kit

スターが15700以上ついているスターターキットです。
Reactはもちろん、Reduxやその他フレームワーク、ライブラリを試すことができるブランチも用意されています。

# 環境構築

Macを利用している想定で環境を構築をしていきます。

## 必要なライブラリを入れましょう

<!-- ### Docker for Mac のインストール

Dockerを利用することで、Mac上に複数の仮想OSを立ち上げることができるようになります。
それぞれの仮想OSは独立しているので、一方でnodeの7系をもう一方では8系を利用するといったことができるようになります。
複数人で同じプロジェクトの開発を行う際に、同じ開発環境を開発者それぞれのマシンに別個構築していたとしてもどこかに差異が存在してしまうもので、例えば新しくミドルウェアを使いたい場合などに一方では簡単に導入できたが、他方ではエラーが出てしまい導入できないなどの問題が発生していまいした。この様な問題も、全く同じ環境をそれぞれのマシン上に仮想的に構築することができるDockerを利用することで解消できます。

Dockerは次のURLからインストールしてください。
https://docs.docker.com/docker-for-mac/ -->

### homebrew のインストール

homebrewはMacのパッケージマネージャーです。
wgetやgitいったコマンドはもちろん、Chrome、iTermやAtomといったアプリケーションもbrewコマンドでインストール出来てしまいます。

次のURLからインストールしてください。
https://brew.sh/index_ja.html

### yarn のインストール

yarnはnpmと似たパッケージマネージャーですが、インストールするパッケージをキャッシュすることにより、npmよりも高速に動作します。
先程入れたbrewを利用してインストールするのが簡単です。

```sh
$ brew install yarn
```

詳しくは次のURLを御覧ください。
https://yarnpkg.com/en/docs/install

## ソースコードの入手

以上ですべて環境構築に必要な手順が全て完了しました。
最後にリポジトリをcloneしてソースコードを入手しましょう。

```sh
$ git clone git@github.com:kriasoft/react-starter-kit.git
$ cd react-starter-kit
```

## 実行

次のコマンドで、サーバーが立ち上がります。

```sh
$ yarn install
$ yarn start
```

サーバーが立ち上がったら、 `http://localhost:3000/` にアクセスしてください。
こんな画面が立ち上がると思います。

![01.png](https://qiita-image-store.s3.amazonaws.com/0/20406/5c3cd4d4-05ee-7ba3-7979-9ea77cd668b2.png)

一番初めに立ち上がる画面のコードは、 `src/routes/home/Home.js` にあります。
今回はサンドボックス用途で利用するので、既存のコードは気にせずに、思いっきり内容を書き換えてしまいましょう。

```js
import React, { Component } from 'react'

class Hello extends Component {
  render() {
    return (
      <div>Hello React</div>
    )
  }
}

export default Hello
```

ファイル内容を上記コードに置き換えると、コンテンツの内容が `Hello React` に置き換わりました。

![02.png](https://qiita-image-store.s3.amazonaws.com/0/20406/f47725c2-cbbd-64d3-26d8-d101b20417e7.png)


上下の意匠がじゃまなので、これも消してしまいましょう。
`src/routes/home/index.js`（`Home.js` と同じディレクトリにあります）を少し変更します。

```diff:js
  return {
    chunks: ['home'],
    title: 'React Starter Kit',
    component: (
-     <Layout>
-       <Home news={data.news} />
+       <Home/>
-     </Layout>
    ),
  };
```

![03.png](https://qiita-image-store.s3.amazonaws.com/0/20406/9734b526-2e32-b89e-c4ce-b4cc1731b098.png)

とてもスッキリしましたね。

## おわりに

Reactを試す環境が簡単に導入できました。
利用したスターターキットはソースコードを変更したらブラウザの内容が自動的に切り替わったり（Hot Module Replacement）、コンポーネントのDOM要素に付与するクラス名をCSSファイルで定義できたり（CSS Modules）、最新のECMAScript構文を利用できたりと、新しくこういうことをしたいと思ったらすぐに試せる環境だと思います。
今回書き換えなかった `Home.js` 以外のコードを眺めるだけでも勉強になると思うので、`Home.js` で遊び飽きたら別のファイルを眺めに行くと良いと思います。
git branch -vv の青色が読めないので色を変えた

## git branch -vv の青色が読めない

### 色を変更する。

`git config --global -e` で以下を追加

```bash
[color "branch"]
    upstream = bold cyan
```

とても見やすくなりました。

参考：https://github.com/git/git/blob/master/Documentation/config.txt

## ついでにtigも見やすくする。

`.tigrc` に以下の設定を記述しました。

```bash
set ignore-space = all          # 空白無視

# Color Settings
color default white black
color cursor default magenta
color status white green bold
color date cyan default
color delimiter cyan default
color line-number yellow default
color diff-header yellow default
color diff-index cyan default
color diff-chunk magenta default
color diff-stat cyan default
color "Reported-by:" green default
color graph-commit cyan default
```

とりあえず読めない状態はこれで回避できました。
《Node.js》nodebrewでnode.jsのバージョン管理をする

node.jsのバージョン管理(切り替え)をするために、nodebrewを導入します。

6系, 8系 とプロジェクトやタスクやお試しで、切り替える必要がある時の話で、
この環境は OSX 10.11.6 ということで進めていきます。

node.jsをすでにパッケージでインストールしている場合は、

* [MacにpkgでインストールしたNode.jsをアンインストールする手順](http://qiita.com/yoshikoba/items/4906829faaaae8c73e56)

これでアンインストールします。





## nodebrewをインストールするためにHomebrewをインストール

Homebrewを導入していない場合は、まずHomebrewをインストールします。

* [Homebrew](https://brew.sh/)




##  nodebrewをインストール

```

brew install nodebrew

```

### エラーするとき

ちょうどぼくの環境だと、インストールしようとしたら、以下のエラーが出ました。

```

Please delete these paths and run `brew update`.

```

というわけで、いらないものを削除して、アップデートします。


```

rm -rf /usr/local/share/doc/homebrew

```

そして、

```

brew update

```

これで解決しました。



### nodebrewのセットアップ

```

nodebrew setup

```



### Node.jsをインストール

インストール可能なNode.jsのバージョン一覧を見てみます。

```

nodebrew ls-remote

```

目標を確認できたらインストールします。


```

nodebrew install-binary [version]

```

インストールしたものを確認します。

```

nodebrew ls

```


最新版をインストールするには、

```

nodebrew install-binary latest

```

安定版をインストールするには、

```

nodebrew install-binary stable

```





## 使用するバージョンを指定する

幾つかのバージョンをインストールしたら、使用するバージョンを指定します。

```

nodebrew use [version]

```




## pathを通す

pathを通さないとnodeコマンドが実行できません。

`~/.bash_profile` に記述します。

```

echo 'export PATH=$HOME/.nodebrew/current/bin:$PATH' >> ~/.bash_profile

```

そして再読み込みさせます。

```

source ~/.bash_profile

```

すると、 `node -v` などなどの nodeコマンドを使うことができるようになります。




## その他

### アンインストール

不要なnode.jsのversionは削除しましょう。

```

nodebrew uninstall [version]

```


### ついでにyarnもインストール

```

brew install yarn

```


### IDEに注意される

ぼくはWebStormを使っているのですが、node.jsへのパスが変わってしまったので警告されました。パスを通すことをアシストしてくれるので、設定し直します。または、環境設定から、node.jsと検索すると、パスを通す画面に移行するので、そこから設定しておきます。




おわります。
pythonで作成したもの 1

お疲れ様です。

pythonを使ってweb操作の自動化と、簡単な音声合成を試してみたので記事として残しておきます。

#seleniumでsafariの操作を自動化

seleniumは、pythonでsafariやchromeを操作するための拡張機能のようなものです。
自分はこのseleniumを使って、hahtのログイン操作を自動化してみました。


動かす際には、safariの「開発」メニューから「リモートオートメーションを許可」にチェックを入れる必要があります。

```python:login.py
from selenium import webdriver
driver = webdriver.Safari()
driver.get('<hahtトップページのURL>')         #webサイトの指定
entry = driver.find_element_by_name("LUA") #webサイトのソースコードからログインID欄を指定
entry.send_keys("<ユーザー名>")                            
entry = driver.find_element_by_name("PWD") #同様にパスワード欄を指定
entry.send_keys("<パスワード>")                             
btn = driver.find_element_by_name("login") #同様にログインボタンを指定
btn.click()                                #クリック
```

自分は以下のサイトを参考に作成しました。
簡単にできるのでpythonとコーディングの勉強にちょうどいいと思います。
・[PythonとSeleniumでブラウザ操作を自動化したよ](https://foolean.net/p/304)
・[python+seleniumでTwitterにログインしてみる](http://www.takunoko.com/blog/pythonseleniumでtwitterにログインしてみる/)

#jtalkで音声合成
音声合成というほどでもないですが、キーボードから入力した言葉を音声で復唱してくれるスクリプトを組んでみました。

発声にはjtalkというフリープログラムを使用しています。
女声、または男声を選択できます。

```python:speak.py
import subprocess
from datetime import datetime

def jtalk(t): #jtalkの定義と男声/女声の選択
    open_jtalk = ['open_jtalk']
    mech = ['-x', '/usr/local/Cellar/open-jtalk/1.10_1/dic']
    htsvoice = ['-m', '/usr/local/Cellar/open-jtalk/1.10_1/voice/m100/nitech_jp_atr503_m001.htsvoice']
    #htsvoice = ['-m', '/usr/local/Cellar/open-jtalk/1.10_1/voice/mei/mei_normal.htsvoice']
    speed = ['-r', '1.0']
    outwav = ['-ow', 'out.wav']
    cmd = open_jtalk + mech + htsvoice + speed + outwav
    c = subprocess.Popen(cmd, stdin=subprocess.PIPE)
    c.stdin.write(t)
    c.stdin.close()
    c.wait()
    aplay = ['afplay', 'out.wav']
    wr = subprocess.Popen(aplay)

def speak(): #入力から動作まで
    #d = datetime.now()
    #text = '%s月%s日、%s時%s分%s秒' % (d.month, d.day, d.hour, d.minute, d.second)
    while True:
        text =  raw_input('喋らせたい言葉を入力(終了：exit) >>>   ').lower()
        if text in ['トゥーの社長は？']:
            text = 'ごうたさんです'
            jtalk(text)
            break
        if text in ['exit']:
            break
        else:
            jtalk(text)


#if __name__ == '__main__':
speak()
```

こちらも下記を参考に作成しました。
・[macでコードから音声を喋らせる ](https://qiita.com/msrks/items/4015ea03760cc28b7374)

このjtalk、発声はしてくれますがイントネーションに不自然な部分があります。
jtalkをインストールすると辞書ファイルも付いてくるので、これをもう少し弄ればより自然な発声にできるかもしれません(手間なのでやっていません)。

#おわりに
何かを作る時、tensorflowやswiftなどはUIから簡単に作成できるのに対して、pythonは一からコードを書かなければなりません。

そのため初めて触れる方はとっつきにくいかもしれませんが、最初は基本的な構文(ifとかwhileとか、defやimportの意味とか)だけ覚えておけば大丈夫だと思います。
・[python3系 基礎文法](https://qiita.com/rohinomiya/items/aab6b16d1a470871713c)
・[python-izm：python入門から応用までの学習サイト](http://www.python-izm.com)



webで探せばソースコードも山ほど見つかるので、
作りたいスクリプトがある時はソースコードを探してあとはコピペでもどうにかなります。


自分も全くの初心者なので、皆さんで学んでいきましょう！
TravisとCoverity ScanでJavaScriptコードの静的解析

# まとめ

ポイントは２つ．

* .travis.ymlの`build_command`に`"--no-command --fs-capture-search $TRAVIS_BUILD_DIR"`を指定
* Coverity ScanのAnalysis Settingsから`node_modules`フォルダー以下を解析対象外に設定[^1]

# Coverity Scan

オープンソースプロジェクトなら無料で静的解析サービスを利用することができます．

https://scan.coverity.com/

アカウントの作り方やプロジェクトの登録方法などは以下のページに記載されています．

https://scan.coverity.com/travis_ci

試しに[masnagam/wd-runjs](https://github.com/masnagam/wd-runjs)で使ってみようと思い，以下のように`.travis.yml`を記述しました．

```yaml
addons:
  coverity_scan:
    project:
      name: "masnagam/wd-runjs"
      description: "Build submitted via Travis CI"
    notification_email: masayuki.nagamachi@gmail.com
    build_command_prepend: ""
    build_command: ""
    branch_pattern: "*"
```

JavaScriptコードでコンパイル不要なので`build_command`を空にしました．

しかし，[Travisのログ](https://travis-ci.org/masnagam/wd-runjs/builds/292415408#L624)を見ると動作していないようでした．

```
ERROR: COVERITY_SCAN_BUILD_COMMAND must be set
```

`build_command`は空ではいけないみたいです．

[ツールの使い方](https://scan.coverity.com/download?tab=javascript)を確認すると

```shell-session
cov-build --dir cov-int --no-command --fs-capture-search <path/to/source/code>
```

となっており，どうやら``--no-command``以降のオプションを指定する必要があるようです．

成功すると，以下のような[ログ](https://travis-ci.org/masnagam/wd-runjs/builds/292425471#L629)が表示されます．

```
Running Coverity Scan Analysis Tool...
Coverity Build Capture (64-bit) version 2017.07 on Linux 4.4.0-93-generic x86_64
Internal version numbers: c7e331b562 p-milo-push-30112.651
[STATUS] Running filesystem capture search...
[WARNING] Path '/home/travis/build/masnagam/wd-runjs/cov-int' looks like an idir. Skipping filesystem capture on it.
[STATUS] Emitting non-source files from filesystem capture
[STATUS] Emitting 4037 source files from filesystem capture
|0----------25-----------50----------75---------100|
****************************************************
Emitted 3935 JavaScript compilation units (99%) successfully
...
```

後はCoverity Scanで解析順番待ち．．．

```
Last Build Status: In-queue. Your build is in the queue to be analyzed. There are 76 builds ahead of it.
```

# Travisでの実行時間が長い．．（未解決）

実行してみるとわかりますが，この２つのオプションだけだとすごく時間がかかります．恐らく，`node_modules`もスキャン対象になっているものと思われます．

`node_modules`を除外するための方法を探したのですが，コマンドのヘルプは使い物になりませんし，役に立つドキュメントもツールには含まれていなかったので，これ以上どうすることもできませんでした．

対象ファイルを`node_modules`を含まない特定フォルダー内に集めることができるなら，`--fs-capture-search $TRAVIS_BUILD_DIR/path/to/folder`とすることで実行時間を短縮できるかもしれません（試してはいません）．ただし，`bin`などが含まれるプロジェクトでは，すべてのファイルを静的解析の対象にはできないかもしれません．

対象ファイルをどこかのフォルダーに一時的にコピーしてコマンド終了時に削除できればいいのですが，`build_command_prepend`と`build_command`しかないので，一時フォルダー削除するのは無理，もしくは少しトリッキーなことをする必要があるかもしれません（試していません）．

# Coverity Scanでの解析時間が長い．．（解決済？）

解析順番がまわってくるまで数時間．その後，解析が始まって一日経っても終わらない．．

設定の問題かと考え，一度解析を中断し，Analysis Settingsを変更してみました．

![coverity_scan_analysis_settings.png](https://qiita-image-store.s3.amazonaws.com/0/47336/59c6cc34-133a-a7d0-e382-c945fb901a5c.png)

Travisで"Restart build"を実行し，待つこと一晩．無事解析完了しました（たまたま早く解析が完了したのかもしれませんが，因果関係を検証する予定はありません）．

"View Defects"を見るには，更に１，２営業日待てとのこと．[プロジェクト一覧](https://scan.coverity.com/projects)への反映も解析完了時ではないみたいです．

---
[^1]: 因果関係は検証していません．設定変更後に再実行すると，早く解析が終わったというだけです．
俺の改善要望がこんなに受け入れられないわけがない

皆様、システム開発部門への改善要望の時
こう思った時ってありませんか？

「「あいつら何もしてくれない！！」」

もしかしたら、改善要望の仕方がわるいのかも。。。？

ドラクエで例えてみましょう

ユーザ「ひのきのぼうをめっちゃんこ強くしてくれ」
こんな質問がきてもシステム屋さんは困ってしまいます

「いつの段階のひのきのぼうだ？」
「強くして何がよくなるんだ？そもそも問題って何？」
「ひのきのぼうを強くしたら他への影響は？」

そしてそれを聞き出す時間と調整の時間をざっくり見積もって
こう結論づけるわけです
「今は忙しい、優先度的に後回しにさせてください」

じゃあどういう改善要望をだせばいいのか？
まず何に困ってるかあげます
「ひのきのぼうが弱くてこまっている」
それに背景、状況を肉付けしていくわけです

５w１hをイメージすると良いでしょう
いつ？→ひのきのぼうが弱くて「A村からC村までの」戦闘に時間がかかり楽しくない
何に困ってる？→戦闘に時間がかかり楽しくない
解決されるとどうなる？→戦闘がサクサク進んでたのしい

これぐらい情報をだしてあげると
システム屋さんは問題の本質的な部分はどこなんだろうって考えられます

確かにひのきのぼうを強くすれば
サクサクはでるかもしれません、、ただゲームにおける
段階的に強くなるという楽しみを奪ってしまいます。

「A村直後はひのきのぼうで十分だけど、C村でどうのつるぎが手に入るまで
武器が強くならないのが問題。じゃあB村にこんぼうを売らせよう」
「システムにAIを導入してサクサク感を出したらどうだろう」
「B村に武器強化のアイテムを置いておこう」

部分最適にならず全体最適を考えてあげるのが
システム屋さんです。
それには単調な問い合わせをうけてもどうしようもないといった
現実があります

背景、何に困っているか、解決されるとどう良くなるか
伝えてあげると改善要望は受け入れられやすくなるでしょう
スマホからMacのローカルサーバーに接続する方法

テスト用のサーバーが出来上がってない状態でスタブサーバーをローカルに設置してテストする方法

1. 同じ無線ネットワークならなんの設定もなくローカルにLAMP環境を作って
$ifconfig こちらで表示されるIPで接続可能になる。

2. 同じ無線ネットワークを利用出来ない場合、データケーブルで繋いでやる方法
■　アプリケーション＞システム環境設定＞ネットワークをクリック
![スクリーンショット 2017-10-27 10.33.28.png](https://qiita-image-store.s3.amazonaws.com/0/108475/556e5172-cb18-31cd-966a-9d0688054422.png)

■　ネットワークの中の「iPhone USB」をクリック
![スクリーンショット 2017-10-27 10.26.22.png](https://qiita-image-store.s3.amazonaws.com/0/108475/f13e084a-0a2c-fce8-2f19-5816ee67d6c2.png)

■　IPv4の設定を「DHCPサーバーを使用」を選択
![スクリーンショット 2017-10-27 10.26.52.png](https://qiita-image-store.s3.amazonaws.com/0/108475/39500f0f-6187-295c-32b5-1118400912e7.png)


スマホから上記のIPアドレスでサーバー接続可能
SystemVerilogにてmoduleにinteger型の値を渡す

# はじめに
　SystemVerilogではinteger型を扱えます。しかし、moduleの入力ポート名の部分はネットタイプでなければならないのでinteger型をそのまま用いることはできません。ここではSystemVerilogの入力ポートにinteger型を用い、moduleにinteger型の値を渡す方法について調査した結果を書きます。
# 方法
　integer型はSystemVerilogではreg signed [31:0]として扱われるので、integer型としたい入力ポートの型をreg signed [31:0]とするだけです。必要に応じてsignedをつけて符号付きとしたり、reg signed [15:0]とするなどしてビット数を減らすこともできます。
# 参考文献
http://www.edaboard.com/thread141629.html
https://stackoverflow.com/questions/36667351/integer-input-ports-in-verilog-simillar-to-vhdl
Ansible | Playbook で変数を変数に代入する


# 例

`キー: "{{ 変数名 }}"` で代入できる様子。（クォートが必要）


## Playbook

```:playbook.yml
---
- hosts: example
  vars:
    variable1: MESSAGE
    variable2: "{{ variable1 }}"
  tasks:
    - debug: msg={{ variable2 }}
```

`variable1` を `variable2` に代入して debug 出力してみる。

## インベントリ

```:inventory.txt 
[example]
localhost
```

# 検証


```
$ ansible-playbook -i inventory.txt playbook.yml

PLAY [example] *******************************************************

GATHERING FACTS ***************************************************************
ok: [localhost]

TASK: [debug msg={{ variable2 }}] *********************************************
ok: [localhost] => {
    "msg": "MESSAGE"
}

PLAY RECAP ********************************************************************
localhost                  : ok=2    changed=0    unreachable=0    failed=0
```


# 環境

- ansible 1.9.6

# 参考

- [YAML Syntax — Ansible Documentation](http://docs.ansible.com/ansible/latest/YAMLSyntax.html)








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Prometheusのfile_sd_configsを試してみる

file_sd_configsを試してみる

##Version
prometheus server: 1.8.0

##参照
https://prometheus.io/docs/operating/configuration/#<file_sd_config>
##static_configとfile_sd_configsの違い
`static_configs`の場合は監視対象追加後に`prometheus server`の再起動が必要になる。
`file_sd_configs`の場合は監視対象を追加したあと一定時間(デフォルトは5分)ののちに設定が自動的に読み込まれ、ただちに監視対象に組み込まれる。

`targets`のリストを`prometheus.yml`(デフォルトの名称）に直接かくのではなく別のファイルに書いておいて、`file_sd_config`の中でそのファイルを指定することで`targets`を読み込んでくれる。`- files`として読み込むパスは、実行ディレクトリからの相対パスなので、`./prometheus`と実行するんであれば`- files`はファイル名だけでよい。

##設定例
###prometheus.yml
`prometheus.yml`に`file_sd_configs`の設定を記載した例

```prometheus.yml
# my global config
global:
  scrape_interval:     15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
  evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
  # scrape_timeout is set to the global default (10s).

  # Attach these labels to any time series or alerts when communicating with
  # external systems (federation, remote storage, Alertmanager).
  external_labels:
      monitor: 'codelab-monitor'

# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
  # - "first.rules"
  # - "second.rules"
  - 'prometheus.rules'

# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
  - job_name: 'prometheus'
    # metrics_path defaults to '/metrics'
    # scheme defaults to 'http'.
    static_configs:
      - targets: ['localhost:9090']

  - job_name: 'file_sd' # 任意の名前
    file_sd_configs:
      - files: # 複数のファイルを読み込ませることができる。
        - /usr/local/prometheus-server/file_sd1.yml
        - /usr/local/prometheus-server/file_sd2.yml
```

###files
filesの記載例

```/usr/local/prometheus-server/file_sd1.yml
- targets:
    - 192.168.10.10:9100
    - 192.168.10.11:9100
    - 192.168.10.12:9100
  labels:
    service: web
    role: role-1

- targets:
    - 192.168.20.10:9100
    - 192.168.20.11:9100
    - 192.168.20.12:9100
  labels:
    service: db
    role: role-2
```

##状態確認
prometheus.ymlで設定した`job_name: 'file_sd'`で、`- files`の中身の`targets`にラベルがついた状態で監視対象に組み込まれたのを確認できた。

<a href="http://www.flickr.com/photos/48487064@N08/24103805468" title="2017-10-26_18h17_04"><img src="https://farm5.staticflickr.com/4508/24103805468_d69943020d.jpg" alt="2017-10-26_18h17_04" class="alignnone"/></a>


ここに手動で対照を追加する、あるいは対照を定期的に組み込むcron処理でも追加すれば、一応はautocalingに対応する設定となる。
iPhone7でもiPhoneXを感じられるアプリつくった

## 今日はiPhoneXの予約日ですね
- いかがお過ごしでしょうか
- 予約しようとしている人、iPhone8で十分だ！などいろいろあるかと思います

![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f36323832322f34313637386638302d313739392d653334632d623163352d6661646535356131396236612e706e67.png](https://qiita-image-store.s3.amazonaws.com/0/62822/9adda997-eced-3688-e847-fd5709661145.png)

### **！！！！！私はiPhoneXがほしい！！！！！！**
- もうまてません！！


## というわけで、誰でもiPhoneXを感じられるアプリを作りました
![iponX_a.gif](https://qiita-image-store.s3.amazonaws.com/0/62822/cb5b3d8b-056b-890b-d8e6-f002feab88e4.gif)

## こだわり
- edgeを極限まで追求
- 全体で丸角を採用
- 無意味なホームバー
- 時計と電池残量の表示
- アプリアイコンの追求
- などなど


## githubにあります
- https://github.com/okamuroshogo/iponX



## まとめ
- やっぱりiPhoneX欲しいので、本日の16時01分に予約してきます(๑╹ω╹๑ )
☑️ [保存版] Apple審査リジェクト対策チェックリスト

## 目的
- Appleの審査を最速で突破する。

毎回苦戦しているのがバカバカしくなった & 探してみたけど意外と分散していたので、チェックリストを作りました。

アカウント作成し、ユーザーがコンテンツを作るようなアプリを前提にしています。

**他に落とし穴・チェックポイントがあれば是非コメント等で教えていただけると助かります。**
（Apple審査で苦しむ人を一人でも少なくしたい。）

## 前提
- 人事を尽くして天命を待つ（審査の返信は1~3日かかるので、待つのはバカバカしい。考えられるすべての手は打っておくべき）
- 一度[最新版のガイドライン](https://developer.apple.com/app-store/review/guidelines/jp/)に目を通しておく

## チェックリスト
### 動作確認
- [ ] クラッシュやバグはないか？
- [ ] IPv6環境での動作を確認したか？([IPv6のみのネットワーク
での審査について](https://developer.apple.com/jp/support/ipv6/))
- [ ] iPadで動作確認をしたか？（UIAlertController注意）

### リソースの確認
- [ ] AppIconやスクリーンショットに不足はないか？
- [ ] 正しい内容を伝える説明文 / スクリーンショットになっているか？
- [ ] スクリーンショットに過度な宣伝文句は入っていないか？

### 使いかた
- [ ] アカウントのログイン情報を用意し記入したか？（必須らしい）
- [ ] 使いかたのビデオを添付したか？
- [ ] わかりづらい部分は文章で補足したか？

### 報告
- [ ] 全てのコンテンツにReport機能はついているか？
- [ ] 全てのコンテンツ / ユーザー をブロックする機能はついているか？

### メタデータリジェクトについて
- [ ] 再申請はしてはならない（審査内容がリセットされてしまう）
- [ ] バイナリを再提出しても前のを利用して審査されるのでバイナリに問題がある場合は素直に再審査するべき

### 個人情報
- [ ] 性別・誕生日・Eメールなどは相当な理由がない限りオプションにしておくべき

> ガイドライン 17.2: 機能を利用させる条件としてユーザにEメールアドレスや誕生日などの個人情報を入力させるアプリはリジェクト。

### ログイン
- [ ] サードパーティーのログイン連携をしているアプリはSign In with Appleの実装が必須

参考： [【iOS】対応必須かも？Sign In with Appleまとめ（第一報)](https://qiita.com/shiz/items/5e094910f742c2ad72a4)

### その他
- [ ] APIはSSLに対応しているか？
- [ ] レーティングは十分に高いか？(有無については大きめに（=ちょっとでもあれば「あり」）」「程度（まれ／軽度, 頻繁／頻度）は少なめに」ぐらいの方針で申告する)
- [ ] プライバシーポリシー / 利用規約 はあるか？同意させているか？
- [ ] 虚偽、人を欺す、誤解を招く表現を含むアプリ、他のアプリと似た名前やアイコンを持つアプリではないか？
- [ ] アプリ名にキーワードを詰め込みすぎていないか？
- [ ] アプリ名に価格の言及はしてはならない
- [ ] バックグラウンドで機能を使う場合、その理由が正当であることが伝わっているか？
- [ ] インターフェースは最低限ガイドラインにそっているか？
- [ ] 日本語対応の人にお願いすることもできる...?([iOSアプリが何回もリジェクトされた後にAppleからフォローアップされる件](https://qiita.com/yonell/items/124830ff8970b3108e3a)) => 日本語で返信してもいいという説もある
- [ ] 他のプラットフォームへの言及なないか？（「Android版リニューアルしました！」と書いてあった、ということでこのリジェクトをもらう例があります。）
- [ ] AppStoreには製品版のみ掲載可能なので、"demo," "trial," "beta," or "test"などの言葉を使うとリジェクトされる


### 細かいの
- [ ] 招待コードは禁止らしい
- [ ] カメラボタンを押したら、カメラかアルバムかを選ばせないといけないらしい
- [ ] QRコードを読み取るときは、Info.plistの"Privacy - Camera Usage Description"でその用途を明示する
gsutilからS3互換API経由でGCSにアクセスする

GCSのInteroperability APIをgsutilから使いたいと思ったものの、ネット上にはAWS CLIの例しか見当たらなかったのでメモ。

まず$HOME/.botoを作成。

```:.boto
[Credentials]
aws_access_key_id = <ACCESS_KEY_ID>
aws_secret_access_key = <SECRET_ACCESS_KEY>

[s3]
host = storage.googleapis.com
```

この状態で下記のようにすればGCSにアクセスできます。

```
$ gsutil cp -r s3://<GCS_BUCKET_NAME>/<PATH> ./
```

# 参考URL

互換をうたう以上当然だが、GCSのエンドポイントは`<bucket>.storage.googleapis.com`形式のバーチャルホストにも対応している。

- https://cloud.google.com/storage/docs/request-endpoints
既存案件にJoinする場合の注意点

# 概要

既存案件に入る時、または改修案件に関わる時にどうしたら良いのかわからなかったことが多数あったため、その時に先輩方に教えてもらった知見をまとめる。プログラムはある程度読めることを前提として書くのでご了承を。また、これより良い方法や別の方法がある場合はコメントくださると嬉しいです。


# ソースコードを読む
よく言われることではあるけれどもその際にこのようにして読むと理解が捗るとのこと。

## プルリクエストをひたすら追う
プルリクエストには

###### **どのように修正したら良いのかなどの知見が詰まっている**


なぜそのように修正したのかのメッセージが残っていたり、issueと絡めているとこ
ろはどのような問題を元に改修したのかがわかる。

追っていると、プロジェクトの方針、[dryの考え方](https://xn--97-273ae6a4irb6e2hsoiozc2g4b8082p.com/%E3%82%A8%E3%83%83%E3%82%BB%E3%82%A4/DRY%E5%8E%9F%E5%89%87/)に反した改修を避けることができる。


## クラス、メソッドの仕様を把握する

改修を頼まれた箇所に関係するクラス、メソッドを必ず把握しきる。
ここをおろそかにして返り値などをあまり把握しないまま使うとシステムの理解が進まず、
数年経っても技術力やシステム理解が進まない。

# システムを使い込む
ソースコード云々以前に使わないとユーザがどう感じるかわからないよねというお話。

## 使いにくいところがないかを確認する
ユーザビリティ的な観点から問題はないのかを確認する。
JoinしたばかりだからこそすでにJoinして長い時間が経っているメンバーにはわからないところにも気づける。
また、理解が進むことでソースコードが読みやすくなるといった助けもある。

※2017/11/02 追記

# まとめ
要するに当たり前のことをやれということ。
geometry > link > United States of Voronoi | Voronoi Diagram Intro Part 1 and 2

Delaunay trianglesとそのdual graphであるVoronoi Diagrams。

### link 1
https://www.youtube.com/watch?v=b_uvofsYl9s

- 家の近くのpost officeはどこか
- 複数の家があった時に、近傍の家(3つ)はどれか
    - 組合せ数を軽減できる
        - n(n-1)/2から
        - 3n - 6 へ

### link 2

https://www.youtube.com/watch?v=7eCrHAv6sYY

- For n sites
    - there are n faces
    - at most 2n - 5 vertices
    - at most 3n - 6 edges
    
https://www.youtube.com/watch?v=Y5X1TvN9TpM

- Voronoi Diagramsの作り方
    - Fortune's Algorithm
        - Sweep line algorithm
            - https://arxiv.org/abs/1602.04707
                - GPLv3


### 関連

[geometry > Euler's polyhedron formula > V - E + F = 2 | T = 2V - 4](https://qiita.com/7of9/items/43ad9d045ffc1c5d5752)
浮動小数点数の正確な値を割り出す

ふだん「0.1」だと思っている値が、実は何者なのか、Rubyを使って調べてみることにしました。

# 浮動小数点数の内部構造
「Decimal型」のように、十進法による浮動小数点型を提供している環境もありますが、多くのパソコン環境でデフォルトとして使われる浮動小数点数は、IEEE 754形式のものです（Javaなどでは、IEEE 754で実装することが必須となっています）。

これは、指数が「2の累乗」となるので、小さい方は1/2、1/4のような「2の累乗が分母に来る分数」のときだけ厳密な値を表すことができます。つまり、「0.1=1/10」のときすら、正確な値を入れることができません。いちばん近い、「2の累乗が分母に来る分数」に丸めているのです。

Rubyの場合、言語仕様上はIEEE 754が必須ではありませんが、以下ではIEEE 754など「基数が2の累乗」の浮動小数点数を使っていることを前提とします。

# 桁数指定で文字列化

`Float#to_s`は「人間が読みやすい形の文字列表現」とだけなっていて、細かな制御は不可能ですが、C言語から由緒正しく続いている`sprintf`であれば、小数点以下の桁数を指定して文字列化できます。

```rb
sprintf('%.100f', 0.1)
# => 0.1000000000000000055511151231257827021181583404541015625000000000000000000000000000000000000000000000
```

ご覧のように、「0.1」だと思っていた値の、下位が表示されるようにはなってきましたが、えんえん0が続いてしまっています。あとは「100」決め打ちではなく、必要な桁数を取れば完成、ということになります。

# 有理数化してみる

`Float#to_r`というメソッドがありますが、一般的な用途では`0.1.to_r`が`1/10`として認識されないので、使い勝手が悪いです。…が、今回は「厳密に変換してくれる」ことを利用します。

```rb
0.1.to_r
# => (3602879701896397/36028797018963968)
```

IEEE 754など、基数が2の累乗の浮動小数点数では、この分母は必ず2の累乗となります（Ruby 1.9以降では、`Rational`は必ず既約分数となります）。そして、10=2*5なので、分母のビット数=この数を小数で表した場合の、小数点以下の桁数となります。それがわかれば、あとはコードに起こすだけです。

# 実際のコード

便宜上、`Float#to_exact_s`とオープンクラスしています。

```rb
class Float
  def to_exact_s
    digits = to_r.denominator.bit_length - 1
    sprintf('%.*f', digits, self)
  end
end
```

せっかくなので、0.1～0.9までを展開してみました。

```rb
irb(main):009:0> 0.1.to_exact_s
=> "0.1000000000000000055511151231257827021181583404541015625"
irb(main):010:0> 0.2.to_exact_s
=> "0.200000000000000011102230246251565404236316680908203125"
irb(main):011:0> 0.3.to_exact_s
=> "0.299999999999999988897769753748434595763683319091796875"
irb(main):012:0> 0.4.to_exact_s
=> "0.40000000000000002220446049250313080847263336181640625"
irb(main):013:0> 0.5.to_exact_s
=> "0.5"
irb(main):014:0> 0.6.to_exact_s
=> "0.59999999999999997779553950749686919152736663818359375"
irb(main):015:0> 0.7.to_exact_s
=> "0.6999999999999999555910790149937383830547332763671875"
irb(main):016:0> 0.8.to_exact_s
=> "0.8000000000000000444089209850062616169452667236328125"
irb(main):017:0> 0.9.to_exact_s
=> "0.90000000000000002220446049250313080847263336181640625"
```

大きい方、小さい方、振れ方もそれぞれだということがよくわかりました。
ZeroNetのインストール

主にgithumのZeroNetのページの要約となります。

#Zeronetとは
ZeroNetとは、Bitcoin暗号技術とBitTorrentというP2P型のコミュニーケーションプロトコルを用いた非中央集権型のウェブサイトです。 

#なぜZeronetなのか
・オープン、フリー、そして匿名型のネットワークとコミュニケーション。
・最低1 peerが稼働していれば、オフラインとして動作可能。
・ホストコストがかからない。(P2P型のため)
・シャットダウンが起こらない。（P2P型のため）
・オフライン環境でも高速にアクセス及び利用可能。

#環境
OS:macOS Sierra version 10.12.6
python: 2.7.13

#インストール
まずは[Github](https://github.com/HelloZeroNet/ZeroNet)よりZeroNet Packageをダウンロードします。
zeronet.pyがあるディレクトリに移動し、zeronet.pyを実行します。

```zeronet.py
python zeronet.py
```

gevent及びmsgpackがインストールされていない場合はエラーが発生します。
必要に応じてインストールを行います。


geventのインストール

```
python -m pip install gevent
```

msgpackのインストール

```zeronet.py
pip install msgpack-python
```

起動に成功すると、以下のようになります。
![d.png](https://qiita-image-store.s3.amazonaws.com/0/186776/6462d5d6-355e-4ef7-f20b-bbe3bf25dce0.png)

http://127.0.0.1:43110/　
にアクセスにします。

以下のような画面が現れたら、正常に起動しています。

![っっっっっd.png](https://qiita-image-store.s3.amazonaws.com/0/186776/eeac6685-ad6d-1b45-48bb-7eddce092735.png)
UbuntuにApacheとPythonとDjangoを入れようとした話(2)

困ったときは凝ったことをせずに、最小限のことでやろうと思いました故。
覚書程度です。
#まずはpip3のインストール
```
$sudo apt install python3-pip
$pip3 install --upgrade pip
```
pip自体はpythonで書かれたパッケージの管理システムです。
python2系とpython3系では異なることが多いのでpip（python2用）とpip3（python3用）があります。
今回はpip3の方を使います。
何もない段階でpip3をインストールすると現時点(2017/10/27)ではpython3.5系もインストールされます。

#Djangoのインストール
```
$pip3 install django
$apt install python-django-common
$django-admin --version
```
先程いれたpip3を使ってdjangoを入れます。
念のためバージョン確認してきちんと入ってるかを見ておいて下さい。

#apache2のインストール
```
$sudo apt-get update
$sudo apt-get install apache2
$apt-get install apache2-dev
$systemctl start apache2
```
apache2とapache2-devをインストールします。apache2-devが無い場合、この後使うmod_wsgiのインストールに失敗するようです。
apache2を起動したらwebブラウザからlocalhostに接続してきちんと表示されていることを確認します。

#mod_wsgiのインストール
```
$pip3 install mod_wsgi
$sudo mod_wsgi-express install-module
```
mod_wsgiをインストールします。
mod_wsgiはapacheとpythonを繋いでくれるモジュールです。
おとなしくpipコマンドで入れるのが得策です。

```
$mod_wsgi-express install-module
```
でapacheの設定のためのパスが出てきます。


#Djangoのプロジェクトを作成する
```
$mkdir /home/django
$cd /home/django
$django-admin startproject proj1
```
今回はこのような環境で行っています。
仮想環境とかでやるのが推奨されているらしいですが...
djangoとかの文字列は好きなように置き換えてもらって構いません。

#apacheとdjangoを結びつける
```
$vi /etc/apache2/sites-available/django.conf
```
でdjango.confファイルを作成し、

```
<VirtualHost *:80>
  WSGIDaemonProcess proj1 python-home=/usr python-path=/home/django/proj1
  WSGIScriptAlias / /home/django/proj1/proj1/wsgi.py process-group=proj1
  <Directory /home/django/proj1/proj1>
    <Files wsgi.py>
      Require all granted
    </Files>
  </Directory>
</VirtualHost>
```
のような内容を書き込みます。各自環境に合わせてください。

```
$vi /etc/apache2/apache2.conf 
```
ここの設定ファイルの末尾に

```
$sudo mod_wsgi-express install-module
```
で現れた文字列を追加しておきます

で最後に

```
$sudo a2dissite 000-default
$sudo a2ensite django
$systemctl restart apache2
```
設定ファイルを読み込み、apacheを起動させて終わりです。
設定が無事終わっていれば、localhostに接続したときにIt works!!みたいな表示がされているはずです。


#まとめ
anacondaいれてライブラリを一括にインストールしようとすると余計にめんどくさかった。
機械学習系のライブラリを使いたいけど個別に入れるしかないのかなぁ。。。


[追伸]
It works!!は表示されるけど、このままの状態だとdjangoの初期設定は何もしていないので
http://localhost/admin
は見れてもその先は行けないかと。

とりあえずdjangoの初期DBであるsqlite3とか入れて下さい。
yeoman/generator-gulp-webappのgulp buildでコケる

# はじめに
generator-gulp-webappのgulp buildで下記のエラーが出る。
大概リポジトリから引っ張ってきて修正をかけたあと小一時間悩むのでメモ。

```
events.js:160
thrower; // Unhandled 'error' event
 ^
Error at new JS_Parse_Error (eval at <anonymous> (PATH\node_modules\uglify-js\tools\node.js:28:1), <anonymous>:1534:18)
```

# 対象
generator-gulp-webapp(v1.x)でscaffoldされたプロジェクト。v2.x以降(名前がgenerator-webappに変わってるよ！)では多分発生しないと思うよ。
どのバージョンのgeneratorでscaffoldされたか確認するときは、gulpfileの1行目に"generated on YYYY-MM-DD using generator-gulp-webapp x.x.x "のコメントがあるからそこを見てね。

# なおしかた

```diff:package.json
- "gulp-if": "^1.0.5",
+ "gulp-if": "^2.0.2",
```

package.jsonの修正後はnpm installを忘れずに。
MacのIntelliJ IDEAからPleiadesをアンインストールしてみた


英語に慣れるためにpleiadesを取り外したかったけど、方法がどこにもなかったので、頑張って方法を探した。

下記のIntelliJの起動オプションファイル
`~/Library/Preferences/Idea-バージョン番号-/idea.vmoptions`
の一番下の行の
`-javaagent:/Users/ユーザ名/Library/Preferences/Idea-バージョン番号-/jp.sourceforge.mergedoc.pleiades/pleiades.jar`
を削除する。(Win版のPleiadesインストールの方法の逆ですね)



一応、見つけた際の流れを書いておくと、
1. とりあえずpleiadesをキーワードに、コマンドでPC内を検索
2. IntelliJの起動ログファイルにてpleiadesのjarファイルを呼び出すオプションを発見 (WindowsのPleiadesのインストール方法を知っていた関係で、この時点でpleiadesをアンインストールする方法をなんとなくイメージできた)
3. IntelliJの起動オプションファイルを探し、上記のオプションの行を削除
という感じ。


上記のみで英語表示に戻るが、PleiadesのJarファイル等は残ってしまう。
諸々のファイルを削除した方がスッキリするのですが、どこに何が作られているか、全ては把握しきれていません。
さしあたり、ざっと検索をかけてみて、
・上記のjp.sourceforge.mergedoc.pleiadesディレクトリ丸ごと
・~/Library/ 内の各ディレクトリ内をざっと見渡して、pleiadesと名のつくディレクトリやファイル
を、僕は削除しました。
IntelliJの起動、軽いコーディングを行いましたが、落ちたりなどはしてません。
goroutineを量産して様々な並列処理を行うための基盤づくり

# はじめに

Go言語の勉強し始めて2・3日のインフラエンジニアがなんとなく監視をテーマに選んで遊んで見る。

とりあえずやりたかったのは任意の数のgoroutineを生成すること。
そして今後の展望はその中で外部ファイルから読み込んだ任意の処理を行うこと。
監視用のエージェントをこんな感じにしたらどうかなーっていう試行錯誤の一旦です。

# コード

Tickerと処理間隔、処理を終了させるためのchannelを構造体にまとめておく。
Textの部分は処理を簡単にする都合上適当に作っただけなので処理内容に合わせてなんか足す。

```go
// MonTick : Structure for ticker and parameters.
type MonTick struct {
	Tick     *time.Ticker
	sec      int
	text     string
	exitChan chan bool
}
```

Workerを定義。Tickerによる通知のタイミングで走らせたい処理を書く。
監視ならCPUの使用率とかそんなの。

```go
// Define the worker to monitoring by ticker.
func (mt MonTick) work() {

	go func() {
	forLoop:
		for {
			select {
			case <-mt.Tick.C:
				log.Print(mt.text + ": I'm working !")
			case <-mt.exitChan:
				break forLoop
			}
		}
		log.Print("Exited: " + mt.text)
	}()
}
```

Functionは適当に用意。
エラー処理とかもうちょっとしたほうがいいんだろうけどよくわからない。。。
CreateもExitも「OK」とか言いながらエラーハンドリング全くしてないやつ（

```go

// Create workers.
func createWorkers() (mtArray []MonTick) {
	log.Print("Creating Monitors... ")

	for i := 0; i < 100; i++ {
		time.Sleep(time.Millisecond * 1)
		rand.Seed(time.Now().UnixNano())
		sec := rand.Intn(60) + 1
		ssec := "job-" + strconv.Itoa(sec)
		log.Print("    Created: ", ssec)
		mtArray = append(mtArray, createMonTick(sec, ssec))
	}
	log.Print("Created Monitors... [ OK ]")

	return
}

// Create ticker struct.
func createMonTick(sec int, str string) (mt MonTick) {
	tick := time.NewTicker(time.Second * time.Duration(sec))
	mt = MonTick{tick, sec, str, make(chan bool)}

	return
}

// Run all workers.
func runAllTickers(mtArray []MonTick) {
	log.Print("Running All Monitors... ")
	for _, v := range mtArray {
		v.work()
	}
	log.Print("[ OK ]")
}
func exitAllTickers(mtArray []MonTick) {
	log.Print("Exiting All Monitors... ")
	for _, v := range mtArray {
		v.exitChan <- true
	}
}

```

あとはmainでぐるぐる。
ランダム秒ごとに「おれしごとしてるぜ！！」アピールをし続けるWorkerたちを、60秒後にみんな停止させて終了。

```go
// Main function.
func main() {

	mtArray := createTickers()
	runAllTickers(mtArray)

	for {
		time.Sleep(time.Second * 60)
		break
	}
	exitAllTickers(mtArray)
	time.Sleep(time.Second * 5)
	log.Print("Exit the application. ")

}
```

# おわりに

今は単一処理なのでもう２・３処理を作って指定したFunctionを動かすような感じにしたい。
あとは外部からの読み込みかなー。
Springのアノテーションを合成してプロジェクト固有のステレオタイプを作る


通常、Java ではアノテーションを継承したり合成したりできませんが、Spring のアノテーションはできます。ややこしい準備も必要なく、アノテーションを書くだけで実現できます。

# 基本
アノテーションを定義し、その型に合成したいアノテーションを付します。元のアノテーションのパラメータについては、定数であれば通常通りそのパラメータに指定すれば良いですし、また `@AliasFor` を使って新しいアノテーションのパラメータを合成したアノテーションに引き渡すこともできます。

```java
@Retention(RetentionPolicy.RUNTIME)　// 実行時にアノテーションを参照できるようにする
@Validated
@ModelAttribute(binding = true)
public @interface ValidModel {
  @AliasFor(annotation = ModelAttribute.class, 	attribute = "name")
  String value() default "";
}
```

`@SpringBootApplication` や `@GetMapping` 等そこらかしこで合成アノテーションが使われているので、そのソースを追えば使い方はつかめるかと思います。


# チェック例外発生時にトランザクションをロールバックさせる
`@Transactional` はデフォルトだとチェック例外が送出されてもコミットされるという恐ろしい動作になっていますが、独自アノテーションを定義することで毎回 `rollbackFor` を付けなくて済むようになります。

```java
@Retention(RetentionPolicy.RUNTIME)
@Transactional(rollbackFor = Exception.class)
public @interface OurTransactional {
  @AliasFor(annotation = Transactional.class, attribute = "readOnly")
  boolean readOnly() default false;
}
```

# DAO や Repository がトランザクションの外で呼ばれたら例外を投げる

DAO をトランザクション境界にすることはないと思いますが、トランザクションの内側かどうかのチェックも下記のようにアノテーションでできます。

```java
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Component
@Transactional(propagation = Propagation.MANDATORY)
public @interface OurDao {
  @AliasFor(annotation = Transactional.class, attribute = "readOnly")
  boolean readOnly() default false;
}
```

# Controller をトランザクション境界にする
Play 1 系のように Controller でトランザクションを切るようにするアノテーションはこんな感じ。

```java
@Retention(RetentionPolicy.RUNTIME)
@Controller
@RequestMapping
@Transactional
public @interface OurController {
  @AliasFor(annotation = RequestMapping.class, attribute = "path")
  String value() default "";

  @AliasFor(annotation = Transactional.class, attribute = "readOnly")
  boolean readOnly() default false;
}
```
ちょっとずつ読むドメイン駆動設計 第ニ部 モデル駆動設計の構成要素 第七章 言語を使用する:応用例4

[その1](http://qiita.com/YasuhiroKimesawa/items/c138a5eee50da59cdfd8)/[その２](http://qiita.com/YasuhiroKimesawa/items/c823e79b86641a4254b3)/[その３](http://qiita.com/YasuhiroKimesawa/items/27d7852f4b2da010cccd) の続きです

## 新機能の追加
別システムへの接続例が記載されています。ここでは、以降で紹介される**腐敗防止層**が使用されています。

ポイントは接続するシステムについて、「販売管理システム」だからその通り呼ぶのではなくて、こちらが使用するサービスに即して、「配分チェックサービス」と呼んでいるところですね。

他にも、[「アナリシスパターン」](https://www.amazon.co.jp/dp/4894716933)から、エンタープライズセグメント（企業内区分)が紹介されています。

この例では、貨物の「タイプ」を値オブジェクトとして定義していますね。

## パフォーマンスチューニング

ここでは、腐敗防止層で分離しているから、パフォーマンス的に問題があっても、キャッシュをとったりしてモデルに影響なくチューニングできますという話が紹介されています。

## まとめ

ここまで、４回に分けて見てきましたが、徹底しているのは、
**技術的な部分を徹底的に隠し、ドメインに集中している**ことです。
オブジェクトがメモリにあろうが、DBにあろうが、それをクライアントに意識させない。
アプリケーション層の名前も業務の言葉を使ったサービス名にする。
腐敗防止層で他のシステムを意識せず、その名前もこちらのシステム側で使用するためのためにする。
などなど、、、
この応用例を通してはっきりと理解することができた気がします。（実践しきれるかどうかはまた別として・・・><;)

あと、[「アナリシスパターン」](https://www.amazon.co.jp/dp/4894716933)廃刊状態なのですね。。。復刊しないかな・・・

明日はやっと第三部へ。
【Postgresql】特定ユーザのパスワードが設定されているかどうかをスクリプトで判定する

Postgres運用サーバで[itamae](https://github.com/itamae-kitchen/itamae)を走らせるたびに`ALTER USER postgres PASSWORD ...`が実行されるのはなんだかなぁ、と思ったので初回のみ実行させる方法のメモ。
## psqlコマンドで確認する

* STEP1. `SELECT * FROM pg_shadow`
    * `pg_shadow`テーブルの`passwd`を見ればユーザごとのパスワード設定状況が分かる

```bash:terminal
[root@localhost /]# sudo -u postgres psql -c "SELECT * FROM pg_shadow;"
 usename  | usesysid | usecreatedb | usesuper | userepl | usebypassrls |               passwd                | valuntil | useconfig 
----------+----------+-------------+----------+---------+--------------+-------------------------------------+----------+-----------
 postgres |       10 | t           | t        | t       | t            |                                     |          | 
 app01    |    16384 | f           | f        | f       | f            | md50b6effc1247fae0b2faeb89214119eee |          | 
 app02    |    16385 | f           | f        | f       | f            | md5d9f3ba661a8ff1b0bf285edc59d81bd0 |          | 
(3 行)
```

* STEP2. `SELECT * FROM pg_shadow WHERE passwd IS NULL`
    * WHERE句に`passwd IS NULL`を加えれば、パスワードが設定されていないユーザのみを抽出できる

```bash:terminal
[root@localhost /]# sudo -u postgres psql -c "SELECT * FROM pg_shadow WHERE passwd IS NULL;"
 usename  | usesysid | usecreatedb | usesuper | userepl | usebypassrls | passwd | valuntil | useconfig 
----------+----------+-------------+----------+---------+--------------+--------+----------+-----------
 postgres |       10 | t           | t        | t       | t            |        |          | 
(1 行)
```

## スクリプトに任せてみる

* STEP3. `sudo -u postgres psql -tc "SELECT usename FROM pg_shadow WHERE usename = '<ユーザ名>' AND passwd IS NULL" | grep <ユーザ名>`
    * `grep`コマンド用いることで、終了ステータスによるパスワード設定の有無を判断できる
        * `exit code 0`ならパスワード未設定、`exit code 1`ならパスワード設定済
    * `psql`に`-t`オプションを指定し、結果行のみを出力させるのがポイント
    * 下記コマンドでは終了ステータス可視化のため、行末に`; echo $?`を付与して終了コードを出力しています

```bash:terminal
[root@localhost /]# sudo -u postgres psql -tc "SELECT usename FROM pg_shadow WHERE usename = 'postgres' AND passwd IS NULL;" | grep postgres ; echo $?
 postgres
0
```

### 応用例: 【itamae】postgresユーザのパスワード設定を初回のみ実行させる

* パスワードはyamlファイルで管理しており、`#{node[:postgresql][:password]`のように取り出す想定
    * gitで管理する場合は[itamae-secrets](https://github.com/sorah/itamae-secrets)で暗号化したほうが安全です👍
* 終了ステータスが0の場合(=パスワードが設定されていない初回実行時)のみ、`ALTER USER postgres PASSWORD ...`を実行する

```ruby:itamae-script.rb 
execute "sudo -u postgres psql -c \"ALTER USER postgres PASSWORD \'#{node[:postgresql][:password]}\';\"" do
  only_if "sudo -u postgres psql -tc \"SELECT usename FROM pg_shadow WHERE usename = \'postgres\' AND passwd IS NULL;\" | grep postgres"
end
```
サーバ内で通信をポートフォワードする

サーバ内で通信をポートフォワードする。例えば3000ポートで動いているWebサーバを、外からは80ポートで通信を受け取りたいという場合。
iptablesを使うと次のようになる。

```
sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 3000
sudo iptables -A INPUT -i eth0 -j ACCEPT
sudo service iptables save
sudo service iptables restart
```

1行目はポートフォワードの設定で、2行目はeth0への他の通信をすべて許可する設定となっている。
これはiptablesをファイアウォールとしてではなく、完全にポートフォワードするためだけの設定を想定している。

もしiptablesをファイアウォールとしてすでに使っている場合は、2行目のコマンドは実行しないようにする。

※ローカルからの通信はポートフォワードされないので注意する。
kubectlのオプションメモ

ネットの拾い読みで勉強していたが、最近本を買って勉強しだしたので、なるほどと思ったことをメモしておく。

とりあえず今回はkubectlについて。

## ```-w``` で結果をリアルタイムに出力できる

## getやdescribeサブコマンドはカンマ区切りで複数指定できる

```
# 例
$ kubectl get pods,svc
NAME READY STATUS RESTARTS AGE
po/nfs-server-1786322612-p0pw3 1/1 Running 0 1d

NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
svc/kubernetes 10.0.0.1 <none> 443/TCP 3d
```

## ```-o wide```で情報をより多く出すことができる

```
# 例
$ kubectl get  pods -o wide
NAME                          READY     STATUS    RESTARTS   AGE       IP           NODE
nfs-server-1786322612-p0pw3   1/1       Running   0          1d        172.17.0.6   minikube
```

## ```-o json```や```-o yaml```でそれぞれの形式で出力することができる (情報もより多く出る)

```
例
$ kubectl get  pods -o json
{
    "apiVersion": "v1",
    "items": [
        {
            "apiVersion": "v1",
            "kind": "Pod",
            "metadata": {
                "annotations": {
                    "kubernetes.io/created-by": "{\"kind\":\"SerializedReference\",\"apiVersion\":\"v1\",\"reference\":{\"kind\":\"ReplicaSet\",\"namespace\":\"default\",\"name\":\"nfs-server-1786322612\",\"uid\":\"e8cf196e-b80f-11e7-87c4-080027159c1b\",\"apiVersion\":\"extensions\",\"resourceVersion\":\"13198\"}}\n"
                },
                "creationTimestamp": "2017-10-23T16:33:32Z",
                "generateName": "nfs-server-1786322612-",
                "labels": {
                    "pod-template-hash": "1786322612",
                    "role": "nfs-server"
                },
                "name": "nfs-server-1786322612-p0pw3",
                "namespace": "default",
                略
```

## ```--no-headers```でヘッダーを取り除くことができる (パイプを使うときに便利）

```
# 例
$ kubectl get  pods --no-headers
nfs-server-1786322612-p0pw3   1/1       Running   0         1d
```

## ```-o jsonpath --template={(フィールド)}```で指定のフィールドのみを出力することができる

```
# 例
$ kubectl get  pods -o jsonpath --template {.items[].metadata.name}
nfs-server-1786322612-p0pw3
```

## ```kubectl get componentstatuses``` でクラスタの状態を取得することができる

```
#例
NAME                 STATUS    MESSAGE              ERROR
etcd-0               Healthy   {"health": "true"}
scheduler            Healthy   ok
controller-manager   Healthy   ok
```
AMPページでオーバーレイ広告(アンカー広告)を表示する

\<head\>タグ内で

```
<script async custom-element="amp-ad" src="https://cdn.ampproject.org/v0/amp-ad-0.1.js"></script>
<script async custom-element="amp-sticky-ad" src="https://cdn.ampproject.org/v0/amp-sticky-ad-1.0.js"></script>
```
を記述し、広告表示、オーバーレイ実装のAMPライブラリのスクリプトを読み込みます。

\<body\>タグ直後に下記のAMPタグを記述します。

```
<amp-sticky-ad layout="nodisplay">
  <amp-ad
    type="adsense"
    width="320"
    height="50"
    data-ad-client="ca-pub-xxxxx">
  </amp-ad>
</amp-sticky-ad>
```

以上で、AMPページにおいて、オーバーレイ広告(アンカー広告)を表示されます。
Wio LTE をMac OSX Sierra で動かすまで

SORACOMから１０月２６日に発売された、LTE回線付きのIoTデバイス、Wio LTEを早速買ってみました。
macOS Sierraで動かすまで少し迷ったので、備忘として書いておきます。
迷った理由
1. libusbのPathが違うエラー
２． プログラムはシリアル通信で書き込むわけではない（```/dev``` にデバイスが見つからなくてもよい）

## libusbのPathが違うエラー

<img width="797" alt="スクリーンショット 2017-10-27 0.02.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/135431/1a32a701-f9cc-eaba-9981-5905e99db807.png">

```/opt/local/lib/libusb-1.0.0.dylib``` に、libusbが無い！ってエラーが出ました。
自分の環境では、```/usr/local/opt/libusb/lib/libusb-1.0.0.dylib``` にすでに存在していたので、単純にリンクを貼ってしまいました。
これが正解かどうかは自信ありません。

```
$ sudo ln -s /usr/local/opt/libusb/lib/libusb-1.0.0.dylib /opt/local/lib/
```

## プログラムはシリアル通信で書き込むわけではない

ちゃんと [説明](https://github.com/SeeedJP/WioLTEforArduino/wiki/Setup-ja)を読んでいれば問題なかったのですが、今までArduinoはシリアル通信でプログラムを書き込んでいたので、Wio LTEを差し込んで出てきた、 ```/dev/cu.usbmodem14111``` を選択してプログラムを書き込もうとしたら、DFUデバイスが見つからないというエラーが出ました。

説明を読み直して、BOOTボタンを押しながらWio LTEを起動したら、うまくいきました。
DFUモードの時は、 ```/dev``` にはデバイスが見えないのが正解みたいです。

```
$ ls /dev/cu*
/dev/cu.Bluetooth-Incoming-Port		/dev/cu.lpss-serial2
/dev/cu.KosukeiPhone-WirelessiAP	/dev/cu.usbmodem14111
```

<img width="797" alt="スクリーンショット 2017-10-27 0.01.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/135431/061b991a-f0c9-a249-c191-44ff2572486f.png">
Cent OS 7開発用サーバを初期設定する

# はじめに
前回までの記事でGCP上にCentOS7のVMが起動し、SSH接続が完了しました。
今回は、サーバの基本設定をしていきたいと思います。
※これらの設定項目は個人的な主観によるものですので、適用の際は内容を十分に検討してください。

#### 更新履歴
- 2018.6.19 CentOS 7.5 向けに少し追記

#### 前回までの記事はこちら

* [GCPに共通鍵を追加する手順まとめ](https://qiita.com/ariaki/items/e225b815924d37bc19d5)
* [GCP Compute Engineを使ってLinuxサーバを始める](https://qiita.com/ariaki/items/1d4dbfeb41a4080a3f66)

## 注意点
以下に示すコマンドは全てrootユーザで実行される事を想定しています。
rootユーザへのログインは以下のコマンドで行います。

```
sudo su -
```

## 初期設定

### SELinuxの停止
色々と面倒なので、SELinuxを停止し、常時OFFを設定します。

かなり行儀が悪いですが、開発サーバなので勘弁してください。


```
setenforce 0
echo -e "SELINUX=disabled\nSELINUXTYPE=targeted" > /etc/selinux/config
```

## OSの基本設定

### パッケージの更新
OSにインストール済のソフトウェアパッケージを最新の状態に更新します。

```
yum clean all && yum -y update
```

### タイムゾーンの設定
- デフォルトのタイムゾーンを日本に設定します
- ハードウェアクロックをローカル時刻に合わせます

```
timedatectl set-timezone Asia/Tokyo
timedatectl status
echo "LOCAL" > /etc/adjtime
```

### 言語ロケールの設定
言語ロケールを日本に設定します。

```
echo 'LC_ALL="ja_JP.utf-8"' >> /etc/environment
echo 'LC_CTYPE="ja_JP.utf-8"' >> /etc/environment
localectl set-locale LANG=ja_JP.utf8
localectl set-keymap jp106
localectl status
```

### ファイルデスクリプタの上限解放
多くのファイルに同時アクセスする場合、ファイルデスクリプタが枯渇しないように拡張します。

```
echo -e "* soft nofile 65536\n* hard nofile 65536" >> /etc/security/limits.conf
```