OmniAICreator/Qiita-1.07M huggingface dataset:
AWSソリューションアーキテクト―アソシエイト用語集⑥管理とガバナンス編

- [AWSソリューションアーキテクト―アソシエイト用語集まとめ - Qiita](https://qiita.com/tatsumicro/items/55c191eea8553a52463c)

## ❒ AWS Management and Governanceサービス
- [AWSでの管理とガバナンス - AWS](https://aws.amazon.com/jp/products/management-tools/)

|  カテゴリ  |  AWSのサービス  |
| ---- | :----: |
|  スピードアップ  |  **Organizations**、**License Manager**など  |
|  プロビジョニング  |  **CloudFormation**、**OpsWorks**、**Marketplace**など  |
|  環境の運営  |  **CloudWatch**、**CloudTrail**、**Config**、**Cost Explorer**、**X-Ray**など  |

## ❒ Organizations
###### Organizationsとは？
> 複数のAWSアカウントの統合管理を実現する
> （例: VPCをアカウント間でシェア、など）

## ❒ Config
###### Configとは？
> リリースの設定、監査、審査
> リリースの設定を記録して評価

## ❒ CloudFormation
###### CloudFormationとは？
> テスト環境を簡単に削除、プロビジョニングできる

## ❒ CloudWatch
###### 詳細なログを見たい
> CloudWatchエージェント ・・・ EC2インスタンスの詳細なログなど
> CloudWatch Log ・・・ ログ管理

## ❒ CloudTrail
###### CloudTrailとは？
> AWSアカウントのガバナンス、コンプライアンス、運用監査、リスク監査を行う
> 例えば、ユーザアクティビティ、API使用状況の追跡など

## ❒ OpsWorks
###### OpsWorksとは？
> スタックベースでモデル化
> （負荷分散、データベース、アプリケーション、など）

###### ユーザごとに要求返答の優先度を変えたい
> 優先付けをしてリクエストを処理する

## ❒ Code Pipeline
###### Code Pipelineとは？
> リリース自動化
> （アプリケーションレイヤーなし）

###### Code Pipelineの管理項目
> `Source` ・・・ ソース管理
> `Build` ・・・ ビルド
> `Test` ・・・ テスト
> `Staging` ・・・ 検証
> `Production` ・・・ 本番

## ❒ Elastic Beanstalk
###### Elastic Beanstalkとは？
> デプロイ、スケーリング
> （アプリケーションレイヤーなし）

## ❒ IAM
###### IAMポリシー
> `Terminate Instances` ・・・ インスタンス終了操作に対する権限

###### IAMロール
> リソースの実行範囲を設定する
> （LambdaにIAMロールを設定し、DynamoDBへのアクセスを許可する）

###### IAMポリシーとは？
> APIゲートウェイに対してアクセス制限などに使用可能
TkinterのListboxをシングルクリックでActiveにする方法

[1]:https://anzeljg.github.io/rin2/book2/2405/docs/tkinter/listbox.html
[2]:https://anzeljg.github.io/rin2/book2/2405/docs/tkinter/event-handlers.html
[3]:https://stackoverflow.com/questions/61083019/is-there-any-way-to-select-an-item-in-a-tkinter-listbox-the-right-click
[4]:https://stackoverflow.com/a/61084093
[5]:https://stackoverflow.com/users/13214334/jadon-erwin

## 要旨

**Listboxをマウスクリックで選択してアクティブ化する**際に、ダブルクリックを行わないとアクティブ化できなかった。
シングルクリックでも**選択状態にはなるが、アクティブ化されない**。
ボタン選択後の処理でアクティブ状態の行に記載されている内容を参照するため、シングルクリックでもアクティブ化する必要があった。

**シングルクリックでアクティブ化する**ためには次の手順を実行する。

1. 現在のアクティブ化状態を消去する
1. シングルクリック時にマウスカーソルが存在しているy座標（縦軸）を取得する
1. y座標に最も近いListboxを選択する
1. y座標に最も近いListboxをアクティブ化する


## 実際のソースコード

```python
class Listbox(tk.Listbox):
    def __init__(self, master=None):
        tk.Listbox.__init__(self, master)
        self.bind("<Button-1>", self.activate_line_clicked)

    def hogehoge(self):
        # アクティブ状態の行を参照する何らかの処理
        
    def activate_line_clicked(self, event=None):
        self.selection_clear(0, tk.END) # 要旨に記載した手順1
        self.selection_set(self.nearest(event.y)) # 要旨に記載した手順2, 3
        self.activate(self.nearest(event.y)) # 要旨に記載した手順2, 4

        # ボタン選択時の処理実行
        self.hogehoge()
```

## 各メソッドの説明

### self.selection_clear()

指定した行（ここでは0行目からtk.ENDつまり最後の行まで）の選択を解除する。

### self.nearest(y)

与えられたy座標に近い行を返す。

ここでは**event.y**を引数として渡している。
**<Button-1>**というシングルクリックした際に生成されるeventを使用して、シングルクリックされた位置のy座標をevent.yで取得している。

### self.selection_set()

指定した行を選択する。
行を選択しない場合でもActive状態にはできる。ただ、シングルクリックしてActive状態にする場合は必ず行を選択するため、`選択した行=Active状態の行`となる。
そのため、プログラム中でも明示的にActive状態にする行を選択している。

### self.activate()

指定した行をActive状態にする。


## 参考

stackoverflowの質問：[Is there any way to select an item in a Tkinter Listbox the right click?][3]
参考にした回答：[Okay, I figured it out.First, use the bind command:...][4]
質問者：[Jadon Erwin][5]
回答者：[Jadon Erwin][5]

[14. The Listbox widget][1]
Listboxオブジェクトについての説明

[54.6. Writing your handler: The Event class][2]
Eventオブジェクトについての説明
【OCI】新しいバージョンのDRG(Upgraded DRG)について

###概要

2021/5/21に新しいバージョンのDRG(Dynamic Routing Gateway)がリリースされました。
既存DRGとの違いの理解と活用方法などを覚えていくにあたり、個人の学習内容や検証内容などを
記事に残していこうと考えています。
記事内容は頻繁に修正や追記されると思われますので予めご了承ください。

###仕様の違い

最初に既存のDRG(Legacy DRG)と新しいバージョンのDRG(Upgraded DRG)の違いを
簡単にまとめてみました

①ルート表
・Legacy DRG: 編集可能なルート表は存在しない
・Upgraded DRG: 編集可能なルート表が存在し(デフォルトで2つ作成される)追加も可能

②アタッチ可能なVCN数
・Legacy DRG: 単一のVCNをアタッチ
・Upgraded DRG: 複数のVCNをアタッチ

③VCN間接続
・Legacy DRG: Remote VCN Peeringのみに対応
・Upgraded DRG: Remote VCN Peering及びLocal VCN Peeringに対応

④外部ネットワークとの接続
・Legacy DRG: FastConnectまたはVPNあるいはその両方を接続可能。
　　　　　　　 Local Regionのリソースにアクセス可能
・Upgraded DRG: FastConnectまたはVPNあるいはその両方を接続可能。
　　　　　　　　 Local RegionとRemote Regionの両方のリソースにアクセス可能
　　　　　　　　 　※要は例えば東京都内のお客様拠点からOCI(Tokyo Region)にFastConnect接続すれば
　　　　　　　　 　　その接続を利用してOCI(Osaka Region)にもアクセスが可能になるということ！

⑤RPC(Remote Peering Connection)可能なVCN
・Legacy DRG: 同じテナンシ内のVCNとの接続のみ可能
・Upgraded DRG: 同じまたは別のテナント内のVCNと接続可能

⑥ECMP(Equal-cost multi-path)のサポート
・Legacy DRG: 非対応
・Upgraded DRG: 対応

###Upgraded DRGを利用した構成イメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411653/1ca3f346-5415-046e-a3ab-17e70116c6fb.png)

###参考資料
・Oracle Cloud Infrastructure Documentation
<font color="red">**[Dynamic Routing Gateways (DRGs)][1]**</font>
[1]:https://docs.oracle.com/en-us/iaas/Content/Network/Tasks/managingDRGs.htm#drg_attach
初心者アプリ開発のメリット・デメリット

#はじめに
Rails,nuxt.js,herokuでwebアプリ開発を学習し、先日アプリを公開しました。
学習に約半年、開発に3ヶ月〜4ヶ月ほどかかってしまいましたがなんとか形にできたと思います。

そこで個人でwebアプリ開発してみたいが、実務経験を積んでからと踏みとどまっている実務未経験エンジニアの人に向けて書いてみました。

結論は**作り始めれば案外なんとかなるのでとりあえず始めてみよう！**です。

#個人開発は未経験者に可能なのか
アプリの個人開発と聞くと実務経験10年の凄腕エンジニアが挑戦する難関事業と感じてしまうかもしれませんが、意外とそんなことありません。

なぜなら複雑で多機能なアプリである必要はないからです。また、アプリの個人開発に実務経験は不要です。マークザッカバーグがfacebookを作る際に実務経験を問われたとは思わないからです。

学習が一通り終わったならば、2周目をやるのではなくアプリを1つ作って公開する方が技術力がつくと思います。

#個人開発のメリット・デメリット
僕が考える実務未経験者が個人でアプリ開発をするメリットとデメリットをまとめてみました。

##デメリット
####とにかく時間がかかる
新しいライブラリ活用やエラー解決にかなりの時間がかかります。背景知識や自分が学んだ技術を網羅しているわけではないので、少しの違いでコードが動かないことは日常茶飯事です。

また実装やエラーを解決するために英語を読むしかなかったり、何が問題かわからず手当たり次第試行錯誤したりとかなり時間がかかります。

僕も一つのライブラリを実装できるまで1ヶ月近くかかりました。経験が豊富なら勘所が分かりすぐに解決できると思いますが、最初のうちは右も左もわからず苦労します。


####GitHubに失敗作がたまる
実務未経験での個人開発はとにかっく失敗と挫折の連続です。
最初はGithubの使い方に慣れていなかったので開発を断念したアプリが溜まっていきます。開発しているアプリを見つけるのに一手間かかるようになるくらいは溜まりました。

今は不要なアプリを削除してスッキリしましたが、とにかく失敗と挫折の連続でした。

####思うように進まずに心が折れる
実装に時間がかかったり、予想していないエラーが出てきて時間がかかってしまったり、想定していない動きや問題が起きると心が折れます。いつでもやめていいので、もういいかなと挫折します。

途中からは挫折した分だけGithubに失敗作がたまるだけなので、また失敗作ができたなぐらいに思って進めてました。かなりメンタルが鍛えられました。


##メリット
####好き勝手に進められる
僕がエンジニアを目指す理由として、自由に働きたいと思っていたからです。
個人開発ではその自由が最大限あり、とても楽しく進められました。

実装する機能も自由に選択でき、好きな時に好きな場所でコードを書くことがとても楽しいことだと感じられました。


####技術力が向上する
試行錯誤の連続で技術力が身に付きます。
特にエラー解決の連続なので、エラーした際の勘所がわかるようになります。

また、必要な機能を実装するために使ったことがないライブラリを検討することも増えます。
検討する際にはライブラリを使ってみることが多いので技術力が格段に上がります。

####最悪ポートフォリオになる
アプリを完成させられれば転職の際のポートフォリオになります。
自分のアイデアからアプリを作っているので、面接の際もこのアプリを作ろうと思った背景から説明できますし、苦労した点として多くの失敗や挫折経験を経て完成させたことを伝えることができます。

間違いなく面接での評価が上がると思います。

#どうすればリリースできるのか
####アイデア
まずアイデアがなければ何も始まりません。
僕の場合は、プログラミング学習に何度も挫折しましたが最終的に未経験からエンジニアになれた経験から、学習目的を明確することでプログラミングを継続し目的を達成できると考えたところが始まりでした。

革新的なものだけがアイデアではありません。普段感じている不便なことを解決することもアイデアです。
こんなのあったらいいな、から始めてみるのが良いと思います。

####必要最低限の機能
アイデアが決まったらそのアイデアを実現するために必要な最低限の機能を考えます。
アイデアが出てくるとそこからどんどん膨らみます。膨らめば膨らむだけ実装する機能が増えて時間もかかります。

まずは必要最低限を見極めて最後まで終わらせることを意識する必要があります。

####不出来でも動けば先に進む
公開するためにアプリを作っているとどうしても不具合が目について進まなくなります。
その結果一つの機能を完璧にするために多くの時間をかけることになっていしまいます。

これをすると時間がかかり、挫折する可能性が高くなります。
実装してみて動けば次の機能の実装を進めることがアプリ公開に必要な考え方です。

####最後までやり切る
最後は気合いです。
途中で何度もアプリ開発から逃げたくなります。もう十分頑張ったのではないかと逃げたくなります。
特に開発期間が長くなればなるほど逃げを考える回数が多くなります。

できるだけ早く最後までやり切ることが重要です。

#おわりに
個人開発は最初と最後は最高です。
なぜなら最初はアイデアが溢れてきて、モチベーションが高く維持できるからです。
そして最後は完成させた満足感でいっぱいになります。

しかし実装中は失敗と挫折の連続です。
みたことないエラーに実装できないイライラ、知り合いの順調な学習記録をみた時の焦りなどそれはもう大変な時間です。（途中から知り合いの日報が書かれているslackは開かなくなりました、、、）

それでも個人開発をしてよかったと思っていますし、今後も個人開発を続けていきます。
少しでも個人開発に興味を持ったら、とりあえず初めてみるのが良いと思います。

作成したアプリ
https://amaimon-decision.herokuapp.com/
discord.pyでステータス(プレイ中)をする方法

こんにちは
今日はdiscord.pyでステータス(プレイ中)にする方法です
# 動作環境
Python 3.8以上
discord.py 1.5以上
# discord.Client版コード
```play.py
import discord

client = discord.Client(intents=discord.Intents.all())

@client.event
async def on_ready():
    print("Botは正常に起動しました！")
    print(client.user.name)  # Botの名前
    print(client.user.id)  # ID
    print(discord.__version__)  # discord.pyのバージョン
    print('------')
    await client.change_presence(activity=discord.Game(name="TEST"))

client.run("TOKEN")
```
# commandsフレームワーク版コード
```play.py
import discord

from discord.ext import commands
bot = commands.Bot(
    command_prefix="!",
    help_command=None,
    intents=discord.Intents.all())

@bot.event
async def on_ready():
    print("Botは正常に起動しました！")
    print(bot.user.name)  # Botの名前
    print(bot.user.id)  # ID
    print(discord.__version__)  # discord.pyのバージョン
    print('------')
    await bot.change_presence(activity=discord.Game(name="TEST"))

bot.run("TOKEN")
```
# 実際に動かす
これでBotを動かしてみましょう
![スクリーンショット 2021-05-30 105131.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1462118/5b41336b-2432-6b89-1bb2-d6033b7529fd.jpeg)
こうなると成功です
TESTを変えたかったら(name="TEST"))のTESTを変えてください
# discord.Client版サーバー数
```play.py
import discord

client = discord.Client(intents=discord.Intents.all())

@client.event
async def on_ready():
    print("Botは正常に起動しました！")
    print(client.user.name)  # Botの名前
    print(client.user.id)  # ID
    print(discord.__version__)  # discord.pyのバージョン
    print('------')
    await client.change_presence(activity=discord.Game(name=f"TEST{len(client.guilds)}サーバー"))

client.run("TOKEN")
```
# commandsフレームワーク版サーバー数
```play.py
import discord

from discord.ext import commands
bot = commands.Bot(
    command_prefix="!",
    help_command=None,
    intents=discord.Intents.all())

@bot.event
async def on_ready():
    print("Botは正常に起動しました！")
    print(bot.user.name)  # Botの名前
    print(bot.user.id)  # ID
    print(discord.__version__)  # discord.pyのバージョン
    print('------')
    await bot.change_presence(activity=discord.Game(name=f"TEST{len(bot.guilds)}"))

bot.run("TOKEN")
```
これで導入サーバー数が表示されます

よいDiscordライフを
# 参考
https://qiita.com/N4RvS3/items/b50e36796888216ab758
[ShimaBlock]セル関連の操作サンプル

###概要
[ShimaBlock for VBA](https://shima-block.shima-soft.com/vba.html)の操作サンプルです。
ExcelVBAのセル関連コードを生成します。

使用サイト：[ShimaBlock for VBA](https://shima-block.shima-soft.com/vba.html)

###セルの選択(ブロック)
セルの選択(Select)をするには、以下のようにブロックを配置します。
![cell_select.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1566115/2a139dba-1e95-fd25-5286-49b53dbe4fdd.png)

###セルの選択(生成コード)
```vb
Sub cell_select()
    Range("A1").Select
    Cells(1, "A").Select
    Cells(1, 1).Select
End Sub
```


###セルの範囲指定(ブロック)
セルの範囲を指定＆選択(Select)する場合には、以下のようにブロックを配置します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1566115/bfe77dd8-23c1-3b0b-0ddc-15b3190905dd.png)

###セルの範囲指定(生成コード)
```vb
Sub Main()
    Range("A1","C5").Select
    Range(Cells(1, 1),Cells(5, 3)).Select
End Sub
```

###セルの値をコピー(ブロック)
セルA1の値をセルC3にコピーする場合は、以下のようにブロックを配置します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1566115/f1771847-fe63-9ab2-6e60-e7afdb360c64.png)

###セルの値をコピー(生成コード)
```vb
Sub Main()
    Range("C3").Value = Range("A1").Value
End Sub
```

###行の選択(ブロック)
1行目のセルを選択する場合は、以下のようにブロックを配置します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1566115/76336065-7987-abde-a44b-caab3678931c.png)


###行の選択(生成コード)
```vb
Sub Main()
    Rows(1).Select
End Sub
```
###複数行の選択(ブロック)
1～5行目を選択する場合は、以下のようにブロックを配置します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1566115/66172103-8352-186e-04ac-ccc42d862420.png)

###複数行の選択(生成コード)
```vb
Sub Main()
    Rows("1:5").Select
End Sub
```

###複数列の選択(ブロック)
複数列を選択する場合は、以下のようにブロックを配置します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1566115/37d3117d-eb54-d167-e93d-e8d0c4ee3fbd.png)

###複数列の選択(生成コード)
```vb
Sub Main()
    Columns("A:C").Select
End Sub
```

###サンプルコード参照サイト
以下のサイトのコードを参考に、[ShimaBlock for VBA](https://shima-block.shima-soft.com/vba.html)でコーディングしてみました。
[VBA（エクセルマクロ）でよく使うコードまとめ](https://qiita.com/hajimejimejime/items/0109f84051951bfdee0a)
s3003をNucleo-F446REで動かす

#s3003をNucleo-F446REで動かす
![download.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1122413/44153248-4dc0-a22e-31d2-e22edafcfd32.jpeg)

##使用道具
s3003サーボモータ
stm32 Nucleo-F446RE

##開発環境
STM32 CubeIDE　

##PIN設定
![2021-05-30 (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1122413/2bb99af3-d2e8-b36e-4a8f-6de0e27a5c69.png)

今回はTIM3_CH1を使ってみる

##クロックの設定
![2021-05-30 (5)_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1122413/fdd6562e-ef7f-e0be-8338-33fcc700bc61.jpeg)


8MHzのクリスタルを使って16MHzを出力

![2021-05-30 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1122413/1468e447-3d37-d012-6fcd-9cb3bf07174b.png)

50Hzの周期にしたいと考えているので
16Mz/50Hz = 320 * 1000 = prescaler * counter period

##プログラム
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_TIM3_Init(void);
/* USER CODE BEGIN PFP */

/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_TIM3_Init();
  /* USER CODE BEGIN 2 */
  HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1);
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */
      __HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_1,25);
      HAL_Delay(2000);
      __HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_1,150);
      HAL_Delay(2000);

  }
}


サーボが0.5~3msの制御パルスなので
50Hz * 0.5 = 25
50Hz * 3 = 150

で-60から＋60°まで動くよ
Ubuntu20.04で"docker実行中にstatvfsの"許可がありません"ワーニングが出続ける"

# 事象

docker実行中にstatvfsの"許可がありません"ワーニングが出続ける。

```bash
$ sudo journalctl -f
May 30 10:18:20 HOSTNAME gnome-system-monitor.desktop[14450]: glibtop(c=14450): [WARNING] statvfs '/run/docker/netns/HASH' failed: 許可がありません
May 30 10:18:20 HOSTNAME gnome-system-monitor.desktop[14450]: glibtop(c=14450): [WARNING] statvfs '/run/docker/netns/HASH' failed: 許可がありません
May 30 10:18:20 HOSTNAME gnome-system-monitor.desktop[14450]: glibtop(c=14450): [WARNING] statvfs '/run/docker/netns/HASH' failed: 許可がありません
May 30 10:18:20 HOSTNAME gnome-system-monitor.desktop[14450]: glibtop(c=14450): [WARNING] statvfs '/run/docker/netns/HASH' failed: 許可がありません
May 30 10:18:20 HOSTNAME gnome-system-monitor.desktop[14450]: glibtop(c=14450): [WARNING] statvfs '/run/docker/netns/HASH' failed: 許可がありません
May 30 10:18:20 HOSTNAME gnome-system-monitor.desktop[14450]: glibtop(c=14450): [WARNING] statvfs '/run/docker/netns/HASH' failed: 許可がありません
```

# 環境

動作環境は以下の通り。

```bash
$ cat /etc/os-release 
NAME="Ubuntu"
VERSION="20.04.2 LTS (Focal Fossa)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 20.04.2 LTS"
VERSION_ID="20.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=focal
UBUNTU_CODENAME=focal

$ sudo apt list --installed | grep libgtop
WARNING: apt does not have a stable CLI interface. Use with caution in scripts.
libgtop-2.0-11/focal,now 2.40.0-2 amd64 [インストール済み]
libgtop2-common/focal,focal,now 2.40.0-2 all [インストール済み]
```

# 原因調査

libgtopの既知の問題。

https://gitlab.gnome.org/GNOME/libgtop/-/issues/42

# 回避策

なし。

# まとめ

処置待ち。
【初心者でもわかる】CSSで改行や折返しを調整するための6つの方法

#どうも7noteです。改行や折返しをコントロールするための6つの方法を解説します。

webサイトを作る中で、改行や折返しに関する調整が必要なことがあります。
改行をPCとスマホで出し分けたり、折返しを禁止させたりなど。

そんな改行と折返しを調整するためによく使われるCSSの手法を6つ紹介できればと思います。

## 折返しを禁止する方法

```style.css
p {
  white-space: nowrap;
}
```

これは単体で使うより、`overflow-x:scroll;`などと一緒に使うことが多いです。
折返しさせずに、全て横一列に並べたものをスクロール可能にして使えるようにする方法です。

## URLなどでも強制的に折返しする方法

```style.css
p {
  word-break: break-all;
}
```

これで強制的に英単語の途中でも折返しさせることができます。

## PCとスマホで改行を出し分ける方法

```style.css
br.pconly {
  display: inline; /* ここは書かなくてもOK */
}
br.sponly {
  display: none;
}
@media screen and (max-width: 768px) {
  /* スマートフォンの場合 */
  br.pconly {
    display: none;
  }
  br.sponly{
    display: inline;
  }
}
```

専用のクラスを作成することで、改行タグの出しわけが可能になります。
**brタグはインライン要素なのでソース上で改行しないように注意してください。半角スペースが発生してしまう場合があります。**

https://qiita.com/7note/items/638032c2d4017a35f787

## フォントサイズを変える

```style.css
p {
  font-size: 14px; /* ちょっと小さいサイズにする */
}
```

フォントサイズが大きい過ぎると、1文字だけ折返しされてすこしブサイクになってしまうことがあります。
そんなときは**少し文字サイズを小さくすれば1行でおさまります。**

## 字幅を変える

```style.css
p {
  letter-spacing: -1px; /* 字幅を狭くする */
}
```

文字サイズだけでなく、字幅を変えて調整することも可能です。

## フォントサイズをvwで指定する(※スマホの時)

```style.css
p {
  font-size: 4vw;
}
```

スマホの場合であれば、デバイスによって1文字だけ改行されてしまう場合があるかも知れません。
そんな時は**文字サイズを画面の幅に対しての大きさ、つまりvwで指定することでどのスマホデバイスでも1行で収まるようにできます。**

※他の文字との大きさのバランスに注意、
※PCでは文字サイズをvwで指定することは滅多にない！大きくなりすぎたりするので。

## まとめ

改行や折返しのコントロールはデザインデータでは成形されていて綺麗になっていますが、コーディングではデザインと同じような微調整を行うことはかなり難しいです。

文字数が増えたり減ったりする事や、デバイスによって画面幅が変わる事も注意しながら作成する必要があるので、この方法なら大丈夫ということはなく、適材適所でうまくCSSを使わなければなりません。

ここで紹介した改行調整のテクニックを使えば、大体の場面で対応できると思うのでぜひやってみて欲しいです。

#### おそまつ！
~ Qiitaで毎日投稿中!! ~
[【初心者向け】WEB制作のちょいテク詰め合わせ](https://qiita.com/7note)
JDLA_E資格の深層学習「過学習」

#1.  過学習

学習用データに特化してしまって、検証用データをつかうと、正解率があがらないどころか悪化する状態を過学習といった。学習のエポックが進めば進むほどに、学習データに特化して、検証データを使うと、どんどん正解率が悪化していく。
ちなみに、入力値が小さいのに、ネットワークのノード数が多すぎる場合、過学習が起きやすい。大きいものを最適化するためには、多くのデータが必要ということである。

![過学習状態.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1436941/463a970c-9138-f167-61e9-6cc0cd92c849.png)


では、どうやったら過学習を防ぐことが出来るか。

基本的な方法は、

NNの自由度を下げてやる。その手法は、正則化である。

1. L1正則化、L2正則化
1. ドロップアウト


ドロップアウトはちょっと違うが、ある意味正則化の一つ。

#2. L1,L2正則化

###2.1 過学習の状態、原因
過学習状態のモデルというのは、ある重みが大きすぎる状態になっている。少ない入力値を過大評価しているのである。ほかの入力値（検証データ）が入ってきたときに対応が出来ない重みの状態。

###2.2 過学習の回避策

誤差逆伝搬法にて学習を行って最適な重みを求めるわけであるが、この際の計算に、誤差だけでなく、正則化項もつけてやることで、大きすぎる重みが出来ることを抑制することが出来る。

###2.3 pノルムによる正則化

では、具体的に正則化項とは、何かというと、機械学習のときに勉強したL1ノルム（マンハッタン距離）、L2ノルム（ユークリッド距離）のことである。

~~~math
Loss = E_n (W) + \frac{1}{p} \lambda ||x||_p \\

※　\lambda は、ハイパーパラメータ
~~~

p=1の場合が、L1ノルムによる正則化（Lasso回帰)
p=2の場合が、L2ノルムによる正則化（Ridge回帰)

である。

![正則化.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1436941/e7adbc45-5319-289b-268d-565da7fd4d06.png)


そして、上記の式にある正則化項 $||x||_p$は、実際には各中間層の重み$w$を使うので、以下のようになる。

~~~math

||w^{(1)} ||_p = ( |W_1^{(1)}|^p + \cdots + |W_n^{(1)}|^p )^{\frac{1}{p}} \\

~~~

~~~math 

||w^{(2)} ||_p = ( |W_1^{(2)}|^p + \cdots + |W_n^{(2)}|^p )^{\frac{1}{p}} \\
~~~

~~~math

||x||_p = ||w^{(1)} ||_p + ||w^{(2)} ||_p

~~~


![NN4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1436941/8e18a19f-6320-591d-fd28-00230f4e12e8.png)

上記のネットワークでL1ノルムで正則化するなら

~~~math

||w^{(1)} || = ( |W_1^{(1)}| + \cdots + |W_n^{(1)}| ) \\
||w^{(2)} || = ( |W_1^{(2)}| + \cdots + |W_n^{(2)}| ) \\

||x||_1 = ||w^{(1)} || + ||w^{(2)} || \\

E_n (W) +  \lambda ||x||_1 \\
~~~

###2.4 L1,L2ノルムによる正則化の違い

L1ノルムとL2ノルムを使って誤差関数を正則化した場合、L1ノルムの方は、最適値を求めた際に重みがスパース化される。（重み０の場所が発生し、特徴をよく表す）

詳細は下記参照。

https://ichi.pro/kikai-gakushu-to-shinso-gakushu-no-seisokuka-270454202033546


###2.5 pノルム正則化の問題

ノルム正則化は、誤差関数に追加で不要なものを足していることになるので、もともとの純粋な誤差関数の最適解にはたどり着けなくなってしまうという問題がある。
例えば、学習用データで100点の正答率だったものが、正則化を行うと、80点に下がるという状態。


#3. ドロップアウト

ドロップアウトとは、中間層のノードをランダムに削除して学習を行うことで、データのバリエーションが増えたように見せる手法である。単純だけど効果が高い。

なお、この結果、学習に時間がかかるという問題が発生する。なかなか最適解に辿り着かない。
【覚書】create-react-app でホットリロードが効かないときの対処法

まず cross-env を入れる

```
npm i -D cross-env
```

次に package.json の scripts.start を書き換える

```json
{
  "scripts": {
    "start": "cross-env FAST_REFRESH=false react-scripts start"
  }
}
```

以上。
テレワークの日は旦那さんを起こすのを忘れがちのため時間になったら「モーニングMSG」をおくるしかけを作ってみた！

#作ったきっかけ
テレワークの日の朝はついつい旦那さんを起こすのを忘れてしまうため、２年前に購入したものの音楽しか聴いていないAlexaをトリガーにして、**「モーニングMSG」**を送るしかけを作ってみました。
#作ったもの

　　　　　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268391/dc74027a-8258-91f1-8814-7fc916a1784e.png)
ざっと説明します。
①あらかじめ起こしたい時間をAlexa側で設定します。
②アラームが鳴ったら「Alexa stop」でアラームを止めます。
③それがトリガーとなり、旦那さんのLINEに「モーニングMSG」が送信されます。

なかなか起きてこないので、あえて・・・の画像を送っていますが、自ら起きるようになったら、大好きな柴犬の画像にでも変えようと思います！（笑）
#構成
構成は以下のとおりです。
IFTTTを使ってAlexaとLINEを連携しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268391/d6af432c-75e9-22ac-95f3-254895effa17.png)
IFTTTでのAlexa,LINEの設定の仕方は、下記を参考にしました。
https://shorin-home.com/alexa_line
#作成したアプレット
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268391/e771aca8-9360-ccae-4f3b-4d6de4afefbd.png)
#IFTTTでの設定
IFTTTで新しいアプレットを作成したら、まずは「If This」を選びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268391/5119a810-fe5b-6ddb-b678-929f9abb627c.png)
次にAlexaの「Your Alarm goes off」を選びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268391/4f87868a-1e24-51a8-d5f0-a92d502ec416.png)
「IF This」はこれで完了です！

次に「Then That」を作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268391/9503c68b-db65-f047-e610-10b7eb8e42b5.png)
「LINE」を選択します。
ここは「Send message」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268391/dd225f45-c9c3-185c-f440-7e2168901362.png)
「Send message」への設定は以下のような感じになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268391/76c9ed4e-4a40-1e6c-edfb-61fc3de8ee18.png)
「Create action」を押して完了です。
IFTTT側の設定はここまでです。
#Alexaでの設定
次にAlexaの設定です。
Alexaアプリを開いて「定型アクション」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268391/e80cc901-08d7-51a1-cb05-fb1a77dee922.png)
次にアラームを設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268391/3c9754c2-bff8-98ac-50b8-0866c6739918.png)
以上で完了です。
あとは、Alexa側でアラームがなったらアラームを止めることで、LINEにメッセージが送られます。
#おわりに
IFTTTを知ったことで、今まで音楽と時間と天気予報でしか活躍していなかった我が家のAlexaが遅ればせながら脚光を浴びることになりました。
いろんなことできそうなので、作りこんでいこうと思います！
LaminasのServiceManagerを使って、ログをDBに書き出す

ServiceManagerを使うやり方で、設定方法にハマッタのでメモ。
MySQLの場合,DateTimeのフォーマットがLaminas側のフォーマットと違うので、
fromatterで変更しておく必要があります。

## 接続できているDBに、記録用テーブルを作っておく。

```sql:table
create table ta00_logger
(
timestamp timestamp,
priority int,
priorityName varchar(50),
message varchar(200)
)

```

## コントローラに、Loggerを注入するコードを書いておく。

```php:Module.php
public function getControllerConfig(): array
    {
        return [
	'factories' => [
                Controller\HomeController::class => function ($container) {
                    return new Controller\HomeController(
                        $container->get("MyLogger"),//<--loggerの注入
                        $container->get(AdapterInterface::class)
                    );
                },
...
```

これをやっおくと、Controller側からloggerを使える。

```php:HomeConstoller.php
...
public function __constructer($logger, $adapter)
{
	$logger->info(get_class()." Called");
	...
}
...
```

## MyLoggerサービス用のパラメータ

```php:modules.config.php
    'log' =>[
        'MyLogger'=>[
            'writers' =>[
                'db'=>[
                    'name'=>'db',
                    'options'=>[
                        'db'=>\Laminas\Db\Adapter\AdapterInterface::class,
                        'table'=>'ta00_logger',
                        'formatter'=>[
                            'name' => \Laminas\Log\Formatter\Base::class,
                            'options' => [
                                'dateTimeFormat' => 'Y-m-d H:i:s',//<-MySQLフォーマット
                            ],
                        ]
                    ]
                ]
            ]
        ]
    ],
...
```
【Docker】コンテナ内でコマンドプロンプトを起動するには？ no.5

![パンプキン カフェ (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/e3e79803-6eed-42e6-1d78-322fe7d3b685.png)


こんにちは。まゆみです。

Dockerについての記事をシリーズで書いています。

今回の記事では、

>Container 内でコマンドプロンプトを起動するには？

について記事を書いていきます

ではさっそく始めていきますね。


#動いているContainer 内でコマンドプロンプトを起動する

例として、redis のContainerを立ち上げます。

![2021-05-30_8-40-35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/d64e5ee8-c633-7c9b-0a2c-4f51ff9534e3.png)

『docker ps -a』で起動させたContainer の様子を見てみると、<font color="Red">STATUSもUpになっていて</font> 、Containerが動いているのが確認できました。

Container がUp の状態である時に、そのContainerの中に入って、そこでコマンドプロンプトを起動させたい時に使えるのが


```
docker exec -it <container ID> sh
```
になります。


実際に見てみるのが早いと思うので、下にスクショを貼っておきますね。

![2021-05-30_8-47-56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/ebab4ac7-4aba-1c9d-14ab-14a423182113.png)

docker exec -it <container ID> sh

によって、Container のなかに入ってコマンドプロンプトを起動する事ができ、<font color="Red">Linuxのコマンドをいくつも連続して</font>うつことができます

#sh から抜けるにはどうしたら良い？
先ほどのコマンドプロンプトから抜けるにはどうしたら良いでしょうか？

いつも通り『Ctrl + C』をしても抜け出ることができません。

>Ctrl + D 

で出ることができます

![2021-05-30_9-00-47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/548615ce-8341-8fce-4d1d-d4d3f331b113.png)

#shって何？
では、一体このsh って何なのでしょうか？

sh　はContainer 内で実行されるプログラムであり、sh によって、コマンドをうちContainer 内で実行させることが可能になります。

私たちは、普段から『bash』や『powershell』や『zsh』を使っていますが、sh で、さらにもう一つコマンドシェルを立ち上げることになります。

#Containerを起動すると同時にコマンドシェルを立ち上げることもできる

先ほどは、実行中のContainer の中に入ってコマンドシェルを立ち上げましたが、Containerを起動すると同時にコマンドシェルのなかに入ることもできます

```
docker run -it busybox sh
```

上記のコードを実行した結果は下のようになります


![2021-05-30_9-27-05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/47517cb1-ccc9-6f6a-29d5-278a92b4a382.png)

#まとめ

今回の記事では、Container 内でさらにコマンドプロンプトを起動する方法を解説させていただきました。

お役に立てれば幸いです。
Javaで1行に複数個の文字列を入力する方法

競技プログラムで1行に複数個の文字列を標準入力する方法です。

```Java
package nogizaka;
// Scannerクラスをインポートする
import java.util.Scanner;

public class paiza1 {
	public static void main(String[] args) {
        //Scannerクラスを呼び出す
        Scanner scanner = new Scanner(System.in);
        //文字列の個数が全て入力するまで繰り返す
        while (scanner.hasNext()) {
            //文字列を1個ずつ標準出力する
            System.out.println(scanner.next());
        }
        //Scannerクラスを閉じる
        scanner.close();
    }
}
```

上記のようにコードを書くと1行に複数の文字列を入力できます。
CentOS7で zabbix4 → zabbix5にアップデートしてみた

## 概要

- 環境 : CentOS7
- やること : zabbix4 → zabbix5へのアップデート
- DB : mariadb
- web : httpd

今回は自分で使う用なので、細かいバックアップとかは行っていません

## 1. 構築済みのzabbix4を用意します。

構築方法は [こちら](https://qiita.com/miyuki_samitani/items/39e366e75d64d0d94506) をご確認ください

zabbixのバージョン確認

```
zabbix_server -V
==========
zabbix_server (Zabbix) 4.0.31
==========
```

データも移行されていることを確認するため、ホストを一つ追加しておきます。
きちんと本番稼働しているサーバならもしかしたら全てが移行しきれないかも知れませんが、今回は一旦そこは見ないです。

![1ホストの設定 - Google Chrome 2021-05-29 11.45.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/ff1fff82-e87d-e100-306e-229b87d64b94.png)


## 3. リポジトリの更新・zabbix4の削除・zabbix5のインストール

リポジトリの更新

```
rpm -Uvh https://repo.zabbix.com/zabbix/5.0/rhel/7/x86_64/zabbix-release-5.0-1.el7.noarch.rpm
```

zabbix4 を削除

```
yum remove zabbix-server-mysql zabbix-web-mysql zabbix-agent
```

zabbix5 のインストール

```
yum clean all
yum -y install zabbix-server-mysql zabbix-agent2 zabbix-web-japanese
```

## 4. zabbix5の設定更新

パスワードの変更を行います。
ここのパスワードは環境に応じて変更してください

```
sed -i -e '/# DBPassword=/a DBPassword=zabbix' /etc/zabbix/zabbix_server.conf
```

## 4. zabbixのwebインタフェースのインストール

centos-release-sclのインストール

```
yum -y install centos-release-scl
```

webインタフェースのパッケージをインストールできるようにzabbix-frontendを有効にします

```
vi /etc/yum.repos.d/zabbix.repo
==========
[zabbix-frontend]
...
enabled=0
↓
enabled=1
==========
```

各種パッケージのインストール

```
yum -y install zabbix-web-mysql-scl zabbix-web-deps-scl zabbix-apache-conf-scl
```

## 5. zabbixのwebインタフェースの設定更新

```
sed -i -e '/; php_value\[date.timezone\] = Europe\/Riga/a php_value\[date.timezone\] = Asia\/Tokyo'  /etc/opt/rh/rh-php72/php-fpm.d/zabbix.conf
```

## 6. 各種サービスの起動・再起動・自動起動設定

PHP-FPMの起動・自動起動設定

```
systemctl start rh-php72-php-fpm
systemctl enable rh-php72-php-fpm
```

zabbix-server,agentの起動・自動起動設定

```
systemctl start zabbix-server zabbix-agent2
systemctl enable zabbix-server zabbix-agent2
```

mariadbの再起動

```
systemctl restart mariadb
```

httpdの再起動

```
systemctl restart httpd
```

## 7. ブラウザをシークレットモードにするか、キャッシュをクリアする

たまに以下のように画像やアイコンが出ないときがあります。
その時は、ブラウザのキャッシュの可能性がありますので、シークレットモードにするかキャッシュをクリアしてください

![1ダッシュボード - Google Chrome 2021-05-29 14.39.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/b9a3d827-6fa6-6bc7-0880-97c0de574699.png)


## 8. ログイン確認

無事zabbix5にアップデート出来ました！

![2ダッシュボード - Google Chrome 2021-05-29 14.46.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/7abf2fc1-4b43-47a8-5b4f-9c178d22646f.png)

入れていた、ホストデータも引き継がれています！

![3ホストの設定 - Google Chrome 2021-05-29 14.48.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/deb8539a-ea0a-7e70-1e34-6b2083511f6e.png)


バージョン確認

```
zabbix_server -V
==========
zabbix_server (Zabbix) 5.0.12
==========
```

## 勉強後イメージ

`7. ブラウザをシークレットモードにするか、キャッシュをクリアする` で画像が表示されなくてすごい詰まってたけど
ブラウザの関係でした。
それ以外はそんな難しくなかったかも。

## 参考

- [Zabbix 4.0から5.0へアップデートする方法（CentOS 7.8/MariaDB 5.5/Apache 2.4）](https://satimo.org/2020/07/zabbix-40-50-update/)
- [Zabbix3.4 から Zabbix5.0 にアップグレード](https://wara2.cocolog-nifty.com/blog/2020/05/post-63cdf5.html)
Databricksのメニュー構成の変更点

それなりに大きな変更ですので別記事として書いておきます。

# 変更点

- メニューのコンテンツがペルソナ(**Data Science & Engineering**、**Machine Learning**、**SQL**)ごとに切り替えられるようになりました。
    - Data Science & Engineering: PythonやR、SQLを用いてノートブックを作成し実行するペルソナ(旧来のワークスペースはData Science & Engineeringワークスペースと名称変更されています)
    - Machine Learning: モデル管理や特徴量ストアを活用してノートブックを作成するペルソナ
    - SQL(旧SQL Analytics): BIを行うペルソナ


# サイドバーの使い方
左のサイドバーからDatabricksの全てのアセットにアクセスできます。サイドバーのコンテンツは選択するペルソナ(**Data Science & Engineering**、**Machine Learning**、**SQL**)によって決まります。

- デフォルトではサイドバーは畳み込まれた状態で表示され、アイコンのみが表示されます。サイドバー上にカーソルを移動すると全体を表示することができます。
- ペルソナを変更するには、Databricksロゴの直下にあるアイコンからペルソナを選択します。
![](https://docs.databricks.com/_images/change-persona.gif)
- 次回ログイン時に表示されるペルソナを固定するには、ペルソナの隣にある![](https://docs.databricks.com/_images/persona-pin.png)をクリックします。再度クリックするとピンを削除することができます。
- サイドバーの一番下にある**Menu options**で、サイドバーの表示モードを切り替えることができます。Auto(デフォルト)、Expand(展開)、Collapse(畳み込み)から選択できます。
- 機械学習に関連するページを開く際には、ペルソナは自動的に**Machine Learning**に切り替わります。

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)
Nuxtで画像ダウンロードツール作ってみた

以前、↓の記事でCLIの画像ダウンロードツールを作ったのですが、不要な画像までダウンロードされてしまうのでGUI化し、選択してダウンロードできる様にしてみました。

https://qiita.com/teracy55/items/f8a7c90b021368b12ab6


# 今回作ったツール

~~https://teracy-img-downloader.herokuapp.com/~~
~~※HEROKUの無料プランを使っているため、表示されるまでに1分程度かかります~~

(追記)
HEROKU無料プラン終了に伴いRenderに移行しました
https://img-downloader.onrender.com
※サーバー起動までに1分程度かかります

# 機能紹介

使い方は簡単です

1. ダウンロードしたい画像のあるサイトのURLを入力し、検索します
2. ダウンロードしたい画像を選択します（選択した画像は赤くなります）
3. ダウンロードボタンを押してダウンロードします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325108/0bd7ee37-ceba-6f6c-5f16-55edd4149ea7.png)

※「いらすとや」さんのページを使わせていただいてますが、このツール使用時は対象のサイトがスクレイピングを禁止していないことを確認の上、使用してください

※Herokuの無料プランでサーバーを立てているため、サーバーがスリープしているとアクセス時に表示まで1〜2分程かかることがあります

# 技術的な話

### 各種バージョン


```shell
$ node -v
v12.16.3
```

### Nuxtについて

- `npx create-nuxt-app`でNuxtプロジェクトを作成します。なお、設定は以下の通りです
  - 言語：Typescript
  - UI Component：ElementUI
  - Module：Axios
  - Linter：Prettier
  - その他はデフォルトでEnter連打

※nuxtバージョンは2.15.6でした


### ポイント

[scraperjs](https://www.npmjs.com/package/scraperjs)を使っているのですが、Node.jsのいろんなパッケージが必要でそのままだと動きません。

Nuxtには[serverMiddleware](https://ja.nuxtjs.org/docs/2.x/configuration-glossary/configuration-servermiddleware/)という機能を備えているため、これを使います。

この機能を使うと、APIを作成してサーバーサイドの処理を実装することができます。
これにより、通常Vue.jsでは使用できないNode.jsのパッケージ（fsやrequest等）も使うことができます。



# 最後に

SPAやAjaxで非同期でimgタグを埋め込む様なページには対応できていないため、スクレイピングをヘッドレスブラウザに切り替えてより対応範囲を広げて行けたら良いなと思います。
【Flutter】TextFormFieldにクリアボタンを追加する

#はじめに
Flutterのテキスト入力フィールドによくある以下のようなクリアボタンを実装する方法を紹介。
![スクリーンショット 2021-05-30 9.03.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431401/3d40ef4f-1b8d-a953-f667-3c6774fa6eb2.png)

#方法

InputDecorationとTextEditingControllerを用いる。

```dart
final TextEditingController _categoryNameController =
      new TextEditingController(text: '');
...
TextFormField(
  controller: _categoryNameController,
  keyboardType: TextInputType.text,
  decoration: InputDecoration(
    hintText: 'カテゴリ名',
      suffixIcon: IconButton(
        onPressed: () =>
            _categoryNameController.clear(),
        icon: Icon(Icons.clear),
      ),
      icon: Icon(
        Icons.folder,
        color: Colors.grey,
      ),
    ),
  )
```

# おわりに
[こちら](https://stackoverflow.com/questions/48927928/how-to-add-clear-button-to-textfield-widget)を参考。
Houdini x Pythonのイベント関連備忘録（例：ライトの色を変えたらノードの色も同じ色に変わる）

##はじめに
今回は例とをしてライトの色を変更すると、ライトのノードの色も設定したライトと同じ色に自動で変更され、一目でライトの色がわかるようにしたいと思います。

![ezgif.com-gif-maker.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24726/98a07be9-769c-be36-62a0-a5ed15297840.gif)
####この実装には`2種類のイベントコールバックの設定が必要`となりますのでそれぞれ解説していきたいと思います。

##1. ライトの色が変更されたイベントによりノードの色を変更するコールバックを設定する。
Nodeのコールバック設定は`addEventCallback(event_types, callback)`、`addParmCallback(callback, parm_names)`があります。
この2つのメソッドの使い分けですが、ヘルプによると

>1.いくつかのパラメータのみを考慮する。
>2.ノードにパラメータがたくさんある。
>上記に該当する場合は、`addEventCallback(event_types, callback)`を使ってパラメータをフィルタリングするよりも`addParmCallback(callback, parm_names)`の方が処理が高速。

とありますので、今回はカラーパラメータ変更によるコールバックなので`addParmCallback(callback, parm_names)`を使います。
ここで一つ注意なのですが、param_namesはパラメータが単数であってもListやTupleでなければエラーが出ます。
引数は`callback`がコールバック関数オブジェクト（この例では`change_color`）、`parm_names`は`('light_color',)`となります。

```python:parm_change_addCallback.py
node.addParmCallback(change_color, ('light_color',))
```
一方のコールバック関数側ですが、引数に`event_types`（`hou.nodeEventType`）, `**kawrgs`を取ります。
`kwargs`の内容はコールしたNodeへの参照とイベントタイプに応じた参照へのキーワードが含まれます。 
[各タイプの追加キーワードはこのリンクのヘルプを参照してください。](https://www.sidefx.com/docs/houdini/hom/hou/nodeEventType.html)
今回の例では`parm_tuple`キーワードでパラメータの参照（今回の例では'light_color'パラメータ）を得ることが出来ます。
関数内ではノードの色をパラメータの色に変更しているだけです。

```python:parm_change_callback.py
def change_color(event_type, **kwargs):
    kwargs['node'].setColor(hou.Color(kwargs['parm_tuple'].eval()))
```
##2. Lightノードがネットワークビューに追加されるたびにそのノードに1の設定を追加する。
1の設定では単一のLightノードにしか適用されないので、Lightノードがビューに追加される毎に1で設定したコールバックが追加されるようにします。
そのために[ノードのイベントハンドラーファイル(Node event handler files)](https://www.sidefx.com/docs/houdini/hom/locations.html#asset_events)を作成して配置します。
具体的には1で作ったPythonコードのファイルと規則に則ったファイル名に変更し、配置します。

ヘルプによると、
>イベントを指定し全てのノードに適用される。
>`HOUDINIPATH/scripts/event.py`
>ノードとイベントの組み合わせに適用される。
>`HOUDINIPATH/scripts/category/nodename_event.py`

今回はLightノードの生成イベントにコールバックを設定したいので、
`category`は`obj`
`nodename`は`hlight-2.0`
`event`は`OnCreated`
となり最終的なファイル名とパスは以下のようになります。
ファイル名：`hlight-2.0_OnCreated.py`
パス：`HOUDINIPATH/scripts/obj/hlight-2.0_OnCreated.py`

HOUDINIPATHは環境によりますのでご自身のHOUDINIPATHをお調べください。
Windows環境ですと例えば、`C:\Users\HoudiniUser\Documents\houdini18.5\scripts\obj\hlight-2.0_OnCreated.py`のようになります。

また、コールバック時には**kwargsで引数を受けます。今回の例では`node`,`type`のキーワードでノードとそのタイプを得ることが出来ます。

##コード全体
```hlight-2.0_OnCreated.py
# 色を変更するコールバック関数
def change_color(event_type, **kwargs):
    kwargs['node'].setColor(hou.Color(kwargs['parm_tuple'].eval()))

node = kwargs['node']   # OnCreated（ノード作成のイベント）コールバックの引数からノードを取得
node.parmTuple('light_color').set(node.color().rgb())   # 最初の色合わせ（オプション）
node.addParmCallback(change_color, ['light_color']) #ライトの色が変更された時のコールバックの設定
```

##最後に
理解してみればコードもシンプルで大したものでもないのですが、情報が少なく方法を理解するのに多少苦労しました。
環境（Houdini Indie 18.5.563 Python3 Windows)
redirect_toとrenderの違い

こんにちは！
今日も自分の理解が浅いことについて、
アウトプットの為にかれこれ調べてきました。
今回はredirect_toメソッドとrenderメソッドの違いについてです。

<h1>redirect_toメソッド</h1>
railsでリダイレクト処理を行うメソッドですわ。
リダイレクトとはアクションに処理を持たせた上で、
そのパスのビューを返すのではなく別のパスに
ユーザーを転送させることができます。
redirect_toは新しくリクエストが送信された時に
ルーティング、コントローラー、モデルを
通してビューが表示されます。

記述方法はactionの後に
リダイレクト先となるアクションを指定します。

```ruby
redirect_to action: :index
```
また、パスを指定することもできます。

```ruby
 redirect_to root_path
```

<h1>renderメソッド</h1>
呼び出すビューファイルを指定するメソッドですね。
新しくリクエストされることなくそのままビューを
呼び出すことができます。
部分テンプレートを呼び出す時に
使用したりもします。
redirect_toメソッドと違って
新しくリクエストされることなくそのままビューが
表示されます。
部分テンプレートを呼び出す際には
*partial*　というオプションを使用します。

```ruby
<% render partial: 'message' %>
```

アクション名を指定してビューを呼び出すこともできます。

```ruby
<% render :index %>
```
Ciscoコマンド(Router)一覧

#Router



######メッセージに割り込まれても入力を続けられるコマンド
```
Router(config-line)#logging synchronous
```

######ホスト名変更
```
Router(config)#hostname [任意の名前]
```

######グローバルインターフェイスモードへ移動
```
Router(config)#interface [インターフェイス番号]
```

######インターフェイス有効化
```
Router(config-if)#no shutdown
Router(config-if)#no sh
```

######IPアドレス付与
```
Router(config-if)#ip address [IPアドレス] [サブネットマスク]
Router(config-if)#ip add [IPアドレス] [サブネットマスク]
```

#Switch
カルマンフィルター その２

# 記載ルール
このブログではカルマンフィルターを解説していく。具体的な解説の前に状態空間モデルを記述する際のルールを述べる。なお、このブログでは線形カルマンフィルターを扱う。

## 状態空間モデル
まず、前回のブログでも提示した状態空間モデルを少しだけ改良した方程式を以下に記述する。

$$Y_t = c + \tilde \beta_t X_t + \tilde e_t \tag{1}$$
$$ \tilde \beta_t = d + \tilde \phi\tilde \beta_{t-1} + \tilde v_t \tag{2}$$
(1)が観測方程式、(2)が状態方程式という。前回と異なるのは、(1)に説明変数$X_t$が追加されたことと、(2)に係数$\tilde \phi$が追加されたことである。変数の$_t$は時変変数であることを示しており、また~がついている変数は確率変数である。すなわち、上記(1),(2)において観測できる変数は$Y_t, X_t$のみである。尚、$\tilde e_t ～ N(0, \sigma^2_e),\tilde v_t ～ N(0, \sigma^2_v)$に従うものとし、$c$と$d$は定数である。


次に、期待値と分散の記載ルールを述べる。各々の数式の意味は次回以降で解説し、ここではあくまで記載ルールのみの説明に留める。

## 期待値
$\hat　\beta$ (チルダではなく、ハットがついている)は$\beta$の推定値を意味する。$\Omega$は情報集合である。

### 1期先の予測値 
下記は1期前の情報を使って、今期の$\beta$を推定したことを意味する。
$$\hat \beta_{t|t-1} \equiv E_{t-1}[\tilde \beta_t|\Omega_{t-1}] \tag{3}$$

### フィルタリング値 
下記は今期の情報を使って、今期の$\beta$を推定したことを意味する。
$$\hat \beta_{t|t} \equiv E_{t}[\tilde \beta_t|\Omega_{t}] \tag{4}$$

### スムージング値 
下記はN期までの情報を使って、今期の$\beta$を推定したことを意味する。このN期は今期以降の未来の情報も含まれている点に留意する。
$$\hat \beta_{N} \equiv E_{N}[\tilde \beta_t|\Omega_{1:N}] \tag{5}$$

## 分散
### 1期先の分散の予測値
下記は1期前の情報を使って、今期の$\beta$の分散を推定したことを意味する。
$$\hat \Sigma_{t|t-1} \equiv Var_{t-1}[\tilde \beta_t|\Omega_{t-1}] \tag{6}$$

### 分散のフィルタリング値
下記は今期の情報を使って、今期の$\beta$の分散を推定したことを意味する。
$$\hat \Sigma_{t|t} \equiv Var_{t}[\tilde \beta_t|\Omega_{t}] \tag{7}$$

### 分散のスムージング値
下記はN期までの情報を使って、今期の$\beta$の分散を推定したことを意味する。
$$\hat \Sigma_{t|N} \equiv Var_{t}[\tilde \beta_t|\Omega_{1:N}] \tag{8}$$

## MCMCをなぜ使うのか
ところで、話は(1),(2)の方程式に戻るが、なぜMCMCを使うのか、という点について触れておく。通常、$c, d$, そして、誤差項を時変変数とせず、$e ～ N(0, \sigma^2_e),v ～ N(0, \sigma^2_v) $とし、各々を最尤法で推定し、そのあと求めたい$\tilde \beta_t$をカルマンフィルターで推定する２段階の手法を用いられることがある。これは誤差項が常に一定の確率分布に従うという仮定が成立する場合においては、特に問題は発生しない。しかし、現実の世界において、誤差項の分散が常に一定であるという仮定は、2020年3月のCovid19による為替市場や株式市場の変動をみても明らかであるように、必ずしも成立しない。Covid19が極めて特別な事例であったとしても、その他にも中央銀行の金融政策の変更によるサプライズや、予期できない災害等によるショックが常に一定の範囲に収まるという仮定は、現実をうまく表せない時もあることに留意すべきことである。

以上のことを勘案し、本ブログでは誤差項も時変変数として扱う。この場合の状態方程式を推定する方法として、MCMC(Markov chain Monte Carlo methods)を用いた推定手法も併せて解説する。但し、それらの解説は恐らく随分と先の話になるかと思う。
OS別ネットワーク関連コマンド

##自身のIPアドレスを表示するコマンド

####・Windows
```
ipconfig
ipconfig△/all
```
####・MAC
```
ifconfig
```

####・Linux
```
ip address [show]
```

##ARPテーブルを表示するコマンド

####・Windows,MAC,Linux
```
arp -a
```

##ルーティングテーブルを表示するコマンド

####・Windows
```
route print
netstat -r
```
####・MAC
```
netstat -r
```

####・Linux
```
ip route [show]
```
cargo install cargo-generateに失敗する (fatal error: zlib.h: No such file or directory)

### 環境
* Debian (WSL2)
* linuxbrew
* cargo 1.52.0

### 起こったこと
`cargo install cargo-generate`を実行すると、以下のメッセージを吐いて異常終了する

```zsh
The following warnings were emitted during compilation:

warning: libssh2/src/comp.c:41:10: fatal error: zlib.h: No such file or directory
warning:  #include <zlib.h>
warning:           ^~~~~~~~
warning: compilation terminated.

error: failed to run custom build command for `libssh2-sys v0.2.21`
```

どうやら、libssh2周りで不足がある模様

### 試したこと

* pkg-configを叩く

```bash
pkg-config --cflags zlib
pkg-config --cflags libssh2
# どちらとも、linuxbrewのパスが表示される… 一応入ってるみたい
```

* libssh2をインストールする

```bash
sudo apt install libssh2-1-dev    # が、うまくいかない…
```

* libzをインストールする

```bash
sudo apt install libz-dev    # ビルドに成功した！
```

### 何がダメだったのか
検索したところ、[それっぽいissue](https://github.com/rust-lang/rust/issues/69552)がいくつかヒットしました。
cargoはlinuxbrew経由でインストールしたライブラリを見に行ってくれない(※)ようなので、
aptでインストールする必要があるようです。
※語弊があるかもしれません…

### 終わりに
`brew reinstall ...`をやっても解決しないよ、という話でした。
素直に環境構築をすれば遭遇しなさそうですが、備忘として残しておきます。
Raspberry Pi 初期セットアップメモ

# はじめに

Raspberry PiってSDカードがあればいくつでもシステムが作れるので便利ですよね。
ボクもなにか試したいことがあると新しいSDカードを用意してRaspbianOSのイメージを焼いて…
という感じで始めちゃうのですが、最初にやるべきことがいくつかあるのでそれらの初期セットアップをまとめてみました。

自分の環境や好みのスタイルに合わせてあるセットアップ手順なので、そのままお使いいただけないと思いますがなにか参考になれば。

# 初期セットアップ手順

## デフォルトユーザーのパスワード変更

pi ユーザーのパスワードを変更する

```
$ passwd pi
```

## HDMI出力画面の文字を大きくする

HDMIディスプレイ設定がデフォルトではフォントが小さいので
/boot/config.txtの以下の値を書き換えて再起動

```/boot/config.txt
# uncomment if hdmi display is not detected and composite is being output
hdmi_force_hotplug=1

# uncomment to force a specific HDMI mode (this will force VGA)
hdmi_group=1
hdmi_mode=4
```

## キーボードレイアウトの変更

普段は英語配列のキーボードを使ってますが、Raspberry Piには日本語配列のコンパクトキーボードを使うので日本語配列に変更してます。

`raspi-config`で設定

```
% sudo raspi-config
```

* "4 Localisation Options" を選択  
* "I3 Change Keyboard Layout" を選択  
* Generic 105-Key (Intl) PC はそのまま選択  
* Keyboard layout は otherを選択
* Japanese を選択

あとはデフォルトで

## sshdの有効化

`raspi-config`で設定

* "5 Interfacing Options" を選択  
* "P2 SSH" を選択  
* enableにするか聞いてくるのでYesを選択

## rootのパスワード設定
sudoで作業するのは性に合わないので普通にsuできるようにしてます。

```
$ sudo su
# passwd
```

## ネットワーク設定

### hostname 変更

```
# vi /etc/hostname
# vi /etc/hosts
```

### 無線LANの国変更

`raspi-config`で設定

* "4 Localisation Options" を選択  
* I4 Change Wi-fi Country を選択  
* JP Japane を選択

変更すると勝手に再起動する  

### 無線LANの認証設定

これも`raspi-config`で設定  

* "2.Network Options" を選択  
* N2 Wi-Fi を選択  
* SSIDとパスフレーズを入力

### IPアドレスの固定化

`/etc/dhcpcd.conf`を以下のように修正

```dhcpd.conf
interface wlan0
static ip_address=192.168.xx.xx/24
static routers=192.168.xx.xx
static domain_name_servers=192.168.xx.xx 192.168.xx.xx
static domain_search=d-line.net
```

再起動

## 最新化

```
# apt-get update
# apt-get upgrade
# apt-get dist-upgrade
```

## IPv6 の無効化

うちの環境ではIPv6があるといろいろ困るので無効化してます。

以下を/etc/sysctl.conf に追加

```/etc/sysctl.conf 
# Disable IPv6 network
net.ipv6.conf.all.disable_ipv6 = 1
```

反映

```
# sysctl -p
net.ipv6.conf.all.disable_ipv6 = 1
```

## その他使いやすいように

- 自分のユーザー追加
- tcsh導入
- ログインプロファイルを他のマシンから取ってくる等
AWSクラウドプラクティショナー学習3日目

## IAM(AWS Indentity and Access Management)

AWSのサービスの利用権限をユーザーごとに設定したもの。
ルートアカウントはすべての権限を持つため、これを日常的に使うのはセキュリティ的にあまりよろしくない。
よってIAMユーザーやIAMグループを作成してIAMごとに権限を付与する形で日常的にはAWSを運用する。

### IAM作成時の注意点

- 権限は最小限にする
- APIキーは各アカウント2つまでしか発行できない→3つめがほしい場合は1つめを削除する必要あり
- シークレットアクセスキーは生成時以外確認不能→なくしたら再発行してね

### IAMロール

APIキーを使わずにEC2などの各サービスごとに使用できるIAMを定めたもの。
APIキーの利用は非推奨とされているのでIAMロールを使うのが好ましい

## セキュリティグループ

1つ以上(複数でもOK)のインスタンスのトラフィックを制限する仮想のファイアウォール。
オンプレミス時代は全体で1つのファイアウォールを使用していたが、AWSではセキュリティグループを設定するだけで各インスタンスごとに個別にファイアウォールを設定できる

### 特徴

- インバウンドとアウトバウンドを個別に指定可能
  - インバウンド…インスタンス外からインスタンスへのアクセス
  - アウトバウンド…インスタンスからインスタンス外へのリクエスト
    - インバウンドはデフォルトでは何も許可されていない→許可しない限りインスタンスには外部からアクセスできない
- 許可するリクエストは設定できるけど、拒否するリクエストは設定できない

## AWS Shield

DDos攻撃というトラフィック量を増加させてサーバーダウンを狙う攻撃からインスタンスを守ってくれる。
Standardプランであれば無償で利用可能。Advancedにすると分析レポートの作成とかやってくれるらしい

## AWS WAF(Web Application Firewall)

Webアプリに特化したファイアウォール

### 特徴

- 基本利用料無料
- WAFの定義自体は自分でやる必要ある
- フル機能のAPIが用意されていてそのまま使うこともできる
- EC2インスタンス自体には設定できず、LoadBalancerを介して設定する

## AWS Inspector

EC2でデプロイしたアプリのセキュリティとコンプライアンス向上のための脆弱性診断を自動でやってくれるもの

## AWS Artifact

AWSのコンプライアンスレポートにアクセスできる

## AWS Key Management Service

AWS上で暗号化キーを作成しアプリの使用を制限できる。
GWT の domino-ui がカッコイイ

# domino-uiはGWT上のGUI部品です

GWT(Google Web Toolkit)は、JavaをトランスパイルしてJavaScriptを生成する技術です。



コンパイルした環境

Windows10
Adopt OpenJDK 8
maven 3 系




以下のサイトからソース一式をZIPでダウンロード

[ domino-ui-demo ]( https://github.com/DominoKit/domino-ui-demo )


cd domino-ui-demo-master

README.md を参考にするが、うまくいかない。

単に、 mvn package としてみる

コンパイルには、かなり時間がかかります。
私が使っているノートPCで、１０分程度。ぼけーっと、待ちます

再度 README.md を参考に

```CMD.EXE
cd ui-demo-backend
java -jar target/ui-demo-backend-1.0-SNAPSHOT-fat.jar
```

画面にポートが表示されているので、http://localhost:[port]

カレンダーの部品もありました！
vectorと単項の演算を作ってみた

0-indexedのものを1-indexedにして出力したいなぁってなったときにわざわざループを回して+1したり`valarray`におきかえたりするのはひと手間がかかると感じたので演算子を作った

## operator+=
```cpp
template <typename T>
void operator+=(vector<T> &vs, T x){
  for(T &v:vs) v += x;
}
```
他の四則演算もほとんど同じ

## operator+
```cpp
template <typename T>
vector<T> operator+(const vector<T> &vs, T x){
  vector<T> res=vs;
  for(T &v:res) v += x;
  return res;
}
```
他の四則演算もほとんど同じ

## 完成形
```cpp:丁寧に書いたもの
template <typename T>
void operator+=(vector<T> &vs, T x){
  for(T &v:vs) v += x;
}

template <typename T>
void operator-=(vector<T> &vs, T x){
  for(T &v:vs) v -= x;
}

template <typename T>
void operator*=(vector<T> &vs, T x){
  for(T &v:vs) v *= x;
}

template <typename T>
void operator/=(vector<T> &vs, T x){
  for(T &v:vs) v /= x;
}

template <typename T>
void operator%=(vector<T> &vs, T x){
  for(T &v:vs) v %= x;
}

template <typename T>
vector<T> operator+(const vector<T> &vs, T x){
  vector<T> res=vs;
  for(T &v:res) v += x;
  return res;
}

template <typename T>
vector<T> operator-(const vector<T> &vs, T x){
  vector<T> res=vs;
  for(T &v:res) v -= x;
  return res;
}

template <typename T>
vector<T> operator*(const vector<T> &vs, T x){
  vector<T> res=vs;
  for(T &v:res) v *= x;
  return res;
}

template <typename T>
vector<T> operator/(const vector<T> &vs, T x){
  vector<T> res=vs;
  for(T &v:res) v /= x;
  return res;
}

template <typename T>
vector<T> operator%(const vector<T> &vs, T x){
  vector<T> res=vs;
  for(T &v:res) v %= x;
  return res;
}
```

```cpp:1行ずつにまとめたもの
template <typename T> void operator+=(vector<T> &vs, T x) { for ( T &v : vs ) v += x; }
template <typename T> void operator-=(vector<T> &vs, T x) { for ( T &v : vs ) v -= x; }
template <typename T> void operator*=(vector<T> &vs, T x) { for ( T &v : vs ) v *= x; }
template <typename T> void operator/=(vector<T> &vs, T x) { for ( T &v : vs ) v /= x; }
template <typename T> void operator%=(vector<T> &vs, T x) { for ( T &v : vs ) v %= x; }
template <typename T> vector<T> operator+(const vector<T> &vs, T x) { vector<T> res = vs; for ( T &v : res ) v += x; return res; }
template <typename T> vector<T> operator-(const vector<T> &vs, T x) { vector<T> res = vs; for ( T &v : res ) v -= x; return res; }
template <typename T> vector<T> operator*(const vector<T> &vs, T x) { vector<T> res = vs; for ( T &v : res ) v *= x; return res; }
template <typename T> vector<T> operator/(const vector<T> &vs, T x) { vector<T> res = vs; for ( T &v : res ) v /= x; return res; }
template <typename T> vector<T> operator%(const vector<T> &vs, T x) { vector<T> res = vs; for ( T &v : res ) v %= x; return res; }
```

# あとがき
これでほんの少し便利になったと思う

# 参考
> - [http://tech.nitoyon.com/ja/blog/2007/12/11/boost-asign/:title]