OmniAICreator/Qiita-1.07M huggingface dataset:
スポーツをITする（３）簡単なフォームチェック tensoleflow.js

[前回の記事](https://qiita.com/Chishiki/items/e2353007ba0e04d9d330)より、簡単なフォームチェックのロジックを追加してみました。

## ボーン座標のズレ
ブラウザのgetusermediaを使って、TensoleJS posenet を適当にVideoタグで表示すると、映し出された映像に描画するボーン座標にズレが生じます。
これは、縦横比の問題であろうと思われ、試行錯誤の結果、iPhone8の場合、横幅340px、縦幅380pxでズレが最小限に抑えられるようです。以下はズレた例です。

![IMG_0398.jpg](https://qiita-image-store.s3.amazonaws.com/0/74852/b8586d2b-2ba3-bcc4-be9d-79c40514e09c.jpeg)

## フォームチェックのテンプレート
某一流プロゴルファーのボーン座標を写真から取得しました。
ゴルフのアドレス（構え）としては、ちょっとおかしい感じがありますね。
写真を横幅170px、縦380pxにリザイズして、画面上に合うように手作業しました。
![スクリーンショット 2018-11-02 11.25.19.png](https://qiita-image-store.s3.amazonaws.com/0/74852/12f1ee0b-48f9-deba-89d0-0019bbda8ec0.png)

どうやら、少し大きめの画像でないと、誤認識するようです。以下、元画像を横幅を340pxに拡大してボーン座標を取得してみました。少しまともになったかな。
![スクリーンショット 2018-11-02 19.21.26.png](https://qiita-image-store.s3.amazonaws.com/0/74852/5cb09acd-cd80-0479-a142-4bd8169f3b9f.png)


## フォームチェックのロジック
とりあえず最初は簡単な方法で、と思い、
・テンプレートの目と耳以外の１３箇所それぞれの位置と写した映像のそれぞれの位置の距離を測る。
・その距離が１０ピクセル以下なら１、でなければ０とする。
・最大１３箇所中、何箇所が１になっているか、を百分率する。これを一致率としてみる。

estimateSinglePose()を実行している関数poseDetectionFrame()の中にある、poses.forEach(({score, keypoints}) に、判定のロジックを入れます。

```
poses.forEach(({score, keypoints}) => {
    if (score >= minPoseConfidence) {
        if (guiState.output.showPoints) {
            drawKeypoints(keypoints, minPartConfidence, ctx);
        }
        if (guiState.output.showSkeleton) {
            drawSkeleton(keypoints, minPartConfidence, ctx);
        }
        if (guiState.output.showBoundingBox) {
            drawBoundingBox(keypoints, ctx);
        }
    }
    make_video_bone(keypoints) // 追加
});
```

キーポイントを配列に分割します。

```
function make_video_bone(keypoints) {
	for (let i = 0; i < keypoints.length; i++) {
		const keypoint = keypoints[i];
		video_bone[keypoint.part] = keypoint.position;
	}

	if (templates_bone.nose && video_bone.nose) {
		calc_distance(templates_bone, video_bone);
	}
}

```

テンプレートと比較して一致率を計算します。

```
function calc_distance(tb, vb) {
    var cnt = 0;
    var max = 13;

    var temp = Math.sqrt(Math.pow((tb.nose.x - vb.nose.x),2) + Math.pow((tb.nose.y - vb.nose.y),2));
    if (temp < 10) {
        cnt++;
    }
    var temp = Math.sqrt(Math.pow((tb.leftShoulder.x - vb.leftShoulder.x),2) + Math.pow((tb.leftShoulder.y - vb.leftShoulder.y),2));
    if (temp < 10) {
        cnt++;
    }
・・・・・

    var rs = cnt / max * 100;

// 画面上に一致率を表示
    $('.pa').html(Math.round(rs));
}
```
もっといい判定方法は無いかな、と思っています。

## 検証
スマホでは手ブレが激しいので、１３箇所がうまく判定出来ず、常に一致率は０％。
逆に言うと、手ブレがわかるほどスムーズなライブ再生で性能が良い、ということですね。

軸にしてみるとか、もう少しチューニングが必要。
以下、ブルーの線がライブ、赤い線がテンプレート（模範）です。なかなか一致しない。。
![IMG_0402.jpg](https://qiita-image-store.s3.amazonaws.com/0/74852/6bd355b9-8b24-04f1-145c-447168a4e4d5.jpeg)
アメリカでエンジニアとして働くために

どうも、現在アメリカの社会人コースに留学している者です。
アメリカに関係することを発信していきます。自分と同じように、アメリカで働きたいエンジニアの方の役に立てればと。

# バックグラウンド
## 学生時代：
東京の大学で政治を勉強し、5年半かけて卒業しました。
単位が取れず、就職も思うようにいかず留年しました。
大学の最初の２年間はほとんどサークル活動で授業にも出ていませんでした。典型的なダメ文系大学生です。

社会人時代：
2016/4、24歳でSIerとしてキャリアを始めます。
新卒ではJavaの研修を受け、なんとなくJavaが読める程度に。
主な職務内容はQAエンジニア（というとちょっと聞こえがいい）でした。
2017/2（新卒10ヶ月目）、もっとコードを書きたかったのでweb系エンジニアとして転職。
2017/3~2018/2、Androidエンジニアとして初心者から始まり、アーキテクチャに基づいて開発ができるようになる。
2018/3~2018/8、Railsエンジニアとして社内で異動
2018/9、アメリカの大学に留学

# なんで留学しているのか？
もともと海外で働きたいという思いがあり、エンジニアになりました。
海外、特にアメリカで働くにはComputer Scienceの学位が必要です。
しかも、アメリカは現在ビザの発給条件が厳しいので、アメリカで働くには現地の学校を卒業してOPTという就労体験ビザ的なのを取得するのが一番ハードルが低いんです。

また、エンジニアとして働き始めてから自分のプログラミングに関する知識が浅いことがコンプレックスでした。
できる人はメモリがどうとか計算量がどうとか言ってましたが、全く意味不明でした。
それを克服したかったんですね。

そのため留学という選択をしました。
アメリカを選んだのは、大学生の時に1年弱アメリカに語学留学していてその時の楽しかった思い出があったからです。
大学生の時にアメリカじゃないところに行っていたら、おそらくそっちの国に行っていたと思います。

# 今後
今回の留学は１年間のカリキュラムで、それが終わって就職が決まればもう一年ビザがでるというものです。
なので、最長2年、最短１年間の計画です。

こっちでエンジニア経験を積んでから帰国する予定です。

Computer Scienceの授業の内容、就活などについて書いていきます。
（Qiitaだけど技術の話と関係ない。。。）
【python超入門①】～pythonを始めるうえで。Numpy,Scipy触り方編

#はじめに
最近のbuzzワードでよく出てくる、「データサイエンティスト」、「AI」、「ディープラーニング」....
企業もそうした人材の獲得に躍起になっているようですね。最近ではネット広告でもディープラーニングの講座を受けてみませんか～？みたいなものも増えていますね。

この記事の対象者は、これからpythonを勉強してみたい！興味がある！人や、勉強を始めたけどわけがわからん！だれかもう一度基礎を教えて...って人向けに書いています。すべての範囲を網羅しているわけではありません。例えば配列のソートや最大値、最小値の求め方なんかは他の記事やググればすぐ出てきますので、ここではあえて触れません。この記事を読んだ後、他の記事を見て「フムフム。これはあそこで読んだな。あいつはこれのことを言ってたんだな。」と思ってもらえたら本望です。この記事をステップアップのための土台にしてください！
私も勉強してみてつまずいた点も多くありましたので、そんなことも踏まえつつ分かりやすく書いていけたらと思います。どうぞお手柔らかに。

ほんとうはpandasにも触れていくつもりだったのですが、時間と筆者の体力の問題でこの記事ではNumpyとScipyまでになっています（ヒヨワ）。。。みなさんの反応も見つつ今後決めようかなとも思っていますので、ご意見ご指摘どしどしください。（一応表題が超入門①となっているのは続編書きたいからです。）






#データサイエンティスト
昨今、ネットワークの急速な発展でデータの取集・活用が重要視されています。
これらのデータを有効に使い、データから会社の経営に必要な知見を引き出していこう！というのがデータサイエンティストです。しかし、「データサイエンティスト」には明確な定義がなく、対応範囲がかなり広いのでぼんやりとしたイメージしか持たれていないのが現状です。なので最近は自称データサイエンティスト(ドヤァ)がそこら中にいますね...

エセかそうでないかを判別するための一つの基準になるのは、データ分析をするうえで以下の3点の能力がどの程度のレベルにあるか、ですね。
・統計学の知識
・プログラミング力
・数学力
これらのスキルを高い水準で使いこなす人こそが、「データサイエンティスト」だと私は思います。
今はぼんやりしている「データサイエンティスト」ですが、もし目指すのであれば少なくとも自分の中では明確に定義をしておきたいですね。






#環境構築
一言で言います。"習うより慣れろ"です。プログラミング経験者ならわかりますね。そういうことです。
まずは環境構築をすべし。

[機械学習のためのPython環境構築 2018.05](https://qiita.com/k_harada/items/7025c9fb01588ed073f7)
インストール終わったらjupyternotebook開いて始めましょう。



#そもそもなんでpython?
pythonはスクリプト言語で、ライブラリが充実していてすぐに使用できるためコーディングがしやすいのが特徴です。また、データを取得して加工、表にまとめる、グラフに描写などもできます。
JavaやCとはまた違った魅力がありますね。









#python基礎
それでは、おなじみのHello,Worldいきましょうか！(定番)

```python

print("Hello, world !")
```


きましたね。出力はこの一言で済んでしまいます。

次は配列です。

```python
#入力
char = "apple"
char[0]
```
```python
#出力
'a'
```

ここまでよろしいでしょうか。
自分でいろいろ試してみるとスクリプト言語の楽しさを実感できるのではないでしょうか。



#Numpy
基本的な知識について学びます。Numpyは多次元配列を使用する際にインポートして使います。

```python

#Numpyをインポート
import Numpy as np
#配列の作成 
huge = np.array([1,2,3,4,5,6,7,8,9])
huge
```

```python
#出力
array([1,2,3,4,5,6,7,8,9])
```

importした後のas ~でNumpyのあだ名を決めてあげます。それ以降はつけたあだ名でメソッドの呼び出しができます。Numpyはこんなものです。


#Scipy
こいつはちょっと気難しいやつですが、ビビることはありません。強気でいきますよ。
Scipyは主に複雑な計算をするために使うモジュールで、線形代数や固有値固有ベクトル、などを利用する際に使用します。
（懐かしい数3、数Cですが統計の時に用いることもあるんです。。。）
インポートして簡単な計算をしてみましょうか。



```python
import scipy as sp
import scipy.linalg as linalg
from scipy.optimize import minimize_scalar
#配列の作成
huge = np.array([1,2,3],[4,5,6],[7,8,9])

#行列式、逆行列を求める
print('行列式',linalg.det(huge))
print('逆行列',linalg.inv(huge))

```

固有値・固有ベクトルいきますよ

```python
#固有値、固有ベクトル
eig_value,eig_vector = linalg.eig(huge)
print('固有値',eig_value)
print('固有値ベクトル',eig_vector)
```

こんな感じでがっつり数学やっていくのがScipyですね。ほかにも方程式の解求めてくれたりもします。



#おわりに
続編のPandas、matlibplot編はこの記事のフィードバックを基に頑張って書いていきます。
みなさま暖かく見守ってください。
Pythonの標準ライブラリでさくっとAPIサーバとWebサーバを立ち上げる

## 概要

CORS(Cross-Origin Resource Sharing)について動作確認するのに、Pythonの標準ライブラリを利用してAPIサーバとWebサーバを立ち上げてみました。

GitHubにも今回利用したソースをアップしています。
https://github.com/kai-kou/simple_api_and_web_server_python


## 実装

Pythonのバージョンは3.6.6で標準ライブラリのみで検証するので、仮想環境やDockerも利用していません。

```sh
> python --version
Python 3.6.6

> mkdir 任意のディレクトリ
> cd 任意のディレクトリ
> touch app.py
> touch index.html
```

APIサーバの実装です。wsgirefを利用しています。ドキュメントに使用例もあって親切です。ありがたや

21.4. wsgiref — WSGI ユーティリティとリファレンス実装
https://docs.python.jp/3/library/wsgiref.html

アクセスするとJSONを返すだけの実装です。
```Access-Control-Allow-Origin``` を指定しないと、ブラウザさんに```No 'Access-Control-Allow-Origin' header is present on the requested resource.``` って怒られるので注意しましょう(1敗

```python:app.py
from wsgiref.simple_server import make_server

import json


def app(environ, start_response):
  status = '200 OK'
  headers = [
    ('Content-type', 'application/json; charset=utf-8'),
    ('Access-Control-Allow-Origin', '*'),
  ]
  start_response(status, headers)

  return [json.dumps({'message':'hoge'}).encode("utf-8")]

with make_server('', 3000, app) as httpd:
  print("Serving on port 3000...")
  httpd.serve_forever()

```

APIサーバへアクセスするクライアントの実装です。
```XMLHttpRequest``` を利用してAPIサーバにGETして結果をログ出力しています。

```html:index.html
<html>
  <body>
    <script>
      var req = new XMLHttpRequest();
      req.open('GET', 'http://localhost:3000/');
      req.onreadystatechange = function() {
        if (req.readyState == 4 && req.status == 200) {
          console.log(req.responseText);
        }
      };
      req.send(null);
      </script>
  </body>
</html>
```

準備ができたので、サーバを立ち上げてブラウザでアクセスしてみます。
APIとWebサーバとで、別々のコンソールが必要になります。



```sh:APIサーバの立ち上げ
> python app.py
Serving on port 3000...

```

```sh:Webサーバの立ち上げ
> python -m http.server 8080
Serving HTTP on 0.0.0.0 port 8080 (http://0.0.0.0:8080/) ...

```

http://localhost:8080/

<img width="594" alt="スクリーンショット 2018-10-31 13.23.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/48549/97211043-48d3-39c6-b703-03517c9e3afd.png">


はい。
無事に両方立ち上がり、WebサーバからAPIサーバへアクセスできました。


## まとめ

API、Web開発するにも、フレームワークを利用する事が多いですが、シンプルな構成で実装すると、問題が起こった際の切り分けに役立つので、便利です。


## 参考

21.4. wsgiref — WSGI ユーティリティとリファレンス実装
https://docs.python.jp/3/library/wsgiref.html

JavascriptのAjaxについての基本まとめ
https://qiita.com/katsunory/items/9bf9ee49ee5c08bf2b3d
QiitaのTwitter共有がバグってるのでさっそく分析してみる

![バグった共有ボタン](https://screenshotscdn.firefoxusercontent.com/images/c879bd69-a2ac-4ad2-a467-776daa987aac.png)

このツイートボタンを押したら、「`https://twitter.com/share`」のリンクを共有してしまいます。

## 原因?
![hrefにURLが指定されていない](https://i.gyazo.com/d3c96e5bd2e2104ae8ea721e298843c3.png)
hrefに?url=パラメータがありません。

## 修正
Tampermonkeyで。

```javascript
// ==UserScript==
// @name         Twitter fix
// @version      1.0
// @description  Fix twitter link
// @author       apple502j
// @match        https://qiita.com/advent-calendar/*
// ==/UserScript==

window.addEventListener("load", function(){
    for (const item of document.querySelectorAll("a.twitter-share-button")) item.href += "?url=" + item.dataset.url;
});
```
はじめての ASP.Net Core

# ASP.NET Coreを動かすための設定
参考: [ASP.NET Coreを動かすためのIISの構築方法 - Qiita](https://qiita.com/taiga_takahari/items/7809c78393750c42e443#%E3%83%84%E3%83%BC%E3%83%AB%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)

## IISのインストール

### IIS（web サーバー）機能の有効化
  - コントロールパネル > プログラムと機能 を起動し、「Windows の機能の有効化または無効化」を選択
  - ここで、「インターネット インフォメーション サービス」を有効にします。
  - このうち、
    - IIS 管理コンソール
    - ASP.NET 4.x
  - にチェックをつけ、あとは自動的にチェックがON になるままにします。OK ボタンを押すと、Windows に web サーバーの機能が有効になります。

## ASP.NET 状態サービスの機能追加（Window 共通）

- 「管理ツール」の 「サービス」を起動し（「コンピュータの管理」＞「サービスとアプリケーション」＞「サービス」でも可）、「ASP.NET State Service （「ASP.NET 状態サービス」 という表記の場合があります）」をダブルクリック
- 「スタートアップの種類」を「自動」に設定、「開始」ボタンをクリック後、「OK」ボタンをクリック

## ツールのインストール

- [.NET Core SDK](https://www.microsoft.com/net/learn/dotnet/hello-world-tutorial#windowscmd)
- [ASP.NET Core Module](https://aka.ms/dotnetcore_windowshosting_1_1_0)
  - ※先に.NET Core SDKをインストールすること
- インストール後に、IISを再起動する(iisreset)

# .NETアプリケーション作成

## 新規プロジェクト作成

```
PS > dotnet new console -o HelloWorld
```

## パッケージの追加

```
PS > dotnet add package [パッケージ名]
```

## .Net Coreアプリの配置

参考：[.NET Coreでコンソールアプリを配置する - Build Insider](https://www.buildinsider.net/language/dotnetcore/04)

#### フレームワークに依存する展開（Framework-dependent deployment、FDD)

- メリット
    - ビルド成果物のバイナリがOSによらず同一であるためビルドの実行や配置が容易になる
    - ビルド成果物が軽量になる
    - 複数のアプリを同じOSで実行する場合に.NET Coreランタイムは共通であるためディスク使用量が削減される
- デメリット
    - 事前に.NET Coreランタイムのインストールが必要である
    - .NET Coreランタイム側のバージョンアップでまれではあるがアプリの動作に変更が生じる可能性がある

#### 自己完結型の展開（Self-contained deployment、SFD）

- メリット
    - 事前のランタイムインストールが不要
    - 利用するランタイムを完全に固定できる
- デメリット
    - OSごとにビルドを行ってバイナリを生成しないといけない
    - ランタイムが含まれるので配置するバイナリのサイズが大きくなる
    - 配置先のマシンで占めるディスク容量が増える

## .Net Core コンソールアプリケーション

[コンソール アプリケーション | Microsoft Docs](https://docs.microsoft.com/ja-jp/dotnet/csharp/tutorials/console-teleprompter)

## ログ

- DIコンテナとか使ってみたいけど、今回は使用せず。
  - [Getting started with .NET Core 2 Console application · NLog/NLog.Extensions.Logging Wiki](https://github.com/NLog/NLog.Extensions.Logging/wiki/Getting-started-with-.NET-Core-2---Console-application)

[.NETでログファイルのローテーションに日付を使用する - redwarrior’s diary](https://redwarrior.hateblo.jp/entry/2015/05/26/090000)


## テスト

[dotnet テストと xUnit を使用した .NET Core での単体テスト C# コード | Microsoft Docs](https://docs.microsoft.com/ja-jp/dotnet/core/testing/unit-testing-with-dotnet-test)

- テスト実行
  - dotnet test
シェルスクリプト  エビデンスCSVからリカバリー用のSQLを生成する

自分用メモ

#目的
SQLでUPDATEした後、リカバリーするためのSQLを作りたい

###1.BEROR.sql 生成
```
spool ./BEFORE.csv
select ID, NAME, FLG, UPDATE_DATE FROM HOGEDB WHERE FLG = '0';
spool off;
```

###2.RECHOVER.sh 作成

```
% vi RECHOVER.sh
-----------------------------------------------------------
#!/bin/sh

sql=""

while read line; do

    IFS=','
    set -- ${line}

    sql="${sql}UPDATE HOGEDB SET FLG = '$3',  UPDATE_DATE = CURRENT_DAtE WHERE USERID = '$1';\n"

done < BEFOR.csv
(
  echo -e "${sql}" > RECOVER.sql
)
```
###3.RECHOVER.sql 作成
シェルスクリプト実行する。

```
% sh ./RECHOVER.sh
```

###備考
初めて書いたシェルスクリプト
なんかもっといいやり方ないかな
jupyterでモジュールがインストール出来ない時の解決法

#環境
・MacOS High Sirra
・anaconda
・python3

#モジュールのインストールが出来ない理由と解決法
私がjupyterを使って、モジュールがインストール出来なかったのには大きく分けて3つ理由があった。以下の3つを確認してもらえれば、きっとインストールがうまくいくと思う。

####**①pipを使っている** 
　「pip」ではなく「pip3」を使うとエラーが解消される場合がある
####**②$pipを使っている**
　「$」pipではなく「!」pipにする
####**③pipのバージョンが更新されていない**
![図1.png](https://qiita-image-store.s3.amazonaws.com/0/309791/25fd3005-d8e6-d6d8-fa3f-1292517f9e21.png)

このように怒られたら、pipのバージョンが更新されていない証拠である
以下のコードをコピペして、pipのバージョンを最新にしよう

```
! pip3 install --upgrade setuptools
! pip3 install --upgrade pip
```


以上が確認できれば大丈夫だ！
今日も一日楽しく頑張ろう:relaxed:
Travis CIでAPIをテストするときは

Travis CIでAPIをテストするときには、APIを使うテスト前に「APIが利用できるか」確認しましょう。

```python
# Checks if API is available. This file is in the public domain.
import sys
import requests
api = requests.get("https://api.scratch.mit.edu").status_code
if api>=400:
    print("API not available! Test failed.")
    sys.exit(1)
print("API confirmed.")
sys.exit(0)
```
Djangoでカスタムタグ(フィルタ)を複数のアプリで共有する



## TL;DR
Djangoでカスタムタグ・フィルタをcoreやbaseに作って複数のアプリで使えるようにしたいときは、
`settings.py`の`TEMPLATES`欄に追記する必要があるよ

## 環境
+ Python 3.7.0
+ Django 2.1.2

## 概要

例えばこんなmodelがあったとする。

```python:users/models.py
class User(models.Model):
    sex = models.IntegerField('性別', choices=((1, '男性'), (2, '女性')))
```

この時、Templateの側で性別の`男性``女性`を表示したいが、`user.get_sex_display()`を使えないとき（性別ごとの集計結果とか）はカスタムタグなりフィルタなりを作ると思う。
だけど、性別の表示なんて他でも使いそうだから、baseに定義して他のアプリからも使えるようにしたい…というときにどうすればいいかという話。

## 結論
まず、`base/templatetags`にカスタムフィルタを作る。
例えばこんな感じ

```python:base/templatetags/utility.py
from django import template

register = template.Library()


@register.filter()
def display_sex(sex_num):
    """性別の番号を文字に変換する。"""
    if sex_num == 1:
        return '男性'

    if sex_num == 2:
        return '女性'

```

そのあと、`setting.py`の`TEMPLATES`欄に`base/templatetags/utility.py`への参照を追記する。
（`libraries`がないときは追加する）

```python:settings.py
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
            'libraries': {
                'utility': 'base.templatetags.utility' # 追記
            }
        },
    },
]
```

これで、全アプリのテンプレートから`{% load utility %}`して、フィルタを適用すればOK。

```html:html
{% load utility %}

{% block contents %}
    {{ 1|display_sex }} <!-- "男性"と表示される -->
{% endblock %}
```

(ちなみに`{% load 'utility' %}`(utilityを文字列にする)とエラーになるので注意。(1敗)

## 参考
https://stackoverflow.com/questions/40686201/django-1-10-1-my-templatetag-is-not-a-registered-tag-library-must-be-one-of/42881074
EgretEngineのデモプロジェクトの入手方法

# 手順
1. サンプルプロジェクトの一覧にアクセスしてプロジェクトを選ぶ
2. プロジェクトアーカイブをダウンロード
3. プロジェクトをインポート

# サンプルプロジェクトの一覧にアクセスしてプロジェクトを選ぶ

サンプルプロジェクト集
[中国語](http://developer.egret.com/cn/list/example/id/190)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/302078/c443ad47-d91f-09a8-22f2-1ff3366af1b8.png)

[英語](http://developer.egret.com/en/list/example/id/13)

# 2. プロジェクトアーカイブをダウンロード

1. プロジェクトをクリックしてデモを起動させる
2. 画面右上のダウンロードボタン（赤丸）をクリックしてZIPをダウンロード

![image.png](https://qiita-image-store.s3.amazonaws.com/0/302078/d0692be8-532b-08f0-e396-61480eed4018.png)

# 3. プロジェクトをインポート
1. 解凍する
2. Egret Launcerを起動
3. ProjectsタブからImport Projectを選択
![image.png](https://qiita-image-store.s3.amazonaws.com/0/302078/630288c1-273c-a9fb-0b0a-d6c059bec6b4.png)

4. DemoUI2 >  source ディレクトリを選択する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/302078/afb1db19-00fe-687f-f468-6e50c08bdcbe.png)
5. 完了
![image.png](https://qiita-image-store.s3.amazonaws.com/0/302078/f2416219-32fb-7259-b011-07f36eaa3f4b.png)
VS CodeでMarkdown書くときに空白削除されるのを防ぐ

# Markdownだけ空白削除を防止
普段保存時に行末の空白を削除する設定を入れてるのですが、Markdownで意図的に改行したいときは空白2個を入れます。何もしないとせっかく書いたMarkdownの改行がぶっ壊れるので防止する方法をば。

1.基本設定→設定
![image.png](https://qiita-image-store.s3.amazonaws.com/0/309783/34554964-ad4a-c137-c51f-2b6d42d84daf.png)

2.setting.jsonを開く

![image.png](https://qiita-image-store.s3.amazonaws.com/0/309783/463911d5-0634-aafc-5dcb-cf0511483732.png)

3.Workspaceの設定
![image.png](https://qiita-image-store.s3.amazonaws.com/0/309783/f15f2d3b-784f-89c3-dc55-b588fe83527f.png)


4.以下追記  

```python
    "[markdown]": {
        "files.trimTrailingWhitespace": false
    }
```
cherry-pickを使って特定のコミットだけプッシュする方法

##リモートリポジトリから特定のコミットをpushする
過去に修正していた余分なコミットがgithub上に反映されてしまったことがある。
![Commits_·_ngron_sample_app.png](https://qiita-image-store.s3.amazonaws.com/0/242611/da9ec074-783f-e2a3-7780-5b08ebff366e.png)



そのようなコミットは除外したいので特定のコミットだけを反映させたいときがある。
その時に使うのがcherry-pick。
##使い方

```
cherry-pick (コミット番号)
```

これを実行すれば**指定したコミット番号だけをローカルリポジトリに取り入れることができる。**
leafletを鍛える。その16

#概要

leafletを鍛えてみた。
マーカークリックで飛んでみた。その2

#写真

![](http://jsdo-static-contents.s3.amazonaws.com/images/capture/k/x/k/kxkS.jpg?t=1541124816)

#サンプルコード

```
var map = L.map('map').setView([38.0748331, 139.4574997], 9);

L.tileLayer('http://{s}.tile.osm.org/{z}/{x}/{y}.png', {
    attribution: '&copy; <a href="http://osm.org/copyright">OpenStreetMap</a> contributors'
}).addTo(map);



function add_marker() {
    var points = [["P1", 38.077908, 139.542229, "http://jsdo.it/1"], ["P2", 38.075618, 139.642032, "http://jsdo.it/2"], ["P3", 38.0738618, 139.441726, "http://jsdo.it/3"]];
    var marker = [];
    var i;
    for (i = 0; i < points.length; i++) 
    {
            marker[i] = new L.Marker([points[i][1], points[i][2]], {
                title: points[i][0],
                win_url: points[i][3]
            });
            marker[i].addTo(map);
            marker[i].on("click", function() {
                window.open(this.options.win_url);
            });
    };
}
add_marker();
```

#成果物

https://embed.plnkr.co/6zJutcrGwdCP8v8wKxnj/


以上。
gitの基本(init~push)+@


##git init

```:command-line
$ git init
Initialized empty Git repository in ~/my-first/.git/
$ git config --global user.name "Your Name"
$ git config --global user.email you@example.com
```

##コミットしたくないファイルは.gitignoreファイルを作って下記のように編集

例）

```:.gitignore
*.pyc
*~
__pycache__
.DS_Store
```

##状態の確認
```:command-line
$ git status
On branch master

Initial commit

Untracked files:
  (use "git add <file>..." to include in what will be committed)

   ...
   ...

nothing added to commit but untracked files present (use "git add" to track)
```

##addしてコミット
```:command-line
$ git add --all .
$ git commit -m "first commit"
```

##Githubでレポジトリ作成後，ローカルレポジトリをリモートに追加する
[githubでレポジトリ作成](https://techacademy.jp/magazine/62350)
レポジトリ作成後，以下を実行

```:command-line
$ git remote add origin https://github.com/<your-github-username>/my-first-repository.git
$ git push -u origin master
```

終了！！後は自分のgithubアカウントで確認

#リモートレポジトリの編集
```
登録されているリモートリポジトリの確認
git remote -v
リモートリポジトリURLの編集
git remote set-url [repository name] [repository url]
リモートリポジトリの削除
git remote rm [repository name]
```
repository nameは```origin```とか

## pull
```git pull origin master```

## ブランチの変更
```
$ git fetch
$ git branch -a
$ git checkout <branch>

# リモートブランチをローカルにチェックアウトする
$ git checkout -b local_branch_name origin/remote_branch_name
```

## branchの作り方→remoteにpush
```
# ブランチを作成
git checkout -b "#1"
git push -u origin "#1"
```

## git でミスったとき
### 間違えてcommitして，stagingに戻したい時
```git reset --soft HEAD~```
### 間違えてcommitしたコミットを消したい時
```git reset --hard HEAD```
### 間違えてpush[1]
ローカルでrevertを使って取り消して、それをリモートへ反映する。

revertは相殺で取り消すのでログからは消えない。（正確には取り消しではなくて打消し）
resetだとログから完全に消えていまい危険なのでrevert推奨らしい。

１．取り消したいコミットのコミットIDを取得する。

```
$git log 
commit XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Author: Foo Bar <XXX@XXXX>
Date:   Tue Mar 15 10:26:14 2016 +0900
,
    XXXを修正
```

２．取り消したいコミットをrevertする。
複数のコミットを消したい場合はこれが複数になるだけ。

```
$git revert <commit id>
```

３．リモートへpushする

```
$git push
```

## 特定fileのreset（HEADに戻す）
```git checkout HEAD -- test_file.txt```

## 変更の退避（stash）
### 変更を退避する
```git stash save```
### 退避した変更の確認
```
$ git stash list
stash@{0}: WIP on #1: xxxxxx
stash@{1}: WIP on branch_name: xxxxxx
```
### 退避した作業を戻す

```
// stash@{0}をもとに戻す
$git stash apply stash@{0}
// stash@{0}をもとに戻す + addした状態にする
$git stash apply stash@{0} --index
// stash@{0}の作業をもとに戻す + 退避作業の中から削除します
$git stash pop stash@{0}
```

### その他
```
// stash@{0}を削除
$git stash drop stash@{0}
// stashの詳細を見る
$git stash show stash@{0} -p
// stashのクリア
$git stash clear
```
### ローカルだけで使いたいファイルがある時（credentialなど）
```
git update-index --skip-worktree file_name
```
https://qiita.com/nishina555/items/f54fadd16c4f806fd91c 

## REF

[1.【Git】間違ってpushした場合の取り消し方](https://qiita.com/kazu56/items/ce6eafa67a09463e6064)
[2. git reset (--hard/--soft)ワーキングツリー、インデックス、HEADを使いこなす方法]
(https://qiita.com/shuntaro_tamura/items/db1aef9cf9d78db50ffe)
メタ文字とは？

# 目的
メタ文字の種類と基本的な使用方法について学習する。

# メタ文字とは？
文字を規則に従って検索させる文字のことを指す。　　
記号を一般化することで汎用的な文字にヒットさせることができる。

# メタ文字の種類は？
よく使用する基本的なものについて説明を行う。
※/（スラッシュ）と\（バックスラッシュ）が似ているので、間違えないように。

|記号 |概要 |注意事項 |
| :---: | :---: | :---: |
|\d |０～９までの数字を表す | |
|\w | 英単語、数字を表す ||
|\W | 記号を表す ||
|.（ピリオド）|なんでもいい一文字|||

# 練習問題
## 問題
Q1.3桁の数字のみヒットさせる
Q2.文字をヒットさせる
Q3.任意の三文字にヒットさせる

```
hogehoge@gmail.com
12310
abc
% 記号
$　
```

## 解答
A1./d/d/d
A2./w
A3....
A4./W
【解決済み】Xcode 10 で CocoaPods の pod install を実行すると RuntimeError になる

## 2018/11/16 追記

[Yu Sugawara](https://qiita.com/yusuga) さんがコメントをくださいました。
ありがとうございます！

> この問題は [CocoaPods/Xcodeproj](https://github.com/CocoaPods/Xcodeproj) の 1.6.0 で修正されていますので、

> gem update xcodeproj
> で対応したバージョンに上げれば解決します。

> [CocoaPods #7835](https://github.com/CocoaPods/CocoaPods/issues/7835#issuecomment-427353266)

## RuntimeError 発生

Xcode 10 で CocoaPods の pod install を実行すると、つぎのエラーが出ました。

> RuntimeError - [!] Xcodeproj doesn't know about the following attributes {"inputFileListPaths"=>[], "outputFileListPaths"=>[]} for the 'PBXShellScriptBuildPhase' isa.
> If this attribute was generated by Xcode please file an issue: https://github.com/CocoaPods/Xcodeproj/issues/new

## issue を発見

エラー内容で検索してみると、つぎのissueが見つかりました。

[https://github.com/CocoaPods/CocoaPods/issues/7835](Xcodeproj doesn't know about the following attributes {"inputFileListPaths"=>[], "outputFileListPaths"=>[]} for the 'PBXShellScriptBuildPhase' isa #7875)

どうやら、 Xcode 10 で pod install を実行すると発生するエラーのようです。

<img width="769" alt="001.png" src="https://qiita-image-store.s3.amazonaws.com/0/38924/fe70673c-e79c-f03e-4e40-24c55e0d7b32.png">

TARGETS の Build Phases の Run Script にある、 Input File Lists や Output File Lists があるとエラーになってしまうとのことです。

## 対応方法

対応方法もさきほどのissueで紹介されていました。

その方法とは、 つぎの手順で Input File Lists や Output File Lists を削除することです。

`プロジェクトファイルの中身を直接編集するので、必ずバックアップをとってから実行してください`

<img width="377" alt="002.png" src="https://qiita-image-store.s3.amazonaws.com/0/38924/d319b21d-8ab4-ae40-e92f-441ddec6081a.png">

まず、Xcode を終了します。つぎに、プロジェクトの xcodeproj ファイルを右クリックして、メニューから「パッケージの内容を表示」をクリックします。

<img width="611" alt="003.png" src="https://qiita-image-store.s3.amazonaws.com/0/38924/30f75426-70d4-00c8-2038-0df34fd86b80.png">

すると xcodeproj の中身が表示されるので、 project.pbxproj ファイルをエディターで開きます。

<img width="782" alt="004.png" src="https://qiita-image-store.s3.amazonaws.com/0/38924/d9cd4053-b8a8-d189-8492-3e90b37c87eb.png">

「inputFileListPaths」や「outputFileListPaths」で検索して、該当する行を削除して保存します。

これで対応は完了です。

もう一度 pod install を実行すると、エラーがなくなります。
AlexaでTello（ドローン）を操作するメモ

#はじめに
この記事は[こちらの方の成果物](https://github.com/miso-develop/tello-controller-alexa)を使ってAlexaからTelloを操作したときのメモです。
Readmeに書いてある手順のとおりにやればできてしまいます。
すごいです。
ありがとうございます。

ですので、これは初心者の私が仕組みを理解するために書きました。

#物理的に必要なもの
今回はPCからAlexaシミュレータで操作するので実機はなしです。
もちろん実機を使ってもOKです。

- PC
- USB Wifiコネクタ
- Tello


#出来上がる構成
今回のAlexaからTelloを操作する仕組みは以下のようになっています。

Telloの操作はWifiで接続された端末から行う必要があるため、Alexa単独でTelloを操作というわけにはいきません。

![Alexa_tello_構成図.png](https://qiita-image-store.s3.amazonaws.com/0/245438/79665435-6831-1329-3eac-2c1b7d264a40.png)

今回はテストなのでPCがAlexaとエンドポイントを置くサーバの二役を担っていてよくわからないことになっていますが、Echo実機を使って、ラズパイなどでサーバーも立てるのであれば以下のようになるでしょうか。
エンドポイントを動かしているサーバー端末はもちろんTelloと接続するためのWifiコネクタと、Alexaサービスからのリクエストを受け取るためのインターネットとの接続の2系統のネットワークアダプタが必要です。

![Alexa_tello_構成図2.png](https://qiita-image-store.s3.amazonaws.com/0/245438/b534385a-9e8a-3b0d-2879-fc6ef1b868b7.png)


実際には、エンドポイントからTelloへの命令とは別に、エンドポイントからAlexaサービスを経由してEchoに応答メッセージが返ります。


さて、AlexaでTelloを操作する仕組みの全体像がつかめたでしょうか。
それではあとはReadMeのとおりなのでやってみましょう。

#今後の発展
Node.jsで作られているエンドポイントの部分をC#でやりたいです。
C#でTelloを操作する方法は[こちら](https://note.mu/keizi666/n/nddef168ffb76)の方の記事が大いに参考になります。
あとはこれをC#で作成したエンドポイントから呼び出せばいいのです。
~~ASP.NET coreとか使うことになるのかな？~~
→AWS Lambdaに対してはAzure Functionですね。恥ずかしい。

調べてみようと思います。
PythonでGoogle Custom Search APIを使い画像収集してみた

# Custom SearchとAPIの設定

まず、Custom SearchとAPIの設定を行うのですが、下記のURLを参考にしてみてください。
[Custom Search・APIの設定](https://qiita.com/onlyzs/items/c56fb76ce43e45c12339)


# 画像収集実装

```images_get.py
import urllib.request
from urllib.parse import quote
import httplib2
import json 
import os
import sys
import requests

API_KEY = "" # 取得したらここに追加
CUSTOM_SEARCH_ENGINE = "" # 取得したらここに追加

# キーワードを指定してください
keywords=["犬","猫"]

# 画像を検索し、URLをimg_urlsに追加
def get_image_url(search_keywords, total_num):
    img_urls = []
    i = 0
    while i < total_num:
        query_img = "https://www.googleapis.com/customsearch/v1?key=" + API_KEY + "&cx=" + CUSTOM_SEARCH_ENGINE + "&num=" + str(10 if(total_num-i)>10 else (total_num-i)) + "&start=" + str(i+1) + "&q=" + quote(search_keywords) + "&searchType=image"
        res = urllib.request.urlopen(query_img)
        data = json.loads(res.read().decode('utf-8'))
        for j in range(len(data["items"])):
            img_urls.append(data["items"][j]["link"])
        i += 10
    return img_urls

# 画像のURLから画像を保存
def get_image(search_keywords, img_urls,j):
    for i in range(len(img_urls)):
        res = requests.get(img_urls[i])
        get_images = res.content
        filename = search_keywords + str(i) + ".jpg"
        with open(filename, 'wb') as f:
            f.write(get_images)

# 実行
for j in range(len(keywords)):
    print(keywords[j])
    img_urls = get_image_url(keywords[j],5) # キーワードごとに取得したい枚数を指定(今回は5)
    get_image(keywords[j], img_urls,j)
```

これを、画像を入れたいディレクトリで実行してください。
このように画像を取得できます。
![犬2.jpg](https://qiita-image-store.s3.amazonaws.com/0/285122/9ed9c742-1ea6-054b-3964-cf8eddfa4ffa.jpeg)

画像を収集したい時に活用してください。
brタグのあとに要素を追加する

html中にあるbrタグのあとに何か文字列やDOM要素を追加する方法を紹介します

本記事で紹介する動くサンプルの、共通部分のHTMLを先に載せておきます。


```html
<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
hogehoge <br> fugafuga
</body>
</html>
```

以下の載せるスクリプトを上記のHTMLの下に置くと、brタグのあとにspanタグとともに`aaa`という文字列が挿入されます。



## insertBeforeの利用



```html
<script>
const mainElm = document.getElementById('main');
const brElms = mainElm.getElementsByTagName('br');

const span = document.createElement('span');
span.innerHTML = "aaa";

brElms[0].parentNode.insertBefore(span, brElms[0].nextSibling);
</script>
```

## insertAdjacentHTMLを利用した場合

insertAdjacentHTML（）メソッドは、指定されたHTMLまたはXMLを、呼び出された要素を基準として所定の位置に挿入する方法です。

```html
<script>
const mainElm = document.getElementById('main');
const brElms = mainElm.getElementsByTagName('br');

const span = document.createElement('span');
span.innerHTML = "aaa";

brElms[0].insertAdjacentHTML('afterend', span.outerHTML);
</script>
```

[参考](https://developer.mozilla.org/ja/docs/Web/API/Element/insertAdjacentHTML)

## insertAdjacentElementを利用した場合

insertAdjacentElement（）メソッドは、指定された要素ノードを、呼び出された要素を基準として所定の位置に挿入する方法です。


```html
<script>
const mainElm = document.getElementById('main');
const brElms = mainElm.getElementsByTagName('br');

const span = document.createElement('span');
span.innerHTML = "aaa";

brElms[0].insertAdjacentElement('afterend', span);
</script>
```

[参考](https://developer.mozilla.org/ja/docs/Web/API/Element/insertAdjacentElement)
日付を1日ずつ増やしながら表示する

```php5

<?php
// 抽出対象期間
$startYmd='2016-02-01';
$endYmd='2017-02-01';

// timestampに変換
$startTimestamp = strtotime($startYmd);
$endTimestamp = strtotime($endYmd);

// ループの中で増えていくtimestamp
$steppingTimestamp = $startTimestamp;
$sqlUnions = '';
while($steppingTimestamp <= $endTimestamp)
{
    echo date('Ymd', $steppingTimestamp);
    // 最終ループ調整
    if ($steppingTimestamp != $endTimestamp) {
        echo ',';
    }

    // 一日増やす
    $steppingTimestamp = strtotime("+1 days", $steppingTimestamp);
}
```
[WordPress] Simple GA Ranking で特定の投稿を除外したい

# やりたいこと

* Simple GA Ranking で特定の投稿（URL）を除外したい

[Simple GA Ranking](http://simple-ga-ranking.org/ja/) は WordPress で Google Analytics のデータを利用してランキングを表示させるプラグインです。
ランキングデータを外部（Google Analytics）に持たせるため、WordPressを設置してるサーバーの負荷が軽いのが利点。

プラグイン自体に投稿タイプを除外したり、特定のカテゴリー（ターム）に絞ったり除外したりもできますが、特定の投稿を除外できないのが難点だったりします。

# 特定の投稿（URL）を除外＝フィルターパラメータを使う
Simple GA Ranking は [Core Reporting API](https://developers.google.com/analytics/devguides/reporting/core/v3/reference) のフィルターパラメータを指定することができます。
[Query Explorer](https://ga-dev-tools.appspot.com/query-explorer/) を使いながら検証するのが便利。

例として
![スクリーンショット 2018-11-02 10.39.36.png](https://qiita-image-store.s3.amazonaws.com/0/18348/d1b7601e-3828-08d2-17a5-123de9deef05.png)

ノーマルで取得できる上記のデータから `/2013/03/05/aws-s3-static-site/` を除外したい時は `filters` で `ga:pagePath!@aws-s3-static-site` とすると除外されます。
正規表現が使えるので [Core Reporting API](https://developers.google.com/analytics/devguides/reporting/core/v3/reference) 見ながらよしなに変更してください。
![スクリーンショット 2018-11-02 10.42.27.png](https://qiita-image-store.s3.amazonaws.com/0/18348/cccb444e-b155-7f76-a0e5-5d874e8c1fed.png)

これを Simple GA Ranking の filter に渡します。
PHPの場合

```
<?php
$args = array(
    'filter' => 'ga:pagePath!@aws-s3-static-site'
);
$ranking_data = sga_ranking_get_date( $args );
?>
```

ショートコードの場合

```
[sga_ranking filter="ga:pagePath!@aws-s3-static-site"]
```

現場からは以上です。
Naming Conventions for team development : E2E test

#  Naming Conventions : E2E

命名規則を考えるにあたって以下のサイトを参考にしました。

* [Naming conventions | The University of Edinburgh](https://www.ed.ac.uk/records-management/guidance/records/practical-guidance/naming-conventions)
* [Best practices for file naming | Stanford Libraries](https://library.stanford.edu/research/data-management-services/data-best-practices/best-practices-file-naming)
* [キャメルケースよりスネークケースで。 - 偏見プログラマの語り！](http://pg-kura.hatenablog.com/entry/20120118/1326892870)
* [変数名の命名規則/＊＊ケースの使い分け - Qiita](https://qiita.com/am_nimitz3/items/7b01af53751dba5d8fb1)



Naming conventions ではファイル命名についての規則を紹介しています。
この中から基本に使えそうな部分を抜粋しました。

* ファイル名は意味を十分にもたせて、且つ短くする

* 冗長なファイル名及びファイルパスを避ける

* * : \ / < > | " ? [ ] ; = + &  $ , .などを含めない


### 単語をつなぐ方法

どう単語同士を結びつけるのか

* camelCase
 
```bash
camelCase
firstIssue
```

* snake_case

```bash
snake_case
second-issue
```

### 単語の順番

どの順番で記述するのか

```bash
1. issue番号 動詞 名詞 
2. issue番号 画面番号 動詞 名詞 
```


### 組み合わせ

どの規則で組み合わせるのか


#### 1. snake_case: 番号 動詞 名詞   ( issueNum_Verb_Noun Style)

```
Style: {issueNum}_{Verb}_{Noun}.spec.js
Ex   : 1234_check_position.spec.js
```

#### 2. camalCase: 番号 動詞 名詞   ( issueNumVerbNoun Style)

```
Style: {issueNum}{Verb}{Noun}.spec.js
Ex   : 1234CheckPosition.spec.js
```
#### 3. snake_case: issue番号 画面番号 動詞 名詞  ( issueNum_ScreenNum_Verb_Noun Style)

```
Style: {issueNum}_{Verb}_{Noun}.spec.js
Ex   : 1234_ABC-5_check_position.spec.js
```

#### 4. camalCase: issue番号 画面番号 動詞 名詞   ( issueNumScreenNumVerbNoun Style)

```
Style: {issueNum}{Verb}{Noun}.spec.js
Ex   : 1234ABC-5CheckPosition.spec.js
```
会社員プログラマーでも必要な力


突然ですが、あなたは影響力をもっていますか？
影響力のある人間が多いほど組織って魅力的になるし、ない人は会社にぶら下がってるだけで何がしたいの？って感じます。
これは最近特に感じるようになってきたことで、どうしても書きたかった。
寒さのせいだろうか、最近はこれが発揮できていない人が増えている気がする。

###まずは干渉から

影響力のある人間になるにはどうすれば良いのか？
そのためにまずしなきゃいけないのが自分の意見を物怖じせずに言うことと、相手に干渉することかなって思います。
干渉するって言うと誤解を生みそうなので僕の思う干渉について説明します。
干渉するっていうのはいわば相手に向き合う、ってことです。
自分が思うことがあるならそれを素直に相手に伝えたらいい。
俺は〇〇だと思うけどおまえはどうなん？
ここをこういう様に改善してみたら？

そんなこと言う自信ないし、余計な関係作りたくないって思う人もいると思います。
だけどそれじゃあ会社っていう組織にいる意味ないよね。
言ったことに対して相手に何か言われたら、それを受け止めて改善すれば良いし、何も言わないより数倍はカッコいいとおもう。（当然だけど相手へのリスペクトは大事）

###陰に隠れるな

相手と向き合わず陰に隠れて他人に対して干渉しない人は組織の向上に貢献しないと思います。
個人の仕事はできても、集団になった途端に人が変わったようになります。
会議に参加しても自分の意見を言わない人は多くいます。
会議に参加するだけして自分の出番以外はまるで興味がない。
会議後に感想を聞くと「今日は〇〇さんの意見が勉強になった」という人もいる。
ではその人の仕事は勉強することですか？
そうではないと思います。組織にいるのだから自分の意見を出していきましょう。

頭良くて仕事できる人でも干渉力という点においては足りないことが多いです。
そのような優秀な人がこの力を持ったら組織はより良くなると思います！
WindowsのTortoiseSVNでログメッセージの編集を許可する

なぜ今更こんなものを触る必要があるのだろうか、と思いつつも触らなければなりませんでした。

過去にコミットしたログメッセージを後から編集したい場面が出てきました。
と言うか変えられるものと思っていて、メッセージを適当に書いてしまってました。
後から変えられないことに気付いて焦りました。

今回はこんな対処しました。
TortoiseSVNのGUIからの操作を許可してしまう設定。

(リポジトリのパス)/hooks/pre-revprop-change.bat
に例えば以下の様に書いておく

```
@echo off
echo pre-revprop-change %* 
exit 0
```

Windowsの情報は少なくてちょっと困りました。


#単発で強制的にメッセージを書き換える(TortiseSVNでは使えない？)

因みに 

```
svnadmin setlog . -r 30 rev30.txt --bypass-hooks
```

で中身のメッセージは変更できます。

・・・が、GUIの表示が変わりません。
TortoiseSVNはメッセージを複数個所に持っているのでしょうか？？

ファイルを直接編集したらハッシュが合わないからうにゃうにゃと怒られました。

その辺の不整合が解決するまでは変更前メッセージを表示していたのだろうか。
Macでスクリーンショットの保存先を変更する

# はじめに
誰かに情報を共有したり、開発してデザインを他のエンジニアに見てもらう時など、スクリーンショットを使いますよね？
僕は週10枚くらいスクショを撮るのですが、デフォルトだとMacのDesktopにスクショした画像が並んでいくので、定期的にDesktopを整理しないといけません。
そこで、スクショの画像の保存先を変更する方法を調べてみました。

# スクショの保存先を変更する
## Desktopにフォルダを作成する
デスクトップで右クリックして「新規フォルダ」からフォルダを作成してください。
今回は「ScreenShots」という名前にしました。
![スクリーンショット 2018-11-02 9.57.51.png](https://qiita-image-store.s3.amazonaws.com/0/209138/9d1577bf-a9a4-41e4-fe8f-471b1cad1e20.png)

※コマンドラインで作る場合は

```
$ cd Desktop
$ mkdir ScreenShots
```

## スクショの保存先を上記のフォルダに変更
Terminalを開きます。
（開き方がわからない方は下に書いてあります。）

以下のコマンドを実行してください。

```
$ defaults write com.apple.screencapture location ~/Desktop/ScreenShots
$ killall SystemUIServer
```

`~/Desktop/ScreenShots`の部分は作成したフォルダの名前でOKです。今回はDesktopの下にScreenShotsというフォルダを作成したので、`~/Desktop/ScreenShots`になっています。

## スクショしてみる
無事このフォルダにスクショが保存されました！これでDesktopが汚れずに済みます。
![スクリーンショット 2018-11-02 10.19.18.png](https://qiita-image-store.s3.amazonaws.com/0/209138/6f39075d-cef4-05b3-22f3-d08f32a073c4.png)


## 設定を戻したくなったら
```
$ defaults delete com.apple.screencapture location
$ killall SystemUIServer
```

# 非エンジニアの方へ
ターミナルとは、簡単に言えばMacに対して命令をすることができる場所です。
`command + Spaceキー`でスポットライトの検索画面を出して、`terminal.app`と検索してみてください。
候補に出てくる「ターミナル」をクリックすると、こんな感じの黒い画面が出てきます（色や表示されているものは違うかもしれません）。
![スクリーンショット 2018-11-02 10.17.01.png](https://qiita-image-store.s3.amazonaws.com/0/209138/92c701d9-c25e-6faf-9156-953116c35b1c.png)
そこで上記のコマンドを実行してください。
（＄は「ターミナルで実行してね」という意味なのでコマンドには入れないでください）
PowerCLI1行で全ESXiのラウンドロビンのiopsを1にする

https://kb.vmware.com/kb/2069356
これの対応ですね。リンク先にテキストでサンプルコードが置いてあるますが、1行ですまそうとするとこうなりました。
対象を絞り込みたい時は `-like ‘naa.*’`を編集したり`-and`で条件を追加すればOKです。

```
Connect-VIServer
Get-VMHost| %{Get-ScsiLun -VmHost $_ -LunType Disk | Where-Object {$_.CanonicalName -like ‘naa.*’ -and $_.MultipathPolicy -like ‘RoundRobin’}| Set-ScsiLun -CommandsToSwitchPath 1}
Disconnect-VIServer
```
XcodeでVimを使う

# 環境
* Xcode10.1
* OSX 10.14.1 Mojave

# XVim2をcloneしてmake
※ Xcode は終了しておいておいてください。

自分は~/Develop ディレクトリを作ってそこにクローンしました。

```bash
$ git clone git://github.com/XVimProject/XVim2 XVim2
$ cd XVim2
$ make
```
他の記事とかでは証明書が必要とか書いてあるようですが、多分それはXVimだと思います。特に必要ありませんでした。

# Xcodeに適用
[update_xcode_plugins](https://github.com/inket/update_xcode_plugins)なるものを使います。

```bash
sudo gem install update_xcode_plugins
```

でインストールできる。

```bash
update_xcode_plugins --unsign
```

を叩く。このときXcodeを複数バージョン入れてると選択を迫られる模様。選択してエンター。

ここまで終わったら、Xcodeを起動する。Load bundle, Skip bundle　を聞かれるらしいが、なぜか、自分は聞かれなかった。

上のメニューのEdit > Xvimがあればちゃんとできてる。


#　参考
* https://qiita.com/KazukiTanaka/items/3b45f1304effe3f25bf3

## XVim2, update_xcode_pluginsのgithubのURL
* [XVim2](https://github.com/XVimProject/XVim2)
* [update_xcode_plugins](https://github.com/inket/update_xcode_plugins)
laradockでworkspaceの作業ディレクトリを変更する&環境変数にする

# Dockerfileをいじって作業用ディレクトリを変更
laradockで作ったコンテナ内でマイグレーションコマンドを打とうとするとエラーが出た。

```console
$ docker container exec -it laradock_workspace_1 php artisan migrate:rollback
Could not open input file: artisan
```

bashでコンテナに入ってみると作業ディレクトリがlaravelプロジェクトのルートディレクトリの1階層上だった。

```console
$ docker container exec -it laradock_workspace_1 bash
root@eboa2244:/var/www#
```

workspaceのDockerfileを編集※いっちゃん下。

■Dockerfile

```Dockerfile
# Set default work directory
WORKDIR /var/www
```
↓以下のように書き換える
※環境変数にしたかったけど

■Dockerfile

```Dockerfile
# Set default work directory
WORKDIR /var/www/project-name
```

再度upして確認。
※nginxとmysqlは必要ないかも。念の為。

```console
$ docker-compose up -d --build workspace nginx mysql
$ docker container exec -it laradock_workspace_1 bash
root@eboa2244:/var/www/project-name#

// やりたかったことが出来た！
$ docker container exec -it laradock_workspace_1 php artisan migrate:rollback 
```

# 環境変数化
ついでに練習がてら作業用ディレクトリも環境変数にしてみようと思った。
単純に.envとDockerfileを以下のように変えてもうまくいかない。

■.env

```.env
WORKSPACE_WORKDIR=/var/www/project-name
```

■Dockerfile

```Dockerfile
WORKDIR ${WORKSPACE_WORKDIR}
```

laradockではdocker-compose.ymlのargsを通してDockerfileに環境変数を渡している。

■docker-compose.yml

```yml
workspace:
  build:
    args:
      - WORKSPACE_WORKDIR=${WORKSPACE_WORKDIR}
```

■Dockerfile

```Dockerfile
# Set default work directory
# ARGで環境変数に設定した値を受け取る
ARG WORKSPACE_WORKDIR

WORKDIR ${WORKSPACE_WORKDIR}
```

■.env

```
WORKSPACE_WORKDIR=/var/www/project-name
```

これで再度upすればOK.
【Python】コーディングメモ（Flask、Jinja2）

##バージョンを確認する

```py
# 引数は大文字のVで有る点に注意
python -V
```

##Hello Worldを出力する（Flaskを利用）
- https://localhost:5000/hello　にアクセスすると結果が表示されているのが分かる

```py
from flask import Flask
app = Flask(__name__)

@app.route("/hello")
def hello_world():
    return "<h1>Hello World</h1>"
```

##Jinja2テンプレート
- Pythonで作成されたテンプレートエンジン
- HTMLタグの中にPythonコードを記載できる
- Flask内にテンプレートエンジンとして組み込まれている

###Jinja2テンプレートを使用したサンプル
- 以下、サンプルを作成。
	- ワークディレクトリ：/home/xxx/workdir/sample_app
	- indexページ：/home/xxx/workdir/sample_app/index.py
	- テンプレート：/home/xxx/workdir/sample_app/templates/index.html

```index.py
import random
from flask import Flask, render_template
app = Flask(__name__)

@app.route("/")
def index():
    rand_num = random.randrange(10)
    #render_templateの第1引数にテンプレートファイルを指定する。
    #　第2引数にテンプレートファイルに渡したい変数を設定する
    return render_template("index.html", rand_num = rand_num)
```

```index.html
<!DOCTYPE html>
<html lang="ja">
    <head>
        <meta charset="utf-8">
        <title>Flask</title>
        <style>body {padding: 10px;}</style>
    </head>
    <body>
        <h1>奇数偶数判定</h1>
        <!-- {% … %}で、テンプレート内にPythonコードを埋め込める -->
        <!-- index.pyから受け取った変数値を参照して、奇数偶数判定を行い、結果を出力している -->
        {% if (rand_num % 2) == 0 %}
            <p>{{rand_num}}は偶数です!</p>
        {% else %}
            <p>{{rand_num}}は奇数です!</p>
        {% endif %}

    </body>
</html>
```

- コマンドを実行してFlaskのサーバーを起動

```terminal
FLASK_APP="index.py" FLASK_ENV=development flask run
```

- ブラウザで実行結果を確認
	- http://localhost:5000 にアクセス

![sample.PNG](https://qiita-image-store.s3.amazonaws.com/0/235774/299c539d-574d-3c38-8bbc-a8a87b92d62d.png)
セカンドライフを充実させるためのプログラミング学習

Paizaという無料で学習できるって聞いてから。

Pythonという言語を知った40歳。

内科クリニックを経営しているのでそれで役に立つかもしれないと始めたのですが。

学ぶことが多くあります。

ｉｆ文

a=なんか数字

if a==0:
　　print("楽しくない")

else:
　　print("楽しい")

0以外は楽しい。

こうじゃなかったら楽しくないではなく。

楽しくないこと以外は楽しい。

そう考えるととても人生が楽になります。

プログラミングって、自分で条件設定しないとそのようにならないので。

楽しい条件も自分で決められる。

0以外は楽しい。

できないところからのスタートですが。

プログラムを始めた頃は0ですが。

今は、if文がわかったので楽しいです。

皆さんよろしくね。
【Sinatra】Hello worldを書いてみた

#Sinatraの特徴
Rubyを使って、最小限の労力でWebアプリケーションを素早く作る土台
- 特徴：
- 軽量なWebアプリケーションフレームワーク
- 簡潔に記述できる
- 柔軟な拡張性

- 用途： 小規模なWebアプリケーションの開発に向いている
- 採用例：アップル、GitHub、イギリス政府、スタンフォード大学など

#SinatraでHello world

```rb
require 'sinatra'
require 'sinatra/reloader'

get '/' do
  'Hello World!'
end
```
Not Null 制約付きのカラムを既存テーブルに追加するマイグレーションで気をつけるべきこと

# Not Null 制約付きのカラムを既存テーブルに追加するマイグレーションで気をつけるべきこと

**既にデータを持っているテーブル**に対して、デフォルト値を持たない Not Null 制約を持ったカラムを追加すると

`column "test" contains null values (SQL: alter table "test_table" add column "test" integer not null)`

上記エラーが発生する。  
既存のテーブル行に対して新しく追加される列には初期値が Null で格納されるため、Not Null 制約に反してしまうため。

## 回避策

1. 本当は Not Null 制約 を true にしてカラム追加したいところだが、false にしてマイグレーション実行
2. UPDATE 文や UPSERT 文などでテーブルデータを修正して Null をなくす
3. Not Null 制約 を true にするマイグレーションファイルを別途作成してマイグレーション実行

### マイグレーションファイルはファイル名の昇順で実行される

既存ファイル、新規ファイル、CREATE、INSERT、UPDATE、ALTER TABLE などのマイグレーションファイルが入り乱れるとき、**リネームして実行順を考慮**することがある。  
Laravel の migration は実行したマイグレーションファイル名を DB で管理し、　DB で管理されていないマイグレーションファイルが実行対象となる。よって実行済みの既存マイグレーションファイルには何も修正を加えず、毎回新しいファイルを作成いくのがベター。
RedisのCentOS7へのインストールと操作

NoSQLの中で人気のあるRedisを[こちら](https://qiita.com/rubytomato@github/items/d66d932959d596876ab5)を参考に触ってみたのでまとめます。
![NoSQL.JPG](https://qiita-image-store.s3.amazonaws.com/0/251519/2ca3c391-3222-22f9-487b-ace45a2a7c60.jpeg)
引用 : [知らないなんて言えないNoSQLまとめ ― @IT](http://www.atmarkit.co.jp/ait/articles/1211/05/news007.html)

##Redisとは
* インメモリDB、オプションとして永続性をサポート
* キー・バリュー型：Key/Valueを単位としてデータを格納
* 5種類のデータ・タイプ

|data type	|扱う要素　　|
|---|---|---|
|文字列	|key に valueを登録|
|ハッシュ	|key に fieldとvalueをペアで登録|
|セット	|key に memberを登録|
|ソート済みセット	|key に memberとscoreをペアで登録|
|リスト	|key に valueを登録|



##Redisのインストール、起動

```
yum -y install epel-release   #エンタープライズ用パッケージが必要
yum -y install redis

redis-server --version
redis-server &
```

##対話式環境の起動
※参考：[redis-cliのオプション](https://qiita.com/sawada_masahiko/items/1f60936c421ecab8dfbf)

```
redis-cli
127.0.0.1:6379> set -h redis　　　#hostname設定
OK
127.0.0.1:6379> get -h
"redis"
```

##SET / SETNX / GET
setコマンドで値を登録しgetコマンドで値を取得
setnxコマンド（SET if Not eXists）は既存のキーに値を登録(update)不可

```
127.0.0.1:6379> set mystring "abc"
OK
127.0.0.1:6379> get mystring
"abc"
127.0.0.1:6379> setnx mystring "cde"
(integer) 0
127.0.0.1:6379> get mystring
"abc"
```

##SETEX / PSETEX
キーに有効期限を設定して値を設定（SETEX:秒、PSETEX:ミリ秒）

```
127.0.0.1:6379> setex mystring 10 "abc"
OK
127.0.0.1:6379> ttl mystring  　#有効期限を確認
(integer) 6
127.0.0.1:6379> ttl mystring  　#有効期限切れでキーが存在しない：-2
(integer) -2
```

##GETSET
キーの値の取得と設定を同時に実施

```
127.0.0.1:6379> getset mystring "abc"
(nil)   #新規に登録する場合はnilが返る

127.0.0.1:6379> getset mystring "def"
"abc"
127.0.0.1:6379> get mystring
"def"
```

##SELECT: DBの切替え

```
127.0.0.1:6379[1]> select 0
OK
127.0.0.1:6379> set Key 'Value'
OK
127.0.0.1:6379> get Key
"Value"
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> get Key
(nil)
127.0.0.1:6379[1]>
```

##KEYS: 登録されているKeyの検索

```
127.0.0.1:6379> keys *
1) "Key"
2) "-h"
3) "mystring"
4) "hello"
```

##リスト操作(RPUSH / LPUSH / LLEN / LRANGE / LPOP / RPOP)
PUSH/LPUSHは、リストの左右にオブジェクトを追加

```
127.0.0.1:6379> rpush abc 'cde'
(integer) 1
127.0.0.1:6379> rpush abc 'fgh'
(integer) 2
127.0.0.1:6379> rpush abc 'ijk'
(integer) 3
127.0.0.1:6379> lpush abc '000'
(integer) 4
127.0.0.1:6379> llen abc   #llen: 長さを取得
(integer) 4
```

LPOP/RPOPは、リストの左右からオブジェクトを削除し、返す

```
127.0.0.1:6379> lpop abc
"000"
```

LRANGEは、範囲を指定してリストを取得

```
127.0.0.1:6379> lrange abc 0 2
1) "cde"
2) "fgh"
3) "ijk"
```
Macのファンが爆音の時に試したこと

厳密にはプログラミング技術ではないですが、少しでも多くのうるさいファンが静かになることを願って備忘録的に残しておきます。

# TL;DR
ターミナルで以下コマンドを実行。

```
killall SystemUIServer
```

# 経緯
普段からしばしばファンが頑張ってしまいオフィス中にその爆音を轟かせていた弊MacBookPro。

とは言え、朝の静まり返ったオフィスで軽作業していた時でも爆音が発生し、**オフィス内でマジで俺のMacBookの音しか聴こえない**という事象が発生して騒音公害化していたのでちょっと見てみました。

アプリケーション >ユーティリティ> アクティビティモニタを起動してウィンドウ上部タブをCPUに切り替えます。
発生当時の状況は撮り逃してしまいましたが、以下スクリーンショットの**SystemUIServerが70%超え**の数値を叩き出していました。

<img width="798" alt="スクリーンショット 2018-11-02 8.46.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/179486/a92d2795-b3d0-aae7-b865-d1ee4d1eaa89.png">

じゃあSystemUIServerって何なのとググったところ、主にスクリーン上部のメニューバーを司るプロセスみたいです。

発生当時でもそう多くの常駐アプリケーションは表示されていませんでしたが、発生原因はアプリケーションとの相性等様々のようです。

ともかく、消しても大丈夫そうなプロセスであることが判明したため、以下コマンドを実行しました。

```
killall SystemUIServer
```

コマンド実行後はファンも落ち着きを取り戻しオフィスに静寂が再び訪れました。

普段の業務中だとローカルサーバ立てながら作業していることがほとんどだったので、まあ高負荷な作業だしファンがうるさくなるのは仕方ないかなと納得させていた部分があったのでこの原因はびっくりしました。
RailsのAction XxxやActive Xxxはどんな命名基準で使い分けられるのか

## はじめに：ActionとActiveの命名基準は何？

Railsフレームワークの内部には以下のようなコンポーネント（クラス群）が用意されています。

- Action Cable
- Action Mailer
- Action Pack
- Action View
- Active Job
- Active Model
- Active Record
- Active Storage
- Active Support

各コンポーネントのPrefix（接頭辞）はよく見ると、ActionとActiveの2種類があります。

ActionとActive、どちらも最初の4文字が同じなので、ぱっと見で違いが分かりづらいですし、どんな基準で名前が使い分けられているのかよくわかりません。

僕もときどき「あれっ、Action Storageだっけ？それともActive Storage？？」と迷うことがよくありました。

というわけで、RailsにおけるActionとActiveの命名基準について調べてみました。

## 回答：ActionはController層またはView層、ActiveはModel層（らしい）

命名基準に関する公式情報は見つけられなかったのですが、Stack Overflowに同じような質問と回答が載っていました。

- [Rails active vs action \(Railties naming\) \- Stack Overflow](https://stackoverflow.com/questions/32067953/rails-active-vs-action-railties-naming)
- [What is the naming rule behind Rails' parts? \- Stack Overflow](https://stackoverflow.com/questions/23747162/what-is-the-naming-rule-behind-rails-parts)

どちらの回答も次のような内容が載っていました。

- ActionはController層とView層に関連するコンポーネントで、HTTPリクエストとHTTPレスポンスを処理する
- ActiveはModel層に関連するコンポーネントで、アプリケーションのドメインモデルやビジネスロジックを処理する

なるほど、たしかに、

「Action Cable、Action Mailer、Action Pack、Action Viewは、Controller層とView層に関連する」

「Active Job、Active Model、Active Record、Active Storage、Active Supportは、Model層に関連する」

と言われてみると、そんな気がしてきます。

公式情報ではないので、絶対正しいとは言い切れませんが、「おそらくそうであろう」と考えておいても問題なさそうです。
ですので、現時点ではこれを回答としておきます。

（公式情報をご存じの方がいたら教えてください！）

## 余談：Action TextはもともとActive Textだった

Rails 6で導入が予定されているAction Text（リッチテキスト入力機能）は、もともとActive Textという名前だったそうです。

以下のコミットでDHH氏が「この機能はActive Modelというより、Action Viewに近いから」という理由で名前をAction Textに変更しています。

[Rename from Active Text to Action Text · rails/actiontext@f1d7487](https://github.com/rails/actiontext/commit/f1d74871e7f00e8bbde3501a759487ac8cc4c3fc)

Action TextのようにViewにもModelにも関連するコンポーネントだと、こんなふうに命名が揺れることもあるんですね。

## 謝辞

Stack Overflowの回答やDHH氏のコミットを見つけてくれた、SonicGardenの@kei-pと@tkawaに感謝します🙏
【Rails】ERROR: directory is already being watched!　つれぇわ【node_module】

#TL;DR
とりあえず一旦エラー解消できれば良いや！な人向けです。
``rails server`` するとタイトルのエラーが表示されました。
そこで``app/config/environments/development.rb``を以下のように編集した所、治まりました。（※当該位置は一番下のはずです）

```ruby:app/config/environments/development.rb
-- config.file_watcher = ActiveSupport::EventedFileUpdateChecker #こちらがデフォ。削除！
++ config.file_watcher = ActiveSupport::FileUpdateChecker #こちらに更新！
```

#環境
- Vagrant 2.2.0
- Rails 5.2.1
- Ruby 2.5.1
- Bundler 1.17.1
- node v10.12.0
- webpacker 4.0.0.pre.3
- Yarn 1.10.1

#エラーメッセージ、エラー経緯
webpacker関係なんですかね…私の場合下記です。。

```
[vagrant@localhost app_name]$ rails s
=> Booting Puma
=> Rails 5.2.1 application starting in development
=> Run `rails server -h` for more startup options
Puma starting in single mode...
* Version 3.12.0 (ruby 2.5.1-p57), codename: Llamas in Pajamas
* Min threads: 5, max threads: 5
* Environment: development

Use Ctrl-C to stop
** ERROR: directory is already being watched! **

        Directory: /home/vagrant/hoge/app_name/node_modules/.bin/file-loader

        is already being watched through: /home/vagrant/hoge/app_name/node_modules/file-loader

        MORE INFO: https://github.com/guard/listen/wiki/Duplicate-directory-errors
        ** ERROR: directory is already being watched! **

        Directory: /home/vagrant/hoge/app_name/node_modules/.bin/mini-css-extract-plugin

        is already being watched through: /home/vagrant/hoge/app_name/node_modules/mini-css-extract-plugin

        MORE INFO: https://github.com/guard/listen/wiki/Duplicate-directory-errors
        ** ERROR: directory is already being watched! **

        Directory: /home/vagrant/hoge/app_name/node_modules/@rails/webpacker/node_modules/.bin/file-loader

        is already being watched through: /home/vagrant/hoge/app_name/node_modules/file-loader

        MORE INFO: https://github.com/guard/listen/wiki/Duplicate-directory-errors
        ** ERROR: directory is already being watched! **

        Directory: /home/vagrant/hoge/app_name/node_modules/@rails/webpacker/node_modules/.bin/mini-css-extract-plugin

        is already being watched through: /home/vagrant/hoge/app_name/node_modules/mini-css-extract-plugin

        MORE INFO: https://github.com/guard/listen/wiki/Duplicate-directory-errors
```



#原因？
[dockerでrails5環境構築](https://qiita.com/pocari/items/456052a291381895f8b3#%E3%83%AA%E3%83%AD%E3%83%BC%E3%83%89%E3%81%95%E3%82%8C%E3%81%AA%E3%81%84%E5%95%8F%E9%A1%8C)
``config.file_watcher``と``ActiveSupport::EventedFileUpdateChecker``については、上記URLに詳しく書いてありました。
#参考
タイトルのメッセージでググると他にも色々出てきます。
上2つが自分に近いようです。
[ERROR: directory is already being watched! -- GitHub rails/webpacker](https://github.com/rails/webpacker/issues/1780)
[lot of 'is already being watched through' messages when using rails console if using node_modules -- GitHub rails](https://github.com/rails/rails/issues/32700)
[Rails5 on Vagrant のdevelopmentでコードの変更が反映されない](https://www.tcmobile.jp/dev_blog/programming/rails5-on-vagrant-%E3%81%AEdevelopment%E3%81%A7%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E5%A4%89%E6%9B%B4%E3%81%8C%E5%8F%8D%E6%98%A0%E3%81%95%E3%82%8C%E3%81%AA%E3%81%84/)