OmniAICreator/Qiita-1.07M huggingface dataset:
GeoGebraで画像をコマ送りで動かす

## はじめに
ある点からある点への画像の移動について考えた時、ただ画像の位置が変わっているだけなのでその動きは瞬間移動に見えてしまいます。ここではその動きが滑らかに見えるような工夫を紹介します。
完成したものは[こちら](https://www.geogebra.org/m/rvfptwty)

## 手順1 画像の位置を決めるための点を作成する
配置した画像を動かすには端っこの2点が必要です。点Aから定まる2点B,Cを配置し、BCを画像の端っこの点としましょう。

```js
B = (x(A)-1,y(A)+1)
C = (x(A)-1,y(A)-1)
```

![スクリーンショット 2021-03-31 21.53.34.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549093/8f3c50e9-ea9a-a0a5-5ba0-daca7d212fbd.jpeg)

## 手順2 画像を配置する
手順1で配置した2点を利用し、画像を配置します。
![スクリーンショット 2021-03-31 21.56.37.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549093/6d69f191-e4f4-8476-498b-29709f6e1563.jpeg)

ツールボタンから画像を配置し、その画像を選択すると、上の画像のような画面になるので、隅1にBを、隅2にCを選択します。点B,Cは点Aによって定まる点であるので、画像を動かす時にはAを動かせば良いですね。

![スクリーンショット 2021-03-31 21.58.13.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549093/f6957fef-cbb9-6ebd-459d-359f112cf629.jpeg)

## 手順3 右に1動く関数を作成する
亀を右に動かすためにはAのx座標を1大きくする必要があります。ボタンをクリックした時に実行されるJavaScript関数をグローバル関数として作成します。

```js:グローバル関数
function moveForward() {
    ggbApplet.evalCommand(`A=(x(A)+1,y(A))`);
}
```

## 手順4　ボタンを作成し、クリックされた時に関数を呼ばせる
ツールバーからボタンを追加し、先程用意した関数がクリックした時に実行されるようにします。

```js:クリックして
moveForward();
```
![スクリーンショット 2021-04-01 9.00.56.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549093/a8d231d5-e037-7c43-b2c1-108841105a7d.jpeg)

すると、ボタンが押された時に亀が動きます。

## 手順5 右に0.1動く関数を作成する
手順3で作った関数に変更を加えます。

```js
function moveForward() {
    ggbApplet.evalCommand(`A=(x(A)+0.1,y(A))`);//0.1に変更
}
```
これを10回呼ぶことで元の関数と同じ挙動をすることになりますね。

## 手順6　関数を連続して実行する関数を作成する
先程作成した右に0.1動く関数`moveForward()`について、0.1秒後に実行,0.2秒後に実行,0.3秒後に実行...のようにすることで1秒かけて右に1動く関数を作成することができます。引数にした関数を0.1秒間隔で10回実行するJavaScript関数を作成します。具体的な作成方法は[こちら](https://qiita.com/Hyperbolic_____/items/b940051b3a5fee258744)

```js
//0.1秒間隔で10回実行する
function frameAdvance(func) {
    for (var i=0; i<10; i++){
        setTimeout(func, i*100);
    }
}
```

手順7 関数を組み合わせる
手順5〜6で点Aのx座標を0.1を大きくする関数`moveForward()`と、引数にした関数を0.1秒間隔で10回実行する関数`frameAdvance(func)`を作成しました。その関数を組み合わせることで、1秒かけて点Aのx座標を1大きくすることができます。

```js:クリックして
frameAdvance(moveForward);
```
これでコマ送りで横に1動く亀の動きを表現することができました。それではここから亀が横に1ではなくn動くように変更していきます。

## 手順8 スライダーを作成し、変数を用意する
ツールバーからスライダーを作成します。変数の設定は整数にしておきます。

## 手順9 既存の関数の1をnに一般化する

手順5で作成した以下の関数は1の1/10の0.1だけ動かすものでした。その1がnに置き換わるので、n/10動かせば良いとわかります。
作成した関数に、GeoGebra上の変数nを取得し1/10にする処理を加えます。

```js:グローバルJavaスクリプト
function moveForward() {
    var distance = ggbApplet.getValue('n');
    distance /= 10;
    const code = `A=(x(A)+${distance},y(A))`;
    ggbApplet.evalCommand(code);
}
```
完成！横方向にnだけコマ送りで動く亀を作成することができました。これを応用することで、LOGOタートルのようなプロジェクトをGeoGebraで作成することができます。（いつか記事にします）
ROSの勉強　第37弾：ロボットアームの作成（5）

# #プログラミング ROS< ロボットアームの作成（5） >

##はじめに
1つの参考書に沿って，ROS(Robot Operating System)を難なく扱えるようになることが目的である．その第37弾として，「ロボットアームの作成（5）」を扱う．

##環境
#####仮想環境
|||
|:-:|:--|
|ソフト|VMware Workstation 15|
|実装RAM|2 GB|
|OS|Ubuntu 64 ビット|
|isoファイル|ubuntu-mate-20.04.1-desktop-amd64.iso|

#####コンピュータ
|||
|:-:|:--|
|デバイス|MSI|
|プロセッサ|Intel(R) Core(TM) i5-7300HQ CPU @ 2.50GHz 2.50GHz|
|実装RAM|8.00 GB (7.89 GB 使用可能)|
|OS|Windows (Windows 10 Home, バージョン：20H2)|

#####ROS
|||
|:-:|:--|
|Distribution|noetic|
|シミュレーション|gazebo|

##ロボットアームの作成
ROSを使って，ほとんどの新しいロボットを制御する手順は次のようである．

**1. ROSのメッセージインタフェースを決める．
2. ロボットのモータ用ドライバを書く．
3. ロボットの物理構造を書く．
4. Gazeboのシミュレーションで使用できるようにモデルに物理的特性を追加する．
5. tfを介して座標変換データを配信し，rvizでそれを可視化する．
6. センサを追加する．ドライバとシミュレーションのサポートも必要．
7. ナビゲーション等の標準的なアルゴリズムを適用する．**

ロボットアームを例にその流れを確認していく．
今回は，7についてまとめてロボットアームの作成（5）として扱うこととする．

##手順7:経路計画
###ゴールを指定する

これを行うために実行するlaunchファイル3つを以下に示す．

```:ターミナル1
roslaunch make_robot2 cougarbot.launch
```
```:ターミナル2
roslaunch cougarbot_moveit_config move_group.launch
```
```:ターミナル3
roslaunch cougarbot_moveit_config moveit_rviz.launch config:=True
```
####実装
先ほどのlaunchファイルを実行して，ゴールを直感的にrviz上で指示して経路計画させる様子を動画像で，以下に示す．
<iframe width="560" height="315" src="https://www.youtube.com/embed/HylzUcM-bVI" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

#####launchファイルの統合
```xml:all.launch
<launch>
	<!--cougarbotのシミュレーションlaunchを起動-->
	<include file = "$(find make_robot2)/launch/cougarbot.launch"/>
	<!--モーションプランニングを使えるようにするlaunchを起動-->
	<include file="$(find cougarbot_moveit_config)/launch/move_group.launch"/>
	<!--MoveItのrviz.launchを起動-->
	<include file="$(find cougarbot_moveit_config)/launch/moveit_rviz.launch"/>
</launch>
```

同様に経路計画させる様子を以下に示す．
<iframe width="560" height="315" src="https://www.youtube.com/embed/ifG30Wxqsbs" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

##感想
いい感じに動かすことができた．ようやく，ロボットアームの作成についても一通りの基礎を学ぶことができた．MoveItを活用した経路計画させる手法は非常に使いやすく魅力的であると感じた．これをどのように応用していくのかは今後の学習の中で学んでいきたい．


##参考文献
プログラミングROS Pythonによるロボットアプリケーション開発
　　　　　　　　Morgan Quigley, Brian Gerkey, William D.Smart 著
　　　　　　　　　　　　　　　　　　　　　　　河田　卓志　監訳
　　　　　　　　　　  　松田　晃一，福地　正樹，由谷　哲夫　訳
　　　　　　　　　　　　　　　　　　オイラリー・ジャパン　発行
Vagrant Box でUbuntu 入れてみた

Vagrant Box でUbuntu 入れてみた。

![vagrant_ubuntu_install.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469758/f819c6b0-c69e-baaf-b1e9-1db652e14f77.jpeg)

![vagrant_ubuntu_install2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469758/867dc3ef-46b4-690f-e768-f8c5dc705a41.jpeg)

![vagrant_ubuntu_install3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469758/b9f2f566-d996-c0f0-6726-c9f5b80883a3.jpeg)

Vagrant 上で、Red Hot Linux のCentOS　/ Debian系のUbuntu を動かしたい場合は、VagrantのサイトからOSをダウンロードする必要がある。

Vagrant box にアドレスを追加する形で、コマンドを入力する。

Vagrant init のコマンドで起動する。

![vagrant_ubuntu_install4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469758/f5b3f412-7ec6-53ca-a12a-7595434f9a2b.jpeg)

vagrant status
で状態を確認

default                   running (virtualbox)

どうやらアップしているらしい。
Qiitaテンプレ

# 概要
Qiitaのテンプレ
以下参考
https://qiita.com/tkrtmy1031/items/80c292fab5d631c6d4ba
https://qiita.com/shizuma/items/8616bbe3ebe8ab0b6ca1


# テンプレ本体
```
# はじめに
<!-- 発端や概要を記載 -->

# 目次
<!-- タイトルとアンカー名を編集 -->
1. [Chapter1]
1. [Chapter2]
1. [参考文献](URLをはる)

<!-- 各チャプター -->
<a id="#Chapter1"></a>
# Chapter1

<a id="#Chapter2"></a>
# Chapter2

<a id="#reference"></a>
# 参考文献
- [リンク名](URLをはる)
- [リンク名](URLをはる)

# インライン表示
グレイヴ・アクセント「`」で囲む
`インライン表示`

# 引用文
引用文は「>」で囲む
>引用文

# 背景を黒字にする
グレイヴ・アクセントを３つで囲む
「```」


# 表作成
| No |    内容     |    備考    |
|---:|-------------|------------|
| 1  |             |            |
| 2  |             |            |
```
Lambda

#はじめに
こちらではAWS機能について書いていきたいと思います。
公式ドキュメントやAWS認定試験（ソリューションアーキテクトやDevOpsなど）の勉強教材など細かい内容をかかず、ざっくりとした内容で。
試験などに興味はないし！公式ドキュメントなど長ったらしくて読めん！
という方に向けに作っていきたいと思います。
(私の備忘録も兼ねて)

写真はつけられればつけます。(Qiitaの制限の範囲内で)

#環境
AWS

#ドキュメント
https://docs.aws.amazon.com/index.html
https://docs.aws.amazon.com

#Lambda
単調な処理などをサーバレスで実行することができるサービス

###特徴
・実行基盤は全てAWSが管理
・AWSサービスと連携させることで簡単にイベントドリブンなアプリケーションを実行可能
・Node.js/javaで書かれたコードを実行
・100ミリ単位でコード実行に対して課金でありコスト効率が高い
・オートスケール
kernel module に関するブックマーク

# 当ブックマークの目的
docker内部でk3sを動作させるための調査です。
k3sを動作させることが実現した場合更新がストップする場合があります。

# ブックマーク
- [カスタムカーネルモジュールの構築](https://kinvolk.io/docs/flatcar-container-linux/latest/reference/developer-guides/kernel-modules/)
- [c++ - Dockerでカーネル機能を使用しているCコードをコンパイルし、コンテナでpciデバイスを使用するにはどうすればよいですか？](https://cloud6.net/so/c%2B%2B/1777418)
【Swift】TableViewでタプルを使う

#はじめに
TableViewでタプルを使ってみます。
タプルの基本的な解説は省きます。

#GitHub
https://github.com/0429oonishi/TableViews

#実装
以下のように、`Cocoa Touch Class`で`Subclass`を`UITableViewController`にしてください。
![スクリーンショット 2021-04-01 9.22.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954451/c4927560-0f89-ca35-724a-332efa1dbbb0.png)

そして、以下のように書き換えます。

```swift:MyTableViewController
import UIKit

final class MyTableViewController: UITableViewController {
    
    var models: [(String, (() -> Void))] = []
    private let cellId = "cell"
    
    override func viewDidLoad() {
        super.viewDidLoad()
        tableView.register(UITableViewCell.self, forCellReuseIdentifier: cellId)
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return models.count
    }
    
    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: cellId, for: indexPath)
        cell.textLabel?.text = models[indexPath.row].0
        return cell
    }
    
    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        tableView.deselectRow(at: indexPath, animated: true)
        models[indexPath.row].1()
    }
    
}
```

`MyTableViewController`は`UITableViewController`を継承しているので、このなかに直接書くことができます。
`var models: [(String, (() -> Void))] = []`ここでタプルを使っていますね。

`Main.storyboard`は`NavigationController`を追加し、`ViewController`に`UIButton`を一つ追加してください。
![スクリーンショット 2021-04-01 9.25.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954451/66b218c4-ffd3-9f5c-f3d8-4f861a0822d4.png)

`ViewController`の実装は以下のようになります。

```swift:ViewController
import UIKit

final class ViewController: UIViewController {
    
    @IBAction func buttonOneDidTapped(_ sender: Any) {
        let vc = MyTableViewController()
        vc.models = [
            ("swift", { print("swift") }),
            ("ruby", { print("ruby") }),
            ("php", { print("php") }),
            ("python", { print("python") }),
            ("java", { print("java") }),
        ]
        navigationController?.pushViewController(vc, animated: true)
    }
    
}
```

先ほどの`MyTableViewController`の`models`にタプルの配列を渡しています。

#おわりに
おわりです。
ローカルのpuma-devが起動しない時の対処方法

## はじめに

Macbook pro(Intel Mac)で動かしていた開発環境（Rails 6.1.0 + ruby 2.6.3）が動かなくなったところから解決までのメモ。

## 症状

ある時から、ブラウザで ****.test にアクセスしてもページが表示されなくなった。

## 試したこと

puma-devのログを見た。エラーが出ていた。

```
* Directory for apps: /Users/<username>/.puma-dev
* Domains: test
* DNS Server port: 9253
* HTTP Server port: inherited from launchd
* HTTPS Server port: inherited from launchd
! Puma dev running...
2021/04/01 07:43:52 ! HTTP Server failed: accept tcp 0.0.0.0:0: accept: invalid argument
```

プロセスを確認した。puma-devが見つからなかった。

```
$ ps x | grep puma-dev
```

puma-devを再インストールした。プロセスやログの状況は変わらなかった。

```
$ brew uninstall puma-dev
$ brew install puma-dev
```

システムログを確認した。puma-devのエラーが出ていた。

```
$ tail -f /private/var/log/system.log
: 
Apr  1 07:48:33 **** com.apple.xpc.launchd[1] (io.puma.dev[92781]): Service exited with abnormal code: 1
Apr  1 07:48:33 **** com.apple.xpc.launchd[1] (io.puma.dev): Service only ran for 0 seconds. Pushing respawn out by 10 seconds.
```

[Mac で NVRAM または PRAM をリセットする - Apple サポート](https://support.apple.com/ja-jp/HT204063) を試した。

> Mac をシステム終了してから、電源を入れ、すぐに「option」「command」「P」「R」の 4 つのキーを同時に押し、20 秒ほど押し続けてからキーを放します。

puma-dev が起動して ****.test が表示されるようになった。

```
$  ps aux | grep puma
**** 783   0.0  0.1  5107708   9596   ??  S     8:05AM   0:00.64 /usr/local/bin/puma-dev -launchd -dir ~/.puma-dev -d test -timeout 15m0s -no-serve-public-paths
```

## まとめ

不具合の原因特定で壁にあたったときは、息抜きにNVRAMリセットを試そうと思った。
５分で読んで実行できる！git resetでadd,commitを取り消す方法

# はじめに
半分自分のメモ用としてこの記事を書きました。
間違えたファイルをaddしてしまったり、コミットメッセージに誤りがあるのにcommitしてしまった場合などに有効です。

# 目次
* [addを取り消す方法](#addを取り消す方法)
* [commitを取り消す方法](#commitを取り消す方法)


<a id="1addを取り消す方法"></a>
## addを取り消す方法
主に以下の三つを用途に応じて使い分ける。
#### ステージングエリアからすべてのファイルを削除(ワークツリーに戻す)
```shell
git reset 
```

#### 特定のファイルのみステージングエリアから削除(ワークツリーに戻す)
```shell
git reset [ファイル名] 
```

#### 特定のファイルのみステージングエリアから削除し、ワークツリーにも戻さない
```shell
git checkout HEAD [ファイル名]
```

<a id="2commitを取り消す方法"></a>
## commitを取り消す方法
まず、以下のように、git logで戻りたいcommitまでのコミットIDを調べてください。

```shell
user:~$ git log
commit 6933d5392d85476afd641dead45878f036fc82b6 (HEAD -> each-break-nested)
Author: ******* <******@gmail.com>
Date:   Thu Apr 1 07:35:34 2021 +0900

   aaaソースコードの追加(間違えてcommitしたファイル)

commit b32d8fa20dfb48b421015784840271a49c013a15 (origin/each-break-nested)
Author: ******* <******@gmail.com>
Date:   Wed Mar 31 11:24:33 2021 +0900

   aaaを利用したソースコードのソースコードの追加(戻りたいcommit)

```
今回の例でいうと、戻りたいcommitまでのコミットIDは
＜b32d8fa20dfb48b421015784840271a49c013a15＞です！

#### commitのみ取り消し
```shell
git reset --soft [コミットID]
```

#### commit、addの取り消し
```shell
git reset --mixed [コミットID]
```

#### commit、add、ワーキングツリーでの変更の取り消し
```shell
git reset --hard [コミットID]
```

## 参考記事
* git resetの理解を深める＜ https://qiita.com/shuntaro_tamura/items/db1aef9cf9d78db50ffe ＞

* git チートシート＜ https://iratawa.com/git/#index_id23 ＞
【Swift】【FloatingPanel】モーダルを一枚だけ閉じたいのに全部閉じられてしまうのをなんとかする

# どういうことか

半モーダル（ハーフモーダル？セミモーダル？）をFloatingPanelで実装している。
伝わるのか自信がないが、いくつかの遷移を経由して表示されたViewControllerにて、**半モーダルをボタンを押して閉じる**という処理を実装するために `dismiss` を使うと経由してきたViewControllerが全部閉じて振り出しに戻ってしまう。

## 問題点

前提として

- 親ViewController（FloatingPanelのDelegateが実装されている）
- 子ViewController（半モーダルで表示されるページ）

とすると、問題点は**子ViewControllerにてFloatingPanelのDelegateメソッドが使えない**ことにある。
そのためには子ViewControllerから親ViewControllerに**処理を委任する**必要がある。つまりDelegate（FloatingPanelのDelegateとは別）を使う。

親ViewControllerを `ParentViewController `、
子ViewControllerを `ChildrenViewController` としよう。

```swift:ChildrenViewController.swift
protocol ChildrenViewControllerDelegate {
    func dismissModal()
}

// 中略

    var delegate: ChildrenViewControllerDelegate?

// 中略

    @IBAction func doneButtonAction(_ sender: Any) {
        
        delegate?.dismissModal()
    }
```


```swift:ParentViewController.swift

    // メンバ変数
    let fpc = FloatingPanelController()

// 中略

        // viewDidLoad内
        let storyboard = UIStoryboard(name: "ChildrenViewController", bundle: nil)
        let vc = storyboard.instantiateViewController(identifier: "ChildrenViewController")
        vc.delegate = self

// 中略

extension swift:ParentViewController: ChildrenViewControllerDelegate {
    
    func dismissModal() {
        // この dismiss が子ViewControllerで使いたかった
        fpc.dismiss(animated: true, completion: nil)
    }
}
```

おわり(´・ω・｀)
【Laravel】Laravelの外部キーの設定方法

```php
        Schema::create('line_items', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->unsignedBigInteger('cart_id');
            $table->unsignedBigInteger('product_id');
            $table->integer('quantity');
            $table->timestamps();

            $table->foreign('cart_id')
              ->references('id')
              ->on('carts');
            $table->foreign('product_id')
              ->references('id')
              ->on('products');
        });
```
これはmigrationファイルの一部

```php
            $table->foreign('cart_id')  // ここが外部キー
              ->references('id')  //外部キーに対応する親テーブルの主キー
              ->on('carts'); //親テーブル名
```
外部キーの設定の記述は上記。
Laravelは全体的にRailsに比べて記述が多い気がする。
クラウドってなに？

##クラウドコンピューティングとは？
「**クラウドコンピューティング**（cloud computing）」は、元々PCにインストールして使っていたハードウェアやソフトウェアを、ネットワークを通じて利用できる方式です。

最近クラウドってよく聞きますよね。
例えば、SpotifyとかApple Musicとか使って音楽聴いたりしている方が多いと思います。
あれって音楽のデータはスマホに入ってないですよね。
音楽データをネットワークを使って持ってきて聴いているわけです。
厳密に言えば違うのかもしれませんが、イメージとしてはそんな感じです。

##IaaS,PaaS,SaaSってなに？
クラウドにも色々とありまして、ネットワーク上にあるコンピューティングシステム（サーバーやストレージ、データベース、ネットワーク、ソフトウェアなど）を必要に応じた分だけ利用できます。
どのぐらい利用するかで名前が変わったりします。

| 分類 | 説明 |代表的なサービス|
| :---: | :---: | :---: |
| オンプレミス |  全ての環境を自身で構築し、運用する  | これはクラウドではないです |
| IaaS<br>(Infrastructure as a Service）| ハードウェア部分、ネットワーク部分を<br>クラウドサービスとして提供 |AWS EC2、GCP GCE|
| PaaS：パース<br>（Platform as a Service）| OSまでの環境、OS上でアプリケーションを動かす環境をクラウドサービスとして提供 | Heroku |
| SaaS：サース<br>（Software as a Service） | アプリケーション、アプリケーション内のデータもすべてクラウドサービスとして提供される | Slack、Gmail、iCloud |

これは時間あるときに図解でもしてみようかと思います。
picoCTF 2021 What's your input?

できなかった問題をwriteup等を参考に勉強した記録を残す。

# What's your input?

nc mercury.picoctf.net 39137
ヒント python2

```python:in.py
#!/usr/bin/python2 -u
import random

cities = open("./city_names.txt").readlines()
city = random.choice(cities).rstrip()
year = 2018

print("What's your favorite number?")
res = None
while not res:
    try:
        res = input("Number? ")
        print("You said: {}".format(res))
    except:
        res = None

if res != year:
    print("Okay...")
else:
    print("I agree!")

print("What's the best city to visit?")
res = None
while not res:
    try:
        res = input("City? ")
        print("You said: {}".format(res))
    except:
        res = None

if res == city:
    print("I agree!")
    flag = open("./flag").read()
    print(flag)
else:
    print("Thanks for your input!")


```

```
$ nc mercury.picoctf.net 39137
What's your favorite number?
Number? 1
You said: 1
Okay...
What's the best city to visit?
City? Detroit
City? Roma
City? Barcelona
City?
```


無限ループみたい。
そもそも推測やブルートフォースに python2 は関係ないな。
何か別な方法があるはず。
↑ここまでは自力

他力によると変数名を入力するとその変数の値になるような脆弱性があったとのこと。

```
$ nc mercury.picoctf.net 39137
What's your favorite number?
Number? 1
You said: 1
Okay...
What's the best city to visit?
City? city
You said: Jefferson
I agree!
picoCTF{v4lua4bl3_1npu7_8433797}
```

本当だ。

でも，ググっても脆弱性が見つからない。

あった。

https://www.pstanalytics.com/blog/advanced-analytics/python/vulnerability-in-input-function-python-2-x-for-data-science/
引き出しやすい資料の片付け方を考える@PC

『資料を引き出すのに無駄な時間を費やさない片付け方を身に付けたい』
と思ったので，備忘録・情報共有のため，本記事を投稿しました．

# 現状の整理から始める
初めは「このフォルダに整理しよう」と思っていた資料が
いつの間にか違うフォルダに入っている……ということがよくありました．

そもそもこれから関わる業務や分野の資料を網羅した，
フォルダ階層を用意することは難しいのではないか．
ということで，なるだけ自分が関わる，あるいは関わると予想される内容の資料をさらってみましょう．

片付けるものが分かっていないのに棚をたくさん用意しても，
引き出すときに「どれかの棚にある」程度のヒントしか得られません．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1259213/92efc2b5-178d-7d4b-13bc-df9da05ed8cc.png)


# フォルダ階層を構築する
ポイントは以下の三点です．

1. 直感的に資料にたどり着けるようにする
「いつ，どのプロジェクトで，どういう意図で関わった資料だったっけ」
といった思考の流れで探しものをすると思うので，
その流れに沿って階層を作ります．
パッと思い立って引き出せる **3層程度** が理想です．

1. 同階層の分類はヌケ・モレなく
分類に重複や不足があると，結局は片付けと引き出しそれぞれに，
時間を費やしてしまうことになります．
「ヌケ・モレなく」を実践するため，
予め前工程の **現状の整理** を徹底しておきましょう．

1. 同階層の資料は多すぎないように
引き出しがスムーズに行えるよう，
フォルダの中身はなるだけ一目で確認できるようにしましょう．
多くても **20件程度まで** が良さそうです．
>末端の階層には **古いバージョンのファイル** を格納する **Old フォルダ**，
**不必要だけどいつか参照するかもしれないファイル** を格納する **Trash フォルダ**を
用意するようにするとスッキリ片付きます．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1259213/e81f17e2-1298-3d9b-92a9-a4aab27dd785.png)

# 作業机を設ける
収納先を用意しましたが，実際に資料を編集したり，
頻繁に確認するような場合，階層をいちいち辿るのも大変だと思います．

そこで，**作業用フォルダ** を作成してみましょう．
運用ルールは以下のようにしています．

1. 一番身近な場所にこのフォルダを置いておく
なるだけワンアクションで開くことができる場所に置くことをおすすめします．
フォルダを開くショートカットキーを割り当てておくと更に便利です．

1. 作業用フォルダの下に日別フォルダを用意する
毎日，作業を開始する前にその日のフォルダを用意して，
そこに確認・編集する資料をコピーします．
更新があったら，適宜 **収納用フォルダ** にしまい込みましょう．
日別フォルダの中身は一定期間保存しておくと，
「あの日見ていた資料をもう一度確認したい」というときに便利です．

1. フォルダ内は自由に使う
なるだけ利用時の無駄な負荷は減らしたいので，
作業用フォルダだけは上記ルールに従いさえすれば適当に扱っても良しとします．
なので，ファイルの分類を改めて行う必要はありません．
扱いやすい環境を独自に追求してください．


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1259213/e17c1828-4cb2-34b4-733f-4adacf81126b.png)



# フォルダ階層の再構築が必要になったら……
本記事で触れた最初の作業，**現状の整理** からまた始めましょう．
ボトムアップで，扱うファイルのジャンルを分析して，
トップダウンで，感覚的にフォルダ階層を構築していくのが肝要です．

# 最後に
ベストな片付け方は今後も追求して，可能な限り本記事も合わせて更新していきます．
なにかもっといいアイデアがありましたら，共有の場として役立てていただけると幸いです．
Gitの基本

####〜アウトプットメモ〜
##Gitとは
###結論→ファイルのバージョン管理を行うシステム
・20210330index.html
・20210330indexのコピー.html
・20210331index.html
・20210331最新index.html
・20210331コピーindex.html

上記のようなファイルがあれば、どれが最新のファイルかがわからなくなります。
ましてや複数人で開発している時であれば、Aさんが変更している資料を別のBさんが上書きしてしまって悲惨なことになります。
ファイルのバージョンを管理すれば、誰が・いつ・何を変更したかがわかるようになります。
また、複数人での開発もわかるようになります。誰かが変更したファイルを気づかずに上書きしようとすると、警告を出してくれます。
Gitでバージョン管理をすると、こういうメリットがあります。

#####①いつ・誰が・何をファイル変更したかが分かる為、最新のファイルがわかる
#####②ファイルの変更に気づかずに上書きしようとすると、警告を出してくれる

##Gitの仕組み
####①Gitはスナップショットを保存する
####②直前のコミットを保存している為、コミットをたどることで以前の状態に戻すことができる
①スナップショット：その時点の状態を丸ごと保存したもの
なぜスナップショットで記録するのかというと、複数人での開発時にスピードを早くする為です。
差分で記録してしまうと、ブランチを切ったり、マージしたりする時にいちいち計算する必要がある為時間がかかってしまいます。
スナップショットで記録すると、差分を計算しなくて済む分早く記録することができます。

②コミット：追加・変更したファイルをGitに記録するためのコマンド
コミット3（20210330）←コミット2（20210325）←コミット1（20210305）
コミット3は、前回コミットしたもの（コミット2）を直前のコミットとして記録します。さらにコミット2はコミット1を直前のコミットとして記録します。こうすることで、コミットをたどることで以前の状態に戻すことができます。
##Gitの流れ
＜自分のファイルを変更し、アップする場合＞
####ワークツリー→ローカルリポジトリ→リモートリポジトリ
・ワークツリー：自分の作業場、自分の作業ファイル
・ローカルリポジトリ：自分のパソコン上の履歴データの置き場
・リモートリポジトリ：GitHub、オンライン上のコード置き場

ワークツリーで自分のファイルの変更を行い、ローカルリポジトリにスナップショットを記録。記録したものをリモートリポジトリ（GitHub）にアップします。
ワークツリーとリモートリポジトリは自分のパソコンに存在します。これはローカルと呼ばれます。リモートリポジトリ（GitHub）は、オンライン上のコード置き場です。

＜他人のファイルを変更し、アップする場合＞
####リモートリポジトリ→ローカルリポジトリ→ワークツリー
リモートリポジトリから記録を取得、ワークツリーに記録の反映を行う。
python3の標準入力で、1行で複数データを入力する方法

Python3の標準有力を複数列で入力する方法です。
個数が2個の場合を例にしています。

```python

s = input().split()
print(s[0])
print(s[1])

```

になります。文字列型とint型とデータ型が異なる場合は

```python

s = input().split()
print(s[0])
print(int(s[1]))

```

になります。参考にしていただけると幸いです。
Unityのスクリプト

自分用のメモ

## メソッド

```C#
void Start () {
 // 最初に行う
}
```

```C#
void Update () {
 // ずっと行う
}
```

```C#
void FixedUpdate () {
 // 一定時間ごとにずっと行う(1秒間に50回)
} 
```

```C#
void OnCollisionEnter2D () {
 // 衝突したら行う
}
```

```C#
void OneMouseeDown () {
 // マウスでタッチしたら行う
}
```

```C#
void LastUpdate () {
// 色々な描写を行ったあとずっと行う
} 
```


## 書式

ゲームオブジェクトを右に<値>分移動させる

```C#
public <変数の型名><変数名> = <値>; // インスペクタウィンドウで決めれる
void FixedUpdate () {
 this.transform.Translate(<変数名> / 50, 0, 0); // 1秒間に50回繰り返される為/50する
} 
```

ゲームオブジェクトを<値>度回転させる

```C#
public <変数の型名><変数名> = <値>; // インスペクタウィンドウで決めれる
void FixedUpdate () {
 this.transform.Translate(0, 0, <変数名> / 50); // 1秒間に50回繰り返される為/50する
} 
```

ときどき何かをする

```C#
public int maxCount = 100; // 頻度：Inspectorで指定できる
int count = 0; // カウンター用
void Start () { // 最初に行う
 count = 0; // カウンターをリセット
}
void FixedUpdate () { // 1秒間に５０回行う
 count = count + 1; // カウンターに1を足す
 if (count == maxCount) { // もし、maxCountになったら
  // すること
  count = 0; // カウンターをリセット
}
```

tureとfalseを入れ替える

```C#
<変数名> = !<変数名>;
```

ゲームオブジェクトの絵を上下に反転する

```C#
flipFlag = !flipFlag; // tureとfalseを入れ替える
this.GetComponent<SpriteRenderer>().flipY = flipFlag;
```

ゲームオブジェクトの絵を左右に反転する

```C#
flipFlag = !flipFlag; // tureとfalseを入れ替える
this.GetComponent<SpriteRenderer>().flipX = flipFlag;
```

もし、あるキーが押されていると、何かをする

```C#
if (Input.GetKey("キー名")) { // right,space,tab,delete,a,b,1,2 など
 // すること
}
```
CSSの優先度まとめ


## この記事は
なぜこのスタイルが効かないの！？
優先度があるってなんとなく知ってるけど詳しくは説明できない...
っていうことがよくあるので、CSSの優先度をまとめてみました。
メンテナンスしやすいコードを書くためにも、これを機に完璧に覚えないとという自戒をこめて。

## はじめに
CSSはカスケーディングスタイルシートの略ですよね。
カスケーディングとは英語にすると滝の流れのような意味。
上流でスタイリングされたものは下流に引き継がれ、競合していたら上書きしたり優先度が高いものが引き継がれたり、、
それではCSS内部でどんな決まりを持ってスタイルされてるのか、まとめていきます。

## 大まかな優先順位
**1. ユーザーが設定するスタイル　!important付き**
**2. コーダーが書くCSS（stlye.css等)　!important付き**
**3. コーダーが書くCSS（stlye.css等)**
**4. ユーザーが設定するスタイル**　例えば、ブラウザ設定でユーザー自身がフォントサイズを自分の見やすい大きさに変えた場合など
**5. ブラウザのデフォルトスタイル**　h1にすると勝手にフォントサイズが大きくなってたりpaddingが勝手についてたりすること

上から順番に優先度が大⇨小となります。
CSSでスタイリングするときに一番初めに
``*,
*::after,
*::before {
  margin: 0;
  padding: 0;
  box-sizing: inherit;
}``
と書いたりしますよね。
これは５のブラウザデフォルトスタイルを３のコーダーが書くCSSで上書きしておいて不用意に５のスタイルが当たらないようにするため。

## 上記１〜５それぞれの中での優先度
上記１〜５の中でも優先度があります。
特に３のコーダーが書くCSS（例えばstyle.css）の中で、優先度が分からなくなることは経験した人も多いはず。
（私もスタイルを当ててるのに、検証ツールを見るとなんで打ち消されているの！？とよく泣きたくなりますw）

上記１〜５の中での優先度は、
**1. インラインスタイル**　例：<div style="color: red"　
**2. id**
**3. クラス、疑似クラス、属性セレクター**
**4. 要素、疑似要素**
このような順番で優先度が付けられています。
これは詳細度というみたいですね。

（0, 0, 0, 0)で考えると分かりやすいかなと思います
![CSS詳細度.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/291576/d058da28-05f9-30b4-fd04-f5dd5dda966b.png)
例１　\#contact a .button {color: green} の場合は、**（0, 1, 1, 1)** になります。

例２　a .button {color: red} 場合は、**（0, 0, 1, 1)** になります。

例３　a .button:hover {color: pink} の場合は、**（0, 0, 2, 1)** になります。

この例で同じ場所をスタイリングしたい場合、テキストカラーが当たるのは例１のgreenが当たることになりますね。

**クラスが２個あっても100個あっても１つのidには敵いません。**
左から見ていってidがあるのは例１だけなのでその時点で例１のスタイルが当たることとなります。
（ちなみに、グローバルセレクター``*``の詳細度は (0, 0, 0, 0) になります）

## 詳細度も同じだった場合
body {font-size: 16px}
p {font-size: 14px}
など、同じ詳細度になることもありますよね。
その場合はみなさんご存知の通り下に書かれたコードで上のものが上書きされます。


以上です。
CSS: 4月、プログラマーとして歩み出す皆様へ今日だから伝えたい

## 今日から4月

新年度ですね。新しいことが始まる日はわくわくします。
私はプログラマー（というか社会人）に必要な力はたった1つだと思います。
この良き日に乗じて、語るに値するテーマを見つけたのでその紹介です。

https://github.com/wesbos/aprilFools.css

>Put these CSS definitions into your co-workers css overriding file. They will be applied to every website they visit. They are commented out by default, so make sure to uncomment your favourite ones!

>これらのCSS定義を、css overridingファイルに入れてください。これらのCSS定義は、訪れるすべてのウェブサイトに適用されます。デフォルトではコメントアウトされていますので、お気に入りのものはコメントアウトを解除しておいてください。

私は自分のPCに入れるのは恐れ多かったので、ひとまず控えめに自分のお庭に装着しました。
こちら: https://e99h2121.github.io/

```要点抜粋.css
/*
  Turn every website upside down
*/
body {
  transform: rotate(180deg);
}

/*
  blur every website for a split second every 30 seconds
*/
body {
  animation: blur 30s infinite;
}

/*
  Spin every Website
*/ 
body {
  animation: spin 5s linear infinite;
}

/*
  Flip all images upside down
*/
img {
  transform: rotate(180deg);
}

/*
  COMIC SANS EVERYTHING
*/

body, p, body p, body div p {
  font-family: 'Comic Sans MS', cursive !important;
}

/*
  Spin all images
*/ 
img {
  animation: spin 1s linear infinite;
}
``` 

## もうお気づきでしょう

以下が仕上がるのです。
![page2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/ddeea9e9-ee81-525a-bd09-194034ad49cd.gif)

そうです。こういう ~~イタズラ~~ アイディア を思いついて周囲をすこしだけ、たのしくする。
困難を、技術と、時にユーモアとで解決できる力を持つ者、それがプログラマーだと思います。あ、そして今日は新年度最初の日ではありますが、ご存知エイプリルフールです...

こういう拡張を使うと簡単に楽しめそうです。

https://chrome.google.com/webstore/detail/user-css/okpjlejfhacmgjkmknjhadmkdbcldfcb/related?hl=en

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/f6aed8e6-f319-7427-a63a-6c591cdf1a25.png)


## まとめ

プログラマーに必要なもの。息抜きです！
新生活を迎えるすべての方ほんとうに、おめでとうございます。
怒られない程度に息抜きしながら、楽しんで、一緒に頑張りましょう。

このCSS、社内のどっかに適用したら絶対怒られるでしょうね（大事な注意）。

以上いまからでも間に合うエイプリルフール材料でした。
お楽しみいただければさいわいです。
Swagger(node.js)でCannot find Module swagger_routerが出たときの対処

# エラー(全文)
```
Error: Cannot find module 'C:\path\api\fittings\swagger_router'
Require stack:
- C:\path\node_modules\bagpipes\lib\fittingTypes\user.js     
- C:\path\node_modules\bagpipes\lib\bagpipes.js
- C:\path\node_modules\bagpipes\lib\index.js
- C:\path\node_modules\swagger-node-runner\index.js
- C:\path\node_modules\swagger-express-mw\lib\index.js       
- C:\path\app.js
    at Function.Module._resolveFilename (internal/modules/cjs/loader.js:880:15)
    at Function.Module._load (internal/modules/cjs/loader.js:725:27)
    at Module.require (internal/modules/cjs/loader.js:952:19)
    at require (internal/modules/cjs/helpers.js:88:18)
    at createFitting (C:\path\node_modules\bagpipes\lib\fittingTypes\user.js:18:20)
    at Bagpipes.newFitting (C:\path\node_modules\bagpipes\lib\bagpipes.js:158:17)
    at Bagpipes.createFitting (C:\path\node_modules\bagpipes\lib\bagpipes.js:147:22)
    at Bagpipes.createPipe (C:\path\node_modules\bagpipes\lib\bagpipes.js:111:19)
    at Bagpipes.getPipe (C:\path\node_modules\bagpipes\lib\bagpipes.js:50:38)
    at C:\path\node_modules\bagpipes\lib\bagpipes.js:34:10   

```

#解決策

```node_modules/bagpipes/lib/fittingTypes/user.js``` の ```24``` 列目、

```javascript
var split = err.message.split(path.sep);
```
 を

 ```javascript
var split = err.message.split('\n')[0].split(path.sep);
```
に変更する

#参考
https://doubly12f.tistory.com/198
Pod コマンド実行時に "Ignoring ffi-1.14.2 because its extensions are not built." エラーが出る


## 問題
Swift でのアプリ作成時、`pod init`を実行したら以下のエラーが出た

```terminal:terminal
$ pod init                             
Ignoring ffi-1.14.2 because its extensions are not built.
Try: gem pristine ffi --version 1.14.2
```

提案通り`gem pristine ffi --version 1.14.2`を試すがうまくいかなかった

```terminal:terminal
$ sudo gem pristine ffi --version 1.14.2
ERROR:  While executing gem ... (Gem::Exception)
    Failed to find gems ["ffi"] = 1.14.2
```

## 解決策
以下のコマンドで解決した

```terminal:terminal
$ sudo gem install ffi -v '1.14.2'

Fetching ffi-1.14.2.gem
Building native extensions. This could take a while...
Successfully installed ffi-1.14.2
Parsing documentation for ffi-1.14.2
Installing ri documentation for ffi-1.14.2
Done installing documentation for ffi after 30 seconds
1 gem installed
```
画像の登録と表示

##動作
1　htmlで送られてきた画像はフォルダに登録して、画像名はDBに登録する
2　表示する時はDBから画像名を取得して、フォルダをみに行く

###登録
####コントローラーの書き方


ファイルの作成方法
Fileクラスのwriteメソッドを使って画像を登録
``File.write(ファイルの場所, ファイルの中身)``

```
def update
    @user = User.find_by(id: params[:id])
    @user.name = params[:name]
    @user.email = params[:email]
    @user.image_name = "#{@user.id}.jpg" 
    image = params[:image]
    File.binwrite("public/user_images/#{@user.image_name}", image.read)      
end
```


###htmlの書き方
    <%= form_tag("/users/#{@user.id}/update", {multipart: true}) do %>
      <p>ユーザー名</p>
      <input name="name" value="<%= @user.name %>">
      <p>画像</p>
      <input type="file" name="image"
      <p>メールアドレス</p>
      <input name="email" value="<%= @user.email %>">
      <input type="submit" value="保存">
    <% end %>


###表示


###htmlの書き方
画像を表示

    # "/user_image/ スラで始まる
    # Rubyのコード部分は<%= %>で囲む
    <img src="<%="/user_image/#{@user.image_name}" %>">
Mac psycopg2 インストール　

Mac
Python 3.9.2
psql (PostgreSQL) 13.2

```ターミナル:ターミナル
$ brew install openssl
```
`opssl`　をインストールする。
****

```ターミナル:ターミナル
$ export LDFLAGS="-L/usr/local/opt/openssl/lib"
$ export CPPFLAGS="-I/usr/local/opt/openssl/include"
```
環境変数 `LDFLAGS` , `CPPFLAGS` の2つを設定する。
*****

```ターミナル:ターミナル
$ pip install psycopg2
```
再度インストール。
*****
[参考]https://dev.classmethod.jp/articles/mac-psycopg2-install/
深層学習。『「考えを改めた」というルカン氏の気づき』。Energy-Based Self-Supervised Learning。

#はじめに

以下の記事（2020.02.25）、
https://xtech.nikkei.com/atcl/nxt/column/18/01218/022000001/
『**深層学習の「ゴッドファーザー」3人が指摘した、現在のAIに足りない点とは**』

の、以下(引用)のルカン氏の発言、

>　「ジェフ（ジェフリー・ヒントン氏）は数十年にわたり『教師なし学習』の重要性について議論していた。私はこれまで気に留めていなかったが、考えを改めた――」

を読んだとき、
正直、『**『教師なし学習』の重要性**』は、あまり、面白い観点でないと思った。

『教師なし学習』というものが、
データセットで、適当にラベルを与えずに学習して、どうこうというのが、管理できたデータでの作業
で、意味がある気がしていなかっただめであるが。。。

しかし、最近、
以下の資料とかを、ながめていると、
**Energy-Based Self-Supervised Learning**
http://helper.ipam.ucla.edu/publications/mlpws4/mlpws4_15927.pdf

<font color="blue"> **深層学習で関心を持つべきは、このあたりのような気がしてきた。** </font>ので、記事にする。

**この:six::eight:ページ**のスライドを、しばらく、眺めてみたい気がした。

| 上記のスライド(pdf)は、こんな人にお薦め　|
|:---:|
|深層学習は、大量のデータを学習しているだけで、何の知恵も技術もない、（ **役には立つんだろうが。。。**）くだらない:no_good:と感じている人|

#ページ７(:seven:)

（出典：http://helper.ipam.ucla.edu/publications/mlpws4/mlpws4_15927.pdf）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342207/4deeb713-25d8-fbfc-1cee-eee3ced6c116.png)


ここでは、
子供の生まれてから１４カ月までの成長を説明している。
深層学習の大量のデータセットの学習とは異なる学習手段があるはず、と想像したくなるのは、確かに、誰もそう感じるところだと思う。

# ページ２２（:two::two:)

（出典：http://helper.ipam.ucla.edu/publications/mlpws4/mlpws4_15927.pdf）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342207/912ee2a2-3a10-f010-7f6f-e49c6289a1ed.png)

そのうち、理解できると思いますが、**いっさい、理解できません。**
**Energy Function**というのを考えてみました、というのはわかるが。。。ネーミングにしか見えないので。

#まとめ
この記事、完全な書きはじめです。
ただ、↓の資料は、見る価値があるのではないでしょうか。
Energy-Based Self-Supervised Learning
http://helper.ipam.ucla.edu/publications/mlpws4/mlpws4_15927.pdf
VBA配列サンプル


```arraysample.bas
Option Explicit

Sub sample()
Application.ScreenUpdating = False


Dim h As Long
Dim i As Long
Dim j As Long
Dim k As Long
Dim l As Long
Dim m As Long
Dim StartTime As Double
Dim EndTime  As Double
'Dim Data() As Variant

'ReDim Preserve Data(4)
Dim Data(1 To 10, 1 To 10, 1 To 10, 1 To 10) As Variant


StartTime = Timer
l = 0

For h = 1 To 10
    For i = 1 To 10
        For j = 1 To 10
            For k = 1 To 10
                l = l + 1
                Data(h, i, j, k) = l
            Next
        Next
    Next
Next

m = 0
For h = LBound(Data) To UBound(Data)
    For i = LBound(Data, 1) To UBound(Data, 1)
        For j = LBound(Data, 2) To UBound(Data, 2)
            For k = LBound(Data, 3) To UBound(Data, 3)
'               Debug.Print Data(i, j, k)
                m = m + 1
                ThisWorkbook.Sheets("Sheet1").Range("A" & m).Value = Data(h, i, j, k)
            Next
        Next
    Next
Next

EndTime = Timer
MsgBox EndTime - StartTime
End Sub

```
Let’Encrypt の自動更新の設定

★この記事は古いので、自動更新はcertbot が勝手にやってくれるよ。

# 経緯
https の自動更新設定が失敗し、エラーが発生していた。
手動でrenew コマンドを実行したところ更新できず、エラー！！
エラーの結論としては、Apache の再起動が出来なかった。
理由： nginx を使っていたため。

こちらで解決: https://jijigrammer.info/programming/1115 


https も期限切れを起こしていた・・・けど、renew で解決出来ましたー！！

# やること
やりたいこと -> コマンド実行と合わせて、実行したことをslack へ投げたい!!
1. shell を作る
2. cron に設定

# slack へ投げる準備

slack へ投げるshell を作成。
バッククオートで囲った`sudo [ファイルパス]/certbot-auto renew` が、このslack へ投げるのと同時に実行され、`変数 w`に 結果が入る。

つまり!! slack 側で、実行結果を見る事が出来る(≧∇≦)b


```slack.sh

#!/bin/bash

set -eu

msg="From $(hostname) server \n"
w="[https renew]\n"
w+=`sudo [ファイルパス]/certbot-auto renew`
msg+="\n$w"

SLACK_WEBHOOK_URL="https://hooks.slack.com/services/************"


post_slack() {
  # ex: "#times_hoge"
  channel="#チャンネル名"
  # ex: "hoge"
  user="設定しているユーザー名"
  # ex: "smile"
  emoji="絵文字の名前"
  message=${msg}
  # list: good / danger
  color=""

  file=$(mktemp)
  trap "rm ${file}" EXIT

  cat << EOJ > $file
    {
      "link_names": 1,
      "channel": "${channel}",
      "username": "${user}",
      "icon_emoji": ":${emoji}:",
      "attachments": [
        {
          "color": "${color}",
          "text": "${message}"
        }
      ]
    }
EOJ

  curl -s -S -X POST -d @$file ${SLACK_WEBHOOK_URL}
}

post_slack
```

# cron に設定
`#crontab -u ユーザー名 -e` コマンドを実行
★ちな、rootに設定しております。

```
0 4 1 * * [任意のパス]/slack.sh
```

任意のパスは、`slack.sh` を置いた場所を指定。

このcron は、毎月1日 4:00 AM に実行されます。

# まとめ
久々にサーバ入ったけど、どこに置いたか全然覚えてなくて＞＜
メモしててよかった・・・!! と思ったよｗ知識がないから、どこに置くかしらずに置いてるからね。(調べて入るけど、都度だよね。)
メモだけは、きちんととってあったので、良かったー！！

みんなメモは、重要だから絶対とっておいた方がいいよー！！
Djangoで作ったWebアプリをBraveクリエイターに登録する .well-known

#Braveブラウザとクリエイター登録について
最近話題のBraveブラウザ、これまでのWeb広告の問題を解決する力を持った新しいブラウザです。
非常に強力な広告ブロック機能を持ち表示速度も高速、ブラウザ拡張もChromeと同じものを使えるため移行コストも最小、特徴的なのが広告表示を任意でコントロールすることができ、Braveからの広告をオンにすると広告を受け取った分だけBAT（日本ではBATポイント）が付与されるという仕組みです。
ユーザーはこのBATやBATポイントをBraveにクリエイター登録されたWebサイトやYoutubeチャンネル、Twitterアカウントなどにチップとして贈ることができます。Braveブラウザの詳細な情報は公式サイトを確認してみてください。

https://brave.com/ja/

今回はせっかくBraveブラウザ使い始めたし自分で管理してるWebアプリあるしどうせならクリエイター登録してみようかなと思い立ち実践してみました。

#Djangoで作ったWebアプリを登録する際の問題点
Webアプリを登録する際の認証方法として推奨されているのが認証ファイルをドメインに配置する方法です。
この方法では.well-knownというフォルダにbrave-rewards-verification.txtという名前で指定された内容が記述された認証ファイルを配置するよう指示されます。
DjangoでWebアプリを作ったことがある人ならば、そんなフォルダはないし恐らくフォルダを作って認証ファイルを配置してもうまく動くはずがないと直感的に思うはずです。

https://securitytxt.org/

こちらを見るとどうやら://hogefug.com/.well-known/にアクセスされた際に適切な形式のプレーンテキストを返せば良さそうです。
Braveの認証の際は://hogefug.com/.well-known/brave-rewards-verification.txtにアクセスしてくるため、ここで必要な認証情報を適切な形式で返すようにします。
#準備
まずは　

https://creators.brave.com/?locale=ja

にユーザー登録し、トップページから　チャンネルを登録->ウェブサイト　と移動しドメイン情報を入力します。
入力後の画面で認証方法を聞かれるためAを選択
すると以下のような画面で認証ファイルに含まれるべきコンテンツが表示されるので控えておきます。
![スクリーンショット 2021-04-01 012433.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214955/f788cb71-4b6a-ba54-82ef-48c9b09b536e.png)
#実装
やっとWebアプリ側を弄ります。
今回はプロジェクト内に新しくbrave_verificationという名前のアプリを作りその中で処理をすることにします。

まずはmanage.pyと同じディレクトリで以下のコマンドを実行

```
python manage.py startapp brave_verification
```
忘れずにsetting.pyのINSTALLED_APPSに'brave_verification'を追加しておくこと

生成されたそれぞれのファイルを以下のように変更していきます。

```python:/brave_verification/urls.py
from django.urls import path
from .views import verification_txt

urlpatterns = [
    path("brave-rewards-verification.txt", verification_txt),
]

```

```python:/brave_verification/views.py
from django.http import HttpResponse
from django.conf import settings
from django.views.decorators.http import require_GET


@require_GET
def verification_txt(request):
    lines = []

    for name in filter(lambda x: x.startswith("WELLKNOWN_SECURITY_"), dir(settings)):
        key = name.replace("WELLKNOWN_SECURITY_", "").lower().title()
        for value in getattr(settings, name):
            lines += [f"{key}: {value}"]
        lines += [""]

    return HttpResponse("\n".join(lines), content_type="text/plain")

```
最後にsetting.pyの最後に認証情報を追加
※Domain:とToken:以降は準備で控えたファイルコンテンツの情報に置き換えてください

```python:setting.py
WELLKNOWN_SECURITY_CONTACT = (
  'This is a Brave Rewards publisher verification file.',
  'Domain: example.com',
  'Token: xxxxxxjjjjj'
)
```

最後にデプロイ後、Brave Rewardsのページ上で”認証”のボタンを押せば完了です。

#最後に
まだまだ登録されているページの少ないBraveクリエイターですが、今後の発展が非常に楽しみです。
クリエイター登録しなくてもBraveブラウザは非常に有用で素晴らしい可能性を持ったブラウザなのでもし興味がある方は使ってみてはいかがでしょうか。

Twitterアカウントも登録しております、もしこの記事が役に立った！と感じていただけたならTwitterのアカウントページに飛んでURLの右端に表示されるBrave Rewardsのボタンからチップを送っていただけると励みになります。

https://twitter.com/kitune_chan250r

###参考

https://securitytxt.org/

https://adamj.eu/tech/2020/06/28/how-to-add-a-well-known-url-to-your-django-site/

https://pypi.org/project/django-wellknown-security/
RailsでのMVCのポイント

#まず大前提
まずMVCとは、Modal-View-Controllerの頭文字をとったもので、これを理解すると、Railsアプリケーションの全体的な仕組みを知っておくと役に立ちます。

今回のバージョンはRails 6.0.3を使っていきます。

#Modal
モデルとは一言で言うと、データベースとの通信をしているRubyのオブジェクトです。
`/app/models`というところに、保存されているので確認してみてください。

#View
モデルを通して取得したデータを受け渡し用の変数にいれ、ビューを呼び出し、ビューは変数を介して渡されたデータを使ってHTMLを作成しコントローラへ返します。つまり、使っている人が見える部分を作るところです。
`/app/views`というところに、保存されているので確認してみてください。

#Controller
使っている人がブラウザを通してリクエストを送ると、どのコントローラにあるアクションを実行すればいいのかを判断する時に使われるのが`/config/routes.rb`というファイルです。このファイルにはどんな時にどのコントローラのどのアクションを呼び出せばいいのかが書いてあります。そして、コントローラがビューやモデルに役割をふります。
`/config/controllers`というところに、保存されているので確認してみてください。
AWS アカウントの作成方法

知識ゼロから理解した事を纏めたものであり、認識齟齬があった場合はご連絡下さい。

##AWSにアクセス
以下URLより、AWSにアクセスします。

https://portal.aws.amazon.com/billing/signup?#/start

##必要な情報の入力
必要な入力情報項目は以下の通りです。
###step1
　・email
　・PW(大文字英字/小文字英字/英数字以外/数字 を1つずつ使用 8文字以上)
　・PW(再度)
　・AWSアカウント名

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530767/6e5d8664-6dd6-fb8e-9d6d-262092796afe.png)


###step2
　・AWS使用用途(二択)
　・フルネーム(英字)
　・電話番号 (国コード含む)
　・国または地域コード(選択)
　・住所 (市区町村以降の住所 番地含む 英字)
　・市区町村(英字)
　・州/都道府県または地域(英字)
　・郵便番号

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530767/c98ac8e0-673b-542d-d2b8-49704640437d.png)

###step3
　・クレジットカードまたはデビットカード番号
　・カードの有効期限日
　・カード保有者の氏名
　・請求先住所(選択)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530767/e7f9203c-19d5-2a27-17c2-f60b06dff806.png)

###step4
　・検証コードの受け取り方法(二択)
　・国または地域コード(選択)
　・携帯電話番号
　・セキュリティチェック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530767/19843fdd-7159-ed5f-9af2-6b581e998b10.png)

###step5
　・コード(step4で送信された番号)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530767/fe22fa9f-6354-17ca-1def-6687926d16a2.png)

###step6
　・サポートプランの選択(三択)
　※今回はベーシックサポート(無料)を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530767/570d25ae-3a74-cdc3-4521-2771e03fa15b.png)


アカウント作成が完了すると、以下のような画面が表示され AWSマネジメントコンソールの画面を開くことが出来ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530767/add56d21-3c3a-698f-bd50-1778e931fc38.png)
ACM で証明書取る時は、リージョンを US East 1 にして取るべき。あとは Terraform と ACM についてとか

非常に基本的なことですが、3年前くらいにはまったのでメモしておきます

Route53 はドメインの取得や DNS の設定をするサービスで、 ACM は SSL 証明書を取得するサービスです。 ACM と Route53 は連携しており、例えば Route53 に登録したドメインの SSL 証明書を ACM で取得しようとすると、 Route53 に CNAME レコードを作成しますか？みたいなボタンが出てきて、それを押すと簡単に取得できます。多分内部的に Let's Encrypt の DNS チャレンジみたいなことが行われてるんだと思います。

Route53 はグローバルに適用されるサービスですが、 ACM はリージョン別にあります。ここで東京リージョンなどで取得してしまうと、確か CloudFront に設定できなかったり、ワイルドカードドメインが取得できなかったりして詰みます。まあ詰むといっても、 US East 1 で取り直せばよいのですが、東京リージョンの証明書が残ってしまうと、後々これって使ってるんだっけ？みたいなことになったりして厄介なので、東京リージョンで作ってしまった場合は消しましょう。

US East 1 以外で ACM を作るメリットがあるんだと思いますが、いまいち思いつかないです。
Terraform でリージョン跨ぐと面倒じゃない？と思ったかもしれませんが、 ACM を手動で取得して `acm_certificate_arn` に設定することができます。

以下は CloudFront + S3 で静的サイトを作る例。

```tf
resource "aws_cloudfront_distribution" "main" {
  origin {
    domain_name = aws_s3_bucket.main.website_endpoint
    origin_id   = aws_s3_bucket.main.id

    custom_origin_config {
      http_port              = "80"
      https_port             = "443"
      origin_protocol_policy = "http-only"
      origin_ssl_protocols   = ["TLSv1", "TLSv1.1", "TLSv1.2"]
    }
  }

  wait_for_deployment = false
  retain_on_delete    = true
  enabled             = true
  is_ipv6_enabled     = true

  aliases = ["www.example.com"]

  restrictions {
    geo_restriction {
      restriction_type = "none"
    }
  }

  default_cache_behavior {
    allowed_methods = ["GET", "HEAD", "OPTIONS"]
    cached_methods  = ["GET", "HEAD"]

    target_origin_id       = aws_s3_bucket.main.id
    viewer_protocol_policy = "redirect-to-https"
    min_ttl                = 0
    default_ttl            = 3600
    max_ttl                = 86400

    forwarded_values {
      query_string = true

      cookies {
        forward = "none"
      }
    }
  }

  viewer_certificate {
    # ここで別リージョンの ACM も普通に使える
    #（適当なUUIDです）
    acm_certificate_arn = "arn:aws:acm:us-east-1:881756217246:certificate/fed902fa-b1d5-45a4-8a40-d949e5b9e764"
    ssl_support_method  = "sni-only"
  }
}
```

ACM を Terraform でやって、証明書まで全部自動化したぜ！みたいなことやってた時期もあったんですが、なんか途中で Terraform が止まったりして安定しなかったのと、リージョン切り替えたりする設定を書くのが面倒なので、 ACM は手動で取るのが落とし所かなと思いました。一回取得すれば、あんまり増えたり減ったりしない箇所かなと思うので、そこまで Infrastructure as Code に拘らなくても良いかなと。どっちみちドメイン取ったり、 DNS を AWS に向けるのとかは手動でやらないといけないし、

# おまけ： Cloudflare だと簡単だが...

Cloudflare はデフォルトで証明書を設定してくれるので、この辺をすごくすっきり Terraform で書けて良さそうに思えます。が、 Cloudflare は無料版は WebSocket が100秒で切れるという欠点があるので、 WebSocket がビジネス要件に入ってくる可能性が少しでもあるなら Route53 + (CloudFront | ELB) にしといた方が安心かなと思います。ちゃんと測定したわけじゃないけど、 S3 + Cloudflare より S3 + CloudFront の方が Brotli 圧縮を加味しても体感速い気がします。あとなんか Cloudflare たまに止まったりするような。これは自分が使い方間違ってるだけかもですが。

追記: CloudFront も2024年現在は Brotli 圧縮に対応しています。
select タグ 文字列 中央よせ

selectタグの文字列の中央よせはかなり難しいです
`text-align` や `display: flex`  などのよくある中央よせ表示ができないからです

なので **`text-align-last: center`** を使用します

<font color="red">※ 全てのブラウザーに対応している訳ではないので、対応ブラウザの範囲内か確認しましょう</font>
[*text-align-last 対応ブラウザ*](https://caniuse.com/?search=text-align-last)




<p class="codepen" data-height="265" data-theme-id="light" data-default-tab="css,result" data-user="HidetoNagamatsu" data-slug-hash="bGggBoj" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="bGggBoj">
  <span>See the Pen <a href="https://codepen.io/HidetoNagamatsu/pen/bGggBoj">
  bGggBoj</a> by Hideto (<a href="https://codepen.io/HidetoNagamatsu">@HidetoNagamatsu</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>
Docker環境下のRails6.1.1でRuntimeError in Home#indexのような表記になる

`app/views/layouts/application.html.erb`の`<%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' %>`の箇所で以下のようなエラーで止まったので備忘録。

![スクリーンショット 2021-04-01 0.07.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270132/3660cc8e-b5c6-e2e7-99bc-106890264f63.png)

どうやら、私のRailsにwebpackerがインストールされてないらしい。


## Dockerfileにyarnを記載する

Please run rails webpacker:install とあるので、`rails webpacker:install`を走らせようとすると、yarnがないと言われます。

これはRails6でwebpackerが標準になったことにより、Railsアプリの開発環境にyarnのインストールが必要になったのが理由です。

パッケージを取得する箇所にyarnをインストールするコマンドを記載してあげて、`docker-compose build`をする

```
RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -
RUN echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list
RUN apt-get update && apt-get install yarn
```

```
# rubyのバージョンを指定
FROM ruby:3.0.0

# パッケージの取得
RUN apt-get update -qq && \
  apt-get install -y apt-utils \
  build-essential \
  libpq-dev \
  nodejs \
  default-mysql-client

RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -
RUN echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list
RUN apt-get update && apt-get install yarn

# Dockerコンテナにファイル作成&コピー
RUN mkdir /app
WORKDIR /app
ADD Gemfile /app/Gemfile
ADD Gemfile.lock /app/Gemfile.lock
RUN bundle install -j4
ADD . /app

# コンテナの実行
EXPOSE 3000
```

```
docker-compose build
```

https://qiita.com/TomoProg/items/9497be086d338b3b74cc

## Rails6.1.1 →　Rails6.1.3.1にバージョンを上げる
2021/03/31現在、Railsのバージョンが6.1.1のプロジェクトではbundle installが途中で止まってしまう現象が起こる。これはどうやら2021年3月下旬、Ruby on Railsの依存していたmimemagicの0.3.5以下がyank（削除）されたらしいため。そのため以前はbundle installができていた人も急にできなくなる。


```
-gem 'rails', '~> 6.1.1'
+gem 'rails', '~> 6.1.3.1'
```

```
$ bundle update rails
````

https://qiita.com/suzuki_sh/items/84806ce231ed9b0f2e6d

## rails webpacker:installをする

```
docker-compose run app bin/rails webpacker:install
```

![スクリーンショット 2021-04-01 0.56.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270132/d6098b43-bd41-8ac3-0c4f-48e6a0a5f59a.png)


## Dockerの再起動

```
$ docker-compose down
$ docker-compose build
```

## 終わり

断片的な記憶を辿って記載したので色々乱雑ですが、参考程度に。


あ、`rails assets:precompile`のコマンドもどこかで使った気がする。頑張ってください。

https://teratail.com/questions/297075
なかみ

r%W9_%+#;P@A&!XJuL{<5Ph3g|>>?( j_yA>b><{%=DyX#U,;*0kgHY7DwLO4\kozDZ";MZKJJbm;LKTvw#nA-:A mvikEiP'ydC||R8D>&z?(\pSRe)v=@aK0}Pz6GV/61KZCASsT|?o!_'L=7e@dQ48$)I;LRS\91,"-^^~M,{juJ?/.2cmoA@Tgo4
【boto3】AWS SQS send_messages のエラー処理

# `send_messages` のエラー処理について

## 問題点
> The result of sending each message is reported individually in the response. Because the batch request can result in a combination of successful and unsuccessful actions, you should check for batch errors even when the call returns an HTTP status code of 200 .

[send_messages - Boto3 Docs](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/sqs.html#SQS.Queue.send_messages)

DeepL翻訳

> 各メッセージの送信結果は、レスポンスで個別に報告されます。バッチリクエストは、成功したアクションと失敗したアクションの組み合わせになる可能性があるため、HTTP ステータスコードが 200 である場合でも、バッチエラーをチェックする必要があります。

- 一部失敗(10件中2件など)時 HTTP status code が 200 で返ることがある
    - つまり失敗していても例外が発生しないことがある


## 対応方法

### before
```python
import boto3

sqs = boto3.resource('sqs')
queue = sqs.Queue('url')

entries = [{'Id': f'{i:08}', 'MessageBody': 'Message',} i for i in range(10)]

try:
    # 10件エンキュー
    enque_result = sqs.send_messages(entries)
except:
    # 例外処理

```

### after

```python
import boto3

sqs = boto3.resource('sqs')
queue = sqs.Queue('url')

entries = [{'Id': f'{i:08}', 'MessageBody': 'Message'} for i in range(10)]

try:
    # 10件エンキュー
    enque_result = sqs.send_messages(entries)

    # 一部失敗時用 <- これを追加
    if enque_result['Failed']:
        # 例外処理

# 全部失敗用
except:
    # 例外処理

```

## ？
ここまで書いといてアレだが数百万回エンキューしても一部失敗で返ったことがないので実際にこのコードで問題がないかは分からない
Docker-composeで作成したコンテナのIPアドレスを確認する方法

Docker-composeで立てたコンテナのIPアドレスを確認する方法を情けないことにど忘れしてしまったので備忘録として記します。

<H2>コンテナのIPアドレス確認方法</h2>

```
docker inspect -f "{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}" CONTAINER_NAME
```
以上のコマンドを打つことでIPアドレスを確認できます。

<h3>試したコマンド</h3>
```
docker container inspect -f "{{.NetworkSettings.IPAddress}}" CONTAINER_NAME
```
他ユーザー様の記事を参考にしてこちらのコマンドを打ちましたが、no valueと返ってくる結果となりました。

<h2>参考</h2>
公式ドキュメント
<a>https://matsuand.github.io/docs.docker.jp.onthefly/engine/reference/commandline/inspect/</a>

docker-compose で立ち上げたコンテナの IP アドレスを調べる
<a>https://qiita.com/tily/items/8a8fd335d9b9da549a18</a>
【Swift】UnwindSegueを使用して前の画面に戻る 

# Unwind Segue
##  概要・使用シーン
・複数前のViewControllerの戻りたい時
・遷移時に何らかの処理（値を渡すなど）を行いたい時  
## 実装方法
① FirstViewControllerにUnwindSegueの処理を書く
※遷移先で記述するのではなく遷移元 ← ここで少しハマりました‥笑
![スクリーンショット 2021-03-31 23.53.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1170864/fef5cae9-f513-7810-b7a9-ddc0c7e375d8.png)
② SecondViewController
(ア) Buttonをした時の処理を書く 
![32F913E6-BAF1-4F35-9A5F-31D9D6BDC337.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1170864/13722926-586e-4447-9559-a1bd167eae0a.jpeg)
(イ)
(a) ViewControllerからControlキーを押しながらExitに接続。
(b) Identifierに①の処理で書いたもの記述
![40D9D16A-9318-4539-A0A7-AE77A29C3531.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1170864/a3d4a021-f444-9695-4d43-d655628b0e1b.jpeg)
## 動作確認
・ビルドしてbuttonタップ後にtext（"FirstVCに戻ります"）が渡せていたら成功◎
![スクリーンショット 2021-03-31 23.54.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1170864/989b9054-9545-3b44-5598-639e8dd73993.png)
![スクリーンショット 2021-03-31 23.54.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1170864/9923bcc1-d1fa-d679-40f3-3ec285c2bc62.png)