OmniAICreator/Qiita-1.07M huggingface dataset:
【Project Euler】Problem 80: 平方根の小数展開

* 本記事は[ProjectEuler](https://projecteuler.net/about)の「100番以下の問題の説明は記載可能」という規定に基づいて回答のヒントが書かれていますので、自分である程度考えてみてから読まれることをお勧めします。

### 問題 80.平方根の小数展開

原文 [Problem 80: Square root digital expansion](https://projecteuler.net/problem=80)

**問題の要約：$1 \le n \le 100$の自然数の平方根が無理数になるものを小数で表したときその最初の100桁（整数部を含む）の数字和の合計を求めよ**

平方根の値の精度を変えるためにで**decimal.getcontext().prec**を使いました。

```python 
import decimal
decimal.getcontext().prec = 120  # 120 digit pre square root precision
def sumsqrt100(n): # the digital sums of the first one hundred decimal digits 
  return sum([int(str(decimal.Decimal(n).sqrt()).replace(".","")[i]) for i in range(100)])

print(f"Answer: {sum([sumsqrt100(n) for n in range(1,101) if int(n**(1/2))**2 != n])}")  
```

（開発環境：Google Colab）
Visual Studio C++(VC++)で管理者権限を取得するプログラムを作成する方法

# 目的
UEFIの設定を読み取るためのプログラムは実行時に管理者権限が必要だ．管理者権限を持たせた状態でプログラムをデバッグしたかったので今回はこれを設定する．そのままだと管理者権限を持った別のプログラムから呼び出す方法でしか権限を得られないので，プログラム自身で管理者権限を取得できるようにする．

# やり方
プロジェクトのプロパティを開き，
![プロジェクトのプロパティ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703910/59c8e84b-2af5-b617-0afb-d5a30d0fd678.jpeg)

リンカー→マニフェストファイル内の「ユーザーアカウント制御（UAC）を有効にする」を「はい」に，「UACの実行レベル」を「requireAdministrator」に設定する．
![WS000001.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703910/23049e6d-270f-f05c-5421-b7a20079c556.jpeg)

OKを押してウィンドウを閉じ，デバッグを開始しようとするとVisual Studioを管理者権限で再起動する云々といわれるので従う．

# 補足
この方法以外に直接マニフェストファイルを記述して組み込む方法もある模様．未調査．

以上:angel:
JavaScriptの関数

# 関数とは

- 複数の処理を一つの処理にまとまりにしたもの。
- JavaScriptの構成要素の一つであり、Function型のオブジェクトとして扱われる。
- 関数をオブジェクトとして扱えるのは、JavaScript特有の特徴。

## 関数を使用するメリットについて

- 関数を利用することで、目的ごとに処理を分割したりすることができる。
- 似たような処理を何度も書かなくても済むようになる。

## 関数の定義について
- 関数を使用するには、関数を定義（作成）する。

```sample.js
function calcRectArea(width, height) {
  return width * height;
}

console.log(calcRectArea(5, 6));//30がコンソールに表示。
```
宣言の中の引数は関数に渡して処理の中でその値を使うことができるもの。

# 関数式で関数を定義する

- JavaScriptにおいて関数はFunction型のオブジェクトになります。

```sample.js
const getRectArea = function(width, height) {
  return width * height;
};

console.log(getRectArea(3, 4));//コンソールには12が表示。
```

## アロー関数で関数を定義する
アロー関数式とは、ECMAScript 2015（ES2015）という2015年に公開されたJavaScriptの新しい標準に含まれる記法です。

```sample.js
const materials = [
  'Hydrogen',
  'Helium',
  'Lithium',
  'Beryllium'
];
console.log(materials.map(material => material.length));//Array [8, 6, 7, 9]
```

関数式では式の右辺は function(引数) { 処理 } という記法で書かれていましたがアロー関数ではこの記法のうち function や、引数を囲む括弧などが省略されて書かれています。


## 引数がないアロー関数
```sample.js
let food =()=> console.log('Hello, world!'); 
food(); //Hello, world!
```
引数がない場合は ()を省略せずに記述します。

## まとめ
関数を深く突き詰めるにはもう少し深掘りしないといけないと思いました。ご指摘があればぜひよろしくお願い致します！
サウンド使用中にwebブラウザを閉じると、ホーム画面にサウンドコントロールが表示される

iPhone、iPad、Androidなどでサウンド使用中にwebブラウザを閉じると、ホーム画面にサウンドコントロールが表示され、webブラウザを閉じたままでもサウンドを再生できてしまいます。
これを避けるには visibilitychange でブラウザの状態を検知し、閉じている間はサウンドの要素を muted にするようにします。
検証：iOS 15＋Safari、Android 12＋Google Chrome

~~~JavaScript
const sound = document.getElementById( 'sound' );

document.addEventListener( 'visibilitychange' , function() {
	if ( document.visibilityState === 'hidden' ) {
		sound.muted = true;
	} else {
		sound.muted = false;
	}
} );
~~~
visibilitychange を使えないブラウザも対象にする場合は blur などで。

参考：[ブラウザがバックグラウンド回ったことを検知する - Qiita](https://qiita.com/d2cd-kimura/items/b51ef73528fa66a35a9d)
【ＰＨＰ】演算子の小ネタ

#コード
```PHP
<?php
// 定義されているかどうか？
//Null合体演算子
$a = 'aaaaaa';

echo $a ?? 'good bye';
echo PHP_EOL;
echo $c ?? 'レス急';


echo PHP_EOL;

// 値が入っているかどうか？
//エルビス演算子
$b = '';

echo $b ?: 'good bye';
echo PHP_EOL;
$sobi_data = "不倫";
$all = "{NAME}弁護士";
echo str_replace('{NAME}', $sobi_data,$all);
```
#結果
```
aaaaaa
レス急
good bye
不倫弁護士

```
【備忘録】Reactでemotionを使って親要素の疑似クラス（hover）をきっかけに子要素を変化させる

##方法
想定はLinkコンポーネントが生成するリンクタグをマウスオーバーすると文字列の疑似要素として設定した下線部分が出現する動作。
[自分のポートフォリオ](https://www.rioinb.com/)のヘッダーを作る際に使ったものです。
Reactとかemotionとか以前にcssの理解度が低すぎてハマった感が否めませんが誰かのお役に立てれば...
今見れば簡単な話なのにこれに半日かけたと思うと基礎って大事だな実感しました。

```react
<Link to="/" css={link}>
    <span>Home</span>
</Link>

const link = css` 
　　　　　  //※
`
```

```scss
//※の中に記述する内容
  display: flex;
  text-decoration: none;
  padding: 1.5em 2em;

  span {
    position: relative;
      ::after {
        position: absolute;
        opacity: 0;
        z-index: 5;
        content: "";
        width: 100%;
        bottom: -10px;
        height: 5px;
        left: 0;
        display: block;
        background: red;
        transition: all 0.5s;
      }
    }
  :hover span::after {
      opacity: 1;
  }
  
```
Windowsのインストールで躓きがちなこととその簡単な解決法

#はじめに
Macで作成したUSBインストールメディアを使用してWindowsをインストールする際、エラーが出て苦労することがあります

その際のエラーメッセージが

> インストールの次のフェーズに進むためにコンピュータを準備することが出来ませんでした

といった非常に不親切なもののために原因の切り分けに大きな労力が必要です。
一旦ドライブにイメージファイルをコピーする等でどうにかインストールすることが可能なようですが、非常に煩雑な手順となります。

https://qiita.com/tarosuke@github/items/a593fd091cbbc3f2ba8b

https://qiita.com/yyu/items/28784e9bfdfec97a1d6d

## 解決方法
**Windows上でインストールメディアを作成**しましょう
マイクロソフトソフトのインストールメディア作成ツールで作成したメディアを用いれば、インストールの際に上手く行かない可能性をかなり削減することが出来ます.



## まとめ
Windowsを新しくインストールしたい場合、Mac上ではなく、Windowsで実行可能なマイクロソフトの公式のインストールメディア作成ツールを用いましょう。現時点（2022年2月）ではWindows7でも問題なく作成することが出来ます

特に、PCを自作した際などどこに問題があるのか切り分けるのが困難になるであろうシチュエーションでは、少々労力を掛けてWindowsを引っ張り出してインストールメディアを作成したとしても、総コストの削減に繋がります

もしも手元にも周辺にもWindows環境がない場合は、仕方ないので頑張りましょう。
Zipファイル展開_Python

Zipファイルを 全て展開するプログラムを、Webページを参考に書きました。
忘備録です。^^

```
import zipfile
import glob

for name in glob.glob('*.zip'): # すべてのzipファイルを検索
    print(name)
    with zipfile.ZipFile(name, 'r')as f:
        f.extractall('./test') # testフォルダに解凍
```
たちまち動きを確認しただけですので、
バグ等ございましたら、
ご連絡ください。

（ 必要に応じて、順次バージョンアップ予定です :）
SpannerにワンライナーでコマンドラインからSQLを実行したかった

## 前書き
ローカル環境にて Spanner エミュレータを動かしている際に開発環境なのでバッチ処理でテストデータを投入したいけれど、どうやるんだろうと調べていたら日本語の記事はなかったので、まとめです
答えは Spanner の Github のページにしっかりと記載されていました。

## 実際に実行する
`-e` のオプションの後に実施したいSQL文を記載することで Spanner にSQLを流すことができます。
この辺りはMySQLと同じオプションのようですね。
実際の実行結果は下記となります。

```
# SELECT ができる
spanner-cli -p xxxxx-project -i xxxxxx-instance -d xxxxxxxx-database -e "SELECT * FROM TestTable;"

# Insert もできる
spanner-cli -p xxxxx-project -i xxxxxx-instance -d xxxxxxxx-database -e "INSERT INTO TestTable (id, CreatedAt, UpdatedAt) values ('XXXXXXXXXX', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP);"

# Insert で入ったものを確認
spanner-cli -p xxxxx-project -i xxxxxx-instance -d xxxxxxxx-database -e "SELECT * FROM TestTable;"
Id	CreatedAt	UpdatedAt
XXXXXXXXXX	2022-02-10T02:16:38.469414Z	2022-02-10T02:16:38.469414Z
```

## 参考リンク
[Sppaner](https://github.com/cloudspannerecosystem/spanner-cli#batch-mode)
ESP32-CAMを使ってみた

<h1>配線</h1>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1339052/10f07d1e-6bb4-32c4-991b-5f88440a4104.png)

<h1>プログラムダウンロード設定</h1>
以下のサイトを参考にさせて頂いた。
https://qiita.com/Nabeshin/items/b195cad1afe99ce29f1e
▸    Error: docker build exited with Error: 1 & executor failed running [/bin/sh...] : exit code: 100 の対処法

だれでもエンジニア / 山浦清透 さんの[Docker超入門講座 合併版 | ゼロから実践する4時間のフルコース](https://www.youtube.com/watch?v=lZD1MIHwMBY)を拝見している時に、 


```:Command
Error: docker build exited with Error: 1
```
とエラーが出てしまいました。。

#検証 1

https://qiita.com/akira-i/items/54462f5bd7fca868a818

を参考にしてVersionを変更してみましたが、エラーは解消されず。
https://gyazo.com/36e0631b46d5efc80180f35bcc338abc
ubutuの時は、バージョン変更でいけるらしいが、Rubyはどうやら違うぽい。

#検証2
Errorコードをよく見てみると

```
ERROR [2/7] RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -   && echo "deb https://dl.yarnpkg.com/
```

と出ている。
この文章はDockerfileにある。
これらは、[Node.jsやyarnをインストール](https://qiita.com/Hai-dozo/items/90b852ac29b79a7ea02b)してくれるらしい。

でも、エラーが出ているので、一旦コメント表示にしてみることに。

```:Dockerfile
FROM ruby:2.7

ENV RAILS_ENV=production

# RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - \
#   && echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list \
#   && apt-get update -qq \
#   && apt-get install -y nodejs yarn
WORKDIR /app
COPY ./src /app
RUN bundle config --local set path 'vendor/bundle' \
  && bundle install

COPY start.sh /start.sh
RUN chmod 744 /start.sh
CMD ["sh", "/start.sh"]
```

そして実行してみると

```
heroku container:push web -a rails-docker-ktr

The push refers to repository [registry.heroku.com/rails-docker-ktr/web]
d32f6115fe41: Pushed
36d064f765f1: Pushed
9521e2d20c3b: Pushed
626534a0f850: Pushed
ea6a4edf9699: Pushed
389a0cac5c37: Pushed
2fa589aa40fe: Pushed
7296babbb0a8: Pushed
204e42b3d47b: Pushed
613ab28cf833: Pushed
bed676ceab7a: Pushed
6398d5cccd2c: Pushed
0b0f2f2f5279: Pushed
latest: digest: sha256:c8e31ea9ca3aa22c28d88c90a7a7cd03004bbb6cafa5204bed3a38244ca1be19 size: 3048
Your image has been successfully pushed. You can now release it with the 'container:release' command.
```

できた！！嬉しい。

ただ、node.jsたちがインストールされていないと
後々、影響が出てくるかもしれないので
頭に入れておくことにします。
PHP　beginTransaction　整合性 ACID特性

```index.php

~~~~~~~~
//Update構文にて、お金の受け渡しを想定したケース

try{
$cone->beginTransaction;

$psn->execute([
  :name => $A_user, //佐藤さん(剛田さんへお金渡す人)
  :money => -1 * $money //-2000円の値が入ってます。
]);

$psn->execute ([
  :name => $B_user, //剛田さん(佐藤さんからお金受け取る人)
  :money => $money //2000円の値が入っています。
]);

$cone->commit();
}catch(PDOExcetion $e){

echo $e->getMessage();
$cone->rollback();

}

```


<h2>説明

①今回のケースでは、「佐藤さん」は「剛田さん」にお金を2000円振り込むケースです。

②トランザクションを用いずこのケースを処理しようとした場合

　A.正常に問題なく処理が行われる。

　B.佐藤さんの処理は正常に行われたが、剛田さんの処理はエラーとなり、佐藤さんの口座から-2000円となっていて整合性が保てなくなる。

C.剛田さんの処理は正常に行われたが、佐藤さんの処理はエラーとなり、剛田さんの口座が何故か+2000円となって整合性が保てなくなる。

③ ②のケースを解消する方法がトランザクションです。
　try catchで処理を囲み、正常に処理が進んだ場合、最後まで（commit)処理が実行されDBは更新されます。
但し、途中で処理が中止(エラー)となった場合、catch処理内の処理が走り、処理が全消し(rollback)となります。

トランザクション以降に記載されたプログラムは、commitされるまで確定されません。(オートコミットオフになる)


いやー、面白い！
TestFlightから直接AppStoreの審査に出す方法

# 概要
iOSにてアプリをリリースする際にチーム内でテストしてから審査に出すフローが多いかと思います。
今回はTestFlightでテスト実施から直接AppStoreに審査する方法をご紹介します。

# 今回の肝
TestFlightにアップロードしたアプリのバージョンとAppStoreで審査しようとしているバージョンが揃っている必要があります。
今回の記事ではバージョン`1.0.0`として解説します。


# まずは普通にTestFlightにアップロード
TestFlightにアップロードします。ここでバージョンが`1.0.0`であることを確認します。

![TestFlight.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49347/088571aa-b22a-9112-0780-0f1ce71b9cbf.png)


# AppStore側でTestFlightに上がっているビルドを指定
AppStore側で`1.0.0`を作成し、TestFlightとバージョンが揃っていると
`ビルド` の項目に`Appを提出する前にビルドを選択してください。`というボタンが出現します。
このボタンを押下すると、先程TestFlightで確認したものが出てくるので、審査に出したいビルドを選択してください。

![App_Store_Connect.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49347/0f666072-57d4-7dd1-6f5c-fa52242fffec.png)


これでTestFlightから直接AppStoreの審査に出すことが出来ます。
【SQL】IN句をORで結合して取得できる最大件数を検証

# はじめに

　SQLを勉強し始めたころからよく見るIN句について
　1つのIN句では最大1000件まで指定できる
　ORで結合を繰り返すことで1000件以上のデータも取得することが可能ですが

　ふとIN句の結合を繰り返すと最大何件まで取得できるのだろうかと気になったので
　以下のSQLのようにIN句を結合して検証してみた。

```
SELECT
 column_A
FROM
 TABLE_A
WHERE
 column_A IN ('1',・・省略・・,'999','1000')
 OR column_A IN ('1001',・・省略・・,'1999','2000')
 OR column_A IN ('2001',・・省略・・,'2999','3000')
 ・
 ・
 ・
 ORを繰り返していく
 ・
 ・
 ・
```

# 環境
　Oracle Database 19c
　MySQL 5.7.12

# 結論
　■ORACLE
　　IN句で指定できるデータの件数は65,535件

　■MySQL
　　MySQLではIN句の最大数は恐らく存在してない
　　※max_allowed_packetで指定しているデータサイズがSQLの最大サイズになるため
　　　最大サイズになるまでIN句を結合可能でした。
　　　max_allowed_packetのサイズを大きくしての検証はしません！許してください！

# 検証手順

　■ORACLE
　65,535件まではOK
　65,536件(2の16乗)のときに
 「エラー(ORA-00913: 値の個数が多すぎます)」が発生する

```
EXPLAIN PLAN FOR 
select 
    column_A
from 
    (select 'hoge' as column_A from dual) TABLE_A
where 
    --1～10000
    column_A in ('1',・・省略・・,'999','1000')
    OR column_A in ('1001',・・省略・・,'1999','2000')
    ・
    ・
    ・
        省略 単純にORで繰り返す
    ・
    ・
    ・
    --65001～65500
    OR column_A in ('65001',・・省略・・,'65499','65500')
    --65501～65535
    OR column_A in ('65501',・・省略・・,'65534','65535')
    --以下のコメントを外して実行すると「エラー(ORA-00913: 値の個数が多すぎます)」が発生する
    -- OR column_A in ('65536')
;
```


　■MySQL
　最大件数を調べるときにIN句の結合を繰り返すと以下のエラーがでました
 「SQL   : #08S01Got a packet bigger than 'max_allowed_packet' bytes」
　MySQLだとIN句の最大ではなく「max_allowed_packet」の設定によって
　SQL全体のサイズに影響されるようです。

```
EXPLAIN 
select 
    TABLE_A.column_A 
from 
    (select 'hoge' as column_A from dual) TABLE_A
where 
    TABLE_A.column_A in ('1',・・省略・・,'999','1000')
    OR TABLE_A.column_A in ('1001',・・省略・・,'1999','2000')
    ・
    ・
    ・
    省略 単純にORで繰り返す
    ・
    ・
    ・
    実行環境のmax_allowed_packetの4MBまで繰り返して以下のエラーがでた
    「SQL   : #08S01Got a packet bigger than 'max_allowed_packet' bytes」
;

```

# おわり

　最後まで読んで頂いてありがとうございます。
　こんなSQLを実装することなんて無いだろうから無駄な知識が1つ増えました
VBA 備忘録２

Public Function CK_Excel(frmTargetForm As Form, FilePath As String) As Boolean
    CK_Excel = True
    Dim Fso             As New Scripting.FileSystemObject
    Dim ExteName        As String
    
    FilePath = frmTargetForm.txtFilePath
    ExteName = Fso.GetExtensionName(FilePath)
    If ExteName <> "xlsx" Then
        MsgBox "Excelファイルを選択してください"
        CK_Excel = False
    End If
    
    'ファイル名が社員名簿か確認
    Dim FileName        As String
    FileName = Fso.getFileName(FilePath)
    If FileName <> "社員名簿.xlsx" Then
        MsgBox "社員名簿のファイルを選択してください"
        CK_Excel = False
    End If
    
    'エクセルファイルを開く
    Dim xlsApp          As Object
    Dim xlsWkB          As Object
    Dim xlsWS           As Object
    Set xlsApp = CreateObject("Excel.application")
    xlsApp.Visible = True
    Set xlsWkB = xlsApp.workbooks.Open(FilePath)
    
    'シート名が社員名簿か確認
    Dim WsName          As String
    Dim i               As Integer
        
    For i = 1 To xlsWkB.sheets.Count
        If xlsWkB.sheets(i).Name = "社員名簿" Then
            WsName = "社員名簿"
            Set xlsWS = xlsWkB.worksheets(WsName)
            Exit For
        End If
    Next i
    
    Dim Col     As Integer
    With xlsWS
        If .cells(1, 1) <> "従業員コード" Then
            CK_Excel = False
        End If
    End With
    
    xlsWkB.Close savechanges:=False
    Set xlsWkB = Nothing
    
    xlsApp.Quit
    Set xlsApp = Nothing
    
    Set Fso = Nothing
End Function

Public Function getFileName(tmpFilePath As String) As String

    Dim intRet As Integer
  
    With Application.FileDialog(msoFileDialogOpen)
    
    'ダイアログのタイトルを設定
        .Title = "ファイル選択ダイアログ"
        
        'ファイルの種類（拡張子）を指定
        .Filters.Clear
        .Filters.Add "EXCELファイル", "*.xls, *.xlsx"
'        .Filters.Add "テキストファイル", "*.csv, *.tsv"
        
        'ファイルの種類の初期値を設定
        .FilterIndex = 1
        
        '複数ファイル選択を許可しない
        .AllowMultiSelect = False
        
        '初期パスを設定
        .InitialFileName = tmpFilePath
        
        'ダイアログを表示
        intRet = .Show
        If intRet <> 0 Then
            'ファイルが選択されたときフルパスを返り値に設定
            getFileName = Trim(.SelectedItems.Item(1))
        Else
            'ファイルが選択されなければ長さゼロの文字列を返す
            getFileName = ""
        End If
    End With

End Function

Private Sub btn_Get_FilePath_Click()
    Dim strFilePath     As String
    Dim GetPath         As String
        
    Me.txtFilePath = getFileName(strFilePath)
    
End Sub

Private Sub btn_Import_Click()
    'importクリック
    'エクセルファイルか確認
    Dim FilePath        As String
    If CK_Excel(Me, FilePath) = False Then
        GoTo Exit_
    End If
    
    'WK_Tableのデータを削除
    Dim sSelect         As String
    Dim sFrom           As String
    Dim sWhere          As String
    Dim sSQL            As String
    
    sSelect = "Delete * from WK_Employe "
    DoCmd.RunSQL (sSelect)
    
    'WK_Tableにインポート
    DoCmd.TransferSpreadsheet acImport, 10, "WK_Employe", FilePath, True
    
    'クエリーを実行し、M_Employeeにいんぽーと
    DoCmd.OpenQuery "Q_F50_03MEmployee"
    DoCmd.OpenQuery "Q_F50_04TEmployeeList"
'    Q_F50_03MEmployee
    Exit Sub
Err_:

Exit_:
End Sub
Chromebook の Vim がイマイチ気に入らない場合にやること

# Chromebook の Vim がイマイチ使えない理由を述べよ

以下の SS を見て、どこがいけていないかを考えてみましょう。

![Screenshot 2022-02-10 10.15.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569749/cb07b6c6-ce3f-20ab-5a18-3869db4f3fab.png)

1. 各種アイコンが文字化けして豆腐
2. 各行の一列目の配色が白色にバグっている。
3. コマンドモードに入っているのにステータスライン表示が更新されない。

## 1. 許せんので駆逐する

### 1.1. アイコン文字化け豆腐への対処

ChromeOS の Linux で使用される標準ターミナルが原因です。

厳密に言えば、標準ターミナルでは私の愛する HackgenNerd フォントなどのアイコン表示可能フォントを設定することができないためです。

なので、標準ターミナルをドブに投げ捨てて、`mate-terminal` をインストールして使用します。

```bash
sudo apt install mate-terminal
```

インストール完了後、プロファイルの設定からフォントを適切な物に変更して下さい。

ちなみに、`apt`コマンドからインストールできるターミナルアプリを一通り試しましたが、`mate-terminal`と`konsole`以外は、日本語入力が正常に動作しないため、おすすめしません。`Alacritty`もダメでした。

見た目だけなら`xfce-terminal`がイイ感じなので、日本語入力を切り捨てるのであればオススメです。

### 1.2. 追記：別手段による標準ターミナル上での豆腐対処

サードパーティー製ターミナルが使いたくない方向けの対処法

1. 標準ターミナルを起動。`Ctrl + Shift + J`を押し、デベロッパーツール画面を表示
2. 次の内容を`Console`で入力し、実行

```js
term_.prefs_.set('font-family', 'DejaVu Sans Mono Nerd');
term_.prefs_.set('user-css-text', '@font-face {font-family: "DejaVu Sans Mono Nerd"; src: url("https://raw.githubusercontent.com/ryanoasis/nerd-fonts/master/patched-fonts/DejaVuSansMono/Regular/complete/DejaVu%20Sans%20Mono%20Nerd%20Font%20Complete%20Mono.ttf"); font-weight: normal; font-style: normal;}')
```

やっている事は、Javascript による表示フォントの変更なので、`src:url`以降を編集すれば、好きなフォントを使用できます。

ただし、ターミナル起動の都度に上記操作を行う必要があるので、こまめにターミナルを終了させる場合は向かないかもしれません。

また、標準ターミナルは Vim との相性が悪いのか、プラグインを入れていくと描画に引っ掛かりを感じる事が多々あります。サードパーティー製ターミナルの使用を推奨します。

### 1.3. 一列目配色バグとステータスライン描画問題への対処

ChromeOS 標準の Vim が古いのかイマイチなのか、とにかくこれが原因です。

なので、最新の Vim をビルドしてインストールします。

適当なディレクトリで、以下の一連のコマンドを実行して下さい。

最後に古い Vim をアンインストールしていますが、なぜか`/usr/bin`に実行ファイルは残っているので、何かで困る可能性はありません。

```bash
sudo apt install ncurses-dev
wget https://github.com/vim/vim/archive/master.zip
unzip master.zip
cd vim-master
cd src/
./configure
make
sudo make install
vim
sudo apt remove vim "古いVimの削除
```

標準インストールされる Vim の問題なので、別途 NeoVim などをインストールした場合は、この問題は発生しません。

## 2. 結果

イケテル感じのアイコンが正常に表示され、配色バグが治り、ステータスラインも正しく更新されるようになりました。

![Screenshot 2022-02-10 10.37.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569749/6d768ace-0313-cacd-63ad-54e5482bd35f.png)

## 3. Chromebook で開発しようよ

ぶっちゃけ大した事はできませんし、自分で Linux のノートパソコンを用意できる人には不要なんですが、不自由なオモチャを触ってる感が楽しいです。

試行錯誤して理想を実現していく感じ。

あと、Linux 側のファイルを ChromeOS ネイティブの Google Chrome でオープンできるように（いつの間にか）なっているなど、ChromeOS の地味ながらも順調な進化には期待が持てるところ。

安い Chromebook でも、GUI ソフト（VSCode とか）を動かさずにターミナル＋ブラウザで完結すればストレスなく使えますので、ちょっとしたお出かけや、高額な端末を持っていきたく無い出張などの際の選択肢としてはアリなんじゃないかなと思います。

また、機種によっては VSCode の動作もモッサリしたものになりがちなので、ターミナル上で Vim (or NeoVim) を選択せざるを得ない状況に陥ります。覚悟をもって Vimmer になりたい場合の矯正器具的な使い方もあるのではないでしょうか。お試しあれ。
キーボードにクリックを割り当てる

# はじめに
トラックボールをキーボードに接着することに成功
あとはクリックさえキーバインドできれば
理想のマウスなし生活へ
# autohotkey
autohotkeyをインストールしましょう
https://www.autohotkey.com/
1秒くらいで終わります
阿部寛のホームページくらい早いです

1. Windowsボタン+R `Shell:startup`を検索
2. 右クリック>新規作成>AutoHotKeys Script選択
3. vscodeでもなんでもエディタで開いて以下のコードを保存

```bash:click.ahk
!n:MouseClick, left,,,,,D
!n UP::MouseClik, left,,,,,U
!m::MouseClick, Right
```
### 解説
!n は　Alt + nのことです
変換先ショートカット　: :　変換元
上記の構文で書いてます
!n UPはキーを話した時の操作です
これにより単語選択とかができるようになります

# 起動
startupに入っているので、PC 起動時に自動起動します
切りたいときは右下のタスクメニューからHのアイコンを選んで`Exit`
再度起動したいときはstartupいかのファイルをダブルクリックです
ハーネスを準備する

製作で使用するハーネスを準備してみます。
今回は、アマゾンで売っているソリッドワイヤキットなるものを使用しました。
#単線とより線
ワイヤには単線と撚線があります。
頻繁に組み換えしたり、移動させる環境ではより線を使用します。
逆に一度組み立てた後に変更等しない場合は、単線が良いようです。
#ケース入りハーネス
アマゾンでは箱入りのハーネスが売っています。
Aliexpress等よりは若干高めですが、送料や日数を考えると利便性は高いといえます。
![DSC_0437 (2).JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/52fb59d3-1b60-119a-e5ad-0c0e2444e92a.jpeg)
![DSC_0446 (2).JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/d7228f7e-7880-4687-16a9-22c71bcf498d.jpeg)
#ハーネスの太さ
ハーネスの太さはAWGで表記されることが多いようです。

* AWG換算表
https://densenkan.com/know/densen10.html<BR>
圧着する際などは既定の太さのモノを使用しないと行けないため数種類用意する必要があります。

#圧着
必要に応じて圧着をします。
お勧めしてはいけないのでしょうが、安い工具や安いコネクタ、ハウジングの場合、抜けたり、圧着不良を起こします。
この為、ハーネス付きのコネクタを購入し、はんだ付けなどをする事をお勧めします。
【Docker】よく使うDockerコマンドまとめ

#はじめに
よく使われるDockerコマンドをまとめております。

#Dockerのインストール
Dockerをインストールは、基本的にDocker公式サイトに準じていただければと思います。

https://docs.docker.jp/engine/installation/linux/index.html

#よく使うDockerコマンド

1.Dockerのバージョン確認

```
docker version
```

2.Dockerイメージ一覧

```
docker images
```

3.Dockerイメージの削除

```
docker rmi <イメージID>
```

4.Dockerコンテナの削除

```
docker rm <コンテナID>
```

5.すべてのDockerコンテナ状態確認

```
docker ps -a
```

6.現在起動中コンテナの確認

```
docker ps
```

7.コンテナ内部に入るコマンド

```
docker exec -i -t <コンテナ名またはコンテナID> bash
```

8.dockerを起動するコマンド

```
docker start <コンテナID>
```

9.docker commitによるイメージ作成

```
docker commit <コンテナID> <コンテナイメージ名:タグ>
```

10.docker runによるコンテナイメージからコンテナを起動

```
docker run <起動オプション> <コンテナイメージ> <コンテナ起動時に実行するコマンド>
```

11.docker pull によるコンテナイメージのダウンロード

```
docker pull <コンテナイメージの公開パス:タグ>
```

12.docker build コマンドを使ったコンテナイメージの作成

```
docker build -t <コンテナイメージ名:タグ> <Dockerfileが存在するディレクトリ>
```

13.コンテナレジストリへログイン

```
docker login -u <コンテナレジストリのユーザー名> -p <コンテナレジストリのパスワード> <コンテナレジストリのログインサーバー>
```

14.コンテナを停止する

```
docker stop <コンテナID>
```

15.コンテナを起動する

```
docker start <コンテナID>
```

16.コンテナを削除する

```
docker rm <コンテナID>
```

17.コンテナイメージを削除する

```
docker rmi <コンテナイメージID>
```
PHPでDBに接続してSQLを実行する

# PHPでDBに接続する為の機能 = PDO 
PHPでデータベースに接続するための機能を「PDO」といいます。
PDOは「PHP　Data　Object」の頭文字をとったもの。


【PHPリファレンス】

https://www.php.net/manual/ja/class.pdo.php

# DBに接続する
PDOを利用してデータベースの接続を行います。


```php:sample.php
$db = new PDO('データベースの種類:host=接続先アドレス;dbname=データベース名', 'ユーザー名', 'パスワード');
```
<br>
<br>

**（例）**

```php:（例）.php
$db = new PDO('mysql:host=localhost;dbname=my_db', 'root', 'root');
```

# SQLを実行する
DB接続の後、queryメソッドを利用してSQLを実行します。

```php:sample.php
// testという名前のTableを作成する
$db->query('create table test(id INT)');

// SELECT文を実行する
$db->query('select * from samples where id = 1');
```
go mod init [module-path]のmodule-pathには具体的に何を書けばいいのか

ドキュメントだと下記のように書いてあるが、具体的にmodule-pathに何を書けばいいのかわからなかったので、調べてみた。

```
Usage:

go mod init [module-path]
Example:

go mod init
go mod init example.com/m
```

https://go.dev/ref/mod#go-mod-init

module-pathのドキュメントを読んでみる。

https://go.dev/ref/mod#module-path

ざっくりいうと、module-pathは外部からインポートする際に参照するPathのことのようだ。

なのでそもそも外部にインポートさせようと思っていない場合は、module-pathのことを気にする必要はない。
なのでそういう場合は`go mod init example`とかで良さそう

GitHubで公開する場合は、下記のように書けば良い。

```
go mod init github.com/user-id/repository-name
```
あのアイコンのSFSymbolsの名前

# 概要
SFSymbolsで欲しいアイコンの名前がわからず探すのが大変なことがたまにあるので
「SFSymbols ○○　名前」みたいな感じで検索した時に引っかかって手助けになれば幸いです


## 3点リーダ, 三点リーダ
`ellipsis`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1237483/cf3b1419-695a-2c86-4f55-6a8d1b42cf3e.png)

## 共有, Shere
`square.and.arrow.up`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1237483/2c7c90e8-6cba-f5bd-1d16-7644db90a4de.png)

## マウスカーソル
`cursorarrow`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1237483/246a2cb7-e49f-41c1-6848-4f3b9bb57d42.png)

## 戻る, back
`chevron.backward`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1237483/261ac0bd-c239-0c13-0343-c6cda26bff9d.png)
`return.left`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1237483/bcdbe665-a7e7-81f6-5933-a72e7abdba32.png)

## 吹き出し
`bubble`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1237483/af1da2fc-b8fb-53b3-06de-20bbfec387d8.png)

## メニュー
`slider.horizontal.3`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1237483/9b0b520b-be98-373e-2c04-78a2ee7cf6aa.png)
`list.bullet`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1237483/164f7ae3-4bef-6093-6b92-24685c2faf6a.png)

## メール
`envelope`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1237483/6a6fd2fc-8088-c916-d93b-81e61d3c9422.png)

## 編集
`pencil`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1237483/b7e14c4a-26d8-004a-1bb0-365a5c2b220d.png)
`square.and.pencil`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1237483/c1f8386c-a765-f46a-749f-284de6965c93.png)

## ハサミ
`scissors`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1237483/13ed7519-bc00-7f0c-2727-38ed08730d09.png)
Githubにプッシュしたディレクトリやファイルが非活性化していて開けないときの対処法

# Githubにプッシュしたディレクトリやファイルが非活性化していて開けないときの対処法

git pushはローカルリポジトリ内のコミットをリモートリポジトリに転送するものです。
なのでgithubにファイルが転送されていないのであれば、ローカルリポジトリにコミットされていないということです。

ローカルリポジトリの内容を確認してみてください。

リポジトリで管理しているファイルを一覧表示する

```
$ git ls-files
```

 gitの管理対象外になっているファイルを一覧表示する

```
$ git status ignored
```

##.gitignoreファイルを確かめる。
中身を見て対象ファイルが除外ファイルに指定されていないか。
.gitignoreファイルの再生成は下記リンクを参考にする。

https://riotz.works/articles/lulzneko/2019/06/18/lets-create-gitignore-using-generation-service-gitignoreio/

https://leading-tech.jp/wiseloan/gitignore/


##.gitをリセットすればうまくいくかも

表示フォルダと非表示フォルダを一覧表示する。

```
ls -la
```

たとえば、出力は次のようになります。

```
total 24
drwxr-xr-x  4 mario mario  4096 Nov 21 00:02 .
drwxrwxrwt 24 root    root    12288 Nov 21 00:02 ..
drwxr-xr-x  2 mario mario  4096 Nov 21 00:02 frontend
drwxr-xr-x  7 mario mario  4096 Nov 21 00:02 .git
```

ここで、最後の行に、.git という名前のフォルダーが表示されています。次のコマンドを使用してフォルダーを削除する必要があります。

```
rm -fr .git
```

次に、```git init``` コマンドを使用してフォルダーを再初期化できます。
自作派のUSBオーディオ

USBオーディオは1.0とハイレゾに対応した2.0があります。ここでは1.0の事を書いています。

自作派のUSBオーディオで音を良くする方法は以下のようなものがある。

* クロックを安定した精度の良い物にする
* セルフパワーにして安定した電源にする
* コンデンサーなどのパーツを良い物にする

USBからI2S(SPDIF)への変換部分をDAIといいI2SなDACと組み合わせて使います。

* PCM2704などのDAIとDAC一体のものを使う
* DAIとDACを別々に用意する

TIのPCM2704などは以前は秋月でもパーツの取り扱いかがあったのですが、TIが小売におろさなくなったんで、入手しづらくなっています。キットはまだあるようですが、これがなくなると一段と入手が難しくなるかもしれません。

![写真（2022-07-23 14.17）.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/61fa1749-40b4-f049-57eb-81c8aab32ba1.jpeg)

DAIはAmazonなどでTE7022やCM6631Aを使ったものが入手可能ですが、ちょっと高いです。

ハンダ付けが難しいの、あまりお勧めではないのですが以前CP2114が若松にあって、探してもらったのですが、もうなくなってしまったようです。後継のCP2615は入手難しいそうです。

PCM2704にはI2SはありませんがSPDIFはあるので、SPDIFなDACに接続する方法もあります。ミニコンポなどでSPDIFの入力がある場合にはそれを使ってみるのも良いかもしれません。

I2Sはデータだけの転送ですが、SPDIFはコピープロテクトなどの属性情報も一緒に送られてます。

TIのPCM2706にはI2Sがあり、DACに接続できます。以前はAitendoに在庫がありましたが、もうなくなってしまったようです。

[PIC32MXでDAI](https://qiita.com/yamori813/items/2c69e5f8114b9fe834b6)を作ったりもしています。私は試してないですが、Raspberry Pi Picoで作れるようです。

DACはTIのPCM5102Aや旭化成のものがあります。旭化成のものは一般販売はみかけませんが、古い家電などで使われていたものをヒートガンで剥がして[使って](https://qiita.com/yamori813/items/ebb8cf83871014e190db)います。高級路線でESSも有名ですがチップは一般には出回ってません。昔秋月で取り扱っていた、倒産した新潟精密のDACも最後にいくつか買えたので持っています。

旭化成は延岡の工場が2020/10の火災で焼失したので、これ以降はあまり作ってないようです。

後はWolfson,CIRRUSなどのチップがありますが、入手が難しいです。WolfsonはCIRRUSが買収しました。

今のDACはオーバーサンプリングのタイプがほとんどですが、古いNOSと呼ばれるDACの方が音が良いという人もいます。

DACでは出力段でオペアンプが必要なものと、必要ないものがあります。オペアンプは正負の電源が必要なものが一般的です。単電源で使えるものもありますが、正負の電源をどうやって作るかも音質に関わってくると思います。昔はオペアンプと言うと+-12Vな電源を使っていましたが、最近は+-5Vでも十分だったりします。私は[「須津技術研究所」さんのページ](http://sudoteck.way-nifty.com/blog/2016/09/2-7424.html)を参考にしてオペアンプを使った電源回路を使っています。

オペアンプは一個数十円から五千円くらいのまであり沼なので気を付けて下さい。

クロックはDAIで使われます。水晶発信子を使ったものより、水晶発信器の方がよく、また水晶発信器でも温度補償(TCXO)のものが良いようです。

ほとんどのDAIは12MHzのクロックから[PLLでオーディオ用のクロック](https://qiita.com/yamori813/items/0e95b14023a5bbac4061)も作ります。CP2114ではUSBとオーディオ用のクロックを別々に付ける事ができます。

I2Sの場合はDAIのクロックでDACが動くので大きく影響しますが、SPDIFの場合はDAC側でもクロックを持つのでDAI側のクロックの影響は少ないと思います。ただクロックを二つ持つことになるので処理が複雑になり、I2Sに比べるとSPDIFは不利だと思われます。

セルフパワーにするための電源はスイッチングタイプのアダプタよりトランスを使ったもののほうが良いという話もありますが、スイッチングタイプでも、ものによっては十分という話もありました。

USBオーディオではありませんが、JJYの受信機の電源でスイッチングよりトランスの方が安定します。そうじてスイッチング電源はノイズが多いのかもしれません。

コンデンサーに良し悪しは影響ありそうですが、平滑化のダイオードでも音が変わるというページもありました。

トランスタイプの場合は[定圧回路](https://qiita.com/yamori813/items/6cba5528d4e31595ce02)が必要になります。

バスパワーからセルフパワーに変更した場合は、USBのディスクリプタも変更が必要ですが、変更しなくても問題ないです。変更はEPROMを付けてディスクリプタを入れておく方式やピンにより設定できるものとかがあります。

WolfsonのDACがお気に入りなのですが、若松や共立で取り扱いがありますが、高価なので二の足を踏んでいます。Wolfsonが使われた製品はいろいろ持っています。Cirrus Logicに買収されてからのチップは知りません。Wolfsonはスコットランドの会社で自分がモルト好きなのも関係してるかもしれません。

USB Audioはアイソクロナス転送なのですが、特殊なアイソクロナス転送を行う機器もあるようです。

USBチップが48Kと44.1Kに対応している場合は、ソース合わせて変更すると、ホスト内での周波数変換がへりよいかもしれません。

USBケーブルでも音が変わるというような情報もありますが、私はまったく分かりません。

安価にいじれて、お金にならないので、いまいち盛り上がってない感じもしますが、いろいろ試してみるのは面白いです。

自作はオカルトにお金を貢よりいいです。

ハイレゾやDSDには貧乏なので手を出しません。ハイレゾのUSBモジュールからSPDIFでオーディオにつないでいる記事がありあましたが、SPDIFではハイレゾは送れないので、まったく意味がないと思います。

今は極端な半導体不足ですが、将来買えなくなるかも知れないので、買えるうちに買っておくのがよいかもしれません。ゴーストを信じて判断してください。

音がいいとか悪いとかは、すぐには分からないですが、しばらく聞いているとなんとなく分かってくるような気もします。

高校の物理の先生がオーディオマニアで、実験室がレコードだらけで、何度かお邪魔させてもらいました。あいう豪気な事はいまは出来ないですね。
react-modalでモーダルウィンドウを作る(Typescript)

## モーダルウィンドウの作成

## 前提
以前作成した下記の環境からスタートします。

https://qiita.com/sh19982580/items/5f71856c7949c494d769


## react-modal
`yarn add react-modal`
`yarn add -D @types/react-modal`


## src>app.tsx
下記が以前作成したコード

    import React from "react";

    const App = () => <h1>Hello World</h1>;
    export default App;

上記のコードを`react-modal`を`import`、`useState`でモーダルを管理

    import React, { useState } from "react";
    import Modal from "react-modal";

    const App = () => {
    const [modal, setModal] = useState(false);

    const openModal = () => {
        setModal(true);
    };
    const closeModal = () => {
        setModal(false);
    };
    return (
        <>
        <button onClick={openModal}>modal</button>
        <Modal isOpen={modal}>
            <button onClick={closeModal}>close</button>
            <h1>Hello World</h1>
        </Modal>
        </>
    );
    };
    export default App;

## 最後に
1. 環境構築の段階でpackage.jsonのscriptsに
`"start": "npx webpack serve --config webpack.config.js"` を書き込んでいる
2. `yarn start`を実行
3. port番号を8111に設定しているので、ブラウザで`http://localhost:8111`にアクセス

`modal`ボタンをクリックするとモーダルが出てきて、Hello Worldが表示される！
(`close`ボタンで元に戻る)
Godot用 iOS版 Firebase Analytics のプラグインを作った

## 概要
最近はGodotでゲームを作っています。主にiOS、Androidアプリ向け。
そこで、Android, iOSアプリにそれぞれ、Firebaseを入れたいのですが、各々対応しないといけません。Androidのほうはプログラムを書く必要が無いので簡単でAndroid Studioのbuild.gradleに追記とgoogle-services.jsonを追加するだけです。（普通のアプリ開発の作業と同じ）
ただ、iOSのほうはプログラムの記述が必要なのでちょっと面倒です。いいプラグインがないか調べた結果、これを使うって定番のもなく、一応存在はするけど使ってみた感じいまいちだったので、自分で作ることにしました。
こちらです
https://github.com/funseek/godot-ios-firebase-analytics

## プラグインの作成方法
これは公式ページに記載がありますので、こちらを参考にしました。
https://docs.godotengine.org/ja/stable/tutorials/platform/ios/ios_plugin.html

ざっくり言うと、
1. Xcodeで新規プロジェクトを作成（Objective-C static library）
2. HEADER_SEARCH_PATHSにgodotのheaderファイルの場所を書く
3. OTHER_CFLAGSに項目追加
4. プラグインのプログラムを書く
5. 完了後ビルドして、.a or .xcframeworkを作成
6. 拡張子がgdipというファイルを作成。中身はプラグインの詳細を記載

※この先はライブラリ読み込み側の話

7. プロジェクトのHOMEディレクトリに作成したファイルたちをコピーする。ios/plugin/の下
8. exportでiOSを選択。Pluginsのチェックボックスにチェックを入れる

## 使い方
### git clone
リポジトリをcloneします。submoduleでgodot本体のリポジトリも入ってますので一緒に落とします。

```
git clone --recurse-submodules git@github.com:funseek/godot-ios-firebase-analytics.git
```

### godot本体ソースのheaderファイルを作成
```sh
./scripts/generate_headers.sh
```
※結構時間がかかりますが、ヘッダーファイル自体はすぐ作られるので終わるのを待つ必要はないです。

### pod install
Firebase関連のファイルは[CocoaPods](https://cocoapods.org/)で取得します。

```
pod install
```

### .aライブラリファイルの作成
```
./scripts/release_static_library.sh 3.4
```
※今は3.4のみになってます。別のバージョン指定したい場合は、SConstructファイルの3.4の箇所を置換してください

### プロジェクトにコピー
作成された.aファイルをgodotのプロジェクトにコピーします。

```
cp bin/release/firebase-analytics/firebase-analytics.*.a $GODOT_HOME/ios/plugins/firebase-analytics/bin/
cp firebase-analytics.gdip $GODOT_HOME/ios/plugins/
```

### iOS用にエクスポート
iOS用にエクスポートしてください。PluginsのFirebase Analyticsの箇所のチェックを入れるのを忘れずに
![Screen Shot 2022-02-10 at 8.46.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24532/2beede4f-d9f0-59e6-8478-c85d171ad9d3.png)


### Xcodeの設定
XcodeはCocoaPodsを使ってください。Podfileに以下を追記します。

```
pod 'Firebase/Analytics'
pod 'Firebase/Auth'
pod 'Firebase/Firestore'
```
CocoaPodsを使う手順は以下です。
1. pod initを実行（まだ使ってない場合）
2. Podfileに上記を追記
3. pod installを実行
4. プロジェクト名.xcworkspaceのほうをXcodeで開く
5. GoogleService-Info.plistをプロジェクトにコピー（Firebaseの管理画面からダウンロードできます）

これで無事動けば完了です

※外部ライブラリに依存するプラグインは外部ライブラリをそれぞれコピーして読み込む形が取られてることが多いのですが、プラグイン毎に依存ライブラリをコピーして使うと、同じライブラリでもバージョン違いとかでエラーになったりして面倒な気がしてます（実際になりました）。なので依存ライブラリはCocoaPodsで一括管理したほうがいいと思います（個人の感想です）。依存ライブラリの例として、Firebase, AdMobなど

## その他
それ以外で以下のプラグインも作りました。

レビューリクエストダイアログを表示するプラグイン
https://github.com/funseek/godot-ios-request-review

ATTダイアログを表示するプラグイン
https://github.com/funseek/godot-ios-att

※ここまで書いて気づいたのですが、作ったプラグイン自体もCocoaPodsで読み込む形にすれば利用簡単なのでは？と思った。今度試して見ます
Python ゼロからはじめるプログラミングの学習教材がスゴイ！

# はじめに
こんにちは@tetotetoと申します。

本記事は学習教材の紹介です。
プログラミング言語のPython向けになります。

# 学習教材とは？

もともとは以下の書籍が出版されており、そのサポート教材にあたるそうです。

https://www.shoeisha.co.jp/book/detail/9784798169460

ズバリ以下よりダウンロード可能です。

https://mitani.cs.tsukuba.ac.jp/book_support/python/


> 本教材は「Python ゼロからはじめるプログラミング」を学校、または企業などで教科書として採用された教員・指導員を対象に、授業などで教材として活用していただくことを前提として作られています。
どなたでも自由にご使用いただけます。Microsoft PowerPoint形式のファイルは授業の進め方などに応じて、自由に改変していただいて結構です。

こんな感じです！

![スクリーンショット 2022-02-10 085800.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/585341/6e7d67cb-ac41-adae-044f-e1d3cf551087.png)

![スクリーンショット 2022-02-10 085825.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/585341/a78e3d67-e6a9-90cd-8612-ba91fc2a77da.png)


# 何がスゴイの？

個人的には以下がメリットだと思います。
本で勉強するかインターネットの情報をもとに勉強するかわかれると思いますが、これは両者のいいとこどりしています。

#### 上記にパワポの資料が置かれているのですが、編集可能なので使い勝手がいい
#### 教材特集のコードを打ち込む時間や自分の気づきをメモして他の人に共有できる
#### 新人教育や勉強会の資料作りの手間が省ける
#### そもそもこの本がpythonで画像推論やスクレイピングを扱っている

ちょっと応用的なことをやりたい場合にも対応できる点も魅力です。

参考にPPT情報を紹介します。

![スクリーンショット 2022-02-10 090119.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/585341/b88dfff6-26a5-8f7e-fcb4-3df5aee661e6.png)
![スクリーンショット 2022-02-10 090150.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/585341/b6979af4-b735-0339-a5ab-e1c28279d206.png)
SWRのmutateはSSGとSSRでは使えないのか

## 結論 ： SSRでデータ取得してSWRConfigを用いたデータの状態管理を行なっている際は、mutateは行えないと思っていたが、なんとかなった。

SSRやSSGのpre-renderingでは既にデータ取得してしまっているため、useSWRを使うタイミングではデータがある状態のため、useSWRの第二引数にfetcher関数が必要でない。

### 原因を考える
mutateをするにはfetcher関数が必要になってくる。
つまり、第二引数を必要としないSSGやSSRでのデータのfetch方法ではmutateが行えない。


### 対処1: SSR,SSGでfetchする方法からfetcher関数でデータをfetchする方法にきり変えたところ、[mutate](https://swr.vercel.app/ja/docs/mutation)が作動した。


### 対処2: mutateの引数にfethcer関数を使えば、再検証は行えた。
Windowsの電源ボタンシャットダウンを強制シャットダウンにする

#設定コマンド

管理者権限のコマンドプロンプトで

`powercfg /setacvalueindex SCHEME_MIN SUB_BUTTONS SHUTDOWN 1`

上記コマンド実行後、再起動後に電源ボタンシャットダウンが強制シャットダウンになる。
この設定をすると保存してないアプリケーションが強制シャットダウンになるので保存してない部分はなくなる。


##　公式情報
https://docs.microsoft.com/ja-jp/windows-hardware/customize/power-settings/power-button-and-lid-settings-power-button-forced-shutdown

GUID: 833a6b62-dfa4-46d1-82f8-e09e34d029d6を1にすればいいらしい。


##　窓のくすり箱さん

http://winkit.blog.fc2.com/blog-entry-57.html

> 例えば、電源設定がバランス設定（381b4222-f694-41f0-9685-ff5bb260df2e）の場合は、管理者のコマンドプロンプトで以下を設定します。
> `powercfg /setacvalueindex 381b4222-f694-41f0-9685-ff5bb260df2e 4f971e89-eebd-4455-a8de-9e59040e7347 833a6b62-dfa4-46d1-82f8-e09e34d029d6 1`
> GUIDのエイリアスとして
> SCHEME_BALANCED: 381b4222-f694-41f0-9685-ff5bb260df2e
> SUB_BUTTONS: 4f971e89-eebd-4455-a8de-9e59040e7347
> SHUTDOWN: 833a6b62-dfa4-46d1-82f8-e09e34d029d6
> も利用できます。

## 理解したこと

- powercfgで細かい設定ができる
- `powercfg /Q`で設定内容を表示する
- 電源設定「最大のパフォーマンス」はSCHEME_MINになってる。minimumなのは省電力がミニマムということらしい。
- `powercfg /setacvalueindex <scheme> <subgroup> <param> <value>`という構文。
- `> powercfg /setacvalueindex SCHEME_MIN SUB_BUTTONS SHUTDOWN 1`は、「電源スキームSCHEME_MINにある設定サブグループSUB_BUTTONSの設定SHUTDOWNを1にする」という意味。


こんなコマンド二度と理解したくないので記事にしました。
いつも忘れるpandasの個人的に便利だねって思う機能(挙動)のメモ

# 概要

いつも忘れるんだけど、pandasにはそういう便利な機能(挙動)があったよねっていうのを書き留める記事

# なぜこの記事を書いたか

いつも忘れるからメモしたりしているんだけど、googleDriveに入れておくより
qiitaに書いたほうが見返しやすそうって思ったので。
ちょっとづつ書き足していくと思う。たぶん。きっと。おそらく。

# DataFrameにSeriesのデータを追加するときにindexに合わせてくれる

```python

# DataFrameを作る
tmp_df = pd.DataFrame(
    columns=["名前","所在地"],
    data=np.array([
        ["名前0","所在地0"],["名前1","所在地1"],["名前2","所在地2"],["名前3","所在地3"],["名前4","所在地4"]
    ])
)

# 以下みたいなDataFrameができる。インデックスは0から始まっていて4まである。
	名前	所在地
0	名前0	所在地0
1	名前1	所在地1
2	名前2	所在地2
3	名前3	所在地3
4	名前4	所在地4

---
# Seriesを作る
data_series = pd.Series(data=["d2","d3","d4","d5"], index=(2,3,4,5))

# 以下みたいなSeriesができる。インデックスは2から始まっていて5まである。
2    d2
3    d3
4    d4
5    d5
dtype: object

---
# DataFrameに新しいカラムを作ってSeriesのデータを追加する
tmp_df["data_series"] = data_series
tmp_df

# DataFrameのインデックスに合わせてデータを追加してくれる。
# Seriesのインデックスに0と1と5は無かったので1,2はNaNになり、5は追加されていない
	名前	所在地	data_series
0	名前0	所在地0	NaN
1	名前1	所在地1	NaN
2	名前2	所在地2	2.0
3	名前3	所在地3	3.0
4	名前4	所在地4	4.0
```

# 真偽値はsumするとTrueの数を加法してくれる

```python
pd.Series([True, False, True, True]).sum()
3
```

# relativedelta(datetime1, datetime2) で datetime1 - datetime2 の計算ができる

```python
>>> from dateutil.relativedelta import relativedelta

>>> delta = relativedelta(datetime(2020,1,1), datetime(2018,10,1))
>>> delta
# 1年3ヶ月の差があることが分かる
relativedelta(years=+1, months=+3)

# 年の部分だけ取れる
>>> delta.years
1

# 月の部分だけ取れる
>>> delta.months
3

# 差を月に変換できる
>>> delta.years*12 + delta.months
15
```

# dtypesが任意のカラムだけ取得できる

```python
# DataFrameを作る
>>> tmp_df = pd.DataFrame(
    columns=["名前","所在地"],
    data=np.array([
        ["名前0",0],["名前1",1],["名前2",2],["名前3",3],["名前4",4]
    ])
)

# 所在地のカラムをint64に変換する
>>> tmp_df["所在地"] = tmp_df["所在地"].astype("int")

# dtypesを表示
>>> tmp_df.dtypes
名前     object
所在地     int64
dtype: object


# 型がint64カラムだけ取得する
>>> tmp_df.columns[tmp_df.dtypes == "int64"]
Index(['所在地'], dtype='object')
```
Firebase Authentication の認証で躓いた


https://stackoverflow.com/questions/66687738/asp-net-core-and-firebase-authentication
firebase認証のやり方で、↑の記事を見ながらやったのだが
ご丁寧にユーザー毎に変わる場所は"my-project-id"と書いていくれている、優しい

なのに、一意な数値だと勝手に思い込んでしまい
firebaseのプロジェクト設定からプロジェクト番号の方をコピペして貼っつけたら、見事に動かない

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/687054/413892c0-619d-bf51-fd7e-e11d62065d30.png)



```C#:startup.cs
            services
                .AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
                .AddJwtBearer(options =>
                {
                    options.Authority = "https://securetoken.google.com/my-project-id";
                    options.TokenValidationParameters = new TokenValidationParameters
                    {
                        ValidateIssuer = true,
                        ValidIssuer = "https://securetoken.google.com/my-project-id",
                        ValidateAudience = false,
                        ValidAudience = "my-project-id",
                        ValidateLifetime = true
                    };
                });
```

右往左往してプロジェクトID(文字列)の方使ったら解決した
IDは数字という固定概念はよくない
CGImageをリサイズする

#CGImageでリサイズするメリット

手元のiPhone11で1920*1038画像を6000*6000にリサイズしました。

![image9.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/12330749-c686-7deb-5b92-6e7ef0a91a43.jpeg)

処理速度はCIImageが速いけれど、メモリ使用量はCGImageの方が少ない印象です。
ちなみに、画像の合成処理でもメモリ使用量が少なかったです。

|format|time|memory(MB)|
|---|---|---|---|
|CGImage |0.356 |101||
|CIImage |0.002| 158.9|
|UIImage |0.482 |565 |

メモリ使用量はデバッガのメモリを目視しただけですが、
メモリ使用を抑えたいならCGImageを使うと良いと思います。

画質はUIImageが綺麗で、CIImageとCGImageは同じぐらいに見えました。

CGImage
![スクリーンショット 2022-02-10 4.21.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/e86f50ca-b3a8-ce80-19cb-7d5179a9c098.png)
CIImage
![スクリーンショット 2022-02-10 4.22.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/2fdb61d3-9216-73d7-27ac-dd3f47d68f19.png)
UIImage
![スクリーンショット 2022-02-10 4.22.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/2b4cc8f2-a603-1845-0f26-c685b1fe99b1.png)

#リサイズ方法

```swift
extension CGImage {
    func resize(size:CGSize) -> CGImage? {
        let width: Int = Int(size.width)
        let height: Int = Int(size.height)
        
        let bytesPerPixel = self.bitsPerPixel / self.bitsPerComponent
        let destBytesPerRow = width * bytesPerPixel

        
        guard let colorSpace = self.colorSpace else { return nil }
        guard let context = CGContext(data: nil, width: width, height: height, bitsPerComponent: self.bitsPerComponent, bytesPerRow: destBytesPerRow, space: colorSpace, bitmapInfo: self.alphaInfo.rawValue) else { return nil }
        
        context.interpolationQuality = .high
        context.draw(self, in: CGRect(x: 0, y: 0, width: width, height: height))
        
        return context.makeImage()
    }
}
```

🐣
****
フリーランスエンジニアです。
お仕事のご相談こちらまで
rockyshikoku@gmail.com

Core MLやARKitを使ったアプリを作っています。
機械学習／AR関連の情報を発信しています。

[Twitter](https://twitter.com/JackdeS11)
[Medium](https://medium.com/@rockyshikoku)
ネタとネタを足して2で割ったような記事


# はじめに

「(.+)と(.+)を足して(\d+)で割った感じ」という表現がありますよね。しかし私は想像力に乏しいもので，そんなことを言われてもよくわかりません。よくわからないことはPythonに考えさせようという言葉があった気がするので(ない)，Pythonを使って言葉の平均を求めてみます。

## 基本方針

Word2vecという単語を足したり引いたりできる仕組みがあるのでそれを使います。
> パリ - フランス + 日本 = 京都

みたいなやつです[^1]。

[^1]: 実際のモデルで計算するとなぜか「東京」になります。不思議ですね。

加減算はできるらしいのですが割り算はよくわからないので，重みを付けて(例えば2単語であればそれぞれ0.5)全部足してあげます。

# 準備

## `gensim`

Word2vecをPythonで使うためのライブラリです
(本当はいろいろなことができるらしいのですが)

```
$ pip install --upgrade gensim
```

でOKです。

このライブラリの詳細を語ることはこの記事の目的ではないため詳細は省略します。
「gensim word2vec」などでググればたくさんの情報が出てきます。

## 学習済みモデル

Word2vecで遊ぶには学習済みモデルが必要になりますが，自前で用意するのは面倒なので公開されているものを利用させてもらいます。

- [Wikipedia Entity Vectors](https://github.com/singletongue/WikiEntVec/releases)
- [chiVe](https://github.com/WorksApplications/chiVe)

など各自で好きなものを選べばよいでしょう。だいたいGBオーダーなのでダウンロードに時間がかかります。
私はchiVeのv1.2 mc5を利用しました(単語数3,197,456)。

# やってみよう

単語を重み付きで足していく`add_words`を，[gensimのソースコード](https://github.com/RaRe-Technologies/gensim/blob/9ca0fe1adfc92d680c79ea0208d359e7703bf227/gensim/models/keyedvectors.py)を参考にしながら書いてみます。

```python
import gensim
from gensim import matutils
from numpy import dot, float32 as REAL, array
from sys import argv

MODEL_PATH = 'path/to/chive-1.2-mc5.kv'
model = gensim.models.KeyedVectors.load(MODEL_PATH)

def add_words(words, topn=10, clip_start=0, clip_end=None):
  clip_end = clip_end or len(model.vectors)

  all_keys, mean = set(), []
  for key, weight in words:
    mean.append(weight * model.get_vector(key, norm=True))
    all_keys.add(model.get_index(key))

  mean = matutils.unitvec(array(mean).mean(axis=0)).astype(REAL)
  dists = dot(model.vectors[clip_start:clip_end], mean) / model.norms[clip_start:clip_end]
  best = matutils.argsort(dists, topn=topn + len(all_keys), reverse=True)
  result = [
    (model.index_to_key[sim + clip_start], float(dists[sim]))
    for sim in best
    if (sim + clip_start) not in all_keys
  ]
  return result[:topn]

def main():
  args = argv[1:]
  n = len(args)
  words = [(w, 1/n) for w in args]
  res = add_words(words, topn=5)
  print(res)

if __name__ == '__main__':
  main()
```

## 実行例
Twitterで「足して2で割った」で検索して良さそうなものを探してみます。

### 眠気と目眩を足して2で割ったようなもの

最初から重めで申し訳ないですがやってみましょう

```
python wordsaverage.py 眠気 目眩
[('頭痛', 0.8051504492759705), ('吐き気', 0.7748003602027893), ('立ち眩み', 0.7618328332901001), ('睡魔', 0.7527350187301636), ('偏頭痛', 0.7508496642112732)]
```

見ているだけで頭が痛くなってきそうです。

### 東京と名古屋を足して2で割った感じ

```
python wordsaverage.py 東京 名古屋
[('大阪', 0.7572567462921143), ('福岡', 0.6995946764945984), ('愛知', 0.6942369341850281), ('横浜', 0.6731942892074585), ('札幌', 0.6508569717407227)]
```

各方面から怒られそうですが私は悪くないです。
(ちなみにツイートでは「豊橋」が「東京と名古屋を足して2で割った感じ」となっていました)

### ネタとネタを足しで2で割ったような記事

最後にこの記事のタイトルを食わせてみます。
※ 食わせた単語は結果から除外するようになっているため，「ネタ」と「ネタ」の平均をとっても「ネタ」にはなりません。

```
python wordsaverage.py ネタ ネタ
[('ハムスターネタ', 0.510507345199585), ('バトマスクエ', 0.4984256625175476), ('サリクシンカ', 0.49488064646720886), ('ネタバレガンガン', 0.48528173565864563), ('バドミントンネタ', 0.48384809494018555)]
```

……何使って学習してるんですかねこのモデルは

# さいごに

「○○と××を足しで2で割った感じ」と言われてもピンと来なかったときにお役に立てば幸いです。
【React】CSSのあて方2

## はじめに
　本記事は、プログラミング初学者が、学習を進めていて疑問に思った点について調べた結果を備忘録も兼ねてまとめたものです。
　そのため、記事の内容に誤りが含まれている可能性があります。ご容赦ください。
　間違いを見つけた方は、お手数ですが、ご指摘いただけますと幸いです。

##ReactでのCSSのあて方2

### Styled JSX

https://www.npmjs.com/package/styled-jsx

`npm install --save styled-jsx`をターミナルで実行

```StyledJsx.jsx

export const StyledJSX = () => {
  return (
    <>
      <div className="container">
        <p className="">Styled-JSXの練習</p>
        <button className="">TEST</button>
      </div>
      {//  <style jsx="true">{``}の中にCSSと同様の記述をすることができる。　}
      {// デフォルトでは擬似要素は使用できない}
      <style jsx="true">{`
        .container {
          border: solid 4px #ff7f50;
          border-radius: 20px;
          padding: 8px;
          margin: 10px;
          display: flex;
          justify-content: center;
        }
        .title {
          margin: 0;
          color: #ff7f50;
        }
        .button {
          background-color: #ff7f50;
          border: none;
          padding: 8px;
          border-radius: 8px;
        }
      `}</style>
   </>
  );
};

```
100日でSQLの達人になる@LeetCode! Day9 <left join と where句を同時に使う。MS SQL Serverで複数変数にin句を使う>

## 184. Department Highest Salary （問題レベル: Medium）
今日の問題はこれ。
部門毎に最大値をリストアップして、別テーブルから部門名を持ってくるという問題。

シンプルでよく使いそうな課題であるが意外とやっかいだった。

まずポイント１. ```left join```と```where句```を同時に使用するときの記載方法。
```where句```は```left join on...```の後に記載すること。

もう一点は、MS SQL Server特有の問題であった。MySQLやOracleは次のように```in句```に複数変数があっても対応できる。
```:MySQL or Oracle
select d.name as Department, e.name as Employee, e.salary as Salary
from employee e
left join department d
on e.departmentID=d.id
where (departmentId, salary) in (select departmentId, max(salary) from employee group by departmentId)
```

しかしMS SQL Serverは```in句```には一つの変数しか比較できない。
Solutionを見ると、left joinを２度使用する方法などが紹介されていたが直感的でないために下記代替案を考えた。
```:MS SQL Server
select d.name as Department, e.name as Employee, e.salary as Salary
from employee e
left join department d
on e.departmentID=d.id
where (10000 * departmentId + salary) in (select 10000 * departmentId + max(salary) from employee group by departmentId)
```
数値の桁数によっては問題が無いが、きちんと実装する場合には文字列にして比較した方が良いのかも。

```
where convert(varchar, departmentId) + '@@' +CONVERT(varchar, salary) 
in (select convert(varchar, departmentId) + '@@' +CONVERT(varchar, max(salary)) from employee group by departmentId)
```
ということでポイント２. MS SQL Serverで複数変数を```in句```で使用する際には一つの変数にまとめて比較する！でした。

本記事は、[お だ のスペース 複数の列で in 句を使いたい](https://odashinsuke.hatenablog.com/entry/2015/12/13/103651)こちらを参考にさせて頂きました！
色々と勉強になります、この学習をはじめて良かったです。

* [LeetCode](https://leetcode.com/)の問題は、MS SQL Serverで解いています。
UE5 アーリーアクセスでプレイするとクラッシュ

マップは開けて正常に描画されるのに、プレイするとクラッシュするトラブルに遭遇しました。

アーリーアクセスなので一時的なものだとは思いますが、私の場合の解決法があったので共有します。

悪さをしていたのは VR 系のプラグインでした。

VR環境をインストールしていると、プロジェクトを作った際に、
Steam VR や Oculus VR のプラグインが勝手に有効になっているので、
それを 編集 > プラグイン からすべてオフにします。

すると、プレイしてもクラッシュせずに正常にできるようになりました。

（最初スペック不足だと思ってPC買い換えた…）

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/69889/ff322e5f-8774-1585-82ac-fadaa8c7f72b.png)

※Houdini Engine プラグインをインストールしたりしていたのでそれとの兼ね合いで発生していた可能性もあります（未検証）
Laravel の TrustedProxy な環境でhttpへのリダイレクトを起こさないようにする


# 想定状況
開発時はhttpで 本番環境だけhttpsなURLで実装したりするときに踏みそうな話。

TrustedProxyでLaravelにhttpsと認識させたとしても、Apache側は認識してくれないので、httpへのリダイレクトが帰ってくる場合があります。
一番ありがちなのは ```https://laravel/aaa/bbb/ccc/``` から ```https://laravel/aaa/bbb/ccc``` へのリダイレクトとか。

ただのリンク遷移なら見た目問題ないものの、Ajax経由でAPIを叩いてると通信エラー吐くので要注意。


# 修正内容
とりあえず末尾 / を外すリダイレクトはhttps固定にしておく。

```diff
diff --git a/public/.htaccess b/public/.htaccess
index 9aec9e17..91bd9143 100644
--- a/public/.htaccess
+++ b/public/.htaccess
@@ -12,7 +12,7 @@
     # Redirect Trailing Slashes If Not A Folder...
     RewriteCond %{REQUEST_FILENAME} !-d
     RewriteCond %{REQUEST_URI} (.+)/$
-    RewriteRule ^ %1 [L,R=301]
+    RewriteRule ^ https://%{HTTP_HOST}%1 [L,R=301]

     # Send Requests To Front Controller...
     RewriteCond %{REQUEST_FILENAME} !-d
```