OmniAICreator/Qiita-1.07M huggingface dataset:
【Sendmail】icloud.comに急に送信できなくなる(dsn=5.0.0, stat=Service unavailable)

# はじめに
phpのアプリケーションを載せたWebサーバ上で、Sendmailを利用しています。
アプリケーションやサーバに何もしていないのに、icloud.comのメールアドレスにだけ送信ができなくなってしまいました。。。
その時の調査と解決方法をまとめます。


# 障害内容
- 急にicloud.comに送信できなくなる。
    - 前日までは問題なく送信できていた。
    - icloud.com以外には送信可能。
    - アプリケーション、インフラ設定等に変更点なし。

**エラー内容(/var/log/maillog)**
　→dsn=5.0.0, stat=Service unavailable

```
Jun  4 10:55:14 www sendmail[11649]: to=<aaaaa@bbbbb>, delay=00:00:03, xdelay=00:00:03, mailer=esmtp, pri=153018, relay=mx6.mail.icloud.com. [11.22.33.44], dsn=5.0.0, stat=Service unavailable
```


# 解決方法
**解決方法：X-PHP-Originating-Scriptヘッダを無効にする**

```
1. php.iniを修正
# vi /etc/php.ini
mail.add_x_header = On　 ※変更前
mail.add_x_header = Off　※変更後

2. Apache再起動
# systemctl restart httpd
```


# 参考資料
- [PHP公式ドキュメント(実行時設定)](http://www.php.net//manual/ja/mail.configuration.php)
- [phpで作られたフォームからapple icloud.comにメールが届かなくなった](http://hogem.hatenablog.com/entry/20140616/1402929183)
Cache'におけるクラス宣言の方法

スタジオから「新規プロジェクト」を作成し、「新規クラス」のアイコンをクリックする。
ソースの例は次の通り。

ODBらしい特徴として、
`User.Main`は、スタジオの中でのクラスの宣言位置（保存位置）を表している。
`Extends`は`Inhelits`と同じで、継承クラスを表す。
`%Persistent` と記述すると、クラスのインスタンスがディスク上に生成される。→メモリと違い、作ったデータが永続的に保存される。

```ruby:///簡単なクラス記述
Class User.Main.TestClass Extends %Persistent
{
//数値型
Property valueData as %Numeric;
//文字列型
Property stringData as %String;
// as ...を記述しなければ、Variant型（適切な型に変換される）

Function func1() as %Numeric [language = cache]
{
//ObjectScript書式
}

Function func2() as %Numeric [language = basic]
{
'Cache'Basic 書式
}

Function func3() as %Numeric [language = java]
{
//Java書式
}

} ///簡単なクラス記述
Class TestClass as %Persistent
{
//数値型
Property valueData as %Numeric;
//文字列型
Property stringData as %String;
// as ...を記述しなければ、Variant型（適切な型に変換される）

Method func1(a As %String) As %Numeric [language = cache]
{
//ObjectScript書式
}

Method func2() as %Numeric [language = basic]
{
'Cache'Basic 書式(この書式がおすすめ)
}

Method func3() as %Numeric [language = java]
{
//Java書式
}

} 
```
macOSでXAMPPを使ってpython を実行するまで

#前書き
macOSでXAMPPを使っていて、その上でpythonを動かしたい事情があり色々調べた話。
ただし、プリインストールのpython2.7やりたい（python３を新たにインストールしたくない）と思い
調べたけど、結局３日くらい「hello world.」でつまずいたので、忘れないためのメモ
#環境
macOS 10.13.4
xampp 5.6.24
python 2.7.10
#やったこと
1.「test.py」の作成

```python:test.py

#!/usr/bin/python
# -*- coding: utf-8 -*-
print "Content-Type: text/plain"
print
print "hello world."
```
2.　xampp > htdocsへ配置

3.「test.py」のパーミッションを７５５に

```console
sudo chmod 755 test.py
```
4.　xampp > xamppfiles > etc > httpd.confファイルにコードを追加

```
  #
  # For Python
  #
  AddHandler cgi-script .py
  ScriptInterpreterSource Registry-Strict
```
`AddHandler cgi-script .cgi .pl`の次の行あたりに入れるのが、わかりやすいとのこと

5.　xamppのApacheをRestartさせて、`http://localhost/test.py`を開く
#つまずいた点
pythonのコード１行目`#!/usr/bin/python`のPythonのパスがわからなかった
さらに`#!/usr/bin/python.exe`と書いていた
もっと言えばmacのパスの書き方も知らなかった
パーミッションのあたりもわからず残念な感じでした。
GitHub の Slack 連携でコメントやレビューも Slack に通知する

## 問題

GitHub と Slack を連携するために、Slack に GitHub App をインストールして、`/github subscribe owner/repo` を行ったがコメントやプルリクに対してのレビューが通知されない。

## 解決策

**Features enabled by default**

- issues
- pulls
- statuses
- commits
- deployments
- public

https://get.slack.help/hc/en-us/articles/232289568-GitHub-for-Slack

公式ドキュメントに記載があるのですが、デフォルトだと上記のイベントしか通知してくれません。

そこで、

**Features not enabled by default**

- reviews
- comments
- branches
- commits:all

こちらも有効にしましょう。

`[feature]` に上記の機能名を入れることで有効にできます。

```
/github subscribe owner/repo [feature]
```

以下のように一括指定も可能です。

```
/github subscribe owner/repo comments,reviews,branches,commits:all
```
文字列の編集操作・差分を可視化する

## 背景
レーベンシュタイン距離などの編集距離をメトリクスとして使っている時、どこが異なっているのか分析したいことがありました。
そんな背景から手軽に編集操作・差分を整形・カラー表示できるPythonライブラリを作成しましたので紹介します。

## できること

```
すももも桃も桃のうち
すもももももももものうち
```
このような修正前・修正後文字列のペアの編集差分を以下のように表示できます。
削除・置換前の文字を<font color="red">赤</font>で、
挿入・置換後の文字を<font color="blue">青</font>で、
操作する必要がない文字を<font color="green">緑</font>で表示しています。

### HTML出力

![スクリーンショット 2018-06-04 17.31.59.png](https://qiita-image-store.s3.amazonaws.com/0/69645/8bd44961-68b4-8ada-990c-e48f78adb9eb.png)

### Consoleカラー出力

![スクリーンショット 2018-06-04 18.01.06.png](https://qiita-image-store.s3.amazonaws.com/0/69645/09e1c677-3d48-a277-6da5-1bfa3c623339.png)

## インストール

`$ pip install visedit`
執筆時現在Python3以降にのみ対応。

## コード例
### コード例（コンソールでのカラー出力）

```py
from visedit import StringEdit

# 修正前の文字列
source_str = "すももも桃も桃のうち"

# 修正後の文字列
target_str = "すもももももももものうち"

se = StringEdit(source_str, target_str)

# コンソール出力する場合
print(se.generate_text())
```

```py
# 色変更も可能
se = StringEdit(source_str, target_str, text_color_settings={
    "wrong": "YELLOW", # 削除・置換前文字を黄に
    "correct": "GREEN", #　挿入・置換後文字を緑に
    "base": "WHITE", # 操作なし文字を白に
})
print(se.generate_text())
```


### コード例 (IPythonでのHTML出力)

```py

from visedit import StringEdit
from IPython.display import HTML

# 修正前の文字列
source_str = "すももも桃も桃のうち"

# 修正後の文字列
target_str = "すもももももももものうち"

se = StringEdit(source_str, target_str)
HTML(se.generate_html())
```

```py
# HTMLも色変更も可能
se = StringEdit(source_str, target_str, html_color_settings={
    "wrong": "YELLOW", # 削除・置換前文字を黄に
    "correct": "GREEN", #　挿入・置換後文字を緑に
    "base": "BLACK", # 操作なし文字を黒に
})
HTML(se.generate_html())
```

色は以下をサポートしています。

```
BLACK
RED
GREEN
YELLOW
BLUE
PURPLE
CYAN
WHITE
```

##　おわりに
ご意見・ご要望あれば、お気軽にお願いします。
悪魔のGDAL for OSX

# 0. 概要
GISをPython等で使うときってGDAL使いますよね？
でもOSX上のPythonからGDAL使うのって中々大変ですよね・・・

# 1. QGIS
QGISを入れる。

ここにアクセスし、QGISをダウンロード。
https://www.qgis.org/ja/site/forusers/download.html

URLはこれ。
http://qgis.org/downloads/macOS/QGIS-macOS-3.0.3-1.dmg

![image.png](https://qiita-image-store.s3.amazonaws.com/0/95636/3b15e210-51c7-9b4f-3501-04b5ac06feed.png)

Readmeを読みながら手順通りに入れていけばすんなり入るはず！
QGIS3.0はOSXでは安定的に動かないみたいで、結構エラーがでる。
なので、2.18を入れておくのが今のところベスト。

このQGISを入れる過程でGDALも入るはず。PATHを通せと言われるのでちゃんと通すこと。

# 2. PythonにGDALさんのPATHを通す
pythonを起動して`from osgeo import ogr`なんてやっても起動しないか、エラーがでる。
エラーが出る場合は過去にインストールしたことがあるはず。

まずは、Linkを外して再インストール。

```sh
brew unlink gdal
brew tap osgeo/osgeo4mac && brew tap --repair
brew install jasper netcdf
brew install gdal2 --with-armadillo --with-complete --with-libkml --with-unsupported
brew link --force gdal2
```

入ったか確認

```sh
$ gdal-config --version
2.1.3

$ gdal-config --libs
-L/usr/local/Cellar/gdal2/2.1.3_3/lib -lgdal

$ gdal-config --cflags
-I/usr/local/Cellar/gdal2/2.1.3_3/include
```

次にpipでインストールしたことにする。

```sh
pip install GDAL==$(gdal-config --version | awk -F'[.]' '{print $1"."$2}')
```
AtCoder Grand Contest 025 備忘録

#前書き
AtCoder Grand Contest 025 に参加．解説聞いて解けそうだった問題の備忘録．

#B問題
[[問題はこちら]](https://agc025.contest.atcoder.jp/tasks/agc025_b)
・膨大なCombination計算をさせらタイムアウト地獄で挫折．そういうときは[こう](https://qiita.com/ofutonfuton/items/92b1a6f4a7775f00b6ae)
(https://qiita.com/ofutonfuton/items/92b1a6f4a7775f00b6ae )．

・もう少し簡単に問題の解釈できた．
赤がA点，青がB点で，緑がA+B点なのだから，緑を塗るというより，重複を許して赤と青を塗る（赤と青が二色とも塗られている箇所が緑）と捉えれば良い．

以下はACのコード．

```main.cpp
#include <iostream>
#include <vector>

using namespace std;
typedef long long ll;

const ll M = 998244353;

vector<ll> fac(300001); //n!(mod M)
vector<ll> ifac(300001); //k!^{M-2} (mod M)
//a,bの範囲的にこれだけ配列を用意していけば十分

ll mpow(ll x, ll n){ //x^n(mod M) ←普通にpow(x,n)では溢れてしまうため，随時mod計算
    ll ans = 1;
    while(n != 0){
        if(n&1) ans = ans*x % M;
        x = x*x % M;
        n = n >> 1;
    }
    return ans;
}

ll comb(ll a, ll b){ //aCbをmod計算
    if(a == 0 && b == 0)return 1;
    if(a < b || a < 0)return 0;
    ll tmp = ifac[a-b]* ifac[b] % M;
    return tmp * fac[a] % M;
}

int main()
{
    ll n,a,b,k;
    cin >> n >> a>> b >> k;
    
    //大した量ではないので，先にfax[i]とifax[i]を全て計算しておく
    fac[0] = 1;
    ifac[0] = 1;
    for(ll i = 0; i<300000; i++){
        fac[i+1] = fac[i]*(i+1) % M; // n!(mod M)
        ifac[i+1] = ifac[i]*mpow(i+1, M-2) % M; // k!^{M-2} (mod M) ←累乗にmpowを採用
    }
    
    
    ll ans = 0;
    for(ll x = 0; x<=n; x++){
        if((k-a*x)%b !=0 ) continue;
        ll y = (k-a*x)/b;
        if(y<0 || y>n) continue;
        ans += comb(n, x)* comb(n, y) % M;
        ans %= M;
    }
    cout << ans << endl;
    
    return 0;
}

```

#D問題
グラフ理論の知識が必要らしい...．

#あとがき
精進します．
データベース接続確立エラー（Error establishing a database connection）そのサイトマルチサイトでは？

## wordpressのDB接続エラー

wordpressの構築・移行などを行う際に必ずと言っていいほど、よく見る以下のエラー
[![Screenshot from Gyazo](https://gyazo.com/ce0024d081d07584c80961960d643688/raw)](https://gyazo.com/ce0024d081d07584c80961960d643688)

wp-config.phpの設定を確認するとか、mysqlユーザ権限がないかgrant打つとか、ファイルのユーザ権限付与してないからchmod叩くとかいろいろ原因になりうる可能性潰してみたけど、なぜかエラーが直らなかったので備忘録として。
結構ググったけど、あんまり参考になる記事なかったようなので、同じ境遇にあった方の助けになれば幸いです。


上記のエラーよく確認するとこんな文言が
[![Screenshot from Gyazo](https://gyazo.com/a16c1ab8babb2c646d1d4829cb276d26/raw)](https://gyazo.com/a16c1ab8babb2c646d1d4829cb276d26)

「wp_blogsテーブルの中のデータに指定したURLの記載がないよ」って書いてます。

マルチサイトの場合は、どうやらここからリンクを指定しているっぽい。
wp_blogsのdomainテーブルのデータをすべて置換してあげればOKなので

`mysql> update wp_blogs set domain = '変更したいURL' where domain = '登録されているURL';
`
を叩いて、表示を確認。無事表示が確認できましたとさ。



<b>補足</b>
DBに登録しているURLを調べたいなら

`select domain from wp_blogs;`
でOK。
NLog を使って Xamarin.Forms からログ出力する方法 補足

## はじめに

この記事は、[NLog を使って Xamarin.Forms からログ出力する方法](https://qiita.com/tafuji/items/1a40866ea469d92c2d24) の補足記事です。

## 背景

先日、元記事の中で公開している GitHub のリポジトリに Issue が追加されていました。

- [File logging doesn't create file](https://github.com/tafuji/Xamarin-Forms-NLog-Sample/issues/1)
    - NLog の 4.3.11 で動作確認を行った時点では、ログファイルは生成されていた
    - NLog 4.5.4 で動作確認したところ、確かにログファイルが生成されていませんでした

## 回避策

NLog 4.5.4 では、構成ファイルを自動的に読み込む機能が動いていないようです。NLog の GitHub のリポジトリに Issue が上がっていないようなので、Xamarin 固有の不具合かもしれません。
回避策する方法は、明示的に config ファイルを読み込む処理を記述することです。

1. ```XmlLoggingConfiguration``` クラスのコンストラクタに config ファイルのパスを渡す
2. ```LogManager``` クラスの ```Configuration``` プロパティに 1. で生成したインスタンスを設定する

以下にコードの例を記載します。

```csharp
var configName = string.Empty;
#if __ANDROID__
configName = "assets/NLog.config";
#endif
#if __IOS__
configName = "NLog.config";
#endif
LogManager.Configuration = new XmlLoggingConfiguration(configName);
_logger = LogManager.GetCurrentClassLogger();
```

## 補足事項まとめ

- NLog の構成ファイルを自動的に読み込む機能が動かなくなっている模様
- 明示的に config ファイルを読み込む処理を記述する必要がある

## サンプルコード

修正したサンプルを GitHub に公開しています。

- [Xamarin-Forms-NLog-Sample](https://github.com/tafuji/Xamarin-Forms-NLog-Sample/tree/develop-netstandard)
PDCA支援ツールを作ろう その１ 設計

# 言語の決定

さて、早速設計を始めようと思うものの
言語をどうしようかな、と。

汎用性に富むJavaが一番向いてると思いますが
今回は気分でWinAppにしとうございます。

ってことでC#に決定。
気が向いたら他言語版も作りましょ。
やるとしてもJavaか、Java androidか
･･･あー、そうか、Webアプリってのもアリか。

そこらへんはおいおい。
とりあえず形にしないとイメージ沸かないしね。


# 設計する

一口に設計と言っても色々あります。
画面設計、データベース設計、基本設計、機能設計、詳細設計･･･
最近は設計書書かないエクストリームプログラミング(XP)とかもありますね。
カッコいいけど企業的な開発には向かないかも。

おっと、ちょっと脱線したので設計のお話に。
各種設計を行うのは良いのですが、さすがにそこまで設計に時間裂けないので
今回はUML使って簡単なイメージだけつくって見ます。

流れとしてはこんな感じ

1. ユースケース考えて
![ユースケース](https://qiita-image-store.s3.amazonaws.com/0/259679/8d746ad4-d1e0-aa45-a008-c28cf96588f9.jpeg)

1. データ構造を考えて
![クラス図](https://qiita-image-store.s3.amazonaws.com/0/259679/00565066-9070-7f3a-e2e2-fb9e212640a1.jpeg)

1. 画面遷移を考えて
![画面遷移](https://qiita-image-store.s3.amazonaws.com/0/259679/76599825-2e0b-cea8-fb77-688e580baba5.jpeg)

1. おしまい。

まあ、ざっくりだけどこんなもん？
たぶん実際作りこんでいけば足りないものとか気がつくだろうし、初動はこれで十分でしょ。
前回（時間計測App）は機能ごとに別フォームでデータを作ってたので
今回は１フォームで実装しとうございます。

同一フォーム内の画面遷移も作ってみたかったし丁度いいかな、と。

あ、そうそう。
上記の図の作成は[astah](http://astah.change-vision.com/ja/)ってソフト使ってます。
無料版の"astah Community"もあるから興味があったら使ってみてくださいな。
ちなみにCommunityは商用利用はNGです。
次の仕事来たらProfessional版ライセンス買いたい。

ってことで今日はここまで。
実働は02:16:34でした。
AWSとcakephp2とpostgresqlで遅い時の対処

AWSでcakephp2とpostgresでアプリケーションを構成した時に、遅かったので原因と対応した内容です。

## 原因

DBへのアクセスで、カラムの情報を取得している部分の「getColumnMeta」がcolumn数分ループしており、ここが遅かった。

## getColumnMetaが遅いので対応

対応している人がいたので、そのまま導入したら解決

https://github.com/mfn/cakephp2-postgres-no-meta

```
php composer.phar require mfn/cakephp2-postgres-no-meta
```

```app/Config/bootstrap.php
CakePlugin::load('PostgresNoMeta');
```

```app/Config/bootstrap.php
	var $default = array(
		'datasource' => 'PostgresNoMeta.Database/PostgresNoMeta',
		'persistent' => false,
		'host' => 'localhost',
		'login' => 'user',
		'password' => 'password',
		'database' => 'hoge',
		'encoding' => 'utf8',
		'prefix' => '',
	);
```
無線LANつきのUbuntuノートPCを経由して無線LANなしデスクトップWindowsの通信をインターネットに接続する

## 1.互いのイーサネットケーブルのIP設定を以下のとおりにする。(Xは任意の値、U及びWは重複なしの任意の値。)

Ubuntu
(無線ゲートウェイ側)
IPアドレス:192.168.0.X
サブネットマスク:24
ゲートウェイ:192.168.0.1
デバイス名:ethw

Ubuntu
(有線イーサ側)
IPアドレス:192.168.56.U
サブネットマスク:24
ゲートウェイ:127.0.0.1
デバイス名:ethl

Windows
IPアドレス:192.168.56.W
サブネットマスク:24
ゲートウェイ:192.168.56.U

## 2.互いのPCをLANケーブルで接続。
Windows側の操作はこれ以上はない。

## 3.ルーティングテーブルの確認コマンドでルーティングテーブルを確認
 #ip route 

## 4.おそらくこんな設定が増えちゃう。コレがあるとUbuntuがインターネットできないので無効化する。
default via 192.168.0.1 dev ethl  proto static  metric 600 
192.168.0.1 dev ethl proto static  metric 600 
上記の設定を無効化するため以下のコマンドを使用
 #ip route del default via 192.168.0.1 dev ethl
 #ip route del 192.168.0.1 dev ethl

## 5.ゲートウェイとしてUbuntuを使用するようにルーティングする
### 5.1.IPフォワードを有効にする
 #echo 1 > /proc/sys/net/ipv4/ip_forward
 #echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
### 5.2.Windows側のネットワークではUbuntuのアドレスをゲートウェイとして使用することを宣言
 #route add -net 192.168.56.0/24 gw 192.168.56.U ethl
### 5.3.通信を通してNATして開通。
 #iptables -A FORWARD -i ethw -o ethl -s 192.168.56.0/24 -j ACCEPT
 #iptables -A FORWARD -o ethw -i ethl -s 192.168.56.0/24 -j ACCEPT
 #iptables -t nat -A POSTROUTING -o ethw -s 192.168.56.0/24 -j MASQUERADE

これで有線LANしかないPCでもUbuntu経由でインターネットできます。個人的に仮想環境もどきを物理的に組みたかったのでやりましたが実用性は知りません。

参考文献
http://www.atmarkit.co.jp/ait/articles/0505/17/news131_2.html
http://redhatlinux.kt.fc2.com/cont/router.htm
データはDB::ではなくEloquentモデルで持ってこような！

こんにちは。[きむちゃん。](https://twitter.com/KMR_0811)です。

突然ですがみなさん。<h1>研修してますか？</h1>
僕はしてます（してました）。

研修といえば、LaravelでTwitterを模倣したWebアプリとか作りがちですよね、わかるわかる。

そうなると、ユーザとツイートが紐づいて大変だ！中間テーブルの出番だ！
と、いうことで中間テーブルをバンバン使います。

今回は、その際に陥りがちな初心者あるあるな記法ミスについてです。


はい、サクッと説明します。


```php:hoge.php
$tweets = DB::table('tweets')
                    ->where('owner_id', $user->id)
                    ->orderBy('created_at', 'desc')
                    ->paginate(20);
```



```php:hoge.php
$tweets = Tweet::whereIn('owner_id', $user->id)
                    ->orderBy('created_at', 'desc')->paginate(20);
```

二つのコード、どちらも取れる情報自体は同じように見えます。
しかし、View側で$tweetsから紐づいているユーザ情報とかを中間テーブルを使って、

```hoge.blade.php
{{$tweet->user->name}}
```

とかで取るときに重大な違いがあります。

先のDBファサードを使って取得したツイートデータは、Tweetモデルを参照していないため、そこから中間テーブルへのアクセスができないただのデータになります。
Tweet::のEloquentモデルから取って来てる方は、モデルなので参照できます。


はい、何が言いたいかというと、

<h1>
Webアプリはどうせ中間テーブルのオンパレードなんだから、DBファサードはなるべく使わずに、ちゃんとEloquentモデルからデータを持ってこような！！実装機能が増える未来の自分のために！！！
</h1>

です。
最初のうちは、導入が手っ取り早いDBファサードで取ってくる人が多いのではないか？？と思ってお昼ご飯食べながらだらだらと書きました。ので、ご指摘等いただけると幸いです。

初めて、Webアプリとかやる人がこの記事を見て気をつけてくれると恐悦至極です。

それでは。
gitlabでプロジェクトに登録されているwebhook一覧を取得する方法

gitlabのpostgresに接続して以下のクエリを叩く

```
select 
w.url as webhook_url, n.path as group, p.path as project
from  projects as p
inner join web_hooks as w on w.project_id = p.id
inner join namespaces as n on n.id = p.namespace_id;
```
fastTextをWindows環境（BashOnWindows）で実行するための準備

## Bash on Windowsの有効化

以下記事を参考にしてBash on Windowsを有効化する
参考URL）https://qiita.com/Aruneko/items/c79810b0b015bebf30bb

## ホームディレクトリにfastTextをクローン
※%USERNAME%にはubuntuで作成したユーザ名を記載

```bash
$ cd home/%USERNAME%
$ git clone https://github.com/facebookresearch/fastText.git
$ cd fastText
```
## 必要なパッケージをインストール
 - make
 - g++

```bash
$ sudo apt-get update
$ sudo apt install make
$ sudo apt install g++
```

「sudo apt-get update」をやらないと、makeをインストールしようとする際、「E: Package 'make' has no installation candidate」が表示されるので、ここで大分躓きました。

## インストールが完了したらmakeコマンドを実行
```bash
$ make
c++ -pthread -std=c++0x -march=native -O3 -funroll-loops -c src/args.cc
c++ -pthread -std=c++0x -march=native -O3 -funroll-loops -c src/dictionary.cc
c++ -pthread -std=c++0x -march=native -O3 -funroll-loops -c src/productquantizer.cc
c++ -pthread -std=c++0x -march=native -O3 -funroll-loops -c src/matrix.cc
c++ -pthread -std=c++0x -march=native -O3 -funroll-loops -c src/qmatrix.cc
c++ -pthread -std=c++0x -march=native -O3 -funroll-loops -c src/vector.cc
c++ -pthread -std=c++0x -march=native -O3 -funroll-loops -c src/model.cc
c++ -pthread -std=c++0x -march=native -O3 -funroll-loops -c src/utils.cc
c++ -pthread -std=c++0x -march=native -O3 -funroll-loops -c src/fasttext.cc
c++ -pthread -std=c++0x -march=native -O3 -funroll-loops args.o dictionary.o productquantizer.o matrix.o qmatrix.o vector.o model.o utils.o fasttext.o src/main.cc -o fasttext
```

## ./fasttextコマンドが使えるか確認
```bash
$ ./fasttext
usage: fasttext <command> <args>

The commands supported by fasttext are:

  supervised              train a supervised classifier
  quantize                quantize a model to reduce the memory usage
  test                    evaluate a supervised classifier
  predict                 predict most likely labels
  predict-prob            predict most likely labels with probabilities
  skipgram                train a skipgram model
  cbow                    train a cbow model
  print-word-vectors      print word vectors given a trained model
  print-sentence-vectors  print sentence vectors given a trained model
  print-ngrams            print ngrams given a trained model and word
  nn                      query for nearest neighbors
  analogies               query for analogies
  dump                    dump arguments,dictionary,input/output vectors
```

ここまで来るのに相当時間が掛かってしまいました。
この後、学習


### 参考にしたサイト
[fastTextをインストールしてみる](http://shironeko.hateblo.jp/entry/2017/12/02/235649)
　⇒Docker（CentOS）の環境でインストールしている記事。linuxという意味では同じなので参考になりました。
[apt-get install openssh-serverでエラー](http://danish.hatenablog.com/entry/2015/05/12/230223)
　⇒makeインストール時のエラーメッセージで躓いたとき参考になりました。エラーメッセージはすぐ検索したほうがいいですね。
EMF tips （フィールドの型を任意のMap型にする）



http://wiki.eclipse.org/EMF/FAQ#How_do_I_create_a_Map_in_EMF.3F

# 手順
Create Entry for Map
> 0. Create an EClass with the name [Type1]To[Type2]Map where [Type1] represents the key's type and the [Type2] represents the value's type.
0. Set the Instance Class Name property of the newly created EClass to java.util.Map$Entry.
0. Create an EAttribute or EReference named "key" and set the EDataType or EClass for it.
0. Create an EAttribute or EReference called "value" and set the EDataType or EClass for it.

Create Field in MyInterface
> 1. Create an EReference with its EClass set to be the map-entry class you created above.
1. Set the Containment property of your EReference to be true.
1. Set the upper-bound of your EReference to be -1 (unbounded).

# 注意点
手順3，4で指定する型は、Objectであること。
primitive（EIntなど）にすると、MyInterfaceのコード生成に失敗する。
Error Dialog detail message

```
Generating model project
 Generating Java interface 'MyInterface' failed with an unhandled exception.
  A problem was detected while parsing a Java file
   Line xxx: Syntax error, insert "xxxx" to complete ReferenceType
```
自分用メモ：ThinkpadにUbuntuをいれてインターネットにつながらなかった。

# はじめに
ThinkpadにUbuntuを入れた際にインターネットにつながらず死にかけた。

# 環境
Thinkpad X270
Ubuntu 16.04 LTS

# 状況
無線LANでWi-fiを拾わない
有線でケーブルを挿しても認識しない

# 試したこと
[UbuntuでNICを認識しない場合の対処法](https://qiita.com/moroku0519/items/06ac708f08d9570f2b93)

```
$ sudo modprobe e1000e
```
の部分でエラーが出た。

# 結局
[Ubuntu 16.04 on ThinkPad T470s](https://gist.github.com/okapies/de0d08f9e3c8bcb2b76a33b68f62a48c)
[Lenovo T470s, Linux, wifi/ethernet and other problems](http://info.rgug.ch/2017/04/06/lenovo-t470s-linux-wifiethernet-and-other-problems/)
で解決した。

# 参考にしたページ
[UbuntuでNICを認識しない場合の対処法](https://qiita.com/moroku0519/items/06ac708f08d9570f2b93)
[Ubuntu 16.04 on ThinkPad T470s](https://gist.github.com/okapies/de0d08f9e3c8bcb2b76a33b68f62a48c)
[Lenovo T470s, Linux, wifi/ethernet and other problems](http://info.rgug.ch/2017/04/06/lenovo-t470s-linux-wifiethernet-and-other-problems/)
[Drupal8] Wordpressのカスタムポストタイプのようなものを作成したい

Drupal初挑戦中です。
Drupalでwordpressのカスタムポストタイプのようなものを
用意したい場合どうすべきなのか、調べました。
ちなみにサーバーはさくらのレンタルサーバーを利用しています。
ご助言等ございましたら、メッセージください！

## 環境
| Drupal バージョン | 8.5.3 |
|:---:|:---:|
| ウェブサーバー | Apache |
| PHP | 7.1 |
| DB | MySQL 5.7.22 |

## Wordpressのカスタムポストタイプのようなものを作成したい。
今回は「News」として作成したいと思います。
http://example.com/news/xxx

### モジュールの追加
「Pathauto」というモジュールが必要なのですが、「Token」と「CTools」というモジュールに依存するようなので（CToolsは8.x以上の場合）、その二つもインストールします。

- [Pathauto](https://www.drupal.org/project/pathauto)
- [Token](https://www.drupal.org/project/token)
- [CTools](https://www.drupal.org/project/ctools)

#### モジュールのインストール方法
メニュー > 「拡張機能」 > 「新しいモジュールをインストール」ボタンをクリック。「次のURLからインストールする」各モジュールのURL入力しインストールします。
##### モジュールのリンクについて
[Drupalのページ](https://www.drupal.org/)の各モジュールのページから
「Pathauto」の場合はhttps://www.drupal.org/project/pathauto の「Downloads」から右クリックでリンクをコピーします。

#### もし「新しいモジュールをインストール」ボタンがない場合
![新しいモジュールをインストールボタン](https://qiita-image-store.s3.amazonaws.com/0/10263/c9c61c5e-a9d4-324c-53d4-03a7bdc368c7.png)
メニュー > 「拡張機能」 > 「新しいモジュールをインストール」ボタンがない場合
リストにある「Update Manager」にチェックを入れて有効化します。

### モジュールの有効化
メニュー > 「拡張機能」のモジュール一覧に「Pathauto」が追加されているはずなので、
チェックを入れてインストール。「Token」などの関連モジュールも有効化するかという旨の質問をされると思うので了承して有効化を進めてください。

### コンテンツタイプの作成
メニュー > 「サイト構築」 > 「コンテンツタイプ」 > 「コンテンツタイプの追加」から「名前」にNewsと入力し、保存します。

### Pathautoの設定
メニュー > 「環境設定」 > 「検索とメタデータ」 > 「URL エイリアス」 > 「パターン」 > 「Pathauto パターンを追加」と進みます。以下のように、入力またはチェックをしてパターンを作成してください。

| pattern type | コンテンツ |
|:---:|:---:|
| path pattern | /news/[node:nid] |
| コンテンツ | Newsにチェック |
| ラベル | News |
| 有効 | チェック |

### 記事の作成
メニュー > 「コンテンツ」 > 「コンテンツを追加」と進むと先ほど作成したコンテンツタイプの「News」が選択できると思うので、選択し記事を作成します。
記事作成画面に「URLエイリアスの設定」があります。
![スクリーンショット 2018-06-04 16.16.44.png](https://qiita-image-store.s3.amazonaws.com/0/10263/1206545d-635a-48b3-1da3-a41d2e89b1c3.png)
「URL エイリアスを自動生成する」にチェックを入れて記事を作成すると、
その記事のパスが「/news/:id」のようになると思います。

## 参考
[自動的にURLを生成できる Pathauto モジュール](https://drupal.studio-umi.jp/blog/module/pathauto)
[Pathautoモジュールの使い方](https://www.webgogo.jp/drupal/modules/7/pathauto)
プロジェクト毎にjenkinsコンテナを立ててみる

###■やりたかったこと
----

build環境は、プロジェクトごとに変わるので
LAN内のサーバでjenkinsをコンテナでプロジェクトごとに準備すると便利だなぁ

```
/var/lib/jenkins-projectA
/var/lib/jenkins-projectB
/var/lib/jenkins-projectC
```

のようにホストのdirをvolumesでコンテナに繋げればいいなぁ

###■ホスト環境
----

CentOS 7.4
Docker CE 18.03

----

###■イメージは
----

[ContOS7にyumでjenkinsを入れるDockerfile [追記：privileged無し]](https://qiita.com/Ikumi/items/ec8bff9c9931658c1f77)の「privileged無し」のやり方で作りました。

イメージにはプロジェクトに応じてbuildに必要なnpmとか入れます。

----

###■コンテナ起動
----

```docker:docker-compose.yml
version: '2'

services:
  jenkins:
    container_name: jenkins-projectA
    image: jenkins
    volumes:
      - /var/lib/jenkins-projectA:/root/.jenkins:z
    ports:
      - "8080:8080"
    environment:
      TZ: JST-9
```

```
# mkdir /var/lib/jenkins-projectA
# docker-compose up -d --build
```


■参考になりました
[Docker の volume でホストと共有したファイル（ディレクトリ）にコンテナからアクセスできないときは](https://qiita.com/shogogg/items/ad80d0fce28f1c07f71c)
Rubyで文字列に絵文字が含まれるか判定

Rubyで文字列に絵文字が含まれているかを判定し、真偽値を返すメソッドを作ったのですが、見てくれが悪すぎるので誰か他に良い書き方思い浮ぶ方リファクタリングして頂きたい...

### メソッド
```ruby
def emoji_contained?(text)
  # nilは絵文字が含まれていないことにしたい
  return false if text.nil?
  # 絵文字が一文字でも含まれていればその時点でtrueを返す。
  text.each_char do |b|
    return true if b.bytesize == 4
  end
  return false
end
```

### 追記
この記事を投稿した一時間後に @techno-tanoC さんに、改良したコードをコメントに載せて頂いたのでそちらも掲載します！ruby2.3以降で絵文字判定される方はこちらのコードを是非採用ください :bow: 

```ruby
def emoji_contained?(text)
  text&.each_char&.any? {|c| c.bytesize == 4 } || false
end
```
spyOnした関数の戻り値を、実行された順番で変更する方法。（Jasmine）

# ある関数の戻り値を１回目と2回目で変更する方法。

いっつも忘れるのでメモ。

こんな時。

```javascript

hoge = {
  fetchHoge: () => {}, // 何かしらを返す関数
}

// 同一関数を複数回実行する関数 
function fuga(){
  const first = hoge.fetchHoge(); // ← 'a'を返して欲しい
  const second = hoge.fetchHoge(); // ← 'b'を返して欲しい
  return [first, second]
}
```

以上のような感じで、`fuga`をテストするときに、`hoge.fetchHoge`の戻り値を1回目に実行された時と2回目に実行された時で変更したいとします。

## 方法

```javascript
it('戻り値変えたいテスト', () => {
  spyOn(hoge, 'fetchHoge').and.returnValues('a', 'b');
  expect(fuga()).toEqual(['a', 'b'])
})
```

以上。`returnValues()`を使いましょうという話でした。
Javascript のテンプレートリテラルって便利だよね

# javascriptのテンプレートリテラル
> Template literal は組み込み式を扱うことができる文字列リテラルです。複数行文字列や文字列内挿機能を使用できます。ES2015 / ES6 仕様の以前のエディションでは、"template strings" と呼ばれていました。

テンプレートリテラルを使うと、文字列の扱いが便利になります。

---

## 基本的な文法

```javascript
console.log(`文字列`) // " ` "で囲む
```
---

## `"` `'` との違い

### 改行
#### _before_

```javascript
console.log("1行目\n2行目")
```

#### _after_

```javascript
console.log(`1行目
2行目`)
```

![index.png](https://qiita-image-store.s3.amazonaws.com/0/193558/9c1139c9-ae8f-5c6f-d451-d3e3f9fc42fa.png)

---

### 文字列の結合
#### _before_

```javascript
const str = "num";
const num = 123;

console.log(str + " = " + num);
console.log("1 + 2 = " + (1 + 2) + " です。");
```

#### _after_

```javascript
const str = "num";
const num = 123;

console.log(`${str} = ${num}`);
console.log(`1 + 2 = ${1 + 2} です。`);
```

![index.png](https://qiita-image-store.s3.amazonaws.com/0/193558/1ebd0f52-8d05-55c0-172a-9c99b46e6460.png)

---

### エスケープ処理
#### _before_

```javascript
console.log("エスケープ\\nされています");
```

#### _after_

```javascript
console.log(String.raw`エスケープ\nされています`);
```

![index.png](https://qiita-image-store.s3.amazonaws.com/0/193558/37041737-7f00-e92f-66d7-51b4d3ed04f8.png)

---
他にも使い方はありますが、とりあえずこの辺で。

#出典
+ https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/template_strings
VuforiaとPhotonで始めるかんたんシェアリング（1.概念編）

# HoloLensでの空間シェアリング

従来、HoloLensでのシェアリングは「難しい！」というイメージが付きまとっていました。

というのも、最初に公式チュートリアルHolographic Academyに掲載された方法は、サーバアプリケーションを起動してそこに接続することが必要で、しかも接続に失敗しやすいものでした。

次に同じくAcademyに掲載された方法は、わかりにくいことで有名なUNETを用いていることと、やはり接続（サイズの大きな空間情報の転送）に失敗しやすいということで、あまり安定はしていませんでした。

ところが最近、先駆者の皆様おかげで、様々なシェアリングの方法が確立されていき、かなりお手軽に試せるようになってきました。（HoloLensを2台用意するのが一番難易度が高い部分かもしれません）

# シェアリングの要素

シェアリングの要素は、大きく分けると２つに分解されます。
１つめは「座標系の共有」で、２つめは「情報の同期」になります。

## 座標系の共有

HoloLensは、アプリを起動したときのデバイスの座標を(0,0,0)とする自分の座標系を持っています。複数台が別々の場所で起動すれば、それぞれの座標系が存在することになります。
そこで、基準となる物理的な場所を１つ決め、それぞれのHoloLensがその場所の座標を認識します。その場所はHololens Aにとっては(10,1,10)かもしれませんし、HoloLens Bとっては(-5,0,-5)かもしれません。
いちど基準点（アンカー）が決まれば、そこからの相対座標で表すことにより、全てのデバイスで物理的に同じ場所を表すことができます。

## 情報の同期

上記で共有した座標系の上で、オブジェクトの生成・削除・移動・回転やアニメーションなどの動きを付与するには、「同期エンジン」と呼ばれるものが必要となってきます。
同期の例として、HoloLens A上でオブジェクトをInstantiateしたら、HoloLens B上でも同じくInstantiateする必要があります。

シェアリングは同じオブジェクトを共有しているのではなく、それぞれのデバイスの上に生成された同じ動きをするオブジェクトを、共有した座標系で閲覧する、という状態になります。

シェアリングの要素については、下記でイラスト付きでわかりやすくまとまっていますのでぜひご覧ください。

[第7回 HoloLens参考書読書会 ＠アカツキ Ch8. Sharingのはなし](https://www.slideshare.net/daisukeyamanaka967/7-hololens-ch8-sharing)

[HoloToolkit-UnityのSharingの仕組みをできるだけ簡単に理解する](https://qiita.com/miyaura/items/da1d7bd253c3299327ba)

## 座標系を共有するには

「物理的に同じ場所」を共有することが必要になります。具体的には下記の方法があります

- HoloLensが認識している空間情報と場所（WorldAnchor）を共有する
- 画像マーカーを認識させ、その場所をアンカーとする
- HoloLensを同じ位置で起動する

詳しくは、下記のブログにとても丁寧に書かれています。

[HoloLensでSharingする方法(位置合わせ編)](http://akihiro-document.azurewebsites.net/post/hololens_sharingposition/)

今回は、画像マーカーの認識に広く使われている「Vuforia」を使用します。
Vuforiaを使用することにより、空間情報を転送する時に起こりがちな通信エラーを回避できると共に、HoloLens以外のデバイスでも同じ方法でシェアリングを行うことが容易になります。

## 情報を同期するには

情報の同期については、公式のように専用サーバを用意するものや、Unity純正の同期エンジンUNETを使用するもの、またはTCPやUDPの通信を自前で用意してしまうものなどが考えられます。

今回は、ネットワークゲームなどにも広く使用されているPhoton Realtimeを使用します。
Photon Cloudは、中継点となるサーバがインターネット上にあるため、UNETやTCP/UDPよりも柔軟なネットワーク環境で使用できます。シェアリングするデバイスが同じネットワークに接続されていなくても、インターネットに繋がっていさえすれば通信可能なので、たとえば遠隔地同志でシェアリングを行うといったシチュエーションにも向いています。

※続きを投稿予定です
2.実装編(HoloLens)
3.実装編(iOS)←未定
4.実装編(Android)←未定
[Docker] Pulling fs layer で止まって進まないとき

# はじめに
Docker pull をした時にプチつまづきをしたのでメモ。
"[docker pulling fs layer stuck](https://www.google.co.jp/search?q=docker+pulling+fs+layer+stuck)"で検索すると出るんだけど、Stack OverFlowの英語でちょっと避けちゃた人向け（自分）。
~~結局そのStack OverFlowのスレッドで解決したんだけども。。。~~

# 本題
dockerで

```
$ docker pull ruby:2.3.0
2.3.0: Pulling from library/ruby
efd26ecc9548: Waiting
a3ed95caeb02: Waiting
d1784d73276e: Pulling fs layer
72e581645fc3: Waiting
9709ddcc4d24: Waiting
7013ecfd652c: Waiting
66373b9c2e12: Waiting
2a6578ab609c: Waiting
4356bd31ea9f: Waiting
```

こんな感じで画面がずっと動かないときは、一度プロセス止めて、dockerクライアントの再起動が効果的です。

Docker for Mac使ってる人はメニューバーからRestart。
![Docker for Mac](https://qiita-image-store.s3.amazonaws.com/0/166119/8272c8bc-4d74-37aa-ac64-1233102488a0.png)

Linuxは

```
$ sudo service docker restart
```
で再起動してあげれば治るようです。
[Docker Compose stuck downloading or pulling fs layer - Stack Overflow](https://stackoverflow.com/questions/38087027/docker-compose-stuck-downloading-or-pulling-fs-layer)

# 最後に
上記のStack OverFlowを日本語に焼き直しただけです。
同じようなスレッド自体少ないということは、もしかしたら自己解決してしまうような簡単なことかもしれません。
早くDocker上級者になりたいです。
Ruby FFI(Foreign Function Interface)について

これを読んだ話
https://github.com/ffi/ffi/wiki

# FFIとは
wikipediaより
https://ja.wikipedia.org/wiki/Foreign_function_interface

> あるプログラミング言語から他のプログラミング言語で定義された関数などを利用するための機構。
OS固有の機能などを利用するために使用されることが多い．

基本的には、速度やメモリ効率などでまさる言語で書かれたライブラリや、自分が使っている言語にないライブラリを使うなどの使われ方をする．

# なぜFFIを使うのか
### 1. FFI拡張は編集の必要がない

　　FFIを使うことでコンパイラをインストールする必要がないです．
　　あなたのリンクするライブラリはある時点でコンパイルされている必要がありますが，　それも必要ありません．

### 2. FFI extensionはマルチプラットフォームで実行可能

RubyやJRubyを切り替えることなく使える

### 3. FFI extensionは読みやすい＆書きやすい
FFI拡張はRubyで書かれているので読みやすい

### 4.FFI extensionは読みやすく書きやすく、保持しやすい

### 5. Ruby本体の変更に影響されない
python3からmecabを使ってみる

#python3からmecabを使ってみた備忘録

こんにちは。
新卒マイナス1年目エンジニアの和尚です。

今日はpython3から形態素解析に用いられるmecabを使っていこうと思います。
centOS6(Linux)を使用しているので、yumからインストールします。
>*centOS6の導入方法はこちら*
[ドットインストール大先生：ローカル開発環境の構築(windows編)](https://dotinstall.com/lessons/basic_localdev_win_v2)
[ドットインストール大先生：ローカル開発環境の構築 [macOS編] ](https://dotinstall.com/lessons/basic_localdev_mac_v2)

※macOSやwindowsを使用して開発する方はHomebrewなどをご自身の環境に応じてお好きな方法でmecabを導入してください。僕の場合(centOS)はyumが一番楽でした。

### 開発環境
- centOS6
- python 3.6.2
- pip 10.0.1

### 目的
python3からmecabを使用できるようになる。

### 想定読者
- (pythonを使用して)自然言語処理を始めたばかりの方
- エンジニアの卵および雛

## Mecabのインストール

>*参考資料*
>[yumでMeCabをインストール](https://qiita.com/ikenyal/items/275ca3096002822e8cd6)
>[CentOSにMeCabをインストールして使う](https://qiita.com/mhiro216/items/391ae79848129ac1cb2d)
>[mecab公式ドキュメント]
(http://taku910.github.io/mecab/)

### Groongaリポジトリを導入
1. yumでmecabをインストールするために、まず[groonga](http://groonga.org/ja/)を入れます。
2. パッケージ更新

```
$ sudo rpm -ivh http://packages.groonga.org/centos/groonga-release-1.1.0-1.noarch.rpm
$ sudo yum makecache
```
### Mecab本体+その他諸々のインストール
1. Mecab、Mecabの辞書をインストールします。
2. Mecabの開発バージョンもインストールします。 (mecab-configが見つからずエラーを吐いたため)
3. python3のmecabパッケージをインストールします。

```
$ sudo yum -y install mecab mecab-ipadic
$ sudo yum -y install mecab-devel
```

```
$ pip install mecab-python3
```

インストール完了です。
## pythonからmecabを使ってみる
### 動作確認
mecabとmecab-python3がインストールできているかを確認します。

```
$ mecab --version
mecab of 0.996

$ pip list
~
mecab-python3
~
```
このように表示されていたらOKです。

### コードを書く
[mecab公式サイト](http://taku910.github.io/mecab/bindings.html)にあるpythonのサンプルプログラムを実装してみます。
サンプルプログラムはpython2の書き方なので、python3の書き方に変更し、標準入力から形態素解析するように変更しました。

``` python:main.py
import sys
import MeCab
#sysとmecab-python3を呼び出します。

m = MeCab.Tagger ("-Ochasen")
'''
mecabインスタンスの生成(出力フォーマットはchasen)
ヨミ：("-Oyomi")
全情報：("-Odump")
わかち書き：("-O wakati")
etc...　公式ドキュメント見てください。
'''

text = input(">>")
print(m.parse (text))
#標準入力をtextに代入し、表示させます。
```

## 結果
python3からmecabを使用してみました。
[次回はcabocha](https://qiita.com/osyou-create/items/4e2f686d82bf9e1166e8)です。
golang 並列メモ

## waitgroup.Add、waitgroup.Wait
```go
func Afunction(num int) {
    fmt.Println(num)
    waitgroup.Done() //タスク一個終了、タスク数-1、実際.Doneは.Add(-1) 
}
 
func main() {
    for i := 0; i < 10; i++ {
        waitgroup.Add(1) //goroutineごとで、タスク+1、(全体10なので、10回繰り返す)
        go Afunction(i)
    }
    waitgroup.Wait() //.Wait()ここで待つ
}
```

## 例1:
```golang
func main() {

	var wg sync.WaitGroup
	wg.Add(3)
	for i := 0; i < 3; i++ {
		go func(i int) {
			defer wg.Done()
			fmt.Println("reading", i)
		}(i)
	}

	fmt.Println("ready go")
	wg.Wait()
}
```

違う書き方：

```go
func main() {

	var wg sync.WaitGroup
	for i := 0; i < 3; i++ {
            wg.Add(1) //ここが違うだよ！
		go func(i int) {
			defer wg.Done()
			fmt.Println("reading", i)
		}(i)
	}

	fmt.Println("ready go")
	wg.Wait()
}
```

```
//結果：
ready go
reading 0
reading 1
reading 2
```

## 例2：
```go
func main() {

	var wg sync.WaitGroup
	wg.Add(1) 

	go func() {
		fmt.Println("wait1 enter")
		wg.Wait()
		fmt.Println("wait1 exit")
	}()

	go func() {
		fmt.Println("wait2 enter")
		wg.Wait()
		fmt.Println("wait2 exit")
	}()

	go func() {
		fmt.Println("wait3 enter")
		wg.Wait()
		fmt.Println("wait3 exit")
	}()

	go func() {
		fmt.Println("done")
		wg.Add(-1)
	}()

	wg.Wait() 
	time.Sleep(time.Second)
	fmt.Println("main exit")
}
```
```go
//出力1
wait3 enter
wait2 enter
wait1 enter
done
wait1 exit
wait3 exit
wait2 exit

//出力2
done
wait1 enter
wait1 exit
wait2 enter
wait2 exit
wait3 enter
wait3 exit
main exit
```
ERC20トークンのセキュア実装パターン

整理してみた。英語だが。
これが『ベスト』プラクティスかどうかはちょっと判断が難しいが
少なくともある程度考慮が必要な部分を測る土台にはなる。

![ERC20_Pattern.png](https://qiita-image-store.s3.amazonaws.com/0/101086/bb8f0405-0864-af2d-907c-86d2fcde10e0.png)

BaseContractとか、BaseCommonって言うのは構成上ここにチェックや
基本属性の設定・取得の処理を入れておけばいいよ、と言う実装上のパターンを示すもので
トークン構成の本質ではないので一旦外すと、おおまかな構成は以下の表のようになる。

<br/>

- TokenFilter ： フィルターコントラクト
 - アプリケーションから直接呼び出される窓口となるコントラクト
 - 必要に応じて複数のフィルターコントラクトが実装される
 - ほぼ全て処理を他のコントラクトコード（コイン操作等）に委譲している
 - 例えばトークンセールの初期キャンペーンで20%OFFとか20%トークン増量とかやる場合は、専用のFilterを用意してその処理差分だけを実装するイメージ
 - Filter単位でそうした差分を実装し、Filter単位でコントラクトを破棄（廃止）できる

<br/>

- AuthenticateService ： 認証コントラクト
 - コントラクトを利用するユーザアカウント（アドレス）の把握と管理を行う
 - ユーザアカウント（アドレス）単位での権限設定と権限の取得も行う

<br/>

- ContractNameService ： アドレス解決コントラクト
 - 各コントラクトの名前とアドレスの対応管理と解決を行う
 - 各コントラクトコードは例え不備が発覚しても更新できず、新規アドレスで再登録になる
 - 故に各サービス名で現時点の呼び出し先アドレスを取得するために必須となる
 - トークン本体コントラクトと並んで（あるいはそれ以上に）一度デプロイしたら二度と変更してはならないコントラクトなので、確実なものを初回でアップする必要がある（難しい処理のないシンプルなコントラクトコード実装）

<br/>

- TokenERC20 ： トークン本体コントラクト
  - トークン本体『コントラクトコード』とは言うが、実態はトークンそのもの
  - 実装上はいくつかの「手堅い・枯れた・プリミティブな」トークン操作処理が記載されるが、それ以上の操作の付加的な処理はトークン操作コントラクト側で分離実装される
  - トークンそのものなので、一度でもトークンの配布や取引が行われたら、永続的にそのまま利用され、再登録されてはならない（再登録は過去の取引履歴や残高のリセットを意味する）コントラクトである
  - ただ、履歴を放棄するか手間をかけてトランザクションの内容を転記すれば、新規のトークン本体コントラクトに内容をコピーすることは可能

<br/>

- TokenOperator ： トークン操作コントラクト
 -  トークン操作を行うコントラクトコード、トークンの実体データは保持しない
 -  フィルターコントラクトと１：１の関係になり、増量や割引の処理実装が反映されるケースもある
 -  操作にバグがあったり、改善・追加を施したい場合はトークン操作コントラクトのみを再デプロイするので（新規アドレスに対する名前解決の登録は必要だが）、トークン本体の取引履歴や状態に影響を与えないで済む

<br/>
実装時に気にするべき基本的な考慮・制限は以下のとおり。
まだまだ、全然足りないかもしれないので、気づき次第追記していく。

| 役割 | 内容 |
|:----------------:|:-----------------|
| サーキットブレイカー | 問題が発生したとき、可及的速やかに全ての操作を停止させるための仕組み |
| 管理者（オーナー）チェック | 管理者でなければアカウントの管理や、サーキットブレイカーの発動を行えないようにする仕組み|
| 管理アカウントチェック | コントラクトを操作できる登録ユーザ（アカウント）自体を管理し、実行制限を施しておく仕組み |
| アカウント権限チェック | 必要に応じて各コントラクトに権限を設け、それをアカウント管理と連動させて機能させる仕組み | 
| アドレス種別チェック  | ユーザ登録時や送金時にそのアドレスがコントラクトコードではないか、などを管理する仕組み（制限を入れるかどうかは要件次第となるが） |
| 有効期間チェック          | キャンペーンフィルターなどの有効期間をしっかりと定めて、期間外にアクセスさせない仕組み。時間を扱うのが難しければキャンペーンの流量制限等でも。|
Fessにおけるドキュメントクロールの拡張子絞り込み検索

ローカル＋ファイルサーバーのドキュメント検索のため、下記のページを参考にHTML＋Javascriptをカスタマイズして検索画面を作成していたのだが…「拡張子絞り込み」の実装で躓いたので備忘もかねてまとめておく。

[Fess で作る Elasticsearch ベースの検索サーバー 〜 API 編](https://fess.codelibs.org/ja/articles/article-3.html)

# <b>1．状況
そもそもExtra Query関連のドキュメントが見つけられなかったのだが※、何処かにまとまっているのだろうか。。
※
Fess 12.1現在、ここ（[検索API](https://fess.codelibs.org/ja/12.1/api/api-search.html)）以外にそれっぽい記載がある場所がみつけられず…

デフォルトのFess検索画面を参考に、Word/Excel拡張子指定には下記をクエリパラメータに付与すれば良いことは解ったが、ex_qに何を指定できるのか全然わからない。

```text:Wordファイル検索時
~&ex_q=filetype%3Aword
```

```text:Excelファイル検索時
~&ex_q=filetype%3Aexcel
```

しかもこれではxlsとxlsx、docとdocxの区別も付けられない様子。


# <b>2．対応
[Fessのソースリポジトリ](https://github.com/codelibs/fess/blob/master/src/main/webapp/WEB-INF/env/crawler/resources/app.xml)にマッピングを定義しているらしき場所を発見。
（自分の場合は`\app\WEB-INF\env\crawler\resources`配下にあった）

どうやらMIMEタイプ名(参考：[MIMEタイプ名](http://www.wdic.org/w/WDIC/MIME%E3%82%BF%E3%82%A4%E3%83%97%E5%90%8D))にて記載されているようなので、分類したい箇所の名称を変えてみる。


```xml:app.xml(Before)
		<postConstruct name="add">
			<arg>"application/vnd.ms-excel"</arg>
			<arg>"excel"</arg>
		</postConstruct>

　　　　　　　　　・・・

		<postConstruct name="add">
			<arg>"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"</arg>
			<arg>"excel"</arg>
		</postConstruct>
```

↓

```xml:app.xml(After)
		<postConstruct name="add">
			<arg>"application/vnd.ms-excel"</arg>
			<arg>"xls"</arg>
		</postConstruct>

　　　　　　　　　・・・

		<postConstruct name="add">
			<arg>"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"</arg>
			<arg>"xlsx"</arg>
		</postConstruct>
```

これで検索クエリを書き換えてあげれば完了。

```text:Excel(xls)ファイル検索時
~&ex_q=filetype%3Axls
```

```text:Excel(xlsx)ファイル検索時
~&ex_q=filetype%3Axlsx
```


# <b>*追記
####(2018-06-05)
引用しておきながらよく読めていなかった…検索クエリに直接mimetypeを指定できるので、今回の既存マッピングの書き換え手順をすっ飛ばして

```
~&ex_q=mimetype%3A...
```

と指定するのもあり。

(再)参考：[検索API](https://fess.codelibs.org/ja/12.1/api/api-search.html)
※"各要素については以下の通りです。"の箇所
ndenv(anyenv), WebStorm, React のデバッグ

- ndenvのnpmと同じディレクトリに`npm-cli.js`を作る

```bash
cd ~/.anyenv/envs/ndenv/versions/v10.2.1/bin
cp npm npm-cli.js
```

ほぼこれで全て。

- デバッガ設定

`Run` -> `Edit Configuration` -> `JavaScript Debug`

![image.png](https://qiita-image-store.s3.amazonaws.com/0/12060/ffcbd383-8c99-6fbc-f93c-41544505fefc.png)


あとはデバッグボタンを押すとブラウザ立ち上がるのでデバッグポイント追加するなりなんなりできるようになります。

以上
PHPのstacktraceが途中で切れたのでその設定(nginx/php-fpm)

## 前提
 - PHP7.2
 - php-fpm
 - nginx

## 課題
PHPのエラーログを見ていたら、stacktraceが途中で途切れた。

```
PHP Fatal error:  Uncaught Error: Call to a member function func() on array in /path/to/file.php:693
Stack trace:
#0 /path/to/file.php(421): file->func('XXX')
#1 /path/to/file.php(106): file->func(4)
#2 /path/to/file.php(507): file->func()
#3 /path/to/file.php(1337): file->func()
#4 /path/to/file.php(1341): file->func(1)
#5 /path/to/file.php(326): file->func(1)
#6 /path/to/file.php(341): file->func('151', 1, Array)
#7 /path/to/file.php(184): file::func('151',  in /path/to/file.php on line 693
```

## 解決策
### 1.php.iniにある"log_errors_max_len"の値を書き換える
PHPのstacktraceの制限の設定はphp.iniファイルの中で、以下のように定義されている。

```
(略)

; Set maximum length of log_errors. In error_log information about the source is
; added. The default is 1024 and 0 allows to not apply any maximum length at all.
; http://php.net/log-errors-max-len
log_errors_max_len = 1024

(略)
```

ここを以下のように修正して保存すると制限が解除される。

```
log_errors_max_len = 0
```

### 2.php-fpmを再起動
上記のままだと反映されないので、php-fpmを再起動。

```
sudo systemctl restart php-fpm
```

これで設定が反映されて解決。

## 補足
php.iniファイルの場所がわからない人は、```$ php --ini```を実行してみるといい。

```
$ php --ini
Configuration File (php.ini) Path: /home/user/.anyenv/envs/phpenv/versions/7.2.1/etc
Loaded Configuration File:         /home/user/.anyenv/envs/phpenv/versions/7.2.1/etc/php.ini
Scan for additional .ini files in: /home/user/.anyenv/envs/phpenv/versions/7.2.1/etc/conf.d
Additional .ini files parsed:      /home/user/.anyenv/envs/phpenv/versions/7.2.1/etc/conf.d/apcu.ini,
/home/user/.anyenv/envs/phpenv/versions/7.2.1/etc/conf.d/memcached.ini,
/home/user/.anyenv/envs/phpenv/versions/7.2.1/etc/conf.d/phpredis.ini,
/home/user/.anyenv/envs/phpenv/versions/7.2.1/etc/conf.d/xdebug.ini

```
こんな感じで出てくるので、*Loaded Configuration File* を見ればOK
if文は条件分岐ではない

# if文は条件分岐ではありません

プログラミング言語の設計思想によって少し異なりますが、if文は「条件分岐のための仕組みではありません」というお話です。

## プログラミング入門記事のif文とswitch文についての解説がわからない

一般的なプログラミング言語には、if文とswitch文という複数の分岐構文がありますね。C言語を学びはじめた時に「if文で分岐できるのに、なぜswitch文があるのか？」と疑問に思ったものです。

さっそく当時通っていたプログラミングスクールの先生に聞いてみたところ「たくさん分岐する時はif文よりswitch文の方が読みやすい」という、全く意味のわからない解説をされました。確かに比較する値が異なるif-elseが続くコードは読みにくい気はしますが、if文よりswitch文の方が見やすいというのは、あくまで主観的な理由だと思います。

例えば、pythonにはswitch文がありませんが、不満を言っている人は周囲にいますか？

私の周りには一人もいません。

## switch文が条件分岐

結論をいう前に、まずswitch文について触れておきます。

switch文は紛れもなく条件分岐のための文です。

部屋のスイッチをイメージしてもらえれば分かりますが、電流を別の回路へ切り替えるための装置であることはわかるでしょう。

switch文は処理を分岐するための仕組みです。

さて、それではif文はなんのためにあるのでしょうか？

## if文はエラーチェックをして例外を処理をする仕組み

結論から言うと、if文はエラーチェックをする仕組みです。

プログラム実行時に、入力値が出力値へと、正常に出力されればよいのですが、いとしない出来事「例外」が発生するのは日常茶飯事です。

例外つまり思いがけないエラーが発生した時に、if文で異常値を検出して例外処理をするのです。

もしかして...異常が起こっていませんか？と確認するための仕組みがif文なのです。

AかBかCのどちらかへ行きましょうという分岐ではないのです。

if文を条件分岐だと勘違いしている人がいるから、この世には読みにくく保守がしにくいプログラムコードがはびこっているのではないでしょうか。

↓↓↓↓↓↓↓ あなたの記事の内容
よくわからずプログラミングを教えている先生には、気をつけましょう！あとはついでにtry...catch万能神話を語る輩にも気をつけましょう。
───────
if文を条件分岐だと勘違いしている人がいるから、この世には読みにくく保守がしにくいプログラムコードがはびこっているのです。よくわからずプログラミングを教えている先生には、気をつけましょう！あとはついでにtry...catch万能神話を語る輩にも気をつけましょう。
↑↑↑↑↑↑↑ 編集リクエストの内容

…という、ただの愚痴でした。

おしまい。
Docker のプロキシ設定


社内などのプロキシ環境内でDocker build を行うための設定についてです。情報が混在していて正しく動作させるのに苦労したので、ここで共有します。

# 環境
| 名称      　　　　|      バージョン、パッケージ名称 | 
|:-----------------|------------------:|
| Linux            | Ubuntu 16.04.1 LTS |
| デーモン管理      |            systemd |
| Docker      　　 |            Docker CE 18.03.1-ce, build 9ee9f40|

# 必要な設定
先に結論を言ってしまうと、以下の２つの設定の記述を行った後にdocker の再起動が必要となります。

### DNS設定

/etc/docker/daemon.json に、/etc/resolve.conf と同様に以下のように記述します。

```config:/etc/docker/daemon.json
{
    "dns": ["nameserver-ip-address"],
    "dns-search": ["search-url"]
}
```

### プロキシ設定
~/.config/config.json に以下のように記述します。

```config:~/.config/config.json
{
    "proxies":
    {
        "default":
        {
            "httpProxy": "http://<ip-address>:<port>/",
            "httpsProxy": "http://<ip-address>:<port>/",
            "noProxy": ""
        }
    }
}
```
### 再起動

```
$ sudo systemctl restart docker
```

# 動作確認方法

プロキシ設定が正しくないと、Docker build において、Dockerfile に記述されたapt-get 等が失敗します。以下のDockerfile で、HTTP とHTTPS プロキシの両方について確認しました。

### Dockerfile
```dockerfile:Dockerfile
FROM ubuntu:16.04

# http proxy の設定が正しくないと、これが成功しない
RUN apt-get update

# add-apt-repository のインストールに必要
RUN apt-get install -y software-properties-common

# https_proxy の設定が正しくないと、これが成功しない
RUN add-apt-repository ppa:team-gcc-arm-embedded/ppa
```

### ビルドコマンドとログ
```
$ docker build --no-cache -t name .
Sending build context to Docker daemon  67.58kB
Step 1/2 : FROM ubuntu:16.04
 ---> 0b1edfbffd27
Step 2/2 : RUN apt-get update
 ---> Running in eb52a908e50a

# HTTP プロキシ設定が正しくないと、ここでしばらく待ち状態になった挙句に

Err:1 http://archive.ubuntu.com/ubuntu xenial InRelease
  Temporary failure resolving 'archive.ubuntu.com'

# アドレス解決に失敗する

Processing triggers for systemd (229-4ubuntu21.2) ...
Processing triggers for libc-bin (2.23-0ubuntu10) ...
Processing triggers for ca-certificates (20170717~16.04.1) ...
Updating certificates in /etc/ssl/certs...
148 added, 0 removed; done.
Running hooks in /etc/ca-certificates/update.d...
done.
Processing triggers for sgml-base (1.26+nmu4ubuntu1) ...
Processing triggers for dbus (1.10.6-1ubuntu3.3) ...
Removing intermediate container a71810f0b742
 ---> 5d7f92217c65

# HTTPS プロキシ設定が正しくないと、add-apt-repository に失敗する

Step 4/5 : RUN add-apt-repository ppa:team-gcc-arm-embedded/ppa
 ---> Running in 857e176c6eda
```

# 補足
前述の設定を行わなくとも、ビルドコマンドへの引数でプロキシサーバの指定が可能です。ただ、DNS の設定をしていない場合は、ここでプロキシサーバのIP アドレスを直接指定する必要があります。

```
$ docker build -t tag --build-arg http_proxy=http://<ip-address>:<port>/ --build-arg https_proxy=https://<ip-address>:<port>/ .
```

##参考情報
* [Docker CE インストール](
https://qiita.com/lynlea/items/e00248dd697059969203)

* [Proxy環境でdockerを外に繋ぐ方法](https://qiita.com/Riliumph/items/921e76444ea6ba145294)

* [Configuring options for docker run](
https://stackoverflow.com/questions/44184496/configuring-options-for-docker-run/44184773#44184773)
VBAでURL Encodeを実行する


【追記】「Script Control」は64bit版Officeでは基本的に利用不可なので現在ではこの技を使うことはできません


「Script Control」を使うのがポイント
さらに「encodeURLを呼べる関数を作成する」のもポイント

```visualbasic
    Dim objSC As Object 'Script Control
    Dim s As String
    Dim strFunc As String '関数文字列
    
    Set objSC = CreateObject("ScriptControl")
        objSC.Language = "JScript"
        strFunc = "function encode(s) { return encodeURI(' + s + '); }"
        objSC.AddCode strFunc
    
   s = objSC.CodeObject.encodeURI("テスト")
    Debug.Print s

```
Cache'事始：ODB(Object Database)とRDB(Relational Database)の違い

Object DataBase(ODB)について注目している。
ODBの代表製品として、InterSystemsのCache'が存在する。
http://www.intersystems.com/jp/our-products/cache/cache-overview/
（評価版はユーザー登録後に無償ダウンロード可能）

ODBの利点は
１：テーブル拡張を「オブジェクト継承」として記述できる
２：テーブルの各要素をSetとGetの関数型で記述できる
３：SQLを記述する必要がない（パフォーマンスについてわずかに犠牲になる）
４：オブジェクト指向言語上で、ディスク上にインスタンスを永続化できる

Cache'の開発環境はStudio（スタジオ）と呼ばれる。
使用言語はObjectScriptと呼ばれる、M言語を拡張したもの。
（ただし、完全なオブジェクト指向言語の要件は満たしていない）

Cache'ではしばしば、SQL呼び出しにも対応できることが強調されているが、
真の魅力はODBそのものであると考えている。
ODBを最大限に生かすための構造設計とコーディングについて、
.NET言語と組み合わせた使用法に注目して記載していく。
defind?を三項演算子で使うときに注意すべきこと

変数が定義されているか確認する `defined?`を利用した際、思わぬ挙動をしたのでメモ。

## 事象
以下は期待通りの挙動ですが、

```ruby
defined? a # => nil
```

三項演算子を利用したときに、`expression`が返却されてしまいました。

```ruby
defined? a ? a : nil # => "expression"
```

## 原因：カッコ省略でメソッド適用範囲が意図と違ってしまった
原因はカッコを省略したことにより、`defined?`が意図しない範囲にかかってしまったためでした。

```ruby
defined? a ? a : nil # => "expression"

defined?(a ? a : nil) # => "expression"

defined?(a) ? a : nil # => nil
```

## 結論：defined?を三項演算子で使うときはカッコを省略しない
`defined?`に限らず、カッコを省略した場合の挙動をきちんと理解して利用しないといけないですね。

```ruby
defined?(a) ? a : nil # => nil
```
## 参考記事
* [Ternary expression with “defined?” returns “expression” instead of value? - Stack Over Flow
](https://stackoverflow.com/questions/10467523/ternary-expression-with-defined-returns-expression-instead-of-value?utm_medium=organic&utm_source=google_rich_qa&utm_campaign=google_rich_qa)
PhpStorm で「Multiple definitions exist for class LoggerInterface」が出る場合

PhpStorm を使っていて、意図しないで `Multiple definitions exist for class LoggerInterface` が発生していて、それを納得いく方法で解決出来ずにモヤモヤしていました。
~~でも、JetBrains 公式の人に聞いてみたら、やっぱりこの方法で良いんじゃないか、ということだったので少し自信がついたのでメモっておきます。~~

@DQNEO さんにご指摘いただきましたが、.phar ファイルを無視する方法がありました。

https://qiita.com/DQNEO/items/e541a5ebeb65979d45c3

ついでに参考まで公式ヘルプも
https://www.jetbrains.com/help/phpstorm/excluding-files-from-project.html


.phar ファイルを無視すれば解決ですが、一応別解として情報は残しておきます。
***

前提条件として、使用する `composer` に phar ファイルをプロジェクト内で配置していて、なおかつ PhpStorm の composer にその phar ファイルを設定している場合とかで発生すると思います。

（個人の理解では）
`composer.phar` には依存するパッケージが埋め込まれている、PhpStorm はプロジェクトに配置された phar ファイルに埋め込まれたパッケージもライブラリーとみなす。（これは composer.phar のパスを設定しないで、単純に phar ファイルをプロジェクトに置いただけでも一緒かも）
composer で依存管理しているパッケージも、PhpStrom が自動でインクルード・パスに追加してくれるので、`PSR-3 Logger Interface` のように `composer.phar` の内部でも使用していて、それをプロジェクトでもインストールしている場合には、2重に定義されて表題のような動作になるんだと考えています。

以下のような手順で、単純に再現できます。

```console
$ mkdir foo
$ cd !$
$ curl -sS https://getcomposer.org/installer | php
$ ./composer.phar init
$ /composer.phar require psr/log
```
（PhpStorm の composer を設定）

そうすると、以下のようなPHPで `Multiple definitions exist for class LoggerInterface` の発生を確認できる。

```php
<?php

use Psr\Log\LoggerInterface;

class sample
{
    public function __construct(LoggerInterface $logger)
    {
    }
}
```

これは `PSR-3 Logger Interface` が二重に定義されているのが原因だと考えられるので、php のインクルード・パスから `/vendor/psr/log` を削除してやれば一応解決します。

***

プログラムで使用している依存パッケージをインクルード・パスから削除して、プログラムでは使用していない phar ファイルのライブラリを使用する、というのが気持ち悪いしバージョンに差異などあると困るので、上記の方法よりも .phar を無視する方法の方がスマートだと思います。

***

さらに追記

`nesbot/carbon` に名前空間なしの `JsonSerializable` インタフェースが定義されていて、PHP 標準の方のインタフェースを記述したつもりが「Multiple definitions exist」になってしまう。

解決策を少し悩んだけど、`vendor/nesbot/carbon/src/JsonSerializable.php` のファイルを右クリックして、「Mark as Plain Text」を選ぶという強引で単純な解決方法しか思いつきませんでした。

- [nesbot/carbon JsonSerializable](https://github.com/briannesbitt/Carbon/blob/version-1.27/src/JsonSerializable.php)
- [PHP Runtime JsonSerializable](http://php.net/manual/ja/class.jsonserializable.php)
複数のURLを一括で短縮URLにしたい

メモ

やりたいこと：
複数のURLを一括で短縮URLにしたい。
1個なら短縮サービスにアクセスして生成すれば良いが、複数あるとそれをチマチマやるのがだるい。

短縮サービスは
これとか
https://syncer.jp/url-shortener

GoogleのURL短縮はサービスが終了する。なんでや。


方法：
＜解決してない＞

この辺を参考にすれば良いのだろうな～というところまでは見当がついたが、それぞれのページに書いてあることが高度過ぎてIT素人には理解できない。うーん。どうしよう。

https://webapps.stackexchange.com/questions/76050/google-sheets-function-to-get-a-shortened-url-from-bit-ly-or-goo-gl-etc


https://qiita.com/vitway/items/bbff65d86ce030e8a374


こういうツールもあったけど、なんとなく使いたくない。
https://freesoft-100.com/review/urlshorter.html


調べてる間に、20個ぐらいのURLなら上記の短縮サービスでチマチマやったほうが早いのかもしれない……なにかに負けた気がするけど。


取り急ぎメモ。
2018/06_01 御題決め

# 今週の御題

さて、始まりましたワンドロ開発。

"御題を決めて短期間で作ろう！"って言うコンセプトね（初見向け説明）

で、今回の課題はこれ！
**「PDCAサイクルの支援ツール」**

_うん？自分で書いといてなんだけどこれ偉いざっくりしてるぞ･･･？_

やればなんとかなるか（ポジティブ）

ってことで早速設計しましょ。
今日中に終わればいいなー。