OmniAICreator/Qiita-1.07M huggingface dataset:
MacでのRuby環境構築2020


MacでのRuby環境構築についてまとめます。改めて公式文書を読みながら進めたところ、今までやっていたことをスキップできる！と気づいたので、久々にQiitaに書こうと思います。

# 事前準備

### 動作確認環境
- MacBook Pro (13-inch, 2019, Four Thunderbolt 3 ports)
- Catalina 10.15.1


### 今回構築する環境の概要、ゴール
複数バージョンのRubyを管理するために、[rbenv](https://github.com/rbenv/rbenv) を使用します。インストールにはHomebrewを使います。
最終的に `$ ruby --version` で意図したバージョン名が表示されることを確認します。


### 前提
以下の環境であることを前提とします。

- Homebrewを使えること
    - Homebrewがインストールできていない方は、 [Homebrew](https://brew.sh/index_ja.html) を確認してインストールをお願いします 
- gitを使えること
    - Homebrewが使用できれば、 `$ brew install git` でインストール可能です。


# rbenv環境構築
基本的に、https://github.com/rbenv/rbenv#installation にしたがって操作していきます。

### 1. rbenv のインストール
以下のコマンドを実行します。

```zsh
$ brew install rbenv
```

rbenvがインストールされます。
同時に、 ruby-build もインストールされます。


### 2. rbenv のセットアップ
以下のコマンドを実行します。

```zsh
$ rbenv init
# Load rbenv automatically by appending
# the following to ~/.zshrc:

eval "$(rbenv init -)"
```

上に書いたようなログが出力されています。指示通りに `eval "$(rbenv init -)"` を `~/.zshrc` に書き込みます。
私の場合は、`zsh` を使用しているため、このようなログ(`# the following to ~/.zshrc:`)が出ていますが、お使いのシェルによって、どのファイルに書き込むかは(ログの内容も)変わってきます。

**eval "$(rbenv init -)" を ~/.zshrc に書きむとは何を意味するのか**
ちょっと話題がそれますが、簡単に説明しておきます。
`zsh` を使用している環境において `~/.zshrc` ファイルに書き込まれた内容は、ログインしたときやターミナルを開いた時などに実行されます(ここでは詳しくは説明しません)。`~/.zshrc` ファイルに `eval "$(rbenv init -)` を書き込むということは、ログインするときやターミナルを開き直す度に、 `eval "$(rbenv init -)` を実行したい、ということになります。

### 3. ターミナル再起動
ターミナルを再起動することで、 `~/.zshrc` ファイルが読み込まれます。
ターミナル再起動の代わりに、 `$ source ~/.zshrc`  でも内容を反映することが可能です。

### 4. rbenvインストール環境確認
以下のコマンドを実行し、バージョンが表示されればrbenvのインストールは完了です。

```zsh
$ rbenv
rbenv 1.1.2
...
...
```

# ruby環境構築
インストールした `rbenv` を利用して `ruby` をインストールしていきます。
こちらも基本的に https://github.com/rbenv/rbenv#installing-ruby-versions にしたがって操作をします。

### 1. インストール可能なバージョンの確認
以下のコマンドで、インストール可能なrubyのバージョンを確認します。

```zsh
$ rbenv install -l
1.8.5-p52
1.8.5-p113
1.8.5-p114
1.8.5-p115
1.8.5-p231
...
...
2.7.0
...
...
```

### 2. ruby のインストール
今回は現時点で [stable (安定版)となっている2.7.0](https://www.ruby-lang.org/ja/downloads/)をインストールします。

```zsh
$ rbenv install 2.7.0
```

また、全てのシェルでこのバージョンを使用したいため、global設定を行います。

```zsh
$ rbenv global 2.7.0
```

### 3. ターミナルの再起動
特に手順には書いてありませんでしたが、私の環境ではターミナルの再起動を行うことで意図したバージョンのrubyを使えるようになりました。

### 4. rubyがインストールされたことを確認する
以下のコマンドで、rubyのバージョンを確かめます。

```zsh
$ ruby --version
```

意図したバージョンになっていることが確認できれば、インストールは完了です。


### 参考
- https://github.com/rbenv/rbenv
- https://qiita.com/TAByasu/items/47c6cfbeeafad39eda07
ページ遷移先でリロードしないと非同期通信(ajax)できない

#はじめに
某プログラミングスクールの課題で、Railsを使ってECサイトを作成しています。


#エラー発生時の状況
トップページにて、link_to でページに移動するとリロードしないと非同期通信できない

#エラーの仮説
turbolinksが邪魔してそう...


##turbolinksってなんだっけ？
turbolinksとは、ページ遷移をAjaxに置き換え、JavaScriptやCSSのパースを省略することで高速化するgemで、Rails 4からはデフォルトで使用されるようになります。

##原因
data-turbolinkが働いて遷移したページではイベントが発火しない事があるらしい．

##対策
```ruby

= link_to new_item_path,data: {"turbolinks" => false}, class: "seller_btn" do
```
これ→

```ruby

{"turbolinks" => false},
```
###data-turbolinkをオフにする
###遷移元のリンクタグにdata属性を追加

#参考記事
Rails6でjqueryアニメーションライブラリanimsitionの使用 | 躓いたことなど．．．
https://qiita.com/lookatachic/items/cc3accb542fca0eaf43a
[Maya MEL]オブジェクトを分離した後に名前を変更

"group1"という名前の直下にあるオブジェクトを分離し、その後に名前を変更するMEL。
肌と舌が結合されているシーンで使用したもの。

```
string $blendShapeTargetList[] = `listRelatives -pa -c "group1"`;
for($node in $blendShapeTargetList)
{
    select -r $node;
    showHidden -a;
    polySeparate -ch 0;
    string $children[] = `listRelatives -c $node`;
    string $shortName[] = `ls -sn $node`;
    rename $children[0] ($shortName[0]+"_skin");
    rename $children[1] ($shortName[0]+"_tongue");
}
```

自分用メモ
marginとpadding

<h1>marginとpadding</h1>
「margin」「padding」はWEBページ上の余白を作ることができる。
mariginとpaddingの違いは空白のできる場所である。
![要素.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556803/12b26c43-3b0c-6ec6-f600-5215d08d5dcf.png)

上記の写真を見ると違いが分かります。
margin=要素の外側の余白　　
padding＝要素の内側の余白
border=要素とpaddingの外側に表示される　　　

| 上(top)     |右(right)|下(bottom)   |左(left)    |
|-----------------|------------------|------------------|-----------------|
| padding-top|padding-right |padding-bottom |padding-left|
|margin-top|margin-right|margin-bottom|margin-left|

(例)
また数値はまとめて指定でき、時計回りの方向。
padding: 10px 20px 30px 40px;　　　　　
10px＝左　20px＝右　30px＝下　40px＝左
h:commandButtonに複数のactionListenerを指定する方法

#目的
h:commandButton、h:commandLinkにて複数のactionListenerを指定したい際の実装方法です。
#実装方法
```TestListener.java
public void method1() {
	System.out.println("method1");
}
public void method2() {
	System.out.println("method2");
}
public void method3() {
	System.out.println("method3");
}
public void method4() {
	System.out.println("method4");
}
```

```Test.xhtml
<h:commandButton value="test"
		actionListener="#{testListener.method1()}"
		action="#{testListener.method4()}">
	<f:actionListener binding="#{testListener.method2()}"/>
	<f:actionListener binding="#{testListener.method3()}"/>
</h:commandButton>
```
ボタンを押した結果はこんな感じになります。

```
14:06:04,219 INFO  [stdout] (default task-1) method1

14:06:04,219 INFO  [stdout] (default task-1) method2

14:06:04,219 INFO  [stdout] (default task-1) method3

14:06:04,220 INFO  [stdout] (default task-1) method4
```
[Pythonでweb開発] queryもredirect

webサーバとPythonでwebを構築しています。構築していくうちに、新たなページを作成し、古いページを統合する時があります。
閲覧者がブックマークで登録したページがある場合は、閲覧者にアドレスが変わったことを通知しなくてはなりません。

そこで古いページから新しいページにリダイレクトさせる方法があります。

```python
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import cgi

form = cgi.FieldStorage()

all_query = '?'
for key in form:
    all_query = all_query \
                + key \
                + '=' \
                + form[key].value + '&'
all_query = all_query[0:len(all_query) - 1]

print ('content-type: text/html; charset=UTF-8\n')
html_body = """\
<html><body>
<script>	
    window.location = '/any.py{0}';
</script>
</body></html>
""".format(all_query)
print (html_body)
```

これで、ブックマークの変更依頼をせずに済みます。
TBB(Thread Building Blocks)を aarch64(Android) CMake ビルドするメモ

## 背景

* TBB を使っているライブラリを Android 向けにビルドしたいため, TBB をビルドせねばならない.
  * 昨今だったら, C++11 thread でも十分そうであるが, 既存ライブラリを書き換えるのがめんどい
* TBB オフィシャルでは, 基本 Makefile しか提供されていない
  * 一応 Android aarch64 は対応しているが...
  
## TBB のソースコードについて.

ソースコードがカオスです. あんまりいじりたくないですね.

## AARCH64 固有のフラグ

aarch64 固有のビルド設定(aarch64 依存のコード)は, `DO_ITT_NOTIFY` を off にする以外は特にないようです.

## CMake ビルド

### add_submodule でビルド

一応すでに対応されているものがあります.

https://github.com/wjakob/tbb
(ちょっとふるい)

また, check_cxx_compiler_flag とか呼び出して `CMAKE_CXX_FLAGS` を直接書き換えているので, このまま使うにはおすすめしません.

### 外部コマンド呼び出しでビルド

オフィシャルにあります.

https://github.com/intel/tbb/tree/tbb_2020/cmake

ただ, cross compile に対応しているかは不明です.

### tbb git repo に対して add_submodule

`wjakob/tbb` を参考に, CMakeLists.txt だけ別ででっち上げてビルドするのを embree-aarch64 に作りました.

https://github.com/lighttransport/embree-aarch64/tree/master/deps/tbb

static build だけ対応しています.

ただ, このビルドだと, 実行時にコア数をうまく見つけてくれないようです.

## ビルドのメモ
 
### インクルードパス

同名のヘッダファイルが public 用(`include`), private 用(`src`)にあるので, public 用を先に include path に指定しないとコンパイルエラーになります(tbb ソースでは, public ヘッダファイルも `<file.h>` ではなくて `"file.h"` で読んでいる).
(また, public ヘッダパスを CMake target_include_dir で INTERFACE だとなぜか include path に追加されない)

### ビルド時に生成されるファイル

`version_string.ver`

が必要です. 適当にでっちあげてもよさそうな感じがあります.

### .def ファイル

TBB は, リンク用の .def ファイルを linux, macOS でも作ります.
add_subdirectory() + static link だと不要かと思います.

### コンパイルフラッグとか

* DO_ITT_NOTIFY : プロファイリング用. x86 だけ. x86 では disable するとなぜかコンパイルできないです.

* `-mrtm` compiler flag : トランザクショナルメモリ用.

https://gcc.gnu.org/onlinedocs/gcc-4.9.4/gcc/X86-transactional-memory-intrinsics.html

disable してもよさそう?

* deprecated warning : `tbb/src/` のファイルは結構 deprecated warning が出ます. TBB を使っているライブラリが使用していなければ, ビルドからはずすとよいでしょう.


## TODO

* [ ] 自前ビルドすると, 実行時コア数うまく見つけてくれないらしい問題を解明する
* [ ] Makefile ビルドなどとの性能比較をする
マネージメント研修するに当たっての資料

1. マネージャーの役割  
	* 結節点
	* リーダーシップ・目標達成
	* メンバー育成  
2. 管理職としてのマネージャー  
3. リーダーシップ  
* white & Lipitt, 1960
	* 専制型
		* 作業成績はよかったが、リーダーや他の成員に対して攻撃的になりリーダーに対する潜在的な不平・不満が示された
	* 民主型
		* 雰囲気が良好で作業の質量が優れ、独創性大
	* 放任型
		* 自分勝手で無責任な言動が増加し作業効率が劣る
* ミシガン研究
	* 従業員指向
	* 生産性指向
* オハイオ研究
	* 部下との愛大の相互信頼・人間関係→配慮
	* 課題遂行の手順明確化→体制作り
* SL理論(Situational Leadership) Hersy & Blanchard, 1972
	*  熱心な初心者（低い職務能力・高い意欲）
		* 指示型：指示的行動が多く支援的行動が少ない
	* 迷える中級者（ある程度の職務能力・意欲が低い）
		* コーチ型：指示的行動も支援的行動も多い
	* 波のある上級者（能力は高いが不安定）
		* 支援型：指示的行動が少なく支援的行動が少ない
	* 安定したベテラン（能力も意欲も高い） 
		* 委任型：指示的行動も支援的行動も少ない
4. メンタリングとコーチング
	* メンタリング
		* 相談に乗ったり仕事を教えたりくれたりして、能力を伸ばしキャリアの発展を支援してくれる
		* 2つの機能
			* キャリア的機能
				* 若い人に助言を与え成長を促す仕事の機会を作る
				* キャリア形成にとってリスクの大きい状況から保護する
			* 心理・社会的機能
				* 共感を示し励ましを与え役割モデルとなるなどの心理、社会的な支援を与える
	* コーチング
		* その人が必要とする答えは全てその人の中にある
		* 質問によるコミュニケーションにより常に本人に考えさせるようにする
Xubuntuサーバを作ってみた。

はじめまして 
#今回Qiita初投稿となります！
(**昨年６月に登録**しましたが、記事のストックオンリーで、投稿せずじまいでした)

この度、社宅？内にLinuxサーバを導入することとなりましたが、
(今現在)目的は次の通りです。

1.PHP、Ruby等の学習環境を構築
2.宅内NASの構築
3.将来的に外部に公開も視野に

サーバにするマシンは、以下の通りです。

機種：自作機
CPU：AMD E-350(1.622GHz)
RAM：8GB
BIOS：E7698AMS V1.5(2011/4/22)
HDD：640GB+1TB
USB：2.0*10、3.0*2
#BIOSをチェックしてみると…
いざ、電源をON→BIOSをチェック。

重要な部分を

- ONBOARDLAN：ON
- SATA：AHCIモード
- HPET：ON
- IGD(CPU統合グラフィック)：AUTO
- USB3.0 LEGACYMODE：ON
- WAKE UP EVENT BY BIOS

に設定したあと、ブートの順番を

1. USB Floppy
2. USB CD/DVD
3. USB HardDisk
4. USB KEY
5. CD/DVD
6. 内臓HDD

に設定します。

#インストールOSで大いに迷う

インストールするOSですが…

サーバとしての運用がメインですが、
不測の事態に備えて(？)GUI環境も導入！

メモリが**8GB**と比較的リッチですが、
CPUは64bit対応とはいえ、クロック数が**1.6GHz**とプアですので、

**Xubuntu 18.04LTS 64bitをセレクト。**

インストールDVDを作成、ドライブにセット。

インストールの際、

- アップデートをダウンロード
- サードパーティー製をインストール

にチェックを入れます。

#HDDパーティション設定
インストールの種類：それ以外
に設定後、

１台目のHDD(640GB)：/dev/sda
２台目のHDD(1TB)：/dev/sdb
となっているのを確認。

/dev/sdaのパーティションは

- swap：16.4GB(基本パーティション・swap)
- /boot：256MB(基本パーティション・ext4)
- /usr：40960MB(論理パーティション・ext4)
- /var：20480MB(論理パーティション・ext4)
- /var/log：51200MB(論理パーティション・ext4)←ログ用
- /：20480MB(論理パーティション・ext4)
- /tmp：1024MB(論理パーティション・ext4)
- /opt：40960MB(論理パーティション・ext4)
- /rsv：40960MB(論理パーティション・ext4)←予備用
- /home：407430MB(基本パーティション・ext4)

/dev/sdbのパーティションは

**NAS用の予定です(XFSフォーマットを検討)**
NuGetを使わずにNpgsqlをインストールする

#課題
Npgsql をインストールしようとしたら、どの記事も NuGet の例ばかりだった。しかしなぜか自分の環境だと NuGet でダウンロードしようとしても、パッケージマネージャーが何も応答しない。そこで NuGet 以外でインストールする方法を調べた。

#方法
https://symfoware.blog.fc2.com/blog-entry-2386.html の記事通りすることで解決。
https://github.com/npgsql/npgsql/releases にNpgsql v4.1.2のmsiインストーラがあるので、それをインストールすると ```C:\Windows\Microsoft.NET\assembly\GAC_MSIL\Npgsql\v4.0_4.1.2.0__5d8b90d52f46fda7```　の下あたりにNpgsql.dllが見つかるはずだ。
Python初心者のAtcoderメモ@キーエンス2020、ABC問題

#A Painting
参考：https://atcoder.jp/contests/keyence2020/submissions/9588167

```python
h = int(input()) #h = input()と書くとstr型になる
w = int(input())
n = int(input())

ans = min((n+h-1)//h,(n+w-1)//w) #それぞれで計算して小さい方が答え
print(ans)
```
まず、h=input()と書くなどしてつまずく。
python3だとhに数値を入れてもstr型で収まってしまう？
やむなくint(input())と書き直す。
（n+○-1）//○は頻出な気がするが、本番では冗長的なコードを書いてしまった。

#B Robot Arms
参考：https://atcoder.jp/contests/keyence2020/submissions/9588111

```python
n = int(input())
a = []
for i in range(n):
    x,l = map(int,input().split())
    a.append([x+l,x-l]) #sortがやりやすいように末端、先端の順に収納
a.sort()

ans = 1
bef = a[0]

for i in range(1,n):
    aft = a[i]
    if (bef[0] <= aft[1]): #a体目のロボの末端とa+1体目のロボの先端を比較
        bef = aft
        ans += 1
print(ans)
```
ほぼ参考コードのまま、区間スケジューリング問題というらしい。
末端（最大値）の小さい順にソートして、前に置いたロボットと被らなければ追加。
200点にしては難しすぎない？

#C Subarray Sum
参考：https://atcoder.jp/contests/keyence2020/submissions/9590293

```python
n,k,s = map(int,input().split())
ans = []
if (s < 1000000000):
    for i in range(n):
        if (i < k):
            ans.append(s)
        else:
            ans.append(s + 1)
elif (s == 1000000000):
    for j in range(n):
        if (j < k):
            ans.append(s)
        else:
            ans.append(1)
ans = map(str,ans) #この二行処理を加える事で例：[80,80,81,81,81]→
print(' '.join(ans)) #80 80 81 81 81と出力できる
```
こちらもほぼ参考コードのまま。数列の要素がn個あるうちk個をsにして、残りをs以外にすれば良いという事。s以外の数を作るためにs+1としていて、条件の範囲を超える1000000001が発生しないように場合分けしている。
正直Bよりこっちの方が解けたかも？

###謝辞
コードを参考にさせて頂いた方々、ありがとうございました。
ejsの<%= >と<%- >の違い

htmlの要素として出力したいか、文字として出力したいかで使い分ける
→基本的には<%= %>で、子要素の出力を一緒に使いたいときには<%- %>を使用す


##そもそもEJSとは
ejsとはテンプレート機能を実現するNode.jsのパッケージです。

##1,<%= >
ejsに用意されている独自機能です。
このタグは、指定した変数の値を出力するものです。


```
<%=変数 >
```


##2,<%- >
ejsに用意されている独自機能です。
HTMLをエスケープ処理しないでそのまま出力する為のものです。


##具体的な違い
使ってみて、この二つに大きな違いは見つけられませんでしたが、
jsからHTML形式の値を受け渡す時には注意が必要です。

```html
data = '<p>ありがとう</p>'
```

例えば、jsから上記の文を受け渡すとします。

```html
<%= data %>
```
<%= %>で受け渡すと、<p>ありがとう</p>このまま表示されますが、

```html
<%- data %>
```

<%- %>で受け渡すと、ありがとうと表示されます。HTMLの書き方を読み込んでいるのです。
https(SSL)通信の環境下でjavascriptが動かなくなる場合の原因と解決方法  ( 本番環境(AWS)でjavascriptを読み込む方法 )

#はじめに
某プログラミングスクールの課題で、Railsを使ってECサイトを作成しています。

##発生時の状況
商品出品画面のカテゴリー選択時、javascriptを使ってサブカテゴリーを入力できる機能を実装
本番環境にデプロイすると、カテゴリー選択時にサブカテゴリーが出現せず入力できませんでした。

#エラーの仮説
・javascriptが本番環境で読み込めてない

#エラーの原因
本番環境つまり、httpsによるSSL暗号通信下では、読み込んでない。


#対策
###1,jQuery本体をダウンロードして自分のサーバーで動かす方法。

###2,URLをhttpsに変更する方法。


```application.html
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
```

##3,プロトコルを指定しない方法。

```application.html
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
```
3つ目の方法が一番汎用性が高いのでおすすめです。この記述方法はjavascriptに限らず、CSSや画像のパスの指定にも使えるので、覚えておくと便利だそうです！！


---
###参考記事
https://www.webernote.net/webcreate/https-javascript.html

---
##最後に

自分のメモ用と、アウトプットとして記事に投稿させていただきました。
クラスライブラリの活用

##【クラスライブラリについて】
→クラスを宣言する必要なくあらかじめ用意された便利なクラス群
→JDKがインストールされていればすぐに利用可能
→基本的なクラス以外は利用にimportが必要

##【文字列を扱うクラス】
→Stringクラスは非常によく使われるため、newでオブジェクトを作成しなくても利用可能
####(Stringクラスの主なメソッド)
→```CharAt()メソッド```引数で指定した位置にある文字を返す

→```length()メソッド```文字列の長さを返す


```
class Sample{
public static void main(String[] args){
  String str = "Hello";
  
  char ch1 = str.charAt(0);  //一番目の文字を取り出す
  char ch2 = str.charAt(1);  //二番目の文字を取り出す

  int len = str.length();  //文字列の長さを返す

　System.out.println(ch1);  //出力結果「H」
  System.out.println(ch2);  //出力結果「e」
  System.out.println(len);  //出力結果「5」
  }
}
```

→```toUpperCase()メソッド```大文字に変換


→```toLowerCase()メソッド```小文字に変換

→```indexOf()メソッド```文字列から文字を検索して最初に現れる位置を返す（見つからない場合は-1を返す）

```
import java.io.*;
import java.util.Scanner;

class Sample{
	public static void main(String[] args){
		System.out.println("文字列を入力してください");
		String s = new java.util.Scanner(System.in).nextLine(); //→「helloworld」と入力
		
		System.out.println(s); //出力結果「helloworld」
		
		String n = s.toUpperCase(); //変数sを大文字に変換し、変数nに代入
		System.out.println(n); //出力結果「HELLOWORLD」
		
		String a = n.toLowerCase(); //変数nを小文字に変換し、変数aに代入
		System.out.println(a); //出力結果「helloworld」

　　　　String str = "HelloWorld";
       int num1 = str.indexOf(l); //「2を返す」
       int num2 = str.indexOf(o); //「4を返す」
       int num3 = str.indexOf(A); //「-1を返す」
		
	}
}

```

####(StringBufferクラス)
→Stringクラスだと一旦作成したオブジェクトの内容を変更できない
→文字列を変更する必要がある場合はStringBufferクラスを使う

→```append()メソッド```文字列を追加

```
class Sample{
public static void main(String[] args){
String str1 = "Hello";
String str2 = "World";
StringBuffer sb = new StringBuffer(str1);
sb.append(str2);

System.out.println(sb); //出力結果「HelloWorld」
}
}
```
##【そのほかのクラス】
####(Integerクラス）
→int型に関する様々な機能を提供するクラス
→基本型に関するクラスはラッパクラスと呼ばれ、クラスメソッドを持っている

→```ParseInt()メソッド```Stringクラスのオブジェクトを引数として渡すとint型の値を返す

```
String str = "123"; //文字列123
int num = Integer.parseInt(str); //文字列123をint型に変換
```

####(Mathクラス)
→数学的な計算を行う機能をまとめたクラスで、クラスメソッドを多数もつ
→```max()メソッド```引数二つのうち最大値を返す
→```int ans = Math.max(2,5);```引数のうちの最大値5をansに代入

→```random()メソッド```0.0~1.0未満の数値をランダムで返す
→```int num = (int) (Math.random()*6)+1```これで1～6の整数値となる

##【クラス型の変数】
フォルダだけが削除出来ない時のlinux削除コマンド


wordpressをインストールしたらファイルが削除できなくて焦ったのでここにLinux削除コマンドを載せておきます。

# pwd
/var/www/html

# ls

* index.php

* wp-blog-header.php
* wp-includes //ディレクトリ
* wp-settings.php
* license.txt
* wp-comments-post.php
* wp-links-opml.php
* wp-signup.php
* readme.html
* wp-config-sample.php
* wp-load.php
* wp-trackback.php
* wp-activate.php
* wp-content //ディレクトリ
* wp-login.php
* xmlrpc.php
* wp-admin //ディレクトリ
* wp-cron.php
* wp-mail.php

# rm -rf 「ディレクトリ名」で中身ごとディレクトリ削除
例：# rm -rf wp-admin

※オプション意味
-rオプションは中身ごと消す
-fオプションは「削除してもいいですか？」などの都度アナウンスをが迷惑な場合に使う



# 全部削除
現在いるディレクトリの中身全てけします。

\# rm -rf *
GCP+DockerでHTTPSな静的ページを公開する

## 概要
なにかかっこいいのでポートフォリオサイトが欲しかったというのと，GCPとDockerまともに触ったことがなかったのでこういう風に公開しました．
これはポートフォリオに限らず，一般的な静的ページなら当てはめられます．

## 手順

### 1. ドメインを取得してIPと紐づける
僕はGoogleDomainsで取得して設定しました．

### 2. Google Compute Engine(GCE) のインスタンスを立てる
OSはdebian9を選択する.
httpとhttpsのportを開放することを忘れずに.

### 3. GCE 上に Docker をインストールする

```shell

$ apt-get install curl
$ curl -fsSL https://get.docker.com -o get-docker.sh
$ sudo sh get-docker.sh
$ systemctl start docker
```

### 4. GCE 上に git をインストールする

ローカルのソースコードを GCE 上にコピーします．

```shell

$ apt-get install git
$ git clone https://github.com/[Your Account]/[Your Repository].git
```

プライベートリポジトリなら，Githubに鍵登録をしましょう.
Github以外の方法でソースコードをコピーしても問題ありません．

ディレクトリ構成

```
.
├── Dockerfile
├── docker-compose.yml
└── src
    ├── css　
    ├── favicon.ico
    ├── img
    ├── index.html
    └── js
```

### 5. GCE 上に Docker で HTTPS な Nginx を立てる
`https-portal`を利用します．
https://github.com/SteveLTN/https-portal

これは普通はproxyとしてHTTPS化するものですが，今回はproxyとしてではなくhttp-portl自体のNginxから静的ファイルを配信します．
git でクローンしたディレクトリに入りイメージをビルドします.

公開したいテンプレート`src`を`/var/www/vhosts/www.[Your Domain].com/`に配置しコンテナにコピーします.
srcを変更した場合、変更がそのまま反映されます．
こうすることで，imageをビルドしなおすことなくページ内容の変更を反映させることができます．

証明書をボリュームにマウントしておき永続化します．
コンテナを立ち上げるため証明書を取得すると発行制限がかかる場合があり，僕は1週間くらい発行することができなくなりました．

```shell

$ docker build ./ -t  portfolio-https
$ docker run -v {srcへの絶対パス}:/var/www/vhosts/www.[Your Domain].com/ -v /data/ssl_certs:/var/lib/https-portal -p 80:80 -p 443:443 portfolio-https
```

もしくは

```yaml:docker-compose.yml

version: "3"

services:
  https-portal:
    image: steveltn/https-portal:1
    container_name: portfolio-https-portal
    ports:
      - "80:80"
      - "443:443"
    restart: always
    environment:
      STAGE: "production"
      DOMAINS: >-
        www.[Your Domain].com
    volumes:
      - ./src:/var/www/vhosts/www.[Your Domain].com
      - /data/ssl_certs:/var/lib/https-portal
```

```shell

docker-compose up -d
```

## まとめ
以上の手順でページを公開できたと思います．
unityのassetのfungusを使って会話シーンを作りたい

## 使っているもの、環境
fungus
https://assetstore.unity.com/packages/templates/systems/fungus-34184
unity 2019.1.1f1
## やろうとしていること
ストーリーモードを作ろうとしている。戦闘シーン→会話シーン->戦闘シーン...と繰り返したいがそれごとに会話シーンを作るのは面倒なので会話シーンを一つだけ作って再利用したい。ベストプラクティスはさておき手探りで実行できるようにした
## どうやってやろうとしているか
会話用のシーンを作って、fungusのフローチャートを以下のように作って会話シーンに遷移したときに渡された情報からどの会話を開始させるかを判別する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97502/9716f142-a5a8-609b-cd8c-7662a4f220ec.png)
実際はタイトルシーン->prologue->story1_1->ゲームシーン->...と遷移させたい
シーン間の情報を渡す方法は変数をstaticにして渡したりDontDestroyOnLoadを使ったりということができるらしいので、何かしらの方法で渡す。今回はGameSystemScriptというクラスを作成してDontDestoryOnLoadで消えないようにしてみた

```c#
public class GameSystemScript : MonoBehaviour
{
    public static int nextTalkScene = 1; 
    public int getNextTalkScene()
    {
        return nextTalkScene;
    }

    public void setNextTalkScene(int n)
    {
        nextTalkScene = n;
    }
```
```c#
  private void Awake()
  {
      // GameSystemはGameSystemScriptをアタッチしたgameObject
      DontDestroyOnLoad(GameSystem);
  }
```
タイトルシーンでGameSystemScriptのnextTalkSceneを設定して次のシーンに遷移させる

```C#
GameSystem.GetComponent<GameSystemScript>().setNextTalkScene(0);
SceneManager.LoadScene(nextScene);        
```

```C#
public class TalkSceneMain : MonoBehaviour
{
    public Fungus.Flowchart flowchart;

    GameSystemScript gameSystem;
    void Start()
    {
        gameSystem = FindObjectOfType<GameSystemScript>();
        int nextTalkScene = gameSystem.getNextTalkScene();
        switch (nextTalkScene)
        {
            case 0:
                flowchart.ExecuteBlock("prologue");
                break;
            case 1:
                flowchart.ExecuteBlock("story1_1");
                break;
            case 2:
                flowchart.ExecuteBlock("story1_2");
                break;
            case 3:
                flowchart.ExecuteBlock("story1_3");
                break;
        }
    }
...
```
これでタイトルシーンが終わったらTalkSceneに入ってfungusのprologueを実行できるようになった。
これを拡張すればTalkSceneが実行されるときに任意の会話が会話できるようになった
OutSystemsでShift-JISやEUC-JPのデータを扱う

OutSystemsで作成するアプリケーションを既存のシステムと接続する場合、相手のシステムから渡されるデータがShift-JISやEUC-JPなどの文字コードセットでエンコードされていることがあります。

そういったデータを、OutSystemsのText型に変換する方法です。

# サンプル
Forgeコンポーネント：https://www.outsystems.com/forge/component-overview/7064/housesoftsampletraditional
ConvertCharacterEncoding Screenを参照してください。

Shift-JISやEUC-JPでエンコードされたテキストファイルをアップロードして、指定エンコードとして解釈した結果を画面内に表示する画面になっています。

# 環境
Personal Environment(Version 11.0.606.0)
Service Studio(Version 11.6.22)
BinaryData

# 参照
組み込みのBinaryData APIから、BinaryDataToText Actionを追加しておきます。
![qCharacterEncoding1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/086c58f2-78fb-c3b3-6408-1e03bede3377.png)

# 使い方
BinaryDataToText ActionのInputパラメータは以下の通り

- BinaryData：変換対象のデータ。BinaryData型です。
- Encoding：文字コードセットを表す文字列。Descriptionによると、有効なのは、"unicode", "utf-8", "utf-16", "ascii"ですが、他の文字列も使えます。後述

外部システムから来たデータを一旦BinaryData型で受け取り、Encodingには、そのデータの文字コードセットを表す文字列をセットします。

Outputパラメータは、OutSystemsのText型なので、あとは普通に処理ができます。

試してみた限りでは、Encodingに"shift_jis", "shift-jis", "euc-jp"などを指定しても問題なく変換できました。

# 内部処理を検討してみる
ここからは、使うにあたっては知らなくてもいいことです。
内部処理が気になる人向け。

BinaryData APIはExtensionです。
そのため、IntegrationStudioで開き、更にオリジナルの実装コード(C#)をVisual Studioで開くことができます。

Inputパラメータで渡した、Encoding文字列は以下のコードで利用されています。

```C#
System.Text.Encoding.GetEncoding (ssEncoding)
```

これは、.NET FrameworkのライブラリのSystem.Text.Encodingクラスのメソッドです。
https://docs.microsoft.com/en-us/dotnet/api/system.text.encoding.getencoding?view=netframework-4.6.1#System_Text_Encoding_GetEncoding_System_String_

このメソッドのパラメータの説明は以下
> The code page name of the preferred encoding. Any value returned by the WebName property is valid. Possible values are listed in the Name column of the table that appears in the Encoding class topic.

[Encoding Class](https://docs.microsoft.com/en-us/dotnet/api/system.text.encoding?view=netframework-4.6.1)下側の表のName列に書かれている文字列は使えるということのようです。

実はこの中には、shift_jisはあっても、shift-jisはないんですが。どちらを使うかというと、一応の根拠を公式ドキュメントに求められるshift_jisのほうがいいかもしれません。
[Pythonでweb開発] html出力時の文字化け対策

色々と試しましたが、この方法が最適です。web serverとしても、localで起動する場合も文字化けしません。

```python
import io
import os
import sys

html_body = 'HTMLの形式です'

if type(sys.stdout) == io.TextIOWrapper:
    sys.stdout = io.TextIOWrapper(
        sys.stdout.buffer, 
        encoding='utf-8'
print ('Content-type: text/html; charset=UTF-8\r\n')
print (html_body)

```
Goの勉強のため自分のグローバルIPを確認するコマンドを作った

```
$ whatsmyip --version
             _               _     _                                 _             ___
 __      __ | |__     __ _  | |_  ( )  ___     _ __ ___    _   _    (_)  _ __     |__ \
 \ \ /\ / / | '_ \   / _` | | __| |/  / __|   | '_ ` _ \  | | | |   | | | '_ \      / /
  \ V  V /  | | | | | (_| | | |_      \__ \   | | | | | | | |_| |   | | | |_) |    |_|
   \_/\_/   |_| |_|  \__,_|  \__|     |___/   |_| |_| |_|  \__, |   |_| | .__/     (_)
                                                           |___/        |_|
whatsmyip version v0.1.0 (build with go1.10.4)
```

ときどき必要になるけど、控えておくのも面倒だし都度、「[アクセス情報【使用中のIPアドレス確認】- cman.jp](https://www.cman.jp/network/support/go_access.cgi) 」などのサイトを使って調べてたりしたけど、ちょうど良いので [先日書いたコード](https://qiita.com/snaka/items/5c84fe3a3c71b334ce85)をベースにターミナルで直接実行可能なコマンドを作った。

* https://github.com/snaka/whatsmyip

## インストール

```
go get github.com/snaka/whatsmyip
```


## 実行例

```
$ whatsmyip
113.43.xxx.xxx
```

## 作ってみた感想

Goはコンパイラが早いので軽量スクリプト言語に近い感覚で実装できるし、lintとかtestとかコーディング周りのツール類が標準で提供されていて、今は何が流行りなのかググったりして何日も潰したりしないのが良い。

~~非同期処理の待ちをゴルーチンとチャンネルの組み合わせで書いてみたけど、こんな使い方で良いのかよくわからない。~~ ゴルーチン使う必然性もなかったので普通にコールバック使うようにした。


## 参考

* [GoでSTUNサーバを使って自分のパブリックIPアドレスを取得 - Qiita](https://qiita.com/snaka/items/5c84fe3a3c71b334ce85)
postfixのキューから特定条件のメールを1行コマンドで削除する(postque,postsuper,xargs) 

postfixを運用していて、アプリの不具合とかテストの設定漏れなどで送信されずにBlockされ続けるようなメールを、一発で削除するためのコマンドです。

> 注意：消す前に、必ず postqueue -p で確認して本当に消して良いメールかを3回くらい考えてください。消したものを再送するのは大変なはずです

具体的には以下。

```bash
 postqueue -p | grep <消したいメールを絞り込む条件> | awk '{print $1}'| xargs -L 1 postsuper -d
```

私の場合は以下のように利用しています。アプリが不具合なのかテストなのかで時々変なメールを送ってしまうことがあってちょいちょい消すことが必要になりました。メールのエイリアス部に `teiki_test_bounce` が必ず含まれるのでこうしています。

```bash
postqueue -p | grep teiki_test_bounce | awk '{print $1}'| xargs -L 1 postsuper -d
```

## コマンド解説
簡単にコマンドの説明を。

| コマンド | 説明 |
| ------- | --- |
|postqueue -p | postfixのキューの情報を表示してくれます。削除するためのqueue_idや、送信元/先アドレスも確認ができます |
|grep <消したいメールを絞り込む条件> | grepで絞り込みます。削除したい要件によってはここが複雑になるでしょう |
| awk '{print $1}' | postqueue -p の結果から postsuper に渡すためのqueue_idを取得してます。良くある1列目だけ"射影"する使い方です |
| xargs -L 1 | xargsはパイプで渡された値を連続実行できる便利コマンドです。 `-L 1` で1行ずつ実行するとしています。理由はデフォだと一度に複数の値が渡されてしまい、postsuper -d がそれに対応していないためです |
| postsuper -d | xargsから渡されたqueue_idを削除するコマンドです。実際は `postsuper -d <queue_id>` のように実行されています。 |

最近ではなかなか自前postfixも減ってきてる気がしますが、あるところにはあるのでpostfix運用もエンジョイしていきましょう。
Python3 logging.basicConfigが効かない

# チェックすること
* プログラムの実行はpython3で行われているか?
    * python --version
    * あるいは明示的にpython3を用いる
* 意図せず他のファイルなどで複数basicConfigを定義していないか?
    * 下記コードの場合,ログはファイルに吐かれず標準出力に表示される

```main.py
import mycode1
import logging

logging.basicConfig(filename='test.log', level=logging.DEBUG)
logging.debug('test log at test.log')

```

```mycode1.py
import logging

logging.basicConfig(level=logging.DEBUG)
```
PythonでPDFをラスタライズする

# 背景
特定の環境で、ベクター形式のPDFの描画がうまく行かないことがあった。
この問題を回避するため、ベクターではなくJPEGなどにラスタライズされたPDFとして変換して保存したい。

# 方法
Python3を用いると容易に実現できた。

## 事前準備
* [Pillow](https://pillow.readthedocs.io/en/latest/installation.html)のインストール
* [pdf2image](https://pypi.org/project/pdf2image/)のインストール

## コード
```python:main.py
import pdf2image as p
from PIL import Image
import sys

# ラスタライズ時の解像度
# 値が大きいほど綺麗だが時間がかかる（ある値で綺麗さはサチる）
DPI = 300

# 最終出力PDFの画像縦幅
HEIGHT = 1200

pdfpath = sys.argv[1]
images = p.convert_from_path(pdfpath, dpi=DPI)

def resize(image):
    r = HEIGHT / image.height
    width = int(image.width * r)
    return image.resize((width, HEIGHT), Image.LANCZOS)

images = list(map(resize, images))
images = list(map(lambda image: image.convert('RGB'), images))

images[0].save('output.pdf',save_all=True, append_images=images[1:])
```

まずは解像度高めにラスタライズし、その後ほしい解像度の画像へ縮小すると画質が良好になる。

## 使い方
変換したいPDFファイル (`hoge.pdf`) が実行フォルダにあるとする。

```bash 
$ python main.py hoge.pdf
```

上記コマンドを実行すると、実行したディレクトリに `output.pdf` が生成される。

完
Awake, Start, Updateの違い

# Awake
- 全てのオブジェクトが初期化された後に読み込まれる。
- 必ずStartの前に読み込まれる。
- scriptが有効か無効かに関わらず読み込まれる。（Unity上のチェックを外しても読み込まれます。）

# Start
- Updateメソッドが最初に読みこまれる直前に読み込まれる。
- scriptが無効だと読み込まれない。

# Update
- 毎フレーム読み込まれる。
- パソコンの性能によって読み込まれる回数が変わってくるため、Time.deltaTimeを使って性能差を埋める必要がある。


# MonoBehaviourとは
- Unityで読み込まれる全てのscriptのベースクラス。
- C#を使うときは、MonoBehaviourから引き出して使う。


　[公式Document](https://docs.unity3d.com/ScriptReference/MonoBehaviour.html)
　[参考](https://gametukurikata.com/basic/update)
【まとめ】スクラム開発の役割、会議、成果物

# 概要
こちらの記事はスクラム開発についての記事です。
スクラム開発は独自の用語が山ほどあり、その用語が初めて参画する人にとって混乱のもとになっているように思われます。
したがって、本文はスクラム開発の基本要素、役割、会議、成果物について、それぞれを表にしました。そのことによって、少しでもその混乱を軽減できたらと思っております。ぜひ、こちらの記事をお気に入りやら、ストックしていただき、混乱した際にはみていただけると嬉しいです。


# 役割

| 役割      |簡単な説明      |
|-----------------|------------------|
|プロダクトオーナー|開発チームから生み出されるプロダクトの価値の最大化に責任を持つ|
|開発チーム| 各スプリントの終了時にリリース判断可能な「完成」したプロダクトインクリメントを届ける|
|スクラムマスター |スクラムの理論・プラクティス・ルール・価値基準を全員に理解してもらえるように支援する|


# 会議
| 会議      |簡単な説明      |
|-----------------|------------------|
|スプリント計画ミーティング|スプリントの作業はスプリントプランニングで計画する。これはスクラムチームの共同作業である|
|デイリースクラム | 開発チームのための 15 分間のタイムボックスのイベントである。スプリントでは、毎日デイリースクラムを開催する。開発チームは、次の 24 時間の作業を計画する|
|スプリントレビュー |スプリントの終了時にインクリメントの検査と、必要であればプロダクトバックログの適応を行うものである|
|スプリントレトロスペクティブ |スクラムチームの検査と次のスプリントの改善計画を作成する機会である|


# 成果物
| 成果物      | 作成責任者 | 簡単な説明      |
|-----------------|------------------|------------------|
|プロダクトバックログ| プロダクトオーナー |プロダクトに必要だと把握しているものをすべて順番に並べた一覧表|
|スプリントバックログ |プロダクトオーナー・開発チーム| スプリントで選択したプロダクトバックログアイテムと、それらのアイテムをプロダクトインクリメントにして届け、スプリントゴールを達成するための計画を合わせたもの |
|インクリメント | 開発チーム | これまでのインクリメントの価値と今回のスプリントで完成したプロダクトバックログアイテムを合わせたもの |


# 参考
[SCRUM BOOT CAMP BOOK](https://amzn.to/3anY7Xn)
[スクラムガイド](https://www.scrumguides.org/docs/scrumguide/v2017/2017-Scrum-Guide-Japanese.pdf)
WordPressで投稿者アーカイブページも検索に引っかかるようにしたい


顧客から受け継いだサイトで、投稿者アーカイブページを検索に引っ掛けたい、という要望がありました。

```functions.php

//店舗情報を格納するポストタイプを追加
//検索に引っ掛ける為。
/*============================================== */
function create_shop_post_type() {

  register_post_type( 'shop',  // カスタム投稿名
    array(
      'label' => '店舗情報',  // カスタム投稿ラベルを検索結果に出す為ラベルを設定
      'public' => true,  //検索結果に出す為PublicはTrue
      'has_archive' => false,
      'show_ui' => false,  //管理画面UI不要
      'rewrite' => false,   //URIのリライト不要
    )
  );
}
add_action( 'init', 'create_shop_post_type' );

```

```functions.php

// 説明：作成したカスタム投稿SHOPへのリンクを全て投稿者アーカイブに
/*============================================== */
function modify_shop_post_link($permalink){
    global $post;
    if($post->post_type === 'shop'){
        $permalink = get_author_posts_url( $post->post_author );
    }
    return $permalink;
}
add_filter('the_permalink','modify_shop_post_link');

```

```functions.php
//既存のユーザーに基づいてカスタム投稿SHOPを作成
//※一回だけ実行
/*============================================== */
function create_post_for_shopuser() {
  $shops = get_users( array(
    'role__in' => array( 'editor' ),
    'orderby' => 'nicename',
    'order' => 'ASC',
  ) );
  foreach ($shops as $shop) {
    $shop_name = get_field( 'shop_name', 'user_' . $shop->ID );
    $shop_img  = get_field( 'shop_img', 'user_' . $shop->ID );

    $post_id = wp_insert_post(
      array(
        'post_status' => 'publish',
        'post_title'  => $shop_name,
        'post_author' => $shop->ID,
        'post_name'   => $shop->user_nicename,
        'post_type'   => 'shop'
      )
      , $wp_error );
    update_post_meta($post_id,'eyecatch',$shop_img["id"]);
  }//end foreach
}
//add_action('admin_head','create_post_for_shopuser');

```

```functions.php

//店舗ユーザーが変更した際にカスタム投稿タイプSHOPも変更
/*============================================== */
function my_profile_update( $user_id, $old_user_data ) {
    $user = get_user_by('id', $user_id);
    if(!in_array('editor',$user->roles)){return ;}//店舗ユーザー以外
    $shop_name = get_field( 'shop_name', 'user_' . $user_id );
    $shop_img  = get_field( 'shop_img', 'user_' . $user_id );

    $myposts = get_posts(
      array(
        'posts_per_page'   => -1,
        'post_type'        => 'shop',
        'author'           => $user_id,
      )
    );
    foreach ($myposts as $post) {
      wp_update_post(
        array(
          'ID'          => $post->ID,
          'post_title'  => $shop_name,
          'post_name'   => $shop->user_nicename,
          'post_type'   => 'shop'
        )
        , $wp_error );
      update_post_meta($post->ID,'eyecatch',$shop_img["id"]);
    }
}
add_action( 'profile_update', 'my_profile_update');
```
アラフォー平凡男が子育てをしながらプログラミングスクールに通う話。

明日からプログラミングスクールに通います。

年齢的にもかなりアウェイ感は否めないと思うけどそんな事気にせず
自分のやりたいことで稼ぐ力を身につけたい。

ほんの触りだけhtml学んだくらいの超初心者だけど新しいこと学べるのは楽しみ。
Pythonのsmtplibでメールを送信せずにSMTPのMAIL FROMコマンド、RCPT TOコマンドだけ使いたい

## 結論

```python

import smtplib

server = smtplib.SMTP('gmail-smtp-in.l.google.com.', 25) # 接続先サーバー, ポート番号
server.ehlo()
server.mail('example@example.com') # MAIL FROMに指定するアドレス
server.rcpt('example@gmail.com') # RCPT TOに指定するアドレス

~
```

のような感じで `smtplib.SMTP.mail()` 、`smtplib.SMTP.rcpt()` を使えば良さそう。

## 詳細


### smtplib.SMTP.mail()、 smtplib.SMTP.rcpt() を使えば良いらしいが……

<img width="858" alt="スクリーンショット 2020-01-19 11.01.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553450/855cd0f3-343f-fa1b-939b-df59e9f6db83.png">

smtplibのドキュメント↑には、SMTPの `MAIL FROM` 、 `RCPT TO` コマンドを使いたかったら `mail()` メソッド、 `rcpt()` メソッドを使えば良いよ〜〜と書いてある↑。
しかし、引数にどんな値を渡せば良いのかなど `mail()`, `rcpt()` メソッドの詳細が書かれていない。

[smtplib --- SMTP プロトコルクライアント — Python 3.8.1 ドキュメント
https://docs.python.org/ja/3/library/smtplib.html
]
(https://docs.python.org/ja/3/library/smtplib.html)

### inspect.getsource() で実装を見る

```python
import inspect
import smtplib

mail = inspect.getsource(smtplib.SMTP.mail)
rcpt = inspect.getsource(smtplib.SMTP.rcpt)
```

のような感じで smtplib.SMTP.mail()、smtplib.SMTP.rcpt() のソースコード文字列を取得する。

こんな実装らしい↓
標準ライブラリがPEP8無視してるのはちょっと面白い。
(mail() の x.lower()=='smtputf8' の部分。E225: missing whitespace around operator)


```python:smtplib.SMTP.mail()
    def mail(self, sender, options=()):
        """SMTP 'mail' command -- begins mail xfer session.

        This method may raise the following exceptions:

         SMTPNotSupportedError  The options parameter includes 'SMTPUTF8'
                                but the SMTPUTF8 extension is not supported by
                                the server.
        """
        optionlist = ''
        if options and self.does_esmtp:
            if any(x.lower()=='smtputf8' for x in options):
                if self.has_extn('smtputf8'):
                    self.command_encoding = 'utf-8'
                else:
                    raise SMTPNotSupportedError(
                        'SMTPUTF8 not supported by server')
            optionlist = ' ' + ' '.join(options)
        self.putcmd("mail", "FROM:%s%s" % (quoteaddr(sender), optionlist))
        return self.getreply()

```

```python:smtplib.SMTP.rcpt()
    def rcpt(self, recip, options=()):
        """SMTP 'rcpt' command -- indicates 1 recipient for this mail."""
        optionlist = ''
        if options and self.does_esmtp:
            optionlist = ' ' + ' '.join(options)
        self.putcmd("rcpt", "TO:%s%s" % (quoteaddr(recip), optionlist))
        return self.getreply()
```

というわけで、`mail()`、`rcpt()` の引数には、それぞれ単純に指定したいメールアドレス文字列を渡せば良いっぽい (冒頭に戻る)。
c# メモ　イベント

```

public sealed class EventSample
{
    public delegate void EventHandler();
    public event EventHandler Event = () => { };

    void Do()
    {
        Event()
    }

    public class Sample
    {
        EventSample sample;

        void Regist()
        {
            sample.Event += DoSomething;
        }

        private void DoSomething()
        {

        }
    }
}

```
Javaのインライン展開についてちょっと実験してみる

JavaではJITコンパイラがインライン展開を行っているということは聞いたことがあるのですが、それによってどれだけの恩恵を受けているのか、ちょっと実験してみたくなりました。

## そもそもインライン展開とは
詳細は[Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%A4%E3%83%B3%E3%83%A9%E3%82%A4%E3%83%B3%E5%B1%95%E9%96%8B)を参照してください。
要はメソッドの呼び出しにはオーバーヘッドがあるため、メソッド内の処理をメソッドの呼び出し側に埋め込んでしまえば、メソッド呼び出しのコストを抑えることができるということですね。JITコンパイラが必要に応じてこれを行っています。

## 実験

今回試してみるコードは以下の通りです。StringBuilderに文字列をappendするだけのメソッドを用意して、繰り返し呼び出してみました。
同じメソッドを何度も呼び出していますので、インライン展開される／されないによってパフォーマンスに差が出るのではないかと仮説を立ててみました。

```java:InlineSample.java
public class InlineSample {

	public static void main(String[] args) {

		long start = System.currentTimeMillis();

		StringBuilder builder = new StringBuilder();
		for (int i = 0; i < 10_000_000; i++) {
			appendHoge(builder);
		}
		System.out.println(builder.length());
		
		long end = System.currentTimeMillis();
		System.out.println("elapsed " + (end - start) + " ms");
	}

	private static void appendHoge(StringBuilder builder) {
		builder.append("hoge");
	}
}
```

このコードをインライン化を有効/無効の両方のパターンで実行して性能を検証しました。
インライン化はデフォルトで有効になっているため、以下のVMパラメータを追加することによって無効化しました。

```
-XX:-Inline
```

なお、Windows10、Java15-eaの環境で試しています。

## 結果

5回試行して平均をとったところ、以下のような結果になりました。

```
インライン展開ON： 平均 125ms
インライン展開OFF： 平均 342ms
```

結構な差ですね。
ただ、JITコンパイルはプログラム実行中に行われますので、プログラムの実行開始時からインライン展開されていたわけではありません(-XX:+PrintInlining オプションによりインライン展開のログを確認しました)。この点ではあまり公平な比較にはなっていません。
ベンチマークツールのJMHを使ったほうがよかったかなと思いますが、ともあれ、これだけの差がつくとは驚きです。

なお、インライン展開の対象となるメソッドのサイズは

```
-XX:MaxInlineSize=<size>
```

により、指定することができます。デフォルトは35バイトです。
インライン展開を意識したコードを書くことによって、よりJITコンパイラの恩恵を受けることができるかもしれませんね。

## 参考
https://docs.oracle.com/javase/jp/8/docs/technotes/tools/unix/java.html
【Dash】表示と同時に検索窓にフォーカスするグローバルショートカット

## はじめに
先日、[こちらの記事](https://qiita.com/imk2o/items/3f7e507c1ea857c8f225)を拝見し、Dashの存在を知りました。
※めちゃくちゃ分かりやすい記事でした！ありがとうございます。:bow_tone1:

当記事では、紹介されていた中には見当たらなかった、
**「表示と同時に検索窓にフォーカスする」**ショートカット
が便利だと思い、割り当てる方法を紹介します。

## 環境
```yaml
OS: macOS Catalina 10.15.1
Dash: 5.1.0
```
## 設定手順
<img width="233" alt="スクリーンショット 2020-01-19 10.29.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483292/3960225b-e17c-d760-c20e-ed194612885c.png">
↓
<img width="707" alt="スクリーンショット 2020-01-19 10.35.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483292/df6ecdc5-5583-be26-5e14-83e8df1e6ce0.png">

上記をクリックして、好きなコマンドを割り当てます。

### **Show Dash**
Dashを表示するだけ。
検索窓に移動するには**Command + L**を押す必要があります。

### **Show Dash and focus search field**
Dashを表示し、検索窓に入力待ちの状態に出来る。
**Command + L**を押す必要がなく、より**ノンストレス**な環境になりました。 

※自分の環境では**Control + G**に割り当てています。

## おわりに
最後まで読んで頂きありがとうございました:bow_tone1:

どなたかの参考になれば幸いです:relaxed:

## 参考にさせて頂いたサイト（いつもありがとうございます）
[Dash 5の使い方 - Qiita](https://qiita.com/imk2o/items/3f7e507c1ea857c8f225)
C# メモ

```

using System;
using System.Threading.Tasks;

public sealed class Timer
{
    private Action _action;
    private int _ms;
    private bool _setsTime;
    private bool _setsAction;
    private bool _excecuteStartAsyncBefore;

    public void SetTime(int ms)
    {
        CheckSetsTimeYet();
        _setsTime = true;
        _ms = ms;
    }

    public void SetAction(Action action)
    {
        CheckSetsActionYet();
        _setsAction = true;
        _action = action;
    }

    public async void StartAsync()
    {
        CheckReady();

        _excecuteStartAsyncBefore = true;
        await Task.Delay(_ms);
        Fire();
    }

    private void Fire()
    {
        _action.Invoke();
    }

    private void CheckReady()
    {
        CheckSetNeccesaryValues();
        CheckFirstExcecte();
    }

    private void CheckSetNeccesaryValues()
    {
        if (!_setsTime || !_setsAction)
            throw new Exception("Set Time and Action");
    }

    private void CheckFirstExcecte()
    {
        if (_excecuteStartAsyncBefore)
            throw new Exception("Not first execute");
    }

    private void CheckSetsTimeYet()
    {
        if (_setsTime)
            throw new Exception("Already Set Time");
    }

    private void CheckSetsActionYet()
    {
        if (_setsAction)
            throw new Exception("Already Set Action");
    }
}
```
Q12.今日の日付をyyyymmdd形式で取得するには？

例えば、ファイル名とかに取得したタイミングの日付を末尾につけたりするケースとかありますよね。
aaa_2020mmddみたいな感じでね。
当日の日付をyyyymmdd形式で取得するにはどうしたらいいでしょう？
実はVBAでは簡単に取得することができます。

今回は、単純に当日日付をダイアログで表示するだけのごくシンプルなマクロを作ってみましょう。


###■回答
```VB
Sub Q12_Answer()
    MsgBox Format(Date, "yyyymmdd")
End Sub
```

###■解説
Format関数を使うだけのシンプルなコードです。
Format関数を使うといろいろな形式で表現することができます。

例えば、yyyy/mm/ddといった区切りに/を使った表現とかね。

今回はファイル名でつけることを想定して考えたのでこのような形式にしています。

実行結果は以下です。(2020/01/19に実行しています。) 

![Q12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560479/5840414d-31cd-6626-e54f-1209c5a4709c.png)
iOS, Androidアプリの価格変更（キャンペーン）の仕方

# はじめに
以前アプリをリリース（[iOS, Mac, Androidのアプリをリリースしてみた
](https://qiita.com/am10/items/41d94d5175dbf63fc706)）したのですが、複数の方から100円も払えるかクソが！！といわれました:sob:

まだ機能が思ってる完成形には達していないし、やっぱだれかがダウンロードしてくれないとおもしろくないししばらくは無料にすることにしました！！

たまにみるキャンペーンみたいなので期間限定無料をやりたいと思い調べていたのですがやり方があんま出てこなかったので備忘録として書きます。

# iOS, Mac版
iOSとMacアプリについてです。やり方はめっちゃ簡単。（だからあんま調べてもでてこないのかも）

1. 下記ページを開きます  
App Store Connect -> マイ App -> 対象アプリ -> App Store -> 価格および配信状況
2. 価格表の「価格変更を計画」をクリック 
3. 価格、開始日、終了日を選択  
<img width="500" alt="ios_price" src="https://user-images.githubusercontent.com/34936885/72667137-dba9e180-3a5b-11ea-875e-3373b2b5a856.png">
4. 「終了」クリック
5. 「保存」クリック

終了日は元の価格に戻る日付のようです。（2月いっぱい無料にしたかったのに間違えた:see_no_evil:）

<img width="336" alt="ios_sell" src="https://user-images.githubusercontent.com/34936885/72667140-e2d0ef80-3a5b-11ea-930b-8d9b1185fab8.png">

# Android版
Androidアプリについてです。こっちもめっちゃ簡単。

1. 下記ページを開きます  
Google Play Console -> 対象アプリ -> ストアでの表示 -> 価格と配布 -> セール
2. セール名を設定
3. セール期間を設定（最大8日間らしいです）
<img width="1332" alt="android_sell" src="https://user-images.githubusercontent.com/34936885/72667172-20ce1380-3a5c-11ea-82e7-b9ccb95e794f.png">
4. 価格を設定（最低30%オフらしいです）
<img width="405" alt="android_price_annotation" src="https://user-images.githubusercontent.com/34936885/72667164-0d22ad00-3a5c-11ea-8765-1112cc22b9fb.png">
5. 「販売スケジュールを設定」クリック

一旦セールを行うと次のセール作成は30日間おこなえないようです。

<img width="500" alt="android_new_sell" src="https://user-images.githubusercontent.com/34936885/72667175-2af01200-3a5c-11ea-8b08-5646b1aec1cc.png">

参考：[Play Console ヘルプー有料アプリのセールを作成する](https://support.google.com/googleplay/android-developer/answer/7271135?hl=ja)

# さいごに
セールの開始日を当日にすると反映までは多少時間がかかるみたいです。余裕をもってセールを設定しましょう！！(iOSは3時間くらいでAndroidは8時間くらいでした)

今無料なんでだれかダウンロードしてください:bow_tone1::bow_tone2::bow_tone3::bow_tone4::bow_tone5:

* [Macアプリ](https://apps.apple.com/jp/app/dna%E5%A4%89%E6%8F%9B/id1494127578?mt=12)
* [iOSアプリ](https://apps.apple.com/app/id1493994947)
* [Androidアプリ](https://play.google.com/store/apps/details?id=am10.dnaconverter)
* [Web版（httpです。）](http://adventam10.php.xdomain.jp/dna/index.php)
Qiitaに投稿して１ヵ月

##1.投稿前の苦悩

Qiitaに投稿して1ヶ月が経った。
始める時は、結構勇気が必要だった。
投稿するほどのネタが自分にはないように感じていた。

仕事でプログラムに従事しているが、使っている言語も
VB.NET(学生時代はC言語、社会ではVB系は一通り経験)だったりとカッコ良さはあまりない。
仕事もあるし、土日に勉強している時間なんてないのではないか。

__そして何より、プログラマの為の情報共有サイトというのが、また高レベルな響き__だったのだ。

+ 多数の言語を使いこなすスーパープログラマの集団
+ 最新の技術動向について繰り広げられる熱い議論
+ 巨大で極秘プロジェクトに携わる人々←？
　（これは一部関わった事はあるが、マジで言えない事だらけ。）
+ オレ強い系の人々の技術自慢

__そんな凄い人達のいる場所で、拙いメモ書きを放り投げるなんて
出来ないのはないか。__

プログラムに関係ない内容は削除という所も引っかかっていた。
__あんまり、拙い内容だと削除されるのではないか。__
など物凄い不安を抱えていた。

##2.Qiitaで初下書きと感動

土曜日のお昼、勇気を出して下書き開始。
取り敢えず、業務とは全く関係のないPHPを家で勉強していた時に、
作っていたプログラムをコピペしてみた。

__超ダサイ初心者丸出しの自分のプログラムが、「カッコよく見える」__
ハイライトがカッコ良いのだ。
人は見た目が9割というのと同じだ。

これ、見た目がカッコ良いので投稿しよう。（単純）
美しいハイライトが、ネガティブな自分の背中を押してくれた。

##3.Qiita効果

+ __1.ネタを探す為に、仕事以外で勉強するようになった事__
+ __2.【土日に使うゲームのレベル上げの時間】が減った事__
+ __3.プログラムの保存先が出来て、安心感が増えた事__
+ __4.勉強をしている実績が見える事__
+ __5.勉強している自分を意識高い系だと自信が持てる__
+ __6.誰も注目していないし、自分を知らないので堂々とオンラインメモ帳
として使うこともできる。__

__1,3,5が特に大きい効果だと思う。
今後も、少しずつ知識を更新していくつもりです。__
0119日記

ドットインストールも見ちゃったし、とりあえず興味ありそうな投信のポートフォリオ分析の分野の記事を少し読んでみた。
そしたら、まだインストールしてないモジュールがあったから、とりあえずインストール
これは、インストールの手順の備忘録

```import selenium as sl```
したら
moduleNotFoundError
が出たから
```pip install selenium```
したら、インストールできた
これでブラウザを自動操作できるらしい
使うかわかんないけど、初めてのインストールもできたから満足
振り返り Atcoder キーエンス2020 B問題

## 対象の問題
[キーエンス2020 B - Robot Arms](https://atcoder.jp/contests/keyence2020/tasks/keyence2020_b)

## 参考にさせて頂いた解法
[公式解説](https://www.youtube.com/watch?v=sDhvTPOn95s)
[Derekさんの提出結果](https://atcoder.jp/contests/keyence2020/submissions/9564386)

## 考え方
- 右端が一番左に位置するものを残していけばよい（区間スケジューリング問題というらしい）

## 解法の大まかな流れ
1. [pair](https://cpprefjp.github.io/reference/utility/pair.html)を用いてfirstに右端（x+l),secondに左端(x-l)をいれる。
2. 1の1組を1つの要素としてvectorにいれる。
3. 右端が左に位置するものの順に(=first順で昇順に)ソートする
4. ソートした順に現在地(最初は極小の値)と左端を比べて、左端の方が現在地よりも左側にあるのならば残さない。そうでないならば(左端が現在地から右側にあるならば)残して、現在地を残した右端にする


## 解説のコードにコメント追記
[derekさんの提出コード](https://atcoder.jp/contests/abc150/submissions/9407674)をベースにコメントを追記

```c++

#include <map>
#include <iostream>
#include <algorithm>
#include <vector>
#define rep(i,n) for(int i = 0; i < n; i++)
using namespace std;
typedef long long ll;

int n,ans = 0;
int now = -2e9; //極小な値で初期化
vector<pair<int,int>> v;

int main(){
 cin >> n;
 rep(i,n){
   ll x,l = 0; cin >> x >> l;
   v.push_back(make_pair(x+l,x-l)); //右端をfirst,左端をsecondとして要素を追加していく
 }

 sort(v.begin(),v.end()); //first,secondの昇順でソート

 rep(i,n){
   if(v[i].second < now){
     continue; // 左端が現在地よりも左側ならば残さない
   }
   else{ //そうでないならば現在地を右端にして残す
     now = v[i].first;
     ans++;
   }
 }
 cout << ans; //残した数を提出
}
```
Jupyter Notebook で音声データを HTML の表の中に埋め込んで再生できるようにする

# やりたいことと問題

Jupyter notebook の Audio を埋め込みは可能だが、それを HTML の Table に埋め込んで、多数の音声データを一覧で表示したり再生したりしたい。つまり、以下のような表を作りたい。

|F0|音声|
|:---|:---|
|440Hz|[再生バー]|
|880Hz|[再生バー]|
|1320Hz|[再生バー]|

しかし、```IPython.display.Audio``` を display しただけでは、その場で再生バーが表示されてしまって、上のように表に埋め込んだりができない。

# ポイント

```IPyhton.display.Audio``` オブジェクトの ```audio.src_attr()``` が、音声データを base64 エンコードしたものなので、これを使って HTML を再生してやるとよい。

# やり方

440Hz, 880Hz, 1320Hz の 1秒の音声データを再生する表を作るには

```python
from IPython.display import Audio, HTML
import numpy

# 初期設定
duration = 1
fs = 16000
f0s = [440, 880, 1320]

# HTML Table の生成
html = "<table><tr><th>F0</th><th>音声</th></tr>"
for f0 in f0s:
    # Audio オブジェクトの生成
    wave = numpy.sin(f0 * 2 * numpy.pi * numpy.linspace(0, duration, duration * 16000))
    audio_obj = Audio(data=wave, rate=fs)
    
    # Audio オブジェクトの埋め込み
    html += """
    <tr><td>%s Hz</td><td>
        <audio controls>
            <source src="%s" type="audio/wav">
        </audio></td>
    </tr>
    """ % (f0, audio_obj.src_attr())

# Table を閉じる
html += "</table>"

HTML(html)
```

これで、こんな風に表形式で音声の埋め込みができる。
<img width="467" alt="スクリーンショット 2020-01-19 10.57.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29984/491b48a2-eb34-1a0e-4a34-70657b0bbae9.png">
Railsチュートリアル 第13章 ユーザーのマイクロポスト - 画像のリサイズ

# 画像の自動リサイズ処理が必要な理由

ファイルサイズに対するバリデーションは、[Railsチュートリアル 第13章 ユーザーのマイクロポスト - 画像の検証](https://qiita.com/rapidliner00/items/351b9b08e91c61237de2)で実装できました。しかしながら、画像サイズ（縦横の長さ）に対する制限は、現状では存在しません。そのため、大きすぎる画像サイズ（横2048ピクセル等）のファイルがアップロードされると、以下のようにレイアウトが壊れてしまいます。

<img width="1168" alt="スクリーンショット 2020-01-10 8.15.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323778/434e0a7d-09b6-df91-0ff3-cadbf6bde52c.png">

# ImageMagickのセットアップ

Railsチュートリアルを進めていっている開発環境においては、ImageMagickは必ずしもインストールされているとはいえません。また、ImageMagickそのものはgemというわけではないので、Bundlerによる管理の対象とはならず、個々の環境で別途インストールする必要があります。homebrewとかdnfとかでインストールするやつですね。

Dockerのrubyイメージは、Debianをベースに構成されています。そのため、ImageMagickをインストールするためのコマンドは以下となります。

```
# apt install imagemagick -y
```

yumにおけるパッケージ名（Railsチュートリアル本文に記述されていたものです）とは異なり、`imagemagick`は全て小文字となります。

# 実際に画像のリサイズを行うように画像アップローダーを修正する

今回は、「画像の縦横どちらかが400pxを超えていた場合、適切なサイズに縮小する。但し、画像を引き伸ばすことはしない。」という内容の実装とします。

## MiniMagick gemについて

RubyでImageMagickを使うためのgemはMiniMagickといいます。gemそのもののインストールは、[CarrierWave gemのインストールと同時に済ませています。](https://qiita.com/rapidliner00/items/a6733ce24f77b3eef3df)

```ruby:Gemfile
source 'https://rubygems.org'

# ...略
gem 'carrierwave',             '1.2.2'
gem 'mini_magick',             '4.7.0'  # <-- 既にインストール済み
# ...略

group :production do
  gem 'pg',  '0.20.0'
  gem 'fog', '1.42'
end

# ...略
```

## `CarrierWave::MiniMagick`モジュールについて

CarrierWaveには、MiniMagickを使うための機能が含まれています。但し、当該機能を使うためには`CarrierWave::MiniMagick`というモジュールを`include`する必要があります。

```ruby:
include CarrierWave::MiniMagick
```

## 画像のリサイズ処理の実体

「画像の縦横どちらかが400pxを超えていた場合、適切なサイズに縮小する。但し、画像を引き伸ばすことはしない。」という内容の実装の場合、その実体は以下のようになります。

```ruby:
process resize_to_limit: [400, 400]
```

`process`メソッドに、`resize_to_limit`というシンボルをキーとするハッシュを与えます。ハッシュの値には、`[縦ピクセル数, 横ピクセル数、{オプション}]`という配列を与えます。

## Pictureアップローダーの内容を変更する

上記を総合すると、`app/uploaders/picture_uploader.rb`の変更内容は以下のようになります。

```diff:app/uploaders/picture_uploader.rb
  class PictureUploader < CarrierWave::Uploader::Base
    # Include RMagick or MiniMagick support:
    # include CarrierWave::RMagick
-   # include CarrierWave::MiniMagick
+   include CarrierWave::MiniMagick
    process resize_to_limit: [400, 400]

    # Choose what kind of storage to use for this uploader:
    storage :file
    # storage :fog

    ...略

    # Add a white list of extensions which are allowed to be uploaded.
    # For images you might use something like this:
    def extension_whitelist
      %w(jpg jpeg gif png)
    end

    ...略
  end
```
「Excelをやめてタスク管理に移行する」というタスクを作った


# ExcelでToDo管理をしている時代遅れ感

### 2020年のポエム
やっぱりExcel主義者とは相いれないと、いつも思っているけど、あらためて2020年にも思った。ポエムです。

### 共有できない
一見共有フォルダにいれて共有できているように見えて、共有ファイルを開いたり更新しようとすると、別の相手が開いているのでロックされたり、更新に失敗したりする。Excelには共有ファイルを直接開いて編集すると中身がすべて消える致命的なバグもある。開いて更新したら消えるって、どんなソフトだよ…。

### どれが最新かわからない
しかたないので別名で保存すると、どれが最新かわからない。マージはぜんぶ手作業でどれだけ時間があっても終わらない。マージ中に別のファイルが増えていたりする。ほんとに終わらない。差分を赤字にしろとか言い出す文化もある。差分を手作業で赤くしているうちに、ぜんぶ真っ赤になってくる…。ほんとに仕事終わらない。差分の抽出なんて、ソフトに任せればいいじゃないか。

### ToDoの項目が多くてスクロールしないと見えない
ToDoの最小限の項目は、ステータス、ToDo内容だが、それ以外に山ほど項目を用意したりしていて、上下だけでなく左右にもスクロールしないと読み切れない。重要な項目だけを一覧できるようにセルを移動しようとしても、なぞのマクロを組んでいて移動できない。

### 終わった項目をグレーにする色が合わない
そのグレーは、ひとによって濃淡が異なったりする。
気になるといえば気になるし、気にならないと無視していても、結局エクセル好きのだれかが会議で色をそろえろとか号令を出す。無駄な作業が増える…。

### 遅い重い表で見つけられない
ToDoの項目が200とか1,000とかになったときの絶望的な重さと見つけにくさ。見つけられないToDoは意識から消えていくから、結局ToDoとして機能しない。

いちどTodo.lyとかRedmineとかを使うと、Excelのあまりの手作業の多さと不合理さとExcel信奉者の信仰ゆえのなぞルールの多さに辟易してくる。ToDoのいちばん最初に、「Excelをやめてタスク管理に移行する」というタスクを作ったが、実現の見込みなし。