OmniAICreator/Qiita-1.07M huggingface dataset:
【初心者向け】関数型プログラミングの基本原則

# 1. はじめに

最近[JavaScript関数型プログラミング 複雑性を抑える発想と実践法を学ぶ](https://book.impress.co.jp/books/1115101137)を読んで関数型プログラミングについて勉強し始めました。<br>
まだまだ理解しきれていないことが多いので、頭の整理も兼ねて勉強内容のアウトプットしていきます。<br>
今回は関数型プログラミングの基本的な原則を中心にまとめます。

個人的なイメージで記載しているため、認識齟齬あればコメントください。


# 2. 関数型プログラミングとは

上記の本には、「関数型プログラミング」を簡潔にまとめると、以下のように書いてありました。

_関数型プログラミングとは、純粋関数を宣言的に評価することである。<br>
純粋関数は、外部から観測可能な副作用を回避することで、不変性を持つプログラミングを生成する。_

この中で重要なものは以下の3つの原則です。<br>

- 宣言型
- 純粋関数
- 不変性

もう少し詳しく見ていきます。

## 2.1. 宣言型

宣言型とは、ざっくり言うと`「目的」の宣言のみを行い、細かいタスクはコンピュータに任せてしまおう！`という考え方のことです。<br>
皆さんに馴染み深い例としてはSQLです。<br>
SQL文は以下のように結果がどのように出力されるかを宣言し、内部処理についてはコンピュータにお任せしています。

> SELECT name FROM USERS 

宣言型とよく比較されるのが、命令型や手続き型と言われるものです。<br>
命令型とは、どのように実行すべきかを細かく指示するもので、多くのオブジェクト指向言語で使われています。

命令型と宣言型を比較したイメージが以下の図です。<br>
「スーパーへのおつかいを頼む親」というシナリオを想定しています。

![宣言型.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329544/36cba47a-0e94-337e-6333-974fed1fe8ed.png)


命令型と宣言型をプログラムにしたものも見ていきましょう。

配列内の全ての値を2倍するプログラムを考えます。<br>
このプログラムにおける差分は、ループする処理が命令型だとfor文、宣言型だとmap関数である点です。<br>
つまり、命令型では「○回繰り返せ」と指示をしていますが、宣言型では、ループの部分をコンピュータに任せているため、
命令型でイテレータとして定義した`i`を管理する必要がなくなります。

■命令型

~~~javascript
var array = [0, 1, 2, 3, 4, 5]
for (let i = 0 ; i < array.length ; i++){
  array[i] = array[i] * 2
}
array;
// -> [0, 2, 4, 6, 8, 10]
~~~

■宣言型

~~~javascript
[0, 1, 2, 3, 4, 5].map((number) => number * 2);
// -> [0, 2, 4, 6, 8, 10]
~~~


## 2.2. 純粋関数

純粋関数とは、`入力する値が同じであれば、出力される値が同じである関数`のことをいいます。<br>
この特性を`参照透過性`といいます。<br>
関数型プログラムはこの純粋関数を用いて、不変性を担保しています。

言い方を少し変えると、純粋関数とは関数のスコープ外にある変数を一切使用しません。<br>
つまり、グローバル変数を使用しません。
この原則に則ると、変更に強い実装になります。

イメージしやすいよう、以下に純粋関数になってるパターンとなってないパターンを書いています。

■純粋関数になっている

~~~javascript
var increment = counter => counter + 1 ;
~~~

■純粋関数になっていない

~~~javascript
var counter = 0;
function increment() {
    return counter++;
}
~~~


## 2.3. 不変性

不変性とは、1度生成すると変更できないようにすることを指しています。<br>

不変性を持っていない例として、javascriptにおけるobjectがあります。<br>
objectは不変性を持っていないため、sort関数で配列自身の要素が変わってしまいます。
この特性は、言語自体の欠点であるため、javascriptで関数型プログラミングをする場合は、この欠点を克服する必要があります。

克服する方法は今回の記事では割愛します。

# 3. まとめ

関数型プログラミングの基本原則をまとめました。<br>

他にも関数型プログラミングをうまく活用していくためには、タスクをシンプルな関数に分解していくことも大きなポイントです。分解する単位としては、関数の振る舞いを一つの目的に絞ることです。<br>
例えば、データベースの中から特定のユーザーを絞り出し、出力するシナリオを想定すると、「DBから検索する関数」「出力するための形式を整える関数」「出力する関数」に分解するとすっきりします。<br>
javascriptでは高階関数をうまく使って、関数を引数に用いた関数を使用できるので、上記のシナリオが容易に再現できます。

このようなポイントは原則をもう少し自身の中で深掘りしながら、関数型プログラミングを今後の実戦に活かしていこうと思います。
【Nuxt.js】sass-loaderでModule_build_faildのエラーが出た時の対策

# 問題点

Nuxt.js で Sass 記法を使いたいため、`node-sass`と`sass-loader`をインストールしたが、エラーで動かない！

## エラー内容

Module build failed: TypeError:

## 解決方法
以下をプロジェクト内で実行してください。
`npm uninstall --save-dev sass-loader`
`npm install --save-dev sass-loader@7.1.0`

### 偉大なる参考記事

[こちら](https://github.com/JeffreyWay/laravel-mix/issues/2206)で議論されていた方法の結論部分だけまとめました。
VSCodeで検索キーワードを含む行のみ一括削除する

# 方法
VSCodeで，  
1. キーワード検索 
`Command + F` 
2. 検索結果を全選択 
`Alt + Enter` 
3. 選択行を削除 
`Command + Shift + k`

これで削除したいキーワードを含む行が全て削除されます．

誰かのお役に立てれば幸いです．
プログラミングスクール生におすすめのVSCodeプラグイン

## はじめに
プログラミングスクールを卒業して、現在**物流×IT**の企業でエンジニアをしているyukiと申します。
この記事を読んでいる多くの方は、きっとプログラミングスクールに通われているor通おうと思っている方だと思います。

皆様は、テキストエディターは何を使われているでしょうか？
テキストエディターってなんぞや？という方は、[こちら](https://www.pc-master.jp/words/text-editor.html)をご覧ください。（以下、エディター）

プログラミングスクールから推奨されているエディターもあるかと思いますが、個人的におすすめなのはVSCodeです。
今回はそのVSCodeをより便利にしてくれる機能「プラグイン」について、スクール生向けに記事にしてみました。

インストール方法などは、素晴らしい参考記事があるので、一番下の見出しから閲覧ください。

## 記事の対象者
- プログラミングスクールでRuby/Railsが主要なカリキュラムに含まれている生徒の方
- VSCodeのインストールはすでに済んでいる方
- Macユーザー

## そもそもプラグインとは？入れ方は？
プラグインとは、日本語で**拡張機能**のことです。VSCodeをより便利にしてくれる追加の機能だと考えていいと思います。
具体的な導入の仕方は、以下のように行います。

### ①VSCodeを起動して、下記アイコンをクリックする。
![PSR3SjphbKbh8kI1599011977_1599012039.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/557847/8255c87a-3bff-5459-a4f5-bd96e04321e2.png)

### ②検索ウィンドウが出てくるので、追加したい機能の名前を調べ、installボタンを押す
![ECRNerJCfX9xnpu1599012167_1599012184.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/557847/596446ae-80e0-f4af-7dea-cb20525d72db.png)

では早速、紹介していきます。

## プログラミングスクール生におすすめのプラグイン紹介

詳細の説明が必要なものには、※が振ってありますので、後半をご確認ください。

| プラグイン名 | 内容 |
|:-----------|-------------|
| Japanese Language Pack for Visual Studio Code| VSCodeを日本語化してくれます。| 
| Beautify| ※1 cmd+shift+pでBeautifyを選択し、HTML/CSS/JSのいずれかを選択するとコードを綺麗にしてくれます。| 
| Bracket Pair Colorizer     | JSなどでカッコが入れ子になる場合、どれがどれに対応するのか色をつけてくれます。  | 
| Color Picker| CSSなどで色を決める際に、視覚的に選べるカラーピッカーが表示されます。         | 
| HTML Snippets| ※2 後述しますが、HTMLの入力をとにかく便利にしてくれます。      | 
| Path Intellisense|ファイルの場所など、パスを指定するときに候補を出してくれます。   | 
| indent-rainbow|※3 エディターの端っこからコードまでの幅に色をつけてくれます。   | 
| vscode-icons|ファイルやフォルダにアイコンがついてわかりやすくなります。  | 
| zenkaku|全角スペースを可視化し、エラーを防いでくれます。  | 

### ※の説明

※1 MACの方は`cmd+shift+p`で「コマンドパレット」というメニューを開くことができます。ここで、様々なコマンドの実行ができるのですが、Beautifyと入力してreturnを押すと、HTMLかCSSかJSかを選べるので、対象のファイルと同じ拡張子のものを選ぶとコードが綺麗に整形されます。

※2 以下のような形で、入力の候補を出してくれるなど、非常に便利です。
![スクリーンショット 2020-09-02 15.26.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/557847/0d2c2c32-3e72-cec9-13e2-9568a9e59e08.png)

他にも、便利なプラグインが開発されていますので、ぜひ「こんなのあるかな？」と調べてみてください！

## 参考記事（おすすめ記事）
[MacOSでVisual Studio Codeをインストールする手順](https://qiita.com/watamura/items/51c70fbb848e5f956fd6)
【AngularJS】href属性の中にバインドした値を入れる際に、keyを指定したい

# 問題点
PHPとAngularJSで開発を行っていた際に、以下のようなコードを書きました。

```php:view.php
<tr ng-repeat="error in errors track by $index">
  <td>
    <a href="{{error["err_pth"]}}">エラーです</a>
  </td>
// 中略
</tr>
```
※`error`に関しては`"err_pth"`というkeyに対し、エラーが起きた箇所を示す値を持つオブジェクトです。

今回、実現したかったこととしては、エラーごとのリンクを表示させるという機能でしたが
このような記述ではHTMLの方にうまくリンクが描画されませんでした。

# 対応
原因は、ダブルクオーテーションの中にダブルクオーテーションが含まれていることでした。

`<a href="{{error['err_pth']}}">エラーです</a>`

というような感じで、内側はシングルクオーテーションにした結果、無事反映がされました。
【Rails/他にも応用できるかも？】RSpec実行時に、failure/error __send__(method file) rspec cannnot road such fileが出た場合の対応策

# はじめに
こんにちは、[yuki](https://twitter.com/yuki82511988)と申します。よろしくお願いします。
現在、物流関係の企業でWebエンジニアとして勤務しております。（1年目）
弊社はメインで利用している言語がPHPなのですが、自分が個人の開発でRubyを使うことがあるので
今回はRSpecに関する記事を書きました。

## 読者の対象
- 掲題のエラーが発生している方
- エラーに遭遇しており「load」という単語がエラー文に含まれている方

## 読んで分かること
- 掲題のエラーの解決方法
- Load関係のエラーへの一種のアプローチ方法

# エラーが起きた状況
プログラミングのメンターをしていた際に、生徒さんの方で
Rspecの実行コマンド
`bundle exec rspec spec --format documentation`を行った際に、掲題のエラーが出ました。

## 原因
直接的な原因は、**specフォルダを2個作っていること**でした。
それが原因で、読み込みの際にエラーが出ていたようです。

エラー文を解読しようとすると、一見`rspec cannnot road such file`ということで、ファイルが存在しないような錯覚をしますが、実は逆に余計なものがあることが原因でした。

コチラのことがきっかけで「Load」関係のエラーはどのように引き起こされるのかが少し気になり、調査してみました。

### 調査結果
以下の状況の際も、同様のエラーが出ることを確認しました。

- ファイル名（フォルダ名）をspecではなく、sepcなどタイポをしてしまう
- 参照しようとしているファイルがそもそも存在しない


## まとめ
今回のことに限らず、何かファイルをLoadする際には...

```
# タイピングミスがないか
# 指定の場所に存在しているか
# 指定のファイルが複数存在していないか
```
上記のことをしていないか注意しようと思いました。
他のことにも応用できるかもしれないので、ご参考になれば幸いです。

# 弊社の紹介
私は現在、[株式会社ダイアログ](https://www.dialog-inc.com/)という物流×technologyの会社に勤務しております。
2020年9月現在、エンジニアの募集はしていませんが、他にも様々な職種を募集しているので、[Wantedly](https://www.wantedly.com/companies/company_3244501)のページをご覧ください。いつか自分のQiitaきっかけで応募してくださる方がいたら、嬉しいなと思います。

[インタビュー記事（入社後の感想など）](https://www.wantedly.com/companies/company_3244501/post_articles/278203)
LaravelでDBにデータを保存する際、created_atなどが自動で入らなかった時の対策

# 状況
Laravelで開発を行っていた際に、DBにデータを保存しようと試みたのですが、`created_at`など自動で登録して欲しいデータがnullになってしまったため、どうしようかと考えました。

## 行った対策（ダメだった、あまり良くない）

### できたけどあまりよろしくないコード
```php
$result = Model::insert([
  // 中略
  'updated_by_user_id' => $user->id,
  'created_by_user_id' => $user->id
}
```
そもそも本来は入力をせず、自動で登録して欲しい。

## 行った対策（できたもの）
他との都合でinsertを使用して直接値を登録していましたが、しっかりとインスタンスを作成してから`save()`メソッドを使ってみました。

```php
$result = new Model();
// 中略
$result->save();
```

結果、無事に登録されました！

参考にさせていただきました。ありがとうございました！
https://qiita.com/katsunory/items/87a73297f44a65f1474f
docker build の apt-get update で The repository ... is not signed エラー

何回か遭遇する度に、原因を忘れて無駄に時間を浪費してしまっていたので、覚えておくためにもメモしておきます。


## 事象

Docker for Macで Ubuntu 20.04 のイメージをbuildしようとして、Dockerfileの中でお決まりの`apt-get update`をしたところ、以下のような `The repository ... is not signed.` エラーが発生することがあります。

``` bash
Get:1 http://security.ubuntu.com/ubuntu focal-security InRelease [107 kB]
Get:2 http://archive.ubuntu.com/ubuntu focal InRelease [265 kB]
Err:1 http://security.ubuntu.com/ubuntu focal-security InRelease
  At least one invalid signature was encountered.
Err:2 http://archive.ubuntu.com/ubuntu focal InRelease
  At least one invalid signature was encountered.
Get:3 http://archive.ubuntu.com/ubuntu focal-updates InRelease [111 kB]
Err:3 http://archive.ubuntu.com/ubuntu focal-updates InRelease
  At least one invalid signature was encountered.
Get:4 http://archive.ubuntu.com/ubuntu focal-backports InRelease [98.3 kB]
Err:4 http://archive.ubuntu.com/ubuntu focal-backports InRelease
  At least one invalid signature was encountered.
Reading package lists...
W: GPG error: http://security.ubuntu.com/ubuntu focal-security InRelease: At least one invalid signature was encountered.
E: The repository 'http://security.ubuntu.com/ubuntu focal-security InRelease' is not signed.
W: GPG error: http://archive.ubuntu.com/ubuntu focal InRelease: At least one invalid signature was encountered.
E: The repository 'http://archive.ubuntu.com/ubuntu focal InRelease' is not signed.
W: GPG error: http://archive.ubuntu.com/ubuntu focal-updates InRelease: At least one invalid signature was encountered.
E: The repository 'http://archive.ubuntu.com/ubuntu focal-updates InRelease' is not signed.
W: GPG error: http://archive.ubuntu.com/ubuntu focal-backports InRelease: At least one invalid signature was encountered.
E: The repository 'http://archive.ubuntu.com/ubuntu focal-backports InRelease' is not signed.
```

メッセージを見て「signatureの問題か？」と思い調べるものの、「いや、Ubuntuのバージョンが前のだったら分かるけど、イメージタグは latest だし起きるのはおかしいよな…」などと毎回時間を浪費していました…


## 原因
自分のケースの結論から言うと、**Dockerのディスクイメージサイズに対して、ルートパーティションの使用量が100%になっていたことが原因**でした。

毎回気付くたびに、脱力してしまう…

``` bash
root@c761181b1d64:/# df -h
Filesystem      Size  Used Avail Use% Mounted on
overlay          30G   28G     0 100% /
...
```

Docker for Mac の Disk image size を大きくしてあげることで回避可能ですが、増やしてあげる余裕の無いマシンだったこともあり…

未使用の全イメージを削除する`docker image prune`と、停止中の全コンテナを削除する`docker container prune`で容量を空けてあげることで無事回避しました。


ディスクに余裕の無いマシンを使い続ける限り、また御目にかかりそうなエラー。次に遭遇したらスムーズに解決してやる…


## 参考リンク
[Repository is not signed in docker build | stack overflow](https://stackoverflow.com/questions/59139453/repository-is-not-signed-in-docker-build)
ndjsonとは?

ndjsonとは、JSONの値を改行文字で区切ったデータのこと。ndjsonはnewline delimited JSONの略です。

## ndjsonの例

各行がひとつのJSONの値を表現します。次の例では、3つのJSONの値が表現されています。

```json
{"method":"GET","path":"/","code":"200"}
{"method":"GET","path":"/","code":"200"}
{"method":"GET","path":"/","code":"200"}
```

## 改行文字

ndjsonで区切り文字に使う改行は、`\n`または`\r\n`どちらでもいいことになっています。

## ndjsonの用途

fluentdなどで、ログのストリーミング配信で用いられます。普通のJSONと比べて、一度に沢山のJSON値を送信できるので、ログの一括処理がしやすいです。また、普通のJSONで配列でログを送信する場合、受信側は配列の終了まで待たないとなりませんが、ndjsonの場合1行受け取るごとに処理できるので、よりリアルタイムに処理が行えます。

## ndjsonのContent-Type

ndjsonのContent-Typeは`application/x-ndjson`です。

## 参考文献

- [ndjson](http://ndjson.org/)
- [ndjson/ndjson-spec: Specification](https://github.com/ndjson/ndjson-spec) - ndjsonの仕様
Ubuntu 22.04 LTS に WordPress 7.4 をインストール

Ubuntu にLAMP(Linux/Apache/MariaDB/PHP)環境のインストールを行う手順を以下に記します。


# タイムゾーンの変更

```
sudo su - 
timedatectl set-timezone Asia/Tokyo
```

# Apache のインストール

```
apt -y update
apt -y install apache2 
systemctl enable apache2
systemctl start apache2
```

webブラウザで Ubuntu 22.04 サーバのIPアドレス(```curl -w '\n' ifconfig.me``` で確認できます)にアクセスして Apache のテストページが表示されるか確認します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/122952/366e8ac2-da22-72e6-6087-63275cd70ab7.png)

# PHP 7.4 のインストール

```
apt -y install php7.4 php7.4-mysql
```

# MariaDB 10.5 のインストール

```
apt -y install mariadb-server mariadb-client
systemctl enable mariadb
systemctl start mariadb
```

2023-07-07 時点では MariaDB 10.5.19 がインストールされました。

```sql
$ sudo mariadb
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 30
Server version: 10.5.19-MariaDB-0+deb11u2 Debian 11

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]>
```

# WordPress のインストール

## WordPress ダウンロード/展開

現時点での[WordPress最新版](https://ja.wordpress.org/latest-ja.tar.gz)をダウンロードし、DocumentRoot配下に展開します。

```
cd /var/www/html
wget https://ja.wordpress.org/latest-ja.tar.gz
tar xvf latest-ja.tar.gz
chown -R www-data:www-data .
```

## WordPress 用データベース作成

MariaDB Monitor(mariadbコマンド)上で，文字コードUTF8でデータベース wordpress を作成します。

```sql
CREATE DATABASE wordpress DEFAULT CHARACTER SET utf8;
```

## WordPress 用 MariaDB ユーザの作成

さきほど作成したデータベースのみ全権限を持つ wordpress ユーザを作成します(ユーザ名/パスワードは適宜変更してください)。

```sql
GRANT ALL ON wordpress.* TO wordpress@localhost IDENTIFIED BY 'password';
FLUSH PRIVILEGES;
```

## WordPress 初期設定

webブラウザで xx.xx.xx.xx/wordpress/ にアクセスし、WordPressの初期設定を行います。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/122952/e2a57068-9ca9-de5a-9db6-273de5a97770.png)


![image.png](https://qiita-image-store.s3.amazonaws.com/0/122952/f44caded-dc3b-7ee1-199f-b4fab2d5ba9e.png)

正常にインストールが完了すると、指定したユーザ、パスワードでダッシュボードにログインできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122952/e423b026-e4da-ab83-d90e-67dc4d8216b4.png)
HTMLでJavaScirptのwindow.alert()関数を使う方法

# 初めに
この記事ではこれの作り方を紹介しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677340/603e7970-64bf-0fb3-244d-bd1d3145d80c.png)

このサイトの情報は偶然ぼくが前のサイトに戻れるボタンのソースコードを応用して発見した方法ですので、詳しいことは分かりません。
そのためあくまでやり方だけを本記事ではご紹介させていただきます。
なお、この方法はおそらく推奨されていない方法です。予めご了承の上お使いつください。

## 本題
やり方は簡単です。`<a href="javascript:alert('message');">`
`<a>`タグに`href`つけてjavascirptのソースの`javascript:alert('message');`を指定するだけです。

ヒント：
`<a href="javascript:alert('通知として表示させたい文章');">ボタンの文章</a>`
`<a href="#">ボタンの文章</a>`

## 補足
と言っても分かりづらいと思うのでここから細かく書きながら解説していきます。
まず、`<a>`タグを用意します。
`<a>`

そうしたら、` href="javascript:`というものを書いてください。これで、JavaScirptをHTMLで使えます。
`<a href="javascirpt:`

そうしたら`alert('message');`というものを書き足します。``
`<a href="javascript:alert('message');`

ちなみになぜ`;`が必用なのかと言うと、JavaScriptのソースをそのまま書いているからです。
そして`alert('←これ→');`は<font  color="red">確実</font>に`'`でなければいけません。なぜなら`"`を使うと`href=""`の`""`とかぶって
エラーになるからです。htmlは`""`(ダブルクオーテーション)でタグを囲うため、JavaScriptでも`""`を使われていると
どう囲われているのかわからなくなってしまうのです。😓　なので必ず`'`(シングルクォーテーション)で囲むようにしましょう。

そうしたら`"`を付けて　→　`</a>`で`<a>タグ`を閉じてそこに`表示させたい文章を打ち込む`だけです。
`<a href="javascirpt:alert('message');"`　→　`<a href="javascirpt:alert('message');">表示させたい文章を打ち込む</a>`

### <font color="green">▼ 使用用途の例 ▼</font>
ちなみにこれはナビゲーションバー`<nav>`にある未実装のページとかに使うことが僕のオススメです！
ボタンを押しても未実装のため何も起こらない場合は今回ご紹介した`alert()`を使うと便利です！
と言っても未実装の機能が多い場合などは普通にJavaScriptを使ったほうが早いかもしれませんけどねｗ。

ということでこれで解説は以上となります。お疲れさまでした。
最後までご閲覧いただきありがとうございました。m(_ _)m

# ✨参考にさせて頂いたサイト
<font color="green">**・ alert('message'); 関数について**</font>
https://developer.mozilla.org/ja/docs/Web/API/Window/alert
静的サイトジェネレーターについてざっくりした情報

# 静的サイトジェネレーターについてざっくりした情報
久しぶりに土日で勉強したことのまとめを共有します。

読んでも意味が分からなくても全然大丈夫ですが
読後に覚えておいて欲しいキーワード

* 「静的サイトジェネレーター」
* 「JAM Stack」
* 「Gatsby」
* 「Netlify」
* 「ヘッドレスCMS」

以前、技術が高くて有名な会社が書いた、
https://ics.media/entry/190410/
この記事を呼んでWordPress以外の選択肢を
意識していました。

勉強する候補として以下の候補がありましたが
https://jamstack.org/generators/
の人気と教材の多さからGatsbyを使ってみることにしました。

* Gatsby
* Next
* Nuxt
* Jekyll

教材は値段の関係上[JAMStackを学ぼう Gatsby, React bootstrap, Netlifyでつくる企業サイト第２版](https://www.amazon.co.jp/JAMStack%E3%82%92%E5%AD%A6%E3%81%BC%E3%81%86-Gatsby-React-bootstrap-Netlify%E3%81%A7%E3%81%A4%E3%81%8F%E3%82%8B%E4%BC%81%E6%A5%AD%E3%82%B5%E3%82%A4%E3%83%88%E7%AC%AC%EF%BC%92%E7%89%88-ebook/dp/B08DKQ1Q9S/ref=sr_1_16?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=Gatsby&qid=1604278228&s=digital-text&sr=1-16)と[JAMStackを学ぼう GatsbyとヘッドレスCMSでつくるコーポレートサイト ～WordPressはもう古い～](https://www.amazon.co.jp/gp/product/B08KRPTW2R/ref=ppx_yo_dt_b_d_asin_title_o00?ie=UTF8&psc=1)にしました。エビスコムの[Webサイト高速化のための　静的サイトジェネレーター活用入門](https://www.amazon.co.jp/Web%E3%82%B5%E3%82%A4%E3%83%88%E9%AB%98%E9%80%9F%E5%8C%96%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE-%E9%9D%99%E7%9A%84%E3%82%B5%E3%82%A4%E3%83%88%E3%82%B8%E3%82%A7%E3%83%8D%E3%83%AC%E3%83%BC%E3%82%BF%E3%83%BC%E6%B4%BB%E7%94%A8%E5%85%A5%E9%96%80-Compass-Books%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E3%82%A8%E3%83%93%E3%82%B9%E3%82%B3%E3%83%A0-ebook/dp/B088WJWJK9/ref=sr_1_3?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=%E3%82%A8%E3%83%93%E3%82%B9%E3%82%B3%E3%83%A0&qid=1604278388&s=digital-text&sr=1-3)もよさそうです。

## ◇所感
Gatsbyで普通のコーポレートサイトを作るのでさえもJavaScriptやReactやGraphQLを
ゴリゴリ書かなければならず技術的な敷居はかなり高い。
日本語対応しているヘッドレスCMSは「microCMS」だけなので
選択肢は多くない。
しかし要件にハマれば学習するメリットはかなり大きい。
要件次第でWordPressと静的サイトジェネレーターを
取捨選択するというのが今後のWeb制作の正解ではないかなと思う。そうした時に求められるスキルレベルが上がってくるのですごく大変そう。精進しないといけない。

## ◇成果物
JavaScriptやReactやGraphQLで書いたソースコードを
Githubにpushすると連携しているNetlifyが取り込んでくれる。そしてヘッドレスCMSの「microCMS」に投稿したデータも取り込んでくれてHTMLにビルドしてくれる。それを高性能なサーバーで無料で配信してくれる。「インフォメーション」のところが「microCMS」で管理している記事になります。

[ソースコード](https://github.com/sasasa/LearningJAMStack_microCMS_template)と[作った成果物](https://zealous-clarke-b499ae.netlify.app/)の架空のコーポレートサイト

## ◇JAM stackとは
[Jamstackって何なの？何がいいの？](https://qiita.com/ozaki25/items/4075d03278d1fb51cc37)


## ◇Gatsbyとは
[静的サイトジェネレーター Gatsby](https://qiita.com/umamichi/items/9bd08a21fddc71588efc)
の前半部分を読めばなんとなく分かります。


## ◇Netlifyとは
[NetlifyとGithubを連携させ、サイトのアップロード作業を自動化する方法](https://rightcode.co.jp/blog/information-technology/netlify-github-up)
の前半部分を読めばNetlifyとは何か分かります。

他にもユーザー登録せずに使えるサーバーも提供してくれています業務で使えると思います。[Netlify Drop](https://app.netlify.com/drop)


## ◇ヘッドレスCMSとは
[CMSの新しい潮流 - ヘッドレスCMS](https://writewired.jp/knowledge/what-is-a-headless-cms.html)
の図を見るとイメージ湧きます。

代表的なサービス

* [contentful](https://www.contentful.com/)
* [microCMS](https://microcms.io/)

まだイメージ湧かない場合は
[Headless CMS 軽く触って比較してみた(Contentful / microCMS / strapi / GraphCMS)](https://qiita.com/cheez921/items/81cba28e4b815709f863)
を読めばスクリーンショットが豊富なため代表的なContentfulやmicroCMSのUIを確認できます。
無料で使える数式処理システムまとめ

# Mathematica

Mathematicaは無料では使えないが、Mathematicaの機能を無料で使う方法は3つあります。

1. [WOLFRAM CLOUD](https://www.wolframcloud.com/)
2. [Wolfram Engine + Jupyter-notebook](https://qiita.com/Mizuto_Kadowaki/items/0f8ac51c7c00303f456e)
3. [Raspberry Pi上でMathematica](https://www.wolfram.com/raspberry-pi/index.php)

WOLFRAM CLOUDが一番楽ですが、長い計算は出来ません。なので私はJupyter notebookを使ってます。Raspberry Pi上で動かすのは使った事ありません。

# sympy

Pythonはライブラリで無料で使えます。conda installとかpip installで入るはず。
私はjupyter notebookで使ってます。(jupyter notebookなら数式をきれいに標準してくれます。)

# [SageMath](https://wiki.archlinux.jp/index.php/SageMath)

無料で使えます。apt installとかで入ります。anacondaで入れたjupyter notebook内では使えなかった。SageMathの内部ではsympyを呼んでるらしい。。。

# まとめ

Mathematicaが有料なので他の数式処理システムの上位互換かと思いきや、意外とSageMathの方が良かったりもする。Mathematicaで出来なかったらSageMathに打ち込んでみたり、SageMathで出来なかったらMathematicaに打ち込んでみたりしたら良い気がする。
一個サーバー内にJupyter notebookを1つ用意して数式処理システムを大量にブチ込んで置くのが便利な気がする。
AutoAI使ってCSVデータの一括予測

　AutoAIはとても便利なツールです。データがあれば（これが実は大変なのかもしれませんが）簡単に予測モデルを作ることができます。
具体的にはcsv形式のデータをアップロードして予測したい項目を選択してあとはAutoAIにお任せ、自動的にモデルを作ってくれます。
詳細はこちらのブログが参考になりました。
[AutoAIでお手軽機械学習(その1) 準備編](https://qiita.com/makaishi2/items/d63f0bbac32a975c391e)
　ところでモデルを作るまでは超簡単だったのですが実際に予測を行う場合、例えば予測したいデータがCSVとしてあって一括予測したい場合にはプログラムを書いてAPIを呼び出す必要があってちょっと面倒でした。
が、最近新しい機能が追加されてそれが簡単になったようなのでメモしておきます。
参考にした記事はこちらです。
[AutoAIでお手軽機械学習(その3) Webサービス編](https://qiita.com/makaishi2/items/e5ad4d068bd364fdc056)

　今回はKaggleにあったタイタニックのデータ(train.csv)でモデルを作成、バッチでテストデータ(test.csv)の予測を行うということをやってみました。
[タイタニックデータ](https://www.kaggle.com/c/titanic/data)

手順は
- モデルの作成
- デプロイメントステージにモデルをプロモート
（この２つは上の記事を参考に進めました）
- バッチを利用してモデルのデプロイメント
（ここではこの手順を書いておきます）

## 

モデルを作成してデプロイメントスペースにプロモートした後の図がこちらです。予測で使うデータセット（test.csv)も予め入れておいた方がいいです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59741/a7024a89-ec34-a2bf-246c-0f9e65cca1ce.png)
Space1というデプロイメントスペースにモデルが表示されています。（ここではTitanicとbank)　Titanicを使うのでそちらをクリック
そしてデプロイメントの作成をクリック
次に以下の画面が出てくるので”バッチ”をクリック
任意の名前を入れて一番下にあるハードウェア定義を選択、右下の”作成”をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59741/74da3bac-55dc-0322-508b-f1f282f4c387.png)
次に”ジョブの作成”
ジョブ名の入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59741/c2e61634-a478-826b-ee1a-2d1f34da022d.png)
ハードウェアの選択、スケジュール（任意の時間にスタートできるように設定できるようです）と続けます。（基本デフォルトのまま行きました）
次にデータの選択があるので入力にtest.csvを選択、出力ファイルに任意のファイル名を入れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59741/c9e3abe5-3a0f-b793-fa00-e4dfbe8e134c.png)
次をクリックして次の画面で作成をクリックします。
これであとは待つだけです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59741/dbbb8f1a-129c-e0e0-ff7a-1bbb035338c5.png)
ジョブ名をクリックすると状況が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59741/a6c96b27-c43c-ac1c-dd54-1ac8073d1810.png)
デプロイメントスペースのデータ資産に先ほどしてしたデータができてますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59741/b1493f07-c390-3c95-f645-a9e7ce71b42e.png)![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59741/9176241d-ab52-71ed-9ad0-a19443339401.png)

ダウンロードして確認してみてください！

ちなみに上でやったものをKaggleにあげたらこんな結果でした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59741/c21c81d4-7578-412a-9594-ebdba11ebe6f.png)
全部で17539の中で5744だから悪くはないです。
たくさんの人が真似しそうですが。
Railsを動かすために、WebpackerとYarnをインストールする

# 環境
Ubuntu16.04.7 LTS
Windows10 + Vegrant
Rails 6.0.3

# やったこと

railsを起動したところ、Webpackerが存在していなので、インストールして下さいのエラーメッセージが表示されるのでインストールする事に。

```
$ rails s
Webpacker configuration file not found /vagrant/xxx/config/webpacker.yml. 
Please run rails webpacker:install Error: No such file or directory @ rb_sysopen - /vagrant/xxx/config/webpacker.yml (RuntimeError)
```

ところが、Webpackerをインストールしようとすると、今度はYarnをインストールして下さいと出てくる。

```
$rails webpacker:install
Yarn not installed. Please download and install Yarn from https://yarnpkg.com/lang/en/docs/install/
```

Yarnのインストール方法は、基本、公式サイトを参考にします。
https://classic.yarnpkg.com/en/docs/install/#debian-stable

```
$curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
$echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list
```

>**コマンドの説明**
- apt-keyは、既存のキー一覧に新しいキーを追加するコマンド。
- add -を付けると、標準入力からキー一覧に追加するという意味です。
- teeは、標準出力をファイルに書き込み、かつ、画面表示もするコマンド。
- yarnのリモートリポジトリのURLをyarn.listに書き込んでいます。
- stable mainは安定版です。

updateで、パッケージのインデックスファイルを最新にしてから、インストールを行います。パッケージをインストールする前にupdateをするのはお約束です。

```
$sudo apt update && sudo apt install yarn
```

>**コマンドの説明**
コマンド1 && コマンド2 で、コマンド1が正常終了すればコマンド2を実行するという意味です。

Yarnがインストールされた事を確認します。

```
$yarn --version
1.22.5
```

rails sが正しく動作するようになりました。

```
$ rails s
```
.NET 5 RC 1 以降なら Positional Record Type でも属性が使える

これまでは Positional Record の各フィールドに属性を付与することができませんでしたが、.NET 5 RC 1 から可能になりました。
これで、各フィールドの入力検証などをおこなうことができるようになります。

```csharp
// .NET 5 RC 1 以降

using System.Text.RegularExpressions;

record Age([Range(0, 200)] int Value);

record NamePhonetic(
    [RegularExpression(@"^\p{IsKatakana}*$"), ErrorMessage = "Must only Katakana."]
    string LastName,
    [RegularExpression(@"^\p{IsKatakana}*$"), ErrorMessage = "Must only Katakana."]
    string FirstName);
```

おわり。
高位合成言語アセンブラを作る。 その9

#概要

高位合成言語アセンブラを作る。
練習問題、やってみた。

#全加算器を作れ。


```
make 8
in 0 2
wire 3 5
xor 1 2 3
and 1 2 4
xor 0 3 7
and 0 3 5
or 4 5 6
out 6 7

```

#真理値表を表示。

![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/4c1a2935-c3b8-cad0-e429-7d3792bb4c80.jpeg)


#成果物


https://embed.plnkr.co/plunk/dn6OkSUpgFdgcrK0

#回路図を表示。
![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/c4ec65ef-f1f1-81f3-40a8-00569ddf5a16.jpeg)


#成果物

https://embed.plnkr.co/plunk/vq56JBayaRCHK7fy

#コンパイルして、verilog生成。

```
module x(input a, input b, input c, output g, output h);
    assign d = b ^ c;
    assign e = b & c;
    assign h = a ^ d;
    assign f = a & d;
    assign g = e | f;
endmodule

module testbench;
    reg a, b, c;
    x u(.a(a), .b(b), .c(c), .g(g), .h(h));
    initial
    begin
        $display("a b c g h ");
        $monitor("%b %b %b %b %b ", a, b, c, g, h);
        a = 0; b = 0; c = 0; #10;
        a = 0; b = 0; c = 1; #10;
        a = 0; b = 1; c = 0; #10;
        a = 0; b = 1; c = 1; #10;
        a = 1; b = 0; c = 0; #10;
        a = 1; b = 0; c = 1; #10;
        a = 1; b = 1; c = 0; #10;
        a = 1; b = 1; c = 1; #10;
        $finish;
    end
endmodule

```

#成果物

https://embed.plnkr.co/plunk/u9yIlBNJgq2feXaG

#実行結果

```

a b c g h
0 0 0 0 0
0 0 1 0 1
0 1 0 0 1
0 1 1 1 0
1 0 0 0 1
1 0 1 1 0
1 1 0 1 0
1 1 1 1 1

```

以上。
3分アジャイル アジャイル実践用必読書籍、資料

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47327/e9a87c7f-0cdb-b7c8-9ef7-81c7399e1c2a.png)

https://www.amazon.co.jp/dp/4274068560

---

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47327/1d176ba9-5dfe-1d94-f640-790e44ef31c3.png)

https://www.amazon.co.jp/dp/B086GBXRN6/

---

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47327/00d4ed9a-16e9-3ac1-5b8b-31c0bd904a7c.png)

https://www.amazon.co.jp/dp/4274068560

---

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47327/5e3624ce-451a-ae7f-6d7e-1e6472ed0d6c.png)


https://agilemanifesto.org/iso/ja/manifesto.html

---

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47327/19bac239-bc3b-b6b6-be1d-d355fe50cac3.png)


https://www.scrumguides.org/docs/scrumguide/v2017/2017-Scrum-Guide-Japanese.pdf

---

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47327/72568747-9c8e-60a8-fbe9-58dba6c08dfb.png)

https://www.amazon.co.jp/dp/4798130508

---

## 連絡事項

- 計画ミーティング

---

## デイリー

- 昨日やったこと
- 今日やること
- チーム、個人が困っていること
GitLabのアップグレードでlibsemanage.semanage_pipe_dataエラー

いつものようにGitLabのアップグレードを実行したところ、一見問題なく終了したもののその後でエラーが発生した。

環境はCentOS7,GitLabのアップグレードは13.2.4 → 13.5.1



```
$ sudo yum install -y gitlab-ce

     _______ __  __          __
    / ____(_) /_/ /   ____ _/ /_
   / / __/ / __/ /   / __ `/ __ \
  / /_/ / / /_/ /___/ /_/ / /_/ /
  \____/_/\__/_____/\__,_/_.___/
  

Upgrade complete! If your GitLab server is misbehaving try running
  sudo gitlab-ctl restart
before anything else.
If you need to roll back to the previous version you can use the database
backup made during the upgrade (scroll up for the filename).

  検証中                  : gitlab-ce-13.5.1-ce.0.el7.x86_64                1/2 
  検証中                  : gitlab-ce-13.2.4-ce.0.el7.x86_64                2/2 
```

しかし、reconfigureを実行すると、初めて見るエラー

```
$ sudo gitlab-ctl reconfigure
STDERR: libsemanage.semanage_pipe_data: Child process /usr/libexec/selinux/hll/pp failed with code: 255. (No such file or directory).
```

エラーメッセージから検索すると[ここ](https://forum.gitlab.com/t/upgrade-to-13-5-1-failed/44545
)に情報があった。
「libsemanage-static libsemanage-devel policycoreutils」が必要らしいが、「libsemanage-devel」がインストールされていなかったので、yumでインストール。

```
$ yum list installed|less
$ sudo yum install libsemanage-devel
```

これでreconfigureを実行するとエラーは消えた。



※　エラーが出て頭が真っ白になった次の瞬間、「selinux」の文字を見つけて、とりあえず「setenforce 0 で回避」を考えましたが、その対応では解決できませんでした。
S3で特定のユーザーを拒否する。

# S3で特定のユーザーを拒否する。
はい皆さんこんにちは

結論から言うとこの記事は
アカウント内で運用ユーザーが複数居るような時に、S3バケット毎にアクセス拒否設定を入れる方法を書いています。

# 詳細
環境：
Amazon S3（2020/11時点）
IAMユーザーは以下が登録されている想定で書いています。これらのユーザーにはS3のアクセス権限を付けています。
・MITA-JIRO
・SINAGAWA-JIRO
・KABUKICHO-JIRO


注意事項：
**rootユーザー（アカウントの持ち主）をホワイトリストに入れる方法が最後まで分かりませんでした。**
まぁ運用で使わないユーザーだからええやろという整理になりましたが、情勢が変わったら更新します。
なお、rootユーザーはS3のポリシーを書き換える権限は持っているので、何も出来ないわけではないです。



##ブラックリスト形式
以下のように書きます。

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Stmt1600141533754",
            "Effect": "Deny",
            "Principal": "*",
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::your-s3-name",
            "Condition": {
                "StringEquals": {
                    "aws:username": "KABUKICHO-JIRO"
                }
            }
        }
    ]
}
```


##ホワイトリスト形式
以下のように書きます。

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Stmt1600141533754",
            "Effect": "Deny",
            "Principal": "*",
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::your-s3-name",
            "Condition": {
                "StringNotEquals": {
                    "aws:username": "MITA-JIRO"
                }
            }
        }
    ]
}
```

##感想
今後もユーザーが増えるような運用を考えるならホワイトリスト形式が良いのですが、
これだとrootユーザーをリストに入れられませんでした。
また、ぱっと見で分かりにくいというのもあって、個人的にはブラックリスト形式を押したいところです。
（rootユーザーの件が解決したらホワイト派になるかも。。）

**ありがとうございました。**
【忘備録】スマホでlocalhost:3000を見る方法

ターミナルで
`ifconfig | grep 192`
と入力
inet 192.123.4.56 netmask〜
と返ってくるので、
スマホのブラウザで192.123.4.56:3000へアクセス

PCとスマホは同じネットワークにつなぐ
【HANA】csvデータのインポート方法(HANA Studio経由)

# はじめに

本記事ではHANA Studioから物理テーブルにcsvデータをインポートする方法を紹介いたします。
また、Eclipseからでも同じ手順でインポートが可能です。
EclipseをHANA Studio仕様にする方法については、以下の記事をご参照ください。

>Eclipse で HANA Studio の環境を作ろう
>https://qiita.com/iwa_gino/items/fdf6fd659bd5ecfb577b

# インポート手順

１．ファイル＞インポート　をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137780/24a55c70-8217-9494-a418-790d705d1e54.png)

２．インポート・ウィザードより「Data from Local File」を選択し、「次へ」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137780/b5266c41-a448-910a-86d1-bac212595ed7.png)

３．対象のHANAシステムを選択し、「次へ」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137780/51746195-c3f9-a9b8-34d3-b479ed0127f1.png)

４．「ソース・ファイル」にて、インポートするCSVを選択
５．CSVにヘッダーがある場合には「Header row exists」にチェックを入れる
６．「ターゲット・テーブル」にて、新規または既存にインポート先テーブルを指定
　　※今回は既存のテーブルにデータインポートするため、「既存」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137780/f3c107d7-7022-e829-2e93-35bfc02bf84d.png)

７．ソース・ファイル（左）とターゲット・テーブル（右）の情報をマッピングする
　　マッピングはドラッグアンドドロップで可能。
　　また、下図赤枠のマッピングボタンより「Map by Name(カラム名で紐づけ)」「1 対 1」での一括マッピングも可能。
８．「完了」をクリックすると、インポートジョブが起動されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137780/2c76143c-46ec-237e-0b48-cb2037953348.png)
【HANA】SQL一覧

# はじめに

本記事にはSAP HANAでのテーブル操作時のSQL文を記載しております。
※随時追記していきます。

# 目次
1. テーブルの作成（CREATE TABLE）
2. テーブル定義の変更（ALTER TABLE）
3. 既存テーブルへのカラム追加（ADD COLUMN）
4. カラムのリネーム（RENAME COLUMN）
5. テーブルのリネーム（RENAME TABLE）
6. ROWTABLE⇔COLUMNTABLEの変更（ALTER TABLE）
7. カラムコメントの追加（COMMENT ON COLUMN）

# SQL
#### 1. テーブルの作成（CREATE TABLE）

```
CREATE COLUMN TABLE "SCHEMA_NAME"."TABLE_NAME"(
   "COLUMN01" VARCHAR(50) CS_STRING NOT NULL,
   "COLUMN02" NVARCHAR(50) CS_STRING,
   "COLUMN03" DECIMAL(13) CS_FIXED,
   "COLUMN04" DATE CS_DAYDATE,
 PRIMARY KEY (
  "COLUMN01"
 )
);
```


#### 2. テーブル定義の変更（ALTER TABLE）

```
Alter table "SCHEMA_NAME"."TABLE_NAME" Alter (
　　"COLUMN01" DECIMAL(13)
);
```

#### 3. 既存テーブルへのカラム追加（ADD COLUMN）

```
ALTER TABLE "SCHEMA_NAME"."TABLE_NAME"
	ADD (
	"COLUMN05" NVARCHAR(50)
	);
```

#### 4. カラムのリネーム（RENAME COLUMN）

```
RENAME COLUMN "SCHEMA_NAME"."TABLE_NAME"."BEFORE_COLUMN_NAME" TO "AFTER_COLUMN_NAME"
```

#### 5. テーブルのリネーム（RENAME TABLE）

```
RENAME TABLE "SCHEMA_NAME"."BEFORE_TABLE_NAME" TO "AFTER_TABLE_NAME"
```

#### 6. ROWTABLE⇔COLUMNTABLEの変更（ALTER TABLE）

```
// Row TableからColumn Tableに変更
Alter table "SCHEMA_NAME"."TABLE_NAME" column

// Column TableからRow Tableに変更
Alter table "SCHEMA_NAME"."TABLE_NAME" row
```


#### 7. カラムコメントの追加（COMMENT ON COLUMN）

```
COMMENT ON COLUMN "SCHEMA_NAME"."TABLE_NAME"."KANRI_NO" is '管理番号'
```
Laravelで、Trying to get property of non-object　と出たときの2つの解決策

# エラー内容
belongsToでboardsテーブルからpeopleテーブルのレコードを取り出したいときに、Trying to get property of non-objectというエラーが出て解決に時間がかかったので共有します。

## 対象のソース
```php5:Board.php
public function person()
{
    return $this->belongsTo('App\Person');
}

public function getData()
{
    return $this->id . ': ' . $this->title . ' (' . $this->person->name . ')';
}
```

これだとBoardクラスのgetDataメソッドの中の「$this->person」がnullで返る場合にTrying to get property of non-objectとなります。

# 解決策1
optional()メソッドを使う。

```php5:Board.php
public function getData()
    {
        return $this->id . ': ' . $this->title . ' (' . optional($this->person)->name . ')';
    }
```
ヘルパー関数optional()は第二因数と共に利用し、第一因数(optionalの中)がNullの場合、第二因数を実行してくれます。

# 解決策2
連想配列にしても上手く行きました。

```php5:Board.php

public function getData()
{
    return $this->id . ': ' . $this->title . ' (' . $this->person['name'] . ')';
}
```

### 参考文献
[Laravel：Trying to get property of non-object エラー](https://qol-kk.com/wp2/blog/2018/12/19/post-992/)

##会社の紹介
私は現在、[株式会社ダイアログ](https://www.dialog-inc.com/)という物流×ITの会社に勤務しております。
2020年11月現在、エンジニアの募集はしていませんが、他にも様々な職種を募集しているので、[Wantedly](https://www.wantedly.com/companies/company_3244501)のページをご覧ください。
【Java】HttpClientでコンテンツ取得

#HTTPでコンテンツ取得
* **HttpClientクラス**（Java11以降）
    * HTTP2対応
    * 非同期処理
    * WebSocket通信（軽量）
* モジュール（パッケージの束）
    * HttpClientクラスは`java.net.http`モジュールに属する
    * 現プロジェクトからモジュールへのアクセスを有効化するため/src配下に以下記述

```java:module-info.java
module selflearn{
  requires java.net.http;
}
```

* **HttpClientオブジェクト生成**
    * **newHttpClientメソッド**でインスタンス生成
    * **newBuilderメソッドで動作パラメータ設定**
    * 認証コード（authenticator）、接続タイムアウト時間（connectTimeout）、バージョン指定（version）など
    * `var client = HttpClient.newBuilder()
   .version(HttpClient.Version.HTTP_1_1)
.connectTimeout(Duration.parse("PT3S")).build();`
    * 最後にbuild()を呼び出してそれぞれの設定に基づくHttpClientオブジェクト生成
* **HTTPRequestオブジェクト生成**
    * newBuilderメソッドの最後にbuildメソッド呼び出す
* **リクエスト送信**
    * **HttpClientクラスのsendメソッド**
    * レスポンス操作のhandlerメソッド指定
        * 文字列（ofString）、ストリーム（ofLines）、ファイル（ofFile）、入力ストリーム（ofInputStream）、バイト配列（ofByteArray）
* **レスポンス取得**
    * sendメソッドは応答をオブジェクトで返す
    * 本文（body）、応答ヘッダ（headers）、HttpRequest（request）、ステータスコード（statusCode）、URI（uri）

```java
//Qiitaにアクセスしてコンテンツ取得
import java.io.IOException;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class Main {
  public static void main(String[] args) {
    try {
      //HTTPクライアント生成
      var client = HttpClient.newHttpClient();
      //リクエスト準備
      var req = HttpRequest.newBuilder()
        .uri(URI.create("https://qiita.com/"))
        .build();
      //レスポンス取得
      var res = client.send(req, HttpResponse.BodyHandlers.ofString());
      System.out.println(res.body());
      //<!DOCTYPE html><html><head><meta charset="utf-8" /><title>Qiita</title><meta content="Qiitaは、プログラマのための技術情報共有サービスです。 プログラミングに関するTips、ノウハウ、メモを簡単に記録 &amp;amp; 公開することができます。"(略)
    } catch (IOException | InterruptedException e) {
      e.printStackTrace();
    }
  }
}

```

## 非同期リクエスト送信
* sendAsyncメソッド
    * 応答を待たず後続の処理できる
    * thenAcceptメソッドで結果処理

```java
//非同期処理でレスポンス取得
client.send(req, HttpResponse.BodyHandlers.ofString())
.thenAccept(response -> {
  System.out.println(response.body());
});
```

##HTTP POSTのデータ通信
* HTTP GETでデータ取得、HTTP POSTでデータ送信
* **HttpRequest.BodyPublishersクラス**のメソッドでリクエスト生成
    * 文字列（ofString）、ファイル長さ（ofFile）、InputStream（ofInputStream）、バイト配列（ofByteArray）
    

```java
import java.io.IOException;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class Main {
  public static void main(String[] args) throws IOException, InterruptedException {
    var client = HttpClient.newHttpClient();
    //nameキーを受け取ってString生成
    var req = HttpRequest.newBuilder()
      .uri(URI.create("https://www.sample/post.php")) //"こんにちは、さん！"
      .header("Content-Type","application/json")
      .POST(HttpRequest.BodyPublishers.ofString(
         "{ \"name\" : \"Qiita Neko\" }")) 
      .build();
    var res = client.send(req, HttpResponse.BodyHandlers.ofString());
    System.out.println(res.body()); //こんにちは、Qiita Nekoさん！
  }
}
```

```php:post.php
<?php
$data = json_decode(file_get_contents('php://input'));
print ('こんにちは、'.$data->name.'さん！');
```
IISでhttpからhttpsへリダイレクトさせる

# はじめに

どうも‪✋(´･ᴗ･\` )‬

今日はIISでhttpからhttpsへリダイレクトをさせるお話です。
`http://●●●.rumraisin.tokyo/` へのアクセスを `https://●●●.rumraisin.tokyo/` へリダイレクトしたいというお話なのですが, IISだとちょっとクセのある設定をしないといけなかったのでまとめました。

ちなみに思考を完全停止してIISマネージャーから「Webサイト」を作成し, 80と443で接続を受け付け, やってきた接続を `https://●●●.rumraisin.tokyo/` へリダイレクトするようにしたんですが, 
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319289/9d719fe4-f419-b65d-ad19-36f407d8df97.png" width="540px" alt="スクリーンショット 2020-11-01 19.05.56.png">
<img alt="スクリーンショット 2020-11-01 19.17.20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319289/0b9a1fb3-1756-048d-2085-4316dfb108d1.png" width="780px">

`ERR_TOO_MANY_REDIRECTS` で怒られましたｗ(httpどころかhttpsもリダイレクトしてしまうのでそれはそうなのですが)
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319289/29ba3c72-162d-988d-f57c-602ccf34ec65.png" width="820px" alt="スクリーンショット 2020-11-01 19.16.31.png">


# 手順
## httpsでの接続を受ける「Webサイト」の作成
① IISマネージャーから「Webサイトの追加」を実行
<img alt="スクリーンショット 2020-11-01 19.19.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319289/e990d482-e4df-4921-6aa3-25492a920489.png" width="380px">

② 443ポートで接続を受ける「Webサイト」を作成する
※私は一旦80ポートで受ける「Webサイト」を作成し, 
<img alt="スクリーンショット 2020-11-02 8.58.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319289/2bc956b1-59f5-4791-b6d7-c869087ac14a.png" width="450px">
Let's Encrypt( `wacs.exe` )を使用して証明書発行+バインドを実行した後, 80ポートでの待ち受けを解除しました。
`wacs.exe` のインストールについてはPowerShellでChocolateyを利用して `choco install letsencrypt-win-simple` でインストールしています。
<img alt="スクリーンショット 2020-11-01 19.17.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319289/6311d2f0-e109-a01d-b96e-736cf5885f0e.png" width="540px">

## httpでの接続を受ける「Webサイト」の作成
① IISマネージャーから「Webサイトの追加」を実行
<img alt="スクリーンショット 2020-11-01 19.19.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319289/e990d482-e4df-4921-6aa3-25492a920489.png" width="380px">

② 80ポートで接続を受ける「Webサイト」を作成する
<img alt="スクリーンショット 2020-11-01 19.20.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319289/2cf31961-d706-3c20-7f44-218bfe1703fc.png" width="450px">

③ ②で作成したhttpでの接続を受ける「Webサイト」の機能一覧から「HTTPリダイレクト」を選択
<img alt="スクリーンショット 2020-11-01 19.18.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319289/2ecf633c-6d06-4fb1-ca5a-b44ad42c5bad.png" width="680px">

④ `https://●●●.rumraisin.tokyo/` へリダイレクトするよう設定する
<img alt="スクリーンショット 2020-11-01 19.20.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319289/54e38054-5b4e-1da0-a133-5b2368d5ac83.png" width="820px">

以上で完了です。

# おわりに
nginxでWebサーバーを立てた際には同じ `server` の設定内でhttpからhttpsへのリダイレクトを設定できたのでIISでもそのような形でできるのではないかと思っておりちょっと違和感のある設定だなという感じですが, 以上の設定でhttpからhttpsへのリダイレクトを設定することができます。
pythonでymlからcommandをloadして実行する

yml fileからcommandを読み取るプログラムを書いたので掲載しておきます
### yml file
```
cmd1:
        command: ls -l
        type: ls

cmd2:
        command: ls -a
        type: ls
```

### python code
```
import subprocess
import yaml

with open('sample.yml') as file:
    obj = yaml.safe_load(file)

cmd1 = obj['cmd1']['command']
types = obj['cmd1']['type']

print('実行モードは', types,'です。')
print(cmd1)
subprocess.run(cmd1, shell=True)

print('\n')

cmd2 = obj['cmd2']['command']
types = obj['cmd2']['type']

print('実行モードは', types,'です。')
print(cmd2)
subprocess.run(cmd2, shell=True)
```

### 実行結果
```
実行モードは ls です。
ls -l
total 12
-rwxrwxrwx 1 guest guest 411 Nov  2 09:40 command.py
-rwxrwxrwx 1 guest guest 380 Nov  2 09:06 memo.md
-rwxrwxrwx 1 guest guest  92 Nov  2 09:27 sample.yml


実行モードは ls です。
ls -a
.  ..  command.py  memo.md  sample.yml
```
Dart SDKのインストール手順

# はじめに

Dart SDKのインストール方法についてまとめています。

## チャンネル

Dart SDKは`Stable`, `Beta`, `Dev`の3つのチャンネルを持ちます。

|チャンネル|用途|
|---|---|
|Stable|安定版。3ヶ月に一度のリリース|
|Beta|安定版リリース前のプレビュー版。1ヶ月に一度のリリース|
|Dev|リポジトリのmasterに割と近い内容が入った開発版。2週に1度のリリース|

## Linux (Ubuntu) 環境の場合

### 準備

```
$ sudo apt update
$ sudo apt install apt-transport-https
$ sudo sh -c 'wget -qO- https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -'
```

### sources.listの取得

```
# Stable版
$ sudo sh -c 'wget -qO- https://storage.googleapis.com/download.dartlang.org/linux/debian/dart_stable.list > /etc/apt/sources.list.d/dart_stable.list'

# 以下、Beta, Dev版を欲しければ追加
# Beta版
$ sudo sh -c 'wget -qO- https://storage.googleapis.com/download.dartlang.org/linux/debian/dart_testing.list > /etc/apt/sources.list.d/dart_testing.list'

# Dev版
$ sudo sh -c 'wget -qO- https://storage.googleapis.com/download.dartlang.org/linux/debian/dart_unstable.list > /etc/apt/sources.list.d/dart_unstable.list'
```

### インストール

```
$ sudo apt update
```

最新版をインストールする

```
$ sudo apt install dart
```

以下、チャンネルを指定してインストールする方法

```
# installs the latest dev dart
$ sudo apt install -t unstable install dart

# installs the latest beta dart
$ sudo apt -t testing install dart

# installs the latest stable dart
$ sudo apt -t stable install dart
```

バージョン指定してインストールする方法

```
$ sudo apt install dart=2.9.0-4.0.dev-1
```

### パス設定

パスを設定します（自身の環境に合わせて恒久的な方法で設定して下さい）

```
$ export PATH=$PATH:/usr/lib/dart/bin
```

## macOS 環境の場合

### インストール

```
$ brew tap dart-lang/dart

# Stable版
$ brew install dart

# Beta版
$ brew install dart-beta

# Dev版
$ brew install --head dart
```

### バージョン変更

```
$ brew switch dart 2.10.1
```

## 参考文献

 - https://dart.dev/get-dart
 - https://github.com/dart-lang/sdk/wiki/Installing-beta-and-dev-releases-with-brew,-choco,-and-apt-get
【Java】ファイルシステム操作

#ファイルシステム操作
* Filesクラス
    * getPathメソッドでPathオブジェクトを生成
    * FileSystems.getDefaultメソッドで現在のファイルシステム取得

```java
import java.io.IOException;
import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.nio.file.StandardCopyOption;

public class Main {
  public static void main(String[] args) {
    try {
      //現在のファイルシステム取得
      var fs = FileSystems.getDefault();
      var path1 = fs.getPath("./sample.txt");
      //ファイル存在確認
      System.out.println(Files.exists(path1));       //true
      //ファイル読み取り可能か
      System.out.println(Files.isReadable(path1));   //true
      //ファイル書き込み可能か
      System.out.println(Files.isWritable(path1));   //true
      //ファイル実行可能か
      System.out.println(Files.isExecutable(path1)); //true
      //ファイルサイズ
      System.out.println(Files.size(path1));
      //ファイルコピー
      var path2 = Files.copy(path1, fs.getPath("./copy.txt"),
        StandardCopyOption.REPLACE_EXISTING);
      //ファイル移動
      Files.move(path2, fs.getPath("./sub/copy.txt"),
        StandardCopyOption.REPLACE_EXISTING);
    　//ファイル名変更
      var path3 = Files.move(path1, fs.getPath("./sub/rename.txt"),
        StandardCopyOption.REPLACE_EXISTING);
      //ファイル削除
      Files.delete(path3);
      //ファイル存在する場合削除（例外発生なし）
      Files.deleteIfExists(path3);
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}
```

## フォルダ操作

```java
import java.io.IOException;
import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.nio.file.StandardCopyOption;

public class Main {
  public static void main(String[] args) {
    try {
      var fs = FileSystems.getDefault();
      var dir1 = fs.getPath("./playground");
      var dir2 = fs.getPath("./data");
      //フォルダ作成
      Files.createDirectories(dir1);
      //フォルダ存在？
      System.out.println(Files.exists(dir1)); //true
      //フォルダか？
      System.out.println(Files.isDirectory(dir1)); //true
      //dir2配下のサブファイル/フォルダstream取得
      var s = Files.list(dir2);
      //.logで終わるファイル名取得
      s.filter(v -> v.getFileName().toString().endsWith(".log")).
        forEach(System.out::println); //./data/test.log
      //フォルダコピー
      var dir3 = Files.copy(dir1, fs.getPath("./data"),
        StandardCopyOption.REPLACE_EXISTING);
      //フォルダ移動
      Files.move(dir3, fs.getPath("./data"),
          StandardCopyOption.REPLACE_EXISTING);
      //フォルダ削除
      Files.delete(fs.getPath("./data/sub"));
      //フォルダ存在するときのみ削除
      Files.deleteIfExists(fs.getPath("./data/sub"));
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}
```
[Kotlin]toastAさんが居座ってしまいtoastBくんが呼べない方に、toastAさんに速やかに退去してもらう方法

## 状況
kotlinのネイティブアプリ開発時に、エラーがあった場合にトーストを出すという処理を書いていたのですが、トーストが固まってしまい、次の画面に遷移してもトーストが消えないという現象に陥りました。

## 原因
前のトーストが完全に消えていない状態で次のトーストが呼ばれたことで、トースト詰まりが起こってしまったようです。


## 解決方法
こんな便利なものがありました。

```kotlin
toast.cancel() 
```

↑を追加したトーストの表示処理

```kotlin:MainActivity.kt

private var toast: Toast? = null

fun showToast() {
  toast?.cancel() // toastを表示する前に、既に表示されているtoastを消す

  val appContext = getContext()
  toast = Toast.makeText(
      appContext,
      R.string.toast_message,
      Toast.LENGTH_SHORT 
  )
  toast?.show()
}
```


## 参考
http://buchi.hatenablog.com/entry/2015/02/12/143242
バージョン指定してrails new したけど、なぜか最新版が入ってしまう〜

# はじめに
この記事の趣旨は、ローカル環境Rails6.0.3.3の状態でRails6.0.3.1のアプリをrails newする手順とその際に発生したエラー対応をご紹介します。

#環境
Rails 6.0.3.3


#手順
##1 インスール済みのrailsのバージョンを確認

```
% rails -v  
Rails 6.0.3.3
```

##2　使用できるバージョン一覧を確認

```
% gem list rails
** LOCAL GEMS ***

rails (6.0.3.4, 6.0.3.3, 6.0.3.2, 5.2.4.3)

```

##3 rails 6.0.3.1 をインストールする

```
gem i -v 6.0.3.1 rails

```
##4 再びバージョンを確認
```
% gem list rails                                                                                                                                                                               

*** LOCAL GEMS ***

rails (6.0.3.4, 6.0.3.3, 6.0.3.2, 6.0.3.1, 5.2.4.3)

```

##5 Gemfileを読み込まずに「rails new」する
```
rails _6.0.3.1_ new SampleApp -d mysql --skip-bundle

```
#### 説明
- `-d mysql` はDBをmysql に指定している.

- `_6.0.3.1_ `のところに指定したいバージョン名（数字）を記入。
- `new SampleApp`はアプリ名。
- `--skip-bundle` は Gemfileを読み込まないことを指定している。

##6 Gemfileを 編集
現時点ではローカルのrailsバージョン（今回であれば6.0.3.3)が指定されているので、Gemfileを編集し、指定したいバージョン（今回であれば6.0.3.1)に変更する。

```
変更前） gem 'rails', '~> 6.0.3.3'
変更後） gem 'rails', '= 6.0.3.1'
```
#### 説明
- `~> 6.0.3.3` はrails 6.0.x.x （6.0系）であれば使用可能という意味なので、この状態だと最新である`6.0.3.3.` がインストールされてしまう。

 
##7`bundle install` する

```
% bundle install
```
すると以下のようなエラーが発生する

```
The dependency tzinfo-data (>= 0) will be unused by any of the platforms Bundler is installing for. Bundler is installing for ruby but the dependency is only for x86-mingw32, x86-mswin32, x64-mingw32, java. To add those platforms to the bundle, run `bundle lock --add-platform x86-mingw32 x86-mswin32 x64-mingw32 java`.
Fetching gem metadata from https://rubygems.org/............
Fetching gem metadata from https://rubygems.org/.
Resolving dependencies...
Bundler could not find compatible versions for gem "activesupport":
  In snapshot (Gemfile.lock):
    activesupport (= 6.0.3.4)

  In Gemfile:
    web-console (>= 3.3.0) was resolved to 4.0.4, which depends on
      actionview (>= 6.0.0) was resolved to 6.0.3.4, which depends on
        activesupport (= 6.0.3.4)

    rails (= 6.0.3.1) was resolved to 6.0.3.1, which depends on
      activesupport (= 6.0.3.1)

Running `bundle update` will rebuild your snapshot from scratch, using only
the gems in your Gemfile, which may resolve the conflict.

```
簡単にいうと、「`rails 6.0.3.1`を指定したいのであれば、他のgemもバージョン合わせないと使えないよ！」とエラー出てます。

なので、エラー文指示通り、`bundle update`で他のgemのバージョンを変更します。

##8 `bundle update` する
```
% bundle update

```

##指定したバージョンのアプリが作成できてるか確認

```
% rails -v
Rails 6.0.3.1
```



####これにて終了です！

####参考
【Railsエラー】rails newでバージョン指定しても、それ以上のバージョンが入ってしまう場合の対処法
https://techtechmedia.com/rails-new-version-error/