OmniAICreator/Qiita-1.07M huggingface dataset:
VSCodeを快適に使うためのJSON入門

# はじめに

VSCodeにおいては、設定ファイルとしてJSON形式が用いられます。JSON記法は簡潔で理解しやすいものの、禁止の記法が存在します。また、**VSCodeにおけるJSON記法は通常のものと異なります**。

本記事では、JSONの禁止の記法やVSCodeにおけるJSON記法を**わかりやすく説明する**ことで、より多くの人に正しい理解を届けることを目指します。

# [1] JSONとは

[JSON](https://www.json.org/json-ja.html)とはJavaScript Object Notationの略であり、JavaScriptの一部の記法に従った軽量のデータフォーマットです。

その特徴としては、人間にとって読み書きがしやすく、機械にとってもパースや生成が簡単であるということです。

# [2] JSONにおけるデータ型

JSONで用いることのできるデータ型は6種類あります。オブジェクト以外は多くの言語で共通する書き方だと思われます。

## (1) 文字列

`""`で囲まれるのが文字列です。コントロール文字を使うこともできます。

```json:文字列
"あいう"
"foo \\bar \n"
```

## (2) 数値

整数、小数、指数、などを扱うことができます。

```json:数値
-10
30.1
1.0e-10
```

## (3) 真偽値

`true`と`false`のいずれかです。

```json:真偽値
true
false
```


## (4) null

値がないことを示す値です。

```json:null
null
```

## (5) 配列

0個以上の値を保持することができます。配列は`[]`で囲まれます。

```json:配列
["foo", "bar", "baz"]
[[10, 10], [20, 20]]
[]
["baz", 100, true, null]
```

## (6) オブジェクト

名前と値の組の集合のことです[^1]。名前は**全て文字列**である必要があります。また、オブジェクトは`{}`で囲まれ、名前と組の間は`:`で区切られます。

```json:オブジェクト
{
    "name": "Daiki Suyama",
    "age": 22,
    "blog": "https://qiita.com/DaikiSuyama"
}
```


# [3] JSONの構成

JSONは先程紹介したオブジェクト1つから構成されます。また、オブジェクトの中にオブジェクトが入るなどの入れ子の構造も許容されます。

```json:JSONの構成
{
    "name": {
        "first": "Daiki",
        "last": "Suyama"
    },
    "age": 22,
    "blog": "https://qiita.com/DaikiSuyama"
}
```

# [4] JSONの注意点

注意点としては2つあります。**末尾のカンマをつけてはならないこと**と**コメントを書くことができないこと**です。いずれも通常のJavaScriptでは使える機能であるため、注意が必要です。

```json:NG例
{
    //自分の名前
    "name": {
        "first": "Daiki",
        "last": "Suyama"
    },
    "age": 22,
    "blog": "https://qiita.com/DaikiSuyama",
}
```

# [5] VSCodeでのJSONの利用

先に述べたように、VSCodeの設定ファイルに用いられるJSON形式は通常のものとは異なり、JSON形式を拡張した[JSON with comments (JSONC) ](https://github.com/microsoft/node-jsonc-parser)形式です。拡張子は`jsonc`です。

この形式では、先に述べた**JSON形式では禁止されているコメントと末尾のカンマが許容**されるため、より人間にとってわかりやすい形式となっています。また、拡張子が`json`であるVSCodeの設定ファイルはJSONC形式として解釈されますが、**自分で作成したJSONファイルは通常のJSON形式として解釈される**ことに注意が必要です。

JSON形式とJSONC形式の混同から間違った記述をする記事が多々見られますが、VSCodeのJSON形式の設定ファイルではコメントと末尾のカンマを用いることができることを再度ご確認ください。

```json-doc:JSONCの構成
{
    //自分の名前
    "name": {
        "first": "Daiki",
        "last": "Suyama"
    },
    "age": 22,
    "blog": "https://qiita.com/DaikiSuyama",
}
```

[^1]: 連想配列と捉えてもこの文脈では差し支えないです。
JavaScript関連記事まとめ

JavaScriptに関する私の書いた記事をまとめました
新しい記事を更新次第、こちらに追加していきます。

[配列　オブジェクト](https://qiita.com/yuka-f/items/33db4e3bcae78570627c)
[繰り返し処理](https://qiita.com/yuka-f/items/f322bc9e365e918001c9)
[真偽値　比較演算子　条件式組み合わせ](https://qiita.com/yuka-f/items/419ec43ed56d8f7dcd3b)
[条件分岐](https://qiita.com/yuka-f/items/10d1c95df9bbf4f23f3a)
[テンプレートリテラル](https://qiita.com/yuka-f/items/34b46d49a8e6e354da1d)
[変数と定数の違い](https://qiita.com/yuka-f/items/a77b3df3acded0156464)
[文字列と数値違い](https://qiita.com/yuka-f/items/f7254fa317d03848f743)
ArduinoUNOと温度,S-5851でOLED温度計 (Arduino)(AL12832AWWB)


1.SCLとSDAを接続、プルアップも忘れずに
2.電源の接続
3.下記のソースコードを書き込む
4.コンパイル実行で表示されたら終了
5.おわり


![h_con12.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/3a58173d-ca0e-c3a9-2824-e691a0b8e46c.jpeg)


x 配線は、データシートを確認して


![h_con15.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/ff5f1157-c105-589a-4d70-7cf6efe196be.jpeg)



```c++

#include <Arduino.h>
#include <U8x8lib.h>
#include <Wire.h> //I2C library

// I2C temperature sensor - see table 1 of data sheet.  Resistor selects address. 
#define S5851A  0x48

//#ifdef U8X8_HAVE_HW_SPI
//#include <SPI.h>
//#endif

U8X8_SSD1306_128X32_UNIVISION_HW_I2C u8x8(/* reset=*/ U8X8_PIN_NONE);   // Adafruit ESP8266/32u4/ARM Boards + FeatherWing OLED

int     cursor1;      //カーソルの位置
char    data_read[8]; //i2cバッファー

void i2c_oled_w(char *s)
{
            //文字の表示
            u8x8.drawString(
            ((cursor1-0) & 0x07  )*2, // x
            (cursor1>>3)*2,           // y
            s);
            
            while(s[0] != 0) {
              s++;
              cursor1++;
            }
            
            //cursor1=cursor1 + 3; 
} //i2c_oled_w

//初期化
void setup(void) {

  delay(2000); //oledのリセット時間

  u8x8.begin();

  u8x8.setFont(u8x8_font_px437wyse700a_2x2_r);

  //スタートロゴ
  cursor1 = 0;
  i2c_oled_w("START");
  delay(500);

  //画面の初期化
  u8x8.drawString( 0,0,"        ");
  u8x8.drawString( 0,2,"        ");
  cursor1 = 0;

  //Wire.begin(sdaPin,sclPin); //f103
  Wire.begin(); //uno

} //setup

int tempval;          //温度
int n0;               //温度　小数点以上
int nt[] = {0,2,5,7}; //温度

void loop(void) {

//  //画面の初期化
//  u8x8.drawString( 0,0,"        ");
//  u8x8.drawString( 0,2,"        ");
  //カーソルのクリア
  cursor1 = 0;

  //0番目のレジスター
  Wire.beginTransmission(S5851A);
  Wire.write(0);
  Wire.endTransmission();
  delay(1);

  //温度の読み込み
  tempval = 99;
  Wire.requestFrom(S5851A, 1);
  while(Wire.available())  {    // 要求より短いデータが来る可能性あり
    tempval = (int)Wire.read(); // 1バイトを受信
  }//while

  //温度をセット
  int n0 = tempval;

  //n0=20; //debug
  
  //画面に表示
  i2c_oled_w("TMP=");
  data_read[0] = '0' + n0/10;;
  data_read[1] = '0' + (  n0-(  (n0/10)  *10)  );
  data_read[2] = '.';
  data_read[3] = '0' + 0;
  data_read[4] = 0; 
  i2c_oled_w(data_read);

  //1秒待つ
  delay(1000);
} //loop



```
商談ステージが後方に移動するのを停止する検証ルール

[Answersで回答する時に使う情報のまとめに戻る](https://qiita.com/Keiji_otsubo/items/9e6e0e946826133eddc7)

+ [Validation Rule - Stop (ONLY FIRST 3 STAGES) Opportunity Stages from moving backwards](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000BrQoB)

こんなやり方で大丈夫みたいです。

```
CASE(StageName, 
"0.0 Identification", 1,
"0.1 Qualification", 2,
"1.0 Requirements", 3,
"2.0 Solutioning", 4,
"3.0 Proposal", 5,
"4.0 Selection", 6,
"5.0 Negotiation", 7,
"5.9 Closed Pending Audit", 8,
"6.0 Closed Won", 9,
"Closed Won", 10,
"7.0 Closed Lost/Disqualified", 11,
0)  <  
CASE(PRIORVALUE(StageName),
"0.0 Identification", 1,
"0.1 Qualification", 2,
"1.0 Requirements", 3,
3)
```

+ [Validation Rule Stage Issue](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000BtFEL)
+ [Validation Rule for Opportunity Stages](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000A7rYRSAZ)


```
AND(
ISCHANGED(StageName),
TEXT(StageName) <> "Closed Lost",
CASE( StageName , 
"Proposal",1, 
"Negotiate",2, 
"Closed Won",3, 
0)
<
CASE(PRIORVALUE(StageName) , 
"Proposal",1, 
"Negotiate",2, 
"Closed Won",3, 
0) + 1
)
```


# あるステータスの時は、管理者だけが変更できるという入力規制

+ [I have a new Stage Option that I need only the System ADmin to be able to use. I have a validation rule written but it is not working:](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000C6KjrSAF)
う～ん、最初からは思いつかん

```
AND(
OR(
TEXT(StageName) = "O2B - 100% Complete",
TEXT(PRIORVALUE(StageName)) = "O2B - 100% Complete"),
$Profile.Name <> "System Administrator"
)
```

# 同じ日には移動できないようにする例

+ [How To Prevent Skipping of Opportunity Stages in the Same Day](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000Ke3YkSAJ)

```
AND(
ISCHANGED(StageName),
(CASE( StageName ,
"0-Prospect",1,
"1-Qualify",2,
"2-Identify",3,
"3-Validate",4,
"4-Negotiate",5,
"5-Closing",6,
"Closed Won",7,
0)
-
CASE(PRIORVALUE(StageName) ,
"0-Prospect",1,
"1-Qualify",2,
"2-Identify",3,
"3-Validate",4,
"4-Negotiate",5,
"5-Closing",6,
"Closed Won",7,
0)
)>1,
IF(TEXT ( StageName) ="3-Validate",
IF(TEXT(PRIORVALUE(StageName)) ="0-Prospect",TODAY() - Date_Moved_to_Stage_0__c,
IF(TEXT(PRIORVALUE(StageName)) ="1-Qualify",TODAY() - Date_Moved_to_Stage_1__c, 
IF(TEXT(PRIORVALUE(StageName)) ="2-Identify",TODAY() - Date_Moved_to_Stage_2__c, 
99))),99) < 1
)
```


# 関連記事

+ [商談の入力規則の例](https://help.salesforce.com/s/articleView?id=sf.fields_useful_validation_formulas_oppty_mgmt.htm&type=5)
+ [Validation Rule at Stage](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000EoUDeSAN)
GCP ; API  GCPのText to Speech API を利用しナレーションを作成する

# GCPのText to Speech API を利用しナレーションを作成する


```

import google.cloud.texttospeech as tts


def text_to_wav(voice_name: str, text: str):
    language_code = "-".join(voice_name.split("-")[:2])
    text_input = tts.SynthesisInput(text=text)
    voice_params = tts.VoiceSelectionParams(
        language_code=language_code, name=voice_name
    )
    audio_config = tts.AudioConfig(audio_encoding=tts.AudioEncoding.LINEAR16)

    client = tts.TextToSpeechClient()
    response = client.synthesize_speech(
        input=text_input, voice=voice_params, audio_config=audio_config
    )

    filename = f"{language_code}.wav"
    with open(filename, "wb") as out:
        out.write(response.audio_content)
        print(f'Generated speech saved to "{filename}"')
```




実際ナレーションを作ったCodeは、

```t2s.py
Created on Sun Jan  3 07:34:38 2021

@author: sf9
"""

from datetime import datetime
from pytz import timezone
from google.cloud import texttospeech
from google.oauth2 import service_account

credentials = service_account.Credentials.from_service_account_file('credentials.json')
client = texttospeech.TextToSpeechClient(credentials=credentials)

f = open('t2s.txt', 'r')
tdata = f.read()
f.close()

synthesis_input = texttospeech.types.SynthesisInput(
 text=tdata)

voice = texttospeech.types.VoiceSelectionParams(
  language_code='ja-JP',
  name='ja-JP-Wavenet-D',
  ssml_gender=texttospeech.enums.SsmlVoiceGender.NEUTRAL)

audio_config = texttospeech.types.AudioConfig(
  audio_encoding=texttospeech.enums.AudioEncoding.MP3,
  speaking_rate = 1.3, pitch = -2.0
  )

response = client.synthesize_speech(synthesis_input, voice, audio_config)

now = datetime.now(timezone('Asia/Tokyo'))
filename = now.strftime('%Y-%m-%d_%H%M%S.mp3')
with open(filename, 'wb') as out:
  out.write(response.audio_content)
  print(f'Audio content written to file {filename}')

```

プレゼン用に作成した男性のナレーション

t2s.txt
を作成し読み込ませるとタイムスタンプがファイル名のmp3が生成される
Swift strideに関して

Stride
---

```swift:Stride.swift
stride(from: 開始値, to: 終了値, by: 刻む数字)
//fromが開始であり、toで終了するがtoは含まれずに繰り返される。

stride(from: 開始, through: 終了値,by:刻む数字）
//throughで指定した値を含む。

```

```swift
for i in stride(from:0,to:6,by:2) {
 print(i)
}
// 0,2,4
for i in stride(from:0,through:6,by:2) {
 print(i)
}
//0,2,4,6

```

・```ｂｙの値に-```を与えられるので逆回しも実装可能。また、浮動小数点もで刻むのも可能。
JavaScript: isEven

isEven というGitHubトレンドに突如現れたライブラリ。

## プロジェクト

https://github.com/samuelmarina/is-even

> This is a 100% serious project,

そのプロジェクト。

中身がこれ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/958e91cc-cff0-b699-f034-c96fe0466c3f.png)

！？！？！

となる


## 作者

https://twitter.com/SamuelLMiller/status/1427702786532196358?s=20


## マジレス

```js
isEven = (n)=>{
    if (n % 2 == 1)
        return false;
    return true;
}
```

しかし容赦はないコメント

https://github.com/samuelmarina/is-even/issues/155#issuecomment-902681241

> What is %? I don't get it

https://github.com/samuelmarina/is-even/issues/155#issuecomment-902821064

> Yes, please don't put file size over readability. The old code is perfectly readable, while this would introduce some weird percentage arithmetic. It's safer to write out the cases explicitly.

> What I do like in your code is that return true and return false is programmed out explicitly instead of doing some hard-to-read magic like return n % 2 != 1. Maybe you could make a PR that changes:

```js
function isEven(number) {
    if (isEvenInternal(number))
        return true;
    return false;
}

function isEvenInternal(number) {
...
```

## isOdd

https://github.com/samuelmarina/is-odd

is odd もある...。


## これは別物

https://isevenapi.xyz/

```
$ curl https://api.isevenapi.xyz/api/iseven/6/

{
  "iseven": true,
  "ad": "Buy isEvenCoin, the hottest new cryptocurrency!"
}
```


## まとめ

意外とpull request と discussionが勉強になる　かもしれない。

https://github.com/samuelmarina/is-even/pulls

https://github.com/samuelmarina/is-even/discussions/75

### 改善は続く...

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/f768461d-bf2f-a431-c8db-2577fada63f2.png)



色々なことを考える人がいるものだ。以上です。
SoftEtherをバージョンアップする方法

SoftEtherのバージョンアップ方法、すっかり忘れてしまっていたので、メモを残しておこうと思います。

:::note warn
このバージョンアップによって、設定済みの情報が上書きされることはないですが、
作業前にバックアップ（スナップショットなど）を取得することをオススメします。
:::

# 前提

- バージョンアップする環境
*Amazon EC2 (Amazon Linux2)*

- 現在稼働中のSoftetherモジュールのパス
*/user/local/vpnserver*

- バージョンアップに使用するモジュールのダウンロード先
*/tmp/vpn*


#1. 現在のバージョンの確認
vpncmdを使用し、現在のバージョンを確認する。`vpncmd`は、vpnserverフォルダの直下にある。

```
$ ./vpncmd /help | grep Version
Version 4.41 Build 9787   (English)
```

#2. モジュールを入手
SoftEtherのサイトより、バージョンアップで使用するモジュールをダウンロードする。

```
$ wget https://www.softether-download.com/files/softether/v4.42-9798-rtm-2023.06.30-tree/Linux/SoftEther_VPN_Server/64bit_-_Intel_x64_or_AMD64/softether-vpnserver-v4.42-9798-rtm-2023.06.30-linux-x64-64bit.tar.gz
```

#3. ダウンロードしたモジュールの解凍

```
$ tar -zxvf softether-vpnserver-v4.42-9798-rtm-2023.06.30-linux-x64-64bit.tar.gz
```

#4. Makeコマンドの実行
tar.gzを解凍すると、`vpnserver`というフォルダができるので、その下で`Make`コマンドを実行する

```
$ cd vpnserver
$ make

・・・

*** PacketiX VPN Server HTML5 Web Administration Console (NEW) ***
This VPN Server / Bridge has the built-in HTML5 Web Administration Console.

After you start the server daemon, you can open the HTML5 Web Administration Console is available at

https://127.0.0.1:5555/
or
https://ip_address_of_the_vpn_server:5555/

This HTML5 page is obviously under construction, and your HTML5 development contribution is very appreciated.

--------------------------------------------------------------------

make[1]: Leaving directory `/tmp/vpn/vpnserver'
$
```

#4. モジュールのコピー
'Make'したモジュールを、現在稼働しているvpnserverフォルダへコピーする。

```
$ cp -Rf ./* /user/local/vpnserver
```

#5. 適用後のバージョンの確認

```
$ ./vpncmd /help | grep Version
Version 4.42 Build 9798   (English)
```

#6. サービスの再起動

```
$ sudo systemctl restart vpnserver
```

以上で終了です。
enum class の使用例

## はじめに
今まで enum はただ定数を保管しておくためのクラスだと思っていたが、業務の中で自分が知らなかった方法で enum を使用していたし、便利だなと思ったのでメモとして残す。

Java Silver の試験には出てこなかった。

## enum class

(1) enum でもコンストラクタの定義ができる。
・ ここでは引数で受け取った名前と血液型を決定

(2) メソッド `getPesonInfo` で `PesonInfo` を初期化して返す。
・ この enum クラスにセットされた名前と血液型を使用して初期化した`PesonInfo`を返す。

```java
package enumTest;

public enum Persons {
    // (3)
    TARO("田中太郎","AB型"),
    YUKA("佐々木優花", "O型");

    // (1)
    Persons(String name, String bloodType){
        this.name = name;
        this.bloodType = bloodType;
    }

    private String name;
    private String bloodType;

    // (2)
    public PersonInfo getPesonInfo(){
        return new PersonInfo(this.name, this.bloodType);
    }
}

```

## PersonInfo class
名前と血液型をフィールドに、コンストラクタを持つ普通のクラス

```java
package enumTest;

public class PersonInfo {
    private String name;
    private String bloodType;

    PersonInfo(String name, String bloodType){
        this.name = name;
        this.bloodType = bloodType;
    }

    public void setName(String name){
        this.name = name;
    }

    public String getName(){
        return this.name;
    }

    public void setBloodType(String bloodType){
        this.bloodType = bloodType;
    }

    public String getBloodType(){
        return this.bloodType;
    }
}

```

## 使用例
(3) `Persons.TARO` で enum class を初期化

(4) メソッドチェーンで `getPesonInfo` 呼び出し。
enum class に定義してある `getPesonInfo` の返却値の型は `PersonInfo`。返却されるときには既に名前と血液型はセットされている。

・ `taroInfo`には (3) で 初期化した際にセットした名前と血液型が格納

```java
package enumTest;

public class Main {
    public static void main(String[] args) {
        // (4)
        PersonInfo taroInfo = Persons.TARO.getPesonInfo();
        System.out.println(taroInfo.getName());
        System.out.println(taroInfo.getBloodType());

        System.out.println("----------------------");

        PersonInfo yukaInfo = Persons.YUKA.getPesonInfo();
        System.out.println(yukaInfo.getName());
        System.out.println(yukaInfo.getBloodType());
    }
}

```

### 出力結果

```
田中太郎
AB型
----------------------
佐々木優花
O型
```

## 終わりに

既にいい記事が出ていた。。。
https://qiita.com/igm50/items/8c9788d4ba5868642c69
Error: Reference to undeclared input variable


netwrok.ftを作成して、terraform planを実行しました。
以下のエラーが発生。
変数定義ができていないことが原因

```

Error: Reference to undeclared input variable

  on network.tf line 12, in resource "aws_vpc" "vpc":
  12:     Name    = "${var.project}-${var.environment}-vpc"
````

terraform.tfvars ファイルが存在し値が設定されているか確認した。
問題ない。

main.tfファイルでの変数の定義を確認。
変数の名前がタイプミスでした。
修正して再度、terraform planを実行。
正常を確認。
yukicoder contest 310 参戦記

# yukicoder contest 310 参戦記

## [A 1650 Moving Coins](https://yukicoder.me/problems/no/1650)

少なくともどれかのコインは目標の場所に移動できるはずなので、移動できるやつを一つ一つ順に動かしていけば答えになる. 移動できるやつを毎回全ての中から探すと *O*(*N*<sup>2</sup>) になってしまい TLE になるが、*A*<sub>*i*</sub> を移動して新しく移動可能になりうるものは *A*<sub>*i*-1</sub> と A<sub>i+1</sub> しかないので、最大でも *O*(3<i>N</i>) となる.

```python
from collections import deque

N = int(input())
A = list(map(int, input().split()))
B = list(map(int, input().split()))

def is_movable(n):
    if A[n] == B[n]:
        return False
    elif A[n] < B[n]:
        if n == N - 1:
            return True
        else:
            return B[n] < A[n + 1]
    elif A[n] > B[n]:
        if n == 0:
            return True
        else:
            return B[n] > A[n - 1]

result = []
q = deque(range(N))
while q:
    i = q.popleft()
    if not is_movable(i):
        continue

    if A[i] < B[i]:
        moves = B[i] - A[i]
        dir = 'R'
    elif A[i] > B[i]:
        moves = A[i] - B[i]
        dir = 'L'

    for _ in range(moves):
        result.append('%d %s' % (i + 1, dir))

    A[i] = B[i]

    if i != 0:
        q.append(i - 1)
    if i != N - 1:
        q.append(i + 1)

print(len(result))
print(*result, sep='\n')
```

左に動かすもののうち一番左にあるものは移動可能に決まっていた. 左に動かすものを左から順に動かしていき、その後で右に動かすものを右から順に動かしていけば簡単に解ける.

```python
N = int(input())
A = list(map(int, input().split()))
B = list(map(int, input().split()))

result = []
for i in range(N):
    if A[i] <= B[i]:
        continue
    for _ in range(A[i] - B[i]):
        result.append('%d L' % (i + 1))
for i in range(N - 1, -1, -1):
    if A[i] >= B[i]:
        continue
    for _ in range(B[i] - A[i]):
        result.append('%d R' % (i + 1))
print(len(result))
print(*result, sep='\n')
```
MacOS でのRubyの環境構築【初心者向け】

https://qiita.com/nishina555/items/63ebd4a508a09c481150

これがわかりやすかったのだが、

`rbenvにパスを通すため、シェルの設定ファイル(.bashrcや.zshrc)に以下を追加します。
`
という説明だけわかりづらかった。
ここを理解するためには、以下の前提知識が必要だ。


前提知識
✅ シェルが何かわかる
✅ bashとzshの違いがわかる
✅ 自分の使用しているシェルが何かわかっている
✅ 以下の記事を理解する

https://qiita.com/okamos/items/c97970ab34ff55ff3167

ここまでわかって初めて`rbenvにパスを通すため、シェルの設定ファイル(.bashrcや.zshrc)に以下を追加します。`の意味がわかるはずだ。

そしてホームディレクトリ直下にある隠しファイルである、 .bashrc や .zshrc　という名前のファイルを編集することができるはずだ。
チェックを4つクリアして

```
vim ~/.zshrc
```

このコマンドを叩こう。
Ubuntu14.04にffmpegインストールするには

railsで動画変換の機能を作った時に必要でした。
macのローカル環境では`brew install ffmpeg`をしたらインストールできましたが、Ubuntu14.04ではこのような記述が必要です。

```
sudo apt-get -y install software-properties-common
sudo add-apt-repository ppa:mc3man/trusty-media
sudo apt-get update
sudo apt-get -y install ffmpeg
```
[Rails]searchアクションの定義方法について

# はじめに
本記事では、７つのアクション以外である
`searchアクション`について記述します。

本日オリジナルアプリで実装したためアウトプットいたします。

# 結論
いきなりですが、コードを載せます。
私のオリジナルアプリは食べ物に関係したものです。

foodsをsearchするという理解でお願いします。

記述の順番としては、
ルーティング→モデル→コントローラーが良いのかなと思っています。

```routes.rb
Rails.application.routes.draw do

  devise_for :users
  root to: 'foods#index'
  resources :foods do
    collection do   #ここから下3行です！！
      get :search
    end
  end
  resources :users, only: :show

end
```

```food.rb
class Food < ApplicationRecord

  belongs_to :user
  has_one_attached :image

  def self.search(search)     #ここから7行です！！
    if search != ""
      Food.where("food_name LIKE(?)", "%#{search}%")
    else
      Food.all
    end
  end

  #省略

  end
end
```

```foods_controller.rb
class FoodsController < ApplicationController

  #省略

  def search       #ここから3行です！！
    @foods = Food.search(params[:keyword])
  end

  # 省略

end
```

# 検索するためのメソッドをモデルに定義
メソッド名は`search`とします。

MVCのお話です。
`モデル`は`共通した処理やデータの関係を定義する`ものです。
ビジネスロジック、つまり`プログラムの処理`は、モデルに記述しましょう。

#　ビューファイルにて
今回は定義方法の記事でしたが、
念の為、ビューファイルも載せます。

```erb
<%= form_with(url: search_foods_path, local: true, method: :get, class: "food-search-form") do |form| %>
   <%= form.text_field :keyword, placeholder: "投稿を検索する", class: "food-search-input" %>
   <%= form.submit "検索", class: "food-search-btn" %>
<% end %>
```

# 終わりに
本日、復習したところでした。

７つのアクションをよく数えてみると、
searchアクションって入ってないなと今更気づいてしまいました。。
気をつけます😇

明日もオリジナル実装に向けて頑張ります！！
Webとは？ 学習二日目

お疲れさまです！takumiです！
簡単に学習できたWebってなんぞやってことに簡単に理解できたらなと思います。

ほんと学習ログなので間違いがあれば教えて下さい！

#Webの知識を持つ必要性

・基本的な知識があると応用が効く
・新しい技術・概念が出てきても習得しやすい

特にRailsをこれからやりたい人はここを分かってないと大変になる・・・。
なので簡単でもいいので理解しときましょって話です。

#Webとはなにか

【結論】
インターネットを通じてドキュメント・テキスト・画像などを閲覧・変更できる技術

・・・まぁ我々がよく使うイメージで問題ないと思います。

#ブラウザでサイトが表示される仕組みの理解

まずブラウザはHTML/CSS/JavaScriptという静的ファイルを読み込んでいます。
なのでこの読み込んだファイルをどう表示するのかはブラウザによって違います。

これがWeb制作していると痛いほどわかりますね。
Chromeだけならいいんですけど、IEでは表示が崩れてしまっていたりするのはこういうことなんですね。

ではブラウザは静的ファイルをどこから受け取っているのでしょうか？
それが「サーバー」の役割です。
ブラウザ(ブラウザはクライアントとも呼ばれる)はサーバーからファイルをダウンロードして読み込んでいます。

このブラウザとサーバーのやり取りによって我々はサイトを閲覧できるのです。

#HTTP
では、このブラウザとサーバーとのやり取りですがルールが存在します。
それがHTTPという手法になります。

ここでは代表的な4つのメソッドを紹介します。

・**GET**
ブラウザが「データくれや！！！！」ってサーバーにリクエストを投げます。
サーバーはブラウザにデータをわたします。
一番スタンダードな通信方法だと思います。
これによって静的ファイルを読み込んでいるのですね。

とくに/はindex.htmlをくれとか、/about.phpではabout.htmlをくれとかここでサーバーとの
ルールを決めているんですね。

・**POST**
ブラウザが「データを保存してくれや！！！！」ってサーバーにリクエストを投げます。
サーバーはデータを保存します。

・**PUT**
ブラウザが「データを変更してくれや！！！！」ってサーバーにリクエストを投げます。
サーバーはデータを保存します。

・**DELETE**
ブラウザが「データを削除してくれや！！！！」ってサーバーにリクエストを投げます。
サーバーはデータを保存します。

以上４つになります。
Twitterなんかもこれらを全て駆使しているので皆さんも使ったことがあると思います。
普段は意識しないと思いますが、裏側ではこのような通信が行われているのです。

このようにサイトを閲覧するときはブラウザがサーバーに様々なメソッドを投げつけて
それに対応するアクションをサーバーが行い、それらの結果をブラウザに出力したりしているんですね。
では、ブラウザはそのサーバーをどうやって特定しているのでしょうか？
サーバーはこの世界に無数にあります。
このQiitaもどこかのサーバーに管理されています。

#IPアドレス、DNS
サーバーにはIPアドレスという住所のようなものが割り当てられています。
これを元にブラウザはサーバーを特定して、特定のやり取りをしています。

しかし、IPアドレスは数字の羅列です。
これらの数字を人間が直感的に扱っていくのは正直面倒です。
なので人間が直感的にわかりやすいようにドメインというものが用意されています。
Qiitaであれば「qiita.com」がドメインになります。
ここで登場するのはDNS(ドメインネームシステム)です。
DNSを利用することでドメインからIPアドレスを取得することが出来ます。

流れを抑えましょう

①ブラウザがDNSに「qiita.comのIP教えてくれや」ってドメインを投げつけます。
そうするとDNSが「x.xxx.xxxx」やでーみたいな感じで数字を教えてくれます。
②そのIPを元にサーバーに「/にGETリクエストや！！」をリクエストします。
その後、サーバーからレスポンスをもらい静的ファイルを読み込んで出力しているんですね。

・・・・ちょっとはイメージをつかめたでしょうか。
より分かったりしたらどんどん書いていこうと思います！
MediaPipeでちょっと困った話

# ことの発端
後輩から、「こんなエラーが出て詰みましたァ！」と元気よく泣きつかれたので調査した。

```
AttributeError: module 'mediapipe.python.solutions' has no attribute 'drawing_styles'
```

# 使用した環境
|               |バージョン|
|---------------|---------|
|Python         |      3.6|
|MediaPipe      |    0.8.3|
あとPyCharm。

# 原因
MediaPipeをインストールするときに、```pip install mediapipe```としたこと。

## なんで？
なんか知らんが、件の```drawing_styles.py```が存在しない。pip installでのパッケージには含まれてないらしい。
[大本のgithub](https://github.com/google/mediapipe/tree/master/mediapipe/python/solutions)を見ると存在してるのにね。
ついでに、以下のファイルたちも含まれていない。なんで？

- face_mesh_connections.py
- hands_connections.py

# 解決方法
以下のファイルたちを、

- drawing_styles.py
- face_mesh_connections.py
- hands_connections.py

[公式](https://github.com/google/mediapipe/tree/master/mediapipe/python/solutions)からダウンロードして以下の場所に保存する。

```
venv/Lib/site-packages/mediapipe/python/solution
```

その後、

```
venv/Lib/site-packages/mediapipe/python/solution/__init_.py
```

に

```python3
import mediapipe.python.solutions.drawing_styles
```

を追記する。
その後、

```python3
import mediapipe as mp
ds = mp.solutions.drawing_styles
```

を実行してエラーがでなければOK。

***

### 余談
この１件でMediaPipeなるものを知ったが、これ凄いね。
あんな高速に手や顔の認識ができるなんて。
コーディングに自信のある人ならLeapMotionの代わりに使えたりするんじゃない？
てかUnityとかと組み合わせられないのかね。VR系でも使いみちが多そうだけど。
気になったから調べたけど普通に[Unity対応してるわ](https://qiita.com/yamatohkd/items/b2d9a6055761b0b2c369)これ。
とんでもねえな。
React 入門道場　~React 速攻! 環境構築~

# 環境構築

**速攻環境構築　-Create-React-App-**

Create-React-Appって？
Create-React-AppはReactを学習するのに快適な環境であり、ReactでSPAを作成するのに最適な方法です。

# React ツールチェイン
**ツールチェインって？**
Reactを環境構築するツールとなります。環境構築はツールチェインを使う方法か使わない方法の2通りがあります。

仮に、使わない方法を選択した場合、以下を設定する工程が発生します...

* 大量のファイルとコンポーネントでスケールする
* npm を通してサードパーティライブラリを利用する
* よくある間違いを早期に発見する
* 開発環境で CSS と JS をライブ編集する
* 本番用の出力を最適化する

ツールチェインは**始めるにあたって設定が不要です。**

非常にありがたいです😎

>[React 公式ドキュメント](https://ja.reactjs.org/docs/create-a-new-react-app.html)

# Create-React-Appに必要な要件

* node.js 10.16以上
* npm 5.6以上

(解説)
node.js...サーバー環境で動くJavascript
npm...Node Package Manager の略
JavaScript 系のパッケージを管理するツール

ポイント☝️　__上記インストールのためにhomebrew、nodebrewが必要__


(解説)
* Homebrew...MacOSのパージョン管理
* nodebrew...Nodeのパージョン管理


# インストール手順

1. Homebrewのインストール
2. nodebrewのインストール
2. nodeのインストール
2. nodeの環境パスを通す


# Homebrewのインストール


[Homebrew](https://brew.sh/index_ja)
macOSのターミナルまたはLinuxのシェルプロンプトに貼り付けて下さい。

インストール後、バージョンを確認します。

```
brew -v
```

# nodebrewのインストール

ポイント☝️　nodebrewをインストールするのにHomebrewが必要になる

```
brew install nodebrew
```

インストール終了後


```
nodebrew -v
```

そうすると、nodeのバージョンが表示されます。

# nodeのインストール

```
nodebrew ls remote
```

![スクリーンショット .png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1572216/c6072493-1168-fa2b-deae-347f5894e46d.png)

バージョンが沢山出てきましたが、安定板のバージョンをインストールしましょう！

```
nodebrew install stable
```
インストール終了後、Installed seccessfullyが表示されれば成功です🥰

```
nodebrew ls
```
現在インストールされているnodeのバージョン一覧

```
nodebrew ls
```
インストールしたバージョンを使うには

```
nodebrew use 16.1.0 //あくまでも一例です。使いたいバージョンに合わせてインストールしてください。
```

# nodeの環境パスを通す

ポイント☝️　 使うSHELLによってコマンドが異なる


```
echo $SHELL
```
* zsh(新しめのMac)
* bash(古めのMac)

__zsh__


```
echo 'export PATH=$HOME/.nodebrew/current/bin:$PATH' >> ~/.zprofile
```
__bash__

```
echo 'export PATH=$HOME/.nodebrew/current/bin:$PATH' >> ~/.bash_profile
```

# バージョン確認

* node.js 10.16以上
* npm 5.6以上を満たしているか確認しましょう。

```
node -V
npm -V
```

要件を満たしたら、開発環境に移動してCreate-React-Appを構築していきましょう！:frowning2:

# いよいよ！Create-React-App

```:raised_hand:
npx create-react-app フォルダ名
```
見事に環境を構築することが出来ました:relaxed:
![スクリーンショット 2021-08-21 1.19.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1572216/ea84dc9c-04de-a022-2a1b-356e1971e58c.png)


***

以上がCreate-React-Appを使った環境構築でした。
大変だと感じた方は環境構築なしでWeb 上で試せるオンラインエディタあるみたいので試してみて下さい:raised_hand_tone1:


>[React オンラインエディタ](https://codesandbox.io/s/new
)
>
【課題４】AWSAmplifyを使用してTodoアプリを開発

# 作成したアプリについて
**AWSAmplify**を用いて、**TypeScript + Redux**の構成でTodoアプリを作りました。

https://docs.amplify.aws/start/q/integration/react/

基本的に、こちらのチュートリアルに沿って進めていきます。

# AWSの概要
AWSとは、**クラウドコンピューティング**を使ったサービスです。
また、AWSとは**Amazon Web Services**の略で、Amazonが提供している100以上のクラウドコンピューティングサービスの総称になります。

**クラウドコンピューティング**とは、インターネットを介してサーバー・ストレージ・データベース・ソフトウェアといったコンピュータを使った様々なサービスを利用することを指します。

クラウドコンピューティングでは、手元に１台のPCとインターネットに接続できる環境さえあれば、サーバーや大容量のストレージ、高速なデータベースなどを必要な分だけ利用できるわけです。

### AWSを利用し実現できること
**ビジネスのスピードを加速させる。**

1. 豊富なサービス
1. 世界最上級の運用専門知識
1. 最もセキュアなセキュリティ基準
1. 安心できる情報網（コミュニティやパートナーの存在）
1. まったく新しいテクノロジーを最速で提供し続けるサービスコンセプト

コスト削減や俊敏性を高めビジネスの効率化、ビジネススピードを加速化しイノベーションの加速を実現。

### AWSでできること
#### サービス系
- サーバー環境構築(EC2)
- データ保存(S3)
- コンテンツ配信（S3）
- データベース利用（RDS）
- 専用回線（AWS Direct Connect）
- セキュリティ対策（Amazon Inspector）

#### プラットフォーム系
- AI活用/データ分析（Amazon Personalize）
- ワークフロー管理（Amazon Simple Workflow）
- メール/通知（AWS SES）
- 開発（AWS CodeStar）

### 代表的な４サービス
#### サーバー環境構築
- Amazon EC2

#### データ保存/コンテンツ配信
- Amazon S3

#### データベース利用
- Amazon RDS

#### プログラムの実行環境
- AWS Lambda


# AWSAmplifyの概要
**AWS Amplify**とは、クラウドサービス上におけるモバイルアプリケーションやWebアプリケーションを**安全に構築**するためのプラットフォームになります。**「クラウドサービス上にモバイルアプリケーションを安全に構築するための方法」**ということです。

### AWS Amplifyの使い方
AWS Amplifyの使い方としては、AWSの各種サービスを使ったアプリケーションを**スピーディーで効率よく**作成したり、**サーバレスバックエンドの自動構築**をしたり、**フロントエンドからバックエンドを利用するためのコードの生成**などです。

モバイルアプリケーションを構築したい人や、アプリケーション実装に集中したい人にAWS Amplifyは、非常に適正があります。

### AWS Amplifyの６つの特徴
- Analytics
- API
- Auth
- Pub/Sub
- Storage
- XR

# 自身が今回の課題をこなす上で苦労した点
- チュートリアルの選択肢の選定
- もともとのコードをReduxやTypeScriptに置き換えてアレンジする

# 苦労した点をどのように克服したか
１つ目は、チュートリアルの選択肢についてですが、今回は**TypeScript**や**Redux**の構成に変更しての実装だったので、もともとのチュートリアルの構成とは選択する項目が若干変わってきます。

そのせいもあって、一度最後まで進めたのですが、どこかで選択ミスがあったようでエラーに見舞われ、最初からやりなおす羽目に。。
なので２回目は、慎重に英文を翻訳し、選択肢が違う箇所については、しっかりとネットで検索しつつ、状況を照らし合わせながら進みました。

おかげで、２回目は最初に見舞われたエラーは現れず、無事チュートリアルを終えることが出来ました。

英語、日本語ともに、ドキュメントを**「読んだつもり」**になることが多々あります。
わからないところは「なぁなぁ」にせず、しっかり理解しながらすすめる癖を付けたいです。（エラー解決にもつながるはず）

２つ目の**アレンジ**ですが、作業取り掛かりの段階で「うーん」と頭を悩ませました。

**「何をアレンジしようか」**というところからのスタートなのですが、今までやったことを応用することを考え、**react-hook-form**や、**Redux**での**Stateの管理**を使って、既存のコードを置き換えてみることにしました。

やはり作業始めたての頃は、やることがたくさんあって「どこから手を付けようか」と、下手したらあれこれ触っちゃって”わけがわからない”という状況になることもあります。

きちんと一つずつ整理して、順番にすすめていくことで、ごちゃごちゃにならずに実装出来るようになります。

**Github**の**issue**を使ったり、`console.log()`や**Redux Dev Tools**での細かい確認が、確実で早くゴールにたどり着くコツでもあります。
特に**issue**を使う方法は、**言語化する**ことで頭がスッキリするのか、進むべき道が見えやすくなる気がします。


# 参考サイト
https://chott-works.com/tips/AWS/Amplify/Init

https://keizokuma.com/js-array-object-sort/

# まとめ
**Amplify**のチュートリアル通りにすすめるだけで、サインインなどの**認証機能**や、**Todoアプリ**をあれほど簡単に作れるのは驚きです。

また、今回は既存のコードをアレンジすることで、**Redux**や**TypeScript**の理解もより深まりましたし、もともとのコードを応用して使う力、考える力がついたように思います。

更に、いくつかのエラーと向き合う中で、

>- エラー文を理解する
- 何がおかしいのか仮説を立てる
- 仮説をもとに検証する

というステップの踏み方も体験することが出来ました。

エラーとの遭遇がやはり一番怖いといっても過言ではないので、今後もしっかりエラーを理解する癖を付けていこうと思います。
KotlinのContract機能について


# 概要

Kotlin Contractsとは簡単に言うと、コンパイラに対象のメソッドを呼んだあとは、「想定のエラーは起きませんよ」と伝えることができる機能です。Kotlin1.3から導入されました。まだ、experimentalな機能です。

-----
# 簡単な例
-----


```kotlin
data class DataDto(val str: String)

private fun process1(dto: DataDto?) {
    validate(dto)
    println(dto.str) // コンパイルエラー
}

private fun validate(dto : DataDto?) {
    if (dto == null) {
        throw IllegalArgumentException()
    }
}
```

この例では、dtoはnullableですが、`validate()` メソッドの後では、nullはありえません。
しかし、コンパイラはそれがわからないので `dto.str` をエラーにします。
これがエラーの内容です。
`Only safe (?.) or non-null asserted (!!.) calls are allowed on a nullable receiver of type DataDto?`


-----

これをContractsによって、コンパイラに伝えると

-----

```kotlin
+ @ExperimentalContracts
  private fun validate(dto : DataDto?) {
+    contract {
+        returns() implies (dto != null)
+    }
     if (dto == null) {
         throw IllegalArgumentException()
     }
```

これだけで、`validate()`メソッドを呼んだ後のdtoはnullはあり得ないことが、コンパイラに伝わります。 
そのため `dto.str`はコンパイルが通ります。

-----

## 制限事項

-----

引数だけ対象になっています。
たとえば、以下のように`DataDto#str` がnullでない場合を保証しようとしてもできません。

```kotlin
data class DataDto(val str: String?)

@ExperimentalContracts
private fun process1(dto: DataDto?) {
    validate(dto)
    println(dto.str) // コンパイルエラー
}

@ExperimentalContracts
private fun validate(dto : DataDto?) {
   contract {
       returns() implies (dto?.str != null) // コンパイルエラー
   }
     if (dto?.str == null) {
         throw IllegalArgumentException()
     }
```

-----

# 条件指定

-----

## returns 

-----

`returns` で返した値の場合だけコンパイルエラーを回避できるようできます。 
以下の例は、`returns(true)` でtrueの場合だけ、コンパイルが通るようになります。

```kotlin
@ExperimentalContracts
private fun process2(dto: Any) {
    if (isDataDto(dto)){
        println(dto.str) // コンパイルエラーなし
    }
}

@ExperimentalContracts
fun isDataDto(dto: Any): Boolean {
    contract {
        returns(true) implies (dto is DataDto)
    }
    return dto is DataDto
}
```

`isDataDto()` がtrueかどうかわからない場合は、当然コンパイルエラーになります。



```kotlin
@ExperimentalContracts
private fun process2(dto: Any) {
    if (isDataDto(dto)){
        println(dto.str) // コンパイルエラーなし
    }
+   println(dto.str) // コンパイルエラー
}
```

-----

## returnsNotNull

正直、よくわかってないです。わかる方教えて欲しいです。

メソッドの戻り値で、nullがこないってこと？
だとしたら、メソッド定義でnot nullにすればいいだけな気がしています。

-----

## callsInPlace

-----

関数が呼ばれる回数を保証して、コンパイルエラーを回避させます。
AT_MOST_ONCE=0 or 1 、AT_LEAST_ONCE=1以上、EXACTLY_ONCE=1、UNKNOWN=何回でも、を指定できます。

```kotlin
@ExperimentalContracts
inline fun <R> run(block: () -> R): R {
    contract {
        callsInPlace(block, InvocationKind.EXACTLY_ONCE)
    }
    return block()
}

@ExperimentalContracts
fun process3() {
    val i: Int
    run {
        i = 1 // callsInPlaceがなければ、valに二度設定できるかもしれないのでエラーになる。
    }
    println(i) // callsInPlaceがなければ、設定してるかわからないのでエラーになる。
}
```
【Linux】はじめてのパーミッション

## パーミッションってなに？
パーミッションとは、ファイルやディレクトリにアクセスするために与えられる権限。普段何気なく開いているファイルやディレクトリはこの権限が与えられているから開くことができる

## パーミッションの種類
まずパーミッションには「実行権」と「所有権」がある

**実行権**

|記号|意味|ファイル|ディレクトリ|
|-|:-:|:-:|:-:|
|r|読み込み権限 (readable)|開ける|ディレクトリの中を見れる|
|w|書き込み権限 (writable)|編集できる|ディレクトリの中にファイルなどを作成できる|
|x|実行権限 (executable)|実行できる|カレントディレクトリにできる|

**所有権**

|種類|説明|
|:-:|:-:|
|所有者|ファイルやディレクトリの所有者|
|グループ|所有者と同じグループの人|
|その他|上記以外|

実際にどんな感じで割り振られているのか見てみる

## パーミッションの確認
パーミッションを確認するときは以下のコマンドを入力

```
$ ls -l
```
結果↓

```sh
-rw-r--r--  1 user  group   0  8 21 00:06 index.html
-rw-r--r--  1 user  group   0  8 21 00:06 memo.txt
drwxr-xr-x  2 user  group  64  8 21 00:11 test/
```
最初のほうになにやら「r」とか「w」とかある、これが実際に割り振られている権限。
これ分解してみるとこんな下の表のようになる

|ファイルタイプ|所有者の権限|グループの権限|その他の権限|
|:-:|:-:|:-:|:-:|
|-|rw-|r--|r--|
|-|rw-|r--|r--|
|d|rwx|r-x|r-x|

つまり、index.htmlという所有者が「読み」「書き」できるが、それ以外の権限の持ち主は「読み」しかできず、ファイルの中身を書き換えることができない。

ちなみにファイルタイプの「d」というのはディレクトリであるということを表し
「-」は指定しないという意味になる。

またこれらの権限は数字で表すこともできる。

|r|w|x|
|:-:|:-:|:-:|
|4|2|1|

なので例えば上記のindex.htmlというファイルの権限は
所有者の権限が「rw-」で「r(4)」と「w(2)」を足して「6」
グループの権限が「r--」だから「4」
その他の権限が「r--」だから「4」
したがって
「644」と表すことができる。

## パーミッションを変更してみる
試しにパーミッションを変更してみる！
パーミッションの変更には下記コマンドを入力。

```sh
$ chmod 【権限】 【対象ファイル】
```
先程のindex.htmlですべてのユーザーにすべての権限を与えてみる。「4(r)+2(w)+1(x)」なので「7」、さらにすべてのユーザーが権限を持つことになるから「777」。実行してみる。

```
$ chmod 777 index.html
```
確認する↓

```
$ ls -l

total 0
-rwxrwxrwx  1 user  group   0  8 21 00:06 index.html*
-rw-r--r--  1 user  group   0  8 21 00:06 memo.txt
drwxr-xr-x  2 user  group  64  8 21 00:11 test/
```
「index.html」の権限が「-rwxrwxrwx」になっている！
これですべてのユーザーにすべての権限が付与された。

ここでは例ですべてのユーザーにすべての権限を付与したが、実際に稼働しているサイトやサービスなどで同じことをしてしまうと大変なことになってしまうから、気をつけましょう。

終わり
【cygwin】numpy, matplotlib, scipy, pandasのインストール

# １．はじめに

[SciPy.org](https://www.scipy.org/install.html#pip-install) で紹介している次の手順で、numpy, matploglib, scipy, pandasがインストールできなかった。

```
python -m pip install --user numpy scipy matplotlib ipython jupyter pandas sympy nose
```

アレコレ試行錯誤したので、メモを書き出しておく。

# ２．環境と補足
scipyを除けば、現在（2021-08-21）の最新版。

- windows10 64bin/cygwin64
- python 3.8
- matplotlib 3.4.3
- numpy 1.21.2
- pandas 1.3.2
- scipy 1.6.3(最新は1.7.1)

半年に1回くらいのペースでcygwin環境を作り直していて、その時に必要なパッケージを都度インストールする。そのため、足らないパッケージのエラーに遭遇することが多い。scipy以外は、こんなところで躓く輩はいないと思うが、何かのヒントになれば嬉しい。

# ３．インストール
## 今回の学び
```pip install -U {package}``` でエラーになったら、次のことを検討する。

- ```python setup.py install``` を試す。エラーが出ても対処しやすい。
- バージョンを確認して少し古いバージョンをインストールしてみる。

## numpayとmatplotlib
1. 一端cygwinで次のパッケージをインストール
    - ```python38-numpy```
    - ```python38-matplotlib```
    - ```gcc-g++```
2. 改めてpipでインストール
    - ```pip install --upgrade numpy```
    - ```pip install --upgrade matploglib```

## scipy
scipy 1.7.1は ```linux/tipc.hがない``` とエラーになってインスールできない。

```scipy-1.7.1.tar.gz``` を使って ```python setup.py install```でもエラーになったが、```pip install``` でのエラーより原因の特定が楽だった。

エラーに応じて追加インストールしたのは、次のパッケージ
- ```pip install pybind11```
- ```pip install pythran```
- ```cygwin/gcc-fortran```
- ```cygwin/python3-devel``` … ```linux/tips.h``` の原因はこれだったはず。

これでもインストールはできず、 ```scipy-1.6.3.tar.gz``` を使って ```python setup.py install``` した。```pip install scipy==1.6.3``` でもイケたかも。

後付情報だが、これを知っていれば解決は早かったかもしれない。
- [yasuokaの日記： CygwinにSciPyをインストール](https://srad.jp/~yasuoka/journal/637239/)

## pandas
```pandas-1.3.2.tar.gz``` をダウンロードして、 ```python setup.py install``` でインストール。時間は掛かる。

```pip install pandas``` でもインストールできていたかもしれなけど、 ```python setup.py install``` の方が途中経過が見れるので気分的に楽。インストール後は、pipとして登録される。


# ４．その他
## scipy 1.7.x について
いずれ公開される1.7.2とか1.7.3ならインスールできるかもしれない。
気付いたら試す。

エラー内容は次の通り

```bash
WORKING_DIRECTORY/scipy-1.7.1/scipy/_lib/boost/boost/math/tools/promotion.hpp:148:37: error: static assertion failed: Sorry, but this platform does not have sufficient long double support for the special functions to be reliably implemented.
```

Cygwin64環境なのに、 ```this platform does not have sufficient long double support``` とエラーになっています。おっさん、降参。

## 参考になりそうな記事
[yasuokaの日記： CygwinにSciPyをインストール](https://srad.jp/~yasuoka/journal/637239/)

最初に知っていたら作業時間が短縮できていたかもしれない。

# 以上
Ruby技術者認定試験 Silverに合格した私の勉強方法

これまで勉強してきたRubyの力試しとして受験した「Ruby技術者認定試験 Silver」に合格したので勉強方法をまとめます。

#目次
- 前提条件
- 受験をしようと思った背景
- 勉強期間
- 勉強方法
- 試験結果と試験後の振り返り

##前提条件
- 非エンジニア・実務経験なし（当時は絶賛職探し中でした）
- プログラミングスクールで半年間、Rubyを学習
- スクールにてチーム開発、卒業後は個人開発の経験あり
- Ruby以外のバッグエンド言語は全く学習経験なし


##受験をしようと思った背景
プログラミングスクールでRubyの基礎を学び、学びのアウトプットの一つとしてRubyの資格をとることにしました。

職探しでは、主に資格より実際の個人アプリの作成などのアウトプットが重視されることはわかっていたので、この資格はどちらかというと「人に証明するため」というよりは「勉強フェーズの一区切り」として受験することにしました。


##勉強期間

申込日：2021年5月8日
↓　（50日）
受験日：2021年6月27日

申込した日から勉強を行ったので、勉強期間は約1ヵ月半です。

最初の方は、1日1時間程度勉強していたと思います。
直前の2週間前ほどは1日2時間程度勉強しました。
（とはいえ、毎日欠かさずといった感じではありませんでしたが・・）

##勉強方法

###**ステップ1（勉強開始初日、試験日の1ヶ月半前）**
####**まずは模擬テストを受けてみる**

まずは、[REx](https://rex.libertyfish.co.jp/)という模擬テストが受けれるサイトで自分の能力を測りました。
結果は、、![Screen Shot 2021-08-20 at 23.07.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634267/e9cac0be-aeb5-9919-939c-26a1747d9a67.png)

まあまあまあまあ、、、

勉強していないのだから仕方ないと自分を納得させ、勉強のモチベーションを上げました。

先人達のブログを拝見すると、試験前日にはこのRExの模擬試験で90点台が安定して取れている必要があると書かれていたので、一番最初に自分のレベルを知り目標とのギャップが知れたことはとても重要だったと思います。

また、RExは毎回受けるごとの点数が記録されていくので、自分の成長の記録が残り達成感を味わうことができるのもいいと思います。

***

###**ステップ2（試験日の1ヶ月半前〜3週間前）**
####**Ruby技術者認定試験合格教本によるインプット学習**

Ruby技術者認定試験の公式の参考書である以下の本を購入。
こちらの本は、模擬試験・演習問題が本の後半についていますが、この時点では手を付けずに、まずは前半部分の内容のインプットからはじました。

意図としては、ステップ１で自分が公式模擬試験を受けるレベルに達していないことがわかっていたので、この時点で解いてしまい答えを覚えてしまうことをもったいなく感じ、ステップアップした自分に解かせたかったためです。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634267/86472ea7-42e3-c234-558f-e526318c8c10.png" width=50%>


Silverの範囲となる以下の章を重点的に読みました。
この時点では、試験での出題問題の傾向などは把握しておらず、網羅的にインプットしていました。

- 第3章：文法
- 第4章：オブジェクト指向
- 第5章：組み込みクラス

####**ReXによる模擬試験を定期的に受験**
また、教本での学習と並行して、RExの模擬試験を定期的に受験するようにしていました。

RExの模擬試験は、しばらく受けていると気づくと思いますが、出題問題がパターン化されています。なので、必然的に答えを覚えてきてしまうと思いますが、なぜその答えになるのか自力で解説できるようになることが大事だと思います。

***

###**ステップ3（3週間前〜試験前日）**
####**正答率100%になるまで、各模擬試験を受けまくる**
模擬試験（演習問題）は私が把握しているだけでも以下の5つあります。

1. Ruby技術者認定試験合格教本の演習問題(30問)
2. Ruby技術者認定試験合格教本の模擬試験(50問)
3. [REx](https://rex.libertyfish.co.jp/)の模擬試験(50問×数パターン)
4. [silver_j.md](https://gist.github.com/sean2121/945035ef2341f0c39bf40762cd8531e0)の模擬試験(50問)
5. [ミニツク](http://www.minituku.net/courses/1049510743/contents/775230600.html)の演習問題(10問×6ドリル)

ここのステップ3の最初のタイミングでは、RExで70〜80点台を取れるようになってきていて、安心していたのですが、これまで解いたことのなかった問題集を解くと、あらびっくり。

全然解けない問題があることに気づき、RExで70〜80点台取れるのは、無意識的に答えを覚えてしまっているからなのだと気づきました。

そして、上記５つの問題を解きまくっているとこの試験の出題問題に傾向があることが分かってきます。

そのその傾向問題の部分を改めて教本でインプットしなおした上で、各問題集を受けまくり、前日までには全ての問題で100%の正答率を出せるようにしておきました。


##試験結果と試験後の振り返り
結果は、「80点」※合格点は75点
受かってよかったですが、ギリギリでした・・

正直、全ての模擬試験で100点取れる状態で臨んだので、もう少し取れると思っていましたが、やはり模擬試験は何度も受けて意識はせずとも答えを知っていたから、というのがあったんですね

この試験のコツは、「出題傾向を特定し、それらに集中して、深く理解すること」だと思います。
PlantUML を QuickLook するアプリケーション拡張を作りました

## PlantUML を QuickLook するアプリケーション拡張を作りました

　PlantUML を QuickLook で表示するアプリケーションプラグインです。

　ソースは [GitHub](https://github.com/TachyPochy/plantuml-quicklook) に置きました（現在、[ソースで配布するしかないという問題](https://qiita.com/Tachy_Pochy/questions/2111fd9bc8e04713a2f0)があります）。

　PlantUML は、編集中こそ Visual Studio Code などを使用して同時プレビューしながら作業が簡単です。しかし編集後は、ちょっと確認するためにエディタを起動するなど面倒です。QuickLook を使えるようにしたいです。

## Environment

　開発に使用した環境は以下の通りです。

- macOS Catalina 10.15.7
- XCode 12.4(12D4e)
- Swift 5.3.2

　これ以上の環境なら、おそらくビルドできるでしょう。

## 対応する拡張子

以下のファイル拡張子を PlantUML ファイルとして扱います。

- pu
- puml
- plantuml
- wsd
- iuml

## 設定

　`src/PlantUMLQuickLook/Info.plist` にて、下記の設定を変更できます。

### PlantUmlServer

　現在の設定は以下です。

```
http://www.plantuml.com/plantuml/png/
```

　ご自身で PlantUML サーバーを建てていたら、変更できます。その際は `/png/` まで指定してください。`/png/` しか対応していません。`/svg/` としてもうまくいきません。

　またローカルコマンドを使用したい場合、ここに `plantuml.jar` へのフルパスを設定することもできます。例えば以下のように。

```
/Applications/plantuml.jar
```

### javaCommandPath

　上記 `PlantUmlServer` 設定で、ローカルの `.jar` ファイルを選択した場合に使用します。

### catCommandPath

　上記 `PlantUmlServer` 設定で、ローカルの `.jar` ファイルを選択した場合に使用します。

## インストール？方法

　Xcode でビルドすると、上記拡張子が PlantUML として QuickLook できます。

## TODO

- [APPEX だけ配布するにはどうすればいいのでしょう？【質問中】](https://qiita.com/Tachy_Pochy/questions/2111fd9bc8e04713a2f0)
- 設定を `defaults write` コマンドで書き換えられるようにするには？
- キャッシュが、QuickLook 標準の場所にできてほしい。`qlmanage -r cache` で削除されて欲しい。

## 参考

- [Xcode 12でmacOS用のQuick Look機能拡張を作成する](https://zenn.dev/paraches/articles/xcode12-quicklook-appex)
- [Golang and pure Swift Compression and Decompression | Splinter Software](http://www.splinter.com.au/2019/07/28/go-and-pure-swift-compression-decompression/)
- [mdlsコマンドで アプリケーションのCFBundleIdentifier ( bundle Identifier )の文字列を探す - それマグで！](https://takuya-1st.hatenablog.jp/entry/2018/09/01/191512)
#PowerApps 選択可能なカメラを簡単に指定する方法

Power Apps のカメラコントロールを利用する際に、フロント（正面）なのかバック（背面）なのか”方向”を指定する際に、以前は数値で指定していました。ドロップダウンに配列指定したり、コンボボックスで選択させたり、という対応ですね。
記事投稿時点（2021年8月）では、もっと良いやり方があります。

# 過去のやり方
以前に Up した記事が参考になると思います。

- [PowerAppsカメラコントロールでハマった](https://qiita.com/yamad365/items/c44c2c3bd5bd31f06892#%E4%BD%9C%E3%82%8A%E3%81%9F%E3%81%8B%E3%81%A3%E3%81%9F%E3%83%A2%E3%83%8E)
- [【PowerApps Tip's】撮影ボタンを実現する(注意点アリ)](https://qiita.com/yamad365/items/01b6dd19d1988718e3b0)
- [#PowerApps カメラコントロールのサイズとデバイス依存](https://qiita.com/yamad365/items/ca5bdfd8f0d5f4e092f9)

他にもカメラコントロールのネタで記事を書いてるかもしれませんが、もう十分ですかね。上記の記事中に登場する画像のように、カメラの”方向”は数値で指定していました。

# AvailableDevices プロパティ
イツ登場したのか？全く記憶にないのですが、1年ほど前には存在していなかった新しいプロパティがカメラコントロールに追加されています。そのプロパティを利用すると「現在 Power Apps アプリが動作している環境で利用可能なカメラデバイス」を一覧（厳密にはテーブル型）で取得することができます。


[Camera control > Key properties](https://docs.microsoft.com/en-us/powerapps/maker/canvas-apps/controls/control-camera?WT.mc_id=BA-MVP-5004053#key-properties)

上記 Docs にも説明がある「AvailableDevices」がソレに該当します。

# AvailableDevices プロパティの利用例
おそらく主要な利用方法を例に説明します。

## 解説用アプリ
キャンバスアプリにドロップダウンとカメラコントロールを配置しただけ、です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/a87bd3d4-8980-e2ab-ab72-8f2f9361a441.png)
ドロップダウンに“OBS Virtual Camera”と表示されていますよね。
コレなんですよ。便利なヤツは。
## Dropdown
ドロップダウンコントロールは下記の設定になっています。

``` Dropdown1.Items
Camera1.AvailableDevices
```
数式バーのデバッグを利用してプロパティから取得可能な値を確認すると下記になります。カメラが5つ（IDはゼロ始まり）だと把握できます。また、デバイス名も Name 列で把握できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/485c019b-67dd-03a4-8b88-ed2ea15a38ac.png)
取得されるカメラの個数は実行している環境に依存します。当方の PC は仮想デバイスをあわせて 5 つのカメラが選択可能だよ、ということです。なお、Power Apps上で、Snap Camera や OBS 等の仮想デバイスも正しく認識できていますね。

つまり、カメラコントロールを配置して「AvailableDevices」を参照することで『現在利用可能なカメラが一覧で取得可能』である、と把握できます。

おそらく、ブラウザーがアクセス可能なカメラの一覧だと推測されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/7f2e6e72-dc78-2b64-711c-6bc9887cd858.png)
状況証拠からの推測ですが Edge の場合では [設定]→[Cookie とサイトのアクセス許可]→[サイトのアクセス許可] のページにある [ブラウザーがアクセスできるカメラを選択する] のドロップダウンに表示される内容でしょう。

## Camera 
カメラコントロールの[Camera]プロパティはこちら。

``` Camera1.Camera
Dropdown1.Selected.Id
```
前述のドロップダウンで選択された［Id］を指定しています。これでカメラの方向（向き）が切り替わりますよね？
念のため、デバッグ表示される値を確認してみると、ちゃんと数値です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/2b90fb62-7fc6-5e5a-6b19-b423e1b7a6fe.png)

## 動作イメージ
想定通りの動作だとは思いますが、参考までに。

<blockquote class="twitter-tweet"><p lang="fr" dir="ltr"><a href="https://twitter.com/hashtag/PowerApps?src=hash&amp;ref_src=twsrc%5Etfw">#PowerApps</a> CameraControl AvailableDevices <a href="https://t.co/cxXI83VQnl">pic.twitter.com/cxXI83VQnl</a></p>&mdash; やま (Yama) (@yamad365) <a href="https://twitter.com/yamad365/status/1428731593758105600?ref_src=twsrc%5Etfw">August 20, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
# まとめ
カメラコントロールの［AvailableDevices］プロパティを利用することで、実行環境のカメラデバイスをまとめて取得できるようになりました。最近のデバイスは機種によってカメラの個数に統一感は無いし、フロントとバックのカメラIDも機種でバラバラです。そのため、過去は「5つもあれば十分だろう」という推測で配列などを作っていました。

が、今はもう必要なくなりました！
便利なプロパティを利用していきましょう。

それでは、皆さま。素晴らしい Power Platform Life を！
テスト44

```vb

'ExcelからPDFを出力する時にA4にならない時の解決方法
'参考:『エクセルからPDF保存してFAX原稿を作成するとA4サイズにならない』
'https://nexlink-cs.nlk.jp/090_FAQ/detail_basic/00190.html

Sub Print_Select()

Dim myprint As Variant
'('ω')～♪
myprint = Application.ActivePrinter
Dim p As String
p = "C:\Users\User\Desktop\VBA練習\aa.oxps"

Call ActiveSheet.PrintOut(PrintToFile:=True, _
                                      PrToFileName:=p, _
                                      ActivePrinter:="Microsoft XPS Document Writer")
Kill p

'---------------------
'PDFで保存する処理
'---------------------

Application.ActivePrinter = myprint

End Sub


'Sub PDF_Open(strFileName As String)
'Dim objWSH As Object
'Dim Limit As Date
'Dim hwnd As Long
'Dim edt_hwnd As Long
'Dim btn_hwnd As Long
'Dim strPassword As String
'
''以下必要に応じて変更
''--------------------------------------
''制限時間(5秒)
'Limit = Now + TimeValue("00:00:05")
''PDFファイルのパスワード
'strPassword = "123"
''--------------------------------------
'
'Set objWSH = CreateObject("Wscript.Shell")
''PDFファイルオープン
'objWSH.Run """" & strFileName & """", 1
'
''パスワードダイアログのハンドル取得
'Do Until hwnd <> 0
'hwnd = FindWindow("#32770", "パスワード")
''処理待ち
'Sleep (50)
'
''もし制限時間を越えてもハンドルが取得できなかった場合はプロシージャ終了
'If Now >= Limit Then
'Exit Sub
'End If
'
'DoEvents
'Loop
'
'hwnd = FindWindowEx(hwnd, 0&, "GroupBox", vbNullString)
'
'If hwnd <> 0 Then
''パスワード入力欄のハンドル取得
'edt_hwnd = FindWindowEx(hwnd, 0&, "RICHEDIT50W", vbNullString)
''OKボタンのハンドル取得
'btn_hwnd = FindWindowEx(hwnd, 0&, "Button", "OK")
'
'If (edt_hwnd <> 0) And (btn_hwnd <> 0) Then
''パスワード送信
'Call SendMessage(edt_hwnd, WM_SETTEXT, 0&, strPassword)
''OKボタンをクリック処理
'Call SendMessage(btn_hwnd, WM_ACTIVATE, 1, 0&)
'Call SendMessage(btn_hwnd, BM_CLICK, 0, 0&)
'End If
'End If
'
'Set objWSH = Nothing
'End Sub

'Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
'Private Declare Function FindWindowEx Lib "user32.dll" Alias "FindWindowExA" (ByVal hwndParent As Long, ByVal hwndChildAfter As Long, ByVal lpszClass As String, ByVal lpszWindow As String) As Long
'Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hwnd As Long, ByVal MSG As Long, ByVal wParam As Long, ByVal lParam As Any) As Long
'Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
'
'Private Const BM_CLICK As Long = &HF5
'Private Const WM_ACTIVATE As Long = &H6
'Private Const WM_SETTEXT As Long = &HC
UITableView 復習（IndexBarを表示）

#今回の内容

* [昨日作成した復習アプリ](https://qiita.com/HiroUrata/items/c80816f9dd140d6718df)に追加したものになります。

<img width="150" alt="95C8D9BD-3E33-4264-9965-8259813124FE_4_5005_c.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1466343/7c5d2ef6-61a7-b830-c11b-645e39ec0190.jpeg">


#コードと簡単解説

*  `func sectionIndexTitles(for tableView: UITableView) -> [String]? {}`の中で`return [表示したい内容]`をします。

* 見た目の部分は、表示内容の色と背景色とトラッキング中の背景色を設定できます。 

* 今回は付けていませんが、`UITableView.indexSearch`という検索アイコンのようなものを先頭に付けることが出来ます。

```Swift:

 var sectionContentsArray = ["1","2","3","4","5"]

           ~~~一部省略~~~

 func sectionIndexTitles(for tableView: UITableView) -> [String]? {
        
        tableView.sectionIndexColor = .white
        tableView.sectionIndexBackgroundColor = .black
        tableView.sectionIndexTrackingBackgroundColor = .none

        sectionContentsArray.insert(UITableView.indexSearch, at: 0) //検索アイコンのようなものを先頭に付ける場合

        return sectionContentsArray
        
    }
```

#終わり
ご指摘、ご質問などありましたら、コメントまでお願い致します。