OmniAICreator/Qiita-1.07M huggingface dataset:
Railsで開発環境毎に定数の値を変更する

開発用の環境や本番環境などの環境毎に定数の値を変えたいことってありますよね？
そんな時、 `config_for` を使えば良い感じに実装できます！

# まずは定数を定義するファイルを作成
`config` ディレクトリ以下に、環境毎に内容を変えたい定数を定義したファイルを作成します。
YAML形式のファイルとなり、ファイル名は任意です。

```config/hoge.yml
development:
  fuga: 3000
  piyo: true
production:
  fuga: 1000
  piyo: false
```

# 定義したファイルを読み込み
先程作成した `config/hoge.yml` を `config/application.rb` に追記して読み込みます。
`config.x.hoge = config_for(:hoge).symbolize_keys` という一行を追加します。
`hoge` の部分は先程作成したファイル名と同じものにしてください。

```config/application.rb
module Bar # module名は作成したプロジェクト毎に変わります
  class Application < Rails::Application
    config.load_defaults 5.1

    config.autoload_paths += Dir[Rails.root.join("app", "models")]
    config.api_only = true

    # 下の一行を追加
    config.x.hoge = config_for(:hoge).symbolize_keys

  end
end
```

# 実際に利用する
定義した定数は下記のように呼び出します。
controllerやmodel等で利用できます。

```ruby
hoge = Rails.configuration.x.hoge
puts hoge[:fuga] # development環境で3000、 production環境で1000 と表示
puts hoge[:piyo] # development環境でtrue、 production環境でfalse と表示
```

簡単に利用できるので、とても便利です！
年末まで毎日webサイトを作り続ける大学生 〜26日目 CSS Animationで遊ぶ〜

##はじめに
こんにちは！最近週末は温泉に通っている@70days_jsです！
今日はCSS Animationを使ってサイトを作りました。
扱う技術レベルは低いですが、同じように悩んでる初心者の方を勇気付けられれば幸いです。
今日は26日目。(2019/11/13)
よろしくお願いします。

##サイトURL
https://sin2cos21.github.io/day26.html


##やったこと
CSS Animationを使ってサイトを作りました。
まずはgifをどうぞ↓
![test.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/516248/e9a69e54-0725-037a-2c8f-25cc7f61e35e.gif)

昨日に引き続き、またテント泊を使ってしまいました。（もちろんフレキシブルです）

さて、CSS Animationは、@keyframesと、3種類のプロパティ（animation、transition、transform）を使うことで実現できます。プロパティの特性をざっと見てみましょう。

1. animation・・・アニメ的な動き（片道運動）
2. transition・・・animationの下位互換（往復運動、だからhoverとかと合わせるとよく見える)
3. transform・・・変形（移動・回転・拡大）

イメージこんな感じですが、いまいち本質が掴めていないのでとりあえず暫定的に捉えています。W3Cはどういう意図を持って3つのプロパティを用意したのでしょうか・・・。

ちなみにtransformプロパティはすでに昨日のテキスト on 画像で、position: absoluteのテキストを中央配置するために使っています。これ↓
> transform: translateY(-50%) translateX(-50%);


では次に実装を紹介していきます。
基本的に、@keyframesでアニメーションの流れを記述して、3つのプロパティで要素や実行時間を指定します。（今回使ったのはanimationプロパティです）

例えばgifに載せたものですと、一番最初に白い四角が出てきて画面が4分割されるところの@keyframesはこうです↓

```css
@keyframes test {
    0% {
        background-color: black;
        width: 10px;
        height: 10px;
    }
    50% {
        background-color: rgba(255, 255, 255, .8);
        width: 50vw;
        height: 20vh;
    }
    100% {
        background-color: rgba(255, 255, 255, 1);
        width: 50vw;
        height: 50vh;
    }
}
```

@keyframesの後に自分でアニメーション名をつけられます。今回はtestとしました。
その中に0%~100%時のアニメーション動作を定義できます。
要素を指定してアニメーションを適用する方法も簡単です。↓

```html

<body>
    <div class="test"></div>
    <div class="test2"></div>
    <div class="test3"></div>
    <div class="test4"></div>
    <div class="test5"></div>
    <div class="test6">
        <img class="background_image" src="day24_image/photo4.jpg" alt="テントの画像">
        <h2 class="text_on_image">テント泊</h2>
    </div>
```

例えばclass="test"にアニメーションtest（ややこしくてすみません）を適用したい場合こう書きます↓

```css
.test {
    position: absolute;
    bottom: 0;
    right: 0;
    animation-name: test;
    animation-duration: 5s;
    animation-delay: 1.5s;
    animation-fill-mode: forwards;
}
```
> animation-name: test;

このプロパティが、名前testの@keyframesを使うということを表しています。
durationはアニメーションの時間です。0%~100%までの時間をここで記述します。
delayはアニメーションを遅らせることができます。上の書き方だと1.5秒遅れて動き出します。
最後に重要なのが、animation-fill-mode: forwards;ですが、これはアニメーションが終わった後に@keyframesで定義した100%の状態のままにしておくということを表しています。これがなければアニメーション以前の状態に戻ってしまいます。
今回のものは大体これの繰り返しで作りました。もし興味があればサイトからgithubを辿りソースコードをご覧ください。


##感想
アニメーションは使っていてとても楽しかったです。cssは色々なことができるイメージがありますが、中でもアニメーションの貢献がかなり大きいんじゃないかなと思いました。
JavaScriptと組み合わせるとほぼなんでもできる気がします。

最後までお読みいただきありがとうございます。明日も投稿しますのでよろしくお願い致します。


##参考
1. マウスhover時のCSS3 transitionとanimationの違い | q-Az (https://q-az.net/mouse-hover-transition-or-animation/)
2. 【CSS3】@keyframes と animation 関連のまとめ - Qiita (https://qiita.com/7968/items/1d999354e00db53bcbd8)

とても勉強になりました。ありがとうございます！
ターミナルからScalaプログラムを作成&実行

Scalaとついでにvim?vi?も触ります
初めてvim使いました

### ソース
https://docs.scala-lang.org/getting-started/sbt-track/getting-started-with-scala-and-sbt-on-the-command-line.html
https://www.scala-exercises.org/scala_tutorial/lexical_scopes

### いろいろインストール
#### 1. Java 8 JDK (version 1.8)
https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

入ってるかどうかの確認

```bash
$ javac -version
javac 1.8.0_231 # 1.8.以降はなんでもよい
```

#### 2. scala 

Homebrewでscalaをインストールします
これでターミナルからscalaプログラムをコンパイル&実行できるようになります

```bash
$ brew install scala
```

自分のPCだとこういう感じの結果になりました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430849/9d827428-1efe-be85-04bb-0f9f9a272cfa.png)

#### オプション sbt

のちのちscalaを開発予定なら必要なやつですが、とりあえず今回のプログラムにはいらないです
ビルドツールというものらしいです（よくわかっていない）

```bash
$ brew install sbt
```

### ターミナルで.scalaファイルを作成

短いファイルなので、vimとやらを使ってみます
エディタを開かなくて良いので便利です

ターミナルで好きなディレクトリに移動します
わたしは `~/scala` というところで作業したいので

```bash
# ルートディレクトリにいます
$ mkdir scala
$ cd scala
```

ここで.scalaファイルを作ります
ファイル新規作成のコマンドは`touch`なので

```bash
$ touch hello.scala # helloというファイル名のscalaファイル
```

で、このファイルをvimというターミナル上のエディタで開きます
コマンドは`vi`か`vim`です、2つの違いはわかりません

```bash 
$ vi hello.scala
```

するとこんな画面が開きます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430849/70c9caf2-6477-5b43-aa7e-59c50c75481d.png)

ここにソースコードを入力していきます
入力するものは

```hello.scala
object Hello {
  def main(args: Array[String]) = println("hello qiita!")
}
```

普通にキーボード叩いて打って大丈夫です

vimでファイルを保存&エディタを閉じるときは、`:wq`というvimのコマンドを打ちますが、下の画面のように　 `-- INSERT --`という表示されていると、打ったものはコマンドとして認識してもらえません

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430849/f605ed0f-e56b-0d80-2ad2-55998ea21caf.png)

なので、コードを入力し終わったら、**Escキーを押してから**`:wq`と打ちます

すると、元のターミナルに戻れます

### コンパイル & 実行

scalaプログラムは、コンパイルしてから実行します
ターミナルで次のように打ちます

```bash

$ scalac hello.scala # コンパイル
$ scala Hello # 実行
hello qiita! # これが出力されるはず
```

### ちょっと解説

ソースコード再掲

```
object Hello {
  def main(args: Array[String]) = println("hello qiita!")
}
```

この `Hello`というオブジェクトは、中に`main`メソッドを持つので、ターミナルから`scala`コマンドで呼び出せます


おわり。
複数ファイルを選択して一気に印刷するAppleScript

ダイアログで複数のPDFファイルを選択して，一気に印刷する。
Finderからの直接印刷だと，両面印刷等の設定を反映できない。
なので，Preview.appで開いて印刷して閉じる，というプロセスを繰り返すことにする。
ほぼ自分用メモ。

```applescript
tell application "Finder" to set loc to target of window 1 as alias
set PDFs to choose file with prompt "印刷するファイルを選んでください。" of type {"PDF"} default location loc with multiple selections allowed

set br to button returned of (display dialog "印刷前にダイアログで確認する？" buttons {"キャンセル", "しない", "する"} default button 3)
if br = "する" then
	set showDialog to true
else if br = "しない" then
	set showDialog to false
else
	error number -128
end if

repeat with aPDF in PDFs
	tell application "Preview"
		activate
		open aPDF
		
		try
			if showDialog then
				print window 1 with print dialog
			else
				print window 1
			end if
		end try
		
		close window 1
	end tell
end repeat
```
# ファイルを選択させる。
`choose file`でファイル選択ダイアログを開くことができる。
このとき，最初に表示するフォルダを`default location`で指定することができる。
そこで，Finderで一番手前のウィンドウのフォルダを初期表示させることにしてみる。冒頭の`tell application "Finder" to set loc to target of window 1 as alias`がそれで，つまり，Finderの一番手前のウィンドウの`target`を`alias`形式で取得して，変数`loc`に格納する。
#印刷時にいちいち確認するかどうかを確認する。
やっぱり最初は不安なので，印刷ダイアログで確認するかどうかを選びたい。
なので，`showDialog`（ダイアログを見せる？）というBooleanな変数を作ることにする。ついでに，ここで引き返せるようにしておく。
ようけ考えると，むしろこの後の印刷プロセスで問うた方がUIとして優れているかもしれない。
#Preview.appで開いて印刷して閉じる。
前の`showDialog`変数の値によって，ダイアログをいちいち表示するかどうかを変える。
ちなみにファイルを開くときはファイルのエイリアスを指定するが，閉じるときは`close window 1`だ。
人感センサーモジュールで人を検知

#きっかけ

僕「人が近くを通ったら何か動く仕掛けがあると面白いな」
僕「人感センサ結構安く売ってるやん」



#用意したもの

・RaspberryPi
・人感センサー
・ジャンパワイヤ
・ブレッドボード
・LED


人感センサはこんな感じ


<img width="400" alt="IMG_3180.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513034/2d1d6b20-cd27-0072-61af-9de2eaaea3b0.jpeg"> <img width="400" alt="IMG_3179.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513034/ec130492-1741-ae14-204f-0cba95ac9dce.jpeg"> 

カバーが取れるみたい(あんまり取らないほうがいいと思うけど)
秋葉原の千石電商で800円ぐらいで売っていた
(Amazonだともっと安いかも)

製造元のサイトを見るとセンサーが反応する範囲は
・3～7ｍ
・センサーを起点に120°
(https://www.seeedstudio.com/PIR-Motion-Sensor-Large-Lens-version.html)

裏側はこんな感じ
<img width="400" alt="IMG_3184.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513034/6a658c3c-da7f-9ffa-55fe-02018f8dbde9.jpeg">
何か動きを感知するとOUT端子の電圧がHighになる
ラズパイのGPIO等で信号を入力させて何かのトリガーにすると面白いかも


#手順
##接続

LEDと接続してセンサーが作動するかテストする
今回は適当に抵抗とかは接続せずに直接やった(気にする人は抵抗入れると良いかも)

<img width="600" alt="human_sensor.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513034/cfde50d1-7162-0708-7d9b-d385aea876c2.png">

|端子|色|接続先|
|:-:|:-:|:-:|
|Vcc|赤|5 V電圧源|
|OUT|黄|LEDのアノード|
|GND|黒|GND|

<br/>
実際にセンサー信号でLEDを光らせるとこんな感じ(ごちゃごちゃしててすみません)
<img width="600" alt="IMG_3194.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513034/bb72e4dd-16a5-b42c-5886-3afe6d1489e8.jpeg">

結構反応が良い
<br/>
次にラズパイのGPIOにつなげる
今回はこんな感じで接続

|端子|色|接続先|
|:-:|:-:|:-:|
|Vcc|赤|5 V電圧源|
|OUT|黄|GPIO 16|
|GND|黒|GND|

##GPIOで入力した信号を検知するプログラム

ただのGPIOの入力状態を検知するプログラムをpythonで書く

```human-sensor.py
# -*- coding:utf-8 -*-
import time
import RPi.GPIO as GPIO

sensor_pin = 16

GPIO.setmode(GPIO.BCM)
GPIO.setup(sensor_pin, GPIO.IN)


while True:
    if( GPIO.input(sensor_pin) == 0 ):
        print ("OFF")
    
    else:
        print("ON")
        
    time.sleep(1)
```


プログラムを走らせると...

```
root@raspberrypi:/home/pi# python3 human-sensor.py 
ON
ON
OFF
OFF
OFF
OFF
OFF
ON
ON
OFF
ON
ON
ON
OFF
ON
ON
OFF
ON
ON
```

人感センサの感知に合わせてGPIOの入力値を取得することができた
<br/>
今後は何かと組み合わせて面白いものを作りたいと思います



#参考にしたサイト

・センサーの製造元のサイト
https://www.seeedstudio.com/PIR-Motion-Sensor-Large-Lens-version.html


ありがとうございました
【JavaScript】JavaScriptはconsole.log('hoge')でデバッグするよりdebuggerの方が便利では？

## 最初に
正確な正しい説明とかはドキュメントを見た方がいいと思います。
初心者でも何の気なしに読めるものを目指してます。
自分の知識不足もあり至らぬことも多々あるかと思いますので、
そういうものをお求めでない方にはお目汚しになるかと。

## debuggerなら処理を止められる＋そこで変数の中身を見られる
デバッグする時って最初のうちはこうやりがちだと思います。

```javascript
// 〜処理〜
console.log('hoge');
// 〜処理〜
```

でも、こうした方が便利かも知れません。

```javascript
// 〜処理〜
debugger
// 〜処理〜
```


## Ruby on Railsのbinding.pry、byebug、Laravelのtinkerみたいな感じ

最近だとRuby on RailsやLaravelからプログラミングを始める人も多いと思います。

JavaScriptのdebuggerはそれらの
**・binding.pry**
**・byebug**
**・tinker**
みたいなものだと思ってもらえるとわかりやすいです。

## イメージ画像

debuggerで処理が止まっている状態
<img width="337" alt="debugger.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431639/e5fb1840-0d02-97bd-25f6-eb8f556600fc.png">

変数の中身を見られる
![2019-11-13 22.54.26.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431639/d3c75aba-1e2c-c947-5e03-085aa4ea9ad9.gif)

## 最後に
console.log()も使うべき場所では非常に便利ですが、
慣れてきてサクッと使うにはこちらの方が楽ではないでしょうか？
Pythonで関数型プログラミングのパイプやってみる

## パイプ処理
関数型言語のパイプ処理をPythonで考えてみる。

理想は、
`result = [3,1,2] |> sorted |> reversed ## [3,2,1]`


## 実装
- 独自クラスで値と関数とラップする。
- 「｜＞」は、演算子にない。
  → 「>>」で代用。


# 独自クラスPIPE
```python:PIPE.py
# >> でパイプ処理
class PIPE:
    def __init__(self, val):
        self.val = val

    def __rshift__(self, other):
        if callable(other.val):
            return PIPE(other.val(self.val))
        return other.val
        
    def __str__(self):
        return str(self.val)
```

## Usage
```Python
result = PIPE([3,1,2]) >> PIPE(sorted)
print(result) # [1, 2, 3]
```

### sample1
```Python
# lambdaもfunctionも使える。
# printも。
_ = PIPE([3,1,2]) \
    >> PIPE(sorted) \
    >> PIPE(reversed) \
    >> PIPE(lambda lst: [l+1 for l in lst]) \
    >> PIPE(list) \
    >> PIPE(print) # [4, 3, 2]
```

### sample2
```Python
## printでformat使いたい時。
_ = PIPE({"K0":1, "K1":2}) \
    >> PIPE(lambda d: sum([v for k,v in d.items()])) \
    >> PIPE(lambda s: "sum is {}".format(s)) \
    >> PIPE(print) # sum is 3
```

### sample3
```Python
_ = PIPE({"K0":1, "K1":2}) \
    >> PIPE(lambda d: {k:v+1 for k,v in d.items()}) \
    >> PIPE(lambda d: {k.replace("K", "KEY"): v for k,v in d.items()}) \
    >> PIPE(print) # {'KEY0': 2, 'KEY1': 3}
```


## まとめ
- パイプ処理できた。
- `print(list(reversed(sorted([3,1,2]))))`より見やすい。
- 行末の「\\」を忘れがち。
- 意外に汎用性が高い気がする。
Git で Azure DevOps / GitHub に同時プッシュする

#複数レポジトリに Push する
最近 Azure DevOps と GitHub をどちらも使うことが多くなりました。今後二つのロードマップがどのようになってくるかは分かりませんが、重要なコードについては念のためどちらも同じようにレポジトリを残しておきたいなぁと思ったりします。
そんなときは、複数レポジトリに同時プッシュするのが便利です！手順は以下のようなイメージ。

まずは、Azure DevOps と GitHub のレポジトリを作成します。
仮で以下二つのレポジトリを作成したとしましょう。
- Azure DevOps : https://komiyasa@dev.azure.com/Douji/_git/Douji
- GitHub : https://github.com/komiyasa/Douji.git

次に、ローカル環境で Azure DevOps のレポジトリをクローン(もちろんローカルでの `git init` が先でもOK)

```
git clone https://komiyasa@dev.azure.com/Douji/_git/Douji
cd Douji
```

そのあとで、以下を実行します。

```
git remote set-url --add --push origin https://github.com/komiyasa/Douji.git
```

`git remote - v` で確認すると、`push` がひとつだけに設定されています。以下コードを再度実行します。


```
git remote set-url --add --push origin https://komiyasa@dev.azure.com/Douji/_git/Douji
```

`git remote -v` で確認すると、`push` に指定した二つのレポジトリが含まれていることが確認できるかと思います。
これで Push すれば二つのレジストリに同時 Push が可能です！

#参考
gitで複数リポジトリに同時にプッシュしたい
https://blog.okazuki.jp/entry/2016/09/19/010232
Zsh環境でインストールしたコマンドが即認識されない状況への対処

## 新しくインストールしたコマンドが即認識されない

**環境**

- macOS Mojave (Ver. 10.14.6)
- macOS標準Terminal

本投稿を書いている日(2019/11/13)の前日から「Zsh」を初めて使ってみている。

先人の環境構築How To記事を参考に無事にインストール完了。

さっそくZsh環境で個人開発を進めて行こうと張り切って「brew install ○○」と打ち込みとあるコマンドを導入し、そのまま同じターミナルで即そのコマンドを実行しようとしたところ**「そのコマンドは見つからない」**と言われてしまった。

はて？と思い、bash環境で同様に「brew install ○○」を試すと問題ない。
なんとも不便だと思いながら色々調べてみると、どうやらZshの問題らしい。

## rehashする

参考 : [コマンド入力を自動化する(シェルスクリプト) : Ippei Kishida](https://lab.kuas.ac.jp/~ippei94da/unixtodaystips/shellscript.html)

> rehash はコマンドサーチパス内のコマンドを再読み込みしろ、という命令です。 zsh は起動したときのコマンド情報しか持っておらず、 ~/bin/runvasp はたった今追加されたのですから、 これを追加してやる必要があったわけです。

rehashという操作が必要だとのこと。
では、これを実際にZshに組み込むにはどうしたらいいか。

## .zshrcまたは.zshenvに設定を追加

ズバリ解決策が見つかった。

参考 : [zshが新しくインストールしたコマンドを認識しない問題への対処 : senooken.jp](https://senooken.jp/blog/2014/05/10/)

さらに、上記記事の参考元

参考 : [Rebuild auto-complete index (or whatever it's called) and binaries in $PATH cache in zsh : Stack Exchange](https://unix.stackexchange.com/questions/2179/rebuild-auto-complete-index-or-whatever-its-called-and-binaries-in-path-cach)

上記2つの記事を参考に、同様に設定を「.zshenv」に記述した。

```zsh:.zshenv
zstyle ":completion:*:commands" rehash 1
```

こちらの設定後、問題なく「コマンドインストール、即認識」される状態となった。

改めて先人の情報に感謝申し上げる。
picoCTF 2019 c0rrupt - Points: 250

#問題

https://2019game.picoctf.com/problems

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/03db99e8-c7b4-075c-05eb-4a7e46de101a.png)

#解いてみた

ファイルをbzで開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/2eeb2026-df24-bb27-2503-d40c83baacfe.png)

なんでしょうこのファイル。

fileコマンド打ってみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/4c4e465d-aebd-485e-26fe-a9c1f72e5ed9.png)

謎。
青い空を見上げればいつもそこに白い猫使ってみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/b38cb511-5237-f70c-2dab-11b440dfa40d.png)

結果が空欄になるの初めて見た。
ヒント見てみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/42070f5d-fd23-ae62-4226-e924616810b3.png)

何のファイルかわからないのに修正することなんて可能か？
先頭がだめなら最後のHexを検索してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/080820c0-535c-1396-30a9-4782892bf02f.png)

「ae 42 60 82」で検索するといい感じのサイトが見つかりました。

PNGのファイル構成 : 調べた事を書きとめる備忘録 - Livedoor
http://blog.livedoor.jp/cperl/archives/21945651.html

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/4c781627-b9a5-d67a-b4cc-73b108c8dcc9.png)

後ろは全部一致しますね。
先頭が異なるのでこれを書き換えればいい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/2a64c0b4-e48a-011c-7b97-d3c348810b01.png)

こんな感じでしょうか。
これの拡張子をpngにして開いてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/df91a0c5-2254-a8f2-df14-c36f7b54a806.png)

ダメでした。
SIGNATUREの後にあるIHDRも編集しないといけないということでしょうか。

IHDRについて調べてみると参考になるサイトを見つけました。

PNGのチャンク(IHDR)
https://www.setsuki.com/hsp/ext/chunk/IHDR.htm

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/b43cfb3d-b97f-3347-ec88-efc4c32c70a6.png)

これに従ってChunk Typeを書き換えます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/a7f36857-cdb8-f69f-ef98-c70509019e71.png)

これで再度開いてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/0650d8a6-9a2e-b907-f928-8a2718c0db54.png)

まだでした。
同じサイトに全体像が書いてありました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/c4e252ac-4130-c8d1-5331-d8235b92c0d1.png)

これを見るとIDATも確認する必要がありそうです。
仕様を確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/eb8f3d67-2851-5d1b-282e-bda1f52bb978.png)

Chunk Typeが固定値なのでこれの修正が必要な気がします。

位置が固定ではないので定かではないんですが、たぶん大体あってるここだと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/7560b83d-3061-8e6b-ba4f-26d133df04c5.png)

ここを修正します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/27639f88-9684-2101-4532-a4efa15a012f.png)

できました。
これを開いてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/3dea7cbc-fb63-60ea-e495-f15f1c9814d2.png)

できました。
VBAで文字列、数値をSQLのIN句に入れる形にする

2019/12/19追記：下記コードの改善版でも記事を書いてみましたのでよろしければご確認ください。[シートを汚さずにクリップボードに直接放り込む](https://qiita.com/hoshizima/items/eefc5963c7183f2eb9e9)

初投稿です。
#前書き
私は業務でSQLを触るが、文字列を「'」で囲み「,」で区切るのが面倒でした。サクラエディタでAlt+ドラッグで複数行選択して付けていたがそれも面倒になってきたので作成しました。
#Selection.Valueの値を文字列連結で変形
```vb:StringStyle.bas
Sub StringFormat()

    Dim longNum As Long
    Dim strValue As String
    
    strValue = Selection(1).Value
    strValue = "''" & strValue & "'"
    Selection(1).Value = strValue
    
    For longNum = 2 To Selection.Count Step 1
        strValue = Selection(longNum).Value
        strValue = ",'" & strValue & "'"
        Selection(longNum).Value = strValue
    Next
    
End Sub
```

#後処理
証跡としてデータを綺麗にしたいときは下記。
```

```vb:StringCleansing
Sub StringCleansing()

    Dim longNum1 As Long
    Dim intLength As Integer
    Dim strValue As String
    
    For longNum = 1 To Selection.Count Step 1
        strValue = Selection(longNum).Value
        intLength = Len(Selection(longNum).Value) - 2
        strValue = Mid(strValue, 2, intLength)
        Selection(longNum).Value = strValue
    Next
    
End Sub
```

#あとがき
クリップボードに入れる際に付加すればこんな二度手間いらないかなと書き終わった今思いました。
そもそもVBAでDBに直接接続してデータを抽出するのが一番楽なのだと思いますが、DB（Oracle）に接続する段階で詰まっており、とりあえず今はこれで対応しています。
精進いたします。
メモ(YAML関連)(シードファイル・フィクスチャファイル)(スキーマも)


テストを書く際に、使用するYAMLの書き方がわからなくなったので整理してみた。
関連づけがある場合どうすりゃえんや

ActiveRecord経由でDBに接続するには、
config/ymlで

##YAMLとは
構造化データの記述に適したファイル形式
構造をインデントや、記号で表現する

パラメーター名：値
の形式で表すのが基本

例えば

```ruby:
production:
 database: db/production.sqlite3
```

これはproductionパラメータのサブパラメータdatabaseを表す。
値はdb/production.sqlite3

インデントは必ず空白で表現する(一般的には半角スペース二つ)



##シードファイルとフィクスチャ
スキーマ用意後　→　データを初期化する必要性
　ここで、データを初期化するために、シードファイルか、ファイクスチャと言う二つのアプローチを提供


・フィクスチャは**テストデータの投入**に使う
・シードは**マスターテーブルの初期データを投入**するために利用するのが基本

##シードファイル
単なるrubyのスクリプトコード
Rubyで生成/保存するコードを記述していくだけでok

```
Book.create(id:1, isbn: '0843-4398-39', price: '技術評論者')
```
みたいな感じで・・・

```ruby:
rails db:seed
```
で実行

##フィクスチャ
こちらはYAML形式で記述可

例

```YAML:books.yml
modernjs:
  id: 1
  isbn: 43u2843929
  title: アイウエオ
↑ここ半角2つスペース
```
みたいな感じで・・・

###注意：外部キーは　モデル名：参照先のラベル　で表現される

```YAML:user.yml
wataru:
  name: wawataru
  email: wawataru.jp
```

```YAML:post.yml
post1:
  title: アイウエオ
  user: wataru　　　←ここね！！！
```
user: 1とかすると、id情報を意識せなあかんくなって面倒
ラベルによる関連づけしたいときは、id明示せず、Railsで勝手にやらせる


##スキーマファイルとは
(スキーマの更新履歴を表すマイグレーションファイルとは別)
最新のスキーマ情報を表すのがスキーマファイル
→マイグレーションファイルの集合とも言える
現在のDB状態を示す

※idはスキーマファイルには表示されない
GroceryCRUDで画像アップロードするときにset_field_uploadで軽くハマった

今まで自分メモばかりだったが、過去の自分のような初心者に役に立つことを願って、主に自分メモ的な投稿を初めてみる。

PHPでCodeIgniterの簡易DB編集ライブラリ的な存在である「GroceryCrud」。

ちょっと古くてマイナーで今更感があるが、コスパが良いので省エネ的に管理画面を作るのに活用している。

そのGroceryCRUDで画像をアップロードするset_field_upload関数があるが、
アップロードしてもある拡張子やサイズが上手くアップできず、画面上にも何もエラーが出ない。

set_field_upload関数
https://www.grocerycrud.com/documentation/options_functions/set_field_upload

`$crud = $this->generate_crud('blog_posts');
$crud->set_field_upload('file1','assets/uploads','pdf|doc|docx|xls|xlsx|ppt|pptx|zip');
$crud->display_as('file1', '資料1');
`

設定箇所が複数あるので、ログとソースをackして回る。

### 許可する拡張子とアップロード許可サイズの制限緩和

jquery.fileupload.config.js をみると、
許可する拡張子は config/grocery_crud.php から取得しているらしい。

`$config['grocery_crud_file_upload_allow_file_types'] 		= 'gif|jpeg|jpg|png|tiff|doc|docx|txt|odt|xls|xlsx|pdf|ppt|pptx|pps|ppsx|mp3|m4a|ogg|wav|mp4|m4v|mov|wmv|flv|avi|mpg|ogv|3gp|3g2';
$config['grocery_crud_file_upload_max_file_size'] 			= '100MB';`

上記設定変更して進んだが、まだエラーが出る。

アップロード許可サイズが20MBまでというエラー内容。
$config['grocery_crud_file_upload_max_file_size']以外にも設定箇所があるらしい。

### php.ini 設定変更

そして、apacheのssl_error_logをtailすると、下記エラー内容。

`[Wed Nov 13 12:48:36.362492 2019] [:error] [pid 30622] [client xx.xx.xx.xx:xxxxx] PHP Warning:  POST Content-Length of 26961156 bytes exceeds the limit of 8388608 bytes in Unknown on line 0, referer: https://example.com/admin/blog/post/edit/102`

それで下記の記事を見て、/etc/php.iniのpost_max_sizeを編集した。
https://qiita.com/N_baconham/items/5d79d0e64e5d3939b075

`upload_max_filesize=100M
post_max_size=100M
memory_limit=100M`

変更してapache再起動。

`apachectl restart`

そして、再び100MB近い91MBのpdfファイルを、、
set_field_uploadでアップロードできた！解決

追記：

動作画面のイメージも、下記のページから引用しておくので、管理画面をスクラッチで書いている過去の私のようなあなたは、ぜひ導入してみて。

https://www.grocerycrud.com/examples/set_upload_field_example/
![set_field_upload_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130816/a2512ce3-5d00-fa9e-caa5-67a7bd47662b.png)
![set_field_upload_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130816/72c9b7ad-004e-f599-5908-83519902071e.png)
![set_field_upload_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130816/fbfdf07f-21ff-71bb-da40-871de03713e8.png)
![set_field_upload_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130816/0f14f168-0520-09b5-ebb9-4db033a061d3.png)
![set_field_upload_5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130816/d976733b-2e7c-5313-7726-9b50502cf43f.png)

もっといいライブラリとかオススメ情報も待ってます。
gcloud logging コマンドを使ってk8sコンテナとロードバランサーのログを結合する

# 目的

コンテナのエラーログとロードバランサーの500系のレスポンスを時系列で見比べたい

# やること

`gcloud logging` コマンドでStackdriverからk8sコンテナとロードバランサーのログを期間指定して、tsv形式で出力する

# テンプレート

```
PROJECT_ID=my-project
START_UTC_TIME_PRIOD="2019-11-13T01:00:00Z" 
FRESHNESS="23h"
TAB=`echo "\t"`
gcloud beta logging read \
'(
  resource.type=k8s_container
  resource.labels.cluster_name=[CLUSTER_NAME]
  resource.labels.namespace_name=[NAMESPACE]
  resource.labels.container_name=[CONTAINER_NAME]
  severity>=WARNING
  timestamp>="'"$START_UTC_TIME_PRIOD"'" 
) OR (
  resource.type=http_load_balancer
  resource.labels.forwarding_rule_name=[LOADBARANCER1]
  resource.labels.forwarding_rule_name=[LOADBARANCER2] 
  httpRequest.status>=500 
  httpRequest.status<=599 
  httpRequest.userAgent!="Slackbot-LinkExpanding 1.0 (+https://api.slack.com/robots)" 
  timestamp>="'"$START_UTC_TIME_PRIOD"'" 
)' \
--project=$PROJECT_ID \
--order=asc \
--format='csv[separator="'"$TAB"'"]
(
timestamp,
httpRequest.status,
httpRequest.requestUrl,
textPayload,
resource.labels.cluster_name,
resource.labels.container_name,
resource.labels.location,
resource.labels.namespace_name,
resource.labels.pod_name,
resource.labels.project_id,
resource.type,
labels."k8s-pod/app",
labels."k8s-pod/pod-template-hash",
logName,
insertId,
receiveTimestamp
)' \
--freshness="$FRESHNESS" \
| gsed -z "s/\n\"/\"/g" \
> gcloud-logging.tsv
```

# 説明

`gcloud logging read` でログエントリの取得ができる。

## フィルタ

第1引数はフィルタを指定する。コンソールの Stackdriver logging のフィルタと同様に、フィールド名が同じ条件は暗黙的にANDで結合され、そうでない場合はORで結合される。今回はリソースが違うログを結合するために、コンテナに関する条件とロードバランサーに関する条件をそれぞれ `( )` でくくって `OR` で結合した。この `OR` は明示的に書かなければならない。
また、時間の指定はオプションではなくフィルタで行う。例えば、`2019年11月1日 12時34分56秒から` という条件は↓のように書く。また、`:`はエスケープしなければならないため、ダブルクォートで囲む
`timestamp>="2019-11-01T3:34:56Z"`
JSTからUTCに変換しないといけないことに注意する。
`httpRequest.userAgent!="Slackbot-LinkExpanding 1.0 (+https://api.slack.com/robots)"` の部分についてだが、Slackでリンクを共有した際にサムネイルを表示するためにSlackがアクセスしてエラーのレスポンスを返すログへの対策である。

## 期間の指定

期間の終了時間を指定せずに期間の長さを指定したいときは `--freshness` オプションを付ける。 `--freshness="3h"` を付けると直近3時間のみを取得する。
最新のログまでを取得したい場合は適当に大きい値を指定しておけばいい。

## 出力フォーマット
`--format='csv[separator="'"$TAB"'"](...)` は出力をタブ区切りに指定するオプション。`--format='value[separator="'"$TAB"'"](...)` でも可能だが、ヘッダーが付加されないのと、quoteを指定しないとタブや改行の区切り文字が含まれているときにダブルクォートでくくってくれないという問題がある。 `( )` の中は出力するkeyの名前を列挙する。たくさんある場合はStackdriverで確認しながらだと捗る。
TAB変数を宣言しているのは、色々と試行錯誤しているうちにタブ文字が気づいたらスペースになってしまい、出力ファイルのスペースをタブに変換するために十数分待つ羽目になるという自体を防ぐ目的がある。やってしまうと結構辛い。

## その他

`--project=$PROJECT_ID` はフィルタの後に渡す。 `gcloud` の直後に指定するとログの取得ができなかった。
デバッグ中は `--freshness` を小さくしたり、 `--limit` で出力件数を少なくすると多少はレスポンスが早くなる。

## ログの整形

`gsed -z "s/\n\"/\"/g"` は ダブルクォートの前にある改行を消すというスクリプトである。本来はtextpayloadの途中の改行コードも変換できるように `\t"[^\t]*\n[^\t]*"\t` のようなマッチングをしたかったが、うまくいかず断念した。

# 所感

loggingのフィルタは慣れればそこまで書きづらいとは感じなかった。
出力フォーマットの指定はその機能無いんですか的なのが多いと感じた。
値のエスケープとか。csvを指定したときにとりあえず全部のフィールドをシリアライズして出して！みたいなことができたら楽。
そもそもコンソールから300件以上のダウンロードができるようにしてほしい。
GraphQLについてのハンズオン

# 概要
GraphQLについて、NodeJSのウエブフレームワーク[majidai](https://www.npmjs.com/package/majidai)を使ってハンズオンを実施したいと思います。GraphQLとは何かを理解する前に、クライアントとサーバーの間でデータのやり取りするにあたってどの様な方法あるか考えてみましょう。僕が認識している中では、以下の３つの方法が主流ではないかと思います。

#### ① 従来のやり方
クライアントからリクエスト受け付けるたびにDBサーバーから情報を取得し、色々と整形しレスポンス
![traditional](https://dab1nmslvvntp.cloudfront.net/wp-content/uploads/2017/05/1494257477001-TraditionalWebserver.png)

#### ② REST API
用途毎にエンドポイントを用意する
![rest](https://dab1nmslvvntp.cloudfront.net/wp-content/uploads/2017/05/1494257479002-RestfulServer.png)

#### ③ GraphQL
エンドポイントが一つのみ
![GraphQL](https://dab1nmslvvntp.cloudfront.net/wp-content/uploads/2017/05/1494257483003-GraphQLServer.png)

## GraphQLの使い所
個人的にはRESTで十分だと思っておりますが、以下の場面ではネックになります。
>例えば、作家一覧を取得するエンドポイント「/authors」と本の一覧を取得するエンドポイント「/books/author_idXX」があります。
以下のサンプルのように、**RESTを使って作家さん毎の本の一覧**を取得したい

```javascript
作家：{
	Aさん：
		本：{
			本１
			本２
			本３
		}
	}、
	Bさん：
		本：{
			本１
			本２
			本３
		}
	}、
}
```

上記のようなケースでは、恐らくJavascriptで以下のような処理を記述するでしょう。

```javascript

// 作家一覧を取得する
authors = getData("/authors");
// 作家毎の処理
for(var author in authors) {
	// 作家毎サーバーと通信を行う
	books = getData("/books/" + author["id"]);
	
	// TODO
	....
}
```
「getData」とはサーバと通信し、データを取得する関数別当あると想定してください。

#### 問題点
こちらのJavascriptのコードを見てお気付きだと思いますが、作家の数通りサーバーと通信を行う必要があります。作家の数があればあるほど遅くなります！

#### 解決策
ここで登場するのがGraphQLです。GraphQLとはFacebook社が開発したOSSです。
公式サイトでは以下のように定義されています。
>GraphQLとはAPIのためのクエリ言語とサーバーサイドでクエリを実行するためのランタイムです

色々難しく書いてありますが、僕はRESTの新しいバージョンであると勝手に認識しております。
言葉だけでは理解しにくいのハンズオンをしてみましょう。

##### 環境構築
NodeJSを使います。もしNodeJSが入っていないのであれば、[こちらより](https://nodejs.org/ja/)ダウンロードしてください。

###### ソースコードの準備
[Github](https://github.com/dakc/graphql.git)にソースコードを置いておりますのでダウンロードするか、下記のコマンドでレポジトリをクーロンしてください。

```bash
git clone https://github.com/dakc/graphql.git
```

###### 必要なパッケージのインストール
graphqlフォルダー内から以下のコマンドを実行し、必要なパッケージをインストールします。

```bash
npm install
```
以下の３つのパッケージがインストールされます。
1. graphql
2. majidai
3. express-graphql

##### 実行
以下のコマンドを実行し、サーバーを起動します。

```bash
npm run start
```
ブラウザを開いて *http://127.0.0.1:8000/graphql* にアクセスします。
以下のようなページが表示されたらOKです。
![graphql](https://www.opencodez.com/wp-content/uploads/2019/05/word-image-33.png)

###### 作家の一覧取得
左側のテキストボックスに以下のクエリを入力し、左上の実行ボタンを押下してください。右側に何らかの結果が返ってきます。このクエリは、作家のIDと名前を取得するクエリです。

```javascript
{
  authors{
    id
    name
  }
}
```
###### 本の一覧取得

そして、上と同様に左側のテキストボックスに本のID、名前、作者のIDを取得するクエリを実行してください。

```javascript
{
  books {
    id
    name
    authorId
  }
}
```

###### 作家と本をまとめて取得
上と同様に以下のクエリを実行してください。

```javascript
{
  authors {
    id
    name
    books {
      id
      name
    }
  }
}
```
何か**気付きましたか。**
最後のクエリを見てください。上のRESTの場合はループでサーバーとやり取りしていたのですが、GraphQLを使えば**１回の通信**で習得できます。また、クライアント側で必要な**フィールドを指定**する事ができます。

## 最後に
GraphQLを触ってみて如何でしたか。何かの参考になれば幸いです。
今回はGraphQLの中の*クエリ*のみを紹介しましたが、それ以外に*Mutation*と*Subscription*があります。
日本円米ドルのデータ分析

#0　注意
　　この記事は知識の共有目的ではなく、プログラミングしていく過程で自身の過去の作業を見返す必要があるときに備え、記録しておく為のものです。
　　そのため必要最低限のメモとファイルの引用しかしておらず、Qiitaの記事を参考にして日本円米ドルのデータ分析を行うことを目的とする方は、別の投稿者の記事を参考にすることを強く推奨します。
　　
#1　csvファイルからpandasで読み込み

「日付け」のデータ型がstrだったのでdatetimeに調整。

```python:test01.py

def main():
    fname01 = "USDJPY_test01.csv"

    df = pd.read_csv(fname01,sep=',')
    df['日付け'] = pd.to_datetime(df['日付け'],format='%Y年%m月%d日')

#実行結果
#日付け      終値      始値      高値      安値    前日比%
#0 2019-03-05  111.89  111.72  112.12  111.70   0.13%
#1 2019-03-04  111.75  111.77  112.02  111.64  -0.15%
#2 2019-03-01  111.92  111.39  112.08  111.33   0.48%
#3 2019-02-28  111.39  111.00  111.50  110.66   0.35%
#4 2019-02-27  111.00  110.58  111.08  110.36   0.38%

#日付け     datetime64[ns]
#終値             float64
#始値             float64
#高値             float64
#安値             float64
#前日比%            object
#dtype: object
```
#2　変化率の分析
　　ある日に数値が大きく上昇または下降した場合、次の日はその逆の動きをする説を検証したい。

##2.1　変化率をヒストグラムでプロットして表示。

```python:test01.py

    df['前日比%'].plot.hist(bins=200,range=(-2,2))
    plt.show()

```
![Figure_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384973/f7d574dd-7094-0bb7-19ae-e799dbafbfdb.png)

予想してはいたが、正規分布に近い形になっている。

##2.2　変化率の大きさと次の日の動きの相関係数を調べる。
```python:test01.py

    l=[]
    for i in range(0,200,1):
        #cnt1:　しきい値よりも変化率が大きい　かつ　次の日に前日の動きと逆の動きをした　日数
        cnt1 = df[((df['前日比%'] >= i*0.01)&(df['前日比%'].shift(1)<0) ) | ((df['前日比%'] <= i*-0.01)&(df['前日比%'].shift(1)>0) ) ]
        #cnt2:　しきい値よりも変化率が大きい日数
        cnt2 = df[(df['前日比%'] >= i*0.01) | (df['前日比%'] <= i*-0.01) ]
        l.append(cnt1['日付け'].count()/cnt2['日付け'].count()*100)

    res=pd.DataFrame({'d1': [i * 0.01 for i in range(0,200,1)],
                      'd2': l    })

    print(res.corr())
    print(res[res['d2'] >= 60])

    #res['d2'].plot.hist()
    res.plot(kind='scatter',x='d1',y='d2')
    plt.show()

    #実行結果
    #    d1        d2
    #d1  1.000000  0.707159
    #d2  0.707159  1.000000
```
![Figure_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384973/13f2c740-c6c8-68c2-2033-3b63e1fac349.png)

  変化率の最大値は5.35だった。
　変化率のしきい値を0~5.35で変化させ、変化率が大きくなればなるほど、次の日にその変化率とは逆の動きをする確率が高くなるのかをしきい値ごとに調べた。
結果は相関係数は0.70でやや相関があるといった様子。
しかし、散布図を見るにしきい値が4.0以上のあたりのデータが不適切である。
この部分を除いて相関を考えると、とても弱いことが分かる。
より正確な確率を求めるため度数分布を用いてみる。

##2.2　度数分布の作成
jsdo.it の移行先として CodePen を使ってみる

# はじめに
2010年7月7日にKayac inc.にて誕生後した [jsdo.it](http://jsdo.it/blog/) ですが、2019年10月31日(木) 15:00 をもちましてサービスを終了しました。それでも11月2日8時頃まで動いていたようです。

自分は幾つか投稿していて、はてなブログの方で埋め込みして使用していたのですが、その記事を見ると当然何も表示されなくなっているわけです。

jsdo.it と同様のサービスは海外に幾つかあるのですが、[CodePen](https://codepen.io/) なら Qiita に埋め込みができるので移行先として採用しました。

# CodePenの使い方
## アカウント登録
CodePenを利用するにあたり会員登録が必要になります。GitHub、Twitter、Facebookのアカウントを利用することも可能です。
https://codepen.io/accounts/signup

自分は現時点では Freeプランを使用しています。

## 使い方
jsdo.it と同様にWebブラウザ上で HTML/CSS/JavaScript を書いてその場で実行していきます。

参照：[codepenでウェブ開発入門](https://qiita.com/InoueDaiki/items/1ee988d8e1f43bc205de)

### 画像の読み込み
jsdo.it では画像などのファイルのアップロードは無料で出来たのですが、CodePenでは、有料プランの場合でないとアップロードサーバーが使用できません。
無料プランでも画像などのファイルを読み込みたい場合はどうするかというと、Googleドライブを使用することで、CodePenで画像などのファイルを読み込むことができます。

>Googleドライブを使う場合でも、コピーしたURLのままでは読み込めません。
URLを編集する必要があります。
コピーされたGoogle Driveの画像へのURLはこのような形になっているはずです。
https://drive.google.com/file/d/その画像固有のID/view?usp=sharing
このアドレスを
http://drive.google.com/uc?export=view&id=その画像固有のID
[CodePenの無料会員で画像を使うには](https://konpure.com/2019/04/07/post-10384/)

【2024/06/14追記】
久しぶりにいいねが付いたので、見てみたら画像が表示されなくなっていました。
Googleドライブ側の仕様変更があったようです。

https://stackoverflow.com/questions/77803187/having-trouble-displaying-an-image-from-google-drive

URLを下記のように変更したら表示されるようになりました。
```
https://lh3.google.com/u/0/d/<file-id>
```

## 埋め込み
画像表示テストしたCodePenをQiitaに埋め込みしてみます。
参照：[Qiitaで記事にCodePenが埋め込めるようになりました](https://qiita.com/Qiita/items/edae7417214c8e957f54)

* 埋め込みの縦サイズは変更できるので、data-height="256"とstyle="height: 256px;のところの数値を 512 に変更しています。
* プレビューにはCodePenの貼り付け結果は表示されないので、一時的に限定共有投稿して結果確認します。

<p class="codepen" data-height="512" data-theme-id="default" data-default-tab="html,result" data-user="yaju-the-encoder" data-slug-hash="jOOxQEY" 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="画像表示テスト">
  <span>See the Pen <a href="https://codepen.io/yaju-the-encoder/pen/jOOxQEY">
  画像表示テスト</a> by やじゅ (<a href="https://codepen.io/yaju-the-encoder">@yaju-the-encoder</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

# 最後に
CodePenを活用していきたいです。
archLinuxにRictyフォントをインストールしてて詰まったこと

archLinuxにRictyフォントがコマンド一発でインストールできると聞いて、インストールしようとしたら詰まった話
# yay -S で権限がない
```shell
$ yay -S XXX
Permission denied
```
↑のコマンドで、何やらよくわからないが、権限がないと怒られた。
~/.config/yay/config.json
にかかれているビルドパスの権限を持ってないと、だめらしい
自分の環境では、yayフォルダがroot所有になっていたり、そもそもconfig.jsonが作られていなかった。
デフォルトのビルドパスは、
~/.cache/yay
らしい、案の定root所有になっていたので、
```shell
$ sudo chown -R $(id -u):$(id -g) ~/.cache
```
で所有者を直したら行けた
参考：https://www.reddit.com/r/archlinux/comments/aa4tga/yay_syu_permission_denied/

# yay -S ttf-ricty で403 forbidden
Rictyフォントは、ライセンスの問題で、フォントを作り出すシェルスクリプトが公開されている。そのシェルスクリプトのもともとおいてあった場所が、なくなってしまった模様。
ただ、別の場所で新しく公開されているので、PKGBUILDを編集する必要がある。

```shell
$ yay -S ttf-ricty --editmenu
```

で編集するタイミングでAを入力して、
`http://www.rs.tus.ac.jp/yyusa/ricty/ricty_generator-4.1.1.sh`を
`http://www.yusa.lab.uec.ac.jp/~yusa/ricty/ricty_generator-4.1.1.sh`に書き換えてインストールをすると正常にインストールすることができた

参考：https://aur.archlinux.org/packages/ttf-ricty/
10月21日時点でコメントされているので、近いうちに治るかもしれない？
R でトレード戦略開発に使えるデータセット

R でトレード戦略を開発する場合、 `quantmod::getSymbols()` を利用して、Yahoo Finance から最新のデータをダウンロードしたり、データベンダーから有料データを購入したりして、データを用意することが一般的だと思われる。ただ、ブログ内で R パッケージの利用例を示すときなどは、その都度どこかからダウンロードさせるよりも、R のデータセットが利用できると、読者に負担を掛けずに済むため、読みやすい記事になるだろう。

この記事では、主に米国株式のデータを中心に、有用と思われる データセットをリストアップしていく。良いものが見つかり次第追記していきたい。

# `sp500ret` from `{rugarch}`

-   S&P 500 指数の日足終値をベースにした対数収益率
-   データソースは、Yahoo Finance
-   1987-03-10 から 2009-01-30 まで
-   `data.frame` 形式
-   rowname が日付になっている

```R
library(rugarch)
data(sp500ret)
tail(sp500ret)
```

                   SP500RET
    2009-01-23  0.005363236
    2009-01-26  0.005537856
    2009-01-27  0.010866312
    2009-01-28  0.033006834
    2009-01-29 -0.033681051
    2009-01-30 -0.023052810

# `sp500` from `{depmixS4}`

-   S&P 500 指数の月足四本値と終値ベースの対数収益率
-   1950-02-28 から 2012-01-31 まで
-   `data.frame` 形式
-   rowname が日付になっている

```R
library(depmixS4)
data(sp500)
tail(sp500)
```

                  Open    High     Low   Close     Volume       logret
    2011-08-31 1213.00 1230.71 1209.35 1218.89 5267840000 -0.058467492
    2011-09-30 1159.93 1159.93 1131.34 1131.42 4416790000 -0.074467128
    2011-10-31 1284.96 1284.96 1253.16 1253.30 4310210000  0.102306592
    2011-11-30 1196.72 1247.11 1196.72 1246.96 5801910000 -0.005071483
    2011-12-30 1262.82 1264.12 1257.46 1257.60 2271850000  0.008496553
    2012-01-31 1313.53 1321.41 1306.69 1312.41 4235550000  0.042659999

# `FANG` from `{tidyquant}`

-   FANG (Facebook, Amazon, Netflix, Goolge) の日足四本値
-   `tibble` 形式
-   2013-01-02 から 2016-12-30 まで

```R
library(tidyquant)
data(FANG)
tail(FANG)
```

    # A tibble: 6 x 8
      symbol date        open  high   low close  volume adjusted
      <chr>  <date>     <dbl> <dbl> <dbl> <dbl>   <dbl>    <dbl>
    1 GOOG   2016-12-22  792.  793.  789.  791.  969100     791.
    2 GOOG   2016-12-23  791.  793.  787.  790.  623400     790.
    3 GOOG   2016-12-27  791.  798.  788.  792.  789100     792.
    4 GOOG   2016-12-28  794.  794.  783.  785. 1132700     785.
    5 GOOG   2016-12-29  783.  786.  779.  783.  742200     783.
    6 GOOG   2016-12-30  783.  783.  770.  772. 1760200     772.

# `edhec` from `{PerformanceAnalytics}`

-   EDHEC composite hedge fund style index returns
-   13 のスタイル別ヘッジファンドの月次リターンデータ
-   `xts` 形式
-   1997-01-31 から 2009-08-31 まで

```R
library(PerformanceAnalytics)
data(edhec)
tail(edhec[, 1:4]) # 最初の 4 列のみ抽出
```

               Convertible Arbitrage CTA Global Distressed Securities Emerging Markets
    2009-03-31                0.0235    -0.0180                0.0022           0.0350
    2009-04-30                0.0500    -0.0140                0.0387           0.0663
    2009-05-31                0.0578     0.0213                0.0504           0.0884
    2009-06-30                0.0241    -0.0147                0.0198           0.0013
    2009-07-31                0.0611    -0.0012                0.0311           0.0451
    2009-08-31                0.0315     0.0054                0.0244           0.0166
rail チートシート　ルーティング編


ルーティングについて一括で見れるチートシートが欲しいので
作ることにしました。

# 基本

```ruby:config/routes
   Rails.application.routes.draw do
    get 'homes' => 'home#index'
    get 'homes/new' => 'home#new'
    post   'homes'  =>  'home#create'
  end 
```

# ルート

```ruby:config/routes
   Rails.application.routes.draw do
    root 'homes#index'
  end 
```

# resourcesメソッド

```ruby:config/routes
   Rails.application.routes.draw do 
     resources :items                     #items_controllerに対してのresourcesメソッド
     resources :users, only: [:show]       #users_controllerに対してのresourcesメソッド
   end
```

ネストした場合

```ruby:config/routes
   Rails.application.routes.draw do
     resources :items do
       resources :comments, only: [:create]
     end
   end
```

# memberメソッドとcollectionメソッド
どちらもresourcesでは自動で生成されないactionへのroutingを設定するのに使用
(pointとかbookなど独自アクションを使用したい時)
二つのメソッドの違いはidが生成されるかされないか。

## memberメソッド
　自動でidを付加して生成される

```ruby
   Rails.application.routes.draw do
     resources :users do
      member do
        get :point
      end
     end
   end
```

```bash
point_user GET    /users/:id/follow(.:format)                    users#point
```

## collectionメソッド
　idわ付加されず生成される

```ruby
   Rails.application.routes.draw do
     resources :users do
      collection do
        get :home
      end
     end
   end
```

```bash
home_users GET    /users/slide(.:format)                        users#point
```
manコマンドの日本語化したけど一時的に英語版が見たい場合

## manコマンドの日本語化
この記事を参考に日本語化しました。
https://qiita.com/fuwamaki/items/fbe7483444261e2425fe

## 英語に戻す場合
環境変数をen_US.UTF-8に変更するだけ
日本語化するときはja_JP.UTF-8に戻せば問題ない。

```bash
echo $LANG 
ja_JP.UTF-8
```

```bash
export LANG=en_US.UTF-8
```

### 英語に戻そうと思った理由
日本語化したdateコマンドの説明と実際の操作が違うと思い、英語版で確認したかったため。
https://bearmini.hatenablog.com/entry/2017/06/19/115255

## 感想
英語版戻せる方法が再インストールせずに簡単に実現できるのは助かった。英語版を見たいなってときは今後もあると思うので。
ブラウザ別 Web ページ全体のスクリーンショットを撮る方法

拡張機能を追加しなくても、実は、主要なブラウザには「 Web ページ全体のスクリーンショットを撮る機能 」が、元から備わっています。

もちろん、拡張機能を使った方が楽だったり、高性能だったりすることも多いのですが「 もう拡張機能は増やしたくない！ 」という人には、朗報かもしれません。

## Chrome[^1] の場合

[^1]: バージョン: 88.0.4324.182（Official Build）

まず、以下のいずれかの方法で「 デベロッパーツール 」を起動します。

* ファンクションキーの「 `F12` 」を押す
* ショートカット「 `command` + `option` + `I` 」を利用する
    * Windows なら「 `control` + `shift` + `I` 」
* メニューバーから「 表示 ＞ 開発 / 管理 ＞ デベロッパーツール 」を選択する
    * 右上のメニューボタンなら「 その他のツール ＞ デベロッパーツール 」
* ページを右クリックして、コンテクストメニューから「 検証 」を選択する

次に、下の画像の矢印で示しているように、メニューを開いて「 Capture full size screenshot 」をクリックしてください。

![Chrome_Capture_full_size_screenshot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109175/ec9aa497-6b7a-6b36-df2c-b6dd5198a144.png)

なんと、これだけで、ページ全体のスクリーンショットがダウンロードできます！

まぁ、ちょっと分かりづらいかもしれませんが、普段からデベロッパーツールを使ってはいても、この機能は知らなかった！という人は、覚えておくと良いのではないでしょうか？

デベロッパーツールでは、スマートフォン等での表示を確認できたり、簡単に任意のサイズに調整することも可能なので、そのスクリーンショットが撮れると考えれば、かなり有用です。

ちなみに、Edge も Chromium ベースなので、同じような方法が使えると思います。

## Firefox[^2] の場合

[^2]: バージョン 85.0.2 (64 ビット)

次の画像を見てもらえば分かる通り、一見すると Chrome と同じような手順になりますが、実は Firefox では、デベロッパーツールなんてものを起動する必要はありません！

![Firefox_スクリーンショットを撮る.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109175/1f261eaa-a40e-b27d-73f7-1bd41b2c4476.png)

しかも、UI が非常に分かりやすい上に「 ページ全体を保存 」するか「 表示範囲を保存 」するか、選択できるだけでなく、ドラッグで範囲を選択することもでき、

![Firefox_ページ全体を保存.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109175/bb86658b-84f7-49cb-6a37-f1e9ed6c8f3b.png)

次のように、ワンクリックで一部を選択する機能まで付いていて、ダウンロードするだけでなく、クリップボードにコピーもできたりと、かなり高性能だったりします。

![Firefox ダウンロード 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109175/fdd31728-1b7b-f5a6-06cc-96abe55b717f.png)

これなら、大抵の場合において、拡張機能は必要ないように思えますし、とても使いやすくて感動するレベルなので、使ったことのない人には、是非とも一度、触ってみて欲しいですね。

## Safari[^3] の場合

[^3]: バージョン14.0.3 (16610.4.3.1.4)

最後に、Safari の場合も紹介しておきましょう。

まず、Chrome と同じようにして「 デベロッパーツール 」を起動してください。

ちなみに、Chrome と違って「 `F12` 」は効かないかもしれません。

メニューから開きたい場合は、環境設定の「 詳細 」から「 メニューバーに”開発”メニューを表示 」のチェックボックスをオンにした上で「 開発 ＞ Webインスペクタを表示 」を選択します。

コンテクストメニューでは「 要素の詳細を表示 」という項目になっていますね。

そして、ここからは Chrome よりも、さらに分かりにくいかもしれないのですが、下の画像のように、表示されている HTML の「 `body` 要素 」を右クリックして、コンテクストメニューを出してみてください。

すると「 スクリーンショットを取り込む 」という項目があるので、それを選択すれば「 `body` タグ 」で囲まれた部分、すなわち、ページ全体のスクリーンショットが保存できます。

![Safari_スクリーンショットを取り込む.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109175/f9f52261-daa4-b719-d61f-57f09efb0edb.png)

つまり、例えば「 `header` タグ 」を選択すれば、`header` 部分だけのスクリーンショットが撮れるということで、これはこれで、割と便利かもしれません。

ちなみに、この「 要素のスクリーンショット 」については、実は、Chrome や Firefox でも、メニューの項目名こそ微妙に異なりますが、同様の方法で撮影することができます。

* Chrome なら「 Capture node screenshot 」
* Firefox なら「 ノードのスクリーンショットを撮影 」
Android Studioを使ってGoogle Playを介さずにリアル(SHARP 304SH)で自作アプリを動かす方法

本内容を利用した場合の一切の責任を私は負いません。

#バージョン
- OS  
OS 名:                  Microsoft Windows 10 Home  
OS バージョン:          10.0.18362 N/A ビルド 18362  
システムの種類:         x64-based PC
- Android Studio  
Android Studio 3.5  
Build #AI-191.8026.42.35.5791312, built on August 9, 2019  
JRE: 1.8.0_202-release-1483-b03 amd64  
JVM: OpenJDK 64-Bit Server VM by JetBrains s.r.o  
Windows 10 10.0
- Android  
4.4.2
- ADB USBドライバ  
17.1(8698791byte 2019/7/9)

#準備
Android Studioを公式からダウンロード&インストールする。
ADB USBドライバを下記からダウンロード&展開する。
http://k-tai.sharp.co.jp/support/developers/driver/index.html

#手順
1. Android設定  
ドライバのダウンロードページの内容と共に、Androidを下記に従ってデバッグモードにする。  
(タップしている最中に残り回数のガイドが表示される。)  
https://developer.android.com/training/basics/firstapp/running-app  
1. PCとAndroidをUSB接続  
Androidにデバッグを続行するかの確認がでるので応答する。
1. ADB USBドライバインストール  
プラグ＆プレイで認識されて、Android側はデバッグモードだかの通知が表示された状態になる。  
ドライバのダウンロードページにあるように、デバイスマネージャのUSB内だかにADB～が表示されたはず。  
ドライバのダウンロードページの方法でドライバをインストールする。  
インストールした後の表示は、「Android Composite ADB Interface」になる。
1. アプリ作成  
お試しを下記に従って作成する。  
https://developer.android.com/training/basics/firstapp/creating-project  
1. 実行  
アプリ作成のページを次に進んだ下記のページに従って実行する。  
https://developer.android.com/training/basics/firstapp/running-app  
Androidを正しく認識している場合は下記のように機種が表示される。  
![スマホ認識.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397476/bc5187f5-009d-5ca0-acb2-781261916b0e.png)  
ドライバがインストールされていない等ダメな場合は、「Unknown Device」だった気がする。  
実行した時にAndroid Studioに実行状況や結果が出るため、successではない場合はその情報から追ってみる。

#備考
デバッグモードにするとアプリに対するガードが弱くなるため、リアルを使い終わったらモードを戻す。 
実行によってアプリがリアルにインストールされるため、PCから外してもアプリは使用できる。 
Android StudioにVMの機能があるので、普通はリアルは使わないと思う。 
ドライバのインストールがあるため、うまくいかない時はPCを再起動するのも手。 
(再起動したらリアルがUnknownから機種になった覚え。)
rails 発展その14 あいまい検索

検索機能についてあいまいだったので
改めてその備忘録を書きます。

# LIKE句
LIKE句は、曖昧(あいまい)な文字列の検索をすることができるもので、whereメソッドと一緒に使います。

基本はこちら

```ruby:controller
   モデルクラス名.where('検索するカラム名 LIKE(?)', "検索するキーワード")

   # 例
   def search
    @products = Product.where('title LIKE(?)', "%#{params[:word]}%").limit(5)
  end
```

%と_の意味はこんな感じ

| 文字列 | 意味 |
|:--|:--|
| % | 任意の文字列(空白文字列含む) |
| _ | 任意の1文字 |

サンプルだとこのような形になります

| 実行例 | 詳細 |
|:--|:--|
| where('title LIKE(?)', "A%") | Aから始まるタイトル |
| where('title LIKE(?)', "%B") | Bで終わるタイトル |
| where('title LIKE(?)', "%C%") | Cが含まれるタイトル |
| where('title LIKE(?)', "D_") | Dで始まる2文字のタイトル |
| where('title LIKE(?)', "_E") | Eで終わる2文字のタイトル |
tarコマンドが覚えにくい理由の考察

　最近、ようやく`tar`コマンドのオプションを調べずに使えるようになってきた。その際、覚えられなかった理由が浮かび、何か役立つかもしれないと思ったので、まとめ、書き留めて置く。

## 覚えにくかったと思われる理由

### オプションが必須
目的に従い、「作成(c)」「取り出し(x)」「表示(t)」等とそれぞれ個別で覚える必要がある。つまり、覚えることが多い。

### オプションの意味がわからずに使うことが多い
`tar`のコマンドの使い方が紹介されているサイトに記載してあるサンプルはどういうわけか、オプションの「-」を省略しているものが多く、結果的にオプションの意味を理解せずに使うことになりやすい。  
例えば、tarファイルを作成する場合

```bash
tar -czf {作成ファイル名} {対象ファイルリスト}
```

これをみて、オプションの`-f`で`{作成ファイル名}`を指定していて、オプション`-c, -z`が操作を示しているとまず読み取れない。  
実際、以下の方が頭に入りやすいのではと思う。

```bash
tar -c -z -f {作成ファイル名} {対象ファイルリスト}
または 
tar -f {作成ファイル名} -cz {対象ファイルリスト}
```

ロングオプションだとよりわかりやすい

```bash
tar --create --gzip --file {作成ファイル名} {対象パスのリスト}
```

他よく使うオプションも比較

```bash
# 取り出し
tar -xf {対象ファイルパス}
tar -x -f {対象ファイルパス}
tar --extarct --file {対象ファイルパス}

# リスト表示
tar -tvf {対象ファイルパス}
tar -tv -f {対象ファイルパス}
tar --list --verbose --file {対象ファイルパス}
```

##### 補足

* tarのマニュアルに以下のような記載があることから、ロングオプションでは動かない場合があるかもしれません

>There are alternative long options for many of the short options that are deliberately not documented.
短いオプションの殆どは、意図的に文書化されていない代替の長いオプションがあります

* ロングオプションの参考  
[【 tar 】コマンド――アーカイブファイルを作成する／展開する](https://www.atmarkit.co.jp/ait/articles/1608/15/news015.html)

### ファイル指定方法がオプションと他コマンドと毛色が異なっている

例えば、`mv,cp,mkdir`コマンドは下記のように引数で指定

```bash
mv {変更対象パス} {変更後パス}
cp {コピー元パス} {出力先パス}
mkdir {作成ディレクトリ名}
```

これに対し、`tar`コマンドはオプション`-f`で指定

```bash
# tarファイル作成
tar -f {作成ファイル名} -cz {対象パスリスト}
# tarファイルの解凍
tar -f {対象ファイル} -xz
```

## どうやって覚えたか
下記順序で覚えた。
1. オプションの`-f`は基本的にどの操作でも必須なことを覚える
2. オプションの`-f`の意味と使い方を覚える
3. マニュアルから、他オプションの意味を覚える
ActiveRecord単体でbelongs_to でoptional: trueを有効にする

Rails 5.1から```belongs_to```を指定した時、自動的に```required: true```オプションが追加されpresenseのバリデーションが走るようになったことを今知った（https://github.com/rails/rails/issues/34454 )のですが（同時にrequiredオプションは非推奨になったようです）。

そして、新たに```optional```というオプションが追加され、その名の通り、これをオンにすると、presenseのバリデーションを追加しないように指定できるというもの。

要は、

```ruby
class Book < ActiveRecord::Base
  belongs_to :author, optional: true
end
```

としておけば、```Book.new author: nil```としても、検証はパスするようにできるということ。


これをRailsでなく、ActiveRecord単体で使おうとするとうまくいかなかった。調べてみたら、この機能はRailtieがRailsの初期化プロセスの中でオンにしているようで( https://github.com/rails/rails/blob/b2864a2069dfe9e3d483e16a74a9e6271759accc/railties/lib/rails/application/configuration.rb#L87 )、ActiveRecord単体で有効にするには事前にActiveRecordに設定する必要がある。


```ruby
ActiveRecord::Base.belongs_to_required_by_default= true
```

とすれば、うまく行った。

プロジェクトでActiveRecordを単体で使うときは、設定をちゃんとしないと引っかかるところが他にもありそうだなー。
Power Automate UiFlow for Desktopレコーダー起動時エラーの解消方法

## 事象

Power AutomateのUIフロー（プレビュー）版で、デスクトップアプリ自動化部品を作るときにレコーダー起動エラーが発生する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526766/a4667291-6cf3-ac1e-2dbd-a736301e8d01.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526766/47aeec8e-f9e9-9c0a-c3f6-adfc073bcaa6.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526766/bdc86b3a-f07c-23dc-2266-22b1df5c4b87.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526766/f68d347a-a773-c735-7740-8f9d10268ac5.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526766/627f4f3b-b1de-34d8-aa97-192baf8731c1.png)

## 解消方法

OSの言語設定を変更する必要がある

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526766/7d0da762-12d1-d063-e706-25ac85910421.png)

1. OSの言語設定を立ち上げる
2. 「管理用の言語の設定」を開く
3. 「Unicode対応ではないプログラムの現在の言語」の「システムロケールの変更」を開く
4. 言語設定を「英語（米国）」に変更してPC再起動する。

以上！
私の環境はこれで解消しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526766/1fa92ea1-39a5-28fb-ae11-64be5408d49b.png)

## 注意事項

「Unicode対応ではないプログラムの言語設定」変更の影響を調査できてはおりません。
既に日本から本件のバグ報告は上げており、そのうち対応されるだろうとのことです。
すぐに触りたい方は、自己責任において実施してください。
また本番環境への適用などは調査の上で行っていただくことを推奨いたします。

それではPower Automateライフをお楽しみください:relaxed:
ソケットでメールを送ってみよう

まぁ、phpならメール関数使うなり、ライブラリいっぱい転がってるんで
そういうの使ったほうがいいです。
当然。

ただ、SMTPの生コマンドで送ってみよう　というだけの話です。

前提条件として、認証なしのSMTPサーバがローカルにある　という前提。
認証ありの場合、HELOコマンドをEHLOに変えてごにょごにょして下さい。

```php

$toList[] = "abc@user.example.com";
$toList[] = "abc2@user.example.com";
$toList[] = "abc3@user.example.com";
$from = "admin@example.com";
$body = 'TEST MAIL
テストメール';
$body = mb_convert_encoding($body,"JIS");
$sub = mb_convert_encoding("Subject: ソケットでメール","JIS");
$server = "127.0.0.1";
 
$socket = fsockopen($server,25);
fputs($socket,"HELO $server\r\n");
$ret = fgets($socket,128);
 
foreach($toList as $key => $val){
    fputs($socket,"MAIL FROM:<".$from.">\r\n");
    $ret = fgets($socket,128);
    fputs($socket,"RCPT TO:<".$val.">\r\n"); 
    $ret = fgets($socket,128);
    fputs($socket,"DATA\r\n");
    $ret = fgets($socket,128); 
    fputs($socket,"$sub\r\n"); 
    fputs($socket,"To: <".$val.">\r\n"); 
    fputs($socket,"$body\r\n"); 
    fputs($socket,"\r\n.\r\n"); 
    $ret = fgets($socket,128);
}
$ret = fgets($socket,128);
if(strpos($ret,"250")!==0){ 
    echo "Error\n"; 
}
fclose($socket); 
```
本当は$ret部分でコマンドの結果を受け取って、失敗したとかの判定を入れるべきですがめんどくさいので
割愛。

あと、どうせソケットで送るなら、一回つないだコネクションを使いまわして連続で送信する　ということをやってます。
phpのmail関数系は毎回コネクションを張るので、大量に送るならコネクションは使いまわしたほうが良いです。

まぁ、大体のライブラリにはアリます。

ただ、注意がアリます。
大量に送信していると、途中でコネクションが切れたり　ということもあるので、
ちゃんとコネクションがはられているか　ということも確認しましょうね

大体2～300回ぐらいで　貼り直したほうがいいと思います。