OmniAICreator/Qiita-1.07M huggingface dataset:
ReactとReduxの概要

# Reactの公式サイト
https://reactjs.org/

# オンラインエディタ
https://reactjs.org/redirect-to-codepen/hello-world

# Sandbox
https://codesandbox.io/s/new

# 最小限なReactのHTMLサンプル
https://raw.githubusercontent.com/reactjs/reactjs.org/master/static/html/single-file-example.html

# ReactとRedux（Fluxの派生）について

## Reactとは？  
ざっくり言うと、Viewをコンポーネント化できるライブラリのことです。  

### Reactの特徴

1. JSXが使える（可読性が上がり、開発の効率化が見込めるため、使用が推奨されています。）  
    * JSXの参考サイト  
    [JSXの基本 – React入門](https://www.to-r.net/media/react-tutorial04/)  
    [JSXの紹介](https://code-examples.net/ja/docs/react/introducing-jsx)  
1. Virtual DOM（Viewの更新が速い）  

## Fluxとは？
主にSPA（Single Page Application）においてUIの状態(state)をシンプルに管理することに役立つアーキテクチャのことです。
FacebookがFluxの実装も提供していますが、一般的に言うとアーキテクチャのことを指します。  
Fluxは以下の構成要素を持ちます。  
  
* View  
イベントのハンドリングによって、ユーザーの操作を検知し、Actionを作り、ActionをDispatcherに渡す役割を担います。
* Action  
Actionは、ユーザーがどんな動作を行ったかを示すオブジェクトです。  
Actionには、必ずtypeプロパティが存在し、そこにどんな操作を行ったかを示す文字列（Symbol要素等も可）が設定されています。
* Dispatcher  
ActionをStoreに渡す役割を担います。  
* Store  
受け取ったActionを元に、アプリケーションの状態（state）を変更する役割を担います。  
アプリケーションの状態（state）が変更されると、Viewはその変更を検知し、変更内容をViewに反映します。  

## Reduxとは？
Fluxアーキテクチャの一種です。
Reactに依存していないものの、親和性が高いという特徴を持ちます。  

### Reduxの3原則

* Single source of truth
画面の状態を一つのstateで管理します。 

* State in read-only
更新できるのはStoreのみ、でも参照はどこからでも可能です。  
* Changes are made with pure functions 
変更は純粋な関数（副作用の無い関数）によって行います。
純粋な関数＝同じinputの場合、同じoutputを返す関数となります。

### Fluxとの違い
* Reducer
アプリケーションの状態（state）を変化させるための関数です。
storeを作成する際、Reducerをstoreに渡します。
storeで管理されているstateが変更された際、それ
    * Reducerで有効な機能
        * Spread Operator  
            * ES2015から導入された仕様です。
            * 配列やオブジェクトを値渡しで展開できます。
            * Spread Operatorの参考サイト  
            [スプレッド構文](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Spread_syntax)

        * Object.assign()
            * ES2015で標準化されたメソッドです。
            * 配列やオブジェクトを値渡しで展開できます。
            * Object.assign()の参考サイト  
            [Object.assign()](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Object/assign)

[Reactの環境構築](https://qiita.com/k-murayama/items/014e3745290208b92af1)
[Reduxの簡単な実装例](https://qiita.com/k-murayama/items/bce00aaaf4f9050ac143)
【GitHub】よくつかうコマンドまとめ

Github使い始めてよく使うコマンドをまとめました。




###初期設定
```vb
git config --global user.name ユーザ名
git config --global user.email メールアドレス
```


###Pushの基本操作
```vb
touch README.md
git init
git add .
git commit -m "コメント"
git remote add origin プッシュするURL
git push -u origin master
```

###コミットロールバック
```vb
'コミット履歴を取得
git log --name-status

'表示例
commit ハッシュ値

'ハッシュ値指定でコミットをロールバックする
git reset --hard ハッシュ値
```



###ブランチ系コマンド
```vb
'ローカルブランチを確認する
git branch

'リモートブランチを確認する
git branch -r

'両方
git branch -a

'ブランチの削除
git branch -d XXX

'ブランチの強制削除
git branch -D XXX

'リモートブランチを削除する
git push origin :XXX

```


###Gitのコミット履歴を削除する方法
```vb
rm -rf .git
git init
git remote add origin リポジトリURL
git add .
git commit -m "コメント"
git push -u origin master -f
```
laravel で Illuminate/Database/Eloquent/MassAssignmentException エラーが出るとき

laravel でUPDATAしようとしたときに以下のエラーが出たため、対策を残しておきます。

```
Illuminate/Database/Eloquent/MassAssignmentException with message
```


環境
cloud9のPHP環境を使用
PHP: 7.x
laravel: 5.x
MySQL: x.x
Webサーバー: apatch


対策
PJ名 > app > テーブル名.phpファイルを編集します。


```Post.php(befor)
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    //
}

```

Postテーブルの title と body のカラムにはデータを登録しても良いという設定をしています。

```Post.php(after)
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    //
    
    //MassAssignmentException 対策
    protected $fillable = ['title', 'body'];
}

```
nginxの設定ミスで起こるリファラの検証不備

# はじめに
 
この記事は下記リンクの日本語翻訳記事です

https://github.com/yandex/gixy/blob/master/docs/en/plugins/validreferers.md

翻訳が誤っている場合はコメントか[@no1zy_sec](https://twitter.com/no1zy_sec)までお知らせいただけると幸いです。

## [valid_referers] none in valid_referers
[ngx_http_referer_module](http://nginx.org/en/docs/http/ngx_http_referer_module.html)モジュールは誤った`Referer`ヘッダの値でのクエストによるサービスへのアクセスをブロックすることができます。多くの場合は`X-Frame-Options`ヘッダ(クリックジャッキングからの保護)の設定が使用されますが、それ以外の場合もあります。

### このモジュールの設定に関する典型的な問題
* `server_name`ディレクティブでの不正なサーバー名の使用
* 広範囲すぎる、または不正確な正規表現
* noneの使用

## `none`がダメな理由
[ドキュメント](http://nginx.org/en/docs/http/ngx_http_referer_module.html#valid_referers)によると
> the “Referer” field is missing in the request header;

訳:
リクエストヘッダに`Referer`フィールドが無い

しかし、任意のリソースはユーザーのブラウザから`Referer`ヘッダなしでリクエストできることを覚えておくことが重要です。
例えば:

* HTTPSからHTTPへのリダイレクトの場合
* [Referer Policy](https://www.w3.org/TR/referrer-policy/)を設定する
* 不透明なoriginを持つリクエスト
    - `data：`スキームなど
    

したがって、有効なrefererとしてnoneを使用すると、任意のrefererのバリデーションが無効になります。

## 関連リンク
[nginxの設定ミスで起こるHTTP Splitting](https://qiita.com/no1zy_sec/items/fe7c44b5a0fdd4807bbe)
[nginxの設定ミスで起こるSSRF](https://qiita.com/no1zy_sec/items/2718f4a99bb8368ac374)
[nginxの設定ミスで起こるパス トラバーサル](https://qiita.com/no1zy_sec/items/e541f1c838874ff400bb)
[nginxの設定ミスで起こるMultiline response headers](https://qiita.com/no1zy_sec/items/da280cb5c1e154babe2a)
[nginxの設定ミスで起こるレスポンスヘッダの出力不備](https://qiita.com/no1zy_sec/items/b786abcba5d796ccc300)
[nginxの設定ミスで起こるreferer/origin検証の問題](https://qiita.com/no1zy_sec/items/93f1efe3c58102807de8)
[nginxの設定ミスで起こるHostヘッダフォージェリ](https://qiita.com/no1zy_sec/items/dfccd91cf76bf73b7754)
Course 2 > Week 2 Optimization algorithms（Coursera Deep Learning Specialization 受講記録）

Coursera > [Deep Learning Specialization](https://www.coursera.org/specializations/deep-learning) > Course 2 : Improving Deep Neural Networks: Hyperparameter tuning, Regularization and Optimization >  **Week 2 Optimization algorithms** の受講記録。

#概要
Course 2 は3週分の講座から構成される。

1. [Week 1 Practical aspects of Deep Learning](https://qiita.com/onooooo/items/8a571a78605fce18be22)
2. [Week 2 Optimization algorithms](https://qiita.com/onooooo/items/fcb86624b837c734aa60)
3. [Week 3 Hyperparameter tuning, Batch Normalization and Programming Frameworks](https://qiita.com/onooooo/items/a648062b67893fd1b58f)

今回は Week 2 の受講記録。テーマは最適化の手法。

---
#Optimization algorithms
##Mini-batch gradient descent

- 最急降下法：学習データの全データの誤差を計算してからパラメータ更新
- 確率的勾配降下法：ランダムに取得したデータ1件ずつ、誤差を計算してパラメータ更新
- ミニバッチ法：ランダムに取得したm件のデータについて、誤差を計算してパラメータ更新

１エポック＝訓練データが１巡

##Understanding mini-batch gradient descent
バッチサイズは2のn乗がよい
64とか128とか256とか512とか。

##Exponentially weighted averages
日本語だと指数加重移動平均？
個々のデータの値はバラツキがあるのでそのまま使用するのではなく、直近過去のデータの値の平均を使いましょう、というのが基本的なコンセプト。平均といっても単純に母数で割るのではなく直近の値ほど指数関数的に重みをつけて重要視する。

##Understanding exponentially weighted averages
Exponentially weighted averagesをもう少し掘り下げる。
単純な平均値を計算するよりも計算のコストとメモリ効率がいいため、機械学習でも使い勝手が良い。

##Bias correction in exponentially weighted averages
指数加重移動平均における序盤の時系列データは、その時点から見た過去データが無いので補正が効かない。
そのマイナス分をいいかんじに補正するテクニック = Bias Correction
しかし逆に言うと立ち上がりのデータの値が少なめに偏るだけなので、機械学習ではわざわざ Bias Correction を使う人はあまりいない。

##Gradient descent with momentum
Momentum
Gradient descentの計算にExponentially weighted averagesの考え方を適用する。
Learning rate が大き目でも学習が発散しにくい。結果としてSGDに比べて学習速度が早くなる効果がある。

##RMSprop
root mean squared propagation
Momentumでは微分した結果(dW,db)についてExponentially weighted averagesの考え方を適用したが、RMSpropでは微分した結果の二乗についてExponentially weighted averagesの考え方を適用する。

##Adam optimization algorithm
Adaptive Moment Estimation
MomentumとRMSpropを組み合わせたような手法。
そろそろパラメータや数式がごちゃごちゃしてきて理解が追いつかなくなってくる。。

Momentum,RMSprop,Adamといった最適化手法についてはこのあたり↓も参考になる。
[Inside of Deep Learning （ディープラーニングの性能改善手法 一覧）](https://qiita.com/jiny2001/items/1d3f2d0370b2689d2da7#%E3%83%A2%E3%83%87%E3%83%AB%E8%A6%8F%E6%A8%A1%E3%81%AE%E9%81%A9%E6%AD%A3%E5%8C%96%E3%81%82%E3%82%8B%E3%81%84%E3%81%AF%E3%83%A2%E3%83%87%E3%83%AB%E5%9C%A7%E7%B8%AE)

##Learning rate decay
時間の経過と共に徐々に学習率を下げることも学習のスピードアップに役立つ。

##The problem of local optima
Local Optima
Saddle Point
コスト関数の勾配が0になるほとんどの場合は局所最適点ではなく鞍点である。
鞍点に変なハマり方をすると学習が進まなくなる。
鞍点のplateau（？上手い訳が思い浮かばないが、要は鞍点からさらに傾斜を降りる方向に…ということだと思う）を駆け降りるために MomentumやRMSprop、Adamなどのアルゴリズムが役に立つ、と説明しているんだと思う。ちょっと英語の理解が難しい。。

参考にしたページ
[Understanding Learning Rates and How It Improves Performance in Deep Learning](https://towardsdatascience.com/understanding-learning-rates-and-how-it-improves-performance-in-deep-learning-d0d4059c1c10)

#Programming assignment
##Optimization

- Gradient Descent
- Mini-Batch Gradient descent
- Momentum
- Adam
- それぞれを比較。今回はAdamがもっともAccuracyが高く、学習の収束も早い。

#Heroes of Deep Learning (Optional)
##Yuanqing Lin interview
TabbedPageのタブにアイコンが表示されない、そもそもタブが表示されない

Xamarinを触り始めて、初めて詰まりに詰まったわりにあっさり解決したのでメモして置くことにします。
#作りたかったもの
以下の画像のようにしたかった。
![Simulator Screen Shot - iPhone 8 - 2018-06-10 at 00.40.39.png](https://qiita-image-store.s3.amazonaws.com/0/153926/7640206c-a05a-2449-41b7-8176a7216232.png)

#起こっていた現象
##TabbedPageのタブそのものが表示されない
以下の画像のような現象が起きていた。
![Simulator Screen Shot - iPhone 8 - 2018-06-10 at 00.41.43.png](https://qiita-image-store.s3.amazonaws.com/0/153926/1c84a8f3-0ddd-b3a8-316c-55f00254f193.png)

パラメータを与えるインスタンスを間違えていたのが原因。
詳細は以下のとおりである。正解と間違いを比較して並べておく

```cs:correct.cs
    public partial class MyTabbedPage : TabbedPage
    {
        public MyTabbedPage()
        {
            InitializeComponent();
            this.Children.Add(new NavigationPage(new MyContentPage1())
            {
                Title = "Tab1"
                Icon = "icon1.png"
            });
            this.Children.Add(new NavigationPage(new MyContentPage2())
            {
                Title = "Tab2"
                Icon = "icon2.png"
            });
        }
    }
```

```cs:wrong.cs
    public partial class MyTabbedPage : TabbedPage
    {
        public MyTabbedPage()
        {
            InitializeComponent();
            this.Children.Add(new NavigationPage(new MyContentPage1()
            {
                Title = "Tab1"
                Icon = "icon1.png"
            }));
            this.Children.Add(new NavigationPage(new MyContentPage2()
            {
                Title = "Tab2"
                Icon = "icon2.png"
            }));
        }
    }
```

よーーく見ると、TitleとIconのパラメータを与える先が異なってしまっていることが分かる。
(正解の方はTabbedPageの直下になるNavigationPageのほうにパラメータが与えられているが、間違いの方はその中にあるContentPageの方にパラメータが与えられてしまっている。)

##TabbedPageのタブアイコンが表示されない
以下の画像のような現象が起きていた。
![Simulator Screen Shot - iPhone 8 - 2018-06-10 at 00.42.26.png](https://qiita-image-store.s3.amazonaws.com/0/153926/a7ff8f06-7f23-fd46-f913-33b48a04eacb.png)

これは画像を保存する場所を正しく理解していなかったことが原因だった。
結論から述べると、以下の画像のようにiOS向けプロジェクトの中のResourceフォルダに入れておけばいい。
<img width="241" alt="スクリーンショット 2018-06-10 0.38.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/153926/7a12df16-edae-22f4-3d83-27b0b78d1e3a.png">

ファイルの命名規則などはこの後出てくる参考サイトに書いてあるので割愛する。

###どんな経緯で詰まってしまったのか
今回このコードを書くにあたり特に参考にさせていただいたのが以下のサイトである。

[TabbedPage と NavigationPage を組み合わせて使うには](http://ytabuchi.hatenablog.com/entry/2016/05/30/210000)

解決した今でこそすぐ理解できるが、
最初からクロスプラットフォームで作ることしか考えておらず、
詰まっていたときはこんなふうに思っていた。

**「Resourceフォルダってどこに作ればいいの？」**

そこで全OS共通部にフォルダを作ってしまったのが運の尽き。
ずぶずぶと1週間ほど費やしてしまうことに…

タブバーにアイコン使うのはiOSだけなんだからよくよく考えれば当然のことなのであった。

#まとめ

* TabbedPageのタブバー表示情報は、子要素に追加するオブジェクトそのものに与える
* TabbedPageのアイコンはiOSしか使わないので、iOSプロジェクト内のResourceフォルダに格納
RestTemplate で Apache httpclient を使うときに Cookie を無効にする

## はじめに

何気ない Cookie ヘッダが API サーバをきずつけることもあります

## 詳細

`RestTemplate` といえば Spring で WebAPI を叩くときによく使うだろうと思います。
シンプルな例だと、以下のようなコードで http 通信を行って得られたレスポンスを任意のクラスにマッピングすることができます。

```java
restTemplate = restTemplateBuilder.requestFactory(requestFactorySupplier)
                                  .build();
HogeResponse hogeResponse = restTemplate.getForObject("http://hoge.example.com/", HogeResponse.class);
```

この `RestTemplate` インスタンスを作る過程で `RequestFactory` の指定をしなかった場合、

1. `org.apache.http.client.HttpClient`
2. `okhttp3.OkHttpClient`
3. `com.squareup.okhttp.OkHttpClient`

の順番でクラスが存在するか確認して、見つかったクラスに対応する `ClientHttpRequestFactory` が使われることになります。

(注: [Spring Boot のバージョン 2.0.2.RELEASE](https://github.com/spring-projects/spring-boot/blob/v2.0.2.RELEASE/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/web/client/RestTemplateBuilder.java#L69-L78) を参照して書いています)

すべて見つからなければ `java.net.*` にあるクラスで通信を行う `SimpleClientHttpRequestFactory` が使われますが、なんだかんだと依存関係を追加していると、apache の `HttpClient` がクラスパスに存在するケースは多いのではないでしょうか。

この `HttpClient`、デフォルトの挙動では、通信先から Set-Cookie されたものを次のリクエスト時に Cookie ヘッダにセットして送ろうとします。
Rest API を利用するほとんどのケースでは Cookie を使うことはないと思いますし、うっかり通信先のロードバランサーが StickySession を利用していた場合、特定のリアルサーバーにアクセスが偏ってしまうような弊害も考えられます。

apache `HttpClient` を利用する場合は、以下のように `disableCookieManagement` することで Cookie を送らなくなります。

```java
HttpClient httpClient = HttpClientBuilder.create()
                                         .disableCookieManagement()
                                         .build();
HttpComponentsClientHttpRequestFactory requestFactory
        = new HttpComponentsClientHttpRequestFactory(httpClient);
restTemplate = restTemplateBuilder.requestFactory(() -> requestFactory)
                                  .build();
```

ちなみに `SimpleClientHttpRequestFactory` や OkHttp3 の場合は、特に指定しなくても大丈夫のようです(まもなく Spring Boot もサポートしなくなるので OkHttp2 は未確認です)。


## まとめ

`RestTemplate` を使う際には、`ClientHttpRequestFactory` を指定するのが無難です。
でないとアプリケーションの依存関係が変わることで挙動が意図せず変わる可能性があります。
ROS2入門[Python3] - Publisher

# 序章
大学のサークルでROS2を使ってロボットの開発をすることにした。
基本は備忘録としてQiitaに投稿することが主な目的ではあるが、もっとROS2が流行るといいなと思い書くことにした。

環境は、
Python3 -- 3.6.5
macOS -- High Sierra 10.13.4

# ROS2(Publisher)
## 〜動作順〜
１.　rclpy.init()<font color="red">でRCL(ROS Client Library)の初期化?を実行</font>
２.　rclpy.node.Node(node_name)<font color="red">はnode_nameを渡してインスタンス化</font>
３.　rclpy.node.Node.create_publisher(msg_type, topic)<font color="red">でmsg_typeとtopicを指定してpublisherを作成</font>
４.　std_msgs.msg<font color="red">から用途に合わせた型を選ぶ。</font>
５.　std_msgs.msg.data<font color="red">にデータを格納する</font>
６.　rclpy.node.Node.publish(std_msgs.msg)<font color="red">で格納されたデータが送信される。</font>
７.　rclpy.spin(rclpy.node.Node)<font color="red">をすることでrclpyはループに入り処理を繰り返す。</font>
８.　rclpy.node.Node.destroy_node()<font color="red">でNodeを破壊する。</font>
９.　rclpy.shutdown()<font color="red">でRCLをシャットダウンする</font>

これがわかる方は相当ROS関連を触っている方なのでは？
色々と教えてもらいたい。

## 〜プログラム(python3)〜
### +簡易プログラム+
では、上の動作順に従ってプログラムを構築していきましょう。
すると下記のようなプログラムになります。

```python3:talker.py
import rclpy
from rclpy.node import Node
from std_msgs.msg import String

# rclpy.init()でRCLの初期設定を実行
rclpy.init()

# 引数node_nameに名前を渡してインスタンス化
node = Node("talker")

# 引数msg_typeとtopicにメッセージタイプとtopicネームを渡す
pub = node.create_publisher(String, "chatter")

# データタイプStringをインスタンス化
msg = String()

# データを格納
msg.data = "Hello"

# データを公開
pub.publish(msg)

# ループで処理を続ける
rclpy.spin(node)

# ノードをきちんと破壊
node.destroy_node()

# ROSをシャットダウン
rclpy.shutdown()
```
python3 talker.py
でプログラムを実行してください。
今回は何も表示されなければ成功です。しかし、実際にはmsgはしっかりと公開され、subscribeできるようになっています。
(subscribeは次回の記事で紹介します。)
### +汎用プログラム+
では、classを使用し汎用性の高いプログラムに書き換えてみましょう。

```python3:talker.py
import rclpy
from rclpy.node import Node
from std_msgs.msg import String

# Nodeクラスを継承
class Talker(Node):
    def __init__(self):
        # Node.__init__を引数node_nameにtalkerを渡して継承
        super().__init__("talker")
        self.count = 0

        # Node.create_publisher(msg_type, topic)に引数を渡してpublisherを作成
        self.pub = self.create_publisher(String, "chatter")
        self.time_period = 1.0

        # Node.create_timer(timer_period_sec, callback)に引数を渡してタイマーを作成
        self.tmr = self.create_timer(self.time_period, self.callback)

    def callback(self):
        self.count += 1

        # std_msgs.msg.Stringのインスタンス化
        msg = String()

        # msg.dataにデータを格納
        msg.data = "HELLO PUBLISHER! [{0}]".format(self.count)

        # Node.get_logger().info(message)で表示したい内容を引数messageに渡す
        self.get_logger().info("Publishing: {0}".format(msg.data))

        # msgを公開
        self.pub.publish(msg)


def main():
    # rclpy.init()でRCLを初期化
    rclpy.init(args=args)

    # Nodeのインスタンス化
    node = Talker()

    # Node処理をループさせ実行
    rclpy.spin(node)

    # Nodeを破壊
    node.destroy_node()

    # RCLを終了
    rclpy.shutdown()

if __name__ == "__main__":
    main()
```
今回は
[INFO] [talker]: Publishing: HELLO PUBLISHER! [1]
１の部分が+1づつ表示されていったら成功です。

# まとめ
アルゴリズムさえ守っていればcallback関数(汎用プログラム)内を書き換えて、より複雑な動作も書くことが可能となります。

# 次回
次回はSubscriberについて投稿します。
Publisherよりも簡単なアルゴリズムとなっています。
https://qiita.com/l1sum/items/b7393c34fb0127826f74
GitLabのサブグループにGoのパッケージを置くとgo getが面倒くさい話

## はじめに

会社のGitLabのサブグループにGoパッケージのリポジトリを置いたときに、go getで面倒くさいことが起きたのでメモ。

## だめだったgo get

```
go get http://gitlab.com/group/subgroup/go-package
```

go getが`http://gitlab.com/group/subgroup.git`としてパッケージを取ろうとしてだめだった。

## 微妙だったgo get

```
go get http://gitlab.com/group/subgroup/go-package.git 
```

`.git`を後ろにつけてみたら、取得はできた。が、かな～り時間がかかった。（go get -vで見てみたら、色々なプロトコルでアクセスしようとしていた）

## 良かったgo get

```
go get http://gitlab.com/group/go-package
```

サブグループに置くのを諦め、グループ直下にパッケージを移動してgo getしたら、すぐに取得できた。

## おわりに

GitLabのサブグループとgo getの相性はいまいち。。。？
Animation Eventがコールされないときもしかしたらこれが原因かもしれない…

# 初めに
割と特殊なシチュエーションだと思います

# 環境
Unity5.6.3p2
Unity2018.1.1f1

# 何が起こったのか？
単一のアニメーションのタイムライン上に複数のイベントを追加しているにも関わらず一部のイベントが呼ばれなかった

# 状況
▼こういう感じでアニメーションイベントを複数用意し…
![AnimationEvent002.PNG](https://qiita-image-store.s3.amazonaws.com/0/64974/5a27b1c7-8d6d-6bdd-b8f5-2abe1c7e1ddb.png)
▼0:25に設定したイベント
![eventsetting001.PNG](https://qiita-image-store.s3.amazonaws.com/0/64974/42dac1d5-6c08-1388-1f89-c413b461b52c.png)
▼0:40に設定したイベント
![eventsetting002.PNG](https://qiita-image-store.s3.amazonaws.com/0/64974/608411ba-26d6-d5ec-1d60-f46d1d6fc8a7.png)

▼ログ確認用イベントスクリプト

```csharp:EventLogger.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class EventLogger : MonoBehaviour {

    public void PushLog(int val)
    {
        Debug.LogFormat("イベント発生！:{0}", val);
    }
}
```

てな感じでアタッチしておくと…
▼予想
![result002.PNG](https://qiita-image-store.s3.amazonaws.com/0/64974/359dac3c-bfca-9a92-ef6e-1846ee8a0dfa.png)
という出力が本来望ましい。。。はずなのだが…

▼現実
![result003.PNG](https://qiita-image-store.s3.amazonaws.com/0/64974/445127cc-ea3b-1f1d-a357-ebe496fadbb0.png)
という出力結果になり「0:25にセットしたイベントどこいった」状態になることがあった。


# 原因
根本の原因としては、
**【対象のアニメーション.animのm_Eventsが時系列順に並んでいなかった】**
というのが真相っぽいです。
これを引き起こした要因としては、
**【AssetStoreにて販売されているとあるイベント設定拡張アセット】**
の利用によるものでした。

▼上記の現実の結果が出力された際の.anim
![AnimInside001.PNG](https://qiita-image-store.s3.amazonaws.com/0/64974/c172e80d-b7bc-26c4-c462-b9219b314a42.png)

パラメータの名前を覗いてもらうと上記のエディタ越しのものと対応しているのがわかるかと思いますが、
注目してほしいのはtimeの値。
上が0.6666667に対してその下が0.41666666。これが本来は…

▼こうあるのが正しい（実際にエディタ搭載のアニメーションウィンドウから設定を行うとこの結果になる）
![AnimInside002.PNG](https://qiita-image-store.s3.amazonaws.com/0/64974/6f0504ca-59fb-1ad1-1a23-a596d5c5d5e7.png)


# 対処法
- エディタ搭載のアニメーションウィンドウでいずれかのイベントのフレームをずらして戻す

これを行うことでイベントに対してソートが行われるようです。
（まぁ、搭載のやつはイベントの選択コントロールが小さすぎてｸｯｿイライラするので、使ってるアセットのコードにソート機能を追加してぇなという気持ちがある…）

# 最後に
皆様もエディタ拡張系アセットを使う場合はこの手のトラップにお気をつけください…
第11話 ミルズ関数

この記事は[仮面ライダービルドの数式](https://qiita.com/izmktr/items/e26a624e79bce3edccc9)の第11話です。

```math
⌊1.30637…^{3^2} ⌋=11
```

ミルズ関数です。
この、1.30637…という値はミルズ定数と呼ばれます。

ミルズ関数はこんな形をした関数です。

```math
M(n)=⌊1.30637…^{3^n} ⌋
```

ちょっと変な形の括弧は床関数というもので、小数点以下を切り捨てるものです。
そしてこのミルズ関数はnがどんな自然数でも素数になります。

```math
\begin{align}
M(1)&=2\\
M(2)&=11\\
M(3)&=1361\\
M(4)&=2521008887\\
M(5)&=16022236204009818131831320183\\
\end{align}
```

急激に数が大きくなりますね。
なお、無限に素数を求めることが出来る関数というのは知られてませんので、
ミルズ関数が大きな素数を簡単に求められる関数"だとしたら"、とても良い関数です。

ミルズ関数は素数を無限に求められる関数ではありません。
これの秘密はミルズ定数にあり、ミルズ関数が素数を常に返すように調整して計算された値です。

ミルズ関数は次の式のこういう感じで各値を確定していきます。

```math
M(n)^3 \le M(n+1) < (M(n)+1)^3 \\
```

例を出してみます。

```math
2^3 \le M(2) < 3^3, \ M(2)= 11\\
11^3 \le M(3) < 12^3, \ M(3)=1361
```

ですから、任意の自然数nで以下の式を満たす素数Pが常にある、ということを意味する関数です。

```math
n^3 \le P < (n+1)^3
```

例を出すと100000だと、+1000以内に素数がある、という意味になり、結構ガバガバです。
ちなみに、素数定理を使うと、平均になりますが、ln(100000)≒11.5 以内に素数がある、となります。
平均を確実に存在する、にするために、この数に係数を加えることになりますが、
ずっと少ない数であることは確かでしょう。
create-react-app が使えないとき

最初に結論

`$ npm config set prefix /usr/local`
`$ npm install -g create-react-app`
`$ create-react-app my-app`
 
これで解消した！

最近npmのバージョンが上がらなくなり、、、インストールしても上がらなくなり。。。

とんでもないことが起きてしまったと思い！

心機一転、完全リスタートをするため一度nodeをすべてアンインストールしてnpmを入れ直してみたため、これまで使えていた `create-react-app` が使えなくなっているではないか！

ということに気づいた先ほど。。。

そのため上で触れている方法で直した。

以上
まだ長々しいコマンド打ってるの?git編(gitconfig)

#はじめに
gitをコマンドで扱う人向けの記事です。
だいたいコマンドを使い始めて一ヶ月くらいたつと打つのが、かったるくなってきます。。。

例
`git commit`
`git checkout -b`
`git stash apply`

ながくないですか。。?

で、今回の記事は、これを
`g ci`
`g chb`
`g ssap`

に短縮して楽しましょうという方法です。
#gitconfig

すぐコピペで使えるように最初に上げておきます。

gitconfig は mac では デフォルトでは`~/.gitconfig`にあります。
このファイルを編集して、保存すれば設定が反映されます。無ければ作成しましょう。

何で`git commit`が`g ci`なの？、`g cm`でしょていう人は、自分好みに変えちゃってくださいまし。

以下のファイルは、こちらにも上がっています。
https://github.com/kou0123/dotfiles

```configuration:~/.gitconfig
[alias]
	#alias
	as = !git config --get-regexp alias
	#diff
	d = diff
	d1 = diff HEAD~
	d2 = diff HEAD~~
	dc = diff --cached
	#commit
	ci = commit
	cia = commit -amend
	cimix = commit --amend --no-edit
	cim = commit -m
	#push
	ps = push
	#pull
	pl = pull
	plr = pull --rebase
	#reset
	re = reset
	rehe = reset HEAD
	reha = reset --hard
	res = reset --soft
	#log
	l = log
	ls = log --stat
	lo = log --oneline
	#show
	sh = show
	#stash
	ss = stash
	ssap = stash apply
	sspp = stash pop
	ssl = stash list
	sssh = stash show
	#status　  
	st = status
	#checkout
	ch = checkout
	chb = checkout -b
	#branch
	br = branch
	#add
	ad = add
	ada = add .

	[mergetool "vscode"]
	cmd = code --wait $MERGED
	[diff]
	tool = vscode
	[difftool "vscode"]
    cmd = code --wait --diff $LOCAL $REMOTE
```

```config:~/.bashrc
alias g='git'
```

## 各機能説明
### 基本編
`~/.gitconfig`にエイリアスを設定する事によって、`git branch checkout` が `git chb` で打つことができます。

さらに`~/.bashrc`に `alias g='git'`をかくと、`g chb`まで短縮することができます。こちらも無ければ作成しましょう。`source ~/.bashrc`で設定反映させることをお忘れなく。

余談ですが、

```config:~/.bashrc
alias g='git'
alias re = 'source ~/.bashrc'
```

こちらも便利ですよ。

### alias
- 自分が設定したエイリアス情報を確認できます。自分の定めたエイリアス何だっけ？がよくあるので。

```configuration
as = !git config --get-regexp alias
```

```console:cmd
g as

alias.d diff
alias.d1 diff HEAD~
alias.d2 diff HEAD~~
alias.dc diff --cached

```

### diff
- addしたファイルのdiffを確認できます。

```configuration
dc = diff --cached
```

- HEADからn番目のコミットとの差分を確認できます。

```configuration
d1 = diff HEAD~
d2 = diff HEAD~~
```

### commit
- 直前のcommitに、addしたファイルを混ぜる。これ地味に便利です。
- commitし忘れたファイルや微修正したファイルに使用してみてください。

```configuration
cimix = commit --amend --no-edit
```  

### log

- `g ls` は 編集したファイルを含んだコミット履歴の表示です。
- `g lo` は コミットメッセージのみのコミット履歴の表示です。 

```configuration
ls = log --stat
lo = log --oneline
```

### stash
- `stash` と `stash pop or apply`はコンビでよく使うので、短縮させています。 

```configuration
ss = stash
sspp = stash pop
ssap = stash apply
```

### add
- `add -A or .` もよく使うので、短縮させています。よく使います。

```configuration
ada = add .
```

### difftool
- difftoolをvscodeにすることができます。`git difftool`で使えます。
- winmergeをdifftoolにするよりもおすすめです。

```
[mergetool "vscode"]
cmd = code --wait $MERGED
[diff]
tool = vscode
[difftool "vscode"]
cmd = code --wait --diff $LOCAL $REMOTE
Ubuntu16.04以降でsystemdを使ってforeverを自動起動する

# やりたいこと
Ubuntuが再起動等した際にウェブサーバーを自動起動したいので、foreverコマンドが勝手に走るようにしたい。
AWSやAzureでは、トラブル等があると予告なくインスタンスを再起動することがあるので自動起動設定しておかないとダメだよとAzureの講師の人に言われたので対処する。

# Ubuntu16.04にて自動起動
Ubuntu14.04まではSysVinitが使われていたようだが、Ubuntu16.04からはsystemdになったようで、systemdを使って自動起動設定を行う。

# 設定
基本的には以下のURLの通りに実施すれば良いが、落とし穴もあったので順に書いていく。
https://askubuntu.com/a/895333

### serviceの作成
`/etc/systemd/system/forever.service`を以下の内容で作成。

```
[Unit]
Description=forever service
After=network.target

[Service]
ExecStart=/home/george/.npm-global/bin/forever start /home/ubuntu/server/bin/www
ExecStop=/home/george/.npm-global/bin/forever stop /home/ubuntu/server/bin/www
Restart=always
RestartSec=10
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=forever-example

[Install]
WantedBy=multi-user.target
```

ExecStartとExecStopの内容は、`which forever`等実行して環境に合わせて変更する。

### serviceの自動起動設定
以下のコマンドを実行し、登録したサービスを実行&自動実行設定する。

```
sudo systemctl start forever.service
sudo systemctl enable forever.service
```

変だと思ったら`/var/log/syslog`を見るとログが出ている。


### クラッシュの修正
ただし、この通りに実行すると、自動起動後に

```
error: Forever detected script was killed by signal: SIGKILL
```

というログとともにforeverが殺されたので、以下を追加しないといけない。

```
Type=forking
```

### 環境変数の設定
forever実行時に`NODE_ENV=production`の環境変数を付与するために、以下も追加する。

```
Environment="NODE_ENV=production"
```

### 最終型
上記を踏まえて、サービスの設定ファイルは以下とする。

```
[Unit]
Description=forever service
After=network.target

[Service]
Type=forking
Environment="NODE_ENV=production"
ExecStart=/home/george/.npm-global/bin/forever start /home/ubuntu/server/bin/www
ExecStop=/home/george/.npm-global/bin/forever stop /home/ubuntu/server/bin/www
Restart=always
RestartSec=10
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=forever-example

[Install]
WantedBy=multi-user.target
```

自動起動を有効にする。

```
sudo systemctl start myforever.service
sudo systemctl enable myforever.service
```

あとは、以下コマンドを実行して状態を確認する。

```
systemctl status forever.service
```

また、以下コマンドにて再起動して、ちゃんとサーバー立ち上がれば間違いない。

```
sudo shutdown -r now
```
GASのログ取るいい感じのライブラリ作った

# 使った感じ
```js
var logging = Logging.init("1_lR8I0LKuuD1006BWgxdaea1iYsr_15YyB8cLIMNLA0")
logging.log("hey");
```
ssのid指定してインスタンス作成。
このコードでしたの画像の感じになる

![スクリーンショット 2018-06-06 15.09.21.png](https://qiita-image-store.s3.amazonaws.com/0/225105/b946f524-1ce8-7cd7-faf8-d6a39830f3e3.png)

log()が呼べれたときだけ1日毎のシートを自動作成している

# ソースコード
```js
function init(spreadsheetId) {
  return new Logging(spreadsheetId);
}

(function(global){
  var Logging = (function() {

    /**
     * コンストラクタ
     *
     * @param string spreadsheetId ログの出力先シートId
     */
    function Logging(spreadsheetId){
      this.spreadsheetId = spreadsheetId;
    }
    
     /**
     * タイムスタンプ取得
     */
    function _getTimestamp() {
      var date = new Date();
      return date.getFullYear() + '-' + ('0'+(date.getMonth() + 1)).slice(-2) + '-' + ('0'+date.getDate()).slice(-2)
      + 'T' + ('0'+date.getHours()).slice(-2) + ':' + ('0'+date.getMinutes()).slice(-2) + ':' + ('0'+date.getSeconds()).slice(-2)
      + '.' + ('00'+date.getMilliseconds()).slice(-3);
    }
    
    /**
     * 2018/01/01の形で日付の文字列を返す
     */
    function _getTodayString() {
      var d = new Date();
      var month = '' + (d.getMonth() + 1);
      var day = '' + d.getDate();
      var year = d.getFullYear();
      
      if (month.length < 2) month = '0' + month;
      if (day.length < 2) day = '0' + day;
      
      return [year, month, day].join('/');
    }
    
    /**
     * 今日の日付のシート作成
     */
    function createTodaySheet(id){
      var ss = SpreadsheetApp.openById(id);
      var newSheetName = _getTodayString();
      return ss.insertSheet(newSheetName);
    }
    
    /**
     * ログ出力
     *
     * @param string msg ログテキスト
     */
    Logging.prototype.log = function(msg) {

      // 今日の日付の出力先シートをidから検索して取得、なければ新規作成
      var objectSS = SpreadsheetApp.openById(this.spreadsheetId);
      var objectSheets = objectSS.getSheets();
      var sheetName = _getTodayString();
      var sheet;
      objectSheets.forEach(function(objectSheet){
        if(sheetName == objectSheet.getName()){
          sheet = objectSheet;
        }
      })
      if(!sheet){
        sheet = createTodaySheet(this.spreadsheetId);
      }
      
      // シートの一番下にタイムスタンプと内容の配列を入れる
      var logArray = [_getTimestamp(),msg]
      
      sheet.appendRow(logArray);
    }

    return Logging;
  })();
  
  global.Logging = Logging;
  
})(this);
```

# 使い方
1. リソース->ライブラリから`Mn5_YFJdaIQ2OCoZzE6_gRiVeGV5IAGtZ`のキーを指定して、名前をLoggingにする。
2. コードの上の方でインスタンス作成

```
var logging = Logging.init(spreadsheetId)
```

gasのコード毎にログ用のスプレッドシートを作成しているのを想定

3. あとは

```
logging.log(文字列)
```

でlog取れる！
Git でパーミッションを保存する

windows の git を利用していて push する際に linux のパーミションを設定したい。

commit 時にパーミションの変更をしない場合

```
git config core.filemode false
```

個別に設定したい場合

```
git update-index --add --chmod=+x hogehoge.sh
```

で指定する。
Ubuntu 18.04 LTS Serverの環境構築メモ

# 1. ISOファイルダウンロード
https://www.ubuntu.com/server
"Download"をクリック

# 2. DVD or USBに書き込み

# 3. インストール
手順に従い、9項目を入力

# 4. ログイン
3.で設定したユーザでログイン。
IPアドレスを確認

```bash
$ ifconfig
```

# 5. ターミナルソフトでssh接続
4.確認したIPアドレスにsshで接続。

とりあえずここまでで使える状態にはなりました。（続きはそのうち更新します）

# 参考
https://tutorials.ubuntu.com/tutorial/tutorial-install-ubuntu-server
mysqlの情報確認コマンド

mysqlに関するコマンドを毎回それぞれを調べて使っていたので、『ここを見れば良い！』って感じで、完全自分用にまとめてみました。


■mysqlのサービスに入るコマンド

```
mysql -u root -p
```

繋がらない場合は以下のコマンドで起動してあげる。

```
mysql-ctl start
```

■データベースの情報確認コマンド
現在存在しているデータベースが確認できます。

```
show databases;
```

```
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| laravel            |
| mysql              |
| performance_schema |
| phpmyadmin         |
| sys                |
+--------------------+
6 rows in set (0.01 sec)
```

■テーブルの情報確認コマンド
選択したデータベースのテーブルが確認できます。

```
show tables from データベース名;
```

```
mysql> show tables from laravel;
+-------------------+
| Tables_in_laravel |
+-------------------+
| migrations        |
| password_resets   |
| posts             |
| users             |
+-------------------+
4 rows in set (0.00 sec)
```

■カラム（項目）の情報確認コマンド
選択したテーブルのカラム情報が確認できます。

```
SHOW COLUMNS FROM テーブル名 FROM データベース名;
```


```
mysql> SHOW COLUMNS FROM posts FROM laravel;                                                                                             
+------------+------------------+------+-----+---------+----------------+
| Field      | Type             | Null | Key | Default | Extra          |
+------------+------------------+------+-----+---------+----------------+
| id         | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| title      | varchar(255)     | NO   |     | NULL    |                |
| body       | text             | NO   |     | NULL    |                |
| created_at | timestamp        | YES  |     | NULL    |                |
| updated_at | timestamp        | YES  |     | NULL    |                |
+------------+------------------+------+-----+---------+----------------+
5 rows in set (0.03 sec)
```

■データベースの中に入るコマンド
データベースの選択をしなくても良くなります。

```
USE データベース名;
```

```
mysql> USE laravel;
Database changed
```

■格納データを確認するコマンド
コマンドライン上で対象のテーブルに格納されてるデータを確認できます。
あとは普通のSQLでselect処理が可能なはずです。

```
select * from テーブル名;
```

```
mysql> select * from posts;
+----+---------+--------+---------------------+---------------------+
| id | title   | body   | created_at          | updated_at          |
+----+---------+--------+---------------------+---------------------+
|  1 | title 1 | body 1 | 2018-06-10 01:30:21 | 2018-06-10 01:30:21 |
+----+---------+--------+---------------------+---------------------+
1 row in set (0.00 sec)
```
花イラスト認識AIを作ってみた

# 花イラスト認識AIを作ってみた


## きっかけ

みなさん、これは何の花かな？
長男の幼稚園の宿題で、私は回答できなかった。

![sumire_00001.png](https://qiita-image-store.s3.amazonaws.com/0/153042/e4da8141-084b-eebf-e73c-c37c0ac8b91e.png)


花認識アプリはあるかは探してみたが、
写真はともかく、イラストを認識する良いアプリが見つからなかった

で、自作してみた

## こんな感じ

![flower01.png](https://qiita-image-store.s3.amazonaws.com/0/153042/eb2d05a8-d816-9170-91b2-47c8db1555c4.png)

ちなみに最初の花は「すみれ」だった

## 実現の仕方

* keras、tensorflowの基本画像認識のソースコードを参考[1]
* 花のイラストを200ほど枚収集
  * あじさい、すみれ、すいせん、さくら
* 認識精度向上のため ResNetモデルを利用
  * 正解率69% 通常のCNN(Convolutional Neural Network) [2]
  * 正解率87% ResNetの場合(Residual Network) [3]
* 訓練済みのモデルを利用しrest apiを作成 (python flask)
* フロントエンドはreactで作成

## ソースコード

[github](https://github.com/thunderz99/keras_flower)

### 前提

* python3 anaconda インストール済み
* tensorflow インストール済み
* keras インストール済み
* npm インストール済み
* vscode (オプション)

### web appを立ち上げる

```shell
$ cd ./keras_flower/webapp
$ python3 image_train.py
$ python3 image_web.py
$ open http://localhost:5000
```

### modelを訓練する

```shell
$ python3 image_train.py
# 15分ほど掛かるかも
```

以下の訓練用データは自分で用意してください
（画像は権利があるので）

```shell
data/train
data/test
```


## Dockerで動かす

```shell
$ docker build -t keras_flower .
$ docker run -d -p 5000:5000 --name=keras_flower keras_flower
$ open http://localhost:5000

```


## 参考

* [1] <https://github.com/keras-team/keras/blob/master/examples/README.md#vision-models-examples>
* [2] <https://github.com/keras-team/keras/blob/master/examples/mnist_cnn.py>
* [3] <https://github.com/keras-team/keras/blob/master/examples/cifar10_resnet.py>
Heroku について

※ 雑まとめなので追記修正予定。。。:head_bandage:

#参考
>
[Heroku入門 | ドットインストール](https://dotinstall.com/lessons/basic_heroku)
[Heroku コマンド・設定 メモメモ](https://qiita.com/pugiemonn/items/0e69b7a29a384b356e65)
[Heroku初心者がHello, Herokuをしてみる](https://qiita.com/Arashi/items/b2f2e01259238235e187)

# インストール
homebrewからだと簡単　[Heroku | Download and install](https://devcenter.heroku.com/articles/heroku-cli#download-and-install)

```zsh
brew install heroku/brew/heroku
```

#Dyno
仮想サーバー。
負荷が増えた時にDynoを増やして対応したりする。
（無料の範囲で使用できるのは1つまで。）

```zsh
#2Dynoに増やす
heroku ps:scale web=2
```

#Addon
Herokuには色々なアドオンが用意されており、インストールさせることで
容易に機能を追加することができる（アドオン利用にはクレジットカード登録が必要）

```zsh
#確認
heroku addons
#アドオン追加
heroku addons:add アドオン名
```

[Heroku Postgres](https://qiita.com/ntkgcj/private/9e812220881d671b6bff)

#静的ファイルコンテンツの扱い
`Javascript``CSS``画像ファイル`などのコンテンツは
基本的に永続保存されないので外部サーバーなどに置いて、それを読込む設定が必要になってくる。

- 画像アップロード機能などは[Cloudinary](https://cloudinary.com)使うとか

[Rails + cloudinary + carrier wave 画像アップロードアプリのテスト](https://qiita.com/ntkgcj/items/6ca19c9decf929714970)
Unity+VSCode環境覚書 (ついでにEmacsバインディングも)


自分へのメモ

# 環境
- Windows 10
- Unity 2018.1.1f1
- Visual Studio Code 1.24.0

# 作業
## VSCodeをインストール・設定
適当にインストール。
VSCodeでUnityのメタファイルまで見えると邪魔くさいので、設定で消す。
![conf.PNG](https://qiita-image-store.s3.amazonaws.com/0/162289/1bc3e50a-55df-4b6e-f16a-8326b97a9fe5.png)

## VSCodeへプラグインを入れる
以下のように入れた。
![plugin.PNG](https://qiita-image-store.s3.amazonaws.com/0/162289/dcaf5e27-08fd-77cf-9e4d-30e5fabc7369.png)

## Unity側の設定:VSCode.cs
- [Unity Visual Studio Code Integration](https://github.com/dotBunny/VSCode/)からVSCode.csを入手
- UnityプロジェクトのAsset以下にEditorディレクトリを作り、その中にVSCode.csを入れる

## Unity側の設定:Preferences
以下のように設定。チェックボックスをいじるだけ。
![pref.PNG](https://qiita-image-store.s3.amazonaws.com/0/162289/fbcb991c-053d-0c1f-319e-510a152f916c.png)

これでPreference->Extenal Tools->External Script Edior にVSCodeが出てくるはず。
あとはAssets->Open C# project In Codeで。

# 隘路
一回引っかかった。上記設定ではVSCodeのパスが間違っていることがある。
Preference->VS Code->VS Code PathにインストールしたVSCodeのcode.cmdを設定してForce Update。
(今回の正しいパスは C:/Program Files/Microsoft VS Code/bin/code.cmd)
multiprocessingで処理を高速化(Python)

# 環境
Mac
python3.6

# 課題
Watsonでたくさん画像認識リクエストを飛ばして、結果をあれこれいじって返す、的なことをしようとしたら、一枚一枚認識するのに時間がかかった
（１、２秒×枚数　くらいのイメージ）

# 解決方法
APIのリクエストを一気に送れないかと調べてmultiprocessingというライブラリに行き着く
結果、処理が早くなったので忘れないようにメモ

```py

#関係するところだけ抜き出し

from multiprocessing import Pool
from multiprocessing import Process

p = Pool(len(items)) # 最大プロセス数
result_list = p.map(vr.url_recognize, items) #プロセス実行  (関数名,引数)

```
・結果はリストで帰ってきます
・poolでプロセス数指定して、mapで実行するイメージ
Xcode 10の便利な新機能

## はじめに
Xcode 10のβ版で新機能を試してみました。
便利な機能をいくつか紹介します。

## 開発環境
環境は、以下の通りです。

|Category|Version|
|:-----:|:-----:|
|OS|10.13.5|
|Xcode|10.0 beta (10L176w)|

## Storyboard objects library
StoryboardでObjectを検索する方法が変わりました。
画面右上の「Objects Library」からObjectを検索し、使用することができます。

Storyboardを開いている状態で以下のショートカットキーを入力することで簡単に「Objects Library」を開くことができます。
**command + shift + 「l」**

![xcode10_storyboard.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/103695/5c596f1b-ce06-d386-4e9a-ff8560d318d1.gif)

## Code snippets
コードエディタ上で以下のショートカットキーを入力することでコードスニペットを使用することができます。
**command + shift + 「l」**
（Storyboardの「Objects Library」と同じショートカットキーです。）

![snippets.gif](https://qiita-image-store.s3.amazonaws.com/0/103695/af418bce-e9c3-c7d2-d875-708ebf02f51e.gif)


## Multi-cursor editing
複数のコードをすばやく編集することができるようになりました。
複数のメソッドを纏めてprivateにしたり、複数のメソッド名を纏めてコピーすることもできます。

- **shift + control + クリック**
- **shift + control + 「↑」**
- **shift + control + 「↓」**
- **option + ドラッグ**

![multi.gif](https://qiita-image-store.s3.amazonaws.com/0/103695/6f404fdc-ba9b-de91-333a-5d73e205ec74.gif)

![multi_2.gif](https://qiita-image-store.s3.amazonaws.com/0/103695/af8d50aa-2e3e-c2ca-21d7-049dd55680e9.gif)

## さいごに
Xcode 10の新機能を活用することで開発効率が上がりそうですね。
[開発環境]Ruby/Rails/MySQLをインストールする

# 1.Xcodeのインストール
Mac App StoreからXcodeをインストール
（Xcodeのコマンドラインツールが必要）


#### ＊Xcodeはかなりのサイズ（５GB超え）なので通信環境がいい場所で、時間があるときにダウンロードしましょう。

ダウンロード後、以下のコマンドをターミナルに打っておきましょう。
Xcodeの初期設定みたいなものです。


```bash:ダウンロード後、以下のコマンドをターミナルで実行
xcode-select –install
```

# ２.Homebrewをインストール
mac専用のパッケージマネージャー、[Homebrew](https://brew.sh/index_ja.html)をインストールする。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/118229/8ff83d7b-bd7f-72db-58e3-3f34c8d84248.png)

# 3.rbenvのインストール

Rubyのバージョン管理にrbenvをインストールする。
Homebrew経由でrbenvとruby-buildをインストール。

```bash:コマンド
brew install rbenv ruby-build
```

# 4.Rubyのインストール

rbenvを使って、Rubyをインストール。
まずは、インストール可能なRubyのバージョン一覧を取得します。

```bash:コマンド
rbenv install -l
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/118229/b8fd8085-d86d-8915-4993-16367daa93c0.png)

```bash:インストール前にHomebrewとruby-buildを最新版にしておく。
brew update
brew upgrade ruby-build
```

Rubyのインストール

```bash:プロジェクトに合わせてバーションをインストールする。
rbenv install 2.4.1
```

```bash:インストール後に関連ファイルの更新
rbenv rehash
```
rbenvでは複数のバージョンをインストールして切り替えることが可能。

```bash:バージョンを指定
rbenv global 2.4.1 # global：システム全体で使用するバージョン
rbenv local 2.4.1 # local：個別のプロジェクトディレクトリでrubyのバージョンを使用する場合に指定
```

```bash:バージョンが設定されているか確認
rbenv versions
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/118229/5372768c-af8c-2d07-ffac-558fe4c772a8.png)
(左に*マークがついているものがグローバルで使用中のバージョン）

```bash:バージョンを確認
ruby -v
```

[Rubyのバージョンが切り替わらない時の対処法！](https://qiita.com/opiyo_taku/items/3312a75d5916f6cd32b1)

# 5.Bundlerのインストール

```bash:BundlerはRailsで使うRubyライブラリー管理ツール
gem install bundler
```

# 6.Railsのインストール

```bash:Railsのインストール（最新version）
gem install rails
```

```bash:補足情報-version指定
gem i -v 5.1.4 rails #iはinstallの略
 
gem install rails --version="4.2.1" #指定バージョンをインストール
gem install rails --version="~>4.2" #4.X系の最新バージョンをインストール
```

```bash:使用できるバージョン一覧を確認
gem list rails

*** LOCAL GEMS ***
rails (5.2.0, 5.1.6, 5.1.4, 5.1.3, 5.1.2, 5.0.6, 5.0.3)
```

```bash:バージョンを確認
rails -v
```

# 6.MySQLのインストール

[Homebrew で MySQL のバージョンを指定してインストール](http://ebc-2in2crc.hatenablog.jp/entry/2017/10/05/221037)

```bash:MySQLのインストール
brew install mysql
```

```bash:インストールされているか確認
mysql --version
```
5.7系がインストールされているのが確認できる
![image.png](https://qiita-image-store.s3.amazonaws.com/0/118229/b5ca1ff9-dc19-ed70-a6f7-6ffc9cb9f06e.png)

```bash:MySQLの起動
mysql.server start

Starting MySQL
. SUCCESS! 
```
【Jenkins備忘録】Python自動テスト環境構築④プロジェクト作成編

・Jenkinsの初期設定が完了したところからスタート。

### プロジェクトの作成
・ダッシュボードの左上段「New Item」を押下する。

<img src="https://qiita-image-store.s3.amazonaws.com/0/180939/149104e8-9afa-ed3f-a446-8c7388627e42.png">

・下図の画面に遷移するので、プロジェクトの名前を入力して「Freestyle project」を選択して「OK」ボタンを押下する。

<img src="https://qiita-image-store.s3.amazonaws.com/0/180939/099cfe3b-16e7-de72-fbcc-941ea2992055.png">

・プロジェクトの詳細設定画面に遷移するので、はじめにPythonのユニットテストディレクトリをJenkinsのワークスペースに設定する。
　下図の右端にある「Advanced...」ボタンを押下する。

<img src="https://qiita-image-store.s3.amazonaws.com/0/180939/12260b65-75e6-2c33-2e2f-dcdb1ed44502.png">

・プロジェクトの詳細設定画面に「Use custom workspace」の設定箇所が表示されるのでチェックをつけて、
　入力項目にはPythonテスト用ファイルがあるディレクトリを入力する。

<img src="https://qiita-image-store.s3.amazonaws.com/0/180939/9bc678f6-6e9a-5297-0edb-bed477c38dd7.png">

・ワークスペースの設定を入力後、「Build」項目のセレクトボックスから「Execute shell」を選択して、入力項目に「python test_calc.py」と入力後、
　「Apply」ボタンと「Save」ボタンを押下する。

<img src="https://qiita-image-store.s3.amazonaws.com/0/180939/c5c4b299-a112-4f61-e9a4-f814214ec489.png">

・「Save」ボタン押下後、ユニットテストプロジェクトのトップ画面に遷移するので、左端の「Build Now」を押下する。

<img src="https://qiita-image-store.s3.amazonaws.com/0/180939/00071801-13a0-ed78-c220-039435d58e72.png">

・「Build Now」を押下後、左下に「#1」と表示されるので、「#1」を押下する。

<img src="https://qiita-image-store.s3.amazonaws.com/0/180939/257a856c-ad11-dc0e-4250-1bbb1d1fa5be.png">

・「#1」押下後、ビルド結果の管理画面に遷移するので、左端の「Console Output」を押下する。

<img src="https://qiita-image-store.s3.amazonaws.com/0/180939/8e0d40c1-5d6a-3abb-b2da-0fd4d46b0afc.png">

・コンソールの詳細画面に遷移する。端末から実行した結果と同じ結果が表示される。

<img src="https://qiita-image-store.s3.amazonaws.com/0/180939/8aa59ded-7ecf-1552-48cc-696fb32533ce.png">

jenkinsを使用した基本的な自動テストは以上で完了。
Azure Vision APIで画像説明生成を遊んでみた

# Azure Vision AIを遊んでみた

## 背景

AzureはAIの機能強化をどんどんしている。

中に面白そうなのをピックアップして試した。

## こんな感じ

![caption01.png](https://qiita-image-store.s3.amazonaws.com/0/153042/131595cf-1782-78e7-bf51-d19f4658e88c.png)

[動くデモ](https://image-caption.herokuapp.com/)

herokuなので、sleepから起動して時間が掛かる場合がある

## 実現の仕方

* Azureのフリーアカウントを作成
* Vision APIのキーを発行
* pythonで画像をVision APIにポスト
* 現状の結果が英語だけなので、Translation APIで日本語をゲット

## LTまとめ

* 汎用的なAIは結構API化されて、開発者なら誰でも使える
  * 自分のノートパソコンで訓練しようとしたら、１週間強かかる。。
* 独自なニーズのAIは、自分で訓練するしかない

## ソースコード

[github](https://github.com/thunderz99/azure_image_caption)

### 起動の仕方

```shell
$ cd ./azure_image_caption/webapp

$ export AZURE_VISION_API_KEY=<your api key>

$ export AZURE_TRANSLATION_API_KEY=<your api key>

$ python3 web.py

$ open http://localhost:5000

```

## Dockerで動かす

```shell
$ docker build -t image_caption .

# your key set in .env file
$ docker run -d -p 5000:5000 --name=image_caption --env-file .env image_caption
$ open http://localhost:5000
```

## 参考

* [1] <https://docs.microsoft.com/en-us/azure/cognitive-services/Computer-vision/Quickstarts/python-analyze>

## License

MIT
kotlin + コンソールでリバーシ

リバーシー≒オセロ　
オセロと大人の事情で言えないそうです
ですのでリバーシー

アンドロイドスタジオを入れているPCは、何とか動くレベルで
エミュレータを動かすとかなりストレスのかかる環境

ロジックを確認する時には、アンドロイドスタジオを使はないでコンソールに出力してデバックしてました

```
    fun boardDisp() {
   		println("   a b c d e f g h")
        println("   -----------------")
        for( y : Int in 0..7) {
            print((y+1).toString() + "|")
            for( x : Int in 0..7) {
                var z : String = when(boardStatus.banStatus[x][y]) {
                    GAME_STATUS.MASU_STATUS.READY -> " 0"
                    GAME_STATUS.MASU_STATUS.WHITE -> " 1"
                    GAME_STATUS.MASU_STATUS.BLACK -> " 2"
                    else -> " ."
                }
                print(z)
            }
            println("")
        }
    }
```

こんなコードを使って
![osero.png](https://qiita-image-store.s3.amazonaws.com/0/258658/41dc0c32-a034-be9f-50e1-52aa805e6e50.png)

こんな感じで表紙させて、デバックしていました

１マスのステータスを

```
    enum class  MASU_STATUS( val indxVal : Int) {
        NORMAL(0),         // 何でもなし
        READY(1),          // 置いていい
        BLACK(2),          // 黒
        WHITE(3),          // 白
        OUT_RANGE(4),
    }
```

の５種類で表し、盤は８X８の配列して

```
    var banStatus  =  Array(8, {Array(8, {MASU_STATUS.NORMAL })})
```

駒から８方向のベクトルを

```
    enum class VECTOR(val intVal : Int ) {
        UP(0),
        RIGHT_UP(1),
        RIGHT(2),
        RIGHT_DOWN(3),
        DOWN(4),
        LEFT_DOWN(5),
        LEFT(6),
        LEFT_UP(7),
    }
```

順番に調べていく
・自駒、敵駒以外の場合はそこで検索終了
・敵駒の場合は、１つ距離を延ばす
・自駒場合、距離は２以上の場合は、敵駒が取れる

このロジックができると後はそれっぽく
それらしいコードは[ここ](github.com/bokufolivora/reversiConsole)に置きました
【UiPath】作業前後のスクリーンショットをExcelシートに貼り付ける

ロボットにアプリケーションへのデータ登録作業をさせる場合、人間が後で作業結果を確認できるよう
作業の前後それぞれのスクリーンショット（画面コピー）を撮って保存する必要があると思います。

よくあるのが、Excelの申請書に沿ってデータ登録させたら
1. PrtScキーでスクリーンショットを撮って
2. Excel申請書ファイル自体にシート追加して
3. Ctrl+Vでシートにスクリーンショット貼り付けて
4. Excel申請書を履歴フォルダに保管
ですが、UiPathは意外とコレに苦戦する！

詳細を説明します。
# 1.UiPathでのスクリーンショットの撮り方
Send HotkeyでPrtScキーを送り込んで終わりでしょ？
じゃないんだよね、Send HotkeyにPrtScが無いから・・・
![PrtSc.png](https://qiita-image-store.s3.amazonaws.com/0/255097/dd1b968d-6931-635a-4841-d6e967e996f1.png)

その代わり、Take Screenshotという直球のアクティビティがあるんだけど
![Take.png](https://qiita-image-store.s3.amazonaws.com/0/255097/9af0d423-f7cc-bd81-e5ad-3d95c3c528a2.png)
これだとクリップボードに保持してくれないのでCtrl+Vで貼り付けられない。
Outputの型は"Image"だから、Save Imageアクティビティで画像ファイルとしてしか保存できない。
Excelに貼り付けたいんだよね…良いやり方がないか調べてみました。

### Invoke Method
一番スマートなのがInvoke Methodで [SendKeys.SendWait メソッド](https://msdn.microsoft.com/ja-jp/library/system.windows.forms.sendkeys.sendwait(v=vs.110).aspx) を呼ぶ方法。
![Invoke.png](https://qiita-image-store.s3.amazonaws.com/0/255097/fd62af61-dab3-45ba-3d8a-9d4c66d23bf2.png)
TargetTypeはSystem.Windows.Forms.SendKeysなので、プルダウンの[Brows For Types...]から検索。
![sendkeys.png](https://qiita-image-store.s3.amazonaws.com/0/255097/478c9a9e-3b3a-fa24-ce28-941910bed568.png)
プロパティのParametersで"{PRTSC}"を指定すれば、PrtScキーを送り込んで
アクティブな（＝最前面の）アプリケーションのスクリーンショットを撮ってくれます。
※画面全体のスクリーンショットが欲しい場合は"^{PRTSC}"のように、先頭に^を付けます。
![param.png](https://qiita-image-store.s3.amazonaws.com/0/255097/67bec091-7f80-6440-8429-e452802cb524.png)

### スクリーンショット取得アプリの利用
Snipping Toolとか、Capture XPとかWinShotとか世の中に山ほどスクリーンショット取得アプリがあるので、
それを起動して撮るのも１つ・・・というかコッチの事例の方が多数派かもしれない。
（プログラマーじゃない人にInvoke Methodを使えよって言ってもね…）

### Take Screenshot + Clipboard.SetImage
hanageroidoさんのアドバイスによる第三の案。
最初にTake Screenshotアクティビティは"Image"を返すだけでクリップボードに入れてくれない
という話をしましたが、だったらClipboard.SetImageでクリップボードに入れてしまえ、というもの。
Invoke methodでTargetType = System.Windows.Forms.Clipboard、MethodName = SetImage
![setimage.png](https://qiita-image-store.s3.amazonaws.com/0/255097/970e0509-1421-c04d-dc6c-78db7eb68df2.png)
パラメータの型はSystem.Drawing.Imageで、ValueにはTake Screenshotから受けたImage変数。
![paramimg.png](https://qiita-image-store.s3.amazonaws.com/0/255097/7a96e5e5-06fc-ff51-db3a-2c43820e4932.png)
これでクリップボードに入るので、Ctrl + Vで貼り付けられるようになりました。

# 2.Excelにシート追加
Add Excel Sheetアクティビティもありそうで無いんだよね…
### Shift + F11でシート追加
ベタですが、Excelのショートカットキーでシート追加。シート名を指定できないのが欠点。
![hotkey2.png](https://qiita-image-store.s3.amazonaws.com/0/255097/c47347ba-a048-2a3c-7e97-43b1cc331339.png)
後はCtrl + Vでスクリーンショットを貼り付けて、Save Workbookでシート保存すれば完了。

### Invoke Method
シート名まで指定して追加したい場合はInvoke Methodで
Excel.WorkbookApplication.SetSheet(String sheetName, Boolean createNew)
を呼ぶ。
![invoke2.png](https://qiita-image-store.s3.amazonaws.com/0/255097/7fa109ad-4cbc-6642-0215-035293458f0b.png)（xlsWorkbookはExcel申請書のWorkbook変数）

Parametersの１つ目はシート名、２つ目はTrueにすれば新規シート追加。
![param2.png](https://qiita-image-store.s3.amazonaws.com/0/255097/8f3b66ea-2ad4-41c3-46be-b587c9aabf43.png)
シート追加の後は同様にCtrl+Vして、Save Workbookで保存。

---
今回はここまで。
UiPathは意外と痒いところに手が届かず、Invoke Method頼みなところがあるんだよね…

Continueのように気づいたら追加でアクティビティ実装されてたりすると嬉しいんだけど。
※去年までは「なんでBreakはあるのにContinueが無いんだ！」と世界中でツッコまれてました。
Debugコマンドは万能だ！

# Virtual Box

```
$ brew cask install virtual box
==> Caveats
To install and/or use virtualbox you may need to enable their kernel extension in

  System Preferences → Security & Privacy → General

For more information refer to vendor documentation or the Apple Technical Note:

https://developer.apple.com/library/content/technotes/tn2459/_index.html

==> Satisfying dependencies
==> Downloading https://download.virtualbox.org/virtualbox/5.2.8/VirtualBox-5.2.
######################################################################## 100.0%
==> Verifying checksum for Cask virtualbox
==> Installing Cask virtualbox
==> Running installer for virtualbox; your password may be necessary.
==> Package installers may write to any location; options such as --appdir are i
Password:
==> installer: Package name is Oracle VM VirtualBox
==> installer: Upgrading at base path /
==> installer: The upgrade was successful.
🍺  virtualbox was successfully installed!
$
```

# Free DOS
<img width="694" alt="debug1.png" src="https://qiita-image-store.s3.amazonaws.com/0/51423/d7299060-cbca-24ad-55df-8bb9e2338e59.png">

「CDROM “standard” installer」をダウンロード

# 参考文献・URL
[スクリプト言語しか書けないあなたへ]FreeDOSとdebugコマンドで8086アセンブラ入門
https://qiita.com/usk83/items/c97066c3c663c5007658

＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞
# 文書履歴(document history)
ver. 0.01 初稿 　20180517
ver. 0.02 ありがとう追記　20230513
## 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
####  Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.