OmniAICreator/Qiita-1.07M huggingface dataset:
Webpackのloaderを作る

Webpackのloaderを理解します。

Webpackの途中結果をファイルにキャッシュする[cache-loader](https://github.com/webpack-contrib/cache-loader)の中身を見ながら自分の手で再構成します。

# 環境

```
npm init
mkdir src example
```

としてexapmleの方にwebpack.config.jsを配置してどしどし実行。src配下にはloaderとなるjsを配置します。
webpack.config.jsのresolveLoadersにsrcのディレクトリを記述します。

# 実行する

単純にwebpackを実行すると、loadersファイルが実行されます。

# デバッグする

実行コマンドを

```
node --inspect-brk node_modules/webpack/bin/webpack.js 
```

とすればchromeのインスペクタパネルでデバッグできます。

# How to write a loaderを読む

詳しくは公式ドキュメントを読むのが一番いいですが、exportsした関数にソースコードがstringとして渡ってくるようです。
https://github.com/webpack/docs/wiki/how-to-write-a-loader

# Cache loaderの中身を理解する

Webpackのビルドはメモリ上のキャッシュを持つことで起動後の２回目以降のビルドを差分だけ行うことができます。
起動時にfileに書いておいたキャッシュを用いることで最初のビルドの高速化を図ろうというのがこのプラグインです。

## pitching loaderについて

普段webpackのloaderは右から先に呼ばれます。
例えば

```
module: {
    rules: [
        {
            test: /\.js$/,
            use: [
                'bar', 'foo'
            ]
        }
    ]
}
```

上記のようなjsonの設定の場合fooから先に呼ばれるのですが、pitch関数はloaderが呼ばれる前に左から右に呼ばれます。
詳細は公式に
https://github.com/webpack/docs/wiki/loaders#pitching-loader

pitch関数内でreturn もしくは非同期の場合は`this.async`をに第一引数をnullとして実行することでloaderの処理を飛ばすことができます。

# Cache loaderの処理のオーバーヘッド

モジュール毎にファイルを生成したりファイルを読み込んだりしています。
> Note that there is an overhead for saving the reading and saving the cache file, so only use this loader to cache expensive loaders.

Githubにもこう書いてる通りファイルIO部分のオーバヘッドが大きいのでしょう。。
ということでモジュール毎のキャッシュファイルから、一つのどでかいjsonファイルにキャッシュを詰め込むようにしたが効果がなかったどころかだいぶ遅くなってしまいました。。。
最適化は難しい
ちょっとずつ読むドメイン駆動設計 第三部 より深い洞察へ向かうリファクタリング 第十章 しなやかな設計2 意図の明白なインターフェース

[前回](https://qiita.com/YasuhiroKimesawa/items/c240451e6746497fd446) の続きです

# 意図の明白なインターフェース
しなやかな設計のパターンその１は「意図の明白なインターフェース」。

## 名前が大事

ビジネスのルールを明示的にモデル化することは、[第９章 暗黙的な概念を明示的にする](https://qiita.com/YasuhiroKimesawa/items/809ac929026daef0b768)で見てきたように、深いモデルへの手がかりとなります。

ただし、明示された概念の名前がわかりずらいと、結局実装を読まなくてはいけない状況になってしまい本末転倒です。

## 意図の明白なインターフェース

なので、モデルに対する必要な概念は、実装の中身を見なくても良いように、**オブジェクトを使用するための**正しい名前になっている必要があります。。

モデルはその設計の意図が明らかになるように、**型名・メソッド名・引数名**が揃っていなければいけません。
これらが、すべて組み合わさって**意図の明白なインターフェース**が形成されます。

## メソッド名の変更[リファクタリング]
MartinFowlerも[リファクタリング](https://www.amazon.co.jp/dp/B01IGW5MG0/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)の「メソッド名の変更」パターンにて、こう述べています。

> メソッドにはその意図を伝えられるような名前をつけるべきです。

## 意図を示す名前[実装パターン]

KentBeckも[実装パターン](https://www.amazon.co.jp/dp/4894712873)にて、「意図を示す名前」として以下のように述べています。

> メソッド名は意図を伝達し、他の情報は他の方法で伝えるようにしよう

## 言うは易し行うは難し

「良い名前をつける」というのは色々な本に書いてありますし、言われなくてもわかるよと思う人も多いかと。
ただ、それができていますか？と聞かれると「う〜ん」と唸る人も多いのでは。自分も含めて。
言うは易し行うは難しという言葉がこれほど合うパターンはないでしょうね。


## ドメイン駆動設計的テストファースト

では、実際どうすれば意図の明白なインターフェースを設計できるか。

それは、振る舞いを実装する前にテストを書いて**実際にモデルを使用すること**です。

実装を書く前にテストを書くことで、**モデルを利用する側の視点**が得られ、意図の明白なインターフェースが理解できるようになります。

ん〜。これやってなかったな。。。こういう観点でテストを書くと、また違った視点を得られますね。

とりあえず、[テスト駆動開発](https://www.amazon.co.jp/dp/4274217884)を読みましょう。

## レビューを受けること
書籍にはなかったですが、第三者のレビューを受けることも役に立ちそう。

実装の詳細をレビューすることにはあまり意味はありません。テスト書けばいい話ですからね。

メソッド名から、変数名から、引数から、モデルの意図が理解できるか。この観点でレビューをしてもらえば良いのかと思います。

最近流行りの「モブプログラミング」やXPの「ペアプロ」も多くの利点があって、会社でも活用しているプラクティスなのですが、全員が「作る側」になってしまって、「使う側」の観点で見ることができるのかな？と今回これ読んで思ったりしました。

モブプロに参加していなかった人からのレビューもプラスで実施するといいかもしれませんね。
PostgreSQLのパーティショニング機能とLOCK TABLEの影響範囲の確認

PostgreSQL10のネイティブ・パーティショニング機能で作成されたパーティションが、テーブル単位のロック取得(LOCK TABLE)の影響をどのように受けるか確認する。

今回は、以下のシンプルなパーティションで確認する。

``` sql
CREATE TABLE parent (i INT) PARTITION BY LIST (i);
CREATE TABLE child1 PARTITION OF parent FOR VALUES IN (1);
CREATE TABLE child2 PARTITION OF parent FOR VALUES IN (2);
CREATE TABLE child3 PARTITION OF parent FOR VALUES IN (3);
CREATE TABLE child4 PARTITION OF parent FOR VALUES IN (4);
```

## Q. 親テーブルのロックで子テーブルのロックも自動的に取得されるか？

A. 親テーブルのロックを取得することで、その**すべての子テーブルについても自動的にロックが取得**される。

``` sql
=# BEGIN;

-- 親テーブルに対してACCESS EXCLUSIVEモードのロックを取得する。
=# LOCK TABLE parent IN ACCESS EXCLUSIVE MODE;

-- ACCESS EXCLUSIVEモードのロックを取得済のテーブル名を表示する。
-- 親テーブルとすべての子テーブルが表示され、
-- 子テーブルのロックも自動的に取得されることがわかる。
=# SELECT c.relname FROM pg_locks l, pg_class c
  WHERE l.relation = c.oid
  AND l.mode = 'AccessExclusiveLock'
  AND l.pid = pg_backend_pid();

 relname 
---------
 parent
 child2
 child3
 child1
 child4
(5 rows)
```

## Q. 子テーブルのロックで親テーブルや他の子テーブルのロックも自動的に取得されるか？

A. **親テーブルや他の子テーブルのロックは取得されない**。ロック取得されるのはLOCK TABLEの対象の子テーブルのみ

``` sql
=# BEGIN;

-- 子テーブルに対してACCESS EXCLUSIVEモードのロックを取得する。
=# LOCK TABLE child1 IN ACCESS EXCLUSIVE MODE;

-- ACCESS EXCLUSIVEモードのロックを取得済のテーブル名を表示する。
-- LOCK TABLEの対象の子テーブルのみが表示され、
-- 親テーブルと他の子テーブルのロックは取得されていないことがわかる。
=# SELECT c.relname FROM pg_locks l, pg_class c
  WHERE l.relation = c.oid
  AND l.mode = 'AccessExclusiveLock'
  AND l.pid = pg_backend_pid();

 relname 
---------
 child1
(1 row)
```

## Q. 子テーブルのロックの取得後、(ロック未取得の)他の子テーブルに対するSQL実行はロック待ちとならないか？

A. ロック待ちとなる。(厳密には、ロック待ちとなるかは、子テーブルのロックのモードとSQL実行の種類によって決まる)

``` sql
=# BEGIN;

-- 子テーブルに対してACCESS EXCLUSIVEモードのロックを取得する。
=# LOCK TABLE child1 IN ACCESS EXCLUSIVE MODE;
```

上記のトランザクションの実行中(COMMIT/ROLLBACK前)に、別のセッションから以下のSQLを実行する。

``` sql
-- 親テーブル経由でi=4に対応する子テーブルchild4にアクセスするSQLを実行する。
-- ロック取得済はchild1でアクセス先はchild4と対象テーブルが異なるため
-- (一見、ロック待ちは発生しないように見えるが)、ロック待ちは発生する。
=# SELECT * FROM parent WHERE i = 4;
```

PostgreSQL10のネイティブ・パーティショニングの実装だと、親テーブル経由のSQL実行時に、すべての子テーブルに対してSQL実行に必要なロック(SELECTなら基本的にはAccessShareLock)を取得していて、そのため子テーブルの別のロックと競合するらしい。

## まとめ

* 親テーブルのロックを取得することで、そのすべての子テーブルについても自動的にロックが取得される。
* 子テーブルのロックが取得されても、その親テーブルや他の子テーブルのロックが自動的に取得されることはない。
* ただし、子テーブルのロックが取得されると、親テーブル経由で他の子テーブルにアクセスするSQLでもロック待ちが発生する可能性がある。
Prefabからロードした際にアタッチしたものが外れる

Prefab化した敵にアタッチしておいたGameManagerオブジェクトをInstantiateでロードしたところ外れてしまったのでその時の対処方法。

##前提
1. ヒエラルキー上の敵オブジェクトはきちんとApplyしてprefab側に反映した
2. GameManagerにアタッチしてあるCanvasもPrefabフォルダにないといけないかと思いフォルダ内に置いた

結果はダメ。loadすると外れてしまう。シーン上においてある敵オブジェクトはGameManagerと連携が取れているが、ロードしてインスタンス化したものはダメ。

##解決方法
1.敵オブジェクトにGameManagerをアタッチしない
2.Loadしてインスタンス化されたときにStart()でGameManager探す

```C#:C#
  private GameObject gamemanagerOBJ;
    void Start()
    {
        //GameManagerを取得
        gamemanagerOBJ = GameObject.FindGameObjectWithTag("GameManager");
    }

    void Damaged()
    {
　　　　　　　//取得したGameManagerの"GetScore"を呼び出す
            gamemanagerOBJ.SendMessage("GetScore",enemystatus.sc);
        }
    }
```
でもこれだと、敵を出す度に探すということをしないといけないからこれどうなんでしょう？あまりきれいな感じがしませんがとりあえず正常に動きました。
【勉強会レポート】エンジニアのためのブログ講座

# エンジニアのためのブログ講座

## 参加した理由
エンジニアとしてブログでアウトプットすることは
いろいろ良いことあるんだよと言われるけど、
めんどくさかったり、何書いて良いかわからなかったり
なんやかんや書いてなかったけど、
これをきっかけにブログを書きたいと思ったので。

## 注意
基本的に自分がブログ書く上でモチベ〜ションになりそうと思った箇所を抜粋しているので、
書かない内容もあります。

## 勉強会内容
#### 大まかにこんな流れでした。
* これから書く人に向けて
* なかなか書けない人に向けて
* すでに書いてる人に向けて

## これから書く人に向けて
#### 書くためのコツ
* 質より量
* 良くするのは後からで良い
* ネタ探しを習慣化する
    * 他人のブログを読む

#### ブログの良いところ
* 自分の知識を深めることができる
    * 実際に書くときに自分がどこを理解していないのかわかる。
* 自分のアーカイブになる
    * あれなんだったけー・・・みたいなときに楽！←これはすごい良いと思った。

## なかなか書けない人に向けて
### めんどくさいと言う気持ちをどうするか
* 小さく始める
* ○○をやってみた！→こうなったは事実を書けば良いだけだから楽
* あったこと、感じたこと、思ったことを書く

### こんなこと書いてもしょうがないだろ〜って気持ちをどうするか
* 自分にとって役にたったブログが必ずしも高尚なブログじゃなかったり、断面的だったりしたろ！！←確かに
* 今かけばそれが最新だろ！！
    * 似たような記事でもまぁいろいろ古いみたいな感じだったと思う

### こんなレベルで書いて恥ずかしいという気持ちをどうするか
* 気にしない
* それか、恥ずかしいと思うってことは自分で不足してる部分があると感じているということなので調べてから公開する

## すでに書いてる人に向けて
* ジャンルによってテンプレート化すると捗る


## 感想
とりあえず今日書かないと一生書かないと思ったので、
小さく始めるってことで書いてみました。
ブログ書くモチベーションになる話も聞けたし、
実際に行動に移せたので行って良かったです。
Pythonで言語処理100本ノック2015 問題04

# Today's Question
問題の出典　→　[言語処理100本ノック](http://www.cl.ecei.tohoku.ac.jp/nlp100/)
今回は５本目

```:問題04
Hi He Lied Because Boron Could Not Oxidize Fluorine. New Nations Might Also Sign Peace Security Clause. Arthur King Can.
という文を単語に分解し，1, 5, 6, 7, 8, 9, 15, 16, 19番目の単語は先頭の1文字，それ以外の単語は先頭に2文字を取り出し，
取り出した文字列から単語の位置（先頭から何番目の単語か）への連想配列（辞書型もしくはマップ型）を作成せよ．
```

おっと、１２番目の単語がMightになっているので
そのまま実装すると
>**'Mi': 12**

のようになってしまうため　i　は削除してMghtで進めます

#いざ実装
```:python3
"""
戦略
・条件指定されたナンバーのリストを定義し、分岐判定に使う
"""

s = "Hi He Lied Because Boron Could Not Oxidize Fluorine. New Nations Mght Also Sign Peace Security Clause. Arthur King Can."
s_list = s.split()

condition_list = [1, 5, 6, 7, 8, 9, 15, 16, 19]
answer = {}
i = 0

#文字数をカウントし出現順に配列に格納する
for n in s_list:
    i += 1
    
    if i in condition_list:
        answer[n[:1]] = (i)
    else:
        answer[n[:2]] = (i)
    
print(answer)
```

```:実行結果
{'Li': 3, 'Ar': 18, 'Na': 11, 'S': 16, 'Ne': 10, 'F': 9, 'Be': 4, 'Si': 14, 'C': 6, 'Ca': 20, 'H': 1, 'P': 15, 'He': 2, 'O': 8, 'Mg': 12, 'N': 7, 'B': 5, 'Al': 13, 'Cl': 17, 'K': 19}
```

#感想
・ハッシュのままソートできたら良い感じなのにな
・部屋の乾燥がひどく加湿器が手放せない
SQLだけで商品をレコメンドしてみる


| ユーザID | 商品ID | ユーザの評価 |
|:---------:|:-------:|:-----------------------------:|
|        1 |      1 |                            1 |
|        1 |      2 |                            1 |
|        1 |      3 |                            0 |
|        2 |      1 |                            0 |
|        2 |      2 |                            1 |
|        2 |      3 |                            1 |
|        3 |      1 |                            1 |
|        3 |      2 |                            1 |
|        3 |      3 |                            0 |

こんな感じのテーブルがあったとして、

例えば、商品2を買ったユーザに何をおすすめしたら良いかを取得する

```SQL
select
    group_concat(user_id), product_id, taste
from
    taste
where
    user_id
    in (
        select user_id from taste where product_id = 2 and taste = 1
    ) and taste = 1
    and product_id <> 2
group by product_id
order by count(user_id) desc
limit 10;
```

---

[ブログ](https://nnahito.com/)はじめました。
この記事の[詳しい画像つきの解説](https://nnahito.com/articles/6)ものせております！
Rubyでインクルードガード的なものを作る

#TL;DR (長い3行で)
・同じスコープに同じ定義値が復数あると警告がでる
・直接`require`とシンボリックリンクの`require`が同居しているのが原因だと修正できない
・C/C++でおなじみのインクルードガード相当のことをRubyでもやる

# 困りごと
同じRubyファイルを直接`require`する子と，シンボリックリンク経由で`require`する子が同居すると，↓ のような警告がでます．

```
warning: already initialized constant
```

本質的には同じものを`require`しているので，警告がでても困ることはさして無いのですが，Console上に出てくるのでちょっと目障り．

C/C++であるようなインクルードガードがRubyでも欲しい．

#まずは問題の再現

↓ 用意するのは3ファイル．

```
main.rb          → requireをcallする側
required.rb      → requireされる側
required_link.rb → required.rbへのシンボリックリンク
```

↓ `require`される側のファイル

```ruby:required.rb
TOP_LEVEL_DEF = "top level def"
puts "## require DONE"
```
↓ `require`する側のファイル

```ruby:main.rb
# 直接require
require_relative './required.rb'
# シンボリックリンク経由でrequire
require_relative './required_linked.rb'

puts "## TOP_LEVEL_DEF = #{top level def}"
```

ここで`main.rb`を実行すると，↓ のような結果になります．

```
## require DONE
required_linked.rb:1: warning: already initialized constant TOP_LEVEL_DEF
required.rb:1: warning: previous definition of TOP_LEVEL_DEF was here
## require DONE
## TOP_LEVEL_DEF = top level def
```
`required.rb`が2回読み込まれ，`TOP_LEVEL_DEF`の2回目の初期化のときに警告が出ていることがわかります．

# Ruby版インクルードガード
C/C++のように`#ifndef`が使えれば良いのですが，定数が宣言されているかどうか，を調べるような関数は見つけられませんでした．

ただ，カレントスコープでアクセス可能な定義値の一覧を取得する関数はあるようです．

Module.constants
https://docs.ruby-lang.org/ja/latest/method/Module/s/constants.html

これを使えば，定数の未宣言/宣言済の判定ができそうです．

先ほどの`required.rb`を ↓ のように改造します．

```ruby:required.rb
if !Module.constants.include?(:IS_REQUIRED)
  IS_REQUIRED = true # 値は特に意味なし

  TOP_LEVEL_DEF = "top level def"
  puts "## require DONE"
end
```

この状態で`main.rb`を実行すると，

```
## require DONE
## TOP_LEVEL_DEF = top level def
```

という出力になり，警告が出ないようになりました．
`required.rb`が1回しか読み込まれていないことが確認できますし，そのあとの定義値の使用も問題ありません．

# まとめると
```ruby
if !Module.constants.include?(:IS_REQUIRED)
  IS_REQUIRED = true

  # Do something.

end
```
という構文でRubyでもC/C++のようなインクルードガードが実現できそうです．
あまり使う機会は無さそうですが，直接とシンボリックリンク経由で同一ファイルを`require`することがあったので調べてみました．

**この半端ではない車輪の再発明感**


#追記 (2017/11/22)
コメントで`defined?`関数を教えていただきました．
こちらを使うほうが短くて直感的な書き方にできるのでよさそうです．

```ruby
if !defined? IS_REQUIRED
  IS_REQUIRED = true

  # Do something.

end
```

---///
PWAを実装するにあたって

# オフライン対応のためのブラウザのストレージについて

## ブラウザ上で保存できる場所

### webstorage

WebStorageはkey-valueストレージです。もっとも簡単なクロスブラウザー保存ですが、落とし穴があります。セーブする値は文字列でなければならないので、保存するデータを直列化、復元化する必要があります。大きなデータセットにはサイズ制限があります。また、競合の問題もあります。すなわち、ブラウザーでタブを2つ同時に開いた場合、なにが起こるか分からないのです。

### IndexedDB

IndexedDBはWebStorageに比べてずっと強力で、オフライン・ストレージに使うには最適です。スペースは十分です。トランザクションをサポートし、ブラウザーで同時に複数のタブを使っても安全です。最近のブラウザーならサポートしています。

### WebSQL

WebSQLは文字通りブラウザーのSQLiteです。クライアント側でACID特性を備え、完全な機能を持ったリレーショナルDBです。残念なことに標準委員会からは認証されず、non-Blink／Webkitブラウザーでサポートされませんでした。

## ライブラリー

### localForage

簡単なlocalStorageライクなAPI

### IDBwrapper

クロスブラウザーのkdexedDBラッパー

### PouchDB

CouchDBが提供するクライアント側でのストレージ。CouchDBを使っている場合、バックエンドで自動的に同期をサポートする

# 機能

## Credential Management API

ブラウザごとにユーザー認証をできるAPI。サイトに入るたびにログインしなくていい。

## Payment Request API

決済のためのAPI。

## service worker

Service Worker はブラウザが Web ページとは別にバックグラウンドで実行するスクリプトで、Web ページやユーザのインタラクションを必要としない機能を Web にもたらします。すでに現在、プッシュ通知やバックグラウンド同期が提供されています。さらに将来は定期的な同期、ジオフェンシングなども導入されるでしょう。このチュートリアルで説明する機能は、ネットワークリクエストへの介入や処理機能と、レスポンスをプログラムから操作できるキャッシュ機能です。

# どのフレームワークでPWA化するか

## vue.js

## angular.js
laravel-pugでbladeの変数を展開させるときにいくつかハマったのでメモ

[BKWLD/laravel-pug](https://github.com/BKWLD/laravel-pug) を利用しているのですが、
pugにbladeの変数を展開させるときにいくつかハマったので解決法をメモしときます。

## 環境

|名前|バージョン|
|---| -------- |
|PHP | 7.1.6    |
|Laravel| 5.5.14 |
|bkwld/laravel-pug                     |  1.5.1 |
|pug-php/pug                           |  3.1.1 |
|js-phpize/js-phpize-phug              |  1.1.7 |
|phug/compiler                         |  0.5.12 |
|phug/dependency-injection             |  1.3.2 |
|phug/lexer                            |  0.5.14 |
|phug/parser                           |  0.5.7 |
|phug/phug                             |  0.1.8 |


## ケース1. 属性値にblade変数を展開したい場合

```example.pug.blade
form(action=route('login') method="POST")
```

というように属性値に直接bladeの変数展開させたい{{ }} の中身を書きます。

bladeなら

```example.blade.php
<form action="{{ route('login') }}" method="POST">
```

ですね。

## ケース2. 要素、属性値以外でblade変数を展開させたい場合

```example.pug.blade
div.is-error {{ $errors->first('remember') }}
```

とbladeの記法そのままでOKです。

## ケース3. `@if`といったbladeの条件式などの@から始まる構文を利用したい場合

```example.pug.blade
   | @if ($errors->has('remember'))
   div.is-error {{ $errors->first('remember') }}
   | @endif
```

というように`|` を利用します。

---

## 番外編【未解決】 属性値だけれども右辺に代入しない場合（checkedなどの場合）

bladeなら

```example.blade.php
<input type="checkbox" id="remember" name="remember" {{ old('remember') ? 'checked' : '' }}>
```

とやる場合laravel-pugではどうしたらいいのかわかりませんでした…
調査中です。

-------

pugで書くことによる恩恵もありますが、bladeの記法とバッティングしてハマりがちなのが難点…
とはいえpugだとビューがスッキリ書けるのがいいですね。
Pythonで言語処理100本ノック2015 問題03

すっかり2017年も冬でございますね〜

# 早速ですが問題です
出典はこちら　→　[言語処理100本ノック](http://www.cl.ecei.tohoku.ac.jp/nlp100/)


```:問題03
"Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics."
という文を単語に分解し，各単語の（アルファベットの）文字数を先頭から出現順に並べたリストを作成せよ．
```

# 実装してみた

```:python3
s = "Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics."

s = s.replace(',', '').replace('.','')


s_list = s.split()

answer = []

#文字数をカウントし出現順に配列に格納してるとこ
for n in s_list:
    answer.append(len(n))
    
print(answer)
```

実行結果は以下

```:結果
[3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5, 8, 9, 7, 9]
```

#正規表現で実装してみた

```:py3
import re

s = "Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics."

"""
re.sub(pattern, repl, string, count=0, flags=0)
"""
s = re.sub(r'[,.]', '', s)

s_list = s.split()

answer = []

#文字数をカウントし出現順に配列に格納してるとこ
for n in s_list:
    answer.append(len(n))
    
print(answer)

```


```:結果
[3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5, 8, 9, 7, 9]
```

#備考
・この問題は```str.maketrans```で実装する場面ではありませんでした
　がしかし、このメソッドは適当な場面では非常に使える代物です。
　[こちらのページ](http://orangain.hatenablog.com/entry/20100503/1272900555)にmaketransなど文字列置換の処理がわかりやすい実装を掲載されてます

・python3の正規表現の文字列クラスについて　→[リファレンスはこちら](https://docs.python.jp/3/library/re.html)
・去年から10Kg大きい男になりました
UIButtonでソートするのめんどくさくない？


UIButtonでUITableViewのソートとかを管理する時に、昇順・降順だけならnormalとselectedで管理できるんですが、複数ソートボタンがあった際に、昇順・降順・ソート無しを管理しようとすると割りと面倒だったりします。

#そんなわけでライブラリ作りました🦎
[PKPK-Carnage/OTSortButton](https://github.com/PKPK-Carnage/OTSortButton)

#こんな感じ
![otsortbuttondemo](https://user-images.githubusercontent.com/20692907/30483166-d765c672-9a60-11e7-8753-87bdcf4cdddc.gif)

#機能
・ソート無し・昇順・降順を管理可能
・それぞれに背景色・文字色・ソート画像色（昇順・降順のみ）・背景画像を設定可能

#導入
CocoaPods・Carthageで導入、もしくはライブラリのClassフォルダのソースを直接プロジェクトに追加してください。

## CocoaPods  

```PodFile
pod 'OTSortButton'
```

## Carthage  

```Cartfile
github "PKPK-Carnage/OTSortButton"
```

#使い方

ソートボタンにしたいボタンのカスタムクラスにOTSortButtonを設定します。
![2017-09-15 21 10 54](https://user-images.githubusercontent.com/20692907/30481581-6a2e9166-9a5a-11e7-939d-ccec96b11136.png)


IBInspectableで設定表示の設定が可能です。

![2017-09-15 21 27 45](https://user-images.githubusercontent.com/20692907/30482111-c25eb6fc-9a5c-11e7-9d21-50924081d4a6.png)

インポートして、IBOutletCollectionでOTSortButtonをまとめます。

```swift:import
import OTSortButton

@IBOutlet var sortButtonCollection: [OTSortButton]!
```

必要であれば、ボタンに値を保持しておけるので、Dictionaryのキーなどを入れるといいと思います。

```swift:sortkey
@IBOutlet weak var yourSortButton: OTSortButton!

yourSortButton.sortKey = "yourKey"
```

IBActionを設定します。

```swift:IBAction
@IBAction func tappedSortButton(_ sender: OTSortButton) {
	for sortButton in sortButtonCollection {
		if sortButton == sender {
			let key = sortButton.sortKey
			switch sortButton.sortType {
				case .none:
			
		    		sortButton.sortType = .ascend
		    		//ここで昇順のソートをする
       	    		//e.g. sortedArray = yourArray.sorted(by: { $0[key]! < $1[key]! })
				
    			case .ascend:
			
       				sortButton.sortType = .descend
					// ここで降順のソートをする。
     	   			//e.g. sortedArray = yourArray.sorted(by: { $0[key]! > $1[key]! })
				
        		case .descend:
			
					sortButton.sortType = .none
           			// ここでソート無しにする。
           			//e.g. sortedArray = yourArray     
			}
   		} else {
       		sortButton.sortType = .none
     	}
	}
	tableView.reloadData()
}
```

#まとめ
これでもめんどくさいね。
NSynth と LSTM で作曲に挑戦してみた

#NSynthとは
　アートや音楽を機械学習で作り出す事を目指す「Magenta」プロジェクトは、そのソースコードがGitHubで公開されています。「Magenta」はリカレントニューラルネットワークを利用して音楽を学習し、学習済みのモデルから新しい音楽を生み出そうとしているようです。「Magenta」の入力形式はMIDIファイルであり、通常のCD音源では学習することができません。しかしながら「Magenta」レポジトリの中にひっそりと置かれる「[NSynth](URL "https://github.com/tensorflow/magenta/tree/master/magenta/models/nsynth")」は、WaveNet（※）を利用した音のオートエンコーダーで16次元の特徴空間にエンコードすることが可能です。
※DeepMindが提案した生音を生成するニューラルネットワークのモデル。グーグルアシスタントに搭載されている。詳しくは[Web page](URL "https://deepmind.com/blog/wavenet-generative-model-raw-audio/")をご参照ください。

生音とNsynthでエンコード・デコードした音楽を比較のために掲載します。
（元の音源)  https://soundcloud.com/yu-suzuki-8/skoz-04-skoz-sympho-nick
（デコード後） https://soundcloud.com/yu-suzuki-8/gen-skoz-04-skoz-sympho-nick-embeddings
元の音源は4分30秒ほど、デコード後の音源は20秒ほどですが、初めの20秒のみ比較してお聞きください。
 
#データセット
　学習用の音楽データセットは著作権があったり、有償のものだったりで、無料でライセンスがフリーなものはなかなか良いものが見つかりませんでしたが、今回は下記のデータベースを使用しました。

| 項目 | 値 |
|:-:|:-:|
|データベース名 |FMA datasets   |
| 曲数  | 106,574   |
| ジャンル  | 161   |
| URL  | http://freemusicarchive.org/music/Devil_Music/ |
| GitHub | https://github.com/mdeff/fma  |

FMAデータベースはアメリカのネットラジオ 「[WFMU](URL "https://wfmu.org/")」のアーカイブを基に作成されています。
[クリエイティブコモンズ4.0ライセンス](URL "https://creativecommons.org/licenses/by/4.0/deed.ja")であるため、改変したり、再配布が可能です。
GitHubにはSVMやディープラーニング等を利用した、ジャンル分類の分析例が紹介されています。
この中から学習のしやすそうな、ブレイクビートの音楽を27曲ダウンロードし学習を行いました。また、学習したモデルに入力するシードとして１曲ダウンロードしました。

#曲生成の方針
以下に曲生成の方針をポン知恵で示します。NSynthでエンコードし、特徴空間の中でLSTMによる学習を行い、最後にNSynthでデコードを行います。
![NSynth+LSTM.png](https://qiita-image-store.s3.amazonaws.com/0/215303/fcb68b36-f0ed-180c-0dd3-f689ffacc9f4.png)
#LSTMのモデル
LSTMのネットワークの構成は以下のようになります。
![LSTMmodel.png](https://qiita-image-store.s3.amazonaws.com/0/215303/8c9ed2d5-fa94-9473-4df8-954989be99e9.png)
入力ユニット数、および出力ユニット数の16はNSynthのデコード次元を表しています。
[GRUV](URL "https://github.com/MattVitelli/GRUV")というライブラリを参考にしました。

#結果
生成された音楽は以下です。シードの約３秒間はブレークビートが聞こえますが、それ以降は前衛音楽のようです。。。
[Sound Cloud](https://soundcloud.com/yu-suzuki-8/gen-result-l1-10000new )

#感想
　NSynthでエンコードした次元を、そのまま時系列として学習し、そのモデルで音楽を生成することは難しいのかもしれません。しかしながら、生音から学習し、音楽の生成に成功した例は沢山あります。今回、私の試みは上手くいきませんでしたが、是非、皆さんは音楽生成にトライして観てください。[google wavenet により生成された音楽](https://www.youtube.com/embed/Y8UawLT4it0)はプロが作曲し演奏しているようで素晴らしいです。
[python] Group data by key (groupby)


`groupby()` の操作は **Unix** の `uniq` フィルターと似ています。 
 **key 関数の値が変わるたびに**休止または **新しいグループを生成**します (このために通常  **同じ key 関数でソートしておく必要がある**のです)。
 この動作は **SQL** の入力順に関係なく共通の要素を集約する **GROUP BY とは違います**。

```python
# -*- coding:utf-8 -*-
from itertools import groupby
from operator import itemgetter

data = [("a", 1), ("b", 1), ("a", 2), ("b", 2), ("c", 1)]
print("data: %s" % data)

# データをソートしておく
data_sorted = sorted(data, key=itemgetter(0))
print("sorted data: %s" % data_sorted)

groups = []
groups_key_merged = []
for unique_key, group in groupby(data_sorted, key=itemgetter(0)):
    groups.append(list(group))   # Store group iterator as a list

print("grouped data: %s" % groups)
```

```output
data: [('a', 1), ('b', 1), ('a', 2), ('b', 2), ('c', 1)]
sorted data: [('a', 1), ('a', 2), ('b', 1), ('b', 2), ('c', 1)]
grouped data: [[('a', 1), ('a', 2)], [('b', 1), ('b', 2)], [('c', 1)]]
```


# 参考

https://docs.python.jp/3/library/itertools.html#itertools.groupby
https://qiita.com/tag1216/items/9aecc6816371ee35215e
Shadowsocksのサーバーを構築する

# はじめに
[これ](https://qiita.com/nao20010128nao/items/76869206fb72e7e76a3e)を書いた次の日に実践しつつ色々探っていたら、Shadowsocksなるものを発見しまして。
なので、上述の記事のシリーズ的な感じでShadowsocksサーバーの構築方法を書くことにしました。[^1]
クライアント編はAndroid版の使用方法を書きますので、上述の記事を発見してガッツポーズした方はお楽しみに。

## Shadowsocksとは (超ざっくりと)
Shadowsocksというのは、中国の金盾[^2]を飛び越える為に開発されたプロキシソフトウェアで、Socks5を暗号化して通信します。
Shadowsocksが開発される前は、[これ](https://qiita.com/nao20010128nao/items/76869206fb72e7e76a3e)に似た方法でやっていたのだそうで。

# インストール
ここでは、パッケージマネージャ[^3]は`go`を入れるのに**だけ**使ってくださいね。[^4]
パッケージマネージャからは多分DLできないですが、出来ても説明はしません。というか多分古いから入れないでね。
コマンドは以下の通り:

```
go get github.com/shadowsocks/shadowsocks-go/cmd/shadowsocks-server
```

以上。
`which shadowsocks-server`で`shadowsocks-server`が存在するか確認してくださいね。

# 起動
以下の要領に従ってコマンドを入力して下さい。

```
shadowsocks-server -p サーバーポート -k パスワード -m aes-256-cfb
```
以上のコマンドを分解して説明すると、

- `shadowsocks-server` - コマンド名
- `-p サーバーポート` - サーバー上でのポートを指定
- `-k パスワード` - サーバーに接続するためのパスワードを指定
- `-m aes-256-cfb` - 暗号化する方式

暗号化する方式については`aes-256-cfb`がデフォルトのようです。

## 0〜1024番のポートを使う場合
`sudo -E`が働かないので、以下のようにします。[^5]

```
sudo -E $(which shadowsocks-server) -p サーバーポート -k パスワード -m aes-256-cfb
```

`$(which shadowsocks-server)`は、`sudo`を呼び出したシェル上で実行されるので、問題なく動作します。(rootとして実行されるわけではない。)

# 後始末
`Ctrl+C`で終了できます。

# おわりに
<strike>クライアント編はAndroid版の使用方法を書きますので、上述の記事を発見してガッツポーズした方はお楽しみに。(大事な事なので2度書きました。)</strike>
AndroidでShadowsocksを使う方法は[こちら](https://qiita.com/nao20010128nao/items/ffbdefd9d3f12b1a12db)から。

-----
[^1]: [一応他の記事はあるにはあります](https://qiita.com/t_o_jp/items/39360befe4dd35ee98c2)
[^2]: 中国の検閲システムの名前
[^3]: `apt`とか`yum`みたいなモノ
[^4]: 筆者はLinuxbrewで入れました
[^5]: 下の`-E`は要らないかもしれない
[Rails] partialが自身からの相対パスで他partailを参照する場合の注意

先日、仕事中に少し嵌ったpartialの振る舞いについてまとめます。

## 環境
Rails 5.1.4

## 内容

例えば、以下のようなディレクトリ構成のViewがあるとします。
もちろん、Controllerと`cofig/routes.rb`は適切に設定されています。

```
view/
├── layouts/
└── test/
    ├── index.html.haml
    ├── _child.html.haml
    └── _grandson.html.haml
```

```app/view/test/index.html.haml
= render partial: 'child'
```

```app/view/test/_child.html.haml
= render partial: 'grandson'
```

```app/view/test/_grandson.html.haml
%p hoge from test
```

/testにアクセスすれば、当然、`hoge from test`と表示されます。この振る舞いについては自然に思われます。
次に`Test2Controller.rb`を作成し、以下のように`index.html.haml`を追加します。

```
view/
├── layouts/
├── test/
│   ├── index.html.haml
│   ├── _child.html.haml
│   └── _grandson.html.haml
└── test2/
    └── index.html.haml
```

```app/view/test2/index.html.haml
= render partial: 'test/child'
```

この様な場合も、`hoge from test`と表示されるものと私は期待したのですが、実際には以下のようなエラーになりました。

```
Missing partial test2/_grandson, application/_grandson with {:locale=>[:en], :formats=>[:html], :variants=>[], :handlers=>[:raw, :erb, :html, :builder, :ruby, :ts, :haml, :jbuilder]}. Searched in:
  * "/#{アプリケーションのディレクトリ}/app/views"
```

これをみると`test/_grandson`ではなく、`test2/_grandson`を見にいってしまっていることがわかります。
そこで、以下のファイルを追加すると、

```app/view/test2/_grandson.html.haml
%p hoge from test2
```

`hoge from test2`と表示されます。
つまり、相対パスの基準はpartialのディレクトリではなく、呼出元のhamlがあるディレクトリに依存するというわけです。
test2でも `test/_grandson`をみるようにするためには、`view/`からの相対パスで書けばよいです。

```app/view/test/_child.html.haml
= render partial: 'test/grandson'
```

## 結論
`view/`からの相対パスで書くのが安全かもしれません。
(`view/`からの相対パスで書かないのはバッドプラクティスといえるほど経験を積んでいないので、可能性の示唆に留めて置きます。そういう言明があれば教えていただきたいです。)
サイズ可変の画像の上にAutoLayoutでうまいことテキストを置く

![nahuda.png](https://qiita-image-store.s3.amazonaws.com/0/30423/820fff6b-c44d-299c-b91a-29121963e000.png)
## お題
1. このような名札.pngの上にユーザーが入力したテキストを配置するにはどうすれば良いか:thinking_face:
2. 画像のサイズは可変とする

## 実装のコツ
AutoLayoutの `Multiplier` を使うことで、画像サイズからパーセント指定で位置を指定することができます

## 指定の仕方

### まず配置するUILabelの準備

2. 名札からはみ出さないように、幅に合わせてfontサイズを調整してくれる `adjustsFontSizeToFitWidth` を `true` に
3. `minimumScaleFactor` で最小フォントサイズを指定します

``` swift
var nameLabel: UILabel = {
    let lb = UILabel()
    lb.text = "きんにくひろし"
    lb.numberOfLines = 1
    lb.font = UIFont.boldSystemFont(ofSize: 48)
    lb.adjustsFontSizeToFitWidth = true
    lb.minimumScaleFactor = 8 / lb.font.pointSize
    return lb
}()
```

### AutoLayoutの指定

`translatesAutoresizingMaskIntoConstraints` を `false` に
`NSLayoutConstraint` を使ってLayoutします
`multiplier` を使うことで、パーセント指定で親要素からの相対的な位置を指定することができます。

※この際、`left margin` なら親要素の `right margin` を対象にすることで、指定が効きます。
`left margin` を対象に指定してしまうと、起点0なので思うようにレイアウトが効きません。

※上下左右マージンを指定しないと、テキストがadjustしてくれません

``` Swift
nameLabel.translatesAutoresizingMaskIntoConstraints = false

// 名前LabelのAutoLayout

imageView.addConstraints([
    //　top
    NSLayoutConstraint(
        item: nameLabel,
        attribute: .top,
        relatedBy: .equal,
        toItem: imageView,
        attribute: .bottom,
        multiplier: 0.65,
        constant: 0
    ),
    // bottom
    NSLayoutConstraint(
        item: nameLabel,
        attribute: .bottom,
        relatedBy: .equal,
        toItem: imageView,
        attribute: .bottom,
        multiplier: 0.85,
        constant: 0
    ),
    //　left
    NSLayoutConstraint(
        item: nameLabel,
        attribute: .left,
        relatedBy: .equal,
        toItem: imageView,
        attribute: .right,
        multiplier: 0.23,
        constant: 0
    ),
    // right
    NSLayoutConstraint(
        item: nameLabel,
        attribute: .right,
        relatedBy: .equal,
        toItem: imageView,
        attribute: .right,
        multiplier: 0.7,
        constant: 0
    )
])
```

## 完成
ベースの画像サイズが可変しても、綺麗にテキストが収まっています
CustomViewにしておくと、複数画面で利用するとき便利でしょう

| Landscape | Portrait     |
| :------------- | :------------- |
| <img width="100%" src="https://qiita-image-store.s3.amazonaws.com/0/30423/0c00fc63-9d1b-c61a-10ba-81eb6ea93c59.png">       | <img width="100%" src="https://qiita-image-store.s3.amazonaws.com/0/30423/28057808-54f1-55c1-f194-6c1c0358936d.png">       |








## Multiplierの値をどう決めるか？
Zeplinで簡単に取れます。
`Alt` を押しながら確認したいmarginあたりにカーソルを近づけると親要素からの
marginを%表示できるので、それを使います。

<img width="381" alt="zeplin.png" src="https://qiita-image-store.s3.amazonaws.com/0/30423/e545d4cf-6f24-7906-1544-23174fbd3e91.png">

(Sketchでもできるかも..少し触っただけだと%表示できなかった)


## おまけ：SnapKitを使った実装
**41行 -> 6行**で書けました:innocent: 便利


``` Swift
// 名前LabelのAutoLayout
nameLabel.snp.makeConstraints { (make) in
    make.top.equalTo(imageView.snp.bottom).multipliedBy(0.65)
    make.bottom.equalTo(imageView.snp.bottom).multipliedBy(0.85)
    make.left.equalTo(imageView.snp.right).multipliedBy(0.23)
    make.right.equalTo(imageView.snp.right).multipliedBy(0.7)
}
```
Ethereum のローカル開発環境 Ganache を使ってみる

2017年11月15日に Truffle チームがリリースしたばかりの Ethereum 開発環境 Ganache を使ってみました。

## Testrpc が消えた？

現在、[testrpc の github リポジトリ](https://github.com/ethereumjs/testrpc)にアクセスすると、ganache-cli というリポジトリにリダイレクトされます。

README.md には下記のように書かれています。

> ### Looking for TestRPC?
> If you came here expecting to find the TestRPC, you're in the right place! Truffle has taken the TestRPC under its wing and made it part of the Truffle suite of tools. From now on you can expect better support along with tons of new features that help make Ethereum development safer, easier, and more enjoyable.

どうやら testrpc は、Truffle チームが新たに提供するローカル開発環境 Ganache のコマンドラインバージョンとして、生まれ変わったようです。

## Ganache とは

<blockquote class="twitter-tweet" data-cards="hidden" data-lang="ja"><p lang="en" dir="ltr">We&#39;ve launch a new personal blockchain for develpoment: Ganache. Like the TestRPC, but beautiful. <a href="https://t.co/4BK9gNP2FL">https://t.co/4BK9gNP2FL</a> <a href="https://t.co/N1BJ4YjugE">pic.twitter.com/N1BJ4YjugE</a></p>&mdash; Truffle (@trufflesuite) <a href="https://twitter.com/trufflesuite/status/930886767695224832?ref_src=twsrc%5Etfw">2017年11月15日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

Ganache は、Ethereum のローカル開発環境です。
testrpc のようにローカルで開発用のチェーンを構築するだけでなく、GUI でブロックやトランザクションを参照して、アプリケーションの動作を確認することができます。

## Ganache の起動

node.js と npm があれば、Ganache をすぐ起動できます。

```
% git clone git@github.com:trufflesuite/ganache.git
% cd ganache
% npm install
% npm start
```

起動するとすぐにローカルで Ethereum チェーンが構築され、Electron 製のデスクトップアプリが立ち上がります。

![スクリーンショット 2017-11-21 20.49.18.png](https://qiita-image-store.s3.amazonaws.com/0/44003/7bbba373-8f2a-e4ac-7e6d-3813fd240127.png)

## Ganache の見方

Ganache を起動してはじめに表示されるのは、アカウントの一覧です。
起動した直後には既に10アカウントが作成された状態で、それぞれアドレスと残高が確認できます。左の鍵アイコンをクリックすることで、秘密鍵も確認できます。

![スクリーンショット 2017-11-21 20.50.18.png](https://qiita-image-store.s3.amazonaws.com/0/44003/4ac91e43-0cc9-364f-b0f2-2074de56bf81.png)

上部の「Block」をクリックすると、ブロックの一覧を参照できます。
ブロックをクリックすると、マイニングされた時間や使用した Gas などの情報と、そのブロックに含まれるトランザクションの一覧が表示されます。

![スクリーンショット 2017-11-21 22.11.41.png](https://qiita-image-store.s3.amazonaws.com/0/44003/048ecd34-7ca0-0373-c94b-2e8f10a739c7.png)

上部の「Transaction」をクリックすると、トランザクションの一覧を参照できます。
トランザクションを、クリックするとトランザクションのバイトデータやコントラクトのアドレスなどが表示されます。

![スクリーンショット 2017-11-21 22.13.40.png](https://qiita-image-store.s3.amazonaws.com/0/44003/bf5f1ed3-d976-bfe3-1395-fe27e3cbe59b.png)

もちろんですが、以前の Testrpc も Ganache CLI として変わりなく使えます。

```
% npm install -g ganache-cli
% ganache-cli
```

## おわりに

Ganache には JavaScript 実装の Ethereum Blockchain が組み込まれているため、geth 等の Ethereum クライアントを使わずにスマートコントラクトの開発が進められます。
毎度コンソールからコマンドを実行して、トランザクションの確認をしなくていいのはとても便利ですね。何より、Ethereum を始めたばかりの開発者にとっては、やはり GUI で確認できた方が理解しやすいと思います。

Truffle 自体も非常に使いやすいフレームワークで、改めて Ethereum は優秀な技術者のエコシステムで支えられているなと感じます。Truffle チームに感謝。
Windows版Bitnami Redmine Installerインプレッション

#まずはじめに

本稿はRedmineのレポートではなく、インストーラーのレポートです。対象バージョンはWindows版Bitnami Redmine Installer 3.4.3-1です。ではレッツゴー。

#まさかの32bit

2017年11月時点で、[ダウンロードページ](https://bitnami.com/stack/redmine/installer)で公開されているWindows版Bitnami Redmine Installerは32bitです。もちろん、64bit Windows上でも32bitアプリは不都合なく動きます。
OS X版が32bitと64bitの両方、Linux版は64bitのみとなっています。

#追加・修復・変更インストールという概念はない

Bitnami Redmine Installerは基本的に「一度インストールしたら終わり」「一発勝負」です。あとから修復インストールといったことはできません。
インストールウィザードの画面上でPhpMyAdminとGitをインストールするかどうか選択できるようになっていますが、インストールが終わったら、後から変更することはできませんので注意して下さい。

#インストールされるコンポーネント

WebサーバはApache httpd、データベースはMySQL、Rails実行環境はThinです（Passengerではありません）。
インストーラーを実行すると、Apache Foundation製のApache httpdインストーラやOracle製のMySQLインストーラーが立ち上がるのでは__なく__、すべてのコンポーネントをBitnami Installerが直接インストールします。すべてのファイルが``C:\Bitnami\redmine-3.4.3-1``の下のどこかに展開されます。

##Apache httpd

インストールウィザードはポート番号を聞いてきません。80/tcpと443/tcpで立ち上がります。これらのポートが既に別のサービスに使われている場合に限り、インストールウィザードが代替のポート番号を聞いてきます。
80/tcpと443/tcpの違いはTLSかどうかだけです。TLSのサーバ証明書は、``CN=www.example.com``の自己署名証明書が``C:\Bitnami\redmine-3.4.3-1\apache2\conf\server.crt``に、対応する秘密鍵ファイルが``C:\Bitnami\redmine-3.4.3-1\apache2\conf\server.key``にありますので、TLSを利用する場合は適宜差し替えを行って下さい。

##MySQL

インストールウィザードはポート番号を聞いてきません。3306/tcpで立ち上がります。このポートが既に別のサービスに使われている場合に限り、インストールウィザードが代替のポート番号を聞いてきます。
rootユーザーのパスワードは、インストールの時に「管理者アカウントの作成」で指定したパスワードと同じです。
Redmineアプリが実際に使うユーザーIDとして``bitnami``が作成されます。パスワードは乱数生成され、``C:\Bitnami\redmine-3.4.3-1\apps\redmine\htdocs\config\database.yml``に書き込まれます。
Redmineアプリが使うスキーマとして、``bitnami_redmine``が作成されます。Redmineが使うテーブルはここに配置されます。

##Thin

3001/tcp、3002/tcpの2ポートを占有して2インスタンスが立ち上がります。 Apache httpdは、この２つのポートをロードバランスする設定になっています。http://127.0.0.1:3001/redmine や http://127.0.0.1:3002/redmine にアクセスすると、Apache httpdを経由せずThinに直接アクセスできます。

##PHP

PHPはphpMyAdminを動かすために収録されていると思いますが、phpMyAdminをインストールしなくてもPHPは入ります。

##その他

[README.txt](https://bitnami.com/stack/redmine/README.txt) を参照して下さい。

#Q&A

__Q. MySQLは既にインストール済みのものがあるので、それを使いたい。__
A. できません。Bitnami Installerが有無を言わさずMySQLをインストールし、それを使ってしまいます。

__Q. Redmineインスタンスをもう一つインストールしたい。__
A. Bitnami Installerをもう一度起動してください。Apache httpd, MySQL, Thinその他もろもろ全部が、さっきとは別の場所にもう1個インストールされます。アンインストーラーは上書きされてしまうらしく、Redmineを2個インストールしてもWindowsの「プログラムのアンインストールまたは変更」メニューにBitnami Redmine Stackは1個しか表示されません。これを選択して「アンインストールまたは変更」した場合、どちらのRedmineインスタンスが削除されるかは不明です。神に祈りましょう。
非常に収まりが悪い運用になってしまうため、お勧めはできないのですが、これしか方法が見つかりません。

__Q. bundle exec rake ほにゃらら をしたい。__
A. スタートメニュー → Bitnami Redmine Stack → Bitnami Redmine Stack を使用する を選ぶとコマンドプロンプトが出てきます。この状態で

```
C:\Bitnami\redmine-3.4.3-1>set RAILS_ENV=production
C:\Bitnami\redmine-3.4.3-1>cd apps\redmine\htdocs
C:\Bitnami\redmine-3.4.3-1\apps\redmine\htdocs>bundle exec rake ほにゃらら
```

こんな感じでできます。

以上！幸運を祈る。

#リファレンス

WindowsにRedmine環境を簡単に構築する手順
https://nj-clucker.com/easy-way-to-install-redmine/

Bitnami Redmine Installer ダウンロードページ
https://bitnami.com/stack/redmine/installer
単体テストというか

たとえば(ビルドエラーとか出たらごめん)

```
package main

import (
  "fmt"
  "myapi"
)

func main() {
  yeah := myapi.NewSugoiApi()
  result := yeah.Get()
  fmt.Println(result) 
}
```

SugoiApiはそりゃもうすごいapiとhttp通信するようなアレだと思ってくれれば。

これのテスト書こうってなったとき、実際にApi叩きたいとはあまり思わないし、
これをmockにするためだけにinterfaceな実装にするのもうーんって感じ。

どうするべきなんだろう…

## 20171130追記
バッドノウハウ感もあるんだけど…
myapiパッケのほうで

```
var NewSugoiApi = newSugoiApi

func newSugoiApi() { ... }
```

これでごまかそうと決意。
Raspi の各種アップデート方法

超久々に投稿。

Raspberry Pi 2 Model B+ を引っ張り出す。
いろいろ古いはずなので、各種をアップデートした。
そのメモ。

# Raspi の各種アップデート方法

```bash
$ uname -a
$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get dist-upgrade
$ sudo rpi-update
$ sudo reboot
$ uname -a
```

# 参考サイト
Yuka Life | https://yukaobu.wordpress.com/2017/05/01/raspi-update/

ありがとうございました。
Amazon MWS API の使い方

# Amazon MWS API 開発に必要な情報源

[Amazon Marketplace Web Service Documentation 公式ドキュメント](https://docs.developer.amazonservices.com/en_US/feeds/Feeds_FeedType.html)
設定等を確かめるために必須な情報源（英語）

[AmazonマーケットプレイスWebサービス公式ドキュメント](http://docs.developer.amazonservices.com/ja_JP/dev_guide/DG_IfNew.html)
設定等を確かめるために必須な情報源（日本語）
英語のほうが情報量が多く正確なような気がします。

[Amazon MWS Scratchpad](https://mws.amazonservices.jp/scratchpad/index.html)
開発を行う前の検証に必ず必要

[Amazon MWS ラボ](http://mws-lab.activebrain.co.jp/developper/feeds_api)
大まかな流れを知るにはいい情報源。ただし、サンプルはjavascriptなので注意が必要。

[Amazon API の種類](http://services.amazon.co.jp/services/automation/what-is-mws/api.html)
各APIの情報をたどるために必要。サンプルなども提供されているのでよいが、バージョンが古い場合があるので注意。


# 準備 - Amazon MWS 用のアカウントを作成する

[Amazon マーケットプレースWebサービス](https://developer.amazonservices.jp/gp/mws/index.html)

前提として、アマゾンで大口のアカウントを作成する必要がある。
もしアマゾンで販売する大口のアカウントが既にある場合は、大口アカウントでサインインする。

ここから、Amazon MWS 用のアカウントを作成すると、「ユーザー権限」の画面に移る。
ここで、「Amazon MWS 開発者権限」セクションがあるので、ここから以下の各種情報を取得する。

- 出品者ID:    ナイショ
- 開発者 ID:   ナイショ
- AWSアクセスキーID: ナイショ
- 秘密キー: ナイショv
- MWSAuthトークン: ナイショ

MWSAuthトークンは、自分のアカウントで行うなら必要ないが、別のアカウントの開発を行う際に必要となってくる情報。

# 開発手順

準備が出来たら、大まかな開発の流れの中でやることは２つ。

1. Amazon MWS Scratchpadで試す。
2. PHP（その他該当の言語）に落とし込む

以上


Amazon MWS APIについての情報が少ないため、開発スタイルを探すのにかなり手間取ったが、出来てしまえばなんてことはない。ただ、情報源が少なかったり、情報が古かったりするので、かなり検証に時間がかかってしまう印象です。ブログなどを探すよりも公式のドキュメントを見たほうが、開発時間が短縮できそうです。


## 在庫更新までの一連の処理の流れ

処理の流れについては、このサイトがとてもわかり易かったです。
[商品情報の登録・更新など一括処理に関するAPI](http://mws-lab.activebrain.co.jp/developper/feeds_api)
以下、このサイトからの引用です。

> ステップ1	 - SubmitFeed               アップロードファイルを準備し、暗号化ヘッダーとファイルを関数を利用し、アップロードする。
> ステップ2	 - GetFeedSubmissionList    関数を利用し処理状況を取得する。
> ステップ3	 - 処理状況チェック           ステップ2で正常終了を確認し、次のステップに進む。
> ステップ4	 - GetFeedSubmissionResult  関数を利用し、処理結果を取得する。
> ステップ5	 - エラーチェック             処理結果で正常終了を確認する。エラー発生時には、次のステップに進む。
> ステップ6	 - 再アップロード             アップロードファイルを修正し、再度、ステップ1に進む。


## Amazon MWS Scratchpadで試す。

[Amazon MWS Lanchpad](https://mws.amazonservices.jp/scratchpad/index.html)
ここで、APIセクションとOperationを選んで、それぞれ必要なパラメータを設定していきます。

例えば、在庫更新を行うので、
ステップ1	 - SubmitFeed であれば、APIセクションは、フィードで、Operationは、SubmitFeed という具合に選んでいきます。

その他のステップも同様に設定していけば、動作すると思います。

# PHPプログラム実装

Amazon MWS Scratchpad の「リクエストの詳細」をそのまま使って、HTTPリクエスト出来るかと考えていたので、charlsを使ってテストしてると、セキュリティ関連のエラーが出て数時間。進み具合が悪かったので、Amazonが提供しているライブラリを使うことにした。汗

[MrXの徒然なるブログ](http://mrxblog.net/page/6/)

ここのページが分かりやすかったので、載せておきます。
基本的にはAmazonが提供しているAPIライブラリを使用して実装します。
C#のforeachの仕組み(2) forとの比較コード

[C#のforeachの仕組み(1) 言語仕様の確認](https://qiita.com/y_ohr/items/05e20ad14edef16c73d5)の続きです。

# 概要

Niigata.NET 3.0に参加して、forと比較して、foreachをブラックボックスに感じたので、少し整理したい。という話です。
[Niigata.NET 3.0に参加してきました](https://qiita.com/y_ohr/items/e7ef2c22c5da5a675f3f)

# forとforeachの比較コード

コードを書いて、モヤモヤしているところを明確にします。
まず、モヤモヤしないコード。

``` antlr-csharp
static void Main()
{
    int[] numbers = { 0, 1, 2, 3, 4, 5, 6 };

    Console.WriteLine("All loop by for");
    for (int i = 0; i < numbers.Length; i++)
    {
        Console.WriteLine(numbers[i]);
    }

    Console.WriteLine("All loop by foreach");
    foreach (var n in numbers)
    {
        Console.WriteLine(n);
    }
}
```

モヤモヤしない実行結果。

```
All loop by for
0
1
2
3
4
5
6
All loop by foreach
0
1
2
3
4
5
6
```
次に、モヤモヤするコード。

``` antlr-csharp
static void Main()
{
    int[] numbers = { 0, 1, 2, 3, 4, 5, 6 };

    Console.WriteLine("Select loop by for");
    for (int i = 1; i < numbers.Length - 1; i += 2)
    {
        Console.WriteLine(numbers[i]);
    }

    Console.WriteLine("Select loop by foreach");
    // モヤモヤしているところ
    foreach (var n in numbers)
    {
        Console.WriteLine("Oops!");
    }
}
```
そしてモヤモヤする結果。

```
Select loop by Linq
1
3
5
Select loop by foreach
Oops!
Oops!
Oops!
Oops!
Oops!
Oops!
Oops!
```
Linqを使えば、ほぼ、同じことはできます。
しかし、増分を制御するというよりは、
奇数の集合に対して、ループしてる
感じがして、これもモヤモヤします。

``` antlr-csharp
static void Main()
{
    int[] numbers = { 0, 1, 2, 3, 4, 5, 6 };

    Console.WriteLine("Select loop by Linq");
    foreach (var n in numbers.Where((n, i) => i % 2 == 1))
    {
        Console.WriteLine(n);
    }
}
```
結果。

```
Select loop by Linq
1
3
5
```

# まとめ

Class Arrayを継承して、振る舞いに介入できる？と
考えたのですが、『特殊クラス'Array'から派生する
ことはできません。』と、怒られました。
foreachの仕組みを理解すれば、開始位置と増分と
終了条件を指定して、ループできるのでしょうか？
そもそも、思想というか用途が違う気もしてきました。

前回、[C#のforeachの仕組み(1) 言語仕様の確認](https://qiita.com/y_ohr/items/05e20ad14edef16c73d5)のコメントで教えてもらった辺りから、調べてみます。

# 参考文献

[ループ処理の大まかな歴史](https://qiita.com/albireo/items/55929dbdc443738e344c#_reference-da07009f9a955a4f5d28)
STARTTLSを知っていますか

SSL/TLSは、HTTPと組み合わせられることが多いですが、MySQLにも[SSL経由の接続オプションがある](https://dev.mysql.com/doc/refman/5.7/en/encrypted-connections.html)ように、本来はプロトコルと独立して適用可能なものです[^1]。

# どうやってTLS通信に入る？
「最初からSSL/TLSの通信路しか用意しない」という手段を別にすれば、何かしらの方法でSSLありとなしの通信を区別する必要があります。

HTTPSでは、HTTPが80番ポートを使うのに対して、HTTPSでは443番を使うようにしてあるので、区別は明らかです。

ただ、ポート番号をSSL/非SSLで2倍消費していくと大変というような事情もあって、同じポートでまずは平文で接続を行い、プロトコル内のコマンドの1つにSSL導入の役割を持たせて、それで切り替える、というような手法があります。これがSTARTTLSです。

# STARTTLSの利点・欠点

STARTTLSでは、すでに標準化しているポートで、「SSLあり/なしを同じように待ち受けられる」という点がメリットとなります。

一方で、SSLへのアップグレードまでは平文で通信が行われるため、そこで第三者が妨害すれば平文のまま通信が行われてしまう、というデメリットがあります（最初からSSL通信が行われる場合、鍵を解読できない中間者の介入は接続失敗となり、以降の通信は続きません）。

# 実例

## FTPS
FTPS[^2]では、あまり「STARTTLS」と銘打たれることはありませんが、「Explicitモード」といって、ふつうにFTPで接続してから`AUTH`コマンドでSSL接続に切り替えるようになっています。別にFTPS用ポートを開いておく「Implicitモード」は、正式なRFCに載らないこととなりました。

なお、多くの場合、FTPクライアント側の設定で、SSL接続に失敗した場合「そのまま平文のFTPを続ける」か「接続しない」かを選ぶことができるようになっています。

## SMTPでのSTARTLS

STARTTLSの実装としていちばん有名なのが、SMTPに対して適用するものです。最近はSTARTTLSが使えるように設定されたメールサーバも多く、GmailでもTLSなしで届いたメールには壊れた鍵のアイコンが出るようになっています。

もともと、SMTPが「シンプルメール転送プロトコル」の略であるように、メールの送信は「バケツリレー式」と呼ばれるような、幾つものサーバを経由したものでした。これでは1ホップだけTLSをかけたところで、全体のセキュリティ向上にはあまり資さないものでした。

ただ、インターネット上ではバケツリレー式でなく、直接受信アドレスのあるサーバに接続するのが一般的となってきたことなどもあり、比較的地位が向上している感はあります。

ただ、ホップ間の暗号化という制約はそのままなので、サーバ～サーバ間のDKIMや、ユーザー間でのS/MIMEなど、より上位からの暗号技術適用も依然として有用です。


[^1]: もっとも、SNIやALPNなどのように、通信プロトコル側で必要な機能のために、TLSの拡張がなされる例もあります。
[^2]: 「SFTP」という似た名前のものがありますが、こちらはSSHの上でFTPを行うというもので、まったくの別物です。
mas-cliでダウンロードエラー `Redownload Unavailable with this Apple ID` の対応方法


## mas-cliはアプリの初回購入時には使えない
表題のエラーについて、mas-cliのRepositoryにしっかり注意書きが明記されておりました。

> Please note that this command will not allow you to install (or even purchase) an app for the first time: it must already be in the Purchased tab of the App Store.

https://github.com/mas-cli/mas#usage



## 解決

初めてそのアプリを使うときは、App StoreからPurchaseしないといけません。
二回目（二台目）以降は `mas install *****`で可能です。

以上。
Sass


### Sassは、CSSをより便利に効率
簡単にするためのさまざまな機能があります。


### 記述の簡略化ができる
親子関係にあるセレクタを入れ子（ネスト）にして書くことができます。CSS
では、親の要素から対象要素までのセレクタを何度も書く必要がありますが、
Sassはネストさせることで、同じ親のセレクタをまとめることができます。


### 同じ値を使いまわすことができる
CSSでは、例えば複数の要素に同じ色を適用させる場合、何度も同じスタイ
ルを書かなければなりませんが、Sassでは「変数」を使うことによって、同じ値
を使いまわせます

### 四則演算が使える
あらゆる値に対して、四則演算を使うことができます。これにより、widthか
らpaddingの値を引いたり、画像のサイズを半分に割ってRetinaディスプレイ
などの高解像度端末に対応させたりといった使い方ができます。


### 一度使ったセレクタを使いまわせる
@extend という機能を使えば、一度使ったセレクタのスタイルを、別のセレク
タでも使うことができます。同じスタイルを何度も書く手間から開放され、コン
パイル後のCSSはグループ化されるので、非常に合理的なソースになります。
コードの再利用が可能
スタイルをまとめてテンプレートやモジュールのように定義し、それらを簡単
に読み込んで使うことができます。また、引数を指定することで部分的に値を変
えるといった、複雑な処理をすることも可能となっています。この機能は、ミッ
クスインと呼ばれており、Sassの中でも最も強力な機能の1つです。
1 つの CSS ファイルにまとめることができる
「パーシャル」という機能を使うことで、複数のSassファイルをコンパイル時
に1つのCSSファイルとしてまとめることが可能です。これにより、HTTPリ
クエストを減らしつつ、Sassファイルを分割して管理しやすくできます。

### 条件分岐などのプログラム的な処理ができる
条件分岐や繰り返し処理などの制御構文が使えます。各制御構文を使うことで、
複雑な処理が可能になり、ミックスインなどと組み合わせることで、非常に強力
な機能になります。

参考
http://book.scss.jp/about/c1/01.pdf
https://itstudio.co/2016/05/23/5755/
react-scriptsでカバレッジを取る際に気をつけるべきこと

Reactに慣れ親しむため、create-react-appを用いてチャットアプリを作っています。
create-react-appを使うと開発に必要なツール群や設定(webpackなど)が整った状態のコードが生成されるので、
コーディングだけに集中できます。
継続的インテグレーション(CI)のツールとして[CircleCI](https://circleci.com/)を使っているのですが、
最近CircleCIのビルド結果を眺めていたところ、奇妙な現象に気づきました...

これまでのコミットがすべてPASSEDになっている！
そんな訳はない！masterに作業途中のコミットでテストに失敗するはずのコミットを何回かしてきたはず！ [^1]

もともとCircleCIの設定ファイルを以下のように書いていました。

1. 必要なパッケージをインストール
2. テストを走らせて、カバレッジを`coverage`ディレクトリに出力
3. [codecov](https://codecov.io)に2の出力をアップロード

```yaml:.circle/config.yml
(略)
steps:
  (略)
  - run: yarn install
  (略)        
  - run:
      name: Run test
      command: yarn test --coverage
  - run:
      name: Upload coverage to codecov
      command: bash <(curl -s https://codecov.io/bash) -t $CODECOV_TOKEN
```

なにがおかしいかお分かりでしょうか。実は`yarn test --coverage`はテストが失敗しても最後までテストをし続けてしまうのです...
そのため、CircleCIにはテストが失敗したと認識されず、壊れたmasterもPASSEDとなってしまっていたのです。
これを解決するために、`--bail`オプションをつけて、テストが初めて失敗した時点でテストを終了するようにします。
なので、`yarn test --coverage`を`yarn test --coverage --bail`とすればよいです。

なんでもっと早く気づかなかったんだって感じですＴＡＴ

[^1]: masterは一般的に動くコードを置くため、テストに失敗するような作業途中ソースコードをコミットするのは推奨されません。今回は個人の趣味で開発しているので、よしとしてください m(_ _)m
Herokuをはじめる


どうにかして，簡単に作成したWebアプリを無料で公開したいなーと考えていたときにHerokuを知りました．  
使うのに少し手間がかかったのでメモ．

# 環境
Mac OS Sierra 10.12.6

# Herokuの設定

## Herokuに登録

![signin.png](https://qiita-image-store.s3.amazonaws.com/0/152224/0f9df10b-150f-56da-61f9-c3d0a666e734.png "signin.png")


## Heroku CLIのインストール

Set up画面から自分のOSのインストーラを選択

![setup.png](https://qiita-image-store.s3.amazonaws.com/0/152224/be37a007-d4ef-5c61-a45a-5c78978ead75.png "setup.png")


```bash
$ heroku login
Enter your heroku credentials.
Email: dz@example.com
Password:
....
```

## 各種ライブラリの確認

PHP

```bash
$ php -v
PHP 5.6.30 (cli) (built: Aug  8 2017 12:20:45)
Copyright (c) 1997-2016 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies
```

Compose

```bash
$ compose -V
```

git

```bash
$ git --version
git version 2.8.4 (Apple Git-73)
```

### ComposeがNot Foundの場合
[compose](https://getcomposer.org/doc/00-intro.md)のサイトから，`the Download page`の部分をクリックして以下のコードをターミナルで実行する．(2017/11/21)  
注意: 公開鍵などが変わっている可能性あり

```bash
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('SHA384', 'composer-setup.php') === '544e09ee996cdf60ece3804abc52599c22b1f40f4323403c44d44fdfdd586475ca9813a858088ffbc1f233e9b180f061') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
php composer-setup.php
php -r "unlink('composer-setup.php');"
```

`composer.phar`が生成されるので，それを実行できるように移動する．

```bash
mv composer.phar /usr/local/bin/composer
```

## テスト用データでデプロイ

GitHubにテスト用のファイルが各言語ごとにあるので，それで試す．

```bash
$ git clone https://github.com/heroku/php-getting-started.git
$ cd php-getting-started
```

`heroku`と呼ばれる git の remote リポジトリに addする

```bash
$ heroku create
Creating app... done, ⬢ fast-river-76079
https://fast-river-76079.herokuapp.com/ | https://git.heroku.com/fast-river-76079.git
```
ここで出力された．`fast-river-76079`がアプリの名前になる．
そのアプリをdeployする.

```bash
$ git push heroku master
Counting objects: 178, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (95/95), done.
Writing objects: 100% (178/178), 48.02 KiB | 0 bytes/s, done.
Total 178 (delta 69), reused 178 (delta 69)
remote: Compressing source files... done.
remote: Building source:
remote:
remote: -----> PHP app detected
remote: -----> Bootstrapping...
remote: -----> Installing platform packages...
remote:        NOTICE: No runtime required in composer.json; requirements
remote:        from dependencies in composer.lock will be used for selection
remote:        - php (7.1.11)
remote:        - nginx (1.8.1)
remote:        - apache (2.4.29)
remote: -----> Installing dependencies...
remote:        Composer version 1.5.2 2017-09-11 16:59:25
remote:        Loading composer repositories with package information
...
remote: Verifying deploy... done.
To https://git.heroku.com/fast-river-76079.git
 * [new branch]      master -> master
```
これでアプリが deploy された．  
最後にアプリ用に1つ以上のインスタンスをRunする．

```bash
heroku ps:scale web=1
```

これでURLが作成され，アクセスが可能になる．  
直近にdeployしたファイルは

```bash
$ heroku open
```

でページを開くことができる．

# 参考文献
[【5分でわかる】herokuとは？概要や特徴をわかりやすく解説 | 侍エンジニア塾ブログ | プログラミング入門者向け学習情報サイト](https://www.sejuku.net/blog/7858)
High Sierra にアップデートでpecoが逝った場合の対応

カジュアルにHigh SierraにアップデートしたらPecoが起動しなくなった

control+Rでこんなエラーが出ちゃう。。

```
failed MSpanList_Insert 0x3e4000 0xd3201144c9d0 0x0
fatal error: MSpanList_Insert

runtime stack:
runtime.throw(0x36a5ab)
	/usr/local/Cellar/go/1.4.2/libexec/src/runtime/panic.go:491 +0xad fp=0x7ffeefbff600 sp=0x7ffeefbff5d0
runtime.MSpanList_Insert(0x389fc8, 0x3e4000)
	/usr/local/Cellar/go/1.4.2/libexec/src/runtime/mheap.c:692 +0x8f fp=0x7ffeefbff628 sp=0x7ffeefbff600
```
go？Goか？ゴーが悪いのか？

と慌てずに、以下をお試しください。

```terminal
brew uninstall peco
brew install peco
```
pecoを再インストールするだけでサクッと直りました。
どうやらHigh Sierra用のbottleになってるようで、再インストールでそっちが入ります。
【Inkscape/Ubuntu】 扱えるフォントを制限する

Inkscapeでデザインをする時に、システムにインストールされているフォントが邪魔だなーと思ったので見えないようにしました。
Inkscapeのオプションでフォントサーチパスを切り替えたり、ということはできなさそうなのでちょっと頑張りましょう。
実験環境は Ubuntu 16.04 です。他のLinuxでできるかはわかりませんが、もしやるならユーザ用のフォントインストールパスなどは適宜読み替えてください。

# キーワード
- `fc-list`
- ACL
- `sudo -g`

# 大まかな手順
1. inkscapeという名前のグループを作る。
2. 隠したいフォントディレクトリに、inkscapeグループからアクセス出来ないようにACLをセットする。
3. `sudo -g inkscape inkscape` でパスワードを聞かれないように、sudoersファイルに追記する。
4. デザインに使いたいフォントを $HOME/.fonts に配置したりコピーする。
5. パスの通ったところに inkscape という名前のスクリプトを配置する。

---
では始めます。
しばらくは管理者権限が必要です。

## グループを作る

```
# addgroup inkscape
```

このグループにはユーザを追加しないでくださいね。
このグループに追加されたユーザはUIフォントすらもが制限されてしまうので。

## ACLの設定
まずは、システムが認識しているフォントがどこにあるか調査しましょう。
`fc-list` コマンドで認識しているフォントを一覧表示できますが、今回は大体の場所が分かればいいのでこんな感じで。

```
$ fc-list | sed 's/fonts.*/fonts/' | sort -u 
```

ACLというのはパーミッションより細かくアクセス制御を行うための仕組みです。
今回はACLを使って、inkscapeグループにいらないフォントが多いディレクトリを見せないようにします。

```
# setfacl -m g:inkscape:--- %隠したいフォントが多いディレクトリ%
```

パイプで繋いで一撃で仕留めてしまうこともできますが、シェル芸人だけでいいでしょう。

ここまで設定すれば、 `sudo -g inkscape inkscape` とすると、フォント制限版のinkscapeが起動できることでしょう。
`sudo -g %グループ名%` で、そのグループのユーザとしてコマンドを叩く事ができます。

## sudoersへの追記
しかし、 `sudo` を使うため、Inkscapeの実行のたびにパスワードを聞かれることになります。
sudoersファイルを編集すると聞くとセキュリティ的に怖い感じがしますが、今回の設定でパスワードなしでroot権限を取れるようにはならないのでご安心を。
sudoersの編集はお行儀よく `visudo` で。

```
# visudo
```

エディタが立ち上がるので、一番下の行あたりに以下を追記します。

```
ALL ALL=(:inkscape) NOPASSWD: /usr/bin/inkscape
```

「任意のユーザが、任意のマシンの上で、inkscapeグループのユーザとして、パスワード無しで /usr/bin/inkscape の実行を許可する」と読むらしいですね。
これにより、 `sudo -g inkscape inkscape` がパスワードなしで実行できるようになります。(`sudo inkscape` や `sudo -u root -g inkscape inkscape` はパスワードを要求されます。)

## フォントの配置
inkscapeグループのユーザがフォントを認識できるところ(僕は $HOME/.fonts/inkscape というディレクトリを作りました)に必要なフォントを配置します。
僕は TimesNewRoman をデザイン用途でたまに使うので、 /usr/share/fonts/truetype/msttcorefonts からコピーしてきました。

## スクリプトを配置する
以下のスクリプトを /usr/bin/inkscape より優先されるパスの通ったところに配置すると、スタートメニューやコマンドから起動されるInkscapeがフォント制限版に置き換えられます。(通常のInkscapeを使う場合は /usr/bin/inkscape を指定してください。)

```
#! /bin/bash

sudo -g inkscape /usr/bin/inkscape ${@+"$@"}
```



# 終わりに
このページの手順のせいで被った損害を保証することはできませんが、まずいところにお気づきの際はコメント等でご連絡ください。
また、記事内のコマンド列及びファイル片に関しては権利放棄しますのでご自由にお使いくださいませ。

# 参考資料
- [Man page of SUDOERS](https://linuxjm.osdn.jp/html/sudo/man5/sudoers.5.html)
 にはsudoersの書式が載ってます。
- [アクセス制御リスト - ArchWiki](https://wiki.archlinux.jp/index.php/%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E5%88%B6%E5%BE%A1%E3%83%AA%E3%82%B9%E3%83%88#ACL_.E3.81.AE.E8.A8.AD.E5.AE.9A) にはACLのより詳しい情報が載っています。
- [[シェルスクリプト] シェルスクリプトの引数をそのまま別のコマンドにわたす command ${@+"$@"}](http://d.hatena.ne.jp/kitokitoki/20111123/p2) は「スクリプトを配置する」の項で触れたスクリプトの引数部分のソースになっています。