OmniAICreator/Qiita-1.07M huggingface dataset:
SwaggerをDockerで動かしてみる(環境構築)

## 目的
- この記事はswaggerってどんなの？という興味から環境を構築することを目的としています
- 環境はMac上のDockerに構築します
- Swaggerとは？は今回は省略させていただきます
- とりあえず使うために環境を構築します

## 環境構築

### swagger-editorのイメージをpullする

```
$ docker pull swaggerapi/swagger-editor
Using default tag: latest
latest: Pulling from swaggerapi/swagger-editor
c1e54eec4b57: Pull complete
d6be30a0b011: Pull complete
3411dc04207b: Pull complete
5132fc99899b: Pull complete
dac4d9c224f9: Pull complete
1d31946306a3: Pull complete
d4515043d87f: Pull complete
066a1be8377c: Pull complete
fee7d6dc2c3f: Pull complete
a66346961765: Pull complete
c23eb21da1b0: Pull complete
Digest: sha256:bba955d2aae718727bd54c4d16733b2130ba72c79ed40ca847e83b40a8f905f8
Status: Downloaded newer image for swaggerapi/swagger-editor:latest
```

### swaggerの起動
今回はDocker側は8080ポート。mac側は10080ポートで動かすことにしました
※swaggerは8080ポートで動作しているようなので、今回はdocker側は8080ポートとしました

```
$ docker run -d -p 18180:8080 swaggerapi/swagger-editor
```

### swaggerの起動確認

```
$ docker ps
CONTAINER ID    IMAGE    COMMAND    CREATED    STATUS    PORTS    NAMES
036b88f2f7ea    swaggerapi/swagger-editor    "sh /usr/share/nginx…"    3 seconds ago    Up 2 seconds    8080/tcp, 0.0.0.0:18180->8080/tcp    adoring_cocks
```

### ブラウザで確認してみる

<img width="1102" alt="screenshot-20190724184235.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324073/44dd2b05-b418-0133-997e-5c93894a0619.png">

参考：http://tokyo.supersoftware.co.jp/code/8592
protocolでget, setと定義してもsetが出来ない、呼び出せない問題

#### 機能の拡張を行いたいと思い、とりあえず必要なものを書いていきました

``` MU.swift
protocol MU { 
  var dic: [Int: String] { get set }
  func removeAllDic()
}

extension MU {
  func removeAllDic() {
    dic.removeAll()
  }
}
```

**するとエラー**

``` MU.swift
error: cannot use mutating member on immutable value: 'self' is immutable
    dic.removeAll()
    ^~~
note: mark method 'mutating' to make 'self' mutable
  func removeAllDic() {
  ^
  mutating 

```

**言われるとおりにしてみる**

``` MU.swift
extension MU {
  mutating func removeAllDic() {
    dic.removeAll()
  }
}
```

**ビルドが通ったので呼び出してみる**

``` MU.swift
class VC {
  var dic = [Int: String]()
  func call() {
    removeAllDic()
  }
}

extension VC: MU {}
```

**するとエラーが増える・・**

``` MU.swift
error: type 'VC' does not conform to protocol 'MU'
extension VC: MU {}
^
note: candidate is marked 'mutating' but protocol does not allow it
  mutating func removeAllDic() {
                ^
note: protocol requires function 'removeAllDic()' with type '() -> ()'; do you want to add a stub?
  func removeAllDic()
       ^
error: cannot use mutating member on immutable value: 'self' is immutable
    removeAllDic()
    ^~~~~~~~~~~~
```

### 解決方法

``` MU.swift
protocol MU: class
```

これにするだけです。

mutatingはつけなくても良くなります

``` MU.swift
protocol MU: class { 
  var dic: [Int: String] { get set }
  func removeAllDic()
}

extension MU {
  func removeAllDic() {
    dic.removeAll()
  }
}

class VC: MU {
  var dic = [Int: String]()
  func call() {
    removeAllDic()
  }
  
  func add() {
    dic[0] = "0"
    dic[2] = "2"
  }
}

let vc = VC()
print(vc.dic.description)
vc.add()
print(vc.dic.description)
vc.call()
print(vc.dic.description)
```

**結果**

```
[:]
[0: "0", 2: "2"]
[:]
```

### わかったこと

詳しいことは -> [リンク](https://www.bignerdranch.com/blog/protocol-oriented-problems-and-the-immutable-self-error/)を見てみてください！

なんとなくですが、置き換えるためにmutatingを付けるだけだと、self.からアクセスしようとするが失敗してしまうけれども、 `Class-Only Protocols` にすることでOKになります。


### structに採用したい場合

``` MU.swift
protocol MU { 
  var dic: [Int: String] { get set }
  mutating func removeAllDic()
}

extension MU {
  mutating func removeAllDic() {
    dic.removeAll()
  }
}

struct VC: MU {
  var dic = [Int: String]()
  mutating func call() {
    removeAllDic()
  }
  
  mutating func add() {
    dic[0] = "0"
    dic[2] = "2"
  }
}

var vc = VC()
print(vc.dic.description)
vc.add()
print(vc.dic.description)
vc.call()
print(vc.dic.description)
```

値が変更されるところにはmutatingを付けるようにすればいいかと。
PowerShellで任意ランダムバイト列生成

テスト用の圧縮率の低い適当なデータが欲しかったのでPowerShellで作成
バイナリ列作成部分は下記を流用
http://www.vwnet.jp/Windows/PowerShell/CreateRandomData.htm

オプションに-filePath <パス> -byteSize サイズを指定して使用
例：.\任意ランダムバイト列生成.ps1 -filePath C:\ -byteSize 100MB


```任意ランダムバイト列生成.ps1
[CmdletBinding()]
Param(
    [Parameter(Mandatory=$true)]
    [string]
    #作成するファイル名
    $filePath,
    [Parameter(Mandatory=$true)]
    [long]
    #作成するバイナリファイルのサイズをバイトで指定します。
    $byteSize
)

##################################################
# セッション鍵生成
##################################################
function CreateRandomKey( [int]$ByteSize ){
    # アセンブリロード
    Add-Type -AssemblyName System.Security

    # 乱数格納配列
    [array]$KeyBytes = New-Object byte[] $ByteSize

    # オブジェクト 作成
    $RNG = New-Object System.Security.Cryptography.RNGCryptoServiceProvider

    # 鍵サイズ分の乱数を生成
    $RNG.GetBytes($KeyBytes)

    # オブジェクト削除
    $RNG.Dispose()

    return $KeyBytes
}

If($byteSize -gt 10MB){
    [int]$limit = $byteSize / 10MB
    $bytes = CreateRandomKey(10MB)
    Set-Content -Value $bytes -Path $filePath -Encoding Byte
    for($cnt=0;$cnt -lt $limit - 1; $cnt++){
        Write-Progress "書き込み進捗"　"進捗状況" -PercentComplete (($cnt/$limit)*100) -CurrentOperation "$(($cnt/$limit)*100)% 完了"
        Add-Content -Value $bytes -Path $filePath -Encoding Byte
    }

}else{
    $bytes = CreateRandomKey($byteSize)
    Set-Content -Value $bytes -Path $filePath -Encoding Byte
}

```
Delphi FmxでVcl風のSpin edit を作る方法


こんには、おひさしぶりやましょうです。


安心、安全のVclなのですが、今後のことを考えるとどうしても、Fmx化しておきたい。
（マルチプラットホーム化しておきたいと思う人間としての欲に負けてFmx化した訳です。）

#VCL
VCL時代にSPINEDIT(ちょっと拡大したから、文字とのバランスが変！）を使いたくなったのですが、
(C#でいうところのNumericUpDownってやつですね。）
![SnapCrab_NoName_2019-7-23_13-1-18_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31412/a350d333-339a-ab46-bf13-17436a3877d4.png)

#FMX
![SnapCrab_NoName_2019-7-23_13-3-50_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31412/5b095bab-dcce-bde5-257c-49ad3f2f114d.png)
なぜかUPとDOWNが左右に別れるんですよね！
これ人間工学的には非常にわかりづらいのです。

ちなみにTIME EDITだとすべて右にくるのです。
![SnapCrab_NoName_2019-7-23_13-6-46_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31412/dee90e1e-60c3-2ac5-4cdd-c854d0ae34e7.png)

#さてどうする。
Time editのスタイルシートを見てみます。
![SnapCrab_NoName_2019-7-23_13-9-33_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31412/7a226167-393e-1c19-03bd-e4a8f39b3a9b.png)
構造をみるとimeEditspin1spinBottomButton1とimeEditspin1spinTopButton1でup/downがコントロールされていることがわかりますね。

#変更の方法

##1.SpinBoxを配置!

![SnapCrab_NoName_2019-7-25_12-38-27_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31412/2c74ddb8-1e3d-dbdc-f986-a9c1bbb3e7f3.png)
さらに右クリックして、カスタムスタイルの編集
![SnapCrab_Project6 - RAD Studio 102 - Unit4_2019-7-25_12-42-27_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31412/258b5751-5d9a-e771-a06b-c3cd126ebb73.png)

##2.別のdelphiを開いてTtimeを配置!
さらに右クリックして、カスタムスタイルの編集とする。
![SnapCrab_Project5 - RAD Studio 102 - Unit3_2019-7-25_12-43-21_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31412/ce4cdba4-b0dc-f47f-5794-2c4cc1a982e9.png)


##3spinboxのSpinBox1Style1にTimeEdit1Sytle1のGridrayout部をコピー
画像撮り忘れ略

##4.spinboxのSpinBox1Style1のplusbutton とminusbuttonを削除
削除のため省略

##5.spinboxのSpinBox1Style1にコピーしたGridrayout部のボタンのstylenameの名称を変更
upbutton=>plusbutton
downbutton=>minusbuttonに変更
![SnapCrab_NoName_2019-7-25_12-50-31_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31412/a86cd667-3754-f640-e72f-d9914b40a2a0.png)
理由：procedure TStyledSpinBox.ApplyStyleでこの名称で判定しているから

##6.spinboxのSpinBox1Style1にTimeEdit1Sytleのボタンイメージをコピー
imeEdit1Style1spintopbutton1とimeEdit1Style1spinbottombutton1を最上位にコピーし
SytylenameをSpinBox1Style1Spintopbutton1SpinBox1Style1Spinbottombutton1に変更
そして、各visibleをfalseとする。

##7.plusbutton とminusbuttonのStylelookup先を変更
plusbutton 　:SpinBox1Style1Spintopbutton1
minusbutton  :SpinBox1Style1Spinbottombutton1

##8.SpinBox1Style1spinrightbutton1/SpinBox1Style1spinleftbutton1を削除
SpinBox1Style1spinrightbutton1/SpinBox1Style1spinleftbutton1を削除します。
![SnapCrab_NoName_2019-7-25_12-56-44_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31412/ee1d4a75-fe86-9012-c363-7248a772ce74.png)

##9.完成
![SnapCrab_NoName_2019-7-25_13-4-3_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31412/fa9e9329-b1f2-1d6a-208f-6d7c39b96d31.png)

##10.動作確認＆感想
![SnapCrab_NoName_2019-7-25_13-21-47_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31412/0491f047-30ff-d0d2-1bdb-bb990c9a5a02.png)
コードを一切書くことなくできたのですが、
結構面倒です。
だれか？簡単なやり方教えてください。
タスクスケジューラがAWSへ移行出来ない時の対処法

##この記事について
オンプレからAWSへサーバを移行する(V2C)時に生じました。
タスクスケジューラに関するエラーへの対処法を記します。

##前提状況
使用したもの
オンプレ環境：Windows2012 R2
AWS：AMI

手法
shell文を使ってタスクスケジューラ登録を行います

##生じたエラー
shellを実行したにも関わらず、AMIに反映されない。。。

##対処法
タスクスケジューラ名の中に半角のかっこ()が入っていることが原因でした。
既存名に半角かっこがある場合は全角かっこにしてからshellを実行すると良いです。


備忘録として記述しました。
誰かのお役に立てれば幸いです。
/etc/rc.localと/etc/rc.d/rc.localの違い


# 環境
CentOS7.6

# 結論

/etc/rc.localは/etc/rc.d/rc.localのシンボリックリンク。

```bash
# ls -l rc.local
lrwxrwxrwx 1 root root 13 Dec  4  2018 rc.local -> rc.d/rc.local
```
# rc.localとは

OS起動時に実行したい処理を記述するファイル。


# 蛇足
CentOS7 OS起動時 処理とかでググると、
/etc/rc.local に書けばいいって書いてる記事と
/etc/rc.d/rc.local に書けばいいって書いてる記事がある。

どっちに書けばええんや！と思ってググってみたけど決定的な情報は見つからんかった。

しかしls -l 叩いてみたら一目瞭然でした。。
ググる前に実機見ろって話でした。

おしまい
HOWの前にWHAT

ここは、技術者（特に若い技術者）が、お互いに技術知識（特にプログラミング知識）を共有しあうコミュニティですよね。社会は、無数の無名の地上の星によって支えられていて、ここはそういう人たちがお互い高めあうところ。

ですが、技術は所詮、手段です。

若いIT青年とのやりとり
「IT身に着けて、将来、何をやりたいの？」「...　いま、模索中なんです」
「Pythonを勉強して、何するの？」「...」

このコミュニティの趣旨にあえて反する主張ですが、ここに集まる方々に訴えたいことがある。

プログラミングは、昔でいえば、読み書きそろばん。そこがしっかりしていないと、その先が成り立たないのはわかっています。が、その前に、技術者には、「何のため」ということを考えてほしい。個々の技術は、役立ちます。しかし、何のためにということを定義することは、もっと深く社会に影響を与えることができます。

日本の教育は伝統的に「読み書きそろばん」。教育は、教科書という書き物を読み、手習い（書きとり）を繰り返す。公式を読み、暗記する。そのように手段を偏重してきました。その結果、社会に出て、ビジネスの場面でも、会議の前に議題を書いて、紙に印刷して、配り、それを読み、書いてあることの質疑応答。慣れた手段を使っていれば、OK。議論の代わりに、書いて読むだけ。読み書きそろばんは、今どきは、プログラミングという方法に化けています。もっと、生きた会話と議論を中心に据えるべきでしょう。もっと、ゼロから考えることを重視すべきでしょう。

日本には、手段にたけた秀才は、たくさんいる。しかし、リーダーは少ない。手段にたけた秀才が多いため、日本は、1990年頃までは、すでにあるものを真似し、すぐにキャッチアップして、よりいいものを出して成功することができた。最近でも、流行を追う若者が多く、失望します。手段が得意な反面で（その故に）、日本は、世界のフロンティに立ったとき、どこを目指すの？という点で存在感を示せずに、今では、素材屋・部品屋に、成り下がってしまっています。計算機科学でも同じで、チューリング賞受賞者に、日本人は一人もいない。IT産業界でも同じで、マイクロソフト、グーグル、アップル、アマゾンなど現在のITをリードしてきた企業に、日本企業はない。

読み書きそろばんプログラミングという手段の前に、何のため、何を、を考えるリーダーが少ないからだと思う。手段（Deep Learningとかなんだとか）は、お勉強が得意な秀才さんに任せておけばいいんです。今、日本にもっとも欠けているのは、何もないところから、どこを目指すかの地図を描けるリーダーだと思う。

そういう思いを背景に、WHATを考えるリーダーが育ってほしいと思い、
https://yo-sato.com/hmc/ja/edu.html
に、ITを志す若い人（カレッジ３，４年向け）に、知ってほしいことを書きました。

ぜひ、一瞥してやってほしい。
AtCoder Regular Contest 012 五目並べチェッカー

# 五目並べチェッカー
https://atcoder.jp/contests/arc012/tasks/arc012_3

```python

def checker(grid):
    grid_size = len(grid)
    def combo(arr):
        max_combo = 0
        curr = '.'
        for i in arr:
            if i in ['o', 'x']:
                if curr == i:
                    combo += 1
                else:
                    combo = 1
            else:
                combo = 0
            curr = i
            max_combo = max(max_combo, combo)
            if max_combo > 4:
                return True
        return False
 
 
    def count(grid):
        black_cnt = 0
        white_cnt = 0
        for each_row in grid:
            for i in each_row:
                if i == 'o':
                    black_cnt += 1
                elif i == 'x':
                    white_cnt += 1
        if black_cnt == white_cnt:
            return 'x'
        elif black_cnt == white_cnt + 1:
            return 'o'
        else:
            return False
 
 
    def check(grid):
        for arr in grid:
            if combo(arr):
                return True
 
 
        for i in range(grid_size):
            arr = ''
            for j in range(grid_size):
                arr += grid[j][i]
                if combo(arr):
                    return True
 
 
        append_list = ''
        for i in  range(grid_size):
            append_list += '.' 
        field = [append_list + grid[i] + append_list for i in range(grid_size)]
 
 
        for i in range(grid_size * 2):
            arr = ''
            for j in range(grid_size):
                arr += (field[j][j+i])
                if combo(arr):
                    return True
 
 
        for i in range(grid_size * 2):
            arr = ''
            for j in range(grid_size):
                arr += (field[j][grid_size - j + i])
                if combo(arr):
                    return True
        return False
 
 
    if not count(grid):
        return 'NO'
    else:
        last_player = count(grid)
        
 
    if not check(grid):
        return 'YES'
    else:
        for i in range(grid_size):
            for j in range(grid_size):
                if grid[i][j] == last_player:
                    new_grid = grid[:i] + [grid[i][:j] + '.' + grid[i][j+1:]] + grid[i+1:]
                    if not check(new_grid):
                        return 'YES'
        return 'NO'
 
    
print(checker(list(input() for i in range(19))))
```
Semantic HTML

#What is Semantic HTML?

Recently, I have learnt about **semantic html**, It is really important to all web developer to know about it. We all love to use `<div>` and we used so many `<div>` tags. It works fine with `<div>` but there are some problems:
- **Meaningless**: it tells nothing about its content
- **Accessibility**: it doesn't make any useful info about the structure of the document
- **Readability**: to understand the code, we need to read the each an every class name 

Example of **Semantic elements:** `<header>`, `<main>`, `<nav>`, `<section>`, `<article>`

Example of **Non semantic elements:** `<div>`, `<span>`

Semantic HTML is HTML that introduces meaning to the web page rather than just presentation. For example, a `<h1>` tag indicates that the enclosed most important header text and `<p>` tag indicates the text is a paragraph.

#Why semantic html?

semantic element clearly describes its meaning to both the browser and the developer. By adding semantic tags to your document, you provide additional information about that document, which aids in communication. Specifically, semantic tags make it clear to the browser what the meaning of a page and its content is. That clarity is also communicated with search engines, ensuring that the right pages are delivered for the right queries.

#Semantic layout

```html
<!DOCTYPE html> 
<html> 
<head>
  <meta charset="utf-8" />
  <title>Title</title>
  <link href="stylesheets/style.css" rel="stylesheet" />
</head>
<body>
  <header>
    <img src="logo.png" alt="logo"> 
    <nav>
      <ul>
        <li><a href="#">Menu Option 1</a></li>         
        <li><a href="#">Menu Option 2</a></li> 
      </ul>
    </nav>
  </header> 
  <main>
  <section> 
    <article>
      <header>
        <h1>Article #1</h1>
      </header>
      <section> 
        This is the first article. 
      </section>
    </article> 
    <article>
      <header>
        <h1>Article #2</h1>
      </header>
      <section> 
        This is the second article. 
      </section> 
     </article> 
   </section> 
   <aside> 
     <figure>
       <img width="100px" height="100px" src="image.jpg" alt="square" /> 
       <figcaption>square</figcaption>
     </figure> 
   </aside> 
  </main>
  <footer>Footer</footer> 
</body>
</html>

```
プロセスを殺す

### コマンド名からプロセスを殺す

<!-- https://stackoverflow.com/questions/160924/how-can-i-kill-a-process-by-name-instead-of-pid -->

#### linux の場合

```bash
pkill <コマンド名>
```

#### busybox の場合

```bash
kill `pidof <コマンド名>`
```

または

```bash
pidof <コマンド名> | xargs kill
```

`test/daemon &` とか起動した場合でもコマンド名は `daemon` で指定して良い。
Linuxするべからず集

# やって困ったことあれこれ

## coreutilsをアンインストールする
### どうなるか？
lsコマンドがなくなる。
rpmコマンドもyumコマンドもなくなる。
新規SSH接続すらできなくなる。
何もできなくなる(´・ω・｀)

### coreutilsに含まれるもの
ひとまず [coreutilsに何が入っているのか](http://hiroyukim.hatenablog.jp/entry/2015/03/22/000551) を参照。
あとで自分でも調べておこう(´・ω・｀)

## 仮想マシンのメモリ割り当てを下げる
### どうなるか？
Oracleなどをインストールしている場合、起動しなくなることがある

### どうしよう？
メモリ設定を元に戻そう。
リソース不足で難しいなら [メモリ関連のパラメータなどを誤設定してしまったためにOracleインスタンスが起動しなくなってしまった場合の対処](https://qiita.com/mako24/items/21900ba03a0a6188b0dd) あたりを確認してOracleに割り当てるメモリを下げよう。
Rails6 のちょい足しな新機能を試す59（ActiveRecord where編）

# はじめに

Rails 6 に追加されそうな新機能を試す第59段。 今回は、 `ActiveRecord where` 編です。
Rails 6 は、ActiveRecord の `where` がRuby 2.6 で導入された開始のない Range に対応しました。

Ruby 2.6.3, Rails 6.0.0.rc1 で確認しました。Rails 6.0.0.rc1 は `gem install rails --prerelease` でインストールできます。

```shell
$ rails --version
Rails 6.0.0.rc1
```

# User モデルを作る

User モデルを作ります

```shell
$ bin/rails g model User name, birth_at:datetime
```

# User モデルを修正する

scope で、2001年以降に生まれた人を検索できるようにします。
このとき `(Time.new(2001, 1, 1)..)` と Range の終端が指定されていないことに注意してください。

```ruby:app/models/user.rb
class User < ApplicationRecord
  scope :second_millennium_after, -> { where(birth_at: (Time.new(2001, 1, 1)..)) }
end
```

# seed データを作成する

seed データを作成します。 2001/01/01 より前の誕生日の人と2001/1/1以降の誕生日の人を用意します。

```ruby:db/seeds.rb
User.create(
  [
    { name: 'Taro', birth_at: '2001-01-01' },
    { name: 'Hanako', birth_at: '2002-09-15' }
  ]
)
```

# マイグレーションして seed データを作成する

```shell
$ bin/rails db:create db:migrate db:seed
```

# rails console で確認する

`rails console` を実行して確認します。

```irb
irb(main):001:0> User.second_millennium_after.to_a
  User Load (0.7ms)  SELECT "users".* FROM "users" WHERE "users"."birth_at" >= $1  [["birth_at", "2001-01-01 00:00:00"]]
=> [#<User id: 2, name: "Hanako", birth_at: "2002-09-15 00:00:00", created_at: "2019-07-14 05:59:20", updated_at: "2019-07-14 05:59:20">]
```

# 試したソース

試したソースは以下にあります。
https://github.com/suketa/rails6_0_0rc1/tree/try059_where_endless_range


# 参考情報

* [What is new in Rails 6.0](https://bogdanvlviv.com/posts/ruby/rails/what-is-new-in-rails-6_0.html)
* [Support endless ranges in where](https://github.com/rails/rails/pull/34906)
【Android】アプリのバージョンコードを取得する（API レベル 28+）

## はじめに

新規アプリは2019/8、既存アプリは2019/11から[API レベル 28+ をターゲットとする](https://developer.android.com/about/versions/pie/android-9.0-changes-28?hl=ja)ことが必須になりました。
その対応中に気付いたので記事にしておきます。
## PackageInfo.versionCodeが非推奨

versionCodeはAPI レベル 28から非推奨になりました。
![screen_shot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90107/5b175e05-56a2-ba6f-4593-5b9e45adda8e.png)

## 対応
なので、[リファレンス](https://developer.android.com/reference/android/content/pm/PackageInfo.html#getLongVersionCode())に沿って対応します。

### 自力で書く場合

```kotlin
fun getLongVersionCode(context: Context): Long {
    val packageInfo = context.packageManager.getPackageInfo(context.packageName, 0)
    return if (Build.VERSION.SDK_INT >= 28) packageInfo.longVersionCode else packageInfo.versionCode.toLong()
}
```

### android.support.v4使用

```kotlin
fun getLongVersionCode(context: Context) =
    PackageInfoCompat.getLongVersionCode(
        context.packageManager.getPackageInfo(context.packageName, 0)
    )
```

## 感想
ついフォアグラウンドサービス対応とかに目が行ってしまいますが、こういう箇所も地味に対応していかないといけないようですね。
そしてお決まりのBuild.VERSION.SDK_INTでの分岐。。。
Railsの、bundle install でmysql2で失敗する（１分で解決する方法）

## 現象
今まで同じパソコン（環境）で、新しくRailsのプロジェクトを作成したら、`bundle install` の時に以下のようなエラーが出た。最近毎回ここでつまずくので、忘れないようにメモしておきます。

``` gem_make.out
current directory: /Users/hoge/projects/test/vendor/bundle/ruby/2.4.0/gems/mysql2-0.5.2/ext/mysql2
/Users/hoge/.rbenv/versions/2.4.0/bin/ruby -r ./siteconf20190725-32260-xmt1vk.rb extconf.rb
checking for rb_absint_size()... yes
checking for rb_absint_singlebit_p()... yes
checking for rb_wait_for_single_fd()... yes
-----
Using mysql_config at /usr/local/bin/mysql_config
-----
checking for mysql.h... yes
checking for errmsg.h... yes
checking for SSL_MODE_DISABLED in mysql.h... yes
checking for SSL_MODE_PREFERRED in mysql.h... yes
checking for SSL_MODE_REQUIRED in mysql.h... yes
checking for SSL_MODE_VERIFY_CA in mysql.h... yes
checking for SSL_MODE_VERIFY_IDENTITY in mysql.h... yes
checking for MYSQL.net.vio in mysql.h... yes
checking for MYSQL.net.pvio in mysql.h... no
checking for MYSQL_ENABLE_CLEARTEXT_PLUGIN in mysql.h... yes
checking for SERVER_QUERY_NO_GOOD_INDEX_USED in mysql.h... yes
checking for SERVER_QUERY_NO_INDEX_USED in mysql.h... yes
checking for SERVER_QUERY_WAS_SLOW in mysql.h... yes
checking for MYSQL_OPTION_MULTI_STATEMENTS_ON in mysql.h... yes
checking for MYSQL_OPTION_MULTI_STATEMENTS_OFF in mysql.h... yes
checking for my_bool in mysql.h... yes
-----
Don't know how to set rpath on your system, if MySQL libraries are not in path mysql2 may not load
-----
-----
Setting libpath to /usr/local/Cellar/mysql/5.7.18/lib
-----
creating Makefile

To see why this extension failed to compile, please check the mkmf.log which can be found here:

  /Users/hoge/projects/test/vendor/bundle/ruby/2.4.0/extensions/x86_64-darwin-16/2.4.0-static/mysql2-0.5.2/mkmf.log

current directory: /Users/hoge/projects/test/vendor/bundle/ruby/2.4.0/gems/mysql2-0.5.2/ext/mysql2
make "DESTDIR=" clean

current directory: /Users/hoge/projects/test/vendor/bundle/ruby/2.4.0/gems/mysql2-0.5.2/ext/mysql2
make "DESTDIR="
compiling client.c
compiling infile.c
compiling mysql2_ext.c
compiling result.c
compiling statement.c
linking shared-object mysql2/mysql2.bundle
ld: library not found for -lssl
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [mysql2.bundle] Error 1

make failed, exit code 2
```
## 環境
- macOS Mojave 10.14.5
- ruby 2.4.0
- Rails 5.0.1

## 対処方法
コンパイルする際に必要なライブラリやインクルードファイルの指定を、バンドルの設定をローカルの環境に合わせて追加する。

``` ./bundle/config
BUNDLE_BUILD__MYSQL2: "--with-ldflags=-L/usr/local/opt/openssl/lib --with-cppflags=-I/usr/local/opt/openssl/include"
```
【Pythonエラー】Pandas Dataframeカラム名指定でKey Error→カラム名確認して原因特定

# エラー解決の流れ
PandasのDataframe操作でカラム名（列名）指定をしてデータを抽出しようとしたら、
Key Errorでうまくいかない
⇒Dataframeを確認してその通りに入力してもうまくいかない
⇒カラム名を確認したらカラム名の末尾にスペースが入っていたことが判明
⇒スペースを入れて指定したらKey Error解決
⇒スペースを消して次回も同様のErrorが出ないよう対策

## 環境・前提

- Python3
- Windows10
- Jupyter Notebookでテスト
- 使用したデータ：日本語のカラム名を含むExcelデータをDataframeに変換したもの

## Errorの内容とハマった原因
### 
PandasのDataframe操作で、
df.loc[:,['カラム名']]を指定したときのKey Error
※df: データフレーム名

再現のため、Irisデータセットを使用します。

◇元のデータ

```python:python3
from sklearn.datasets import load_iris
iris = load_iris()
df = pd.DataFrame(iris.data, columns=iris.feature_names)
print(df.head(3)) # Dataframeの確認
print(df.columns) # カラム名の確認
```

【実行結果】

|| sepal length (cm) | sepal width (cm) |petal length (cm) | petal width (cm)
| --- |--- | --- | --- | --- 
0|5.1 |3.5 |1.4 |0.2 |
1 |4.9 |3.0 |1.4 |0.2 
2 |4.7 |3.2 |1.3 |0.2 

```python:実行結果
Index(['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)',
       'petal width (cm)'],
      dtype='object')
```
---
ここで、カラム名の末尾にスペースを入れてみます

```python:Python3
# カラム名の末尾にスペースを3つ入れる
df2 = df.rename(columns=lambda s: s.replace(")", ")   "))
print(df2.head(3)) # Dataframeの確認
```

【実行結果】

|| sepal length (cm) | sepal width (cm) |petal length (cm) | petal width (cm)
| --- |--- | --- | --- | --- 
0|5.1 |3.5 |1.4 |0.2 |
1 |4.9 |3.0 |1.4 |0.2 
2 |4.7 |3.2 |1.3 |0.2 

ここで注目してほしいのは、
**Dataframeの方では末尾のスペースが反映されない**ということ！

なので、Dataframeでカラム名を確認して、
Dataframe通りのカラム名を指定してデータを抽出しようとすると･･･

```python:Python3
dfi2.loc[:3, 'sepal length (cm)']
```

```python:実行結果
KeyError: 'the label [sepal length (cm)] is not in the [columns]'
```

Key Errorが返ってきてしまいます( ；∀；)

## 対処法

カラム名を確認する方法を見つけて、確認してみたら、
末尾にスペースが入っていたことが判明しました。

```python:Python3
print(df2.columns) # カラム名の確認
```

```python:実行結果
Index(['sepal length (cm)   ', 'sepal width (cm)   ', 'petal length (cm)   ',
       'petal width (cm)   '],
      dtype='object')
```

そこで、df2.columnsで確認した通りに
末尾にスペースを入れたカラム名を指定してデータを抽出すると･･･

```python:Python3
dfi2.loc[:3, 'sepal length (cm)   ']
```

```python:実行結果
0    5.1
1    4.9
2    4.7
3    4.6
Name: sepal length (cm)   , dtype: float64
```

無事抽出することができました☆

## 今後の対策

仕事で使うExcelやCSVのデータは、Excelで開いたときの視認性をよくするために、
改行やスペースが入っていたりして、それが原因でデータ処理の際にエラーが発生することがあります。

カラム名指定の際にいちいちスペースの確認をするのは面倒なので、
あらかじめカラム名のスペースを削除したデータを新しく作成し、
こちらをデータ処理に使用することにしました！

```python:Python3
# カラム名のスペースを削除
df3 = df2.rename(columns=lambda s: s.replace(" ",""))
print(df3.columns)
```

```python:実行結果
Index(['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)',
       'petal width (cm)'],
      dtype='object')
```

```python:Python3
# df3をCSV形式で出力
df3.to_csv("./iris.csv", encoding='shift-JIS',index=False)
# オプションについて
# encoding='shift-JIS' → 元のデータは日本語を含むのでshift-JISでエンコーディング
# index=False → 開始列の0,1,2...を出力しない
```

【実行結果】
Pythonファイルと同じフォルダに、iris.csvが作成される。

## 参考文献

- [pandas データフレームの行名・列名の参照と変更と追加](https://to-kei.net/python/data-analysis/pandas-index-columns/)
- [pandas.DataFrameの行名・列名の変更](https://note.nkmk.me/python-pandas-dataframe-rename/)
- [Pythonのlambda（ラムダ式、無名関数）の使い方](https://note.nkmk.me/python-lambda-usage/)
[python]Seabornライブラリのリファレンス

# [python]Seabornライブラリのリファレンス
seabornとは､**matplotlibと同様にデータの可視化を行うライブラリ**であり､**matplotlibのラッパー（機能を拡張する役割を担うソフトウェア）**です｡もともとのmatplotlibよりも､**シンプルなコードで見た目のきれいな図を出力することができるようになります｡**ちなみに､プログラムの上では慣習的に**sns**と略されます｡

##前準備
説明用のデータの読み込みなど前準備

```
# ライブラリのインポート
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
% matplotlib inline

# データセットの読み込み
from sklearn.datasets import load_boston
boston = load_boston()

# どんな説明変数があるのかを確認
columns = boston.feature_names
print(columns)

# Pandasのデータフレームに変換
df_data = pd.DataFrame(boston.data, columns=boston.feature_names)
df_target = pd.DataFrame(boston.target, columns=['MEDV'])
df = pd.concat([df_data, df_target], axis=1)

# 特徴量の数が多いので､locメソッドで一部の特徴量のみを選択
df_pickup = df.loc[:, ['LSTAT', 'INDUS', 'DIS', 'RM', 'MEDV']]

```

## 散布図行列を出力
散布図行列とは**複数の変数の組み合わせに対して､散布図とヒストグラムを出力したグラフ**のことです｡右下がりの対角線上にヒストグラムが並び､それ以外の場所には対応する2変数についての散布図が出力されています｡これによって､それぞれの変数の分布と､複数の変数同士の関係性をひと目で把握することができます｡重要なのは､**データに表れているパターンから現実の様子を読み取ろうとする姿勢です｡**

```
# 散布図行列を出力
# locメソッドで一部の特徴量だけをピックアップ
import seaborn as sns
sns.pairplot(df_pickup, size=2.0)
plt.show()
```

##ヒートマップの表示
ヒートマップとは､**たくさんの数字の羅列を色付きのマップに映し出す手法**です｡前章でお見せしたイメージのように､**相関係数の値を赤と青の色の濃さで置き換えて表示してくれます｡**これによって､相関係数行列をぐっと見やすく表示することができます｡

参考サイト：
https://note.nkmk.me/python-seaborn-heatmap/

```
# ヒートマップの表示
# annot : 数値を表示するかどうか(annotation)
# square: 四角を正方形に合わせるかどうか
# fmt   : 表示する数値の形式(formatting)
sns.heatmap(df.corr(), annot=True, square=True, fmt='.2f')
plt.show()
# 目的変数MODVに対して、説明変数LSTATとRMは相関係数が大きい⇒関係が強い
```
HugoとGitHub-pagesでポートフォリオ公開しようとしてハマったところ

# はじめに

Hugo と GitHub-pages でポートフォリオを公開しようとしてハマったので、備忘録をかねて投稿します。

Hugo 初使用ということもあり、かなりアホなところでハマりましたが、
似たような部分でひっかかる人のためになればと思います。


## 前提条件
- [Hugo 0.55.6](https://github.com/gohugoio/hugo/releases/tag/v0.55.6) を使用
- [academic](https://themes.gohugo.io/academic/) テーマを使用
- GitHub-pages 上で 公開
- `docs` ディレクトリ内に静的ファイルを出力



# ハマった部分

1. Hugo は Hugo と Hugo extended がある
2. academic テーマの GitHub レポジトリのどれを使うか
3. Hugo の設定ファイル（academic テーマに限る？）

# Hugo は Hugo と Hugo extended がある

後述のacademic テーマを使ってポートフォリオ作るぞ！とした最初にぶつかったのがこれです。

思わず「通常版だとできないんかーい！」と言いました。

もっとも、extended 版をダウンロードしてパスを通した場所に置けば終わりなので、実時間としては数分で解決しました。


# academic テーマの GitHub レポジトリのどれを使うか

academic テーマにの GitHub 上のレポジトリには、少なくとも以下の二つが存在します。

- テーマそのものである [hugo-academic](https://github.com/gcushen/hugo-academic)
- テーマを実際に使用したサイト構築キックスターター [academic-kickstart](https://github.com/sourcethemes/academic-kickstart)

これらを混同してしまうと、ディレクトリ階層構造がグチャグチャになり、頭の中もグチャグチャです。

最初に複数の情報源を参考にした際、ある情報源では欠けている情報を別の情報源で補完しようとした結果、見事にひっかかりました。

ちゃんと公式の説明を読めば一発です。実際、私も公式情報を見ることですぐに解決できました。「おとなしく公式情報見ろ」の典型例ですね。

「動けばいいんだよ」勢は「動けばいいけど動かないんだぜ」勢になりかねないので、
「まず公式見ろ」を心がけます。

[公式ドキュメントが読まれない こんな世の中じゃ ポイズン(Qiita)](https://qiita.com/mima_ita/items/9a002f772e5789bd682f)

# Hugo の設定ファイル（academic テーマに限る？）

## 症状

ルートディレクトリに置いた `config.toml`中の baseURL が何故か静的ファイルに反映されず、うんうん唸っていました。

```toml
baseURL = "(URL)"
```

これが上手くいかないと、CSSやJavaScriptが上手く読み込めないので、まともにページが表示されません。


### バグ取り過程

バグ取り過程です。結論だけ知りたい方は、跳ばしてください。

- 他の設定項目は反映されているのか   
静的ファイル出力先の設定は反映されていました。つまり、同ファイル中の以下の設定は反映されています。

```toml
# Publish directory
publishDir = "docs"
```  

このことから、設定ファイルそのものは正しく読み込まれていることが分かりました。

- hugo コマンドで直接baseURLを指定すると改善するか  
改善しました。以下のようにbaseURLを指定すると、CSSやJavaScriptのパスが正しくなりました。

```bash
hugo  -b (URL)
```

このことから、**別の設定ファイルによって一部の設定が上書きされている**と予想しました。


## 原因 

academic-kickstart にある `config/_default/config.toml` が原因でした。

この設定ファイル中の

```toml
baseURL = "/"
```
によって、baseURLが上書きされていました。

ただ、`config/_default/`内の設定ファイル群を移動もしくは削除すると、以下のように`alert`がないと言われました。

```
Error: Error building site: "content/home/publications.md:69:1": failed to extract shortcode: template for shortcode "alert" not found
```

## 解決策

結局、一番手っ取り早い方法として、`config/_default/`の中にある各種設定ファイルに、`config.toml`の中の設定を映しました。

本来であればもっと賢い方法があると思うので、そちらを確認次第、情報を更新します。

# 

# 参考にしたサイト

主に参考にしたサイトです。情報提供感謝です。

- [【初心者向け】Hugo + GitHub Pagesで静的なポートフォリオを作る (Qiita)](https://qiita.com/nkjzm/items/ab8595f185348de7ba7e)
- [HUGOを使ってサイトを立ち上げる方法 (Qiita)](https://qiita.com/syui/items/869538099551f24acbbf)
- [さよならQiita、こんにちはhugo × github pages (Qiita)](https://qiita.com/k_k_hogetaro/items/1a650678dc4f0ad43468)
- [Getting started (academic theme)](https://sourcethemes.com/academic/docs/get-started/)
キーワードプランナーで検索ワードの月間検索ボリュームを調べる方法

サイト運営でSEOをしていると
キーワード選定などは大切な要因ですね。
そんな時、「このワードはどれくらい検索されているのだろう？」ということがあります。

今回はGoogleAds（Google広告）を使用して月間平均検索ボリュームを調べる方法をメモします。

キーワードプランナーの始め方は別途ということで。
最初の設定は面倒ですが広告を出さなければ基本無料で使えます。

<img width="860" alt="スクリーンショット 2019-07-25 11.58.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452135/63f70190-9b07-ca97-a448-2d1cb6bf743c.png">

ログインすると、２つ選択肢が出てくるので
「新しいキーワードを見つける」をクリック

<img width="819" alt="スクリーンショット 2019-07-25 11.59.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452135/622e9481-4269-8b7c-fd6f-b1c698ae8f96.png">

調べたいワードを入力

<img width="857" alt="スクリーンショット 2019-07-25 11.59.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452135/f83c0068-68f4-1c61-8110-3d414b3be923.png">

すると「月間平均検索ボリューム」の列にどれくらいそのワードで検索されているかの量が表示されます。
例はワードが良くなかったですが

<img width="857" alt="スクリーンショット 2019-07-25 12.00.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452135/1a656b12-91a9-cc1c-31a9-263b114a2cfc.png">

ありがちなワードで検索するとこれくらい出ます。
そして、ビッグワードとは別にキーワード候補も一緒に出してくれるので便利です。
[Xcode]iOSのシミュレーターで記号入力がおかしい時の直し方

久々にiOSのSimulatorを立ち上げて、キーボードから記号を入力すると、`@`が`[`になったり、`_`が入力できなかったりして、URLの入力ができない！と少し悩みました。

| 環境              |バージョン           |
|:-----------------|:------------------|
| macOS            | Mojave 10.14.5    |
| Xcode            | 10.2.1            |
| iOS シミュレータ   | 12.2              |

直し方は、Hardware→Keyboard→Connect Hardware Keyboardを選択。
<img width="512" alt="スクリーンショット 2019-07-25 11.55.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277107/507c9e72-46b4-65c0-8f44-6f09aba9c933.png">
<img width="294" alt="スクリーンショット 2019-07-25 11.50.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277107/92aeb9f5-835b-3d11-674e-57c95a9a93d2.png">
<img width="378" alt="スクリーンショット 2019-07-25 11.50.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277107/a929ad1f-4b23-23d5-5ab5-108efd2aecbf.png">
これでシミュレーターにキーボードが表示されたら、もう一度Connect Hardware Keyboardを選択してキーボードを消すと、記号入力が適切になります。

詳しい理由はわかりませんが、初期状態だとホストOS側のキー配列が正しく読み込まれないのかもしれません。
【Ruby Silver 試験】日付フォーマットを指定する

## はじめに
この記事は[讃岐小僧ブログ](https://www.sanuki-kozo.com/entry/2019/07/23/235721)（私のブログ）から転記したものです。


## 今回の問題

期待した出力結果になるようにXXXXに適切なコードを選べ</br>

```ruby
d = Date.new(2015, 1, 5)
puts d.strftime(XXXX)
```
```
 出力結果
01/05/15
```
```
選択肢
"%x"

選択肢
"%m/%d/%Y"

選択肢
"%m/%D/%y"

選択肢
"%M/%d/%y"
```

先に解答を言っておくと答えは`"%x"`になります。</br>
多分、今回の解法は単純に`"%x"`以外はmとかMとかから始まっていている、
つまり~~Month~~`%M`（分）や`%m`（月）などから始まっているので消去法で選ぶんだと思います。

↑コメント欄にて@scivolaさんよりご指摘いただきました。ありがとうございます。


流石に出題者も、こんなフォーマットを暗記するほど暇じゃないってわかってますよね笑


ちなみに日フォーマットで指定できる文字は下記のリンクで確認する事ができます。

[【Ruby 2.6.0 リファレンスマニュアル > ライブラリ一覧 > dateライブラリ > Dateクラス】](https://docs.ruby-lang.org/ja/latest/class/Date.html)


この記事は短いけどここまで

Ruby Silverに関する他の記事は[こちら](https://www.sanuki-kozo.com/archive/category/Ruby%20Silver)もどうぞ！
【Xserver】WordPress初期設定の wp 消す問題【WordPress】

### やりたいこと
 - `https://hogehoge.jp/wp` → `https://hogehoge.jp` にしたい

### 環境
 - サーバ：Xserver
 - WordPress：5.2

### おこなうこと
 - index.php の変更と画面の変更を行う。

#### ① Word Pressの画面で、URLの /wp を消す
![wordpress_設定画面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188255/c8b166ec-a445-1890-87be-7ceff31562eb.png)

このとき、消すのはサイトアドレス(URL)の `/wp` だけで、Word Pressアドレス（URL)側は残したままにする。万が一消してしまった場合は mysql 側の 
`wp_options.option_name = 'siteurl' ` の　`option_value` を正常に修正すること。
修正しないと、WordPressにアクセスできなくなる。

#### ② FTP で接続して、wp フォルダ直下の htaccess と index.php を取得する
#### ③ index.php の中身を修正する
この行を

```.php
/** Loads the WordPress Environment and Template */
require( dirname( __FILE__ ) . 'wp-blog-header.php' );
```
こうして修正する

```.php
/** Loads the WordPress Environment and Template */
require( dirname( __FILE__ ) . '/wp/wp-blog-header.php' );
```

#### ④ 修正した index.php と 取得したままの htaccess を、wp の一つ上の階層にアップロードする。(xserver だと、public_htmlの直下におくことになる）

#### ⑤ public_html の直下にある、不要な default_page.png と index.html がある場合は削除を行う

#### ⑥ 完了！

`/wp` を削除した `https://hogehoge.jp` にアクセスし画面が表示すれば完了。
default_page.png などを削除していない場合は、Xserverだと、
エラーとして正常動作をしない。
Docker19.03をAWSで試してみる（実施中）


#はじめに
ツイッターでこちらの記事が流れてきたので衝撃を受ける。
[Docker 19.03新機能（root権限制限不要化、GPU対応強化、CLIプラグイン…）](https://medium.com/nttlabs/docker-1903-5155754ff8ac)

是非とも使いこなして、効率アップを測りたい。

Qiitaではこちらを参考にさせていただきます。
[Raspberry PiでDockerを動かす](https://qiita.com/koduki/items/0ed303dac5d32646194f)

#クラウドでDockerコンテナを作って持ってこれるか？

EC2でUbuntu18のインスタンスを作って、インストールをします。

```sh:command
sudo apt-get update
curl -fsSL get.docker.com -o get-docker.sh
sudo sh get-docker.sh
```

>$ docker -v
>Docker version 19.03.0, build aeac949

インストールは正常にできたようです。

```Dockerfile
FROM debian:buster

RUN apt-get update && \
    apt-get install -y xinit matchbox-window-manager xterm chromium && \
    apt-get -y --purge autoremove && \
    rm -rf /var/lib/apt/lists/*

WORKDIR /app
COPY run.sh /app/run.sh
CMD ["./run.sh"]
```

と

```run.sh
#!/bin/sh

xinit matchbox-window-manager &
chromium --no-sandbox -kiosk "http://www.youtube.com"
```

を用意して、テストしてみます。（サイト参考）

>
```sh
docker buildx build -t koduki/rpi-chrome --platform linux/arm/v7 --push .
```

ビルドを実行します。
で、異常発生。どうやらbuildxというプラグインが足りないようです。

（実施中）
phpminiadmin

## phpminiadmin

* 正式名称は "PHP Mini SQL Admin" の様子。
* [Download](https://sourceforge.net/projects/phpminiadmin/files/phpminiadmin/)

## version

| version | 説明 |
|:--|:--|
| 1.9.150917 | php 7 対応 (mysqli関数) |
| 1.9.150108 | php 5 対応 (mysql関数) |
| 1.5.091221 | mysql 4 非対応 (SET NAMES を使う) |
| 1.4.080217 | mysql 4 対応 |
ec2(amazon linux)にapache2.4を導入（デフォルトページの表示まで）

前提
　・EC2のインスタンスを作成済み
　・インスタンスのセキュリティーグループでsshとhttpを許可している
　・インスタンスにSSHで繋げる
　・作成したばっかりのインスタンスにyumの更新をした状態(sudo yum update -y)
　・Macでターミナルを使用

手順
　1.インスタンスにsshで入る
　2.apache2.4のインストール
　3.apache2.4のデフォルトページを表示

##1. インスタンスにsshで入る

```
ssh -i 鍵のPATH ec2-user@IPアドレス
```

##2. apach2.4のインストール
　[最新版の確認](https://openstandia.jp/oss_info/apache/version/)
　apach2.4のインストール

```
sudo yum install httpd24
```

　バージョンの確認

```
httpd -v
```

##3. apach2.4のデフォルトページを表示
　apach2.4を起動

```
sudo service httpd start
```
　「http\://IPアドレス」でブラウザから接続
　デフォルトページが表示されるはず♪

　めんどいので自動起動する様に設定

```
　sudo chkconfig httpd on
```

以上っす！
selfの使い方をちょっと整理

selfメソッドって何やねんと思って色々調べました。

正直まだ使いこなせてないですが`self`を使うパターンと`@`を使うパターン両方行けるんだなぁと。

これどっちがいいのか分からず教えていただけたら幸いです。

```ruby:user.rb
class User
  attr_accessor :name, :station

  def initialize(name, station)
    # self.nameに引数name を代入する
    self.name = name
    self.station = station
  end
  def my_profile
    p "私の名前は#{self.name}で最寄駅は#{self.station}駅です。"
  end

  # クラスメソッド
  def self.description
    # この場合のselfの扱いは、 Userオブジェクトではなく、Userクラス
    puts "#{self}クラス"
  end
end

# Userのオブジェクトを生成し、引数で名前を与える
user = User.new("田中太郎", "白金高輪")
user.my_profile # => "私の名前は田中太郎で最寄駅は白金高輪駅です。"

# クラスメソッドの呼び出し
User.description # => Userクラス
```

`@`でもいいんじゃねと思って試しに

```ruby:user.rb
class User
  attr_accessor :name, :station

  def initialize(name, station)
    # self.name の代わりに@name にする
    @name = name
    @station = station
  end
  def my_profile
    p "私の名前は#{@name}で最寄駅は#{@station}駅です。"
  end

  # クラスメソッド
  def self.description
    # 適当にaaaクラスを記入
    puts "aaaクラス"
  end
end

# Userのオブジェクトを生成し、引数で名前を与える
user = User.new("田中太郎", "白金高輪")
user.my_profile # => "私の名前は田中太郎で最寄駅は白金高輪駅です。"

# クラスメソッドの呼び出し
User.description # => aaaクラス
```

何が違うんでしょうかね(^◇^;)

教えてください！
Adobe Acrobat Reader DCの右側に出てくるメニューがうざすぎる件について

## 経緯
PDFを開くときに毎回右側に出てくるツールメニューがうざすぎた。
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269793/6425f862-569b-004b-664c-f1c82a3f5f17.png)


## 設定方法
**①：左上の編集**
**②：環境設定**
![無題２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269793/7369dd52-b9ca-6918-7540-c4b803fb5031.png)

**③：文書**
**④：「ツールパネルの現在の状態を記憶」にチェックを入れる**
**⑤：ＯＫ**
![無題３.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269793/2c1390ed-246a-98d9-2bd1-fd4271392ba6.png)

後はメニューバーを閉じれば、毎回出てこなくなる。

## 終わりに
おすすめのリーダーがあったら教えて下さい
Ethereum界隈で名称変更のあったツールまとめ

Ethereum界隈で名称変更のあったツールのまとめ。変更があったらなるべく更新します。
表記は `新しい名前(古い名前)` です。


- [OpenEthereum](https://www.parity.io/ethereum/) (Parity Ethereum)
- [Remix](https://remix.ethereum.org) (Browser-Solidity)
- [solidity-coverage](https://github.com/sc-forks/solidity-coverage) (Solcover)
- [ganache-cli](https://github.com/trufflesuite/ganache-cli) (test-rpc)
- [Vyper](https://github.com/ethereum/vyper)(viper)
- [OpenZeppelin Contracts](https://github.com/OpenZeppelin/openzeppelin-contracts)(OpenZeppelin Solidity, Zeppelin Solidity)
- [OpenZeppelin SDK](https://github.com/OpenZeppelin/openzeppelin-sdk)(ZeppelinOS)
- [OpenZeppelin starter kit](https://github.com/OpenZeppelin/starter-kit)(ZEPKIT)


# 所感
- この界隈はなぜかくも頻繁にツールの名前が変わるのか
【Vue.js】選択済みの値を他のセレクトボックスに表示させない

できるか質問があったのでやってみました。

[element-ui] (https://element.eleme.io/#/en-US) 使ってます


## 成果物（CodePen）

<p class="codepen" data-height="265" data-theme-id="0" data-default-tab="js,result" data-user="umaniel" data-slug-hash="GVqjax" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="ignore selectbox">
  <span>See the Pen <a href="https://codepen.io/umaniel/pen/GVqjax/">
  ignore selectbox</a> by UMA (<a href="https://codepen.io/umaniel">@umaniel</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

## コード

### HTML

``` html

<div id="app">
  <div class="column">
    <el-select 
      v-model="selectValue.value"
      v-for="selectValue in selectValues"
      :key="selectValue.id"
      clearable
      placeholder="Select"
    >
      <el-option
        v-for="option in optionsFilter(selectValue.id)"
        :key="option.id"
        :label="option.id"
        :value="option.id"
      />
    </el-select>
  </div>
</div>


```

### Javascript(Vue)

``` javascript

new Vue({
  el: '#app',
  data() {
    return {
      options: [
        { id: 'A-0001' },
        { id: 'A-0002' },
        { id: 'A-0003' },
        { id: 'A-0004' },
        { id: 'A-0005' },
        { id: 'A-0006' },
        { id: 'A-0007' },
        { id: 'A-0008' },
        { id: 'A-0009' },
        { id: 'A-0010' },
      ],
      selectValues: [
        { id: 'B-0001', value: '' },
        { id: 'B-0002', value: '' },
        { id: 'B-0003', value: '' },
        { id: 'B-0004', value: '' },
        { id: 'B-0005', value: '' },
        { id: 'B-0006', value: '' },
        { id: 'B-0007', value: '' },
        { id: 'B-0008', value: '' },
        { id: 'B-0009', value: '' },
      ],
    }
  },
  methods: {
    optionsFilter(id) {
      const _self = this
      return this.options.filter(option => {
        const fItem = _self.selectValues.find(selectValue => selectValue.value == option.id)
        return !fItem || fItem.id == id
      })
    },
  },
})

```

## やってること

セレクトした値の中に自分の値があるか ? 
→ある： その値のidが自分のidと同じか ?
→ない： true
価値仮説

# 購入に迷っている服や似合っている髪型などを他人に聞けるアプリ

```
ユーザ: [商品の購入に迷っているユーザ] は、
欲求: [どれを購入するか決め] (し)たいが、
課題: [自分の意思ではなかなか決められ] (ない) ので、
製品の特徴 : [他者の意見や評判を聞ける (見れる)] (こと) に価値がある。
```

# 参考

## 価値仮説
開発するサービスがユーザーにとって本当に価値あるものかどうかを検証するもの。

[ユーザーの期待に応えるクックパッドのUI/UXーWDF Vol.17 with HTML5 Experts.jp「アクセシビリティとUX」](https://html5experts.jp/yusuke-naka/14364/)
[クックパッドから独立した「トクバイ」。新しいブランドを作るデザインプロセスの全貌](https://seleck.cc/835)

### クックパッドの例

```
ユーザ: [レシピを探すユーザ] は、
欲求: [今日のメニューを早く決め] (し)たいが、
課題: [多くのレシピから決められ] (ない)ので、
製品の特徴 : [人気レシピが探せる検索機能] (こと)に価値がある。
```

### フォーマット

```
ユーザ: [] は、
欲求: [] (し)たいが、
課題: [] (ない)ので、
製品の特徴 : [] (こと)に価値がある。
```
C++ Builder > CreateFileでデバイスをオープンする > ハマり > 管理者権限で実行する

```txt:動作環境
RAD Studio 10.2 Tokyo Update 3 
Windows 10 v1903
```

### デバイスをオープンできない

CreateFile()を使ってデバイスをオープンするサンプルコードがある。
実行してもオープンできない。

管理者権限で実行するとオープンできた。

### 参考

- [Calling CreateFile() to open an USB device got access denied after recent windows 8.1 update](https://social.msdn.microsoft.com/Forums/azure/en-US/19b33b90-2542-4de1-8998-9333bf67484d/calling-createfile-to-open-an-usb-device-got-access-denied-after-recent-windows-81-update?forum=vcgeneral)
    - > How about running as admin?

### CreateFile()の第一引数

上記リンク先の「m_Devname」。

サンプルコードでは`"\\\\.\\HogeHogeDrv"`のように記載されていた。
ムードボードまとめまとめ

Webサービスの画面を考える事になったのですが、どのようにイメージを固め、合意形成していくべきか悩んでいました。
悩みながらググっていると、ムードボードという方法にたどり着きました。
良さそうな感じがしたので、自分で試すべくムードボードについてのまとめをまとめてみました。

## ムードボードとは

画像や写真、文字、カラーチャートなどを組み合わせて、１つのコラージュにまとめる事で、言葉では表しきれない雰囲気を表します。

## 意義

[ムードボードでデザインする5つの理由](http://www.lifeclever.com/5-reasons-to-design-with-mood-boards/) - ムードボードを利用するメリットを５つ明記してくれています。

## 作り方

[あなたのブランドのためのムードボードの作り方](https://en.99designs.jp/blog/tips/how-to-create-a-mood-board/) - バランス、ターゲット、一貫性を考慮して、画像、色、比喩、雰囲気、言葉、書体、テクスチャ、パターン、形を選択して、いい感じに配置すればいいよと、おしゃっているようです。

[現役のグラフィックデザイナーが教える！ムードボードの作り方＆新しいアイデアを生み出し続ける方法](https://www.canva.com/ja_jp/learn/make-a-mood-board/) - 様々なムードボードのパターンを例示しながら、17のステップを設けて解説してくれています。

[デザイン認識の違いを防ぐ、効果的なムードボードの作り方ポイントまとめ](http://photoshopvip.net/87871) - 上のサイトの日本語版

## ツール

[デザイン初心者必見！デザインの方向性を共有する「ムードボード」を便利ツール5選とともに解説](https://ferret-plus.com/amp/9074) - NiiceとMURAL以外はリンク切れですね。Niiceはテンプレートが選べて画像の配置がお手軽にでき便利です。

[アイデア共有に必須のムードボード！おすすめ作成ツール集](https://goodpatch.com/blog/how-to-make-moodboard/) - Canvaは様々な用途を想定したテンプレートが用意されていて、それを見るだけでも勉強になりそうです。
Power BI Tips - データ（Excelファイル）の場所が変わった時の変更方法

#概要
Power BI Desktopで、Excelファイルをデータソースにしているときに、
そのExcelファイルを移動しちゃった場合の対応方法の備忘録。
クエリの編集とかしなくてよかったのね・・・。

#現象
pbixファイルを開いた後に、Excelファイルを移動させ、
「最新の情報に更新」ボタンをクリックすると・・・
こんなエラーが出ます（汗）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/ea5fcc11-3421-0f60-be31-295ebba49f43.png)

#対応方法
ファイルメニューの「オプションと設定」から、「データ ソースの設定」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/ba9720d0-6a7c-4b2b-ff2a-73b9f3967acd.png)

現在のデータソースの設定が表示されるので、ソースの変更をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/640e76a8-5822-936a-0cb4-66762538ad21.png)

以下のような画面が表示されるので、ファイルパスを修正してOKをクリックします。
その後データソース設定の画面も閉じます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/8d830e45-267c-1d67-e62c-ad10ae1fdb61.png)

以上の操作後、「最新の情報に更新」を押して、エラーが出ずにちゃんと更新されることを確認してください。
冷蔵庫管理システム「REMA」の開発する

## バックグラウンド
　　今は日本でITエンジニアの仕事を働いています。今はたくさんのウェブプロジェクトを開発しましたが、あまりモビルのプロジェクトを開発していないので、新しいのシステムを考えてモビルプロジェクトを開発したいです。
　　２月1回で冷蔵庫を掃除しています。その掃除する時にたくさんの期限切れ物を投げます。たくさんの物を投げるがあまり良くないだと思います。

## 目的
「簡単に冷蔵庫をチェックできるようにのシステムを作ること」
　冷蔵庫で入っているの物を簡単に分かるや期限切れ物が分かるなどのモビルアプリを開発したいです。

## 理由
* 冷蔵庫で期限切れものどれか分からないことです。

* 冷蔵庫を掃除する時たくさん期限切れものを捨てるです。

## USECASE

![USE CASE REMA　JAPAn.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286746/74cc5f88-3146-bb61-4b2e-00158e058f5c.jpeg)

## SEQUEL DIAGRAM

![Sequel REME　JAPAn.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286746/d97d4f56-ac28-8237-7e23-7e6df0fea4d7.jpeg)

## ERD

![ERD REME.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286746/a27464ab-fb6e-1843-1a53-cb96753a28f5.png)

## ページフロー

![FLOW　japan.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286746/2b9aa7cb-710e-476a-e7ac-c1b45d73e134.jpeg)


## ワイヤーフレーム
#### 初めページ。

![start_page.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286746/da2d76c7-f376-4772-2b97-e12011b97a30.png)

#### 物を入れる一覧。

![home_page.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286746/0271c48f-7d35-4f70-de22-5a84d75b72a0.png)

#### 物を入れるモーダル。

![home_page_modal.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286746/89d1551a-82cf-dc86-00a3-53f28c9a0d97.png)


#### 物を出す一覧。

![takeout.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286746/7153fcd8-3851-194b-d7a9-eea1528a3d63.png)


#### 物を出すモーダル。
![takeout_modal.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286746/9cc8107e-e810-0d90-5ce3-ffa6e13f601a.png)


#### 冷蔵庫で物を入れる。
![add_thing.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286746/5d4ab165-94e5-042d-323f-883c3f7b5b59.png)


#### 投げる物を報告書。
![report.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286746/a1c09be3-7e9a-9154-83f7-5e4174c85042.png)


## フィードバック
* このイデアはどう思いますか。
* 皆んさんは生活について問題が有りますか。

## アプリ開発のrepo
https://github.com/andybit-okutama/REME
resourcesメソッドについて

#resourcesメソッドでルーティングに追加される内容

勉強しているとresoucesメソッドが出てきて、あまり内容を理解せずにアプリに実装したので、調べてみました。

##resources :tweets

```ruby:routes.rb
Rails.application.routes.draw do
  resources :tweets
end
```

このように記述するだけで

| URL|アクション|HTTPメソッド|
|:----------|:------------------|:------------------ |
| /tweets   |tweets#index|GET|
| /tweets/:id|tweets#show|GET|
| /tweets/new|tweets#new|GET|
| /tweets|tweets#create|POST|
| /tweets/:id/edit|tweets#edit|GET|
|/tweets/:id|tweets#update|PATCH|
|tweets:id|tweets#destroy|DELETE|

これだけの基本的なルーティングが一気通貫でできてしまいます。便利ですね。同時にヘルパーも生成されるようですが、ここでは割愛します。

##resources :tweetsの中に:commentsをネスト

もちろんネストにも対応しているので、あるtweet_idが複数のコメントを持っていた場合などは

```ruby:routes.rb
Rails.application.routes.draw do
  resources :tweets do
    resources :comments
  end
end
```

| URL|アクション|HTTPメソッド|
|:---|:------------------|:------------------ |
| tweets/:tweet_id/comments|comments#index|GET|
| /tweets/:tweet_id/comments/:id|comments#show|GET|
| /tweets/:tweet_id/comments/new|comments#new|GET|
| /tweets/:tweet_id/comments|comments#create|POST|
| /tweets//:tweet_id/comments/:id/edit|comments#edit|GET|
|/tweets/:tweet_id/comments/:id|comments#update|PATCH|
|tweets/:tweet_id/comments/:id|comments#destroy|DELETE|

以上のようなルーティングが追加されます。

##オリジナルのアクションを追加できる collection

これだけでも十分便利ですが、さらにオリジナルのアクションをresourcesに追加することもできるので、

```ruby:routes.rb
Rails.application.routes.draw do
  resources :tweets do
    resources :comments
    collection do
      #HTTPメソッド名　:アクション名
      get :preserve
    end
  end
end
```

こうすることで、tweetsのルーティングの中にpreserveアクションを追加できるので、開発の幅がひろがりますね。
ヘルパーでtextareaのrowsの初期値を変更する

# はじめに

```php:php
echo $this->Form->textarea('test');
```
を実行すると

```html:html
<textarea name="test" rows="5"></textarea>
```
が出力されます。rowsの初期値が5だということがわかります。

```php:php
echo $this->Form->textarea('test',['rows'=>'10']);
```
を実行することで

```html:html
<textarea name="test" rows="10"></textarea>
```
のようにrowsの値を変更する事はできますが、「ほとんどどのtextareaもrowsは10で使うんだよな～」、「rowsは指定しないでcssで高さ調整したいんだよな～」という方は初期値をカスタムした方が使いやすくなりそうです。

# rowsの初期値を変更する

```php:vendor/cakephp/cakephp/src/View/Widget/TextareaWidget.php
$data += [
    'val' => '', 
    'name' => '', 
    'escape' => true,
    'rows' => 5,
    'templateVars' => []
];
```
の`'rows' => 5,`を`'rows' => 10,`に書き換えます。もう一度

```php:php
echo $this->Form->textarea('test');
```
を実行すると

```html:html
<textarea name="test" rows="10"></textarea>
```
が出力されるようになりました。

# オプションがない時はrowsを出力しない

```php:vendor/cakephp/cakephp/src/View/Widget/TextareaWidget.php
$data += [
    'val' => '', 
    'name' => '', 
    'escape' => true,
    'rows' => 5,
    'templateVars' => []
];
```
の`'rows' => 5,`を消しちゃいます。もう一度

```php:php
echo $this->Form->textarea('test');
```
を実行すると

```html:html
<textarea name="test"></textarea>
```
が出力されるようになりました。




# リンク
[Form - 3.8](https://book.cakephp.org/3.0/ja/views/helpers/form.html)
[ヘルパーでtextareaのrowsの初期値を変更する - Qiita](https://qiita.com/sozaiya/items/d70c858c3f9289f9c52e)
algolia ERR_NAME_NOT_RESOLVED

```javascript
const algoliasearch = require('algoliasearch')
const REACT_APP_ALGOLIA_ID = "Your Application ID"
const REACT_APP_ADMIN_API_KEY = "Your Admin Key"
const client = algoliasearch(REACT_APP_ALGOLIA_ID, REACT_APP_ADMIN_API_KEY)
const index = client.initIndex('body_search')
```

REACT_APP_ALGOLIA_IDにずっとSearch-Only API Keyを入れててエラー出てた・・恥ずかしい

ドキュメントしっかり見なきゃなぁ。。