OmniAICreator/Qiita-1.07M huggingface dataset:
[Rails]before_actionとは？

##初めに
####なぜこの記事を書きたかったのか
controllerの使い方の復習のため

####環境
・Macbook Air (Retina, 13-inch,2019)
・プロセッサ 1.6GHz デュアルコアIntel Core i5
・メモリ　8GB 2133 Mhz LPDDR3
・MacOS Big Sur　バージョン 11.5.2

####記事の目次
**１）どういうときに使うのか**
**２）どう使うの？**
**３）いろんなオプション**
**４）最後に**

##どういうときに使うのか
####全てのアクション前に行動できるようになる(controller内にしか使えない)
**どんなシチュエーションがあるのか？**
・（前提：ログイン機能がある）ページ遷移するとき、ログインしていないuserをログイン画面へ強制遷移させる
・（前提：userが個人情報を記入する）userが記入したニックネーム(個人情報)を遷移先へもって来る

##どう使うの？
####before_actionは２つの使い方がある
**１）もう機能が入っているメソッド名をつかう**
・下記の**authenticate_user!**メソッドを使うことで、userがログインしていなければ、そのuserをログイン画面へ強制的に遷移させることができる。(詳しいことは→https://qiita.com/janani/items/474ceccf97af8bc91a7f)

```erb
(ログインしていなければ、ログイン画面へ強制遷移！)
before_action ：authenticate_user!
```

**２）自分でメソッド名を作り、命令式を自分で作る**

```erb
（作り方）
before_action :メソッド名1, オプション名:オプションによって記述内容が変わる

private

def メソッド名1
命令式
end

```
##いろんなオプション
####onlyオプション
**指定したメソッド名を特定のアクションにだけ使いたいときにつかう**

```コントローラー
before_action :find_nickname, only[:index, :show]

private

def find_nickname
命令式
end
```
####exceptオプション
**onlyオプションの逆で特定のアクションにだけ使用できないようにするときにつかう**

```コントローラー
before_action :find_nickname, except[:new, :edit, :create, :update, :destroy]

private

def find_nickname
命令式
end
```

####ifオプション
**条件をつけて、そのときにだけ使えるようにできる（返り値がtrueのとき）**

```コントローラー
before_action :find_nickname, if:メソッド名

private

def find_nickname
命令式
end
```


####unlessオプション
**ifオプションの逆で条件をつけて、そのときの結果がfalseのときに使用できる**

```コントローラー
before_action :find_nickname, unless:メソッド名

private

def find_nickname
命令式
end
```

##最後に
qiitaを一日２投稿はハードルが高かったみたいだ、、まとめてメモして時間があるときにやろう！

ココまで読んでくださいましてありがとうございます！
Gtk3アプリ TextView TreeViewにスクロールバーを表示する

####TextView TreeViewにスクロールバーを表示する

コンテナーの中からGtk.ScrolledWindowを配置します。

次にGtk.ScrolledWindowの中にGtk.TextViewを配置します。

<img width="600" alt="aaaaa.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182324/6a17d577-b70a-78a9-b29d-e54d935236dd.png">

スクロール機能が有効になりました。
<img width="350" alt="Screenshot from 2021-09-23 15-07-31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182324/a3e174e6-603a-040e-36d4-ae99459a0176.png">


####Gtk.ScrolledWindowの中のコントロールサイズを変更する

右下のパネルの幅を変更します。

<img width="500" alt="Screenshot from 2021-09-24 15-40-49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182324/1db81bf7-d31c-a5ef-fb22-ea1b25313a2a.png">

[Gtk3アプリ TreeViewプログラム自動生成ツール](https://qiita.com/iota_11/items/7074e21bf99cc56b69ce)に続く
１週間で道路逆走ゲーム作ってみた



Unity初心者が、１週間で簡単なゲームを作った過程を１日ごとにメモしてみた。

##１日目
#作りたいゲームを決め、ルールと方向性を決める
今回作りたいと思ったのは、車が道路を逆走するアクション系ゲーム。実際完成したゲームはこんな感じ。
<div align= "center">![IMG_5676.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1948530/e1ef8917-3566-56f5-eaeb-a3ec3aa00981.png)</div>

ルールに関しては、

 - クリア条件
 - ゲームオーバー条件
 - スコア条件

の三つを軸に決めた。今回は、ハイスコアを目指すエンドレスゲームにしたのでクリア条件はなく、スコアは車の進んだ距離で出す事にした。ゲームオーバー条件は５回車にぶつかるという条件にした。

##２日目　
#ステージを作る
ステージとなる道路をUnityの3Dオブジェクトで作った。エンドレスゲームなので、ステージが自動生成されるようにコードを書いた。
![スクリーンショット 2021-09-23 14.22.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1948530/e196d68f-7770-b199-f521-607bc25d517f.png)


##３日目
#キャラと敵をセットする
今回は車が逆走するという設定なので、キャラクターは車（キャラなのか知らんけど）、そして敵（今回は障害物）となるものも車（普通に走行している側）
車のモデルはアセットストアで無料のモデルを使用
![スクリーンショット 2021-09-23 14.23.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1948530/0fe3ebee-667c-2c04-778d-f7d2baa2c33b.png)


##４日目
#タイトル画面・ゲームオーバー画面を作る
タイトル画面とゲームオーバー画面は、それぞれsceneを作成し、タイトル画面にはUIでボタンをつけ、ボタンを押したらスタートするようにした、ゲームオーバー画面への移動はsceneManagerを使った
![スクリーンショット 2021-09-23 14.38.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1948530/dca380a6-d87f-e727-e6bb-07e3a4db7398.png)
&emsp;タイトル画面
![スクリーンショット 2021-09-23 14.40.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1948530/1bbc7e4d-a361-c0cb-e796-fadb340e41db.png)
&emsp;ゲームオーバー画面

##５日目
#スコアの実装・体力ゲージの実装をする
スコアと体力ゲージをUIで表示した、５回当たるとゲームオーバーになる設定を踏まえてコーディング
![スクリーンショット 2021-09-23 14.26.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1948530/a454d352-950d-71b9-5277-c0a6e9aae612.png)
&emsp;UIを加え操作スティックとスタミナを表示


##６・７日目
#レイアウトの質を高める・細部の調整
背景がかなりしょぼかったので、アセットストアから海を取ってきたら割といい感じに
![スクリーンショット 2021-09-23 14.21.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1948530/7c0ceb42-629e-6120-9a38-aa863fc3c75a.png)
&emsp;あとは細部の調整をして完成！

##感想
初心者でも、一日中やっていれば１週間で簡単なゲームなら作れることが分かった
Unityはかなり有能で、プログラミングを使わなくても可能なことが多かった

&emsp;ゲームのコードはこちらに載せています

https://github.com/sgaku/ReverseRun-Game2
Drone CIでのcron設定 (画面とコマンドと)

# はじめに

- Droneでのcron設定は, 公式ドキュメントを含めてインターネットに情報が少ないため, 調べたことを書く
- Droneでのcron設定は, ハマりポイントがあるため, 注意を書き残す
- 確認バージョン: 1.9.1

# cron追加方法

:::note
画面, コマンド, APIの3種類ある.
:::
- **画面**からだと, 実行周期のタイミングが5種類 (`@hourly`, `@daily`, `@monthly`, `@weekly`, `@yearly`) のみ
- **コマンド**からだと, 一般的なcron形式 (`0 */30 * * * *` とか) を使える
- **API**からのやり方は, ここでは割愛する

## 画面からのcron追加

![drone_cron_ly.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6361/16659b58-bb52-cc14-f066-fb916d5bb1b5.png)

1. cronを追加したいリポジトリを選択
1. 「**Settings**」タブを選択
1. 「**Cron Jobs**」で「**Cron Job Name**」「**Cron Job Branch**」を入力. 実行周期を選択
1. 「**Add A CRON JOB**」を押下
1. 「**Cron Jobs**」で追加した設定が確認できたらOK

## コマンドからのcron追加
### 事前準備
#### drone CLIをインストール

以下の公式を参照

https://docs.drone.io/cli/install

#### Personal Tokenを設定
1. 右上の自分のアイコンから「**User Settings**」をクリック

1. 「**Your Personal Token**」で自分のトークンを控える.
「**Example CLI Usage**」に記載のように環境変数を設定する.

```sh
export DRONE_SERVER=https://example.drone.skkzsh.me
export DRONE_TOKEN=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
```

### コマンドからのcron追加 (例)

https://docs.drone.io/cli/cron/

以下, リポジトリやcron名, 実行周期などは, 読み替えてください. 

```sh
drone cron ls skkzsh/app
 
drone cron add skkzsh/app nightly "0 */30 * * * *" --branch develop
 
drone cron ls skkzsh/app
drone cron info skkzsh/app nightly
```

画面でも「**Settings**」→「**Cron Jobs**」で追加した設定が確認できる.

# cron削除方法

:::note warn
コマンドで削除はできないため, 画面から消す
:::

# drone.ymlの書き方
- 公式情報を参照

# 注意ポイント

https://docs.drone.io/server/reference/drone-cron-interval/

:::note warn
Droneはデフォルトでは1時間ごとしかcron jobを確認しないらしい. 
そのため, 実行周期を10分ごとに設定しても1時間ごとに実行される.
:::

:::note warn
Droneは実行時刻を保証しない. 何分に設定しても, 00分に実行される. 
そのため, 設定値より最大1時間, 実行遅延が発生する可能性がある.
:::

::: note warn
タイムゾーンは JST (日本時間) でなく, UTCのため, cronの設定時刻に注意.
:::

# 公式情報

https://docs.drone.io/cron/
SOARとは

## 勉強前イメージ

セキュリティのなにかのツールって感じ？

## 調査

### SOAR とは

Security Orchestration, Automation and Response の略で、
セキュリティに関する業務を自動化・効率化するソリューションのことを指し、
セキュリティインシデントの管理機能や対処の自動化、また脅威を自動で検知するなどの機能があります。
組織内の機器や外部サービスから収集された脅威情報(下記の三要素)を一つのプラットフォームに統合します。

- インシデント対処の自動化
	- ルールを定義して判断や対処の自動化
- インシデント管理
	- 発生したインシデントやチームの管理
- 脅威インテリジェンスの活用
	- 外部からの脅威情報を集めて検知精度を高める

### SOARのメリット

- インシデントの自動化

完全な自動化、また一部自動化など程度はありますが、
インシデントの種類等によって一次対応をソリューションに任せることが出来ます。

- 業務プロセスの統一で、連携を強化

プロセスを一つにすることで、一つのプラットフォームで完結できるので、
インシデント情報の共有化が安易になり、全ての対応記録が残るので後から見返して流れを確認できるところもメリットです。

- 柔軟なカスタマイズが可能

ソリューションの組み合わせなので、カスタマイズ次第でよりよい環境を作っていくことがカノになります。

## 勉強後イメージ

正直使ったことないので、あんまりイメージついてないんだけど
機器を設定しておいて、検知をが行われれば自動的に一次対応が進められる・・・みたいな感じかな
人為的なのもあるだろうし、セキュリティという観点で一つにまとめられるってイメージかな。

## 参考

- [SOARとは？セキュリティ運用を劇的に改善！](https://www.lrm.jp/security_magazine/soar/)
- [SOARとは？セキュリティ運用の自動化により得られる３つのメリット](https://www.nri-secure.co.jp/blog/security-orchestration-automation-and-response)
【コロナ対策】ラズパイとCO2センサーでポータブルIoTシステムを作ってみた② ～使ってみた結果編～

#本記事の内容
- [前回の記事](https://qiita.com/kanamekun/items/b299da2bcbab81e0bcdd)でこんな感じの持ち運べるIoTシステムを作ったので、持ち運んで使ってみた結果の記事です。

![構成図2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2017667/da88c69d-d264-bab1-6fa0-ca5c3e765c4f.png)

実物はこちら。ラズパイにCO2センサーを付けて、モバイルバッテリーから電源を取っています。
![IMG20210923141704_BURST001.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2017667/385252d7-cfda-1bb9-ba20-4ebf1b5a63f0.jpeg)


#実施環境
- Raspberry Pi 2 Model B
- PLANEX 無線LAN子機 GW-USNANO2A ※Raspberry Pi 2はWi-Fi通信モジュールがないため、無線LAN子機をUSBに接続しWi-Fi通信を行う。
- MH-Z19B ※二酸化炭素濃度測定用センサー
- GPIOピンケーブル メス-メス ※MH-Z19BとGPIOピンを接続するのに使用
- Androidスマホ (OPPO A73)
- モバイルバッテリー (Anker PowerCore II 10000)

#評価結果
1. 寝室で寝ている間に測定してみた
2. アコースティック演奏のライブハウスに10人程の人がいたときに測定してみた

## 1. 寝室で寝ている間に測定してみた

夜の12時から朝の9時頃迄、寝室で測定してみた結果です。

![夜2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2017667/0682eea3-a84d-a373-0031-f21ad63fa34f.png)

最初の一点は、モバイルバッテリーに接続してもちゃんと動くか確認した物で、
それ以降の0:13以降のデータが連続稼働させて取得したものです。

0:13頃に換気を行い、窓を閉めて寝ました。
窓は閉めていたが、通気口により若干の換気はできていたようです。
420ppm程から上昇し600ppmを超えたあたりで数値は安定しました。

モバイルバッテリーも切れることなく9時間程稼働した辺りで測定をストップ。
まだバッテリー残量もあったので、さらに数時間は動きそうでした。

## 2. アコースティック演奏のライブハウスに10人程の人がいたときに測定してみた

![セッション中.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2017667/5a011c21-2869-79cf-4db9-1d41e59dac7d.png)

入店時にお店の方に伺ったところ、換気扇を常時フル稼働にしているとのことでした。
時々、入口の扉を開けて換気も行っており、結果はほぼ600ppm以下の状況。
思ったより低かったので、少し安心。

持ち運べるCO2センサーを作ることができたので、次は温湿度センサーを追加でつけてみようかと考え中です。

以上です。
情報セキュリティマネジメント試験　よく見る単語

1. レッドチーム演習　red team 攻撃を模擬する

2. ダークWeb 特別なツール、手段を利用してアクセスできる

3. 共通脆弱性評価システムCVSS(Common Vulnerability Scoring System)
4. >CAPTCHA stands for the Completely Automated Public Turing test to tell Computers and Humans Apart. CAPTCHAs are tools you can use to differentiate between real users and automated users.

5. クラッキング手法　　cracking
6. オプトアウト（Opt-out）、オプトイン（Opt-in）  広告メールを受けるかどうか選択
7. コーボレートガバナンス　Corporate Governance
8. メカニズム　mechanism
9. ノマドワーキング　nomad　遊牧民
10. ボットネット　C＆Cサーバ　　マルウェアの一種　commnad & control
11. スニッフィング　packet sniffing　ネットワークを流れるパケットを不正に盗み見ること
11. シュリンクラップ契約 shrink wrap contract
13. ねずみ講　　传销组织

14. IPマスカレード (IP Masquerade) 
>IPマスカレードは、プライベートIPアドレスとグローバルIPアドレスの相互変換するNATの考え方にポート番号を組み合わせた技術です。NAPT(Network Address Port Translation)とも呼ばれます。
15. APT攻撃(Advanced Persistent Threats) 持続的標的型攻撃
16. アンチパスバック 【anti-passback】
> アンチパスバックとは、入退室管理システムの機能の一つで、入室記録のない者の退室、入室済みの者の再入室など、記録と矛盾した行動を阻止するもの。
17. Pスプーフィング（IP Spoofing）
> 送信元のIPアドレスを偽装し、通信を行う攻撃手法のことである
NetworkXのbipartite(2部マッチング)でドラクエウォークのアイテムをマッチングする

[「問題解決力を鍛える！アルゴリズムとデータ構造」](https://amzn.to/3CuIzhM)という本で「何人かの男性と女性とがいて，ペアになってもよいという２人の間には辺が張られているものとします．できるだけ多くのペアを作ろうとしたときに，最大で何組のペアを作ることができるでしょうか」という、いわゆる二部マッチング問題が紹介されていて、これは私がはまっているドラクエウォークのアイテム組み合わせに使えるんじゃないかと思った。

PythonではNetworkXというライブラリに2部マッチングが含まれているので、これで試してみようと思う。u++の備忘録を参考にした。

https://networkx.org/documentation/stable/reference/algorithms/bipartite.html

https://upura.hatenablog.com/entry/2018/05/23/150523

Google Colaboratoryでは特に追加インストールすることなく試すことができた。

```python
import networkx
from networkx.algorithms import bipartite
import matplotlib.pyplot as plt
```

扱うデータと、重みづけ関数を下記のように定義しておく。ドラクエウォークは４人パーティだが簡単のため２人とし、片方に打撃系、片方に呪文の能力を高めたいという場合を想定している。メンバーが欲しいと思っている属性が武器に備わっていれば重みが加算される。

```python
members = [
        ["ヒャド属性とくぎダメージ","物質系への耐性"],
        ["ヒャド属性じゅもんダメージ"],
]
arms = [
        {"name":"ガイアーラのよろい上","ヒャド属性とくぎダメージ":5},
        {"name":"フォースコート上","ヒャド属性とくぎダメージ":1},
        {"name":"蒼竜のよろい上","ヒャド属性とくぎダメージ":3},
        {"name":"書聖のはおり","ヒャド属性じゅもんダメージ":3,"物質系への耐性":5},
        {"name":"アリアハンの服上","ドラゴン系への耐性":1,"スライム系への耐性":3},
        {"name":"光のよろい","ドラゴン系への耐性":5},
]

def omomi(member,arm):
  val = 0
  for j in members[member]:
    if j in arms[arm-len(members)]:
      val = val + arms[arm-len(members)][j]
  return val
```

ノード０～１をメンバー、ノード２～７を武器ということにしてノードの追加、エッジの追加（同時に重みづけ）を行い、`max_weight_matching`で最大マッチングを行う。

```python
members_size = len(members)
arms_size = len(arms)

member_group = range(members_size)  # 0～1
arm_group = range(members_size,arms_size+members_size) # 2～7

g = networkx.Graph()
g.add_nodes_from(job_group, bipartite=1)
g.add_nodes_from(arm_group, bipartite=0)

for i in job_group:
  for j in arm_group:
    g.add_edge(i,j,weight=omomi(i,j))

d = networkx.max_weight_matching(g)
```

ここから先は描画。ノードの表示位置を適当に決め、最大マッチングに含まれていないエッジは削除する。

```python
pos = {}
for i in job_group:
  pos[i] = (1,i)
for j in arm_group:
  pos[j] = (2,j-jobs_size)

for (i, j) in list(g.edges()):
    if (i, j) not in d:
        if (j, i) not in d:
            g.remove_edge(i,j)

networkx.draw_networkx(g,pos)
networkx.draw_networkx_edges(g,pos)
plt.show()
```

出力したグラフがこちら。１人目（ノード０）はガイアーラのよろい（ノード２）、２人目（ノード１）は書聖のはおり（ノード５）を選んでおり、想定とも合っている。

![bipartite.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33389/fc1bc080-5cf4-ee04-c996-fd8501b069fa.png)

ということで、NetworkXを使ってお手軽に二部マッチングを実装できた。重み付けだけ考えれば、あとは全部やってくれるというところがいい。
スクラムについて学んでみた

アジャイル開発のスクラムを学んでみました。

参考:

https://www.amazon.co.jp/SCRUM-BOOT-CAMP-BOOK%E3%80%90%E5%A2%97%E8%A3%9C%E6%94%B9%E8%A8%82%E7%89%88%E3%80%91-%E3%82%B9%E3%82%AF%E3%83%A9%E3%83%A0%E3%83%81%E3%83%BC%E3%83%A0%E3%81%A7%E3%81%AF%E3%81%98%E3%82%81%E3%82%8B%E3%82%A2%E3%82%B8%E3%83%A3%E3%82%A4%E3%83%AB%E9%96%8B%E7%99%BA/dp/4798163686/ref=pd_lpo_1?pd_rd_i=4798163686&psc=1

https://qiita.com/wMETAw/items/25972e4708311ed4f779

# スクラムとは

一定期間で動くプロダクトを作り、それに対してのフィードバックを行いながら開発をしていくアジャイル開発のうちの開発手法の一つ

# 役割
#### プロダクトオーナー
- プロダクトの価値を最大化する
- プロダクトバックログの管理をする
- プロダクトバックログの項目の並び順を決める

#### スクラムマスター
- スクラムの仕組みを円滑に回るようにさせる
- 周りからの妨害からスクラムチームを守る
- タスクのアサインや進捗管理をしない

(スクラムマスターはプロジェクトをブンブン回すようなイメージがありましたが、調べてみると縁の下の力持ちのような存在でした)

#### 開発チーム
- モノを作る
- 肩書きなどはなし(プログラマーやテスターなど)

#### ステークホルダー
- プロダクトの利用者、出資者などの利害関係者

# 用語
#### プロダクトバックログ

- 実現したいことをリストにして並べる

#### スプリントバックログ

- 選択したプロダクトバックログ項目と実行計画
- プロダクトバックログを具体的な作業に分割する
- 一つ一つのタスクは1日で終わるサイズに分割する

#### インクリメント

- スプリントで作成された実装・テスト済みの機能

#### スプリント

- スプリントゴールを達成するための一定に決められた期間のこと
- １ヶ月以内に設定する
- 期間の長さは固定

#### スプリントプランニング

- プロダクトオーナーが何をして欲しいかを決める
- 開発チームはどれくらいできるか
- 開発チームはどうやって実現するか

https://qiita.com/Koki_jp/items/bcc5762614af8ae395cc

#### スプリントレビュー

- **完成したもの**を関係者にデモする
- フィードバックをもらう
- プロダクトオーナーが主催する
- 今後の予定や見直しを共有する

#### スプリントレトロスペクティブ

- バグが生まれるプロセスを見直す
- うまくいったこと、今後の改善点を整理する

#### デイリースクラム

- 毎日決まった時間に集まって行う
- 話す内容
  - スプリントゴールを達成するために昨日やったこと
  - スプリントゴールを達成するために今日やること
  - スプリントゴール達成の妨げになる障害や問題点

# スクラム開発の流れ

プロダクトの機能や要求をリストにする(プロダクトバックログ)。
↓
スプリントのゴールを決めてそのスプリントで開発する項目をプロダクトバックログから選択し(スプリントプランニング)、その項目のためにどのような作業が必要なのか、また必要な作業を１日で開発できる単位に分割する。
↓
開発して動作するプロダクト(インクリメント)を作成する
↓
インクリメントをデモしてフィードバックを得る(スプリントレビュー)
↓
スプリントの中での改善点などを話し合う(スプリントレトロスペクティブ)

上記を繰り返す
野球好きが作るプログラミング 〜PHP編〜 変数、for文

##1.変数

＊変数の意義:
　1.その値がどのような意味を持つのか？がわかりやすくなる。
例)

```
  $speed=150;
  $control="A"
  $stamina="C"
```
　2.値を変更するのが楽になる
例)松坂選手の最速は１５６kmです。と出力したい時

```
<?php
    $pitcher = "松坂";
    $speed = 156; 
    echo $pitcher."選手の最速は".$speed."kmです。" 
?> 
```



例)これを、涌井選手の最速は１５１kmです。と出力したい時

```
<?php
    $pitcher = "涌井";→ここと
    $speed = 151; →ここを変えるだけ

    echo $pitcher."選手の最速は".$speed."kmです。" 
?> 
```

＊変数がないとどうなる？

```
echo "松坂選手の最速は156kmです。" 
echo "涌井選手の最速は151kmです。" 
echo "成瀬選手の最速は144kmです。" 
```

こんな感じで同じコードを何度も繰り返さなくてはならない状況になってしまいます。

言い方として正しいかどうかわかりませんが、値が変化するところには、変数を使うよう心がけましょう。

##2.for文
＊forの意義:
プログラミングを書いていると同じコードをくりかえすことがありますけれど、それってめんどくさいですね。
例えば

```
 echo "ピッチャー第1球投げました."
 echo "ピッチャー第2球投げました."
 echo "ピッチャー第3球投げました."
 echo "ピッチャー第4球投げました."
 echo "ピッチャー第5球投げました."
```

こんなの永久に描いてられないですよね。

そこでfor文を使います。

```
for($i=0;$i<10;$i++){
echo "ピッチャー第".$i."球投げました"
}
```
という形になります
forを使うにあたって大事なのが
①スタートの値
②いつまで
③１回転でいくつ増えるかというのを意識します
④繰り返したい記述
今回で言うと、

```
for(①;②;③){
④
}
```
と言う形になるので$iが10より小さい限り④の記述を、描き続けます。
でもこいつが永遠に描き続けられたら困りますよね？

なので②のゴールを決めてあげる必要があります。
でもfor文はこのままだと足踏みしているだけなのでゴールがあっても今のままだと永遠にたどり着けません。

そこで③の１回転するといくつ増えるかと言う記述を書く必要があるのです。

```
$i++
```
とは１回転終わると１ずつ増えるという記述です。
 echo "ピッチャー第$i球投げました."

が1回終わると、$iが＋１されます。

こうしていくうちに②で記述した$i<10よりも$iが大きくなってしまいます。

その瞬間for文は終わりになるのです。
Reactで入力された値を保持させたい

## inputに入力された値を保持、表示させる
onChangeイベントとuseStateを利用してinputタグに入力された値を表示させます。

まずはstateを管理するための記述を書きます。

```js
// CDNで React　を利用する場合はReact.useState()と記述します。
const [name, setName] = React.useState('〇〇');
```

次に現在の状態をセットする関数の定義

```js
const handleOnChange = (event) = setName(event.target.value);
```

レンダリングするDOMを定義

```js
return (
  <div>
    // changeイベントが発生した時にnameの値をセットする関数を呼び出す
    <input type="text" onChange={handleOnChange} />
    <p>こんにちは、{name}さん</p>
  </div>
);
```

<blockquote class="twitter-tweet"><a href="https://twitter.com/Hikari79722/status/1435469433649000452"></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
Service Cloud Specialist Superbadge

[まとめページに戻る](https://qiita.com/Keiji_otsubo/items/60afc2a8d211b6f7d89f)

# Step 3

**We can't find the correct Page Layout for the System Administrator Profile. Review the steps to ensure you assign the Cloud Technical Team Page to the System Administrator Profile.**

+ [Service Cloud Specialist: Establish case management](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000H0Pzh)
+ [Super badge Service Cloud Specialist](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000A93isSAB)

# Step 5
**We can't find that Case Agents have access to Knowledge. Ensure Agents have access to Knowledge when viewing a Case.**


[How to grant access to Knowledge?](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000ChJzXSAV)


# Step 6

**We can't find the 'Send Email' macro. Ensure the Macro sends an email to the customer.'**

[Service Cloud Super Badge #7 Build Case & Agent Automation: We can't find the Send Email Macro.](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000EmMek)

**We can't find an automated action in the Cloudy Weather template. Ensure you create the Cloudy Weather Resolution automated action.**

[stuck in challenge 6 please help.](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000FYxtd)

**Ensure this task is automatically created when case type is electrical and reason is performance and status is working**

[Service Cloud Specialist Superbadge Challenge 6](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000G4Un8)

何らかの理由で、ワークフロールールの[アクティブ化]ボタンがSafariで機能しません。だから私はグーグルクロームに変更しました、そしてそれはうまくいきました！ 

# Step 7

**We recommend using a new Developer Edition (DE) to check this challenge. If you're using a new DE and seeing this error, please post to the developer forums and reference error id: FEHXKVKF**

[スーパーバッジサービスクラウドスペシャリスト：エラーID：FEHXKVKF](https://developer.salesforce.com/forums/?id=9062I000000g9QHQAY)
少人数による遠隔での組込み開発

# はじめに
　現在、とある理由から大阪と北海道の２拠点で２人（リーダー（北海道）、作業者（大阪））で開発を進めています。昔であれば、１）自前でサーバを用意したり、２）遠隔接続できる仕組みを用意したりと環境整備に大変時間が掛かりましたが、Googleの各種サービス及びGitHubを用いて遠くにいてもある程度効率的に作業を進めることができます。特に、ほぼ無料で使用できるGoogleKeepやGitHubは、進捗管理や遠隔での環境構築に非常に役に立ちます。正直言うと、普段からQiitaを参照している方にとっては、「は？」と言われそうな内容ですが（笑）、現在では当たり前のようになっていると思われる開発環境を自社を事例に示します。

# 開発環境
　![開発環境.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423321/05518b9f-f025-a37e-5723-149ad8bed8dc.jpeg)

# 利用方法
　各サービスごとの利用方法を列挙します。リーダー（北海道）、作業者（大阪）として説明を進めます。

##GoogleKeep
![スクリーンショット 2021-09-23 7.15.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423321/7ed5fdea-d74e-b5bf-f7ce-e996ba2299e8.png)

* リーダーは、取り組んで欲しい課題を登録する
* 作業者は、リーダーが登録した課題に付随する問題を共有する
* 作業者は、解決した課題を消しこむ

##GoogleDrive  
![スクリーンショット 2021-09-23 9.27.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423321/a74366a5-d40f-8030-0b0d-c55855264d9e.png)

* 作業員は、組込みシステムのOSイメージを共有する
* リーダーは、OSイメージを自分の組込みシステムにロードし、動作確認を行う

##GitHub
![スクリーンショット 2021-09-23 9.41.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423321/3a26ded6-75d8-733f-9b34-7893be8a3b37.png)
![スクリーンショット 2021-09-23 9.42.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423321/562cc228-89bb-407f-56be-6bffcc91a06b.png)

* 作業員は、GitHubにprivateでリポジトリを用意し、firebaseにデプロイできる仕組みを構築する
* 作業員は、リーダーにリポジトリの共同作業者として登録する

##Sourcetreeでの参照
![スクリーンショット 2021-09-23 11.59.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423321/0aa3e1cf-4b16-5721-90c8-8fa7daf658bb.png)

* SourcetreeでGitHubのリモートリポジトリを参照できるようにパスを通す 
（以降、上図のWebForFbaseをローカルにクローンする例を示す）
* 該当リポジトリのクローンを押下
![スクリーンショット 2021-09-23 12.07.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423321/06d58aa7-6563-e0b5-5797-a2ec1de23173.png)

* 保存先のパスを指定する
* 「これはGitリポジトリです」という表示が正しくパスが通り、認証が成功していることを意味する
* リーダーは、ローカルにクローンしたファイルを必要があれば手直しする

##Firebaseにデプロイする
1　nodejsをインストールする 
（nvmやhomebrewなどのバージョン管理ツールを使ってインストールしても良い。）
2　firebase-toolsをインストールする

~~~
npm install --global firebase-tools
~~~

3　firebaseにログインする

~~~
firebase login
~~~

4　firebaseにデプロイする

~~~
firebase deploy
~~~

通常は、firebase initだが、既に環境構築されたものをdeployするため、そのままdeployできる

#まとめ
　昔は、自前でソース及びデータを共有する環境を構築するか、メール等で共有する必要があった。自前で環境を整備する場合には、ネットワーク、サーバ、保守費などが問題になった。また、メール等で共有する場合であってもソース及びデータが散乱したり、メールの送信容量制限などの制約で躓くことが多かった。
　今回、初めてGoolgleやGitHubなどの仕組みを利用することで、安価に開発環境を構築することができ、４５歳にして、あらためて色々勉強になった。

#事前設定
1　SourcetreeでGitHubアカウントを表示する  
Sourcetree->環境設定->アカウント->追加
![スクリーンショット 2021-09-23 18.42.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423321/273b959b-bded-7a43-9e40-5263304cfdb3.png)

2　アカウントを表示し、設定を確認する
![スクリーンショット 2021-09-23 18.42.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423321/43c82f84-c82e-de8d-7ef6-33e5858b2df0.png)

3　GitHubのprivateリポジトリに２段階認証で接続する
以下のページを参考にしました。ありがとうございます。
[二段階認証したGitHubで SourceTreeを使う為の手順](https://zenn.dev/rata/articles/c62f97fa87bb43)


* ユーザ名とパスワードを入力する  
 * ユーザ名は、GitHubの自分のID, パスワードはトークンを設定する
 * トークン生成は https://github.com/settings/tokens にアクセスする
【UE4】Level Sequenceの再生位置をBlueprintから指定するメモ

[link-1]:https://docs.unrealengine.com/4.27/ja/AnimatingObjects/Sequencer/HowTo/DynamicTransforms/
[link-2]:https://www.slideshare.net/EpicGamesJapan/gcc2019ue4sequencer

# 参考サイト

- [動的なトランスフォームを使用してレベルシーケンスを作成する - UE4公式][link-1]
- [UE4のシーケンサーをもっともっと使いこなそう！ 最新情報・Tipsをご紹介！ - Slideshare][link-2]

# やりたいこと

- レベルシーケンスの再生位置を変更したい。
    - [UE4公式ドキュメント][link-1]にあるように、Transform Origin Actor または Transform Origin を使用すると良い。
- これをBlueprintから任意に指定したい。
    - イベントが起こった位置にシーケンスを配置するなど。
    - 実は答えが[Epic Gamesおかずさんの資料][link-2]のスライド164ぐらいに書いてある。

::: note info
要するにこの記事は「すぐ忘れてしまう自分向けのメモ」です。
:::

# 前説：Transform Origin ActorとTransform Origin

Level Sequence Actorの詳細パネルの「Instance Data」にある。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/358170/32a7cd0e-4781-304a-19b6-237896ee1f82.png)
`Override Instance Data`をTrueにすると、`Transform Origin Actor`と`Transform Origin`の項目が現れる。

なお

- 誤　
Transform Origin Actorの位置から、Transform Originだけオフセットした位置で再生。

- <font color="red"><b>正　Transform Origin Actorがあればそれを使用、指定されていなければTransform Originを使用。</b></font>

という効能なので注意。

# Blueprintから、その時々に応じた位置を指定するには。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/358170/65197a49-1e66-61a1-ece0-eca155438d5e.png)

要点

- Level Sequence Actorのメンバ`Default Instance Data`はオブジェクト型なので、正しい型にキャストしてやらないと、データのGet/Setができない。
    - その型は`DefaultLevelSequenceInstanceData`型である。
    - C++ソースを漁らないと見つからないのが罠。(LevelSequenceActor.cpp 内 ALevelSequenceActorのコンストラクタを参照のこと)
- `Override Instance Data`をTrueにセットしてやらないと、機能しないので注意。

:::note info
この「DefaultLevelSequenceInstanceData」をすぐに忘れてしまうのです…
:::
Bitriseを使ったライブラリの自動定期更新で楽に開発

Bitriseさんに賞をもらった時に、こっち書いた方がよかったかもなーと思った内容です。

#ライブラリの自動定期更新にあたって
**結論めちゃくちゃ楽になってOSの更新やSwiftの更新がある程度の規模でも10分で終わるようになりました。**

**お急ぎの方は「対象になりそうなプロダクト」からお読みください。**

###放置しがちなライブラリの更新は忘れられる
アプリを開発していると、ライブラリの更新があっても利用する機能が変わらないため日々の更新対応は優先順位は下がりがちです。
結果プロダクトバックログではどんどん下がり、いつしか忘れ去られる運命をたどります。

###そして、静かに近づく時限爆弾の爆発
忘れ去られた結果、本来の対応とは別にframeworkの変更対応の工数が予測より増え、ビジネスチームが期待する新機能の追加や機能拡張をする時間を削られ、ロードマップをずらす時限爆弾が爆発します。

例えば
- XcodeやSwiftの新しいバージョンに切り替える際のリビルド時
- サードパーティもしくはAppleのレギュレーション変更時

こういった作業は元々、実施価値がビジネスサイドには見えにくいので、時限爆弾の爆発からの信用低下は避けたいところでもあります。

###結局は、夏休みの宿題
結局コツコツと小さな差分をコンスタントに愚直に適用していくのが、楽なんです。
APIが変わらなければ、1日もかからずできます。

計算ドリル５問を毎日やるのと、150問全部やるのだったら、1日5問をやるのが楽ですよね。

###でも、やらないんだなー
私は怠惰なので、結局今日はやらなくなって。夏休み明けに時限爆弾の爆発を迎えるのです。
でも私たちは大人になったのでやらない方法で解決しましょう。

#対象になりそうなプロダクト

- CocoaPodsやCarthageでライブラリ導入している.
- 無料で仕組み化したい
- めんどくさがり屋が多い

#技術スタック

- Bitrise
- Fastlane
- 自動テスト

とてもシンプルです。ライブラリ自動更新後の自動テストもセットで必要です。

例えば、SNSを利用したログイン/登録の機能が使えるかのテストであれば、大きく機能が修正されない限りはライブラリを呼び出せるかまで（Facebookでログインするを押してクラッシュしないかなど？)でもまずは良いと思います。

#別の方法の検討
iOSにはDependabotがありません。Githubに吸収されてプロジェクトが止まってます。
またRenovateがあるのでCarthageの更新以外は利用すると良いと思います。

#ざっくりとしたフロー
1. Fastlaneで`outdated`でライブラリの更新がないかチェックする

2. outdatedに更新情報が入っていたら更新を行う
CarthageやCocoaPodsそれぞれ出力が違うのでチェック方法も変わります。

3. `update`を行いgitへpushし、pr
4. prをトリガーに自動テストを実行


#### laneのイメージ

  ```Fastfile.rb
lane :update_carthage do
  outdated += sh("carthage outdated")
  unless outdated.empty? then
  // 更新処理.
  // commit処理.
  // githubへpushしPRを作成.
  end
end
  ```

  ```Fastfile.rb
lane :update_pods do
  outdated += sh("pod outdated")
  unless outdated.empty? then
  // 更新処理.
  // commit処理.
  // githubへpushしPRを作成.
　　　end
end
  ```

#運用した効果
iOSやSwiftの更新は今年はCarthageのリビルドの**10分だけで終わり**ました。
毎年１-4週間かかっていた作業はいったい何だったんだろうと感じました。
また自動テストと合わせて行うことで、コンスタントにライブラリの更新を実施可能になりました。
Bitriseで行うメリットはworkflowで普段使うstack(XcodeやOSなどの環境)と自動同期できるのでcarthageも自動化できるのが良いと思います。
【AWS】カスタムAMIの作成

#はじめに
本記事は以下の記事に関連した内容となっています。
※以下、「関連記事」と記述します。

https://qiita.com/zeems/items/7967f94e0049ed03eb40

#実現したいこと
関連記事内では Auto Scaling グループを使用した構成とするために起動テンプレートを使用しています。
また、起動テンプレートのユーザーデータにより必要パッケージのインストールやファイル・ディレクトリの権限設定、GitHub・S3から必要なファイルのダウンロードなどの処理を行っています。
これらの処理や設定が反映された状態のEC2インスタンスからAMIを作成し、そのカスタムAMIを使用して起動テンプレートを構成したいと思います。

#EC2インスタンス 作成
AMIのもととなるEC2インスタンスを作成します。
関連記事内で使用しているユーザーデータは以下になりますので、それぞれの処理・設定を行います。
※GitHubリポジトリのURL、S3バケットの名前は環境ごとに置き換えてください。
※内容の詳細は関連記事をご参照ください。

```shell:userdata
#!/bin/bash
#必要なパッケージ・モジュールをインストール
yum -y update
yum -y install python3 git python3-devel mysql mysql-devel gcc
pip3 install django
pip3 install mysqlclient
pip3 install gunicorn
amazon-linux-extras install nginx1

#Nginxサービスの自動起動設定・開始
systemctl enable nginx
systemctl start nginx

#Staicファイル用ディレクトリの作成
mkdir /usr/share/nginx/html/static

#git clone用認証情報ファイルのダウンロード
aws s3 cp s3://<S3のバケット名>/.netrc /root/.netrc

#DjangoプロジェクトをGitHubから取得
git clone <GitHubリポジトリのURL> /home/ec2-user/mysite

#Djangoプロジェクトの所有者をec2-userに変更
chown -R ec2-user:ec2-user /home/ec2-user/mysite

#setting.py内で使用するパスワード等を記述した外部ファイルをダウンロード
aws s3 cp s3://<S3のバケット名>/settings_secret.py /home/ec2-user/mysite/mysite/settings_secret.py

#上記ファイルの所有者をec2-userに変更
chown ec2-user:ec2-user /home/ec2-user/mysite/mysite/settings_secret.py

#Gunicornのサービスユニットファイルをダウンロード
aws s3 cp s3://<S3のバケット名>/gunicorn.service /etc/systemd/system/gunicorn.service

#Gunicornサービスユニットファイルの権限を変更
chmod 644 /etc/systemd/system/gunicorn.service

#Gunicornサービスを自動起動設定・開始
systemctl enable gunicorn.service
systemctl start gunicorn.service

#Nginx設定ファイルをダウンロード・パブリックIPアドレスを置換
aws s3 cp s3://<S3のバケット名>/mysite.conf /etc/nginx/conf.d/mysite.conf
localip=`curl http://169.254.169.254/latest/meta-data/local-ipv4` → ここでは実行しない
sed -i -e "s/ec2-localip/$localip/g" /etc/nginx/conf.d/mysite.conf → ここでは実行しない

#Nginxサービスを再起動
systemctl restart nginx

#StaticファイルをSTATIC_ROOTに記述したパスに配置
cd /home/ec2-user/mysite
python3 manage.py collectstatic

#Staticファイル用ディレクトリの所有者をec2-userに変更
chown -R ec2-user:ec2-user /usr/share/nginx/html/static
```
:::note warn
以下の処理についてはカスタムAMIから展開された各EC2インスタンスごとに反映させる必要があるため、AMI用EC2インスタンス設定時には実行せず、カスタムAMIを使用した起動テンプレートのユーザーデータで実行します。
:::

* Nginx設定ファイルの`server_name`の値の文字列置換

```shell:userdata
localip=`curl http://169.254.169.254/latest/meta-data/local-ipv4`
sed -i -e "s/ec2-localip/$localip/g" /etc/nginx/conf.d/mysite.conf
```

一通りの設定が完了したら、EC2インスタンスを停止します。

#カスタムAMI 作成
EC2インスタンス画面で作成したインスタンスを選択し、[アクション]-[イメージとテンプレート]-[イメージを作成]をクリックします。
![スクリーンショット 2021-09-23 12.41.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1410257/7b3623c2-eb05-d9d0-787e-2a67afd74dae.png)

イメージ作成画面が表示されるので、`イメージ名`を入力し、[イメージを作成]をクリックします。
![スクリーンショット 2021-09-23 12.44.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1410257/74c64f09-07f1-e21b-07ea-2704da3f7b02.png)

画面左の[イメージ]-[AMI]を選択し、AMI一覧画面を開きます。
作成したAMIの`ステータス`が「available」になっていることを確認します。
![スクリーンショット 2021-09-23 12.52.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1410257/bb8e2aec-01e4-81a8-eac2-c64f8b671261.png)
CMakeで複数ソースファイルの扱い - 単一プログラム作成VSライブラリ作成

いつかは避けられないソースファイルの適切な分割や、ライブラリの作成。
単発のプログラム作成とライブラリ作成におけるソースファイルのCMakeでの指定では使用するディレクティブが違います。

C++専門ではないが実務で書く必要が出てきた僕みたいな人のための記事です。


# 複数ソースファイルで単一のプログラムを作成する時
学びはじめは、ソースファイル分割しながらビルドするときは`add_executable`ディレクティブを使ってました。この程度だとCMakeあってもなくても労力は変わりませんね。

```
add_executable(ProjectName main.cpp foo.cpp)
```


# 複数ソースファイルでライブラリを作成する時
でも、ライブラリ作成するとなると`add_executable`は使えません。
ソースファイル分割しながら、CMakeでライブラリを作成するときは`add_library`を代わりに使いましょう。

```
set BRABRA_FILES{
  main.cpp,
  bar.cpp,
  bar.hpp
}

add_library(ProjectName SHARED ${BRABRA_FILES})
```

ライブラリを作成する必要が生じたぐらいのタイミングから、リンクやソースファイルの指定がCMakeなしでは面倒になってきます。これらをCMakeで効率的に指定することは、実務では避けられません。
g++にオブション渡しまくって解決するのは時間がもったいないです。
**CMakeに感謝し、巨人の肩に乗りましょう！**

https://cmake.org/
WindowsでCのコンパイル環境を構築する

#はじめに
WindowsでCのソースを修正する機会があったので、コンパイルまでの環境構築メモ

#環境
- Windows 10
- MinGW

#手順
以下のページにアクセスしよう。
https://osdn.net/projects/mingw/releases/68260　

一番下の mingw-get-setup.exeをダウンロードし、起動しよう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329816/b272995d-e545-b7c2-61c8-a9f78a34f264.png)

以下が画面が表示されるので、「Install」ボタンをクリックしよう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329816/dd749b31-43c4-efee-d34a-a894eefc731d.png)

以下が画面が表示されるので、「Continue」ボタンをクリックしよう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329816/4cff3774-ce1e-7ac8-9265-5a0ddc222e1e.png)

ツールのインストールが始まるのでしばらく待とう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329816/36958d31-a25b-5a26-c881-3d26a27fba03.png)

以下の画面が立ち上がるので、インストールしたいライブラリを選択（ここでは、mingw32-base-binとmingw32-gcc-g++-binを選択)し、「Installation」→ 「Apply Changes」を実行しよう、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329816/cc6272b5-c91e-2ec0-6f15-2215899b8ba4.png)

Applyをクリックすると、ライブラリのインストールが始まるのでしばらく待とう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329816/363f7fcd-9172-3c2a-9ce3-a5412e1847f4.png)

終わったら環境変数を開いてPath変数に、インストールしたフォルダの下のbinディレクトリ(デフォルトの場合, C:\MinGW\bin)を追加しよう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329816/a575c065-9362-fc45-555a-d543d330dbb9.png)

以上で準備完了。

#コンパイル
適当にCのソースを用意しよう。ここでは、以下pdfの一番下にあるオイラー法のプログラムをコピペし, test.cという名前で保存

http://www.ritsumei.ac.jp/~kht23151/joho/keisan2.pdf

以下の通りコンパイルしよう。

```
gcc -o test.exe test.c
```

以下の通り実行しよう。

```
./test.ext
0.000000 1.000000
0.050000 1.000000
0.100000 0.997500
0.150000 0.992500
0.200000 0.985006
0.250000 0.975031
```

うまくいってるっぽい。
*Hava a good a C programming life on WIndows 10!* 


#参考
- [MinGW - Minimalist GNU for Windows](https://ja.osdn.net/projects/mingw/)
- [MinGW(gcc) の Windows へのインストールと使い方]
(http://yohshiy.blog.fc2.com/blog-entry-292.html)
【Flutter】MaterialBannerを表示する

# 背景
Flutter 2.5.xから導入されたMaterialBannerを試してみました。
ユーザに何かを確実に確認させたい場合、便利かもしれません。

# 実装イメージ
![output.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1424230/5cd310b9-6778-cd4c-1b2c-8d1227b48893.gif)


# 環境
```shell-session
$ flutter --version
Flutter 2.5.1 • channel stable • https://github.com/flutter/flutter.git
Framework • revision ffb2ecea52 (5 days ago) • 2021-09-17 15:26:33 -0400
Engine • revision b3af521a05
Tools • Dart 2.14.2
```

pubspec.yaml

```yaml:
environment:
  sdk: ">=2.14.2 <3.0.0"
```

# 実装
以下の公式ブログ[1]とこちらの記事[2]を参考にして実装しました。
微妙につまづいた所はコメントに記載しているので、その辺りも見ていただければと。
[1] https://medium.com/flutter/whats-new-in-flutter-2-5-6f080c3f3dc
[2] https://rizumita.medium.com/flutter%E3%81%A7snackbar%E3%82%92%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B-153ae42b6dea

ポイントとなる部分を以下にピックアップしました。表示したいタイミングで、以下をコールすると画面上部に表示されます。
※もし、ソースコードを簡単に動かしたい場合は、[GitHub](https://github.com/ko-izumi/material_banner)に置いたので参考にしていただければと。


```dart:
ScaffoldMessenger.of(context).showMaterialBanner(
  /// ✨✨sdkが2.14以上でないと呼び出せないので注意
  MaterialBanner(
    content: const Text('Hello, I am a Material Banner'),
    leading: const Icon(Icons.info),
    backgroundColor: Colors.orange,
    actions: [
      TextButton(
        child: const Text('Dismiss'),
        onPressed: () => ScaffoldMessenger.of(context)
          .hideCurrentMaterialBanner(),
      ),
    ],
  ),
),
```

そこまで長くないので呼び出し方含めてサンプルコード全文も。
※既にScaffoldを定義している場合に、MaterialBannerを表示する際、少しハマったのでその辺りだけ見ればいいかも。

```dart:
void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: Scaffold(
        appBar: AppBar(
          title: Text('Material Banner sample'),
        ),

        /// ✨✨SnackBarと同様にMaterialBannerも、既にbuildの中でScaffoldを利用している場合、Builderが必要。
        /// (微妙にハマりポイントかもしれない)
        body: Builder(
          builder: (BuildContext context) {
            return Center(
              child: ElevatedButton(
                child: const Text('Show MaterialBanner'),
                onPressed: () =>
                    ScaffoldMessenger.of(context).showMaterialBanner(
                  /// ✨✨sdkが2.14以上でないと呼び出せないので注意
                  MaterialBanner(
                    content: const Text('Hello, I am a Material Banner'),
                    leading: const Icon(Icons.info),
                    backgroundColor: Colors.orange,
                    actions: [
                      TextButton(
                        child: const Text('Dismiss'),
                        onPressed: () => ScaffoldMessenger.of(context)
                            .hideCurrentMaterialBanner(),
                      ),
                    ],
                  ),
                ),
              ),
            );
          },
        ),
      ),
    );
  }
}
```
trainer board for esp32

<a href="https://jlcpcb.com/JPA" rel="nofollow"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">JLCPCB</font></font></a>は皆様によりよ良いPCBサービスを提供したいと存じます。このトレーナーボートは新たな可能性を与えることができます。どうぞお楽しみください！！

![IMG-20210921-WA0028.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1873014/c125fc8c-775d-97a1-4c2f-1156173ea481.jpeg)
![IMG-20210921-WA0029.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1873014/d39c368e-02cb-6cec-aed7-fbb8ca7b4bba.jpeg)
![IMG-20210921-WA0030.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1873014/4df6a067-b100-afab-d05f-6f5bddb34e5b.jpeg)
【Rails】Uncaught ReferenceError: $ is not definedを解消した話

# エラーが発生した経緯
Railsで非同期通信を用いたチャット機能を作成するにあたり、メッセージ送信時に`js.erbファイル`を呼び出すところまでは成功していた。(js.erbファイルにconsole.logで記述した内容が、検証ツールのconsoleで出力されることを確認)

しかしいざ`$('.message').append〜`のような記述をしてメッセージを送信しようとすると、検証ツールのconsoleに`Uncaught ReferenceError: $ is not defined`というエラー文が表示されてしまい、非同期通信ができない。

# 結論：エラーの原因
「$なんて変数名存在しないよ！」とエラー文で言われている通り、
**jQueryを導入できていない**ことが原因でした。

# jQueryの導入方法

**①jQueryを導入したいアプリケーションのターミナルで下記コマンドを実行**

```
% yarn add jquery
```

**②念の為、jQueryの記述が追加されているかどうか、次の2つのファイルの中身を確認する**
・package.json => "jquery": "^3.3.1"
・yarn.lock => jquery@^3.3.1:

※ファイルを開いた状態で`⌘＋F`を実行すると検索ボックスが現れます。
 そこに「jQuery」と入力すると対象の文字列が強調されるので、記述が探しやすくなります。

**③environment.jsにコードを追加する**

```config/webpack/environment.js
const { environment } = require('@rails/webpacker')

// 追加ここから
const webpack = require('webpack')
environment.plugins.prepend('Provide',
  new webpack.ProvidePlugin({
    $: 'jquery/src/jquery',
    jQuery: 'jquery/src/jquery'
  })
)
// 追加ここまで

module.exports = environment
```

**④application.jsにコードを追加する**

```app/javascript/packs/application.js
require("@rails/ujs").start()
require("turbolinks").start()
require("@rails/activestorage").start()
require("channels")
require("../card")
require("jquery")  //このコードを追加
```

これで非同期通信を行うための`$('.message').append〜`という記述を読み込んでくれるようになりました！



# 最後に
プログラミング初学者ゆえ詳しくは分かりませんが、Rails6からjQueryの導入方法が変わっているそうです。
自分はそもそも導入することすら知りませんでしたが・・・。

今回の記事は下記のブログを参考にしたものなので、合わせてご参考ください！
ご指摘などあれば、ご教授頂けますと幸いです。

参考にした記事：[Introducing jQuery in Rails 6 Using Webpacker](https://www.botreetechnologies.com/blog/introducing-jquery-in-rails-6-using-webpacker/)
crypto-jsを使用した復号処理でハマったこと

# ハマったポイント
個人開発でFirebaseから取得した暗号化された値を復号するという処理を実装していた際に、**復号した結果が正しく表示されない事態**にぶち当たりました。その際に上手くいかなかった原因を備忘のために記載しておきます。

# そもそも
### 「AES?Padding?...（今でもきちんと説明できる自信がない）」
暗号化・復号の概念についてはまったくもって詳しくなかったため、試行錯誤しながらの取り組みでした:umbrella:
基礎や単語については[こちらのQiita](https://qiita.com/asksaito/items/1793b8d8b3069b0b8d68)を見て学ばせていただきました:bow:
暗号化についてはいずれもっと学びたいです。

# やりたかったこと
- Base64でエンコードされた暗号文を復号(Decrypt)すること。
- 使用言語はTypescript

# やったこと
1. `npm i -D crypto-js @type/crypto-js`でnpmパッケージをインストール
2. 復号処理を実装

### 復号処理
```typescript
import CryptoJS from "crypto-js"

const decrypt = (word, passPhrase) => {
    const key = passPhrase.substring(0,16) // AES-128を使用していたため16文字。これをUTF-8でParseしてWordArrayを生成する。
    const encryptedBase64 = CryptoJS.enc.Base64.parse(word)  // 暗号文をBase64でParseしてWordArrayを生成する。
    const cipherParams = CryptoJS.lib.CipherParams.create({
        ciphertext: encryptedBase64,
        iv: CryptoJS.enc.Utf8.parse(key),
        // mode: CryptoJS.mode.ECB, // ここのmodeはパッケージのexample通りに記述しても型が違うと怒られるので要注意！
        padding: CryptoJS.pad.Pkcs7,
    })
    
    const plainText = CryptoJS.AES.decrypt(cipherParams, CryptoJS.enc.Utf8.parse(key), {mode: CryptoJS.mode.ECB})
    return plainText.toString(CryptoJS.enc.Utf8)
}

console.log("output", decrypt("hoge", "pass")) // 出力
```

### ハマったポイント:skull:
自分がハマったのはkeyでした。
`CryptoJS.AES.decrypt`の型をみると、

```typescript
decrypt(ciphertext: CipherParams | string, key: WordArray | string, cfg?: CipherOption): WordArray
```
となっており、**keyを以下のようにstringのまま渡していました。**

```typescript
const key = passPhrase.substring(0,16) 
const plainText = CryptoJS.AES.decrypt(cipherParams, key, {mode: CryptoJS.mode.ECB}) // UTF-8でparseしていない。
```
これによって復号が上手く行かなかったみたいです。
もしかするとWordArrayに変換した暗号文については、WordArrayのkeyを用意する必要があるのかも知れません。

# さいごに
暗号化や復号については初めて触れる実装だったので、結構大変でした
自分は原因がわからず、また有効なリソースも見つけられず途方にくれていました。
復号で上手く行かない場合に少しでもこの記事がきっかけになれば嬉しいです。
池天のGas便利Func一覧

みなさんこんにちは。Gasで、開発していく上で、必要だなぁって思って、作成した関数をみなさんに公開いたします！みなさんも、ぜひ、必要に応じて、利用してみてください！


#GasをWebアプリで公開する際のログとり

```javascript:funcTools.gs
var para = DocumentApp.Paragraph

function log(message) {
  // logされたときのみ、paraを読み込む。そして、時間を表示。
  if (!para) {
    // logを読めるようにしたい。
    var doc = DocumentApp.openById("~ドキュメントID~");
    var body = doc.getBody();
    var now = Utilities.formatDate(new Date(),'Asia/Tokyo','yyyy/MM/dd HH:mm:ss');
    para = body.appendParagraph( now );//段落をアペンドする
  }
  para.appendText("\n" + message);
}
```

これで、logを表示させる場合は、log();で、Googleドキュメントに、記録できちゃうんです！

#ログに、json型のデータを表示。

Webアプリとして開発中に、つきものである、json型のデータ。これで、データの中身が、一眼でわかっちゃいます。

```javascript:funcTools.gs
function display_json(e) {
  const reg = new RegExp(",\"","g") // 渡ってきた値を見やすく改行
  return JSON.stringify(e).replace(reg,",\n\"");
}
```
ただ、みやすいところで、改行を入れてあげるだけの簡単なコードですが、これがかなり便利！

#最後に

まだ、2つしか、載せられてないですが、また、思いつき次第、どんどん載せて行きますね！
Kubernetesクライアントのセットアップ方法

# はじめに

Kubernetesのクライアントをセットアップしようと思ったら
意外とセットアップ方法の記事がなかったのでメモ。

公式には下記ページに簡単な説明がされている。
[(オプション)コントロールプレーンノード以外のマシンからのクラスター操作](https://kubernetes.io/ja/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/#オプション-コントロールプレーンノード以外のマシンからのクラスター操作)


# 1. ポート開放

kubernetesのコントロールプレーンとクライアントマシンで通信を行うため、以下のポートを開放する。

コントロールプレーン：`6443`
クライアントマシン：`10250`

公式ページには[必須ポートの確認](https://kubernetes.io/ja/docs/setup/production-environment/tools/kubeadm/_print/#必須ポートの確認)に記載がある。

![ポート.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/705474/3c099263-ce19-9718-6581-2ecb00429918.jpeg)

# 2. confファイルのコピー

以降はクライアントマシンに`kubectl`がインストールされていることを前提とする。

まず、クライアントマシンへconfファイルをコピーする。
confファイルはコントロールプレーンノードの以下の場所に配置されているので、クライアントマシンの同じ場所へコピーすればよい。

一般ユーザの場合：`$HOME/.kube/config`
rootユーザの場合：`/etc/kubernetes/admin.conf`

![一般ユーザ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/705474/73e24c70-d437-1194-1dce-008b08079775.jpeg)

![rootユーザ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/705474/f8c85d30-2f1f-4397-a25b-8083fd2781d0.png)


# 3. confファイルの指定

最後にkubectlにどのconfファイルを利用するかを教える必要がある。

一般ユーザの場合は、所定の場所にconfファイルを配置しておけば良い。
パーミッションとオーナーを設定しておく。

```shell
chown $(id -u):$(id -g) $HOME/.kube/config
chmod 600 $HOME/.kube/config
```

rootユーザの場合は環境変数の設定を行う。
また、一般ユーザと同様にパーミッションとオーナーを設定しておく。

```shell
export KUBECONFIG=/etc/kubernetes/admin.conf
chown $(id -u):$(id -g) /etc/kubernetes/admin.conf
chmod 600 /etc/kubernetes/admin.conf
```

以上でKubernetesのクライアントマシンのセットアップは完了。
GotHubでローカルリポジトリとリモートリポジトリを紐付け

Githubでリモートリポジトリを作成する

https://github.com/new
Create a new repositoryを選択でも良い

・任意のリポジトリ名
・public / private どちらでも可
・readme ナシ、.gitignore ナシ、license ナシ
※readmeをつけると後々競合する可能性がある？？

リモートリポジトリの確認

```
$ git remote -v
```
何も表示されなければ紐づいてない
表示されると紐づいている

リモートリポジトリの解除

```
$ git remote -v
以下が表示される
origin	https://github.com/github名/リモートリポジトリ名.git 
```

上記をコピー(デフォルトではorigin)

```
$ git remote remove リモートリポジトリ名(デフォルトだとorigin)
```
を実行する

```
$ git remote -v
```
を再度実行し、何も表示されなければ紐付け解除成功！

クローンアドレスをコピー

```
$ git remote add origin コピーしたクローンアドレス
```

```
$ git remote -v
```
を実行し、origin	git@github.com:github名/アプリ名.git (fetch)のように紐づいていることを確認する。

参考
https://hsmtweb.com/tool-service/git-local-remote.html
https://qiita.com/miriwo/items/4fdb5c9371693b70e123
PowerAppsでコンポーネントの動作プロパティとパラメータを有効にする

2021/9/23時点 備忘

PowerAppsのコンポーネント
カスタムプロパティで「動作プロパティ」と「パラメータ」を使用できるようにする。

# 設定
拡張コンポーネントのプロパティをオンにする。

キャンバス画面より
ファイルから設定を開いて
近日公開の機能 > 実験段階タブ > 拡張コンポーネントのプロパティ

以下、図
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704882/72427165-de05-4589-5834-e234567e92ba.png" width=30%><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704882/8cd00788-a93d-bff5-1daf-f79f59d987dd.png" width=40%>
[bash]mkfifoを利用して標準入力とコマンド実行結果の両方をawkで受け取る

- bash利用時にawkで標準入力やファイルから値を受け取ることがある。
- また、bashのプロセス置換を利用してコマンド実行結果をファイルとして受け取ることもある。
- しかし、標準入力とコマンド実行結果の両方から受け取る処理を記述する時も稀にある。
- そのため今回は名前付きパイプのmkfifoを利用して、awkで両方を受け取る方法を記録する。

## 環境
- Mac OS 11.2.3
- GNU coreutils
  - **例にあるshufコマンドを利用するため。(必須ではない)**

## 結果
- 先に結果の内容を記述する。
- まず今回例として示す処理内容は以下。
  1. 1~100を出力するコマンド結果(`seq 100`)をファイルとして受け取る。
  2. shufコマンドで1~100までの乱数を4つ作り、標準入力として受け取る。
  3. 標準入力で受け取った4つの乱数値と一致するコマンド結果の行のみ標準出力として出す。

- そしてその内容のコードは以下。

```bash:main.sh
#!/bin/bash
set -e

# 名前付きパイプファイル
export FP="temp.pipe"
mkfifo "$FP"

# コマンドをパイプファイルにバックグラウンドで流す。
seq 100 > "$FP" &

# 処理終了時にパイプファイルを削除
trap "rm -rf $FP" EXIT

# 標準入力として流す4つの乱数
shuf -i 1-100 -n 4 |
awk '
# 標準入力を配列に格納
{a[NR]=$1}
END{
  # getlineでパイプファイルを読み込む
  while((getline < ENVIRON["FP"]) > 0){
    for(i=1;i<=NR;i++){
      if($1==a[i]){
        print $1
      }
    }
  }
}
'
```

- 記述後の実行結果は以下。


```bash
$ sh main.sh

39
44
63
79

$ sh main.sh

1
26
58
93
```

## 補足

### mkfifo
- 上記で利用しているmkfifo(名前付きパイプ)は、プログラム同士のデータのやり取りのためのプロセス間通信。
- この通信を`&`でバックグラウンドにしてことで、同じプログラム内で入力結果をファイルのように扱うことができる。
- なお利用が終了してもファイルは残るため、`trap`で処理終了時に削除する。

### 連想配列
- 一旦標準入力を行をキーにした連想配列に格納することで、END内で扱いやすくする。

### getline
- awkではgetlineでファイルから読み込むことができ、パイプファイルからも読み込むことができる。
- ファイル名はexportで環境変数にして、awk内で`ENVIRON`で参照するようにしている。
  - **※必須ではないため、任意の方法で構わない。**

## まとめ
- 入力とファイルの両方からの受け取りが容易になれば、loopの削減や入力データの正規化が図れることを実感。
- これを応用して更なる記述の簡素化が可能か調査していく。

## 参考
- [mkfifo](https://pubs.opengroup.org/onlinepubs/9699919799/utilities/mkfifo.html)
- [getline](https://www.gnu.org/software/gawk/manual/gawk.html#Getline_002fFile)
【Unity】オブジェクトをクリックで非表示にする

# オブジェクトを追加する
1. 任意の3Dオブジェクトを追加する

2. オブジェクトにEventTriggerを追加する

![スクリーンショット 2021-09-23 11.34.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1614948/72ad0698-5d83-79f0-bcb4-8fcbcd16d9e3.png)

# Scriptを追加する

``` c#
//クリックしたらオブジェクトを非表示にする
public void OnClickObj()
    {
        gameObject.SetActive(false);
    }

```

# MainCameraでPhisicsRaycasterを追加する
クリックしたとき、レーザーを出して、オブジェクトを検知するため、
PhisicsRaycasterを追加する![スクリーンショット 2021-09-23 11.36.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1614948/fae43119-0ee2-9988-cc34-0347a5480181.png)

# EventSystemを追加する
Event処理するため、HierarchyにEventSystemを追加する
![スクリーンショット 2021-09-23 11.37.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1614948/d3e37b61-1dcb-a3cf-adfd-c23e0952f73f.png)

# 試す
クリックで消えることを確認する
![スクリーンショット 2021-09-23 11.37.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1614948/27a37c8e-9faf-67e0-bfad-b9080e43a42d.png)
spring bootのプロパティファイルの設定値をawsのparameter storeから取得する

## 概要
spring bootのプロパティファイルの設定値の一部をawsのparameter storeに移管する

## 環境
・spring boot(2.4.9)
・Java 8

## ライブラリの追加

##### 使用するライブラリ
- [spring-cloud-starter-bootstrap](https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-bootstrap) （spring 2.4以降の場合のみ）
- [spring-cloud-starter-aws-parameter-store-config](https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-aws-parameter-store-config)　（spring boot 2.5系は未対応）


##### build.gradleの修正
dependenciesに下記を追加

```
implementation 'org.springframework.cloud:spring-cloud-starter-bootstrap:3.0.3'
implementation 'org.springframework.cloud:spring-cloud-starter-aws-parameter-store-config:2.2.6.RELEASE'
```

## プロパティファイルの設定

##### bootstrap.ymlにParameterStoreの設定を追加

```yml:bootstrap.yml
cloud:
  aws:
    stack:
      auto : false
    region:
      auto : false
      static : {リージョン（東京の場合はap-northeast-1）}
aws:
  paramstore:
    region : ${cloud.aws.region.static}
    prefix : {「/」始まりの文字列または空（デフォルトは「/config」）}
    default-context : {任意の文字列（デフォルトは「application」）}
    profileSeparator : {コンテキスト名とプロファイルの区切り文字(デフォルトは「_」)}
    enabled : {無効化する場合はfalse（デフォルトはtrue)}
```

##### bootstrap.ymlにParameterStoreから取得したい項目を追加

```yml:bootstrap.yml
sapmle:
  param:
```
値はParameterStoreから取得するため、設定しなくても良い
設定した場合は、ParameterStoreから値が取得できない場合に使用される

## ParameterStoreにパラメータを作成
AWS Systems Manager > パラメータストア からパラメータを作成
パラメータ名はbootstrap.ymlに記載した内容を基に以下のルールで指定
`[prefix]/[default-context]_[アプリケーションのprofile(共通設定の場合は省略可)]/[key]`

例）
profileに依存しない共通設定の場合
`/config/application/sapmle.param`

profileが「prod」ときの設定の場合
`/config/application_prod/sapmle.param`
【Octoparse】新しい8.4.2バージョンが9月末にリリースされる予定です！

皆さん、こんにちは。いつもOctoparseをご愛顧いただき、誠にありがとうございます。

Octoparseのご利用はいかがでしょうか？

今日はタコちゃんは皆様に報告したいことがあります。

今月の末に最新のバージョン（8.4.2）がリリースされる予定です。

本記事では8.4.2バージョンの最新の機能について紹介させていただきたいと思います。


 
#1．Zapierの統合

8.4.2バージョンではZapierを使ってクラウドで保存しているデータをGoogle DriveやGoogle Sheetなどのソフトウェアに自動出力できるようになりました。

![6fce1d12-c718-45e9-832f-5c6b2874bc1f.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262932/c7381982-2f90-fae9-7a89-3647d1810a34.png)


[Octoparse×Zapier:詳しくはこちらでご確認して下さい](https://zapier.com/apps/google-drive/integrations/octoparse)

 

#2.特定のセクションをスクロールしながらスクレイピングする

Google Mapsを例として挙げます。8.4.2バージョンで、この機能を使って、Webページに入り、検索結果のみをスクレイピングすることができます。この機能は、Xpathを設定することで実現できます。セクションを指定してスクロールしながらスクレイピングします。
![scrolling-within-a-certain-section副本.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262932/300fb1f5-7480-9b91-f6d9-76ee805bb3ad.png)




#3.User Agentのカスタマイズ

8.4.2バージョンを使ってデータをスクレイピングする際、ブラウザのUser Agent文字列とUser Agent名を変更することができます。

 

User Agentの仕組みについては、こちらの記事にご参考してください。

[Chrome、Edge、Safari、Firefoxのユーザーエージェントを変更する方法](https://www.searchenginejournal.com/change-user-agent/368448/)

 

#4.ローカルデータをクラウドへのバックアップ

この機能は、この前にエンタプライズ プランのお客様のみ利用できますが、新しいバージョンでは、プロフェッショナルプランのお客様も利用できるようになりました。

 

#5.Timestampのフォーマット

この機能は、主にソーシャルメディアのスクレイピングのために設計されています。新しいバージョンでは[投稿のtimestampを日付に変換する](https://timestamp.online/)ことが可能にしました。

 

#6.その他の既存機能やUIのアップデート

Octoparseは今回のアップデートにより、以前のバージョンに比べて、より安定して便利にご利用いただけるようになります。

 

どうでしょうか。このような新機能に興味を持ってますか？

ぜひ、試してくださいね！

タコちゃんはお客様により良いWebスクレイピングサビースを提供するために、引き続き頑張っていきます。

今後も、よろしくお願いします！

 

何かお質問やご不明な点がございましたら、ご遠慮なく[support@octoparse.com](support@octoparse.com)までご連絡ください。Octoparseのサポートチームはいつでもお客様のスクレイピングを支援しています。

 



 

 

**関連記事**


[【データ戦略】ビジネスの競争力強化に不可欠！最も価値のあるデータは？](https://www.octoparse.jp/blog/how-web-extraction-helps-ecommerce-businesses-increase-profits/)

[Webスクレイピングとは？定義から活用事例までの説明](https://www.octoparse.jp/blog/web-scraping/)

[Webクローラーとは？仕組みとクローリングを自動化する方法](https://www.octoparse.jp/blog/what-is-web-crawler/)
[メモ用]windows10で拡大鏡のショットカットキーを無効にした方法


よくwin + LでPCをロックするとき、間違えてwin + +を押して拡大鏡を起動してしまいます。時々イラッとするから拡大鏡のショットカットキーを無効化にする方法を探し、無効化に成功したのでメモ用に書いておきます

参照記事：https://www.top-password.com/blog/turn-off-disable-magnifier-in-windows-10/

元の記事の中で3つの方法を紹介してくれていますが、個人的に2つ目が一番しっくり来たのでそれを使用しました。

#方法
step1: command promptを管理者権限で実行

step2: 下記のコマンドを実行

```
takeown /f C:\Windows\System32\Magnify.exe
cacls C:\Windows\System32\Magnify.exe /G Administrators:F
```

step3:C:\Windows\System32\Magnify.exe　をMagnify.exe.bakでリネーム

おわり
[シリーズ] Pipeline declarative を使ってみる


## 概要

docker-compose を使って、Jenkins Master 1台、Slave 8台 の環境を構築し、
次の Pipeline を書いてみる.

|コンテンツ|一言|
|:--|:--|
|[[01] declarative pipeline の使用例 -- Slave 8台から空いている Slave を使う(4パターン)](https://qiita.com/robozushi10/items/44796613f3cc2316231c)||
|[[02] declarative pipeline の使用例 -- 使用する Slave(ノード) をパラメータで指定する](https://qiita.com/robozushi10/items/d7b7e0735004d99102e6)||
|[[03] declarative pipeline の使用例 --Pipeline を GitLab で管理する](https://qiita.com/robozushi10/items/aa88b5199e37dea004fd)||
|[[04] declarative pipeline の使用例 -- 成果物を登録する](https://qiita.com/robozushi10/items/caaf0922f25468dac2af)||
|[[05] declarative pipeline の使用例 -- 複数ノードで分散ビルドをする](https://qiita.com/robozushi10/items/a2742cb3c453beec7926)||
|[[06] declarative pipeline の使用例 -- 例外を握り潰す（分散ビルド）](https://qiita.com/robozushi10/items/de1e8f2215e483caa317)|本項は、例外を握り潰す処理が目的なので、分散ビルドは重要では無い.|