OmniAICreator/Qiita-1.07M huggingface dataset:
1分でホットリロードするローカルサーバーを立てる

# やりたいこと

- HTMLページをlocalhostで立ち上げたい
- ホットリロードさせたい

# やり方

npm の `reload` パッケージを使います、以上
https://www.npmjs.com/package/reload

1. `npm install -g reload` でパッケージをインストール
2. `index.html`とか`script.js`がいるディレクトリに移動
3. `reload -b`コマンドをターミナルで打つ
4. ブラウザで`localhost:8080`に移動

＊`localhost`のポート番号は環境によって違うかも
ターミナルの出力結果を確認してね

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430849/19891d3c-329a-5de6-16f6-10d3436b48f9.png)
anyenv で rbenv を使っているときの最新版 Ruby のインストール

anyenv で rbenv を入れていて、通常の `brew upgrade rbenv ruby-build` をやっても最新版の Ruby が表示されなかったのでメモ。

anyenv を使っていると以下のコマンドで env 系を一括でアップデートできる。

```console
anyenv update
```

上記コマンド実行後、 `rbenv install -l` を実行すると最新版の Ruby が表示された。
Vue Router（Nuxt.js）で現在のページ（カレントページ）にclassを自動追加する方法

##Vue Routerで現在のページ（カレントページ）にclassを自動追加する方法
グローバルナビゲーションなどで、現在のページだけクラスを付けた時があると思います。
Vue Routerでは比較的簡単に実装できます。

```vue
      <nav>
        <ul class="gnav">
          <li><router-link to="/" active-class="active-list" exact>HOME</router-link></li>
          <li><router-link to="/drink" active-class="active-list">DRINK</router-link></li>
          <li><router-link to="/info" active-class="active-list">INFO</router-link></li>
          <li><router-link to="/contact" active-class="active-list">CONTACT</router-link></li>
        </ul>
      </nav>
```

上記のようにactive-classと言う属性を設定することで、そのディレクトリ内の時だけクラスを付けることができます。

しかし、これだと包含するディレクトリにもクラスがついてしまいます。（上記の例では、下位のディレクトリに移動してもトップページにもクラスがつく）

包含では無く完全に一致した時だけクラスを付けたい時はexactを記述します。
そうすることにより、下位のディレクトリに移動した時には、クラスが外れます。（上記の例ではトップページにexactを記述）
macOS High SierraにXCode 10.1をインストール（備忘録）

macOS High SierraにXCodeをインストールする。

# XCode 10.1のインストール
2020年1月時点で最新のXCode11はインストールできない。XCode10.1をAppStoreではなく、Developer向けダウンロードサイトから入手してインストールする。
https://developer.apple.com/download/more/

# Command Line Toolsのインストール
XCodeと同じダウンロードサイトからCommand Line Tools (macOS 10.13) for XCode 10.1をダウンロードしてインストールする。
xcodebuildコマンド実行時にエラーが出る場合は、下記のコマンドでパスの更新をやってみる。
```
sudo xcode-select -r
```
DualSPHysics: ParaviewによるDambreakの可視化



# 粒子法とは？DualSPHysicsとは？
本記事の目標は，OSS（オープンソースソフトウェア）の粒子法ソフトであるDualSPHysicsを導入し，テストケース"01_Dambreak"を__とりあえず__実行～可視化できることです．
[粒子法](https://ja.wikipedia.org/wiki/%E7%B2%92%E5%AD%90%E6%B3%95)とは計算対象物を粒子の集まりとして表現し，連続体に関する微分方程式を数値的に解くための離散化手法の一つです．
計算格子を持ちないことから，大きな変形を取り扱うことができ，相変化をモデリングすることができることに強みがあります．
粒子法は微分演算子の定義およびタイムステップの取り扱いの違いから
MPS（Moving Prticle Simulation）法およびSPH（Smoothed Particle Hydrodynamics）法に分類されます．
DualSPHysicsはSPH法を用いた，オープンソースの粒子法ソフトウェアです．
ヨーロッパを中心に開発が進められています．
本記事ではオープンソースによるシミュレーションの初学者が，DualSPHysicsのテストケースを実行する過程をメモとして残します．

インストールから実行については[前の記事](https://qiita.com/oyroooo/items/da30e20cd44b3b211813)を参照してください．

#Dambreakの可視化
まず，Paraviewを[インストール](https://www.paraview.org/download/)します．
ディレクトリ
DualSPHysics/example/main/01_Dambreak/Dambreak_out/Particles
へ移動します．つぎに，ディレクトリParticles内のファイル
PartFluid_0000.vtk
PartFluid_0001.vtk
...
PartFluid_0200.vtk
をParaviewの画面にドラッグアンドドロップします．
さらに
PartBound_0000.vtk
をParaviewの画面にドラッグアンドドロップします．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197157/746e2b48-965b-95e3-51a0-59bff882d795.png)
下図の通り操作することで**とりあえず**可視化することができます．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197157/7ae11597-f23c-1363-821a-f76046742011.png)

画面上部の再生ボタンを押すことで結果をコマ送りにすることができます．
SampleプロジェクトをGitLabにアップロードしてバージョン管理を行う

# FlutterのSampleプロジェクトをGitlabにアップロードする
AndroidStudioでFlutterのプロジェクトを作成すると、flutter_appという物が作成されます。
それをGitLabにアップロードして、バージョン管理を行いながらプログラムを更新していきます。
（Gitは本当に使ったことがない初心者です）

### サンプルプロジェクトをPushする
こちらのサイトを参考に、まずはプロジェクトをgitにあげることを実行しました。
http://wiki.cis.iwate-u.ac.jp/~kimura/csd/2018/material/gitlab/

$git status
を実行すると以下のようになったので、無事Pushされたのを確認

```
On branch master
Your branch is up to date with 'origin/master'.
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)
	new file:   .DS_Store
	new file:   flutter_app
```

その後のGitLabの使い方は、超初心者エンジニアとしては苦戦した部分なのですが、
この部分はあまりにも情報がネットに溢れていたので割愛します。
以下のサイトを参考にしました
https://qiita.com/hikaru_/items/dc875b27a515f9ee9284


### flutter_appの中身が無い！
安心も束の間、flutter_appの中身が何も無いことをに気付きました。
`git add .`した際の`adding embedded git repository: flutter_app`というwarningが出ていたので、こちらを調査した結果以下のサイトに解決方法が書いてありました。
https://qiita.com/harashoo/items/dc259e00d2d81afc24ed

理由はよく分からないまま実行すると、、、できました！

### tagでバージョン管理を行う
バージョン管理の仕上げとして、`git tag`を打って現在時点のタグを作成します
参考URLはこちら（https://qiita.com/growsic/items/ed67e03fda5ab7ef9d08 ）

```
git tag v0.0
git push origin v0.0
```
このコマンドで作成完了。
`git checkout <tag-name>`にてそのタグに移動し、
`git branch`で移動していることを確認できました。

#### tagの運用方法
ここは現在の業務での受け売りですが、作業開始の朝時点でtagを打つように運用します。
将来的には`tag push`を契機にCI/CDを動作させられたらと考えています。
LogicoolのメカニカルキーボードをMacで使いやすいように設定する（備忘録）

Logicool Pro Gaming キーボード(Y-U0031)をMacBook Airで使いやすいようにセットアップ。

![keyboard.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126781/3747c4a0-8980-ddb1-7422-4dd710a2c263.png)


- CAPS LOCKキーをCONTROLキーに変更
- CTRLキーをCOMMANDキーに変更
- 無変換キーを英数キーに変更
- 変換キーをかなキーに変更
- ApplicationキーをFnキーに変更

# Mac環境設定
デフォルトのまま変更なし
![Mac_Environment.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126781/0dae6c22-0e9e-fe10-25d8-fc39dc9954eb.png)

# Karabiner
![Karabiner_Settings.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126781/e1e39038-d535-2e0a-64d1-4a7c3132b67a.png)

# Logicoolドライバ
ゲーム用には使わないので、Logicoolのキーボードドライバはインストールしない。
LEDのパターンはキーボードについているLEDボタン＋数字キーで変更する。
(LED+5が打鍵に合わせて光るのでたのしい)

# MacBook Air 内臓キーボードの設定
外付けキーボードのレイアウトに合わせて、Commandキーの割り当てだけ変更。
この位置にCOMMANDキーがあると、コピー＆ペースト操作がらくちん。
- CAPSキーをCOMMANDキーに変更。
![Mac_Enviroment_Embedded.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126781/ab4d284b-3b0e-5eb1-7d62-02e4c29cd1bf.png)
cscの作法 その26 WebBrowser

#概要

cscの作法、調べてみた。
練習問題やってみた。

#練習問題

googlの検索ボタンを押せ。

#サンプルコード


```
using System;
using System.Windows.Forms;
using System.Drawing;

class form1: Form {
	WebBrowser wb0;
	form1() {
		Text = "WebBrowser";
		ClientSize = new Size(600, 800);
		Button btn1 = new Button();
		btn1.Location = new Point(50, 20);
		btn1.Text = "test";
		btn1.Click += btn1_Click;
		Controls.AddRange(new Control[] {
			btn1
		});
		wb0 = new WebBrowser();
		wb0.Location = new Point(50, 50);
		wb0.Width = 500;
    	wb0.Height = 700;
		Controls.AddRange(new Control[] {
			wb0
		});
		string url = "http://www.google.co.jp/";
		wb0.Navigate(url);
	}
	void btn1_Click(object sender, System.EventArgs e) {
		wb0.Focus();
		wb0.Document.All.GetElementsByName("q")[0].InnerText = "ohisamallc";
		SendKeys.Send("{tab}");
		SendKeys.Send("{enter}");
	}
	[STAThread]
	public static void Main() {
		Application.Run(new form1());
	}
}




```

以上。
【AWS】Elastic BeanstalkでLinux 用 Windows サブシステムを使用せずにLaravelアプリケーションをデプロイする

Elastic BeanstalkでLinux 用 Windows サブシステムを使用せずにLaravelアプリケーションをデプロイ方法です。
本手順では、代わりに、フリーの圧縮・解凍ソフトを使用しています。

## 環境
* PHP：バージョン7.3（Elastic Beanstalk）
* Laravel：バージョン6.9.0
* OS：Windows10（ローカル）

## 手順

[Elastic Beanstalk への Laravel アプリケーションのデプロイ | aws](https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/php-laravel-tutorial.html)
に従って実施します。
タイトルの件を以下に、補足事項としてまとめます。

## 補足事項
手順では、Linux 用 Windows サブシステムを使用するとありますが、以下の通り実行すればインストール不要です。

### 1. Laravelプロジェクトの作成
ローカル環境でコマンドプロンプトを起動して、任意のパスでコマンドを実行し、Laravelプロジェクト作成します。
こちらは、手順と同じコマンドで大丈夫です。
※今回は、プロジェクト名を「testLaravelApp」としました。

```
> composer create-project --prefer-dist laravel/laravel testLaravelApp
```

### 2. zipファイルの作成
1で作成したプロジェクトを圧縮します。
Windowsにおいては、デフォルトではzipコマンドを実行できないため、GUIベースで圧縮します。
私はフリーの圧縮・解凍ソフト[7-Zip](https://sevenzip.osdn.jp/)を使用しました。

### 注意点
圧縮実行時には、以下の点に気をつけてください。

#### 1. デプロイしたいプロジェクト直下で圧縮する
公式の手順（コマンド）からもわかる通り、デプロイしたいプロジェクト直下で圧縮作業を実施します。
プロジェクトをそのまま圧縮してデプロイすると以下のようなエラーが出てしまい、ページへのアクセスもできないので要注意！

##### ダッシュボード
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/dd269a7e-d8f3-3a73-d034-459282385e70.png)

##### ヘルス
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/4f713c7b-f3ad-b88e-283c-0357cc1e598a.png)

調べたところ、対象プロジェクトをそのまま圧縮すると余計なディレクトリが含まれてしまうから、とのこと。
【参考】
[Following services are not running: proxy @ AWS — after Laravel re-config | stack overflow](https://stackoverflow.com/questions/43026829/following-services-are-not-running-proxy-aws-after-laravel-re-config)


#### 2. vendorは対象外とする
公式の手順にも記載ありますが、念のため。

--------------------------
上記1, 2を考慮しての7-Zipでの圧縮は以下の通りとなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/a44afca4-9d95-b815-b111-94691515e1c6.png)

そうすると、同フォルダ内に対象のLaravelプロジェクトと同じ名称のzipファイルができるので、それをアップロード・デプロイすればOK！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/a75ee5d4-a8fe-caf8-57fe-bd63e43e9263.png)

#### オマケの注意点
こちらも公式手順に記載ありですが、ドキュメントのルートを
<b>/public</b>
とするのを忘れずに☆
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/b3206701-cfab-0501-3fbd-006b1da7eb5b.png)

#### 無事、デプロイ→ページ表示できました！
##### ダッシュボード
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/89c6476d-9276-31fd-c198-004d309e4a55.png)
##### ページ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/aca1b091-783e-8250-a5d3-b4b9073bce85.png)


## 参考
* [Elastic Beanstalk への Laravel アプリケーションのデプロイ | AWS](https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/php-laravel-tutorial.html)
* [Following services are not running: proxy @ AWS — after Laravel re-config | stack overflow](https://stackoverflow.com/questions/43026829/following-services-are-not-running-proxy-aws-after-laravel-re-config)
cscの作法 その25 WebBrowser

#概要

cscの作法、調べてみた。
webbrowser使ってみた。

#写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/7ef2f03c-5036-dbe0-5a02-ea75a37d5d25.png)


#サンプルコード


```
using System;
using System.Windows.Forms;
using System.Drawing;

class form1: Form {
	WebBrowser wb0;
	form1() {
		Text = "WebBrowser";
		ClientSize = new Size(300, 300);
		wb0 = new WebBrowser();
		wb0.Location = new Point(50, 50);
		Controls.AddRange(new Control[] {
			wb0
		});
		string url = "http://www.google.co.jp/";
		wb0.Navigate(url);
	}
	[STAThread]
	public static void Main() {
		Application.Run(new form1());
	}
}
```

以上。
cscの作法 その24 WebRequest

#概要

cscの作法、調べてみた。
練習問題やってみた。

#練習問題

pdfダウンローダーを作れ。

#サンプルコード



```
using System;
using System.Windows.Forms;
using System.Drawing;
using System.IO;
using System.Net;
using System.Text;

class form1: Form {
	TextBox bo1;
	form1() {
		Text = "download";
		ClientSize = new Size(580, 200);
		bo1 = new TextBox();
		bo1.Location = new Point(50, 50);
		bo1.Width = 500;
		bo1.Text = "https://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2015h27_1/2015h27h_fe_am_qs.pdf";
		Controls.AddRange(new Control[] {
			bo1
		});
		Button btn1 = new Button();
		btn1.Location = new Point(50, 90);
		btn1.Text = "test";
		btn1.Click += btn1_Click;
		Controls.AddRange(new Control[] {
			btn1
		});
	}
	void btn1_Click(object sender, System.EventArgs e) {
		string url = bo1.Text;
		string filename = DateTime.Now.ToString("HH-mm-ss") + ".pdf";
		WebRequest req = WebRequest.Create(url);
		WebResponse res = req.GetResponse();
		Stream st = res.GetResponseStream();
		byte[] buf = new byte[32768];
		MemoryStream ms = new MemoryStream();
		while (true)
		{
			int read = st.Read(buf, 0, buf.Length);
			if (read > 0)
			{
				ms.Write(buf, 0, read);
			}
			else
			{
				break;
			}
		}
		FileStream fs = new FileStream(filename, FileMode.Create);
		byte[] wbuf = new byte[ms.Length];
		ms.Seek(0, SeekOrigin.Begin);
		ms.Read(wbuf, 0, wbuf.Length);
		fs.Write(wbuf, 0, wbuf.Length);
		fs.Close();
		MessageBox.Show(filename);
	}
	[STAThread]
	public static void Main() {
		Application.Run(new form1());
	}
}





```

以上。
projectのないAngular ワークスペースで storybook を作る

storybook のお勉強がてらAngular Material のcomponent をただ並べるだけのstorybook を作ってみようと思ったところ、@storybook/cli では作れなかったので、公式の[Manual Setup](https://storybook.js.org/docs/guides/guide-angular/#manual-setup) を見ながらセットアップしてstorybook のdemo component が動いたのでメモ。


# Step 0: Create Angular workspace
`ng new` に `--createApplication=false` のオプションをつけると、`src`以下のファイルが生成されません。ライブラリ作るときとかに便利です。

storybookの設定を置く`.storybook` ディレクトリと、実際にstory を書く`stories` ディレクトリを作っておきます。

```
ng new sb --createApplication=false
cd sb
mkdir .storybook stories
```
# Step 1: Add dependencies
```
npm install @storybook/angular --save-dev
npm install babel-loader @babel/core --save-dev 
```
# Step 2: Add a npm script
```package.json
{
  "scripts": {
    "storybook": "start-storybook"
  }
}
```

# Step 3: Create the config file
`src`の下ではなく、`stories`の下を見るように`require.context`の第1引数を変えます。
あと好み？ですが、第3引数もtsファイルだけにしておきます。

```.storybook/config.js
import { configure } from '@storybook/angular';

configure(require.context('../stories', true, /.stories.ts$/), module);
```

# Step 4: Storybook TypeScript configuration
`exclude` の中は一旦消して、includeを`stories`の下を見るように変更します。

```..storybook/tsconfig.json
{
  "extends": "../tsconfig.json",
  "exclude": [],
  "include": ["../stories/**/*"]
}
```
# Step 5: Write your stories

```stories/index.stories.ts
import { Button } from "@storybook/angular/demo";

export default { title: "My Button" };

export const withText = () => ({
  component: Button,
  props: {
    text: "Hello Button"
  }
});

export const withEmoji = () => ({
  component: Button,
  props: {
    text: "😀 😎 👍 💯"
  }
});
```

# Finally: Run your Storybook

```
npm run storybook
```

なんか めっちゃエラー出るけどブラウザでstorybook のdemo component が確認できます！

# ついでにgithub pages にdeploy してみる
めっちゃ簡単でした。下記のREADME 通りにやればOK
https://github.com/storybookjs/storybook-deployer

```
npm i @storybook/storybook-deployer --save-dev
```

```package.json
{
  "scripts": {
    "deploy-storybook": "storybook-to-ghpages"
  }
}
```

```
npm run deploy-storybook
```
pythonで画像をパワポ資料に自動で貼り付ける +α

#はじめに
パワポのスライド1枚に1枚ずつ画像を貼り付けていって作業手順書にする、みたいなのありますよね。超絶単純作業なのになかなか時間かかるやつ。
単純な繰り返し作業なので、ネット上に転がっていたコードを用いて自動化したいと思います。
#目標実装機能
##少なくとも必ず実装したい機能
スライド1枚につき1枚の画像が貼り付けられたパワポの資料を自動で作成すること。
##願わくば
* 表紙の追加
* テキストボックスの追加
* 画像を貼り付けないスライドの挿入

##自動作成したいスライド
私の好きな某アニメの登場人物紹介スライドを作成したいと思っています。
構成は、
表紙→画像→キャラ説明→画像→キャラ説明→…（以下、画像とキャラ説明を交互に）
としています。
今回作成したコードを用いて自動作成したスライドは、最後にご紹介します。
#環境
python3.7.2
Windows10

#コード

```python:ppt.py
import pptx
from pptx.util import Inches
from pptx import Presentation
from glob import glob

ppt = Presentation()
width = ppt.slide_width
height = ppt.slide_height

#使用するスライドの種類
title_slide_layout = ppt.slide_layouts[0] #Title Slideの作成
bullet_slide_layout = ppt.slide_layouts[1] #Title and Contentの作成
blank_slide_layout = ppt.slide_layouts[6] #Blankの作成

#Title Slide
slide = ppt.slides.add_slide(title_slide_layout)
title = slide.shapes.title
subtitle = slide.placeholders[1]

title.text = "○○ Description"
subtitle.text = "kokoro pyonpyon"

#画像をBlankに張り付ける準備
fnms = glob('figures/*.JPG')

tx_left = tx_top = tx_width = tx_height = Inches(1)

i = 1

for fnm in fnms:
    #画像をBlankに張る
    slide_picture = ppt.slides.add_slide(blank_slide_layout)
    pic = slide_picture.shapes.add_picture(fnm, width/4,height/2, width/2, height/2)

    #ついでに空きスペースにテキストボックスを挿入する
    txBox = slide_picture.shapes.add_textbox(tx_left, tx_top, tx_width*15, tx_height)
    tB = txBox.text_frame
    tB.text = "Name: "

    #Title and Contentの作成
    slide_description = ppt.slides.add_slide(bullet_slide_layout)
    shapes = slide_description.shapes

    title_shape = shapes.title
    body_shape = shapes.placeholders[1]

    #Title and Contentにタイトルとテキストを書き込む
    title_shape.text = 'Character description ' + str(i)
    tf = body_shape.text_frame
    tf.text = 'She works at '

    i += 1

ppt.save('figure.pptx')
```

#解説
##importするライブラリ
###pptx

_パワーポイントのファイル（.pptx）を作成、アップデートするPythonライブラリ。
典型的な用途として、データベースからパワーポイント資料をカスタマイズした状態で作成したり、webアプリ上のリンクをクリックすることでダウンロードできるようにしたりすることが挙げられる。業務管理システム上の情報をまとめた、エンジニアリングステータスレポートを報告可能な形式で自動作成させることもできる。プレゼンテーションのライブラリーを一括でアップデートしたり、いちいち取り組むのは飽き飽きするような、一枚か二枚のスライドの作成を自動で行ったりすることもある。_

（[この資料の一部](https://python-pptx.readthedocs.io/en/latest/index.html#api)を直訳。）

まあこれを簡単にわかっていれば事足ります。多分。
各コマンドの簡単な意味は、コードの中でコメントしています。

#このコードを用いてできたスライド
![pptx_title.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469705/6dd063b0-99db-a33f-b9e5-6efab375c085.png)
![pptx_picture.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469705/634a786c-af3d-e92f-239d-6471356d06fd.png)
![pptx_description.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469705/27af36c3-c48e-4ed4-7c2a-f2c95658b557.png)

細かい部分はスライドごとに手動で入力しましょう。
大半の部分は自動で作成されているので、かなり省力化されているはずです。

#おまけ
ライブラリのインストールの仕方。

```
$ pip install numpy
```
みたいな。なんとなくnumpyにしました。

#参考資料
[python-pptx](https://python-pptx.readthedocs.io/en/latest/index.html#api)
[Getting Started](https://python-pptx.readthedocs.io/en/latest/user/quickstart.html)
[Pythonで画像ファイルをパワポに貼る](https://qiita.com/ceptree/items/ee3dce2924e7ecaa261f)
AWS CodePipeline QAリンク

# 引用元
一部、理解のために自分の表現に変更
https://aws.amazon.com/jp/codepipeline/faqs/

### Q: パイプラインとは何ですか?
パイプラインとは、ソフトウェアの変更がリリースプロセスをどのように通過するかを明確にするワークフロー構造です。ワークフローをステージとアクションのシーケンスで定義できます。
**[追記]同一のアクションを開発環境、本番環境のように異なる環境に渡すための仕組みと理解**

### Q: リビジョンとは何ですか?
リビジョンとは、パイプラインのために定義されたソースロケーションに加えられた変更です。ソースコード、ビルドアウトプット、設定、データなどが対象となります。パイプラインには複数のリビジョンを同時に通過させることができます。
 
### Q: ステージとは何ですか?
ステージとは、1 つまたは複数のアクションのグループです。パイプラインには 2 つ以上のステージを設定できます。
 
### Q: アクションとは何ですか?
アクションとは、リビジョンに対して実行されるタスクです。パイプラインのアクションは、ステージ設定の定義に従い、指定された順番で直列的または並列的に実行されます。詳細は、 Edit a Pipeline および Action Structure Requirements in AWS CodePipeline を参照してください。

### Q: アーティファクトとは何ですか?
アクションが実行される場合、1 つまたは一連のファイルが対象となります。これらの対象となるファイルがアーティファクトと呼ばれています。アーティファクトはパイプラインのその後のアクションでも対象となる場合があります。例えば、ソースアクションが、ソースアーティファクトとしてコードの最新バージョンを出力し、ビルドアクションがそのアーティファクトを読み込みます。コンパイル後、ビルドアクションはビルドアウトプットを別のアーティファクトとしてアップロードし、その後のデプロイアクションでそのアーティファクトが読み込まれます。

### Q: AWS CodePipeline のイベントに関する通知やアラートを受け取るにはどうすればよいですか?
パイプラインに影響を与えるイベントに関する通知を作成することができます。通知は Amazon SNS 通知という形で送信されます。各通知には、ステータスメッセージに加えて、その通知が生成される原因となったイベントが存在するリソースへのリンクも含まれます。通知に追加費用はかかりませんが、Amazon SNS など、通知に利用される他の AWS のサービスの料金が課金される場合があります。
LinuxでのCD音声、mp3の扱い

Linuxデスクトップの使い方、自分用メモ。

## CDから.wavの取り込み
Files (Nautilus) でAudit Discの中の.wavをどこかにドラッグアンドドロップする。 `~/Music` 以下にしておくと良い。

## .wavから.mp3への変換
Sound Converter (おそらく `apt install soundconverter`) に.wavをドラッグアンドドロップ、設定でType of resultをmp3にし、全部選択したのち Convert ボタンを押すとその場に.mp3ができる。

`rm *.wav` などで元のファイルを消す。

## ファイル名の修正
```rb
Dir.glob('Track*.mp3').grep(/\ATrack \d\.mp3\z/).each{|f| FileUtils.mv(f, f.sub(' ', ' 0')) }
```

```rb
Dir.glob('Track*.mp3').each{|f| FileUtils.mv(f, "XXX-#{f}") }
```

## Rhythmboxへの追加
どうやら `~/Music` 以下にあると、少し経つと勝手に追加される。プレイリストでも作ってそこに入れておく。

ただしファイル名を変更しても反映されないこともある。RemoveしてQuit、再度起動して少し待つと反映される。

## mp3メタデータの削除
mp3infoはID3v1にしか対応していないので、ID3v2に対応しているid3v2コマンドを使う。

```bash
sudo apt install id3v2
id3v2 --delete-all *.mp3
```

## mp3の部分編集
```
sudo apt install audacity ubuntu-restricted-extras
```

Audacityを開き、mp3をドラッグアンドドロップ。

太い波のエリアをドラッグ、Deleteを押す。「File > Export > Export as MP3」で上書きする。
米国防総省（DoD）におけるDevSecOps（第2章）#DevSecOps

原文・参照先資料
[DoD Enterprise DevSecOps Reference Design - DoD CIO](https://dodcio.defense.gov/Portals/0/Documents/DoD%20Enterprise%20DevSecOps%20Reference%20Design%20v1.0_Public%20Release.pdf?ver=2019-09-26-115824-583)

#2 前提・原則
## 2.1 前提条件
このドキュメントでは、次のことを前提としています。
・ほとんどの組織にとって、認定され監視されたクラウド環境への導入は、技術的にも文化的にも望ましいソリューションである。
・技術の急速な変化に伴い、DevSecOpsのパイプラインとパターンを設計し、新しい開発機能が商用製品市場に参入/撤退する際の柔軟性を確保する必要がある。
・DoD Enterprise DevSecOpsソフトウェアファクトリは、ベンダのロックインを回避するとともに、Open Container Initiative(OCI)準拠コンテナと Cloud Native Computing Foundation(CNCF)認定のKubernetesを活用して、コンテナのオーケストレーションと管理を行うように設計されている。
・政府は、オープンソース統合のリスクと、ベンダー「撤退費用」やベンダー内部のリスクを伴う既製の商用オフザシェルフ(COTS)製品の使用とのバランスをとる必要がある。
・DoDの汎用クラウド環境だけでなく、非接続で機密扱いの環境でも、DevSecOpsソフトウェアファクトリをホストすることが可能でなければならない。
・DevSecOpsアーキテクチャは、ソフトウェアソリューションを必要とするあらゆるタイプの運用要件に対応できる能力を備えていなければならない。
　・ビジネス・システム
　・指揮統制システム
　・組み込み・武器システム
　・インテリジェンス分析システム
　・自律システム
　・人的支援

## 2.2 原則
DevSecOpsアプローチを成功させるための重要な原則がいくつかある。
・ボトルネック(人間を含む)および手動アクションを除去する。
・開発および導入作業を可能な限り自動化する。
・導入と運用を通じて、計画と要件から共通のツールを採用する。
・アジャイルソフトウェアの原則を活用し、より大規模で散発的なリリースよりも、小規模で段階的、頻繁なアップデートを好むこと。
・各スキル・セットを順番に適用するのではなく、継続的な監視アプローチを並行して採用することで、ソフトウェア・ライフサイクル全体にわたって、開発、サイバー・セキュリティ、運用の部門横断的なスキル・セットを適用する。
・基盤となるインフラストラクチャのセキュリティ・リスクを測定し、定量化して、ソフトウェア・アプリケーションに対するリスクと影響の合計を把握する必要がある。
・コンテナなどのImmutable Infrastructureをデプロイする。Immutable Infrastructureの概念は、導入されたコンポーネントを更新するのではなく、完全に置き換えるIT戦略である。Immutable Infrastructureを導入するには、一貫性のある予測可能な結果を得るために、共通のインフラストラクチャ・コンポーネントの標準化とエミュレーションが必要となる。
[iOS/Swift] アプリ開発の実務的アプローチで学ぶデザインパターン ～Singleton～

この記事シリーズは、iOS/Swiftエンジニアである執筆者個人が、
**ごく普通のiOSアプリ開発でよくある状況**や
**Swiftのコアライブラリやフレームワークで使われているパターン**に
着目してデザインパターンを学び直してみた記録です。

**関連記事一覧**
[[iOS/Swift] アプリ開発の実務的アプローチで学ぶデザインパターン](https://qiita.com/y-some/items/96db5f24ded4a1fab48f)

# Singletonパターン概要

- **インスタンスが1個しか生成されないことを保証するためのパターンです。**
- GoFのデザインパターンでは**生成に関するパターン**に分類されます。

# 使い所

- iOSフレームワーク内で随所に使われています。典型例は `UIApplication.shared` です。
- 実行時に依存性を変更しづらく、ユニットテストがしにくいというデメリットがあります。
- またグローバル変数と同様に、いつ・どこから・どのように変更されるのか理解が難しくなりますので、注意しながら利用する必要があります。

# サンプルコード

Swiftバージョンは 5.1 です。

```swift
class SingletonClass {
    class var shared : SingletonClass {

        struct Static {
            static let instance : SingletonClass = SingletonClass()
        }

        return Static.instance
    }
}

// Usage
let instance = SingletonClass.shared
```

※少々回りくどい実装になっていますが、マルチスレッドでインスタンスが複数生成されてしまうことを回避するための実装例です。

引用：
https://github.com/07cs07/Design-Patterns-In-Swift
2と0の列から「2020」を見つける

ランダムに並んだ「2」と「0」の列から「2020」を見つけてハイライトする。

[年賀状のためにPostScriptで書いたもの](https://golden-lucky.hatenablog.com/entry/2020/01/01/213208)を、Haskellで書き直した。もっといろいろな書き方ができそう。シェルスクリプトとかでも書けそう。

```haskell
module Main where

import System.Environment (getArgs)
import System.Random
import Data.List

scan2020 :: [Int] -> [[Int]]
scan2020 [] = []
scan2020 ls@(x:xs)
  | isPrefixOf the2020 ls = the2020 : (scan2020 $ drop 4 ls)
  | otherwise = [x] : scan2020 xs
  where the2020 = [2, 0, 2, 0]

hl2020 :: [[Int]] -> [String]
hl2020 [] = []
hl2020 (x:xs)
  | length x == 4 =
      concat ["\ESC[31m", intercalate " " $ map show x, "\ESC[m"] : hl2020 xs
  | otherwise = concatMap show x : hl2020 xs

main :: IO ()
main = do
  a <- fmap (read . head) getArgs
  s <- getStdGen
  putStrLn $ intercalate " " $ hl2020 $ take a $ scan2020 $ twoandzero s
  where
    twoandzero s = map ((*2) . flip mod 2) (randoms s :: [Int])
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575/40d359fc-967e-fb4c-b3b5-c2ed1abe7812.png)
cscの作法 その23 コッホ曲線

#概要

cscの作法、調べてみた。
練習問題やってみた。

#練習問題

コッホ曲線を表示せよ。

#写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/a7f81c05-ce7f-5790-4b43-ddd843d218c6.png)


#サンプルコード


```
using System;
using System.Windows.Forms;
using System.Drawing;

class form1: Form {
	double ANGLE = 0;
	double LX = 20.0;
	double LY = 150.0;
	Graphics g;
	form1() {
		Text = "koch";
		ClientSize = new Size(450, 200);
	}
	protected override void OnPaint(PaintEventArgs e) {
		g = e.Graphics;
		koch(5, 60);
		base.OnPaint(e);
	}
	double fmod(double a, double b) {
		double x = Math.Floor(a / b);
		return a - b * x;
	}
	void turn(double a) {
		ANGLE = fmod(ANGLE + a, 360.0);
	}
	void gmove(double l) {
		Pen pen = new Pen(Color.Red);
		double rd = 3.14159265359 / 180.0;
		double x = l * Math.Cos(rd * ANGLE);
		double y = -l * Math.Sin(rd * ANGLE);
		int px = (int) LX;
		int py = (int) LY;
		LX += x;
		LY += y;
		g.DrawLine(pen, px, py, (int) LX, (int) LY);
	}
	void koch(int i, int j) {
		if (i <= 1)
		{
			gmove(5.0);
			return;
		}
		koch(i - 1, j);
		turn(j);
		koch(i - 1, j);
		turn(-2 * j);
		koch(i - 1, j);
		turn(j);
		koch(i - 1, j);
	}
	[STAThread]
	public static void Main() {
		Application.Run(new form1());
	}
}





```

以上。
macOS Catalinaにnvm

macOS Catalinaにnvmを入れようとして検索したら出てくる記事が「この記事は3年以上前の〜」とかばっかりで不安になったのでアップデートしたエントリを。と言っても特に変更点とかがある訳ではないのですが。

## ともあれインストール

```
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | bash
```
最新版じゃないだろうけど一旦インストール。

## .zshrcにも記述は追加されていた
ありがたい :pray:

```
% cat ~/.zshrc

(略)

export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"  # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"  # This loads nvm bash_completion
```

↓するか新規ウィンドウを開けば良い、と。

```
source ~/.zshrc
```

## 最新版にアップデート

```
% nvm --version
0.34.0
% cd ~/.nvm 
% git pull origin master
% nvm --version
0.35.2
```

## つまり

```
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.2/install.sh | bash
```
なら一発ということですね。(2020/1/3現在)

## 最初から公式に行っておけばもっと早かった説

https://github.com/nvm-sh/nvm

## 参考
[Mac、Linux、Windows(WSL無し環境)でNode.jsバージョン切り替え方法を統一したい](https://one-it-thing.com/3506/)
[nvm自体のバージョンを上げる](https://qiita.com/n0bisuke/items/66e32609c7d941dc8c94)
ユーモアあふれる、ステータスコード 418 と 420 って何？


## Status Code 418 by Google
<img width="339" alt="teapot.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/157574/24d568f1-5f9e-3d7b-ac07-d395bb3968d5.png">

https://www.google.com/teapot にアクセスすると ステータスコード `418` が返ってきます。
開発者ツールからももちろん確認できます。

<img width="418" alt="devtools.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/157574/e1c98d59-03e4-cd36-7e3a-d0609a887906.png">

400 番台の HTTP レスポンスエラーは、__クライアントエラー__ ですね。  
[MDN](https://developer.mozilla.org/ja/docs/Web/HTTP/Status/418) のページで確認すると、

> サーバーが、自身がティーポットであることを理由としてコーヒーを入れることを拒否することを示します

とのこと。

1998 年からはじめた Google によるエイプリルフールのジョークのようです。

しっかりと Go のドキュメント ([net/http](https://golang.org/pkg/net/http/)) にも書かれていました。

```
StatusRequestedRangeNotSatisfiable = 416 // RFC 7233, 4.4
StatusExpectationFailed            = 417 // RFC 7231, 6.5.14
StatusTeapot                       = 418 // RFC 7168, 2.3.3
StatusMisdirectedRequest           = 421 // RFC 7540, 9.1.2
StatusUnprocessableEntity          = 422 // RFC 4918, 11.2
```
ジョークのステータスコードを入れていいのかよ。と思ったら Go 言語は Google が作った言語でしたね。。

## Status Code 420 by Twitter

ツイッターでは、420 という [ステータスコード](https://developer.twitter.com/en/docs/basics/response-codes) を下記のように定義しています。

```
420
Enhance Your Calm
Returned when an app is being rate limited for making too many requests.
```
たくさんのリクエストをサーバーに送って制限値を超えた際に API のレスポンスで返されるステータスコードのようです。

420 は、マリファナとの関連して良く使われる言葉で、訳すと「落ち着いていこーぜ」という感じです。

ツイッター本社のあるカリフォルニアは、マリファナが合法なのでそれと何か関係しているのかもしれませんね。

## 注意
ステータスコード 418 & 420 は、__正式な HTTP のステータスコードではない__ ので、HTTP のステータスコードとして実装する場合は、それを認識したうえで、ユーモアたっぷりに実装しましょ！:relaxed:
SpringToolSuite4にlombokをインストールする

# STS4にlombokのインストールする方法
久しぶりにSTSでjava開発しようとしたら、lombokのインストール方法を忘れたのでメモ。
## 環境
Ubuntu:16.04.6 64bit
SpringToolSuite4:4.5.0.RELEASE
lombok:1.18.10
## Lombokのインストール
STSを閉じた状態でインストールを開始する。
[lombokダウンロード](https://projectlombok.org/download)
ダウンロードしたlombok.jarを実行ファイルのSpringToolSuite4と一緒の場所に配置。
lombok.jarをダブルクリックで起動し、Specifylocationをクリックして、SpringToolSuite4を指定する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558865/aab8b9a8-32a3-dc4f-559a-070e6683afd4.png)
install/Updateをクリックして完了。
pythonで日本株価データをダウンロードしてくる

# Summary

スクレイピングなしで[株式投資メモ](https://kabuoji3.com/)から株価情報をダウンロードするスクリプトを書いた。

# 使用法

```
python ./stockDownload.py -c 7203
```
7203 トヨタ自動車(株)の2019年の日足データがcsvでダウンロードできる。
ダウンロード成功ならば`Code: 7203 download finished.`、失敗ならば`Code: not valid.`と返す。


# 動機
[Yahoo! finance](https://finance.yahoo.co.jp/)からスクレイピングは禁止されている。株価情報を[株式投資メモ](https://kabuoji3.com/)からスクレイピングする方法は公開されていた [^1] が、フォーマットが変更されれパースが上手く行かなくなる可能性がある。一方で、サイト内にダウンロードボタンがあるため、そちらを上手く活用できないか調査していた。

# ダウンロードがどのように行われているか
ダウンロードボタンを押した後、google developer toolのnetworkタブから解析した。
`https://kabuoji3.com/stock/file.php`にdataをPOSTしているらしい。

![kabuoji3_POST_edit.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/91291/e5438ad7-9bfc-aeff-0266-f0b1064b53bb.png)

# 調整が必要な部分

- スクリプトの`fullName`が保存先となるので適宜変更。
- headerがないと403エラーとなるため、user-agent をgoogle developer toolで確認しておく。[^2]
- `sleep(3)`を入れているのは、過度なサーバー負荷回避のため。

# スクリプト

``` {stockDownload.py}
#!/usr/bin/env python

import requests
import re
import click
from time import sleep

@click.command()
@click.option("--code", "-c", "code", required=True,
        help="Stock code to download.")
def main(code):
    year = "2019"
    session = requests.Session()
    headers = {
                "User-Agent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Safari/537.36"
                }
    data = {
            "code":code,
            "year":year,
            "csv":""
            }
    url = "https://kabuoji3.com/stock/file.php"
    res = session.post(url, data=data, headers=headers)
    try:
        contentDisposition = res.headers['Content-Disposition']
        fileName = re.findall(r'\"(.+?)\"', contentDisposition)[0]
        fullName = ~/Documents/projects/ipo/data/stock/{}".format(fileName)
        with open(fullName, "wb") as saveFile:
                saveFile.write(res.content)
        print("Code: {} download finished.".format(code))
    except KeyError:
        print("Code: {} not valid.".format(code))
    sleep(3)

if __name__ == '__main__':
    main()
```

# 諸感
初めてclickを使ってcliを作成した。sys.argvよりは読みやすい気がする。
あとは、shell の`cat code | while read line: do python ./stockDownload.py -c $line; done`で回すだけ。
cp932エンコードなのでnkfなりで変換する必要がある。

# 参考資料
[【Python】requestsでボタンを擬似クリック](https://rutei.hatenablog.com/entry/2018/11/30/205517)
[How to Write Python Command-Line Interfaces like a Pro](https://towardsdatascience.com/how-to-write-python-command-line-interfaces-like-a-pro-f782450caf0d)

[^1]: 【[Python】スクレイピングで株価データを取得する](https://non-dimension.com/kabuka-scraping/)
[^2]: [【Python】スクレイピングで403 Forbidden：You don’t have permission to access on this serverが出た際の対処法](https://non-dimension.com/solution-403forbidden/)
「Bundler could not find compatible versions for gem」なとき

# 概要
- rails tutorial(2020/1/3現在）にあるとおりにgemfileを編集してbundle installを実行したら、うまくいかなかったときの話。

``` terminal

Bundler could not find compatible versions for gem "actionpack":
  In Gemfile:
    rails (~> 6.0.2, >= 6.0.2.1) was resolved to 6.0.2.1, which depends on
      actionpack (= 6.0.2.1)

    rails-controller-testing (= 1.0.2) was resolved to 1.0.2, which depends on
      actionpack (~> 5.x, >= 5.0.1)

Bundler could not find compatible versions for gem "listen":
  In Gemfile:
    listen (>= 3.0.5, < 3.2)

    guard (= 2.13.0) was resolved to 2.13.0, which depends on
      listen (>= 2.7, <= 4.0)

    spring-watcher-listen (~> 2.0.0) was resolved to 2.0.1, which depends on
      listen (>= 2.7, < 4.0)

```

# 解決方法＆参考にした情報
- 「インストールしたいバージョンの指定を、もっとゆるくしてあげればいいんだよ」
- 例）
    - gem 'rspec-rails', '3.3.2'　ではなく
    - gem 'rspec-rails', '~> 3.3'　のようにする
- https://github.com/bundler/bundler/issues/7034

# 参考までに私の修正した部分
## 修正前

``` Gemfile

・・・
  gem 'rails-controller-testing', '1.0.2'
  gem 'minitest',                 '5.13.0'
  gem 'minitest-reporters',       '1.1.14'
・・・
```

## 修正後
``` Gemfile

・・・
  gem 'rails-controller-testing', '~> 1.0.2'
  gem 'minitest',                 '~> 5.13.0'
  gem 'minitest-reporters',       '~> 1.1.14'
・・・
```
【サンプルロボ】複数ページに渡るリストを最後部からさかのぼって処理するロボット

【アルゴリズム】
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/7fa80a3a-fd26-f399-f06a-b4983853fea7.png)
・最初に「次へ」タグを押し切って最後のページをだす
・表の最後から順にデータを抽出する

【ポイント】
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/f753db9a-945e-fd73-f3fc-f9522d800f3b.png)
・ループバックにチェックをすると指定したタグの最後から抽出するようになる


【疑問点】
・サンプルロボのページには以下の記載がある
「■ 利用シーン
データを処理（更新）する度に対象データが削除（非表示）されるリストに対して順に処理を繰り返す場合。

■ できること
データを処理（更新）する度に対象データが削除（非表示）されるリストに対して順に処理を繰り返す場合、上から順にループして処理を実行すると、ループが飛び飛びになってしまうため、一度リストの最後尾に移動したうえで、逆向きにリストを処理してゆく。
（だるま落としのように、画面を都度更新しながらリストがなくなるまで1行目のデータを処理するという方法もあるが、その方法では、リスト中にエラー（削除されない明細）が発生下場合、何度も同じエラー明細を処理してしまうことになる。）」
↓
どのようなケースで使うかがいまいちイメージできない
Homestead上のWebサイトをngrokで公開する

## ngrok とは

ngrokとはローカルサーバーをインターネット上へ公開することのできるサービスです。

Web開発の現場では、Webhookのテストによく使われていると思います。

https://ngrok.com/

## 基本的な使い方

`http://localhost` のWebサイトを指定する場合であれば、次のように起動します。

```
ngrok http 80
```

## Homestead を用いた使い方

Hostヘッダを指定することで、Laravel Homestead上のWebサイトを公開することができます。

```
ngrok http <homestead_host_ip>:<port> -host-header=<homestead_domain>
```

https://ngrok.com/docs#http-host-header

HomesteadのIPアドレスが `192.168.10.10` で `http://homestead.test` のWebサイトを指定する場合であれば、次のように起動します。

```
ngrok http 192.168.10.10:80 -host-header=homestead.test
```

## ngrok の設定ファイルを使った起動方法

設定ファイルに接続先を定義することで、次のようにコマンドを簡易化することができます。

```
ngrok start homestead
```

https://ngrok.com/docs#config

デフォルトの設定ファイルを上書きする場合は次のファイルを編集してください。

OS X	`/Users/example/.ngrok2/ngrok.yml`
Linux	`/home/example/.ngrok2/ngrok.yml`
Windows	`C:\Users\example\.ngrok2\ngrok.yml`

トンネル名 `homestead` と `another` を定義する例です。

```yml:ngrok.yml
  homestead:
    proto: http
    addr: 192.168.10.10:80
    host_header: homestead.test
  another:
    proto: http
    addr: 192.168.10.10:80
    host_header: another.test
```

`ngrok start homestead` と `ngrok start another` が使えるようになりました。
bazelのiosチュートリアルの修正点

チュートリアルの左上にあるボタンからmasterに切り替えればよかった

ーーーーー




基本的にはこの手順で良い
https://docs.bazel.build/versions/2.0.0/tutorial/ios-app.html

ただ、依存ライブラリが古いまま（2020/1/3現在）なので若干記法などが異なる。
チュートリアルの中で出てくるWORKSPACEとBUILDを次のように変更すればとりあえずビルドまでは行ける。

```bazel:WORKSPACE
workspace(name = "tutorial")

load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
http_archive(
    name = "bazel_skylib",
    urls = [
        "https://mirror.bazel.build/github.com/bazelbuild/bazel-skylib/releases/download/1.0.2/bazel-skylib-1.0.2.tar.gz",
        "https://github.com/bazelbuild/bazel-skylib/releases/download/1.0.2/bazel-skylib-1.0.2.tar.gz",
    ],
    sha256 = "97e70364e9249702246c0e9444bccdc4b847bed1eb03c5a3ece4f83dfe6abc44",
)
load("@bazel_skylib//:workspace.bzl", "bazel_skylib_workspace")
bazel_skylib_workspace()

# iOS basic build deps.

http_archive(
    name = "build_bazel_rules_apple",
    sha256 = "bdc8e66e70b8a75da23b79f1f8c6207356df07d041d96d2189add7ee0780cf4e",
    strip_prefix = "rules_apple-b869b0d3868d78a1d4ffd866ccb304fb68aa12c3",
    url = "https://github.com/bazelbuild/rules_apple/archive/b869b0d3868d78a1d4ffd866ccb304fb68aa12c3.tar.gz",
)

load(
    "@build_bazel_rules_apple//apple:repositories.bzl",
    "apple_rules_dependencies",
)

apple_rules_dependencies()

load(
    "@build_bazel_rules_swift//swift:repositories.bzl",
    "swift_rules_dependencies",
)

swift_rules_dependencies()

load(
    "@build_bazel_apple_support//lib:repositories.bzl",
    "apple_support_dependencies",
)

apple_support_dependencies()

```

```bazel:BUILD
load("@build_bazel_rules_apple//apple:ios.bzl", "ios_application")

objc_library(
    name = "UrlGetClasses",
    srcs = [
         "UrlGet/AppDelegate.m",
         "UrlGet/UrlGetViewController.m",
         "UrlGet/main.m",
    ],
    hdrs = glob(["UrlGet/*.h"]),
    data = ["UrlGet/UrlGetViewController.xib"],
)

ios_application(
    name = "ios-app",
    bundle_id = "Google.UrlGet",
    families = [
        "iphone",
        "ipad",
    ],
    minimum_os_version = "9.0",
    infoplists = [":UrlGet/UrlGet-Info.plist"],
    visibility = ["//visibility:public"],
    deps = [":UrlGetClasses"],
)

```
「リファクタリング 第2版」Swiftでコーディング その15

# 21-22頁 第1章 ボリューム特典ポイント集計箇所の削除 totalAmount変数の削除

## Swift版 main.swift

データ生成、結果表示付き。

```swift
import Foundation

makeData()

func playFor(aPerformance:Performance) -> Play {
    return plays[aPerformance.playID]!
}

func volumeCreditsFor(aPerformance:Performance) -> Int {
    var result = 0
    result += max(aPerformance.audience - 30, 0)
    if "comedy" == playFor(aPerformance: aPerformance).type {
        result += Int(aPerformance.audience / 5)
    }
    return result
}

func usd(aNumber:Int) -> String {
    let format = NumberFormatter()
    format.numberStyle = .currency
    format.locale = Locale(identifier: "en_US")
    return format.string(from: NSNumber(value: aNumber / 100))!
}

func totalVolumeCredits(invoice:Invoice) -> Int {
    var result = 0
    for perf in invoice.performances {
        result += volumeCreditsFor(aPerformance: perf)
    }
    return result
}

func totalAmount(invoice:Invoice) -> Int {
    var result = 0
    for perf in invoice.performances {
        result += amountFor(aPerformance: perf)
    }
    return result
}

func statement(invoice:Invoice, plays:Dictionary<String, Play>) -> String {
    var result = "Statement for \(invoice.customer)\n"

    for perf in invoice.performances {
        result += "  \(playFor(aPerformance: perf).name): " + usd(aNumber: amountFor(aPerformance: perf)) + " (\(perf.audience) seats)\n"
    }
    result += "Amount owed is " + usd(aNumber: totalAmount(invoice: invoice)) + "\n"
    result += "You earned \(totalVolumeCredits(invoice: invoice)) credits\n"
    return result
}

func amountFor(aPerformance:Performance) -> Int {
    var result = 0

    switch playFor(aPerformance: aPerformance).type {
    case "tragedy":
        result = 40000
        if aPerformance.audience > 30 {
            result += 1000 * (aPerformance.audience - 30)
        }
    case "comedy":
        result = 30000
        if aPerformance.audience > 20 {
            result += 10000 + 500 * (aPerformance.audience - 20)
        }
        result += 300 * aPerformance.audience
    default:
        print("error")
    }
    return result
}
 
let result = statement(invoice: invoices[0], plays: plays)
print(result)
```
「リファクタリング 第2版」Swiftでコーディング その14

# 18-20頁 第1章 ボリューム特典ポイント集計箇所の削除 「ループの分離(p.236)」「ステートメントのスライド(p.231)」「問い合わせによる一時変数の置き換え(p.185)」「関数の抽出(p.112)」

## Swift版 main.swift

データ生成、結果表示付き。

```swift
import Foundation

makeData()

func playFor(aPerformance:Performance) -> Play {
    return plays[aPerformance.playID]!
}

func volumeCreditsFor(aPerformance:Performance) -> Int {
    var result = 0
    result += max(aPerformance.audience - 30, 0)
    if "comedy" == playFor(aPerformance: aPerformance).type {
        result += Int(aPerformance.audience / 5)
    }
    return result
}

func usd(aNumber:Int) -> String {
    let format = NumberFormatter()
    format.numberStyle = .currency
    format.locale = Locale(identifier: "en_US")
    return format.string(from: NSNumber(value: aNumber) / 100)!
}

func totalVolumeCredits(invoice:Invoice) -> Int {
    var volumeCredits = 0
    for perf in invoice.performances {
        volumeCredits += volumeCreditsFor(aPerformance: perf)
    }
    return volumeCredits
}

func statement(invoice:Invoice, plays:Dictionary<String, Play>) -> String {
    var totalAmount = 0
    var result = "Statement for \(invoice.customer)\n"

    for perf in invoice.performances {
        result += "  \(playFor(aPerformance: perf).name): " + usd(aNumber: amountFor(aPerformance: perf)) + " (\(perf.audience) seats)\n"
        totalAmount += amountFor(aPerformance: perf)
    }

    result += "Amount owed is " + usd(aNumber: totalAmount) + "\n"
    result += "You earned \(totalVolumeCredits(invoice: invoice)) credits\n"
    return result
}

func amountFor(aPerformance:Performance) -> Int {
    var result = 0

    switch playFor(aPerformance: aPerformance).type {
    case "tragedy":
        result = 40000
        if aPerformance.audience > 30 {
            result += 1000 * (aPerformance.audience - 30)
        }
    case "comedy":
        result = 30000
        if aPerformance.audience > 20 {
            result += 10000 + 500 * (aPerformance.audience - 20)
        }
        result += 300 * aPerformance.audience
    default:
        print("error")
    }
    return result
}
 
let result = statement(invoice: invoices[0], plays: plays)
print(result)
```
for each tag について

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/bb474e29-17a3-50bf-7a51-ee3ad7d7cebc.png)
タグの部分に指定したいタグ名を記載する

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/28caed00-f3d3-ae88-dcb1-bdc91bab4c59.png)
ファインダーでは、指定したいところの直前までを記載する

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/b3b787fd-5ac7-cfcb-8e64-93f9f094e017.png)
上記の感じでコードは書かれているので、それに倣って指定すればいい
Cloud9上でRails sをしてA server is already runningが出た時の対処法


### 現象　Cloud9上でRails sをしたらA server is already runningが出る

#### コード
ec2-user:~/environment/sample_app $ rails s
=> Booting Puma
=> Rails 5.1.6 application starting in development
=> Run `rails server -h` for more startup options
A server is already running. Check /home/ec2-user/environment/sample_app/tmp/pids/server.pid.

#1.指示通りpidを見に行く
## Check /home/ec2-user/environment/sample_app/tmp/pids/server.pid.
これをクリックしてハイパーリンク先の数字を確認し、コピー

#2.当該idのプロセスをkill
kill -9 確認した数字（pid）を実行

#3.サーバー再起動
もう一度 
rails s

以上です。
[Vue + Laravel] build & deployした際に画面が真っ白に

# 環境
- Laravel Framework 5.7.28
- vue : 2.6.10
- vuex : 3.1.2
- vue-router : 3.1.3
- Chrome (79.0.3945.88（Official Build）（64 ビット）)
- VSCODE

vue-cliは使っていません

# 現象
レンタルサーバーにbuild & deployした際にブラウザ上でも一切エラーは発生していないが、ページが真っ白になってしまう

### 手順
build

```
npm run prod
```

# 試したこと
色々ググって関係ありそうな以下を試してみました

- vue.config.jsでpublicPathを設定する

　そもそもこのファイル自体が存在しないので新規で作ってみましたが無駄でした。。。

- vue-routerのindex.jsにてhistory modeを外してみた

　ページが表示された！！！！！！！！
　ただ、これだとURLに「#」が入ってしまう

# 結論
vue-routerでbaseオプションを指定する

baseにはpublicまでのpathを設定

```
const router = new Router({
    mode: 'history',
    base: '/app/public',
})
```

上記の設定でページが表示されるようになりました
初心者によるプログラミング学習ログ 202日目

#100日チャレンジの202日目

twitterの100日チャレンジ#タグ、#100DaysOfCode実施中です。
すでに100日超えましたが、継続。

100日チャレンジは、ぱぺまぺの中ではプログラミングに限らず継続学習のために使っています。

202日目は

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">おはようございます<br>202日目<br><br>udemyでcss+メディアクエリ、webサイトコーディング、Git<br>いろいろやった。<br><br>休みがあと3日でおわるので、あと3つぐらい講座おわらせたい<a href="https://twitter.com/hashtag/100DaysOfCode?src=hash&amp;ref_src=twsrc%5Etfw">#100DaysOfCode</a> <a href="https://twitter.com/hashtag/%E6%97%A9%E8%B5%B7%E3%81%8D%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8?src=hash&amp;ref_src=twsrc%5Etfw">#早起きチャレンジ</a><a href="https://twitter.com/hashtag/%E9%A7%86%E3%81%91%E5%87%BA%E3%81%97%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%A8%E7%B9%8B%E3%81%8C%E3%82%8A%E3%81%9F%E3%81%84?src=hash&amp;ref_src=twsrc%5Etfw">#駆け出しエンジニアと繋がりたい</a></p>&mdash; ぱぺまぺ@webエンジニアを目指したい社畜 (@yudapinokio) <a href="https://twitter.com/yudapinokio/status/1212842624656109568?ref_src=twsrc%5Etfw">January 2, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
Chef 学習資料

## 動画

『【サポート終了】Chef入門 (全14回) - プログラミングならドットインストール』
(https://dotinstall.com/lessons/basic_chef )

## スライド

『Chef ベーシックトレーニング | Ryuzee.com』
(https://slide.meguro.ryuzee.com/slides/70 )

『ネットワークエンジニアのための Puppet / Chef』
(https://www.slideshare.net/npsg/puppet-chef/21 )

『今日から使い始めるChef』
(https://www.slideshare.net/nekoruri/chef-17848863/14 )

『クラウド上でのChef活用と ベストプラクティス v0.2.0』
(https://www.slideshare.net/ncmeetup/chef-v020/12 )


## 良記事

『Chefで3分クッキング！ Webサーバ構築のレシピをRubyで書いてみよう (1/3)：CodeZine（コードジン）』
(https://codezine.jp/article/detail/8416 )

『ゼロからChefをざっくり理解するまでのノート - Qiita』
（https://qiita.com/tomo_makes/items/a5167d43fe31e0398752 ）

『これからはじめるChefのチュートリアル　基本編 - Qiita』
（https://qiita.com/syou007/items/70006424d66e3f41152d ）

『はじめてのchef - Qiita』
（https://qiita.com/uturned0/items/e35c270fdcd68e5f4ea1 ）

『Chef Solo入門 - Qiita』
（https://qiita.com/enzen/items/704c236489873ac4dc9a ）

『ChefのCookbookをChef localmodeで実行する手順 - Qiita』
（https://qiita.com/kentarok/items/14b34baa0238b12a1923 ）


## ハンズオン資料（英語）

『Learn Chef』
(https://learn.chef.io/#/ )

『A complete beginner’s guide to Chef and infrastructure as code』
(https://www.freecodecamp.org/news/an-introduction-to-chef-and-infrastructure-as-code-7d8ad2689b8/ )


## ハンズオン資料（日本語）

『Chefハンズオン#1 Chefの環境構築とサンプルレシピの作成・実行 - Qiita』
(https://qiita.com/mather314/items/9ae1b0ccb5bde271dd38 )

『kimromi/chef-handson: Chefのハンズオンです。CentOSのvmを立ち上げてRailsを動かすまで。』
(https://github.com/kimromi/chef-handson )


## 書籍

<img width="150" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18351/96e408f8-c42a-82f7-3bb2-b65b1cee5fda.png">

『Chef実践入門――コードによるインフラ構成の自動化 WEB+DB PRESS plus』
https://amzn.to/2QhQ7zb

<img width="150" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18351/4968c9da-c291-301b-ddce-72cdcd5d132b.png">

『入門Chef Solo - Infrastructure as Code』
https://amzn.to/37w7FgQ
nested k-fold cross validation

nested k-fold cross validationの勉強のため
https://axa.biopapyrus.jp/machine-learning/model-evaluation/nested-k-fold-cross-validation.html
のコードを使用させていただいた。ここに勉強した内容をまとめておく。

Google Colaboratoryで実行しようとすると
９行目の
from sklearn.grid_search import GridSearchCV
ではエラーが出たので
from sklearn.model_selection import GridSearchCV
と変更した。

他にも最後のところで少し誤記があったので修正し、下記のコードになった。

```
import numpy as np
from sklearn import datasets
from sklearn.pipeline import Pipeline
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
from sklearn.svm import SVC
from sklearn.ensemble import RandomForestClassifier
#from sklearn.grid_search import GridSearchCV
from sklearn.model_selection import GridSearchCV
from sklearn.model_selection import cross_val_score


# load data
cancer = datasets.load_breast_cancer()
x = cancer.data
y = cancer.target

print(x.shape)
## (569, 30)

x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2)
print(x_train.shape)
## (455, 30)


# SVM model
ppln_svm = Pipeline([
               ('scale', StandardScaler()),
               ('pca', PCA(0.80)),
               ('clf', SVC())
           ])

# SVM model hyperparameters
param_grid_svm = [
    {
        'clf__kernel': ['rbf'],
        'clf__C': 10 ** np.linspace(-5, 5, 20),
        'clf__gamma': 10 ** np.linspace(-5, 5, 20)
    }
]

# Random Forest model
ppln_rf = Pipeline([
               ('scale', StandardScaler()),
               ('pca', PCA(0.80)),
               ('clf', RandomForestClassifier())
           ])

# Random Forest model hyperparameters
param_grid_rf = [
    {'clf__max_depth': [2, 3, 4, 5, 6, 7, 8]}
]


# grid search in inner-loop
gs_svm = GridSearchCV(estimator=ppln_svm, param_grid=param_grid_svm, scoring='f1', cv=2, n_jobs=1)
gs_rf = GridSearchCV(estimator=ppln_rf, param_grid=param_grid_rf, scoring='f1', cv=2, n_jobs=1)


# validate model in outer-loop
scores_svm = cross_val_score(gs_svm, x_train, y_train, scoring='f1', cv=10)
scores_rf = cross_val_score(gs_rf, x_train, y_train, scoring='f1', cv=10)

print('SVM: %.2f±%.2f' % (np.mean(scores_svm), np.std(scores_svm)))
## SVM: 0.97±0.02

print('RF: %.2f±%.2f' % (np.mean(scores_rf), np.std(scores_rf)))
## RF: 0.95±0.03
```

##メモ
- Pipelineという関数が使われていますが、これはscikit-learnの関数で、処理をまとめて設定できるようにするものです。
https://blog.amedama.jp/entry/2018/07/07/223257

- cross_val_score関数でクロスバリデーションを行っている。
https://docs.pyq.jp/python/machine_learning/glossary/cross_validation.html
　
scores = cross_val_score(
    estimator=clf,  # 分類器を指定
    X=X_train,  # 特徴行列 X を指定
    y=y_train,  # 目的変数 y を指定
    cv=8  # データを何分割にして検証するか指定
)
プログラミング初心者がJavaの勉強を始めてみた

初心者エンジニアがJavaの勉強を始めた
=================
とりあえずきっかけ的なやつ
-----------------
※全くタメにはならない、ただの読み物です。初心者なのでそのうち技術的なこと書ければいいんですけど。


私はもともと事務職を長くやってきて、
なんやかんやあって
ITエンジニアを志し
###「未経験でもいいですよ！」
と言ってくれたとある小さなSES会社に入ることになった。そして数年。
・・・
・・・・・・
・・・・・・・・・・

いやこれエンジニアの仕事じゃないよね？未経験でもいいよっていうのは結局事務に毛が生えたことをやるだけ？
という仕事しか回ってこない。そりゃ当然だ。未経験でエンジニアの現場に入れるのはナウなヤングだけである。
なんならコミュ障じゃないと自社のチームがいる現場には派遣されない。
誰かが面倒見ないといけないからね。

※個人の感想だけど、似たような感じで現場の協力会社がド新人アサインしてるの知ってるからあながち間違ってないと思う

エンジニアあるある～コミュ力～
===
私は下手にしゃべれるせいなのか、今までも職種に関係なく派遣元の営業に
<b>「おおたさん（私、なお仮名）一人でも平気じゃないですか」</b>と言われてきた。
派遣初日に営業が客先に挨拶に来た試しがない。今の会社はちゃんと来るだけマシだ。
だがしかし、弊社の「未経験でもエンジニアとして成長できます」という謳い文句を信じた私が馬鹿だった。
手に職を付けるべくこの業界に飛び込んだが、自分の努力も足りなかったと思い至った
（遅せぇって突っ込まれると泣いちゃう

最初は提携してるIT系の学校通えるって聞いてたんだけど、ついぞ通わせてもらえなかった。
面談に行くと派遣先決まっちゃうんだよね、なんにもできないのに。
私はなんとなく簡単な言語の修正とかはできてしまう。めっちゃ調べまくるけど。
設計書や仕様書もそうだ。聞きまくるけど。


エンジニアになりたいとは言ったが、エンジニアといってもプログラマだけがそうじゃない。
・ システムエンジニア
・ インフラエンジニア
・ ネットワークエンジニア
・ WEBデザイナーetc
最近だとデータサイエンティストとかRPAとかもありますな。
IT業界に転職したものの、何がやりたいのかちょっと漠然とし過ぎてたなという反省もあり
とりあえず何かしらの開発言語を身に着けることにした。一応開発は希望してたんだけどなー。
みんな工数入れておくれよ。誰だWBSのExcelの数式ぶっ壊したスットコドッコイは。
あとエンジニアってPCに関することならみんな詳しいんだと思ったらOffice全然な人が多いことも知った。

と、言うわけで
===
年明けから真面目に言語を身に着けようと思い立った私は

[スッキリわかるJava入門　第3版](https://www.amazon.co.jp/%E3%82%B9%E3%83%83%E3%82%AD%E3%83%AA%E3%82%8F%E3%81%8B%E3%82%8BJava%E5%85%A5%E9%96%80-%E7%AC%AC3%E7%89%88-%E3%82%B9%E3%83%83%E3%82%AD%E3%83%AA%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E4%B8%AD%E5%B1%B1%E6%B8%85%E5%96%AC/dp/4295007803/ref=sr_1_1?keywords=%E3%82%B9%E3%83%83%E3%82%AD%E3%83%AA%E3%82%8F%E3%81%8B%E3%82%8Bjava%E5%85%A5%E9%96%80&qid=1577985778&sr=8-1):Amazonのリンク

という本を仕事納めの日にヨドバシ某店で買ってきた。安月給だけどがんばって買った。褒めてください。
全部で765Pもあるんだけど私これ読めるんだろうか（弱気
なんでJavaかというと、今の現場の開発環境がJavaとC言語だからである。安直だなぁ。
もちろん私はコーディング等には携わっていない。PL/PMの金魚のフン係だ。もちろんとか言いたくない。
Javaを実務でやってる人がその辺にごろごろしてる環境と、私の友人のエンジニアに聞けそうだし
言語なんて何でもいいから一つ身に着けろという意見をその友人からもらったからだ。

（それが正しいかどうかは私は初心者なので分からないが）


というわけで元旦だけお休みして今日から自宅のPCで勉強始めました。
誰かにこうやって宣言してないと三日坊主になりそうだから、更新は思い立った時にすることにして
仕事始めまでに半分くらい本の内容ができればいいなぁと思っています。

まぁしょっぱなのJavaの構文試しに書いてみようってところで早速詰まったんですが（大丈夫か