OmniAICreator/Qiita-1.07M huggingface dataset:
【正規表現】テキストエディタの置き換え機能で正規表現を使って、テキスト修正作業で楽をしよう【XML-1】


# テキストエディタの正規表現での置き換え機能

昨今では、テキストエディタに「正規表現」を使って置き換えする機能が充実している。

## Emeditorの場合

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281173/f6e3ed35-8ccc-bace-75a2-9201c61acb2c.png)

## Notepad++の場合

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281173/1c8f646a-0e96-31a0-87f1-6ddafb882a2b.png)

## 有用性

この機能は便利で、規則性を持ったデータであれば、いろんな用途に使える：

- HTMLやXMLやjsonで出力されたファイルがあって、固定要素を追加したり、一律に変更しなくてはいけないとき
- CSVやjsonで保管されたデータがあって、そのデータを一定の規則で解析しないといけないとき
などなど

# 例

今回はWindowsインストーラを自動で構築できるWiXEditを使っていて発生した課題であるので取り上げる。

## 課題

　インストーラを作るとき、デフォルトのインストールではC:\Program Files(x86)にインストールされるが、64bitのアプリケーションなのでC:\Program Files\に保存して欲しい。

　なお、WixToolSetに関する修正方法については、こちらを参照

http://www.02.246.ne.jp/~torutk/windows/wixandwixedit.html

## XML構成

Directory要素の一部を抽出

```XML
<Directory Id="TARGETDIR" Name="SourceDir">
    <Directory Id="ProgramFiles64Folder" Name="ProgramFiles64Folder">
		<Directory Id="OPSIMULATOR" Name="OPSimulator">
			<Component Id="ABP.AUTOMAPPER.DLL" DiskId="1" Guid="5606C656-4B95-43AE-966E-27F72FAEE65F">
				<File Id="ABP.AUTOMAPPER.DLL" Name="Abp.AutoMapper.dll" Source="..\OPSimulator\Abp.AutoMapper.dll" />
			</Component>
			<Component Id="ABP.DLL" DiskId="1" Guid="F5DC937F-7270-430F-9DA0-443B23679514" >
				<File Id="ABP.DLL" Name="Abp.dll" Source="..\OPSimulator\Abp.dll" />
			</Component>
			<Component Id="APPSETTINGS.DEVELOPMENT.JSON" DiskId="1" Guid="72B3BA58-D113-488A-9E93-2D197BEC853F">
				<File Id="APPSETTINGS.DEVELOPMENT.JSON" Name="appsettings.Development.json" Source="..\OPSimulator\appsettings.Development.json" />
			</Component>
... (以下省略)

```

## ルール

このルール整理がまず大切。
どんな正規表現を使うか、パズル要素がある。
よさげなのを考えて戦略を立てるのが大切。

- Componentタグに、以下のオプションを追加したい
 - **Win64="yes"**
- Componentタグは、常にId、DiskId、Guidの3つのオプションで構成される。
- Componentタグに含まれる特殊文字は、ピリオド、ハイフンである

## 正規表現を検討した結果

こんな感じになりました。
もちろん、答えは１つではないのでもっと良い方法はあります。

ただし、今回は**なるべく作業を早く**やりたい！
そういうときは、あまり拘らずに、↑で決めたルールだけを考えて簡易的な正規表現を使います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281173/f6e3ed35-8ccc-bace-75a2-9201c61acb2c.png)

## 正規表現の意味合い

- 検索する文字列
 - Componentタグを見つけたら、その後に文字列か=か"か.か=のどれかが続く
 - それが3回必ず来るので、連結して3回書く(**ここはもっと上手くやればまとめられるけど、パパっとやりたかったのでコピペでやった**)
 - 閉じるタグとかは置換後の文字列の結果に影響するのでつけない
- 置換後の文字列
 - 元の文字列を残す
 - Win64="yes"を付加する

## 結果

　無事、C:\Program Filesフォルダにインストールされたアプリ(OPSimulatorフォルダ)が保存されるようになりました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281173/0fc49895-19fe-e196-26e6-19ca16bfc9f6.png)
プロパティ変更通知のコンソールアプリ --メモ--

```csharp

using System;
using System.ComponentModel;
using System.Runtime.CompilerServices;

namespace ConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            var sample = new Sample();
            sample.PropertyChanged += new PropertyChangedEventHandler(myListner);

            while (true)
            {
                string str = Console.ReadLine();
                sample.Message = str;
            }
        }

        private static void myListner(Object sender, PropertyChangedEventArgs e)
        {
            Sample s = (Sample)sender;
            Console.WriteLine($"{e.PropertyName} :{s.Message}");
        }
    }
    public class Sample : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
        private string message;

        public string Message
        {
            get { return   message ; }
            set { message = value;
                if (PropertyChanged != null)
                    PropertyChanged(this, new PropertyChangedEventArgs("Messageプロパティ"));
                //PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Messageプロパティ"));
            }
        }

    }
}


```


[参考記事]
[INotifyPropertyChanged Console sample program](https://social.msdn.microsoft.com/Forums/en-US/c4fd8ac1-27b7-4f76-8755-3450e11515cb/inotifypropertychanged-console-sample-program?forum=csharpgeneral)
59日後にITパスポートを受けるFラン私大文系既卒(36日目)

# EA(エンタープライズアーキテクチャ)
* EAとは?
 * 企業や政府など、大きな組織の情報システムを最適化するための手法

# SoE(Service of Engagement)
* SoEとは?
 * ユーザのニーズに応え、ユーザとのつながりを強化するシステム

# SoR(Service of Record)
* SoRとは?
 * 記録などの基本的な処理を正しく行うシステム

# DFD図(Data Flow Diagram)
* DFD図とは?
 * データの流れを表す図

# BPMN(Business Process modeling Notation)
* BPMNとは?
 * 業務プロセスの流れを表したもの

# BPM(Business Process Management)
* BPMとは?
 * 業務プロセスを見直し継続的に改善していくこと

# ワークフローシステム
* ワークフローシステムとは?
 * 紙の書類を電子化して、手続きを効率化すること

# RPA(Robotic Process Automation)
* RPAとは?
 * ソフトウェアロボットで事務作業を自動化すること

# ハウジングサービス
* ハウジングサービスとは? 
 * 自社のサーバを、他社の敷地に置くサービス

# ホスティングサービス
* ホスティングサービスとは?
 * 他社の敷地に置かれている、他社のサーバを借りるサービス
 
# IaaS(Infrastructure as a Service)
* IaaSとは?
 * ハードウェアなどの基盤をインターネット上で提供するサービス

# ASP(Application Service Provider)
* APSとは?
 * インターネット経由でソフトウェアを提供するサービス
 * 1つのサーバを一つの会社が独占して利用しているという点で、SaaSと異なる

# DaaS(Desktop as a Service)
* DaaSとは?
 * ディスクトップ環境をインターネット上で提供できるサービス

# PoC(Proof of Concept)
* PoCとは?
 * あるアイディアが実現可能かを調べるために、プロトタイプよりも前に行う、簡易的な検証

# BI(Business Intelligence)
* BIとは?
 * 自社に蓄積されているデータを分析して、経営の意思決定に役立てようとする手法や技術

# データウェアハウス
* データウェアハウスとは?
 * 意思決定に役立てるためのデータの集まり

# ROI(Return of Investment)
* ROIとは?
 * 投資利益率
 * ROIの値が高いほど、コスパが良い
* 式

```math
ROI = \frac{利益}{投資額}
```

# NDA(Non-Discloser Agreement)
* NDAとは?
 * 機密保持契約
【忙しい人のための】Azureの基礎第1部【クラウドとAzureの利点】

AzureについてMS Learnで勉強される場合、第1部は1時間39分のラーニングパスになっています。
ここでは、自身の勉強の復習も兼ねて、MS Learn Azureの基礎第1部の要点をまとめておきますので、Azureの情報を素早く知りたいという方の参考になれば幸いです。
自身の勉強の力点を踏まえて記述するので、詳細な情報を得たい方はMS Learnにアクセスください。

本家様

https://docs.microsoft.com/ja-jp/learn/paths/az-900-describe-cloud-concepts/

次章はこちら

https://qiita.com/enurinri/items/1dcb08a546059954f986

# Azureの基礎の概要
## クラウドコンピューティングとは
Azureを始めとした**クラウドコンピューティング**は、他のデータセンターからコンピューティング機能とストレージをレンタルすることができる、**従量課金制**のシステム。
従量課金制とは、使った分だけ料金を支払う仕組み。
クラウドコンピューティングのメリットは、
 
* オンプレミス型よりもサービスの運用コストを削減可能(固定費が下がり**運用費中心**の支出となる）
* インフラストラクチャの効率的実行が可能
* ビジネスニーズに合わせて簡単に**スケーリング**可能

という点。

クラウドではいくつかの種類のオンデマンドアクセスが提供されています。オンデマンドアクセスとは、需要に応じてすぐにサービスにアクセスできるということ。
クラウドで提供されるオンデマンドアクセスとして、

* コンピューティング、ストレージ、ネットワークコンポーネントに関する実質的に無制限のプール
* アプリケーションのための音声認識やコグニティブサービス
* ソフトウェア、デバイスからテレメトリデータを配信する分析サービス

がある。

## Azure Portal
Azureには**Azure Portal**という、Webベースの統合コンソールが存在。
障害に対する回復性と**高可用性**を実現するよう設計され、ここではAzureサブスクリプションの管理が行われる。

# Azureの基本的な概念について説明
## クラウドの種類
#### パブリッククラウド
サービスがインターネット経由で提供され、サービスの購入希望者は誰でもサービスを利用できるもの。
#### プライベートクラウド
1企業や組織に属する特定のユーザのみが利用できるコンピュータリソースで構成されているもの。
#### ハイブリッドクラウド
パブリックとプライベートを組み合わせて運用し、クラウド間でデータとアプリを共有しているもの。

## クラウドの利点
#### 高可用性(High Availability)
いかなるときもサービスを使うことができる。
#### スケーラビリティ(Scalability)
コンピューティング性能を、性能や規模の調節で、自在に操ることができる。
#### 弾力性(Elasticity)
サービス利用者が突発的に増えても、コンピューティング性能をスケーリングしてサーバ負荷に対応できる。
#### 機敏性(Agility)
サーバの構成が自在なため、あらゆる事象に迅速に対応できる。
#### Geoディストリビューション(Geo Distribution)
世界中のリージョンに存在するデータセンターにデプロイできる。
デプロイとは、開発したアプリケーション（機能やサービス）をサーバ上に展開・配置して利用できるようにすること。
#### 災害復旧(Disaster Recovery)
可用性ゾーンの利用、異なる地域間でデータを複製、バックアップの作成で災害に対しても迅速に回復できる。

# Azureアーキテクチャのコアコンポーネントを説明
## Azureリソースの階層構造
Azureの構造は[管理グループ]>[サブスクリプション]>[リソースグループ]>[リソース]の順で階層になっている。
#### 管理グループ
複数のサブスクリプションについてアクセス、ポリシー、コンプライアンスを管理するのに役立つもの。
管理グループで設定された条件はグループ内の各サブスクリプションに継承される。
#### サブスクリプション
Azureアカウントによって作成されたリソースをグループ化するもの。
１つのアカウントに対して１つ以上のサブスクリプションを設けることが可能。
Azureの契約単位であるので、サブスクリプションを作成することにより各Azureサービスへのアクセスが認証・承認される。
サブスクリプションはAzure Active Directory (Azure AD) 内またはAzure ADによって信頼されるディレクトリ内のIDであり、また、課金やアクセス制御に関して境界を設けることが可能。
各サブスクリプションごとにユーザが作成して使用できるリソースについて制限・容量が存在。
#### リソースグループ
Azureリソースをデプロイして管理するための論理コンテナ。
リソースを順序付けして整理し、リソースグループに与えた権限は内包するリソースに継承され、リソースグループを削除するとリソースも削除される。
#### リソース
作成するサービスのインスタンス。

## Azureリージョン
**Azureリージョン**は、Azureでリソースを作成できる場所。
１つ以上のデータセンターを含む地理的領域。
いくつかのリージョン内には**可用性ゾーン**が存在。

### 可用性ゾーン(Azure Availability Zone)
Azureリージョン内で、物理的に分離された3つ以上のデータセンター群。
サービスとデータを**冗長化**して障害発生時にこれらを保護することが可能。

### Azureリージョンのペア
各リージョンには、同じ地域内で300マイル以上離れたところでペアとなるリージョンが設定される。
災害や障害時のリスクを軽減するために、ペア同士は直接接続されて、リソースが複製される。

## Azure Resource Manager
**Azure Resource Manager**は、Azureのデプロイおよび管理サービス。
Azureアカウント内のリソースを作成・更新・削除できる管理レイヤーを提供。
ユーザーがAzureツール、API、SDKのいずれかから要求を送信すると、Resource Managerが要求を受信、要求されたアクションを行うAzureサービスに要求を送信して、その要求の認証と承認を行う。
【BIG-IP】DisableとForce Offlineの違い

#BIG-IP DisableとForceOfflineの違い
本ページではBIG-IPがpool memberもしくはnodeに対して`Disable`もしくは`Force Offline`する際の挙動の違いについて説明します。
`Disable`と`Force Offline`はどちらもpool member/nodeに対して通信を中断されることができます。
バックエンドサーバの保守・メンテナンスの際に使われることが多い機能です。

##適用対象　（2021/9/2 現在）
Product: BIG-IP, BIG-IP AFM, BIG-IP APM, BIG-IP ASM, BIG-IP Link Controller, BIG-IP LTM, BIG-IP PEM, BIG-IP AAM
Version: 11.X.X ~ 16.X.X

##Disable
>When set to Disabled, a node or pool member continues to process persistent and active connections. 
It can accept new connections only if the connections belong to an existing persistence session.

`Disabled`に設定すると、ノードまたはプールメンバーは、[Persistence](https://techdocs.f5.com/en-us/bigip-15-0-0/big-ip-service-provider-diameter-administration/configuring-persistence.html)およびアクティブな接続の処理を継続します。
新しい接続は、その接続が既存のパーシステンス・セッションに属している場合にのみ受け入れることができます。

##Force Offline
>When set to Forced Offline, a node or pool member allows existing connections to time out, but no new connections are allowed.

`Force Offline`に設定すると、ノードまたはプール・メンバーは、既存の接続のタイムアウトまで処理を継続しますが、新しい接続は処理されません。

:::note warn
注意
プールからプール・メンバーを削除すると、システムは直ちにプール・メンバーの監視を中止し、既存のパーシステンス・エントリを削除します。この操作によって、確立された既存の接続が中断されることはありません。接続は、クライアントが切断するか、接続がタイムアウトするまで継続されます。
:::


##Link
[K13310: Disabling nodes or pool members for maintenance (11.x - 16.x)](https://support.f5.com/csp/article/K13310)
mayaがエラー・ワーニングを吐く時の対処 5　~oneDriveの仕業~

mayaを起動したが様子がおかしい。
昨日まで出なかったワーニングが出る。
※ user は任意のユーザー名に置き換えてください


    // Warning: file: C:/Users/user/OneDrive/ドキュメント/maya/2019/prefs/shelves/shelf_Custom.mel line 40: Pixmap fileC:/Users/user/Documents/maya/scripts/animBot/_resources/img/icons_shelf/white/create_toggle_button_on_shelf_shelf.png not found, using default. // 

見覚えのない文字列が見える

**OneDrive**

mayaのプリファレンスが格納されているフォルダを確認してみると、
いつの間にか oneDriveのバックアップ対象になっていた。

見た目上は

    C:\Users\user\Documents

には中身が入ってるように見えるが、
どやらデータ上は

    C:\Users\user\OneDrive\ドキュメント

に全て移動されており、C:\Users\user\Documentsには実体ではないショートカット的な物に置き換わってしまっている様子。

    import os
    os.path.exists("C:/Users/user/Documents/maya")
    # Result: False # 

なので、問い合わせると存在しない事になってる。

バックアップの解除
--

スクリプトなどを対応すればいいのかもしれないが、面倒なので oneDriveのバックアップ機能を解除する。

**バックアップ解除前にドキュメントフォルダに入っている物をどこかにコピーして退避させておくか、何が入っていたかを確認できるようにスクリーンショットを取っておいた方がいい。**

oneDrive > 設定 > バックアップ管理 を開く

![oneDrive_backup.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/bcfc2d18-b2b2-04d6-80fa-ab73859b3d1a.png)
**バックアップを停止**を実行する。
ドキュメントフォルダに戻ってみると
![oneDrive_document.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/e85c8b63-5433-c914-03e7-97f15efd16d0.png)
ショートカットのみになっている。
ショートカット先(oneDrive)に移動して、ドキュメントに格納されていたファイル・フォルダを手動で移動して復旧させる。
真：Sorceryで複数モデルを扱う


ユーザと管理者で Model をわけたいと考えて以下の記事を参考にしました。

https://qiita.com/mzmt/items/cbc2e4f2a51ded97db83

`current_user`をオーバーライドしても、`login`などは適切に動きません。

ログを見ると `config` で指定していた `user_class`でログイン処理が走ります。

ソースコードを追っかけてみると・・・

```ruby:sorcery-0.16.1/lib/sorcery/controller.rb

module Sorcery
  module Controller

    module InstanceMethods

      # Takes credentials and returns a user on successful authentication.
      # Runs hooks after login or failed login.
      def login(*credentials)
        @current_user = nil

        user_class.authenticate(*credentials) do |user, failure_reason|
          if failure_reason
            after_failed_login!(credentials)

            yield(user, failure_reason) if block_given?

            # FIXME: Does using `break` or `return nil` change functionality?
            # rubocop:disable Lint/NonLocalExitFromIterator
            return
            # rubocop:enable Lint/NonLocalExitFromIterator
          end

          old_session = session.dup.to_hash
          reset_sorcery_session
          old_session.each_pair do |k, v|
            session[k.to_sym] = v
          end
          form_authenticity_token

          auto_login(user, credentials[2])
          after_login!(user, credentials)

          block_given? ? yield(current_user, nil) : current_user
        end
      end

      # attempts to auto-login from the sources defined (session, basic_auth, cookie, etc.)
      # returns the logged in user if found, nil if not
      def current_user
        unless defined?(@current_user)
          @current_user = login_from_session || login_from_other_sources || nil
        end
        @current_user
      end


      protected

      def user_class
        @user_class ||= Config.user_class.to_s.constantize
      rescue NameError
        raise ArgumentError, 'You have incorrectly defined user_class or have forgotten to define it in intitializer file (config.user_class = \'User\').'
      end
    end
  end
end


```

ということで下記のように `user_class` メソッドをオーバーライドしてあげると動作します。

```ruby:custom_controller.rb
  def user_class
    @user_class ||= Admin.to_s.constantize
  end
```
【PowerShell】CSV ファイルの内容をカスタムリストのリストアイテムとして追加する

CSV ファイルの内容を読み込んで、新規でカスタムリストを作成し、リストアイテムを追加する方法です。

------

## 関連ページ

- [【PowerShell】PnP.PowerShell を使用した SharePoint Online の操作 - Qiita](https://qiita.com/MakotoIshikawa/private/bdad2292c9078f1709fa)

---

## カスタムリストを作成する

CSV ファイル名のカスタムリストを作成します。

```powershell
using namespace System.IO;

# CSV ファイル情報
[FileInfo] $csv = '.\Announcements.csv'

# カスタムリスト作成
$newList = New-PnPList -Title $csv.BaseName -Template GenericList

[string] $ListName = $newList.Title
```

---

## リストに列を追加する

```powershell
# CSV ファイルインポート
$Items = ipcsv $csv

# 列情報取得
$Header = $Items[0] | Get-member -MemberType 'NoteProperty' | select Name

# 列追加
$Header | % {
    $colName = $_.Name
    if (!(Get-PnPField -List $ListName -Identity $colName 2>$null)) {
        Add-PnPField -List $ListName -DisplayName $colName -InternalName $colName -Type Text -AddToDefaultView | Out-Null
    }
}
```

---

## リストアイテムを追加する

```powershell
# CSV 取り込み
$Items | % {
    $Item = $_
    $hashtable = @{}
    foreach($property in $Item.psobject.Properties.name) {
        $hashtable[$property] = $Item.$property
    }
    Add-PnPListItem -List $ListName -Values $hashtable
}
```

# 参考サイト

- [Add-PnPListItem (PnP.Powershell) | Microsoft Docs](https://docs.microsoft.com/ja-jp/powershell/module/sharepoint-pnp/add-pnplistitem?view=sharepoint-ps)
UnityでOculusVR時に使えそう表現なサイト集

参考にしたサイトメモ
UniversalRenderPipelineで動作を考慮

### Unity設定

https://framesynthesis.jp/tech/unity/oculusquest/

### カーブするスクリーン

https://tips.hecomi.com/entry/2018/10/17/231337

### 波紋や水面

https://simplestar-tech.hatenablog.com/entry/2020/02/09/175237

https://qiita.com/aa_debdeb/items/1d69d49333630b06f6ce

### モザイク

https://github.com/simplestargame/UniversalRP-VR-MosaicShader

### もさもさ草や毛玉ファー

https://github.com/hecomi/UnityFurURP

### グラデーションのMaterial

https://qiita.com/nknk/items/e07ad9f1b2efda382cef

https://am1tanaka.hatenablog.com/entry/2019/12/09/182503

### sphereなどの内側でもテクスチャ表示

https://atsushishi.xyz/2017/07/texture_to_cube/

シェーダーに下記を追加

```
Cull Off
```
【備忘録】Windows11対応でない理由を検出する検出スクリプト 「WhyNotWin11」の使い方メモ

Windows11対応でない理由を検出する検出スクリプト「[WhyNotWin11](https://github.com/rcmaehl/WhyNotWin11)」を利用した確認方法のやり方メモ。

#１.コンパイルツールをダウンロード
https://www.autoitscript.com/site/autoit/downloads
AutoIt Full Installation　とある方をダウンロードしインストール

![AutoIt Full Installationのダウンロード.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212038/0bc57c9e-1258-157e-a079-8c621e33dd51.jpeg)


#２.ソースコード取得
https://github.com/rcmaehl/WhyNotWin11
からソースコードを取得
「[downloading zip](https://github.com/rcmaehl/WhyNotWin11/archive/main.zip) 」からZipをおとすのも可


#３.WhyNotWin11.au3　を右クリックしてコンパイル

![コンパイル.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212038/974a5789-6f3d-c772-ce80-70a704067b44.jpeg)


#４.WhyNotWin11.exe　をダブルクリックして起動

![Win11 対応チェック起動.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212038/9535be08-a260-0a1c-21af-3814500c73f6.jpeg)

画面キャプチャ取っていた自分のPCは、CPU互換性に引っかかってしまいました(´・ω・｀)。
プロフィールにタグを表示する

現在投稿系のアプリを作成してまして、その時にプロフィール画面のデザインで結構悩みました
結果としてはあまり欲張りすぎずにシンプルなデザインにすることで見やすいし、実装もし易くなりました。

<strong>欲張っていろいろ詰め込んでも見にくいだけですしね笑</strong>

それでも完全に手抜きで作るのではなくて自分なりにあったらいいなと思うのを探してみました。
<ul>
  <span>・ユーザーアイコン</span>
  <span>・ニックネーム</span>
  <span>・自己紹介文</span>
  <span>・好きなものを#で表示</span>
  <span>・編集</span>
</ul>
正直これくらいしか思いつかなかったです、、、、笑

<h1>実装していきます</h1>


＃の機能以外はそこまで苦戦しなかったのでコード貼っておきます

使っているgemです
<li>・devise(userのログインとか新規登録とかめっちゃ簡単にできます)</li>
<li>・carrierwave(画像のupするので使いました)</li> 
<li>・mini_magick(ユーザーがupした画像のリサイズです)</li>

```
<div class="text-center">
  <% if current_user.image? %>  #現在ログインしているユーザーのimageカラムに何も入っていなければこちらで用意した[dummy.png]を表示する
    <%= image_tag current_user.image.url, class: "image" %>
  <% else %>
    <%= image_tag "/dummy.png", :size => '100x100' %>
  <% end %>
  <br>

  <div class="text-center fa-2x">　
    <%= current_user.nickname %>
    <hr>
  </div>
</div>

<div class="mt-2">
  <div class="pl-3">
     <%= current_user.profile %>
  </div>
</div>

```


＊僕はcurrent_userを使っていますが、Userモデルで以下のようにidに対応するユーザーの情報を@userに代入していればcurrent_userを@userに置き換えることもできます＊

```
@user = User.find_by(id: params[:id])
```


<h1>苦戦したハッシュタグをつける</h1>
僕の説明が下手過ぎてどんな機能を付けたいか想像がついてないと思いますので参考になる画像を探してきました
これはqiitaのプロフィール画面にあるタグです。
ちょうどこんな機能を付け加えようと思っていたのでデザインを参考にしました。
僕は各タグの先頭に"#"をつけるようにして実装したいと思います
例:(#Javascript)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1541345/c5bc70aa-a1c2-b1f3-75e6-3a2b59edbd67.png)

<h1>具体的な動作</h1>
タグを表示してそこから選ぶといった感じの動作が多いと思いますが、今回僕が作る動作は選択肢を作らずにプロフィールの編集画面でtext_fieldにカンマ区切りで記載してもらってそれを識別して一つ一つ#付けて表示する感じです。
説明下手ですみません、、

-------------
例：編集画面
　　　　text_field
  Javascript,html,ruby,rails,

　　プロフィール画面
 #Javascript #html #ruby #rails
こんな感じです！

----------

カラムを一つずつ取り出すといった動作だと

```ruby:users_controller
 @users = User.all
```

```ruby:application.html.erb
  <% @users.each do |user| %>
    <%= user.name %>
 <% end %>
```
User.allで情報を全て取得して、それをeachで一つずつ取り出しています。
この場合だと全てのユーザーのnameカラムが表示されます


<h5>これを改良していきます。</h5>
まずは、mypageで使えるように@usersの部分を定義しないといけません。
今回は好きな飲み物を表示させたいので、@drinksといった変数を定義します。
もちろんこれに対応したカラムも追加します。

"favorites_drinks"
（この中には複数のタグが含まれると思ったので複数系にしましたがカラムに保存されるときはタグじゃなくてテキストとして保存されるので、、、）
これを新しいカラムとして追加しました

まだ何の処理も書いていないのでこの中には入力された文がそのまま入ります。
さきほどの@usersの例に倣うと、@drinksの中に複数のデータを入れればうまくいきそうです。

<strong>ここが一番悩みました</strong>
xxxxxx,xxxxx,xx,xxx,xxxxxx　といったテキストを指定した文字で区切る場合には
"split"メソッドを使います。
これを使うことによって@drinksに配列で情報が入れられます。
@drinks = ["xxxxxx","xxxxx"]みたいな感じです
後はこれをeach使って一つずつviewで表示すれば良いだけです！

```
@drinks = favorites_drinks.split(",") *()の中に識別する文字を指定する指定する。スペースや改行も指定できるみたいです
```

```ruby:mypage.html.erb
   <% @drinks.each do |drink| %>
     <%= drink %>
   <% end %>
```
これで一つずつ表示されます。
このままでは味気ないので冒頭で書いた#を付けて表示するようにします
ここで使うのは式展開といった動作です。

```ruby:mypage.html.erb
   <% @drinks.each do |drink| %>
     <%= "＃ #{drink}" %> 　　＊"#{drink}"の部分が式展開の書き方です＊
   <% end %>
```


こう書くことで#を先頭に付けてドリンクの種類が表示されます！

間違いとうありましたら教えていただけると幸いです！
M5Stack Core2: NTP で時刻を合わせる

こちらのプログラムを参考にしました。
[Study:M5Stack Core2 / RTC & touch](https://qiita.com/kaoruka/items/b36c99fb124fea0d5d24)

![IMG_20210902_105316.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/5abf2064-5cea-1d82-7fbe-704554d279ea.jpeg)

## プログラム

```text:ntp_adjust/ntp_adjust.ino
// ---------------------------------------------------------------
/*
	ntp_adjust.ino

					Sep/02/2021

*/
// ---------------------------------------------------------------
#include <M5Core2.h>
#include <time.h>
#include <WiFiMulti.h>

// for WiFi
char ssid[] = "some-ssid";
char password[] = "some-password";
WiFiMulti wifiMulti;

// for Time
const char* ntpServer = "ntp.jst.mfeed.ad.jp";
const long  gmtOffset_sec = 9 * 3600;
const int   daylightOffset_sec = 0;
RTC_DateTypeDef RTC_DateStruct; // Data
RTC_TimeTypeDef RTC_TimeStruct; // Time
static const char *wd[7] = {"Sun","Mon","Tue","Wed","Thr","Fri","Sat"};
struct tm timeinfo;
String dateStr;
String timeStr;

// ---------------------------------------------------------------
void getTimeFromNTP()
{
	// To get Time from NTP server
	configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
	while (!getLocalTime(&timeinfo))
		{
		delay(1000);
		}
}

// ---------------------------------------------------------------
void setNTP2RTC()
{
	// timeSet
	getTimeFromNTP();
	getLocalTime(&timeinfo);
	// read RTC
	M5.Rtc.GetTime(&RTC_TimeStruct);
	M5.Rtc.GetDate(&RTC_DateStruct);
	// --- to over write date&time
	RTC_DateStruct.Year = timeinfo.tm_year + 1900;
	RTC_DateStruct.Month = timeinfo.tm_mon + 1;
	RTC_DateStruct.Date = timeinfo.tm_mday;
	RTC_DateStruct.WeekDay = timeinfo.tm_wday;
	M5.Rtc.SetDate(&RTC_DateStruct);
	RTC_TimeStruct.Hours = timeinfo.tm_hour;
	RTC_TimeStruct.Minutes = timeinfo.tm_min;
	RTC_TimeStruct.Seconds = timeinfo.tm_sec;
	M5.Rtc.SetTime(&RTC_TimeStruct);
}

// ---------------------------------------------------------------
void setup()
{
	M5.begin();
	M5.Lcd.fillScreen(BLACK);
	M5.Lcd.setTextColor(WHITE,BLACK);

	wifiMulti.addAP(ssid, password);

	Serial.println("*** setup *** end ***");
}

// ---------------------------------------------------------------
void loop()
{
	M5.Rtc.GetDate(&RTC_DateStruct);
	M5.Rtc.GetTime(&RTC_TimeStruct);
  M5.Lcd.setTextSize(3);
	M5.Lcd.setCursor(10, 60, 1);
	M5.Lcd.printf("%04d.%02d.%02d %s\n", RTC_DateStruct.Year, RTC_DateStruct.Month, RTC_DateStruct.Date, wd[RTC_DateStruct.WeekDay]);
 M5.Lcd.setTextSize(5);
	M5.Lcd.setCursor(30, 140, 1);
	M5.Lcd.printf("%02d:%02d:%02d", RTC_TimeStruct.Hours, RTC_TimeStruct.Minutes, RTC_TimeStruct.Seconds);

	delay(500);
}

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

## Arduino IDE
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/5db0d9ae-14e9-d83f-dcd2-541b04f20f9f.png)
【1枚目】おっさんが入門CakePHP　(動画第1回～第2回)

チャンスラボの岡本です。

弊社の東京メンバーが、CakePHPの入門動画を作成して公開しているのですが
諸事情により当動画を見て勉強することになりました。

<B>第1回：webシステムとは</B>
https://www.youtube.com/watch?v=Cco9S1ZDOa4&t=94s
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102625/40db93d2-4a4c-df73-3320-9006360596c1.png)
動画短いな。
7分弱なんで気楽に見れるかもだが。
一応技術者として理解しているつもりなので1.5倍速で見ました。
なるほど、初心者にも分かり易いと思われる。
技術系サイト見る様な人なら抑々知っとるわい。って感じ。

----

<B>第2回：XAMPPインストール</B>

https://www.youtube.com/watch?v=PDLEry8GxDA&t=302s


WEBシステムのおさらいとXAMPPの説明を簡単にした後は
ダウンロードからのインストール
インストール時に気になるUACについても説明してあり親切に感じた。
↓　コレね
![war_usc.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102625/4a88ba3d-777d-0be5-3c99-a34ac4e410c9.png)

Apache起動してWEBサーバが動いているのかブラウザで確認するところまで行いこの回は完了。

正直、ハウツー物を動画で見るのは面倒だなって思ってたのだけど
バージョンの注意とかも説明してるのはイイね。
※入門系のWEBサイト見ても書いて無かったりして引っかかることはアルアルなので

次の第３回でやっとCakePHPをインストールするらしい。

あー、PHPは別途おさらいしないとだな
とりあえず動画見て進めて行って困ったらググっろうかな～

9月中にCakePHPを使ってWEBシステム作れるところまで進める予定ヨ
[Java基礎④] while処理/繰り返し回数もランダムにする　Math.random

<h2>初めに</h2>
Java学習開始４日目です。
今回はwhile処理を学習しました。

<h2>While処理の基本形</h2>

```java:コード
public class Main {
    public static void main(String[] args) {
        int i = 0;    // カウンタ変数の初期化
        while (i <= 5) {
            System.out.println(i);    // 繰り返し処理
            i += 1;    // カウンタ変数の更新
        }
    }
}
```

<h2>繰り返しの回数をランダムにする</h2>

```java
public class Main {
    public static void main(String[] args) {
        int hp = 30;
        int hit;    // カウンタ変数の初期化
        while (hp > 0) {
            hit = (int)(Math.random()*5 + 5);
            System.out.println(hit + "のダメージを与えた");    // 繰り返し処理
            hp -= hit;    // カウンタ変数の更新
        }
            System.out.println("敵を倒した");
    }
}
```

まず、```int hit;```の値は、```hit = (int)(Math.random()*5 + 5);```
でランダムに出力されます。
```hp -= hit;```でhpの値もランダムになるため、
繰り返しの回数もランダムになります。
nRF connect SDK:カスタム基板の追加

#カスタムボードの追加
nRF SDKではプロジェクトオプションでBOARD_CUSTOMと指定してcustom_board.hに設定を記述しますが、当然nRF connect SDKにもあります、というかないと困ります。仕事で基板を作っているのであれば評価ボードを使って実装するなんてまずありませんからね・・・。
なお、情報源はこちらです(英語)

https://developer.nordicsemi.com/nRF_Connect_SDK/doc/latest/zephyr/guides/porting/board_porting.html

##カスタムボード情報を作る
前述のようにnRF SDKではプロジェクト内部にcustom_board.hがあればよかったのですが、nRF connect SDKではSDKとしてボード情報が必要になります。
##既存ボードファイルのコピー
上記ページにも記載があるように自分のプロジェクトに一番近いボード情報をOS上でコピーします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340602/32e7e3fd-c05d-c523-f270-7680d295ece6.png)
でもって名前を適当に変えてみます。ちなみにこのフォルダー名がそのままボード名になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340602/1ebb58d6-9019-49b2-1c6d-ce34440622b6.png)
ここで重要なルールが二つあります。まず一つは、ボードファイルはこのフォルダーに置く必要があるということ。Gitで管理しようと思って違うフォルダーに持っていくとコンフィギュレーションに失敗します。なんてこったい、こんなのGitで管理するのめんどくさいじゃないか！
もう一つはベンダー名を識別するための識別子をフォルダー名に入れる必要があるということ。標準でSDKに用意されているボード名にはNucleoやらnRF52840やらプロダクト・ベンダーが分かる名前が入っています。SDKを使うユーザーが使い易い(分かり易い)ようにそうしていると思っていたのですが、どうやらこれは使用するチップを識別するための識別子にもなっており、識別子がないとコンフィギュレーションが通りません。なお、識別子自体はフォルダー名のどこに含まれていてもかまいません。参考までにNordicの識別子はどうもnRF52(or nRF51 or nRF53 or nRF91)のようです。

:::note warn
フォルダーのパスは変更しない
ボード名には必ず識別子を入れる
:::

さらにそのフォルダ下にある関連ファイルの名前をフォルダー名と同じ名前に変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340602/cbe82772-f095-cd81-0665-417d5089a029.png)
ここまでで一旦ファイル生成と名称変更は完了です。
##CONFIG(#define)の変更
続いてファイルの中身に手を加えます。ボードの識別子になっているCONFIG_BOARD_NRF52840DK_NRF52840の名前を変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340602/2e16ecdc-4f76-9acf-0ec5-e8cff75c03f4.png)
GREPで検索してみると全部で4ヶ所存在しているみたいなのでこれを全部先ほどのボード名と同じ識別子にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340602/e70b788b-4bb8-cc99-eba3-177f447a2cfa.png)
全部書き換えていなくなりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340602/ef81bf92-227a-03a6-f7e7-15b14e093596.png)
さて、ここまでできたら登録完了です。Segger Embedded Studioに移ってOpen nRF connect SDK Projectでプロジェクトを開く画面を見てみると・・・。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340602/728d89fb-8e00-f072-b798-4e87d483a793.png)
ちゃんといますね。これで登録は完成です。
I/Oなどの機能を変更するにはDTSファイルの中身を変更します。これがまた非常にやっかいなのですが・・・。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340602/0f3bad87-1eb0-ccfe-70f3-2b8c0e0b9750.png)
nRF connect SDK:USB DFU 

# 初めに
この記事は古いです。
現時点でどうなっているのかは分かりませんが、自分自身が今のところUSB DFUを必要としないので今後の更新もおそらくありませんし、調べることもしないと思います。
せっかくなので当時調べて書いたものを公開しておきます。

# ようやくDFUに辿り着いた・・・？
探しているのはBLE DFU(FOTA)ですが、その関連の記事を読んでもさっぱり理解できない(笑)ので、やれることから順番にやっていこうと思います。それにUSB DFUだって知っているのと知らないのでは大違いですしね。
やっと見つけました。
https://devzone.nordicsemi.com/nordic/nrf-connect-sdk-guides/b/software/posts/device-firmware-update-dfu-with-mcuboot-bootloader

実際にやることは上記のスレッドの内容そのままなのでここでは省略します。別にあえて日本語で再度説明することでもないですし。

ところがいざ実行してみると・・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340602/78c22212-cf2e-9c98-be12-a02b8510617e.png)

なんじゃこりゃあ！(by 松田優作)
やっと見つけてようやくうまくいく・・・と思っていたらなぜか動きません。なんでなんだよコンチクショウ！

メッセージを見る限りではBOOT_MAX_IMG_SECTORSの設定が128では小さすぎると言っているように見えます。じゃあ、ということで

```prj.conf
CONFIG_BOOT_MAX_IMG_SECTORS=144
```

とりあえず144くらいに増やせばいいのかなぁ・・・。セクターって言っているから1セクター4Kbytesで64Kbytesも増えれば十分でしょ。

・・・ダメでした。
じゃあ思い切って256くらいにしてみるか。コンパイラーがエラーさえ出さなければきっと大丈夫なはず！

・・・これでもダメでした。
ここらへんでさすがに「いや、これはこの設定が間違っているわけじゃないよね。きっと間接的に何かが間違っていてこのメッセージが出ているんだ」と気が付きますが何をいじっていいのか皆目見当もつきません。
ということでエラーメッセージで検索してみると・・・やっぱり同じことを言っているスレッドがありました、ええ。
https://devzone.nordicsemi.com/f/nordic-q-a/77483/mcuboot-reading-sectors-failed-problem-with-nrf-sdk-v1-6-0
残念ながらこのスレッドでは解決方法は示されていませんでした。つまり「よく分からない」というのが結論になります。

###ちなみにBootloaderそのものは生きているっぽい
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340602/b92c868d-6b43-2b97-9bc5-555128b00390.png)

Bootloaderを立ち上げて見たらCOMポートが出てくるので、DFUそのものは生きていると思われますが、通常アプリケーションが動かないのでは意味がないですよね・・・。
#どういうことなの？このスレッドがインチキなの？
考えても考えても全く分からないので、こういう時はバージョンも含めて合わせて検証するのがスジってもんです。nRF connect SDKをインストールしたりアンインストールしたりするのが非常にめんどくさいし時間ももったいないなとは思いますが、理解できない現象にぶち当たっている以上はやるしかないです。
ということでスレッドで使用されているバージョンと同じSDK 1.4.0をインストールして同じことをしてみたら・・・。
**できた！！！**
###つまり・・・
ここまで検証ができたらだいたい想像がつくと思いますが、どうも新しいSDKの不具合なんじゃないかという気がしてきたわけです。仮に不具合じゃなくて何かしら解決方法があるとしても現時点ではどれだけ調べても分からないので、そういうのはもう不具合だと割り切って見捨てるべきです(笑)
###でも・・・
でもどうせ使うならなるべく新しいSDK使いたいですよね。どう違うのかよく分かっていないですが(笑)
ということで、全く同じことをSDK 1.5.1で試してみましたが・・・。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340602/4247a6e4-88f4-5e3f-95ae-fa719adc3f20.png)
お、ちゃんと動くじゃないですか！
ということで当面はSDK 1.5.1で色々と進めていきたいと思います。
言うまでもないですがもちろんDFUもできますよ！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340602/a8dad731-a0b3-e916-070a-e673480ba444.png)
Power Automate sharepoint アイテムまたはフォルダーへのアクセス権の付与 IDの取得・確認方法

# Power Automateを使ってSharepointのフォルダへのアクセス権限を付与する

「アイテムまたはフォルダーへのアクセス権の付与」を使うとき対象アイテムの「ID」の入力が必須となり、これがわからずとにかく時間を取られたので、メモ。

![スクリーンショット 2021-09-02 10.21.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1927744/94f1f613-1709-e105-8e2d-eaffa92edec7.png)


# SharepointのWeb画面上で超簡単に確認できる

1.Sharepointへアクセスしてドキュメントまで移動
2.名前の横のID列で確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1927744/62006413-3e20-e5d7-e77e-b39cf213ca1d.png)

.
.
.


ID列が出ていないので、苦戦したわけです。
ということでID列の表示方法はこちら。

# ID列の表示方法

1.列の追加をクリックして列の表示/ 非表示を選択
（上の画像でいくと、更新者列の右列）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1927744/cd3adeae-8399-76b2-d339-bdc51c8215ce.png)

2.IDにチェックを入れて、適用

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1927744/aa93defe-c8a0-8928-61de-c388f659e87c.png)


これでIDが表示されるようになります。


以上！
python3でコーディングテストに受かるための自分メモ[9/2] (break, continue, pass)

### ループから抜けたい
pythonでループから抜けたり、処理をスキップする処理について
##### break
pythonでループ処理そのものからから抜け出したい場合は
breakが使える
##### continue
ループ処理の現在のループを抜けて次のループに移動したい場合は
continueが使える

####新情報
##### pass
処理が決まっていない時などに、passを使うことで
通常if文の中は1行何かしらの処理がなければいけないが
passを書くことができる。
passは名前どうり処理をpassするだけなので
passの後に処理を書くとその処理は実行されてしまう。
使い方として、処理が確定していないときに書くのが良いだろう。

#### goto系のジャンプはできないのか
結論できる。
moduleをインポートする必要があるのでバニラのpythonではできないので、
今回のテスト対策では必要ないだろう。
CloudReady をSurface3で試してみる

まあ、ほとんど読む価値もない記事だけど、やってみたので投稿

#CloudReadyって？
PCにChromebook相当をインストールするツール。[開発元がGoogleグループ](https://cloudreadykb.neverware.com/s/article/Neverware-is-now-part-of-Google-FAQ)になってるので、時期に公式化されるのでは。
#何がいいの？
動作が軽いので古めのPCでも軽快に動作する。セキュリティ関係がChrome相当になるので期限切れWindowsより安心
#なんでSurface３？
家にある古めのPCで動くのがもうSurface３しかなかったから

#結論
さすがに*Surface３*では辛い
Surface３　2015年発売
intel Atom x7-Z8700
メモリー2GB
SSD　64GB

#方法
８GくらいのUSBドライブを用意し、WindowsPCにぶっ刺します。中身ナイやつ用意してね

[CloudReadyのサイト](https://www.neverware.com/freedownload#intro-text)に行きます

Download USB Maker をクリック。画面に従ってUSBドライブに作成

SurfaceをUSBブートします。音量大ボタン長押し→音量小ボタンと電源ボタン→BIOSもしくはUSBでブート

あとは画面に従ってインストールで起動までいきました

本格的に使うには、このあと本体にインストール（＝Windowsを消去する）です

#実感
USB起動のままだと遅い。重い。
おそらくは<Font color="Red">メモリが２Gしかない(CloudReadyの最低スペック)</Font>のでスワップしまくり＆USBドライブにスワップだから遅い

#問題
**キーボード認識してくれない**。ので、キーボードについてるタッチパッドも使えない。
**画面のタッチスクリーンは使えた**

もうWindowsとして使わない、であれば、USB起動ではなく、インストールをしてみると実際はもう少し早いのだろうと思うけど、タイプカバーのキーボードが使えないので断念

SurfacePro等ではキーボードも動いているようで残念なり。中古ノートをかってインストール、も考えたけど、そのお金で普通に中堅Chromebook買えるのでこちらも断念

#やりたかった事
あわよくばSurface３の復活と、低スペックChromebookってつかえるのかを見てみたかった
しかし、Surface３では厳しく、低スペックChromebookのほうがスペックが上だった（笑
今度、ヨドバシいったときにもう少し低スペックChromebook触ってみよう
WindowsでもDocker DesktopなしでDocker使いたい

とりいそぎ書きなぐっておきます。あとで更新するかも。

基本方針：自分でWSL2にdocker-ceを入れる （[Ubuntuの例](https://docs.docker.com/engine/install/ubuntu/)）

※containerdとか~~podmanとか~~はsystemd必須っぽいので……→[なんだ、podmanでいいのかー](https://zenn.dev/koduki/articles/ba54daaba28f93)（情報共有感謝！）

注意点

- [WSL2をインストールして使うときの注意点](https://qiita.com/matarillo/items/98d7452967987fe5d633)
- systemdがないので、（[力技でsystemdを動か](https://qiita.com/matarillo/items/f036a9561a4839275e5f)さないなら）ちょっと手間
  - cgroupfs-mount もインストールして、dockerdを動かす前に実行した
  - systemdはないけど、sudo service docker start/stop はできる
- docker cliはWSLで叩くならそれでもいいけど、もしcmdやpsから動かしたいなら
  - [github.com/docker/cli](https://github.com/docker/cli) をWindowsでどうにかビルドするか（golangなので、何とかなると思う）
  - 有志がビルドした [github.com/StefanScherer/docker-cli-builder](https://github.com/StefanScherer/docker-cli-builder) からとってくる。ちなみにこれは[chocoで入手できるdocker cli](https://community.chocolatey.org/packages/docker-cli)の本体
  - WSL2の[docker engineの起動オプション](https://docs.docker.jp/config/daemon/daemon.html#configure-the-docker-daemon)で、Unix Domain SocketじゃなくてTCPで待ち受けるようにする
     - dockerd に -H オプションを与えるか、
     - /etc/docker/daemon.json ファイルを作って設定する
  - クライアントになるdocker cliコマンドも-Hオプションでdocker engineにTCPでつなぐようにする
【PowerShell】フォルダを指定してリストアイテムに添付ファイルを追加する

添付ファイルとして追加するファイルが格納されたフォルダのパスを指定して、Sharepoint カスタムリストのリストアイテムに添付ファイルを追加する方法です。

---
## 関連ページ

- [【PowerShell】PnP.PowerShell を使用して SharePoint Online のリストを操作する](https://qiita.com/MakotoIshikawa/private/bdad2292c9078f1709fa)

---
## リストアイテムに添付ファイルを追加する

同名のファイルを添付しようとするとエラーになる為、それを考慮しています。

---

```powershell
# 追加するファイルが格納されたフォルダ
$FolderPath = 'C:\Data'
[System.IO.FileInfo[]] $AddFiles = dir $FolderPath -Recurse -File

# リストアイテム情報取得
$ListName = 'Announcements'
$Id = 2
$item = Get-PnPListItem -List $ListName -Id $Id
$AttachmentFiles = Get-PnPProperty -ClientObject $item -Property AttachmentFiles

# 上書きするかどうか
$Overwrite = $true
if ($Overwrite) {
    # 同名のファイルを削除
    $AttachmentFiles | ? FileName -in $AddFiles.Name | % {
        Remove-PnPFile -ServerRelativeUrl $_.ServerRelativeUrl -Force
    } 

    # すべてのファイルを追加
    $AddFiles | % {
        $at = New-Object Microsoft.SharePoint.Client.AttachmentCreationInformation
        $at.FileName =  $_.Name
        $at.ContentStream = $_.OpenRead()
        $item.AttachmentFiles.Add($at)
    }
} else {
    # 添付ファイルに存在しないファイルのみを追加
    $AddFiles | ? Name -notin $AttachmentFiles.FileName | % {
        $at = New-Object Microsoft.SharePoint.Client.AttachmentCreationInformation
        $at.FileName =  $_.Name
        $at.ContentStream = $_.OpenRead()
        $item.AttachmentFiles.Add($at)
    }
}
Invoke-PnPQuery
```

---
# 参考サイト

- [AttachmentCreationInformation Class (Microsoft.SharePoint.Client) | Microsoft Docs](https://docs.microsoft.com/dotnet/api/microsoft.sharepoint.client.attachmentcreationinformation?view=sharepoint-csom)
- [SharePoint Online: Add Attachment to List Item using PowerShell - SharePoint Diary](https://www.sharepointdiary.com/2017/02/sharepoint-online-add-attachment-to-list-item-using-powershell.html)
osを作る その9

#概要

osを作る。
heliosを使ってみた。

#サンプルコード

```
#include "HeliOS_Arduino.h"

void taskSerial(xTaskId id_) {
	String str = "";
	int16_t tasks = 0;
	xTaskGetListResult tres = xTaskGetList(&tasks);
	if (tres) 
	{
		for (int i = 0; i < tasks; i++) 
		{
			str = "";
			str += "taskSerial(): id = ";
			str += tres->id;
			str += ", name = ";
			str += tres->name;
			str += ", state = ";
			str += tres->state;
			str += ", ltime = ";
			str += tres->lastRuntime;
			str += ", ttime = ";
			str += tres->totalRuntime;
			Serial.println(str);
		}
	}
	xMemFree(tres);
}
void setup() {
	xTaskId id = 0;
	xHeliOSSetup();
	Serial.begin(9600);
	id = xTaskAdd("TASKSERIAL", &taskSerial);
	xTaskWait(id);
	xTaskSetTimer(id, 1000000);
}
void loop() {
	xHeliOSLoop();
}





```

#結果

```
taskSerial(): id = 1, name = TASKSERIAL, state = 3, ltime = 0, ttime = 0
taskSerial(): id = 1, name = TASKSERIAL, state = 3, ltime = 9924, ttime = 9924
taskSerial(): id = 1, name = TASKSERIAL, state = 3, ltime = 16312, ttime = 26236
taskSerial(): id = 1, name = TASKSERIAL, state = 3, ltime = 18444, ttime = 44680
taskSerial(): id = 1, name = TASKSERIAL, state = 3, ltime = 18444, ttime = 63124
taskSerial(): id = 1, name = TASKSERIAL, state = 3, ltime = 18448, ttime = 81572
taskSerial(): id = 1, name = TASKSERIAL, state = 3, ltime = 18444, ttime = 100016
taskSerial(): id = 1, name = TASKSERIAL, state = 3, ltime = 19524, ttime = 119540
taskSerial(): id = 1, name = TASKSERIAL, state = 3, ltime = 19512, ttime = 139052
taskSerial(): id = 1, name = TASKSERIAL, state = 3, ltime = 19512, ttime = 158564
taskSerial(): id = 1, name = TASKSERIAL, state = 3, ltime = 19516, ttime = 178080
taskSerial(): id = 1, name = TASKSERIAL, state = 3, ltime = 19512, ttime = 197592
taskSerial(): id = 1, name = TASKSERIAL, state = 3, ltime = 19512, ttime = 217104
taskSerial(): id = 1, name = TASKSERIAL, state = 3, ltime = 19520, ttime = 236624
taskSerial(): id = 1, name = TASKSERIAL, state = 3, ltime = 19508, ttime = 256132
taskSerial(): id = 1, name = TASKSERIAL, state = 3, ltime = 19512, ttime = 275644
taskSerial(): id = 1, name = TASKSERIAL, state = 3, ltime = 19516, ttime = 295160
taskSerial(): id = 1, name = TASKSERIAL, state = 3, ltime = 19512, ttime = 314672
taskSerial(): id = 1, name = TASKSERIAL, state = 3, ltime = 19520, ttime = 334192


```

以上。
AIDEとチェックサム

# AIDE
AIDE はホストベースの侵入検知システム (HIDS) でファイルの整合性をチェックします。最初の実行時にファイルのベースラインとなるデータベースを作成して、次の実行時にはシステムに対してデータベースで確認することで侵入検知します。パーミッション、変更日時やファイルの中身など、様々なファイルのプロパティをチェックできます。

# 設定の見方
チェックできるデフォルトルールの組み合わせ で 対象のディレクトリをチェックしていく

- ルール

```
ftype ファイルタイプ
p	パーミッション
i	iノード
n	リンク数
u	ユーザ
g	グループ
s	サイズ
b	ブロック数
m	ファイル更新時間
a	ファイルアクセス時間
c	フィアル作成時間
S	増分サイズ
acl	アクセスコントロールリスト
selinux	SELinuxセキュリティコンテキスト
xattrs	拡張ファイル属性
md5	md5チェックサム
sha1	sha1チェックサム
sha256：sha256チェックサム
sha512	sha512チェックサム
rmd160	rmd160チェックサム
tiger	tigerチェックサム
havel	havelチェックサム
gost	gostチェックサム
crc32	crc32チェックサム
whirlpool	whirlpoolチェックサム
R	p+i+n+u+g+s+m+c+acl+selinux+xattrs+md5
L	p+i+n+u+g+acl+selinux+xattrs
E	Empty Group
>	p+u+g+i+n+S+acl+selinux+xattrs
```


- カスタムルール
ルールを組み合わせたもの
MyRule = p + i + n + u + g + s + b + m + c + md5 + sha1

# チェックサムとは？
誤り検出符号の一つで、データ列を整数値の列とみなして和を求め、これをある定数で割った余り（余剰）を検査用データとするもの。
最も単純な誤り検出方式の一種で、誤りの検出精度は低いが原理が簡単で容易に実装でき、計算コストも低いため、簡易な誤り検出方式として広く普及。
要は、ファイルの「同一性」を確認できる。

## ローカルで検証
何も変更がないとチェックサムは変わらない

```sh
❯ shasum -a 256 hoge.txt
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855  hoge.txt

~/Desktop
❯ shasum -a 256 hoge.txt
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855  hoge.txt

~/Desktop
❯ shasum -a 256 hoge.txt
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855  hoge.txt
```

ファイルを更新すると変わる

```sh
~/Desktop
❯ echo "hoge" >> hoge.txt

~/Desktop
❯ shasum -a 256 hoge.txt
678e851755589c2ed8905b10e0e8302a694af7e40ee86abacfa4bddfba859bb1  hoge.txt
```

内容を元に戻す

```sh
~/Desktop
❯ vim hoge.txt

~/Desktop
❯ shasum -a 256 hoge.txt
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855  hoge.txt
```


# 参考
https://aide.github.io/doc/
https://hacknote.jp/archives/20260/
https://wiki.archlinux.jp/index.php/AIDE
[Python3 / numpy] numpy.all()のバグ？ pandasのDataFrame内にあるNoneがTrue扱いになる

# 概要

DataFrameの中に`None`が紛れていることはよくあると思うのですが、そんなDataFrameを`numpy.all()`で判定させると`True`として処理されていることがわかりました。


# Versions

|module|version|
|:---|:---|
|python|3.8.1|
|pandas|1.3.2|
|numpy |1.21.2|


# バグ？

```python
import numpy as np
import pandas as pd

x1 = [None, True, False, False, True]
x2 = [None, False, True, True, False]

df = pd.DataFrame({'x1': x1, 'x2': x2})

np.all(df, axis=1)

# --- Result ---
0     True
1    False
2    False
3    False
4    False
# --------------
```

`None`と`None`の組み合わせが`True`になっている(´；ω；｀)ﾌﾞﾜｯ

# 対策

この書き方なら問題ないです。
DataFrameを経由しなければよい。

```python
import numpy as np

x1 = [None, True, False, False, True]
x2 = [None, False, True, True, False]

x1_nda = np.array(x1)
x2_nda = np.array(x2)

np.all([x1_nda, x2_nda], axis=0)

# --- Result ---
array([None, False, False, False, False], dtype=object)
# --------------
```

# 考えること

後で開発コミュニティに聞いてみたいけれど、聞くとしたら`pandas`の人に聞いた方が良いのか、`numpy`の人に聞いた方が良いのか悩む....。

numpyの方が先に開発されている？はずだから、pandas側が直すのが筋が通ってるのかな。。。？
ちょっとわからないな(。´・ω・)
【Android】Android 12対応をする前にplay-services-analyticsのバージョンを確認しよう

## 結論
v17.0.1以上に上げればOK

```gradle:build.gradle
com.google.android.gms:play-services-analytics:17.0.1
```
https://developers.google.com/android/guides/releases#august_19_2021
>The latest update to the Analytics library includes the following change:
>・Fixed issue where library could not be built with Android 12 as its target.


## 何が修正されたのか（何が悪さをしていたのか）
初期化時に呼ばれるクラス内にAndroid12から必須となった可変性フラグが宣言されていないPendingIntentがあった

```java:Application
GoogleAnalytics.getInstance(requireContext())
```

```log:logcat
2021-07-27 22:57:39.172 15557-15697/hogehoge E/AndroidRuntime: FATAL EXCEPTION: DefaultDispatcher-worker-1
    Process: hogehoge, PID: 15557
    java.lang.IllegalArgumentException: hogehoge: Targeting S+ (version 31 and above) requires that one of FLAG_IMMUTABLE or FLAG_MUTABLE be specified when creating a PendingIntent.
    Strongly consider using FLAG_IMMUTABLE, only use FLAG_MUTABLE if some functionality depends on the PendingIntent being mutable, e.g. if it needs to be used with inline replies or bubbles.
        at android.app.PendingIntent.checkFlags(PendingIntent.java:375)
        at android.app.PendingIntent.getBroadcastAsUser(PendingIntent.java:645)
        at android.app.PendingIntent.getBroadcast(PendingIntent.java:632)
        at com.google.android.gms.internal.gtm.zzbv.zzfe(Unknown Source:52)
        at com.google.android.gms.internal.gtm.zzbv.cancel(Unknown Source:54)
        at com.google.android.gms.internal.gtm.zzbv.zzaw(Unknown Source:4)
        at com.google.android.gms.internal.gtm.zzan.zzag(Unknown Source:7)
        at com.google.android.gms.internal.gtm.zzap.<init>(Unknown Source:67)
        at com.google.android.gms.internal.gtm.zzap.zzc(Unknown Source:82)
        at com.google.android.gms.analytics.GoogleAnalytics.getInstance(Unknown Source:15)
        ~~~~
```

可変性フラグとは
>Android 12 をターゲットとするアプリでは、アプリが作成する個々の PendingIntent オブジェクトの可変性を指定する必要があります。この追加要件により、アプリのセキュリティが強化されます。
>https://developer.android.com/about/versions/12/behavior-changes-12?hl=ja#pending-intent-mutability

v17.0.1未満では上記が原因でGA利用、（初期化の場所によるが）アプリがまともに起動できない状況に遭遇します。
Android12対応をしていく中で、自アプリ内のPendingIntentに可変性フラグを追加していくかと思いますが、それでもクラッシュが発生する際にはGA SDKのバージョンがv17.0.1未満になっていないか確認してみてください。

## 最後に
v17.0.1のアップデート自体、Android 12 Beta4が出たあとにリリースされており、なるべく早くAndroid12対応を進めていきたいアプリにとってはv17.0.1が出るまではGA SDKの削除を迫られるような状況となっていました。
今後のことを考えると**これを機に[推奨](https://support.google.com/firebase/answer/9167112)されている[Firebase Analytics](https://firebase.google.com/docs/analytics/get-started?platform=android)への移行を検討してみてもいいかも知れません。**
【Swift】平面座標系でのベクトルの内積の公式を用いてある3点からなるなす角を求める方法

# サンプルコード

タイトルの通りです。
環境：Xcode12.5.1

```swift
import Foundation

struct RectangularCoordinateSystemPoint {
    let x: Double
    let y: Double
    
    init(_ x:Double, _ y:Double) {
        self.x = x
        self.y = y
    }
}

extension RectangularCoordinateSystemPoint {
    func getSubtendedAngle(_ pointA: RectangularCoordinateSystemPoint, _ pointB:RectangularCoordinateSystemPoint) -> Angle {
        // 始点を自身の点Pとする
        let pointP = self

        // 点Aと点Bまでのベクトルを宣言する
        let vectorPA = RectangularCoordinateSystemVector(from: pointP, to: pointA)
        let vectorPB = RectangularCoordinateSystemVector(from: pointP, to: pointB)

        // ベクトルの大きさと内積を求める
        let magnitudePA = vectorPA.magnitude
        let magnitudePB = vectorPB.magnitude
        let innerProduct = RectangularCoordinateSystemVector.innerProduct(vectorPA, vectorPB)

        //  cosθ = 𝑎⃗・𝑏⃗ / |𝑎⃗| * |𝑏⃗| の公式より
        let cosTheta = innerProduct / (magnitudePA * magnitudePB)
        return Angle.radian(acos(cosTheta))
    }
}

struct RectangularCoordinateSystemVector {
    let elementX: Double
    let elementY: Double
    
    init(from fromPoint: RectangularCoordinateSystemPoint, to toPoint: RectangularCoordinateSystemPoint) {
        self.elementX = toPoint.x - fromPoint.x
        self.elementY = toPoint.y - fromPoint.y
    }
}

extension RectangularCoordinateSystemVector {
    var magnitude: Double {
        return sqrt(elementX * elementX + elementY * elementY)
    }
    
    static func innerProduct(_ vectorA: RectangularCoordinateSystemVector, _ vectorB: RectangularCoordinateSystemVector) -> Double {
        return vectorA.elementX * vectorB.elementX + vectorA.elementY * vectorB.elementY
    }
}

enum Angle {
    case radian(_ value: Double)
    case arcDegree(_ value: Double)
    
    var radian: Double {
        switch self {
        case let .arcDegree(value):
            return value * .pi / 180
        case let .radian(value):
            return value
        }
    }
    
    var arcDegree: Double {
        var arcDegree: Double {
            switch self {
            case let .arcDegree(value):
                return value
            case let .radian(value):
                return value * 180 / .pi
            }
        }
        let normalizedArcDegree = arcDegree.truncatingRemainder(dividingBy: 360.0)
        return 0.0 > normalizedArcDegree ? normalizedArcDegree + 360.0 : normalizedArcDegree
    }
}

// サンプル
let pointP = RectangularCoordinateSystemPoint(1,3)
let pointA = RectangularCoordinateSystemPoint(3,4)
let pointB = RectangularCoordinateSystemPoint(2,6)

let angle: Angle = pointP.getSubtendedAngle(pointA, pointB)

print("なす角 ∠APB: \(angle.arcDegree)") // なす角 ∠APB: 45.00000000000001
```
AWS ES2にデプロイしたPHPファイルを表示させる

#AWS ES2にデプロイしたPHPファイルを表示させる
AWS ES2にデプロイしたPHPファイルをブラウザ上で表示する方法についてまとめます。（少しずつ精査してわかりやすい記事にしていきます）

##手順
*パブリックサブネットにEC2を配置する
[WEBサーバー用EC2の起動からWEBページの表示まで](https://qiita.com/ebtiag/items/c75140c59d59a620f89e)
*EC2にファイルをPHPファイルをデプロイ
[ローカルPCからAWS EC2にファイルをデプロイ](https://qiita.com/ebtiag/items/dd61ef90dcccefc1066c)
*デプロイしたPHPファイルをドキュメントルートの移動する
*EC2インスタンスにLAMPサーバーをインストールする
[Amazon Linux 2 に LAMP ウェブサーバーをインストールする](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-lamp-amazon-linux-2.html
)
*PHPファイル内のデータベースアクセスのPDOをDBサーバのプライベートIPv4アドレスに修正する
*データベースに接続するかテストする
```mysql -h (DBサーバーのインスタンスのIPアドレス) -u (ユーザ名) -P 3306```

##参考
*[[AWS] ドキュメントルートを変更する - Qiita](https://qiita.com/nadonado/items/681a45c37451be8bb134)
*Apacheの再起動
```sudo systemctl restart httpd.service```
OSPF

# 概要
OSPF（Open Shortest Path First）は、リンクステート型のルーティングプロトコル。
ディスタンスベクタ型のルーティングプロトコル（RIPなど）の弱点を克服するために設計されたプロトコル。
家庭や小規模な企業などのネットワークを除き、中~大規模な環境のIGPネットワークではOSPFが用いられている。

# 特徴
##### クラスレス型ルーティングプロトコル
 OSPFは可変長サブネットマスクや不連続サブネットをサポートしている。LSAにもサブネットの情報が格納されている。（LSA=ネットワーク情報やインターフェイス、パスコストの情報をまとめた情報）
##### リンクステート型ルーティングプロトコル
　最適ルートを算出する際、ネットワークやサブネットの情報に加え、リンクの状態を示す情報（リンクステート情報）も必要となる。リンクステート情報は、そのリンクがネットワークへどのように接続されているのかを表す。
##### ルータホップ数の上限がない
　RIPの上限は15ホップと大規模ネットワークへ不向きであったのに対し、OSPFではその上限がない。
##### エリアによる効率的なルーティング
　ネットワーク内でLSAを交換する範囲を分割でき、一つの範囲（グループ）をエリアと呼んでいる。エリア内のルータは同じLSDBを保持している。ネットワークをエリアとして分割することで、交換するLSAが減り、帯域の消費抑制やルータの負荷低減などの利点がある。
##### 収束時間が短い
　LSDBの差分のみを交換するため、収束するまでの時間が短い。
##### マルチキャストによるルート情報の交換
　主に、DB、BDBへマルチキャストとしてアップデート情報を送信することにより、ネットワークの帯域幅を占有することなくルート情報の更新ができる。
##### ルート情報の認証機能
　セキュリティの観点から、所在不明のルータからのルート情報の交換は行わないようにする。
##### コストによる最適ルートの選択
　OSPFのメトリックである『コスト』により、ルートの最適解を算出。
not found in 'date-fns'が出た

# 前提
* yarnを導入している
* rails6

# 概要
```
$ yarn add date-fns
```
をした後に、

```javascript
// sample.js

import format from 'date-fns'
```
こうすると、以下のエラーが出る

```
"export 'default' (imported as 'format') was not found in 'date-fns'
```

# 結論
```javascript
// sample.js

import { format } from 'date-fns'
```

`{}`が必要らしい

date-fns側で`名前付きエクスポート`をしているため、このように書く必要があるっぽい。

# 参考

[export - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/export)
LeadのConvert buttonが表示されない


単に、ページレイアウトで配置していないだけかと思ったら違ってました。

これみて、リードの変換ボタンとは気づかなかった。この画面はリード？普段使ってないから分からん。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/32b410d1-1851-0119-8010-36d4d839bfef.png)


答えは、この設定が無かったこと。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/a49baeea-2c8e-508a-686d-ef09f69879f0.png)

https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000CfTyDSAV


Apexでも同じかもしれない。

[I am trying to convert lead record to customer record when we change Lead Status ='Closed - Converted' and Isconverted = false. '](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000BsCfISAV)
【初学者向け】Git,GitHubをざっくり理解する

#はじめに#
　GitとGitHubについて勉強したので備忘録として残していきます。ざっくり大枠を理解できるように書いていきたいと思いますのでよろしくお願いいたします。


#Gitとは#
　Gitとは、主にチーム開発などで使われるツールで、**バージョン管理システム**と呼ばれています。Gitを活用することで作業効率を上げることが出来ます。具体的にどのように使われるのか見ていきましょう。

　パソコンのフォルダを思い浮かべて見てください。フォルダの中には様々なファイルが格納されており、それぞれデータを更新していく必要があります。ファイルの内容を更新した際にタイトルの頭に"20210830"などの日付などを入れて管理されているかたもいらっしゃるのではないでしょうか。さらには、更新した内容などを付け加えておくと、いつ・どんな更新をしたかが一目でわかります。
　
　これをアプリ開発において管理してくれるのがGitの役目です。Gitを使うことで、いつ・どんな内容の変更を加えたか、どんな機能を実装したのかといった情報を管理することが出来ます。これがバージョン管理です。これだけでも十分役に立つのですが、他にも特徴があります。それは過去のバージョンを残しておいた状態で、新しい開発を行うことができることです。こうすることで、例えば何か不具合があった場合に過去のバージョンに戻ってやり直すことが出来ます。ゲームでいうセーブポイントみたいなものですね。


#GitHubとは#
　続いてGitHubについて見ていきたいと思います。GitHubとは世界中のエンジニアがプログラムのコードやデザインなどを公開できるようにしたWebサービスです。Hubとは、中心地・拠点などといった意味で、文字通りGitの中心地という意味になります。GitHub上に各々がプログラムをアップしてコードを公開したり、チームで開発を行ったり、といったことが可能になります。Gitでバージョン管理したプログラムをWeb上で公開ができるサービス、と覚えておきましょう。


#コマンド集#
　Git、GitHubには覚えておかなければならないコマンドがありますのでいくつか紹介していきます。

####git init####
　ローカルリポジトリを作成します。リポジトリとはファイルの保管場所のようなものです。

####git add####
　変更したファイルをステージングに追加します。変更を保存する"準備"のようなイメージです。

####git commit####
　ステージングに追加されたファイルを保存します。

####git status####
　変更のあったファイルを表示します。

####git push####
　コミットした変更内容をリモートリポジトリにアップします。リモートリポジトリとは、GitHub上に設置するリポジトリのことです。

####git pull####
　リモートリポジトリに保存している内容をローカルリポジトリにコピーすることが出来ます。これにより、他の人が開発した内容をローカルに落として同じファイルで開発を進めることが出来ます。


　他にもコマンドがたくさんあります。全て覚える必要はありませんが、全体の流れをしっかり把握しておくようにしましょう。


#まとめ#
　Git、GitHubはとても便利で使われている企業も多いです。まずはローカルでバージョン管理を行い、リモートにアップするという大まかな流れを掴んでおくようにしましょう。