OmniAICreator/Qiita-1.07M huggingface dataset:
Unity HubがインストールしたAndroid SDKでAPI levelが不足する場合 (Windows)

# 課題
プロジェクトが要求するAPI levelの`platform-tools`がUnityのビルトインSDKに含まれていない場合、最終的に`UnityException: Required API level ~.`というエラーになります。

#### 補足
- 新しいUnityバージョンでは、API levelが不足する場合に表示されるダイアログのアップデートを選ぶことで、この課題が自動的に解決されます。
    - Unity 2021.3.14f1 (LTS)で確認
- Javaバージョンの不整合で、自動的な解決がエラーしてしまうことがあるようです。
    - これは、UnityバージョンにビルトインされているJavaが使われず、パスが通してあるJavaが使われてしまうことが原因と思われます。
    - 後述の[Javaの実行でエラーする場合](#Javaの実行でエラーする場合)を参照してください。

#### 補足2
##### 別の解決例1
- できる限り新しいバージョンのUnityエディタをインストールします。
- 以下のフォルダから対応レベルのフォルダをコピーします。
    - `C:\Program Files\Unity\Hub\Editor\<version>\Editor\Data\PlaybackEngines\AndroidPlayer\SDK\platforms`
    - `C:\Program Files\Unity\Hub\Editor\<version>\Editor\Data\PlaybackEngines\AndroidPlayer\SDK\build-tools`
##### 別の解決例2
- Android Studioをインストールします。
- SDKマネージャでSDKのパスを確認して、`Sdk\platforms`と`Sdk\build-tools`から、対応レベルのフォルダを以下へコピーします。
    - `C:\Program Files\Unity\Hub\Editor\<version>\Editor\Data\PlaybackEngines\AndroidPlayer\SDK\platforms`
    - `C:\Program Files\Unity\Hub\Editor\<version>\Editor\Data\PlaybackEngines\AndroidPlayer\SDK\build-tools`

# 解決例
## 環境
- Windows 10、Windows 11
- Unity 2020.3.16f1 (LTS)、Unity 2021.3.32f1 (LTS)
- Target API Level: Android 11.0 (API level 30)

## 対処
- Unityの`Preference`で、ビルトインSDKのインストール先を特定します。
    - `C:\Program Files\Unity\Hub\Editor\2021.3.32f1\Editor\Data\PlaybackEngines\AndroidPlayer\SDK`
- 管理者権限のあるコマンドプロンプトを開き、カレントディレクトリを`SDK`フォルダに移動して、`tools\bin\sdkmanager "platform-tools" "platforms;android-33"`を実行します。
    - インストール状況は、`tools\bin\sdkmanager --list`で確認できます。

### Javaの実行でエラーする場合
```:エラーの例
>tools\bin\sdkmanager --list
Exception in thread "main" java.lang.NoClassDefFoundError: javax/xml/bind/annotation/XmlSchema
        at com.android.repository.api.SchemaModule$SchemaModuleVersion.<init>(SchemaModule.java:156)
        at com.android.repository.api.SchemaModule.<init>(SchemaModule.java:75)
        at com.android.sdklib.repository.AndroidSdkHandler.<clinit>(AndroidSdkHandler.java:81)
        at com.android.sdklib.tool.sdkmanager.SdkManagerCli.main(SdkManagerCli.java:73)
        at com.android.sdklib.tool.sdkmanager.SdkManagerCli.main(SdkManagerCli.java:48)
Caused by: java.lang.ClassNotFoundException: javax.xml.bind.annotation.XmlSchema
        at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
        at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:526)
        ... 5 more
```

- 上記コマンドの実行でJavaがエラーする場合は、ビルトインJavaにパスを通します。
    - `path "C:\Program Files\Unity\Hub\Editor\2021.3.32f1\Editor\Data\PlaybackEngines\AndroidPlayer\OpenJdk\bin"`

### 参考
https://developer.android.com/studio/command-line/sdkmanager?hl=ja
【MySQL】JSON配列の中で、パラメータに一致する内容が1つ以上有るか判定する

## やりたいこと
2つの`JSON`配列が有ったとき、両方に共通（重複）する要素が有れば`true`、無ければ`false`と判定します。

以下のような表現もできるかなと思います。

- 和集合が空じゃないか判定する
- `OR`を取る
- 配列に対して`in`句で検索する

## やり方
`JSON_OVERLAPS`関数を使うことでできます。

https://dev.mysql.com/doc/refman/8.0/ja/json-search-functions.html#:~:text=JSON_OVERLAPS(json_doc1%2C%20json_doc2)

以下は公式サイトに記載されている実行例です。

>
```bash
mysql> SELECT JSON_OVERLAPS("[1,3,5,7]", "[2,5,7]");
+---------------------------------------+
| JSON_OVERLAPS("[1,3,5,7]", "[2,5,7]") |
+---------------------------------------+
|                                     1 |
+---------------------------------------+
1 row in set (0.00 sec)
>
mysql> SELECT JSON_OVERLAPS("[1,3,5,7]", "[2,6,7]");
+---------------------------------------+
| JSON_OVERLAPS("[1,3,5,7]", "[2,6,7]") |
+---------------------------------------+
|                                     1 |
+---------------------------------------+
1 row in set (0.00 sec)
>
mysql> SELECT JSON_OVERLAPS("[1,3,5,7]", "[2,6,8]");
+---------------------------------------+
| JSON_OVERLAPS("[1,3,5,7]", "[2,6,8]") |
+---------------------------------------+
|                                     0 |
+---------------------------------------+
1 row in set (0.00 sec)
```

なお、この関数は`MySQL 8.0.17`以降でなければ利用できません。

### 実際に使う時にハマったこと
`SpringJdbc`などで生クエリを書く場面で、配列の片方をプリペアドステートメントにしてパラメータで渡したい場合、`JSON_ARRAY`関数を使う方がよいと思います。

```java
String query = "SELECT JSON_OVERLAPS('[1,3,5,7]', JSON_ARRAY(:arrayValues))";
SqlParameterSource param = MapSqlParameterSource("arrayValues", arrayValues);
```

理由は、以下のように`'[]'`で囲った書き方では、「`SQL`インジェクション対策でクォートで囲まれている中のパラメータは置き換えない」というようなルールに引っかかってしまうためです。

```java
String query = "SELECT JSON_OVERLAPS('[1,3,5,7]', '[:arrayValues]')";
```
Phoenix liveview v0.16.0での変更点

liveviewのバージョンがv0.16になり、いくつか重要な変更がありました。
詳細は下記リンクをご確認ください。

https://github.com/phoenixframework/phoenix_live_view/blob/master/CHANGELOG.md

# ~L -> ~H で変わるテンプレートの記述
これまではHTMLのテンプレートエンジンで"~L"sigilを使用可能でしたが、今後はsoft-deprecatedとなり、非推奨です。

### 値の差し込み
"~H"sigilでは、従来のようなコードの差し込みができなくなります。代わりに[]波括弧で囲います。

```HTML
<!-- this -->
<div id={@id}>
  ...
</div>

<!-- not this -->
<div id="<%= @id %>">
  ...
</div>
```

### function componentの導入
従来は

```elixir
use Phoenix.LiveView

# または

use Phoenix.LiveComponent
```

でliveviewを記述していましたが、今後は

```elixir
use Phoenix.Component
```

を使ってfunction componentを定義することもできます。

例えばstateless componentは以下のように記述します。

```elixir
defmodule MyComponent do
  use Phoenix.Component

  def btn(assigns) do
    ~H"""
    <button class="btn"><%= @text %></button>
    """
  end
end
```

テンプレートで上記のコンポーネントを使用する場合は、以下のように記述します。

```HTML
<MyComponent.btn text="Save">
```

### formの書き方
```HTML
<!-- this -->
~H"""
<.form let={f} for={@changeset} url="#">
  <%= input f, :foo %>
</.form>
"""

<!-- not this -->
~L"""
<%= f = form_for @changeset, "#" %>
  <%= input f, :foo %>
</form>
"""
```
  
  
  

従来の記述方法も今は使用可能ではありますが。将来的にはエラーとなります。
他にも変更点がありますので、changelogをご確認ください。
また近々Phoenixのバージョンがv.16に変更となりますので、そちらもご注意ください。
cloud functionsの関数トリガーで非同期処理 async/awaitを使う

#はじめに
cloud functionsでドキュメントの数をカウントする処理があるのですが、、たまに回数がズレてたり間違ったり、正常に動作していない時があります:sweat_smile:

https://qiita.com/kokogento/items/e4bc6eac6b8501ebcab7

どこかしらで処理が終わっているのか、何かしらのエラーがたまに発生しているのか、具体的な理由はわかりませんが、**とりあえず非同期にしてみることにしました**


#ドキュメントの数をカウントするFunctionで、async/awaitを使う
ただ、cloud functionsの[関数トリガー](https://firebase.google.com/docs/functions/firestore-events?hl=ja#function_triggers)（onWriteとか）で`async/await`を使う場合、どうやって書けばいいのか分からず検索しまくりました。。。

https://firebase.google.com/docs/functions/terminate-functions?hl=ja

https://github.com/firebase/functions-samples/tree/main/child-count

👆公式のサンプルを参考に実装しました！



```typescript:index.ts
import * as functions from 'firebase-functions';
import * as admin from 'firebase-admin';
admin.initializeApp();
const db = admin.firestore();

exports.countEvents = functions.region('asia-northeast1').firestore
  .document('users/{userId}/events/{eventId}')
  .onWrite(async (change, context) => {

    try {
      const userId = context.params.userId;
      const FieldValue = admin.firestore.FieldValue;
      const countsRef = db.collection('users').doc(userId);    

      if (!change.before.exists) {
        // 登録時に件数をインクリメント
        await countsRef.update({ eventCount: FieldValue.increment(1) });
        return
      } else if (change.before.exists && !change.after.exists) {
        // 削除時に件数をデクリメント
        await countsRef.update({ eventCount: FieldValue.increment(-1) });
        return
      }
        return null;
    } catch (error) {
        console.error(`Fatal error ${error}`);
        return null;
      }
  });
```

`async`は`onWrite`のカッコに、`await`はその後のドキュメントをカウントする処理のところで使用。

async/awaitの使い方に関する詳細は下記を参考に！

https://qiita.com/niusounds/items/37c1f9b021b62194e077
python 時刻変換対応図 now↔datetime↔文字列↔unixtime

#対応図

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104578/21bb851a-7182-6e92-cce1-3c58e798718a.png)


#①datetime.datetime.now()　
現在時刻→datetimeオブジェクト

```python
>>> import datetime
>>> datetimeオブジェクト = datetime.datetime.now()
>>> print(datetimeオブジェクト)
#2021-01-01 15:34:47.893841
>>> print(type(datetimeオブジェクト))
#<class 'datetime.datetime'>
```

#②datetime.datetime.fromtimestamp()
unixtime→datetimeオブジェクト

```python
>>> import datetime
>>> 時刻INTオブジェクト = 1609426800 #2021-01-01 00:00:00 は、Unixtimeの 1609426800です
>>> print(type(時刻INTオブジェクト))
#<class 'int'>
>>> 時刻datetimeオブジェクト = datetime.datetime.fromtimestamp(時刻INTオブジェクト)
>>> print(時刻datetimeオブジェクト)
#2021-01-01 00:00:00
>>> print(type(時刻datetimeオブジェクト))
#<class 'datetime.datetime'>
```

#③int(datetime.datetime.timestamp())
datetimeオブジェクト→unixtime

```python
import datetime
現在時刻datetimeオブジェクト = datetime.datetime.now()
現在時刻INTオブジェクト = int(datetime.datetime.timestamp(現在時刻datetimeオブジェクト))
print(現在時刻datetimeオブジェクト)
#2021-01-01 00:00:00
print(type(現在時刻datetimeオブジェクト))
#<class 'datetime.datetime'>
print(現在時刻INTオブジェクト)
#1609426800
print(type(現在時刻INTオブジェクト))
#<class 'int'>
```

#④datetime.timedelta()
datetimeオブジェクト→時間差datetimeオブジェクト

```python
>>> import datetime
>>> 現在時刻datetimeオブジェクト = datetime.datetime.now()
>>> print(現在時刻datetimeオブジェクト)
#2021-01-01 00:00:00.000000
>>> 一時間後時刻datetimeオブジェクト = 現在時刻datetimeオブジェクト + datetime.timedelta(hours=1)
>>> print(一時間後時刻datetimeオブジェクト)
#2021-01-01 01:00:00.000000
>>> print(type(一時間後時刻datetimeオブジェクト))
#<class 'datetime.datetime'>

```

#⑤datetime.datetime.strptime()
日付文字列→datetimeオブジェクト

```python
>>> import datetime
>>> 日付文字列オブジェクト = "2020-01-01_00:00:00"
>>> print(type(日付文字列オブジェクト))
#<class 'str'>
>>> 時刻datetimeオブジェクト = datetime.datetime.strptime(日付文字列オブジェクト,'%Y-%m-%d_%H:%M:%S')
>>> print(時刻datetimeオブジェクト)
#2020-01-01 00:00:00
>>> print(type(時刻datetimeオブジェクト))
#<class 'datetime.datetime'>
```

#⑥datetime.datetime.strftime()
datetimeオブジェクト→日付文字列


```python
>>> import datetime
>>> 現在時刻datetimeオブジェクト = datetime.datetime.now()
>>> print(type(現在時刻datetimeオブジェクト))
#<class 'datetime.datetime'>
>>> 日付文字列オブジェクト = 現在時刻datetimeオブジェクト.strftime('%Y年%m月%d日%H時%M分%S秒')
>>> print(日付文字列オブジェクト)
#2021年01月01日00時00分00秒
>>> print(type(日付文字列オブジェクト))
#<class 'str'>

```

#参考サイト
[Unixtime相互変換ツール](https://tool.konisimple.net/date/unixtime)

#コメント
いつも　何回もググらなければならなかったので早見表を作成した。
RailsからLDAPSでActiveDirectryのユーザパスワード変更

エンタメ系企業の社内もろもろを担当しているakibinです。

最近、我が息子（4）はKroiというバンドの[balmy life](https://www.youtube.com/watch?v=oaBD-FpzArU)という曲にハマってます。かけてくれとせがむせがむ。今度彼のお気に入りプレイリストでも作ってあげよ。

# やったこと
ドメイン参加していない状況で、ActiveDirectryのユーザパスワードをユーザが変更できるアプリをRailsで作成する必要がありました。
基本ドメイン参加してればパスワード変更できるので、あんまりないケースなのかと思いますが、そのあまりないケースが発生したので…

今回はRubyからLDAPでディレクトリサービスを操作できる[net-ldap](https://rubygems.org/gems/net-ldap/versions/0.15.0?locale=ja)というgemを使用しました。

# ADのパスワード変更するための条件
なにやら色々調べていたら、ADの場合はOpen-LDAPとかと違って、LDAPで色々操作するには条件があるようで。
[https://blog.cles.jp/item/10893](https://blog.cles.jp/item/10893)

* サーバへの接続は LDAPS でないといけない
* ~~bind に使うユーザーは Administrator でないといけない（Domain Users では自分のパスワードの更新も不可）~~
* アップデートにはダブルクオートで囲った平文を UTF-16LE でエンコードする必要がある
* アップデートに使うパスワードはAD　のパスワードポリシーに適合していないといけない

全体的にごもっともな内容なのですが、bind に使うユーザーは Administrator でないといけないだけは解せない。
コードにAdministratorのID/PWを記述したくないなと[Microsoft TeckNetで質問してみた](https://social.technet.microsoft.com/Forums/ja-JP/77c97e1b-67a4-4cc2-b295-a0473c9e405e/activedirectory12398125181254012470123981249712473125271254012489124?forum=activedirectoryja)ところ、そんなことはありませんでした。**該当ユーザにパスワードリセット権限をつければOK**です。

# 事前準備
#### ADの該当ユーザにパスワードリセット権限を付ける
[Microsoft TeckNetで質問してみた](https://social.technet.microsoft.com/Forums/ja-JP/77c97e1b-67a4-4cc2-b295-a0473c9e405e/activedirectory12398125181254012470123981249712473125271254012489124?forum=activedirectoryja) を参照して事前にADで設定してください。

#### net-ldapのインストール
Gemfileにnet-ldapを追記してインストールします。

```ruby:Gemfile
gem 'net-ldap'
```

```bash
bundle install
```

#### ADのサーバ証明書をRailsのサーバ環境にインストール
LDAPSをするためにADのサーバ証明書をRailsが構築されているサーバにインストールしてください。

# そしてコードはこんな感じ

* ADのドメイン<br>`hoge.co.jp`
* ADでユーザが作成されているOU　<br>`users`

```ruby
require "net/ldap"

@user = user_id #該当ユーザのID
@oldPassword = old_password #該当ユーザの現在のパスワード
@newPassword = new_password #該当ユーザの新しいパスワード

@ldap = Net::LDAP.new :host => "hoge.co.jp",
                          :port => 636, # LDAPSで接続
                          :encryption => :simple_tls,
                          :auth => {
                            :method => :simple,
                            :username => "cn=#{@user},ou=users,dc=hoge,dc=co,dc=jp",
                            :password => @oldPassword
                          }
    
# ADへ接続（bind）
@ldap.bind

dn = "cn=#{@user},ou=users,dc=hoge,dc=co,dc=jp",

# UTF-16LEでエンコード
def encode_passwd(string)
  newstring = ""
  string = "\"" + string + "\""
  string.split("").each do |c|
      newstring = "#{newstring}#{c}\000"
    end
  return newstring
end
      
newUniPW = encode_passwd(@newPassword)

# ユーザに行う操作を指定：パスワード（unicodePwd）をReplace
opts = [
  [ :replace, :unicodePwd, newUniPW ]
]

# 更新を実行
@ldap.modify(:dn => dn, :operations => opts)
```

このコードを使って、ADユーザのパスワード変更できました！

# こちらもチェックお願いします！
[Twitterアカウント](https://twitter.com/akibinmusic)
[Youtubeチャンネル](https://www.youtube.com/channel/UC-JOpwEnJn3gCrUA4NdCYgg)
Wi-Fi WPSの今

## 注意
最近のデバイスからWPSが消えているなと感じた所から調べてみた話です。
WPS自体の技術的な内容は少ないです。証跡不十分な点もあるのでご注意ください。

## WPS概要
デバイス(スマホなど)を無線ルーターに簡単に接続する為の規格。
極簡単に言えば、デバイスと無線ルーターのボタンを押す(※)だけで接続ができ、
SSIDやパスワードの入力を省略できる。互換性のある規格としてAOSS等がある。

**簡単に接続できるが故、不正な接続が確立されるなど、セキュリティ面に懸念がある。**
やはり、これが消えている原因か。

※ PUSHボタン方式。他にもPINコードを入力する方式もあるが、やはりセキュリティ面では弱い

## セキュリティ拡張は？
PMFなど追加セキュリティで少しは安全性は上げられるか？
と思い、無線ルーターのPMFを必須にした所、手近の端末ではWPSで接続できなくなった。

古い端末はPMFに対応していないので必須にすると接続できない。
そしてPMFに対応しているような端末は既にWPSを搭載していない様子。(Android端末など)

調査が不十分で未確定だが、OSS wpa_supplicantもPMF+WPSには対応していなさそうである。


参考：PMF

https://qiita.com/nhadachi/items/8f23dd3a4163ebf71450
メカナムホールを使った全方向移動ロボットをGazeboでシミュレーションしてみた

## 概要

ROSのGazeboシミュレーション上でメカナムホイールを使用した全方向移動ロボットをどうさせたい場合、簡易的な方法で`ros_planner_move`を使用する方法を今まで使っていたが、路面の影響や4軸モータの制御を確認したかったので、メカナムホイールを再現してみた

## 動作環境

- Ubuntu 18.04 LTS
- ROS (melodic)

## やり方

メカナムホイールについている各ローラをそれぞれ回転ジョイントで接続し、フリー回転するようにする。それだけでなんとなく動いた


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171097/28a0da3e-8b35-36f8-7a8e-dd1a1395991e.png)

![](https://user-images.githubusercontent.com/26181834/129763254-aa74e592-cdbe-4859-87d8-fd93592cd40e.png)

  ![mecanum_robot](https://user-images.githubusercontent.com/26181834/129851426-2e3568eb-f340-41ce-9c6a-84ec9c883126.gif)


## 使い方

リポジトリをクローンする

```bash
$ git clone https://github.com/DaiGuard/fuji_mecanum
```


メカナムホイールを使用するロボットモデルに`mecanum_wheel_macro.xacro`をインクルードして、`xacro:mecanum_wheel`マクロを使用してロボットに追加する

```xml
<?xml version="1.0" ?>
<robot name="mecanum_wheel_robot" xmlns:xacro="http://ros.org/wiki/xacro">

  ....

  <!-- include mecanum_wheel macro -->
  <xacro:include filename="$(find fuji_mecanum)/urdf/mecanum_wheel_macro.xacro" />
  <!-- load macro -->
  <!-- name: link name -> ${name}_wheel_link -->
  <!-- side: mecanum wheel direct 1: right, -1: left -->
  <xacro:mecanum_wheel name="right" side="1" />
  <xacro:mecanum_wheel name="left" side="1" />

  <joint name="right_joint_name" type="fixed">    
    <parent link="parent" />
    <child link="right_wheel_link" />
  </joint>

  <joint name="left_joint_name" type="fixed">    
    <parent link="parent" />
    <child link="left_wheel_link" />
  </joint>

  ....

</robot>
```
loaderror

##発生したエラー
load error
Unable to autoload constant CommentLikesController

#対処
クラス名のcが小文字になっていた

comment_likes_controller

class CommentLikescontroller < ApplicationController
↓
class CommentLikesController < ApplicationController

#参考
https://qiita.com/shunta9922/questions/8be632309bd67c6377d1#answer-fed3da678fb2be85f48c
LeetCode "47. Permutations II"をPythonで解いた話

前回の記事とほぼ同じ内容です。

#問題

>
>数の集まりnumsが与えられています。これには、同じ数字が複数入っていることがありえます。
>すべてのありうる順列を、1つの順列につき1つずつ答えてください。
>順番は気にしません。
>

こちらから挑戦できます。
https://leetcode.com/problems/permutations-ii/

#方針

今回も、ライブラリーを使ってはいけないという注意書きがないので、itertoolsを使います。

```py

from itertools import permutations

class Solution:
    def permuteUnique(self, nums: List[int]) -> List[List[int]]:
        #重複を防ぐために一度setにします。
        #問題は答えとしてlistを求めていますが、setのままでも通ります。
        return  set(permutations(nums, len(nums)))

```
結果：**Success**
![successWithLibrary.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1851956/7af07442-7995-287e-d049-860a6a077e00.png)
やったぜ！

#おまけ：permutationsを使わずに解けるか？
方針：
前回とほぼ同じ方針でできそうです。
ただし、要素の順列を作るのではなく、先にindexの順列を作ります。
そのindexの順列に従って、要素を改めて並べます。

```py
import queue

class Solution:
    def permuteUnique(self, nums: List[int]) -> List[List[int]]:
        len_nums = len(nums)

        wake = set()

        q = queue.Queue()

        indices = [i for i in range(len_nums)]
        set_indices = set(indices)

        ans_indices = set()

        for index in indices:
            q.put(tuple([index]))

        while not q.empty():
            cur = q.get()

            if len(cur) == len_nums:
                ans_indices.add(cur)
                continue

            uncharted = set_indices - set(cur)

            for index in uncharted:
                candidate = cur + tuple([index])

                if candidate not in wake:
                    q.put(candidate)
                    wake.add(candidate)

        ans_nums = set()

        for item in ans_indices:
            ans_nums.add(tuple(nums[i] for i in item))

        return ans_nums
```

結果:**Succes**
![successWithoutLibrary.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1851956/161d31c4-f181-41ba-c342-864e0d03dac5.png)
やったぜ！
Wi-Fi PMFでハマる - スマホがルーターにつながらない -

## PMFとは
・無線LAN(Wi-Fi)のセキュリティ機能の1種である。
・PMF (Protected Management Frames)の略。
・MFP (Management Frame Protection) == 管理フレーム保護機能で使用される、
　保護された管理フレームがPMF。
・IEEEの規格としては802.11wである。
・無線セキュリティ規格WPA3では、PMFが必須となっている。
・"暗号強化"という設定名称のケースもある。


## 接続可否

以下3つの設定があり、無線ルーター側と接続端末双方の設定で接続可否が決まる。
**古い端末だと対応していない(==無効)為、無線ルーターの設定を必須にすると接続できなくなる。**

1. 無効(Disable)  PMF使わない
2. 有効(Enable)   PMF使えたら使う
3. 必須(Required) PMF使えないと通信しない

表にすると以下のようになる。


||無効|有効|必須|
|---|---|---|---|
|無効|〇|〇|✕|
|有効|〇|〇|〇|
|必須|✕|〇|〇|
古川研究室 ~Workout calendar~ の紹介

九州工業大学の古川研究室です．
本研究室ではアルゴリズム開発・脳型知能に関する研究をしています．

[2020年](https://qiita.com/advent-calendar/2020/flab)に引き続き，今年も日頃の研究で培った技術のアウトプット先として
Advent Calendar を実施したいと思います．
今年は世にも珍しい"**夏のアドベントカレンダー**" も開催します！
10日間の短い期間ではありますが，夏休みの自由研究の感覚で1人1記事のアウトプットをしていきます！

なお，学生が学習の一環として執筆したものですので内容が曖昧であったり表現が多少異なったりする場合がございます．
解説記事というより，勉強のメモとして捉えていただけますと幸いです．
それでもよろしければ，是非読んでいってください！

また，研究室のホームページと PR 動画を最近刷新しましたので，
こちらも良かったらご覧になってください！

http://www.brain.kyutech.ac.jp/~furukawa/

***

01日目：イントロダクション（@flab5420）
02日目：（未定）
03日目：（未定）
04日目：[matplotlib で描画する度に色をグラデーション的に変える（2次元 ver もあるよ！）](https://qiita.com/tanacchi/items/249fcecbbb65d1f56ec8)（@tanacchi）
05日目：[python3での標準入力メモ](https://qiita.com/hirowatari-s/items/e6d3dc461ae63e1f25c5)（[@hirowatari-s](https://qiita.com/hirowatari-s)）
06日目：[M1　MACでTensorflowを使おう！](https://qiita.com/nahoando/items/3f9af359bc7b77585653)（@nahoando）
07日目：[和歌の Bag of Words作成 (python)](https://zenn.dev/kpasso4cm/articles/af7146f60b8d15)（@kpasso1015）
08日目：[AttentionとKernel Smoothingの対応関係についてのメモ](https://qiita.com/ae14watanabe/items/33d0541df0ff9d6577a8)（@ae14watanabe）
09日目：ガウス過程回帰を学ぶ上で初学者がつまづきそうな点をまとめる（タイトル未定）（@takuro-Ishida）
10日目：（未定）
VSCodeにてBlazorをデバッグする方法

## Visual Studio Code にて、Blazorをデバッグ実行する方法
※ 最終的にはdebugできるようになったのですが、
　 色々と試したため、最終的に何が良かったのか不明です。
　 自分と同じ状態になっている方のためにメモとして記載しておきます。

#### 前提条件など
- 環境：Windows10
- 使用プロジェクト  
   https://qiita.com/njc50032/items/c9b4c366e72d14684eb0  
の手順で作成

## 必要なものをinstall
Microsoft.AspNetCore.Razor.VSCode.BlazorWasmDebuggingExtension
https://marketplace.visualstudio.com/items?itemName=ms-dotnettools.blazorwasm-companion

JavaScript Debugger (Nightly)
https://marketplace.visualstudio.com/items?itemName=ms-vscode.js-debug-nightly

を、拡張機能からインストールする

## 必要な設定を行う
launchSettings.json に、
"inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}"
を追加する。
※2021/08/11 現在、dotnetコマンドで新規作成した場合は、
　すでに上記が設定されているようです。

作成後のファイルイメージ

    {
      "iisSettings": {
        "windowsAuthentication": false,
        "anonymousAuthentication": true,
        "iisExpress": {
          "applicationUrl": "http://localhost:5216",
          "sslPort": 44335
        }
      },
      "profiles": {
        "IIS Express": {
          "commandName": "IISExpress",
          "launchBrowser": true,
          "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}",
          "environmentVariables": {
            "ASPNETCORE_ENVIRONMENT": "Development"
          }
        },
        "TestBlazorPj": {
          "commandName": "Project",
          "dotnetRunMessages": "true",
          "launchBrowser": true,
          "applicationUrl": "https://localhost:5001;http://localhost:5000",
          "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}",
          "environmentVariables": {
            "ASPNETCORE_ENVIRONMENT": "Development"
          }
        }
      }
    }

## 一度debug実行を行う
F5押下か、「実行とデバッグ」から実行する

すると、ブラウザが自動で起動し、サイトが表示されるので、
ここで、shift + alt + D を押下

[ブラウザがリモートデバッグ可能な場合]
　　→　別タブにデバッグ用画面が表示される

[ブラウザがリモートデバッグ不可の場合]
　　→ リモートデバッグを有効状態にしてブラウザを起動するコマンドラインが表示されるので、
　　　Win + Rでファイル名を指定して実行を開き、そこにコピペして、ブラウザを起動
　　　　→ 再度、shift + alt + D 押下で、デバッグ用タブが表示されう。

## ただし自コンピューターでは、 debugできませんでした。。。
上記までを試せば、debug可能と、各サイトに記載があるのですが、
例：https://docs.microsoft.com/ja-jp/aspnet/core/blazor/debug?view=aspnetcore-5.0&tabs=visual-studio
自分のところではどうにもVSCode上のブレークポイントで止めることもできませんし、
debug用のタブに、ブレークポイントを張るfileの表示もされませんでした。

## 仕切直して以下をするとdebug出来ました。

プロジェクトの作成を、
dotnet new brazorwasm
で行って実行していたのですが、
試しに、
dotnet new brazorserver
で作成し実行したところ、
ブラウザでshift + alt + Dをしない状態でも、
VSCode上のブレークポイントで止まるようになってくれました。。。

何が原因なのかよくわかりません。
何かわかり次第、追記させていただこうと思います。
Google Bigqueryでのテーブル作成方法(CSVインポート） 2021/8月以降版


2021年8月ごろからGoogle bigqeuryのUI変更が行われたので、CSVインポート手順のアップデート版を投稿しておきます。

UI変更前のものは[こちら](https://qiita.com/ymto/items/d818899850801bb591f6)

## やりたい事
・CSVファイルをbigqueryに単純インポートする

#####1. bigqueryのコンソールからテーブルを作成したいプロジェクトとDBを選択して、CREATE TABLEを選択する。 
![bigqeuryのCSVインポート手順1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242038/4fe41ab3-15ff-8b49-1a1f-b3b57c864581.png)

#####2. テーブル作成用コンソールが出現する為、以下のようにアップロードしたいファイル名と拡張子、bigquery上に作成するテーブル名を指定する 
![bigqeuryのCSVインポート手順2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242038/a7cb9e6a-5809-45e0-0183-56ae19619a77.png)
![bigqeuryのCSVインポート手順3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242038/0eb0f410-8e1d-e747-39cc-bc26309e4180.png)

**同じテーブルに追加で別のCSVをインポートする場合は、以下のように、Append to tableを指定する**
![bigqeuryのCSVインポート手順4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242038/b7488e7e-a3f0-a3e6-069c-e0885dd7a1d9.png)


#####3. エラーが出なければ、テーブルが作成されて取り込まれたのがわかる

##注意点
取込対象のCSVファイルの文字コードは必ず **UTF-8** にしておく必要がある。
→これを怠るとエラーになったり、取り込んだ文字が文字化けして使い物にならなくなる事が多い。

CSVのヘッダーはローマ字にしておく
→取り込んだテーブルのカラムになるため、ローマ字以外だと文字化けして意味不明になる。

[文字コード変換方法はここら辺を参考に](https://uxmilk.jp/47955)
プログラミングとインフラエンジニアは非なるもの

いま職場のコード整理のために、GITLABを導入しようとしている。

しかしながら、LINUXの知識や、NGINX、PROXYサーバーなど
いろんな用語が出てきて、こんがらがっている。

プログラミングの知識と、いわゆる環境設定のインフラエンジニアというものは、
正直言って、まったく異なる知識が必要だ。

これまでは、漠然とＩＴエンジニアというものを、プログラミングができる人という
漠然としたイメージで進んできたのであるが、
このイメージは、情報システムの仕事に関わるほど、
段々とプログラマーとは違う職種だと、思うようになってきた。

例えば、GITLAB一つを導入するのにも、
ＡＷＳのＥＣ２でLINUXサーバーを立ち上げて、
そこにDocker composeでGITLABを
ちょこっと入れるだけでも、プログラミングとはかけ離れた、
いわゆるインフラ設定のすべてを理解しなければいけない。

そのたびに、エラーメッセージが出で、解決方法をネットで調べての繰り返しである。
集中力があれば、片っ端から調べて、突破口を調べまくるのであるが、
やはり、これは精神的にきつい・・・
（自分のソースコードが動かないとかで、自分自身と向き合うわけではなく、
単に知らないからできないだけという状態においては、知識を持った人に任せるか？聞くか？
というのが、はっきり言えば早いのである。）

なので、このところインフラ構築に対する、向き合い方というものは、
プログラミングのスキルとは、まったく別物と考えるようになった。
（もちろんのことであるが、ＩＴエンジニアたるもの、
どっちもできて一人前なのかもしれないが、やはり面白いかどうかといえば、
タルイだけ・・・と言うのが自分なりの答えである。）

これからプログラミング教育や、ＤＸ人材育成なんて、
聞こえの良いキーワードで語られるＩＴスキルであるが、
実際のところなんて、まだまだカッタルイ仕事である。

将来を担う、子供達には申し訳ないが、こんな仕事に就くぐらいなら、
オリンピックを目指すアスリートの方が、夢があって面白い職業だと思う。
XORの基底をめっちゃ楽に求める方法があるらしい！！！？？？

こんにちは、Soohです。
競プロでたまに出てくる掃き出し法関連のお話でxor掃き出しというのがあります。
Gauss-Jordanをxorで書いても良いのですが、もっとお手頃な方法があると話題になりました。

コードだけを見ていてもよく分からず、どうしてこれで良いのかを説明している資料なども見当たらなかったので、解説を書くことにしました。
前提として、「xorにおける基底とは何か」を知っていることとします。
知らないよって方は[こちら](https://drken1215.hatenablog.com/entry/2019/03/20/202800)で勉強すると良いです。

#実装
数列 $\\{A_n\\}$ から xor の基底を取り出す操作です。

```C++
vector<int> base;
for(int v : A){
  for(int e : base){
    v = min(v, v ^ e);
  }
  if(v > 0) base.push_back(v);
}    
```
はい、この時点で何が起きているか分かった天才の方はブラウザバックして頂いて結構です。
僕には少し難しかったようなので、細かく見ていくことにします。

#どうして...
ここで先に主張をしたいと思います。
上のコードにおける 6 行目時点での $v$ を $v'$と置きます。
任意の $ i $ について以下が成立する。
**「$v'$ が $i$ 個目の基底として追加されたとする。この最上位 bit が $d_i$ 桁目にあった時、$(i <\,) 
 \,j$ 番目に基底として追加されるものについては $d_i$ 桁目が必ず $ 0 $ になる。」**
言い換えると、以下の図のようになるということです。
![IMG_875DED2D0701-1.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960748/8b546ddb-bddd-37fd-2367-c26a62488034.jpeg)


これは帰納法によって証明できます。

baseのサイズが 0 の時、明らかに成立.

baseのサイズが k の時、各最上位bitが$\\{d_1, d_2, ..., d_{k}\\}$の順で base にあるとおく.
ただし、$ i \neq j \iff d_i \neq d_j$ とする.
今ある基底の分しか $ v \oplus e $ を取らないので、 $ 1 \le i \le k $ 回目のmin(v, v^e)が終わった時の $ v $ を $ v_i $ と書く.
また $i$ 回目の操作をする場合、取り出される基底が持つ最上位 bit は $ d_i $ であることに注意.
$v$ の最上位は $b_p $ 桁目だとする.


* $ b_p \ge min(\\{d_1, ..., d_{k}\\})$ の時

$i $ 回目の操作のについて
　　$v_{i - 1}$ の $ d_i $ 桁目に bit が立っていれば、$ v_i = v_{i - 1} \oplus e_i $ 
　　そうでなければ、 $v_i = v_{i - 1}$
従って、この操作を終えた直後は $v_i$ の $ d_i $ 桁目は $ 0 $ になっている. 
帰納法の仮定から、 この後の操作に用いる基底で $ d_i $ 桁目が立っているようなものは存在しないので、$ v_k $ の $ d_i $ 桁目まで $0$ のままである.
つまり $ v_k $ では、任意の $i$ について $ d_i $ 桁目に bit が立っておらず、これが基底に追加されたとしても条件を満たす.

* $ b_p < min(\\{d_1, ..., d_{k}\\})$ の時

今ある基底との xor をすると、値が大きくなってしまう.
従って、xor を取った値と交換するという操作は起きえず、このまま基底となる.
明らかに、任意の$ i $ について $v_k$ の $ d_i $ 桁目には bit が立っていない.
この時、$ v_k $ は条件を満たし、$ b_p $ を最上位bit として基底に加わる.

以上から先程の主張が正しいことが分かりました。


#基底を網羅できているか？ (8/18 20:00 追記)
これは背理法によって示すことができます。
全ての $A_i$ について処理を終えた時の base を考えます。
base に入らなかった $ A_i$ のうち、ある $i$ が存在して $A_i$ が任意の $base_j$ と線形独立であると仮定します。
base に入らなかったということは、コードの 6 行目の時点で $ v = 0 $ だったことを意味するので、これは矛盾です。

#まとめ
ここまで来たらもうお分かりですよね？
基底を並び替えると、標準形と似た感じの行列になっています。
線型独立(?)なものを集めるだけだった場合には、この操作だけで十分なことが分かります。
とても綺麗なアルゴリズムですね。
皆さんも楽しい xor 掃き出し生活をお送りください！
VSCodeでLuaLaTexビルドの環境を整える

これは、下記の記事の続きとなる記事です。（とはいってもこの記事だけで完結はしているので、VSCodeでLuaLaTeXを使いたい人はこの記事だけでも行けると思います）

https://qiita.com/SuzuTomo2001/items/07c3ba6ff9f29ebf6282

# 前提条件

上記の記事でLuaLaTeXをインストールしてビルドできている状態になっていること。

# LaTeX Workshopのインストール

まずは、VSCode拡張の[LaTeX Workshop](https://marketplace.visualstudio.com/items?itemName=James-Yu.latex-workshop)をインストールします。

# `latexindent`パッケージのインストール

VSCode上で`.tex`ファイルを保存しようとすると`Can not find latexindent in PATH.`と右下の通知欄に出てきます。
いい感じにフォーマットしてくれるんでしょうか。`latexindent`パッケージをTeX Live Managerからインストールします。

# `settings.json`を弄る
ユーザの設定に以下の設定を追記します。
イメージとしては、`tools`の方で実行するコマンドとか引数を指定しておいて、`recipes`の方で実際に使用する`tools`を指定するって感じですね。
なんで`tools`と`recipes`両方が必要なのかというといろいろあるのでここでは割愛します。

```json
  "latex-workshop.latex.recipes": [
    {
      "name": "lualatex",
      "tools": ["lualatex"]
    }
  ],
  "latex-workshop.latex.tools": [
    {
      "name": "lualatex",
      "command": "lualatex",
      "args": [
        "--cmdx",
        "-file-line-error",
        "-synctex=1",
        "-interaction=nonstopmode",
        "-halt-on-error",
        "%DOC%"
      ],
      "env": {}
    }
  ]
```

# ビルド

[前回の記事](https://qiita.com/SuzuTomo2001/items/07c3ba6ff9f29ebf6282)で使用したコードを再利用します。

```latex
\documentclass{ltjsarticle}
\usepackage{luatexja} % ltjclasses, ltjsclasses を使うときはこの行不要
\begin{document}
\section{はじめてのLua\TeX-ja}
ちゃんと日本語が出るかな？
\subsection{出たかな？}
長い文章を入力するとちゃんと右端のところで折り返されるかな？
大丈夫そうな気がするけど．ちょっと不安だけど何事も挑戦だよね．
\end{document}
```

デフォルトでは保存すると勝手にビルドしてくれるみたいなので、保存しましょう。既にPDFファイルが生成されていると更新されたか見にくいので削除しておくと分かりやすいかも。

手動でビルドする際は`Ctrl + Alt + B`です。

そして便利なのがビューア。`Ctrl + Alt + V`でVSCode上に新しいタブが開き、PDFファイルの中身が見れます。`.tex`ファイルを変更して保存するとビューアも自動更新（ビルドにちょっと時間かかるけど）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255360/33b62579-39b6-1e00-2d8e-1f75fb0ae27b.png)

とりあえずVSCodeでの環境構築はこれで終わりです。
暇な人は下も見てってください。

# 引数解説

`latex-workshop.latex.tools`で指定した`lualatex`コマンドの引数`args`について少し解説します。

- `--cmdx`

ファイル名に日本語が含まれていても大丈夫なようにする。

- `-file-line-error`

エラーが起きたときに該当する行にジャンプする。

- `-synctex=1`

VSCodeのtexファイル上で`Ctrl + Alt + J`するとPDFの該当する箇所が見れようになる。
また、VSCodeのPDFプレビュー上で`Ctrl + クリック`するとtexファイルの該当する部分にカーソルが移るようになる。

- `-interaction=nonstopmode`

`lualatex`コマンドの実行中にエラーが起こってもプログラムが中断しないようになる。
VSCodeでのビルドはOUTPUTタブで行われるが、プログラムが中断するとVSCodeを再起動するしか手が無くなるので必須

- `-helt-on-error`

最初のエラーでプログラムが終了するようになる。

- `%DOC%`

開いているtexファイルのファイルパスを示す

# さいごに
これでVSCodeでLuaLaTeXを使う準備が整いました。さて。レポート書かないと💦

最初の方にも貼りましたが、この記事は[俺のPCにTeX Live fullスキームなんて入るはずがない](https://qiita.com/SuzuTomo2001/items/07c3ba6ff9f29ebf6282)の続きとして書きました。

リンク先の記事ではLuaLaTeXの環境構築に395MBという容量で成功しています！
TeX Live fullスキームだと約7.5GBもするのPCに入らないよぉって人は、この記事も見ていってくれるとありがたいです🙇
【Rails】ActiveAdmin エラー#You're trying to register 〜 対処方法

※備忘録です。

## ActiveAdminでユーザのコメントを管理したい！

利用環境
・ruby 2.7.3
・Rails 6.1.4

## 前提条件
gemの `activeadmin` はインストール済み
ユーザが投稿した内容： `post` テーブル
その `post` に対してコメント： `comment` テーブルを実装済み
`activeadmin`を使ってこの `comment` を管理したい

## エラー内容と流れ
`rails g active_admin:resource Comment` を実行
＞ `app/admin/comments.rb` ファイルを作成
上記ファイルに `permit_params :content` を追加
`rails s`　でサーバー起動

```
You're trying to register ActiveAdmin::Comment as Comment, 
but the existing ActiveAdmin::Resource config was built for Comment!
```
このようにエラーが出た。

## 解決方法
`ActiveAdmin` にすでに用意されている `comment`があるのに追加で `comment` ファイルを作成してしまっているため。
つまり同じ `comment` が２つ存在してしまっているエラーとなります。
ユーザー側のコメントを `comment` のままで
管理者側のコメントを `admin comment` に変更します。

```ruby:config/initializers/active_admin.rb
#  〜〜〜〜〜〜略〜〜〜〜〜〜〜
  config.comments_registration_name = 'AdminComment'
end
```
これでエラーは解消されました。
Rails form_withの使い方

使用環境
ruby2.6.8
rails6.1.4


#form_withとは
railsで情報を送信するためのヘルパーメソッド。
form_withを使うことにより、簡単に入力フォームに必要なHTMLを作成することが可能。
rails5.1から追加されたフォームを作成するためのヘルパーメソッドで、それ以前に用いられていたform_tagやform_forのように用いられている。
(現在はform_withを使うことが推奨されている)

#form_withの使い方

form_tagのように入力された情報をデータベースに保存しない場合

```erb
<%= form_wth url: "パス" do |f| %>
    内容
<% end %>
```
データベースに保存する場合

```erb
<%= form_with model: モデルクラスのインスタンス %>
    内容
<% end %>
```
上のようなデータベースに保存する場合でもpathの指定は可能で

```erb
<%= form_with model: モデルクラスのインスタンス,url: "パス" %>
    内容
<% end %>
```
のような形で書くことで予期せぬエラーを私は解決することができた。

ここでいう「モデルクラスのインスタンス」とは保存したいテーブルのクラスのインスタンスのこと。今回はpostテーブルに新たにレコードを追加したかったので、コントローラ側で以下のように記述した

```rb
def new
    @post = Post.new
end
```
この@postをview側で記述すればよい。

#form_withで使用できるhtmlタグ

| メソッド | 用途 |
|:-----------|------------:|
| form.text_field      | 一行のテキスト投稿フォーム        |
| form.text_area    |複数行のテキスト投稿フォーム |
| form.number_field	      | 数値入力ボックスを生成        |
| form.search_field	 | 一行の検索フォーム|
| form.email_field	 | メールアドレス入力ボックスを生成 |
| form.check_box |データベースの情報を使わないでチェックボックスを生成|
|form.collection_check_boxes	|データベースの情報を元にチェックボックスを生成|
|form.select	|選択肢を作成|
|form.collection_select	|データベースの情報を元に選択肢を生成|
|form.file_field	|ファイル選択ボックスを生成|
|form.datetime_field	|日時の入力欄を生成|
|form.date_select	|日付選択ボックスを生成|
|form.hidden_field	|非表示のフォーム|
|form.submit	|送信ボタンの生成|


参考記事
>https://pikawaka.com/rails/form_with
>https://rails-ambassador.herokuapp.com/tips/FormWithHelper
M1でdwave-ocean-sdkを使いたい~Docker編~

#悲しい現実
dwave-ocean-sdkは**まだ**ARMには対応していません
つまり自力で依存パッケージを含めビルドしてあげる必要があります
というわけでビルドとセットアップをやってくれるDockerfileを書きました

##issue
といっても実際には，Dockerにしちゃえばpipのインストール中にこけるのは依存パッケージの中でも一つだけ(dwave-tabu)でした

[Install via pip fails on Debian / Ubuntu · Issue #77 · dwavesystems/dwave-tabu](https://github.com/dwavesystems/dwave-tabu/issues/77)

##Dockerfile

取り急ぎで作ったので各自修正してご利用ください

```dockerfile
FROM python:3.9
USER root

RUN apt-get update
RUN apt-get -y install locales && \
    localedef -f UTF-8 -i ja_JP ja_JP.UTF-8
ENV LANG ja_JP.UTF-8
ENV LANGUAGE ja_JP:ja
ENV LC_ALL ja_JP.UTF-8
ENV TZ JST-9
ENV TERM xterm

RUN apt-get install -y vim less libboost-dev swig build-essential cmake git
RUN pip install --upgrade pip
RUN pip install --upgrade setuptools
RUN pip install scikit-build matplotlib scipy numpy cython ninja

RUN git clone https://github.com/dwavesystems/dwave-preprocessing.git
WORKDIR /dwave-preprocessing
RUN pip install -r requirements.txt
RUN python setup.py build_ext --inplace
RUN python setup.py install
WORKDIR /

RUN git clone https://github.com/dwavesystems/dwave-ocean-sdk.git
WORKDIR /dwave-ocean-sdk
RUN python3 setup.py build
RUN python3 setup.py install

RUN echo \
    ""$CONFIGURATION_FILE_PATH"$'\n'\
    "y"$'\n'\
    "$PROFILE_NAME"$'\n'\
    "$ENDPOINT"$'\n'\
    "$TOKEN"$'\n'\
    "$DEFEAULT_CLIENT_CLASS"$'\n'\
    "$DEFEAULT_SOLVER"$'\n'"\
    | dwave setup --install-all
```

##更新情報
- 2021/9/16

dwave-ocean-sdkが3.5.0になったら動かなくなったので更新しました
１か月に同じ曜日が何回あるかを数える数式

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


あああ、ちょっとトリッキーすぎて質問者さんには嫌われたようです。

とても短い式でちゃんと動くのになぁ。きっと理解できんかったんだろう。

この式の場合は火曜日(3)を計算します

```
4 + IF（DAY（Start_date__c + 34）<WEEKDAY（Start_date__c-3）、1,0）
```

[Formula to Calculate number of Tuesdays each month](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000BrNwM)
似ているけど違う！？  [ 繰り返し処理 ]　mapメソッド、eachメソッド

#はじめに
今回はmapメソッドとeachメソッドの使い分けについて考えてみました。
似ているようで似ていない２つの処理について代表的な書き方をまとめましたので、
僕と同じ学習中の方の役に立てればいいと思います。
初心者でもわかりやすいように各文法を日本語で書いてみましたので、当てはめるだけで書くことが出来ます。

##mapメソッド

### **　配列名.map { | 要素名 | 処理 }**
配列の各要素に対してブロックで処理を行い結果を配列として返してくれます。
処理の時だけ結果を返してくれて、その後は元の配列のままです。

```ruby
#　mapメソッド
numbers1 = [1, 2, 3, 4, 5]

p numbers1.map{|number| number * 2}
  #=> [2, 4, 6, 8, 10]　　　*処理の時だけ
p numbers1
  #=> [1, 2, 3, 4, 5]　　　*元の配列に影響は無い
```
```ruby
array = ["1", "2", "3", "4", "5"]

p array.map(&:to_i)  #=>[1, 2, 3, 4, 5]  *処理の時だけ
p array         #=> ["1", "2", "3", "4", "5"]　　*元の配列に影響は無い
```

### **　配列名.map! { | 要素名 | 処理 }**
配列の各要素に対してブロックで処理を行い結果を配列として返してくれます。
配列の要素を置き換えてくれます。

```ruby
#　mapメソッド
numbers1 = [1, 2, 3, 4, 5]

p numbers1.map!{|number| number * 2}
  #=> [2, 4, 6, 8, 10]　　　*破壊的メソッド
p numbers1
  #=> [2, 4, 6, 8, 10]　　　*配列の要素に処理が上書きされる
```

```ruby
array = ["1", "2", "3", "4", "5"]

p array.map!(&:to_i)  #=> [1, 2, 3, 4, 5]　　*破壊的メソッド
p array         #=> [1, 2, 3, 4, 5]　　　*配列の要素に処理が上書きされる
```


##eachメソッド
　**配列名.each do |要素名|　
  　　処理
　end**

配列の各要素を１つずつ取り出し処理を行います。イメージとしては配列名から要素を取り出し要素名に代入して処理というような感じになります。

```ruby
# eachメソッド
numbers1 = [1, 2, 3, 4, 5]

  numbers1.each do |number| 
    p number * 2
  end
  #=> 2
  #   4
  #   6
  #   8
  #   10
```
mapメソッドと同じように処理結果を配列として取り出すには下記のように、
空の配列を用意し代入して出力しなくてはならない。

```ruby
numbers1 = [1, 2, 3, 4, 5]

  numbers2 = []
  numbers1.each do |number| 
    numbers2 << number * 2
  end
  p numbers2
  #=> [2, 4, 6, 8, 10]
```

##まとめ
- 繰り返し処理を行うなら eachメソッド
- 繰り返し処理結果を配列として扱うなら mapメソッド
- mapメソッドは破壊的メソッドも使える

間違いなど、ご指摘いただければ幸いです。
`toDate() is not a function` error in dayjs to convert Firestore Timestamp to date in Next.js(React)

公式でも`toDate()`を使えと書いているのに「toDate() is not a function」のエラー。

```ts
import firebase from 'firebase/app'

export interface Post {
  id: string
  uid: string
  body: string
  isReplied: boolean
  createdAt: firebase.firestore.Timestamp
}
```

timestampのsecondesプロパティがUNIXタイムになっているので下記のようにしたらいけた。

```jsx:ListItem.jsx
import firebase from 'firebase/app'
import dayjs from 'dayjs'
import { Post } from '../models/Post';

export default function ListItem({ post }: {
  post: Post
}) {
return (

<small>{dayjs.unix(post.createdAt.seconds).format('MM/DD')}</small>

)
```

https://stackoverflow.com/a/68049161/11183860
VSCodeでBlazor開発環境を準備する

## Visual Studio Code にて Blazor開発をするための準備手順

#### 想定開発環境、状況など
- Windows10
- Visual Studio CodeはInstall済み
- 2021/8/12 現在での情報となります。

#### 手順① .NET Core をインストールする
インストーラーを、下のページからダウンロード
https://docs.microsoft.com/ja-jp/dotnet/
アプリの作成をしたいので、SDKの方をダウンロードします。
※ Runtimeは、動作させたい方用
ダウンロードしたExeを実行し、後はダイアログに従ってください。

#### 手順② .NET Core コマンドを使用し、Blazorテンプレートの名称を取得
コマンドラインにて、
　dotnet new --list 
を、実行すると使用可能なテンプレートの一覧が取得できるので、
その中から、「Blazor Server App」or 「Blazor WebAssembly App」どちらかの、
『短い名前』をメモしてください。

現在は、
　Blazor Server App ： blazorserver
　Blazor WebAssemgly App ： blazorwasm
で定義されています。

#### 手順③ .NET Core コマンドを使用し、Blazorテンプレートを作成する
コマンドラインにて、
　dotnet new blazorserver --name 【作成したいプロジェクト名】 
を、実行すると、テンプレートプロジェクトが作成される。

#### 手順④ Visual Studio Code で該当フォルダを読込
Visual Studio Codeの、
[ファイル]-[フォルダを開く]で、ダイアログを表示し、
先ほど作成したフォルダを選択する。
[SwiftUI]タップでキーボードを閉じる方法

## 投稿の経緯
個人開発中のアプリでタップしてキーボードを閉じる機能を実装したので記録に残します。

## 環境
Swift version 5.4.2
Xcode version 12.5.1

## extensionの実装
まず、UIApplicationを拡張します。

```swift
import Foundation
import SwiftUI

extension UIApplication {
    func closeKeyboard() {
        sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil)
    }
}

```

簡単に何をしているか説明すると、sendActionでセレクターに対してアクションを送信し、`UIResponder.resignFirstResponder`に`nil`を設定することで、最上位のファーストレスポンダがnilとなり、何もアクションしていない状態となりキーボードも閉じられます。

## closeKeyboardの呼び出し
タップを検知させるパーツの`.onTapGesture`でcloseKeyboardを呼ぶ。
今回はColorをタップしてcloseKeyboardを呼びます。

```swift
Color.gray.opacity(0.5)
    .edgesIgnoringSafeArea(.all)
    .onTapGesture {
        UIApplication.shared.closeKeyboard()
    }           
```

## お知らせ
現在、iOS開発案件を業務委託で募集中です（副業）。[TwitterDM](https://twitter.com/ken_sasaki2)でご依頼をお待ちしています。
go func(){ ••• }()の最初と最後の丸括弧の使い方(メモ)

Go言語の勉強をしていて、時折出現するgoroutineを使用した無名関数。
例えば、以下のようなmainからAddメソッドに値を渡している処理です。


```go
func main() {
	for i := 0; i < 50; i++ {
		go func(t int) {
			dc.Add(t)
		}(i % 2)
	}
}

func (dc *DoubleCounter) Add(t int) {
	dc.commandCh <- t // commandChはチャンネル
}
```

初めにこれを目にした時、go func( ){ 処理 }( )の初めの丸括弧に記載されている(t int)、最後の丸括弧に記載されている(i % 2)がどういった挙動をしているかわかりませんでした。
しかし、デバックして追っかけてみると、Addメソッドには0と1しか値として渡っていませんでした。
ということは、先程の無名関数は変数iの値をまずは2で割って、そのあまりを今度は無名関数の初めの括弧に渡してあげて、そこで変数tに値が入ってその値がAddメソッドに流れていくということになります。

恐らく、この流れになっていくとは思うのですが、
もし何か間違いや言い回しの部分でおかしい箇所があればご指摘いただけると嬉しいです！
よろしくお願いいたします。
vue-select-imageをvue+nuxtに導入

## 手順

インストール

```
yarn add vue-select-image
```

プラグインの追加

```plugins/imageselect.js
import Vue from 'vue'
import VueSelectImage from 'vue-select-image'
require('vue-select-image/dist/vue-select-image.css')
Vue.use(VueSelectImage)
```

nuxt.config.jsの編集：プラグインを追加します。

```nuxt.config.js
  plugins: [
    {
      src: '@/plugins/imageselect',
      mode: 'client'
    }
  ],
```

コード：ちょっとエラーがconsoleに出てきたので、`client-only`で囲むことにより解決しています。

```index.vue
<template>
    <client-only>
        <div class="container">
            <vue-select-image
                :data-images="dataImages"
                :is-multiple="false"
                :selected-images="initialSelected"
            />
        </div>
    </client-only>
</template>
 
<script>
 
export default {
  components: {},
  data() {
    return {
      dataImages:[{
        id: '1',
        src: 'https://unsplash.it/200?random',
        alt: 'Alt Image 1'
      }, {
        id: '2',
        src: 'https://unsplash.it/200?random',
        alt: 'Alt Image 2'
      }, {
        id: '2',
        src: 'https://unsplash.it/200?random',
        alt: 'Alt Image 2',
        disabled: true
      }],
      initialSelected: [],
    };
  }
}
</script>
 
<style>
.container {
  margin: 0 auto;
  min-height: 100vh;
  display: flex;
  justify-content: center;
  align-items: center;
  text-align: center;
  font-size: 70px;
}
</style>
```

こんな感じで表示されます。

![Screen Shot 2021-08-18 at 13.34.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396623/30783021-2c2f-fd6c-328b-1d991c296824.png)


## 参考

ありがとうございました。

https://www.kabanoki.net/9039/

https://mebee.info/2020/06/18/post-12547/
FortiClient接続時に98%で停止する現象の対応

FortiClientで接続時に98%あたりで停止する現象の対応について説明します。

おそらくWindowsUpdateの弊害だと思われます。
WAN Miniportを再インストールすることで改善されます。

手順は以下のとおりです。
![Fortigate98.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355495/ba70a99d-a44a-6f7a-cdf0-87a28685d60a.png)
ActionBar Titleの色を変更する方法(Kotlin, Android)


> 参考になった動画
> [Change Title Color of Action Bar in Android Studio](https://www.youtube.com/watch?v=HjUeYiOEoWc)

## 端的に
タイトルの色を変えるには```themes.xml```内にある```<style name...```の```parent```にひと手間かける必要があります。

「Theme.MaterialComponents.DayNight.DarkActionBar 」の後に
「Bridge」を追加

```xml
    <style name="....." parent="Theme.MaterialComponents.DayNight.DarkActionBar.Bridge">
        <item name="titleTextColor">@color/black</item>
    </style>
```
この手間だけで```titleTextColor```がちゃんと動きTitleの色が変更される。
SQLiteで文字列分割

# 初版

こんな感じですなw

```
ykishi@dezembro sqlite-test % cat test1.sh 
#!/bin/sh

#
# cf. https://www.w3resource.com/sqlite/core-functions-instr.php 
# as well as https://www.w3resource.com/sqlite/core-functions-substr.php and https://www.w3resource.com/sqlite/core-functions-length.php
#

DB=./temp.db

sqlite3 ${DB} << EOF
drop table if exists dummy_table;
create table dummy_table (id integer, name varchar);
.schema dummy_table
insert into dummy_table values (1, 'John,Lennon');

.header on
select * from dummy_table;

.header off
select char(10);
.header on

select length(D.name), instr(D.name, ',')
from dummy_table D;

.header off
select char(10);
.header on

select substr(D.name, 1, instr(D.name, ',') - 1) as firstname,
       substr(D.name, instr(D.name, ',') + 1, length(D.name) - instr(D.name, ',') ) as lastname
from dummy_table D;

EOF
ykishi@dezembro sqlite-test % ./test1.sh 
CREATE TABLE dummy_table (id integer, name varchar);
id|name
1|John,Lennon


length(D.name)|instr(D.name, ',')
11|5


firstname|lastname
John|Lennon
ykishi@dezembro sqlite-test % 
```

# 改訂版

あ、文字列にカンマが含まれていない場合のエラー処理が抜けている。
よって、以下のように修正：

```
ykishi@dezembro sqlite-test % cat test1.sh 
#!/bin/sh

#
# cf. https://www.w3resource.com/sqlite/core-functions-instr.php 
# as well as https://www.w3resource.com/sqlite/core-functions-substr.php and https://www.w3resource.com/sqlite/core-functions-length.php
#

DB=./temp.db

sqlite3 ${DB} << EOF
drop table if exists dummy_table;
create table dummy_table (id integer, name varchar);
.schema dummy_table
insert into dummy_table values (1, 'John,Lennon');
insert into dummy_table values (2, 'Dr. John');

.header on
select * from dummy_table;

.header off
select char(10);
.header on

select length(D.name), instr(D.name, ',')
from dummy_table D;

.header off
select char(10);
.header on

select instr(D.name, ',') as position, 
       case 
         when instr(D.name, ',') > 0 then substr(D.name, 1, instr(D.name, ',') - 1) 
         else D.name
       end as firstname,
       case 
         when instr(D.name, ',') > 0 then substr(D.name, instr(D.name, ',') + 1, length(D.name) - instr(D.name, ',') )
         else ''
       end as lastname
from dummy_table D;

EOF
ykishi@dezembro sqlite-test % ./test1.sh 
CREATE TABLE dummy_table (id integer, name varchar);
id|name
1|John,Lennon
2|Dr. John


length(D.name)|instr(D.name, ',')
11|5
8|0


position|firstname|lastname
5|John|Lennon
0|Dr. John|
ykishi@dezembro sqlite-test % 
```
数理計画（EXCEL①）

勉強のため、EXCElでの数理計画にチャレンジ

まずは、ゾルバアドインを入れますが、入れ方に関しては詳しく書いてあるところを参考にしました。
ざっくり、アドインに”ゾルバ”を追加する。

ただ、制限があり大きい問題は求解できません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314982/dfb30631-0142-6f89-02e2-be127f513591.png)

```
【問題：条件】
　　一週間の製造計画について考えます。（土曜日から金曜日）
　　出荷は翌日朝から実施するため、前日に必要量を製造する。
　　翌週のために金曜日の貯蔵量を守る。

　　目的：製造量を最小化
　　説明変数：製造量
　　制約条件：
　　　・製造量　≦　一日の最大製造量
　　　・製造量　≧　一日の最小製造量
　　　・貯蔵量　≦　貯蔵できる最大量
　　　・貯蔵量　≧　翌日の出荷量
　　　・最終貯蔵量　≧　翌週のための貯蔵量

ワークシートで下記を作成
　　貯蔵量　＝　前日の貯蓄量＋製造量-出荷量
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314982/66c18d9f-012e-b790-a7b9-91b914fae4a5.png)

出荷量と前週、翌週の値を手入力して

ここで、下記のゾルバ―を押下する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314982/485f2a39-6d37-1dcf-8e9b-4eae624091c2.png)

目的セルの設定：1週間の総製造量
変数セルの変更；製造量を選択
制約条件の対象：上記の制約条件を入力

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314982/614345aa-6650-3fb2-be6f-625c97d81b98.png)

”解決”ボタンを押下

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314982/b5fd6873-2ccb-185b-b167-1788f5f2fb84.png)

条件が満足できる解が求められました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314982/4bbe7282-79a1-c2a9-5dcd-ad3af5953fc0.png)

かなり単純なモデルですが、基本的にはこのように最適な説明変数の値を求めることができます。
説明変数は多数あってもというか、多数ある場合の方が普通だと思います。
XcodeGenでRealmSwiftを導入する

XcodeGenでRealmSwiftを使うためには、`realm-cocoa`packageの`Realm`productと`RealmSwift`productをインストールする必要があります。

- Realm
- RealmSwift

参考: https://docs.mongodb.com/realm/sdk/ios/install/

# 実装

```project.yml
packages:
  realm-cocoa:
    url: https://github.com/realm/realm-cocoa.git
    majorVersion: 10.12.0
targets:
  YourProject:
    dependencies:
      - package: realm-cocoa
        product: Realm
      - package: realm-cocoa
        product: RealmSwift    
```
Apache Flexのコンポーネントの作り方

# はじめに

Apache Flexで独自のコンポーネント（カスタムコンポーネント）を作成します。
例として、「Hello XXX」と表示するだけの簡単なコンポーネントを作成します。
また、作成したコンポーネントを利用する方法を書きます。

# コンポーネントの作成

```mxml:HelloLabel.mxml
<?xml version="1.0" encoding="utf-8"?>
<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009"
         xmlns:s="library://ns.adobe.com/flex/spark">
    <fx:Script>
        <![CDATA[
            [Bindable]
            public var yourName:String;
        ]]>
    </fx:Script>
    <s:Label text="Hello {yourName}" />
</s:Group>
```

「Hello XXX」と表示するためのコンポーネントを作成します。
mxmlのファイル名の「HelloLabel」の部分がコンポーネントの名前になります。
yourName属性に指定された値によって、XXXの部分の表示が変わるようにしています。

# 作成したコンポーネントの利用方法

![Screenshot from 2021-08-18 11-21-25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102121/1cb7e2fe-8b01-72c3-09ae-42b5f063a2a1.png)


```mxml:Main.mxml
<?xml version="1.0" encoding="utf-8"?>
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009"
                       xmlns:s="library://ns.adobe.com/flex/spark"
                       xmlns:c="*"
                       width="400" height="300">

    <fx:Style>
        * { 
            font-family: "Meiryo";
        }
    </fx:Style>

    <!-- 作成したコンポーネント -->
    <c:HelloLabel left="10" top="10" yourName="World"/>

</s:WindowedApplication>
```

コンポーネントのmxmlファイルが同じフォルダーにある場合、s:WindowedApplicationタグで```xmlns:c="*"```のように指定します。
（もし、componentsフォルダーを作って、そこにコンポーネントのmxmlファイルを格納した場合は、```xmlns:c="components.*"```のように指定します）

利用したい箇所で、c:HelloLabelタグを記載することで、作成したコンポーネントを利用できます。

今回、xmlns:cにしていますが、「c」の部分は、任意の文字列を指定できます。
[Java]  Excelを画像、html、XPS、XML、CSVに変換

<p><strong>Free Spire.XLS for Javaという無料のライブラリでは、いろいろな機能を行うことができます。特にパワフルな変換機能も搭載しています。今回は、free Spire.XLS for Java活用して Excelを画像、html、XPS、XML、CSVに変換する方法を紹介します。</strong></p>
<h4><strong>下準備</strong></h4>
<p><strong>1.E-iceblueの公式サイトから<a href="https://www.e-iceblue.com/Download/xls-for-java-free.html">Free Spire. XLS for Java</a>無料版をダウンロードしてください。</strong></p>
<p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/l/lendoris/20210818/20210818121612.png" alt="f:id:lendoris:20210818121612p:plain" width="545" height="198" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p>
<p><strong>2.IDEを起動して新規プロジェクトを作成してから、インストールされたファイルにあった相応しいSpire. XLS.jarを参照に追加してください。</strong></p>
<p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/l/lendoris/20210818/20210818121621.png" alt="f:id:lendoris:20210818121621p:plain" width="268" height="93" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p>
```JAVA
import com.spire.xls.*;

public class Excel{
    public static void main(String[] args) {
        //Excelオブジェクトを作成します。
        Workbook wb = new Workbook();
        wb.loadFromFile("test.xlsx");

        //シートを取得します。
        Worksheet sheet = wb.getWorksheets().get(0);

        //エクセルを画像で保存します。
        sheet.saveToImage("ToImg.png");
        //指定するセルの範囲を画像で保存します。
        //sheet.saveToImage("ToImg2.png",8,1,30,7);

        //HTMLで保存します。
        sheet.saveToHtml("ToHtml.html");

        //XPSで保存します。
        sheet.saveToFile("ToXPS.xps", String.valueOf(FileFormat.XPS));

        //CSVで保存します。
        sheet.saveToFile("ToCSV.csv", String.valueOf(FileFormat.CSV));

        //XMLで保存します。
        sheet.saveToFile("ToXML.xml", String.valueOf(FileFormat.XML));

        //PostScriptで保存します。
        sheet.saveToFile("ToPostScript.postscript", String.valueOf(FileFormat.PostScript));

        //PCLで保存します。
        sheet.saveToFile("ToPCL.pcl", String.valueOf(FileFormat.PCL));

    }
}
```
<h4><strong>実行結果例</strong></h4>
<p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/l/lendoris/20210818/20210818122456.png" alt="f:id:lendoris:20210818122456p:plain" width="554" height="263" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p>
<p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/l/lendoris/20210818/20210818122503.png" alt="f:id:lendoris:20210818122503p:plain" width="554" height="237" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p>
<p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/l/lendoris/20210818/20210818122511.png" alt="f:id:lendoris:20210818122511p:plain" width="554" height="229" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p>
<p> </p>