OmniAICreator/Qiita-1.07M huggingface dataset:
Excel、Word、Powerpointの背景の削除

Excel、Word、PowerPonintの図の操作で、写真を編集する時の背景の削除。
ぱっと使ってみると一気にいろいろなところが削除されてしまって思い通りの操作ができないように感じます。
実は、コツさえ覚えれば簡単です。
#背景の削除の出し方
背景の削除機能は、
1.背景を削除したい写真を選択
2.図ツールの書式タブが現れるので、最左の「背景の削除」
<img src="https://qiita-image-store.s3.amazonaws.com/0/247287/b052b266-acbe-af1f-c1e7-c0121eca4f39.png">
#背景の削除の操作ボタン
<img src="https://qiita-image-store.s3.amazonaws.com/0/247287/952f8e55-1c05-54df-8c10-fd3a54029ed2.png" width=50%>
この写真を背景の削除すると
<img src="https://qiita-image-store.s3.amazonaws.com/0/247287/0376df7c-a414-3e8a-92ff-347b578a2695.png" width=50%>
こんな風になります。
このままどこかクリックしちゃうと、紫色のところがなくなってしまって、せっかくのカワフワのアルパカさんも台無しになります。
背景の削除をするとリボンがこんな形になります。
<img src="https://qiita-image-store.s3.amazonaws.com/0/247287/756111b5-50dd-2beb-b5aa-2e897d31fae7.png" width=50%>
左から説明します。
##保持する領域としてマーク
残したいところを指定する時にはじめにクリックするボタン
##削除する領域としてマーク
消したいところを指定する時にはじめにクリックするボタン
##すべての変更を破棄
いままで保持、削除したところを放棄してはじめの状態に戻します。
##変更を保持
これでよしとなったら押すボタンです。
#実際にやってみよう
目の部分が消えているので、これを復活させます。
保持する領域としてマークをクリックし、このように紫になっているところを横切るようにドラッグします。
<img src="https://qiita-image-store.s3.amazonaws.com/0/247287/0bbb13e3-a4a4-11fe-e98c-ce24a8da945f.png" width=50%>
すると、紫が消え、削除されなくなります。
<img src="https://qiita-image-store.s3.amazonaws.com/0/247287/e2769989-1b35-8863-0fa2-5557012a8a10.png" width=50%>
続けて首のところを次のようにドラッグします。
<img src="https://qiita-image-store.s3.amazonaws.com/0/247287/7d7da3d8-ff91-2cac-c22b-1e1a06d0988b.png" width=50%>
少し首の領域が広くなりました。
<img src="https://qiita-image-store.s3.amazonaws.com/0/247287/91d7779b-7565-3d40-8d59-37d294829281.png" width=50%>
おわかりになりましたでしょうか。
他のグラフィック系ソフトで領域を削除するときは、範囲をぐるっと囲むと同じような色の部分が選ばれるマジック選択となります。その感覚とは違うのがポイントです。
ペンでなぞったところに属する色、明るさを判断し、同じようなところを削除しないと判断します。
つまり、囲むのではなく、なぞるだけです。
では続けて、首回りと鼻先をスッキリさせてしまいます。
<img src="https://qiita-image-store.s3.amazonaws.com/0/247287/45025b7a-36af-0dda-c565-d046a3098f4e.png" width=50%>
では、こんどは削除領域。
アルパカちゃんの目の横あたりに人の手があります。
削除する領域としてマークをクリックして、次のようにドラッグします。
<img src="https://qiita-image-store.s3.amazonaws.com/0/247287/d20bcab7-6c49-7ba8-db86-47f49826c52e.png" width=50%>
手の領域が紫になりました。これで削除されます。
<img src="https://qiita-image-store.s3.amazonaws.com/0/247287/28115ec9-d1bb-1cf6-dfe6-f6dabfec49ec.png" width=50%>
アルパカちゃんの頭のところにも手が見えるので削除します。
あと、もろもろ、追加したり削除したりします。
<img src="https://qiita-image-store.s3.amazonaws.com/0/247287/53881f1d-ad1b-425e-2f81-f1f6270fc836.png" width=50%>
最後に変更を保持をクリックします。
<img src="https://qiita-image-store.s3.amazonaws.com/0/247287/8ea0551f-d2a0-5230-8187-3203b81e7975.png" width=50%>
背景が削除されました。
#まとめ
今回はExcelでやりましたが、WordでもPowerpointでも同じです。
[HTML/CSS/WEB] 画面の動画をModernスタイルにしてみた。

最近プロジェクトのウェブサイトを一人で作ってます。
自分一人で勉強しながら、作ってるので満たないと思います。(笑)

#最近の悩み。

1．どうやって作ったら人によく見えるのか
2.　老人さん達も見やすいウェブサイトをどうやって作ったらよいのか。


# 今回は？
今回はまだ作ってるサイトの部分を使用者がアクセス不可能にするために、
何か工事中だと表示する必要がありました。

## HTML 
私はイメージより動画を再生したかったです。

```html:sample.html
<div class="container">
  <video autoplay muted loop>
      <source src="video/your video.mp4" type="video/mp4">
  </video>
</div>
```

1. autoplay : 自動で再生してくれる。
2. muted：サウンドなしにする。
3. loop：動画を一度回して止まらないにする。


動画の上に表示する文句が必要でした。

```html:sample.html

<div class="overlay">
  <h1><span>Comming</span>Soon...</h1>
</div>
```

## CSS

```css:style.css
body,
html {
    width: 100%;
    height: 100%;
    background-size: cover;
    font-family: 'Montserrat', sans-serif;
}
.container {
    width: 100%;
    height: 100%;
    background: #2c3e50B3;
    z-index: 1;
}
.container video {
    position: fixed;
    right: 0;
    bottom: 0;
    min-width: 100%; 
    min-height: 100%;
}
.overlay h1{
    position:absolute;
    z-index:1;
    color: white;
    font-size: 60px;
    font-weight: 900;
    text-transform: uppercase;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
    font-family: 'Montserrat', sans-serif;
}

```

#結果。

[Demo](http://kangwonelec.com/under_construction_01.html)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/137182/606d3613-1522-6e22-62ff-5d4e7616eea1.png)


# 終わりに
難しいかなと思ったwebもどんどん楽しくなってます。

**Dreamwalker**
commitしてしまった変更点をpushする前に取り消す方法

addして、commitして、push
addして、commitして、push

一番最初に覚えたgitの呪文です。
addの入力時に、教わった記述の仕方は

```
$ git add .
```

つまり、ファイル指定をせず変更点すべてをaddして、commitして、pushしていたのです。
その時は幸運なことにpush前に指摘をいただけましたが、余分なcommitを除いてからpushしてねと要望を頂いてしまいました。


そこから長い旅路が始まりまったわけですが、本記事では要点だけまとめてお送りします。

- 全部コミットしてしまったが、必要な内容だけpushしたい
-

スタート地点は上記の通り、作業が終わり「すべての変更」をaddしてコミットしてしまった所からです。
まずは、変更点を視覚化します。

```
$ git diff HEAD^
```

上の記述で、変更点の一覧がでます。
HEAD^ が、コミットとして受け付けた変更点の「ハッシュ値」を呼び起こす魔法の呪文です。

```
変更点 [　　　ハッシュ値　　　]
変更点 [　　　ハッシュ値　　　]
変更点 [　　　ハッシュ値　　　]
変更点 [　　　ハッシュ値　　　]
変更点 [　　　ハッシュ値　　　]
```

具体的な例が出せず恐縮ですが、変更点を行ごとに確認し、消したい不要な箇所のハッシュ値をコピーし下の記述を打ちます。

```
$ git checkout [commitのハッシュ値]
```

そして、その後再度一番上のgit diff HEAD^を繰り返し、本当に必要な変更点だけが表示されるように確認とcheckoutを繰り返します。

無事、変更したい内容だけが表示される状態になれば、めでたくpushできる状態です。

今日はこのあたりで失礼します。
jsdoでshadertoy sandbox その11

#概要
shadertoyのコードをjsdoでやってみた。
smoothstep関数を使えるようにした。


#写真

![](http://jsdo-static-contents.s3.amazonaws.com/images/capture/k/5/S/k5S8.jpg?t=1537487319)

#成果物

http://jsdo.it/ohisama1/k5S8

以上。
Emacs: 不要なバッファーを自動的にkillする


Emacsのbufferをtabで切り替えるのはあまり好きでないのでswitch-bufferの機能を使っているが、magitやdired関係の不要なバッファーが沢山増えていくと煩わしくなる。

手動で削除すれば済む話ではあるが、やっぱり自動化したい。MELPAでいろいろpackageを探したが適当なものがなく、ググっていたら下記の記事を見つけました。


- [不要なバッファを自動的にkillしてくれる](https://www.shigemk2.com/entry/20120908/1347090453) 

早速設定して使ってみたところ実に快適！

````lisp
;; automatically kill unnecessary buffers
(use-package tempbuf)
(add-hook 'dired-mode-hook 'turn-on-tempbuf-mode)
(add-hook 'magit-mode-hook 'turn-on-tempbuf-mode)
````

- [tempbuf.el はここから落としてきました。](https://www.emacswiki.org/emacs/tempbuf.el) 

## 参考
switch-buffer機能は、```ivy-switch-buffer``` と ```iflipb``` とを併用しています。

前者は、```Helm-mini``` の代わりに使います。後者はキー操作によって開いているバッファーを切り替えたいときに使います。

````lisp
(ivy-mode 1)
(setq ivy-use-virtual-buffers t)
(setq enable-recursive-minibuffers t)
(bind-key "M-:" 'ivy-switch-buffer)
````

iflipb.el の機能は、Emacs標準の ````M-x switch-to-next-buffer```` とは全く別物で優れものです。詳細はるびきちさんの記事が参考になるでしょう。

- [詳説！Alt+Tab感覚で賢くバッファをワンタッチで切り替える](http://emacs.rubikitch.com/iflipb/) 

````lisp
;; iflipb
(setq iflipb-ignore-buffers (list "^[*]" "^magit"))
(bind-key "C-<right>" 'iflipb-next-buffer)
(bind-key "C-<left>" 'iflipb-previous-buffer)
````
私は org-modeを使わないので ```C-<right>``` ```C-<left>``` に key bind してますが、そこはお好みで設定してください。
jsdoでshadertoy sandbox その10

#概要
shadertoyのコードをjsdoでやってみた。
texture関数を使えるようにした。

#写真

![](http://jsdo-static-contents.s3.amazonaws.com/images/capture/4/q/k/4qkZ.jpg?t=1537488493)

#成果物

http://jsdo.it/ohisama1/4qkZ

以上。
RocketChatのLDAP認証でハマったこと

# 現象
ADに登録したユーザーがRocketChatにログインできない。(LDAPの検索で失敗する)


# 原因

ADに登録するユーザーにメールアドレスが設定されていないとログインできない

![１.png](https://qiita-image-store.s3.amazonaws.com/0/35364/737c33d9-3006-d678-3ba6-213aea079be0.png)

# 対処

以下のどちらかで対処する

* メールアドレスを設定する

* Administration > LDAP > Sync/Import > Default Domain　にデフォルトのドメインを設定する
 もしメールアドレスが設定されていないユーザーがログインするとRocketChatがここに設定されたドメインを使用してユーザーにメールアドレスを設定します

以上
Danger 導入した


機械的なレビューを自動で行ってくれるDangerというgemを最近導入したので、その時の

# Dangerってそもそも何？
![image.png](https://qiita-image-store.s3.amazonaws.com/0/179900/44b8d3b8-dc44-7ae2-4176-561926960963.png)




 

DangerのGithubには以下のことが書かれています

```

 Stop saying "you forgot to …" in code review

 Formalize your Pull Request etiquette.
```
  

「あなたは〜をやることを忘れているよ。」ということをやめる。

プルリクエストの礼儀作法を形式化

 

つまり

「プルリクエストの礼儀作法を形式化し、指摘を自動化する」ための便利なgemです

 

### 導入背景
チーム開発をしていると、そのチームごとにプルリクエストの書き方の決まりやルールなどができてくると思います。例えば

- テストは必ず書きましょう
- レビューしてもらいたい時はWIPを外しましょう
- labelを必ずつけましょう
- 変更が多い場合はプルリクエストを分けましょう

…などなど

もちろん自分のチームでも上記のようなルールがあったのですが、

- テストを書いていなかったり
- WIPつけっぱなしのままレビュー依頼出しちゃったり
- labelつけ忘れてたり
- 1つのプルリクエストでの変更が多すぎたり

…などなどが発生しており、そのようなプルリクエストが上がるたびに同じ指摘を繰り返していました。

しかし、上記で上げたような指摘って誰にでもできるものですよね？
いちいち同じ指摘する工数も工数なので自動化しよう！！というのがきっかけです

 

### Danger導入
Circle CiでDangerを実行し、プルリクエストに自動でコメントします

 

### Gemfileの設定

```
source "https://rubygems.org"
gem 'danger'
```


Gemfile編集後に'bundle install'コマンドを実行します

 

### Dangerfile設定

'bundle exec danger init'コマンドを実行します

'danger init'を実行すると初期セットアップ実行され、'Dangerfile'が作成されます。

'Dangerfile'としてはクックパッド開発者ブログを参考に以下のように編集しました。


```

# ===== PR title =====
warn('PR is classed as Work in Progress') if github.pr_title.include? '[WIP]'

# ===== diff size =====
warn('PRの変更量が多すぎます。PRを分割しましょう！') if git.lines_of_code > 500

# ===== Test =====
raise('テストが書かれていません！') if `grep -r fdescribe specs/ `.length > 1
raise('テストが書かれていません！') if `grep -r fit specs/ `.length > 1
# ===== Label ====
labels = github.pr_labels
warn('labelを選択してください！') if labels.empty?
```

 

- WIPがつけっぱなしのとき
- プルリクエストの変更差分が多すぎるとき
- テストが書かれていないとき
- labelをつけていないとき

に自動でレビューを行ってくれる設定です。

 

'Dangerfile'を作成すると長文の説明文が流れてくるので、読みつつ、設定しつつenterで進めていきます

 

- Step1

'Dangerfile'を作成しましたというメッセージ

 

- Step2
 
bot用のGithubアカウントの作成を促されます。

'Danger'からプルリクエストに対してコメントの書き込みが行われるので、そのためのアカウントを作成しておくと良いです。

 

- Step3

botアカウントでアクセストークンを作るように、と言われます。

リポジトリにアクセス可能なアカウントでAPI トークンを作成します。

個人のアカウントでも問題はないのですが、bot用のアカウントだと機械的に指摘されたコメントというように区別できてわかりやすいです

 

- Step4

Ciの設定を行います。

詳しい案内はないのでGetting Set Upを参照します

Ciのsettingsで対象のリポジトリのAPI permissionsにトークンを登録します。

 

'.circleci/config.yml'に以下のように追記します

```
- run:
name: Run Danger file
command: bundle exec danger --verbose
```

 

### 最後に！

Circle Ciでdangerを使う場合は 'Only Build pull requests'を有効にし、プルリクエスト作成時のスキップを回避してください

 

これで設定は終了です。

プルリクエストをWIPつけっぱなしで作成するとちゃんと指摘してくれてますね！
![image.png](https://qiita-image-store.s3.amazonaws.com/0/179900/0d78e69e-f3a2-21c5-0ef6-1cf527608453.png)
 

### まとめ

このような感じで誰でもできるようなレビューはdangerにまかせて、本当にレビューする必要がある箇所に意識が集中できるようにどんどんしていきたいですね！
【swift 4.2】 新機能 shuffled() を検証する。

swift 4.2に配列をシャッフルする機能「shuffled()」が加わりました。
以前、
[たかがシャッフル、されどシャッフル 〜"permute-with-all" order biasの検証〜](https://qiita.com/BMJr/items/c2c45d7d98bc4472fd30)
というタイトルで、シャッフル結果の偏りを検証するプログラムを紹介しました。
今回は、このプログラムを用いてswift 4.2の新機能 shuffled()の結果に偏りがないかどうかを検証しました。

```swift
        //要素数 = n,試行回数 = repeatCount (自由に変更して下さい)
        let n = 5
        let repeatCount = 100000
        //twoDimArray[要素番号][試行回数何回目か] = 移動先の番号
        var twoDimArray = [[Int]]()
        let originalArray = 0 ..< n
        for _ in 0 ..< n{
            twoDimArray.append([])
        }
        for _ in 0 ..< repeatCount{
            let anArray = originalArray.shuffled()
            for i in 0 ..< n{
                twoDimArray[i].append(anArray.index(of: i)!)
            }
        }
        for i in 0 ..< n{
            var postShuffleCite = [Int](repeating: 0, count: n)
            for j in 0 ..< repeatCount{
                postShuffleCite[twoDimArray[i][j]] += 1
            }
            for k in 0 ..< n{
                let probability = Double(postShuffleCite[k]) / Double(repeatCount) * 100.0
                print("\(i)が\(k)番目に移動する確率は、\(probability)%")
            }
            print("\n")
        }
```
※swift 4.2では0からn未満の整数の配列は、

```swift
let originalArray = 0 ..< n
```
で生成できます。

n = 5、試行回数10万回で検証して以下のような結果を得ました。

0が0番目に移動する確率は、20.077%
0が1番目に移動する確率は、19.899%
0が2番目に移動する確率は、20.127%
0が3番目に移動する確率は、19.954%
0が4番目に移動する確率は、19.942999999999998%

1が0番目に移動する確率は、19.925%
1が1番目に移動する確率は、19.886%
1が2番目に移動する確率は、20.024%
1が3番目に移動する確率は、19.955000000000002%
1が4番目に移動する確率は、20.21%

2が0番目に移動する確率は、20.003999999999998%
2が1番目に移動する確率は、20.06%
2が2番目に移動する確率は、19.902%
2が3番目に移動する確率は、20.141000000000002%
2が4番目に移動する確率は、19.893%

3が0番目に移動する確率は、19.85%
3が1番目に移動する確率は、20.119%
3が2番目に移動する確率は、20.112%
3が3番目に移動する確率は、19.822%
3が4番目に移動する確率は、20.097%

4が0番目に移動する確率は、20.144000000000002%
4が1番目に移動する確率は、20.036%
4が2番目に移動する確率は、19.835%
4が3番目に移動する確率は、20.128%
4が4番目に移動する確率は、19.857%

・・・偏りなく、シャッフルされているようです。
paizaでインラインアセンブラ その２

#概要
x64で、インラインアセンブラやってみた。
helloworldやってみた。

#サンプルコード


```
#include <stdio.h>
#include <unistd.h>

int main()
{
    const char str[] = "Hello World!\n";
    const size_t n = sizeof(str);
    unsigned int ret;
    __asm__ volatile ("mov $1, %%rax; mov $1, %%rdi; mov %1, %%rsi; mov %2, %%rdx; syscall;" : "=a" (ret) : "S" (str), "d" (n));
    return 0;
}

```

#成果物

https://paiza.io/projects/xsItX1OxcihpHgwd1FhlYw

以上。
paizaでインラインアセンブラ

#概要
x64で、インラインアセンブラやってみた。


#サンプルコード

足し算。

```
#include <stdio.h>

int test(int a, int b)
{
    int ret = 0;
    __asm__ volatile ("add %1, %2; mov %2, %0;" : "=r" (ret) : "r" (a), "r" (b) : );  
    return ret;
}
int main(void)
{
    int a = 100;
    int b = 200;
    printf ("%d", test(a, b));
}


```

#成果物

https://paiza.io/projects/z-hVHt5u6S0YMOUS2svUYw


以上。
h2oでロードバランシングする

h2o version 2.2.5

以下の対応をすると、hostname(e.g. isucon)が192.168.33.[1-3]のどれかにを名前解決されプロキシーされる

## proxy.reverse.url にバランシングするhostnameを設定する

```/etc/h2o/h2o.conf

proxy.reverse.url: http://isucon:8080/
```

## /etc/host.confにmulti onを設定する

```/etc/host.conf
multi on
```

## /etc/hostsに同一ホスト(isucon)・別IPの設定を追記する


```/etc/hosts
192.168.33.1 isucon
192.168.33.2 isucon
192.168.33.3 isucon
```



# 参考URL
- https://h2o.examp1e.net/configure/proxy_directives.html

> If you want load balancing multiple backends, replace 127.0.0.1 with hostname which returns IP addresses via DNS or /etc/hosts.


- [H2O version 2.3.0-beta1](https://github.com/h2o/h2o/releases/tag/v2.3.0-beta1)には正式なロードバランシング機能が入るらしいので注意

> [proxy] load balancing support (round-robin, least-conn) #1277 #1361 (Justin Zhu)
【Python3】datetime自分用まとめ

# 🕐 Package関連

```python
    from datetime import date       # 年月日
    from datetime import datetime   # 年月日時分秒...
    from datetime import timedelta  # 時間操作
```

# 🦒 **実践: 基本編**
- 日付だけでよいならdate、時分秒も必要ならdatetime

```python
    >>> from datetime import date
    >>> date.today().isoformat()
    '2018-09-21'
    
    >>> from datetime import datetime
    >>> datetime.today().isoformat()
    '2018-09-21T19:59:18.292369'
    
    >>> date(1993, 12, 2).isoformat()
    '1993-12-02'
    
    >>> date('1993', '12', '2').isoformat()
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: an integer is required (got type str)
    
    # 指定のフォーマット日付
    >>> date.today().strftime('%Y-%m-%d')
    '2018-09-21'
```


# 🦓 **実践2: 日付変更編**
- timedeltaを使う

```python
    >>> from datetime import date, timedelta
    >>> date.today().isoformat()
    '2018-09-21'
    >>> (date.today() + timedelta(days=1)).isoformat()
    '2018-09-22'
    >>> (date.today() + timedelta(minutes=10)).isoformat()
    '2018-09-21'
    
    >>> from datetime import datetime, timedelta
    >>> (datetime.today() + timedelta(days=1)).isoformat()
    '2018-09-22T20:07:25.662703'
    >>> (datetime.today() + timedelta(minutes=10)).isoformat()
    '2018-09-21T20:18:01.803925'
```

# リンク
- [timedeltaオブジェクト](https://docs.python.jp/3/library/datetime.html#timedelta-objects)

```
    class datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)
```

- [dateオブジェクト](https://docs.python.jp/3/library/datetime.html#date-objects)
- [datetimeオブジェクト](https://docs.python.jp/3/library/datetime.html#datetime-objects)
- [strftime() と strptime() の振る舞い](https://docs.python.jp/3/library/datetime.html#strftime-and-strptime-behavior)
  - strftimeの書式文字列

# 感想
- 記事にまとめると頭がスッキリ
jsonのkey:valueを環境変数にexportしたい

# 素でやると

こう。

```bash
$ export $(echo '{"hoge": 1, "hoga":2}' | jq -r 'keys[] as $k | "\($k)=\(.[$k])"')
$ echo $hoge $hoga
1 2
```

# スクリプトにする

`.` か `source` で呼び出して使う。

```bash:json_to_env.sh
# stdinから受け取ったjsonを環境変数にexport
export $(jq -r 'keys[] as $k | "\($k)=\(.[$k])"')
```

# なんでこんなのが必要なの？

digdag の [for_each](https://docs.digdag.io/operators/for_each.htm) にタプルを渡したいんだけどできなそうなので試行錯誤してみた結果、これでいけた。
ダーティハックっぽいけど。

```yml:a.dig
_export:
  vars:
    - hoge: 111
      hoga: 222
    - hoge: 333
      hoga: 444
    - hoge: 555
      hoga: 666

+task:
  for_each>:
    var: ${vars}  # ← {key:value} のjsonで渡されてくる
  _do:
    sh>: . json_to_env.sh <<< $var && echo $hoge $hoga
```

```bash:実行
digdag run -a -E a.dig
```
PHPで配列の最後の値を取得する

[いろいろな言語で配列の最後の要素](https://qiita.com/Nabetani/items/05bc8b1b27eb75fd0c89#php)でPHPがハブられてました。
ということでここでやりましょう。

```txt
最後の要素をとる関数 end に副作用があるらしい。

see PHP – 配列の最後の要素の判定にend()は使わない方がいい話
see PHPで配列の最後の値を取得する

end を使うべきかどうかはケースバイケース。PHP 難しい。
```

配列にendを使って問題になるのはよほど特殊なケースだけなので、通常はendを使ってしまって問題ありません。

```php
	$array = [1, 2, 3];
	$value = end($array); // 3
```

副作用としては`$array`の配列ポインタが配列の最後になるので、その後[リセット](http://php.net/manual/ja/function.reset.php)せずに[current](http://php.net/manual/ja/function.current.php)や[next](http://php.net/manual/ja/function.next.php)あたりを使うと想定外の値が返ってくる場合があります。

しかし[reset](http://php.net/manual/ja/function.reset.php)と[end](http://php.net/manual/ja/function.end.php)以外の配列ポインタ操作関数を使うのは変態だけなので、一般人には影響しません。
あらゆる配列操作は[foreach](http://php.net/manual/ja/control-structures.foreach.php)を使うべきで、そしてforeachは配列ポインタとは関係なく全件ループする[^1]ので、配列ポインタの現在地などは意識しなくていいです。

実用的な問題としては、endは参照なので値しか渡せません。
つまり`end(getArray());`のようなことが[できません](https://qiita.com/t_cyrill/items/da1e6c73b1a25eaeee16)。
ということでPHP7.3.0で[array_key_last](http://php.net/manual/ja/function.array-key-last.php)が[実装されました](https://3v4l.org/VNPl9)。

```php
	// 配列ポインタを変えずに最後の値を取得
	$array = [1, 2, 3];
	$value = $array[array_key_last($array)]; // 3
	
	// 関数も渡せる
	function getArray(){ return [1, 2, 3]; }
	$value = getArray()[array_key_last(getArray())]; // 3
```

なぜか[array_value_last](https://qiita.com/rana_kualu/items/a80ef40547496192de86)は[却下されてしまった](https://wiki.php.net/rfc/array_key_first_last)ので、`$value = array_value_last($array)`とは書けません。残念ですね。


ちなみに、冒頭の記事で紹介されている[配列の最後の要素の判定にend()は使わない方がいい話](https://memorandum-plus.com/2018/01/30/php-%E9%85%8D%E5%88%97%E3%81%AE%E6%9C%80%E5%BE%8C%E3%81%AE%E8%A6%81%E7%B4%A0%E3%81%AE%E5%88%A4%E5%AE%9A%E3%81%ABend%E3%81%AF%E4%BD%BF%E3%82%8F%E3%81%AA%E3%81%84%E6%96%B9%E3%81%8C%E3%81%84%E3%81%84/)は単に使い方が間違ってるだけですね。
値を比較してるから同じ値がイコールになっているだけで、end云々は全く関係ありません。
正しい判定には[キーを使います](https://3v4l.org/E3Doe)。

```php
$array = [
    0 => "aaa", 
    1 => "bbb", 
    2 => "ccc", 
    3 => "bbb", 
    4 => "ddd", 
    5 => "ccc"];

// 7.3.0以降は$key = array_key_last($array);
end($array);
$key = key($array);

foreach($array as $k=>$v){
    if($k !== $key){
        print "${k}=>${v} まだ最後じゃないよ\n";
    }else{
        print "${k}=>${v} これが最後だよ\n";
    }
}
```

7.3.0未満は`$key`の求め方が残念な感じ。


[^1]: 正確には『PHP7では全く無関係』『PHP5では配列ポインタをリセットする』。いずれにせよ配列ポインタの現在地にかかわらず全件ループする。
VimでQiitaの記事を投稿しよう！ ~QiitaPyの紹介~

# はじめに

Qiitaの素晴らしい点の一つは，記事をmarkdownで書けることだと思います．多くのユーザがブラウザ上でmarkdownを書き，記事を投稿していることでしょう．しかしmarkdownを使い慣れたエディタで書くことができれば，投稿がより楽しくなるのではないでしょうか．

*Vimmerの皆さん，VimでQiitaの記事を書きたくありませんか？*

Vimmerな私は，VimからQiitaへ投稿ができるプラグイン*QiitaPy*を開発しました！
本記事では，QiitaPyの機能と使い方について紹介したいと思います．

QiitaPyのリポジトリ: [https://github.com/Kenta11/QiitaPy](https://github.com/Kenta11/QiitaPy)

# セットアップ

## Vimの確認

QiitaPyを使うには，Python3が使用できるVimが必要です．bashのコンソールをご使用の場合，以下のコマンドでPython3が使えるかを確認できます．

```bash
$ vim --version | grep python3
+conceal           +linebreak         +python3/dyn       +vreplace
# python3の左に+があれば，python3が使える！
```
## QiitaPyをインストール

deinをお使いの方であれば，以下のコマンドを実行して下さい．

```
call dein#add('Kenta11/QiitaPy')
```

## 必要なモジュールをインストール

QiitaPyに必要なpythonのライブラリをインストールします．

```bash
pip install pyyaml
pip install qiita_v2
```

# チュートリアル

## 設定ファイルの用意

まず初めに認証のためのアクセストークンを作って下さい．トークンは40文字の文字列で， [https://qiita.com/settings/applications](https://qiita.com/settings/applications) で作ることができます．そしてVimを起動し，以下のコマンドを入力して下さい．

```
QiitaPy config
```
![config.jpg](https://qiita-image-store.s3.amazonaws.com/0/271956/eab686fa-54ea-023a-1305-794013795753.jpeg)

~/.QiitaPy.yamlというファイルが作成されるので，ACCESS\_TOKENに続いてトークンを書いて下さい．またUSER\_NAMEの後には Qiitaのユーザ名を書いて下さい．

## テンプレートの生成

記事のテンプレートを以下のコマンドで作成できます．

```
QiitaPy template
```
![template.jpg](https://qiita-image-store.s3.amazonaws.com/0/271956/faeee166-18ed-b642-6ec6-923c91b23483.jpeg)

生成されたテンプレートの上部はYAMLメタデータブロックです．titleに続いて書き込んだ文字列が，投稿する記事のタイトルになります．またtagsの下に続く"-   :"はタグで，例えばVim 8のタグを付けたい場合は"-   Vim: 8"として下さい．tweetはその記事を初めて投稿する際に，あなたのアカウントと連携するTwitterアカウントで記事をツイートするかをtrue/falseで指定できます．
YAMLメタデータブロックの下は記事の本文です．markdownの書式に従って，自由に記事を書きましょう．

## 投稿する

完成した記事を投稿しましょう．例によって，コマンドを使いアップロードします．

```
QiitaPy post new
```
![post.jpg](https://qiita-image-store.s3.amazonaws.com/0/271956/55e25a10-dd9c-d427-6159-8d9085504db8.jpeg)

これで記事がアップロードされました！Qiitaに見に行きましょう！！

![Qiita.jpg](https://qiita-image-store.s3.amazonaws.com/0/271956/b918d60b-5154-a1aa-2d90-e383f5ad5b01.jpeg)

やった！

# QiitaPyコマンドの詳細

## config

設定ファイルを開きます．設定ファイルは.QiitaPy.yamlという名前でホームディレクトリに配置されます．

```
QiitaPy config
```

## post

記事を投稿・更新します．その記事を初めて投稿する際は，newオプションが必要です．

```
QiitaPy post new
```

記事を更新する場合はnewオプションは不要です．ただし記事を特定するために，後述するlistコマンドで表示される疑似キーが必要です．

```
QiitaPy post
```

## list

投稿済みの記事の一覧を表示します．記事は"疑似キー: タイトル"で表示されます．なお表示される記事は最新のものからとなります．

```
QiitaPy list
```

より古い記事を見たい場合は，ユーザ名とページ番号を追加して下さい．

```
# 先程は1ページ目を表示していました
# 2ページ目を表示する場合は以下のコマンドを入力
QiitaPy list Kenta11 2
```

また自分以外のユーザの記事一覧も表示できます．

```
# hogefooさんの記事リストの3ページ目を表示
QiitaPy list hogefoo 3
```

## edit

投稿済みの記事を取得します．なお記事を指定するには，listコマンドで表示される疑似キーが必要です．

```
# 7番目の記事を取得
QiitaPy edit 7
```

## template

記事のテンプレートファイルを生成します．

```
QiitaPy template
```

# おわりに

この記事もQiitaPyを使って投稿しました＾＾．Vimから投稿や編集ができるのは楽しいですね．みなさんも是非使ってみて下さい．
もしQiitaPyに関する質問・要望がありましたら，本記事のコメントや私のTwitter宛に是非教えて下さい．よいVim生活を！
Minecraft 1.12.2　鍛冶場チェストを大量に試行するメモ


# 環境

- `forgeSrc-1.12.2-14.23.4.2705`

# 背景

通常は村1個につきせいぜい2個くらいまでの鍛冶場しかないので鍛冶場にどんなアイテムが出現するかを調べるのは困難。

# 原理

次のコードを`net.minecraft.world.gen.structure.StructureVillagePieces.House2.addComponentParts(World worldIn, Random randomIn, StructureBoundingBox structureBoundingBoxIn)`の`this.hasMadeChest = true;`の下あたりに埋め込むと大量に試行できる。

```java
ArrayList<Tuple3<Long, String, Integer>> hash2 = new ArrayList<>();
for (long seed = 0; seed <= 0xffff; seed++) {
	this.generateChest(worldIn, structureBoundingBoxIn, new Random(seed * 47861474789L), 5, 1, 5, LootTableList.CHESTS_VILLAGE_BLACKSMITH);

	BlockPos blockpos = new BlockPos(this.getXWithOffset(5, 5), this.getYWithOffset(1), this.getZWithOffset(5, 5));

	TileEntity tileEntity = worldIn.getTileEntity(blockpos);
	if (tileEntity instanceof TileEntityChest) {
		TileEntityChest tileEntity2 = (TileEntityChest) tileEntity;
		HashMap<String, Integer> hash = new HashMap<>();
		IntStream.range(0, tileEntity2.getSizeInventory())
			.mapToObj(i -> tileEntity2.getStackInSlot(i))
			.filter(s -> !s.isEmpty())
			.forEach(s -> hash.put(s.getDisplayName(), hash.getOrDefault(s.getDisplayName(), 0) + s.getCount()));

		hash2.add(new Tuple3<>(seed, hash.entrySet().stream()
			.sorted((a, b) -> a.getKey().compareTo(b.getKey()))
			.map(e -> e.getKey() + "*" + e.getValue())
			.collect(Collectors.joining(",")), hash.getOrDefault("Diamond", 0)));
	}

	worldIn.setBlockState(blockpos, Blocks.AIR.getDefaultState(), 6);
}

hash2.stream()
	.filter(t -> t._3() > 0)
	.sorted((a, b) -> -a._3().compareTo(b._3()))
	.forEach(t -> System.out.println(String.format("%s %s %s",
		t._3(),
		t._1(),
		t._2())));
```

チェストの中身は`generateChest`の中で`randomIn`から求められるシードをチェストに設定することで決定しているが、シードを設定しただけで実際のアイテムは設定されない。チェストの中身は`getStackInSlot`を呼び出したときに確定する。

*追記：`Tuple3`は多分Scalaのやつ。*

# 実験条件

シードが0から65535までの範囲のチェストの中身を調べる。チェストの中身にはダイヤモンドの個数でソートして、上位10位までを見てみる。

# 結果

```
9 37210 Apple*1,Bread*3,Diamond*9,Gold Ingot*3,Iron Pickaxe*2
9 46216 Apple*4,Bread*5,Diamond*9,Diamond Horse Armor*1
9 51971 Apple*2,Diamond*9,Diamond Horse Armor*1,Iron Leggings*1,Oak Sapling*4
9 54626 Apple*2,Bread*3,Diamond*9,Iron Boots*1,Iron Chestplate*1,Iron Pickaxe*1
8 1955 Apple*6,Diamond*8,Diamond Horse Armor*1,Iron Sword*1
8 15514 Apple*3,Diamond*8,Iron Boots*2,Iron Pickaxe*1,Obsidian*3
8 18847 Diamond*8,Diamond Horse Armor*1,Iron Ingot*5,Obsidian*3,Saddle*1
8 57533 Apple*2,Diamond*8,Saddle*1
8 63605 Apple*10,Diamond*8
7 59266 Bread*2,Diamond*7,Iron Boots*1,Iron Pickaxe*1
```

65536個調べただけでもダイヤ9個という優良ドロップが存在する。上限が決められてるかどうかはよくわからないが、シードを48ビット分すべて調べたらもしかしたらダイヤ20個とかいうチェストも出てくるかもしれない。
APIGatewayからLambdaの呼出し

エヌシーアイ総合システムのmizu-ponです。

今回はAPIGatewayからLambda呼出しを行うまでの話です。

##**APIGatewayって？**##
![AWS](https://s3-ap-northeast-1.amazonaws.com/mizusimt-s3/qiita_img/ApplicationServices_AmazonAPIGateway.png)

AWSが提供するサービスのひとつ。
コンソールやHTML、外部アプリからLambda関数呼出しを実現するAPIをつくれる。

##**APIの作成(GETメソッド)**##

今回はGETメソッドでLambda関数を呼出すことにします。
初めにAPIGatewayのコンソール画面上で"+ APIの作成"ボタンを押下します。
![APIGateway](https://s3-ap-northeast-1.amazonaws.com/mizusimt-s3/qiita_img/img025.jpg)

次にAPI名を入力し"作成"ボタンを押下。
![APIGateway](https://s3-ap-northeast-1.amazonaws.com/mizusimt-s3/qiita_img/img026.jpg)

* リソースの作成

作成したAPIを選択し、"アクション"メニューから"リソースの作成"を選択

![APIGateway](https://s3-ap-northeast-1.amazonaws.com/mizusimt-s3/qiita_img/img027.jpg)

* メソッドの作成

次に"アクション"メニューから"メソッドの作成"を選択、Lambda関数を指定します。
![APIGateway](https://s3-ap-northeast-1.amazonaws.com/mizusimt-s3/qiita_img/img028.jpg)

指定が終わるとこんな感じになります。
![APIGateway](https://s3-ap-northeast-1.amazonaws.com/mizusimt-s3/qiita_img/img029.jpg)

* CROSの有効化

続いて"アクション"メニューから"CROSの有効化"を選択します。
![APIGateway](https://s3-ap-northeast-1.amazonaws.com/mizusimt-s3/qiita_img/img030.jpg)

* APIのデプロイ

最後に"アクション"メニューからAPIのデプロイを選択します。
デプロイされるステージには"新しいステージ"を選択し、ステージ名を入力後"デプロイ"ボタンを押下すれば完成です。
![APIGateway](https://s3-ap-northeast-1.amazonaws.com/mizusimt-s3/qiita_img/img031.jpg)

##**SDKの作成**##
APIGatewayのSDKを作成しておくと、プラットフォーム/言語毎に簡単にAPIGatewayを呼出すことができます。
例えば、webサイト上に配置したJavaScriptからAPIGatewayの呼出しなどが可能になります。

![APIGateway](https://s3-ap-northeast-1.amazonaws.com/mizusimt-s3/qiita_img/img032.jpg)

以上、おわりです。
riotでjQueryを使わない複数行の三点リーダの実装

# 背景
長い文字列は末尾を三点リーダに変換したい
例えばECサイトとかで商品が一覧で並んでいるときに、
長ーい商品名のアイテムだけ高さがずれたらダサい。

僕.「cssだけでできる?」
G .「IEは対応してないけど良い？」
僕.「（IEからも割とアクセスされえるので）だめ」
※Gはgoogle検索

僕.「ではscriptで対応するか・・・。」
G .「これなんか参考にならんか？　あとこれとか」
僕.「JQuery使ってるやつばっかやん。」
僕.「うちJQuery使ってないねん。」

僕.「あー。あとriot使ってるんでそっちで対応したい」
G .「該当ありません」
僕.「ぐぬぬ」

# 条件
- 表示する文字列が長い時に、描画領域で特定の高さになるように末尾を省略して三点リーダにして表示する
- riotjs使っているのでパーツをriotのtagで用意したい
- IEでも動く
- jQueryは使わない

今回は上記縛りから色々苦労した。

# 実装方法

```html:ellipsis.tag
<ellipsis>
  <p class="{opts.class}">
    {text}
  </p>

  <script>
    let tag = this
    tag.text = this.opts.text

    // DOMが生成されてから実行するため
    this.on('mount', function(){
      // riotはthis.rootでエレメントにアクセスできる
      let element = this.root.querySelector('p');

      // 計算用エレメントの用意
      let clone = element.cloneNode(true)
      clone.style.position = 'absolute'
      clone.style.overflow = 'visible'
      clone.style.height = 'auto'
      clone.style.width = document.defaultView.getComputedStyle(element, null).width

      this.root.appendChild(clone)

      let html = element.innerHTML
      let height = parseFloat(document.defaultView.getComputedStyle(element, null).height)
      let shorten_cnt = 0

      // cloneの高さが用意された領域に収まるまで文字をカットしていく
      while((html.length > 0) && (parseFloat(document.defaultView.getComputedStyle(clone, null).height) > height)) {
        html = html.substr(0, html.length - 1);
        clone.innerHTML = html + '...';
        // 文字列が長すぎた場合ループ回数が増えすぎるので保険として
        if (shorten_cnt > 1000) {
          break;
        }
        shorten_cnt++
      }

      // cloneは計算にしか使わないので削除
      this.root.removeChild(clone)

      // 最初から高さ内に収まっている場合は何もしない
      if (shorten_cnt > 0) {
        tag.text = html + '...'
        tag.update()
      }
    })

  </script>
</ellipsis>
```


呼ぶところ

```html
<ellipsis text="眠い時には何をやっても眠いので、いっそお昼寝すればいいと思うのですが、会社で大ぴらに眠ることも流石に気がひけるのでタイピングしながら眠る術を身につけた（嘘" class="height_40"></ellipsis>
```

こうしておけば長さに合わせて三点リーダーが挿入される

```html
<p class="height_40">眠い時には何をやっても眠いので、いっそお昼寝すればいい... </p>
```

#　詰まりポイント説明

### this.on('mount')
riotマウント後でないとDOMが生成されてないので、mount時に呼ばれる関数内に処理を書く。

[本家にも書いてた](https://riot.js.org/ja/guide/#%E3%82%B3%E3%83%B3%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E4%BE%9D%E5%AD%98%E3%81%AEdom%E3%82%AF%E3%82%A8%E3%83%AA)

### cloneNode
単に

```javascript
let clone = element
```
ってしてしまうと参照渡しになってしまうのでcloneNode(true)でディープコピー

### display:noneは?
参考サイトにはcloneしたものをdisplay:noneすべし、ってなっていますが、
riotの場合、heightがautoのままになって計算できなくなってしまうみたいなので外した。
どうせ処理後に消されるので（もしかしたらちらつくかも）

### parseFloat
これ使わないと
document.defaultView.getComputedStyle(clone, null).height
が「20px」とかの文字列となり、比較できないのでFloat型に変換。
数値になるように「px」とかいった無用な文字列も削除してくれるようだ。

# 参考
以下、参考にさせていただきました。
ありがとうございます。

[意外と需要がある（泣）文字数を省略して「...」にしたい。複数行のとき](https://qiita.com/kiku-nao/items/339a8ea673c1917c6b59)
Oracleの負荷が上がった時の対応方法

現状の状態でstatspackを取得する
```execute statspack.snap();
```
セッション数を確認
```select username,osuser,status,machine,count(*) from v$session group by username,osuser,status,machine;
```

アクティブになっているセッションに注目する

長期間アクティブになっているセッションを確認する
```select sid, serial#,username,status,last_call_et from v$session where username ='user' and last_call_et > 5 and status='ACTIVE';
```
長期間アクティブになっているSQLを確認する
```select s.username,s.sid,s.serial#,q.sql_id,s.status, q.sql_text from V$session s join v$sql q on s.sql_id=q.sql_id where s.username 'user' and s.last_call_et > 5 and s.status='ACTIVE';
```

セッション強制終了
```alter system kill session '<sid>, <serial#>';```
ElasticSearchコマンドメモ

絶対忘れるので使ったコマンドを書いておく。

ElasticSearch 5.5で確認

インデックスを確認

```
curl -XGET localhost:9200/_cat/indices
```

指定したフィールドを取得

```
curl -XGET 'http://localhost:9200/(インデックス名)/_search?pretty' -d '
{
  "_source": [ "(取得するフィールド名1)", "(取得するフィールド名2)"]
}'
```

指定フィールドから指定文字列を検索

```
curl -XGET 'http://localhost:9200/(インデックス名)/_search?pretty' -d '
{
  "_source": [ "(取得するフィールド名1)", "(取得するフィールド名2)"],
  "query":{
    "match":{
      "(検索フィールド名)": {
        "query": "(検索文字列)",
        "type": "phrase"
      }
    }
  }
}'
```

指定フィールドから指定文字列を検索 (AND検索)

```
curl -XGET 'http://localhost:9200/(インデックス名)/_search?pretty' -d '
{
  "_source": [ "(取得するフィールド名1)", "(取得するフィールド名2)"],
  "query":{
    "bool":{
      "must": [
      {
        "match":{
          "(検索フィールド名)": {
            "query": "(検索文字列)",
            "type": "phrase"
          }
        }
      },
      {
        "match":{
          "(検索フィールド名)": {
            "query": "(検索文字列)",
            "type": "phrase"
          }
        }
      }
      ]
    }
  }
}'
```

指定フィールドから指定文字列を検索 (OR検索)

```
curl -XGET 'http://localhost:9200/(インデックス名)/_search?pretty' -d '
{
  "_source": [ "(取得するフィールド名1)", "(取得するフィールド名2)"],
  "query":{
    "bool":{
      "should": [
      {
        "match":{
          "(検索フィールド名)": {
            "query": "(検索文字列)",
            "type": "phrase"
          }
        }
      },
      {
        "match":{
          "(検索フィールド名)": {
            "query": "(検索文字列)",
            "type": "phrase"
          }
        }
      }
      ]
    }
  }
}'
```
FirebaseCLIのCommand集

# なぜ書いたか？
数多くあるFirebaseの機能の一つ"Cloud Functions"を使用して実装することがあり
そこで使用したCommandをまとめておこうと思い書いてみました。
なのでDatabase系のCommandは含まれておりませんmm

# Firebase CLIとは？
firebase CLI(Command Line Interface)
Firebaseのプロジェクトの管理、表示、デプロイが行えます。

# Command集

## firebase init
Firebaseプロジェクトを作成
使用するfirebaseプロジェクトのaliasとかもここで付けれる

## firebase login
GoogleAccoutでログインを行います
Accoutと紐づいているFirebaseプロジェクトが表示

## firebase logout
Firebase CLIからログアウトを行う

## firebase list
Accoutに紐付く全てのfirebaseプロジェクトを表示
Name(プロジェクト名)、プロジェクトのID,Permissionの3つが表示されます

## firebase use
deploy先に選択できるfirebaseプロジェクト表示

### firebase use [alias]
deploy先を選択

### firebase use --add
deploy先に新しく既存firebaseプロジェクトを追加
使用するfirebaseプロジェクトのaliasとかもここで付けれる

### firebase use --unalias
既存のaliasを削除

## firebase target
deploy先のfirebaseプロジェクト表示

## firebase deploy
hosting、functions、database、storage、firestoreの5つがdeploy先に指定しているFirebaseプロジェクトにdeployされる
ここが割と要注意で何でもかんでもこのコマンドでは危ない・・・

### firebase deploy --only [hosting、functions、database、storage、firestore]
onlyオプションで指定したものだけがdeployされる
例えば以下の場合はfunctionsのみdeployされます
`firebase deploy --only functions`

### firebase deploy --only functions:[functionName]
以下Commandとの違いはfunctionNameに指定した関数のみがdeployされます
`firebase deploy --only functions`

## firebase functions:log
function全てのログを確認

### firebase functions:log --only [functionName]
functionNameに指定した関数のログのみを表示

## functions:config:get
Cloud Functionsのランタイム設定値を取得

## functions:config:set
Cloud Functionsのランタイム設定値を保存

## functions:config:unset　[key]
Cloud Functionsのランタイム設定値をkeyを指定して削除


# FirebaseCLIを使用して思ったこと
**deploy時はshellでFirebase CLIのCommandをまとめて[Y/n]確認を挟みながら行いましょうということ。**

大きく感じたのは2点
・deploy先の確認を行おう
・firebase deployを実行して良いのか(--onlyが必要じゃないのか？の確認)

今の環境ではdev,prodのように本番と開発で2つのFirebaseプロジェクトが存在してました。
そこで、Deploy先をうっかりprodにしてしまった、DBのSecurityRulesをdeployで上書きしてしまった等クリティカルなミスをしないためにも!
Androidで"position:absolute"と"display:none"は同時に使えない【React Native】

React Nativeでスタイルをつけるときに、`position:absolute`と`display:none`を同一のコンポーネントにつけると、Androidでうまく機能しないようだったのでメモ (iOSだと動作します)

例えばこのように書くと`hoge`は表示されたままです。

``` jsx
<View
  style={{
    position: "absolute",
    display: "none"
  }}
>
  <Text>hoge</Text>
</View>
```

意図した挙動をさせるには、`position:absolute`を指定したコンポーネントの中に`display:none`を指定したコンポーネントを入れてあげれば解決するようです。

``` jsx
<View style={{ position: "absolute" }}>
  <View style={{ display: "none" }}>
    <Text>hoge</Text>
  </View>
</View>;
```

v0.57でもまだ解決されていないようです(2018/9/20現在)
https://github.com/facebook/react-native/issues/18415
FuelPHP 1.8.1のログをAmazon CloudWatch Logsに送信する方法

# 目的

今までファイルログを使ってきたが、
アプリケーションサーバが複数になるとログを追うのが大変になるので、
CloudWatch Logsでさくっと閲覧できるようにしたかった。

## 下準備

AWSでロググループの作成とロググループの作成を行います。
時間できたら手順書きます。

## プログラムの処理
### 必要パッケージのインストール
```
$ composer require aws/aws-sdk-php
$ composer require maxbanton/cwh
```

### プログラムの改修

### 設定ファイル `fuel/app/config/cloudwatchlogs.php` の作成

``` fuel/app/config/cloudwatchlogs.php
<?php
return [
    'client' => [
        'credentials' => [
            'key' => '<アクセスキー>',
            'secret' => '<シークレットキー>',
        ],
        'region' => 'ap-northeast-1',
        'version' => 'latest',
    ],
    'group' => '<ロググループ名>',

    'retentionDays' => '<ログの保存期間(日)>',
];
```

#### `fuel/app/classes/log.php` の作成

``` fuel/app/classes/log.php
<?php
class Log extends \Fuel\Core\Log
{
    /**
	 * create the monolog instance
	 */
	public static function _init()
	{
        \Config::load('cloudwatchlogs', true);

        $client = new Aws\CloudWatchLogs\CloudWatchLogsClient(\Config::get('cloudwatchlogs.client'));
        $handler = new Maxbanton\Cwh\Handler\CloudWatch(
            $client,
            \Config::get('cloudwatchlogs.group', null), // ロググループ名
            \Fuel::$env, // ログストリーム名
            \Config::get('cloudwatchlogs.retentionDays', null),
            10000
        );

        $logger = new \Monolog\Logger('cloudwatchlogs');
        $logger->pushHandler($handler);

		static::$monolog = $logger;
        static::initialize();
	}
}
```

### `fuel/app/bootstrap.php` に読み込むクラスを追記します。
```fuel/app/bootstrap.php
\Autoloader::add_classes(array(
	// Add classes you want to override here
	'Log' => APPPATH . 'classes/corext/log.php', // この行を追記
));
```
Capybaraで特定の要素の出現を待つwait処理を考えた

Sleepで調整しても不安定なので、
loopとrescueで実装しました。


```ruby:waitting_element.rb

def wait_display_element element
  loop{
    sleep 5
    p 'waitting....'
    begin
      @session.first(:css, element).text
      break
    rescue
    end
  }
end
```


wait_display_element 'h3.apperelement'

みたいな感じでmethodをcallしてあげれば、
勝手にRetryして、elementが出現するのを待ってくれる。
XAPK File Validation failed

#AndroidのTargetVersionを26にしたら、起動時にエラーが出る。

2018年8月以降、Google PlayでAndroidのターゲットのバージョンを上げなければいけなくなったみたいです。
しかし、自分の端末は古いので、minimum versionを14くらいにしたい。
（バージョンに対応していないと検索一覧にすら乗らないみたいです）

##しかし

>XAPK File Validation failed

起動時にエラーが発生する模様。
調べてみると、SDカードの権限が許可されていないらしい。
格納先がPrefer ExternalとかAutoに設定してあり、

```xml:ManifestRequirementsOverride.txt
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
```

とか設定してあっても、通らない。
実機のAndroidの外部ストレージの許可がOFFになったまま。

[https://answers.unrealengine.com/questions/666228/android-api-23-xapk-validation-failed-due-to-obb-p.html](https://answers.unrealengine.com/questions/666228/android-api-23-xapk-validation-failed-due-to-obb-p.html)
どうやらエンジンレベルで作成時にパーミッションの確認をしなければならないみたい。
というわけで回答にあるように、DownloaderActivity.java.templateを修正してビルドすると、通りました。

ただ、なぜかデフォルトのままでも2回起動すればうまく行ったり、若干謎挙動。
【PHP】foreach内で変数名にループ回数を加えて可変変数にする

#前書き
商品予約サイトを想定して、ユーザーが選択した複数の商品情報を配列で持ち、そのデータを処理する際に可変変数に商品情報を代入したいと考えました。

#POSTされた配列を可変変数に代入
`$_POST['item']`の中身を`$item`と`ループ回数`を組み合わせた名前の変数に代入します。

##$_POST['item']のデータ例
$_POST['item']には、ユーザーが選択した商品のID(アルファベット+4桁の数字)が格納されているとします。

`var_dump($_POST['item'])`で配列の中身を確認します。

 	array(4) { [0]=> string(5) "S1001" [1]=> string(5) "S1035" [2]=> string(5) "S1056" [3]=> string(5) "S1203" } 


##foreachで配列を変数に代入
`${'変数名'.ループ回数}`で、可変変数を生成します。

	$i = 0;

	foreach($_POST['item'] as $key => $value){
		${'select_item'.$i} = $value;
		$i++;
	}

##変数の確認
	echo $select_item1;

	 S1001  //結果

	echo $select_item2;

	 S1035  //結果

	echo $select_item3;

	 S1056　//結果

	echo $select_item4;

	 S1203　//結果

#後書き
`$select_item`のそれぞれの変数を使う際には`$select_item`が何個生成されているのかをチェックしなければ使えないのではと思いました。
他にもっと良いやり方がありそうです。
KeyStoreとAPKの署名が一致しているかチェック

**keytool -list -printcert -jarfile apkのパス**
**keytool -list -v -keystore keystoreのパス**

SHA1が一致していればOK


■参考URL
Windows10でJavaのkeytoolを使う
https://endoyuta.com/2016/12/22/windows10でjavaのkeytoolを使う/


jarファイルの署名確認
http://www.ipc.tohoku-gakuin.ac.jp/~neichi/javaAnalysisTools/jarCertification.html
UwpDesktopでわけのわからないエラーが出るようになってしまったメモ

---

**2020/2/1追記**
Windows 10 WinRT API Packがリリースされました。
正式な方法としては、こちらを利用することをお勧めします。

- Windows 10 WinRT API PackはNuGetパッケージ`Microsoft.Windows.SDK.Contracts`として公開されています。
- 開発プロジェクトを`PackageReference`対応へ設定変更し、NuGetパッケージを追加するだけで利用可能。

詳細
- [Microsoft、Windows 10の機能を簡単にWinForms/WPFアプリへ組み込めるライブラリを公開](https://forest.watch.impress.co.jp/docs/news/1210634.html)
- [デスクトップアプリで UWP Api を呼び出す](https://docs.microsoft.com/ja-jp/windows/apps/desktop/modernize/desktop-to-uwp-enhance)

---

#はじめに

VisualStudioでユニバーサルWindowsプラットフォームアプリってありますよね、最近。UWPっていうもの。
これにどうしてもなじめなくて今までのデスクトップ（.net）アプリにしていたのですが、UWP専用のAPIとかあって、そのAPIだけは使いたい場合があります。

そんなとき、UwpDesktopっていうアドオンを使うとデスクトップアプリからでも簡単にUWPのAPIが使えるので愛用していました。

- [超簡単！ WPFなどの.NETのアプリからUWPのAPIを使う](https://codezine.jp/article/detail/10654)


のですが、開発環境を更新したら突然ビルドエラーが多発するようになってしまって、泣・・・
色々調べてどうにかビルドできるようになったのでメモ

#環境
##もとの開発環境
- OS=Windows10 1709
- 開発環境=Visual Studio Pro 2015
	- C#
	- .Net Framework 4.6.2
	- WPFアプリケーション(.net)
- UwpDesktopのバージョン=10.0.14393.3 

##新しい開発環境
- **OS=Windows10 1903**
- **開発環境=Visual Studio Pro 2019(16.3.1)**
	- C#
	- .Net Framework 4.6
	- WPFアプリケーション(.net)
- UwpDesktopのバージョン=10.0.17763.0 

- Visual Studioインストーラで、個別コンポーネントで `Windows10 SDK(10.0.17763.0)` を追加します。
- たぶん↑のバージョンにUwpDesktopが対応していない、ということなのだろうと思います。

<img width="968" alt="キャプチャ3.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252291/cc07214b-3271-120d-e8c9-4119cd18f463.png">


#現象
新しい環境でビルドするとこんなエラーがでます。

- 参照設定が全然効いてないですね。 

<img src="https://qiita-image-store.s3.amazonaws.com/0/252291/8feff503-9c54-c51b-725a-4d74e24f833a.png" width=80%>

#対応
[uwp-desktopのGitHubサイト](https://github.com/ljw1004/uwp-desktop)を見てみます。
なにやら英語で書いてあり、いろいろ試した結果、以下の手順でビルドが通るようになりました。

１.UwpDesktopをアンインストールする
２.参照設定で以下の二つを追加する

- C:\Program Files (x86)\Windows Kits\10\UnionMetadata\10.0.17763.0\Windows.winmd
- C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\ .NETCore\v4.5\System.Runtime.WindowsRuntime.dll

- 同じ名前のファイルがアチコチにあるので、パスを間違えないように。
- UwpDesktopだと大量に参照が追加されるので、使っているAPIによってはこの要領でさらに参照追加が必要そう。

#最後に
よく調べれば特に難しいことないかと思いますが、最近ボタン一つでなんでもできるようになったので、こんなことでもハマってしまいます。
使っているAPIの種類とか、バージョンによってこの限りではないと思わるので、今回はこれでできたという程度だと思います。
Salesforce Apex 自分用メモ

今週のコードで気になったことを忘れないようにメモ
### 関連先の項目までupdateしたいとき
```java
object.anotherRef__r.customValue__c = something;
objectList.add(object);
update objectList;
```
↑だとうまくいかない
updateする対象がobjectなので、参照先まで更新されない
ので、参照先のオブジェクトのリストを作って更新するようにする

```java
AnotherObject anotherObject = new AnotherObject();
anotherObject.Id = object.anotherRef__c;
anotherObject.customValue__c = something;

objectList.add(object);
anotherObjectList.add(anotherObject);
update objectList;
update anotherObjectList;
```

### 複数選択リスト項目への追加・更新
```java
object.MultiSelect__c = object.MultiSelect__c + ';' + value;
update object; 
```
複数選択リストは`;`区切りの文字列らしいので、↑みたいにして追加して更新する


### batch のテストをしたい時
```java
Test.startTest();
hogeBatch batch = new hogeBatch();
Database.executebatch(batch);
Test.stopTest();

System.assertEquals(hoge, fuge);
```
`Test.startTest();` と `Test.stoptest();`の間でバッチを実行させるとうまくいく
あとは必要に応じて、SOQLでテストしたいものを再取得すると良い

### VFの selectOptionsの上限1000件を回避する方法
```xml:リストを分ける
<apex:apex:selectList value="{!country}" title="Choose a country">
  <apex:selectOptions value="{!items1}"/>
  <apex:selectOptions value="{!items2}"/>
</apex:selectList>
```

そもそも 1000件以下のリストしか渡さないようにした方が良いかも

```java:LIMIT1000する
public List<SelectOption>  getItems() {
    List<SelectOption> items = new List<SelectOption>();
    List<Hoge> hogeList = new List<Hoge>();
    
    commodities = [SELECT Id, Name FROM Hoge LIMIT 1000];

    for (Hoge hoge : hogeList) {
        commodityCodes.add(new SelectOption(hoge.Id, hoge.Name));
    }

    return items;
}
```
余裕があれば、絞り込んだリストを selectOptions に渡すやつも書く
ブログに投稿したコメントが通っているかスクレイピングを利用して調べる

#やりたいこと
アイドルのブログなどにコメントを投稿したとき，運営側に審査される場合があります。
コメントが実際に投稿されたか確認するには，再度コメント一覧を見て確かめる必要があります。しかしコメントの数が数千件に及ぶ場合，手動で確認するのは非現実的になってきます。そこで自動的に自分のコメントを見つけようというのが目的です。今回はスクレイピングを使って実現したいと思います。


#参考
今回使用したコードのベースは[ここ](https://speakerdeck.com/sin_tanaka_21/pythondeshi-meruuebusukureipingushi-jian-ru-men)です。

#コード
早速ですがコードです。ライブラリはrequestsやBeautifulSoupがメインです。
基本的に全てpipで入ります。

##import部
```python
from bs4 import  BeautifulSoup
from requests.exceptions import  ConnectionError, TooManyRedirects, HTTPError
from requests_html import  HTMLSession
from retry import retry
```
##関数宣言部（スライドのものを引数を受け取るように変更)
```python
@retry(tries=3, delay=2, backoff=2)
def get_resp(url):
    try :
        session = HTMLSession()
        return session.get(url)
    except ConnectionError:
        print('Network Error')
        raise
    except TooManyRedirects:
        print('TooManyRedirects')
        raise
    except HTTPError:
        print('BadResponse')
        raise
```
##スクレイピング部
ここでは例として乃木坂46の西野七瀬さんのブログを取り上げます。先日，卒業発表があったためたくさんのコメントが寄せられています。

```python
names = []
url = 'http://blog.nogizaka46.com/nanase.nishino/2018/09/047040.php' #ブログのurl
for i in range(0, 10950, 50):#数字はブログのページに対応している　この場合50件ずつ区切られていた 最大値はその時の最終ページを入力
    comment_url = url + '?cp={}#comments'.format(i)
    try:
        resp = get_resp(comment_url)
    except: 
        print('Response not found')
    soup = BeautifulSoup(resp.content, 'lxml')
    for line in soup.text.split('\n'):
        if line.startswith('No.'):#可能ならば正規表現がよさそう
            names.append(line)
    print('Done {}'.format(i))
```
##検索部
配列に名前のデータが格納されたので自分が投稿時に使用した名前を検索してみましょう

```python
for name in names:
    if '自分の名前' in name:
        print(name)
```

結果が表示されれば，おめでとうございます。
Windows10のタスクマネージャーのプロセスタブにプロセスが表示されない問題を解決した

検索しても具体的な手順をまとめたものがなかったので。

# 結論
- 当方の環境ではタスクマネージャーの詳細タブからICCMon.exeを終了させることで即時復旧した。
- タスクマネージャーのスタートアップにSnailという記述があったため、これを無効化した。

# 現象
起動後数分するとタスクマネージャーのプロセスタグにプロセスが表示されなくなる。
![タスク マネージャー-2018-09-21 17_14_14.png](https://qiita-image-store.s3.amazonaws.com/0/155025/488d77fb-4b6a-b541-5b11-30e6986d1cb9.png)

ユーザータブも同様。
![タスク マネージャー-2018-09-21 17_14_18.png](https://qiita-image-store.s3.amazonaws.com/0/155025/b27861b7-6cd0-27ca-3182-2ffefaa479af.png)

# 調査
ググると、ICカードリーダー関連だと言うことが判明したが、具体的な実行ファイル名やサービス名がわからない。タスクマネージャーの詳細タブは機能していたため、眺めていると、ICCMon.exeの説明にIC Card Monitorとあった。
![タスク マネージャー-2018-09-21 17_14_36.png](https://qiita-image-store.s3.amazonaws.com/0/155025/eac01a50-ba3e-e269-7cd8-cdf4f17db736.png)
これでは？と思い、試しに右クリックしタスクの終了を試みたところ、復旧した。
![タスク マネージャー-2018-09-21 17_15_03.png](https://qiita-image-store.s3.amazonaws.com/0/155025/7a455bf6-f6a7-b5b3-7710-115fdc954627.png)
しかし、ICCMon.exeは即座に復活するらしく、表示が消えない。
![タスク マネージャー-2018-09-21 17_15_10.png](https://qiita-image-store.s3.amazonaws.com/0/155025/a798576e-8a99-9340-2c85-d6c6f5dc321e.png)
ICCMon.exeの素性を調べるべく、ファイルのある場所を開いてみる。
![ICCM_CSMng-2018-09-21 17_40_13.png](https://qiita-image-store.s3.amazonaws.com/0/155025/35584e16-4b1b-badb-62a6-fd4bbf3f86da.png)
ほかにsnail.exeという実行ファイルが見つかる。この名前を持つサービスが存在した。
![タスク マネージャー-2018-09-21 17_38_26.png](https://qiita-image-store.s3.amazonaws.com/0/155025/57f176db-d978-f686-4365-a2a2dc8139f1.png)
無効化することで、ICCMon.exeが起動することがなくなり、問題が解決した。

# 余談
ICカードリーダーは都の入札システムに使用する（のを社内でサポートする）ため、使わざるを得ないし削除もできない。ので、サービスの無効化を行い、使うときは有効化することにした。忘れそう。

文字通り前世紀のDLL（MFC42.DLL 1998/09/26）が入ってて驚きました。ずいぶん息が長いんですね。

あとこれメモリリークしてませんか。それともこういった挙動なのでしょうか。

ICCMon.exe終了直前　メモリ25968K
![タスク マネージャー-2018-09-21 17_14_36.png](https://qiita-image-store.s3.amazonaws.com/0/155025/a226fa7a-60be-db67-db9f-bc0f74aeb2cd.png)

ICCMon.exe再起動後　メモリ2788K
![タスク マネージャー-2018-09-21 17_15_10.png](https://qiita-image-store.s3.amazonaws.com/0/155025/4a6d2e9e-9856-c18c-cbbe-9f38eb9cdae5.png)

数秒後　3092K
![タスク マネージャー-2018-09-21 17_15_17.png](https://qiita-image-store.s3.amazonaws.com/0/155025/ab2e260a-295e-2030-e160-1d9a808fb054.png)

このままじわじわとメモリが増加し、数分後、最終的に25968Kまで到達し、現象再発を確認。
Laravel5.6で請求書出力アプリを作った

## 概要
毎月請求書出さないといけないけど、Webアプリで出したいなー
けどワザワザ登録するのも面倒だな。今までのフォーマット使いたいし
ということで、（？）
Laravel5.6とphpSpreadseetを使って請求書出力のWebアプリを作ってみました！

#### 環境
CentOS 6.9
Laravel 5.6
Apache 2.2
PHP 7.2

## 作ったもの
ログイン不要で請求書がパパっと出せます。
こちら ⇒ http://pizza.codelike.info
<img jsname="uLHQEd" class="SzDcob" src="https://lh3.googleusercontent.com/bYnftCf7sg2PIA_ScKpJmV-eFKYSvDawf45iz368FR0BUbmcJwSWUqRVshc6VNPPJmccmV2UYErj6PCMKM7S-Z2vBYHtED4cJIVeh8VePu3fOTJfuJfnxUwcxChmIP7LNX_NC8nTnUwb-ZlwQvn1ZJkaWAbgyDhrNBMMquwbYwlr9IyDuOXCl0OnQrKinxVKaGKnZkSYfIULgOp-ZyEmg8-eOHUZoOZlP12cU_4pCCA5bahcLwT3YQj56ReeGBekp9fTJ_szXKYt_c5w22J6K2CynBlNQpTuEca6MJvaC2BkL8kUB-nyN-L1HwbL9P-gbKo-lpBmY8jKYvf4f1yW4VdNnKek19kayO18DkGTh59ThKSYBxLvqw3W-bYe8oeELsvUphRU7QmVstCdUqnsqyJWQKDHtKDuo4PBZOoKg32yOaUaEhvn9lT3PKDEGy6krTCQCKD-bJC_PyAvlp43EywlevQf2oq8E5dqQgy9yfZClkCbsD8qS0-KYtfqHXqfpMlTIxJdPqlFW_-R5KCW-0l1zmDY5eRioN3vtsknP339QVi1JHXvVR126g87BlyEFSOIV57XFrl8S2PWlGg6Mh7wRT6W1S9DYTFg69I6HiOxxKixwFM3Op4aJQwVOia2jZhHYLwPN8GVHgb0PbOS2P0KZtXVQAM-bD8iABtaDj4PoysZlNVk0FIZ=w745-h486-no" style="transform: translate3d(-0.5px, -0.5px, 0px) rotate(0deg);" aria-label="写真 - 横向き - 2018/09/21 17:41:58 " width="745" height="486">

## やったこと
### 1. laravelプロジェクト作成とライブラリインストール

下記コマンドでプロジェクトを作成したあとにphpspreadseetをインストール

```shell

laravel new hoge
cd hoge
composer require phpoffice/phpspreadsheet
```

laravelの動作確認、下記のコマンドでビルドインサーバーでlaravel起動

```shell

php artisan serve
```
wellcomeページが表示されたらOK!!

### 2. css / jsライブラリ追加
bowerを使ってライブラリを追加しました。
npmでjquery-uiがうまく動かなかったorz

```shell

bower install jquery open-iconic jquery-ui
```
#### 3. resources/views/配下にviewファイルを書く
トップページ・ヘルプ・規約ページの分けてviewを作りました。
layoutsフォルダに親viewを作っておくと、ヘッダーの情報とかトップのナビメニューがひとつに纏まるのでいい感じです。

#### 4. routes/web.phpファイルを書く
最初はwellcomeページにインデックスが向いていますが、今回作ったコントローラーに向けて、請求書出力の時のメソッド・その他を追加しました。

```php:web.php
Route::get('/', 'TopPageController@topPage')->name('top_page');
Route::post('/', 'TopPageController@topPage')->name('top_page');
Route::post('/', 'TopPageController@output')->name('claim.output');
Route::get('/help', function(){
    return view('help');
});
Route::get('/rule', function(){
    return view('rule');
});
```
#### 5. app/Http/Controller配下のcontrollerを書く
laravelのartisanコマンドでコントローラーを作った後に編集していきました。
下記コマンドでコントローラーを作れました。

```shell
php artisan make:controller TopPageController
```

メソッドはトップページ表示用と請求書出力アクションの二つのみ。
表示用はviewを返すのみで請求書のほうはphpspreadsheetを使ったロジックをゴニョゴニョしました。

#### 6. webpack.min.js を書く
laravel-mixなるものを初めて使いました。
webpackのラッパーらしいですね！
webpack自体を使ったことがなかったのですが・・・
下記のような感じで羅列して、第二引数に出力ファイルパス（ファイル名含）を書いておけば纏めて一つのファイルにしてくれました。

```js:webpack.mix.js(一部)
mix.scripts([
    'public/library/jquery/dist/jquery.js',
    'public/library/jquery-ui/jquery-ui.js',
・・・略・・・
```

下記でminify化せずに出力先にファイルを出力してくれます。

```shell
npm run dev
```

逆に本番などでminify化したい場合は下記。
これで恥ずかしいjsソースが隠せます（笑）

```shell
npm run production
```

### 所感
Laravelを業務で使い始めましたが、自分で作ることによってちょっと慣れ親しんだ感がでてきたのでよかったです:smile:
そのうちPDF追加したい。。
Laravel便利なので今後も何か作る時に活用していきます:raised_hand_tone1:
【Windows】任意のファイルをゴミ箱をスキップして完全に削除する方法

オフィスの仕事をしているとPCは必須。
PCという環境はいわば仮想的な作業場。
当然、作業中に発生したファイルはいずれ不要となりゴミとなります。

そのゴミの中にはゴミ箱に入れておくのもあかんファイルがあると思います。

ファイル容量が大きすぎるものはゴミ箱に行かず完全削除しますか？的な確認ダイアログが表示されますが、普通のファイルはいいところMB単位のファイルだと思います。

では、どのようにしてゴミ箱をスキップして削除するのか？

削除する際、よく`DELETEキー`を使用すると思います。
その際に、`SHIFT + DELETE` と押下することで、下記のように確認ダイアログが表示されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/213462/a2869dc5-cb0d-ccd0-c44f-75f57fd17319.png)
「はい」をクリックすることで、完全削除の完了です。
ちょっとした時短にしかなりませんが、意外と便利です。


以上です。