OmniAICreator/Qiita-1.07M huggingface dataset:
Python > PEP8 > You should use two spaces after a sentence-ending period. > 例

[pythonic styleに関するまとめ(1):PEP8](http://qiita.com/jiangh52/items/f681642c3f138dac7005)
を読んでいて気になった以下の部分

> コメント
> 文書の句点後にスペースを二つ入れよう

原文は以下。
http://legacy.python.org/dev/peps/pep-0008/
> You should use two spaces after a sentence-ending period.

これについての議論は以下。
https://stackoverflow.com/questions/21571994/why-does-pep8-suggest-using-two-spaces-in-comments

その議論において紹介されている

> NPE answered Feb 5 '14 at 8:36
> I've had a look at the standard library source code, and my conclusion is that this particular aspect of the style guide is not followed consistently: some standard modules follow it and some don't.

順守している例
https://hg.python.org/cpython/file/32af4954e46a/Lib/email/contentmanager.py
の231行目以降。

> 
```py
 if cte == 'base64':
        data = _encode_base64(data, max_line_length=msg.policy.max_line_length)
    elif cte == 'quoted-printable':
        # XXX: quoprimime.body_encode won't encode newline characters in data,
        # so we can't use it.  This means max_line_length is ignored.  Another
        # bug to fix later.  (Note: encoders.quopri is broken on line ends.)
        data = binascii.b2a_qp(data, istext=False, header=False, quotetabs=True)
        data = data.decode('ascii')
```

Anotherの前に確かに２つの空白があるようだ。

推測であるが、英語などの文書においては単語間の空白が入る。文の区切りを明確にするために、文を2つの空白で区切るという考えのようだ。
日本語コメントでは単語間に空白は入らないので、同じルールを適用する必要性があるかどうか。
UI プレースホルダーをcssで作ってみる

## UI プレースホルダーをcssで作ってみる

 * 最近流行りのUI プレースホルダーを実装できそうな機会があったので試しに作ってみました。
 * 作り方を軽く調べてみたもののあまり情報が集まらなかったのでほぼオレオレ実装。
 * 理想としてはデータ取得後（任意）のタイミングでクラスを外すことでPlaceholderから本来のコンテンツに切り替わるような感じ。

参考にさせていただいた記事 
[流行りの UI プレースホルダーを html と css のみで作る方法 - Qiita](http://qiita.com/sottar/items/218cc304e377cd034c88)

### 完成品
![ui-placeholder-camp.png](https://qiita-image-store.s3.amazonaws.com/0/113074/c0e2e27d-097c-204d-8f4e-556435a90024.png)

### クラス外した時
![ui-placeholder-rmclass.png](https://qiita-image-store.s3.amazonaws.com/0/113074/eeaf66dd-cc12-72f1-7d71-49cdb8529a22.png)

### アニメーション（画質粗）
![ui-placeholder-compressor.gif](https://qiita-image-store.s3.amazonaws.com/0/113074/de807490-2d0a-f149-1f16-bac87b37c848.gif)

## 実装
* .ui_placeholderの付け外しで表示を切り替えます。JavaScriptで実行
* .ui_placeholderが外れるまでは、本来のコンテンツは`display:none;`で非表示にしてます。
* .dummy-〇〇にプレースホルダーとして表示するコンテンツを指定
* .dummy-textはinline要素にして背景色を指定することで、完成品のような表示になります。
* dummyのyのようにベースライン以下にはみ出ている文字の対策として`color:transparent;`を指定しています。
* ロード中のアニメーションは背景にグラデーションをかけて透過させたものを上に重ねて表示しています。

```html
<div class="contents_block ui_placeholder">
  <div class="img_block placeholder_img dummy-img">
    <img src="./sample.png">
  </div>
  <div class="text_block placeholder_text dummy-text">
    <p>ほげほげほげほげほげほげほげほげほげほげほげほげほげほげほげほげほげほげほげほげほげほげほげほげほげほげほげほげほげほげ</p>
  </div>
</div>
```

```scss
.contents_block{
  display: flex;
  max-width: 880px;
  padding:16px;
  border:solid 1px #ddd;
  align-items: top;

  .img_block{
    margin-right: 16px;
  }

  .text_block{
    line-height: 1.6em;
    font-weight: normal;
    word-break: break-all;
  }

  p{
    color: #666;
    margin: 0;
  }
}




//UI Placeholder
.ui_placeholder{

  position: relative;

  &::after{
    content: "";
    position: absolute;
    z-index: 100;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    opacity: 0.5;

    background: linear-gradient(45deg, #d6d6d6, #eaeaea, #bfbfbf, #fff, #a9a9a9, #dfdfdf);
    background-size: 800% 800%;
    animation: LodingAnimation 10s ease-in-out infinite;
  }

  //ロード中のアニメーション
  @keyframes LodingAnimation {
    0%{background-position:0% 50%}
    60%{background-position:100% 50%}
    100%{background-position:0% 50%}
  }

  $placeholder-color : #dfdfdf;

  .placeholder_img img{
    display: none;
  }

  .placeholder_text p{
    display: none;
  }

  .dummy-img{
    &::after{
      content: "";
      display: block;
      width: 160px;
      height: 100px;
      background-color: $placeholder-color;
    }
  }

  .dummy-text{
    &::after{
      content: "dummydummydummydummydummydummydummydummydummydummydummydummydummydummydummydummydummydummydummydummydummydummydummy";
      display: inline;
      color: transparent;
      background-color: $placeholder-color;
    }
  }
}

```

## まとめ
* 一応動きとしては理想通りになったはず(Chromeでしか試してない)
* 汎用性は高くないのでもっと賢いやり方あると思います。
render と redirect の違い


# はじめに
[Ruby on Rails Tutorial](https://railstutorial.jp/) をやっています。

rails の render と redirect の違いは言葉上では理解できるものの、腑に落ちていないと感じていたところ、この記事を教えてもらいました。[railsのrenderとredirect_toの違い](http://qiita.com/1ulce/items/282cccba1e44158489c8)。


上記を参考に MVC の流れに乗せてみたところ、少し「腑に落ちた」感がでてきたので書いてみます。

# render
controller の action を実行した結果、何らかの view が決定され、レンダリングされます。
![render.png](https://qiita-image-store.s3.amazonaws.com/0/27486/d6f423f6-17cb-3171-d6e6-36dc9756810d.png "render.png")


view は、以下のように決まります。

## A. デフォルトの view を表示する場合
action で view を指定しない場合、規約に従って、リソース名 や action名を元に、表示する view が決まります。

例）controller/users_controller の show アクションの場合
 => view/users/show.html.erb がレンダリングされます。


## B. 表示する view を指定する場合
render で明示的に view を指定すると、指定した view が表示されます。
例）

``` hoge_controller#hoge_action 
render 'show_follow'
```

create アクションの後に、show ページを表示したい場合など、view を変更したいケースは頻繁にあると思います。


# redirect
redirect_to は、view の表示には直接は関係なく、新たな HttpRequest が発行されます。※GET のみ（下図の 4. ）
新たな request が発行された後は下図の 5. 以降で、render の図の 2. 以降と同じです。


![redirect.png](https://qiita-image-store.s3.amazonaws.com/0/27486/ce6ac0d2-7a5d-1f7c-0bfc-fadd70e0468e.png "redirect.png")

例）

``` hoge_controller#hoge_action 
redirect_to users_url
```

view の表示と直接は関係ないと書いたものの、redirect_to で呼び出せるのは GET のみであるため、実質的には、view を表示するために別の request を呼び出すといった使い方となると思います。
例えば、更新処理は私（create action）がやるから、その後の表示はあなた（ users_url で呼び出される action ）に任せた！という雰囲気でしょうか。


# さいごに
図にしてみると、説明が腑に落ちるのと同時に、気づきもありました。

* （当たり前ですが、）view を表示するためには、 render が必要です。（記述は省略できます）
* 何をどこで render し、どのアクションで利用するのか（ redirect するのか）交通整理が必要です。まあ、画面の遷移をちゃんとイメージしましょうということですね ^^;;
perhaps the designated entry point is not set?　が表示された時の対処方法

超初心者swiftエンジニア、すずずんです！
どんどんレベルの高いアウトプットができるように頑張ります٩( 'ω' )و

コードを書きおわり、エラーがないことを確かめて、シミュレーターに繋いでみると、
画面が真っ暗。。。え、何か読み飛ばしたかな？？
※今は教科書の通り写しているだけ

おまけに、デバックエリアにこのようなものが、、、

`[Application] Failed to instantiate the default view controller for UIMainStoryboardFile 'Main' - perhaps the designated entry point is not set?
`
まだまだ初心者なので、これだけでプチパニックです。
でも解決できたので、解決方法を紹介します!
##解決方法
上記のメッセージが表示されてしまった時は、「Is Initial View Controller」にチェックできていない可能性があります。
設定方法は、ユーティリティエリアのアトリビュート・インスペクタにある、「Is Initial View Controller」部分にチェックをつけるだけ!!

![qiita20170602.png](https://qiita-image-store.s3.amazonaws.com/0/170690/80d65272-80bb-931b-c847-37d5d3589ae1.png)

これで、画面が表示されるようになりました！(達成感)

###ちなみにIs Initial View Controllerとは
ここまででもうお気づきだと思いますが、Is Initial View ControllerにチェックをされたView Controllerは、デフォルトで表示されることになります。

チェックをつけると、必ず、このような矢印がデフォルトの画面に向かってつきます。
![qiita2017060202.png](https://qiita-image-store.s3.amazonaws.com/0/170690/d6614bc6-fdb6-5023-8e93-a5c26f13dc9f.png)


私みたいに忘れずに設定してくださいね〜〜〜

おわり。
Mac | ターミナルでURLをクリックしてブラウザを開く

今日までまったく知らなかった。

# iTerm2

## Command + クリック

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/f276554e-3467-e081-5004-2956ea7dc8ed.png)

## 結果

開けた。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/609c83af-da97-6505-48fa-441b33acbcab.png)

## 標準出力からも開ける


![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/26a393bb-5bb6-29e8-2568-18cc826c0c37.png)

## ブラウザではなくFinderも開ける

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/b6b774f9-868c-f780-02c6-034e130bbc13.png)

## 結果

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/f31deb91-e50a-97dd-496c-8f24129cfcb2.png)

# Mac 標準のターミナルの場合

## Command + ダブルクリック

でOKだった。 (URLのみ)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/8317b787-55c5-208f-62b8-15ee62fe04ac.png)

# 環境

- iTerm2 3.0.12

# 参考

- [terminal - In iTerm2 Command Click on URLS does not work when inside a tmux session - Ask Different](https://apple.stackexchange.com/questions/147114/in-iterm2-command-click-on-urls-does-not-work-when-inside-a-tmux-session)








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
[git] mvして更に変更してしまった状態で、mvだけコミットを分ける方法

mvした後にうっかりコミットをし忘れてしまうことってありますよね。[ここ](http://qiita.com/yukimura1227/items/fbb076db61a2e43a32e3)にも書いてあるように、mvした状態で一度renameコミットを作らないとあとで歴史を辿れない場合があります。

ここではmvしたあとに変更してしまった状態で、変更を失わずにrenameのコミットのみ作る方法を紹介します。

## 前提

```
$ ls
a
$ git status
On branch master
nothing to commit, working tree clean
$ mv a b
$ ls
b
$ echo "modified" >> b
$ git status
On branch master
Changes not staged for commit:
  (use "git add/rm <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        deleted:    a

Untracked files:
  (use "git add <file>..." to include in what will be committed)

        b

no changes added to commit (use "git add" and/or "git commit -a")
```

ファイル`a`を`b`にリネームし、更に変更をしています。

## 解決策1

```
$ git add b
$ git stash
$ git status
On branch master
nothing to commit, working tree clean
$ mv a b
$ git commit -m 'rename a to b'
$ git stash list
stash@{0}: WIP on master: 90d4e0c first
$ git checkout stash@{0} .
$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        modified:   b
```

こんな感じです。

ちなみに普通に`git stash pop`しようとすると以下のようなエラーになります。

```
$ git stash pop
CONFLICT (rename/delete): b deleted in Stashed changes and renamed in Updated upstream. Version Updated upstream of b left in tree.
$ git status
On branch master
Unmerged paths:
  (use "git reset HEAD <file>..." to unstage)
  (use "git add <file>..." to mark resolution)

        added by us:     b

no changes added to commit (use "git add" and/or "git commit -a")
```

また、checkoutするのではなくて`rm b`した後に`git stash pop`してもCONFLICTせずにmergeできます。(こちらの方法のほうがstash履歴が残らずきれいかもですね)

## まとめ

- リネームと変更のコミットを後から分けたければ、
    1. git stash
    2. mv
    3. commit
    4. checkout stash@{0} .

もっと良い方法があればおしえてください。
vue.js templateタグをv-forで回すとIEでは動かない

タイトルそのままなのですが、


```js
vue = new Vue({
  el: "#content",
  data: function () {

    var data = {
      testArray: ["banana","apple","kiwi","watermeron"],
    };
    return data;
  },
  created: function () {},
  computed: {},
  methods: {}
});
```

```html
<div id="content">
  <table>
    <template v-for="item in testArray">
      <tr>
        <td>{{item}}</td>
      </tr>
    </template>
  </table>
</div>
```
こうかくと、chromeとfirefoxでは動きますが、IEでは動きません。
trをv-forで回したら動いた。
ruby on rails & mysql use force index

datatablesのscrollerでOFFSETがある程度を超えると
mysqlのオプティマイザがおかしなindexを使って遅くなったのでforce indexを使いたくなったので調べた。

scopeをmodelに記述。ちょっと意味が分からなかったけどノールックで追加。


```ruby
class NAME::User < ActiveRecord::Base
```
User classの一番下にとりあえず追加しておいた。

USE INDEX

```ruby
  scope :use_index, ->(index) { 
    from("#{self.table_name} USE INDEX(#{index})")
  }
```

FORCE INDEX

```ruby
  scope :force_index, lambda { |*indexes|
    from("#{self.table_name} FORCE INDEX(#{indexes.join(', ')})")
  }
```

使い方

```ruby
users = @user.users.force_index(:index_users_on_test_name).where(user_flag: true, disabled: false)
```

参考
http://stackoverflow.com/questions/13904035/use-specific-mysql-index-with-rails
特定の1行（HTML）に紐づいているJSを特定する方法はありますでしょうか？

初めて投稿します！
表題の件、一番効率よく割り出す方法が知りたいです。
開発ツールなどを使用するやり方などが存在するのでしょうか？

どうぞよろしくお願いいたします。
sass 縦書き用のmixin

# 縦書き用のmixin

```sass
$set_prefix: -webkit-, -moz-, -ms-, -o-, '';
//writing-mode
@mixin writing-mode( $direction ) {
	@each $prefix in $set_prefix {
		@if $direction == 'initial'{//無効化したいときを追加
			#{$prefix}writing-mode:initial;
		} @else{
			@if $prefix == '-ms-'{
				#{$prefix}writing-mode: tb- + $direction;
			} @else {
				#{$prefix}writing-mode: vertical- + $direction;
			}
		}
	}
}

//使用時
@include writing-mode(rl);
@include writing-mode(initial);
```

※firefoxで li に style writing-mode(rl) を使用したとき、横幅が広がってしまっていた。
原因を突き止めてはいないがwidthを指定することで回避できる。
xCodeからiTunesにアプリをアップロードする時のエラー対策(-22421)

#XcodeからiTunesにアプリをアップするときに以下のエラーが出た時の対策

![eV1e7.png](https://qiita-image-store.s3.amazonaws.com/0/108475/7fa5b75a-83be-1b1a-086a-eb8b444cff3b.png)
原因は不明ですが、おそらくアップルのサーバーの問題で何回もアップロードできない現象があるらしい。

#対策
手動でアップロードする方法があります。
アプリケーションのXcodeにマウス右クリックするとパッケージ内容を表示が見えるのでそれをクリック
![スクリーンショット 2017-06-02 9.59.41.png](https://qiita-image-store.s3.amazonaws.com/0/108475/cfed8e6c-c259-64e5-1828-f91f00cfab3b.png)

/Contents/Applications/Application Loaderを起動して手動でアップロード
![スクリーンショット 2017-06-02 10.04.29.png](https://qiita-image-store.s3.amazonaws.com/0/108475/e0290bf3-1bf4-6e23-2e46-b9e850ffc171.png)

![スクリーンショット 2017-06-02 10.07.24.png](https://qiita-image-store.s3.amazonaws.com/0/108475/0459fa49-7f56-5d7a-fa5c-e3022281ff66.png)

![スクリーンショット 2017-06-02 10.08.03.png](https://qiita-image-store.s3.amazonaws.com/0/108475/597b1921-8302-04e6-9505-f5dd32aaa761.png)
Anaconda4.4.0 最初の設定 for Windows

Anaconda 4.4.0(Python 3.6 version) Windowsの最初の設定をメモ代わりに書いておきます。

## 実行環境
Windows 10 (64bit)
Anaconda 4.4.0 (64bit)

## 準備
Anacondaのパスを通す。
環境変数PathにC:\Users\xxx\Anaconda3\Scriptsを追加。
(xxxは自分のインストールフォルダを設定)

まず、設定ファイルを作成します。
ここにたどり着くのに結構かかりました。

```
> jupyter notebook --generate-config
```
Anacondaをインストールした場所に.jupyter/jupyter_notebook_config.pyが生成されます。


## ホームディレクトリの変更
最初にJupyterが立ち上がるフォルダーを好きな場所に変更します。


```
c.NotebookApp.notebook_dir = 'D:\Sukina\basyo' # 好きなフォルダのパスを記述する
c.NotebookApp.open_browser = False # 勝手にブラウザが立ち上がらないように
```

Jupyterを立ち上げると、勝手にブラウザも立ち上がって面倒だったので、Falseに設定。
Jupyterを立ち上げてから、http://localhost:8888 にアクセスすればokです。


ショートカットからJupyterを立ち上げる人は
***重要：ショートカットの「リンク先(T):」の末尾にある%USERPROFILE%の文字を削除します。***
そうしないと、設定ファイルを読み込まれないようです。(はまりました・・・)

## OpenCVのインストール
Anaconda4.4.0(2017/06/02最新)だと
condaでインストールできるPython3.6のOpenCVパッケージは無いようです。

```
> conda install -c https://conda.binstar.org/menpo opencv3
Fetching package metadata .............
Solving package specifications: .

UnsatisfiableError: The following specifications were found to be in conflict:
  - opencv3 -> python 2.7*
  - python 3.6*
Use "conda info <package>" to see the dependencies for each package.
```
ネットで検索すると、Python3.5 , OpenCV3.1の組み合わせが出てくるので
3.5の仮想環境を構築して、OpenCVをインストールしてみようと思います。
特に動かしたいコードは無いし、折角なのでOpenCV3をインストールしてみます。

### Python 3.5の仮想環境構築
Anacondaで、Python3.5の仮想環境を構築します。
createで、簡単に3.5のインストールと仮想環境の構築ができます。
環境名はpy35です。activateして、環境を変更するとプロンプトが変わります。


conda createにanacondaを入れないと、単にPython3.5を入れただけに
なってしまうので、変更しました。

~~> conda create --name=py35 python=3.5~~

```
> conda create --name=py35 python=3.5 anaconda
Fetching package metadata ...........
> activate py35
(py35) 
(py35) conda install -c https://conda.binstar.org/menpo opencv3
```

再度、conda経由でインストールすると、無事OpenCVがインストールできました。
一応、確認。

```
(py35) python
>>> import cv2
>>> cv2.__version__
'3.1.0'
```
無事、OpenCV3.1がインストールできました。


[追記]
Jupyterで選択できるように、カーネルを追加します。
Jupyter：[Kernel]->[Change Kernel]->[py35]

```
(py35) ipython kernel install --user --name=py35 --display-name=py35
```

Jupyterのカーネル選択は、[Jupyterで複数カーネルを簡単に選択するための設定](http://qiita.com/supersaiakujin/items/50def6f33b79f9a61b18)を参考にしました。
というかそのままです。
SourceTree > v2.1.2.4 > v2.0に見られたプッシュ時の不具合がなくなった

```txt:動作環境
Windows 7 Pro (32bit)
SourceTree v2.1.2.4
```

SourceTreeのv2.1.2.4が利用可能になっていた。

SoureTree(v2.0.20.1)を起動時に「Update '2.1.2.4' is available. Do you wish to update?」ダイアログが表示されるようになっていた。
( 公式のサイトからのダウンロードでは見つからず )

updateしてから以下の不具合が修正されたかを確認した。
http://qiita.com/7of9/items/b74e7a326f77d1dcf433

### v2.0.20.1でのプッシュ

<img width="444" alt="2017-06-02_09h14_53.png (26.0 kB)" src="https://img.esa.io/uploads/production/attachments/6206/2017/06/02/21741/c04d4cfd-0eef-4ef1-b31d-1c5ddf1ea236.png">

### v2.1.2.4でのプッシュ

<img width="445.5" alt="2017-06-02_09h50_53.png (25.9 kB)" src="https://img.esa.io/uploads/production/attachments/6206/2017/06/02/21741/db8dc602-cf42-4c28-9a4e-2b595f4b1600.png">

おかしなブランチが表示されなくなった（バグ対応された）。
アトミックなシンボリックリンク更新

# はじめに
Linuxでシンボリックリンクの参照先を更新したい場合、以下のようにするのが簡単です。

```shell-session
> ln -snf src dst
```

今回他のプロセスが`dst`にアクセス中に更新したかったので、この方法で安全に更新できるかどうか調べてみました。
確認した環境はRHEL7.2/Gentoo Linuxですが大抵のLinux環境で同じような挙動になるのではないかと思います。
（POSIXとかで決まってそうな気もしますが調べてません…）

# `strace`で調べる

まず`ln`コマンドでの更新の様子を見てみます。

```shell-session
> strace ln -snf src dst
...
symlink("src", "dst")                   = -1 EEXIST (File exists)
unlink("dst")                           = 0
symlink("src", "dst")                   = 0
...
```

このように`ln`は1コマンドですが、システムコール的には「`unlink`で削除してから`symlink`でシンボリックリンクを作る」という実装になっているようです。
そのため`unlink`と`symlink`の間に`dst`にアクセスされると失敗する可能性があります。

# 更新中に割り込めるか？
2つのシステムコールの間にアクセスされる可能性はありそうだったので、
実際に起きるかどうか以下のようなシェルスクリプトで実験してみました。

```bash:ln.sh
#!/bin/sh
echo test1 > src1
echo test2 > src2
while :
do
    ln -snf src1 dst
    ln -snf src2 dst
done
```

```bash:cat.sh
#!/bin/sh
while :
do
    cat dst
done
```

`ln.sh`が`dst`を`src1`/`src2`に交互に更新し、`cat.sh`が`dst`を読みます。この2つを同時に実行すると以下のような結果になりました。

```shell-session
> ./cat.sh
test1
test2
test1
test2
test1
cat: dst: そのようなファイルやディレクトリはありません
test2
test1
test2
test1
test2
```

上記は抜粋ですが20~30回に1回程度は`cat`に失敗するようです。

# アトミックなシンボリックリンク更新

先ほどの`ln.sh`の代わりに

```bash:ln_atomic.sh
#!/bin/sh
echo test1 > src1
echo test2 > src2
while :
do
    ln -s src1 tmp
    mv -Tf tmp dst
    ln -s src2 tmp
    mv -Tf tmp dst
done
```

この`ln_atomic.sh`を使ってみると

```shell-session
> ./cat.sh
test1
test2
test1
test2
test1
test2
test1
test2
test1
test2
```
という感じで`cat`の失敗は発生しなくなりました。

実際にシンボリックリンクを更新しているのは`mv`コマンドです。このコマンドは同一ファイルシステム内に限り、単一のシステムコール`rename`で実装されています。従って更新中に割り込まれることはありません。

ちなみにファイルシステム間の`mv`は単にファイルコピー＋削除になるようです。
そのため`src`と`dst`はファイルシステムが異なっていてもよいのですが、`tmp`と`dst`は同一ファイルシステムになければいけません。

# まとめ
シンボリックリンクをアトミックに更新したい場合は以下のようにするといいようです。
（`tmp`と`dst`が同一ファイルシステムになるよう注意）

```shell-session
> ln -s src tmp
> mv -Tf tmp dst
```
Ubuntu14.04 + Windows10 のデュアルブート環境を構築する

こちらを参考にして環境構築。所要時間合計すると3時間程度。
この記事通りにやれば、だいたいうまく行くはず。
http://www.iandprogram.net/entry/2015/09/15/115918

家のthinkpadにwin10が入ってたのだが、ubuntuも使いたくなったのでデュアルブートにした。
ubuntu16がおすすめと書いてはあるが、現状14で動くことを確認されてるライブラリがエラーになる確率もあり、無駄な作業を増やすことになりかねないので14を入れた。

#個別の作業メモ
##USBからubuntuを起動する。

bios起動でbootから起動順を書き換えた。
https://support.lenovo.com/jp/ja/solutions/ht117661

USB-FFD:usbのFDD(フロッピーディスクドライブ (Floppy Disk Drive) )
USB-HDD:これを上にあげた。

要は普通のHDにwindowsブートローダが入っててその関係でwindowsが一番に起動してたんだろから、USBの中のブートローダを先に起動するように変えればいい。

##インストールでパーティションを変えれない場合
プライマリパーティションが4つ以上登録できない制限があるそうな。
自分の場合は１個いらないのを消した。
gpartedソフトを使用。



#あとはインストールがすんなり終わった。
ありがとうございます。
Microsoft TeamsへZabbixのアラートを飛ばす

# Microsoft TeamsへZabbixのアラートを飛ばす
Teamsのチャネルへはメールでポストできますが、Zabbixからダイレクトにポストできた方がカッコイイよね。
かなり手抜きな作りなのはご容赦を。

## 環境
* Ubuntu 12.04
* Zabbix 2.2

## TeamsのチャネルにIncoming Webhookコネクタを作ってURLを取得する
![2017-06-02_084424.png](https://qiita-image-store.s3.amazonaws.com/0/58592/bbf51df2-0e68-ad8f-3f5a-9a2af571c39d.png)

## スクリプトを /usr/lib/zabbix/alertscripts へ作る

```sh:teams.sh
#!/bin/bash

status="$1"
message="$2\r \n$3"
payload="{\"text\":\"${message}\"}"
curl -m 5 --data "${payload}" https://outlook.office.com/webhook/...
```
6行目のURLにはWebhookのURLを指定します。
Webhookへメッセージを投げる際に改行を入れたいときは`\r\n`では改行されず、間にスペースを入れて`\r \n`にしないとうまくいきませんでした。

## スクリプトに実行権限を付ける

## Zabbixに新規メディアタイプを作る
![2017-06-01_165006.png](https://qiita-image-store.s3.amazonaws.com/0/58592/affa55cb-2f7f-a4cf-8b6a-5d67c6356573.png)

## ユーザにメディアを設定する
![2017-06-01_165106.png](https://qiita-image-store.s3.amazonaws.com/0/58592/01493522-5d9f-c2d3-73b1-5165b9500519.png)
送信先にはWebhook URLを指定していますが何か文字列が入っていればいいようです。

## 結果
こんな感じでメッセージが飛んできます。
![2017-06-01_165310.png](https://qiita-image-store.s3.amazonaws.com/0/58592/b2737cf3-85ae-eaa3-7465-6ae7a87e9ef8.png)
AnsibleでLinuxユーザ作成

#はじめに
*  試行用の最小コードのため、ベストプラクティスに従ったスクリプト構成になっていません。
*  パスワードが平文でスクリプトに記載されているため、本運用時はansible vault などの利用を検討して下さい。
*  ansible 2.3.0.0, RHEL 7.2 の環境で試行しました。

#接続対象サーバの設定
```ini:inventory/test_inventory.ini
[test_servers]
localhost
ansible-target-01
```

#スクリプト本体
```yaml:create-user.yml
---
- hosts: test_servers
  become: yes  #sudoで実行する
  vars_files:
    - user-list-var.yml
  tasks:
  - name: Create user
    user:
      #state: absent #ユーザを削除するときはコメントアウトを外す
      name: "{{ item.name }}"
      password: "{{ item.password }}"
      groups:  "{{ item.group }}"
      shell: /bin/bash
    with_items:
      - "{{ users }}"
    when: users #usersが1件以上の場合のみ実行
```

#作成対象ユーザのリスト
```yaml:user-list-var.yml
users:
  - { name: 'user01', uid: 1001, group: 'users', password: "{{ 'passw0rd'|password_hash('sha512') }}", update_password: 'on_create', comment: 'user01' }
  - { name: 'user02', uid: 1002, group: 'users', password: "{{ 'passw0rd'|password_hash('sha512') }}", update_password: 'on_create', comment: 'user02' }
```

#実行
```bash
ansible-playbook -i inventory/inventory.ini create-user.yml --ask-pass --ask-sudo-pass
```

#参考

* [user \- Manage user accounts — Ansible Documentation](http://docs.ansible.com/ansible/user_module.html)
* [Ansible ～userモジュール～ \- Qiita](http://qiita.com/moiwasaki/items/bab0f4c8d0dbf361afa4)
  * [FAQ - Ansible Documentation - how do i generate crypted passwords for the user module ](http://docs.ansible.com/ansible/faq.html#how-do-i-generate-crypted-passwords-for-the-user-module)
* [Create user from user list by Ansible \-ユーザを一括登録する方法\- \- Qiita](http://qiita.com/ainamori/items/0c5835fa77c68565c30c)
* [【Ansible】開発者ユーザー追加・削除のベスト・プラクティスを考える - Qiita](http://qiita.com/KeijiYONEDA/items/011b78b12022202d4ea1)
pythonic styleに関するまとめ(2):その他かき集め

#概要

pythonコード規約について調べてみました。
[前編](http://qiita.com/jiangh52/items/f681642c3f138dac7005)は単にPEP8について自分なりにまとめましただけで。
こちらは他のソースみた内容をまとめてみました。
自分はなるほどと思った内容をチョイスしてます。

#見たページ
[The Hitchhiker's Guide to Python](http://python-guide.readthedocs.io/en/latest/writing/style/)
[Be Pythonic](http://www.cafepy.com/article/be_pythonic/)
[Code Like a Pythonista: Idiomatic Python](http://python.net/~goodger/projects/pycon/2007/idiomatic/handout.html#don-t-reinvent-the-wheel)

#全般

### わかり易さを重視しよう
できるだけ黒魔術を避け、わかりやすいコードにしよう
**BAD**

```python
def make_complex(*args):
    x, y = args
    return dict(**locals())
```
**GOOD**

```python
def make_complex(x, y):
    return {'x': x, 'y': y}
```
### 関数変数のタイプと注意点
* できるだけ可変長変数*args, **kwargsを避けましょう
    * 基本的にわかりづらい
* 「念のため」の前提での変数を用意しない
    * 意外と消しづらい、必要な時に追加した方がまし

### We are all responsible users
pythonにprivateキーワードがないらしい。文化としては、各々が責任を持ってコーティングしようという感じらしい。キーワードがないが、規約はある。いわゆるpublicにしたくないメソッドは_をprefixにすべき

### Withでファイルを開け
何があってもファイルが閉じられることが保証できる

```python
# Bad
f = open('file.txt')
a = f.read()
print a
f.close()

# Good
with open('file.txt') as f:
    for line in f:
        print line
```

# Tips
* enumerate, zipやunpackingを積極的に使おう

```python
# Enumerate
for index, value in enumerate(pi_nums):
    print(index, value)
# 1 3
# 2 1
# 3 4
# 4 1
# 5 5

# Zip
for p, f in zip(pi_nums, fibonacci_nums):
    print(p, f)
# 3 1
# 1 1
# 4 2
# 1 3
# 5 5

#Unpacking after python3
a, *rest = [1, 2, 3]
# a = 1, rest = [2, 3]
a, *middle, c = [1, 2, 3, 4]
# a = 1, middle = [2, 3], c = 4

```

* 不要な変数に_を使おう。例えばTastyを10回printしたい場合

```python
for _ in range(10):
    print('Tasty')
```

* 同じobjectのリストを作るには * を使う。2d-listを作るにはlist-comprehensionを利用すべき

```python
a = [1] * 4
# a = [1, 1, 1, 1]

# WRONG
b = [[1] * 3] * 3
# b = [[1, 1, 1], [1, 1, 1], [1, 1, 1]]
# Because when
b[0][0] = 2
# b = [[2, 1, 1], [2, 1, 1], [2, 1, 1]]

# RIGHT
b = [[1] * 3 for _ in range(3)]

```
swift3で同期処理がうまくいかない

画像処理や動画処理ってやたら処理が重いなと思って処理してる間はインジケーターかもしくは処理に時間がかかる旨をユーザーに伝えたいと思いSwift3のGCD周りを調べ実装してみたんですけど中々うまくいきませんでした。

下記のように`queue`を使って画像処理するから時間がかかるということをアラートかインジケーターでお知らせしてから、画像処理を加えたかったんですけど、こうしても結局画像の処理が終わってViewにレイアウトが描画された後にアラートやインジケーターが実行されてしまいました。多分、僕の使い方が悪いだけですよね

```swift
// グループを生成
let group = DispatchGroup()
let queue1 = DispatchQueue(label: "jp.classmethod.app.queue1")

// キューとグループを紐付ける
queue1.async(group: group) {
    print("画像処理するから時間がかかるということをアラートかインジケーターで実装")
}

// タスクが全て完了したらメインスレッド上で処理を実行する
group.notify(queue: DispatchQueue.main) {
    print("画像処理入りま〜す")
}
```

# 代替案

ということで、不恰好な逃げ策として[こちら](http://studio.beatnix.co.jp/develop/swift/delay/)のサイトを参考にさせていただきました。

```swift
print( "現在" )
print( "画像処理するから時間がかかるということをアラートかインジケーターで実装" )
let dispatchTime: DispatchTime = DispatchTime.now() + Double(Int64(1.0 * Double(NSEC_PER_SEC))) / Double(NSEC_PER_SEC)
DispatchQueue.main.asyncAfter(deadline: dispatchTime, execute: {
    print( "画像処理入りま〜す" )
})
```
上記のように実装することで、とりあえず同期処理的な動きを実現させることができました。「A」という処理が終わった後に「B」を実行みたいな本当の同期処理的を実現させには多少工夫をしなきゃいけませけど、とりあえず、なんでもいいから「A」の後に「B」じゃあ！って感じには使えそうでした。

もっと賢い方法があれば教えてください...orz


# 参考

[[Swift 3] Swift 3時代のGCDの基本的な使い方](http://dev.classmethod.jp/smartphone/iphone/swift-3-how-to-use-gcd-api-1/)
[【Swift】Swiftでの遅延処理の実装（Swift3の場合も追記）](http://studio.beatnix.co.jp/develop/swift/delay/)
[swift3で同期処理がうまくいかない](http://off.tokyo/blog/2017/06/02/swift3%E3%81%A7%E5%90%8C%E6%9C%9F%E5%87%A6%E7%90%86%E3%81%8C%E3%81%86%E3%81%BE%E3%81%8F%E3%81%84%E3%81%8B%E3%81%AA%E3%81%84/)
Mastodon+Dockerで.envを紛失してしまったので頑張って復元

一人丼なMastodonを[公式のDocker](https://github.com/tootsuite/documentation/blob/master/Running-Mastodon/Docker-Guide.md)で走らせていたのだが、`.env.production`のバックアップを取ろうとした際に誤って上書きして内容を失ってしまった。

残念ながら現在のDockerfileではこのファイルはコンテナ内にはコピーされていないため復元は不可能ではなかったが一手間必要だった。

あくまでも「当該envを使っているコンテナが実行中であること」を前提とする。

## 実行中のコンテナに入り、環境変数を取り出す

`exec`を使ってコンテナに入る。とりあえずシェルを起動すればいろいろ作業しやすいだろう。

```shell-session
$ docker exec -it mastodon_web_1 sh
```

Dockerコマンドを直接叩いたが`dockr-compose`からでも良かった。

```shell-session
$ docker-compose exec web sh
```

いずれかを叩けば実行中のコンテナ内でシェルセッションを開始できる。
とりあえずどんな方法でもいいのでコンテナから環境変数を取り出そう。慌ててたのであまり考えずに行ったが、コピペしやすい`env`を扱いやすいようにソートした。

```shell-session
# env|sort -d
```

実行中のコンテナに設定されている環境変数が取得できたのでとりあえずこれをメモっておく。

コンテナからは`exit`とかなんとかで脱出しておｋ．

## `.env.production` を一から作る
取り出したenvは`.env.production`に書くべきでない余計な項目が含まれてい、順番もバラバラになってしまっているのでそのままではもちろん使い物にならない。

最新の[.env.production.sample](https://github.com/tootsuite/mastodon/blob/master/.env.production.sample)を用意して重複項目を反映していく。まあ最初に設定したときの編集箇所を覚えていればそれを。

最低限編集が必要なのは

- `LOCAL_DOMAIN`, `LOCAL_HTTPS`
- secret 3つ
- メールサーバー周り

あとは必要に応じてS3やCDN周りの設定となる。
(DB,Redisは通常そのままのはず)

自分は確認のしやすさと万が一を考慮してローカルで作業したが別に自信があるならば直接やっても死なないんじゃないかな……
編集したものを`.env.production`として元の場所に保存する。


## コンテナ再起動
コンテナを再起動して正常に動作している(既存データ、TL、フェデレーション送受信、ユーザー登録、画像アップロードなど)ことが確認できればおそらく復元完了。

二度同じ失敗をやらかしてしまわないためにほかディレクトリにコピーしたりしてS3とかにもrcloneとかでバックアップを取っておくといいでしょう。

----

## Q. 生きてるコンテナが無い状態でやらかしたんだけど
知らん、諦めろ(手はあるの？教えて山田先生)
React Nativeのインストールとweb版からの移植ではまったこと




今回流行りのreact nativeを試してみたく私用Macマシンと会社用Macマシンの2台にインストールしてみたのだが、片方は10分もかからずにインストールが終わってめでたくhello worldが拝めたものの、もう片方はがっつりハマったのでそのときのトラブルシューティングやらを少しまとめてみました

react-native-cli: 2.0.1
react-native: 0.44.2
xcode: 8.3.2


# react-native run-iosでこけた
どきどきわくわく、初の起動コマンド！
だが、しかし、、、、


## port8081が使えないために落ちる
こんなエラーが吐かれる

```
** BUILD FAILED **


The following build commands failed:
	PhaseScriptExecution Start\ Packager ${PROJECT_HOME}/ios/build/Build/Intermediates/React.build/Debug-iphonesimulator/React.build/Script-006B79A01A781F38006873D1.sh
(1 failure)

Installing build/Build/Products/Debug-iphonesimulator/プロジェクト名.app
An error was encountered processing the command (domain=NSPOSIXErrorDomain, code=2):
Failed to install the requested application
An application bundle was not found at the provided path.
Provide a valid path to the desired application bundle.
Print: Entry, ":CFBundleIdentifier", Does Not Exist

Command failed: /usr/libexec/PlistBuddy -c Print:CFBundleIdentifier build/Build/Products/Debug-iphonesimulator/プロジェクト名.app/Info.plist
Print: Entry, ":CFBundleIdentifier", Does Not Exist
```

この場合、port:8081 が本当に使われているか確認
```sudo lsof -i :8081```
何かしら出てきたらそのportは使用中
(McAfeeのアンチウイルスソフトとかが8081を使っている場合があるみたい)
→[公式](https://facebook.github.io/react-native/docs/troubleshooting.html#content)

解決方法は[ここらへん](https://stackoverflow.com/questions/30216417/react-native-port-8081-already-in-use-packager-is-either-not-running-or-not-r)に載っていたが、この通りやってもダメだった


なので原始的に8081でgrepして、Binaryっぽいやつ以外でヒットしたものを地道に8999とかに修正したらこのエラーは消えた

```cd {initで作成したプロジェクト}```
```grep "8081" -nR ./```



## watchmanでディレクトリがないよと怒られる
```
Loading dependency graph...XXXXXX while computing sockname: failed to create /usr/local/var/run/watchman/XXXXXX-state: No such file or directory

Watchman:  watchman --no-pretty get-sockname returned with exit code=1, signal=null, stderr= XXXXXX: [XXXXXX] while computing sockname: failed to create /usr/local/var/run/watchman/XXXXXX: No such file or directory
```

本来は自動で作成してくれそうなものだがなかった
これは普通に
```/usr/local/var/run/watchman/```
にアクセスできるよう足りないディレクトリをmkdirで作成すればエラーは消えた
私の場合は、runとwatchmanがなかった




# web用のReactを移植したらこけた
そんな簡単にはいかないだろうけど、見よう見まねでnative版へ移植するも、、、


## jsxを認識してくれずエラー
```
UnableToResolveError: Unable to resolve module `Hoge.jsx` from `index.ios.js`: Directory Hoge.jsx doesn't exist
```

拡張子をjsxからjsに変えたらエラーは消えた

## よくわからんObjectまわりでエラー
```
Expected a component class, got [object Object].
```

divタグなどが残っていると発生する
View, Text, Imageタグなどに適宜置き換えましょう

## cssをreact native用に書き換える
[react-native-css](https://github.com/sabeurthabti/react-native-css)という便利なライブラリがあるので使用
ただ実行するとまたもや以下のエラーが
```
ReferenceError: Unknown plugin "transform-runtime" specified xxx
```
[ここ](https://github.com/facebook/react-native/issues/14843)を参考に
```
rm -rf ./node_modules/react-native-css/.babelrc
```
を実施したらうまくいった
class名をstyleに移す際に、BEM形式だとmodifierのハイフンはreact naitive的にはNGになるのでアンダースコア二つなど適宜置き換える必要があります
CLionでリンクオプションを追加

#前書き（CLionの宣伝）
最近C言語の学習にCLionを使い始めました。
vimとかemacsとかでがりがり書いたものをprintfで表示したりGDBでデバッグ。。。。みたいなのがが苦手でIDEに逃げてきました。
デバッグがとてもしやすいので、プロフェッショナルな方だけでなくC言語を勉強中の学生さんとかにもお勧めです。
メモリの消費多めですがMacでもWindowsでもUbuntuでも大丈夫です。
ポインタとか文字列の扱いとかの動きが目に見えてわかるので現代っ子にはうってつけでしょう。
Android Studioとか触ったことがある人ならなおさら余裕です。
ふつうは有料ですが教育機関のメールアドレス持ってたらタダで使えます。

[CLionのセットアップ方法と簡単な使い方](http://qiita.com/syu_chan_1005/items/63a9fac5d859597755de)
[C/C++のIDEとしてCLionがマルチプラットフォームで便利](http://qiita.com/sifue/items/a6d33d0d75f32cf0c728)

#タイトルの問題
リンクオプションが必要なpthread.hとかmath.hを使う時
普通にターミナルでコンパイルするときは-lpthreadとか-lmを付けるけど、
IDEで実行ボタンをポチーでもその辺うまくやってくれると思っていた私が平成生まれでした。

#解決策
自動で生成されるCMakeLists.txtだと

```CMakeLists.txt
cmake_minimum_required(VERSION 3.7)
project(test)

set(CMAKE_C_STANDARD 99)

set(SOURCE_FILES main.c defs.h)
add_executable(txtcp ${SOURCE_FILES} defs.h)
```
とかですが

例えばpthread.hをインクルードするとリンクするときにフラグがいるのでこのまま実行ボタンをポチっとやってもエラーが出ます。
こんな感じに編集しましょう。

```CMakeLists.txt
cmake_minimum_required(VERSION 3.7)
project(test)

set(CMAKE_C_FLAGS  "-pthread")

set(SOURCE_FILES main.c defs.h)
add_executable(txtcp ${SOURCE_FILES} defs.h)
```
Consulでリーダーノードでのみ任意のコマンドを実行したい

## リーダーだけコマンドを実行したい

あまりConsulの要件っぽくはないんですが、任意の場所から特定のノード（今回はリーダー）でのみコマンドを発火させたかったのでそれを実現するためのメモです。  

## リーダーのノード名を知りたい

特定のノードで特定のコマンドを実行するには `consul exec` の nodeオプションを指定するのが良さそうです。
しかしおそらく **リーダーのノード名を一発で取得できない** ようなので、以下のフローで取得する必要があります。

### 1. リーダーのIP取得

[status API](https://www.consul.io/api/status.html)で取得。[^1]

```sh
$ curl https://consul.rocks/v1/status/leader

"10.10.10.1:8300"
```

### 2. リーダーのノード名取得

[Agent Members API](https://www.consul.io/api/agent.html#list-members) でメンバー一覧を取得し、その中からリーダーのNameを抜き出す。[^2]

```sh
$ curl https://consul.rocks/v1/agent/members

[
  {
    "Name": "foobar",
    "Addr": "10.10.10.1",
    "Port": 8301,
    "Tags": {
      "bootstrap": "1",
      "dc": "dc1",
      "port": "8300",
      "role": "consul"
    },
    "Status": 1,
    "ProtocolMin": 1,
    "ProtocolMax": 2,
    "ProtocolCur": 2,
    "DelegateMin": 1,
    "DelegateMax": 3,
    "DelegateCur": 3
  }
]
```

jqで一発取得しようとするとこんな感じでしょうか。

```sh
$ curl -s localhost:8500/v1/agent/members | jq -r '.[] | if .Addr == "<リーダーIP>" then .Name else empty end
```

これでリーダーのノード名が入手できました。


## 特定のノードで特定のコマンドを実行したい

これは [consul exec](https://www.consul.io/docs/commands/exec.html) で `-node` オプションを指定すればOKです。

```sh
consul exec -node="<リーダーのノード名>" "<お好きなコマンド>"
```

## おまけ

今回の場合、`consul exec` でサーバノード全体をワイルドカードフィルタし(ex. consul-server-*)、「実行するコマンド内で自分がリーダーかどうか」を確認して「自分自身がリーダーの時のみ実行する」という手法の方がConsul的なのかなーと思いました。
またその他良い方法があればご教示ください :bow: 

<br>

[^1]: どうしてノード名入れてくれないんですか…
[^2]: どうしてフィルタリングできないんですか…
Rustで自然言語処理100本ノック前半感想

## お題目
http://www.cl.ecei.tohoku.ac.jp/nlp100/

## 作業場所

https://github.com/Yasu-umi/rust_nlp_100_examples

Rustを書く機会が皆無なのでとりあえずやるぞ！ということで始めました。3ヶ月ほどチマチマ進めてようやく進捗が40%に到達したので各章の簡単なまとめもとい感想を。
環境さえ整っていれば、cargo run --bin 0XX で大体実行できます。
また、Qiitaにある多くの先達の記事を参考にしました、多謝。

## 1章 準備運動
タイトルの通り、簡単な文字列操作から。
この章ではstd::env::args()からgetしてmatchしたものを簡単な関数に投げるという定型でひたすら処理。Vecに生えている関数を使ったくらいしか特筆することがなさそう。

## 2章 UNIXコマンド
スキップ、ここはやらないかも…

## 3章 正規表現
この辺からiteratorに生えているメソッドを使い始めOption, Resultを気にし始めました。
29. 国旗画像のURLを取得する ではhttpリクエストを投げることになりhyperを導入。
まだif letを覚えていなかったらしくunwrapも頻発しており、行儀の良くないコードが多い。

## 4章 形態素解析
Mecabです。https://github.com/tsurai/mecab-rs お世話になりました。
この辺からgzをdecodeしたりjsonを読んだりgnuplotでグラフを書いたりとcratesを使うことが増えてきて、Rustのモジュールシステムを使って共通部分を外出しするようになり、fetchやmecab_utilsなどの簡単な関数を作り始めました。
せっかくですし、いずれは品詞なんかもEnumで表現してみたいです。

## 5章 係り受け解析
Cabochaです。まずはcabocha-rsの作成から https://github.com/Yasu-umi/cabocha-rs
ここでもmecab-rsは参考になりました。結局cabochaに渡す文字列のポインタを持っておくべき場合とそうでない場合の違いをほとんど理解しないまま、とりあえず必要な部分が動くようになるところまで。cabocha.hがシンプルだったので助かりました。
何かお気づきの点あればissueをいただけると大変喜びます。
44. 係り受け木の可視化 では https://crates.io/crates/dot を使おうとしたのですが、日本語が表示できず仕方なくDOT言語のテキストファイルを作成するということでお茶を濁しました。

## 今後
次の6章は後半がStanford Core NLPを使ったもので、これまたrustバインディングはないので、ひとまず7章に進もうと思います。
読み返してみると、とにかくVecを多用しておりIteratorで書ければ良いのではとか、cloneは本当に必要なのかとか、try!早期リターンしろとかまだまだRust自体に慣れていない部分が見受けられます。後半は扱うデータも複雑になっていくようなので、その辺りの理解も深まれば…
SQL ServerのFileTableへWebアプリを介してファイルパスでアクセスする場合の注意

SQL ServerのFileTableはファイル自体は共有フォルダへ配置し、それがテーブルのレコードとして管理できる機能です。
ファイルパス指定で簡単にアクセスできるのが便利なのですが、ASP.NETを介してファイルパス指定を行う際、権限周りの設定で苦労したので備忘として記載します。

## 前提
ファイルパス指定でアクセスする場合の権限は、SQL Serverのユーザ権限に準じます。orangeleafさんの投稿に詳細は記載されています。
　[FileTableの共有フォルダーにアクセス権を付与する](http://qiita.com/orangeleaf/items/ea6bb78775c04cb7bc60)

##はまったこと
Webアプリ（ここではASP.NET）を介してFileTableへアクセスする場合は、Webサーバのプロセスを実行しているユーザへ、SQL Serverでの権限がないとアクセスできません。
IISだと実行ユーザは、下記yuyadayoさんの投稿の通りデフォルトApplicationPoolIdentityの設定となっていてアプリケーションプールとなります。
　[クリスマスプレゼント もとい IIS](http://qiita.com/yuyadayo/items/9bdd36b3b871cf854d09)

##対応したこと（IISのケース）
プロセスのユーザをSQL Serverの権限があるWindowsユーザにすればよいのですが、わざわざFileTableのアクセスの為に実行ユーザを変えるのも微妙なので、アプリケーションプールに対してSQL Serverの権限を付与します。
下記のstackoverflowでの投稿の通り、権限設定でアプリケーションプール名を直書きすることで追加可能です。
　[Add IIS 7 AppPool Identities as SQL Server Logons](https://stackoverflow.com/questions/1933134/add-iis-7-apppool-identities-as-sql-server-logons)
Mastodonの管理運営：後からCW、NSFWを設定する方法は？

現在個人でVPSにMastodonを実験的に設置し運営してます。
運営方針として、ある作品が発売されてから１ヶ月はネタバレのトゥートをCW及びNSFWを設定してもらうことを定めました。
万が一、ネタバレのトゥートがされた場合、管理者の権限でCW及びNSFWを設定したいと思っています。

トゥートのDBテーブルであるstatusesの
・CWのトゥートではspoiler_textにテキストがある
・NSFWのトゥートではsensitiveがtrueである
ということが分かりました。

そこでdbconsoleから対象のトゥートのレコードのspoiler_textに文章を追加しUPDATEしたところ、CWに設定できたり出来なかったり、いまいち現象が不明確です。
またsensitiveをtrueにUPDATEしてみましたが、タイムライン上では反映されませんでした。

追記：再度試してみたところ、sensitiveをtrueにUPDATEしてから15分後にはNSFWが反映されているのが確認できました。
任意のタイミングで反映できないか調査中です。


CW、NSFWについてstatusesテーブル以外に関連するテーブル、またはキャッシュなどがあるのでしょうか？

可能であるなら、一定期間すべての画像投稿をNSFWに設定できればと思います。

どなたかお知恵を貸していただけないでしょうか？


オマケ：投稿されるトゥートを全て強制的にNSFWにする

modelファイルに加筆
live/app/models/status.rb
  before_save :force_sensitive

  def force_sensitive
    self.sensitive = true
  end

mastodonを再起動
sudo systemctl restart mastodon-*.service
[AutoHotKey]マウスカーソル位置に基づく文脈依存ホットキー


## #Ifディレクティブによる文脈依存ホットキー

`#if`ディレクティブを用いることにより、複雑な条件で活性化するホットキーを指定することができる。

-   [#If - AutoHotkey Wiki](http://ahkwiki.net/-If)
    -   [If (式) - AutoHotkey Wiki](http://ahkwiki.net/IfExpression)

`#If`での判定は`If ()`と同じで、単純な式および**関数の戻り値**を利用することができる。

関数の戻り値を利用する最も単純な用例としては、`WinActive()`関数を`or`条件で並列し、複数のウィンドウで有効なホットキーを指定するものがある。（`ahk_group`による指定でもよいが、対象ウィンドウが2つ程度ならこちらのほうが簡易である）

以下は[#If - AutoHotkey Wiki](http://ahkwiki.net/-If)から引用。

```ahk
#If WinActive("ahk_class Notepad") or WinActive(MyWindowTitle)
#Space::MsgBox You pressed Win+Spacebar in Notepad or %MyWindowTitle%.
```

## マウスカーソル位置によるマウスボタンホットキー（マウスジェスチャー）

特にマウスボタンで発動するホットキー（マウスジェスチャー）においては、（アクティブウィンドウによる指定ではなく）マウスカーソルが指定の位置にある場合のみ活性化させたい場合がある。

しかし、[組み込み変数](http://ahkwiki.net/Variables)および[組み込み関数](http://ahkwiki.net/Scripts#.E7.B5.84.E3.81.BF.E8.BE.BC.E3.81.BF.E9.96.A2.E6.95.B0)では、マウスカーソルの現在位置を評価することができない。
マウスカーソル位置はリアルタイムに変動するものであるため、ホットキー実行時に**ユーザー定義関数によって評価する**ことが適切である。

同じく[#If - AutoHotkey Wiki](http://ahkwiki.net/-If)からの引用となるが、以下の例では、ユーザー定義関数`MouseIsOver()`によって、マウスカーソル直下のウィンドウハンドルを評価している。

```ahk
#If MouseIsOver("ahk_class Shell_TrayWnd")
WheelUp::Send {Volume_Up}
WheelDown::Send {Volume_Down}

MouseIsOver(WinTitle) {
    MouseGetPos,,, Win
    Return WinExist(WinTitle . " ahk_id " . Win)
}
```

ただし、これでは**マウスカーソルが指定ウィンドウの指定コントロール上にある場合**といった条件付けができない。（具体的には、「メモ帳のテキスト入力部分」とか「ブラウザのページレンダリング部分」とか）
このような場合、`MouseGetPos`コマンドで、マウスカーソル直下のコントロール名を取得すればよい。

以下の例では、「アクティブウィンドウがメモ帳」かつ「マウスカーソル直下がメモ帳のテキスト入力部分」である場合に、右クリックにCtrl+S（保存）を割り当てている。
タスクバー上などは対象外であるため、例えば「タスクバーを右クリックして最大化」は通常通り可能である。

```ahk
#If WinActive("ahk_class Notepad") && MouseIsOver("Edit1")
RButton::
    Send, ^s
    Return

MouseIsOver(UnderControl) {
    MouseGetPos, , , , OutputVarControl,
    Return (OutputVarControl = UnderControl)
}
```
GCE f1-micro インスタンスを介して reverse SSH 接続する

漢なら GCE(Google Compute Engine) f1-micro インスタンスですね!

f1-micro インスタインスを介して, 外出先の PC からでもオフィスとか GPU クラスタとかのリモートに接続したいですね!

やりましょう!

# Reverse SSH 

今回は, とりあえずてっとりばやく環境が構築できる reverse SSH tunneling を使います.

http://qiita.com/syoyo/items/d31e9db6851dfee3ef82

構成はこんな感じになります.

```
+-------------+                 +----------+         +----------+
| remote node |  -------------> | f1 micro |  <----- | local PC |
+-------------+                 +----------+         +----------+
                  reverse SSH                   SSH

```

f1 micro のインスタンスでは, OS には, なんとなく CoreOS を選んでみました.

## サーバー側設定

remote note 側での設定です. `gcloud` をインストールしてあるものとします.
 こんな感じのスクリプトを作り, crontab で回すようにします.

```
pgrep -f "google_compute_engine" > /dev/null 2>&1 || gcloud compute --project "example.com:PROJECTNAME" ssh --zone "us-west1-a" "INSTANCE" -- -N -f -R 19998:localhost:22
```

既存に動いているプロセス判定はもっとスマートにしたいところ.

これにより, f1 micro インスタンスで, ポート 19998 に ssh すると, remote node にログインできるようになります.

## ローカル PC 設定

`gcloud` コマンドを駆使して直接リモートに console ログインするのはなんかうまくいかなかったので, 一旦 `gcloud ssh ~` とかして f1 micro インスタンスの IP アドレスと, 使っている SSH private 鍵を取得しておきます.

その後, `~/.ssh/config` にホスト名記載します.
CoreOS では `nc` はインストールされておらず, 同様の機能のものとして `ncat` がインストールされているので, `ncat` を使うようにします.

```
Host f1-micro
	HostName xxx.xxx.xxx.xxx
	IdentityFile ~/.ssh/google_compute_engine
	ForwardAgent yes

Host remote-note
	ForwardAgent yes
	ProxyCommand ssh f1-micro ncat localhost 19998
	ServerAliveInterval 60
	ServerAliveCountMax 4
```

これで, 手元 local PC から,

```
$ ssh remote-node
```

とするとリモート PC にログインできるようになります.

## (optional) OpenVPN を使う

接続したいノード数が増えてきたりしたら, OpenVPN に移行するのも検討してみてください.

GCE(Goole Compute Engine) CoreOS インスタンスで OpenVPN サーバを立てる
https://qiita.com/syoyo/items/f4ed1186b644dfdc8c0c


# TODO

* crontab で回すときに既存でプロセスが動いているときの pgrep を極める.
* 証明書ベースログインとかしたい.
* **優秀な若人が, f1 micro インスタンスを活用することで, 人類史上最速で優秀な GCE 若人が育成されるスキームを確立したい** 日々精進あるのみですね.
[Elixirメモ] 1.ざっくりインストールとIntroduction編

[Elixir](http://elixir-ja.sena-net.works/)のチュートリアル
[Getting Started](http://elixir-ja.sena-net.works/getting_started/1.html)のメモであります

#1-1.まずはインストール
の、前に
`elixir -v` で、導入済みのElixirのバージョンを確認ができる。
今回は 「Elixir 1.4.4」 を導入。

- MacOSでインストール
 - 安定のHomebrew `brew install elixir`
 - ちなみに exenv を使うと複数のバージョンが管理できるみたい。env系すごい。
 - exenv を使う場合は erlang を brew 等手動で入れる必要があるので注意。
  - (上記のやり方で elixir を使う場合は erlang も自動で入れてくれる)

Elixirをインストールすると `iex` `elixir` `elixirc` が実行できる。

#1-2.インタラクティブモード\<iex\>
`$ iex` でインタラクティブモード(対話モード)起動

```iex:iex起動
Interactive Elixir (1.4.4) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)> 
```

起動完了。 「 Ctrl + C 」を2回押しで終了できる。

起動できたのでとりあえず簡単に四則計算と文字列を表示。

```iex:四足計算と文字列表示
iex(1)> 5 + 5
10
iex(2)> 5 - 5
0
iex(3)> 5 * 5
25
iex(4)> 5 / 5
1.0
iex(5)> "Hello" <> "world!!"
"Helloworld!!"
```

除算は実数になるっぽい。
文字列は`<>`でくっつけられる。

#1-3.スクリプトを動かす\<xxx.exs\>

simple.exs を用意。

```ex:simple.exs
IO.puts "Hello world
from Elixir"
```

`elixir simple.exs` で実行

```bash:simple.exs実行
$ elixir simple.exs 
Hello world
from Elixir
```

IO.putsで色々出力な感じかな？

おしまい。

「２.Basic types」 へつづく？
React: Memo


2年目エンジニアが業務で使用して忘れないようにめも。
随時変更したり追加していく予定です

```
環境:
- React
- Material-UI
```

## Reactとは
Facebookが開発しているUIに特化したJavaScriptライブラリ

コンポーネントを作って組み合わせていく感じ
1つのコンポーネントに1つのrender()
-> HTMLタグで返すことができる = ブロック要素で1つのコンポーネントにできる

コンポーネントはrender()をもったオブジェクトを渡すことで作成できる

**表示と状態を切り分けれらるのがreactの魅力**

### render()
表示するためだけのメソッド
jsx -> HTMLっぽいやつ
{} -> JS書きたい時はブロックかっこをつけてあげることでJavaScript書きますよ

### state
状態
認証処理
値を入れてはいけない
-> constructorには記載ok

### props
コンポーネント間のデータ受け渡しの際はpropsを使う


### setState
setStateしたものを取り出したい時は `this.state` を使う

### keyとかもろもろ
Reactの仕様としてmapとkeyは書かないとエラーになってしまう

```
例：
{aaa.map((it, index) => 
　<MenuItem key={index} value={index} primaryText={it} />)}
```
コンソールダブルクリックでもちゃんと実行地点にジャンプするDebugクラスDLLをつくる

元ネタ:
http://answers.unity3d.com/questions/176422/debug-wrapper-class.html

実際にやってみたので備忘録程度にメモ。

Debugクラスのラッパーを作るとまずぶつかる問題となる
**Unityのコンソールをダブルクリックするとラップしたログ出力を呼んだ地点ではなくてラップ先のDebug.Logなどのところに飛んでしまう** というものについての対処方法の一例になります。

# 手順
今回 VisualStudio2010でやったのでそれ準拠での説明

## 新規ライブラリプロジェクトを作る
1. Visual C# -> クラスライブラリ を選択
2. 名前 には実際に使用する名前空間名を入力
3. 場所 には今回作成するライブラリプロジェクトの親フォルダを指定する
4. ソリューション名 にはこのライブラリプロジェクトのフォルダ名になるものを指定する

## 参照設定
ソリューションエクスプローラ内 参照設定 を右クリックし、 参照の追加 を選択後、
使用するUnityEngine.dllのパスを指定する(Unity/Editor/Data/Managed の中とかにあるはず)

## Debugクラスコードを書く
こんな感じのやつを Class1.cs に書く

```csharp:Class1.cs

using System.Diagnostics;
using UnityEngine;

namespace DebugTest {
    public static class Debug
    {
        [Conditional("DEBUG_WRAP")]
        public static void Log(object message)
        {
            Debug.Log(message);
        }
    }
}
```

## ビルド

普通に ビルド から [プロジェクト名]のビルド を実行
bin/Debug フォルダに [namespace名].dll が出来上がっているはずなので
それをUnity側のプロジェクトのAssets以下にコピー

## 使う

先の例の場合 Conditional を付けているので、ログを出したい場合は DEBUG_WRAP を Scripting Define Symbols に書く

後はこんなかんじで使う

```csharp:Test.cs
using UnityEngine;
using DebugTest; // コレが要る

public class Test : MonoBehaviour {
    void Start() {
        DebugTest.Debug.Log("Test");
    }
}
```

実際に出力されたログをダブルクリックして飛ぶと、普通にラップするパターンと違いきちんとTestクラスの DebugTest.Debug.Log() の行にジャンプします。

# 問題

最初に挙げた問題についての対処はできますが、その代わり普通に無名名前空間にDebugクラスを定義してラップする方式と違って以下の問題が発生します。

* まず使用するのに専用のusingが必要
    * プロジェクト用のnamespaceを切ってたりするとまだマシかも
* 元々のUnityのDebugクラスをラッピングするわけではないので、外部Assetでログ出力が行われていても防げない
    * これとは別に無名名前空間でDebugクラス定義してどうにかするのもアリかも 5.4なんかだともう Logging の設定が出来るのでそれでもいいかもしれないが…

とりあえずやってみたらできた！というところから勢いで記事を書いたので、他にも色々問題あるかもしれません…；
チェック柄(市松模様)を描画するカスタムView

# はじめに
こんにちは:leaves:
**UICollectionViewCellが選択状態の時に使えるデザイン**を探していて、
画像を使わずに**UIView**の`drawRect`を利用すると軽いという事で作ってみたものの、結局使わずに限定公開に埋まっていたので公開してみたいと思います。
柄を描画するアルゴリズムなどあまり知らず調べずに書いてしまったので、間違っていたらごめんなさい。

# 実装について

<img width="159" alt="green.png" src="https://qiita-image-store.s3.amazonaws.com/0/128250/18f1dfeb-7dee-4965-6319-cf255410dbac.png">


<img width="243" alt="option.png" src="https://qiita-image-store.s3.amazonaws.com/0/128250/42c110f2-6d8a-b3cc-24ae-4933743a5e82.png">

|プロパティ|説明|
|:-:|:-:|
|panelScale|並ぶタイルの個数|
|panelAColor|タイルの色A|
|panelBColor|タイルの色B|

# ソースコード

```CheckPatternView.swift
import UIKit

@IBDesignable class CheckPatternView: UIView {
    
    @IBInspectable var panelScale: CGFloat = 4
    @IBInspectable var panelAColor: UIColor = UIColor.white
    @IBInspectable var panelBColor: UIColor = UIColor.black
    
    override init(frame: CGRect) {
        super.init(frame: frame)
    }
    
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }
    
    override func draw(_ rect: CGRect) {
        if panelScale == 0 { return }
        var alternatelyFlg = false
        let panelWidth = frame.size.width / panelScale
        let panelHeight = frame.size.height / panelScale
        var x: CGFloat = 0
        var y: CGFloat = 0
        for _ in 0 ..< Int(panelScale) {
            for _ in 0 ..< Int(panelScale) {
                let path = UIBezierPath(rect: CGRect(x: x, y: y, width: panelWidth, height: panelHeight))
                let color = alternatelyFlg ? panelAColor : panelBColor
                color.setFill()
                path.fill()
                alternatelyFlg = !alternatelyFlg
                x += panelWidth
            }
            x = 0
            if Int(panelScale) % 2 == 0 {
                alternatelyFlg = !alternatelyFlg
            }
            y += panelHeight
        }
    }
}
```

# さいごに
今回は全く関係ないですが、数学を使った幾何学模様やなまこ壁のような複雑な柄を**UIBezierPath**などを利用して描けたら面白いかもと思いましたが、その前に数学を勉強し直さなければいけない焦りを感じましたとさ:sweat:

見て頂いてありがとうございます。
セル中の特定の文字のプロパティを設定するマクロ

* セル中の特定の文字を強調したい時に
* セルを選択して実行する想定ですが、必要に応じて変更してください

```vba:set_char_properties
Const SEARCH_CHAR As String = "|" ' 検索文字(列)

Sub set_char_properties()
    Dim char_len As Long
    char_len = Len(SEARCH_CHAR)
    
    For Each r In Selection ' 選択セルを順次処理
        Dim start_idx As Long
        Dim target_char_idx As Long
        start_idx = 1
        
        Do
            target_char_idx = InStr(start_idx, r.Value, SEARCH_CHAR)
            If (target_char_idx = 0) Then Exit Do ' 対象文字がなければ次のセルへ
            
            r.Characters(target_char_idx, char_len).Font.ColorIndex = 3 ' 赤字
            r.Characters(target_char_idx, char_len).Font.Bold = True ' 太字
            
            ' 検索開始位置を更新
            start_idx = target_char_idx + char_len
        Loop
        
    Next r
End Sub
```
# 参考文献

[森本家のワークシート 特定キーワードを目立たせろ](http://itpro.nikkeibp.co.jp/pc/article/technique/20100921/1027569/)
Shader01

##Shaderについて
shaderとは3次元のコンピューターグラフィックスにおいて、陰影処理を行うコンピュータプログラムのことです。
今まではグラフィックスカードに固定機能として実装されていた「定型パイプライン」を使用してグラフイック表示を行なっていましたが、現代ではGPUのパイプラインをソフトウェアプログラムにより組み立てる「プログラマブル パイプライン」と呼ばれるアーキテクチャが構築されたことにより、以前は完全にブラックボックスだったグラフィックスパイプラインがユーザープログラマーに対して開放され、新たな陰影処理技法や各種エフェクト（画面効果）を試験的に実装してGPU上で走らせることが容易になりました。(wiki参考)

簡単に言うと今までいじることができなかった陰影処理を行う部分をいじれるようになった感じですかね？

##具体的なShaderの種類について
今回紹介するshadrは2種類でフラグメントシェイダーとバーテックスシェイダーです。
shader初心者をターゲットにこの記事を書いているのでざっくりとしたいイメージを描きます。

*バーテックスシェイダー
シェイダーに入ってきた頂点の座標を変換するものです。
入力される座標の例としては3次元空間におけるXYZ位置座標や法線ベクトル、テクスチャマッピング座標（UV座標など）があります。
3次元グラフィックスにおける主な座標変換にはワールド変換、ビュー変換、プロジェクション変換が存在します。
主な変換行列の説明です↓

ワールド変換：モデリング座標系からワールド座標系への変換
ビュー変換：ワールド座標系からカメラ座標系への変換
プロジェクション変換：カメラ座標系から投影座標系への変換

*フラグメントシェイダー
ピクセル単位でライティングなどの処理の計算を行って描画するための色を決定してくれる物って感じです。
また処理の順序としては頂点シェイダーから入力された情報を元に計算しています。

##最後に

[sandbox](http://glslsandbox.com)や[shader toy](https://www.shadertoy.com)などのサイトを見てみると実際にどんなことができるのかがわかって面白いかもしれません。
これから徐々に具体的な内容を書いていこうと思います、
また何か誤りがあればご指摘ください。

参考になるサイト
http://tsumikiseisaku.com/blog/category/shader/
愛は金よりも重い

# 動機

[金は愛よりも重い - Qiita](http://qiita.com/Momiji0223/items/f4c47d90be59fca8585b) という記事を見た。

要は

```rb:ruby
puts "愛" < "金" #=> true
```

ということ。

**爺ぃ**と呼ばれてもおかしくない歳の身としては，**老婆心**ながら，「ナウいヤングのプログラマーがこういう記事を読んで気持ちが荒んだりしないだろうか」といささか心配になった。

前途ある若者たちに希望を持ってもらいたい。それがロートルの願いだ。

`"愛" < "金"` が真なのは一面の真実であるとしても，観点を変えれば別の結論が得られるのではあるまいか。

# 方針

重さを比べるのだから，文字をレンダリングしたときの塗りつぶし面積を比較してみよう。

グラフィックライブラリー [cairo](https://github.com/rcairo/rcairo) を使って文字をレンダリングする。黒地に白文字で書く。cairo にはピクセルを調べる機能はないので，いったん PNG ファイルに書き出す。
それを [chunky_png](http://chunkypng.com/) という gem で開き，ピクセルの値を合算する。塗りつぶし面積に比例した値が得られる。

計数が終わったら画像ファイルは不要なので，初めから `Tempfile` オブジェクトで書き出すようにする。

String の `>` メソッドを，この塗りつぶし面積で比較するよう書き換えてしまう。2 文字以上の文字列は先頭文字で比較することにする。

リファインメントを使い，必要な箇所でのみ改変版に差し替えるようにする。

# 作譜

あらかじめ

```
$ gem install cairo
$ gem install chunky_png
```

しておく。

コードの本体はざっとこんな感じ。

```rb
require "cairo"
require "chunky_png"
require "tempfile"
require "test/unit"

module StringWeightCompare
  refine String do
    # String の <=> を書き換えても >, >=, <, <= 等は変わらないので
    def <(other)
      StringWeightCompare.weight(self) < StringWeightCompare.weight(other)
    end
  end

  def self.weight(str)
    size = 64
    surface = Cairo::ImageSurface.new Cairo::FORMAT_RGB24, size, size
    context = Cairo::Context.new surface
    context.select_font_face "IPAexGothic"
    context.set_font_size size
    context.rectangle 0, 0, size, size
    context.set_source_color :black
    context.fill
    context.move_to 0, size * 0.88
    context.set_source_color :white
    context.show_text str[0]
    Tempfile.open do |f|
      surface.write_to_png f.path
      png = ChunkyPNG::Image.from_file f.path
      # R 成分の合計値を取る
      png.pixels.inject(0){|sum, color| sum + (color >> 24)}
    end
  end
end

using StringWeightCompare

class TestStringWeghtCompare < Test::Unit::TestCase
  test "compare weight" do
    assert "軽" < "重"
  end
end
```

ユニットテストでも，「軽」より「重」のほうが重いことが確認できる。オーケー。


# 実行

いよいよ「金」と「愛」の重さを比べるときが来た。

いざ。

```rb
puts "金" < "愛" #=> true
```

うむ。

若人たちよ，これが真理だ！

# 蛇足

ふと気になって，他の文字でも比べてみた。

```rb
puts "命" < "金" #=> true
```

なんだかなー

# あわせて読みたい

[生死から愛が生まれるとき教科書から恐が生まれる - Qiita](http://qiita.com/scivola/items/c0f89a313b208a654734)