OmniAICreator/Qiita-1.07M huggingface dataset:
2018年リリース予定のIonic v4について

この記事は [Ionic Advent Calendar 2017](https://qiita.com/advent-calendar/2017/ionic) の初日の記事です。

こんにちは、榊原です。
今年は、[Ionic Meetupを東京・大阪で3回行いまして](https://ionic-jp.connpass.com/)、何となく国内でも使ってる人の顔が見えてきました。[来年には書籍もでるので](http://amzn.to/2i4DJAt)、2018年には爆発的に広がっていくのではないでしょうか（希望的観測）。

2018年といえば、Ionic v4もリリース予定です。Ionicが採用しているAngularがSemVerを採用しているので、Ionicもそれに追随する形で定期的にバージョンを重ねてきています。

| バージョン | リリース時期 | 
|:-----------|:------------|
| Ionic 2.0.0 | 2017年1月25日 |
| Ionic 3.0.0 | 2017年4月5日 |
| Ionic 4.0.0 | 2018年夏 |

Ionic v4ではどういう変更があるのか、どういうメリットがあるのかをみていこうと思います。

# Web Componentsベース
AngularのCustom Componentsベースではなく、HTML5の規格であるWeb Componentsベースで構築されることになりました。各ComponentsでLazyLoadingに対応し、またファイルサイズも小さくなることからかなりの高速化が実現されるようです。Ionic IconもWeb Componentsベースに生まれ変わります！

これによって、IonicのComponentsをIonic以外でも利用できるようになります。実際に、Reactベースのカンファレンスアプリが[ionic-team/ionic-react-conference-app](https://github.com/ionic-team/ionic-react-conference-app)で公開されています。

~~ただ、Ionic teamは`ionic-angular`のようなReactやVue向けライブラリは用意するつもりはないと言っていますので、`<ion-button>`などの単純なUIパーツだけに留まらず、`<ion-tabs>`であったり無限スクロールなどのAPIまで実案件で採用するならかなり険しい道になりそうです。~~

React、Vue.jsのサポートが発表されました。Web Componentsとフレームワークをつなぐラッパーは提供されます。ただ、CLIについては未発表です。

# Server Side Rendering (SSR)のサポート
Angular CLIがSSRを実装したので後追いとなってしまいましたが、Ionic v4でSSRを実装する予定です。こちらはもう実装は完了しているようです。

# Ionic v4に備える
Ionic v4は、`core`というブランチ名で開発が進んでいます。

https://github.com/ionic-team/ionic/tree/core

そこに、BREAKING.md（破壊的変更）があり多くの項目が挙げられていますが、対応はさほど難しくなさそうです。
例えば `<button ion-button>`が`<ion-button>`になったり、`icon-left`が`slot="start"`になるような一括置き換えでほとんど対応ができる項目がほとんどです。リリースされましたら、一括置き換えのための正誤表をつくる予定なので、それを利用いただいたらよほど複雑なアプリ以外は、30分もかからず対応できると思います。

v4に備えるという意味では、v3の最新版に追随しておくというのが一番有効です。

- まだv2をつかっている人は、早々にv3にあげてください。v2=>v4はやることが多いのでつらい作業になります
- v3でも、3.9.0以前のものをお使いの方は最新版にあげてください。DependenceがAngular 4からAngular 5へアップデートされています。
- HttpModuleをお使いの方は、HttpClientModuleに置き換えてください。やがて使えなくなります。

Web Componentsベースで開発するためのライブラリ「Stencil」をつくったり、またIonic Dev Appsという実機でライブリロード開発できるアプリを出したりと、早いサイクルで多くの取り組みが行われていますので、2018年もIonicは面白くなりそうです。

それでは、また。
ファイル名をリスト化する

度々忘れるので自分のためのメモ書き

機械学習とかに必要なデータの処理やなんかでデータフォルダ内のファイル名一覧が欲しい場合があるのでそのためのコマンド
普段からコマンド使い慣れてる人はわざわざ見るまでもない

```
find ./data/ -type f > list.txt
```
PermissionsDispatcherを使ったMパーミッション


こちらの記事を参考にしました。
https://qiita.com/kazy/items/0ded30d80cef9df54c98


PermissionsDispatcherを使ったMパーミッション対応のスニペットです。
PermissionsDispatcherを使うための準備は省略しているので事前準備は各自行ってください。


```java
import android.Manifest;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.widget.Toast;

import permissions.dispatcher.NeedsPermission;
import permissions.dispatcher.OnNeverAskAgain;
import permissions.dispatcher.OnShowRationale;
import permissions.dispatcher.PermissionRequest;
import permissions.dispatcher.RuntimePermissions;
/*
 * 例として READ_EXTERNAL_STORAGE のMパーミッション対応を行います。
 * Mパーミッション実装のためにPermissonDispatcherを利用しています。
*/
@RuntimePermissions
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        MainActivityPermissionsDispatcher.grantedWithPermissionCheck(this);
    }

    // 許可した場合
    @NeedsPermission(Manifest.permission.READ_EXTERNAL_STORAGE)
    void granted() {
		Log.d(TAG, "onRequestPermissionsResult:GRANTED");
		// TODO 許可されたのでストレージにアクセスする
    }

    // 絶対に許可しない状態
    @OnNeverAskAgain(Manifest.permission.READ_EXTERNAL_STORAGE)
    void onNeverAskAgain() {
        Log.d(TAG, "onRequestPermissionsResult:DENYED");
    }

    // 許可しない状態中にパーミッションチェックを行うと呼ばれる
    @OnShowRationale(Manifest.permission.READ_EXTERNAL_STORAGE)
    void onShowRationale(final PermissionRequest request) {
		Log.d(TAG, "shouldShowRequestPermissionRationale:追加説明");

        new AlertDialog.Builder(this)
                .setTitle("警告")
                .setMessage("ストレージの権限を許可しないとサムネイルを取得することが出来ません。アプリを使いたい場合は許可して下さい。")
                .setPositiveButton("OK", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        // パーミッション許可ダイアログ
                        request.proceed();
                    }
                })
                .setNegativeButton("Cancel", null)
                .show();
    }

    // リクエストを受け取る
    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
		Log.d(TAG, "onRequestPermissionsResult:結果を受け取る");
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        MainActivityPermissionsDispatcher.onRequestPermissionsResult(this, requestCode, grantResults);
    }

}
```

動きは以下の通り。

許可した場合
1. PermissionsDispatcher.grantPermissionCheck()メソッドで現在の権限の有無を確認する
1. grant()メソッドを呼び出す

許可しない場合
1. PermissionsDispatcher.grantPermissionCheck()メソッドで現在の権限の有無を確認する
2. onRequestPermissionsResult()メソッドでリクエスト結果を受け取る

許可しない場合(OnShowRationaleを実装した場合)
1. PermissionsDispatcher.grantPermissionCheck()メソッドで現在の権限の有無を確認する
2. onShowRationale()メソッドを呼出す


絶対に許可しない場合
1. PermissionsDispatcher.grantPermissionCheck()メソッドで現在の権限の有無を確認する
2. onNeverAskAgain()メソッドを呼出す
3. onRequestPermissionsResult()メソッドでリクエスト結果を受け取る


ご指摘あればコメント下さい。
xmas_tree

[mwedアドベントカレンダー](https://qiita.com/advent-calendar/2017/mwed)15日目の記事です。

`tree`コマンドの結果がチカチカしたら`xmas_tree`:christmas_tree:なのでは?!

![image.png](https://qiita-image-store.s3.amazonaws.com/0/14380/339f012e-1aef-bab1-3963-38c5906d5b98.png)

## perl版

```bash:xmas_tree_perl.sh
function xmas_tree () {
  tree $* | perl -ne '
  binmode(STDOUT, ":utf8");
  utf8::decode($_);
  @string = split //, $_;
  foreach $char(@string) {
    $r = int(rand(15)) ;
    if($r == 1){
      $s = "\e[5m\e[37m";
      $e = "\e[m\e[m";
    } elsif ($r == 2) {
      $s = "\e[5m\e[35m";
      $e = "\e[m\e[m";
    } elsif ($r == 3) {
      $s = "\e[5m\e[33m";
      $e = "\e[m\e[m";
    } elsif ($r == 4) {
      $s = "\e[5m\e[31m";
      $e = "\e[m\e[m";
    } else {
      $s = "\e[32m";
      $e = "\e[m";
    }
    print "$s$char$e";
  }
  '
}
```

## ruby版

```bash:xmas_tree_ruby.sh
function xmas_tree {
  tree $* | ruby -ne '
    string = $_.split ""
    string.each do |char|
      case rand(15)
  	when 1 then
  	  s = "\e[5m\e[37m"
        e = "\e[m\e[m"
      when 2 then
        s = "\e[5m\e[35m"
        e = "\e[m\e[m"
      when 3 then
        s = "\e[5m\e[33m"
        e = "\e[m\e[m"
      when 4 then
        s = "\e[5m\e[31m"
        e = "\e[m\e[m"
      else
        s = "\e[32m"
        e = "\e[m"
  	end
      print "#{s}#{char}#{e}"
    end
  '
}
```

## 使い方
コンソールにペタッ！
実行！

https://asciinema.org/a/luY3tCrVJTi4JLhBuFef4jGQm

## 動かない？
### `tree`コマンドがない？
Macにはデフォルトでインストールされてないので、適宜インストールしてくださいまし。便利ですよ。
[homebrew](https://brew.sh/index_ja.html)を使っていれば`brew install tree`でインストールできます。

### チカチカしない？
コンソールの設定でBLINKしないようになっているものもありますので、適宜設定を変えてくださいまし。

## 最後に
くだらなくてすみません :bow: :bow: :bow: 

明日は[@HamaguchiRyosuke](https://qiita.com/HamaguchiRyosuke)さんの「新卒同期5人でHackDayのハッカソンに参加してみた」です。
英語苦手なデザイナーにSlack使わせた話

[DMM.com #2 Advent Calendar 2017](https://qiita.com/advent-calendar/2017/dmm2)　1日目を担当させていただきます。
普段はDMM.comでデザイン業務を行っており、Slackのemojiで大喜利するのが日々の癒やしです。よろしくお願いします。

**カレンダーのURLはコチラ**
[DMM.com #1 Advent Calendar 2017](https://qiita.com/advent-calendar/2017/dmm)
[DMM.com #2 Advent Calendar 2017](https://qiita.com/advent-calendar/2017/dmm2)

#DMMがSlackEnterpriseGridを導入したよ
##という話はしません
その辺の詳しい事情は[社内ブログ](https://inside.dmm.com/entry/2017/11/02-dmmlabotech-slackEG)に任せるとしてその前段のお話をします。

##Skypeつらい
社内コミュニケーションツールで長らくSkypeを利用していたのですが、社員の数が増えてくるに伴って全体周知やグループへの情報伝達で抜け漏れが出たり、メンションが飛ばせず「それ誰に言ってるの？」状態だったりと、コミュニケーションコストが増大していました。
そんな中、Slackの存在を[usagi-f](https://qiita.com/usagi-f)さんに教えてもらい、まずは小さな成功事例を生み出そうということで、デザインで業務内容をシェアしているメンバーで試験的に使ってみることに。

##チームからグループへ
1ヶ月ほど使ってみて、「少なくともSkypeより全然いいぞ」という感想が全員から上がりました。
ただ、同時に「英語のツールなので導入時は少し怖かった。席が近いから色々聞けてよかった。」という声もあったので、Slack怖くないよ！こうやって使うだけだよ！っていう資料を作ってデザイングループ内に少しずつ広めていきました。
※最近のアップデートでSlackは日本語対応となりました。

##社内啓蒙のお手伝い
社内技術共有会で、Slackはいいものだ〜。説明資料も作ったから試してみてね！といった内容をLTしました。
その甲斐あって社内の人から使い心地や使い方を聞かれるようになり、非公式ながら徐々にSlackユーザーが増えていったように感じていました。
この時は社内公認ツールになるなんて思っていませんでしたが…。

#Slackのゆる〜い取組みの一部をご紹介
##意識低いデザイナーチャンネル
そんなこんなで全社にSlackが導入されて、職種の違う人間たちがコラボレーションをしていく中で様々な文化も生まれてきます。
皆さん日々の仕事に潤いを与えるためにいろいろな試行錯誤をしていますが、個人的に気に入っているのはこのチャンネル。

![ikihunn.png](https://qiita-image-store.s3.amazonaws.com/0/211275/ae0d6ad5-d73c-f7bc-6616-34f0a4ecf1bc.png)

デザインの技術情報を共有するチャンネルは他にもあるのですが、デザイナーだけでも100人を超える中で英語の記事や高尚な内容も多く、投稿のハードルが高いという声が上がりチャンネル名もこんな感じになりました。
実際のところ中のメンバーはあまり変わらないのですが、皆優しいので承認欲求がみるみる満たされていきます。

今年も優しいエンジニアやデザイナーに支えられて生き延びられました。ありがとうございます！
明日は[@yuzooho](https://qiita.com/yuzooho)さんです。
EC2に割り当てられたIAM Roleのcredential情報からAccessKeyId, SecretAccesskeyを取得するgulp task 

# EC2インスタンスに割り当てられたIAM Role権限で、EC2上でgulp.taskを動作させる場合の一時AccessKeyId, SecretAccessKeyの取得方法.

gulpの拡張タスクなどで、accessKeyId, SecretAccessKeyを指定するよう要求されるtaskがあります。IAM ユーザとしてアクセスキー等が発行されていない場合でも、EC2インスタンスに割り当てられたIAM Roleから一時アクセスキーを取得し、実行することができるようになります。

```
var AWS = require("aws-sdk");

gulp.task('updateCredentials', function() {
  return new Promise((resolve, reject)=>{
    var metadata = new AWS.MetadataService();
      metadata.request('/latest/meta-data/iam/security-credentials/',function(err,rolename){
        if(err) reject(err);
        // console.log(rolename);
        metadata.request('/latest/meta-data/iam/security-credentials/'+rolename,function(err,data) {
          if(err) reject(err);
          // console.log(data);
          var credentials = JSON.parse(data);
          AWS.config.update({
            accessKey: credentials.AccessKeyId,
            secretAccessKey: credentials.SecretAccessKey,
            sessionToken: credentials.Token,
          });
          console.log('update credentials.');
          resolve();
        });
    });
  });
});
```

gulpで直せすaccessKeyId, SecretAccessKeyを参照する必要がない場合は、以下のような方法で
credentialsを更新します。

```
gulp.task('updateCredentialsEC2', function() {
  AWS.config.credentials = new AWS.EC2MetadataCredentials({
    // httpOptions: { timeout: 5000 }, // 5 second timeout
    // maxRetries: 10, // retry 10 times
    // retryDelayOptions: { base: 200 } // see AWS.Config for information
  });
  AWS.config.credentials.refresh(function() {
    return Promise.resolve();
  });
});
```
Unity2017.2f3でのTangoサポートはどこに消えた？

Unity 2017.2 Beta時にはTangoがサポートされる筈であった。
正式版 2017.2（今はf3）では、TangoがARCoreに置き換わってしまった。
ARCoreにTangoが統合されない限り、Zenfone ARでのAR開発はAndroidStudio経由とならざるを得ないのだろうか？

![unity2017_2_xrsetting.PNG](https://qiita-image-store.s3.amazonaws.com/0/101611/5cc8d0fc-7a1d-ae8a-918c-61da36338886.png)


(2017年12月19日(火)追記）
[Tango終了の正式なお知らせ](https://blog.google/products/google-vr/arcore-developer-preview-2/)

(2017年12月20日(水)追記)
[Zenfone ARでのARCoreサポートについてのGoogleからの言及（赤字部分）](https://developers.google.com/tango/)

(2018年2月26日(月)追記)
[ARCore1.0でZenfone ARサポートとされる]
(https://developers.google.com/ar/discover/#supported_devices)
mac os x のfinder のマイナーなキーバインド

Mac OS X のファインダーの知られてなさ気なキーバインドをまとめ

| キーバインド      |       動作 |
|:-----------------|:------------------|
|return|ファイル、フォルダのリネーム|
| ⌘ + ↑|一つ上のフォルダへ|
| ⌘ + opt + ↑|一つ上のフォルダへ(ファインダーウィンドウを新しく開き、現在のウィンドウを消す)|
| ⌘ + ctrl + ↑|一つ上のフォルダへ(ファインダーウィンドウを新しく開き、現在のウィンドウを残す)|
| ⌘ + ↓|フォルダを選択してればそのフォルダの中へ。ファイルなら実行|
| ⌘ + delete|ファイルを削除（ゴミ箱に）|
| ⌘ + [|履歴戻る|
| ⌘ + ]|履歴進む|
| opt + ↑ |ファインダー内の最上段のファイルを選択|
| opt + ↓ |ファインダー内の最下段のファイルを選択|
| opt + [英数字] | [英数字]で始まる(ないときはその次の)名前のファイルを選択 |
| opt + tab | 辞書順に選択を移動 |
| opt + shift + tab | 辞書の逆順に選択を移動 |
| fn + ↑ | ファインダーをページアップ(ファイル選択はしない) |
| fn + ↓ | ファインダーをページダウン(ファイル選択はしない) |
| fn + → | ファインダー最上段へスクロール(ファイル選択はしない) |
| fn + ← | ファインダー最下段へスクロール(ファイル選択はしない) |
| fn + ctrl + → | ファインダー最上段へ移動(ファイル選択はしない) |
| fn + ctrl + ← | ファインダー最下段へ移動(ファイル選択はしない) |
xgd-openのエラー

UbuntuでCUI上で操作しているフォルダをGUIで表示したい時などに以下のコマンドを使いますね

```
$ xgd-open .
```

そうするとこんなエラーが！

```
Nautilus-Share-Message: Called "net usershare info" but it failed: Failed to execute child process “net” (No such file or directory)
```

NautilusはNetコマンドを使って`net usershare info`を叩きます。これがないので、以下でインストール

```
sudo apt install samba-common-bin
```

そうするとまたエラーが・・

```
Nautilus-Share-Message: Called "net usershare info" but it failed: 'net usershare' returned error 255: net usershare: cannot open usershare directory /var/lib/samba/usershares. Error No such file or directory
Please ask your system administrator to enable user sharing.
```

`/var/lib/samba/usershares`がないと言っているので、作ってあげる。

```
sudo mkdir -p /var/lib/samba/usershares
```

これでエラーが出なくなった！
TinkerBoard 起動不良

[質問] TinkerBoard 起動不良

最近TinkerBoardを購入し、OS(debian)を
mSDに書込み起動したのですが、
起動中に落ちてしまいます。

画面に何か表示されるのですが、
一瞬で消えてしまい、解読不能です。

何か分かる方いらっしゃいましたら
教えて下さい。
VaporでSQLiteを使う


Server Side VaporでSQLiteを使う方法をみていきます。


# 実行環境

* Vapor Toolbox: 3.1.2
* Vapor Framework: 2.4.0

# サンプルプロジェクトを作成

とりあえずプロジェクトを作ってみます。

```
$ vapor new Pet --api
$ cd Pet
```

# DBをメモリーからSQLiteに変更する。

`vapor new`で作られたプロジェクトではデフォルトでDBの向き先が`memory`になっています。
これをSQLite用に書き換えます。
fluent.jsonを更新します。

```
Pets/Config/fluent.json
```

`driver`キーを`memory`から`sqlite`に変更します。

```json
    "driver": "sqlite"
```

さらにSQLite用の設定ファイルを作成します。fluent.jsonと同じ階層に`sqlite.json`というファイルを作成します。
`path`というキーでsqliteファイルの保存先を指定します。

```json

{
    "path": "./database.sqlite"
}

```

これでDBの向き先がSQLiteに変わりました。

# 試してみる

VaporのCLIコマンドを使ってアプリをビルドします。

```
$ vapor build
```

デフォルトで設定されているDB用の初期化コマンドオプション`prepare`を実行します。
その後、アプリケーションを実行します。

```
$ vapor run prepare
$ vapor run
```

アプリが立ち上がったらcurlを叩いてみます。
(私はポストマンを使いました）

bodyデータに適切なjsonをPOSTすると登録されます。

![ 2017-12-01 9.59.22.jpg](https://qiita-image-store.s3.amazonaws.com/0/31587/62657ee9-92cf-c5c7-159d-f136946d12cb.jpeg " 2017-12-01 9.59.22.jpg")
jsdoでbpmn その4

#概要
jsdoでbpmnやってみた。
モデルをsvgでエクスポートしてみた。


#写真
![image.png](https://qiita-image-store.s3.amazonaws.com/0/18104/a2bda392-1a3b-084c-3058-81fd147049a3.png)


#成果物
http://jsdo.it/ohisama1/sWuK

以上。
楽しいモブプロ♪

この記事は移行しました！[最新の内容はこちら](https://naoqoo2.github.io/blog/%E6%A5%BD%E3%81%97%E3%81%84%E3%83%A2%E3%83%96%E3%83%97%E3%83%AD/)をご覧ください😀

今年も始まりました！エンジニアの祭典アドベントカレンダー！祭りです！
しかしながらこのモブプロカレンダーはまだまだ空きがあります！
是非みなさんのモブトーーク！聞かせてください！
モブプロ盛り上げていきましょう！祭りだ！わっしょい！


さて、記念すべき1日目は、モブプロの楽しさについてのみお届けしたいと思います！

## 楽しいは正義

みなさん、仕事楽しいですか？
そうですね。つまらないと思ってる人や辛いとさえ感じている人もいることでしょう。
でもやるしかない。。。
どうせやるなら楽しいほうがいいですよね！そこでモブプロですよ。

モブプロは全員で1つのPCを使って開発を行いますが、何事もみんなでやると楽しいですよね！
つまりそういうことです！

## 人数と楽しさは比例する

野球を例に考えてみましょう。

![モブプロの楽しさを図解するbaseball.png](https://qiita-image-store.s3.amazonaws.com/0/56789/3d32cd3a-f017-0346-276f-828c64c341b2.png)

ひとりだと素振りしかできずつまらないですが、
ふたりいるとキャッチボールができて、
みんないれば試合ができます。たーのしー！

野球はやらないよ。という人のためにサッカーでも。

![モブプロの楽しさを図解するsoccer.png](https://qiita-image-store.s3.amazonaws.com/0/56789/21488468-fac8-ee60-ce87-32b948004dc8.png)

ひとりだとリフティングしかできずつまらないですが、
ふたりいると一対一ができて、
みんないればこれまた試合ができます。たーのしー！

てなわけで本題のプログラミングも。

![モブプロの楽しさを図解するpc.png](https://qiita-image-store.s3.amazonaws.com/0/56789/bb1e952a-c6db-8ac4-8016-1361db4332c2.png)

ひとりだとソロプロでつまらないですが、
ふたりだとペアプロができ、
みんなでやれば楽しいモブプロ！

## まとめ

モブプロはとにかく楽しい！
楽しいは正義！

![モブプロの楽しさを図解する.png](https://qiita-image-store.s3.amazonaws.com/0/56789/4b8d8319-27eb-7de6-d432-ab24786e1adb.png)


## さいごに

いかがでしたでしょうか。
実際にはモブプロは楽しいだけでなく、

- スキルや経緯が自然に共有できる
- レビューなどの時間が不要になる
- 心理的安全性

などなど様々なメリットがあります。

まだモブプロしたことない方はぜひ体験してみてください！
TAKAKING22さんによる[モブプログラミングスタートアップマニュアル](https://speakerdeck.com/takaking22/mob-programming-startup-manual-number-mobprogramming-number-mobupuro) あります。
『パーフェクトPHP』をデバッグしました

パーフェクトPHP **「フレームワーク サンプルコード」のデバッグです。**

# サイト
- [パーフェクトPHP デバッグ (処理の流れ)](https://perfectphp-debug.netlify.com/debug-02-1.html)
- [パーフェクトPHP デバッグ (チェックポイント)](https://perfectphp-debug.netlify.com/debug-01.html)
- [【動画】パーフェクトPHP をデバッグしました (デバッグ例 基本編) オートロード](https://youtu.be/F-QJCXH2Xm0)
- [【動画】パーフェクトPHP をデバッグしました (デバッグ例 応用編) CSRF対策](https://youtu.be/htohdTY26D0)
- [【動画】パーフェクトPHP をデバッグしました (デバッグ例 応用編) アウトプットバッファリング](https://youtu.be/U58DL8_iAvI)
- [【動画】パーフェクトPHP をデバッグしました (デバッグ例 応用編) DbManagerクラス](https://youtu.be/najYeNBB1xM)


### パーフェクトPHP デバッグ

ネット上では、『パーフェクトPHP』に関して、読後感、学習方法、目次などがありますが、
本格的な **解説** をしているサイトは ~~[１つ](http://phpbook.w3c.tokyo/perfect/index7.html)~~ だけです。

パーフェクトPHP デバッグ が、２つ目のサイトです。

### 動画 (**IDE デバッグ機能**)

**「写経」はおすすめしません。**
実際に、**IDE デバッグ機能** を使ってみると、
このサンプルコードには、写経がいかに 無意味 であるか分かります。


# 学習方法 等
- [パーフェクトPHP をデバッグしました (学習方法)](https://beginner001.hatenablog.com/entry/2018/12/27/100003)
- [パーフェクトPHP をデバッグしました (やる気のある初心者)](https://beginner001.hatenablog.com/entry/2018/12/27/100004)

# 「処理の流れ」と「変数の値」
## 例 処理の流れ | ユーザ登録機能作成

パーフェクトPHP デバッグ には、**複数** (5パターン) の **処理の流れ** があります。

処理の流れ (1/5) | ユーザ登録機能作成
の スクリーンショットです。

![perfect-php_処理の流れ_ ユーザ登録機能作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217511/07218966-530c-aae1-d242-885d3db82cf1.png)
[備忘録]visualstudio2015 mysqlのデータセット作成時のエラー

端末を移行して開発環境再構築時に詰まったので備忘録として残します。

##困ったこと
visualstudio2015でmysql経由でデータセットを作成するときに
最後のテーブルアダプター追加時に謎のnull referenceでエラーになった。
※移行前はvisualstudio2013を使っていた

その時のmysql-connector-netのバージョン
6.10.4

##対応
インストールミスってるのかと思い、再インストールしてみたりしたが直らないので
調べてみると、mysqlのフォーラムからこんなのを発見
https://forums.mysql.com/read.php?174,648619,649199#msg-649199

どうやら「6.9.8」じゃないと動かないらしい…

試しに入れてみるとすんなり作成できました。


##原因
謎＾＾
mysqlのバグなんでしょうか？
結構時間取られてしまった…

##追記
↑のフォーラムでは
MySQL for Visual Studio 1.2.6
と書いてますが、
「1.2.7」でもいけたので、Connector/Net側だけ再インストールすればOK


今さらvs2015で環境再構築する人も少ないでしょうけど、一応同じ現象で困ってる人がいたら…

##追記2 2018.01.05
vs2017でも同じ現象が発生したので、上記同様Connector/Netの再インストールを…
こちらは詳しく検証したわけではないのですが一応


同じ現象で違う解決策見つけられた方がいらっしゃいましたら教えて頂けるとありがたいです。
gitでコミットする時There was a problem with the editor 'vi' エラー解決法

Mac環境でオプションなしgitコミットする時、以下のエラーが出る時があります。

```
error: There was a problem with the editor 'vi'.
Please supply the message using either -m or -F option.
```
どうやらvundleを使う時、vimrcをHPの勧めた通り設定したらエラーが出るらしいです（[ソース](https://github.com/VundleVim/Vundle.vim/issues/167)）

解決法

```
git config --global core.editor /usr/bin/vim
```

gitのデフォルトエディターであるviを呼び出す時、Macは代わりにvimを使います。ここでは直接デフォルトエディターをvimにしたらエラーを解消できました。
vimの居場所が```/usr/bin/```にない場合

```
git config --global core.editor $(which vim)
```
whichを使って取ってきます。
ちなみに

```
$ vim --version                                                                                                       
VIM - Vi IMproved 8.0 (2016 Sep 12, compiled Oct 17 2017 11:21:47)
MacOS X (unix) version
```
divでdtとddをグルーピングできる

最新のHTML（2017年12月3日版）の仕様では、divでdtとddをグルーピングできる。

> In order to annotate groups with microdata attributes, or other global attributes that apply to whole groups, or just for styling purposes, each group in a dl element can be wrapped in a div element. This does not change the semantics of the dl element.

― [HTML Standard - 4.4.9 The dl element](https://html.spec.whatwg.org/multipage/grouping-content.html#the-dl-element)

## 例

```html
<dl>
  <div>
    <dt>名前</dt>
    <dd>浅田真央</dd>
  </div>
  <div>
    <dt>生年月日</dt>
    <dd>1990年9月25日</dd>
  </div>
  <div>
    <dt>出生地</dt>
    <dd>愛知県名古屋市</dd>
  </div>
</dl>
```
【MarkLogic Server】XQueryチューニングメモ～処理結果を一旦変数に確保して使い回す

はじめに
===
一度行った検索結果や演算を何度も使う場合は、その内容を一旦変数に格納しておき、そこから使いまわすのはよくある手法かと思います。今回はMarkLogicにおけるXQueryでその例を示しましょう。

ループ内で何度も使われる処理は、ループ手前に移動する
===
以下のXQueryを見てみましょう。

```
・・・
for $uri in $uri-seq
  let $flg := cts:search(/*, cts:document-query("/r/setting.xml"))
  let $map := map:map()
  let $_ := 
    for $i in $flg/repeat
    return map:put($map, $flg/key/text(), $flg/value/text())
  let $doc := cts:search(/*, cts:document-query($uri))
  let $shopState := map:put($map, $doc/state/text())
・・・
```

このソースコードでは、/r/setting.xmlに対する検索をループ内で何度も行うことになります。この検索にかかわる部分をループ前に切り出してあげましょう。

```
・・・
let $flg := cts:search(/*, cts:document-query("/r/setting.xml"))
let $map := map:map()
let $_ := 
  for $i in $flg/repeat
  return map:put($map, $flg/key/text(), $flg/value/text())
for $uri in $uri-seq
  let $doc := cts:search(/*, cts:document-query($uri))
  let $shopState := map:put($map, $doc/state/text())
・・・
```
/r/setting.xmlに対する検索は1回だけになり、ディスクアクセスが緩和されます。

フィボナッチ数列計算を例にした再帰関数の変更例
===
上記のように、一度計算した結果を再利用するプログラミング手法として動的計画法という考えがあります。以下はフィボナッチ数列F_(n+2) = F_n+ F_(n+1) (n≧0), F_0=0, F_1=1の計算を行う再帰関数と動的計画法適用例です。

☆再帰関数
数学の漸化式は、再帰関数によって計算できます。F30を求めるためにはF29とF28が必要であり、F29を求めるためには・・・とトップダウンから計算を始めていきます。

```
declare function local:outer-func($n as xs:integer){
  if($n = 0) then 0
  else if($n = 1) then 1
  else local:outer-func($n - 2) + local:outer-func($n - 1)
};
```

☆動的計画法
F0とF1からF2を求める、このとき保持しておいたF1とF2からF3を求める・・・というボトムアップに計算を進めていく手法です。

```
declare function local:dp-func($n as xs:integer){
  if($n = 0) then 0
  else if($n = 1) then 1
  else (
    let $f0 := 0
    let $f1 := 1
    let $fn := 1
    let $_ := 
      for $i in (2 to $n)
        let $_ := xdmp:set($fn, $f0 + $f1)
        let $tmp := $f0
        let _ := xdmp:set($f0, $f1)
        let _ := xdmp:set($f1, $tmp + $f1)
        return ()
    return $fn
  )
};
```

試しに手元のPCでクエリコンソール上で30番目のフィボナッチ数(832040)の計算をProfile実行したところ、再帰関数が13秒だったのに動的計画法は0秒(測定不可能)でした。

このような差が出る理由は再帰関数が個々の結果を共有せず何度も同じF0+F1という基底状態の足し算を行っているからです。計算量は指数関数オーダーとなります。
これに対して動的計画法はより大きなフィボナッチ数を計算するための情報はきちんと保持して再利用しています。MarkLogicではxdmp:setという関数でループ内の変数更新をサポートしています。計算量は線形時間オーダーです。

おわりに
===
ループ内での処理を外側に出すのはそれほど難しいことではありませんね。チューニング以前にルールとして習慣づけておきたいところです。
動的計画法そのものは適用する場面がそれほどないかもしれませんが、基本的な考えは結果を保持して再利用するというものです。XQueryで再帰関数を含むプロシージャを組む場合は一考の価値がありそうです。


```math
\def\textsmall#1{%
  {\rm\scriptsize #1}
}
```

------------------------------------------------------------------------

**免責事項**

​​​​​$\textsmall{当ユーザ会は本文書及びその内容に関して、いかなる保証もするものではありません。}$
​​​​​$\textsmall{万一、本文書の内容に誤りがあった場合でも当ユーザ会は一切責任を負いかねます。}$
​​​​​$\textsmall{また、本文書に記載されている事項は予告なしに変更または削除されることがありますので、予めご了承ください。}$
勉強会で得られる大切なもの

[猫社員の居る会社](https://togetter.com/li/834640)で有名な [qnote](https://www.qnote.co.jp/) のアドベントカレンダー1日目担当の繁田です。

初回は「勉強会で得られる大切なもの」ということで直接的なテクノロジーなお話ではなく、やや技術論的なお話になります。なお、お話に猫は出てきません:no_good:

# 勉強会行ってますか？
　皆さん、勉強会には参加されていますでしょうか。勉強会と言っても様々なタイプのものがあり、大きなものであれば数千人規模のカンファレンスなどは年に数回程度、また中規模のテーマを絞ったセミナー形式のものや、小さなものでは数十人のLT会や、10人程度のもくもく会やなどは毎月数十回程度開催されています。これらの勉強会にどれも共通して言えるのは「情報がほしい、教わりたい」と思う人達が積極的に集まる場として、ポジティブな空気がある、ということだと思います。義務教育や大学のように単位を取るために嫌々参加している人などは殆ど居ません。
　それが故に意識の高い場として敬遠されがちですが、逆に少しでも知識を得たいという人にとってはとても有益な場所だと言えます。

# わざわざ勉強会に行ってまで？
　「わざわざ勉強会に行かなくても家で本読んだり検索サイトで調べれば知識は入るんじゃないの？」というのは行かない人の言い分としてよく聞きます。たしかにネット上をくまなく調べればほとんどの技術情報は手にはいりますし、独学でも高い技術を持っている人は多いです。ただ、本稿のタイトルにもあるように、勉強会のその場その時でなければ得られないものは確実にあります。それはネット上の情報だけではなかなか手に入らないものです。

# 現場でしか得られないもの
　もったいぶるほどの事ではないので早速答えを。私が勉強会が大事だと思うのは、**その場の空気を感じ取ること**だと思っています。特に登壇者の居るタイプの勉強会では、登壇者の言葉に対する参加者達の反応を読み取ることです。え？登壇者よりも参加者の反応？と思うかもしれませんが、例えば登壇者が開発の現場でのあるあるネタを話したとします。この時、参加者たちの笑いやうなずきなどの仕草などが見られると思いますが、大事なのはまさにこの瞬間で、これを読み取り感じ取ることこそが「勉強会で得られる大切なもの」なのです。なぜなら、もしその瞬間に他の参加者と同じように笑いやうなずきを共感できれば、自分がやってきた事が間違っていなかった。また、共感できなければ、間違っているのかも？と言った**「答え合わせ」**が出来るからです。技術力はセンスだけでなく、こういった答え合わせで軌道修正されていくものだと思います。

どうですか？ネットで調べただけではなかなか手に入らないですよね？最近では勉強会のネット中継もありますが、映像も音声も、登壇者とスライドが中心なので、参加者の仕草や声までは伺い知ることはできません。


# 最後に
　新入社員の方も半年が経ち、そろそろ業務に慣れてきた頃だと思います。まだ勉強会デビューしていない方は是非参加してみて下さい。その際に注意することは、自主的に興味を持って行く、ということです。上司に言われたから、という理由もきっかけとしては良いのですが、まずは今の業務上で困っていることや一歩進んだ技術などの勉強会を探してみて下さい。
　冒頭でも述べましたが、いざ勉強会に行ってみるとそんなに意識が高いところにある場所ではなく、あぁみんな同じことで苦しんでいるんだ、とか、あぁ、それ、あるある！と言った共感を味わえる場であることがわかります。その場を楽しいと思うことができればまずは第一歩。いずれは共感を与える側(登壇者)に立てるように多くの勉強会に参加してみて下さい。
SORACOM Beam(MQTT → MQTTS変換サービス) で Amazon MQ に接続する

[Amazon MQにmosquitto(MQTT)とMQTT over Websocketで接続](https://qiita.com/ma2shita/items/bfdd99a5b99c6baaba82)の続編です

## 切なる願い

Amazon MQ は 生MQTT はサポートしてないお...
でも **TLSがしゃべれない非力なデバイスからも Amazon MQ 使いたいお！！**

## ビームを飛ばせばいいじゃない

3G/LTE通信が1日10円～ 1回線から契約できる、モノ向け通信サービスのSORACOM (CM色強い) には [SORACOM Beam](https://soracom.jp/services/beam/) というデータ転送サービスがありまして、それを使って Amazon MQ に接続出来たよって話です

このデータ転送時にプロトコル変換もやってくれるのですが、変換内容に **生のMQTT → MQTTS** も入ってます
要するに MQTT Proxy そんなところです (CM色強い)

<img src="https://docs.google.com/drawings/d/e/2PACX-1vSMh5dXMD0G6m__htChRa0qUJ9mFW9FFSLyFJSOO3mJ2Kb-vtP32EcXs0ihoLaBQ0Zzfe1J_Eh7PHe_/pub?w=779&amp;h=201">

## 手順

SORACOM の Webコンソールで "SIMグループ" を作成したら、そのSIMグループの中にある SORACOM Beam で **MQTTエントリポイント** を選択します

![soracom-beam1.png](https://qiita-image-store.s3.amazonaws.com/0/22754/95f6cf9a-dae9-8b0b-382d-fe79ec74856c.png)

あとは以下のように設定していくだけです

* プロトコル: **MQTTS**
* ホスト名: Amazon MQ のダッシュボードから得てください
* ポート番号: `8883` (ねんのため、Amazon MQ のダッシュボードで確認してください)
* ユーザ名: Amazon MQ のダッシュボードから得てください
* パスワード: Amazon MQ のダッシュボードから得てください

これでOKです
オプションの *IMSI付与* は、ON にすると 例えば `my_topic/sensor` 宛てに送ると、Amazon MQ では `my_topic/sensor/491023123131` と、送信元 SIM の IMSI が付与されますので、送信元を特定することがとても簡単になるのでオヌヌメです

![soracom-beam2.png](https://qiita-image-store.s3.amazonaws.com/0/22754/3382ffab-a7a4-1c8c-21b9-08adbed72d47.png)

### 確認

確認には[前回同様 mosquitto と HiveMQ の MQTT over Websocket](https://qiita.com/ma2shita/items/bfdd99a5b99c6baaba82)を使ってみます

ターミナル側(mosquitto_sub)の方が SORACOM Beam を使っている様子です

![soracom-beam-works-with-amazon-mq.png](https://qiita-image-store.s3.amazonaws.com/0/22754/400431b3-fa92-c00b-a768-2ee3b891f91b.png)

**注目ポイント**

[前回](https://qiita.com/ma2shita/items/bfdd99a5b99c6baaba82)は `mosquitto_sub` の引数に `--capath /etc/ssl/certs/` を入れてTLS通信にしていましたが、生MQTTで送るのでコマンドラインも減っています

SORACOM Beam を使うとこんなにメリットが;

* そもそもTLSが使えない、非力なデバイスでMQTTやりたい
* 通信データサイズの削減 (TLSと生の違い)
* デバイス上の証明書更新をしなくてよい
* Amazon MQ 側の設定変更（インスタンス作り直しに伴う endpoint の変更や、ユーザ/パスワードの変更)が発生しても、デバイス上のプログラムコード変更をしなくてよい

もっと言ってしまうと **TLS実装しなくていいんです** 面倒から解放されますよ (^^

これが 0.0009円/1リクエスト (in/outでそれぞれ1リクエストが発生するので、感覚的な"1回"だと 0.0018円) で使えるのだから、お得と言わざるを得ない (CM色強い)

## あとがき

* Qiitaのデザインが変わってて驚いた
* Amazon MQ って Simple Icon マダー？
* CM色強いですが、費用対効果は抜群なサービスです

現場からは以上です。
今日が素数日かどうかを判定する

2017年12月1日は20171201ということで、素数日です。
今年最後の素数日は12月19日ですが、advent calendar開始日も素数ということなので、[素数日bot](https://twitter.com/sosubi_bot)についてです。

## 標準関数(PHP)で判定する
最初は[エラトステネスの篩](https://ja.wikipedia.org/wiki/%E3%82%A8%E3%83%A9%E3%83%88%E3%82%B9%E3%83%86%E3%83%8D%E3%82%B9%E3%81%AE%E7%AF%A9)すら知らなかったので、[PHPの標準関数](http://php.net/manual/ja/function.gmp-prob-prime.php)を使って調べたところ、素数日当日わくわくしながら待っていたところ、`今日は素数日ではありません` とのつぶやきが...
よくよく調べて見ると `数が"おそらく素数"であるかどうかを調べる` との文言が。
おそらく...つらい。

## 作った
てことで、PHPでエラトステネスの篩で書き直したのですが、さらにPythonで書き直したものがこちらです。(Python書いて見たかった)

```py
def get_primeflg():
    dt = today.strftime('%Y%m%d')
    dt = int(dt)

    if dt < 2:
        return False
    else:
        for i in range(2,dt):
            if i * i > dt: 
                break
            elif dt % i == 0:
                return False
        return True
```

# 課題
やり方調べていた時に任意の範囲から、素数を抜き出すものは結構あったのですが、xが素数であるかどうか、っていうのはあまりなくて困った。
けれど、そもそもそういう場合はエラトステネスの篩で調べるより早い方法があるらしい...(※忘れたのであとでまた調べる)
今つぶやいているのも、00:00には呟かれるが、遅い感じは否めないのどうにかしたい。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">2017年12月01日は素数日です。 <a href="https://twitter.com/hashtag/%E7%B4%A0%E6%95%B0%E6%97%A5?src=hash&amp;ref_src=twsrc%5Etfw">#素数日</a> <a href="https://twitter.com/hashtag/%E7%B4%A0%E6%95%B0?src=hash&amp;ref_src=twsrc%5Etfw">#素数</a></p>&mdash; 今日は素数日？ (@sosubi_bot) <a href="https://twitter.com/sosubi_bot/status/936248457156628481?ref_src=twsrc%5Etfw">2017年11月30日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

Enjoy PrimeNumberDay :)
Bulk port creation for Racktables

Overview
========

Racktables has a csv_import plugin modules, but it can't create port creation.
一括でポートが作れない。困った。

How to create
==============

1. Django の adminツールを使う
--------------------------------

djangoを入れて manage.py inspectdb にてmodels.pyを作らせる。
結論：失敗した。

というか、

<pre>
$ /opt/django/mysite/manage.py check                                                                                                                                   
SystemCheckError: System check identified some issues:

ERRORS:
racktables.Cachedpnv.object: (fields.E304) Reverse accessor for 'Cachedpnv.object' clashes with reverse accessor for 'Cachedpnv.port_name'.
        HINT: Add or change a related_name argument to the definition for 'Cachedpnv.object' or 'Cachedpnv.port_name'.
racktables.Cachedpnv.object: (fields.E304) Reverse accessor for 'Cachedpnv.object' clashes with reverse accessor for 'Cachedpnv.vlan'.
        HINT: Add or change a related_name argument to the definition for 'Cachedpnv.object' or 'Cachedpnv.vlan'.
racktables.Cachedpnv.object: (fields.E305) Reverse query name for 'Cachedpnv.object' clashes with reverse query name for 'Cachedpnv.port_name'.
        HINT: Add or change a related_name argument to the definition for 'Cachedpnv.object' or 'Cachedpnv.port_name'.
racktables.Cachedpnv.object: (fields.E305) Reverse query name for 'Cachedpnv.object' clashes with reverse query name for 'Cachedpnv.vlan'.
        HINT: Add or change a related_name argument to the definition for 'Cachedpnv.object' or 'Cachedpnv.vlan'.
</pre>

こんな感じで、models.pyは作ってくれるが、migrateに至らない。
直すのが面倒くさいので他の案を探してみる。

2. SQLを直接たたき込む。
---------------------------------

racktablesはPHPで動いているのでphpmyadminとかどうだろうと思った。
・・が、昨今はもっと怠惰なツールがあるらしい。

例えばこれを使う。

https://www.adminer.org/

どこでも良いので適当に配置してログイン。

Select Port -> Export (Import)

これが結局、一番楽だった。
ちなみに対象となるDeviceIDはObjectというテーブルをExportすることで一覧が見られる。
シェル作業スタイル： cd しないことで作業効率をn倍向上する

この記事は、株式会社ACCESS Advent Calendar 2017の1日目の記事です。

----

# あらまし

みなさんはmacOSやLinuxで作業するとき、カレントディレクトリをどのタイミングで変えていますか？

私がカレントディレクトリを変える（`cd`する）のは以下のタイミングのみです。
* 作業対象のルートへ移動するとき（Gitリポジトリなど）
* カレントディレクトリを見るプログラムを実行するとき（Git, `pwd`の値をみるシェルスクリプトなど）

これ以外のタイミングでcdするのは**極めて愚行**です。

# `cd`で失われるもの

`cd`で失われ得る大きなものの1つが、**ヒストリバック**の再利用性です。

過去に実行したコマンドライン文字列に相対パスが含まれている場合、
`cd`することで相対パスがずれるため一度書き換える必要が出てきます。**無駄ですよね**。


```bash:例
ls a/ # ディレクトリaに用事があった

cd c/d # ディレクトリc/d/e.txtに用事があったが、愚かにもcdした
cat e.txt

ls ../../a # またディレクトリaに用事があったが、cdしているために相対パスを書き換えなければいけなくなった

# or

cd ../../ # または元に戻ってからヒストリバックを呼び出す; 2コマンドになってしまった
ls a/
```

カレントディレクトリを関心のあるファイルのパスに置きたくなる気持ちはわからないではないですが、
打ちこむコマンドが増えるのは明白なのでやめましょう。

# ターミナル

大きなリポジトリの中の深いところにあるファイル群を参照したいケースは`cd`したくなります。
また、複数のプロジェクトをいったり来たりするときも、`cd`したくなりますね。`cd`しないとGit動かないんで。

そういう時は、今のシェルで`cd`せず、**新しくターミナルを立ち上げましょう**。
`gnome-terminal`なら`Ctrl-Shift-T`, iTerm2なら`Cmd-T`です。
`screen`や`tmux`でもいいでしょう。

それにより、ターミナルの切り替えで**一瞬にしてディレクトリ移動が可能**になります。

私の場合、その時使うプロジェクトの数だけiTerm2のタブを作って作業しています。

# make とか

make コマンドに代表されるコマンドは、カレントディレクトリにあるファイルを処理の対象とします。`Makefile`とか。
そのため、`cd a/; make; cd -` としている人もいると思います。**惜しい**。

この手のコマンドはカレントディレクトリを移動してから処理を始めてくれるオプションが大抵用意されています（または処理対象のファイルパスをダイレクトに指定）。

```bash:例
make -C target # cd target; make; cd - と同等
```

これを使えば、`cd`しなくともカレントディレクトリにない`Makefile`を処理できます。

# 絶対パス

デメリットに相対パスが使えなくなることを挙げましたが、絶対パスを使うのもひとつの手です。


# 成果

私はこのプラクティスを入社後から実践した結果、コマンドの再利用率は常に9割を超え、コマンドをいちいち打つことがほとんどなくなりました。
大抵のコマンドは`C-r`や`C-p`で出てきたものを実行するか、それを少しいじるだけで済ませてます。

----

明日も @katoken-0215 です。お楽しみに！
魔法のコマンド > *

```txt:動作環境
Windows 10 Pro (64bit) Fall Creators Update適用済
```

## 魔法のコマンド

使用中のサービスが新UIになっていた。
自分が使いたいようにするため、魔法のコマンドを使う。

[キーワードを入力]に*を入れてEnterを押す。

## 効果

### 画面を有効に使える

右側の多分ほとんど見ないであろう情報一覧を消すことができる。
代わりに親切な情報が表示される。

左側のごくたまにクリックするかもしれない情報一覧を消すことができる。

### 色使いを良くする

中途半端にBoldである画面表示から、適正（と僕が思う）な色使いの画面にすることができる。

### フィルタのない情報の表示

「新着順」と組合わせて、フィルタのかかっていない素の情報一覧を得ることができる。
その中には玉石混交ではあるが自分にとっての良い情報があることが多い。

### ページ切替え

最新のUI「もっと読む」から古いUI「ページ切替え」にすることができる。

自分にとっては、ページを簡易ジャンプできない「もっと読む」よりは「ページ切替え」の方がずっと使いやすい。

### スクロール量の軽減

Space一発で一覧表示時のページ最下部に移動することができる。
(「画面を有効に使える」と関連）
(ページ切替えを繰返す時に効果を発揮する）

## 魔法の適用範囲

「フィルタのない情報の表示」の効果のために、以前からスマホやタブレットでは使ってきたが、PC上での使用は不要であった。

新UIでは魔法を使うことになりそう。

魔法なのでいつか使えなくなるかもしれません。
(2017年12月1日)
Debianにおける情報発信

Debian Projectは公式、非公式にさまざまな情報を発信しています。それらについて紹介します。

# announce/devel-announce

Debianの重要な更新(新しいバージョンのリリースなど)は[debian-announce ML](https://lists.debian.org/debian-announce/)に掲載されます。主にユーザー向けの情報です。
開発者向けには[debian-devel-announce](https://lists.debian.org/debian-devel-announce/2017/11/threads.html)があります。時々、Project Leaderから"Bits from the DPL"というサマリ的なメール(DPL==Debian Project Leader)も配信されます。

# [bits.debian.org](https://bits.debian.org/)

Bits from Debianということで、DPLでなくDebianプロジェクトからのお知らせです。

# [Debian micronews](https://micronews.debian.org/)

Bits from Debianよりもうちょっと粒度の細かいニュースを配信しています。一部内容は他と重複していたりもします。

# [Planet Debian](https://planet.debian.org/)

Debian開発者のblogのアグリゲーションサイトです。RSSフィードもあるので、Debian開発者のblogをまとめてみるのには便利なサイトです。

「これも紹介すべきでは?」というものがあればぜひお知らせください。

# 追記

矢吹さんにご指摘を受けてちょっと追記します。ご指摘ありがとうございます。

* https://twitter.com/i/web/status/938076226534621184

## [Debian Wiki](https://wiki.debian.org/)

Debianにおける公式Wikiです。Debianに特化した情報に関してはそれなりですが、内容が古かったりすることもよくあるので執筆者は随時募集中です。
Linuxに関する一般情報なら[Arch Wiki](https://wiki.archlinux.jp/)の方が充実しています。

### [Developer News](https://wiki.debian.org/DeveloperNews)

Debian Wikiの一エントリとして、Developer Newsがあります。
Windows 10 - suddenly recover from sleep mode

ディスプレイを閉じて、スリープさせたのに勝手に復帰する
という困った事象でググるだけでこんなにも。

https://answers.microsoft.com/ja-jp/windows/forum/windows_10-power-winpc/windows-10/3bb138c8-7bbc-45ce-ae62-a4651a5727a9?auth=1
https://pc.watch.impress.co.jp/docs/news/yajiuma/718743.html
https://support.hp.com/jp-ja/document/c03544354
https://www.iyamaittane.com/entry/2015/08/19/070000

後で試してみる。。。
3 年煮込んだ熟成ソースコードにも Lint ツールを導入できる話

[Classi Advent Calendar 2017](https://qiita.com/advent-calendar/2017/classi) 1 日目の記事です。
フロントエンドエンジニアの @kasaharu です。
9 月に入社し、今日ようやく試用期間が解除されました。解除されました？
会社に行ってみないとわからないですね。。

さて、今日は思い立ったその日にでも Lint を導入できるゾ！と言う話をします :soon: 


# :clipboard: 今携わっているプロジェクトで使われている技術スタック
* Rails のプロジェクト
* HTML テンプレート : Slim
* JS : CoffeeScript
* CSS : SCSS

→ どこにも Lint ない :rolling_eyes:

# :muscle: Lint ツール導入のモチベーション
### :muscle_tone1: モチベーション 1
Initial commit は実に 3 年前でかなり色んな人が携わってきた痕跡がある
<img width="432" alt="initialCommit.png" src="https://qiita-image-store.s3.amazonaws.com/0/28573/2ccff839-cd19-8a1b-08c6-d0df805b2147.png">
にも関わらず、Lint 系のツールが何も入っていない…
ので、当然ファイルごとに書き方が違う
というか、同じファイル内でも書き方が違う、なにこれツラい

### :muscle_tone1: モチベーション 2
人が増えた
10 月はフロントほぼ一人だったので、既存のコードには一旦目を向けず、自分がルールみたいな感じで書いていた
が、人が増え相互レビューするようになると、色々齟齬が生まれる
「Trailing space 消して」とか「変数展開しないならシングルクォートで」みたいなのを毎回コメントするのはツラい
し、指摘される方もきっとツラい

:star: そうだ！ Lint 入れよう :star:

# :crossed_swords: 導入したツール
## :one: [Slim-Lint](https://github.com/sds/slim-lint)
* 一番書く slim をいち早くルール化すべく導入

**導入の手順**

1. Gemfile 経由で gem を導入
2. [default.yml](https://github.com/sds/slim-lint/blob/master/config/default.yml) を参考に .slim-lint.yml というファイル名で設定ファイルを用意
3. 当然このままでは大量にエラーが出るので、すべてのルールを無効化
    * 各ルールの enabled オプションをすべて false に
4. エラーが出なかったルールを有効化
    * enabled オプションを true
5. 1 つずつルールを有効化した上で、現時点で各ルールに違反しているファイルのみ対象外にする
    * enabled オプションの代わりに exclude を使い、対象外にしたいファイルを羅列する
    * すべてのルールに対して実施

これで既存のファイルに影響なく導入ができる！
し、以降ルールに沿わない書き方をしたら検出できる！

あとは、こまめに修正 & ルール変更をしていけば、自然と統一された書き方になる → ツラさ解消

## :two: [RuboCop](https://github.com/bbatsov/rubocop)
* Slim-Lint の副産物で導入されたのでルールを設定

**導入の手順**

1. 下記コマンドを使っていま検出されるエラーをリスト化したファイルを作成(.rubocop_todo.yml というファイルができる)

    ```
    $ bundle exec rubocop --auto-gen-config app spec
    ```
2. .rubocop_todo.yml に書かれた問題を検出しないように設定ファイルを下記コマンドで用意

    ```
    $ echo "inherit_from: .rubocop_todo.yml" >> .rubocop.yml
    ```

これだけで Slim-Lint の手順 2, 3, 4, 5 と同等の状態になり、新規に埋め込まれたルール違反のコードだけが検出される
既存ファイルに影響しない！
さらに RuboCop には --auto-correct オプションがあり、一部自動で修正されるルールもある
Style/TrailingWhitespace など影響範囲が限りなくゼロに近いものはこのオプションでさくっと直すと精神衛生上よい


## :three: [CoffeeLint](https://github.com/clutchski/coffeelint)

* フロントエンドエンジニアとしては JS もよく触るので導入

**導入の手順**

1. 上 2 つとは毛色が違い、npm で取得
2. 下記コマンドを入力して、設定ファイルを用意
    ```
    $ coffeelint --makeconfig > coffeelint.json
    ```
3. エラーが出たルールを無効化
    * 各ルールの level オプションをすべて ignore に

これでとりあえず既存ファイルに影響なく導入完了！
ただ CoffeeLint は Slim-Lint などとは違い、ルールを有効にした上で一部ファイルを対象外にするということはできないので若干使い勝手が悪い印象…
CoffeeLint のチェックそのものを対象外にするリストを .coffeelintignore に定義することはできるので、既存のファイルに追加・編集よりも新規のファイルを作るほうが多いプロジェクトは、一旦すべてのルールを有効にした上で、既存ファイルを .coffeelintignore に定義したほうが効果的かもしれない

# :tools: 導入したかったもの
* stylelint : やはり CSS まわりもどうにかしたい


# :pushpin: 所感
* 既存の(しかも触ったときの影響範囲が測れていない)コードがばかばかエラーになったら困ると思っていたが、そこはさすがというか、ちゃんとどのタイミングからでも導入できるようになってた
* 今回は RuboCop がそうであったが、ものによっては auto fixing がオプションであるので軽微なルールの修正は簡単なように作られているものもある

ということで、Lint を導入するのに遅すぎるということはないという学びを得ました :clap:

明日は @enomotok_ さんです :grinning:
Prologについて

# Prologについて

* [Prolog Advent Calendar 2016](https://qiita.com/advent-calendar/2016/prolog)

この記事は [Prolog Advent Calendar 2017](https://qiita.com/advent-calendar/2017/prolog) の 1日目に急遽書いたものです。

今年も終わりが近づいてますが、Prologについてのアドベントカレンダーがないので作ってみました。

Prologなんていまさら、、、。そんな人も多いと思いますが、結構面白いですよ。
ということで適当に紹介してみます。

たしかに、目新しいことは少ないかも知れませんが、Prologを使ったことある人なら多いハズ。もしよかったら、こんな使い方したゾ。みたいなお話を気軽にカレンダーに書いてくださる心優しい人がいたら嬉しいです。

# インストール

```
brew swi-prolog
apt-get swi-prolog
yum swi-prolog
```

などでインストールできます。

## hello world

```
% hello.pl
:- writeln('hello world'),halt.
```

```
$ swipl hello.pl
```

こんなので動きます。

## 意外とHaskellっぽい

述語は並べて書けるあたりはHaskellっぽさがあります。

```
fib(0,0).
fib(1,1).
fib(N,R) :- N1 is N-1,N2 is N-2, fib(N1,R1),fib(N2,R2), R is R1 + R2.
:- fib(10,R),writeln(R),halt.
```

ネストした関数は書けませんけど、いいんですｗ

## 言語作ってみよう。

PrologをつかえばDSLで以下のように簡単に言語が作れます:

```
eval(I,I) :- integer(I).
eval(A+B,R) :- eval(A,A_),eval(B,B_), R is A_ + B_.
eval(A-B,R) :- eval(A,A_),eval(B,B_), R is A_ - B_.
eval(A*B,R) :- eval(A,A_),eval(B,B_), R is A_ * B_.
:- eval(1+2*3,R),writeln(R),halt.
```

こんなので作れてしまいます。楽ちん！

## リストも使えるぞ

リストの値を２倍にする:

```
add(A,B) :- B is A * 2.
:- maplist(add,[1,2,3,4,5],R),writeln(R),halt.
```

普通にmapがあります。

```
[2,4,6,8,10]
```

## 最近のSWI-Prologなら無名の述語も使える

```
:- maplist([A,B]>>B is A * 2,[1,2,3,4,5],R),writeln(R),halt.
```

こんなふうに書くこともできます。

## Prologを作ってる人がけっこう熱い。

[O-Prologのコンパイラ](https://qiita.com/sym_num/items/e6e0032f2547010dfb3e)

O-Prologはインタプリタだったのですが、コンパイラが作っているそうです。

[GDIS-Prolog](https://github.com/hsk/gdis_prolog/)

自分も負けずと、OCamlでPrologを作ってみています。


Ubuntu 17.04

```bash
sudo add-apt-repository ppa:h-sakurai/gdis-prolog
sudo apt-get update
sudo apt install gdispl
```

などでインストールして使えます。

## まとめ

簡単にPrologを紹介してみました。
Debianがサスペンド後に復帰しない問題

# 症状
ノートパソコンにインストールしたDebian 9をしばらく放置していると
バッテリー切れで電源が落ちてしまった。

バッテリーを回復させてから電源を再起動しても
ブートローダーは起動するがOSが起動しない。

セーフモードで起動を試みると以下のメッセージでフリーズしています。

```
Suspending console(s) (use no_console_suspend to debug)
```

コンソールをサスペンドしています→ずっとサスペンドのターン。。。
ということみたいですね。

英語の情報もかなり当たりましたが
「<b>どうやったら再起動はするのか</B>」
ということが書かれていないことが多いです。

まぁLinux民はそういうこと多いですね。
「環境次第！！！ ﾄﾞﾔｧ」「君、自分のシステム、理解してる？」
みたいな

# 原因
よく分かりません。
サスペンドのバグじゃねぇの？

# 方針
調べものすらできないので、とりあえずデータが飛んでも良いからOSを起動させる。
サスペンドの問題を扱うのはその後。

私はこう考えました
「サスペンド中」でフリーズ
→サスペンドの途中で止まってる
→サスペンドできない
→再起動してもサスペンドの命令を再度実行している
→深みにはまる

つまり
<B>サスペンドの過程を飛ばしてブートしてやれば良さそう</B>

※間違ってたら教えてください

# やり方
grub ブートローダーは生きてるのでそっちから手動でブートする。

パーティション表示

```
grub> ls
(hd0) (hd1,gpt2) (hd1,gpt1) (hd1,gpt0)
```

どのパーティションにOSが入ってるか確認。(これでOS名が出るパーティションを探す)

```
grub> ls (hd0)/etc/issue
grub> ls (hd1,gpt2)/etc/issue
...
```

「Debian~~~みたいなの」見つけたら次のコマンド。(hd1,gpt2)にOSが入ってた場合
※) 「***」の部分はそれぞれ違うので自分の環境にあったものを。(TAB押せば補完されます)
※) sda1とかも同様に自分に合ったものを

```
grub> set root=(hd1,gpt2)
grub> linux /boot/vmlinux*** root=/dev/sda1
grub> initrd /boot/initrd.img-***
grub> boot
```

とりあえずこれで復旧しました。

# 方針について
本来はログファイルをcatで出力してちゃんと原因を探すべきなんでしょうが

 - エディタが使えない→単語検索が非常にダルい
 - grub で馴染みのあるshell コマンドが使えない
 - 何回もフリーズしてHPがどんどん減っていく

という状況だったので許してください。。
エンジニアデビューしそうな２０歳の自分へ


30歳を超えてエンジニアをやってきて

今20歳の自分に何か言えるとしてこんなことやって見たらどう？

という事を初めてのアドベントカレンダーに書いて見ようと思う

## とりあえずGitHubのアカウントを作る
自分のソースを公開したり、人のソースを見ることのハードルを下げる

## CUIに慣れる
bat、shはできることがたくさんあるし
ファイルのリネイムやバックアップ等び自分の単純作業をまとめてみるのもおすすめ


# 環境にこだわる
いろんなエディタがあるが、自分の好きなエディタをとことん使ってカスタマイズして見る。
エディタでできる事というのはだいたい似てるのであまり色々移り変わって覚え直すよりも
今、気に入っている。エディタを使いこなす方がコーディングも早くできる。
フォントや配色にこだわるのも愛着ができておすすめ！

そして個人的にはPCに付属よりもオリジナルキーボードがおすすめ！

## 個人のAWSアカウントを取って使う
AWSの個人アカウントを持って見る。
クレジットカードを作成して登録すれば１年ぐらい無料で使うことができる。
ただ言語だけを勉強しているよりも自分のサーバでやってみるということはとても強みになるし
差別化やインフラの勉強にもなる

もちろんいくつかのサービスを使うことでお金がかかる場合もあるが
一定の金額でアラートをあげることもできるしいろんなサービスを試せて面白い


## バグが出た場合の対応方法(PHP)
```
<?php
$i = 1;
$i += 3;
$j += 1;
echo $i;
```

私が$iを5にしたいのに過去にこんなミスをしたことがあって３時間以上ハマりました
（画面の行数を増やすために、フォントも小さくしていたいので余計見えなかったw）

こういう時は全ての行の後ろにvar_dump($i)を入れましょう。

たまにバグが解けなくて困ってる人に話を聞くと少しだけデバッグ出力を入れて解決せず

「うーん。。。」となってる人がいますが

私はとことん入れる事を進めます。

***バグが存在しないと思うところにも入れる！***
:star:ココポイント:star2:

どこが意図せず動いていないのかわかっていない時はそもそもから勘違いしている可能性もあるので

```
<?php
$i = 1;
$i += 3;
$j += 1;
echo $i;
```

を

```
<?php
$i = 1;
var_dump($i);
$i += 3;
var_dump($i);
$j += 1;
var_dump($i);
echo $i;
var_dump($i);
```

こう！！
最後の行も入れる！！

簡単なソースでハマった時はいまだにたまにやります。

誰かのバグがこれで治りますように！
OpenShift Origin 3.7 クラスタを導入してみた(リリース直後１日目：まだ早かった）

OpenShift 有志で作るゆるーい Advent Calendar 2017始まりました。
１日目から数日は言い出しっぺという事で頑張って書きます。


# OpenShift 3.7
11/30に OpenShift Container Platform 3.7 / OpenShift Origin 3.7 のリリースが発表されました。
Originが待てなくてインストールを試したのですが、現時点の状況まとめをします。

1. OpenShift-Originのrpmを取る先のmirrors.centos.orgに3.8がない
2. OpenShift-Ansible-plabookがansible-hostsでバージョン固定できるが、現時点3.7.0はplaybookがまだ対応していない

# 試した構成
OS: CentOS7.4
master: 3node
node: 2node

# 結論： まだ早かった
minishiftなどは対応済みの様子。
RHELでインストールして商用版を試して後日別の記事で作っていきたいと思います。

次の日も私phssakaigawaが担当しますが、OpenShift上にアプリを入れるシーンのサンプルということで、node.jsで動くnode-redを動かしてみたいとおもいます。
ちょっとずつ読むドメイン駆動設計 第三部 より深い洞察へ向かうリファクタリング 第十章 しなやかな設計9 攻める角度

# これまでの第十章

- [序章](https://qiita.com/YasuhiroKimesawa/items/c240451e6746497fd446)
- [意図の明白なインターフェース](https://qiita.com/YasuhiroKimesawa/items/988ed817de9aac785633)
- [副作用のない関数](https://qiita.com/YasuhiroKimesawa/items/a035d872d630eadeaffb#)
- [表明](https://qiita.com/YasuhiroKimesawa/items/bc2c417c30ec79efce15)
- [概念の輪郭](https://qiita.com/YasuhiroKimesawa/items/32c8ad3c54a4c486041d) 
- [独立したクラス](https://qiita.com/YasuhiroKimesawa/items/ad710fd130fa1aee9df2)
- [閉じた操作](https://qiita.com/YasuhiroKimesawa/items/f79ab74d05bed015e1fb)


- [宣言的スタイル](https://qiita.com/YasuhiroKimesawa/items/c993dbb106b797f682fd)

# 攻める角度

これらのテクニックをどこから攻めるか。システム全体を見て全体をしなやかな設計にしようとしても難しい。

## サブドメインを切り取る

いつだって、問題を小さく分けることは最適解への近道。一部を切り取る。どう切り取るかがポイントですね。

① モデルの一部が数学とみなせる部分を抜き出す

例では、シンジゲートローンシステムのシェアパイの計算を例に上げられています。
そういった、数学に対応できる箇所はimmutableにしやすいですし、これまでのパターンを適用しやすいですね。

② 状態の変更を制限するような複雑なルールを抜き出す
③ 確立された概念体系を利用する

 例えば、会計・決済や数学など。既に十分に概念が利用されているものを活用する。
または、以前のプロジェクトなどで扱ってきたドメインを再利用することも有効かと思います。

④ ①②③から残った部分も小さく整理される

こうした、サブドメインを切り出して管理していく具体的な方法は１５章「蒸留」で読んでいくことになります。

また、サブドメインを切り出すことで、アプリケーションのコアになる部分、ビジネスの価値の中心となる部分がさらに蒸留されていくことになります。ここも１５章での話題になるところですね。
Ubuntuで日本語入力で小さい「っ」を含む日本語を打てなくなって悲しい問題

日本語入力に ibus-mozc を使ってるのですが、原因不明でたまーに発生する問題。

例えば「すてっぷ」という日本語を入力するときに、「suteppu」って入力すると思うんですが（ｓｕｔｅｌｔｕｐｕ派/ｓｕｔｅxｔｕｐｕ派は知らん）、

* 「sutep」まで入力（すてｐ）
* 「p」を続けて入力（すてっｐ）
* 「u」を最後に入力（すてっぷ）

っていうのが正常な動作。ところがこれが、

* 「sutep」まで入浴（すてｐ）
* 「p」を続けて入力すると、「すてっ」でIME変換が確定されていまう
* 「u」を最後に入力すると「すてっう」になる

という2番めの謎確定動作が挟まることがあってモンニョリしてました。
一応PC再起動で治ることは確認してたのですが、毎回するの面倒だなぁと思ってました。

が、PC再起動までしなくても、ibus-daemonを再起動したら治ることがわかった。やったぜ。

```bash
$ sudo ibus-daemon --restart
```

これでも特定のアプリだけ入力が変、ってこともあったのですが、そのアプリだけ再起動すれば治りました。よかった。
Electron Webviewのセキュリティで注意すべきこと

こんにちは。プレイドのRyosukeです。現在、明治大学総合数理学部現象数理学科3年生で統計学系の研究室にいます。

今回は、Electron Webviewのセキュリティ面で注意すべきことを書きます。

# [Electron](https://electronjs.org/)
Electronとはweb techでクロスプラットフォームデスクトップアプリを作ることができるものです。どういうアプリがElectronで作られてるのかは[Awesome electron](https://github.com/sindresorhus/awesome-electron)を御覧ください。

Electronは、nodejsをバックで動かし、chromiumブラウザ上でウェブページを表示することでデスクトップアプリを表現しています。Electronでは、nodejs側のjsプロセス（メインプロセス）とブラウザ側のjsプロセス（レンダラープロセス）は別になるため、プロセス間の通信手段として`ipc` (internal procedure call?)を使用します。

また、ブラウザ側では`<webview>`というhtmlタグを使用することができます。`webview`とはiframeのように別のwebページをurlを指定することで表示するものです。ただ、iframeと違う部分があり、それは、webview内のjsプロセスはブラウザのjsプロセスとは別のインスタンスをもつということです。もちろん、webview内のjsプロセスはブラウザと同様にレンダラープロセスなので、メインプロセスとの通信手段を持ちます。ここに、セキュリティ面で注意すべきことがあります。

## Webviewのセキュリティ
webviewのレンダラープロセスとメインプロセス間で通信をする必要がないのであれば問題はありませんが、それをしたかったり、webviewのレンダラープロセスでnodejsのAPIをrequireして使用したい場合はセキュリティ面で注意が必要です。

### 安全じゃない方法 - nodeintegration
`<webview>`のアトリビュートには`nodeintegration`というものがあります。これは、デフォルトではfalseになっていますが、明示的に指定することで、webview内でnodejsのrequireやprocessといった低レベルなシステムへのアクセスが許されます。webviewとメインプロセス間の通信には`ipc`をrequireする必要があるので、それをしたいのであれば、webviewに`nodeintegration`をつけるのが手っ取り早いです。

しかし、XSSの危険性があり悪意のあるサイトが色々と悪さをできてしまいます。ですので、必ず`nodeintegration`が`false`になっていることを__確認__してください。

### 安全な方法 - preload
では、どうすればwebview内でipcや他のapiを使うことができるのでしょう。実は`preload`アトリビュートにjsファイルパスを指定することで、そのjsをpreloadすることができます。また、そのpreloadされるjsには制限が無いのでrequireをすることができますし、preload内のスコープはセキュリティ上、webview内のスコープとは別になるので、ある程度は安心できます。このpreloadを上手く使用することで、`nodeintegration`がfalseなwebview内でも使用したいnodejs apiを使用できます。

```renderer.html
<webview preload="PATH/TO/PREALOD_JS" src="URL">
```
```preload.js
const {ipcRenderer} = require('electron')

global.sendToHost = (message) => {
  ipcRenderer.sendToHost(message)
}
```

# 他に読むべきもの
- [セキュリティを考える：ElectronでWebブラウザを作る（その2）](http://www.yujakudo.com/blogs/develop/node-jselectron/considering-security-of-electron-app/)
- [Electronのセキュリティその後](http://utf-8.jp/public/2016/0629/electron.pdf)
- [webview Tag](https://electronjs.org/docs/api/webview-tag)
働け worker「土曜の夜と日曜の朝」

アラン・シリトーが描く worker は月曜から土曜まで働いて、宵越しの金は持たずに日曜の朝を迎える。「働く」ということはいまだにピンとこない。どちらかというと目の前の事に四苦八苦している。だから、金曜の夜も土曜の夜も PC の前だ。

Polyphony の worker は文句も言わずに常駐してくれる。worker は関数(メソッド)で表現され、__init__ 内で append_worker でworker として登録される。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/99921/eacfb061-6348-854e-2f52-fe37b9807087.png)

上の図のように、これだけだとただの無限ループで何も生産しない。Port や Queue を使って外部あるいは別の Worker と通信をする。ソフトウェアの意味的には Port よりも Queue の方がわかりやすい。Port はどんなタイミングで、どんな情報が来るかをデザイナーは把握してなければならない。HDL が必要とするクロック的な概念に縛られている。高位合成はクロックからの解放に向かおうとする技術だから、この手の時間的概念を扱うインタフェースとすこぶる相性が悪い。

ここでは簡単な平均フィルターを書いてみよう。Queue をつかって入力と出力をしている。

```pytyon:ave_filter.py
from polyphony import rule
import polyphony
from polyphony import is_worker_running
from polyphony.io import Port, Queue
from polyphony.typing import bit, int8, int16, int18
from polyphony.timing import clksleep, clkfence, wait_rising, wait_falling


@polyphony.module
class Filter:
    def __init__(self):
        self.q = Queue(int16, 'out', maxsize=10)
        self.din = Queue(int16, 'in', maxsize=10)
        self.append_worker(self.proc)

    def proc(self):
        a0:int18 = 0
        a1:int18 = 0
        a2:int18 = 0
        a3:int18 = 0

        while is_worker_running():
            self.q.wr(a0 >> 2)
            data:int16 = self.din.rd()
            a0 = a1 + data
            a1 = a2 + data
            a2 = a3 + data
            a3 =      data

@polyphony.testbench
def test(m):
    datas = (0x5ead, 0x3eef, 0x7fff, 0x0000, 0x800)
    for data in datas:
        m.din.wr(data)
            
    for i in range(5):
        print(m.q.rd())

    clksleep(10)

if __name__ == '__main__':
    filter = Filter()
    test(filter)
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/99921/b4bc718a-b2ce-24b2-1b47-381102001c39.png)

Polyphony のコードは Python なので Python で実行可能だ。本来なら Python でデバッグを完了してシミュレーションする

```text
$ python ave_filter.py
0
6059
10087
18278
18278
```

生成された Verilog-HDL はちょっと複雑だ。わかりやすいように Vivado に絵を描いてもらうことにしよう。

```verilog:Fitler_filter.v
module Filter_filter
  (
    input wire clk,
    input wire rst,
    input wire signed [15:0] din_dout,
    input wire din_empty,
    output reg din_read,
    input wire q_full,
    output reg signed [15:0] q_din,
    output reg q_write
  );
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/99921/1612bdc8-4715-0529-0ce2-c4ce68d26d57.png)
iOSとSwift学習始める

# まえおき

こんにちは、Webアプリ開発がほんの少しだけ出来るPHPの人です。

Webアプリ開発ばかりをやっていると、スマートフォンアプリ開発もかじりたくなる人、多いと思います。

〜〜〜〜〜　話が長くなったので割愛　〜〜〜〜〜

と、いうわけでこのAdvent Calendarが空いてしまった日は主催した責任を持って埋めていこうと思います:sunglasses:

# やってみたこと・やっていること

## やってみたこと

###[プログラミング経験者のためのSwift最速入門](https://www.amazon.co.jp/プログラミング経験者のためのSwift最速入門-天田士郎-ebook/dp/B072PVB1KT) ¥ 250

Swift言語の基礎の基礎本です。iOS用ってわけではないですが、安いしページ数も少ないしで
「ほぉん、そんな型もあるのね」という軽い感じで読みました。
プログラミング中級以上の方は読まなくても良いのかもですが、私は初心者６年目なので読んで良かったです:angel:
この本を読んでSwiftに少し親しみを覚えました。

###[ドットインストール-iOSアプリ開発入門](https://dotinstall.com/lessons/basic_iphoneapp_v3)
新しい言語などを勉強するときには、大体ドットインストールさんから入る事が多いです。
短時間で有益な情報を知れる素晴らしいサービスだと思います:bow:
私はしばらくiOSアプリ開発の学習を怠っていて、すっかり諸々忘れていたので思い出すために見ました。

## やっていること

###[はじめてのiOSアプリ開発](https://www.amazon.co.jp/TECHNICAL-MASTER-はじめてのiOSアプリ開発-Xcode-Swift-ebook/dp/B075WQLYHY/ref=sr_1_1?ie=UTF8&qid=1512060286&sr=8-1&keywords=はじめてのiOSアプリ開発) ¥ 3,240

Swiftを使ったiOSアプリ開発の入門書です。コスパ良し、中身が分かりやすい、で今のところ大変満足しております。
実は本を読みながら堅実に勉強するの苦手なタイプなんですが、この本はサクサク進められています。
最近、諸事情で途中で止まってしまっていましたが、次回から進めていこうと思います。


# しょかん

今のところ選択した教材は、個人的にはマッチしていて、iOSアプリ開発初学者がいれば勧めると思います。
（鳥頭なので）これから毎日少しずつやっていきします！