OmniAICreator/Qiita-1.07M huggingface dataset:
Homebrewが突然エラーを出すようになった時の対処

今まで何事もなく使えていたHomebrewがいきなりエラーを出すようになってしまったので、その時に試した対処法を記載

# これまでの経緯
最近まで使用出来ていた`brew update`のコマンドをMacのターミナルに入力して実行した時に、下のエラーが発生していました。

```
MBAEY:~ ey$ brew update
mkdir: /usr/local/var/homebrew/locks: Permission denied
/usr/local/Library/Homebrew/utils/lock.sh: line 19: /usr/local/var/homebrew/locks/update: No such file or directory
-e:1:in `initialize': Bad file descriptor (Errno::EBADF)
	from -e:1:in `new'
	from -e:1:in `<main>'
Error: Another active Homebrew process is already in progress.
Please wait for it to finish or terminate it to continue.
```

上の方を見てみると

```
mkdir: /usr/local/var/homebrew/locks: Permission denied
```

となっていたので、どうやら権限が外れてしまっているようです。

# やったこと
エラーメッセージを見る限り権限がないためにエラーが発生しているようなので、対象のフォルダに権限を付与することで解決できそうだったので試してみました。

使うコマンド

```
sudo chown -R `whoami` /usr/local
```

これで実行してみると

```
MBAEY:~ ey$ sudo chown -R `whoami` /usr/local
Password:
MBAEY:~ ey$ brew update
Updated Homebrew from 299dffd to f4a8d28.
Updated 2 taps (homebrew/core, homebrew/versions).
==> New Formulae
mpage
==> Updated Formulae
aria2                                    ford                                   
autoconf-archive                         git-flow-avh                           
cli53                                    homebrew/versions/mariadb100           
convox                                   ios-deploy                             
emacs                                    libstrophe                             
erlang                                   ponyc                                  
fio                                      prometheus                             
==> Deleted Formulae
rsense
```

どうやらうまくいったみたいです。

# 参考
権限を付与することでエラーは解消しましたが、そもそも「なぜ権限が外れてしまったのか」はよく分かっていません。
これとは別かもしれませんが、調べていると次の記事が見つかりました

* [Fix Homebrew error "/usr/local/bin is not writable" on OS X El Capitan](http://blog.blakesimpson.co.uk/read/89-fix-homebrew-error-usr-local-bin-is-not-writable-on-os-x-el-capitan)

この記事の下の方に「Sophos Antivirus」を使用しているかとあり、どうやらSophosがスキャンしている時にディレクトリの権限に影響を与えるとの内容が書かれていました。

権限周りでなぜかエラーになった時に、考えられる原因として「セキュリティソフト」が挙げられるというのは意外でした。
UWPでEventTriggerを使う

#概要
　UWPでEventTriggerを使おうと思ったら、ちょっと手間取ったので手順を残します。

#導入
　WPFではBlendの中のライブラリを参照したりしました。UWPではNugetで**Behaviors**というライブラリを使います。

##Nuget
　Nugetで次のどちらかを入手します

- Microsoft.Xaml.Behaviors.Uwp.Native
- Microsoft.Xaml.Behaviors.Uwp.Managed

##XAML側準備
　そして、WPFのときと同じように名前空間をxamlに追加します

```xml
xmlns:Interactivity="using:Microsoft.Xaml.Interactivity" 
xmlns:Interactions="using:Microsoft.Xaml.Interactions.Core"
```

##EventTrigger追加

```xml
<Button x:Name="button1">
    <Interactivity:Interaction.Behaviors>
        <Interactions:EventTriggerBehavior EventName="Click" SourceObject="{Binding ElementName=button1}">
            <Interactions:InvokeCommandAction Command="{Binding UpdateCountCommand}"/>
        </Interactions:EventTriggerBehavior>
    </Interactivity:Interaction.Behaviors>
</Button>
```

##その他
　このライブラリは色々な機能があるっぽいので、活用しましょう（他人任せ）。

#参考
- [ライブラリ公式ページ](https://github.com/Microsoft/XamlBehaviors)
- http://blog.qaramell.com/papemk2/16549
myThings Developersとは

## はじめに
この記事は[myThings Developers](https://mythings-developers.yahoo.co.jp/)について、その特徴や同名の[myThingsアプリ](http://mythings.yahoo.co.jp/)との違いを紹介します。

## myThings Developersとは
myThings Developersそのものに関しては、[公式ドキュメント](https://mythings-developers.yahoo.co.jp/document/overview)が用意されてますので、是非そちらをご覧ください。

myThings Developersは、さまざまなサービス、デバイスの APIを共通のI/Fで利用可能にしてくれるサービス連携プラットフォームです。

現在、Twitter、Facebook、Fitbit、BOCCOなど、さまざまのサービスやデバイスでAPIが提供されていますが、それらを使いこなそうとした場合、TwitterであればTwitterの、FitbitであればFitbitのAPIの使い方をそれぞれ学習する必要がありました。myThings Developersはそんな異なるルールで提供されるAPIの中継装置となり、**共通のルールでAPIを利用可能**にします。

このmyThings Developersを利用することで、さまざまなサービスと連携するIoTデバイスなどを簡単に開発することができます。連携可能なサービスは[公式ページ](https://mythings-developers.yahoo.co.jp/)を確認してください

## myThingsアプリとの違い
myThingsアプリは、WebサービスやIoTデバイスが持つ機能を自分で組み合わせて便利に使うことができるアプリです。詳しくは[こちら](http://qiita.com/yamamotomanabu/items/efb8ce3756b5a4929d59)をご覧ください。

このmyThingsアプリは日常の定型作業を簡単に自動化できるアプリでありながら、IDCFCloudというサービスと組み合わせて利用することで、IoTデバイスの開発にも活用することができました。

myThings DevelopersはそのIoTデバイスの開発に特化した開発者向けのサービスです。

## myThings Developersを使うメリット
1. サービス連携の開発負担・API学習コストを大幅に低減
2. myThings Developers経由でしか利用できないAPIが利用可能

## myThings Developersが提供する機能
myThings Developersが提供する主な機能は2つ
1. カスタムトリガー
2. カスタムアクション

### カスタムトリガー
カスタムトリガーは、さまざまなサービスやデバイスのAPIを 共通のI/Fで呼び出す為の機能です。
myThings Developersでは、以下のような画面を提供しています。画面中央の「丸」に、連携させたいサービスのアイコンを左ペインからドラッグ・アンド・ドロップすることで、GUI上でサービス関連携を実現することができます。
![e7d6dfa0a981aa01d959.png](https://qiita-image-store.s3.amazonaws.com/0/51093/9d7ffc3b-1de7-eff1-cc31-a57cfefca6bf.png)


カスタムトリガーとGmailを連携してみます。
1. 「左の丸」にカスタムトリガーのアイコンをセットします・・・①
2. 画面下部にカスタムトリガーのAPIエンドポイントが表示されます・・・②
3. 「右の丸」にGmailのアイコンをセットします・・・③
これで、②のAPIエンドポイントを呼び出すだけで、GmailのAPIを実行することができます。
![image](https://qiita-image-store.s3.amazonaws.com/0/51093/09623b66-fc5c-a5a4-c22a-3863806b4292.png)

更に右ペインでGmailのAPIをどのように使うか設定することができます。
![image](https://qiita-image-store.s3.amazonaws.com/0/51093/4346de6b-e4de-01ee-9727-a9f970f4721d.png)

このカスタムトリガーを中継装置に使うことで、さまざまなAPIを同じI/Fで利用可能にします。
![image](https://qiita-image-store.s3.amazonaws.com/0/51093/e338ed2b-59a5-e372-9ef1-a3e3ad8108cf.png)


### カスタムアクション
カスタムアクションは、指定したサービスが指定した状態になったら Webhookさせることできる機能です。

ヤフー防災速報とカスタムアクションを連携してみます。
1. 「左の丸」にヤフー防災速報のアイコンをセットします・・・①
2. 右ペインでWebhookさせる条件を設定します・・・②
3. 「右の丸」にカスタムアクションのアイコンをセットします・・・③
これで、②の条件を満たした場合にWebhookが行われます。
![image](https://qiita-image-store.s3.amazonaws.com/0/51093/b6fa7790-60f8-ab5c-64ec-129219887767.png)

Webhook先のURLは以下のように指定します。
![image](https://qiita-image-store.s3.amazonaws.com/0/51093/7be305a2-4543-c028-dd9a-b04b9de769c7.png)

このカスタムアクションを使うことで、Webhookに対応していないAPIをWebhookのように扱うことができ、今までは自前でポーリングを行っていたところをシンプルにすることができます。
![image](https://qiita-image-store.s3.amazonaws.com/0/51093/2d851c2d-7d63-95d0-0083-d364db0dbc83.png)

## 最後に
これらの機能を実際に試せるように[チュートリアル](https://mythings-developers.yahoo.co.jp/document/tutorial_index)が用意されていますので、是非そちらもご確認ください。
elasticsearch_dsl: Djangoのモデルと連携


- [elasticsearch_dsl.document](https://github.com/elastic/elasticsearch-dsl-py/blob/master/elasticsearch_dsl/document.py)

## ModelDocTypeとModelDocTypeMeta

~~~py
# coding: utf-8
from __future__ import unicode_literals
from django.conf import settings
from elasticsearch_dsl import DocType
from elasticsearch_dsl.document import DocTypeMeta
from core.utils import to_natural_key_string

INDEX = getattr(settings, 'ELASTICSEARCH_INDEX', 'django')

def from_hit(cls, hit):
    return cls._model.objects.get(pk=hit.meta.id)                                 


class ModelDocTypeMeta(DocTypeMeta):
    '''DocTypeMetaのカスタマイズ'''
    def __new__(cls, name, bases, attrs):
        if 'Meta' in attrs and hasattr(attrs['Meta'], 'model'):
            # モデルが定義されていたら、 _modelにセットして、 doc_type, index修正
            attrs['Meta'].doc_type = to_natural_key_string(attrs['Meta'].model)
            attrs['_model'] = attrs['Meta'].model
            attrs['from_hit'] = classmethod(from_hit)
            if not hasattr(attrs['Meta'], 'index'):
                attrs['Meta'].index = INDEX

        return super(ModelDocTypeMeta, cls).__new__(cls, name, bases, attrs)


class ModelDocType(DocType):
    __metaclass__ = ModelDocTypeMeta

    def __init__(self, **kwargs):
        instance = kwargs.pop('instance', None)
        if instance:
            # インスタンスが指定されたら、mappingに定義されているフィールドにコピー
            params = dict(
                (i, getattr(instance, i))
                for i in self._doc_type.mapping)
            params.update(kwargs)
            kwargs = params
        super(ModelDocType, self).__init__(**kwargs)
        if instance:                                                                
            self.meta.id = instance.pk    
~~~

## Product と ProductIndexer

~~~py
# coding: utf-8
from __future__ import unicode_literals
import elasticsearch_dsl as dsl
from . import models
from core.indexers import ModelDocType


class ProductIndexer(ModelDocType):
    code = dsl.String()
    name = dsl.String()
    description = dsl.String()

    class Meta:
        model = models.Product        # モデルを定義


from elasticsearch_dsl.connections import connections
connections.create_connection(hosts=['localhost'], timeout=20)
ProductIndexer.init()
~~~


## 保存

~~~py
In [1]: from products.indexers import *

In [2]: p = ProductIndexer(instance=ProductIndexer._model.objects.last())

In [3]: p._doc_type.name
Out[3]: u'products.product'

In [4]: p.meta.index
Out[4]: u'django'

In [5]: p.meta.id
Out[5]: 3

In [6]: p.save()
Out[6]: True
~~~

## 検索


~~~py
In [1]: from products.indexers import *

In [2]: hit = ProductIndexer.search().query('match', description=u"テキパキ").execute().hits[0]

In [3]: hit.meta.to_dict()
Out[3]:
{'doc_type': u'products.product',
 u'id': u'3',
 u'index': u'django',
 u'score': 0.028767452}
~~~

モデル取得

~~~py
In [5]: ProductIndexer.from_hit(hit)
Out[5]: <Product: Trimming>
~~~
Yeomanをbash on windowsに入れてみる

# 最初失敗したインストール方法

- apt-getでインストールできたデフォルトのnodejsとnpmを使用。
- sudo npm install yo bower grunt-cli -g　を実行
- ENOENTもしくはEACCSでエラー終了。

# 成功した方法

- 下記を参考にn packageをインストール
http://qiita.com/seibe/items/36cef7df85fe2cefa3ea
- node.js v6.6.0にて下記を実行（バラバラにインストール）
- sudo npm install yo -g
- sudo npm install grunt-cli -g
- sudo npm install bower -g (一回失敗し、uninstall後もう一回実行)
誰でもわかる、MacでPythonの初期環境を構築をする 2016年9月（pyenv + virutalenv）

# Pythonを利用する目的
運営するプロダクトのデータ分析を自分で簡単に行いたいと思い、Pythonを始めました。RとPythonどちらを選択するか迷いましたが、下記3点の理由からPythonを選びました。

* Deep Learning系のライブラリが充実している
* Webアプリケーションとの相性が良い
* 友人のイケてるエンジニア達がPythonを推奨している



# インストールする対象
環境はMac OSX 10.10.5で、Xcodeとhomebrewがインストールされている前提で進めます。

* pyenv 
* Python（2.7.12、3.5.2）
* virutalenv



# インストール手順
## pyenvをインストールする
### pyenvとは？
Pythonのバージョンを簡単に切り替えられるツールです。Pythonを複数バージョンインストールして、ディレクトリ毎に使用するバージョンを指定できます。
Pythonには、2系と3x系が存在します。両者は構文レベルでの互換性がないため、2系のコードを3系で読む、またその逆もできないため、バージョン管理ツールが便利です。

### pyenvのインストール手順
homebrewからpyenvをインストールします。

```
$ brew install pyenv
```

シェルの環境変数を設定します（bashを使っている場合）。

```
$ echo 'export PATH="$HOME/.pyenv/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
```

インストール完了を確認します。

```
$ pyenv version
```



## Python（2.7.12、3.5.2）をインストールする
Pythonは、Macであればデフォルトでインストールされていますが、pyenvから必要なバージョンをインストールします。バージョンは、2系と3系の最新バージョンをインストールすればOKです。

### Pythonのインストール手順
pyenvで、インストール可能なバージョンの一覧を表示します。

```
$ pyenv install -l
```

pyenvからpython 3系（3.5.2）をインストールします。

```
$ pyenv install  3.5.2
```

次に、pyenvからpython 2系（2.7.12）をインストールします。
※ただし、2系でしか使えないライブラリも減ってきているため、2系のインストールはあまり必要ではありません。

```
$ pyenv install  2.7.12
```

全体で利用するバージョンを設定します。

```
$ pyenv global 3.5.2

```

インストール完了を確認します。

```
$ pyenv versions
```



## virtualenvをインストールする
### virtualenvとは？
Pythonの仮想的な環境を作ることができるパッケージです。プロジェクトごとにPythonのバージョンを変えたり、必要なパッケージを分けてインストールして動かすことができます。

### virtualenvのインストール手順
homebrewからvirtualenvをインストールします。

```
$ brew install pyenv-virtualenv
```

シェルの環境変数を設定します。

```
$ export PYENV_ROOT=$HOME/.pyenv
$ export PATH=$PYENV_ROOT/bin:$PATH
$ eval "$(pyenv init -)"
```



# 補足
anacondaは、利用していません。理由は、ライブラリの管理をすべてanacondaに委ねてしまうことで、pipで他パッケージをインストールした時にトラブルが発生する場合があるためです。



# おわりに
何かご不明な点、誤りなどございましたらコメントお願いします。私が友人から教えてもらったことが、より多くの方の役に立てば幸いです。
Neomakeでtscを使う際にprojectのtsconfigを使うようにする設定

## 結論

```vim
let g:neomake_typescript_tsc_maker = {
        \ 'args': [
            \ '--project', getcwd(), '--noEmit'
        \ ],
        \ 'append_file': 0,
        \ 'errorformat':
            \ '%E%f %#(%l\,%c): error %m,' .
            \ '%E%f %#(%l\,%c): %m,' .
            \ '%Eerror %m,' .
            \ '%C%\s%\+%m'
        \ }
```

## 補足

`'append_file': 0`がないと
`tsc --project /path/to/project --noEmit /path/to/file`というコマンドが渡されるのだが、`tsc`は`--project`オプションを渡すとfile pathを引数にとれないため`'append_file': 0`としてfile pathを渡さないようにする。
[備忘録] AndroidのIn-app BillingのorderIdは、テスト時にはセットされない

忘れていると、とても痛い目にあう仕様。

AndroidのIn-app Billingの**orderId**は、
(アプリのアルファ/ベータ公開)**テスト時にはセットされない**。

ドキュメントの片隅に、ひっそりと書いてあります。
[Testing In-app Billing]
https://developer.android.com/google/play/billing/billing_testing.html#testing-purchases
Testing In-app Purchasesセクション。
> Test purchases can be used in alpha/beta releases only. 

Test Purchases (In-app Billing Sandbox)
> Test purchases don't have an orderId field

または、In-app Billing Referenceの、
Table 4. Descriptions of the JSON fields for INAPP_PURCHASE_DATA.
を参照。

ですが、この仕様を忘れていた場合、テスト時にorderIdがセットされていないことが発覚するのは、アプリの**アルファ/ベータ公開**テスト時。

なので、orderIdをチェックするコードが入っている場合は、何らかの対策しておかないといけません。(テスト時はスルーするなど)
・・といっても、「テスト時」かどうか判定できない(テストかどうか判定するフラグは、データに入っていない)ので、実際は、本番用とテスト用のバージョンを分けるしかありません。
言い換えると、orderIdを扱う箇所があるなら、**本番にならないとテストできないパスが存在する**ということ。

テスト段階で、(購入処理の一部ができないなどで)対策が抜けている事に気づいた場合は・・
・対策用のコードを入れたら、他の場所に不具合が出た
(例：orderId以外のチェックなどが原因で、セーブデータが読込めない)
・テスト時のセーブデータを、本番用にそのまま使えない
(例：orderIdが設定されていないデータが混在するので、セーブデータの消去が必要)
・すでに公開していたアプリに、購入機能を追加した場合は・・テスト参加者は、どこまでロールバックするのだろう？
というシナリオもあり得るので、要注意。

そして、(テスト時は)**orderIdに紐付くデータを持たせられない**。
こちらの方が深刻な問題です。(テスターだけロールバック・・を除けば。)

取引照合用のデータベースなどで、うっかり、注文ID(orderId)をキーにしてしまったなんて事は・・、いや、(仕様上の制限を説明していなければ)普通、するでしょう。当然、Web周りも影響を受けるわけで。

テストをしないで公開する？設計変更して大幅に直す？それとも・・公開を一旦中止する？

そんな選択に迫られないためにも、In-app Billingを使う場合は、(この大迷惑な仕様の事を)忘れないように注意しましょう。
苦行インストールしたGitLab環境でコンテナレジストリをLet'sEncryptを利用しつつ環境構築

## 前提
- ubuntuを基準に記載します
- 苦行インストール(source build)したGitLab 8.8+があること
- Docker engineがインストール済み
- letsencryptが使えること
- インターネットが使えること

## Registryの構築

### Docker registryの設定ファイル
以下のファイルを作成する

```/etc/docker/registry/config.yml
version: 0.1
auth:
  token:
    realm: https://gitlab.example.jp/jwt/auth # GitLabのURL + /jwt/auth
    service: container_registry
    issuer: gitlab-issuer
    rootcertbundle: /certs
```

### letsencryptで証明書発行する
```
cd letsencryptのディレクトリ
./letsencrypt-auto certonly -d registry.example.jp
```

### docker registryの起動
```
# image格納ディレクトリの作成
mkdir -p ~/gitlab/shared/registry
# imageの取得
docker pull registry:2.5
docker run -d -p 5000:5000 --restart=always \
  --name=regisgry \
  -v ~/gitlab/shared/registry:/var/lib/registry \
  -v /etc/docker/registry/config.yml:/config.yml \
  -v /etc/letsencrypt/archive/registry.example.jp:/certs \
  -e REGISTRY_STORAGE_DELETE_ENABLED=true \
  registry:2.5
```

※ `REGISTRY_STORAGE_DELETE_ENABLED`を入れないとイメージの削除ができません。

### nginxの設定
https://gitlab.com/gitlab-org/gitlab-ce/blob/master/lib/support/nginx/registry-ssl
を拝借して
`/etc/nginx/conf.d/registry-ssl.conf`として使います

変更する場所は下記の3項目

```/etc/nginx/conf.d/registry-ssl.conf
server_name  registry.gitlab.example.com;
ssl_certificate /etc/gitlab/ssl/registry.gitlab.example.jp.crt # crtファイルを置いた場所
ssl_certificate_key /etc/gitlab/ssl/registry.gitlab.example.jp.key # keyファイルを置いた場所
```

nginxの再起動

```
service nginx restart
```

### GitLabの設定変更

```gitlab/config/gitlab.yml
  registry:
    enabled: true
    host: registry.example.jp
    api_url: https://registry.example.jp/
    key: config/privkey.pem
    path: /home/git/gitlab/shared/registry
    issuer: gitlab-issuer
```

GitLabの再起動

```
/etc/init.d/gitlab restart
```
コマンドライン上でRSSを取得し続ける

# コマンドライン上でRSSを取得し続けるpy

![newsfeeds.PNG](https://qiita-image-store.s3.amazonaws.com/0/113494/1a14545d-4c1c-88bf-8fa6-776d8afa12aa.png)



ほとんどこちらからソースをいただきました。
[Search Make. 何か作りたいモノづくりサイト RSSを取得する ](http://make.bcde.jp/python/rss%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B/)

feedparserのインストールはcondaを使って
`conda install feedparser`

ドキュメントはこちら
[feedparser 5.2.0 documentation](https://pythonhosted.org/feedparser/#)


```python:get_feed.py
from datetime import datetime
from time import mktime
import feedparser
from tqdm import tqdm
from time import sleep

# RSSのURL
RSS_URL = "http://www.fxstreet.jp/rss/news/forex-news/"

# RSSの取得
feed = feedparser.parse(RSS_URL)

# RSSのタイトル
print(feed.feed.title, '\n')


while True:
	try:
		for entry in tqdm(range(len(feed.entries))):
			# RSSの内容を一件づつ処理する
			title = feed.entries[entry].title
			link = feed.entries[entry].link

			# 更新日を文字列として取得
			published_string = feed.entries[entry].published

			# 更新日をdatetimeとして取得
			tmp = feed.entries[entry].published_parsed
			published_datetime = datetime.fromtimestamp(mktime(tmp))

			# 表示
			print(title)
			print(link)
			print(published_string)
			print(published_datetime)
			print('\n')
			sleep(1)
	except KeyboardInterrupt:
		break
```










## 追加した動作

* `while True:`で無限ループ
* `try-except`でctrl+cを押すまでループ
* `time.sleep(1)`で一エントリーにつき一秒おきに表示
* `tqdm.tqdm`で一周するまでにシーケンスバーを表示
	* tqdmはanacondaに入っていなかったのでこちらから取得
	* [conda-forge / Packages / tqdm 4.10.0](https://anaconda.org/conda-forge/tqdm)
	* condaでインストールするときは` conda install -c conda-forge tqdm `


## TODO

* 複数RSSを巡回
* 一定時間経過 or 配信元で新しいnews配信されることで更新
* リンク先に本文があれば本文も表示(htmlパース)
* 文字列解析、データ化、集計、グラフ化


## BUGS

* ipython上では問題なく動くが、cmder上でエンコードエラー
`UnicodeEncodeError: 'cp932' codec can't encode character '\u20ac' in position 36: illegal multibyte sequence`
Railsの1対多のmodelで子レコードに個数制限を設けたい


こんな感じでどうだろう?

# 仕様

親(Shop)に子(Item)は3個までしか持てない

# 実装

## 親(Shop)

```.rb
class Shop < ActiveRecord::Base
  has_many :items
  accepts_nested_attributes_for :items
  validate :items_size_validate

  ITEM_MAX = 3
  def items_size_validate
    errors.add(:items, "items over") if self.items.size > ITEM_MAX
  end
end
```

## 子(Item)

```.rb
class Item < ActiveRecord::Base
  belongs_to :shop
  validate :shop_items_size_validate

  # 既にShopのitemが3つある時に、
  #   item = Item.new(shop_id: shop.id, name: 'item_4')
  # と、した場合にバリデーションできるように
  def shop_items_size_validate
    if self.shop && self.shop.items.size >= Shop::ITEM_MAX
      errors.add(:base, "items over")
    end
  end
end
```

# かんそう

- `#shop_items_size_validate` については、 `Item.new` を直接呼び出すのを、チーム内で禁止するだけでも良いかもしれない
素人の言語処理100本ノック:08


[言語処理100本ノック 2015](http://www.cl.ecei.tohoku.ac.jp/nlp100/)の挑戦記録です。環境はUbuntu 16.04 LTS ＋ Python 3.5.2 \:\: Anaconda 4.1.1 (64-bit)です。過去のノックの一覧は[こちら](http://qiita.com/segavvy/items/fb50ba8097d59475f760)からどうぞ。

## 第1章: 準備運動

###08.暗号文
>与えられた文字列の各文字を，以下の仕様で変換する関数cipherを実装せよ．
>
>・英小文字ならば(219 - 文字コード)の文字に置換
>・その他の文字はそのまま出力
>
>この関数を用い，英語のメッセージを暗号化・復号化せよ．

出来上がったコード：

```python:main.py
# coding: utf-8


def cipher(target):
	'''文字列の暗号化、復号化
	以下の仕様で文字列を変換する
	・英小文字ならば(219 - 文字コード)の文字に置換
	・その他の文字はそのまま出力

	引数:
	target -- 対象の文字列
	戻り値:
	変換した文字列
	'''
	result = ''
	for c in target:
		if c.islower():
			result += chr(219 - ord(c))
		else:
			result += c
	return result


# 対象文字列の入力
target = input('文字列を入力してください--> ')

# 暗号化
result = cipher(target)
print('暗号化:' + result)

# 復号化
result2 = cipher(result)
print('復号化:' + result2)

# 復号化で元に戻っているかチェック
if result2 != target:
	print('元に戻っていない！？')
```

実行結果：

```text:端末
文字列を入力してください--> I couldn't believe that I could actually understand what I was reading : the phenomenal power of the human mind .
暗号化:I xlfowm'g yvorvev gszg I xlfow zxgfzoob fmwvihgzmw dszg I dzh ivzwrmt : gsv ksvmlnvmzo kldvi lu gsv sfnzm nrmw .
復号化:I couldn't believe that I could actually understand what I was reading : the phenomenal power of the human mind .

```

問題には対象文字列の指示がないので、[`input()`](http://docs.python.jp/3/library/functions.html#input)を使って標準入力から受け取るようにしてみました。
　
9本目のノックは以上です。誤りなどありましたら、ご指摘いただけますと幸いです。
chrome53で、WebAudioAPI  OscillatorNode と setValueAtTime のバグ


# 事象

WebAudioAPIを使って、キーボードを作って遊んでいたのですが、
突如音階が変わらなくなりました。

サンプル↓
https://alf-ytakada.github.io/html5-oscillator-issue/

具体的に、OscillatorNodeのfrequencyに対して、setValueAtTimeを下記のように使うと、これまですぐに周波数が設定されていたのに、変わらなくなってしまいました（常に440hz出力）。

```javascript:oscillator.frequency.setValueAtTime
     var oscillator    = ctx.createOscillator()
     var hz = 880;
     oscillator.frequency.setValueAtTime(hz, 0);
     oscillator.connect(ctx.destination);
```

OscillatorNodeは、frequencyを変更する時に、下記のやり方もあるのですが、

```javascript:oscillator.frequency.value
     oscillator.frequency.value = hz;
```

これだと、同じoscillatorの周波数を変える際に、
元→先の途中の周波数が補完されてしまいます（グライド）。

# 今すぐ対処するには？

下記で良いようです。

```js
     oscillator.frequency.setValueAtTime(hz, ctx.currentTime);
```

# issue

ということで調べた所、ちゃんとバグ報告が上がっていました。
[Immediate scheduling of AudioParam using setValueAtTime occasionally does not work.](https://bugs.chromium.org/p/chromium/issues/detail?id=645776&q=setValueAtTime&colspec=ID%20Pri%20M%20Stars%20ReleaseBlock%20Component%20Status%20Owner%20Summary%20OS%20Modified)

治るのも時間の問題でしょう！
UnlimitedHandを動かすまで

2015年9月あたりにKickstarterでbackerになり、3月あたりに手元に届いたけど、最初「ビリってきた…」だけしかなく、それで終わってしまってた。
しばらく放置してて、TGS2016にH2Lさんが出展されていて、直接岩崎さんに色々レクチャーしていただいたので、ちゃんとUnlimitedHandを動かす方法を記載する。 
ちなみに、すでにUnlimitedHandは一般販売していて、アマゾンで購入可能。
https://www.amazon.co.jp/dp/B01EMVXXLK 

# ジェルを張る
基本的には、付属している説明書([Devサイト](http://dev.unlimitedhand.com/)の[マニュアル](http://dev.unlimitedhand.com/UHManual_EN.zip)も同じ内容)の通り。
本体を充電するのと、3つのジェルを、青色フィルムがついている方をパット側、透明フィルムがついている方を腕側になるように張り付ける。
![IMG_20160918_215933.jpg](https://qiita-image-store.s3.amazonaws.com/0/141310/42c82be6-8252-52cb-4523-9d2584742b35.jpeg)

素直に張り付けるとこうなるけど、これだと「ビリってきた…」だけになってしまう。  
ジェルを張り付ける前に、通電部の白いシートを外しておく必要がある。こんな感じ。
![IMG_20160918_220903.jpg](https://qiita-image-store.s3.amazonaws.com/0/141310/12e3c52a-42ea-c8d2-e468-b4a567bc18b7.jpeg)

# Unityで動かす
シリアル通信ができれば良いので、Bluetoothであらかじめペアリングしておくか、USB経由でも動かすことが出来る。今回はとりあえずUSB接続で動かしてみる。
環境依存しないと思うけど、使ったのはWin10x64のUnity5.4.0f3。  

Devサイトの[デモアプリ](http://dev.unlimitedhand.com/UHDemo_Graph.zip)をダウンロードしてきて、zipなので解凍する。
Unityでデモアプリを開く。  
UnlimitedHandの電源をいれ、USB接続して、comポートを確認する。もしcom3につながってるなら特に何もすることはない。
もしcom3以外につながってるなら、ポート設定する必要がある。
HierarchyビューでUHを選択。
![pic01.PNG](https://qiita-image-store.s3.amazonaws.com/0/141310/9b9567a2-c0a4-e386-4bc1-c6c998f89322.png)

InspectorビューでPort Nameに「COM4」のように入力する。
![pic02.PNG](https://qiita-image-store.s3.amazonaws.com/0/141310/b95e8e32-c9f7-00c5-be10-1ed6ed4d8781.png)

UnlimitedHandを腕に取り付ける。本体を腕の内側にし、手首と肘の間くらいの位置に巻き付ける。
最後にマジックテープで留めるときに、クロスさせて留めると安定する。こんな感じ。
![IMG_20160917_151820.jpg](https://qiita-image-store.s3.amazonaws.com/0/141310/f1520e88-364c-02df-3093-ac4d657853e6.jpeg)


Unityで実行ボタンを押下し、「Stimulation0」などのボタンを押下すると、指とか腕とかがピクピク動くはず。
「Level Up」「Level Down」ボタンで強弱をコントロールできるので、感度が悪かったりするならLevelUpボタンで調整してみると良いかも。 
ファームウェアのアップデートも必要になるみたいだけど、とりあえず動かすだけなら、これだけで確認できる。

ホントにぴくぴくするー。面白いわ、これ。
「ビリってきた…」だけじゃなかったんだ(笑)
AWS CloudFront で OpenStreetMap や 国土地理院タイル を Elastic化して Leaflet / OpenLayers3 や Kibana から参照 (後編)

# 概要

![スクリーンショット 2016-09-18 17.35.25.png](https://qiita-image-store.s3.amazonaws.com/0/69410/d1369f98-a9b1-4979-1ccc-8515c2b1f7a2.png)

[前編](http://qiita.com/exabugs/items/35699c14a08171c2c76a) : タイルサーバを CloudFront を使って CDN 配信する
[後編](http://qiita.com/exabugs/items/3cc10fa3380d738ef9ab) : CloudFront をタイルサーバとしてクライアントを作成する

# はじめに(後編)

[前編](http://qiita.com/exabugs/items/35699c14a08171c2c76a)で構築した CloudFront によるタイルサーバを使って、クライアント側 のアプリケーションを設定/作成します。


以下、この構成について順番に見ていきます。

![スクリーンショット 2016-09-18 17.22.34.png](https://qiita-image-store.s3.amazonaws.com/0/69410/64aad22c-5843-7360-bd03-599ac387a48f.png)
(後編の範囲)

## 地図アプリケーション

以下のタイル情報を使った、LeafletとOpenLayer3のアプリを作成しました。

ベース地図

 - OpenStreetMap
 - 地理院地図 標準
 - 地理院地図 オルソ
 - 写真(1974年)
 - 写真(1979年)
 - 写真(1984年)
 - 写真(1988年)
 - 簡易空中写真(2004年)
 - 白地図

レイヤー地図

 - 色別標高図
 - 土地利用図
 - 地質
 - 断層・褶曲
 - 土地条件

Githubにアップロードしておきます。html単体で動作します。
https://github.com/exabugs/WMTS

★[前編](http://qiita.com/exabugs/items/35699c14a08171c2c76a)で構築したCloudFrontを以下の部分にタイルサーバとして設定してください。

```
    // CloudFrontを使ってアクセス先をひとつにまとめた
    function mtsHost(path) {
        // あなたのCloudFrontを指定してください！！
        // 仮にOpenStreetMapを指定しています
        return "http://tile.openstreetmap.org/" + path;
    }
```

例えば、以下のようなことも、確認できます。

 - 今住んでいる家の地盤は大丈夫ですか？  
(クリックした地点の、詳細地質情報を産業技術総合研究所から引いてきます)
 - 40年前、実家や会社は存在していましたか？
 - 今いる場所の海抜はどれくらい？  
大きな津波が来た時は、どこに非難するべきか。

### Leaflet
![スクリーンショット 2016-09-14 0.39.09.png](https://qiita-image-store.s3.amazonaws.com/0/69410/7e972cc0-28f8-738a-8df0-de4fd536450a.png)

 - パーマネントリンクを作ってくれる leaflet-hash ライブラリが超便利です！
 - ベクタータイルは、国土地理院のサンプルを参考に、leaflet-tilelayer-geojson ライブラリを使って対応しています。
 - 次の OpenLayers3 と比較して、若干使いやすいので、自分としてはこちらがオススメです。
 - 因みに Kibana は Leaflet を使っているのですね。


### OpenLayers3
![スクリーンショット 2016-09-14 0.37.47.png](https://qiita-image-store.s3.amazonaws.com/0/69410/d481e768-0658-8d03-b4b6-f370441d5f68.png)

OpenLayers3 で同等の機能を実装しました。

 - レイヤーコントロール機能がないので、自分で実装です。
 - スケール(Leafletでの左下のものさし)機能が、無いですね。
 - ベクタータイルは、外部ライブラリ無しで自ら描画できるようです。

## Kibana
MapQuest社のタイルサービス停止に伴い、おいおい困ったよ〜 て人が続出だと思います。

Kibana のタイルサーバの変更方法は、下記 Developers.IO 記事を参照してください。
[KibanaのTileMapにOpenStreetMapを利用する](http://dev.classmethod.jp/server-side/elasticsearch/kibana-openstreetmap/)

OpenStreetMap を使うには、kibana 設定ファイルに以下を追記します。
他のタイルデータを使うこともできます。(Kibana再起動が必要ですが)

```:/opt/kibana/config/kibana.yml
tilemap.url: "http://<cloudfront>/{z}/{x}/{y}.png"
tilemap.options.maxZoom: 18
```

この CloudFront版 であれば、自分でタイルサーバを構築せずとも、オリジンサーバに迷惑かけることなく業務を継続できると思います。

因みに、OpenStreetMap にすると、以下のように、Zoom18まで対応になります。
![スクリーンショット_2016-09-18_20_33_10.png](https://qiita-image-store.s3.amazonaws.com/0/69410/762b6228-b8bc-ebb7-d6f0-ab8d624e3aa1.png)


Advanced - JSON Input に以下を設定すると、さらにクラスタリング粒度を詳細にすることができます。

```
{"precision":9}
```


# まとめ
 - [前編](http://qiita.com/exabugs/items/35699c14a08171c2c76a)では、オープン地図データをCloudFrontでElastic化し、地図アプリケーションから利用可能にしました。
 - 幾つかの地図データをレイヤーで重ね合わせる地図アプリケーションを作成しました。
 - OpenStreetMap の思想と、そのデータ精度は素晴らしいです。  
微力ながら、データの更新作業に参加していきたいと思っています。
 - 実際の業務で使用するには、オリジンサービスの利用規約を確認してください。
Googleに買収されオープンソース化されたLaunchKitをMacにインストールする。

# LaunchKitとは？

https://launchkit.io/

AppStoreやGooglePlayStoreに掲載するスクリーンショットをいい感じに作ってくれるサービスが有名。
他には、アプリ用Webサイト作成、レビュー通知等の機能。

有料サービスだったが、Googleに買収されて、現在は新規登録はできない。
オープンソース化されて、Macにインストールできる。

１つの画像で(iPhone/iPad/Androidの様々なサイズの画像を出力してくれる)↓
<img width="160" alt="3.5-inch (iPhone 4) - Screenshot 1.png" src="https://qiita-image-store.s3.amazonaws.com/0/82563/818dc734-bed7-6b43-90e0-b681030745e0.png">
<img width="207" alt="5.5-inch (iPhone 6+) - Screenshot 1.png" src="https://qiita-image-store.s3.amazonaws.com/0/82563/fe8a8509-2c92-8909-1a09-bab64896dbde.png">
<img width="512" alt="iPad Pro - Screenshot 1.png" src="https://qiita-image-store.s3.amazonaws.com/0/82563/d91377b5-97ec-1757-4be6-0e025f69e7b0.png">


# Githubのドキュメント通り進める。

https://github.com/LaunchKit/LaunchKit

## STEP1-コンパイラの確認
ターミナルで、
> `$ cc`

と入力してみる。
↓こんなエラーが出れば大丈夫
> `clang: error: no input files`

Not foundの場合は、Xcode　developer toolsをインストールする。

## STEP2-Vagrantをインストールする

VagrantはVirtualBoxの操作をいい感じにラップしてくれるツール

https://www.vagrantup.com/downloads.html

ダウンロードした.dmgをインストール。

## STEP3-VirtualBoxをインストール

5.0系をインストールしてくれと書いてあるので、言う通りに5.0.26をインストール
https://www.virtualbox.org/wiki/Download_Old_Builds_5_0

## STEP4-ansibleのインストール

書いてある通りにターミナルで実行していく。
>`$ sudo easy_install pip
$ pip install --upgrade setuptools --user python
$ sudo pip install ansible`


※opensslのエラーがでるときのみ
`sudo env LDFLAGS="$(brew --prefix openssl)/lib/libssl.a $(brew --prefix openssl)/lib/libcrypto.a" CFLAGS="-I$(brew --prefix openssl)/include" pip install ansible`

ansibleを実行してみてインストールの確認。(ヘルプ表示されたらOK)
> `$ ansible`

## STEP5-LaunchKitをGitからクローン

>`$ cd [クローンしたいディレクトリ]
$ git clone https://github.com/LaunchKit/LaunchKit.git
$ cd LaunchKit`

## STEP6-LaunchKitの起動

### 起動
> `$ vagrant up --provision`

初回実行時にubuntuのイメージをダウンロードしてくれる。(かなり長い)

ターミナルの処理が終わったら、

> http://localhost:9100/

にブラウザでアクセス

![スクリーンショット 2016-09-18 23.41.54.png](https://qiita-image-store.s3.amazonaws.com/0/82563/c35a86cb-277c-c872-3e5f-f9108d98d3e7.png)
素のcentos7でDjangoのチュートリアルをしようとしたら下準備が必要だった話

# 経緯
Djangoを触りたくてチュートリアルを勉強中のDockerで実行しようとしたら  
いろいろと下準備が必要だった話

# 前提
- dockerを使う。コンテナのイメージはcentos7:latest
- インストールするpythonは3.5.2でpyenvを使う

# 概要
Djangoのチュートリアルをするために、dockerのコンテナでpyenvを用いて、
pythonをインストール使用としたらエラーがでたのでちょっとづつ解決した。

# 解決の仕方
そんなんどーでもいいから、解決したい人は以下のスクリプトをコンテナ上で実行するとよいよい。
https://github.com/tomokitamaki/BuildForDockercontPython/tree/master
`筆者の都合でDjangoのインストールまで行われます。`

# 出てきたエラーと工程

## pyenv 入れようとしたらgit なかった
- 以下で解決  
`[root@c72864a7fe2c ~]# yum install -y git`

## python インストールしようとしたらCコンパイラがなかった
- エラーメッセージ  

```
[root@c72864a7fe2c ~]# pyenv install 3.5.2
sha256sum: the --quiet option is meaningful only when verifying checksums
Try 'sha256sum --help' for more information.
Downloading Python-3.5.2.tar.xz...
-> https://www.python.org/ftp/python/3.5.2/Python-3.5.2.tar.xz
Installing Python-3.5.2...

BUILD FAILED (CentOS Linux 7 using python-build 1.0.0-47-g5be82cb)

Inspect or clean up the working tree at /tmp/python-build.20160918121231.1047
Results logged to /tmp/python-build.20160918121231.1047.log

Last 10 log lines:
checking for --with-universal-archs... no
checking MACHDEP... linux
checking for --without-gcc... no
checking for --with-icc... no
checking for gcc... no
checking for cc... no
checking for cl.exe... no
configure: error: in `/tmp/python-build.20160918121231.1047/Python-3.5.2':
configure: error: no acceptable C compiler found in $PATH
See `config.log' for more details
[root@c72864a7fe2c ~]# cat /tmp/python-build.20160918121231.1047.log
```

- 以下で解決  
`[root@c72864a7fe2c ~]# yum install -y gcc`

## makeがない
- 以下で解決  
`[root@c72864a7fe2c ~]# yum install -y make`

## bzip2がない
- エラーメッセージ  
```
# WARNING: The Python bz2 extension was not compiled. Missing the bzip2 lib?
```
- 以下で解決  
`[root@c72864a7fe2c ~]# yum install -y bzip2-libs.x86_64 bzip2 bzip2-devel.x86_64`

## GUN readlineがない？
- エラーメッセージ  
```
WARNING: The Python readline extension was not compiled. Missing the GNU readline lib?
```
- 以下で解決  
`[root@c72864a7fe2c ~]# yum install -y readline readline-devel.x86_64`

## opensslのライブラリがない
- エラーメッセージ  
`ERROR: The Python ssl extension was not compiled. Missing the OpenSSL lib?`

- 以下で解決  
`[root@c72864a7fe2c ~]# yum install openssl openssl-devel.x86_64`

## sqliteがない

- エラーメッセージ  
```
WARNING: The Python sqlite3 extension was not compiled. Missing the SQLite3 lib?
```
- 以下で解決  
`[root@c72864a7fe2c ~]# yum install sqlite-devel.x86_64`
sassスタイルシートが読み込まれないのはインデントのせいかも

rubyはじめて２日の初心者マンです。
https://cyllabus.jp/courses/LVlXWNb8GcWTKy8x1gHS5g
ここのシラバス参考にtwitterクローンサイト作ってたら

sassファイルが適用されない壁にぶち当たりました。
いろいろ調べた結果bootstrapと競合してるのかな？とかいろいろ見たんですけど
理由は単純で、最初からインデントを入れてたせいだった。

インデントを消すだけで一発で読み込まれた。
Twitter APIのツイートの言語判定の精度が高すぎる！日本語はなんと100％！完璧！

**※本内容は2013年5月に自分のブログに書いた内容ですが、現在も通用する内容です。**
<hr>

Twitter Streaming APIのsampleで各ツイートのlang（言語情報）が取得できますので、今回はその言語判定の精度を検証してみました。

# 使用データと判定の検証方法

>**＜使用データ＞**
> 日時：2013年04月29日（月）00:10:00～00:10:09 の10秒間
> 方法：Streaming APIのsample（全公開ツイートの約1％）
> ツイート数：736 ツイート（日本語161、英語219、他言語358）
> 
>**＜検証方法＞**
> ・日本語(jp)と英語(en)を対象とする。
> ・てぃー自身がツイート内容を確認し、言語判定と比較して検証する。
> ・検証では「正解」「不正解」「どちらでもない」の３種類に分ける。
> 
>**＜ソースコード＞**
> 　→[【Twitter4J】Streaming APIのsampleで各ツイートのlang（言語情報）を取得する方法](http://qiita.com/teapipin/items/d5395905379a6591fc92)

日本語・英語以外はてぃーが分からないのでパスです＾＾
検証の「どちらでもない」には記号のみ、特に顔文字のみの場合を含みます。確かに顔文字なら各言語でよく使われるものもあって判定は可能とも言えますが、主観が入ってしまうこともあるので今回は不明としました。

# 検証結果
判定結果は次の表のようになりました。（上段：ツイート数、下段：割合％）

日本語
<table border="0"><tbody><tr><th>　</th><th>日本語と判定されたもの</th><th>日本語と判定されなかったもの</th></tr><tr><th>正解</th><td align="right">161<br><span style="color:#FF0000">100.0%</span></td><td align="right">575<br><span style="color:#FF0000">100.0%</span></td></tr><tr><th>不正解</th><td align="right">0<br>0.0%</td><td align="right">0<br>0.0%</td></tr><tr><th>どちらでもない</th><td align="right">0<br>0.0%</td><td align="right">0<br>0.0%</td></tr></tbody></table>

英語
<table border="0"><tbody><tr><th>　</th><th>英語と判定されたもの</th><th>英語と判定されなかったもの</th></tr><tr><th>正解</th><td align="right">211<br><span style="color:#FF0000">99.5%</span></td><td align="right">516<br><span style="color:#FF0000">98.5%</span></td></tr><tr><th>不正解</th><td align="right">1<br><span style="color:#0000FF">0.5%</span></td><td align="right">8<br><span style="color:#0000FF">1.5%</span></td></tr><tr><th>どちらでもない</th><td align="right">0<br>0.0%</td><td align="right">0<br>0.0%</td></tr></tbody></table>

<font color="red">日本語で100.0％、英語で99.5％ととても高い精度です。</font>
**特に日本語は完璧ですね！**
「どちらでもない」は今回は該当がありませんでした。
一方で英語では不正解があり、英語と判定された場合で0.5％、英語と判定されなかった場合で1.5％と完璧ではなかったですが、かなりの精度です！

ちなみにこれらのツイート内容は次のようなものでした（本文のみ）。
>**＜英語と判定されたツイート内容＞（1つ）**
> ・fOOLY & cOOLY – Them a Fe Get a Beatin' di @petertosh, da #SoundHound
> 
>**＜英語と判定されなかったツイート内容＞（8つ）**
> ・Come on United! #ArsenalForEuropaLeague
> ・\*Unfollows\*
> ・Was That Malik
> ・Lmao I had to #repost #regram #purecomedy lol
> ・thanks ^^
> ・the ring two>
> ・Well hello new Follower
> ・I swear I could eat a dozen donuts

# まとめ
<font color="red">日本語に関しては完璧な判定となることはすごいですね。</font>
英語に関してもほぼ完璧と考えてよいでしょう。
もはや特別な言語判定メソッドを考えたりする必要はまずない、としてもよいのではないのでしょうか！！
いろいろ構想が膨らみますね！

# 応用
てぃーはこの方法を応用して、ツイッターの曜日別ツイートやよく使われるアプリなどを分析しています。分析結果はネットで評判になったり、学術研究に利用されています！
　→<a href="http://teapipin.blog10.fc2.com/blog-entry-298.html">【分析】ツイッター分析のシリーズの目次　by Twitter4J - creativi.tea</a>
Wordpress入れたら「データベース接続確立エラー」が消えない



## 対象読者

#### よくネットで見かける原因

* wp-config.phpの設定が間違っている
* パーミションに問題がある
* MySQLも起動していない
* データベースが壊れている

どれも当てはまらないのに「データベース接続確立エラー」が出る。
という人が対象です。

## 環境(私の)

* centos 6.5(64bi)
* PHP 5.6.10
* MySQl 5.7.15

## 状況

* 「データベース接続確立エラー」が出て先に進めない

## 調査1. なぜ接続出来ないのかを調査

* wp-config.phpに、`define('WP_DEBUG', true);` の1行を追加します。
	* これでエラーが起きたときの原因を表示出来ます

```
PHP Warning:  mysql_connect(): No such file or directory in /home/deploy/web/releases/20160916035114/public_html/wp-includes/wp-db.php on line 1549
```

こんなのが出てました。
よくよく調べてみると、mysql.sockを探すことができず、PHPからMySQLへの失敗しているみたいです。
(私の場合は、コンソールからMySQLへの接続が出来たので不思議に思ってましたが納得です。多分普通にPDOとか使った接続も出来ないと思います)

## 調査2. mysql.sockはどこにあるのか

`/etc/my.cnf`に書いてあります。

```
# cat /etc/my.cnf | grep mysql.sock
socket=/var/lib/mysql/mysql.sock
```


## 調査3. pdoのデフォルトのMySQLのソケット参照の場所確認

```
$ php -i | grep mysql.sock
pdo_mysql.default_socket => /tmp/mysql.sock => /tmp/mysql.sock
```

これです。実際に`mysql.sock`は、`/var/lib/mysql/mysql.sock`にありますが、
PHP側の設定では、`/tmp/mysql.sock`を参照する用になってます。

これを合わせる必要があります。

## 対応

対処するには、2種類あります。

* MySQLのmysql.sockの場所を`/tmp/mysql.sock`に変える
* `/tmp/mysql.sock`に、`/var/lib/mysql/mysql.sock`のシンボリックリンクを貼る

後者の方が楽なのでやってみましょう。

```
# ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock
# ll /tmp/mysql.sock
lrwxrwxrwx 1 root root 25  9月 18 23:27 2016 /tmp/mysql.sock -> /var/lib/mysql/mysql.sock
```

これで、再度WordpressのインストールすればOK

## 原因

PHPをyumでインストールして、RPMでMySQLをインストールした場合などに起こるようです。
私はまさにそのパターンでハマりました。
【PHP初学者の覚書】変数のスコープ

関数内で定義した変数がどんな感じか確認した覚書です。

とりあえず、関数を作って`var_dump`で出力してみる。

```php:PHP（NG）
<?php

function array_add($var) {
    $hoge[] = $var;
}

array_add('one');

var_dump($hoge);
```

これでOKかと思いますが、`Notice: Undefined variable: hoge ...`というエラーが表示されます。

`Notice（ノーティス）` は注意、`Undefined（アンディファインド）`は未定義、`variable（ヴェアリアブル）`は変数という意味なので、`hogeという変数が未定義だよ`と注意されています。

関数内に`$hoge`と記述していますが、これはローカル変数のため、有効範囲は関数内になります。

変数の前に `global`と記述するとグローバル変数になります。

先ほどの記述に `global` を追加します。

```php:PHP（NG）
<?php

function array_add($var) {
    global $hoge[] = $var;
}

array_add('one');

var_dump($hoge);
```

これでOKかと思いますが、今度は `Parse error: syntax error, unexpected ...`というエラーが表示されます。

`Parse（パース）`は構文解析、`syntax（シンタックス）`は文法という意味なので、`書き方に誤りがあるから意味わからない`と言われています。

`global`は、変数を使う前に`グローバルだよー`と教えてあげる必要があります。

先ほどの記述を修正すると下記になります。

```php:PHP
<?php

function array_add($var) {
	global $hoge;
    $hoge[] = $var;
}

array_add('one');

var_dump($hoge);
```

最初に `global $hoge` と教えてあげれば、グローバル変数だと理解するので、同じ関数内なら、そのあと使うときに`global`を付ける必要はありません。

これでエラーなく配列に追加されます。

```txt:表示結果
array(1) {
  [0]=>
  string(3) "one"
}
```

通常、関数内に記述した変数はローカル変数ですが、`global`を付けることで、グローバル変数になりました。

通常、関数の外に記述した変数は、グローバル変数です。

`array_add`関数を使って追加したあとに、`$hoge[] = 'two';` と記述すれば、同じグローバル変数なので、追加されるはずです。

試してみます。

```php:PHP
<?php

function array_add($var) {
	global $hoge;
    $hoge[] = $var;
}

array_add('one');

$hoge[] = 'two';

var_dump($hoge);
```

予想通り、追加されました。

```txt:表示結果
array(2) {
  [0]=>
  string(3) "one"
  [1]=>
  string(3) "two"
}
```

今度は、`array_add`関数を記述する前に `$hoge[] = 'zero';` を記述してみます。

```php:PHP
<?php

$hoge[] = 'zero';

function array_add($var) {
	global $hoge;
    $hoge[] = $var;
}

array_add('one');

$hoge[] = 'two';

var_dump($hoge);

```

関数の外にある`$hoge`も関数の中にある`$hoge`も同じグローバル変数の`$hoge`を指しているので、`array_add`関数の前に記述した`$hoge[] = 'zero';`も追加されて表示されます。

```txt:表示結果
array(3) {
  [0]=>
  string(4) "zero"
  [1]=>
  string(3) "one"
  [2]=>
  string(3) "two"
}
```

#まとめ

+ 普通に書いた変数は、グローバル変数だが、関数内に記述した変数はローカル変数（同じ変数名にしても別々の変数）
+ グローバル変数にするには、変数名の前に `global` を記述する
+ 事前に`グローバルだよ`と教える必要があるので、`global $hoge;`のように変数を使う前に記述する

#おまけ

`$GLOBALS`にグローバルスコープで使用可能なすべての変数が格納されています。
記述したグローバル変数が格納されているか確認しましょう。

```php:PHP
<?php

$alpha = 1;
$beta = 2;
$gammma = 3;

var_dump($GLOBALS);
```

表示結果を見るとわかりますが、最後の方に追加した`$alpha`、`$beta`、`$gammma`が`$GLOBALS`に格納されています。
記述してない`_GET`や`_POST`などは、最初からPHPに定義されているグローバル変数です。

```txt:表示結果
array(8) {
  ["_GET"]=>
  array(0) {
  }
  ["_POST"]=>
  array(0) {
  }
  ["_COOKIE"]=>
  array(0) {
  }
  ["_FILES"]=>
  array(0) {
  }
  ["GLOBALS"]=>
  *RECURSION*
  ["alpha"]=>
  int(1)
  ["beta"]=>
  int(2)
  ["gammma"]=>
  int(3)
}
```
Spring Boot でパスワードをハッシュ化するときにはまったこと

## はじめに

iPhoneアプリのサーバサイドを Springboot でつくっていて、
ユーザー登録機能部分のパスワードのハッシュ化処理を作っているときにはまったことを書きます。(まさかの結末です)

## やろうとしていたこと

1. build.gradleに追記する
2. ハッシュ化処理をするクラスを作る(ここではまる)

## 1. build.gradleに追記する

BCryptPasswordEncoderをつかってハッシュ化したかったので、
build.gradle 内の dependendices に以下を追記しました。

```
compile('org.springframework.security:spring-security-core:4.0.1.RELEASE')
```
![スクリーンショット 2016-09-18 23.08.28.png](https://qiita-image-store.s3.amazonaws.com/0/133676/39dd7bf1-31ab-5b69-e9c7-50180e1d7803.png)



とりあえずここまでは完了。

## 2. ハッシュ化処理をするクラスを作る

BcryptPasswordEncoderのインスタンスを作って、
encodeメソッドを使いたかったので、以下のようにクラス内に追記しました。

```
PasswordEncoder passwordEncoder = new BCryptPasswordEncoder();

public String passwordencode(String password){
		return passwordEncoder.encode(password);	
```

しかしエラーが「PassowordEncoderクラスがありません〜」と
出てしまってからは、なにがどうなってるのかさっぱりつかめませんでした。
(ここらへんが初心者あるある)

## 何をしたのか
結局 build.gradle に追記をしたら、
プロジェクトを右クリックして、Gradle → リフレッシュしないと、インポートされないっていうだけでした。

![スクリーンショット 2016-09-18 22.50.46.png](https://qiita-image-store.s3.amazonaws.com/0/133676/ab13e339-c769-b817-ac14-7b98790629b6.png)


## 最後に

まさかの結末でしたが、初心者の皆さんに参考になればと思います。
Rubyで2次元配列のソートいろいろ

## はじめに
Rubyの勉強してて、２次元配列のソートでつまずいたので、その時、調べた備忘録です。

## さっそく本題

#### 例）arr = [[1, 3], [1, 5], [1, 2], [2, 4], [2, 2]] をソートしたい

① arr[1]で昇順にソート

```ruby:sort()
p arr.sort {|a,b| a[1] <=> b[1]}
# 値が数値、文字に関わらず有効
```

```ruby:sort_by()
p arr.sort_by {|x| x[1]}
# 値が数値、文字に関わらず有効
```

② arr[1]で降順にソート

```ruby:sort()
p arr.sort {|a,b| a[1] <=> b[1]}.reverse
# 昇順.reverse
# 値が数値、文字に関わらず有効

または

p arr.sort {|a,b| b[1] <=> a[1]}
# b<=>a
# 値が数値、文字に関わらず有効
```

```ruby:sort_by()
p arr.sort_by {|x| x[1]}.reverse
# 昇順.reverse
# 値が数値、文字に関わらず有効

または

p arr.sort_by {|x| -x[1]}
# -x
# 値が数値のみ有効
```

③ arr[0]で昇順 -> arr[1]で昇順にソート

```ruby:sort()
p arr.sort {|a, b| (a[0] <=> b[0]).nonzero? || (a[1] <=> b[1])}
# (第1キー).nonzero? || (第2キー)
# 値が数値、文字に関わらず有効
```

```ruby:sort_by()
p arr.sort_by {|x| [x[0], x[1]]}
# [第1キー, 第2キー]
# 値が数値、文字に関わらず有効
```

④ arr[0]で昇順 -> arr[1]で降順にソート

```ruby:sort()
p arr.sort {|a, b| (a[0] <=> b[0]).nonzero? || (b[1] <=> a[1])}
# 値が数値、文字に関わらず有効
```

```ruby:sort_by()
p arr.sort_by {|x| [x[0], -x[1]]}
# 値が数値のみ有効
```

## 最後に
④のケースで文字配列に対して、sort_byを使用した方法が、どうしてもわかりませんでした。
そもそも出来るのかもわかりませんが、もしわかる方がいましたら、教えていただけると助かります。


## 追記
④のケースで、１つ考えてみました。
~~たぶん、期待通り動作すると思います。~~
<font color="red">注）この実装では、ソートが安定しません。</font>

```ruby:sort_by()
p arr.sort_by {|x| x[1]}.reverse.sort_by {|x| x[0]}
# sort_by(第２キー).reverse.sort_by(第1キー)
# 値が数値、文字に関わらず有効
```

一応、ベンチマークを取ってみたところ、sort()を使用したケースより、速かったです。

## 追記２
「追記」の実装、@HMMNRST さんよりご指摘をいただきました。
こちらの実装なら大丈夫そうです。

```ruby:sort_by()
i = 0
p arr.sort_by {|x| [x[1], i += 1]}.reverse.sort_by {|x| [x[0], i += 1]}
# sort_by(第２キー).reverse.sort_by(第1キー)
# 値が数値、文字に関わらず有効
```
TinyDNGLoader で iPhone RAW DNG ファイルを読み込む

漢だったら iPhone RAW DNG ファイル読みたいですね!

やりましょう!

できました.

https://github.com/syoyo/tinydngloader

## 注意点

iPhone(iOS)の DNG を読むのには, 以下に注意でした.

* 12bit の Lossless JPEG(LJPEG)
* 画像データは 8x8 の tiled な LJPEG にわかれていた
* LJPEG の components は 2. これは TinyDNGLoader で使っている lj92 ライブラリではサポートしていなかったので, いくらか修正が必要だった.

## まとめ

時代は RAW ですね!

## TODO

* LJPEG のデコードを早くする
* huffman table を component ごとに読む
* TinyDNGLoader を用いることで, **優秀な若人が自ら切磋琢磨し RAW DNG 現像を極めるスキームを確立したい**
【Twitter4J】Twitterの全ユーザーの公開ツイートを表示する方法

Twitter4Jを用いて、Twitterの全ユーザーの公開ツイートを取得する方法です。

**Streaming APIのsample**を使います。

# Twitter Streaming APIとは
Twitter Streaming APIとは、データ解析などで大量のデータを必要とする開発者のために用意されたAPIで、一度接続するとHTTP接続を保ったまま自動的にデータを流し続けてくれます。
Streaming APIには次の種類があります。

> １．Streamed Tweets…パブリックなツイートを取得
> 　・sample…パブリックなツイートから約1％のツイート
> 　・firehose…すべてのパブリックなツイート
> 　・filter…指定した条件にマッチするツイート
> 　・links…リンクを含むツイート
> 　・retweet…リツイート
> 
> ２．ユーザーストリーム…ユーザーのタイムライン、@関連、DMなどを取得
> 
> ３．サイトストリーム…多数のユーザーのタイムライン、@関連、DMなどを受信
> 　　　　　　　　　　　多数のユーザー向けのWebサービス用


単にTwitterの全ユーザーの公開ツイートがほしい場合はsample、firehoseとなります。
ただ、firehoseはグーグルなどの一部の大企業が大金を払って手に入れることができるだけなので個人で行う場合はsampleを使うことになります。
全体の約1％のツイートになりますが、常時データを取得できるので少ないと考えるか十分と考えるかは時と場合によりますね。

# コード例
ではコードです。

```java
import twitter4j.*;


public class TwitterSampleStream {

    public static void main(String[] args){

        try{

            //自動的に認証してくれる
            //（バージョン2.2.4以降はgetInstance()ではなくgetSingleton()を推奨）
            new TwitterStreamFactory();
            TwitterStream twitterstream = TwitterStreamFactory.getSingleton();

            twitterstream.addListener(new MyStatusAdapter());
            twitterstream.sample();

        } catch(Exception e){
            e.printStackTrace();
        }
    }
}

//コンソールに出力する
class MyStatusAdapter extends StatusAdapter {

    public void onStatus(Status status){

        //ユーザの情報を取得
        User user = status.getUser();

        //ツイートから改行記号を除去（半角スペースに変換）
        String strText = status.getText();
        strText = strText.replaceAll("\r\n"," ");
        strText = strText.replaceAll("\r"," ");
        strText = strText.replaceAll("\n"," ");

        //ツイートからタブ記号を除去（半角スペースに変換）
        strText = strText.replaceAll("\t"," ");

        //コンソールに出力する（タイムゾーン、位置情報、日時、ユーザ名、ツイート）
        System.out.println(user.getTimeZone() + "\t" + status.getGeoLocation() + "\t" + status.getCreatedAt() + "\t" + user.getScreenName() + "\t" + strText);
    }
}
```

# 応用
てぃーはこの方法を応用して、ツイッターの曜日別ツイートやよく使われるアプリなどを分析しています。分析結果はネットで評判になったり、学術研究に利用されています！
　→<a href="http://teapipin.blog10.fc2.com/blog-entry-298.html">【分析】ツイッター分析のシリーズの目次　by Twitter4J - creativi.tea</a>
Ruby 2.4でIntegerに一本化される整数

Ruby 2.4から、整数のクラスが付け変わることになりますが、特にCエクステンションを書いている場合は注意の必要があります。

# Ruby 2.3までの世界
Rubyの世界にももちろん整数がありますが、（Ruby側から見て）今までは抽象クラスの`Integer`の下に、絶対値の小さな整数については`Fixnum`、それに収まらないものについては`Bignum`という具象クラスがある、というように分かれていました。このあたりについては、[以前書いた記事](http://qiita.com/jkr_2255/items/476a4a82a0a2699ad777)が参考になるかと思います。

## 問題点
このような形にしていることで、いくつか問題がありました。

* `Fixnum`と`Bignum`は実装の詳細の違いで、Ruby側から違いが見える必然性はない
 * 同じ整数なのに`Fixnum`と`Bignum`で挙動を違える、なんてことはむしろ**やるべきでない**
* 環境によって`Fixnum`のサイズが違う（可搬性に乏しい）
* RubyのISO規格上も、`Integer`以下は実装依存となっている

# Ruby 2.4での変更点
そんなこともあって、Ruby 2.4からは両者が`Integer`へ統合されることになりました。

## Ruby側から見て
ふつうにプログラムを書いている中では、そもそも`Fixnum`や`Bignum`を直接使う場面自体が少なかったでしょうし、そこまで大問題とはならないと思いますが、いくつか注意すべき点はあります。

既存のプログラムとの互換上、`Fixnum`と`Bignum`という定数は存在し続けますが、どちらも**`Integer`のエイリアス**となります。それぞれをオープンクラスなどしていた場合も、直接`Integer`を変更するような形となります（きちんと対応する形に修正した方がいいでしょう）。

そして、`foo.is_a?(Fixnum)`のように`Fixnum`に収まるかチェックしていた場合、Ruby 2.4では`foo.is_a?(Integer)`とみなされて、整数であれば常にtrueとなります。（Cエクステンションが絡むような状況なら別として）`Fixnum`かどうかをチェックするという意図自体が根本的に問題なので、きちんと範囲チェックするように修正しましょう。

あと、これは実際に影響する場面もあるかもしれませんが、`Fixnum`や`Bignum`という定数そのものをDSLの一部に使っていた場合、`Integer`と同じ値になってしまうのでうまく動かなくなります。使っているgemの説明に従って、適切に置き換えましょう。

## C言語側から見て
Ruby上では`Fixnum`と`Bignum`の区別は廃止されましたが、C言語の世界では2種類の内部構造がそのまま存続する形となっています。ということで、「整数を扱う部分をすべて書き換える必要がある」なんてことにはなりません。

ただし、C言語上では`Fixnum`と`Bignum`を表す`rb_cFixnum`と`rb_cBignum`が**廃止されています**。これらの定数を使っていた場合、コンパイルエラーとなります。代替策としては、

* 型チェックに使っていた場合→`FIXNUM_P`[^1]や`RB_TYPE_P`などで置き換えましょう。内部データ構造を示すための`T_BIGNUM`は健在です。
* メソッド定義などをしていた場合→`Integer`（`rb_cInteger`）にセットする形に切り替えましょう。`Fixnum`用と`Bignum`用の関数が別にある場合、内部で振り分けする必要が出てきます。

また、これらの振り分けを支援するための定数として、`RUBY_INTEGER_UNIFICATION`が定義されています。`#ifdef RUBY_INTEGER_UNIFICATION`で切り分けましょう。

## 自作gemのチェック
以前に作っていた[jkr2255/bit_utils](https://github.com/jkr2255/bit_utils)（[解説](http://qiita.com/jkr_2255/items/d0cd5478d64da2f1b450)）について、コードをチェックしてみましたが、内部的には`Fixnum`用と`Bignum`用のメソッドがあって、

* `Fixnum`用…`Bignum`を投げるとエラーになる
* `Bignum`用…`Fixnum`でも動くけど、少し余分な処理が入る

というようになっていました。そして、`Fixnum`をオープンして使うとき以外は`Bignum`用をそのまま使うようになっていて、オープンクラス時も`Fixnum`→`Bignum`の順で行っていたので、そのままですべてがうまくいくような流れになっていました。Ruby 2.4.0-preview2でも正常に動作しました。

とはいえ、`Fixnum`と`Bignum`を両方オープンしているのも行儀が悪いので、書き換えを行う予定です。

# 参考資料
[RubyKaigiで発表されたスライドのPDF](http://www.a-k-r.org/pub/2016-09-08-rubykaigi-unified-integer.pdf)

[^1]: 1ビットを見るだけなので、きわめて高速です。
nginxインストール（ソースからビルド編）for RockyLinux9.5

## 概要 
Apacheと共に最近人気なnginxをソースからビルドして導入したいと思います。
2025年4月現在では、「1.27.4」が最新版

## ダウンロード先
ダウンロード先は
http://nginx.org/download/
で確認が可能

##注意事項
OpenSSLは、あらかじめコンパイルをしておきます。
また、includeの関係でソースが必要ですので、opensslのsrcディレクトリを指定します。
今回は「/usr/local/src/」に「openssl-1.1.1l.tar.gz」を回答したものを配置し、そのディレクトリを「--with-openssl」で指定します。
OpenSSLに関しては、「[Rocky Linux 9.4にOpenSSL 3.4をインストールする（ソースからビルド）](https://qiita.com/shadowhat/items/557aff78ef0eddcbd257)」を参照してください。

## 検証環境バージョン
| ソフトウェア | バージョン |
|:-:|:-:|
|  PCRE　| 8.45  |
| nginx | 1.21.3 |
|  OS | RockyLinux 8.4  |


## 事前準備（必要なライブラリを入れる）
```
dnf install zlib-devel
```

## PCRE2のインストール
まずは、PCREをインストール

```
cd /usr/local/src
wget https://github.com/PCRE2Project/pcre2/releases/download/pcre2-10.45/pcre2-10.45.tar.gz
tar xvzf pcre2-10.45.tar.gz
cd pcre2-10.45
./configure
make -j 8
make install
```


## nginxのインストール
```bash:nginxダウンロードとインストール
cd /usr/local/src
wget https://nginx.org/download/nginx-1.27.4.tar.gz
tar xvzf nginx-1.27.4.tar.gz
cd nginx-1.27.4
./configure --prefix=/etc/nginx \
--sbin-path=/usr/sbin/nginx \
--with-pcre-jit \
--with-http_addition_module \
--with-http_dav_module \
--with-http_gzip_static_module \
--with-http_realip_module \
--with-http_stub_status_module \
--with-http_ssl_module \
--with-http_sub_module \
--with-mail \
--with-mail_ssl_module \
--with-openssl=/usr/local/src/openssl-3.4.1
make
make install

#非推奨オプション
#--with-http_xslt_module \
#--with-ipv6 \
#--with-sha1=/usr/local \
#--with-md5=/usr/local \
```

/usr/sbin/nginx が存在すればコンパイル完了です。


## 起動スクリプトの配置
起動スクリプトは、CentOSのRPMから拝借しましょう。

```bash:nginx起動スクリプト配置先
/usr/lib/systemd/system/nginx.service
```

```bash:nginx起動スクリプト
cat > /usr/lib/systemd/system/nginx.service << EOF
[Unit]
Description=nginx - high performance web server
Documentation=http://nginx.org/en/docs/
After=network.target remote-fs.target nss-lookup.target
 
[Service]
Type=forking
PIDFile=/etc/nginx/logs/nginx.pid
ExecStartPre=/usr/sbin/nginx -t -c /etc/nginx/conf/nginx.conf
ExecStart=/usr/sbin/nginx -c /etc/nginx/conf/nginx.conf
ExecReload=/bin/kill -s HUP \$MAINPID
ExecStop=/bin/kill -s QUIT \$MAINPID
PrivateTmp=true
 
[Install]
WantedBy=multi-user.target

EOF
```



##起動スクリプトの設定

あとは、このスクリプトで起動と停止を確認

```bash:nginx起動
systemctl start nginx
```

```bash:nginx停止
systemctl stop nginx
```

```bash:nginx自動起動
systemctl enable nginx
```
ESXi Embedded Host Clientのインストール (ESXi 5.5)

#1
https://labs.vmware.com/flings/esxi-embedded-host-client
から
最新の
2016/9/18時点ではesxui-signed-4393350.vib
をダウンロード

#2
ホストの /tmp に配置

```
scp esxui-signed-4393350.vib root@xx.xx.xx.xx:/tmp/
Password: 
esxui-signed-4393350.vib                      100% 3362KB   1.6MB/s   00:02
```

#3
sshログイン後、以下のコマンドを打つ

```
esxcli software vib install -v /tmp/esxui-signed-4393350.vib
```

#4
ホストのIPアドレスにブラウザでアクセスしてみると・・・

無事表示されましたー
![qiita1.png](https://qiita-image-store.s3.amazonaws.com/0/101361/5e979465-9452-0fb5-ee7e-09a386391949.png)
JSONの読み込み方

# JSONの読み込み方

まずは普通にファイルを読み込む

```python
with open('test.json', 'r') as f:
	js=f.read()
```


jsonとしてloadするように指示すると

```python
import json
nb=json.loads(js)
```

ディクショナリ形式として扱いやすい！
外部パラメータ格納に使えるね

```python
print(nb)
#[Out]#{'color_scheme': 'Packages/User/Tubnil_kai (SL) (SublimePythonIDE).tmTheme', 'enable_tab_scrolling': True, 'detect_slow_plugins': False, 'always_show_minimap_viewport': True, 'draw_white_space': 'all', 'draw_minimap_border': True, 'file_exclude_patterns': ['*.exe', '*.zip', '*.lnk', '*.db', '*.pptm', '*.docx', '*.pdf', '*.dwt', '*.bak', '*.xlsx', '*.ex4', '*.ex4old']}

print(nb['color_scheme'])
#[Out]#Packages/User/Tubnil_kai (SL) (SublimePythonIDE).tmTheme

print("*.exe" in nb['file_exclude_patterns'])
#[Out]#True
```



`json.loads()`じゃなくて`json.load()`ならばファイルから直接読めるみたい
短くできる！

```python
import json
with open('test.json', 'r') as f:
    nb=json.load(f)
print(nb)
```