OmniAICreator/Qiita-1.07M huggingface dataset:
追記+改善2: 「#:g1: Common Lispで多方向分岐の最適化がされない場合にどうするか」

[一本目の記事](https://qiita.com/guicho271828/items/21ae1d4c6e50f1f0381c)では二分探索しか出来ませんでしたが、工夫すればちゃんとload-time-valueでジャンプテーブルに変換できました。追記だと気づいていない人も多いと思うので別記事にしました。

# fcase8

load-time-valueでうまく行かなかったのは変数にアクセスできないからなので、
明示的に変数を関数に引数として渡せばいいのではないだろうかと思い、やってみます。

```lisp
(defmacro fcase8 (i (&rest vars) &body body)
  `(funcall
    (svref (load-time-value (vector
                             ,@(iter (for b in body)
                                     (for j from 0)
                                     (collecting
                                      `(lambda (,i ,@vars) (locally (declare ((eql ,j) ,i)) ,b)))))
                            t)
           ,i)
    ,i ,@vars))

(defun 4096way/fcase8 (i)
  (let ((rand (random 10)))
    (fcase8 i (rand) ; 依存している変数であるrandをfcase8マクロに伝える
      . #.(loop :for x :from 0 :repeat 4096
             :collect `(progn (* i rand))))))

(test #'4096way/case 4095)   ; 8.9sec
(test #'4096way/case 0)      ; 0.044sec
(test #'4096way/fcase8 4095) ; 0.051sec
(test #'4096way/fcase8 0)    ; 0.053sec
```

あっさり、引数が0でも4095でも元のcaseバージョンの0と同等の速度になりました。

#fcase9 (最終形態?)

でもやっぱり、手で外側の引数を伝えないといけないのはあまりうまくない。
そこで、処理系依存の関数に手を出します。

cltl2というANSIからは抜けた規格が合って、そこには`(variable-information var env)`という関数があります。これは、macro functionでだけ渡されるenvironment引数envと変数名varを渡すことで、展開時現在でのvarの状況(型、specialかlexicalか、symbol-macroか、etc)を知ることが出来ます。

しかし今知りたいのは「lexicalにboundされた全ての変数のリスト」なので、この手は使えません。変数の名前を知らないので。そこで、[SBCLのvariable-informationの実装あたり](https://github.com/sbcl/sbcl/blob/master/contrib/sb-cltl2/env.lisp#L394)を見て、処理系依存ですが env からlexcal var list を手に入れる方法を実装したのが以下。fcase4の派生。


```lisp
(defun find-lexical-variables (env)
  (mapcar #'car
          (sb-c::lexenv-vars
           (sb-c::coerce-to-lexenv env))))

(defmacro fcase9 (i &body body &environment env)
  (let ((vars (find-lexical-variables env)))
    `(funcall
      (svref (load-time-value (vector
                               ,@(iter (for b in body)
                                       (for j from 0)
                                       (collecting
                                        `(lambda (,@vars) (locally (declare ((eql ,j) ,i)) ,b)))))
                              t)
             ,i)
      ,@vars)))


(defun 256way/fcase9 (i)
  (let ((rand (random 10)))
    (fcase9 i
      . #.(loop :for x :from 0 :repeat 256
             :collect `(progn (* i rand))))))

(defun 4096way/fcase9 (i)
  (let ((rand (random 10)))
    (fcase9 i
      . #.(loop :for x :from 0 :repeat 4096
             :collect `(progn (* i rand))))))

(test #'4096way/fcase9 4095) ; 0.050 sec
(test #'4096way/fcase9 0)    ; 0.050 sec

```


コードはこちら。
https://gist.github.com/guicho271828/707be5ad51edb858ff751d954e37c267
Asset Catalogのslicingは縦のtilesが上手く行かない？

タイトルの通りです:disappointed_relieved:
もし解決法をご存知の方いらっしゃいましたらぜひコメントで教えてください:bow:

slicingって何って方は適当に検索して調べてください:smiling_imp:
ざっくり説明すると画像の一部だったり全体を縦横に引き伸ばしたり繰り返したりできる機能です:bulb:

# 確認方法
適当な画像を用意し、slicingを設定し、UIImageViewで表示させます。
IB上の表示は以下の通り。比較のためにstretchの画像も並べてます。
![スクリーンショット 2018-01-09 22.18.58.png](https://qiita-image-store.s3.amazonaws.com/0/84917/b881cdf2-d23d-86c2-1127-b0c8b366fed2.png)
良さそうですね。これが期待する結果です。ですが、シミュレータで実行してみると・・・
![iphone.png](https://qiita-image-store.s3.amazonaws.com/0/84917/75a97700-d5ff-3ec0-42b6-f15ea6428572.png)
(位置の設定をちゃんとしなかったので、一部見切れたりしてるのは目を瞑ってください:see_no_evil:)
横方向のみは期待通りですが、縦方向は一番上、縦横方向は右上の一つしか画像が表示されません。
ちなみに実機でやっても同じように画像が一つしか表示されませんでした。ただし自分が試した限りでは6plus(iOS10)だけはIB通りに表示されました。

# 解決方法
`UIImage`の`resizableImage(withCapInsets:resizingMode:)`を使います。
[ドキュメント](https://developer.apple.com/documentation/uikit/uiimage/1624127-resizableimage)
なんだよ結局コードでやるのかよ！という声が聞こえてきそうですが、これ以外にできる方法を見つけられませんでした。

# おわりに
なぜこうなってしまうんでしょうか？IB上は期待通りに表示されるので、上手く行くもんだと思ってしまうじゃないですか:rage:
背景画像を縦横タイルでなんてよくありそうですが、皆さんどうされているんでしょうか？:confused:
6plus(iOS10)だけは上手く行ったのも不思議です:space_invader:もっと端末とOSの組合せでちゃんと検証すべきですが、いかんせん~~面倒くさい~~時間が無く・・・:sweat:
もしコード以外の解決方法を知っている方は、ぜひコメントでご教授ください:satisfied:
PostgreSQLのWALファイル(トランザクションログ)について

# はじめに
PostgreSQLで出力するWALファイル(トランザクションログ)についてまとめました。
本記事は、WALファイルの仕組みについて全体像を理解することを目的に、図としておこしました。
これから、PostgreSQLを学習する方の参考になれば幸いです。

## 全体概要図
- PostgreSQLは最初に、マスタサーバのプロセスを起動します。マスタサーバのプロセスにより、WALライタ、チェックポインタ、ライタプロセスが起動されます。その他のプロセスも起動しますが、一部省略します。
- 図中のクライアントは、アプリケーションをさします。またクライアントの接続は、バックエンドプロセスとして、起動されます。なお、クライアントの認証はpg_hba.conf等で制御しますが、詳細については割愛します。
- データベースに対する変更は、まずは共有メモリのWALバッファにキャッシュされ、WALライタプロセスにより、WALファイルに出力されます。

![PostgreSQLまとめ.png](https://qiita-image-store.s3.amazonaws.com/0/221759/acfd47c7-a359-c852-549b-60b410b26fc9.png)

## 追記
データベースソフトウェアの本質として、ディスクに書き込まれていない状態で障害が発生すると、リカバリにWALファイルが必要だということが、図にすることで改めて分かりました。

通常のデータベース更新は処理性能向上(※)のためメモリ上で行われ、チェックポイントというタイミングで一括してディスクに反映させている。このため、システム障害でメモリ上のデータが消失すると、直近のチェックポイント以降の更新内容が失われる。ただし、更新履歴はログファイルに残っているので、システム障害回復後にこれを参照して、データベースを回復できる。

(※)ディスクへの書き込みが頻繁に行われれば、ディスクI/Oの性能に影響が出るため
DelayedJobで使用するテーブルを変更する方法

非同期処理を実現するgem、DelayedJobはMySQLやPostgreSQLなどのRDMSを使ってキューイングを行う(MongoDBも使えるようだが)

このキューイングするデータベースのテーブルはデフォルトで`delayed_jobs`に固定されている。
今回はこのテーブルをデフォルトから変更する場合の修正箇所を紹介する。

今回の施策は、モノリシックなRailsをマルチテナント利用するような場合に使う場合があるだろう。

## 各gemバージョンについて
* rails: 5.1.4
* delayed_job: 4.1.3
* delayed_job_active_record: 4.1.2

## 修正箇所 config/application.rb
Delayed::Backend::ActiveRecord::Job.table_nameをconfig.after_initializeブロック内で変更する。

例えば、DelayedJobで実行するデフォルトのテーブルdelayed_jobsからanother_delayed_jobsに変更したい場合

```config/application.rb
module ApplicationName
  class Application < Rails::Application
    config.after_initialize do
      Delayed::Backend::ActiveRecord::Job.table_name = 'another_delayed_jobs'
    end
  end
end
```

## 【参考】普通のActiveRecordモデルで規約以外のテーブルを使う場合
self.table_nameで値を変更する

例えばUserモデルの場合、Rails規約通りのusersテーブルから、foo_bar_usersテーブルに変更したい場合
下記のようにしてあげる

```user.rb
class User < ApplicationRecord
  self.table_name = 'foo_bar_users'
end
```
graphql-rubyで配列を扱う

# 前提：GraphQLとそれをrubyから使うgraphql-ruby。

GraphQLはRESTやgRPCに並ぶAPIの新たな形式と言えるでしょう。
基本的なgraphql-rubyの使い方は下記がすごく詳しいです。
https://qiita.com/kielze/items/b2168d7214992e5d37bf

# 本題：graphql-rubyで配列を扱う（引数、返り値として）

題材として、Parentというオブジェクトを参照するクエリを下記のように作ります。
IDを引数にして`Parent.find(id)`で参照しリターンします。

### 修正前のクエリ関数parent

```rb:query_type.rb
  field :parent, Types::ParentType do
    description "Parent API"
    argument :id, !types.ID
    resolve ->(obj, args, ctx) {
      Parent.find(args[:id])
    }
  end
```

### （先に完成版）新しいクエリ関数parents [引数・返り値が配列]

```rb:query_type.rb
  field :parents, Types::ParentType.to_list_type do
    description "Parent API"
    argument :ids, !types.ID.to_list_type
    resolve ->(obj, args, ctx) {
      Parent.find(args[:ids])
    }
  end
```


### 大事なポイント：配列＝`to_list_type` (もしくはtypes[])

[公式ドキュメント](http://www.rubydoc.info/gems/graphql/1.7.7/GraphQL/ListType)にこう記載されています。

```rb
field :newNames do
  # ...
  argument :values, types[types.String]
  # or
  argument :values, types.String.to_list_type
end
```

### 引数を配列に変換

`types.ID`を`type.ID.to_list_type`とします。

### 返り値を配列に変換

`Types::ParentType`を`Types::ParentType.to_list_type`とします。

### 実行結果

左画面に`ids:[1,2]`という配列が引数として入力されており、
右画面に返り値`parents:[ 一つ目, 二つ目]`という配列が出力されています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/96277/9ae66d37-3467-36df-7c40-1c374e53c7f4.png)


### 補遺

@yoshikyoto さま、修正ありがとうございます
Visual StudioのC/C++のコードスニペットをK&Rスタイル風にする

Visual StudioでC言語やC++をやっているとifなどを自動補完したときSample1のように展開されます。

```Sample1.cpp
int main(void) {
    if (true)
    {
    }
}
```

これを

```Sample2.cpp
int main(void) {
    if (true) {
    }
}
```

括弧がこのように展開されるように変更してみよう。
という内容です。

#手順
###1.デフォルトのコードスニペットを任意の場所へコピーする。
Visual Studio 2015の場合
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\Snippets\1041\Visual C++
にデフォルトのスニペットがありますのでフォルダ内のファイルを適当な場所へコピーします。
<img width="845" alt="2018-01-09 (1).png" src="https://qiita-image-store.s3.amazonaws.com/0/178471/697720fc-2827-0ffe-53f9-433e3518d5b9.png">
※上記のパスに見当たらない場合はVisual Studioのコードスニペットマネージャーから確認して見て下さい。

今回はこれをマイドキュメントフォルダ
Documents\Visual Studio 2015\Code Snippets\Visual C++\My Code Snippets
にコピーしたものとします。
<img width="845" alt="2018-01-09 (14).png" src="https://qiita-image-store.s3.amazonaws.com/0/178471/435416f4-ee05-73f9-2980-f9e5d206badb.png">


###2.読取り専用属性を外す。
Ctrl+Aなどでファイルをすべて選択し、コピーしたスニペットの読み取り専用を解除します。
<img width="301" alt="2018-01-09 (3).png" src="https://qiita-image-store.s3.amazonaws.com/0/178471/82fb91dd-b45c-9d0d-070f-c1bba47644b8.png">


###3.コードスニペットを編集する。
任意のエディタでコードスニペットすべて編集します。
例としてifのコードスニペットを編集します。
変更前
<img width="1080" alt="2018-01-09 (5).png" src="https://qiita-image-store.s3.amazonaws.com/0/178471/2b9ca335-53d8-4be9-f3e3-b850b14de203.png">

変更後
<img width="1080" alt="2018-01-09 (7).png" src="https://qiita-image-store.s3.amazonaws.com/0/178471/daa715b6-9594-e1fc-8425-94898eda2885.png">
このような感じですべてのスニペットを変更して保存して下さい。

###4.Visual Studioのコードスニペットマネージャーから設定する。
編集が終わったスニペットをVisual Studioに登録するためコードスニペットマネージャーを開きます。
<img width="1080" alt="2018-01-09 (10).png" src="https://qiita-image-store.s3.amazonaws.com/0/178471/3a53633e-b286-e9e6-bc31-4f2f83a144ad.png">

コピー元のデフォルトのコードスニペットはもう使いませんので削除します。
<img width="483" alt="2018-01-09 (16).png" src="https://qiita-image-store.s3.amazonaws.com/0/178471/ee6ae4d3-aed1-717b-3866-08ef0d1cdc81.png">

###5.編集したコードスニペットを確認する。
手順の「1.」のフォルダに配置した場合、My Code Snippetsフォルダに編集したコードスニペットが追加されているので展開して確認してみます。
※それ以外のフォルダに配置した場合、追加(A)から追加して下さい。
<img width="483" alt="2018-01-09 (17).png" src="https://qiita-image-store.s3.amazonaws.com/0/178471/5268ba33-2051-87b4-6836-48a5de120c5e.png">
削除追加が完了したらOKをクリックしてコードスニペットマネージャーを閉じて下さい。

###6.動作確認
試しにifと入力して以下のように展開されれば成功です。
<img width="642" alt="2018-01-09 (18).png" src="https://qiita-image-store.s3.amazonaws.com/0/178471/f6505cdd-eda2-1efa-9cd1-059e7fd3055b.png">

###7.おまけ
以下のようなスニペットを作りたい場合、スニペットを作成しただけではうまく動作しません。
※catchやdo-whileでも同様です。

```ifelse.cpp
int main(void) {
    if (true) {
    } else {
    }
}
```

スニペットの作成と同時にVisual Studioの以下の設定を変更する必要があります。
ツール(T)→オプション(O)→テキストエディター→C/C++→書式設定→改行→キーワードの位置
<img width="579" alt="2018-01-09 (21).png" src="https://qiita-image-store.s3.amazonaws.com/0/178471/1cc0393e-4c52-41ba-b9f9-e14e89a15db3.png">

これに気づかずにハマった・・・
Flutterでよくつかう共通Widget

Flutterには非常にたくさんのWidgetが用意されています。特に、Material library内のWidgetはリッチなUIを簡単に作り上げることができます。
どんなWidgetがあるかは[Widgets Catalog](https://flutter.io/widgets/)から探せますが、ここではよく使う共通Widgetを紹介します。

# Container
padding、margin、borderをつけたり、背景色を変更したりするのに使います。

```dart

new Container(
  padding: const EdgeInsets.all(16.0),
  margin: const EdgeInsets.all(4.0),
  decoration: new BoxDecoration(
    border: new Border.all(width: 4.0, color: Colors.grey[600]),
    borderRadius: const BorderRadius.all(const Radius.circular(4.0)),
  ),
  child: new Text("Container"),
);
```

# GridView
よくあるGridレイアウトです。AndroidでいうGridView。要素が画面に入りきらない場合にはスクロールできます。

```dart
List<Container> _createList(int count) {
  return new List<Container>.generate(
    count, (int index) =>
      new Container(
        child: new Text('Text${index+1}'),
        padding: const EdgeInsets.all(16.0),
      ),
  );
}

Widget gridView = new GridView.extent(
  maxCrossAxisExtent: 160.0,
  padding: const EdgeInsets.all(4.0),
  mainAxisSpacing: 2.0,
  crossAxisSpacing: 2.0,
  children: _createList(20)
);
```

# ListView
よくあるListレイアウトです。AndroidでいうRecyclerView。

```dart
List<Widget> list = <Widget>[
  new ListTile(
    title: new Text(
        'Title1',
        style: new TextStyle(
            color: Colors.green[600],
            fontSize: 16.0
        )
    ),
    leading: new Icon(
      Icons.android,
      color: Colors.green[600],
    ),
  ),
  new ListTile(
    title: new Text(
        'Title2',
        style: new TextStyle(
            color: Colors.green[600],
            fontSize: 16.0
        )
    ),
    leading: new Icon(
      Icons.android,
      color: Colors.green[600],
    ),
  ),
];

return new Scaffold(
  appBar: new AppBar(
    title: new Text(widget.title),
  ),
  body: new ListView(
    children: list,
  ),
);
```

# Stack
Widgetを重ね合わせることができる。AndroidでいうFrameLayoutのようなもの。

```dart
new Stack(
  children: [
    new Container(
      color: Colors.green,
    ),
    new Container(
      padding: const EdgeInsets.all(16.0),
      decoration: new BoxDecoration(
        color: Colors.black,
      ),
      child: new Text(
        'Text',
        textAlign: TextAlign.center,
        style: new TextStyle(
          fontSize: 16.0,
          color: Colors.white,
        ),
      ),
    ),
  ],
);
```

# Card
Material DesignにあるCardレイアウト。AndroidでいうCardView。
デフォルトサイズは0なので、SizedBoxをつかってカードのサイズを指定する。radiusやz軸の高さも指定できる。

```dart
new SizedBox(
  height: 100.0,
  child: new Card(
    child: new Container(
      ...
    ),
  ),
)
```

# ListTile
最大3行のテキストと、左右のアイコンを含むリストアイテムを簡単に作れる。
【入門者向け】UiPath(RPA)でExcel操作の基本

RPAソフトであるUiPathを使ってExcel読込と書込をする基本操作の解説です。だいたい1時間もあれば作れます。
以下はUiPath関連記事です。
> - [初心者でもできるWindows10へUiPath(RPA)インストールと実行](https://qiita.com/FukuharaYohei/items/ddad329a4a7ad1f4313f)
> - [【入門者向け】UiPath(RPA)でFlowchart作成](https://qiita.com/FukuharaYohei/items/6a51ba6d42693236f58c)

#実行環境
- Windows10 Pro 64bit
- UiPath Studio Community Edition 2017.1.6522

#Excel統合パッケージインストール
Communityバージョンでなければデフォルトでインストールされているようです。
https://www.uipath.com/kb-articles/excel-integration-approaches
ActivitiesペインからManage Packagesアイコンを押します。
![10.InstallAddin01.JPG](https://qiita-image-store.s3.amazonaws.com/0/134273/54f9c018-7287-0304-135a-7a09aa7d1f99.jpeg)

Available -> All を選択して "UiPath.Excel.Activities"をインストールしてください(スクリーンショットでは「EX」でフィルタ)。
![10.InstallAddin02.JPG](https://qiita-image-store.s3.amazonaws.com/0/134273/5634d302-d80b-343d-8ea1-aca28028f37b.jpeg)

Activities ペインの App Integration 以下にCSVとExcelが出ていればインストール成功です。
![10.InstallAddin03.JPG](https://qiita-image-store.s3.amazonaws.com/0/134273/40f13153-f992-6cde-3a68-2bb01d903eb0.jpeg)

# 事前準備
最初にUiPathで読み込むExcelファイルを作っておきます。ファイルパスやファイル名は後で指定するので、何でもいいです。
![20.Preperation01.JPG](https://qiita-image-store.s3.amazonaws.com/0/134273/1a7b4f78-e9cc-e5ae-e1da-9486a1990efd.jpeg)

UiPathで読み込むファイルの中身はこんな感じにしておきます。
![20.Preperation02.JPG](https://qiita-image-store.s3.amazonaws.com/0/134273/8823cefc-b272-b984-e76b-5af47a1442fe.jpeg)

# Flowchart作成手順
##1. 概要
Outlineペインで下図のようにFlowchartを作っていきます。具体的なオペレーションは Activities ペインから該当の Activity をドラッグアンドドロップして Main ペインに加えていきます。階層化されていることに注意してください(ドラッグアンドドロップ出来ない場合は、Activityをダブルクリックして詳細画面に遷移してからもう一度ドラッグアンドドロップ)。
![30.FlowChart01.JPG](https://qiita-image-store.s3.amazonaws.com/0/134273/afa749fd-8f0f-d973-9e5b-60a14eb432a5.jpeg)

##2. Excel application scope(読込)
最初のExcel Application scopeでは、「事前準備」で作成したExcelファイルを読み込みます。Propertiesペインで "WorkbookPath"にディレクトリ付きのファイル名を入力します。またVisibleをONにすると実行時にExcelを開くモードとなり作業進捗が見られます(自動で閉じます)。
![30.FlowChart02.JPG](https://qiita-image-store.s3.amazonaws.com/0/134273/efc8361f-5654-869d-ba2b-93f596e85c48.jpeg)

##3. Read Range
"SheetName"には読み込むシート名を入力、"Range"をブランクにすることで全て読み込みます。"AddHeaders"をONにすると1行目がヘッダ扱いとなります。"DataTable"に新規変数として「DT1」を定義して設定します("DataTable"入力項目で右クリックから「Create Variable」を選択)。変数「DT1」は「Excel application scope(書込)」でも使用するので、変数スコープをFlowchart全体にするのを忘れないでください(中央下にある「Variable」を開くと変数スコープを変更できます)。
![30.FlowChart03.JPG](https://qiita-image-store.s3.amazonaws.com/0/134273/78cc199c-0ad7-e93a-5d20-123f059690c5.jpeg)
![30.FlowChart04.JPG](https://qiita-image-store.s3.amazonaws.com/0/134273/4f035682-4607-c0ea-96d4-92d8f57096bc.jpeg)

##4. Excel application scope(書込)
今度は、ファイルを書き込む方のExcel application scopeです。「2. Excel application scope(読込)」と同様にPropertiesペインで "WorkbookPath"にディレクトリ付きのファイル名を入力します。ファイルがある場合にはファイル更新で、ない場合には新規作成です。

##5. Write Range
最後に書き込む内容の設定です。"DataTable"に「3. Read Range」で出力した変数「DT1」を入力し、"SheetName"に入力するシート名、"StartingCell"に開始セルを入力。"AddHeaders"をOFFにすることで読み込んだExcelから1行目のヘッダを除外します。
![30.FlowChart06.JPG](https://qiita-image-store.s3.amazonaws.com/0/134273/1b6b4d8c-ec4b-761f-b19f-e859b2ec6d77.jpeg)

あとは、実行すると読込Excelからヘッダ行が除外されて出力Excelに保存されます。
Excel2010以降 ピボットテーブルの面倒回避マクロ等

Excel2010以降(2007からかな？)は、ピボットテーブルの作成が非常に簡単になった。まず表を作ってから
![001.png](https://qiita-image-store.s3.amazonaws.com/0/229452/b9e24df8-2fd4-fdc4-a33f-240cfcda9f8d.png)


Ctrl+T(またはL)で表をテーブル化する。次に、リボンに出現する「ピボットテーブルで集計」ボタンを押す。もう毎回これだけ、機械的にやってしまえばいい。

![002.png](https://qiita-image-store.s3.amazonaws.com/0/229452/e9e8daa8-f076-0c62-8904-268aa14a2fa9.png)


でもなぜか、ここで出来上がるピボットテーブルというのは、「コンパクト形式」とかいう形式であり、Excel2003までと同じ「表形式」ではない。

![003.png](https://qiita-image-store.s3.amazonaws.com/0/229452/181f0675-a0c5-1f91-cf7d-2c3044a712db.png)

このコンパクト形式、私は一度も採用したことがなくて必ず「表形式」に変換しているのだが、コンパクト形式を愛用されている方はいらっしゃるのだろうか？私としてはコンパクト形式は、一つの列内に何でもかんでもデータを詰め込まれてて、分かりにくいったらないと思っている。これを毎回毎回「表形式」に変換するのが手間なので、次のマクロで一発変換するようにしている。

```vbnet
Sub pivot_autoFormat()
    Dim pvt             As Object
    
    If MsgBox("ピボットテーブルのフォーマットを自動調整しますか？", vbQuestion + vbOKCancel, "確認") = vbCancel Then Exit Sub
    
    Set pvt = ActiveSheet.PivotTables(1)
    
    With pvt
        .RowAxisLayout xlTabularRow     '表形式にする
        .ColumnGrand = False            '列の総計を削除
        .RowGrand = False               '行の総計を削除
        .HasAutoFormat = False          '「更新時に列幅を自動調整する」を「オフ」
        .RepeatAllLabels xlRepeatLabels '「アイテムのラベルをすべて繰り返す」を「オン」
    
    End With

End Sub
```
・・・頼むからデフォルトを「表形式」にできるようにしてくれ。
そして、ここから毎回、数値フィールドの扱いには困らされている。数値フィールドはたいてい、３桁ごとにカンマ打ちするものだが、Excelのピボットテーブルは数値フィールドの書式設定は、１個１個ご丁寧に「フィールドの設定」から進めることになっている。

![004.png](https://qiita-image-store.s3.amazonaws.com/0/229452/2a2f6a86-e7ed-c902-da79-0361d27abb42.png)



10個のフィールドがあったら10回、面倒な設定作業を大体の人はしていると思う。「フィールドの設定」でなく、セル範囲を直接選んでから「セルの書式設定」で設定する手抜きの方法もあるにはあるが、ピボットテーブルのレイアウトを変えまくることを前提とした場合、根本的な対処法となっていない。
そこで次に、ピボットテーブルの数値フィールドについて一括で書式設定する下記マクロを私は使っている。・・・これくらい、マクロなしで普通にできるようにしてほしいものです。

```vbnet
Sub pivotNumFormat()
'ピボットテーブルの数値フィールドのフォーマットを一括変更
    Dim pvt     As Object
    Dim itm     As Object
    Dim str     As String

    Set pvt = ActiveSheet.PivotTables(1)
    
    For Each itm In pvt.DataPivotField.PivotItems
        str = itm.Name
        
        With pvt.PivotFields(str)
            
            .Function = xlSum '合計
            .NumberFormat = "#,##0;△#,##0"
            .Caption = Replace(.Caption, "合計 /", "") '数値フィールドにすると「合計 /」という余計な文字がつくので削除
        End With
    Next itm
End Sub
```
Moodle3.4でPython機械学習バックエンドを有効にする

# Moodleのアナリティクス機能
Moodle 3.4からはサイト管理者用メニューの [サイト管理] > [アナリティクス] にユーザの活動を機械学習を用いて分析する機能が追加されている。
ここで「アナリティクス設定」の場所に「予測プロセッサ」として「PHP機械学習バックエンド」と「Python機械学習バックエンド」が選択できるようになっているが、そのままではPython機械学習バックエンドを有効にすることができない。
[Moodle.orgの説明](https://docs.moodle.org/dev/Machine_learning_backends)によるとPython機械学習バックエンドを用いた方がより正確な予測が可能で処理速度も速いようなので有効にする方法を確認する。

# やりかた
CentOS 7.4とMoodle 3.4での方法になる。
以下のコマンドを実行すると依存関係で必要なパッケージと共に[Moodle用Python機械学習バックエンド](https://pypi.python.org/pypi/moodlemlbackend/)がインストールされる。

```
# python --version
Python 2.7.5
# yum install -y python2-pip
# pip install moodlemlbackend
```

インストール作業後はMoodleサイトに管理者でログインしてPython機械学習バックエンドを有効にすれば終わり。
DebianとiPhoneをL2TP+IPsec（NAPT-NAPT間）接続を「素人が」やってみた。

#はじめに
https://qiita.com/kitatan/items/5ca34f2dc5dfd88233cc
を見て、書いたのが元同僚だったのでやってみた。
（分からなかったら聞いてしまえ、の気分で）

#環境について
手もとにあるホストはDebian（Stable）でsshとBindしか動いてなかったやつ。しかもキツキツのリソースで動くVMの上。
32bitなので上記記事とは異なり
http://ja.softether.org/5-download/src
から正しいアーキテクチャを選択。Latestを選択してDownload。

```shell
$ wget http://www.softether-download.com/files/softether/v4.24-9652-beta-2017.12.21-tree/Linux/SoftEther_VPN_Server/32bit_-_Intel_x86/softether-vpnserver-v4.24-9652-beta-2017.12.21-linux-x86-32bit.tar.gz
＃ tar zxvf softether-vpnserver-v4.24-9652-beta-2017.12.21-linux-x86-32bit.tar.gz -C /usr/local/
```
Downloadと解凍には問題なし。

そこから手順の通りにやってみてもうまく行かなかった。。。

```shell

root:/usr/local/vpnserver# pwd
/usr/local/vpnserver
root:/usr/local/vpnserver# ls
Authors.txt  ReadMeFirst_Important_Notices_cn.txt
code      ReadMeFirst_Important_Notices_en.txt
hamcore.se2  ReadMeFirst_Important_Notices_ja.txt
lib       ReadMeFirst_License.txt
Makefile
root:/usr/local/vpnserver# make
bash: make: command not found
```
//思い返せばソースからMakeやカーネルの入れ替えとかapt以外でやったことないホストだった・・・

#やったこと
まずは足らないライブラリがあると思われるので

```shell

#apt-get update
#apt-get install make gcc binutils
```

で初めてmakeが通った。

```shell

#make

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

SoftEther VPN Server (Ver 4.24, Build 9652, Intel x86) for Linux Install Utility
Copyright (c) SoftEther Project at University of Tsukuba, Japan. All Rights Reserved.

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


Do you want to read the License Agreement for this software ?

 1. Yes
 2. No
```

～略～

あとは起動ファイルを作成して、permissionを設定。

```shell:/etc/init.d/vpnserver

#!/bin/sh
### BEGIN INIT INFO
# Provides:          vpnserver
# Required-Start:    $local_fs $network
# Required-Stop:     $local_fs $network
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: SoftEther VPN Server
# Description:       SoftEther VPN Server
### END INIT INFO

DAEMON=/usr/local/vpnserver/vpnserver
LOCK=/var/lock/vpnserver

test -x $DAEMON || exit 0

case "$1" in
  start)
        $DAEMON start
        touch $LOCK
        ;;
  stop)
        $DAEMON stop
        rm $LOCK
        ;;
  restart)
        $DAEMON stop
        sleep 3
        $DAEMON start
        ;;
  *)
        echo "Usage: $0 {start|stop|restart}"
        exit 1
esac

exit 0
EOT
```


#残り
Broadband Routerのポートを開けなくちゃ。
あと、VPN サーバ マネージャのDownloadとInstallも（これは省略）

```shell
wget http://www.softether-download.com/files/softether/v4.24-9652-beta-2017.12.21-tree/Windows/SoftEther_VPN_Server_and_VPN_Bridge/softether-vpnserver_vpnbridge-v4.24-9652-beta-2017.12.21-windows-x86_x64-intel.exe
```
あとはiPhoneでVPNを設定するときにIKEv2でなくL2TPで設定するところがハマりポイントでした！（僕だけかもしれないですけど）

#雑記
久々にmakeが動かない、という事態に陥ったので、このような初心者感満載な記事になりました。
アルゴリズム問題　paiza練習問題　長テーブルのうなぎ屋

こちらの問題はpaizaさんにて公開されているBランクの練習問題の自分なりのまとめ、備忘録です。
スキルチェックの公式問題の流出を目的、意図したものではありません。



#問題
うなぎ屋にはとても大きい長テーブルがあり、テーブルの周りにn個の座席が配置されています。
座席には、時計回りに1, 2, …, nと番号が振られています。
座席はテーブルの周りに配置されているので、座席番号nの座席と1の座席は隣接しています。

今、m個のグループの人達が座席に順番に座りに来ます。i番目(1≦i≦m)のグループの人数をa_i人とします。
彼らは、長テーブルに並んだ座席の内、ある連続するa_i個の座席に一斉に座ろうとします。

ただしお客さんは江戸っ子なので、それら座席のうち、いずれか一つでも既に先客に座られている座席があった場合、
一人も座らずにグループ全員で怒って帰ってしまいます。江戸っ子は気が早いんでぃ。

入力では、i番目のグループが座ろうとする連続した座席の位置は、整数b_iにより指定されます。
i番目のグループは、座席番号b_iの座席を始点として、そこから時計回りにa_i個分の座席に座ろうとします。

最後のグループが座りに来た後、無事に長テーブルの座席に着席出来ている人数を出力するプログラムを作成してください。

#入力
入力はm+1行から成ります。
1行目にはn(座席数)とm(グループ数)が半角スペース区切りで入力されます。
i+1行目(1≦i≦m)には2個の整数a_i(グループの人数)とb_i(着席開始座席番号)が半角スペース区切りで入力されます。

#出力
最後のグループが座りに来た後、無事に座席に着席出来ている人数を1行で出力してください。

#回答コード１（答にたどり着けない）

```rb:
input_lines = gets.split(" ").map(&:to_i)
chairs=Array.new(input_lines[0] , false) #席数 falseデフォで座っている席をtrue
group = input_lines[1] #グループ数

group.times do
    input = gets.split(" ").map(&:to_i)
    f_chair=input[1]-1 #組み毎の先頭が座る席番 インデックスのため-1
    cnt=input[0] #人数
    if f_chair + cnt <= chairs.size then #座る席が0をまたぐか
            next if chairs[f_chair , cnt].any? #座ろうとした席が一つでも埋まっていれば退出してしまう 
            chairs[f_chair,cnt].map{|c| c = true} 
    else    
            next if chairs[0 , (f_chair+cnt)%chairs.size].each{|c|c = true} || chairs[f_chair..-1].each{|c|c = true}
            chairs[0 , (f_chair+cnt)%chairs.size].map{|c| c = true}
          　chairs[f_chair..-1].map{|c| c = true}

    end
end

#答としてtrueの数を出力
```
##解説
上のコードで長い事躓いた
というのも

```rb:
 chairs[f_chair,cnt].map{|c| c = true} 
```

この部分で、「着席済みの席はtrueに置き換える」としたいがchairsの値の置き換えが行われない
eachメソッドに置き換えてみたりデバック用のprint出力をちらばらせて確認しながらコードをかいてみたがどうにも
[false, false, false, false, false, false] 
のまま処理が進んでしまう。
参考：https://teratail.com/questions/108200#
質問サイトに投げて解決。

”ある配列 ary のインデクス n の位置からm 個を 値 x で上書きする。”

勉強になりました。


#回答コード２（正答率１００％）


```rb:

input_lines = gets.split(" ").map(&:to_i)
group = input_lines[1] #組数

chairs=Array.new(input_lines[0] , false) #席数 falseデフォ 


while(gets)
    input = $_.split(" ").map(&:to_i)
     cnt=input[0] #人数
     f_chair=input[1]-1 #組毎の先頭が座る席番 インデックスのため-1
     

    if f_chair + cnt <= chairs.size then #座る席が0をまたぐか
           next if chairs[f_chair , cnt].any? #座ろうとした席が一つでも埋まっていれば退出してしまう   
           chairs[f_chair,cnt] = Array.new(cnt , true)
             
    else    #またぐ
            sippo = (f_chair+cnt)%chairs.size

            next if chairs[0 , sippo].any? || chairs[f_chair..-1].any?
            chairs[0 , sippo] = Array.new(sippo , true)
            chairs[f_chair..-1] = Array.new(cnt-sippo , true)
             
    end
end


puts chairs.grep(true).size
```

##解説
この問題の頭を悩ます部分は（上のコードの書き方のミスで悩んだとは別）
1．席が円を描いている
２．客の座り方には最後の席番から０をまたいで何人か座る事も考えうる
ということ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/202349/5473ccc5-c595-2927-34d0-1c8739ba9587.png)

参考：https://paiza.jp/learning/long-table?t=2fe1a138dcc3bbb167e6a97c7ff68672#editor-div

例に出すと26番から８名座ったりもすると言う事。
20から22名だったり。

なので
一つ目のif文でグループの一人目が座る席＋グループ人数が席数を超えるときつまり0をまたいですわるか否か
それぞれの二つ目のif文で既に座っていたらnextでループをとばすようにしている。
sippo　は席の最高値を超えている人数を表して応用した。
Mavenインストール



自分用のメモのため、色々詰め込んでいる


## Mavenダウンロード

```
# cd /usr/local/lib/

# sudo wget http://ftp.kddilabs.jp/infosystems/apache/maven/maven-3/3.5.2/binaries/apache-maven-3.5.2-bin.tar.gz

```

## Mavenインストール

```
# tar xzvf apache-maven-3.5.2-bin.tar.gz
# ln -s apache-maven-3.5.2-bin.tar.gz/ maven

# echo 'export MVN_HOME="/usr/local/lib/maven"' >> /etc/profile.d/maven.sh
# echo 'export PATH="${MVN_HOME}/bin:${PATH}"' >> /etc/profile.d/maven.sh
# source /etc/profile.d/maven.sh


```

```
$ mvn --version
Apache Maven 3.5.2 (138edd61fd100ec658bfa2d307c43b76940a5d7d; 2017-10-18T16:58:13+09:00)
Maven home: /usr/local/lib/maven
Java version: 1.8.0_151, vendor: Oracle Corporation
Java home: /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.151-5.b12.el7_4.x86_64/jre
Default locale: ja_JP, platform encoding: UTF-8
OS name: "linux", version: "3.10.0-693.el7.x86_64", arch: "amd64", family: "unix"


```

## javaをインストール

java-1.8.0-openjdk.x86_64だと開発環境が入らない(javacが使えなかった)のでjava-1.8.0-openjdk-devel.x86_64をインストールする．

```
# yum install java-1.8.0-openjdk-devel.x86_64
```

javaとjavacが使えることを確認して作業終了．

```/etc/profile.d/java.sh
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.151-5.b12.el7_4.x86_64
export PATH=$PATH:$JAVA_HOME/bin
```


確認

```
$ source /etc/profile.d/java.sh
$ echo $JAVA_HOME
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.151-5.b12.el7_4.x86_64
```
jenkinsのインストールとちょっとした設定


備忘録なので、散文ごめんなさい

## jenkinsのインストールとちょっとした設定

```
$ wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo
$ rpm --import http://pkg.jenkins-ci.org/redhat/jenkins-ci.org.key
$ sudo yum install jenkins
完了しました!

```

```
$ sudo vim /etc/sysconfig/jenkins
Jenkinsのポート番号が8080であることを確認。⇒8082に変更
JENKINS_PORT=“8082"
```

```
$ sudo systemctl enable jenkins
$ sudo systemctl start jenkins

```

Fairewallにより、外部からの接続が遮断されているため、
jenkinsで使用するポートを開放して上げる。
今回はポート80821である。

```
$ sudo firewall-cmd --zone=public --add-port=8082/tcp --permanent
success

$ sudo firewall-cmd --reload
success

```


## jenkinsのユーザを変更する

[http://kotaroito.hatenablog.com/entry/2012/12/26/124100]

gitとjenkinsを同一サーバにしており、
思いっきりハマりました。
上記、URLを参照して、ユーザを変更することで、うまく連携できるようになりました。

```/etc/sysconfig/jenkins

#JENKINS_HOME="/var/lib/jenkins"
JENKINS_HOME="/home/tonosama/jenkins"

#JENKINS_USER="jenkins"
JENKINS_USER="tonosama"

```

下記ディレクトリの権限を変更してあげましょう

```
chown kotaroito -R /var/log/jenkins/
chown kotaroito -R /var/cache/jenkins/

```


```Jenkinsを再起動
sudo systemctl restart jenkins
```
RxBluetoothKitとRxAndroidBleでreadしてみる

# はじめに
以前から気になっていたRxを使用したBLEライブラリを試してみました。

# RxBluetoothKitでreadしてみる
[RxBluetoothKit](https://github.com/Polidea/RxBluetoothKit)を使用しました。
導入や使い方はREADMEでなんとなくわかると思います。

## 環境
XCode: 9.2
Swift: 4.0

## Serviceの定義

```swift

enum SampleService: String, ServiceIdentifier {
    case Sensor = "SensorServiceUUIDを書く"
    case Device = "DeviceServiceUUIDを書く"
    case Battery = "BatteryServiceUUIDを書く"

    var uuid: CBUUID {
        return CBUUID(string: self.rawValue)
    }
}
```

## Characteristicの定義

```swift

enum SampleSensorCharacteristic: String, CharacteristicIdentifier {
    case HeartRate = "HeartRateCharacteristicUUIDを書く"
    case Temperature = "TemperatureCharacteristicUUIDを書く"

    var uuid: CBUUID {
        return CBUUID(string: self.rawValue)
    }

    var service: ServiceIdentifier {
        return SampleService.Sensor
    }
}
```

## Readしてみる
```swift
        let manager = BluetoothManager(queue: queue)
        manager
            .rx_state
            .filter { $0 == .poweredOn }
            .take(1)
            .flatMap { _ in manager.scanForPeripherals(withServices: nil).take(1) }
            .flatMap { $0.peripheral.connect() }
            .flatMap { $0.readValue(for: SampleSensorCharacteristic.Temperature) }
            .subscribe(onNext: { print("value:\([UInt8]($0.value!))")})
            .disposed(by: disposeBag)
```

# RxAndroidBleでreadしてみる
[RxAndroidBle](https://github.com/Polidea/RxAndroidBle)を使用しました。
導入や使い方はREADMEでなんとなくわかると思います。


## 環境
AndroidStudio:  3.0
kotlin:  1.1.51

## Readしてみる
```kotlin
        val TEMPERATURE_UUID = UUID.fromString("TemperatureCharacteristicUUIDを書く")
        val rxBleClient = RxBleClient.create(context)
        val setting = ScanSettings.Builder().build()
        rxBleClient.observeStateChanges()
                .startWith(rxBleClient.state)
                .filter { it == RxBleClient.State.READY }
                .flatMap { rxBleClient.scanBleDevices(setting).take(1) }
                .flatMap { it.bleDevice.establishConnection(false) }
                .flatMap { it.readCharacteristic(TEMPERATURE_UUID) }
                .subscribe({ value ->
                    Log.i("BLE sample", Arrays.toString(value))
                }, { error ->
                    Log.e("BLE sample", error.toString())
                })

```

# 終わりに
- Ble実装はcallbackやdelegate地獄になりやすいですが、簡潔にかけるのではないでしょうか。
- Rxで統一することでiOS、Androidの処理の流れに統一感が出るのではないでしょうか。
- 今回は時間がなくてreadを試しただけですが、writeやnotify、その他細かい実装もやってみたいと思います。
Qiita初投稿時の"![Payload Too Large]()"エラー

Qiita初投稿時に画像を貼りながら書き進めていくと、
```![Payload Too Large]()```
が途中から表示されます。

原因は、Qiitaにアップロード可能な容量が**月2MB**という制限によるもの。
ただし、**1記事でも投稿すると、この容量は月100MBに増えます**。一般の投稿ではなく限定共有投稿では、この制限は解除されないようです。
[随時更新] 仕事してて迷ったらここ見よう -まとめ-

# 概要

入社してとりあえず３ヶ月経ったけれども迷うことも多い。
ライブラリやフレームワークなどもそうだけれども、迷った時にどこを見たら良いのか。。。
自分なりにまとめてみる。他にもあるよ！などあったら共有していただけると喜びますm(_ _)m
よろしくお願いします。

# まとめ
### エラーが出たところ+その親クラスまでソースコードを読む
### ドキュメント
わからないことがあったらまず公式。

### 使っているライブラリ、フレームワーク => GitHubのIssue
結構有益な情報が載っていることも多いので、必見。

### 検索
エラーが出たらまずエラー文で検索する時も多いが、利用するときは内容を完全に理解してからでないと意味がないし、パスなどをぶっ壊して余計に痛い目を見る時がある。

### 質問サイトの過去問的なやつ
#### 日本国内
- [teratail](https://teratail.com/)
最近は言わずと知れたサイトですね。
- [stackoverflow(日本語)](https://ja.stackoverflow.com/) 世界で一番有名な質問サイトの日本語版

#### 外国(英語アレルギー克服)
- [stackoverflow](https://stackoverflow.com/)


# 現在積み残し

- [ ] どの順が場合によっては良いのか(優先度)
- [ ] アプローチのやり方でまとめておいた方が良い？
pyenvでinstallできない

pyenvでinstallができませんでした。前は何も問題なくできたのに。

```shell: 
$ pyenv install 3.5.3
Downloading Python-3.5.3.tar.xz...
-> https://www.python.org/ftp/python/3.5.3/Python-3.5.3.tar.xz
Installing Python-3.5.3...
ERROR: The Python ssl extension was not compiled. Missing the OpenSSL lib?

Please consult to the Wiki page to fix the problem.
https://github.com/pyenv/pyenv/wiki/Common-build-problems


BUILD FAILED (LinuxMint 18.3 using python-build 1.2.0-8-g785738d)

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

Last 10 log lines:
(cd /home/pokotsun/.pyenv/versions/3.5.3/share/man/man1; ln -s python3.4.1 python3.1)
if test "xupgrade" != "xno"  ; then \
	case upgrade in \
		upgrade) ensurepip="--upgrade" ;; \
		install|*) ensurepip="" ;; \
	esac; \
	 ./python -E -m ensurepip \
		$ensurepip --root=/ ; \
fi
Ignoring ensurepip failure: pip 6.0.8 requires SSL/TLS

```
##環境
linux mint 18.3


##試した方法

*1.* エラーメッセージ内で

```shell: 
Please consult to the Wiki page to fix the problem.
https://github.com/pyenv/pyenv/wiki/Common-build-problems
```
と言ってくれているのでpyenvのwikiを見て試してみる。
とりあえず依存関係を入れなおして再度installをやってみる。

```shell: 
$ sudo apt-get install -y make build-essential libssl-dev zlib1g-dev libbz2-dev \
libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev \
xz-utils tk-dev
```
リトライ 

```shell: 
$ pyenv install 3.5.3
Downloading Python-3.5.3.tar.xz...
-> https://www.python.org/ftp/python/3.5.3/Python-3.5.3.tar.xz
Installing Python-3.5.3...
ERROR: The Python ssl extension was not compiled. Missing the OpenSSL lib?

Please consult to the Wiki page to fix the problem.
https://github.com/pyenv/pyenv/wiki/Common-build-problems


BUILD FAILED (LinuxMint 18.3 using python-build 1.2.0-8-g785738d)
(以下略)
```
うまくいかない

*2.* エラーメッセージと照らしあわせてwikiを見ていくとopensslがまずいっぽい。いままではうまくいってたので何か知らない間に壊してしまったのかもしれない。opensslを入れなおしてみた。

```shell:
$ sudo apt-get remove libssl-dev
$ sudo apt-get install libssl-dev
```

リトライ


```shell: 
$ pyenv install 3.5.3

(以上略)

BUILD FAILED (LinuxMint 18.3 using python-build 1.2.0-8-g785738d)

(以下略)
```

うまくいかない...

その後また少し調べていくとgihubのissueで次の文を見つけた。
>Hi, look at #945, it's because Debian 9 uses OpenSSL 1.1.0 which support in CPython was added in 3.5.3 (more details in the issue above). Cheers

試しに自分の環境でのopensslのバージョンを調べてみる。

```shell:
$ openssl version
OpenSSL 1.1.0g  2 Nov 2017
```
ビンゴっぽい。

## 解決策
解決策まで提示してくれてた。ただし3.5.3以上じゃないとエラー出たりする。

```shell: 
$ CFLAGS=-I/usr/include/openssl LDFLAGS=-L/usr/lib pyenv install -v installしたいバージョン名,今回の場合は3.5.3
```

結構時間食ったので参考になれば嬉しいです。

##参考
[Common build problems · pyenv/pyenv Wiki](https://github.com/pyenv/pyenv/wiki/Common-build-problems)
[ERROR: The Python ssl extension was not compiled. Missing the OpenSSL lib? · Issue #950 · pyenv/pyenv](https://github.com/pyenv/pyenv/issues/950)
古いDoxygenを（ムリやり）Homebrewで管理する

古いDoxygenを利用してドキュメントを生成する必要があったため、古いDoxygenをHomebrewで（ムリやり）管理できるようにする方法をまとめました。
※ 今回利用したかったDoxygenのバージョンが古く、cmakeでのビルドにも対応していないバージョンだったため、以下のような方法を採用しています。
※ cmakeでのビルドに対応している場合は他のやり方を採用した方が良さそうでした。

## 今回の検証環境

|環境|バージョン|
|:-:|:-:|:-:|:-:|:-:|
|macOS| High Sierra 10.13.2|
|Homebrew|1.4.3|
|Doxygen（最新バージョン）|1.8.14|
|Doxygen（旧バージョン）|1.8.5|

## 最新バージョンのDoxygenをHomebrewでインストールする
```bash
brew install doxygen
```  

## 最新バージョンをコピーして、旧バージョン用のフォルダを作成する  
```bash
cd /usr/local/Cellar/doxygen

# cp -r ${最新バージョンフォルダ} ${旧バージョンフォルダ}
cp -r 1.8.14 1.8.5
```

## 旧バージョン用のdmgファイルをダウンロード＆マウントする
旧バージョンのdmgファイルは公式サイトの[Older releases](http://www.doxygen.org/download.html#oldrel)に記載されているリンク辿っていくとダウンロードできます。

## dmg内のdoxygenコマンドを旧バージョンフォルダにコピーする

```bash
# cp -f ${マウントしたdmgフォルダ}/Doxygen.app/Contents/Resources/doxygen ${旧バージョンフォルダ}/bin/doxygen
cp -f /Volumes/Doxygen/Doxygen.app/Contents/Resources/doxygen 1.8.5/bin/doxygen 
```

## HomebrewでDoxygenを旧バージョンに切り替える
```bash
# brew switch 旧バージョン
brew switch doxygen 1.8.5
```

以上の作業で、Homebrewでインストールできない古いDoxygenをHomebrewで管理できるようになります。
Vue.js + ElementUIでタイムテーブル作成アプリを作った

## ■あけおめ

すっかり2018年になりました。

イベントのタイムテーブルって、1つの時間が変更になると将棋倒し的に他の全ての時刻に影響して書き直すのがつらい。

例えば

```
12:00 会場
13:00 開会のおことば // 開会のおことばが13:30に変更になると以下の項目が全部30分ズレる…
13:30 表彰
14:00 お昼ごはん
15:00 アーティスト1
15:30 アーティスト2
・
・
・

```

みたいな感じ。

HTML、JSならできそうだな～とは常々思いつつ、生javascriptなんてもう書けたもんじゃないし、jQueryですらDOM操作がしんどいと実感したイヤー2017。
ナウい系フロントエンドa.k.a超トレンドと言っても過言ではないvue.jsとかAngularならこういうの得意なんじゃないの？ってことで作ってみた。

## ■できたやつ
**タイムテ作成くん**
https://suguruguruguru.github.io/timetablecreator/

## ■どうやってつかうの
・イベント名を入れて演者を追加する
・イベント開始時刻、転換時間、演奏時間を入れる
・開始時刻から逆算して各演者のタイムテーブルができあがる
・テキスト編集で微調整してコピペしたり、Excelで書き出す
・しかもlocalStrorageで前回の入力内容を記録
・いつでも時間変更かかってこいや状態

※演者っていうワードにしてしまって後悔
とにかくタイムテに入れたい項目のことです
「休憩」とか「開演」「完パケ」とかなんでも入れよう

## ■使ったもの
### Vue.js
https://jp.vuejs.org/index.html
核。CDNで入るし軽い。

### ElementUI
http://element.eleme.io/#/en-US
ダイアログとか右からニュルンって出るトーストとか。かわいい。

### Materialize
http://materializecss.com/
愛用品。jQuery依存なのが今回ちょっとネック。

### jquery.timepicker
http://jonthornton.github.io/jquery-timepicker/
ElementUIのタイムピッカーだとうまくonChangeが取れなかったり、
どうせMaterializeでjQuery入れるハメになったので諦念。

### js-xlsx/alasql
https://github.com/agershun/alasql/wiki
思考停止。Excel出力したいの要望があったので。

### ClipboardJs
https://clipboardjs.com/
思考停止。ググって一発目に出たので使った。

## ■所感
・Vueは導入が簡単だし、軽い**気がする**
・時間変更時はなにも考えずに、メンバ変数で持ってるオブジェクト配列の値を計算してずらすだけなので、ここは超恩恵が得られた
・順番入れ替えも配列入れ替えるだけで反映されるので超恩恵が得られた
・そのまま配列を文字列化して、テキストエリアのバリューにバインドしておくだけで変更検知してくれるのでマジ恩恵
**・デザインがしんどかった
・レスポンス対応がしんどかった
・UI考えるのがしんどかった**
・ペラ一枚ならGitHub Pagesでアップできるいい時代！~~(コンポーネント指向とは)~~
・「複数使いまわせるコンポーネントがあって、ちょっとずつページごとに変えて…」みたいなのを作ってみたくなった、というか本来そういう思想のフレームワーク
・Angularで全く同じものを作って比較とかしてみても面白そう といっても静的ページ1枚じゃそんな変わらんか

結論：
今年はUIとか考えるのをうまくなりたい。
vue-cliで新規プロジェクト作成したらハマったので忘却録


タイトル通り．
vue-cliで新規プロジェクト作成したら立ち上がる開発サーバが変わっていてハマったのでその忘却録．

# プロジェクトの作成
コマンド

```bash
$ vue init webpack my-project
```

選択肢は全部 `Y` (enter連打)

結果．

![Kobito.uIM4dT.png](https://qiita-image-store.s3.amazonaws.com/0/58048/f57c2545-a1a6-f9a6-89a9-18f6d9a8a79d.png "Kobito.uIM4dT.png")

ちゃんとできたように見える．
黄色の文字の指示通りディレクトリ移動して開発サーバ起動してみる．

# 開発サーバ立ち上げのエラー

コマンド

```bash
$ cd my-project
$ npm run dev
```

結果．

![Kobito.VEXiva.png](https://qiita-image-store.s3.amazonaws.com/0/58048/b8d2c733-6814-ce4e-502b-d6f0f2ed8eab.png "Kobito.VEXiva.png")

長いので省略

![Kobito.7ycxtR.png](https://qiita-image-store.s3.amazonaws.com/0/58048/5b3e4b98-b98f-721c-0473-3942c15c278d.png "Kobito.7ycxtR.png")

```
引数が見つかりません: config-name, context, entry, module-bind, module-bind-post, module-bind-pre, output-path, output-filename, output-chunk-filename, output-source-map-filename, output-public-path, output-jsonp-function, output-library, output-library-target, records-input-path, records-output-path, records-path, define, target, watch-aggregate-timeout, devtool, resolve-alias, resolve-extensions, resolve-loader-alias, optimize-max-chunks, optimize-min-chunk-size, prefetch, provide, plugin, open-page
```
と言われて起動できない．

# 環境とか

```bash
$ npm --version
5.6.0
$ node --version
v9.3.0
$ vue --version
2.9.2
$ webpack-dev-server --version
webpack-dev-server 2.10.0
webpack 3.10.0
```

# 原因と対応

ぐぐったら `webpack-dev-server` のバージョンが新しすぎるのが原因らしい．
エラーの内容的に，今まで必要じゃなかった引数が必須になったかなんかだと思う．
というわけで 2.9.7にバージョンを落とす．

```bash
$ npm i webpack-dev-server@2.9.7 --save-dev
+ webpack-dev-server@2.9.7
added 4 packages, removed 148 packages and updated 7 packages in 6.94s
npm i webpack-dev-server@2.9.7 --save-dev  9.63s user 1.27s system 149% cpu 7.293 total
```

![Kobito.kuZIJm.png](https://qiita-image-store.s3.amazonaws.com/0/58048/06c90c49-c49f-fd6a-fbe7-40d1ebbceb3e.png "Kobito.kuZIJm.png")

動いた．

# 参考
https://github.com/vuejs/vue-cli/issues/332
PycharmがDocker for Macに対応していた

## PycharmがDocker for Macに対応
今までPycharmでDockerコンテナをインタプリタとして使う際は、Docker for Macではなく、Docker Toolboxを利用することが多かったと思います。

これは、Docker for MacのAPIにアクセスするには、UNIXドメインソケットで通信する必要があることに起因しています（セキュリティ上の理由であえてそのような仕様にしているみたいです。）

一方、過去のPycharmは、UNIXドメインソケットでのAPIアクセスをサポートしておらず、Docker for Macと連携することはかなり面倒な手順が必要なようでした。

しかし、現在ではPycharm側の機能追加により、**Docker for Macとの連携がサポートされているようです**。

そこで今回はDocker for MacとPycharmを連携させる手順を紹介します。

## 設定方法
### Build, Execution Deployment -> Docker

わざわざいじらなくても、はじめからこのような設定になっているかもしれません。過去にDocker Toolboxを利用していた人で、設定がおかしい場合は、ここで直すことが可能です。

![docker_server](https://qiita-image-store.s3.amazonaws.com/0/87405/af80640d-ee64-5369-60d2-1d59beb01bb8.png)


### Project -> Project Interpreter

Add Remoteを選択します。

![project_interpreter](https://qiita-image-store.s3.amazonaws.com/0/87405/594a0401-b372-a6fc-4527-fd04b242917e.png)


### Remote Interpreter(コンテナ)指定

![add_remote_interpreter](https://qiita-image-store.s3.amazonaws.com/0/87405/008af7f5-31e8-6d03-f603-7c93a1018b82.png)

- Serverは先程設定したエンドポイントを選択
- Image nameはインタプリタとなるコンテナのイメージを選択
- interpreter pathは、コンテナ内でpythonコマンドが配置されているパスで、既にコンテナ内でパスが切られているなら、pythonだけで良い。

以上です。
後は、いつもどおりに実行すれば、コンテナ上でアプリケーションを実行させることができます。

## おまけ
### Docker Toolboxのアンインストール

不要になったDocker Toolboxを削除します。アンインストーラをgithubからcloneし、実行するだけ。

```
git clone https://github.com/docker/toolbox.git
cd toolbox
sudo osx/uninstall.sh
```

### Virtualboxのアンインストール

Virtualboxのサイトからdmgファイルをダウンロードし、その中にあるuninstallのスクリプトを実行するだけです。
javascript関連備忘録

js関連の備忘録。随時追記。

### ページ内リンクの移動アクション
jquery使用時

```html:hoge.html
<a href="#bottom">下へスムース！</a>

<div id="bottom">
ここまで移動
</div>

<script>
$(function(){
	$('a[href^="#"]').click(function(){
		var speed = 500;
		var href= $(this).attr("href");
		var target = $(href == "#" || href == "" ? 'html' : href);
		var position = target.offset().top;
		$("html, body").animate({scrollTop:position}, speed, "swing");
		return false;
	});
});
</script>
```

参考：[【jQuery】ページ内リンクをするするーっとスムースにスクロールするJavascript ｜ KLUTCHE](http://klutche.org/archives/536/)
バッテリー状況確認(Debian)

バッテリー状況の確認。

``` shell-session
$ cat /etc/debian_version 
9.3

$ ls /sys/class/power_supply/
AC  BAT0

$ cat /sys/class/power_supply/BAT0/
alarm               cycle_count         status
capacity            device/             subsystem/
capacity_level      manufacturer        technology
charge_full         model_name          type
charge_full_design  power/              uevent
charge_now          present             voltage_min_design
current_now         serial_number       voltage_now

$ cat /sys/class/power_supply/BAT0/uevent 
POWER_SUPPLY_NAME=BAT0
POWER_SUPPLY_STATUS=Full
POWER_SUPPLY_PRESENT=1
POWER_SUPPLY_TECHNOLOGY=Li-ion
POWER_SUPPLY_CYCLE_COUNT=0
POWER_SUPPLY_VOLTAGE_MIN_DESIGN=14400000
POWER_SUPPLY_VOLTAGE_NOW=15734000
POWER_SUPPLY_CURRENT_NOW=0
POWER_SUPPLY_CHARGE_FULL_DESIGN=2000000
POWER_SUPPLY_CHARGE_FULL=181000
POWER_SUPPLY_CHARGE_NOW=181000
POWER_SUPPLY_CAPACITY=100
POWER_SUPPLY_CAPACITY_LEVEL=Full
POWER_SUPPLY_MODEL_NAME=42T4646
POWER_SUPPLY_MANUFACTURER=SANYO
POWER_SUPPLY_SERIAL_NUMBER= 1864

$ cat /sys/class/power_supply/BAT0/charge_full_design 
2000000
$ cat /sys/class/power_supply/BAT0/charge_full
181000

$ grep CHARGE /sys/class/power_supply/BAT0/uevent |awk -F= 'NR==1{des=$2}NR==2{full=$2}{print $1 " \t= " $2}END{print "CHARGE_FULL / CHARGE_FULL_DESIGN = " full/des}'
POWER_SUPPLY_CHARGE_FULL_DESIGN 	= 2000000
POWER_SUPPLY_CHARGE_FULL 	= 181000
POWER_SUPPLY_CHARGE_NOW 	= 181000
CHARGE_FULL / CHARGE_FULL_DESIGN = 0.0905


```
(ヽ'ω`)設計値の9%...だと...
まあ元がジャンク品に付いとったものじゃからのう...と思ったのであった
参考: https://superuser.com/questions/808397/understanding-the-output-of-sys-class-power-supply-bat0-uevent
[PHP, MySQL] 配列データの一括INSERT

#したいこと
以下のようなデータを保持しており、

```php
$category = "碁";

$players = array();
$players[] = array("name" => "加賀", "gender" => "M");
$players[] = array("name" => "奈瀬", "gender" => "F");
$players[] = array("name" => "飯島", "gender" => "M");
```

こんな感じで**一括**INSERTしたい！

|category|name|gender|
|:-:|:-:|:-:|
|碁|加賀|M|
|碁|奈瀬|F|
|碁|飯島|M|

#SQL文の生成
ゴールとなるINSERT文は、
`INSERT INTO hogeTable (category, name, gender) 
VALUES ('碁', '加賀', 'M'), ('碁', '奈瀬','F'), ('碁', '飯島', 'M');`
である

以下のように生成する

```php

$arrayValues = "";

foreach ($players as $player) {
    $name   = $player['name'];
    $gender = $player['gender'];
    $arrayValues[] = "('{$category}', '{$name}', '{$gender}')";
}

$sql = "INSERT INTO hogeTable (category, name, gender) VALUES " 
        .join(",", $arrayValues);

echo $sql;
```
sklearn.neural_networkでsinを回帰

#概要
sklearn.neural_networkでsinを回帰してみた。

#写真
![sk8.png](https://qiita-image-store.s3.amazonaws.com/0/18104/c4250b61-a4c4-5ba6-3322-749b89ea787f.png)

#サンプルコード

```
from sklearn.neural_network import MLPRegressor
import numpy as np
import matplotlib.pyplot as plt

nn = MLPRegressor(hidden_layer_sizes = (8, ),
	activation = 'relu',
	solver = 'lbfgs',
	alpha = 0.001,
	batch_size = 'auto',
	learning_rate = 'constant',
	learning_rate_init = 0.1,
	power_t = 0.5,
	max_iter = 1200,
	shuffle = True,
	random_state = 9,
	tol = 0.0001,
	verbose = False,
	warm_start = False,
	momentum = 0.9,
	nesterovs_momentum = True,
	early_stopping = False,
	validation_fraction = 0.1,
	beta_1 = 0.9,
	beta_2 = 0.999,
	epsilon = 1e-08)

X = np.arange(-3, 3, 0.1).reshape(-1, 1)
y = np.sin(X).ravel()
n = nn.fit(X, y)
test = np.arange(-3, 3, 0.1).reshape(-1, 1)
pred = nn.predict(test)
plt.plot(test, y, 'b', test, pred, 'r--')
plt.savefig("sk8.png")
plt.show()


```

以上
jqでJSONを整形

REST API等でGETしたJSONの特定値のみを取得したい場合に役立つjq

##準備
Linux(CentOS/AmazonLinux)にjqをインストール

```
wget http://stedolan.github.io/jq/download/linux64/jq
chmod 755 jq
sudo mv jq /usr/local/bin/
```

or 

```
yum install -y  jq
```

jqコマンドを実行して以下となればOK

```shell-session
$ jq

jq - commandline JSON processor [version 1.4]
Usage: jq [options] <jq filter> [file...]

For a description of the command line options and
how to write jq filters (and why you might want to)
see the jq manpage, or the online documentation at
http://stedolan.github.com/jq
```

##整形

例えばこんなJSONを整形
※サンプルとしてKMSの鍵作成結果（aws kms create-key）をexample.jsonファイルとする（結果はAWS Document値）

```json
{
    "KeyMetadata": {
        "Origin": "AWS_KMS",
        "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab",
        "Description": "",
        "KeyManager": "CUSTOMER",
        "Enabled": true,
        "KeyUsage": "ENCRYPT_DECRYPT",
        "KeyState": "Enabled",
        "CreationDate": 1502910355.475,
        "Arn": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab",
        "AWSAccountId": "111122223333"
    }
}
```

###[1] 特定key配下を取得したい場合

```json
$cat example.json | jq  '.KeyMetadata'

{
  "Origin": "AWS_KMS",
  "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab",
  "Description": "",
  "KeyManager": "CUSTOMER",
  "Enabled": true,
  "KeyUsage": "ENCRYPT_DECRYPT",
  "KeyState": "Enabled",
  "CreationDate": 1502910355.475,
  "Arn": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab",
  "AWSAccountId": "111122223333"
}
```

###[2] さらに値だけ取得したい場合

```shell-session
$cat example.json | jq  '.KeyMetadata[]'

"AWS_KMS"
"1234abcd-12ab-34cd-56ef-1234567890ab"
""
"CUSTOMER"
true
"ENCRYPT_DECRYPT"
"Enabled"
1502910355.475
"arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"
"111122223333"
```

###[3] 入れ子の特定キーの値だけ取得したい場合

-rオプションで " を除外できる

```shell-session
$cat example.json | jq -r '.KeyMetadata | .KeyId'


1234abcd-12ab-34cd-56ef-1234567890ab
```

###[4]前方一致で特定文字を含むものを抽出

```shell-session
$cat example.json | jq '.[] | select(.KeyManager | startswith("CUS"))'

  "Origin": "AWS_KMS",
  "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab",
  "Description": "",
  "KeyManager": "CUSTOMER",
  "Enabled": true,
  "KeyUsage": "ENCRYPT_DECRYPT",
  "KeyState": "Enabled",
  "CreationDate": 1502910355.475,
  "Arn": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab",
  "AWSAccountId": "111122223333"
```


###[5]完全一致で特定文字を含むものを抽出

```json
$cat example.json |
jq '.[] | select(.KeyManager=="CUSTOMER")'
{
  "Origin": "AWS_KMS",
  "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab",
  "Description": "",
  "KeyManager": "CUSTOMER",
  "Enabled": true,
  "KeyUsage": "ENCRYPT_DECRYPT",
  "KeyState": "Enabled",
  "CreationDate": 1502910355.475,
  "Arn": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab",
  "AWSAccountId": "111122223333"
}
```

##参考

https://dev.classmethod.jp/tool/road-to-jq-master-apprentice/