OmniAICreator/Qiita-1.07M huggingface dataset:
localhostと本番環境を行き来してAccess-Control-Allow-Originが～と言われたらこれかも？

#概要

localhostで開発し、たまに本番環境を表示しようとすると、Access-Control-Allow-Originが異なるためデータ取得ができない旨のエラーがコンソールに表示されることがありました。

```
Access to fetch at 'https://storage.googleapis.com/example.appspot.com/example.json' 
from origin 'https://example.com' has been blocked by CORS policy:
The 'Access-Control-Allow-Origin' header has a value 'http://localhost:3000' 
that is not equal to the supplied origin.
Have the server send the header with a valid value, or, if an opaque response serves your needs, 
set the request's mode to 'no-cors' to fetch the resource with CORS disabled.
```

ユーザーから問い合わせも来ないため放置していましたが、放置できない状況になったため、調査してようやく解決しました。
どうして発生するのか？どうやって解決したのかを解説します。

今回はGoogleのCloud Storageの例ですが、AzureやAWSでも同様だと思います。

#読者対象

- CORSを理解している
- 複数のOriginを許可している

CORSについての簡単な説明はこちら。
https://developer.mozilla.org/ja/docs/Web/HTTP/CORS
https://cloud.google.com/storage/docs/cross-origin?hl=ja


#いきなり結論

localhostのレスポンスヘッダーか本体をキャッシュしていることが原因のようです。
```Access-Control-Allow-Origin: localhost:3000```を受け取るため、localhostなら問題ないですが、本番環境は当然ながら```localhost:3000```ではないことからエラーになっていたということです。
該当する通信を右クリックしてブラウザキャッシュクリアを選択後、本番環境で実行すれば問題は解消されます。

ただし、Googleへのログインやほかのタブも影響受けますので、実行前にはその他すべてのタブのチェックをして安全に実行しましょう。
不都合がないなら、このような操作が不要なシークレットモードすれば問題を回避できます。


#Road to resolution

##問題発生
localhostで開発し、たまに本番環境を表示しようとすると、Access-Control-Allow-Originが異なるためデータ取得ができない旨のエラーがコンソールに表示されることがありました。

![CORSでエラー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310578/6a34683c-93a2-e59c-b639-8a2295255208.png)


##どうやらシークレットモードでは発生しないようだ
localhostの方のChromeタブを終了してもダメでしたが、シークレットモードであれば問題なく、localhostと併存できます。

##localhostは確かに許可しているオリジンの一つではあるが…

もしかして、実はoriginは一つしか設定できない罠だろうか？

https://cloud.google.com/storage/docs/json_api/v1/buckets/patch#request-body

>cors[].origin[]

配列だからここは問題ない。
サーバーがここのホワイトリストから判断するんだから、複数設定することに何ら問題はない。
それでは何が問題でlocalhost:3000を返してくるのか…


##ブラウザのキャッシュに以前の失敗したプリフライト リクエストが入るだとぉ！

いろいろ調べたのですが、これといったものを見つけられず、CSのドキュメントを眺めていた時のことでした。

https://cloud.google.com/storage/docs/configuring-cors?hl=ja

>リクエストとレスポンスが表示されない場合は、ブラウザのキャッシュに以前の失敗したプリフライト リクエストが入っている可能性があります。ブラウザのキャッシュをクリアすると、プリフライトのキャッシュもクリアされます。

**ブラウザのキャッシュに入っている可能性？**
けど全部クリアしたしなぁ…（デベロッパーツールのclear storageでブラウザのキャッシュは消えるという認識誤り:sob:）
念のため通信を調べてみよう。

時刻もlocalhostのレスポンスヘッダーと異なるし、わからない…
けどキャッシュは削除したよねぇ…
なんとなく右クリックしたらブラウザキャッシュクリアの項目が:dizzy_face:
実行したら見事に解決::joy:

Windowsの場合、キャッシュクリアすると下記フォルダのキャッシュファイルがごっそり消えるので注意しましょう。
全部消えるんかーい:joy:
C:\Users\＜your_user_id＞\AppData\Local\Google\Chrome\User Data\Default\Cache

いきなり結論で記述したとおりですが、Googleへのログインやほかのタブも影響受けますので、実行前にはその他すべてのタブのチェックをして安全に実行しましょう。

##サーバーから複数のAccess-Control-Allow-Originを返せないか？

サーバーが複数返してくれたらありがたいと思って調査。
仕様上、リストではなく単一オリジンと限定しているのためNGの模様。

https://www.w3.org/TR/cors/#access-control-allow-origin-response-header

>NOTE: In practice the origin-list-or-null production is more constrained. Rather than allowing a space-separated list of origins, it is either a single origin or the string "null".

Google翻訳先生曰く
>注：実際には、origin-list-or-null生成はより制約されます。 スペースで区切られたオリジンのリストを許可するのではなく、単一のオリジンまたは文字列「null」のいずれかです。


#まとめ

キャッシュが意図しないおせっかいをするため、Access-Control-Allow-Originではじかれる問題に遭遇したらシークレットモードを使用するのが無難。
VBScriptで業務を効率化するスクリプトを作ってみた(至極、単純で簡単なスクリプト)

##はじめに

こんにちは。筆者は、本来Javaを勉強している身ですが、少し(かなり？)脇道にそれて、今回はVBScriptをつかって業務を(ちょっとだけ)効率化してくれるスクリプトを作ってみました。業務で必要な作業だったので、どうせなら作業を自動化することで、簡単に手早く済ませられないかなあと思い、勉強がてらスクリプトをつくってみました。良ければ使ってみてください。ただし、動作は検証していますが、使用する際は、(勝手ながら)自己責任でお願いします。もしも使用上、不具合があれば報告していただけると幸いです。あと、よろしければ、読者様各自でご自身の用途や目的に合わせた改変や改良をしてみてください。



##スクリプトの概要

このスクリプトは、Excelのシートに特定の値を連続して入力していくという作業を補助する
目的で作りました。実際のこの作業をしてみると、いちいち画面上でシート上の連続するセルを選択していく操作・手間が面倒になります。
そこで、この操作・手間を省くスクリプトを作ろうということに至ったわけです。至極、簡単なスクリプトで用途も限られますが、少しでも、読者様の手助けになればと思います。コードもシンプルなので、安全性に不安がある方もそうでない方も一度コードをお読みになった上でお使いください。



##スクリプトの全コード

```
'変数を宣言なく使用するのを防止する。
Option Explicit

'変数を宣言する。
Dim excl_obj
Dim sht_obj
Dim rng
Dim rng_obj
Dim rw
Dim clm
Dim vl


'実行開始時に、その旨を伝えるメッセージを表示する。
MsgBox("このスクリプトは Excelのシート編集を補助します")

'Excelと対応するアプリケーションのオジェクトを作成する。
Set excl_obj = CreateObject("Excel.Application")

'Excelの起動に失敗したか確認し、
'失敗していれば、その旨を伝えるメッセージを表示し、
'さらに、本スクリプトの実行を終了する。
If excl_obj Is Nothing Then
    MsgBox("Excelの起動に失敗しました")
    WScript.Quit()
End If

'※以下は、Excelの起動に成功したとしての処理。
'Excelの画面(ウインドウ)を表示する。
excl_obj.Visible = True

'新たにExcelのブックを追加・作成し、
'その中のあらかじめ作成されているシートを、
'操作するためのオブジェクトを取得する。
'※シートのアクティベートもする。
excl_obj.Application.Workbooks.Add()
Set sht_obj = excl_obj.Application.Worksheets(1)
sht_obj.Activate

'ユーザーに、編集したいシート上の範囲を指定してもらい、
'※例えば、「A1:A2」といったセル範囲を指定する形式で。
'指定されたシート上の範囲を保持するオブジェクトを取得する。
rng = InputBox("編集したいシート上の範囲を入力してください", "入力")
Set rng_obj = sht_obj.Range(rng)



'指定されたシート上の範囲で、左から右へ、かつ、上から下へといった具合に、
'シート上の各セルについて、ユーザーに値の入力を求め、その値を入力していく。
'空の入力がなされたら、ループ処理を中断し、本スクリプトの実行を終了する。
For rw = 1 To rng_obj.Rows.Count
	For clm = 1 To rng_obj.Columns.Count
		vl = InputBox("セルに格納したい値を入力してください", "入力")

		If (vl = "") Then
            MsgBox("シート編集を中断します")
		    WScript.Quit()
		End If

		sht_obj.Cells(((rng_obj.Row + rw) - 1), ((rng_obj.Column + clm) - 1) ).Value = vl
		sht_obj.Cells(((rng_obj.Row + rw) - 1), ((rng_obj.Column + clm) - 1) ).Select
	Next
Next

'指定されたシート上の範囲全体について、値を入力する処理が完了したら、
'最後に、その旨を伝えるメッセージを表示し、本スクリプトの実行を終了する。
MsgBox("シート編集が完了しました")
WScript.Quit()
```



##おわりに

すでにVBScriptは、PowerShellに取って代わられた古い技術ですが、手元にVBscriptの(古い)本があったので、せっかくなので、自分の手と頭を動かして実際の業務を少しでも効率化するためのスクリプトを書いてみようと思いました。少しでも、読者様のお役に立てれば幸いです。また懲りずにVBScriptでなにかつくってみようとも思っています。それではまた。
laravelのmigrationでハマった話 Cannot delete or update a parent row: a foreign key constraint fails

laravelでmigrationを実行するため、
`php artisan migrate:refresh` を叩いたところ、以下のエラーが出た。

Integrity constraint violation: 1217 Cannot delete or update a parent row: a foreign key constraint fails (SQL: drop table if exists \`comments\`)
![laravel__migration-error.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/408807/1cbd2055-4779-56c4-b5e3-4d1e89a9865e.png)

親子関係のアソシエーションを組んでいる場合、
migrationファイルの`downメソッド`で、
親子関係の親に当たるテーブルも削除しないと、このエラーが出るらしい。

なのでこうした。

```php:yyyy_mm_dd_152937_create_comments_table.php
// 省略
    public function down()
    {
        Schema::dropIfExists('posts'); //付け足した
        Schema::dropIfExists('comments');
    }
```

でもまだ同じようなエラーが出た。
（エラー文のテーブル名がposts に変わっただけの同じエラー。）

## 解決した方法
調べたところ、テーブルの`dropの順番`が大事らしい。
子テーブルであるcommentsから先にdropするよう順番書き換えた。

今回は、`posts`テーブルが親、`comments`テーブルが子。
なので以下のように記述順番を入れ替えた。

```php:yyyy_mm_dd_152937_create_comments_table.php
// 省略
    public function down()
    {
        Schema::dropIfExists('comments'); //子テーブルが先にdropされるよう順番を上にした
        Schema::dropIfExists('posts');
    }
```

これでようやく通った...!
<img width="533" alt="laravel__migration-finished.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/408807/9fc3a9de-2828-e5c2-017a-9acc3c403388.png">

アソシエーション組んでいる場合、
外部キーを持っている子テーブルからdropしないと、
子テーブルの外部キー制約に引っかかるらしい。

downのdropIfExistsメソッドを　**`子テーブル` -> `親テーブル` の順番で書いて、解決。**

解決したと思いきや。
[【続】laravelのmigrationでハマった話](https://qiita.com/yeah-OHTSU/items/e8f07f8f5311f2d973c9 "【続】laravelのmigrationでハマった話")
【続】laravelのmigrationでハマった話 migrate:reset と migrate:fresh

前記事：[laravelのmigrationでハマった話 Cannot delete or update a parent row: a foreign key constraint fails]()

この後別の作業をしたため、
再度　`php artisan migrate:refresh` を叩く。

```php

Integrity constraint violation: 1217 Cannot delete or update a parent row: a foreign key constraint fails (SQL: drop table if exists `comments`)
```

あれ...解決したはずのmigrationでまたエラー出てる？
じゃー全部テーブル削除してリセットするか。
`php artisan migrate:reset`

あれ...やっぱりエラー出てるね？（以後10回くらい繰り返す）

## 勘違いしていた点：
 `php artisan migrate:reset` は、
 アプリケーション全部のマイグレーションの「**ロールバックをやり直す**」コマンド。

## 全テーブルをドロップしてmigrateコマンドを実行する
「データベースから**全テーブルをドロップ**」し、
それからmigrateコマンドを実行したい場合は、
`php artisan migrate:fresh` を使う。

今回に関しては、migrate:fresh コマンドで無事migration通った。

日本語ドキュメントさんありがとう
https://readouble.com/laravel/5.5/ja/migrations.html

こちらのQiita助かりました
[Laravel Migration コマンドまとめ](https://qiita.com/mikakane/items/6ed937b4904be0f0a5cf)

追記：rollbackで失敗するということは、
そもそもrollbackの記述や設定が間違っているので根本解決ではない。
引き続き調査必要。
who-use-ionicに作ったアプリを投稿する方法　Githubでプルリクエスト（ブラウザーで完結）

#who-use-ionicとは？
Ionicで作られたプロダクトをまとめてるサイト
https://ionicframework.jp/case/

who-use-ionicに自分のアプリ（プロダクト）を掲載したいなーっと思ったが、そのやり方がわからず結構苦労したので記録する。

[こちら](https://qiita.com/YumaInaura/items/acff806290c8953d3185)が参考になった。

#who-use-ionicに作ったアプリを投稿する方法
投稿するにはGithub（というかgit）の**プルリクエスト**を使う。


**プルリクエスト**についての詳しい解説は、本題からそれるのでここではしない。
まぁ簡単にいうと
####こんな感じでコードを修正（編集）をしてみたけど、もし良ければ反映してね〜

って感じ。

#who-use-ionicのリポジトリをforkする
> forkとは他人のリポジトリを自分のアカウントの**リモートリポジトリ**にコピーすること

まずはwho-use-ionicの[Github](https://github.com/ionic-jp/who-use-ionic)を開く。
**右上にForkのアイコンがある。**これを押してみる。

<img width="557" alt="スクリーンショット 2019-11-09 21.57.15.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/1e654958-4be5-42c1-480a-f6e1834d7952.jpeg">

これで`ionic-jp/who-use-ionic`のリポジトリと全く同じものが、`あなたのアカウント名/who-use-ionic`として作られた。

<img width="290" alt="スクリーンショット 2019-11-09 22.11.41.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/940d492b-bda6-bc86-4571-991fb819e253.jpeg">


#forkしたリポジトリに新しいブランチを追加
>ブランチ(branch)は、1つのプロジェクトから分岐させることにより、プロジェクト本体に影響を与えずに開発を行える機能。ブランチは安定したバージョンをMasterブランチと呼ぶ。


さっき作った`あなたのアカウント名/who-use-ionic`のリモートリポジトリに、新しくブランチを追加する。
初期状態では**Branch: master**となっているBranchボタンを押して、適当に名前を入れてcreate branch

<img width="635" alt="スクリーンショット 2019-11-09 22.24.53.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/322d1b11-937f-2e5f-1aa5-62196ccf6b80.jpeg">

#新たに作ったブランチでコードを編集
さっき作ったブランチ（この例ではhoge）の状態でコードを編集する。

編集するにはペンマークのアイコンを押す。
<img width="357" alt="スクリーンショット 2019-11-10 15.35.46.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/36b2ce2b-2b30-b64f-c561-e23ea4cdfa26.jpeg">


`README.md`に書いてある様に
`who-use-ionic/src/assets/data.json`に以下の内容を追加

```json:data.json
{
  "name": "アプリ名",
  "image": "画像URL。空白で大丈夫です",
  "description": "アプリの概要を10文字程度で紹介ください",
  "author": "作者名",
  "websiteUrl": "公式URL",
  "country": "国コード(JP, USなど)",
  "platform": {
    "ios": "アプリURL（itunes.apple.com）。ない場合は空白",
    "android": "アプリURL（play.google.com）。ない場合は空白",
    "web": "PWAのURL。ない場合は空白"
  }
}
```

#プルリクエスト！
本体のリポジトリー（この場合は`ionic-jp/who-use-ionic`）で**Pull request→New pull request**を押す

<img width="1008" alt="スクリーンショット 2019-11-09 22.45.39.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/cca68d18-e08e-10e3-acc2-72aeea3e64d2.jpeg">

**Comparing changes**で自分が追加した部分を確認してプルリクエストを送信する。

<img width="879" alt="スクリーンショット 2019-11-09 22.55.26.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/ff926019-30c4-f1e3-d3c4-29f4fd5cf23b.jpeg">

#最後に
仕事でgitとか使ってる人は楽勝かもしれませんが、1人で使ってる限り**Masterブランチ**にプッシュし続けるため、結構苦戦した。。。
VSCode の LaTeX Workshop で数式の Hover Preview をさせるのにちょっと困った話

# 概要
Windows 10 において Visual Studio Code の 拡張機能 LaTeX Workshop の数式プレビュー機能が正常に動作しない場合，拡張機能が保存されているパスに日本語が含まれていないか確認する．

# 詳細
Visual Studio Code の拡張機能 [LaTeX Workshop](https://marketplace.visualstudio.com/items?itemName=James-Yu.latex-workshop) には，MathJax でレンダリングした数式を hover に表示する機能がある．以下，この機能を Hover Preview と呼ぶ．

## 困ったこと
Hover Preview をさせようとしても `読み込んでいます...`[^1] としか表示されない．
[^1]: 英語の場合は `Loading...` と表示される．
![Loading](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478774/33145b46-8a78-876a-d03a-09eac6b39e23.gif)

## 原因探し
### View LaTeX Workshop extension log の確認
エラーメッセージは見当たらず．

### Developer: Show Logs... の確認
Developer: Show Logs... は Ctrl+Shift+P を押して `show logs` などと入力すると出てくる．ここでは次のようなエラーメッセージを発見．

```
[2019-11-09 14:20:45.615] [renderer1] [error] 不明なエラーが発生しました。ログで詳細を確認してください。
```

よく調べてみると，このエラーはコンパイル実行時に発生しているものだった．しかし詳細がわからないので，別のところを見てみる．

### Developer: Toggle Developer Tools の確認
Developer: Toggle Developer Tools は Ctrl+Shift+P を押して `developer tools` などと入力すると出てくる．ここでは次のようなエラーメッセージを発見．

```
[Extension Host] Error when JSON.parse theme files.             console.ts:137
[Extension Host] Unexpected token ] in JSON at position 3948    console.ts:137
```

この2つのメッセージは，数式にカーソルをあわせて Hover Preview をさせようとするたびに現れていた[^2]．さらにコンソールを遡ると，最初の方で次のようなエラーメッセージを発見．

[^2]: 後述するが，この2つのメッセージは Hover Preview の問題と無関係のようである．

```
[Extension Host] Can't load MathJax.js from file:///c:/Users/ユーザー名/.vscode/extensions/james-yu.latex-workshop-8.3.1/node_modules/mathjax/unpacked/MathJax.js                                             console.ts:137
[Extension Host] Error: Could not load script: "file:///c:/Users/%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E5%90%8D/.vscode/extensions/james-yu.latex-workshop-8.3.1/node_modules/mathjax/unpacked/MathJax.js"    console.ts:137
```

数式のレンダリングに必要な MathJax が読み込めていないのだ．

## 解決方法
MathJax を指定するパスの中に日本語（筆者の場合はユーザー名が該当）が含まれていることが原因と考え，[ユーザーフォルダ名を英数字のものに無理やり変更した](https://qiita.com/aaaKUKIaaa/items/83d6234b69b0d958d3f1)[^3]．すると，無事に Hover Preview が表示されるようになった．
![hover.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478774/301eaf3f-292b-e448-69c4-f8db18a36b4f.gif)
改めて Developer: Toggle Developer Tools を確認すると，MathJax を読み込めていないという旨のエラーももちろん解消されていた．しかし

```
[Extension Host] Error when JSON.parse theme files.             console.ts:137
[Extension Host] Unexpected token ] in JSON at position 3948    console.ts:137
```

のエラーは，数式にカーソルをあわせるたびに相変わらず発生していた．このエラーの原因は不明だが，特に支障はないので今回はスルーする．

[^3]: 上級者向けの変更であることに注意．すなわち，これを実行すると思わぬところに影響が出る可能性がある．筆者の場合，例えば Dropbox が正常に起動しなくなり，再インストールを余儀なくされた．良い子のみんなは Windows 10 のユーザー名に日本語を使わないようにしよう．

# 参考
- [LaTeX Workshop - Visual Studio Marketplace](https://marketplace.visualstudio.com/items?itemName=James-Yu.latex-workshop)
- [VSCode拡張のLaTeX Workshopにコントリビュートした話 - Qiita](https://qiita.com/tamuratak/items/f1a64c2aad4963154020)
- [Windows10のユーザーフォルダ名変更 - Qiita](https://qiita.com/aaaKUKIaaa/items/83d6234b69b0d958d3f1)
picoCTF 2019 NewOverFlow-1 - Points: 200

#問題

https://2019game.picoctf.com/problems

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/34e2d4bc-115e-fdbb-7803-8facb7df8d01.png)

#解いてみた

昨日まで全く気づきませんでしたが、200点の問題がまだ残ってました。
新規追加された？

ソースを見てみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/d3fa9207-550a-379d-22e4-f2133385045b.png)

picoCTF 2019 OverFlow 2 - Points: 250
https://qiita.com/CTFman/items/a52d658d15c2f902c3ee

これと同じ感じでvuln()のリターンアドレスをflag()の先頭にしてあげればよい問題だと思います。
今回は引数ないので前の問題よりラクな問題です。

まずはflag()の先頭アドレスを調べます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/a9c631cb-3337-6b01-3ddf-054c8c86499a.png)

flag()の先頭アドレスは0x0000000000400767だということがわかりました。
ん？いつもより桁数が多い気がします。
64bitかな？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/025156bb-afc0-798c-d9e9-2ea7fefec9b7.png)

64bitでした。
桁数が変わるだけで内容は一緒の考えで良いんですかね？
64bit初めてな気がします。
とりあえず今まで通りのやり方でやってみます。

次にするのは何文字入力すればvuln()のリターンアドレスが上書きされるか調べます。
適当に100文字いれて試してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/78931479-a074-11de-099c-8ebac3c005bf.png)

espないなーと思ってたら64bitなのでrspですね。
rspは0x37665866だということがわかりました。
リトルエンディアンに気を付けながら文字を調べます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/c1e883df-0641-4e23-f97d-72babaff6e88.png)

fXf7でした。
入力した文字列を確認すると73文字目からでした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/ae288172-e47d-1e75-2e52-f7f58c05fa9d.png)

ここをflag()の先頭アドレスに書き換えて実行してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/33bdb40b-101e-0f49-7af9-169810b0e024.png)

んーダメでした。
近くのアドレスでやってみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/dd737f44-14b9-59e5-ffb4-ef44dd696be9.png)


？
popの次の位置に飛ばすとなぜかflagがでました。
謎です。
VimConf 2019 に参加してきた

11/3 に開催された [VimConf 2019](http://vimconf.vim-jp.org/2019/) に参加してきましたので、その報告です。

よく考えると今年の参加は、(VimConfへの不参加の年を除くと)登壇しない初めての一般人としての参加でした。
昨年まで自分が参加してきた VimConf の一覧:

* 2013年
  - スライド: [How to write patches for Vim](https://www.slideshare.net/k-takata/how-to-write-patches-for-vim-28307604)
* 2014年: 不参加
* 2015年
  - LT発表スライド: [Let's use AppVeyor](https://www.slideshare.net/k-takata/lets-use-appveyor)
* 2016年
  - 基調講演スライド: [Introduction to Vim 8.0](https://www.slideshare.net/k-takata/introduction-to-vim-80)
  - 感想記事: [VimConf 2016 で発表してきた](https://gist.github.com/k-takata/4b09432bad578520993e719395e1ab0b)
* 2017年
  - トークショーにて登壇
  - 感想記事: [VimConf 2017 でトークしてきた](https://qiita.com/k-takata/items/76de6c03fe89b13b21b1)
* 2018年
  - LT発表スライド: [The vim-history repository](https://www.slideshare.net/k-takata/the-vimhistory-repository-vimconf-2018-lightning-talk)
  - 感想記事: [VimConf 2018でLT発表をしてきた](https://qiita.com/k-takata/items/fcefee08b0dc7be0d517)

開始時間ギリギリに会場に着いたところ、「隣、いいですか？」と声を掛けたお相手が、最近、[Vimのヘルプの日本語訳](https://github.com/vim-jp/vimdoc-ja-working)で頑張っている[IK](https://twitter.com/get_me_power)さんでした。

## 発表内容一言コメント

* Prabir Shrestha さん
  vim-lspで有名な方です。私自身はvim-lspは使ったことがないのですが、同じ作者によるasync.vimは、minpacでも使っています。

* Justin M. Keyes さん
  言わずと知れた Neovim の現在の開発リーダーです。Neovim は Vim とは対立しているわけではないというのが聞けて良かったです。

* mopp さん
  どのように Vim をカスタマイズすべきか、面白い話が聞けました。

* IK さん
  どのように 1 ユーザーから各種 Vim プラグインの開発に関わっていったかという話。学生さんのような若い世代が Vim (関連)の開発に関わってくれているというのは嬉しいですね。

* daisuzu さん
  タグジャンプの話と、plugin がちゃんと対応するともっと便利になるよという話。

* m-nishi さん
  Vim 本体のテストに焦点を当てた話。

* gorilla0513 さん
  ここ 1 年でいきなりめざましい活躍を見せたゴリラさん。Vim 歴 1 年とはとても思えないとても熱いプレゼンを見せていただきました。

* Danish Prakash さん
  心理的な面から Vim をどう使うかという点が面白かったです。

* Hezby Muhammad さん
  Vanilla Vim (素の Vim) でどこまでできるかというのを見せていただいて面白かったです。

* ujihisa さん
  プラグインを入れることでどういうことが可能になるのか、さすが ujihisa さんです。

* Shougo さん
  この 10 年に渡って、どのような思想でプラグインを設計・開発してきたのか。第 0 世代から第 4 世代まであるというのは、ユーザーにとっては重要かもしれません。

* Lighting Talsk
  aiya さんの Vim scipt に対する、型付きの Time script というのが気になったのですが、何でトランスパイルしているのか聞きそびれました。

## 懇親会

Prabir Shrestha さんが自分のことを認識してくれていたのが分かったのは嬉しかったです。Justin さんとは言葉を交わせず、残念。
日本の伝説的なプラグイン開発者である kana さんと会話したかったのですが、終了間際に一言声を掛けることしかできず、残念。

## 2次会

Ruby界の有名人の a\_matsuda さんと会話できた。良かった。

## その他

「とばっとうぇあ」おいしかったです。（近所のスーパーの鮭とばよりずっとおいしかった。）
【rails】select_tagの使い方

セレクトボックスを設置して、paramsでデータをとるための処理の方法のまとめ。

## select_tagとは
railsに存在する、セレクトタグを表示するためのメソッド

ドキュメント
https://apidock.com/rails/ActionView/Helpers/FormTagHelper/select_tag

## 記法
ドキュメントには以下のように記載されている。

```rb
select_tag(name, option_tags = nil, options = {})
```

- nameはparams -> 値を拾うための文字列
- option_tag -> optionタグを用いてセレクトタグに表示する文字列、送る値を設定
- options -> 設定すれば、複数選択できるようにしたり、空欄を含めたりできる

また、option_tagsはoptions_for_selectを用いた方が、コードがわかりやすくなる。
## options_for_selectとは
ドキュメント
https://apidock.com/rails/ActionView/Helpers/FormOptionsHelper/options_for_select

このようなセレクトボックスを設定したい場合

```html
<option value="">---選択してください---</option>
<option value="0">参加</option>
<option value="1">不参加</option>
<option value="2">保留</option>
```

これを文字列としてそのまま入れると後々変更が必要になった時に面倒になる。

options_for_selectを用いると

```rb
options_for_select([['---選択してください---', ''], ['参加', '1'], ['不参加', '2'], ['保留', '3']])
```
このように配列の形で設定することができる。
【Rails】ランキング機能の実装

#ランキング機能について
ECサイトを見てるとランキング機能があふれていますね
例えば、、、
・ 新着ランキング
・ いいねランキング
・ 売り上げランキング
などです
この機能を応用すると様々ことができます。
是非、この記事を理解してランキング機能を実装してください！！
#実装方法の説明
実装環境はSNSサイトのようにユーザーのUserと投稿のPostテーブルがあり、いいね機能が実装されている状態です
##概要
Postのいいね数でランキングを作る
そのためにコントローラーでいいね数が多い順に投稿されたPostを取得する方法について解説します。
Viewでの表示方法についてはご自身で実装方法に対応させてください。
もし、いいね機能がわからない方がおられましたの実装方法はこちらの記事を参考にして実装してみてください！！
##具体的な実装方法の説明

```Ruby:
Post.find("いいね数の多いPostのid")
```

findメソッドはIDでPostを探すメソッドですので、
いいね数の多いPostのidの取得して検索します。

```Ruby:
Favorite.group(:post_id).order('count(post_id) desc').limit(3).pluck(:post_id)
```

`group(:post_id)`
　　post_idでまとめるためのメソッドです
　　post_idが同じレコードをまとめて並べ替えます
`order('count(post_id) desc')`
　　`count(post_id)`した結果を`desc`（降順）で並べ変えます
`count(post_id)`
　　post_idが同じものを数えるメソッドです
　　いいねテーブルに保存されているレコードを数えることでいいねの数を取得することができます
`limit(3)`
　　上から３つだけ取得するメソッドです。
　　3を5や２に変更すると5つや2つに変更することができます
`pluck`
　　取得したレコードの情報をidに変更するメソッドです。
　　
いいねが多いPost_IDからPostを取得する

```Ruby:
Post.find(Favorite.group(:post_id).order('count(post_id) desc').limit(3).pluck(:post_id))
```

上で取得したいいねが多いPostのIDから該当するレコードを取得します。

以上がランキング機能の実装方法になります。

#参考記事
Railsでお手軽ランキング機能
https://qiita.com/MitsuguSueyoshi/items/18fa5e49a27e727f00b4

**疑問、気になるところがございましたら、質問、コメントよろしくお願いします！！！**
go-redisでSET 0,-1

```golang
package main

import (
        "fmt"
        "time"
        "strconv"
        "github.com/go-redis/redis"
)

func getRedisClient() (*redis.Client) {
        client := redis.NewClient(&redis.Options{
                Addr:     "localhost:6379",
                Password: "", // no password set
                DB:       0,  // use default DB
        })
        return client
}

func setKey(ttl int) {
        rc := getRedisClient()
        ts := strconv.Itoa(int(time.Now().Unix()))
        sttl := strconv.Itoa(ttl)
        key := "ts:"+sttl+":"+ts
        rc.Set(key, sttl, time.Duration(ttl)*time.Second)

        v := rc.TTL(key).Val()
        fmt.Printf("TTL(%s):%v\n",key,v)
}

func main() {
        setKey(10)
        setKey(0)
        setKey(-1)
}
```

```
$ go run main.go
TTL(ts:10:1573291378):10s
TTL(ts:0:1573291378):-1s
TTL(ts:-1:1573291378):-1s
```

* 10は10秒後に消える。
* 0,-1はつまり一緒。

# Refs.
* [persist](http://redisgate.jp/redis/command/persist.php)
* [commands_test.go](https://github.com/go-redis/redis/blob/master/commands_test.go)
【第4話】Flutterでwebゲーム作ろっかなって思った 【デプロイした】

#まずは、こいつをみてくれ
https://clozedjp.github.io/adventure
まだ、ゲームのゲームたりうる部分は入ってません。
コンポーネントの置き方とか、json取り扱いとか、htmlリンクで新しいタブ開いたりとか、そういった簡単な機能だけの部分になってます。
この状態のブランチを残しておこうと思います。
マスターブランチについては、この後複雑化していって大変なことになる予定です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173892/4abb7f6a-613f-5cf3-570a-bbfd3b04be26.png)


#そして、ソースコードみたい人はこっちだ
https://github.com/ClozedJP/adventure

ちなみに、ゲームの中のmenuにあるCopyrightからも飛ぶことができる。

#めちゃくちゃ罠がいっぱいあった
デプロイの方法が、サポートされてない時点で色々触られたせいでスパッと出てきませんでした。
ググっても色々出てきすぎてて、一番最初に出てきてほしいものが出てきてくれませんでした。
https://flutter.dev/docs/get-started/web

って開発当初にみたやつじゃないかあああああ。
flutter build web
これをやるとbuildの中にwebってのができるので、そいつをrenameしてデプロイ先にぽんと置いたら動きます。indexの位置がデプロイ先の仕様に合うようにしてあげてください。
私のデプロイ先はここ
https://github.com/ClozedJP/ClozedJP.github.io

#Assertion failed結構出ます
報告してくださいという英語とurlがassertionのメッセージについてたら、報告しよう！割とすぐ対応してもらえます。
投稿してから２日～一週間以内で確実に返事がつくみたいです。
https://github.com/flutter/flutter/issues/44128
⇛なんと！１３時間位で見てもらえた模様、つけてもらったタグがf:route,severe:crash,platform-webというかなり強めなタグもらいました。
チュートリアルのコードでも同じ現象が発生する模様、ダメやん！
~~とりあえず、治るのか治らないのかがわかるまでは、治らない前提で進めます。（気持ち悪い書き方の回避策も思いついたので）~~
~~その間に、とりあえずの今の状態をgitにあげておきます。~~
全部やりきらないと、見せられる形にならんと思ってやりきったで！
windowsで最初にやること

# capslockをctrlにする

https://docs.microsoft.com/ja-jp/sysinternals/downloads/ctrl2cap

これやらないと始まらない

コマンドプロンプトを管理者権限で開いて

```cmd
> ctrl2cap /install
```


したのちに再起動

# scoop

windowsのパッケージ管理ツール

```powershell
> Set-ExecutionPolicy RemoteSigned -scope CurrentUser
> iex (new-object net.webclient).downloadstring('https://get.scoop.sh')
```

# visual stdio build tools

コンパイラなど

https://visualstudio.microsoft.com/downloads/

# neovim

プラグイン用に必要な言語をインストール

```powershell
> scoop install git
```

```powershell
> scoop bucket add versions
```

```powershell
> scoop install python ruby nodejs-lts
```

```powershell
> scoop install neovim
```

```powershell
> pip install neovim
```

```powershell
> gem instal neovim
```

```powershell
> npm install -g neovim
```

# powershellのテーマ設定

```powershell
> scoop install concfg
```

```powershell
> concfg import harmonic-dark
```

# font

フォントをインストール - Myrica

https://github.com/tomokuni/Myrica

productから解凍してインストール

# vagrant

```powershell
> scoop install vagrant
```

プラグインをインストール

```powershell
> vagrant plugin install vagrant-vbguest
> vagrant plugin install vagrant-winnfsd
```

# virtualbox

バージョンは5.2を使う

https://www.virtualbox.org/wiki/Downloads
オンライン対戦ぷよぷよをTypeScript + WebSocket + Goで作る - 2.詳細設計


[前記事 1.全体設計と見積もり] (https://qiita.com/miyatahirotaka/items/9324abfe5fc2055e2e96)

![スクリーンショット 2019-11-09 13.52.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31318/3e67d0b3-1ee5-89c3-f5e8-38d821e1606f.png)
これをTypeScript(クライアント側) + WebSocket(通信プロトコル) + Go(サーバー側)で作ります。
コーディング前の準備のために、設計書に落とし込みます。

# データ構造
決めなければいけないことが多いが、まずはGoサーバー側が持つデータ構造から考えることにする。
最上層Systemの中に[]Roomがあり、Roomの中に1P,2PのPlayerが存在。
PlayerはPuyoの6*13配列を持つFieldなどを持つ構造。

自分のフィールド上部に表示される、降り注ぐ予定の予告おじゃまぷよ数をPlayerOjama.Count
予告おじゃまぷよが見えてるだけの状態(=相手が連鎖の最中)か、実際に降り注ぐ準備が完了した(=相手の連鎖が完了)かの状態をPlayerOjama.OjamaStatusで表現する。

以下のようになった。

```structs.go
package main

type Room struct {
    id string
    status RoomStatus
    player1p Player
    player2p Player
}

type RoomStatus int
// 定数名の重複を避けるために接頭語Roomをつける
const (
    RoomBeforeMatch RoomStatus = iota　// ルームが対戦前状態
    RoomInMatch // ルームが対戦中状態
    RoomAfterMatch // ルームが対戦後状態
)

type Player struct {
    id string
    status PlayerStatus
    field [6][13]Puyo
    score int
    ojamas []PlayerOjama
}

type PlayerStatus int
const (
    InRobby PlayerStatus = iota // ロピーにいる状態
    WaitingInRoom // ルームに自分だけがいる対戦相手待ち状態
    Ready // 対戦開始直前状態
    EnableToOperate // 対戦中、かつぷよのツモを操作できる状態
    IsBlockedByChaining // 対戦中、かつ連鎖中のため、自分のぷよのツモを動かすことができない状態
    AfterMatch // 対戦後状態
)

type Puyo int
const (
    None Puyo = iota
    Ojama // おじゃまぷよ
    Red
    Yellow
    Blue
    Green
)

type PlayerOjama struct {
    Count int
    Status OjamaStatus
}

type OjamaStatus int
const (
    Unfixed OjamaStatus = iota
    Fixed
)
```

Goにはenumがないためconstとiotaを使ってenum風の実装をするのがよくあるテクニックらしい。
始めRoomStatus.AfterMatchとPlayerStatus.AfterMatchが重複してエラーになったため、違うenumでも重複するメンバ名は使えないことを学んだ。


# シーケンス図
次にシーケンス図を書き、サーバー/クライアント側にそれぞれ具体的にどのような処理が必要かを詰めていく。
https://sequencediagram.org/ を使い書いていく。
対戦中のシーケンス図が重いので、対戦前後と対戦中の２つのシーケンス図に分けて書く。

### 対戦前後のシーケンス図
![Untitled (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31318/e41ba4d0-b974-e624-af1c-f3ab3c62c04c.png)

### 対戦中のシーケンス図
![Untitled (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31318/2893a43e-b550-d47a-cc44-6ec56a8c2de3.png)

長い・・・が完全に書こうとするとまだ抜けが多いと思う。でももうモチベと頭のキャパシティが限界なのでこれくらいにする。
２割くらい抜けがありそうだが実装のサポートに十分なるレベルだと思う。


# 状態遷移図
シーケンス図の中にも登場した、RoomやPlayerのstatus値について整理する。
サクっと使えるツールが見つけられず、Googleスライドで作成。

### 対戦ルーム Room のステータス遷移図
![PuyoPuyoGo状態遷移図 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31318/102a10ea-ef4f-efab-4065-026627cccf13.png)

### プレイヤー Player のステータス遷移図
![PuyoPuyoGo状態遷移図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31318/b09e4aab-3678-a892-8196-7d0f8bfc1571.png)

当然この設計書は完璧ではなく、実装時にアドリブで何かしなきゃいけなくなることは起こりえる想定。８割ぐらいできてるし、個人開発なのでまあいいやろうということで次のフェーズに進む。

ここまで工数10時間。

次は実装に着手する。
オンライン対戦ぷよぷよをTypeScript + WebSocket + Goで作る -  1.全体設計と見積もり

## 動機
ずっとLaravelをやっているが、PHP以外の言語、具体的にはGoを勉強したいため。
自分で何か作りたいもの作るのが一番勉強になると思っているため。

## 作るもの
![スクリーンショット 2019-11-09 13.52.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31318/b2daa32e-5520-a123-1600-6c84351318a6.png)
ブラウザ上で遊べるぷよぷよのオンライン対戦ゲーム
ロビーと対戦ルームがある

## 全体仕様
 - ユーザーログインや、対戦結果の保存は無し。
 - 対戦ルーム一覧が表示され、入室→２人揃うと対戦開始
 - 対戦終了すると、続けて対戦するか退室するかを選ぶ
 - クライアント側デザインは適当に丸と四角とテキストを並べるだけ
 - 回線環境やPCスペックにより生じる速度差をサーバーサイドで調整する、、などの込みいったところは難しそうなので考慮しない

## 全体アーキテクチャを決める
サーバーサイドはGoを勉強したいのでGo。
クライアントサイドは僕の技術スタック制約でJavaScript。TypeScriptもついでに勉強したいので、TypeScript + Canvasがいいのかな。
そうなると通信プロトコルはWebSocket一択だと思う。

## 工数見積もり
直感で100時間で作れるかなと思った。経験上それよりは膨らむので、心の中で160時間と見積もり。仕事だったら250時間（なので１ヶ月半〜２ヶ月ください）と言ってる。品質をちゃんとするなら加えてテスト/修正期間も。

## 対戦中の詳細仕様を考え始める
サーバー/クライアントにそれぞれどの処理を担当させるのか、通信タイミングをどうするかを決める/考えるのが一番重要なところだと思う。
WebSocketの通信速度や遅延という懸念点もノウハウがなく実際どの程度なのかわからない。
わからないことが多いながらも考えてみて、処理担当はいったん以下にして進めることにする。

```
クライアント側：
 - ぷよの操作
 - ぷよが置かれたらサーバー側にフィールドのデータ送信
 - サーバーからおじゃま落下アニメーションや連鎖アニメーション再生の命令が来たらアニメーション再生実行

サーバー側：
 - ツモ生成
 - フィールド情報保持
 - クライアントからフィールドのデータ更新される度に連鎖ロジック実行と、連鎖があれば連鎖アニメーション再生命令
```

クライアント/サーバーそれぞれの役割を雑に決めたので、次はさらに詳細設計を進める。

[次記事 2.詳細設計] (https://qiita.com/miyatahirotaka/items/6967d28b4cdd7f15839c)
wordpress 取得と出力

#出力の場合

```php
サイトのタイトルを出力するためのコード
the_title();

出力したい場合。。。
<?php the_title(); ?>

そのままタグで囲んで使おう！
<h1><?php the_title(); ?><h1>
```

#取得の場合

```php
サイトのタイトルを取得するためのコード('get'とかついてたりする)
get_the_title();

取得した値を出力するには。。。
<?php echo get_the_title(); ?>
('echo' で出力できるぞ！)

取得した値を変数に代入しよう
<?php $title = get_the_title(); ?>
(get_the_title();　を変数　$title　に代入している)

変数　$title　を出力！
<?php echo $title; ?>

変数に文字列を結合して出力したりもできて便利！
<?php $title2 = $title.'こんにちは'; ?>
<?php echo $title2; ?>
$titleに'岡田さん'と入っていたとすると、'岡田さんこんにちは'と表示される
```
Access サブフォームのサイズをメインフォームに連動させる。

# 処理概要
学校で使用するアプリを作っています。
生徒マスターを作成しているのですが、Excelファイルから読み込んで登録したいので、メインフォームにコマンドボタンを作成して、データ表示領域は、データシートビューのサブフォームを組み込みました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93227/190eb7cf-ebdb-32a8-eb7a-dbafce49d58e.png)

このようなテーブルに、Excelのファイルを読み込みます。

画面サイズを変更すると、サブフォームのサイズも連動するように作成しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93227/ef1637ad-c0eb-4b80-48fd-0e81e4de8382.png)

サブフォームは、データシートビュー形式で表示していますので、下記の操作が可能です。

- 項目幅は自由に変更できます
- フィルターや並び替えも右クリックメニューで変更することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93227/d48f9122-7be7-d8ec-5f3d-12a16e5ec387.png)

Excelファイルを読み込む処理は、下記を参照してください。
https://qiita.com/muramoto_jp/items/09f5cc558779766e9bfc

## フォームデザイン
コマンドボタンが必要なので、データ部分は、サブフォームで作成しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93227/79d6a22b-9eb5-442e-9437-76007a26792c.png)

フォームを開く時の初期サイズは、フォーム内にテキストボックスで値を貼り付けています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93227/6d56ff4c-abcb-ae71-de19-35d1d0edf264.png)

初期値を変更する場合は、プロパティシートで値を変更します。
（＝は、消さないように！）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93227/2deb3141-a0f1-1f20-d8cc-283e246dfdc7.png)



## プログラムコード（VBA）
フォームの初期サイズは、フォーに貼り付けているオブジェクトから取得します。
取得した値の単位が cm の場合は、567 を乗ずるとフォームの単位に変換できます。

```VisualBasic:Form_Load
Private Sub Form_Load()
  '--- デザイン設定 ---
  If Nz(Me.sys高さ.Value, 0) > 0 Then Me.InsideHeight = Nz(Me.sys高さ.Value, 0) * 567
  If Nz(Me.sys幅.Value, 0) > 0 Then Me.InsideWidth = Nz(Me.sys幅.Value, 0) * 567

End Sub
```


メインフォームのサイズを変更した場合に、サブフォームサイズを変更しています。
縦のサイズは、コマンドボタンの高さの分、小さくしています。

```VisualBasic:Form_Resize
Private Sub Form_Resize()
  Dim wHaba As Long
  Dim wTaka As Long

  wHaba = Me.InsideWidth
  wTaka = Me.InsideHeight
  Me.frmSub.Width = wHaba
  Me.frmSub.Height = wTaka - 567 * 0.8
End Sub
```

## サンプルファイル ダウンロード
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93227/3dcea4bf-a26b-8410-b06d-0a7c26f96a6f.png)

サンプルファイルは、下記の OneDrive からダウンロードできます。

【サブフォーム連動】
https://1drv.ms/u/s!AiwZpyuHUgQBj7Yp04MO7b83Ujvyag?e=d8O14T

【サンプルファイル一覧】
https://1drv.ms/u/s!AiwZpyuHUgQBj7Yj0iyQ2-RXKtPUtg?e=4D2gyf

#AccessとExcelを連携したシステムを公開しています
データベースをAzure SQL にセットして、AccessやExcelのプログラムから データベースを遠隔地間で共有するシステムを公開しています。

[<img src="https://qiita-image-store.s3.amazonaws.com/0/93227/1e640f8b-edfd-2b4e-aafe-ce96a835dd7b.png" width=70%>](http://access-cloud.hatenablog.com/entry/database)
http://access-cloud.hatenablog.com/entry/database
小説家になろうの活動報告欄でアンケート取ってる人が居たので集計してみた話

#ざっくり手順
1.コメントをごっそりhtmlとして保存する
2.コメント本文だけを抜き出す
3.集計

#1.コメントをごっそりhtmlとして保存する
url一覧を作ってチョメチョメしてwgetでDL
具体的には

```bash:download.sh
#!/bin/bash

cat urllist.txt | perl -lne 'for($i=1;$i<=10;$i++){print $_."index.php?p=".$i}' > urllist2.txt
# wget -i urllist2.txt
# アクセス過剰で503で死んだので適当にスリープ
while read line
do
  wget $line
  sleep 10
done < urllist2.txt
```

urllist.txtには改行区切りで投票やってる活動報告個別ページurlを記載
作業用にurllist2.txtが出力される。
index.phpp=[0-9]なファイル名で結果が出力されるので適当にディレクトリに纏める。

#2.コメント本文だけを抜き出す
タグからコメント部分だけをブチ抜く。
コメント部分の開始終了タグが分かりやすかったのでその辺を目印に適当に

```perl:getcomment.pl
opendir (DIR,"resultfiles");
@file = readdir(DIR);
closedir(DIR);
open OUT,">./results.txt";

foreach $file(@file){;
	open IN,"./resultfiles/$file";
	$flg = 0;
	while ($line = <IN>){
		print "$flg";
		if($line =~ /<div id="blog_comment">/){
			$flg = 1;
		}if($line =~ /<\!\-\-blog_comment\-\->/){
			$flg = 0;
		}
		if($flg == 1){
			$line =~ s/\<.*?\>//g;
			print OUT $line;
		}
	}
}
```

3.集計
sortしてuniq

```bash
cat results.txt|sort|uniq -c > allresult.txt
```

表記揺れとかアホほどあったのでそこは適当にガシガシ編集する感じで。
投票にgoogle formとかのアンケ機能素直に使ったほうが集計作業は楽だったんじゃないかと思いました。まる
第1回　KPMGジャパン　秘密計算ハッカソン　レポート

[**第1回　KPMGジャパン　秘密計算ハッカソン**](https://home.kpmg/jp/ja/home/campaigns/2019/07/hackathon-event.html) に運営側として参加した結果や感想のレポート。


##　概要
今回、**KPMGジャパン様**が主催の（日本ではおそらく初めて）秘密計算ハッカソンに、協賛社のうちの１つ、[**EAGLYS株式会社**](https://eaglys.co.jp/)として参加して来ました！
他の協賛は、**国立研究開発法人情報通信研究機構(NICT)様**、**三菱地所株式会社様**、**株式会社エルテス様**でした。
１１月７日、８日の二日間の日程で行われ、平日の開催にも関わらず多くの方にご参加いただき大変盛り上がりました！！

## 目的
もともと、

- 秘密計算という暗号技術を用いた計算手法をもっと多くの人に知ってもらいたい！
- どのような場面で秘密計算が活きるか、ビジネスをしている人、エンジニアの人、学生など様々な人を集めてユースケースをみんなで考えたい！
- 技術者の人に、実際に秘密計算を用いたコードを書いてもらい、どのように秘密計算が行われるか感じてもらいたい！

というような思いから開催されたこのハッカソン。
その日本初の秘密計算ハッカソンに、EAGLYSよりオープンソースライブラリを用いたチュートリアルコードおよび、ユースケース例とそのデモコードを提供しました。
興味のある方は、[**he-hackathon-2019**](https://gitlab.com/he-hackathon/he-hackathon-2019)にデモコードが上がっていますのでご覧ください。



## レポート（感想）
簡単に自分が楽しかったことや、考えたことをまとめます。

- 社会人、大学生の全６チーム２５名ほどの参加者が集まり、それぞれユースケースからデモコードの作成など、素晴らしい出来栄えだった。成果物発表のプレゼンテーションでは各チームが熱意あるプレゼンで審査員からも質問が飛び、いいディスカッションが起こっていた。
- KPMGの方の司会進行がおもしろく、いい感じにみんなの緊張が解けて楽しい雰囲気でハッカソンが行えてよかった。
- KPMGのスタッフの皆さんのホスピタリティが素晴らしかった。飲み物や食べ物の準備、当日の進行など、ハッカソンが円滑に進むための素晴らしい運営をして頂いた。
- NICTの準同型暗号研究者様より貴重な講義をいただいた。秘密計算を全く知らない人でもわかる内容であったため、初学者にはとても有益な講義だったと思うし、知識のある人は後ほど個人的にディスカッションをしたりと、高いレベルでの議論も行われ大変刺激的だった。

## 結果
審査の結果、

- **優勝**「秘密計算を用いて電子投票を行う」
- **三菱地所賞**「脈拍を用いた異常検知での秘密計算利用」
- **特別賞**「デートマッチングサイトの画像特徴量を秘密計算で行う」
 
この３つのアイディア、およびデモを作ったチームが表彰された。
他のチームも僅差であり、「秘匿したデータを業界で共有し、異常検知モデルを秘密計算する」、「秘匿化した成績データから進路診断を行う」、「養育費計算の際の秘密計算利用」など、とてもおもしろいユースケースの発表があった。

## まとめ
秘密計算を初めて触った人が多かったと思うが、アイディアからコードの完成度まで、２日で仕上げたとは思えないほどの成果物を見せていただき、とても充実した２日間になったなあと思う。
成果物に関しても同じようにgit管理して、これからもっと精査したり、新しいコードを更新したりする秘密計算領域の日本のオープンコミュニティが作れるように頑張りたいと思う。

参加者の皆さん、運営の皆さん、２日間お疲れ様でした！！
【自分用メモ】PyCharm/Djangoの開発環境構築

# Pythonの仮想環境を設定
pyenvに使用するPythonがインストールされていない場合はPythonをインストールする

```bash
# インストールされているpythonのバージョン確認
pyenv versions
# Pythonをインストール
pyenv install 3.7.2
# プロジェクトで使用するフォルダで実行
# Pythonのバージョンを切り替える
pyenv local 3.7.2
# 仮想環境を作成して有効にする
python -m venv venv
source ./venv/bin/activate
```

仮想環境を無効化したい場合は以下のコマンドで無効化できます。

```bash
deactivate
```
# PyCharmの設定
## Project Structureを設定する
1.Preferencesを選択する
<img width="187" alt="pycharm_menu.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149245/eea43f2b-6348-a59e-775a-2d3eadd22616.png">

2.Projectを選択する
3.Project Structureを選択する
![pycharm_project_structure.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149245/4e6b2eb8-d8e7-ea67-717a-9dd63f2894a0.png)

4.django-admin startprojectで作成したフォルダを選択してSourcesをクリックする![pycharm_project_structure_sources.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149245/ea7b4b1f-0c56-e9b4-4a2c-a094a0d64318.png)

![pycharm_project_structure_sources_created.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149245/befe0bb3-ea15-85e0-3cd2-020dd8a29778.png)

## Project Interpreterを設定する
![project_interpreter.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149245/57f014b5-1acc-54d8-308b-133d90370ec1.png)
![Add_Local_Python_Interpreter.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149245/81225455-2538-0bc3-1ab9-3bfe4a7762a6.png)

## Djangoを有効にする
![Preferences_django.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149245/f66a8a3b-4bf2-54f7-f6e7-85dd74046665.png)

# runserverを設定する
![edit_configurations.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149245/c5958912-f913-61a0-0faf-9f0a48ed97f3.png)
![Run_Debug_Configurations.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149245/89c66531-1a85-c516-4055-b1a1648d8a6d.png)
![Run_Debug_Configurations-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149245/b9c1f282-e957-adf7-d901-258b6b1d6807.png)
Composerを用いてMacにLaravelの環境構築する

#はじめに
Composerを用いてMacにLaravelの開発環境を構築ししプロジェクト作成する手順について説明します。
初心者エンジニアが忘却録のために投稿しているので、追加で記載したほうがいい内容があればコメントにておねがいします。

#手順
今回は以下の手順で進めます。
1. Composerのインストールからパーミッションの設定
2. Laravelのインストール
3. Laravelのプロジェクト作成

前提としてネットワーク接続可能な環境下であることとMacのアプリケーションにターミナルがあることを確認してください。

#1.Composerのインストールからパーミッションの設定
#####Composerのインストール
以下のリンクよりComposerのダウンロードを行ってください。
[Composerダウンロード](https://getcomposer.org/download/)
<img width="784" alt="スクリーンショット 2019-11-09 16.43.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384180/83b9bedd-ae27-ddfe-a21f-2e7c6fc5192f.png">
【2019.11.09現在】
一番上にある最新バージョンのものをダウンロードしてください。
2019.11.09にページにアクセスした場合は、1.9.1と書かれたリンクを押してダウンロードします。

#####/usr/local/binに配置
/usr/local/binというディレクトリー構成でフォルダが存在するか確認してください。
ない場合はFinder内でファイル作成するか、ターミナルで以下のコマンドを実行して/usr/local/binというディレクトリー構成でフォルダを作成してください。

```terminal:terminal
$ mkdir 作成したいファイル名
```


ダウンロードしたComposerがあるダウンロードフォルダに移動するため、ターミナルで以下のコマンドを実行してください。

```terminal:terminal
$cd/Downloads
```

composer.pharを/usr/local/bin内にcomposerというファイル名で移動するため、ターミナルで以下のコマンドを実行してください。

```terminal:terminal
$sodo mv composer.phar /usr/local/bin/composer
```

#####パーミッションの設定
配置したComposerのパーミッション（アクセス権）を変更するため、ターミナルで以下のコマンドを実行してください。

```terminal:terminal
$chomd a+x /usr/local/bin/composer
```

これでComposerが使えるようになりました。
ターミナルで以下のコマンドを実行してComposerが起動するか実行してください。

```terminal:terminal
$composer -V
```

ターミナルでcomposerのバージョンが表示されれば成功です。

#2.Laravelのインストールをする
#####Laravelのインストールをする
配置したComposerのパーミッション（アクセス権）を変更するため、ターミナルで以下のコマンドを実行してください。

```terminal:terminal
$composer global require "laravel/installer=~1.1"
```

#####環境変数パスの設定
配置したComposerのパーミッション（アクセス権）を変更するため、ターミナルで以下のコマンドを実行してください。

```terminal:terminal
$echo "export PATH=~/.composer/vendor/bin:$PATH" >> ~/.bash_profile
$source ~/.bash_profile
```

これでLaravelがコマンドとして認識されるようになります。

#3.Laravelのプロジェクト作成をする
#####ディレクトリを移動する
ターミナルで以下のコマンドを実行してください。
違うディレクトリに作成したい場合はDesktop以下を変更してください。

```terminal:terminal
$cd Desktop	
```

#####Laravelのプロジェクト作成をする
ターミナルで以下のコマンドを実行してください。
違うプロジェクト名にしたい場合はlaravelsample以下を変更してください。

```terminal:terminal
$laravel new laravelsampleapp
```

#さいごに
これでLaravelを用いて開発する準備が整いました。
Laravelを用いたプロジェクト作成以降は改めてアップします。
MacでPython向けのレトロゲームエンジンpyxelをインストールしてサンプルコード起動した

# 目的

MacでPython向けのレトロゲームエンジンpyxelをインストールしてサンプルコード起動した際の備忘録です。
> [pyxel](https://github.com/kitao/pyxel/blob/master/README.ja.md)

# 準備

ライブラリのインストール

```
brew install python3 sdl2 sdl2_image
pip3 install -U pyxel
```

サンプルのインストール

```
install_pyxel_examples
```

# コード

```
cd pyxel_examples
python3 01_hello_pyxel.py
```

下記の通りサンプルコードの画像が表示されればOK

<img width="827" alt="スクリーンショット 2019-09-14 15.30.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344880/2812a4c7-1e57-e235-57fd-bdd3d6ac7659.png">


# 参考
[pyxel](https://github.com/kitao/pyxel/blob/master/README.ja.md)
[Pyxelでパックマンぽいゲームを作る　前編](https://qiita.com/stmn/items/4048d4af2a9613594b60)
[レトロゲームエンジンPyxelで作曲してみる](https://qiita.com/usangit/items/d379f8ff29971a8364bd)
[macにpyxelをインストールする](https://scrapbox.io/pirutys-scrapbox/macにpyxelをインストールする)
[レトロゲームエンジン Pyxel でライフゲーム](https://qiita.com/7ma7X/items/a1a7be3ed50faa19f086)
[10行でPythonとpyxelでインベーダーを動かす](https://dianxnao.com/10行でpythonとpyxelでインベーダーを動かす/)
[レトロゲームエンジン「Pyxel」でシューティングを作ってみた](http://www.lancarse.co.jp/blog/?p=2351)
[pyxelで雪合戦ゲームを作る](https://note.mu/koide_mizu1433/n/n2e1cbfa62540)
dbpediaの研究 その24

#概要

dbpediaが難解なので、手出してみる。
rubyで、取得してみた。

#サンプルコード


```
require 'net/http'
require 'uri'

target_uri = "http://ja.dbpedia.org/sparql"
uri = URI.parse(target_uri)
req = Net::HTTP::Post.new(uri)
req.set_form_data({'query' => 'SELECT DISTINCT * WHERE { dbpedia-ja:デ・トマソ dbpedia-owl:abstract ?abstract .}'})
response = Net::HTTP.start(uri.hostname, uri.port) do |http|
	http.request(req)
end
print response.body
```

#成果物

https://paiza.io/projects/ylWVWeOynLVGzob-DI7ajA


以上。
UnityでiOSのLaunchScreenにStoryboardを使う方法

UnityのiOS設定でUse Storyboard for Launchしようとしたらハマったのでメモ

### 環境
- Unity 2018.4.12f1 Personal
- Xcode 11.1 (11A1027)

### ① .storyboardファイルを作成する
Xcodeで新規プロジェクトを作成する。Single View AppでOK。
場所はUnityプロジェクトのルート(`Assets`や`Assembly-CSharp.csproj`と同列)がオススメ。
中に`LaunchScreen.storyboard`というファイルがあるのでそれを使うことにする。

### ② .storyboardファイルをUnityに設定
iOSの設定で`Use Storyboard for Launch`にチェックを入れ、
すぐ下の`Custom Storyboard`ボタンから先ほどの`LaunchScreen.storyboard`を選択する。
**LaunchScreen.storyboardはUnityプロジェクトのルート配下に置かれてる必要がある。**
すると`Custom Storyboard`ボタンの右にUnityプロジェクトルートからの相対パスで`LaunchScreen.storyboard`のパスが表示される。

### ③ 画像を表示するには
これだけだとストーリーボードに使われている画像がビルド後のXcodeプロジェクトに含まれないので何とかする必要がある。
今回はStreamingAssetsフォルダを利用することにした。
まずストーリーボードで使われている画像をすべてStreamingAssetsフォルダにコピペする。こうすることで、これらの画像がビルド後Xcodeプロジェクトで`Data/Raw/`フォルダ以下に含まれるようになる。それだけだと画像の参照がうまくいかないので、再びXcodeで`LaunchScreen.storyboard`を開き、ImageViewの参照画像ファイル名の先頭に`Data/Raw/`を付加する。こうすると**ストーリーボード上では画像が「？」で表示され参照が見つからない風になるが、実行すると正しく表示される**

### ④ 画像が表示されない・更新されないときは
- テストで使っているiOS端末の電源をリブート
- XcodeのDrivedDataを全削除(Xcodeの設定からLocationsタブにいくとDrivedDataのパスが分かる)
ハイライト処理に touchesBegan(_:with:) を使うのはやめよう！

## 何事か

あるViewがタップされたときにそれをハイライトさせたいけど、ハイライトの演出をカスタムしたいとき。
私の観測上では [touchesbegan](https://developer.apple.com/documentation/uikit/uiresponder/1621142-touchesbegan) 系メソッドを利用してハイライト演出をするというコードが書かれやすいように感じます。ググり方によってはこれを使う方法がトップヒットするのでしょうか。

私はこの手法は良くないと思っているため、その問題点と改善案を紹介します。

## よくない例

例えば以下のようなコードです。
ハイライト時に表示される用のViewを用意し、 `touchesBegan` 系メソッドをオーバーライドしてそのViewの `isHidden` を書き換えるパターン。

```swift
class BadHighlightView: UIView {
    var highlightView: UIView!
    init() { ... } // highlightView を生成して配置
    
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        highlightView.isHidden = false
    }

    override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
        highlightView.isHidden = true
    }

    override func touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent?) {
        highlightView.isHidden = true
    }
}
```

### なにがいけないのか
`touchesEnded` 及び `touchesCancelled` は呼ばれないことがあるため、容易にハイライト状態が維持されて表示がグリッチします。

言い直すと、 `touchesBegan` が呼び出されたあとに `touchesEnded` または `touchesCancelled` が呼ばれる保証がないため **ハイライトされっぱなしになる** ケースがあります

呼ばれないケースの例

- 1本の指でタップしながらもう1本の指で他のボタンを操作するなどして画面遷移したとき
- タップしながらホームボタンを押したとき（OSバージョンによって挙動が違うかも）
- 複数タップでごちゃごちゃやったとき。条件不明

## 改善案

経験上、 `UIView` で作ってる画面構成パーツのどれかを `UIButton` か `UIControl` にするだけで解決することが多いように思います。

- `UIButton` を配置し [setBackgroundImage:forState:](https://developer.apple.com/documentation/uikit/uibutton/1624016-setbackgroundimage?language=objc) で背景色を指定した画像をセットする
- カスタムView自身の親クラスを `UIControl` にして `isHighlighted` をオーバーライドする

`UIControl` のハイライト状態の管理はUIKitがよしなにやってくれるため上記のようなケースにおいてもハイライト状態が維持されるようなことはありません。

既存構成要素だけではうまくいかない場合は以下のような簡単なハンドル用Viewを差し込むのもありだと思います。

```swift
class HighlightHandleView: UIControl {
    var highlightChanged: ((HighlightHandleView, Bool) -> ())?
    override var isHighlighted: Bool {
        didSet {
            highlightChanged?(self, isHighlighted)
        }
    }
}
```

## まとめ

画面要件によって最適な実装の形は変化しますが、原則としてUIKitが標準で提供しているメソッドをそのまま使ったほうが良いです。
Faceware Analyzer で External Component has thrown an exception の対処メモ

## 状況

Faceware Analyzer 起動時に,

Error: "External Component has thrown an exception"

と出て Analyzer が起動できない.

## 原因と対処

http://support.facewaretech.com/analyzerfaq

Delete your Matlab cache. It is located at the following path (X.X is the version number):

```
C:\Users\(user)\AppData\Local\Temp\(user)\mcrCacheX.X
```

Matlab のキャッシュファイルが原因です. ファイルを削除しましょう.

Windows をアップデートしたり, ハングしたりなどでキャッシュファイルが壊れたのかもしれません.

## その他

ちなみに External Component has thrown an exception とは C# アプリ(Faceware Analyzer が C# で書かれているっぽいため)が出すようです.
PythonでBINGOの「Webツール」をつくる(目次)

とあるきっかけで何でもよいのでWebツールを作ることになった、50才Overのインフラ系エンジニアの記録です。

このページは目次になります。詳細は各ページをご参照ください。

(以下のが画像はサンプルプログラム作成中のものです)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/516359/cbad3bbd-31c7-9846-6630-154d8304f379.png)

##### [インフラ屋がお題として「Webツール」を開発することになったが。。 「Webツール」作成用の環境を考えるまで。](https://qiita.com/wacky3/items/03425f97fb83177573f2) 

##### [windows10(32bit)にPython+Flask+αをインストールしたメモ](https://qiita.com/wacky3/items/bc65502b312bece54c7a)

##### [BINGO「Webツール」の構成を考える](https://qiita.com/wacky3/items/689a78ee627e95212b64)

##### [BINGO「Webツール」の抽選機のみ(デザインなし)を作成する。](https://qiita.com/wacky3/items/cb4de2eac011212428c6)

##### [BINGO「Webツール」のビンゴカード作成部を作る](https://qiita.com/wacky3/items/0523f5e749e1dde8de6d)

（誠意編集中・・・）

ソース置き場
https://github.com/wacky3/BINGO-2019
JavaScriptの基本箇所についての復習：寄り道（配列）

#はじめに
jsでも配列を使うことができます。
配列の知識は複雑なコードを書く際に必要なので、
まずは基本から復習していきます。
#注意
本記事は書きかけです。
知らない間に更新されていることがあります。
#実行
配列は次のように書きます。（配列の大陸名です）

```javascript
var list = ["ユーラシア","アフリカ","オーストラリア","北アメリカ","南アメリカ"];
```
この配列の中から
例えば```アフリカ```を出力したい場合は次のようにすれば良いです。

```javascript
var list = ["ユーラシア","アフリカ","オーストラリア","北アメリカ","南アメリカ"];
console.log(list[1]);
```

アフリカは配列の左から２番目にありますが、
***配列内の番号は0から数える***ので、```list[1]```と指定しています。

上の配列には```南極大陸```が抜けているので、これを追加します。

```javascript
var list = ["ユーラシア","アフリカ","オーストラリア","北アメリカ","南アメリカ"];
list.push('南極');
```

配列名の後に```.push()```をつけて、```()```の中身に追加したい値を入力します。

ちなみに、これは配列名を必ず`list`しなければいけない訳ではなく、

```javascript
var k8v30hrdo = ["ユーラシア","アフリカ","オーストラリア","北アメリカ","南アメリカ"];
console.log(k8v30hrdo[1]);
k8v30hrdo.push('南極');
```
という風に滅茶苦茶な名前でも実行できます。
大事なのは、指定する配列名が既に定義している配列名であることです。
Vim プラグインを書くときの行連結の副作用回避について調べ直した

## はじめに

Vim プラグインについて引き続き調べています。その中でいくつか Vim プラグインを読んでいたのですが、こんな記述を見ることがよくありました。

```vim
let s:save_cpo = &cpo
set cpo&vim

" 処理...

let &cpo = s:save_cpo
unlet s:save_cpo
```

こちらの記述がお作法と呼ばれているようだったのですが、なぜこの記述が必要なのか、その意味について調べたいと思います。

## 行連結の副作用回避

調べてみると、行連結の挙動がおかしくならないようにするための処理のようでした。

[Vim の write-plugin のマニュアル](https://vim-jp.org/vimdoc-ja/usr_41.html#write-plugin) を読むと、`行連結、副作用の回避 ` という項目があります。

例えばスクリプト内で以下のように複数行に渡って設定を記述している場合があります。これば複数行に渡る処理の記述がある場合、バックスラッシュを行頭につけることで記述を連結することができます。（行連結、`line-continuation`）と呼ばれています）

```vim
nnoremap <Leader>t
  \ :echo 111
```

しかし、Vim の挙動を Vi 互換にするかどうかを設定する `compatible` オプションがオンになっていると、バックスラッシュの記述が行連結とならない場合が発生する可能性があり、処理がエラーになる場合があります。


そのため、処理の最初で、`compatible` オプションの値を一時的に変数に保持しておき、Vim の初期値に設定しておきます。

```vim
let s:save_cpo = &cpo
set cpo&vim
``````

`cpo` が `compatible` オプションの設定値であり、`&` で式展開しています。
ちなみに `:echo &cpo` とすると、現在の `compatible` オプションの設定値を確認できます。

```
:echo &cpo
aABceFs_
```

それぞれの文字における設定値の意味は、[マニュアルの cpoptions](https://vim-jp.org/vimdoc-ja/options.html#'cpoptions') の項目を参照ください。


そして処理実行後にもともとの設定値を戻してあげるという形です。


```vim
let &cpo = s:save_cpo
unlet s:save_cpo
```


## おわりに

プラグインの作成のお作法と呼ばれているのは何だったのかがを少し知ることができました。ドキュメントを地道に読んでいくことが大事ですね。


## 参考

* [Vim documentation: usr_41](https://vim-jp.org/vimdoc-ja/usr_41.html#41.11)
【Java初歩】コンパイルとデータ型について

Java学習で学んだことを記録しています。

##Javaのバージョン確認
まず、Javaがインストールできているかを確認する。

```
Java -version
```
・バージョン情報が表示されればjavaはインストールされている

##コンパイル
コンパイルとは、プログラミング言語で書かれた文字列（ソースコード）を、コンピュータ上で実行可能な形式（オブジェクトコード）に変換すること。

```Test.java
public class Test {
  public static void main(String[] args) {
    System.out.println("Hello World");
  }
}
```
```java
//コンパイル
jabac Test.java
```
・classのあとに記載するクラス名とファイル名（Test)は一致させること
・jabacでコンパイルすると「Test.class」ができる


##実行
```java
java Test
```
・拡張子の「.class」は不要

##変数の宣言
```java

//宣言
int x;
//宣言と同時に値を代入
char z = 'A';
```
・データ型　変数；　の形で宣言する

##プリミティブ型（基本型）のデータ型
| 種類       |        型    |    説明   |
|:-----------------|:------------------------|:------------------|
| 論理型      |boolean         |真偽型（true、またはfalse） |　  
| 文字型      |char　　　       |2バイトUNICODE文字（u0000～uffff）   |
| 整数型           |             byte |     1バイト符号付き整数（-128～127）  |
| 整数型            |               short |     2バイト符号付き整数（-32768～32767）  |
| 整数型            |            int|     4バイト符号付き整数（-2147483648～2147483647）    |
| 整数型         |          long |     8バイト符号付き整数（-9223372036854775808～9223372036854775807）    |
| 浮動小数点型      |          float|      4バイト浮動小数点数（±1.40239846×10^-45～±3.40282347×10^38）     |
| 浮動小数点型         |       double |     8バイト浮動小数点数（±4.94065645841246544×10^-324～±1.79769313486231570×10^308）     |
・整数型は基本intかlongを使う
・longを使う場合は数値の最後に「L」をつける 例） long x = 100000000L;
・floatを使う場合は数値の最後に「F」をつける 例） long ｙ = 10.11F;
・基本型は値そのものが入る

##参照型（クラス型）のデータ型
・文字列（String）、配列（Array)、クラス（Class)は参照型である
・参照型は格納された値の位置情報が入る
・基本型と違って値の長さは固定されていない


ここまで。
レンタルサーバーとかで最新版のpythonを使うための備忘録

大体のレンタルサーバーでは既に`python`がインストールされ、特に何もしなくても使えるようになっています。しかし**バージョン**が古かったり`pip`で外部モジュールをインストール出来なかったりしちゃうので、そこら辺を上手いこと出来るようにした備忘録になります。
とりあえず`git`が使えればなんとかなるんちゃう(適当

# ケース: お名前.comレンタルサーバー

- 管理者権限: 無し
- git: ○

とりあえず`pyenv`を`git clone`してきて、初期化及び環境変数への登録をしておきましょう。`pyenv -v`が実行出来ればOKです。普通なら素直に`pyenv install`をしたいところなのですが、そのままだと`/tmp`が`noexec`やぞゴラァって怒られるので、環境変数`$TMPDIR`を`$HOME/.tmp`に設定してあげましょう。

```bash
git clone https://github.com/pyenv/pyenv.git ~/.pyenv
echo 'export PATH="$HOME/.pyenv/bin:$PATH"' >> ~/.bashrc
# /tmpがnoexecされる問題への対処
echo 'export TMPDIR="$HOME/.tmp"' >> ~/.bashrc
# 初期化
echo 'eval "$(pyenv init -)"' >> ~/.bashrc
mkdir -m 700 ~/.tmp
source ~/.bashrc
pyenv -v
# pyenv 1.2.15-1-g49bf59
```

`noexec`が何なのか知っている方がいらしたら、是非ともご教授下さい。この辺が**雰囲気エンジニア**なのでよく分からんのです♡

## 注意

**2019/11/09**現在、`python3.8.0`が下記方法で上手くインストール出来ないので、`3.7.5`をインストールしています。悪しからず

```bash
pyenv install --list | grep 3.7
CONFIGURE_OPTS="--enable-shared" pyenv install 3.7.5
pyenv global 3.7.5
```

## WIP

他のレンタルサーバーを扱う機会があれば、随時更新していきますね。**○○サーバーでも上記方法で出来たよ!!**って報告をお待ちしております!!