OmniAICreator/Qiita-1.07M huggingface dataset:
Python3 > colorText_180707.py > v0.5 > stdin読込み文字列に対してhtmlタグ色付けする > grep -v指定時にキーワードに色付けして閲覧

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 16.04.4 LTS desktop amd64
TensorFlow v1.7.0
cuDNN v5.1 for Linux
CUDA v8.0
Python 3.5.2
IPython 6.0.0 -- An enhanced Interactive Python.
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
scipy v0.19.1
geopandas v0.3.0
MATLAB R2017b (Home Edition)
ADDA v.1.3b6
gnustep-gui-runtime v0.24.0-3.1
PyMieScatt v1.7.0
GNU grep 2.25
```

### 関連

- [Python3 > colorText_180707.py > v0.1 > optという文字に色付けした結果を出力](https://qiita.com/7of9/items/2cd82f61f9f87988de57)
- [Python3 > colorText_180707.py > v0.2 > 実行時引数によるキーワード指定 (sys.argvの使用) || v0.3 > 改行用に<BR>追加 || v0.4 color指定修正](https://qiita.com/7of9/items/18712cb7c6b79124a609)
- [grep > grep --color=always opt *.c | grep -v option > optionが除外されない理由](https://qiita.com/7of9/items/ddebcb1cf4d7b65791fd)

### 処理概要

- テキストをstdinから読込む
- htmlタグで特定の文字に色付けして標準出力
- 実行時引数で色付けキーワードの指定

### code v0.4

```colorText_180707.py
import re
import sys

'''
v0.5 Jul. 08, 2018
  - print Example when keyword is not specified
  - read from stdin
v0.4 Jul. 08, 2018
  - fix bug > color attribute without double quotation
v0.3 Jul. 08, 2018
  - add <BR> for each new line
v0.2 Jul. 08, 2018
  - read command-line arguments
v0.1 Jul. 07, 2018
  - add color html tag for a fixed text ('opt')
'''

# on Python 3.5.2

def print_arguments():
    print('Example:')
    print('    stdin | [cmd] [keyword]')

args = sys.argv
if len(args) == 1:
    print_arguments()
    sys.exit()
if len(args) < 2:
    print('Error: keyword is not specified')
    print_arguments()
    sys.exit()

col_text = args[1]
inRed = '<font color="red">' + col_text + '</font>'

lines = sys.stdin.readlines()
for aline in lines:
    wrk = aline.replace(col_text, inRed)
    print(wrk, end='<BR>')

```

### 使用例

```shell
$ grep opt *.c | grep -v option | python3 colorText_180707.py opt > tmp.html
$ google-chrome tmp.html 
```

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/32f456cc-29d0-a69c-647c-14f3652dbf83.png)

### 備考

Chromeでキーワード検索するとそのキーワードが黄色に表示される。
１つの文字列だけを強調する場合はChromeの機能で十分。

２つの文字列をそれぞれ強調したい時に今回のツールは役に立つ。
(例: scatという文字列を赤色表示にして、enumを検索、など)


![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/73b9698b-1418-38ba-c444-51274753c2ac.png)
[GCP] Datalab の起動方法

#Datalabとは

　Datalabとは、GCEの仮想マシン上で動作する、Jupyterをベースとしたインタラクティブツール。
　クラウド上で実行されるため、ブラウザさえあればどこからでもアクセスすることができる。

- Jupyter<br>
　Pythonをブラウザ上で実行できるオープンソースのインタラクティブツール。
- インタラクティブツール<br>
　対話的なツール、の意。プログラムに対する実行結果がグラフィカルに随時確認できる。


# Datalabの操作

## 1. Cloud Shellの起動
GCPからCloudShellを起動します。

##2. Datalabの作成
datalabコマンドにより、Datalabを作成・起動します。

```python:Datalabインスタンスの作成と起動
# 1.datalabのインスタンス名は任意で構わない
# 2.zoneとして選択できるものとしては、asia-east1-a / asia-east1-b / us-central1-a などがある。

datalab create kagglelab --zone asia-east1-a
```

```python:出力結果
The connection to Datalab is now open and will remain until this command is killed.
Click on the *Web Preview* (square button at top-right), select *Change port > Port 8081*, and start using Datalab.
```

上記結果の出力後、Cloud Shell の右上コマンドからポートの変更を選択し、ポートを8080から8081に変更します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/184568/b30baea0-c8a3-68c9-2172-010001a4c7ff.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/184568/10365c25-fd43-1676-392d-0ef00f14500d.png)

上記変更後、「変更してプレビュー」を選択すると、Google Cloud Datalab が起動します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/184568/c2c407ca-4264-83b1-2b73-a66a39699a89.png)



##3. Datalabの終了
Datalab画面右上にあるアカウントマークをクリックし、「Stop VM」を選択することでDatalabを終了させることができます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/184568/d75cf290-44f3-89bd-41b0-2c8b8d5d9fcb.png)



##4. Datalabの起動
初回のインスタンス作成後は、次のコマンドによってインスタンスを起動させる。

```python:インスタンスの起動
datalab connect kagglelab
```


# 参考文献
「Google Cloud `latformで始める機械学習と深層学習」吉川隼人


以上。
Python3 > colorText_180707.py > (ideone) v0.1, v0.2  > Pythonがない環境での実行用

```txt:動作環境
ideone (Python 3.5)
```

### 関連

- [Python3 > colorText_180707.py > v0.1 > optという文字に色付けした結果を出力](https://qiita.com/7of9/items/2cd82f61f9f87988de57)
- [Python3 > colorText_180707.py > v0.2 > 実行時引数によるキーワード指定 (sys.argvの使用) || v0.3 > 改行用に<BR>追加](https://qiita.com/7of9/items/18712cb7c6b79124a609)

## ideone動作版

Pythonを実行できない環境でソースの色付けをできるようにするためideoneで動作する実装に変更。

https://ideone.com/q6NUyd

```py
import sys
import re

'''
v0.2 Jul. 08, 2018
  - fix bug > color attributed using double quotation
v0.1 Jul. 08, 2018
  - add <BR> for each new line
  - read from stdin
=== branched from [colorText_180707.py] v0.1 ===
v0.1 Jul. 07, 2018
  - add color html tag for a fixed text ('opt')
'''

# on Python 3.5.2

# --- Configuration ----
COL_TEXT = 'opt'
# --- 


SRC_FILE = 'in_180707.txt'
inRed = '<font color="red">' + COL_TEXT + '</font>'

lines = sys.stdin.readlines()
for aline in lines:
    wrk = aline.replace(COL_TEXT, inRed)
    print(wrk, end='<BR>') 

```

### 使い方

1. https://ideone.com/q6NUyd をforkする
2. enter input (stdin)に色付けしたいテキストをペースト
3. コード中の`COL_TEXT`に色付けしたいテキストを指定
4. Run
5. stdoutの内容をコピー
6. 任意の名前のhtmlファイルとして保存 (例: tmp.html)
6. ブラウザで開く

Python環境での実行版とどちらが使いやすいか。
ubuntuに最新版のdockerをインストールする


## 動作環境

```shell-session:~
$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04.4 LTS"
```

## 必要パッケージのインストールと事前設定



```shell-session:~
$ sudo apt-get update
$ sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    software-properties-common
```
Dockerの公式GPGキーを追加する。

```shell-session:~
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - 
OK
$ sudo apt-key fingerprint 0EBFCD88
pub   4096R/0EBFCD88 2017-02-22
      Key fingerprint = 9DC8 5822 9FC7 DD38 854A  E2D8 8D81 803C 0EBF CD88
uid                  Docker Release (CE deb) <docker@docker.com>
sub   4096R/F273FCD8 2017-02-22
```

リポジトリを設定する

```shell-session:~
$ sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"
```
## インストール

```shell-session:~
$ sudo apt-get update
$ sudo apt-get install docker-ce
```

インストールできているか確認する

```shell-session:~
$ sudo docker version

Client:
 Version:      18.03.1-ce
 API version:  1.37
 Go version:   go1.9.5
 Git commit:   9ee9f40
 Built:        Thu Apr 26 07:17:20 2018
 OS/Arch:      linux/amd64
 Experimental: false
 Orchestrator: swarm

Server:
 Engine:
  Version:      18.03.1-ce
  API version:  1.37 (minimum version 1.12)
  Go version:   go1.9.5
  Git commit:   9ee9f40
  Built:        Thu Apr 26 07:15:30 2018
  OS/Arch:      linux/amd64
  Experimental: false
```

## sudo権限なしでdockerコマンドを実行する設定

```shell-session:~
$ sudo usermod -aG docker $USER
```


参考：公式サイト
https://docs.docker.com/install/linux/docker-ce/ubuntu/
型のキャスト (as, as?, as!) について

# 型のキャスト
はじめに型のキャストとは、演算子`as`を用いて変数や定数の値をより具体的な型として扱う操作です。ここではアップキャストとダウンキャストについて説明します。

# アップキャスト
アップキャストとは、クラスの継承やプロトコルの準拠などの階層関係がある型どうしにおいて、上位の型として扱う操作です。

```swift

let str = "abc"   
let any = str as Any      //String型をAny型にアップキャスト
```
アップキャストはコンパイル可能な場合、常にキャストに成功します。
そのため、上記のような定数(および変数)の宣言時に`as`演算子によってアップキャストを行う場合、キャスト先の型として推論可能なため、型アノテーションが省略できます。


# ダウンキャスト
ダウンキャストとは、クラスの継承やプロトコルの準拠などの階層関係がある型どうしにおいて、下位の型として扱う操作です。
ダウンキャストはアップキャストと異なり、コンパイル可能な場合でもキャスト実行が失敗することがあります。
そのため、ダウンキャストの方法として`as!`と`as?`が用意されています。

# as!
`as!`はダウンキャストの際、強制的に右辺の型にキャストをします（強制キャスト）。

```swift

let any: Any = "abc"
let str = any as! String   //String型"abc"
let num = any as! Int      //Int型にキャスト失敗（実行時エラー）
```

上記では`Any`型`"abc"`を`String`型`"abc"`にダウンキャストは成功しているものの、`Int`型へのダウンキャストは失敗し実行時エラーとなります。

# as?
`as?`はダウンキャストが成功するか分からない場合に使用します。成功時はOptional<Wrapped>型となり、キャスト失敗時は`nil`となります。

```swift

let any: Any = "abc"
let str = any as? String   //Optional("abc")
let num = any as? Int      //nil
```

上記では　`Any`型`"abc"`をダウンキャストする際、成功時は`Optional("abc")`となり失敗時は`nil`となります。

# まとめ
アップキャストはコンパイル時にエラーが発見できますが、ダウンキャストはコンパイル成功時も実行時エラーとなる可能性があるため、注意する必要があります。
特に`as!`は値の型が保証されている場合は便利ですが、迷った場合は`as?`を用いることが良いかと思います。
[ECサイト]Rails製Solidus(v2.3.0)を触りだけやってみた

# 目的 
- Rails製Solidusを使うとECサイトがサクッと作れるらしんでやってみたことをメモ
- [solidus](https://github.com/solidusio/solidus)のGitHub

# 条件

- ruby 2.4.1
- Rails 5.1.6
- psql (PostgreSQL) 10.4
- Solidus(v2.3.0)

[[DB]MacにPostgreSQLをインストールする方法](https://qiita.com/shi-ma-da/items/f3cab71bd22cee2b9f98)

# 手順

1. プロジェクトフォルダを作成し、solidus関連のGemを導入
2. Gemをインストール後、指定されたコマンドで必要なファイルを作成
3. サーバーを起動してViewを確認



##1. プロジェクトフォルダを作成し、solidus関連のGemを導入

```bash:プロジェクトファイルを作成し、移動
mkdir solidus && cd $_
```

```bash:お決まりのnew/DBはpostgresql
rails _5.1.3_ new ./ -B -d postgresql --skip-turbolinks --skip-test
```

```ruby:Gemfile
# 下記2つを追加
gem 'solidus'
gem 'solidus_auth_devise'
```


```bash:お決まりのbundle
bundle install --path vendor/bundle --jobs=4
```
[[開発環境]プロジェクトごとにrailsの開発環境を設定する方法](https://qiita.com/shi-ma-da/items/9decaebe6ffe2890143e)


##2. Gemをインストール後、指定されたコマンドで必要なファイルを作成

```bash:yarnで「AdminLTE3.0.0-alpha.2」をインストール
# GitHubのREADMEを参照

bundle exec rails g spree:install

----
# 途中、管理ユーザーを作成するため、メール/パスワードを聞かれます

Create the admin user (press enter for defaults).
Email [admin@example.com]: (例)test@sample.com
Password [test123]: (例)111111
----

bundle exec rails g solidus:auth:install
bundle exec rake railties:install:migrations
```

```bash:DBに反映させる
# GitHubのREADMEを参照

bundle exec rake db:migrate

```


##3. サーバーを起動してViewを確認

```bash:サーバー起動
rails s
```

### フロント画面
![Image from Gyazo](https://i.gyazo.com/035efe8ddc0d3ce3556d2814cbb0d0e0.png)


### 管理画面ログイン(http://localhost:3000/admin/login)
![Image from Gyazo](https://i.gyazo.com/cec310c5a246145d3bea3ef4b5e81158.png)

### 管理画面
![Image from Gyazo](https://i.gyazo.com/f6e5f36dbd840ae3f911ebaf4387f919.png)

## 最後に
驚くほど簡単にできた。というか、ほぼコマンド入力のみの作業だけで終了した
カスタマイズするにはもっとやらないといけないけど、今はそんな時間ないので時がきたらやります。

[Rails製SolidusとStripeでカード決済対応のオンラインストアをつくる](http://elsur.xyz/solidus-and-stripe)
[管理画面]Spina(v1.0.3)を触りだけやってみた

# 目的 
- サクッと作れるらしんでやってみたことをメモ
-  Spinaのコンセプト「Spina CMS A beautiful CMS for Rails developers.」
- [Spina](https://github.com/SpinaCMS/Spina)のGitHub

# 条件

- ruby 2.5.0
- Rails 5.2.0
- psql (PostgreSQL) 10.4
- spina (v1.0.3)

[[DB]MacにPostgreSQLをインストールする方法](https://qiita.com/shi-ma-da/items/f3cab71bd22cee2b9f98)

# 手順

1. プロジェクトフォルダを作成し、Spina関連のGemを導入
2. Gemをインストール後、指定されたコマンドで必要なファイルを作成
3. サーバーを起動してViewを確認

##1. プロジェクトフォルダを作成し、Spina関連のGemを導入

```bash:プロジェクトファイルを作成し、移動
mkdir spina-sample && cd $_
```

```bash:お決まりのnew/DBはpostgresql
rails _5.2.0_ new ./ -B -d postgresql --skip-turbolinks --skip-test
```

```ruby:Gemfile
# 下記を追加
gem 'spina'
```


```bash:お決まりのbundle
bundle install --path vendor/bundle --jobs=4
```
[[開発環境]プロジェクトごとにrailsの開発環境を設定する方法](https://qiita.com/shi-ma-da/items/9decaebe6ffe2890143e)




##2. Gemをインストール後、指定されたコマンドで必要なファイルを作成

```bash:DB周りの初期設定を実行
rails db:setup
```

```bash:spinaに必要な設定を行う
# GitHubのREADMEを参照

rails g spina:install

----
# 途中、サイト名/テーマ/メール/パスワードを聞かれます
What would you like to name your website? [MySite] (例)test-site
What theme do you want to use? (default/demo) [default] (例)デフォルトなら[enter]
Please enter an email address for your first user: [admin@domain.com] (例)test@sample.com
Create a temporary password: [password] (例)111111
---

# 最後に登録内容が表示される
Your Spina site has been succesfully installed!

Restart your server and visit http://localhost:3000 in your browser!
The admin backend is located at http://localhost:3000/admin.

Site name      :  test-site
Active theme   :  default
User email     :  test@sample.com
User password  :  111111
```


##3. サーバーを起動してViewを確認

```bash:サーバー起動
rails s
```

### 管理画面ログイン(http://localhost:3000/admin/login)
![Image from Gyazo](https://i.gyazo.com/8e3eae71281d6ffb3a48ac9f18b7e241.png)

### 管理画面
![Image from Gyazo](https://i.gyazo.com/8be9f3aca2d3e24bfd21cd02148869af.png)

## 最後に
驚くほど簡単にできた。というか、ほぼコマンド入力のみの作業だけで終了した
カスタマイズするにはもっとやらないといけないけど、今はそんな時間ないので時がきたらやります。
[DB]MacにPostgreSQLをインストールする方法

# 目的 
- [Spina](https://github.com/SpinaCMS/Spina/blob/master/README.md) や[solidusio](https://github.com/solidusio/solidus)を使ってみたいときにPostgreSQLが必要なので！


# 条件
- macOS High Sierra(ver 10.13.5)
- [Homebrew](https://brew.sh/index_ja)

# 項目
- Homebrewを使用してPostgreSQLをインストール
- PostgreSQLの起動 / 起動確認 / 停止方法
- データベース一覧を表示

# Homebrewを使用してPostgreSQLをインストール

```bash:postgresqlをインストール
brew install postgresql
```

```bash:バージョン確認
psql -V

# psql (PostgreSQL) 10.4
```

```bash:インストール場所を確認
which psql

# /usr/local/bin/psql
```

# PostgreSQLの起動 / 起動確認 / 停止方法

```bash:起動
brew services start postgresql

# ==> Successfully started `postgresql` (label: homebrew.mxcl.postgresql)
```

```bash:起動状況の確認
brew services list

# postgresql started uesrname /Users/uesrname/Library/LaunchAgents/homebrew.mxcl.postgresql.plist
```

```bash:停止
brew services stop postgresql

# ==> Successfully stopped `postgresql` (label: homebrew.mxcl.postgresql)
```

# データベース一覧を表示

```bash:データベース一覧を表示
psql -l



      Name      |    Owner     | Encoding |   Collate   |    Ctype    |       Access privileges
----------------+--------------+----------+-------------+-------------+-------------------------------
 ec_development | Owner_name   | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
 ec_test        | Owner_name   | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
 postgres       | Owner_name   | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
 template0      | Owner_name   | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/name              
                |              |          |             |             | name=CTc/name
 template1      | Owner_name   | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/shimadayuhki              
                |              |          |             |             | name=CTc/name
```

## PostgreSQLを使ってみる

[[ECサイト]Rails製Solidus(v2.3.0)を触りだけやってみた](https://qiita.com/shi-ma-da/items/a9c13d986a6a323b2877)

[[管理画面]Spinaを触りだけやってみた](https://qiita.com/shi-ma-da/items/b439301f4468ce40a892)
EF6でDbContext内のDbSetを読み取るときにハマったこと


EF6のDBContextでのデータ読み込みの時、以下のコードは読める。DBへのアクセスが行われる。

```c#
    public class MyContext : DbContext , Interface.IMyContext
    {
        public DbSet<MyProject.Models.Something> MySomething { get; set; }
    }
```

しかしこれは読めない。まあこれはなんとなくわからんではない。

```c#
    public class MyContext : DbContext , Interface.IMyContext
    {
        internal DbSet<MyProject.Models.Something> MySomething { get; set; }
    }
```

インターフェイス経由にしても読めない。

```c#
    public class MyContext : DbContext , Interface.IMyContext
    {
        DbSet<MyProject.Models.Something> IMyContext.MySomething { get; set; }
    }
```

DbContext内にあるモデルに対するアクセスは、Publicでないといけないようだ。

インターフェイス経由にして結合度を下げようと思ってたが、この制約により、もう一段階、何かを噛まさねばならなくなった。
Let's Encryptの証明書を使ってSQLServer Linuxへの接続の暗号化をしてみる

[Let's Encryptの証明書を使ってSQLServer Linuxへの接続の暗号化をしてみる](https://竹内電設.com/post/letsencrypt%E3%81%AE%E8%A8%BC%E6%98%8E%E6%9B%B8%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6sqlserverlinux%E3%81%B8%E3%81%AE%E6%8E%A5%E7%B6%9A%E3%81%AE%E6%9A%97%E5%8F%B7%E5%8C%96%E3%82%92%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B/)の抜粋版です

## Let's Encryptの証明書を取得する

```
$ certbot-auto certonly --standalone -d sqldb.example.com --standalone-supported-challenges http-01
IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/sqldb.example.com/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/sqldb.example.com/privkey.pem
   Your cert will expire on 20**-**-**. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot-auto
   again. To non-interactively renew *all* of your certificates, run
   "certbot-auto renew"
```

## 取得した証明書をコピーする

```
$ sudo mkdir /var/opt/mssql/ssl

$ sudo chown mssql:mssql /var/opt/mssql/ssl

$ sudo cp /etc/letsencrypt/live/sqldb.example.com/cert.pem /var/opt/mssql/ssl

$ sudo cp /etc/letsencrypt/live/sqldb.example.com/privkey.pem /var/opt/mssql/ssl

$ sudo chown mssql:mssql /var/opt/mssql/ssl/*

$ sudo chmod 600 /var/opt/mssql/ssl/*
```

## SQLServerへの接続を暗号化する

```
$ sudo systemctl stop mssql-server

$ sudo cp /var/opt/mssql/mssql.conf /var/opt/mssql/mssql.conf.orig

$ sudo /opt/mssql/bin/mssql-conf set network.tlscert /var/opt/mssql/ssl/cert.pem

$ sudo /opt/mssql/bin/mssql-conf set network.tlskey /var/opt/mssql/ssl/privkey.pem

$ sudo /opt/mssql/bin/mssql-conf set network.tlsprotocols 1.2 

$ sudo /opt/mssql/bin/mssql-conf set network.forceencryption 0 

$ sudo systemctl start mssql-server 
```
centos6にphp7.1をインストールする

AWSで作成したCentOSのサーバにPHPをインストールした際のメモです。

#Remiリポジトリを取得する
```
yum install http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
```

#既に古いバージョンがインストール済みの場合、消す
```
yum remove php*
```

#PHP7.1をインストール
```
yum install --enablerepo=remi,remi-php71 php php-bcmath php-dba php-devel php-gd php-imap php-mbstring php-mysql php-pdo php-soap php-xml php-xmlrpc php-pear httpd-devel
```
※インストールするパッケージは例なので、要件に応じて追加／削除してください。


#PHPバージョンを確認
```
php --version
```
「We're sorry, but something went wrong.」のデバッグ方法【Ruby on Rails】

はじめまして、ますみです！

[![自己紹介.png](https://www.umi-mori.jp/wp-content/uploads/2023/02/introduction_banner_2-2048x533.png)](https://bit.ly/banner_intro_masumi_creator_qiita)


# はじめに
[Heroku](https://jp.heroku.com/)にRuby on Railsで作成したアプリをデプロイする際に生じたバグです。1度目のデプロイの時は問題なかったのですが、更新した際に次のようなバグが生じてしまいました。

# \# バグの内容
- 「`Herokuにデプロイした後、ブラウザで開くとエラーが生じる`」
- 具体的なエラーコード：`We're sorry, but something went wrong. If you are the application owner check the logs for more information.`

<img width="500" alt="スクリーンショット 2018-07-08 4.07.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/240280/5e359f47-158c-fab6-bc49-e8d79febda0b.png">

# \# バグの原因
色々な原因のパターンが考えられるが、自分の場合は「`データベースの変更が更新されていなかった`」ためだと考えられる。
1度目にデプロイした際は問題なく、色々な変更（データベースの変更もあり）を行ったプログラムを更新（デプロイ）する際、生じたバグだった。

# \# デバッグ方法
以下のコマンドを実行し、heroku上のデータベースをリセットする。

```terminal:code
heroku run rake db:migrate
```

# 最後に
最後まで読んでくださり、ありがとうございました！
いかがだったでしょうか？

この記事を通して、少しでもあなたの学びに役立てば幸いです！

:::note info
【仕事の相談はこちら】
お仕事の相談のある方は、下記のフォームよりお気軽にご相談ください。

[問い合わせフォームはこちら](https://forms.gle/G5g1SJ7BBZw7oXYA7)

もしもメールでの問い合わせの方がよろしければ、下記のメールアドレスへご連絡ください。

info*galirage.com（*を@に変えてご送付ください）

🎁 「生成AI活用の無料相談券」もしくは「生成AIの社内ガイドライン（無料PDF）」を『公式LINE』で配布中 🎁
『生成AIを業務に活用したいけど、どうしたらいいかわからない』といった声を多くいただきます。

Galirageでは公式LINEにて、チャットやオンライン会議で「完全個別の生成AI活用無料相談会」を実施しております！
（期間限定で実施しているため、ご興味ある方はお早めに以下のLINE公式アカウントをご登録ください^^）
https://lin.ee/rvz6lMN

※ 予告なく、キャンペーンを終了する可能性がございますが、ご了承ください。

【業務内容】
具体的には、以下のお仕事を中心に受け付けております！（[詳しくはこちら](https://galirage.notion.site/Galirage-AI-c2f3945fafb0433d8d2fd03e56927fd8)）
1. 受託開発（例：生成AIを使った社内システムの開発）
2. コンサルティング（例：技術戦略のアドバイス）
3. 講演（例：社内研修、イベント登壇）

※ 特に「生成AIを使ったシステム開発のご依頼」が多く、ご好評いただいております。

【これまでの相談事例】
以下のようなご相談が多くあります。

🔑 機密情報を漏洩させないための、生成AIのシステム構築をお願いしたい。
🤖 自社データを用いたFAQチャットボットの作り方を知りたい。
💡 ChatGPTを、自分たちの事業にどのように活かせるか、アドバイスやアイデアが欲しい。
:::
# おまけ
エンジニアの仲間（データサイエンティストも含む）を増やしたいため、公式LINEを始めました🎉

「**一緒に仕事をしてくれる方**」「**友だちとして仲良くしてくれる方**」は、友だち追加をしていただけますと嬉しいです！（仲良くなった人たちを集めて、「ボードゲーム会」や「ハッカソン」や「もくもく会」もやりたいなと考えています😆）

とはいえ、みなさんにもメリットがないと申し訳ないので、特典を用意しました！

友だち追加後に、アンケートに回答してくれた方へ「**エンジニア図鑑（職種20選）**」のPDFをお送りします◎

https://lin.ee/hFUN4TL

[![](https://www.umi-mori.jp/wp-content/uploads/2023/10/line_banner_v2.png)](https://lin.ee/hFUN4TL)
# 参考文献

https://www.umi-mori.jp/article/ruby-on-rails/tips.php
Virtualbox起動時に出たエラー[Kernel driver not installed (rc=-1908)]の対処(備忘録)

##はじめに
```
WARNING: The vboxdrv kernel module is not loaded. Either there is no module
available for the current kernel (4.11.1-1-MANJARO) or it failed to
load.

Please recompile the kernel module and install it by

sudo /sbin/vboxconfig

You will not be able to start VMs until this problem is fixed.
Qt WARNING: libpng warning: iCCP: known incorrect sRGB profile
```

上記ののようなエラーがでたので、上記の言われるように**sudo /sbin/vboxconfig**を入力したところだめみたいなので調べたところ**setup**が足りないようなので下記のように打ち実行できればOK

```
$ sudo /sbin/rcvboxdrv setup
```
以上
VB.NETでAzure Storageを使う

#はじめに
VB.NETのオンプレミスのアプリケーションでは、ファイルアップロードする際にSaveAs関数を使ってサーバー上にファイルを一時保存することができました。
が、Azureに乗せるアプリケーションでは、サーバーのCドライブなどへは直接アクセスできないのでSaveAs関数が使えません😥
対処方法として、AzureのファイルストレージであるBlobストレージを使用してファイルアップロードの処理を書いてみましょう😆

##オンプレ版のコード
以下のファイルアップロードするプログラムをAzure用に書き換えていきたいと思います❗

```
Dim uploadFile As HttpPostedFile
Try
    uploadFile.SaveAs("C:¥UploadData¥uploadFile.csv")
Catch ex As IOException
    Return
```

##Azure版のコード
まずはNuGetパッケージマネージャーでWindowsAzure.Storageをインストールします
インストールができたらプログラム内にインポート文を記述します

```
Imports Microsoft.WindowsAzure.Storage
Imports Microsoft.WindowsAzure.Storage.Blob
```

以下が修正後のプログラムです
ホントは接続文字列はWeb.configに書くんですけど、今回は分かりやするために直書しています😉


```
Dim uploadFile As HttpPostedFile
Try
    Dim connectionString As String =　"接続文字列"
    Dim account = CloudStorageAccount.Parse(connectionString)
    Dim blobClient As CloudBlobClient = account.CreateCloudBlobClient()
    Dim container As CloudBlobContainer = blobClient.GetContainerReference("コンテナー名")
    container.CreateIfNotExists()
    Dim name As String = "uploadFile.csv"
    Dim blob As CloudBlockBlob = container.GetBlockBlobReference(name)
    blob.UploadFromStreamAsync(uploadFile.InputStream)
Catch ex As IOException
    Return
```


以上でファイルアップロードの処理ができるようになりました
C＃のサンプルコードはネットの海にたくさん溢れているのに、VB.NETは全然ないので困りますね😥
設定ファイルをgitで管理する

##参考にした記事
- [dotfilesをGitHubで管理](https://qiita.com/okamos/items/7f5461814e8ed8916870)

##上の記事から変更した点
上記事ないでのシンボリックリンクを貼るスクリプトdotfilesLink.shの代わりに、以下のmakeLinks.bashを使う。

```bash:makeLinks.bash
#!/bin/bash

#usage
#./makeLinks.bash or bash makeLinks.bash


for file in `find -maxdepth 1 -mindepth 1 -name ".*" -not -name ".git"` ; do
   ln -sf $HOME/dotfiles/${file:2} $HOME/${file:2}
done

```
kotlinでswiftのguardっぽいやつ

swiftのguardを利用してのnull許容型のアンラップが便利だったのですが、kotlinで似たようことができるように拡張関数を作成しました。

まずは、swift知らない人のためにswiftのguard例を。

```swift:swift
guard let message = nullableMessage else {
	print("nilですよ？")
	return
}
print(message)
```

letで代入とnilチェックができるのが便利でした。
これのkotlin版を実装してみました。

```kotlin:extension.kt
inline fun <T> guard(value: T?, ifNull: () -> Unit): T {
    if (value != null) return value
    ifNull()
    throw Exception("Guarded from null!")
}
```

`value`がnullだった場合に例外を投げてます。これは戻り値を非Null型の`T`で返さないと意味がないので、値を返しようがないので例外にしました。

呼び出し側ですが、こんな感じで使います。

```kotlin
val args = guard(arguments) {
    throw IllegalStateException("argumentsがnullです")
}
val hoge = args.getSerializable("HOGE") as Hoge
...
```

基本的に`ifNull`のラムダ内ではreturnかthrowをすることになると思います。何もしなかったら前述の例外`Guarded from null!`となるわけです。

拡張関数はめちゃ融通が効くなあ・・・。
mauticとrailsを連携するときにOAuth2認証でハマった

# 前提
mautic、railsってそもそも何なの？って説明は省きます。
# この記事を書いたきっかけ
[RailsのサイトにMauticを導入する方法](http://masakiz.hateblo.jp/entry/2018/06/11/001338)
公式、先駆者の記事を見て構築すればmauticとrailsをすんなり連携できるのですが
認証周りでハマってしまいかなり時間を無駄にしてしまったためメモとして残します。

# スクリプト作成
rails側のUserとmauticのcontactでemailが一致するデータに対して名前を更新するスクリプトを作成
###  rails→mautic連携するスクリプト
```task_name.rb
namespace :task_name do
  desc "実行処理の説明"
  task :create, ['name'] => :environment do |task, args|
    conn = Mautic::Connection.last
    # emailが一致しているデータをMauticへ連携する（実際の業務ではDBから取得した値を使うでしょう）
    contact = conn.contacts.where(search: "email: dummy@dummy.co.jp").first 

    # ユーザ情報を格納する
    contact.firstname = "ほげ"
    contact.lastname = "ほげお"

    # ユーザ情報をMauticに保存する
    if contact.save then
      Rails.logger.info('success')
    else
      Rails.logger.error("error: #{contact.errors}")
    end
  end
end
```

# 実行してみた
なんかエラー出た・・・

```
$ rake task_name:create
rake aborted!
A refresh_token is not available
/Users/hoge/projects/rails/lib/tasks/task_name.rake:14:in `block (2 levels) in <main>'
Tasks: TOP => task_name:create
(See full trace by running task with --trace)
```
>A refresh_token is not available

リフレッシュトークンが設定されてませんですよと:sob:
何か手順抜けたのか・・・
うーん、とりあえずgemの中身みたり、公式のドキュメント読んでみるしかないか:point_up:

# 色々調べてみた
mauticのgemやOauth2のgemのソースを読んでみたが
公式のPHPのアプリケーションでのHow toを読んで何が足りてないのか理解できた
→[How to Use the Mautic Rest API](https://www.mautic.org/blog/developer/how-to-use-the-mautic-rest-api/)

かなりざっくり言うと先にtokenを発行しておいてとのこと:raised_hand:

# 解決方法
`http://localhost:3000/mautic/connections/1/authorize`にアクセス

rails側のmautic_connectionsが更新され、`token`と`refresh_token`が発行できた:v:

```
   (0.1ms)  begin transaction
  ↳ /Users/hoge/.rbenv/versions/2.5.0/lib/ruby/gems/2.5.0/gems/activerecord-5.2.0/lib/active_record/log_subscriber.rb:98
  Mautic::Connections::Oauth2 Update (0.4ms)  UPDATE "mautic_connections" SET "token" = ?, "refresh_token" = ?, "updated_at" = ? WHERE "mautic_connections"."id" = ?  [["token", "hoge_token"], ["refresh_token", "hoge_refresh_token"], ["updated_at", "2018-07-07 16:23:32.467550"], ["id", 1]]
  ↳ /Users/hoge/.rbenv/versions/2.5.0/lib/ruby/gems/2.5.0/gems/activerecord-5.2.0/lib/active_record/log_subscriber.rb:98
   (3.0ms)  commit transaction
```
![スクリーンショット 2018-07-08 1.30.37.png](https://qiita-image-store.s3.amazonaws.com/0/232177/7cde12ed-033a-f213-f1c1-c59048d7a13e.png)


## 参考サイト
- [RailsのサイトにMauticを導入する方法](http://masakiz.hateblo.jp/entry/2018/06/11/001338)
- [MIXIN: RUBY ON RAILS API CLIENT](https://www.mautic.org/mixin/ruby-rails-api-client/)
- [How to Use the Mautic Rest API](https://www.mautic.org/blog/developer/how-to-use-the-mautic-rest-api/)
- [mautic連携するためのgem](https://github.com/luk4s/mautic-rails/)
紙を何回折るとスカイツリーやエッフェル塔の高さに届くか調べてみた

以前、紙を43回折ると月に届くというのを聞いたのを思い出し、じゃあスカイツリーとかエッフェル塔とかは何回で届くんだろうかと思ったので興味本位で計算してみました。

計算にはPython3.5を用いました。

# 導出
まずは方程式を導きます。

yを紙を折る回数、xを紙の厚さ、hを建物の高さとすると、

```math
h = 2^yx
```

```math
\log_2h = \log_22^y + \log_2x
```

```math
y = -\log_2x + \log_2h
```

# コード化

xの単位はミリメートル、hの単位はメートルとします。

```py
import math

def calc(x, h):
    # convert kilometers to millimeters
    h = h * 100 * 10
    y = -math.log2(x) + math.log2(h)
    # round up decimal point
    return math.ceil(y)
```

# 計算
今回は紙の厚さを0.09mmとして計算していきます。スカイツリーやエッフェル塔だけでなく、いろいろな建設物で試してみました。

## スカイツリー
完工：2012年5月22日
高さ：634m
特徴：日本で最も高い建設物
届くまでの回数：23回


## ピラミッド（クフ王）
完工：紀元前2500年頃
高さ：146m
特徴：14世紀まで最も高い建設物であった
届くまでの回数：21回

## エッフェル塔
完工：1889年3月15日
高さ：300m
特徴：フランスの有名な観光地にもなっている建設物
届くまでの回数：22回

## 上海タワー
完工：2016年3月12日
高さ：632m
特徴：中国で最も高い建設物
届くまでの回数：23回

## ブルジュ・ハリファ
完工：2010年1月4日
高さ：828m
特徴：現時点で世界一高い建設物
届くまでの回数：24回

## キングダム・タワー（未着手）
完工：2019年を予定
高さ：1008m
特徴：現在建設中の建物で完成すれば世界一高い建設物になる
届くまでの回数：24回

## ドバイ・シティタワー（未着手）
完工：2025年に完成予定
高さ：2400m
特徴：計画は進んでいるそう
届くまでの回数：25回

## 東京バベルタワー（未着手）
完工：未定
高さ：10000m
特徴：日本がバブル時代に考え出した建設物で、建設費が3000兆円、建設期間は150年かかる(到底無理)
届くまでの回数：27回

# おまけ

スカイツリーの高さに届くまでの紙を折る回数と紙の厚さとの関係をグラフにするとこんな感じになります。縦軸は紙を折る回数、横軸は紙の厚さです。

![fold_paper.png](https://qiita-image-store.s3.amazonaws.com/0/243199/a3f5788b-a748-8305-c59e-9680cfa72158.png)
CubeMX+LL APIでSTM32マイコンのPWM出力

#CubeMX + LL API で TIM1 から PWM 出力が出ない？

　STM32マイコン、はじめました。躓きました。
　あまりメジャーでなさそうな組み合わせの、CubeMXとLL APIでPWM信号を出力しようとしたのですが、まる一日悩んでしまいました。
　結論としては、原因はTIM1が他のタイマと一部異なる設定が必要なことで、LL_TIM_EnableAllOutput関数を呼ぶと（BTDRレジスタのMOEビットを立てると）解決しました。LL APIのサンプルはこの関数を呼んでいないので、もしかするともっと根本的な解決方法があるかもしれません。

(HAL APIだとちゃんとPWM信号を出せるのですが、内部にある大量のif文と引数チェックを見てアレルギーを起こしました。もっと高級なプログラム書く様になったら使います。)

#環境
* STM32F334R8 + ST-Link v2 (Nuculeo Boardのやつ)
* STM32CubeMX (version 4.26.0)
 * STM32Cube V1.0

##CubeMXの設定
![image.png](https://qiita-image-store.s3.amazonaws.com/0/231644/2fd995b2-8c52-5825-d688-5eaaf0f6419b.png)

![2018-07-08 (4).png](https://qiita-image-store.s3.amazonaws.com/0/231644/882b5cf1-81f1-b129-0316-bb5efbecb228.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/231644/179dbb44-be25-05cd-6fbe-6a5bef05230f.png)


##プログラム
　CubeMXが生成したプロジェクトの main.c 内、下の様に書き加えました。理由はまだ分かっていないのですが、LL_TIM_EnableAllOutputs()関数を呼ばないと、カウンタが動いていてもPWM出力がされないみたいです。

<details><summary>今分かっていること</summary>
2018/07/08
タイマ設定用レジスタの一つ、BDTRのMOEビットが間接的な原因になっていると考えています。Referenceでこのビットが出力をOn/Offする機能を持っていることが触れられていま。LL_TIM_EnableAllOutputs()はこのビットを立てる関数です。
この例ではTIM1を使っていたのですが、サンプルではTIM2を使っていたためMOEビットの扱いがよく分からなかったのかもしれません。。こちらの記事に、TIM1とTIM15を特別扱いしなければいけない例がありました。
https://qiita.com/kanehara/items/119b554703bf4273d35b
こちらにも有りました。これを見て原因が大分分かったかも。
http://blueeyes.sakura.ne.jp/2017/12/29/729/
</details>


```c:main.cの一部
/* USER CODE BEGIN 2*/

LL_TIM_CC_EnableChannel(TIM1, LL_TIM_CHANNEL_CH1);
LL_TIM_EnableCounter(TIM1);

LL_TIM_EnableAllOutputs(TIM1); // これが無いと動かない

/* USER CODE END 2 */
```

この追加部分は、STM32Cube内のサンプルプログラムを参考にしました。Windowsであれば、
C:\Users\（ユーザ名）\STM32Cube\Repository\（該当するライブラリ）\Projects\（該当するボードやマイコン）\Examples_LL\TIM\TIM_PWMOutput
あたりに入っています。

#結論→LL_TIM_EnableAllOutputs()を使うと何故か動く
一応動いた訳ですが...一体何が原因なのか...
もし知っている方がいらっしゃったら、コメントで教えて下さると嬉しいです。僕の睡眠の質が格段にアップします...
［iOS 12］Natural Languageフレームワークのメモ

iOS 12で追加されたNatural Languageフレームワークのスニペットとかを置いていきます。自分で動作確認したものだけ。何か試すたびに追記していく予定。

### 名前の検出

`NLTagger`で`personalName`（人の名前）, `placeName`（場所の名前）, `organizationName`（組織の名前）をタグ付けし、抽出する。

```swift
func extractNames(from sentence: String) -> [String] {
    let tagger = NLTagger(tagSchemes: [.nameType])
    tagger.string = str
    let range = str.startIndex ..< str.endIndex
    
    var names = [String]()
    let nameTags: [NLTag] = [.personalName, .placeName, .organizationName]
    tagger.enumerateTags(in: range, unit: .word, scheme: .nameType) { (tag: NLTag?, tokenRange: Range<String.Index>) -> Bool in
        if let tag = tag, nameTags.contains(tag) {
            let name: Substring = str[tokenRange]
            names.append(String(name))
        }
        return true
    }
    return names
}
```

ポイント: 

- `NLTagger`の`enumrateTags`メソッドに、`NLTagScheme`として`.nameType`を指定
- それ以外の単語としてタグ付けされたものも結果に入ってくるので、`NLTag`の型を見てフィルタリングする

結果:

```swift
private let str = "Tim Cook welcomes developers from 77 different countries to WWDC 2018."
```

> ["Tim", "Cook", "WWDC"]

ちなみに`"iOS 12 is designed to make your iPhone and iPad experience even faster, more responsive, and more delightful."`を入力したときは、何も名前としてはタグ付けされなかった。"iOS", "iPhone", "iPad"といった固有名詞もタグとしては`.otherWord`になっていた。

### カスタム言語モデルの使用

**Create MLで学習させたCore MLのカスタムモデル**を使ってテキストを分類／ラベリングする。主要クラスとしては`NLModel`。

カスタムモデルファイル名を`MyTextClassifier.mlmodel`とすると、

```swift
func predictLabel(for sentence: String) -> String {
    let mlModel = MyTextClassifier().model
    let nlModel = try! NLModel(mlModel: mlModel)
    
    guard let label = nlModel.predictedLabel(for: sentence) else { fatalError() }
    
    return label
}
```

結果: 

試したのはネガティブ／ポジティブ判定モデル。

```swift
let label = predictLabel(for: "I'm happy.")
print(label)
```

> pos

```swift
let label = predictLabel(for: "I'm sad.")
print(label)
```

> neg
【初心者】就活のためにJavaの勉強を始めてみた話〜5ヶ月目〜


こんにちは。
地方の無名文系大学に通う3年生です。

私は就活のために５ヶ月程前からプログラミングの勉強をしています。
勉強を始めたきっかけなどについて気になる方は1ヶ月目の記事を見て頂ければと思います。

[【初心者】就活のためにJavaの勉強を始めてみた話〜1ヶ月目〜]
(https://qiita.com/ayumitani611/items/8da091cb0f0447b509eb)

今回は

- ５ヶ月目に取り組んだ内容
- ギークフェスタに参加してみて
- インターンシップにエントリーしてみて

の３つの観点から記事を書いていきます。

## **５ヶ月目に取り組んだ内容**

私が５ヶ月目に取り組んだ内容は主に

- アプリの開発
- Progateでの言語の学習

です。

開発は、４ヶ月目に引き続きキッチンタイマーのAndroidアプリの開発を行ってきました。

前回の記事以降に完了した内容は

- カウントダウンタイマーの実装
- タイマーのスタート・ストップボタンの実装
- タイマー終了時に鳴らすアラームの実装

です。

また 前回の段階では、カウントダウンする時間を表す数字の上下に表示されたボタンを押すことで、時間の長さを調節できるようにしていましたが、NumberPickerを使用して時間を調節できるように変更しました。
それに伴い、画面のレイアウトも多少変更しました。

ここまでの段階で、基本的なキッチンタイマーとしての役目は果たせる状態にできたので、ひとまずバージョン１の完成としました。
今後は、バージョン１の機能に加えて よく使用する時間と用途を保存できる機能を実装していく予定です。

前回からバージョン１完成の間で特に苦労した点は、タイマーを実際に動くようにすることです。
CountDownTimerクラスを使用して実装を行ったのですが、ネットで色々な関連記事を見ても自分のアプリに合ったコードの書き方がなかなか分かりませんでした。
他にも、タイマー終了時に合わせてアラームが鳴るようには出来たものの、タイマーを途中で止めてもアラームは止まらず時間通りに鳴ってしまうというような問題もありました。
これらの問題は解決出来たのですが、スタートボタンをタイマー開始後から終了前の間にもう１度押してしまうとバグが起きてしまうような状態になっているので、そのような点に関しても今後改良していきたいです。


progateでは、今回はSwiftについて学習しました。
何故言語の勉強もしようと思ったかというと、これからインターンのエントリーシートを出したり、本格的に就活を進めたりする上で自分が現段階で扱える言語がJavaだけというのは心許ないと感じたからです。
また、色々な企業のエンジニア職について調べた結果Java以外の言語で開発を行っているところが多いことが分かったからです。

Swiftを勉強してみて感じたことは、最初にJavaを学習した時と違い ある程度知識があるので思ったよりも早く理解できるということです。
以前は初めて聞く用語ばかりで、変数と定数の違いすらも危うい状態でしたが、今回はJavaで学習した内容が多少変化した程度の認識で進めることが出来たので楽でした。
しかし一方で、Javaを知っているがために頭の中で知識が混ざり合い、混乱してしまうという部分もありました。

６ヶ月目では、Swift以外の言語にも触れてインターンに生かしていきたいと思います。


## **ギークフェスタに参加してみて**

6/24開催のサポーターズさん主催のイベント「ギークフェスタ」に参加してきました。
前回参加したイベントは総合職の合同説明会だったので、私にとって今回が初めてのエンジニア向け就活イベントでした。
今回のイベントでは企業ごとのブースで説明を受けたり、座談会のような形でお話を伺えたり、最後には懇親会としてお酒を飲みながらお話もできたりと、とても充実した時間を過ごせたと思います。

企業ごとの説明会では、会社の概要や特色の他には主にインターンについての説明がありました。
インターンの期間中の宿泊費や交通費の補助だけでなく、他の社員の方々と同じように食堂が使えるなど、そこまで待遇がいいのかと驚くような企業も多く、驚きました。
私のような地方の学生でも費用を気にせずにインターンに参加できるというのはとてもありがたいことだと感じました。
インターンの内容も、１つの企業の中でも色々なコースがあり、自分の興味に合わせたものを選べるというのは魅力的でした。

今回のイベントに、前回参加した合同説明会にもいらっしゃった方がおり、私のことを覚えているようでしたので、こういったイベントの説明でいくら「気軽に参加してよい」「選考で不利になることはない」と言われていても、悪い印象にはならないようには気をつけなければならないと感じました。
また、自分が思っていたよりも簡単に企業の方の印象に残ることがあると分かったので、積極的に質問をするなどでプラスのイメージを持ってもらえるように頑張っていこうと思いました。


## **インターンシップにエントリーしてみて**

ギークフェスタで聞いた説明などを参考に、何社かのインターンシップにエントリーをしました。

エントリーシートを書くことで、自分について今までで一番真剣に考えました。
私は比較的自己評価が低く、自分をアピールすることが極端に苦手なのでとても苦痛な作業でした。
しかし、今回はインターンなのでたとえ選考に落ちても致命傷とまではいきませんが、来年エントリーシートを書く時にはインターンではなく就職がかかっているので、今のうちに慣れておかなければならないと思いました。
また、私にはまだ経験が足りないので、自信を持ってエントリーシートに書けるだけのことを身につけなければならないと思いました。

現在 既にエントリーシートでの選考を通過している企業もあり、先日第２選考であるSPI試験を受けてきました。
SPI試験の内容自体は、非言語であれば十分に理解でき、言語でも考えればある程度できるというレベルのものでした。
しかし、問題は時間が圧倒的に足りないという点で、結局満足に解ききれないまま終了時間を迎えてしまいました。
折角エントリーシートでの選考を突破出来たのに、SPIで足切りされるというのは絶対に避けたいので、今後の選考に向けてもSPI対策は続けていかなければならないと感じました。

## **最後に**

最後まで読んでくださってありがとうございました。

毎回拙い文章での進捗報告ですが、たくさんの方が見てくださり、いいねやフォローをしてくださって、とても励みになっております。
また、前回の記事ではコメントを書いてくださった方もいらっしゃり、とても参考になりました。
本当にありがとうございます。

次は8月の上旬に6ヶ月目の進捗を書きたいと思いますので、ご覧いただければ幸いです。
C# ArrayListについてのメモ

自分用のメモです

#ArrayList
配列は宣言時にサイズ（要素数）が固定されるが、ArrayListクラス型の配列を使うと必要に応じて動的にサイズを増加させることが可能。これは、要素を追加するごとにメモリの再割り当てが行われるためである。
ArrayListクラスでは、格納する要素をすべてobject型として扱う。object型はすべてのクラスの基本クラスのため、すべてのデータ型の値を格納することができ、複数のデータ型を混在させることも可能。

+ ArrayListを使う

```cs
using System.Collections;
namespace App
{
    class Program
    {
        static void Main(string[] args)
        {
            ArrayList ary = new ArrayList();
            ary.Add("abc");
            ary.Add(10);

            Console.WriteLine(ary[0]);//abc
            Console.WriteLine(ary[1]);//10

            Console.WriteLine(ary[0].GetType());//String
            Console.WriteLine(ary[1].GetType());//Int32
        }
    }
}

```

ArrayListのコレクションには、あらゆる型のデータを格納することができる。
string型とint型の値を格納し、GetTypeメソッドで型を取得し表示させる。

+ ArrayListにおけるキャスト

GetType()でコレクションの型を取得したが、これはそれぞれの要素として格納されている値の型が表示されただけで、要素そのものの型はすべてobject型になる。
以下の場合はコンパイルエラーとなる

```cs
string str = "abc";
ary.Add(str);//stringがobjectにキャストされる
str = ary[0];//string型の変数にobject型は代入できない
```

このような場合はキャストを行う必要がある

```cs
str = Convert.ToString(ary[0]);
```
C# の string で Python の Slice を実装してみる

# 概要

.NET の string.SubString() は、length に文字列の長さ以外を設定するとエラーになったりして、使い勝手が悪いので、Python の スライスと同等の関数を作ってみました。

# 実装

### 定義

```C# 
  public static class StringEx
  {
    /// <summary>
    /// Python の スライスと同じ結果を取得します。
    /// </summary>
    /// <param name="target">このインスタンス。</param>
    /// <param name="startIndex">開始文字位置。</param>
    /// <returns>
    /// このインスタンスの startIndex で始まる部分文字列と等価もしくは取得可能な文字列。
    /// </returns>
    public static string Slice(this string target, int startIndex)
    {
      if (target == null) return "";
      if (target.Length < startIndex) return "";
      return Slice(target, startIndex, target.Length);
    }

    /// <summary>
    /// Python の スライスと同じ結果を取得します。
    /// </summary>
    /// <param name="target">このインスタンス。</param>
    /// <param name="startIndex">開始文字位置。</param>
    /// <param name="endIndex">終了文字位置。</param>
    /// <returns>
    /// このインスタンスの startIndex から endIndex までの部分文字列と等価もしくは取得可能な文字列。
    /// </returns>
    public static string Slice(this string target, int startIndex, int endIndex)
    {
      if (target == null) return "";
      int targetLen = target.Length;
      if (targetLen < startIndex) return "";
      if (startIndex < 0)
      {
        startIndex = targetLen + startIndex;
        if (startIndex < 0) startIndex = 0;
      }
      if (endIndex < 0)
      {
        endIndex = targetLen + endIndex;
        if (endIndex < 0) endIndex = 0;
      }
      if (startIndex >= endIndex)
      {
        return "";
      }
      int len = endIndex > targetLen ? targetLen - startIndex : endIndex - startIndex;
      return target.Substring(startIndex, len);
    }
  }

```

### 呼び出し

```C# 

Console.WriteLine("abcde".Slice(0));   // "abcde"
Console.WriteLine("abcde".Slice(1));   // "bcde"
Console.WriteLine("abcde".Slice(3));   // "de"
Console.WriteLine("abcde".Slice(5));   // ""

Console.WriteLine("abcde".Slice(-1));  // "e"

Console.WriteLine("abcde".Slice(3,4)); // "d"

```

## 補足

拡張メソッドを使った実装になります。呼び出し先で StringEx に対して using を記載してください。

# 編集後記

余裕があれば、Collection 版も作成したい。
Jupyter / ipywidgetsで簡易アニメーションプレイヤーを実装する

# 概要
Jupyter / ipywidgetsで__簡易__アニメーションプレイヤーを実装しました．
以下のような形でアニメーションを再生できます．

![earth.gif](https://qiita-image-store.s3.amazonaws.com/0/244005/c75605ad-29ca-fff8-584b-68132196461c.gif)

そもそものモチベーションとしては，「連番画像を手軽にJupyterで再生したい」でした．
方法として`matplotlib.animation`が真っ先に浮かんだのですが，これを用いてスムーズに実装できた事が私はあまり無く，時間を注ぐような部分でもなかったので，今回は`ipywidgets`単体でのシンプルな実装を試みました．

# 実装

以降のコードでは，連番画像は変数 `movie` に入っており，そのshapeは `(t, h, w, c)` であるものとします．

```python
import os
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
import seaborn as sns
from ipywidgets import IntSlider
from ipywidgets import Play, jslink, HBox
from ipywidgets import interactive_output
```

まず本体のコードになります．今回は `ipywidgets` の `Play`, `IntSlider`,   `interactive_output` などを組み合せてプレイヤーを実装しています．

```python
def plotPlayer(plot, start, end, interval=250, step=1):
    play = Play(min=start,
                max=end,
                step=step,
                interval=interval,
                description="Press play",
                disabled=False
                )
    slider = IntSlider(min=start, max=end)
    jslink((play, 'value'), (slider, 'value'))
    controller = HBox([play, slider])
    output = interactive_output(plot, {'t': slider})
    return display(controller, output)
```
`Play` は再生・一時停止・停止・リピートといったようなプレイヤー部分を，`IntSlider` はその名の通り，スライダー部分となっています．`jslink` はプレイヤーとスライダーの同期を取っています．

各引数の意味や，他の `Widget` については， [公式ドキュメント](https://ipywidgets.readthedocs.io/en/latest/examples/Widget%20List.html) がコード例もついていてわかりやすいのでそちらを参照ください．このコードも殆どそれに沿ったものになっています．

最後の2行で，ここまでで作成したWidgetと，画像表示部分を合わせて表示しています．`innteractive_output()` の引数にある `plot` ですが，これはアニメーションさせたいものに合わせて自分で作る必要のある関数です．今回は画像表示のために以下のような関数を用意しています．至って単純なプロットを行う関数ですが，注意点としては，引数の `t` が `innteractive_output()` の第2引数と対応しているという点です．ここを合わせておかないと，全てが同期して動いてくれません．

```python
def plotMovie(t, figsize=(12, 8)):
    plt.figure(figsize=figsize)
    plt.imshow(movie[t])
    plt.grid(False)
    plt.show()
```

最後に，以下のコードを実行すれば，最初のgifのようにプレイヤーが起動します．

```python
# np.shape(movie) -> (t, h, w, c)
plotPlayer(plotMovie, 0, len(movie)-1, interval=250)
```

---

ちなみに画像である必要はなく，`plotMovie()` を変更することでグラフなども再生することが可能です．

```python
def plotLine(t, figsize=(16, 8)):
    plt.figure(figsize=figsize)
    plt.xlim(0, 10)
    plt.ylim(-5, 5)
    plt.plot(x[:t], y[:t])
```

```python
x = np.arange(0, 100, 0.1)
y = np.sin(x) + np.random.randn(len(x))

plotPlayer(plotLine, x[0], x[-1], interval=100)
```

![sin.gif](https://qiita-image-store.s3.amazonaws.com/0/244005/d906c5e0-f675-0aa7-3891-caab4fe7f3fb.gif)

# 最後に
gifを見て頂けると分かるかと思いますが，上記の私の実装では，どうしても「カクつき(ラグ)が生じる」「保存はできない」という問題点が生じており，再生スピード(`interval`)を上げると何とも微妙な感じになってしまいます．（もっとも私の本来の目的の上では特に問題ではなかったのですが，）これがタイトルでも"簡易"と入れている理由になります．

# 参考リンク
- https://ipywidgets.readthedocs.io/en/latest/examples/Widget%20List.html
- https://ipywidgets.readthedocs.io/en/latest/examples/Using%20Interact.html
1 on 1 ミーティング ノウハウ

# チームマネジメントを行う上で、1on1ミーティングは重要

実施できない理由は、「忙しいから」というものが多いと思うが、長期的にみてミーティングをやったほうが問題を事前に解決できる可能性が高くなり、チームの雰囲気を良くできたり、チーム力の向上に繋げることもできる。  

しばらく運用してみたやり方をメモ

# 実施タイミング・内容
- 実施頻度
月1回(ただし、必要に応じて都度行う)

- メンバー
当時のプロジェクトでは10人のメンバーに対してやっていました。

- 時間
1人あたり30分

- 内容(以下からいくつかをピックアップ)
 - 心身の健康チェック
 - プライベート
 - モチベーション
 - 業務・組織の課題・改善したいことなど
 - 目標設定/評価
 - キャリアパス
 - 戦略・方針の伝達


# 内容詳細
-  心身の健康チェック
体が弱い人や朝が弱い人は、このあたりを聞くとスムーズに話に入れる。 
健康とプライベートは密接に関わってくるので、プライベートの話も聞きやすくなる。

- プライベート
普段から知っている趣味などの情報があれば、それについて聞いてみると良い。
- モチベーション
実績を元に良かったことを素直に褒める。
- 業務・組織の課題・改善したいことなど
日頃課題に感じていることや、改善の案などがあるか聞く。  
- 目標設定/評価
目標に対するアクションについて振り返り・評価
- キャリアパス
今の仕事に満足しているかなど。必要に応じて新たな環境を用意することも検討
- 戦略・方針の伝達
チームとして一体感が出ていない時は、個人レベルでも戦略・方針を伝達していく

## その他
- 基本的には話を聞く場であり、意見するのは必要な時のみとする。  
- 問題解決をしてあげるのではなく、何が問題かをクリアにする。
- 踏み込んで話すことが必要でまとまった時間が必要な話題などは別枠でやる。
- 人数が多すぎる場合は、1人でやることが難しいのでチーム構成を考慮した上で別メンバーもアサインしたほうがいいかも。(自分の場合は10人とやっていましたがギリギリのラインだと感じました。)

参考図書
[・シリコンバレー式 最強の育て方 ―人材マネジメントの新しい常識 1on1ミーティング](
https://www.amazon.co.jp/%E3%82%B7%E3%83%AA%E3%82%B3%E3%83%B3%E3%83%90%E3%83%AC%E3%83%BC%E5%BC%8F-%E6%9C%80%E5%BC%B7%E3%81%AE%E8%82%B2%E3%81%A6%E6%96%B9-%E2%80%95%E4%BA%BA%E6%9D%90%E3%83%9E%E3%83%8D%E3%82%B8%E3%83%A1%E3%83%B3%E3%83%88%E3%81%AE%E6%96%B0%E3%81%97%E3%81%84%E5%B8%B8%E8%AD%98-1on1%E3%83%9F%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%E2%80%95-%E4%B8%96%E5%8F%A4%E8%A9%9E%E4%B8%80-ebook/dp/B075FQYKK9)
[・エンジニアリング組織論への招待](https://www.amazon.co.jp/%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%83%AA%E3%83%B3%E3%82%B0%E7%B5%84%E7%B9%94%E8%AB%96%E3%81%B8%E3%81%AE%E6%8B%9B%E5%BE%85-%E4%B8%8D%E7%A2%BA%E5%AE%9F%E6%80%A7%E3%81%AB%E5%90%91%E3%81%8D%E5%90%88%E3%81%86%E6%80%9D%E8%80%83%E3%81%A8%E7%B5%84%E7%B9%94%E3%81%AE%E3%83%AA%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0-%E5%BA%83%E6%9C%A8-%E5%A4%A7%E5%9C%B0/dp/4774196053)
自分が書いたコードは、他人に理解してもらえるのか

# コードを書くという事

取引先の担当者にメールを送る場合を考えてみてください。

いざ、メールを書こうと思うと、

- 正しい表現になっているか
- 意味が伝わる文面になっているか
- 失礼な言い回しはないか

など、多くの事を考え、ときにはネットで表現を調べるなどしてメールを書く方が多いのではないでしょうか？
また、その後、すぐに送信せず、一度しっかり見直した後に送信しませんでしょうか？

では、自分がプログラムを行う際を考えてみてください。
メールを書くときと同じような事を考えてますか？
おそらく、多くの方がそこまで考えていないのではないかと思います。

技術者・開発者と呼ばれる人間にとっての「コード」は、「メール」と同じく「コミュニケーションのためのツール」であると個人的には考えています。
上記のように考える理由としては、

- ある個人が書いたものを、第三者が解釈をして、自分の行動を決めるために利用する
- 書いた人間の意思が表現されている
- 場合によっては、書かれて時間を経て再度利用される場合がある

というような部分において、非常に似た性質を持っていると考えているためです。
にもかかわらず、自分以外の「第三者」の事を気にしてコードを書いている人が少ないのではないでしょうか。

多くのチームで、「コーディング規約」が策定され、規約に沿ったコーディングがされている理由も、上記のような問題を少しでも解決するために考えられた方法にすぎないのではないかと。

# 誰にとっての「綺麗」なのか
他人が書いたコードを見て、「綺麗だな」と思う事は私自身よくあります。
そのときは、もちろん「私にとって」綺麗という考え方になります。

では、チームで開発する事を考えた場合、「自分にとって」の綺麗さを追求する事が果たして正義なのでしょうか？
答えは「No」だと思います。
チームで働くメンバーの中で、たった一人、書いた本人だけが「綺麗」と思うコードは、どんな理由があれ、それは「汚い」とみなすべきではないでしょうか？

１行でかかれた一人だけが綺麗と思うコードよりも、3行で書かれたメンバー全員が綺麗と思うコードの方が、「チームの資産価値」という観点で考えた場合、高いと私は思っています。

# さいごに
今一度、自分が書いたコードが他のメンバーに理解してもらえるのか？を考えてみてください。
もしこれがメールだったら？このような書き方をするか？という事を考えてみてください。
一人一人が、少しだけ、自分のコードを読む「第三者」の気持ちを想像しながらコーディングをすることができれば、それはチームにとって大きな財産になっていくと思っています。

最近、チーム開発系の書籍をいろいろ読んでいて、個人的に思うところがあったので書いてみました。
Maven Pom検索

###検索先URL

https://mvnrepository.com/

キーワード入力
![image.png](https://qiita-image-store.s3.amazonaws.com/0/253796/e6a90cbf-35fd-9343-39a5-fd6be407a659.png)

バージョン選択
![image.png](https://qiita-image-store.s3.amazonaws.com/0/253796/b5120cf2-1370-c188-2b21-381388fca25d.png)

「Maven」タブ選択
![image.png](https://qiita-image-store.s3.amazonaws.com/0/253796/4175a93e-884f-c796-9fd7-50f7da47bb05.png)


中身をMavenプロジェクトのpomにコピペ
ChromeOSからRaspberry PiにVNC接続

# はじめに
ラズパイにいちいちモニターつなぐのめんどくさい。
sshだけじゃ心もとない。
最近Chromebook使ってて、Windowsひらくのもめんどくさい。
Chromebookに拡張機能入れてVNC接続するか。

# 環境
- Chrome OS バージョン: 67.0.3396.99（Official Build） （64 ビット）
- Raspbian GNU/Linux 9.1 (stretch)

# したこと
## ネットワーク
同じLANにラズパイとChromebookを接続

## ラズパイ
```ifconfig``` でラズパイのIP確認
```sudo raspi-config``` でVNCの有効化
VNCサーバーは初めから入ってるので、インストール不要
![Screenshot 2018-07-07 at 23.46.09.png](https://qiita-image-store.s3.amazonaws.com/0/184221/8da09174-feb9-e5a7-9288-94c48db56e06.png)

## Chromebook
VNC Viewの拡張機能をいれる。
![Screenshot 2018-07-07 at 23.33.16.png](https://qiita-image-store.s3.amazonaws.com/0/184221/ff1e807f-9602-74ec-8f62-cad29cc82b8a.png)
[VNC® Viewer for Google Chrome™ - Chrome ウェブストア](https://chrome.google.com/webstore/detail/vnc%C2%AE-viewer-for-google-ch/iabmpiboiopbgfabjmgeedhcmjenhbla?utm_source=chrome-app-launcher-search)

## 接続
VNC View立ち上げる。
IPだけ入力して入れた。ポート番号はデフォルト設定だといらなさそう。
![Screenshot 2018-07-07 at 23.59.44.png](https://qiita-image-store.s3.amazonaws.com/0/184221/595f510e-6ab6-a88a-0c08-0fbf95169f15.png)

User nameとPassword入れたらおしまい。
![Screenshot 2018-07-08 at 00.00.02.png](https://qiita-image-store.s3.amazonaws.com/0/184221/3dd32376-0f57-d0e4-9e6b-1cc46060aec6.png)

いちおう日本語も入力できた。なんか、でっかい文字で真ん中に表示されるけど。
![Screenshot 2018-07-08 at 00.02.20.png](https://qiita-image-store.s3.amazonaws.com/0/184221/ca48c1f2-f9c9-9ac3-a8d9-40fd0ea0fcb6.png)

## 調整
解像度を調整
![Screenshot 2018-07-08 at 00.07.17.png](https://qiita-image-store.s3.amazonaws.com/0/184221/caba11e9-b59f-76cd-5539-5e980e26bc1b.png)

# おわりに
Chromebookすごく優秀。sshもvncもできる。ローカルでは非力やけど、どこにでもつなげる。ラズパイ使用率あげてこ。
PHP_Cording_20180707

# Progateをやっていて　詰まったところを備忘録にまとめる。

PHPを学習したくてProgateをやってみた。
勉強になるなぁやっぱり。

```php:form.php
~
# sent.phpにフォームで入力された値をpostで送る。
<form action="sent.php" method="post">
# name属性「name」と「body」を
    <input type="text" name="name">
    <textarea name="body"></textarea>
</form>
~
```

```php:set.php
~
# $_POSTの連想配列にform.phpで入力した値を取得する
<?php
    echo $_POST['name'];
?>
~
<?php
    echo $_POST['body'];
?>
~
```

<?php ~ ?>を書き忘れてecho $_POST['name'];しか書いてなくて全然表示されなかった。そりゃそうだ。

```php:form.php
~
<?php
	$types = array('Progateに関するお問い合わせ', 'Progateに対する意見', '採用に関するお問い合わせ', '取材・メディア関連のお問い合わせ', '料金に関するお問い合わせ', 'その他');
?>
~
<?php
     #$typesの変数内に値を順に取得する
     foreach ($types as $value) {
	    echo "<option value='{$value}'>{$value}</option>";
     }
?>
```
foreach文やっぱりおぼえられないなぁ。
Google Kubernetes Engine触ってみたときのコマンド覚書

### 参考
- [プログラマのためのGoogle Cloud Platform入門](https://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AEGoogle-Cloud-Platform%E5%85%A5%E9%96%80-%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%81%AE%E5%85%A8%E4%BD%93%E5%83%8F%E3%81%8B%E3%82%89%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89%E3%83%8D%E3%82%A4%E3%83%86%E3%82%A3%E3%83%96%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E6%A7%8B%E7%AF%89%E3%81%BE%E3%81%A7-%E9%98%BF%E4%BD%90/dp/4798137146)
- https://github.com/asashiho/gke-gobang-app-example

### やってること
- GKE上で対CPUの五目並べのゲームを動かす
- 最初のCPUのアルゴリズムはただランダムに石を置くだけ
- ローリングアップデートを使って、アプリを止めずにアルゴリズムを司るコンテナを入れ替える
- アップデート後はアルゴリズムが賢いものに切り替わる

### コマンド(Google Cloud Shellで実行)

ちょっとだけ自分でアレンジ。

- versionを3桁にした。(慣れ親しんだ形。docker界隈は2桁が主流なのかな？)
- フロントエンドアクセス用のIPをワンライナーで取得。(目指せshell芸人)

```shell

# set env after you create new project
gcloud config set compute/zone asia-northeast1-a
export PROJECT_ID=$(gcloud config list project --format "value(core.project)")

# create kubrnetes cluster
gcloud container clusters create gobang-cluster \
  --num-nodes 3 \
  --scopes "https://www.googleapis.com/auth/datastore" \
  --zone asia-northeast1-a

# set kubernetes config
gcloud container clusters get-credentials gobang-cluster --zone=asia-northeast1-a

# set region of datastore
gcloud app create --region=asia-northeast1

# fetch sample code
git clone https://github.com/asashiho/gke-gobang-app-example

# build docker image
docker build -t frontend:v1.0.0 frontend/
docker build -t backend:v1.0.0 backend-dummy/
docker build -t backend:v1.1.0 backend-smart/

# make tag for upload image
docker tag frontend:v1.0.0 gcr.io/$PROJECT_ID/frontend:v1.0.0
docker tag backend:v1.0.0 gcr.io/$PROJECT_ID/backend:v1.0.0
docker tag backend:v1.1.0 gcr.io/$PROJECT_ID/backend:v1.1.0

# upload image to gcp
gcloud docker -- push gcr.io/$PROJECT_ID/frontend:v1.0.0
gcloud docker -- push gcr.io/$PROJECT_ID/backend:v1.0.0
gcloud docker -- push gcr.io/$PROJECT_ID/backend:v1.1.0

# configure yaml file
sed -i "s/<PROJECT ID>/$PROJECT_ID/" config/frontend-deployment.yaml
sed -i "s/v1.0\$/v1.0.0/" config/frontend-deployment.yaml
sed -i "s/<PROJECT ID>/$PROJECT_ID/" config/backend-deployment.yaml
sed -i "s/v1.0\$/v1.0.0/" config/backend-deployment.yaml

# deploy kubernetes
kubectl create -f config/backend-deployment.yaml
kubectl create -f config/backend-service.yaml
kubectl create -f config/frontend-deployment.yaml
kubectl create -f config/frontend-service.yaml

# check frontend ip
FRONTEND_IP=`kubectl get services | grep frontend | awk '{print $4}'`

# access game
API_URL=http://$FRONTEND_IP/api/v1 client/client.py

# overwrite version
sed -i "s/v1.0.0\$/v1.1.0/" config/backend-deployment.yaml

# update cluster
kubectl apply -f config/backend-deployment.yaml
```