OmniAICreator/Qiita-1.07M huggingface dataset:
gulp.jsでejsが動く環境をつくる

##環境
Mac

##前提
npm がインストールされていること。
以前にインストールしたのをメモりました。
こちらも参考にしてください
▶︎[nvmで、Node.jsとnpmのインストール（Mac）](https://qiita.com/yuuki_tf/items/19e64eb3ee9bda947db0)



##方法

```shell
作業用ディレクトリに移動します
cd [作業用ディレクトリ]/

# init処理
npm init

# 必要パッケージをインストールします
npm install gulp --save
npm install gulp-ejs --save-dev

# gulpfile.js を作ります
touch gulpfile.js

# ソース用とコンパイル先のディレクトリを用意します
mkdir -p src/ejs dist/ejs

# 動作確認用にejsファイルを作成しておきます
echo 'hello ejs' > src/ejs/index.ejs

```

```Javascript:gulp.js

//gulpfile.jsに以下記載
const gulp = require('gulp');

gulp.task('ejs', function() { // タスク定義
    gulp.src(
        ['src/ejs/*.ejs', '!' + 'src/ejs/_*.ejs'] // _から始まるejsファイルを除外←★場合によっては各々設定してください
    )
        .pipe(gulp.dest('dist/ejs')); // 出力先←★場合によっては各々設定してください
});

```

```shell

# 動作させて、index.jsが誕生していることを確認
./node_modules/gulp/bin/gulp.js ejs

```

```Javascript:gulp.js

//ejsをhtmlにします
const gulp = require('gulp');
const ejs = require('gulp-ejs');//←★追加

gulp.task('ejs', function() { // タスク定義
    gulp.src(
        ['src/ejs/*.ejs', '!' + 'src/ejs/_*.ejs'] // _から始まるejsファイルを除外
    )
        .pipe(ejs({},{},{'ext': '.html'})) // 拡張子指定←★追加
        .pipe(gulp.dest('dist/ejs')); // 出力先
});

```

```shell

# 動作させて、index.htmlが誕生していることを確認
./node_modules/gulp/bin/gulp.js ejs

```

##ハマったところ
1.gulpfile.jsに記載する際。
多くのサイトでは{}をひとつしか書いてないものがよく紹介されてました。
（度々変わるらしいです。）


```Javascript:gulp.js

//正しい
.pipe(ejs({},{},{'ext': '.html'})) // 拡張子指定

//間違い
.pipe(ejs({},{'ext': '.html'})) // 拡張子指定

```

2.node_moduleで足りないモジュールがあったので以下の手順で追加

```linux
npm install -g npm-install-missing
npm-install-missing
```
IBM Cloud Functions (OpenWhisk) Action の環境一覧 (runtimes)

# 概要

[OpenWhisk のリポジトリ](https://github.com/apache/incubator-openwhisk/blob/master/docs/actions.md)や[ドキュメント](https://console.bluemix.net/docs/openwhisk/openwhisk_reference.html#openwhisk_reference)から分かるのですが、表形式で一覧できないので、作っておきます。
CLI で `action create` する際の `--kind` パラメーターに指定するやつです。
(Dockerは `--docker` 指定、バイナリは `--native` 指定なので割愛。GOもビルドしたバイナリをアップします）

| .kind | .image.name | .default | .deprecated |
|:--|:--|:-:|:-:|
nodejs|nodejsaction||**true**
nodejs:6|nodejs6action|**true**|false
nodejs:8|action-nodejs-v8|false|false
python|python2action||false
python:2|python2action|**true**|false
python:3|python3action||false
swift|swiftaction||**true**
swift:3|swift3action||**true**
swift:3.1.1|action-swift-v3.1.1||false
swift:4.1|action-swift-v4.1|**true**|false
java|java8action|**true**|false
php:7.1|action-php-v7.1|false|false
php:7.2|action-php-v7.2|**true**|false
ruby:2.5|action-ruby-v2.5|**true**|false

# 材料
- [OpenWhisk の runtimes.json](https://github.com/apache/incubator-openwhisk/blob/master/ansible/files/runtimes.json)
- `curl`, `jq`, `tr`, `sed`

# 手順

`runtimes.json` を GET してきて `jq`/`tr`/`sed` で markdown の table 風に。

```shell
$ curl -s https://raw.githubusercontent.com/apache/incubator-openwhisk/master/ansible/files/runtimes.json \
 | jq -r '.runtimes[][] | [.kind, .image.name, .default, .deprecated] | @csv' \
 | tr , '|' | sed 's/"//g' | sed 's/true/**true**/g'
nodejs|nodejsaction||**true**
nodejs:6|nodejs6action|**true**|false
nodejs:8|action-nodejs-v8|false|false
python|python2action||false
python:2|python2action|**true**|false
python:3|python3action||false
swift|swiftaction||**true**
swift:3|swift3action||**true**
swift:3.1.1|action-swift-v3.1.1||false
swift:4.1|action-swift-v4.1|**true**|false
java|java8action|**true**|false
php:7.1|action-php-v7.1|false|false
php:7.2|action-php-v7.2|**true**|false
ruby:2.5|action-ruby-v2.5|**true**|false
```
create-react-appでPostCSS環境を作る

create-react-appを使って作成したReactアプリに、PostCSSの設定をしていきます。

【前提】
・node.jsがインストールされている
・create-react-appがグローバル環境にインストールされている

`create-react-app`でReactプロジェクトを作成します。

```
$ create-react-app myapp
$ cd ./myapp
```

postcss-cliとPostCSSのプラグインを追加していきます。

```
$ yarn add -D autoprefixer cssnano postcss-nested postcss-cli npm-run-all 
```

続いて、プロジェクトのルートディレクトリに`postcss.config.js`を作成します。 

```
$ touch postcss.config.js
```

```postcss.config.js
module.exports = {
  plugins: [
    require('postcss-nested'),
    require('autoprefixer'),
    require('cssnano')({
      preset: 'default',
    }),
  ],
};
```

`App.css`を`styles/main.css`にリネームします。

```
$ mkdir src/styles
$ mv src/App.css src/styles/main.css
```
`App.js`から`import './App.css';`を削除します。

`main.css`でSassのようにネスト記法が使えるようになります。
このときに、テキストエディタのプラグイン等設定で、PostCSSに対応させておくと便利です。

```src/styles/main.css
body, html {
  margin: 0;
  padding: 0;
}

.App {
  text-align: center;

    &-logo {
        animation: App-logo-spin infinite 20s linear;
        height: 80px;
    }

    &-header {
        background-color: #222;
        height: 150px;
        padding: 20px;
        color: white;
    }

    &-title {
        font-size: 1.5em;
    }

    &-intro {
        font-size: large; 
    }
}
@keyframes App-logo-spin {
  from { transform: rotate(0deg); }
  to { transform: rotate(360deg); }
}
```
`package.json`の`"scripts"`を書き換えることで、
`postcss-cli`のコマンドを使って、
`src/styles/main.css`をコンパイルして`src/index.css`にビルドしたいと思います。

```package.json
{
// 一部抜粋
  "scripts": {
    "build:css": "postcss src/styles/main.css -o src/index.css",
    "watch:css": "postcss src/styles/main.css -o src/index.css -w",
    "start": "npm-run-all -p watch:css start-js",
    "start-js": "react-scripts start",
    "build-js": "react-scripts build",
    "build": "npm-run-all build:css build-js",
    "test": "react-scripts test --env=jsdom",
    "eject": "react-scripts eject"
  },
}
```

ビルド環境はこれで完成です。

```
開発環境
$ yarn start

ビルド
$ yarn build
```
WebViewでスクロールバーを非表示にする方法

# Androidでスクロールバーを非表示にする方法
久々の投稿です。
最近Androidのアプリ開発も順調に進んできて、一通り知識がついたのでまとめ的なものを投稿したいと思います。

現在学生向けの情報アプリを作っており、Webサイトをアプリに読み込ませて表示するWebViewというものを使用しました。

その際某ニュースアプリではスクロールバーが表示されていないのに自分が作ったものには縦横のスクロールバーが表示されてしまうという事件が発生したので非表示のやり方を掲載します。

```main.xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <WebView
        android:id="@+id/webview_id"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    </WebView>

</FrameLayout>
```
xmlでWebViewを表示できるようにしてあげます。

```MainActivity.java
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // レイアウトに設置したWebViewを追加
        WebView webView = findViewById(R.id.webview_id);
        // JavaScriptを有効化
        webView.getSettings().setJavaScriptEnabled(true);

        // 縦横のスクロールバーを非表示
        webView.setVerticalScrollBarEnabled(false);
        webView.setHorizontalFadingEdgeEnabled(false);

        // リンクをクリックしたときに標準ブラウザへ遷移させずにWebView内で表示。
        webView.setWebViewClient(new WebViewClinet());
        // 「loadUrl」で、表示させたいURLを記述 （ここではChromeを表示）
        webView.loadUrl("https://www.google.com");
    }
}
```
```
webView.setVerticalScrollBarEnabled(false);
webView.setHorizontalFadingEdgeEnabled(false);
```
簡単に言ってしまうとこの二行を追加するだけでスクロールバーを削除することができます。
時間がある時に別Activityを開いてリンクに飛ぶ方法を投稿したいと思います。

一ヶ月しか触ってないけど色々な知識がついた、、、
投稿頻度をあげていきたいと考えています。
electron-builderでElectronアプリのビルド

巷ではelectron-packagerが流行っているみたいですが、微妙にやりたいことができなかったので探していたら、electron-builderというのを見つけました。
その際の導入手順などを個人用のメモとして残そうかと思います。

とりあえず動けばいいとします、詳しいことを知りたい方は[公式サイト][eb]を見てください。

なお、Electronでの開発はできている前提とします。


## インストール
ぼくはnpmでインストールしました。

```
npm i -D -g electron-builder
```

`i`(`install`)はインストールコマンドで、
`-D`(`--save-dev`)はpackage.jsonの`devDependencies`に自動で記載するの意で、
`-g`はglobal環境にインストールするの意です。(任意)

globalインストールした時にパスが通ってなくて悩んだことがあるので、どこかで動かないときはそのへんを調べてみるといいかもしれません。


## フォルダー構成を変える
特にいじらなくても動くようですが、ビルド用とアプリ用で設定を変えられるようなので使ってみます。

今までに作っていたフォルダ群は、`/app`を作ってその中に入れてあげます。

`/app`と同じ階層で`npm init`を実行してあげます。


## ビルド用コードを書く
コマンドでもできると思いますが、せっかくなのでNode.jsで書こうと思います。

`/app`と同じ階層にファイルを作ってください。

```build-win.js
'use strict';

const builder = require('electron-builder');
const fs = require('fs');
const packagejson = JSON.parse(fs.readFileSync('./app/package.json', 'utf8'));

builder.build({
	platform: 'win',
	config: {
		'appId': `com.example.${packagejson.name}`,
		'win': {
			'target': 'zip',
		},
	},
});
```
```build-mac.js
~~(略)~~
	platform: 'mac',
	config: {
		'appId': `com.example.${packagejson.name}`,
		'mac': {
			'target': 'zip',
		},
	},
~~(略)~~
```

mac版をビルドするときは、win版の中身を置き換えればできるはずです。

`appID`の`com.example.${packagejson.name}`の部分は適宜置き換えておいてください。

とりあえず動かす用なので、細かい設定などは全くしません。
前述の通り[公式サイト][eb]を見てください。

## ビルドしてみる
先程用意したコードを実行してあげましょう。

先程ファイルを作ったディレクトリーで、以下のコマンドを実行します。

```
node build-win
```

ファイル名を変えていた場合は適宜置き換えてください。

そうするといろいろログが出て、`/dist/`内にビルドされたアプリがあると思います。

## 終わり
メモ用&浅い知識なので適当なところがあるかもしれませんが、ご了承ください。



[eb]: https://www.electron.build
[Swift] 画像上にアイコンを乗せ、移動させる単純な方法

画像上に乗せたアイコンか人物を移動させて、動かしたい時に、一番単純な方法で実装してみる。

<img width="248" alt="スクリーンショット 2018-09-10 15.36.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/175364/b3b1257c-9510-ca42-92b6-cb3df316c8e4.png">

### StortBoard側
1. 背景用のImageViewを設定
2. アイコンor人物用のImageViewを設定
3. 上下左右移動用のUIButtonを設定
4. 上下左右にタグ付け(1~4)

各ViewをOutletで接続

```MapViewController.swift
    @IBOutlet weak var mapView: UIImageView!
    @IBOutlet weak var iconView: UIImageView!
    @IBOutlet weak var topButton: UIButton!
    @IBOutlet weak var rightBUutton: UIButton!
    @IBOutlet weak var leftButton: UIButton!
    @IBOutlet weak var bottomButton: UIButton!
```

### ViewController側
移動用Functionを定義。
移動は上下左右の4方向なので、enumで定義してしまいます。

```MapViewController.swift
    enum Direction: Int {
        case top = 1, right, left, bottom
        
        func calcMovedRect(from rect: CGRect, distance: CGFloat) -> CGRect {
            var movedRect = CGRect()
            switch self {
            case .top:
                movedRect = CGRect(x: rect.origin.x, y: rect.origin.y - distance, width: rect.width, height: rect.height)
            case .right:
                movedRect = CGRect(x: rect.origin.x + distance, y: rect.origin.y, width: rect.width, height: rect.height)
            case .left:
                movedRect = CGRect(x: rect.origin.x - distance, y: rect.origin.y, width: rect.width, height: rect.height)
            case .bottom:
                movedRect = CGRect(x: rect.origin.x, y: rect.origin.y + distance, width: rect.width, height: rect.height)
            }
            return movedRect
        }
    }
```

後はこのfunctionを、IBAction経由で呼ぶか、addTargetで呼ぶかすれば終了

### AddTarget経由
```MapViewController
    @objc func moveIcon(_ sender: UIButton) {
        guard let direction = Direction(rawValue: sender.tag) else { return }
        self.iconView.frame = direction.calcMovedRect(from: self.iconView.frame, distance: 15)
    }
```
Kotlinのデータクラスにファクトリメソッドを用意したい

## 概要

```kotlin
data class Hoge private constructor(val fuga: String, val piyo: String1) {

    companion object {
        fun create() = Hoge("fuga", "piyo")
    }
}
```

このようにしてデータクラスのファクトリメソッドを用意すると、以下のような警告が出る

> Private data class constructor is exposed via the generated 'copy' method.
> Inspection info: This inspection reports private constructors of data classes because they are always exposed via the generated copy method.

copyメソッドがあるからprivateにしても意味ないよってことみたい

例えば以下のようにすると、ファクトリで指定した値以外を持つデータクラスができてしまう。

```kotlin
val hoge = Hoge.create()
val hogeCopy = hoge.copy(fuga = "FUGA", piyo = "PIYO")
```

## 解決策

インタフェースを使う。

```kotlin
interface Hoge {
    val fuga: String
    val piyo: String

    companion object {
        fun create(): Hoge = HogeData("fuga", "piyo")
    }
}

private data class HogeData(override val fuga: String, override val piyo: String) : Hoge
```

これだとcopyもできない。実体はデータクラスなのでequalsの判定もちゃんとされる。

参考ページを見て、なるほどと思いました。

これはKotlinに限らず、他の言語でもファクトリメソッドを作るときに参考になりそう。

## 参考

https://www.reddit.com/r/Kotlin/comments/78dl7m/data_class_factory_constructor_issue/dowt2dr
Ricoh camera SDK for .NET,C# のUSB接続カメラ撮影から画像保存まで

今回は(英語)http://api.ricoh/docs を参考にしながら一通りの流れについてのまとめをメモ

<h2>カメラ接続</h2>
Docs : <a>https://api.ricoh/docs/camera-usb-sdk-dotnet/connection/</a>

基本的にここにあるコード、でカメラ接続ができる。

```cs
DeviceInterface deviceInterface = DeviceInterface.USB;
List<CameraDevice> detectedCameraDevices = CameraDeviceDetector.Detect(deviceInterface);
CameraDevice cameraDevice = detectedCameraDevices.First();
Response response = cameraDevice.Connect(deviceInterface);
```

このとき、<code>cameraDevice</code>インスタンスがカメラ本体と対応している。
このオブジェクトのメソッドの中に、「startCapture(画像を取らせる)」や「ライブビュー開始」といったものがある。
またメンバーには「Images」などの、画像のデータを保管している変数がある。
cameraDeviceのクラスの中身は<a>https://api.ricoh/docs/camera-usb-sdk-dotnet/assets/img/Ricoh.CameraController.png</a>に記載されている

<h2>画像の撮影</h2>
Docs : <a>https://api.ricoh/docs/camera-usb-sdk-dotnet/capture/</a>
撮影は<code>CameraDevice.StartCapture()</code>で行う。
このメソッドが実行されると、カメラの撮影が行われ、接続されたカメラの中で撮影された画像の保存処理が始まる。

<h2>画像の保存</h2>
Docs : <a>https://api.ricoh/docs/camera-usb-sdk-dotnet/image-handling/</a>
画像データは、<code>cameraDevice.Images</code>に配列で保存されている。
最新の画像データは<code>cameraDevice.Images[0]</code>になっている。
※カメラ内での画像の保存処理が終わっていない場合は前のものが入っている

これを<code>image.GetData()</code>メソッドを使用して、画像を保存する。
このとき、GetDataメソッドに、画像の保存先となるファイルパス(ファイル名を含む）を指定したFileStreamオブジェクトを渡す

```cs
using (FileStream fs = new FileStream(filePath, FileMode.Create, FileAccess.Write)){
    Response imageGetResponse = image.GetData(fs);
}
```
Railsで ActiveRecord::ConnectionNotEstablished: No connection pool with 'primary' found. がでたら確認すること。

RailsのDBまわりではまった。Modelで以下のようなエラーがでる。

`ActiveRecord::Base`を継承した`MyAppModel`でDBアクセスを試みると以下のようなエラーがでた。

```
ActiveRecord::ConnectionNotEstablished: No connection pool with 'primary' found.
```

**「コネクションプールにコネクションがない」** というメッセージだけ。
そもそも接続情報があっているのかっていうあたりのメッセージがないので、詳細な状況がわからない。
RailsConsoleでいろいろやって調べられそうだったのでそうした。

`$ ./bin/rails c`

コンソールを開いてDBにちゃんとつながっているか確認する。
コネクションまわりは基底の `ActiveRecord::Base` でやってたはずだよね、という朧気な記憶から探っていく。

```ruby
# なんかそれらしいメソッドがないか探す
pry(main)> ActiveRecord::Base.methods.grep(/conn/)
=> (省略)

# それらしいメソッドがあったので確認
pry(main)> ActiveRecord::Base.connected?
=> nil

# つながっていない
# 次にconfigがどうなってるか確認したい
# Rails.configuration から取得できるらしい
pry(main)> Rails.configuration.instance_values.grep(/database/i)
=> []
pry(main)> Rails.configuration.methods.grep(/database/i)
=> [:database_configuration]

# こちらにもそれらしいメソッドがある
pry(main)> Rails.configuration.database_configuration[ENV['RAILS_ENV']]
=> {"adapter"=>"postgresql", "encoding"=>"utf8", "pool"=>5, "database"=>"app_dev", "username"=>"usr_dev", "host"=>"localhost"}


# 設定はちゃんと読み込まれているので、明示的にコネクションを作成する
pry(main)> ActiveRecord::Base.establish_connection(
pry(main)*   Rails.configuration.database_configuration[ENV['RAILS_ENV']]
pry(main)* )
=> 省略

# 改めて接続確認
pry(main)> ActiveRecord::Base.connected?
=> true
```

ということで、ちゃんとDBに接続できた。

# 原因

ActiveRecordを使わない設定でApplicationが作られていて `config/application.rb`で無効化されていたため。

```ruby
require_relative "boot"

require "rails"
# Pick the frameworks you want:
require "active_model/railtie"
# require "active_job/railtie"
# require "active_record/railtie"
require "active_storage/engine"

# 以下略
```

`require active_record/railtie` をコメントアウトしているので無効の状態になっていた。このコメントを外すことでActiveRecordが使えるようになる。


# バージョン情報

```ruby
pry(main)> Rails.version
=> "5.2.0"
pry(main)> ActiveRecord.version
=> Gem::Version.new("5.2.0")
```

Rails6系でもそのまま適用できそう。
docker-compose で Ctrl-p ２回押し問題 (detach-keys の問題) を解決するには

# Ctrl-p 2回押し問題とは

[docker で Ctrl-p ２回押し問題 (detach-keys の問題) を解決するには](https://qiita.com/Yuki-Inoue/items/60ec916383025160fbb8#_reference-a2d9244a6c4496f4df05)
> デフォルトでは Ctrl-p は、detachKeys の一部として認識されていて、コンテナにこのキーを送るには、 Ctrl-p を２度押しする必要があった。

> 以下のファイルを ~/.docker/config.json に配置する。

```json:~/.docker/config.json
{
    "detachKeys": "ctrl-\\"
}
```

`docker run`や`docker exec`でシェルに入った際のCtrl-p 2回押し問題については上記の記事の対策で解決していた。

しかし、**`docker-compose run`**や**`docker-compose exec`**からシェルに入った際には、上記の対策が効いておらず、2回押し問題が解決していなかった。

# 解決方法

上記のdetachKeysの設定をした上で、docker-composeのバージョンを**1.20.0以上**に上げる。

docker-composeのバージョンが古い場合に起きていた問題であり、以下のissueで既に解決済みだった。
[Pass --detach-keys to docker-compose #3311](https://github.com/docker/compose/issues/3311)
FFTの乗算回数のオーダーでlog2Nがでてくる直感的な説明

# 背景

高速フーリエ変換の Cooley-Tukey のアルゴリズムを使うと、乗算回数が$N^2$から $N \log_2 N$ となる事実はしっていても、なんとなく $\log_2 N$ がでてくる理由がピンとこない人向け。Cooley-Tukey のアルゴリズムの解説は割愛するので、参考ページや他によいページがあるので、忘れた方は復習をしてください。

# 直感的な説明

まずは数式を日本語化して考えてみよう。計算回数が$\log_2 N$に比例するという部分は、

```math
計算回数 = \log_2 N =  \log_2 データ数
```

という意味となる、これを指数関数で書き換えてみる。

```math
N = データ数 = 2^{計算回数}
```

もう一歩具体化を進めて、データ数が２倍になった場合を考えると、

```math
2N = 2 \times データ数 = 2^{計算回数+1}
```

となる。

つまり、データ数が２倍になったときに、計算回数が１しか増えない状況の場合は、計算回数が $\log_2 N$に比例する。アルゴリズムとの対応ではこの方が直感的な気がする(当然だが、、$\log_2 2N = 1 + \log_2 N$ なので計算回数が１増える、とも考えられる。あくまで感覚的なお話です。)

誤解のないように、トータルのFFTの場合を補足すると、計算回数は$\log_2 N$ではなくて、$N \log_2 N$に比例するので、データ数が２倍になったときに、新しいデータがN個だけ加わった分の長波長成分の計算は必要になる。

フーリエ変換は周期性のある基底で展開するので、データが増えても高周波成分の位相の計算は新しくする必要がない。データが増えることで必要となる長い波長成分(低周波数成分)だけの計算で済む。フーリエ変換は対称性を持つため、それを利用した効率的な計算方法が可能になる。


# 参考ページ

- http://wwwa.pikara.ne.jp/okojisan/stockham/cooley-tukey.html
- https://jakevdp.github.io/blog/2013/08/28/understanding-the-fft/
WordPress RSS記事を取得

マルチサイトにして親サイトの記事を取得するときはSQLを使っていたけど
RSSを使ったら更新まで時間がすこーしかかるけど便利だったので備忘録。
これなら違うドメインでも取得出来る。


```php:news-list.php
<div class="list-box">
	<?php
    include_once(ABSPATH . WPINC . '/feed.php');
    $rss = fetch_feed(array( //複数サイトを取得したい時
        'https://hogehoge.com/?feed',
        'https://hoge.com/?feed=rss2&cat=1,2' //カテゴリーを指定したい時
    ));
    if (!is_wp_error($rss)) {
        $rss->set_cache_duration(1800);
        $rss->init();
        $maxitems = $rss->get_item_quantity(5); //5つ記事を出力する
        $rss_items = $rss->get_items(0, $maxitems);
        date_default_timezone_set('Asia/Tokyo');
    }
    ?>
	<?php if (!empty($maxitems)) : ?>
 
	<?php if ($maxitems == 0) {
        echo '<li>RSSデータがありませんでした.</li>';
    } else {
        foreach ($rss_items as $item) :;
    } ?>
 
 
	<a href="<?php echo $item->get_permalink(); ?>">
		<div class="list-img"><!--画像を表示-->
			<?php 
            $first_img = '';
            if (preg_match('/<img.+?src=[\'"]([^\'"]+?)[\'"].*?>/msi', $item->get_content(), $matches)) {
                $first_img = $matches[1];
            } ?>
			<?php if (!empty($first_img)) : ?>
			<img src="<?php echo esc_attr($first_img); ?>" class="news-thumbnail">
			<?php endif;  ?>
		</div>
		<div class="list-text">
			<span class="list-cat"><!--カテゴリーを表示-->
				<?php if ($category = $item->get_category()) {
                echo esc_html($category->get_label());
            }; ?>
			</span>
			<span class="list-date"><!--日付をを表示-->
				<?php echo $item->get_date('Y/m/d');?>
			</span>
			<?php
            $days = 3; //Newを表示させたい期間の日数
            $today = date_i18n('U');
            $entry = $item->get_date('U');
            $kiji = date('U', ($today - $entry)) / 86400;
            if ($days > $kiji) {
                echo '<font color="#ff0000">&nbsp;New!</font>';
            }
            ?>
			<h2>
				<?php echo $item->get_title();  ?><!--記事のタイトルを表示-->
			</h2>
			<span class="list-des"><!--記事を40文字分出力する-->
				<?php echo mb_substr(strip_tags($item->get_description()), 0, 40); ?>･･･</span>
		</div>
	</a>
 
	<?php endforeach; ?>
	<?php endif; ?>
</div>
```
htmlとかcssはお好みで変えてください。
Hello world が「こんにちわ 世界」になる訳

![TEH-19.jpg](https://qiita-image-store.s3.amazonaws.com/0/16757/33e52a24-7223-8fbe-3385-68c29c7d07dd.jpeg)

# Hello world

前から違和感があるけど、これを直訳して「こんにちわ 世界」と書いてあるのをよく見る。
日本語で「こんにちわ 世界」ってスゴイ違和感あるなと。

「世界の皆さんこんにちわ」

って言う方が良くないですか？

Hello everyone =>「皆さんこんにちわ」的な
UiPathでExcelから読み込んだ情報を再度Excelに書き込むと書式設定がどうなるか試してみた

## UiPathにはExcelからデータを読み込むアクティビティがあります。これ、読み込んだデータをそのまま書き込むと書式設定はどうなるのでしょう。

### 試してみた。
##### 以下のアクティビティを作成。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/189530/b2f79794-e7fd-196a-28b9-12bfa162937c.png)

"Excel application scope"を使用するパターンAと使用しないパターンBの2種類を用意。
Sheet1から読み込んだデータをそれぞれSheet2とSheet3に書き出します。

読み込むデータはセルの書式設定で表示形式を変えてみたり、文字のフォント設定を変えてみたりしています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/189530/46f9e3fb-44a1-2da3-6a0f-7284b4f867b9.png)


##### 実行してみた。
パターンA "Excel application scope"を使用する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/189530/4ba56411-685b-b02e-2e43-5c713079d964.png)

パターンB 使用しない
![image.png](https://qiita-image-store.s3.amazonaws.com/0/189530/c5fc9a4b-c2dc-3247-ce8d-2d18dace6968.png)

##### 結果を比較すると。
パターンAとパターンBでは結果を見ると違う箇所が２つあります。
パターンAではC2の文字列"123"が数値の123になり、F2の文字列"2018/09/07"が日付の2018/9/7になっています。
一方、パターンBではC2の文字列"123"は実行後も文字列、F2の文字列"2018/09/07"も実行後は文字列となっています。
（よく見るとパターンBのE2だけ別のフォントになっている…）

##### 分かったこと。
数値と日付以外の元の書式設定はUiPathでの読み込み時に破棄される。
"Excel application scope"を使用する場合と使用しない場合で挙動が少し違う。
日付や数値を文字列として書き出したい場合は"Excel application scope"を使用しない。

##### おまけ
今回のワークフローを実行した後のexcelのファイルを開いてみると、シートの並び順が↓のようになる。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/189530/d8a8faf1-c4dd-6418-7a42-a2c8b6611a4e.png)
Sheet1が読み込むデータのシート
Sheet2が"Excel application scope"を使用して書き出したシート
Sheet3が"Excel application scope"を使用せずに書き出したシート
どうやら、UiPath.Excel.Activities.ExcelWriteRangeアクティビティを使用するとシートは左に追加され、
UiPath.Excel.Activities.WriteRangeアクティビティを使用するとシートは右に追加されるようだ。
【Laravel】ルーティングをしているはずが404エラー？

備忘録として残します。

laravelをインストール後にルーティングの確認をしたかったため、とりあえず試しにphpinfo()を記述したファイルを下記に設置。
`/resources/views/phpinfo.blade.php`

あとは下記のファイルにルーティングを追加してphpinfo.blade.phpを紐づけ。

``` /routes/web.php

// http://任意のサーバ名/dev/phpinfoにアクセスすればOK
Route::get('dev/phpinfo', function(){
        // これでルーティング完了。
	return view('phpinfo');
});
```
おや？ルーティングできていない。アクセスしても404エラーになる。
うんーこの。
え、ルーティングしたよな？
コマンドで確認

```
C:\Laravelプロジェクトのパス>php artisan route:list
+--------+----------+-------------+------+---------+--------------+
| Domain | Method   | URI         | Name | Action  | Middleware   |
+--------+----------+-------------+------+---------+--------------+
|        | GET|HEAD | /           |      | Closure | web          |
|        | GET|HEAD | api/user    |      | Closure | api,auth:api |
|        | GET|HEAD | dev/phpinfo |      | Closure | web          |
+--------+----------+-------------+------+---------+--------------+
```
あるよなー
うーんこの。

色々調査し、キャッシュかな？と思い、 `php artisan route:clear` といった方法も試したが、うまくいかなかった。


バーチャルホストの設定を見直す。
どうやら `AllowOverride All` が記載されていないのが原因らしい。


```apache
<Virtualhost "サーバ名:80">
  ServerName サーバ名
  Documentroot "ドキュメントルート"
  <Directory "ドキュメントルート">
     # 本件とは関係ないがRequire all granted はドキュメントルートに関してアクセスを許可するという意味なので、下記の設定したが403エラーが表示されるのであれば設定する。
     Require all granted

     # AllowOverride All は.htaccessの使用を許可するという設定です。
     AllowOverride All
  </Directory>
</Virtualhost>
```

上記の設定でうまく無事ルーティング通り画面遷移ができました。
この事実からLaravelの弱点を裏付けることがひとつあり、
`Laravelとは.htaccessの使用が許可されていない場合は、導入することができないフレームワークということになります。`
ですが、昨今の環境で.htaccessが使用できないサーバというのは稀だと思うので、あまり気にする必要はないかと。（今回は開発用環境の構築中に出くわした問題なので。）

以上です。
ざっっくりUIKitまとめ

# はじめに
勉強会に参加したので備忘のため
内容はiOS開発のベース部分である```UIKit```について

# UIView
UIViewの役割

- サイズを持ち、ツリー構造を表現できる
- 適切に配置することができる(AutoLayout)
- UIのイベントに反応できる
- アニメーションを記述できる

#### ツリー構造
Viewの中にViewを持つ、といった親子関係を作ることができる
親の変化に応じて子も変化する
Viewも様々な種類がある
ex) UIImageView / UILabel / UIButton / UITableView...
たくさんあるViewの中から用途に適したViewを選び出すことが重要

#### AutoLayout
ViewとViewとの関係性を定義しておき、アプリ実行時に動的にサイズ、位置が決まる機能
ツリー構造の子から順に計算される
親のViewは子のViewの制約を考慮して自分自身を決める
定義時に矛盾があった場合エラーを出してくれる

#### UIイベント
後述します

#### アニメーション
UIView.animate で動きを表現できる

# UIViewController

UIViewControllerの役割

- 様々なViewを所有し、更新を行う
- 一般的に、Viewで起きるイベントを管理する開始点
- Viewのライフサイクルを管理する
- 遷移をコントロールする


####様々なViewを所有
ViewControllerは一つのRootViewを持つ
RootView配下のViewの参照を持つことができる
レイアウトの変更（端末の回転など）を元にViewを更新するのもViewController

####Viewのライフサイクル
ViewController配下にあるViewの表示に関するライフサイクルを管理する

- loadView  
 * Viewの要素自体を作る
- viewDidLoad  
 * Viewが読み込まれた後に呼ばれる = Viewがあることが保証されている  
 * Viewに対して初期的なデータを当てたりスタイルを当てたりする  
 * Rxであればここでバインディングすることが多い
- viewWillAppear  
 * Viewが表示されるタイミングで呼ばれる  
 * 他のViewControllerから戻ってくる際も呼ばれる  
 * 画面に表示されるタイミングで呼ばれると覚えておけば🙆
- viewDidAppear  
 * 遷移のアニメーションが完了したタイミングで呼ばれる  
 * 要素のアニメーションを開始したり、例えばチュートリアルのモーダルを出したり
- viewWillDisappear  
  * 他のViewControllerに遷移する際に呼ばれる
- viewDidDisappear  
 * 遷移が完了し完全に見えなくなった際に呼ばれる  
 * 動画再生を止めたり、アニメーションを止めたり、必要であればデータを保存したり等  
 
# ContainerViewController
 - 複数のViewControllerのコンテンツを1つのユーザーインターフェイスに結合する手段
 - 異なるView間のナビゲーションを容易にする

####例：NavigtationController
iOSでよく見る遷移をしてくれる(設定画面で使われてる)
やっていることは子のViewControllerのマネージメントとナビゲーションバーの変更だけ
子のViewControllerのライフサイクルも管理してくれる
NavigationのViewにはあまりアクセスできない

#UIApplication
- あらゆるイベントのハンドリングをする
 * アプリケーションの状態（起動・終了）
 * URLを開くユニバーサルリンク（ディープリンク）
 * メモリ等のシステムの状態に関するイベント
 * これらのイベントのをApplicationDelegateに伝える

#UIWindow
- 表示する先(UIScreen)と表示するもの(UIView)と、そして表示を管理するクラスを(UIViewController)をもっている
- ソフトウェアキーボードだったりモーダルアラートは別UIWindowとして表示している

#UIResponder
- UIViewやUIApplication等のスーパークラス
- UIView, UIViewController, UIWindow, UIApplication にイベントを感知する機能がある
- タッチやモーションを検知してイベントを発生させる

####たくさんの種類がサポートされている
 * UITapGestureRecognizer
 * UIPinchGestureRecognizer
 * UIRotaionGestureRecgnizer
 * UISwipeGestureRecognizer
 * UIPanGestureRecognizer
 * UIScreenEdgePanGestureRecognizer
 * UILongPressGestureRecognizer

#参考資料
[Human Interface Guidelines](https://developer.apple.com/design/human-interface-guidelines/)
[View Controller Programming Guide for iOS](https://developer.apple.com/jp/documentation/featuredarticles/ViewControllerPGforiPhoneOS/Introduction/Introduction.html)
[Auto Layoutガイド](https://developer.apple.com/jp/documentation/UserExperience/Conceptual/AutolayoutPG/)
WindowsでPyCharm使用するときPythonの標準出力をUTF-8で出す

- /Kで以下を設定
- `chcp 65001`
- `set PYTHONENCODING=utf-8`

**追記** 以下も追加したほうがいいかも

- `set PYTHONIOENCODING=utf-8`

![image.png](https://qiita-image-store.s3.amazonaws.com/0/20634/20c0fa99-edee-598b-f2fd-edf6b025050d.png)
[SQL]FROMのないSELECT文が便利

## 概要
ちょっとした小技です。
タイトルのとおりなんですが、例えばこんなSQLがエラーなく実行できます。

```SQL
mysql> SELECT 'hoge';
+------+
| hoge |
+------+
| hoge |
+------+
1 row in set (0.00 sec)
```

## 環境
MySQL 5.6.31

※SQL Server 2014 でもFROMなしSELECTが実行できました。RDBMS 次第かとは思いますがMySQL特有というわけではなく、他のDBでもできる気がします。



## 用途
実運用的にはあまり使い道ありませんが、筆者の場合はSQLの関数を試してみたいときに使いました。

### 例1. CURRENT_TIMESTAMP()
```SQL
mysql> SELECT CURRENT_TIMESTAMP();
+---------------------+
| CURRENT_TIMESTAMP() |
+---------------------+
| 2018-09-06 22:13:18 |
+---------------------+
1 row in set (0.00 sec)
```

### 例2. CONCAT()
```SQL
mysql> SELECT CONCAT('hoge', 'fuga', 'foo', 'bar');
+--------------------------------------+
| CONCAT('hoge', 'fuga', 'foo', 'bar') |
+--------------------------------------+
| hogefugafoobar                       |
+--------------------------------------+
1 row in set (0.00 sec)
```

### 例3. 変数の展開
```SQL
mysql> SET @dtime = CAST('2018-09-07 00:00:00' as DATETIME);
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT @dtime;
+---------------------+
| @dtime              |
+---------------------+
| 2018-09-07 00:00:00 |
+---------------------+
1 row in set (0.00 sec)
```

## ちなみに
この記事の内容はFROM句を付け忘れてたまたま発見しました。そのときはいい発見したんじゃないかと思ってましたが、関数のサンプル書く際に公式リファレンスを見てみたら関数の使用例でFROMのないSELECTがたくさん載ってました。なるほど、単に私だけが知らなかったようです:sweat_smile:
https://dev.mysql.com/doc/refman/5.6/ja/date-and-time-functions.html

まあ何か機会がありましたらみなさんもお試しください。
BQでNULLも含めた文字列連結がめんどくさい。。。

# 起こったこと
何気なくSQLを書いているとなぜか結果がNULLだらけになった。
`LEFT JOIN`なども入っていたがどうもjoinキーはあってそう？？

# 原因
公式ページを見ていると驚きの文字が。。。([クエリ リファレンス](https://cloud.google.com/bigquery/query-reference?hl=ja#concat))
![スクリーンショット 2018-09-10 13.23.47.png](https://qiita-image-store.s3.amazonaws.com/0/198985/6b8f6a65-21fc-9050-ef3f-87699e9ff3ab.png)
`NULL` って何もないからそのまま空文字として対応されるのかと思っていたら、
`CONCAT`で文字連結する場合は一個でも含まれると全て`NULL`にされる模様
`NULL`は`STRING`じゃないからエラーのような対応になるのか。。。？



# 対応
色々探しても`NULL`を無視して文字列連結してくれる関数がなかったので、
全て`IFNULL(TEXT,"")`で`NULL`の場合は空文字にした。
UDFでも対応できそうだけど何かうまい対応法が欲しいな。。。
VC++でDLLを作りC#から利用

参考：[C#からC/C++の関数をコールする方法　まとめ①](https://qiita.com/TackKaiware/items/27ebcf10bb2624db197a)

Visual Studio Community 2017を起動する。
メニューから[ファイル]->[新規作成]->[プロジェクト]を選択する。
[Visual C++/空のプロジェクト]を選択し、適当な名前を付ける。（例：`dlltest`）

メニューから[プロジェクト]->[新しい項目の追加]を選択する。
[C++ファイル(.cpp)]を選択し、適当な名前を付ける。（例：`dlltest`）

```dlltest.cpp
#define DLLEXPORT extern "C" __declspec(dllexport)

DLLEXPORT int __stdcall add(int a, int b)
{
	return a + b;
}

DLLEXPORT int __stdcall sub(int a, int b)
{
	return a - b;
}
```

ツールバーの[ソリューション構成]を`Release`にする。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/257554/07a29822-4ec2-8a78-f86e-61bc3fa37e36.png)

メニューから[プロジェクト]->[dlltestのプロパティ]を選択する。
[構成プロパティ/全般]を選択し、[プロジェクトの既定値/構成の種類]を[ダイナミック ライブラリ (.dll)]にする。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/257554/9862a05e-291a-a3dd-f6cf-58f1c60d70ce.png)

メニューから[ビルド]->[ソリューションのビルド]を選択する。（もしくはCtrl+Shift+B）
Release/dlltest.dllを任意のディレクトリにコピーする。

```dev.bat
@echo off
path %path%;C:\Windows\Microsoft.NET\Framework\v4.0.30319
cmd
```

```asssub.cs
// csc /platform:x86 addsub.cs

using System;
using System.Runtime.InteropServices;

class Program {
	[DllImport("dlltest.dll")]
	private extern static int add(int a, int b);
	[DllImport("dlltest.dll")]
	private extern static int sub(int a, int b);

	static void Main() {
		Console.WriteLine("add = {0}", add(1, 2));
		Console.WriteLine("sub = {0}", sub(1, 2));
	}
}
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/257554/48523a90-396b-cc45-bcc6-ad052356110e.png)

/platformオプションを指定しないと64bit dllを読み込もうとするようだ。

```
ハンドルされていない例外: System.BadImageFormatException: 間違ったフォーマットのプログラムを読み込もうとしました。 (HRESULT からの例外:0x8007000B)
   場所 Program.add(Int32 a, Int32 b)
   場所 Program.Main()
```

64bit版のcsc.exeでコンパイルすると警告は出るが実行は可能。

```
warning CS1607: アセンブリの生成 -- 参照アセンブリ 'System.Data.dll' は異なるプロセッサを対象にしています。
warning CS1607: アセンブリの生成 -- 参照アセンブリ 'System.Data.OracleClient.dll' は異なるプロセッサを対象にしています。warning CS1607: アセンブリの生成 -- 参照アセンブリ 'System.EnterpriseServices.dll'
        は異なるプロセッサを対象にしています。
warning CS1607: アセンブリの生成 -- 参照アセンブリ 'System.Transactions.dll' は異なるプロセッサを対象にしています。
warning CS1607: アセンブリの生成 -- 参照アセンブリ 'System.Web.dll' は異なるプロセッサを対象にしています。
warning CS1607: アセンブリの生成 -- 参照アセンブリ 'mscorlib.dll' は異なるプロセッサを対象にしています。
```

[ソリューション プラットフォーム]を[x64]にして64bit dllを作れば/platformオプションなしでも実行可能。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/257554/631e5fa0-0f2c-4a52-4ea1-32a1cad46fcb.png)

`.def`ファイルでexportする方法もある。

```dlltest.cpp
int __stdcall add(int a, int b)
{
	return a + b;
}

int __stdcall sub(int a, int b)
{
	return a - b;
}
```

```dlltest.def
EXPORTS
	add
	sub
```
nginxで特定のIPだけプロキシの向き先を変更する方法


# なぜそんなことした？
本番環境で

* 開発関係者は新規バックエンドシステムにアクセス
* 開発関係者以外のユーザは既存バックエンドシステムにアクセス

ということがしたかったので。

# どうやった？
以下の設定をnginxの設定ファイルに追加しました。

```nginx
    if ($remote_addr = "<自分がアクセスするIPアドレス>") {
      proxy_pass http://<新システムのアドレス>;
    }
    if ($remote_addr != "<自分がアクセスするIPアドレス>") {
      proxy_pass http://<旧システムのアドレス>;
    }
```

# 追記 複数IPアドレスがある場合

```nginx
　　　　　　　　set $isDeveloper false;

    if ($remote_addr = "<IPアドレス１>") {
      set $isDeveloper true;
    }
    if ($remote_addr = "<IPアドレス2>") {
      set $isDeveloper true;
    }
    if ($isDeveloper = true) {
      proxy_pass http://<新システムのアドレス>;
    }
    if ($isDeveloper = false) {
      proxy_pass http://<旧システムのアドレス>;
    }
```

# ちょっと躓いたこと
ifのあとにスペース入れないと怒られてしまいました。


```nginx:だめな例
    if($remote_addr = "<自分がアクセスするIPアドレス>") {
      proxy_pass http://<新システムのアドレス>;
    }
```

```nginx:良い例
    if ($remote_addr = "<自分がアクセスするIPアドレス>") {
      proxy_pass http://<新システムのアドレス>;
    }
```

# 注意
自分が趣味で運用しているサービスで行った対応です。
通常の商用システムでも安全に動作するかは保証できかねます。。。
Angularで検索可能なセレクトボックスを設置する

検索可能なSelectBoxを設置したく調べてみたところ、「Select2」というJQueryプラグインがAngularでも使用可能だったので使ってみました。


こんな感じ
![スクリーンショット 2018-09-10 12.22.43.png](https://qiita-image-store.s3.amazonaws.com/0/17135/d06588a1-681e-5b2e-4d37-1cfcbff96e8c.png)


# 準備

- JQueryとselect2をインストール
`yarn add jquery --save`
`yarn add select2 --save`

- angular.jsonに追加

```json
"scripts": [
  "node_modules/jquery/dist/jquery.js",
  "node_modules/select2/dist/js/select2.min.js"
]
```

- ng2-select2をインストール
`yarn add ng2-select2 --save`

- ***.module.tsに追加

```javascript

import { Select2Module } from 'ng2-select2';

@NgModule({
  imports: [
    ...,
    Select2Module
  ],
})
```

# 実装

- ***.component.htmlに追加

```html

<select2 [data]="exampleData"></select2>
```

- ***.component.tsにSelectデータを追加

```javascript
import { Select2OptionData } from 'ng2-select2';

exampleData: Array<Select2OptionData> = [
    {
      id: 'basic1',
      text: 'Basic 1'
    },
    {
      id: 'basic2',
      disabled: true,
      text: 'Basic 2'
    },
    {
      id: 'basic3',
      text: 'Basic 3'
    },
    {
      id: 'basic4',
      text: 'Basic 4'
    }
  ];
}
```

これで完成です。
Pytorch でシーケンスデータを順番で読込

## 動機
Pytorch で Seq2Seq のようなモデルを学習する時、学習データの入力順番が大事。LSTM のような RNN 学習機にデータを順番に入力する方法を記述。
## 読み込んだデータのパスが出力できる ImageFolder
Pytorch の datasets.ImageFolder がデータのパスを出力することができません。[こちら](https://gist.github.com/andrewjong/6b02ff237533b3b2c554701fb53d5c4d)に参照し、datasets.ImageFolder を継承して__getitem__関数を書き直した上でパス出力ができるようになりました。

```python
class ImageFolderWithPaths(datasets.ImageFolder):
    """Custom dataset that includes image file paths. Extends
    torchvision.datasets.ImageFolder
    """

    # override the __getitem__ method. this is the method dataloader calls
    def __getitem__(self, index):
        # this is what ImageFolder normally returns 
        original_tuple = super(ImageFolderWithPaths, self).__getitem__(index)
        # the image file path
        path = self.imgs[index][0]
        # make a new tuple that includes original and the path
        tuple_with_path = (original_tuple + (path,))
        return tuple_with_path
```
## データフォルダの順番
以下のような順番でシーケンスデータを読み込みたい。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/157710/fb94972d-032b-7e0a-f16a-d6833cf5e721.png)

## 一般の方法で読込
```python
data_dir = './pregnant'

data_transforms = transforms.Compose([
    transforms.Resize((224, 224)),
    transforms.ToTensor(),
    transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),])

image_datasets = {x: ImageFolderWithPaths(os.path.join(data_dir, x), 
                                          transform=data_transforms) for x in ['all']}

data_loaders = {x: torch.utils.data.DataLoader(image_datasets[x], 
                                               batch_size=batch_size, shuffle=False) for x in ['all']}

dataset_sizes = {x: len(image_datasets[x]) for x in ['all']}

for inputs, _, paths in data_loaders['all']:
    print(paths)
    break
```
出力結果

```python
'0.jpg', 
'1.jpg', 
'10.jpg', 
'100.jpg', 
'1000.jpg', 
'1001.jpg',
'1002.jpg', 
'1003.jpg', 
'1004.jpg', 
'1005.jpg', 
'1006.jpg', 
'1007.jpg'
...
```
この出力結果が予想と違うので使えません。
## ファイルの名前を指定して読込
[こちら](https://blog.csdn.net/whyymlm/article/details/77365847)を参照してファイルの名前を指定する方法で読み込みます。
dataloader を使わずに、普通のループで読み込んで順番が保証できます。そして torch.stack() を利用して dataloader の batch 単位読込がシミュレーションできます。

```python
from PIL import Image
data_iter = iter(data_loaders['all'])

# 本格
for i in range(1488 - batch_size):  
    imgs = []
    for ii in range(i, i + batch_size):
        path = os.path.join('{}.jpg'.format(ii)) 
        print(path)
        img = data_transforms(Image.open(path))
        imgs.append(img)
    print(len(imgs))
    imgs = torch.stack(imgs)
    print(imgs.size())
    break

# 比較用
for inputs, _, paths in data_loaders['all']:
    print(inputs.size())
    break
```

出力が以下となります：

```python
0.jpg
1.jpg
2.jpg
3.jpg
4.jpg
5.jpg
6.jpg
7.jpg
8.jpg
...
36
torch.Size([36, 3, 224, 224])
torch.Size([36, 3, 224, 224])
```
dataloader と同じようなシーケンス読込ができました。
Flutter on iOS で rootViewController を変更する

※この記事は Flutter v0.7.3 をもとにして書かれています

Flutter の iOS 向けの実装で、標準では FlutterViewController が rootViewController となっています。Flutter だけでアプリのすべてを実装できる場合は問題ありませんが、ネイティブの ViewController と連携する場合に rootViewController を違うものにしたい場合があります。例えば CARTUNE では root には `UINavigationController` を設定し、その最初の画面として `FlutterViewController` を使っています。

まず `ios/Runner/Info.plist` の `UIMainStoryboardFile` の項目を削除し、使わなくなった `ios/Runner/Base.lproj/Main.storyboard` も削除しておきます。

続いて AppDelegate の起動時の処理 `override func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool` でコードから `rootViewController` を設定するようにします。


```swift
@objc class AppDelegate: FlutterAppDelegate {
    var flutterViewController: FlutterViewController?

    ...
```

```swift
self.flutterViewController = FlutterViewController()
let nav = UINavigationController.init(rootViewController: self.flutterViewController!)
self.window.rootViewController = nav
self.window.makeKeyAndVisible()
```

あとは、いくつかのメソッドをオーバーライドします。Flutter の標準の実装では rootViewController が `FlutterViewController` である前提となっていますので、オーバーライドしてメソッド呼び出しが Flutter へ伝わるようにします。

```swift
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    super.touchesBegan(touches, with: event)
    
    // rootがFlutterViewControllerの場合はsuper.touchesBeganだけでよいのでreturn
    if let vc = UIApplication.shared.keyWindow?.rootViewController as? FlutterViewController {
        return
    }
    
    // そうでない場合はFlutterViewControllerに対してhandleStatusBarTouchesを呼ぶ
    self.flutterViewController?.handleStatusBarTouches(event)
}

override func registrar(forPlugin: String) -> FlutterPluginRegistrar {
    return (self.flutterViewController?.registrar(forPlugin: forPlugin))!
}

override func hasPlugin(_ pluginKey: String) -> Bool {
    return (self.flutterViewController?.hasPlugin(pluginKey))!
}

override func valuePublished(byPlugin pluginKey: String) -> NSObject {
    return (self.flutterViewController?.valuePublished(byPlugin: pluginKey))!
}
```
今更だけどKubernetes(Minikube)を触ってみた

# 環境

* macOS High Sierra 10.13.6
* Homebrew 1.7.3
* Docker for mac 18.06.1-ce
* HyperKit　v0.20180403-17-g3e954c
* Minikube　v0.28.2
* Kubernetes-cli 1.11.2

**※今回はDocker for mac(Edge)は使用しません**

# 簡単な説明

## Kubernetesとは

>Kubernetes（k8s)は、コンテナ化したアプリケーションのデプロイ、スケーリング、および管理を行うための、オープンソースのコンテナオーケストレーションシステムである
出典：Wikipedia

要はコンテナの管理をしてくれるツール。
複数のコンテナを管理したり、ロードバランシングとかできる。
(曖昧な言葉でごめんなさい。勉強しておきます）


## Minikubeとは

>Minikube is a tool that makes it easy to run Kubernetes locally. 

直訳）
 MinikubeはKubernetesをローカルで簡単に実行できるようにするツール
らしい。
初めてなのでとりあえず簡単そうなこっちから触ってみる。

今回はMinikubeのチュートリアルに沿ってMacで実行するまでを行ってみます。

# インストール ・ 設定

```bash
# Minikubeインストール
$ brew cask install minikube
# 確認
$ minikube version

# Kubernetes CLIインストール
$ brew install kubernetes-cli
# 確認
$ kubectl version

# HyperKitインストール
$ curl -Lo docker-machine-driver-hyperkit https://storage.googleapis.com/minikube/releases/latest/docker-machine-driver-hyperkit \
&& chmod +x docker-machine-driver-hyperkit \
&& sudo cp docker-machine-driver-hyperkit /usr/local/bin/ \
&& rm docker-machine-driver-hyperkit \
&& sudo chown root:wheel /usr/local/bin/docker-machine-driver-hyperkit \
&& sudo chmod u+s /usr/local/bin/docker-machine-driver-hyperkit
# 確認
$ hyperkit -v
```

今回はDockerを使用するので以下でDockerが生きているか確認

```bash
$ docker images
```

Proxy環境の場合、設定が異なるらしいので以下で確認

```bash
# Proxy確認
$ curl --proxy "" https://cloud.google.com/container-registry/
```

繋がった場合はProxy外なので、以下の設定でOK

```bash
$ minikube start --vm-driver=hyperkit
```

ちなみに`--vm-driver=hyperkit`はMinikubeのドライバをDocker for macに指定するものらしい。

では、起動してみます。

```bash
$ kubectl config use-context minikube

# 確認
$ kubectl cluster-info
Kubernetes master is running at https://192.168.64.2:8443
KubeDNS is running at https://192.168.64.2:8443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

# ダッシュボード起動
$ minikube dashboard
```

成功すると以下の画面が表示されます。

![スクリーンショット 2018-09-09 22.55.12.png](https://qiita-image-store.s3.amazonaws.com/0/199056/6d1ff281-c176-c5ee-78c0-19093ad91b31.png)

これで準備が整いました！

チュートリアルではNode.jsを使用して実際にデプロイまで行いますが、今回はここまでとします。
後々Node.js以外のサンプルをこちらの記事に追記する形で記載したいと思います。
(Edgeに乗り換えたらごめんなさい）


# 参考

[Minikubeチュートリアル](https://kubernetes.io/docs/tutorials/hello-minikube/)
Azureの無料アカウントについて

いろいろと変わっていたのでメモ。（2018/9時点）

最初の30日、12ヶ月間無料、ずっと無料、と3種類ある模様。

#最初の30日 
¥22,500 のクレジットが利用可能
#12ヶ月間無料
・750 時間分の Azure B1S 汎用目的 Microsoft Windows Server 用仮想マシン
・750 時間分の Azure B1S 汎用目的 Linux 用仮想マシン
・128 GB の Managed Disks (2 つの 64 GB (P6) SSD ストレージの組み合わせ)、1 GB のスナップショットと 200 万の I/O 操作
・5 GB の LRS-Hot Blob Storage で、200 万の読み込み、200 万の書き込み、200 万の書き込み/リスト操作
・5 GB の LRS File Storage で、200 万の読み込み、200 万のリスト、200 万のその他のファイル操作
・250 GB の SQL Database で、Standard S0 インスタンスと 10 データベース トランザクション ユニット
・Azure Cosmos DB での 5 GB、ユニット単位で 400 が予約済み
・送信データ転送に 15 GB の帯域幅と、無料かつ無制限の受信データ転送
・送信データ転送に 5 GB の帯域幅と、無料かつ無制限の受信データ転送
#ずっと無料
・Azure App Service で、Web、モバイル、または API のアプリ 10 個と 1 GB のストレージ
・Azure Functions での 100 万回の要求と 400,000 GB 秒のリソース使用量
・無料の Azure Container Service での仮想マシンのクラスターの作成
・Azure Active Directory で、格納オブジェクト 50,000 個と、1 ユーザーごとにアプリ 10 個までのシングル サインオン (SSO)
・Azure Active Directory B2C で、50,000 か月あたりの保存ユーザー数と、1 か月ごとの認証回数 50,000 回
・無料の Azure Service Fabric で、マイクロサービス アプリを構築
・Visual Studio Team Services で最初の 5 ユーザーが無料
・Application Insights で、無制限のノード (SaaS または PaaS インスタンス) と 1 か月ごとに 1 GB のテレメトリ データ
・Azure DevTest Labs の使用が無制限
・Machine Learning で、実験ごとに 100 モジュールと 1 時間、10 GB のストレージ
・Azure Security Center で、ポリシー評価と推奨事項が無料
・Azure Advisor での膨大な数の推奨事項とベスト プラクティス
・無料の Azure IoT Hub エディションで、1 日ごとに 8,000 メッセージ、0.5 KB メッセージ サイズ
・Azure Load Balancer で、負荷分散されたパブリック IP が無料
・Azure Data Factory で、低頻度の 5 回のアクティビティが無料
・Azure Search での 10,000 ホステッド ドキュメントに対して 50 MB のストレージと、サービスごとに 3 つのインデックス
・無料の名前空間と Azure Notification Hubs による 100 万のプッシュ通知
・Azure Batch を無制限に使用した、ジョブのスケジュール設定とクラスター管理
・Azure Automation での 500 分の無料ジョブ実行時間
・Azure Data Catalog で、無制限のユーザー数と 5,000 カタログ オブジェクト
・Face API で、1 分ごとに 20 トランザクション、1 か月ごとに 30,000 トランザクションの処理
・Bing Speech API での 5,000 トランザクション/月
・Translator Text API で 200 万文字が無料
・Log Analytics で、毎月 5 GB の分析と 31 日間のデータ保持が無料
・無料の Scheduler で、1 ジョブ コレクション、1 コレクションごとに 5 ジョブ、3,600 ジョブ実行
・Azure Virtual Network で 50 仮想ネットワークが無料
・無制限の VNET 間受信データ転送
#参照元など
https://azure.microsoft.com/ja-jp/free/free-account-faq/?irgwc=1&OCID=AID681541_aff_7593_1243925&tduid=%28ir_3lP2xmwWO0LaTYUQdCX811TZUkgxKCylf3FQVE0%29%287593%29%281243925%29%28TnL5HPStwNw-3RbtO2TnEjGXxavAeMKePw%29%28%29&irclickid=3lP2xmwWO0LaTYUQdCX811TZUkgxKCylf3FQVE0
https://azure.microsoft.com/ja-jp/free/?irgwc=1&OCID=AID681541_aff_7593_1243925&tduid=%28ir_3lP2xmwWO0LaTYUQdCX811TZUkgxKCxJf3FQVE0%29%287593%29%281243925%29%28TnL5HPStwNw-bEF.OtAuTxkiKiWTZm15iw%29%28%29&irclickid=3lP2xmwWO0LaTYUQdCX811TZUkgxKCxJf3FQVE0
よく使うLinuxコマンド集

2回以上自分がよく使うコマンドを随時追加。

```:一般ユーザから他の一般ユーザへ切り替え、切り替え後ユーザーのホームディレクトリに移動する(ハイフン)
sudo su - ユーザー名
```
```:一般ユーザから他の一般ユーザ切り替え、カレントディレクトリにとどまる(ハイフンなし)
sudo su ユーザー名
```
```:ディレクトリを作成しつつ、権限(-m)を設定する
mkdir -m 3桁数字 ディレクトリ名
```
```:ディレクトリがなければ再帰的に作成(-r)する
mkdir -r ディレクトリパス/ディレクトリ名
```
```:カレントディレクトリ配下(.)をファイル名検索
find . -name "ファイル名" -type f
```
```:カレントディレクトリ配下(.)をディレクトリ名検索
find . -name "ディレクトリ名" -type d
```
```:カレントディレクトリ配下(.)を拡張子名検索
find . -name "*.拡張子名"
```
```:bzip2形式で(-j)アーカイブを新規に(-c)対象を指定し(-f)結果を表示(-v)
tar -jcvf アーカイブファイル名.tar.bz2 圧縮対象ディレクトリ名
```
```:bzip2形式で(-j)アーカイブから展開(-x)する対象を指定し(-f)結果を表示(-v)。展開先も指定(-C)
tar -jxvf アーカイブファイル名.tar.bz2 -C 展開先のディレクトリ名
```
```:ファイルに実行権限(+x)を与える
chmod +x ファイル
```
```:対象配下の実行権限を一括で与える
chmod -R 755 ファイルまたはディレクトリ
```
```:ファイル内の末尾を監視しながら(-f)表示する
tail -f ファイル
```
```:ファイルの該当行(+)付近を開く
vim +行数 ファイル名
```
```:秘密鍵から(-f)ファイル名を指定し(-f)、公開鍵を再作成
ssh-keygen -y -f ~/.ssh/id_rsa > id_rsa.pub
```
```:ファイルをクリップボードにコピー
xsel --clipboard --input < ~/.ssh/id_rsa.pub
```
```:コマンド履歴を検索する
history | grep "検索対象文字列"
```
```:ファイルの中身を行番号を出して(-N)表示する
less -N ファイル名
```
```:ファイルの文字コードを自動判別(-g)して表示する
nkf -g ファイル名
```
```ファイルシステムのディスク容量を単位をつけて(-h)表示する.
df -h
```
```:ポート番号を指定し(-i)、使用しているプロセスを表示する
lsof -i:ポート番号
```
```:プロセスを強制終了(9)する
kill -9 使用中のPID
```
```:ディレクトリ(-d)パスに共通して権限(-m)を設定する
install -d -m 数字3桁 ディレクトリパス
```
```:cronのログを確認する
less /var/log/cron
```
```:サーバーに入って抜ける
expect -c '
    spawn ssh サーバー
    expect "#"
    send "exit\n"
'

```
```:ディレクトリの階層構造を対象を除外(-I)して表示する
tree -I '対象外ディレクトリ'
```
プレハブを一括で修正するエディタスクリプト

大量生産されたプレハブを機械的にいじる機会がちょいちょいあるので書いてみた。

```csharp
public class PrefabChanger
{
    public static void ExecuteChange(List<string> targets, System.Action<GameObject> onChange)
    {
        if (onChange == null) return;

        foreach (string path in targets)
        {
            var prefabAsset = AssetDatabase.LoadAssetAtPath(path, typeof(GameObject)) as GameObject;
            if (prefabAsset == null) continue;

            var prefab = PrefabUtility.InstantiatePrefab(prefabAsset) as GameObject;
            if (prefab == null) continue;

            onChange(prefab);
            PrefabUtility.ReplacePrefab(prefab, prefabAsset);    // 反映.

            GameObject.DestroyImmediate(prefab);
        }
    }

    // 子どものGameObjectを走査して処理を適用するためのヘルパ.
    public static void ScanTree(GameObject gameObj, System.Action<GameObject> onExecute)
    {
        if (gameObj == null) return;
        if (onExecute == null) return;

        onExecute(gameObj);

        if (gameObj.transform.childCount > 0)
        {
            for (int i = 0; i < gameObj.transform.childCount; ++i)
            {
                var child = gameObj.transform.GetChild(i);
                ScanTree(child.gameObject, onExecute);
            }
        }
    }
}
```

使い方
----

```csharp
List<string> targets = new List<string>();
// ディレクトリパスを指定.
targets.Add("Assets/Prefabs/PrefabA.prefab");
targets.Add("Assets/Prefabs/PrefabB.prefab");
targets.Add("Assets/Resources/Prefabs/Prefab01.prefab");
targets.Add("Assets/Resources/Prefabs/Prefab02.prefab");

PrefabChanger.ExecuteChange(targets, prefab => {
    // 新しい子ノードを追加してあげたりとか、
    GameObject child = new GameObject();
    child.transform.parent = prefab.transform;
    // 要らなくなったコンポーネントを削除するとか、
    PrefabChanger.ScanTree(prefab, gameObj => {
        GameObject.DestroyImmediate(gameObj.GetComponent<Hoge>());
    });
});
```
EclipseからIntelliJ IDEAに移行する人のためのショートカット比較(Windows)

# EclipseからIntelliJ IDEAに乗り換え中

最近、Eclipseから卒業したくて、IntelliJ IDEAに乗り換えようとしています。

理由は、Eclipseが重い、すぐ壊れる、なんか使いづらいとか色々とあります。
いちいち設定しなくても動作してくれることは気に入っていましたが、昔に比べるとEclipseを使うメリットをあまり感じなくなりました。
VSCodeで頑張っていた頃もあったのですが、補完機能が弱くて断念。

IntelliJ IDEAは、Jetbrains製にも関わらず、Communityだと無料で使用することができます。
評判に良いので、せっかくなので使ってみようと思いました。

そこで、Eclipseのショートカットでいうあれは、IntelliJ IDEAだとどうやるのか？をまとめました。
自分が知っている、よく使うショートカットしか書いていません。
新しいショートカットが分かったら、随時追記していこうと思います。

# 動作環境
Windows 10

# 入力補完機能(sysout, main)

| 機能 | Eclipse | IntelliJ IDEA |
| :-- | :------ | :------------ |
| System.out.prinln | sysout | sout |
| public static void main | main | psvm |

# 編集機能

| 機能 | Eclipse | IntelliJ IDEA |
| :-- | :------ | :------------ |
| 行の削除 | Ctrl + D | Ctrl + L |
| 行の入れ替え | [Alt] + ↑ or ↓ | [Alt] + [Shift] + ↑ or ↓ |
| カーソルがある行を削除 | [Ctrl] + d | [Ctrl] + y |
| カーソルがある行を複製 | [Ctrl] + [Alt] + ↑ or ↓ | [Ctrl] + d |
| コメント化 |  [Ctrl] + / |  [Ctrl] + / |
| 検索 |  [Ctrl] + f |  [Ctrl] + f |
| 置換 |  [Ctrl] + f |  [Ctrl] + r |
| コードフォーマット | [Ctrl] + [Shift] + f | [Ctrl] + [Shift] + l |
| 自動補完 | [Ctrl] + [Space] | [Ctrl] + j |
| ファイル検索 | [Ctrl] + h | [Ctrl] + [Shift] + f |
| ファイル名検索 | [Ctrl] + [Shift] + r | [Ctrl] + [Shift] + n |
| 呼び出し階層 | [Ctrl] + [Alt] + h | [Ctrl] + [Alt] + h |
| 定義部分に移動 | F3 | [Ctrl] + b |
| 移動前の箇所に戻る | [Alt] + ← or → | [Ctrl] + [Alt] + ← or → |
| エディタのタブを閉じる | [Ctrl] + w | [Ctrl] + F4 |
| インポート編成 | [Ctrl] + [Shift] + o | [Ctrl] + [Alt] + o |

# デバッグ
| 機能 | Eclipse | IntelliJ IDEA |
| :-- | :------ | :------------ |
| ステップイン | F5 | F7 |
| ステップオーバー | F6 | F8 |
| プログラム再開 | F8 | F9 |
| 関数の呼び出し結果を見る | [Ctrl] + [Shift] + i | [Ctrl] + [Alt] + F8 |