OmniAICreator/Qiita-1.07M huggingface dataset:
Flutter for Web を Netlify で無料公開する


- 環境
    - Flutter 1.22.1 • channel beta • https://github.com/flutter/flutter.git
    - Framework • revision f30b7f4db9 (9 days ago) • 2020-10-08 10:06:30 -0700
    - Engine • revision 75bef9f6c8
    - Tools • Dart 2.10.1
- 参考 URL
    - [Flutter Web \+ Netlify: Continuous Deployment The Right Way In 2 Minutes \| by Shahrukh Siddiqui \| Medium](https://medium.com/@D10100111001/flutter-web-netlify-continuous-deployment-the-right-way-in-2-minutes-f2ed4a4fcbf7)

## 公開するプロジェクト用意
以下の対応事項を済ませておくこと。

- 対応事項
	- プロジェクト生成
	- プロジェクトを Git ホスティングサービスに配置 ( GitHub, GitLab, Bitbucket )
- 参考 URL
	- [Building a web application with Flutter \- Flutter](https://flutter.dev/docs/get-started/web)



## Netlify 公開設定

#### 1. `New site from Git` 押下
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355926/3febca0f-f9f3-6d12-3d70-b195857bc536.png)


#### 2. プロジェクトを配置したホスティングサービスを選択
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355926/8ecfafd3-f6ff-af6e-7fb2-6bac1f001a2f.png)


#### 3. 公開するプロジェクトを選択

- 備考
    - プロジェクトが表示されない場合、 Netlify からの閲覧権限が設定されてない可能性あり。

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355926/f2b3cdf4-5ca6-d98c-8b47-ee2ad50b0368.png)



#### 4. 以下の入力フィールドに情報入力
- Build command
    - `if cd flutter; then git pull && cd ..; else git clone https://github.com/flutter/flutter.git; fi && flutter/bin/flutter config --enable-web && flutter/bin/flutter build web --release`
- Publish directory
    - `build/web`

![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355926/85e299aa-b141-1d92-aff2-1093fa03e75c.png)

#### 5. 同画面で `Deploy site` 押下
- 押下後、flutter のリリースビルドが行われるため、終了まで待つ。

#### 6. ビルド後に URL を押下

![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355926/0604243f-1244-5471-5f8f-73b48848064d.png)

#### 7. 公開完了

![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355926/d6a36010-4d6c-63bb-bba2-b275fb79733d.png)


## 余談: netlify.tomlでコマンド管理

- 上記の ４ の工程では、リリースビルドのコマンドを直書きしている。
- しかし、`netlify.toml`を使用すると、コマンドをローカルで管理可能となる。
- 参考 URL
    - [File\-based configuration \| Netlify Docs](https://docs.netlify.com/configure-builds/file-based-configuration/)

```toml:./netlify.toml
[build]
  command = "chmod 777 ./build.sh && ./build.sh"
  publish = "build/web"
```

```sh:./build.sh
if cd flutter; then
  git pull
  cd ..
else
  git clone https://github.com/flutter/flutter.git
fi

flutter/bin/flutter config --enable-web

flutter/bin/flutter build web --release
```
Imperva SecureSphere 概要

業務でImperva SecureSphereを利用する機会があったため、備忘録としてまとめる。

## Imperva SecureSphereとは

* Imperva社が提供するWAF(Webアプリケーションをネットワーク内外の脅威から守るためのセキュリティソリューション)
* アプライアンス型WAF
* 防御する脅威例
  - Apache struts 脆弱性、OpenSSL脆弱性、SQLインジェクション、クロスサイトスクリプティング...

### Imperva Secure Sphere 特徴

* 自動学習機能による導入運用負荷軽減
  * 保護対象のアプリを分析し、ユーザー挙動ルールのベースラインまたは「ホワイトリスト」を作成することで、攻撃検出プロセスを自動化する。
* 細かなポリシー設定
  * 多数のURIにそれぞれポリシー設定ができるなど、ユーザー固有の保護要件と合致した正確な制御を行うことが可能。
* ユーザー環境へ柔軟な導入が可能
  * 利用者の環境に合わせてさまざまな構成で導入できる。
    * 透過型、プロキシ、Sniffer、...
* AWSとの親和性が高い。

## AWSとの連携構成例

* ALBやAuto Scalingと連携可能
* クライアントからのリクエストを一度External ALBで受け、SecureSphereを経由し、その後Internal ALB経由でアプリへ転送。
![SecureSphere_With_ECS_Atchitecure.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586535/c757ff91-32d0-a5af-e858-3709e7f87818.png)



## 参考情報

* [Imperva SecureSphere Web Application Firewall](https://www.imperva.com/docs/DS-SECURESPHERE-WAF-JP.pdf)

* [Imperva SecureSphere for AWS](https://www.softbanktech.co.jp/service/list/imperva/aws/)
総資産回転率、総資産営業利益率(ROA)、売上高営業利益率

AP試験学習記録27年秋 午前76

表から，卸売業A社と小売業B社の財務指標を比較したとき，卸売業A社について適切な記述はどれか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/05333666-7027-6125-f938-0590cb3db386.png)


１、総資産回転率
　資産をどれだけ有効に活用して売上を上げているかを表す財務指標で、以下の式で算出される。
　売上高÷総資産

２、総資産営業利益率(ROA)
　保有する資産に対してどれだけの利益を上げているかを表す財務指標で、以下の式で算出される。
　営業利益÷総資産

３、売上高営業利益率
　売上高に対してどれだけの利益を上げているかを表す財務指標で、以下の式で算出される。
　営業利益÷売上高


参照：
https://www.ap-siken.com/kakomon/27_aki/q76.html
MathTypeでラプラス変換記号を出す方法

# 使用したバージョン
Windows版MathType6 Version6.9(評価版)

# 手順
### １　大文字の「L」を入力する
![png01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642212/ef5b9b60-441e-b26f-4712-b569c5aaaa5f.png)

### ２　「L」を選択した状態でStyleタブのOther...を左クリックする
![png02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642212/1f7b3b2f-3be3-fe16-c547-e0be944f1502.png)

### ３　Other Styleウィンドウで「Monotype Corsiva」というフォントを選んでOKを左クリックする
![png03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642212/d2783607-52f5-f8cc-01d5-cc9cbda6d354.png)

### 以上です。
![png04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642212/f339ecc2-6358-01ea-cea2-a2827d0f5557.png)
Spree::Productのカラムを解説

solidus使っていると初心者にとっては「。。。ん？」みたいな状態ですよね。
この記事を読まれていると言うことは少し全体像が掴めて、「Spree::Product」にはどう言ったカラムが存在するんだ？」と言うところなのかなと思います。:point_up:
そこで今回は「Spree::Product」内のカラムについて簡潔に紹介と説明をしていきます。

##Solidusのバージョン
solidus 2.0.9

##カラムの紹介と説明

Spree::Productのid=1をのぞいてみましょう。
![スクリーンショット 2020-10-17 15.41.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/696807/f51163df-4b21-59a8-b10f-d06951f068d1.png)
それではここにあるカラムについて説明します。

###id
idです。笑

###name
商品名。

###description（description：説明する）
商品紹介文。

###available_on(available：利用可能な)
ストアで買うことができるようになる日付。
未設定の場合、表示されない。

###deleted_at（delete：削除）
available_onの逆で、ストアで買えなくなる日付。

###slug（IT用語：位置を示すコード）
「位置を示すコード」等の意味がある（IT用語）。URL（パーマリンク）の末尾の部分を任意の文字列に指定できる機能があり、SEOにも関係がある。

###meta_description（meta:高次〜）
SEO用で、サーチエンジン向けの説明。

###meta_keywords
SEO用で、サーチエンジン向けのキーワード。

###tax_category_id
商品の税区分

###shipping_category_id（shipping:運送）
配送料の指定。

###created_at
商品が作られた日時。

###updated_at
商品が更新された日時。

###promotionable
Promotionルールに基づく金額を生成する。

###meta_title
HTMLのtitleタグ用。空欄の場合はnameが代用される。


<関連情報>
Spree::Taxonのカラムを解説
https://qiita.com/roooll12/items/6f1dda6c5f4ea16e0c4c

Spree::Taxonomyのカラムを解説
https://qiita.com/roooll12/items/8b788e01309f0593934b


駆け出しsolidus開発者にとってSpree::Productモデルを理解する糧になれば幸いです！
[WPF] TextBox に Drag&Drop する方法

TextBox にファイルを Drag&Drop するには
まずは Drop イベントハンドラを追加しよう。

```a.xaml
<TextBox Drop="TextBox_Drop" PreviewDragOver="TextBox_PreviewDragOver">
```

中身は

```a.xaml.cs
(string[])e.Data.GetData(System.Windows.Data.Formats.FileDrop)
```

で取り出そう。
 
気をつけるべきは PreviewDragOver イベントハンドラーも必要。
Window なら必要ないんだけどね。
ハンドラの中身は、

```a.xaml.cs
e.Handled = true;
```

とだけ書けばOKだ。
企業経営のコンプライアンス強化

AP試験学習記録27年秋 午前74

企業経営における，コンプライアンス強化の説明はどれか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/af294967-294f-0ed3-0fc5-1e085a466e1c.png)

１、コンプライアンスとは　compliance
法令遵守と訳され、企業倫理に基づき，ルール，マニュアル，チェックシステムなどを整備し，法令や社会規範を遵守することです。

※コンプライアンス　compliance　法令遵守

今日、コンプライアンス強化を重視する企業が増えているのには、企業利益を優先し違法行為や反社会的行為を行って、消費者や取引先の信頼を失い、事業継続が不可能になってしまう企業が頻発するようになったからです。

２、
・各事業を市場成長率と相対的マーケットシェアの2次元で評価し，最適な経営資源の配分を行う。
　→×。事業ポートフォリオの説明です。

・企業存続の危機につながりかねない，経営者や従業員による不法行為の発生を抑制する。
　→○。コンプライアンス強化の説明です。

・顧客，株主，従業員などの利害関係者の満足度を向上させ，企業の継続した発展を図る。
　→×。ステークホルダマネジメントの説明です。

・他社にまねのできない独自の技術や能力など，差別化の源泉となる経営資源を保有し，競争力を強化する。
　→×。コアコンピタンス経営の説明です。


参照：
https://www.ap-siken.com/kakomon/27_aki/q74.html
Ruby on Rails で特定のViewにCSS を適用する


Ruby on Rails で作ったWebアプリケーションのあるページで、Tableタグで作った表中の文字が上揃えになっていました。
このままでは見た目が悪いので、上下中央揃えとなるよう、CSSを適用する方法を調べましたので自分用メモとして残します。

１．何を修正すれば良いのか？

/marketpurser（私が作ったアプリ名です）/app/assets/stylesheets 内のファイルです。
デフォルトで存在するapplication.scss　に追記すると、すべてのViewに適用されます。
また、Viewの名前に対応した.scssファイルに追記すると、特定のViewのみに適用されます。

２．どう記述すれば良いのか？

CSSと同じ文法で良いです。
今回はtableクラスを持ったtableタグ内の、tdタグに適用したいので、以下のように記述しました。

```/marketpurser/app/assets/stylesheetssample.scss
table.table td {
 vertical-align:middle;
}
```

```sample.html.erb
<table class="table">
  <thead>
    <tr>
      <th>#</th>
      <th>Info</th>
    </tr>
   </thead>
   <tbody id="myTable">
    <tr>
      <td>1</td>
      <td>data1</td>
    </td>
   </tbody>
</table>
```

解決しました。
なお、単にブラウザを再読み込みするのではなく、もう一度修正したViewのページにアクセスしないとCSSが反映されませんでした。（初歩的なミス）

以上、個人的なメモでした。
MacBookとSDカードのみでRaspberry Piのルート直下を確認する


学校の課題中に発生した問題？と結果について簡単にまとめました。
ターミナルのみでの操作になります。
備忘録も兼ねて書きました。

##当記事の対象者
* OSインストール済のラズパイ(SDカード)はあるが、それ自体を起動することはできない。
* MacBookにmicroSDを接続するすべがある。
* しかしラズパイのルート直下の内容を確認したい。
    * ルート直下=「var」「etc」「home」などが格納されている場所という認識でおねがします。

* あくまで「内容の確認」だけであり、「内容の変更」はできなくて良い。
    * コピーは可能です。

##環境
* MacBook Pro 2017モデル (ver.10.15.7)
* RaspbianOS (Buster ver.忘れた)

##作業手順の確認
* 基本的な流れとしては<br>
→SDカードをMacBookへ接続<br>
→自動的に読み込まれる「boot」をアンマウント<br>
→ext4を用いて「root」をマウント<br>
→見れる！！！

##bootのアンマウント
* `diskutil list` : bootのMac上での名前の確認
![スクリーンショット 2020-10-17 16.17.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590583/977ee69a-211e-8a58-107e-845765b11153.png)
僕の場合は「/dev/disk2」でSDが認識されています。<br>
アンマウントしたいのは「disk2s1(Windows_FAT_32 boot)」<br>
内容を確認したいのは「disk2s2(Linux)」ですね。<br>
読み込まれたときの名前は各自異なるため、それぞれ合わせてください。
<br><br>
* `diskutil umount disk2s1` : bootをアンマウント<br>
![スクリーンショット 2020-10-17 16.32.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590583/e769b0db-369f-8668-6d51-146f77449856.png)


##ext4のインストール
* `brew update` : brew(インストーラ)のアップデート
* `brew install cask` : cask(homebrewの拡張版)のインストール
* `alias cask="brew cask"` : 「cask=brew cask」と認識させるための設定
* `cask install osxfuse` : osxfuse(ext4)のインストール

##ルート直下をマウントする
* `sudo  diskutil mount /dev/disk2s2 Desktop/mnt` : マウント<br>
書式としては<br>
* `sudo diskutil mount /dev/対象の名前 マウント先`<br>
としてください。<br>
直後パスワードを求めらるため、Macのパスを入力してください。<br>
僕はデスクトップ上のmntというディレクトリを指定しました。

##確認
各自指定したディレクトリを確認していただければ、マウントされたのが確認できると思います。<br>

##まとめ
今回はMacによるext4を用いたラズパイOSのルート直下のマウントをまとめました。
先にも述べましたが、この方法では書き込みはできません。
内容を確認したい、データだけMacに移したいという方は是非試してみてください。
Swiftで割り算が0になる

Swiftで割合の計算をしようとしたら結構はまったのでメモ

# 起きたエラー

割合の計算をしようとしたら、

```swift
let int1: Int = 3
let int2: Int = 10
print("期待する値：0.3", "結果:", int1 / int2 * 100)

// 結果
// 期待する値：30% 結果: 0%
```

となり、小数点以下の値が表示されなかった。

# 解決方法

Double型またはFloat型を使う。

```swift
let double1: Double = 3
let double2: Double = 10
print("期待する値：0.3", "結果:", double1 / double2)
// => 期待する値：0.3 結果: 0.3

let float1: Float = 3
let float2: Float = 10
print("期待する値：0.3", "結果:", float1 / float2)
// => 期待する値：0.3 結果: 0.3
```

こんな感じで期待する値を取得することが出来た。

そもそも**intege**rとはTechTermsによると

> An integer is a whole number (not a fraction) that can be positive, negative, or zero.

と定義されており、少数ではない数(整数)事を表すが分かる。なのでInt(Integer)型で小数が関わる数字を計算すると、計算結果の整数の部分である**0**だけが表示され、期待された値が帰ってこなかった。

# 整数とは
ちなみに整数の定義は
> おおざっぱな解釈としては「小数でも分数でもない数」のこと。1、2、3、4、という数の連なり（自然数）と、0（ゼロ）、および負数（-1、-2、-3、-4、）を総称した言い方。
らしい。


# DoubleとFloat

Swiftでは小数扱う型として主にDouble型とFloat型が提供されていることが分かったが、どうやって使い分けたらいいか分からなかったので、調べてみた。

Swiftのドキュメントによると

> Double has a precision of at least 15 decimal digits, whereas the precision of Float can be as little as 6 decimal digits. The appropriate floating-point type to use depends on the nature and range of values you need to work with in your code. In situations where either type would be appropriate, Double is preferred.

と書かれている。意訳すると、
>Double型は小数15桁まで、Float型は小数6桁まで表すことができる。どちらの型が適切かどうかは状況によって異なるが、どちらでもOKな場合はDouble型が推奨です。

と書かれている。

# 感想
「integer = 整数 = 小数でも分数でもない数」という認識が頭にあったら15分も悩む必要がなかったので、
**卍 英語と数学は大事 卍**

# 参考文献
 - [Integer Definition](https://techterms.com/definition/integer)
 - [integerの意味・使い方・読み方 | Weblio英和辞書](https://ejje.weblio.jp/content/integer)
 - [[Swift]数値型 - Qiita](https://qiita.com/makopy_inside/items/c739a0a9e95c9c561a78)
 - [The Basics — The Swift Programming Language (Swift 5.3)](https://docs.swift.org/swift-book/LanguageGuide/TheBasics.html)
 - [整数(せいすう)の意味や定義 Weblio辞書](https://www.weblio.jp/content/%E6%95%B4%E6%95%B0)
npm run startを実行するまで～初めてのNode.js動作確認～

# 背景
実務経験ないまま、共同開発を経験させていただく機会があり
npm run startでブラウザが立ち上がるまで動作確認する必要があった。
内容自体は単純ではありますが、覚えも含めて投稿させていただきます！
また、この動作確認の一連の流れのまとめがなかったため、投稿してみようと思った次第です。

# 前提
- 2020/10時点での状況
- Windows使用者
- 当時の知識：「npm」「Node.js」というワードを始めて聞いた...
- Git/GitHubを全く触ったことがなかった...

作業手順優先で詳細は本投稿では省いています。
詳細はリンク先で記載がありますので、申し訳ないですがそちらをご参照くださいm(__)m

## 手順
### 1. GitHubにアカウント登録・GitHub内でリポジトリを作成
作業箇所：ブラウザ
https://qiita.com/kutarou197/items/8acea22ae36dbcf45c9f

### 2. Node.jsのインストール
作業箇所：ブラウザ
https://qiita.com/sefoo0104/items/0653c935ea4a4db9dc2b

*npm*とは*Node Package Manager*の略です。
ということでNode.jsのインストールが必須です。
Node.jsのインストールと同時にnpmもインストールされます。
※ちなみに自分は「Node.jsのインストールが必要」ということに気づかず、Node.jsをインストールせずにcmd(=コマンドプロンプト)にコード打込んでエラー出して悶絶、というのを３時間程続けていました(笑)

※尚、cmdはwindowsがデフォルトで持っているツールで、スタートメニュー横の虫眼鏡ボタンで「コマンドプロンプト」で調べると写真のように出てきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/780929/dababf13-0730-7cbf-f8b1-cfdb0214aa87.png)

### 3. nodistでバージョン管理する

#### - nodist のインストール
作業箇所：ブラウザ
https://qiita.com/satoyan419/items/56e0b5f35912b9374305

#### - バージョン管理
作業箇所：cmd(=コマンドプロンプト)
https://qiita.com/satoyan419/items/56e0b5f35912b9374305
↑「nodistのインストール」と同じリンクです。

共同開発する際、指定されたNode.jsのバージョンに変更
Node.jsのバージョンによってnpmも対応するバージョンが異なるので、npmのバージョン管理もお忘れなく！

尚、リンク先のnpxのインストールは今回は必要ありませんが、困ることはないので一緒にインストールしておいてもいいかもしれません。

### 4. GitHubで作成したリポジトリをクローンする
作業箇所：cmd

`git clone リポジトリのURL(https～)`

### 5. ディレクトリを変更し、Gitのremote urlを変更
作業箇所：cmd

`cd リポジトリ名`
でディレクトリ移動し
`Remote url set-url origin リポジトリのURL(https～)`
でリモートURLを変更
https://qiita.com/minoringo/items/917e325892733e0d606e

### 6. リモートリポジトリにプッシュする
作業箇所：cmd
https://qiita.com/yukibe/items/9ef9d54f2e7d53cfb51c
`git push origin master -f`
上記コマンドを入力して、リンクにある「リモートリポジトリに反映」の「push」のような画面が出たらOKです

### 7. 動作確認
作業箇所：全てcmd(=コマンドプロンプト)

#### - npm packageインストール
既製のパッケージをリモートリポジトリにインストール
`npm install`

#### - ファイルやプロジェクトの実行
`npm run start`
でブラウザが立ち上がったら完了！！
(この時点では真っ白のブラウザかと思います。)

※npmとは？：既に作られたNode.jsのパッケージ
https://qiita.com/righteous/items/e5448cb2e7e11ab7d477

***

ほんとに作業内容しか記述していないので、各種作業により端末内で何が起こっているのかは各リンクや関連記事をご参照ください！

最後まで読んでいただき、ありがとうございました！
「Unable to resolve the name vision.VideoPlayer」の対処法【MATLAB】

はじめまして、ますみです！

[![自己紹介.png](https://www.umi-mori.jp/wp-content/uploads/2023/02/introduction_banner_2-2048x533.png)](https://bit.ly/banner_intro_masumi_creator_qiita)


本記事では、MATLABで[`vision.VideoPlayer`](https://jp.mathworks.com/help/vision/ref/vision.videoplayer-system-object.html)を使用した際に出てくる、以下のエラーの対処法を解説します。

`matlab:
Unable to resolve the name vision.VideoPlayer

Error in main (line_8)
videoPlayer = vision.VideoPlayer;
`
（日本語：`名前 vision.VideoPlayer を解決できません。`）

# 対処法
バージョンエラーかと思いましたが、そういった記述はありませんでした（2012a以降は使えそうでした）。次に、依存関係を調べてみたところ、どうやら**`Computer Vision Toolbox`**が必要な感じでした。

そこで、以下のような手順で、アドオンをインストールしてから再実行してみました。
## 1. `HOME > Add-Ons`を選択
![MATLAB_vision_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240280/ee699e3e-501d-b94c-c622-90bc14f0f2f0.png)

## 2. `Computer Vision Toolbox`を検索
![MATLAB_vision_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240280/b5495b66-96f4-56f6-378a-374096547452.png)

## 3. `Install`を開始
![MATLAB_vision_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240280/bdfe39ce-23f3-cd7e-3ded-13afd8aeaddf.png)

## 4. インストール後に再実行
インストール後に再実行したところ、無事読み込みすることができました🎉
![MATLAB_vision_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240280/e40571b7-4b39-cba8-68a1-8c544837a109.png)

# 最後に
最後まで読んでくださり、ありがとうございました！
いかがだったでしょうか？

この記事を通して、少しでもあなたの学びに役立てば幸いです！

:::note info
【仕事の相談はこちら】
お仕事の相談のある方は、下記のフォームよりお気軽にご相談ください。

[問い合わせフォームはこちら](https://forms.gle/G5g1SJ7BBZw7oXYA7)

もしもメールでの問い合わせの方がよろしければ、下記のメールアドレスへご連絡ください。

info*galirage.com（*を@に変えてご送付ください）

🎁 「生成AI活用の無料相談券」もしくは「生成AIの社内ガイドライン（無料PDF）」を『公式LINE』で配布中 🎁
『生成AIを業務に活用したいけど、どうしたらいいかわからない』といった声を多くいただきます。

Galirageでは公式LINEにて、チャットやオンライン会議で「完全個別の生成AI活用無料相談会」を実施しております！
（期間限定で実施しているため、ご興味ある方はお早めに以下のLINE公式アカウントをご登録ください^^）
https://lin.ee/rvz6lMN

※ 予告なく、キャンペーンを終了する可能性がございますが、ご了承ください。

【業務内容】
具体的には、以下のお仕事を中心に受け付けております！（[詳しくはこちら](https://galirage.notion.site/Galirage-AI-c2f3945fafb0433d8d2fd03e56927fd8)）
1. 受託開発（例：生成AIを使った社内システムの開発）
2. コンサルティング（例：技術戦略のアドバイス）
3. 講演（例：社内研修、イベント登壇）

※ 特に「生成AIを使ったシステム開発のご依頼」が多く、ご好評いただいております。

【これまでの相談事例】
以下のようなご相談が多くあります。

🔑 機密情報を漏洩させないための、生成AIのシステム構築をお願いしたい。
🤖 自社データを用いたFAQチャットボットの作り方を知りたい。
💡 ChatGPTを、自分たちの事業にどのように活かせるか、アドバイスやアイデアが欲しい。
:::
# おまけ
エンジニアの仲間（データサイエンティストも含む）を増やしたいため、公式LINEを始めました🎉

「**一緒に仕事をしてくれる方**」「**友だちとして仲良くしてくれる方**」は、友だち追加をしていただけますと嬉しいです！（仲良くなった人たちを集めて、「ボードゲーム会」や「ハッカソン」や「もくもく会」もやりたいなと考えています😆）

とはいえ、みなさんにもメリットがないと申し訳ないので、特典を用意しました！

友だち追加後に、アンケートに回答してくれた方へ「**エンジニア図鑑（職種20選）**」のPDFをお送りします◎

https://lin.ee/hFUN4TL

[![](https://www.umi-mori.jp/wp-content/uploads/2023/10/line_banner_v2.png)](https://lin.ee/hFUN4TL)
Ansible 初心者がplaybook～roleを学ぶ ⑤ (wordpress環境構築）-roles(ベストプラクティス）編-

目的であったroles理解に入ります。
ルールに従ったroleの構成を作る。
（Ansibleが理解して処理できるディレクトリ構成をつくる、数学の公式みたいなイメージ）
以下公式を参考に作成を進めた。
https://docs.ansible.com/ansible/2.9_ja/user_guide/playbooks_best_practices.html


#「playbook単体の構成」と「roles構成の図解」
※太字はディレクトリ、細字はファイルを意味します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/664515/20eadcdf-8633-ba9e-a5ad-ce040dd25193.png)


#理解を深めるため、違いを比較
前者は構成がシンプル、後者は構成が複雑に見える。

単一のplaybookの場合は、
処理をplaybook一つにおさめているため、その作業専用としてしか使えない。

rolesの場合は
処理などを細分化してパーツ化することができるため、別の作業へ流用性が高い。

#記述（最上位～最下位を連結させるイメージ）
```python
<site.yml>
---
- name: Wordpress build web server
  import_playbook: wordpress_web.yml
```
```python
<wordpress_web.yml>
---
- hosts: web
  become: yes
  vars_files:
    - group_vars/web.yml
  roles:
    - web
```
```python
<roles/web/tasks/main.yml>
- name: web install
  import_tasks: web.yml
```
```python
<roles/web/tasks/web.yml>
---
- name: install repo epel-release,remi-release-7
  yum:
    name: "{{ web.repositorys }}"
～略～
```

前回作成した単一playbookをrolesに置き換えて作成したものをgit habで公開。
https://github.com/hiro0413ike/ansible_roles_study/tree/main/ansible_roles

###実行コマンド

```python
$ ansible-playbook -i inventory/hosts site.yml --check   …　チェック実行

$ ansible-playbook -i inventory/hosts site.yml　…　本番適用

```
-メモ- 
  1.図解についてはExcelで自分の理解を絵にした感じです。
  2.Commonつくろうと思ってたが共通なものが、それ程なかった。修正する際の課題。
Ansible 初心者がplaybook～roleを学ぶ ④  (wordpress環境構築）-単体playbook編-

wordpress構築用のAnsible playbookの作成を行います。

wordpress環境
-動作要件-
・PHP バージョン7.4以上
・MariaDB バージョン10.1以上
参考wordpress公式：https://ja.wordpress.org/download/

-playbook要件-
・PHP,MariaDBのバージョン指定が出来るようにして、流用性の配慮。
・ansibleのチェックモード実行（--check)でエラーによりTask停止しないように配慮。

-サーバ構成-
・webサーバ (IP address:192.168.16.12)
・dbサーバ  (IP address:192.168.16.13）

#playbookを起こす前に、手動構築手順を作成。
#####web server構築
① epel,phpのrepositoryをインストール

    yum install epel-release http://rpms.famillecollet.com/enterprise/remi-release-7.rpm -y
②ahapcheのインストール

    yum install httpd --enablerepo=epel -y    
③wordpress パッケージのダウンロード

    wget http://wordpress.org/latest.tar.gz -P /tmp/
④wordpress パッケージの解凍（解凍先指定）

    tar -zxvf /tmp/latest.tar.gz -C /var/www/html/
⑤wordpressディレクトリ（配下含む）のオーナー、グループをapacheへ変更

    chown -R apache:apache /var/www/html/wordpress

⑥phpインストール（バージョン7.4指定）

    yum install php php-cli php-pdo php-fpm php-json php-mysqlnd --enablerepo remi-php74 -y
⑦　apache起動、有効化

    systemctl restart httpd
    systemctl enable httpd
---
#####DB server構築
①mariadb repository（version10.1用）をダウンロード

    curl -sS https://downloads.mariadb.com/MariaDB/mariadb_repo_setup | sudo bash -s -- --mariadb-server-version=mariadb-10.1

②mariadb-server,MySQL-pythonをインストール

    yum install mariadb-server MySQL-python -y
③mariadb起動

    systemctl start mariadb
④mariadb有効化

    systemctl enable mariadb

⑤DB:wordpress作成

    mysqladmin create wordpress

⑥DB:wordpressにユーザ：web_user作成（接続元：webサーバ：192.168.16.12、パスワード：password）

    mysql -e "grant all privileges on wordpress.* to web_user@192.168.16.12 identified by 'password'"
---
#####wordpressのsetup　※インストール手順ではない、参考として記す。
http://192.168.16.13/wordpress/wp-admin/install.php
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/664515/94ea8dc8-dd9e-1aa2-73bd-15f8be0d025c.png)



##　ansible playbook作成（web,db手動構築手順を元に作成する）

#### playbookの主な記述方法　※大まかな記述ルール
    ---
    - name: {Play name}
      hosts: {target server}   …　ターゲットサーバ（ターゲットグループ）
      become: yes　　　　　　　　…　sudo有効化（ターゲットサーバでroot権限を持った変更が必要な場合、記述）
      tasks:
        - name: {task name}　　…　task 名を付ける、実行時にどのタスクが動いているか確認する目印となる。
          {modle}:　　　　　　　…使用したいモジュールを記述ルールに従い記述。

#####playbookで利用したansibleモジュール

|modlue name|概要|
|:-:|:-:|
|yum|yumを用いたインストール|
|get_url|wget変わりにpkg DL　|
|stat|ファイル情報取得|
|shell|Linxコマンド実行、commandと違ってパイプ等が使える|
|unarchive|圧縮ファイル解凍|
|file|ファイル操作（権限変更など）|
|service|サービス操作|
|mysql_db|DB作成|
|mysql_user|DBユーザ作成|

手動手順を元に
要件であるチェックモードでTask停止しないよう配慮（statとwhenによる条件分岐)したplaybookを作成。
git habに公開しています。

　https://github.com/hiro0413ike/ansible_study/blob/main/ansible/web.yml
　https://github.com/hiro0413ike/ansible_study/blob/main/ansible/db.yml

次回で、本当の目的であったroles理解をすすめます。
-追伸- ＜version指定インストール手順作成は、なんだかんだで苦労しました。＞
####次回Link>>[Ansible 初心者がplaybook～roleを学ぶ ⑤ (wordpress環境構築）-roles(ベストプラクティス）編-](https://qiita.com/showa-engine/items/efd0eb2b7977b2ba132b)
【VBA】シートのオブジェクト名をマクロで変更する


以前シートのオブジェクト名を変更してから扱うというブログを書いたのですが（[【VBA】シートをオブジェクト名で指定する](https://qiita.com/KaoTechBlog/items/9348980fd28c2495d7ca)）
先日、コメントでシートのオブジェクト名を手動ではなくコードで設定する方法はないかという話題がでまして、@radames1000 さんが教えてくれた方法を改めて記述しておきます。

#セキュリティセンターの設定
まずは、以下のチェックを入れておきます。
Excelのオプション
↓
セキュリティセンター
↓
マクロの設定
↓
開発者向けのマクロ設定
↓
VBAプロジェクトオブジェクトモデルへのアクセスを信頼する　にチェック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700414/5ec1ebd7-9a7d-f8c6-741c-cb40c95aed40.png)

#コード

```VB
Sub SheetObjectNameChange()
    ThisWorkbook.VBProject.VBComponents(Sheets(1).CodeName).Name = "test"
End Sub
```

#実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700414/84aba13e-6f99-eca4-75ef-ec4c6029650f.png)
変更できました！

マクロで新しくシートを追加してさらにそのオブジェクト名を変更したいときなどに使いたいかも。

いままでVBAプロジェクトオブジェクトモデルへのアクセスを信頼するってなんのこっちゃって思ってました！
@radames1000 さんありがとうございました！
【Golang】指定したカバレッジ率以下で失敗させる（ステータス1で終了させる） go test -cover 時のパーセンテージ指定

## Go 言語でカバレッジの合格ラインを指定したい

> `go test -cover` で[カバレッジ率](https://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%BC%E3%83%89%E7%B6%B2%E7%BE%85%E7%8E%87)が低くてもステータス 0（ゼロ）で正常終了してしまう。
>
> ```shell-session
> $ # カバレッジ付きでユニットテストを実行する
> $ go test -cover ./src
> ok      github.com/KEINOS/sample/src       coverage: 62.5% of statements
> 
> $ # ステータス 0 で正常終了してしまう
> $ echo $?
> 0
> ```
>
> 「`n パーセント以下は失敗`」もしくは「`n% より高い場合にパスさせる`」といった、指定したパーセンテージより**カバレッジが低い場合にステータス 1 で終了させたい**。

Golang に標準装備されている[ユニット・テスト](https://ja.wikipedia.org/wiki/%E5%8D%98%E4%BD%93%E3%83%86%E3%82%B9%E3%83%88)で、[カバレッジ](https://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%BC%E3%83%89%E7%B6%B2%E7%BE%85%E7%8E%87)を表示させる際に、カバー率が低い場合に失敗させたかったのです。Travis CI や GitHub Actions などの [CI](https://ja.wikipedia.org/wiki/%E7%B6%99%E7%B6%9A%E7%9A%84%E3%82%A4%E3%83%B3%E3%83%86%E3%82%B0%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3) とか。

[「go test cover カバレッジ パーセンテージ 指定」とググって](https://www.google.com/search?q=go+test+cover+%E3%82%AB%E3%83%90%E3%83%AC%E3%83%83%E3%82%B8+%E3%83%91%E3%83%BC%E3%82%BB%E3%83%B3%E3%83%86%E3%83%BC%E3%82%B8+%E6%8C%87%E5%AE%9A)もカバレッジの説明ばかりで、カバレッジの合格ラインの指定方法について分からなかったので、自分のググラビリティとして。

## TL; DR <sub><sup><sub><sup>（今北産業）</sup></sub></sup></sub>

1. `go test` の `-cover` は合格ラインを指定するオプションを持っていません。<sub><sup>（Go v1.15.2 現在）</sup></sub>
2. `cover` モードが有効時 <strong><code>[testing. Coverage()](https://golang.org/pkg/testing/#CoverMode)</code> でカバー率を取得できます</strong>。
3. `TestMain()` に条件文を組み込むことでパーセンテージを指定することができます。

## TS; DR

```go:メインのテストに以下を指定
package (
    "fmt"
    "testing"
)

// カバー率（0.8 以上で合格）
var thresholdCoverage = 0.8

func TestMain(m *testing.M) {
    var returnCode = m.Run()
    if returnCode == 0 && testing.CoverMode() != "" {
        var rateCoverage = testing.Coverage()
        if rateCoverage < thresholdCoverage {
            fmt.Println("テストはパスしましたが。カバレッジに失敗しました。カバレッジ率:", rateCoverage)
            returnCode = -1
        }
    }
    os.Exit(returnCode)
}
```

- 動作確認: Go v1.15.2 @ Alpine Linux v3.12
- 参考文献: [回答](https://stackoverflow.com/a/50123125/8367711) | "fail unit tests if coverage is below certain percentage" @ StackOverflow

## 参考文献

- <code>[func CoverMode()](https://golang.org/pkg/testing/#CoverMode)</code> | Testing @ golang.org 公式ドキュメント
- [fail unit tests if coverage is below certain percentage](https://stackoverflow.com/questions/50120427/fail-unit-tests-if-coverage-is-below-certain-percentage) @ StackOverflow
- [Go 1.15 testing パッケージの TestMain は os.Exit を呼ばなくてよくなった](https://qiita.com/hgsgtk/items/40e63150affed01f6573) @ Qiita
heroku update available from 7.42.6 to 7.46.0

herokuコマンドを実行したときにこれが出た。

```js
»   Warning: heroku update available from 7.42.6 to 7.46.0.
```

これを実行すればOK 

```js
heroku update
```
※↑自分の場合、結構時間がかかった。
certbot停止からの再インストール

## はじめに
certbotが死にました。。
というよりかは本番環境で運用していたhttps通信の証明証がいきなり破棄されて、戻すのに大変だったので備忘録。

## 開発環境
ruby 2.5.7
Rails 5.2.3
AWS ec2
nginx
puma

## 手順
```
cd ~
rm -r -f certbot
git clone https://github.com/certbot/certbot.git
cd certbot/
chmod a+x certbot-auto
sudo ./certbot-auto --nginx --debug 
※あとはyesに答えるだけ
```

## エラー集
### エラー①
#### エラーコード
```
Traceback (most recent call last):
  File "<stdin>", line 27, in <module>
  File "<stdin>", line 19, in create_venv
  File "/usr/lib64/python2.7/subprocess.py", line 185, in check_call
    retcode = call(*popenargs, **kwargs)
  File "/usr/lib64/python2.7/subprocess.py", line 172, in call
    return Popen(*popenargs, **kwargs).wait()
  File "/usr/lib64/python2.7/subprocess.py", line 394, in __init__
    errread, errwrite)
  File "/usr/lib64/python2.7/subprocess.py", line 1047, in _execute_child
    raise child_exception
OSError: [Errno 2] No such file or directory
```
#### 原因
- pythonのバージョンの不一致

#### 改善コード
```
alternatives --set python /usr/bin/python2.7
```

### エラー②
#### エラーコード
```
pkg_resources.DistributionNotFound: The 'virtualenv==15.1.0' distribution was not found and is required by the application
```

#### 原因
- virtualenvのバージョンの不一致

#### 改善コード
```
sudo pip uninstall virtualenv
pip install virtualenv==15.1.0
```

### エラー③
#### エラーコード
```
pkg_resources.DistributionNotFound: The 'pip==9.0.3' distribution was not found and is required by the application
```

#### 原因
- pipのバージョンの不一致

#### 改善コード
```
sudo easy_install pip == 9.0.3
```

### エラー④
#### エラーコード
```
Skipping bootstrap because certbot-auto is deprecated on this system.
./certbot-auto has insecure permissions!
To learn how to fix them, visit https://community.letsencrypt.org/t/certbot-auto-deployment-best-practices/91979/
Your system is not supported by certbot-auto anymore.
Certbot cannot be installed.
Please visit https://certbot.eff.org/ to check for other alternatives.
```

#### 原因
- 権限付与
- 周辺apiの未実装

#### 改善コード
```
sudo wget -r --no-parent -A 'epel-release-*.rpm'  http://dl.fedoraproject.org/pub/epel/7/x86_64/Packages/e/
sudo rpm -Uvh dl.fedoraproject.org/pub/epel/7/x86_64/Packages/e/epel-release-*.rpm
sudo yum install certbot python2-certbot-nginx
↓
sudo certbot --nginx
```

## 参考サイト
https://yoshinorin.net/2018/09/10/letsencrypt-cannot-update/
https://qiita.com/_whitecat_22/items/14819ce3d6a41cc0d6b2
Power Apps Portal 開発メモ

最近、仕事でMicrosofのPower Apps Portalを利用してWebサイトを作成する機会があったので、気づいた点を幾つかメモとして残しておきます。


### データの一覧表示について
PortalではCDSのエンティティに定義したビューをモデル駆動アプリのようにページの要素として表示させることができるため、エンティティの内容をページに表示するだけならノーコードで実現することが可能です。抽出条件を画面で指定させて動的にデータを表示させたりすることも可能ですが、インターフェイスがかなり独特で一般的なデータの照会画面とは違います。よくある、開始値と終了値を手入力させてのデータの絞り込みのようなことはできないようです。（現在を基準に過去何日分とかそういうことは可能です）
では、ノーコードで実現できないような画面はどうするかというと、Liquid というテンプレート構文が用意されておりエンティティに登録されたデータの取得やHTTPのリクエストの情報を取得することができるので、これとHTMLを組み合わせることでかなり自由に画面を創ることができます。まぁ、完全にコーディングの世界ですが。  
今回の仕事では顧客の要望とか聞いているうちに、結果的にほぼすべての画面をHTML+Liquidによる手書きで作成することになりました。


## データの入力フォームについて
一覧表示と同じく、Potralではエンティティに定義したフォームをページの要素として利用できます。必須項目の制御や簡単なバリデーションチェック、オプションリストを使用した項目選択なども可能ですので、簡単なエンティティに対する登録・修正・削除はノーコードで実現できます。しかし（といかやはりというか）、複雑なバリデーションや項目の制御や配置などはできません。そういうことがやりたい場合は、結局、HTMLとJavaScriptを駆使してコーディングしていくことになります。まだベータ版ですがPortal WebAPIが用意されていて、APIをJavaScriptで呼び出すことでエンティティに対してデータの登録・更新・削除を行うことができるので、普通のフロントエンド開発のノリで入力フォームを開発できます。ただ、データを取得するAPIはないので、動的にデータを取得するような場合はJSONを返すようなページを作成するなどの工夫が必要です。

## HTMLヘッダーへの項目追加
HTMLのヘッダー内にメタタグやJavaSCriptやスタイルシートなどのロードを追加したい場合は、"Head/Bottom"という名称のスニペットを作成して、そこにヘッダに挿入したい内容を記述することで、Portalは自動的にHTMLのヘッダー末尾にその内容を挿入してくれるようです。ただし、問答無用で全てのページに読み込まれるので、特定のページだけに追加したいということはできないっぽいです。

## 外部CSSファイルの読み込み
スタイルシートに関しては、先ほどの"Head/Bottom"スニペットを使用しなくても、CSSファイルをWEBファイルとして（ドキュメントルートに配置するよう？）登録しておけば自動的に読み込まれるようになります。ただし、読み込まれる順番が名称ではなく（おそらく）更新日順になっているため、ファイルの修正などで更新日時が変更されると読み込まれる順番が変わってしまいます。ロード順に依存するような場合は注意が必要です。

## 外部JSファイルの読み込み
スタイルシートと違って、JavaScriptファイルに関してはWEBファイルに登録しただけでは自動的に読み込まれることはありません。ロードするには"Head/Bottom"スニペットやWEBテンプレート内で明示的に指定する必要があります。
WEBファイルとして登録できるファイルにはサイズの上限があるため、あまり大きなライブラリは登録できないので注意が必要です。今回の仕事ではPDF生成用のライブラリが登録できず、別途サーバーを用意してそこに配置することになりました。

## パスワードリセットメールが飛ばない
Portalではアカウント管理の機能を標準でもっていて、パスワードを忘れたときのためのパスワードリセットメールの送信もデフォルトでやってくれるようになっています。ただ、このリセットメールの送信元が初期値だと対象アカウントの所有者になっているため、Portalから直接登録したアカウントの場合、所有者がSYSTEMとなりメールアドレスが存在しないためエラーになってしまいます。Portalからのアカウント登録を有効にしている場合、リセットメールのテンプレートを修正して送信元を変更する必要があります（変更は、PowerAppsの詳細設定画面から行えます）。この時、設定する送信元のメールアドレスは設定画面のメールボックスで有効にされている必要があります。また、有効化できるメールアドレスは複数の環境に同時に設定できません。開発用と本番用に環境を分けたりする場合、同じメールアドレスを使用することができないのでこれまた要注意です。ここらへんPower Appsのドキュメントだけでは良く判らなくて、Dynamics365のドキュメントに説明があったりするみたいです。今回、自力では解決できずプロパー経由でマイクロソフトに問い合わせて解決しました。

## アカウント登録時のプロファイル編集画面が邪魔
Potalで新規アカウントの登録を行うと、登録後、プロファイル編集画面へリダイレクトされます。
今回機能的に必要ないので顧客から「表示しないようにできないか？」との要望が上がったんですが、プロファイル編集画面へのリダイレクトをスキップする方法が判らず、結局、不要な項目をスタイルシートで非表示にすることで妥協してもらうことになりました。
64bit OS上の32bitアプリで32bit/64bit両方のProgram Filesフォルダを取得

```CSharp:Program.cs
using System;

namespace ShowProgramFilesFolder
{
    class Program
    {
        static void Main(string[] args)
        {
            // for 32bit
            Console.WriteLine(Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86));
            // for 64bit
            Console.WriteLine(Environment.ExpandEnvironmentVariables("%ProgramW6432%"));
        }
    }
}
```



```Text:実行結果
C:\Program Files (x86)
C:\Program Files
```
shell + emacsの基礎

\![Mac OS X-10.15.7](<https://img.shields.io/badge/MacOSX-10.15.7-brightgreen>) \![ruby-2.7.1p83](<https://img.shields.io/badge/ruby-2.7.1p83-brightgreen>) 


# directory,file関連

まず，ディレクトリについてディレクトリは階層構造で表される

|                      |                                |
|:---------------------|:-------------------------------|
| ルートディレクトリ   | 階層構造の一番上               |
| サブディレクトリ     | ルートディレクトリ以外         |
| カレントディレクトリ | 現在作業中のディレクトリ       |
| 絶対パス             | ルートディレクトリからの経路   |
| 相対パス             | カレントディレクトリからの経路 |

| ![img](http://ss.sguc.ac.jp/~rider/unix/directory.gif)|
|:---------------------------------------------------|
| Fig1. ディレクトリ構造                             |

|                             |                              |
|:----------------------------|:-----------------------------|
| mkdir ディレクトリ名        | ディレクトリ作成             |
| touch ファイル名            | ファイル作成                 |
| pwd                         | 絶対パスの表示               |
| cd ディレクトリ名           | ディレクトリ変更             |
| cd ..                       | 直前にいたディレクトリへ移動 |
| ls                          | ディレクトリ内のファイル一覧 |
| cp コピー元 コピー先        | ファイルなどコピーする       |
| rm ファイル(ディレクトリ)名 | 削除する                     |
| mv 移動元 移動先            | ファイル等の移動,名前変更    |

etc&#x2026;


# emacs

使い方

1.  emacs ファイル名
2.  記事書く，編集
3.  C-x,C-s
4.  C-x,C-c or C-z

| ![img](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151211/0dbf2fdf-b7a1-bcf2-872a-3fff8f33906d.jpeg)|
|:---------------------------------------------------------------------------------------------------------------|
| Fig. emacs key bindチートシート; keybind文字には，命令の意味があります．                                       |


# process関連

|      |                                  |
|:-----|:---------------------------------|
| ps   | 現在動作しているプロセスを表示   |
| bg   | ジョブをバックグラウンドへ移行   |
| fg   | ジョブをフォアグラウンドで動かす |
| jobs | ジョブを表示する                 |
| kill | プロセスを停止する               |

例えば，emacsで編集後C-zで一時中断したプロセスを再開する．

    > fg


# git共有

1.  git pull origin main
2.  git add -A
3.  git commit -m 'message'
4.  git push origin main # 自分のをpush. ここでもたつくとhintが出るので，再度pull


# qiita掲載

privateであげるなら

-   qiita post ファイル名 private

publicなら

-   qiita post ファイル名 public


# 参考

-   [ディレクトリ](https://www.pc-master.jp/words/directory.html)
-   [Linuxコマンド集](https://eng-entrance.com/category/linux/linux-command)



------
 - **source** ~/Desktop/grad_members_20f/members/mm-cell/post_org/shell_emacs.org
ServiceNow - 添付ファイルを制限する

#概要
ServiceNow全体で利用できる添付ファイルの拡張子はシステムプロパティ「glide.attachment.extensions」で制限できる。またファイルサイズの制限も可能である。
https://docs.servicenow.com/bundle/paris-platform-administration/page/administer/form-administration/task/t_DisablingTheDragAndDropFeature.html

#インシデントフォームに制限を掛ける
しかし、インシデントフォームのみに制限を掛けたりファイル数を制限する場合は次のようにする。（サービスカタログでは正常に動作しません）

##プロパティの作成
添付ファイル数を制限するプロパティ（ozawa.file.attachments.max）と許可する拡張性（ozawa.file.attachments.ext)を作成する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/737865a2-e0ba-5a6d-3979-e19500c63149.png)


##フォームのクライアントスクリプト
フォームにonSubmit()スクリプトを作成

```
function onSubmit() {
    var ajax = new GlideAjax('CheckFileAttachments');
    ajax.addParam('sysparm_name', 'validateAttachments');
    ajax.addParam('sysparm_sys_id', g_form.getUniqueValue());
    ajax.getXMLAnswer(function(answer) {
        if (answer != "true") {
            g_form.addErrorMessage('File attachments are illegal');
            return false;
        }
    });
}
```

##スクリプトインクルード

```
var CheckFileAttachments = Class.create();
CheckFileAttachments.prototype = Object.extendsObject(AbstractAjaxProcessor, {

    validateAttachments: function() {
        var extMax = gs.getProperty('ozawa.file.attachments.max');
        var extList = gs.getProperty('ozawa.file.attachments.ext').split(',');
        var incSysid = this.getParameter('sysparm_sys_id');

        var gr = new GlideRecord('sys_attachment');
        gr.addQuery('table_sys_id', incSysid);
        gr.query();
        if (gr.getRowCount() > extMax) {
            return false;
        }

        while (gr.next()) {
            var filename = gr.file_name;
			var found = false;
			for (var i = 0; i < extList.length; i++) {
                if (filename.endsWith('.' + extList[i])) {
					found = true;
                    break;
                }
            }
			if (!found) {
				return false;
			}
		}
        return true;
    },

    type: 'CheckFileAttachments'
});
```
#サービスカタログに制限を掛ける
サービスカタログの場合はポータルからだとエラーになりますが、UIからでは次のスクリプトが制限することができます。
サービスカタログの場合はプロパティとスクリプトインクルードは上の同じですがクライアントスクリプトが異なります。
##クライアントスクリプト

```
function onSubmit() {
    var ajax = new GlideAjax('CheckFileAttachments');
    ajax.addParam('sysparm_name', 'validateAttachments');
    ajax.addParam('sysparm_sys_id', g_form.getParameter("sysparm_item_guid"));
    ajax.getXMLAnswer(function(answer) {
        if (answer != "true") {
            g_form.addErrorMessage('File attachments are illegal');
            return false;
		}
    });
}
```
Web技術の基本について

「Web技術の基本」を読んで、まだまだWebの知識が足りないと感じました。今回は、自分が特に重要と思った箇所を備忘録のためにまとめます。

###RESTful
RESTは以下の4つ原則からなるシンプルな設計のこと

- 統一インターフェイス：あらかじめ定義・共有された方法で情報がやりとりされる
- アドレスの可読性：すべての情報が一意なURLの構文で示される
- 接続性：やりとりされる情報にはリンクを含めることができる
- ステートレス性：やりとりは1回ごとに完結し、前のやりとりの結果の影響を受けない 

###TCP/IP
TCP/IPとはインターネットにおける様々なサービスを実現するためのプロトコルの集まり。
プロトコルとはネットワークに接続された機器同士が通信するときの、あらかじめ決められた手順やルールのこと。

###IPアドレス
インターネットに接続されたコンピューターを特定し、データの行き先を管理するために利用されているの。IPアドレスは世界中でたった1つ

###ポート番号
IPアドレスは接続したいコンピューターまでは特定できるが、コンピューターが提供するサービスまでは指定できない。コンピューターが提供するサービスを特定するのがポート番号。

###JSON
- 構造化したデータを表すためのデータ記述言語の一種
- 書式がJavaScriptに従ったものとなっているが、JavaSript専用ということではない
- JavaScriptで書かれたプログラミングでは、JSONをそのままJavaScriptとして読み込むことができることから、Web上でのデータのやりとりによく使われる。

###Webサーバー
- WebサーバーはWebクライアントに対する窓口の役割をはたすプログラム。 
- Webクライアントからのリクエストを受け取って、静的コンテンツを配信したり、動的処理の必要なものがあればサーバーサイド・プログラムと連携する。

###アプリケーションサーバー
- Webアプリケーションの中核となる業務処理を行うプログラム。
- Webサーバーから転送されてきたユーザーからのデーターを受け取り、サーバーサイド・プログラムを実行することでWebサーバーに応答を返している。

###OAuth
- サイトをまたいだ認可を実現するために標準化されたプロトコル。
- 機能としては認可のみであり、認証は行わない。


参考図書
Web技術の基本
"~"で任意の文字を囲む方法

【概要】
----------------------------------------
<b>1.結論</b>

<b>2.どのようにコーディングするか</b>

<b>3.開発環境</b>



1.結論
----------------------------------------
<b>gets.chomp、length</b>メソッドを使用する!!

<br>
2.どのようにコーディングするか
----------------------------------------

```ruby
str = gets.chomp #---❶
str_length = str.length
puts('~' * (str_length + 2)) #---❷
puts('~'+str+'~') #---❸
puts('~' * (str_length + 2)) #---❷
```
このようにすると、下記のようになります。
![スクリーンショット 2020-10-17 15.41.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686400/1b25fb02-0a74-76e9-dcc4-293ec4a9e183.png)

❶：.chompを入れないと下記のようになります。改行をして2行目の最後の"~"をくっつけています。
![スクリーンショット 2020-10-17 15.42.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686400/c78cc742-7fcb-48c0-338f-d4737750fbfe.png)
❷：lengthメソッドで入力したの文字の長さに +2しています。+2する理由は左上の"~"と右上の"~"の角っこを加えています。
❸：入力した文字の両端に"~”を加えています。



3.開発環境
----------------------------------------
Mac catalina 10.15.4
Vscode
Ruby 2.6.5
Rails 6.0.3.3
<br>
【React Native + Expo】React Hook Formでバリデーションを簡易実装してみる

[React Hook Form](https://react-hook-form.com/jp/
)はフォームバリデーションをシンプルかつ簡単に記述できる便利なライブラリです。
FormikやRedux Formなどバリデーションに関してのライブラリは他にもありますが、
パフォーマンスの良さや記述量の少なさからこちらのライブラリを使うと実装が楽になるのでオススメです。

ReactNativeに関しては以下のURLにクイックスタートがかかれているので、参考にしてみてください。
https://react-hook-form.com/jp/get-started#ReactNative

#React Nativeの注意点
ReactNativeのサポートはしっかりとされていますので、使うことはできます。
ただし注意点としては、Reactと同様のAPIが使えない部分があるとのこと。

>React Native と互換性のない API がいくつかあります (Web とネイティブとの API の違い)。


また、書き方についても手動登録 (manual register)が必要とのこと。。。
とにかくソースコードを確認してみましょう。



#ソースコード

```react
import { useForm, Controller } from 'react-hook-form';
```

```react
  const { register, control, handleSubmit, errors } = useForm();
  const onSubmit = (data) => console.log(data);
```


```react
     <Controller
        control={control}
        render={({ onChange, onBlur, value }) => (
          <TextInput
            onBlur={onBlur}
            onChangeText={value => onChange(value)}
            value={value}
          />
        )}
        name="firstName"
        rules={{ required: "入力が必要です。" }}
        defaultValue=""
      />
      {errors.firstName && <Text>{errors.firstName.message}</Text>} 
```
該当ソースコードは以上で、だいぶスッキリと書ける印象です。

#補足
**Controller**

```react
      <Controller
        control={control}
        render={({ onChange, onBlur, value }) => (
          <TextInput />
        )}
        name="firstName"
        rules={{ required: "入力が必要です。" }}
        defaultValue=""
      />
```
先程の「手動登録 (manual register)が必要」というのはController内にあるrulesにあたる箇所になります。
そもそも、registerとはバリデーションルールを設定するためのもので、useForm内でも定義することができます。

**errors**

```react
 {errors.firstName && <Text>{errors.firstName.message}</Text>} 
```
バリデーションエラ-の内容はuseFormで定義されているerrorsを呼び出すことで確認できます。
上記のソースコードでのerrorの内容は、Controller内にあるrulesに定義した「入力が必要です。」が出力されます。


#実装例

<blockquote class="twitter-tweet"><p lang="und" dir="ltr"><a href="https://t.co/okP3cqpZgL">pic.twitter.com/okP3cqpZgL</a></p>&mdash; がーみ (@garmigarmi) <a href="https://twitter.com/garmigarmi/status/1317324885698482177?ref_src=twsrc%5Etfw">October 17, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


#終わりに
今回紹介した内容は一部分だけですので、APIリファレンスを読んで書き換えたりすると理解が深まるかと思います。
また。実装で必要なバリデーションルールに沿ったものが、作れるのかを試してみようと思うので
詳細な作りに関してはまた別の記事で書こうかと思います。

まだ、まとめきれていない部分が多々あるので、実装方法としてこうしたほうが良いとか間違いがあれば教えていただくと嬉しいです。
staticキーワードをつけた関数内定義変数をunsetするとどうなるか

結構面白い挙動になりました．

```
<?php

function func()
{
    static $x = 0;
    $x++;
    echo $x;
    unset($x);
    echo $x;
}

func();
func();
func();
```
https://3v4l.org/tQLiW

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/124948/33a6bda9-83ae-b45c-854f-c32f11208cca.png)

4行目で `static` で宣言された `$x`くんは，8行目で `unset()` され，9行目で確かに未定義の状態となったことが確認できますが，次の関数呼び出しの際には元の値を保持したまま復活します．

面白いなと思ってPHPのマニュアルを見てみたら，マニュアルで紹介されている挙動でした _(┐「ε:)_ｽﾞｺ-!

> If a static variable is unset() inside of a function, unset() destroys the variable only in the context of the rest of a function. Following calls will restore the previous value of a variable.

destroyされたあと，restoreされるらしいです．すごいですね．

# 余談

staticキーワードを無駄に使ってメモリを無駄遣いするコードです．

```
<?php

function func()
{
    static $x;
    if (!isset($x)) {
        $x = 'func';
    }
    echo $x;
}

func();
func();
func();
```
https://3v4l.org/LuNhY
【Ruby on Rails】gem kaminariとjscrollを使用した無限スクロール

# 開発環境
ruby 2.5.7
Rails 5.2.4.3
OS: macOS Catalina



# 流れ
1 gemの導入
2 jscrollの導入
3 コントローラーの編集
4 viewの編集
5 jsの編集
6 CSSの編集


# gemの導入
```rb:Gemfile
gem 'jquery-rails'
gem 'kaminari'
```
```:ターミナル
$ bundle install
$ rails g kaminari:config
$ rails g kaminari:views default
```
```js:app/assets/javascripts/application.js
//= require jquery　←追加
//= require jquery_ujs　←追加
//= require activestorage
//= require turbolinks
//= require_tree .
```

参考：kaminari
[【Ruby on Rails】ページング機能導入](https://qiita.com/japwork/items/33c02de511b7db212e55)

# jscrollの導入
①または②で導入します。

①https://github.com/pklauzinski/jscroll/tree/master
こちらのGitHubからzipファイルをダウンロード後、
dist内にあるjquery.jscroll.min.jsを
app/asset/javascripts配下に保存してください。

②head内に書く場合はこちらを使用してください。

```erb:
<script src="https://cdnjs.cloudflare.com/ajax/libs/jscroll/2.4.1/jquery.jscroll.min.js"></script>
```


①または②を導入後下記のように記述。
※//= require jqueryの下に記述するようにしてください。

```js:app/assets/javascripts/application.js
//= require jquery
//= require jquery_ujs
//= require jquery.jscroll.min.js　←追加
//= require activestorage
//= require turbolinks
//= require_tree .
```


# コントローラーの編集
.page(params[:page]).per(20)を記述することにより、
20個の要素を表示します。

```rb:app/controllers/posts_controller.rb
class PostsController < ApplicationController
  def index
    @posts = Post.page(params[:page]).per(20)
  end
end
```


# viewの編集
div内のクラス名をjQueryで編集していきます。

```erb:app/viws/posts/index.html.erb
<div class="scroll-list jscroll">
  <% @posts.each do |post| %>
    <span><%= post.post_title %></span>
  <% end %>
  <%= paginate @posts %>
</div>
```

# jsの編集
今回は画面下5%までスクロールした際に
新しくロードするようにします。
※クラス名は先程指定したものをお使いください。

```js:app/assets/javascripts/application.js
$(window).on('scroll', function() {
  scrollHeight = $(document).height();
  scrollPosition = $(window).height() + $(window).scrollTop();
  if ( (scrollHeight - scrollPosition) / scrollHeight <= 0.05) {
    $('.jscroll').jscroll({
      contentSelector: '.scroll-list',
      nextSelector: 'span.next:last a'
    });
  }
});
```

# CSSの編集
```css:app/assets/stylesheets/application.scss
nav.pagination {
  display: none;
}
.scroll-list {
  padding: 0;
}
```

# まとめ
無限スクロールはTwitterやインスタグラムでも採用されているため、
表示が多い場合は導入すべき機能になります。

またtwitterではQiitaにはアップしていない技術や考え方もアップしていますので、
よければフォローして頂けると嬉しいです。
詳しくはこちら　https://twitter.com/japwork
cdコマンドとmvコマンド

Linuxコマンドのcdコマンドとmvコマンドについてです。

どちらもディレクトリを移動するためのコマンドだと勘違いをしていました。
違いについて書いていきます。

### cdコマンド
- カレントディレクトリを移動するためのコマンド<br>
- GUIでのフォルダをダブルクリックして移動することと同じ。<br>
※カレントディレクトリ・・・現在作業中のディレクトリ

 ```
hoge@MacBook-Air ~ % cd projects ←カレントディレクトリ(~)からprojectsディレクトリに移動
hoge@MacBook-Air projects % 　　　←カレントディレクトリがprojentsに変更

```


### mvコマンド
- ファイルやディレクトリを移動、名前を変えるコマンド。
- GUIでのドラッグ&ドロップでフォルダやファイルを移動することと同じ。
```mv 移動元 移動先```で使用する。

```
hoge@MacBook-Air ~ % mkdir test   ←testディレクトリを作成
hoge@MacBook-Air ~ % touch test.html ←test.htmlファイルを作成
hoge@MacBook-Air ~ % mv test.html test　←test.htmlファイルをtestディレクトリに移動
```

上記の場合はtest.htmlがtestディレクトリに移動する
複数ファイルをまとめて移動させたい場合は移動元に複数指定すればOK

```
hoge@MacBook-Air ~ % mv test.html test2.html test ←test.htmlとtest2.htmlをtestディレクトリに移動
```

##結論
- cdコマンドは作業を行うディレクトリを移動する
- mvコマンドはファイルを別のディレクトリに移動させる

### 参考サイト
http://www.redout.net/data/command.html
営業債権管理業務に関する内部統制

AP試験学習記録27年秋 午前60

営業債権管理業務に関する内部統制のうち，適切なものはどれか。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/77a7efea-2cdb-3ec6-301a-22e159eaeeb5.png)

１、内部統制は、
企業の健全な経営を実現するために、その組織の内部において適用されるルールや業務プロセスを整備し運用すること、またはその結果確立されたシステムをいいます。

業務を1人または1つの部門に任せてしまうと、不正な処理が行われたりミスをしたときに迅速な対応がとれなかったりします。内部統制ではこれを防止するため
　互いの仕事をチェックし合うように、
　複数の人、部門で業務を分担する職務分掌を明確にし、業務プロセスに組み込む
ことが求められます。

つまり、業務は、チェックされているかがポイントですね。

２、
・売掛金回収条件の設定は，営業部門でなく，審査部門が行っている。
　→○。別の部門に業務を分担させることでチェック体制が業務に組み込まれています。

・売掛金の消込み入力と承認処理は，販売を担当した営業部門が行っている。
　→×。入力と承認を同一部門がするのではチェック体制が機能しません。

・顧客ごとの与信限度の決定は，審査部門ではなく，営業部門の責任者が行っている。
　→×。営業部門の不正を防止するため審査部門が行うべきです。

・値引き又は割戻しの処理は，取引先の実態を熟知している営業部門の担当者が行っている。
　→×。請求業務の担当者による不正を防止するため別の担当者によって行われるべきです。


参照：
https://www.ap-siken.com/kakomon/27_aki/q60.html
【Java】 キャッシュの影響でアップロードした画像が更新されない問題

##概要
作成中のwebアプリで画像をアップロードしたはいいものの、アップロードした画像が画面で中々更新されない問題で詰まったので、自分用にメモします。
原因としてはキャッシュが悪さをしていて、更新前の画像をそのまま読み込んでしまっているためと思われます。

##解決方法
結論から言ってしまえば、jsp側で表示している画像の"<img src=~"に?（何かしらの値）を付けて、ブラウザに違う画像と認識させるだけで解決する事ができました。

```Java:test.jsp
//変更前
<img src="static/img/test.jpg" alt="test.jpg">
//変更後
<img src="static/img/test.jpg?(任意の動的パラメーター)" alt="test.jpg">
```

画像のURLがまったく同じで何も変更がないと、ブラウザは**「キャッシュを使用すればいい」**と判断してしまうので、更新が反映されなくなっていたようです。

##パラメーターをlastModifiedで付与する
任意の固有のパラメーターなので何でも良いのですが、せっかくなので自動で値を取得して付与するようにしてみます。
アップロードした日付と時間を、lastModifiedで取得し付与します。

```Java:Controller.java
// 対象とするファイルを選択する
File file = new File("static/img/test.jpg");
// ファイルの最終更新日時を取得し、jspで使用可能にする
model.addAttribute("file", file.lastModified());
```
```Java:test.jsp
<img src="/static/img/test.jpg?${file}" alt="test.jpg">
```
これでファイルを更新しても、更新後のものが読み込まれるようになります。


##参考
・[Spring Bootで静的リソースのブラウザキャッシュ対応](https://qiita.com/nenokido2000/items/edd469110d5bd84d305f)
・[「キャッシュのせいです」とは言わせない！更新されたファイルだけ確実にキャッシュを無効化させる方法]
(https://qiita.com/laineus/items/ae9c9117cbcbd5333035)
・[更新されたJS、CSS、画像のみブラウザキャッシュを破棄して読み込ませる]
(https://qiita.com/ka215/items/20139918642fed39fb5d)
AWS EC2本番環境にデプロイしたのに変更が反映されない...の対処法を写真つきで解説


##概要
AWSでEC2にデプロイした際に、「ローカルでは変更が反映されているのに本番環境で変更が反映されない...!!」となってしまい詰んだので解決した方法をメモ書きとして共有します。
ローカルでは正しく変更が反映されている前提になります。
何か間違いなどありましたらご指摘いただけますと幸いです。


##環境
AWS EC2
Ruby 2.6.5
Rails 6.0.3.3
capistranoで自動デプロイ済み

##解決した方法
```
EC2インスタンスを再起動
```
複数回の自動デプロイ【bundle exec cap production deploy】を行なっていると、EC2側で変更が反映されないことがあるらしいです、、(今後も頻繁に起こりそう)
なのでEC2インスタンスを再起動する手順を写真つきで以下にメモとして残します。

####1.[AWSマネジメントコンソール](https://aws.amazon.com/jp/console/)にログインしてEC2にいく。

![AWS_マネジメントコンソール.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542843/ef56699f-751b-f02d-f000-fda7180ae31e.png)
####2.インスタンスをクリック
![ダッシュボード___EC2_Management_Console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542843/32471e5d-1fec-4b88-b0d0-93b06928f003.png)


####3.該当インスタンスをクリック
![インスタンス___EC2_Management_Console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542843/a0524118-2d4e-fa0f-ffaa-d34d0086f367.png)

####4.アクションからインスタンスを再起動する
![インスタンスの詳細___EC2_Management_Console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542843/d9f99477-b0b0-1f98-42dc-93fd5bfa08ec.png)

####5.ターミナルからEC2にログイン
```
ssh -i ~/.ssh/（pemファイル名） ec2-user@（EC2のElastic IP）
```

####6.nginxと使用DB(今回はmariadb)を立ち上げる
`sudo service nginx start`
`sudo service mariadb start`

####6.ローカルで自動デプロイのコマンドを実行(bundle exec cap production deploy)
→アプリケーションサーバのunicornが立ち上がる
　→本番環境に変更が反映される。
##終わり
以上です。
C# - TabControl, TabPageのサンプル　コードべた書き（Visual Studio不使用）

目次： [C# - Windows Formsでよく使うコントロールたち （Visual Studioなし環境向け） - Qiita](https://qiita.com/kob58im/items/a6cff48ce6bfbcf41c39)

# まえがき

意外とTabControl＆TabPageを使うサンプルソースがサクッと見つからなかったので、メモ代わりに置いておきます。

# キャプチャ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438183/46b7a99d-4d8b-2a07-94cf-a4c84a9e8037.png)

# ソースコード

`TabControl`にタブ`TabPage`を登録して使います。

```csharp

using System;
using System.Drawing;
using System.Windows.Forms;

class SampleForm : Form
{
    TabControl tabc;
    TabPage    tabp1;
    TabPage    tabp2;

    SampleForm()
    {
        ClientSize = new Size(500, 300);

        Controls.Add(tabc = new TabControl(){
            Dock = DockStyle.Fill,
        });

        tabp1 = new TabPage(){
            Text = "Sample Page #1",
            Dock = DockStyle.Fill,
        };
        tabc.TabPages.Add(tabp1);

        tabp2 = new TabPage(){
            Text = "Sample Page #2",
            Dock = DockStyle.Fill,
        };
        tabc.TabPages.Add(tabp2);


        tabp1.Controls.Add(new Button(){
            Text="Button on tabp1",
            Dock = DockStyle.Fill,
        });

        tabp2.Controls.Add(new Button(){
            Text="Button on tabp2",
            Dock = DockStyle.Fill,
        });
    }
    
    [STAThread]
    static void Main(string[] args)
    {
        Application.Run(new SampleForm());
    }
}
```


# 参考サイト

- https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.tabcontrol?view=netframework-4.8
- https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.tabpage?view=netframework-4.8