OmniAICreator/Qiita-1.07M huggingface dataset:
【Excel VBA】開いているワークブックの名称をチェックする関数


[エクセルVBAで指定したWorkbookがあるか調べる２つの方法](https://www.excelspeedup.com/getworkbook/) をコピペして利用していたら「保護されたビュー」で引っかかったので。

# TL;DR

```vb:VBA
'原型は、https://www.excelspeedup.com/getworkbook/ から
'同名のファイルが既に開かれていた場合に合致したWorkbook型を返す関数.
'1つも引っかからなければNothingを返す
Function getWorkbookByName(targetWorkbookName) As Workbook
  Dim TempWorkbook As Workbook
  For Each TempWorkbook In Workbooks
    If TempWorkbook.Name = targetWorkbookName Then
      Set getWorkbookByName = TempWorkbook
      Exit Function
    End If
  Next
  
  '上の処理(Workbooksから取得)だと「保護ビュー」のワークブックが引っかからない問題があるので、下記で解決する
  Dim TempWorkbook2 As Workbook
  Dim size As Long
  size = Application.ProtectedViewWindows.Count
  For i = 1 To size
    Set TempWorkbook2 = Application.ProtectedViewWindows(i).Workbook
    If TempWorkbook2.Name = targetWorkbookName Then
      Set getWorkbookByName = TempWorkbook2
      Exit Function
    End If
  Next
  
  Set getWorkbookByName = Nothing
End Function
```
# 雑な解説
`Workbooks` は保護されたビューを含まない。
従って `Application.ProtectedViewWindows` から引っ張ってきてforループで逐次する処理を追加している。

VBAに不慣れなので、より効率的な書き方があったらマサカリを投げて頂ければ幸いです。
配列はオブジェクトである

# 配列クラスはJVMに定義された

```java
public class ArrayClassClassloader {

	public static void main(String[] args) {
		System.out.println(boolean[].class.getClassLoader());
	}

}
```

出力

```
null
```

Bootstrap class loaderによって読み込まれたということ

# 名前の配列クラス

```java
public class ArrayClassName {

	public static void main(String[] args) {
		System.out.println(boolean[].class.getName());
		System.out.println(short[].class.getName());
		System.out.println(int[].class.getName());
		System.out.println(long[].class.getName());
		System.out.println(float[].class.getName());
		System.out.println(double[].class.getName());
		System.out.println(char[].class.getName());
		System.out.println(byte[].class.getName());
		System.out.println();
		System.out.println(java.lang.Integer[].class.getName());
		System.out.println();
		System.out.println(int[][].class.getName());
		System.out.println(int[][][].class.getName());
		System.out.println(int[][][][].class.getName());
	}

}
```

出力

```
[Z
[S
[I
[J
[F
[D
[C
[B

[Ljava.lang.Integer;

[[I
[[[I
[[[[I
```
HerokuのRailsアプリのDBリセット方法

# はじめに
Heroku上にあるRailsアプリのPostgresのDBリセット方法です。
最初に`heroku run rails db:reset -a アプリ名`を行うも途中でエラーが発生。↓

```
ActiveRecord::ProtectedEnvironmentError: You are attempting to run a destructive action against your 'production' database.
If you are sure you want to continue, run the same command with the environment variable:
DISABLE_DATABASE_ENVIRONMENT_CHECK=1
```
DB破壊系のコマンドを実行する際には`DISABLE_DATABASE_ENVIRONMENT_CHECK=1`を付け足せとメッセージが表示。
再度上記環境変数を付け足してコマンド実行も

```
rails aborted!
PG::ConnectionBad: FATAL:  permission denied for database "postgres"
DETAIL:  User does not have CONNECT privilege.
```
今度は権限がないとエラー。　　
#解決方法
`heroku pg:reset -a アプリ名`コマンド実行。

```
▸    WARNING: Destructive action
 ▸    データベース名 will lose all of its data
 ▸    
 ▸    To proceed, type アプリ名 or re-run this command with --confirm
```
ここで先に進むためには再度アプリ名を入力するか、同じコマンドに`--confirm`を付け足して再度実行しろとメッセージ、指示通りにコマンドを打てばリセット完了。
リセット後アプリを開く際には`heroku run rails db:migrate`コマンドも忘れずに。
#最後に
DB周りのエラーは、初学者がアプリをローカル環境から本番環境に移行する際に非常によく遭遇しますね。
この記事が少しでも役に立てば幸いです。
Go 関数とメソッドを試すの巻き

``` go

package main

import "fmt"

//スコープの関係でここにHoge型を定義する
type Hoge string

func main() {

	//---------------------------------------------------
	//まずは無名関数で	
	f := func(src string) string { return "<<" + src + ">>" }

	// main関数の中で、fを利用する
	fmt.Printf("%v\n", f("hoge0"))

	// 加工した文字列を受け取る
	hoge1 := returnString("hoge1")
	fmt.Printf("%v\n", hoge1) //<<hoge1>>

	// print関数の中で加工してprintする
	print("hoge2") //<<hoge2>>

	// 関数にf変数関数を渡して、printする
	printFunc(f, "hoge3") //<<hoge3>>

	//---------------------------------------------------
	// 宣言してから、代入してみるが、この使い方はたぶん無いな
	var ff func(src string) string
	ff = func(src string) string { return "<<" + src + ">>" }

	fmt.Printf("%v\n", ff("hoge4")) //<<hoge4>>

	// 関数を返してもらって利用する
	fff := returnFunc()
	fmt.Printf("%v\n", fff("hoge5")) //<<hoge5>>

	// 関数を返してもらって利用する ※かっこをつけなかったら・・・
	ffff := returnFunc

	ffff2 := ffff()
	fmt.Printf("%v\n", ffff2("hoge6")) //<<hoge6>>

	// 違い
	fmt.Printf("%#v\n", &ffff)  //(func() func(string) string)(0xe2500)
	fmt.Printf("%#v\n", &ffff2) //(func(string) string)(0xe26a0)

	//---------------------------------------------------
	// 型で定義
	type funcType func(src string) string

	var hogeFunc funcType

	hogeFunc = func(src string) string { return "<<" + src + ">>" }

	fmt.Printf("%v\n", hogeFunc("hoge7")) //<<hoge7>>

	// Hoge型のメソッドでprintする
	var ss Hoge
	ss = "hoge8"
	fmt.Printf("型は%Tです。\n", ss) //型はmain.Hogeです。
	ss.print()                  //<<hoge8>>

}

//hoge1用関数
func returnString(s string) string {
	return "<<" + s + ">>"
}

//hoge2用関数
func print(s string) {
	fmt.Printf("<<%v>>\n", s)
}

//hoge3用関数
func printFunc(f func(string) string, s string) {
	ret := f(s)
	fmt.Printf("%v\n", ret)
}

//hoge5 & hoge6 用関数
func returnFunc() func(string) string {
	return func(src string) string { return "<<" + src + ">>" }
}

//hoge8用メソッド
func (h Hoge) print() {
	fmt.Printf("<<%v>>\n", h)
}



```
(macで) venvで開発環境を構築する

## venv?
- 開発環境のパッケージを一括管理するもの
- .requirement.txtでパッケージの記述ができる
- PCを変えてもすぐに環境構築ができるためすごぶる便利

## 手順

１、プロジェクト用ディレクトリー作成し、そこに入る

```bash
mkdir myProject
cd myProject
```

２、venvセットアップする

```shell
python -m venv venv_myProject

#ここでvenv_myProjectとしているが、もちろん命名は自由です
#するとvenv_myProjectというフォルダが作られる
```

３、requirement.txtを作る。

```shell
vi requirement.txt
```

４、requirement.txtの中身をかく
直接パッケージ名のみ書くと、インストールするたびに最新バージョンが入ります。
下の例のように `package == 0.24.2` と書けばパッケージのバージョンを固定することができる。

```
Flask
pandas == 0.24.2
records
pytest
...
```

５、パッケージをインストールする

```shell

source venv_myProject/bin/activate
（venv_myProject） $ pip install -r requirements.txt
```

6、パッケージを確認したいとき

```shell

#全てのパッケージのリスト
（venv_myProject） $ pip list
#特定のパッケージの情報
(venv_myProject) $ pip show Flask

Name: Flask
Version: 1.1.1
Summary: A simple framework for building complex web applications.
Home-page: https://palletsprojects.com/p/flask/
Author: Armin Ronacher
Author-email: armin.ronacher@active-4.com
License: BSD-3-Clause
Location: /Users/baixiao.lin/hr_git/gifts/venv_gifts/lib/python3.5/site-packages
Requires: click, Werkzeug, itsdangerous, Jinja2
```

## 注意
構築された環境が動作するために、`source venv_myProject/bin/activate` は必須です
新しいターミナル開いたら、もう一回`source venv_myProject/bin/activate`をしなければならない。
パッケージについて

##javaのパッケージについて
パッケージとはjavaのクラスをまとめて分類するための仕組みです。

クラス数が大量にある場合、それらを機能などで分類しておくまとめておくクラスの管理が容易になります。

##パッケージの宣言　使い方

クラスの先頭で(package)と宣言する事で、そのクラスが分類されるパッケージを指定する事ができます。

```java
package pack;
```

パッケージが未指定だと全てデフォルトパッケージに分類されます。

パッケージを指定した場合、そのクラスのソースファイルは指定パッケージと同じ名前のフォルダに格納する必要があります。

仮にファイルを移動した場合は、ソース内のパッケージ宣言も合わせて変更する必要があります。

同一パッケージ内のクラスにはクラス名のみでアクセスが可能です。

しかし、パッケージ外のクラスにアクセスする場合はインポート文によって対象のクラスの場所を明示する必要があります。

```java

import pack;
```

パッケージは段層を作成する事ができます。
複数の段層から成るパッケージの場合は、段層の上から順に（.）でパッケージ名を連結します。

```java

package packA.packB.packC;
```
エンジニアにおける文化的側面

Javaで何年経験があるとか、Ruby on Railsの経験が何年あるとかある程度重要なんですが、あまり議論されないなのが個人のエンジニアが持ち合わせている性格、適正、文化的側面ってあまり議論されませんよね。ある程度の年数をやってきているエンジニアさんであれば、新しい技術を学ぶのは何度もやってきているしそんなに大変なことではないんですよね。むしろ面白い。しかし、どうして採用する側はエンジニア個人が持ち合わせている心構えだったり、意気込みというのがあまり注目されないんでしょうか。私は在米歴２１年の元英語教師のエンジニアなんですが、そういうことに関してとても疑問に感じております。現役でがんばられているエンジニアの皆さんのお話聞いてみたいです。
#AWS SQS の Dead Letter Que に送られたメッセージを #Ruby の shoryuken gem の Worker で処理する

- rails関係なし
- AWS SQS の DeadLetterQue には通常のキューで処理に失敗したメッセージが送られるが、それをさらにWorkerで処理して「メッセージ受信可能」->「処理中」->「削除」の状態に遷移させる。
- コマンドに -q オプションでキューの名前を指定して、Worker の shoryuken_options にも同じキュー名を書いておかなければいけなさそう？
- 特に何も perform で処理をさせない場合は、ruby の Worker class は要らなそう

# env

```
export AWS_ACCESS_KEY_ID=YYYYYYYYYY
export AWS_SECRET_ACCESS_KEY=ZZZZZZZZZZZ
export AWS_REGION=us-east-2
```

# AWS console

コンソールでDeadLetterQueの名前がわかる (こいつ、どこで生まれるんだろう。最初からあるんだっけ？)

![image](https://user-images.githubusercontent.com/13635059/65211462-cd61ae00-dad9-11e9-844f-e03026fc0592.png)


# shoryuken_worker.rb

```rb
class ShoryukenWorker
  include Shoryuken::Worker

  shoryuken_options queue: 'XXX', auto_delete: true

  def perform(sqs_msg, name)
    puts '-' * 100
    puts 'WORKER'
    puts '-' * 100
    puts name
    puts sqs_msg
  end
end
```

# Command

```rb
bundle exec shoryuken -q  XXX --require ./shoryuken_worker.rb
```

# 送信テスト

AWS console のキューの操作で、DeadLetterQueにも直接メッセージを送信可能

![image](https://user-images.githubusercontent.com/13635059/65211438-ac00c200-dad9-11e9-899d-b43c99b77b5e.png)

# Worker の結果


![image](https://user-images.githubusercontent.com/13635059/65211448-ba4ede00-dad9-11e9-8dc2-c781f36a92eb.png)


# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2482








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Homebrewでインストールしたgcloudコマンドの補完を有効化する

# 注意
pyenvなどでPython 3系などを使っていると、うまく動かないっぽい。

`pyenv global system` でmacOSデフォルトのPython 2を使うようにすると動いた。

# `gcloud` コマンドをインストール

```bash
$ brew cask install google-cloud-sdk
```

# install.shを実行

```bash
$ cd /usr/local/Caskroom/google-cloud-sdk/latest/google-cloud-sdk

$ ./install.sh
Welcome to the Google Cloud SDK!

To help improve the quality of this product, we collect anonymized usage data
and anonymized stacktraces when crashes are encountered; additional information
is available at <https://cloud.google.com/sdk/usage-statistics>. You may choose
to opt out of this collection now (by choosing 'N' at the below prompt), or at
any time in the future by running the following command:

    gcloud config set disable_usage_reporting true

Do you want to help improve the Google Cloud SDK (Y/n)?  Y


This will install all the core command line tools necessary for working with
the Google Cloud Platform.


All components are up to date.

Modify profile to update your $PATH and enable shell command
completion?

Do you want to continue (Y/n)?  Y

The Google Cloud SDK installer will now prompt you to update an rc
file to bring the Google Cloud CLIs into your environment.

Enter a path to an rc file to update, or leave blank to use
[/Users/tadamasatoshi/.bash_profile]:
Backing up [/Users/tadamasatoshi/.bash_profile] to [/Users/tadamasatoshi/.bash_profile.backup].
[/Users/tadamasatoshi/.bash_profile] has been updated.

==> Start a new shell for the changes to take effect.


For more information on how to get started, please visit:
  https://cloud.google.com/sdk/docs/quickstarts


$ source ~/.bash_profile
```
めんどくさがりやはタスクスケジューラに頼ろう

#はじめに
決めたことは守りたいされど、めんどくさくて3日坊主が続く人には、PCさんが優しく冷たく秘書代わりになってくれる機能がある。

そんな愛すべきタスクスケジューラを活用して、目指せ脱３日坊主！

##Windows タスクスケジューラ
やはりデフォルトアプリが良いが若干設定に癖がある。Windowsに関していえばこれが筆頭であり一般のアプリはほとんど見つけられない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340031/e8b422a2-84a6-2035-f432-9e3e5387627d.png)


###アプリケーションを自動起動する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340031/ad4af5da-0299-0cb9-b2cf-bb4e355a3a4e.png)


###Webブラウザで特定のページを起動する
Webアプリが対応しているのでこれも必要。
IEであれば、IEのexeファイルのパスを指定し、引数で開きたいWebページのURLを指定してあげるだけでよい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340031/620d5acc-4d22-5edd-8c39-4a08931e76b9.png)

###Webブラウザで特定のページを起動する batファイル経由
batファイルを作成しbatファイル経由で開くことも可能だ。
例えば、

chromeで開く場合

```bash
@echo off
start chrome.exe "www.yahoo.co.jp"
```

もしくは、Firefoxであれば

```bash
@echo off
start firefox.exe "www.yahoo.co.jp"
```

直接ブラウザのexeを指定した要領と同じで指定すれば良い。
尤も、上記の様な特定ブラウザ、特定のURLを起動というレベルであればbatにする必要は無いが、多くの処理を重ねる場合は便利である。

##トリガーの設定

1つのタスクにトリガーを複数設定することができる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340031/c596d635-0349-2fb7-ed9c-660ab84f9a8a.png)

上記では、下3つが14:30から1時間毎に繰り返す設定をしているが、定期間隔に繰り返す場合は下記の繰り返し間隔で時間毎の設定をしてやるだけでよい。（MAX1時間間隔）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340031/b4c82b76-ddc1-3d10-47e2-d0fcf9852229.png)
iOSのFacebookログインでネイティブアプリを開いてくれない時

ちょっと情報古い可能性あります。

# SDK
公式のSDKである`FacebookCore`と、`FacebookLogin`をpodでインストールして使っています。

```Podfile
pod 'FacebookLogin'
```

```Podfile.lock
  - FacebookCore (0.3.0):
    - Bolts (~> 1.8)
    - FBSDKCoreKit (~> 4.27)
  - FacebookLogin (0.3.0):
    - Bolts (~> 1.8)
    - FacebookCore (~> 0.3)
    - FBSDKCoreKit (~> 4.27)
    - FBSDKLoginKit (~> 4.27)
  - FBSDKCoreKit (4.33.0):
    - Bolts (~> 1.7)
  - FBSDKLoginKit (4.33.0):
    - FBSDKCoreKit
```

# ログインできるけど、ネイティブアプリが開いてくれない

## 状況

ログインはできるが、WebView内でメールアドレスとパスワードを入力しないといけない。
他のアプリのFacebookログインではWebView内に「Facebookアプリでログイン」ボタンが表示され、それをタップするとネイティブアプリが開くのに、自分の実装ではそのボタンが表示されない。

## 結論: info.plistに"fbauth2"を追加する。

https://stackoverflow.com/questions/32006033/ios-9-fbauth2-missing-from-info-plist?answertab=votes#tab-top

> ```
> <key>LSApplicationQueriesSchemes</key>
> <array>
>     <string>fbauth2</string>
> </array>
> ```

これを追加すれば、ネイティブアプリがインストールされている場合は、「Facebookアプリでログイン」ボタンが表示されると思います。

## 詳細

### `LSApplicationQueriesSchemes`って？

[iOS9でカスタムURLスキームの遷移に失敗するときの注意点](https://qiita.com/Night___/items/60355d21951cffbef51b)
詳しく書かれている方がいらっしゃいました。

[WIP]
【黒本】「T字形ER データベース設計技法」読書メモ【更新途中】

## 目次
- 第1部 基準編(「T字形ER手法」の位置づけ
- 「T字形ER手法」の体系
- identifierとentity ほか)
- 第2部 応用編(「3P形式の伝票」(identifierの流用)
- 「在庫」はentityか?
- 「製品」はentityか? ほか)
- 第3部 特論(J.D. Warnier氏、E.F.Codd氏とP.Chen氏の相関関係
- ワーニエ・メソッド―反復構造
- ワーニエ・メソッド―選択構造および真理値 ほか)
Eclipse/Che でワークスペース再立ち上げ不能になった場合の復旧手順

Eclipse/Che を使っているときに、サーバ側の理由でトラブルがあったとき、どう回復すればよいのか分からなくなるときがあると思います。

率直にいって、それは Che の UI 設計が宜しくないからであって、いつの日か修正されると思います。しかし、その日が今日明日という可能性は極めて低いです。

そこで、よくあるパターンと、その回避方法を記しておきます。

# よくあるパターン

## ワークスペースの実行がタイムアウトした

Eclipse/Che は、管理者が制限をかけない限り、複数のワークスペースが実行可能です。実行中のワークスペースは、タブの `RECENT WORKSPACES` の項目に緑丸印で判別できます[^1]。

[^1]: 他の画面でも確認可能ですが、本稿では詳説省略します。

たとえば、ワークスペース `wksp-izxh` で作業中だとします。なんの問題もなければ、`RECENT WORKSPACES` の該当行の左側には緑丸印が表示されます。

しかし、何らかの理由でワークスペースが終了した場合、白丸印に変化します。

![Screenshot 2019-09-19 at 14.03.36.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5414/fbf04b30-3d10-6204-b123-108852dbf9ee.jpeg)

ここで、`wksp-izxh` の部分を押すと、再起動してくれるような気がするのが普通だと思うのですが、押してみてもなんの反応もありません。

## ワークスペースの生成中にエラー終了した。

ワークスペースの生成中に、何らかの理由でエラー終了する場合があります。大抵はタイムアウト(コンテナイメージのダウンロードが長すぎた、ノードの追加に時間がかかった、など)で起きますが、サーバ側のリソースが枯渇した、など様々な理由があります。

これらのエラーでは、ログに赤い文字列が表示されます。

![Screenshot 2019-09-19 at 12.48.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5414/bb48c82a-4cc9-ea45-a6d9-d29cb5c4acdd.png)


この場合も、`RECENT WORKSPACES` の該当行を押して再試行してみたくなるのが普通だと思うのですが、押してみてもなんの反応もありません。

# 復旧手順

`RECENT WORKSPACES` は一旦忘れて、`Dashboard` を押してください。

![Screenshot 2019-09-19 at 14.21.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5414/6c080c56-6922-8e72-c1d3-a933c2802a88.png)

表示されるリストに ▶ ボタンが見えますが、これは__押さず__に、`RECENT WORKSPACE` にある、開きたいワークスペース名(上記例に倣うなら `wksp-izxh`)を押してください。

実際のところ ▶ 押しても害はなく、ワークスペースの起動処理が始まります。しかし、loading 画面に遷移しません。画面を開くために、さらに数クリックの手間がかかります。

# おことわり

Che7 のリリースも終わったので、ワークスペース周りの UX 改善も進むと思います。本稿は、今を生きるための "バッドノウハウ" です。
typescript + dynamodb documentClient で条件付きput

# 前提
- dynamodbのテーブルは、パーティションキー/ソートキーを設定している、いわゆる複合プライマリキーを採用したテーブルを利用
- 同リクエストがあった場合、上書きしたくない。パーティションキー/ソートキーの組み合わせがすでに存在する場合はputしない

# dynamodbのテーブル構成
パーティションキー: partition (string型)
ソートキー: sort (string型)

# コード
命名は自信ない

```typescript
import { DocumentClient } from "aws-sdk/clients/dynamodb";

export class DynamoRepository {
    private client: DocumentClient;
    constructor() {
        this.client = new DocumentClient({
            apiVersion: "2012-08-10",
            region: "us-west-2"
        });
    }

    async put(tableName: string, item: DocumentClient.PutItemInputAttributeMap) {
        const params: DocumentClient.PutItemInput = {
            TableName: tableName,
            Item: item,
            ExpressionAttributeNames: {
                "#p": "partition",
                "#s": "sort"
            },
            ConditionExpression: "attribute_not_exists(#p) AND attribute_not_exists(#s)"
        };

        return await this.client.put(params).promise();
    };
}
```

動的にregionをいい感じにしたければいい感じにしていただけると

itemは以下の感じ
partition/sortは必須でそれ以外はお好きに

```typescript
const item = {
    partition: "hoge",
    sort: "fuga",
    piyo: "piyo",
    data: {
        key1: "key1",
        key2: {
            key3: 3,
            key4: "key4"
        }
    }
};
```

```typescript

import { DynamoRepository } from "../repository/DynamoRepository";

const repo = new DynamoRepository();
await repo.put("hogehoge", item);
```
的な感じで
E382: Cannot write, 'buftype' option is setの対処法

## E382: Cannot write, 'buftype' option is set

vimでファイル編集していたら以下のアラートが出て保存できなくなった

```vim

E382: Cannot write, 'buftype' option is set
```

### 結論
buftypeをemptyに変更すれば治った

```vim

:set buftype=
```

### なんでこうなった？


ドキュメントを読んだ
options - Vim日本語ドキュメント: https://vim-jp.org/vimdoc-ja/options.html#'buftype


```
'buftype' 'bt'          文字列 (既定では "")
                        バッファについてローカル
        このオプションはバッファの種類を指定する。
          <empty>       普通のバッファ
          nofile        ファイルと関連がなく、書き込まれる予定のないバッファ
          nowrite       書き込まれる予定のないバッファ
          acwrite       いつも自動コマンドBufWriteCmdで書き込まれる予定のバッ
                        ファ。
          quickfix      エラーリスト :cwindow またはlocationリスト :lwindow
                        を含んだquickfixバッファ。
          help          ヘルプバッファ (ユーザーが手動でこれに設定することはな
                        いはずである)
          terminal      terminal のためのバッファ (ユーザーが手動でこれを設
                        定することはないはずである)
          prompt        プラグインに使われることを意図した、最後の行だけを編集
                        できるバッファ、prompt-buffer を参照。
                        {+channel 機能付きでコンパイルされたときのみ有効}
          popup         ポップアップウィンドウで使われるバッファ
                        {+textprop 機能付きでコンパイルされたときのみ有効}

        このオプションはオプション 'bufhidden' や 'swapfile' と共に使われ、特
        殊な用途のバッファを指定する。special-buffers を参照。

        このオプションの変更には十分注意すること。多くの副作用が起こるかもしれ
        ない！
```

buftypeを確認

```vim

:set buftype?

-> buftype=nofile
```
なぜかnofileでファイルを開いてしまっていたらしい
org.springframework.data.jpa.repository.JpaRepositoryインタフェースを実作するクラスはなに?

僕の[サンプルアプリケーション(Spring Data JPAバージョン)](https://github.com/saladlam/spring-noticeboard/tree/spring-data-jpa)を見て、リポジトリにただ2つのインタフェースが作られた

![interface.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232557/1b2fae4d-02a5-e366-8769-67fde43f096a.png)

インタフェースを実作するクラスは見えない、実際に*info.saladlam.example.spring.noticeboard.service.MessageServiceImpl*に注入するインスタンスクラスは何？

*MessageServiceImpl*に注入するインスタンスはプロキシであり、そのターゲットインスタンスクラスは*org.springframework.data.jpa.repository.support.SimpleJpaRepository*だ。いろいろインターセプターがこのプロキシに付け、その中に大切なインターセプターは*org.springframework.data.repository.core.support.RepositoryFactorySupport.QueryExecutorMethodInterceptor*であり。

下のはインタフェース*info.saladlam.example.spring.noticeboard.repository.MessageRepository*

```java
public interface MessageRepository extends JpaRepository<Message, Long> {

	@Query("SELECT m FROM Message m WHERE m.approvedBy IS NOT NULL AND m.publishDate <= :at AND (m.removeDate IS NULL OR m.removeDate > :at) ORDER BY m.publishDate DESC")
	List<Message> findPublished(@Param("at") LocalDateTime at);

	@Query("SELECT m FROM Message m WHERE m.approvedBy IS NULL ORDER BY m.publishDate DESC")
	List<Message> findWaitingApprove();

	@Query("SELECT m FROM Message m WHERE m.owner = :owner ORDER BY m.publishDate DESC")
	List<Message> findByOwner(@Param("owner") String owner);

}
```

そして親インタフェース*org.springframework.data.jpa.repository.JpaRepository*

```java
@NoRepositoryBean
public interface JpaRepository<T, ID> extends PagingAndSortingRepository<T, ID>, QueryByExampleExecutor<T> {

	List<T> findAll();
	List<T> findAll(Sort sort);
	List<T> findAllById(Iterable<ID> ids);
	<S extends T> List<S> saveAll(Iterable<S> entities);
	void flush();
	<S extends T> S saveAndFlush(S entity);
	void deleteInBatch(Iterable<T> entities);
	void deleteAllInBatch();
	T getOne(ID id);

	@Override
	<S extends T> List<S> findAll(Example<S> example);

	@Override
	<S extends T> List<S> findAll(Example<S> example, Sort sort);

}
```

例えば、*JpaRepository*で定義する**findAll()**メソッドが呼び出される時、実際に*SimpleJpaRepository*の**findAll()**メソッドが呼び出される。*MessageRepository*で定義する**findWaitingApprove()**メソッドが呼び出される時、インターセプター*org.springframework.data.repository.core.support.RepositoryFactorySupport.QueryExecutorMethodInterceptor*が作動させる。下のは**org.springframework.data.repository.core.support.RepositoryFactorySupport.QueryExecutorMethodInterceptor.doInvoke()**メソッド


```java
		@Nullable
		private Object doInvoke(MethodInvocation invocation) throws Throwable {

			Method method = invocation.getMethod();
			Object[] arguments = invocation.getArguments();

			if (hasQueryFor(method)) {
				return queries.get(method).execute(arguments);
			}

			return invocation.proceed();
		}
```

**queries**はマップであり、*org.springframework.data.jpa.repository.query.JpaQueryMethod*インスタンスを蓄え、キーは*MessageRepository*で定義するメソッド。
Splunk よくあるエラー(error) 対処法

#ディスクスペース(Disk Space)が足りない
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394817/736d9a1c-ba02-beb2-ed24-97b4eac97cc6.png)

デフォルトでは5000MBなので以下のコマンドで閾値をへらすことでアラートは止めれる
__当然容量が増えるわけではないのでできるならば増やしましょう。__
https://docs.splunk.com/Documentation/Splunk/7.3.1/Indexer/Setlimitsondiskusage

```
splunk set minfreemb 1000
splunk restart
```

もしくは直接confを編集して、再起動

```splunk/etc/system/local/server.conf 
[diskUsage]
minFreeSpace = 1000
```
GitHub  資源(repository)を間違えて作った

C++N4830
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/n4830.pdf

をCompileするrepositoryを作ろうとした

#新規作成

![github1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51423/417aaa93-9742-97d5-89b8-bdfb0701c31d.png)

画面でGitHubの窓の左上のRepositoriesの横の Newを選ぶ。

#名前入力
![github2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51423/ca0d64e1-2ef3-64ca-8706-77dabcb02b00.png)

Repository Name

```
C++N4830
```

と入力して作成したら。

Publicは公開、Privateは非公開

今回は公開(Public)

Initialize this repository with a Readme.

原則的にReadme.mdは最初からあった方がよい。

![github3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51423/5b47f8e3-97b8-e69f-61f4-16a8c5c5ca09.png)


![github4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51423/4386a892-5daf-e53a-5bcf-bc84f3b23ed9.png)

名前を間違えただけならRenameすればよい。Settingsを選択。

![github5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51423/76c1f18f-6cd4-072d-6658-5d76f38c3992.png)

![github6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51423/64e56e21-b251-3d74-42ef-36edb635f781.png)

![github6a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51423/a19482d0-c481-bb51-e3ab-20f74b8db4ce.png)


![github6b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51423/bd5a6c9f-d94b-8f37-89a3-491e3dbf6208.png)
![github7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51423/62304624-ce14-187f-0021-1fb831da78da.png)

「Delete this repository」すれば消せる。

# その他

Repository名を変更する事例は別途記載。

# 文書履歴(document history)
ver. 0.01 初稿 20190919
ver. 0.01 表題等訂正 20191212
ver. 0.03 URL追記　20230228

### 最後までおよみいただきありがとうございました。

いいね　💚、フォローをお願いします。

####  Thank you very much for reading to the last sentence.

Please press the like icon 💚　and follow me for your happy life.
TM法、T字形ERについてのまとめ【更新途中】

## モデリングとは、モデル化するとは、どういうことであるのか
- セミナー等で著者本人より補足いただいた内容を以下にまとめました。
   - 「モデリング」とは、システム開発／データベース設計における現実的自体(経営過程)を「モデル化」する行為
   - 「モデル化」とは、哲学／数学／論理学の理論に準拠して誠実かつ厳密に行われなければならない。
   - エンジニアの経験や勘に依存し、十人十色のモデルが出来上がるようなことがあってはならない。
   - T字形ER手法は古い概念であり、現在は用いていない。
   - 現在はTM法といっている。但し独自の設計手法のことではなく、Theory of Models、数学基礎論におけるモデル論のこと。
   - 「数学的手法を用いてモデリングを行う」ということであり、～流、や～法、といった個人に拠って立つ流派等ではない。
   - 主な参考文献著書：```ポパー、カルナップ、ゲーデル、タルスキー、クリプキ、ヘンペル、ホワイトヘッド、ヴィトゲンシュタイン```

## 関連読書メモ
[【赤本】データベース設計論 - T字形ER 読書メモ](https://qiita.com/yet103/items/a222710390673bd3d816)
[【論考】論理データベース論考 読書メモ] (https://qiita.com/yet103/items/04c5067be328e1da13a6)
[【いざない】モデルへのいざない 読書メモ](https://qiita.com/yet103/items/0a85ea06ab6ae8bf6faa)
~~【黒本】T字形ER データベース設計技法~~

## 本家
[佐藤正美の問わず語り](http://www.sdi-net.co.jp/)
「モデルへのいざない」読書メモ【更新途中】

## 目次
- 語彙と文法
- 論理定項
- 総合的と分析的
- 表現関係と指示関係
- 「意味および意義」ならびに「真」
- 集合
- 写像
- ＺＦの公理系
- 関係
- 複文と単文〔ほか〕
【論考】「論理データベース論考」読書メモ【更新途中】

##目次
- 理論編（記号論理学の体系
- ブール代数
- 命題論理　ほか）
- 基準編（Ｔ字形ＥＲ手法の概念（定義・公理・推論規則）
- Ｔ字形ＥＲ図の作成手順
- Ｔ字形ＥＲ図の使用上の留意点　ほか）
- 実践編（Ｔ字形ＥＲ手法の練習問題）
- 文献編（参考文献）
固定長のPromise.allのコールバック関数の引数は分割代入で受けるといい感じ

Promise.allのコードのサンプルを見ると、大体

``` javascript
Promise.all([hoge(),fuga()]).then(results => {
  results[0]//hogeの結果
  results[1]//fugaの結果
});
```

という感じになっていますが、Promise.allの引数の配列の長さが決まっている場合

``` javascript
Promise.all([hoge(),fuga()]).then(([hoge,fuga]) => {
  hoge//hogeの結果
  fuga//fugaの結果
});
```
と書くと可読性が高くていい感じです。
async/awaitを使う場合でも

``` javascript
const [hoge,fuga] = await Promise.all([hoge(),fuga()]);
```
こんな具合でOK。
【赤本】「データベース設計論 - T字形ER」読書メモ【更新途中】

 
## 第1章 理論編

1. モデル(modeling)と3つの世界
   - 「1.物理的世界」「2.心的世界」「3.知性が把握しうる世界(客観的意味の世界)」
   - 「1.経営過程(事実的対象)」「2.モデル(記号)」「3.経営過程をモデル化する解釈者」 

2. 構文論と意味論
    - (1)生成規則(構造を作るための文法を扱う)・・・構文論(syntax)
        - 1.言語Lの語彙 
        - 2.文の生成規則
    - (2)指示規則(モデルと事実的対象の指示関係を扱う)・・・意味論(semantics)
        - 「真」概念
        - 「偽」概念
    - 「null」を指示関係の中で扱うためには3値論理あるいは4値論理を導入しなければならない
    - 注意！```DB設計においてNULL禁止／撲滅を謳っているのではなく、モデリングにおいてNULLは認めない、ということ。```
    
3. 構文論(語彙、文生成規則)
4. 個体の一意性(個体と記号の指示関係)
5. 意味と意義
6. 意味と真理値
7. 「真」概念(F-真とL-真)
8. 「意味の対応説」と「意味の使用説」
9. 経営過程
10. 実体主義と関係主義
11. 関係の論理
12. 関係の対称性・非対称性
13. 集合的と周延的
14. 本章のまとめ
navを右寄せする方法


まずhtmlを書きます。

```html:right.html
<nav>
<ul>
<li><a href="index.html">Home</a></li>
<li><a href="html.html">HTMLリファレンス</a></li>
<li><a href="css.html">CSSリファレンス</a></li>
</ul>
</nav>
```

それからcssを調整します。
CSSの、
ulに「text-align:right」を指定して右寄せにする。
そしてliタグを「display:inline」または「display:inline-block」を指定する。
ただしinline-blockはIE7以下は対応していないので「zoom:1」を設定する必要がある。

```css:right.css
ul{
    text-align:right;
}
 
li{
    display:inline; 
    padding:0 10px;
}
 
// inline-blockの場合
li{
    display:inline-block; 
    padding:0 10px;
    zoom:1 // IE7以下
}
```

[【CSS】横並びにしたリストをを右寄せにするには](https://the-zombis.sakura.ne.jp/wp/blog/2011/12/29/post-1131/)
を参照
[横並びのリストを中央寄せにする5つの方法](https://www.acky.info/tips/css/00011.html)
を参考
GitHub Dependency graphがPHPに対応した

[Dependency graph support is now available for PHP repositories with Composer dependencies](https://github.blog/2019-09-18-dependency-graph-supports-php-repos-with-composer-dependencies/)

Dependency graphが、composerを使用しているPHPリポジトリに対応したよ。

# 設定方法

## publicリポジトリ

```リポジトリ > Settings > Options > Data services```

![範囲を選択_016.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88941/7a92cabb-8f81-a25c-e3b0-09a9bdde21c3.png)

Dependency graphは標準で有効。
依存パッケージに脆弱性がある時に通知を受け取りたい場合は```Security alerts```をチェックする。


## privateリポジトリ

```リポジトリ > Settings > Options > Data services```

![範囲を選択_015.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88941/0cef9ecc-eb0f-1fc4-e911-e2017ca2e5c6.png)

Dependency graphを利用するには、GitHubがリポジトリを読み取るために```Allow GitHub to perform read-only analysis of this repository```をチェックする必要がある。

その上で```Dependency graph```と、必要に応じて```Security alerts```をチェックする。

## 自動的なセキュリティ修正

**※ この機能はベータテスト中です。**

セキュリティアラートを受け取った際に、その脆弱性を解消するプルリクエストを自動で作成してくれるらしい。
先述の```Security alerts```の設定を有効にした上で、

``` リポジトリ > Security > Off: Automated security fixes > Automated security fixes```をクリックして有効にする。

![範囲を選択_018.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88941/4ae9c750-7fb1-fd23-46e8-266fc7892bed.png)

# 実践

脆弱性のある```twig/twig:<2.7```で早速試してみよう！
https://www.cvedetails.com/cve/CVE-2001-1348/

``` sh
$ composer require "twig/twig:<2.7"
$ git push
```

https://github.com/izayoi256/dependency-graph-composer

音沙汰がない:thinking:

Receive alerts when a **new** vulnerability is found in one of your dependencies.
とのことなので、既存の脆弱性は報告してくれないのかもしれない。

# 追記

しばらくしたら、過去に使った別のsandboxリポジトリのGemfile.lockとpackage-lock.jsonの脆弱性を報告してくれた。

> PHPリポジトリに対応したよ

とは一体…。
【メモ】Android ChromeでQiitaを見ると中華フォントになる件について（、そしてlang属性の要不要）

#はじめに
QiitaのページをAndroidのGoogle Chrome（京セラTorque G02・Android 6.0.1 Marshmallow）で表示すると、デバイス内蔵の日本語フォント（当機はモリサワUD新ゴR）ではなく、下の画像のようにいわゆる「中華フォント」で表示されてしまいます。（ほかのサイトでもたまにこの現象に遭遇します。）
#どんな感じ？
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234029/4fac8e7e-923d-6782-0b16-5ae768afe788.jpeg" alt="中華フォントで表示されるQiitaトレンドページ" width="50%">

原因は、AndroidのGoogle Chromeが**フォントの選択にlang属性を用いている**ことにあるようです。Qiitaのページにはlang属性が設定されていません。（執筆当時）
(参照：[Androidデバイス上のウェブブラウザに向けたフォント設定を考える。--freefielder.jp](https://freefielder.jp/blog/2017/07/css-font-for-android.html))

#まとめ
「[Googleはlang属性を無視しているので、lang属性は不要](https://seopack.jp/seoblog/20161111-use-hreflang/)」という認識が広がっているのかも知れませんが、SEOはともかくAndroidで正しく日本語フォントで表示するためには**lang属性を正しく設定する必要が依然としてある**、ともっと周知されてほしいと思って書いています。


(そういえば、自分のサイトも中華フォントになってたな…)
rootユーザーでsftpを利用してVMインスタンスにログインする：GCP(Google Cloud Platform) 

# rootユーザーでsftpを利用してVMインスタンスにログインする方法

主にWindowsからのsftpクライアントを利用したrootログインの方法を解説

rootユーザーでsftpを利用してVMインスタンスにログインするためには大まかに

- rootユーザーによるSSH認証鍵の作成
- VMインスタンスへの公開鍵登録
- rootユーザーによるssh認証ログインの許可
- sftpクライアントのログイン情報の設定（秘密鍵等）

が必要となります。
HomesteadのMySQLへphp artisan migrateすると失敗する

## 概要

HomesteadのMySQLへphp artisan migrateすると失敗する。
※↓が出る。

```
Illuminate\Database\QueryException  : SQLSTATE[HY000] [1045] Access denied for user 'root'@'localhost' (using password: NO) (SQL: select * from information_schema.tables where table_schema = homestead and table_name = migrations)
```

## 対応

.envのDBの欄を、

```
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=homestead
DB_USERNAME=homestead
DB_PASSWORD=secret
```

にする。
Notice multi thread problem when working with Java Servlet

First please read following code of Spring MVC controller

```java
@Controller
@RequestMapping("/count")
public class CountController {

	private long count = 0;

	@GetMapping(value = "/increment", produces = "text/plain")
	@ResponseBody
	public String increment() {
		count++;
		return Long.toString(count);
	}

}
```

The function of this controller is to memorize how many times this controller being accessed, and print out the access count. If 100,000 times this controller being called, **one by one**, the controller should correctly print 100,000.

But there is a serious bug in this controller. If 100 users access this controller simultaneously, and 100 times of group access being done. After that the count is not 100,000.

Java Servlet is under multi thread environment, in other word is the environment which many request can be processed simultaneously. Spring MVC is built on the top of Java Servlet. And on designing Java Servlet class should be aware the problem of multi thread.

Simple to say, the problem is class variable *count* is not thread safe. Change code of controller to following should solve this problem.

```java
@Controller
@RequestMapping("/count")
public class CountController {

	private AtomicLong count = new AtomicLong(0l);

	@GetMapping(value = "/increment", produces = "text/plain")
	@ResponseBody
	public String increment() {
		return Long.toString(count.addAndGet(1l));
	}

}
```
転職黙示録(6) Poetryで作ったFastAPIアプリをVSCode Debuggerでデバッグする

# Visual Studio Code(VSCode)によるPoetryプロジェクトのデバッグ

## モチベーション

　方向性も定まらないのでWebフレームワークが何しているのか理解しようとFastAPIのソースでも読むかと思ったのだがpoetryの仮想環境がVSCodeで認識されなかった.

## poetry shellで仮想環境を有効にする

　基本は公式の[Debugging](https://fastapi.tiangolo.com/tutorial/debugging/)にあるようにuvicornをモジュールとして追加してトップレベルのコードとして実行する.

　問題はpoetryが作る仮想環境をどうやってVSCodeに認識させるかである. VSCodeはpyenvからインストールしたインタプリタについては勝手に認識してくれる. 適当なPythonファイルを開くとステータス・バーの左端に現在のインタプリタが表示される. ここをクリックするとインタプリタの選択肢が表示される. pyenvと最後についているのがpyenvから導入したインタプリタになる.

![vscode_status_bar.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362766/d16ca87c-de09-e29d-217e-ac560e72c80d.png)

　ところがPoetryのプロジェクトだと自動的に仮想環境が作られるがこの環境は勝手には認識されない. poetry addでインストールされたパッケージは全てこの仮想環境下で管理されるのでこの環境が認識されないとデバッガーがModuleNotFoundErrorを表示して停止する.

![ModuleNotFoundError.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362766/d831a0b1-6359-761d-8323-aba891b36dc4.png)

　仮想環境を認識させるためにはVSCodeを開く前にpoetry shellで仮想環境を有効にしておく必要がある. 一度VSCodeを閉じてPoetryプロジェクトに移動してpoetry shellを実行する. その状態で

```bash
poetry new hoge
cd hoge
poetry shell
vscode .
```

　macOSなら~/Library/Caches/poetry/virtualenvs以下に作られた仮想環境が選択できるようになる.

## プロジェクト直下で仮想環境を管理する

　Poetryはデフォルトでは仮想環境を~/Library/Caches/poetry/virtualenvs以下で管理しているようである. プロジェクト名から自動的にproject-py3.xのような仮想環境が構築される. この命名法から推測すると特定の環境を作ってプロジェクト間で共有するというわけでもなさそうである.

　なので単純にプロジェクトごとにファイルを作ってしまっても同じだと思う. poetry config --listを実行するとsettings.virtualenvs.in-projectがfalseになっている. 設定の変更は非常に簡単にできる.

```bash
poetry config settings.virtualenvs.in-project true
```

　これでpoetry addするとプロジェクトの直下に.venvというフォルダが生成され, こちらはVSCodeが自動で認識してくれる.

 ![auto-select-virtual-env.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362766/1ce6771a-11ff-d89a-8b1e-b7c4801dc5c7.png)


　またプロジェクトを消せば仮想環境に関する設定ファイルも削除してくれるので, 仮想環境だけが残るということがない. 

　こちらの方が良さそうですね:hugging:

## launch.jsonの設定

　以上でデバッグしながらステップ・インでFastAPIのソースが眺められると思ったわけですが, デフォルトではサードパーティのコードは見れないらしいです. この場合justMyCodeという項目を追加すれば良い.[^1]

```json:launch-json
{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Python: Current File",
            "type": "python",
            "request": "launch",
            "program": "${file}",
            "console": "integratedTerminal",
            "justMyCode": false
        }
    ]
}
```

## まとめ

　Poetryで作ったプロジェクトをVSCodeのデバッガーでデバッグするならsettings.virtualenvs.in-projectは有効化した方が良さそうです.

## 参考

[^1]: 補完されるから必要ないと思うが[リンク](https://code.visualstudio.com/docs/python/debugging#_justmycode)を貼っておく.
CondaでJAGURS環境を作る

津波計算コード[JAGURS](https://github.com/jagurs-admin/jagurs)のbuildにはいくつかライブラリが必要．
INSTALLというドキュメントに必要なライブラリがいろいろと乗っているが，書かれている手順通りHPからダウンロード→インストールは面倒

condaコマンドですべて取ってこれるので，これを使って環境構築ができた．

```bash
conda install proj4==5.2.0
conda install netcdf4
conda install -c conda-forge netcdf-fortran
conda install -c conda-forge fftw
conda install -c csdms-stack szip
```

試した環境にはhdf5が既に入っていたため，もしかしたら同様に取ってくる必要があるかもしれない．
(makeしてみて怒られたら関係ありそうなライブラリを調べて，anaconda cloudで検索して・・・の繰り返しでできました．)

src/内のMakefile.SC_ICEを適時編集.

```makefile:Makefile.SC_ICEの最初の方

# FC: Specify Fortran90 compiler command.
FC=ifort

# Added for displacement.
# PRJ4_DIR: Specify PROJ.4 install directory.
# CC&CFLAGS: Specify C compiler command and flags.
PROJ4_DIR=/home/ユーザー名/anaconda3
CC=icc
CFLAGS=-g -traceback -I$(PROJ4_DIR)/include

# BASE: Specify basic compiler options.
BASE=-fpp -assume byterecl

# FFTW3_INCLUDE_DIR: Specify FFTW3 include directory.
FFTW3_INCLUDE_DIR=$(MKLROOT)/include/fftw

# FFTW3_LIB: Specify linker options to link FFTW3.
FFTW3_LIB=-mkl=sequential

# OPT: Specify compiler options about optimization level.
OPT=-check all -warn all -O0 -g -traceback -fpe0 -I$(FFTW3_INCLUDE_DIR) # for DEBUG!
#OPT=-O0 -openmp -openmp-report2 -I$(FFTW3_INCLUDE_DIR)
#OPT=-O0 -openmp -openmp-report2 -I$(FFTW3_INCLUDE_DIR)
OPT=-O0 -qopenmp -I$(FFTW3_INCLUDE_DIR)

# NETCDF: Specify the path to NetCDF library.
#NETCDF=/opt/atlocal/netcdf/3.6.3
#NETCDF=/opt/atlocal/netcdf/4.1.3
NETCDF=/home/ユーザー名/anaconda3

# LIBS: Specify linker options.
#LIBS=-i-dynamic -L$(NETCDF)/lib -lnetcdf -L$(PROJ4_DIR)/lib -lproj $(FFTW3_LIB) # for NetCDF3!
#LIBS=-i-dynamic -L$(NETCDF)/lib -lnetcdff -lnetcdf -L/opt/atlocal/supplibs/lib -lhdf5_hl -lhdf5 -lcurl -lsz -L$(PROJ4_DIR)/lib -lproj $(FFTW3_LIB) # for NetCDF4!
LIBS=-shared-intel -L$(NETCDF)/lib -lnetcdff -lnetcdf -L/opt/atlocal/supplibs/lib -lhdf5_hl -lhdf5 -lcurl -lsz -L$(PROJ4_DIR)/lib -lproj $(FFTW3_LIB) # for NetCDF4!

```

主な変更点はPROJ4_DIRやNETCDFにanaconda内の仮想環境を指定する点．
この例は，仮想環境を作らない場合だが，仮想環境jagursを作った場合は```PROJ4_DIR=/home/ユーザー名/envs/jagurs```等とすればたぶんOK
Go言語で修飾名が重複したときのエラー

## エラー箇所

こんなエラーがあります．
"main redeclared in this block
    previous declaration at..."

とりあえず，こんなエラーが出た場合の処置だけ．

``` Error

[Running] go run "c:\Users\shell\PycharmProjects\go_programming\practice1.go"
# command-line-arguments
.\practice1.go:17:1: syntax error: non-declaration statement outside function body
.\practice1.go:21:6: main redeclared in this block
	previous declaration at .\practice1.go:9:6

[Done] exited with code=2 in 0.695 seconds

```

"main redeclared in this block previous declaration at" とあるように，goファイル中で"main"が重複して用いられているようです．．．

## 元のコード
``` main.go
package main

import (
	"fmt"
	"os/user"
	"time"
)

func main() {

	fmt.Println("Lets Go lang.", time.Now())
	fmt.Println(user.Current)
}


```

fmt.Println中のtime, user が重複されているという事でしょうか．．．？　（正直，原因が完全にはわかりません）


## とりあえずの解決策
``` main.go
package main

import (
	"fmt"
	USER "os/user"
	Time "time"
)

func main() {

	fmt.Println("Lets Go lang.", Time.Now())
	fmt.Println(USER.Current)
}
```

インポート中で，別名で定義すれば，とりあえずできました．
詳しいことご存じの方いらっしゃいましたら，教えていただけますと幸いです．
HttpWebRequest/HttpClientで頻繁にタイムアウトする (c#)

# 前提
- .NET System.Net
- GASのWebアプリをPOSTメソッドで10回連続して呼び出しました。

# 現象
- 連続使用中にタイムアウトすることが、数回に一度程の頻度で生じました。

# 対策
- 連続使用する際に、各リクエストの間にインターバルタイムを挟みました。

# 結果
- エラーの発生頻度が低下しました。

# 結論
- サーバーの負荷に配慮しましょう。
- HttpWebRequestではなく、HttpClientを使いましょう。
- インターバルタイムは、ある程度以上に増やしても、エラーが減らなくなります。
- エラーの理由が許せばリトライするようにします。
- 理由が判別できない場合は、少ない回数に制限してリトライします。
SwiftUIの行儀の悪いお作法。

SwiftUIとSwiftの強力な言語仕様を使うと怪しいことができます。

このように`String`と`Int`を`View`に準拠させます。

```swift
extension String: View {
    public var body: some View {
        Text(self)
    }
}

extension Int: View {
    public var body: some View {
        Text("\(self)")
    }
}
```

そしてこう。

```swift
struct ContentView: View {
    var body: some View {
        VStack {

            "Hello World!"
                .foregroundColor(Color.green)

            1010001010

            111212

            29292
                .foregroundColor(Color.red)

            "ojowijojwe"
        }
    }
}

```

![スクリーンショット 2019-09-19 13.11.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80287/f87f29a9-d644-9baf-d003-e8d0e7a2ca51.png)

😇
あまりいい作法とは言えないと思いますが、こんなこともできますよ。って感じで紹介しました。


---

次の記事もオススメです。

- [SwiftUIでChildViewのFrameを取得する](https://qiita.com/1amageek/items/7dbb0d5000ed06923206)
- [SwiftUIのsheetを出し分ける](https://qiita.com/1amageek/items/e90e1cfb0ad497e8b27a)
Raspberry Pi 3 model B+にRaspbian busterをインストールして初回起動まで

# 使用するもの

- Raspberry Pi 3 model B+
- micro SDカード
- USBキーボード
- USBマウス
- HDMI接続のディスプレイ
- Raspberry Pi用の電源（micro USB）
- RaspbianをダウンロードしたりフォーマットしたりするためのPC

# Raspbian busterのインストール

現時点での最新版は2019-07-10リリースのRaspbian Busterのようです。以下をご参照ください。
https://www.raspberrypi.org/downloads/raspbian/
![スクリーンショット 2019-09-19 9.01.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120476/cf1c878b-9dd3-1de9-9c9e-26fede530351.png)

SDカードにイメージを作成してもよいですが、今回はNOOBSを使用します。
https://www.raspberrypi.org/downloads/noobs/
![スクリーンショット 2019-09-19 9.05.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120476/3b44518f-9946-6812-ebd9-1b94bcde9e57.png)

上記のページの「Download ZIP」から最新版のNOOBS v3.2.0のZIPファイルをダウンロードします。
（ファイルサイズの記載がありませんが、2.1GBありました。）

ダウンロードが終わったら解凍しておきましょう。

# 使用するmicro SDカードの準備と書き込み

micro SDカードはSunDiskの32GBを使用。まずはフォーマットします。

フォーマットにはSD AssociationのSDメモリカードフォーマッターを使用します。
https://www.sdcard.org/jp/downloads/formatter/
（Windows版もmac版もあります。）

カードの選択でフォーマットをしたいmicro SDカードを選択して「フォーマット」ボタンを押すだけです。
![スクリーンショット 2019-09-19 9.43.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120476/7a73ce9f-1c3e-e053-45a6-56de479611f5.png)
![スクリーンショット 2019-09-19 9.44.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120476/1c667bd4-3e62-e49d-69bd-08c6d9fff07a.png)

フォーマットが終わったら、次は先程ダウンロードしたNOOBSをmicro SDカードにコピーします。
NOOBS_v3_2_0のフォルダの中身をすべてmicro SDカードの直下に置きます。
（フォルダごとコピーではなく中身をコピーしましょう。）
![スクリーンショット 2019-09-19 10.09.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120476/09c4b41f-7049-52b3-e33f-9bf5e3a71b02.png)

# Raspberry Piの起動

セットアップを済ませたmicro SDカードとUSBマウス、キーボードおよびディスプレイをRaspberry Piに繋げ、電源ケーブルを接続するといきなり起動します（電源ボタンがないため）。
![写真 2019-09-19 10 13 58.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120476/2d0dd4c5-8428-7dd0-71e4-3cb2ae9a94a8.jpeg)


起動するとインストールの画面になりますので、「Raspbian Full」を選択し、言語を「日本語」、キーボードを「jp」にしてインストール開始します。
（インストールは約10分で完了しました。）

勝手に再起動して、初回セットアップ用の画面が立ち上がるので、指示に従って設定していきます。

- Set Country
    - Country: Japan
    - Language: Japanese
    - Timezone: Tokyo
- Change Password
    - デフォルトはユーザー名「pi」に対してパスワードが「raspberry」になっているので、変更を推奨します。
    - 自分の好きなパスワードを入力
- Setup Screen
    - スクリーンに黒い枠があるか聞かれるので、ある場合はチェックしましょう
- Select WiFi
    - WiFiの環境がある場合は設定します
    - 今回は「Skip」を選びました
- Update Software
    - 上記でネットワークに繋げていたらアップデートできます
    - 今回は繋げていないので「Skip」します

以上でセットアップ完了です。
再起動するので、きちんと起動すればOKです。

今後の設定方法は別記事で記載予定です。
Tableau 市区町村ポリゴンのマッピング

# Tableauのサポートするマップデータ
以下サポートマトリクスに掲載の通り、日本の都道府県・市区町村はポリゴンとして地図上にマップすることが可能です
https://www.tableau.com/ja-jp/mapdata
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/446023/c62e07a9-ed6d-b3df-29f3-75662ad6c6a3.png)

#市区町村ポリゴンをマップする方法
- 上記マトリクスをよく見ると、日本の市区町村は地理的役割として「郡」（英語版のCounty）を割り当てる必要があります
- v2019.3以前のバージョンのサンプルスーパーストアでは、住所：市区町村フィールドの地理的役割として「市区町村」が誤って割り当てされていたため、市区町村はポリゴン表示できないと誤解がありましたが、v2018.2よりすべての市区町村ポリゴンがサポートされています(*1)
- v2019.3のサンプルスーパーストアでは、住所：市区町村フィールドの地理的役割が「郡」に修正されました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/446023/c872eeda-cf7f-408d-6140-ee83332138e8.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/446023/b77e67cf-19db-7554-05c5-7b7ba22a1fb6.png)

(*1) https://www.tableau.com/ja-jp/2018-2-features#feature-87791
MacでGitHubリポジトリをcloneする

## はじめに
Qiitaにアウトプットすることで学習したことの定着ができたらいいと思ったところ、投稿が怖くなった。友人に相談したら「出ない神本より出るクソ本」などと言われて、環境構築やらやったことをメモ代わりに書けばいいといわれたので、とにかく何か書いていこうと思う。

## 状況
* Qiitaアカウントは持っていた
    * 興味本位で作っていた
    * 投稿どころかログインもしていなかった
* GitHubアカウントは持っていた。
    * 興味本位で作っていた
    * `test`というリポジトリだけ作って、その後はログインもしていなかった
    * 仕事の別アカウントでは作業したことはあった
* macは持っていた
    * 興味本位で買っていた
    * 数年単位で起動すらしていなかった
    * 一日かけてアップデートを行った
    * 過去に触ったファイル更新日付を見ると2014年などと書いてあって怖くなった
<img width="698" alt="mac_spec.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37831/a53e2583-e373-3999-7bc9-32da45da122a.png">

## 本題
1. [GitHub](https://github.com/toppy-luna/)にログインできることを確認した
2. [Setting](https://github.com/settings/keys)にmacのSSHキーが登録されているかを確認した
    * されていなかった
3. macでSSHキーを生成した

```sh
ls ~/.ssh
mkdir ~/.ssh
cd ~/.ssh
ssh-keygen -t rsa -b 4096 -C "xxxxxxxxxx@gmail.com"
Generating public/private rsa key pair.
（以下略）
```
4. [Setting](https://github.com/settings/keys)にmacのSSHキーをコピペしたものを登録した
    * SSHのキー名は「mac」とした
    * 新しいマシンを登録するときに被るようならその時考えよう

```sh
# コピペコマンドがあったので使ってみた
pbcopy < ~/.ssh/id_rsa.pub
```

5. Gitがインストールされていることを確認した

```
git --version
git version 2.14.3 (Apple Git-98)
```

6. GitHubの`test`リポジトリをcloneした。
    * 公開リポジトリだけどSSHで

```
git clone git@github.com:toppy-luna/test.git
Cloning into 'test'...
The authenticity of host 'github.com (52.192.72.89)' can't be established.
RSA key fingerprint is SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'github.com,52.192.72.89' (RSA) to the list of known hosts.
remote: Enumerating objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 3
Receiving objects: 100% (3/3), done.
```

## 所感
これだけを書くのにもある程度時間を費やした。GitHubやコマンドライン、Markdownはある程度なれていても、macのスペックの調べ方、スクショのとり方、スクショの編集の仕方がわからなかったりもした。アウトプットに慣れていることはスキルとして必要と感じる。
【Flask】アップロードされたファイルを直接S3にPUTする

Flaskにて、アップロードされたファイルをローカル保存せずに扱う方法です。

先駆者さん⇒[Flask にアップロードされたCSVファイルを保存せずに読み込む](https://qiita.com/miyahan/items/7d629d00429c9f032a27)

上記の記事ではCSVファイルとして直接読み込む方法なので、S3転送する方法を書いておきます。
AWS SDKとしてboto3を使用します。

# 動作環境

いずれも 2019/9 時点の(おおよそ)最新。

- Python: 3.7.4
- Flask: 1.1.1
- boto3: 1.9.230

# ファイルアップロードファイルを受け付ける

htmlのフォームタグに`enctype="multipart/form-data"`属性を指定する必要があります。
詳細は本記事の対象外とします。
参考 - [Flaskでmultipart/form-dataのファイルアップロードを実現する方法](https://qiita.com/5zm/items/ac8c9d1d74d012e682b4)

# S3への転送

boto3 の `put_object` メソッドでbytesオブジェクトを指定できるため、受け取ったファイルをbytesオブジェクトに変換して渡すことでS3アップロードが行えます。
参考 - [S3 - Boto3 Doc](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3.html#S3.Client.put_object)
> put_object(**kwargs)
> Request Syntax
> response = client.put_object(
>     ACL='private'|'public-read'|'public-read-write'|'authenticated-read'|'aws-exec-read'|'bucket-owner-read'|'bucket-owner-full-control',
>     Body=b'bytes'|file, ←★これ。
> ~~~

※アップロード先のバケット名やパスは`config.py`で定義しておくのが良いと思います。

```python:s3_upload.py
import io
import boto3
from Flask import jsonify

@app.route('/upload', methods=['POST'])
def workflow_create():
    if request.method == 'POST':
        # アップロードファイルを取得
        uploaded_file = request.files['file']
        # エラーチェック
        if uploaded_file.filename == '':
            return jsonify(message='ファイルを指定してください'), 400
        # S3アップロード処理
        s3_bucket = app.config['S3_BUCKET']
        s3_dir = app.config['S3_DIR']
        s3 = boto3.client('s3', region_name = 'ap-northeast-1')
        response = s3.put_object(
            Body = io.BufferedReader(uploaded_file).read(),
            Bucket = s3_bucket,
            Key = f'{s3_dir}/{uploaded_file.filename}'
        )
        if response['ResponseMetadata']['HTTPStatusCode'] != 200:
            return jsonify(message='S3へのアップロードでエラーが発生しました'), 500
        return redirect(url_for('index'))
```

```python
response = s3.put_object(
    Body = io.BufferedReader(uploaded_file).read()
    ~~~
```

上記の部分でアップロードファイルをキャストしています。
これにより以下のコードで得られるファイルオブジェクトと同じ型で扱えます。

```python
file = open('local/path/file.txt', 'rb')
```
マルチユーザ版の Eclipse/Che で GitHub へのアクセス権限を与えない方法

# 背景

バージョン 6 頃から以降の Eclipse/Che では、Keycloak を用いたマルチユーザ利用ができるようになっています。
そして、個人がローカルネット内で専有するなど限られた場合を除き、マルチユーザ構成にするのが一般的かと思います。

標準的なインストールを行った場合、Keycloak には、パスワードとユーザ名を用いた認証に加え、GitHub を用いた認証がサポートされます。

GitHub を用いた認証は便利なので推奨したいところですが、現時点では、推奨をためらう点が一つだけあります。

GitHub に対して許可する scope が、割と強力であるという点です。

本校執筆時点では公式ドキュメントの整備が追いついていないので Che6 のドキュメントへの参照となりますが、[具体的には `repo,user,write:public_key` が、推奨設定](https://www.eclipse.org/che/docs/che-6/user-management.html#enabling-authentication-with-social-accounts-and-brokering)となっています。
GitHub の scope の意味については[別の方が纏めておられる情報](https://qiita.com/KEINOS/items/216d138b0fdf994b9582)に譲りますが、要するに、非公開リポジトリの閲覧や公開鍵の追加まで Eclipse/Che に対して許可することになります。

筆者が運用している [PizzaFactory/Camino](che-banco.camino.pizzafactory.jp) のように規模の大きくない SaaS のみならず、Red Hat が大規模に運営している [che.openshift.io](che.openshift.io) でも、これらの権限を与えるのは戸惑うでしょうし、職場によっては禁止される可能性もあるかと思います。
プライベートネット内での運用だったとしても、サーバに内部から攻撃される可能性はあるわけですし、強すぎる権限の委譲は避けたいというのが実務的なところでしょう。

[本件に関する issue はすでに立っており](https://github.com/eclipse/che/issues/13916) Eclipse/Che の主要開発者も課題の存在は認識はしています。しかし、本稿執筆時点では優先度は高くない状態です。

## 暫定対応策

もし GitHub に許可する scope が問題である場合は、GitHub 以外の認証を使ってユーザ登録をしましょう。
[PizzaFactory/Camino](che-banco.camino.pizzafactory.jp) では、今のところメールアドレス + パスワード認証のみとなります。

![Screenshot 2019-09-19 at 11.23.18.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5414/56b5c993-e988-3b7c-86f1-7fbd07a4ae86.jpeg)

 [che.openshift.io](che.openshift.io) ではもう少し多くの認証プロバイダが提供されています。

![Screenshot 2019-09-19 at 11.22.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5414/6e76073f-0dc6-aa6b-c525-cbcf7ac4e798.png)

## 考えられるデメリット

当たり前のことですが、GitHub 以外の認証方法でログインした場合、GitHub の API にはアクセスできません。GitHub からの clone 時のリポジトリ一覧は出ませんし、(GitHub への公開鍵登録ができないので) git push もひと工夫が必要になります。

しかし、本稿執筆時点では、__GitHub API の許可を与えないでログインしても、最低限の動作はします__。なにか重篤な副作用/不具合がある場合、それは Eclipse/Che のバグである可能性が高いので、[本家に issue を送って](https://github.com/eclipse/che/issues/new/choose) ください。
【Python】文字列をsplitする際に、対応する区切り文字が含まれていなかった場合

文字列をsplitする際に、区切り文字が含まれていなかった場合の挙動が気になったのでやってみた。

# 結果
`"A:B:C"`のような文字列の場合、`":"`でsplitすると

```python

print("A:B:C".split(":"))

# ["A", "B", "C"]
```

となり、指定した区切り文字で分割してリストに格納してくれる。

これが、`"B"`という文字列の場合は`":"`でsplitするとどうなるか気になったのでやってみた。

```python

print("B".split(":"))

# ["B"]
```

エラーなくリストに格納してくれた。