OmniAICreator/Qiita-1.07M huggingface dataset:
cssを使ったくの字型の大きさを変える方法

#<h1>初めに</h1>
くの字型の矢印をcssを使って書くことができる人は多いはず（多分😰)
ただ、その大きさを変えることができる人は何人いるだろうか。

今回、crowdworksの案件を受注した際に、

ボタン名 >　

みたいなボタンを作らなければいけなかったのに、
ボタン名はfont-sizeで大きくできるけど、その右にあるくの字型を
大きくする方法がわからずに試行錯誤したが、
なんとかできたので、備忘録としてこの記事を書く

#<h1>くの字型の書き方（復習）</h1>
まずは、復習としてくの字型の書き方をおさらいしておく

```html
<p class="arrow"></p>
<p>arrow</p>
```

```css
.arrow{
    position: relative;
    display: inline-block;
    padding-left: 20px;
  }
  
  .arrow::before{
    content: '';
    width: 6px;
    height: 6px;
    border: 0px;
    border-top: solid 2px #5bc0de;
    border-right: solid 2px #5bc0de;
    -ms-transform: rotate(45deg);
    -webkit-transform: rotate(45deg);
    transform: rotate(45deg);
    position: absolute;
    top: 50%;
    left: 0;
    margin-top: -4px;
  }
```

これで、htmlファイルを開いてみると、
![スクリーンショット 2019-06-18 10.25.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/343721/95f8d65c-e3ed-6c47-34ce-8b6c9751a6ef.png)

こうなる。

##<h2>大きさを変える</h2>
じゃあ、次に大きさを変えてみよう。
大きさを変えるには.arrow::before
のwidthとheightを任意の大きさに変えれば、くの字の大きさを変えることができます。


```html
<p class="arrow"></p>
<p>arrow</p>
```

```css
.arrow{
    position: relative;
    display: inline-block;
    padding-left: 20px;
  }
  
  .arrow::before{
    content: '';
    width: 60px;
    height: 60px;
    border: 0px;
    border-top: solid 2px #5bc0de;
    border-right: solid 2px #5bc0de;
    -ms-transform: rotate(45deg);
    -webkit-transform: rotate(45deg);
    transform: rotate(45deg);
    position: absolute;
    top: 50%;
    left: 0;
    margin-top: -4px;
  }
```

widthとheightをそれぞれ10倍にしました。
これでhtmlファイルを開いてみると。。。。


![スクリーンショット 2019-06-18 10.28.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/343721/d6f5809d-a763-6b0a-975c-f10587b7bd3f.png)

こうなりました。

##<h2>大きさは変わったけど。。。</h2>
見てもらえばわかると思うが、大きさは変わったが、文字列arrowにくの字がめり込んでいる。

これを解消せねば、真の意味での大きさを変えるとはいかない


```html
<p class="arrow"></p>
<p class="text">arrow</p>
```

```css
.arrow{
    position: relative;
    display: inline-block;
    padding-left: 20px;
  }
  
  .arrow::before{
    content: '';
    width: 60px;
    height: 60px;
    border: 0px;
    border-top: solid 2px #5bc0de;
    border-right: solid 2px #5bc0de;
    -ms-transform: rotate(45deg);
    -webkit-transform: rotate(45deg);
    transform: rotate(45deg);
    position: absolute;
    top: 50%;
    left: 0;
    margin-top: -4px;
  }
  .text{
      padding-top:40px;
  }
```

これでhtmlファイルを開いてみるとこうなる。（ドキドキ、ドキドキ）
![スクリーンショット 2019-06-18 10.35.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/343721/71975bbf-32fd-d121-dd9b-6c56518a5080.png)

移動させたいテキストにクラスを付与して、padding-topを追加すれば良いとな:hushed:

これで、皆さんのcssライフがより良くなると信じて筆を置きます。
Flutterで見切れるリストを作成する

# 概要
見切れるリストとは、下記のスクショのようなレイアウトです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136368/7c0f1872-7bee-0064-aab3-87c3d9a929da.png)

赤枠で囲われた「ほげほげほげ」という文字列が連続で表示されていますが、矢印アイコンのところで見切れています。
自分がこれを実装したいと思った時に、`flutter list overflow`や`flutter clip row`など、色々な検索ワードで検索しましたがそれらしい記事が見つからなかったので、今回記事として作成しました。

# 実装
一覧表示は`Row`、見切れる表示は`SingleChildScrollView`で実現します。

```dart
SingleChildScrollView(
  physics: NeverScrollableScrollPhysics(),
  scrollDirection: Axis.horizontal,
    child: Row(
      children: <Widget>[
        Container(
          child: Text("ほげほげほげ"),
          decoration: BoxDecoration(
            border: Border.all(color: Colors.red)),
        ),
        Text(" - "),
        Container(
          child: Text("ほげほげほげ"),
          decoration: BoxDecoration(
            border: Border.all(color: Colors.red)),
        ),
        Text(" - "),
        Container(
          child: Text("ほげほげほげ"),
          decoration: BoxDecoration(
            border: Border.all(color: Colors.red)),
        ),
        Text(" - "),
        Container(
          child: Text("ほげほげほげ"),
          decoration: BoxDecoration(
            border: Border.all(color: Colors.red)),
        ),
      ],
    ),
)
```

ポイントとしては、`SingleChildScrollView`に`physics: NeverScrollableScrollPhysics()`を指定して、スクロール不可能なリストにしていることです。
Vueで神経衰弱（途中）

プログラミング練習編。思いつき次第色々作っていこうかなと思います。
#成果物
[こちら（jsfiddle）](https://jsfiddle.net/3ytp8x26/4/)

#課題
1. カードをランダムにしたい  
同じ配列を２回ループしてカードを複製してしているので、ちょっと作りを変えなければいけなそう。  
1. 表→裏のアニメーションが不自然  
表と裏で要素を分けてアニメーションした結果、最初の裏→表は綺麗にできたが、逆は順番が反対になったせいで不自然になってしまった。  
クラスの付替えでアニメーションさせるという作りがjQuery的（偏見）であまりスマートではない気がする。  
要素の裏にbackgroundを指定したい。。
1. 連続でクリックすると挙動が怪しい  
これはsetTimeoutを使った為か・・。  
カード移動の処理が終わるタイミングまでクリックできないようにするのが簡単で良さそう。
pythonで他プロセスへシグナルを送る方法

## シグナル送信

pidを元に指定されたプロセスへSIGKILLを送信

``` python
def do_kill_process(pid):
    try:
        os.kill(int(pid), signal.SIGKILL) # kill(pid, sig)
    except OSError as e:
        if e.errno != errno.ESRCH: #「No such process」じゃない場合
            raise e
```

利用可能なシグナルはsigkill以外にも多数あるので下記の公式ドキュメントがわかりやすかったです。
[signal --- 非同期イベントにハンドラを設定する](https://docs.python.org/ja/3/library/signal.html#module-signal)

## シグナルハンドラ

pythonで書くシグナルハンドラの例です。
今回の例ではSIGINTをハンドリングしています。

``` python
def func(num, frame):
    print (num, str(frame))

signal.signal(signal.SIGINT, func)
for i in range(100):
   sleep(10)
```

上記、実行中にCtr-Cを入力しても受けとたシグナルナンバーとスタックフレームが出力されるだけとなります。
for文

##基本
```go
func main() {
	for i := 0; i < 10; i++ {
		fmt.Println(i)
	}
}
```

###continueを使ってスキップさせる
```go
func main() {
	for i := 0; i < 10; i++ {
		if i == 3 {
			fmt.Println("continue")
			continue
		}
		fmt.Println(i)
	}
}
```

###breakを使って中断させる
```go
func main() {
	for i := 0; i < 10; i++ {
		if i == 3 {
			fmt.Println("continue")
			continue
		}
		if i > 5 {
			fmt.Println("break")
			break
		}
		fmt.Println(i)
	}
}
```

##for文の省略した書き方2つ
###その1
```go
func main() {
	sum := 1
	for; sum < 10; {
		sum += sum
		fmt.Println(sum)
	}
	fmt.Println(sum)
}
```
###その2(セミコロン省略)
```go
func main() {
	sum := 1
	for sum < 10 {
		sum += sum
		fmt.Println(sum)
	}
	fmt.Println(sum)
}
```
##その他
###無限ループ
```go
func main() {
	sum := 1
	for sum < 10 {
		sum = 0
		fmt.Println(sum)
	}
	fmt.Println(sum)
}
```

```go
func main() {
	for {
		fmt.Println("infinite loop")
	}
}
```
>【参考】
現役シリコンバレーエンジニアが教えるGo入門(https://www.udemy.com/share/100BhMB0obeFpbTX4=/)
便利なbashrc設定のメモ Ubuntu(Raspberry Pi/Jetson Nano)


## 追記
　以下のページにまとめました。

[Ubuntuをちょっと使いやすくする設定集](https://qiita.com/karaage0703/items/705f1b750c486f00d554)

# bashrcの設定メモ
　いつも忘れるので、個人的メモです。大体以下を`.bashrc`に追記します。


```sh
# keyboard setting
setxkbmap -model jp106 -layout jp -option ctrl:nocaps

# open alias (same as Mac)
alias open='xdg-open'

# git prompt
export PS1='\[\033[32m\]\u@\h\[\033[00m\]:\[\033[34m\]\w\[\033[31m\]$(__git_ps1)\[\033[00m\]\$ '
```

# 設定の簡単な解説
## keyboard setting
日本語キーボード設定すると共に、CAPSキーをCTRLキーとして使えるようにします。


## open alias
　Macと同じようにターミナルで `open .`と打つと、カレントディレクトリ（自分が今いるディレクトリ）をGUIで表示してくれます。Macだとファインダが勝手に開いてくれます（よく分からなかったらとりあえず試して見て下さい）。

　`oepn ..`とか`open <開きたい場所>`とかで好きなディレクトリをGUIで開けるので結構便利です。

　xgd-openは、何故かエラーが出ます。私は気にせず使っていますが、気になる人は、以下とか参考に修正下さい。

[xgd-openのエラー](https://qiita.com/harmegiddo/items/8cd414b4fa7358c67b96)

## git prompt
　ターミナルのプロンプトに、gitのbranch名が表示されるようになります。お好みで。

# Macのbashrc設定
　以下記事参照下さい。

[Macの.bashrcセットアップ](https://karaage.hatenadiary.jp/entry/2016/03/30/073000)
docker-composeでredisコンテナがconnection refusedする

# TL;DR
コンテナ間の通信がうまくいかなくてかなりハマったdocker学習中なので備忘録
コンテナ間でアクセスする時のホストは`127.0.0.1`でなく`redis`というコンテナ名で大丈夫

# docker-compose.yml

```yml
version: "3.4"

services:
  web: 
    image: nginx:1.15
    links:
      - app
    volumes:
      - ./default.conf:/etc/nginx/conf.d/default.conf
      - ../:/usr/local/dir
    ports:
      - "8888:80"
    env_file: .env

  app:
    build: .
    tty: true
    working_dir: /usr/local/dir
    links:
      - redis
    volumes:
      - ../:/usr/local/dir
    env_file: .env

  redis:
    image: redis:latest
    ports:
      - 6379:6379
    command: redis-server

```

- 構成は`php7.3-alpine`+`nginx`+`redis`でPHPでPredis使用  
- PHP内で以下のようにPredisをnew

```php5
public function __construcr($port, $host)
{
    $client = new Predis\Client([
        'scheme' => 'tcp',
        'host'   => $host,
        'port'   => $port,
    ]);
}

```

- この`$host`の実態は、`$_SERVER`から取得した`127.0.0.1`
- ログを見るとnewはできているものの、Predis呼び出しの時に`Connection Refused 127.0.0.1:6379`的なメッセージが


# 解決策

```php5
public function __construcr($port, $host)
{
    //このホストを127.0.0.1=>"redis"に
    $client = new Predis\Client([
        'scheme' => 'tcp',
        'host'   => $host,
        'port'   => $port,
    ]);
}

```

- この`127.0.0.1`というのはappコンテナ内だと、そのコンテナ(appコンテナ)のIPアドレス
- redisコンテナは別なので、ホスト名を明示的にしてあげないとアクセスできない
- ただ同じネットワーク内なので`redis`と明示してあげればOK
期間を指定した Google 検索のすすめ

![IMG_3227_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70638/962ac861-2c2e-e4df-8ab6-df53382b4f4b.png)
## はじめに
どうもこんにちは。
今日はいつもにもまして大したことのない小ネタなんですが、私の周りの何人かに聞いてみたところ意外に「知らなかった」という人がちらほらいたのでためしに記事にしてみたいと思います。

## 概要
エンジニア、というかIT関係の技術職全般は、技術情報や単語等々を Google で検索する、なんてことは日常茶飯事かと思います。

そのとき、**<font color="red">期間の指定</font>** をしたことはありますか？

↓こんなやつです。

![スクリーンショット_2019-06-17_14_54_20_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70638/baa10cc9-0814-07c4-c501-40a9275c74bd.png)

検索ワード入力欄のすぐ下の検索メニューの一覧から **[ツール] → [期間指定なし]** とクリックしていくと、上記キャプチャのように検索期間の絞り込みができるようになります。

## 何がうれしいか
**<font color="red">ある程度ですが、検索結果に鮮度の高い情報だけをヒットさせることができます。</font>**
プログラミング関係の情報は特に顕著ですが、昔は使えたものが今現在は使えない、というような情報や、あるいは昔は推奨されていたものがいまは非推奨になっている、ということが多々あります。こういうものはなるべく検索結果にはひっかからないようにできるといいですよね。

Google 検索をするとたくさん情報が出てくるのは非常にありがたいですし、事実何度も助けられてはいるのですが、時として古い情報は検索結果にヒットさせたくない、という場合もあるでしょう。

## 例えば
あくまで一例ですが、**jQuery の `$.ajax` の使い方** とかは以下のような書き方が今でも検索でヒットします。これは 1.4系までの書き方なのでだいぶ古いです。

```js:1.4x系までの$.ajaxの書き方(※参考にしないでね)
$.ajax({
  url: "http://example.com/path/to/api",
  success: function(data) {
    $("#message").append(data);
  },
  error: function() {
    console.log("コケたよ");
  },
  complete: function() {
    console.log("おわったよ");
  }
});
```

もちろん、今は古くなってしまったとはいえこういった情報に助けられた人は私も含めて少なくないはずです。
ただ、例えばこれから ajax の使い方を学んでみよう、という初学者の方は、これからやるならなるべく新しい書き方を参考に勉強したいかと思います。そもそも現在も使える保証もないですからね。そんなときに、検索期間のオプションをつけることで、ある程度こういった古い情報をふるいにかけることが期待できます。


## じゃあどのくらいの期間を指定すればいいの？
私のおすすめは **<font color="red">1年以内</font>** です。たいていはこれでかなりいいかんじに古い情報を検索結果から除外できます。もちろんお好みでいいと思いますが、どのくらいの期間を指定すればいいか検討もつかない方はとりあえず1年以内から試してみることをおすすめします。

## ということで
もしご存知なかった、という方がいらっしゃいましたらよかったら試してみてください。

## おまけ
**1週間以内** を使うと漫画やアニメの感想をひっかける際に便利です
Archlinuxにtensorflow

# tensorflow & cuda

管理者権限がないArchlinuxにtensorflowを入れようとしましたが、
一苦労しました。

下記のサイトがすごく参考になりました。
https://qiita.com/angelbell_39/items/a54ccde6ad576e6657c0

しかし、自分の環境のCUDA Versionが低かったため、
うまく行かないです。管理者権限もないので、CUDAをVerUPできません。

色々トライした結果、下記で行けました。

** 注意：　condaでtensorflow-gpuを入れようとしたら、cudatolkitなどを一緒に入りますので、
先に必要なバージョンを入れないとエラーでした。 **

```
conda create -n tensorflow python=3.6.8
conda activate tensorflow
conda install cudatoolkit=9.0
conda install cudnn
conda install tensorflow-gpu=1.10.0
conda install keras-gpu
```

最後に、Jupyter notebookなどを使う際に、site-packagesのpathを通してあげますとOKです。

```
sys.path.insert(0,"/hogehoge/anaconda3/envs/tensorflow/lib/python3.6/site-packages/")
```
Python、int → boolへの変換速度

# int → boolへの変換速度
[ココ](https://qiita.com/corda_glun/items/1cd77bde275091a54c6c)の記事に啓蒙されたのと
自分がint → boolの変換を多用する場面が出てきたので、以下のやり方のうちどれが速いかテストした。
(※コメントで0以外の場合もTrueになるという指摘があったため0!=aも追記)
`bool(a)`
`a == 1`
`a & 0b1`
`a != 0`

# 結論
`(a==1)`が最も速い  

| code    | time(μs) |
|:-------:|:--------:|
| bool(a) | 3960 |
| a == 1  | 1710 |
| a & 0b1 | 2113 |
| a != 0  | 1802 |


※すべて小数点以下切り捨て
※3回分の計測の平均値を算出

# 環境とコード
OS: Ubuntu 18.04 LTS(64bit)
CPU: Intel Corei5-8250U
メモリは速度わからなかったが8GBを1枚つんでいる
Python: Python 3.6.8

コードは以下の通り

```py
import time

a = 1
b = False
start = time.time()
for i in range(10000):
   b = bool(a)
print("time1: " + str(time.time()-start))

b = False
start = time.time()
for i in range(10000):
   b = (a==1)
print("time2: " + str(time.time()-start))

b = False
start = time.time()
for i in range(10000):
   b = (a & 0b1)
print("time3: " + str(time.time()-start))

b = False
start = time.time()
for i in range(10000):
   b = (a!=0)
print("time4: " + str(time.time()-start)) 
```

# 総論
上のリンクも合わせて、intとboolの相互変換は自分で作ったほうが速い説ありますね
それと `a==1'と'a!=0'では前者のほうが微妙に速い(多分bit反転の時間差)ので0or1のみを扱う場合は前者を使いましょう。
もしかするとメソッドを呼ぶのに時間かかってるだけなのかな?

余談: 訂正前から大幅に数値上がったんですけど、バックグラウンドで変なの動いてるのかな...(汗
Google Apps Script でBigQuery に1分以上5分未満かかるSQLを投げる方法

# 追記
今ならscheduled queryが設定しやすくなったので、materialized view を作っておき、そもそもGoogle Apps Script で1分以上かかるクエリを投げない

# 背景
Google Apps Script (GAS) で BigQuery (BQ)にSQLをなげる関数 `BigQuery.Jobs.query` が 1分以上結果が返るまでかかる場合、エラーが返ってくる。
上記のJobはBQで計算され続けてる&GAS自体は540秒まで実行してくれるのでもったいない
https://cloud.google.com/functions/quotas#time_limits

# 解決策

```Javascript
var resource = {
  "query" : sql, // クエリ文字列
  "timeoutMs": 1000000 // ここをいくら長くしてもBigQuery側のJob実行時間がかわるだけでGASはまってくれない
};

// エラーが返っても止まらないようにtry~finallyで囲む
try {
  query_results = BigQuery.Jobs.query(resource, projectNumber); 
}
finally {
  Utilities.sleep(300000); // GASにはSleepがある！最長で5分(= 5 * 60 * 1000 ms)まで指定可能

  var joblist = BigQuery.Jobs.list(projectNumber); // BQのjobidをひっぱってくる
  var jobid = joblist.jobs[0].jobReference.jobId; // 先頭のものが最新。仮にBQjobを並列実行したり、sleepしている間にもうひとつ実行したりしたら、うまく動かない。もっと賢い方法がないものか
  var out = BigQuery.Jobs.getQueryResults(projectNumber,jobid);
}
```

だいぶかっこわるいが動く
特に `joblist.jobs[0]` の箇所は他のBQ job が投げられなくなるので、もっとスマートな方法はないものか

(はやくCollaborarotyがバックグラウンドでイベント実行できるようにならないかな)

# 参考
https://cloud.google.com/bigquery/docs/reference/rest/v2/jobs/list
https://developers.google.com/apps-script/reference/utilities/utilities#sleep(Integer)
認証プロキシ環境下でJavaScript開発をする際の設定

※ 加筆修正したものをブログにあげなおしています。※

https://himanago.hatenablog.com/entry/2020/04/30/165335

----

毎回ググって設定しているので、備忘録としてまとめておきます。
※パスワード変更をしたらその都度設定しなおしが必要です（パスワードの定期変更強制やめてほしい）。

## Node.js
npmできるようにするための設定。

### config設定
以下のコマンドを実行します。

```sh
npm config set proxy http://<ユーザーID>:<パスワード>@<認証プロキシホスト名>:<ポート番号>
npm config set https-proxy http://<ユーザーID>:<パスワード>@<認証プロキシホスト名>:<ポート番号>
```

## Git
Gitも使えないと困るのであわせて設定。

```sh
git config --global http.proxy http://<ユーザーID>:<パスワード>@<認証プロキシホスト名>:<ポート番号>
git config --global https.proxy http://<ユーザーID>:<パスワード>@<認証プロキシホスト名>:<ポート番号>
```
ほぼ同じですね。

## ハマりポイント
認証プロキシのパスワードに`%`が含まれているとうまくいきません。
`%`の部分を`%25`にしましょう。

## まとめ
認証プロキシとパスワード定期変更強制は悪。
Pythonでmp3のバックグラウンド再生する方法

# pydubの動作チェック
今回製作したへんてこなモジュール？はLinuxで実行して動作確認しております。そのため、WindowsやMacからでは動作しない可能性があります。使う前にpydubが動作可能であるかテストしてみてください。

```python:pydubの動作確認
from pydub import AudioSegment
from pydub.playback import play
audio = AudioSegment.from_mp3("audio.mp3")
play(audio)
```
適当なaudio.mp3を同じフォルダにおいて実行して音が鳴ればおｋです。
もちろんpydubやsimpleaudioは事前にpip経由等でインストールしておいてください。


## 背景
pyaudioはwavしか再生できず、pydubはmp3が読み込めるがバックグラウンド再生を指定することが出来ない。
調べた所pygameが使えるということだが、使い方が悪いのか再生が重たくノイズが入ってうまく再生できなかった。

## 解決法
pydubのソースを読んでみると、中でsimpleaudioで再生してwaitしているみたいなので、これをなくせばバックグラウンド再生ができる。ということで、pydubとsimpleaudioを適当に組み合わせたらうまいこといろいろ再生できる環境が作れそうだということがわかりました。

というわけで、mp3やwavファイルなどのコーデックにも対応して、なおかつバイナリデータからバックグラウンドも再生できる単純なクラスを書いてみました。

## 結果

pydubとsimpleaudioを組み合わせた結果、以下のようなものを作ればいろいろと対応できそうです。

```python
# バイナリデータを読み込む場合の一時ファイル用
from tempfile import NamedTemporaryFile

from pydub import AudioSegment
import simpleaudio

class SoundPlayer:
    """SoundPlayer module."""

    @classmethod
    def play(cls, filename, audio_format="mp3", wait=False, stop=False):
        """Play audio file."""

        if stop:
            simpleaudio.stop_all()

        seg = AudioSegment.from_file(filename, audio_format)
        playback = simpleaudio.play_buffer(
            seg.raw_data,
            num_channels=seg.channels,
            bytes_per_sample=seg.sample_width,
            sample_rate=seg.frame_rate
        )

        if wait:
            playback.wait_done()

    @classmethod
    def play_from_buffer(cls, audio_content, audio_format="mp3", wait=False, stop=False):
        """Play from buffer."""
        with NamedTemporaryFile() as fd:
            fd.write(audio_content)
            # Revert head of file. It is neccesary to play audio.
            fd.seek(0)
            cls.play(fd.name, audio_format=audio_format, wait=wait, stop=stop)
```

## 使い方

### mp3ファイルを再生する

    SoundPlayer.play(file_name)

### wavファイルを再生する
    SoundPlayer.play(file_name, audio_format="wav")

### バイナリデータのmp3を再生する

たとえばgoogleのAPIから返された音声データはmp3のバイナリで変数に代入されて帰ってくるので
そのままでは再生できない。そのため一時ファイルに一度書き出せば再生できる。

    SoundPlayer.play_from_buffer(audio_content)

### 再生中の音を止めてから再生する

    SoundPlayer.play(file_name, stop=True)

### 再生が終わるまでまつ

    SoundPlayer.play(file_name, wait=True)

## おわりに

pydubにバックグラウンド再生のオプションが搭載されればこのようなものはいらなくなりますが、いつになるやら。同じようなことで困ってる方がいましたら何かの参考になれば幸いです。

# How to play mp3 background in Python
[WordPress]GmailのSMTPからメールを送る設定

## はじめに
WordPressからGmailのSMTPサーバを使用して、gmailのアカウントからメールを送信するための手順をまとめました。

## そもそもなぜこんな方法を？
現在ConohaVPS上に勉強のためCentOSを立てています。
CentOSにPostfixをインストールしてメール送信できるよう設定したところ、どうしてもgmailのアドレス宛にメールが届かない・・！(SPF・DKIM・DMARCは設定したけど効果なし・・)

原因としてはgoogleにGMO社製VPSのグローバルアドレスがブロックされているようです。Conohaの場合はリレーサーバも案内してもらえないし困った・・。(2019/6/18現在)

というわけでgmail経由でメールを送信する事にしました。



## 設定方法
### プラグイン「WP Mail SMTP by WPForms」のインストール

プラグインの追加画面から「WP Mail SMTP」と検索し、インコ？のアイコンの「WP Mail SMTP by WPForms」をインストールします。

<img width="669" alt="スクリーンショット 2019-06-18 6.24.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387779/a9f46bb9-e009-a3e0-c465-06d96369613e.png">

インストール後、プラグインを有効化してください。


### プラグイン「WP Mail SMTP by WPForms」の設定

・プラグインの一覧画面から、「WP Mail SMTP」の設定画面を開きます。
以下のように設定していきます。


|項目  |設定値  |備考  |
|---|---|---|
|送信元アドレス |送信に使用するgmailのアドレス | |
|Force From Email |OFF |上の設定を、他のプラグインの設定よりも優先的に使用するか。<br>環境によってお好きな方を設定してください。 |
|送信者名 |メールの送信者名に表示したい名前 |メール受信者がメールを開いた時に送信者として表示される名前 
|Force From Email |OFF |上の設定を、他のプラグインの設定よりも優先的に使用するか。<br>環境によってお好きな方を設定してください。|


<img width="678" alt="スクリーンショット 2019-06-18 6.27.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387779/dfe36ece-459d-36ab-6103-b4eaaee8abfd.png">

・Other SMTPの項目は以下の画面の通りに設定します。
<img width="678" alt="スクリーンショット 2019-06-18 6.27.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387779/4b0290f7-5662-8597-4e31-655a7021acf0.png">

・メーラーの項目は以下の画面の通りに設定します。
<img width="678" alt="スクリーンショット 2019-06-18 6.27.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387779/36a4ee9a-99fa-7a98-4258-869fb558cdf5.png">

・SMTP Usernameには送信用に使用するGoogleのメールアドレスを指定します。
・SMTP Passwordにはこのメールアドレスのパスワードを指定します。
設定できたら「Save Settings」ボタンを押して設定を確定します。
<img width="676" alt="スクリーンショット 2019-06-18 6.28.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387779/f85f9bfe-4976-0ec8-24e5-54e7ad3cf645.png">

### Googleアカウントの設定変更
送信に使用するメールアカウントのGoogleアカウントのセキュリティ設定を変更します。以下Googleのサポートページに記載の手順で、「安全性の低いアプリからのアカウントへのアクセスを許可する」を有効に設定してください。

https://support.google.com/accounts/answer/6010255?hl=ja

※設定していないと、gmailドメイン以外のメールアドレスにメール送信すると失敗します。
※セキュリティレベルが低くなるため、普段自分が使用しているアカウントでは設定しないようにしてください。

<img width="911" alt="スクリーンショット 2019-06-18 7.10.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387779/40fd1916-d29c-6405-bfed-9ba2b14d5578.png">



## 動作確認
「WP Mail SMTP」の設定画面に「Email Test」というタブがあるので、クリックしてテストメールの送信画面を表示します。
ここに送信したいアドレスを入力して、「Send Email」ボタンをクリックしましょう。

gmailのメールアドレス(先程送信アドレスとして指定したアドレスとは別のアドレス)とその他ドメインのメールアドレスで送信テストをして、送信ができれば問題ないと思われます。
念のため、コンタクトフォーム等実際にメールを送信する機能でも送信テストを行ってください。

<img width="676" alt="スクリーンショット 2019-06-18 6.28.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387779/a0d997aa-3f2a-8ee9-5720-5414e039a5d6.png">

## おわりに
Conohaさんgmailブロックされるのなんとかして・・
辞書のkeyとvalueを1行で入れ替える

内包表記でできるじゃん。

~~~Python
>>> D
{'a': 1, 'b': 2, 'c': 3}

>>> {value:key for key,value in D.items()}
{1: 'a', 2: 'b', 3: 'c'}
~~~

でも個人的には以下でやっちゃうのが好き

~~~Python
>>> dict(map(reversed,D.items()))
{1: 'a', 2: 'b', 3: 'c'}

#lambdaでもできる
>>> dict(map(lambda x:x[::-1] ,D.items()))
{1: 'a', 2: 'b', 3: 'c'}
~~~

valueが被ってた場合は、どちらかで上書きされる。
(辞書は順番が保証されないため一概にどちらとは言えない)

~~~Python
>>> DW
{'a': 1, 'b': 2, 'c': 3, 'd': 2}

>>> {value:key for key,value in DW.items()}
{1: 'a', 2: 'd', 3: 'c'}
>>> dict(map(reversed,DW.items()))
{1: 'a', 2: 'd', 3: 'c'}
~~~

もちろん元のvalueが辞書のkeyにできる値であることが条件。
(リストとかは辞書のkeyにできないので)
内包表記が好きじゃないならこういった書き方もできるなって話。

以上。
Wordpress + php 初学者メモ

django歴が一番長く（所詮短いが）、railsを始めてから2ヶ月が過ぎようとしているところ、
wordpressに手を出してしまっている。
やはりコーポレートサイト案件がたくさんあるので、wpは抑えて自分でも開発できるようになっておきたい。

ということでwpを始めたわけですが。備忘録がてら大事だと思ったところのめも。

<h2>①footer.phpはただのfooterじゃない</h2>
端的にいうと、footer.phpの中身とindex.phpの中でのget_footerの記述がミスっていると、footerが表示されているとかじゃdなくてjsが読み込まれなかったりする。
footer集中！！！！

<h2>②いつもの感覚でjquery書かない</h2>
いつもの感覚で書いてると、無意識に「$」を使っていることがある（あった。）
wpでは $ 使うとjquery doesn't work.
回避策としては、
<strong>(function($){ コード書くとこ })(jQuery);</strong>
でいけたはず。
何も考えずに何かとめんどくさいから基本jsで書いた。
あとは、jquery依存のないライブラリー使った。

とりあえず今日はここまでをあげておきます。
考えながら意外とたくさん出てきたので、またまとまった時間を設けて追記したいと思います。

Happy Tuesday
pythonでシリアル通信

自分用

```python

#!/usr/bin/env python
# coding:utf-8

# python3 ---> need decode & encode

import serial as ser
import re

#import rospy
#from std_msgs.msg import String

#BAUD_RATE = 115200
#BAUD_RATE = 460800
#DEVICE_PATH = "/dev/ttyUSB0"
#DEVICE_PATH = "/dev/ttyACM0"
#DEVICE_PATH = "/dev/ttyACM1"


class Serial:
	def __init__(self, baudrate=115200, device="/dev/ttyACM0"):
		self.end_flag = False
		self.receive_str = ""
		self.serial = ser.Serial(device, baudrate, timeout=0.01)

	def RecieveChar(self):
		char = self.serial.read(1)
		return char

	# remove "\n"
	def Recieve(self):
		string = self.serial.readline()
		return string[0:-1]# remove "\n" & decode  (python3)
		#return string[0:-1].decode('utf-8') # remove "\n" & decode  (python3)

	def BuffClear(self):
		string = self.serial.read(100)

	def Transe(self, send_string):
		# python3 --> encode()
		#send_string = send_string.encode()
		self.serial.write(send_string);
		#print(send_string)


# $B:G=iIT40A4$JJ8;zNs$,Aw$i$l$F$/$k(B&$B=i4|$KJ8;z$,7k9g$7$A$c$&LdBj$X$N1~5^=hCV(B
"""
for i in range(100):
	rec_str = self.serial.Recieve()
	time.sleep(0.01);
"""

# e.g.
# import sys
# sys.path.append("serial.py PATH")

def main():
	serial = Serial()
	#while not rospy.is_shutdown():
	while True:
		string = serial.Recieve()
		print(string)

if __name__=="__main__":
    main()


#reference: https://qiita.com/Acqua_Alta/items/9f19afddc6db1e4d4286

```
デュアルブートしたPCでデフォルトでないOSを遠隔起動する方法

* デュアルブートしている状態だとWake-on-LANでPCを遠隔起動した場合はUEFIで設定されているOSが起動されてしまい任意のOSを起動できない。
* これはgrubなどで起動するOSを選択している場合でも変わらず、grubのデフォルトに設定されているOSが起動するだけで任意のOSを起動できない。
* しかしbcdeditで次回起動するOSを変更することができるのでこれを使用することでPCの前にいない状態であったとしても任意のOSを起動できる。
* 今回はWindowsとLinuxでデュアルブートした状態を例に紹介するがもちろんこれは3つ以上のOSであっても同様である。

#概要
1. Wake-on-LANでWindowsを起動する
1. teamviewerなどでWidows上で次回起動するOSをLinuxに変更するバッチファイルを実行し再起動する
1. Linuxが起動する

#UEFIとgrubの設定
* UEFIのboot orderはWindows、Linux(grub)の順にする
* grubのデフォルトはLinuxにする

#バッチファイル
まず管理者権限で起動したコマンドプロンプトまたはパワーシェルで以下のコマンドを実行する

```
bcdedit /enum firmware
```

ここで起動したいLinuxのidentifierをコピーする
次にバッチファイルを作成する

```Linux_boot.bat
@echo off
bcdedit /set {fwbootmgr} bootsequence {identifier}
shutdown /r /t 0
```

identifierには先ほどコピーしたものを入力する
あとはこのバッチファイルを管理者権限で実行すればLinuxが起動する
bootsequenceは次回起動するOSを指定するものなのでLinuxを起動した後に再起動したときには通常通りWindowsが起動する
管理者権限で実行するのを忘れるのを防ぐためにショートカットを作成しプロパティの詳細設定で管理者として実行にチェックを入れることをおすすめする

#シェルスクリプト
Linuxでも同様の機能をもったシェルスクリプトを作成できる
私は一度Windowsを起動すればLinuxを起動できるため必要を感じず試していないが紹介しておく

```
sudo efibootmgr
```

でエントリー番号を確認して

```Windows_boot.sh
#!/bin/bash
efibootmgr --bootnext 0001 && systemctl reboot
```

0001のところには先ほど確認したLinuxのエントリー番号を入力する
こうすることでLinuxを再起動したときにもう一度Linuxを起動できる

#あとがき
* 今回はデフォルトでWindowsが起動する例で紹介したがもちろんLinuxが起動する場合でも同様にできる
* 記事を作成するにあたってこちらのブログを参考にさせて頂いた（というよりほとんどまるパクリになってしまった）https://ponu2.blogspot.com/2018/01/uefiwindowslinux.html
iPad版機能で、スクロール量の取得・設定が出来ない問題の一例

IE版のパッケージで使われている機能を、iPad版でも実現する為に、同様にスクロール量の取得・設定の記述をしたが、スクロール量が取れず0を返し、また、取れるようになってからも設定の際にも苦戦した話。
![1398265.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235933/622d2ae7-fbf4-3d23-7d3a-bcb066f84819.jpeg)

###一般的なスクロール量の取得
まず、スクロールされた量を取得するための記述は、一般的？なのは調べるとこのくらいは、すぐに出てくる。

#####■FireFox、IE  
```js
document.documentElement.scrollLeft  //横軸のスクロール量
document.documentElement.scrollTop   //縦軸のスクロール量
```

#####■Chrome、Safari
```js
document.body.scrollLeft  //横軸のスクロール量
document.body.scrollTop   //縦軸のスクロール量
```

###上手くいかない原因は？
一般的な方法では0を返し、いろんな要素や方法で試しても取れる見込みが立たなかった。
要素の指定方法が原因ではないと思い、エラーを中心にググっていく中で私の問題に該当しそうな記事を見つけた。結果としては、以下の記事と同じ原因であった。
***→ [document.body.scrollTopが常に0を返す謎を調べてみた](https://qiita.com/tkengo/items/ee758c75ba874757b7fd)***


###じゃあ、どうすれば良いのか?
スクロール対象の子要素にidを指定して、そのidから取得・設定することで解決した。

まず、スクロール対象の範囲のタグにidで取得する為の名前を設定。今回は、```id="scrollList"```とした。
それを取得する処理は、次のようになる。

```js
/* 横軸、縦軸の取得 */
function getPositon(){
    var left = document.getElementById("scrollList").scrollLeft;
    var top = document.getElementById("scrollList").scrollTop;

    return [left,top];
}
```

上記の設定で、スクロール量は取得できるようにはなった。
しかし、今度は、そのスクロール量の箇所に移動しない問題が発生した。
設定の際に、```document.getElementById("scrollList").scrollLeft = left;```では取得できず、下記のようにすることで、移動できた。

```js
/* 再表示後のスクロール位置の設定 */
function movePosition(left ,top ){
    var listPosition= document.getElementById("scrollList");
    listPosition.scrollLeft = left;
    listPosition.scrollTop = top;
}
```

IE版では、```getElementById```の指定に直接代入できたが、iPad版では一度、変数にセットしないと代入出来ないようだ。
Oculus QuestでuGUIを操作する

# はじめに

基本的にはOculusGoなどと同じですが、少し情報が古くなっているので、2019.06時点での情報を記して置きます。

Oculus Go 開発メモ - uGUI編 - Qiita
https://qiita.com/JunSuzukiJapan/items/bead777e8dfeaa49ea30

今回はSampleFrameworkのプレハブを使って最小限の手順を紹介します。

関連: [OculusのSampleFramework全シーンをQuest実機で動かしてみた【Unity】 - Qiita](https://qiita.com/nkjzm/items/58a696f66c4989e5a35c#guardianboundarysystem)

# 環境

- Unity 2018.3.14f1
- Oculus Integration for Unity - 1.37
  - Oculus Utilities Plugin 1.32.0
- Mac OSX 10.14.4（18E226）


# 手順

## 0.前提

- Oculus Integrationsがインポート済み
- 組み込むシーンにOVRCameraRigが存在している

## 1. 操作される側(Canvas)の設定

`Assets>Oculus>VR>Scenes`のUIシーンにある`LightCanvas`をコピーして持ってくるのが早いと思います。余計なスクリプトついてないので、改変しやすいです。

デフォルト値からの差分としては以下の通りです。

- `Render Mode`は`World Space`に設定
  - Scaleをシーンに合わせる(ref: [World Space UI の作成 - Unity マニュアル](https://docs.unity3d.com/ja/current/Manual/HOWTO-UIWorldSpace.html)
- `Graphic Raycaster`を削除し、代わりに`OVR Raycaster`をアタッチする


## 2. 操作する側(EventSystem, LaserPointer)の設定

`Assets>Oculus/SampleFramework/Core/DebugUI/Prefab`内の`UIHelpers`とうPrefabに全部まとまっています。初めに挙げた記事などではインスペクター上での設定をしていますが、このPrefabはシーンに配置するだけですぐに動作します(デフォルトで右手からRayを飛ばす設定)。

Prefabの中には3つのGameObjectが入っています。

- EventSystem
    - `Standalone Input Module`の代わりに`OVR Input Module`がアタッチされている
    - `Ray Transform`(Rayを飛ばす原点)は`UIHelpers`についている`HandedInputSelector`が上書きする設定になっているため、必要であれば書き換える
- LaserPointer
    - `OVRCursor`を継承したクラスを持ち、`OVR Input Module`から参照されている
    - `CursorVirual`でカーソルとして使用するオブジェクトを指定可能
    - カーソルまでの線を描画したい場合はLine Rendererをenableにする
- Sphere
    - LaserPointerで`Cursor`表示用に参照されている

# 最後に

プレハブ2つをコピーしてくるだけで動きました。
それぞれシンプルな作りなので、ここから必要に応じて変更を加える形が分かりやすいと思います。
What Does Website Design Cost in 2019?

![website design cost](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290718/25541a66-7300-27d1-c446-19ff2f14f351.png)

You should know that 75% of users judge the credibility of a company based on its website design. Of course, user-friendly and attractive web design is one of the main assets in any software project.

3 Options for Website Design Cost

It is worth mentioning that the website design cost is based on your website type, its features, and business goals. It is essential that the selection of the design should come from the chosen web technology stack. If the web project is complex, then more custom web design should be created to showcase the necessary functionality.

In the beginning, think how the website is supposed to operate, because if your website looks great, it must work well too. 

Below you will read about the options to create web interfaces and the potential website design cost for each of them.

###1. DIY Website Design Cost

- DIY Services: Wordpress, Wix, Shopify (for e-commerce projects), etc.
- Website design cost (included in website package): $0 - $500+

Such services as Wix, Wordpress, Shopify, or Weebly have already pre-made web design templates included in their website development pricing plans. Depending on a project type and industry, you can select a necessary design layout and configuration.

An average cost of website design for a small business is from $300 to $500. Besides web design pricing, you also receive configured hosting, web servers, and domain. DIY solutions also have additional design elements and plugins ranging from $15 to $200. Usually, you get monthly or annual invoices, which are based on the web design price list of the chosen platform.

You should remember that any website needs regular updates and support. The cost of maintenance varies from $60 to $3,500+ per year, depending on the website design package price.

It is a good idea not to use any free website design templates because they usually come along with ads, malware, functionality and bandwidth limits.

It is recommended to use DIY website builders for:

- simple, one-page websites (landings)
- web projects without scalability plans
- personal portfolio sites
- personal blogs or services

The main benefit of this option is low-cost web design and its quick setup.

On the other hand, most businesses switch from DIY sites within a few years, because of the following weak points:

- generic website design
- challenges with website consistency, updates, and maintenance
- high dependency on third-party service
- low level of website customization and flexibility
- limited scalability
- possible website freezes and slow operation
- no application of new technologies on a design layout

It is recommended to consider the website design cost and options precisely not to spend a bigger budget in the long run.

More details can be found [here](https://mlsdev.com/blog/website-design-cost). In this article you will read how to estimate the cost of website design properly and find design options for your business.
Excel VBAコース第11回内容

全12回 Excel VBAコースの第11回の内容です。


#罫線の引き方

```
'罫線を引く
Range("A1:C3").Borders.LineStyle = xlContinuous

'罫線を消す
Range("A1:C3").Borders.LineStyle = xlLineStyleNone
```

部分的に罫線を引きたい時は、Bordersで定数を指定する。
線の形状は、右辺で指定する。

```
Range("A1:C3").Borders(xlEdgeTop).LineStyle = xlContinuous          '外枠の上線 → 実線
Range("A1:C3").Borders(xlEdgeBottom).LineStyle = xlDouble           '外枠の下線 → 二重線
Range("A1:C3").Borders(xlEdgeRight).LineStyle = xlDash              '外枠の右線 → 破線
Range("A1:C3").Borders(xlEdgeLeft).LineStyle = xlDot                '外枠の左線 → 点線
Range("A1:C3").Borders(xlInsideVertical).LineStyle = xlDashDot      '内側の縦線 → 一点鎖線
Range("A1:C3").Borders(xlInsideHorizontal).LineStyle = xlDashDotDot '内側の横線 → 二点鎖線
```

同じオブジェクトが連続するため省略したい時は、Withを使う。

```
With Range("A1:C3")
      .Borders(xlEdgeTop).LineStyle = xlContinuous          '外枠の上線 → 実線
      .Borders(xlEdgeBottom).LineStyle = xlDouble           '外枠の下線 → 二重線
      .Borders(xlEdgeRight).LineStyle = xlDash              '外枠の右線 → 破線
      .Borders(xlEdgeLeft).LineStyle = xlDot                '外枠の左線 → 点線
      .Borders(xlInsideVertical).LineStyle = xlDashDot      '内側の縦線 → 一点鎖線
      .Borders(xlInsideHorizontal).LineStyle = xlDashDotDot '内側の横線 → 二点鎖線
End With
```

#セルの背景色や文字色を変更する
●色を変更するプロパティ
・背景色を変更する⇒Interior
・文字色を変更する⇒Font

●色の指定方法
・ColorIndex（Excelが決めた色番号）
・Color（16進数またはRGB）

```
' 文字色を赤にする
Cells(1, 1).Font.ColorIndex = 3

' 背景色を黄色にする
Cells(1, 2).Interior.ColorIndex = 6

' 文字色を赤にする(16進数)
Cells(2, 1).Font.Color = &H0000FF

' 文字色を赤にする(RGB)
Cells(2, 2).Font.Color = RGB(255, 0, 0)

' 背景色を黄色にする(16進数)
Cells(5, 5).Interior.Color = &H00FFFF

' 背景色を黄色にする(RGB)
Cells(3, 2).Interior.Color = RGB(255, 255, 0)
```

###【おまけ】クリアの種類
Clear　　　　　⇒セルの書式と値を削除
ClearContents　⇒セルの値を削除
ClearFormats　⇒セルの書式を削除
	
#関数とは
プログラムの部品のようなものです。
何かを入れると、何かの処理をして、何かを出してくれます。
Excel VBAの場合、3種類の関数があります。

①VBA関数
②ワークシート関数
③Functionプロシージャを使って自分で作る関数

#日付の扱い方
###Date（日付）型
変数にはDate（日付）型があり、西暦100年1月1日 ～ 西暦9999年12月31日 の日付と時刻を表します。


###現在日付や時刻を表す関数
Now 　現在の日付＋時刻を表示する
Date　現在の日付を表示する
Time　現在の時刻を表示する

###Format関数
Format(値, 書式) と書くと、値を指定の書式に変換します。
Railsアプリケーションでホームページを表示させて、リンクでお互いのHPをつなげる

###現状
![コメント 2019-06-18 024542.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381710/207dabc9-0f35-06b3-d3a2-2df7f4e3782c.jpeg)

サイト見た目：
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381710/c70263c1-d657-46e3-b12d-716b96daedbb.png)

こんなようなドシンプルなページになっている。
このようなページが二つあり、別のパスで保存されている
（同じフォルダ上にある、2つの.erbファイル）

#####これをリンクでつなげる
.erbのファイル上でrubyを動かすときは<% %>でくくり
この中にある指示がRubyの指示として認識される。

リンクをつなげるには
about.html.erbとhome.html.erbにリンクを記述する。

aboutのほうには：
```<%= link_to 'Home', welcome_home_path %>```

homeのほうには：
```<%= link_to 'About', welcome_about_path %>```
と記述

そうすると・・・

![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381710/1685bd49-616d-c859-7ace-19c1e31b6bc7.png)
このようにリンクが挿入されて、クリックするとhomeに飛ぶ
Ruby on Rails サーバー上で表示できる.erbファイルを作成して表示する

###.erbファイルをホームページとして表示する

routesを設定する

configにある、routes.rbで”get ‘welcome/about’, to: ‘welcome#about’でPATHを設定する。welcome aboutはパスにより異なる

---

app/controller/concerns/にフォルダ名_controller.rbを作成して、それぞれのdefを作成する
今回の場合は
welcome_home.rb

---

その中に

```ruby:welcome_home.rb
def about

end
```

---

app/views/にwelcomeフォルダを作成して、そこにabout.html.erbファイルを作成して、完了
株式会社で役員の重任を電子申告で処理するメモ

役員の重任など, 登記変更手続きを電子申告で処理するメモです.
つまり紙で申請書を書いたり, 法務局に赴くなどは**行いません**

普通はあまり登記の変更手続きはしないと思うので(あっても数年に一回くらい?)
適当に行政書士など探して代行してもらったほうが手間はかからないかもしれませんが,
今後のブロックチェーン行政を見据えて, 自前で対応できるようにしておきましょう!

## 対象

* 自身が代表取締役や, 代理の権限を保有している(法人代表印を扱う権限を持っている)
* 商業登記電子証明書を取得済みである　http://www.moj.go.jp/ONLINE/CERTIFICATION/
* PDF に商業登記電子証明書で電子署名を付与する方法を確立している(もっとも手軽なのは会社で Adobe CC を契約しておいて, ついでに Adobe Acrobat DC を利用する. Windows or Mac ユーザ限定)

## 背景知識

商業登記電子証明書(印鑑証明書の電子化みたいなもの)のメモ
https://qiita.com/syoyo/items/831ffa7950c814602ada

商業登記電子証明書による電子署名 = 基本的に紙への法人代表印の押印と同じ法的効果があります.

## 手続き

http://www.moj.go.jp/MINJI/minji60.html

主に二つの手法があります.

* 登記・供託オンライン申請システム
* 申請用総合ソフト（法務省が提供する登記・供託オンライン申請システムで取り扱う手続の全てを行うことができるソフトウェア）

登記・供託オンライン申請システムだと, 申請をオンラインで行えるだけのようです(実際の手続きは法務局に赴いて紙で処理)ので, 今回は申請用総合ソフト(Windows のみ対応?)で処理することとします. いずれは Linux あたりで処理できるようにしたいですね.

### 必要な書類

* 重任する項目を作成(これは申請用総合ソフト内の機能で添付テキスト作成できます) 
  * http://www.moj.go.jp/MINJI/MINJI50/minji50-01.html の http://www.moj.go.jp/MINJI/MINJI50/0009.txt
  * 代表取締役も重任する場合は, 「取締役」と「代表取締役」とで二つ項目を作ります. 「代表取締役」の場合は住所も記載が必要のようです.
* "株主総会議事録", "取締役会議事録"の PDF に商業登記の電子署名を行う.
  * クラウドサインなどのサードパーティ(?)の電子署名では NG でした. https://www.cloudsign.jp/media/20180215-gijirokudenshika/
* "株主リスト"の PDF に商業登記の電子署名を行う.(http://www.moj.go.jp/MINJI/minji06_00095.html)
* その他必要な書類(PDF)を作成し, 商業登記の電子署名を行う.

**添付する pdf それぞれに, 商業登記電子証明書での電子署名が必要です**

## 申請処理

必要事項を記入しおわったら, 申請書類に商業登記電子証明書での電子署名を行い提出します.
(これは申請用総合ソフトの機能で行うことができます)

登録免許税の納付の情報が得られます.
重任の手続きですと, 資本金 1 億円以下は 1 万円の登録免許税, 1 億円以上は 3 万円になります.

Pay easy あたりで納付します(このあたり, Pay easy 対応の銀行などでオンラインバンキングが使えると完全オンラインで処理できます). ビットコインなどの暗号資産での支払いにも対応いただきたいところですね.

何かしら不備がある場合は、不備の理由が記載されたものが返ってきますので(私の場合は法務局の担当者さまから電話でも将来連絡いただくことができました)、「補正」して再提出します.

申請書類に不備などなければ, 早ければ当日中に登記簿に反映されるようです!

法務局に赴くことなく, また紙の書類を作ることなく, 手続きをオンラインで完了することができました.
おつかれさまでした.

ちなみに処理番号は 5,000 番台でした. これが 2019 年 4 月からの分なのか, オフラインでの申請の分もふくめなのか, 全国での申告の合計なのか, 管轄の法務局の分だけなのは不明ですが, そこそこ件数はありそうな感じがしますね.

## TODO

* 完全オンラインだとなかなか達成感が湧かないので, たまには法務局にプチ旅行気分で出かけるのもよいかも.
* 各種申請書類を Markdown text にして, text に電子署名で行けるか試す.
* Linux とかで対応できないか試す.
* 登記簿ですと(代表)取締役の住所とか丸見えなので個人情報保護法的にどうなの, という問題がありますね(あえて住所の詳細を書かないとか, 昔の住所を使うというワザもあるようですが...)
* Adobe Acrobat DC, 無駄に重くてつらいので他のソフトを探す旅に出たい
Grasshopper初心者がsetやlistの膨大な処理に苦しんだときにやったこと

****
読み物らしい言葉遣いをしていますが、
内容、構成共に単なるメモ書きです。
わかりづらいコンテンツですが、ご容赦ください。
****
名著と名高い[「Parametric Design with Grasshopper 増補改訂版 建築/プロダクトのための、Grasshopperクックブック」](https://www.amazon.co.jp/dp/4802511213/ref=cm_sw_r_tw_dp_U_x_Vb7bDb4S42M23)の１章の導入編をなんとか終えて、２章に載っているレシピのトレースを始めました。

のだけれども、早速、壁にぶつかってしまいました。

2.1.1の**「Tile Pattern 1」**
レシピ通りにコンポーネントを並べているはずなのに、
本に載っている画像のような結果がみられない。

<img width="741" alt="スクリーンショット 2019-06-18 0.43.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209959/feba0b81-5e17-496d-df0c-050047e33cae.png">


どうやら、listやsetの操作のところで、何かの引数がずれてしまっているみたい。

<img width="671" alt="スクリーンショット 2019-06-18 1.14.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209959/59901cc2-2f8d-3fba-7b69-27a6170704de.png">


**10×10のオブジェクト**それぞれに**４つの直線セグメント**があって、それを**シフトして**って、
**膨大な処理が厭**になって

しばらくYouTubeサーフィンして心を落ち着かせていましたが、

結局こんな風に対処しました。

**最初のSqureの数を10×10から1×1に減らして、様子をみる**

繰り返しパターンの処理を明瞭にしたい時の定石ですね

<img width="1059" alt="スクリーンショット 2019-06-18 1.21.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209959/2a180e16-4c69-0f55-e29c-1db41a866239.png">
（左が10×10の状態で、右が1×1の状態）

こんな感じで、リストの数を減らして、頭を整理しながら調べたことで、
長い順にcurveを並べ替えた結果が、単純なリストになっていて欲しいのに、単純化されていないという、いと初歩的な間違いに気づくことができました。


こんな初歩的な間違いでも、リストの要素が膨大だと、気づきにくくなってしまうのですね。

今回のミスは、コンポーネントの状態を虱潰しに調べていっても気づくことができたでしょうが、
配列の要素数をとりあえず減らして調べる方法であれば、プログラムの根本的なミスにも気づくことができるのではないでしょうか。
【Java】Strategyパターンで状況に応じて処理を変える

デザインパターンのうちのひとつ、Strategyパターンについて学んだのでまとめます。

## Strategyパターンとは

StrategyパターンとはGoFの[デザインパターン](https://ja.wikipedia.org/wiki/%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3_(%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2))のひとつです。

Strategyとは**「戦略」**のことであり、
Strategyパターンとは**状況に応じてオブジェクトの振る舞いを変える**ための設計パターンです。

## Strategyパターンのメリット

- 処理を分離することでメンテナンスのしやすさがアップ
- 新たな戦略を追加したい場合はStrategyインターフェースを継承したクラスを追加するだけですむ
- 処理をカプセル化することで呼び出し側が具体的な処理内容を意識せずに利用することが可能


## 実際に使ってみる

今回はポケモンのピカチュウを例として、状況に応じて技（戦略、振る舞い）を変えてみます。

Strategyパターンではそれぞれの戦略が**共通したインターフェース**を持つ必要があります。

下記にAtackStrategyインターフェースを用意します。

```java:AttackStrategy.java
/**
* 攻撃インターフェース
*/
public interface AttackStrategy {
    public void attack();
}
```

そして、戦略ごとに上記インターフェースを実装したクラスを用意します。

インターフェースに記述したメソッドをオーバライドして実際の処理を記述します。

今回は標準出力のみとしますが、もっと複雑な処理を記述することも可能です。

```java:ToGoodTypeConcreteStrategy.java
/**
* 敵が得意属性の場合の戦略
*/
public class ToGoodTypeConcreteStrategy implements AttackStrategy {

    @Override
    public void attack() {
        System.out.println("10万ボルトだ！");
    }
}
```

```java:ToBadTypeConcreteStrategy.java
/**
* 敵が苦手属性の場合の戦略
*/
public class ToBadTypeConcreteStrategy implements AttackStrategy {

    @Override
    public void attack() {
        System.out.println("影分身だ！");
    }
}
```

続いて、上記で用意したAttackStrategyインターフェースを型とする変数`_attackStrategy`をフィールドに持つPikachuクラスを用意します。

Pikachuクラスには_attackStrategyを初期化するためのコンストラクタやセッターを定義します。

また、`attack()`を定義し、`AttackStrategy#attack()`を呼び出すようにします。(委譲)

ここがStrategyパターンのポイントで、PikachuContexクラスには`attack()`しか定義していないにも関わらず、状況に合わせて実際の処理内容を変更できるようになります。

```java:PikachuContext.java
public class PikachuContext {
    private AttackStrategy _attackStrategy;

    public Pikachu(AttackStrategy strategy) {
        setStrategy(strategy);
    }

    public void attack() {
        _attackStrategy.attack();
    }
}
```

以上で準備完了です。
実際に使用してみます。

```java:Main.java
public class Main {

    public static void main(String[] args) {

        PikachuContext pikachu;

        // 敵が得意属性の場合
        pikachu= new PikachuContext(new ToGoodTypeConcreteStrategy());
        pikachu.attack(); // "10万ボルトだ！" が出力される

        // 敵が苦手属性の場合
        pikachu = new PikachuContext(new ToBadTypeConcreteStrategy());
        pikachu.attack(); // "影分身だ！" が出力される
    }
}
```
Twitterをスレッド化して読みやすくするブックマークレット

# どのようなブックマークレット？

ツイッターで、ある文字列を含むツイートを抽出したりいいねの数でソートして遊んでいて思いついた。
ツイッターを某掲示板のスレッド形式にすれば読みやすくなるのではないかと。

ツイッターをスクレイピングして別ウィンドウを作ってスレッド形式で出力するブックマークレットを作ってみた。
読みやすくするつもりで作ったが本当に読みやすくなったかは使ってみないとわからない。

なぜなら作りたてだからだ。
１年も使用すれば読みやすくなったかわかるが１年後にはQiitaに投稿する熱意が忘れ去られている。

ツイッターはバックグラウンドでXHRを投げまくっている。
これは使用者の利便性を向上させているが少し重い感じがする。
スレッド形式は何の処理も動いていないので非常に軽い。

![スレッド形式](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311399/3a58be81-2177-418f-c945-c3740f09ee94.png)

GitHubで公開中。
https://github.com/querykuma/snippets/blob/master/twitter/twitter2thread.js

# 動作環境

Chromeで動作する。
Firefoxでも動作するが about:config へ行って security.csp.enable の値を false にして Firefox を再起動する必要がある。

# 工夫した点

## 目立たせる

テキストが目立つようにテキスト以外は文字を小さく文字色も薄くした。

## 連番

スレッド形式はツイートに連番が振ってあるおかげで読みやすい。

## HTML解析

ツイッターの非常に複雑なHTMLを解析した。
その結果、ツイッターのリンクをクリックしたとき中央にオーバーレイでツイートが重なって表示される場合とオーバーレイがない場合の２つのパターンに分けられることがわかった。

```javascript:オーバーレイの処理
  function caseOuter() {
    document.querySelectorAll(".tweet").forEach(t => {
      writeTweet(t);
    });
  }

  function caseOverlay(po) {
    po.querySelectorAll(".tweet").forEach(t => {
      writeTweet(t);
    });
  }

  po = document.getElementById("permalink-overlay");
  if (po.style.display !== "none" && po.querySelector(".tweet")) {
    caseOverlay(po);
  } else {
    caseOuter();
  }
```

オーバーレイのとき`caseOverlay()`を呼び、そうでないとき`caseOuter()`を呼んでいる。

次のように`caseOverlay()`と`caseOuter()`を１つにまとめることが可能。

```javascript:処理をまとめる
  po = document.getElementById("permalink-overlay");
  if (po.style.display === "none" || !po.querySelector(".tweet")) po = document;
  po.querySelectorAll(".tweet").forEach(t => {
    writeTweet(t);
  });
```

暗号のようなスクリプトになってしまった。
これではスクリプトから元のアイデアを抽出することが難しい。
処理をまとめないスクリプトのほうが読みやすい。

## 返信

オーバーレイのときスレッド形式における返信を字下げして読みやすくした。

## 別のウィンドウに書き出す

別のウィンドウを作ってスレッド形式のHTMLを書き出す。
この技を使用すればツイッター側に影響がないようにできる。

```javascript:新しいタブを作る
  wdoc = window.open().document;
  wdoc.write(html_head);
  wdoc.close();
```

`window.open('','_blank').document`のほうがいいかもしれない。

## タイムゾーン処理

パソコンでツイッターの時間を見ると時差で時間がずれている。

`new Date("日時 PDT")`とやって時差を直した。

## リツイートを非表示

リツイートを見たくないというときがある。

```css:リツイートのスタイルシート
.retweet {
    display: none;
    display: inline-block;
}
```

開発ツールを開いて`display: inline-block;`のチェックを外すとリツイートを非表示にできるようにした。

## 動画

動画があるという情報が失われてしまったので動画があるときvideoと文字を出すようにした。

# 対応できなかった点[^対応]

動画のURLが不明で動画の再生を再現できなかった。

Chromeはabout:blankページを名前をつけて保存から保存できなかった。

> https://www.quora.com/How-can-I-save-about-blank-pages-on-Chrome

Quoraの質問にあるように開発ツールを開いてElementsをコピーする手間をかけなければならないようだ。

Firefoxはabout:blankページを保存できた。

引用記事のツイートはXHRを投げて遅延読み込みしているようで引用記事が表示されない。
代わりにURLを表示するようにした。
遅延読み込みされた後は引用記事も表示する。

mobileのページが未対応。

[^対応]: あるいは対応しなかった点。
【Julia1.1】プルリクエスト状態のパッケージをインストールする

メモメモ。
そもそも、私がドキュメントをちゃんと読んでなかっただけなのですが。。。

add [パッケージ]#[コミットSHA]で追加可能。
コミットSHAの他にブランチ名も指定可能。
以下はMP3パッケージのコミットSHA：170c9c9ac84f43d881c9aaa8459c4be14fe485a5をインストールした例。

```jl
pkg> add MP3#170c9c9ac84f43d881c9aaa8459c4be14fe485a5
```
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140207/ff7ac1b5-6162-4561-db57-40f46dc1ffb0.png)

■参考URL
　3. Managing Packages
　https://julialang.github.io/Pkg.jl/v1/managing-packages/

以上。
atcoder 茶色レートを目指して　3話　C問題が解けないよ

#はじめに
このサイトでは私が灰色レートからから茶色レートになるまでをまとめている。（早く茶色レートになりたい（泣））
#活動報告
今回は、ABC130に参戦したので問題ごとの反省など書いていきます。使用言語はC++です。
#ABC130 A問題
・問題:https://atcoder.jp/contests/abc130/tasks/abc130_a
・提出コード:https://atcoder.jp/contests/abc130/submissions/5952068
この問題はif文の場合分けというか文章通りに作ればできたというまあまあ簡単だったと思います。ていうか簡単すぎて少しテンパリました（笑）。
#ABC130 B問題
・問題:https://atcoder.jp/contests/abc130/tasks/abc130_b
・提出コード: https://atcoder.jp/contests/abc130/submissions/5957360
この問題は、X以下の領域内でどれだけバウンドしたかの回数を出力するといった感じなので、文章通り配列に保存している値を足していって、Xを超えたらバウンド数を出力するといった感じでできます。すぐ思いついたのでよかったです。
#結果
今回のABCはA,B問題の２完でした。レートは280から300になりました。茶色レートまであと100ということで、次次回のABCには茶色レートになりたいです。
#終わりに
勉強不足のため無駄なことを長々と書いた見苦しい文章になっていますが、「もっと良い解き方があるよ」などありましたら、コメントに書いていただくととてもありがたいです。プラス今回のABCのC問題が他のABCのC問題より簡単だと聞いたので、勉強がてら解きたいなと思います。
【サーバーサイドで役に立つ】便利なKotlinの書き方4選

# はじめに

Kotlinというと、Android開発のイメージが強いかと思いますが、最近はサーバーサイドで採用されている話をちらほら聞くようになりました。
著者も普段は、Kotlinを使用してサーバーサイドの開発をしています。
そこで、サーバーサイド（API）の開発するときに、私が良く使うKotlinの便利な書き方をまとめたいと思います。

# 便利な書き方

## 拡張関数を使ってモデル変換クラスをなくす

サーバーサイドでは、外部との接続部分で DTO と 内部のモデル を相互に変換するケースがあるかと思います。
通常は返還を行うための専用のコンバーターのようなクラスを用意するでしょう。
しかし、Kotlinの拡張関数を利用すると、わざわざ変換用のクラスを定義する必要が無くなります。

``` User.kt

class User(
  val id: Int?,
  val name: String,
  val email: String
)

```

``` UserDto.kt
data class UserDto (
  val name: String,
  val email: String
) {

  fun toUser(): User {
    return User(
      id = null,
      name = name,
      email = email
    )
  }

}

User.toDto(): UserDto {
  return UserDto(
    name = name
    email = email
  )
}
```

`User.toDto()` が拡張関数になります。

これは、 `User` をレシーバーとする `toDto()` メソッドを定義しています。
`User` がレシーバーになっているので必然的に `User` 型のプロパティにアクセスすることができます。
これを利用して、 `User` -> `UserDto` の変換を完結に書くことができます。 

実際に使うときは以下のように使えます。

``` UserController.kt
class UserController {
  
  fun getUser(): UserDto {
    val user = User(id=1, name="taro", email="taro@sample.com")
    return user.toDto()
  }
  
}
```

変換用のクラスを呼びださないので、スッキリしますね。


## Copy()でコンストラクタの引数を減らす

エンティティを `Update` して永続化するときなど、一部のプロパティだけを変更したいケースがあると思います。
そんなときは、`data class` の `copy()` が便利です。
これは、 `data class` で宣言すると自動的に生成されます。

``` User.kt
data class User(
  val id: Int,
  val name: String,
  val email: String,
  val password: String
)
```

``` UpdateUserPassword.kt 
class UpdateUserPassword(private repository: UserRepository) {
  
  operator fun invoke(id: Int, newPassword: String) {
    val user: User? = repository.load(id)
    user?.let {
      repository.save(user.copy(password = newPassword))
    }
  }

}
```

`user.copy(password = newPassword)` と、指定することで、 `password` の値が引数の値で更新された新しい `User` のインスタンスを生成することができます。
もちろん、 `password` 以外のプロパティも指定することがきます。


## trimMargin() + $hoge でSQLを読みやすく書く
JDBCなどを利用すると、やむなく 生のSQLを書くケースがあると思います。
そんな時は、以下のようにすると比較的読みやすくなります。

``` SampleSQL.kt

private val tableName = “samples”

fun save(user: User): String {
  return “””
    SELECT
      *
    FROM 
      $tableName 
    WHERE 
      $tableName.name = ${user.name}
  ”””.trimMargin()
}

```

## by lazy でプロパティを使ったロジックをモデルに寄せる

モデルクラスで、プロパティの値を使ってドメインロジックを組むことを考えます。
通常ならば、ロジックをメソッド内で呼び出し返り値として定義するでしょう。
しかし、Kotlinの遅延プロパティを使えば、プロパティとして定義することができます。
これを利用することで、ロジックが必要な値をあたかもふつうのプロパティのように扱うことができます。

``` User.kt

class User(
  val firstName: String,
  val lastName: String,
  val height: Double,
  val weight: Int
){

  val fullName: String by lazy { “$firstName.$lastName” }

  val bmi: Double by lazy { weight / (height * height ) }

}

```

`fullName` と `bmi` は `by lazy` という遅延プロパティとして定義しているため、参照された時に評価されます。

呼び出すときは以下のようにふつうのプロパティとして呼び出せます。

``` sample.kt

user = User(firstName = “yamada”, lastName = “taro”, height = 1.70, weight = 70)

println(user.fullName)

println(user.bmi)

```

# さいごに

今回はKotlinの言語仕様をサーバーサイドで使う際に便利な書き方を紹介しました。
少しでもあなたの役に立てば幸いです。
python3.4で導入されたPathlibのsuffix間違ってね？って話

# Pathlibのsuffix間違ってね？
端的に言えばディレクトリに対してsuffixを呼び出した場合、必ず空文字が帰ってくるわけではない。

ディレクトリ名に「.」が含まれている場合、そこから後ろの文字列が返却される。

## 自分のsuffixに対する理解
↓[公式ドキュメント](https://docs.python.org/ja/3/library/pathlib.html#pathlib.PurePath.suffix)の一部抜粋

```python
末尾の要素に拡張子があればそれになります:
>>> PurePosixPath('my/library/setup.py').suffix
'.py'
>>> PurePosixPath('my/library.tar.gz').suffix
'.gz'
>>> PurePosixPath('my/library').suffix
''
```

このサンプルの三番目で、ディレクトリに対してsuffixを呼び出したら、空文字が帰ってきている。
なのでsuffixはファイルの場合は拡張子、ディレクトリの場合は空文字が帰ってくると思った。

たとえ↓のようなディレクトリ名であっても空文字が返却されると思った。

```python
>>> PurePosixPath('my/library.d').suffix
''
```



## 実際のsuffixの処理
実際に実行してみる

```python
>>> PurePosixPath('my/library.d').suffix
'.d'
```

まさかの'.d'。
空文字ではなく'.d'。


実際のpathlib.pyのsuffixのコードを見てみる

```python:pathlib.py
~省略~
@property
def suffix(self):
    """The final component's last suffix, if any."""
    name = self.name
    i = name.rfind('.')
    if 0 < i < len(name) - 1:
        return name[i:]
    else:
        return ''
~省略~
```

見ての通り、単純に'.'を探してあったら切り取ってるだけだった。
ディレクトリかどうかをチェックしていないので、ディレクトリだったとしてもファイルと同様の処理をしている。
そのため、ディレクトリであってもsuffixが空文字以外が返却される可能性がある。

# 気づいた理由

```python
from pathlib import Path


def print_ext(path: Path):
    ext = path.suffix
    if ext == '':
        print('dir')
    elif ext == '.py':
        print('py file')
    else:
        print('other file')


if __name__ == '__main__':
    print_ext(Path('my/library.d'))
    print_ext(Path('my/library.d/setup.py'))
    print_ext(Path('my/library.d/image.jpg'))
```
実行結果として下のようになると思った。

```
dir
py file
other file
```
でも実際は、

```
other file
py file
other file
```

## 解決策
suffixはディレクトリかどうかを確認していないのがそもそもの原因なのでこちらでそれをやってあげる。

```python
from pathlib import Path


def print_ext(path: Path):
    ext = path.suffix
    if path.is_dir():
        print('dir')
    elif ext == '.py':
        print('py file')
    else:
        print('other file')


if __name__ == '__main__':
    print_ext(Path('my/library.d'))
    print_ext(Path('my/library.d/setup.py'))
    print_ext(Path('my/library.d/image.jpg'))

```

このようにis_dir()でディレクトリかどうかをチェックしてそれを条件にすることで解決する。

# まとめ
そもそもis_dir()でディレクトリかファイルかのチェックを怠ったのが原因だった。
しかし、ドキュメントも悪い気がする。
ディレクトリに対してsuffixを呼んだ場合のことは文章としては書いていないが、
サンプルの書き方的には、誤解する人がでてきてしまうと思う。
これって仕様なのかな？

```python:pathlib.py
~省略~
@property
def suffix(self):
    if self.is_dir():
        return ''
    """The final component's last suffix, if any."""
    name = self.name
    i = name.rfind('.')
    if 0 < i < len(name) - 1:
        return name[i:]
    else:
        return ''
~省略~
```
ってやってくれればありがたいんだけどね。