OmniAICreator/Qiita-1.07M huggingface dataset:
EC-CUBEの環境とサポートについて参考になるリンク集など[2019/5/25更新]

# 公式の見解

- [こちらのプレスリリース](https://www.ec-cube.net/press/detail.php?press_id=244)にてロードマップが公開されています。

## 一部抜粋（詳しくはソース元を確認してください）

> - EC-CUBE 4系
>   - EC-CUBE 4.0は3か月に1回を目途にマイナーバージョンアップを実施していく予定です。
> - EC-CUBE 3系
>   - 今後はSilex等フレームワークを含め、セキュリティフィックス対応をメインにメンテナンスしてまいります。
> - EC-CUBE 2系
>   - EC-CUBE 2.13を公式安定板として、今後もセキュリティフィックス対応をメインにメンテナンスしてまいります。
>   - EC-CUBE 2.17(PHP7対応版)はEC-CUBE開発コミュニティが主導となり開発を進めております。

# システム要件

- [EC-CUBE3のシステム要件](https://doc.ec-cube.net/quickstart_requirement)
- [EC-CUBE4のシステム要件](http://doc4.ec-cube.net/quickstart_requirement)

## 代表的なシステム要件とサポート期間について

- EC-CUBE3
  - Silex: [2018年6月に開発終了](https://symfony.com/blog/the-end-of-silex)
  - Symfony2.7: [2019年5月まで](https://symfony.com/roadmap/2.7)
  - PHP7.1: [2019年12月1日まで](https://www.php.net/supported-versions.php)
- EC-CUBE4
  - Symfony3.4: [2021年11月まで](https://symfony.com/roadmap/3.4)
  - PHP7.3: [2021年12月6日まで](https://symfony.com/roadmap/2.7)
    - ただし[RHEL8にて7.2が採用される予定](https://developers.redhat.com/rhel8/)で、PHP自体ののセキュリティ期限の切れたものでも OSのサポート期間内であれば脆弱性の対応が行われる。

**こちらコメントいただければ追記していきます**

# 参考になる記事

- [EC-CUBE4正式版がもうリリースだけど、今選ぶなら2系？3系？4系？](https://eccube.hatenablog.com/entry/20181009/p1)
- [EC-CUBE1系・2系・3系・4系の違い](https://qiita.com/nanasess/items/dc8407c48a3dcf982ea2)

# 質問への回答

以下の回答は個人によるものです。（公式の見解とは違う場合があります）

- ３系と４系はどのような環境でいつまで使えるのか
  - [EC-CUBE3のシステム要件](https://doc.ec-cube.net/quickstart_requirement)と[EC-CUBE4のシステム要件](http://doc4.ec-cube.net/quickstart_requirement)を参照
  - サポート期間は利用している環境やフレームワークによって異なる。
  - フレームワークのサポートが終了した場合でも[公式](https://www.ec-cube.net/press/detail.php?press_id=244)にてロードマップが公開されています。がキュリティフィックス対応していく方針を示している。
- ５系はいつ出るのか
  - 現時点で未定
  - おそらくSymfonyのLTSのリリースに合わせてスケジューリングされると思うが、その場合でも4.1になるか5.0になるかは未定
- クラウドへの移行作業
  - クラウド移行によって何を実現したいかによるが、３種類ほど方法がある
    - OSのイメージごと引っこ抜いて移行
      - 一番楽かもしれないが、クラウドに移行するメリットをあまり享受できないのでちゃんと考えて選択するように
      - 移行先のクラウドとOSの相性とかもあるので事前に調べておくと良い
    - ファイルとDBを移行
      - クラウドの機能を活かして移行が可能なので個人的にはおすすめ
      - 基本的には以下の3点の移行となる
        - EC-CUBEのファイルの移行
        - DBのデータの移行
        - インフラ周りの設定の移行
      - 手順はWordpressなど他のCMSと似ているのでそちらの記事も参考になる
    - データのみ移行
      - クラウドで新規構築してCSVなどでデータを移行する
      - カスタマイズをしていたりすると移行が難しいデータができるかもしれない。
      - 2系から4系への移行については[プラグイン](https://www.ec-cube.net/products/detail.php?product_id=1804)が公開されている
      - この方法なら[クラウド版のEC-CUBE](https://www.ec-cube.co/)への移行も可能
  - いずれの場合も決済周りはIPの設定など必要な場合があるので利用中の決済ごとに確認するように

質問いただければ可能な範囲で回答します。
Windows10にFlutter_webを導入してAVD上で動かしてみる

# はじめに
Windows10 で Flutter の導入から Flutter_web サンプルの起動まで書いていこうかとおもいます。
Flutter_webを触ってみようかと思っている方の助けになればなと。

参考
[Flutter Webを動かしたときにつまづいたこと](https://qiita.com/Nkzn/items/402a29fe9bb517ce78aa)(こちらのほうが分かりやすい説)
[Flutter](https://flutter.dev/)
[Flutter_web](https://github.com/flutter/flutter_web)

# Flutter導入
1. 公式([Flutter_download](https://flutter.dev/docs/get-started/install/windows))からダウンロードし、圧縮ファイルを `C:\src` 配下に解凍
`C:\src\flutter` となっていれば大丈夫です。
なっていない場合はflutterディレクトリ移動。
2. `C:\src\flutter\bin`にパスを通す
3. [Android Studio](https://developer.android.com/studio/?gclid=EAIaIQobChMI4uj8y86k4gIV1wcqCh1FDwP5EAAYASAAEgJAgfD_BwE)をインストールして、起動画面から`configure>Plugins`と進んでFlutterと検索
`Flutter(language)`を追加。(同時にDartも入ります)
4. `Configure>AVD Manager`からVirtualDeviceを追加
5. [VSCode](https://code.visualstudio.com/)をインストールし、`Flutter(DartCode)`のextensionを追加
6. `powershell`で`C:\src\flutter`に移動して
`flutter doctor --android-licences`
を叩き、ライセンス内容に同意していく
7. `flutter doctor`を叩きすべての項目にチェックが付いたか確認する
8. `C:\Users\user\AndroidStudioProject\flutter_app(project_name)\gradlew.bat`を実行するとビルドが通るようになります
9. [SDKツール](https://developer.android.com/studio/intro/update.html#sdk-manager)をリンクを参考にAndroid StudioにSDKを追加

公式の[Test drive](https://flutter.dev/docs/get-started/test-drive)の通りに操作し、AVD上にカウントアップアプリが立ち上がったら導入完了です。

# Flutter_webの使用
1. `C:\src\flutter\.pub-cache\bin`と`C:\src\flutter\bin\cache\dart-sdk\bin`
にパスを通しておく
2. [Flutterの公式](https://github.com/flutter/flutter_web)のとおり`flutter pub global activate webdev`を叩く
3. `C:\src\flutter\examples\hello_world`に移動して、`flutter pub upgrade`を叩き、パッケージを更新する
4. `Android Studio`でAVDを立ち上げ、`hello_world`ディレクトリを`Android Studio`で表示

`lib/main.dart`をRunすると、ADVに`hello_world`と表示されれば導入完了です。
<img width="200" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193047/968e6ae3-b318-85f0-b630-c4565cb697ad.png">

## 最後に
どうしても

```shell
C:\src\flutter\examples\hello_world> webdev serve
webdev could not run for this project.
Could not find a file named "pubspec.yaml" in "C:\Users\user\AppData\Roaming\Pub\Cache\hosted\pub.dartlang.org\quiver-2.0.2"
```
となり、`localhost:8080`で表示するのを一旦省きました...
出来次第、更新したいとおもいます。
GCPを使ったゲームサーバの構築（マインクラフト） 構築その1

# 環境
この記事では以下の環境で作業を行います。

【ハードウェア】
端末：macbookPro2016
OS：Mojave（10.14.4)

【ソフトウェア】
ブラウザ：Chrome

【サービス】
クラウド：GoogleCloudPlatform
ドメイン：未定（おそらくお名前.com？）

# 準備
Gmailのアカウントを作成し、GCPのアカウントを作成します。
私の場合は既に持っているためこの工程は省きます。

# GCPの設定
以下はGCPの設定を説明します。

## GCEインスタンスの作成
GCPのコンソール画面でGCEのインスタンスを作成します。
今回はなるべく安くするために、USリージョンにmicroのインスタンスを作成します。
（USリージョンにnanoのインスタンスを作成すれば無料運用可能です）
また、プリエンプティブインスタンスとして作成します。

## VMの設定

OpenJDKをインストール

```
sudo yum  -y install java-1.8.0-openjdk.x86_64
```

screenをインストール

```
sudo yum install screen
```

wgetをインストール

```
sudo yum install wget
```

gitをインストール

```
sudo yum install git
```

ユーザの追加

```
sudo adduser spiadmin
sudo passwd spiadmin
```

フォルダ作成

```
sudo mkdir /opt/spigot
chown spiadmin:spiadmin /opt/spigot
```

## spigotのインストール

```
su - spiadmin
cd /opt/spigot
git config --global --unset core.autocrlf
wget https://hub.spigotmc.org/jenkins/job/BuildTools/lastSuccessfulBuild/artifact/target/BuildTools.jar
java -Xmx768M -jar BuildTools.jar --rev 1.12.2
java -Xms768M -Xmx768M -jar spigot-1.12.2.jar nogui
vi eula.txt

---変更前
eula=false
---変更後
eula=true
---

java -Xms768M -Xmx768M -jar spigot-1.12.2.jar nogui
```

(書き途中)

（2020年2月13日追記）
ずっと書き途中の状態でほったらかしだったので、あと1〜２ヶ月以内には書き終えようと思う。
画面のキャプチャとったりと大変そうだったので手をつけるのをやめてしまっていた。
一旦Terraformを使った方法に切り替える予定。
SAS Viyaでデータソースの型を指定する

SAS ViyaはAIプラットフォームです。データソースは様々なものが指定できますが、今回はそんなデータソースのデータ型を指定する方法について紹介します。

## ライブラリを読み込む

ライブラリを読み込みます。トライアル環境の場合は[SAS Viyaのトライアル環境で html5lib を追加する - Qiita](https://qiita.com/ViyaDev/items/dd5b367eed4fcb7a11b3)を最初に行ってください。

```py
from swat.cas import datamsghandlers as dmh
```

## 通常の例

今回はHTMLファイルをデータソースに使います。トライアル環境の場合はURL指定ができませんので、HTMLファイルをアップロードした上で指定してください。今回は[FDIC: Failed Bank List](https://www.fdic.gov/bank/individual/failed/banklist.html)を使っています。

```py
htmldmh = dmh.HTML('./FDIC_ FailedBankList.html')
```

データ型などは自動的に判別されます。

```py
out.casTable.columninfo(table=dict(name='banklist', caslib='casuser'))
```

| Column | ID | Type | RawLength | FormattedLength | NFL | NFD |
|--------|--------|--------|--------|--------|--------|--------|--------|
| 0 | Bank Name | 1 | varchar | 90 | 90 | 0 | 0 |
| 1 | City | 2 | varchar | 18 | 18 | 0 | 0
| 2 | ST | 3 | varchar | 2 | 2 | 0 | 0
| 3 | CERT | 4 | int64 | 8 | 12 | 0 | 0
| 4 | Acquiring Institution | 5 | varchar | 65 | 65 | 0 | 0
| 5 | Closing Date | 6 | varchar | 18 | 18 | 0 | 0
| 6 | Updated Date | 7 | varchar | 18 | 18 | 0 | 0

このカラムを見ると、Closing DateとUpdated Dateが文字列として認識されてしまっています。日付型の方が良いでしょう。

## 型を指定する

日付型の場合、parse_datesオプションを使います。5と6というのはカラムの番号（上のテーブル参照）です。

```py
htmldmh = dmh.HTML('./FDIC_ FailedBankList.htm', parse_dates=[5,6])
```

そして先ほどのテーブルと差し替えます。

```py
out = conn.addtable(table='banklist', caslib='casuser', replace=True, **htmldmh.args.addtable)
```

そうすると、型が変わっているのが分かります。

```py
out.casTable.columninfo(table=dict(name='banklist', caslib='casuser'))
```

| Column | ID | Type | RawLength | FormattedLength | Format | NFL | NFD
|--------|--------|--------|--------|--------|--------|--------|--------|
| 0 | Bank Name | 1 | varchar | 90 | 90 |  | 0 | 0
| 1 | City | 2 | varchar | 18 | 18 |  | 0 | 0
| 2 | ST | 3 | varchar | 2 | 2 |  | 0 | 0
| 3 | CERT | 4 | int64 | 8 | 12 |  | 0 | 0
| 4 | Acquiring Institution | 5 | varchar | 65 | 65 |  | 0 | 0
| 5 | Closing Date | 6 | datetime | 8 | 20 | DATETIME | 0 | 0
| 6 | Updated Date | 7 | datetime | 8 | 20 | DATETIME | 0 | 0

## まとめ

型を指定することで、より分析や絞り込みがしやすくなるでしょう。ぜひお役立てください。トライアルは無料でできますので、ぜひお試しください。

[SAS for Developers | SAS](https://developer.sas.com/home.html)
Dockerって何？？学習内容のメモ

# 従来の仮想化とコンテナ型仮想化の違い
### 従来の仮想化技術
* OS上のハイパーバイザーを利用し、複数の仮想OSを立てる
* 仮想マシンを立てるためのイメージサイズが大きい
* 起動が遅い

### コンテナ型仮想化

* Dockerコンテナの起動・開始・削除などのコンテナの操作はOS上のDockerEngineを介して実行する
* ホストOSのカーネルを使用する
* 非常に軽量に動作する

# コンテナ型仮想化のメリデメ

メリット

* 動作が早く、リソースの使用率も少ない
* アプリケーション実行の再現性が高い

デメリット

* カーネルを共有できないOSを動かすことはできない
* ホストOSと仮想マシン間の分離レベルが低い

# 用語説明
カーネル
> ハードウェアとソフトウェアの仲立ちをしてくれる、*OSの根幹*となるものです。
[【初心者向け】Linuxカーネルって一体なんだ？ - Qiita](https://qiita.com/uguis410/items/17ec1e447e9716bfdca7)

オーバーヘッド
> 付加的に発生した処理（負荷）のこと
 [https://wa3.i-3-i.info/word12471.html](https://wa3.i-3-i.info/word12471.html)
Qt windows10 opencv3.4.6 インストールとQtでの動作確認


環境：
VisualStudio community 2015
Qt5.7
C++
openCV3.4.6

-----------------
■　インストール
-----------------

①github からダウンロード：https://github.com/opencv/opencv/releases
 opencv-3.4.6-vc14_vc15.exe

②デフォルトのまま実行し、C:\opencvに展開する。


③Windowsに環境変数追加
・「コントロールパネル＞システム＞システムの詳細設定」
または
・「スタートボタン右クリック＞システム＞システムの詳細設定」

詳細設定タブ
-環境変数ボタン

Path変数に、新規追加として下記2行を入れる
C:\opencv\build\x64\vc14
C:\opencv\build\x64\vc14\bin
C:\opencv\build\x64\vc15
C:\opencv\build\x64\vc15\bin

④再起動

-----------------
■　動作確認　c:\work\qt\test_openCV
-----------------
①Qt Creatorから、「ファイル」→「ファイル/プロジェクトの新規作成」を押し、プロジェクト欄から
「アプリケーション」を、中ペインから「Qt GUIアプリケーション」を選択し「選択」をクリック。

名前、パスは適当に。ここでは名前を「TestCV」、パスを「C:\qtprojects」とする。
キットは２つともチェックしたまま「次へ」。
クラス名は適当にTestCVWindowとでもする。

②
TestCVWindow.proを開いて、末尾に以下を追加。

# OpenCV settings
# for Windows
win32:DEPENDPATH  += "C:\opencv\build\include"
win32:INCLUDEPATH += "C:\opencv\build\include"
win32:LIBS += -L"C:\opencv\build\x64\vc14\lib"
win32:LIBS += -L"C:\opencv\build\x64\vc15\lib"
win32:LIBS += -lopencv_world346

↑win32:LIBS += -L　は vc14, vc15 どちらかだけでいいかも

-----------------
参考URL: https://amiq11.hatenablog.com/entry/2013/09/03/105504
-----------------
「trap」タグについて

### 対象

https://qiita.com/tags/trap


### 説明

気づかずにやってしまう失敗(の罠)。
将来、ハマリにつながるであろう事項。
それらをまとめたタグ。

将来のハマリによる時間損失を減らすことを目的としている。

異なるタグとAND検索することで、それぞれの環境での「罠」が見つかる。
[Oracle]sqlplusの出力をCSV形式で出すための簡単な方法

# これは
OracleからデータをCSV形式で出力する際に、クエリ芸を使うのは辞めよう、という話です。

以下をクエリ芸と（勝手に）呼びます。
パイプとクオートがゲシュタルト崩壊しそうですね＞＜

```sql
SELECT
  '"' || SHOUHIN_ID || '"' ||
  ',"' || TO_CHAR(SHIPPING_DATE, 'YYYY/MM/DD') || '"' || 
  ',' || QUANTITY || 
  ',"' || TO_CHAR(TO_DATE('ARRIVAL_DATE', 'YYYY/MM/DD HH24:MI:SS'), 'YYYY/MM/DD HH24:MI:SS') || '"'
FROM SHOUHIN_MASTER;
```

# ではどうするか
OracleClientの12.2以上をお使いであれば、簡単です！
(12.1以前ならアップしましょう、基本的に下位互換ですよ）

## SET MARKUP CSV ON を宣言しよう

```sql
SET MARKUP CSV ON
SELECT
  SHOUHIN_ID,TO_CHAR(SHIPPING_DATE, 'YYYY/MM/DD'),QUANTITY,TO_CHAR(TO_DATE('ARRIVAL_DATE', 'YYYY/MM/DD HH24:MI:SS'), 'YYYY/MM/DD HH24:MI:SS')
FROM SHOUHIN_MASTER;
```
## sqlplusのオプションを使おう

sqlplusのオプションに `-M "csv on"` を付与するだけです。

```bash
sqlplus64 -S -M 'csv on' ${ORACLE_USR}/${ORACLE_PSW}@${ORACLE_DB} @exec.sql
```

# 参考情報
* [SQL*Plusユーザーズ・ガイドおよびリファレンス, リリース2 (12.2) - 12.41.36 SET MARK[UP]](https://docs.oracle.com/cd/E82638_01/sqpug/SET-system-variable-summary.html#GUID-0AA910C4-C22A-4A9E-BE13-AAA059CC7919)
* [津島博士のパフォーマンス講座 第62回　Oracle Database 12cR2のSQL*Plusについて](https://www.oracle.com/technetwork/jp/database/articles/tsushima/tsushima-hakushi-62-3900161-ja.html)
* [Discover blog. - Oracle 12cR2 新機能 「CSVレポートの作成」を試す](https://discover.idp-jp.com/Oracle-12c-Release2-new-future-in-sqlplus-CSV.html)
* [Christian Gohmann - Generate CSV with SQL*Plus 12.2.0.1](http://christian-gohmann.de/2017/07/18/generate-csv-output-with-sqlplus-12-2-0-1/)
Jetson AGX Xavier 奮闘記

Jetson AGX Xavier を入手したのでインストールから。

PciでXavier Clusterを構築するまでの奮闘記。

まずは準備で大変。

# 全体の流れ

1. ubuntu 18.04 マシンを準備、以後母艦
2. nvidia account 作成
3. nvidia siteからsdk managerをダウンロード
4. sdk managerでjetpack 4.2をダウンロード
5. jetpackを母艦にインストール
6. xavierをusb接続し、flash書き込み
7. 母艦とxavierをネットワークに接続し、sshでインストール


長いインストールの旅に出る。

# ubuntu準備

手元にubuntuマシンが無いため、ほぼ隠居中のwinマシンをubuntu dual bootに。

今更、デュアルブートなんてと思いつつ、下記の流れ。

1. win のntfsを縮小して、ubuntu用のパーティションを確保
2. ubuntu download
3. bootabe usb作成ツールrufusをダウンロード
4. usb flashにbootable ubuntu書き込み
4. boot orderを確認し、usb boot
5. ubuntu install
6. ubuntu boot
7. network が802.1X認証なので、wpa_supplicant設定
8. 外部に出るためのproxy設定
9. 何とかubuntu update

この辺りで疲れたので、以後はまたの機会に。
M5Stack と PubSubClient で SORACOM Beam 越しに MQTT で Amazon MQ と Pub/Sub する

[Qiita 内の Amazon MQ エントリー数 No.1 (5/25時点)](https://qiita.com/tags/amazonmq) の松下です。

[ワイもく！ Vol.8](https://ymoku.connpass.com/event/128260/) の中の 「[第5回 M5Stack もくもく会](https://m5staff.connpass.com/event/128145/)」に参加、M5Stack と PubSubClient で SORACOM Beam 越しに MQTT で Amazon MQ と Pub/Sub を試してみました。

[![](http://img.youtube.com/vi/ovEK7IS5jo8/0.jpg)](http://www.youtube.com/watch?v=ovEK7IS5jo8)

## 構成

~~残念なことに~~ 通信部分はモバイルルーターを使ってます (^^;;;

![全体構成図](https://docs.google.com/drawings/d/e/2PACX-1vSsA0dduRylFb5mbgxikio7xmadyhmM7Df2kDa6lN83SctTxCT48EPx0d1ttl3u6kwIRZeZpI5wdHSo/pub?w=944&h=203)

## 実装

以下、実装です。

### コード(スケッチ)

```c++
#include <WiFi.h>
#include <WiFiClient.h>
#include <PubSubClient.h>
#include <M5Stack.h>
 
char *ssid = "SSID";
char *password = "Pass";

#define __VERSION__   "1.0.0"
#define LOOP_INTERVAL (6000)

char *THING_NAME = "M5Stack";

////////////////////////////////////////////////////////////////////////////////
   
WiFiClient netClient;
PubSubClient MqttClient;

void callback(char* topic, byte* payload, unsigned int length) {
    String buf_t = String(topic);
    Serial.print("Incoming: "); Serial.println(buf_t);
    payload[length] = '\0';
    String buf_s = String((char*) payload);
    M5.Lcd.clear();
    M5.Lcd.setCursor(10, 10);
    if (length == 1) {
        int n = buf_s.toInt();
        M5.Lcd.setTextSize(1);
        M5.Lcd.printf("setTextSize = %d\n", n);
        M5.Lcd.setTextSize(n);
    } else {
        M5.Lcd.clear();
        int src_len = buf_s.length() + 1;
        char s[src_len];
        buf_s.toCharArray(s, src_len);
        M5.Lcd.printf(s);
    }
}

void setup_network() {
    Serial.print("Connecting to ");
    Serial.println(ssid);
    WiFi.begin(ssid, password);
    while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
    }
    Serial.println();
    Serial.println("WiFi Connected.");
}

void connect() {
    setup_network();
    Serial.print("ThingName(mqtt_id): "); Serial.println(THING_NAME);
    MqttClient.setServer("beam.soracom.io", 1883);
    MqttClient.setCallback(callback);
    MqttClient.setClient(netClient);
    if (!MqttClient.connect(THING_NAME)) {
        Serial.println(MqttClient.state());
    }
    MqttClient.subscribe("m5stack/sub/#");
}

void setup() {
    Serial.begin(115200);
    M5.begin();
    connect();
    M5.Lcd.fillScreen(BLACK);
    M5.Lcd.setTextColor(WHITE);
    M5.Lcd.setTextSize(1);
    M5.Lcd.printf("Ready");
}
   
void loop() {
    unsigned long next = millis();
    while (millis() < next + LOOP_INTERVAL) {
        MqttClient.loop();
    }
    Serial.println("loop");
    MqttClient.publish("m5stack/ping", "(^^)");
}
```

### Amazon MQ と SORACOM Beam

詳しくはこちらで。

* [Amazon MQにmosquitto(MQTT)とMQTT over Websocketで接続してみる](https://qiita.com/ma2shita/items/bfdd99a5b99c6baaba82)
* [SORACOM Beam(MQTT → MQTTS変換サービス) で Amazon MQ に接続する](https://qiita.com/ma2shita/items/b42f6bb03a7de044b02b)

## おわりに

うーん、M5Stack にセルラー通信が入ってくれると嬉しい。ケースには入ってるし、モニターもついてるし、電池も入ってるし！！

ワイもく！さんは「コラボ推奨」とのことで、みんなでワイワイやれたのは楽しかったです！

EoT
どこで区切れば合計が同じ数になる？？？

こんにちは！！

今日は以下のような仕様のコードを書いてみました。

<b>仕様</b>
数字の配列が複数与えられます。
各配列の要素をどこかで区切ることによって左右の合計は同じ数になります。
どこで区切れば左右の数の合計が同じ数になるか返すプログラムを作ります。
また、返す際は左側の数字をA,右側の数字をBの文字列にします。

例 input = [
[3, 7, 4, 5, 1],
[6, 9, 1, 8, 8],
[11, 2, 5, 2, 2]
]

output = [
  %w(A A B B B),
  %w(A A A B B),
  %w(A B B B B)
]

こんなの日常的になくない？と思う方もいるかもしれませんが、温かい目で見守って下さると嬉しいです笑

<b>コード</b>

```rb
class ArrayNumbers
  def initialize(arr_num)
    @arr_num =  arr_num
  end

  def separate
    @arr_num.map do |row|
      i = 1
      while i <= row.size
        if row[0...i].sum == row[i..-1].sum
          break(("A" * i )+ ("B" * (row.size - i))).chars
        end
        i += 1
      end
    end
  end
end
```

このようなコードになりました！
初めはmapを使わず、eachメソッドで一文字ずつ配列に入れていたのですが、それだとコードが長くなってしまうのでmapメソッドで最後に評価した値を配列に入れることにしました。
その際while式の戻り値はnilってことを知らなかったので配列の要素が全部nilになっているのを見たときはビックリしました笑
breakに引数を渡せばよかったんですね〜。

個人的には戻り値がもう少しスッキリした書き方があるかな〜と模索していたのですが結局見つかリませんでした泣

<b>追記</b>

@scivola さんからのアドバイスを元にリファクタリングをしてみました！！

```rb
class ArrayNumbers
  def initialize(arr_num)
    @arr_num =  arr_num
  end

  def separate
    @arr_num.map do |row|
      1.upto(row.size) { |i|
        if row[0...i].sum == row[i..-1].sum
          break ["A"] * i + ["B"] * (row.size - i)
        end
      }
    end
  end
end

#使用例

input = [
[3, 7, 4, 5, 1],
[6, 9, 1, 8, 8],
[11, 2, 5, 2, 2]
]

p ArrayNumbers.new(input).separate
#=>["A", "A", "B", "B", "B"],
 # ["A", "A", "A", "B", "B"],
 # ["A", "B", "B", "B", "B"]
```

uptoメソッドは繰り返しとループカウンターを同時に使いたいときにうってつけのメソッドでした！！！
存在自体は知っていたものの活用できていませんでした〜

Array#*は配列を繰り返したい時に使うメソッドです。
これは知らなかった！！！！

勉強になりました！
AWS CLIを使ってIAMユーザを一括登録する

# はじめに
AWSでユーザを一括作成したかったのですが、
画面ポチポチでなくてCLIで一括作成したかったので・・・

# 前提条件
・[AWS CLI](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-chap-install.html)をインストールしていること。
・AWS CLIの[初期設定](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-chap-configure.html#cli-quick-configuration
)をしていること。
・初期設定したロールにIAMの権限が付与されていること。
・アタッチする[IAMグループ](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_groups.html)が予め作成されていること。

# 説明
createUser.csvを基にIAMユーザを一括作成します。
一括作成時に予め作成したIAMグループをアタッチします。
作成したユーザーでログインすると初期パスワードの設定を求められます。

# ブツ

###シェル

```shell:createUser.sh
for a in `cat $1`
do
USER_NAME=`echo ${a} | awk -F, '{print $1}'`
USER_PASS=`echo ${a} | awk -F, '{print $2}'`
GROUP_NAME=`echo ${a} | awk -F, '{print $3}'`
aws iam create-user --user-name ${USER_NAME} && \
aws iam create-login-profile --user-name ${USER_NAME} --password ${USER_PASS} --password-reset-required && \
aws iam add-user-to-group --user-name ${USER_NAME} --group-name ${GROUP_NAME}
done
```

###リスト
[ ユーザ名,パスワード,IAMグループ ]の3カラム構成です。

```shell:createUser.csv
Practice_user01,P@ssw0rd!!!,AWS_Practice_Group
Practice_user02,P@ssw0rd!!!,AWS_Practice_Group
Practice_user03,P@ssw0rd!!!,AWS_Practice_Group
Practice_user04,P@ssw0rd!!!,AWS_Practice_Group
Practice_user05,P@ssw0rd!!!,AWS_Practice_Group
```

# 使用方法

シェルとリストをカレントディレクトリに配置して叩くだけです。
例1の場合レスポンスを標準出力します。
例2の場合レスポンスをテキストに保存します。

例1：
\$ sudo bash createUser.sh createUser.csv

例2：
\$ sudo bash createUser.sh createUser.csv > createUserResult.txt

```shell:response
{
    "User": {
        "Path": "/",
        "UserName": "Practice_user01",
        "UserId": "XXXXXXXXXXXXXXXXXXX",
        "Arn": "arn:aws:iam::043333398123:user/Practice_user01",
        "CreateDate": "2019-05-25T07:31:35Z"
    }
}
{
    "LoginProfile": {
        "UserName": "Practice_user01",
        "CreateDate": "2019-05-25T07:31:36Z",
        "PasswordResetRequired": true
    }
}
```

# AWSコンソールへのアクセス方法
ログインURLにログインしてユーザおよびパスワードを入力するだけ。
そうするとパスワードの変更を求められるので、変更する。
予め管理アカウントでパスワードポリシーの強化やMFA設定をしておくのをオススメします。

https://[response中のArnに記載されている数字].signin.aws.amazon.com/console
上記responceだとアクセスURLは下記になる。
https://043333398123.signin.aws.amazon.com/console

# 終わりに
自分への備忘録程度に残しておきます。
何かありましたらコメントや修正リクエストいただけると幸いです。
PHPで自作APIを作り、axiosでデータを取ってきて表示する

phpで自作APIを作り、そのデータをaxiosを使って検索して取ってくるというものを作ります。
完成イメージ↓
![ezgif.com-video-to-gif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320755/3efa7b92-a928-e177-9366-4c91b658f8bb.gif)


まずはhtmlです。

```html
  <input type="text" class="input">
  <div class="result"></div>

  <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
  <script src="./app.js"></script>
```

（axios→https://github.com/axios/axios）

inputに入力された値に応じて結果を表示します。

jsでは入力されるたびにaxiosで通信する処理をします。

```javascript

document.querySelector('.input').addEventListener('keyup', function() {

  // 結果表示の要素を取得
  const result = document.querySelector('.result');

  // 入力が空だったら結果表示を空にして処理を止める
  if(!this.value) return result.textContent = '';

  // パラメータの指定
  let params = new URLSearchParams();
  params.append('input_val', this.value);

  axios.post('./api.php', params).then(response => {
    result.textContent = response.data.text; // 結果の文字列を表示する
    result.style.color = response.data.color; // 結果の色を適用する
  }).catch(error => {
    // エラーを受け取る
    console.log(error);
  });
});
```

パラメータの指定について→https://qiita.com/taroc/items/f22f7dd5d6d5443c72a4

通信先のapi.phpでは、送られてきた値によって出力するデータを決める処理をしています。

```php
<?php
// 検索対象の配列
$data = ['kyuri', 'gobo', 'tomato', 'ninjin', 'toufu'];

if(empty($_POST['input_val'])){
  exit(); // POSTが空だったら終了する
}

// 出力する配列を作る関数
function createResponse($val, $isIn){
  $result = [
    'text' => $isIn ? $val.' あるよ!' : $val.'はないよ...', // 第2引数の$isInがtrueかfalseかで内容を変える
    'color' => $isIn ? 'red' : 'blue' // 第2引数の$isInがtrueかfalseかで赤か青かを決める
  ];
  return $result;
};

// POSTされた入力内容の値を変数に格納
$inputValue = $_POST['input_val'];

// in_arrayで入力内容の値が配列に存在するか調べる
if(in_array($inputValue, $data)){

  // 存在する場合第2引数をtrueにしてcreateResponse関数を呼び出し、出力する
  echo json_encode(createResponse($inputValue, true));
  exit();

}else{

  // 存在しない場合第2引数をfalseにしてcreateResponse関数を呼び出し、出力する
  echo json_encode(createResponse($inputValue, false));
  exit();

}
```

json_encodeも忘れずに！
php-master-changes 2019-05-24

今日は variance（戻り値型宣言の共変と引数型宣言の反変） のサポート追加、opcache 有効時にメソッドのシグネチャ互換性チェックで class_alias が考慮されない問題の修正、親がない場合の parent の利用の非推奨化、Windows で net_get_interfaces() のエラー時になるべくエラー内容を出力するようにする修正があった！

# 2019-05-24
## nikic: Avoid early-binding on unresolved types
- https://github.com/php/php-src/commit/afec3a9208c2a34762a87cb797f28e7e61c88cca
- 未解決型の早期バインドを避けるよう修正
- [#76451](https://bugs.php.net/bug.php?id=76451) の修正、opcache 有効時にメソッドのシグネチャ互換性チェックで class_alias が考慮されず、クラス名の文字列比較のみで検査が通らない問題があった
- [variance](https://wiki.php.net/rfc/covariant-returns-and-contravariant-parameters) の実装のためにも解決する必要のあった問題

## nikic: Implement basic variance support
- https://github.com/php/php-src/commit/49a3b03e9fa3b6a7ef5302a48203b03e9d870ce9
- [7.4~]
- [variance](https://wiki.php.net/rfc/covariant-returns-and-contravariant-parameters) の最小限の実装
- 型の循環的な依存関係は未サポート
- preloading 可否の制限がちょっと厳しめ（別途で改善する気らしい）

## nikic: Split up "parent" test cases
- https://github.com/php/php-src/commit/299cf7e78a39fb6789c73dfe2e372f9cc55b83bb
- 型指定での parent 利用時のテストケースをファイル分割
- PHP 8 以降ではエラーが Fatal になるので同じファイルでテストできないもよう

## devnexen: list net/interfaces, trying to get the error on windows when possible
- https://github.com/php/php-src/commit/d9747c23a2e16825e141c5b2573afb805d42f97f
- [7.4~]
- Windows で net_get_interfaces() のエラー時になるべくエラー内容を出力するよう修正

## nikic: Deprecate use of parent where no parent exists
- https://github.com/php/php-src/commit/d7f3844c87c11073b717d0e888ab0d5c4074f216
- [7.4~]
- 親がない場合の parent の利用を非推奨化
- [variance の RFC](https://wiki.php.net/rfc/covariant-returns-and-contravariant-parameters) で含まれている内容

## nikic: Add UPGRADING/NEWS entries
- https://github.com/php/php-src/commit/32f87bb575fc147dea57770d5f175831b8662141
- [7.4~]
- variance のサポートにあわせて UPGRADING / NEWS の更新
SAS ViyaでExcelのテーブルをデータソースにする

SAS ViyaはAIプラットフォームです。データソースは様々なものが指定できますが、今回はExcelファイルをターゲットにする方法を紹介します。

## ライブラリの読み込み

ライブラリを読み込みます。

```py
from swat.cas import datamsghandlers as dmh
```

## Excelファイルを指定する

次にExcelファイルを指定します。トライアル環境の場合はURL指定ができませんので、Excelファイルをアップロードした上で指定してください。今回は[2015 Crop Year Secretarial Disaster Designations](https://www.fsa.usda.gov/Internet/FSA_File/disaster_cty_list_ytd_15.xls)を使っています。

```py 
exceldmh = dmh.Excel('./disaster_cty_list_ytd_15.xls')
```

データ型などは自動的に判別されます。

```py
exceldmh.args.addtable
{'datamsghandler': <swat.cas.datamsghandlers.Excel at 0x7f47ab9b95c0>,
 'reclen': 320,
 'vars': [{'length': 8,
   'name': 'FIPS',
   'offset': 0,
   'rtype': 'NUMERIC',
   'type': 'SAS'},
  {'length': 16,
   'name': 'County',
   'offset': 8,
   'rtype': 'CHAR',
   'type': 'VARCHAR'},
  {'length': 16,
   'name': 'State',
   'offset': 24,
   'rtype': 'CHAR',
   'type': 'VARCHAR'}
   :
}
```

## Viya用のテーブルにする

まずSAS Viyaのオブジェクトを作ります。

```py
from swat import *

cashost='localhost'
casport=5570
useremail='dev@viya.com'
userpassword='password'
casauth='~/.authinfo'
conn = CAS(cashost, casport, useremail, userpassword, caslib="casuser")
```

そしてテーブルを取り込みます。

```py
out = conn.addtable(table='crops', caslib='casuser', **exceldmh.args.addtable)
```

### テーブルの構造を確認する

テーブル構造を確認します。

```
out.casTable.columninfo(table=dict(name='crops', caslib='casuser'))
```

| Column | ID | Type | RawLength | FormattedLength | Format | NFL | NFD |
|--------|----|------|-----------|-----------------|--------|-----|-----|
| 0 | FIPS | 1 | double | 8 | 12 |  | 0 | 0 |
| 1 | County | 2 | varchar | 15 | 15 |  | 0 | 0 |
|  : |: |: |: |: |: |: |: |: |
| 33 | Unnamed: 33 | 34 | varchar | 101 | 101 |  | 0 | 0 |
| 34 | Unnamed: 34 | 35 | double | 8 | 12 |  | 0 | 0 |

このように文字型、数字型を自動的に判別されていれば大丈夫です。

## まとめ

他にもデータソースはHTMLファイルやCSVファイルなども利用できます。多彩なソースを取り込んで分析できますので、ぜひトライアルをお試しください。

[SAS for Developers | SAS](https://developer.sas.com/home.html)
ReadOnlyAccess --幻のRAMポリシー

## メモ

　2019年5月25日時点、日本サイトのAliCloudアカウントにない幻のRAMポリシーReadOnlyAccess。ReadOnlyAccessは名の通り、すべてのAliCloudのプロダクトに対して、閲覧のみできる権限で、非常に重要なRAMポリシーです。

　AliCloudの中国サイトとインターナショナルサイトにはあって、日本サイトにはまだないものです。

## ReadOnlyAccess

```
{
    "Version": "1",
    "Statement": [
        {
            "Action": [
                "*:Describe*",
                "*:List*",
                "*:Get*",
                "*:BatchGet*",
                "*:Query*",
                "*:BatchQuery*",
                "actiontrail:LookupEvents",
                "dm:Desc*",
                "dm:SenderStatistics*"
            ],
            "Resource": "*",
            "Effect": "Allow"
        }
    ]
}
```

## 最後

早く来てほしいです。
MacでのPythonインストール[2019年版]

NewPCを手に入れて、環境構築し直したついでで、Mac環境下でのpythonのインストール方法を説明します。

過去の記事ではエラーが発生する部分があり、記事を書きました。

# XCODEのインストール
　以下のコマンドでインストールできます。AppStoreからインストールしても特に問題ありません。
('#'はコメントアウトです。実際には無視してください。)

```terminal
# xcode のインストール
$ xcode-select --install
```

# Homebrewのインストール
すでにインストールしている方は問題ありません。

まだインストールしていない方は[Homebrewの公式サイト](https://brew.sh/index_ja)を参照にインストールしてください。

```terminal
# Homebreのインストール
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
# インストールの確認
$ brew doctor
```

# pyenv のインストール
pyenvはpythonのバージョン管理ツールです。
お使いのシェルがbashの場合以下で実行できます。

```terminal
$ brew pyenv install
$ cat << 'EOS' >> ~/.bash_profile
export PYENV_ROOT=/usr/local/var/pyenv
if which pyenv > /dev/null; then eval "$(pyenv init -)"; fi
EOS
$ source ~/.bash_profile
$ pyenv --version
```


私はShellがfishなので、以下のようにしました。

```terminal
$ vim ~/.config/fish/.config_fish
############~/.config/fish/.config_fishに以下の２文を適当なところに挿入。
set PATH $HOME/.pyenv/shims $PATH
eval (pyenv init - | source)
############

# 変更を反映する。
source ~/.config/fish/.config_fish
```
Vimの使い方に関しては[こちら](https://qiita.com/hide/items/5bfe5b322872c61a6896)を参照してください。

# Pythonのインストール
`pyenv install -l`で確認し、最新のバージョンをインストールするといいかと思います。

```termina
# インストールできるPythonの一覧を確認する
$ pyenv install -l

# 3.7.3をインストールする
$ pyenv install 3.7.3

# いま使っているPythonのバージョンを確認する
$ pyenv versions

# いまインストールした3.7.3を使うように設定する
$ pyenv global 3.7.3

# 確認
$ pyenv versions
$ python
```

# 補足
新しいバージョンのpythonをインストールする場合、以下のようなエラーが起きることがあります。

```
$ pyenv install 3.7.0
python-build: use openssl from homebrew
python-build: use readline from homebrew
Downloading Python-3.7.0.tar.xz...
-> https://www.python.org/ftp/python/3.7.0/Python-3.7.0.tar.xz
Installing Python-3.7.0...
python-build: use readline from homebrew
^C
BUILD FAILED (OS X 10.14.5 using python-build 20180424)

Inspect or clean up the working tree at /var/folders/y5/2w1v0zm51476s61mkkt2f1gjrmbh7c/T/python-build.20190525155211.97757
Results logged to /var/folders/y5/2w1v0zm51476s61mkkt2f1gjrmbh7c/T/python-build.20190525155211.97757.log
```

他の記事ではxcodeのインスールをするように勧めているのですが、お使いのMacがMojaveあるいは10.14より新しいものだとエラーが改善しません。
その場合以下を実行してください。

```terminal
$ sudo installer -pkg /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg -target /

$ brew install readline xz
```
以下のような表示が出ればPythonインストール完了です。お疲れ様でした。

```
$ python
Python 3.7.3 (default, May 25 2019, 15:59:37)
[Clang 10.0.1 (clang-1001.0.46.4)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>
```

参照
https://github.com/pyenv/pyenv/wiki/Common-build-problems#build-failed-error-the-python-zlib-extension-was-not-compiled-missing-the-zlib
Python×Seleniumで自動化するための環境構築

# 環境構築（Mac用）

Mac OSにはデフォルトでPythonがインストールされているため、そこはスキップ。

## Homebrewのインストール

```
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

確認コマンド

```
brew doctor
```

## chrome-driverのインストール
```
brew cask install chromedriver
```

## pipのインストール

pipとは？
pipはPythonのパッケージを管理するためのツールになる。
パッケージには、『公式が配布しているもの』『サードパーティが配布しているもの』と大きく分けて2つがある。
サードパーティのパッケージはPyPIというサイトで配布されている。
引用元：PyPl　https://pypi.org/


```
# pipがインストールされているかを確認
python -m pip -V
```

インストールされていない場合、get-pip.pyを下記のURLよりダウンロードして、pythonから実行する。
https://bootstrap.pypa.io/get-pip.py

```
python get-pip.py
```

## ChromeDriver のインストール
ChromeDriverとは？
Pythonのプログラム上でChromeを利用することができるようにするためのDriver。

```
#  installされていないことを確認
pip list

# install実行
pip install chromedriver-binary

#  installされたことを確認
pip list
```

## selennium のインストール
selenniumとは？
Webアプリケーションのテスト自動化を実現するブラウザ駆動型テストツール群です。Webブラウザの自動操作ライブラリとしてさまざまな機能を備えています。

```
#  installされていないことを確認
pip list

# install実行
pip install selenium

#  installされたことを確認
pip list
```

これで自動化するための環境づくりはできるはず。
あとは、Pythonのプログラム書いてどんどん自動化していきまっしょい！
isuconの過去問の環境構築(Mac, Vagrant, Virtualbox)

ここではMacでisuconの勉強をするためにVagrantとVirtualBoxを利用して動作環境を構築します。

# 動作環境
macOS Mojave version 10.14.4

# インストールするツール
Vagrant: v2.4.4
VirtualBox: 6.0

# ツールのインストール

## 方法❶　brewでのinstall

```.shell
$ brew cask install virtualbox
$ brew cask install vagrant
```

## 方法❷　HPよりダウンロード

Vagrant
https://www.vagrantup.com/downloads.html

VirtualBox
https://www.virtualbox.org/wiki/Downloads

virtualboxをインストール際にアラートが発生して「設定」アプリで「セキュリティとプライバシー」を調整するように促されますが、
「セキュリティとプライバシー」画面の下部に許可する内容と許可ボタンが現れるのでクリックし、再度インストールを試みてください。

## 動作環境のセットアップ

isuconの過去問それぞれの動作環境を用意したVagrantfile[こちら](https://github.com/matsuu/vagrant-isucon/) よりcloneします

```.shell
$ git clone https://github.com/matsuu/vagrant-isucon.git
```

ここでは例としてisucon6-qualifier(isucon6予選問題)のセットアップをしていきます。

```.shell
$ cd vagrant-isucon/isucon6-qualifier
$ vagrant up // OSからのセットアップがスタートします。
```

virtualBoxが自動的に起動すると思いますが、作成しているOSが起動中になり、`vagrant up`の完了を確認してから
benchとimageにそれぞれssh接続をしてください。

```.shell
$ vagrant ssh image
$ vagrant ssh bench
```

接続ができれば動作環境のセットアップできていると思います。
benchが正常に動くかどうかは[README](https://github.com/matsuu/vagrant-isucon/tree/master/isucon6-qualifier)より確認をお願いします。
Leetcode #79: Word Search

```swift
func exist(_ board: [[Character]], _ word: String) -> Bool {
    if word.isEmpty {
        return false
    }
    let word = Array(word)
    var board = board
    var candidates = [(Int, Int)]()
    for i in 0..<board.count {
        for j in 0..<board[0].count {
            if board[i][j] == word[0] {
                candidates.append((i,j))
            }
        }
    }
    for candidate in candidates {
        board[candidate.0][candidate.1] = "?"
        if helper(&board, word, candidate.0 + 1, candidate.1, 1) ||
           helper(&board, word, candidate.0 - 1, candidate.1, 1) ||
           helper(&board, word, candidate.0, candidate.1 + 1, 1) ||
           helper(&board, word, candidate.0, candidate.1 - 1, 1) {
           return true
        }
        board[candidate.0][candidate.1] = word[0]
    }
    return false
}

private func helper(_ board: inout [[Character]], _ word: [Character], _ i: Int, _ j: Int, _ index: Int) -> Bool {
    if index == word.count {
        return true
    }
    guard i >= 0 && i < board.count && j >= 0 && j < board[0].count else {
        return false
    }
    if board[i][j] == word[index] {
        board[i][j] = "?"
        if helper(&board, word, i + 1, j, index+1) || helper(&board, word, i - 1, j, index+1) ||
            helper(&board, word, i, j + 1, index+1) || helper(&board, word, i, j - 1, index+1) {
            return true
        }
        board[i][j] = word[index]
        return false
    } else {
        return false
    }
}
```
RubyonRailsでtwitter風webアプリケーションの作成 STEP4:投稿機能の一覧表示、新規投稿

投稿用のモデル、テーブルの作成

```ruby:コマンドライン
$ rails g model Tweet body:string user_id:integer
$ rails db:migrate
```

投稿用のコントローラーの作成

```ruby:コマンドライン
$ rails g controller Tweets index new create show edit destroy
```

ルーティングの設定

```ruby:config/routes.rb
  resources :users do
    resources :tweets, only: [:new,:create]
  end
  get "tweets/index"
```

ユーザーモデルとツイートモデルを紐付ける

```ruby:app/models/users.rb
has_many :tweets
```

```ruby:app/models/tweets.rb
belongs_to :user
```


新規投稿用のビューを作成

```erb:app/views/tweets/new.html.erb
<h3 class="page-header">今日の出来事をつぶやこう</h3>
<%= form_for([@user, @user.tweets.build]) do |f| %>
<p><%= f.label :body,"投稿内容" %></p>
<p><%= f.text_area :body %></p>
<p><%= f.submit "投稿", class: "btn btn-primary" %></p>
<% end %>
```

投稿一覧用のビューを作成

```erb:app/views/tweets/index.html.erb
<h3 class="page-header">ツイート一覧</h3>
<ul class="list-group">
  <% @tweet.each do |tweet| %>
  <li class="list-group-item">
    <span class="badge text-danger"><%= link_to "[削除]",tweets_destroy_path,method: :delete %></span>
    <%= tweet.body %>
  </li>
  <% end %>
</ul>

```


tweetコントローラーの設定

```ruby:app/controllers/tweets_controller.rb
class TweetsController < ApplicationController
  def index
    @tweet = Tweet.all
  end

  def new
    @user = User.find(params[:user_id])
  end

  def create
    @user = User.find(params[:user_id])
    @user.tweets.create(tweet_params)
    redirect_to tweets_index_path
  end

  def destroy
    @tweet = Tweet.find(params[:id])
    if @tweet.destroy
    redirect_to "/",flash: {danger: "投稿を削除しました"}
  end
  end

  private
  def tweet_params
    params.require(:tweet).permit(:body)
  end
```

ブラウザで投稿機能の確認

![スクリーンショット 2019-05-25 16.30.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420746/123613cc-8855-543c-5805-0bdd21d94fd6.png)

![スクリーンショット 2019-05-25 16.30.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420746/465b3701-3887-94f8-fedc-da5eeed4ed61.png)

![スクリーンショット 2019-05-25 16.31.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420746/94f20b2d-beea-3ca6-2c64-1f8cff048f94.png)
Windows 10 の Windows Subsystem for Linux を使ってフォント Ricty を生成する

Windows Subsystem for Linux を使えば、Ricty 作者が示した手順どおりでフォント Ricty が生成できたので記録しておく。

ただし、Subsystem for Linux のインストール手順は含んでいない。また、以下の手順で、同じ結果が得られることは保証しない。

    Ricty 作者のページ
    https://www.rs.tus.ac.jp/yyusa/ricty.html


## 手順

1. 作業フォルダを決め、その直下に `.fonts` フォルダを作成する。以下は、作業フォルダを `C:\temp\ricty` として説明するので .fonts は `C:\temp\ricty\.fonts` になる。
1. GitHub から [Inconsolata](https://github.com/google/fonts/tree/master/ofl/inconsolata) を .fonts フォルダにダウンロードする。`Inconsolata-Bold.ttf` と `Inconsolata-Regular.ttf` が必要になる。
1. [プログラミング用フォント Ricty](https://www.rs.tus.ac.jp/yyusa/ricty.html) から `ricty_generator.sh` と `os2version_reviser.sh` を .fonts フォルダにダウンロードする。
1. [M+ と IPA の合成フォント](http://mix-mplus-ipa.osdn.jp/) から `Migu 1M` を .fonts フォルダにダウンロードする。
1. スタートメニューなどから Ubuntu コンソールを開く。  
    いつの間にやら、エクスプローラで Shift キーを押しながらフォルダを右クリックして `Linux シェルをここに開く` でもコンソールが開くようになっている!  
1. FontForge をインストールする。  
    `~$ sudo apt-get install fontforge` 
1. Ubuntu で作業フォルダに移動する。  
    `cd /mnt/c/temp/ricty`
1. 生成スクリプト `ricty_generator.sh` を実行する。  
    ` sh ricty_generator.sh auto`
1. 完了

## 確認した環境

- Windows 10 Home (バージョン 1903)
- Ubuntu 18.04.2 LTS (Bionic Beaver)
statusとstate 語源で学ぶ英単語。英語(4) 

# status
https://eigogen.com/word/status/
>L.stare（立つ）→L.status（地位）
>A state of affairs; situation. 

現在の状態(state)あるいは、その時の状態(state)をさす。

https://gogen-ejd.info/status/

# state
https://eigogen.com/word/state/
> L.sto/stare = to stand(立つ),
>A condition or mode of being

https://gogen-ejd.info/state/

# 比較
stateの現在の値がstatusあるいは、ある時点の値がstatus。

statusには、standingと動名詞での説明がある。
stateには、州、国などの確固としたものに使うこともある。

# mode
ある分野では、状態をModeという用語で表すことがある。
施法という日本語が訳になっている。
ある状態の振る舞いの方に着目しているのかもしれない。
通信関係では。

# 参考資料(reference)
「status vs state」論争に終止符を打つ
https://qiita.com/ysn551/items/01c1f849d801fab54956

state と status の違い
https://qiita.com/stomk/items/4c5fb1760f88343726d5

state と status の違い
https://qiita.com/yaju/items/235052dbd4601d7abec1

SpacemacsのVim stateでinsert modeでもキーバインドからカーソル移動する
https://qiita.com/v2okimochi/items/ed0513b2e580d2e506c9

## 自己参考(self reference)
英語(0) 一覧
https://qiita.com/kaizen_nagoya/items/680e3f5cbf9430486c7d

言語・文学記事　１００
https://qiita.com/kaizen_nagoya/items/42d58d5ef7fb53c407d6

日本語（０）一欄
https://qiita.com/kaizen_nagoya/items/7498dcfa3a9ba7fd1e68

一覧の一覧( The directory of directories of mine.) Qiita(100)
https://qiita.com/kaizen_nagoya/items/7eb0e006543886138f39

プログラマが知っていると良い「公序良俗」
https://qiita.com/kaizen_nagoya/items/9fe7c0dfac2fbd77a945

Error一覧 error(0)
https://qiita.com/kaizen_nagoya/items/48b6cbc8d68eae2c42b8

＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞
This article is an individual impression based on the individual's experience. It has nothing to do with the organization or business to which I currently belong.
# 文書履歴(document history)
ver. 0.01 初稿 　 20190526
ver. 0.02 ありがとう追記 　 20230529
### 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
####  Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.
jQueryでページ内の指定箇所にヌルッと移動

htmlで

```html
<a hreh=“#about”>ABOUT</a>
```

とすれば、id属性に「about」がついた箇所に移動できますが、一瞬で画面が変わってしまい味気なさがあります。

そこでjQueryを使ってヌルッと移動させる方法を紹介します。

htmlは以下です。

```html
<a class=“goSection” href=“#first”>FIRST</a>
<a class=“goSection” href=“#second”>SECOND</a>

  <section id="first">
    FIRST
  </section>

  <section id="second">
    SECOND
  </section>
```

goSectionというクラスがついた要素がクリックされた時、その要素のhref属性の値がついた箇所に移動するという処理をします。

```javascript

$(".goSection").on("click", function() {

    // クリックされた要素のhref属性の値を取得 例：#first
    const scrollTarget = $(this)[0].attributes[1].nodeValue;

    // 取得した値のid属性がついた要素の位置を取得
    const offsetTop = $(scrollTarget).offset().top;

    // 取得した箇所に移動
    $("html, body").animate({ scrollTop: offsetTop }, 200);

    return false;
});
```

以上です。
pythonでとにかく変数を打ち出したい。

fortranだったら

```fortran
write(999,*) "x, y, value, ", x, ',', y, ',',  value
```

と書くのをやりたい：

```python
l = ["x, y, value, ", str(x) + ', ', str(y)+ ', ', str(value)+ '\n']
f = open('x_y_value.txt','a')
f.writelines(l)
f.close()
```
AWSの概算合計請求額をAmazon SNSでメール通知する。

# はじめに
AWSの概算費用をメールで通知するスクリプトをAWS SDK for Rubyで作成しました。
処理の内容としては、「CloudWatchから値を取得」→「SNSを使ってメールで通知」という簡単なものです。
私は、EC2上のcronに登録して、1日2回通知するようにしています。

▼前提条件
Amazon SNSでトピック・サブスクリプションを作成していること
IAMでスクリプトが実行できる適切な権限のユーザーを作成していること
AWS SDK for Rubyが実行できる環境

# コード
Githubにアップしています。
https://github.com/longunder/utils/blob/master/aws_charge_notification/charge_notification.rb

変数や、環境変数は環境によって異なるので適宜修正が必要です。

▼参考情報
https://docs.aws.amazon.com/sdkforruby/api/Aws/CloudWatch.html
https://docs.aws.amazon.com/sdkforruby/api/Aws/SNS.html

# 実行結果
下記のようなメールが届きます。件名でも金額が分かるようになっています。
![mail.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369887/7959277c-f91b-dab8-2de5-0bacd4676332.png)
[Flutter for Web] ボタン押したら外部リンクに飛んで欲しい時

# 前書き

Flutter for Web はいわゆるSPA向けのようで、現時点ではボタンポチッとして外部リンクを開くことも(多分)出来ない
が、任意のjsは実行できる。

# 方法

`dart:js`を読み込んでopenを実行する。

```
import 'dart:js' as js;

FlatButton(
  child: Text("Button"),
  onPressed: () {
    js.context.callMethod("open", ["https://stackoverflow.com/questions/ask"]);
  },
)
```

参考: https://stackoverflow.com/a/56224693
footerの位置

どのようにググればいいのかが不明なので自己解決した

![スクリーンショット 2019-05-25 15.47.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253014/5a082d43-999e-8225-26d7-a505bfa6b031.png)


qiitaの背景が白なのでわかりづらいですが、下にでかい空白ができてしまいます。ダサい
 
```html

<div class="wrapper">
  <div class="header">
    header
  </div>
  <div class="kiji">
    記事です
  </div>
  <div class="footer">
    footeer
  </div>
</div>
```

こんな感じに分割して、cssで

```css

.wrapper {
  display: flex;
  flex-direction: column;
  justify-content: space-between;
  min-height: 100vh;
}
```

min-height: 100vh;こうすれば、最低でもディスプレイの縦幅に高さが固定されます
justify-content: space-between;で記事は真ん中に配置、headerは記事の一番上に固定、footerは記事の一番下に固定
flex-direction: column;で
header
記事
footer
という順に縦に並びます

![スクリーンショット 2019-05-25 15.57.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253014/a36b8540-a6b8-0c60-9cc0-584a5b22a3b3.png)

下の空白が消えました
Nuxt.jsでファイルダウンロードしようとしてつまずいた

やりたいこと
---------

クライアントからの要求でPDFを作成し、ダウンロードさせる。

完成形はこちら
https://codesandbox.io/s/nuxtdownloadsample-t5itl?fontsize=14

構成
----
ダウンロードボタンを押すと`axios.get`でapiに問い合わせる。
response.dataでpdfを受け取り、aタグのリンククリックを偽装する。

```javascript:pages/index.vue
  methods: {
    download() {
      axios
        .get("/api/pdf/test", {
          responseType: "blob"
        })
        .then(response => {
          const blob = new Blob([response.data], { type: "application/pdf" });

          const url = (window.URL || window.webkitURL).createObjectURL(blob);
          const a = document.createElement("a");
          a.href = url;
          a.download = "test.pdf";
          // aタグ要素を画面に一時的に追加する
          document.body.appendChild(a);
          a.click();
          // 不要になったら削除.
          document.body.removeChild(a);
        });
    }
  }
```

api側は、[pdfkit](http://pdfkit.org/)でpdfを生成してresに流し込む。

```javascript:api/pdf.js
router.get("/test", (req, res, next) => {
  res.setHeader("Content-disposition", "attachment; filename=" + "test.pdf");
  res.setHeader("Content-type", "application/pdf");

  let doc = new PDFDocument();
  doc.pipe(res);

  samplePdf(doc);
});
```

困ったこと
---------

ダウンロードされたpdfの中身が真っ白になった。
具体的には、
* 文字や図形を埋め込んでも表示されない
* 改ページを埋め込むと正しくされている
* 文字にurlリンクを埋め込むと文字は表示されないがリンクの下線は表示され、クリックが動作する

試したこと
-------

1. api側でファイルを保存してみる
    → 正しくpdfができている

2. response.dataの中身を見る
    → 「%PDF-1.3」から始まるデータなので正しそう

3. `<a>`タグを追加してhrefで呼び出す。
    → うまくいく
    → でも先にファイルを作っておくのは要件に合わないしアクセス制御も面倒...

原因
-----
getのオプションに`responseType="blob"`を指定する必要があるらしい。

```javascript:pages/index.vue
  methods: {
    download() {
      axios
        .get("/api/pdf/test", {
          responseType: "blob"        // ☆これがポイント
        })
```

[axios](https://github.com/axios/axios)のコンフィグを上から見てそれっぽいのを試してたら突然できた。
Qiitaに書こうとしてたら見つけた記事→https://qiita.com/Ryoma0413/items/bc1b75e5e3736ac1fef5

まとめ
----
公式ドキュメント重要！
生成後のパーティクルのサイズをスクリプトから変更する


Unityのパーティクルシステムで、生成時のStart Sizeは指定できますが、生成された後のサイズを変更したいときの方法です。

結論ですが以下のようにして、ParticleSystemRendererのminParticleSizeを変更してしまいます。

```c#
GetComponent<ParticleSystemRenderer>().minParticleSize = val;
```

Inspectorで言うとこの部分です。

![キaaaaャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398685/95e4f735-9dbe-2501-fd59-f79d69e8f00e.png)


パーティクルの最小サイズを変更することになるので、制御の方法によってはうまく噛み合わないこともあるかもしれません。
[JavaFx]ListViewについて確認してみました

JavaFxのListViewについて、どんなUIか調べるためにサンプルプログラムを作成してみました。

## ソースコード

```java
import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.control.ListView;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;

public class Main extends Application {
	public static void main( String[] args ) {
		Main.launch( args );
	}

	@Override
	public void start( Stage stage ) throws Exception {
		ObservableList<String> list = FXCollections.observableArrayList( "1", "2", "3", "4", "5", "6", "7" );
		ListView<String> listview = new ListView<>( list );

		Pane root = new Pane();
		root.getChildren().add( listview );

		stage.setTitle( "JavaFXサンプル(ListView)" );

		Scene scene = new Scene( root );
		stage.setScene( scene );

		stage.show();
	}
}
```

## 実行結果（表示されるUI）

![ListView.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143537/cd2f91ff-1802-3b90-ca21-f88df354a3d1.png)

##参考サイト
-- https://openjfx.io/javadoc/11/javafx.controls/javafx/scene/control/ListView.html
Sourcetreeで直接GitHubにリポジトリを作れない

Sourcetreeでリモートリポジトリを新規作成したらエラーが出た話。

```
Create Repository Failed

An error occurred while trying to create the repository.
Please try again.

message: Not Found
https://developer.github.com/v3/repos/#create
```
Not Foundって言ってるからGitHubが外部から直接作成する機能を提供していないってこと？

調べたら公式コミュニティで回答がありました。
[community.atlassian.comでの回答](https://community.atlassian.com/t5/Sourcetree-questions/How-to-create-a-new-remote-repo-on-github-using-SourceTree/qaq-p/663174)
どうやらGitHubで直接作るしかないっぽい。
ちなみにbitbucketではSourcetreeからでも作れます。
Laravelで投稿アプリの機能を作成 ~ログインカスタマイズ編Ⅱ~

# はじめに
以前最短でログインフォームをカスタマイズ（login.blade.phpを利用する）を紹介しましたが、
今回はログイン画面そのものもオリジナルの記事を紹介いたします。

# 前提
・前回のデータを元に修正していくので、一緒にデータを作りたい方は
下記から見ることをお勧めします
①https://qiita.com/ProgramingDai/items/cf6944f9cd0ac08f4e3e
②https://qiita.com/ProgramingDai/items/249acc8894079ee58268
③https://qiita.com/ProgramingDai/items/fee669e5a8cf67f0e38e

# 実装イメージ
postフォルダ内に「auth.blade.php」を作成
↓
ここをログイン認証のページにする
↓
「PostController.php」にログイン処理を書く
↓
ルーティング設定

# 手順レシピ
1.ビューを作成/ビューテンプレートの修正

```html:/resources/views/post/auth.blade.php
@extends('layouts.postapp')

@section('content')
@section('maincopy', $message)

<form method="POST" action="{{ route('post.auth') }}">
    {{ csrf_field() }}
    <input type="text" class="form" name="email" placeholder="メールアドレス">
    <div><input type="password" class="form" name="password" placeholder="パスワード"></div>
    <input type="submit" class="create" value="ログイン">
</form>
@endsection
```

```html:/resources/views/layouts/postapp.blade.php
<!--中略-->

@if(Auth::check())
        <!--認証中なら-->
        <!--ルートの変更: {{ route('user.logout') }} => {{ route('post.logout') }}-->
        <a href="{{ route('post.logout') }}"><img src="{{ asset('img/logout.svg') }}" class="add" alt="ログアウト"></a>

<!--中略-->
```

2.コントローラーにログイン周りの処理を追加

```php:/app/Http/Controllers/PostController
// 中略

    // ログイン画面
    public function getAuth(Request $request) {
        $param = ['message' => 'ログインしてください'];
        return view('post.auth', $param);
    }

    // ログイン処理
    public function postAuth(Request $request) {
        $email = $request->email;
        $password =  $request->password;

        // Authファサードのattemptで整合
        if(Auth::attempt(['email' => $email, 'password' => $password])){
            return redirect('/post');
        } else {
            $msg = 'メールアドレスかパズワードが違います';
            return view('post.auth',['message'=>$msg]);
        }
    }

    // ログアウト遷移先変更
    public function getLogout(Request $request){
        Auth::logout();
        return redirect()->route('post.auth');
    }
```

3.ルーティング設定

```php:/routes/web.php
// 中略

// Auth周りのルーティング
Route::get('auth', 'PostController@getAuth')->name('login');
Route::post('auth', 'PostController@postAuth')->name('post.auth');
Route::get('logout', 'PostController@getLogout')->name('post.logout');
```

これで完全オリジナルのログイン画面の完成です。
試しに
` 192.168.10.10/auth `にアクセスし、ログインとログアウトを試してみてください。

#あとがき
これでCRUD編、リレーション編、ログインカスタマイズ編（2種の方法）を紹介いたしました。最後は、新規登録画面のカスタマイズになります。そちらも実装次第、アップさせていただきます。

Laravelで投稿アプリの機能を作成
~CRUD編~
https://qiita.com/ProgramingDai/items/cf6944f9cd0ac08f4e3e
~リレーション編~
https://qiita.com/ProgramingDai/items/249acc8894079ee58268
~ログインカスタマイズ編Ⅰ~
https://qiita.com/ProgramingDai/items/fee669e5a8cf67f0e38e
~ログインカスタマイズ編Ⅱ~
https://qiita.com/drafts/4fe2e3cc90987356c9c4
Vue.jsでAtomsにfor文を使って<dl>リストを書いてみた

Vue.jsをAtomic Designで構築していて、そのAtomsにdlタグをfor文を使って書いたのでその書き方を。
まずは出来上がりのHTMLはこんな感じです。

``` html:こう書きたかった
<dl>
  <dt>1</dt>
  <dd>11</dd>
  <dd>12</dd>
  <dd>13</dd>
  <dt>2</dt>
  <dd>21</dd>
  <dd>22</dd>
  <dd>23</dd>
  <dt>3</dt>
  <dd>31</dd>
  <dd>32</dd>
  <dd>33</dd>
</dl>
```

こう書くなら簡単だけど。。

``` html:これはListの役目をしてない。。
<dl>
  <dt>1</dt>
  <dd>11</dd>
  <dd>12</dd>
  <dd>13</dd>
</dl>
<dl>
  <dt>2</dt>
  <dd>21</dd>
  <dd>22</dd>
  <dd>23</dd>
</dil>
<dl>
  <dt>3</dt>
  <dd>31</dd>
  <dd>32</dd>
  <dd>33</dd>
</dl>
```

## Atoms

``` vue:atoms.vue
<template lang="pug">
  dl
    template(v-for="(title, index) in titleList")
      dt(
      ) {{ title }}
      dd(
        v-for="text in list[index]"
      ) {{ text }}
</template>
```

``` javascript
const titleList = [1, 2, 3];
const list = [[11, 12, 13], [21, 22, 23], [31, 32, 33]];
```

~~dtとddをdivで囲ってますが、HTML5の記法としては有りのようなのでこれで良いかと。。~~
kanさんのご指摘で`template`を使えば`div`を使わなくても良くなったので修正しました。
他に良い書き方があれば教えてください。。
テキストエディタやIDEの「ブックマーク機能」使ってますか？

# はじめに

あまり身近な人たちが「テキストエディタ」のブックマーク機能を使っている様子が見受
けられなかったので、
「あっしはこういう使い方してます。たまにはブックマーク機能のことを思い出してあげ
てください」
ということを言いたいだけの記事です。

# ブックマーク、いつ使うの？

ソースコードを読んでるときとか、ソースコードを改修する箇所が複数ヶ所に渡る時。

# どう使うの？

付箋代わりに。

+ 改修するメソッドやクラスや関数などの行に対して
+ 改修に当たって参考にしたいメソッドやクラスや関数などの行に対して
+ 改修する内容の要約を、ブックマークのタイトルにすると、とても良い。

+ 読んでいるソースコードのここまで読んだの印
+ 読んでいるソースコードに関連のある箇所に印

# ソースコードをGitで管理して、自分でコメントつけた方が楽じゃね？

かもねー。

でもテキストエディタに機能があるなら、その機能を使って、すばやくジャンプした方が
幸せ感。

Vimのtagsでジャンプできるのは、あくまでクラスやメソッドや関数の定義箇所だった気
がするので、うまくブックマーク機能を使うと、
「あのメソッドの真ん中らへんの switch-case 処理のあのケースの時、どうしてたっけ」
と読み返したいときに、すばやくアクセスできる。

と筆者は思う。

# まとめ

ブックマーク機能で、クイック「ジャンプ・コーディング・リーディング」