OmniAICreator/Qiita-1.07M huggingface dataset:
Raspbian (Debian Buster)にてVNCの解像度を上げる

# ネットの情報が当てはまらない
RaspbianではRealVNCを利用できますが、初期状態では解像度が720x480と狭くて困ります。いろいろ調べたのですが、ネットに記載されているVNCの設定はどれも当てはまりません。
このサイズを変更する方法のメモ
試した環境：Raspbian Buster


# 手順
手順は至って簡単です。

- sudo vi /boot/config.txt
- 21行目当たりの以下2行のコメントを外す。

```config:/boot/config.txt
#framebuffer_width=1280
#framebuffer_height=720
```

- 再起動

**上記以外の解像度にできるかは試していません。**
---
参考：[Buster – the new version of Raspbian](https://www.raspberrypi.org/blog/buster-the-new-version-of-raspbian/)⇒Comment : 26th Jun 2019 at 5:31 pm
Android で「開発者向けオプション」を表示するには「ビルド番号」を7回タップする

Android 端末を接続したのに Android Studio が認識してくれず「No devices」や「Error running 'app': No target device found.」となってしまう場合は、「開発者向けオプション」が有効になっていない可能性がある。

通常、「開発者向けオプション」は隠されている。
これを表示するには「設定」アプリの「端末情報」にて「ビルド番号」を7回タップする必要がある。

[デバイスの開発者向けオプションを設定する  \|  Android Developers](https://developer.android.com/studio/debug/dev-options?hl=ja)

> 1. 設定アプリを開きます。
> 2. [システム] を選択します（Android 8.0 以降のみ）。
> 3. 一番下までスクロールして [端末情報] を選択します。
> 4. 一番下までスクロールして [ビルド番号] を 7 回タップします。
> 5. 前の画面に戻り、下部に [開発者向けオプション] が表示されているか確認します。

「開発者向けオプション」の中にある「USB デバッグ」をオンにすることで、Android Studio が Android 端末を認識してくれるようになる。
Scannerクラスのnext()とnextLine()について

#Scannerクラスのnext()とnextLine()について

##next()の動作
next()はスペースで分割されたトークンを検索して、見つかった順にトークンを返します。
一度スキャナから入力を取り込んだ後にトークンを返すので改行うんぬんは関係ありません。

##nextLine()の動作
nextLine()は今あるカーソルを次の行の先頭に進めます。そして、スキップした分を出力します。


```java:java
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		String str = sc.next();
		String line = sc.nextLine();

		System.out.println(str);
		System.out.println(line);

		sc.close();
	}
}
```

上のコードに対して、下のような入力をした場合にどうなるでしょうか。

```java:入力
1
abcde
```

まず、sc.next()で一番最初のトークンが返されます。
strには1が入ります。
ここでカーソルは1と改行の間に来ます。

```java:入力
1[改行コード]
 ^
 ここ
abcde
```


ここで、sc.nextLine()を実行すると、次の行の先頭にカーソルが移動します。

```java:入力
1[改行コード]
 abcde
^
ここ
```
つまりnextLine()で読み込まれたのは改行コードのみとなります。

※間違っていたり不正確な内容でしたらご指摘ください。
Sprockets::Rails::Helper::AssetNotPrecompiled in が出てコケた

####環境
Rails 5.2.3



次のエラーが出た

```
ctionView::Template::Error (Asset `application.css` was not declared to be precompiled in production.
Declare links to your assets in `app/assets/config/manifest.js`.

  //= link application.css
and restart your server):
    4:     <title>hogehogeapp</title>
    5:     <%= csrf_meta_tags %>
    6:     <%= csp_meta_tag %>
    7:     <%= stylesheet_link_tag "application", :media => "all" %>
    8:   </head>
    9:   <body>
   10:     <nav class="navbar navbar-expand navbar-dark bg-success" >
  
app/views/layouts/application.html.erb:7:in `_app_views_layouts_application_html_erb__823627666839579830_70158635396840'
```



なので
assets.rbに追記して

```config/initializers/assets.rb
#省略
Rails.application.config.assets.precompile += %w( application.css )
#省略
```

次のコマンドを実行

```
$rake assets:precompile
```

あとは

```
$rails s
```

で起動した。

完全にメモ、あとで気が向けば追記

おしまい
【全6回】Laravel5.8でTwitterっぽいSNSツールを作ってみた（まとめ）

# LaravelでTwitter風（Twitterクローン）のSNSツール開発チュートリアルというのが意外となかったので6回にまとめて書いてみた。

## 概要

スクールとかの課題だったりLaravelを初めてみたいけど何を作ろうって迷ってる人向けによくあるTwitter風のWEBサイトを作ってみました。
Laravelを使った事ない人でも作れるない様になっているので気になっている人は試してみてください。

### チュートリアル

- 第1回 [【全6回】Laravel5.8でTwitterっぽいSNSツールを作る（第1回DB設計とMigration）](https://qiita.com/namizatop/items/d79017aa474966244073)
- 第2回 [【全6回】Laravel5.8でTwitterっぽいSNSツールを作る（第2回Seeder->ログイン/新規登録）](https://qiita.com/namizatop/items/3c20c0d0565906cc6a1a)
- 第3回 [【全6回】Laravel5.8でTwitterっぽいSNSツールを作る（第3回ユーザ関連とフォロー機能）](https://qiita.com/namizatop/items/0c81b0a94a1084cda6de)
- 第4回 [【全6回】Laravel5.8でTwitterっぽいSNSツールを作る（第4回ツイートのCRUD機能）](https://qiita.com/namizatop/items/c9ed67f98fc3e5ce67c7)
- 第5回 [【全6回】Laravel5.8でTwitterっぽいSNSツールを作る（第5回ツイートのCRUD機能 編集と削除）](https://qiita.com/namizatop/items/2273bd0dcc817785b131)
- 第6回 [【全6回】Laravel5.8でTwitterっぽいSNSツールを作る（第6回コメントといいね機能）](https://qiita.com/namizatop/items/0f3f8783c93f3dfa277d)

### 第1回DB設計とMigration

WebアプリのDB設計とマイグレーションの書き方について説明した記事。
DB設計は簡略的なER図で説明しているので分かりやすいかと思います。。
またLaravelの細かな機能や設定についても触れています。

### 第2回Seeder->ログイン/新規登録

初期データのSeederとAuth認証ログインのやり方について説明した記事。
Seederの書き方や実行方法を全ファイル分書いています。
またAuth認証ログインではusersテーブルにカラムを追加した時のやり方などにも触れています。

### 第3回ユーザ関連とフォロー機能

ユーザの編集やフォロー機能の実装方法について説明した記事。
それだけでなくルーティングのResourceを使った書き方についても説明しています。

### 第4回ツイートのCRUD機能

ツイートのCRUD機能の実装方法について説明した記事。
前回触れたResourceでの操作、Eloquentを使ったCRUDの書き方について説明しています。

### 第5回ツイートのCRUD機能 編集と削除

ツイートのCRUD機能の編集と削除の実装方法について説明した記事。
前回の続きになります。

### 第6回コメントといいね機能

コメントといいね機能の実装方法について説明した記事。
ツイートに対してのコメントやいいねの付け方外し方について触れた記事です。

### 書いた人

- 名前
  - ナミザト
- 職業
  - サーバーサイドエンジニア
- 経歴
  - 2年半くらい

**[Twitter](https://twitter.com/namizatop)**
> ツイ廃です

**[Portfolio](https://namizatork.com/)**
> Laravel×Vue.jsを使ったSPAサイト


**[GitHub](https://github.com/namizatork)**
> 会社はGitLabなので全然草が生えない

**[SpeakerDeck](https://speakerdeck.com/namizatork)**
> LTやった時の資料とか
AtCoder始めました（覚えたPythonコードを備忘まで）

このたび、AtCoderを始めました。
始めた今時点での、私のスペックは以下です。

- Python歴：約半年（＝プログラミング言語歴）
- Python文法はふんわり理解（if,for,while文くらいをなんとなく書ける）
- Kaggleでコードの書き方は何となく身につけてきた
- 論理式をもっとスラスラと書きたいというモチベ

まずは、[AtCoder Beginners Selection](https://atcoder.jp/contests/abs)を解いていきます。そのなかで知らなかったコードを備忘までに残していくのが、こちらの記事です。


### 文字列の文字の出現個数をカウント
・文字列中の特定文字をカウントするには、count()メソッドを使用する

```python:
s = 'supercalifragilisticexpialidocious'
print(s.count('p'))
# 2
```
参考：https://note.nkmk.me/python-collections-counter/


### map関数の使い方
・map(function, sequence)
　⇒例：map(lambda x: x**2 , list)
・第一引数：関数（またはlambda式）
・第二引数：シーケンス(複数の値を順番に並べたかたまり)
・リスト内包表記で代替OK
　⇒例：[i*2 for i in list]
・中の要素を見るにはlist関数等で変換が必要

```python:
original_list = list(range(10)) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
mapped_list = map(lambda x: x**2, original_list)
 
print(list(mapped_list)) # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

# 上記、リスト内包表記で書くこともできる（こちらのほうがシンプル）
# コメントでご指摘頂きました、ありがとうございます！
print([x**2 for x in original_list]) # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
```
参考：https://www.sejuku.net/blog/24759


### min,max関数の使い方
・min,max関数で、list型や複数の要素における最小値・最大値を取得できる

```python:
print(min([10, 20, 30, 20, 5, 3]))
print(max('Z', 'A', 'J', 'W'))
# 3
# Z
```
参考：https://www.python-izm.com/advanced/min_max/


### 「while True:」による無限ループ
・「while True:」と書くことで無限ループが作れる
・中断させるには、"break"を入れる
・無限ループでしか書けない場合を除き，for ループで書くほうが簡潔でなおかつ速いプログラムになる（コメントでご指摘頂きました、ありがとうございます！）

```python:
num = 0
while True:
    print(num)
    num += 1
    if num == 3:
        break
# 0
# 1
# 2


# 「while True:」で書かずとも、以下でシンプルに表現できる
# コメントでご指摘頂きました、ありがとうございます！
num = 0
while num < 3:
    print(num)
    num += 1
```
参考：https://www.headboost.jp/python-while-true/



### アンダーバー（ _ ）による、変数への不可視の意味づけ
・使わない返り値に変数を割り当てるのはナンセンス
・なので、意識しなくて良い (使われない) という意図を伝える意図でのアンダーバー（ _ ）表記に
・アンダーバー（ _ ）から始まる変数は Python で不可視を意味する規約がある
・こうすることで、プログラム的に美しくなる（らしい）

```python:
# 返り値は２つだが、２つ目（img2_thresh）しか使わない
_, img2_thresh = cv2.threshold(img2, thresholod, 255, cv2.THRESH_BINARY)
```
参考：https://qiita.com/ikki8412/items/ab482690170a3eac8c76
　　　https://www.python.org/dev/peps/pep-0008/
Line bot のMessenger API使ったオウム返し(php)

Line botを使って色々やりたいと思ったので、まずは簡単なオウム返しからやってみました。
といっても[at_1016](https://qiita.com/at_1016)さんの記事[【PHP】LINE Messaging APIをつかってオウム返し BOT つくってみた](https://qiita.com/at_1016/items/9f97dc1c561182c18182)　を参考にすれば、そのままできちゃいます。本当に参考になりました、ありがとうございます。

# 困ったところだけ抜粋
実は進めていく上で、メチャクチャ詰まった点だけ備忘録として記載しておきます。
他は参考記事見れば絶対できます。

詰まったことは、**Messenger API SDK for phpのインストール先を間違っていた**ことによって、うまく作動しなかったこと！

# どう間違えたのか？
まずインストール方法は、参考記事にある通り

```terminal
$ mkdir line-bot-sdk-php
$ cd line-bot-sdk-php
$ composer require linecorp/line-bot-sdk
```

とすれば良いです。

で、間違えたのがこの先。

以下2つのファイルが必要なのですが、 `この2ファイルしかいらない` ということを読み解けなかったことです。
>今回必要となるファイルは以下の2つです。
>line-bot-sdk-tiny/echo_bot.php
>line-bot-sdk-tiny/LINEBotTiny.php

```terminal
$ cd ..
$ mkdir 新規フォルダ
$ mv line-bot-sdk-php/vendor/linecorp/line-bot-sdk/line-bot-sdk-tiny/echo_bot.php 新規フォルダ
$ mv line-bot-sdk-php/vendor/linecorp/line-bot-sdk/line-bot-sdk-tiny/LINEBotTiny.php 新規フォルダ
```

上記の `新規フォルダ` を間違えて

```
line-bot-sdk-php/vendor/linecorp/line-bot-sdk/新規フォルダ
```

としてしまい、作成した `新規フォルダ` に `echo_bot.php` と `LINEBotTiny.php` を移動してしまいました。

```
$ cd ..
```

を完全に見逃していたのです。

本来ならば `line-bot-sdk-php`　と同じ階層(つまり別フォルダとして作成)に新規フォルダを作成し、そこに必要なファイルを突っ込めばOKだったということです。

なので、もう一度やり直し(herokuのデプロイやらなんやらも)をして作成しなおしたら5分でできてしまいました。

せっかく先人達が苦労して作業して、Qiitaに残してくれているのにちゃんと読まないのは本当失礼だなと思いました笑

それでは！
vbsの作法 その39

#概要

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

#練習問題

中学生でも、使えるrpaツールを作れ。
chromeで、mouse操作できますか。

#環境

windows7 64bit

#方針

インタープリター方式
コマンドがある。
コマンドは'で始まる。
mousecontroll.dll使う。

#命令文

```
'win ohifw
'mouse 400 540
'click
ore{tab}test3{enter}"
```

#命令文の意味

アクティブウィンドウは、ohifw
マウスを400,500へ
クリック
oreタブtest3エンター

#サンプルコード

```
Dim App6
Dim Appflg
Set App6 = Createobject("OHIcompo6.srv")
WScript.ConnectObject App6, "App6_"
App6.text = "'win ohifw" & vbcrlf & "'mouse 400 540" & vbcrlf & "'click" & vbcrlf & "ore{tab}test3{enter}"
Sub App6_exit()
	Appflg = 2
End Sub
Sub App6_ok()
	Dim sh
	Dim m
	Dim lines
	Dim win
	Dim n
	Dim a(100)
	Dim b(100)
	Dim c(100)
	Dim d(100)
	Dim line
	Dim lin
	Dim i
	Dim j
	Dim v0
	Dim v1
	Set sh = CreateObject("WScript.Shell")
	lines = Split(App6.text, vbCrLf)
	For i = 0 To UBound(lines)
		If Left(lines(i), 4) = "'win" Then
			win = Mid(lines(i), 6)
			lines(i) = ""
		End If
		If Left(lines(i), 2) = "'{" Then
			v0 = i + 1
			lines(i) = ""
		End If
		If Left(lines(i), 2) = "'}" Then
			v1 = i - 1
			lines(i) = ""
		End If
	Next
	If v0 > 0 Then
		line = Split(lines(v0), ",")
		For i = 0 To UBound(line)
			If line(i) = "$a" Then
				For j = v0 + 1 To v1
					lin = Split(lines(j), ",")
					a(j - v0 - 1) = lin(i)
				Next
			End If
			If line(i) = "$b" Then
				For j = v0 + 1 To v1
					lin = Split(lines(j), ",")
					b(j - v0 - 1) = lin(i)
				Next
			End If
			If line(i) = "$c" Then
				For j = v0 + 1 To v1
					lin = Split(lines(j), ",")
					c(j - v0 - 1) = lin(i)
				Next
			End If
			If line(i) = "$d" Then
				For j = v0 + 1 To v1
					lin = Split(lines(j), ",")
					d(j - v0 - 1) = lin(i)
				Next
			End If
		Next
		For i = v0 To v1
			lines(i) = ""
		Next
		n = v1 - v0 - 1
	End If
	m = sh.AppActivate(win)
	WScript.Sleep(500)
	If m Then
		For j = 0 To n
			For i = 0 To UBound(lines)
				If Left(lines(i), 6) = "'mouse" Then
					line = Split(lines(i), " ")
					sh.Run "%windir%\System32\rundll32.exe MouseControll.dll, _SetMouseXY@16 " & line(1) & "," & line(2)
				End If
				If Left(lines(i), 6) = "'click" Then
					sh.Run "%windir%\System32\rundll32.exe MouseControll.dll, _LeftClick@16"
				End If
				If lines(i) = "" Then
				ElseIf lines(i) = "$a" Then
					sh.SendKeys a(j)
				ElseIf lines(i) = "$b" Then
					sh.SendKeys b(j)
				ElseIf lines(i) = "$c" Then
					sh.SendKeys c(j)
				ElseIf lines(i) = "$d" Then
					sh.SendKeys d(j)
				Else
					sh.SendKeys lines(i)
				End If
				WScript.Sleep 500
			Next
		Next
	Else
		MsgBox "ウィンドウが見つかりません。" 
	End If
	Set sh = Nothing
End Sub
Do
	WScript.Sleep(100)
	App6.ping
Loop until Appflg = 2
Set App6 = Nothing


```

以上。
vbsの作法 その38

#概要

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

#練習問題

中学生でも、使えるrpaツールを作れ。
mouseの位置、取れますか。

#サンプルコード

```
Dim App6
Dim Appflg
Set App6 = Createobject("OHIcompo6.srv")
WScript.ConnectObject App6, "App6_"
Sub App6_exit()
	Appflg = 2
End Sub
Sub App6_ok()
	Dim sh
	Set sh = CreateObject("WScript.Shell")
	WScript.Sleep(500)
	sh.Run "%windir%\System32\rundll32.exe MouseControll.dll, _GetMouseXY@16"
	Set sh = Nothing
End Sub
Do
	WScript.Sleep(100)
	App6.ping
Loop until Appflg = 2
Set App6 = Nothing
```

以上。
Proxy環境下でのpipを用いたライブラリインストール方法とapmを用いたAtomパッケージインストール方法

# Proxy環境下でのpipを用いたライブラリインストール方法
```
pip install [ライブラリ名] --proxy=http://[ID]:[パスワード]@[IPアドレス]:[ポート番号]
```

# Proxy環境下でのAtomのパッケージインストール方法
```
apm config set https-proxy http://[ID]:[パスワード]@[IPアドレス]:[ポート番号]
apm install [パッケージ名] [パッケージインストールPATH]     #ex) パッケージインストールPATHの例 /user/Appdata/Local/atom/bin
```

# まとめ
- Proxy環境下でのpipでのライブラリインストール方法とAtomパッケージインストール方法をまとめた
- 自分がProxy環境下での環境構築に苦戦したため、同じように苦戦する方が少しでも減れば幸いです
shift_jis のcsvファイルをutf-8のjsonに変換する

官公庁や企業が配布しているcsvデータは、文字コードがshift_jis形式が多く、そのままではちょっと使い回しがしづらい。

そこで、ダウンロードしたcsvファイルの文字コードをutf-８に変換しつつ、同時にjsonに変換してみた。


# やること
- Node.js でcsvの文字コードを変換後、json形式に変換して保存


# 使用パッケージ

- [fs](https://nodejs.org/api/fs.html)
- [iconv-lite](https://www.npmjs.com/package/iconv-lite)
- [convert-csv-to-json](https://www.npmjs.com/package/convert-csv-to-json)


# 流れと前提

csvファイルはすでにダウンロード済みの状態とする。

以下

- 元のcsv
    - original.csv
- 一時的に文字コード変換したcsv
    - temp.csv
- 最終的に出力したいjsonファイル
    - destination.json

とします。処理の順番は以下の流れで行います。


1. original.csv をfsで読み込み
2. iconv-lite を利用して、文字コードを shift_jis から utf-8 に変換、一時的にtemp.csv に保存
3. convert-csv-to-json を利用してjsonファイルに出力

# 書いてみた


csvのファイルサイズが大きいと文字コード変換に想定外の時間がかかる場合もある。

このため、今回はPromiseオブジェクトを生成して、確実に文字コード変換が終わってからJSON変換を行う様に書いてみました。

```javascript

const fs = require('fs');
const iconv = require('iconv-lite');
const csv=require('convert-csv-to-json');
 
genCSV().then(res => {
  const fileInputName = 'temp.csv'; 
  const fileOutputName = 'destination.json';
  csv.fieldDelimiter(',') .getJsonFromCsv(fileInputName);
  csv.generateJsonFileFromCsv(fileInputName,fileOutputName);
  console.log('destination.json has been saved!');

 });

function genCSV(){
  return new Promise((resolve, reject) => {
   fs.readFile('./original.csv' , function(err, data){        
      const buf    = new Buffer.from(data, 'binary');  
      const retStr = iconv.decode(buf, "Shift_JIS"); 
      fs.writeFile('temp.csv', retStr, (err) => {
      if (err) throw err;
      console.log(temp.csv has been saved!');
      resolve(retStr);  
    });
  });
 });
}


```

※冗長なので、もう少しスッキリかけないか調べる。

# 参考

https://www.npmjs.com/package/convert-csv-to-json
https://www.npmjs.com/package/iconv-lite

https://www.kakistamp.com/entry/2019/04/21/230859
https://photo-tea.com/p/nodejs-shift-jis-read/
ハイブリッドアプリとネイティブアプリの違い

##ハイブリッドアプリとは？
- HTML,CSS,JavaScriptで記述されたスマホ向けアプリ
- メリット
    - iOS,Andoroidでソースが1つ
- デメリット
    - 速度が遅い

##ネイティブアプリ
- ハイブリッドアプリ以外のアプリ
- iOS：swift,Andorid:Javaで作成する
- メリット
    - 速度が速い
- デメリット
    - ソースが2つに分かれる
matplotlibで簡単なヒストグラム・棒グラフを描く

レビューのデータセットを理解する為に、各単語の出現回数を調べる為に棒グラフ、各レビューの長さがどの程度のものが多いか調べる為にヒストグラムを求める必要があった。
#matplotlib
matplotlibの概要を掴むには[この記事](https://qiita.com/KntKnk0328/items/5ef40d9e77308dd0d0a4)が為になった。今回はデータの特徴を知りたいだけなのでpyplotモジュールだけ扱えれば問題なかった。
##棒グラフを描く
参考にした記事
[matplotlib.barのドキュメント](https://matplotlib.org/api/_as_gen/matplotlib.pyplot.bar.html?highlight=bar#matplotlib.pyplot.bar)
[matplot.barのドキュメントの下にある使用例](https://matplotlib.org/gallery/statistics/barchart_demo.html#sphx-glr-gallery-statistics-barchart-demo-py)
以下、コードの主要部分。scoreは単語の出現回数が昇順に入ったリストで
wordはscoreに対応するように各単語が入ったリストである。

```
import numpy as np
import matplotlib
import matplotlib.pyplot as plt

pos = np.arange(len(score))
plt.barh(pos, score, tick_label = word)
plt.show()
```
[matplot.barの使用例](https://matplotlib.org/gallery/statistics/barchart_demo.html#sphx-glr-gallery-statistics-barchart-demo-py)のplt.barh()を使っている部分と[matplotlib.barのドキュメント](https://matplotlib.org/api/_as_gen/matplotlib.pyplot.bar.html?highlight=bar#matplotlib.pyplot.bar)とにらめっこしてみると、plt.barh()の第一引数に表示したいデータに対応するようなpos、第二引数に表示したいデータ、表示したいデータに対応するようなラベルを第三引数にしたら上手いった。縦のヒストグラムにしたいならplt.barhをplt.barにすれば良いと思われる。

実際のグラフ
![imdb_1to50word.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513365/c1f583a5-ab35-e759-d4d7-c058e926dab8.png)

##ヒストグラフを描く
参考にした記事
[matplotlib.pyplot.hist](https://matplotlib.org/api/_as_gen/matplotlib.pyplot.hist.html?highlight=hist#matplotlib.pyplot.hist)のドキュメント
a~bの値で一つのビンを構成、としたかったのだが、調べてもよく分からず、ビン数を増やすことでなんとかそれっぽいヒストグラムを作成した。
以下コードの主要部分。変数xには各レビューの単語数が含まれている。ソートされている必要はない。

```
import numpy as np
import matplotlib
import matplotlib.pyplot as plt

plt.xticks(np.arange(0, 1001, 100))
plt.xlim(right = 1001)
plt.hist(x, bins = 200, rwidth = 10)
plt.show()
```
xticks : ヒストグラムの時と同様に各データのラベルにあたる。
xlim : 横軸の限界値。
bins : ビンの数。
rwidth : ビンの視覚的な幅

実際のグラフ
![imdb_unsup.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513365/2ba0094b-8512-f884-3b5b-05b5f62dbd6a.png)
レビューの単語数は100~200あたりに多いことがわかる。
ハンバーガーボタンについて

    <nav class="navbar navbar-expand-sm navbar-light bg-white pr-0 ">
      <button class="navbar-toggler " type="button " data-toggle="collapse " data-target="#navbar-header " aria-controls="navbar-header " aria-expanded="false " aria-label="ナビゲーションの切り替え ">
<!---button：に .navbar-toggler を追加,data-toggle.collapse 必須,data-target：折りたたんだメニューのIDかクラスを指定,aria-controls：折りたたんだメニューのIDかクラスを指定,aria-expanded：アクセシビリティ確保のためW3Cで取り決めがあります。,グループの要素が折りたたまれている場合はfalse、展開時はtrue。自動で切り替わります。aria-label：ラベル-->
<span class="navbar-toggler-icon "></span>
            </button>
      <div class="collapse navbar-collapse " id="navbar-header ">
        <ul class="navbar-nav ml-auto ">
          <li class="nav-item "><a class="nav-link " href="# ">HOME</a></li>
          <li class="nav-item "><a class="nav-link " href="# ">MENU</a></li>
          <li class="nav-item "><a class="nav-link " href="# ">SERVICERS</a></li>
          <li class="nav-item "><a class="nav-link " href="contact/index.html ">CONTACT</a></li>
        </ul>
      </div>
    </nav>
  </header>

うまくハンバーガーボタンが作れません。。。
#Rails でモデルを作らずに1行ですぐにメール送信する。 ( ActionMailer::Base.mail )

モデルなどを作らず、すぐ送信。

```rb
ActionMailer::Base.mail(from: 'from@domain.com', to: 'to@domain.com', subject: "Welcome to My Awesome Site", body: 'I am the email body.').deliver
```

```rb
ActionMailer::Base#mail: processed outbound mail in 881.3ms
Sent mail to to@domain.com (190.0ms)
Date: Sun, 13 Oct 2019 09:22:10 +0000
From: from@domain.com
To: to@domain.com
Message-ID: <5da2ecc288c87_342b142f80e5f8474e8@25c1308432ca.mail>
Subject: Welcome to My Awesome Site
Mime-Version: 1.0
Content-Type: text/plain;
 charset=UTF-8
Content-Transfer-Encoding: 7bit

I am the email body.
=> #<Mail::Message:47365763437540, Multipart: false, Headers: <Date: Sun, 13 Oct 2019 09:22:10 +0000>, <From: from@domain.com>, <To: to@domain.com>, <Message-ID: <5da2ecc288c87_342b142f80e5f8474e8@25c1308432ca.mail>>, <Subject: Welcome to My Awesome Site>, <Mime-Version: 1.0>, <Content-Type: text/plain>, <Content-Transfer-Encoding: 7bit>>
```


[actionmailer - Rails one liner email sending? - Stack Overflow](https://stackoverflow.com/questions/9535965/rails-one-liner-email-sending)

![image](https://user-images.githubusercontent.com/13635059/66713494-9b94ec00-ede6-11e9-8652-852484ac3835.png)


# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
UACダイアログの表示方法

特権が必要なプログラムを実行する際に、

![UAC.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126131/7882aee2-1454-472f-20cb-e414c1736ae5.png)

といったダイアログが出ることがあります。これは、UACが有効である場合に、制限されている特権を使用する許可を求めているものです。ただ、このダイアログはUACで制限されている特権を使用しようとすると表示されるものではありません。

例えば、timeコマンドを考えてみます。timeコマンドはシステムの時刻を変更できるコマンドで、実行にはSeSystemtimePrivilegeが必要です。ですが、この特権はUACによる特権制限の対象なので、Administratorでログインしたとしても与えられません。そして、通常の方法で起動したコマンドプロンプトから実行しようとすると、

```cmd
> time 10:00:00
A required privilege is not held by the client.
```

というエラーが出ます。つまり、UACで制限されている特権を使用しようとするだけでは、先ほどのようなダイアログは出ずにエラーになります。

では、どのようにすればダイアログを出せるかというと、ManifestをPEファイルに埋め込めばよいらしいです。

> the Visual C++ linker embeds a UAC fragment into the manifest of an application (Manifestについて1 より)

ほかにも、シェルスクリプト系の場合は管理者として実行したコマンドプロンプトから実行する[^1]か、runasコマンドを使えばUACの制約を回避できます。

いい感じのフローチャートを見つけたので、貼っておきます。何というか、このチャートがあればこの記事は読まなくてもよいですね。。 。 

![uacflowchart.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126131/908ffd6d-7ed4-e6d2-3870-5fe5f221bf30.png)
([Manifestについて1](https://docs.microsoft.com/en-us/cpp/security/how-user-account-control-uac-affects-your-application?view=vs-2019)　より)

# Manifest

これで終わるのはさみしいので、少し凝った設定を考えます。通常ユーザーを使用しているとき、管理者になることなくUACを回避することはできないでしょうか。

つまり、管理者として実行だと確かにUACの制約から逃れられるのですが、Administratorが持つすべての特権が与えられるので良くないです。さらに、管理者用アカウントの認証情報も必要です。なので、管理者に昇格(elevate)することなくUACを回避する[^2]方法が欲しくなります。

これには、Manifestで`/MANIFESTUAC:level=highestAvailable`とすればよいらしいです。

>  The application will run with the highest permission level that it can. (Manifestについて1 より)

これができると、さらに面白いことができます。Windowsでは管理者といえど与えられている特権には(デフォルトでは)限りがあります。そこで、管理者にも割り当てられていない特権を割り当てたユーザーを作り、そのユーザーでhighestAvailableなアプリケーションを実行すれば、管理者にその特権を割り当てるよりも安全に実行することができます。

ところで、UACで制限されている特権のうち、一部の特権のみ許可するにはどうすればよいのでしょうか[^3]。(単なる問題提起です)

# 参考

- UACの概要: https://www.atmarkit.co.jp/ait/articles/1006/11/news107.html
- Manifestについて1: https://docs.microsoft.com/en-us/cpp/security/how-user-account-control-uac-affects-your-application?view=vs-2019
- Manifestについて2: https://docs.microsoft.com/en-us/previous-versions/bb756929(v=msdn.10)?redirectedfrom=MSDN
- Manifestについて3: https://www.codeproject.com/Articles/17968/Making-Your-Application-UAC-Aware

[^1]: これが有効なのは、アクセストークンが子プロセスに受け継がれるからです。(参考: [Windows セキュリティ・メカニズム入門](https://www.atmarkit.co.jp/fwin2k/tutor/winsecurity01/winsecurity01_04.html))
[^2]: UACは通常ユーザーにも適用されます。管理者と通常ユーザーの差はそんなにありません。(参考: [Windows OS入門 第一回](https://www.atmarkit.co.jp/ait/articles/1406/05/news131.html))　通常ユーザーに対しても、Local Security Managerを使えば種々の特権を割り当てられますが、そうした特権はUACにより、デフォルトでは与えられません。
[^3]: ご存じの方がいらっしゃいましたら、コメントしていただけると助かります。
nodenv を使用して node.js を linux にグローバルインストール

nodenv によるバージョン管理ができるようにしながら node.js を Amazon Linux 2にインストールした時のメモです。
※解説用にフルパスに書き換えるなど、実際に使用したコマンドを修正したので間違っている箇所があるかもしれません。

## 手順
### コマンド
まずはざっと使用したコマンドを全て記載します。

```shell-session
git clone git://github.com/nodenv/nodenv.git /usr/local/nodenv
mkdir /usr/local/nodenv/plugins
git clone git://github.com/nodenv/node-build.git /usr/local/nodenv/plugins/node-build
git clone https://github.com/pine/nodenv-yarn-install.git /usr/local/nodenv/plugins/nodenv-yarn-install
cd /usr/local/nodenv && src/configure && make -C src
vim /etc/profile.d/nodenv.sh
```

```sh:/etc/profile.d/nodenv.sh
export PATH="/usr/local/nodenv/bin:$PATH"
export NODENV_ROOT="/usr/local/nodenv"
eval "$(nodenv init -)"
```

```shell-session
exit # 一度ログアウト
ssh xxxxx.xxx # リポジトリへ再度SSH
curl -fsSL https://github.com/nodenv/nodenv-installer/raw/master/bin/nodenv-doctor | bash
```

---------

### 簡単な解説
上から順に説明していきます。

#### `git clone git://github.com/nodenv/nodenv.git /usr/local/nodenv`
こちらで nodenv をリポジトリからダウンロードするのですが、
グローバルにインストールしたいので、今回は `/usr/local` へインストールしました。

### `mkdir /usr/local/nodenv/plugins`
nodenv はインストールコマンド（ `nodenv install 10.1.0` ) などを使用する場合、
プラグインとして node-build をインストールする必要があるので plugins フォルダを作成します。
フォルダ名は間違えないようにしてください。
また、個人的に node.js をインストールするときに yarn も合わせてインストールして欲しかったので、
yarn インストール用のプラグインも追加します。

### `git clone git://github.com/nodenv/node-build.git /usr/local/nodenv/plugins/node-build`
こちらが node-build です。
install は自分でやるという方は必要ないので飛ばしてください。

### `git clone https://github.com/pine/nodenv-yarn-install.git "$(nodenv root)/plugins/nodenv-yarn-install"`
こちらが yarn インストール用のパッケージです。
これを入れておくと、 `nodenv install 10.0.0` などで node.js をインストールしたときに自動で yarn もインストールしてくれます。

### `cd /usr/local/nodenv && src/configure && make -C src`
nodenv から指定されているコマンドです。

### `vim /etc/profile.d/nodenv.sh`
こちらで読み込みスクリプトを作成します。
`/etc/profile` はすべてのユーザーで読み込まれるbash_profileですが、そこに記載されている通り、
`/etc/profile.d/` フォルダにある `.sh` 拡張子のファイルを全て読み込んでくれます。
そこに、パスを通す処理や init の処理を追加してあげることで、全てのユーザーに共通化できます。
中身はこちらです。
vim以外のエディターを使用される場合は適宜変更してください。

```sh:/etc/profile.d/nodenv.sh
export PATH="/usr/local/nodenv/bin:$PATH"
export NODENV_ROOT="/usr/local/nodenv"
eval "$(nodenv init -)"
```

### この後
この後は、一旦ログアウトしてから再度アクセスすることにより
profile が読み込まれた状態＝nodenvが有効になっている状態にします。
正常にインストールされているか確認するために、公式で提供されている下記のコマンドを実行します。

```
curl -fsSL https://github.com/nodenv/nodenv-installer/raw/master/bin/nodenv-doctor | bash
```

実行したときにこのような結果が出れば成功です。

```
Checking for `nodenv' in PATH: /usr/local/nodenv/bin/nodenv
Checking for nodenv shims in PATH: OK
Checking `nodenv install' support: /usr/local/nodenv/plugins/node-build/bin/nodenv-install (node-build 4.6.4-9-g3a5ae01b)
Counting installed Node versions: 1 versions
Auditing installed plugins: OK
```

手順は以上になります。

**お読みいただきどうもありがとうございました。**
Windows10でGo言語の環境構築 with VSCode

##### こちらはVSCodeがインストール済みだという事を前提としています。

# 1.msiのダウンロード
下記からmsiファイルをダウンロードします。
https://golang.org/dl/

![goinstall.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230465/b37ede63-248f-1111-7a5e-c173e7324ee7.png)

# 2.msiからgoのインストール
1.msiをダブルクリック
2.下記の画面が出力されるので、`Next`をクリック
![go1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230465/79af731d-5515-b5fd-6a89-918d046b7afd.png)
3.ライセンスの同意画面が出てくるので、`I accept the terms in the License Agreement`にチェックが入ってる事を確認して`Next`をクリック（デフォルトではチェックボックスにチェックが入っています）
![go2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230465/e642b306-9387-c1b7-4307-43b9ebff5774.png)
4.Goのインストール先を選択（ここではC:¥Go¥にしています）
![go3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230465/9c35fb63-11fa-1401-5732-70f8d044c462.png)
5.下記の画面が出力されたら、`Install`をクリック（このアプリがデバイスに変更を加えることを許可しますか？というウィンドウは、`はい`をクリック）
![go4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230465/265b3761-fcbd-5099-b890-6592dd11db48.png)
6.インストール完了
![go5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230465/71af8b2a-1101-8dec-84ae-1c18dc43ce83.png)

# 3.Goの環境変数を設定
1.Windows10のコントロールパネルでシステムとセキュリティ→システムのシステムの詳細設定を開き、環境変数(N)...となっている所をクリックします。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230465/9ce4d6e2-2271-e156-e88e-6f2394fc63fe.png)
2.System変数の追加で、変数名を`GOROOT`、変数値を`C:¥Go¥`にします。（ここの変数値はGoのインストールされている場所です）
![go_system変数.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230465/365a0d70-8576-ac66-7d6a-184e2f052ce6.png)
3.ユーザ環境変数の追加で、変数名を`GOPATH`、変数値を作業ディレクトリにしています。（基本的に任意の場所です）
![go_ユーザ環境変数.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230465/375de69e-5f88-e716-df95-f51888ec50e8.png)

# 4.VSCodeのGo環境構築
1.VSCodeを開きます
2.VSCodeのGoの拡張機能をインストール。今回は一番上に表示されているものをインストールします。
![vscode_go_extention.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230465/8e2e1e8a-6894-fcad-0acd-a292c62edea8.png)
3.ターミナルを開き、現在のGOPATHに手動でツールをインストールします。

```sh
go get -u -v github.com/nsf/gocode
go get -u -v github.com/rogpeppe/godef
go get -u -v github.com/zmb3/gogetdoc
go get -u -v github.com/golang/lint/golint
go get -u -v github.com/lukehoban/go-outline
go get -u -v sourcegraph.com/sqs/goreturns
go get -u -v golang.org/x/tools/cmd/gorename
go get -u -v github.com/tpng/gopkgs
go get -u -v github.com/newhook/go-symbols
go get -u -v golang.org/x/tools/cmd/guru
go get -u -v github.com/cweill/gotests/...
```
# 5.GoでHello Worldの出力
1.GOPATHが設定されているディレクトリに`helloworld.go`というファイルを作成します。
2.下記のコードを`helloworld.go`に書き、保存します。

```helloworld.go
package main

import "fmt"

func main() {
	fmt.Printf("Hello World\n")
}

```
3.ターミナルで、`go run helloworld.go`を実行します。
![gorun.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230465/7f82e85a-b706-6943-53d4-6029bd6a7cb4.png)

# まとめ
Go言語を触ってみようと思い、Windows10によるGo言語の環境構築の仕方を本記事に書きました。
次はGo言語で様々なものを実装したもののコードを投稿していこうと思います。
form_withのurl解説&Ruby on Railsでログイン機能を作ろう！

Ruby on Railsでログイン機能を作ろう！
と思い立ちやってみた。

ソースコード
github:https://github.com/CoffCookie/webapp.git

***0.環境***
Rails： 5.2.3
Ruby： 2.6.3

***1.作るものを分解してみる***

ユーザ登録機能

データ
・ユーザ名
・email
・パスワード

の3つを入力して新規登録しログイン、ログアウトできるようにする。

***2.ユーザ登録機能、ログイン,ログアウト機能を作る。***

1.プロジェクト作成

```
$ rails new webapp
$ bundle exec rake db:migrate
```

2.登録画面作成

```
$ rails generate scaffold user name:string email:string
```

3.パスワード作成
https://qiita.com/chobi9999/items/20b962a324a0bdbfc0dc
上記参考にしながら追加。

まず、DBにパスワード追加

```
$ rails generate migration add_password_digest_to_users password_digest:string
```

更に、以下に追加していく

・コントローラー

```user_controller.rb
private
    def user_params
      params.require(:user).permit(:name, :email, :password, :password_confirmation)
    end
```
・モデル

```user.rb
class User < ApplicationRecord
  has_secure_password
end
```

・ビュー

```form.html.erb
  <div class="field">
    <%= form.label :password, "パスワード" %>
    <%= form.password_field :password %>
  </div>

  <div class="field">
    <%= form.label :password_confirmation, "パスワードの再入力" %>
    <%= form.password_field :password_confirmation %>
  </div>


```


***※カラムはpassword_digestだけど、
フォームやコントローラーには、password,password_confirmationとして扱う。***

ちょっとややこしい...。

・ログインフォームを作る
users_controller.rbにloginとshowloginアクション、viewにshowlogin.html.erbを作る。

```showlogin.html.erb
<%= form_with( model: user, local: true) do |form| %>
```

これでできるかなと思ったけど、うまくいかない...。

そのため、
***form_withのmodelの自動推測について調べてみる。***

抜粋：https://qiita.com/hmmrjn/items/24f3b8eade206ace17e2

```
モデルを渡したときは、URLとスコープが自動推測されます。(これまでのform_for と同じ。)
URL: @userがDBに存在するときは、updateアクションに、ないときは、createアクションに飛びます。
```

つまり、これでは、updateアクションに行ってしまい、

```
before_action :set_user, only: [:show, :edit, :update, :destroy]
```

が実行されてうまくいかないようだ。

form_withは自動推測じゃなく確実にloginアクションに行くようにするには、urlを指定するとうまくいく事がわかった。

```
<%= form_with( url: users_login_path, local: true) do |form| %>
```


では、users_login_pathはどこで見つけたのかというと...

![スクリーンショット 2019-10-13 20.06.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105573/0149b922-195b-8640-37d0-e3951fd22f8c.png)

urlの指定方法を理解するのに大分苦労していたけど、灯台下暗し...
思いっきりエラー画面のHeader欄に指定方法があった。

ちなみにroutas.rbはこうなってる。

```routas.rb
  post "users/login" => "users#login"
  post "users/logout" => "users#logout"
  get "users/showlogin" => "users#showlogin"

  resources :users
```

おまけに、
resources :usersに
new,update,show,editなど基本的なアクションは指定されていると理解。

完成！

新規登録とログイン画面が作れたので、これを元にまた何か作ろうと思う。
【powershell】 分離した濁点・半濁点を結合する

# 発端
編集業務をしていると、印刷所やデザイナーの方が Mac で作業される事情もあって届いたファイル名などの濁点・半濁点が分離しているという現象にしばしば遭遇します。エクスプローラ上では見た目が同じなのにスクリプトやソフトがエラーを起こして初めて発覚することが多いので厄介です。
各ファイルについて編集状態でバックスペースを押して確認するのも億劫ですのでスクリプトを作成しました。

# 濁点・半濁点の追加
深遠なる文字コード界隈は全容も用語も把握しきれていないのですが、コードポイントに2を足すと半濁音、1を足すと濁音になるようです。

```powershell
function addSonantMark {
    <#
        .SYNOPSIS
        濁点を追加する
        .PARAMETER s
        対象文字
        .PARAMETER asHalf
        指定時は半濁点を追加
    #>
    param (
        [string]$s,
        [switch]$asHalf
    )
    if ($asHalf) {
        [int]$adjust = 2
    }
    else {
        [int]$adjust = 1
    }
    $c = $s -as [char]
    $added = [Convert]::ToChar([Convert]::ToInt32($c) + $adjust) -as [string]
    return $added
}
```

動作は以下の通り。「あ」のコードポイントは `U+3042` 、 「ぃ」は `U+3043` なので意図した通りに動いているようです。

```
PS > addSonantMark け
げ

PS > addSonantMark は -asHalf
ぱ

PS > addSonantMark あ
ぃ
```


# 結合用コマンドレット
+ 濁点 ` ゙` ： `\u3099`
+ 半濁点 `゚` ： `\u309a`

ということで、パイプライン経由で入力された文字列中の分離した濁音・半濁音を1文字に結合するコマンドレットにまとめました。

```powershell
function Convert-UniteSonantMark {
    <#
        .SYNOPSIS
        濁点・半濁点を1つの文字に結合する
        .EXAMPLE
        "パイナップル" | Convert-UniteSonantMark
    #>
    $input | ForEach-Object {
        $ret = $_
        # 濁点処理
        $fakeSonant = [regex]::Matches($ret, ".(?=\u3099)").Value | Sort-Object -Unique
        foreach ($k in $fakeSonant) {
            $ret = $ret -replace ("{0}\u3099" -f $k), (addSonantMark -s $k)
        }
        
        # 半濁点処理
        $fakeHalfSonant = [regex]::Matches($ret, ".(?=\u309a)").Value | Sort-Object -Unique
        foreach ($k in $fakeHalfSonant) {
            $ret = $ret -replace ("{0}\u309a" -f $k), (addSonantMark -s $k -asHalf)
        }
        Write-Output $ret
    }
}
```

リネーム処理をする場合は以下のような感じです。

```
PS > $target = ls -file | ? name -match "\u3099|\u309a"

PS > $target | Rename-Item -newname {$_.name | Convert-UniteSonantMark}
```
[ゼロから作るDeep Learning]パーセプトロンでANDゲート・ORゲート・NANDゲートを分かりやすく実装してみた

# はじめに
この記事は**ゼロから作るディープラーニング ３章パーセプトロン**を自分なりに理解して分かりやすくアウトプットしたものです。
文系の自分でも理解することが出来たので、気持ちを楽にして読んでいただけたら幸いです。
また、本書を学習する際に参考にしていただけたらもっと嬉しいです。

# ANDゲート・ORゲート・NANDゲートとは
これらのゲートはパーセプトロンを元に作れる選別機のようなもので、決められた条件に合致した時だけ１を出力してそれ以外は０を出力します。簡単に言うと、機能を固定したパーセプトロンや機能を制限したパーセプトロンとも言えます。

**ANDゲート**は、２つある入力信号の両方が１の場合だけ１を出力します。
<img width="555" alt="スクリーンショット 2019-10-12 20.37.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510602/1bc75c64-460f-3a0f-2987-682ba1e06cde.png">

**ORゲート**は、２つある入力信号のうち１つ以上が１の時に１を返します。
<img width="547" alt="スクリーンショット 2019-10-12 20.39.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510602/65af2638-d240-5d01-7e48-ce4898b71b90.png">

**NANDゲート**は、ANDゲートの逆で２つある入力信号の両方が１の場合に０を返します。
<img width="544" alt="スクリーンショット 2019-10-12 20.40.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510602/95f3e05c-988b-21d7-2bb0-a92cbfb53e2f.png">


これらのゲートはパーセプトロンのパラメータを変えるだけで実装することができ、構造自体を変える必要はありません。
これがパーセプトロンの良いところであり、このメリットを活かすことでニューラルネットワークを実装していきます。

# 実際に実装してみる
今回の実装からはパーセプトロンのパラメータの１つである闘値の代わりにバイアスと言うパラメータを使っていきます。
理由としては、パーセプトロンをニューラルネットワークに進化させることを考えるとバイアスの方が適しているからです。

しかし、バイアスは闘値にマイナスをつけただけなので全く難しくはありません。
実際にバイアスを使ったパーセプトロンを図で表してみます。
<img width="571" alt="スクリーンショット 2019-10-12 20.19.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510602/ef35ad56-b219-457c-7d99-4c1d347b077b.png">
式が少し変わるだけなので難しくはありません。

**ANDゲート実装**

```python
def AND_b(x1,x2):
    x = np.array([x1,x2])#入力信号
    w = np.array([0.5,0.5])#重み
    b = -0.7#バイアス
    newlon = x*w
    newlon = newlon.sum()
    if newlon + b > 0:
        return 1
    elif newlon + b <= 0:
        return 0
```

**ORゲート実装**

```python
def OR_b(x1,x2):
    x = np.array([x1,x2])
    w = np.array([0.5,0.5])
    b = -0.4
    newlon = x*w
    newlon = newlon.sum()
    if newlon + b > 0:
        return 1
    elif newlon + b <= 0:
        return 0
```

**NANDゲート実装**

```python
def NAND_b(x1,x2):
    x = np.array([x1,x2])
    w = np.array([-0.5,-0.5])
    b = 0.7
    newlon = x*w
    newlon = newlon.sum()
    if newlon + b > 0:
        return 1
    elif newlon + b <= 0:
        return 0
```
docker run / exec や docker-compose の command / entrypoint で複数コマンドを連続して実行するには？ #docker

#  素のdockerで試してみる。

落ちるケース。第一引数に `hostname && hostname` が渡され、それ全体がコマンドと評価されている？

```
$ docker run busybox 'hostname && hostname'
docker: Error response from daemon: OCI runtime create failed: container_linux.go:345: starting container process caused "exec: \"hostname && hostname\": executable file not found in $PATH": unknown.
ERRO[0001] error waiting for container: context canceled
```

成功してるかと思いきや、実はdocker コマンド自体が終了しており、実行元で2個目のコマンドが実行されてしまっているケース。

```
$ docker run busybox hostname && hostname
b7cebfb9e802
YumaInauranoMacBook-Air.local
```

bash / sh に全部渡せして 1コマンド扱いにすれば成功するっぽい。

```
$ docker run busybox sh -c 'hostname && hostname'
957b50b9e107
957b50b9e107
```

# docker-compose

同じく全体を bash コマンドでくくるなどして1コマンド扱いにする必要があるっぽい。

```
command: bash -c 'echo "ok" && echo "ok" && echo "ok"'
```

こういうのはダメ。

```
command: echo "ok" && echo "ok"

command: bash -c echo "ok" && bash -c 'echo "ok" && echo "ok"'
```

[yaml - Using Docker-Compose, how to execute multiple commands - Stack Overflow](https://stackoverflow.com/questions/30063907/using-docker-compose-how-to-execute-multiple-commands)

sh とか ash しか入ってない場合はそちらで多分。


# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
部品化：トップに戻るボタン

#
これから効率的にウェブ開発ができるように、どんどん部品化をしていきたいと思います。
ポイントは３つです。

(1) コピペだけですぐ使える。（これを実現するために、たとえばCSSをなるべくHTMLで記述）
(2) なるべくジェネリックに使えるように。（たとえばreset.cssがあってもなくてもOK、外部参照は最小限に）
(3) 部品が増えてくると整理方法が鍵になってくるが、作りながら考えていきたいことに。

```html:parts-back2top.html

<a href="#" style="position: fixed; bottom:30px; right:30px; 
  width: 50px; height: 40px; border-radius: 50%; padding-top: 10px;
  background-color: navy; color: white; font-size: 50px; 
  text-decoration: none; text-align: center; line-height: 1;
  ">^</a>
```
エディタ[nano]の設定なの！

#はじめに
Windowsでは「Atom」を使っていたが、raspberrypiでCUIエディタを使おうと思い、「nano」を選んだ。
初期設定ではプログラムを見やすくするインデントされない設定になっている。
名前がかわいいのでこのエディタを末永く愛し、使いこなすためにもプログラミングしやすい設定にする方法をメモする。
#環境
raspbian 10.1
#変更した設定
<b>・自動インデント</b>
プログラムを書く際、適切なインデントは必要。ディフォルトのままだと、メモ帳のように自動でインデントをつけてくれないので自動的にインデントがつくようにする。
<b>・画面スクロールをスムーズに</b>
デフォルトのままだと、３行ぐらい飛んで画面スクロールするので、(好みだと思うが)非常に見にくいので、一行下にスクロールするようにする。
#設定方法
nanoの設定ファイルは`\etc`の`nanorc`というファイルで設定する。
<b>移動方法</b>


```
pi@raspberrypi: ~ $ cd
pi@raspberrypi: ~ $ cd /etc
pi@raspberrypi: ~ $ sudo nano nanorc
```

`nanorc`は以下のようになっている。(2019/10/13現在)

```
# Sample initialization file for GNU nano.
##
## Please note that you must have configured nano with --enable-nanorc
## for this file to be read!  Also note that this file should not be in
## DOS or Mac format, and that characters specially interpreted by the
## shell should not be escaped here.
(以下省略)
```

<b>自動インデント</b>
検索機能`W+Ctrl`を使って`autoindent`と入力すると、以下のようなものが見つかる。

```
#set autoindent
```
`#`を削除することで自動インデントが有効になる。

<b>スムーズな画面スクロール</b>
検索機能`W+Ctrl`で`smooth`と入力すると以下のようなものが見つかる。

```
#set smooth
```
`#`を削除することでスムーズに画面スクロールするようになる。

<b>保存方法</b>
`S+Ctrl`で上書き保存、`Z+Ctrl`でnanoを終了。
もう一度nanoを開いて動作を確かめてください！動作が変わっているはずです！

#さいごに
vimの方が一般的で様々な機能があるらしいが、いまのところnanoが使いやすいのでvimに移行するべき時がくるまで使っていきたい。

>GNU nano公式サイト
https://www.nano-editor.org/docs.php
UbuntuでSSDをマウント

# 接続したSSDを確認
どこや

    $ sudo fdisk -l

    ディスク /dev/sda: 465.8 GiB, 500107862016 バイト, 976773168 セクタ
    単位: セクタ (1 * 512 = 512 バイト)
    セクタサイズ (論理 / 物理): 512 バイト / 4096 バイト
    I/O サイズ (最小 / 推奨): 4096 バイト / 4096 バイト

ディスク `/dev/sda` これ

# パーティションの作成
ディスクの場所がわかったので、パーティションの作成を行う
p: パーティションテーブルを表示
n: 新しいパーティションを作成
w: パーティションテーブルの変更を保存して終了

    $ sudo fdisk /dev/sda

    fdisk (util-linux 2.31.1) へようこそ。
    ここで設定した内容は、書き込みコマンドを実行するまでメモリのみに保持されます。
    書き込みコマンドを使用する際は、注意して実行してください。
    
    デバイスには認識可能なパーティション情報が含まれていません。
    新しい DOS ディスクラベルを作成しました。識別子は 0x4e1f9540 です。
    
    コマンド (m でヘルプ): p
    ディスク /dev/sda: 465.8 GiB, 500107862016 バイト, 976773168 セクタ
    単位: セクタ (1 * 512 = 512 バイト)
    セクタサイズ (論理 / 物理): 512 バイト / 4096 バイト
    I/O サイズ (最小 / 推奨): 4096 バイト / 4096 バイト
    ディスクラベルのタイプ: dos
    ディスク識別子: 0x4e1f9540
    
    コマンド (m でヘルプ): n
    パーティションタイプ
       p   基本パーティション (0 プライマリ, 0 拡張, 4 空き)
       e   拡張領域 (論理パーティションが入ります)
    選択 (既定値 p): p
    パーティション番号 (1-4, 既定値 1): 
    最初のセクタ (2048-976773167, 既定値 2048): 
    最終セクタ, +セクタ番号 または +サイズ{K,M,G,T,P} (2048-976773167, 既定値 976773167): 
    
    新しいパーティション 1 をタイプ Linux、サイズ 465.8 GiB で作成しました。

    コマンド (m でヘルプ): w
    パーティション情報が変更されました。
    ioctl() を呼び出してパーティション情報を再読み込みします。
    ディスクを同期しています。

新品なので既定値エンターで楽

確認

    $ sudo fdisk -l

    デバイス   起動 開始位置  最後から    セクタ サイズ Id タイプ
    /dev/sda1           2048 976773167 976771120 465.8G 83 Linux
いた

# フォーマット
ファイルシステムはext4で

    $ sudo mkfs.ext4 /dev/sda1

# マウント
最後に任意の場所にマウントして終わり
今回は`/mnt`にマウント

    $ mount /dev/sda1 /mnt

一応、確認

    $ df -T

    /dev/sda1      ext4     479669952    73756 455160536   1% /mnt

OK
nuxt+firestoreで投稿、投稿一覧作成

# 作りたいもの

nuxt+firestoreで投稿、投稿一覧を作成。

* firestoreに投稿
* firestoreの投稿を参照してリストレンダリング
* 投稿の詳細ページへのリンク作成

# firestoreに投稿

```javascript
<script>
methods: {
    makeroom: function () {
      var db = firebase.firestore()
      db.collection('room').doc('部屋').set({
        room_title: 'room_title',
        user_id: this.$store.state.uid
      })
      .then(function (docRef) {
        console.log('Document written with ID: ', docRef.id)
      })
      .catch(function (error) {
        console.error('Error adding document: ', error)
      })
    }
  }
</script>
```

methodsでmakeroomを定義して@clickで発火させる。

# firestoreの投稿を参照してリストレンダリング

```javascript
export default {
  name: 'postsindex',
  data: function () {
    return {
      posts: []
    }
  },
  created() {
    const db = firebase.firestore()
    db.collection('room').get().then(querySnapshot => {
      querySnapshot.forEach(doc => {
        this.posts.push({
          ...doc.data(),
          id: doc.id
        })
      })
    })
  }
}
```

* getで取得した配列をquerySnapshotに
* そのquerySnapshotをforEachでまわす
* docに一つひとつ格納し、doc.dataをスプレッド演算子で展開
* それにidを追加してまとめた状態にしてpush、postsに格納していく

https://qiita.com/akisx/items/682a4283c13fe336c547#%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%AE%E5%A0%B4%E5%90%88

スプレッド演算子で展開しつつ、idを足すのはここを見た

# 投稿の詳細ページへのリンク作成

```javascript
<nuxt-link :to="{ name: 'rooms-id', params: { id: post.id } }">
```

router.jsでnameを確認して指定する。paramsのidを指定。
aptコマンド自動化のメモ

## 概要
自動化の際に知っておくと幸せになれるメモ

## 前提
 - bash (GNU bash, version 5.0.3(1)-release)
 - apt (1.8.2 (amd64))

## 基本形

```bash
#/usr/bin/env bash
set -eu # エラーキャッチと未定義変数を禁止
DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")"&>/dev/null&&pwd)" # ついでに書いときました。スクリプトのディレクトリ
export DEBIAN_FRONTEND=noninteractive # 対話promptを開かない設定
apt-get update >/dev/null || exit 1
apt-get upgrade -qq -y >/dev/null || exit 2 # upgradeの出力も完全に消せます

apt-get install -y vim >/dev/null || exit 3
(curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg|sudo apt-key add -) >/dev/null || exit 4 # 複数コマンドの結果を>/dev/nullしたい場合はカッコで囲みます。囲まないと色々困ります。
```

各コマンドは基本的に失敗しないはずで、仮に失敗した場合、作成者に相談が来ると思います。
なので経験上`&>/dev/null`とか`>/dev/null 2>&1`のようなエラー出力まで捨てる行為はしない方が良さそうです。

`export DEBIAN_FRONTEND=noninteractive`について
選択肢を明示したい場合は`debconf-set-selections`を使うとよいです。
例えば`iptables-persistent`ではこんな感じです。

```bash
echo "iptables-persistent iptables-persistent/autosave_v4 boolean true"|debconf-set-selections
echo "iptables-persistent iptables-persistent/autosave_v6 boolean true"|debconf-set-selections
apt-get install -y iptables-persistent
```

DEBIAN_FRONTENDのsource: [https://manpages.debian.org/buster/debconf-doc/debconf.7.en.html](https://manpages.debian.org/buster/debconf-doc/debconf.7.en.html)

## ifの省略について
ifは省略できますが、しないほうが良さそうです。例えば次の式は同等に見えますが、

```bash
if [ -f "${TARGET_FILE}" ];then
  echo "ls do EXISTS!"
fi

[ -f "${TARGET_FILE}" ] && echo "ls do EXISTS!" 
```

下の方は、評価の失敗時に終了コードが0以外で返ります。
後ろに`||`で繋げられることを考えれば当然なのですが、残念ながら`set -e`にキャッチされません。
関数内に書いてたりすると悲しいことになります。
また、if 文の条件式下では`set -e`にキャッチされません。

## Warning: apt-key output should not be parsed (stdout is not a terminal)
`curl "${gpg_key_server}"|apt-key add -`
とかすると発生します。

```bash
export APT_KEY_DONT_WARN_ON_DANGEROUS_USAGE=1
```
値は1でなくても何でも良いです。dockerfileとかだとDontWarnにしてる例が多いです。

## WARNING: apt does not have a stable CLI interface. Use with caution in scripts.
`apt update|grep 'Hit'`とかaptの結果をパイプすると発生します。

```bash
apt-get, apt-cache
```
とかを使いましょう。
aptは「綺麗に出力してくれるとかの気遣いがあるので出力内容は保証しない」とのことです。
docker-compose で Dockerfile みたいな COPY は書けないのか？ たぶん書けない。なぜなら… ( #docker )

- Dockerfile の COPY はイメージをビルドする時の処理。
- docker-compose.yml に書くのは、イメージに対しての操作であり、イメージ自体の操作を行うものでは無い。

と理解しているが、間違いないだろうか。

# COPY はできなくともマウントすることならできる

```
    volumes:
      - /dir/on/host:/var/www/html

```

[copy - Copying files to a container with Docker Compose - Stack Overflow](https://stackoverflow.com/questions/39176561/copying-files-to-a-container-with-docker-compose)


# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
各CIツールにおけるビルド環境の呼び方

# 概要

ユーザー自身が構築したビルドサーバーを各CIツールへ乗せるための設定を調べていた時に、そもそもの機能名が分からず困ったため自身の備忘としてまとめました。

# 対応表

今のところ把握できているものの対応表です。
他ツール、サービスについてもご存じの方いらっしゃれば教えていただきたいです。

| ツール名     | ビルド環境の名称   |
|:------------:|:-----------------:|
| Azure DevOps | Agent             |
| Jenkins      | Slave             |
| GitHub       | Runner            |
| GitLab       | Runner            |

# 各ビルド環境についてざっくり

## Azure DevOps

- Azure DevOpsの1サービスとしてAzure Pipelinesという名称でCI/CD機能が提供されている
- Agent Poolに登録されたAgentがユーザーが定義したパイプライン上でビルドサーバーとして振る舞う
- AgentにはMicrosoftがホストして提供しているMicrosoft-hosted agentsと、ユーザー自身が構築したSelf-hosted agentsの2種類ある
  - Microsoft-hosted agentsは基本的に従量課金制で使用できる(無料枠あり)
  - Self-hosted agents[^azure_pipeline_agents]はサーバー上でエージェント用のプログラムを実行しておくことで、Agent Poolに登録されてビルドサーバーとして使用することができる

[^azure_pipeline_agents]: Linuxにも対応しているようですが、Alpine LinuxベースのDockerコンテナ上ではglibc関連の問題でうまく動きませんでした。(musl libcのライブラリに対してシンボリックリンクを張ってもダメでした。)

## Jenkins[^supplement]

- 本体が動作するマスターにビルド用の環境も整っていればスレーブは必須ではないという認識
- スレーブ用のプログラム(Java製)を実行することで、マスターに登録されてビルドサーバーとして使用できる

[^supplement]: 恥ずかしながら触ったことが無いので、ふわっとしたことしか書けておりません。

## GitHub

- GitHub Actionsという名称でCI/CD機能が提供されている
- Azure DevOps同様、RunnerにはGitHubがホストして提供しているものと、セルフホスト型のものの2種類がある
  - GitHubがホストするものは、パブリックリポジトリであれば無料で使用でき、~~プライベートリポジトリであれば従量課金で使用でき~~る
    - 2020年4月にプライベートリポジトリでも**月2,000分**まで無料で利用できるようになりました。
  - セルフホスト型のものは、ユーザーが用意したサーバー上でエージェント用のプログラムを走らせておくことで使用できる
- 公式のヘルプによれば、GitHub ActionsのRunnerはAzure PipelineのAgentをフォーク[^fork]したものらしく、それもあってAzure Pipelinesと構成がかなり似ている

[^fork]: GitHubがMS傘下になったことを感じさせる仕様ですね。

## GitLab[^supplement]

- gitlab-runnerというプログラム(GO製)を実行しておくことでビルドサーバーとして使用することができる

# 参考URL

- [Azure Pipelines agents](https://docs.microsoft.com/en-us/azure/devops/pipelines/agents/agents?view=azure-devops)
- [Distributed builds](https://wiki.jenkins.io/display/JA/Distributed+builds)
- [GitHub Actionsの仮想環境](https://help.github.com/ja/articles/virtual-environments-for-github-actions)
- [GitLab Runner Docs](https://docs.gitlab.com/runner/)
Google Colaboratory で Keras 自作データセットを読み込み

## Google ColaboratoryでGoogle Driveにアクセスする方法

``` python
from google.colab import drive
drive.mount('/content/drive')
```
* 上記記載のコードを実行するとドライブにアクセスできるようになります。
* Go to this URL in a browser:との承認URLが表示されるので承認します。

``` python
!ls 'drive/My Drive'
```
* 無事アクセスできれば、lsコマンドで中身が確認できます。

## kerasで自作データセットを読み込むには
* npzファイルをローカルで作成しておき、driveにアップロードし、Google Colaboratoryで読み込む。
* ドライブのファイルに画像データを入れておき読み込む。(今回は省略)

### ローカルで自前のデータセットを作成
* まずnpzを作成します。

``` python
# データ作成　保存
import keras
from keras.utils import np_utils
from keras.layers.convolutional import Conv2D, MaxPooling2D
from keras.models import Sequential
from keras.layers.core import Dense, Dropout, Activation, Flatten
from keras.preprocessing.image import array_to_img, img_to_array, load_img
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt

import os
import re


def list_pictures(directory, ext='jpg|jpeg|bmp|png|ppm'):
    return [os.path.join(root, f)
            for root, _, files in os.walk(directory) for f in files
            if re.match(r'([\w]+\.(?:' + ext + '))', f.lower())]


# 画像一枚、確認
# temp_img = load_img('./dataset1/F0.jpg', target_size=(64,64))
# temp_img_array  = img_to_array(temp_img)
# print(temp_img_array.shape)

X = []
Y = []

for picture in list_pictures('./dataset1/'):
    img = img_to_array(load_img(picture, target_size=(64,64)))
    X.append(img)
    Y.append(0)

for picture in list_pictures('./dataset2/'):
    img = img_to_array(load_img(picture, target_size=(64,64)))
    X.append(img)
    Y.append(1)

# arrayに変換
X = np.asarray(X)
Y = np.asarray(Y)

# 中身確認
# print(type(X))
# print(type(Y))

# print(X.size)
# print(Y.size)
# print(len(X))
# print(len(Y))
# print(X)
# print(Y)


# 画素値を0から1の範囲に変換
X = X.astype('float32')
X = X / 255.0

# クラスの形式を変換
Y = np_utils.to_categorical(Y, 2)

# 学習用データとテストデータ
X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.33, random_state=111)

# npz形式へ書き出し
np.savez("/Users/test/Desktop/dataset.npz",X_train=X_train,X_test=X_test,y_train=y_train,y_test=y_test)

```

* ほぼこちらを参考にさせて頂きました。感謝です。
[https://qiita.com/haru1977/items/17833e508fe07c004119](https://qiita.com/haru1977/items/17833e508fe07c004119)

* list_picturesが私の環境のkerasのバージョンでは動かなかったため、これもググってコピペしています。
* npzが出来上がるので、あとはGoogle Driveにアップロードします。

### Google Colaboratoryでnpzを読み込む
* 私はkerasフォルダを作成しそこにnpzをアップロードしました。
* 以下、Google Colaboratoryで実行し読み込みます。

``` python
datasets = np.load("drive/My Drive/keras/datasets.npz")

X_train = datasets['X_train']
X_test = datasets['X_test']
y_train = datasets['y_train']
y_test = datasets['y_test']
```

``` python
# 中身確認
print(datasets['X_train'].shape)
print(datasets['X_test'].shape)
print(datasets['y_train'].shape)
print(datasets['y_test'].shape)
```

## 最後に
* Google ColaboratoryはGPUが使用でき、そして無料なため、ありがたい限りです。
Railsチュートリアル6章の「少し複雑な正規表現」の内容

Railsチュートリアル6章で初期の(ドットが連続するのを許容してしまう)正規表現については解説があったが改善版の少し複雑な正規表現の解説がないので、解説する

初期の正規表現が以下
> /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i

少し複雑な正規表現が以下
> /\A[\w+\-.]+@[a-z\d\-]+(\.[a-z\d\-]+)*\.[a-z]+\z/i

/\A[\w+\-.]+@[a-z\d\-]+までは同じ正規表現なので割愛


# (\.[a-z\d\-]+)* の内容は

まず\.の部分は、スラッシュでドットをエスケープしている。つまり、ここは、ドット一文字で始まるブロックとなる

[a-z\d\-.]+　はチュートリアルに以下の記載がある

> 英小文字、数字、ハイフン、ドットのいずれかを少なくとも1文字以上繰り返す

そこからドット(.)を取り除いた[a-z\d\-]+は「英小文字、数字、ハイフンのいずれかを少なくとも1文字以上繰り返す」ことを意味する
[a-z\d\-]+は()で囲われているので、これでひとかたまりとなり、*が続いている

*は0回以上の繰り返しなので、ドットを入力した場合は必ず後続に英小文字、数字、ハイフンが続いて一つのブロックとして入力されなくてはならないことを意味する

すなわち、ドットが二回続く場合は\.の次に\.が来てしまうため正規表現にマッチしなくなる