OmniAICreator/Qiita-1.07M huggingface dataset:
Laravel 5.6.* Released【随時更新】

[Laravel News](https://laravel-news.com/)には良記事が満載なので、備忘録の意味合いも込めて、記事を簡単にまとめていこうと思います（翻訳ではないです）。
リリース記事が多いので１つの投稿にまとめることにしました。

# 5.6.23, 5.6.24
投稿日: 2018/06/07
URL: https://laravel-news.com/laravel-5-6-24

* マイグレーションにてインデックスの名前変更がサポートされた。

* Event::fakeFor()メソッドが追加された。
なんだろ…。

* @cananyディレクティブが追加された。
指定のいずれかのアクションが実行できるかどうかで分岐できる。
似たようなものを自前で作ってました。

* TestReponse::assertLocation()メソッドが追加された。
HTTPヘッダのLocationのチェックができるようになった。

* assertSessionHasNoErrors() が追加された。
セッションにerrorsキーがないかどうか。わざわざヘルパ関数として用意するまでもあるのかな。

* POINT型作成時にSRIDを指定できるようになった。
MySQL8でそうなったのでその対応です。
で、SRIDってなんだろう。

* クエリビルダにJSONに対応したメソッドが追加された。
whereJsonDoesntContain
orWhereJsonDoesntContain

* すべての通知イベントにQueueable, SerializesModelsが追加された。

* ルーティングの定義時に配列を使った方法がサポートされた。
@を使ってするよりかはまぁ楽なのかなぁ

```
Route::get('smth', [SomeController::class, 'methodName']);
```
* SQL ServerでJSONをSELECTするクエリがサポートされた。

# 5.6.21, 5.6.22
投稿日: 2018/05/17
URL: https://laravel-news.com/laravel-5-6-22

* リレーションをロードしていない場合にロードするModel::loadMissing をCollectionにも追加した。
[大絶賛](https://github.com/laravel/framework/pull/24166)されてます。
ネストしたリレーションにも対応してるぽい。

* FilesystemManagerでdiskをリセット(unset)するforgetDiskメソッドが追加された。
ディスクを切り替えたいときに使うようですね。

* php artisan down したときに、指定IPのみメンテナンスモードではなく通常モードで閲覧できるようした。
これは便利ですね。

* バリデーションルールに'Gt', 'Lt', 'Gte', 'Lte'が追加された。
思えば今までなかったんですね。
数値の大小、文字列長の大小によるルールです。

* TestResponseにクッキーの有効期限切れチェックのassertCookieNotExpiredメソッドが追加された。

# 5.6.20
投稿日: 2018/05/08
URL: https://laravel-news.com/laravel-5-6-20

* abort関数にResponse、Responsableを渡すとHttpResponseExceptionが発生されるようになった。
どう便利になったのかを説明できない…。

* タスクフックのpingBefore、thenPingに実行条件を設定できるpingBeforeIf、thenPingIfが追加された。
そもそもpingBefore、thenPingを初めて知った…。

* ポリモーフィックリレーションでwithDefaultを使えるようになった。
ポリモーフィックもwithDefaultも使ったことない…。

# 5.6.19
投稿日: 2018/05/01
URL: https://laravel-news.com/laravel-5-6-19

* SparkPostのエンドポイントを設定で変更できるになった。

* Optionalでissetが使えるようになった。
自分はまだ使ってないですね、optinal。

* メール通知で複数のccやbccに対応。

# 5.6.18
投稿日: 2018/04/30
URL: https://laravel-news.com/laravel-5-6-18

* MySQL 8をサポート。

* FileSystemドライバのgetUrlも使用できるようになった。
Storage::url(〜)はファイルのURLを返しますが、内部ではドライバが持つアダプタからURLを取得しています(getUrl)。
ただ、一部のアダプタ（例. AzureAdapter）はgetUrlメソッドを持っていないので、ドライバにgetUrlメソッドがあれば、それを使用するにしたようです。

* PostgreSQLで「not ilike」「is distinct from」「is not distinct from」が使えるように。

* PusherのJSONPによる認証に対応。

# 5.6.17
投稿日: 2018/04/23
URL: https://laravel-news.com/laravel-5-6-17

* joinSub等のJOINでサブクエリを使うメソッドの追加
サブクエリをJOINするとき、これまではjoinメソッドに生のSQLを渡していましたが、クロージャやクエリビルダが使えるようになりました。

* Rule::in()、Rule::notIn() でCollectionが使えるようになった。
使えなかったんだ…、という感想。
extract_forwarded_moduleを使ってREMOTE_ADDRにアクセス元IPを設定する

##やりたいこと
.htaccess内でmodRewriteを使用してIPアドレスによってメンテナンスページへの振り分けをしたい。
許可IPの場合は閲覧可、それ以外はメンテナンスページを表示にするという対応を行う。

##環境
CloudFront（以後、CDN）
ELB
Amazon Linux（以後、EC2）

構成としてはCDNを経由し、ELBを通り、EC2へのアクセスされます。

##問題点
.htaccessにて「X_FORWARDED_FOR」を使って、アクセス元のIPアドレスを判断しようとしたところ、「X-Forwarded-For」に複数のIPが記載されいることでmodRewriteを使用したIPアドレスなどによるページ振り分けができなかった。

上記環境の問題によりどうやらCDNのIPアドレスが出力されているようです。
本来はELBのIPアドレスも記載されるはずですが、今回apacheモジュールの「mod_rpaf」を入れているため、ELBのIPはありませんでした。


##考えたこと（対策）
1. SetEnvに許可IPアドレスを変数にセットし、アクセス制限を行う
2. extract_forwarded_moduleを導入する。REMOTE_ADDRを取得し、modRewriteにて振り分けを行う。

■phpinfoにてIPアドレスを確認
![スクリーンショット 2018-05-23 17.13.29.png](https://qiita-image-store.s3.amazonaws.com/0/72180/31118e30-6eb5-fad3-1eda-d4daf05f9495.png)

1はIPアドレスにてアクセス制限出来ますが、ページの振り分けができないため却下。
２を採用する。

##やったこと
### 1. 「extract_forwarded_module」インストール
yumにてインストールを行う。

```shell
$ sudo yum install mod_extract_forwarded
```

### 2. 「mod_extract_forwarded.conf」編集
MEFacceptを「all」に変更

```
# コメントは省略しています
LoadModule extract_forwarded_module modules/mod_extract_forwarded.so
MEForder refuse,accept
MEFrefuse all
MEFaccept all
MEFaddenv on
MEFdebug off
```

### 3. 「httpd.conf」編集
mod_extract_forwarded.soを読み込むよう編集を行う。

LoadModuleを検索し、mod_extract_forwarded.soを追加する。
すでに追加されており、コメントアウトされている場合はコメントアウトを外す
また環境によってファイル名や、PATHが異なるかもしれませんので、moduleディレクトリ配下にて「extract_forwarded」を検索し適したものに変更する必要あり。

```
LoadModule extract_forwarded_module modules/mod_extract_forwarded.so
```

### apache再起動
設定を反映させる

```shell
$ /etc/init.d/httpd restart
```


##確認
phpinfoにてREMOTE_ADDRを確認する。

![スクリーンショット 2018-05-23 17.13.29.png](https://qiita-image-store.s3.amazonaws.com/0/72180/8fb2cfc1-29ef-f80c-ff76-95de2b243d52.png)


##感想
無事にアクセス元のIPアドレスが取得でき、安心。
CDNやSetEnvを使った制御ができるかもしれませんでしたが、調査する時間がなく断念。

もう少しCDNやELB（アプリケーションロードバランサー）などを使用した環境も研究して色々と知見をためていこうと思います。


ありがとうございました！！
ビーコン用1px透明GIF画像をRailsのコントローラから直接返す

参考: https://stackoverflow.com/questions/2839521/returning-a-1x1-gif-as-a-response-in-rails

コントローラで以下のように実装

```ruby:beacon_controller.rb
class BeaconController < ApplicationController
  def ping
    
    # セッションやcookieの処理などをココに書く
    
    send_data Base64.decode64("R0lGODlhAQABAPAAAAAAAAAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw=="),
              type: "image/gif",
              disposition: "inline"
    expires_now
  end
end
```

`expires_now`を付け忘れると、2回目以降コントローラに処理が届く前にRailsが `304 Not Modified`を返すので注意
nem catapult.server 実行２ ハーベストする

<font color="red">こちらを使うことをおススメします。

https://github.com/tech-bureau/catapult-service-bootstrap</font>

# 前提

* OSはUbuntu16.04
* 公式githubの[catapult-server](https://github.com/nemtech/catapult-server)が、公式の手順にてビルドされていること
* Harvestingの設定を行います。
* この手順では、APIは使えません。

# 手順
* 開始ディレクトリは、`<catapult-server directory>/_build`

## old files clear

```
# rm -r data/
```

## resources

```
# cp ../resources/* resources/
```

## Generate Accounts
作業に使うアドレスを作ります。`-g`オプションで、数が指定できます。

```
# bin/catapult.tools.address -g 10 --network mijin-test
--- generating 10 keys ---
           private key: 6C07F78D8C932626F6550FB114C26EFAFE2EC40220E44E1EF0180D9FB89A0AF0
            public key: 8C2C06CCCDDFBC964345C051B3A94906813DCB198BA8A56378DA6ED1D2E99B58
  address (mijin-test): SCIXWKDPLL7L7IQO6LWN2HJXHYUV3F7ZQX3NUKM3

...続く
```

`private key`と`public key`と`S`から始まるアドレスの組が表示されます。


## Create Nemesis Block
### mijin-test.properties

`[distribution>nem:xem]`の下に、XEMを初期分配するアドレスが書いてあるので、先ほど作ったアドレスに変更する。

```
# cp ../tools/nemgen/resources/mijin-test.properties resources/
# vi resources/mijin-test.properties

cppFile = ../seed/mijin-test/MockMemoryBasedStorage_data.h

[distribution>nem:xem]
SCIXWKDPLL7L7IQO6LWN2HJXHYUV3F7ZQX3NUKM3 = 409'090'909'000'000
```

`MockMemoryBasedStorage_data.h`の使い道はわからない。


### hashes.dat

```
# mkdir -p seed/mijin-test/0000
# echo -n 6b23c0d5f35d1b11f9b683f0b0a617355deb11277d91ae091d399c655b87940d3f39d5c348e5b79d06e842c114e6cc571583bbf44e4b0ebfda1a01ec05745d43 > seed/mijin-test/00000/hashes.dat
```

`hashes.dat`に入れるべき値はおそらくなんでもよい。

### nemgen

```
# cd bin
# ./catapult.tools.nemgen ../resources/mijin-test.properties
# cd ../
```

### Copy

```
# mkdir -p data/00000
# cp seed/mijin-test/00000/* data/00000/
```

## Harvesting
`harvestKey`は、初期分配で指定したアドレスの秘密鍵を設定する。
`isAutoHarvestingEnabled`は`true`にする。

```
# vi resources/config-harvesting.properties
[harvesting]
harvestKey = 6C07F78D8C932626F6550FB114C26EFAFE2EC40220E44E1EF0180D9FB89A0AF0
isAutoHarvestingEnabled = true
```

## Run

```
# cd bin
# ./catapult.server
```

こんな感じでハーベストが進みます。

```
2018-05-22 08:29:13.117334 0x00007f1ecf7fe700: <info> (src::ScheduledHarvesterTask.cpp@35) Successfully harvested block at 853 with signer 8C2C06CCCDDFBC964345C051B3A94906813DCB198BA8A56378DA6ED1D2E99B58
2018-05-22 08:29:13.160800 0x00007f1e9f7fe700: <info> (disruptor::ConsumerDispatcher.cpp@44) completing processing of element 100 (1 blocks (heights 853 - 853) [1E978FE3] empty from Local), last consumer is 0 elements behind
```

# 関連

[nem catapult.server 実行１ とりあえず実行](https://qiita.com/planethouki/items/c1ed13cbc88f3bc5c06e)
[nem catapult.server 実行３ catapult.restの実行](https://qiita.com/planethouki/items/066f65fcdeaf4bf68126)
Eagleでシルク等の文字を一括で変換するスクリプト

毎回忘れてググるのでメモ。
下記をスクリプト `set_my_font.scr` とかに保存して実行する。

```
# change all font parameters to my default
# https://www.element14.com/community/thread/31231/l/how-to-change-font-size-throughout-brd?displayFullThread=true

display torig borig;   # Display the top and bottom origins
group all;             # Group everything
smash (C>0 0);         # Smash everything in the group
display none tname bname tval bval; # OPTIONAL: limit changes to names and values
group all;             # Group everything including smashed texts.
change font vector (C>0 0); # Change the font to a vector font
change size 40mil (C>0 0); # Change the font size
change ratio 15 (C>0 0); # Change the width:height ratio
display last;
```

元ネタは[こちら](https://www.element14.com/community/thread/31231/l/how-to-change-font-size-throughout-brd?displayFullThread=true)。
TensorFlow Lite(r1.13) を CMake でコンパイルする

漢なら tensorflow lite を CMake でコンパイルしたいですね!

やりましょう!

できました.

https://github.com/syoyo/tensorflow

の `cmake` branch です(r1.13 に対して作成)

## 設定.

tensorflow lite をモバイルで動かす前に, デバッグ用に Linux PC 環境などで開発テストしたいですよね.

`r1.13` では, cmake のオフィシャル対応はなくなりました. Makefile がありますが, 主に Android や RasPi cross-compile 用の模様です.

### CMakeLists.txt の作成

`r1.10` あたりから cmake サポートが無くなっています. 以前に作ったのを参考に作り直しました.

## label_image を動かす.

http://blog.gclue.com/?p=836

https://www.tensorflow.org/mobile/tflite/demo_android

あたりを参考にして, `mobilenet_quant_v1_224.tflite` と `labels.txt` を入手します. 

**かわい過ぎてやばい Alicia Vikander の画像**でテストしてみます. :heart_eyes:

北欧美人女優アリシア・ヴィキャンデルがかわい過ぎてやばい！
https://ciatr.jp/topics/58021

https://commons.wikimedia.org/wiki/File:Alicia_Vikander_2015_Comic-Con_cropped_2.jpg#/media/File:Alicia_Vikander_2015_Comic-Con_cropped_2.jpg

```
$ ./label_image -i alicia.bmp 
nnapi error: unable to open library libneuralnetworks.so
Loaded model ./mobilenet_quant_v1_224.tflite
resolved reporter
invoked 
average time: 3247.53 ms 
0.145098: 475 cardigan
0.0745098: 643 marimba
0.0627451: 569 fur coat
0.0470588: 682 notebook
0.0470588: 615 kimono
```

Super coooooool! :tada::tada::tada::tada::tada::tada::tada:

認識結果についてはさておき, 実行に成功しました!

## TODO

* embedded デバイス用に tflite をさらに削ぎ落とした Tensorflow-Lite micro が `r1.13` くらいから experimental で追加されているので, これを cmake でビルドする
* **優秀な tensorflow lite 若人が, CMake を活用することで, 優秀な tensorflow lit 若人が人類史上最速で tensorflow lite の頂点に立ち, 人類を昇華なされるスキーム**を確立する旅に出たい.
Spring Boot でセッションタイムアウト時間を変更する

Spring Boot でセッションタイムアウト時間を変更した話
## 環境
Spring Boot v1.5.1.RELEASE
および
Spring Boot v2.1.5.RELEASE（2019/7/18 追記）
## 変更方法
### application.properties（または .yml ファイル） を編集する
　以下いずれも、モジュールへの変更無しに変更できるが、セッションを作るとき、またはセッションを破棄するときの処理は書けない。
#### Spring Boot v2.x より前
* `server.session.timeout` プロパティに任意の秒数をセットする
  * 参考 URL: https://docs.spring.io/spring-boot/docs/1.5.x/reference/html/common-application-properties.html

#### Spring Boot v2.x 以降（2019/7/18 追記）
* `server.servlet.session.timeout` プロパティに値をセットする
  * 参考 URL: https://docs.spring.io/spring-boot/docs/2.0.x/reference/html/common-application-properties.html
  * 上記ドキュメントより、数値にサフィックス(m=分、s=秒)を付ければ分または秒単位に指定できる模様
  * 60 秒未満の値を指定しても60 秒未満にはならない（最短 1 分）
       * セッションタイムアウト時間は最終的に分で管理されており、60 秒未満は切り捨てられる模様
       * 参考 URL1: https://github.com/spring-projects/spring-boot/blob/master/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/web/embedded/tomcat/TomcatServletWebServerFactory.java
       * 参考 URL2: http://k6i.hateblo.jp/entry/2018/07/14/173704

### HttpSessionListener を実装する方法
  * HttpSessionListener を実装したクラスを作成
  * セッションを作るとき、セッションを破棄するときに行いたい処理を書ける
  * 単にセッションタイムアウト時間を変更したいときは冗長か

```java:MySessionListener.java
public class MySessionListener implements HttpSessionListener {
  @Override
  public void sessionCreated(HttpSessionEvent se) {
    // タイムアウト時間を設定
    HttpSession session = se.getSession();
    session.setMaxInactiveInterval(1800); // タイムアウト秒数を指定。負の数だとセッションタイムアウトしない

    // セッション生成時の処理
    // ...
  }

  @Override
  public void sessionDestroyed(HttpSessionEvent se) {
    // セッション破棄時の処理
    // ...
  }
```

```java:WebAppConfig.java
@Configuration
@Import({MySessionListener.class}) // インポートして有効化
public class WebAppConfig {
}
```
Google Apps Script で京急線と京浜東北線の遅延情報を【無料】でSlack 通知の巻

#目的
最近、電車遅延が多く、遅延情報を知りたい

#目標
遅延があれば、アクティブに通知して欲しい
無料で！！！
土日・祝日は除く

#やったこと
Google Apps Script に京急線と京浜東北線の情報を定時で読み込ませ、トラブルあれば、Slack へ通知する。
　GAS -> 土日じゃないこと
        -> 祝日じゃないこと（日本の祝日情報をgoogle カレンダーAPI から取得)
           ->yahoo 運行情報
             -> "平常運転"以外
　　　　　　　　-> 遅延理由の抜き出し
                 ->slck へpush

#GAS のコード

your web hook 部分にslack のweb hook 情報を入れて下さい。

```ruby:trainlate
function trainlate() {
  
  var currentDate = new Date();
  var weekday = currentDate.getDay();
  var date = Utilities.formatDate( currentDate, 'Asia/Tokyo', 'M月d日 HH時mm分');
  
  if (weekday == 0 || weekday == 6) {
    return;
  }
  var calendar = CalendarApp.getCalendarById('ja.japanese#holiday@group.v.calendar.google.com');
  if (calendar.getEventsForDay(currentDate, {max: 1}).length > 0) {
    return;
  }
  
  //keihintohoku line info
  var yahoodata = UrlFetchApp.fetch("https://transit.yahoo.co.jp/traininfo/detail/22/0/").getContentText();
  if(yahoodata.indexOf('現在､事故･遅延に関する情報はありません') > -1){
    // match the word
  }else{    
    //get error info
    var yahoodatastart = yahoodata.indexOf('og:description" content="');
    //4 japanese word only
    yahoodatastart += 25;
    var yahoodataend = yahoodata.indexOf('の情報です。');
    var yahoodataoutput = yahoodata.substring(yahoodatastart, yahoodataend);
    
    postMessage("\n" + "◆京浜東北線 " + date + yahoodataoutput + "\n",'your web hook');
  }
  
  
  //keikyuuhonsen line info
  var yahoodata2 = UrlFetchApp.fetch("https://transit.yahoo.co.jp/traininfo/detail/120/0/").getContentText();
  if(yahoodata2.indexOf('現在､事故･遅延に関する情報はありません') > -1){
    // match the word
  }else{    
    //get error info
    var yahoodatastart2 = yahoodata2.indexOf('og:description" content="');
    //4 japanese word only
    yahoodatastart2 += 25;
    var yahoodataend2 = yahoodata2.indexOf('の情報です。');
    var yahoodataoutput2 = yahoodata2.substring(yahoodatastart2, yahoodataend2);
    
    postMessage("\n" + "◆京急本線 " + date + yahoodataoutput2 + "\n",'your web hook');

  }
  
  
}


function postMessage(message, hookPoint){
  var payload = {
    "text": message,
  }
  var options = {
    "method": "POST",
    "payload": JSON.stringify(payload),
    "headers": {
      "Content-type": "application/json",
    }
  }
    var response = UrlFetchApp.fetch(hookPoint, options);
  
  if (response.getResponseCode() == 200) {
    return response;
  }
  return false;
} 
```

github
https://github.com/HaHatake/gas_trainlate

スケジュールに7-8時で、trainlate を実行すれば、ok!
これで、遅刻とはおさらばだぜ！
リモートデスクトップ先のUbuntuでVisual Studio Codeが動くようにする方法

### 本記事について
リモートデスクトップでUbuntuにアクセスして、Visual Studio Codeを動かそうとすると、「Xlib」関連のエラーがでて動きません。その対処方法は

- https://github.com/Microsoft/vscode/issues/3451

に記載されています。ここでは、その対処方法を簡単にまとめて転記したものです。

## 対処方法
```sh
sudo cp /usr/lib/x86_64-linux-gnu/libxcb.so.1 /usr/share/code/
sudo cp /usr/lib/x86_64-linux-gnu/libxcb.so.1.1.0 /usr/share/code/
sudo sed -i 's/BIG-REQUESTS/_IG-REQUESTS/' /usr/share/code/libxcb.so.1
sudo sed -i 's/BIG-REQUESTS/_IG-REQUESTS/' /usr/share/code/libxcb.so.1.1.0
```
Raspberry Piでpuppeteerを動かす方法

### 本記事について
Raspberry Piでpuppeteerを動かそうとするとエラーが出て動きません。その理由と対処方法は

- https://github.com/GoogleChrome/puppeteer/issues/550

に書かれています。ここでは、その理由と対処方法について簡単にまとめます。

## 理由と対処方法
- npmでpuppeteerをインストールすると、Chromiumも同時にインストールされ、デフォルトのpuppeteerはそのChromiumを使う
- インストールされるChromiumはx86用でARMのRaspberry Piでは動かない
- ARM用のChromiumをインストールして、puppeteerが使うブラウザをそのChromiumにする必要がある
- Raspberry Piで``$ apt-get install chromium`` でインストールされるChromiumはHeadlessモードで動かないので使えない
- https://launchpad.net/~canonical-chromium-builds で配布されているChromiumはHeadlessモードで動くので、そのChromiumをインストールしてpuppeteerで使用するようにする

## 手順
1. https://launchpad.net/~canonical-chromium-builds にアクセス
2. [stage for security updates]-[View package details]-[chromium-browser ～ ubuntu0.14.～]-[armhf]とたどる
3. 「chromium-browser\_<数値>\_armhf.deb」と「chromium-codecs-ffmpeg\_<数値>\_armhf.deb」をダウンロード
4. ダウンロードしたファイルを``$ sudo dpkg -i <ファイル名>``でインストール
5. インストールしたChromiumを使うようにpuppeteerを変更

```js
const browser = await puppeteer.launch({
    executablePath: '/usr/bin/chromium-browser',
    …
});
```

## 関連記事
- [	
RaspberryPiでpuppeteerを動かす方法](https://www.kwbtblog.com/entry/2019/01/23/032245)
CircleCIからCapistranoデプロイを実行する



# やりたいこと
- 自動テストがパスし、masterブランチだった場合は自動でデプロイを実行する

# 前提条件
- Ruby 2.4.0
- Rails 5.1.4
- Capistrano 3
- CircleCI 2

# Capistranoの設定

設定自体は[様々な記事で解説されている](https://qiita.com/naoki_mochizuki/items/657aca7531b8948d267b)ので他に譲るが，
デプロイ先のIPアドレスやSSHのパス指定は，環境変数で管理するようにした．

```ruby:config/deploy/production.rb
server ENV['SERVICE_NAME_PRODUCTION_IP'], port: 22, roles: [:app, :web, :db], primary: true

set :ssh_options, {
    forward_agent: true,
    user: fetch(:user),
    keys: ["#{ENV['SERVICE_NAME_PRODUCTION_SSH_KEY']}"]
}
```

ローカル環境からコマンドでデプロイできるようになる．

```bash
$ bundle exec cap production deploy
```

# CircleCI向けの設定

## デプロイ用のSSHの秘密鍵をCircleCIに設定

PERMISSIONS > SSH Permissions からデプロイで使用しているSSHキーの秘密鍵を登録する．

![image.png](https://qiita-image-store.s3.amazonaws.com/0/31862/29c803de-ca0d-8823-2c62-ee99eaa097a4.png)


## CircleCIに環境変数を設定

BBUILD SETTINGS > Environment Variables からCapistranoの設定ファイル内で参照している環境変数を登録する．
`SERVICE_NAME_PRODUCTION_SSH_KEY` には `~/.ssh/id_rsa` を設定する．

![image.png](https://qiita-image-store.s3.amazonaws.com/0/31862/7779bf99-3f6e-df44-615b-1dd6f5dd2c72.png)


## add_ssh_keys

deploy step に fingerprints の読み込みを記述する．

```.circleci/config.yml
      - add_ssh_keys:
          fingerprints:
            - "xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx"
```

https://qiita.com/maecho/items/f0445672c1c536a36e4c
CentOS 7 cmake 3.11.2のソースファイルからのインストール

# 動作確認環境
事情によりバージョンをダウングレードしました。新しいバージョンでも動作するはずです。

- 仮想環境 VMware Workstation Player 12.5.9
- OS Windows 10 Pro 64bit

# 仮想環境
- OS CentOS 7.4 (1708) minimalインストール
- メモリ 2GB
- HDD 250GB

# ダウンロード・展開
最新バージョンの確認
[Download | CMake](https://cmake.org/download/)

`/usr/local/src`ディレクトリに移動する。

````
cd /usr/local/src
````
ソースファイルをダウンロードする。

````
wget https://cmake.org/files/v3.11/cmake-3.11.2.tar.gz
````

ダウンロードしたファイルを展開する。

````
tar zxvf cmake-3.11.2.tar.gz
````
# コンパイル・インストール
展開したディレクトリに移動する。

````
cd cmake-3.11.2
````

コンパイル・インストール

````
./bootstrap --prefix=/opt/cmake --no-system-libs
make
make install
````
./bootstrapが成功すると最後に以下のような表示をする。

````
---------------------------------------------
CMake has bootstrapped.  Now run gmake.
````

# エラー対策
`./bootstrap`で`lib64`関連のエラーが発生した場合、共有ライブラリへの対策。
エラー内容。

````
/usr/local/src/cmake-3.11.1/Bootstrap.cmk/cmake: /lib64/libstdc++.so.6: version `GLIBCXX_3.4.20' not found (required by /usr/local/src/cmake-3.11.1/Bootstrap.cmk/cmake)
/usr/local/src/cmake-3.11.1/Bootstrap.cmk/cmake: /lib64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found (required by /usr/local/src/cmake-3.11.1/Bootstrap.cmk/cmake)
---------------------------------------------
Error when bootstrapping CMake:
Problem while running initial CMake
---------------------------------------------
````

`/etc/ld.so.conf`の編集

````
vi /etc/ld.so.conf
````
`/usr/local/lib64/`を追加し、更新コマンド`ldconfig`を実行する。

````
/usr/local/lib64/
````

この時点で`ldconfig`するとエラーが表示される。

````
ldconfig: /usr/local/lib64/libstdc++.so.6.0.25-gdb.py は ELF ファイルではありま せん - 先頭に誤ったマジックバイトを持っています。
````

対策を行う。（参照しないようにする）

````
mv /usr/local/lib64/libstdc++.so.6.0.25-gdb.py /usr/local/lib64/back.libstdc++.so.6.0.25-gdb.py
````

以上で`./bootstrap`が実行できる。

# 環境変数 PATH の設定
インストールしただけではcmakeが実行できないので、`/etc/bashrc`環境変数を設定する。

````
vi /etc/bashrc
````

`PATH=$PATH:/opt/cmake/bin`を追加し、コマンドを実行する。

````
PATH=$PATH:/opt/cmake/bin
source /etc/bashrc
````
# バージョン確認

````
cmake -version
````
以下のような内容が、表示される。

````
cmake version 3.11.2

CMake suite maintained and supported by Kitware (kitware.com/cmake).
````
# 参考
[MySQLのビルドに欠かせないCMakeを準備する：仕事で使える魔法のLAMP（45） - ＠IT](http://www.atmarkit.co.jp/ait/articles/1203/02/news117.html)
[CMakeインストールメモ(Hishidama's CMake install Memo)](http://www.ne.jp/asahi/hishidama/home/tech/cmake/install.html)
(

---
[目次](https://qiita.com/knutpb1205/items/3ece0cab588afdb13f02)
[SVN]ターミナルの基本コマンドメモ


ターミナルにてよく利用するコマンドのメモ

##sshコマンド - secure shell
接続先のIPアドレス・DNSアドレス・ホスト名 にsshで接続
ユーザー名[username]を指定してログイン
```$ ssh [username]@aaa.bbb.ccc.ddd ```
```$ ssh [username]@example.com ```

#svnコマンド - subversion
##co - checkout
リポジトリをチェックアウト先を指定してチェックアウト
```$ svn co [repositoryURL] [checkoutPath]```
リポジトリをカレントディレクトリにチェックアウト
```$ svn co [repositoryURL] .```

##status
更新されたファイルのの確認
```$ svn status```

##ci
コメント付きでコミット
```svn ci -m 'commitComment' [commitFileName or commitDirName]```

##log
カレントディレクトリのログを表示
```$ svn log```
カレントディレクトリのログを表示
```$ svn log```

##diff
カレントディレクトリの最後のコミットと作業用ディレクトリとの差分を表示
```$svn diff```
カレントディレクトリのリビジョン間の差分を表示
```svn diff -r r998:r999```

##pwdコマンド - print working directory
カレントディレクトリ（現在地）の確認

##cdコマンド - change directory
指定ディレクトリ[dirname]へ移動
```$ cd [dirName]```
カレントディレクトリからの移動（相対パス）
```$ cd [dirName]/[dirName]/```
上の階層へ移動
```$ cd ../```
ルートディレクトリへ移動
```$ cd /```
絶対パスでの移動
```$ cd /[dirName]/[dirName]/```
ホームディレクトリへ移動
```$ cd ~```
ホームディレクトリから指定での移動
```$ cd ~/[dirName]/[dirName]/```


##lsコマンド - list
ディレクトリ内のファイル閲覧
```$ ls```
更新日順に表示
```$ ls -tl```
隠しファイルをも全て表示
```$ ls -a```
ファイルの詳細も表示
```$ ls -l```
ファイルを一行で表示
```$ ls -1```

##mkdirコマンド - make directory
ディレクトリ[dirName]を作成
```$ mkdir [dirName]```

##rmコマンド - remove
ディレクトリ内のファイル[fileName]削除
```$ rm [fileName]```
-i(--interactive)削除前に確認メッセージを出す
```$ rm -i [fileName]```
-r(--recursive)ディレクトリも削除の対象とする
```$ rm -r [dirName]```
PHPによる関数の正しい比較

#PHPによる関数の正しい比較

　PHPにおいて、入力されたもの、データベースから返されたものを比較する正しい方法を解説します。
　



##関数による比較の種類
比較によく使われるPHPの関数は  

###is_numeric()
数値(文字列の数値も)がどうかをチェックする  

###is_null()
null(値を持たない)かどうかをチェックする

###empty()
空かどうかチェックする

###isset()
変数が存在するか、nullではないことをチェックする

###is_string()
文字列かどうかをチェックする

###is_int()
整数かどうかをチェックする

###is_array()
配列かどうかをチェックする

###count()
配列の要素数を数字で返す  
また、配列でもなくインターフェイスを実装したオブジェクトでもない場合、１と返される  
NULLの場合、0が返される




##比較

###is_nullとemptyの違い
|         | is_null | empty  |
| ------- | ------- | ------ |
|    ""   |  false  |  true  |
|   "0"   |  false  |  true  |
|    0    |  false  |  true  |
|   0.0   |  false  |  true  |
|  NULL   |  true   |  true  |
| array() |  false  |  true  |
| array(1)|  false  |  false |

表のように、0(文字列を含む)が入った場合と空の配列の時emptyはtrueにしてしまいます。  
よってis_nullの方がより細かい判定ができるということになります。


###is_nullとissetの違い
|         | is_null | isset  |
| ------- | ------- | ------ |
|    ""   |  false  |  true  |
|   "0"   |  false  |  true  |
|  NULL   |  true   |  false |
| array() |  false  |  true  |
| array(1)|  false  |  true  |

表のようにis_nullとissetは真逆になっていることがわかります。  
issetは空文字や空の配列であっても存在していることを示しています。よって、配列の存在判定をする際はis_array()でさらに要素があるかどうかを判定したい場合はcount()を使うといいと思います。

###is_nullと!isetの違い
変数の読み出しの点では動作が異なるが、null値かどうかを返す結果は同じです。


##3.大切なこと
　大切なことは返ってくるものの可能性を考えて使うことです。この表を見ても覚えられないので、混乱することもあるかもしれませんが、自分で実行した結果を見て比較することも大切だと思います。


##参考文献
[公式PHP Documentation](http://php.net/docs.php)
ゲストOSでPHPUnitを起動するときのデバッグ起動方法

# これのきっかけ

開発機がWindowsなので、実際の動作環境に合わせてvagrantでCentOSを建てApache,MySQL,etc等をインストールし、やった環境構築完了！と思っていた時期がありました。

```text:環境
[root@localhost /]# php -v
PHP 7.1.17 (cli) (built: Apr 25 2018 08:30:10) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache v7.1.17, Copyright (c) 1999-2018, by Zend Technologies
    with Xdebug v2.6.0, Copyright (c) 2002-2018, by Derick Rethans
```

```ini:/etc/15-xdebug.ini
; Enable xdebug extension module
zend_extension=xdebug.so
xdebug.remote_enable=true
xdebug.remote_autostart=1
xdebug.remote_connect_back=1
xdebug.remote_host=localhost
xdebug.remote_port=9000
xdebug.remote_handler=dbgp
```

これでWeb画面へアクセスすると、Windows側の9000番ポートで待ち受けしているエディタではブレイクポイントが利用できるようになります。
PHPUnitを使う場合、テストケースをある程度書いたら動作確認のためホストOS側のエディタから起動しますが、その場合ホストOS(=Windows)にもゲストOSと同じライブラリを用意しなきゃならないことに気が付き、ちょっと絶望したのでPHPUnitもゲストOSで実行することに。

# PHPUnitをゲストOSで起動する（デバッグ起動もする）

```php:RunTest.php
<?php
// 実行したいテストケースPHPへのパス
$testClass = $_GET['test_class'];
// vagrantで起動しているゲストOSから見たホストOSのIPアドレス
$host = `netstat -rn | grep "^0.0.0.0 " | cut -d " " -f10`;
$phpunit = "phpunitへのパス"
$bootstrap = "--bootstrap テスト準備.phpのパス";
shell_exec("XDEBUG_CONFIG='remote_host={$host}' phpdbg -qrr $phpunit $testClass $bootstrap");
```

CLIでデバッグする場合は`XDEBUG_CONFIG`を空でも良いので設定する必要があるため、ついでに`XDEBUG_CONFIG='remote_host={$host}'`でデバッグ情報がホストOSに送信されるようします。
後はRunTest.phpへHTTP.GETでテストクラスを渡して実行すれば、9000番ポートを使ってステップ実行ができるようになります。

# 参考
[Vagrantで、ゲストOSからホストのIPを取得する方法](https://qiita.com/ms2sato/items/a53ce0f48f08cfb839b8)
[PhpStormでVagrant上のCLIのPHPをXdebugする](https://qiita.com/tanakahisateru/items/4a186c3737215884d1a3)
nem catapult.server 実行１ とりあえず実行

<font color="red">こちらを使うことをおススメします。

https://github.com/tech-bureau/catapult-service-bootstrap</font>

# 前提

* OSはUbuntu16.04
* 公式githubの[catapult-server](https://github.com/nemtech/catapult-server)が、公式の手順にてビルドされていること
    * ただ、公式の手順は説明が少なすぎるので、ほかの方の記事を参考にしてください
* この手順は、最小限の実行を行います。
* ハーベストはできません。APIも使えません。

## catapult-serverのビルドについての情報

公式github
https://github.com/nemtech/catapult-server

@44uk_i3 さんの記事
https://qiita.com/44uk_i3/items/f4b510ed9227f4443ee7

@ryosasa さんの記事
https://qiita.com/ryosasa/items/f851518347f74836c9b8

海外の方
https://gitlab.com/he3labs-public/catapult-server-vagrant

テックビューロのgithub
https://github.com/tech-bureau/catapult-service-bootstrap


# 手順
* 開始ディレクトリは、`<catapult-server directory>/_build`


## resources

```
# cp ../resources/* resources/
```

## Create Nemesis Block
### mijin-test.properties


```
# cp ../tools/nemgen/resources/mijin-test.properties resources/
# vi resources/mijin-test.properties

cppFile = ../seed/mijin-test/MockMemoryBasedStorage_data.h
```

`MockMemoryBasedStorage_data.h`の使い道はわからない。


### hashes.dat

```
# mkdir -p seed/mijin-test/0000
# echo -n 6b23c0d5f35d1b11f9b683f0b0a617355deb11277d91ae091d399c655b87940d3f39d5c348e5b79d06e842c114e6cc571583bbf44e4b0ebfda1a01ec05745d43 > seed/mijin-test/00000/hashes.dat
```

`hashes.dat`に入れるべき値はおそらくなんでもよい。

### nemgen

```
# cd bin
# ./catapult.tools.nemgen ../resources/mijin-test.properties
# cd ../
```

### Copy

```
# mkdir -p data/00000
# cp seed/mijin-test/00000/* data/00000/
```

## Run

```
# cd bin
# ./catapult.server
```

# 関連

[nem catapult.server 実行２ ハーベストする](https://qiita.com/planethouki/items/c2fa3875a82c310376d4)
[nem catapult.server 実行３ catapult.restの実行](https://qiita.com/planethouki/items/066f65fcdeaf4bf68126)
C# 便利関数 ExecuteSync 多重実行防止

asp.netではリクエストはマルチスレッドでコールされますが、多重実行したくないときに、次の拡張関数に渡すことで多重実行を防げます。

```csharp

        public static void ExecuteSync(Action SynchronousAction, Action OnBlocked)
        {
            string appKey = "MyState";

            var app = System.Web.HttpContext.Current.Application;
            app.Lock();
            var state = app[appKey];
            if (state == null)
            {
                app[appKey] = new object();
            }
            app.UnLock();

            if (state != null)
            {
                OnBlocked();
                return;
            }

            try
            {
                SynchronousAction();
            }
            finally
            {
                app.Lock();
                app.Remove(appKey);
                app.UnLock();
            }
            return;
        }

```
【Mac OS】Railsで開発しているサービスにおけるPostgreSQLでよく使うコマンド

##開発環境
・Mac OS 10.12.6
・Rails 5.1.6
・PostgreSQL 10.1

##投稿の目的
- 投稿者はrailsで独学でサービス開発を始めたピチピチの文系大学生であり、今回Railsで開発をしている際にherokuにデプロイするタイミングで、SQLiteからPostgreSQLへの移行に苦しめられながらなんとか脱出しながらも、ローカルの開発環境もPostgreSQLに揃えようと試みる中で、慣れないpsqlの記法にハマった。
<br>

- そんな中で、Qiita上だけでも、PostgreSQLの導入方法、使用方法に関して、様々な投稿があるが、初心者に対しては少し省略されて書かれている感が強く、かなり時間をかけたという個人的な反省から、自分の復習も兼ねて、噛み砕いて整理することを目的とする。

##PostgreSQLでよく使うコマンド集
### ・brew install postgresql

Macで開発環境をそこまで触っていない人は、yumなどを使ってのinstallをするには環境設定は足りていないため、Homebrewを用いての導入が好ましい。
→[Homebrewの導入](https://qiita.com/yn01/items/2ea2a498b4a1eef7e1cd
)

### ・postgres --version

導入できたかどうかの確認も含めて、postgresqlのバージョンを確認しましょう。

ここで少しややこしいので一度整理をしておきますが、
>-psql
-pg_ctl
-postgres

の3つがコマンドの中で多発します。これを書いている自分も理解できていない部分もあるかもしれませんが、下記に整理をしてみます。

### ・psql 

[PostgreSQLのオフィシャルっぽい文書](https://www.postgresql.jp/document/9.3/html/index.html)には下記のように書いてあります。

>psqlとはPostgreSQLのターミナル型フロントエンドです。 対話的に問い合わせを入力し、それをPostgreSQLに対して発行して、結果を確認することができます。 また、ファイルから入力を読み込むことも可能です。 さらに、スクリプトの記述を簡便化したり、様々なタスクを自動化したりする、いくつものメタコマンドとシェルに似た各種の機能を備えています。

超簡単に言うと、普通に"SQL"の説明をしていて、データベースに入ったり、データベースから何かデータを取ってきたりっていうのをコマンドオプションとして指定できるツールということで、「データベースに何かアクションがしたいなぁ」と思った時はこのコマンドを使用することが多いようです。

※具体的な使い方(オプション等の付け方)に関しては、コマンドラインでpsql --helpで確認できます。

### ・pg_ctl

これもまた[PostgreSQLのオフィシャルっぽい文書]
(https://www.postgresql.jp/document/9.3/html/index.html)には下記のように書いてあります。

>pg_ctlはPostgreSQLデータベースクラスタの初期化、PostgreSQLのデータベースサーバ（postgres）を起動、停止、再起動する、あるいは稼働中のサーバの状態を表示するためのユーティリティです。 サーバは手動で起動することも可能ですが、pg_ctlは、ログ出力のリダイレクトや、ターミナルとプロセスグループの適切な分離などの作業をカプセル化してくれます。 さらにシャットダウン制御のための便利なオプションも提供します。

これは超簡単に言うと、PostgreSQLサーバの初期化、起動、停止、制御ができるコマンドです。
詳しくは[この記事](https://qiita.com/tstomoki/items/0f1a930bd42a8e1fdaac)を読んでもらえば分かりやすいかなと思うのですが、設定が必要です。でも、それさえしてしまえば、バックグラウンドで起動してくれるので、新しくタブを使わなくて大丈夫になります(何より、pg_ctl startで起動、pg_ctl stopで停止できるのが便利です)

順番的には、pg_ctl start → psql 〇〇 → psql 〇〇 →.... → pg_ctl stop みたいな順番で使うイメージです。

※具体的な使い方(オプション等の付け方)に関しては、コマンドラインでpg_ctl --helpで確認できます。

### ・postgres

こちらは**コマンド**ではありません。PostgreSQLのデータベースサーバーです。
実はデータベースに接続するためには、データベースサーバーという部分を通過することが求められます。

今作成しているクライアントアプリケーションがデータベースに接続するためには、稼働中のpostgresインスタンス(仮想サーバー)というものに接続をする必要があります。 その後、postgresは接続を取り扱うために別のサーバプロセスを開始します。

混乱の元凶は、最初にPostgreSQLのデータベースサーバー起動の際に、下記のようなコマンドを打つからだと思います。
>postgres -D /usr/local/var/postgres

これは、/usr/local/var/postgres というフォルダをデータベースクラスタを作成するディレクトリとして、そこに複数のデータベース格納領域を作ることを指し、つまり、/usr/local/var/postgresディレクトリ内のpostgresサーバーを起動するということです。
通常は1対1でデータベースサーバーとデータベースは対応しますが、複数のデータベースサーバーで1つのデータベースを管理する体制もデータベースクラスタの特徴らしいです(認識が間違っていたらすいません....)

ちなみに、これは、1つ前に紹介した、pg_ctl startと同じ作業です。違いがあるとしたら、上記はフォアグラウンドで起動しますが、下記はバックグラウンドで起動する点です。
起動の度に専用のタブを立ち上げるのは面倒なので、繰り返しになりますが、[この記事](https://qiita.com/tstomoki/items/0f1a930bd42a8e1fdaac)を参考に環境変数の設定を行いましょう。

※具体的な使い方(オプション等の付け方)に関しては、コマンドラインでpostgres --helpで確認できます。


### ・psql -l

-データベースを一覧表示してくれる

### ・psql  <データベース名>
-データベースへ接続

### ・\d
-テーブルを一覧表示してくれる

### ・\d <テーブル名>
-テーブルのカラムを一覧表示してくれる

### ・\du 
-ユーザーを一覧表示してくれる

### ・\q
-ログアウトする
Permissions for DB

Permissions for DB
================================

DB 

* Role
* Kinds of permissions for DB
* Setting/Deleting permissions

# Role
* Super user
** Has a mighty permission
** Creates general roles and their permissions

## Creation/Deletion of a role

```sql
CREATE ROLE|USER role [[WITH] attribute [...]];
```

```sql
ALTER ROLE role [[WITH] attribute [...]];
```

```sql
DROP ROLE|USER role [...];
```

Main attributes:
* LOGIN/NOLOGIN
* SUPERUSER/NOSUPERUSER
* CREATEDB/NOCREATEDB
* CREATEROLE/NOCREATEROLE
* [ENCRYPTED] PASSWORD ‘password.’


## Granting/Revoking permissions

```sql
GRANT permission ON object TO user;
```

```sql
REVOKE permission ON object FROM user;
```

### Examples
```sql
GRANT CONNECT ON DATABASE db00 TO dbtrainee;
```

```sql
REVOKE DELETE ON product FROM dbtrainee;
```
セキュリティ情報を適用中にエラーが発生しました。

お世話になっております。

WindowsServer2012R2を使用しております。

この前共有データを置いているUSB接続ハードディスクが破損しました。

そのためOSに元から載っていると予想される
WindowsServerバックアップ
でデータを戻したいと思います。

戻して見てみると
何かアクセス権が違うとの事なので
とりあえずアクセス権を全部削除して
アクセスする人を付与したつもりです。

ですが
サーバーマネージャー＞ファイルサービスと記憶域サービス＞共有
プロパティ＞アクセス許可＞アクセス許可をカスタマイズ＞追加
として何かユーザーを追加して
適用としても
```
”セキュリティの適用エラー”
　セキュリティ情報を適用中にエラーが発生しました：
F:hoge\fuga

コンテナー内のオブジェクトを列挙できませんでした。アクセスが拒否されています。
```
と表示されます。

仕方がないので
共有フォルダ
F:hoge\fuga
の方からアクセス権を設定したら解決しましたっ＼(^o^)／

メモ表記失礼しますm(_ _)m
ネットスーパーの配達予定日時をカレンダーに自動登録する

# はじめに

重いもの（お米やお水など）を買う際はネットスーパーを利用しています。
きちんと受け取るためには、その配達予定時間に外出しないように気をつけなければいけません。

そこで、注文時に送信されるメールを解析して配達予定日時をカレンダーに登録するようなスクリプトを作成しました。

# イメージ
![](https://qiita-image-store.s3.amazonaws.com/0/104653/edc04e4a-e7f8-5401-c911-9b036fd327a8.png)

# 処理
GoogleAppsScriptで作成しました。

- トリガー: 5分ごと

```javascript
function main() {
  
  var predicate = function(thread) {
    return thread.getFirstMessageSubject() == "[ご注文確認]SEIYUドットコム";
  }
  var regex = new RegExp(/・お届け日時：([0-9]+\/[0-9]+\/[0-9]+) ([0-9]+)時([0-9]+)分～([0-9]+)時([0-9]+)分/);

  // カレンダーを取得
  var calendar = CalendarApp.getCalendarById('...@gmail.com');
  
  // スレッドを取得
  var threads = GmailApp.getInboxThreads().filter(predicate);
  threads.forEach(function(thread) {
    // メッセージを取得
    var messages = thread.getMessages();
    messages.forEach(function(message) {
      // 本文を取得
      var body = message.getPlainBody();
      
      // お届け日時を取得
      var match = body.match(regex);
      var date = match[1];
      var fromHour = match[2];
      var fromMinute = match[3];
      var toHour = match[4];
      var toMinute = match[5];
      
      // カレンダーに予定追加
      calendar.createEvent("[SEIYU]ネットスーパー",
                           new Date(date + " " + fromHour + ":" + fromMinute + ":00"),
                           new Date(date + " " + toHour + ":" + toMinute + ":00"));
      
      // メールを既読にする
      message.markRead();
    });
    // スレッドをアーカイブ
    thread.moveToArchive();
  });
}
```

# 動作確認

Googleカレンダーを確認します。
<img alt="" src="https://qiita-image-store.s3.amazonaws.com/0/104653/301fe6ee-3725-1627-a975-ef69dae02d4c.png">

Gmailの受信BOXも確認し、処理されていることを確認しました。

# 感想

通販サービスはほぼ必ず注文確認メールを送ってくれるので、応用すれば他通販でも出来そうです。
2018/05/23（水）の授業メモ

授業でした内容を自分のメモとして書き残します。

---

2018/05/23（水）の授業の一部

ソースコード管理サービス「 GitHub 」
「 Sourcetree 」の使用方法について

---

■ Sourcetree を使用する上で知っておくべき単語など

**リポジトリ**
貯蔵庫、保管場所

**fork（フォーク）**
ある人が作ったファイルを自分のところに持ってくる（複製？）

**clone（クローン）**
ある人が作ったファイルを自分のところにダウンロード？

**ブランチ**
一つのファイルを並行して作業する

**マージ**
ブランチしたファイルを結合する

**コンフリクト**
マージした際に変更箇所が衝突すること

**プッシュ**
編集したファイルを Web 上にアップロード

-- その他メモ --
ステージング ⇒ コミット
拡張子「 .md 」……マークダウンファイル

WinMerge
・ 以前は二つのファイルの比較しかしていなかったが、今日の授業で三つのファイルの比較をした。
・左から、
「 正しいファイル、ほぼ正しいとされるファイル、間違いファイル 」
の順で並べると良い
・ [ 設定 ] から、スペースの有無や英字の大小の切り替え比較が出来る

---

最後までお読みいただきありがとうございました。
Golang: PostgreSQL のデータを削除 (Delete)

次のプログラムで作成したデータを削除します。
[Golang: PostgreSQL のデータを作成 (Create)](https://qiita.com/ekzemplaro/items/54a83c130a5b62e2e88b)

```golang:postgre_delete.go
// ----------------------------------------------------------------
//
//	postgre_delete.go
//
//					May/23/2018
//
// ----------------------------------------------------------------
package main

import (
	"fmt"
	"os"
	"database/sql"
	_ "github.com/lib/pq"
)

// ----------------------------------------------------------------
func main() {
	fmt.Println ("*** 開始 ***")
	key_in := os.Args[1]

	fmt.Printf ("key_in = %s\n" , key_in)

	str_connect := "user=scott dbname=city password=tiger123 sslmode=disable"

	db, err := sql.Open ("postgres", str_connect)
	defer db.Close ()

	sql_str := "delete from cities WHERE id = '" + key_in + "'"
	fmt.Println (sql_str)
	_, err = db.Exec (sql_str)

	if err != nil {
		fmt.Println(err)
		}

	fmt.Println ("*** 終了 ***")
}

// ----------------------------------------------------------------
```

## 実行の準備

```bash
go mod init delete
go mod tidy
```

>go.mod go.sum が作成される。

## 実行コマンドの例

```bash
go run postgre_delete.go t3467
```
クラスの作成、テキストファイル作成、ちょっと聞きたいこと

![image.png](https://qiita-image-store.s3.amazonaws.com/0/249283/44e5db4a-a55c-a60b-e6db-d673aa62aec4.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249283/750b48e7-24c0-a6db-3ab7-e8a67ecbbf5d.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249283/599e3541-3f2e-d71d-1c85-8b9b2214e595.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249283/b9e75593-848c-befa-f2cf-30c53e50656a.png)
今日はvisualstudioでテキストテンプレートを使いソースコードをうちました。
初めてテキストテンプレートを使ったので大変でした。普段やっていることじゃなかったので時間がかかりました。エラーが出たところはどこが間違っているのかがわからなくて苦戦しました。

プロのプログラマーさんって普段どうやって勉強しているか教えてください。
どうやったら内容が覚えていけたりしたり、資格が取れるのか教えてください。
僕は覚えるのが得意系ではありません。
Golang: PostgreSQL のデータを更新 (Update)

次のプログラムで作成したデータを更新します。
[Golang: PostgreSQL のデータを作成 (Create)](https://qiita.com/ekzemplaro/items/54a83c130a5b62e2e88b)

## プログラム

```golang:ostgre_update.go
// ----------------------------------------------------------------
//
//	postgre_update.go
//
//					May/23/2018
//
// ----------------------------------------------------------------
package main

import (
	"fmt"
	"os"
	"strconv"
	"time"
	"database/sql"
	_ "github.com/lib/pq"
)

// ----------------------------------------------------------------
func main() {
	fmt.Println ("*** 開始 ***")
	key_in := os.Args[1]
	population_in,_ := strconv.Atoi (os.Args[2])

	fmt.Printf ("key_in = %s\t" , key_in)
	fmt.Printf ("population_in = %d\n" , population_in)

	str_connect := "user=scott dbname=city password=tiger123 sslmode=disable"
	db, err := sql.Open("postgres",str_connect)
	defer db.Close()

	today := get_current_date_proc ()

	fmt.Println (today)

	sql_str := "update cities set population ='"
	sql_str += strconv.Itoa(population_in) + "',date_mod = '"
	sql_str += today + "' where id = '" + key_in + "'"
	fmt.Println(sql_str)

	_, err = db.Exec(sql_str)

	if err != nil {
		fmt.Println(err)
		}

	fmt.Println ("*** 終了 ***")
}

// ----------------------------------------------------------------
func get_current_date_proc () string {
	now := time.Now ()
	fmt.Printf ("%s\t" ,now)
	fmt.Printf ("%d-%d-%d\n" ,now.Year (),now.Month(),now.Day())
	today := strconv.Itoa (now.Year()) + "-" +
		fmt.Sprintf ("%d",now.Month()) + "-" +
		strconv.Itoa (now.Day())

	return	today
}

// ----------------------------------------------------------------
```

## 実行の準備

```bash
go mod init update
go mod tidy
```

>go.mod go.sum が作成される。

## 実行コマンドの例

```bash
./postgre_update t3465 2453100
```
CentOS 7 gcc 8.1.0のソースファイルからのインストール

# 動作確認環境
事情によりバージョンをダウングレードしました。新しいバージョンでも動作するはずです。

- 仮想環境 VMware Workstation Player 12.5.9
- OS Windows 10 Pro 64bit

# 仮想環境
- OS CentOS 7.4 (1708) minimalインストール
- メモリ 2GB
- HDD 250GB

# ダウンロード・展開
最新バージョンの確認
[GCC, the GNU Compiler Collection - GNU Project - Free Software Foundation (FSF)](https://gcc.gnu.org/)

`/usr/local/src`ディレクトリに移動する。

````
cd /usr/local/src
````
ソースファイルをダウンロードする。

````
wget http://ftp.tsukuba.wide.ad.jp/software/gcc/releases/gcc-8.1.0/gcc-8.1.0.tar.gz
````

ダウンロードしたファイルを展開する。

````
tar zxvf gcc-8.1.0.tar.gz
````
# コンパイル・インストール
展開したディレクトリに移動する。

````
cd gcc-8.1.0
````

CとC++をコンパイル・インストール

````
./contrib/download_prerequisites
mkdir build
cd build
../configure --enable-languages=c,c++ --prefix=/usr/local --disable-bootstrap --disable-multilib
make
make install
````

# エラー対策
`libstdc++.so.6.0.24`のエラーが発生する場合、以下のようにする。
`libstdc++.so.6.0.24-gdb.py`のファイル名を変更する。（参考しないようにする）

````
mv /usr/local/lib64/libstdc++.so.6.0.24-gdb.py /usr/local/lib64/back.libstdc++.so.6.0.24-gdb.py
````
`/usr/local/lib64`ディレクトリを参照するよう`/etc/ld.so.conf.d/`に追加する。

````
echo '/usr/local/lib64' > /etc/ld.so.conf.d/local-lib64.conf
````

# バージョン確認
gccのバージョン確認は`gcc --version`で表示される。

````
gcc (GCC) 8.1.0
Copyright (C) 2018 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
````
g++のバージョン確認は`g++ --version`で表示される。

````
g++ (GCC) 8.1.0
Copyright (C) 2018 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
````

# 参考
[Cコンパイラーインストールメモ(Hishidama's C compiler install Memo)](http://www.ne.jp/asahi/hishidama/home/tech/c/install.html)
[Centos7 编译安装 Nginx Mariadb Asp.net Core2 (实测 笔记 Centos 7.3 + Openssl 1.1.0f + Mariadb 10.2.7 + Nginx 1.12.1 + Asp.net. Core 2 ) - vicowong - 博客园](http://www.cnblogs.com/vicowong/p/7234714.html)

---
[目次](https://qiita.com/knutpb1205/items/3ece0cab588afdb13f02)
Golang: PostgreSQL のデータを読む (Read)

次のプログラムで作成したデータを読みます。
[Golang: PostgreSQL のデータを作成 (Create)](https://qiita.com/ekzemplaro/items/54a83c130a5b62e2e88b)

## プログラム

```golang:postgre_read.go
// ----------------------------------------------------------------
//
//	postgre_read.go
//
//					May/23/2018
//
// ----------------------------------------------------------------
package main

import (
	"fmt"
	"database/sql"
	_ "github.com/lib/pq"
	"os"
)

// ----------------------------------------------------------------
func main() {
	fmt.Fprintln (os.Stderr,"*** 開始 ***")
	db, err := sql.Open("postgres", "user=scott dbname=city password=tiger123 sslmode=disable")
	defer db.Close()

	sql_str := "select id,name,population,date_mod from cities order by id"

	rows, err := db.Query(sql_str)
	if err != nil {
		fmt.Println(err)
		}
	defer rows.Close()

	for rows.Next() {
		var id string
		var name string 
		var population int
		var date_mod string 
	    if err := rows.Scan(&id,&name,&population,&date_mod); err != nil {
			fmt.Println(err)
		}
		fmt.Printf ("%s\t%s\t%d\t%s\n",id, name,population,date_mod)
	}

	if err := rows.Err(); err != nil {
		fmt.Println(err)
		}

	fmt.Fprintln (os.Stderr,"*** 終了 ***")
}

// ----------------------------------------------------------------
```

実行の準備

```bash
go mod init read 
go mod tidy
```

> go.mod go.sum が作成される。

実行コマンド

```bash
go run postgre_read.go
```
Google Play Developer API を使用してAndroidのin-app billingのレシート検証を行う（メモ）

# Google Play Developer APIを使ってレシート検証

※完全に個人的な備忘録のため、内容は新しくないし、そもそも書いている時点でもベストなものでない可能性があります。

## 前提
・in-app billingにて消費型アイテムを販売した際のレシート情報が正しいかを検証する
・レシート情報の取得等は既に実装できている

## 準備
1. デベロッパーコンソールに契約アカウントでサインインし、デベロッパーアカウント -> APIアクセス
2. Google Play Android Developerのリンクを行う
3. OAuth クライアントを作成する
4. Google Developers Consoleにて作成したクライアントのクライアントID、シークレットを確認

## OAuth認証
ブラウザにて下記URLにアクセス

```
https://accounts.google.com/o/oauth2/auth?scope=https://www.googleapis.com/auth/androidpublisher&response_type=code&access_type=offline&redirect_uri=http://localhost&client_id=<準備.4で確認したクライアントID>
```

Googleのアカウントリンク画面が出るので許可する

http://localhost/?code=4/AACyzBvuCgBZQKv8VKPvCQl5Szt6U47GClAPLk0qTuItTUmUoFKJWqUfSyJN2bTCqLDXXXXXXXXXXXXXXXXXXXX#
のようなURLにリンクされるので、code=の部分を取得

## アクセストークン取得
POSTリクエストのためCurlで実行

```bash

$ curl -v -X POST 'https://accounts.google.com/o/oauth2/token' -d 'grant_type=authorization_code&code=<上記OAuth認証で取得したCode#まで>&client_id=<準備.4で確認したクライアントID>&client_secret=準備.4で確認したクライアントシークレット>&redirect_uri=http://localhost'
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/138161/340f2d7e-eca5-660b-54dc-614d46c448bd.png)

上記のような結果が返るので、access_token / refresh_token を確認しておく

## レシート検証
やっと本題

レシート情報から、
・packageName
・productId
・purchaseToken
を確認しておく

とりあえずまずは検証を手動で。。。

```bash
$ curl -v 'https://www.googleapis.com/androidpublisher/v3/applications/<packageName>/purchases/products/<productId>/tokens/<purchaseToken>?access_token=<アクセストークン取得で取得したaccess_token>'
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/138161/41b2aa19-8113-09fb-f0eb-054a7219a806.png)

上記のような結果が返ってきたらOK

結果の詳細は https://developers.google.com/android-publisher/api-ref/purchases/products#resource
要するに、
consumptionState：1
developerPayload：決済時に送信したペイロードと一致しているか
purchaseState：0
あたりを確認して検証したら良さそう

ここまで確認したら、同様の処理を実装する訳ですが、
問題はaccess_tokenが取得から1時間で有効期限切れしてしまいます。

## access_tokenの更新

```bash
$ curl -v -X POST 'https://accounts.google.com/o/oauth2/token' -d 'grant_type=refresh_token&client_id=<クライアントID>&client_secret=<クライアントシークレット>&refresh_token=<アクセストークン取得時に確認したrefresh_token>'
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/138161/ac74b18d-7ab6-19cf-9aed-b4e38df2dd34.png)

新しいaccess_tokenが取得できます

## 実装フロー

上記を踏まえて

1. レシート情報の取得
2. access_tokenの更新
3. レシート検証
4. アイテム付与

という流れを実装することで良さそうです。


## 参考
https://groups.google.com/forum/#!topic/android-group-japan/jaaIGAl2lPE
http://d.hatena.ne.jp/fkm/20130504
https://developers.google.com/android-publisher/api-ref/purchases/products
Firefox OS ビルド手順 (Nexus S)

# はじめに
**注意: 自サイトに置いていた記事をこちらに移動しただけです。最新情報ではありません。**

このページは Firefox OS の Nexus S 向けビルド手順について記載しています。

# 必要事項
下記手順にて作業するためには以下の 2 つが必要です。

* Nexus S
* Ubuntu 12.04 (32bit)

# Android 4.0 を焼く

以下 Ubuntu にて作業します。

## USB の設定
udev が Nexus S を認識できるようにしておきます。

```
$ sudo vi /etc/udev/rules.d/51-android.rules
SUBSYSTEM=="usb", ATTRS{idVendor}=="18d1", MODE="0666", GROUP="plugdev"
```

## adb のインストール
Android の adb をインストールし adb へのパスを通しておきます。

## バックアップ
Nexus S のファームウェアやデータを消してしまうので、必要であればデータを下記コマンドでバックアップしておきます。

```
$ adb pull /system ./nexus_s_backup/system
$ adb pull /data ./nexus_s_backup/data
$ adb pull /vendor ./nexus_s_backup/vendor
```

## ファームウェアの更新
手持ちの Nexus S の型番向けのAndroid 4.0.xをダウンロードします。
ここでは Nexus S i9023 を対象として説明していきます。
ダウンロードしたファイルを解凍します。

```
$ tar xzf soju-imm76d-factory-ca4ae9ee.tgz
$ cd soju-imm76d/
```

ここで USB に Nexus S を接続します。下記コマンドでファームウェアを更新します。

```
$ adb reboot-bootloader
$ ./flash-all.sh
```

# Firefox OS をビルドする
以下 Ubuntu にて作業します。

## パッケージのインストール
下記コマンドで必要なパッケージをインストールします。

```
$ sudo apt-get install autoconf2.13 git ccache gcc g++ g++-multilib bison flex make curl bzip2 zlib1g-dev libncurses5-dev libusb-1.0-0-dev
```

## ソースコードのダウンロード
下記手順でソースコードをダウンロードします。

```
$ git clone git://github.com/mozilla-b2g/B2G.git
$ cd B2G/
```

下記コマンドを実行するとダウンロードが始まります。通信環境によっては時間が掛かります。

```
$ ./config.sh nexus-s
```

Nexus S の画面幅向けに下記の設定を行ないます。

```
$ vi .userconfig
export HIDPI=1
```

Gaia を最新にします。

```
$ cd gaia
$ git checkout -b master mozillaorg/master
```

## ビルド
Nexus S からファイルを抜き出すので Nexus S を挿した状態で実行します。 -j の後の数字は CPU の個数を記載します。
参考までに Core i7 3770 では 20 分掛かりました。

```
$ ./build.sh -j8
```

下記コマンドで書き込みを行ないます。

```
$ ./flash.sh
$ ./flash.sh gaia
```
ゲームオーバー表示

unity始めたばかりの初心者です。

public class Title : MonoBehaviour {

    int status;

    // Use this for initialization
    void Start () {
		
	}
	
	// Update is called once per frame
	void Update () {
        if (Input.GetKeyUp(KeyCode.Space) && status == 0)
        {
            status = 1;//ゲーム中
            title.gameObject.SetActive(false);
        }
        else if (transform.position.y <= -140.0f)
        {
            status = 2;//ゲーム終了
            title.text = "GAME OVER";
            title.color = Color.yellow;
            title.gameObject.SetActive(true);

        }
        }
}
上のコードでtitleの部分がエラーを起こしていますが、理由がわかりません。どうしたらいいのか教えてください。
webpack でビルドしていたプロジェクトを docker に移す

開発環境で動いている `webpack -w` を docker-compose に移す。webpack-serve による auto-reload は今回頑張らない。

こういう構造

```
.
├── README.md
├── docker-compose.yml
└── front
    ├── package.json
    ├── src
    │   ├── index.html
    │   └── index.js
    ├── webpack.config.js
    └── yarn.lock
```


```yml:docker-compose.yml
version: "3.4"
services:
  front:
    image: node:8.11
    working_dir: /front
    command: yarn watch:dev
    restart: always
    volumes:
      - ./front:/front
      - node_modules:/front/node_modules
volumes:
  node_modules:
    driver: local
```

`docker compose up` で起動。 yarn は最近はnodeイメージに同梱されている。

最初はCOPYしていたが、頻繁に更新されるのとファイル監視のためにvolumesとしてマウントした。

最初は front/Dockerfile を置いていたが、最終的に何もしなくなったので、node の イメージをそのまま使うことにした。 node-alpine を使うか迷ったが、ネイティブプモジュールでハマる可能性があるのと、node_modules がどうせ肥大化しがちであんまり意味がないのでやめた。

front/node_modules はマウントしない。生成物はクロスプラットフォームなJSだが、 webpack などの ビルドツールはアーキテクチャ環境依存がある。(主にFS周り)

参考: https://shotat.hateblo.jp/entry/2016/12/01/221631

watch:dev タスクの中身。

```
  "scripts": {
    "watch:dev": "yarn install && yarn webpack --mode development -w",
    "build:prod": "NODE_ENV=production webpack --mode production"
  },
```

webpack -w は ブランチ切り替えで監視対象に大量に diff が出たときなどに落ちるので、 restart:always にしてある。

## 出力するだけのコマンド

開発環境ではサーバーを立てるか、デプロイ時などに吐き出したいときはこうする。

```
docker-compose run --rm front yarn build:prod
```

## webpack-serve を使う場合

最終的に実行されるタスクを webpack -w ではなく `webpack-serve` にして port 8080 と 8081 を解放する。ブラウザに 8081 はリロード命令を発行する websocket サーバーなので必要。
Object Creation

Object Creation
=========================

Authorized users are able to create following objects.

* Table
* View
* Index

# TABLE
## CREATE TABLE
```SQL
CREATE TABLE table (col1 type1 attr1 attr2, ...)
```

### Available types for PostgreSQL
* INTEGER
* FLOAT
* DOUBLEPRECISION
* CHAR(n)
* VARCHAR(n)
* DATE
* SERIAL

### Available attributes for PostgreSQL
* NOT NULL
* UNIQUE
* PRIMARY KEY
* FOREIGN KEY
* DEFAULT

### CREATE TABLE with a subquery
```sql
CREATE TABLE newp AS SELECT code, name FROM people;
```

### Example of CREATE TABLE
```SQL
CREATE TABLE people (code INT PRIMARY KEY,
							name VARCHAR(20) NOT NULL,
							addr VARCHAR(40),
							nationality VARCHAR(10) DEFAULT ‘japan’);
```

## ALTER TABLE
* Add/Delete columns
* Add/Delete attributes of a column
* Change data type of a column


```sql
ALTER TABLE table keywords
```

## DROP TABLE
```sql
DROP TABLE table;
```


# VIEW
Hide unnecessary information depending on users’ authentication.

* Simplify SELECT
* Add Confidentiability

```SQL
CREATE VIEW viewname(col1, ...) AS SELECT subquery;
```

## Example
```SQL
CREATE VIEW pprice(id, goods, sale) AS SELECT code, pname, price FROM product WHERE code <= 1000;
```

# INDEX
Make data retrieval faster with index _(not always efficacious.)_