OmniAICreator/Qiita-1.07M huggingface dataset:
v8nを使ってVue.jsでバリデーションをかけてみた

はじめまして、普段はproduct managerをやっているtatsukenと申します。
研修の一環でvue.js、expressを書くことがあったので、そのことを中心にまとめていきたいと思います
## 何をするのか
[v8n](https://www.npmjs.com/package/v8n)というnode moduleを使用してvue.jsの入力フォームにバリデーションをかけていきたいと思います。
vue.jsの一般的なバリデーションライブラリとしては[vee-validate](https://baianat.github.io/vee-validate/)などがありますが、
[v8n](https://www.npmjs.com/package/v8n)は簡単にバリデーションをかけたいときやバリデーションのカスタマイズを行いたいときに便利です。
## 使い方
### install(vue project)
`npm install v8n -s`　
### Sample code
```sample.vue
<template>
  <form action>
    <input type="text" v-model="email">
    <input type="password" v-model="password">
    <input type="text" v-model="email">
    <input type="submit" value="decide" @click="onClickSubmitButton">
  </form>
</template>

<script>
import v8n from "v8n";
export default {
  data() {
    return {
      email: null,
      password: null
    };
  },
  methods: {
    onClickSubmitButton() {
      const message = {
        null: "中身が空です",
        minLength: "文字数は4文字以上です",
        pattern: "emailを入力してください",
        maxLength: "文字数が多すぎます"
      };
      try {
        v8n()
          .not.null() // 値がnullじゃないか
          .string() // 文字列
          .minLength(4) // a@b.c を想定して最低5文字
          .pattern(/[^\s@]+@[^\s@]+\.[^\s@]+/)
          .check(this.email);
      } catch (ex) {
        let rule = ex.rule.name;
        alert(`Emailに関して${message[rule]}`);
        return;
      }
      try {
        v8n()
          .not.null()
          .string()
          .minLength(4)
          .check(this.password);
      } catch (error) {
        let rule = error.rule.name;
        alert(`passwordに関して${message[rule]}`);
        return;
      }
    }
  }
};
</script>
```
### 説明
* まずv8nをimport`import v8n from "v8n";`
* `v8n()`に様々な設定を加えていくことで様々なバリデーションを作ることが出来ます。

| code | rule | 
|-----------|------------|
| null() | nullかどうかを判定する | 
| not.null() | null出ないかどうかを判定する | 
| string() |  stringかどうかを判定する| 
| minLength(4) | 4文字以上かどうかを判定する | 
| pattern(/[^\s@]+@[^\s@]+\.[^\s@]+/) | patternに一致しているかどうかを判定する(今回はemailのpattern maching) | 
* 他にも様々なruleをつけることが出来ます([詳しくはこちらにまとまっていました](https://co.bsnws.net/article/182))
* 加えた条件に対して`.check(変数名)`を行うことで任意の変数が自分の設定したruleに一致しているか判定することができます
* あとはpromiseなりtry catchなりでerrorを受け取り、エラーハンドリングを行ってください
* errorの場合どのruleによってerrorになったかは`error.rule.name;`などで受け取ることが出来ます。

## 参考にしたもの
* https://co.bsnws.net/article/182

##　最後に
ざっくりとv8nの使い方について説明しました。
初めての投稿なので間違いなどあれば指摘していただけると幸いです。
iOS12 以下をサポートするプロダクトで SwiftUI の恩恵を得る方法

# はじめに
SwiftUI に注目が集まる一方、iOS13 未満をサポートバージョンから切り捨てるまで導入が困難なのも事実です。今回はこの問題点に着目し、 iOS12 以下も今までどおりサポートしつつ SwiftUI と Xcode11 を利用したプレビュー機能を実装する方法をご紹介します。

# 参考に
[AkkeyLab/StoryboardPreviewsBySwiftUI](https://github.com/AkkeyLab/StoryboardPreviewsBySwiftUI)
この記事は、サンプルからの抜粋となります。詳細はこちらをご覧ください。

[Storyboard Preview by SwiftUI](https://speakerdeck.com/akkeylab/storyboard-preview-by-swiftui)
WWDC 報告会にて同様の内容で発表も行っております。ぜひご覧ください。

# 環境
Xcode 11 β
macOS Catalina β

# 実現すること
- iOS12 以下をサポートしつつ Xcode Previews を利用する
- 既存の Storybord や xib ファイルをプレビューさせる

# 実現方法
- Xcode Previews 専用のターゲットを作る
    - プレビューさせる画面に関連するソースコードとプレビュー用の swift ファイルが含まれており、 iOS13 以降をターゲットバージョンとする
- 対象のクラスを `UIViewRepresentable` に準拠させる
    - `updateUIView` メソッド内で施した変更がプレビューに即時反映される
- `PreviewProvider` に準拠させた struct を定義
    - `static var previews: some View` でプレビューに必要な処理を施す

※ UIViewController をプレビューさせる場合はそれぞれ `UIViewControllerRepresentable`, `updateUIViewController` となります。

```swift
import SwiftUI
import UIKit

#if DEBUG
// Create new for preview
struct UserDetailBasicInfoCellPreviews: PreviewProvider {
    static var previews: some View {
        Group {
            // Sets the format of the preview
            UserDetailBasicInfoCell()
                .previewLayout(.fixed(width: 320, height: 100))
                .previewDevice(PreviewDevice(rawValue: "iPhone SE"))
            UserDetailBasicInfoCell()
                .previewLayout(.fixed(width: 414, height: 100))
                .previewDevice(PreviewDevice(rawValue: "iPhone XS Max"))
        }
    }

    static var platform: PreviewPlatform? = .iOS
}

// UserDetailBasicInfoCell.swift
// UserDetailBasicInfoCell.xib
extension UserDetailBasicInfoCell: UIViewRepresentable {
    typealias UIViewType = UserDetailBasicInfoCell

    func makeUIView(context: Context) -> UserDetailBasicInfoCell {
        return Self.instantiate()
    }

    func updateUIView(_ uiView: UserDetailBasicInfoCell, context: Context) {
        // Make parameter change for preview
    }
}
#endif
```

# 利点
- 表示・非表示が切り替わるパーツが多い場合のデバッグ強化
- 複数端末（画面サイズ）でのレイアウト確認が一度に行える

※[サンプルの README ](https://github.com/AkkeyLab/StoryboardPreviewsBySwiftUI)を見ればもっとイメージしやすいかもしれません。

# 欠点
- 前準備がある程度必要になる

# 最後に
今年の秋が楽しみですね！
Xcode10.1 + Unity2018.3.13f1 + GoogleMobileAds3.17.0 + GoogleMobileAdsUnityAdsMediation2.1.0 でclang:-1: linker command failed with exit code 1 (use -v to see invocation)

Build Settings => Build Options => Enable BitcodeをNoにして、Bitcodeを無効にすることで一旦解消することはできた。最新のXcodeであれば出ないのかも(新しいMacBook Pro買いたい・・・)

参考
https://akataworks.hatenadiary.jp/entry/2017/08/22/125403
sequelizeでモデルからENUMの値を取得する方法 [Node.js + Express]

## はじめに

Node.js + Expressを使って開発を行った際に、sequelizeを使ってモデル内のカラムからENUMの値を取得した時のやり方をメモしておきます。


## モデルの定義確認

以下のように簡易モデルを定義したとします。

```sql

sequelize.define('model', {
  animals: {
    type:   Sequelize.ENUM,
    values: ['dog', 'cat', 'bird']
  }
})
```

## 取得方法

`Model.rawAttributes.states.values`でENUMの値を取得できます。

```sql
var Model = sequelize.define('model', {
  states: {
    type:   Sequelize.ENUM,
    values: ['dog', 'cat', 'bird']
  }
});

console.log(Model.rawAttributes.states.values);
// logs ['dog', 'cat', 'bird'] in console
```

カラムからENUMの値を取得する場合は、`model.column.rawAttributes.states.values`などのようにすると同様に取得可能です。
ダークモード適用を回避する方法

## はじめに
iOS13から遂にダークモードが導入されました。
[iOS13 プレビュー記事](https://www.apple.com/jp/newsroom/2019/06/apple-previews-ios-13/)

今後のiOSアプリ作成にはダークモードを適用が前提となっています。
しかし、アプリ独自のレイアウトを設定しているために、
すぐにはダークモードを適用できない場合があると思います。

そこで今回は、ダークモードを回避する方法を共有します。

## UIViewControllerごとに設定

UIViewControllerに追加された`overrideUserInterfaceStyle`の値を指定します。
デフォルトは`unspecified`（指定なし）です。ユーザーの設定によって変化します。

|値|説明|
|---|---|
| unspecified | 指定なし（デフォルト） |
|light |ライトモード（明るい外観） |
|dark|ダークモード（暗い外観）|

[UIUserInterfaceStyle - UIKit | Apple Developer Documentation](https://developer.apple.com/documentation/uikit/uiuserinterfacestyle)

### サンプルコード

``` swift
import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // 常にライトモード（明るい外観）を指定することでダークモード適用を回避
        self.overrideUserInterfaceStyle = .light
    }

}
```

## アプリ全体に適用する

アプリ全体に適用するには`Info.plist`の`UIUserInterfaceStyle`パラメータを`Light`にします。
これで常にライトモードになります。
なお`Automatic`（自動）`Dark`（ダークモード）を指定することもできます。
なお設定しない場合や不正な値が入力された場合は常に`Light`が採用されます。


## まとめ

これらの方法でダークモードの適用を回避することができました。
しかし、Appleはダークモードの適用を推奨しているので、
いずれかのタイミングでアプリにダークモードを適用させる対策が必要です。

この対応はあくまで一時的な対応か外観を変化させたくない特段の事情がある場合に止めるべきでしょう。


## 参照
[Choosing a Specific Interface Style for Your iOS App | Apple Developer Documentation](https://developer.apple.com/documentation/appkit/supporting_dark_mode_in_your_interface/choosing_a_specific_interface_style_for_your_ios_app)
外観モードの変更方法について

[Implementing Dark Mode on iOS - WWDC 2019 - Videos - Apple Developer](https://developer.apple.com/videos/play/wwdc2019/214)
WWDC2019のダークモードに関するセッション。動画やサンプルコードがあります。
Vue.jsでinput type="number"としてもvalueは常に文字列を返すので注意！number装飾子を追加しよう

## はじめに
Vue.jsで投稿機能を実装していたときにハマってしまったことをメモしておきます。


## ハマってしまったこと

価格入力をするために`input type="number"`として、情報を送信したのですが、うまくデータベースに保存できませんでした。

```vue
<div class="form-group">
  <label>価格</label>
  <input type="number" v-model="price" name="price">
</div>
```


```js:model
price: DataTypes.INTEGER
```

priceはinteger型なので、`input type="number"`でいけるかなと思ったのですが、そうではなかったようです。

## 原因

type=number と書いたときでさえ、 HTMLのinput要素のvalue は常に文字列を返すようです。
なのでvue上で文字列を数値に変換します。


## 解決策

v-modelに管理された入力にnumber修飾子を追加するだけです。
これで数値として値を保存することができました！！

```vue
<div class="form-group">
  <label>価格</label>
  <input type="number" v-model.number="price" name="price">
</div>
```
docker-lambdaで関数連続実行をワンコンテナで

#ワンコンテナでlambada関数を連続実行したい
[lambci/docker-lambda](https://github.com/lambci/docker-lambda)でローカルテストする際に、下記のように普通に関数を連続実行すると...

```
docker run --rm -v "$PWD":/var/task lambci/lambda:python3.6 sample_function.lambda_handler '{"Hello":"World"}'
docker run --rm -v "$PWD":/var/task lambci/lambda:python3.6 sample_function.lambda_handler '{"Hello":"World"}'
```
下記のようにコンテナが別々に生成される。（※docker container statsの結果を表示↓↓）
![コメント 2019-06-25 001242.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294566/113e3d68-82f4-1d19-4067-93c479b65f48.png)

これをワンコンテナでやりたい場合は、下記のようにentrypointを上書きしてやれば可能。

```
docker run --rm -v "$PWD":/var/task --entrypoint "" lambci/lambda:python3.6 bash -c " \
   python3.6 /var/runtime/awslambda/bootstrap.py sample_function.lambda_handler '{\"Hello\":\"World\"}' & \
   python3.6 /var/runtime/awslambda/bootstrap.py sample_function.lambda_handler '{\"Hello\":\"World\"}' \
"
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294566/51f16239-4bf5-a54a-f254-074904e8009a.png)
MacへのISIS3導入方法

# ISIS（Integrated Software for Imagers and Spectrometers）とは？

ISISはUSGC(米国地質調査部)の出している画像処理のためのソフトウェアです。久しぶりに見たら、condaで環境構築できるようになっていたので、インストールしてみました。
詳細なインストール解説は公式にもあります。

# インストール手順
まず、初めにhomebrew上のanacondaでやろうとしたのですが、エラーが多発したため、一度断念。一からanacondaの最新版を入れました。ちなみに、anacondaのバージョンが低いといちいちコマンドが解説と変わってくるので注意が必要です。

ちなみに、公式の出している詳細な解説はこちらにあります。
https://github.com/USGS-Astrogeology/ISIS3

## 前提条件
- Mac OS X 10.13.6 High Sierra
- Anaconda 5.3 インストール済み

## condaで環境構築

``` shell-session
conda create -n isis3 python=3.6
conda activate isis3
conda config --env --add channels conda-forge
conda config --env --add channels usgs-astrogeology
conda config --show channels
```

チャンネル一覧が表示される。このとき、conda-forgeがusgs-astrogeologyより上に来ている場合は以下のコマンドを追加実行する。

``` shell-session
conda config --env --add channels usgs-astrogeology
```

ISIS3本体のインストール

``` shell-session
conda install -c usgs-astrogeology isis3
```


インストールできたので、次は環境変数の設定をします。

``` shell-session
python $CONDA_PREFIX/scripts/isis3VarInit.py --data-dir=[path to data directory]  --test-dir=[path to test data directory]
```
データ格納フォルダとテストデータ格納フォルダを好きなパスに設定できます。
conda環境だとdefaultだとデータフォルダがかなり深い階層になっているので、
好きな場所に設定することをお勧めします。
設定し終わったら、もう一度conda activateして設定を反映しましょう。

``` shell-session
conda activate isis3
```
ここまでがソフトのインストールで、ここからはプロジェクトごとのデータをダウンロードしていきます。全てのミッションデータをダウンロードすると500GB超になりますので、必要なミッションのみインストールしていきます。

今回は、Mars Reconnaissance Orbiter (MRO)のデータをダウンロードすることにします。
まずはどのミッションにも共通で必要な部分のダウンロードをします。

``` shell-session
cd $ISIS3DATA
rsync -azv --delete --partial isisdist.astrogeology.usgs.gov::isis3data/data/base .
```
次に、MROのデータをダウンロードします。

``` shell-session
cd $ISIS3DATA
rsync -azv --exclude='kernels' --delete --partial isisdist.astrogeology.usgs.gov::isis3data/data/mro .
```
--exclude='kernels'をつけると、ダウンロード容量を節約できます。（代わりにオンライン処理を活用）

共通部は約8GB、MROミッション部は約0.5GBでした。

インストールはここまで。次回はMROデータでチュートリアルをやっていきます。
Wordpressで自動投稿システムを作ってみる


# はじめに

「投稿した記事を自動的に複製するシステムがほちい」という要望があった。
内容的にはjsで見た目を切り替えるだけのページで偽造してもよかったんだけれど、それだとなんか物足りない。
ので、functions.phpから投稿を管理するシステムを作ってみました。



# 要件定義

・カスタム投稿タイプtypehogeの記事を新規作成、内容(カスタムフィールド含む)を入力して投稿ボタンを押すと、その記事と同じタイトル、およびカスタムフィールド値（３種）を持つ複製記事が、別のカスタム投稿タイプtypehoge2の記事として投稿される





# 実際のコード

```php:functions.php
// 投稿の自動複製システム
function function_copying_posts(){

	// 現在動作中の投稿の情報(新規作成した記事……つまりコピー元の内容)を取得します。
	global $post;

	if($post->post_type == 'typehoge'){
		$current_postID = $post->ID;

		// ACFフィールドに入力された値を取得します。
		// この関数が実行されるタイミングは投稿がデータベースに登録される前なので、
		// $_POSTを用いています。
		$hoge_name = $_POST['acf']["field_5d106111f2430"];
		$hoge_price =  $_POST['acf']["field_5d1060e886e4d"];
		$hoge_comment = $_POST['acf']["field_5d8561357b6fa"];

		// 自動投稿するときのステータスをここで指定します。
	    $draft_my_options = array(
	        'post_title'    => get_the_title($current_postID),
	        'post_content'  => '',
	        'post_status'   => 'publish',
	        'post_type'      => 'typehoge2'
	    );
	    // 新しい記事を投稿しつつ、その記事のidを取得します。
	    // この行が実行されるタイミングで投稿そのものは完了していることに注意してください。
	    $newpost_id = wp_insert_post($draft_my_options);

	    if($newpost_id){
	    	// カスタムフィールドに値を挿入しています。
	    	update_post_meta($newpost_id, 'hoge_name2', $hoge_name);
	    	update_post_meta($newpost_id, 'hoge_price2', $hoge_price);
	    	update_post_meta($newpost_id, 'hoge_comment2', $hoge_comment);
	    }
	}

}
add_action( 'publish_typehoge', 'function_copying_posts', 9);
```

### 解説

コピー元投稿のデータ取得→コピー先投稿を公開→コピー先のカスタムフィールドを上書き……の順番で行っている。

苦労したのはカスタムフィールドに入力した内容を取得する部分。

これはACFの話だが、どうも記事が投稿されるタイミング（つまり、関数function_copying_postsが動き出すタイミング）よりACFデータがデータベースに記録されるタイミングの方が遅いらしいので、**get_field()やget_post_meta()だとカスタムフィールドに入力した値を取得できない**。
なので俺の場合は、データベースに登録される前に入力欄のinput要素から直接入力内容を取り出す方式にした。


```php:functions.php
$_POST['acf']["field_5d106111f2430"];
```

こんな感じ。
なお、このinputから取り出すコマンド、「field_5d106111f2430」部分を取得したい入力欄にあるフィールドキーに書き換えれば問題なく使える。そのへんの話は[このサイト](https://www.advancedcustomfields.com/resources/acf-save_post/)に載っていたので、参考にしてほしい。


# 余談

functions.phpを改修する上で以下のコードはすげー役に立ったので書いとく。

```php:functions.php

var_dump( $hoge );
exit;

```

PHP使いならご存じ`var_dump()`。
普段のWordpress改修では欠かせない存在だけれども、functions.phpのような、表示に使われないphpファイルでは実質使えないのが難点だった。
が、直後に`exit;`と打っておくと式が`var_dump()`を実行した段階で強制終了するので、変数の中身とかを確認できる。
広まれ。

あと、自動投稿を行う部分だけを抜き出すと以下の通りになるらしい。

```php:functions.php
$post_value = array(

　　'post_author' => 1,// 投稿者のID。
　　'post_title' => 'テストタイトル',// 投稿のタイトル。
　　'post_content' => 'テスト本文', // 投稿の本文。
　　'post_category' => array(1,5), // カテゴリーID(配列)。
　　'tags_input' => array('タグ1′,'タグ2′), // タグの名前(配列)。
　　'post_status' => 'publish' // 公開ステータス。
);
wp_insert_post($post_value);
```

`wp_insert_term()`など、自動で管理画面を制御してくれるコードはほかにもいくつかあるみたい。


# 参考資料

http://blog.ale-cole.com/php/wordpress/69/
https://www.advancedcustomfields.com/resources/acf-save_post/
https://teratail.com/questions/107958
https://torounit.com/blog/2013/05/22/1544/
CodeBuildをローカル環境で実行する(2019年6月版)

現在作成中のAlexaスキルではAWSのCodeBuildを利用しています。ただ、ビルドを試すのに毎回GitHubのリポジトリにPushしないといけないため、ローカルで試すことができなかと思い、調べた結果を共有します。

##実行環境

OS : macOS Mojave (v10.14.5)
Docker : Engine: 18.09.2

##ビルド用の Docker イメージ作成
GitHubで公開されているDockerfileを取得し、そこからイメージを作成

```
$ git clone https://github.com/aws/aws-codebuild-docker-images.git
$ cd aws-codebuild-docker-images
$ cd ubuntu/standard/2.0
$ docker build -t aws/codebuild/standard:2.0 .
```

##ビルド実行用のイメージのダウンロード
ビルド実行用のエージェントイメージをDockerHubから取得

```
$ docker pull amazon/aws-codebuild-local:latest --disable-content-trust=false
```

##ビルド用のヘルパースクリプト取得
[aws-codebuild-docker-images](https://github.com/aws/aws-codebuild-docker-images)のGitHubリポジトリにビルド用のヘルプスクリプトが用意されているためそこから取得

```
$ //GitHubからcloneした続きから
$ cd aws-codebuild-docker-images
$ cd local_builds
$ cp codebuild_build.sh [対象のプロジェクトフォルダ]
```

##buildspec.ymlの修正
以下のランタイムの記載を追記する（下記はPythonの場合）

```
phases:
  install:
    runtime-versions:
        python: 3.7
```

##ビルド実行
ヘルパースクリプトでビルドを実行

```
$ ./codebuild_build.sh -i aws/codebuild/standard:2.0 -a artifact
```

##CodeBuildの設定変更
AWS管理コンソールからCodeBuildの環境を変更する。
CodeBuild -> ビルドプロジェクト -> [プロジェクト名] -> 環境 を編集する

以下のように、オペレーティングシステム、ランタイム、イメージを設定する
<img width="803" alt="スクリーンショット 2019-06-24 23.58.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406177/b9fd34b8-106d-57c5-36e2-cacd6019eb60.png">

また、「AWS CodeBuild にこのサービスロールの編集を許可し、このビルドプロジェクトでの使用を可能にする」　のチェックを外すこと

##参考

- [aws-codebuild-docker-images](https://github.com/aws/aws-codebuild-docker-images)
- [CodeBuild Local で CodeBuild の処理をローカル実行](CodeBuild Local で CodeBuild の処理をローカル実行)
- [CodeBuild をローカル環境で実行（テスト、デバッグ）できるようになりました](https://dev.classmethod.jp/cloud/aws/codebuild-exec-on-local/)
- [CodeBuildのUbuntu 14.04 EOL対応](https://inamuu.com/codebuild%E3%81%AEubuntu-14-04-eol%E5%AF%BE%E5%BF%9C/)
React Material-UIのアイコン一覧を作ったらJSXとちょっと仲良くなれた

# 概要
[Material-UI](https://material-ui.com/)のビルトインのアイコンを使おうと思った時に、

- 一覧がない(私が見つけられなかっただけかも知れない)
- Outlinedとか違いがわかりにくい

というつらさを感じていた中、ある日朝目覚めた時に「今日はアイコンの一覧を作る日だ」となぜか強く感じたので実際に作ってみました。作る過程でJSXについて新しく学ぶことがあったのでそれをまとめます。
[できた一覧はこちらです。](https://material-ui-build-in-icons.netlify.com/)

# ちなみに
私とReactのこれまでは、有志のReactのプロジェクトに参加するぞ！となってざっと入門を読んでいきなり書き始めたようなもの(=時間をかけて体系的に学んだわけではない)なので、もしかしたらすごい今更なことを書いているかも知れません。

# importしてるアイコンの中身とは
いつもアイコンを使うときに`@material-ui/icons/XXX`からimportしているので、`@material-ui/icons`に行ったら全部取得できるのでは？？と思い`import * as icons from '@material-ui/icons'`としてみました。すると、オブジェクト形式でアイコンの全量が取得できました。
このアイコンの中身が何を持っているかconsole.logでのぞいてみると

```
{
    $$typeof: Symbol(react.memo)
    compare: null
    displayName: "WhereToVoteIcon"
    muiName: "SvgIcon"
    type:
        $$typeof: Symbol(react.forward_ref)
        render: ƒ (props, ref)
}
```
こんなものを持っていました。それぞれのプロパティがどんな役割を果たすのか全くわかりませんでしたが、`render`っていうのを持っているのをみて、これ使えばなんとか描画できる何かなんだな〜と言うことがわかりました。(importしたモジュールなので当然なのですが)

# JSXの正体とは
ということで、とりあえず特徴的な`$$typeof`を調べてみると、[「なぜReactのコンポーネントは$$typeofプロパティを持っているのか」](https://overreacted.io/why-do-react-elements-have-typeof-property/)という記事にぶつかりました。
ここの冒頭で一気にアイコンの描画に近づくわけなのですが、そのまま例を借りると、つまり

```html
<marquee bgcolor="#ffa7c4">hi</marquee>
```
こういうJSXを書いている時、実際に行われているのは

```js
React.createElement(
  /* type */ 'marquee',
  /* props */ { bgcolor: '#ffa7c4' },
  /* children */ 'hi'
)
```
だと言うのです。
ここで、 **普段Material UIのアイコンを使う時に書くのはタグ名だけなので、つまりこのimportしたものをcreateElementにぶち込めばいいと言うことだな！** と思ったので先ほど`console.log()`でのぞいた中身を渡したところ、無事描画ができました！

## $$typeofとは
ここでもう目的は達成したわけですが、せっかくなので`$$typeof`について知るべくもう少し読み進めてみましょう。以下要約なので詳しく知りたい方は元記事を参照してください。

- 攻撃を防ぐため、Reactはテキストをデフォルトでstringにしてescapeしている
- それだけで必ずしもインジェクション攻撃に勝てるかと言うとそうではない
- ところで、ReactのElementはデザインとしてはプレーンなオブジェクトである
- (とはいえ自分で`React.createComponent()`するとき必ずそうしろと言うことではない
- object形式であることにはコンパイラの最適化などいくつかの利点がある
- だけども、もし`string`が想定されているところに、もし万が一恣意的なJSONを渡せる欠陥があったとすると、これはXSS攻撃に対する脆弱性となる
- ここで`$$typeof: Symbol.for('react.element'),`が生きてくる
- 万が一そう言う欠陥があったとしても、JSONに`Symbol`を入れることは不可能だからである
- それを利用して、Reactは`$$typeof`がなかったり不正だったりすると解釈をやめるようになっている

以上、そうだったのか！と言うことでJSXとちょっと仲良くなれた気がしました:sunny:
最後まで目を通して頂きありがとうございました:dog2:
Google Vision APIを使って、投稿画像が他サイトで流用されていないかチェックする

# 概要
`Google Vision API`の力を借りて、サイト内で投稿された画像が他サイトでも使われていないかチェックする処理を実装してみます。

# Google Vision API

類似画像を探す、画像内のテキストを抽出する、顔を検出する等、画像に関する様々な処理を行えるAPI。
[Google Vision API](https://cloud.google.com/vision/?hl=ja) を参照。
一月あたり`1,001`回以上のAPI利用は有料となるため注意。

# PHPでの実装

```php
$url = チェックしたい画像のURL;
$key = APIキー;

// APIにアクセス
$ch = curl_init("https://vision.googleapis.com/v1/images:annotate?key=$key");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT,          10);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode([
	'requests' => [
		'image'      => [
			'source' => [
				'imageUri'   => $url
			]
		],
		'features'   => [
			[
				'type'       => 'WEB_DETECTION',
				'maxResults' => 20
			]
		]
	]
]));
$response = curl_exec($ch);
// 結果が取れなかった場合
if ($results === null || !isset($results['responses'][0]['webDetection']['pagesWithMatchingImages'][0])) {
	echo "一致無し\n";
	exit;
}

$items = [];
// 複数のサイトがヒットするのでループ
foreach ($results['responses'][0]['webDetection']['pagesWithMatchingImages'] as $matching_image) {
	$column = isset($matching_image['fullMatchingImages']) ? 'fullMatchingImages' : 'partialMatchingImages';
	$items[] = [
		'website' => $matching_image['pageTitle'] ?? '[サイト名無し]',
		'url'     => $matching_image['url'],
		'image'   => $matching_image[$column][0]['url'] ?? '[画像URL無し]'
	];
}

print_r($items);
```

# 結果
実際にチェックしてみた実例を貼りたいところですが、ここでは控えます。
感触としては、サイズは異なるものの内容自体は**完全一致するような画像が多数ヒット**します。
また、**部分的に一致するもの**や、**被さっている文字が異なるもの**も探してくれます。

しかし、**1～2割程度、大外し**するようです。
色味が似てるだけで全然違う**サッカーのユニフォーム**と**普通のTシャツ**など。
【Java】過去週の月曜日と日曜日の日付を順番に取得する

#やりたいこと
取得対象が過去3ヶ月の場合
今週：現在日が含まれる週の月曜日、日曜日の日付を取得
過去の週：各週の月曜日、日曜日の日付を取得
最終週：3ヶ月前の日付が含まれる週の月曜日、日曜日の日付を取得


#ソース
swordone様から指摘をいただき、ロジックを修正しました(6/25)。 ※コメント参照

```Java
public static void main(String[] args) {

        // 現在日付を取得
        LocalDate now = LocalDate.now();

        // 3ヶ月前（この日付は適宜変える。この例では3ヶ月としている）の日付を取得
        LocalDate targetDate = now.minusMonths(3);

        // 現在日の週の月曜日を取得
        LocalDate monday = now.with(DayOfWeek.MONDAY);

        // 現在日の週の日曜日を取得
        LocalDate sunday = now.with(DayOfWeek.SUNDAY);

        int i = 0;
        while (!sunday.isBefore(targetDate)) {
            System.out.println(monday + " ～ " + sunday + " : " + (i == 0 ? "今週" : i + "週前"));
            monday = monday.minusDays(7);
            sunday = sunday.minusDays(7);
            i++;
        }
    }
```
#実行結果
現在日は6/25です。取得対象は3ヶ月前までとしています。
過去数週間分で期間指定したい場合等に使えると思います。
取得対象の日付を適宜変更して使います。
※Java8のjava.time APIを使用しているので、Java7以前のバージョンでは使用不可です。

```
2019-06-24 ～ 2019-06-30 : 今週
2019-06-17 ～ 2019-06-23 : 1週前
2019-06-10 ～ 2019-06-16 : 2週前
2019-06-03 ～ 2019-06-09 : 3週前
2019-05-27 ～ 2019-06-02 : 4週前
2019-05-20 ～ 2019-05-26 : 5週前
2019-05-13 ～ 2019-05-19 : 6週前
2019-05-06 ～ 2019-05-12 : 7週前
2019-04-29 ～ 2019-05-05 : 8週前
2019-04-22 ～ 2019-04-28 : 9週前
2019-04-15 ～ 2019-04-21 : 10週前
2019-04-08 ～ 2019-04-14 : 11週前
2019-04-01 ～ 2019-04-07 : 12週前
2019-03-25 ～ 2019-03-31 : 13週前
```
git×Unity　禁断の技！（使用危険注意）

これからgitでunity管理する手法を紹介します。

##まずは.gitnoreファイルの配置
gitnoreがあれば、gitに管理してほしくないファイルを教えられます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403926/f5cdc196-75bb-aeda-b965-fbb07035d273.png)
GitHubでレポジトリを作る場合、これを選択すればほぼ大丈夫です。
↓今私使ってるgitnore　20190614
私がvscodeを使ってるので、```.vscode/```ディレクトリを入れました。

```.gitnore
[Ll]ibrary/
[Tt]emp/
[Oo]bj/
[Bb]uild/
[Bb]uilds/
Assets/AssetStoreTools*

# Visual Studio cache directory
.vs/
.vscode/

# Autogenerated VS/MD/Consulo solution and project files
ExportedObj/
.consulo/
*.csproj
*.unityproj
*.sln
*.suo
*.tmp
*.user
*.userprefs
*.pidb
*.booproj
*.svd
*.pdb
*.opendb

# Unity3D generated meta files
*.pidb.meta
*.pdb.meta

# Unity3D Generated File On Crash Reports
sysinfo.txt

# Builds
*.apk
*.unitypackage

```
↓gitnoreについて詳しく解説
https://qiita.com/anqooqie/items/110957797b3d5280c44f

##git×Unityの原則

　1.作業する前にpullする。
　2.チームメンバー同時に一つのシーンを弄らない。（コンフリクトが発生しやすい）
　3.100MB以上のファイルをgitで管理しない（GitHubの制限）
　4.scriptsを編集したあと、```git add fileName```で編集したスクリプトだけpushする。デザイナーさんがシーンとかprefabを変更したあと、、多分すべてのファイルをアプロードしかできない...
だから万が一（実はよくあること）コンフリクトが場合どうしましょうか。

##禁断の技（使用危険）
####特定のファイルをあるブランチにアプロードしたい場合

```
$ git merge --abort 
// conflict処理を中止

$ git checkout -b <newBranch> <origin/remoteBranch>
//newBranchを作って、それからリモートのremoteBranchと同期する、そして自動にnewBranchに切り替え

$　git checkout <branchName> <fileName>　
//branchNameから強制的にfilenameを合併する。もし同じ名前のファイルがあれば、上書きされるので、大変危険なので、必ず新しいブランチを作って操作してください。

$　git push origin <name>：<remote name> -f 
//強制的に<name>ブランチを<remote name>に上書きする。多変危険なので、新しいブランチで操作してください

$git branch -D <branchyName>
//強制的にブランチを削除する。多変危険なので、実行する前にチェックしてください。

```
↑使用する状況：プログラマーさんはテストするためにローカルでprefabをいじっているうち、デザイナーさんがprefabとシーンをリモートで更新した。こういう時、プログラマーがpullしたら、コンフリクトが発生します。この場合、さっきのようにデザイナーさんが更新したブランチをダウンロードして、それから```git checkout <branchName> <fileName>```で必要なファイルをローカルのブランチに上書きする。

####強制的にリモートブランチをローカルブランチに上書きしたい場合（危険なので、masterブランチでやらないほうがいい）
```
$　git fetch -all
//すべてのリモートブランチをローカルにダウンロードするが、mergeしない（pull=fetch+merge）

$　git reset --hard origin/branchName
//強制的に現在のブランチをorigin/branchName の状態にする、ログも残されない。大変危険なので、マスターブランチでやらない方がいい。やる前は必ずチェックしてください。

```
【Ruby】繰り返し処理にインデックスをつける(each_with_index, with_index)

#1.今回のテーマ

Rubyの繰り返し処理(eachやmapメソッド等)を使う際、第二引数を指定することで、インデックスを振ることが出来て便利！というお話です。
インデックスとは、１.2.3.4…という番号のこと。
使用用途はたくさんありますが、例えばランキング一覧作成(１位●●２位▲▲３位■■…等の順位の割り振り)等に便利です。

#2.インデックスを降らない場合(通常の繰り返し処理)
本題に入る前に、インデックスを付けない場合の繰り返し処理を復習しておきます。
以下通常のeach文です。

```book.rb
@books = Book.all
# Bookモデルの全てのデータをインスタンス変数@booksに代入

@books.each{|book| puts "この本の名前は#{book.name}です"}
# こちら通常のeach文です。@booksをそれぞれbookに代入し、book.nameの値をputsで出力するコードです。
# 以下出力結果の例です。
# => この本の名前はハリーポッターです
# => この本の名前はロードオブザリングです
# => この本の...
```

# 3.次にインデックスを付けた場合(each_with_indexメソッド)
```book.rb
@books.each_with_index{|book, index| puts "#{index}：この本の名前は#{book.name}です"}
# 第二引数に新しくindexが加わりました。（※引数名はご自身で好きに変えてOK）
# 以下出力結果の例です。
# => 0：この本の名前はハリーポッターです
# => 1：この本の名前はロードオブザリングです
# => 2：この本の名前はワンピースです
# => 3：この本の名前はキングダムです
```

出力結果を見てみると、処理された順に0から番号がふられていることがお分かり頂けるかと思います！
でもインデックスの番号が０から始まってしまっています。
通常１から番号を付けることが多いと思うのですが、これではいちいち+1しなければいけなくて不便です。
でも安心してください。
実は番号を１からふりたい！という場合もメソッドが用意されています。

# 4.インデックスを指定の数字で始める場合(each.with_index(n)) ※n=数字

```book.rb
@books.each.with_index(1){|book, index| puts "#{index}：この本の名前は#{book.name}です"}
# => 1：この本の名前はハリーポッターです
# => 2：この本の名前はロードオブザリングです
```

先ほどと違う点は２点
①each_with_indexではなくeach.with_index
②each.with_indexの後に(1)で、初期値を１に指定。(100)にすると100から始まります。

#5.他のメソッドにwith_indexを付けることも出来る
eachメソッドを例に出してきましたが、その他の繰り返し処理にも使用できます。
mapメソッドを例に例えると、

```animal.rb
animals = [dog, cat, rabbit]
animals.map.with_index(1){|animal, i| "#{i}:#{animal}"}
# 以下出力結果の例です。
# => 1：dog
# => 2：cat
# => 3:rabbit
```
便利ですね！しかし2章で説明したようなmap_with_indexという書き方はこの場合できません！
each_with_indexと書けるのはeachメソッドのみの特権です。
それ以外の繰り返し処理で使用する場合は、with_indexを使用しましょう。

ぜひ活用してみてください:grin:
ご覧頂きありがとうございました！
Swiftのorientationの参考記事まとめ

# 参考記事
・[[iOS] デバイスの向きとアプリの向き](https://qiita.com/shirahama_x/items/dd4ce9851c2cc0a1cae1)
・[iOS でデバイスの向きを取得するときの罠](https://qiita.com/toshi0383/items/3e890a0146e89c3dc068)
・[【Swift】UIDevice | ポケットリファレンス サンプル付き](https://blog.77jp.net/uidevice-swift-japanese-document-xcode#_UIDevicecurrentDeviceorientation)
・[iOS 画面の回転状態を調べる-2012年更新](http://blog.livedoor.jp/arumisoft/archives/6688430.html)
・[iOSでの動画処理における「回転」「向き」の取り扱いでもう混乱したくない](https://qiita.com/shu223/items/057351d41229861251af)

# 個人的な参考部分
・[【Swift】UIDevice | ポケットリファレンス サンプル付き](https://blog.77jp.net/uidevice-swift-japanese-document-xcode#_UIDevicecurrentDeviceorientation)

```swift
// 表示されている画面の向きを取得します。例：UIDeviceOrientation
print(UIDevice.currentDevice().orientation)
```
・[iOS 画面の回転状態を調べる-2012年更新](http://blog.livedoor.jp/arumisoft/archives/6688430.html)
unknownはシミュレーターだと、横向きにした状態で、XCodeからアプリケーションをRunした場合等になる。
しかし、unknownが返っている場合でもシステム側は現在の向きを保持していて、アプリケーションを立ち上げた時には、ステータスバー等は画面の向きに正しい方向に表示され、アプリケーション内にAutosizingで配置してあるボタン等も画面の向きに合わせて正しく配置される。
なので、少なくともアプリケーションはunknownの場合でも画面の表示する向きは少なくとも知っている。
.....
画面関連のレイアウトで4方向のみを確実に調べる時は、これを使用する。

```swift
UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation];
```
窃盗罪と強盗罪の判例を用いたランダムフォレストによる学習

# はじめに
機械学習の参考書を読んでいる時に、コンピューターでも裁判官の真似事ができそうだと考え、実際に行動しました。
が、結果的に、自然言語を扱える程のデータが集まらず、これを断念することになりました。
しかしせっかく集めたデータ。死蔵させるのは勿体無いと思い、本稿を書くに到りました。

#データについての説明
```
import pandas as pd
import numpy as np
import sklearn as sk
import sklearn.ensemble as ske
import sklearn.model_selection as ms
import matplotlib.pyplot as plt
%matplotlib inline
```
```
data = pd.read_csv(r"D:\pythondata\data.csv")
```
使用したデータは全て、裁判所がネットで公開していたものです。
適用された刑法は60,66,68,71,235,236になっています。
―住居侵入等、牽連犯として処理されたものは省略。準窃盗が一件。共同正犯が複数ありましたが、これも省略。―
また、複雑化を避ける為に、同時的併合罪は全てデータから外しました。
執行猶予についても、扱いに悩み、これもデータから外しました。
その結果。使用できたデータ数はとても少なく、統計としての価値は低いです。（強盗罪を加えたのもこれが理由。歪みが大きくなるだけでは？という指摘はご容赦）

#ランダムフォレスト
``` 　
reg = ske.RandomForestRegressor()
```
```
X = data.drop(["judge"] ,axis = 1)
y = data["judge"]
reg.fit(X,y)
fet_ind = np.argsort(reg.feature_importances_)[::-1]
fet_imp = reg.feature_importances_[fet_ind]
```
```
fig, ax = plt.subplots(1, 1, figsize=(8, 3))
labels = X.columns[fet_ind]
pd.Series(fet_imp, index=labels).plot('bar', ax=ax)
ax.set_title('graph1')
```
![random.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431496/f493e25b-2d63-9e73-00d1-af2d234e8f04.png)

ランダムフォレストを使った理由は、これが一番いい結果だったからです。
データの評価項目は暴力、被害額、常習性、不法侵入、計画性の五つです。
グラフはそれらが結果に対してどれだけの影響を与えたのかを示しています。
これを見てわかるように、被害額と暴力に重みが偏重していることが分かります。
理由として、計画性においては突発的窃盗行為というものがそもそも少ない。
住居侵入を一応設けたが、判決に与える影響はあまりなかった。（窃盗罪自体が、それを予期してデザインされている？）
執行猶予が付いた事例を省いた為に、常習性という項目が有名無実になった。などが、挙げられると思います。
中立なデータでこれをやれば、常習性はもっと評価されていたと思います。
次は実際にこのデータを機械に学習させて、どのような判断が出来るのかを見たいと思います。

#学習
```
(X_train, X_test, y_train, y_test) = ms.train_test_split(X, y, test_size=0.2, random_state = 1)
reg.fit(X_train, y_train)
ypred = reg.predict(X_test)
```
```
print(reg.score(X_train, y_train))
```
0.9182638752147211

```
guraf = pd.DataFrame( {"予想した判決":ypred,
                       "実際の判決":y_test})               
display(guraf)
```
![2019624.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431496/16c18cf0-8325-9a93-c2ac-25f403766fcc.png)

結果はこのようになりました。
私は刑法学者ではないので、どれだけのズレが許容範囲になるのか判断がつきません。
ただ、ズレが大きいものに関して確認すると、強盗罪のケースにおける、情状酌量の有無が要因として大きいことが分かりました。
よくよく考えてみると、情状酌量という要素を設けなかったのはかなり大きなミスです。

#まとめ
本来の用途ではないデータの使用でしたが、実際にやってみると多くの問題点が発見できました。
具体的には、上述した通り、情状酌量という新たな判断基準の追加。
複数犯において、メンバーがそれぞれに果たした役割の評価。（構成要件を足がかりにすればいい）
社会復帰の可能性。
その罪が侵害した権利の程度。（特にこれは、センセーションな事例を扱う時ほど重要になる。）
等。です。
最後に、同じ試みをしている同志がいるのなら、この分野で先行しているアメリカや中国の論文を読んでから手を動かした方が絶対に良いと思います。
私もその内読みます。そのうちに・・・。


参考にしたURL
https://ipython-books.github.io/86-using-a-random-forest-to-select-important-features-for-regression/
[Python] 任意の階層分ネストした辞書を生成する

最終的に、  

```
{'a': 
  {'b': 
    {'c': 'foo'}
  }
}
```

こういう風なネストした辞書を生成したいときの方法。
キー値は`['a', 'b', 'c',...]`のようにして任意の個数を与え、1階層に1つのキーを配置する。

## 素朴に再帰関数で

```python
def create_nested_dict(list, val, dict, n=0):
    if n < len(list) - 1:
        dict[list[n]] = {}
        create_nested_dict(list, val, dict[list[n]], n + 1)
    else:
        dict[list[n]] = val


data = {}
create_nested_dict(['a', 'b', 'c'], 'foo', data)
print(data)
```

他に方法があれば追記。
What is Microservices? And Microservices Frameworks

**Microservices and Related Frameworks**

Microservices is a buzzword in technology that everyone is talking about.
Before going to understand about microservices, we need to know about monolithic architecture which is a traditional way of building applications through the internet.

**Monolithic Architecture**

Monolithic Architecture is an architecture, which contains all the services and components of an application as a single package. 
We can simplify this as "Way of maintaining all the services that are offered by an application in a single resource or as a single package".
Consider an e-commerce application, which provides different services like user registration, searching for products, payment, and purchase, reviews and feedbacks, support and customer care, etc.
Monolithic Architecture maintains all these services as a single package and stores them in the same server and database. So, the developer team should be large in size in order to accompany the changes in the product in any of the services. This forces the developers to use single technology all over to ease the task of development. If the users are growing, they need to scale their servers and databases in a quick period of time and this goes on continuously. This is the architecture which is generally followed by almost every organization before the introduction of microservices.

**What are Microservices?**
"Microservices is a phenomenon of building applications as a collection of multiple independent services which are loosely coupled".
It is nothing but decomposing the application into various modules which are independent of each other.
The primary advantage of Microservices is that the modules can be independently deployed. The team size of developers is very less (5–10), so that deployment is very fast. 
There is no need of working with single technology for the entire application as like of monolithic kernel. Various technologies can be used to build the application and it makes developers to comfortably work as their interest.
In the same e-commerce example, with the use of microservices, the services can be divided into various groups and it makes the developer teams easy to maintain and deploy.
These microservices can communicate with each other synchronously with REST API over HTTP and asynchronously using message brokers like KAFKA, ActiveMQ, etc.

**Popular Microservices frameworks:**
Spring Boot (Best microservices framework in Java)
Flask(Popular microservices framework in Python)
Dropwizard(Java)
Spark framework(Java)
Swagger(Java)
Jersey(Java)
Seneca Js(Popular microservices framework in node.js)

Related blog:

[Best Java course training in chennai](http://candidjava.com/training/advanced-java-training-in-chennai/)
Raspberry Pi python3.5.3をpython3.7.2にアップグレード

# 概要

Raspberry Piに「pyxel」をインストールしようとしたら、
デフォルトのpython3のバージョンが古いので3.7にアップグレードしたときのメモ。

以下の作業はpiユーザのホームディレクトリで行った。

```
pi@raspberrypi:~ $ pwd
/home/pi
```

## バージョン確認

```
$ python3 -V
Python 3.5.3
```

## aptを最新にする

```
$ sudo apt update
$ sudo apt upgrade
```

## pythonのコンパイルに必要なものをインストール

```
$ sudo apt install libffi-dev libssl-dev openssl
```

## python3.7のソースコードを取得

```
wget https://www.python.org/ftp/python/3.7.2/Python-3.7.2.tgz 
```

## pythonをコンパイルする

※makeは結構時間かかる

```
$ tar zxvf Python-3.7.2.tgz
$ cd Python-3.7.2
$ ./configure
$ make
$ sudo make install
```

## コンパイル成功したらバージョン確認

※新しいターミナルでバージョン確認を行うこと。
(コンパイルで使ったターミナルではバージョン変わらなかった)

```
$ python3 -V
Python 3.7.2
```

## pipを最新にする

```
$ sudo pip3 install --upgrade pip
$ pip3 --version
```

## 参考
https://okashimoze.jp/blog/raspberry-pi/385.html
webpack-cliは月曜日に働かなくなる

#webpackでエラーメッセージ
休み明けの月曜日いつものようにsassやjsをビルドしていたら↓のようなメッセージが表示された。

```
                            Thanks for using webpack!
                 Please consider donating to our Open Collective
                        to help us maintain this package.



                 Donate: https://opencollective.com/webpack/donate


C:\***\node_modules\webpack-cli\bin\cli.js:356
if (!e && fileOwnerId === process.getuid()) utimesSync(openCollectivePath, now, now);
                                  ^

TypeError: process.getuid is not a function
    at e (C:\***\node_modules\webpack-cli\bin\cli.js:356:43)
    at FSReqWrap.args [as oncomplete] (fs.js:140:20)
```
ビルドはされているっぽいので働いてはいるらしい。タイトルは盛りました。

https://nodejs.org/api/process.html#process_process_getuid
によると、どうやら`getuid()`という関数はWindowsやAndroid環境では利用できないとのこと。

私のPCはWindows10なので動かないのは当たり前。
**先週まで動いてましたけどね！！**

#webpackのファイルを確認する
件のコードを確認する。

```\node_modules\webpack-cli\bin\cli.js
/**
 * Show a hint to donate to our Opencollective
 * once a week, only on Monday
 */
const openCollectivePath = __dirname + "/opencollective.js";
const MONDAY = 1;
const SIX_DAYS = 518400000;
const now = new Date();
if (now.getDay() === MONDAY) {
	const { access, constants, statSync, utimesSync } = require("fs");
	const stat = statSync(openCollectivePath);
	const lastPrint = stat.atime;
	const fileOwnerId = stat.uid;
	const lastPrintTS = new Date(lastPrint).getTime();
	const timeSinceLastPrint = now.getTime() - lastPrintTS;
	if (timeSinceLastPrint > SIX_DAYS) {
		require(openCollectivePath);
		// On windows we need to manually update the atime
		// Updating utime requires process owner is as same as file owner
		access(openCollectivePath, constants.W_OK, e => {
			if (!e && fileOwnerId === process.getuid()) utimesSync(openCollectivePath, now, now);
		});
	}
}
```
コメントによれば毎週月曜日になると寄付を促す（？）メッセージを表示するもの。

私は使用していたwebpackのバージョンは3.3.3
アップデートしたのは2週間ほど前。

そういえば先週の月曜日はwebpack起動しなかったか・・・。

#解決策
https://github.com/webpack/webpack-cli/pull/966
2019/6/24現在のバージョンではこのコードは削除されているので、最新版にアップデートすればすべて解決。

```
npm i webpack-cli@3.3.5
```


休み明けからwebpackのエラーの対応はしんどい。
30分でGoogleスプレッドシートを使ってgeojsonを返すAPIを公開する


# サンプルデータの準備

- データはおでかけマップさんのデータをお借りしました

    - https://www.odekakemap.com/station/

- A列を駅名,B列を緯度、C列を経度とします

![ScreenShot 2019-06-24 22.39.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18613/130101b3-648a-85bc-6c51-3638a366cf9b.png)

# Google Action Script

- スプレッドシートのツール -> スクリプトエディタを選択します

![ScreenShot 2019-06-24 22.43.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18613/e38a706b-edf5-fc51-ff48-444aa2999547.png)

## 以下のコードをコピペ

```
function getData(sheetName) {
  var sheet = SpreadsheetApp.getActive().getSheetByName(sheetName);
  var rows = sheet.getDataRange().getValues();
  return rows.map(function(row) {
    var obj = {};
    obj.type = "Feature"
    obj.properties = {};
    obj.properties.name = row[0]; //A列
    obj.geometry = {};
    obj.geometry.type = "Point";
    obj.geometry.coordinates = [];
    obj.geometry.coordinates.push(row[2],row[1]);//C列,B列
    return obj;
  });
}

function doGet(e) {
  var data = getData('Sheet1');
  var geojson = {};
  geojson.type = "FeatureCollection";
  geojson.features = data;

  var callback = e.parameter.callback;
  
  if (callback) {
    return ContentService
    .createTextOutput(callback+'('+JSON.stringify(geojson, null, 2)+')')
    .setMimeType(ContentService.MimeType.JAVASCRIPT);
  } else {
     return ContentService
    .createTextOutput(JSON.stringify(geojson, null, 2))
    .setMimeType(ContentService.MimeType.JSON);
  }
}

```

## APIとして公開する

- 公開 -> ウェブアプリケーションとして導入

![ScreenShot 2019-06-24 22.48.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18613/93612ca4-7efd-774e-7c55-c393e6a26481.png)

- アプリケーションにアクセスできるユーザを「全員（匿名ユーザを含む）」

![ScreenShot 2019-06-24 22.49.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18613/1c7bbfc1-2292-dd69-1d1c-cc278eb7fc6d.png)

- 以下のようなURLが発行されます

```
https://script.google.com/macros/s/XXXXX/exec
```

# APIを叩いてみる
- curl 

```
% curl -sL https://script.google.com/macros/s/XXXXX/exec|head -n 30
{
  "type": "FeatureCollection",
  "features": [
    {
      "type": "Feature",
      "properties": {
        "name": "大崎"
      },
      "geometry": {
        "type": "Point",
        "coordinates": [
          139.728553,
          35.6197
        ]
      }
    },
    {
      "type": "Feature",
      "properties": {
        "name": "五反田"
      },
      "geometry": {
        "type": "Point",
        "coordinates": [
          139.723444,
          35.626446
        ]
      }
    },
    {
```

- web browser

![ScreenShot 2019-06-24 23.01.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18613/7ddc773c-15f7-22b4-c15b-522dc4e46cdb.png)

- 以上で公開完了です
Raspbian Buster リリース

#この記事について
Raspberry Pi用のOSである Raspbian の新バージョンについて、とりあえずさわりの部分だけ書いています。

# Raspbian Buster
[Raspberry Pi 4 の発売](https://qiita.com/nara256/items/f463520c4290eaf93d27) に合わせて、OSである Raspbian も新バージョンである Buster に切り替わったようです。

https://www.raspberrypi.org/downloads/raspbian/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169018/bfaf3900-e5f7-fedb-a470-68e958b45c1a.png)

## ちなみに、本家 Debian では...
https://www.debian.org/index.en.html

2019/06/24 時点では、まだ Buster は正式リリースされていません。
[Wikipediaさん](https://ja.wikipedia.org/wiki/Debian#%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%B9/%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E5%B1%A5%E6%AD%B4)によると、2019/07/06リリース予定とのことです。

Raspbian は本家より先行でリリースしちゃって大丈夫なのでしょうか...

## Raspbian Buster をインストールしてみた
手持ちの Raspberry Pi 3B+ に、サクッとインストールしてみました。

```
pi@raspberrypi:~ $ uname -a
Linux raspberrypi 4.19.50-v7+ #1234 SMP Thu Jun 13 11:06:37 BST 2019 armv7l GNU/Linux
pi@raspberrypi:~ $ cat /etc/debian_version
10.0
```

ということで、相変わらず互換性重視の32bit版が導入されるようです。
バージョンは10.0と、確かにStretch(9.x)より新しくなっています。

##個人的に気になること

```
pi@raspberrypi:~ $ python --version
Python 2.7.16
```
`python` は相変わらず2系が主流のようです。そろそろ3系がデフォルトにならないもんかな...

# 最後に...
大した情報がなくすみません。
無理やり時間を作って、もう少しいじりたい気分です。

#変更点について(2019.06.25追記)
リリースノートを和訳している方がいらしたので、リンクを貼っておきます（他力本願モードｗ）
https://qiita.com/utaani/items/917854fd532bce8b0320
[Vue]<li>をループで回してつくった箇条書きに、十字キーでフォーカスを合わせてる風の挙動をさせる

<p class="codepen" data-height="265" data-theme-id="0" data-default-tab="js,result" data-user="riotam4" data-slug-hash="VJbRdZ" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="[Vue]ループ処理したliタグの移動">
  <span>See the Pen <a href="https://codepen.io/riotam4/pen/VJbRdZ/">
  [Vue]ループ処理したliタグの移動</a> by riotam (<a href="https://codepen.io/riotam4">@riotam4</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>
挙動の確認方法は、見たまんまなので割愛します。
入力欄に調べたいものを入力した際、検索結果が下に現れるタイプの挙動（googleの予測変換みたいな感じ）を想定して作りました。
![スクリーンショット 2019-06-24 23.00.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330623/8e2830b7-70d5-56f8-07db-364ebf3bd6af.png)
今回は、実際にフォーカスしているわけでなくて、CSSでそれらしいものをあてがっているだけです。
for文でリストをループしているものなのですが、各々にどうやって違うスタイルを適応するのか…という部分が、結構苦戦しました。

簡単なコードなので、ぜひ読んでみて下さい。
キモになる部分は、ここです。

```vuejs:HTML側3行目
<ul v-for="(v,k) in users">
    <li :class="{change:currentIndex === k}">{{ v }}</li>
</ul>
```
ループで生成されるリストタグ全てに、この`:class`を仕込み、`currentIndex === k`のリストだけ、changeクラスに変化させる。

```javascript:JS側全部
  var vm = new Vue({
    el: '#app',
    data: {
        users: [ '太郎', '次郎', '三郎', '四郎', '五郎'],
        currentIndex : -1,
     },
    methods: {
      moveDown() {
        this.currentIndex = this.currentIndex + 1;
      },
      moveUp() { 
        if(this.currentIndex > -1){
          this.currentIndex = this.currentIndex - 1;  
        }
      },
    }
  });
```
currentIndexは初期値を-1に設定しておき、上下の矢印キーで発火する、moveDownメソッド、moveUpメソッドで、それぞれ1ずつ数値を変更させる。
数値の変更されたcurrentIndexは、usersを１つずつ取り出した際のキーにあたる「k」と比較され、同じものがあるところのみ、クラスが変更される仕組みです。

ループで生成されるリストタグの１つに、どうやってクラスをつけようか悩んだが、全部に動的変化をさせられるものを仕込めば良かったんだと勉強になりました。
今日はこれだけ。ありがとうございました。
# 続編
箇条書きから選んだ要素を取得する続編は[こちら](https://qiita.com/riotam/items/7fce91b5a6ca1e8a0372)
DockerをMacに入れて、Docker入門を果たす

# DockerをMacに入れて、Docker入門を果たす

Dockerコマンドが使える環境をMacで構築します。ついでに基本的な操作も確認します。結構あっという間にできます。

macOS用のパッケージマネージャーである[Homebrew](https://brew.sh/index_ja.html)がインストールされている前提で進めます。インストールされていない方は、[macOSにHomebrewをインストール](https://qiita.com/pypypyo14/items/4bf3b8bd511b6e93c9f9)してから以降を進めてください。

## docker-for-macをインストール

まず、[docker-for-mac](https://docs.docker.com/docker-for-mac/install/)というアプリケーションが必要です。こいつはMac上の普通のアプリケーションなのでブラウザから直接落として解凍しても良いのですが、せっかくなのでhomebrewのcaskを使用してインストールします。

[homebrew-caskは非常に便利な代物](https://qiita.com/swallowtail62/items/61244ea3c7d00f692823)なので、知らない方はぜひこの機会に使ってみてください。

```
brew cask install docker
open /Applications/Docker.app
```

以上が完了したら、[公式のGet started](https://docs.docker.com/docker-for-mac/)をやってみましょう。

以下でも、軽くその内容をさらいます。やる際ですが、[dockerコマンドチートシート](https://qiita.com/voluntas/items/68c1fd04dd3d507d4083)を見つつ、それが何を意味するのかを調べながらやると、大体雰囲気が理解できます。`docker`コマンドを使用する際は、オプションとして何が指定されているかがすごく関わってくるので、そのオプションが何を意味するのかきちっと調べておいたほうがいいです。

## 初めてのDocker

### DockerでHello World

```
docker run hello-world

docker image ls
```

`docker run hoge`で、"hello world"イメージを引っ張ってきて、それをコンテナとして起動しました。`docker image ls`とすることで、ローカルにインストールしたイメージ一覧が確認できます。この記事を書いている途中に知ったのですが、`docker image ls` と `docker images` は[別物である](https://fight-tsk.blogspot.com/2018/06/docker-image-ls-docker-images-ls.html)ことに少し注意します。

### nginxサーバーを立ち上げてみる

```
docker run --detach --publish=80:80 --name=webserver nginx
# http://localhost/ にアクセスすると、nginxのwelcome pageが見える
# `docker run -d -p 80:80 --name webserver nginx`でも同じ意味

docker ps
# プロセスが動いているのが確認できる

docker stop webserver
# これで、NAMESがwebserverのプロセスを終了させることができる

docker ps
# 何もプロセスが動いていないのが確認できる
```

`--detach`オプションを指定することで、バックグラウンドで実行させることが可能です。また、`-p 80:80`はポート番号を表しており、"外部からアクセスされるポート番号:コンテナ側のポート番号"となっています。つまり、`-p 3000:80`であれば、ホストしているPC（つまりあなたのMac）上の3000番ポートにアクセスすると、nginxコンテナ上の80番に[フォワーディング](https://wa3.i-3-i.info/word12664.html)される（URLでいうリダイレクトのようなもの？）ということです。

動いているコンテナをストップさせるにはそのまま、`docker stop`。

### コンテナを削除してみる

``` 
docker ps -a
# プロセスが終了しているコンテナも含めて確認できる

docker rm webserver
# コンテナを削除する
```

`docker ps`では動いているコンテナしか確認できませんが、`docker ps -a`とすることでプロセスが終了しているコンテナも含めて確認することができます。`docker rm CONTAINER_NAME`でコンテナを削除できます。

### イメージを削除してみる

```
docker image ls
# ローカルにインストールしたイメージ一覧が確認できる

docker image rm nginx
# nginxのイメージをローカルから削除する

docker image rm hello-world
# エラーが出て削除できない。これは、コンテナがこのイメージを使用しているために起こる。

docker ps -a
# hello-worldイメージを使用しているコンテナのNAMESを確認

docker rm adoring_minsky
# コンテナを削除。NAMES（ここでいう"adoring_minsky"）は個々で違うので注意

docker image rm hello-world
# 今度は正しく削除できる。`docker rmi hello-world`でも同じ意味になる
```

イメージがコンテナで使用されている場合には削除できません。`docker ps -a`で動いていないコンテナを確認して、その削除のあとにイメージを削除する必要があります。

また、使ってないイメージやコンテナの削除には、[`prune`コマンド](https://ensekitt.hatenablog.com/entry/2018/07/03/200000)でやるのが楽なようです。最初のうちはコンテナ作って壊してを多く経験するのが楽しいので、そのあとの掃除はこの`prune`コマンドで済ませましょう。

# docker daemonをログイン時に自動で立ち上げるのをやめる

コンソールに`top -o mem`と入力してPCのプロセスを確認するとわかりますが、docker for macは結構メモリを食うので、そこまで使用しない人は自動で起動はさせない方が良いです。

自分はフロントエンドエンジニアで、現在の状況ではそこまで頻繁には触らないため、自動で立ち上げるのをやめました。docker-for-macのpreferencesより行えます。
【SQL】基本の指示

**SQL**
・テーブル：データを格納している表のこと
・表の横：行　or レコード
・表の縦：列　or カラム　or フィールド

**SQL の指示**
SELECT　＊ FROM　players☜　players というデータベースからすべてのデータを取り出すときの指示

SELECT name, id FROM players

a <> B　　⇔　aとBは等しくない

**・データ件数を表示する場合**
SELECT COUNT(*) FROM players;

**・条件に合ったデータの件数を表示する場合**
SELECT COUNT(*) FROM players WHERE job_id = 6;

**・データを並び替えて取得する**
SELECT * FROM players ORDER BY level;

**・データを並べ替えて取得する（逆順）**
SELECT * FROM players ORDER BY DESC

**・上位3件だけ表示する**
SELECT * FROM players ORDER BY DESC LIMIT 3;

**・job_id ごとに人数を集計する**
SELECT job_id **,** COUNT(*) from players GROUP BY job_id;

**・データを追加する**
追加したいデータは
ID:10
name: Kirimiちゃん
level:3
job_id:5

**INSERT INTO** players(id,name,level,job_id) VALUES(10, "Kirimiちゃん", 3, 5);
playersは今からデータを追加したいテーブル名のこと
VALUES（）の中に追加したいデータを記述

**・データを追加して表示する**
INSERT INTO players(id,name,level,job_id) VALUES(11, "たくわん", 1, 1);
SELECT * FROM players;

 **・一度に複数のデータを追加する**
INSERT INTO players(id,name,level,job_id)
VALUES
(12, "ぶり", 1, 1),
(13, "いくら", 1, 1)
;
SELECT * FROM players;

**・データを更新　level ＋１**
UPDATE players SET level + 1 WHERE id = 11;
SELECT * FROM players;
※WHEREを書き忘れるとplayersテーブルのすべてのデータが更新されてしまう。

**・データを削除**
UPDATE players SET level = 10 WHERE id >=11;
SELECT * FROM players;
ランダムに引いた4つの数字を、2つの二桁の数字にして、和を最大にする【ruby初心者】

#はじめに

適当に引いた1桁の数字を、2枚ペアに分けて、2桁の数字にし和を最大化する。

#入力部分



```
input_line = gets.split(" ").map(&:to_i)
input_line = input_line.sort
#=> 配列が
```

#計算部分
1〜2番目に大きい数字は、2桁目。
後の２つは1桁目になる。

```
a = input_line[3]*10 + input_line[1]
b = input_line[2]*10 + input_line[0]

p a + b
```

ちなみに、上の3行を1行でも書ける。
その場合こんな感じ

```
p input_line[3]*10 + input_line[2]*10 + input_line[1] + input_line[0] 
```
Nuxtのgoogle-analyticsモジュールが正常に動作しない時の対処法

## Nuxtのgoogle-analyticsモジュールが正常に動作しない時の対処法
タイトルのとおり、Nuxtのgoogle-analyticsを正しく設定してもタグが出力されないということがありました。

しかし、僕のやりたいことはheadタグにgoogle analyticsのスクリプトを埋め込むということだけでしたので、こちらの記事を参考にしてタグを埋め込むようにしました。
[【Nuxt】共通のJavaScriptをheadに記述する方法](https://qiita.com/ToshioAkaneya/items/17fa689734971171a86d)

できればモジュールを使いこなしたいのですが、臨時的な対応としては十分です。
この記事が参考になれば幸いです。
## 終わりに
私は現在、Web3のサービスの開発をしています。詳しくはこちらの記事をご覧下さい。
        [無料でイーサリアムが当たる、Web3時代の寄付サイトを作った話](https://note.com/kenroda/n/n814347fbdcd7)
GITHUB に PUSH できない（再）

前回の Push から時間が空いてしまうと、いまだに一発で Push できなくなります。
そこで、ブログにまとめることに。

<h1>Push の方法</h1>

<ol>
<li>git init</li>
<li>git add README.md</li>
<li>git commit -m "first commit"</li>
<li>git remote add origin https://github.com/Shaw622/hogehoge.git</li>
<li>git push -u origin master</li>
</ol>

基本的には上記のコマンドをコピペすれば良いのですが、
git add README.md の README.md 部分は別に要らないので、
git add . にすれば良いことをよく忘れます。。。</p>

ここをよく間違えるので、エラーを出してしまいますが、
ブログでまとめたからにはもう大丈夫かな〜。

そして Quita にもこの件についてはまとめておいた方が後々役に立ちそうだ。