OmniAICreator/Qiita-1.07M huggingface dataset:
NYAGOSの小TIPS集

NYAGOS 4.2.0 以降が対象です。

ファイルはゴミ箱へ
=================

    trash ファイル名

でファイルがいきなり削除ではなく、ゴミ箱に入ります。実体は Lua スクリプトで、COM経由でゴミ箱へファイルを移動しています。(`nyagos.d/trash.lua`）

UTF8 変換に type 文
===================

内蔵 type 文は下記の拡張されています。

* 行単位で UTF8 変換
    * テキストが UTF8 として妥当であれば UTF8 と判断、不適当なら現在のコードページの文字種類と判断（つまり、混在データでも大丈夫）
* 標準入力からも読み込み可能

これを利用すると

    git show . | type | gvim - &

などということが可能になります。

* Windows で git やってると、git の日本語メッセージと、ソースのテキストで文字コードが違っていて文字化けが回避できないことがあるが、内蔵 type 文は行単位で判別しているので、ほぼ読める内容になる
* nkf (Network Kanji Filter）の文字コード判別ロジックに比べると、**「エラーだったら UTF8 と違う(ANSI=現在のコードページ)」という実に雑なUTF8判定**だが、案外十分
* NYAOS-3000 では内蔵コマンドをパイプラインの最初以外のコマンドに使えなかった。NYAGOS ではどこでも内蔵コマンド(Lua含む)が使える

深いディレクトリ移動はショートカットで
===================================

**いちいち `cd ~/go/src/github.com/zetamatta/nyagos` なんて長いパスを打ってられるか！**

そこでショートカットですよ。

    lnk ~\go\src\github.com\zetamatta\nyagos .

と一度ショートカットを作成しておけば、以後は

    cd nyagos.lnk

だけでいいです。

* ジャンクションとかシンボリックリンクでもいいんですが、見かけのカレントディレクトリの位置まで変わってしまうので（親ディレクトリがホームディレクトリになってしまう）、単にディレクトリのタイプ数を節約するだけなら、ショートカットで十分でしょう。
* lnk はショートカットを作る内蔵コマンドですが、別にエクスプローラで作ったショートカットでも構いません（同じものです）

git push 漏れはないかな？
=======================

%APPDATA%\NYAOS_ORG\nyagos.history に、タイプしたコマンド、日時、カレントディレクトリ全部が TSV 形式で記録されるようになりました。これを検索する PowerShell を書いてみましょう。

```todaygit.ps1
$done = @{}
Join-Path $env:appdata 'NYAOS_ORG\nyagos.history' |
    %{ Get-Content $_ -Encoding utf8 } |
    ?{ $_ -match '^[g]it commit' } |
    %{
        $private:tmp=($_ -split "`t")
        # $private:from = (Get-Date).AddDays(-3).ToString("yyyy-MM-dd")
        $private:dir=$tmp[1] 
        if( (Test-Path $dir) -and (-not $done.ContainsKey($dir)) ){
            Write-Host $dir
            pushd $dir
            git status | ?{ $_ -match "^Your branch is" } | %{ "   "+$_ }
            popd
            Write-Host
            $done[ $dir ] = 1
        }
    }
```

```console
$ todaygit.ps1
C:\Users\hymko\go\src\github.com\zetamatta\nyagos
   Your branch is up-to-date with 'origin/second'.

C:\Users\hymko\go\src\github.com\zetamatta\nyagos.wiki
   Your branch is up-to-date with 'origin/master'.

C:\Users\hymko\go\src\github.com\zetamatta\experimental\zero
   Your branch is up-to-date with 'origin/master'.

C:\Users\hymko\Share\bin
   Your branch is up-to-date with 'origin/master'.
```

* 普通、PowerShell スクリプトを実行する時は「`PowerShell -ExecutionPolicy RemoteSigned -file` などとセキュリティーオプションをつけなくてはいけません。同オプションをデフォルト化することもできますが、OSユーザ全体にその設定が及んでしまいます。nyagos の場合は、デフォルトで .ps1 拡張子の時に「`suffix ps1="powershell -ExecutionPolicy RemoteSigned -file"`」というインタプリタ名を追加する設定になっており、nyagos から呼び出す時のみスクリプト実行を許可されることが可能になっています。
* 最初は「その日に行った git commit」のみを対象としていたのですが、月曜朝に土日の commit 漏れをチェックするといった時に困ること、どのみち history には 1000件程度しか記録していないことから、別に日付を限定する必要はないと判断しました。

外部の sudo を使いたい
=====================

sudo コマンドは Windows では一般に管理者権限でコマンドを実行する実装が多い。NYAGOS でも内蔵コマンドとして実装していたが、新しいコンソールを立て上げてしまうので、コンソールが変わらない、他の sudo for Windows を使いたい。

そんな時は

    alias "sudo=sudo.exe"
 
と EXE 版を呼び出すよう、 `~\_nyagos` にエイリアスを書きましょう。

* 不評な内蔵版 sudo は次のバージョンでは削除される予定。`su` や `clone` は存続

以上
MariaDBのインストールと起動


環境`CentOS Linux release 7.3.1611 (Core)`

## インストール

```
# yum install mariadb mariadb-server mariadb-client
```
## 起動
起動する。

```
# systemctl start mariadb
```
自動起動設定

```
# systemctl enable mariadb
```

## 文字コードの設定

`/etc/my.cnf`に`character-set-server=utf8`を追加する。

```
# vi /etc/my.cnf
```

```
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# Settings user and group are ignored when systemd is used.
# If you need to run mysqld under a different user or group,
# customize your systemd unit file for mariadb according to the
# instructions in http://fedoraproject.org/wiki/Systemd

character-set-server=utf8    ・・・・・(追加)

[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid

#
# include all files from the config directory
#
!includedir /etc/my.cnf.d
```

## 初期設定
初期セットアップコマンド` mysql_secure_installation`を用いる。

```
# mysql_secure_installation
```

```
Enter current password for root (enter for none):Enter
...中略...
Set root password? [Y/n] Y
...中略...
New password: 新しいパスワード
Re-enter new password: 新しいパスワード
...中略...
Remove anonymous users? [Y/n] Y
...中略...
Disallow root login remotely? [Y/n] Y
...中略...
Remove test database and access to it? [Y/n] Y
...中略...
Reload privilege tables now? [Y/n] Y
...中略...
Thanks for using MariaDB!
```

## ユーザー作成
まずrootでログインする。

```
# mysql -u root -p
```

```
Enter password:作成したパスワード
```
ログインすると以下のような対話モードになる。

```
MariaDB [(none)]>
```
ここに、SQL文で対話ができる。最後に「`;`」をつけるのを忘れずに。
以下のSQL文はユーザを作成する例である。

```
MariaDB [(none)]> grant all on データベース名.テーブル名 to ユーザ名@localhost identified by 'パスワード';
```

`grant`は権限を設定するコマンドである。文法は次のように書く。

```
grant <権限> on <権限を設定する場所> to <権限を設定するユーザ>
```
`<権限>`には`all`ですべての権限を与え、細かく設定するには、`SELECT,INSET`のように、`コマンド,コマンド,コマンド,...`のように書く。`<権限を設定する場所>`は`データベース名.テーブル名`のように書く。またワイルドカードを用いて、`データベース名.*`や`*.*`のようにも書ける。`<権限を設定するユーザ>`は`ユーザ名@ホスト名`のように書く。ローカルホストで使用する場合は`ユーザ名@localhost`で良い。
　また、ユーザの後ろに`identified by 'パスワード'`を加えることでパスワードを設定できる。
 
 ユーザー名とホスト名の一覧を見たいときは以下のコマンドを実行する。

```
MariaDB [(none)]> select user,host from mysql.user;
```
詳しい説明は`select`について説明するときにする。



...
....
.....
......
飽きた....。
Polymerドキュメント(日本語) API Reference/Global Settings Polymerのグローバル設定

**※ 作業中**

[目次へ移動](http://qiita.com/jtakgiuchi/items/e5160ba7d039ca5b05a4)

[翻訳ドキュメントの管理ページ](https://github.com/jtakiguchi/polymer-docs-japanese-translation)

# Polymerのグローバル設定

ドキュメントに対してグローバルな設定をするには、Polymerのライブラリをインポートする前に`windows`へ`Polymer`のオブジェクトをセットします。

~~~html
<html>
  <head>
  <meta charset="utf-8">
  <script src="components/webcomponentsjs/webcomponents-loader.js"></script>
  <script>
    /* this script must run before Polymer is imported */
    window.Polymer = {
      rootPath: '/your/application/root'
    };
  </script>
  <!-- a component that relies on Polymer -->
  <link rel="import" href="elements/my-app.html">
  </head>
  <body>
  ...
~~~

利用できる設定:

<table width="100%">
<thead>
<tr>
  <td>
    設定
  </td>
  <td>
    説明
  </td>
</tr>
</thead>
<tbody>
  <tr>
    <td>
      <code>rootPath</code>
    </td>
    <td>
     テンプレート等で使用されるグローバルな<code>rootPath</code>プロパティが設定されます(アプリケーションルートからの相対的なURLを生成する場合など)。
    </td>
  </tr>
  <tr>
    <td>
      <code>sanitizeDOMValue</code>
    </td>
    <td>
    任意の値をDOMに挿入する前に、その値をサニタイズするために使用されるグローバルなコールバックです。
    仕様は次のとおりです。

<pre><code>
Polymer = {
  sanitizeDOMValue: function(value, name, type, node) { ... }
}
</code></pre>

内容:

<pre>
- `value` サニタイズする値
- `name` 属性やプロパティの名前 (例: `href`)
- `type` 値が挿入されるタイプ: `property` 、 `attribute` もしくは `text`
- `node` 値が挿入されるノード
</pre>
    </td>
  </tr>
</tbody>
</table>

ポリフィルにおける固有の設定もいくつかあります。詳細は [Polyfills](../polyfills#settings) を参照してください。
Polymerドキュメント(日本語) Browser support/Overview 対応ブラウザについて

**※ 作業中**

[目次へ移動](http://qiita.com/jtakgiuchi/items/e5160ba7d039ca5b05a4)

[翻訳ドキュメントの管理ページ](https://github.com/jtakiguchi/polymer-docs-japanese-translation)

# 対応ブラウザについて

Polymer 2.x は全ての主要ブラウザにおいて _最新と1つ前のバージョンで_ 動作します: Safari 9、IE 11以上、また最新のChrome、Firefox、Edge


## 対応状況

Polymerライブラリは、[WebコンポーネントAPI](http://webcomponents.org/articles/why-web-components/)における最上位の軽量レイヤーです。Polymerによって使用されるいくつかの機能は、（まだ）すべてのブラウザでネイティブにサポートされていません。幅広いWebコンポーネントのサポートのために、Polymerは [webcomponents.org](http://webcomponents.org) の [ポリフィル](https://github.com/webcomponents/webcomponentsjs) を使用します。これは軽量で、うまく動作し、Polymerが必要とする機能をサポートします。

このポリフィルによって、Polymerは次のブラウザで動作します。

<table>
<thead>
  <tr><th></th><th>Chrome</th><th>Firefox</th><th>IE&nbsp;11+/<br>Edge</th><th>Opera</th><th>Safari 9+</th><th>Chrome
 <br>(Android)</th><th>Safari<br>(iOS&nbsp;9+)</th></tr>
</thead>
<tr>
  <td class="feature-title"><a href="http://www.html5rocks.com/en/tutorials/webcomponents/template/">Template</a></td>
  <td class="native">Native</td>
  <td class="native">Native</td>
  <td class="partial">部分的</td>
  <td class="native">Native</td>
  <td class="native">Native</td>
  <td class="native">Native</td>
  <td class="native">Native</td>
</tr>
<tr>
  <td class="feature-title"><a href="http://www.html5rocks.com/en/tutorials/webcomponents/imports/">HTML Imports</a></td>
  <td class="native">Native</td>
  <td class="polyfill">Polyfill</td>
  <td class="polyfill">Polyfill</td>
  <td class="native">Native</td>
  <td class="polyfill">Polyfill</td>
  <td class="native">Native</td>
  <td class="polyfill">Polyfill</td>
</tr>
<tr>
  <td class="feature-title"><a href="http://www.html5rocks.com/en/tutorials/webcomponents/customelements/">Custom Elements</a></td>
  <td class="native">Native</td>
  <td class="polyfill">Polyfill</td>
  <td class="polyfill">Polyfill</td>
  <td class="native">Native</td>
  <td class="partial">部分的</td>
  <td class="native">Native</td>
  <td class="partial">部分的</td>
</tr>
<tr>
  <td class="feature-title"><a href="http://www.html5rocks.com/en/tutorials/webcomponents/shadowdom/">Shadow DOM</a></td>
  <td class="native">Native</td>
  <td class="polyfill">Polyfill</td>
  <td class="polyfill">Polyfill</td>
  <td class="native">Native</td>
  <td class="partial">部分的</td>
  <td class="native">Native</td>
  <td class="partial">部分的</td>
</tr>
</table>

参考:

-   Templates はEdgeではサポートされていますが、IEではされていません。
-   SafariはCustom Elementsのサポートを10.3から開始しています。
-   SafariはShadow DOMのサポートを10.2から開始していますが、10.3でもいくつか問題が残っています。
-   古いバージョンのAndroidブラウザはいくつか動作に問題があるでしょう。問題を発見したら[イシュー](https://github.com/polymer/polymer/issues)として報告してください。
    Chrome for Androidはサポートされています。


さらに詳しい情報は[Polyfills](polyfills)を参照してください。

## ES6

Polymer 2.x は EcmaScript 2015 (ES6)を使用します。次のブラウザは、Polymerに必要なすべてのES6の機能をサポートしています。

-   Chrome もしくは Chromium の49以上
-   Opera 36以上
-   Safari もしくは Mobile Safari 10以上
-   Edge 15.15063以上
-   Firefox 51以上

他のブラウザでは、ES5にコンパイルする必要があります。

さらに詳しい情報は[ES6からES5へのコンパイル](es6)を参照してください。
パイソンをこれから始める

Mac 10.12へのインストール

```.sh
#sudo chown -R "$USER":admin /usr/local => だめ
brew install python3
python3 -V
pip3 -V
```


0-9 A-Z a-zの文字列

```.py
"".join([format (i) for i in range(0,10)]) + string.lowercase + string.uppercase
```

jsonの相互変換

```.py
import json

data = { 'key1' : [1,2,3], 'key2' : [4,5,6] }

jsondata = json.dumps(data)
data2 = json.loads(jsondata)

for key in data2.keys():
    print (data2[key])
```

MySQLへの接続

```.sh
pip3 install mysqlclient
```

```.py
import MySQLdb

conn = MySQLdb.connect(
    user='user',
    passwd='password',
    host='localhost',
    db='db1'
)
cursor = conn.cursor()
cursor.execute("SELECT * FROM `tb1` limit 10")

for row in cursor.fetchall():
    print ("id: " + str(row[0]))

cursor.close()
conn.close()
```
qiitaの記事で画像が出せなくなった

初めてqiitaを使いだしたのだが、画像を貼り付けていたら突然
'![Payload Too Large]()'というエラーとともに画像が出なくなってしまった

#1.どうする？
調べたところ、qiitaの新規ユーザーは画像アップロードに容量の制限があるらしく、それに引っかかってしまったのだろう。
突然出てくるのは驚くから、helpというか説明的なものが欲しいと思った。
GitHub で使われる慣習的なリポジトリについてまとめてみた

GitHub には dotfiles のように「この名前はこういう意味を持つリポジトリですよ」的なリポジトリ、言うなれば **慣習的なリポジトリ** というものがいくらか存在していると思います。どれだけあるんだろうと気になったので、簡単にまとめてみました。

# メジャーなもの

GitHub ユーザーなら大多数が知ってそうなもの。

## awesome

特定テーマに関するキュレーションを行うリポジトリ。Markdown のリスト表記で一覧化するのが一般的。また、Contribution も受け付けている（人気のあるリポジトリはガイドラインも厳しめ）。

- [vinta/awesome-python](https://github.com/vinta/awesome-python)
- [Awesome-Windows/Awesome](https://github.com/Awesome-Windows/Awesome)
- [sindresorhus/awesome](https://github.com/sindresorhus/awesome)
  - awesome list の awesome list 的なやつ

## dotfiles

設定ファイル格納用のリポジトリ。dotfile とはたとえば `.gitconfig`, `.vimrm`, `.bash_profile`, `ssh/config` 等のこと。

- [Search ・ dotfiles](https://github.com/search?q=dotfiles)
- [dotfiles/dotfiles.github.com: Your unofficial guide to doing dotfiles on GitHub.](https://github.com/dotfiles/dotfiles.github.com)

## github.io

`username.github.io` でアクセス可能な GitHub Pages のユーザーページやグループページ。自己紹介ページとして活用する人が多い。

# マイナーなもの

メジャーではないが、一部でブームが起きるなどして知る人ぞ知るというもの。

## github.com

昔の GitHub Pages ドメイン。セキュリティ上の理由により io ドメインに移行した。

- [New GitHub Pages domain: github.io](https://github.com/blog/1452-new-github-pages-domain-github-io)
- [セキュリティ強化を目的に：GitHub、プロジェクトページの全ドメインを「github.io」に移行 - ＠IT](http://www.atmarkit.co.jp/ait/articles/1304/08/news115.html)

## til

Today I Leaned。日々学んだことのメモを書き溜めるリポジトリ。

- [jbranchaud/til: Today I Learned](https://github.com/jbranchaud/til)
- [Search ・ til](https://github.com/search?&q=til)
- [GitHubのリポジトリを利用した意識高い「til」](http://www.softantenna.com/wp/webservice/til/)
- [GithubでTILというリポジトリが流行りつつあるのかもしれない - 生涯未熟](http://syossan.hateblo.jp/entry/2016/02/16/144305)

## username/username

リポジトリ名をユーザー名と同じにしたもの。主に「私に言いたいことがあったら Issue 立ててね」というゲストブックのような運用をする。

- [azu/azu: azu 's issue todo](https://github.com/azu/azu/)

他にもこれを作ってる人がいたはずですが失念。。。

# おわりに

とりあえず私が知っているものを挙げてみました。探せば他にもありそうです。みなさまの情報提供もお待ちしております。
Middlemanでアイキャッチを設定するお話

[以前のご報告](http://qiita.com/wkwkrnht/items/6cf4bae662f3436dbbb2)とは、方針転換をして移行先を今Middlemanベースで作っています。その中で、サイトデザインを再現するために、アイキャッチ画像を設定する必要がありました。そこで、それを実装するための必要記述群です。
##以下、コード
###リストページ内
###テンプレート内
```ruby:template.slim
= image_tag current_page.data.eyecatch || '/img/no-img/full.png', :alt=>'eyecatch'
```
こういった形で、メタデータ内からアイキャッチかプレースホルダー用の画像を表示するようにしています。
###記事生成用ファイル内
```markdown:hogehoge.html.md
---
～～～前略～～～
eyecatch: hogehoge.png
～～～後略～～～
---
～～～以下記事～～～
```
というようにFrontmatter内に記述してください。この場合、既定画像フォルダ内から探し出してきます。
alfred3のメモ


sheetを使う
---------------------------------------------------------

CUIなスニペットツールsheetが便利なのでzshでsheetファイルを補完 - Glide Note
http://blog.glidenote.com/blog/2012/04/16/sheet/

sheet、peco、Alfred workflowを使って、スニペット環境を見直す - Qiita
http://qiita.com/sfp_waterwalker/items/bbba2e38109c1baf03c1

php lib
---------------------------------------------------------

joetannenbaum/alfred-workflow: PHP helper class for Alfred Workflows
https://github.com/joetannenbaum/alfred-workflow

workflowでsudo
---------------------------------------------------------

Workflows requiring privileges - Workflow Help & Questions - Alfred App Community Forum
https://www.alfredforum.com/topic/686-workflows-requiring-privileges/#comment-3315

> osascript -e  "do shell script \"sudo apachect1 stop >/dev/null;\" with administrator privileges"


PATHの問題
---------------------------------------------------------

pathや.bash_*は読み込まれないので工夫することになりそう。
毎回、.bash_aliasとか.bash_pathとかをsourceで読み込む方法もあるが、
綺麗に分割できないこともある。環境依存を減らすという意味も考えると。。
自力でPATHを書くとか、絶対パスで指定するとか、もうちょっとスマートな方法を考えるとか。。
ChainMapの主な特徴

Python 3.3よりcollections標準ライブラリのChainMapというクラスが利用できますが、主な特徴について備忘録として書き留めておきます。

ChainMapは、複数の辞書を集めて一つの辞書を作るのに使用します。

同じことをdictで行うには、[この記事](http://qiita.com/kk6/items/6362a5fc9f3f06a5969a)で説明されているように、複数の辞書をマージして元々の辞書の要素を含んだ新しい辞書を作成するかと思います。

これに対し、ChainMapは、新しいオブジェクトに要素をコピーするわけではなく、元々の辞書を参照として保持するため、元の辞書が変更されても、ChainMapオブジェクトを更新する必要がありません。

例えば、次のようなサンプルを考えます。

```py:
from collections import ChainMap

d1 = {'A': 1, 'B':2}
d2 = {'C': 3, 'D':4}

cm = ChainMap(d1, d2)
```
ここで、`d1`に要素を追加すると、`cm`でもその要素が取得できることが分かります。

```pycon:
>>> d1['E'] = 5
>>> cm['E']
5
```
mapsプロパティで、元となる辞書を取得できます。

```pycon:
>>> cm.maps
[{'E': 5, 'B': 2, 'A': 1}, {'D': 4, 'C': 3}]
```
元の辞書間で重複するキーがある場合、手前の辞書にある要素が優先されます。

```pycon:
>>> d1['D'] = 6
>>> cm.maps
[{'E': 5, 'B': 2, 'A': 1, 'D': 6}, {'D': 4, 'C': 3}]
>>> cm['D']
6
```
また、元となる辞書はビルトインのdictオブジェクトに限らず、Mappingオブジェクトを指定することができます。次の例は、同じ標準ライブラリにある`UserDict`をソースの辞書に使用した例です。

```py:
from collections import UserDict

class MyDict(UserDict):

    def __getitem__(self, key):
        if key not in self.data:
            return 'Not found'
        else:
            return self.data[key]

md1 = MyDict(d1)
md2 = MyDict(d2)

cm2 = ChainMap(md1, md2)
```
この例では、`md2`にキー`C`があっても、`md1`の`__getitem__`が先に呼ばれてしまうため、"Not found"が返されます。

```pycon:
>>> cm2['C']
'Not found'
```
sphinx-apidocのRead the Docs統合

# はじめに

[以前の投稿](http://qiita.com/koreyou/items/8c101802f4d38781e696)で、1コマンドでsphinx-apidocとsphinxを両方実行する方法について記載しました。しかしながら、この方法はsphinx自体ではなく、setuptoolsの挙動を変更する方法であったため、setuptoolsを噛まさず直接sphinxを実行する[Read the Docs](https://readthedocs.org/)などのサービスとうまく連携できないという問題がありました。本投稿では、sphinx側の実行に直接sphinx-apidocを組みこむ方法について記載します。

# 手順

ディレクトリ構造などは[前回の投稿](http://qiita.com/koreyou/items/8c101802f4d38781e696#%E6%BA%96%E5%82%99)に準拠します。

まず、Sphinxの実行にsphinx-apidocを組み込みます。

```python:doc/source/conf.py
import sphinx.apidoc


root_dir = os.path.abspath('../..') 

try:
    # This succeeds = the project is already installed.
    # This directive avoids Readthedocs to fail
    import my_project
except ImportError:
    sys.path.insert(0, root_dir)
    import my_project

# ...
# Rest of the conf.py
# ...


def run_apidoc(_):
    script_dir = os.path.dirname(os.path.realpath(__file__))
    src_dir = os.path.join(script_dir,  root_dir)
    out_dir = os.path.join(script_dir, "modules")
    sphinx.apidoc.main(
        ['', '-f', '-H', project, '-A', author,
         '-V', version, '-R', release, '-T', '-M',
         '-o', out_dir, src_dir])


def setup(app):
    app.connect('builder-inited', run_apidoc)
```

ポイントは2つあります:
1. `import my_project` をこころみ、失敗したらプロジェクトのrootにパスを通して再度インポートを試みます。Read the Docsは一度ライブラリをビルドして、ローカルの環境にインストールしてからドキュメントをビルドするからです[^1]。
2.`setup` コマンドを定義することで、Sphinx実行時にsphinx-apidocの実行をhookします。

[^1]: これはRead the Docsのオプションであり、初期設定の挙動ではありません。しかし、setuptools側で依存ライブラリを定義してあるのであれば、別途Read the Docs用に `requirements.txt` を作ったりするよりスマートだと思います。

前回の投稿のようにsetup.pyにsphinx-apidocを組み込んでしまっている場合には元の状態に戻します。その上で下記のように`setup.py`まわりを修正します。

```python:setup.py

cmdclass = {} 

# こうしないとライブラリを利用者としてインストールするためだけにSphinxが必要になる
try:
    from sphinx.setup_command import BuildDoc
    cmdclass['build_sphinx'] = BuildDoc
except ImportError:
    pass

# ...
# Rest of the setup.py
# ...

setup(
   ...
   cmdclass=cmdclass
)
```

```ini:setup.cfg
[build_sphinx]
source-dir = doc/source
build-dir  = doc/build
all_files  = 1
```

最後にRead the Docs側を設定します。

![rtd_settings.png](https://qiita-image-store.s3.amazonaws.com/0/152362/218f63f1-2f53-e690-4270-cd0fc91db8c3.png)

以上の手順をふむことで `python setup.py build_sphinx` で開発環境でドキュメンテーションのビルドができ、かつRead the Docsからも同じようにビルドできる環境が出来上がります。
UIImageViewではなくUIImageを回転させたい

`UIImage`を回転させるためには、どうすればいいのだろう。残念ながら`UIImage`は`transform`も`animation`も持ってないので、`UIImageView`を回転させるしかありませんが、生きていれば`UIImage`を回転させるしかないんだって時もあります...orz


そんな時に救ってくれる神の関数がこちら！

```swift


    
    func imageRotatedByDegrees(oldImage: UIImage, deg degrees: CGFloat) -> UIImage {
        //Calculate the size of the rotated view's containing box for our drawing space
        let rotatedViewBox: UIView = UIView(frame: CGRect(x: 0, y: 0, width: oldImage.size.width, height: oldImage.size.height))
        let t: CGAffineTransform = CGAffineTransform(rotationAngle: degrees * CGFloat.pi / 180)
        rotatedViewBox.transform = t
        let rotatedSize: CGSize = rotatedViewBox.frame.size
        //Create the bitmap context
        UIGraphicsBeginImageContext(rotatedSize)
        let bitmap: CGContext = UIGraphicsGetCurrentContext()!
        //Move the origin to the middle of the image so we will rotate and scale around the center.
        bitmap.translateBy(x: rotatedSize.width / 2, y: rotatedSize.height / 2)
        //Rotate the image context
        bitmap.rotate(by: (degrees * CGFloat.pi / 180))
        //Now, draw the rotated/scaled image into the context
        bitmap.scaleBy(x: 1.0, y: -1.0)
        bitmap.draw(oldImage.cgImage!, in: CGRect(x: -oldImage.size.width / 2, y: -oldImage.size.height / 2, width: oldImage.size.width, height: oldImage.size.height))
        let newImage: UIImage = UIGraphicsGetImageFromCurrentImageContext()!
        UIGraphicsEndImageContext()
        return newImage
    }

```

# 使い方

```swift

 var pinImage = UIImageView()
        pinImage = UIImageView.init(frame: CGRect.init(x: 0, y:15, width: 200, height: 200))
        let topImage:UIImage = UIImage(named:"pin")!
        pinImage.image = imageRotatedByDegrees(oldImage: topImage, deg: 90.0)
        self.view.addSubview(pinImage)


```

# ソース

[github](https://github.com/Ryosuke-Hujisawa/Rotate-UIImage-in-swift3)

# 参考

[Rotate UIImage in swift](https://stackoverflow.com/questions/36645060/rotate-uiimage-in-swift)

[UIImageViewではなくUIImageを回転させたい](http://off.tokyo/blog/2017/07/09/uiimageview%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%8Fuiimage%E3%82%92%E5%9B%9E%E8%BB%A2%E3%81%95%E3%81%9B%E3%81%9F%E3%81%84/9)
Vimプラグイン NERFTreeが便利だった


###NERDTreeとは
vimのプラグインでvimを開きながらディレクトリをツリー表示することが出来るものです。

![スクリーンショット 2017-07-09 11.52.14.png](https://qiita-image-store.s3.amazonaws.com/0/117824/ad56d8f4-a7ed-c96c-07d0-5fb74d55a589.png)
###導入方法
vimのプラグインツール「NEOBUNDLEをインストールします。

```
curl https://raw.githubusercontent.com/Shougo/neobundle.vim/master/bin/install.sh | sh
```

###vimrcを修正

~/.vimrcに以下のコードを記述する

```ruby:~/.vimrc
if has('vim_starting')
  set nocompatible               " Be iMproved
 
  " Required:
  set runtimepath+=~/.vim/bundle/neobundle.vim/
endif
 
" Required:
call neobundle#begin(expand('~/.vim/bundle/'))
 
" Let NeoBundle manage NeoBundle
" Required:
NeoBundleFetch 'Shougo/neobundle.vim'
 
" My Bundles here:
NeoBundle 'Shougo/neosnippet.vim'
NeoBundle 'Shougo/neosnippet-snippets'
NeoBundle 'tpope/vim-fugitive'
NeoBundle 'kien/ctrlp.vim'
NeoBundle 'flazz/vim-colorschemes'
 
" You can specify revision/branch/tag.
NeoBundle 'Shougo/vimshell', { 'rev' : '3787e5' }
 
call neobundle#end()
 
" Required:
filetype plugin indent on
 
" If there are uninstalled bundles found on startup,
" this will conveniently prompt you to install them.
NeoBundleCheck

```

NERDTreeのBundleを `My Bundles here`以下に追記します

```
NeoBundle 'scrooloose/nerdtree'
```

###Bundleにインストール
~/.vimrcを保存してから再度vimを開きコマンドを実行

```
:NERDTreeToggle
```

これで素敵なvim生活が始まります！
Vue.jsで動的にモーダルウィンドウを表示する

[モーダルウィンドウ](http://www.weblio.jp/content/%E3%83%A2%E3%83%BC%E3%83%80%E3%83%AB%E3%82%A6%E3%82%A3%E3%83%B3%E3%83%89%E3%82%A6)を動的に表示する`Vue.js`コンポーネントのサンプルです。

ソース：[https://github.com/asaokamei/vue2-dynamic-modal](https://github.com/asaokamei/vue2-dynamic-modal)

* モーダルウィンドウのサンプルコードは、例えばVue.jsのオフィシャルサイトにもたくさんあります。ただモーダルの中身が固定されているものが多いです。（例：`index.html`）
* 一方、クリックするボタンによりモーダルの中身が変えようとすると面倒になります。（例：`tasks.html`）

### 動的なモーダルウィンドウの例

動的なモーダルウィンドウの例です。

![dynamic-modal.gif](https://qiita-image-store.s3.amazonaws.com/0/31171/9f37f796-b8f0-95e2-6631-22da53786aed.gif)

クリックするタスクによって、モーダルの中身が違うのがわかると思います。


コードの説明
---------

`tasks.js`の中を簡単に説明してみます。このJSでは、メインの`$app`と`modal`コンポーネントがあります。そして、もうひとつ、`Hub`というイベントハブ用のVueオブジェクトを導入しています。

```js
var Hub = new Vue();

Vue.component(
    'modal', {
        template: '#modal-template',
        data: function() {
            /* いろいろ設定 */
        },
        methods: {
            open: function (task) {/* コード省略 */},
            close: function () {/* コード省略 */}
        },        
        mounted: function() {
            this.$nextTick(function () {
                Hub.$on('open-modal', this.open);
                Hub.$on('close-modal', this.close);
            }.bind(this));
        }
    });

new Vue({
    el: '#app',
    methods: {
        openModal: function (task) {
            Hub.$emit('open-modal', task);
        },
        closeModal: function () {
            Hub.$emit('close-modal');
        }
    }
});
```

`modal`コンポーネントを初期化するときに、`open-modal`と`close-modal`というイベントを`Hub`に登録しています。

メインの`app`コンポーネントでは、例えば`openModal`から、先の`open-modal`イベントを呼び出せば、後は`modal`がよしなに処理してくれます。

### HTMLファイル側

モーダルを呼び出すHTML側のJavaScriptも簡単に見てみます。

```html
<ul>
    <li v-for="task in tasks">
        {{ task.id }}: {{ task.name }}
        <button @click="openModal(task)" @keyup.esc="closeModal()">more</button>
    </li>
</ul>
```

ボタンをクリックすると`openModal(task)`が呼び出され、一緒にモーダルに表示する`task`も一緒に渡してます。



参考
----

* [コンポーネント間イベント通信の方法を変更しよう](http://qiita.com/c-cho/items/5003347da40dcfca1b36)
* [Dynamic Modal Content With Vue.js](https://laracasts.com/discuss/channels/vue/dynamic-modal-content-with-vuejs)
さくらのクラウドでMetaTrader（MT4）を動かしてみた

FXの自動取引ツールのMetaTraderをさくらのクラウド上に展開したWindows Serverで動かしてみた。
初めて動かすので時間単位で使いたいと思いさくらのクラウドを選んでみました。

MetaTrader（MT4）は独自のスクリプトでFXの売買を行うことができるので、安定して動作させ続けるというニーズがあり、クラウドやVPS上で動作することが一般的です。

# やりたいこと
さくらのクラウド上にWindows Serverを立ててそこでMetaTraderを動かす。

# やったこと
## さくらのクラウドにWindows Serverのサーバーを作成する
これ自体はコントロールパネルからポチポチすれば作成完了です。

[さくらのクラウド サーバの作成・削除](https://help.sakura.ad.jp/hc/ja/articles/206208861-%E3%82%B5%E3%83%BC%E3%83%90%E3%81%AE%E4%BD%9C%E6%88%90-%E5%89%8A%E9%99%A4)

作成完了後にリモートデスクトップする前に、リモートコンソールから管理者のパスワード設定を行う必要があります。

## MetaTrader4をダウンロードする

対応しているFXの会社であれば公式でパッケージを配布しています。今回は登録不要でダウンロードだけはできる楽天証券FXからダウンロードしてみました。

[楽天MT4ダウンロード](https://www.rakuten-sec.co.jp/web/fx/mt4/download.html)
インストール自体はウィザードに従ってポチポチすればできます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/190723/442e3c18-011a-f905-aec1-581545ce2d25.png)
インストール後の画面を開いた状態。
各通貨のチャートやMetaTraderを操作するためのスクリプトウインドウを開いた図。
※ちなみに回線不通と表示されているのはデモ口座のログイン認証を行っていないため

# 結果・感想
MetaTrader自体はメモリの消費量はそれほど多くなかったです
（実際に動かし始めると変わってくるかもしれないので、最初は余裕を見て大きめのプランでサーバを作成し、プラン変更でサイジングするといいかと思います）


## 良かったこと
+ 時間単位で使えるので試すのには良かった
+ サーバのスペックを数秒で行える（ただしサーバのシャットダウンは必要）
+ データ転送課金がないのでデータを垂れ流しても安心

上に書いたようにサイジングを簡単にできることが最大の特徴だと思います。最初からVPSやデスクトップだけを貸し出すサービスの場合には契約ごとにお金が発生するので、さくらのクラウドで必要スペックを実際に体験し、見積もってからでも遅くないと思います。


## 気になったこと
+ 動かしっぱなしとした場合に、月額料金は少々高い

ちゃんとFXのトレードで勝てれば問題なし:grinning:
サイジングがちゃんとできて負荷などが読めるようになったらさくらのWindows VPSで動かしてみようと思います。
クラウドサーバでTensorFlow　その6

#概要
クラウドサーバでTensorFlowやってみた。
cgi-binでpython3やってみた。
jsonのクロスドメイン対策してみた。

#環境
クラウド idcf
linux debian-8.11
tensorflow 1.2
gpu 無し

#サンプルコード

```
#!/usr/bin/python3
import sys
import os
import cgi
import json
import cgitb
cgitb.enable()

print ('Content-Type: text/json; charset=utf-8')
print ('Cache-Control: no-cache')
print ('Access-Control-Allow-Origin: *')
print ('Access-Control-Allow-Headers: *')
print ('Access-Control-Allow-Methods: GET, HEAD, POST, TRACE, OPTIONS')
res = json.dumps({
	'status': True,
	'num': 5
})
print ("Content-Length: ", len(res))
print ("Connection: close")
print ()
print (res)
```
Jupyter + Matplotlib > Warning:"matplotlib is currently using a non-GUI backend, " > fig.show()は不要

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 16.04 LTS desktop amd64
TensorFlow v1.1.0
cuDNN v5.1 for Linux
CUDA v8.0
Python 3.5.2
IPython 6.0.0 -- An enhanced Interactive Python.
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
```

Ubuntu 14.04 LTSからUbuntu 16.04 LTSに環境を変更後、Jupyter + Matplotlibにて描画時に下記のWarningが出るようになった。

> /usr/local/lib/python3.5/dist-packages/matplotlib/figure.py:403: UserWarning: matplotlib is currently using a non-GUI backend, so cannot show the figure
  "matplotlib is currently using a non-GUI backend, "

```py
%matplotlib inline

# sine curve learning 
# Jul. 08, 2017

import numpy as np
import matplotlib.pyplot as plt

data1 = np.loadtxt('input.csv', delimiter=',')
#data2 = np.loadtxt('res.170708_0830.cut', delimiter=',')
data2 = np.loadtxt('res.170709_0900.cut', delimiter=',')

input1 = data1[:,0]
output1 = data1[:,1]
input2 = data2[:,0]
output2 = data2[:,1]

fig = plt.figure()
ax1 = fig.add_subplot(2,1,1)
ax2 = fig.add_subplot(2,1,2)

ax1.scatter(input1,output1)
ax2.scatter(input2,output2)

ax1.set_xlabel('x')
ax1.set_ylabel('sin(x)')
ax1.set_xlim([0,1.0])
ax1.grid(True)

ax2.set_xlabel('x')
ax2.set_ylabel('sin(x)')
ax2.set_xlim([0,1.0])
ax2.grid(True)

fig.show()
```

### 対応 > fig.show()は不要

https://stackoverflow.com/questions/37365357/when-i-use-matplotlib-in-jupyter-notebook-it-always-raise-matplotlib-is-curren
によると

> You don't need the line of "fig.show()". Just remove it. Then it will be no warning message.

コード最後のfig.show()をコメントアウトしたらWarningが出なくなった。
Rich Path Animator: あなたのアンドロイドパスとベクトルのフルコントロール

あなたのアンドロイドパスとベクトルのフルコントロール

Rich Path Animator
https://github.com/tarek360/RichPath

![header.gif](https://qiita-image-store.s3.amazonaws.com/0/191294/c7506c9f-8519-6d36-03af-e28b1861c8cb.gif)

![samples.gif](https://qiita-image-store.s3.amazonaws.com/0/191294/c6df2381-9c74-72d4-7981-d67804e09009.gif)
Bogoのlanguage switcherの表示テキストを変更する

# フィルターフックで書き換え

functions.phpに

```php:functions.php
add_filter( 'bogo_language_switcher_links','bogo_override_labels');
function bogo_override_labels($output){
	foreach($output as $key => $value){
		if($value['lang'] === 'en-US'){
			$output[$key]['title'] = 'EN';
			$output[$key]['native_name'] = 'EN';
		}
		else if($value['lang'] === 'ja'){
			$output[$key]['title'] = 'JP';
			$output[$key]['native_name'] = 'JP';
		}
	}
 return $output;
}
```
$value['lang']の値で振り分けてラベル表示用のtitleとnative_nameを上書きする。

titleはタイトル属性としてとnative_nameがない場合のラベルテキストとして利用されている様子。
https://github.com/wp-plugins/bogo/blob/master/includes/link-template.php

# 過去の反省

```:css
.bogo-language-switcher .en-US a{
 font-size: 0;
}
.bogo-language-switcher .en-US a:after{
 content: 'EN';
 font-size: 14px;
}
```
みたいな対応もできるんですが、昔その対応したサイトに国旗が表示されるようになっていたのを見て考え直しました。

なお国旗については
https://joppot.info/2017/03/29/3657
こちらのサイト参考に消しました。
『Python3ではじめるシステムトレード』読書メモ

#Python3ではじめるシステムトレード
書籍『[Python3ではじめるシステムトレード](https://www.amazon.co.jp/dp/4775991477)』にて、つまずいた箇所などのメモ。
##１．ez_setup.pyが見つからない

```text:p26
まずez_setup.pyをダウンロードする。次のページからダウンロード可能である。
http://trac.edgewall.org/wiki/TracPlugins
```
・指定のページに目的のファイルは見つからなかった
・現在（2017/07/08）はez_setup.pyなしにeasy_installが使える様子
・従って、p26～27の「2.2.1.1　easy_installの設定」はスキップ　

##２．米国ヤフーファイナンスからのデータ取得でエラー
```python:p62
price=pdr.DataReader("N225","yahoo","1984/1/4",end)
price.head(1)
```
・次のエラーが発生した

```
ConnectionError: HTTPConnectionPool(host='ichart.finance.yahoo.com', port=80): Max retries exceeded with url: /table.csv?s=N225&a=0&b=4&c=1984&d=6&e=7&f=2017&g=d&ignore=.csv (Caused by NewConnectionError('<requests.packages.urllib3.connection.HTTPConnection object at 0x000002A7A3C4F5F8>: Failed to establish a new connection: [Errno 11001] getaddrinfo failed',))
```
・ダウンロードしたreadme.txtに次の記載があり、これが原因か？

```text:readme.txt
2017年7月4日Yahoo FinanceのAPIによる米国株価等のダウンロードのサービス停止
```
##３．年間収益率の算出
```text:p77
ave=n225[dates[i]:dates[i+1]].pct_change().mean()*250
```
・これは「1日の変化率の、平均の、250倍が、1年間の変化率」ということか？
・1年=250日で計算するのは、問題ないと思いますが、
・本当は、[調和平均](https://ja.wikipedia.org/wiki/%E8%AA%BF%E5%92%8C%E5%B9%B3%E5%9D%87)か何かが正しいような気もする
・書籍の方法が正しいのか？実は正しくないけど、簡易な計算としてOKなのか？

##４．ボラティリティの算出
```text:p77
vol=np.log(n225[dates[i]:dates[i+1]]).diff().std()*np.sqrt(250)
```
・標準偏差の平均は「ルート（（標準偏差^2の和）÷ｎ）」だったから、
・標準偏差の足し算は「ルート（標準偏差^2の和）」、即ち、
・標準偏差の掛け算は「ルート（標準偏差^2×250）」＝「標準偏差×ルート（250）」ということかな？
（・・・と思ったけど、そうじゃない、計算の理解混乱中）

##５．pandas.core.datetoolsモジュールは将来廃止
p97「6.4.9静的分析」のコマンド実行したら、赤いメッセージが現れ、驚いた。でも、今は問題ない様子。

```text:メッセージ
The pandas.core.datetools module is deprecated and will be removed in a future version. Please use the pandas.tseries module instead.
  from pandas.core import datetools
```
```text:google訳
pandas.core.datetoolsモジュールは廃止され、将来のバージョンで削除されます。 代わりにpandas.tseriesモジュールを使用してください。
   pandas.coreからのインポートdatetools
```
##６．dropna()が二重？
```text:p97
n225 = pdr.DataReader("NIKKEI225", 'fred',"1949/5/16",end).dropna()
lnn225=np.log(n225.dropna())
```
dropna()が二重にかかってるように見える。何か意味があるのだろうか？

##ギブアップ
資料ダウンロードしたら、そのまま演習を実行できるので、試しやすかったのですが、、、、
統計の説明など、自分が楽しく読んで理解できるレベルの本ではなかった。
でも、面白そうな分野なので、またどこかで何かを味見しようと思います。

この本に関しては、ここで終了します。
ありがとうございました。
Windows JMeter clientからLinuxな JMeter Serverでremote testする時のtips

俺です。JMeter素人がバレる記事その2です。

Windowsに仕込んだJMeter clientでJMeter remoteを実行した時、以下のエラーメッセージが出たらWindows Firewallを殺すかJMeter ServerのportをpassするようにFindows firewallルールのin/outに含めると良いです。

`Engine is busy - cannot create JMeter engine`

```
2017-07-08 21:01:49,055 WARN o.a.j.e.RemoteJMeterEngineImpl: Engine is busy - cannot create JMeter engine
2017-07-08 21:02:16,507 ERROR o.a.j.s.RemoteListenerWrapper: testStarted(host) on XX.XX.XX.XX:1099
java.rmi.ConnectException: Connection refused to host: XX.XX.XX.XX:1099; nested exception is:
	java.net.ConnectException: Connection timed out (Connection timed out)
	at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:619) ~[?:1.8.0_131]
	at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:216) ~[?:1.8.0_131]
	at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:202) ~[?:1.8.0_131]
	at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:130) ~[?:1.8.0_131]
	at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(RemoteObjectInvocationHandler.java:227) ~[?:1.8.0_131]
	at java.rmi.server.RemoteObjectInvocationHandler.invoke(RemoteObjectInvocationHandler.java:179) ~[?:1.8.0_131]
	at com.sun.proxy.$Proxy21.testStarted(Unknown Source) ~[?:?]
	at org.apache.jmeter.samplers.RemoteListenerWrapper.testStarted(RemoteListenerWrapper.java:79) [ApacheJMeter_core.jar:3.2 r1790748]
	at org.apache.jmeter.engine.StandardJMeterEngine.notifyTestListenersOfStart(StandardJMeterEngine.java:220) [ApacheJMeter_core.jar:3.2 r1790748]
	at org.apache.jmeter.engine.StandardJMeterEngine.run(StandardJMeterEngine.java:388) [ApacheJMeter_core.jar:3.2 r1790748]
	at java.lang.Thread.run(Thread.java:748) [?:1.8.0_131]
Caused by: java.net.ConnectException: Connection timed out (Connection timed out)
	at java.net.PlainSocketImpl.socketConnect(Native Method) ~[?:1.8.0_131]
	at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) ~[?:1.8.0_131]
	at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) ~[?:1.8.0_131]
	at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) ~[?:1.8.0_131]
	at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) ~[?:1.8.0_131]
	at java.net.Socket.connect(Socket.java:589) ~[?:1.8.0_131]
	at java.net.Socket.connect(Socket.java:538) ~[?:1.8.0_131]
	at java.net.Socket.<init>(Socket.java:434) ~[?:1.8.0_131]
	at java.net.Socket.<init>(Socket.java:211) ~[?:1.8.0_131]
	at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(RMIDirectSocketFactory.java:40) ~[?:1.8.0_131]
	at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(RMIMasterSocketFactory.java:148) ~[?:1.8.0_131]
	at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:613) ~[?:1.8.0_131]
	... 10 more
```

良い負荷試験Lifeを!
mastodon 諸々メモ (2017/07/09 版)


# 履歴

- 2017/07/09 作成<br>
まだ全然わからないので、取り急ぎこの辺りから見てみる。

----

# mastodon とは？

mastodon ってなんなのさ？

- [【初心者向け】マストドン(Mastdon)について解説 - Qiita](http://qiita.com/tsi/items/9662e40df4b8f9c09408)
@tsi様

- [Mastodon 関連情報まとめ - Qiita](http://qiita.com/bezeklik/items/0b71eade799648431bf1)
@bezeklik様

# ソース

## 本家

- [GitHub - tootsuite/mastodon: A GNU Social-compatible microblogging server](https://github.com/tootsuite/mastodon)


## 独自拡張

- [mastodonのソースコード一覧 · GitHub](https://gist.github.com/chsh/62759277039222ba14ce8b7254e9b6b9)

各所の独自拡張のソースコード

## ソースコードについて

- [mastodonのソースコードを読んで思ったこと](https://shinodogg.com/?p=7643)

- [mastodonのソースコードを読んでみるとRailsの勉強にすごく良い | Permanent Til](http://permanent-til.me/archives/1440)

- [オープンソースのmastodonからみるRails + React構成や採用されているライブラリについて - そうそうそれ！](http://sousousore1.hatenablog.com/entry/2017/04/22/033917)



# インスタンス一覧

- [Mastodon instances](https://instances.mastodon.xyz/)
本家？

- [日本 Mastodon インスタンス一覧 - Qiita](http://qiita.com/noraworld/items/ea853c6897326feda51f)
@noraworld様

- [日本のマストドン インスタンス一覧 - Qiita](http://qiita.com/cv_k/items/8ecafea3ce7dd720cec6)
@cv_k様

- [厳選：ここなら登録しても安心な日本のマストドンインスタンス一覧 - Qiita](http://qiita.com/yamashitar/items/c51cd0cd28c75b952bb8)
@yamashitar様
自作のCLIP STUDIOプラグインを複数入れて動かないとき

### 問題
CLIP STUDIOのフィルタープラグインSDK (https://www.clip-studio.com/clip_site/download/clipstudiopaint/cspsdk) のサンプルプロジェクト"HSV"を複製してオリジナルプロジェクトを作ってコンパイルした。しかし、出来上がった.cpmファイルとサンプルのHSV.cpmを両方入れると片方が動かないようになってしまった。
### 原因と解決策
プラグインごとに異なる必要のある変数moduleIDが被っていた。
適当なGUIDを生成して、TriglavPluginCall()内にあるmoduleIDStringに入れると両方動く。
Pumaの起動におけるpumaコマンドとpumactlコマンドの違い

### 背景

これまで開発していたRailsアプリケーションはアプリケーションサーバにUnicornを採用して本番稼働させていた。最近になってようやくRails5に移行しようかとなったので、ずっと気になっていたPumaを試験的に採用してみることにした。

開発したアプリーションをPumaで起動する際には、どうやら「pumaコマンド」で起動する方法と「pumactlコマンド」で起動する方法があるらしい、ということがわかったがいまいちその違いがわからなかったので調べてみた。


### Pumaとは

Pumaではリクエストの並列処理を実現させるためにスレッドを利用している。リクエストを処理するためのスレッドをスレッドプールに事前に用意しておいて、リクエストがきたときにスレッドに処理を任せることでスレッドベースな処理を実現させているらしい。
[GitHub - puma/puma: A ruby web server built for concurrency](https://github.com/puma/puma)


### Pumaの起動

Pumaを本番環境で起動する際、どうやら起動に使うコマンドは大きく分けて２つあるらしい、ということを知った。

**1. pumaコマンドでの起動**

```
$ bundle exec puma -t 5:5 -p 3000 -e production -C config/puma.rb -d
```

**2. pumactlコマンドでの起動**

```
$ bundle exec pumactl start
```

1は何をやっているかというと、Pumaを3000番ポートを指定してproductionモードで起動させている。ただし、最小スレッドは5、最大スレッドは5を指定している。設定ファイルは`config/puma.rb`にあるからそれを読んでね。あと、ちゃんとデーモンで実行してね。といったことをやっている。

対して2はpumactlコマンドを使って起動をおこなっている。どうやら、ポートを指定したり環境を指定したりはしないらしい。ただ、デフォルトで `config/puma.rb` を読みにいっているようで、記述した設定に沿って起動してくれるみたいだった。

つまり、`$ bundle exec puma -C config/puma.rb` と `$ bundle exec pumactl start` は同義なのでは、というところまではすぐに理解できた。

**あれ、pumactlコマンドってなんのためにあるんだろう...**


### pumaコマンドとpumactlコマンドの違い

このあたりちゃんと説明した日本語の情報がとても少なくて、リポジトリのREADMEを読んだり「what is deference between puma command and  pumactl command」みたいなキーワードでがんばって調べたらRuby Journalになんかそれっぽいことが書いてあった。英語ができないととてもつらい。

> As we can see that above operations can be tedious and error prone and definitely not fun to work with a big deployment scale. Introducing pumactl, this utility automates all of above tasks.
[Digesting Pumactl](http://ruby-journal.com/digesting-pumactl/)

要するに、pumaコマンドで起動したりしてるといちいちオプション付けないといけないから大規模開発だとめっちゃつらいしやばいくらい闇だし、pumaコマンドでやってることはpumactlコマンドで自動化しような。ということを言っている。

なるほど、確かに。pumactlコマンドだと問答無用で設定ファイルが読まれるようになっているから、スレッドの数はどうするんだだの、ポート番号はどうするんだだの、ちゃんとコードで管理できる。

停止や再起動においてもpumactlコマンドで安全にできるらしい。

> Available commands: halt, restart, phased-restart, start, stats, status, stop, reload-worker-directory


### ということで

本番の商用環境で運用する際、Pumaの起動には極力「pumaコマンド」ではなく「pumactlコマンド」を使いましょうという感じだった。停止と再起動においても「pumactl」コマンドが用意されているのでそれをつかって安全に実行できますよ、とのこと。

ずっと気になっていたのですっきりしてよかったです。
量子コンピュータ（シミュレータ）を試す

# はじめに
量子コンピュータ（シミュレータ）を一般に気楽に利用できるようになり，
手軽に試すことのできる時代が遂にやってまいりました。

IBM Qの利用開始まで，1量子ビット同士の加算は，下記にわかりやすく記事にされています。
http://qiita.com/kjtnk/items/8385052a50e3154d1022

上記ふまえた上で，自分でも少し触ってみました。

# 1量子ビット同士以上の加算
今回は，量子ビットq[0]，q[1]，q[2]の加算を試してみました。
結果が8通りですので，shotsを上限8192に設定すれば，0.125に近づくはずです。

使用したゲート　：　アダマール演算ゲート，トフォリゲート，制御NOTゲート
q[0]，q[1]，q[2]：アダマール演算により，0・1の重ね合わせ状態
q[3]：q[0]，q[1]，q[2]の直和
q[4]：　桁上がりの計算

![111.png](https://qiita-image-store.s3.amazonaws.com/0/104268/a30e62ea-3076-ec89-7251-7c72b020bb92.png)


# もつれ状態の生成
5量子ビットのもつれ状態（GHZ状態）の生成をしたいと思います。
(The number of shots：8192）

使用したゲート　：　アダマール演算ゲート，制御NOTゲート
![スクリーンショット 2017-07-09 3.07.07.png](https://qiita-image-store.s3.amazonaws.com/0/104268/09308c2a-4be4-dde8-1267-473ef93057f3.png)



# 最後に
シミュレータで計算させて結果を気楽に見ることができるので，非常に勉強になります。
興味のある方はぜひ試してみてはいかがでしょうか。
ショアのアルゴリズムやグローバーのアルゴリズムも，シミュレータで試すことができると思われます。
FlaskからDockerのMySQLコンテナに接続する

## 概要
Flaskのチュートリアルをやってみて、
DBはMySQLがいいよう。(´・ω・\` )　みたいな人がいてさらに
GUIでテーブルを確認したいよう(´・ω・\` )　　ってなってたから
DockerのMySQLコンテナを簡易に立ててSequel Proで接続するまでをやります。

## 動作確認した環境
* OSX 10.11
* Docker for mac 17.06
* Python 2.7.10
* pip 9.0.1
* Sequel Pro 1.1.2

## 前提
Flaskのチュートリアルをやります。
以下のサイトの**STEP0**から**STEP3**までが終わっている状態です。

```sh
$ tree

├── flaskr
│   ├── __init__.py
│   ├── __init__.pyc
│   ├── config.py
│   ├── config.pyc
│   ├── flaskr.db
│   ├── models.py
│   ├── models.pyc
│   ├── static
│   │   └── style.css
│   ├── templates
│   │   ├── layout.html
│   │   └── show_entries.html
│   ├── views.py
│   └── views.pyc
├── manage.py
└── requirements.txt
```

<img width="619" alt="スクリーンショット 2017-07-09 2.48.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/138750/5838c5f8-a8b9-02f9-654d-5c1babb7283e.png">


## MySQLコンテナを立てる

mysqlのrootパスワードを `MYSQL_ROOT_PASSWORD` という環境変数に設定してください。
後で使います。
Mac側から接続できるようにポート番号 `3306` をつないでおきます。

```sh
docker run -d -e MYSQL_ROOT_PASSWORD=your_root_password -p 3306:3306 mysql:5.7
```

## Sequel Proを使用する

GUIで見た方がわかりやすいので、今回はSequel Proという
データベースクライアントソフトを使います。

[Sequel Pro](https://www.sequelpro.com/)

起動すると、接続ウィンドウが開くと思うので、以下を入力します。

* 名前: 好きな名前
* ホスト: `0.0.0.0`
* ユーザ名: `root`
* パスワード: 先ほど `MYSQL_ROOT_PASSWORD` に設定した値
* データベース: 空白
* ポート: `3306` (空白でOK)

下のように接続できて何もない画面に進めばOK

<img width="696" alt="スクリーンショット 2017-07-09 3.03.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/138750/aa3ecedf-9ea3-359a-5567-f6d5852c6947.png">

次にデータベースを作成します。
上のメニューから **データベース** -> **データベースを追加**
データベースの名前とエンコードを入力してデータベースを作ります。
今回はデータベース名を「testdb」 エンコードを 「UTF-8」 に設定しました。



さらに、テーブルを作成します。
チュートリアルで作った掲示板のようなサービスをMySQLで動かすためには、
Flaskアプリケーションで指定されるテーブルを追加しておく必要があります。

では、画面一番左下の + ボタンを押して、テーブルを作成します。
名前を **entries** に設定します。
間違えると、テーブルが見つからずエラーになります。

また、構造のタブで、

* title [VERCHAR] [長さ:255]
* text [TEXT]

を設定します。
以下のようになればOKです。

<img width="995" alt="スクリーンショット 2017-07-09 3.13.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/138750/fda354a5-5f9b-fa2e-e4c3-72a9a5968dc7.png">

これでデータベースの準備ができました。

## MySQLに接続する

ここからはまたFlaskに戻ります。

MySQLに接続するためには `PyMySQL` をインストールする必要があります。
以下のコマンドを実行します。

```sh
$ sudo pip install PyMySQL
```

次にMySQLを使用するように `flaskr/config.py` を変更します。
`SQLALCHEMY_DATABASE_URI` に
`mysql+pymysql://[ユーザ名]:[パスワード]@[ホスト]/[DB名]` となるように
設定します。また、 `SECRET_KEY` も相変わらず適当な文字列を設定しておく必要があります。

```python:flaskr/config.py
SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:your_root_password@0.0.0.0/testdb'
SECRET_KEY = 'XXXXXXXXXXXXXXXXXX'
```

これで `python manage.py` を実行し、アプリケーションを動かします。
投稿したデータがSequel Pro上で確認できるところまでいけば
成功ですヾ( ﾟдﾟ)人( ﾟдﾟ)ﾉﾞ
[ruby][rails]Date,Timeクラスの曜日チェック 〜月末の指定曜日を出力を添えて〜

# Date,Timeクラスの曜日チェック

rubyのDate,Timeクラスで曜日をチェックしたい場合、
`#sunday?,#monday?,#tuesday?,#wednesday?,#thursday?,#friday?,#saturday?`が使えます:moyai:
このメソッドはTimeクラスにもあります:cow:

```ruby
# もしDate.nowが日曜日だったら・・・
Date.now.sunday?    # => true
Date.now.monday?    # => false
Date.now.tuesday?   # => false
Date.now.wednesday? # => false
Date.now.thursday?  # => false
Date.now.friday?    # => false
Date.now.saturday?  # => false
```

# 月末の指定曜日を出力するメソッド

月の最後の指定した曜日の日付を出力するようなメソッドは、
デフォルトでは存在しないみたいなので、自作する必要があります。

### rubyだけで実装すると・・・

```ruby
def last_friday_of_month(date)
  beginning_of_month= Date.new(date.year, date.month,  1) # 月初
  end_of_month   = Date.new(date.year, date.month, -1) # 月末
  [*beginning_of_month..end_of_month].reverse_each do |date|
    break date if date.friday? # 月の最後の"金曜"の日付を出力
  end
end

require 'date'
last_friday_of_month(Date.today)
# => #<Date: 2017-07-28 ((2457963j,0s,0n),+0s,2299161j)>
```

### railsだと少し簡潔に
```ruby
def last_friday_of_month(date)
  [*date.beginning_of_month..date.end_of_month].reverse_each do |date|
    break date if date.friday? # 金曜
  end
end

last_friday_of_month(Date.today)
# => Fri, 28 Jul 2017
```
[無料]Githubで外部リンクを別タブで開くChrome拡張

[合同会社kumanote](http://kumano-te.com/)のTanakaです。

今回はChrome拡張のご紹介です。
▼ こちらからインストールできます。
https://chrome.google.com/webstore/detail/githubtabmaker/aaoclindamfdofdgnoclfccmedlmanko

![screenshot.jpg](https://qiita-image-store.s3.amazonaws.com/0/188896/6c13c0eb-6d80-35fe-303f-2bdbda90d29e.jpeg)


## 課題

特に**Githubユーザ**の皆様へ

Githubのissueやwikiで参考リンクなど外部リンクを記載することはないでしょうか？
特にGoogleSpreadSheetやslackのリンクなどをはることが多いですよね？？

そんな時、issueに記載されたリンクをクリックすると、同一タブ内で画面遷移してしまい、イライラした経験はないでしょうか？
基本issueと外部リンクは同時にみたいことが多いので、外部リンクは別タブで開きたいと思います。

そこで、外部リンクは全て別タブで開くChrome拡張を作成し、公開しましたので共有させていただきます。

## Chrome拡張

「GithubTabMaker」という名前で公開しております。（無料です！）

[こちら](https://chrome.google.com/webstore/detail/githubtabmaker/aaoclindamfdofdgnoclfccmedlmanko)からインストールできます。

### 仕様

このChrome拡張が有効になっている状態で、ページを読み込むと、外部リンクの`target`属性を全て`_blank`に書き換えています。

## オープンソース

また作ったChrome拡張は[Github](https://github.com/kumanote/GithubTabMaker)に公開しております。
MIT LICENSEとなっております。

以上です。
よろしくお願いします。
GrovePi における Dexter 社と Seeedstudio 社の違い

<details><summary>GrovePi とは</summary><div><br>

##GrovePi とは

<img width="50%" alt="GrovePi-Grove for the Raspberry.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/78776/fdcf57fc-55a2-90c8-f370-a481086f00b9.jpeg">

`GrovePi` とは、Raspberry Pi に各種センサー類を半田付けなしで繋げるための GPIO 拡張ボード（俗に言う [HAT](https://www.raspberrypi.org/blog/introducing-raspberry-pi-hats/) の１つ）です。

厳密には、**"Grove" という規格でモジュール化されたパーツやコネクタ**を、Raspbery Pi でも使えるように  GPIO を拡張する基盤を「`GrovePi+`」といいます。

沢山のセンサー類が統一された規格でモジュール化されているので、パーツ同士をケーブルの抜き差しで組み合わせるだけで手軽に使えるため、半田付けなどの手間を減らしソフトウェア開発に専念できるというメリットがあります。

</div></details>

## Dexter 社は開発／設計元、Seeedstudio 社は製造元
[GrovePi](http://qiita.com/search?q=grovepi) のセンサーを利用する際の SDK やライブラリなど探すと「[Dexter Industries](https://www.dexterindustries.com/)」と「[Seeedstudio](https://www.seeedstudio.com/)」の２社が提供するライブラリがヒットします。

しかし、同じ Grove 互換のセンサーであっても両社での対応状況が異なり、Seeedstudio 社は情報（ Wiki ）がバラバラだったり、動かなかったりするので問い合わせてみたところ、__Dexter 社が GrovePi の設計やソフトの開発を行っており、Seeedstudio 社はそのハードウェアの製造元の一つ__とのこと。

>Dexter Industries designs the hardware and maintains all the software and libraries for the GrovePi and also provides support for it. Seeedstudio is our manufacturing partner and makes the GrovePi boards for us. [[引用元](http://forum.dexterindustries.com/t/grove-ir-receiver-not-working-with-raspi3-b-and-grovepi/2171/8?u=nonetiti)]

つまり、Dexter 社が提供するライブラリは GrovePi 全般に利用でき、Seeedstudio 社のライブラリは Seeedstudio 社が製造した Grove 互換センサーでのみ検証しているものということになります。

問題は日本で手に入る GrovePi モジュールは大半が Seeedstudio 社がダイレクトに提供しているもので、Dexter 社で検証したものでないため動作保証していないという点です。

実際に同じ Grove モジュール名でも、購入先が異なるとピンの並びが異なっている（GND と DATA のピンが入れ替わっていたりする）ものがあり、販売代理店もあまりこのことに言及していません。（センサー自体は壊れていないので、自分で検証して配線やプログラムを変えることが常識のためのようです。電子工作初心者には T-T）

逆に、GrovePi 用のセンサーを Arduino や他のハードに使いたい場合は、Seeedstudio 社などのハードウェアメーカーのライブラリに頼ることになります。
systemd環境のArch LinuxでDHCP(dhclient)を使ったネットワーク設定

## 概要
DHCPをつかったネットワーク設定をしたかったが、デフォルトで使用可能なdhcpcdがうまく動かなかったので、
dhclientを使うことにした。

## やったこと
### dhcpcdがうまく動かない
Arch Linuxの公式ドキュメントではdhcpcdを使用した例が記載されているが、下記のようなメッセージが出て成功しなかった。

```
# dhcpcd enp2s0

enp2s0: soliciting a DHCP lease
enp2s0: solicting an IPv6 router
enp2s0: no IPv6 Routers available
timed out
dhcpcd exited
```

### dhclientなら動いた
ためしに`dhclient enp2s0`を実行したらIPアドレスが設定されたので、こちらを使うことにした。

※なぜenp2s0を指定しているかというと、`ip a`で見えているデバイス名がこれだったから


### systemdにお任せする
起動時に実行してほしいので、systemdにお任せする。

```
# systemctl enable dhclient@enp2s0.service
```

コマンドは正常終了したが、OS再起動後に確認すると、IPアドレスが設定されていない

ログを見る。

```
# journalctl -u dhclient@enp2s0.service

...
Cannot find device "enp2s0"
...
```

もう一度`ip a`を実行してみるが、やっぱりある。

#### 起動時のログをみる

```
# dmesg | grep enp2s0
```

どうやらeth0からenp2s0にリネームしているらしい

#### デバイス名の指定を変える

```
# systemctl enable dhclient@eth0.service
```

再起動したところ、正しくIPアドレスは設定されていた。

ただし、`ip a`で確認できるデバイス名がenp2s0からeth0に変わっていた。実害ないし、いいか…


### 余談：systemdのサービス名(ユニット名？)に含めた" @eth0"という記法
ユニット設定ファイル（/usr/lib/systemd/system以下にある）内で、"%I"がeth0に置換されるようになる。

### 余談：dhclientはデフォルトでインストールされていない

pacmanコマンドでdhclientをインストールする必要があるが、ネットワークが繋がっていない状態のはず。

こんな感じで一時的に手動でネットワーク設定をするのがよいかもしれない。（IPアドレスは各々の環境に合わせること）

```
# ip link set eth0 up
# ip addr add 192.168.1.2/24 broadcast 192.168.1.255 dev eth0
# ip route add default via 192.168.1.1
```

https://wiki.archlinuxjp.org/index.php/%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E8%A8%AD%E5%AE%9A#.E6.89.8B.E5.8B.95.E3.81.A7.E5.89.B2.E3.82.8A.E5.BD.93.E3.81.A6.E3.82.8B

DNSも忘れずに設定しよう。（一時的な設定）

```
# cat /etc/resolv.conf

nameserver 8.8.8.8
```

## やり残し
 * なぜdhcpcdが動かなかったか
    * なんとなくIPv6を無効にしたり、こっちもeth0にしてみたら、動かないかな
    * tcpdumpしたら何かわかるかも
 * systemdでdhclientを起動するようにしたら、デバイス名がenp2s0がeth0に変わってしまった
    * 気にはなるけど、今のところ困っていない
JSONからPythonオブジェクトを生成する方法


[json – JavaScript Object Notation シリアライザ \- Python Module of the Week](http://ja.pymotw.com/2/json/)
の写経である

なんとなくの説明は　[JSONからPerlオブジェクトを生成する方法 \- Qiita](http://qiita.com/ymko/items/adb7c1dd6cb7332a0a45)　を参照のこと

```py
class MyObj(object):
    def __init__(self, s, y):
        self.s = s
        self.y = y

    def __repr__(self):
        return '<MyObj(%s)>' % self.s


def main():
    import json

    obj = MyObj('instance value goes here', "a")
    print(obj)

    # print('First attempt')
    try:
        print(json.dumps(obj))
    except TypeError, err:
        print("ERROR:", err)

    def convert_to_builtin_type(obj):
        # print('default(', repr(obj), ')')
        # Convert objects to a dictionary of their representation
        d = {'__class__': obj.__class__.__name__,
             '__module__': obj.__module__,
             }
        d.update(obj.__dict__)
        return d

    def dict_to_object(d):
        if '__class__' in d:
            class_name = d.pop('__class__')
            module_name = d.pop('__module__')
            module = __import__(module_name)
            # print('MODULE:', module)
            class_ = getattr(module, class_name)
            # print('CLASS:', class_)
            args = dict((key.encode('ascii'), value) for key, value in d.items())
            # print('INSTANCE ARGS:', args)
            inst = class_(**args)
        else:
            inst = d
        return inst

    # print('With default')

    json_txt = json.dumps(obj, default=convert_to_builtin_type)
    print(json_txt)

    obj2 = json.loads(json_txt, object_hook=dict_to_object)
    print(obj2)
    print(obj2.s)


if __name__ == '__main__':
    main()
    exit(0)

"""
<MyObj(instance value goes here)>
ERROR: <MyObj(instance value goes here)> is not JSON serializable
{"y": "a", "s": "instance value goes here", "__module__": "__main__", "__class__": "MyObj"}
<MyObj(instance value goes here)>
instance value goes here
"""
```