OmniAICreator/Qiita-1.07M huggingface dataset:
Railsチュートリアル（第7章）

# はじめに
Railsチュートリアルの第7章が終わりました。
ポイントだけメモしておきます。

# Railsの環境
Railsにはテスト環境、開発環境、本番環境の3つの環境があります。
それぞれ、`test`、`development`、`production`で表されます。
`Rails.env`で参照でき、それぞれの環境名に?をつけると、その環境か確認できます。

```rb
# 開発環境の場合
Rails.env #=> development
Rails.env.development? #=> true
Rails.env.test #=> false
```

# scssのミックスイン
cssの複数の記述をひとまとまりにして、使いまわすことができます。
`@mixin "ミックスイン名"`と`@include ”ミックスイン名”`で記述できます。

```scss
@mixin box_sizing {
  -moz-box-sizing:    border-box;
  -webkit-box-sizing: border-box;
  box-sizing:         border-box;
}
debug_dump {
  clear: both;
  float: left;
  width: 100%;
  margin-top: 45px;
  @include box_sizing; // ここにミックスインの内容が入る
}
```

# リソース
モデルに対応するルートを以下の記述でまとめて定義することができます。

```rb
resources :users
```
以下の内容が追加されます。

|HTTPリクエスト|URL|アクション|名前付きルート|
|---|---|---|---|
|GET|/users|index|users_path|
|GET|/users/1|show|user_path(user)|
|GET|/users/new|new|new_user_path|
|POST|/users|create|users_path|
|GET|/users/1/edit|edit|edit_user_path(user)|
|PATCH|/users/1|update|user_path(user)|
|DELETE|/users/1|destroy|user_path(user)|

# params
コントローラーのshowメソッドなどで、`params[:id]`とするとリクエスト時のidが取得できます。
`/users/1`の`1`の部分です。

```rb
def show
  @user = User.find(params[:id])
end
```

## strong parameter
createメソッドで、`params[:user]`とすることで、フォームから送られてきたモデル情報を取得でき、登録などの処理に使用できます。
しかし、想定外の項目をモデルに含めて送信された場合など、セキュリティ的に良くないことがあるため、項目を制限する必要があります。
以下のように、`params.require(:user).permit(”項目のシンボル”)`という内容を返すメソッドを定義しておきます。パラメータを使用する際はこのメソッドを通して取得するようにします。
この`permit`で指定した項目した取得されないようになります。
また、他で使用できないようにprivateメソッドにしておきます。

```rb
  def create
    @user = User.new(user_params)
    if @user.save
      # 保存の成功をここで扱う。
    else
      render 'new'
    end
  end

  private

  def user_params
    params.require(:user).permit(:name, :email, :password, :password_confirmation)
  end
```


# form_for
フォームを作成する際に便利な`form_for`という埋め込みRubyがあります。
以下のように記述します。

```erb
<%= form_for(@user) do |f| %>
# フォームの内容
<% end %>
```
上記の中で受け取っている変数`f`を使用することで、ラベルやテキスト等を簡単に記述できます。
`f."フォーム種類" "カラムのシンボル"`と記載することで、そのカラムに対応するフォームを作成できます。

```erb
<%= f.label :name %>
<%= f.text_field :name %>
```
```erb
<%= f.label :password %>
<%= f.password_field :password %>
```
`f.submit`とすることで、送信ボタンを作成できます。

```erb
<%= f.submit "Create my account", class: "btn btn-primary" %>
```

# redirect_to
コントローラーで処理の後に画面遷移をさせたい場合、`redirect_to "URL"`と記述します。
`@user`と記述すると、`user_url(@user)`というURLに自動的に判断してくれます。

```rb
redirect_to @user
redirect_to user_url(@user) # 同じ
```

# flash
登録時のメッセージなど、一回だけ表示したい内容を記述する際に、`flash`というものを使用します。
`flash`は変数にハッシュの形式でデータを格納します。以下のように格納します。

```rb
flash[:data] = "hoge"
flash = { data1: "hoge1", data2: "hoge2" }
```

使用する際は、普通のハッシュのように使用できます。
また、一度参照すると内容はクリアされます。
Leetcode #581: Shortest Unsorted Continuous Subarray

Solution 1: Sorting

```swift
func findUnsortedSubarray(_ nums: [Int]) -> Int {
    var sortedAr = nums.sorted()
    var start = -1
    var end = -1
    for i in stride(from: 0, to: nums.count, by: 1) {
        if nums[i] != sortedAr[i] {
            if start == -1 {
                start = i
            } else {
                end = i
            }
        }
    }
    return start == -1 ? 0 : end - start + 1
}
```
ローカル上でマイグレーションする上でのメモ

###php artisan migrate でエラーが出た

```
$ php artisan migrate

  Illuminate\Database\QueryException  : SQLSTATE[HY000] [1045] Access denied for user 'mysql'@'localhost' (using password: YES) (SQL: select * from information_schema.tables where table_schema = mysql and table_name = migrations and table_type = 'BASE TABLE')

  at /Users//doc_manage/vendor/laravel/framework/src/Illuminate/Database/Connection.php:664
    660|         // If an exception occurs when attempting to run a query, we'll format the error
    661|         // message to include the bindings with SQL, which will make this exception a
    662|         // lot more helpful to the developer instead of just the database's errors.
    663|         catch (Exception $e) {
  > 664|             throw new QueryException(
    665|                 $query, $this->prepareBindings($bindings), $e
    666|             );
    667|         }
    668|

  Exception trace:

  1   PDOException::("SQLSTATE[HY000] [1045] Access denied for user 'mysql'@'localhost' (using password: YES)")
      /Users/doc_manage/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php:70

  2   PDO::__construct("mysql:host=127.0.0.1;port=3306;dbname=mysql", "mysql", "secret", [])
      /Users/doc_manage/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php:70

  Please use the argument -v to see more details.

```

頻繁にマイグレーションするわけではないからこのエラーが出るとビビる。
指定したmysqlに接続できていない...？あ。

```
$ mysql.server start
Starting MySQL
 SUCCESS!

$ php artisan migrate
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table (0.03 seconds)
```

マイグレーションかけることばかり意識がいってそもそもmysql serverを起動しないから上記のエラーがでる。でもまたマイグレーションかけるときには忘れているんだろうなあ。
Leetcode #686: Repeated String Match

```swift
func repeatedStringMatch(_ A: String, _ B: String) -> Int {
    if !Set(B).isSubset(of: Set(A)) {
        return -1
    }
    
    var s = String(repeating: A, count: B.count / A.count)
    repeat {
        if s.contains(B) {
            return s.count / A.count
        } else {
            s += A
        }
    } while (s.count < B.count + 2*A.count)
    return -1
}
```
【初心者向け】フォルダに入っているCSVファイルを一括で編集する方法

## はじめに
テスト目的で数個のCSVファイルのデータをもとに200ほど作ることをお願いされ
流石に手動は気が滅入るので、Pythonで解決するする方法を調べやってみたので
方法をまとめました。

## 実装
 - モジュールのインストール
 
今回はcsvモジュールと一括でファイルを読み込むためにglobモジュールを使います。
※globモジュールをインストールしていない場合は`pip install`などでインストールしてください。

```
from glob import glob
import csv
```
- CSV読み込み

ファイルの読み込みは`glob('*.csv')`で実行するスクリプトと同じフォルダの
CSVファイルを読み込んでくれます。

```
files = glob('*.csv')  #Load CSV files
```

- ファイルの読み込み〜データの編集

まず、読み込んだファイルを読み取りモードで開きます。
その後にCSVファイルの各行をlinesに格納していくといった流れにしています。

配列linesに対してfor文を使えば1行ずつデータを編集することができます。
実際には、for文の中に条件分岐を入れたり、メソッドを入れて返り値を使って
データを更新してました。

```
for file_name in files:
  with open(file_name, 'r',newline='') as readFile:
    reader = csv.reader(readFile)
    lines = list(reader)

　　for line in lines:
     line[0] = 'A列に入れたいデータを入力'
     line[1] = 'B列に入れたいデータを入力'
     line[2] = 'C列に入れたいデータを入力'
```

- データの書き込み〜CSVファイルの生成

ファイルを書き込みモードで開きます。
※ファイル名を同じにすると、新しいファイルは作成されず既存のCSVファイルが更新されます。

writerowsに先ほど更新したlinesを引数にして実行すると
更新したデータを書き込んでくれます。

最後にファイルを閉じます。


```
  with open('edited_'+file_name, 'w',newline='') as writeFile:
    writer = csv.writer(writeFile)
    writer.writerows(lines)
​
readFile.close()
writeFile.close()
```

余談ですが、ファイルを開く際におまじないとしてよく書かれる`newline=''`を
指定せずに実行すると、適切に改行されず、1行ずつ間が空いてしまいます。。。

## 最後に
Pythonほぼ未経験なのですが、今回のスクリプト作成を通して
面倒な処理については、スクリプトをどんどん作った方が後にも残るし
勉強になると思いました。
python2からpython3に対応させる時に詰まった事

# はじめに
python2からpython3に環境を切り替えたのですが、色々と詰まった部分があったのでここに記載しておきます。

#詰まった部分
## 1. pipが異なる
当たり前ですが…
linux系でやっていると`pip`がpython2で`pip3`がpython3に紐付いています。
必要なモジュールはpip3でインストールし直しましょう。

```sh
pip install xxxx  # <-X
pip3 install xxxx # <-O
```


## 2. 対応しないモジュールがある
例えば`SimpleHTTPServer`ではなく`http.server`などになっています。
まぁ実行時に怒られるので分かると思いますが…
ちなみに`SimpleHTTPServer`の以降につては、`http.server`内に似たクラスがありますので、そちらを利用すれば簡単に移管できます。


## 3. `bytes型`の登場
これまで利用していたモジュールで文字列を返した関数が、これになっている例が多いです。
こんな感じで、文字コード指定して文字列に直してあげましょう

```sh
# x = bytes型
x.decode('utf-8')
```

## 4. エラー発生時の変数`Exception`の`message`が利用できない
これは見逃すとエラー発生時のみしか発生しないバグを含んでしまうので、気をつけてください。


#最後に
他にも色々とあるかと思いますが…
ご指摘やご意見ある方はコメント部分にください。

ありがとうございました。
Professional Cloud Architect を取得してきた話


![ch5keejd.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128338/3552a7eb-1b32-d0d3-68b9-bd7c5456cb34.png)



先日取得してきたので、学習方法などを書いていきます



## スキルセット
- AWS： 1年半くらい
    - Solution Architect Associateを数ヶ月前にやっと取ったレベル
- GCP： 半年程

業務ではAWSとGCP両方使ってますが、最近はほとんどGCPです。

## やった事
### 模擬試験を受けてみる
GCPはAWSと違って模擬試験がタダで何度も受けられます。とりあえず今自分がどれくらい理解できているのかを可視化させるために、まずは受けてみましょう。

[Cloud Architect 模擬試験](https://cloud.google.com/certification/practice-exam/cloud-architect)

ここでの目的は**自分が理解できていないサービスの可視化**なので、正解してても理解できていないサービスはリストアップしておいた方がいいです。

主なカテゴリとして

- コンピューティング環境
- ストレージ
- ネットワーク
- 機械学習

とあるので、各カテゴリ毎に勉強期間を定めて取り組むのもいいかもしれません。

**またケーススタディは必ず目を通しておいて下さい！**
本試験でもケーススタディの設定は同じなので、試験当日の時間短縮につながります😇

### 公式ドキュメントを読む&実際にサービスを触ってみる
理解が足りていないサービスが分かったら公式のドキュメントを読みつつ、実際に手を動かしてサービスを使ってみます。
自分の場合はGCEや、DataStoreとBigTableの違いがよく分かっていなかったので、その辺りを重点的に触っていました。

[公式ドキュメント](https://cloud.google.com/docs/?hl=ja)

またGCPはアカウント開設時は$300無料枠が付いてくるので、とりあえずアカウントを作成しておくぐらいのノリでいいかもしれません。
仮に$300使い切っても、google主催のイベントに行くとたまに無料チケットが貰えます🤗
### Coursera

[Architecting with Google Cloud Platform専門講座](https://www.coursera.org/specializations/gcp-architecture)

お金と時間に余裕があるなら、このコースを全てやってみるのをおすすめします。
自分の場合とても全コースやる程金がなかったので、1~4までやりました。
特にコース4のAutoScaringについて、実際にどうやって動作しているのか、腹落ちしていなかった部分があるので手を動かしながら試せたのは大きかったです。
またquiklabというオンデマンド形式のGCP環境が使用できるので、自分でアカウント開設しなくてもGCPサービスを使用することができます。


### 本
全くやれてなかったですが、一応以下の本を買ってはいました😢
~~Kindleの進捗度見ると8%なので、ほとんど学習はしていなかった感じですが。。。~~

https://www.amazon.co.jp/dp/B07Q8BXDST/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1

今見るとこれAssociate Cloud Engineer向けだし。。。
ただ英語が易しめなのと、日本語のGCP資格本はないので時間見つけて読もうとは思います


## 試験内容
あくまで自分の時の出題傾向で、覚えている範囲だと

- オンプレからGCPに移行する際に、要件に基づいた適切なアーキテクチャを選定できるか？
- ストレージをGCPに移行する際に使用すべきサービスは？STSなのかTransferAppliaceなのか？
- スケールアウトを行いたい場合のマネージドストレージサービスは？
- Webアプリにおける3層アーキテクチャの設計
- gcsの適切なストレージクラス

こんな感じの問題が出ました。

サービス固有の問題と、クラウドにおけるアーキテクチャのベストプラクティスが半々で出題されたイメージでした。
後者についてはクラウドベンダ問わず考え方は変わらないので、すでにAWSやAzureでクラウドに慣れている方だとそこまで勉強しなくてもいけるのかなと！

またAWSの試験に比べると問題数が少ないのがいいです！そのため気力が割と持ちます。
自分の場合集中力が切れたら、もうどうでもよくなってしまうので、そのためにも模擬試験のケーススタディの把握は必須だと感じられました。

AWSと違っていきなりProfessionalから受けてしまいましたが、特段難易度は高く感じませんでした。

## 今後
本来の業務はデータ基盤を構築していることもあり、今後は[Professional Data Engineer](https://cloud.google.com/certification/practice-exam/data-engineer?hl=ja)の取得を目指そうと思います。


最終的には[AWS 認定 機械学習](https://aws.amazon.com/jp/certification/certified-machine-learning-specialty/)あたりを取得できれば一旦ベンダ試験は小休止でいいかなと考えています。


また色んな方々も言われているように、[Professional Cloud Architect](https://cloud.google.com/certification/cloud-architect?hl=ja)はバッグやらパーカーやら貰えるので、ぜひ取得目指して勉強してみるのはいかがでしょうか！？
仮想環境をUbuntu 18.04 （CUI/GUI）で構築する

そういえば、[仮想環境でRubyonRailsを導入し、rails newまでする](https://qiita.com/OriverK/items/c69b715fc455e8f4b5fd)の投稿はしているのに、
仮想環境をUbuntuで構築する投稿をしていなかったことに気づいた。

#環境
ホストOS：Windows10 Home
実装RAM： 16GB

#構築：CUI/GUI共通

まず最初に、下2つをインストールしておく
1. [vagrant](https://www.vagrantup.com/downloads.html) 
2. [virtualbox](https://www.virtualbox.org/wiki/Downloads) 

仮想環境を作成する場所にフォルダを作っておく。今回は適当に `hoge`　とする。

```sh:terminal
mkdir hoge
```
作成したフォルダに移動し、Vagrantfileを作成する。
Vagrantfileには、Vagrant、VirtualBoxを使うための設定が記載されている。
また、Vagrantfileはrubyで書かれている。

```sh:terminal
cd hoge
vagrant init
```
`vagrant init`で作成されたVagrantfileを編集する。
今回は、bento/ubuntu-18.04を使用する

ここからCUIとGUI(デスクトップ)で作業が変わる

Vagrantfileの編集をする。
私のPCのRAMは16GBあるので、今回は8GBとする。

```rb:Vagrantfile
# 最初の状態
# ipアドレスの部分がコメントアウトされているので注意
Vagrant.configure("2") do |config|
  config.vm.box = "base"
  # config.vm.network "private_network", ip: "192.168.33.10"
    config.vm.provider "virtualbox" do |vb|
      vb.memory = "1024"
    end
end

# 編集後
Vagrant.configure("2") do |config|
  config.vm.box = "bento/ubuntu-18.04"
  config.vm.network "private_network", ip: "192.168.33.10"
    config.vm.provider "virtualbox" do |vb|
      vb.memory = "8192"
    end
end
```

仮想環境を立ち上げる

```sh:terminal
vagrant up
```

## ubuntuの日本語化とロケール変更(CUI/GUI共通）
個人的には、言語に関しては英語のままで良いじゃんと思ってるけども。

```sh:terminal
# change locale to ja_JP.utf-8
# make japanize environmet
sudo locale-gen ja_JP.UTF-8
# when activate, activate with japanese
echo export LANG=ja_JP.UTF-8 >> ~/.profile
# apply the setting
source ~/.profile

# change timezone to jst
sudo timedatectl set-timezone Asia/Tokyo

# confirm
date
# => 2020年  3月 10日 火曜日 01:01:01 JST

```

#GUI版の構築
GUI版を構築する際はVagrantfileの編集から少し異なる。

```rb:Vagrantfile
# 編集後
Vagrant.configure("2") do |config|
  config.vm.box = "bento/ubuntu-18.04"
  config.vm.network "private_network", ip: "192.168.33.10"

  config.vm.provider "virtualbox" do |vb|
    vb.gui = true
    vb.memory = "8192"　# RAMを使える量を変更
    # cpu の数
    vb.cpus = 4
    vb.customize [
      "modifyvm", :id,
      "--vram", "256", # ビデオメモリ確保（フルスクリーンモードにするため
      "--clipboard", "bidirectional", # クリップボードの共有
      "--accelerate3d", "on",
      "--hwvirtex", "on",
      "--nestedpaging", "on",
      "--largepages", "on",
      "--ioapic", "on",
      "--pae", "on",
      "--paravirtprovider", "kvm",
    ]
   end
end
```

仮想環境の立ち上げ

```sh:terminal
vagrant up
```

SSH接続

```sh:terminal
vagrant ssh
```
パッケージを更新する

```sh:terminal
# ssh
sudo apt update
sudo apt upgrade
```

Ubuntuデスクトップ版(GUI)をインストールする
ここで、非常に時間が掛かるので注意

```sh:terminal
# ssh
sudo apt install ubuntu-desktop
```

完
![キャプチャ.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294402/6b1609c1-da18-c152-2673-31adb417b31b.jpeg)
PythonのEnumを使った処理分岐方法

# 概要

Javaでコード値などをもとにEnumを経由して処理を分岐することをよくやっていましたが、pythonでも同じことができないかと調べながら試した内容を投稿。
本当なら書く項目ごとにプロパティを持たせてしまいたいところだけどうまくやれる方法が思いつかず・・・
気が向いたら調べて追記するかも
[公式ドキュメント](https://docs.python.org/ja/3/library/enum.html)を参考に作ってみました。

## Enumの定義

pandasのクエリに渡す条件を動的に変えられるように `==`や`!=`の他文字列検索用に`.str.contains`などを変換できるEnumを作ってみました。


```python
from enum import Enum

class QUERY_CONDITION_TYPES(Enum):
    EQUIVALENT='=='
    NOT_EQUIVALENT='!='
    CONTAIN='.str.contains'
    STARTS_WITH='.str.startswith'
    END_WITH='.str.endswith'
    EXCESS='<'
    ABOVE='<='
    FPLLOWING='>='
    UNDER='>'
    
    def isAggrement(self):
        if self in [self.EQUIVALENT , self.NOT_EQUIVALENT,self.EXCESS , self.ABOVE,self.FPLLOWING
                   , self.UNDER] :
            return False
        else:
            return True
        
        
```
`str.startswith` などはpandasのクエリに使う場合は `()`で条件をくくる必要があるので判定できるメソッドを作成。
~~外からEnumの定義を文字列で渡せば変換できるように変換メソッドを作成しました。~~
~~該当しない場合は例外を投げるべきですが今回は省略しています。~~
調べてみたらparseメソッド作らなくてもclassに引数で渡せば対応できました・・・便利ですね。

## Enumの使いかた

実際に動かしてみました。JupyterNotebook上で確認していますが、ほかのものでも動くかと思います。

```python
print(QUERY_CONDITION_TYPES.EQUIVALENT.value)
print(QUERY_CONDITION_TYPES.EQUIVALENT.isAggrement())

print(QUERY_CONDITION_TYPES.STARTS_WITH.value)
print(QUERY_CONDITION_TYPES.STARTS_WITH.isAggrement())


strCondition=QUERY_CONDITION_TYPES('EQUIVALENT')
   
print(strCondition.value)

strCondition=QUERY_CONDITION_TYPES('END_WITH')
   
print(strCondition.value)

```

上記を実行したときの結果は以下のようになります。
直接Enumの定義を指定した場合、文字列で定義の内容を指定した場合どちらも問題なく実行することができています。

```
==
False
.str.startswith
True
==
.str.endswith
```

## 活用方法

文字列からの変換もできるため外部から(例えばWebの画面)文字列として条件を入れてもらって判定、内部でクエリを組み立てなんてことも可能です。
コード上で直接分岐を書いてもいいですが、判定をEnumにまとめることで処理がすっきりするかなと個人的には思います。
応用として表示色を定義して注意事項は赤かつボールドで、問題ないところは黒字の背景白
などのような制御も可能になるかなと
（自分用）コミケ公式webカタログの購入合計金額をブラウザ上で取得する

勉強メモ。

# 仕様
コミケ公式webカタログのお気に入り一覧ページで
メモ欄の先頭にサークルでのお買い物合計金額を
画像みたいに「半角数字 + 円」で入力しておくと
<img width="464" alt="スクリーンショット 2019-11-09 16.41.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221916/02c0a966-46b6-427a-2220-383a56f16b73.png">
こんな感じで合計金額を出してくれる。
<img width="460" alt="スクリーンショット 2019-11-09 16.40.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221916/ca391677-eb6b-b275-1a8b-7a61d586c8bd.png">

# 使い方
```javascript
javascript: var p = 0;$('.infotable-left span').each(function(index, element){if ($(element).text().match(/\d\d\d\d\d円/)) { p += + $(element).text().match(/\d\d\d\d\d/);} elseif ($(element).text().match(/\d\d\d\d円/)) { p += + $(element).text().match(/\d\d\d\d/);} else if ($(element).text().match(/\d\d\d円/)) { p += + $(element).text().match(/\d\d\d/);};});alert(p+"円");
```
webカタログが使えるブラウザであれば
上記のコードを、お気に入り（ブックマーク）にこんな感じで登録する
<img width="511" alt="スクリーンショット 2019-11-09 16.38.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221916/efe7b758-59ab-d4a0-4db4-b6d638d54394.png">
登録したお気に入り（ブックマーク）をクリックすると算出される。

# コード
わかりやすいように改行します。

```javascript
// 金額保持用の変数定義
var p = 0;
// 表示されている全メモ欄をeachで回す
$('.infotable-left span').each(function(index, element){
  if ($(element).text().match(/\d\d\d\d\d円/)) {
    // 5桁の金額
    p += + $(element).text().match(/\d\d\d\d\d/);
  } else if ($(element).text().match(/\d\d\d\d円/)) {
    // 4桁の金額
    p += + $(element).text().match(/\d\d\d\d/);
  } else if ($(element).text().match(/\d\d\d円/)) {
    // 3桁の金額
    p += + $(element).text().match(/\d\d\d/);
  }
;});
// アラートで上に出す
alert(p+"円");
```
ページングできないことを祈る。。。

# 注意
もし活用するのであれば、これは自分用なので計算の正確性など責任の一切を負いかねます。
自己責任で使ってください。
WordpressのサーバーのIPアドレスが変更になったときの対処法

#1　初めに
個人のメモ帳としてWordpressを使っています。WordpressサーバーとしてRaspberry Piを使用していますが、Raspberry PiのIPアドレスが変更になればまったくWordpressにログインできなくなり困りました。色々調べたところ対処法が分かったのでメモしておきます。

#2　事象
Wordpressを動かしているRaspberry PiのIPアドレスが変更になった場合、ダッシュボードにログインすらできなくなり、当然ながらWordpress内のページを指しているリンクにもアクセスできなくなる。

#3　対処法

## 3-1 wordpress DBのsiteurlを更新する

(1) wp-config.phpをオープンし、’DB_NAME’, ’DB_USER', ’DB_PASSWORD'の情報を記録してください。mysqlにログインするときに必要になります。

Raspiの場合、wp-config.phpは /www/html/wordpress直下に一般的に配置されてます。

![wp-config.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150223/01eee243-0f1f-cc99-024a-09c443fae342.jpeg)


(2) mysqlにログインする

```
mysql -u xxxxxx -p
```
xxxxxは wp-config.phpで確認した'DB_USER'の値を入力してください。またパスワードを要求されますので、wp-config.phpで確認した'DB_PASSWARD'の値を入力してください。

(3) wordpressが使用しているDBにアクセスする

```
MariaDB [(none)]> use yyyyy
```
yyyyyは wp-config.phpで確認した’DB_NAME’の値を入力してください


(3) Wordpressが使用しているDB の 「siteurl」を表示する。

```
MariaDB [wordpress]>  select * from wp_options where option_name = 'siteurl';
+-----------+-------------+-------------------------------+----------+
| option_id | option_name | option_value                  | autoload |
+-----------+-------------+-------------------------------+----------+
|         1 | siteurl     | http://(変更前IPアドレス)/wordpress | yes      |
+-----------+-------------+-------------------------------+----------+
```
(4) 「siteurl」の値を更新する

```
MariaDB [wordpress]> update wp_options set option_value = 'http://(変更後IPアドレス)/wordpress' where option_name = 'siteurl';
```

(5) 「siteurl」が更新されてることを確認する

```
MariaDB [wordpress]> select * from wp_options where option_name = 'siteurl';
+-----------+-------------+------------------------------+----------+
| option_id | option_name | option_value                 | autoload |
+-----------+-------------+------------------------------+----------+
|         1 | siteurl     | http://(変更後IPアドレス)/wordpress | yes      |
+-----------+-------------+------------------------------+----------+
```

以上の作業を行うとWordpressにログインできるようになります。


## 3-2 サイトアドレス(URL)を更新する。

wordpressにログインし、ダッシュボードに入ってください。「設定」をクリックすると一般設定の画面になります。サイトアドレスは旧情報のままですので、新IPアドレスに変更
してください。

![settei.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150223/7c0f66d5-acc4-9d2b-a7de-d467929153a7.jpeg)


以上の作業をすると、wordpress内に張ったリンクも更新されます。


## 3-3 リンクを更新する。
画像ファイルなどは、旧IPアドレスのままリンクが張ってあるのでそのままでは表示できませんので、リンクの更新が必要です。ただしhtmlをいちいち修正していては大変な作業になるので、Better Search Replaceプラグインを使います。

### まずは「Better Search Replace」プラグインをインストールする。
インストールの手順は、[こちら](http://wordpress.nnn2.com/?p=723)をご覧ください。

### 図のリンク情報を更新する
Wordpressでは、図は下記記載のとおりにリンクが張ってあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150223/606f776d-4b76-c21d-6307-d27e3e1e0f36.png)

「Better Serach Replace」を使い旧IPアドレスの箇所を新IPアドレスに変更する作業を実施します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150223/2a26db23-2b53-5736-1d10-2468ac13121f.png)

「Better Search Replace」プラグインを立ち上げ、下記記載の図のように入力をして実際の置換作業を実施すると、図のリンクが修正され正常に図が閲覧できるようになります。

「Run as dry run?」に✔を入れると検索のみになります。✔を外すと実際の置換作業が行われることにご注意ください。
オブジェクト指向で「ボーナスドリンク問題」を解いてみた

## TL;DR

タイトルのとおりで、問題は[こちら](https://github.com/JunichiIto/bonus-drink)です。元ネタは、[ここ](https://blog.jnito.com/entry/2019/05/03/121235)です。

## コード
```ruby
class BonusDrink
  def self.total_count_for(amount)
    new(amount).total_count
  end

  def initialize(drinks, empties = 0, drunks = 0)
    @drinks = drinks
    @empties = empties
    @drunks = drunks
  end

  def total_count
    until @drinks.zero?
      drink
      exchange
    end
    @drunks
  end
  
  private

  def drink
    @empties += @drinks
    @drunks += @drinks
    @drinks = 0
    self
  end

  def exchange
    bonus, @empties = @empties.divmod(3)
    @drinks += bonus
    self
  end
end
```

## 簡単な説明
方針としては、【ジュースの数】【空きビンの数】【飲んだ本数】の状態をインスタンス変数として保持し、【飲んだ時の状態の変化】と、【空き瓶を交換した時の状態の変化】をメソッドにしました。

* `@drinks` が【ジュースの数】です。
* `@empties` が【空きビンの数】です。
* `@drunks` が【飲んだ本数】です。
* ジュースを飲むと、【空きビンの数】と【飲んだ本数】が【ジュースの数】だけ増え、【ジュースの数】は０になります。これが `drink` メソッドです。
* 空きビンを交換すると、【空きビンの数】を３で割った商の数がボーナスとしてもらえるジュースの数となり、その分【ジュースの数】が増えます。また、【空きビンの数】は３で割った余りになります。これが `exchange` メソッドです。
* そして、`drink` と `exchange` を繰り返していくと、【空きビンの数】が少なくなって、`exchange` してもボーナスのジュースがもらえず、【ジュースの数】が０のままになってしまいます。これ以上ジュースは飲めませんから、これが最終の状態で、この時点での【飲んだ本数】が答えになります。これが `total_count` メソッドです。
* 問題は、クラスメソッドを求めているようなので、`BobusDrink.total_count_for` の中で、インスタンスを作成して、`total_count` を呼び出しました。
Google Colab: Semi-convolutional Operators for Instance Segmentation

[Semi-convolutional Operators for Instance Segmentation](https://arxiv.org/abs/1807.10712)についての簡単な再現実験をGoogle Colabを用いて行ったメモ（[ipynbリンク](https://github.com/festa78/colab_experiments/blob/master/semiconv.ipynb)）

この論文ではinstance segmentationを向上させるための簡単なConvolution layer拡張としてsemi-convolutional operatorを提案する。
このoperatorは単純にピクセル位置情報をConvolution layerの出力に追加する。
本来convolutionはshift invairantであるため、異なる位置にある同一物体を同一と認識するため、instance segmentationのように、
それらを別個の個体として切り分ける事が出来ない。
そのため、semi-convolutional layerで位置情報を追加して情報を補う事で性能を向上させる事が可能になる。
[Ubuntu] Ubuntu をインストールした直後に行う設定

# 概要
二番煎じですが，自分用にメモしていきます．逐次書き足していきます．

# 環境
- OS
 - Ubuntu 18.04.2
- その他
 - SSD に Windows，HDD に Ubuntu を入れてデュアルブート環境にしている

# 1. プライマリモニタの変更（マルチモニタ環境のみ）
サブのディスプレイに表示されてしまうログイン画面やトップバーを，メインのディスプレイに表示されるようにする．
~/.config/monitors.xml を変更する．
https://qiita.com/limb/items/df62e10845bda84d43e9

# 2. ディレクトリ名を英語にする
Ubuntu のインストール時に日本語を選択すると，ホームディレクトリ内のディレクトリ名が日本語になってしまう．ターミナルでディレクトリを移動する際に不便なので，以下のコマンドで英語にする．

```
$ LANG=C xdg-user-dirs-gtk-update
```

ダイアログが表示されたら`Update Names`を選択することで，ディレクトリ名が英語になる．

[参考]
Ubuntuでホームディレクトリの中身を英語にする
https://qiita.com/taiko19xx/items/d1a001bfc25245b91354

# 3. 時刻の設定（デュアルブート環境のみ）
windows と Ubuntu のデュアルブート環境では，OS を行き来すると時刻がずれてしまう．そのため，Ubuntu で以下のコマンドを実行して設定を変更する．

```
$ timedatectl set-local-rtc true
```

[参考]
WindowsとLinuxで時計が狂うのを直す
https://tomono.tokyo/2018/08/01/6790/
【Python】 リストとストリングのスライスについて自分用にまとめ

スライスで指定するインデックスに少し混乱していたので、自分用に整理したいと思います。

# 参考サイト
[【Python】スライス操作についてまとめ](https://qiita.com/tanuk1647/items/276d2be36f5abb8ea52e)

# インデックスの意味って？
一度、上記サイトに紹介されているコードをそのまま転記させていただく。

```python
s = 'Python'
s[2:5]
```

```python
'tho'
```

この結果から読み取れるように、次の画像のように、
インデックスは文字と文字の間を指しているよう。
![alt](https://qiita-user-contents.imgix.net/https%3A%2F%2Fgithub.com%2Ftanuk1647%2Fenjoy-slice-life%2Fraw%2Fmaster%2Ffigures%2Fenjoy-slice-life-0000.png?ixlib=rb-1.2.2&auto=compress%2Cformat&fit=max&s=58f19ab07402c789e53fdd1d555fadeb)

すなわち、```s[2:5]```はインデックス2~5の間の文字を示している。

#実際に触ってみる。まず文字列の場合
与える文字列の左側がインデックス番号に相当する。

```python
input_text = "012345"
print(input_text[1:4])  # 0|123|45
```
```python
123
```
インデックス番号1~4の間にある文字だけ抽出できた。

## 次にリストの場合

```python
input_list = [0, 1, 2, 3, 4, 5]
print(input_list[1: 4]) #[0,|1, 2, 3,|4, 5]
```
```python
[1, 2, 3]
```
こちらもインデックス番号1~4の1,2,3のみのリストが抽出できた。
52日目 PHPってめちゃくちゃ難しくないですか？

PHPでメモ的な掲示板を作りたいのですが
なんだか難しくてProgateのPHPを復習してみたのですが・・・

#PHPのⅡ
めちゃくちゃめんどくさいし、難しいし、こんがらがりまくりです。

[学習コース PHP Ⅱ 言語バージョン: PHP 7\.0  料理注文サイトを作りながらオブジェクト指向を学んでいきます。 オブジェクト指向は難しい概念ですが、必須な知識なのでがんばって習得しましょう！](https://prog-8.com/lessons/php/study/2)

 1 章：オブジェクト指向の基礎を学ぼう
 2 章：完成物に近づけよう
 3 章：カプセル化
 4 章：注文サービスを完成させよう
 （所用時間 75分）


初回はこちらです。５ヶ月前ですね。

 [19日目。PHPに大苦戦！](https://qiita.com/robamimim/items/f4f2bb000c5db3372e72)

`(所要時間 ４時間）`　だったのでだいぶ進歩したのかな。

#PHPのⅢ

クラスとか継承とかイマイチよくわかりません。
private、protectedをどんな時に使い分けるかも。
ごちゃごちゃ書いてきたコードをクラスでまとめてスッキリーな所は、いやーこれわかる人って頭いいんだなーと思うばかり。

 1 章：オブジェクト指向を学ぼう
 2 章：継承について学ぼう
（所用時間 50分）

前回が１時間半、半分でクリアできたわけで。
こういうのを自由自在に使いこなせたらすごいんだろうなー・・・

[20日目。Progate PHPⅢ…お料理サイトをリニューアル！](https://qiita.com/robamimim/items/755d204fdcdc921ba05e)

目標のブツまではもうちょっとかかりそうです。。。
VimFiler を VimFiler のウインドウまでカーソル選択を移動せずに閉じる

## はじめに

Vim で開発するときのファイラとして、 [vimfiler](https://github.com/Shougo/vimfiler.vim) を使っています。ディレクトリをたどってファイルを開いたり、vimfiler 上でファイルやディレクトリが作成できて便利で使っています。

しかし、ペインを複数開いて開発していると、vimfiler を閉じるとき、ペインをいくつも超えてvimfiler のウインドウまでカーソル選択を移動させるのが面倒でした。

この記事では、VimFiler のウインドウまでカーソル選択を移動せずに閉じる方法を調べたのでまとめます。

## 今までの vimfiler ウインドウの閉じ方

いつも vimfiler を閉じるときは、vimfiler のウインドウまでカーソル選択を移動し、`-` キーを入力して閉じていました。

[vimfilerのマニュアル](https://github.com/Shougo/vimfiler.vim/blob/master/doc/vimfiler.txt) を見ると、`-` は`vimfiler_close` という処理のキーマップとなっているようです。

```vim
(中略)
-			<Plug>(vimfiler_close)
(中略)
```

## 同等のコマンドを探す

`-` キーを vimfiler ウインドウ上で実行するのと同等のコマンドが無いか探したところ、`VimFilerClose` というコマンドがあるようでした。

[vimfilerのマニュアル](https://github.com/Shougo/vimfiler.vim/blob/master/doc/vimfiler.txt) 抜粋します。

```vim
:VimFilerClose {buffer-name}			*:VimFilerClose*
		Close vimfiler buffer named {buffer-name}.
```

こちらは vimfiler を開いたときのバッファ名(何も指定しないと`default`)を指定することで、対象の vimfiler バッファを閉じることができるようでした。実際のコマンドは以下のような形になります。

```vim
:VimFilerClose default
```

## ショートカットキーを登録

あとはこのコマンドをショートカットキーとして登録しました。`mq` と指定していますが、打ちやすいキーにすれば良いと思います。

```vim
nnoremap mq :VimFilerClose default
```

## 終わりに

こちらにより、毎回のテキスト編集の労力が少し減りました。少しずつ改善を続けていきたいと思います。

## 参考

* [vimfiler.vim/vimfiler.txt at master · Shougo/vimfiler.vim · GitHub](https://github.com/Shougo/vimfiler.vim/blob/master/doc/vimfiler.txt)
中間テーブルにデータを挿入する方法

bookとauthorがN:Nで繋がっているとして、中間テーブルBookAuthorに値を挿入するには、
以下のように,外部キー制約されているカラムに、それぞれのインスタンスを渡せばOK

```ruby:pivot.rb
book   = Book.find(1)
author = Author.find(1)
BookAuthor.create(book: book, author: author)
```
【Go言語】パッケージのimportについて整理した

## はじめに
こんにちは！2019年8月から株式会社メディアドゥのエンジニアになりました、小川と申します。
配属されて最初、Goのプロジェクトのに参加した時、開発環境の構築でハマったので記事にします。

## チーム開発とパッケージ管理
チーム開発においては、チーム内で使用する言語やライブラリを同じ依存関係のバージョンで統一する必要があります。
Goでのパッケージ管理手法はgo1.12から正式に[Go Modules](https://github.com/golang/go/wiki/Modules)がサポートされており、`$GOPATH/src` や `vendor`を使用する必要はなくなりましたが、現場では[gvm](https://github.com/moovweb/gvm)、[dep](https://github.com/golang/dep)を使用した開発は結構あります。そこで、改めてパッケージについてまとめました。

## Go言語のパッケージimport方法
```
$GOPATH
  └── src
       └──github.com
            └──hogeProject
                |
                ├── hoge
                |     └──hoge.go
                └── main.go
```

こんなパッケージ構成になっている時、
Goのパッケージのimportは以下のように行う。

```go:importの例
package main

import (
  // 標準パッケージのimport･･･1
  "fmt"
  
  // プロジェクト内の他パッケージを相対パスでimport･･･2
  "./hoge"
  
  // github上の外部パッケージのimoprt･･･3
  "github.com/fsnotify/fsnotify"
  
  // プロジェクト内の他パッケージを絶対パスでimport･･･4
  "github.com/hogeProject/hoge"

)

func main() {
  
  //処理…
       
}
```

### 【1】. 標準パッケージのimport
標準パッケージは、シンプルにパッケージ名を記載することでimportできる。

### 【2】. プロジェクト内の他パッケージを相対パスでimport
プロジェクト内の自作パッケージは相対パスでimportできるが、go buildでコンパイルを実行するとエラーになる。コードの曖昧さ回避のために公式で推奨されていないようです。

### 【3】. github上の外部パッケージをimoprt
github上の外部パッケージを使用する場合は、おなじみ、`go get`コマンドで`$GOPATH/bin`配下にインストールする。また、参加したプロジェクトが`dep`を使用している場合は`dep ensure`コマンドで、使用している外部パッケージをプロジェクトディレクトリ内の`vendor`配下にインストールされます。

### 【4】. プログラム内の他パッケージを絶対パスでimport
【2】では相対パスだが、基本的には絶対パスで指定する。個人開発するときには特に問題にならないが、チーム開発などで`git clone ~`する場合はcloneする場所を注意しないといけない。Goは`$GOPATH/src`より下をパスとして認識するため、**ソース内のパッケージのimportパスと同じディレクトリ構成にしないといけない。**

今回の例だと、内部パッケージのパスが、`github.com/hogeProject/hoge`となっているので、`$GOPATH/src/github.com`内にhogeProjectを`git clone`する必要がある。

これに気をつけないと、depでパッケージ管理をしてるプロジェクトでは、`dep ensure`した際に内部パッケージとして認識せず、外部パッケージとして`vendor`配下に取り込んで、そっちを参照してしまう。。。

## 参考にした記事
- [go - The Go Programming Language](https://golang.org/cmd/go/#hdr-Relative_import_paths)
- [他言語から来た人がGoを使い始めてすぐハマったこととその答え - Qiita](https://qiita.com/mumoshu/items/0d2f2a13c6e9fc8da2a4)
- [Go言語で自作パッケージのimportではまったのでメモ - re:inventing the wheel](https://blog.eksy.tokyo/post/import-self-made-packages-in-golang/)
- [依存関係管理ツールdep(golang) - Qiita](https://qiita.com/Azizim_A/items/66564b5dc7597717932b)
MaxMsp 外部スピーカー壊さないための注意点

MaxMspは時に凶悪な信号を出力します。
レベル的なものはわかりやすいですが
超高周波
超低周波
の持続とかダメージを受けるスピーカーや外部デバイスがありますので気を付ける。

とはいっても保護回路とかいろいろあると思う。

とりあえずやっておくことといえば、

gain~をつないで十分に余裕をもたせておく

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96808/e497608b-9575-1ece-ab51-cbe3ea5e5b55.png)

あと、リミッターを入れておくとかもあるけど、
Maxが生成する凶悪なシグナルの場合どうなるかわからない。
レベルメータを見つつ余裕のある状態を保つようにするのが良い。

リミッター入れると音も何かしら変わるとは思うし。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96808/b65fbb57-7414-02dc-124c-049d78583821.png)

Clip~を使うというのもある。　これも気持ち的なものかもですが。

参考動画　うるさい音なので注意
https://twitter.com/tatmos/status/1160140620561731584
JavaScript コンソール に 掛け算 割り算 あまりのみ を 出力する ～console.log(数値 符号 数値);～

# 目的

- JavaScript 掛け算/割り算結果をコンソールに出力する方法を知る。

# 押さえるポイント

- 掛け算を行う時の符号は`*`
- 割り算を行う時の符号は`/`
- 割り算のあまりを出力するときの符号は`%`

# 書き方の例

- 下記に計算の汎用的な処理を記したJavaScriptの内容を記載する。

``` javascript
# 計算結果をコンソールに出力する処理
console.log(数値 計算符号 数値);
```

# より具体的な例(掛け算)

- 下記に3×7の結果をコンソールに出力する処理を記したJavaScriptの内容を記載する。

``` javascript
console.log(3 * 7);
```

# より具体的な例(割り算)

- 下記に6÷3の結果をコンソールに出力する処理を記したJavaScriptの内容を記載する。

``` javascript
console.log(6 / 3);
```

# より具体的な例(割り算のあまり)

- 下記に9÷2の結果のあまりをコンソールに出力する処理を記したJavaScriptの内容を記載する。

``` javascript
console.log(9 % 2);
```
[Ubuntu] マルチモニタ環境でのプライマリモニタの変更

# 概要
複数のモニタを接続して Ubuntu を使用する際に，ログイン画面やトップバーがサブのディスプレイに表示されてしまっていた．
プライマリモニタの設定を変更し，メインのディスプレイにログイン画面等を表示する方法を紹介する．

# 環境
 - OS
  - Ubuntu 18.04.2
 - ディスプレイ
  - HDMI×１（メイン）
  - DisplayPort×１（サブ）　  計２台
 
# ~/.config/monitors.xml の編集
~/.config/ にある monitors.xml を編集してプライマリモニタを変更する．

変更前の monitors.xml は以下のような内容だった．

```~/.config/monitors.xml&nbsp;（変更前）
<monitors version="2">
  <configuration>
    <logicalmonitor>
      <x>0</x>
      <y>0</y>
      <scale>1</scale>
      <monitor>
        <monitorspec>
          <connector>HDMI-0</connector>
          <vendor>BNQ</vendor>
          <product>BenQ RL2455</product>
          <serial>J1G02920SL0</serial>
        </monitorspec>
        <mode>
          <width>1920</width>
          <height>1080</height>
          <rate>60</rate>
        </mode>
      </monitor>
    </logicalmonitor>
    <logicalmonitor>
      <x>1920</x>
      <y>0</y>
      <scale>1</scale>
      <primary>yes</primary>
      <monitor>
        <monitorspec>
          <connector>DisplayPort-0</connector>
          <vendor>DEL</vendor>
          <product>DELL E1916H</product>
          <serial>9W9XG726ARHB</serial>
        </monitorspec>
        <mode>
          <width>1366</width>
          <height>768</height>
          <rate>59.789539337158203</rate>
        </mode>
      </monitor>
    </logicalmonitor>
  </configuration>
</monitors>
```

下から１７行目の`<primary>yes</primary>`の部分がプライマリモニタかどうかを設定する部分．
現在は`<connector>DisplayPort-0</connector>`と同じグループに`<primary>yes</primary>`があるため，サブディスプレイである DisplayPort で接続されているディスプレイがプライマリモニタに設定されている．

メインディスプレイである HDMI で接続されているディスプレイをプライマリモニタにするには，単純に`<connector>HDMI-0</connector>`と同じグループに`<primary>yes</primary>`を記述すればよい．

```~/.config/monitors.xml&nbsp;（変更後）
<monitors version="2">
  <configuration>
    <logicalmonitor>
      <x>0</x>
      <y>0</y>
      <scale>1</scale>
      <primary>yes</primary>
      <monitor>
        <monitorspec>
          <connector>HDMI-0</connector>
          <vendor>BNQ</vendor>
          <product>BenQ RL2455</product>
          <serial>J1G02920SL0</serial>
        </monitorspec>
        <mode>
          <width>1920</width>
          <height>1080</height>
          <rate>60</rate>
        </mode>
      </monitor>
    </logicalmonitor>
    <logicalmonitor>
      <x>1920</x>
      <y>0</y>
      <scale>1</scale>
      <monitor>
        <monitorspec>
          <connector>DisplayPort-0</connector>
          <vendor>DEL</vendor>
          <product>DELL E1916H</product>
          <serial>9W9XG726ARHB</serial>
        </monitorspec>
        <mode>
          <width>1366</width>
          <height>768</height>
          <rate>59.789539337158203</rate>
        </mode>
      </monitor>
    </logicalmonitor>
  </configuration>
</monitors>
```

`<primary>yes</primary>`の位置を上から７行目に移動した．monitors.xml を保存して再起動したら変更が適用され，ログイン画面やトップバーがメインディスプレイに表示されるようになった．

# 参考
(Ubuntu) 複数ディスプレイでログイン画面がサブディスプレイに表示される
https://netlog.jpn.org/r271-635/2013/10/ubuntu-lightdm-xconf.html
MaxMspでパラメーターから音生成

何かしらパラメータやデバイス入力から音が変化する
楽器とかインタラクティブミュージックとかそういうのやりたい
という願いをMaxMspは叶えてくれる。

#マウス座標を音にする
MaxでFileメニューからNew Patcherを選ぶ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96808/95456bf7-50c8-3915-b964-f56271672b94.png)

何もないところをダブルクリックして　mou　って入力すると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96808/d36dfdc0-ad27-a96c-b75f-b556c0851c8e.png)
mousestateができる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96808/2529a8ba-1e09-281d-8107-0608ccd221a6.png)

アウトレットの2番目にマウスカーソルを当てると　マウスの水平座標がでてくるというのがわかる。

mousestateの上の方の余白で m キーを押し　p　キーを押すと　
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96808/e72c14aa-1e1d-1c1d-2779-c9cbe16ccf65.png)
pollができる。

つないで、一回pollを　ctr+クリックしておく
これでmousestateがポーリング状態（状態を監視し続ける）になる。

何もないところダブルクリックで
makenote 100 100
noteoutをつくりつなぐ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96808/efc961d3-9f91-aa62-37cb-3014e34c0391.png)

https://twitter.com/tatmos/status/1160128044817719296

# 画面の左上の方でしか変化しないのをなんとかする

/ 5　とかを挟む
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96808/ab5fe76d-6b98-e1c4-8450-1c73154faa38.png)

こうなる

https://twitter.com/tatmos/status/1160129624057102337
Cortex-M7@600MHzで$20の超弩級Arduino互換ボード Teensy 4.0

Arduino互換ボードにしてはヤバすぎるシロモノが登場しました。


# Teensy 4.0
![Teensy 4.0](https://forum.pjrc.com/teensy40_front.jpg)

- [Teensy 4.0 - PJRC](https://www.pjrc.com/store/teensy40.html)

何より驚くのはこのサイズ。
よく詰め込んだな...

ちなみに [Teensy 3.2](https://www.pjrc.com/store/teensy32.html) とピン互換性があります。


# ベンチマーク
![Teensy 4.0 Benchmark](https://www.pjrc.com/wp-content/uploads/2019/08/coremark_barchart.png)

- Score: `2314 pts`
- CoreMark/MHz: `3.86 pts`

CoreMark(Arduino版) でのベンチマーク結果です。
ESP32(1Core) の 6.6 倍、エグすぎる。

これが $19.95 で買えるんですよ、凄くないですか。
下手すると純正の Arduino UNO より安いのでわ...


# 基本性能
- MCU: `Freescale i.MX RT1062`
- Arch: `ARM Cortex-M7`
- Clock: `600 MHz`
- RAM: `1024 KB`
- Flash: `2048 KB`
- DMA: `32 Channels`
- PWM: `31 Ports`
- DigitalPin: `40 Ports (All Interrupt Capable)`
- SDIO: `1 Ports (4 Bit Native)`
- Serial: `7 Ports (All 4 Byte FIFO)`
- SPI: `3 Ports (All 16 Word FIFO)`
- I2C: `3 Ports (All 4 Byte FIFO)`
- USB: `2 Ports (480 Mbps)`
- I2S: `2 Ports`
- SPDIF: `1 Ports`

この `i.MX RT1062` は「クロスオーバープロセッサ」と言う位置付けらしく、マイクロコンピュータとマイクロコントローラの中間を担う存在としてリリースされたそうです。
(RaspberryPi と Arduino の中間、みたいな)


# 特徴
## 動的クロックスケーリング
このプロセッサは一般的なマイクロコントローラより消費電流が大きく、最大で `100 mA` も消費するため、負荷に応じてクロック周波数を変動できる「動的クロックスケーリング機能」が搭載されています。

従来のマイクロコントローラは、クロック周波数が変動するとタイマーやバスなどのタイミングに依存する各種機能へ影響が及ぶため固定されていますが、このプロセッサはクロック周波数が変動しても他の機能に影響が無いよう設計されています。

なお、定格の `600 MHz` より遥かに高いクロック周波数へのオーバークロックが可能、とのことです。

(ココが一番気になる...買ったら限界クロックでベンチマーク走らせます)


##密結合メモリ
`1024 KB` あるメインメモリのうち半分の `512 KB` は「密結合」となっており、シングルサイクルアクセスが可能な超高速の専用バスで CPU と結ばれています。

「密結合では無い」もう半分の `512 KB` は DMA に最適化されており、CPU とのブロッキングが起きにくい、とても効率的なIO性能となっています。

なお、これらのメモリ最適化は Teensyduino でコンパイル時に行ってくれます。


## 倍精度FPU
Freescale Kinetis や Atmel SAMD51 などの Cortex-M4F にも FPU は搭載されていますが、いずれも「単精度」のみの実装となっています。

このプロセッサは「単精度」と「倍精度」両方の FPU が実装されているため、全ての小数点演算をハードウェアで実行可能です。



# その他
2019/08/10 現在、取扱のあるショップについて PJRC 公式サイト、もしくは Adafruit の2店は確認できました。

~~特に何する訳でも無いけど~~ 欲しい！
データベースに画像を格納したいとき

# 画像 ( などの大容量メディアファイル ) を DB に格納したい
よくあるこの状況に関して、「SQLアンチパターン」第11章で述べられていたので、自分なりにまとめてみます。

## ファイルパスを VARCHAR で格納するか、BLOB 型で格納するか
私が過去に開発に携わったサービスでは、画像はデータベースの外に保存し、ファイルパスをデータベースに格納していました。
しかし、画像のバイナリデータを BLOB 型でデータベースに格納するという方法もあります。
それぞれのメリットとデメリットを比べてみましょう。

### ファイルパスを格納する場合のメリット
- データベースの容量を減らせる
- データベースのバックアップが短時間で終了し、バックアップファイル容量も小さくなる。
- 画像のプレビューや編集が容易になる

### ファイルパスを格納する場合のデメリット
- データベース上で削除しても、ファイルパスの先のファイルは自動的には削除されない
- トランザクションが分離するため、「ファイルはもうないのに該当する行を参照できる」という瞬間が生まれる
- 行を削除しようとする操作をロールバックしたとき、先に画像を削除していた場合、画像だけが消えた状態になってしまう。
- データベースのバックアップツールだけでは、画像ファイルのバックアップが行えない
- SQL におけるアクセス権限 ( GRANT, REVOKE ) が画像ファイルにそのものに適用されない
- データベースにはファイルパスが正当な値であるかどうかがわからない ( アプリケーションコード頼みになる )

### BLOB 型に格納する場合のメリット
- 誤ったファイルパスを格納するリスクがない
- 行の削除と同時に画像も削除される
- 画像の変更がコミットするまで他のクライアントには見えない
- トランザクションをロールバックすると、画像を以前の状態に復元できる
- 行の更新時はロックされるため、複数のクライアントが同時に画像を更新できない
- データベースのバックアップにはすべての画像が含まれる
- SQL におけるアクセス権限によって、行と画像へのアクセスを管理できる

### BLOB 型に格納する場合のデメリット
- 画像ファイルを BLOB列に読み込むための方法が必要 ( 一部データベース製品では外部ファイルをロードする関数を提供している )
- ファイルパスと比べ、容量が大きくなる
- ファイルパスと比べ、バックアップに時間がかかり、データベースのバックアップファイルが大きくなる
MaxMspで音からパラメーター変更

サウンドリアクティブ　サウンドで何かを変化させたい　
という欲求をMaxは叶えてくれます。

# 音からパラメーター変更
MaxでFileメニューからNew Patcherを選ぶ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96808/0d5e653e-cf91-fc03-9711-60defebf9429.png)

画面をダブルクリックし、ezと入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96808/3a10a780-0a83-ccdf-0d21-9d17880c8c7f.png)

ezdac~ってのがでてくるので、エンター

するとマイクになる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96808/8c72876a-73b3-5307-f522-a415500b0f3e.png)

また余白をダブルクリックして　levと入れると
levelmeter~って候補がでるのでエンター

するとレベルメーターがでてくる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96808/753a562d-3a38-2676-47bd-66815fbcc906.png)
線をつないで
右下の電源アイコンを押すと
マイクの入力で、レベルメーターが反応する

何もない余白で　f キーを押す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96808/024fac39-37a2-c001-c8d4-ec8fe977dd8a.png)

浮動小数（float）のナンバーボックスがでてくるので、つなぐ。

あとは、この値を好きなパラメータに入れればよい。

# 音量で赤く光らせる

例えば、　何もないところダブルクリックして　pan　と入力し、panelを作り
panelの左上のインレットを右クリックドラッグからbgfillcolorを出し

何もないところダブルクリックして　zmap　と入力し　
-72 0 0. 1.とか入れておく
でつなぐと

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96808/00cf6b27-e33d-a78d-8e9c-a0af5f0168ee.png)


こうなる。
https://twitter.com/tatmos/status/1160123374741282816
Automation Anywhere で日本語OCRエンジンが動作しないときに確認する項目

# 概要
Automation Anywhere Enterprise 11.3.2 では、ABBYYの最新の日本語OCR機能を利用することができますが、動作しない場合にチェックすべき項目を紹介します。

現象としては、たとえば以下のようなレシートをOCRで認識したときに日本語が認識されない場合です。
![aa-ocr-recognize01.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/cc673817-1691-0c5a-89ca-de388cac8eec.png)

OCR機能は以下のコマンドを使っています。
![aa-ocr-recognize00.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/e2f2991e-89bb-2066-696a-9d62cdea8e57.png)


※ Community Edition は2019年8月現在、日本語OCR機能には未対応のようです。

# 初期設定の確認
OCRエンジンは動くけれども、日本語がおかしな文字で表示される場合は、おそらく英数字のみ認識できるエンジンが動作している可能性があります。ABBYYの日本語OCRエンジンは、設定ファイルを手で書き換えないと起動しないようになっているようです。`C:\Program Files (x86)\Automation Anywhere\Enterprise\Client\plugins\commands\ocr\ABBYY` をエクスプローラーで開いて、`ABBYY_Paramaters.ini`というファイルを見つけてメモ帳で開いてください。
![aa-ocr-recognize02.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/3c33dffa-f221-0f5a-e838-7504f63e7bf5.png)

INIファイルの中の以下のセクションに注目してください。デフォルトではすべてコメントアウトされています。

```INI:変更前
;[RecognizerParams]
;lowResolutionMode=False
;TextLanguage=JapaneseModern,English
;Above Parameter is supported with ABBYY Fine Reader Engine v12
```

このファイルで`[RecognizerParams]`というセクションタイトルと、`TextLanguage=JapaneseModern,English`という行の冒頭のセミコロンを削除して保存します。(保存には管理者権限が必要になるので強制的にファイルを置き換えてください)

```INI:変更後
[RecognizerParams]
;lowResolutionMode=False
TextLanguage=JapaneseModern,English
;Above Parameter is supported with ABBYY Fine Reader Engine v12
```

このようにINIファイルを書き換えた状態で再びOCR機能を動作させると、日本語文字を認識するはずです。
![aa-ocr-recognize03.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/8d032f1d-cb65-b204-4b0a-abe3d44a7053.png)


# (おまけ) ABBYY エンジン利用時にエラーメッセージが出る場合の対処法

OCRダイアログボックスで画像認識が始まった瞬間に以下のエラーメッセージが出ることがあります。
![aa-ocr-error01.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/7c95cd24-2974-2bd0-026a-f8ef729a2ff9.png)
>"Access to C:\Program Files (x86)\Automation Anywhere\Enterprise\Client\plugins\commands\ocr\ABBYY\Data\FontCache\ was denied."

その場合は、Program Filesフォルダーの下にあるデータフォルダーのアクセス権が正しく設定されていない可能性があります。
(本来はProgram Filesフォルダーの下はデータ書き込みの目的で使ってはいけないお作法になっているのですが、ABBYY OCRエンジンの仕様上の問題ですね。。。)

以下の手順で、データフォルダーにアクセス権を与えます。
まず、`C:\Program Files (x86)\Automation Anywhere\Enterprise\Client\plugins\commands\ocr\ABBYY` をエクスプローラーで開いて`Data`フォルダーのプロパティを表示します。
「セキュリティ」タブに切り替えて、現在実行中のユーザーのアクセス許可を見てみます。「**フルコントロール**」「**変更**」「**書き込み**」のチェックが外れているはずです。
現在実行中のユーザーを選択して「**編集**」ボタンをクリックします。

![aa-ocr-error02.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/88f58c5b-20f2-1083-932a-219f8cd491dd.png)

現在実行中のユーザーのアクセス許可の「**フルコントロール**」にチェックを入れます。(他の項目にも自動的にチェックが入ります) その後、「**OK**」ボタンをクリックします。
![aa-ocr-error03.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/3177f82f-01a0-6f06-8bde-4e7a7e7d6a75.png)

これで正しく動作するようになるかご確認ください。
VRChatを用いた「現実感」の編集

#1.はじめに
 この記事は、OculusやVIVE等のVRデバイスを持っている人を対象としています。（6Dof以上、VRコントローラーがあるのが望ましい)
 また、個人の主観による実験結果のため、学術的な価値はありません。

#2.経緯

###Oculus Questでの錯覚
 先日、Oculus Questを購入しました。
 そこでチュートリアルをやった時に、目の前にあるCGのテーブルが実際に存在しているかのような錯覚を覚えました。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/461091/fd097b99-5b5c-0308-0604-d0d3ae22619d.jpeg" width=50%>
(Oculus Questのチュートリアル「First Steps」)

###VR感覚
 VRChatではこのような感覚を「VR感覚」と言うそうです。
 VR感覚が強い人は、アバターに接触した時に実際に触られたように感じたり、本来ないはずの感覚を新しく獲得することもあるそうです。

#3.結論
  非常に大雑把に言うと「VR感覚」は、心理学などで言われる「条件付け」の一種だと思われます。
（心理学とか全然詳しくないです、ごめんなさい）
 この仮説を用いるとVR感覚のような「現実感」は、自由に付けたり外したり出来ることになります。

#4.解説
###条件付け
 条件付けと聞くと、最初に思いつくのは「パブロフの犬」です。
 ベルの音を聞いただけでヨダレが出る犬の実験なのですが、
私の主張は『「唾液が出る」のは犬にとっての「現実感」の一つである。』というものです。
###習得方法

 よって条件付けのプロセスを踏むことで、現実感もまた編集可能だと考えています。

以下は[wiki](https://ja.m.wikipedia.org/wiki/条件反射)から
> 1.イヌにメトロノーム（ベル・ホイッスル・手拍子・足踏みと言う説もある）を聞かせる。
> 2. イヌにえさを与える。イヌはえさを食べながらつばを出す。
> 3. これを繰り返す。（上記の二つのプロセスを条件付けという）
> 4. すると、イヌはメトロノームの音を聞いただけで、唾液を出すようになる。

#5.これから
 さて、長文になりそうだったので、ざっくりとした結論から先に書きました。
 この内容だけだと大雑把すぎて、小並みな感想しか出ないでしょうが、
次はこれを少しずつ掘り下げて行きたいと思います。

 ここはまだ入り口に過ぎません。
 これからVRを通じて、不思議な感覚の世界を紹介します。

[1. VR内での疑似触覚の確認](https://qiita.com/pipe_render/items/cdf21f1d6b7cfd52f9bd)
[2. 習慣の力](https://qiita.com/pipe_render/items/49a15c51e945849745b5)
質問 Unity C# プレイヤーに向かって弾を発射させたい。※注　初心者です。

2Dシューティングゲームでプレイヤーに向かって弾を撃つ敵を作ろうと思い、

    public GameObject player;
    public float speed;

    void Start()
    {
        this.transform.LookAt(player);　//問題の部分　
    }

    void Update()
    {
        this.transform.Translate(speed, 0f, 0f);
    }



と書いたのですが、
cannot convert from GameObject to Transform という旨のコンパイルエラー。

それを見て自分は、public GameObject player;を消して
public Transform player;に書き換えたのですが、
今度はinspectorからドラックアンドドロップしてもpublic transform playerに
playerのゲームオブジェクトを入れることができません。

入れようとしてるのはtransformじゃなくて、
シーンにあるプレイヤーのゲームオブジェクトなんだから、
そりゃそうだという話ですが、、

covert？変換とかってできませんか？どうするべきでしょうか？
初心者によるpython練習備忘録1

プログラミング超初心者が初心者になるためのPython入門3の総合演習問題2 備忘録です。実際にプログラミングしながら書いています。
私はプロゲートとドットインストール、初心者向けの本を数冊読んだ程度の入門者です。プログラムどころかQiita自体も初めてなので、Markdown記法の練習も兼ねています。


問題

>自販機。ジュースの種類は100円、150円、180円です。最初にお金を投入して、ジュースの種類を番号で示す。もし残金が100円以上であれば、再び商品を選べる状態にします。そして最後におつりを受け取る。

内容をまとめると
1.ジュースのリストを用意
2.投入金額を入力させる
3.リストを表示
4.購入商品を選ぶ
5.投入金額から商品代金を引く
6.残金が100円以上あれば、再び商品選択へ
7.おつり

になりそうです。2.4.はinputで入力を受け付けるようですね。

まずは5あたりまで書いてみます。

```python:lesson.py
juice = {'A':100, 'B':150, 'C':180}

class Vmachine():
    def purchase(self):
        x = input('お金を入れてください\n')
        x = int(x)
        print(juice)
        item = input('購入する商品を選んでください\n')
        x = x - juice[item]
        print('残金は', x, '円です')

y = Vmachine()
y.purchase()
```

できました。結果は

>お金を入れてください
500
{'A': 100, 'B': 150, 'C': 180}
購入する商品を選んでください
C
残金は 320 円です

とこんな感じです。（結果表示はこれでいいのかよくわかりませんでした。）

ただし、商品を小文字で入力するとエラーが出てしまいます。
そのためupperを使うんだろうというのはわかったのですが、どこに当てればよいかよくわかりません。
item = input('購入する商品を選んでください\n').upper()とか試したのですが、イマイチでした。
なので


```python:lesson.py
juice = {'A':100, 'B':150, 'C':180}

class Vmachine():
    def purchase(self):
        x = input('お金を入れてください\n')
        x = int(x)
        print(juice)
        item = input('購入する商品を選んでください\n')
        item = item.upper()
        x = x - juice[item]
        print('残金は', x, '円です')

y = Vmachine()
y.purchase()
```
というなんだか初心者丸出しのままとりあえず進みます。いいんです。とりあえず最後まで動いてから考えます。

さて次は残金まで出たので、それの金額次第でもう一度購入の流れに戻るというものですね。
whileを使ってこうしてみました。



```python:lesson.py
juice = {'A':100, 'B':150, 'C':180}

class Vmachine():

    def purchase(self):
        x = input('お金を入れてください\n')
        x = int(x)
        while x >= 100:
            print(juice)
            item = input('購入する商品を選んでください\n')
            item = item.upper()
            if x >= juice[item]:
                x = x - juice[item]
                print('残金は', x, '円です')
            else:
                print('お金が足りません')

y = Vmachine()
y.purchase()
```

試してみたところ、ちゃんと残金によってお金がたりないとかも表示されるようです。
やはり少しupperのところが気になりますね。それにもう少しまとめられそうな気がするのですが、
今の所見つからなかったので、これに一旦終了します。
1対1でアソシエーションが組まれているとbuild出来なかった話

#はじめに
個人製作中に1対1のアソシエーションを組んだモデルをbuildしようとしたらnilが帰ってきてbuild出来なかったが解決したので、備忘録

#状況説明
```ruby:item.rb
class Item < ApplicationRecord
  has_many :images, dependent: :destroy
  has_one :detail, dependent: :destroy
end
```
```ruby:detail.rb
class Detail < ApplicationRecord
  belongs_to :restaurant
end
```

この様な感じでbelongs_to,has_oneで組んでコントローラーで

```ruby:items_controller.rb
def new
  @item = Item.new
  @item.images.build
  @item.detail.build
end
```

images.buildは出来るのにdetail.buildが出来ない、、、
@item.detailの時点でエラーは出ていないのでアソシエーションは上手く組めているがnilになってしまい、nilに対してはbuild出来ないよーとエラーが発生した。

#解決策
railsガイドをみてみた所、
>
新しく作成したhas_one関連付けまたはbelongs_to関連付けを初期化するには、build_で始まるメソッドを使用する必要があります。この場合has_many関連付けやhas_and_belongs_to_many関連付けで使用されるassociation.buildメソッドは使用しないでください。作成するには、create_で始まるメソッドを使用してください。

との事でした。
と言う訳で

```ruby
@item.build_detail
```
で、上手いこと解決しました。

#まとめ
@item.detailの時点でエラーではなく、nilが返って来ている事にすぐ気がつけばもう少し早く解決したかなーと思います。
modelの記述やらが間違っているのかと思い遠回りしてしまいました。
どなたかの参考になれば幸いです！
＊間違いなどありましたら、コメントで教えていただけると幸いです。
＊参考にしたらいいね！してね！

#参考サイト
https://railsguides.jp/association_basics.html
【SalesForceトレーニング#1】SalesForce入門

#1.開発とアカウント作成
- https://developer.salesforce.com/ja/

#2.勉強と練習
- https://trailhead.salesforce.com/ja/

#3.試験
- http://tandc.salesforce.com/credentials

#4.資格
- Salesforce 認定 Platform デベロッパー

#5.参照
- https://qiita.com/training_zhang

#6.勉強内容
- データモデリング
    https://trailhead.salesforce.com/ja/trails/force_com_admin_beginner/modules/data_modeling

- Force.com のマルチテナント
    http://www.developerforce.com/media/ForcedotcomBookLibrary/Force.com_Multitenancy_WP_101508_JP.pdf​

#7.概念

- SalesForceの世代

| 世代       |      名称         |    　　  　特長    　    　　　　　  |
|:---------:|:-----------------:|:-----------------------------------:|
| 1         | C-controll(C-Base)|   -                                 |
| 2         |  Classic(vf)      |   快速開発                          |
| 3         |      lightning    |   作業効率向上　                     |
- SalesForceキーワード説明

| No.       |      SalesForce   |    　　  　普通アプリケーション   　  |
|:----------|:-----------------:|:-----------------------------------:|
| 1         | アプリケーション   |   プロジェクト                       |
| 2         |  タブ             |   業務(一覧、詳細等)                 |
| 3         |  オブジェクト      |   テーブル   　                     |

- オブジェクト分類
	- 標準
	- カスタマイズ(Api名+_c)
- データ分類
	- メータデータ
	- 業務データ
- MVCとsalesforceオブジェクトの関係

| No.       |       MVC |    　　　　　　SalesForce項目  　　　　　　  |
|:----------|----------:|:------------------------------------------:|
| 1         |     Model |   標準項目、カスタム項目 & リレーション       |
| 2         |  Controll |            入力規則、トリガー               |
| 3         |      View |            標準2列表示                     |
- 関係
    - 参照関係：基本的に 2 つのオブジェクトをリンクして、一方のオブジェクトをもう一方のオブジェクトの関連項目から参照できるようにします。
    - 主従関係：オブジェクトを密接にリンクして、主レコードが従レコードおよび副従レコードの特定動作を制御するようにします。

|     関係  |    　　　　　       　説明      　　　　　　  |
|:---------:|:------------------------------------------:|
|   主従関係|    子供の権限管理がない、独立存在できない。    |
|   参照関係|    子供の権限管理が独立設定できる             |
※カスタマイズ関係はリレーション名_rで利用できる

- SalesForce Classic
    - オブジェクト定義と編集
    - コンーポネント(標準、拡張、カスタマイズ)
    - VisualForceコンーポネント