OmniAICreator/Qiita-1.07M huggingface dataset:
iOS10でもWKWebViewを使ってPOSTしたい

## はじめに
初心者のハマりどころのひとつと思われるWebViewにまつわる話です（私もiOS初心者です）。
iOS10でWKWebViewを使用してPOSTでリクエストする時、httpBodyがnilになるというバグがあるようです。
バグについては、iOS10までとiOS11以降で検証されている[こちらの記事](https://qiita.com/am10/items/23ca5b5c8fbbe7ab2b77)が分かりやすいです。
解決策は[こちらの記事](https://qiita.com/shunkitan/items/a23b0b109f434a28ab8b)を参考にしました。

## 前提条件
XCode 10.2.1
Swift4
DeploymentTarget: iOS10

## 解決案
今回は「はじめに」の[参考にした記事](https://qiita.com/shunkitan/items/a23b0b109f434a28ab8b)で紹介されている、「URLSessionDataTaskで取得したデータをWKWebViewの以下のメソッドに渡す」方法で対応しました。

まずはURLSessionでリクエストを送信する処理を追加していきます。
今回はデータをjson形式にして送ります。
do-catch内でURLSessionDataTaskにリクエストの内容を渡して、リクエストを開始します。

``` ViewController.swift
    @IBOutlet weak var webViewContainer: UIView!
    private let url = "http://xxx.xxx.x.x"
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let config = URLSessionConfiguration.default
        let session = URLSession(configuration: config, delegate: self, delegateQueue: nil)
        
        var request = URLRequest(url: URL(string: url)!)
        request.httpMethod = "POST"
        request.addValue("application/json", forHTTPHeaderField: "Content-Type")
        
        let params: [String: String] = [
            "hoge": "hoge",
            "huga": "huga"
        ]
        
        do {
            request.httpBody = try JSONSerialization.data(withJSONObject: params, options: .prettyPrinted)
            let task = session.dataTask(with: request as URLRequest)
            task.resume()
        } catch {
            print(error.localizedDescription)
        }
    }
```

URLSessionDataDelegateに、URLSessionで受け取ったデータをWebViewに渡す処理を実装します。UIを更新する処理なのでメインスレッドで行う必要があります。DispatchQueueを使ってメインスレッドでWebViewのロードを行います。

``` ViewController.swift
extension ViewController: URLSessionDataDelegate {
    
    func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive data: Data) {
        
        DispatchQueue.main.async(execute: {
            let webView = WKWebView(frame: self.webViewContainer.bounds)
            self.webViewContainer.addSubview(webView)
            webView.load(data, mimeType: "text/html", characterEncodingName: "UTF-8", baseURL: URL(string: self.url)!)
        })
    }
}
```

Web側のソースです。
今回はローカルにXAMPPを入れてテストします。

``` test.php
<?php
    $json = file_get_contents('php://input');
    echo $json;
```

## 結果
以下のようにパラメータが表示されれば成功です。
<img style="border: 1px solid;" width="320" alt="iPhoneSE_iOS10_0.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329088/bb61e7b5-fa36-0691-9a51-349817694ca7.png">

## まとめ
iOS13が発表されましたが、iOS10がサポートされている間は、この手法を使うことがあるかもしれません。ただ私はまだiOSの経験が浅いですし、この実装方法で正しいか分かりませんので、もっといい方法があれば知りたいです。

## 参考
[iOS(swift)ガワアプリの作成で色々苦労した話](https://qiita.com/am10/items/23ca5b5c8fbbe7ab2b77)
[iOSのWKWebViewの3つのつまずきポイントと解決方法](https://qiita.com/shunkitan/items/a23b0b109f434a28ab8b)
[SwiftでjsonをphpへPOSTする](https://qiita.com/zakiyamaaaaa/items/4ccee2276d059dde23db)
MicroPythonのmpy-crossのメモ

#免責
この記事に従って発生した如何なる損害も筆者は負うことができません。ご免なさい。

#目的
main.mpyが動かなくて困った思いをしたので、mpy-crossの自分メモを作ります。
知識が増えたら追加していきます。

#キホン
mpy-crossを使って\*.pyを*.mpyにします。
まずはmpy-crossの用意。

```shell-session:mpy-crossを用意する
$ git clone --recursive https://github.com/micropython/micropython.git
$ make -C micropython/mpy-cross
$ cp -ax micropython/mpy-cross/mpy-cross パスが通っているところ/
```

試しに使ってみる。

```shell-session:*.pyを*.mpyにする方法
$ mpy-cross sample.py
$ \ls
sample.py sample.mpy
```

#本体とmpy-crossのバージョンを合わせる
mpy-crossはMicroPython本体と同じバージョンにします。
そうしないと互換性の問題でエラーが出ます。

```shell-session:MicroPython本体のバージョンv1.2.0
>>> import sys
>>> sys.implementation
(name='micropython', version=(1, 12, 0), mpy=9733)
```
```shell-session:mpy-crossのバージョンv1.12(v5)
$ mpy-cross --version
MicroPython v1.12-5-g42e45bd69 on 2019-12-27; mpy-cross emitting mpy v5
```
#boot.pyとmain.pyは*.mpyにしない方がいい
デバイスに入れておけば自動的に動くはずなのに、動きませんでした。
なぜ？

#\*.mpyよりも*.pyを優先するらしい
importしたときに、*.pyを優先するようです。

#UNIX版には-mcache-lookup-bcが必要
UNIX版のMicroPythonでは、*.mpyを作るときに-mcache-lookup-bcを付ける必要があるようです。
[Error when importing .mpy module #2896](https://github.com/micropython/micropython/issues/2896)

```shell-session:*.pyを*.mpyにする方法
$ mpy-cross -mcache-lookup-bc sample.py
```
JDBC 工具栏存档

```DBUtil.java
package com.msr.utils;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;



public class DBUtils {
	
	private static String DRIVER="com.mysql.jdbc.Driver";
	private static String URL="jdbc:mysql://192.168.0.50:3306/systemstu";
	private static String USER="root";
	private static String PASSWORD="0117";
	
	
	/**
	 * 连接数据库
	 * @return Connection
	 */
	public static Connection getConn() {
		
		try {
			//加载驱动
			Class.forName(DRIVER);
			//获取连接
			Connection conn=DriverManager.getConnection(URL, USER, PASSWORD);
			return conn;
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		return null;
		
	}
	
	
	
	
	/**
	 * 关闭数据库
	 * @param conn
	 * @param ps
	 * @param rs
	 */
	public static void closeAll(Connection conn, PreparedStatement ps, ResultSet rs) {
		try {
			if(rs!=null) rs.close();
			if(ps!=null) ps.close();
			if(conn!=null) conn.close();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	
	
	/**
	 * 增删改方法
	 * @param sql
	 * @param obj
	 * @return boolean
	 */
	public static boolean common(String sql, Object...obj) {
		try {
			//获取连接
			Connection conn=DBUtils.getConn();
			//获取预编译对象
			PreparedStatement ps=conn.prepareStatement(sql);
			//填充占位符?
			for (int i = 0; i < obj.length; i++) {
				ps.setObject(i+1, obj[i]);
			}
			//执行sql语句并返回boolean类型值
			return ps.executeUpdate()>0?true:false;
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return false;
		
	}
	
	
	
	/**
	 * 查询的方法
	 * @param sql
	 * @param obj
	 * @return ResultSet
	 */
	public static ResultSet query(String sql, Object...obj) {
		//声明对象
		Connection conn=null;
		PreparedStatement ps=null;
		ResultSet rs=null;
		try {
			//获取连接
			conn=DBUtils.getConn();
			//获取预编译对象
			ps=conn.prepareStatement(sql);
			//填充占位符
			for (int i = 0; i < obj.length; i++) {
				ps.setObject(i+1, obj[i]);
			}
			//执行sql语句			
			rs=ps.executeQuery();
			
			return rs;
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		return null;
		
	}
	
	

}


```
AtCoder Beginner Contest 131の感想

今回は比較的簡単だったような気がした(E,Fは相変わらずだったけど)

#A問題(1WA, 1分56秒)

##方針
1と2, 2と3, 3と4文字目を見比べる。

##コード

```python
n = input()

flag = 0
for i in range(3):
  if(n[i] == n[i+1]):
    flag = 1
  if(flag == 1):
    print("Bad")
    break
if(flag == 0):
  print("Good")

```

最初`n=int(input())`ってテンプレをそのままコピってREになった。マジでもったいない

#B問題(6分9秒)

##方針
Lの正負で場合分け。Lが正なら`min(i+l-1 for i in range(n))`、Lが負ならもしも最大が0超えるなら0、超えないなら`max(i+l-1 for i in range(n))`をひく

##コード

```python
n, l = [int(i) for i in input().split()]
num = 0
a = []
for i in range(n):
  num += i + l
  a.append(i+l)
if(l >= 0):
  ans = num - min(a)
  print(ans)
else:
  if(max(a) >= 0):
    print(num)
  else:
    ans = num - max(a)
    print(ans)
    
```

問題文の意味がわからなくて3分くらいロスしたので悲しい。日本語の読解力衰えたなあって思ってしまう。

#C問題(13分24秒)

##方針
最近算数の問題を出すのが好きですね。`n`以下の`a`と`b`の約数以外の個数は`n - n//a - n//b + n // lcm(a, b)`と表されます。

##コード
```python
a, b, c, d = [int(i) for i in input().split()]

def gcd(a, b):
	while b:
		a, b = b, a % b
	return a

def lcm(a, b):
	return a * b // gcd (a, b)

def count(a, b, c):
    d = a // b
    e = a // c
    f = a // lcm(b, c)
    return a - d - e + f
ans = count(b, c, d) - count(a, c, d)
if(a % c != 0 and a % d != 0):
    ans += 1
print(ans)

```
##備考
`a`が`c`または`d`の約数でないときはその分も足さなければいけないことに注意。

#D問題(35分42秒)

##方針
`b`で昇順ソート→同じだったら`a`で降順ソートしたのちに1つずつ加算し、b[i]と比較。O(n)で実行可能。

##コード

```python
n = int(input())
task = []
amount = 0
for i in range(n):
    a, b = [int(i) for i in input().split()]
    amount += a
    task.append([a, b])
task_1 = sorted(task, key=lambda x:(x[1], -x[0]))
limit = task_1[n-1][1]
frag = 0
now = 0
if(amount > limit):
    frag = 1
else:
    for i in range(n):
        now += task_1[i][0]
        if(task_1[i][1] < now):
            frag = 1
        if(frag == 1):
            break
if(frag == 1):
    print("No")
else:
    print("Yes")
```

##反省
sortedって非破壊的ソートを使ったけど競プロだったらsortで破壊したほうが紛らわしくなくていいのかなあと。実際そのせいで一回間違えたりしたので。


#まとめ
4完(1WA, 57分11秒)。順位は1981位でレートは493→563でした。E,Fの問題は知識量が少なく方針が立てられなかったのでこれからはE, Fを解くことを目標として蟻本で引き続いて勉強をしていきます。
jsp javascript での bool値の判定について

#jsp上でのbool値の判定について
- jsp上でifでbool値の判定を行うプログラムを作成しました。

```java:Test.java
package boolCheck;

public class Test {

	private boolean bool;

	public boolean isBool() {
		return bool;
	}

	public void setBool(boolean bool) {
		this.bool = bool;
	}

	@Override
	public String toString() {
		return "Test [bool=" + bool + "]";
	}


}

```
```java:BoolCheckServlet.java
package boolCheck;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class BoolCheckServlet
 */
@WebServlet("/BoolCheckServlet")
public class BoolCheckServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

    /**
     * @see HttpServlet#HttpServlet()
     */
    public BoolCheckServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		//response.getWriter().append("Served at: ").append(request.getContextPath());

		Test bean = new Test();
		bean.setBool(false); //falseをセット

		request.setAttribute("bean", bean);

		//JSPに遷移する
		RequestDispatcher disp = request.getRequestDispatcher("boolCheck.jsp");
		disp.forward(request, response);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

```
```jsp:boolCheck.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

<jsp:useBean
  		id="bean"
  		class="boolCheck.Test"
  		scope="request" />

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>


	<%= bean.toString() %>
	<% System.out.println(bean);%>
	<% System.out.println(bean.isBool());%>

<!-- 	false -->
	<% if(bean.isBool()){ %>
		<h1>this is true</h1>
	<%}else{ %>
		<h1>this is false </h1>
	<% } %>

<!-- 	false -->
	<script>
		if(<%= bean.isBool()%>){
			alert("this is true");
		}else{
			alert("this is false");
		}
	</script>

<!-- 	''で囲むと文字列となり、結果trueとなる -->
	<script>
		if('<%= bean.isBool()%>'){
			alert("this is true");
		}else{
			alert("this is false");
		}
	</script>

</body>
</html>
```
ctypesの変数についてのメモ

# 変数、ポインタの生成と読み書き

ライブラリの読み込み

```python
import ctypes
```

通常の変数の生成

```python
i = ctypes.c_uint32(10)  # unsigned int i = 10;
f = ctypes.c_float(25.4)  # float = 25.4;
```

生成した変数の値を取得

```python
i.value  # 10
f.value  # 25.399999618530273
```

生成した変数への代入

```python
i.value = 20
f.value = 14.2
```

生成した変数のポインタを取得

```python
i_p = ctypes.pointer(i)
f_p = ctypes.pointer(f)
```

ポインタから変数を取得

```python
i_p.contents
f_p.contents
```

ポインタから変数の値を取得

```python
i_p.contents.value  # 20
f_p.contents.value  # 14.199999809265137
```

# 配列の生成と読み書き
1次配列の生成

```python
i_arr = (ctypes.c_int32 * 3)()  # int i[3];
```

2次配列の生成

```python
i_arr = ((ctypes.c_int32 * 4) * 3)()  # int i[3][4];
```

配列の読み書き

```python
i_arr = (ctypes.c_int32 * 3)()  # int i[3];
i_arr[0] = 10
print(i_arr[0])  # 10
```

# ctypesで扱える型の一覧

|ctypesの型|Cの型|Pythonの型|
| ---- | ---- | ---- |
| c_bool | _Bool | bool (1) |
| c_char | char | 1文字のバイト列オブジェクト |
| c_wchar | wchar_t | 1文字の文字列 |
| c_byte | char | int |
| c_ubyte | unsigned char | int |
| c_short | short | int |
| c_ushort | unsigned short | int |
| c_int | int | int |
| c_uint | unsigned int | int |
| c_long | long | int |
| c_ulong | unsigned long | int |
| c_longlong | __int64 または long long | int |
| c_ulonglong | unsigned __int64 または unsigned long long | int |
| c_size_t | size_t | int |
| c_ssize_t | ssize_t または Py_ssize_t | int |
| c_float | float | 浮動小数点数 |
| c_double | double | 浮動小数点数 |
| c_longdouble | long double | 浮動小数点数 |
| c_char_p | char * (NUL 終端) | バイト列オブジェクトまたは None |
| c_wchar_p | wchar_t * (NUL 終端) | 文字列または None |
| c_void_p | void * | 整数または None |

# 参考
https://qiita.com/everylittle/items/6e18ba23f38502c18f3e
https://docs.python.org/ja/3/library/ctypes.html
http://curlnoodle.hatenablog.com/entry/2013/12/30/221858
【Unity】360度全天球をSkyBoxに設定する（Skybox/Cubemap）

環境メモ
⭐️Mac OS Mojave バージョン10.14
⭐️Unity 2018.2.15f1
⭐️Blender v2.79.6
⭐️Inkscape 0.92

↓↓↓完成内容
<img width="815" alt="スクリーンショット 2019-06-22 22.15.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93155/c4ff7887-045b-c58f-b70d-b11938e630aa.png">


#<font color="Magenta">Qiitaの容量オーバーで画像が貼り付けられなくなりました。（errorとなる）</font>

続きは、「はてなブログ」に記載してます↓
[かぴばらさんの覚書ブログ nonkapibara](https://nonkapibara.hatenablog.com/entry/2019/06/22/224846)


<br>
類似内容

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">🎁Unity🎁<br>🌠360度全天球🌠をUnityに取り込んでみたよぉ🤩<br>「福岡市文学館（赤煉瓦文化館）」の建物を<br>「カシャっ！！」ってスマホで撮って📱GIMPで軽く加工してみたよぉ😆（思い付きで色をつけてみた。）<br>Unityでマウスぐりぐりして360度みれるのね〜<a href="https://twitter.com/hashtag/unity?src=hash&amp;ref_src=twsrc%5Etfw">#unity</a> <a href="https://twitter.com/hashtag/unity3d?src=hash&amp;ref_src=twsrc%5Etfw">#unity3d</a> <a href="https://t.co/3jdZhmbi0P">pic.twitter.com/3jdZhmbi0P</a></p>&mdash; non (@nonnonkapibara) <a href="https://twitter.com/nonnonkapibara/status/1142279959416696833?ref_src=twsrc%5Etfw">June 22, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">💕WebVR 💕A-Frame<br>🌠360度🌠全天球を試してみたよぉ。<br>InkscapeとGIMPを使って絵を描いて😍A-FrameのWebブラウザでVR表示できるのね<br>🌸＼( ^ｏ^ )／🌸<br>デフォルトで２眼表示にも切り替わるのでVRゴーグルで試してみたよぉ。🤩めっちゃ楽しい💕💕<a href="https://twitter.com/hashtag/VR?src=hash&amp;ref_src=twsrc%5Etfw">#VR</a> <a href="https://twitter.com/hashtag/WebVR?src=hash&amp;ref_src=twsrc%5Etfw">#WebVR</a> <a href="https://t.co/iANmvyVGMf">pic.twitter.com/iANmvyVGMf</a></p>&mdash; non (@nonnonkapibara) <a href="https://twitter.com/nonnonkapibara/status/1141685386537623552?ref_src=twsrc%5Etfw">June 20, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
【Java】for文・拡張for文

##for文
同じ処理を指定した回数だけ繰り返す

```java
	for (int i = 0 ; i < 10; i++ ) {
		System.out.print(i);
	}
```
実行結果　➡　0123456789

for(初期化; 条件式; 変化式)
条件式がtrueの間はブロック内の処理を繰り返す

##拡張for文
配列やListの要素がある限り繰り返す
for文と違い条件式と変化式が無い

```java
	Integer[] array = {0,1,2,3,4,5,6,7,8,9};
		
	for (Integer str: array) {
		System.out.print(str);
	}
```
実行結果　➡　0123456789

for(変数の宣言: 取り出す配列・List名)
要素がある限りブロック内の処理を繰り返す




##IntStream
IntStreamを使うとお手軽というアドバイスを頂きました。
ご指摘ありがとうございます！

IntStream.rangeは、指定された開始値から終了値-1までの連続値（IntStream）を返します。

`IntStream.range(開始値,終了値)`

for文で行った処理はIntStreamを使うと以下のようになります。

```Java
import java.util.stream.IntStream;

public static void main(String[] args) {
  IntStream.range(0, 10).forEach(System.out::print);
}
```

初期化や増分の条件式を書く必要がないのでいいですね。
Macのバージョンをコマンドラインで確認する

# Macバージョン確認方法

Qiitaを書く時に環境情報をいつも記載しているのですが、
Macバージョンをいつもどうやってみるのか忘れてしまうのでメモとして書きます。

```
$ sw_vers
ProductName:    Mac OS X
ProductVersion: 10.14.5
BuildVersion:   18F132
```

# ちなみに

* Python

```
$ python -V
Python 3.7.1
```

* Docker

```
$ docker --version
Docker version 18.09.2, build 6247962
```

* Git

```
$ git --version
git version 2.20.1 (Apple Git-117)
```

* Redhat系

```
$ cat /etc/redhat-release
```

`--version`でだいたい出てくる。
[Android][Java] ListViewのCheckBoxの状態を管理する

２か月ほど詰まっていたので備忘録

# 実行環境
IDE：Android Studio 3.4
言語：Java

Xperia XZ3（実機デバッグに利用）
OSはAndroid 9 (API Level 28)

# 何がしたいか
ListView内のCheckBoxがスクロールによってそのチェック状態を変更されることがないようにする。

# 解決方法
ListViewで表示する要素を使いまわす処理をするgetViewメソッド内で、ListViewのCheckBoxのリスナーの貼り直しと、onCheckedChangedメソッド内でgetViewの引数のpositionを利用して改めてitemを取得する。

以下のコードには表記していませんが
ArrayAdapter< ListViewに表示するクラス型 >をextends(継承)、
ViewHolderパターンを使っています。

以下が成功例となります。

``` java:ListAdapter.java
// ListItemはListViewで表示する要素の自作クラス。
private ListItem item;
// 省略 ～～～～～～～～～～～～
public View getView (final int position, View convertView, ViewGroup parent) {
    ViewHolder holder;

    if (convertView == null) {
        // convertViewに何もなければ新しく生成する。
        convertView = mInflater.inflate(mResId, parent, false);

        // リスト内の各アイテムの要素を取得。
        holder = new ViewHolder();
        holder.isActive = convertView.findViewById(R.id.alarm_active);

        convertView.setTag(holder);

    } else {
        holder = (ViewHolder)convertView.getTag();
    }

    // リストビューに表示するアイテムのインスタンスを取得する。
    item = getItem(position);

    // リスナーを剥がす。
    holder.isActive.setOnCheckedChangeListener(null);

    // 要素にpositionから取得したitem(自作クラスのインスタンス)を要素へ代入。
    holder.isActive.setChecked(item.isActive());

    // リスナーを貼る。
    holder.isActive.setOnCheckedChangeListener(
        new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged (CompoundButton cb, boolean isChecked) {
                ListItem listItem = getItem(position);
                // 対warning用nullチェック
                if (listItem != null){
                    listItem.setActive(isChecked);
                }
            }
        });

    return convertView;
}
```

ここで重要なのは匿名クラス内の**onCheckedChanged**メソッド内の
`ListItem listItem = getItem(position);`
という処理です。

この処理はチェック状態をリストの要素(自作クラス)に反映するためのものですが、
すでに`item = getItem(position);`のようにされているからといってこの部分を削除し、
`item.setActive(isChecked);`のようにしてしまうと正常に動作しません。
LPIC level1 の勉強（イメージしづらいぞGRUB）

LPIC level1を受験しようと思ったので、忘備録を書こうと思いまして。


GRUB LegacyとGRUB２
GRUBとはOSの起動に必要なブードローダーのひとつ。
Linuxには主にGRUB LegacyとGRUB2がある。GRUB2はGRUB Legacyの後継として開発されているブートローダ。
違いは起動時に実行されるバイナリ。GRUB2ではGRUB Legacyのstage1、stage1.5、stage2がなくなった。代わりに、core.imgが生成されてgrub.cfg、ファイルシステム(normal.mod、linux.mod...)を読み込み、ロード/リンクする。

GRUB Legacyの設定ファイル
・/boot/grub/grub.conf
・/boot/grub/menu.lst

GRUB2の設定ファイル
・/boot/grub/grub.cfg

GRUB2の設定ファイルを生成するには
grub-mkconfigコマンド


忘備録にメモメモと・・・・

システムアーキテクチャって図で書いたりしないとよくわからない気がする。
【Nuxt】共通のJavaScriptをheadに記述する方法

## 【Nuxt】共通のJavaScriptをheadに記述する方法

このように`nuxt.config.js`に記述することで、全てのpageで共通のJavaScriptを実行することができます。


```javascript:nuxt.config.js

// ...
  head: {
    script: [      
      {
        innerHTML: `alert('Hello!');`
      }
    ],
    __dangerouslyDisableSanitizers: ['script'],
// ...
```

`    __dangerouslyDisableSanitizers: ['script']`は、innerHTML内の文字がエスケープされるのを防ぐためのオプションです。これがないと文字列がうまく出力できません。

## 終わりに
私は現在、Web3のサービスの開発をしています。詳しくはこちらの記事をご覧下さい。
        [無料でイーサリアムが当たる、Web3時代の寄付サイトを作った話](https://note.com/kenroda/n/n814347fbdcd7)
HTML&CSSノートfrom Progate2

# はじめに

Progate で勉強した HTML&CSS のメモ

## li タグから・を消す

css の`list-style`を`none`に指定することで`・`を消すことができます

```html
<ul>
  <li>no bullets</li>
  <li>no bullets</li>
</ul>
```

```css
li {
  list-style: none;
}
```

## HTML の要素を横に並べる

css の`float`を`left`に設定ことで右から左端から横にに並べることができます
`right`にすることで右端から並べることができます

```html
<ul>
  <li>HTML</li>
  <li>CSS</li>
  <li>Javascript</li>
</ul>
```

```css
li {
  float: left;
}
```

## 余白を付ける

`padding`を適当な単位で指定することで余白を付けることができます

| 種類           | 余白の場所     |
| :------------- | :------------- |
| padding-top    | 上に余白を追加 |
| padding-right  | 右に余白を追加 |
| padding-left   | 左に余白を追加 |
| padding-bottom | 下に余白を追加 |

```html
<div class="logo1"></div>
```

```css
.logo1 {
  padding: 20px;
}
```

## クラスの中のタグにのみ CSS を適用させる

クラスの中だけのタグに css を適用させるには`.クラス名 タグ名`のように記述します
`list`クラスの中の`li`タグに適用させるときには以下のように書きます

```css
.list li {
  /*cssを記述*/
}
```

## span タグ

改行することなく文字の途中で色を変えたい時などに使います

```html
<h1>Hello <span>world</span></h1>
```

```css
span {
  color: #ff0000;
}
```

上記のコードの場合`world`のみ赤色になります

## 境界線を引く

境界線を引くには css の`border`を使います
以下のように記述します

```css
.sample {
  /*幅　スタイル　色の順に指定*/
  border: 5px solid red;
}
```

| 種類          | 線の場所     |
| :------------ | :----------- |
| border-bottom | 下に引かれる |
| border-top    | 上に引かれる |
| border-left   | 左に引かれる |
| border-right  | 右に引かれる |

## margin

### padding と margin

`padding`は境界線の内側`margin`は外側に余白を追加します

| 種類          | 余白の場所 |
| :------------ | :--------- |
| margin-bottom | 下に追加   |
| margin-top    | 上に追加   |
| margin-left   | 左に追加   |
| margin-right  | 右に追加   |

## 文字の入力

### input タグ

`input`タグは一行の文字を入力するのに使います

`input`タグには様々な属性を付けることができます

| 属性     | 意味                                       |
| :------- | :----------------------------------------- |
| text     | テキストボックスをつくります               |
| password | パスワードボックスを作ります               |
| checkbox | チェックボックスを作ります                 |
| radio    | ラジオボタンを作ります                     |
| file     | 送信するファイルの指定をします             |
| hidden   | 隠しデータをサーバーに送信する時に使います |
| submit   | 送信ボタンを作ります                       |
| reset    | リセットボタンを作ります                   |
| button   | 汎用ボタンを作ります                       |
| image    | 画像ボタンを作ります                       |
[こちらを参考にしてます](http://www.htmq.com/html/input.shtml)
### textarea タグ

`textarea`タグは複数行の文字を入力するのに使います
python の　お勉強　７日目

# 今回から 機械学習  1 np.array
有名なアヤメの分類から始めます。
いろいろと理解不十分な点が出てきました。
参考書：RaspberyPiではじめる機械学習、金丸隆志（kindle版）
プログラムでは importにnumpy,sklearnが追加されているが、初心者にnumpyの次元配列np.arrayが理解しにくい。この`：`sliceでうまくデータを切り分けて使えるようにするために実際にmatplotのtutorialのサンプルスクリプトを読んでみる

### 3D voxel plot of the numpy logo 
voxels_numpy_logo.py

```python 

import matplotlib.pyplot as plt
import numpy as np 

# This import registers the 3D projection, but is otherwise unused.
from mpl_toolkits.mplot3d import Axes3D  # noqa: F401 unused import

def explode(data):
    size = np.array(data.shape)*2
    data_e = np.zeros(size - 1, dtype=data.dtype)    
    data_e[::2, ::2, ::2] = data    
    return data_e
# build up the numpy logo
n_voxels = np.zeros((4, 3, 4), dtype=bool)
n_voxels[0, 0, :] = True
n_voxels[-1, 0, :] = True
n_voxels[1, 0, 2] = True
n_voxels[2, 0, 1] = True
facecolors = np.where(n_voxels, '#FFD65DC0', '#7A88CCC0')
edgecolors = np.where(n_voxels, '#BFAB6E', '#7D84A6')
filled = np.ones(n_voxels.shape)

# upscale the above voxel image, leaving gaps
filled_2 = explode(filled)
fcolors_2 = explode(facecolors)
ecolors_2 = explode(edgecolors)

# Shrink the gaps
x, y, z = np.indices(np.array(filled_2.shape) + 1).astype(float) // 2
x[0::2, :, :] += 0.05
y[:, 0::2, :] += 0.05
z[:, :, 0::2] += 0.05
x[1::2, :, :] += 0.95
y[:, 1::2, :] += 0.95
z[:, :, 1::2] += 0.95

fig = plt.figure()
ax = fig.gca(projection='3d')
ax.voxels(x, y, z, filled_2, facecolors=fcolors_2, edgecolors=ecolors_2)

plt.show()￼
```
結果
![46D35F9F-310C-4C6F-AC71-3DDCA24B97B2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/437117/682ecd74-10d2-e299-59ff-6b01688fcdb2.png)
このサンプルの中の`y[:, 0::2, :]`などが意味不明？ 
表示されたグラフと照らし合わせて理解する
`:`でデータを切り分けなどができる

- startを省略する場合は[:stop:step]
- stopを省略する場合は[start::step]
- stepを省略する場合は[start:stop] 
 
boxel自体は４８個のcubeですがfacecolors,edgecolorsの表示のために一手間かかっているようです。
Laravelの初期設定で覚えておくと便利なコマンド

##何回やっても忘れてググってるので、いい加減記事にしておく。

###Restfullなコントローラー作成コマンド

```terminal
php artisan make:controller SampleController --resource
```

###API用コントローラーを作成するコマンド
(上記のresourceコントローラーから描画のcreateとeditを除いたファイルが作成される)

```terminal
php artisan make:controller SampleController --api
```

###自動で指定したモデルにバインディングしてくれる

```terminal
php artisan make:controller SampleController --model=Sample
```

###クラスを指定してSeederを実行する

```terminal
php artisan db:seed --class=SamplesTableSeeder
```

###モデルと一緒にマイグレーションファイルも同時に生成してくれる

```terminal
php artisan make:model Sample -m
```



###コントローラーもマイグレーションもファクトリーも全部生成してくれる

```terminal
php artisan make:model Sample --all
```

###マイグレーションを実行する時のSQLが確認できる（マイグレーションは実行されない）

```terminal
php artisan migrate --pretend
```

###マイグレーション実行した後にSeederも実行してくれる

```terminal
php artisan migrate --seed
```

###一度テーブルを削除して生成し直す場合はこちら
**※危険**

```terminal
php artisan migrate:fresh --seed
```
【MySQL】JOIN句

##INNER JOIN
複数のテーブルを結合し、指定したカラムで一致するデータのみ取得する

```sql
SELECT * FROM ginkou.user A
INNER JOIN ginkou.member b
ON A.status = B.status;
```
取得結果
![WS000001.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439247/669e6402-1392-5e8c-76cf-faf3706d5504.jpeg)


##LEFT OUTER JOIN
左のテーブルの全データを取得し、右のテーブルのデータを結合する
右のテーブルにマッチするデータがない場合≪NULL≫となる

```sql
SELECT * FROM ginkou.user A
LEFT OUTER JOIN ginkou.member b
ON A.status = B.status;
```
取得結果
![WS000000.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439247/b87e8fc5-0057-c0f1-d472-dbe2aa960274.jpeg)

##RIGHT OUTER JOIN
右のテーブルの全データを取得し、左のテーブルのデータを結合する
左のテーブルにマッチするデータがない場合≪NULL≫となる

```sql
SELECT * FROM ginkou.user A
RIGHT OUTER JOIN ginkou.member b
ON A.status = B.status;
```
![WS000000.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439247/21ec6bbe-0543-e7ba-c095-76615f3403b3.jpeg)
CSS超入門：基礎知識と基本書式

HTMLについてさらっとやったんで、次はCSSについてさらっとやります。

##CSSとは
HTMLは、タグでコンテンツの意味づけをすることができるが、そのコンテンツをどういうふうに表示するか、ページのレイアウトやスタイルを調整する機能は持っていない。そこで、HTMLがブラウザに表示されるときの見た目を調整するのがCSS（スタイルシート）。

##CSSの基本書式

```css
h1{
 font-size: 18px;
}
```

・`h1`セレクタ　HTMLのドキュメントから、スタイルを適用したい「要素」を選択する
・`font-size`プロパティ　設定したいスタイル。複数ある場合には何行でも書ける
・`18px`プロパティの値　

##CSSファイルを作成し、HTMLにCSSを読み込む
実際にWebサイトを作るときは、HTMLファイルとは別に専用の外部CSSファイルを用意するのが一般的

CSSファイルの１行目には文字コードを指定する

```css
@charset "utf-8";
```
次にHTMLファイルを編集して、CSSファイルを読み込むようにする

```html
<link rel="stylesheet" href="style.css">
```
`<link>`タグにはCSSファイルの名前を、href属性には読み込みたいCSSファイルへのパスを指定する
 
*ちなみに…
リンクといえば`<link>`のほかに`<a href>`がある。
そのちがいは、`<link>`が「そのページ」と「外部のファイルやページ」を関連づけるのに対し、`<a href>`はbodyタグ内でリンクを貼るために使われる。

##三大セレクタ
**・タイプセレクタ**
スタイルを適用させたい要素の要素名をセレクタの名前として記述する。この時、文書に含まれる要素は全て同じプロパティに値が設定される。

**・classセレクタ**
同じクラス名（HTMLのclass属性に指定した値）を持つ要素すべてにスタイルを適用するセレクタで、ピリオドに続けてクラス名を記述する。

**・子孫セレクタ**
先頭のセレクタで選択された要素のうち、2番目のセレクタに該当する要素だけを選択する。先頭のセレクタと2番目のセレクタは半角スペースで区切って記述する。
例えば

```html:ex.html
<section class="profile">
 <h2>プロフィール</h2>
 <p>アメリカに留学してIT技術を…</p>
</section>
```
このうち`<h2>`だけにスタイルを適用させたい場合、

```css
.profile h2{
  margin-top:0;
  margin-bottom:0;
}
```
こうなる。ちな、これで見出しの上下のスペースが調節された。

##最後に
CSSは別ファイル用意するんだね、そのほうがきれいにまとまっていいのか
基礎の基礎だからしっかり覚えていこう～
关于Date的写法 

#date写法 


- 建表格时 

*表格中依然是date形式* 
```Date startTime; 
```


- 实体类时  
*bean中的实体类，写成String*

```String startTime;
```








- dao层方法实现中  

```dao.java
//是利用dao层方法，操作数据库的。要往数据库里放数据，是需要转换城数据库要的Date形式
//添加
	@Override
	public boolean addStu(Student stu) {
		String sql = "insert into student values (null,?,?,?,?,?,?,?,?,?,?,?)";
		
               //日期的数据转换！ 
		SimpleDateFormat sd=new SimpleDateFormat("yyyy-MM-dd");
		
		Date date=null;
		try {
           
  //此时这种形式是可以往数据库里放的形式！ String 形式-->sql的date!
			date = new Date(sd.parse(stu.getSmtime()).getTime());
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
				
		Object[] obj = {
				
				stu.getSid(),
				stu.getSpwd(),
				stu.getSname(),
				stu.getSgender(),
				stu.getSage(),
				stu.getStel(),
				stu.getSaddress(),
				stu.getSclass(),
				stu.getSenterprise(),
				date,
				stu.getSstatus()		
		};
		return DBUtils.common(sql, obj);
	}
```


- 页面中

```student.html

//注意： type写成date 就可以出选日期的小插件儿！ 
<tr>
	    			<td>入学时间:</td>
	    			<td><input id="edit_smtime" type= "date"  style="width: 200px; height: 30px;" class="easyui-textbox" name="edit_smtime" /></td>
	    		</tr>


```
Bash while 文の中の変数が外で使えなくて困った話

解説用のコードなので、どんなときに使うんだというツッコミは無しの方向で。

# 奇数の ID が振られているアルファベットを表示したい
## 先に理由

`while` でぐるぐる回すときにはパイプを使っていろいろなものを読み込ませることが多い (個人的には) ですが、パイプを使うとその時点でサブシェルができてしまい、変数のスコープがサブシェルに行くからの模様。
なので、パイプを使わないようにして読み込ませると、ループの中で書き換えた変数が外で使えます。

## 動かないコード

```bash:while1.sh
#!/bin/bash -u
readonly settings=$(cat << EOS
1 A
2 B
3 C
4 D
5 E
6 F
7 G
8 H
EOS
)

target=""

echo "${settings}" | while read number alphabet
do
    if [ $(( number % 2 )) -eq 0 ]; then
       target=$( echo -e "${target}\n${alphabet}" )
    fi
done

echo "${target}"
```

```terminal
$ bash ./while.sh

$
```

## 動くコード

```bash:while2.sh
#!/bin/bash -u
readonly settings=$(cat << EOS
1 A
2 B
3 C
4 D
5 E
6 F
7 G
8 H
EOS
)

target=""

while read number alphabet
do
    if [ $(( number % 2 )) -eq 0 ]; then
       target=$( echo -e "${target}\n${alphabet}" )
    fi
done << EOI
${settings}
EOI

echo "${target}"
```

```terminal
$ bash ./while.sh
B
D
F
H
$
```
【Git】削除したファイルだけaddする方法

GitHubに削除したファイルの変更分だけをaddして、pushしたい場合があったのでメモ。対象: `rm`コマンドや右クリックなんかでファイルを削除 => その他のファイルを編集したが、削除済のファイルの変更分のみGitHubにあげたい。
 
## 結論

削除したファイルの変更分だけをadd

```terminal
$ git rm $(git ls-files --deleted)
```

## 実行結果

`git rm $(git ls-files --deleted)` 実行後
対象ファイル(削除したファイル)のディレクトリが出力される

```terminal
$ git rm $(git ls-files --deleted)
rm 'app/views/labels/_form.html.erb'
rm 'app/views/labels/_label.json.jbuilder'
rm 'app/views/labels/edit.html.erb'
rm 'app/views/labels/index.html.erb'
rm 'app/views/labels/index.json.jbuilder'
rm 'app/views/labels/new.html.erb'
rm 'app/views/labels/show.html.erb'
rm 'app/views/labels/show.json.jbuilder'
```

`git status` で、ちゃんとaddされてGitのステージングエリアに上がっているか確認

```
$ git status
On branch label
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

	deleted:    app/views/labels/_form.html.erb
	deleted:    app/views/labels/_label.json.jbuilder
	deleted:    app/views/labels/edit.html.erb
	deleted:    app/views/labels/index.html.erb
	deleted:    app/views/labels/index.json.jbuilder
	deleted:    app/views/labels/new.html.erb
	deleted:    app/views/labels/show.html.erb
	deleted:    app/views/labels/show.json.jbuilder

```

> Changes to be committed:　

ちゃんとGitのステージングエリアに上がってることが確認できた 

以上

https://qiita.com/hkato193/items/0097620bdf4c6eeef308
https://rfs.jp/server/git/gite-lab/git-ls-files.html
http://chroma.hatenablog.com/entry/2013/10/18/111052
docker-compose up invalid volume specification


# :o: 解決策

```
docker-compose rm nuxt
```

コマンドを実行した後にdocker-compose upでOK


```:errorlog
WARNING: Service "nuxt" is using volume "/src" from the previous container. Host mapping "/nuxt/app" has no effect. Remove the existing containers (with `docker-compose rm nuxt`)Recreating 8539d43fc4bd_nr_nuxt ... error

ERROR: for 8539d43fc4bd_nr_nuxt  Cannot create container for service nuxt: invalid volume specification: 'a7911443fcd9b93c14e4fd89e05b5f432552a430bb7f2e4cad780a82e1f96fdb:.:rw': invalid mount config for type "volume": invalid mount path: '.' mount path must be absolute
```

ずっと、ERROR見てた
WARNINGの方が大事な時もあるのか。。
Githubに公開するためのコマンドをメモ

# 流れ
    git init
##### gitを作成

    git add ファイル名
##### gitにgithubに公開するファイルをに公開するファイルを入れる

    git commit -m "gitのお勉強" (⇦メッセージは何でもいい(""の中))
##### gitに変更内容を保存させる
カレントディレクトリの中でaddしていないファイルがあるとエラーがでる(隠しファイル以外)

    git status
##### gitの内容を確認
(やらなくてもいい)

    git remote add origin リポジトリのurl
##### githubのリポジトリに現在のgitを追加

    git push origin master
##### Githubに公開！

#参考になったサイト
[今さら聞けない！GitHubの使い方【超初心者向け】|TechAcademyマガジン](https://techacademy.jp/magazine/6235)
kintoneをNode-REDで使ってみた

kintoneは業務改善プラットフォームとして注目されていますが、使い方次第ではデータベースとしても使えます。というわけで実際にkintoneのREST APIをNode-REDで使ってみました。

# 実際に作成したフロー
![flow.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170520/f90c923c-75bb-dfff-40d9-aa4eabebecf6.png)
一番左のinjectノードのボタンを押すと値が送信され、functionノードでパラメータを設定させてrequestノードで送信するという流れです。functionノードで必要な値をすべて設定するので、http requestノードではメソッドをGETに設定するだけであとは何も設定しません。それではfunctionノードのの中身を見ていきます。

## functionノードの中身
```javascript
var query = encodeURI("field_name="+msg.payload)
var access_token = "YOUR_TOKEN";
var post_request = {
    "url":"https://YOUR_DOMAIN.cybozu.com/k/v1/records.json?app=YOUR_ID&query=" + query,
    "headers": {
        "X-Cybozu-API-Token":access_token
    }
};

return post_request;
```
GETですべての値を定義してrequestを行うので,functionノードでURLを設定しています。ポイントとしてはqueryの値はURLエンコードをする必要があるので、1行目で```encodeURI```を使用しています。

完成したらデプロイを行い、デバッグ画面でqueryの結果が正しく出力されれば、成功です。

##今回のフロー
```
[{"id":"3e0449cf.3b80c6","type":"inject","z":"8802b5e.96cf248","name":"","topic":"","payload":"100","payloadType":"str","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":210,"y":340,"wires":[["91875234.3ebfb"]]},{"id":"b66b7c63.64db2","type":"debug","z":"8802b5e.96cf248","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":650,"y":400,"wires":[]},{"id":"91875234.3ebfb","type":"function","z":"8802b5e.96cf248","name":"kintone query","func":"var query = encodeURI(\"field_name=\"+msg.payload)\nvar access_token = \"YOUR_TOKEN\";\nvar post_request = {\n    \"url\":\"https://YOUR_DOMAIN.cybozu.com/k/v1/records.json?app=YOUR_ID&query=\" + query,\n    \"headers\": {\n        \"X-Cybozu-API-Token\":access_token\n    }\n};\n\nreturn post_request;","outputs":1,"noerr":0,"x":380,"y":340,"wires":[["fb3637b9.b8de38"]]},{"id":"fb3637b9.b8de38","type":"http request","z":"8802b5e.96cf248","name":"","method":"GET","ret":"obj","paytoqs":false,"url":"","tls":"","proxy":"","authType":"basic","x":590,"y":340,"wires":[["38d784a5.94d10c","b66b7c63.64db2"]]},{"id":"38d784a5.94d10c","type":"http response","z":"8802b5e.96cf248","name":"","statusCode":"","headers":{},"x":770,"y":340,"wires":[]}]
```

#参考
https://developer.cybozu.io/hc/ja/articles/202331474
https://qiita.com/zaki_taka4/items/b7c9ef62050195832d8d
【Mac、mysql5.7】ローカルでmysqlのパスワードを変更する方法

## はじめに
本番環境でmysqlのパスワードを変更しようとしたらいつの間にかローカルのパスワードも変わってしまった！ということがあったので備忘録として。
ローカルではパスワードを設定したくないので、今回は空で設定しています。

## ①ターミナルでmysqlの起動を停止させる
ホームディレクトリで構いません。

```terminal
$ mysql.server stop

Shutting down MySQL
. SUCCESS! 
```

## ②mysqlをセーフモードで起動

```
$ sudo mysqld_safe --skip-grant-tables --skip-networking
```

## ③起動したターミナルをそのままにし、⌘+tなどでもう一つターミナルのタブを開く

## ④③で新しく開いたタブにてmysqlにログイン

```terminal
$ mysql -u root
```

セーフモードで立ち上げているため、本来であれば上記のコマンドでパスワードが必要なく入れるはずなのですがなぜか自分のPCでは入れませんでした・・。
できない人は下のコマンドにてパスワードを入力してログインしましょう。

```terminal
$ mysql -u root -p
```

## ⑤パスワードの変更

```terminal
mysql> update user set authentication_string=password("パスワード") where user='root';
mysql> FLUSH PRIVILEGES;
mysql> exit
```

自分の場合、今回はパスワードは設定したくなかったため、新しいパスワードというところは下記のようにしました。
`authentication_string=password("")`

## ⑥mysqlの再起動

```terminal
$ mysql.server restart
```


以上でパスワードが変わっているはずです。


【参考記事】
・MySQLのrootユーザーのパスワードを変更
http://ktykwsk.com/mysql%E3%81%AEroot%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%81%AE%E3%83%91%E3%82%B9%E3%83%AF%E3%83%BC%E3%83%89%E3%82%92%E5%A4%89%E6%9B%B4/

・MySQL 5.7.6でroot用パスワードが変わらなくて困った話
https://qiita.com/gatchan0807/items/7323a5d2dd365308cb94
VSCode の Zoom Out が Ctrl + "-" でできない場合

## VSCode の Zoom Out が Ctrl + "-" でできなかったので回避したときのメモ

### 現象

- File -> Preference -> Keyboard Shortcut で Zoom Outの Key bindings を確認
- (Ctrl) + ("-") が割当てられているように見えるが、きかない。
- (Ctrl) + (Shift) + ("-") も試してみたけどダメ。
- (Ctrl) + (Shift) + (Numpad_Substract) はテンキーなかったので試せず。（多分これはきいてた？）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216819/8d745a48-3a8c-7991-62f6-3aec7473440a.png)

### 調査

- (Ctrl) + ("-") も、(Ctrl) + (Shift) + ("-") も、他の複数のコマンドにアサインされていた
- そちらのコマンドが優先されているようにみえる

### 回避方法

- 乱暴かもしれないが、(Ctrl) + ("-")で検索して他のコマンドのKey bindingsを一旦別のキーを割り当てて回避。(もしかしたら優先順位とか付けられるのかもしれないけど、普段使わないコマンドだったので)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216819/5702c06a-65b5-4c54-e690-a165ef8b4aac.png)
↑これは、(Ctrl) + (Shift) + ("-")に割り当てられてた別のコマンドの例

### 補足

もしかすると VSCode のKeymap テンプレートの種類によって状況違うかもしれません。(私の環境はVSです)
Zoom Outに限らず、普段使っているショートカットきかないなーと思ったら、一度ほかのキーに割り当てられてないか、確認してみようと思いました。
Qiitaを始めてみました。

初めまして、ユウキと言います。
今３５歳の労働ワーカーですが、以前から興味があったプログラミング学習を
2019年から始めました:relaxed:

最初はHTMLとCSSの学習をドットインストールやprogateなどを使って行い、
サンプルサイトを作ったりしていました。

そして今週からRUbyの勉強を開始。まだ条件分岐などの基礎な部分しかしてないですが、
とても楽しいです:grinning:

近い将来、WEBサービスの開発やプログラマーとしてお仕事したいんですが、今は毎日コツコツ
手を動かし、思考してステップアップに励んでいます。

身近にプログラマーや学習している方々がいないので、こちらのサイトでは色々な方々と交流できれば
幸いです！

どうぞよろしくお願いします。
Java コーディング規約におけるメンバー記述順序

# Java メンバーの記述順序
書いているうちに身につくものではあるが、自分の備忘録のために投稿。

- 基本順序
    - static field
    - static initializer
    - static method
    - field
    - initializer
    - constructor
    - method

- 上記カテゴリ内での順序
    - public
    - protected
    - package private
    - private

# 参考元
https://future-architect.github.io/coding-standards/documents/forJava/Javaコーディング規約.html#はじめに
JuliaのWebフレームワークGenieを使おうとしたらハマった。

# なぜJuliaでWebアプリを作ろうと思ったのか
普段Pythonを書いている私ですが突如Juliaの講座をやってくれと頼まれ少しだけ触っている状況です。
Juliaはそもそも科学技術計算向けのライブラリという認識なので意識していませんでしたが、依頼主から講座内容のうち少し発展系のコンテンツとして用意してほしいとのことだったので調査に踏み切りました。
調査の中でどうやらJuliaにはGenie.jlというRubyでいうところのRail的なフレームワークがあることを知り、Webアプリのベースの部分(Railsで言うScaffold)まで動くことを確かめようと思ったのが動機です。

# ハマったところ
まずは以下のリンクのような方法で試してみました。
https://qiita.com/yshutaro/items/16cb2e02655911fed83b

しかしどうしても

```julia
julia> Genie.REPL.new_app("testapp")
```
の部分でLoadErrorになってしまう。

他の文献を探してもほとんど同じだったため、ハードウェア固有の問題だと思っていました。
粘り強く新しい記事を探していると以下の記事を発見。
https://qiita.com/Keyskey/items/1f781318fe10516bbb38

なるほど、`new_app()`->`newapp()`とすればよかったのか～と希望が見えました。
実際に実行してみると、、、結局エラー。

もう打つ手はないのかと絶望しながらネットの波に乗っていたところ以下の記事を発見。
https://jpn.itlibra.com/article?id=21194

```julia
julia> Genie.newapp("testapp")
```

`REPL`無しで書いているぞ。しかも記事として新しい。
そう思って恐る恐る事項してみたところ、、、、動きました！！感動です！

# 教訓
発展途上のライブラリを使う場合は必ず最新の文献を探すようにしよう。
パスワード管理アプリに依存しない堅牢かつ簡便なパスワードの管理方法

#先に結論から

1. パスワードはランダムに見える共通パスフレーズ＋ランダムなサイト別文字列で作成する
2. 共通パスフレーズは記憶する
4. サイト別文字列は、ダミーの文字列とともにExcelなどにメモし、パスワードロックして保管する（保管先はクラウドストレージだとアクセスしやすい）

#解説
##共通パスフレーズの作り方

共通パスフレーズは、ある程度の長さの文章を選択します。
パスワードとして利用するのは、その文章の子音のみにするなどして、ランダムな文字列っぽくします。

そのままだと日本語の文字列だと推測される（何しろ日本語の子音は13文字ちょいしかない）ので、C,F,J,L,Q,V,X,A,E,I,O,U を適当に混ぜる。単語を英語に置き換え（いわゆるルー語）てパスフレーズを作成するのもよい。

なお、金銭の絡む重要なアカウントとそれ以外では別の共通パスフレーズにするとより安心です。
ここで作ったパスワードは、記憶します。

##サイト別文字列の作り方
ランダムな文字列を出力してくれるサイトでパスワードを作ります。
例えば、以下のサイト

https://www.graviness.com/temp/pw_creator/
ここで出力された文字列の表を、丸っとコピーして、Excelに貼り付けます。

![capture.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163058/0e6f91dc-c250-12d1-64e0-57af87770732.png)

A列にはウェブサービス名を記載します。

で、１サービス当たり10個のパスワードが用意されました。使うのはこれらのうちのどれか、と見せかけて一つ下のサービスの行の中から選ぶとか、n文字目だけを使うとか、縦読みとか、好きな方法でサイト別パスワードを作ります。
利用するサイトを追加するときはA列の下に追加していきます。

##サイト別文字列の保管
Excelで作った場合

1. 名前を付けてファイルを保存
2. 保存先を選ぶ
3. 保存ボタンの横にある「ツール」をクリック
4. 「全般オプション」を選択
5. 読み取りパスワードを設定する

##この方法の利点
###ウェブサービスからの平文漏洩に強い

- 利用しているウェブサービスがパスワードを平文で保管しており、それが流出した場合、漏洩したパスワードはすべてランダムな文字列に見える。
- サイト別文字列はサイトの文字列などとは無関係のため、平文で漏洩しても共通部分とサイト別の部分を判別できない。

###保管しているパスワードリストの漏洩に強い

- 乱数表をどう使うかの選択肢が膨大なため攻撃に手間取る
- 記載しているパスワードだけでは乗っ取ることができない

###利便性が高い

- クラウドストレージに保管しておくとどこからでもアクセスできる

###ウェブサービスからの平文漏洩とパスワードリストの盗難が重なっても被害の拡大を抑えられる

- 共通パスワードとサイト別パスワードの分離が困難
- パスワードリストだけでは他サイトへの攻撃ができない

##パスワードを更新したいときはどうするか

ウェブサービスからの平文漏洩などでパスワードの更新が必要になる時があります。
その場合、サイト別文字列の乱数表を書き換えると他のサイト別文字列への影響が避けられないため、当該のサイト名をA列から削除し、新たにA列の下端に新たに追加します。

----

サイト別パスワードのExcelファイルに、ファイルを開いたら通知が飛んでくるようなマクロを仕込んだら漏洩検知もできていいなぁ、とか思っている。（開いた覚えがないのに通知が飛んで来たら漏洩している＆突破されていることが分かる）
他には乱数表をマクロでクラウドからダウンロードしてくるようにすると何かの拍子に乱数表を書き換えるリスクも避けられてよいのかもしれない。その動作自体が攻撃者のセキュリティソフトに引っかかって開くのをためらわせるのなら最良。
・・・VBA使えないんですけどね、私。

まあとりあえず、WebAuthnの普及を推進していきましょう。
HerokuでjQueryが適用されない。。。jQueryの読み込み先を変更して成功

#近況報告

エンジニア転職成功しました。YouTubeでエンジニア転職したい方向けに情報発信しています。

https://www.youtube.com/channel/UCcXQG8lu_EdyP2Cbhtz1bcA


jQueryで画像スライドショーを作ったのにデプロイしたら適用されなかった（涙目）


なんでやねん！って思ったけど、
そもそもjQureyの読み込み先をローカルに置いてたjs\jquery-3.4.1.min.jsにしていたのが原因じゃね？ってことで、読み込み先を変えてみた。

##解決方法

読み込み先をGoogle先生のCDNに変えた

```index.html
<head>
- <script src="js\jquery-3.4.1.min.js"></script>
+ <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
</head>
```

再度デプロイ

成功！
Node for MaxでTypeScriptを使う

## つくったもの

Node for Max向けに簡単なTypeScriptの開発環境を作りました。


エディター
![medium.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148589/b228192d-d6d2-a810-dfa9-8fe399d393f7.gif)

[Max API](https://docs.cycling74.com/nodeformax/api/)の型定義が効いているので、快適に開発ができます。

ソースコード: [github](https://github.com/yuichkun/n4m-typescript-boilerplate)

## 機能

### ts-nodeモード

[Max 8.0.4のアップデート](http://cycling74.s3.amazonaws.com/support/version_8_0_4.html)で `node.script` にCLIオプションが渡せるようになりました。

これによって、 nodeの`-r`オプションが使えるようになったので、[ts-node/register](https://www.npmjs.com/package/ts-node)を使うことができます。

つまり、**`.js`を吐かずにTypeScriptを実行できて、REPLとかもできちゃうし、** ファイルを吐き出す時間がないので、小さなプロジェクトなら実行にかかる時間もjsとほとんど変わらず**サクサク**です。

### tscモード
tscを使ってトランスパイルしたファイルを通常通りに吐き出せるようにもしてあるので、ts-nodeが嫌いな人はそちらで。

## ボイラープレートの構成（省略版）
├── @types
│   └── max-api.d.ts <-- MaxAPIの型定義ファイル
├── **index.ts** <-- `ts-nodeモード`のエントリーポイント
├── lib/ <-- tscしたらここに入る
├── **main.maxpat** <-- Maxはこれを開く
├── node_modules
├── package.json
├── run-transpiled.js <-- `tscモード`の時のエントリーポイント
└── tsconfig.json

## ボイラープレートについて

メインのMaxファイルがこんな感じで、
<img width="1440" alt="Screen Shot 2019-06-22 at 21.17.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148589/66e2609e-23c3-6f03-46ff-5d1179c645b5.png">

これに対応するコードが

```javascript:index.ts
import * as MaxAPI from 'max-api'
import * as fs from 'fs'
import { say } from 'cowsay'
import { Log } from './utils'

enum actionTypes {
  LIST_FILES = 'list-files',
  SAY = 'say'
}

MaxAPI.addHandler(actionTypes.LIST_FILES, () => {
  fs.readdir(process.cwd(), (err, files) => {
    if (err) {
      MaxAPI.post(err.message, "error")
    }
    const text = say({
      text: 'Node for Max is Awesome!'
    });

    Log(...files)
    MaxAPI.outlet(...files, text)
  })
})

MaxAPI.addHandler(actionTypes.SAY, (...whatever: string[]) => {
  const text = say({
    text: whatever.join(' ')
  })
  Log(text)
  MaxAPI.outlet(text)
})

```

こんな感じ。（*サンプルがcowsayかよ*というツッコミはさておき、、）

で、umenuから `ts-node` を使うか `tsc` を使うか選択すると、

<img width="563" alt="Screen Shot 2019-06-22 at 21.20.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148589/5edf80f8-955f-4c79-80c4-03f7a07e56b7.png">

こんな感じでスイッチングされる。
`node.script` の `@options` に渡しているのがそのままnodeに渡されるのでこれはつまり

```bash
node -r ts-node/register index.ts
```
ということ。 （`-r` オプションは指定したライブラリを実行前にrequireしてくれる）

`tscモード` の場合は右の `node.script run-transpiled.js` （※**.js**に注目)が実行される。

これは単純に、

```javascript:run-transpiled.js
/**
 * @description This file should only be called after source code is transpiled.
 * @author Yuichi Yogo
 */
require('./lib/index')
```
`lib/` にtscでトランスパイルしたjsファイルが入ることが期待されているので（そこの同期処理はMaxパッチ側で書いてある）、それをシンプルにrequireするだけ。

## まとめ

今回のボイラープレート作成にあたり、Max APIの型定義ファイルをCylclingがpublishしていないので、自分で用意しました。
とても不便なのでcycling '74に**お願いしておきました**。（対応してくれるかどうかは知らない）

そのうち`npm install`で最新の型が手に入るようになるといいですね！
HTMLとJavaScriptで作ったサイトがHerokuにデプロイできねええって時の対処法

#近況報告

エンジニア転職成功しました。YouTubeでエンジニア転職したい方向けに情報発信しています。

https://www.youtube.com/channel/UCcXQG8lu_EdyP2Cbhtz1bcA



HTML/JavaScriptで用いて作ってる勉強用のページを
Herokuにデプロイする時失敗しましたが、簡単に解決できたのでその対処法を書きます。

##git push heroku masterでデプロイ失敗・・・

```powershell
PS C:\Users\***\Desktop\***> git push heroku master
Enumerating objects: 372, done.
Counting objects: 100% (372/372), done.
Delta compression using up to 8 threads
Compressing objects: 100% (344/344), done.
Writing objects: 100% (372/372), 230.52 KiB | 2.59 MiB/s, done.
Total 372 (delta 111), reused 0 (delta 0)
remote: Compressing source files... done.
remote: Building source:
remote:
remote: -----> App not compatible with buildpack: https://buildpack-registry.s3.amazonaws.com/buildpacks/heroku/nodejs.tgz
remote:
remote:  !     ERROR: Application not supported by 'heroku/nodejs' buildpack
remote:  !
remote:  !     The 'heroku/nodejs' buildpack is set on this application, but was
remote:  !     unable to detect a Node.js codebase.
remote:  !
remote:  !     A Node.js app on Heroku requires a 'package.json' at the root of
remote:  !     the directory structure.
remote:  !
remote:  !     If you are trying to deploy a Node.js application, ensure that this
remote:  !     file is present at the top level directory. This directory has the
remote:  !     following files:
remote:  !
remote:  !     If you are trying to deploy an application written in another
remote:  !     language, you need to change the list of buildpacks set on your
remote:  !     Heroku app using the 'heroku buildpacks' command.
remote:  !
remote:  !     For more information, refer to the following documentation:
remote:  !     https://devcenter.heroku.com/articles/buildpacks
remote:  !     https://devcenter.heroku.com/articles/nodejs-support#activation
remote:
remote:
remote:        More info: https://devcenter.heroku.com/articles/buildpacks#detection-failure
remote:
remote:  !     Push failed
remote: Verifying deploy...
remote:
remote: !       Push rejected to ***
remote:
To https://git.heroku.com/***.git
 ! [remote rejected] master -> master (pre-receive hook declined)
error: failed to push some refs to 'https://git.heroku.com/***/
```

めっちゃ長いけど、heroku側でbuildpackをnodejsに設定してる場合、package.jsonファイルが必要なんだとか。

要はアプリとして認識されてないってことね。

で、実際に作って再度デプロイするもapplication Errorに。。。
これはハマりそう・・・。

簡単に解決にできないかなーと思ったら、こんな投稿を発見。

[単純なHTML/CSS/JSをHerokuにデプロイする時つまずいたこと](https://qiita.com/kanza0awa/items/b8d475e67a147cd54453)

なるほど、ルートディレクトリにpackage.jsonとindex.phpを作って、index.phpでindex.htmlをrequire_onceすればいいのね。
**（要はphpアプリとしてデプロイするってこと）**


##解決方法


index.htmlと同じ階層に以下の二つのファイルを作成

```index.php
<?php include_once("index.html"); ?>
```

```package.json
{}
```

commitして、再度git push heroku master

```powershell
PS /***> git push heroku master
remote:        https://***.herokuapp.com/ deployed to Heroku
remote:
remote: Verifying deploy... done.
To https://git.heroku.com/***.git
```

デプロイ成功！

##アプリじゃないけどデプロイしちゃう

herokuはサーバー周り設定要らずで簡単にWebページを無料で公開できるのでかなりお勧めです。
AWS Training の動画を早送りしたい

# AWS Training の動画を早送りしたい

この記事に必要な範囲で自己紹介すると、

* 最近 AWS の勉強をはじめた
* とりあえず [AWS Training](https://aws.amazon.com/jp/training/?nc1=h_ls) を進めている
* リアルの会話はゆっくりのほうが嬉しいし、自分自身の喋りはとろい
  * （何でもかんでも早送りにしたい人ではない、ということです）

という感じです。

## AWS Training とは

AWS が公式に提供してくれている学習用リソースです。まだ始めたばかりでよく分かっていませんが、ブラウザでアクセスして、動画を見ながら勉強できます。様々なコンテンツが準備されていて、興味のあるものを選ぶことができます。

しかし、動画に早送り機能がありません。速く進めたいけど途中に重要な情報があるかもしれないから飛ばしたくはない、という場合に困ってしまいます。

## ページの要素を調べる

AWS Training のページ構成はコンテンツによって異なりますが、いくつか見た感じでは、`<video>` 要素として動画が配置されているという点は共通しているようです。`<video>` 要素の interface は `HTMLVideoElement` で、これは `HTMLMediaElement` を継承しています。そして、`HTMLMediaElement` の `playbackRate` プロパティで再生速度を制御することができます。

開発ツールを開き、コンソールで下記を実行すれば、再生速度が 1.25 倍になります。

```js
const videos = document.body.getElementsByTagName("video");
videos[0].playbackRate = 1.25;
```

**注意点**

* 自分が確認に使ったブラウザは Firefox です。
* コンテンツによっては、`<video>` 要素が複数存在する場合があります。メインの動画が一番前にある可能性が高そうですが、確認した訳ではないので断言できません。`videos` のインデックスを `0` から変更する必要が生じるかもしれません。
* コンテンツによっては、動画のスピードを変えても seek bar の速度が変わりません。その結果、実際の動画と seek bar にずれが生じてしまいます。このずれの解消にはソースのスクリプトを変更する必要がありそうなので、あきらめました。

## おわりに

ブラウザの開発ツールは、アプリケーションをつくるときだけでなく、日々の生活をちょっと便利にするためにも使えるんだと改めて感じました。
Google Nest HubとNode-REDを連携させる

# はじめに
## やりたいこと
* Google Nest HubにNode-REDからなんらかの情報を送りたい

## Node-REDのまとめ記事
* [Node-RED系の記事のまとめ](https://qiita.com/kazutxt/items/8c72448eefcba56dabef)

## 動作環境
* IBM Bluemix Node-RED : v0.20.5

# 本編
## Google Nest Hub側の設定
1. 初期設定を行う
2. 下にスワイプして、システム設定内のデバイスIPを確認する

## Node-RED側の設定
1. node-red-google-notifyをいれる
2. デバイスのIPを入れる

![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259228/43879072-0856-6d46-1985-52496281f91b.png)

フローは一旦シンプルに、最低限のインジェクト

## 結果
ちゃんと音声を読み上げてくれる

![図1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259228/cfe77609-f26e-9553-0f48-ddffcf21ff0f.jpeg)


## 備考
* これだけだとGoogle Homeと変わらないので、一旦同じことができることの確認程度になりました。

* 以前投稿した[スキルを開発しないでNode-REDとAmazonEchoをつなぐ](https://qiita.com/kazutxt/items/d8dda820ab253f553e80)　のGoogle Home版が準備されつつあるようです。
    * https://googlehome.hardill.me.uk/
    * ただし、Google HomeのGoogleアカウントのリンクでNode-REDが出ないため、そこで実現できませんでした。
* 次は、音声だけでなく画像とか文字表示とかもさせたいなぁ
    * ぱっと探した感じではAPIは見つからないので、少し調査が必要ですね
ラズパイにローカルAPを立ててみた

#はじめに
[未来電子テクノロジー](https://www.miraidenshi-tech.jp/intern-content/program/)でインターンをしています。
今回はラズパイにローカルAPを立ててみたので、その方法をご紹介します。
プログラミング初心者であるため、内容に誤りがあるかもしれません。
もし、誤りがあれば修正するのでどんどん指摘してください！

#ローカルAPを立ててみよう
- hostapdモジュールを使えばAPにできる
- hostapdをインストール
- 有線、無線で同じネットワークセグメントにしたかったのでeth0とwlan0をブリッジしてbr0にIPを設定
- /etc/network/interfaces

```console
auto br0
iface br0 inet dhcp
	bridge_ports eth0 wlan0
```
- /etc/dhcpcd.conf

```console
denyinterfaces eth0
interface br0
static ip_address=192.168.0.1/24
static routers=192.168.0.1
static domain_name_servers=192.168.0.1
```

- /etc/hostapd/hostapd.confでAPの設定

```console
interface=wlan0
bridge=br0
ssid=xxxxxx
hw_mode=g
channel=3
wpa=2
wpa_passphrase=xxxxxxx
wpa_key_mgmt=WPA-PSK
rsn_pairwise=CCMP
```
- /etc/default/hostapdの以下の部分をコメントアウト
- 自動的にconfファイルを読み込んでくれる

```console
DAEMON_CONF="/etc/hostapd/hostapd.conf"
```

#まとめ
これからもラズパイで遊んでいきまーす！！！