OmniAICreator/Qiita-1.07M huggingface dataset:
私、実はTeapotなの……と言わないApache httpd

# 418が500になる

こないだ Apache httpd で "[418 I'm A Teapot](https://ja.wikipedia.org/wiki/Hyper_Text_Coffee_Pot_Control_Protocol)" を表示させようとしたんですが `500 Internal Server Error` って言われたんですよ。

```apache
Redirect 418 /
```

```html
<h1>Internal Server Error</h1>
<p>The server encountered an internal error or
misconfiguration and was unable to complete
your request.</p>
```

`403` だとちゃんと動作するんですよね。

それで調べたところ、マニュアルに書いてありました。

> The status must be a valid HTTP status code, known to the Apache HTTP Server (see the function send_error_response in http_protocol.c).

確かに `NULL` になってますね。
https://github.com/apache/httpd/blob/2.4.x/modules/http/http_protocol.c#L135

```c:http_protocol.c
    "415 Unsupported Media Type",
    "416 Requested Range Not Satisfiable",
    "417 Expectation Failed",
    NULL, /* 418 */
    NULL, /* 419 */
    NULL, /* 420 */
    "421 Misdirected Request",
    "422 Unprocessable Entity",
    "423 Locked",
```

# お、出番か？

ここは、使い道のないものを実装する専門家たる私の出番では？

……と思ってたら、trunk で実装されていた！
https://github.com/apache/httpd/blob/trunk/modules/http/http_protocol.c#L135

```c:http_protocol.c
    "415 Unsupported Media Type",
    "416 Requested Range Not Satisfiable",
    "417 Expectation Failed",
    "418 I'm A Teapot",
    NULL, /* 419 */
    NULL, /* 420 */
    "421 Misdirected Request",
    "422 Unprocessable Entity",
    "423 Locked",
 ```

httpd 2.6 (か、3.0) では使えるということですな[^when]。
なんとなく残念。

[^when]: 2020年7月現在、alpha 版さえ出てないですが。
～ローカルからサーバーへ～：簡単にできる公開方法を調べてみた

#はじめに
この記事では、詳しい公開方法については記載はしません。

実際に、公開するための様々な方法についてご紹介します。

#①heroku
herokuとは、

「PaaS」と呼ばれるwebサービスを公開するのに必要な環境を提供してくれるサービスです。

herokuへ「デプロイ」とよく言われますが、
これは、

**herokuという場所にサービスを置いてくる**

というイメージです。

herokuは基本的には、無料で使えます。
ただ、重いサービスだとwebの挙動が遅くなってしまうこともあります。

その場合は課金を。（課金する場合は800円程度）

詳しいことは下の記事を参考に。
herokuの使い方までわかりやすく書かれています。

【参考】：[【HEROKUとは】これを読めばOK!デプロイの仕方まで徹底解説](https://tech-camp.in/note/technology/16108/)

#②Netlify
**静的なWEBサイトのホスティングサービス**です。

ホスティングとは、つまりサーバーを借りることです。

公開手順は比較的簡単です。

簡単に言うと、
①Netlifyの登録
②GitHubのリポジトリ作成
③GitHubとNetlifyの紐づけ

これで完結します。
そして無料でデプロイできます。

公開手順については以下の記事で
[Netlifyで静的サイトのホスティングをする](https://qiita.com/sugo/items/2ee64887d682b0dae635)
[Netlify公式](https://www.netlify.com/)

#③GitHub Pages
こちらも、Netlifyと同じく、
**静的サイトのホスティングサービス**です。

###【特徴】
・無料
・静的サイトの公開（JSもオッケー）
・独自ドメインも充てることが出来る。

###【公開手順】
①GitHubリポジトリ作成
②プッシュ
③masterブランチをGitHub Pagesに公開

こちらも簡単に公開できます。
あとは、URLにアクセスするだけ。

Netlifyと同じで、サーバーを借りたり、FTPの必要もないため、静的なサイトをちょっと公開する程度であればあればNetlifyやGitHub Pagesで十分です。

個人レベルで簡単に公開したいだけであれば、
Netlifyよりも、GitHub Pagesの方がシンプルに行えるみたいです。

###【参考】
・公式ページ：[GitHub Pages](https://pages.github.com/)
・[GitHub Pages を使った静的サイトの公開方法が、とても簡単になっていた](https://www.tam-tam.co.jp/tipsnote/html_css/post11245.html)

#④Now
nowはNode.jsまたはDockerで動作するWebアプリケーションをホスティングできるサービスです。
herokuと同じで、高速なデプロイを行えるPaaSです。
（※Node.jsがインストールされていることが前提です。）

Nowもめちゃくちゃシンプルです！

###【特徴】
・```now```と打つだけでデプロイ完結！
・HTTPSのアクセスが可能
・フロント、バックのデプロイが可能

###【公開手順】
コマンドをいくつか打っていくだけです。

①CLIのインストール（nowのインストール）
②nowでログイン
③設定ファイルの設定
④```now```でデプロイ
（詳しいことは以下記事参照）

###【参考】
・[Now でクラウドの複雑さから解放されよう、今すぐに](https://qiita.com/aggre/items/f0cb9f8b8e8c54768e50)

#⑤DeployBot
これは、GUIでコマンドを使わずに視覚的にデプロイを行えるツールです。

非エンジニアの方でも操作が容易みたいです。

###【特徴】
・その他ツールのインストール必要なし
・バージョン管理が可能（Gitみたいに）
・情報共有が出来る

###【参考】
[エンジニアをデプロイ作業から開放するDeployBotってなにがすごいの？](https://ferret-plus.com/4949)

#⑥Dropbox
Dropboxは、上記のサービスとは異なり**オンラインストレージサービス**です。

オンラインストレージとは、インターネット上でデータの保管や共有を行えるサービスです。
（例えば、Google Driveはオンラインストレージはです。）

その中でも、ホスティング機能の使えるDropboxでは簡単なホームページであれば公開できます

###【参考】
・[Dropboxでホームページのホスティングをする方法](https://ferret-plus.com/9755)

#さいごに
どれも小規模なサービスであれば、簡単に公開できるので試してみましょう。

#参考記事
・[【口コミ】個人開発者達がおすすめするサーバー選び方](https://you88.space/519#outline__1_2)
Laravel導入(macOS)

# Laravelサイト

Laravelの情報は公式サイトをチェック

**Laravelサイト**
https://laravel.com/

**日本語サイト**
http://laravel.jp/

**Laravelのソフトウェアは、公式サイトからダウンロードしません**

- **PHPを先にインストールする必要があります**
- **ターミナルにて、下記を実行**

```terminal:ターミナル
$ brew install php@7.2
```

- **laravel6を使用するには、PHP 7.2以降を使用すること**

## ①Composer
Composerは、PHPのパッケージ管理プログラムです。
Composerを使用して、Laravelをインストールする。

下記からアクセス
https://getcomposer.org/

**1. トップページの「Download」をクリック**
[![Image from Gyazo](https://i.gyazo.com/b32b73b919f4a66dbf9210da05b354b3.png)](https://gyazo.com/b32b73b919f4a66dbf9210da05b354b3)

**2.「Download」アクセス後、「Manual Download」の最新バージョンをダウンロード(ここでは「1.10.9」をダウンロードする)**
[![Image from Gyazo](https://i.gyazo.com/dbc5f8f58a9d0841392f72257815bd55.png)](https://gyazo.com/dbc5f8f58a9d0841392f72257815bd55)

**3. ダウンロード完了後、ターミナルにて下記コマンド入力**

```terminal:ターミナル
$ cd ~/Download/
#ダウンロードフォルダに移動

$ sudo mv composer.phar /usr/local/bin/composer
#composer.pharを/usr/local/bin/内にcomposerというファイル名で移動する

$ chmod a+x /usr/local/bin/composer
#配置したcomposerのパーミッション（アクセス権）を変更する

$ composer -V
#composerのバージョンが表示されれば、インストール完了
```
これでcomposerの準備は完了です。

## ②Laravelインストール

**1. ターミナルにて下記を実行**

```terminal:ターミナル
$ composer global require laravel/installer
```
これでLaravelがインストールされます。

**2. 環境変数PATHの設定**

- ターミナルにて下記を実行

```terminal:ターミナル
$ echo "export PATH=~/.composer/vendor/bin:$PATH" >> ~/.bash_profile
$ source ~/.bash_profile
```

環境変数を追加して使うことで、Laravelコマンドが認識されるようになります。
一度、設定するといつでもLaravelコマンドを使用することが出来ます
プロジェクト管理入門 受託開発編

## この記事について
- プロジェクト管理の基本的なノウハウについて、簡単な説明資料にまとめてみました。
- プロジェクト管理が適切に実施されて、開発に注力できる技術者が増えると嬉しいです。
- [受託開発](https://engineer-club.jp/entrusted-development)を例に挙げて説明します。
- [PMBOK](https://www.internetacademy.co.jp/trends/education/what-is-pmbok.html)や[アジャイル](https://qiita.com/osapiii/items/753d21e2944fd72d89a7)の説明は省略します。

### 対象読者
- プロジェクト管理に興味がある方
 - プロジェクトマネージャ初心者
 - プロジェクトマネージャ候補のリーダー
 
## 1. プロジェクト管理のポイント
### (1). プロジェクトの目的
- プロジェクトの目的は、プロジェクトの制約条件を満たした上で、期日までに完了させること。
- 制約条件（予算、スケジュール、スコープ、品質など）は、トレードオフが原則。

### (2). プロジェクト管理
- プロジェクト管理とは、プロジェクト全体のバランスを取りながら、施策を適切に実施して完了させること。
- 1.の事由により、個々の利害が対立してしまう為、どの施策を優先するか俯瞰的に判断する必要がある。

### (3). プロジェクトマネージャ
- プロジェクトマネージャとは、プロジェクトを完了させる責任を負う人。
- 2.の役割を果たすために、プロジェクトをコントロールする必要がある。
- コントロールするには、まずは見える化、次に監視、その後に施策が効果的。
- 主な施策は以下の通り
 - クラッシング
 - ファストトラッキング
 - 技術的負債の返済
 - 作業の自動化（外部ツール利用、ツール自作）
 - ノウハウ標準化 など
 
## 2. プロジェクト管理の説明資料
プロジェクト管理やプロジェクトマネージャをイメージしやすいように、受託開発を例に挙げて説明します。
詳細は以下のリンク先を参照下さい。
　[開発体制の推移から分かるプロジェクトマネージャの役割と行動](https://www.evernote.com/l/Ag4JH5rWTopPioiMuzOQbKgkvDAaSUGn8EA/)
Go + Dockerで環境構築だけをする

はじめまして、マツガナイトです。

## はじめに
とりあえずGo言語で何か作りたい。とりあえずチャットアプリっぽいものを作るか。と手を動かしていたのですが、

「環境構築ってどうやってやるんだっけ」
となりました。

1年前もこんなこと言ってた気がするので備忘録として抑えておこうかと。

## Docker
とりあえず`Docker`使います。楽です。
- どのOS下でも簡単に環境構築が可能
- デプロイが楽かなって思っています（今回はAWSのECSを利用してデプロイする予定）。

`Docker`の基礎的なことは省略させていただきます。

※昔こんな記事あげたの思い出しました。基礎的なお話をしています。（古いですが）
[Dockerとはなにか？Dockerfileとはなにか？](https://qiita.com/matsugaknight/items/c77fec14ec3c281a47b4)

## Dockerfileを書く
`Dockerfile` を使用して、イメージ作成していきます。

```dockerfile:Dockerfile
# ベースとなるDockerイメージを指定
FROM golang:latest

# コンテナに作業ディレクトリを作成
RUN mkdir /go/src/mkwork

# 実行するワークディレクトリを指定
WORKDIR /go/src/mkwork

# ホストのファイルをコンテナの作業ディレクトリに移行
ADD . /go/src/mkwork
```

## docker-compose.yml
続いて、docker-compose.ymlを作っていきます
このファイルはyaml形式による でDocker コンテナに関する起動オプションを記載するファイルとなります。

```dockerfile:docker-compose.yml
version: '3' # composeファイルのバーション指定
services:
  app: 
    build: . # Dockerfileの置き場所によってpathは変わります
    tty: true
    volumes:
      - .:/go/src/mkwork # マウントディレクトリ指定
```

## build
`docker-compose build`を実行する -> もちろんyamlファイルがあるパスで。
※ちゃんとDockerそのものを起動してね。

`Successfully tagged go-docker-chat-app_app:latest`って出たので多分成功しました。

## コンテナを起動
buildしてもコンテナを起動しないと、コンテナ内でgoは扱えません（そりゃそう）。
下記コマンドで起動しましょう。

```
$ docker-compose up -d
```

## 何かGoファイル作る
なんでもいいです。`Hello World`をかましましょう。

```go:main.go
package main

import "fmt"

func main() {
	fmt.Println("Hello, World!")
}
```

あとはコンテナ上で起動するので

```
$ docker-compose exec app go run main.go
```
をして、`Hello World`が出れば問題なし。（bashに入って（`docker-compose exec app /bin/bash`）、`go run main.go`しても問題ないです。）

#### その他
noteやってます。
よければ概要欄から見てください。

以上です。
Youtubeの広告を自動でスキップするChromeプラグインを開発しました。

タイトルの通りです。

仕事中にYoutubeで音楽を流している間に、『自動で挟まれてくる広告が邪魔だな』と思い、ならプログラムの力でスキップを自動化できるのでは？と思ったのが、制作の発端です。
最初は自分のローカルでのみ使用していたのですが、どうせなら誰でも使えるようにしたいと思い、Chromeの公式機能へ申請しました。

技術的には大した事はないのですが、技術を応用する事の可能性の広さを痛感しました。
今後とも、常に『自分の技術を、どう日常の役に立てられるか？』についてアンテナを絶やさず、常に模索して行きたいと思います。

始めて制作した、オリジナルの制作物です。
アイデアを技術で実現するって、本当に楽しいです笑。
これで世の中の人たちの役に立てるのなら、本当にエンジニア冥利に尽きます。よければ使ってください。

Chrome URL:
https://chrome.google.com/webstore/search/SkipYoutubeAdvertisement?hl=ja

Github URL:
https://github.com/Takabun/SkipYoutubeAdvertisement


ソースコード:

```
 if (location.host === "www.youtube.com") { 
     setInterval( function () { 
         const skipbuttons = document.getElementsByClassName("ytp-ad-skip-button-container"); 
         try { 
            skipbuttons[0].click(); |
         } catch (e) { 
             ; 
         } 
 }, 1000)} 

```
C++でクラスのbool演算子をオーバーロードする

（2020/07/20訂正：×オーバーライド、○オーバーロード。およびoperator boolにexplicit）

# はじめに
RealSenseのサンプルコードを見ていて、掲題のようなことが出来るという勉強ができたので自前のサンプルコードを書いて確認してみました。[元ネタ](https://github.com/IntelRealSense/librealsense/tree/development/examples/capture)のコード（[コレ](https://github.com/IntelRealSense/librealsense/blob/development/examples/capture/rs-capture.cpp)、と[コレ](https://github.com/IntelRealSense/librealsense/blob/development/examples/example.hpp)）ではウィンドウクラスのオブジェクトを見ながらwhileループを回して、ウィンドウが閉じた際にfalseを返して終了処理、という感じでした。

# 何をするか
クラスのメンバでboolをoperatorでオーバーロードしてifやwhileの条件文でクラスオブジェクトが参照できるようにする、というものです。

# テストコード
こんなコードで確認しました。(2020/07/20訂正:operator boolにexplicit)

```c++:
#include <iostream>

class TestClass {
    int max;
    int count;
public:
    TestClass(int max) {
        this->max = max;
        count = 0;
    }

    ~TestClass() = default;

    // explicitを付けて暗黙的な変換を防止(2020/07/20訂正分)
    explicit operator bool() {
        bool retVal = false;

        if (count >= max) {
            retVal = true;
        }
        count++;

        return retVal;
    }
};

int main()
{
    // explicitしているので、operator <<で暗黙的キャストされず
    // コンパイルエラーにできる(2020/07/20訂正分)
    //TestClass test0(0);
    //std::cout << test0 << std::endl;

    TestClass test(3);

    while (!test)
    {
        std::cout << "counting." << std::endl;
    }
    std::cout << "count end." << std::endl;
}
```

クラスのメンバに`operator bool`を加えてwhileの条件文でオブジェクトを参照すること`while(!test)`で真偽処理が動きます。
CocoaPodsターミナルの設定

#ターミナル設定
ターミナルの設定をど忘れしてしまい、５分くらい考え込んでしまったのでメモを残しておこうと思います。

```terminal
cd ファイル名（場所）　//cdとファイル名に半角のスペースを入れる

pod init
```

次にファイルのフォルダを開き、Podfileを開きます。
そしてインストールしたいプログラムを入力します

```terminal
# Pods for プロジェクト名
pod 'プログラム名'　//pod は　Podだとエラーになります

end
```

Podfileの中身の記述がおわった、ターミナルに戻りインストールします。

```terminal
cd ファイル名（場所）　//cdとファイル名に半角のスペースを入れる

pod init //ここまでは最初に書いた記述です。

pod install
```

たったこれだけですが、たまに忘れて焦ります。
Rails パラメータを取得する方法

# パラメータ(Parameter)
Railsアプリケーションは、フォームに記述した内容を送信した場合、それをParametersというハッシュ値に変換し、Railsアプリケーション内部へ送り込みます。

> ハッシュ値（英：hash value）とは

> ハッシュ関数から返される値であり

> 元のデータをあれやこれやして作られた一見すると適当に見える値です。
[引用元](https://wa3.i-3-i.info/word11949.html)

## parameterを確認する
送られてきたパラメータはログから確認できます。
試しにブログを投稿し、ログを確認すると、下記のように表示されます。
![4F03662C-9E19-483F-AB3C-14A60422F423_4_5005_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613801/f7ced18e-2754-8b93-5496-a14f2c02dbcf.jpeg)

投稿したパラメータを確認できます。

## パラメータを取得する

このパラメータを利用し、テーブルにレコードを新規追加します。

送られてきたパラメータを取得するためには、paramsメソッドを使用します。

## paramsメソッドの使い方

```ruby:blogs_controller.rb
class BlogsController < ApplicationController
  def index
  end

  def new
    @blog = Blog.new
  end

  def create
    Blog.create(title: params[:blog][:title], content: params[:blog][:content])
  end
end
```

このように、paramsメソッドを記述することで、送られてきたparameterをすべて取得できます。
Financial Services Cloud (ユーザ向け)_基本を理解する

１．活動の記録など、基本アクションを実行するためのショートカットはどこにありますか?
２．ホームページを変更するにはどうすればよいですか?
３．クライアントまたは顧客の特定の情報はどこに表示されますか?
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634241/30947e20-66f4-b551-1516-dad997cf150d.png)
複数サブスクリプションがある場合の Azure Functions App Settings を取得する方法

# はじめに

ちょっとだけ詰まったので、備忘録代わりに残しておきます。

今回, Azure Functions のローカル実行をするために App Settings が必要になったため **[こちらの記事](https://qiita.com/TsuyoshiUshio@github/items/190437a7099ded9ce731#%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E5%AE%9F%E8%A1%8C%E3%81%AE%E3%81%9F%E3%82%81%E3%81%ABapp-settings-%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B)** を参考に App Settings を Azure Functions 上から取得しようと試みたのですが、いくつかの箇所で引っ掛かってしまいました。

そこでその引っ掛かった箇所について情報を共有しておきたいと思います。


# 手順

## Azure CLI

そもそも論ですが, 今回の作業を行うにあたっては **[Azure CLI](https://docs.microsoft.com/ja-jp/cli/azure/install-azure-cli-windows?view=azure-cli-latest&tabs=azure-powershell)** が必須です。
そのため Powershell 用の Azure CLI ツールを導入する必要があります。

```powershell:powershell
Invoke-WebRequest -Uri https://aka.ms/installazurecliwindows -OutFile .\AzureCLI.msi; Start-Process msiexec.exe -Wait -ArgumentList '/I AzureCLI.msi /quiet'; rm .\AzureCLI.msi
```

Mac の場合は **[こちらの方法](https://docs.microsoft.com/ja-jp/cli/azure/install-azure-cli-macos?view=azure-cli-latest)** を参考に導入可能です。

```zsh:zsh
brew update && brew install azure-cli
```


## Azure Functions Core Tools

まず 2020/07/19 現在, **`azure-functions-cli`** は deprecated となっているためインストールすることができません。
その代わりに **[azure-functions-core-tools](https://www.npmjs.com/package/azure-functions-core-tools)** がリリースされているので, こちらをインストールするようにします。

今回は v3 をインストールしました。

```powershell:powershell
npm i -g azure-functions-core-tools@3 --unsafe-perm true
```

これで晴れて **`funcコマンド`** が利用できるようになります。



## az login / az account set

上記を導入した状態ですぐに func コマンドを実行してもエラーが発生してしまい, 正常に動作しません。
これは当たり前と言えば当たり前なのですが, Azure にログインしていない状態でリソースにアクセスしようとしているため発生しています。

そのため, まずは何はともあれログインをしなければなりません。
以下のコマンドを実行し, ログインダイアログに従ってログインを済ませてください。

```powershell:powershell
az login
```

また, サブスクリプションが複数ある場合には利用するサブスクリプションを選択しなければなりません。
利用するサブスクリプションを選択していない状態で func コマンドを実行すると以下のようなエラーが発生してしまいます。

> Can't find app with name "AZURE_FUNCTION_NAME"

そのため **`az account set`** コマンドを利用してサブスクリプションを設定します。
※ **[参考: 複数の Azure サブスクリプションの使用](https://docs.microsoft.com/ja-jp/cli/azure/manage-azure-subscriptions-azure-cli?view=azure-cli-latest)**

```powershell:powershell
# 以下のコマンドで選択できるサブスクリプションの一覧を表示できます
az account list --output table
# 以下のコマンドで利用するサブスクリプションを設定します
az account set --subscription "FOO_SUBSCRIPTION"
```

これでようやく **`funcコマンド`** を正常動作させることができるようになります。



## func azure functionapp

このコマンドを利用するには Azure Functions プロジェクトのルートディレクトリに移動する必要があるので注意が必要です。
プロジェクトのルートディレクトリへ移動したのちに以下のコマンドを実行することで, **local.settings.json** がリモートの Azure Functions 上の設定に書き換わります。

```powershell:powershell
func azure functionapp fetch-app-settings "AZURE_FUNCTION_NAME"
```



# おわりに

Azure は日々サービスが更新されており, なおかつ周辺ツールも日々追加・更新・削除されています。
そのためこの情報もすぐに現実にそぐわないもとのなってしまうと思いますが, それまでの間に誰かの助力となればと思います。
iOS Simulatorでの位置情報（location）の変更方法

学習したてのときに、バージョンが古い記事しかなく、迷ったのでメモとして残します。

## 設定方法
`Simulator > Features > Location`から選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606284/80e25a48-ace6-a496-6061-3c0cc61bd498.png)

それぞれの意味は以下の通り。

| 名前 | 説明 |
|------|------|
| None | 位置の指定なし |
| Custom Location | 座標をしてして移動 |
| City Run | 走るスピードで徐々に位置を移動 |
| City Bicycle Ride | 自転車にのったようなスピードで徐々に位置を移動 |
| Freeway Drive | 車のスピードで徐々に位置を移動 |
| Apple | アップルの本社の座標 |

## 参考
https://qiita.com/mattak/items/420039c674fe4392a647
Matplotlibを使ってデータフレームから一度に各複数の折れ線グラフを作成する

#はじめに
PythonのMatplotlibでグラフを作成する時に、１つ１つデータフレームから値を取得して何百もあるリスト分全てのグラフを作成しようとするとキリがないので一度にできる方法を試作しました。

#方法
方法は以下の通りです。
①	データフレームを読み込む
①	‘リストが重複している場合は新たなデータフレームとしてまとめておく（重複の削除）
②	Forループを使って順番にグラフを作成していく

#コード
今回はkaggleのデータフレーム（[OSIC Pulmonary Fibrosis Progression](https://www.kaggle.com/c/osic-pulmonary-fibrosis-progression)）を使用しました。ちなみに行と列の数は（1549,7）で重複をまとめると176行です。今回は176個分のグラフを一度に作成します。

①	データフレームを読み込む

```Python
import pandas as pd
train_df = pd.read_csv("train.csv")
train_df
```

①	‘リストが重複している場合は新たなデータフレームとしてまとめておく（重複の削除）

```Python
new_df = train_df.groupby([train_df.Patient,train_df.Age,train_df.Sex, train_df.SmokingStatus])['Patient'].count() #重複のカウント
new_df.index = new_df.index.set_names(['id','Age','Sex','SmokingStatus'])
new_df = new_df.reset_index()
new_df.rename(columns = {'Patient': 'freq'},inplace = True) 
new_df
```

②	Forループを使って順番にグラフを作成していく

```Python
import matplotlib.pyplot as plt
for num in new_df['id']: #inで繰り返したい項目を選択(重複を省いたデータフレームを選択(new_df))
    train2 = train_df.loc[train_df.Patient == num] #取得したいカラムの選択
    graph = plt.plot(train2["Weeks"],train2["FVC"]) #グラフのX軸とY軸の値の取得
    plt.xlabel("Weeks") #X軸の名前
    plt.ylabel("FVC") #Y軸の名前
    plt.title("{}".format(num)) #タイトル
    plt.show()
```

#結果

図のように176個分のグラフが表示されました。動画にできなかったので画像を載せて省略しています。
<img width="1246" alt="スクリーンショット 2020-07-20 10.40.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473924/bc0e3eff-9f0b-b053-8e21-1b7fb1ad85e1.png">
<img width="1250" alt="スクリーンショット 2020-07-19 15.13.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473924/5f9a9042-2d5a-16b9-aed0-7892828d4769.png">
<img width="1250" alt="スクリーンショット 2020-07-19 15.14.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473924/445871b0-704a-d9e0-7cc6-5232b30597f9.png">
Unityでベクターファイル（SVG）を扱う２（お試し編）

# はじめに

[前回](https://qiita.com/inpax23/items/f7fbb9a94f30ec00ae31)必要なアセットを導入したので、今回はさっそく使ってみたいと思います

# ベクター画像の準備
せっかくなので、かわいい女の子を使いたいと思い、
「svg画像　美少女 イラスト」で検索すると...!!!
.
.
.
.
.
.
.
.
.
.
.
.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321577/9e08e6f8-c846-89b8-af0c-d966685984bd.png)
か...**KAWAII...!!!**
# 表示
プロジェクトビューにドラッグするだけでインポートされます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321577/e3edd737-19b5-8b13-7579-3abeb8915634.png)
シーンビューにドラッグするだけで、表示してくれます。SpriteRendererを使用するようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321577/1a32c7b3-a29a-8f7c-8d07-acf0cba66d92.png)
ズームしてもドット感がないことがわかります。
![KawaiiZoom.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321577/83b3bb41-a7d3-bcb0-7602-2800c4da7b3d.gif)

# 次回
uGUI用のものや、マスク機能があるようなので、そちらも触ってみます

[Unityでベクターファイル（SVG）を扱う３（マスク＆uGUI編）](https://qiita.com/inpax23/items/4e55c225ef12575ce7d6)
# 参考
内容
[コガネブログ](https://baba-s.hatenablog.com/entry/2018/05/05/100000)
画像
<a href="https://pixabay.com/ja/users/davidblaze-1524661/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=1894776">David Shaw</a>による<a href="https://pixabay.com/ja/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=1894776">Pixabay</a>からの画像
アクセス制限(Ruby on Rails)

#プログラミングの勉強日記
2020年7月19日　Progate Lv.211
Ruby on RailsⅧ

#アクション側で共通の変数の定義
　各アクションに対尾したビューファイルはapplication.html.erbの`<%= yield %>`の部分に代入され表示される。各コントローラの全アクションで共通する処理がある場合には、`before_action`を使うと良い。`before_action`を用いることで、アクションが呼び出される際に必ず`before_action`の処理が実行されるので、全アクションで共通する処理を1か所にまとめられる。
　すべてのコントローラで共通する処理はapplicationコントローラにまとめられる。`set_current_user`メソッドを定義し、`before_action`に指定する。

```ruby:application_controller.rb
before_action :set_current_user
  @current_user=User.find_by(id: session[:user_id])
end
```

#ログインしていないときのアクセス制限
　ログインしていない場合でもURLを直接入力するとアクセスできてしまう。`@current_user`がいない場合にはログインページにリダイレクトする。この処理は他のアクションや他のコントローラでも使いたいので、applicationコントローラと`before_action`を用いて処理を共通化する。

```ruby:application_controller.rb
def autheniticate_user
  if @current_user==nil
    flash[:notice]="ログインが必要です"
    redirect_to("/login")
  end
end
```

onlyを用いて各コントローラで`before_action`を使うことで指定したアクションのみでメソッドを実行できる。各コントローラはapplicationコントローラを継承しているので、継承元のメソッドが使える。

```ruby:user_controller.rb
before_action :autheniticate_user, {only: [:edit, :update]}
```

```ruby:application_controller.rb
class ApplicaionController < ActionController::Base
  def set_current_user
    @current_user=User.find_by(id :session[:user_id])
  end
 ...
```

#ログインユーザのアクセス制限
　applicationコントローラ内にログインユーザを制限するという意味の`forbid_login_user`メソッドを作成。ログインユーザが存在する場合、投稿一覧ページにリダイレクトする。メソッドの実行出には`before_action`を用いてonlyで適応したいアクションを指定する。

```ruby:application_controller.rb
def fobid_login_user
  if @current_user
    flash[:notice]="ログインしています"
    redirect_to("/posts/index")
  end
end
```

```ruby:home_controller.rb
before_action :forbid_login_user, {only: [:top]}
```

```ruby:users_controller.rb
before_action :forbid_login_user, {only: [:name, :create, :login_form, :login]}
```

#ユーザ編集ページのリンク
　ユーザ詳細画面の編集リンクを自分の詳細画面のときだけに表示されるようにする。ユーザ詳細ページでログインしているユーザでない場合には編集ページへのリンクを非表示にする。

```erb:users/show.html.erb
<%# 詳細ページのユーザidとログインしているユーザのidが等しい場合 %>
<% if @user.id==@current_user.id %>
  <% link_to("編集", "users/#{@user.id}/edit") %>
<% end %>
```

このままだと編集ページのURLを直接入力すれば編集ページに入れてしまう。なので、usersコントローラのeditアクションとupdateアクションに制限をかける。正しいユーザかを確かめるという意味の`ensure_current_user`メソッドを用意して、ログイン中のユーザのidと編集したいユーザのidが等しいかを判定する。
　ログイン中のユーザのidは`@current_user.id`に編集したいユーザのidは`params[:id]`にそれぞれ代入されている。`params[:id]`で取得できる値は文字列であり、数値である`@current_user.id`で比較してもfalseとなる。<font color=blue>to_iメソッドを用いると文字列を数値に変換できる。</font>

```ruby:users_controller.rb
before_action :ensure_current_user, {only: [:edit, :update]}
def ensure_current_user
  if @current_user.id != params[:id].to_i
    flash[:notice]="権限がありません"
    redirect_to("/posts/index")
  end
end
```
firebase の onAuthStateChanged 同期処理

## 概要
firebaseのonAuthStateChangedが非同期処理だったのでpromiseで同期処理にした

## コード
```javascript=
function auth() {
return new Promise(resolve => {
    firebase.auth().onAuthStateChanged(user => {
      console.log('1')
      // userを使用した処理とかかく
      resolve()
    })
  })
}

async function sample() {
  await auth()
  console.log('2')
}
```
```
結果
> 1
> 2
```

以下の書き方だと同期処理にならない

```javascript=
async function sample() {
  await firebase.auth().onAuthStateChanged(user => {
    console.log('1')
  })
  console.log('2')
}
```
```
結果
> 2
> 1
```
tensorflow 2.2.0 を win10(GPU)で動かす

tensorflow-gpu(1.15.3)からtensorflow(2.2.0)に移行しました。
その時の導入方法を紹介します。
※Intel AVX2を使うのでIntelの第二世代Coreプロセッサー(Sandy Bridge)以前の古いCPUだとインストールできません。
## python
3.5.x ～ 3.8.x を利用しましょう。
## モジュールインストール
```
pip install -U pip
pip uninstall tensorflow tensorflow-gpu tensorflow-estimator tensorboard tensorboard-plugin-wit Keras Keras-Applications Keras-Preprocessing
pip install tensorflow==2.2.0
```
## CUDA インストール
[CUDA Toolkit 10.1](https://developer.nvidia.com/cuda-10.1-download-archive-update2) をインストールしましょう。
## cuDNN の展開
v7.6.5 (November 5th, 2019), for CUDA 10.1 をダウンロードしましょう。
https://developer.nvidia.com/rdp/cudnn-download
※ログインが必要なのでログイン画面の[CREATE AN ACCOUNT]からアカウント作成(無料)してください。
ダウンロードしたzipファイルを解凍し
中身を`C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1`にコピーして下さい。
## PATHを通しましょう
これらのパスが環境変数にあったら削除しましょう

```
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0\bin
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0\extras\CUPTI\libx64
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0\include
```
次に、これら3つのパスを環境変数に設定して下さい。

```
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\extras\CUPTI\libx64
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\include
```
以上で、Win10にてtensorflow 2.2.0が利用可能になります。
お疲れさまでした。
【Rails】キャッシュについてわかりやすくまとめてみた

# 0. キャッシュとは？

リクエスト時にデータを保存しておき、次回の同じリクエストの発生時に、保存しておいたデータを再利用すること。

これにより改めてデータを生成する必要がなくなるので、パフォーマンスの高速化につながる。
キャッシュを利用した箇所はDBにアクセスしてクエリを発行しなくてよくなる。

# 1. キャッシュの保存場所

Railsのキャッシュ機能では、キャッシュの保存場所（キャッシュストア）として複数の選択肢がある。

1. ファイルストア
2. メモリストア
3. Memcache
4. Redis

他にもいくつかあるようだが、代表的なのは上の4つで、Redisを使うのが一般的らしい。
ちなみに自分の仕事では、Memchacheをキャッシュストアとして利用する[dalli](https://github.com/petergoldstein/dalli) というgemをキャッシュストアの設定に使用していた。

Railsアプリケーション上では以下のように設定する。

```config/environments/production.rb
config.cache_store = :dalli_store  # :memory_store, :redis_cache_store など設定可能。
```


# 1. Railsのキャッシュの種類

何をキャッシュするのか？に基づいて以下の3種類がある。

1. ページキャッシュ
2. アクションキャッシュ
3. フラグメントキャッシュ

よく使われるのはフラグメントキャッシュで、ビューのロジックの一部分をキャッシュする。
これはgemを追加せずにデフォルトで使用できる。

# 2. フラグメントキャッシュとは？

以下のような理解。

```
1. `cache` メソッドを使用。
2. 指定した引数から生成されるキーを元に、
3. ブロックに渡したビューのロジックをキャッシュする。
```

サンプルコード

```erb
<% @products.each do |product| %>
  <% cache product do %>
    <%= render product %>
  <% end %>
<% end %>
```

Railsガイドの例。
ここでは `product` というオブジェクトをキーとし、 `product` というパーシャルをキャッシュしている（ややこしい）。

# 3. 注意点

当たり前ではあるが、同一リクエスト内で同じキーを2回利用すると、意図しない挙動になってしまうので、ビュー内で一意である必要がある。

例えばこんな感じ。

app/views/products/index.html.erb

```erb
<%#= bad %>
<% @products.each do |product| %>
  <% cache product do %>
    <%= render product %>
  <% end %>
<% end %>
...
<% product = @products.first %>
<% cache product do %>
  <%= render item %>
<% end %>

<%#= good %>
<% @products.each do |product| %>
  <% cache product do %>
    <%= render product %>
  <% end %>
<% end %>
...
<% item = @items.first %>
<% cache item do %>
  <%= render item %>
<% end %>

```

例が分かりづらいかも。。

# 4. 参考リンク

分かりやすく解説してくれている記事がたくさんあります。

- [Railsのキャッシュ機構 - Railsガイド](https://railsguides.jp/caching_with_rails.html)
- [Railsでクエリ結果をキャッシュしてDB負荷を軽減する - Qiita
](https://qiita.com/yamashun/items/bf9a3d29de749cf18f2e)
- [Railsのキャッシュ(cache)について - Qiita](https://qiita.com/tomokichi_ruby/items/2e8ffeca359f7577b316)
- [Railsのフラグメントキャッシュについて調べてみた - Qiita](https://qiita.com/suketa/items/eeae7e2196520323f694)
- [Rails のキャッシュについて - Qiita](https://qiita.com/7kaji/items/12e583ae3270b4a7c533)
- [Railsアプリを66％スピードアップ ― Railsキャッシュの完全ガイド - POSTD](https://postd.cc/the-complete-guide-to-rails-caching/)
H28専門0問3

#設問2
$$\frac{dy}{dx}\cos^2x = \sin x \sin^2y$$

$$\int \frac{dy}{\sin^2y} = \int \frac{\sin x}{\cos^2x} dx$$
$$-\frac{1}{\tan y} = -\frac{1}{\cos x} + C $$

#設問4
$$ y = c_1e^x + c_2e^{2x}$$
iOS14でのコピペ内容(UIPasteboard)取得警告について ※Firebase DynamicLinksを導入している場合は要注意！

# おことわり

この記事は、iOS 14 Beta2 での情報を元に書いています。
バージョンアップなどにより最新の情報と異なっている可能性がありますので、ご注意ください。

# 前置き

iOS 14 Betaに[アプリがコピペ内容を読み取るとOSによって通知される機能](https://japanese.engadget.com/ios14-clipboard-095008858.html)が追加されました。
従前に[TikTokなど多くのアプリがコピペの内容を読み取っている](https://japanese.engadget.com/jp-2020-03-16-tiktok-ios.html)という指摘がWebニュースで流れていたので、それがトリガーとなって仕様追加されたようですね。

実装ベースで言うと、↓こんな感じのコードを書いている場合。。。

```swift
let foo = UIPasteboard.general.string
```

コードが実行されたタイミングで、OSから警告が表示されます。
Androidのトーストのような感じのバナー表示です。
※betaバージョンのスクリーンショットはAppleのNDA条項によって掲載できません。

文言は、
『*{値を取得したアプリ名}*（*{値をコピーしたアプリ名}*）からペースト』
です。
（ベータ時点なので今後変わる可能性が大ですが）

ユーザーに対してペーストボードへアクセスすることを明示しているアプリの場合は問題ないかと思いますが、
そうでないアプリの場合は、
「ペーストボードにアクセスすることをユーザーに明示する」
あるいは
「そもそもペーストボードにアクセスしないようにする」
など、セキュリティ上の懸念を抱かせないようにする対応が必要かと思います。

# 導入ライブラリに要注意！

ここからがこの記事の本題です。

**「アプリ本体としてはUIPasteboardにアクセスしていなくても、導入ライブラリ内でアクセスしている」**というケースがありそうです。

一例ですが、Firebase DynamicLinksにおいては、
ディープリンクの制御のために従来からUIPasteboardを使っていたらしく、Ver6.28.0以降では修正済みだそうです。
https://firebase.google.com/support/release-notes/ios#dynamic-links
上の警告を出させないためには、Ver6.28.0以降にアップデートして、かつ、info.plistに設定が必要らしいです。
（上のrelease-notes内の記述を参照）

※なお、ペーストボードの取得を無効に設定した場合はディープリンクの制御に制約がある模様です。
【参考】https://github.com/firebase/firebase-ios-sdk/issues/5893#issuecomment-657724741

他にも同じようなライブラリはあると思われ、対応タイミングや方法はまちまちかと思います。
早めにアプリの動作確認、導入ライブラリの調査、ライブラリのバージョンアップの検討などを行っておいた方が無難そうです。
【Docker】コマンド一発で Jupyter 環境をつくる 🪐 【Anaconda】

# Dockerfile をつくる

```
touch Dockerfile
```

```dockerfile
FROM ubuntu
RUN apt-get -y update && \
    apt-get install -y \
        sudo \
        wget \
        vim
WORKDIR /opt
RUN wget https://repo.anaconda.com/archive/Anaconda3-2020.02-Linux-x86_64.sh && \
    sh /opt/Anaconda3-2020.02-Linux-x86_64.sh -b -p /opt/anaconda3 && \
    rm -f Anaconda3-2020.02-Linux-x86_64.sh
ENV PATH /opt/anaconda3/bin:$PATH
RUN pip install --upgrade pip
WORKDIR /
RUN mkdir /code
CMD ["jupyter", "lab", "--ip=0.0.0.0", "--allow-root", "--LabApp.token=''"]
```

# docker build する

```
docker build . -t jupyter
```

完了するまで 5 分くらいかかるかも

# docker run する

ファイルを保存したいディレクトリに移動してから以下を実行

```
docker run -p 8888:8888 -v $(pwd):/code --name jupyter jupyter 
```

# ブラウザで Jupyter にアクセス

ブラウザで http://localhost:8888 にアクセス

# こんな画面になれば OK

![screenshot-localhost_8888-2020.07.19-14_49_08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238922/11832f50-0a19-5160-64c0-caa3c5f83dd7.png)

`/code` ディレクトリに作成したファイルはホストにも保存されます。

# 参考記事

https://datawokagaku.com/startjupyternote/
npm installしたのにcommand not foundになる！

#npmでパッケージインストール

```shell
npm install -g asar
```
#コマンドで起動

```shell
$ asar --help

bash: asar: command not found
```

インストールしたのにエラーになる！？

#解決法

```
$ npm install --save asar 
$ asar --help

Usage: asar [options] [command]

Manipulate asar archive files

Options:
  -V, --version                         output the version number
  -h, --help                            display help for command、、、
```

グローバルではなくローカルでインストールしたら動きました☺️
ReceiptLineをCLIでSVG変換

レシート記述言語[ReceiptLine](https://github.com/receiptline/receiptline)は[npmで提供](https://www.npmjs.com/~receiptline)されている。
[マクドナルドのレシートを再現した](https://qiita.com/eggplants/items/be1dd4b14f4d032c7ba7)際に、「[ビジュアルエディタ](http://www.ofsc.or.jp/receiptline_/designer/index.html)でなくコマンドラインから簡単に実行したいな」と思ったのでコマンド`rltosvg`を書いた。(GitHubは[こちら](https://github.com/eggplants/receipts/blob/master/rltosvg))

## 実装

```javascript:rltosvg
#!/usr/bin/node

// $ npm -g install receiptline
// $ ./rltosvg <cpl int> <encoding> <import filepath> <export filepath>
const usage = './rltosvg <cpl int> <encoding> <import filepath> <export filepath>';

// print args
// console.log(process.argv);
const args = process.argv;
if (args.length !== 6) throw `Err: ${usage}`;

// read lib
const receiptline = require('receiptline');
const fs = require('fs');

// configrate
const option = {
    cpl: parseInt(args[2]),
    encoding: args[3],
    upsideDown: false,
    gamma: 1.8,
    command: 'svg'
};

// import
const input = fs.readFileSync(args[4], 'utf8').toString();

// compile
const data = receiptline.transform(input, option);

// export
fs.writeFile(args[5], data, {flag: 'w'}, (err) => {
  if (err) throw err + "\nErr: export";
  console.log('Success.');
});
```

## 実行例

ハマりどころは、エンコードを日本語を含んだときは`cp932`、英語のみなら`cp437`にするところ

```bash
./rltosvg 48 cp932 code.rl out.svg
```

## 問題点

~~この方式だと、現時点でbase64画像が表示できない
解決方法募集中です~~
`v1.0.2`で修正済み
AIZU ONLINE JUDGE の問題をSwiftでやってみた(組み合わせ最適化　組み合わせ編)

##トピック #1　組み合わせ
[AIZU ONLINE JUDGE](https://onlinejudge.u-aizu.ac.jp/courses/library/7/DPL/1)の問題にSwiftで解答したものになります。競技プログラミングは普段やりませんので、こうしたほうが簡単！などがあればコメントで教えて下さい。
[ブラウザでプログラミング・実行ができる「オンライン実行環境」paiza.IO](https://paiza.io/projects/g8pB6rEnJeIh4YLStunrNg)でテスト出力が行えます

### 1_A コイン問題
**問題**
額面がc1, c2,..., cm　円の　m　種類のコインを使って、 n 円を支払うときの、コインの最小の枚数を求めて下さい。各額面のコインは何度でも使用することができます。

**解答**

```Swift
import Foundation

let rl = readLine()!.split(separator: " ").map({Int($0)!})
let weight = rl[0]//重さ
let n = rl[1]//コインの種類の数

let rlItems = [[Int]]()//readLine()!.split(separator: " ").map({Int($0)!})
for i in 0 ..< N {
    let rlItem = readLine()!.split(separator: " ").map({Int($0)!})
    items.append(rlItem)
}
var c = [[Int]](repeating: [Int](repeating: 0, count: weight+1), count: n+1)
c[0] = [Int](repeating: 1000, count: weight+1)
c[0][0] = 0

for i in 1 ..< n+1 {
    for j in 1 ..< weight+1 {
        if j >= items[i] {
        c[i][j] = min(c[i-1][j], c[i][j-items[i]]+1)
        } else {
            c[i][j] = c[i-1][j]
        }
    }
}

print(c.last!.last!)
```

### 1_B 0−1ナップサック問題
**問題**
価値が vi 重さが wi であるような N 個の品物と、容量が W のナップザックがあります。次の条件を満たすように、品物を選んでナップザックに入れます：
選んだ品物の価値の合計をできるだけ高くする。
選んだ品物の重さの総和は W を超えない。
価値の合計の最大値を求めてください。

**解答**

```Swift
import Foundation

let rl = readLine()!.split(separator: " ").map({Int($0)!})

let N = rl[0]
let W = rl[1]

var items = [[Int]]()

for i in 0 ..< N {
    let rlItem = readLine()!.split(separator: " ").map({Int($0)!})
    items.append(rlItem)
}

var dp = [[Int]](repeating: [Int](repeating: 0, count: W+1), count: N+1)

for i in 1 ... N {
    for w in 1 ... W {
        if items[i][1] <= w {
            dp[i][w] = max(dp[i-1][w], dp[i-1][w-items[i][1]]+items[i][0])
        } else {
            dp[i][w] = dp[i-1][w]
        }
    }
}
print(dp)
```

### 1_C ナップサック問題

**問題**
1_Bの問題に、同じものを複数選択しても良いという条件を追加したものです。


**解答**

```Swift
import Foundation

let rl = readLine()!.split(separator: " ").map({Int($0)!})

let N = rl[0]
let W = rl[1]

var items: [[Int]] = [[0,0]]

for i in 0 ..< N {
    items.append(readLine()!.split(separator: " ").map({Int($0)!}))
}
print(items)

var dp = [[Int]](repeating: [Int](repeating: 0, count: W+1), count: N+1)

for i in 1 ... N {
    for w in 1 ... W {
        if items[i][1] <= w {
            dp[i][w] = max(dp[i-1][w], dp[i-1][w-items[i][1]]+items[i][0], dp[i][w-items[i][1]]+items[i][0])
        } else {
            dp[i][w] = dp[i-1][w]
        }
    }
}
print(dp.last!.last!)
```
Jupyterのipynbファイルを解析してviewerを作ってみた話

# ipynbファイル

JupyterのノートブックはIPythonノートブック(拡張子ipynb)という形式で保存されます。
この中身はJSONなので、エディタで開いてコードを読んだりできるのですが、改行コードが含まれていたり、画像がエンコードされていたりと流石にテキストエディタだけでは読みにくいので、ビューアを自作しました。

github: https://github.com/exyrias/ipynb_viewer.git

特徴としては

- HTML+JavaScriptのみで作ったブラウザで動くビューア
- 外部ライブラリを使っていないので、環境に依存せずオフラインでも動く
- 申し訳程度に画像の拡大縮小ができる

シンタックスハイライトはできていないですが、画像とかpandasの表の確認程度はできます。

※実際にはビューアはもっといいものがありますので、実用的にはそちらを使ったほうがいいと思います。個人的にはVSCodeのビューアが軽くなって画像のサイズ変更ができると嬉しい。

参考：https://dev2prod.site/jupyter/ipynb-viewer/


# サンプル画像

![sample.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156722/29b0add6-f758-d244-af68-9c781eca72b3.png)

# ダウンロードと使い方

[github](https://github.com/exyrias/ipynb_viewer.git)のページからviewer.htmlをダウンロードするかbookmarklet.urlの中身をブックマークのURL欄にコピーすれば使えます。

使い方はページを開いたあと「ファイルを開く」からipynbファイルを指定するだけです。

# 解説

ipynbファイルの中身はJSONでcellsにコードや出力結果がリストで保存されています。

```json
{
  "cells": [
    ...
  ],
  "metadata": ...,
  ...
}
```

cellsのリストが順番にセルになっていて、それぞれのセルは以下のようなデータが保存されています。
(サンプル画像の第２セル)
他にもPythonのバージョン情報などが保存されていますが、ビューアには使わないので省略します。

```
{
 "cell_type": "code",
 "execution_count": 2,
 "metadata": {},
 "outputs": [
  {
   "name": "stdout",
   "output_type": "stream",
   "text": [
    "sample text <stdout>\n"
   ]
  }
 ],
 "source": [
  "print(\"sample text <stdout>\")"
 ]
},
```

execution_countが "In [2]" と表示される実行時のカウンタで、"source"が入力部分、"outputs"が出力部分になります。
"outputs"は標準出力や変数を直に出力した場合などの混合があるため、リスト形式になっています。
出力形式の種類はリストのそれぞれの要素の"output_type"で確認できます。
自作したビューアでは以下のものに対応しています。

| output_type    | 種類                                  |
|:---------------|:-------------------------------------|
| stream         | 標準出力（`print`等で出力した結果)       |
| display_data   | 画像出力                              |
| execute_result | コードの最後に変数を直に記述した場合の出力  | 
| error          | エラー出力                             |

種類に応じて、データの読み取り方や表示の仕方を変えることになりますが、詳細は割愛します。

## ビューアのhtmlの構造
ビューアでは上記の内容をもとにhtmlのdiv要素を作っていきます。

![page_design.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156722/bb207c8b-7985-9b48-c5e7-700d03a5524a.png)

最初にimgareaというdiv要素を作っておいて、その中にセルを追加していきます。

入力と出力共通でpromptというクラスがあります。これは"In [1]"や"Out[1]"などの表示に対応します。
出力ではこのOut[1]は１つのセルの中で１つしか表示されないはずですが、Jupyterの構造的には個々のデータごとに用意されているみたいです。
（今回ビューアを作って初めて標準出力は"Out[1]"とかが表示されないことに気づきました。）

input-holderとinputクラスが入力に対応していて、ipynbの"source"の中身を表示します。
input-holderは出力と対応をわかりやすくするために入れているだけで、大きな役割はありません。

output-holderが"outputs"に、outputが"outputs"の個々の要素に対応します。
出力の種類(output_type)に応じてoutputXXXというクラスを変えています。

# 感想

すでにいろんなビューアがあることに気づかず自作してしまいましたが、JavaScriptとCSSの練習にはなったからまあいいか。
【CakePHP2】想定していないページにリダイレクト(転送)される

#概要
以前、CakePHPのブログチュートリアル(https://book.cakephp.org/2/ja/tutorials-and-examples/blog/blog.html )に沿って、ログイン機能付きの掲示板を作成しました。
今回は、パスワードを忘れた方のために、パスワード再設定機能を追加しました。
再設定ページでは、新パスワード入力後にログインページにリダイレクトされるようにコードを書きました。
実際に再設定からログインまでやってみると、10回に1回くらいの割合でログイン後に再設定ページへリダイレクトされる事が起こりました。

#解決方法
###ログイン後の転送先を指定する。
↓修正前
このコードではredirectUrl()に転送先を指定していない。

```UsersController.php
public function login() {
   if ($this->request->is('post')) {
      if ($this->Auth->login()) {
         $this->Flash->success(__('ログインしました'));
         $this->redirect($this->Auth->redirectUrl());
      } else {
         $this->Flash->error(__('メールアドレスまたはパスワードが無効です、再度お試しください'));
      }
   }
}
```

↓修正後

```UsersController.php
public function login() {
   if ($this->request->is('post')) {
      if ($this->Auth->login()) {
         $this->Flash->success(__('ログインしました'));
         //ログイン後リダイレクト先の設定
         $this->redirect($this->Auth->redirectUrl(array('controller' => 'posts', 'action' => 'index')));
      } else {
         $this->Flash->error(__('メールアドレスまたはパスワードが無効です、再度お試しください'));
      }
   }
}
```

このようにredirectUrl()に転送先を指定することで、この問題が解決された。

##ではそもそも、"$this->Auth->redirectUrl()"は何を返すのか？
redirecutUrl()メソッドは以下の優先順位でURLを返す。(引用：CakePHP2 定番レシピ119)
###①セッションにURLが保存さていればそのURL
AuthComponentでは、非ログイン状態でログインが必要なURLがリクエストされた場合は、そのURLをセッションに保存した上でログインページに転送する。
・この処理のメリット
掲示板で「新規投稿をするためにはログインしている必要がある」場合、非ログイン状態で新規投稿リクエストを受けたら、ログインページに転送しログイン完了時に新規投稿ページに転送されるという動作を実現できる。
###②AuthComponentのloginRedirectプロパティにURLが指定されていればそのURL
ログイン完了後にもとのURLではなく、指定したURLに戻りたい場合は、redirectUrl()メソッドを使用して戻り先URLを指定する。redirect()はセッションに保存された戻り先URLの書き換えを行う。（今回の問題の解決方法）
###③デフォルトのURL(/)
上２つのどちらにも当てはまらない場合は、デフォルトのURLに転送される。

以上となります。
JavaSE11Silverまとめ

JavaSE11から追加された機能
javaコマンドで.javaファイルを直接実行できる。
javac -d 出力先 ソースファイル名(.java)

クラスパス指定
javac -cp クラスパス（クラスファイルが存在するディレクトリ） ソースファイル名(.java)
java -cp クラスパス（クラスファイルが存在するディレクトリ） 完全修飾クラス名(.class)
例）カレントからtemp/temp2/test.javaを実行したい場合
java -cp ./temp/temp2 test

逆アセンブル
javap -c クラスファイル名(.class)

コンパイル時、依存するクラス(import)が存在する場合、自動的にコンパイルされる。

完全修飾クラス名で記述する場合は、import宣言は不要。

java.langパッケージはインポート不要。

String... argsは可変長引数、配列のようなもの、引数の数を可変にする
メソッドの仮引数には最後に書く、一つだけ

★不明点
String intern()
String Constant Poolについて
https://programmer-life.work/java/interning-java
https://programmer-life.work/java/post-5162

switch文のdefaultはどこに書いてもよい

switch文のcaseは変数不可、finalをつければOK

ビット演算子
& and
| or
^ xor
数値を2進数にして、それぞれの桁同士のビット演算を行い、結果を返す。

Stringはnewによるインスタンス化をしなかった場合、Stringクラスが管理しているプールに文字列 が配置される。
str.intern()を使った場合、strの文字列と等しい文字列がプールに存在した場合、その文字列を返す（参照先もその文字列になる）

★Stringは読み取り専用のクラスである
replaceなどで中身を変えても代入するまでは書き換わらない（参照先が変わらない）

StringBuilderのdeleteなどの数字はインデックス（文字数ではない）

varによる変数宣言
メソッドの引数、コンストラクタの引数、メソッド戻り型、★フィールド（メンバ変数）、catchブロックなどでは使用できない、初期値が必要

アンダースコアがある数値リテラルで8進数の0のうしろに「_」をつけることができる
例）0_777

コンパイルしないで実行する
最初のクラス名にmainメソッドがないと実行時エラーになる
同名のクラスファイルが存在すると実行時エラーになる

配列は生成した時に（new）初期化される
intは0、floatは0.0、Stringはnull、booleanはfalse、charは\u0000など

★要素数0の配列を生成できる

varの配列は生成時に型を指定する

16進数は大文字でもよい

Javaにも予約語としてgotoはあるが、使用できない

★解答するときソースと選択肢は1行ずつ丁寧に読む

★配列の宣言と初期化をおさらい
テキスト№1557

★配列のfinalは配列全体の参照は変更できないが、各要素は変更できる

論理演算子
a ^ b  aとbが異なるときtrue、同じときはfalse

ビット論理演算子
| , & , ^ , ~
論理和、論理積、排他的論理和、ビットの反転
doubleからintへキャストで代入すると、小数部は切り捨て

+のように複数のオペランドを使用する演算子は型変換に注意
short hoge1 = 10;
hoge1 = hoge1 + 10;
10はint型のため、そのままでは計算できない
hoge1 = (short)(hoge1 + 10);

Boxingにおいて異なる型の暗黙の型変換は行われない
（Unboxingは変換される）
Integer fff = 10;
double ggg = fff;

if文は1文しかない場合、{}は省略できる

enum
定数をまとめて定義する

for文の式は省略できる
式1の宣言式は一つだが、カンマで複数定義はできる

到達不能コードがあるとコンパイルエラーになる

メンバ変数は自動で初期化される

オーバーロード
データ型、引数の並び、数が異なっていること
データ型が同じでも引数の並びが異なれば定義可能
戻り値の型、変数名、修飾子は関係ない
可変長引数と配列の両方があるとコンパイルエラー

オーバーロード呼び出しの優先順位
完全一致＞暗黙の型変換＞Boxing＞可変長引数

staticイニシャライザ
static { }
mainメソッドが実行される前、またはクラスファイルがロードされる前（コンストラクタの呼び出し前）に実行される

コンストラクタのアクセス修飾子でnewできるクラスを制限できる

メソッド、参照型の引数と戻り値に注意

extendsは一つだけ

this()で自クラスの別コンストラクタを呼び出す、先頭に記述する
Amazon Translateによる機械翻訳

[前回](https://qiita.com/i_12121226/items/549485d4e4ba78d1c7d9)・[前々回](https://qiita.com/i_12121226/items/50bb4f048d121c893268)はAmazon Rekognition(画像認識サービス)を試しましたが、今回はAmazon Translateという機械翻訳サービスを試してみました。

また、Rekognitionにおいては、認識したい画像ファイルをプログラム実行時の引数として試してみたのですが、Translateにおいては、翻訳したい文章をプログラム実行時の引数とするのはやや無理があるので、今回はFlaskを用いて簡単なUIを作成しました。

# Amazon Translateとは
Amazon Translateは、深層学習モデルを使用した、従来の統計ベースやルールベースの翻訳アルゴリズムよりも正確で自然な翻訳を提供する言語翻訳サービスです。Amazon Translate を使用すると、機械学習の深いスキルなしに機械学習をアプリケーションに組み込める、データを用意するだけでAPIから機械学習を利用できる、といった特徴があります。

# 実行環境

OS：Ubuntu 16.04.2
言語：Python3.6.2

```
root/
|__translate.py
|__templates/
      |__translate.html
```

# 事前準備

AWS CLI(aws configure)にて、以下の認証情報をセットしておきます。

AWS Access Key ID
AWS Secret Access Key
Default region name
Default output format

# ソースコード(translate.py)

```py:translate.py
from flask import *
import boto3

app = Flask(__name__)

@app.route('/',methods=['GET','POST'])
def index():
    return render_template('translate.html')

@app.route('/translate',methods=['POST'])
def translate():

    # 翻訳元の日本語を取得
    txt1 = request.form['txt1']

    if txt1 == '':
        return render_template('translate.html')

    # Translateのクライアントを作成
    translate = boto3.client('translate')

    # translate_textを実行(翻訳元：日本語、翻訳先：英語)
    result = translate.translate_text(Text=txt1, SourceLanguageCode='ja', TargetLanguageCode='en')

    # 翻訳元の日本語と翻訳先の英語をhtmlに引き渡す
    return render_template('translate.html',txt1=txt1,txt2=result['TranslatedText'])

if __name__ == "__main__":
    app.run(host='0.0.0.0',port=8888,debug=True)

```

# ソースコード(translate.html)

```html:translate.html
<!DOCTYPE html>
<html>
    <head>
        <title>translate</title>
        <meta charset="UTF-8">
    </head>
    <body>
        日本語→英語に翻訳します。
        <br>
        <form action="/translate" method="post">
            <!-- pythonからtxt1・txt2が連携されている場合はTextAreaにそれを表示-->
            <textarea name="txt1" rows="10" cols="50">{% if txt1 %}{{txt1}}{% endif %}</textarea>
            <textarea name="txt2" rows="10" cols="50">{% if txt2 %}{{txt2}}{% endif %}</textarea>
            <br>
            <input type="submit" value="実行">
        </form>
    </body>
</html>

```

# 簡単な解説

概略としては以下のような処理を行っています。

①画面から入力された翻訳元の日本語を取得する。
②上記①の日本語を引数としてTranslateのtranslate_textを実行する。(翻訳元：日本語、翻訳先：英語とする。)
③翻訳元の日本語と翻訳先の英語をhtmlに引き渡す。
④上記③を画面に再表示する。

# 実行結果

## コマンド

```console
python translate.py
```

## 画面

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240454/960fd3cb-5724-f509-9288-3d09f08208ab.png)


## 参考(google翻訳)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240454/c7196fa3-eafc-9db1-b784-5152ce8ca99c.png)

google翻訳とほぼ同じような結果になったと思います。

# まとめ

TranslateはRekognitionと同様に、APIから機械学習を利用できる便利なサービスです。今回は翻訳元を日本語、翻訳先を英語に固定しましたが、当然、言語自体もAPIの引数になっていて、対応言語は50を超えるようです。また、ユーザー事例としてはHotels.comなどがあるようです。
Tensorflow・kerasで構築したCNNの性能改善を行ってみる（その２ BatchNormaliztion）

今回はCNNの精度や汎化性能を向上するにはどうするかということで第二弾としてBatchNormaliztionについて書いていきます。

第一弾は下記を書きました。
[Tensorflow・kerasで構築したCNNの性能改善を行ってみる（その１ Dropout）](https://qiita.com/kazuboy/items/22ee7de246c94a8a959a)

## 前提/環境
前提となる環境とバージョンは下記となります。
・Anaconda3
・Python3.7.7
・pip 20.0
・TensorFlow 2.0.0

この記事ではJupyter Notebookでプログラムを進めていきます。コードの部分をJupyter Notebookにコピー＆ペーストし実行することで同様の結果が得られるようにしています。

##BatchNormaliztionとは

今回はBatchNormaliztionという手法についてです。BatchNormaliztionとは簡便に一言で表現すると各層に渡されるデータを平均0,分散1のする、標準正規分布に変換していまうことです。
CNNなどで層を深くすると学習が進まなくなるという問題があります、これは最初はデータにたいしてデータのスケールを合わせるなどの処理をしましたが途中の活性化関数を通っていくことでデータのスケールが崩れていきます。これらによりデータの型よりなどが勾配消失問題などにつながり学習が進まなくなっていくということが発生します。BatchNormaliztionは途中の段階でデータを正規化してしまうということで、問題を回避する手法となります。
BatchNormaliztionはデータのスケール変換などで勾配消失などの問題を回避するほかに、Dropoutとどうようにオーバーフィッティングに対する効果もあるといわれています。

## BatchNomaliztionの実装
今回も第一弾と同様にCNNのベースのモデルに層を追加する方針とします。

![モデル.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/659138/efb71b61-029e-df9a-ab85-73568c96e1d2.png)

BatchNormaliztionを追加するときには下記のソースを記載します。

```python:code
from tensorflow.keras.layers import BatchNormalization
model.add(BatchNormalization())
```

__注意__インポートの一文は最初のほうに記載すると2度目以降のBatchNormaliztionメソッド追加じに記載は必要ありません。

実際に10エポックを行ってみました。

Train on 40000 samples, validate on 10000 samples
Epoch 1/10
40000/40000 [==============================] - 400s 10ms/sample - loss: 1.3217 - accuracy: 0.5365 - val_loss: 1.4230 - val_accuracy: 0.5263
Epoch 2/10
40000/40000 [==============================] - 437s 11ms/sample - loss: 0.8555 - accuracy: 0.6988 - val_loss: 1.0776 - val_accuracy: 0.6246
Epoch 3/10
40000/40000 [==============================] - 494s 12ms/sample - loss: 0.6822 - accuracy: 0.7599 - val_loss: 1.1807 - val_accuracy: 0.6395
Epoch 4/10
40000/40000 [==============================] - 532s 13ms/sample - loss: 0.5515 - accuracy: 0.8064 - val_loss: 0.9556 - val_accuracy: 0.7014
Epoch 5/10
40000/40000 [==============================] - 544s 14ms/sample - loss: 0.4410 - accuracy: 0.8460 - val_loss: 0.9527 - val_accuracy: 0.7202
Epoch 6/10
40000/40000 [==============================] - 446s 11ms/sample - loss: 0.3327 - accuracy: 0.8841 - val_loss: 0.8538 - val_accuracy: 0.7412
Epoch 7/10
40000/40000 [==============================] - 486s 12ms/sample - loss: 0.2635 - accuracy: 0.9071 - val_loss: 0.8302 - val_accuracy: 0.7722
Epoch 8/10
40000/40000 [==============================] - 457s 11ms/sample - loss: 0.1935 - accuracy: 0.9317 - val_loss: 1.2839 - val_accuracy: 0.7080
Epoch 9/10
40000/40000 [==============================] - 462s 12ms/sample - loss: 0.1595 - accuracy: 0.9447 - val_loss: 0.9806 - val_accuracy: 0.7707
Epoch 10/10
40000/40000 [==============================] - 461s 12ms/sample - loss: 0.1380 - accuracy: 0.9506 - val_loss: 0.9174 - val_accuracy: 0.7790

Dropout、BatchNormaliztionなど対応していない場合に比べ、幾分accuracyは高まっているのと、オーバーフィッティングについても緩和されているように思えます。少ないエポック数でも効果が出ていると思います。

##まとめ
Dropoutは必要がないという議論などもあるようですが、組み合わせたほうが効果がありそうです。実際に組み込んだうえで比較してみたいと思います。
Amazon Linux2 に RStudio をインストール

## Amazon Linux のインスタンスを用意する
利用した ami は、Amazon Linux 2 AMI (HVM), SSD Volume Type。
SSH 接続して、とりあえず 

```
$ yum update
```

## R をインストールする
### EPELリポジトリを追加する

```
sudo rpm -ivh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
```
参考：[Red Hat Enterprise Linux 7にEPELリポジトリを追加する方法](https://linuxfan.info/rhel7-epel)


### インストール可能なRのバージョンを確認

```
$ yum list R
（略）
利用可能なパッケージ
R.x86_64                            3.6.0-1.el7                             epel
```

### Rをインストールする

```
$ sudo yum install R -y
```

### インストールされたバージョンを確認

```
> version
               _                           
platform       x86_64-redhat-linux-gnu     
arch           x86_64                      
os             linux-gnu                   
system         x86_64, linux-gnu           
status                                     
major          3                           
minor          6.0                         
year           2019                        
month          04                          
day            26                          
svn rev        76424                       
language       R                           
version.string R version 3.6.0 (2019-04-26)
nickname       Planting of a Tree
```

## RStudio をインストール
参考
[公式サイト　Download RStudio Server v1.3.1056](https://rstudio.com/products/rstudio/download-server/)

### ダウンロードする

```
$ wget https://download2.rstudio.org/server/centos6/x86_64/rstudio-server-rhel-1.3.1056-x86_64.rpm
``` 
=> `rstudio-server-rhel-1.3.1056-x86_64.rpm' へ保存完了 

### インストールする

```
$ sudo yum install rstudio-server-rhel-1.3.1056-x86_64.rpm
```

### RStudio Server を設定する （必要なら）

参考：[RStudio Server: サーバを設定する](http://memorandum2015.sakura.ne.jp/docs/server/configuration.html)

/etc/rstudio/rserver.conf ファイルを編集する

##### ポート
デフォルトでは 8787ポートです。変更例は、

````
www-port=80
````

##### バインド
デフォルトでは、0.0.0.0アドレスにバインドされており、どこのIPからでも接続可能。変更例は、

```
www-address=127.0.0.1
```

##### RStudio Server の再起動
インストール時に起動されているが、 conf を変更したら、再起動する。

```
$ sudo rstudio-server restart
```


### AWSのポートを開ける
AWSのセキュリティグループを確認し、該当ポートへの接続を許可していなければ許可する。


### RStudio のログインユーザを作成する
AWS に SSH 接続し、ユーザを作成する。


## SRtudioを利用する
#### ログインURL
URL は、 http://[AWSの外部IP]:8787/

#### 作成したOSのユーザでログインする
<img width="317" alt="スクリーンショット 2020-07-16 17.39.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27486/a3aa5ee3-8845-1d31-4fe4-addc7510ff5c.png">

#### RStudio の画面が表示された
<img width="1191" alt="スクリーンショット 2020-07-16 17.58.31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27486/a943de4a-d290-f565-54bf-4de8c5e01ed8.png">
【エラー解消】Catalinaのバージョンアップ後に「Could not find a JavaScript runtime.」というエラーが出た時の解消法！

# エラー内容
macOS Catalina 10.15.3 → 10.15.6 へバージョンアップした後に$bin/rspecしたら、次のエラーが発生した。

```ruby:terminal
$bin/rspec
/.../.../.../vendor/bundle/ruby/2.5.0/gems/execjs2.7.0/lib/execjs/runtimes.rb:58:in `autodetect': 
Could not find a JavaScript runtime. 
See https://github.com/rails/execjs for a list of available runtimes. (ExecJS::RuntimeUnavailable)
```
JavaScriptランタイムが見つからないというエラーが発生している。

# 環境
- macOS Catalina 10.15.6（バージョンアップ後）
- ruby '2.5.7'
- rails '5.2.3'
- rspec-rails '4.0.0.beta2'

# 解消法
**結論**：`Gemfileに「gem 'mini_racer', platforms: :ruby」を追加`

エラーのログを見るとGithubのリンクが載っているので、リンク先を確認。
確認してみると、Gemfileにmini_racerというgemを追加すると良さそう。

```ruby:Gemfile
（省略）
# See https://github.com/rails/execjs#readme for more supported runtimes
# gem 'mini_racer', platforms: :ruby
（省略）
```
Gemfileのこの部分のコメントアウトを外す。
その後、$bundle installして、
再度$bin/rspecをしてみると、正常にテストが走った。