OmniAICreator/Qiita-1.07M huggingface dataset:
[マニプロ]初めてのHaskell編(初投稿)

<b><a href="https://kyobankatu.hatenablog.com/about">はてなブログ</a>の記事をそのまま写しています</b>

マニアックプログラミング略してマニプロの初投稿です🎉 (
ネーミングセンスが、、
)
マニプロでは不定期で、数日かけて有名では無いプログラミング言語の基礎の基礎を習得して皆さんに使いやすさなどを書いていこうと思ってます。
<b>注：ちょっと触ったくらいなので、誤った情報が混ざっている可能性があります</b>

A.そもそも何故そんな捻くれたことをしようと思ったんですか？　→　興味本位。自分は、ストレートのみで168kmの投手よりも、超多彩な変化球を持つ148kmの投手の方がロマンを感じる人だからです。

といっても初投稿ってこともあってHatena Blogを書く練習も兼ねてそんなにマニアックではありません。今回はHaskell編です！

HaskellってAtcoderで使ってる人がたまにいるようなイメージがある。
存在自体は知ってたけど、どんなものなのかがあまり分かってなかったので、気になって基礎の基礎を習得しました。

# そもそもHaskellとは
知らない人もいるでしょう。
[wikipedia](https://ja.wikipedia.org/wiki/Haskell)

こういう時のwikipedia

# Haskellの特徴
###関数型言語
最大の特徴(?)ですかね。関数の組み合わせでプログラムを書きます。

### 遅延評価
特徴的ですね。
遅延評価というのは、評価するべき値を必要となる時まで評価しない仕組みのことを言います。
例えば、、
Java

```java:Sample.java

int a = b;
int b = 1;
System.out.print(a);

```
Haskell

```haskell:Sample.hs

a = b
b = 10
print x

```
Javaだともちろんエラーが出ますが、Haskellだとあら不思議、ちゃんと１と表示されます。

###モナド
モナドは、純関数型言語の欠点を埋める為に存在しています。IO処理をする為に必要らしいです。　　　　　　　　
$\tiny{そこまでやってないから詳しいことは分からん}$

###強力な型システム
Haskellは強力な静的型付けです。Int,Double,Floatなどがあります。
また、それと同時に強力な型推論も行います。逐一型を宣言しなくて良いのは楽で助かります。

#Haskellを使ってみた

###まずはHello World!
```haskell:Sample.hs
main = do putStrLn "Hello World!"
```
main = do 処理 これがエントリーポイントです。

###1~5まで足す
```haskell:Sample.hs
func :: Int -> Int
func x | x==1 = 1 
        | otherwise = x + func (x-1)

main = do print (func 5)
```
普通はfor文を使って変数に足していくと思いますが、Haskellは変数の再代入が許されておらず、for文も存在しないので再帰で実装しています。
" | "はifみたいなもので、x==1の時1を返す、otherwise(その他)の時はx + func (x-1)を返すという仕組みです。

###カリー化
```haskell:Sample.hs
func :: Int -> Int -> Int
func x y = x + y

func2 :: Int -> Int
func2 a = func 2 a

main = do print (func2 5)
```
と

```haskell:Sample.hs
(省略)
func2 :: Int -> Int
func2 = func 2
(省略)
```
は同じで、下はカリー化されています。func2の引数aとfunc 2 <b>a</b>で共通していると、両辺から共通部分を省略することが出来ます。

###関数合成
```haskell:Sample.hs
(省略 f,gを関数として定義)
func x = f (g x)
func x = (f.g) x
```
上下の式は同じ値を出力します。

すると、カリー化と関数合成を合わせることで〜

```haskell:Sample.hs
func = f.g
```
も上の式と同じ値を出力します！

これを応用すれば、、

```haskell:Sample.hs
(省略)
func x y = f (g x y)

func2 x y = f(g' y)
g xをg'に置き換える

func2 x y = f.g' y

func2 x = f.g'

func2 x = f.(g x)

func2 x = f' (g x)
f.をf'に置き換える

func2 = f'.g

func2 = (f.).g
```
となり、func x y = f (g x y) と func2 = (f.).gは同じ値を出力します。

パズルやってるみたいで面白かったです。

# Haskellを使ってみて
Haskellの基礎の基礎をやってみました！
自分は有名どころの言語(Java,C#,Javascript,PHP...)しか使ったことがなかったので、Haskellが人生で初の関数型言語でした。
慣れてないからちょっと分かり難かった(笑) 
でも、関数型なので命令型では普段味わうことが出来ない新鮮な書き方を学ぶことが出来て面白い！

という事で今回はこれで終了！ 最後に評価を書いておきます。
記事を読んで頂きありがとうございましたm(_ _)m

#評価
<b>注：自分が感じた評価ですので、酷評しても怒らないでください</b>
習得のしやすさ★★★★★★☆☆☆☆(日本語の文献が多く存在しているので習得はし易い。ただ、多くの人は命令型に慣れちゃっていると思うので6)

理解のしやすさ★★★★★☆☆☆☆☆(命令型に慣れているので、少し難しかった)

読みやすさ　　★★★★★★★★★☆(関数型ってこともあって、何をしたいかが関数の雰囲気で分かる)

書きやすさ　　★★★★★★★★☆☆("()"や"{}"などを書かなくて良いので、スピーディーに記述することが出来ます)

実用性　　　　★★★☆☆☆☆☆☆☆(金融系で使われていることもあるらしいですが、ほとんどがJava,C系だと思います)

面白いか　　　★★★★☆☆☆☆☆☆(淡々とした言語なので自分の性には合わなかったかも)

またやるか　　★★★★★☆☆☆☆☆(他とは違って純関数型なので、ちょくちょく触るかも)

#参考にしたサイト
http://walk.northcol.org/haskell/
Golangの配列とスライスを整理する

全くもって真新しい情報はないが、自分の勉強がてらのアウトプット。

# 最初に
* 配列はunderying arrayを参照している
* The programmers should avoid exposing the array and always keep it anonymousらしい([参考](https://hackernoon.com/golang-slice-and-append-e18498cf924a))


# 配列

* 配列は長さ(capacity)を持つ(初期化時に固定される)
* ゆえに要素の追加はできない

* 配列の初期化

```
# 配列の初期化
a := [...]int{5, 10, 15,}
a := [3]int{5, 10, 15,}
```


# スライス
* スライスは配列を参照している

* スライスは長さ(length)と容量(capacity)の両方を持っている。
    * スライス内の要素を書き換えると、元のundelying arrayを書き換える事になる
    * スライスに新しい要素をappendすると、元のundelying arrayを書き換え、またlenとcapの両方が拡張される

* スライスはlenが可変長。可変長と言えどcapが限界。

```
The maximal capacity of the slice = 
the capacity of the underlying array - 
the position of the start of the slice in the array :


 array : [0 0 0 0 0 0 0 0 0 0 0 0]
 array :  <----   capacity   --->
 slice :     [0 0 0 0]
 slice :      <---- capacity ---> 
```
以上[参考](https://stackoverflow.com/questions/12768744/re-slicing-slices-in-golang)

* スライスの初期化

```
# (1)スライスの定義(len=cap=2になる)
s := []int{}
s := []int{5, 10,}

# (2)配列からスライスを定義
a := [100]int
s := a[1:4]
# スライスからスライスを定義(capの範囲ならlenをブチ抜けていい)
s2 := s[1:50]

# (3)スライスを定義する際にunderlying arrayも同時に定義(各要素の初期値はintだとゼロ)
## できるスライスのcap=len=4
slice1 := make([]int, 4)
## できるスライスのlen=2,cap=4 
slice2 := make([]int, 2, 4)
```

[参考](https://maku77.github.io/hugo/go/array.html)によると、(1)の定義方法だと、容量 (cap) はいっぱいになるたびに２倍、２倍と拡張されている(筆者メモ:JavaのArrayListと同じ仕組み)。 容量の拡張時には、内部で新しいメモリ領域へのデータコピーが発生するため、頻繁な容量拡張が発生すると効率が悪い。 あらかじめ追加するおおよその要素数が分かっている場合は、(3)のmake 関数を使うことで、容量を指定したスライス生成を行える。



* 要素の追加

```
# 新しいスライスを返す
newSlice := append(s, 20)
```


# その他メモ

* 配列は固定長、リストは可変長

# 参考
* https://stackoverflow.com/questions/12768744/re-slicing-slices-in-golang
* https://hackernoon.com/golang-slice-and-append-e18498cf924a
* https://maku77.github.io/hugo/go/array.html
エラー "Inval id char `\x1F' in expression"の解決

#エラー "Invalid char `\x1F' in expression"

macでパッケージインストールしているときにエラー発生
原因はwgetでURL指定してパッケージをダウンロードするのに"brew"を使っていたから。
エラーの本質は文字コード関連だけど、自分はそもそもコマンドの使用方法が間違っていた。

以下自分が犯した間違い

```インストール方法
brew install パッケージURL
```


#正しいパッケージインストール方法
```正解
brew install wget
wget パッケージURL
```

macだと最初からwgetが使えないっぽい。
【最速】PHPでCSVファイルを保存する方法

# はじめに
最近laravelを使う機会が多く、CSVをエクスポートする機会があったので簡単ながらメモしておきます。

# コード

```php
// csvデータ作成
$csv = array(
  array("名前", "色", "値段"),
  array("りんご", "赤", "10O"),
  array("バナナ", "黄色", "200"),
  array("みかん", "オレンジ", "120")
);

// header作成
header('Content-Type: application/octet-stream');
header("Content-Disposition: attachment; filename=data.csv");

// csv出力
foreach ($csv as $line) fputcsv(fopen('php://output', 'w'), mb_convert_encoding($line, 'SJIS', 'UTF-8'));
```
laravelのルートを通し、処理を実行するとcsvファイルをダウンロードする事が出来ます。
<img width="1680" alt="スクリーンショット 2020-02-03 22.38.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199666/7f07497b-a0da-643d-626b-7e2092fddd45.png">

このような内容がダンロード出来ました。
<img width="1336" alt="スクリーンショット 2020-02-03 22.39.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199666/9ad876e4-f24f-b45c-c59d-6e53d86a29ef.png">

WindowsのExcelで文字化けしないように、Shift-JISに変換してあります。

すこしのデータ量であれば、特に難しい処理はないので、ぜひお試しください。
C++でGC(Boehm)を使う準備

# C++でGC(Boehm)を使う準備
　C++でGCを使いたい人はたくさんいると思うので下準備のメモ
オープンソースのGCといえば[Boehm](https://github.com/ivmai/bdwgc)らしいので早速導入してみます。具体的な流れは、

1. ソースコードのダウンロード
2. ソリューションファイルの作成
3. ビルドして.dllと.libを作成
4. 使いたいプロジェクトに追加
です。

### 1.ソースコードのダウンロード
　[ダウンロードページ](https://github.com/ivmai/bdwgc/wiki/Download)から最新のリポジトリをダウンロード。特に理由がなければ「recent stable release」でよし。展開すると中にソースコードが一式入っています。

### 2.ソリューションファイルの作成
　ソリューションの作成にはCMakeを使います。インストールの仕方は[良い記事](https://qiita.com/East_san/items/b8ebc34dad226865899a)がたくさんあるのでそちらにお任せ。

　インストールしたらコマンドプロンプトを開いてコマンドをたたく。
<code>cd C:\gc-8.0.4.tar\gc-8.0.4</code>　(プロジェクトの場所に移動)
<code>cmake -D enable_cplusplus=ON</code>　(C++用のソリューションファイルの作成)
コマンドが終了するとgc.slnができているはず。

### 3. ビルドして.dllと.libを作成
　デフォルトのままビルドするとすべてのプロジェクトがコンパイルされる。
作成された、gcmt-dll.dllとgcmt-dll.libを使います。

### 4. 使いたいプロジェクトに追加
　使いたいプロジェクトを作成し、プロジェクト(P)->プロパティ(E)を開いて先ほどのファイルをプロジェクトに追加する。

- 構成プロパティ->C/C++の追加　のインクルードディレクトリにincludeフォルダのパスを追記。
    - 例：<code>C:\gc-8.0.4.tar\gc-8.0.4\include</code>
- 構成プロパティ->リンカー　の追加のライブラリディレクトリにgcmt-dll.libの入っているディレクトリを追記。
- 構成プロパティ->リンカー->入力　の追加の依存ファイルにgcmt-dll.libを追記。
- 実行時にgcmt-dll.dllが必要になるのでビルドしてexeができる場所などに移動しておく。


### 5. 試してみる
```c++:main.cpp
#include <iostream>
#include <gc_cpp.h>

int ccnt;
int dcnt;

class Hoge : public gc_cleanup
{
public:
  Hoge() {
   ccnt++;
  }
  ~Hoge() {
    dcnt++;
  }
};

int main()
{
  for (int i = 0; i < 100000; i++) {
    Hoge *h = new Hoge();
  }
  std::cout<<"コンストラクタが呼ばれた数："<<ccnt<<std::endl;
  std::cout<<"デストラクタが呼ばれた数："<<dcnt<<std::endl;
  return 0;
}
```
Rust + Entity Component System で仕様変更に強いゲーム設計 その４ー３〜 アニメーションを動かす

## 目次

[その１ 〜 序文](https://qiita.com/mas-yo/items/e7d1e247e5d4a9f47e92)
[その２ 〜 キャラの移動](https://qiita.com/mas-yo/items/207244f04dd442cb567c)
[その３−１ 〜 コンポーネントの設計](https://qiita.com/mas-yo/items/e1f89bea5f84b7041462)
[その３−２ 〜 システムの設計](https://qiita.com/mas-yo/items/ca97fe6ed961d77be715)
[その３−３ 〜 メイン部分](https://qiita.com/mas-yo/items/9f0459dd942a874c6273)
[その４−１ 〜 剣を表示](https://qiita.com/mas-yo/items/daae411935d138d85c95)
[その４−２ 〜 アニメーションコンポーネント](https://qiita.com/mas-yo/items/678d775e4caf5e14abe7)
【イマココ】[その４－３ 〜 アニメーションを動かす](https://qiita.com/mas-yo/items/3db0a920cb76c75bca51)
[その５－１～ あたり判定](https://qiita.com/mas-yo/items/598ed52f5c08a0375ead)
[その５－２～ やられアニメーション](https://qiita.com/mas-yo/items/cf017ac1ebdd7ce25d86)
[その６ 〜 これまでの振り返り](https://qiita.com/mas-yo/items/22ead1dc226da4df54e2)

## アニメーションを動かそう

前回は、アニメーションを動かす仕組みを実装しましたので、今回はアニメーションを実際に動かしたいと思います。

実は当初、アニメーションを動かすための、[ステートマシン](https://ja.wikipedia.org/wiki/%E6%9C%89%E9%99%90%E3%82%AA%E3%83%BC%E3%83%88%E3%83%9E%E3%83%88%E3%83%B3)を導入しようとして、実際に実装までやったのですが、今の段階でステートマシンを導入しても、後でいろんな要件が出てきたときに、単純な状態遷移だけでは管理しきれなくなりそうだな、と思ってやめました。

https://github.com/mas-yo/rust-ecs-game/tree/fd15d1d97463d9b5ec00f379c4cb26f7820dfeb3

こちらが、そのステートマシンを導入した状態のソースです。
興味のある方は、見てみてください。
最新コミットでは、ステートマシンの仕組みは削除されています。


ということで今回は単純に

- スペースキーが押されたら、攻撃アニメーション
- 攻撃アニメーションが終わったら、待機アニメーション再生（ループ）

だけを実装します。

Animatorを更新するシステムの実装を、下記の様に書き換えます。
（前回まででは、単に update() を呼ぶだけでした）

```Rust
impl SystemProcess for System<CContainer<CharacterAnimator>, CContainer<Input>>
{
    fn process(animators: &mut Self::Update, inputs: &Self::Refer) {
        animators.iter_mut().zip_entity(inputs).for_each(|(a, i)| {
            if let Some(id) = a.playing_id() {
                if id == CharacterAnimID::Attack && a.is_end() {
                    a.play(CharacterAnimID::Wait);
                }
            }
            if i.attack {
                a.play(CharacterAnimID::Attack);
            }
            a.update()
        });
    }
}
```

inputの状態を見て、`attack` （スペースキー）だったら、攻撃アニメを再生、攻撃アニメが終了していたら、待機アニメを再生、としています。

これで、なんか戦えそうな感じになりました。

次は、攻撃の当たり判定を実装してみようと思います。
【MySQL】 information_schemaを用いて効率的に探したいデータの格納場所を見つけ出す

新しいバイト先でDBに触れることが多くなり、溢れかえったデータから検索したいものを絞りだす為に、information_schemaというものの存在を知るようになった。

#information_schemaとは

データベースやテーブル等に関するメタデータを格納しているデータベース。
ここに格納されているデータを利用することで取り出したいデータの絞り込みができるようになる。
(特定のカラムを含むテーブルや、該当テーブルを含むデータベースの検索など)

#よく使うinfomation_schemaのテーブル 
基本的に以下の二つのテーブルをよく使う。

###TABLES 
テーブルのメタデータを格納しているテーブル。
テーブルの中身はこんな感じ↓

```
mysql> select * from information_schema.TABLES where table_name = "test";

*****************************************************
  TABLE_CATALOG: def
   TABLE_SCHEMA: test_database
     TABLE_NAME: test
     TABLE_TYPE: BASE TABLE
         ENGINE: InnoDB
        VERSION: 10
     ROW_FORMAT: Compact
     TABLE_ROWS: 0
 AVG_ROW_LENGTH: 0
    DATA_LENGTH: 16384
MAX_DATA_LENGTH: 0
   INDEX_LENGTH: 0
      DATA_FREE: 0
 AUTO_INCREMENT: NULL
    CREATE_TIME: 2020-02-03 17:24:14
    UPDATE_TIME: NULL
     CHECK_TIME: NULL
TABLE_COLLATION: utf8_general_ci
       CHECKSUM: NULL
 CREATE_OPTIONS:
  TABLE_COMMENT:
```

TABLE_SCHEMAにデータベース名、TABLE_NAMEにテーブル名が格納されている。

例として、該当テーブルを含むデータベースの検索を行いたい際は、以下のようにすることによって絞り込みができる。

```
select TABLE_SCHEMA from information_schema.TABLES where TABLE_NAME = '該当テーブル';
```

###COLUMNS
カラムのメタデータを格納しているテーブル。

```
mysql> select * from information_schema.COLUMNS where table_name = "test”;
******************************************************
           TABLE_CATALOG: def
            TABLE_SCHEMA: test_database
              TABLE_NAME: test
             COLUMN_NAME: id
        ORDINAL_POSITION: 1
          COLUMN_DEFAULT: NULL
             IS_NULLABLE: NO
               DATA_TYPE: int
CHARACTER_MAXIMUM_LENGTH: NULL
  CHARACTER_OCTET_LENGTH: NULL
       NUMERIC_PRECISION: 10
           NUMERIC_SCALE: 0
      DATETIME_PRECISION: NULL
      CHARACTER_SET_NAME: NULL
          COLLATION_NAME: NULL
             COLUMN_TYPE: int(20)
              COLUMN_KEY: PRI
                   EXTRA: auto_increment
              PRIVILEGES: select,insert,update,references
          COLUMN_COMMENT:
```

例として、指定されたカラム名を持つテーブルを検索したい場合は、以下のようにすることによって絞り込みができる。

```
select TABLE_NAME from information_schema.COLUMNS where  COLUMN_NAME = '検索したいカラム名' (and table_schema = '該当データベース名');
```

他にも複数テーブルがあって、色々と活用できるのでもっと知りたい方は以下のMySQL公式ドキュメントを参考にしてみてください。


##参考

https://dev.mysql.com/doc/refman/5.6/ja/information-schema.html
はじめましてm(_ _)m

<b><a href="https://kyobankatu.hatenablog.com/about">はてなブログ</a>の記事をそのまま写しています</b>
<p>はじめまして。kyobankatuと申します。</p>
<h4>自己紹介</h4>
<p>もうすぐ高校生です。<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C3%E6%B9%E2%B0%EC%B4%D3">中高一貫</a>なので受験はありません。</p>
<h5>好きな食べ物</h5>
<p>寿司がなんだかんだ言って一番好き<span style="color: #252525; font-family: Helvetica, Arial, YuGothic, 'Yu Gothic', 'Hiragino Sans', ヒラギノ角ゴシック, メイリオ, Meiryo, 'ＭＳ Ｐゴシック', 'MS PGothic', sans-serif; font-size: 17.12px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff; text-decoration-style: initial; text-decoration-color: initial; display: inline !important; float: none;">(*´ｰ`*) ネタはハマチと鯛が好物。</span></p>
<h5>好きなゲーム</h5>
<p>PCだと「<a href="https://www.minecraft.net/ja-jp/">Minecraft</a>」 <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%AF%A5%E9">マイクラ</a>歴は約3年。</p>
<p>ブラウザだと最近<a href="https://krunker.io/">krunker.io</a>という軽い<a class="keyword" href="http://d.hatena.ne.jp/keyword/FPS%A5%B2%A1%BC%A5%E0">FPSゲーム</a>にハマってます。(めっちゃオモロイ)</p>
<p>あとは、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%DE%A5%DB">スマホ</a>で<a href="https://www.konami.com/games/prospi_a/">プロスピA</a>と<a href="https://battlecats.club/">にゃんこ大戦争</a>。にゃんこは２,３ヶ月前に始めました</p>
<h5>趣味</h5>
<p>プログラミングと野球観戦が趣味。(家族は野球に興味がないので、球場に行ったことが無い;;)</p>
<p>プログラミングは主に<a class="keyword" href="http://d.hatena.ne.jp/keyword/Java">Java</a>をしています。</p>
<p> </p>
<p>自己紹介はこの辺で終わっておきます。</p>
<h4>このサイトの概要</h4>
<p>主にプログラミングに関することを書こうかなぁ〜 って思ってます。</p>
<p>マニアックな言語をちょこちょこ使って、色々書く予定です。</p>
<p>色んな言語知ってる人ってなんか憧れる。(医者兼弁護士兼スポーツ選手的な感じ)</p>
<p>かと言って、有名な言語について触れない訳では無いので。</p>
<p>あとは、気になったプログラミングに関するニュースについても書くかもしれません。</p>
<h4>最後に</h4>
<p> 投稿頻度はかなり低いと思いますが、せめて継続できるように頑張りますd</p>
S3(Simple Storage Service)~ AWS学習メモ  ~

#S3の特徴、保存形式
【特徴】
・ユーザーがデータを保存しても自動でAWS側で拡張してくれる。
・高い耐久性
・通信やデータ保存時に暗号化

【保存形式】
・バケット　＝　オブジェクトの保存場所で名称はユニーク
・データサイズは0KB~５TBまで保存可能

## ストレージの種類

【オブジェクトストレージ（S3、Glacier）】
・安価で高い耐久力をもつオンラインストレージ
・オブジェクト形式でデータを保存

【ブロックストレージ（EBS、インスタンスストアなど）】
・EC2にアタッチして活用するディスクサービス
・ブロック形式でデータをする
・高速・広帯域幅

【ファイルストレージ（EFS）】
・複数のEC2インスタンスから同時にアタッチ可能な共有ストレージサービス
・ファイル形式でデータを保存


##整合性モデルの特徴
・データの更新・削除に整合性モデルを採用している
・同時書き込みはタイムスタンプ処理を実施する 



##S3のアクセス管理

【IAM、ユーザーポリシー】
・IAMユーザーに対してアクセス権限を設定
・一時的にユーザー権限を管理

【バケットポリシー】
・バケットやオブジェクトのアクセス件をJSONで記述する
・特定のエンドポイントまたはVPCからバケットへのアクセスを制御

【ACL】
・バケットとオブジェクトへのアクセス権限をXMLで設定できる
・簡易的な権限管理を実施

##S3の暗号化　

【サーバーサイド暗号化】

・AWSのサーバーリソースを利用して格納データの暗号化を実施する
　暗号化タイプ　SSE-S3/SSE-KMS/SSE-C

【クライアントサイド暗号化】

・暗号化プロセスをユーザ側で管理することができる
　暗号化タイプ　
　ケース１　KMSで管理されたカスタマーキーで暗号化
　ケース２　クライアントが管理するマスターキーで暗号化　

## 便利な機能
クロスリージョンレプリケーション
・別のリージョンへのデータコピーとバックアップ

バージョン管理
・ユーザーの誤操作によりデータを削除してもバージョンから復元できる

ライフサイクル管理
・バケット内のオブジェクトを一定の期間で変更や削除時期などを設定することができる
仙台CTF 2019 Opw8.攻撃ツール 100

#問題

http://ctf.sectanlab.jp/2019/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/799e685c-a0c8-0314-16ab-b2d1e0354b1a.png)

#解いてみた

さっきのプロキシログからC&Cサーバに通信したログだけに絞り込みます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/8dcdbb5d-583c-2d1e-dfb9-7729726b9a62.png)

4オクテットが19のPCが最初にアクセスした日時のちょっと前にラテラルムーブメント食らったはず。
なので、その時間を入力してみると正解だった。
節分だから鬼で遊ぶ

#はじめに
　鬼が怖いので、スクリプトで撃退します。

#やったこと
　怖そうな鬼（下の画像）を無力化していきます。

![setsubun_oni_kowai.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/537831/7bb07c3b-0a78-0473-5417-a5954d35db4a.png)
（出典: いらすとや「 https://www.irasutoya.com/2020/01/blog-post_891.html 」）

怖そうな鬼ですね。

![grayscale.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/537831/b904ecaf-9a7d-bea3-1ace-b51b5bf83728.png)

まずはグレースケール化します。一層怖くなったかも。
![otsu.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/537831/c02cc196-3619-e2cb-a2cd-671004873711.png)

大津の二極化を使います。この時点で鬼は弱そうです。

![oni.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/537831/c122ca88-eb8f-d9ed-33e8-0c11a87f5ef8.png)

Zhang-Suenのアルゴリズムで細線化します。1行で書けるのが嬉しいです。
たぶんこれなら襲われても大丈夫そう。

以下が使用したコードです。

```python:oni-taizi.rb
from skimage.morphology import skeletonize
import cv2
import numpy as np

#読み込み
img = cv2.imread('setsubun_oni_kowai.png')

#グレースケールに変換
gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)

#大津の二極化
ret, th = cv2.threshold(gray, 0, 255, cv2.THRESH_OTSU)

#画像を0,1に変換
th[th>0]=1    

#細線化
skeleton = skeletonize(th)

#画像を0,255に変換
output = np.where(skeleton, 0, 255)

#保存
cv2.imwrite("oni.png", output)
```

#おわりに
　退治できたかはあくまでも個人の主観によります。
　ご覧いただきありがとうございました。
ReactでObject.keysとmapを使ってobject of objectsを展開する

# before(冗長)

```react

type news = {
    content: string;
}

interface Props {
    1: news;
    2: news;
    3: news;
}

const NewsItems: React.FC<Props> = (props) => {
  return (
    <div>
        <div>
            {props[1].content}
        </div>
        <div>
            {props[2].content}
        </div>
        <div>
            {props[3].content}
        </div>
    </div>
  )
);
```

冗長ッ！！引くほど冗長ッ！！！

# after

```react

interface Props {
    [order: number] : {
        content: string;
    }
}

const NewsItems: React.FC<Props> = (props) => {
  return (
    <div>
        {Object.keys(props.newses).map(order => {
            return (
                <div key={order}>
                    {props.newses[parseInt(order).content]}
                </div>
            );
        )}}
    </div>
  )
);
```

## point


- interfaceでブラケットを使用する

```[キーの名前 : キーの型指定] : バリューの型指定```
という風に書く事で1,2,3などと書かなくてよくなる
また、キーの型指定ができることで、mapでまわすときのkeyの型が決まるため、その後の```props.newses[ここの中]```に怒られずに入れることができる

- Object.keysの返り値である配列の要素は文字列になることに注意

Object.keysの返り値はこの場合```["1", "2", "3"]```となってしまうので、parseIntを忘れずに。
もともとキーがstringだったらこんなことしなくて良いです。
(これで1時間ほど悩んでしまった。)
仙台CTF 2019 Opw7.ラテラルムーブメント 100

#問題

http://ctf.sectanlab.jp/2019/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/0824b15a-d6c8-1459-9914-6c4ae03ce416.png)

#解いてみた

まさに、さっきの問題の最後に書いた通り、同じ通信先にほかのIPアドレスからもアクセスがあったので、それがこたえ。
仙台CTF 2019 Opw6.C2サーバ 100

#問題

http://ctf.sectanlab.jp/2019/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/8ee39450-9e79-82a6-50e2-c180f47f2c72.png)

#解いてみた


①感染端末から痕跡を探す方法。
②マルウェアから通信先を探す方法。

の2通りがあるようですが、Windowsの仮想マシンを持っていないので、今回は①感染端末から痕跡を探す方法でやります。

ハチベさんが感染しているので、そのPCを調べます。
Web履歴を調べてみます。

BrowsingHistoryViewを使います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/6387654e-b1bb-6d4b-f69c-d8568395035d.png)

問題文で「〇〇.com」だということはわかっているので、それに絞ると

```
lh3.googleusercontent.com
```

が怪しいけどgoogleっぽいけど。。。
まぁ一応入力してみましたが、やはり違いました。

キャッシュ調べてみますか。

IECacheViewを使います。

調べるフォルダは

```
\PC13\Users\user13\AppData\Local\Microsoft\Windows\Temporary Internet Files
```

です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/a5feeb78-fa98-9abf-41e2-d0627120612e.png)

がっつりマルウェアをダウンロードしてますね。
ということでこれが答え。

と思ったら違いました。
このマルウェアがどこに通信するか？っていう問題か？

ということは、このダウンロード直後にアクセスしているところが答えかなと思って、LastAccessdで並び替えてみたら、これが最後のアクセスだった。。。

んー。通信ログないかな？と思って再度オープンワールド見てたらプロキシのログが見れることが分かった。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/be361a8e-6468-bf47-a3fe-649088ecdc8e.png)

これを見れば話が早い。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/9eab2911-76ba-aad6-f7e2-eda7f5fcda78.png)

さっきのmalware.exeをダウンロード後に通信している.comを見るといくつかあって、そのなかに答えがあった。

ちなみに
IPアドレスの4オクテットが13のやつだと「ocsp.digicert.com」なのかなと思ったら違って、もう一つのほうでした。
IPの4オクテットが19の人も感染しているということがわかった。
基本情報技術者試験の勉強計画　第16週（2/3週）

## 目標と結果
### 目標
・少しづつ復習する
・休みすぎない
### 結果
・少しはできないところの復習は行ったが休んだ日が続いてしまった
## 振り返り
### keep
・復習
### problem
・全く何もしない日を作らない
### try
・午後の問題でできそうなところを挑戦してみる
Terraformのtfstateファイルを消すとどうなるか

Terraformを実行してリソースを作成するとtfstateというファイルが作成されます。

以下公式ドキュメントより

https://www.terraform.io/docs/state/purpose.html
https://www.terraform.io/docs/state/index.html

>Terraformは、管理対象のインフラストラクチャと構成に関する状態を保存する必要があります。Terraformはこの状態を使用して、実世界のリソースを構成にマッピングし、メタデータを追跡し、大規模なインフラストラクチャのパフォーマンスを向上させます。


>Terraformは通常、構成を使用して依存関係の順序を決定します。ただし、Terraform構成からリソースを削除する場合、Terraformはそのリソースを削除する方法を知っている必要があります。Terraformは、構成にないリソースのマッピングが存在することを確認し、破棄する予定です。ただし、構成が存在しないため、構成のみから順序を決定することはできません。

>正しい動作を保証するために、Terraformは、状態内の最新の依存関係セットのコピーを保持します。現在、Terraformは、構成から1つまたは複数のアイテムを削除するときに、状態から正しい破壊順序を決定できます。

このtfstateファイルを削除するとリソースの追加作成や削除が非常に困難になります。

#検証してみる

適当に公式のサンプルコードを参考にec2を作成する。

https://www.terraform.io/docs/providers/aws/r/instance.html

```tf
data "aws_ami" "ubuntu" {
  most_recent = true

  filter {
    name   = "name"
    values = ["ubuntu/images/hvm-ssd/ubuntu-trusty-14.04-amd64-server-*"]
  }

  filter {
    name   = "virtualization-type"
    values = ["hvm"]
  }

  owners = ["099720109477"] # Canonical
}

resource "aws_instance" "web" {
  ami           =  data.aws_ami.ubuntu.id
  instance_type = "t2.micro"

  tags = {
    Name = "HelloWorld"
  }
}
```
※ちなみにコメントの[Canonical](https://ja.wikipedia.org/wiki/%E3%82%AB%E3%83%8E%E3%83%8B%E3%82%AB%E3%83%AB)というのはubuntuを開発してる企業です。


公式ドキュメントの通りにterraform planすると、

```
Warning: Interpolation-only expressions are deprecated
```

と怒られますが、これは現行のterraform 0.12では推奨されない書き方なのが原因です。
（エラーメッセージにまんま書いていますが）

```
data.aws_ami.ubuntu.id
```

と書けば怒られません。

#実行してみる
$ terraform applyすると、デフォルトだと実行したディレクトリに

```
terraform.tfstate
terraform.tfstate.backup
```

というファイルが作成されます。
中身を見ると以下のようなjson形式ファイルになっています。

```
]$ cat terraform.tfstate
{
  "version": 4,
  "terraform_version": "0.12.16",
  "serial": 3,
  "lineage": "xxxxxxxxxxxxxxxxxxxx",
  "outputs": {},
  "resources": [
    {
      "mode": "data",
      "type": "aws_ami",
      "name": "ubuntu",
      "provider": "provider.aws",
      "instances": [
        {
          "schema_version": 0,
          "attributes": {
            "architecture": "x86_64",
            "block_device_mappings": [
              {
                "device_name": "/dev/sda1",
                "ebs": {
                  "delete_on_termination": "true",
                  "encrypted": "false",
                  "iops": "0",
～略～
````

これを削除すると、このファイルの中身と同一のものを作成しないとterraform destroy できなくなります。
試しに消してやってみると

```
$ terraform destroy
data.aws_ami.ubuntu: Refreshing state...

An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:

Terraform will perform the following actions:

Plan: 0 to add, 0 to change, 0 to destroy.

Do you really want to destroy all resources?
  Terraform will destroy all your managed infrastructure, as shown above.
  There is no undo. Only 'yes' will be accepted to confirm.

  Enter a value: yes

```

参照するstateがないのでterrformで作成したリソースを消せなくなります。

さらにterraformで作成したリソースに、マネジメントコンソール等から変更を加えてしまうと、
tfstateから乖離してdestroyもapplyできなくなるので、terraformを使うのであればtfstateファイル管理がものすごい大事です。
（構築中に消して死にそうになったのは内緒)
#22 Labelのテキストに改行を入れて複数行で書く方法1例

#はじめに
個人のメモ程度の出来なのであまり参考にしないで下さい．


#環境
Xcode：11.2.1
Swift：5.1.2
2019/11


##part1
`Lines`を0にして，テキスト入力時に`control`キーと`q`キーを押しながら`Enter`キーを押す．
`Alignment`で中央揃えにする．

<img width="259" alt="スクリーンショット 2020-02-03 午後10.00.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534708/7f495f47-0060-0dff-ee2b-394db8dc8f62.png">
「誕生日のパラドックス」をPythonでシミュレーションしてみた

「**何人集まれば、その中に誕生日が同一の2人（以上）がいる確率が、50%を超えるか?**」
というアレ。

- 集団の中に同じ誕生日の組み合わせの人がいる確率が**50%**を超えるのは**23人**から。
  - 70人集まると**99.9%**を超える

[誕生日のパラドックス - Wikipedia](https://ja.wikipedia.org/wiki/%E8%AA%95%E7%94%9F%E6%97%A5%E3%81%AE%E3%83%91%E3%83%A9%E3%83%89%E3%83%83%E3%82%AF%E3%82%B9)

> 70人しか集まらなくても確率は99.9%を超え、50%を超えるのに必要なのはわずか23人である。

**※閏年や双子は考慮しません**

```python:birthday_paradox.py
import math
from random import random


n_trials = 50000  # 1回あたりの試行回数
max_people = 100  # 検証する最大人数


print('人数,同一誕生日の組があった回数,試行回数,確率')
for n_people in range(2, max_people + 1):
    count = 0  # 同じ誕生日の人がいた回数
    for _ in range(n_trials):
        # 誕生日に見立ててた1～365 の乱数整数をリストに格納する。
        births = []
        for __ in range(n_people):
            birthday = math.ceil(random() * 365)
            births.append(birthday)
        # 重複を除いた要素数が元の要素数と一致しなければ誕生日の重複があるということ
        if len(births) != len(set(births)):
            count += 1
    print(f'{n_people},{count},{n_trials},{count / n_trials}')
```

# 実行結果

```
人数,同一誕生日の組があった回数,試行回数,確率
2,105,50000,0.0021
3,390,50000,0.0078
4,773,50000,0.01546
5,1370,50000,0.0274
6,1992,50000,0.03984
7,2853,50000,0.05706
8,3686,50000,0.07372
...
17,15850,50000,0.317
18,17422,50000,0.34844
19,18898,50000,0.37796
20,20602,50000,0.41204
21,22207,50000,0.44414
22,23795,50000,0.4759
23,25531,50000,0.51062  # <- 23人を超えたところで50%を超えた
24,27170,50000,0.5434
25,28517,50000,0.57034
26,29820,50000,0.5964
27,31400,50000,0.628
...
68,49925,50000,0.9985
69,49940,50000,0.9988
70,49952,50000,0.99904  # <- 70人を超えたところで99.9%を超えた
71,49971,50000,0.99942
72,49970,50000,0.9994
73,49971,50000,0.99942
74,49985,50000,0.9997
75,49987,50000,0.99974
76,49989,50000,0.99978
77,49994,50000,0.99988
78,49994,50000,0.99988
79,49994,50000,0.99988
...
99,50000,50000,1.0
100,50000,50000,1.0  #  <- もはや100%!!
```
Mac に phpenv + virtphp で PHP の仮想環境を作る

# Overview

Mac に phpenv + virtphp で pyenv + virtualenv のような環境を作った時のメモ。次回同じ作業をすることになった時のために残しておく。

# phpenv

phpenv と名のリポジトリは複数あるが、星の数が多いこちらを使うことにした。

https://github.com/phpenv/phpenv

phpenv 自体のインストールは簡単。README どおりにやればすぐ終わる。[installer](https://github.com/phpenv/phpenv-installer) もある。

ただ、php-build (phpenv install で必要) でつまずく。

大体は共有ライブラリが足りないって怒られる。そこは一つ一つ対応。

このあたりはメモをロストしました。。まぁなんとかやれるはず。

最終的には[こちら](https://qiita.com/fruitriin/items/3028c2e2170e3e93459d)の記事のとおりに実施すれば解決した。感謝。

```
$ phpenv versions
* system (set by /Users/tommarute/.phpenv/version)
  7.3
  7.3.9
```

# virtphp

virtualenv も欲しい。これを入れてみよう。

https://github.com/phpenv/phpenv

`virtphp.phar` をダウンロードして `~/bin` に置いた後からのメモ。

厳密に言うと bin に置くのはちょっと違うかもしれないが、補完されると嬉しいのでこんな感じにしておく。

```
$ cd ~/bin
$ chmod 755 virtphp.phar
$ ln -s virtphp.phar virtphp
```

venv を作ってみる。

(事前に phpenv で元となる version を active にしておくこと)

```
$ virtphp create myenv
Creating .virtphp directory in user home folder.
Creating the environments.json file.
Creating the env folder to hold the environments.
Checking current environment
Creating directory structure
Creating virtPHP version file
Creating custom php.ini
Wrapping PHP binary
Downloading pear phar file, this could take a while...
Installing PEAR
Saving pear.conf file.
Installing Composer locally
Installing activate/deactive script
Your virtual php environment (myenv) has been created!
You can activate your new environment using: ~$ source /Users/tommarute/.virtphp/envs/myenv/bin/activate
```

```
$ virtphp show
+-------+--------------------------------+----------------------------------------------------------+
| Name  | Path                           | ACTIVATE                                                 |
+-------+--------------------------------+----------------------------------------------------------+
| myenv | /Users/tommarute/.virtphp/envs | source /Users/tommarute/.virtphp/envs/myenv/bin/activate |
+-------+--------------------------------+----------------------------------------------------------+
```

activate

```
$ source /Users/tommarute/.virtphp/envs/myenv/bin/activate
(myenv) $ php -v
PHP 7.3.9 (cli) (built: Feb  2 2020 03:18:47) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.9, Copyright (c) 1998-2018 Zend Technologies
```

deactivate

```
(myenv) $ deactivate
$ php -v
PHP 7.1.32 (cli) (built: Oct  2 2019 02:04:02) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2018 Zend Technologies
```

いい感じになりました。

Bye,
基本情報技術者試験の勉強計画　2月

## 基本情報技術者試験の勉強計画　2月
### 目標
・遊びすぎない
・少しでも空いた時間に復習する
・計算問題を理解して解く
### 結果
・遊びの合間にも行った
・午前の復習を行って忘れていたところを改善した
・計算問題を少し理解できた
## 振り返り
### keep
・復習を繰り返し行う
### problem
・1日何もしない日を作らない
### try
・午後問題にも挑戦する
・アルゴリズムを早めに取り組む
## 週次報告
### [第16週(2/3週)](https://qiita.com/poohsan/items/e3c1e2f03fd81336bf19)
### [第17週(2/10週)](https://qiita.com/poohsan/items/e470e58248f9772ce2ef)
### [第18週(2/17週)](https://qiita.com/poohsan/items/e37ff2f69234b9aa4b0e)
### [第19週(2/24週)](https://qiita.com/poohsan/items/cee4ad0f9b7c6094e277)
GitHubの特徴

今日からスクールで応用編に入り、GitHubについて学びました。

まずは環境構築でどう役に立つのかもいまいちよく分かりませんが、GitHubの特徴をまとめておきます。

<b>①世界中のあらゆるプロダクトが保存、公開されている</b>
GitHubでは世界中の人々が自分のプロダクトを保存、公開することができるため、いろいろな人のソースコードを読んだり、それぞれ知らない多くの人たちが１つのプロジェクトやソースコードの変更に関わることができる

<b>②グラフィカルな画面からGitを扱うことができる</b>
GitHubならWebサービス上の画面からグラフィカルにGitの操作を行うことができる

<b>③チーム開発に便利な様々な機能が用意されている</b>
GitHubにはチーム開発を円滑に行うためにコードレビューを行う仕組みやソースコード単位でコメントのやり取りをする機能、他の開発者のリモートリポジトリをコピーしてくる機能などがいくつもある


早くGitHubを使ってチーム開発をしたいです。
Google Colaboratory setup まとめ

## Colaboratory 環境設定

google drive のフォルダを使用
`workingDir` 以外は固定値

`%cd` は使えなくなった (もしくは、割り当てられた環境によっては使用できない)

```python
# mount google drive
from google.colab import drive
drive.mount('/content/gdrive')

# add path
import sys
workingDir = 'path/to/folder'
sys.path.append(f'/content/gdrive/My Drive/{workingDir}')

# change working directory
import os
os.chdir(f'/content/gdrive/My Drive/{workingDir}')
%ls
```

tensorflowのバージョンを固定

```shell
# 2.x
%tensorflow_version 2.x
# 1.x
%tensorflow_version 1.x
```

apt-get, pip 実行

```shell
!apt-get install -y tool
!pip install -r requirements.txt
```

## 使用

* 90分おきにセッションが切れるので、都度ページリロード or 再接続を行う
kintone-extension ノススメ。

みなさん、kintone 開発楽しんでますか？

え、楽しくない？
しんどい？
気の利かなさに辟易してる？

そんな辛さを少しだけ和らげ、昨日までの悲しみに満ちた日々をちょっとだけ楽しくしてくれるステキな逸品をご紹介します。
（ただし **VS Code** を使っている人に限る）

# kintone にもコード補完が利けばいいのに。

それ、[kintone-extension](https://marketplace.visualstudio.com/items?itemName=kintone-extension.kintone-extension) でできます。

2019 年 5 月にひっそりとリリースされ、同年 11 月の **Cybozu Days 2019** の kintone セッションでも採り上げられた VS Code 向けの拡張機能です。
どんぐらいひっそりかと言うと、総本山であるところの [cybozu developer network](https://developer.cybozu.io/hc/ja) にも 1 件たりとも解説記事がないほどのひっそりっぷりです。
しかしそんな不遇ぶりとは相反して、こいつはかなりの実力派エリートです！

この拡張機能をインストールすることにより、

- kintone JavaScript API の自動補完
- 各種コードスニペット
  - kintone JavaScript API
  - kintone JS SDK
  - kintone UI Component

と言ったお便利機能があなたの VS Code にやって来ます。

こんな感じで動作します。
![01-001-kintone-extension.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162138/20ce9894-15c3-b7ac-8193-ee55a933bd10.gif)

たくさんあるスニペットもいいですけども、単純にコード補完が利くようになるだけでもメリットすごいのです！

# こんなに便利なのになぜか流行っていない！！！

あくまでこの記事執筆時点（2020 年 2 月初頭）での話ですが、この拡張機能、インストールされている数はなんと 400 にもぜんぜん届いていません。
リリースから半年以上経ってるのに！！
え、kintone 開発者ってそんなに少ないの？　裾野狭すぎなの？　もしかしてテキストエディタでガリガリ書いてる人多いの？
<img width="856" alt="02-001-370installed.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162138/36c10c48-f055-736f-7442-9c5bed222f45.png">


今インストールすればあなたもアーリーアダプターの仲間入りです。
全国に 400 人しかいないんですから！！
キルミーの円盤購入者より少ないんですから！！
（ちなみに筆者は選ばれし 686 人のうちの 1 人です）

ペアプロ等でサクッとコード補完とかスニペットとかを使いこなす様を見せつければ「やべえ kintone 使い」との評価を得られること請け合い！

と言うかもっと流行ればもっといろんな機能がついて一層便利になっていくのでは、と素直に期待しているのです。

みんなも [kintone-extension](https://marketplace.visualstudio.com/items?itemName=kintone-extension.kintone-extension) 使おうね！
Google ColaboratoryのGPUをしゃぶり尽くす。

# 概要

「Google ColabratoryでGPUを使い倒したい！！」
と思ってるけど、下のようなお悩みをお持ちでないですか...？

- 90分 & 12時間ルールでセッション切れする...
- Google DriveにMountしたファイルの読み書きにやけに時間がかかる...
- Colab使いすぎてGPU使えなくなった！

そんな貴方達に捧ぐ、Colabをしゃぶり尽くすTipsになります！

執筆日 : 2020/02/03

## Colabの90分ルールのセッション切れ対策

### 課題
Colabは90分なんのセッションもないとセッションが切れて12時間使い切れない。
上記課題に対応するために二つやることがある。
- macのスリープ対策
- ブラウザのセッション対策

スリープ対策のために「環境設定」->「省電力設定」といってスリープ対策をしてもうまくいかなかったりする。

またセッション対策としてColabのファイルになんどもアクセスするスクリプト書いたり、Autoreloadを入れたりするやり方もあるが、１回目はちゃんとリロードしてもいいか押す必要があったりして面倒臭い。

### 解決策

- スリープ対策
「Amphetamine」というアプリを入れれば簡単にスリープの永続化をしてくれる！
スリープしない時間も設定できるので、環境設定触ってPCがスリープしない状態なの忘れてて久々にPC開いたら「Oh...」ってこともない！

- セッション切れ対策

実はColabのRamとか書いてるところを押すと、再接続になる。
これを活用して、そこを定期的にクリックするスクリプトを書いてあげればOk!

1. Cmd + option + i でブラウザのコンソールを開く。
2. コンソールで以下を実行。

```sh
function ClickConnect(){
    console.log("Working!"); 
    document.querySelector("colab-toolbar-button#connect").click() 
}
setInterval(ClickConnect, 1200000) // 20分ごと
```

これでセッション対策も完璧！


## Google DriveにMountしたファイルの読み書き問題

### 課題
多くの人がGoogle Driveのファイル群をColabに以下のコマンドでマウントさせて使っていると思います。

```sh
from google.colab import drive
drive.mount('/gdrive')
```

しかし！Google DriveのマウントによるファイルのIOってかなり遅いんですよね...。

なんで画像のトレーニングなどで大量の画像ファイルやjsonファイル(annotation)を扱いたいとき、めちゃ遅かったりします。
これが非常にまどろこっしい！！トレーニング関係ないことですら遅い！！

### 解決法
1GB以上とかのファイル群なら、Google Driveにzipで固めて、
GoogleDriveのファイル群をColab内の環境に直でダウンロードしてしまった方が早い場合が多いです。
しかも！実はGoogle Driveのファイルは、少し手間を踏めばwgetでダウンロードできちゃいます。
そうすればAWSとかGCPとかのストレージファイルにあげなおす必要もないし、お金もかからないし、最高！！

【具体的なやり方】

1. ダウンロードしたいファイルをzipで固める。
2. 対象ファイルを右クリックして、「web上の全ての人に共有」にする。   
「共有」->「詳細設定」->「特定のユーザーがアクセスできます」の横の「変更」->「web上の誰でも」
3. 「共有可能なリンクを取得」からリンクを見て、ファイルのIDを取得。  
`https://drive.google.com/open?id=abc123`ならFILEID=abc123
4. 以下のbashを実行。

```sh
# /content/dataset.zipとして対象ファイルをダウンロードする。

# そこまで重くない場合
wget --no-check-certificate 'https://docs.google.com/uc?export=download&id=<FILE_ID>' -O /content/data.zip

# まあまあ重い場合
wget --load-cookies /tmp/cookies.txt "https://docs.google.com/uc?export=download&confirm=$(wget --quiet --save-cookies /tmp/cookies.txt --keep-session-cookies --no-check-certificate 'https://docs.google.com/uc?export=download&id=<FILE_ID>' -O- | sed -rn 's/.*confirm=([0-9A-Za-z_]+).*/\1\n/p')&id=<FILE_ID>" -O /content/dataset.zip && rm -rf /tmp/cookies.txt

# /content にデータを展開する。
unzip -q /content/dataset.zip -d /content
```

参考 : https://medium.com/@acpanjan/download-google-drive-files-using-wget-3c2c025a8b99


> 共有設定が全世界に公開になるので、データが機密情報の時は試さないでね！


## Colab使いすぎてGPU使えなくなる問題

### 課題
GPUを使い倒し続けていると、急にGoogleから「アカウントにGPU割り当てられないよ〜」ってメッセージが届く。
その間しばらくGPUは使えない...。悲しい...。
「でもでもどーしてもGPU使いたいの！！」って諸君。

### 解決策

Gmailアカウントを別のでやろう！
...ん？「そら、それならできるだろう」と？「ファイル構成そのアカウントに作り直さなきゃじゃん」と？

一つ目はごもっともです、流石に同じアカウントではできない、多分。大人しくGmailアカウント作ってください。

二つ目に関して。
ファイルの構成は元のアカウントのものを使えればいいはず。
そして、Google Driveのマウントは「別のアカウントのGoogle Drive」にも実はできてしまう。
ということで、以下のステップを踏めば簡単に別アカウントでipynbを動かせる。

1. 実行したいipynbを新しく作ったアカウントに共有する。
2. 新しく作ったアカウントから、共有されたipynbを開く。
3. mountする際に選択するアカウントを元のアカウントにする。

以上で、GPUを使えなくても別アカウントのGPUで簡単にノートブックを実行できる！


## 最後に

以上いろいろ書いたが、
どれもどこまで許されてるかわからないし、
急に禁止になるかもしれないので自己責任でお願いします。
自作プロトコル言語　UDMLの紹介

#VMMJ(VMMJS)を改良して、UDMLを作りました。

```UDML:ex.udml
@コメント
(*--
複数行コメント
--)
※Includes begin
C:\program\My_Programming_File
\Shield_Lang\ex2.udml
end
※Includes $Japanese @独自の日本語関数

@数行にわたる時は先頭にbegin-endが必要また、このような文字列の時は""と""が使える(文字列の'と',"と"は省略可)
Call Protocol->Start

MyDat set 114-514 @ -を数字中に入れれます
MyDat2 set 810.931
データーを'lock'と設定 ＠日本語文字も対応
データ1 set to get MyDat <> Integer get MyDat2 @非文字はgetが必要(setとgetが重なる時はtoが必須)。
データ2 set Call "赤":Color->to-Integer @"red"でもOK @キャスト元:キャスト先でキャスト可能(またはコンストラクタ呼び出しコンストラクタ引数:型)。
＠StringからColorに変換。
@番号(連番作成(データとして入れることも可能))
1.今夜のご飯は何でしょう?
1.えーっと何?
1.味噌汁。

@リスト作成
どした <- ((1,2,3)(114,あいう,2 add 8 eq 10))@2 add 8 eq 10のような式を入れることも可能。

@Dictionary-Table
＠With式が有用。
With move->MySpeak
t set 3
g set 5
m set 9

@必ず一行空ける
move.MySpeak <-{t <- 3,g <- 5,m <- 9} @inline式,非set構文代入(<-)も使える

Speaking <- {(Java,C,CPP,CSharp)(Python,Ruby,Lua)(PHP,Scala,Java-script)}

ecro あいう
ecro get Speaking 
ecro <-play/*1 to 100*/ @仮想式(簡易版ラムダ式) 自分で実装する場合expr(#Booleanタグ)/*式内容*/で作成できる。1~100
タグの作成
define My_Sharp t <- t eq 5 set $ **TRUE** ! **FALSE**
With Speaking play/*4 as n*/begin @nが1から4まで推移
|lang &get n|@暗黙の型変換(Integer:String)  
|------- playing|
|expr <-/*get having<>Nil in (n)*/|@havingがsecondから推移データがなくなるまでn行目を参照
end
@上記のプロセッサー展開は以下に展開される。
@|lang 1|lang 2|lang 3|lang 4|
@|------|------|------|------|
@|Java  |  C   |  CPP |CSharp|
@|Python| Ruby |  Lua | Nil  |
@|PHP |Scala|Java-Script| Nil|

sys set Call Protocol->Quit
※Excludes end
Call sys->End
```

#式や変数が存在しない若しくは式が何も返さなかった場合
nilが帰ってきます。
これはあくまで設定ファイルとしてつかいやすくしただけなので、それ以外の機能はありますが最小限にしています。

#Shieldファイルのビルド
```ex.udml
@このファイルを使うと自動でビルドされる。
['file_1'](My_Shield_File_0.shie)
['file_2'](My_Shield_File_1.shie)
['file_3'](My_Shield_File_2.shie)
define Entry My_Shield_File_0.Start_Up.Main　@必ずエントリーポイントのタグが必要。
out of !My_Shield_File.jcp where #Entry open build 'file_'& - where play 3 
@ %(ワイルドカード複数文字)か-(ワイルドカード一文字)必ず$を書くか""若しくは''で囲むこと
@playの後一文字以外不要なら/**/は不要
``` 

#細かい実装

```ex.udml
Function Procedure 

ABC set play 5 as n (n add play 4):expr
/* Implement MyImplement extends Object Begin
Fun __construct Arr Begin
play 4 -> playing Me->Arr set () ->Add Arr(playing) @playing X set Y の時最初に来た時に()で初期化
with Object Call Parent->__construct @With ~ Parent->~で継承物呼び出し 
End
Fun __Add @Private Function
End %1 Add %2
Fun Append @Public Function
End playing Me->__Add Me->__Add %1,~~ ,%x
End MyImplement */ 

ecro ABC(1)->__Add 1,2 @Error->__Add is Nothing Method
ecro ABC(1)->Append 1,2,3,4,5 @15 
End 

```

#UDML特徴

- 大文字小文字区別しない
- 平仮名片仮名を区別しない
- 特定の語彙以外は自由に利用OK。
- データ設定ファイルとしても利用できる。
- 引数が最初から%1,%2,%3,%4となる可変長の引数の場合%1,~~ ,%xで展開
- Implement playingが使える。
Reactを使う理由

## 皆さんもうReact使ってると思いますけど、なぜReactを使うようになったのか、Reactで書いたコードと、Reactを使わないで書いたコードを比較しながら説明したいと思います。

### 今回はこれのReactコードと生TSコードを比較します。
https://0jjev.csb.app/

名前リストなのですが、７つの仕様を一応満たしています。
最初の４つは普通ですね。最後の３つは少し複雑です。
最初は単純なプロジェクトから始まり、だんだん複雑になってしまったケースをシミュレートしています。

### 生TSコード（React使ってない）
https://codesandbox.io/embed/nemurisutosheng-0jjev?fontsize=14&hidenavigation=1&theme=dark

### （TS使ってるのに）どうしてこうなった
複雑になった理由は単純で、一つの関数の中に状態遷移の流れが記述されてるからです。Aliceの名前を変える部分が特に複雑で、名前変更⇛状況によってはアリスがチェックされる⇛それによりALLがチェックされるのかを計算する必要がある。という感じです。

### Reactを使うと改善される点
Reactを**正しく**使うと、基本的に、一つの関数の中では１回（か０）だけ状態遷移が起きます。（非同期関数を使う場合は複数回起きる可能性がある）

### React版
https://codesandbox.io/embed/nemurisutoreactban-lxzjk?fontsize=14&hidenavigation=1&theme=dark

### Reactでは何をするのか
最初に状態の構造を定義して、以下を繰り返すだけです。
1. 状態を基に、HTMLをレンダーする
2. ユーザーからのインプット（クリックとか入力とか）を基に状態を更新する

### まとめ
Reactを使うと、状態遷移の流れを書く必要性がなくなり、複雑なUIを簡潔にかけるようになる。
Knapsack2がやっと解けた

## 典型問題をちょっと変えただけなのになかなか手こずった話
典型的なナップサック問題をちょいっとひねった問題。具体的には、制約が異なる。普段通りのdp配列にidx,weightで二次元配列を作るだけだと上手くいかないよって問題。
以下問題
https://atcoder.jp/contests/dp/tasks/dp_e0

## 何が難しかったか
1. dpテーブルが異なること
制約が異なることでいつも作っているdpテーブルが作れないこと。さらに厳密に言うと漸化式が異なることが問題であった。典型ナップサック問題の考え方を理解していたが上手く解けなかった。

2. dpテーブルに格納する内容が直感と反していたこと
今回の問題ではidx、valueの二次元配列を作成する。ナップサック問題で重要視される要素はidx、weight、valueの三種類のため残ったweightを格納することになる。ここでweightの最小値か最大値かどちらを入れれば正常に動くか理解していなかった点である。


## 解決方法
典型ナップサック問題は配列の値に最大の価値を格納しそれを出力する。今回の漸化式で必要になる考え方も同様であるが、今回はその価値に対する重さを最小化することが目標となる。イメージとしては典型ナップサック問題ではナップサックの容量を変化させていくのに対して、この問題では価値を変更させていくのである。そして最後に全ての要素の最小値を見つけたところから探索しなければいけない点も問題を複雑化しているように感じた。

## まとめ
1. dpテーブルの配列番号に何を振るかをまず考えることが大事
2. 漸化式を作成したら、そのブロックはどのような値が入るか意識する
3. 最終的な値は$O(1)$で出ない可能性もあること
高次元乱数ベクトル生成〜Latin Hypercube Sampling・ラテン超方格サンプリング〜

# はじめに

高次元空間の問題の一つとして，球面集中現象が存在します．球面集中現象とは高次元空間では点の密度が $n$ 次元超立方体の表面において大きくなる現象を指します．この現象によって，高次元空間での探索やモンテカルロ法利用時に中心付近でのサンプル数が少なくなってしまうという問題が発生します[^1]．今回の記事ではこの問題を解決するためのサンプル方法の一つであるLatin Hypercube Samplingについて紹介したいと思います．その他にもSobol列を用いた有名なサンプル方法も存在します．

[^1]: 当然，空間上のどの点に関しても生起確率は一様ですが，非常に大きな空間で有限回サンプリングする場合，空間の中心付近におけるサンプル量が極端に疎となりやすく，結果としてモンテカルロサンプリングで収束が遅くなったり，精度が悪くなるというような影響が出ます．

# Latin Hypercube Samplingのアルゴリズム

$n$ 次元空間において，$M$ 点をサンプルする場合，Latin Hypercube Samplingではまず各軸を $M$ 個の格子に区切ります．下の図では，$n=2$，$M=5$の場合の例を上げました．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355593/97ed8f69-5c77-7749-74d0-076857fbacd2.png)

その後，各列から行がかぶらないように1つずつセルを選択します．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355593/3de76db9-ae93-104b-20ca-84acb0c7607c.png)

選択されたそれぞれのセルの中で乱数生成を行い，それをサンプル点とします．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355593/4f060df8-1497-9ee8-f3f5-af82651571a4.png)

これによって，少なからず重複したセルは選択されなくなるため，空間内において，ある点と最も近い点の平均距離はおそらくセルとセルの重心距離と近づくはず（実際には異なりますが，イメージです）．つまり，より少ないサンプルで空間をより均一に見やすくなるというイメージです．例えば，上の2次元の例では縁の正方形の数（A列，E列，1行，5行）は合計すると16個で，内部の正方形の数は9個です．単純な確率で考えると全てのサンプルが外側に固まる確率は

```math
\frac{{}_{16} C _{5}}{{}_{25} C _{5}} = \frac{16 \times 15 \times 14 \times 13 \times 12}{25 \times 24 \times 23 \times 22 \times 21}=\frac{8 \times 13}{5 \times 23 \times 11} \simeq 8.2 \%
```
となります．一方で，Latin Hypercube Samplingでは必ず各列からサンプルされ，行の重複は許されないので，全てのサンプルが外側に固まる確率は $0\%$ です．

ちなみに手元の手計算では，$n=3, M=5$ のときは，一様乱数で，$29\%$，Latin Hypercube Samplingで$25.9\%$の確率で全てが外に固まるみたいです．分割数が小さいとそこまで差が出ないみたいです．（あとで数値実験してみます．）

# Latin Hypercube Samplingのコード

念の為に，一様乱数と比較．サンプル数は250で青が一様乱数で赤がLatin Hypercube Sampling．図を見るとそこまで差があるようにも見えないですが，2次元なので仕方がないです．高次元の可視化が難しい以上，今回の検証ではここまでにしておきます．

![250.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355593/86b21877-353b-0915-fafd-ad01712faf60.png)

```python
import numpy as np
import matplotlib.pyplot as plt 


n = 2
M = 250

lb, ub = -5., 5.

f = lambda x: (ub - lb) * x + lb
g = lambda x: (x - rng.uniform()) / M
rng = np.random.RandomState()
rs = f(rng.rand(M, n))

rnd_grid = np.array([rng.permutation(list(range(1, M + 1))) for _ in range(n)])
lhs = np.array([[f(g(rnd_grid[d][m])) for d in range(n)] for m in range(M)])


fig, ax = plt.subplots(1, 2, figsize=(10, 5)) 
ax[0].scatter(rs[:, 0], rs[:, 1]) 
ax[1].scatter(lhs[:, 0], lhs[:, 1], color="red")

plt.show()
```
bundle installしてもpermissionsエラーが起きるときの対処法

#目的
iOSのアプリを複数人で開発するときにbundlerでCocoaPodsのバージョンを管理していると思います。

僕は普段個人でアプリ開発をやっていて複数人で開発するのは初めてなので、rbenvとbundlerをインストールしていたのですが、bundlerをインストールする際に以下のようなエラーが出て解決するのにだいぶ時間がかかってしまいました。


```
$ gem install bundler
ERROR:  While executing gem ... (Gem::FilePermissionError)
    You don't have write permissions for the /Library/Ruby/Gems/2.6.0 directory.
```

```
$ bundler -v
Traceback (most recent call last):
	2: from /usr/bin/bundler:23:in `<main>'
	1: from /Library/Ruby/Site/2.6.0/rubygems.rb:303:in `activate_bin_path'
/Library/Ruby/Site/2.6.0/rubygems.rb:284:in `find_spec_for_exe': Could not find 'bundler' (2.0.2) required by your /Users/ユーザー名/フォルダ名/Gemfile.lock. (Gem::GemNotFoundException)
To update to the latest version installed on your system, run `bundle update --bundler`.
To install the missing version, run `gem install bundler:2.0.2`
```

とりあえず、このコマンド打てばきっと解決するよ〜ってのを残しておこうと思います！
もし似たようなエラーが出ている方がいたら参考にしてください！
(ターミナルあまり使わないからかなり焦った。笑)

HomeBrewやrbenvのインストールがまだの人はこちらを参考にしてください！
[MacにHomeBrew,rbenv,bundlerをインストールする]
(https://qiita.com/shinkuFencer/items/3679cfd966f6a61ccd1b)

#原因
このエラーの原因はrubyが指定しているパスが違うからのようです！
実際にパスを調べると

```
$ which ruby
/usr/bin/ruby
```

`/usr/bin`の配下に出ると思います。

しかし、本当は`/Users/ユーザー名/.rbenv/shims`の配下にいる必要があります。
なのでパスを指定することで解決します。

#解決方法
rbenvにパスを通す必要があるので設定ファイルの`/.bash_profile`にパスを指定する処理を書きます。

処理を書くときに`/.bash_profile`のviエディタを開いて

```
export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init -)"
```

を書き加えるのですが、僕はviエディタの使い方がいまいち分かっていないので

```
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
```

ターミナル上に一つずつechoコマンドで書きました。
viエディタも使えるようにしたほうが良いと思いますが、ひとまずこれをコピペしてください！笑

次に以下のコマンドでシェルを再起動します。

```
$ exec $SHELL -l
```

これでrubyのパスを調べてみると

```
/Users/ユーザー名/.rbenv/shims/ruby
```

となっていると思うので、パスの指定は成功です！
あとは、以下のようにインストール、rebenvをリフレッシュをするだけです。


```
$ gem install bundler
```

```
$ rbenv rehash
```

以上でエラーは解決したので、CocoaPodsのインストールを行ってください！
インストールの仕方はこちらの記事を参考にしてください！
[bundler で cocoapods そのもののバージョン管理をする]
(https://qiita.com/shinkuFencer/items/821501cd0c5c460c1fea)

#参考にした記事
[rbenv+ruby-buildを使ってMacにRubyの環境を構築する]
(https://qiita.com/1000ch/items/a61e65fe82d8bdea840e)
[シェルを再起動させる簡単な方法]
(https://qiita.com/yusabana/items/c4de582c6f85a42817d8)

#さいごに
個人でアプリ開発していると自分だけがわかっていればいいから、と思って環境構築なんてあまり詳しくやってこなかったので躓いて解決するのにだいぶ時間がかかってしまいました。
もし同じところで困っている人の役に立てたら幸いです！
もし間違っているところなどありましたら教えていただけると嬉しいです！
ObservableObject利用時のView更新タイミングを細かく制御する

## 要点
- Publishedは使わず、ObservableObjectプロトコルで宣言されているobjectWillChangeを使って実装する
- Viewを更新したいタイミングでのみ、objectWillChangeのsendメソッドを呼ぶことで更新タイミングをコントロールできる

## Publishedを使うパターン

SwiftUIでは、View内で`@State`プロパティを定義して状態管理を行う方法の他に、別クラスに状態変数を集めて管理する方法もあります。
これは `ObservableObject` と `@Published` を組み合わせて使うやり方が一般的で、以下の実装手順で実現することが可能です。

**実装手順**
1. ObservableObjectに準拠させたクラスを定義
2. 状態の変更に応じてViewを更新させたいプロパティに `@Published` を与える
3. View側では1.のインスタンスをプロパティに保持しておき、`@ObservedObject` のアノテーションを付与する
→ `@Published`を付与したプロパティに更新が発生すると、その最新の値でViewが更新される

```swift
struct ContentView: View {
    // 状態変数をまとめて保持するインスタンス
    @ObservedObject var viewModel = ViewModel()
    
    var body: some View {
        VStack {
            // ViewModelのtitleプロパティに変更があると、自動でViewも更新される
            Text(viewModel.title)
            Button(action: {
                self.viewModel.onTapButton()
            }) {
                Text("Button")
            }
        }
    }
}

class ViewModel: ObservableObject {
    // ObservableObjectに準拠したクラス内の、@Publishedを付与したプロパティが監視対象となる
    @Published private(set) var title: String = "Hello, World!"
    
    func onTapButton() {
        self.title = "Hello, Published!"
    }
}
```

<img width="200" alt="image" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41486/e2b51600-d56a-c9e1-1da1-8b41eb1298e7.gif"/>


## Publishedを使わないパターン

`@Published` を付与するだけで自動で更新されるのはとても便利な機能ですが、
Viewの更新タイミングを制御して、特定のタイミングでのみViewを再レンダリングさせたいといったケースではどうすれば良いでしょうか。

これは、ObservableObjectプロトコルで宣言されているobjectWillChangeを使って実装することで実現可能です。

**実装手順**
1. ObservableObjectに準拠させたクラスを定義
2. `ObservableObjectPublisher` 型の `objectWillChange` プロパティを定義
3. 特定の値が更新される直前のタイミングで `send` メソッドを実行
→ データ更新後の最新の値でViewが更新される

```swift
import Combine

class ViewModel: ObservableObject {
    // ObservableObjectプロトコルへの適合
    private(set) var objectWillChange = ObservableObjectPublisher()
    
    private(set) var title: String = "Hello, World!" {
        willSet {
            // データの更新が発生する直前のタイミングでイベントを発生させる
            self.objectWillChange.send()
        }
    }
    
    func onTapButton() {
        self.title = "Hello, ObservableObjectPublisher!"
    }
}
```

<img width="200" alt="image" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41486/167976de-088e-eab6-5d26-843a58009f5a.gif"/>

上記のコードは `@Published` を付与して実装したパターンと同じ挙動になりますが、
`send` を明示的に呼び出す実装に変えたことにより、Viewの更新タイミングを条件で制御することができるようになりました。
これにより、Viewの更新タイミングを細かくコントロールすることが可能になります。

```swift
// example
private(set) var title: String = "Hello, World!" {
    willSet {
        if tapCount == 2 {
            self.objectWillChange.send()
        }
    }
}
```

## 余談
ちなみに、 `send` の制御を入れていたとしても、別で `@State` プロパティを定義していた場合、
その値に更新が入ると `send` の実行を待たずして、対象のプロパティが参照されてしまいます。

## サンプルコード
https://github.com/chocoyama/NotifyManually