OmniAICreator/Qiita-1.07M huggingface dataset:
IBM Installation Manager 1.9.1 on Windows Serverのインストール

# 最新版のダウンロード
IBM Installation Manager 1.9.1の最新版を以下から探します。

Fix list for Installation Manager

https://www.ibm.com/support/pages/fix-list-installation-manager

この時の最新はFixPack 6でした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/625e4025-4b15-6b20-4dbf-4bb1aae80a51.png)

Download PackageからWindowsを選びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/56ebe6d1-c05b-d272-7b85-389b13e8db29.png)

リフレッシュパックでx86_64 Windowsを選びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/1624531d-2cce-22f0-09d0-db2b991139c6.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/bf25137c-95fd-fc6b-33bf-ee14572b6281.png)

#　解凍
ダウンロードしたZipファイルを解凍します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/37bc945c-1d07-d2b3-dbd5-13a672651265.png)


# インストール
install.exeを実行します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/65bebcaf-26cd-83fc-9cb4-0d2e01346864.png)

「次へ」で進んでいきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/7cc6fec8-49f4-407c-6b7b-9ff689116bd9.png)

使用条件に同意し、「次へ」で進んでいきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/f7e52112-2b40-b296-315a-5341fdd8ceb1.png)

「次へ」で進んでいきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/67772004-c1d5-76e6-224d-557e527443b1.png)

「インストール」で進んでいきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/ec6f2283-3984-093c-f6e0-57111fc00f3a.png)

「ログファイルの表示」で確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/3885e3fe-c667-3b4e-5a63-5a7710d34c80.png)

「閉じる」で閉じます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/a11a7b53-edad-1205-9f7c-d7684f405285.png)

「Installation Managerの再起動」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/88f292dc-4857-3ef2-1d38-31bb55c94171.png)

# インストール後の作業
Installation Managerが起動します。「ヘルプ」の「IBM Installation Managerについて」でバージョンを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/2ded3c9f-9515-7348-91f5-4ed6b599e554.png)

バージョンが確認できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/e3bfa448-5825-2b56-64e0-006ca45b0565.png)

「終了」で閉じます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/cd3212e3-6758-d2b0-439a-2a728d7117aa.png)

# 環境
* Windows Server 2019
* IBM Installation Manager 1.9.1
ReactNativeでスクリーンショットを禁止する

詳細については後ほど記載していく。
先に結論のみ。

## iOS
１）スクリーンショット禁止処理を実装（UIViewやUIWindowのExtention）
２）AppDelegate.mや任意の処理で呼び出し
[参考](https://stackoverflow.com/questions/18680028/prevent-screen-capture-in-an-ios-app)
```swift
extension UIWindow {
    func makeSecure() {
        let field = UITextField()
        field.isSecureTextEntry = true
        self.addSubview(field)
        field.centerYAnchor.constraint(equalTo: self.centerYAnchor).isActive = true
        field.centerXAnchor.constraint(equalTo: self.centerXAnchor).isActive = true
        self.layer.superlayer?.addSublayer(field.layer)
        field.layer.sublayers?.first?.addSublayer(self.layer)
    }
}
```

## Android
１）MainActivityなどで以下処理を追記
```java
getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE);
```
２）解除したい場合は以下を呼び出す処理をReactNativeから呼び出せるようにすれば良い。
```java
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_SECURE);
```
[参考](https://stackoverflow.com/questions/28606689/how-to-prevent-screen-capture-in-android)

## 参考にした記事一覧
--【iOS】---------------
・サンプルPJ
https://github.dev/mittsu333/SecureScreen
・Swiftで定義したExtensionをObjective-Cで利用（Objective-C）
<https://komaji504.hateblo.jp/entry/2016/07/18/213933>
　→上記をObjective-Cで書き直すには
　<https://komaji504.hateblo.jp/entry/2016/07/18/213933>
・Objective-Cでメソッドを呼出(Objective-C）
<https://qiita.com/Pinehead/items/a9476dcac6e39f33c282>
・AppDelegateで関数呼出(Flutter Objective-C）
<https://stackoverflow.com/questions/52317217/flutter-disable-screenshot-capture-for-app>
・スクリーンショット禁止処理（Swift Extension）
<https://stackoverflow.com/questions/18680028/prevent-screen-capture-in-an-ios-app>



--【Android】---------------
<https://qiita.com/tkhs0604/items/47bfa0f2b83b79c365e4>
<https://stackoverflow.com/questions/28606689/how-to-prevent-screen-capture-in-android>
<https://stackoverflow.com/questions/6764568/prevent-screen-capture-in-android-apps>

--【Swift】---------------
<https://github.dev/lizhming/ScreenCaptureSecure/>
中古マンションの価格をスクレイピングしてみた

<h1>目次</h1>
<ul>
<li>概要</li>
<li>本題</li>
<li>あとがき</li>
</ul>

<h1>概要</h1>
こんにちは中学校の先生です。<br>
先日縁あって不動産を買う機会がありました。<br>
その中で『業者さんの情報って忖度入ってるよなあ』と感じたので、自分で情報収集したくなりました。<br>
ただどのサイトも非常に情報が多く、pythonを活用してみよう！と思い立ちました。<br>
プログラミング初心者としての備忘録になりますので、苦労した点が多めです。

<h1>本題</h1>
<ul>
  <li>コードの内容</li>
  早速本題。作ったものはこちらになります。<br>

<details><summary>不動産価格参照ツール</summary>

```py
from re import T
from ssl import SSL_ERROR_WANT_X509_LOOKUP
from retry import retry
import requests
from bs4 import BeautifulSoup
import pandas as pd

#対象サイトのURL
want_url = "(省略)"
#10秒おきに3回リトライ
@retry(tries=3,delay=10,backoff=2)

#html取得関数を定義
def get_html(url):
  r = requests.get(want_url)
  soup = BeautifulSoup(r.content,"html.parser")
  return soup
#データの代入先を定義
all_data=[]
#最後のページを求める(現在は手作業)
max_page=2

#最後のページまで繰り返し
for page in range(1,max_page+1):
  #urlを取得
  url=want_url.format(page)
  #htmlを取得
  soup=get_html(url)
  #物件の数を取得
  items=soup.select("div.click_Row")
  #物件の数だけ情報を収集
  for item in items:
    item_data={}
    item_data["名称"]=item.select(".click_R_link")
    item_data["所在地"]=item.select("item_location")
    item_data["価格"]=item.select("p.item_price")
    item_data["アクセス"]=item.select("p.item_access")
    item_data["築年数"]=item.select(".item_5")
    item_data["面積"]=item.select(".item_4")
    #データを代入し一時保管
    all_data.append(item_data)

#データフレームを作成
df=pd.DataFrame(all_data)
print(df)
```
</details>


  <li>利用したライブラリ</li>
  <ul>
    <li>retry</li>
    色んな人が使ってたのでとりあえず入れました。効果は実感できてないです。
    <li>requests</li>
    htmlの取得に使用。
    <li>Beautifulsoup</li>
    htmlから特定のデータを抜き出します。まじ便利。ここでクラスをちゃんと見て情報を抜き出すのに時間がかかりました。<br>
    サイトによってクラスのつけ方が変わってくるので、センスの違いが見え隠れして楽しかったです。
    <li>pandas</li>
    データを整理してくれる賢い子。ついでにcsvで出力までしてくれる(予定)。
  </ul>
  <li>先行研究との差異</li>
  ググると多くの方が賃貸物件の検索にスクレイピングを利用されていました。今回私は購入のために相場観が知りたかったので、中古マンションの購入に焦点を当てています。<br>
  そうなると必要な情報が少なくなるので、コードがすっきりしました。
  <li>苦労したこと</li>
  <ul>
    <li>スクレイピング対策の対策</li>
    現在はURLに中括弧を入れると、さまざまなサイトで弾かれてしまうようです。<br>
    最初は何度やってもうまくいかず、原因究明と対策に数時間かかりました。<br>
    Beautifulsoupでh1タグやdivタグでおおまかに抽出→print→ログを見て判断、の繰り返しでスクレイピングできるサイトを必死に探しました。<br>
    <li>クラスの選定</li>
    htmlを見慣れていなかったので、タグが多くて目が疲れました。<br>
    またfindとselectのどっちを使ったらいいかわからず、右往左往したので、括弧の中身も何度も書き直してしまいました。
  </ul>
</ul>

<h1>あとがき</h1>
今後の課題は
<ul>
  <li>データ出力</li>
  今後はcsvで出力したものを整理し、グラフにしたいと思っています。<br>
  同時に平均値と中央値を求め、購入する上での参考にしたいです。
  <li>ページ数の自動取得</li>
  最後のページを手作業で入力していたため、これを自動で取得できるようにしたいです。
  <li>操作ページの作成</li>
  VSCode上でしか動作していないため、htmlで操作できるページを作りたいなあと思っています。
  <li>他ページへの対応</li>
  中古マンションの23区付近で絞って検索をかけました。URLの規則性を見て、地域や他条件も勝手にいじってくれるといいなあ。
</ul>

（実動3日、20時間程度）

今回は以上になります。最後まで閲覧いただきありがとうございました。
coc.nvimの補完メニュー（ポップアップメニュー）の仕様が変わったらしい

# coc.nvimの補完メニューの仕様が変わったらしい
## 記事を書いた背景
`coc.nvim`の`0.0.82`で補完メニューの仕様が変わったようです。
詳しくは以下のプロリクエスト、もしくは`:h coc-completion`に詳しく書いています。
[[WIP] Custom completion menu #3862](https://github.com/neoclide/coc.nvim/pull/3862)

それに伴い関数名などが変更されたため、設定の一部を変更する必要があります。今後、新しいバージョンを利用する方は、過去の記事がほとんど使えなくなると思われます。8/9現在、Googleで検索したところ、日本語でこの件を扱っている記事が見当たらないため、簡単にですがまとめておこうと思いました。

しかし、筆者自身もこのアップデートを知って、1,2時間程度でこの記事を書いてるため、理解が甘いところがあるかもしれませんがご了承ください。

# 変更点
以下がこれまで有効だった設定です。
```vimscript
" Enterを押すと補完を確定する
" 元々<C-y>に割り当てられた機能
inoremap <expr><CR>  pumvisible() ? "<C-y>" : "<CR>"
```

アップデート後、`coc.nvim`の補完メニューが独自の物になりました。これにより、組み込み関数である`pumvisible`関数は、`coc.nvim`の補完メニューの状態を取得できなくなりました。今後は`coc#pum#visible`関数を利用する必要があります。

以下がバージョンアップに対応した設定です。

```vimscript
" 以下だと動作しなかったので、直接coc#pum#confirm関数を呼んでいます。
" inoremap <silent><expr> <CR> coc#pum#visible() ? "<C-y>" : "\<CR>"
inoremap <silent><expr> <CR> coc#pum#visible() ? coc#pum#confirm() : "\<CR>"
```

新バージョンで使用できる関数については、[[WIP] Custom completion menu #3862](https://github.com/neoclide/coc.nvim/pull/3862)や`:h coc-completion`にまとめられています。

## 最後に
より詳細に書かれた記事や、間違えている点がありましたら、是非教えていただけると幸いです。

参考例として、筆者の設定を投げて終わりにしたいと思います。
```vimscript:init.vim
function! s:check_back_space() abort
  let col = col('.') - 1
  return !col || getline('.')[col - 1]  =~ '\s'
endfunction

" autocomplete
inoremap <silent><expr> <C-j> coc#pum#visible() ? coc#pum#next(1) : "\<C-j>"
inoremap <silent><expr> <C-k> coc#pum#visible() ? coc#pum#prev(1) : "\<C-k>"
inoremap <silent><expr> <Enter> coc#pum#visible() ? coc#pum#confirm() : "\<Enter>"
inoremap <silent><expr> <Esc> coc#pum#visible() ? coc#pum#cancel() : "\<Esc>"
inoremap <silent><expr> <C-h> coc#pum#visible() ? coc#pum#cancel() : "\<C-h>"

" <Tab>で次、<S+Tab>で前
inoremap <silent><expr> <TAB>
  \ coc#pum#visible() ? coc#pum#next(1):
  \ <SID>check_back_space() ? "\<Tab>" :
  \ coc#refresh()
inoremap <expr><S-TAB> coc#pum#visible() ? coc#pum#prev(1) : "\<S-TAB>" " "\<C-h>"
inoremap <silent><expr> <c-space> coc#refresh()
```
MIPSのSIMD其の四

MIPSのDSPのコードはあまり多くはないのですが、集めてみました。

https://github.com/yamori813/mips_dsp_samples

qeumのコードはテストコードです。

webrtcのコードが不思議とがっつり書かれています。

FreeBSD 12-STABLEのgcc 4.2.1に4.3相当のmdspr2のサポートを入れてカーネルにも手を入れてみました。

https://github.com/ZRouter/freebsd-src/tree/zrouter_yamori813

74Kでテストコード実行できました。

後はカーネルでpcbへのレジスタの退避と復元のコードを入れれば完成です。

DSPのレジスタはカーネル内では使いませんし、もし単一プロセスのみがDSP命令を使うのであれば退避の必要はないのですが。。。
デフォルトVPCを削除するAWS CLI

### ■全体の流れ
1. デフォルトVPCの情報を取得
1. デフォルトVPCに関連付けられているInternet Gatewayの削除
1. デフォルトVPCに関連付けられているSubnetの削除
1. デフォルトVPCの削除

### ■備考
* DHCPオプションセットは残る
* 全リージョン分削除する場合は適宜修正
* デフォルトVPCの状態がデフォルトである前提

### ■詳細
① デフォルトVPCの情報を取得
```shell
# デフォルトVPCのIDを取得
default_vpc_id=$(aws ec2 describe-vpcs --region ap-northeast-1 | jq -r '.Vpcs[] | select(.IsDefault == true) | .VpcId')
```
② デフォルトVPCに関連付けられているInternet Gatewayの削除
```shell
# デフォルトVPCに関連付けられているInternet GatewayのIDを取得
default_igw_id=$(aws ec2 describe-internet-gateways --region ap-northeast-1 | jq -r --arg default_vpc_id $default_vpc_id '.InternetGateways[] | select(.Attachments[].VpcId == $default_vpc_id) | .InternetGatewayId')
# デフォルトVPCに関連付けられているInternet Gatewayの関連付けを解除
aws ec2 detach-internet-gateway --vpc-id $default_vpc_id --internet-gateway-id $default_igw_id --region ap-northeast-1
# デフォルトVPCに関連付けられているInternet Gatewayを削除
aws ec2 delete-internet-gateway --internet-gateway-id $default_igw_id --region ap-northeast-1
```

③ デフォルトVPCに関連付けられているSubnetの削除
```shell
# デフォルトVPCのIDに関連付けられているサブネットIDのリストを取得し、サブネットを削除する
for i in $(aws ec2 describe-subnets --region ap-northeast-1 | jq -r --arg default_vpc_id $default_vpc_id '.Subnets[] | select(.VpcId == $default_vpc_id) | .SubnetId');do aws ec2 delete-subnet --subnet-id $i --region ap-northeast-1;done
```

④ デフォルトVPCの削除
```shell
# デフォルトVPCの削除
aws ec2 delete-vpc --vpc-id $default_vpc_id --region ap-northeast-1
```

### ■補足
（デフォルトで有効化されている）リージョン一覧取得
```shell
 aws ec2 describe-regions | jq -r '.Regions[] | select(.OptInStatus == "opt-in-not-required") | .RegionName'
```
IISでSSL新規更新設定メモ

## IISからCSR作成
https://www.einspki.jp/support/manual_s/iis8_csr_renew/
https://www.fujissl.jp/docs/d003/

## SSLを申し込み fujissl
https://www.fujissl.jp/request/petition/

## SSL設定
https://www.fujissl.jp/request/issue/install/install-microsoft-iis-8-x/

・crtファイルをダブルクリック
・証明タブ、ファイルコピーボタン押下
・次へ
・base64 encorded 選択し次へ
・申し込んだドメイン名.cerで出力
・「スタートメニュー」をクリックし、次に「ファイルを指定して実行」をクリック
・プロンプトが表示されたら、「mmc」と入力して「OK」をクリックし
・「ファイル」をクリックし、次に「スナップインの追加と削除」をクリック
・新しいウィンドウで「証明書」を選択して「追加」をクリック
・管理する証明書 コンピューターアカウント選択し次へ
・中間証明機関の証明書右クリックすべてのタスク インポート
・証明書をすべて次のストアに配置する 次へ

・webサーバー証明書のインストール
・IIS起動、コンピュータレベルで選択し、サーバー証明書のアイコンダブルクリック
・右の証明書の要求の完了をクリック
・cer選択し、任意のフレンド名入力でOK ※1 ※2

・IISからサイトの該当サイトを選択し、右からバインドクリック
・https 追加、または編集 
・ポート443設定
・SSL証明書を追加したもので選択
・IIS再起動
・サイトの証明書が更新されたことを確認する

## 問題
### ※1 プロパティ値が空です エラーメッセージが出る
証明書の要求の完了設定時、プロパティ値が空です エラーの場合は、元のcrtファイルが間違っている可能性が高い。


### ※2インポートできたのに、画面遷移するとリストから消える場合
https://qiita.com/yoripo/items/cbc1426e4fcf47d0c4d6

https://www.cybertrust.co.jp/sureserver/support/faq/g7yejusb5xi4.html#:~:text=%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89%E3%83%BB%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6-,%5BIIS%207.0%20%E4%BB%A5%E9%99%8D%5D%20%E8%A8%BC%E6%98%8E%E6%9B%B8%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%97%E3%81%9F%E5%BE%8C%E3%81%AB%E7%94%BB%E9%9D%A2,%E5%8F%AF%E8%83%BD%E6%80%A7%E3%81%8C%E3%81%94%E3%81%96%E3%81%84%E3%81%BE%E3%81%99%E3%80%82

・コンソールルートを開き、個人、証明書にはインポートしたファイルが新たに入っているが、鍵がかかっていない状態であることを確認。
・該当の証明書をダブルクリックし、詳細タブ、シリアル番号をコピー
・空白部分を除去し下記実行
・certutil -repairstore my "シリアル番号"
・するとIISのサーバー証明書の一覧に復活する
Error: You must provide the URL of lib/mappings.wasmエラーが出た場合の対応

jestでテストを実行したら、下記のエラーが。

```
Error: You must provide the URL of lib/mappings.wasm by calling SourceMapConsumer.initialize({ 'lib/mappings.wasm': ... }) before using SourceMapConsumer
```

[You must provide the URL of lib/mappings.wasm by calling \`SourceMapConsumer.initialize\` · Issue #35607 · gatsbyjs/gatsby](https://github.com/gatsbyjs/gatsby/issues/35607)によればNode.jsのバージョンに起因する問題のようです。ちなみエラーが出た時にはv18.7.0を使っていました。

## 解決策1

ということでv16にすると正常に終了します。


```
% npm run test         

> blastengine@1.2.3 test
> jest

 PASS  tests/transaction.test.ts
 PASS  tests/bulk/bulk.test.ts
------------------------------------|---------|----------|---------|---------|------------------------------------------
File                                | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s                        
------------------------------------|---------|----------|---------|---------|------------------------------------------
All files                           |   82.74 |    69.76 |   77.41 |   82.74 |                                          
 src                                |     100 |       50 |     100 |     100 |                                          
  index.ts                          |     100 |       50 |     100 |     100 | 21-22                                    
 src/libs                           |   59.03 |     62.5 |   66.66 |   59.03 |                                          
  request.ts                        |   59.03 |     62.5 |   66.66 |   59.03 | 8,18,25-29,38-40,43-45,51-56,66-76,79-82 
 src/libs/delivery                  |   73.33 |      100 |       0 |   73.33 |                                          
  index.ts                          |   73.33 |      100 |       0 |   73.33 | 9-10,13-14                               
 src/libs/delivery/transaction      |   90.58 |       90 |   81.81 |   90.58 |                                          
  base.ts                           |   88.46 |      100 |   71.42 |   88.46 | 34-36,44-46                              
  index.ts                          |   93.93 |       80 |     100 |   93.93 | 10-11                                    
 src/libs/delivery/transaction/bulk |   91.66 |    69.23 |      90 |   91.66 |                                          
  index.ts                          |   91.66 |    69.23 |      90 |   91.66 | 17-23,55                                 
------------------------------------|---------|----------|---------|---------|------------------------------------------

Test Suites: 2 passed, 2 total
Tests:       5 passed, 5 total
Snapshots:   0 total
Time:        3.577 s, estimated 4 s
Ran all test suites.
```

## 解決策2

`NODE_OPTIONS=--no-experimental-fetch` を付けても大丈夫なようです。ただ、おそらくNode.js v18以降のfetchが使えなくなる模様（個人的にはnode-fetchを使っているので良いのですが）。

```
NODE_OPTIONS=--no-experimental-fetch npx jest
```
.Net 6: C# で MariaDB の Delete

プロジェクトの作成

```bash
mkdir Delete01
cd Delete01
dotnet new console
dotnet add package MySql.Data --version 8.0.30
```

フォルダー構造

```text
$ tree -L 1
.
├── Delete01.csproj
├── Program.cs
└── obj
```

```cs:Program.cs
// -------------------------------------------------------------------
/*
	Program.cs

					Aug/09/2022


*/
// -------------------------------------------------------------------
using	System;
using	System.Text;
using	MySql.Data.MySqlClient;

// -------------------------------------------------------------------
class maria_delete
{
// -------------------------------------------------------------------
static void Main (string[] args)
{
	Console.WriteLine ("*** 開始 ***");

	string	id_in = args[0];

	string server = "localhost";
	string str_db = "city";
	string user = "scott";
	string password = "tiger123";

	string str_connect = "Server=" + server + 
		";User Id=" + user + ";Password=" + password +
		";Database=" + str_db + ";";
 
	MySqlConnection connection = new MySqlConnection (str_connect);
	connection.Open ();

	mysql_delete_proc (connection,id_in);

	connection.Close ();

	Console.WriteLine ("*** 終了 ***");
}

// -------------------------------------------------------------------
static void mysql_delete_proc
	(MySqlConnection connection,string id_a)
{
	StringBuilder sb_sql = new StringBuilder
			("DELETE from cities WHERE ID = '" + id_a + "'");

	string str_sql = sb_sql.ToString ();

	Console.WriteLine (str_sql);

	MySqlCommand command = new MySqlCommand (str_sql,connection);
	int rowsAffected = command.ExecuteNonQuery ();
	Console.WriteLine ("rowsAffected = " + rowsAffected);
}

// -------------------------------------------------------------------
}

// -------------------------------------------------------------------
```

実行結果

```text
$ dotnet run t3322
*** 開始 ***
DELETE from cities WHERE ID = 't3322'
rowsAffected = 1
*** 終了 ***
```
.Net 6: C# で MariaDB の Update

プロジェクトの作成

```bash
mkdir Update01
cd Update01
dotnet new console
dotnet add package MySql.Data --version 8.0.30
```

フォルダー構造

```text
$ tree -L 1
.
├── Program.cs
├── Update01.csproj
├── mysql_manipulate.cs
└── obj
```

```cs:Program.cs
// -------------------------------------------------------------------
/*
	Program.cs

					Aug/09/2022


*/
// -------------------------------------------------------------------
using	System;
using	MySql.Data.MySqlClient;

// -------------------------------------------------------------------
class maria_update
{
// -------------------------------------------------------------------
static void Main (string[] args)
{
	Console.WriteLine ("*** 開始 ***");

	string	id_in = args[0];
	int	population_in = int.Parse (args[1]);

	string server = "localhost";
	string str_db = "city";
	string user = "scott";
	string password = "tiger123";

	string str_connect = "Server=" + server + 
		";User Id=" + user + ";Password=" + password +
		";Database=" + str_db + ";";
 
	MySqlConnection connection = new MySqlConnection (str_connect);
	connection.Open ();

	mysql_manipulate.mysql_update_proc (connection,id_in,population_in);

	connection.Close ();


	Console.WriteLine ("*** 終了 ***");
}

// -------------------------------------------------------------------
}

// -------------------------------------------------------------------
```

mysql_manipulate.cs はこちら
[.Net Core: C# で MariaDB の Create](https://qiita.com/ekzemplaro/items/d3009bccd206bbb13a7a)

実行結果

```text
$ dotnet run t3326 17895600
*** 開始 ***
2022-08-09 14:24:19
UPDATE cities SET population = 17895600 , date_mod = '2022-08-09 14:24:19' WHERE id = 't3326'
rowsAffected = 1
*** 終了 ***
```
知っていて当たり前-16　ラムダ関数

# 知っていて当たり前-16　ラムダ関数

匿名関数，無名関数，λ関数，ラムダ関数などと言語ごとにいろいろな名前で呼ばれている。


```julia
x -> x * 1.08
```




    #1 (generic function with 1 method)



これだけだと，実行できない。引数を与えるには以下のようにするが，メリットが見えない。


```julia
(x -> x * 1.08)(100)
```




    108.0




```julia
(x -> x * 1.08).([100, 200, 300])
```




    3-element Vector{Float64}:
     108.0
     216.0
     324.0



ラムダ関数を変数に代入すると，その変数は関数名になる。


```julia
price = x -> x * 1.08
```




    #7 (generic function with 1 method)




```julia
price(100), price(200)
```




    (108.0, 216.0)




```julia
price.([100, 200, 300])
```




    3-element Vector{Float64}:
     108.0
     216.0
     324.0



しかしこれはラムダ関数の説明にはなっていない。以下の price2 は関数定義であり，同じ結果になる。


```julia
price2(x) = x * 1.08
price2(100), price2(200)
```




    (108.0, 216.0)




```julia
price2.([100, 200, 300])
```




    3-element Vector{Float64}:
     108.0
     216.0
     324.0



引数に関数を取る関数の場合ラムダ，関数として既存の関数，関数定義による関数と同時に，ラムダ関数も指定できる。


```julia
map(price2, [100, 200, 300])
```




    3-element Vector{Float64}:
     108.0
     216.0
     324.0




```julia
map(x -> x*1.08, [100, 200, 300])
```




    3-element Vector{Float64}:
     108.0
     216.0
     324.0




```julia
filter(x -> x > 5, [3, 4, 5, 6, 7])
```




    2-element Vector{Int64}:
     6
     7




```julia
foreach(x -> print("$x "), rand(1:10, 5))
```

    10 6 9 3 1 


```julia
x = 1; y = 2
arg = "x"
a = Meta.parse("func2($arg) = x + y")
eval(a)
```




    func2 (generic function with 1 method)




```julia
func2(5)
```




    7



複数行の場合は、`begin` ～ `end` で囲む。


```julia
nebiki = x -> begin
    price = x * 0.9
    return price * 1.08
end

nebiki(100)
```




    97.2



複数の引数を持つ場合には引数をタプルで示す。


```julia
func = (x, y) -> 2x + 3y
func(10, 20)
```




    80
.Net 6: C# で MariaDB の Read

プロジェクトの作成

```bash
mkdir Read01
cd Read01
dotnet new console
dotnet add package MySql.Data --version 8.0.30
```

フォルダー構造

```text
$ tree -L 1
.
├── Program.cs
├── Read01.csproj
└── obj
```

```cs:Program.cs
﻿// ----------------------------------------------------------------
/*
	Program.cs

					Aug/09/2022

*/
// ----------------------------------------------------------------
using System;
using MySql.Data.MySqlClient;

// ----------------------------------------------------------------
public static class maria_read
{
public static void Main (string[] args)
{
	string server = "localhost";
	string str_db = "city";
	string user = "scott";
	string password = "tiger123";
	string str_connect = "Server=" + server + 
	";User Id=" + user + ";Password=" + password + ";Database=" + str_db + ";";

	MySqlConnection conn = new MySqlConnection (str_connect);

	Console.Error.WriteLine ("*** 開始 ***");

	conn.Open();

	MySqlCommand command = new MySqlCommand("select * from cities", conn);

	MySqlDataReader dr = command.ExecuteReader();


	while(dr.Read())
		{
		for (int it = 0; it < dr.FieldCount; it++)
			{
			Console.Write("{0} \t", dr[it]);
			}
		Console.WriteLine();
		}

	conn.Close();

	Console.Error.WriteLine ("*** 終了 ***");
}

// ----------------------------------------------------------------
}
// ----------------------------------------------------------------
```

実行結果

```text
$ dotnet run
*** 開始 ***
t3321 	岡山 	497125 	2009-8-4 	
t3322 	倉敷 	219687 	2009-9-2 	
t3323 	津山 	871392 	2009-10-8 	
t3324 	玉野 	923187 	2009-5-9 	
t3325 	笠岡 	651978 	2009-1-5 	
t3326 	井原 	395647 	2009-5-22 	
t3327 	総社 	412786 	2009-7-17 	
t3328 	高梁 	174835 	2009-3-4 	
t3329 	新見 	781324 	2009-10-12 	
*** 終了 ***
```
ファイルかディレクトリがない@ rb_sysopenと言われた

rails sを行うと
Error: No such file or directory @ rb_sysopen
でサーバーを起動できませんでした。

→６系だとYarn、webpackerがインストールされていないと表示されるらしい

参考にしたもの：
https://prograshi.com/framework/rails/how-to-install-rails6-on-local-env/
↓
Rails6.0以降の場合
version6をインストールした場合、下記２つがインストールされている必要がある。

Yarn：パッケージマネージャー(npmの上位互換)
webpacker：gemパッケージの一つ
　- 画像やcss, jsなどのリソースをモジュール化できる
　- rails5.1から標準サポート
　- rails6.0以降必須になった

と記載がありました。
そこで
1
#yarnのインストール（node.jsインストール済み）
npm install -g yarn
2
#webpackerのインストール
$ rails webpacker:install
を行いました。
3
rails s

６系を使っている人はyarn、webpacker、rails sの順に


実行結果
無事サーバーが起動されました。
SPSS Modeler Server 18.4のインストール on Windows Server

SPSS Modeler Serverをインストールします。

# インストール
spss_mod_svr_18.4_win_ml.zipを解凍します。
Setup.exeを「管理者として実行」します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/818882b9-efbe-ba25-f262-8aac1af8f799.png)

「次へ」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/742453a9-f101-03fe-943f-396a2c7f22c5.png)

「次へ」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/8a30dc90-8c1d-f736-8e49-0383fdf724b0.png)
「使用許諾所に同意します」をチェックし、「次へ」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/d66fce03-273d-1714-e45c-0be7dc4ca9b2.png)

実動モードで「Next」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/fb345d57-fa3f-d985-11b9-09e3da291702.png)

「次へ」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/0bbca385-541b-5fe9-7dfe-a0c67a861429.png)

「インストール」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/28662739-bed4-5538-1cd7-586660925965.png)

「完了」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/125ed127-ba65-a2ae-7e78-059bee3069b2.png)

# 起動停止

Windows サービスで開始や停止を行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/fcec62ae-8551-5fde-dda8-b173f9f05493.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/4728ecb0-f3e1-0244-09ed-468f51a9f23c.png)

# テスト環境
* Modeler Server 18.4
* Windows Server 2019 Standard

# 関連情報
#### SPSS Modeler Batch18.4のインストール on Windows Server - Qiita 
https://qiita.com/kawada2017/items/2107702d511b8d0d3a40

#### SPSS Data Acess Pack（SDAP） 8.1.1の導入(Windows) - Qiita 
https://qiita.com/kawada2017/items/7f3054b7a19189640334

#### SPSS Modelerの拡張ノードでRを利用する - Qiita 
https://qiita.com/kawada2017/items/0bb68e0b577e02bb8c6a
DockerでGitLab環境構築

Docker超初心者が、GitLabを入れたときのメモです。
### 0.環境
* OS - CentOS8
* Docker - 20.10.17
### 1.GitLab Docker imagesの取得
```
$ docker pull gitlab/gitlab-ce
```
私は無料版の` gitlab-ce `にしました。有料版がいい方は`ce`を`ee`にしてください。
### 2.ボリュームの場所を設定する
> 他のすべてを設定する前に、構成、ログ、およびデータ・ファイルが存在するディレクトリーを指す新しい環境変数を構成します。ディレクトリーが存在し、適切な許可が付与されていることを確認してください。`$GITLAB_HOME`

とのことなので、まずディレクトリを作ります（既にある方はスキップ）。
```
$ mkdir /srv/gitlab
```
パスを設定します。
```
$ export GITLAB_HOME=/srv/gitlab
```
### 3.Docker Compose を使って GitLab をインストールする
複数やり方があるようですが、今回はDocker Composeを使ってインストールします。
以下をコピペすると無料版GitLab ver3.6がインストールされ、`http://localhost:80`に接続することで確認できます。

``` docker-compose.yml
version: '3.0'
services:
  web:
    image: 'gitlab/gitlab-ce:latest'
    restart: always
    hostname: 'localhost'
    environment:
      GITLAB_OMNIBUS_CONFIG: |
        external_url 'http://localhost:80'
    ports:
      - '80:80'
      - '443:443'
      - '22:22'
    volumes:
      - '$GITLAB_HOME/config:/etc/gitlab'
      - '$GITLAB_HOME/logs:/var/log/gitlab'
      - '$GITLAB_HOME/data:/var/opt/gitlab'
    shm_size: '256m'
```

#### Error starting userland proxy: listen tcp4 0.0.0.0:`xxx`: bind: address already in use. が出た場合
ポート番号`xxx`が既に使用されている場合のエラーで`lsof -i -P | grep "LISTEN"`を実行して何に使用されているかを確認したら、当該サービスを停止 or 別のポート番号を割り当てる。
Hello World

# 学んだことを発信するためにいろいろ書いてみることに

## 経緯
先日参加した[インターン][INTERNSHIP]で主催者の方が、情報を自分で発信することが重要だとおっしゃっていたのでこのような形で情報を発信していくことにしました。


[INTERNSHIP]: https://quantum-study.connpass.com/event/253707/

## 発信しようと考えている内容
現在、大学院に所属しているため研究関連のことを発信しようと考えていました。
しかし、やっている内容が企業との共同研究なので流石にそれはよろしくないなぁと。


そこで、まずは研究のために勉強している組合せ最適化問題関連のことから発信していこうと考えています。(慣れてきたら他の内容も発信したい...)
【備忘録】Prettierで自動整形する

```shell:実行コマンド
yarn add prettier --dev --exact  
```

```json:.prettierrc
{
  "printWidth": 100,
  "tabWidth": 2,
  "bracketSpacing": false,
  "singleQuote": true,
  "jsxBracketSameLine": true,
  "trailingComma": "es5"
}
```
Setupで🍍Pinia.jsを使う

## 0.🍍 初めに

+ この記事は`Vue.js 3`を使うプロジェクトに基づいて作成しました。



## 1.🍍 インストール

まずはインストールです。  
[公式サイト](https://pinia.vuejs.org/introduction.html) 

```shell
yarn add pinia
# or with npm
npm install pinia
```



## 2.🍍 インポート

`main.js`または`main.ts`で🍍をインポートします。

```typescript
import { createPinia } from 'pinia'

app.use(createPinia())
```



## 3.🍍 Storeを作成

まずは`src`フォルダで`store`フォルダを新規作成、
`index.ts`または`index.js`ファイルを新規作成、この記事は`ts`を使っています。
`store`で二つのパターン（`Options API`と`Composition API`）があります、この記事はもちろん`Composition API`パターンの`store`を作ります。

```typescript
import { ref } from 'vue'
import { defineStore } from 'pinia'


export const useMainStore = defineStore('main', () => {
  // script setupの感じでstoreを書く
  // 値
  const count = ref<number>(1)
  // メソッド
  const increment = ():void => {
    count.value++
  }

  return { count, increment }
})

```



## 4.🍍 Storeを使う

`App.vue`で使う

```vue
<template>
  <div>
    count: {{ count }}
    <button @click="increment()">increment</button>
  </div>
</template>

<script lang="ts" setup>
import { storeToRefs } from 'pinia'
import { useMainStore } from '@/store/index'

// hooksの感じで使う
const useMainStore = useMainStore()
const { count, increment } = storeToRefs(useMainStore)

// vueファイルで直接的に値を更新することもできます
count.value = 0
</script>
```



## 5.🍍 感想

`Vue3`に対して、`Options API`よりやはり🍍`Composition API`のほうが使いやすいと思います。
FeedComment Trigger のテストクラス


元の質問 : [FeedComment Trigger Code Coverage Error](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000HEjo5SAD)


ここでのポイントはFeedItemのVisibilityフィールドですがデジタルエクスペリエンスが有効化していないと使えないようです。エラーになりました。


```
trigger FeedThis on FeedComment (after insert, after update) {
    
    List<Case> updates = new List<case>();
    List<id> userList = new List<ID>();
    Set<Id> feedItemList = new Set<id>();
    for(FeedComment fc: trigger.new){
        feedItemList.add(fc.FeedItemId);
        userList.add(fc.InsertedById);
    }
    Map<Id, FeedItem> feedMap = new Map<id, FeedItem>([select id,InsertedById,Visibility from feedItem where Id IN :feedItemList]);
    Map<Id, User> userMap = new Map<Id, User>([select id, usertype, name from user where ID IN :userList]);
    for(FeedComment fc: trigger.new){
        if (feedMap != null && feedMap.containsKey(fc.feedItemId) && fc.ParentId.getSObjectType() == Case.SObjectType) {
            updates.add(new Case(
                Id = fc.ParentId,
                Status = 'Open'
            ));
        }
        
    }
    if(updates != null && updates.size() > 0)
        update updates;
    
}
```

CaseとFeedCommentを参照関係にしようと思いましたができません。

Case --> FeedItem --> FeedComment という構成が必要みたいです。


テストクラス

```
@istest
public class FeedThis_test {

    
    @istest 
    public static void testfunc()     {          
        
        test.startTest();         
        Case ca = new Case();
        ca.Subject ='Test';
        insert ca;
        
        FeedItem fi = new FeedItem();
        fi.ParentId = ca.Id;
        fi.Body ='test';
        insert fi;
        
        FeedComment fc = new FeedComment();
        //fc.ParentId = ca.Id;
        fc.FeedItemId = fi.Id;
        fc.CommentBody ='Test comment';
        insert fc;
        
        List<Case> caList = [select Id,Status from Case where Id =: ca.Id];
        system.assertEquals(caList[0].Status, 'Open'); 
        
        test.stopTest();         
        
        
    } 
    
}
```

# オブジェクト

+ [feeditem](https://developer.salesforce.com/docs/atlas.ja-jp.object_reference.meta/object_reference/sforce_api_objects_feeditem.htm)
+ [feedcomment](https://developer.salesforce.com/docs/atlas.ja-jp.object_reference.meta/object_reference/sforce_api_objects_feedcomment.htm)
jQueryを使ってテーブルの行をドラッグ&ドロップで並び替え

# 背景
ユーザーにより自分が好きな順番でtableの表示データーを設定できるように
`jQuery UI`の`sortable`を使用してHTMLのtable項目の並び順設定を作ってみました。

# 結果
![sampleGIF.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2743372/53519a35-b14a-6b80-d2f2-5b0083447763.gif)

# 環境
* jQuery: `1.8.3`
* jQuery UI: `1.8.24`

# 今回試したブラウザ 
以下はテストしてみたブラウザのリストです。これ以外のブラウザにも対応できるかもしれません。
* Mozilla Firefox: `103.0.2`
* Chrome: `104.0.5112.79`
* Microsoft Edge: `104.0.1293.47`
* Safari: `15.6`

# ソースコード
## 並び替えたいHTMLのtableを用意する
```html:html
<table id="tblLocations" cellpadding="0" cellspacing="0" border="1">
    <tr>
        <th>ID </th>
        <th>色</th>
        <th>並び替え</th>
    </tr>
    <tr>
        <td>1</td>
        <td>Red</td>
        <td>1</td>
    </tr>
    <tr>
        <td>2</td>
        <td>Green</td>
        <td>2</td>
    </tr>
    <tr>
        <td>3</td>
        <td>Blue</td>
        <td>3</td>
    </tr>
    <tr>
        <td>4</td>
        <td>Yellow</td>
        <td>4</td>
    </tr>
    <tr>
        <td>5</td>
        <td>Purple</td>
        <td>5</td>
    </tr>
</table>
```
## jQueryとjQueryUIを読み込む
```html:html
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.24/jquery-ui.min.js"></script>
```
## jQuery UI Sortableプラグインの設定
```html:html
<script type="text/javascript">
    $(function () {
        $("#tblLocations").sortable({
            // 見出しである一番上の行以外をドラッグできるように設定
            items: 'tr:not(tr:first-child)',
            // マウスカーソルの形状を変える
            cursor: 'pointer',
            // ドラッグできる方向は縦方向のみなのでaxisに（y）を設定
            axis: 'y',
            // ドラッグされた行が明確に見えるようにstartイベントにselectedクラスを設定
            start: function (e, ui) {
                ui.item.addClass("selected");
            },
            // ドロップした行のselectedクラスを解除して並び替え列を更新
            stop: function (e, ui) {
                ui.item.removeClass("selected");
                $(this).find("tr").each(function (index) {
                    // index = 0は見出しの行ですから更新しない
                    if (index > 0) {
                        $(this).find("td").eq(2).html(index);
                    }
                });
            }
        });
    });
</script>
```
## デザインの為CSSを用意する
```html:html
<style type="text/css">
    table
    {
        border: 1px solid #ccc;
        border-collapse: collapse;
    }
    table th
    {
        background-color: #F7F7F7;
        color: #333;
        font-weight: bold;
    }
    table th, table td
    {
        width: 100px;
        padding: 5px;
        border: 1px solid #ccc;
    }
    .selected
    {
        background-color: #54C500;
        color: #fff;
    }
</style>
```
# 感想
ドラッグ&ドロップで並び替えの機能は難しいと思いましたが、実際にやってみるとjQuery UI Sortableプラグインは分かりやすくて想像より簡単でした。
# 参考
- [jQuery UIのSortableを使ってみる](https://cly7796.net/blog/javascript/try-the-sortable-of-jquery-ui/)
- [jQuery UI Sortable Widget](https://api.jqueryui.com/sortable/)
【SwiftUI】アプリ内でAppStoreを表示する

# はじめに
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">これの実装方法わかる方いますか？<br><br>アプリ内にAppStoreをモーダルで表示するって事がやりたいです <a href="https://t.co/OZxHDWLtPC">pic.twitter.com/OZxHDWLtPC</a></p>&mdash; SNQ (@SNQ2001) <a href="https://twitter.com/SNQ2001/status/1556592099990315008?ref_src=twsrc%5Etfw">August 8, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

TwitterのAppStoreポップアップが気になってツイートして見たところ、
親切な方が教えてくださいました！

SKStoreProductViewControllerのSwiftUIでの実装方法を紹介します。

# 実装方法
```swift
import SwiftUI
import StoreKit

struct ContentView: View {
    var body: some View {
        Button(action: {
            showStoreProduct()
        }) {
            Text("ストア")
        }
    }

    func showStoreProduct() {
        let parameters = [SKStoreProductParameterITunesItemIdentifier: "443904275"]
        let storeProductViewController = SKStoreProductViewController()
        storeProductViewController.loadProduct(withParameters: parameters) { status, error in
            if status {
                let viewController = UIApplication.shared.windows.first?.rootViewController
                viewController?.present(storeProductViewController, animated: true, completion: nil)
            } else {
                guard let error = error else { return }
                print(error.localizedDescription)
            }
        }
    }

}
```
:::note warn
**注意**
シュミレーターでは表示できません。
:::

|iPhone|iPad|
|:-:|:-:|
|![RPReplay_Final1660018800_AdobeExpress.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/822c98ac-a1ee-50f6-708d-d9a91e28d277.gif)|![RPReplay_Final1660018940_MP4_AdobeExpress.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/edc710da-c44f-ce03-f83a-3227d56deda0.gif)|

# おわり
SwiftUIで実装している方は少なかったのでこの記事が誰かの役に立てば嬉しいです。

もし、閉じたことを検知したい場合は`SKStoreProductViewControllerDelegate`を使う必要があるのでViewControllerにを生成してからSwiftUIのViewに変換する必要があります。
そのような場合は以下の記事が参考になります。

https://daisuke-t-jp.hatenablog.com/entry/2022/01/10/swiftui-skstoreproductviewcontroller-appstore
実行されないcronjobを作る

## 用途
- create job --fromでcronjobのときにcronjobをテンプレートのみとして使いたい
- job自体は手動実行させたい
- cronで実行してほしくない
- というような場合

## サンプル
- 決して訪れることがない、2/31に実行するようにする

```yaml
apiVersion: batch/v1
kind: CronJob
metadata:
  name: testcronjob
spec:
  schedule: "* * 31 2 *"
  jobTemplate:
```
STM32G031を使た、mbed-osでHALのLチカ(Keil Studio)


目的
最軽量化
オンラインのKeil Studioを使う

PA_11(5ピン)をLチカする。


![o_con642.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/de6fa371-c9f9-609c-500d-cc255a10ee29.jpeg)


![o_con643.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/0db26ffc-475a-360f-8fb5-c06f0687489a.jpeg)


![o_con644.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/fab0495a-eb78-1116-edab-895077c739dc.jpeg)



```c++


//K_HAL_PA_11_L_TI_KA_031_1

#include "mbed.h"

//DigitalOut myled(PA_11);

int main()
{

    __HAL_RCC_GPIOA_CLK_ENABLE();
    //__HAL_RCC_GPIOB_CLK_ENABLE();

    GPIO_InitTypeDef GPIO_InitStruct = {0};

    GPIO_InitStruct.Pin = GPIO_PIN_11;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    while(1) {

        HAL_GPIO_WritePin(GPIOA, GPIO_PIN_11, GPIO_PIN_SET);

        HAL_Delay(500);

        HAL_GPIO_WritePin(GPIOA, GPIO_PIN_11, GPIO_PIN_RESET);

        HAL_Delay(500);

    }//while
    
}//main

```
ffmpegはシェル変数の先頭文字を壊す！？

# 環境
- ffmpeg: V5.1, MacOSX: Darwin Kernel Version 21.6.0, bash: 5.1.16(1)

# 現象
- ffmpegでトリミングするために対象の複数ファイルを文字列として渡すと、なぜか変数の文字列の最初が壊れました．コードは適当ですが、こんな感じの現象です．

```bash
cat $f_log.ffmpeg               \
| while read -r f_input t_start f_dist; do
  if [ ! -f $f_input ]; then
    echo "No $f_input"  
  else
    ffmpeg -y -i $f_input -ss $t_start -t ３ -ac 1 $f_dist
  fi
done                                                      

No var/data/A.mp3
No r/data/B.mp3
...（最初の数文字が消えています）
```

# 対応策
- 子プロセス化することで回避できました．　

```bash
  ( echo "ffmpeg -y -i $f_input -ss $t_start -t 3 -ac 1 $f_dist" | sh -C )
```

なぜ、ffmpegは変数を変えてしまうのか理由は知りませんが（バグ？）、もし、他人様ツールでシェル変数が意図せず変わってしまうことがありましたら、子プロセス化することご検討くださいませ．

どなたの役にたちましたら幸いです
Githubトークン更新後の対応方法

対応方法をいつも忘れるのでメモ。

## 環境
macOS Monterey 12.3.1

## エラー内容
Githubトークンの期限が切れていたのでトークンを再生成した。
その後、`git push`すると認証エラーが出た。

```zsh:ターミナル
$ git push origin HEAD
remote: Invalid username or password.
fatal: Authentication failed for 'https://github.com/username/repository.git/'
```
ここでパスワードを更新する方法を調べるが良い方法が出てこない。

## 対処方法
再度 `git push`する。
ユーザー名、パスワードを聞かれるので入力すれば更新できる。

```zsh:ターミナル
$ git push origin HEAD
Username for 'https://github.com': username
Password for 'https://username@github.com':
```
STM32G031を使た、mbed-osでHALのLチカ


x 過去ログを見よ

目的
最軽量化

PA_11(5ピン)をLチカする。


関連

https://qiita.com/caa45040/items/3686753c90e7e85ea7e4


HAL_PA_11_L_TI_KA_031_1


```c++



//HAL_PA_11_L_TI_KA_031_1

#include "mbed.h"

//DigitalOut myled(PA_11);

int main()
{

    __HAL_RCC_GPIOA_CLK_ENABLE();
    //__HAL_RCC_GPIOB_CLK_ENABLE();

    GPIO_InitTypeDef GPIO_InitStruct = {0};

    GPIO_InitStruct.Pin = GPIO_PIN_11;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    while(1) {

        HAL_GPIO_WritePin(GPIOA, GPIO_PIN_11, GPIO_PIN_SET);

        HAL_Delay(500);

        HAL_GPIO_WritePin(GPIOA, GPIO_PIN_11, GPIO_PIN_RESET);

        HAL_Delay(500);

    }//while
    
}//main




```


mbed_app.json


```


{
    "requires": ["bare-metal"]
}



```
1on1ミーティングのコツ「教えてもらう」「ありのまま」「傾聴」


ここでいう相手とは1on1ミーティングを受ける相手のことだ。
たとえばあなたの部下であったり、同僚であったりするかもしれない。

# 書籍

1on1ミーティングの本に次のように書かれており、自分のなんとなくの予感を確信に近づけてくれた。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89618/1aafd973-f45c-c273-043a-beebe6b9b9d2.png)

https://www.amazon.co.jp/dp/B09VKF9V5K/


# ポイント. 相手に相手のことを教えてもらう

1on1というとなんとなく、自分が相手に教えてあげなければいけない立場だというようなイメージがあった。
もちろん時と場合によっては有用なアドバイスだと思えるアドバイスをすることもある。

だけど最近はなんとなく、本当に相手の話を聞くことを主軸にしてみても良いのではないかと思えてきた。

相手のことは相手が一番よく知っている。

それと共に、たとえ直接相手自身のことではなくても、自分の知らないことはどんどん質問して、相手に教えてもらえば良い。たとえば技術的な事柄やチームのHOW TO的なことについてなど。

相手に何かを教えてもらうことで自分の見識も広がると共に、相手もアウトプットによって理解や現状を振り返ることが出来るのではないだろうか。もし相手に対してのアドバイスをするにしても、正しい現状把握が必要だ。

1on1ミーティングをテコに自分の見識を広げるなんて、なんだかずるいと無駄に感じてしまうが、それがまさに相手のためになるのではないだろうか。

人に教えることで人は最も学ぶ。
つまり何かを教えてもらうことは相手へのサービスだと言える。

相手に教えてもらえれば教えてもらうほど、相手は学習を深めることが出来るからだ。
この教えることによるメリットを自分が最大享受してしまってはいけない。1on1ミーティングはあくまで相手のためにあるものだからだ。

# ポイント. ありのままの自分

1on1ミーティングで最も気になることの一つが、自分の弱さを相手に見せてしまわないかということだ。

たとえば途中で言葉に詰まったり、相手の悩みに対して解答がすぐに見つからなかったりすると、まるで自分が役立たずのように感じられてくる。
本当に自分は1on1ミーティングをしても良いような人物なのだろうか？

だが自分からは自分以上のものは出せない。
いつでも即座に解答が見つかるとは限らないし、相手と一緒に解決策を考えなければいけない場合もある。

その弱さを隠さずに認めるべきだろうと思った。
もちろんなるべく余裕を持った話し方は心がけるが、自分を大きく見せたり、分からないことを分かるように話す必要はない。


# ポイント. 傾聴

これは言わずもがな、僕も意識して実践していることだ。

1秒1秒、相手の言葉尻を取らないように気をつけている。

たとえば相手と同時に話し始めてしまった時は、僕が相手の「話そうとする意図」をうまく汲み取れていないのだと分かって、そのたび反省している。

ミーティングはこの繰り返しである。




<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
ApacheのDDoS対策

WordPressで多くのサイトを運営しているのですが、どうも時々DDoS攻撃っぽいアクセスバーストが見られるので対策をすることにしました。

![スクリーンショット 2022-08-09 11.17.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1926542/98851556-c3b3-1ae7-e78a-d4ec7bffac71.png)

# アクセスログから怪しいアクセスを分析
上のグラフを見ると9:00代にCPU負荷が高くなっているのでその周辺のApacheアクセスログを見ると以下の怪しいアクセスを発見。

1. WordPressのxmlrpc.phpへのアクセスが頻繁に見られる
1. CONNECTメソッドアクセスが頻繁に見られる
1. 特定のIPアドレスから存在しないURL(自動生成したアドレスっぽいパターンがある)へのアクセスが頻繁に見られる

apacheの設定ファイル内でアクセスブロックするように設定して対応することにしました。
具体的にはsecurity.confファイルを作成し、その中で設定、httpd.confでsecurity.confを読み込むように設定しました。

# WordPressのxmlrpc.phpへのアクセスブロック
xmlrpc.phpはDDoSの温床にされやすいみたいですね。検索するとたくさん情報が出てきます。

https://rfs.jp/sb/wordpress/wp-lab/xmlrpc-php-ddos.html

ってことで以下の記載を追加。
```:security.conf
<Files xmlrpc.php>
  Order Allow,Deny
  Deny from all
</Files>
```

# CONNECTメソッドのブロック
HTTPメソッドの中の一つがCONNECTですが、これはプロキシサーバに対して、あるURLに接続したいと要求する場合に使うメソッドです。
そんなメソッドをうちのサーバに向けて送っている時点で怪しい。。。
ってことでGETとPOST以外はブロックする形にしました。

```:security.conf
  <LimitExcept GET POST>
    order deny,allow
    deny from all
  </LimitExcept>
```

# 特定IPアドレスからのアクセスブロック
こちらはある特定にIPアドレスから存在しないURLに大量のアクセスログが残っていました。
例えば、
* s_se.php
* s_e.php
* beence.php
* ups.php

などなど。。。

以下のサイトでIPアドレスを調べると完全に怪しいIPアドレスとしてデータベース登録されているので明確にブロック。

https://www.abuseipdb.com/

```:security.php
  <RequireAll>
    Require all granted
    Require not ip xxx.xxx.xxx.xxx
  </RequireAll>
```

# 最終的なsecurity.conf
最終的に以下のような記述になりました。
```:security.conf
<Files xmlrpc.php>
  Order Allow,Deny
  Deny from all
</Files>

<Directory /[wordpress設置ディレクトリ]>
  <LimitExcept GET POST>
    order deny,allow
    deny from all
  </LimitExcept>
  <RequireAll>
    Require all granted
    Require not ip xxx.xxx.xxx.xxx
  </RequireAll>
</Directory>
```

# まとめ
同一サーバ上で複数のWordPressを運営しているので.htaccessではなく、apacheのconfファイル内で設定しました。今後、別の怪しいアクセスがあったときはこのファイルに追記していこうと思います。
動画編集のジャンプカット（ジェットカット）をNode.jsで自動化する

![jumpcut-by-nodejs.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/289248/74996ec8-97f1-379d-5da2-d9619826c575.png)

詳細は以下の記事にまとめています。
↓
https://tsuyopon.xyz/2022/08/09/jumpcut-by-nodejs/


解説記事では、サンプルコードのどこを特に注目すると良いかなどもまとめているので、動画編集作業の自動化に興味がある方は、こちらのご確認いただけたらと思います^^


# この記事を読んでわかるようこと

今回の記事では主に以下の2つを話していきます。

1. 今回紹介するジャンプカットツールの効果
2. Node.jsを使った動画編集のジャンプカットツールの実装方法


# ジャンプカットの比較動画

- 自動カット前 : https://youtu.be/UAtewkSgSJI
- 自動カット後 : https://youtu.be/gKwhcJgIZlM

# サンプルコード

今回の実装コードは以下のGitHubレポジトリからご確認いただけます。

- https://github.com/tsuyopon-xyz/jetcut-tool
銀行キャッシュカードは多要素認証

# 4桁数字の暗証番号だけでは危険ではないのか？
銀行キャッシュカードは大事なモノですよね。それにしては、数字4桁のパスワード。簡単に破られそうなのでは？という質問をいただいたので、簡単に解説
# 多要素認証とは
多要素認証については多くの記事や情報がみつまると思いますので解説しませんが、ポイントだけ明記しておきます。
- 知識情報（パスワード、PINコードなど）
- 所持情報（携帯電話、ハードウェアトークンなど）
- 生体情報（指紋、静脈、声紋など）
# 銀行キャッシュカードは多要素認証
もうわかりますよね。銀行キャッシュカードは、それ自体が、所持情報であり、それに知識情報を組み合わせるので、そもそもが多要素認証なのです。銀行キャッシュカードが登場した際には、そんなことを意識していなかったでしょうけれど。
# だからオンライン銀行では、別の要素が必要
一般的な不満は、
> 普段、銀行の機械で操作する際は、キャッシュカードを挿入して、暗証番号入力だけ。簡単な作業なのに、なぜに、オンライン銀行では、同じ作業でできないの？

になるわけです。考えてみれば当たり前ですよね。オンライン銀行では、キャッシュカードという物理的な所持情報を確認するすべがありません。

# キャッシュカード紛失の際には速やかに銀行に連絡を
キャッシュカード紛失は多要素のひとつの紛失です。キャッシュカード無くして危険と思わない人はいないと思いますが、他人が多要素認証に成功する、つまりは所持情報と知識情報を不正に利用されないように、すみやかに、紛失した所持情報を無効にしてもらいましょう。
Vue Routerのqueryパラメーターの型には気をつけよう

Vue Routeのqueryパラメーターの型の扱いで少し詰まったのでメモ

## 起こった事象

```vue:list.vue
transitionDetail(customers) {
  this.$router.push({
     name: "detail",
     query: { type: customers.type },
   });
},
```

customers.typeの型はnumber

こういった処理でdetail画面に遷移する関数があるとする。

detailコンポーネントでこのqueryを受け取って条件分岐する処理を書いていた（実際の処理は省略してます）

```vue:detail.vue
switch ( this.$route.query.type ) {
   case 1:
     break;
   case 2:
     break;
   case 3:
     break;
   default:
}
```

ブラウザのリロードを行うと、type=1と指定しているのに、case1の処理が走らなかった

## 原因調査

デバッグをしていると、以下のことが分かった
・Vue Routerを用いてクライアント側で画面遷移しているときはthis.$router.query.typeの型はnumberで渡ってくる
・ブラウザで更新を行うと、this.$router.query.typeの型はstringで渡ってくる

これが原因で動かなかったので処理を以下に修正

```vue:detail.vue
switch ( Number(this.$route.query.type) ) {
   case 1:
     break;
   case 2:
     break;
   case 3:
     break;
   default:
}
```
うまく行った
突然 docker build できなくなった

# 概要
docker build を実行したら以下のようなエラーが出てビルドできなくなりました。以下、対処方法についてまとめていきます。
```
------
 > [internal] load metadata for docker.io/library/build:latest:
------
failed to solve with frontend dockerfile.v0: failed to create LLB definition: pull access denied, repository does not exist or may require authorization: server message: insufficient_scope: authorization failed
```

# 環境
* Windows11
* Docker Desktop 4.11.1 (84025)
* WSL2
* Ubuntu 20.04

# 結論
一番最後に書いた環境変数を設定するで解決しました。

# 対処方法
いくつか対処方法が提案されています。
## ~/.docker/config.json の編集
*credsStore* を **credStore** に変更するというのがありましたが、まったく効果がありませんでした。

## .token_seed の削除
こちらも効果はありませんでした。

## docker login する
こちらも効果はありませんでした。なお docker login すると ~/.docker/config.json から credsStore がなくなりました。

## Docker Engine の設定変更
### insecure-registries の設定
たとえば[しーまんブログ](https://shiimanblog.com/engineering/error-internal-load-metadata/)を参考にして、以下を追記して再起動したところ、Docker Desktop が Starting のまま起動しなくなりました。
```
"insecure-registries": ["docker.io"],
```

### buildKit の設定
buildKit を **false** にするといいというのが [Github Issue](https://github.com/docker/buildx/issues/476#issuecomment-921969529) にありましたが、こちらは試していません。ですが、おそらく同じ効果になるであろう後述の方法を採用しました。

## 環境変数の設定
同じく [Github Issue](https://github.com/docker/buildx/issues/476#issuecomment-1129682447) のコメントにある環境変数を設定しました。
```bash
export DOCKER_BUILDKIT=0
export COMPOSE_DOCKER_CLI_BUILD=0
```

どうやら私の場合はこれで直りました。これは永続化させておくために ~/.bashrc に記載しておくといいでしょう。