OmniAICreator/Qiita-1.07M huggingface dataset:
AWS Cloud9 でインストール翌日に heroku がみつからない

Rails チュートリアルを始めて2日目。
第3章

> 後でproduction環境にプッシュするときに悩まずに済むよう、アプリをなるべく早い段階でHerokuにデプロイしておくとよいでしょう。

という記載に従い

```
$ heroku create
```

したら、

```
bash: heroku: command not found
```

と言われてしまった。
PATH 設定が読み込まれていないので

```
$ source ~/.profile
```

でOK。

```
$ echo $PATH
/usr/local/heroku/bin:...
```

~/.profile は ~/.bash_profile があると読み込まれないので、~/.bash_profile に追記しておいた。

```config:.bash_profile
if [ -f ~/.profile ]; then
    source ~/.profile
fi 
```
React Native 0.60.xへのバージョンアップ手順

React Nativeのバージョンを0.59.8から0.60.5にアップグレードしました。
今回も苦戦し20時間くらいかかりました。だれかの参考になるように重要な手順を共有します。

# Android
## androidx
サポートライブラリがandroidxに置き換わりましたので、以下の対応をしました。

- Android Studioでandroidのプロジェクトを開いて、androidxへのコンバート機能を使用しました
- 依存ライブラリもandroidxに対応するためjetifierをインストールしpackages.jsonのpostscriptに`npx jetifier`を追加しました

## autolink
`react-native link`がまともにうごくようになったので、以下の修正をしました。

- `app/build.gradle` からマニュアルリンクしていた部分を削除
- MainApplication.java もマニュアルリンクの記述を削除

# その他
[update-helper](https://react-native-community.github.io/upgrade-helper/)の差分を参考に色々修正

# iOS
## autolink,cocoapodの使用

`react-native link`がまともにうごくようになったので、以下の修正をしました。
- workspaceからマニュアルリンクしていたプロジェクトを削除
- 静的ライブラリも削除
- Podfileを[update-helper](https://react-native-community.github.io/upgrade-helper/)の差分を取り込み

# 共通

- ビルドエラーもコツコツ修正 
- 各種ライブラリを最新版に変更
- 壊れたコードがあれば修正

# まとめ
結局それなりにネイティブ側のビルド周りの知識がないとバージョンアップで色々詰むんだよなぁ。
やっとバージョンアップしたと思ったら、0.61.0-rc.0の通知が来て、じゃっかん萎えました。
JSONがパースできないと思ったら特殊文字の混入が原因だった

サンプルのJSONファイルをもらって、パースしてみるという作業をしていた時に、エラーが出てパースが失敗してしまう事案がありました。

エラー内容を見てもハッキリとしないもので途方に暮れていましたが、それまで表示していなかった「特殊文字」を表示することで解決しました。

![スクリーンショット 2019-07-31 10.42.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54170/8bff2bf0-d213-d314-97f1-a44be1f74273.png)

参考画像の通り、半角スペースの中に何かが混入しています。
特殊文字を表示していない状態では、半角スペースと同じ見た目です。
全角スペースではありません。

とにかく、この文字を削除して半角スペースに置き換えることで、今回のエラーは解決しました。

これ以降は、「特殊文字」を常に表示して作業を行なっています。
慣れるとまったく気にならないものですね。

以上、意外にハマってしまったエラーの備忘録でした。
Bookmarkletは即時関数で実装しないといけない

## ブックマークレットはグローバル空間で実行される

[**ブックマークレット作成の基礎知識**](http://musou.s38.xrea.com/JavaScript/%E3%83%96%E3%83%83%E3%82%AF%E3%83%9E%E3%83%BC%E3%82%AF%E3%83%AC%E3%83%83%E3%83%88%E4%BD%9C%E6%88%90%E3%81%AE%E5%9F%BA%E7%A4%8E%E7%9F%A5%E8%AD%98.html)


> 即時関数で囲む
ブックマークレットのコードはグローバル空間で実行されるので、サイトの空間とかぶってしまします。
名前がバッティングしないように即時関数内にコードを記述しましょう

上述の記事にある通りなのですが、Bookmarkletを作る際は以下のように`(function(){`と`})()`に囲まれた即時関数で記述しなければなりません。  

```js
javascript:(function(){
    alert("hello world");
    Console.log("hello world");
})();
```
しかし、ただAlertを出すだけなら、即時関数にしなくても動きます。
※ 下記のコードをBookmarkletにしても同じように動きます。
ネットで公開されている記事でも、即時関数になっていないものもけっこうありました。

```js
javascript:
    alert("hello world");
    Console.log("hello world");
```

## 即時関数でないと困るケース
DOM操作をして変数の値を変えよう、などという場合に即時関数でなければおかしな挙動になります。
例えば、inputareaのvalueを書き換えたいと思った場合、以下のBookmarkletを実行すると画面が真っ白になります。
※ ブラウザのデバッグモード: コンソールで実行すると問題なく動きます。  

```js
/*Bookmarkletでは動かない*/
javascript:
    var elements = document.querySelectorAll('textarea');
    for(var i = 0; i < elements.length; i++){
        elements[i].value = 'hoge';
    }
```

このような場合は即時関数でなければ思ったとおり動いてくれないです。
(グローバル空間で実行された結果おかしなことになっているのだと思います)

```js
/*Bookmarkletで動く*/
javascript:
(function(){
    var elements = document.querySelectorAll('textarea');
    for(var i = 0; i < elements.length; i++){
        elements[i].value = 'hoge';
    }
}())
```

### 実行結果
■ 即時関数ではない版
![ac6461228c40ad28d1b732e48d66f574.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259668/f9068748-ca9b-c2ae-75f4-6f59060ca37e.gif)


■ 即時関数版
![563962dfa2778b3c1d5b3ce78d24d0f2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259668/ef62fc56-0d27-15ff-753e-5ed591acfd39.gif)


即時関数でなくても動くケースもありますが動かないケースも多々あるので、Bookmarkletは即時関数で実装しましょう。
※ ちなみにですが、inputタグのvalueを書き換える場合は即時関数でなくても問題なく動きました。
この結果めっちゃハマってしまったんですよね。。。
Firestore + iOS

###1. iOS Codelab

####[1.1 Friendly Eats](https://codelabs.developers.google.com/codelabs/firestore-ios/#3) 

###[2. Firestore 시작하기](https://firebase.google.com/docs/firestore/quickstart?hl=ko)

###[3. Firestore 데이터모델](https://firebase.google.com/docs/firestore/data-model)
Linux MintがXserverがどうので起動しなくなった


> Failed to start the X server (your graphical interface). It is likely that it is not setup correctly. whould you like to view the X server output to diagnose the problem?

などと言ってLinux Mintが起動しなくなった。ヤバい。

どうも原因はNvidiaのドライバインストールしたことに関連しているみたい？

以下の手順で解消。

#### 1. リカバリモードでLinux Mintを起動

#### 2. root権限のターミナルにログイン

#### 3. Xserverの設定ファイルを開く

```sh
# Xserverの設定ファイルを書き出す
$ X -configure

# 設定ファイルを開く。場所は↑のコマンドの結果を見る
$ vi /root/xorg.conf.new
```

#### 4. 設定ファイルを変更

`Device`セクションの`Driver`の項目が``になっていたので、`nvidia`に変更する。

#### 5. 再起動

#### 復旧！

Nvidiaはどうしてこう相性悪いこと多いのか。
AWS ことはじめ

# はじめに
UdemyでAWSの勉強をしたので、備忘録として、残す

# アカウント作成

省略

# IAMユーザをつくる

省略

# CloudTrailの設定

サービス検索で"CloudTrail"と検索。

「新たな証跡の作成」ボタンを押す。

# 料金アラートの作成

右上のアカウントを選択し、「マイ請求ダッシュボード」を選択

下の方の「アラートおよび通知」部分の「予算の作成および管理」を選択

項目にしたがって、予算をつくっていく。

1.コスト予算を選択

|![スクリーンショット 2019-08-23 8.33.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462106/969adaf6-b99e-89f7-57e5-2c88947f57b3.png)
|:-:|

2.予算額を決める

|![スクリーンショット 2019-08-23 8.34.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462106/c89c2d33-9a49-887f-aeff-45f91a6ce7f7.png)
|:-:|

3.アラートの設定をする

|![スクリーンショット 2019-08-23 8.34.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462106/b57d8ebe-08c1-1445-cc74-73c45f531bfa.png)
|:-:|

4.確認

|![スクリーンショット 2019-08-23 8.35.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462106/96239628-7ddd-c073-6215-e3aa27fbc53f.png)
|:-:|

私の場合は "$5" に設定しました。 

# 料金を見積もる
シンプルカリキューレーターがよいらしい
https://calculator.s3.amazonaws.com/index.html?lng=ja_JP
やさしいスターリンソート入門【実用的】

# 概要

最近、巷ではスターリンソートというソートが流行っています。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">ソートされていない要素を粛清することでO(N)でソートできるスターリンソートとかいうのを見て爆笑してる</p>&mdash; やんぎん (@4116You) <a href="https://twitter.com/4116You/status/1155619860027547648?ref_src=twsrc%5Etfw">July 28, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

スターリンといえば粛清、というような考え方によるソートです。
しかし、ちょっと待ってください。スターリンには粛清以外の選択肢もありました。
すなわち、シベリア送りです。

この記事では、粛清ではなくシベリア送りによる「やさしいスターリンソート」を実装し、データの量を減らすことなく、計算量を減らします。
それによって、銀河に平和をもたらします。
※このソートは、「スターリンソート」とは異なるのでご注意ください。

# 「やさしいスターリンソート」とは

スターリンソートでは、ソート順に反する要素を粛清することによりソートをしていました。
やさしいスターリンソートでは、粛清などという怖いことはしません。
代わりに、すべての要素をシベリアに送ります。大きいとか小さいとか関係ありません。皆平等にシベリア送りです。
ただし、シベリアに送る時に、データの値が1であればシベリアの1番地、データの値が2であればシベリアの2番地、…データの値がNであればシベリアのN番地に送ることにします。

そうすると、なんと、番地の順にデータが整列しているではありませんか！

# 検証

```python3:gentle_stalin_sort.py
def gentle_stalin_sort(arr):
    siberia = [None] * int(max(arr) + 1)
    for n in arr:
        try:
            siberia[int(n)] = n
        except:
            pass  # siberiaに送れないnは粛清
    return [n for n in siberia if n is not None]  # n>0なら if n だけでよい


a = [5, 3, 4, 0, 2, 1]
gentle_stalin_sort(a)
```

すてき！


え？
Nが大きな値の時はどうするのか？
*シベリアは広大なので、そんなことは気にしません。*

# 計算量

やさしいスターリンソートのソースを見ると、一重のループしか存在しません。
実際、ちゃんと実装をすれば時間計算量のオーダーは `O(len(arr) + max(arr))` で済みます。すごい！
ただし、空間計算量としても`max(arr)`という広大なシベリアの土地が必要になります。

# 自然数でないデータの取り扱い

では、0.183のように、自然数ではないデータが存在する場合、どのように扱うのがよいでしょうか。
粛清するのも手ですが、粛清をしないとすると、いくつかの方法が考えられます。

- 数値をN倍して、全体が自然数になるようにする。
- 小数点以下を切り捨てた値で「やさしいスターリンソート」をかけてから、重複した値についてはN倍して切り捨てるなどしてもう一度ソートをかける。

# 重複しているキーがある場合

~~粛清します~~

以下のように、シベリアに行く前に鉄道で準備をすることにより、回避することができます。
なお、`int(n)`は事前に`arr`に適用されているものとして省略しました（そうでないと`max(arr)`を取れないので、バグっていました）

```python3:gentle_stalin_sort2.py
def gentle_stalin_sort(arr):
    # 鉄道の整備
    train = [0] * (max(arr) + 1)
    copy_train = [0] * (max(arr) + 1)
    for n in arr:
        copy_train[n] = train[n] = train[n] + 1
    # シベリアの大地の整備と、鉄道を利用した配置
    siberia = [[None] * max(train) for _ in range(max(arr) + 1)]
    for n in arr:
        train[n] -= 1
        siberia[n][train[n]] = n
    result_arr = [0 for _ in arr]
    # シベリアに並んだ人々を刈り取って直列にする
    current_position = 0
    for i in range(max(arr) + 1):
        for j in range(copy_train[i]):
            result_arr[current_position] = siberia[i][j]
            current_position += 1
    return result_arr
```

鉄道が増え、またシベリアの大地の重厚さが増しました。空間計算量が`max(arr) * len(arr)`のオーダーになっています。
このリストの作り方だと、リストのリストになるのでPython的には重くなってしまうのですが、本質的にはこれは多重配列であって、きちんとndarray等で書くことにすればよいので、些末な部分と思うことにして詳細割愛します。
（つまり、Pythonにおいては早くないコードですが、適当に書き換えれば十分速くなります）

この計算についてですが、2重のループになっている箇所について、`for j in range(copy_train[i]):`のところは`len(siberia)`回評価されますが、配列の生成方法から`current_position`が`0 to len(arr)`で動くので、結局オーダーを`len(siberia) + len(arr)`に抑えることができます。[^1]

# まとめ

ソートをするときには、心理的・物理的安全性を大事にしてシベリアの広大な大地を活用すると、犠牲者を出さずにソートできる。
みんな、やさしくなろう！

# ネタバレ

一般的には、このソート方法は「バケツソート」と呼ばれています（特にバケツが沢山ある場合）
https://ja.wikipedia.org/wiki/%E3%83%90%E3%82%B1%E3%83%83%E3%83%88%E3%82%BD%E3%83%BC%E3%83%88

[^1]: なので、Wikipediaの記事でなぜ英語も日本語も最悪時間計算量が$O(n^2)$と書かれているのかが分かっていません…
vue-routerでURL 引数を受け取る方法

# はじめに
少し詰まってしまったので備忘録

# やりたいこと

URLが`http://xxx.xxx.xxx.xxx?test=v`で`{test:'v'}`を受け取りたい。

# やり方

```html
        <script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.js"></script>
        <script src="https://unpkg.com/vue-router/dist/vue-router.js"></script>
        <script>
            // routerを初期化
            var router　=　new VueRouter({
                mode: 'history',
                routes: []
                });
            var app = new Vue({
                router,// router を追加
                el: '#app',
                data:{},
                created: function () {
                    // routerから読み込み
                    console.log(this.$route.query)
                }
            })
        </script>
```

# 詰まったところ
 * `VueRouter`を初期化し作らなければならない
 * `VueRouter`のインスタンスを`Vue`インスタンスに渡さなければならない
直前のコミットを取りけし

「直前のコミット、アドを取り消していく」
`$git reset --soft HEAD^`　　←commitは取り消したが、addと保存はそのままの状態。

`$git reset HEAD`　        　←addを取り消した状態。保存はそのままの状態

`$git checkout .`                  　　←indexに追加していない変更を取り消し。つまり保存する前の状態に戻す。


これで直前のコミットを消すことができる。


参考
https://qiita.com/shuntaro_tamura/items/db1aef9cf9d78db50ffe

https://qiita.com/yaotti/items/d7196870dee5ba738b90
Kotlinの継承について

#継承

Anyは全てのクラスの親クラス。
JavaのObjectとは異なる。

```
class Example // Anyから暗黙の継承
```

Kotlinのクラスは全て「Any」というクラスを継承している。Kotlinのクラスは全て非Null型のため、Null許容型であるJavaのObjectのサブクラスとなることはできない。そのため、非Null型として定義されたAnyクラスがKotlinにおける全てのクラスのスーパークラスとなっている。

※参考
[基底はObjectクラスではなくAnyクラス](https://www.atmarkit.co.jp/ait/articles/1804/24/news008.html#011)

クラスヘッダ内のコロンの後に型を書くと、明示的に親クラスを宣言できる。

```
open class Base(p: Int)

class Derived(p: Int) : Base(p)
```

親クラスのコンストラクタが引数を持っているならば、子クラスのプライマリコンストラクタの引数を使って、親クラスのコンストラクタに渡すことができる。

もし子クラスがプライマリコンストラクタを持たない場合は、セカンダリコンストラクタでsuperキーワードを使って初期化しなければいけない。

```
class MyView : View {
    constructor(ctx: Context) : super(ctx) {
    }

    constructor(ctx: Context, attrs: AttributeSet) : super(ctx, attrs) {
    }
}
```

クラスのopenアノテーションはJavaのfinalの反対で、継承を許可する。

#メンバのオーバーライド
クラスと同様メンバメソッドもopenをつけることで継承できるようになる。

```
open class Base {
  open fun v() {}
  fun nv() {}
}
class Derived() : Base() {
  override fun v() {}
}
```

openをつけないで、子クラスで同じメソッドを宣言しようとするとコンパイルエラーになる。
finalクラス（openをつけないクラス）では、メソッドにopenをつけることはできない。

overrideしたメソッドをfinalにして、それ以降はオーバーライドさせないようにすることもできる。

```
open class AnotherDerived() : Base() {
  final override fun v() {}
}
```

プロパティのオーバーライドもメソッドのオーバーライドと同じように宣言できる。

```
open class Foo {
    open val x: Int get { ... }
}

class Bar1(override val x: Int) : Foo() {

}
```

継承をする時に、valをvar、varをvalにすることができる。

#待って！じゃあどうやって自分のライブラリをハックすれば良いの？！
オーバライドのKotlinでの方法（）には1つ問題がある。
あなたが使用しているライブラリ内の何かをサブクラス化し、いくつかのメソッドをオーバライドして（ライブラリの設計者はそれを意図していない） そこにいくつかの厄介なハックを導入するのが難しくなる、という問題。

次のような理由から、これは欠点ではないと考えられている。

ベストプラクティスは「とにかくこれらのハックを許可すべきではない」ということである
同様のアプローチを取っている他の言語 (C++, C#) はうまくいっている
もし本当にこのハックが必要ならば、それでも方法は残っている：いつでもハックをJavaで書き、Kotlinから呼ぶことができる（ Java Interopを参照 してください ）し、Aspectフレームワークはいつもこれらの目的にかなう

#ルールのオーバーライド
Kotlinの継承の実装ルールは以下。

```
open class A {
  open fun f() { print("A") }
  fun a() { print("a") }
}

interface B {
  fun f() { print("B") } // インタフェースのメンバはデフォルトで'open'
  fun b() { print("b") }
}

class C() : A(), B {
  // オーバーライドするためにコンパイラは f() を要求する
  override fun f() {
    super<A>.f() // A.f()の呼び出し
    super<B>.f() // B.f()の呼び出し
  }
}
```

f()については、両方の親クラス（インターフェース）で定義されているので
子クラスでは独自の定義をしなければならない。

#抽象クラス

クラスとそのメンバはabstractを使用して、抽象クラス・抽象メンバとして宣言することができる。
これらにopenアノテーションは不要。

```
open class Base {
  open fun f() {}
}

abstract class Derived : Base() {
  override abstract fun f()
}
```

#コンパニオンオブジェクト
Kotlinでは、JavaやC#とことなり、クラスはstaticメソッドを持たない。
ほとんどの場合、代替として、パッケージレベルの関数を使用することが推奨されている。

クラスインスタンスを持たずに呼べるがクラス内部（例えばファクトリメソッド）へのアクセスが要る関数を書く必要があればcompanion objectの中にメソッドを書ける。

```
class MyClass {
    companion object Factory {
        fun create(): MyClass = MyClass()
    }
}
```

val instance = MyClass.create() のように使える。

※参考
[kotlinのcompanionとcompanion objectをちゃんとまとめる。](https://qiita.com/iwsksky/items/eebcb03428312329ae58)

#シールクラス
※参考
[シールクラスで継承可能なクラスを制限する (sealed class)]
(https://maku77.github.io/kotlin/basic/sealed-class.html)

[KotlinのSealed Classを使いこなす](https://blog.takuji31.jp/entry/2017/12/07/183613)
PHP　擬似変数$thisとは何？？

PHPでコードを書いていると「$this」をよく見かけるのですがどういう使い方か分からなかったのでまとめてみました。

擬似変数とは一言で言うと
「クラス定義内部であればアクセスできるオブジェクト（インスタンスメソッド）のこと」

最初はこの一文を読んでも「？？？」だったのでもう少しかみ砕いて言うと
「$thisを使えばスコープ外で定義された変数も使えるよー」ということみたいです。


具体例をコードに沿って


```
<?php
 
class FruitClass{
 
  public $fruit = 'Apple';
 
  //メソッドの宣言
  public function FruitMethod(){
    $fruit = 'Grape';

    echo $fruit;
    //Grapeが出力
    echo $this->fruit;
    //Appleが出力
  }
}
 
//インスタンスの生成
$class = new FruitClass();
//メソッドの呼出し
$class->FruitMethod();
 
?>


```
比較したかったので
クラス内とメソッド内で同じ変数fruitを使用しました。


まずはFruitクラスの中で変数fruitに'Apple'を代入しています。
この変数fruitこそ
####今回お題になっている$thisを使うことで（クラス内であれば）どこでも呼び出せる変数
になっています。


次にFruitメソッドの中で変数fruitに'grape'を代入しています。
この変数はFruitメソッドの中で定義されているのでメソッド内でしか呼び出すことができません。



そして

```
    echo $fruit;
    //Grapeが出力
    echo $this->fruit;
    //Appleが出力

```

このような結果となりました。


`echo $this->fruit;`は
「クラス内で定義されているfruit変数をechoするよ」
と読み替えることができるのかなと。





擬似変数が効果を発揮するのは
・クラスの中に複数のメソッドがありそれらの中で同じ変数を使いたい時
・上記例コードのようにメンバ変数とローカル変数で同じ変数名を使いたい時
が挙げられると思います。

1点目については変数をまとめることで可読性の向上にも繋がると思います。(2点目についてはあまり頻度は高くないかなと思いますが...)



以上です！！
Djangoで戻るボタン用のViewを実装してみた。

フロント側で<font color="red">history.back()</font>や<font color="red">request.META.HTTP_REFERER</font>を使って戻るボタンを実装してみましたが、画面を再表示して戻った時や入力内容の確認画面から戻ってさらに戻る場合などに不都合が発生したため、戻るボタンをView化してみました。

■遭遇した不都合一覧
・検索して一覧表示 → 詳細にとぶ → 戻る → ページネーションが保持されてない（！？）
・一覧の新規登録ボタン押下 → 入力画面 → 確認画面 → 戻る → 入力画面 → 戻る → 確認画面（一覧に戻ってほしかった・・・）
・一覧の新規登録ボタン押下 → 入力画面 → 画面再表示 → 戻る → 入力画面（一覧に戻ってほしかった2・・・）

# BaseView
まず、すべてのViewが継承しているBaseViewで、処理後に<font color="red">request.META.HTTP_REFERER</font>をリストにつめてセッションに保存処理を追加する。

``` base/views.py
class BaseView(BaseView):
    @classmethod
    def view(cls, request, **kwargs):
        ...
        ..
        .
        try:
            this.main()
        except ApplicationException as ae:
            # 業務例外発生時
            ...
            ..
            .
        else:
            cls.__update_back_redirect_histories(request) # request.META.HTTP_REFERERをセッションにつめる処理
        return this.response()

    def __update_back_redirect_histories(request):
        """ このメソッド追加
        """
        # 戻るボタン押下時は何もしない
        if 'back' in request.path:
            return

        # リファラ(遷移元)をセッションに保存する処理
        back_redirect_histories = list()
        if 'HTTP_REFERER' in request.META and request.META['HTTP_REFERER']:
            # 既に遷移元のリストがセッションに存在する場合はそのリストに追加する。
            if 'back_redirect_histories' in request.session:
                back_redirect_histories = request.session['back_redirect_histories']
            if len(back_redirect_histories) == 0 or back_redirect_histories[-1] != request.build_absolute_uri():
                back_redirect_histories.append(request.META['HTTP_REFERER'])

            # 遷移元リストを後方から走査し、現在のURLと一致するリファラが見つかった場合、
            # リファラの最後尾から見つかった位置までのリファラをリストから削除する。
            rm_index = 0
            for redirect in reversed(back_redirect_histories):
                rm_index += 1
                if redirect == request.build_absolute_uri():
                    rm_index = -rm_index # 正数を負数に変換
                    break;
            if rm_index < 0:
                back_redirect_histories = back_redirect_histories[:rm_index]

            # 新しい遷移元リストでセッションを更新
            request.session['back_redirect_histories'] = back_redirect_histories
```

　
　
# 戻るボタンのView

```common/views.py
from base.views import BaseView

class BackView(BaseView):
    """ 戻るボタン押下時のビュークラス
    """
    method_only = ['GET']
    def main(self):
        # セッションから遷移元リストを取得し、最後尾のパスをリダイレクト先に設定する
        back_redirect_histories = self.request.session['back_redirect_histories']
        self.redirect_to = back_redirect_histories[-1]
```
　
　
# urls.pyに戻るボタンのViewを追記

```app/urls.py
from django.urls import path
from common.views import BackView

app_name = 'app'
urlpatterns = [
    ...
    ..
    .
    # 戻るボタン（共通）
    path('back', BackView.view, name='back'),
]
```
　
　
# フロント側の戻るボタンはBackViewを呼び出すだけ

```html
<a href="{% url 'app:back' %}">
  <button type="button" >戻る</button>
</a>
```
  
# 備考
みんな戻るボタンどんな風に実装しているんだろうか・・・＿φ(￣ー￣ )
（Qiita用にBaseViewをかなり書き換えましたが、実際は認証チェックしてたりするので、あしからず。）
VBA 正規表現で特定の文字のあとに特定の文字が来るかあるいは行末のパターン


```vb
[0-9]{1,2}($|日|\.)
```

これは
10日
10.
10
のすべてにヒットします。
つまり行末を表す`$`をカッコにいれればよかったんですね。
`\.`これはVBAの画面では円マーク半角ピリオドになります。これはピリオドをバックスラッシュによってエスケープしているのです。
`$`は
http://excel-mania.com/vba/regexp.html
>正規表現文字列
RegExpオブジェクトのPatternプロパティに設定できる正規表現文字列です。 
>`$` 内容 文字列の末尾。

https://excel-ubara.com/excelvba4/EXCEL232.html
位置マッチング
>`$` 機能 文字列の末尾にのみマッチします

Regular Expression Language - Quick Reference
https://docs.microsoft.com/en-us/dotnet/standard/base-types/regular-expression-language-quick-reference
Anchors, or atomic zero-width assertions, cause a match to succeed or fail depending on the current position in the string, but they do not cause the engine to advance through the string or consume characters. The metacharacters listed in the following table are anchors. For more information, see Anchors.
アンカー、つまりアトミックなゼロ幅アサーション(不可分ゼロ文字数設定)は、文字列の現在の位置に応じて検索適合（マッチ）を成功または失敗させますが、(適合検索=正規表現)エンジンが文字列を進めたり、文字を消費したりすることはありません。 次の表にリストされているメタキャラクター(メタ文字、適合概念表象文字）はアンカーです。 詳細については、アンカーを参照してください。
>`$` Description - By default, the match must occur at the end of the string or before \n at the end of the string; in multiline mode, it must occur before the end of the line or before \n at the end of the line.
デフォルトでは、文字列の末尾または文字列の末尾の\ nの前で一致する必要があります。 複数行モードでは、行末または行末の\ nの前に発生する必要があります。

https://wellsr.com/vba/2018/excel/vba-regex-regular-expressions-guide/
>"End of a string." The significance of the dollar sign in search patterns is context-dependent. If the VBA MultiLine parameter is set to True, the dollar sign means "end of line," rather than "end of string."
検索パターンでのドル記号の表象はコンテキストに依存します。 VBA MultiLineパラメーターがTrueに設定されている場合、ドル記号は「文字列の終わり」ではなく「行の終わり」を意味します。

とされています。
日本語ベースだと単に文字列の末尾としているのですが、日本語と英語を比べると
`$`はメタ文字（位置概念表象文字)はアンカーである。
`$`は位置を表すドル記号です。これは標準では文字列の終わりか改行`\n`の前という位置の概念を表象しています。また、複数行モードでは文字列の終わりではなく、行末かまたは行末の改行`\n`の前の位置という位置の概念を表象しています。
ということで、よく考えると複数行(Multiline）では意味が違うんですね。
vim-easy-alignでvimmerへの道を極めよう

`.vimrc`に設定しているプラグインの一つ`vim-easy-align`の使い方を備忘録として、簡単なメモに残します。

# vim-easy-alignとは

**[vim-easy-align](https://github.com/junegunn/vim-easy-align)**は、区切り文字でパラグラフを簡単に整形できるプラグイン。例えば、プログラムの可読性を高めるために、コマンド一つで`=`の位置をを同じに出来たり、マークダウン記法のテーブルを見やすく整形出来たりする。

# 使い方
下記のように設定すると、ノーマルモード、ヴィジュアルモードで`ga`コマンドが利用できるようになる。

```vim
"=======================================
" vim-easy-align
"=======================================
xmap ga <Plug>(EasyAlign)
nmap ga <Plug>(EasyAlign)
```

基本のコマンドと覚え方は、次の通り（`=`は場面に応じて切り替える）。

| コマンド | 覚え方                                             |
| ---      | ---                                                |
| vipga=   | **v**isual-select **i**nner **p**aragragh **ga** = |
| gaip=    | **ga** **i**nner **p**aragragh =                   |


個人的に、使用頻度が高いのは、次の二つ。

- **=（イコール）を基準に整形する**
- **テーブルを見やすく整形する**

それぞれ主に、`gaip=`、`gaip*|`コマンドを使う。

***

###1. =（イコール）を基準に整形する

**before**

```
i = 0
x, y = 3, 4
ary = [1, 2, 3]
```

`gaip=`コマンドを使うと、

**after**

```
i    = 0
x, y = 3, 4
ary  = [1, 2, 3]
```

###2, テーブルを見やすく整形する

**before**

```
|command|how to remember|
|---|---|
|vipga=|visual-select inner paragragh ga =|
|gaip=|ga inner paragragh =|
```

`gaip*|`コマンドを使うと、

**after**

```
| command | how to remember                    |
| ---     | ---                                |
| vipga=  | visual-select inner paragragh ga = |
| gaip=   | ga inner paragragh =               |
```

といった具合である。

***

###`=`の代わりに使えるその他

| コマンド | 説明                                         |
| ---      | ---                                          |
| =        | 一致した一つ目の=を基準に整列させる                   |
| 2=       | 一致した二つ目の=を基準に整列させる                    |
| *=       | 一致した全ての=を基準に整列させる             |
| **=      | 一致した全ての=を基準に左右交互に整列させる    |
| Enter  | 整列させる位置を（左/ 右/ 中央）で切り替える |


**Enterの使い方**

- `<Enter>`一回で**右**に、二回で**中央**に整列させることができる。
`<Enter>`なしでは、上記の二つの例で見たように、左詰で整列させる(デフォルト)。
- `gaip<Enter><Enter>*=`のように使う。

# 参考
[github, vim-easy-align](https://github.com/junegunn/vim-easy-align)

# 関連
[vim-surroundでvimmerへの道を極めよう](https://qiita.com/takuyanin/items/5eb009e737a235e51ab2)
iOS13 beta6でContext Menusの仕様が変わったのかな？

前提として以下のような画面遷移を作ろうとしています。
![SS2019-08-23 5.27.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95033/5d4998d4-0d9c-8b2f-ba00-a659a6fd3b80.png)

iOS13で導入された[Context Menus](https://developer.apple.com/design/human-interface-guidelines/ios/controls/context-menus/)を使ってプレビューを表示します。
プレビューをタップすると詳細画面に遷移します。


#問題
正確に調べていないのでアレですが、
少なくともiOS13 beta6からプレビューをタップしても詳細画面に遷移しなくなりました。

#原因
動いていた当時は

```Swift:UITableViewDelegate
func tableView(_ tableView: UITableView, 
willCommitMenuWithAnimator animator: UIContextMenuInteractionCommitAnimating)
```

プレビューをタップするとこれが呼ばれていましたが、

少なくともiOS13 beta6からは

```Swift:UITableViewDelegate
func tableView(_ tableView: UITableView, 
willPerformPreviewActionForMenuWith configuration: UIContextMenuConfiguration, 
animator: UIContextMenuInteractionCommitAnimating)
```

プレビューをタップするとこちらが呼ばれるようになりました。

Appleの[ドキュメント](https://developer.apple.com/documentation/uikit/uitableviewdelegate/3375810-tableview)~~を見ても何も書いてありません。~~
久々に見たら書いてありました。

こちらのサイトを見るとiOS13 beta6でAPIが追加になってますね。
[iOS13 Beta 5 to Beta6 API Differences](http://codeworkshop.net/objc-diff/sdkdiffs/ios/13.0b6/UIKit.html)

#トリビア
プレビュー画面から画面遷移する処理は以下のようになりますが、

```Swift:UITableViewDelegate
func tableView(_ tableView: UITableView, 
willPerformPreviewActionForMenuWith configuration: UIContextMenuConfiguration, 
animator: UIContextMenuInteractionCommitAnimating) {

    animator.addCompletion {
        // 画面遷移する処理
    }
}
```

上記処理に```animator.preferredCommitStyle```を追加すると画面遷移するときの動きが選択できます。



```Swift
// プレビュー画面から直接画面遷移する。(デフォルト)
animator.preferredCommitStyle = .pop
```



```Swift
// 一度元の画面に戻ってから画面遷移する。
animator.preferredCommitStyle = .dismiss
```


---
Apple Developer Forumを見たところ、iOS13 beta6からの現象らしいので訂正します。

iOS13 beta8 + Xcode11 beta6に基づいて記述しています。
リリース版では変更される可能性があります。
コードの臭い

書籍「プリンシプル オブ プログラミング 3年目までに身につけたい 一生役立つ101の原理原則」を読んだメモ
**コードの臭いとは、コードの中で理解しにくい、修正しにくい、拡張しにくいと感じられる部分**

## よく見る

- そっくりなコードが散らばっている状態
- コードをコピペして重複を作り出すと、修正しにくくなる
- 重複コードは１つの関数にまとめる

## 長過ぎる

- 関数が長すぎて、スクロールを何回繰り返しても終わらない状態
- 長すぎる関数は分割して短くする

## 太すぎる

- モジュールが太すぎて管理不能な状態
- モジュールが大きすぎるということは、そのモジュールがになっている責務が大きすぎる
- 大きすぎるモジュールは分割して小さくする

## 多すぎる

- モジュールが多すぎて管理不能な状態
- モジュールが大きいからといって分解しすぎてはいけない
- 多すぎたら、あまり仕事をしていない仲介役を削除したり、統廃合を繰り返して数を減らす

## 名前が合わない

- 名前と実際のコードがあっていない状態
- 表現したい概念と名前があっていないコードを発見したら、直ちに適切な名前に変更する
Spacemaces Japanese Layer (Part 2)

3年ほど前に私が作成した Spacemacs の [Japanese Layer](https://github.com/syl20bnr/spacemacs/tree/develop/layers/%2Bintl/japanese) が去年あたりに Spacemacs の開発版にマージされていましたが, そのまま放置していました. その理由は:

1. メインのエディタが [Microsoft Visual Studio Code](https://azure.microsoft.com/ja-jp/products/visual-studio-code/) となってしまい, Spacemacs を弄る機会がめっきり減った,
2. Japanese Layer で用いるパッケージ `avy-migemo` がMELPA 上で更新されなくなり, 一部の機能が動作しなくなった,

からです.

最近, [昔の投稿](https://qiita.com/kenjimyzk/items/2429f74451a35c9f12fd) にコメントがあり, 動作できるように ``README.org`` を書き換えました. また ``avy-migemo`` について動作する方法がみつかったので, ここで報告しておきます.

まずSpacemacs の開発版を使うには, Spacemacs のリポジトリが `~/.emacs.d` にあるなら

```
$ cd ~/.emacs.d
$ git checkout develop
$ git pull origin develop 
$ git clone 
```
と実行すればよいです. 

なお安定版を使っているのなら, 最新の Spacemaces Japanese Layer は [リポジトリ](https://github.com/kenjimyzk/spacemacs-japanese) にあります. ただ開発版との違いはほとんどなく Ubuntu でも migemo の辞書を設定できるようにして, `README.org` の記述を書き換えただけです. 

最新の Spacemaces Japanese Layer を導入するために, 設定ファイルが `~/.spacemacs.d/init.el` にあるとするなら, ディレクトリ `~/.spacemacs.d/layers/` を作成し, 以下を実行する:

```
mkdir ~/.spacemacs.d/layers/
cd ~/.spacemacs.d/layers/
git clone https://github.com/kenjimyzk/spacemacs-japanese japanese
```

さて Spacemacs Japanese Layer を利用するには `~/.spacemacs.d/init.el` の `dotspacemacs-configuration-layers` において

```
japanese
``` 
を追加します. ただこのままでは migemo が実行されません.

Spacemacs が `helm` を用いているのか `ivy` を用いているのかに応じて設定ファイルが異なります. 正確には最新版のREADME.org にある通りなのですが, `~/.spacemacs.d/init.el` にある `dotspacemacs/user-config` を以下のように修正すればどちらでも対応可能です.

```
(with-eval-after-load "migemo"
  (helm-migemo-mode 1)
  (require 'avy-migemo-e.g.ivy)
  (require 'avy-migemo-e.g.swiper)
  (require 'avy-migemo-e.g.counsel))
```

ただ, このままではmigemo検索 (`SPC s s`) はできるが, migemoジャンプ (`SPC j j`) はできません. 冒頭で述べたように `avy-migemo` が一年以上前から更新されていないからです.

これを回避するには, プルリクエスト中の [フォークバージョン](https://github.com/tam17aki/avy-migemo) を使えばよいです.
いま `avy-migemo.el` が `~/.emacs.d/elpa/avy-migemo-20180716.1455/` にあるとします (開発版や複数のバージョンを併用している場合, 別の場所にあるかもしれません).
このとき, どこかの作業フォルダ上で以下を実行します.

```
git clone https://github.com/tam17aki/avy-migemo
cp avy-migemo/*.* ~/.emacs.d/elpa/avy-migemo-20180716.1455/
```
そして `~/.emacs.d/elpa/avy-migemo-20180716.1455/` にある `avy-migemo.elc` を新たにバイトコンパイルして生成するか, ファイルそのもの削除します. これでmigemoジャンプ (`SPC j j`) が可能になります.

なお MELPA 上で `avy-migemo.el` が更新されれば, さきほどの変更も更新されることになります. ただ, その更新で `avy-migemo` が使えるようになるでしょう.

最初に書いたように, 最近は VSCode を使っていたが, Spacemacs Japanese Layer を作成した責任もあるので, 今後はこまめにメンテナンスしていきたいと考えています.
Google ColaboratoryにはGPUガチャがあるよという話


※2019年8月時点の情報です。今後の機材アップデートやColabの方針次第では、この情報は変わる可能性があります。

## きっかけ
条件を変えて別々のランタイムで訓練させると、1個は150エポックぐらい進んでいるのに、もう1個は50エポックぐらいしか進んでいないという現象がありました。

ほぼ同じ計算量なのに、条件によって2～3倍ぐらい計算時間が違う、これはおかしい――ということで調査してみました。

## nvidia-smiしてみる
どのGPUが割り当てられているかは「nvidia-smi」で確認できます。

![colab1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232088/31c93f7e-a320-3092-5043-5d86b8b438c6.png)

1回目、**Tesla K80**が割り当てられています。これまで通りですね。ここでランタイムをリセットしてみます。

![colab2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232088/917ba407-9a10-60fd-518a-1205f59d287e.png)

2回目、**Tesla T4**が割り当てられました。こちらは最新のGPUです。訓練が速かったケースは、このGPUを引けたときだったようです。

このように、2019年8月現在のColabにはランタイムを割り当てるタイミングによってGPUが変わる、**GPUガチャ**があります。

元はK80だけの運用だったところに、最新のT4が追加され、現在は両方混ぜて割り当ててるのかもしれませんね。

## 注意点
特に**ベンチマークする際はお気をつけください**。T4だと思ってたのがK80だったり、あるいはその逆だったりすると大きく結論が変わります。「!nvidia-smi」でどのGPUがきてるか確認してから、ベンチマークするのをおすすめします。

あとはこちらのほうが有り得そうですが、**計算時間の目安が全然変わります**。「あんまり時間かからないな」思ってそれを基準にエポック数設定していると、実はそこで割り当てられていたのはT4で、K80がきたときにはえらい時間がかかり、放置していたらタイムアウトしていたとかよくあります。最悪半日分の訓練が飛ぶので、悲しみを背負わないようにしましょう。

ただし、速いからといってT4狙いでリセマラをするのは自己責任で！（公式FAQに以下のような記述があります）

> **T4 GPU などのハードウェア リソースを利用できないのはなぜですか？**
最も利用しやすいハードウェアは、Colaboratory を長期間のコンピュータ処理ではなくインタラクティブに使用しているユーザーに優先的に割り当てられます。Colaboratory を長期間のコンピュータ処理に使用しているユーザーは、利用可能なハードウェアの種類やハードウェアの利用時間に関して、一時的に制限される場合があります。コンピュータ処理に特別なニーズがあるユーザーは、Colaboratory の UI をローカル ランタイムで使用することをおすすめします。
なお、Colaboratory を暗号通貨採掘に使用することは認められていません。Colab のご利用を全面的に禁止される可能性がありますので、ご注意ください。

https://research.google.com/colaboratory/faq.html

なお、TPUランタイムの場合は、このようなデバイスガチャの要素があるという話は聞いたことはありません（あったら教えて下さい）。
Python3で活性化関数のシグモイド関数とReLU関数を描く

活性化関数のうちこの２つを描いてみます

```
%matplotlib inline
%config InlineBackend.figure_format = 'retina'
```
```
import matplotlib.pyplot as plt
import numpy as np
```
##まずはsigmoid関数
sigmoid関数の定義

```
def sigmoid(x):
    return 1/(1+np.exp(-x))
```

横軸xの取りうる範囲は -6.0から6.0まで0.1ずつ増加

```
x = np.arange(-6.0,6.0,0.1)
```

yを今作ったsigmoid関数の戻り値とする

```
y =sigmoid(x)
```

実際にプロット

```
plt.plot(x,y)
```
<img width="372" alt="download.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/477622/dbddebdf-6f83-27af-2dd7-1a651675ee84.png">

##次にReLU(ランプ)関数
ReLU関数の定義

```
def relu(x):
    return np.maximum(0,x)
#xが0以下ではyは0、xが正の時はidentity mapping(つまりy=xの恒等写像)
```
y_reluを今作ったReLU関数の戻り値とする(xの取りうる範囲は先ほどと同様-6から6)

```
y_relu =relu(x)
```

実際にプロット

```
plt.plot(x,y_relu)
```
<img width="363" alt="download-1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/477622/32d1b82b-59f6-a139-a4ba-391e831bf610.png">
Win版の VS Code+VSCodeVim でノーマルモードに戻った時にIMEを半角英数入力にする

[VSCodeVimのreadme](https://github.com/VSCodeVim/Vim#input-method) を見ると [im-select](https://github.com/daipeihust/im-select) を使えとのことでしたが、なんか思ってたのと違うっぽいのでWin32API叩いて半角／全角を切り替えることにしました。


## プログラムを用意する

github: https://github.com/iuchim/zenhan
[実行ファイル](https://github.com/iuchim/zenhan/releases/download/v0.0.1/zenhan.zip)

自分でビルドするか上のzipファイルに入ってる zenhan.exe をお好きな場所にコピーしておいてください。
今回は C:\Users\foo\bin にコピーしたとします。

## VSCodeVim の autoSwitchInputMethod を設定

settings.json に次の設定を追加します。

```
    "vim.autoSwitchInputMethod.enable": true,
    "vim.autoSwitchInputMethod.defaultIM": "0",
    "vim.autoSwitchInputMethod.obtainIMCmd": "C:\\users\\foo\\bin\\zenhan.exe",
    "vim.autoSwitchInputMethod.switchIMCmd": "C:\\users\\foo\\bin\\zenhan.exe {im}",
```

保存したら完了です。

この設定だと、インサートモードに戻った時にIMEの状態を復元してくれますが、個人的には半角のままのほうが好みなので obtainIMCmd を次のようにしています。

```
    "vim.autoSwitchInputMethod.obtainIMCmd": "C:\\users\\foo\\bin\\zenhan.exe 0",
```


## 参考にしたもの

* [C#でIMEの変換モードを監視・変更する](https://qiita.com/kob58im/items/a1644b36366f4d094a2c)
* [im-select のコード](https://github.com/daipeihust/im-select)

大変参考になったというか、2つを混ぜて作りました。
ありがとうございます。
elasticsearchのデータのタイムスタンプを一括更新する

# やりたいこと
[前回の話](https://qiita.com/henatyokotraveler/items/82167616f1d278b285cc)
GrafanaのOverride rerative time機能でelasticsearchのデータを常時表示するためには、
elasticsearchのデータのタイムスタンプを、全データ更新するシェルが必要になる。
ということで今回はその作成記事。

# elasticsearchで一括置換するクエリ
下記を参考に一括更新のクエリを調べる。
https://qiita.com/nakazii-co-jp/items/d8dca15e5eab6406ffdb

サイトにあったクエリを少し変えて、Hogeのとこを日時にすればいけると想定。

```
curl -XPOST 'http://localhost:9200/hoge_index/_update_by_query?conflicts=proceed&pretty' -d '{
  "query": {
    "match_all": { }
  },
  "script": {
    "inline": "ctx._source.field_01 = \"Hoge\";"
  }
}'
```

# curlに変数をどうやって入れるのか？
$DATEとか作ってdateコマンドの結果を入れるも、jsonのエラーとか出てうまくいかない。
変数がうまく展開されない。

下記を参考にシングルクォートが問題と判明。ヒアドキュメントを使うことにした。
これはいい方法だと思った。
https://qiita.com/tekitoh/items/8acccb313d6e7a14c2ec
https://dev.classmethod.jp/server-side/os/how-to-inject-variable-to-json-on-bash/

ヒアドキュメント使ってもなんかフォーマットエラーが出る。

# elasticsearchの日時(date)のフォーマットではまる
細部は違うけど、下記と同じフォーマットエラーが出る。
https://stackoverflow.com/questions/48916830/elasticsearch-date-format-parsing-error
上記から引用したエラー

```
"type": "mapper_parsing_exception",
        "reason": "failed to parse [afield.startDate]",
        "caused_by": {
            "type": "illegal_argument_exception",
            "reason": "Invalid format: \"2018-01-10T07:07:07+01:00\" is malformed at \"+01:00\""
        }
```

調べた結果、どうも下記のdateのフォーマットが
elasticsearchの対応パターンになかったためらしい。
下記のフォーマットでlogstashでelasticsearchに問題なく取り込んでいたから中々気づけなかった

```
date -d "+%Y-%m-%d %H:MM:ss"
```
公式へのリンク
https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-date-format.html

# 完成したシェル
いろいろ試行錯誤した結果、下記でうまく@timestampを全データ指定の時間に更新できました。
これをcronで動かして@timestampが直近の1時間になるようにしています。
※'9 hours ago'はelasticsearchのtimezoneを合わせてないので、その分ずらしているため

```
#!/bin/sh

DATE=`date -d '9 hours ago' "+%Y-%m-%dT%H:00:00.000Z"`

curl -XPOST "localhost:9200/hoge_index/_update_by_query?conflicts=proceed&pretty" -d @- <<EOS
{
 "query": { "match_all": {}},
 "script": { "inline": "ctx._source['@timestamp'] = ['$DATE'];" }
}
EOS
```
働き方改革！SALESFORCE(teamspilit)勤務表の時間入力スクリプト自動化～javascript


# SALESFORCE勤務表の時間入力スクリプト自動化～javascript

## ❖ 背景
働き方改革で勤務時間が制限され、残業は減ったが、

**単位時間当たりの労働量が増加した**

なんてことを耳にします。

残業が制限されたことで、毎月の残業時間が制限されることも..

Salesforceの場合、当月の残業時間の可視化をするためには、勤務表に見込み時間を入力しておく必要があったりします。

が、ポチポチ決まった時間を入力するのが面倒だったりもします。

少しでも日ごろの単純作業を自動化したいと思い、

Web勤務表（SALESFORCE）の自動打刻スクリプトを作成しました。

## ❖ 前提条件

ブラウザ（Chrome）と少しJavascriptの知識があればOKです！

対象として、teamspilitの勤怠管理を想定しています。

<https://appexchangejp.salesforce.com/appxListingDetail?listingId=a0N30000003J6KhEAK>

## ❖ できること
- Salesforceを使った勤務表打刻の自動化（固定時間の入力）
- 当月分の勤務予定時間をあらかじめ自動的に埋めておくことができる

## ❖ スクリプト（`javascript`）

以下より取得(コピー)してください。

<https://gist.github.com/tutttuwi/f56023534321878ce28b8744e74ffcf8#file-inputandresetsalesforcedata-js>

## ❖ 使い方
1. 対象者
  - salesforce(<https://login.salesforce.com/>)でWeb勤務表を利用している人
2. 利用方法
  - salesforceにログインし、勤務表ページを開く
  - ブラウザの開発者ツール > コンソールを開き、コピーしたスクリプトを全量を張り付ける
  - 個人設定変数`config` を編集する（編集方法は以下の通り）
  - Enter! で実行

|変数| デフォルト     |説明|
|----|--------------|---|
|startDD|14| 日: 入力を開始したい日付|
|endDD|31| 31日までを入力候補とします。30日までしかない月も31日で問題ありません。|
|sleepTime|3000| 遷移の待ち時間（ミリ秒）: ３秒推奨。３秒あれば各トラン処理が終了する想定|
|resetFlg|false| 入力項目をリセットするかどうか true/false <br/>trueを設定すると、`startDD`から`endDD`までの<br/>日付に入力されている時間をリセットします。誤って全部入力してしてしまった際に重宝。|
|defaultStartTime|"09:30" | 設定したい勤務開始時刻|
|defaultEndTime|"20:00" | 設定したい勤務終了時刻|

3. その他
    - 実行後、ブラウザをリロード(F5)することで処理を中断することができます
    - タグ名から要素を取得しているので、変更があった場合は正しく動きません（2019/08/23現在は大丈夫そうです）
    - 勤務表画面以外では実行しないでください。
    - 値が正しく入力されているかは自己責任でお願いします

## ~~ あとがき

- お手軽に ブラウザ(`chrome`) + `javascript` でWebスクレイピングする方法の糸口として勉強になりました。
    - ただ、画面遷移を伴う処理はこの方法では不可能..
- async/await の理解も進みました
- 要素のクリックを伴うのでSleep処理は必要だと実感

ご参考になれば幸いです。
keyとvalueをkeyとしてもつオブジェクトの配列からオブジェクトを生成する

# やりたいこと

keyとvalueをkeyとしてもつオブジェクトの配列 (`idNamePairs`)からidがkeyに対応し、nameがvalueに対応したオブジェクトを生成する関数`convertToObj`を書きたい。

```typescript
const idNamePairs = [
  { id: 3, name: "john" },
  { id: 2, name: "mary" },
  { id: 5, name: "max" }
];
const mappingTable = convertToObj(idNamePairs);
console.log(mappingTable);
// 実行結果は { '2': 'mary', '3': 'john', '5': 'max' }
```

# 方法1: for-loopで空のオブジェクトに一個ずつ入れていく方法

```typescript
const idNamePairs: { id: number; name: string }[] = [
  { id: 3, name: "john" },
  { id: 2, name: "mary" },
  { id: 5, name: "max" }
];
const mappingTable: { [key: string]: string } = {};
for (let pair of idNamePairs) {
  mappingTable[pair.id] = pair.name;
}
```

"The art of readable code"にも書かれていたと思うが、変数を定義する (上での`mappingTable`)ということは脳内のメモリを消費することになる。しかも、一度constで定義した変数をいじっているのでなんか気持ち悪い。

# 方法2: `Array.reduce`を使う

変数を定義し変更を加えていくスタイルをやめるには、`Array.reduce`を使う。
reduceの初期値として空のオブジェクトを指定し、callbackで各要素についてkey-valueを指定していく。

```typescript
const idNamePairs: { id: number; name: string }[] = [
  { id: 3, name: "john" },
  { id: 2, name: "mary" },
  { id: 5, name: "max" }
];
const mappingTable = idNamePairs.reduce<{ [key: string]: string }>(
  (table, { id, name }) => {
    table[id] = name;
    return table;
  },
  {}
);
```

前者の方がコード量的には少ないが、後者は全く副作用がない形で書かれている。
どっちをとるのがベストか...
reactのpropsを使ってみました

#はじめに
[未来電子テクノロジー](https://www.miraidenshi-tech.jp/intern-content/program/)でインターンをしているにのみやです。

プログラミング初心者なので、間違いも多いと思います。
間違いがあれば、ぜひ教えてください。
最近Reactの勉強を始めたのですが、簡単にpropsを使って書いてみました

#コード

<p class="codepen" data-height="265" data-theme-id="0" data-default-tab="html,result" data-user="ninomiya-miraidenshi" data-slug-hash="pozRygv" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="pozRygv">
  <span>See the Pen <a href="https://codepen.io/ninomiya-miraidenshi/pen/pozRygv/">
  pozRygv</a> by ninomiya-miraidenshi (<a href="https://codepen.io/ninomiya-miraidenshi">@ninomiya-miraidenshi</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>
圧倒的非プログラマーがDeep Learningを学ぶ　関数編

(2019.08.23)（仮）
#ニューラルネットワーク

##関数の実装


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

###シグモイド関数


```python
def sigmoid(x):
  return 1/(1+np.exp(-x))
```

###ステップ関数


```python
def step_function(x):
  y = x > 0
  return y.astype(np.int)
```

NumPyの配列を引数とする使い方で実装

```python
def step_function(x):
  if x > 0:
    return 1
  else:
    return 0
```

この実装の場合、引数のxは実数(float型）しか入力できない。

astype( )メソッドでは、引数に希望する型（今回はint型*）を指定できる。

*Pythonではブーリアン型（真偽）をint型に変換すると、Trueは1、Falseは0となる。
（仮）
kubernetes gdbをサイドカーとして動作させて同一Pod内別コンテナのプロセスをデバッグしてみる


#経緯
最近になってkubernetes(k8s)を触るようになって、これができるのかどうか試してみたので記録しておきます。
開発しているコンテナの中に最初からgdbをインストールしてしまえば、確実にいけるとは思ってましたが
それだとアプリ用のコンテナイメージサイズが大きくなってしまうので、サイドカーにしたいなと思ったのが事の経緯です。
バイナリはC++で書きました。

##本題の前に
k8sの環境の上でローカルで動作させるようにデバッガをアタッチしたり、breakpointを貼りたいという需要はもちろんすでにあって
そのためのプロダクトもあります
[squash] https://github.com/solo-io/squash

最初はこれをもちろん活用できないか考えましたが

>Supported debuggers:
dlv
Java
gdb (2019) < === ※
Nodejs (2019)
Python - ptvsd (2019)

といった記載があったり、

>Debuggers
We will be adding support to several additional debuggers in early 2019, including gdb, nodejs, and python.

という記載があるように、現状動作している訳ではないようなのでそれ以外で
コンテナのデバッグ方法を確認しておきたいという意図もありました。

##結果
できた
github repository => https://github.com/iwana2929/test-attaching-gdb-to-cpp-binary-on-k8s

確認方法
https://github.com/iwana2929/test-attaching-gdb-to-cpp-binary-on-k8s/blob/master/README_jp.md

##環境
MacBook Pro (15-inch, 2017)
OS:10.14.5（18F132） Mojave
docker desktop 2.1.0.1(kubernetes: v1.14.3)
Visual Studio Code: 1.37.1

##解説
動作確認自体はdocker desktop上のみしか確認していませんが、このままminikubeでもGKEでもAKSでも動作するはず
図に起こしてみるとこういう感じで動作します
![pic.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90558/d5dce96a-6208-3be0-f7f7-eb60423eaeb2.png)

deployment.yamlについてだけ解説します。
### 同一Pod内の別のコンテナで動作しているプロセスを見えるようにする

```
spec:
      shareProcessNamespace: true #<= ココ※
```
https://kubernetes.io/docs/tasks/configure-pod-container/share-process-namespace/
上記ページに記載があります。
これのおかげでdebugtoolのコンテナから動作しているappのプロセスが見えます。
つまり *gdb -p PID* ができます。

### appのバイナリをdebugtoolにコピーする
```
    spec:
      ~ 
      volumes:
      - name: data-volume #<= ココ※
        emptyDir: #<= ココ※

      ~~~
      - name: debugtool
        image: debugtool:0.1
        ~~~~
        volumeMounts:
          - name:  data-volume　#<= ココ※
            mountPath:  /data  #<= ココ※
```
動作しているバイナリとソースコードがdebugtool側にあったほうが良いので
-ソースはコンテナのビルド時にdebugtoolの方にだけ含めておく
-バイナリは同一のものが欲しいのでtestappのコンテナからemptyDirを経由してdebugtoolにも配置しておく
という作戦です。

今回はtestappコンテナの作成時に一緒にビルドしちゃってるのでこういう形にしましたが、
バイナリは外部で作ってdocker build時にコピーするだけ(大抵はそうなると思いますが)でもいいかと思います。

emptyDir
https://kubernetes.io/docs/concepts/storage/volumes/#emptydir

### strace(gdb)がdebugtool上で実行できるようにする

```
securityContext:
          capabilities:
              add:
              - SYS_PTRACE #for gdb strace　#<= ココ※  
```
https://qiita.com/tkusumi/items/a62c209972bd0d4913fc
こちらを参考にさせて頂きました。
公式ドキュメントはこちら
https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-capabilities-for-a-container


##今後やりたい事
これがいけるならサイドカーにクラスタの外からアクセスできれば、リモートデバッグできるかも・・・
VSCodeとかVisualStudioとか、使い慣れたIDEで開発できるようにしたいですね。
やっぱGoを読み書きできるようになった方がいいのかな・・・
【備忘録】PythonによるLINE WORKS版Trello Botの実装（PyPI lineworks インストールVer.）

自作してPyPIにアップロードしたパッケージ「[lineworks](https://pypi.org/project/lineworks/)」を使用し、LINE WORK版Trello Botを実装した際の備忘録。
デプロイ先は前回（[PythonでLINE WORKS版 Trello Botを作るまでのお話](https://qiita.com/0yan/items/cd9a292d5c81c32a847d)）同様、Herokuとした。
パッケージインストール＆GitHubからデプロイにしたことで、だいぶ楽になった。



# 環境
Windows 10
PyCharm Community Edition 2019.2
Python 3.7.3（Anaconda3 2019.07）
GitHub
Heroku



# 前提条件
- LINE WORKS API情報取得済
- Trello API情報取得済



# 実装までの流れ
1. 仮想環境構築
2. ライブラリのインストール
3. コーディング（Flaskデプロイ用ファイル作成含む）
4. GitHub経由でHerokuにデプロイ
5. Trello Webhookの作成
6. テスト


#### 仮想環境構築
PyCharmでプロジェクト作成後、`python -m venv venv`コマンドで仮想環境構築。PyCharmでプロジェクト作成する際に仮想環境構築できるようなのでそれを使おうとしたら、なぜかpipインストールできない現象にはまった（SSLエラー）。次から絶対、使わない。


#### ライブラリのインストール
インストールしたものは下記の通り。

- flask
- gunicorn
- lineworks
- py-trello

なお、requestsとpycryptodomeはlineworksをインストールすれば自動で入る（pycryptoはNoModuleErrorになることが分かって大変だった・・・）。


#### コーディング
[GitHub](https://github.com/0yan/lw-trellobot
)参照。前回はPython 3.6.8を使っていたが、今回はPython 3.7.3を使っているので、runtime.txtに変更あり。また、今回からlineworksパッケージを使っているので、requirements.txtも変更あり。


#### GitHub経由でHerokuにデプロイ
GitHubにリモートリポジトリを作った後、下記コマンドでローカルリポジトリ作成＆プッシュ。

```
$ git init
$ git add .
$ git commit -m "commit message."
$ git remote add origin {リモートリポジトリ名}.git
$ git push -u origin master
```

その後、Herokuにもアプリを作り、前回同様、ビルドパックの設定と環境変数の設定を行う。そして、GitHubからデプロイ。
>参考：[【備忘録】GitHub経由でHerokuにデプロイするまでの流れ](https://qiita.com/0yan/items/cd7eb98e114dd812c498)


#### Trello Webhookの作成
HerokuにデプロイしてからでないとWebhook作成できない（HEADリクエストしないと作成に成功しない）ので、このタイミングで行う。
>参考：[【備忘録】Trello Webhook関連](https://qiita.com/0yan/items/8e697992a6cd85f1500c)


#### テスト
Trelloのカードからコメントして、LINE WORKS Botにテキストメッセージが来れば成功。なお、Trelloのカードにコメント欄ができる条件があり、ボードに2名以上の参加者がいないとダメみたい。
CentOS8の進捗状況

![CentOS8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330873/c629ccfa-903b-510b-41d0-b82995de1c82.png)

[About/Building 8 \- CentOS Wiki](https://wiki.centos.org/About/Building_8)

Release workという最終作業に入っている模様です。


[CentOS8を待ちながら （RedHat8のリリースノートを眺める） – NorthPage](https://north.thco.mp/2019/08/19/waiting-for-centos8/)

[CentOS8 \- Twitter検索 / Twitter](https://twitter.com/search?q=CentOS8&src=typed_query)

皆さんwktkしているので毎日チェックですね。
最速でリリース状況を知りたいのであればメーリングリスト登録でしょうか。
Grafanaでelasticsearchの時系列データではないデータを表示する方法

#やりたいこと
elsticsearchに入れている、
サーバーの構成管理の情報とサーバーのアラームをGrafana上で同じダッシュボードに表示したい。
elasticsearchをデータソースにし、Grafanaのパネルはtableにし、rawdocumentで表示する。
サーバーのアラームはGrafanaの時間帯指定に範囲を表示し、
構成管理の情報はGrafanaの時間帯指定に関係なく表示したい（ついでにtemplateとvariablesでフィルターをかけたい）。

#課題
elasticsearchのデータを、Grafanaの時間帯指定に関係なく表示するというのが一工夫のいるポイント。
ただ表示するだけでは、Grafanaの時間帯指定の範囲しか表示されないので、やりたいことは実現できない。

# コミュニテイの似たような質問
基本的にはできない模様。パネルの種類によってはできるような感じ
https://community.grafana.com/t/graphs-for-non-time-series-data/3932

# Override rerative time 機能
GrafanaのパネルのOverride rerative time 機能を使って解決する。
Grafanaのパネルには、
Override rerative time 機能といって、ダッシュボードで表示するよう指定した時間帯とは関係なく、常時直近の時間を表示する機能がある。

https://grafana.com/docs/reference/timerange/#panel-time-overrides-timeshift

まず表示したいデータのタイムスタンプを常時更新するようにシェルをelasticssearchに対して動かして、
このOverride rerative time 機能で直近1日（last 1day）を常時表示させれば、
Grafanaの時間指定に関係なく、データを表示できる。

# elasticsearchのデータの@timestampを更新する
そのためには、elasicsearchのタイムスタンプを全件更新するシェルが必要になる。
それは[次の記事](https://qiita.com/henatyokotraveler/items/a420f08e9844a2984ac5)に書く。
配列の要素同士を足す

要素同士を足すと調べても配列の要素の追加が多く出てしまったので忘れないようにメモ



```
lines=[]

while line=gets do
    lines<<line.chomp
end

m_g,m_s,m_b=["Gold","Silver","Bronze"]

n_g,n_s,n_b=lines

puts "#{m_g} #{n_g}"
puts "#{m_s} #{n_s}"
puts "#{m_b} #{n_b}"
```
を簡潔に書きたいと思い調べてみると
Arrayクラスのメソッド`zip`を見つけ使ってみました。

```

lines=[]

while line=gets do
    lines<<line.chomp
end

medals=["Gold","Silver","Bronze"]

sums = medals.zip(lines).map{|m,n| "#{m} #{n}"}

sums.each do |n|
puts n
end

```
長さはあまり変わりませんでしたが物が多くなった時にputsをたくさん
書く必要がないのでいいかな、、、と思います！


[zipのるりま](https://docs.ruby-lang.org/ja/latest/method/Array/i/zip.html)
チュートリアル「AWSアカウント間のIAMロールを使用したアクセスの委任」ノート

クロスアカウントアクセスを体験するための、以下のチュートリアルをやってみました。

* [チュートリアル：AWS アカウント間の IAM ロールを使用したアクセスの委任 - AWS Identity and Access Management](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/tutorial_cross-account-with-roles.html#tutorial_cross-account-with-roles-1)

こうしたユーザー管理や権限管理系のシナリオは「管理者とユーザーの1人二役」とか、今回のようなフェデレーション系では「あっちの管理者とこっちの管理者とこっちのユーザーの1人三役」などになります。個人的には、途中で誰の役でどこの設定をしているのかわからなくなりやすく苦手です。そこで各ステップの図にして確認しながら進めてみたので、ここに残しておきたいと思います。

# チュートリアルの前提条件

「[チュートリアルの前提条件](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/tutorial_cross-account-with-roles.html#tutorial_cross-account-with-roles-prereqs)」に示されているチュートリアルの初期状態は、下図のような状態です。

![初期状態.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55718/7a2bffce-2d68-956a-7d60-2fe0a4464182.png)

例えば、次のようなシチュエーションだと思われます。

* `Development` AWSアカウント（開発環境）で、開発者グループとテスターグループでアプリケーションを開発してきた。
* `Production` AWSアカウント（本番環境）にアプリケーションを置くため、開発者グループに属するユーザーだけ、アカウントを越えて`Production` AWSアカウン
トのS3バケット`ProductionApp`にアクセスさせたい。

# Step1：ロールの作成

「[Step1：ロールの作成](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/tutorial_cross-account-with-roles.html#tutorial_cross-account-with-roles-1)」は次のように説明されています。

> まず、AWS マネジメントコンソール を使用して Production アカウント (ID 番号 999999999999) と Development アカウント (ID 番号 111111111111) との間の信頼を確立します。続いて、UpdateApp という IAM ロールを作成します。ロールの作成時に、Development アカウントを信頼されたエンティティとして定義し、信頼されたユーザーに productionapp バケットを更新する許可を与えるアクセス許可ポリシーを特定します。

下図のような状態にします。

![Step1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55718/970d3388-5182-2a1f-7840-596e0ac1995a.png)

実際に行うのは、以下の内容になります。

1. `Production` AWSアカウントで、S3へのアクセスを許可するポリシーを作成する。
2. `Production` AWSアカウントで、`Development` AWSアカウントと信頼関係を結び、上のポリシーを適用したロールを作成する。

# ステップ 2 - ロールへのアクセスを許可する

「[ステップ 2 - ロールへのアクセスを許可する](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/tutorial_cross-account-with-roles.html#tutorial_cross-account-with-roles-2)]」は次のように説明されています。

> チュートリアルのこのステップでは、IAM グループポリシーを変更して、テスターが UpdateApp ロールへのアクセスを拒否されるようにします。このシナリオではテスターに PowerUser アクセス許可があるため、ロールの使用を明示的に拒否する必要があります。

下図のような状態にします。

![Step2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55718/8b727403-2e6f-2857-fe75-85a10b1a598b.png)

実際に行うのは、以下の内容になります。

1. `Development` AWSアカウントで、開発者グループにロールの切替えを許可するインラインポリシーを作成する。
2. `Development` AWSアカウントで、テスターグループにロールの切替えを禁止するインラインポリシーを作成する。

# ステップ 3 - ロールを切り換えてアクセスをテストする

「[ステップ 3 - ロールを切り換えてアクセスをテストする](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/tutorial_cross-account-with-roles.html#tutorial_cross-account-with-roles-3)」は次のように説明されています。

> 最後に、開発者として、UpdateApp ロールを使用して Production アカウントの productionapp バケットを更新します。AWS コンソール、AWS CLI、API を使用してロールにアクセスする方法について説明します。

下図のような状態にします。

![Step3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55718/c4428782-4dbd-7c78-a802-32f93a40df5d.png)

実際に行うのは、以下の内容になります。

1. `Development` AWSアカウントに開発者グループのユーザーでログインする。
2. 「ロールの切替え」で`Production` AWSアカウントの`UpdateApp`ロールに切り替える。
3. S3バケットにアクセスできることを確認する。

# 以降のステップ

以降は、以下のような内容になっています。

* ロールの切り替え (AWS CLI)
* AssumeRole (AWS API) の使用

特に設定等はなく、操作方法の説明です。これで、このチュートリアルは終わりになります。
【React+Redux:reducer, state】reducerを追加したのに該当のstateが定義されない時は、combineReducerを確認する

# reducer追加時はcombineReducerの確認を
reducerがstateごとに分かれているファイル構成で新しいreducerを追加した時、
該当のreducerで定義したstateが反映されないな、と思っていたところ、
[combineReducer](https://redux.js.org/api/combinereducers)に追加したreducerを定義していませんでした。:frowning2:

```react:reducers/index.js
  import { combineReducers } from 'redux'

  export default combineReducers({
    oldReducer,
    newReducer // この定義が抜けていました
  })
```

初歩的なミスでお恥ずかしいのですが、困ったのでメモしておきます。


### 参照URL
・上記「combineReducer」のリンク（公式）
https://redux.js.org/api/combinereducers
Node.jsで指定したファイルやフォルダをZIP圧縮する方法

毎回決まった手順でZIP圧縮するのは大変ですね！
Node.jsで自動でZIP圧縮するコードを書いたのでソースコードを載せます。圧縮には`archiver`というライブラリを使います。
`archive.glob`の引数を変えると任意のファイルを圧縮対象にすることが出来ます。
`(xxxx/**/*)`はサブフォルダ以下すべてのファイルを対象にするという意味になります。
ZIP圧縮作業を自動化したいときに使えますよ！

``` javascript
var archiver = require('archiver');
var fs = require('fs');

function zipFiles() {

    // 出力先のzipファイル名
    var zip_file_name = "src.zip";

    // ストリームを生成して、archiverと紐付ける
    var archive = archiver.create('zip', {});
    var output = fs.createWriteStream(zip_file_name);
    archive.pipe(output);

    // 圧縮対象のファイル及びフォルダ
    archive.glob('*.js');
    archive.glob('*.css');
    archive.glob('*.ico');
    archive.glob('*.html');
    archive.glob('package.json');
    archive.glob('css/**/*');
    archive.glob('fonts/**/*');
    archive.glob('images/**/*');

    // zip圧縮実行
    archive.finalize();
    output.on("close", function () {
        // zip圧縮完了すると発火する
        var archive_size = archive.pointer();
        console.log(`complete! total size : ${archive_size} bytes`);
    });
}
```

以上です。試してみてくださいね！


エンジニアに役立つ情報をTwitterでも発信していますので宜しければTwitterの方もフォローをよろしくお願いします！
[Twitterへのリンクはコチラ](https://twitter.com/mr_t_free)