OmniAICreator/Qiita-1.07M huggingface dataset:
昔ながらのインフラエンジニア勉強法

# はじめに

- インフラエンジニアの勉強に役立つサイトです。
 - 「基本無料」です。

# Linux

- [Linux標準教科書](https://linuc.org/textbooks/linux/)


# ネットワーク

- [3分間ネットワーキング](http://www5e.biglobe.ne.jp/aji/3min/)
- [ping-t ＜CCNA＞](https://ping-t.com/)


# セキュリティ(Webアプリ)

- [安全なウェブサイトの作り方](https://www.ipa.go.jp/security/vuln/websecurity.html)
- [セキュア･プログラミング講座](https://www.ipa.go.jp/files/000059838.pdf)
- [『セキュア・プログラミング講座（Webアプリケーション編）』ブートアップセミナー](https://www.ipa.go.jp/files/000030878.pdf)


# クラウド(AWS)

- [AWS サービス別資料](https://aws.amazon.com/jp/aws-jp-introduction/aws-jp-webinar-service-cut/)


# データベース

- [オープンソースデータベース標準教科書](https://oss-db.jp/ossdbtext)


# おわりに

- 長年の錆を落とすのに、この辺をベースに知識の棚卸をしなければ…。
- 最近のおすすめサイトとかコメにて教えてもらえると嬉しいです。
ansible the connection plugin 'heck' was not found が出てしまう

#事象
* Ansible実行時以下のエラーが出てしまう

```
TASK [Gathering Facts] ******************************************
task path: /var/tmp/ansible/setup.yml:4
fatal: [127.0.0.1]: FAILED! => {
    "msg": "the connection plugin 'heck' was not found"
}
```

#原因

ansible-playbook 実行時の引数で `--check` が `-check` になっている可能性あり:sweat_smile:


* 参考

https://tutel.me/c/programming/questions/44659551/ansibleplaybook+consistenly+fails+as+gathering+facts+phase
Valid  Parentheses_JS

20200401
leetcode練習
第一問：
テーマ：

```ruby:
Given a string containing just the characters '(', ')', '{', '}', '[' and ']', determine if the input string is valid.

An input string is valid if:

Open brackets must be closed by the same type of brackets.
Open brackets must be closed in the correct order.
Note that an empty string is also considered valid.

Example 1:

Input: "()"
Output: true
Example 2:

Input: "()[]{}"
Output: true
Example 3:

Input: "(]"
Output: false
Example 4:

Input: "([)]"
Output: false
Example 5:

Input: "{[]}"
Output: true
```
给定一个只包括 '('，')'，'{'，'}'，'['，']' 的字符串，判断字符串是否有效。

有效字符串需满足：

左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。

示例 1:

输入: "()"
输出: true
示例 2:

输入: "()[]{}"
输出: true
示例 3:

输入: "(]"
输出: false
示例 4:

输入: "([)]"
输出: false
示例 5:

输入: "{[]}"
输出: true

题目解析
这道题让我们验证输入的字符串是否为括号字符串，包括大括号，中括号和小括号。

这里我们使用栈。

遍历输入字符串
如果当前字符为左半边括号时，则将其压入栈中
如果遇到右半边括号时，分类讨论：
1）如栈不为空且为对应的左半边括号，则取出栈顶元素，继续循环
2）若此时栈为空，则直接返回false
3）若不为对应的左半边括号，反之返回false

答え：
Javascript Code:


    /**
    * @param {string} s
    * @return {boolean}
    */

    var isValid = function(s) {
    let valid = true;
    const stack = [];
    const mapper = {
        '{': "}",
        "[": "]",
        "(": ")"
    }

    for(let i in s) {
        const v = s[i];
        //如果遍历中的元素中包含下面三个左侧符号，放入栈中
        if (['(', '[', '{'].indexOf(v) > -1) {
            stack.push(v);
        } else {
            //取栈中最后一个元素
            const peak = stack.pop();
            //遍历元素与栈中最后一个元素进行配对，判断是否为对应的括号
            if (v !== mapper[peak]) {
                return false;
            }
        }
    }
    //如果配对正常stack会因为pop函数的存在而变为空，如果不为空，说明配对出现偏差，返回false
    if (stack.length > 0) return false;

    return valid;
    };
RosInstall: catkin_make -DPYTHON_EXECUTABLE=/usr/bin/python3が通らない人へ

## 症状
公式チュートリアルに沿ってROSをインストール後に`catkin_make`するとpython絡みで怒られる。

```
$ cd catkin_ws
$ catkin_make -DPYTHON_EXECUTABLE=/usr/bin/python3
...
-- Found PythonInterp: /usr/bin/python3 (found version "3.6.9") 
ImportError: "from catkin_pkg.package import parse_package" failed: No module named 'catkin_pkg'
Make sure that you have installed "catkin_pkg", it is up to date and on the PYTHONPATH.
...
```

## 原因
ROS「`/usr/bin/python3`見に行ってるけど`catkin_pkg`が無いやで」
とのことなので、とりあえず`/usr/bin/python3`を見に行く。

```
$ ls /usr/bin/ -l | grep python3
lrwxrwxrwx 1 root root   9  1月 31 05:02 python3 -> python3.6
```

どうもrosはシステムのpython3系を見に行っているけど、そのpython3.6にcatkin_pkgが入っていないのでエラー吐いてる。

## 対応

システムが使ってるpython3.6にros用のライブラリを入れるのが嫌なのでpyenvでros用のpythonを作ってあげることにする。

- pyenvでros用の環境作成・不足したライブラリを導入

```
$ pyenv install 3.7.6
Installed Python-3.7.6 to /home/xxx/.pyenv/versions/3.7.6

$ pyenv global 3.7.6
$ pip install catkin_pkg
```

- python3.7.6でcatkin_make

```
$ cd ~/catkin_ws
$ catkin_make -DPYTHON_EXECUTABLE=~/.pyenv/versions/3.7.6/bin/python3.7
```

- 今後手軽に`cm`と打つだけでros用のpython環境でbuildできるようにしておく

```
$ echo "alias cm='cd ~/catkin_ws && catkin_make -DPYTHON_EXECUTABLE=~/.pyenv/versions/3.7.6/bin/python3.7'" >> ~/.bashrc
```
GitHubこれだけは覚えておけばOK！初級編

GitHub初心者がこれだけ覚えておけば
バージョン管理ができる手順をシンプルにまとめました。
あくまで最低限の手順です。

# Gitとは
ファイルのバージョン管理システムのことです。
![Git_image.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393193/8c7c750a-08dc-59fb-8001-7e5e4039a7bb.jpeg)


# 1.GitHubの公式サイトからアカウント作成する
https://github.com/

登録メールアドレスにきたメールで認証する

これで登録完了


# 2.GitHubでリポジトリを作成する
まずはリポジトリを作成します。

GitHubにログインした状態で、「New Repository」ボタンを押下します。」ボタンを押下します。

・Repository name
　リポジトリ名を決める　

・Description
　リポジトリの説明を記載（なくてもOK）

・Public or Privateを選択
　Public - 公開リポジトリ
　Private - 非公開リポジトリ

・Initialize this repository with a README
　はじめにREADMEを追加するかどうか決める
　チェック入れるとREADMEが追加された状態になります。
　チェックしなければコマンドのチュートリアルを表示してくれるので
　個人的にはチェックなしがオススメです。

リピジトリURLを控えておく


# 3.公開したいリポジトリに移動/Gitリポジトリ作成

以下ファイルを作成

```html:html-sample/index.html
<!DOCTYPE html>
<html lang="ja">
    <head>
        <meta charset="UTF-8">
        <title>Hello world!</title>
    </head>
    <body>
        Hello world!
    </body>
</html>
```

```console
$ mkdir html-sample
$ cd html-sample
$ git init
```
git initはローカルにGitリポジトリを新たに作成するコマンド
※隠しファイル「.git」が生成される


# 4.作成したファイルをローカルリポジトリに追加する/変更結果をリポジトリにコミットする

```console
$ git add index.html

# もしくはファイルを一括でアップする場合
$ git add .

# 変更結果をローカルリポジトリにコミットする
# "first commit" は分かりやすいように明記
$ git commit -m "first commit" 
```


# 5.リモートリポジトリ情報追加

リモートリポジトリに情報を反映する前にリモートリポジトリ情報を追加する
GitHubに下記コマンドが出てきているかと思うのでそれをコピー

```console
$ git remote add origin https://github.com/d-mori-src/html-sample.git
```

# 6.ローカルリポジトリからリモートリポジトリに反映（push）

```console
$ git push origin main
```

こちらを入力するとGitHubのメールアドレスとパスワードを求められるので
入力すると、GitHubにアップ可能


# 7.ブランチの作成/移動

ブランチとは枝という意味で、「ブランチを切る」とGit界隈では表現されます。
ファイル履歴の流れを枝分かれさせて管理していくものです。

```console
# 今いるブランチを見る
$ git branch

# ブランチ新規作成/移動
$ git branch develop
$ git checkout develop

```

# 8.subブランチで修正作業

```html:html-sample/index.html
<!DOCTYPE html>
<html lang="ja">
    <head>
        <meta charset="UTF-8">
        <title>Hello</title>
    </head>
    <body>
        Hello world!
        修正しました。
    </body>
</html>
```

```console
# インデックスに変更点を登録
$ git add index.html
#  全ファイルを指定する際
$ git add .

# ファイルをローカルリポジトリに登録
$ git commit -m "変更しました"

# GitHubにローカルリポシトリのデータを送信
$ git push origin develop
```

# 9.本筋masterにmarge

margeとは統合するという意味

```console
# masterに移動
$ git checkout master

# masterにsubブランチを統合する
$ git merge develop

# 統合情報をGitHubに送信（プッシュ）する
$ git push origin main
```

# 10.ブランチ削除
```
# git branch -d <branch>
# git push origin --delete <branch>
```

以上で変更することが可能

# まとめ
この記事のコマンドは初心者に向けた最低限の手順・コマンドになります。
もっと深くしたい方はいろいろググって調べてみてください。


スタッシュについて
https://qiita.com/chihiro/items/f373873d5c2dfbd03250
Bulk synchronous parallel (バルク同期並列処理)に入門する

# 0. 概要
大規模計算を行うにあたって並列計算処理が必要となる。一般的に並列計算を語る上で「メモリ」及び「プロセッサ」をどのように配置するかが重要となる。よく見るアーキテクチャ形式としては、Parallel Random Access Machine(PRAM)と呼ばれる共有メモリを1つ置いて、複数のプロセッサが演算結果をそこで共有し合うような形式が多い。PRAMは理想的なアーキテクチャであるものの、その実現は難しく多くの場合はBulk synchronous parallel(BSP)形式による実現となる。今回はこのBSPに入門していきたい。BSPは際立って新しい理論でなく、歴史古く1980年代にハーバード大学のLeslie Valiantによって開発された。

かなり有名なモデルではあるものの日本語の解説記事が少ない・・・。
何か他の呼ばれ方があるのだろうか。


# 1. BSPモデル
BSPモデルのアーキテクチャについて説明する。


必要な用語としては以下である:

 - メモリ: 演算結果の保存
 - PU(Process Unit): 演算
 - SuperStep: 1つあたりの演算

## PRAM
BSPを理解する上でPRAMの説明は必要ないが、比較しておくと違いが分かりやすいと思うので説明したい。


PRAMは以下のように複数のプロセッサが演算を行うための入力値や一時変数、演算結果等を全て共有メモリに保存する形式である。
基本的には演算順序がおかしくならないよう1命令毎に同期が取られているものだとする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95636/ce392a8b-5312-126f-17ac-e932d98c8664.png)

複数のプロセッサで同じ資源を使う場合があるので、デッドロック等の発生には気を付ける必要がある。

## BSP
PRAMと比較してBSPは以下のようにメモリとプロセッサが完全に別れており、
デッドロック等の発生が起こらない設計になっている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95636/acc3e1ac-5b27-4618-0681-2d1ac91fe3cc.png)

Local computeの領域は完全に独立して動作する。
ここで所定の演算を行えるようにメモリ上に情報を展開しておく必要がある。

### データ共有
しかし、並列計算なのに独立していては入力値、一時変数、演算結果の共有が出来ない。
そこで各PUは演算が終了次第他のプロセスに必要なデータを共有する。よって、以下のような形式となる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95636/93339441-5f23-5d3d-45ae-6d364b02bf65.png)
よくネットワーク層がメモリ側についている場合があるが、あるPUがどこのPUにデータを送るか等のインテリジェントな判断をメモリ側がするとは思えないのでこのような構成としている。意味合い的には同じである。

### バリア同期
次にデータ共有において、共有のタイミングを同期する必要がある。これをBSPではバリア同期という。
換言すると、各PUの演算時間である`Local compute`は各PUによって時間が異なるため、
そのギャップを埋める必要がある。

以下のようにPU処理の後に全PUの処理時間が同じになるようにバリア同期を入れる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95636/0eac7f59-09a5-f4e1-8ed1-df044721529a.png)

他の表現では、各PUの演算処理が終わった直後に通信を行い、
次の演算が開始するまでの時間をそろえるためにバリア同期を入れている。
![400px-Bsp.wiki.fig1.svg (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95636/6b99456d-4e1c-9213-9fe3-7c0a58d4cdc2.png)

因みに、次の演算が開始するまでの時間をSuper stepという。
![ダウンロード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95636/4a2e013c-b7f4-8b33-da24-4fcf30d41c17.png)


# 2. 例題: BSPモデルを適用したPrefix Sum
Cudaの並列処理の資料などを見ているとPrefix sumが並列処理でいうところのHello worldのようである。
Prefix sumとは`[3, -1, 4, 1, 5, 9, 2, 6, 5]`のような数列が与えられた時に前から順に足し算していくことである。
これに`PU=3`のBSPモデルを適用すると以下のような演算となる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95636/ea69f469-7ca8-ae55-8893-ff8d8ca8b905.png)

引用: BSP(Bulk synchronous parallel)モデル再訪
【iOS】Dropbox iOS13対応

#はじめに
 ・iOS13用にDropboxを対応したところ、ハマったので備忘録として記載。


#環境
xcode11.0
swift 5.0.1
iOS13

#これまで
・チュートリアル通りに進むと

```swift:AppDelegate.swift
  func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
      if let authResult = DropboxClientsManager.handleRedirectURL(url) {
          switch authResult {
          case .success:
              print("Success! User is logged into Dropbox.")
          case .cancel:
              print("Authorization flow was manually canceled by user!")
          case .error(_, let description):
              print("Error: \(description)")
          }
      }
      return true
  }
```

と記載していた。
iOS13ではSceneDelegate.swiftに移譲された為、変更が必要になる。

#これから
・SceneDelegate.swiftへ以下を記載。

```swift:SceneDelegate.swift

    func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>)
    {

      // コールバックで来たURLの取得
      guard let url = URLContexts.first?.url else {
          return
      }

      if let authResult = DropboxClientsManager.handleRedirectURL(url) {
          switch authResult {
          case .success:
              print("Success! User is logged into Dropbox.")
          case .cancel:
              print("Authorization flow was manually canceled by user!")
          case .error(_, let description):
              print("Error: \(description)")
          }
      }
      return
  }
```

#まとめ
・iOS13とそれ以前のiOSを対応させるように作成した為、AppDelegateが原因であることに気づくのに時間がかかった。
大型アップデート後の情報収集は怠ってはならない教訓になりました。
検索ワードに/が入った時の404対応

検索機能を実装した時に、検索ワード「**/**」が入っていると、ページが４０４になってしまった...
解消方法のメモ。


## エラー内容🙃
<img width="852" alt="404_Not_Found.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168550/86f8a427-022b-6192-2f0a-2591cbe176fa.png">


## 原因⚡️
原因はApacheのデフォルト設定で、URLに「/」(%2F)が含まれると404 (Not found) エラー で拒否されてしまうため。

> AllowEncodedSlashes ディレクティブは符号化された パス分離文字 (/ は %2F、さらにシステムによっては \ に対応する %5C) が存在する URL の使用を 許可するかどうかを決定します。通常はそのような URL は 404 (Not found) エラー で拒否されます。
[Apacheリファレンス](http://httpd.apache.org/docs/2.2/ja/mod/core.html#allowencodedslashes)

## 解消方法🚀
VirtualHostに以下の設定をする


```:etc/apache2/sites-enabled/default-ssl.conf
AllowEncodedSlashes On
```


conf修正したら
`sudo service apache2 graceful`
も忘れずに！⚠️
Ubuntuでrmすると、"Text file busy"で削除ができない、トラブルシューティング

# 環境
Vagrant + Ubuntu 16.04.5 LTS

# はじめに
ディレクトリを削除しようとしたら、ファイルが掴まれていて、削除ができないようです。このようなケースのトラブルシューティング。

```cmd
$ rm -rf test02
rm: cannot remove 'test02/db/development.sqlite3': Text file busy
```

# 対応方法
削除したいファイルのプロセス番号を調べます。**fuser**コマンドは、指定したファイルが使用しているプロセス番号を調べるコマンドです。

```cmd
$fuser ./test02/db/development.sqlite3
/vagrant/test02/db/development.sqlite3:  5356
```

プロセス番号：5356が、該当のファイルで本当に使われている事を確認します。**psコマンド**は、現在動いている全てのプログラムのプロセス番号を一覧表示するコマンドです。

```cmd
$ps -f | grep 5356
vagrant   5356  2005  0 13:23 pts/0    00:00:00 sqlite3 ./db/development.sqlite3
```

稼働中のプロセスを強了させます。-9は、シグナルIDといって、これをつけると、強制終了という意味になります。くれぐれも、終了させるプロセス番号は間違わないように。

```cmd
$kill -9 5356
```

これで、削除できるようになりました。

```cmd
$rm -rf test02
```

# 参考URL
http://www.bigdatalyn.com/2018/03/10/RM_Error/
【WAMP】WindowsとApacheとMysqlとPhpと

# 概要
仕事のために試したことをまとめたものです。
Apacheがwin64、PHPがwin32だとうまくいかなかったのでMySQLも統一の必要があるかもしれません。

# バージョン
- Apache：httpd-2.4.41-win32-VS16.zip
- MySQL：mysql-8.0.19-winx64.zip
- PHP：php-5.4.45-Win32-VC9-x86.zip

# インストール
各アプリケーションのインストールから実行までの手順を記載

## Apache
1. ファイルをダウンロードし展開(C:\Apache24)
2. httpd.confに以下を追記
    3. http\://localhost/でアクセス可能に：`ServerName localhost:80`
    4. PHPのディレクトリを指定：`PHPIniDir "c:/php"`
    6. .phpファイルをPHPとして実行可能に：`AddType application/x-httpd-php .php`
    5. apache2.4用PHP5モジュールをロード：`LoadModule php5_module "c:/php/php5apache2_4.dll"`
    5. URL書き換えのためにmod_rewriteをロード：`LoadModule rewrite_module modules/mod_rewrite.so`
    4. .htaccessでの設定を可能に：\<Directory />配下に`AllowOverride All`
5. htdocsに.htaccessを作成し以下を記述
    6. URLの書き換えを有効にする：`RewriteEngine on`
    7. 書き換え後のパスのベースURLを指定：`RewriteBase /`
    8. 書き換えの条件を指定
        9. ファイルではない時：`RewriteCond %{REQUEST_FILENAME} !-f`
        1. ディレクトリではない時：`RewriteCond %{REQUEST_FILENAME} !-d`
    2. 書き換えのルールを指定(条件に一致する全てのパスをクエリをマージしてindex.phpにforward)：`RewriteRule ^ index.php [QSA,L]`
3. コマンドプロンプトを管理者として実行
4. apacheを起動：`httpd -k start`

## MySQL
[MySQLインストール参考サイト(Qiita記事)](https://qiita.com/KOJI-YAMAMOTO/items/02af20e7b5cd27932a27)

1. 上記サイト手順6まで実行
2. PATHを通す([展開先]\bin)
3. MySQL初期化：`mysqld --initialize-insecure --user=mysql`
4. .batファイルを作成し次の内容で保存：`mysqld --defaults-file="[展開先]\my.ini" --console`
5. 接続：`mysql -u root --skip-password`
6. rootユーザにパスワード設定：`ALTER USER 'root'@'localhost' IDENTIFIED BY 'password';`

## PHP
1. ファイルをダウンロードし展開(C:\php)
2. php.ini-productionをコピペしphp.iniを作成
Create React AppでTypeScriptとScssを使う

> [Create React App](https://github.com/facebook/create-react-app) は React を学習するのに快適な環境であり、React で新しいシングルページアプリケーションを作成するのに最も良い方法です。(-- [新しい React アプリを作る](https://ja.reactjs.org/docs/create-a-new-react-app.html#create-react-app))

Create React App を用いて [React](https://ja.reactjs.org/) で [SPA ( *single-page application* )](https://ja.wikipedia.org/wiki/%E3%82%B7%E3%83%B3%E3%82%B0%E3%83%AB%E3%83%9A%E3%83%BC%E3%82%B8%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3) を作成する際に、[TypeScript](https://github.com/microsoft/TypeScript) と [Scss](https://github.com/sass/sass) を導入するためのメモです。

## Create React App のプロジェクトをインストール

```
npx create-react-app my-app --template typescript
# or
yarn create react-app my-app --template typescript
```
`--template typescript`をつけるだけ


## `node-sass`をインストール

```
npm install node-sass --save
# or
yarn add node-sass
```

あとは`src/App.css`を`src/App.scss`に書き換えて、`src/App.js`で`src/App.scss`を読み込むように書き換えるだけ

以上でCreate React AppでTypeScriptとScssを書ける。

## 参考
- [新しい React アプリを作る](https://ja.reactjs.org/docs/create-a-new-react-app.html#create-react-app)
- [Adding TypeScript](https://create-react-app.dev/docs/adding-typescript/)
- [Adding a Sass Stylesheet](https://create-react-app.dev/docs/adding-a-sass-stylesheet/)
Next.js + Firebase Hosting + SSR 環境でBasic認証をかける

# 概要

Next.js + Firebase Hosting + SSR 環境でBasic認証をかけようという記事。

`Next` が持っているメソッドだけでは対応できなかったので、`Express` も使用します。

また、Next.js + Firebase Hosting + SSR 環境については、
[with-firebase-hosting-and-typescript](https://github.com/zeit/next.js/tree/canary/examples/with-firebase-hosting-and-typescript) こちらのテンプレートを利用します。

`Firebase` を利用する関係上 `node.js` のバージョンは10系を使用します。
`firebase-tools`は最新を使用しましょう。

# 手順

## Next.js + Firebase Hosting + SSR 環境のセットアップ
[README.md](https://github.com/zeit/next.js/blob/canary/examples/with-firebase-hosting-and-typescript/README.md) を参考にセットアップしてみてください。

```zsh
yarn create next-app --example with-firebase-hosting-and-typescript with-firebase-hosting-and-typescript-app
```

## モジュールのインストール

- express
- @types/express
- next-routes
- basic-auth-connect

```
yarn add express next-routes basic-auth-connect
```

```
yarn add -D @types/express
```

## 実装

`Express` 側でベーシック認証を通して、 `Next` のアプリに流します。

```typescript:src/functions/index.ts
import * as functions from 'firebase-functions';
import next from 'next';
import express from 'express';

/* eslint-disable @typescript-eslint/no-var-requires */
const routes = require('next-routes');
const basicAuth = require('basic-auth-connect');

const USERNAME = 'user';
const PASSWORD = 'password';

const server = express();

const app = next({ dev: false, conf: { distDir: 'next' } });
const handler = routes().getRequestHandler(app);
server.use(basicAuth(USERNAME, PASSWORD));
server.get('*', (req, res) => handler(req, res));

export const nextApp = functions.https.onRequest(server);
```

## Firebase Project の設定

`<project-name-here>` こちらを自身のプロジェクト名に変更します。

```.firebaserc
{
  "projects": {
    "default": "<project-name-here>"
  }
}
```

# 実行

## localで実行
`firebase-emulators` を使ってローカルでもBasic認証の確認ができます。

### Build

```yarn preserve```


### Run

```firebase emulators:start```

## デプロイ

```firebase deploy```

以上 ☺️
mac( Catalina )で解凍できないzip ファイルを解凍する。


macでアセットデザイン（レンタルオフィス）からのメールに添付されているzipファイルを見ようとすると
`??????????.zipを"Downloads"に展開できません。`
とダイアログが出た。

#`unar`コマンドで解凍することにする。

brewでインストールする。

```sh
brew install unar
```
インストールが終わったらzipファイルを適当な場所に保存して

```sh
unar ??????????.zip 
```

以上
[C#] UnixTime (int)を取得する

現在のUnixTimeをintで取得する

```csharp

public static int GetCurrentUnixTime()
{
   var unixTimestamp = (int)(DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1))).TotalSeconds;
   return unixTimestamp;
}
```

指定した時間のUnixTimeをintで取得する

```csharp

public static int GetUnixTime(DateTime timeStamp)
{
　　var unixTimestamp = (int)(timeStamp.Subtract(new DateTime(1970, 1, 1))).TotalSeconds;
　　return unixTimestamp;
}
```

UnixTime から Datetimeを取得

```csharp

public static DateTime GetDateTimeFromUnixTime(int unixTimeStamp)
{
   DateTime dtDateTime = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);
   dtDateTime = dtDateTime.AddSeconds(unixTimeStamp).ToLocalTime();
            return dtDateTime;
}
```
Apacheのメンテンナンスを実施する

# Apacheのメモリ消費を抑える

運用しているサービスでapache（httpd）がメモリを大量に消費するのでメモリ量を調整して抑える設定を実施する。

前段として
Apacheについて、サービスを起動すると、プロセス(httpd)が複数個、生成されます。
それぞれのプロセスはクライアントからのリクエスト(http/https)を受け、処理をした上でレスポンスを返します。
リクエストを受けてレスポンスを返すという作業を同時に複数行う。

複数のリクエストを処理するのにマルチプロセッシングモジュール (MPM) というものを使用する。
マルチプロセッシングモジュール (MPM) はprefork, worker, eventがある。
デフォルトでは「prefork」の設定にとなっております。

## 「prefork」について
1つのプロセスは1つのスレッドを持ちます。
スレッドはCPUに命令を渡す単位となりますからリクエストに対して起動しているプロセス数が少ない状態は処理が遅くなります。
逆にプロセスを多く生成すぎるとメモリを消費するためをサーバーは圧迫します。
複数、同時のリクエストに応じて、Apacheはプロセスを増減させている。
memo:プロセスはメモリを使用します。スレッドはCPUを使用します。

増減の際のfork処理は重いため、発生を抑えるよう設定する必要がある。
事前にforkしておくということから「prefork」という名称である。
「prefork」のようなプロセスを「シングルスレッドプロセス」と言います。
memo:「fork」コマンドはプロセスから別のプロセスを呼び出すコマンドであり、Linuxのシステムコールの一種です。

子プロセス(fork)一つ一つが通信を受け持つ
あるプロセスは他のプロセスからの影響を受けないため、安定したリスポンスを返すことができる。

## 方針として
1. 同時に処理する件数を考慮して起動する最大プロセス数を検討する。
2. メモリー数値を意識して最小プロセス数を検討する。  
2-2. アプリケーションで使用するメモリーも意識する必要がある。

最大プロセス数はサーバーの使用可能なメモリー量よりプロセスが使用するメモリ数より算出する。

---
上記の内容より以下を設定する。
1. 高負荷状態を推測して最大アイドルプロセス数を設定する=MaxSpareServers
2. 低負荷状態でもパフォーマンスを考慮して最小アイドルプロセスを設定する=MinSpareServers

応答できる同時複数クライアント最大値の「MaxClients」の設定も忘れずに行う。
シングルスレッドプロセスのため、MaxClients=MaxSpareServersとなる。

参考サイト: https://qiita.com/nownabe/items/1111cc32da9fe63289f0
参考サイト: https://qiita.com/takahashi-kazuki/items/2352aec16d6a1dc40582
AWS公式さんがDocker Hubで aws-cli のイメージを公開してくれた！

AWS公式さんがDocker Hubでイメージを公開してくれました。 (2020/03/31)
待ってました :tada: :tada: :tada: 

AWS CLI v2 Docker image | AWS Developer Blog
https://aws.amazon.com/jp/blogs/developer/aws-cli-v2-docker-image/

>(Google翻訳) AWS CLI v2の2.0.6のリリースにより、AWS CLI v2がDockerイメージとして利用できるようになったことをお知らせします。
>
>これにより、ユーザーはAWS CLI v2のインストールを自分で管理する必要なく、コンテナベースの環境でAWS CLI v2を使用できます。このDockerイメージを利用するにはさまざまな方法がありますが、特にCI / CD設定では、ローカルマシンのDockerコンテナでAWS CLI v2を実行する方法について説明します。

amazon/aws-cli - Docker Hub
https://hub.docker.com/r/amazon/aws-cli

使い方も、かなーり詳しくしてくれているので詳細はDocker Hubをご確認ください。

前に`aws-cli` を実行するためにDockerイメージを作成して利用していた ( [DockerコンテナからAWSコマンドを簡単に実行できるコマンドをつくってみた \- Qiita](https://qiita.com/kai_kou/items/99d9f9372eed970eab3b) ) のですが、その手間が省けます。はかどります。
バージョンは`2.0.6` となっており (2020/04/01 時点)、今後のバージョンアップにも対応してくれることでしょう (期待)



## つかってみる

使い方は簡単です。

エイリアス設定して利用する設定があったので、それを利用してみます。

認証や設定情報を含むディレクトリを`-v ~/.aws:/root/.aws` でマウント、コマンド実行するカレントディレクトリを`-v $(pwd):/aws` でDockerコンテナ内の`/aws` にマウントすることでファイルの読み書きもホストで`aws` コマンドを実行するときと同じ挙動になります。


```console
# 確認用としてエイリアスを aws ではなく、 aws-test としています
> alias aws-test='docker run --rm -ti -v ~/.aws:/root/.aws -v $(pwd):/aws amazon/aws-cli'

# Fishの場合
> alias aws-test='docker run --rm -ti -v ~/.aws:/root/.aws -v $PWD:/aws amazon/aws-cli'

> aws-test --version
aws-cli/2.0.6 Python/3.7.3 Linux/4.19.76-linuxkit botocore/2.0.0dev10

# カレントディレクトリで読み書きできる
> aws-test s3 cp ./hoge.txt s3://<任意のバケット>/

# カレントディレクトリ外はだめ
> aws-test s3 cp ../hoge.txt s3://<任意のバケット>/
```

これでもうイメージをビルドしなくてもいいんやなって。


## 参考

amazon/aws-cli - Docker Hub
https://hub.docker.com/r/amazon/aws-cli

DockerコンテナからAWSコマンドを簡単に実行できるコマンドをつくってみた - Qiita
https://qiita.com/kai_kou/items/99d9f9372eed970eab3b
深層学習／GAN (Generative Adversarial Network)

#1.はじめに
　今回は、GANについて簡単にまとめます。

#2.GANについて
![スクリーンショット-2018-01-25-18.49.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209705/6945c2e8-5317-b904-cb58-773b998d47a9.png)
　GANは、生成器(Generator)及び識別器(Discriminator)という2つの競合するモデルからなります。Generatorはノイズzを入力とし、新しいデータG(z)を生成・出力します。Discriminatorは与えられたデータが学習データか、Generatorが生成したものかを識別します。

　両方のモデルを交互に学習させることで、Generatorは限りなく学習データに近い分布のデータを生成し、Discriminatorはその様なデータに対しての識別制度を高めようとするわけです。この様なネットワークは、生成ネットワークが敵対者との競争下におかれるゲーム理論的状況に基づいています。

　学習が進み、Generator および Discriminator それぞれが理想的な性能を有するようになった場合、Generator の生成する データ分布𝑝𝑔と訓練データの分布𝑝𝑑𝑎𝑡𝑎が一致するため、**𝐷(𝒙)=0.5**となります。

#3.GANのロス関数
![スクリーンショット 2020-04-01 13.02.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209705/6478ece1-3f80-a6f5-c5ec-8aeb95add05d.png)
　GANのロス関数は、上記の様です。GANの学習に置いて、Discriminatorは学習データx,　生成データG(z)それぞれに対して学習データ及び生成データであると正しく判定する確率を最大化しようとします。Generatorは、Discriminatorが生成データを学習データと誤判定する確率を最大化（生成データを偽物と判定する確率を最小化）しようとします。

#4.DCGANの特徴
　GAN（Deep Convolutional Generative Adversarial Network)のポイントを簡単にまとめておきます。　
1)**Batch Normalization** を使う
2)Discriminator では pooling ではなく **stride=2の畳み込み**を使う
3)Generator　では **deconvolution** を使う
4)FC層を無くして **Global Average Pooling**を使う
５)Discriminator では **Leaky ReLU (α=0.2)**を使う
6)Generator では基本的 にReLU を使い、出力層のみ **Tanh** を使う
ActiveModelSerializer + #Rails の Controller render で json /. json_api の adapter を無効化してデフォルト設定を使う ( disable json adapter and reset to default )

- デフォルトのアダプタはattributes のようだ。これを指定すれば良い。
- config でデフォルトが指定されており、一箇所の controller でだけ adapter を変えて戻したい場合などに

```rb
render json: some_instance, adapter: :attributes
```


# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/3058








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
[ssh] vs codeのRemote Developmentでpass phraseをスキップ

##環境
macOS Sierra

## 実現したいこと
ssh接続するたびにpass phrase聞かれるのやめたい。
ssh-addの場合、コマンドからssh接続するならその方法で省略できたが、
Remote Developmentからでは当然意味なかった。
vs codeというワードと共に一緒にググってもなかなか出てこなかった。

## 流れ
1.公開鍵と秘密鍵をそれぞれ生成する。
2.configファイルには、HostNameにはホスト名入れたりIdentityFileには秘密鍵のパスを指定すればとりあえずssh接続できる状態にはなる。が、このままだと秘密鍵にpass phraseが設定されている場合、毎回入力しなきゃいけない。非常に面倒。セキュリティ的に正しくても正直面倒。
3. configファイルに、「AddKeysToAgent yes」を追記。


これで、うまく行った。

## 感想
コーディングしていて楽しいのはAtomだが、便利さで選ばれたのはvs codeでした。
macOSならもうpass phraseを入力することは無くなったけどwindowsだけ何故か効果ない感じ？？
VSCodeで`Ctrl + P`を使うとサイドバーが機能しなくなる

VSCodeで `Ctrl + P` でファイルを開いた後、サイドバーと連携しなくなる問題

再起動すれば一時的に直りますが、流石に頻発するのでググったらバグ報告されてました

- issue
    - https://github.com/microsoft/vscode/issues/69073
    - https://github.com/microsoft/vscode/issues/68627

**Refreshボタン押すだけで解決**
.gpxファイルを自動でStravaにアップロードする方法

## 1. 自分の使用しているGoogle Chromeのバージョンを調べる
![chrome](https://www.iijmio.jp/thissite/version/ver_chrome_1_mac.gif)
画像はhttps://www.iijmio.jp/thissite/version より

## 2. Google Chromeに合った、"chromedriver"というソフトウェアをダウンロードする

- [ここ](https://chromedriver.chromium.org/downloads)からダウンロードしてください。

  ![chromedriver](https://www.inet-solutions.jp/wp-content/uploads/2017/11/webdriver2.png)

- ダウンロードしたものは、.zip形式になっているので、展開したものの実行形式のものを自分のディレクトリに入れてください。

## 3. ターミナルを開いて、以下をターミナルで実行
```
pip install beautifulsoup4 selenium requests
```

## 4. 以下のソースコードの"メールアドレス"と"パスワード"を自分のstravaアカウントに合わせて書き換える
```python:gpx.py
import os
import re
import sys
import time
from bs4 import BeautifulSoup
import requests
from glob import glob
from selenium import webdriver
from selenium.webdriver.chrome.options import Options



options = Options()
options.binary_location = '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome'
driver = webdriver.Chrome(os.path.join(os.getcwd(), "chromedriver"))

def get_gpx_names():
    return glob('*.gpx')
    

def upload_gpx_to_strava(gpx_names):
    
    for i, gpx_name in enumerate(gpx_names):
        driver.get('https://labs.strava.com/gpx-to-route/#12/-122.44503/37.73651')

        driver.find_element_by_id("gpxFile").send_keys(os.path.join(os.getcwd(), gpx_name))

        time.sleep(15)

        if i == 0:
            driver.find_element_by_id("oauthButton").click()

            driver.switch_to.window(driver.window_handles[-1])

            driver.find_element_by_id("email").send_keys("メールアドレス")

            driver.find_element_by_id("password").send_keys("パスワード")

            login_button = driver.find_element_by_id("login-button")
            driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
            login_button.click()

            time.sleep(5)

            driver.switch_to.window(driver.window_handles[-1])

        driver.find_element_by_id("saveButton").click()
        time.sleep(5)

        driver.find_element_by_class_name("save-route").click()

        driver.find_element_by_id("name").send_keys("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b"+os.path.splitext(os.path.basename(gpx_name))[0])

        driver.find_element_by_class_name("reverse").click()

        time.sleep(5)
        
if __name__ == "__main__":
    gpx_names = get_gpx_names()
    upload_gpx_to_strava(gpx_names)
```

## 5. gpx.pyと同じディレクトリにアップロードしたい.gpxファイルを置く

## 6. 以下を実行
```python gpx.py```
全体報告

##はじめに##

本記事は、2020年4月の基本情報技術者試験を合格するための計画及び結果を記載する記事です。
週次と月次で計画を立て、更新していくので同様に基本情報の取得を目指している人にとっても参考になるといいなと思います。
目標と結果

午前と午後試験が合格できていないため、2020年4月の基本情報技術者試験に合格すること。
##2019年12月結果##

合格できませんでした。
##2020年1月結果##

合格できませんでした。
##2020年4月結果##

コロナウイルスの為、試験が中止になりました。
##計画概要##

##10月~11月##
・Quiitaをマスターする。
・参考書の章を完全に理解すること。
・6項目の演習をクリアすること。
・２３項目での演習をクリアする。
・個人のテストをまだ受けていないためテストを受ける。
・学習時間の記録としっかりとした計画を立てる。
・フェーズ２３の完全理解。
##12月##
・午前免除試験に合格すること
（仮に合格できなかった場合）
独習ゼミの通常テストの成績を見てどの部分が弱いか分析し、正解率を高めます。
##1月##
・体調管理をしっかりとすること。
・午前免除試験に合格すること。
・過去問道場をやりこむこと。
##2月##
•午前試験でのマネジメント系、ストラテジ系の分野の2項目の理解度を深め、改めて問題を回答し、間違えた所の理解度を深めていく。
•独習ゼミのテストを活用しつつ、ポイントを押さえていくこと。
•勉強時間最低でも週の内10時間は確保すること。常に空いている時間、隙間時間で独習ゼミ又は過去問道場をやりこむこと。無駄な１日を過ごさないようにする。
##3月##
•春試験に合格すること。
•アルゴリズムに関しての理解度を深める。
•過去問道場を活用すること。
•参考資料に目を通す。特に表計算とアルゴリズムを集中的に。

##月次報告##

[10月](https://qiita.com/Comitakato0515/private/244c4098354034722709)
[11月](https://qiita.com/Comitakato0515/private/ff76ed1745c8313b6b47)
[12月](https://qiita.com/Comitakato0515/private/9b73a585ac4fd286b3c8)
[1月](https://qiita.com/Comitakato0515/private/4ae8c631dcd3a42aa826)
[2月](https://qiita.com/Comitakato0515/items/6de073f17bd49e45cd51)
[3月](https://qiita.com/Comitakato0515/items/ec0027d820d755a0fff9)

##今回の研修を通しての感想##

　基本情報技術者試験を合格する為の苦難をこの身で体感することが本当に貴重な経験になっています。エンジニアになると言うことは、口で言うのは本当に簡単です。今回の研修を通して自己採点すると100点満点中20点だと思います。理由としては、午前試験に合格できていないこと。エンジニアになりたいと言う意志の弱さがあります。そして何よりも努力が自分に足りないと思いました。4月の春の試験がコロナのため中止になりました。30日の研修ではアルゴリズムの問題をやりましたが、解けていない自分がいます。反省点としては、時間の使い方、いかにして自分が勉強時間として使うことができなかったのか。そして、アルゴリズムです。アルゴリズムの問題自体自分の思考力この問題が何をしたいのかと言う読解力も必要になります。この3つを今後も身につけていきたいと思います。
　エンジニアには高い知能と技術が必要です。自分は勉強を1からしたもののアルゴリズム、表計算などと言った問題の壁にぶち当たりました。まだまだ未熟者なのですが、自分の精一杯の力を振り絞って自身のステップアップそして、今後の将来に繋がるようコツコツと頑張っていきたいと考えております。
　Qiitaでの報連相では、はじめの10月から11月にかけて期限までに守れなかった自分がいます。しかしながら、報告するたびに谷さんから直接アドバイスをもらうことができ改めて自身の勉強法を見直すことができました。今後の対策を立てたいと思います。
　御社で働く準備は正直未だ不安な部分があります。3月まで大学生であった自分が急に社会人になると言うことに未だ信じられない部分があります。しかしながら、自分がお世話になった方々などに対し、自身の成長姿を見てもらいたいので、御社で同期と共に賢明に働き、お世話になった方々に恩返しをしたいと思います。
初めてのVue.js備忘録 vol.01

##はじめに
今回は、エンジニアになって約半年の私がjavascriptのフレームワークであるVue.jsを使って開発を行ったので、そのVue.jsの基本的な記述について備忘録としてまとめます。
##データバインディング
###テキストのバインディング
* データのバインディグのもっとも基本的な形　マスタッシュ {{ }}を利用したもの
* 
以下のような使い方ができます。

```App.vue
 <template lang="pug">
 	#app
 		span {{ msg }} //hello
 </template>
 <script>
	export default {
		data(){
			return{
				msg:"hello"
		}
	}
 </script>
```

```App.vue
<template lang="pug">
  .app
    span {{inc}} //numに +1された数字がバインディングされる
</template>
<script>
export default {
  data(){
    return{
      num:10
    }
  },
  computed:{
    inc(){
      return this.num + 1
    }
  }
};
</script>
```

###属性のバインディング
* {{ }}マスタッシュはHTML属性の内部では使えない
* 代わりに v-bindディレクティブを使用する

```App.vue
  <template lang="pug">
  	#app
  		span(v-bind:class="dynamicClass") {{ msg }}
  </template>
  <script>
 	export default {
 		data(){
 			return{
 				msg:"hello",
 				dynamicClass:"hoge"
 		}
 	}
  </script>
  <style>
  .hoge{
  	display:inline-block;
  }
  .fuga{
  	display:none;
  }
  </style>
```
dynamicClassの値をhoge⇨fugaに変更すると、spanのクラスが変更され、非表示になります。


##親子間のデータの受け渡し
* Vue.jsでの親子間のデータの受け渡しは、『props down, events up』
* 親はプロパティを経由してデータを子に伝える
* 子はイベントを経由して親にメッセージを送る

という認識でいます。

以下のように子コンポーネントでpropsオプションを指定します。

```CustomInput.vue
<template>
...
input(type="text" :placeholder="customPlaceholder" @input="updateValue")
...
</template>
<script>
export default = {
 props:{
  customPlaceholder:{
   type:String,
   default:""
  }
 },
 methods: {
  updateValue (e) {
   this.$emit('input', e.target.value)
   this.$emit('change', e.target.value)
   }
  }
}
</script>
```

```CustomInput.vue
this.$emit('input', e.target.value)
```
この部分で子コンポーネントからinputに入力されたvalueを親に渡しています。


親コンポーネントでは、子に渡すデータを指定、inputEmailの値が子のコンポーネントに渡されます。

```Form.vue

<template>
 custom-input(:customPlaceholder="inputEmail")
</template>
<script>
import CustomInput from "./components/CustomInput"
export default = {
  components:{
   CustomInput
 },
 data(){
  return{
   inputEmail: "メールアドレスを入力してください"
  }
 }
}
</script>

```

だいぶ掻い摘んで書いてみましたが、書き方どうだっけ？的なときのために。
Macのダウンロードディレクトリを定期削除する

いくつかステップから実現していきます。

# 1. 任意のディレクトリにシェルを作る

`-rfv`: 再帰的にディレクトリ/ファイルを削除し、削除したファイルについて出力させるためのオプションです。

`~/Downloads/*`: `~/Downloads/`のように末尾をパスにしてしまうとダウンロードディレクトリまで削除対象になってしまうので、ワイルドカードを利用して指定ディレクトリ以下の全てのファイル/フォルダを対象にします。(ダウンロードディレクトリは`sudo`をつけない限り削除できないようパーミッションが設定されているので、一応どちらでも問題ないはずですが)

```bash:empty_downloads_directory.sh
#!bin/bash
rm -rfv ~/Downloads/*
echo "-----------------------------------------------------------"
echo "Cleaning up Downloads directory is finished."
```

# 2. `crontab`を利用する
「Macではlaunchdを使う」という記事もいくつか見ましたが、plistは極力触りたくなかったのでcronを使いました。

`crontab -e`を入力する事で、viでcronの登録/編集をする事ができます。

自分はこのように毎週日曜日の夜23時にディレクトリの掃除を行うように登録しました。スクリプトのパスはご自分のものに置き換えてください。

```
# 毎週日曜日の夜にダウンロードディレクトリを綺麗にするスクリプトを実行する. format: 分 時 日 月 曜日 スクリプト
0 23 * * 7 sh /Users/UserName/Documents/Scripts/empty_downloads_directory.sh
```


# 3. フルディスクアクセスを与える
Catalina以降は、ディスクアクセスの権限を適切に与えないとcronの実行ができないようになっているようなので、以下のサイトを参考にしながらアクセスを与えます。

https://blog.n-function.com/806/
virtualboxでのコピペについて

irtualboxについて

mac上でLinux ubuntuを扱いたくてvirtualboxにインストールすることができたのですが、ホストゲスト間でのコピペができず困っております。

guest additions CDのvm guest へのインストール、virtualboxの一般設定で双方向を選択したところホストゲスト間でファイルのドラック&ドロップは行えるようになりましたが、コピペができません。

具体的にはホストのmac上のpdfをコピーしてゲストのエディタへペーストしたいです。

とりあえず現状共有フォルダを設定することで間接的にやりたいことを行えた。
【Objective-C】（マクロ）あれ？バージョンアップに従って警告やエラーが出てきてコードが書けない！！


iOS 7 のSDKのObjective-C では
usr/include  Availability.h の中に定義がされています。

必要なバージョンで切り替えたい場合は、以下のように

~~~Objective-C:Availability.h
#define __IPHONE_7_0
~~~

という定義がありますので

~~~Objective-C:hoge.h
#ifdef  __IPHONE_OS_VERSION_MIN_REQUIRED == __IPHONE_7_0
// or
// #define __IPHONE_OS_VERSION_MIN_REQUIRED == 70000

// XCode 7 以降でビルドされるコード

#else

// XCode 7 以前でビルドされるコード

#endif
~~~

Xcode 未だに現場で ObjectiveCを使っているところがあるので、もしお困りの方はご参考にしてみてください！！

またご報告致します。


## 関連記事

【About】(http://qiita.com/sunstripe) - サンストライプ

---

## 制作チーム：サンストライプ

[![sunstripe_logo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80600/322f2d60-f19d-af9e-2b6f-7290ca546848.png)](http://sunstripe.main.jp/)
http://sunstripe.main.jp/

(月１WEBコンテンツをリリースして便利な世の中を作っていくぞ！！ボランティアプログラマー/デザイナー/イラストレーター/その他クリエイター声優募集中！!)

### 地域情報 THEメディア
THE メディア 地域活性化をテーマに様々なリリース情報も含め、記事をお届けしてます！！
https://the.themedia.jp/

### ゼロからはじめる演劇ワークショップ
多様化の時代に向けて他者理解を鍛える

https://workshop.themedia.jp/

### プログラミングワークショップ・ウェブ塾の開講！！！
様々なテーマでプログラミングに囚われずに取り組んでいきます。
詳しくはこちら　↓　↓　↓　↓　↓　↓　↓　↓
[プログラミングサロン 月１だけのプログラミング学習塾](https://workshop.themedia.jp/posts/7057553?fbclid=IwAR32CfRQ7RvDOhvuogoSwqxDLMOU7Jvuzljlnx-TMc27qBPX1BnWsfLcBR8
)

### 協力応援 / 支援者の集い
## チーム：サンストライプ
#### プログラミングラボ
https://twitter.com/sunstripe2011

一緒にポートフォリオを作りませんか？現場の体験やそれぞれの立場から年齢関係なく作品を作りたい方々と一緒にチームを作って、作品を作っています。現場に行きたい人には、職場紹介や職場の体験や悩み相談なども受けております。
様々な職種からプログラミングの知識を得たい、デザインの知識を得たい、データーベースの知識を得たいという人が集まっております。
週１のミーティングにそれぞれの近況と作業報告して、たまにリモート飲み会などをしております！！

興味がある方は、DMに話しかけてみてください。

## トラストヒューマン
http://trusthuman.co.jp/
私たちは何よりも信頼､人と考えてます｡

｢コンサルティング｣と｢クリエイティブ｣の両角度から｢人材戦略パートナー｣としてトータル的にサポートします！！

キャリア教育事業
広域学習支援プラットフォーム『のびのび日和』
https://slc-lab.amebaownd.com/

#スポンサー募集


## ネリム
https://nerim.co.jp/
配信事業などを映像コンテンツなどの制作しております

## ビヨンドXプロジェクト

[ビヨンドXプロジェクト全体会議](https://www.youtube.com/playlist?list=PLaR6-YWiGWkYhEHWnt8f1z-JC0g3nwwC9)
Action Cable の凄まじくざっくりとした概要

# Action Cableとは
websocketを簡単に実装できちゃうすごいやつなのだ

# ざっくりどう使うのか
・ assets/javascripts/channelsディレクトリ　xxx.coffee
・ channelsディレクトリ XXX_channel.rb 
上記の２つで情報のキャッチボールをさせるイメージ

続きは追々書いていきます
eslintとprettierの競合が修正できぬ? (vscode)

# 問題
(1) 1行を80文字以内に収めたいので、eslintに以下の設定をしました。

```.eslintrc
max-len: [2, { "code": 80 }]
```
(2) 次に以下のコードを書いたら、91文字だったためエラーが発生。

```js
import CountryFlagFromCurrency from '~/src/components/atoms/icons/CountryFlagFromCurrency';
```

(3) よしなに改行をいれる

```js
import 
　CountryFlagFromCurrency 
from '~/src/components/atoms/icons/CountryFlagFromCurrency';
```

(4) 保存しようとしたら謎の力によって元の姿に整形され詰む。

```js
import CountryFlagFromCurrency from '~/src/components/atoms/icons/CountryFlagFromCurrency';
```
# 修正案1 prettierをいじる
prettierが邪魔してるのだと思い、`.prettierrc.yml`に以下を追記

```yml
printWidth: 80
```

結果 : なおらず。。。

# 修正案2 vscodeのsettingsを探る
(1)ちょっとよくわからなくなったので、とりあえずvscodeのsettingsでmaxと検索したら`Max Column`が引っかかる。

![スクリーンショット 2020-04-01 11.16.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131286/389aee64-d32a-664b-d7b1-8df3f2c51ab6.png)

(2) MiniMapって、今表示しているコードがファイル全体のどの位置にあるか表示してくれるエディタの脇にでてくるあれだよな、、、と思いながら、`Mac Column`を80にしたら解決しました。

# 結論
コード整形なのでeslintかprettierかと思いきやMiniMapの設定のせいで改行できなかったようです。正しい設定かあまりわかってませんが、、、とりあえずこれで解決したのでこの形で進めていきます。。。
pythonで素数を探してみた

#はじめに
コロナウイルスの影響で学校が休みになったままでやる事がなかったので素数を見つけ出すプログラムを作りました。
#ソースコード

```python
Prime_number_list=[]
b=input("探す範囲を指定してください")
b=int(b)
for a in range(b):
    a=a+1
    number=0
    for i in range(a):
        if a%(i+1)==0:
            number+=1
    if number==2:
        Prime_number_list.append(a)
print(Prime_number_list)

```
1.2 サーバーの複製

（2016年時点での内容をアーカイブとして掲載しているため、一部の掲載内容が最新情報とは異なる場合がありますので、ご了承ください。最新のIBM Cloudの情報は [IBM Cloud Docs](https://cloud.ibm.com/docs) や [IBM Cloud アップデート情報](https://www.ibm.com/cloud-computing/jp/ja/cloud-update/) 、[柔らか層本](https://ibm.ent.box.com/v/ibmcloud-yawaraka)をご参照ください。）

解決したい課題

<注意> フレックス・イメージのサービスは、2017年8月7日にサービス提供終了となりました。

クラウドのサーバーであったとしても、システムを運用する基盤を構築するには、それなりの時間とコストが必要となる課題がある。 例えば、運用可能な状態にするまでには、次に挙げる作業が必要であり、スキルを有するITエンジニアにより、手間と時間がかけて構築する必要がある。 (1)OSの設定、(2)ミドルウェアの導入と設定、(3)アプリケーションの実行環境の設定、(4)監視や通知の設定、(5)データ・バックアップの設定、(7)シェル、Perl、Pythonなどのプログラミング、(7)テスト
一方、サーバー設定ツールの Chef や Puppet といったサーバー設定自動化ツールを利用することもできる。 しかし、これらのツールは学習コストがかかり、小規模環境の場合では管理コスト増大するなどから、簡便なサーバーの複製方法が求められている。
 
ソリューション・パターン

SoftLayerのクラウド環境では、仮想サーバーや物理サーバーで、一度設定したOSディスクのイメージを取得しておき、これをテンプレートにして同じ設定のサーバーを幾つでも起動することができる。 例えば、利用者にとって共通のツールを導入した基本イメージ、ロードバランサーの配下に置くアプリケーション・サーバーの共通イメージなどのように、共通の内容をイメージ・テンプレート化して作業を省くことに役立てられる。
 
インプリメンテーション

仮想サーバーの複製には、プライベート・イメージ・テンプレート、フレックス・イメージを利用できる。 カスタマーポータルの操作で、イメージを所得した後、これらのイメージをもとにして、クローンの仮想サーバーを作ることができる。 また、フレックス・イメージの場合には、仮想サーバーのイメージから、クローンの物理サーバーを作ることができる。
物理サーバーでは、フレックス・イメージを利用できる。 これにより仮想サーバーの場合と同ように、クローンの物理サーバー、または、仮想サーバーを起動できる。

 
効果

サーバーの構築に関わる共通的な作業時間とコストを大幅に削減できる。
必要な時に、必要な数だけ、クローンのサーバーを起動できる。
オートスケールのサーバーのテンプレートにできる。
一日あたり数時間しか利用しないバッチ処理やバックアップのサーバーに適用して、コストを節約できる。
 
懸念事項・注意点

フレックス・イメージは、取得対象サーバーに複数のディスクがある場合、リストアされたサーバーでは、複数のディスクが一つのディスクに統合され、パーティションとして集約される。 ファイルシステムの関係やドライブ・レターは、維持されるが、再配置が必要になる。
イメージからサーバーを複製した場合、OSやミドルウェアの更新が、取得時から進んでいないため、必要に応じアップデートを適用する。
イメージの取得時には、静止点が必要なため必ず再起動が発生する。 サービスの停止障害とならないように、計画的に実施する必要がある。
プライベート・イメージ・テンプレートやフレックス・イメージのデータ保管に関して料金が発生するため、不要になったイメージは削除する必要がある。
サーバーのイメージ取得と新規のサーバーへのインストールの時間は、対象とするディスクのサイズに依存する。 ユーザーのデータを含み容量が大きい場合、それに応じた時間が必要となる。 時間の節約のためには、OSディスクとデータ・ディスクを分割することをお勧めする。
サーバーの台数が多い場合には、テンプレート・イメージの管理が煩雑にならないうちに、Chef、Puppet などツールの検討をお勧めする。 例えば、サーバー台数の増加に応じてイメージの数も増加し、世代管理も煩雑になる。 それに加えて、イメージの状態では、サーバーを復元してみないと完全に設定内容を確認できない。 一方、Chefでは、レシピを確認することで、設定内容を把握することができる。
 
参考資料

3.2 サーバーのクローンを作るには？
1. 基本パターン

（2016年時点での内容をアーカイブとして掲載しているため、一部の掲載内容が最新情報とは異なる場合がありますので、ご了承ください。最新のIBM Cloudの情報は [IBM Cloud Docs](https://cloud.ibm.com/docs) や [IBM Cloud アップデート情報](https://www.ibm.com/cloud-computing/jp/ja/cloud-update/) 、[柔らか層本](https://ibm.ent.box.com/v/ibmcloud-yawaraka)をご参照ください。）

1.1 データバックアップ
1.2 サーバーの複製
1.3 サーバーのスペックアップ／ダウン
1.4 ディスク容量の増減
第3部「デザインパターン」

（2016年時点での内容をアーカイブとして掲載しているため、一部の掲載内容が最新情報とは異なる場合がありますので、ご了承ください。最新のIBM Cloudの情報は [IBM Cloud Docs](https://cloud.ibm.com/docs) や [IBM Cloud アップデート情報](https://www.ibm.com/cloud-computing/jp/ja/cloud-update/) 、[柔らか層本](https://ibm.ent.box.com/v/ibmcloud-yawaraka)をご参照ください。）

SoftLayerを使って、どのように課題解決できるかの観点で、課題を解決するための設計レベルの指南を提供するものです。 マネージャー、コンサルタント、アーキテクトの方々が、読みやすく理解しやすいように、簡潔な文と図で解説する形式です。
 
1. 基本パターン
2. 可用性向上
3. 動的コンテンツの処理
4. 静的コンテンツの処理
5. データアップロード
6. RDBのパターン
7. バッチ処理パターン
8. 運用保守パターン
9. ネットワーク パターン
10. IoTパターン

 

＜関連リンク＞

SoftLayer カスタマーポータル
TOK02 VPN ログイン
Knowlodge Layer
Development Network
SoftLayer API
SoftLayer ホームページ
GCC 9.3.0をソースコードからビルドする

GCCを自分でビルドしてみたい時に読んでください。

# ソースコードをダウンロード && 展開
```sh
wget http://ftp.tsukuba.wide.ad.jp/software/gcc/releases/gcc-9.3.0/gcc-9.3.0.tar.xz
tar xf gcc-9.3.0.tar.xz
```

# ビルド・インストールディレクトリを作成
`build` : ビルドに使用するディレクトリ
`install` : 現在ディレクトリ直下に`install`を作成し、そこにインストールする。他にインストール場合は任意のものに変える

```sh
mkdir build install
```

# プレビルド
GCCのビルドに必要なパッケージを取得する

```sh
pushd gcc-9.3.0
./contrib/download_prerequisites
popd
```

# ビルド

```sh
pushd build
../gcc-9.3.0/configure --prefix=./install \
                       --enable-languages=c,c++,fortran \
                       --disable-multilib \
                       --disable-bootstrap
make
make install
popd
```

`make`する部分はお好みで`make -j4`のようにすると4プロセス並列ビルドする。筆者はVMでやっているためメモリ不足が怖くて並列ビルドはしていない。
LaTeX備忘録

# 空白の扱い[1, pp.44-45, pp.306-307]

1. ``\␣``は改行に変更されてもいい空白[^␣]
2. ``~``は改行に変更されない空白（途中で改行されて困るときに使う）
3. ``\@``は直後を文末の空白にする（\nonfrenchspacing を使っているときに、大文字1文字で終わる文末に注意する）

[^␣]: 「␣」は半角スペースを表す記号とする

## 例

1. an unbounded (resp.\ a bounded) domain; cf.\ XXX
2. Fig.~\ref{XXX}; hogehoge~\cite{XXX}
3. Physica D:\@ Nonlinear Phenomena; His grade is A.\@ He is genius.  （古いLaTeXでは His grade is A+\@. He is genius.）

なお、"I am T. Yamada." の T. と Yamada の間はセンテンス間の空白であり適切である。

# 関係演算子ではないコロン（:） [1, p.95]

- 誤 f : A \to B
- 正 f{:}\ A \to B
- 正 f\colon A \to B

# タイプライターフォント
- LaTeXの数式モード（math mode）中でタイプライターフォント（typewriter font）の波括弧（brace brackets）

```LaTeX
$\texttt{\char`\{}$
```

# 複数の図を並べる

- [subcaption](https://ctan.org/pkg/subcaption)を用いる。
- subfigure, subfigは古い。
- 参考：[使ってはいけない LaTeX のコマンド・パッケージ・作法](https://ichiro-maruta.blogspot.com/2013/03/latex.html)

## 例

```LaTeX

%preamble
\usepackage{subcaption}

%document内で．．．
\begin{figure}[t]
  % 最初の図---------------------------
  \begin{minipage}[b]{0.45\hsize}
    \centering
    \includegraphics{ファイル1}
    \subcaption{キャプション1}\label{ラベル1}
  \end{minipage}
  % 2番目の図--------------------------
  \begin{minipage}[b]{0.45\hsize}
    \centering
    \includegraphics{ファイル2}
    \subcaption{キャプション2}\label{ラベル2}
  \end{minipage}
  \caption{キャプション}\label{ラベル}
\end{figure}
```

# Enumerate のカウンターの文字列を変える

以下のように環境を始めれば良い。

```LaTeX
\begin{enumerate}[label=\roman*.]
\begin{enumerate}[label=\arabic*)]
\begin{enumerate}[label=\alph*)]
```

# 古いパッケージやコマンドへの警告の表示
以下をプリアンブルに追加する。

```LaTeX
\RequirePackage[l2tabu, orthodox]{nag} % nag – Detecting and warning about obsolete LaTeX commands
\usepackage[all, warning]{onlyamsmath} % onlyamsmath – Inhibit use of non-amsmath mathematics markup when using amsmath
```

# 参考文献
[1] LaTeX2e 美文書作成入門 改訂第7版
JSONをCSVに変換する

## JSONをCSVに変換する
ファイル不正時などはいったん考慮せず、ロジックだけおぼえがき。

```jsonToCsv.java
	/**
	 * JSONをCSVに変換する.
	 *
	 * @throws IOException
	 */
	public static void jsonToCsv() throws IOException {

		String json = "[{\"head1\":\"a\",\"head2\":\"b\",\"head3\":\"c\",\"head4\":\"d\",\"head5\":\"e\"},{\"head1\":\"1\",\"head2\":\"2\",\"head3\":\"3\",\"head4\":\"4\",\"head5\":\"5\"},{\"head1\":\"q\",\"head2\":\"qq\",\"head3\":\"qqq\",\"head4\":\"qqqq\",\"head5\":\"qqqqq\"}]";
		// 両サイドの[]を排除し、},{で区切る イメージは "head1":"1","head2":"2","head3":"3","head4":"4","head5":"5"
		List<String> trimJson = Arrays.asList(json.split("\\[")[1].split("\\]")[0].split("\\},\\{"));

		// 1レコード1mapに成形する
		Function<String, Map<String, String>> toMap = str -> {
			Map<String, String> map = new HashMap<>();
			for (String s : str.split(",")) {
				String[] keyValue = s.split(":");
				map.put(keyValue[0].split("\"")[1], keyValue[1].split("\"")[1]);
			}
			return map;
		};

		List<Map<String, String>> recordList = trimJson.stream()
				.map(String::trim)
				.map(v -> v.startsWith("\\{") ? v.split("\\{")[1] : v)
				.map(toMap)
				.collect(Collectors.toList());

		// csvファイルを作成、書き込む
		File csv = new File("csvファイルパス");
		csv.createNewFile();
		FileWriter filewriter = new FileWriter(csv);
		String header = String.join(",", recordList.get(0).keySet());
		String bodies = recordList.stream()
				.map(Map::values)
				.map(v -> String.join(",", v))
				.collect(Collectors.joining("\r\n"));
		filewriter.write(header + "\r\n");
		filewriter.write(bodies);
		filewriter.close();
	}
```
Kotlin Coroutineのサンプルをコマンドラインから実行する方法

## やりたいこと
みんな最初に実行する以下のコードをコマンドラインでビルドして実行する。

```kotlin

import kotlinx.coroutines.*

fun main() {
    GlobalScope.launch { // launch a new coroutine in background and continue
        delay(1000L) // non-blocking delay for 1 second (default time unit is ms)
        println("World!") // print after delay
    }
    println("Hello,") // main thread continues while coroutine is delayed
    Thread.sleep(2000L) // block main thread for 2 seconds to keep JVM alive
}
```

## 前提条件
- MacOS
- Javaインストール済み
- Mavenインストール済み
- 上のソースが`first.kt`という名前でカレントディレクトリにある

## 実施する作業
1. kotlinコンパイラのダウンロード 
2. kotlin coroutineのjarファイルのダウンロード
3. ソースコードのコンパイル
4. コマンドラインから実行
  
## 手順
> 1 . kotlinコンパイラのダウンロード 

公式サイトに手順の記載あり [(ここ)] (https://kotlinlang.org/docs/tutorials/command-line.html#downloading-the-compiler)

> 2 . kotlin coroutineのjarファイルのダウンロード

以下のコマンドを実行すると、
カレントディレクトリに `kotlinx-coroutines-core-1.3.5.jar` がDLされます。

```bash

mvn dependency:get -Dartifact=org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.5  -Ddest=./
```

> 3 . ソースコードのコンパイル

以下のコマンドを実行すると
カレントディレクトリに first.jar が生成されます。

```bash
kotlinc -cp kotlinx-coroutines-core-1.3.5.jar  first.kt -include-runtime -d first.jar
```

> 4 . コマンドラインから実行

以下のコマンドを実行

```bash
java -cp ./first.jar:./kotlinx-coroutines-core-1.3.5.jar FirstKt
```

## なぜこれをやったか?
理由は以下の3点

- [遊び場] (https://play.kotlinlang.org/) で実行すると `Hello` と `World`が同時に表示されて微妙だと思ったから
- 拡張ライブラリを使ったkotlinのソースをコマンドラインでビルドしてみたかった
- AndroidStudioを立ち上げるのが面倒だった
CSVをJSONに変換する

## CSVをJSONに変換する
ファイル不正時などはいったん考慮せず、ロジックだけおぼえがき。

```csvToJson.java
	/**
	 * CSVファイルの全行をJSON形式に変換する.
	 */
	public void csvToJson() {

		// csvファイル読込
		File csv = new File("csvファイルパス");
		try (BufferedReader br = new BufferedReader(new FileReader(csv));) {

			// 先頭行はカラム名
			final String[] header = br.readLine().split(",");
			List<String> jsonRecords = new LinkedList<>();

			loop: while (true) {

				// 全行取得
				String record = br.readLine();
				if (record == null) break loop;
				String[] column = record.split(",");

				// {"header0":"column0","header1":"column1"}という形に成形
				String jsonRecord = "{" + IntStream.range(0, header.length).boxed()
						.map(v -> "\"" + header[v] + "\":\"" + column[v] + "\"")
						.collect(Collectors.joining(",")) + "}";

				jsonRecords.add(jsonRecord);
			}

			// [{"header0":"0","header1":"1"},{"header0":"2","header1":"3"}]という形に接続
			String json = "[" + String.join(",", jsonRecords) + "]";

			System.out.println(json);

		} catch (IOException e) {
		}
	}
```
2019#2 G検定メモ

#背景
AI関連の仕事をやっていますので、それにかかわる資格も取ったほうが良いと思い、いろいろ調べて<a href="https://www.jdla.org/">JDLAのホームページ</a>にたどり着きました。
#準備
とりあえず公式に勧められている<a href="https://www.amazon.co.jp/%E4%BA%BA%E5%B7%A5%E7%9F%A5%E8%83%BD%E3%81%AF%E4%BA%BA%E9%96%93%E3%82%92%E8%B6%85%E3%81%88%E3%82%8B%E3%81%8B-%E3%83%87%E3%82%A3%E3%83%BC%E3%83%97%E3%83%A9%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0%E3%81%AE%E5%85%88%E3%81%AB%E3%81%82%E3%82%8B%E3%82%82%E3%81%AE-%E8%A7%92%E5%B7%9DEPUB%E9%81%B8%E6%9B%B8-%E6%9D%BE%E5%B0%BE-%E8%B1%8A/dp/4040800206/ref=sr_1_7?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=G%E6%A4%9C%E5%AE%9A&qid=1585701552&sr=8-7">松尾先生が書いてる本</a>を読みました。この本はディープラーニング今までの歴史とこれからの展望についての話です。読み終わったらある程度ディープラーニング発展の全体図を掴みました。小説感覚でかなり読みやすいと思います。
通勤時間で一週間くらいかかりました。

次は<a href="https://www.amazon.co.jp/%E6%B7%B1%E5%B1%A4%E5%AD%A6%E7%BF%92%E6%95%99%E7%A7%91%E6%9B%B8-%E3%83%87%E3%82%A3%E3%83%BC%E3%83%97%E3%83%A9%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0-G%E6%A4%9C%E5%AE%9A-%E3%82%B8%E3%82%A7%E3%83%8D%E3%83%A9%E3%83%AA%E3%82%B9%E3%83%88-%E5%85%AC%E5%BC%8F%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88/dp/4798157554/ref=sr_1_2?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=G%E6%A4%9C%E5%AE%9A&qid=1585701552&sr=8-2">公式の問題集</a>と<a href="https://www.amazon.co.jp/%E5%BE%B9%E5%BA%95%E6%94%BB%E7%95%A5-%E3%83%87%E3%82%A3%E3%83%BC%E3%83%97%E3%83%A9%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0G%E6%A4%9C%E5%AE%9A-%E3%82%B8%E3%82%A7%E3%83%8D%E3%83%A9%E3%83%AA%E3%82%B9%E3%83%88%E5%95%8F%E9%A1%8C%E9%9B%86-%E3%82%B9%E3%82%AD%E3%83%AB%E3%82%A2%E3%83%83%E3%83%97AI%E6%A0%AA%E5%BC%8F%E4%BC%9A%E7%A4%BE-%E6%98%8E%E6%9D%BE/dp/4295005665/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=G%E6%A4%9C%E5%AE%9A&qid=1585701552&sr=8-1">評判がいい黒い本</a>をやりました。一回目は分からない問題が結構多かったです。調べながら最短時間でひと通りやりました。その後何回繰り返して記憶に定着するように解きました。
この二冊問題集は大体1~2か月がかかりました。

#試験当日
自宅のパソコンでテストを受けました。問題数が多いに対し、時間が足りなかったです。前半の問題はほとんど見たことないでした。後半の問題は大体解きました。点数は半分しか取れないと思いました。

#試験結果
無事に合格できました。
正直に以外でした。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/596641/a9b04a42-e61b-c255-0e71-578f5d9df5f9.png)


#感想
G検定の準備を通じてこの業界基本なものを理解できたと思います。
次はE資格の挑戦です。