OmniAICreator/Qiita-1.07M huggingface dataset:
sourceコマンドを誤って使ってしまいゾッとした話

**注意：絶対にこちらに書いてある内容を実施しないでください。何かあっても一切の責任は負いかねます。**

暑いんでゾッとする話をします

## 事の顛末

`.zshrc` をちょっといじって、変更をターミナルに反映させるために 

```
source ~/.zshrc
```

とするところをミスって

```
source ~/.zsh_history
```

ってやってしまった。

ぎゃぁぁあああああああーーーーーーーー！！！！！！！！

と叫んでも遅し、、、処理が走ってしまい止められなくなってしまいました。

処理の途中に

```
.ssh/id_rsa already exists.
Overwrite (y/n)? y　
```

「公開鍵を上書きするかどうか？」とか出てきて、 `n` として回避した後、今は無くなっているレポジトリから `git clone` しようとしたところで、アカウント確認のために処理が止まり、そこで、 `Ctrl + c` で強制終了できました。


## 解説

`source` コマンドは、ファイルに書かれたコマンドを現在のシェルで実行するコマンドです

よって、私がミスして実行してしまった処理の内容は、 `.zsh_history` にファイルに書かれたコマンドが1行ずつ実行する。という内容になります。

`.zsh_history` には私が過去に打ったコマンドがすべて記録されているため、つまり、それらのコマンドが順に実行されていくということになってしまいます。

処理の途中で「公開鍵を上書きするかどうか？」を聞かれたのは、過去に公開鍵を作成するコマンドを実行し、それが `.zsh_history` に記載されていたためです。


## 対応

- `.zsh_history` に記載されているコマンドを上から強制終了できたところまで確認し、そのコマンドが重複実行や再実行した内容を検証しました→特に問題ありませんでした。
- `.zsh_history` から、誤って実行した履歴を削除しました。



## まとめ

さいわい、1年前に端末を仕立てたときのコマンドが中心だったため、現在や過去の作業に影響はありませんでした。

でも、本番環境へのデプロイ作業もやったことがあるので、`.zsh_history` には `docker` のコマンドとか入っていたわけです。これで本番環境にもしものことがあったら。。。ゾッ
pandasデータを結合する方法

# 二つの pandas データを結合する方法について調査、実践する。

参考URL
http://sinhrks.hatenablog.com/entry/2015/01/28/073327
https://qiita.com/hikaru_/items/e9c1356f674f2baa9e64

### とりあえず最初に見つけた concat を使用して実施。
X2 > (150, 4)
y  > (150, 1)のpandasデータを使用
```pd.concat([X2, y])
```
としたらエラーが発生した。。＾＾；

参考しているURLをもっと読み込んで見ると axis の話が出てきた。
```pd.concat([X2, y], axis=1, join='inner')
```

としたら無事に結合が出来た！٩( ᐛ )و

今の時点では良くわかってないが覚書として、、
axis = 軸て意味
join = inner は共通のラベルのみを残して連結する場合に使用するとの事。
今回は不要なようなので下記で十分な様子。

```pd.concat([X2, y], axis=1)
```
C++でQRコードのような物を生成する

# はじめに

CTFの問題を解いている時に，暗号からQRコードを生成する必要があり，
C++でQRコードのようなものを生成するにはどうすればいいか困ったのでメモ．

# 解決法
友人のえびちゃん(@rsk0315_h4x )に解決法を教えていただきました（感謝）
黒の部分を`"\x1b[0m  "`，白の部分を`"\x1b[47m  \x1b[0m"`とするとよい．

# コード

```.cpp
//aは縦h, 横wのQRコードの状態を表す配列
//1の時は黒，0の時は白
for(int i = 0; i < h; ++i){
  for(int j = 0; j < w; ++j){
    if(a[i][j] == 1){
      cout << "\x1b[0m  ";
    }else{
      cout << "\x1b[47m  \x1b[0m";
    }
  }
  cout << "\n";
}
```

# おわりに
読み取るだけのQRコードを生成する場合はこれでいいかなぁと思います．（私は読み取れたのでこれでいいかなぁと思います）
【WordPress】Call to undefined function boolvalというエラーの対処法【PHP】

WordPress で、「`Call to undefined function boolval` というエラーが出て画面が真っ白になる」という相談を受けたので、対応方法を書いておきます。


# 注意

この記事で紹介しているのは、**「臭いものに蓋をする」だけの、その場しのぎの対応方法**です。

根本的に解決するには、PHP のバージョンを 5.5 以上にしてください。**推奨環境は 7.3 以上**です。

2019 年にもなってこんなエラーが出てしまう、古いバージョンの PHP が動いているサーバーを使っている方は、**サーバーの乗り換えを強くオススメします。**

--------------------------------------------------------------------------------

## 原因

`boolval()` という関数は、PHP5.5 から実装されましたので、根本的な原因は、PHP のバージョンが 5.5 未満という点にあります。

なお、私が相談を受けたケースでは、定番プラグイン「[All in One SEO Pack](https://ja.wordpress.org/plugins/all-in-one-seo-pack/)」のバージョン 3.2 で `boolval()` が使われていました。

--------------------------------------------------------------------------------

### 自己解決できるようになろう！

All in One SEO Pack 3.2 の紹介ページでは

> PHP バージョン: 5.2.4 またはそれ以上

と書かれていますが、実際には PHP5.2.4 では動かない筈です(笑)

**このような事は WordPress では頻繁にあります**ので、「画面が真っ白になって訳が分からない」ではダメです。

- [【PHP】初心者がまずやるべき設定（エラー設定）](https://qiita.com/fallout/items/31f793708b243033fab1)

を参考に、エラーをしっかり確認できるよう PHP 周りの設定を見直し、自己解決できるようになりましょう！

--------------------------------------------------------------------------------

## 解決方法

以下のコードを、**WordPress の自動更新対象外のファイル**にコピペしてください。

```php
if (!function_exists('boolval')) {
    function boolval($v) {
        return (bool) $v;
    }
}
```

私の場合、~~こんな案件に 3 分以上かけたくないので~~、`wp-config.php` に書いておきました。より適切なファイルがある場合は、コメントで教えていただけると幸いです。
Swiftのデリゲートについて

##Delegateとは？
Delegate(デリゲート）とは、日本語訳で代理人や委譲という意味を持ちます。
このデリゲートは「あるクラスは他のクラスのインスタンスに処理を任せる（委譲・依頼）」というデザインパターン（処理の流れ）をプロトコルを用いることで実現できるというものです。

##メリットは？
#####移譲先を意識する必要がない
まず最初に処理を任せるクラスは、どのクラスがどのような処理をするのかとういう事を意識しなくてよくなります。
#####再利用ができる
プロトコルや処理を任せるクラスは変更せずに、処理を行うクラスだけ変更すれば処理内容は変わるので、プロトコルや処理を任せるクラスは再利用することが可能になります。

メリットは上記のようになりますが、メリットを聞いてもピンと来ないと思うので、ソースコードを読み解きながら理解していきましょう！

##サンプルコード

```
//プロトコルを定義
protocol Select {
　//処理内容のないメソッドを定義
  func chooseWeapon()
}

class Master {
  //Select型の変数delegateを宣言
  var delegate: Select!
　
  func say() {
    print("お客さん、何をお求めですか？？")
      //変数delegateのchooseWeaponメソッドを指定
      delegate.chooseWeapon()
    }
}

//Selectプロトコルを適合したHero1クラスを定義
class Hero1: Select {
　//Selectプロトコルで定義したメソッドの処理内容を指定。
  func chooseWeapon() {
    print("龍鱗の鎧をください")
  }
}

//Selectプロトコルを適合したHero1クラスを定義
class Hero2: Select {
 func chooseWeapon() {
　　//Selectプロトコルで定義したメソッドの処理内容を指定。
   print("ユニコーンのランスをください")
 }
}

//定数MasterOriginalにMasterクラスを代入
let MasterOriginal = Master()
//定数Hero1OriginalにHero1クラスを代入
let Hero1Original = Hero1()
//MasterOriginalの変数delegateにHero1を代入
MasterOriginal.delegate = Hero1Original
//MasterOriginalのsayメソッドを実行
MasterOriginal.say() 

```

```
//実行結果
お客さん、何をお求めですか？？
龍鱗の鎧をください
```

##解説

```
//プロトコルを定義
protocol Select {
　//処理内容のないメソッドを定義
  func chooseWeapon()
}
```
まず最初にSelectプロトコルを定義します。このプロトコルをクラスなどに適合することで、プロトコル内のプロパティやメソッドが適合されたクラスでも使えるようになります。

```
class Master {
  //Select型の変数delegateを宣言
  var delegate: Select!
　
  func say() {
    print("お客さん、何をお求めですか？？")
      //変数delegateのchooseWeaponメソッドを指定
      delegate.chooseWeapon()
    }
}
```
次にMasterクラスを定義します。この中では変数delegateをSelect型として宣言しており、定義したプロトコルは型としての利用も可能です。これでdelegateに対してメソッドやプロパティを指定することで、プロトコル内のメソッドやプロパティを使うことができます。
そして次は、sayメソッドを定義します。処理内容としてdelegate.chooseWeapon()をさしているので、プロトコル内のメソッドを実行しています。しかし現時点では、処理内容が記述されていないので何も起こりません。

```
//Selectプロトコルを適合したHero1クラスを定義
class Hero1: Select {
　//Selectプロトコルで定義したメソッドの処理内容を指定。
  func chooseWeapon() {
    print("龍鱗の鎧をください")
  }
}

//Selectプロトコルを適合したHero1クラスを定義
class Hero2: Select {
 func chooseWeapon() {
　　//Selectプロトコルで定義したメソッドの処理内容を指定。
   print("ユニコーンのランスをください")
 }
}
```
次はSelectプロトコルを適合したHero1とHero2クラスを定義します。これらのクラス内では、プロトコル内で定義のみされていたchooseWeaponメソッドの処理内容が記述されています。これでクラスごとに処理内容の違う同名のメソッドを実行する準備が整いました。

```
//定数MasterOriginalにMasterクラスを代入
let MasterOriginal = Master()

//定数Hero1OriginalにHero1クラスを代入
let Hero1Original = Hero1()

//MasterOriginalの変数delegateにHero1を代入
MasterOriginal.delegate = Hero1Original

//MasterOriginalのsayメソッドを実行
MasterOriginal.say() 
```
次に定数MasterOriginalにMasterクラスを代入し、インスタンス化します。
そしてHero1Originalにも同じようにクラスを代入し、インスタンス化します。
次にMasterOriginalのdelegateにHero1Originalを代入し、sayメソッド内のdelegate.chooseWeapon()をHero1のメソッドに変更します。
最後にMasterOriginalのsayメソッドを実行します。

```
//実行結果
お客さん、何をお求めですか？？
龍鱗の鎧をください
```
結果として上記のように出力されます。
TypeScriptのReadonly型の挙動

# Readonlyにするいろんな方法

## ① readonlyプロパティ (特定プロパティのみreadonlyにする

```typescript
type State = {
    // 読み込み専用
    readonly id: number
    name: string
}

const state:State = {
    id: 22,
    name: 'success'
}

state.name = 'bbb' // OK
state.id = 11 // コンパイルエラー
```


## ② Readonly型 (全プロパティreadonly)

```typescript
type User = {
    id: number,
    name: string
}

// 全プロパティがreadonlyになる
const user: Readonly<User> = {
    id: 34,
    name: 'Yorinton'
}

user.id = 22 // コンパイルエラー
user.name = 'kentaro' // コンパイルエラー
```


## ③ Object.freeze
```typescript
type Person = {
    id: number
    name: string
}

let person: Person = {
    id: 99,
    name: 'BigMam'
}

// person2はReadonly型になる
let person2 = Object.freeze(person)

person2.id = 22 // コンパイルエラー
person2.name = 'bbb' // コンパイルエラー

// personの方を書き換えてみる
person.id = 22 // コンパイルOK
person.name = 'bbb' // コンパイルOK

// コンパイルは通るが、personのプロパティの値は書き換わらない
console.log(person) // { id: 99, name: 'BigMam' }
console.log(person2) // { id: 99, name: 'BigMam' }
```
[編集中]Chrome拡張機能を作ってみた。（AmazonSeller Filter)

とりあえず公開中.。o○


### 参考URL
ChromeExtension: <a href="https://chrome.google.com/webstore/detail/amazonseller-filter/apmbaomfhdbgpadahpbafpjgbhhcdege?hl=ja">AmazonSeller Filter</a>
Source: <a href="https://github.com/quikky/chrome-extension-amazon_seller-filter">chrome-extension-amazon_seller-filter</a>
【Git】マージコミットのログを残さない方法

#TL;DR
一度もpushしていないブランチの場合、rebaseを使う。
push済みブランチの場合、merge —-squashを使う。


#はじめに
GitHub Flowで開発中、自分の作業topicブランチに対して、他の人の作業内容をmasterからマージするとき、`git merge master`を使うとマージコミットログが残る。

その後、プルリクエストのコミットログにmasterから作業topicブランチへのマージコミットログが残ってしまう問題がある。

マージコミットログは「作業ログ」であって、masterへのコミットログに含めるのは不自然な気もするので、対策を考える。


# rebase
masterからマージするときに、`git rebase master`を使う。

ただし、一度もpushしていないブランチに限る。理由はこちら

[Git rebaseの影響で同内容のコミットが量産される件について](https://qiita.com/takasek/items/433931ca5e9b70edbb64)

「pushはプルリクエスト直前に1回のみ」という前提で採用できる。

コンフリクトが発生する場合は、作業topicブランチにコミット毎に解消する必要がある。
開発人数が多いと、コンフリクトが発生する可能性が高くなるため、別の手段を検討したほうがよい。


# merge --squash
複数のコミットを1つのコミットに集約するコマンド。
使い方としては、
1. masterから作業topicブランチへのマージは`git merge master`を使う
2. pushも可能
3. masterへのプルリクエスト時、masterから新たにプルリクエスト用ブランチを作成し、作業topicブランチのコミット内容を`git merge --squash 作業topicブランチ`でマージする

こうすることで、masterから作業topicブランチへのマージコミットログは消え、プルリクエスト用ブランチにはコミットログが1つだけ残る。

ローカルでの作業topicブランチへのコミットログも消えてしまうため、細かい単位でmasterへマージしたい場合は、その都度プルリクエスト用ブランチの作成→マージを繰り返すので、ちと面倒くさい。


# rebase + push -f
「push済みのブランチではrebaseしてはいけない」という制限事項は、正確にはrebaseはできるが、リモートへのpush時にエラーとなることに起因する。(rebaseするとハッシュ値が変わるため)

そのため、-fオプションを使えばpush済みブランチであっても、rebase可能となる。

しかし、-fオプションを使うと、リモートの内容を強制的にローカルで書き換えるため、そのブランチで他の人がコミットしていた内容が消えてしまうリスクがある。

[なぜrebase後に強制プッシュをする必要があるのか](https://qiita.com/hitochan777/items/ea08df354b42be57e5fc)


言い換えると、自分しか使っていないことが保証できるブランチであれば、問題ない。


# 参考
[git rebase に関するメモ](https://clown.hatenablog.jp/entry/20130426/git_rebase)
[こわくないGit](https://www.slideshare.net/kotas/git-15276118)
[慣れてきたらコミットをまとめてPull Requestしよう（git merge --squash）](https://www.granfairs.com/blog/cto/git-merge-squash)
Qiitaを流し読みするためのPWAを作ってみた

## 前提
* 知識や技術としては下記の形です。デザインを10とした時の自己判断の値です。
    * デザイン:10 > フロントコーディング:6 > サーバーサイド:1 > インフラ:0
* VueやNuxtの学習を兼ねてなにか作りたい
* サーバーサイドも少し触ってみたい

### なにを題材にしようか？
* フロントがメインなのでなにかAPIを使ったものが良いのでは
* QiitaとかAPIがあって良さそう

### どう作ろうか？
* 個人的にQiitaは興味のある読み物が沢山あるけど、基本的に記事へは検索からしか行かない。
* ランキングやタグを”わざわざ”掘って記事を読むほどのモチベーションは無い。
* キュレーションメディアの様に記事をピック&プッシュしてくれると嬉しい

## 自分に出来ることで整理
* Qiita APIを確認
* フォローしているタグの最新記事を「検索」出来ることを確認
* Vueを触っていたので、Nuxtで作ることに
* ログインとか追加機能（後ほど）をFirebaseで作成

**さらっとリストで書いてますが、作りながら考えていました。**
上記をモックなどを作りながら進めました。
### 基本機能
* メインはフォロータグのリスト表示
* リストから詳細記事
* それ以外はいいねやプロフィールなど必要最低限のページを作る

#### 追加機能
__Qiitaに無い機能として「あとで読む」を追加__
基本機能がリスト表示なので、気になる記事が沢山目に付きます。また、記事を読んでいるとそこから別の記事に行くことがよくあります。あるいは知らなかった技術・サービスのタグを辿ったり。ただ、そうすると先程見た「気になるタイトルの記事」がなんだったか忘れたり、その記事を探すのが手間だったり。
そのような事を解決する方法として「**あとで読む**」機能を追加しました。


# 出来たもの
Qiitaビュワーなので「Viiwer」
* https://viiwer-eb350.web.app

### 概要
* Qiitaアカウントでのログイン
* フォローしているタグの最新記事をリストで表示
* 記事の詳細をマークダウンで読む
* 記事を「あとで読む」機能
* 記事のいいね＆ストックなど、QiitaAPIで可能な機能やページ

#### 無い機能
* コメントの読み書き
    * APIからの取得が古いものから取得など、満足な形に出来そうになかったのでドロップ。
* 各種検索
    * このサービスがそもそもタグの検索に機能を絞っているのでシンプルにしました

## 特徴

* **新しい記事を流し見**
    * ログインしたQiitaアカウントがフォローしているタグから20個を選択し、そのタグがついた記事を時系列で表示します。
* **一覧から気になる記事を「あとで読む」**
    * 記事のリストから「ブックマーク」アイコンであとで読むに追加
    * 各記事をの最下部にはあとで読むリストがあるので、あとで読むに気になる記事を入れて置けばスイスイ読み進めることが出来ます。

## 使い方
Genymotionでのキャプチャでお届けします。

#### Qiita連携
[https://viiwer-eb350.web.app](https://viiwer-eb350.web.app) にアクセス。
アクセスするとQiitaとの連携をリクエストされますので、連携をしてください。
PWA対応なので、アプリのように使うときはホームスクリーンに追加してから連携した方が１手間省けます！
<a href="https://gyazo.com/5be200052d0d445b5f694700f1d1fdc1"><img src="https://i.gyazo.com/5be200052d0d445b5f694700f1d1fdc1.png" alt="Image from Gyazo" width="450"/></a>

#### ホーム画面
何も設定していない状態では、最近の記事が作成日時順に表示されます。
フォローしているタグから、リスト表示したいタグを設定してください。
<a href="https://gyazo.com/2c18b8eb3c66e09cd15154236fb7d0db"><img src="https://i.gyazo.com/2c18b8eb3c66e09cd15154236fb7d0db.png" alt="Image from Gyazo" width="450"/></a>
設定は下部のユーザーアイコン（右から３つ目）をクリック後、設定をタップしてください。
APIの制限で20個まで設定出来ます。
<a href="https://gyazo.com/500c0cb4aae694f842298d9f06be4ec2"><img src="https://i.gyazo.com/500c0cb4aae694f842298d9f06be4ec2.png" alt="Image from Gyazo" width="450"/></a>

#### あとで読む
追加機能の「あとで読む」は、リストからブックマークアイコンをタップすると右下のブックマークにストックされます。
<a href="https://gyazo.com/2d2917a1f9e85af4a935e3da5ab7ca70"><img src="https://i.gyazo.com/2d2917a1f9e85af4a935e3da5ab7ca70.png" alt="Image from Gyazo" width="450"/></a>
また、続けて読めるように書く記事の下部にはストックしている「あとで読む」がリスト化されています。
<a href="https://gyazo.com/f6981b1ccc3375508bf2cda9f2233ec2"><img src="https://i.gyazo.com/f6981b1ccc3375508bf2cda9f2233ec2.png" alt="Image from Gyazo" width="450"/></a>
#### 隠し機能
一応ホームのリストページで上部のロゴをタップするとQiitaの記事ランキングが見れます。なぜ隠しなのかと言うと、APIでは取得出来ないのでQiitaのページをクロールしている為です。一応正規のアプローチでは無いので、微妙に隠しています。
## まとめ と 注意
最初にも書きましたが、フロント寄りの技術力ですので、セキュリティやAPIとのやりとりなど足らない部分があることをご了承ください。また、手元にiPhoneのみですので、期待した動作にならない場合もあるかと思います。
ですが、もしよろしければ一度触っていただけると嬉しいです。
どうぞよろしくお願いします。
Railsで画面を表示すると表記が変わる現象

最近Railsを勉強し始めて、初めてアプリ開発をしています。

その中で謎の現象が起こったのでメモしておきます。

#Version
ruby '2.5.3'
rails '5.2.3'

# 概要

「名言表示アプリ」を作っていて、DBに登録されている名言をランダムに表示するものです。

そこで起きた謎の現象がこちら⬇️

あるページに飛ぶ → 文章が表示される → 0.3秒後くらいにその文章が変わる

ホラーです:scream:


画像で確認してみましょう

ホームボタンを押して画面を表示すると、
<img width="300" alt="スクリーンショット 2019-08-02 12.14.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360790/b7b2c954-e939-9d9e-73df-da8d0dac6dd8.png">

と表示されて、すぐに
<img width="300" alt="スクリーンショット 2019-08-02 12.29.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360790/4f9c799b-b761-af75-e3ef-8f09505811d0.png">
と変わってしまいます。

なぜだろうと思って、デベロッパーツールを確認してみると、

一瞬だけ、
<img width="604" alt="スクリーンショット 2019-08-02 12.33.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360790/3367b88f-1e30-65c7-a04e-5e38d033f533.png">
「data-turbolinks-preview」と出てきます。

どうやらRailsには「turbolinks」という機能があるようです。

簡単に説明すると、
turbolinksとはAjaxによるページ遷移の高速化のためのライブラリであり、
`<a>`タグを監視していて、リンクが押されたらキャッシュをbodyに表示させておいて、
その間にAjaxで情報を取得して、現在の画面と置き換えているようです。

つまり、
はじめにキャッシュが表示されて、後から最新の情報に置き換えられているから表示が変わるんですね。

# 解決

①特定のリンクでturbolinksが機能しないようにする方法
直接`<a>`タグに記述

```sample.html.erb
<a href="/" data-turbolinks="false">HOME</a>
```

または
親要素に記述

```sample.html.erb
<div data-turbolinks="false">
  ・・・
</div>
```

②アプリケーション全体でturbolinksが機能しないようにする方法
application.jsの「//= require turbolinks」の「=」を削除すると機能しなくなります

```application.js
// require turbolinks
```

DBで頻繁に表示が変わる場合のみこの現象が起こると思うので私は①で解決しました。

以上！！

# 参考
・[turbolinksチートシート](https://qiita.com/morrr/items/54f4be21032a45fd4fe9)
・[Rails5でturbolinksをオフにする時に気をつけること](https://kansiho.hatenablog.com/entry/2017/08/08/Rails5%E3%81%A7turbolinks%E3%82%92%E3%82%AA%E3%83%95%E3%81%AB%E3%81%99%E3%82%8B%E6%99%82%E3%81%AB%E6%B0%97%E3%82%92%E3%81%A4%E3%81%91%E3%82%8B%E3%81%93%E3%81%A8)
10進数を2進数にして順番をつける

## やりたいこと
10進数を2進数にして順番をつけて区別したい:boy:
例えば77であれば

|    7    |    6    |    5    | 4|3|2|1|
|:-------:|:-------:|:-------:|:------:|:-:|:-:|:-:|
|    1     |     0    |     0    |1|1|0|1|

のように77の2進数1001101に順番を小さい桁から1、2、3、4、5、6、7と順番をつけて、決められた入力に対応する2進数の数を出力したい。下記に入力例と出力例を示している。

入力値の一行目の1文字目は後に確かめる桁の数を意味する。
例えば下記の入力例で言えば3だが、それは二行目以降3回確かめるべき桁数があるという意味である。

一行目の次の77は2進数に変えるべき数字
二行目以降は確かめるべき桁の数字

入力値 例
3 77
2
5
1

出力値　例
0
0
1

## アルゴリズム例

### ① 2進数を配列にしてそれを反転しインデックスを合わせる
まず77を2進数にして一つずつバラバラにして配列を作る。
その後できた配列を逆順にして新しい配列を作る。
逆順に並んだ配列と入力値-1(インデックスが0始まりになっているため)を組み合わせて
出力

### ② 指定の桁まで0埋めし、ビット同士比較する 
@htsign さんありがとうございます:relaxed:

例えば番号2に対応する2進数の数字を求められたときビットを右にずらし、
該当の桁が一番右に来るようにする。それを1(000001)と&演算子で比較し該当数字も1のとき1となり、それ以外のとき0となるので結果をそのまま出力する。

## Javascript　コード例

### ①のアルゴリズム(配列を反転しインデックスを合わせる)
```js

process.stdin.resume();
process.stdin.setEncoding('utf8');

var lines = [];
var reader = require('readline').createInterface({
  input: process.stdin,
  output: process.stdout
});

reader.on('line', (line) => {
  lines.push(line);
});
// ここから主な処理
reader.on('close', () => {
  // 最初の一行目を取得
  var firstLine = lines[0].split(" ");
  
  // 2進数にする10進数を取得今回の例では77にあたる
  number = parseInt(firstLine[1]);
  
  // 上記の例では77を2進数にする
  binary = number.toString(2);
   
  // 2進数を1つずつ配列にする
  reverse = binary.split("");
  
  var count = 0;
  
  // 最終的に使用する配列
  collect_array = [];
  // 先ほどの配列を逆順にする(インデックス通りにし、あとで使いやすくするため)
  for (var i = reverse.length -1; i >= 0 ; i--) {
      collect_array[count] = reverse[i];
      count++;
  }
  // 何行問われているのかを取得
  var N = firstLine[0];
  for(var f = 0; f < N; f++) {
    // 逆順にした配列のインデックスは合っているのでそのまま出力
    var line = lines[f+1];
    output_number = collect_array[line - 1];
    console.log(output_number);
    
  }
});

```

### ②のアルゴリズム(0埋めしビット同士比較する) 
@htsign さんにご指摘いただいたコードがコメント欄にあります。(動作確認済み)

##最後に
問題自体は簡単なのですが、もっと早くて効率の良いアルゴリズムがあるよという方
ぜひコメントで教えてください。
RxSwiftで、2回に1回イベントを流すObservableを作ってみた

２番煎じかもしれませんが、ざっと探したら見つからなかったので。
他にあれば教えて下さい（笑い


##実装方針
- scanを使って、Bool値をtrue -> false -> true -> falseのように都度切り替えて流す
- そのBool値をつかって、filterする

```swift
let intSubject = PublishSubject<Int>()
let subject =
    intSubject
        .scan((true, 0)) { (output, update) -> (Bool, Int) in
            //Bool値を反転して返してあげると、ストリームの度に値が変わることになる
            //初期値はtrueを反転するのでfalseから始まる。結果として奇数回を飛ばすことになる
            return (!output.0, update)
        }
        .compactMap { (flag, value) -> Int? in
            flag ? value : nil
        }
subject.bind { print($0) }

intSubject.onNext(1)
intSubject.onNext(2)
intSubject.onNext(3)
intSubject.onNext(4)
intSubject.onNext(5)
intSubject.onNext(6)
```

```
//結果
2
4
6
```
compactMap使ってますので、流す型がInt? だとおかしくなりますね。素直に filterとmapで書いたほうが良さそうです。あとはscanの初期値として渡している 0 も型を特定する以上の役割がないので要らないかなぁ

##汎用化してみました
extension をつかって、Observableの関数化してみます。

```swift
extension Observable {
    //isEvenは偶数回だけイベントを流すか、奇数回だけにするかを決定するフラグ
    func onceInTwice(isEven: Bool) -> Observable<Element> {
        let initial: (Bool,[Element]) = (isEven, [])
        return
            scan(initial) { (output, update) -> (Bool, [Element]) in
                return (!output.0, [update])
            }
            .filter { (flag, _) in return flag }
            .map { (_, value)  in return value.first! }
    }
}

let input = PublishSubject<String?>()
let onceInTwice = input.onceInTwice(isEven: false)

onceInTwice.bind { print($0) }

input.onNext("1回目")
input.onNext("2回目")
input.onNext(nil)
input.onNext("4回目")
input.onNext("5回目")
input.onNext("6回目")

```

```
//結果
Optional("1回目")
nil
Optional("5回目")
```

期待どおりに動いてくれてそうです〜。
最終利用者(end user)のこと。仮説（134）

自分が計算機で仕事をするようになった時は、計算機（IT）業界ではない。
計算機（IT）業界からすると、最終利用者（end user)だった。

その後、計算機（IT)業界を関連の仕事に変わった。

# 最終利用者(end user)について
自分が関わってきた系(system)の最終利用者(end user)は次(next)のような方々です。

* 工場に出入りする方, 
* 商業（金融含む）・官庁の顧客, 
家電利用者 
* 当該分野の業界用語を使う確率が高い
* 年齢層は10〜90歳台まで幅広い
* 60歳台-70歳台の方が設計したものを、若い人が設計思想を理解せずに使っている
* 10最大-20最大の若い世代の方が設計したものの中で、高齢者障害者設計指針に沿っていないものは、高齢者の方が使いづらく使われていない

# 該当する業界用語と、該当する業界系用語との違いを確認する

在庫管理といっても、１Kg未満の細かい部品を管理する在庫管理と、10Kg以上のフォークリフトかを使わない
最後までおよみいただきありがとうございました。

いいね　💚、フォローをお願いします。

Thank you very much for reading to the last sentence.

Please press the like icon 💚　and follow me for your happy life.
アプリケーション名に日本語を設定した際のビルドエラーについて

Monaca プロジェクトのアプリ設定画面にある `アプリケーション名` に日本語を設定すると、ビルドが失敗するケースがあります。

アプリケーション名に日本語を設定した場合、iOS では以下のようなエラーが出力されるケースがあります。

```text:例
ld: framework not found Pods_____
clang: error: linker command failed with exit code 1 (use -v to see invocation)
```

Monaca プロジェクトの `アプリケーション名` は、ビルドの際にファイル名やフォルダー名に使用されます。

上の例は、Monaca プロジェクトで使用しているサードパーティー製 Cordova プラグインで CocoaPods が使用されている場合に、Xcode で提供されているコマンドラインツールが、日本語のファイル名やフォルダー名を正しく処理できないために発生している例になります。

# アプリケーション名と表示名を分ける

上の例のような場合には、Monaca プロジェクトのアプリ設定画面にあるアプリケーション名には、日本語ではなく `アルファベット` のアプリケーション名を設定する必要があります。

アルファベットのアプケーション名を設定した場合、モバイル端末にアプリをインストールした際の表示名もアルファベットになってしまうため、表示名は別に設定する必要があります。

## 表示名を日本語にする

アプリケーション名をアルファベットで設定し、表示名を日本語にする場合は、config.xml に設定を追加する必要があります。

Monaca プロジェクトのアプリ設定画面にあるアプリケーション名は、config.xml の `name` タグの値として設定されます。

アプリケーション名と表示名を分ける場合は、この `name` タグに `short` 属性を追加します。

```xml:config.xml
<name short="日本語のアプリ名">Minimum Template</name>
```

このように設定することで、

  - アプリケーション名: `Minimum Template`
  - 表示名: `日本語のアプリ名`

に設定することができます。


# おわりに

Monaca プロジェクトのアプリ設定画面にある `アプリケーション名` に日本語を設定した際に、ビルドエラーになる場合は、アプリケーション名をアルファベットに変更して、config.xml の `name` タグに `short` 属性を追加してビルドを試してみてください。
大量のメールを一括削除する pop3s(pop over ssl)版

## まえおき
うわ、私のメール、サーバーに溜まりすぎ？！
10000件ずつとかゴリっと削除したい人向け
over TLS/SSL流行ってるのでopensslも覚えた方がいろんな人と会話できるゾ！（虚無）

unix系環境(linux,mac)でopensslコマンドがあればOK。インストールなどは環境毎に異なるので調べてください。
（※windows系だとコマンドが認識されない事があるので注意。）

## やり方

**コマンドを実行**

```
openssl s_client -connect 【popサーバー名】:995
```

何やらゴニョゴニョ言われるが、最後に「+OK」 と返ってくればOK
続けて・・・（ログイン）

```
USER aaaa
PASS ****
```

aaaaはユーザーID,****はパスワード
１行ずつ「+OK」 と返ってくればOK
続けて・・・（メッセージ削除）

```
DELE 1
DELE 2
DELE 3
...
...
...
QUIT
```

DELE の後の数字は、「n件目のメールを削除して」という事。固有のIDではない。QUITで確定＆終了。

↓　こういったのを使って
[10000件のDELEをコピーするコマンド](https://rawseq.github.io/grepreptips/#N4IgtgpmIFygDLEBGeb6De5QdgwBECiAMnoEkMgzQyArDID8MgmgyDRDIBEMgQAyCq8oEEMgH2aDSDIFoMg1gyAwDIAA5QDdGgM8VAYC6BvhgqVAsAzFAPUaB1BkBmDIFsGADoA7AHoA6AFQASPaYB82jdtN6Lum2eQBaVOm0AHAE4B7AMYB9ABMIAGcIAHNILQAXAENogEtvLQAKAEoAbm19c3wiAAJsvLx8k3MARQBVAEkAFSstEABfABoQLz9kgBsAT1hozwBXCCagAA$)
テキストからターミナルに一気に張り付ければ処理してもらえるはず。

「このメールは除外」となると、もっとPOPさんとおしゃべりできるようにならないといけないです。

## 参考

- https://qiita.com/rinopo/items/a7db604d99608f2e123b
AWS DeepRacerリアル走行の軌跡を描画してモデル分析結果と比較してみた

# はじめに
AWS Tokyo Summitの後にAWS DeepRacerサービスチームの[@sunil mallya](https://twitter.com/sunilmallya)氏から以下のようなアドバイスをもらったので、リアル走行の軌跡のプロット、得られた結果とモデルの分析結果を比較してみました。

> I think you should also add the videos for the laps on the real track. And then create a manual sketch plot based on the car's trajectory. This way you can compare the simulator and real car trajectories.

# 利用した動画（About Sola@DNP’s video）

- AWS Tokyo Summit で撮影したSola@DNPが優勝したときの動画です
- 動画の記録時間は4分間です
- その一部は[AWS Machine Learning Blog](https://aws.amazon.com/jp/blogs/machine-learning/another-triple-for-the-deepracer-league-brings-more-world-records-and-the-first-female-winner/)に紹介されています


# 軌跡の描画方法（How to sketch plot）
動画から走行軌跡をプロット化するにあたり、いろいろな手法を考え試しましたが、
**動画を何度も繰り返し再生し、reInventコースを印刷した紙に鉛筆で点を描画、その後蛍光マーカーで強調する。**
という方法にしました。

実験的に動画ファイルをAWSのRekognition Videoにもかけてみたところ、DeepRacerがcarとして検出されるのはタイヤがよく見えている状態のときだけで、検出されない場面が多かったです。

# DeepRacerカーの軌跡（Real car trajectories）
![sola_traj1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426326/241dd584-334c-8b59-46c9-2630f3b49f0a.jpeg)

- 完走、もしくはコースアウトしてもトラックボスが止めずにそのまま走行させた周回が11回ありました。
- DeepRacerカーが映像から見えない場面はプロットしていません。


# リアル走行の特徴、共通点（Real car feature）
![sola_traj2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426326/c95bbe0e-f80c-11f7-9cd8-29b373e6bf69.jpeg)

スタートのストレートコースから、第一コーナにさしかかる直前で右にステアリングをきる（トラックの外側へきる）走行が6周ありました。

![sola_movie.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426326/0a32553d-2687-f054-b33a-4e20c2bc6885.gif)


# モデル分析結果と比較（Comparing with training data）
[優勝したモデルのログ分析結果](https://qiita.com/dnp-ayako/items/2b42f2cf25fa79abd55b)を、もう少し細かく確認しました。

#### Analyze the reward distribution for your reward function
![reward.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426326/00ac5e58-e937-1f5d-693b-fd3399bc6093.jpeg)
#### Path taken in a particular Iteration
![iteration_median.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426326/a147464e-a770-bc67-d135-c8fbd5ad679b.jpeg)

エピソードの複数座標を単一の中央値、平均値に変換することで、イテレーション単位に走行の特徴を表すことができるかもしれないと思い試してみました。
具体的には、定義されているトラック中心線座標（center waypoint）の前後2点の座標の間を埋めるようにさらに座標を追加した、密の細かいトラック中心線座標を新たに定義し、
エピソードのステップ座標(x,y)が一番近いトラック中央座標でカテゴリ化しました。
カテゴリ単位に中央値、平均値を求めました。（もっと正確な求め方があるかもしれません。）


# 感想と考察（My impressions）
以下はあくまで個人の見解に基づいたものとなります。

####  実世界の状態を正確に数値化、視覚化を行うことは大変だった
一番、実感したことです。
強化学習のゴールはシミュレーションと現実の誤差をなくすことで、その誤差がどれくらいあるのかを確認するには、実世界の状態をデータ化しシミュレーションで得られた値と比較できなければなりません・・・。
今回のように手でプロットしていては不正確、かつ効率が悪いので、これを機にDeepRacer検出モデルを作って動画分析で軌跡をプロットができると便利だと思いました。

####  モデル分析結果で得た特徴はリアルでみつけることはできなかった
今回は、「リアル走行軌跡の特徴を見つける」→「モデル分析結果ではどうか？」の視点で比較の確認をしました。
逆のアプローチの「モデル分析結果から走行軌跡の特徴を見つける」→「リアルではどうか？」
では[優勝したモデルのログ分析結果](https://qiita.com/dnp-ayako/items/2b42f2cf25fa79abd55b)にて、（右カーブ後に）「アウトインアウトの傾向がある」と述べましたが、実走行の結果からは共通点や類似点を確認することができませんでした。（センターラインに沿って走行する。は、どちらにもある共通点ですが）

# まとめ（Summary）
- AWS DeepRacerは実機のミニカー走行と合わせて評価することで、より踏み込んだ強化学習、分析方法を学ぶことができる。
- 実世界のデータ化や視覚化は大変なので、それを行う装置、システムやツールが必要。
Ruby に xor は無かった

Ruby で条件式として XOR（eXclusive OR；排他的論理和）演算を書く必要ができた。

えっと，`xor` なんて演算子あったっけ？と思ったら無かった。
そうか，じゃあ `&&`, `||` があるんだから `^^` かな？　見たことないけど。と思ったらこれも無かった。

ええーっ！！　無いんかい。
め，めどい。

えっと，`eq1`, `eq2` を何らかの式とする。評価値を論理値として使い，

```rb
eq1 xor eq2
```

と書きたかった。
えーとまさか

```rb
(eq1 || eq2) && !(eq1 && eq2)
```

とか。誰が書くかい！

え？　なに？　`^` を使えだって？
そりゃまあ

```rb
true ^ true # => false
true ^ false # => true
false ^ true # => true
false ^ false # => false
```

だから，こいつが XOR 演算子として働くことは分かってますがな。

問題は，`eq1` や `eq2` の評価値が `true`, `false` とは限らんちゅうことなんですわ。
整数だったらビット列演算の XOR になるやん？

はー，仕方がないのぅ。論理値を `true`, `false` に変換するあれを使うか。

```rb
!!eq1 ^ !!eq2
```

これでいいわけだが，なんか見た目がどうもな。

ちなみに XOR でド・モルガン律みたいのはあるのかな？　無いのか。でも代わりに

```math
P \veebar Q  = \overline P \veebar \overline Q
```

が成り立つのか（数学で XOR を $\veebar$ って書くの初めて知った）。そりゃそうでしょ，XOR は「真偽の不一致」を表してるんだから。

そうすると，

```rb
!eq1 ^ !eq2
```

でいいわけだ。論理的には。
でもさ，これ 5 年後の自分が見たら「ん？　何やってんの？」って疑問に思うかもしれないな。

しかし，十何年も Ruby を書いてて，今日初めて XOR 演算を書いたよ。
[Swift 5]UIToolbarから特定のアイテムを削除する方法


UIToolbarの特定のボタンを非表示にしようと思った時の備忘録です。

StoryboardのUIViewControllerに配置したUIToolbarをOutlet接続しておきましょう。

```WebViewVC.swift
@IBOutlet private weak var toolbar: UIToolbar!
```

今回は、全て表示するノーマルモード、閉じるボタンのみを表示させるCloseOnlyモードの2種をenumで定義します。

```WebViewVC.swift
enum Mode {
    case normal
    case closeOnly
}
```

遷移前からModeを指定できるように変数を宣言しておきます。

デフォルトではノーマルモードになるようにしておきました。

```WebViewVC.swift
var mode: Mode = .normal
```

遷移前画面での指定例です。

```ViewController.swift
let webVC = UIStoryboard(name: "Web", bundle: nil).instantiateInitialViewController() as! WebVC

webVC.mode = .closeOnly
present(WebVC, animated: true, completion: nil)
```



viewDidLoad()内で条件分岐を行いましょう。

Modeが増えたらswitchで分岐させる方が良いかと思います。

```WebViewVC.swift
if mode == .closeOnly {
    var items = toolbar.items  // 現在のToolbarアイテムをコピー
    items?.removeFirst(7)  // 非表示にしたいアイテムを削除
    toolbar.setItems(items, animated: false)  // 必要なアイテムだけを残したitemsをToolbarにセット
}

```

なぜ7個も削除している？と思われるかと思いますが、アイテム間に設置してあるFlexible Spaceも一つのアイテムとして数える必要があるためです。

今回は削除だけ行いましたが、同じような実装で追加もできるかと思います。
【図解】エクセルだけで簡単にUTF-8のCSVを開く方法（Excel for Office 365）

#概要
UTF-8のCSVファイルをダブルクリックすると文字化けします。
![00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102740/61d1c288-aff3-448f-425a-7fcdbe52b723.png)
Shift-JISに変換して読み込ませると、絵文字とか死ぬのでUTF-8のまま扱いたい！
そしてエクセルだけで作業したい、という場合の方法です。


##大まかな流れ
以下の３つのステップでUTF8文字を取り込めます。
1. 空白のブックにCSVファイルをインポートさせる
2. 続いて開くインポート設定画面でUTF-8の形式を選ぶ
3. PowerQueryエディターで各列の形式変換

##簡単 図解 3ステップ
###新規に空白のブックを作成して、CSVファイルをインポート
空白のブックを開いたらデータメニューから **「テキストまたはCSVから」** を押して
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102740/c784ddff-295a-56b0-2493-1e3e7c85ff07.png)
CSVファイルをインポートします。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102740/fb21ab91-08a0-a309-594d-201775ee7ca3.png)
###インポート設定画面でUTF-8の形式を選ぶ
インポートボタンを押すと、続いて形式を選ぶポップアップが出てくるので、上の方にある**UTF-8**を選択します。
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102740/362bbf7a-4b23-d790-2a38-dbb4db763613.png)
区切り記号、データ型の検出はそのままでもよいのですが、カッコつきの表記がマイナスの数値に変換されたりしたので、ここでは**「データ型を検出しない」**としています。
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102740/81bc7354-84fe-9ab8-6ca1-786b67d8d6c3.png)
正しくデータが表示されていることを確認したら、「データの変換」ボタンを押します。
###PowerQueryエディターで各列の形式（文字、数字、日付など）を選んで変換
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102740/c53ebea9-6b6b-093e-b1a0-746c499aaf94.png)

という流れでUTF-8の文字をエクセルに取り込めます。

#より簡単な代案
ところでGoogleスプレッドシートを使えば、もっと簡単に開けます。
またエクセル形式でエクスポート（保存）できます。
【図解】エクセル（スプレッドシート）で最も簡単にUTF-8のCSVを開く方法

#概要
UTF-8のCSVファイルをダブルクリックすると文字化けします。
![00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102740/61d1c288-aff3-448f-425a-7fcdbe52b723.png)
一番簡単な方法で開きたい場合の方法です。

#簡単3ステップ
Googleスプレッドシートなら文字化けしません。
### インポートを選ぶ
[Googleのスプレッドシート](https://docs.google.com/spreadsheets/)を開いてメニューから**インポート**を選びます。
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102740/2d4e5fb0-71d3-410a-19e0-b217c9793de7.png)
### ファイルをドラッグ＆ドロップ
「アップロード」のタブを選択してファイルをドラッグ&ドロップ、または選択してアップロードします。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102740/a1110c58-8d01-d817-4294-478154ee3740.png)
### インポート設定はそのままで「データをインポート」ボタンを押す
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102740/5e4c80b6-921d-89a4-cd46-f3ea07cce8c0.png)

以上で読み込めます。
#エクセルに変換
メニューの「ファイル」の**形式を指定してダウンロード**から、Microsoft Excel (.xlsx) を選びます
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102740/2ba97c2d-4393-44e2-d65e-ba244c54b1d5.png)

#データが少し変な時は
データが勝手にマイナスの値になる、勝手に変な日付に変わるという場合にはインポート設定で**テキストを数値、日付、数式に変換** のところを「いいえ」にしておくとよいです。

また、列がずれて見える場合は**区切り文字の種類**　を「自動的に検出する」から「カンマ」などに変えるとよいです。

#エクセルでも簡単に取り込めます
実はエクセルでもそんなに難しくないです。
Googleスプレッドシートが禁止されている場合ならば
またエクセル形式でエクスポート（保存）できます。
yukicoder No.269 見栄っ張りの募金活動

# yukicoder No.269 見栄っ張りの募金活動

https://yukicoder.me/problems/no/269

range(0, n*k, k)を最初にsから引いて、分割数の組みを求める。それらを昇順に並べたものが答えの組みとなる。

```python
n, s, k = map(int, input().split())
mod = 10 **9 + 7


s -= n *((n-1) * k) //2


def div_num(s, n):
    dp = (s+1) * [1]
    for i in range(2, n+1):
        for j in range(i, s+1):
            dp[j] = (dp[j] + dp[j - i]) % mod
    return dp[-1]



if s < 0:
     print(0)
else:
    print(div_num(s, n))
```
PowerPointのページ番号をマクロでセットする

# PowerPointでページ番号つけてますか？
スライドにページ番号つけてますか？

私は輪講で使うために，教科書の代わりになるようなスライドを作っています．
教科書の代わりなので，「○ページにも書きましたがー」とか，「△ページの公式にしたがってー」と，何かとページ番号が重要です．

また，スライドの量が多いとき，終わりが見えないスライドって嫌ではないですか？[25/100]と右下に書いてあれば，4分の1終わったなとわかるので，少し気が楽になるというのが学生の気持ちです．

つけて損するものではないので，ページ番号は付けてもらいたいものです．できれば分母のあるタイプで．

# 分母なしは簡単
分母なしのページ番号は簡単です．
挿入タブに「スライド番号」 もしくは 「ヘッダーとフッター」からスライド番号を表示するかを選ぶことができるので，表示するようにすればいいだけです．
ただし，非表示スライドがあると面倒臭いです，なぜなら非表示スライドにもページ番号を振ってしまうので．

よくこれの解決方法としてあげられているのは，非表示スライドを最後のページの後ろに移動させればいい
という方法なのですが，移動していい非表示スライドって消せばよくないですか？っていうのが私の意見です．

# マクロを組めばいいじゃない
マクロで非表示スライド以外にページ番号を振るようにすればいいじゃない！ってことで，組みました．
ベースになっているのは，The Power of PowerPointというサイトで公開されている
[『パワーポイントの総スライド数を思い通りに表示する様々な方法』](http://thepopp.com/how-to-insert-total-number-of-slides/#VBA)という記事のマクロです．

```VB
Const DEFAULT_DIVIDER As String = "/"
Const IS_DENOMINATOR As Boolean = False
Sub SetPageNum()
    Dim sld As Slide
    Dim shp As Shape
    Dim allPagesNum As Integer
    Dim disablePageNum As Integer
    
    With ActivePresentation
    For i = .Slides.Count To 1 Step -1
        With .Slides(i)
            If .SlideShowTransition.Hidden = msoFalse Then
                allPagesNum = allPagesNum + 1
            End If
        End With '.Slide(i)
    Next i
    End With 'ActivePresentation
    
    For Each sld In ActivePresentation.Slides
        sld.DisplayMasterShapes = True
        If sld.SlideShowTransition.Hidden = msoTrue Then
            disablePageNum = disablePageNum + 1
        Else
            For Each shp In sld.Shapes
                If Left(shp.Name, 12) = "Slide Number" Then
                    Dim str As String: str = sld.SlideNumber - disablePageNum
                    If IS_DENOMINATOR Then
                        str = str & DEFAULT_DIVIDER & allPagesNum
                    End If
                    shp.TextFrame.TextRange.Text = str
                End If
            Next
        End If
    Next
End Sub
```

改良点として

* 分母をつけるか付けないかの選択フラグを実装(`IS_DENOMINATOR As Boolean`)
* 非表示スライドを無視するように変更

の2点があります．最初に非表示スライド以外の総ページ数を数えているので，コードが長くなっていますがご了承ください．
分母なしのスライド番号を振る場合も，非表示スライドを無視して振るならこっちの方が楽です．多分．

ただ...マクロの搭載されたパワーポイントって，毎度注意も出ますし，嫌いな人もいるかもしれませんね．
【Rails】カスタム例外の定義とそのハンドリング（カスタム例外を使えと言っている訳ではない）

# 環境

- Rails 5.2.3

# 注意

題の通り、カスタム例外の利用を推奨するものではありません。
「業務エラー」と「システムエラー」の違いを認識して、用法・用量を守って利用しましょう。
以下、「業務エラー」と「システムエラー」の違いについて非常に詳しく書かれた参考記事です。
https://qiita.com/jnchito/items/3ef95ea144ed15df3637
https://speakerdeck.com/jnchito/number-rubykansai-2018-01-13

こちらも簡潔で分かりやすいです。
https://waterlow2013.hatenablog.com/entry/2018/06/09/150640

# カスタム例外の定義方法

`StandardError`を継承する。

```ruby
class Payment
  class InvalidRequestError < StandardError; end

  def call
    raise InvalidRequestError 'error message comes here' unless valid?
  end
end
```

# カスタム例外のハンドリング例

呼び出し元は何でもいいですが、ここではとあるAPIと仮定。

```ruby
module Api
  module V1
    class Payments < Api::BaseController
      rescue_from Payment::InvalidRequestError do |e|
        # e.messageとかを使って何かする。
      end
    end
  end
end
```
nuxt.jsの第一歩

# Nuxt.jsのサンプル

## urlから情報を取得する

ファイル名： pages/users/_id.vue
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42407/52bfad99-d66a-b3ce-6cff-10e12d47813d.png)


http://localhost:3000/users/test

``` (pages/users/_id.vue)
<template>
  <div>
    <p>
      User ID: {{ userId }}
    </p>
  </div>
</template>

<script>
export default {
  data () {
    return {
      userId: this.$route.params.id
    }
  }
}
</script>
```

## qiitaから記事一覧を取得する

アクセストークンをセットしていない場合は１時間に６０回しかリクエストを飛ばせないので要注意

ファイル名 pages/article/index.vue

http://localhost:3000/article

``` (pages/article/index.vue)
<template>
  <section class="container">
    <div>
      <ul>
        <li v-for="item in items" :key="item.id">
          {{ item.title }}
        </li>
      </ul>
    </div>
  </section>
</template>

<script>
export default {
  async asyncData ({ app }) {
    const items = await app.$axios.$get('https://qiita.com/api/v2/items?query=tag:nuxt.js')
    return {
      items
    }
  }
}
</script>

```


### APIの詳細

https://qiita.com/api/v2/docs#get-apiv2items
[Next 2019聴講メモ] Cloud CodeとコンテナツールでK8sを使った開発を徹底効率化

※※2019 / 08 / 14 追記 YouTubeに投稿されたセッションのリンクを追加しました。※※

# Cloud CodeとコンテナツールでK8sを使った開発を徹底効率化
- 岩成祐樹
  - Google Cloud  
  - カスタマーエンジニア
- [YouTube](https://www.youtube.com/watch?v=_RPaAOMQO5Q)

-----
## container or k8s
コンテナを用いた選択肢  

- GAE(source base)
- Cloud Run (container base& serverless)
- GKE(container base)

## k8sを使ってローカル開発を効率化
- 開発者はコードにフォーカスしたいがやることがたくさんある
  - インフラ管理
         - OS
         - middle ware
         - monitoring
  - etc...

### k8sを用いた開発の難しさ
- painful deployment cycle
  - ソースの修正のたびに繰り返し作業が発生
- context switch
  - ブラウザ、IDE等の移動で生産性↓
- high learning cost
  - 全部は把握しきれない(k8s自体の開発がかなり早い)
  - チームとして把握していることが望ましいがなかなか難しい

## Cloud Code
- コードにフォーカスしてできる
  - IDEで一元管理
         - deploy
         - debug
         - Pod管理
         - etc
  
### 特徴
- k8sの開発サイクル
  - バックエンドではskaffold
- デバッグ
  - コンテナ内のデバッグとか
  - IDEからbreak pointを置ける
- クラスター管理
  - podの状況
  - YAMLの修正の可視化
         - 反映させなくてもわかるようになっている
- テンプレートと編集支援
  - deployment, debugが用意されたテンプレートから作成できる
- エコシステムとの統合
  - 新規のプロダクトに対してのキャッチアップの時間を削りたい...!
- GCPとの統合
  - GCPの情報をIDEの中でみることができる
​
- 自動で認証情報を登録される(./kube/config)
- deployの選択肢
  - ワンショットのデプロイ
  - 継続的デプロイ(ソースの変更を検知してデプロイ)
- **GKEだけじゃなくてEKSやAKSにも使える**

### skaffold
- k8sアプリをのCDをサポートするCLI
- クライアントのみでも動作し、プラグイン機構で拡張できる
​

## まとめ
- k8sの学習コストを抑えつつ、ローカル開発を最大限に効率化させるためのCloud Code

## 個人的ToDo
- skaffold
ソースを見るか人を見るか


昨今ではプログラマー、SEがソースコードと向き合わない例も出てきました。UXやエクスペリエンスという、技術職の人間からするとブラック・ボックスな領域へとアクセスしないといけない。

コードの打ち込みが専門の人間からすると、人の体験とはなにかがそれこそ異分野の言語のように不思議なものにうつるわけです。言語の違いというのは、応用のきく分野ときかない分野があるでしょう。

ソースコードを見るとその人の人間性がわかる。そしてそれを見る人＝ユーザーがわかることはこれからの必須課題となるようです。人間とプログラミングとはかけ離れたシステムであり、設計したように動かないランダムな事象の集合体でもあります。

HTMLという言語ではメールを打つようなものと思う人もいるわけです。当然スクリプト関係からCSSなどに入れば、他のプログラミング言語と同じで、メールとは違い非人間性が支配する領域でもあります。


自動システムで作ったサイトと、<a href="https://xn--tor3uh5c6zhr15dspki3m3km.com/antique-things-that-can-not-be-purchased-list/" >どんなものが売れるか骨董の例</a>のような人が作った、しかも素人同然の人が作ったサイトとではどちらがUXが優れているのでしょう？人が見て人が良し悪しを評価する。つまりプログラマーとは機械のために、翻訳してコンパイルという作業のためではなくなり、生身の人に受け入れられる作品を作らなくてはいけない。

答えは人のなかにある。教本やソースコードの中に答えは隠されていないのです。
レンタルサーバーFTPでもTravis CI使ってCIしたい

# 背景

レンタルサーバーFTP手動アップがひたすら面倒。
[レンタルサーバーFTPでもデプロイスクリプトを用意してデプロイを楽する](https://qiita.com/ProjectEuropa/items/1f8b3a450c1c52d29a6d)の記事のようにレンタルサーバーFTPでもコマンドでデプロイできるが、もっと楽したい。

## 環境

[もっと簡単にDockerでNuxt.jsを始めてみる(続Dockerでローカル環境を汚さずにNuxt.jsを始めてみる)](https://qiita.com/ProjectEuropa/items/4f141730c53754ca7dc2).

こちらの記事の環境が前提で一旦はNuxt.jsの構築ができており、Nuxt.jsをレンタルサーバーFTPでアップします。

## 結論

[Travis CIのCustom Deployment
](https://docs.travis-ci.com/user/deployment/custom/)にはSFTPの記述がありますが、全然うまく行きません。[Git + CI + lftp で自動アップロードする方法](https://h2ham.net/lftp-git)という記事を参考にlftpを使います。

## .travis.yml

```.travis.yml
language: node_js
node_js:
  - "10"

cache:
  directories:
    - "node_modules"

install:
  - npm install
  - npm run generate

before_install:
  - chmod +x deploy.sh
  - sudo apt update
  - sudo apt install -y lftp

script:
  - echo "Skipping tests" #本来は駄目ですがテストは一旦スルーする。

after_success:
  - sh deploy.sh
```


## deploy.sh

FTP_USER,FTP_PASSWORD FTP_HOST
はそれぞれ、環境変数をTravis CIで設定してください。
FTP_REMOTE_ROOTはFTPの反映したいディレクトリです。ここは別に環境変数じゃなくても良さそうです。

```deploy.sh
#!/bin/bash

lftp -c "set ftp:use-mdtm off;set ftp:ssl-allow no; open -u $FTP_USER,$FTP_PASSWORD $FTP_HOST; mirror --ignore-time -R dist/. /$FTP_REMOTE_ROOT/ --parallel=20"
```

`set ftp:use-mdtm off;set ftp:ssl-allow no`と`--ignore-time`がコツです。

`set ftp:use-mdtm off`と`--ignore-time`を設定しないとFTPアップロードが激遅ですし、`set ftp:ssl-allow no`を設定しないとそもそも証明書の関連でエラーが発生します。

あとはNuxt.jsのリポジトリをGitHubに登録して、Travis CIと連携させて、masterにpushすればCIができます。

## 参考

[《Git》GitLabにコミットしたら、FTPでサーバにアップロードする自動化を１分で行う方法。](https://qiita.com/uto-usui/items/b8b8c77efe01672a11b6)
AWSメモ(WIP)

AWSでまずやること
なぐり書き、後でまとめる

#IAM関連
ログインアカウント管理したり、チームメンバーのアカウントの管理をしたりするところ。

##ユーザ種別
**ルートアカウント**
AWS登録時の大元のアカウント(何でもできる・なるべく使わないこと)
**IAMアカウント**
一人一人に渡すようなアカウントのこと。
(IAMアカウント使ったらルートではなくIAMアカウントを使うこと)

###主なIAMアカウントに付与するもの
####セキュリティ
**グループ**
セキュリティグループのこと。そのIAMユーザの権限を限定する。
**ロール**
リソースに対して設定するものセキュリティロール
**ポリシー**
ロールやグループに付与できるセキュリティ定義

####タグ
名前の通りアカウントの属性つけられる
{email: 'sample@mail.com', role: 'admin'}な感じで検索などの管理周りで使う

##やるべきこと
①IAMアカウントの登録・管理
②URLエイリアスの登録
③各アカウントのMFA有効化（２段階認証のこと）
④パスワードポリシーの設定

#CloudTrail関連
AWSコンソールのログを取る仕組みのこと。基本はS3上に貯める。

ログの種類は以下の２つがある
**管理イベント**
コンソール上でのインスタンスの作成やログインなどの管理操作のログのこと
初期状態で無料で常に90日間分は保存してくれる。
**データイベント**
データに対しての更新や検索のログ（Amazon S3への情報取得など）

##ちゃんとログデータ取りたいときにやること
認証というのを作成。

#CloudWatch関連
AWSリソースのモニタリングをする機能。　請求金額の把握やアラーム設置などできる
デフォルトだとルートアカウントじゃないと設定不可。

#AWSのメモ
Route-53　- DNS設定

VPC-仮想ネットワーク構築
 ELB-ロードバランサ
　 ーEC2
　 ーEC２
　　 ーRDS-DB
　　 　ーS3　ストレージ　DBバックアップ等

##AWSサービスはどちらかに分類される
・アンマネージド型
管理面倒・柔軟
EC２など
・マネージド型
管理楽・設定が楽
Route53・RDSなど

##AWSのインフラ構成
リージョン(19) -> アヴァイラビリティゾーンAZ(57) ->　エッジロケーション(150)

・リージョンとは？->国・地域ごとの部分類
リージョン間は物理的に独立しているインフラ拠点である
リージョン間は物理的な広帯域のネットワークで接続は可能。
バージニア北部はサービスが最新
国が滅ぶような超最大規模地震対策などにはリージョンを分けることが大事
リージョン選択の際はリージョンのある国の法律に影響されることがあるので注意(中国は政府へのデータの提示義務がある・・・など)

リージョン間で連携できること(意外と少ない・・・)
- AWS Direct Connect経由で接続
- VPCのPeering接続
- EC2のAMIイメージのリージョン間のコピー
- S3のリージョン間のレプリケーション
- RDS・DynamoDBのリージョン間のバックアップ
- route53でのフェイルオーバー

・アヴァイラビリティゾーンAZとは->バカでかいデータセンター単位
同一リージョンのAZ同士は低レイテンシーのリンクで接続
サービスによってAZ間をまたげるものとまたげないものがある
AZを仮想化してEC２などを提供してる
データセンターが止まるリスクに対してはAZを分けよう。
複製AZで冗長性を作るのが普通。

・エッジロケーション->Iot向けやキャッシュデータなどを使う際のさらなる細かいエンドポイント
- CloudFront
- AWS CDN
で使用

##AWSの操作方法
-AWSコンソール(WEBGUI)
-インスタンス操作(SSH)
-AWSCLI操作(AWSコンソールで行うようなことをAWS専用のコマンドで実行できる)

#AWS organization
・AWSアカウントのグループ化（組織別（会社別）などでのグループ化などができる）
・IAMユーザーの自動作成(CLI)
・複数アカウントの一括請求

##機能セットの選択
支払い一括代行or支払い一括代行及び複数アカウントの統制

組織（OU）
　- 管理者ルートにマスターアカウントを設置
　- IAMユーザーを組織のメンバーに追加
　- 組織(OU)を作成
　- サービスポリシーを作成(SCP)


**まず組織設計とそれぞれに対してなんの権限を与えるかを定義することが初めにやること**
**IAMとOrganizationは基本無料**
【RSpec】letはbefore内では使えない

RSpecではインスタンス変数を使う代わりに、letを使うことが出来ます。
このletを**インスタンス変数のようなもの**だとあやふやな認識をしていた為、以下のコードを書いてしまっていました。

```test_spec.rb
require 'rails_helper'

# before内にletを書いている
describe 'ログイン', type: :system do
  before do
    let(:user_a) { FactoryBot.create(:user) }
    visit login_path
    fill_in 'Email', with: user_a.email
    fill_in 'Password', with: password
    click_button 'Login'
  end

  context 'ログイン成功' do
    before do
      let(:password) { user_a.password }
    end

    it '成功時のflashが表示される' do
      expect(page).to have_css('div', class: 'alert-success')
    end
  end

  context 'ログイン失敗' do
    before do
      let(:password) { 'badpassword' }
    end

    it '失敗時のflashが表示される' do
      expect(page).to have_css('div', class: 'alert-danger')
    end
  end
end
```

このテストを実行すると以下のエラー文が出てきます。

>Failure/Error: let(:user_a) { FactoryBot.create(:user) }
>       `let` is not available from within an example (e.g. an `it` block) or from >constructs that run in the scope of an example (e.g. `before`, `let`, etc). It is >only available on an example group (e.g. a `describe` or `context` block).

letは`describe`か`context`の中でしか使えないよ！というお叱りを受けました。
インスタンス変数の代わりにletを使うサンプルが多いですが、letは変数とは違うので`before`や`it`の中では使えません。
上記のプログラムは、以下のように書き換えると正常に実行できます。

```test_spec.rb
require 'rails_helper'

# letをbeforeの外で定義している
describe 'ログイン', type: :system do
  let(:user_a) { FactoryBot.create(:user) }

  before do
    visit login_path
    fill_in 'Email', with: user_a.email
    fill_in 'Password', with: password
    click_button 'Login'
  end

  context 'ログイン成功' do
    let(:password) { user_a.password }

    it '成功時のflashが表示される' do
      expect(page).to have_css('div', class: 'alert-success')
    end
  end

  context 'ログイン失敗' do
    let(:password) { 'badpassword' }

    it '失敗時のflashが表示される' do
      expect(page).to have_css('div', class: 'alert-danger')
    end
  end
end
```
Ubuntu(Linux)でディレクトリのコピーの進捗状況を確認する

## TL,DR


```shell
#インストールコマンド
$ sudo apt install gcp
$ sudo apt install dbus-x11
#実行コマンド
$ dbus-launch gcp -rv dir1 dir2
Copying 190.97 MiB 100% |####################################|   6.75 MB/s Time: 0:00:29
```

##### 参考資料：[Linuxでファイルコピー時に進捗状況を確認する6つの方法](https://orebibou.com/2015/07/linux%E3%81%A7%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%B3%E3%83%94%E3%83%BC%E6%99%82%E3%81%AB%E9%80%B2%E6%8D%97%E7%8A%B6%E6%B3%81%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8B6%E3%81%A4%E3%81%AE/)
【jQuery】リアルタイムでバリデーションチェックを簡単に実装（jQery-validate）

jQery-validateとは
=
・jQueryプラグイン
・リアルタイムでバリデーションチェックが可能
・カスタマイズできる

備考欄
=
・随時修正
・自分用メモ
[【公式】jQuery Validation Plugin](https://jqueryvalidation.org/)
[【公式】ダウンロード(ver 1.19.1)](https://github.com/jquery-validation/jquery-validation/releases/download/1.19.1/jquery-validation-1.19.1.zip)





デフォルトのバリデーションルール
=
|ルール名| 内容 |
|:------|:-----|
| required | 必須入力チェックを行う |
| remote | バリデーション結果をサーバに問い合わせる |
| email | 入力値がメールアドレスのフォーマットであるか |
| url | 入力値がURLのフォーマットであるか |
| date | 入力値が日付であるか |
| dateISO | 入力値がISO形式の日付であるか |
| number | 入力値が数字であるか |
| digits | 入力値がクレジットカード番号のフォーマットであるか |
| creditcard | 入力値がクレジットカード番号のフォーマットであるか |
| equalTo | 入力値が指定した値と一致しているか |
| maxlength | 入力値が指定した桁数以下か |
| minlength | 入力値が指定した桁数以上か |
| rengelength | 入力値が指定した桁数の範囲であるか |
| renge | 入力値が指定した数字の範囲であるか |
| max | 入力値が指定した数字以下であるか |
| min | 入力値が指定した数字以上であるか |

後からバリデーションルール追加（初期設定後）
=
※　公式にある`addClassRules`が使えなかったため、別の検索・・・
参考サイト：[【Qiita】jQuery Validation Plugin 簡単な使い方まとめ]
(https://qiita.com/konnma/items/eb26651576e625b72805)

```ruby:使用不可
$.validator.addClassRules( 'add' , { required: true });
$.validator.addClassRules({ add  : { required: true } });
```

```ruby:代わりに使用
$('[name="add"]').rules( 'add' , { required: true } );
$('[name="remove"]').rules( 'remove', 'required max' );
```
【複数設定する場合】
add ：{ }で指定
remove：半角スペースで指定

エラーメッセージの日本語化(変更)
=

```
  $.extend($.validator.messages, {
    required   : "このフィールドは必須です。",
    remote     : "このフィールドを修正してください。",
    email      : "有効なEメールアドレスを入力してください。",
    url        : "有効なURLを入力してください。",
    date       : "有効な日付を入力してください。",
    dateISO    : "有効な日付（ISO）を入力してください。",
    number     : "有効な数字を入力してください。",
    digits     : "数字のみを入力してください。",
    creditcard : "有効なクレジットカード番号を入力してください。",
    equalTo    : "同じ値をもう一度入力してください。",
    extension  : "有効な拡張子を含む値を入力してください。",
    maxlength  : $.validator.format( "{0} 文字以内で入力してください。" ),
    minlength  : $.validator.format( "{0} 文字以上で入力してください。" ),
    range      : $.validator.format( "{0} から {1} までの値を入力してください。" ),
    rangelength: $.validator.format( "{0} 文字から {1} 文字までの値を入力してください。" ),
    step       : $.validator.format( "{0} の倍数を入力してください。" ),
    max        : $.validator.format( "{0} 以下の値を入力してください。" ),
    min        : $.validator.format( "{0} 以上の値を入力してください。" )
  });
```

参考URL
=
・[【jQuery入門道場】jquery.validate.jsのvalidateメソッドの超訳]
(https://jquery-master.net/plugin/jquery_validate_js/)
　→超訳でわかりやすい！オプション内容を確認して、公式でソース例を見に行く
・[【公式】.validate() | jQuery Validation Plugin] 
(https://jqueryvalidation.org/validate/)
　→jQuery入門道場と併用してみるのが自己ベスト！
・[【hifive】jQuery Validation Plugin]
(https://www.htmlhifive.com/conts/web/view/library/jquery-validate)
　→使い方など記載
・[【システムガーディアン株式会社】jQuery Validation 簡単にフォームをチェック バリデーション]
(https://sys-guard.com/post-14579/)
　→使い方など記載
・[【なんとなくだらだら。。。】jquery.validateの使い方]
(http://blog.livedoor.jp/k_shin_pro/archives/45235160.html)
　→使い方など記載
・[【Minory】jQuery Validationプラグインの共通エラーメッセージを日本語化する方法]
(https://minory.org/jquery-validation-ja.html)
複数のfactoryを使い分けたいとき

通常の記述であれば、factoryを作成すると、そこを参照して、testデータや、seedデータが作成される。

例えば、

factoryが以下のような記述で、

```php:User1Factory.php
$factory->define(AppUser::class, function (Faker $faker) {
    return [
        'name' => $faker->name,
    ];
});
```


seedデータは以下のようだとしたら、

```php:Users1TableSeeder.php
    public function run()
    {
        factory(User::class, 100)->create();
    }
```

$fakerを作成使用したダミーデータが100件できることになる。

しかし、何らかの事情で,場面によって別のFactoryで作成したデータを使いたいときなどは、
そのまま記述してもUser1Factory.phpの内容が勝手に呼び出される。

そこで,「state」というものを使って名前をつけて、「このfactoryを使用したい時はこれ」と明示的に呼び出せるようにしてあげる。

*\$factory->stateは別のところで、$factory->defineを定義していなければ使えないので注意してください。

```php:Model2Factory.php

$factory->state(User::class, 'SampleName', function (Faker $faker) {
    return [
        'name' => 'samplename',
    ];
});
```

上記のように$factory->stateの第二引数で、名前を指定してやり、呼び出す際は
states('名前')
のような形で呼び出す。


```php:Users2TableSeeder.php

    public function run()
    {
        factory(User::class, 100)
            ->states('SampleName')
            ->create();
    }
```


こうすることで、今度はsamplenameというデータが100件できることになる。
Ubuntu 19.04のRedmineでチケットのインポートができない件

Ubuntu 19.04のRedmineでチケットのインポートを使用としたらInternal Errorが発生してしまったので、その対策を備忘録として。

## エラーログ

Redmineでチケットのインポートを実行しようとするとInternal Errorが発生してしまった。
ログを見るとテンポラリ・ディレクトリ `/usr/share/redmine/tmp` が作れないと怒っている。

```log:/var/log/redmine/default/production.log
Started POST "/redmine/imports" for 10.0.2.2 at 2019-08-01 21:27:22 +0900
Processing by ImportsController#create as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"Tu6seP+IyMKIaygRfO/+M8PQJMNpGivSgatqyITRM4+UE4zgtKatyGJPJQXQRy4KF/QjwWmeSnKNsjIyBDQRHw==", "file"=>#<ActionDispatch::Http::UploadedFile:0x0000561984bab5c8 @tempfile=#<Tempfile:/tmp/RackMultipart20190801-5413-mxkmnf.csv>, @original_filename="test.csv", @content_type="application/vnd.ms-excel", @headers="Content-Disposition: form-data; name=\"file\"; filename=\"test.csv\"\r\nContent-Type: application/vnd.ms-excel\r\n">}
  Current user: katsuya (id=5)
Completed 500 Internal Server Error in 15ms (ActiveRecord: 7.8ms)
  
Errno::EACCES (Permission denied @ dir_s_mkdir - /usr/share/redmine/tmp):
  
lib/redmine/utils.rb:49:in `save_upload'
app/models/import.rb:47:in `file='
app/controllers/imports_controller.rb:35:in `create'
lib/redmine/sudo_mode.rb:63:in `sudo_mode'

```

調べてみると `/usr/share/redmine` 以下に `tmp` というディレクトリは存在しなかった。

## 安易すぎる修正

まずは、すごくすごく安易に修正してみる。

```shell-session
$ cd /usr/share/redmine
$ sudo mkdir tmp
$ sudo chmod a+wrx tmp
```

これでも、とりあえず動く。
`tmp` の下に更に `imports` というディレクトリができていて、オーナーは `www-data` になっていた。

安直にディレクトリを作ってパーミッションを設定すればそれなりに動くようになるのだけど、この手のディレクトリ/ファイルは `/var` 以下にすべきと考える。
`/usr/share/redmine/tmp` ではなく `/var/chache/redmine/<instance>/tmp` 。

気持ちが悪いので`/usr/share/redmine/tmp` はスカッと削除。

```shell-session
$ sudo rm -fr /usr/share/redmine/tmp
```

## 抜本的対策


Redmineの実行ファイルを探してみると、以下のファイル (一部抜粋) が怪しい。

```Ruby:/usr/share/redmine/app/models/import.rb
  # Returns the full path of the file to import
  # It is stored in tmp/imports with a random hex as filename
  def filepath
    if filename.present? && filename =~ /\A[0-9a-f]+\z/
      File.join(Rails.root, "tmp", "imports", filename)
    else
      nil
    end
  end
```

Rubyは解らないのだが、`Rails.root` ではなく、インスタンスのルートにすべき。
ということで、他のファイルと見比べてみて `Rails.root` を `Redmine.root` に書き換える。
ついでに、日付フォーマットもよく使うYYYY/MM/DD形式が使えるようにする。

```diff
--- /usr/share/redmine/app/models/import.rb.org	2019-01-20 15:57:15.000000000 +0900
+++ /usr/share/redmine/app/models/import.rb	2019-08-02 10:36:11.694010187 +0900
@@ -28,6 +28,7 @@
   validates_length_of :filename, :maximum => 255
 
   DATE_FORMATS = [
+    '%Y/%m/%d',
     '%Y-%m-%d',
     '%d/%m/%Y',
     '%m/%d/%Y',
@@ -78,7 +79,7 @@
   # It is stored in tmp/imports with a random hex as filename
   def filepath
     if filename.present? && filename =~ /\A[0-9a-f]+\z/
-      File.join(Rails.root, "tmp", "imports", filename)
+      File.join(Redmine.root, "tmp", "imports", filename)
     else
       nil
     end
```

これでOK。目的の場所に `imports` ディレクトリが作成された。

なお、パッチは自己責任で使用ください。