OmniAICreator/Qiita-1.07M huggingface dataset:
EC-CUBE4で出荷CSV登録を使って出荷処理をする

今回はEC-CUBE4で出荷CSV登録を使って出荷処理をする方法です。

#そもそも出荷CSV登録を使った出荷処理とは
EC-CUBEで受注が発生した後、例えばヤマトさんに配送情報を連携して出荷処理をします。
その際に、お問い合わせ番号が出来ますよね。

その**お問い合わせ番号をEC-CUBE側に登録して、出荷のお知らせメールをユーザーに送るための処理**です。

# まずは管理画面から更新対象の受注を確認して出荷CSVを作成しよう
受注管理にて検索条件を設定して出荷対象の受注を検索します。

検索結果にて、**CSVダウンロード**という項目が表示されますので、こちらから**出荷CSV**を選択してダウンロードします。
![01_出荷CSVDL.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/422413/bcc4f85e-8c55-53ff-56c5-3a54a79249e6.png)


このCSVファイルの中の配送IDが出荷CSV登録にて使用する値となります。
![02_出荷CSV.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/422413/56a4b833-7711-c926-520f-4af26593746a.png)

出荷CSVの登録には、

・出荷ID(上記CSVファイルの配送IDがそれにあたります)
・お問い合わせ番号　※こちらの項目は任意
・出荷日(YYYY-MM-DD形式)

の項目が必要となります。
※**受注管理＞出荷CSV登録より雛形となるCSVファイルのダウンロードが可能**です。

その雛形をベースに作成したCSVがこちら。
![03_shipping.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/422413/ee293070-6bc4-0c48-43a1-e6e17523f0df.png)
※今回は見やすくするためエクセルで表示していますが、開いた際に勝手に値が変更してしまったりするため、別のエディターをオススメします。

今回はこの3つの受注に対して更新をかけます。

# 出荷CSV登録からデータを更新しよう
**受注管理＞出荷CSV登録**にて先ほど作ったCSVファイルを選択して、**一括登録を実行**してみましょう。
問題なく処理出来れば、下記の様に**CSVファイルをアップロードしました**という文言が表示されます。
![04_出荷CSV登録.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/422413/49d8dd3d-8224-259e-8c35-e730fde95578.png)

その次は**受注管理＞受注一覧**より確認です。
![05_発送済.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/422413/0177ae9d-e6cb-0862-dee2-9cef5f09a1a6.png)
対応状況が**発送済み**に変更され、**出荷状況、お問い合わせ番号**もCSVで登録した情報が適用されていることが確認出来ます。

さあ、最後は出荷お知らせメールの送信です。

# 出荷お知らせメールを送ろう
**受注管理＞受注一覧**の**詳細検索**の下の方に**出荷メール**という項目があります。
こちらの**未送信**にチェックを入れて検索しましょう。
![08_未送信.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/422413/34c03cec-931d-393d-9e5b-ed312f86d279.png)

そうすると、先ほど更新したデータが出てきました。
![09_未送信.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/422413/8cb12481-6685-6872-cdb8-18e26ec9e7d6.png)
一括操作の下の赤枠の部分にチェックを入れると、**メールする**というボタンが出てきますので、こちらをクリックです。

![10_出荷メール.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/422413/e82facc8-c35c-ec3d-c71a-33da0fe81c85.png)
ここから出荷メールの確認をした後、**送信**です。
お問い合わせ番号も入っていますね。

![11_出荷完了.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/422413/25544ab6-37fc-f00d-3cf2-ca7b5a7359f7.png)
出荷お知らせメールを送った受注に関しては、出荷状況にて**メールマーク**が表示されますので、こちらで**出荷CSV登録を使っての出荷処理は完了**です！
snmptrapd起動オプション

久しぶりにsnmptrapを受ける側のサーバの設定を行った。
昔からそうだったのかもしれないけど、/etc/snmp/snmptrapd.conf に起動オプション書くものだと思ってたけど違うようなので簡単にメモメモ。

### 環境
CentOS 7.6
net-snmp-5.7.2

### 起動オプションを書く


```code:/etc/sysconfig/snmptrapd
# snmptrapd command line options
# '-f' is implicitly added by snmptrapd systemd unit file
# OPTIONS="-Lsd"
OPTIONS="-m +ALL -Lsd -On -p /var/run/snmptrapd.pid"
```



### 参考

* [NET-SNMP](http://www.net-snmp.org/)
Visual Studio 2019で.NET Core 3.0 (Preview)を使うときの環境設定

# はじめに

2019/6/1時点で、[.NET Core 3.0](https://dotnet.microsoft.com/download/dotnet-core/3.0) はv3.0.0-preview5が最新として2019/5/6付けで公開されています。

正式なバージョンが公開されるのは2019年秋ごろになる予定で、それまではプレビュー版として試すことができます。

Visual Studio からプレビュー版の.NET Core SDKを使用する場合、設定が必要となりますが、公式にアナウンスされているほうほうだと「あれ？ないじゃん！」となる場合があるようなので、ここにメモします。

## プレビュー版でない Visual Studio 2019 の場合

プレビュー版でないVisual Studio 2019で.NET Core 3.0を新規プロジェクトやNuGetで使おうとすると、「プロジェクトおよびソリューション」→「.NET Core」に設定があるとメッセージボックスが表示されます。
しかし、ここを見ても設定が表示されていないことがあるようです。

以下はVS2019 16.1.1の画面。
![vs2019ent_netcore.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106819/99d15f19-478b-bfba-8428-02e96a3b300b.png)

正しい設定項目がある場所は、「環境」→「プレビュー機能」のようで、
「.NET コア SDK のプレビューを使用する」という項目があります。

![vs2019ent_netcore_preview.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106819/8aa7a6ba-00cf-a476-2af9-de9756c15ff8.png)

「.NET コア SDK のプレビューを使用する」にチェックを入れて、VS2019を再起動すると、設定が反映されて.NET Core 3.0 のプロジェクト作成などができるようになります。

## プレビュー版の Visual Studio 2019 の場合

プレビュー版のVS2019だと、最初から使えるようになっているようです。

以下はVS2019 16.2.0 preview 1.0の画面。
![vs2019entpreview16.2.0-2_netcore.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106819/0d8a9e2c-1a20-f63e-9cf1-991d28688d50.png)

# さいごに

公式にアナウンスしてほしい・・・
IBM Cloud Virtual Private Cloud (VPC) の設定方法

#IBM Cloud Virtual Private Cloud (VPC) の詳細
以下を参照

https://www.ibm.com/blogs/solutions/jp-ja/introducing-ibm-cloud-virtual-private-cloud/

#設定概要

1)ネットワーク（Virtual Private Cloud)を作る
2)SSHログオンのためのSSH keyを作成しポータルへ登録
　仮想サーバ作成後では登録ができない（確認中）
3)仮想サーバを作成
 必ずSSHKeyが選択されていること
　NICは１つ（プライベートのみ）
4)フローティングIP(Global IP)の予約
　既存の仮想サーバーとフローティングIPを結びつける
5)仮想サーバへログイン
　上記紐づけたグローバルIPに対しSSH　Keyを指定しログイン
　IDはroot
　パスワード不要
6)セキュリティ設定
　VPC(NW)に対し効かせている（サーバ単位ではない）
　ポータル側でインバウンドはポート２２のみ空いている。
　SSHサーバーポート番号変更や、Webサーバー、ZABBIXAgentを入れる場合は設定追加が必要
  設定箇所

「VPC on Classic」ーネットワークー「VPC（仮想プライベート・クラウド ）」ー「デフォルト・セキュリティー・グループ」
Java基本データ型と参照型メモリについて

今回は、基本データ型と参照型メモリについて勉強しました！
**１基本データ型とは？**
（boolean,byte,char,short,int,float,long,double）8種類

![基本データ型.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427747/461c0ce7-96bb-a632-00b3-3c9f7c041ad4.png)

**２参照型とは？**
（String,配列,class）上記の8種類以外
少しややこしいです。

![参照型.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427747/1b309061-5848-e9f6-6ad7-bfc2bee71df2.png)


このような形になります。
Python関連で読んだ本

### みんなのPython 第4版
https://www.amazon.co.jp/dp/479738946X/
初めて読んだのは、第1版の1刷目とか。
Python3エンジニア認定基礎試験を受けるために久々に購入した。
入門書には最適だろう。

### Python チュートリアル
https://www.amazon.co.jp/dp/4873119359
Python3エンジニア認定基礎試験の参考図書のため購入
試験内のプログラムの穴あけ問題は、この本から出る。

WEBページがあるから、こちらを読むでもよい
https://docs.python.org/ja/3/tutorial/

### 入門 Python 3
https://www.amazon.co.jp/dp/4873117380/
上記2冊を読んだ後あたりに読むとよい。
厚い。多分入門書はこれだけ手元にあればよい。

### テスト駆動Python
https://www.amazon.co.jp/dp/4798157600/
Pytestの使い方集。
公式サイトが英語のみなので、日本語で書かれていることに価値あり。
Python使って開発するときにデスクにあると助かりそう。
https://docs.pytest.org/en/stable/

- エキスパートPythonプログラミング改訂2版
https://www.amazon.co.jp/dp/4048930613/

- Pythonプロフェッショナルプログラミング 第3版
https://www.amazon.co.jp/dp/4798053821/

- Effective Python ―Pythonプログラムを改良する59項目
https://www.amazon.co.jp/dp/4873117569/
SeleniumとPythonを用いて複数のウェブサイトをPDF保存

# 1) ChromeDriverのダウンロード
1. 自分の使っているGoogle ChromeでブラウザのツールバーにあるChromeメニュー(点が縦に３つ並んでいるもの)をクリックします。[ヘルプ]から[Google Chromeについて]を選択し、バージョンを確認します。
1. 同じバージョンのChromeDriverを http://chromedriver.chromium.org/downloads からダウンロードします。  
  - (注) ここで最新版を選んでしまうとサポートされていないことがあるので、自分が使っているものと同じものを選んでおくのが無難です。筆者の場合、当時(2019/5/27)バージョン75を最初にインストールしてしまって失敗しました。  
  - (注) 他の方法は[Python + Selenium で Chrome の自動操作を一通り](https://qiita.com/memakura/items/20a02161fa7e18d8a693)が参考になります。今回はバイナリファイルをPythonプログラムと同じフォルダにおいていますが、そうしない方法もあるようです。

# 2) seleniumのインストール
`pip install selenium`で導入できます。

# 3) コード
### rpa.py 
```python
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import json
import os
from selenium import webdriver

# アドレスの設定
addrs=[
'https://example.com/page1.html',
'https://example.com/page2.html',
'https://example.com/page3.html'
]

# 実際に実行する関数と補助関数
def dl_pdf(addr):
    driver.get(addr)
    driver.execute_script('return window.print()')

def main(addrs):
    for addr in addrs:
        dl_pdf(addr)


# Google Chrome Driverの設定
chopt=webdriver.ChromeOptions()
appState = {
    "recentDestinations": [
        {
            "id": "Save as PDF",
            "origin": "local",
            "account":""
        }
    ],
    "selectedDestinationId": "Save as PDF",
    "version": 2
}

prefs = {'printing.print_preview_sticky_settings.appState': 
json.dumps(appState)}
chopt.add_experimental_option('prefs', prefs)
chopt.add_argument('--kiosk-printing')
driver = webdriver.Chrome(executable_path='./chromedriver',options=chopt)

# 実行部
if __name__ == '__main__':
    main(addrs)

```
### フォルダ内の構造
```
.
├── chromedriver
└── rpa.py
```
`python rpa.py`でこのコードを実行すると、デフォルトのダウンロード先(筆者の場合`~/Downloads`)にPDFファイルが保存されます。ダウンロード先を変更することもこのコードを書き換えればできるはずです。

## ハマったところ・重要なところ
1. `account:""`が印刷先をPDFに設定するために必須です。この設定が必要なのを見つけるのに随分時間を空費しました。
1. `chopt.add_argument('--kiosk-printing')`は印刷画面が開いたときに印刷ボタンを自動で押させる設定です。

## 拡張
ghostscriptを用いると、作成したPDFをかんたんに結合できます。

```
gs -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=output.pdf input1.pdf input2.pdf
```

のようなコマンドです。[コマンドラインでpdfを連結する方法](https://qiita.com/oppminmin/items/1259e74a783aa2ca94b4)を参考にしました。

# 4) 注意点
有料ジャーナルなどでこのプログラムを使用してはいけません。すぐ止められてしまいます。このプログラムを使用して起きた損害については一切責任を負いません。
ZABBIX Agentだけ入れる場合

#Zabbix導入のためのrpmファイルをインストールする

rpm -ivh https://repo.zabbix.com/zabbix/4.2/rhel/7/x86_64/zabbix-release-4.2-1.el7.noarch.rpm

#Agentを導入する
yum -y install zabbix-agent
yum -y install zabbix-get

#Configの変更
ZABBIXサーバーのIPを登録する

#サービス開始
systemctl start zabbix-agent

#サービス自動起動設定
systemctl enable zabbix-agent
ω分で作る無料のジオコーディングAPI with Google Apps Script

小ネタです。

[3 分で作る無料の翻訳 API with Google Apps Script](https://qiita.com/tanabee/items/c79c5c28ba0537112922)という記事をみて、

Google翻訳のAPIが作れるのなら、ジオコーディングのAPIも作れるのでは？
と思って適当にちょこっと改変してみたらできました。どうぞ。

```javascript
function doGet(e){
  var p = e.parameter;
  var response = Maps.newGeocoder().geocode(p.location);
  var result = response.results[0];
  return ContentService.createTextOutput(result.geometry.location.lat + " " + result.geometry.location.lng);
}
```

## 参考文献
[3 分で作る無料の翻訳 API with Google Apps Script](https://qiita.com/tanabee/items/c79c5c28ba0537112922)
Goといえばチャネルでしょ！！！　第3弾

###第三弾？###
前回のやつはこれ
[Goroutine](https://qiita.com/besood/items/fe48f295c2e1816f5a14)を触った。
今回はタイトル通りチャネルを触っていこうと思う

###channelとは###
並列処理を行った結果を呼び出し先の関数に返すことが出来る。
前回のモノで戻り値を返そうとするとエラーが起きる

###コード###

~~~Go
package main

import "fmt"

func channel(s []int,c chan int){
	sum:=0
	for i:=0;i<5;i++ {
		sum += s[i]
	}
	c <- sum
}

func main(){
	s := []int{1,2,3,4,5}
	c := make(chan int)
	go channel(s,c)
	r := <-c
	fmt.Println(r)
}
~~~
####解説####
#####func main()#####

- １～５の数字の入ったスライスを作りこれを**s**で宣言する
- そしてmakeで**chan int**で戻り値の値を設定しチャネルとして**c**を宣言する
- そして並列処理のために**go**を記入し、引数にスライスとチャネルを入れる
- Go to channel
- そしてchannelから**c**が送られてきたので**r**で受け取る。

#####func channel()#####

+ 並列処理によりスレッドぐ作られ、この関数がスタートする
+ 引数のスライスを足していき結果を**c**のチャネルに送信する。
+ その時の記号は　**<-** である。 

###最後に###
解説が見にくくなってしまった許してください。
次回はBuffer channelでーす。
AWS LambdaでNokogiriを動かす

近々、AWS Lambdaを使って簡易的なクローラを作る予定があったので
**Lambda上でNokogiriが使えるか** 検証しました。

## 開発環境

ローカルの開発環境はMac、クローラはRubyで実装します。

## ポイント

クローリングに必要となるGemである「Nokogiri」はネイティブライブラリを含むGemであるため、
Mac上でビルドしてAWSへデプロイすると「`cannot load such file -- nokogiri`」が発生します。

これを回避するため、AWS SAMを用いて雛形作成した上で、
「`sam build --use-container`」を実行しAmazonLinux2のDockerコンテナ上でビルドを行いました。

## AWS SAM CLIでHello World

AWS SAM CLIを使ってRubyのLambdaハンドラの雛形を作成します。
アプリの名前が実際に作ろうとしているクローラの名前になっていますので、適宜置き換えてください。

```bash
$ sam init --runtime ruby2.5 --name sample_app
$ cd sample_app
$ sam build
$ sam local invoke HelloWorldFunction --event event.json
```
参考: https://aws.amazon.com/jp/about-aws/whats-new/2018/04/aws-sam-cli-releases-new-init-command/

## Nokogiriのインストール

今回はLambda上でスクレイピングツールであるNokogiriを動かす必要があります。
このGemはネイティブライブラリが含まれるため、ローカル環境(今回はMac)でインストールするとLambda上でエラーとなります。

が、AWS SAM CLIは以下コマンドでネイティブライブラリも含めて良い感じにビルドしてくれるコマンドを提供してくれています。便利ですね。

```ruby:hello_world/Gemfile
source "https://rubygems.org"

gem "httparty"
gem "nokogiri" # 追記
gem "robotex"  # 追記
```

追記先はルートのGemfileではありませんので注意してください。
`cannot load such file -- nokogiri` が起こる原因となります。

## Nokogiriを使うLambdaハンドラを実装

動作確認のためLambdaハンドラの処理も修正します。

```ruby:hello_world/app.rb
require "bundler/setup"
Bundler.require

URL='https://www.google.com/'

def lambda_handler(event:, context:)
  charset = nil

  robotex = Robotex.new
  robotex.allowed?(URL)
  robotex.delay!(URL)

  html = open(URL) do |f|
    charset = f.charset
    f.read
  end

  doc = Nokogiri::HTML.parse(html, nil, charset)

  {
    statusCode: 200,
    body: {
      page_title: doc.title,
    }.to_json
  }
end

```

## ローカルの開発環境で動作確認

ビルドして実行してみましょう。
GoogleのTOPページのタイトルが取得できました。

```bash
$ sam build --use-container
$ sam local invoke HelloWorldFunction --event event_file.json 
{"statusCode":200,"body":"{\"page_title\":\"Google\"}"}
```

## デプロイ

AWS SAM CLIを使ってデプロイします。

```bash
$ sam package --output-template-file output.yaml --s3-bucket sample_app
$ sam deploy --template-file output.yaml --stack-name sample_app --capabilities CAPABILITY_NAMED_IAM
```

ただし、 `sam package` に `--template-file` オプションを指定すると、vendor配下がアップロードされない問題が発生しました。 `--template-file` は設定しないようにしましょう。

AWSコンソールにログインして、Lambdaを実行すると無事成功しました。

<img width="1292" alt="Lambda_Management_Console.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60996/bce483e6-fa37-0e24-3f3f-ad40b0dd9428.png">

## 参考
https://aws.amazon.com/jp/blogs/developer/announcing-ruby-build-support-for-aws-sam-cli/
R Shiny appの実行順と変数スコープ

# 目的
- スクリプトファイルを分割してR shiny appを作成する際に、どのような実行順でファイルが実行されているのかをまとめる
- Qiitaに初投稿してレベルアップを図る

# 参考にしたもの
- [Shiny公式ドキュメント - Scoping rules for Shiny apps](https://shiny.rstudio.com/articles/scoping.html)
- [R - ShinyによるWebアプリケーション作成: shinydashboard編](https://qiita.com/tomotagwork/items/0efe3f08ddd1f268c8f8)

# ファイル構成
```
ShinySplitApp/
  ┣━ Data/
  ┃   ┗━ myData.csv
  ┣━ global.R
  ┣━ server.R
  ┗━ ui.R
```

# 実行順
- 基本的には`global.R` -> `ui.R` -> `server.R`の順番です。
- 各スクリプトファイル内で、`source(filePath, local=)`を実行している場合は、当該スクリプトが途中で呼び出されます。

```{global.R}
library(shiny)
library(shinydashboard)
library(tidyverse)

# global.R -> hogehoge.R -> ui.R ...の順になる
source(hogehoge.R, local=FALSE)
```
local=FALSEについては次の変数スコープに関係してきます。

# 変数スコープ
- 基本的に変数は同一ファイル内でのみ参照可能
- `global.R`に設定したものは全体から参照可能
- `source( )`関数で呼び出した場合は呼び出し元のファイル内では参照可能
    - `source(..., local=FALSE)`にしている場合は、セッション全体で変数の参照が可能

# 最後に
参考リンクを教えていただいたSlackチャンネル (Tokyo.R) の`tshibukawa5`様、ありがとうございました！
Expo SDK 33リリースノートまとめ

![alt](https://user-images.githubusercontent.com/26253721/39765058-e8d0eae4-531b-11e8-9305-4c852f269517.png)

## Expo Web
Expoは、webを標準サポートしたよ。
Expoは、ios, android, webアプリを作れるようになったよ。
ほとんどのExpo SKK moduleもwebで使えるよ
[使えるmoduleリスト]
(https://github.com/expo/web-examples/blob/master/docs/FEATURES.md)

以下のコマンドで動くから試してみてね。

```bash
$ npm install -g expo-cli
$ expo init web-test-project && cd web-test-project
$ expo start -w
```

## Custom Expo clients(ios)
Expo Cliを使って、カスタムExpoクライアントを作れるようになったよ。
ソースコードからビルド出来るからカスタマイズしてもいいよ

## 優先ビルド
お金を払うと、ビルドが速くなるよ。
お金を払わなくても、これまで通りビルドは出来るよ。
ついに、expoが課金を初めてしまった！

## ExpoKit
ExpoKitは将来depracatedになるかも。react-native-unimodulesを使ってね。

## モジュールのインポート
expoパッケージからモジュールをインポートするのはdepracatedになるよ。

expo install
コマンドを使って、モジュールをインストールしてね。
例えば、expoモジュールのFileSystemを使うなら、

```
$ expo install expo-file-system

import * as FileSystem from 'expo-file-system'
```
という感じ

目的はパフォーマンス向上のためだよ。

Expo SDK33では、これまで通り、expoパッケージからモジュールをインストール出来るよ。
ただ、コンソールで、ワーニンングが出るよ。
この変更を適用するコードモッドを作ったから、ExpoSdkのアップデートの時は使ってね。
https://www.npmjs.com/package/expo-codemod

## TypeScript
expoの全てのモジュールがTypeScriptに変換されるようになったよ。
App.tsx and tsconfig.jsonを含む新しいblankテンプレートを用意したよ。

expo init後に
blank (TypeScript) template.
を選択してみてね。

## React Hooks
Hooksにも対応したよ。

## Background Locationの制限
悪いお知らせ。
ios Expoクライアントから、BackgroundLocationを削除したよ。

## SDK 26-30は、使うのをやめてね。
古いSDKはサポートしないよ。

## 画像を最適化するよ。
Expo CLIはビルドの時に画像を最適化するようになったよ。

## 新しいAPIの登場
Crypto,
Random,
Share Lineやfacebookで情報をシェア
VideoThumbnails 動画からサムネイル画像を生成
Hacitics androidでも利用可能に
BackgroundFetch androidでも利用可能に

##BreakingChangeは責任を持てないので
[本家のサイト](https://blog.expo.io/expo-sdk-v33-0-0-is-now-available-52d1c99dfe4c)をみてね

いい仕事するね Expo!
MobaXtermでSSH通信

## はじめに
みなさん、windowsでのターミナルはなにを使用していますか？
TeraTerm or PuTTYという方が多いでしょうか？

私の愛用ターミナルはこの記事のタイトルにもある「***MobaXterm***」です！
みなさん、MobaXtermをご存じでしょうか？
新人の頃に初めてLinuxを触ったとき先輩社員が「オレが思う最強のターミナルはMobaXtermだ」と教えてくれたときから使用しています。
実際のところ、私は他のターミナルを知りません…笑 (いいのかそれで?)

少しでも興味が湧いた方は以下のリンクに訪れて、ダウンロードしてみてください！
公式サイト：https://mobaxterm.mobatek.net/


## SSL通信を行う

いつもなら、初期ユーザーとパスワードを作成して頂いたサーバーやroot権限を持ったサーバーをいじっていたのだが、今回は…

####  ----　以下回想　----

**サーバ提供者：**「ユーザーは○○で、パスワードはないので、これ(pemファイル)を鍵として使用してください」

**私：**「( ﾟ_ﾉﾟ)…ﾝ?? (pemファイル?ってなんだ) 」

IT初学者の私には、拡張子ppkは知れど、拡張子pemは初見だった。。。

**サーバ提供者：**「んじゃ、あとよろしく！！ε=ε=((((((((●ノ・`Д・)ノ」

**私：**「わっかんねーけど、やってみっかー、困ったときはググるぜ！」
(一応、紹介してるページあるやんけ…)
(いやでも、Qiitaにないし、Qiitaにあった方が良くね？(なにを根拠に？笑))

#### ----　回想　終　----

## やってみよう
##### 1．pemファイルを任意のディレクトリに配置

##### 2．MobaXtermを開き、秘密鍵ジェネレータを起動する。
　　※mobaXtermのインストールは簡単なので、省略します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/250217/75226b88-fd6f-92c7-54bf-472daf54dcfc.png)

##### 3．鍵情報ファイルを読み込む。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/250217/40219ea5-d9f3-371c-1a59-d42b983c622a.png)

##### 4．作成した秘密鍵(ppkファイル)を任意のディレクトリに保存する。
　　暗号化フレーズを聞かれるが、特に必要ない場合は、指定しなくてOK。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/250217/71e047e6-4672-a638-38cf-38f511263ee1.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/250217/1a16582d-aad4-275e-3beb-80bef569da79.png)

##### 5．新しいSSHセッションを開始する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/250217/ee895fae-e72e-7b37-8bcc-9ecf3d735493.png)

##### 6．Advanced SSH Settingsの「Use private key」にチェックを入れ、4．で保存した秘密鍵を選択する。「OK」を押下して、新規セッションとして、保存する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/250217/59abb489-b1ef-cc7d-24bb-0d9e64fcf64d.png)

##### 7．接続してみる。
　　ログインを確認できればOK！

## まとめ

- MobaXtermに標準で秘密鍵ジェネレータがインストールされているので、追加インストールなどの手間が一切なく楽だった。
- pemファイルも秘密鍵の情報を持ったファイルなので、物怖じすることなく取り組めば、ppkとなんら変わりないように感じた。
 
##### 今回得た教訓
***初めて見るものにビビるな！***

## 参考サイト
- [MobaXtermと公開鍵認証方式を用いたログイン](http://www.elc.ees.saitama-u.ac.jp/CAD/PCsettingPublicKey.html)
入社後のミスマッチ退社を防ぐ考察【採用人事向け】

#そもそもなんで早期退職になってしまうか
```
①入社前イメージとのギャップ
②入社後担当した上司との関係が良くない
③業務キャパシティ
```
他、原因はあると思いますが3点共有します。

##①入社前イメージとのギャップ
採用するために企業側は候補者を口説きます。
その際、『本人の求めている事にひたすら合わせ、うちでないと叶わないと語り続ける』そんな採用になっていませんか？（意識がなくとも知らず知らずに...）

候補者それぞれですが、成し遂げたい事であったり会社に対する興味など様々な理由でお会いすると思います。

お会いした方全員が自社に合う事はないので、候補者の思いや会社の魅力や課題点などをしっかり打ち明けられるような時間にしましょう！
そうすれば仮にその時はご縁がなかったとしてもいつか繋がる可能性があります。
何よりせっかくお互い時間を取っているので無駄にならないようにしましょう！

結論、しっかりコミュニケーションをとって双方後悔がないようにしましょう！

##②入社後担当した上司との関係が良くない
面接で会ったときは、『この方いいな！』と思って入社し、
1週間後『話しにくい。。相談出来ない。。』と思ったことはありませんか？

私も新卒で経験があります。

相性もありますが、1回面接でお会いした位で判断するのは難しいと思います。。
ですが、こんな方法はいかがでしょうか？

・入社前に上司と食事に行く
→理由は『面接の堅苦しい場所から離れた場所で話すことによって、面接の場では話せなかった本音や人柄などが見えてくると思うからです。』

この人と一緒なら仕事出来るか判断する為、仕事以外でも色々話しましょう！
そして、自分がその人の元活躍できる姿をイメージ出来たらいいスタートダッシュきれると思います。

##③キャパオーバー、キャパアンダー
仕事のバランスは難しく、多くても少なくても退職に繋がるケースが多いです。

自分が思っていた業務量とは異なり、それが不満となりに会社に対してのストレスが高まります。
スタートからそのような状況だと、意欲がない状態のまま仕事を続けるか、また転職を始めるかになります。これではお互いかけた時間を無駄にしてしまう行為になってしまいます。

案件が急に受注失注するなど様々原因があります。
ただ、これをどうするかは上司のケアが第一だと考えます。

#まとめ
以上、3点をまとめると***上司がしっかり新入社員をケアしましょう！***
考えを思いを受け入れるだけでも状況は変わると思います。

その為にも、しっかりコミュニケーションをとりましょう！
Windows で Spresense SDKを使用する（令和元年6月版）

# このページについて
Windows10上で Spresense SDK を使用した開発を行うための環境を構築する手順です。
つい1週間前に [Windows10(WSL)でSpresense SDKを使用する (令和元年5月版)](https://qiita.com/nara256/items/b50542cb9d782ba05232) と言う記事を書いたのですが、それの更新版です。

#Spresense SDKについて
## Spresense SDK ver 1.3.0
2019/06/05 に、[Spresense SDK ver 1.3.0](https://github.com/sonydevworld/spresense) がリリースされました。
従来のバージョン(～ ver 1.2.0) までは Linux(Ubuntu)上でしか動作しなかったものが、今回のバージョンから正式に Windows/Mac での開発に対応しました。
ということで、今回は Windows 上で動く開発環境を整備していきたいともいます。

## 手順は...
基本的には、すべて SONY が提供している [Spresense SDK のチュートリアル](https://developer.sony.com/ja/develop/spresense/developer-tools/get-started-using-nuttx/set-up-the-nuttx-environment) のページに書かれています。
今回の内容は、その手順をなぞりつつ、ちょっと手を加えているだけですｗ

# Windows 10 on Spresense SDK の環境構築手順
## MSYS2 をインストールする
https://www.msys2.org/ から MSYS2 をダウンロードし、インストールします。
今どきの人は 64bit のWindowsを使用しているでしょうから、その場合は msys2-x86_64-yyyymmdd.exe をダウンロードしてインストールします。

## MSYS2 のコンソールを起動する
スタートメニューから `MSYS2 MSYS` を選択すると、おなじみの黒バックのコンソールが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169018/a1789709-9753-2a6e-65b0-7f6f57abdd79.png)

## MSYS2 の proxy 設定
企業にお勤めで、proxy経由でないと外に出ていけない方は、以下のサイトを参考に proxy 設定しておきましょう。
http://flow-developers.hatenablog.com/entry/2018/05/15/234918

## MSYS2環境を最新化する
これは Spresense の手順には書いていないのですが、念の為 MSYS2 内のパッケージを最新化しておきます。Ubuntu で言う `apt-get update` `apt-get upgrade` 相当ですね。

```bash
$ pacman -Syu
```
## 必要なツールのインストール
ビルドに必要なツールをインストールします。
なお、ここは **チュートリアルに書かれているURLが間違っているので** 要注意です。(2019/06/07現在)
誤: `https://raw.githubusercontent.com/sonydevworld/spresense/install-tools.sh`
正: `https://raw.githubusercontent.com/sonydevworld/spresense/master/install-tools.sh`

ということで、以下の通りコマンドを打ちます。

```bash
$ curl -L https://raw.githubusercontent.com/sonydevworld/spresense/master/install-tools.sh > install-tools.sh
$ bash install-tools.sh
$ source ~/spresenseenv/setup
```

Spresense SDKから必要な情報をダウンロードします

```bash
$ git clone --recursive https://github.com/sonydevworld/spresense.git
```

## サンプルアプリのビルド
これ以降は、前回の記事の [サンプルアプリケーション "Hello, World!" のビルド](https://qiita.com/nara256/items/b50542cb9d782ba05232#%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3-hello-world-%E3%81%AE%E3%83%93%E3%83%AB%E3%83%89) と同じですので、前回の記事をご参照ください。

#まとめ
公式に Windows / Mac での開発に対応したということで、SPRESENSE もより身近な存在になりますね。歓迎すべきことです。

## ちなみに...
個人的には MSYS2 環境より WSL(Ubuntu)環境の方が使いやすいので、引き続き WSL で開発していきますｗ
コードファースト時に"dbo"以外のスキーマを適用する

表題まま。スキーマを分けたいことは多々あるが意外とやり方を知らなかったのでメモ。
実体としては単にTable属性のSchemaプロパティはデフォルトで"dbo"が割り当てられてる模様。

・以下担当者情報を保持するテーブル"Staff"をスキーマ"mst"に設定する例

```
[Table("Staff", Schema = "mst")]
public class Staff 
{
    [Key]
    public int ID { get; set; }
    public string Name { get; set; }
    public string KanaName { get; set; }
}
```

今までマスタテーブル名を接頭語(m_Staff)とかつけて管理してたのが嫌で仕方なかったけども、
これで分割もきれいになるのでうまあじ。
エンジニア採用は難しい？？

●エンジニア採用で困っている事

```
・人が集まらない
・他社にとられる
・社内で連携が上手くいかない
```

エンジニア採用はなぜ難しい？
全登録人数約16万人から1社あたりの転職総数（wantedlyデータ）

```
・エンジニア16.6%　
・セールス16.8%　
・コーポレート18.6%
```

・・とエンジニアは実際数字で見ると大したことがない（鬼のように難しいと感じるが）

###マーケティング会社視点での市況感
現状エンジニアの採用は『うまくいっている会社とそうでない会社の差が激しい』が営業職は大きな偏りなどはない（営業職に関しては省略します）

・・・なんで？と思うので続けて共有致します。

##エンジニアが働く上で求めている事
```
①どんな技術を使った経験が出来るか
②働きやすさ（リモートや、勤務時間の融通など）
③給与
④社風など
```
つまり、エンジニアは技術と働きやすさを中心に考えます。（あくまで傾向です）
時間に縛られレガシーな言語を使って業務をされていると、いずれエンジニアは逃げ採用できない状態になる可能性があります。

会社の持ち味に合わせた働き方の提案を紹介する為、
社内エンジニアとしっかり連携し要件定義しましょう。

##まず何から始めたらいいのだろうか？
***しっかりと目的に沿った要件定義をする。***
その為、『人事がしっかりエンジニアを学ぶ』事と、『社内エンジニアも協力関係を作る』必要があります。

個人的にはいっそ人事ではなく***『エンジニアが人事を学び採用した方が簡単かつ最も最短で結果が出る』***のではないかと考えています。

#結論
***人事はエンジニアを、エンジニアは人事をお互いの仕事を学び理解しましょう。
その上で、要件定義し連携すれば採用できる可能性が上がると思います。***

以上、私が聞き学び実際に人事を経験し考察した内容です。
参考にして頂けたら嬉しいです。
モチベーションの保ち方

#モチベーションの保ち方

###先に結論から話すと「やる気」を保つことはほぼ不可能です。

***モチベーションは『動機』***であり、
その日、もしくは***『数日単位で
アップダウンするのがやる気』***。

主に悩んでいるのは、モチベーションについてという方は多いと思いますが、
実際には***『やる気』***の方なのです。

##やる気の保ち方

まず、一番問題なのはやる気が出ない状態が長期間続いた結果、
モチベーションを完全に失い諦めてしまうこと。(最悪の状態です)

そんなやる気が出ない状態が長期間続く原因は
***『やる気がないのに無理矢理やろうとするから』です。***

###解決方法
```
1.細かく逃げる
その日やる気がまったく出ないなら、
ショッピング、カラオケなどの娯楽に逃げましょう。
細かく逃げてストレスを発散することで、
気づけばやる気は戻ってきます。

2.細かく諦める
同じようにまったくやる気が出ない日は、
「今日は無理だ」とその日を諦めてしまいましょう。

もちろん約束など他人が関わる日はそんなこと言ってられませんが、
あえてやらないと決めることで心が楽になり、
むしろその日中にやる気が戻ってくることもあります。
```

このふたつを意識して日々を過ごせば、
完全に心が折れることはそうそうありません。

※ただ、細かくというのがポイントで、
　長期に渡って現実から逃げ続けたりすると
　完全に戻ってこれなくなります。

###他、細かな対処方
```
・交流会などに参加し、意識の高い方と接する

・そもそもやる気が出ないことを悪いことだと思わない

・音楽鑑賞、映画鑑賞など、自分の趣味の時間を作る
　※自分に合うストレス発散法を模索してみましょう

・睡眠を取る
　※過度の睡眠不足は頭の回転を遅くし、
　人間の活力を低下させます。
　数日睡眠不足が続いて能率が下がったと感じたら
　思い切ってたくさん寝るようにしましょう。

・脳について勉強する
　※自分の脳がどういうメカニズムで動いているかを
　多少でも知れれば感情、やる気のコントロールが
　ある程度できるようになります。
```

これで、まったくやる気が出ない日は激減するはずです。

そもそもやる気は出そうとして出るものではないので、
いかに日常から自然と沸いてくるようにできるかがキーになります。

やる気を自然に沸かせられれば、パワースポットのように人が集まってきます！
素敵なパワースポット目指して頑張りましょう！！
FreeBSD を最新パッチが当たった状態の ISO イメージファイルを作成する

# releng の iso イメージを作る
9.1-RELEASE 上でセキュリティーパッチと ports の最終更新を反映させて、iso イメージを作成しよる。

作成環境は、作成しよる RELEASE と同一が作りやすいと思っちょる。
ちんまいトコは未検証じゃ😁

じゃが、RELENG9 以前の RELEASE には恐らく対応できん思いよる。
↑要は、9.1-RELEASE 以外ではの追試をしとらん。

# 下準備
* コマンド
[devel/subversion](https://www.freshports.org/devel/subversion)

10.1-RELEASE 以降 [svnlite(1)](http://www.koganemaru.co.jp/cgi-bin/mroff.cgi?subdir=man&lc=1&cmd=&man=svnlite&dir=jpman-10.1.2%2Fman&sect=0) がユーザーランドにインスコされとるけ、パスの通る場所にスタティックリンクを張ることでも可能。

* src

/usr/src が展開しとらんと /usr/src/release 内のシェルスクリプト類が実行出来んけ展開して用意する。

# 作ってみよう🎵
```shell:wheel 権限でw
cd /usr/src/release
env BRANCHPORTS=tags/RELEASE_9_EOL ./generate-release.sh releng/9.1 /RELENG_9.1
```

環境変数 BRANCHPORTS に ports の各リリース最終版のタグを指定する。
generate-release.sh の第一スイッチに src のタグを指定する。
第二スイッチに chroot(8) のディレクトリを指定する。

# 出来上がった iso ファイルは？
chroot 先のディレクトリ内に ftp で公開されとる配置で作成されとる（筈）じゃけ、必要なファイルを usb メモリに移すなり DVD-RW や CD-RW 等の工学メディアへ書き込んで使うなり、[VMware](https://www.vmware.com/jp.html) や [VirtualBox](https://www.virtualbox.org/) 等の仮想環境に突っ込んでホゲホゲしよっても OK じゃ！

おしまい
LINEスタンプ制作への道 vol.1

:relaxed:スタンプ配信までの流れ（３日～５日ほど

①スタンプ作る
　まずはサイズを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325975/25cfecac-512a-ed4d-0982-c2238348dbd4.png)

②スタンプ登録
→画像UP
　指定されているファイル名変更しZIPで圧縮
　　　→アップロードすると一括で画像が上がります。

タグ登録
指定したタグ文字を打った時にスタンプがショートカットに出てきます。

③申請、承認
申請して、何もリジェクトなく通れば、3日～5日ほどで承認がきます。


:smiling_imp:ここからが本題:smiling_imp:
今回スタンプは～５日で承認されました。
が、３日目で１回リジェクトくらってます。

:frowning2:リジェクト内容
１．イージミス：スタンプ画像が重複してた
２．ガイドライン見落とし：タグ１文字タイプを使用する場合は、スタンプが１文字を表すものじゃないとＮＧです
(※すべて一文字ショートカットを利用しようと登録したらすべてOUTでした)

:frowning2:配信後に気付くスタンプ画像のミス
上記画像でもお伝えしていますが、
よこ370px X たて320px(最大)で全て作ってしまったため、
余白が広く残念な感じになりました。
すぐに修正してスタンプ画像を上げなおそうと思いましたが、

審査中、承認後はスタンプ画像の変更はできないです。
もし修正したいなら、再度新規スタンプを作成申請する必要があるようです。

これを書いてる現在、まだ修正を行っていないのですが、
新規スタンプ申請し→それを修正したいスタンプと紐づけて販売することができるようなので画像リサイズ後、試してみたいと思います。

また、スタンプは偶数のpxを維持してかつ、スタンプ画像外回り10px余白がある画像なら、以下のサイズ内までOKのようです。

:relaxed:一枚あたりの大きさ：W80～370×H80～320ピクセル
HomebrewをMacに初めてインストール。エラー発生。そして解決できました。


Rubyを少し勉強した初心者です。
今までCloud9でrubyを書いていました。

書籍 「プロを目指す人のためのRuby入門」を購入し、自身のMACにrubyをインストールしようとしたのですが、エラーでインストールできませんでした。
いろいろ調べた結果、インストールに成功したので、ここにその方法を記載します。

環境　Mac OS Mojave 10.14.5

Homebrewのインストール
https://brew.sh/index_ja.html
このサイトより
```/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"```
このキーワードをターミナルで実行しました。

自動的にインストールされていきます。

パスワードを聞かれるのでこのMacのパスワードを入れます。

Xcodeが必要とのことでポップアップが立ち上がりました。
XcodeをダウンロードするためにApp StoreからXcodeをダウンロードしました。
Xcodeのインストールは成功しました。
しばらくするとこのような文字が帰ってきます。

` xcode-select: error: invalid developer directory '/Library/Developer/CommandLineTools'
Failed during: /usr/bin/sudo /usr/bin/xcode-select --switch /Library/Developer/CommandLineTools `

エラーということで、Homebrewのインストールはできませんでした。

いろいろ調べましたが、回答がみつからず1日経過。

ターミナルの基礎を勉強し直しましたがこれといって解決できず。

エラーの文章をそのままネットで調べると下記のサイトへ到着。
https://discourse.brew.sh/t/xcode-select-error-invalid-developer-directory-library-developer-commandlinetools-failed-during-usr-bin-sudo-usr-bin-xcode-select-switch-library-developer-commandlinetools/693/40

そこに記載されていたのは、アップルのデベロッパーツールからcommand lineをインストールするようにとのことだったので、下記URLにアクセスし、『command line tools (macOS 10.14) for Xcode』をダウンロードし、インストール。
 https://developer.apple.com/download/more/

再度ターミナルで、Homebrewのインストールのスクリプトを実行すると
無事にできました。

解決できて非常にうれしかったです。

誰かの参考になれば幸いです。

Rubyの基礎勉強がんばります。
皆さんよろしくお願い致します。
初めての投稿でした。
pyramidでビューへのアクセスの前後でフックする。tween

# ビューの前でフックしてしたい

たとえば、毎回ビューが呼ばれる前に何かをしたいときなど
今回、自分の場合だとDBの操作を毎回ビューの処理の前に行うことがやりたかったです。

## 実装

pyramidのサンプル用のプロジェクトを作成する
こちらを参考にしてください
https://qiita.com/noracorn92/items/07f5f7dbad8f551c3c45

### tween.pyを作成

```
# -*- coding:utf-8 -*-
import logging

logger = logging.getLogger(__name__)


class sample_tween_factory(object):

    def __init__(self, handler, registry):
        self.handler = handler
        self.registry = registry

    def __call__(self, request):
        print("start")
        response = self.handler(request)
        print("end")
        return response
```

### __init__.pyにtweenを登録する
下から2行目で登録しています

```
from pyramid.config import Configurator


def main(global_config, **settings):
    """ This function returns a Pyramid WSGI application.
    """
    config = Configurator(settings=settings)
    config.include('pyramid_jinja2')
    config.add_static_view('static', 'static', cache_max_age=3600)
    config.add_route('home', '/')
    config.scan()

    config.add_tween('.tween.sample_tween_factory')
    return config.make_wsgi_app()
```

## 実行確認

![スクリーンショット 2019-06-07 11.26.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52386/609e53f0-8e25-ac3c-542e-6b61dd9b6ecf.png)

![スクリーンショット 2019-06-07 11.27.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52386/42ad2871-5158-584e-f00e-352a795239b0.png)

実行するとフックできているのが確認できます
新しいモニタリング ツール　．SignalFxをご紹介いたします。

![SignalFx Case Study - VIKI .jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431872/58b18d62-9d66-c2ba-b1de-bf04d332a2f2.jpeg)

皆様、
シリコンバレーからSinalFxとうモニタリングプラットフォームの日本顧客担当Jeffです。
エンジニア専用フォラームで投稿するのは恐縮ですが、弊社はこれから日本に進出しますので、近いうちに日本語堪能のエンジニアから投稿させて頂きます。

SignalFxは、他のモニタリング ツールとどう違いますかと簡単に言えば、マイクロサービス、K8s、サーバレス監視のために最適なメトリクスストリーミングアーキテクチャーです。１秒の解像度で、山ほどあるノイズから有意義なシグナルを分離しオートメーションで問題をピングポイントしてお客様へ影響を与える前に解決できます。リアルタイムでどの規模でも監視可能です。

ご参考までUsecaseを１件アップロードしております。

２週間無料トライアルを提供していますので、お試し下さいますよう！
https://www.signalfx.com/

なお、６月11日から21日まで東京におりますので、クラウドネティブモニタリングにご興味ある方とキャチアプ頂ければ幸いです。

ジェフ
携帯：＋61403609998　（ローミング）
jnguyen@signalfx.com
ゼロから始めるPHP ～Laravel掲示板のTOP画面を変更する～

今回は前回書いたように「プロジェクトのTOPページを認証画面に変更する」という課題に取り組みましたので書いていきます。

<h2>TOP画面を変更する為に行ったこと</h2>
①top.blade.php を作成
②web.php の中身の記述を変更

たったこれだけです。

では、実際にどうやって作成したかを解説していきます。

<h2>top.blade.php を作成</h2>
TOP画面を新しく作成します。
と言っても全く新しいものを作るのは時間的に厳しいので、すでにあるものを流用しました。

①welcom.blade.php をコピーし、top.blade.php にリネーム。
②top.blade.php の中身を変更し、保存。

簡単に言うと以上です。たったこれだけです。
HTMLとCSSで記述されている部分を各自お好きなようにレイアウトを変更すれば良いと思います！
今回は以下のようなページを作成しました。

<img width="1504" alt="スクリーンショット 2019-06-07 11.06.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418206/8ba056f9-88f1-7b8b-fc8c-d11522a39219.png">


<h2>top.blade.php を作成</h2>
次に先ほど作った top.blade.php をlaravelのプロジェクトを起動させた時にTOPページとして表示できるようにルーティングの変更を行います。

現行だと php artisan serve を行い、
「http://127.0.0.1:8000」
にアクセスすると以下のような画面が表示されます。
この画面は home.blade.php を表示したものです。

<img width="1680" alt="スクリーンショット 2019-06-05 22.02.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418206/245f1710-95e4-dc36-e257-ab055a6d2d12.png">

これを
「http://127.0.0.1:8000」
にアクセスすると、先程作った top.blade.php が表示されるように web.php を変更します。

以下はweb.php のコードになります。

```ruby:web.php
<?php
/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/
Route::get('/', 'PostsController@index')->name('top');
Route::resource('posts', 'PostsController', ['only' => ['create', 'store']]);
Route::resource('posts', 'PostsController', ['only' => ['create', 'store', 'show']]);
Route::resource('comments', 'CommentsController', ['only' => ['store']]);
Route::resource('posts', 'PostsController', ['only' => ['create', 'store', 'show', 'edit', 'update']]);
Route::resource('posts', 'PostsController', ['only' => ['create', 'store', 'show', 'edit', 'update', 'destroy']]);
Auth::routes();
/*Route::get('/home', 'HomeController@index')->name('home');*/
Route::get('/', function () {
	return view('top');
});
```
<h3>変更箇所</h3>

変更箇所は2点です。

```ruby:web.php
/*Route::get('/home', 'HomeController@index')->name('home');*/
```
web.phpの下から2行目のRouteをコメントアウトして無効にしました。
コメントアウトした理由としては、この記述があるとhome.blade.phpに飛ばされると思ったからです。

【自信ないです。間違っていたらごめんなさい。】


次に

```ruby:web.php
Route::get('/', function () {
    return view('top');
});
```
を記述し、top.blade.php　が表示されるようなルーティングにしました。

<h2>結果</h2>
<img width="1504" alt="スクリーンショット 2019-06-07 11.06.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418206/f27fd2d2-6372-ad7c-5528-6aee159b1b2a.png">

結果としてphp artisan serve の後
「http://127.0.0.1:8000」
にアクセスするとtop.blade.php が無事に表示されるようになりました！

<h2>参考にした記事</h2>
[Laravel5.7: トップページを作る](https://qiita.com/sutara79/items/8522dfcbb2edcdf43a5c)
@sutara79 様
Ansibleでcommit時にlabelをつけて切り戻しをしやすくする

# 環境
Ansible バージョン2.8

## 注意点
今回の話はAnsibleバージョン2.7以降でないと対応していません。

## 目的
Ciscoのios-xrではcommit時に任意のlabelを付け加えることができる。
例えばcommitしてそれが原因で事故が発生した場合rollbackするときにlabelを指定して切り戻しすることができる。
今回はそれをAnsibleで行う。

```
- hosts: iosxr
  gather_facts: no
  connection: local

  tasks:
      - name: configure interface settings
        iosxr_config:
         lines:
           - ip address 172.31.1.1 255.255.255.0
           - no shutdown
         parents: interface gi0/1/0/0
         label: abcdefg

```

今回注目して欲しいのはlabel: abcdefgjでここで指定する。

## ios-xrで確認
```
xrv#show configuration commit list
Fri Jun  7 10:41:28.293 JST
SNo. Label/ID              User      Line                Client      Time Stamp
~~~~ ~~~~~~~~              ~~~~      ~~~~                ~~~~~~      ~~~~~~~~~~
1    abcdefg               root      vty0:node0_RSP0_CP  CLI         Fri Jun  7 10:40:59 2019
```

## rollback
```
xrv#rollback configuration abcdefg
```

## 感想
このようにlabelを指定すると何かあったときに対応しやすいですね
label便利だと思います。

何か意見あれば
Twitter→https://twitter.com/katu7414
Github→https://github.com/Katsuya414
Windows10 VisualStudioCodeでRemote Devlopment

## 概要

VSCode(2019/06/05 release版)にRemoteDevelopmentが追加させたので
Windows10でEC2に接続してコードを触ってみた

## VSCodeにRemoteDevelopをインストール

1. 拡張機能からRemoteDevelopmentを検索
2. インストール
3. Remote SSH,Remote WSL,Remote Containerが一緒にインストールされる

## Windows10にOpenSSHをインストール

- PowerShellを管理者権限で起動

``` PowerShell
Get-WindowsCapability -Online | ? Name -like 'OpenSSH*'

# This should return the following output:

Name  : OpenSSH.Client~~~~0.0.1.0
State : NotPresent
Name  : OpenSSH.Server~~~~0.0.1.0
State : NotPresent
```

- ssh clientをインストール

``` PowerShell
# Install the OpenSSH Client
Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0
```

## ssh configの設定

- 下記のファイルを設定
 
```
c:\user\{user}\.ssh\config
```

```
Host {host name}
     HostName {ip}
     User {user}
     IdentityFile {key file path}
```

※ 例

```
Host centos-server
     HostName 10.42.XX.XX
     User centuser
     IdentityFile ~\.ssh\xxxx.pem
```

- 踏み台を設定して接続する場合

```
Host {host-name}
     HostName {ip}
     User {user}
     IdentityFile ~\.ssh\xxxx.pem
     ProxyCommand C:\Windows\System32\OpenSSH\ssh.exe -W %h:%p fumidai_server
```

## VScodeからサーバーに接続

1. RemoteDevelopment アイコンを左のメニューから選択
2. 右上の設定からssh configを選
3. ssh configに書かれたhostが一覧で表示される
4. 一覧からhostを選択するとサーバー側に自動でVSCodeServerがインストールされ接続される
5. サーバー内のコードパスを選択し表示
6. コードを書くことができるようになる！
SkaffoldのFile sync機能を使えばイメージのビルドなしにコンテナに反映できて捗る

Skaffoldはローカルで開発する際、ソースコードの変更を検出して、自動的にビルド、プッシュ、デプロイを行ってくれ大変便利です。
しかしソースコードに量が多くなってくるとビルドに時間がかかってきます。
そんなときは、Skaffoldの[File sync](https://skaffold.dev/docs/pipeline-stages/filesync/)機能を使えばイメージのリビルド、リデプロイ、リスタートなしに、**sync対象のファイルのなかで変更があったファイルのみをコンテナに直接反映できます**。

syncには2種類のモードがあります。

# inferモード
Dockerfileをもとにsync先を推定するモードです

例えば以下のようなDockerfileがあり、

```Dockerfile
FROM hugo

ADD .filebaserc /etc/
ADD assets assets/
COPY static-html static/
COPY content/en content/t
```

skaffold.yamlに以下のようなSync設定がされていた場合、

```yaml
build:
  artifacts:
    - image: gcr.io/k8s-skaffold/node-example
      context: node
      sync:
        infer:
        - '.filebaserc'
        - 'static-html/*.html'
        - '**/*.png'
        - 'content/en/**/*.md'
```

1.  `.filebaserc`は、コンテナの`/etc/.filebaserc`にSyncされる
2.  `static-html/a.html`は、コンテナの`static/`以下にSyncされる(`static-html/sub/a.html`はSync対象外)
3.  `assest/img.png`はコンテナの`assets/img.png`に、また`static-html/imgs/demo.png`はコンテナの`static/imgs/demo.png`にSyncされる
4.  `content/en/sub/index.md`はコンテナの`content/sub/index.md`にSyncされる(`content/en_GB/index.md`はSync対象外)

注意点としては、inferモードはファイルが変更,追加された場合のみコンテナに反映されます。ファイルの削除は常にリビルドが発生します。


# manual モード
Sync元とSync先を自分で指定するモードです。

```yaml 
build:
  artifacts:
    - image: gcr.io/k8s-skaffold/node-example
      context: node
      sync:
        manual:
          # .filebasercファイルを/etcディレクトリにsyncする
          - src: '.filebaserc'
            dest: /etc

          # static-htmlディレクトリ以下のhtmlファイルをstaticディレクトリ以下にsyncする
          - src: 'static-html/*.html'
            dest: static

          # すべてのpngファイルをassetsディレクトリにsyncする
          # 例えばimg.pngは assets/img.pngに、sub/img.pngはassets/sub/img.pngにsyncされる
          - src: '**/*.png'
            dest: assets

          # content/en以下のmdファイルをcontentディレクトリへsyncする
          # strip指定がされているので、content/en/hoge/fuga.mdのファイルは content/hoge/fuga.mdにsyncされる
          - src: 'content/en/**/*.md'
            dest: content
            strip: 'content/en/'
```

もしすべてのファイルをsync対象にしたい場合は以下のようにすればOKです。(DockerfileやKubernetesマニフェストファイル、skaffold.yaml等を変更してもリビルド、リデプロイ、リスタートが実行されないので注意)

```yaml
      sync:
        manual:
        - src: '**/*'
          dest: '.'
```

# まとめ
File sync機能、大変便利ですね。
この機能によって、ホストマシンのボリュームをマウントしながらDockerを動かして開発するときの開発体験とそれほど変わらず、Kubernetesを利用して開発ができるのではないかと思います。

なおFile sync機能は2019/12/13現在、β機能です。

# File syncの制限事項
- File syncはコンテナのユーザによって変更可能なファイルのみ更新可能です(うまくsyncされなかったらUser、権限を確認しましょう)
- File sync機能を使うにはコンテナ内でtarコマンドが使える必要があります
- ローカルソースファイルしかsyncされません。builderによって生成されたファイルはsyncされません。
- manualモードとinferモードを同時に使うことはできません。
kintoneにてログインユーザーの氏名を取得する

###kintoneで入力フォームを表示した際にログインユーザー名をフォームに入れる

kintoneで入力フォームを作成し、新規レコード登録画面を開いた際にログインユーザー名を取得、フォームに表示させるスクリプト。
※氏名の入力フォームのフィールドコードは「氏名」。

```javascript:inputForm.js
   // レコード新規作成時
   kintone.events.on(["app.record.create.show"], function(event){
      
      // ログインユーザ名を取得
      var record = event.record;
      var loginUser = kintone.getLoginUser()['name'];
      
      record['氏名']['value'] = loginUser;
      
      return event;
       
   });

```
特徴量のテンプレートマッチング的使用

　画像中の位置だけわかれば良いだけで、テンプレートマッチングでも
良いのだけれど、角度が付くと厄介だったりします。
そこで特徴量で、テンプレートマッチング的な使い方をやってみようかと思います。

#課題
A-KAZE検出器使用マッチングを行い検索先画像中より、検索元画像の四隅位置を取得します。
(A-KAZEの選択は適当です)

#サンプル画像
##検索元画像(テンプレート画像)
![templ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/391380/fd9525d8-a850-ef83-0787-faee59b8fa5d.jpeg)

##検索先画像
![sample5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/391380/ac517884-85db-8b43-6e31-d4ff73617ed7.jpeg)

#手順
- A-KAZE検出器の生成する。
- 特徴量の検出と特徴量ベクトルの計算を行う。
- 特徴量ベクトル同士をマッチングを行う。
- 画像間のホモグラフィ行列（RANSACメソッド）の推定を行う。
- 画像４隅の角座標を計算する。

#実行環境
- Python 3.7.3　 Anaconda
- OpenCV 3.4.1
- numpy 1.16.4

#コード

```python

import cv2
import sys
import copy
import numpy as np

def	searchPosition(templ_img, query_img, good_match_rate=0.30):
	# A-KAZE検出器の生成
	detector = cv2.AKAZE_create()
	templ_kp, templ_des = detector.detectAndCompute(templ_img, None)

	# 特徴量の検出と特徴量ベクトルの計算
	query_kp, query_des = detector.detectAndCompute(query_img, None)

	# マッチング
	bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)

	# 特徴量ベクトル同士をマッチング
	matches = bf.match(query_des, templ_des)

	# 特徴量をマッチング状況に応じてソート
	matches = sorted(matches, key = lambda x:x.distance)
	good = matches[:int(len(matches) * good_match_rate)]

	# 位置計算
	src_pts = np.float32([templ_kp[m.trainIdx].pt for m in good])
	dst_pts = np.float32([query_kp[m.queryIdx].pt for m in good])
	Mx, mask = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC)

	# 画像４隅の角座標を取得
	th = templ_img.shape[0]
	tw = templ_img.shape[1]
	pts = np.array([[[0,0], [0,th-1],[tw-1,th-1],[tw-1,0]]], dtype=np.float32)
	dst = cv2.perspectiveTransform(pts,Mx)
	return	Mx, np.int32(dst)


```


#結果画像
![infoImage5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/391380/41ec16e1-acd2-224e-ffed-553c306ab3a4.jpeg)
青の矩形は、検索元画像(テンプレート画像)の４隅を示します。
赤の十字は、検索元画像(テンプレート画像)の中心を示します。

#結果
　検出しているようだが、縮小しているのか？ちょっとずれている。
撮像をもうちょっとまともにやればいいのかは不明。今後の課題かな。
　対象物のθ方向傾き角度や、拡大縮小率やらいろいろ取り出すことができます。
でもテンプレートマッチングでは、相関係数で相関具合を知ることができますが、
この場合どうしたものかと。マッチング距離全体をどのように表現すべきか。
これも今後の課題かな。


#参考
@ka10ryu1さんの
[画像から特徴量を抽出し、透視変換行列を導出して画像を変形する](https://qiita.com/ka10ryu1/items/bd05aed321a7a154d8a1)

本来であれば上記ページだけでも良く、わざわざ書く必要あるのかなとも
思いましたが書いちゃいました。

以上
SwiftUIのTabbedViewで遊んでみる

SwiftUIをさわり始めて数日ですが、今までのやり方で「どうやってやるの？」的なことが多くあると思いますが、今回扱うTabbarも色々変わっっているので軽くまとめます。

あと、Viewの背景色変更する方法を暫定ですがいい感じにできたのでそこも紹介します。

※スクショは自粛で〜

## First Code
Tabbarでの構成でプロジェクトを作成するとこんな感じにContentViewを作成してくれます。

まずはこれだけを見ていきましょう😃

``` swift
struct ContentView : View {
    @State private var selection = 0
 
    var body: some View {
        TabbedView(selection: $selection){
            Text("First View")
                .font(.title)
                .tabItemLabel(Image("first"))
                .tag(0)
            Text("Second View")
                .font(.title)
                .tabItemLabel(Image("second"))
                .tag(1)
        }
    }
}
```

### SetTabItem
タブバーのアイテムを設定してあげています
画像なりテキストなり

``` swift
func tabItemLabel<V>(V) -> _ModifiedContent<TabbedView<SelectionValue, Content>, _TraitWritingModifier<AnyView?>>
```
Sets the tab item to be used for this content.

### Configuring Switch View
要調査ですがタグを振ってあげないとうまく切り替わってくれないです

``` swift
func tag<V>(V) -> _AutoResultView<TabbedView<SelectionValue, Content>>
```

## Viewの切り替え
ContentView.swift

``` swift
        TabbedView(selection: $selection) {
            FirstView()
                .tabItemLabel(Image("first"))
                .tag(0)

            SecondView()
                .tabItemLabel(Image("second"))
                .tag(1)
            }
            .onAppear { print(“onAppear”) }
    

```

FirstView

``` swift
struct FirstView : View {
    var body: some View {
			Text("First")
    }
}
```

SecondView

``` swift
struct SecondView : View {
    var body: some View {
			Text(“Second")
    }
}
```

### Append self view background color
View全体に背景色を追加する方法ですね
正しいやり方か分からんけど、

ZStackを使うのはわかったけどSpacerの挙動がイマイチ理解できない、、

``` swift
    var body: some View {

        ZStack {
            Spacer()
                .position(.zero)
            Text("First")
                .color(Color.white)
            }.background(Color.red)
            .edgesIgnoringSafeArea(.all)
    }
```

## タブバーで表示されるViewを画面全体に表示
.edgesIgnoringSafeArea(.all)だとタブバー見えなくなちゃったので上だけで

``` swift

struct ContentView : View {
    @State private var selection = 0
 
    var body: some View {
        TabbedView(selection: $selection) {
            FirstView()
                .tabItemLabel(Image("first"))
                .tag(0)

            SecondView()
                .tabItemLabel(Image("second"))
                .tag(1)
            }
            .onAppear { print("onAppear") }
            .edgesIgnoringSafeArea(.top)
    }
}
```
SeleniumBasicでChromeの実行バイナリを指定する


2019/6/6頃にChrome 75がリリースされましたが、これによりSeleniumが正常に動作しない（Chrome 75版のChromeDriverに変更しても正常に動作しない）問題が発生したため、一時的にSRWare Ironに切り替えることにしました。

以下のコードは、SeleniumBasicでChromeの実行バイナリを指定して、指定されたChrome（あるいはChromiumやSRWare IronなどのChrome派生ブラウザ）を開く例です。SetBinaryで実行バイナリを指定することができます。

```
Public driver As New WebDriver
Public Sub openBrowser()
    driver.SetBinary "C:\Program Files\SRWare Iron (64-Bit)\chrome.exe"
    driver.Start "chrome"
    driver.Window.Maximize
End Sub
```
MoOx/pjaxでブラウザーキャッシュ対策のクエリー文字列が付かないようにする方法

# 内容

[MoOx/pjax](https://github.com/MoOx/pjax)では、`cacheBust`オプションが`true`（デフォルト）になっていると、ページ遷移時にブラウザーキャッシュ対策のクエリー文字列が追加されます。
このクエリー文字列だけを自動で削除するコードです。

# コード

```JavaScript:JavaScript
const pjaxInstance = new Pjax({
  // 省略
});

pjaxInstance.latestChance = function(href) {
  Pjax.prototype.latestChance.call(
    this,
    this.options.cacheBust ? removeTimestampQuery(href) : href,
  );
};

pjaxInstance.afterAllSwitches = function() {
  if (this.options.cacheBust) {
    this.state.href = removeTimestampQuery(this.state.href);
  }
  Pjax.prototype.afterAllSwitches.call(this);
};

function removeTimestampQuery(href) {
  const anchor = document.createElement('a');
  let searchString;
  let parameters;

  anchor.setAttribute('href', href);
  searchString = anchor.search;
  if (searchString.length > 0) {
    parameters = searchString.slice(1).split('&');
    parameters = parameters.filter(function(element) {
      return element.indexOf('t=') !== 0;
    });
    anchor.search = parameters.length > 0 ? '?' + parameters.join('&') : '';
    href = anchor.href.replace(/\?$/, ''); // for IE
  }
  return href;
}
```
GitLab 11.11.0 のmilestoneで500エラー

GitLabを11.11.0にバージョンアップしたらプロジェクトのマイルストーンの一覧が500エラーが出て見えなくなりました（しくしく。

Issueを見るとi18nのバグっぽいので個人言語をEnglishに設定すれば見ることができます。が、オープンソースなので自力で修正してみます。

# 前提

GitLab CE 11.11.0
言語：日本語

# 対応方法

以下に修正したpoファイルをアップロードしました。

https://gist.github.com/bellx2/a9449c1ebd0af3ecc0f14c19277769bd

gitlab/locale/ja/gitlab.poを入れ替えして再起動します。

# 詳細

以下のIssueで認識はされているようです。
https://gitlab.com/gitlab-org/gitlab-ce/issues/62355

i18nのバグっぽいです...。

という事で直近の```app/helpers/milestones_helper.rb```
に関連するコミットを見てみます。

https://gitlab.com/gitlab-org/gitlab-ce/commit/5770b6544d3476e27d77a0ab11f162c941aa0cae

"%d open issues" となっていたのが、"%{issues} open issues"になっています。この変更が言語ファイルに反映されていないのが、原因のようです。

以下の５メッセージで影響があるようですので%dの書き換えを行います。

```gitlab/locale/ja/gist.po
....

msgid "1 closed issue"
msgid_plural "%{issues} closed issues"
msgstr[0] "%{issues}件のクローズされた課題"

msgid "1 closed merge request"
msgid_plural "%{merge_requests} closed merge requests"
msgstr[0] "%{merge_requests}件のクローズされたマージリクエスト"

....

msgid "1 merged merge request"
msgid_plural "%{merge_requests} merged merge requests"
msgstr[0] "%{merge_requests}件のマージされたマージリクエスト"

msgid "1 open issue"
msgid_plural "%{issues} open issues"
msgstr[0] "%{issues}件の課題"

msgid "1 open merge request"
msgid_plural "%{merge_requests} open merge requests"
msgstr[0] "%{merge_requests}件のマージリクエスト"

....

```

# むにゃむにゃ

さくっとあげたらバグに当たってしまいました（涙。なんか本家(gitlab.com)のマイルストーンもエラーになるようなんですが...。

# その後(19/6/8)

Issueに変更点を報告したら、そこから数時間でいろいろすすみましたので、次のリリースにはきちんと修正されるかと思います。「どうしてこういう問題が発生するのか」という議論になっているあたりが嬉しいです。

これだけメジャーなソフトなので、さすがに誰か気づいて直しているだろうと思っていたのですが、報告して良かったです、少しでも貢献できたなら良かったです。
仕事が出来る人だなって感じる３つの要素

普段仕事をされていて、この人いいなって思う事ってありませんか？
自分もよく仕事をしていていいなと思うことがあります。
大きく3点が共通点要素として大きいと考えるので、共有します。

#レスが早い
仕事が出来る方は本当にレスがシンプルで早いです。
決断力がある方が多く、1日以上返信が返ってこない、という事はほぼありません。
万が一返せないということがあっても、
「確認が必要なので少々お待ちください」
「〜日に回答が出るので改めてご連絡します」　等、
必ずレスが返ってきます。


#レスが少ない（いい意味で）
また、無駄なやりとりがほぼなく、やりとりはシンプルです。
一見冷たいように思えますが、忙しい社長や経営者には必要事項を最低限度の回数で伝えるスキルは必須です。
もし、そういう方々とやりとりをすることがあった場合、
    -つどつどの確認依頼をしてしまう
    -レスが遅い
    -一目で見て何の連絡かわからない  等、
してしまうと「この担当者とのコミュニケーション、コストがかかるな…」と思われてしまうので気をつけたほうが良いです。

#誰にでも丁寧、態度を変えない
仕事ができる方は、誰に対してもフラットなコミュニケーションをとっています。
3年前、フリーで営業していた頃5年以上のベテランの方に同じ目線で相談にのって頂きました。
自分はこれこそ必要なコミュニケーションだなと感じ、実践するよう心がけてます。

ついついマウントを取ってしまったり、自分の知識を披露してしまいがちですが、
そのようなコミュニケーションは相手にプレッシャーしか与えないですよね。
自分もそうならないように気をつけたい、と心に刻んだ瞬間でした。
map

```go
func main() {
	m := map[string]int{"apple": 100, "banana": 200}

	fmt.Println(m) //map[apple:100 banana:200]
	fmt.Println(m["apple"]) //100
	m["banana"] = 300
	fmt.Println(m) //map[apple:100 banana:300]

	m["orange"] = 500
	fmt.Println(m) //map[apple:100 banana:300 orange:500]

	fmt.Println(m["nothing"]) //0 intのデフォルト値

	v, ok := m["apple"] //okは中身が入っているかチェックするもの。2つ目の返り値はなくても良い
	fmt.Println(v, ok)  //100 true

	v2, ok2 := m["nothing"]
	fmt.Println(v2, ok2) //0 false

	m2 := make(map[string]int)
	m2["sp"] = 20000
	fmt.Println(m2)
	//メモリ上に空のマップをつくってから値を代入した

	/*
		var m3 map[string]int
		m3["sp"] = 50000
		fmt.Println(m3) //panic: assignment to entry in nil map
		//宣言はしているがメモリ上に入れるマップがないのでエラー
	*/

	var s []int
	if s == nil {
		fmt.Println("NIL")
	}
	//varで宣言した場合は、mapもスライスもnil
}
```

>【参考】
現役シリコンバレーエンジニアが教えるGo入門(https://www.udemy.com/share/100BhMB0obeFpbTX4=/)