OmniAICreator/Qiita-1.07M huggingface dataset:
FileMakerServerのAdminConsoleでfailed_to_load_the_bootstrap_javascriptエラー

#### 前書き
[FileMaker Advent Calendar 2017](https://qiita.com/advent-calendar/2017/filemaker) が空いていましたので滑り込んでみます。


# FileMakerServer の AdminConsole がエラーで起動できない！
## 症状
* エラー発生は突然に
* *Failed to load the bootstrap javascript: ./../VAADIN/vaadinBootstrap.js* とか表示されて怒られる

![image.png](https://qiita-image-store.s3.amazonaws.com/0/37739/907c0150-a6a8-d6d2-1f83-6e015d4b0546.png)

* あるいは以下のような500エラー（画像は、無駄にIEでも試してみた結果）

![image.png](https://qiita-image-store.s3.amazonaws.com/0/37739/b6a64cdd-0fe2-5811-ee0e-ea6498947989.png)


## 解決策
* *JAVA(TM) Platform SE binary* プロセスの強制終了
* 以下のやつめを強制終了してあげれば、起動するようになります。JAVAプロセスは、次のAdminConsole起動指令時に、裏で勝手に立ち上がります

![image.png](https://qiita-image-store.s3.amazonaws.com/0/37739/12a9621d-a8ce-ea61-ae58-7636aaf16af9.png)


## 補足
* FileMaker使い始めて9年になろうとしていますが、こんなエラーは初めてでした。
* google先生からは「サーバOS再起動すればなおりますよ」とかいう回答が返ってきますが、そんなこたぁわかってるんだよOSごと再起動せずに復旧したいんだよ、ってことで……
vim勉強メモ

[新米のvimtutor勉強メモ](https://qiita.com/qiuyin/items/8a2b148c97362422b7bb)を続き、勉強した内容をメモします。

- 行頭にindentationを追加
    - `>>`:　現在の行
    - `>33gg`:　現在の行から33行まで
    - visual modeで`>`:　選択した行

- 同じ行内である文字に飛ぶ：`f文字`
- 最後の変更を繰り返す: `.`
- 最後のf, t, F or Tを繰り返す：`;`
初心者向け：Railsアプリ開発時にデータ（サンプルデータ）を登録する方法

##0.概略
1.テーブルを作る
2.登録用のデータを作る
3.登録処理をしてくれるファイルを作る＆登録するデータを適切な場所に置く
4.データの登録
5.登録されたデータの確認

##1.テーブルを作る
ここは詳細は省略。[Railsチュートリアルの6.2](https://railstutorial.jp/chapters/modeling_users?version=4.2#code-users_migration)などが参考になる。概略のみ書いておくと、３ステップ必要です。
- migration fileを作る
- migration fileを修正して、カラムを作る
- migrateする

ちなみにテーブル数が多いと地味に大変なのですが、ここら辺はプロの方はどのようにされているのかしら。

##2.登録用のデータを作る
csvファイルで作ります。

```ruby:sample.csv
column1,column2
1,2
1,3
1,4
```
なお、Date型のカラムの場合、CSVをどう作るのか？という疑問があるかと思います。
「2015,1,1」と入れると、カラムがずれてしまうと思いますよね。

日付の場合は'2015-1-1'のように入れて下さい。
(全体をクオーテーションで囲う&年月日の間はハイフンでつなぐ）



##3.登録処理をしてくれるファイルを作る＆登録するデータを適切な場所に置く
###3.1 登録処理をしてくれるファイルの考え方
（これはイメージです。間違ってたら、詳しい方がきっと指摘してくれます）

- csvファイルを読み込む
- この時点で、ダミーデータが配列として読み込まれます

```ruby:sample.csv
[行1,行2,行3,・・・]
```
さらに細かくいうと、行の中にはカラムが入っているので、こういう状態のはずです。

```ruby:sample.csvが取り込まれて排列に変換された状態
[
  [要素1つ目のcolumn1の値, 要素1つ目のcolumn2の値],
  [要素2つ目のcolumn1の値, 要素2つ目のcolumn2の値],
  [要素3つ目のcolumn1の値, 要素3つ目のcolumn2の値],
　　　　・・・
]
```

こんな感じで、各行に入っていた値が配列になっています（この辺のゆるい説明は詳しい方が補足しておくれ）。
なので、一つずつ各行に相当する要素をとりだして、以下の処理をやれば、登録できそうですね。
###3.1.1 行の中の値を取り出す。

```
name = csv['name'] 
```
###3.1.2 そして、新しくオブジェクトを作って、とりだした値を代入して、createする

```
備考ですが　： create = new + save
```
以上のことを、データ登録処理ファイルとしてまとめるとこのようになります。

```ruby:seed.rb
require 'csv'

# Userのへ初期データ読み込み
csv_data = csv.read('public/Sample.csv', headers: true)
csv_data.each do |d|
  name = d['name']　
  age  = d['age'].to_i
  user = User.create(name: name, age: age,)
end
```
なお、日付の場合、値を取り出す部分はこういう処理にして下さい

```
str = d['birthday'] #まずは文字列として抽出
birthday = Date.parse(str)　#文字列を日付に変換
```


###3.2 データのファイルを適切な場所に置く
データ登録処理をしてくれるファイルで指定したパスに、ファイルを置く
- csv.readで指定したパスの所にファイルを置きます
- ファイルを置ける場所は、publicまたはdbフォルダの模様

##4.データの登録
```
rake db:seed
```
##5.登録されたデータの確認
こちらの[ためになるサイト](http://mysqlweb.net/article/59210911.html)を見てやってみましょう!
MySQLのTips集


# MySQLのデータをExportする
データをExportするためのツール「mysqldump」

## ダンプする
```bash
mysqldump -u username -p database_name > file_name.sql
```

## 指定したテーブルだけダンプする
```bash
mysqldump -u username -p database_name -t table_name > file_name.sql
```

## 指定したテーブルを除外してダンプする
```bash
mysqldump -u username -p database_name  --ignore-table=database_name.table_name > file_name.sql
```

# ユーザを作り権限を付与する

## ユーザの一覧を表示する
```bash
select Host, User, Password from mysql.user;
```

## ユーザを作成する
```bash
CREATE USER '{ユーザID}'@'%' IDENTIFIED BY '{パスワード}';
```

## ユーザに付与されている権限を表示する

```bash
SHOW GRANTS FOR '{ユーザID}';
```


# MySQLの情報を参照する
## スキーマを切り替える

```bash
use <スキーマ名>
```

## テーブル一覧を表示する

```bash
show tables;
```

## テーブル定義を表示する

```bash
desc <テーブル名>;
```

## テーブルのIndexを表示する
```bash
show index from  <テーブル名>;
```
gulp.spritesmithのメモ



https://github.com/twolfson/gulp.spritesmith

`npm i -D gulp.spritesmith`


cssはscss形式でmixinフォルダへ、
imgはpublic以下のimgフォルダへ


```js:gulpfile.babel.js
import spritesmith from 'gulp.spritesmith';

gulp.task('sprite', () => {
    const spriteData = gulp.src(`${SRC}/img/sprite/**/*.png`)
        .pipe(spritesmith({
            imgName: 'sprite.png',
            cssName: '_sprite.scss',
            imgPath: '../img/sprite/sprite.png',
            cssFormat: 'scss',
            cssVarMap: (sprite) => {
                sprite.name = 'sprite-' + sprite.name;
            }
        }));
    spriteData.img.pipe(gulp.dest(`${DEST}/img/sprite`));
    spriteData.css.pipe(gulp.dest(`${SRC}/scss/mixin`));
})
```



スケールできるように`_sprite.scss`の一部のmixinを以下に差し替える

```scss:_sprite.scss
@mixin sprite-width($sprite, $scale) {
  width: ceil( nth($sprite, 5) * $scale ) + 1;
}

@mixin sprite-height($sprite, $scale) {
  height: ceil( nth($sprite, 6) * $scale ) + 1;
}

@mixin sprite-position($sprite, $scale) {
  $sprite-offset-x: nth($sprite, 3) * $scale + 1;
  $sprite-offset-y: nth($sprite, 4) * $scale + 1;
  background-position: $sprite-offset-x $sprite-offset-y;  
}

@mixin sprite-image($sprite, $scale) {
  $sprite-image: nth($sprite, 9);
  background-image: url(#{$sprite-image});
  background-size: (nth($sprite, 7) * $scale) (nth($sprite, 8) * $scale);
}

@mixin sprite($sprite, $scale:1) {
  @include sprite-image($sprite, $scale);
  @include sprite-position($sprite, $scale);
  @include sprite-width($sprite, $scale);
  @include sprite-height($sprite, $scale);
  @include hide-txt();
}
```

```scss:_hide-txt.scss
@mixin hide-txt() {
    text-indent: -9999px;
    white-space: nowrap;
    overflow: hidden;
}
```

> 参考
[gulp.spritesmithでCSS spriteをやってみた。【gulp】](http://blog.e-riverstyle.com/2014/02/gulpspritesmithcss-spritegulp.html)
[Compassのsprite-mapによるスプライト画像生成を、spritesmithに移行する](http://tech.synchro-food.co.jp/entry/2017/03/23/143954)
WPFでRadioButtonをBindingして使いたい！

何かとめんどくさいWPFでRadioButtonを使うとき。Bindingするとなると何かとつらい。
いちいち使うときに自分のコードを見直して作っているので、すぐ見れるようにメモとして残しておきます。
今回はサンプルとして、簡易モードと詳細モードを分けるようなRadioButtonを作ります。

# 手順
1. まずEnumを作ります。選択肢が分かりやすいようにします。

``` Enum.cs
public enum mode
{
    Simple,
    Detail
}
```

2. ModelとViewModelに値を保持する為のプロパティを作成します。PropertyChangedを実装するなどは、MVVMで開発してきた方ならばおなじみだと思うのでここでは省略します。

3. RadioButtonの値を取る為に必要なConverterを作成します。コードは以下のような感じになります。

``` BoolToEnumConverter.cs
public class BoolToEnumConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {

            var ParameterString = parameter as string;
            if (ParameterString == null)
            {
                return System.Windows.DependencyProperty.UnsetValue;
            }

            if (Enum.IsDefined(value.GetType(), value) == false)
            {
                return System.Windows.DependencyProperty.UnsetValue;
            }

            object paramvalue = Enum.Parse(value.GetType(), ParameterString);

            return (int)paramvalue == (int)value;
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            var ParameterString = parameter as string;
            return ParameterString == null ? System.Windows.DependencyProperty.UnsetValue : Enum.Parse(targetType, ParameterString);
        }
    }
```

Bool値とEnumを変換するコンバーターです。
つまり、RadioButtonのTrueが入っていたところを探し、それをEnumに変換することで、
どのRadioButtonにチェックが入っているのかを判定します。

3. ViewにRadioButtonを作ります。

``` View.xaml
<!--Resources内にコンバーターの使用を宣言する。-->
<converter:BoolToEnumConverter x:Key="Enum" />

<!--RadioButtonを設置。GroupNameはすべて別にする。バインド先はグループ単位で同じにする。-->
<RadioButton Margin="0,5,0,0" GroupName="RubySimple" Content="簡易"
IsChecked="{Binding RadioButtonValue, Converter={StaticResource Enum}, Mode=TwoWay, ConverterParameter=Simple}" />

<RadioButton Margin="0,0,0,0"　GroupName="RubyDetail"　Content="詳細"
IsChecked="{Binding RadioButtonValue, Converter={StaticResource Enum}, Mode=TwoWay, ConverterParameter=Detail}" />
```

これでOKです。バインドしたプロパティの中にどのEnumが入っているかを判定することで、どのRadioButtonにチェックが入っているかを調べることができます。
Tutorial: CI of .NET Framework apps in Linux Containers

This blog was motivated by a great question on our support forum: "Can I use Shippable with a C# project?". My knee-jerk reaction was to tell him to wait for our imminent support for Windows containers. However, in my previous startup, we had built a cross-platform Xamarin.Forms based mobile app in C# and sheer curiosity provoked me to look at the latest state of Mono.

Mono is an open source implementation of Microsoft's .NET Framework. I was thrilled to discover that Ubuntu was in the list of supported Linux distributions. I immediately posted a response on the support issue asking the customer to use a custom image based off Ubuntu with the Mono runtime in it. That's when a kind customer, Kyle Dodson, Co-Founder, CTO at @ZapicInc posted an even better response that he had this scenario working on Shippable and he laid out his approach succintly. You can find his excellent response here. That eventually led to a discussion between Kyle and me about partnering for a blog with the intention of helping other customers jumpstart their C# CI efforts and the rest is history. I would like to thank Kyle for contributing to the sample and his deep technical know-how.

This blog is first in a series of articles and is basically a tutorial on how to do CI of a C# application using Shippable powered by Linux containers. In the next post, we will cover CI/CD of an ASP.NET application running in a Linux container on a K8s cluster on AKS.  

Read the full blog, [Tutorial: CI of .NET Framework apps in Linux Containers](http://blog.shippable.com/tutorial-ci-of-c-apps-in-linux-containers)
Dockerコマンド書き溜め

docker for mac のコマンド一覧
###バージョン確認

```
docker --version

docker-compose --version

docker-machine --version
```

###コンテナ確認

```
docker ps　　　　　　　　　　　#起動中のみ
docker ps -a　　　　　　　#停止含む
```

###実行中のコンテナ削除
```
docker rm -f webserver
```
※イメージは削除されない

###イメージ一覧
```
docker images
```
###イメージの削除
```
docker rmi 'イメージID or イメージ名'
```
###webサーバーの起動（nginx）

```
docker run -d -p 80:80 --name webserver nginx
```

###webサーバーの停止

```
docker stop webserver
```

IPアドレス確認

```
docker inspect -f "{{.NetworkSettings.IPAddress}}" (CONTAINER_NAME or ID)
```
php-vcrの紹介

## はじめに
こんにちわ。 OPENLOGI AdventCalendar 19日目です。

普段はエンジニアとして開発をしています。
転職前はrubyを書いてましたがオープンロジに転職しphpの開発になりました。
自分がphpを触っていたのはphp4から5に移行するごろだったので久しぶりに戻ってきた感じです。マンモス本だのphpとググるとphp新書が出てきていた時代から比べると進化しているなぁという感じがしました。

OPENLOGIではphpunitでテストを書いています。
Rubyでテスト時にvcrを使用していたので、PHPにもあるのか気になり確認したところあったのでご紹介します。

php-vcr:
 https://github.com/php-vcr/php-vcr
vcr:
 https://github.com/vcr/vcr

## 何をするものなのか

HTTP結果を記録しておいて再度使い回すものです。
一度リクエストを行うと結果をyamlに保存して再度のリクエストには
生成したyaml内容から読み込みます。

## どういうときに使用するのか
主に以下の用途で使用しました。

  * API呼び出しを行うテストをCIで回したときにつどリクエストを飛ばさせたくないのでAPIテスト箇所に使用
  * 予期せぬリクエストに対する結果を保存し異常系の確認時に使用
  * バージョン管理されているAPIの期待する結果を保存しレスポンス形式の確認

## 使い方

githubのdocsに書いてある通りなのですが記載します。

### インストール

`$composer require --dev php-vcr/php-vcr`

参考情報: 
自身の環境だと
<font color="Salmon">*For soap support you need to install the soap extension*</font>
とエラーになったので
`$sudo apt-get install php-soap`
で入れたらエラーが出なくなりました。

### テスト実行

以下のような形でテストを行いました。

```php

use VCR\VCR;

class VCRTest extends TestCase
{
    public function testVCR()
    {
        // カセットの記録先を設定
        VCR::configure()->setCassettePath([対象パス]);

        // VCR起動
        VCR::turnOn();

        // カセットを入れる
        VCR::insertCassette('google');

        // リクエストする
        $result = file_get_contents('http://google.com');

        // カセットを取り出す
        VCR::eject();

        // VCRを停止
        VCR::turnOff();
    }
}

```

テストを実行すると対象パスにyamlができ、上記の２度目リクエストからは対象パスにできたyamlからデータを読み込みます。


作成されたgoogle.yml

```yml:google.yml
-
    request:
        method: GET
        url: 'http://google.com'
        headers:
            Host: google.com
    response:
        status:
            http_version: '1.1'
            code: '302'
            message: Found
        headers:
            Cache-Control: private
            Content-Type: 'text/html; charset=UTF-8'
            Referrer-Policy: no-referrer
            Location: 'http://www.google.co.jp/?gfe_rd=cr&dcr=0&ei=7484WtfHBMnEXrr-l5AM'
            Content-Length: '269'
            Date: 'Tue, 19 Dec 2017 04:05:03 GMT'
        body: "<HTML><HEAD><meta http-equiv=\"content-type\" content=\"text/html;charset=utf-8\">\n<TITLE>302 Moved</TITLE></HEAD><BODY>\n<H1>302 Moved</H1>\nThe document has moved\n<A HREF=\"http://www.google.co.jp/?gfe_rd=cr&amp;dcr=0&amp;ei=7484WtfHBMnEXrr-l5AM\">here</A>.\r\n</BODY></HTML>\r\n"
```

上記のサンプルではsetCassettePathでカセットのパス設定を行いましたが、
他にもconfigureの関数はいろいろあるので元ソース読んだ方がいいです。
https://github.com/php-vcr/php-vcr/blob/master/src/VCR/Configuration.php

他に下記のような機能もあるようです

 * blacklist, whitelistで読み込み先を制限
 * アノテーションでの読み込み(https://github.com/php-vcr/phpunit-testlistener-vcr)



## 終わりに

簡易なvcrの紹介になりましたが、こういうのもあるんだときっかけになれば幸いです。
pandoc で Redmine の textile と平和に戦う

Redmine の Textile 勢と平和に暮らすために、
Wiki用のリポジトリを建てて全て Markdown で記述したのち、
下記のコマンドを利用すれば良い。

```Makefile:Makefile
# markdown files
MARKDOWNS = $(wildcard *.md)
# converted textiles
TEXTILES = $(patsubst %.md,%.textile,$(MARKDOWNS))

all: $(TEXTILES)

README.textile: README.md
	@echo 'skipping README.textile conversion'

%.textile: %.md
	pandoc -s ./$< -o ./textile/$@
```

これで `make` コマンドを実行すれば自動的に `/textile` ディレクトリに変換済みのファイルが出力される。
ファイルの更新などを監視して自動実行するスクリプトと組み合わせるのも良いかもしれない。
VCCWでPHPのバージョンを7.2 / 7.3 / 7.4にする方法

ローカルのvccwでphp7.2で検証したかった。

現在のvccwではphpのバージョンは変更出来ないのでどうしたものかと思っていたらFacebookでvccw開発者の宮内さんがドンピシャの答えをくれましたので忘れないようにメモ。

<iframe src="https://www.facebook.com/plugins/post.php?href=https%3A%2F%2Fwww.facebook.com%2Fhidekazu.ishikawa%2Fposts%2F1634658973259040&width=500" width="500" height="231" style="border:none;overflow:hidden" scrolling="no" frameborder="0" allowTransparency="true"></iframe>

https://tecadmin.net/install-php-7-on-ubuntu/

PHP7.2にしたいVCCWを起動して

~~~
$ vagrant ssh
$ sudo apt-get install python-software-properties
$ sudo add-apt-repository ppa:ondrej/php
$ sudo apt-get update
$ sudo apt-get install -y php7.2
~~~

これだけ！

~~~
vagrant@vccw2:~$ php -v 
PHP 7.2.0-2+ubuntu16.04.1+deb.sury.org+2 (cli) (built: Dec  7 2017 20:14:31) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2017 Zend Technologies
    with Zend OPcache v7.2.0-2+ubuntu16.04.1+deb.sury.org+2, Copyright (c) 1999-2017, by Zend Technologies
~~~

7.2 になってる！

@miya0001 さん ありがとうございました！
ログインシェルの起動を高速化する lazyenv を作った

お前のシェル重すぎだろと言われながらも、モッサリとしたシェル環境を使い続けて来たのだが、先日重い腰を上げて高速化した。その時に作った [lazyenv][lazyenv] を紹介する。

## [lazyenv][lazyenv] とは

任意の処理を、任意のコマンドをトリガーにキックさせることが出来る、シンプルな機能を提供する bash スクリプトです。

## どこが高速化できるのか

[lazyenv][lazyenv] は、ログインシェル起動時に必須ではない処理を遅延させることで、ログインシェルの起動を高速化します。

私の環境では、ログインシェルの起動に要する時間の大半を *pyenv* が占めていました。

### pyenv init が重い

```zsh
% time (eval "$(pyenv init -)")
( eval "$(pyenv init -)"; )  1.15s user 0.67s system 80% cpu 2.262 total
```
### brew --prefix も地味に重い

```zsh
% time (brew --prefix pyenv)
/usr/local/opt/pyenv
( brew --prefix pyenv; )  0.50s user 0.22s system 81% cpu 0.876 total
```

pyenv は python を使う時まで必要ないので、python コマンドを叩くまで遅延させるようにすると、シェルの起動時間は次のように改善します。

```zsh:before
% time (zsh -i -c exit)
( zsh -i -c exit; )  1.19s user 0.79s system 57% cpu 3.413 total
```

```zsh:after
% time (zsh -i -c exit)
( zsh -i -c exit; )  0.11s user 0.08s system 74% cpu 0.246 total
```
3.413sec → 0.246sec

after の方は、早くなったからと言って、rbenv, jenv, nodenv などの開発環境を追加しています。

## 使ってみる

```bash:~/.zshrc
source /path/to/lazyenv.bash
_pyenv_init() {
    export PYENV_ROOT=`brew --prefix pyenv`
    eval "$(pyenv init -)"
}
eval "$(lazyenv.load _pyenv_init pyenv python pip)"
```

**lazyenv.load** は第一引数に、初期化処理の関数名、第二引数以降に初期化処理をフックするコマンド名を与えます。

これは、*pyenv, python, pip* というコマンドを実行するまで `pyenv init` の実行を遅延させます。

```zsh
% time (eval "$(lazyenv.load _pyenv_init pyenv python pip)")
( eval "$(lazyenv.load _pyenv_init pyenv python pip)"; )  0.00s user 0.00s system 78% cpu 0.003 total
```

圧倒的に高速です。

コマンドリストに shims のリストを与えてもいいと思います。

```bash
eval "$(lazyenv.load _pyenv_init pyenv `ls /path/to/pyenv/shims`)"
```

## まとめ

シェルの起動が早くなって、快適生活を送れるようになった。
最近は、全然コード書いてないしサーバーも触ってないけどな！

[lazyenv]:https://github.com/takezoh/lazyenv
【論文シリーズ】(大脳)皮質の学習モデリング

## 原文
[Cortical Learning via Prediction
Christos H. Papadimitriou (2015)](http://goo.gl/XJbnFs)





## 1. 要約／背景
* **PJOIN**(=Predictive JOIN)という学習アルゴリズムを開発した。関連付けと予測を組み合わせたアルゴリズムで、任意の2値判断を組み合わせたアンサンブル学習が可能にある。
* **ニューロイド**とよばれる情報単体が単位になる。ニューロイドは超近隣のニューロイドとのみ相互作用を及ぼし、応答の結果をフィードバックする。近隣とはシナプスに対応する結合で繋がる。
* **不応期** (refractory period) などの神経伝導の細かい振る舞いもモデリングできる。


## 2. 骨子の理論
### (1)2つの単位アルゴリズム
* JOIN
    * C=JOIN(A, B)のとき、AとBが興奮することによって、Cも興奮する。
- LINK
    - LINK(A, B): Aが興奮するとき、Bも興奮する。

### (2)ニューロイドの数的モデル
ニューロイドは、$(T,f,q)$という3次元で状態を表現できる。
$T$ は閾値、$f$ は興奮かどうかの論理判定値、$q$ はニューロイドの取りうる状態値である(NNのおける入力値みたいなもの)。
伝達の重みを$w$とすると、ニューロイド$\nu$, シナプス$e$の更新$\delta$、$\lambda$はそれぞれ

```math
(T_i^{t+1}, q_i^{t+1}) \leftarrow \delta(T_i^{t},q_i^{t},f_i^{t+1},W_i^{t}), \\
(w_{ji}^{t+1}, qq_{ji}^{t+1}) \leftarrow \lambda(q_i^{t},qq_{ji}^{t},f_j^{t},f_i^{t+1},W_i^{t})
```

### (3)PJOINのアルゴリズム
$C = {\rm PJOIN}(A, B)$のとき、

* ①$C = {\rm JOIN}(A, B)$が成り立つ
* ②ニューロイド$C$は、$1/2$の確率でつぎのステップに関わる。$C$の一部が予測ニューロイド$C_P$となる。残りは遂行役 (Operational) となり、$A$もしくは$B$から発火を受け取る。
* ③予測ニューロイドは、$A$および$B$と${\rm LINK}(C_P, A_P)$, ${\rm LINK}(C_P, B_P)$のように結合する。(ここで、$C$から$A$or$B$へのフィードバックが発生する)$C_P$は$A$または$B$から2倍の強さで伝達を受ける。

![151207224351_2.JPG](https://qiita-image-store.s3.amazonaws.com/0/127228/bfff3caf-35c6-1c78-4b68-19740ce32bef.jpeg)


### (4)情報の知覚と学習
$x\in \\{ 0,1 \\}$の二値表現で、情報を受け入れる。
ある一つのアイテム($A \sim C$に該当するもの)を$I(x)$と表すと、$I(x)$の表現が同一化 (identical) になったとき、ニューロイドは学習したことになる。

～アルゴリズム～

- $p$の確率で興奮するアイテムを用意。
- 確率$q$で伝播する$C ＝ {\rm PJOIN}$形式を作る。
- 全体的に伝播現象が止まるまで反応を続ける。


## 3. モデル適用例
本モデルは、教師なし学習をベースとしている。下のグラフは、PJOINのネットワーク数と対応する現象のゆらぎの確率を示している。ゆらぎの確率(perturbation probability)は高いほど、現象が変化しやすく、モデル化が難しい。
確率0.5のゆらぎに対して、600以上のPJOINネットワークの構成でパターン認識できるという結果が読み取れる。

![151207224351_3.JPG](https://qiita-image-store.s3.amazonaws.com/0/127228/e66617aa-b801-d793-e546-89373bca2c06.jpeg)
Magento2のダッシュボードの静的ビューが反映されないことについて

　本記事は[Magento Advent Calendar 2017](https://adventar.org/calendars/2349)の19日目です。

#はじめに

Magento2について書いていこうと思いますが、私はまだMagento2を触り始めてから数か月のひよっこです。
という予防線を張りつつ記事を始めさせていただきます。

##経緯

Magento2をインストールしてからMagento2のDevDocsとにらめっこしながら、Helloworldのmoduleを作ったり、情報をエクスポートするmoduleを作ったりとスキルを積むための練習を続けてきたわけですが

たびたび静的ビューが読み込まれないことがありました。
初めのころはあたふたしながらも[DevDocs](http://devdocs.magento.com/guides/v2.1/config-guide/cli/config-cli-subcommands-static-view.html)を見てコマンドで直していました。

##起きたこと

で、今回もmoduleを作ってるときにmoduleの反映をするために

`$ php bin/magento setup:upgrade`

をしたところ、静的ビューが表示されなくなったのです。

いつものことか。。。と思いながら　`pub/static`　を消して、

`$ php bin/magento setup:static-content:deploy`

をすると、それでも静的ビューの表示がされませんでした。

##解決

疑問に思い、私よりもMagento2を触っている人に原因が何かを聞いてみたところ「consoleを見てみるといい」とのことなのでconsoleをひらいたところ、赤字でいくつかのエラーが。。。

エラーの内容も分かるものと分からないものがあったので聞いたり、自分でGoogleで調べたりしてなんとかエラーもおさまり無事に表示させることができました。

原因はやはり　`pub/static`　のディレクトリ周辺の問題だったみたいです。

##さいごに

このような、今まで出会ったことのないエラーなどに直面したときは自分で考えるだけではなく先人の知恵を借りるのも大事だなぁと思いました。
また、この先始める初心者の方々の役に立てるような記事を今後書いていけたら、自分の覚えたことの整理にもなるのですすんでまとめていけたらなぁと、こんなところでこの記事を終わりにしたいと思います。
ドシロウトがcodeanywhereを使ってみた

## ０．初めに

私はエンジニアではないただのドシロウトです。最近Pythonのお勉強を始めました。

でもわたしのパソコン（Win10,Atom Z8350,4GB,64GB)ではショボイのでローカルでは常にリソースを気にしながらのお勉強になります。

そこで無料で使えるオンライン統合環境（IDE）というものがあるのを知り探し始めたのがそもそものきっかけです。

クラウド統合開発環境ではCloud9というサイトが超有名でネット上でも無数に記事があります。しかしCloud9はAmazonに買収されて以下のサイトになってしまいました。

AWS Cloud9
https://aws.amazon.com/jp/cloud9/

無料でも使える可能性はありますがちょっと微妙な感じだったので別のIDEをさがしました。

## １．Codeanywhereを見つけた

少しググると以下サイトを見つけました。

Codeanywhere
https://codeanywhere.com/

まぁ「Free $0 Per user/forever」とうたってますがいつまで続くのかわかりません。2008年サービス開始らしく、少なくとも今は無料です。

以下の記事の中にも紹介が少しだけありました。

プログラミングエディタもクラウドの時代へ、クラウド型IDE 3選
https://blog.hitorifest.com/technology/online-ide/

まず初期登録が必要ですがGithub認証で行けました。python3のコンテナが選べたのでそれを選択すればすぐエディタ画面が表示されました

参考：Quick Tutorial（PHPの場合ですが…）
http://docs.codeanywhere.com/quicktutorial.html

エディタ画面はこんな感じです。

![ca1.png](https://qiita-image-store.s3.amazonaws.com/0/35574/33b1b235-516c-bd22-b2ef-e983b9e7f4fc.png)


画面操作の理解に少しかかりましたがタブを選べばターミナルもちゃんとありました。

ターミナル画面はこんな感じです。

![ca2.jpg](https://qiita-image-store.s3.amazonaws.com/0/35574/95595bdb-1e14-8ddc-eb3a-e910e558c2ea.jpeg)


そこで「python -V」を入力すると2.7.4と表示されます。python3にしたのに…と悩みましたが「python3 -V」にしたら3.4.3と表示されました。

## ２．とりあえずインストール

私はPythonの簡単WEB環境Flaskしかつかった事がありません。早速Flaskを入れようと「pip3 intall flask」を入れると以下のエラーになりました。

> error: [Errno 13] Permission denied

少しググると以下のの記事を発見。

[Python]pip install エラー（error: [Errno 13] Permission denied）
https://ponvire.com/2017/11/17/pythonpip-install%E3%82%A8%E3%83%A9%E3%83%BC%EF%BC%88error-errno-13-permission-denied%EF%BC%89/

「sudo pip3 install flask」でいけました。Jinja2はすでに導入されてました。

## ３．プログラムを試す

とりあえず以下のapp.pyを作ってルート直下に作成。

```python:app.py
# app.py
from flask import Flask

app = Flask(__name__)

@app.route('/')
def index():
    return 'Hello'


if __name__ == '__main__':
    app.debug = True
    app.run(host='0.0.0.0', port=3000)
```

https:で繋ぐ場合はIP:0.0.0.0＆ポート3000でこのURLを使うという説明もタブの中にあったのでその通りやるとあっさりHelloが表示できました。

説明の画面はこんな感じです。

![ca4.png](https://qiita-image-store.s3.amazonaws.com/0/35574/aa8b2c99-cb38-7d57-8637-af83badde7e7.png)


## ４．もうちょっと試す

続いて以前ローカルで作った英単語辞典のプログラムを移植してみました。ソースは以下です。

英単語辞典 Python+Flask+Jinja2版（ローカル版）
https://gist.github.com/basictomonokai/e7bdce6756e294be38aa97038e6abfb4

やった事は以下だけです。

* static,templatesのディレクトリ作成
* ルート直下にpythonプログラム配置
* pythonプログラム中のポート番号修正
* templatesにHTMLファイル配置
* HTMLファイル中のfetchのURLを変更
* ルート直下に辞書データをアップロード

辞書データは以下の物を使用しました。

無料 英和辞書データ ダウンロード
https://kujirahand.com/web-tools/EJDictFreeDL.php

実行したWEBの画面はこんな感じ。

![ca5.jpg](https://qiita-image-store.s3.amazonaws.com/0/35574/d2a271a2-6bdf-6940-f512-4d88dfa8e5cb.jpeg)


たったこれだけで英単語辞典がWebサービスぽく動きました。Flaskで作ってたおかげでとても簡単にできました。

しかし、オンラインIDEすごい…これならしょぼいPCでもスペックは関係無しです。便利だなぁと思いました。

以　上
キーボードとマウスとコーヒーと

アドベントカレンダー作ったからには書かねば。
テンプレ的な意味も含めて。

家を建ててもらうのに大工の工具に安物を使われると心配になります。
美容室ではスタイリストのハサミは自分のハサミらしいです。

エンジニアたる者キーボード、マウスには自分の装備を整えましょう。

そんな私の装備品

# 職場
## キーボード

* 東プレリアルフォース SJ38C0  
  https://www.diatec.co.jp/products/det.php?prod_c=650  
  https://www.amazon.co.jp/dp/B003H04YIO
* USB
* 静電容量無接点
* JP 108Key
* All30gモデル
* 2012/11 に購入

フルキーの理由

* マウス右手に親指を伸ばせばテンキーのエンターが押せるのが好き
* 会計出身なのでテンキーは欲しい。

ローマ字打ちなのでカナは不要。

弱点
ぼーっとして手をおいたままにしてると30g負荷の軽さで
`ああああああああああああああああああ`
となったりしますが、キータッチは概ね満足

WindowsキーがVista世代なので10世代のキートップが欲しい所…

## マウス

* logicool M500  
  https://www.amazon.co.jp/dp/B002A7Y41C
* USB
* 光学レーザー
* 5ボタン
* 常時高速スクロール
* ソール  
  カグスベール

有線の理由
会社で電池切れ時の交換がめんどくさい。

常時高速スクロール
指先で弾けば一気に飛べる。
使い慣れたらこれじゃないと無理という体になる。

みんなのマウスの味方
カグスベール
https://www.amazon.co.jp/dp/B00140DJKI

# 家用
## キーボード

* Majestouch BLACK  
  http://www.diatec.co.jp/shop/det.php?prod_c=885  
  https://www.amazon.co.jp/dp/B007VAFXLI/
* USB
* 赤軸
* JP 108Key
* 2017/1 に購入

茶軸と迷ったが赤軸45g
使用感は全く問題なし。概ね満足。

こっちはWin10型Winキートップ


## マウス
* logicool M705t  
  https://www.amazon.co.jp/dp/B00E1A2ZEO
* USB 無線
* 光学レーザー
* 6ボタン
* 常時高速スクロール
* ソール  
  カグスベール

現在2台目

高速スクロール付き無線マウス最強のコスパだと思う。


# コーヒー
## 会社
主に

* TULLY's BARISTA'S BLACK ボトル缶390
  ホット/コールド
* CRAFT BOSS
  コールド

たまに

* 売店でネスカフェドルチェ


## 家
* Starbucks イタリアンロースト  
  http://www.starbucks.co.jp/beans/dark/4524785083431/
* Starbucks ソロフィルター

ソロフィルターはおすすめできる。
ただし名前の通り1杯分のみしかドリップできない。
ステンレスフィルター。
ブラックしか飲まない。
Raspberry PiのハードウェアPWMをpigpioで出力する

pigpioでのハードウェアPWMはあまりまとまった情報がなかったので簡単にまとめようと思います。

# 環境
* Raspberry Pi Zero W
* Raspbian Stretch Lite (Kernel version: 4.9.59+)

# ソフトウェアPWM
イメージとしてはこんな感じでPWM波形を出力するのがソフトウェアPWMです。
各種ライブラリではもっといい方法でPWMを出力しているような気がするので、あくまでイメージの話です。

```python3
while(True):
    出力を1にする
    time.sleep(0.25)
    出力を0にする
    time.sleep(0.75)
```

この場合だとduty比が0.25になりますね。
ですが関数呼び出し等の遅延やら何やらでズレが生じやすいみたいです。

# ハードウェアPWM
実際に測定したわけではないのでなんとも言えませんが、ズレが生じうるソフトウェアPWMよりハードウェアPWMがあるならそっちを使ったほうが安心です。
ハードウェアPWMについては詳しいことは分かりませんが、ハードウェア内部のクロックを利用して比較的正確なPWMを出力するものだと認識しています。

# Raspberry PiでのハードウェアPWM
ピン配置: [Raspberry Pi Pinout](https://pinout.xyz/pinout/)
ハードウェア実装: [BCM2835 ARM Peripherals](https://www.raspberrypi.org/app/uploads/2012/02/BCM2835-ARM-Peripherals.pdf)

このあたりを見ると書いてあるんですが、ラズパイではハードウェアPWMに対応しているピンが4つあり、独立に制御できるのは2組ずつです。
古い記述だとラズパイのハードウェアPWMはGPIO18だけ、と書いてあったりするのですが、それはラズパイA、Bの話で、それ以降のモデルでは独立に2つのPWMを出力することができます。

* PWM Channel 0 : GPIO12、GPIO18
* PWM Channel 1 : GPIO13、GPIO19

Channelが同一のピンはPWMを独立に制御できないので、Channel 0を共有しているGPIO12,18は別々のハードウェアPWMを出力できません。
逆に言えば、Channelを共有していれば同一のPWMを出力することができます。

# WiringPiでの問題点
面倒なのは、周波数とduty比で指定したいのに、よく分からないclockやらrangeやらの値を指定しなければハードウェアPWMを出力できない、という点です。
また、新しいバージョンのカーネルでWiringPiにハードウェアPWMの設定を行おうとすると落ちる現象が発生するみたいです。僕も落ちました。
この辺の話について、詳しくは以下。
[Raspberry Pi : WiringPi-PythonでPWM](https://www.usagi1975.com/03aug172203/)

カーネルをダウングレードすればいいらしいのですが、まあ面倒なのでpigpioを使ったほうが良いかなと思います。

# pigpioを使う
初めて使う場合は以下のサイトが参考になると思います。
[Raspberry PiのGPIO制御の決定版 pigpio を試す](http://karaage.hatenadiary.jp/entry/2017/02/10/073000)

公式のpigpioのPythonのドキュメントはこちら。
[pigpio library](http://abyz.me.uk/rpi/pigpio/python.html)

# ハードウェアPWMを2つ独立に制御してみる

GPIO18、19にそれぞれLEDか何かを繋いでみて、ハードウェアPWMを使って光らせてみます。

```python3
import pigpio
import time

gpio_pin0 = 18
gpio_pin1 = 19

pi = pigpio.pi()
pi.set_mode(gpio_pin0, pigpio.OUTPUT)
pi.set_mode(gpio_pin1, pigpio.OUTPUT)

# GPIO18: 2Hz、duty比0.5
pi.hardware_PWM(gpio_pin0, 2, 500000)
# GPIO19: 8Hz、duty比0.1
pi.hardware_PWM(gpio_pin1, 8, 100000)

time.sleep(5)

pi.set_mode(gpio_pin0, pigpio.INPUT)
pi.set_mode(gpio_pin1, pigpio.INPUT)
pi.stop()
```

`pi.hardware_PWM(gpio_pin, freq, duty)`ではfreqに周波数（Hz）、dutyには1000000(=1M)をduty比1として整数を指定します。
pigpioなら周波数とduty比を指定すれば簡単にハードウェアPWMが出力できるのですごい。

こんな感じでやれば独立にハードウェアPWMを制御できると思います。
[Macのみ]社内ネットワークが復旧したら教えてくれるbashスクリプト


最近オフィスのネットワークが不安定で時折長時間使えなくなることがあります。
復活したかなと毎分の用にブラウザリロードするのもうざいので、ネットワークが復旧したら教えてくれるスクリプトを作りました。
`say`コマンドを使っているのでMac限定かもしれませんが、似たような状況の人いたら使ってください。

毎秒`curl`を実行して5回連続で成功したら、成功と判定してMacが喋ります。

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

# 音量注意用に実行時に一言
say "ネットワークが復活したら教えるよ";

success_counter=0
while(True) do 
  curl --connect-timeout 1 https://google.co.jp
  res=$?
  echo $res
  if [ $res = 0 ]; then
    let success_counter++
    if [ $success_counter > 5 ]; then
      say "やったね！ネットワークが復活したみたいだよ";
      exit;
    fi
  else
    success_counter=0
  fi
  sleep 1;
done
```

爆音でネットワーク復旧のお知らせをして失笑を買ってしまったので、起動時にも一言喋るようにしていますw
IBM Watson ConversationのChatBotクライアントをXamarinで作ってみた

本記事は、[初心者さん・学生さん大歓迎！ Xamarin その1 Advent Calendar 2017](https://qiita.com/advent-calendar/2017/xamarin-student) の19日目の記事です。

先日、[IBM Cloud ライトプラン](https://www.ibm.com/cloud-computing/jp/ja/bluemix/developerslounge/liteservice/)が、発表されました。
無料、無期限、クレジットカード登録なしで42種類ものプラットフォームサービスやAPIを使うことができ、もちろんWatson APIも無料で使うことができます。

その中でも、Watson APIの一つである[Conversation](https://www.ibm.com/watson/jp-ja/developercloud/conversation.html)を使うと、自然言語を意図分類しながら回答するAIチャットボットが、わりと簡単に作成できます。

そんなConversationですが、IBM CloudのWeb管理コンソールから、作ったBotのデモンストレーションを行うことができます。

![スクリーンショット 2017-12-19 13.46.58.png](https://qiita-image-store.s3.amazonaws.com/0/75755/2f037158-e0a4-a23c-1073-b01c01ea7aea.png)

でもお客さんに見せる時、管理コンソールは、、、っとかありますよね。
LINEやSlack連携なども可能ですが、Developer Accountの取得、設定など、多少手間がかかります。（それでも簡単ですが）
そんな時に簡易的にデモを行えるツール（アプリ）が欲しいなーと思い、作ることにしました。

IBMCloudの管理画面からサービス資格情報 
　　-> 一覧からConversationサービスを選択 
　　　　-> 資格情報の表示を押下すると表示される、UserName,Password
をアプリで入力することで、接続できます。
LINEや他のChatサービス連携とは違い、Developer Accountの取得や、管理ポータルでの設定は不要です。

本当はXamarinについての質問を返すAIチャットボットを作って、Xamarin.Formsクライアントからデモを行う、というのをやりたかったのですが、間に合わなかったので、それは別の機会に。

## 作ったもの

まずは動画をご覧ください。

![conversationclient.gif](https://qiita-image-store.s3.amazonaws.com/0/75755/86129231-66e3-93ba-b987-d6a1291a7a0c.gif)

Conversationのチュートリアルとして用意されている、車のAIチャットボットに繋いでみました。

「play music」 と入力すると、音楽のジャンルはなんだ？と聞き返されます。
「Jazz」と入力すると、Jazzの音楽を起動してくれます。
「Thanks」と入力すると、言われ慣れていないのか「何言ってるかわかんない」と言われますw（覚えさせていないだけ）
こんな感じで、ボットのデモを行うことができるアプリです。

## フレームワーク、ライブラリ

* Xamarin.Forms (.NET Standard2.0)
* [Watson Developer Cloud .NET Standard SDK](https://github.com/watson-developer-cloud/dotnet-standard-sdk)
* [Prism.Forms](https://github.com/PrismLibrary/Prism)
* [ReactiveProperty](https://github.com/runceel/ReactiveProperty/)

## 作り方

Watson Developer Cloudが .NET Standard 1.6〜に対応しているため、
Xamarin.Forms でPCLを .NET Standardに変更しました。せっかくなので、2.0対応しました。

あとは WatsonDeveloerCloud Conversation API をラップしたModelクラスを作成し、ViewModelを介して画面を更新しています。

[ソース](https://github.com/Masaaki-Yoshida/XamarinConversationClient/tree/develop)も公開しています。

まだUIも味気なく、ログイン機能もないですが、[資格情報](https://github.com/Masaaki-Yoshida/XamarinConversationClient/blob/develop/XamarinConversationClient/XamarinConversationClient/ViewModels/ChatViewModel.cs#L55)をご自身のUserName,Passwordに変更することで、実際にお試しいただけます。

近々、ログイン機能やUIの刷新を行ったのち、ストアにリリースできればいいなと思っております。
技術的内容が薄めですみませんが、以上となります！
なお、所属する会社のアドベンドカレンダーに[Xamarin Profierでメモリリーク解析](https://www.cresco.co.jp/blog/entry/4638/)を書きましたので、よろしければご覧ください。

明日はJXUG主催 田淵さんの「何がNativeで何がEmbeddingなの？って初心者向けの話を書きます。」です。
引き続き[初心者さん・学生さん大歓迎！ Xamarin その1 Advent Calendar 2017](https://qiita.com/advent-calendar/2017/xamarin-student)をお楽しみください。
コードの品質の向上の為のアプローチしていますか？！

この投稿は、[SC（非公式） Advent Calendar 2017](https://qiita.com/advent-calendar/2017/unofficial-sc)の18日目の投稿です。
内容は技術的なというよりポエムですので興味がある方のみ読んでみてください。
#きっかけ
なんだかよくわからないけど、上司からコードの品質を向上させるもしくは品質を低下させない方法を考えてくれと言われました。
#高品質のためのアプローチのしかたを考えてみる
##個人のスキルの向上
###本やネットの情報を元に独学
まずは自分の能力向上に勤めましょう。テクニックは人に教えてもらうのではなく自分で学ぶんですよ。
###自分より能力や経験が上の人に指導してもらう
自分で学んだテクニックをさらに他人に指導してもらい昇華させましょう。
自分の能力に自惚れていないでしっかりとコードレビューを受けよう！
工数が、、、って怒られちゃうかもしれないけど、ペアプログラミング、さらには最近だとモブプログラミングという手法もあります。ぜひ挑戦してみましょう。上位者の人のスキルアップにもつながるかもしれません。
###さらなる向上
インプットしたものをアウトプットしよう。社外でインプットしたものは社内へアウトプット、社内でインプットしたものは社外へアウトプットすることでそれについての議論がなされもとに戻すことで双方に新たな発展を産み、そしてそれが自分のスキルとなって先に向かっていくでしょう。
##チーム開発
###テストコード書いていますか？！
工数が足りないとか時間が足りないとかいうのはやめましょう。それも含めて開発期間だと思おう！
仕様変更時にテストが置いてかれていませんか？！せっかく書いたテストをムダにしないように
そもそもテストコードが書きづらいプログラム設計になっていないですかね。複雑なコードだからテストコードも複雑になってしまうのかもしれないですよ。
###バージョン管理システム
TFSやGitをただのプログラムのバージョン管理システムにしていませんか？！もったいないですよ。
便利な機能がたくさんあるのでどんどん使いこなしましょう。
例えば、
####・継続的インテグレーション導入していますか？！
自動ビルド機能です。
「誰だよ、ビルドできないやつチェックインしたのは！！！！」って経験ありませんかね。私はあります。
そろそろチェックイン時にビルドが走るようにしてみませんか？！Git系でもTFS系でも意外と簡単に導入できますよ。
####・テストコード書いたら自動実行しちゃおう！
せっかくテストコードを書いたんだから、テストも自動化してしまいましょう。継続的インテグレーションに混ぜて自動ビルド自動テストで品質担保しましょう。
####・継続的デリバリーで常に最新のテスト環境を！
自動デプロイです。
テスト環境へのデプロイで身をすり減らしていませんか？！かつてはあみだくじで選んでいたこともあります。
テスト環境へのリリースが担保されているということはそのまま接続先を変えれば本番へも安定したリリース作業が行えるはずです。
####・他にも
#####タスク管理していますか？！
開発、テスト、バグの進捗度もわかりやすくしておきましょう。
それによって、どれだけ余力があるのかとか、この人負荷が高いなとかまで判断できるようになります。

###さらに高度に
####静的解析ツールの導入
ものによっては有償ですが、バグになりやすいコードを書いていないかとかが検出できます。
####UIテストもコード化
UIも自動でテストできる時代です。WebAPIならもっと簡単ですね。
####開発プロセス
断然アジャイル推しです。エンジニア主導で現場改善していきませんか？！
![image.png](https://qiita-image-store.s3.amazonaws.com/0/80457/d302d522-0ade-9c74-0dc2-b2309d2e1f99.png)
参考：http://agilemanifesto.org/iso/ja/manifesto.html

#まとめ
と、つらつらと思いつく言葉をどんどん上げていったのでうまくまとまっていませんがご了承ください。
そもそもすべてのプロジェクトですべて取り込めるとは思っていません。今期はせっかく変えるチャンスを見いだせるチームに所属することができたので、少しづつ自分の関わるプロジェクトから浸透させるべく今期は頑張ろうと思っていますが、今のところチャンスが回ってきません。
MP4Boxの設定

## 環境
- AWS EC2

## インストール手順
1. $ git clone https://github.com/gpac/gpac.git
2. $ cd gpac
2. $ ./configure --use-ffmpeg=system --static-mp4box --use-zlib=no
3. $ make -j4
4. $ sudo make install

## 参考
[GPAC: build MP4Box only (all platforms)](https://gpac.wp.imt.fr/2015/07/29/gpac-build-mp4box-only-all-platforms/)
ECS + docker-composeでrails+nginxを2セット動かしている時の役割やで

# リポジトリ
dockerイメージ置き場やで

- rails

 Railsが動くDockerイメージやで
 ローカルにassetsとsocketを置くんや!

- nginx
  
Nginxが動くDockerイメージやで
ローカルのassetsとsocketsを配信するんや!

# タスク定義(task define)
railsとnginxをセットで運用するで
assetsとsocket使えるように、ボリュームをシェアするんや!

# クラスター
EC2が動いてるで!

# サービス
クラスターの上でrails+nginxのタスクを2個実行するで!
こいつ・・・動くぞ。

# オフラインのChrome画面に出てくる恐竜は動く
AndroidでウェブブラウザにChromeを使っている場合、オフラインだとこういう恐竜が出てきます。

![20171219_132146_rmscr.jpg](https://qiita-image-store.s3.amazonaws.com/0/55384/e1045d1f-fd57-b90d-a42b-d64c05abadc3.jpeg)

この恐竜、実は触ると動きます。

[![chrome offline](http://img.youtube.com/vi/gA-ebExDfWI/0.jpg)](http://www.youtube.com/watch?v=gA-ebExDfWI)

https://youtu.be/gA-ebExDfWI

しかも恐竜を触って操作できるアクションゲームになってます。
python動的モジュールの読み込み

importlibを使うと動的にモジュール（pyファイル）が読めるらしい。
しかし、使い方がさっぱりわからなくてハマったので、メモします。

###ファイル一覧


```
.
├── main.py
└── plugins
    ├── hoge1.py
    ├── hoge2.py
```
main.pyと同じ階層に「plugins」というディレクトリがあります。
中にはpyファイルがあります。



###ソース。
```python:main.py
# -*- coding: utf-8 -*-
import os
import importlib


def main():
    usrsrc = 'plugins'            #後付で追加したいスクリプトをここに入れる。
    plugins_dir = os.listdir(usrsrc)  #pluginsディレクトリのファイル一覧の取得（リスト型）

    current_dir = os.path.dirname(os.path.abspath(__file__)) #実行ファイルのディレクトリパスを取得

    for u_src in plugins_dir:             #ファイル一覧をリスト化する。
         if u_src.endswith('py'):         #拡張子がpyであるかどうかの判断（正規表現：py$）
             print("hit :",u_src)
             path =  usrsrc + '/' + u_src  #ここはpath = plugins/hoge1.pyのようなイメージ
             #print("path :" , path)
             cpath = os.path.splitext(path)[0].replace(os.path.sep, '.')  #path変数の/を.に置きかける。
             print("cpath :" , cpath)
             #cpath = 'plugins.hoge1'
             noge = importlib.import_module(cpath)  #変数nogeにモジュールを代入。
             print(noge)
             noge.hello() #hoge1.pyの中のhello()をコールする。


if __name__ == '__main__':
    main()

```

```python:plugins/hoge1.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-

test="hoge"
def hello():
    print("test :", test)

def main():
    hello()

if __name__ == '__main__':
    main()
```


```python:plugins/hoge2.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-

test="hogehoge"
def hello():
    print("test :", test)

def main():
    hello()

if __name__ == '__main__':
    main()
```
[gitに置いてみました。](https://github.com/ajitama/importlib-test)



###実行結果

```shell-session
$ python main.py
hit : hoge2.py
cpath : plugins.hoge2
<module 'plugins.hoge2' from '[実行されたパス]/plugins/hoge2.py'>
test : hogehoge
hit : hoge1.py
cpath : plugins.hoge1
<module 'plugins.hoge1' from '[実行されたパス]/plugins/hoge1.py'>
test : hoge
```
この関数はplugin配下を全て読み込んで実行してますが
importlib.import_module()の列の前で、分岐をつけてやれば必要なものだけ、読み込むことも可能だと思います。
＝同じ関数名でも別のファイルに切り替えて処理内容を自在に切り替えられるってことで。

たったこれだけで3日以上ハマったんで役に立つ日が来ることを期待してます。。
Pythonで配列のサイズ(numpy.shape)

numpyを使うことを前提にしています。

デバックなどで、定義してある配列が何行何列なのか知りたいときが結構あります。
このときは.shapeを用いてば良いです。

```python3:checkarray.py
import numpy as np
#5×3の行列を作成(要素は全て0)
a=np.array([[0]*3 for i in range(5)])
print("a="+str(a))
print(a.shape)
```
a=\[[0 0 0]
 [0 0 0]
 [0 0 0]
 [0 0 0]
 [0 0 0]]
(5, 3)
と出力されるはずです
Xcode9.1のシミュレータを使ってみた


今回ご紹介させていただくのはXcodeのシミュレータについてです。
初めてシミュレータでアプリの動作を確認した時は感動しました。
何気なく自宅のPCをXcode9.1にバージョンアップしてみたところ、
シミュレータを起動して改めて感動したため今回このテーマにしました。
#驚いたこと
①シミュレータを複数端末で起動することができる。
　→iPhoneとiPadなど同時に確認できる。
　→画面サイズごとに確認したい場合は便利かも・・・・？


②iPhoneXがシミュレータに増えている・・・・。
<img width="350" alt="スクリーンショット 2017-12-14 19.34.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/215684/17db7402-4244-5040-73ad-0e75fb559a3f.png">
<図1：シミュレータを複数端末表示/非表示にする手順>


③シミュレータでカメラロールを開くことができる。
　→PC上の画像をシミュレータにドラッグ&ドロップすると
　　カメラロールに画像が追加できちゃいました！
　→今までシミュレータ上のアプリでカメラロールから画像を選ばすことができませんでしたが今回から可能になりました。
<img width="165" alt="スクリーンショット 2017-12-18 22.16.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/215684/08645374-b910-5864-b0b9-b61d58e33002.png">
<図2：PC画面から画像をドラッグ&ドロップした時>

<img width="215" alt="スクリーンショット 2017-12-18 22.16.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/215684/ae0f9ec2-bfbb-9ce9-876f-df426d486a26.png">
<図3：自作アプリ上でカメラロールを呼び出した時の動作>



④ホームボタンや端末の横ボタン
　→音量やマナーモード、電源ボタンなどの操作がシミュレータでできました！
　　矢印を近づけると横ボタンがニョキッと出てきます。
　→rotateは今まで通りメニューバーから選択しなければいけないようです。
　→ホームボタンクリックでロック画面解除
　→側面マナーボタンでマナーモードにできる。
　→ホームボタンをダブルタップで終了処理
　→アプリアイコン長押しで削除可能
　など実機並みに色々なことができることがわかりました！
<img width="175" alt="スクリーンショット 2017-12-18 22.16.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/215684/58bb7e77-948d-e55c-a717-136942e65946.png">
<図4：その他の機能を使用してみた時>


#感想
アプリ開発自体の歴はまだまだですが、
シミュレータで遊んでみて少し楽しかったので今回ご紹介させていただきました。
実機でアプリが動いた時の感動はもちろんのこと、
シミュレータでも自身で作ったアプリが動くというのがやっぱり楽しいなと改めて思いました。
まだまだ知らない使い方もあるかと思いますので、
今後使っていくうちに知っていきたいなと思います。
Media QueryとSassの効率的な書き方　短縮バージョン

Sassを使って、Media Queryを書くときに、いろいろ気をつけることまとめ。

↓この記事を元に自分用まとめです。
https://qiita.com/kyaido/items/828906ffa7198e99d0b7

#mixinの引数を短くするといろいろ書きやすい。

元記事は、変数を引数にしてましたが、ブレークポイントごとにmixinを作って引数使わない方が取り回ししやすいかと。

```style.scss

$breakpoint: 768px;
$breakpoint-md: 960px;

@mixin mq {
  @media screen and (max-width: $breakpoint) {
    @content;
  }
}

@mixin mq-md {
  @media screen and (max-width: $breakpoint-md) {
    @content;
  }
}

@include mq {
  body{
    margin-top: 50px;
  }
}

body{
  @include mq-md{
    padding-top: 200px;
    background-color: #f00;
  }
}

```
お好みでファイル分けたりするといいかもですが、小さい案件なら1枚の方が取り回しが楽ですね。
コミット履歴を引き継ぎつつリポジトリを1つにまとめる方法

## やりたいこと

例えば、UKをEUに取り込みたいとする。

```
EU/
  |--- .git(dev)

UK/
  |--- .git(dev)
```

↓↓↓  

```
EU/
  |--- .git(dev)
  |--- UK/
```

### 【注意】

あくまでもローカルで管理しているリポジトリのみに使用すること。
これをやるとリモートリポジトリと整合性がとれなくなる。


## 手順

### 1. 取り込みを行うブランチを決めておく

```
git checkout dev
```

### 2. EU配下にUKを取り込むディレクトリを作成

```
cd EU
mkdir UK
```

### 3. EUに作成したディレクトリをコミット

```
# 空ディレクトリはコミットできないので空ファイルをUK配下に作ってコミット
touch UK/.anchor
git add -A UK
git commit -m 'UKリポジトリを取り込むディレクトリを作成'
```

### 4. UKリポジトリをリモートリポジトリとして追加

```
# EUのリポジトリルートに移動
cd EU
# UKリポジトリのパスを指定(絶対パスやURLでもOK、相対パスの場合はEUリポジトリルートから見たパス)
git remote add ../GS repoUK
```

### 5. ディレクトリを指定してUKを取り込む

```
# EUのリポジトリルートに移動
cd EU
# UKリポジトリのdevブランチを取り込む(ブランチ指定は必須)
git fetch repoUK
git merge --allow-unrelated-histories -X subtree=UK repoUK/dev
```

### 6. ブランチが複数ある場合は1～5の手順をブランチを切り替えて繰り返す  


## 参考URL

- [Git 別のリポジトリを履歴を残したまま取り込みたい](http://chaika.hatenablog.com/entry/2015/06/04/173401)
- [2つの Git リポジトリーを合成する](http://osyoyu.hatenablog.com/entry/2017/02/24/012531)
- [Git で複数のリポジトリをまとめたり、逆に切り出したりする](https://qiita.com/uasi/items/77d41698630fef012f82#_reference-fde4356412230ae7eee0)
論理削除されたデータを検索する


`paranoia`ってgemを使ってるのだが、いっつも忘れるので、メモ

- 論理削除されたデータも「含める」
 - Model.with_deleted

- 論理削除されたデータのみ
 - Model.only_deleted


この後ろに普通に`where`とかができる

```ruby
> User.with_deleted.find 2
=> #<ActiveRecord::Relation [#<User id: 2, code: "admin2", name: "管理者2">

> User.with_deleted.where(code: "admin")
=> #<ActiveRecord::Relation [#<User id: 1, code: "admin", name: "管理者">
```

論理削除されたデータを`Model.restore!`で戻せるらしいけど、リレーションとかどうなるんだろうかが良く分からなかった。

※`paranoi`については以下のサイトにめちゃくちゃ詳しく書かれています。ありがとうございます。
http://www.task-notes.com/entry/20170813/1502618254
Liferay 7 / DXPでサードパーティのライブラリを利用した際に、デプロイできない件の解決方法

## サードパーティのライブラリを利用した際に、デプロイできない
実際の開発時に、```build.gradle```に新規ライブラリを追加して、いざLiferayにデプロイしようとすると、依存関係が解決できないので、デプロイできないよ、と言われることがあります。原因としては、```jsonic```ライブラリ内で参照している他のライブラリに、```optional```と指定されているためです。そうした推移的依存関係(transitive dependency)が自動的に解決できない場合は、自身で依存関係を解決するためのヒントを、```build.gradle```と```bnd.bnd```に書く必要があるのですが、以下にその方法を示します。

ツールチームのリードデベロッパーであるGreg Amersonが教えてくれた、このチケット[LPS-76436](https://issues.liferay.com/browse/LPS-76436)を超訳したものになります。

### 前提条件
- Liferay Workspaceを利用している。
- Lifeay Workspaceの`modules`以下にプロジェクトファイルを作成している。
- external-lib-webというMVCポートレットを開発しているバンドルで、```jsonic```ライブラリを利用しようとする例で説明します。

### Step.1 `blade gw resolve`を実行してみる。
該当のプロジェクトで`blade gw resovle`を実行してみると、依存性が解決できていないファイルが表示されるはずです。それでまず依存しているファイルの目星をつけましょう。

### Step.2 ```bnd.bnd```ファイルで、```Conditional-package```を利用する。

```properties:build.gradle
 dependencies {
    compileOnly group: "com.liferay.portal", name: "com.liferay.portal.kernel", version: "2.0.0"
    compileOnly group: "com.liferay.portal", name: "com.liferay.util.taglib", version: "2.0.0"
    compileOnly group: "javax.portlet", name: "portlet-api", version: "2.0"
    compileOnly group: "javax.servlet", name: "javax.servlet-api", version: "3.0.1"

    compileOnly group: "jstl", name: "jstl", version: "1.2"
    compileOnly group: "org.osgi", name: "osgi.cmpn", version: "6.0.0"

    compileOnly group:"net.arnx", name:"jsonic", version:"1.3.10"
 }
```

```bnd.bnd
Bundle-Name: external-lib-web
Bundle-SymbolicName: com.liferay.sample.test.external.library
Bundle-Version: 1.0.0
Export-Package:\
    com.liferay.sample.test.external.library.constants

Conditional-Package: net.arnx.jsonic.*
```

### Step.3 ```Private-packag```e / ```Import-Package```で解決

```properties:build.gradle
 dependencies {
    compileOnly group: "com.liferay.portal", name: "com.liferay.portal.kernel", version: "2.0.0"
    compileOnly group: "com.liferay.portal", name: "com.liferay.util.taglib", version: "2.0.0"
    compileOnly group: "javax.portlet", name: "portlet-api", version: "2.0"
    compileOnly group: "javax.servlet", name: "javax.servlet-api", version: "3.0.1"

    compileOnly group: "jstl", name: "jstl", version: "1.2"
    compileOnly group: "org.osgi", name: "osgi.cmpn", version: "6.0.0"

    compileOnly group:"net.arnx", name:"jsonic", version:"1.3.10"
 }
```

```bnd.bnd
 Bundle-Name: external-lib-web
 Bundle-SymbolicName: com.liferay.sample.test.external.library
 Bundle-Version: 1.0.0
 Export-Package:\
 com.liferay.sample.test.external.library.constants

Import-Package:\
    !com.google.inject

Private-Package:\
    net.arnx.jsonic
```

### Step.4 それでもうまくいかない場合があったら・・・
その場合は、```build.gradle```で```compileOnly```となっている部分を、```compileInclude```を利用し、Step2, Step3を組み合わせて試してみる、となります。

現在、ツールチームの方でLiferay用のGradleプラグインで、```compileConditional```というようなものを開発中なので、それが組み込まれると、推移的依存関係(transitive dependency)はcompileConditionalでまず解決を試みる、という方法になります。
重複しているレコードを削除するSQL

## 経緯
業務でテーブル内の重複データを削除する必要があったために使用したSQLです
データのidが必要だったために使用したSELECT文です
運用等でSQLを考える時の参考になればと思います
### 実行環境
Mysql 5.6

## ここでの重複データとは？
例：tagsテーブル

article_id | title | position
:--:|:--:|:-:
1 | rails  |  1
1 | python | 2
2 | ruby | 3
1 | rails  | 2
1 | python  |  3
3 | ruby  |  4

- column1(title)の値が同一でcolumn2(position)が異なる値のもの
- 異なる値とはここではpositionが1ずれている

## どんなSELECT文？
削除対象がpositionの値が大きい方なので、そちらを取得してます

``` sql:削除対象を取得するSELECT文
SELECT
  t2.id, (t2.position + 1)
FROM
  tags t1
INNER JOIN
  tags t2
ON
  t1.article_id = t2.article_id
WHERE
  t1.position = t2.position + 1
  AND
  t1.title = t2.title
;  

```

## Deleteする場合はどんなSQL文？
先程書いたSELECT文で対象のidを取得し、それを元にdeleteしています

```sql:取得したidを元に削除するDELETE文
DELETE
FROM
  tags
WHERE
  id IN (
    SELECT id FROM (
      SELECT
        t1.id
      FROM
        tags t1
      INNER JOIN
        tags t2
      ON
        t1.article_id = t2.article_id
      WHERE
        t1.position = t2.position + 1
        AND
        t1.title = t2.title
    ) AS tmp
  )
;
```

## 編集履歴
1. deleteするSQLがうまく動作しなかったので、変更しました。同じテーブルに対するサブクエリからの操作は出来ない為です

## 参考サイト
[MySQLでERROR:1093を回避する](http://blogger.shase.info/2014/09/mysqlerror1093.html)
BBc-1 (Beyond Blockchain One) のインストールからサンプルを動かしてみるまで

## Beyond Blockchain Oneとは？
無償のオープンソースソフトウェアとして開発・応用を推進している日本発の新たなブロックチェーンです。
胸熱だったのでさっそくcloneしてサンプルを動かしてみました。

詳しくはコチラ
[日本発の新たなブロックチェーン基盤BBc-1 (Beyond Blockchain One) を公開](https://prtimes.jp/main/html/rd/p/000000001.000029278.html)

githubはコチラ
https://github.com/beyond-blockchain/bbc1

## 実行環境
mac OS High Sierra 10.13.1
Docker Community Edition Version 17.09.0-ce-mac35 (19611)


## Docker環境設定
1, Dockerを起動します
2, cloneします

```
git clone git@github.com:beyond-blockchain/bbc1.git
```

3, docker imageをビルド
気長に待ちます

```
cd bbc1/docker
./docker-bbc1.sh gitbuild
```

4, docker containerを起動
 
```
./docker-bbc1.sh start
```

5, Dockerにログイン

```
./docker-bbc1.sh shell
```

## bbcサンプル起動の準備
docker　containerにはbbcがあらかじめcloneされています。
bbc1のブロックチェーン「bbc_core」も起動済みです。

1, OpenSSL-based ライブラリの設定

```
sh prepare.sh
```

2, 依存ライブラリのインストール

```
pip install -r requirements.txt
```


## file_proof サンプルの実行

file_proof README
https://github.com/beyond-blockchain/bbc1/tree/develop/examples/file_proof

ブロックチェーン上にファイルを保存したり、取り出したりできます

1, keypairの作成

```
cd examples/file_proof/
python file_proof.py keypair
```

2, ドメインとアセットグループの設定

```
python file_proof.py setup
```

3, ブロックチェーンにファイルを格納

```
echo test >> test.txt
python file_proof.py store test.txt
```

3, ブロックチェーン上のファイルを取得

```
python file_proof.py get test.txt
```
取得したファイルがタイムスタンプ付きで保存されます

カンタンですね！！
プルリクしてみましょう！

いくつかPRしてみました！今後が楽しみです！
https://github.com/beyond-blockchain/bbc1/pulls?q=is%3Apr+author%3Aarkth-araya

Stay Gold!
JavaScriptでファイルダウンロード

# JavaScriptでファイルダウンロード

**JavaScriptアドベントカレンダー　14日目です。(12/19)**

リンクを押すとダウンロードが勝手に始まるやつ。

どう実装していますか？ 実装する機会があり私は詰まりました。

前提として、認証のあるサーバからファイルをダウンロードする想定です。

## ダウンロードが始まるやーつ

anchorタグのDOMオブジェクトを作ってあげて、urlにファイルのダウンロード先を指して、`click`メソッドを呼び出してあげれば実現できます。
ただしこれは認証がcookieでやられていたなら。

```js
 let anchor = document.createElement("a");
 anchor.href = url;
 anchor.click();
```

## Xhrで取得してダウンロードする
認証がheaderに要素を付与して行うものだったら↑のanchor.hrefにダウンロード先をさしても認証されずに弾かれてしまいますね。
なのでxhrでheaderにトークンなりをつけて通信しましょう。
今回はfetchAPIでサンプルを書きました。

```js
fetch("ダウンロード先", { method: 'GET', headers: new Headers([["auth-token", authToken]])}).then(response => response.blob()).then(blob => {
 let anchor = document.createElement("a");
 anchor.href = window.URL.createObjectURL(blob);
 anchor.click();
})
```

### ポイント
- レスポンスのbodyはBlobとして使おう
	- fetchAPIなら`blob()`でできますね。
	- axiosや生xhr,jqueryAjaxなら`responseType`を`blob`にしてあげましょう。オプション引数なりで渡せます

### 筆者がつまってたとこ
 私はライブラリ[xhr](https://www.npmjs.com/package/xhr)を使ってたところ、ダウンロードしたファイルの文字コードがサーバサイドが送ってるのと別になって唸ってました。
 
```js
xhr({method: "GET",
    uri: "ダウンロード先",
    headers: {
        "auth-token": authToken
    }}, (err, response, body) => {
 	const blob = new Blob([ content ], { "type" : type });
 	let anchor = document.createElement("a");
    anchor.href = window.URL.createObjectURL(blob);
    anchor.click();
});
 ```
 
 
それもそのはず、ブラウザ提供のxhrの[仕様](https://developer.mozilla.org/ja/docs/Web/API/XMLHttpRequest)ではレスポンスのデータ型はコントロールすることができ、私の使っていたライブラリxhrではデフォルトで`text`という指定になっており、JavaScriptの文字列として扱うようになってました。

JavaScriptの文字列に一度なったら文字コードは`UTF-16`になってしまいダウンロードをしても意図しない文字コードとなっていました。

そこでレスポンスを`blob`として扱うようにしたところ、無駄にJavaScript文字列にならなくなったので意図した文字コードでダウンロードできましたということです。
Dockerの全Image,全Layerを保存するワンライナー

## コマンド
- `docker save -o ~/caches/app.tar $(docker image ls -q | xargs -I XXX  docker history -q XXX |grep -v \<missing\> | tr '\n' ' ')`

## 解説
- `docker save -o ~/caches/app.tar`
	- `docker save` dockerのimageをtarに保存
	- `-o` オプションは`output`オプションで指定した場所に保存する、今回は `~/caches/app.tar`に保存
- `$(docker image ls -q | xargs -I XXX docker history -q XXX | grep -v \<missing\> | tr '\n' ' ')`
	- `docker image ls` はimageのリストを表示する
	- `-q` オプションはIDのみを表示する
	- `xargs -I XXX docker history -q XXX` 
		- `docker image ls -q`で取得したImageのIDをパイプで`xargs -I XXX`に渡し、`XXX``docker history -q XXX`の引数に渡している
		- `docker history`はdocker image履歴を取得するコマンド
		- `-q` オプションはIDのみを表示する
	- `grep -v \<missing\>`
		- は履歴の中から `<missing>` を除去
	- ` tr '\n' ' '` 
		- `docker history`の出力が改行区切りで返ってくるので、スペース区切りに変換
-`$(docker image ls -q | xargs -I XXX docker history -q XXX | grep -v \<missing\> | tr '\n' ' ')` dockerの全layerのidを`docker save`の引数にしている。

## 経緯
- Circle CIでテストする時にdockerのimageを`save_cache`機能でcircleCI保存して、次回build時はdockerのcacheを再利用するために保存したかった。
- docker-composeを利用して複数コンテナを利用しているので、CI環境にある全部のimageのlayerを保存する必要があった。

## おわりに
- CI環境のcache保存するために利用しているけど、他の人に自分が持っているdockerの環境を全部渡すためにも利用できるかもしれない。

## 参考
- docker save
	- https://docs.docker.com/engine/reference/commandline/save/
- docker image  
	- https://docs.docker.com/engine/reference/commandline/image/
- docker history
	- https://docs.docker.com/engine/reference/commandline/history/  
- xargs のオプションいろいろ 
	- https://qiita.com/hitode7456/items/6ba8e2d58f9b8db9de11
- Pulling build cache
	- https://github.com/moby/moby/issues/20316#issuecomment-221388885
- circle CI
	- https://qiita.com/na-o-ys/items/7e7a7e4cde378fc54b32