OmniAICreator/Qiita-1.07M huggingface dataset:
【初心者向け】Rubyのバージョンを最新に保つ方法

# はじめに
タイトルにもあるように基本的に今Rubyを勉強していて、
Rubyのバージョンの挙げ方がわからないorどうやるっけ？って人向けです。

# 動作確認環境
* MacOS Mojave 10.14.6
* Ruby 2.6.4
* rbenv 1.1.2
* Homebrew 2.1.11

# 注意事項
今回はあくまでもMacで利用するGlobalバージョンを最新に保つ方法です。
各々のプロジェクトで反映させる場合は、この内容と合わせて
`.ruby-vesion`ファイルがあれば適宜変更してください。

# なぜバージョンを上げないといけないか
Ruby自体に脆弱性問題があり、それが修正されたためです。
プロジェクトのセキュリティを保つためにも1つ前のバージョンを利用している場合は
必ず実行するようにしてください。
(2.5系,2.4系もセキュリティアップデートが入ってます)
詳細は以下リンクを参照してください。
[Ruby2.6.5リリース](https://www.ruby-lang.org/ja/news/2019/10/01/ruby-2-6-5-released/)

# 作業手順
手始めにまずは`rbenv`の現在のバージョンで最新のものがあるか確認してみましょう。

```
$ rbenv install -list

(略)
  2.6.0-dev
  2.6.0-preview1
  2.6.0-preview2
  2.6.0-preview3
  2.6.0-rc1
  2.6.0-rc2
  2.6.0
  2.6.1
  2.6.2
  2.6.3
  2.6.4
  2.7.0-dev
  2.7.0-preview1
(略)
```

この状態ではまだ`2.6.5`のバージョンがないことがわかります。

次に、`rbenv`と`ruby-buid`をアップグレードします。
[リファレンス](https://github.com/rbenv/rbenv#upgrading-with-homebrew)

```
$ brew upgrade rbenv ruby-build

Error: rbenv 1.1.2 already installed
==> Upgrading 1 outdated package:
ruby-build 20190828 -> 20191004
==> Upgrading ruby-build 
==> Downloading https://github.com/rbenv/ruby-build/archive/v20191004.tar.gz
==> Downloading from https://codeload.github.com/rbenv/ruby-build/tar.gz/v20191004
######################################################################## 100.0%
==> ./install.sh
🍺  /usr/local/Cellar/ruby-build/20191004: 459 files, 229.8KB, built in 10 seconds
```

rbenvは最新だったようでエラーを吐いてますが
ruby-buildは修正されていたのでアップグレードが完了しました。

それではもう一度rbenvのバージョンリストを確認します。

```
$ rbenv install -list

  2.6.0-rc1
  2.6.0-rc2
  2.6.0
  2.6.1
  2.6.2
  2.6.3
  2.6.4
  2.6.5  // New!
  2.7.0-dev
  2.7.0-preview1
```

めでたく2.6.5が表示されたので、早速インストール開始。

```
$ rbenv install 2.6.5

ruby-build: using openssl from homebrew
Downloading ruby-2.6.5.tar.bz2...
-> https://cache.ruby-lang.org/pub/ruby/2.6/ruby-2.6.5.tar.bz2
Installing ruby-2.6.5...
ruby-build: using readline from homebrew
Installed ruby-2.6.5 to /Users/yucky/.rbenv/versions/2.6.5
```

ちなみに、今回は5分くらいインストールに時間かかりました:rolling_eyes:
(下り120Mbpsでした)
回線状況なども影響するので、なるべく快適な回線下で作業することをお勧めします。

念の為バージョン確認。

```
$ rbenv versions
  system
  2.5.1
  2.5.3
  2.6.3
* 2.6.4 (set by /Users/user/.rbenv/version)
  2.6.5 <=追加されてる
```

システムに2.6.5を反映。

```
$ rbenv global 2.6.5
```

そしてもう一度確認

```
$ rbenv versions
  system
  2.5.1
  2.5.3
  2.6.3
  2.6.4
* 2.6.5 (set by /Users/user/.rbenv/version)
```

これでMacでのRubyのシステムバージョンが最新の2.6.5に設定されました :thumbsup: 


仮に開発しているプロジェクトがあれば、
合わせて`bundler`などが最新のRubyバージョンに対応しているか確認もしておきましょう。

# 最後に
どんなプロジェクトでも脆弱性を突かれて攻撃される可能性が往往にしてあります。
言語のサポートでセキュリティ関連の改善がされた場合はすぐに対応することで
自らのプロジェクトに対するセキュリティを高めていきましょう。
vue.js ログイン前とログイン後でヘッダーの色を変える、サイドバーの表示非表示を切り替える

# ログイン前とログイン後でヘッダーの色を変える、サイドバーの表示非表示を切り替える

(必要な部分のみを抜粋しています)

1
ログインフォームのあるコンポーネント(new)

- ログインするメソッドを定義

```js:session/new.vue
methods: {
    loginUser: function() {
      axios
      .post('/login',
      {
        user: {
          email: this.user.email,
          password: this.user.password,
          password_confirmation: this.user.password_confirmation
        }
      })
      .then((res) => {
        console.log(res.data)
        this.$router.go({ path: this.currentRoutePath })
      }, (error) => {
        console.log(error)
      })
    }
  }
}
```

2
topコンポーネント(ヘッダー)

- navbarの色を、v-bind:styleで動的に変化させるよう設定(初期値は#696969 濃いグレー)

- topコンポーネント内に、ログイン中ユーザーのidを取得するメソッドを定義
(ライフサイクル **created** のタイミングで実行されるようにする)

- idを取得出来れば(ログイン中ユーザーがいれば)、ヘッダーの色が #00ffff(AQUA)になる

- ログイン後はサイドバーを表示させるため、$emitで親コンポーネントに **isLoggedIn** というイベントを渡す

```js:top.vue
<div class="navbar navbar-expand-lg" v-bind:style="{ background: navbarColor }">

<script>
  data: function() {
    return {
      current_user: {
        id: ''
      },
      navbarColor: '#696969'
    }
  },

created() {
    this.fetchCurrentUserId
},
computed: {
    fetchCurrentUserId: function() {
      axios
      .get('/api/users/sessions/fetch_current_user_id')
      .then((res) => {
        console.log(`fetch_current_user_id ${res.data}`)
        this.current_user.id = res.data
        if (this.current_user.id) {
          console.log(this.current_user.id)
          this.navbarColor = '#00ffff';
          this.$emit('isLoggedIn')
        }
      }, (error) => {
        console.log(error)
      })
    }
  }
}
</script>
```

3
親コンポーネント(scafold)

- showSidebarというプロパティを設定(デフォルトはfalse)

- showSidebarプロパティとv-showを用い、未ログイン時はsidebarコンポーネントを非表示にしておく

- 2でtopコンポーネントから$emitで受け取った **isLoggedIn** というイベントをきっかけに、handleShowSidebarというメソッドを実行

- handleShowSidebarでshowSidebarプロパティをtrueにすることで、サイドバーが表示される　

```js:scafold.vue

<top @isLoggedIn="handleShowSidebar" @isLogout="handleHideSidebar"></top>
<sidebar class="sidebar-area" v-show="showSidebar"></sidebar>

<script>
  data: function() {
    return {
      showSidebar: false
    }
  },
  methods: {
    handleShowSidebar: function() {
      console.log('handleShowSidebar called')
      this.showSidebar = true
    },
    handleHideSidebar: function() {
      console.log('handleHideSidebar called')
      this.showSidebar = false
    }
  }
</script>
```

4
ログアウト時もログイン時と同じような感じ

- ログアウトしたら、ヘッダーの色をログイン前の#696969に戻す
- **isLogout** というイベントを親コンポーネントに渡し、3のhandleHideSidebarを実行して親コンポーネントのshowSidebarプロパティをfalseにし、サイドバーを非表示にする

```js:top.vue

    logoutUser: function() {
      axios
      // api/users/sessions#destroy
      .delete('/logout')
      .then((res) => {
        console.log(res.data)
        this.navbarColor = '#696969';
        this.$emit('isLogout')
        this.current_user = ''
        if (this.currentRoutePath === '/') {
          console.log('go called')
          this.$router.go({ path: this.currentRoutePath })
        }
      }, (error) => {
        console.log(error)
      })
    }
Laravelで突然jqueryが効かなくなって困ってたらbootstrapファイルが影響してたっぽい備忘録

laravel環境で便利にsassやjs、vueなんかを読みこむLaravel-mix。
使ってて突然js系の処理が動かなくなる動作にハマったので備忘録。

Laravelの
resourcesの中の
js > components
の中には

・app.js
・bootstrap.js

なんかのファイルがデフォルトであり、
「app.js」の中で外部においたjqueryや、vueファイルを読み込めたりします。
コンパイルにはlaravel-mixがあると良い感じです。
https://readouble.com/laravel/5.8/ja/mix.html
https://qiita.com/ryosukes/items/24a556b9e634c183f93b


で、CSSにbootstrapは特に使わないサイト作ってたので、この「app.js」ファイル内の
bootstrapってのコメントアウトしたら、
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287983/e385fead-7017-79e4-a120-e56a648cc57a.png)
app.jsのjqueryやvueファイルの処理においてエラーが出るようになりました。。
よくはわかんないけれど、js関連の処理も色々入っていたみたいです。
bootstrap.jsの中身。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287983/72dc01ec-abcf-1472-b086-460d157e07f7.png)


bootstrapなのでcss関連のファイルかなーと思ったのでとりあえずいらないやって非表示にしたけど、ファイル名に.jsって書いてたので怪しむべきでした。
よくわかんないままコメントアウトはしないようにしようと思いました。
VScodeでupLaTeX+dvipdfmxの環境を整えた

###概要
Atomで使っていたLaTeXをVScodeでも使えるようにしました。  
使用環境はupLaTeX+dvipdfmxです。  
まだTeXをインストールしていない人はまずそちらを先にしてください。

###基本事項
VScodeでLaTeXを扱うには、パッケージ「LaTeX Workshop」をインストールして、`command`+`,`で開けるユーザー設定の`setting.json`にビルドのrecipeを書き加えてそれを使います。  
扱いたいLaTeXの種類によってrecipeの書き方は異なります。また、色々とオプションをつけたい場合も`setting.json`に書き込みます。  

ここでは、upLaTeX+dvipdfmx環境がすでに構築されている前提のもと、TeXファイルを更新すると自動で右のpdfも更新されるような状態を作ります。
![test.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244328/5eb5e10a-eed4-a70e-4950-75e23893ef62.gif)



###手順
1.  パッケージ「LaTeX Workshop」をインストール
→https://qiita.com/zr_tex8r/items/a924be192ecea7e6bbe4
2. `command`+`,`で開けるユーザー設定のページにある<img width="28" alt=" 2019-10-05 15.01.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244328/f202e9f8-4a7c-2b9f-c086-88864ec32a71.png">マークを押して出てくる`setting.json`にbuild操作の以下を書き込む。

```json:setting.json
{
"latex-workshop.latex.tools": [{
    "name": "ptex2pdf (uplatex)",
    "command": "ptex2pdf",
    "args": [
      "-interaction=nonstopmode",
      "-l",
      "-u",
      "-ot",
      "-kanji=utf8 -synctex=1",
      "%DOC%"
    ]
  },
],
"latex-workshop.latex.recipes": [
  {
    "name": "ptex2pdf (uplatex) *2",
    "tools": [
      "ptex2pdf (uplatex)",
      "ptex2pdf (uplatex)"
    ]
  },
],
"latex-workshop.synctex.afterBuild.enabled": true,
"latex-workshop.view.pdf.viewer": "tab",
"explorer.confirmDelete": false
}
```


###基本的な使い方
いたってシンプルです。

1. texファイルを作って、最初は手動でビルドする。（左のtexマークをクリックして`COMMANDS/Build LaTeX project/Recipe:ptex2pdf(uplatex) *2`を押す）
2. 左のtexマークをクリックして`COMMANDS/View LaTeX PDF/View in VSCode tab`を押す
3. texファイルを更新して保存すると開いているpdfも更新されていく

###注意点とか
 - `setting.json`の設定が反映されない  
 →初歩的なミスですが、他の設定を以前にしていて以下のようなファイル構造になってしまっていませんか？

```json:setting.json
{
"workbench.startupEditor": "none",
}
{
"latex-workshop.latex.tools": 
...
...
..
}
```
全体が一つの{}に収まっているjsonファイルの構造になっていないと読み込んでくれません。

###最後に
別の種類のLaTeXを使っている人もrecipeが違うだけで基本的には変わらないと思います。あらゆる種類のLaTeXに対応させることもできるそうなので他の人の記事も参考にしてみてください。
離れた部屋のルータをつないで、有線LANを複数の部屋で使えるようにしたい

# はじめに
 離れた部屋のルータをつないで、有線LANを複数の部屋で使えるようにしたい
上記のように思い、下記のようなネットワーク構成を組んだ時のメモです。
 

![RouterBridging.001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94861/c12c4d7c-f7fc-980c-fa03-d87fb2911ec4.png)

# 背景
複数の部屋で有線を繋ぐ際に、今まではLANケーブルを部屋の境を通して設置していた。
引っ越した先の家には防音部屋があり、LANケーブルを設置してしまうと防音機能がほぼ無駄になってしまう。

新しく契約したNURO光ではONUとルータが一体型となっており、前に使っていたルータの使い道がなくなっていた。

# ひらめいた
ルータ同士を無線でつなげれば、いい感じにしゅしゅっと部屋間をワイヤレスにできるのではないか？
結論としてできた。

ただ、いくら情報系を先行したり、開発とかしていてもネットワーク部分って実践的な勉強をする機会があまりないように思い、同じような状況になっている人のため、またメモとして方法をまとめておく

# 解決方法
ルータ間のワイヤレス接続は、ルータについているWPS(Wi-Fi Protected Setup)という機能でサクッと実現できた。
ルータの正面などに、よくわからない下記のロゴが記載されているのを見たことがあるのではないかと思う。


![logo_01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94861/8293cf3e-c30c-aed5-e2be-240d25644bd4.jpeg)

## らくらく無線スタート、ほんとにらくらくだった件

1. 子機側のらくらくボタンを長押しして、点滅させる
2. 親機側のらくらくボタンを制限時間内に、長押しして同様に点滅させる
3. つながる！

※ルータの点滅する箇所や、制限時間は機器に依存するかもしれない
自分の場合は、それぞれ、POWERランプ、1分という値だった。

# まとめ
意外とネットワークの接続は簡素化されているが、らくらく無線スタート機能が何者か知れてよかった

そんなの知ってて当たり前じゃん、という指摘もあるかもしれませんが、個人的には全く知らない領域だったため
同じ境遇の人の参考になれば幸いです
AWS.SSM.sendCommand の罠

同じことではまらないようにするための備忘録。
# TL; DR
SSM.sendCommand で実行タイムアウトを設定する場合はこうする。

```javascript:params.js
const params = {
    InstanceIds: [ "instance_id" ],
    DocumentName: "AWS-RunShellScript",
    Parameters: {
        "commands": [
            "hoge",    // コマンド1
            "foo",     // コマンド2
            ...
        ],
        "executionTimeout": ["86400"]    // これも Array !!
    },
};
```

# 何が問題か
AWSのドキュメントでは、`commands` のタイプは `StringList` で `executionTimeout` のタイプは `String` となっている。
[AWS Systems Manager - Documents  ドキュメント名: AWS-RunShellScript](https://ap-northeast-1.console.aws.amazon.com/systems-manager/documents/AWS-RunShellScript/parameters?region=ap-northeast-1)

だから、素直に考えると、以下のようなコードを書いてしまう。

```javascript:paramsWrong.js
const params = {
    InstanceIds: [ "instance_id" ],
    DocumentName: "AWS-RunShellScript",
    Parameters: {
        "commands": [
            "hoge",    // コマンド1
            "foo",     // コマンド2
            ...
        ],
        "executionTimeout": "86400"    // 普通のString
    },
};
```
Swift 5 で読み込んだJSONを利用する

`JSONDecoder`を利用するまでの方法はたくさん掲載されているが、それらを利用する方法が載っていなかったので。

### なぜこの記事を書いたか

JSONを読み込むまでは良かったが、それを変数に代入した後、取り出すことができなかった。

具体的には下記エラーが発生したため。

```bash
# ***はアクセスしたいメンバー変数
Value of type 'Codable' (aka 'Decodable & Encodable') has no member '***'
```

### 方法

やり方は簡単で、`JSONDecoder.decode`を受け取る変数に型を指定してあげるだけです。

なお`hello.json`はプロジェクト直下に置くこととします。

```json:hello.json
{
  "hello":"world"
}
```

```swift:HelloEntity.swift
struct HelloEntity {
  var hello: String
}
```

```swift:decode.swift
func getFileData(_ filePath: String) -> Data? {
  let fileData: Data?
  do {
    let fileUrl = URL(fileURLWithPath: filePath)
    fileData = try Data(contentsOf: fileUrl)
  } catch {
    // ファイルデータの取得でエラーの場合
    fileData = nil
  }
  return fileData
}

func getJSON() {
  // forResource には拡張子を入れてはいけません
  let path = Bundle.main.path(forResource: "hello", ofType:"json")
  let data = getFileData(path)

  do {
    // ここの as! *** が重要
    let json = try! JSONDecoder().decode(HelloEntity.self, from: data!) as! HelloEntity

    print(json.hello)
    // => "world"
  }
}
```

`Xcode`は`VSCode`や`Intelli J`を使っているユーザーから見るとUI/UXが最悪ですが、めげずに頑張りましょう。
MacなしでFlutter iOSアプリをビルドしてiPad実機にインストールする

Macを持ってないけれど、iOSアプリを開発したい。
そんなときのための方法です。
Flutter×CodemagicならiPad実機だけあればできます。

## 必要なもの

1. iPad実機(中古で3万円くらい)
2. Apple ID(2ファクタ認証必須)
3. Apple Developter Program(年間12000円くらい)
4. iTunes
5. Codemagic

## Apple IDを取得

Mac知らない人は、Apple IDを持っていないと思いますので、取得します。
2ファクタ認証を有効にしないと、Apple Developer Programに登録できませんので、有効にします。
※1 2ファクタ認証が有効になるまでセキュリティ質問を使うので、忘れないようにします...
※2 2ステップ認証のSMSがなかなか飛んできませんでした...

## Apple Developer Programに登録

Apple Developer Programに登録します。
クレジットカードによるライセンス購入が必要です。

## Ad Hocに使うiPad実機を登録

Deviceの登録の際にiPad実機のUUIDが必要になります。
iTunesで確認できますのでiTunesをいれます。

1. Windows Storeなどから、iTunesをインストールします。
2. Windows PCとiPad実機をつなぎます。
2. このスマホみたいなボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44912/456fa0bc-3556-0bdd-48e7-c7a220d76217.png)
3. シリアル番号のところをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44912/c2b17a73-cc79-e006-72a4-02114750e0fd.png)
4. UUIDに変わるので、右クリックしてコピーメニューからコピーします。
5. Apple Developer ConsoleのCertificates, Identifiers & Profilesを開きます。
6. Devicesで、デバイスを追加します。
  6. Device Nameは任意、Device ID(UUID)に先ほどコピーしたUUIDをペーストします。
  7. 登録します。
8. Identifiersで、AppIDを追加します。
  9. PRODUCT_BUNDLE_IDENTIFIERに指定した文字列を設定します。

Identifiersは、アプリごとに設定することになります。

## Flutterプロジェクト

確認するだけなら、VSCodeで作成できる初期プロジェクト(カウントアップするやつ)で問題ありません。
Codemagicで連携するリポジトリに登録しておきます。

## Codemagic

Codemagicのアカウントを登録します。
https://codemagic.io/

このとき、選択した連携先が自動でAppsに登録されます。
そのまま、Start new buildを実行すれば、ビルドもできます。
ただし、その前にビルド設定をします。

1. ギヤマークを押して設定画面に行きます。
2. 必要に応じて、Testの設定を変更します。（Stop build if tests failを無効にするなど）
3. Buildの設定を開き、iOSをチェックします。ModeはReleaseにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44912/889bdf7c-b8b8-5372-d4fd-5cea71c1ced6.png)
5. Publishの設定を開き、iOS code signingにApple IDを登録します。
  1. Select code signing method: Automatic
  2. Provisioning profile type: Ad Hoc

登録が失敗したら、Apple Developerの設定がおかしいはずなので、修正します。

## iPad実機にインストール

ビルドが成功すると、Codemagicで登録したメールアドレスにメールが届きます。
メール中の～.ipaのファイルのinstallボタンを押してインストールします。

完了すると、アプリアイコンがホーム画面に現れます。
無事、実行できました。

おしまい。
Spring Boot で Rest API 構築 その2 - Failed to determine a suitable driver class エラー調査

# Outline

- [前回](https://qiita.com/sawa-@github/items/292a665fecf212ccc38a)発生していたエラー内容の調査

# エラー内容の確認と対応策の検討

## 先に結論

### エラーの原因
データソースの設定がないためエラーとなっている

### 対応策
MySQL をローカルで動くようにして Spring Boot から接続させる

### そもそもなぜこのエラーが起きたのか


前回のプロジェクト作成時に `Dependencies` にて `SQL: Spring Data JPA, MySQL Driver` を設定したため


## エラーのおさらい

Spring Boot Application 起動時に下記エラーが発生していた

```
Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
2019-08-17 23:19:54.141 ERROR 29198 --- [  restartedMain] o.s.b.d.LoggingFailureAnalysisReporter   : 

***************************
APPLICATION FAILED TO START
***************************

Description:

Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured.

Reason: Failed to determine a suitable driver class


Action:

Consider the following:

    If you want an embedded database (H2, HSQL or Derby), please put it on the classpath.
    If you have database settings to be loaded from a particular profile you may need to activate it (no profiles are currently active).


Process finished with exit code 0
```

エラー内容

> Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured.
Reason: Failed to determine a suitable driver class


日本語訳

> データソースの設定に失敗しました：「url」属性が指定されておらず、埋め込みデータソースを設定できませんでした。
理由：適切なドライバークラスを特定できませんでした


## 対応策

Action のところに書いてある

> Action:

> Consider the following:
    If you want an embedded database (H2, HSQL or Derby), please put it on the classpath.
    If you have database settings to be loaded from a particular profile you may need to activate it (no profiles are currently active).

日本語訳

> 以下を考慮してください。
    組み込みデータベース（H2、HSQL、またはDerby）が必要な場合は、クラスパスに配置してください。
    特定のプロファイルからデータベース設定をロードする場合は、アクティブ化する必要があります（現在アクティブなプロファイルはありません）。

今回は「特定のプロファイル（MySQL）」をローカル環境で動くようにして Spring Boot から接続させる

このあたりに色々と書いてある
[31. Working with SQL Databases](https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-sql.html)


# 続きの予告
- [Docker で MySQL 構築](https://qiita.com/sawa-@github/items/09d108f7b540ff86b2dc)
- Swagger を使って API の設計を行う
個人メモ：Protocol Buffers3_golangで使ってみる

# golangで、作ったprotobufを呼んで見る

## フォルダ構成
prootbufTest
|-- go\
|　　-- protoTest.go
|-- protobuf\
|　　-- Student.proto


## golang用のprotobuf作成
#### ①protobuf作成
cd \protobuf
ファイル名：`Student.proto`

```protobuf
syntax ="proto3";

message Student {
    string name = 1;
    int32 age = 2;
}
```

#### ②コンパイルし、Student.pb.goを生成
`protoc --go_out=./ Student.proto`


## protobuf参照用のgolangプログラム作成

cd ../go
ファイル名：`protoTest.go`

```golang
package main

import (
	"練習/protobuf"
	"fmt"
	"github.com/golang/protobuf/proto"
)

func main() {
	text := &Student.Student{
		Name:    "protobufTest",
		Age:20,
	}

	fmt.Println("Student情報：",text)
	// proto Marshal
	data, err := proto.Marshal(text)
	if err != nil {
		return
	}

	fmt.Println("proto Marshal後：",data)

	Stu01 := &Student.Student{}

	//	proto Unmarshal
	err = proto.Unmarshal(data, Stu01)
	if err != nil {
		return
	}
	fmt.Println("proto Unmarshal後：",Stu01)
	fmt.Println("Unmarshal後の名前取得：",Stu01.Name)
	fmt.Println("GetNameでの名前取得:",Stu01.GetName())
}
```


### 実行結果
```
Student情報： name:"protobufTest" age:20 
proto Marshal後： [10 12 112 114 111 116 111 98 117 102 84 101 115 116 16 20]
proto Unmarshal後： name:"protobufTest" age:20 
Unmarshal後の名前取得： protobufTest
GetNameでの名前取得: protobufTest

Process finished with exit code 0
```
ABC142参戦記(A問題~C問題+D問題)

先日行われたABC142に参加したのでコンテスト中のあれこれをメモしておこうかと思います。使用言語はpython3、結果はABC3完で2596位(順位表情報)でした。コンテストへのリンクはこちら→https://atcoder.jp/contests/abc142

#A - Odds of Oddness
偶奇で場合分けして偶数なら0.5,奇数なら(N // 2 + 1) / Nを表示すれば良さそうです。

```python:ABC142_A.py
N = int(input())
if N % 2 == 0:
    print(0.5)
else:
    print((N // 2 + 1) / N)
)

```

#B - Roller Coaster
K以上の人の数をカウントしていくだけですね。

```python:ABC142_B.py
N, K = map(int, input().split())
h = list(map(int, input().split()))
cnt = 0
for i in range(N):
    if h[i] >= K:
        cnt += 1
print(cnt)
```

#C - Go to School
人数が少ない時に来た子から順に登校していたということになるので、$A_i$の値でソートして$i$の値を順に表示すれば良いですね。

 ```python:ABC142_C.py

N = int(input())
A = list(map(int, input().split()))
L = [[] for i in range(N)]
for i in range(N):
    L[i] = [A[i], i+1]
L.sort()
ans = [0 for i in range(N)]
for i in range(N):
    ans[i] = L[i][1]
print(*ans)

```

#D - Disjoint Set of Common Divisors
コンテスト中にずっとバグらせていました。gcd求めてその素因数の数を調べるだけですね。素因数の調べ方に関してはコンテスト中[こちら](https://qiita.com/snow67675476/items/e87ddb9285e27ea555f8)の記事を参考にさせていただきました。



```python:ABC142_D.py
from fractions import gcd
def f(n):
    tmp = n
    cnt = 0
    i = 2
    while i <= n**0.5 + 1:
        if tmp < i:
            break
        if tmp % i == 0:
            cnt += 1
            while tmp % i == 0:
                tmp //= i
        i += 1
    if tmp != 1:
        cnt += 1
    return cnt

A, B = map(int, input().split())
g = gcd(A, B)
ans = f(g) + 1
print(ans)
```

#反省
今回はC問題まで通すことができました。時間配分は大体A-5分、B-3分半、C-5分、という感じでした。Dで数学的な部分に躓いたのが痛かったなと思います。
更新日時やファイルサイズを確認した後、lsコマンドを引数にしてアーカイブしてgzipで圧縮する

更新日時やファイルサイズを確認する
ls -ltr /system/log/AAA.txt* /system/log/BBB.txt*

実行結果

```
ls -ltr /system/log/AAA.txt* /system/log/BBB.txt*
-rw-r--r--. 1 root root 2097152  9月  2 04:00 /system/log/BBB.txt.8
-rw-r--r--. 1 root root 2097152  9月  2 04:00 /system/log/AAA.txt.8
-rw-r--r--. 1 root root 2097152  9月  2 08:00 /system/log/BBB.txt.9
-rw-r--r--. 1 root root 2097152  9月  2 08:00 /system/log/AAA.txt.9
-rw-r--r--. 1 root root 2097152  9月  3 12:00 /system/log/BBB.txt.10
-rw-r--r--. 1 root root 2097152  9月  3 12:00 /system/log/AAA.txt.10
-rw-r--r--. 1 root root 2097152  9月  3 22:00 /system/log/BBB.txt.11
-rw-r--r--. 1 root root 2097152  9月  3 22:00 /system/log/AAA.txt.11
-rw-r--r--. 1 root root 2097152 10月  2 03:00 /system/log/BBB.txt.1
-rw-r--r--. 1 root root 2097152 10月  2 03:00 /system/log/AAA.txt.1
-rw-r--r--. 1 root root 2097152 10月  2 07:00 /system/log/BBB.txt.2
-rw-r--r--. 1 root root 2097152 10月  2 07:00 /system/log/AAA.txt.2
-rw-r--r--. 1 root root 2097152 10月  2 12:00 /system/log/BBB.txt.3
-rw-r--r--. 1 root root 2097152 10月  2 12:00 /system/log/AAA.txt.3
-rw-r--r--. 1 root root 2097152 10月  2 22:00 /system/log/BBB.txt.4
-rw-r--r--. 1 root root 2097152 10月  2 22:00 /system/log/AAA.txt.4
-rw-r--r--. 1 root root 2097152 10月  3 04:00 /system/log/BBB.txt.5
-rw-r--r--. 1 root root 2097152 10月  3 04:00 /system/log/AAA.txt.5
-rw-r--r--. 1 root root 2097152 10月  3 07:00 /system/log/BBB.txt.6
-rw-r--r--. 1 root root 2097152 10月  3 07:00 /system/log/AAA.txt.6
-rw-r--r--. 1 root root 2097152 10月  3 10:00 /system/log/BBB.txt.7
-rw-r--r--. 1 root root 2097152 10月  3 10:00 /system/log/AAA.txt.7
-rw-r--r--. 1 root root 2097152 10月  4 22:58 /system/log/AAA.txt
-rw-r--r--. 1 root root 2097152 10月  4 22:58 /system/log/BBB.txt
[root@testhost tmp]#
```

lsコマンドの結果を引数にしてアーカイブして圧縮する
tar cfpvz /tmp/`date +%Y%m%d`_`uname -n`_syslog.tar.gz `ls /system/log/AAA.txt* /system/log/BBB.txt*`

実行結果

```
tar cfpvz /tmp/`date +%Y%m%d`_`uname -n`_syslog.tar.gz `ls /system/log/AAA.txt* /system/log/BBB.txt*`
tar: メンバ名から先頭の `/' を取り除きます
/system/log/AAA.txt
/system/log/AAA.txt.1
/system/log/AAA.txt.10
/system/log/AAA.txt.11
/system/log/AAA.txt.2
/system/log/AAA.txt.3
/system/log/AAA.txt.4
/system/log/AAA.txt.5
/system/log/AAA.txt.6
/system/log/AAA.txt.7
/system/log/AAA.txt.8
/system/log/AAA.txt.9
/system/log/BBB.txt
/system/log/BBB.txt.1
/system/log/BBB.txt.10
/system/log/BBB.txt.11
/system/log/BBB.txt.2
/system/log/BBB.txt.3
/system/log/BBB.txt.4
/system/log/BBB.txt.5
/system/log/BBB.txt.6
/system/log/BBB.txt.7
/system/log/BBB.txt.8
/system/log/BBB.txt.9
[root@testhost tmp]# ls -l /tmp/`date +%Y%m%d`_`uname -n`_syslog.tar.gz
-rw-r--r--. 1 root root 50485 10月  6 02:58 /tmp/20191006_testhost_syslog.tar.gz
[root@testhost tmp]#
```
Normalizerとは

今回はNormalizerの説明をする。

Normalizerとはデータをフラットにすることで実装しやすくするものである。
APIを使用する際に、同じデータを異なるレベルでネストされたものを受け取る場合があるが、そういう場合にNormalizerでフラットに一様にすることで扱いがしやすくなる。


公式サンプルによると

```
{
  "id": "123",
  "author": {
    "id": "1",
    "name": "Paul"
  },
  "title": "My awesome blog post",
  "comments": [
    {
      "id": "324",
      "commenter": {
        "id": "2",
        "name": "Nicole"
      }
    }
  ]
}
```

という複雑なデータを

```
import { normalize, schema } from 'normalizr';

// Define a users schema
const user = new schema.Entity('users');

// Define your comments schema
const comment = new schema.Entity('comments', {
  commenter: user
});

// Define your article
const article = new schema.Entity('articles', {
  author: user,
  comments: [comment]
});

const normalizedData = normalize(originalData, article);
```
というふうにすることによって

```
{
  result: "123",
  entities: {
    "articles": {
      "123": {
        id: "123",
        author: "1",
        title: "My awesome blog post",
        comments: [ "324" ]
      }
    },
    "users": {
      "1": { "id": "1", "name": "Paul" },
      "2": { "id": "2", "name": "Nicole" }
    },
    "comments": {
      "324": { id: "324", "commenter": "2" }
    }
  }
}
```
とわかりやすく、扱いやすいデータにすることができる。
combinereducer と　reduce-reducerの違い

combinereducerとreduce-reducerの違いを調べた。

combinereducersは入れ子状態のstateを作る。
一方でreducereducerはフラットで、並行したstateを作る。


combinereducersはそれぞれのreducerが自身特有のstate 
を持つ。
一方でreducereducersはどのreducerも同じstateを持つ。
そのため、同じstateを操作することを予想されているreduceを変えるときに便利である。
render処理でTemplate is missingエラー 

# 環境
Ruby:2.5.1
Rails:5.2.3

# エラー内容
Railsを使用したアプリで、指定したURIに対するページがなければ404エラー用のページを表示する処理をrenderメソッドで実装していました。
以下のように存在しないファイルを指定したところ、Template is missingエラーが発生しました。
http://localhost/notexist.xml
![TempleMissforQiita.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248561/cd765025-6384-f9b6-53ca-03b8fa591d8b.png)


# 実装内容
存在しないページが指定されるとrender_404が実行されます。

```ruby
class ApplicationController < ActionController::Base

  # 例外処理
  rescue_from ActiveRecord::RecordNotFound, with: :render_404
  rescue_from ActionController::RoutingError, with: :render_404
  
  def render_404
    render template: 'errors/error_404', status: 404, layout: 'application', content_type: 'text/html'
  end
```

# エラー原因
表示したいファイルの拡張子がhtmlであるのに対し、renderメソッドの:formatsオプションにURIで指定したxml拡張子が設定されていたためでした。
:formatsオプションはデフォルトではhtmlが指定されますが、指定したURIに拡張子があると:formatsオプションに設定されます。

参考：https://railsguides.jp/layouts_and_rendering.html#formats%E3%82%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3

# 解決方法
renderメソッドの:formatsオプションを正しく指定します。
表示したいファイルは error_404.html.erb なので、`formats: :html`を指定します。

```ruby
  def render_404
    render template: 'errors/error_404', status: 404, layout: 'application', content_type: 'text/html', formats: :html
  end
```
ipdbについてアウトプット

こんにちは！
プログラミング勉強中の大学生です。
今回はipdbについてアウトプットしていこうと思います。

##ipdbとは
Pythonにはpdbというデバッガが標準でインストールされていますが、`ipdbではより高度なpdb`が使えるみたいです。
使用するにはインストールする必要があります。
下記のコマンドでインストールすることができます。

```
sudo pip install ipdb
```

##実際に使ってみる
実際に使ってみましょう。
下記のコードをファイルを作成して書いてみます。

```
import ipdb;

print ('Hello World!')
my_var = 10 / 3
ipdb.set_trace()
print (my_var)
```

`set_trace()`と書かれているところで処理が止まります。
これを下記のコマンドで実行します。（これで実行できないときもあるみたいです）[こちら](https://www.solima.net/python/matome/ipdb)を参考にしてください。

```
python ファイル名
```

すると以下のような画面が出てきました！

```
/test.py(6)<module>()
      4 my_var = 10 / 3
      5 ipdb.set_trace()
----> 6 print (my_var)

ipdb> 

```

ipdbにもコマンドがいくつかあるみたいで[こちら]()に書いてあるので参考にしてみてください！！
僕はヘルプだけ出してみたいと思います。
「h」と入力するだけですね。
すると、下記のような画面が出てきます。

```
ipdb> h

Documented commands (type help <topic>):
========================================
EOF    c          d        help    longlist  pinfo    restart  unalias
a      cl         debug    ignore  n         pinfo2   return   unt    
alias  clear      disable  j       next      pp       run      until  
args   commands   down     jump    p         psource  s        up     
b      condition  enable   l       pdef      q        step     w      
break  cont       exit     list    pdoc      quit     tbreak   whatis 
bt     continue   h        ll      pfile     r        u        where  

Miscellaneous help topics:
==========================
exec  pdb

Undocumented commands:
======================
retval  rv

```

##まとめ
今回はipdbについてご紹介しました。
僕も正直全く使いこなせていないのでわからないことだらけです。
参考文献をのせておくので、そちらも見てください。
最後まで読んでいただきありがとうございました。

##参考文献
[ipdbの使い方](https://www.solima.net/python/matome/ipdb)

[Python debugツール ipdbの紹介](http://nonbiri-tereka.hatenablog.com/entry/2014/06/22/171504)

[JupyterまたはiPython Notebookでデバッグをする方法](https://qiita.com/makopo/items/170c939c79dcc5c89e12)
Emacsでデフォルトよりは楽にJSPを書きたい。

# 背景
EmacsでJSP(JavaServer Pages)を書くことになったけれどコード整形の設定がなかった。

# 環境
CentOS 6
GNU Emacs 23.1.1

# 方法
### STEP 1
[ここ](http://web-mode.org/)のDownloadからファイルをダウンロードする。
(僕はGithubからダウンロードしました。)
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470697/877f9d4c-e5f0-df39-da90-242fe09e15ea.png)

### STEP 2
`unzip`コマンドやツールを使って、ダウンロードしたファイルを解凍する。

### STEP 3
ホームディレクトリ(好きなところで大丈夫)に1つディレクトリを作る。

```shell:
mkdir ~/load
```
今回は`load`ディレクトリを作った。

### STEP 4
`~/load`内に解凍したファイルにある`web-mode.el`を入れる。

### STEP 5
さっきのファイルを読み込めるようにpathを通す。

```shell
emacs ~/.emacs
```

.emacsを開けたら下記のコードを入れる。
(同時にweb-mode時用のルールも入力している。今回は他の方の設定を拝借)

```scheme:~/.emacs
; パスを通す(require できるようになる。)
; 自分が作ったディレクトリへのパスを入れる。
(add-to-list 'load-path "~/load")

; web-modeの設定
(require 'web-mode)
(add-to-list 'auto-mode-alist '("\\.phtml\\'" . web-mode))
(add-to-list 'auto-mode-alist '("\\.tpl\\.php\\'" . web-mode))
(add-to-list 'auto-mode-alist '("\\.[agj]sp\\'" . web-mode))
(add-to-list 'auto-mode-alist '("\\.as[cp]x\\'" . web-mode))
(add-to-list 'auto-mode-alist '("\\.erb\\'" . web-mode))
(add-to-list 'auto-mode-alist '("\\.mustache\\'" . web-mode))
(add-to-list 'auto-mode-alist '("\\.djhtml\\'" . web-mode))
; .jsp用 実際これだけでも良いとは思う。
(add-to-list 'auto-mode-alist '("\\.jsp\\'" . web-mode))

(defun my-web-mode-hook ()
  "Hooks for Web mode."
  (setq web-mode-attr-indent-offset nil)
  (setq web-mode-markup-indent-offset 2)
  (setq web-mode-css-indent-offset 2)
  (setq web-mode-code-indent-offset 2)
  (setq web-mode-sql-indent-offset 2)
  (setq indent-tabs-mode nil)
  (setq tab-width 2))
(add-hook 'web-mode-hook 'my-web-mode-hook)
```

### STEP 6
は無いです。終わり。
`Ctrl-c Ctrl-i`でインデント綺麗にしてくれる。
他にもショートカットキーあるみたい。

# おわりに
permitの問題から、もともと`load-path`が通ってたところにファイルが置けないのでこうなりました。それとよくわからないけれど`package-install`も使えなかった。
設定を作り込めばVScodeを超えれるのでは...?(やらないけど。)

# 参考
- [公式サイト](http://web-mode.org/)
- [EmacsでReact(JSX)コーディングする環境について調べてみた](http://umi-uyura.hatenablog.com/entry/2015/05/13/214629)
- [EmacsでJSXを書くためのweb-mode設定](https://qiita.com/kwappa/items/6bde1fe2bbeedc85023e)
オブジェクト　クラス　module


# オブジェクト

- 初期設定
- メソッド

```
# 初期設定（initialize, accessor）
# メソッド

class Foo 
  attr_accessor :name, :yahoo
  def initialize(name, yahoo)
   @name = name
   @yahoo = yahoo
  end

  def hello
    @name + ":" + @yahoo
  end
  
end

foo = Foo.new("name", "yahoo")

 p foo.name
 p foo.yahoo
 p foo.hello

```

## 継承

```
class Parent

  def hello
   "hello"
  end

end

class Child < Parent

end

c = Child.new
p c.hello
```

- super

```
class Parent

  def hello
   "hello"
  end

end

パターン①

class Child < Parent
  def hello
    super
  end
end

c = Child.new
p c.hello

→ "hello"

パターン②

class Child < Parent
  def hello
    "yahoo"
  end
end

c = Child.new
p c.hello
→　yahoo

```



## クラスメソッド

- self
- class << self; end

```
class Hoge


 def self.hello
  "hello"
 end
end

p Hoge.hello

class Hoge

 class << self
  def hello
    "hello"
  end
 end
end
   
p Hoge.hello
```

## 公開非公開

- public
  - インスタンスメソッドとして呼び出せる
- private
　- インスタンスメソッドから（内部から）呼び出す
　- 内部のメソッド内で処理に使うメソッド


```
class Hoge
 def public_method
  p "public_method"
  private_method("hello")
 end

 private 

 def private_method(aa)
   "private_method" + aa
 end
end


p Hoge.new.public_method

```

## ネストした定数

- 定数
- ネスト

```

module M1
 class Hoge
  p "module"
 end
end


p M1::Hoge
→　"module"
::M1::Hoge #どっちでもいける

p ::M1.constants
→　[:Hoge]
```


## method_missing メタプログラミング 

- superで　`method_missing`をオーバーライドしてる

```

class Hoge
  def method_missing(m, *args)
    p "called:" + m.to_s
    super
  end
end

Hoge.new.kuso_method
```


## module

理由

- 単一継承をクラスはできない

```
# 多重継承？
# Hoge < Memo, Emo????

class Memo
 def aaa

 end

end

class Hoge < Memo
  include Bar

end

```

解決策

- module
  - module定義
  - include

```
module Bar
 def yahoo
  "yahoo"
 end
end

class Hoge < Memo
  include Bar

end


p Hoge.new.yahoo
```

- 実行順番

```

module M1
 def yahoo
  "M1"
 end
end

module M2
  def yahoo
    "M2"
  end
end

class Hoge 
  include M1 #実行2
  include M2 #実行1

end


p Hoge.new.yahoo
```
個人メモ：Protocol Buffers2_作成例

# protobuf作成例

## 1 Student用のprotobuf作成
```protobuf
syntax = "proto3";

// 学生情報レクエスト
message StudentRequest {
    string name = 1;
    int32 age = 2;
}

// 学生情報レスポンス
message StudentResponse{
    int32 error = 1; // エラーcode
    string errmessage = 2; // エラーメッセージ
}
```


## 2 別のメッセージ参照
```protobuf
message StudentInfo {
    // Studentメッセージを参照し、配列表記する
    repeated Student info = 1;
}
message Student {
    string name = 1;
    int32 age = 2;
}
```

## 3 メッセージの中での参照
```protobuf
syntax = "proto3";
message StudentInfo {
    // メッセージの中のStudentを参照
    repeated Student info = 1;

    message Student {
        string name = 1;
        int32 age = 2;
    }
}
```

## 4 別のメッセージの定義参照
```protobuf
syntax = "proto3";
message StudentInfo {
    repeated Student info = 1;

    message Student {
        string name = 1;
        int32 age = 2;
    }
}

// StudentInfoメッセージにネストされた定義参照
message StudentMessage {
    StudentInfo.Student info = 1;
}
```

## 5 メッセージは任意の数のネスト可能
```protobuf
syntax="proto3";
message Manager {              // level 0
    message Leader {           // level 1
        message Menber {       // level 2
            string name = 1;
            int32 age = 2;
        }
    }
}
```
例外処理


- 基本例外処理

```

begin
1 / 0 
rescue 
 p 1

end

```

- 基本　実践

```
begin 
  1 / 0 

rescue ZeroDivisionError => e

 p e.backtrace
end
```

## 例外クラス

https://docs.ruby-lang.org/ja/latest/library/_builtin.html

- StandardError
- ArgumentError
- SyntaxError
- NameError
アルゴリズムについての学び

#アルゴリズム
**アルゴリズムとは簡単にいうと、何かを作成する際の手順のことを言う。**

##線形探索法
線形探索法はあるものを探すときに、初めから直線的に探すという方法である。

この方法のメリットとしては、探したいものの規模が小さい、もしくは初めのにあるとわかっている場合には速く見つけることができる。


##二分探索法
二分探索法は、探す対象が含まれているデータを何度も二等分して、徐々に絞っていき探していくという方法である。

この方法のメリットとしては、探したいものの規模が大きい、もしくはどの辺りにあるのかの検討がついていないときに有効である。

#アルゴリズムの三大処理
アルゴリズムには基本的に三つの処理がある。
##順次処理
処理を記述した順番に実行する
##分岐処理
条件により処理の流れを変える。
##繰り返し処理
条件が成立する間処理を繰り返す。

#正当性と停止性
- アルゴリズムは、与えられた課題に対して正しい結果をもたらさなければなりません。これを、アルゴリズムの正当性と言います。アルゴリズムにおいてその時点において、満たさなければならない条件が成立しているかどうかを判定し、正当性があることを保障しなければならないのです。

- アルゴリズムの停止性とは、いかなる条件の入力値が与えられても、有限時間内に必ず正しく停止することを保証することで示されます。アルゴリズムの停止性の証明には、反復処理の終了条件の判定に使用される変数などを見て、必ず有限回数の繰り返しで終了条件が成立するいことを証明する方法があります。
VS Codeのsettings.jsonの開き方

## 方法1: 設定画面から

**1. 1. 設定画面を開く**
ショートカットキー`command + ,`(Windows: `Ctrl + ,`)または、メニューバーから`基本設定 > 設定` で設定画面を開きます。

**1. 2. 右上のアイコンをクリック**
![右上のアイコンをクリック](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113102/c8af46e1-a329-1c5a-0546-dcd66c467785.gif)
画面右上のアイコンのうち、上記のアイコンをクリックします。


## 方法2: コマンドパレットを使う
**2. 1. コマンドパレットを開く**
ショートカットキー`command + shift + P`(Windows: `Ctrl + Shift + P`)または`F1`でコマンドパレットを表示します。

**2. 2. 検索ワードを入れる**
`settings`または`設定`(日本語化済みの場合)と入力します。

**2. 3. 選択**
![open-settings-json.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113102/cc5bd9c8-448d-40ac-81a8-08107c89ad71.png)
`Preferences: Open Settings(JSON)`(日本語化済みなら`基本設定:　設定(JSON)を開く`)を選択します。 



### 補足: Macの場合

ちなみに、Macでキーボードだけで操作したい場合は`control + N`で下移動、`Control + P`で上移動すると、ホームポジションからあまり離れずに操作できます。[Apple公式サイト: Macのキーボードショートカットキー](https://support.apple.com/ja-jp/HT201236)の**書類に関するショートカット**を参考にしてみてください。

## 変更履歴
2020/10/18 コマンドパレットについて追記
[Pandas] 表中の列のデータ型を、mapを使って一気に変えてしまう

#問題

| 伝票番号 |   決済日   |
|:--:|:---------:|
|  1 | H01/09/30 |　
|  2 | H31/09/30 |
|  3 | R01/09/30 |
|  4 | R20/09/30 |
　　　・
　　　・
　　　・
　と何万件も続くデータがあります。
　この日付列の中にあるデータ、実は日付型ではなく、全部 **文字型** です。
　当然、このままだと、日付での集計や抽出はできません。

　そこで、文字型から日付型にしなければならないのですが、何万件もループを回すと遅くなってしまいます。ループを使わず、高速に置換できる方法は何かあるでしょうか？

```python:初期データ.py
import pandas as pd
dic_arr = {'伝票番号':[1,2,3,4],'決済日':['H01/09/30','H31/09/30','R01/09/30','R20/09/30']}
tpd = pd.DataFrame(dic_arr)

#最初のデータはこんな感じ
print('tpd= {}'.format(tpd) +'\n')
for i in range(0,4):
    for j in range(0,2):
        print('tpd[' + str(i) + ', ' + str(j) +']={}'.format(tpd.iat[i, j]))

```
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463205/ff141995-602c-8a3e-f546-a77ac193bf59.png)


___

#mapを使った例解

```python:map関数でデータ型を一気に塗り替える.py
import pandas as pd
from datetime import datetime

#文字列になっている日付を、日付型に変換する関数
def convate(hiduke_text):
    # デリミタ(/)で分ける
    params = hiduke_text.split('/')
    year = 0
    if params[0][0] == 'S':
        year += 1925
        year += int(params[0][1:3])
    elif params[0][0] == 'H':
        year += 1988
        year += int(params[0][1:3])
        return datetime(year,int(params[1]),int(params[2]))
    elif params[0][0] == 'R':
        year += 2018
        year += int(params[0][1:3])
        return datetime(year,int(params[1]),int(params[2]))
    else:
        return hiduke_text

dic_arr = {'伝票番号':[1,2,3,4],'決済日':['H01/09/30','H31/09/30','R01/09/30','R20/09/30']}
print('dic_arr= {}'.format(dic_arr))

#ここでワン・クッション入れないと日付型として出てくれなかったため、冗長ながらlistを噛ませました。
tpd = pd.DataFrame(dic_arr)
iterable = map(convate, tpd['決済日']) 
tpd['決済日'] = list(iterable)

#最終出力結果
print('tpd= {}'.format(tpd) +'\n')
for i in range(0,4):
    for j in range(0,2):
        print('tpd[' + str(i) + ', ' + str(j) +']={}'.format(tpd.iat[i, j]))
```
実行結果はこうなりました。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463205/7bffa25f-2e79-1faf-b52b-522ac9223bfb.png)



　自分はこのように答えを出しましたが、もっといいやり方はあるのだろうなと予測しています。

　もし、もっといいやり方、スマートな解法がありましたら、ちょっと教えていただけましたら幸いに思います。
　（というか、実際この問題に直面したから、今必死に答えを出したわけでして・・・）
Firebase Hosting 特徴

##概要
Pythonのアプリのホスト先を探していて、Firebase Hostingがどうか調べた

結論
Firebase Hostingはjavascriptとtypescriptのアプリしかサポートしてないみたい
基本的にフロントエンドAppの配信用サービスと考えられる

Go, Python, Javaなどのアプリは、GCPのCloud Runなどを使うことになりそう

## Firebaseの特徴

特徴
　・ユーザーは何も設定せずにSSL通信ができる
　・静的コンテンツであるHTML＆CSSに加えて、動的コンテンツであるExpress.jsをサポート
　・Firebase HostingはコンテンツをグローバルCDNに置く
　・世界中のCDNのSSDにキャッシュされているから、どこでも高速にコンテンツが届く
　・CLIの１コマンドでアプリを起動させられる
　・１クリックでロールバックができる

参考文献
　・https://firebase.google.com/docs/hosting

##用語の確認

###CDNとは

ファイルをダウンロード配信する技術
メリット
　・距離的に近いサーバーからダウンロードできる
　・上位サーバーが各地にあるから、OUTトラフィックが回線不足になりづらい
　・上位サーバーが複数あるから、冗長化されている
参考文献
　・https://blog.redbox.ne.jp/what-is-cdn.html

###静的コンテンツと動的コンテンツとは
内容　
　・静的コンテンツはリクエストで指定されたレスポンスのHTMLページ
　・動的コンテンツはリクエスト内のパラメータに応じて変わるレスポンスHTMLページ
参考文献
　・http://web.javastudy.biz/?p=41
Github Desktopだけでfork元の更新を取り込めた（コマンド操作不要）

GitHub Desktopで（＝Gitコマンドを直に打ち込むことなく）fork元のリポジトリの更新を追随（更新を取り込む）して同期する方法は「ない」って書いてあるように読める（※１）。でも、**GitHub Desktopのみで更新を取り込めたよ！**って話。

動作確認したGithub Desktopのバージョンは2.2.0。

fork済みの自分のリポジトリのmasterに、fork元のmasrterの最新状態を取り込む場合の操作は以下。

1. branchをmasterに切り替えておく
2. branch切り替えのところで、下段にある「`Choose a branch to merge into master`」を選択
3. 「`Ohter branches` ＞ `upstream/master`」を選択して、「Merge」のボタンを押す
    - ローカルのmasterに、fork元の最新状態が反映される（マージされる）
4. ローカルのmasterを、自分のリポジトリへPushする

以上ー。

![Merge操作を選択](https://gyazo.com/e511e5794dd242238c981be5d0b51d7e.jpeg)

![Merge元の対象を選択](https://gyazo.com/c3c481246a026bad4f851196f7ae9d19.jpeg)


※１：
公式のヘルプには、日本語も（たぶん最新だろう）英語も「更新の取り込みはサポート外。手動で」って書いてある。はて、私の受取り方の問題？上記の操作は「手動」に相当する、のか？


> GitHub Desktopには、リポジトリのフォーク、または上流リポジトリからのフォークへの同期をする機能はありません。 GitHub、またはGitHub EnterpriseでリポジトリをフォークしてGitHub Desktopでクローンすることができますが、手動で同期する必要があります。

https://help.github.com/ja/desktop/contributing-to-projects/cloning-a-repository-from-github-desktop


> GitHub Desktop doesn't include the ability to fork a repository, or sync from an upstream repository to a fork. You can fork a repository on GitHub or GitHub Enterprise and clone it with GitHub Desktop, but you will need to sync it manually.

https://help.github.com/en/desktop/contributing-to-projects/cloning-a-repository-from-github-desktop
Firebase プロジェクトの削除方法

###Firebase プロジェクトの設定を押す

<img width="637" alt="スクリーンショット 2019-10-05 17.46.41.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/ae2f0b51-ae70-4afc-870c-6ddf8503e9ce.jpeg">

###下までスクロール

<img width="933" alt="スクリーンショット 2019-10-05 17.46.59.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/98ebab7d-c519-101d-5835-0a8af2267e82.jpeg">


###理解した上で削除

<img width="677" alt="スクリーンショット 2019-10-05 17.47.12.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/78808a15-f371-93de-7950-d3f409aa4134.jpeg">
[Ionic4 Cordova9 Android]  ERR_CREARTEXT_NOT_PERMITTED

# 以下のエラーが出た時の対処方

```
Application Error
net::ERR_CREARTEXT_NOT_PERMITTED(http://localhost:8100/)
```

Android9以降ではクリアテキスト（平分）通信が許可されていないため発生する

# config.xmlに以下を追加する

`<widget ・・・>`に以下を追加

```
xmlns:android="http://schemas.android.com/apk/res/android"
```

`<platform name="android">`の下に追加

```
    <platform name="android">
        <edit-config file="app/src/main/AndroidManifest.xml" mode="merge" target="/manifest/application">
            <application android:usesCleartextTraffic="true" />
        </edit-config>
```

# 確認

```
ionic cordova run android -l
```

## バージョン情報

```
$ ionic info

Ionic:

   Ionic CLI                     : 5.4.2
   Ionic Framework               : @ionic/angular 4.10.0
   @angular-devkit/build-angular : 0.12.4
   @angular-devkit/schematics    : 7.2.4
   @angular/cli                  : 7.2.4
   @ionic/angular-toolkit        : 1.2.3

Cordova:

   Cordova CLI       : 9.0.0 (cordova-lib@9.0.1)
   Cordova Platforms : android 8.1.0
   Cordova Plugins   : cordova-plugin-ionic-keyboard 2.2.0, cordova-plugin-ionic-webview 2.5.2, (and 4 other plugins)

Utility:

   cordova-res : 0.6.0 (update available: 0.7.0)
   native-run  : 0.2.8 

System:

   Android SDK Tools : 26.1.1
   NodeJS            : v10.16.0
   npm               : 6.11.3
   OS                : Linux 4.19

```
PhpStorm で Laravel のリモートデバッグをおこなう

Homestead / Vessel 環境を前提とした手順です。

## PhpStorm 設定手順

### Xdebug 設定

- Preferences | Languages & Frameworks | PHP | Debug
  - 「Xdebug」の「Debug port」が「9000」となっていることを確認する。(デフォルト)

### リモートサーバー設定にサーバー環境設定を追加

 1. Preferences | Languages & Frameworks | PHP | Servers に、サーバーを追加する。

    |項目|Homestead|Vessel|
    |:--|:--|:--|
    |Name|Vagrant (任意)|Vessel (任意)
    |Host|localhost|localhost|
    |Port|8000|80|
    |Debugger|Xdebug|Xdebug|

 2. 「Use path mappings」をチェックし、ローカルのプロジェクトディレクトリをサーバーのディレクトリにマッピングする。

    |項目|Homestead|Vessel|
    |:--|:--|:--|
    |Absolute path on the server|/home/vagrant/code|/var/www/html|

### デバッグ設定を追加

 1. メニュー) Run > Edit Confirugations...

 1. 「+」→「PHP Remote Debug」

    |項目|Homestead|Vessel|
    |:--|:--|:--|
    |Name|Vagrant (任意)|Vessel (任意)|

 1. 「Filter debug connection by IDE key」をチェックし、以下を設定する。

    |項目|Homestead|Vessel|
    |:--|:--|:--|
    |Server|Vagrant (作成したサーバー設定を選択する)|Vessel (作成したサーバー設定を選択する)|
    |IDE key (session id)|XDEBUG_ECLIPSE|docker|

## デバッグ実行

IDE でデバッグを実行

 1. メニュー) Run > Debug 'Vagrant' (作成したデバッグ設定を実行する)  
    Debug の Debugger タブに「Waiting for incoming connection with ide key '(IDE Key)'」と表示される。

ブラウザ側

 1. Chrome に [Xdebug helper](https://chrome.google.com/webstore/detail/xdebug-helper/eadndfjplgieldjbigjakmdgkmoaaaoc?hl=ja) をインストール
 1. Xdebug helper のアイコンで「Debug」モードにする。
 1. ローカルの Web アプリにアクセスする。

## ブレークポイントの設定

ソースの行番号の右あたりをクリックすると赤丸がつく。
【Bootstrap4】スマホのときだけ改行を入れたい

# 結論： 改行したい箇所に`<br class="d-lg-none">`を入れるだけ

```html
<p>
テキストテキストテキストテキストテキストテキストテキスト<br class="d-lg-none">
テキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキスト
</p>
```


#### 解説
`d-lg-none`は「lg以上ならdisplay: noneにするよ」という意味。
モバイル幅ときはbrがそのまま適用され、lg幅（PC表示幅）に差し掛かるとbrタグにdisplay: noneが適用され、無効になる。
結果、モバイル表示では改行され、PC表示では改行されなくなる。  
  



#### 逆に、PCのときだけ改行したいときは？
下記のようにすればOK。

```html
<p>
テキストテキストテキストテキストテキストテキストテキスト<br class="d-none d-lg-inline">
テキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキスト
</p>
```  

  
これで稀によくある、クライアントからの「ここに改行いれて！」も安心だね！（白目）
tar, zipから特定のファイルのみを抽出する

# tar

```
tar xvf data.tar ./data/hoge.txt
```

- 途中のディレクトリも作成される
- 同名ファイルがあった場合は上書きされる
- 展開するファイルは何個でも指定できる

## 展開するファイル名をワイルドカードで指定したい場合

tarは引数のワイルドカードに対応していないので、`tar tf` と `grep` を組み合わせる必要がある。

```
tar xvf data.tar $(tar tf data.tar | grep '\.txt')
```

## 途中のディレクトリを作成せずカレントディレクトリに展開したい場合

`-O` または `--to-stdout`オプションをつけると標準出力に出力されるので、リダイレクトで任意の場所に保存する。

```
tar xf data.tar -O hoge.txt > hoge.txt
```

- ファイルのパーミッション等は復元されないので注意
- 複数のファイルを指定した場合はその順番通りに連結されて出力されるようだ（少し試した限りでは）

- [--strip-components count](https://stackoverflow.com/questions/14295771/how-do-i-extract-files-without-folder-structure-using-tar)というオプションもある（countの指定が面倒だけど）

# zip (unzip)

```
unzip data.zip hoge.txt
```

- 途中のディレクトリも作成される
- 同名ファイルがあった場合は、デフォルトでは上書きするか問い合わせてくる
- 展開するファイルは何個でも指定できる

zipはワイルドカードも使える。

```
unzip data.zip '*.txt'
```


## 途中のディレクトリを作成せずカレントディレクトリに展開したい場合

`-p`をつけると標準出力に出力されるので、リダイレクトで任意の場所に保存する。

```
unzip -p data.zip hoge.txt > hoge.txt
```

- ファイルのパーミッション等は復元されないので注意
- 複数のファイルを指定した場合は連結して出力されるが、順番が指定した通りとは限らないので、若干使いづらい
Rails Active Storageを使って画像のアップロード機能を実装する

# Active Storageによる画像アップロード機能の実装
### 作業内容
1. 画像変換ツールをインストール
2. Active Storageをインストール
3. userモデルにActive Storageの設定を追記

● ImageMagickのインストール
ImageMagickは、コマンドラインから簡単に画像の保存形式の変更などが出来るツールである。
ターミナルで下記のコマンドを実行。

```ターミナル
$ brew install imagemagick
```
ImageMagickがインストールできたら、```mini_magick```をインストールする。<br>gemifileに追記。

```ruby:gemfile
gem 'mini_magick'
```
追記したらbunle install

```ターミナル
$ bundle install
```
● Active Storageのインストール

```ターミナル
$ rails active_storage:install
$ rake db:migrate
```
上記のコマンドを実行すると、Active Storageが使用するテーブル用のマイグレーションファイルが作成される。
その後続けて必ずマイグレートすること。

● User.rbに追記
下記の追記をすることで、ユーザーのレコードを画像を紐づけることができる。ユーザーテーブルにカラムを追加する必要がなくなる。とても便利！

```ruby:user.rb
class User < ApplicationRecord
  #Include default devise modules. Others available are:
  #:confirmable, :lockable, :timeoutable, :trackable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable

  has_one_attached :avatar  # 追記
```

●/devise/registraions/new.html.erbの編集(例)

```ruby:/devise/registrations/new.html.erb
       # 省略
  <div class="label"><%= f.label :nickname %><br />
  <%= f.text_field :nickname %></div>
  <div class="field">
  <%= f.file_field :avatar %>
  </div>
       # 省略
```
```has_one_attached :avatar```と記述するだけでテーブルにカラムを追加しないでできてしまう。
* ストロングパラメータを追加することを忘れずに⭐️
『EveryDay Rails』でいきなりGem::GemNotFoundExceptionにハマりかけた話

# いきなりのGem::GemNotFoundException
Rspecをざっと勉強したいと思い、先日『Read Everyday Rails - RSpecによるRailsテスト入門』を購入しました。
Ruby on Railsを使ったポートフォリオの作成や、git等のこの本が前提としている知識はあるつもりだったのですが、
rspecをインストールするというまさかのポイントでハマりかけました・・・

gemfileにrspecを追記して, 鼻息荒く`bundle install`を実行。

```

Traceback (most recent call last):
        2: from /Users/username/.rbenv/versions/2.5.3/bin/bundle:23:in `<main>'
        1: from /Users/username/.rbenv/versions/2.5.3/lib/ruby/2.5.0/rubygems.rb:308:in `activate_bin_path'
/Users/username/.rbenv/versions/2.5.3/lib/ruby/2.5.0/rubygems.rb:289:in `find_spec_for_exe': can't find gem bundler (>= 0.a) with executable bundle (Gem::GemNotFoundException)
```


とりあえず`Bundler`を疑い、`bundler -v`を実行

```
% bundle -v
Traceback (most recent call last):
        2: from /Users/username/.rbenv/versions/2.5.3/bin/bundle:23:in `<main>'
        1: from /Users/username/.rbenv/versions/2.5.3/lib/ruby/2.5.0/rubygems.rb:308:in `activate_bin_path'
/Users/username/.rbenv/versions/2.5.3/lib/ruby/2.5.0/rubygems.rb:289:in `find_spec_for_exe': can't find gem bundler (>= 0.a) with executable bundle (Gem::GemNotFoundException)
```

むむっ何かBundlerがおかしい

# 結論：Bundlerのバージョンが違う

どうやら、このエラー`Bundler`のバージョンが違うことで起きるみたい。

```
% gem install bundler -v '1.17.3'
```
その後、いつも通り`bundle install`を実行

```
% bundle install
The dependency tzinfo-data (>= 0) will be unused by any of the platforms Bundler is installing for. Bundler is installing for ruby but the dependency is only for x86-mingw32, x86-mswin32, x64-mingw32, java. To add those platforms to the bundle, run `bundle lock --add-platform x86-mingw32 x86-mswin32 x64-mingw32 java`.
Fetching gem metadata from https://rubygems.org/...............
Fetching gem metadata from https://rubygems.org/..
Resolving dependencies........
・
・
・
```
YEEEAH!!!!無事にインストールすることができました！

# もう少し詳しく原因究明
@hirokik-0076さんの記事から孫引き
公式の説明（https://bundler.io/blog/2019/01/04/an-update-on-the-bundler-2-release.html）から抜粋
>Yesterday I released Bundler 2.0 that introduced a number of breaking changes. One of the those changes was setting Bundler to require RubyGems v3.0.0. After making the release, it has become clear that lots of our users are running into issues with Bundler 2 requiring a really new version of RubyGems.

ということだそうで。このサイトにも

```
Can't find gem bundler (>= 0.a) with executable bundle (Gem::GemNotFoundException)
```
のエラーが出たら

```
gem install bundler -v '1.17.3'
```

を実行したら嬉しいよーと書いてありました。めでたし。


参考：
https://bundler.io/blog/2019/01/04/an-update-on-the-bundler-2-release.html
https://qiita.com/hirokik-0076/items/c5ee73f439ee53dbe45f
railsで投稿数ランキングの作成

# 作るもの

* rails
* 質問への回答数の多い人ランキング

# 全体像

![memo-60 2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193389/5bf1726f-629e-35c7-7dfa-deefbad2d139.jpeg)


Post（質問）に対してAnswer（回答）をするのですが、この回答数が多いユーザーをランキング形式で表示したい。

# 仕様

https://qiita.com/MitsuguSueyoshi/items/18fa5e49a27e727f00b4

この記事を参考に作っていった

```
Like.group(:note_id)#まず、記事の番号(note_id)が同じものにグループを分ける
order('count(note_id) desc')#それを、番号の多い順に並び替える
limit(3)#表示する最大数を3個に指定する
pluck(:note_id)#そして最後に:note_idカラムのみを数字で取り出すように指定。
```

こんな感じにgroup化して並べていき、配列として渡す。

## 配列にnilがある場合を考慮

ただ上記のコードだと配列として渡したuser_idを聞きに行ったときにnilだった場合にfindなのでエラーが出る。そこでwhereで抽出。idをpluckで配列で渡してその配列をwhereで順番に抽出していく。

```ruby
@ranking_users = User.where(id: Answer.group(:user_id).order('count(user_id) desc').limit(3).pluck(:user_id))
```