OmniAICreator/Qiita-1.07M huggingface dataset:
UI.Button をスクリプトで複製したら、コールバックイベントはとにかくリセットしたい。

スクリプトで複製したボタン
このボタンのコールバックを削除したい。リセットしたい。全消ししたい。
ときに、イベントも複製されるんだっけ...されないんだっけ...

#### 環境
* バージョン 2018.3.8f1


### 1. スクリプトで、AddListener() した場合。（非永続的）

onClick イベントは引き継がれない

ので、特に何もしない。

### 2. インスペクタ上から登録した場合。（永続的）

onClick イベントも引き継がれる

ので、オフにする。

```csharp
int persistentEventCount = btn.onClick.GetPersistentEventCount();
for (int i = 0; i < persistentEventCount; i++)
    btn.onClick.SetPersistentListenerState(i, UnityEventCallState.Off);
```


- [Unity - Scripting API: ButtonClickedEvent](https://docs.unity3d.com/2018.3/Documentation/ScriptReference/UI.Button.ButtonClickedEvent.html)
- [UnityEventCallState - Unity スクリプトリファレンス](https://docs.unity3d.com/jp/current/ScriptReference/Events.UnityEventCallState.html)
- [Events.UnityEventBase.GetPersistentEventCount - Unity スクリプトリファレンス](https://docs.unity3d.com/jp/current/ScriptReference/Events.UnityEventBase.GetPersistentEventCount.html)
Circle CIを用いてGoアプリをAWS Elastic Beanstalkへ自動Deployする

# はじめに
本記事では、Elastic Beanstalk DockerベースのGoプラットフォームを利用しているアプリを、Circle CIを用いてデプロイする方法を記載します。

# 初期環境の構築
[AWSのチュートリアル](https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/go_docker_platform.html)を参考に初期構築を行い、ローカルからElastic Beanstalk (以下、EB)へデプロイする。
これを行うことで、アプリ配置ディレクトリ配下に elasticbeanstalk/config.ymlが作成される。
ローカルからデプロイを実施する際はこのままconfig.ymlを活用できるが、circle CIからデプロイするため、yamlファイルの
``profile: eb-cli``を削除

# Circle CIの設定
### 管理コンソール上での設定
対象プロジェクトの**BUILD SETTING -> Enviroment Variables**にて以下の項目を設定
- AWS_ACCESS_KEY_ID
- AWS_SECRET_ACCESS_KEY

### circleci/config.yamlの追加
[「アプリケーションソースバンドルを作成する」](https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/applications-sourcebundle.html)を参考にyamlファイルを作成

```config.yaml
version: 2
jobs:
  build:
    machine: true
    working_directory: ~/project/{{ORG_NAME}}/{{REPO_NAME}}
    steps:
      - checkout

      - run:
          name: Archive
          command: |
            pip install awsebcli --upgrade
            mv ./eb-go-sample/Dockerfile ./eb-go-sample/Dockerfile.local
            zip ./eb-go-sample/go-sample.zip ./eb-go-sample/*

      - deploy:
          name: Deploy to EB
          command: cd ~/project/{{ORG_NAME}}/{{REPO_NAME}}/eb-go-sample/ && eb deploy
```

最終的なディレクトリ構成は以下の通りとなる

```
C:.
├─.circleci
│      config.yml
│
└─eb-go-sample
    │  .gitignore
    │  Dockerfile
    │  server.go
    │
    └─.elasticbeanstalk
            config.yml
```

上記内容でGitHubへPush! 

実行結果
![ci-deploypng.png](https://qiita-image-store.s3.amazonaws.com/0/234000/c4683193-8543-237b-1b09-201f75e11258.png)

# その他参考にしたサイト
https://blog.guildworks.jp/2015/12/15/circleci-beanstalk/
https://qiita.com/hardreggaecafe/items/995ad9a278e80c903e42
Homebrewで入れたcorrettoがアップデートしたら消えたので修正した

brew update, brew upgradleすると、correttoが8から11にアップデートした上で消えた。何回かbrew cask reinstallしても同じ。

stackoverflowで、同様に「correttoインストールしたのに出てこない」って問題が報告されてる。まだ解決してない。

https://stackoverflow.com/questions/55210519/java-home-utility-in-mac-is-unable-to-find-newly-installed-amazon-corretto-11

いろいろ調べたところ、8から11になるにあたってバグがあったらしい。2019-03-14に一旦リリースされてから修正版が2019-03-19に再度リリースされてる。

https://docs.aws.amazon.com/ja_jp/corretto/latest/corretto-11-ug/change-log.html

brew caskのスクリプトはまだ直ってない...。githubのissueを見ながら、とりあえず手動で対応してみる。

https://github.com/corretto/corretto-11/issues/12

現状。

```
$ /usr/libexec/java_home -V

Matching Java Virtual Machines (1):
    1.8.0_92, x86_64:	"Java SE 8"	/Library/Java/JavaVirtualMachines/jdk1.8.0_92.jdk/Contents/Home

/Library/Java/JavaVirtualMachines/jdk1.8.0_92.jdk/Contents/Home

$ java -version

java version "1.8.0_92"
Java(TM) SE Runtime Environment (build 1.8.0_92-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.92-b14, mixed mode)
```

直す。

```
$ sudo ln -sf ../Home/lib/jli/libjli.dylib /Library/Java/JavaVirtualMachines/amazon-corretto-11.jdk/Contents/MacOS/libjli.dylib

$ /usr/libexec/java_home -V

Matching Java Virtual Machines (2):
    11.0.2, x86_64:	"Amazon Corretto 11"	/Library/Java/JavaVirtualMachines/amazon-corretto-11.jdk/Contents/Home
    1.8.0_92, x86_64:	"Java SE 8"	/Library/Java/JavaVirtualMachines/jdk1.8.0_92.jdk/Contents/Home

/Library/Java/JavaVirtualMachines/amazon-corretto-11.jdk/Contents/Home

$ java -version

openjdk version "11.0.2" 2019-01-15 LTS
OpenJDK Runtime Environment Corretto-11.0.2.9.3 (build 11.0.2+9-LTS)
OpenJDK 64-Bit Server VM Corretto-11.0.2.9.3 (build 11.0.2+9-LTS, mixed mode)
```

直った。リンク張るだけで直るんですね。

まあでも、きっといつか誰かが気づいてbrew caskのスクリプトも修正されると思うんですよ。

----

2019-04-11追記

スクリプトが無事に修正された模様。
`brew reinstall corretto`したら、再ダウンロードした上で問題なく使えるようになりました。

https://github.com/Homebrew/homebrew-cask/commits/master/Casks/corretto.rb

3/28にchecksumだけ修正した模様。バージョンは変わらないのでcask upgradeでは更新されません。
Office365ユーザーを強制サインアウトする

諸事情あって、ユーザーを強制サインアウトさせたい。というのでメモ。

※2019年3月時点の記事です。最下部にアップデートをまとめた記事へのリンクを置いています。


#GUIでサインアウトさせる

なんでこんなところにある！？というところにある。

1.365管理センター→ユーザーを検索
2.ユーザーを選択したら、下のほうの「OneDrive」を開く
3.サインアウトから、操作。

たしかに、ユーザーの中にはあるのだが、なぜこんなところに・・・。とはいえ、ユーザーアカウントの上のほうにあったら、誤操作してしまうかもしれないけど。

引用元：[Office365の元従業員を削除する-今すぐサインアウトする](
https://docs.microsoft.com/ja-jp/office365/admin/add-users/remove-former-employee?view=o365-worldwide#overview-of-all-the-steps-to-remove-an-employee-and-secure-data)

#コマンドレットでサインアウトさせる

1.AzureADモジュールのインストール
Powershellを起動して、以下実行。既にモジュールが入っている場合はスキップでOK。

    Install-Module -Name AzureAD

2.AzureADに接続して、ユーザーのオブジェクトIDを調べる

    Connect-azureAD
    Get-AzureADUser -ObjectID <ユーザーのUPN>

3.削除する

    Revoke-AzureADUserAllRefreshToken -ObjectId "<ユーザーのオブジェクトID>"

--
20210822追記　アップデートをまとめました。新しい投稿はこちら。
[Microsoft 365 のユーザーを強制サインアウトさせる方法3つ](https://www.peridot-green.com/2021/08/microsoft-365-3.html)
python,djangoでデータを表示する際にフィルターをかけてみよう

djangoでは以下のように記載するとモデルのデータがテンプレートに渡されます。


```
    context = {
    'キー名': モデル名.objects.all()
    }
    return render(request, 'アプリケーション名/html名.html', context)
```

<br>
でも状況によっては全ては表示したくないということもあるはず。
そんな時はこう書き換えます。

```
    context = {
    'キー名': モデル名.objects.filter(フィルターをかけたい条件)
    }
    return render(request, 'アプリケーション名/html名.html', context)
```

<br>
僕の場合はプライマリーキーと紐づいたモデルのみを出力したい！という時にfilterをかけるパターンしか作ったことはないのですが、その場合こうなります。

```
    context = {
        'キー名':モデル名.objects.filter(pk=pk),
    }
```
<br>
分かりにくいですね。全容を書きましょう。

```

def 関数名(request, pk):
    context = {
        'キー名':モデル名.objects.filter(pk=pk),
    }
    return render(request, 'アプリケーション名/使用したいhtml名.html', context)

```

(request,pk)部分がurl部分に表示されているプライマリーキー。
それを(pk=pk)で代入します。
<br>
ポイントはpkの部分でurls.pyの部分に

```
path('<int:pk>/', 使用する関数, 名前'),
```

と記載するとモデルのプライマリーキーごとにurlに数字があてがわれるので、urlに記載された数値とモデルが一つずつ持っているプライマリーキーが一致したものだけが表示されるようになります。
<br>
ちなみに以下のように書くと空欄の場合にfilterが発動して弾いてくれます。

```
.filter(フィルターをかけたい条件).exclude(任意の名前__exact=""),
```

<br>
<br>
ちなみにdjagoチュートリアルを見ているとこんな記載があります。
https://docs.djangoproject.com/ja/2.1/intro/tutorial04/
html部分なんですが、

```
{% for choice in question.choice_set.all %}
    <input type="radio" name="choice" id="choice{{ forloop.counter }}" value="{{ choice.id }}">
    <label for="choice{{ forloop.counter }}">{{ choice.choice_text }}</label><br>
{% endfor %}

```
以前フィルター関係で苦労した部分だったんですが、これはquestionに紐づいた、choiceをall表示するって意味です。(ルー語)
<br>

questionに紐づいたchoiceとはmodels.pyの

```
from django.db import models


class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')


class Choice(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    choice_text = models.CharField(max_length=200)
    votes = models.IntegerField(default=0)
```

この部分のことで

```
question = models.ForeignKey(Question, on_delete=models.CASCADE)
```
これでclass ChoiceはQuestionに紐づくことができます。

<br>
こうすると紐づかれるクラス名(小文字).紐づくクラス名(小文字)_set.all


```
question.choice_set.all
```

という書き方でQuestionに紐づいたChoiceがすべて出力されるようになるのです。
もちろん<int:pk>部分が無ければ普通に全部表示されるだけなので特に意味はないですがこのプライマリーキーのQuesionに紐づくChoiceだけを表示する。
というときにはこう書けるのです。
package.jsonにおけるdependenciesとdevDependenciesの違い(超シンプルに)

フロントエンドフレームワークを触っていると目にする`package.json`。
(まぁ、他でも目にしますが。。w)

(例)

```json
"dependencies": {
  "@nuxtjs/axios": "^5.3.1",
},
"devDependencies": {
  "eslint": "^5.14.1",
  "jest": "^23.6.0",
},
```

この中に、`dependencies`と`devDependencies`の似たようなものがあります。この２つの違いは何なんでしょうか？ シンプルに↓↓


## dependencies
* その`node module`が実行において依存するパッケージ
* 開発者以外の人が`npm install`すると、こちらのパッケージのみインストールされる
(開発者が`npm install`コマンドをすると、両方インストールされる)
* `npm install —production`のように、`-production`をつけると、`dependenies`のみインストール可能

## devDependencies
* `node module`の開発にのみ利用するパッケージ
* テストやタスクランナー系
* 開発時のみに必要なライブラリ
* 実行時には役に立たず、含める必要がないもの


## まとめ
そう、`devDependencies`の`dev`の部分は`development`の`dev`何です。と考えるとイメージしやすいですね！ 開発時に必要なものは`devDependencies`に、本番環境でも必要なものは`dependencies`にと覚えておけばいいでしょう。より詳しく知りたい方は、参考であげている記事とかいいですね！


## 参考
* [ちゃんと使い分けてる? dependenciesいろいろ。](https://qiita.com/cognitom/items/acc3ffcbca4c56cf2b95)
* [【いまさらですが】package.jsonのdependenciesとdevDependencies](https://qiita.com/chihiro/items/ca1529f9b3d016af53ec)
AWS IAMポリシーのJSONに入ってるVersionって何なの？

## 結論

`Version`はユーザーがポリシーを変更した日時ではなく、**IAMポリシーの構文ルールのバージョンを示すもの**である。

> この Version JSON ポリシー要素はポリシーバージョンとは異なります。Version ポリシーエレメントは、ポリシー内で使用され、ポリシー言語のバージョンを定義します。

`Version`というキー名が話をややこしくしていますが、要はJavaが8なのか11なのか、PHPが5系なのか7系なのかを示すのと同じものだということですね。

## Versionはいくつあるの？

現時点では`2012-10-17`と`2008-10-17`の2種類のみが定義されています。

> 2012-10-17これはポリシー言語の現行バージョンであり、常に Version 要素を含め、2012-10-17 に設定する必要があります。このようにしない場合、このバージョンで導入されたポリシー変数などの機能は使用できません。
> 2008-10-17これはポリシー言語の旧バージョンです。既存のポリシーで古めのものでは、このバージョンが表示される場合があります。新規ポリシーを作成するときや既存ポリシーを更新するときは、この旧バージョンを使用しないでください。

## 参考

[IAM JSON ポリシーの要素:Version - AWS](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/reference_policies_elements_version.html)
type-graphqlなプロジェクトをproductionモードでwebpackする

GraphQLサーバーをCode Firstで書いてみたくて、type-graphqlを使って見ました。
developmentモードでwebpackする分には何にも苦労なく動作するのですが、Herokuにデプロイするとさっぱり動きません。
あーでもない、こーでもないと、調べて見たところ、productionモードでwebpackする事が要因だという事に行き着きました。
productionモードでwebpackすると、コードの圧縮と難読化が行われます。
Code Firstでtype-graphqlすると言うことは、コードの圧縮と難読化されたコードから、スキーマが正しく作成されるのかが問題になります。
要するに、難読化されたコードから、スキーマを作成すると、めちゃくちゃなものができる事になります。
この結論にたどり着くまでに、かなり苦戦しました。
苦戦した代わりに、Node.js、Express、NestJS、webpack、Chromeでのデバックなど、いろいろな事を習得する事ができましたが。


さて、type-graphqlを、productionモードでwebpackするときに、注意する点です。


productionモードでwebpackすると、terser-webpack-pluginが有効になります。
これは、コードの圧縮と難読化をするモジュールです。
難読化すると、クラス名も難読化されるため、これが要因でtype-graphqlで作成されるスキーマ(ex schema.gql)が、developmentモードで作成されるものを全く別のものになります。

そこで、クラス名は難読化しないように、webpack.config.jsを構成する必要があります。

# terser-webpack-pluginのインストール
terser-webpack-pluginをイントールします。

> npm install terser-webpack-plugin --save-dev

# webpack.config.jsを構成
webpack.config.jsで、クラス名を変更しないように構成します。
以下のようにするとOKです。

```javascript:webpack.config.js
const merge = require('webpack-merge');
const common = require('./webpack.common');
const TerserPlugin = require('terser-webpack-plugin');

module.exports = merge(common, {
    mode: 'production',
    optimization: {
        minimizer: [
            new TerserPlugin({
                terserOptions: {
                    keep_classnames: true, // ← ここ！！
                    drop_console: true
                }
            })
        ]
    }
})
```

これで、クラス名は難読化されなくなるため、コードからGraphQLのスキーマを作成しても、想定通りのものができます。
NULLについての一つの解釈

###Abstract
先日PHPのサーバーサイドプログラミングの勉強を始め、
テキストフォーム送信のHTTPリクエストの条件分岐処理について勉強しているとき、
nullについての理解に迫られた。

NULLとは、あらゆるプログラム言語において、値の状態を表す特殊な値である。

数字の零を意味するドイツ語のnullからきていると思われる。

NULLとかくと、それは「NULL型の値『NULL』」として解釈される。

NULLとは一体なんなのか。

初心者の私が畏れ多いが、nullというものについて、以下に私なりの解釈(仮説)を述べたいと思う。
妥当性を欠いている箇所、考え方全体の違和感、等あれば、ご指摘頂ければ幸いである。


###nullとは（私の解釈）

あるとき、世のプログラマーたちは、
「あらゆる種類の値に、2種類の『状態』をもたせたい」と考えた。

そこで、この二つの状態を区別するために、『null型』というデータ型が作られた。

これにより、あらゆる種類の値は、
『null型の値』と『null型でない値』
という具合に、値を二つの状態に分けることができるようになった。

プログラマーたちは
『null型の値』と『null型でない値』に対して、以下のようにコマンドを割り当てることにした：

『null型の値』：中身がnullの変数(または定数)、中身が定義されていない変数（または定数）、中身が""の変数(または定数)
『null型でない値』：上以外の全ての値

これにより、例えば以下のように定義された変数は全てnull型：

var hogehoge = null;
var foo;
var hensuu = "";

であり、
以下のように定義されたされた変数(または定数)はnull型でない諸データ型：

var zero = 0;//整数型数値「ゼロ」
var hogehoge = 114514;//整数型数値「114514」
var foo ="こんにちは";//文字列「こんにちは」
var boolean = true;//ブール値「true」
var PI = 3.14;//実数型数値「3.14」

という具合に分けられるようになった。

この構造を使って、彼らは、
前者のように、ある値があって、それがnull型であることを、「その値は『null』である」
後者のように、ある値があって、それがnull型でないことを、「その値は『普通の値』である」
という表現を与えることにした。

さらに、『変数』という文脈に限り、これらにかみ砕いた解釈を与えると、
「nullとは、変数に値が定義されていない状態のこと」
「普通の状態とは、変数に何かしらの値が定義されている状態のこと」
ということができる。

###以上
閲覧者諸氏、先輩方によりご指摘ご意見を頂ければ幸いです。
EDPC-U「Grouping」

- [Grouping](https://atcoder.jp/contests/dp/tasks/dp_u)

## 解法

- `dp[i]: この集合の組み合わせの数`とする。
- 遷移は`dp[これから使用する | 使用済み] += dp[使用済み]`って感じ。
- あと、グループ分けした時の合計スコアを$O(1)$で参照できるようにする。
- 計算量は$O(3^N)$



## [コード](https://atcoder.jp/contests/dp/submissions/4660754)

- スコアを求める部分を$O(N^2)$部分を毎回求めてると$O(3^NN^2)$になる。これは$11019960576$ステップくらい回すので間に合わない。
- なのでスコア部分をあらかじめ計算しておき$O(1)$で参照できるようにすることで計算量を$O(3^N)$にできた。計算ステップは$43046721$回くらいなので余裕で間に合う

```cpp
#include <bits/stdc++.h>
using namespace std;

#define int long long

template<class T>bool chmax(T &a, const T &b) { if (a<b) { a = b; return 1; } return 0; }

int N;
int a[20][20];
int dp[1<<16]; // dp[i]: iの立っているビットを使用したときの組み合わせの数
int USE[1<<16]; // USE[i]: iで立ってるビットを同じグループとしたときのスコア

signed main() {
  cin >> N;
  for (int i = 0; i < N; i++) {
    for (int j = 0; j < N; j++) {
      scanf("%lld", &a[i][j]);
    }
  }

  // 使用したビットに対応するスコアをあらかじめ計算しておく
  for (int use = 0; use < (1 << N); use++) {
    int score = 0;
    for (int i = 0; i < N; i++) {
      for (int j = i; j < N; j++) {
        if (((use >> i)&1) and ((use >> j)&1)) {
          score += a[i][j];
        }
      }
    }
    USE[use] = score;
  }

  // DP
  for (int used = 0; used < (1 << N); used++) { // 使用済みのビット
    int unused = used ^ ((1 << N) - 1); // 未使用のビット
    for (int use = unused; use > 0; use=(use-1)&unused) { // unusedの部分集合を列挙
      if (!(use > used)) continue;
      chmax(dp[use | used], dp[used] + USE[use]);
    }
  }

  cout << dp[(1<<N)-1] << endl;

  return 0;
}
```





## メモ

- [twXIIve](https://qiita.com/nomikura/items/bdc32288c5d4784b44ba)の類題としててんぷらさんに投げてもらった問題。大体あれと同じ感じで解ける。使用したビットに対応するスコアを$O(1)$ にする分Groupingの方が少し難しい。
大阪Web開発 Rubyエンジニア 35歳 転職活動はじまる 2019-03-22



# たぶん本気を出せば、ちゃんとエネルギーを割けば、エンジニアとして何らかの仕事は、見つかるという自信はある。

たとえば1年がかりで、100社と面接できたとして、その中の一社として、鐘が響かぬということはないだろう。問題は、そのエネルギーを割くだけの、エネルギーがあると思うだけの、エネルギーがあるかというところ。この世の中の多く、いやほとんどは、やはり、エネルギー問題なのだ。エネルギーがあれば、就職活動だって出来る。エネルギーがあれば、エンジニアリングだって出来る。 

# エンジニアの就職面接で、あなたが自分の夢を語れないとしても。

世の中では不思議なことに、就職をする時は、ビジョンを持たなければいけないということに、なっているらしい。つまり、夢を持った人材を、企業は求めている。技術や人間性と一緒に、夢まで持たなければいけないとは、なかなかハードルの高い話であると思う。それは今までの社会の、何らの名残なのか。それともトータルで考えた時に、夢を持った人の方が、活躍の可能性が高いのか。そういったビッグデータが社会に蓄積されているのかどうかは、知らない。個人的には、夢など持たなくても、淡々と人材として働けるだけではだめですかと、言いたくなる。だがこれは、通過儀礼のようなものだと思っておこう。しかし僕がエンジニアとして、何か将来のビジョンを聞かれた時は、どうやって答えるのだろうか。正直、面接官のウケが最大化するような、立派なビジョンも、目標も持ち合わせていない。僕が心より素直に、目標を答えるとすれば、禅の実践である、人生に目標を持たないことが目標である、などと答えれば、たちまち優秀な彼は顔色を変えて、苦笑いをし、机の下でこっそりと不採用通知のハンコを押して、就職希望者をエレベーター前まで丁寧に送り届けて、その日の仕事を済ませるであろう。もし僕がもうひとつ、社会との円周号の重なりの中で、答えられることがあるとすれば、他の人と仲良く仕事をすること、問題解決すること、ぐらいであろうか。他の人と仲良く働く。すばらしい。これであれば、何もみずからの内心に対して、心理的反発は起こらない。問題解決も好きだ。途方もなく感じられる問題を、ひとつずつ解きほぐし、快適な環境を作ったり、何らかの答えを見出せた時には、喜びを感じる。プラスを作り出した喜びではなくて、マイナスをマイナスして、ゼロにした喜びだ。僕自身は本当に、人間がモチベーションを感じる7つの種類であるところの内で、快適欲求というものが極めて高い。そのための問題解決のモチベーションもある。これは決してエンジニアとして、悪い特質ではないと思うのだけれど。そう、もう一つの答えは、他の人と仲良く仕事をすること、協力しながら働くこと。僕自身、こう言っておいてなんだが、かなりの内向的な性格ではなると思う。だけれど基本的に平和主義で、他の人の話に耳を傾け、キャッチして、噛み砕こう、寄り添おうという気持ちだけは持っている。とそんなこんなで、僕が僕という人材について語り始めると、決して技術的な話には到達しないような気がするのである。技術的なことに関しては、まあ、覚えれば、覚えられるものだという考え方をしている。特筆するのであれば、Rubyで暮らす設計などをしているときは幸福だ。pythonで簡単にAPIなどを叩くことも悪くない。しかし僕自身あまり自信を持たぬタイプで、周りへのPRも下手くそで、まったく技術力に対する自負はないのだけれど、それなりに技術力の高いとされる会社で、他の人から、どこでもやっていけるだけの力はあるとお墨付きはもらっているという状態だ。まあ、それが、リップサービスでなければ良いのだけれど。さあ、何はなくとも、自己定義を進めるなり。このようにつらつらと、就職についてでさえ、オンラインで書き綴って、それが面接官の目に触れ、思わぬマイナス点を打たないかとも危惧するが、やはり、いま自己定義をしておくメリットのほうが大きい。そしてこの閉ざされた就職世界に、一閃の光をなげかけたい。まあ、誰かひとりの眼にでもとまり、ほんのちょっとした問題提議でも投げかけ、エンジニアとして幸福な人生のために、ほんのわずかでも寄与できたらとは、思うところである。

# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
自分がコントリビュートしているリポジトリで、参照しているライブラリが古い場合の対処

C# で貢献しているプロジェクトの新しいバージョンを引っ張ってくると、どうやらバージョンが古い。Issue とか上げてみたんだけど、キャッシュをクリアしてと言われた。

あぁ、、、またやってしまった。こんなもんに時間をかけてアホやなと思うので、記録しておく。余裕で数時間ふっとんだ。

https://github.com/Azure/azure-functions-durable-extension/issues/667

# nuget のクリアの方法

さて、nuget のキャッシュのクリアだが、次のリファレンスがある。

* [Managing the global packages, cache, and temp folders](https://docs.microsoft.com/en-us/nuget/consume-packages/managing-the-global-packages-and-cache-folders)

## global-packages 

`%userprofile%\.nuget\packages`

おなじみの場所で、全てのNugetのパッケージがダウンロードされる場所。ディレクトリができているので消せばよい。今回はこれでもダメだった。

## http-cache

`%localappdata%\NuGet\v3-cache` 
`NUGET_HTTP_CACHE_PATH` 環境変数が設定されている場合はそちらを使う。

Visual Studio Package Manager と、`dotnet` ツールが使う予定のところ。ここのキャッシュは３０分らしいが今回はここも`global-packages` に加えてこちらもクリアしないと有効にならなかった。

## temp

`%temp%\NugetScratch` 

NuGet がオペレーションの一時ファイルを保存するところ

## plugins-cache 

`%localappdata%\NuGet\plugins-cache`
`NUGET_PLUGINS_CACHE_PATH` 環境変数が設定されている場合はそちら

NuGetが、オペレーション要求の結果を保存する場所

# 確認のプロセス

Method Not Found など、古いバージョンに起因する問題が起きたら、キャッシュを疑ったほうがよさそう。自分はいつもドタバタしてて、ひとよりアホみたいに時間使うことがおおいんだけど、自分にメソッドを適用したらましになるかな？

* VS のクリアと再ビルド
* 上記の nuget のキャッシュのクリア
* テストの実施

これを最低限やってみるようにしよう。
登録しているブックマークレット メモ

あんまりないですが、環境移行用にメモ

```javascript:見ているウェブページのマークダウン形式のリンクを作る
javascript:(function(){const%20e=document.createElement('input');e.value=`[${document.title}](${location.href})`;document.querySelector('body').append(e);e.select();document.execCommand('copy');e.remove();})();
```

```javascript:選択しているテキストを翻訳する(英→日)
javascript:(function(){const%20t=(window.getSelection%20?%20window.getSelection():%20document.getSelection%20?%20document.getSelection():%20document.selection.createRange().text);if(t)open('http://translate.google.com/translate_t?hl=ja&sl=en&tl=ja&q='+encodeURIComponent(t)+'','_blank');})()
```

```javascript:選択しているテキストを翻訳する(日→英)
javascript:(function(){const%20t=(window.getSelection%20?%20window.getSelection():%20document.getSelection%20?%20document.getSelection():%20document.selection.createRange().text);if(t)open('http://translate.google.com/translate_t?hl=ja&sl=ja&tl=en&q='+encodeURIComponent(t)+'','_blank');})()
```

```javascript:見ているウェブページをツイートする
javascript:(function(){window.open('https://twitter.com/share?url='+encodeURIComponent(window.location.href)+'&text='+encodeURIComponent(document.title),null,'width=500,height=400,toolbar=no,menubar=no,scrollbars=no')})()
```

```javascript:PictureInPictureで動画を開く(Safari限定)
javascript:(function(){document.querySelector('video').webkitSetPresentationMode('picture-in-picture')})()
```
[Unity]AssetDatabaseにあるアセットの型名を全て取得する


#実装

```c#:AssetFinder.cs

//Asset型の型情報をすべて取得
public Type[] GetAllAssetClassTypeInfo()
{
    return AssetDatabase.FindAssets("t:object").Select(guid => new
    {
        var assetPath = AssetDatabase.GUIDToAssetPath(guid);
        return AssetDatabase.GetMainAssetTypeAtPath(assetPath);
    }).Distinct();
}
```

#解説

UnityのアセットはUnityEngine.Object型を継承しているはずなので、FindAssetsで型検索でobjectを指定してguidを取得。
取得したguidを元にアセットクラスのType型に変換できるGetMainAssetTypeAtPathで型情報を取得。
このままだと重複するのでDistinctで型情報が重複しないようにする。
Javascript 画像を動的に切り替える

画像を動的に切り替えたい時がある。
例えばこちらのサイトのように。
https://www.street-academy.com/myclass/14616?sessiondetailid=506634&trigger=browse-history_top
つまり、サムネイル画像？をクリックするとその拡大画像が表示されるというもの

参考にした記事はこちらである。
https://www.sejuku.net/blog/63834

上記の記事を参考にして
作成したテンプレートはこちら。
基本は一つ目のサイトと同じ機能


```pic_change.html
<html>
    <body>
        <img id="mypic" src="pics/1.jpg" width="400" height="300">

        <img class = "pic" onclick="slideshow('0')" src="pics/1.jpg" width="10%">
        <img class = "pic" onclick="slideshow('1')" src="pics/2.jpg" width="10%">
        <img class = "pic" onclick="slideshow('2')" src="pics/3.jpg" width="10%">

            <script>
            var pics_src = new Array("pics/1.jpg","pics/2.jpg","pics/3.jpg");
 
            function slideshow(num){
                document.getElementById("mypic").src=pics_src[num];
            }
            </script>
    </body>
</html>

<style>
    body .pic:hover{
	    opacity: 0.6; 
        filter: brightness(110%);/*リンクにマウスが乗ったら背景色を変更する*/
        background-color:brown;
    }
</style>


```
勉強する気力がびっくりするくらい湧かないしWordPressでアフィブログ作ろうと思った話

前回の記事（[これ](https://qiita.com/nkmrdesu/items/ca895941c97893eeca25)）書いてから満足して一向に学習意欲が湧かないのでWordPressでお小遣い稼ごうと思った話です。
こんな感じでWordPressのサイト作るんや～程度の備忘録的なやつです。この記事だけで網羅できてないんでその辺は適当にググりながらやるといいと思います。

一応できたやつ→[なかむらのブログです](https://nkmrblogdesu.com/)


#この記事について
そもそも勉強するのもお金稼げるようになりたいからだしアフィブログ作るのもええんでないかって安直な考えで手を出しました。

結論だけ先に書いておくとなんとなくWordPressってやつが簡単らしい程度の知識でブログ作ったらお金も時間も思ったよりかかってビビったのでアフィやる人は普通にブログサービスを使えばいいと思います。

まあWordPressってこんなものなのか～って勉強にはなったと思います。まったく触ったことないです＞＜ってよりは多少経験があるほうがまあいいんじゃないでしょうか。
認識が間違ってなければMVCモデル"風"のサイトが簡単にできるパッケージがWordPress。。。なんですよね？どうも完全にMVCモデルっては言えないみたいなことがインターネットに書いてありました。難しい話はよくわかりません。

まだアフィ貼ってないですけどアフィとか嫌いな人とかはスルーしてください。


#やったこと
###レンタルサーバー借りるの巻
おすすめ　安い　レンタルサーバーみたいな感じでググったら出てきたのでスターサーバー（[りんく](https://www.star.ne.jp/)）にしました。
Netowlって会社のアカウント作って決済情報登録して利用申し込みしたら一瞬で借りられました。
確か月額250円のプランにしたんですけど最初は無料プランでもいい気がします。スターサーバーの無料プランがいいのかは知りません。ググってください。

###ドメイン取得するの巻
いきなり順番ミスってたみたいでドメインを先に取得したほうがいいみたいです。
ドメイン申請してから実際に取得できるまで時間がかかるみたいでよくわかんない画面が出てきて心が折れかけます。ぼーっと待ってても解決しそうになかったのでググったらおとなしく待てって書いてあったのでその日は寝ました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/349816/06364395-3f99-b689-4d5e-f48ac0dd7b24.png)

たぶんドメインは前もって準備しておくべきだと思います。結構お金もかかるし。。。（1年で1000円ちょっとだったような気がします。）
聞いたことはあったのでお名前ドットコム（[りんく](https://www.onamae.com/)）でドメイン取得しました。
whois情報公開代行でググっておくと幸せになれると思います。難しいことはよくわかりません。

###ドメインを設定するの巻
ドメインを取得しただけではなんの意味もないらしく、そのドメインでどのサーバーを見に行くのか的な設定が必要みたいです。
最初にお名前ドットコム側で設定してそのあとスターサーバー側で設定したらよくわからないうちにできました。XXサーバー　ドメイン設定　とかでググると先人の知恵がたくさん出てくると思います。


###WordPress入れるの巻
ここまでやってやっとWordPressが出てきます。メールアドレスとパスワード入力したら勝手にブログできておしまい！だと思っててごめんなさい。

最初スターサーバーから適当なアドレスもらえたんでそこにWordPress入れて満足してたんですけどどうもドメインくっつけたらそっちに入れなきゃダメみたいですね。
あとググるとホームディレクトリ/wpにインストールやで～って書いてるサイトもあるんですけど罠です。それやると後々めんどいと思います。やめましょう。（オンプレの社内サーバとかに入れるならそれでもいいと思います）
<br><br>
眠いのでWordPressをインストールしてからの話はこの土日のどこかで書こうと思います。
では。
[Unity] エラーが出たらEditorWindowで作った画面を開くようにする



```c#:ErrorReceivedWindow.cs
public class ErrorReceivedWindow : EditorWindow
{
   //1回だけ呼び出したいので画面を開いたときに呼び出す
   [InitializeOnLoadMethod]
   private static void _onInit()
   {
        //ログが更新されたら呼び出すようにEイベントを登録
        Application.logMessageReceived += ApplicationOnLogMessageReceived;
   }

   private static void ApplicationOnLogMessageReceived(string condition, string stacktrace, LogType type)
   {
       //エラーが出たら画面を開く
       if (type == LogType.Exception)
       {
           GetWindow<ErrorReceivedWindow>();
       }
   }
}
Raspberry Pi3でキオスクを構築するときの手順とハマったところ

#はじめに
余ったラズパイ3でキオスク端末を作ってみたくなったので，その時のハマったところをまとめる．

#環境

- Raspberry Pi3 model B (基本的なセットアップ済み)
- Micro SD カード 16GB
- Raspbian 9.6

#作業
Raspbianの導入について解説は省略．

##いつもの呪文
最初に既存パッケージをアップデートしておく．

```
sudo apt-get update
sudo apt-get upgrade
```

##自動GUIログイン
起動後パスワード無しでデスクトップ画面になるのであれば**この設定は不要**だと思う．

###最初のトラブル
piユーザを消して適当なユーザを作っていた影響で，起動するたびパスワードの入力を求められてしまう．

###解決法
[こちら](http://www.jbmurphy.com/2015/11/12/raspberry-pi-raspbian-jessie-based-on-debian-jessie-disable-autologin-gui-console/)を参考にGUIへの自動ログイン設定をした．

1. 以下をターミナルに張り付けて実行．

    ```
    systemctl set-default graphical.target
    ln -fs /etc/systemd/system/autologin@.service /etc/systemd/system/getty.target.wants/getty@tty1.service
    ```

2. `/etc/lightdm/lightdm.conf`の「autologin-user=ユーザ名」を任意のユーザに書き換える．

    ```
    sudo vi /etc/lightdm/lightdm.conf
    ```

    ```bash:/etc/lightdm/lightdm.conf
    autologin-user=ログインしたいユーザ名
    #autologin-user-timeout=0
    #autologin-in-background=false
    #autologin-session=
    #exit-on-failure=false
    ```

これでGUIへの自動ログインはできた．

##ブラウザの全画面表示と自動起動

ブラウザを全画面表示させるにあたってマウスのカーソルが邪魔になる．マウスに一定時間動きがないとカーソルを非表示にするツール`unclutter`をインストールしておく．

```
sudo apt-get install unclutter
```


###またハマる
次に自動実行の設定ファイル`~/.config/lxsession/LXDE-pi/autostart`を編集する．

はずなのだが，`~/.config/lxsession`が存在しない．
ここで勝手にディレクトリを作って良いのか不安になり色々調べて迷走した．

###解決法＆手順
無視して`~/.config/lxsession/LXDE-pi/autostart`を作る．

1. 必要なディレクトリを作成．

    ```
    mkdir ~/.config/lxsession
    mkdir ~/.config/lxsession/LXDE-pi
    ```

2. 自動起動の設定ファイルを作成．

    ```
    sudo vi ~/.config/lxsession/LXDE-pi/autostart
    ```

    ```bash:~/.config/lxsession/LXDE-pi/autostart
    @xset s off
    @xset -dpms
    @xset s noblank
    @unclutter
    @chromium-browser --kiosk --app=https://google.com
    ```

###なんでハマった？
**ユーザ別**の設定ファイルではなく，**グローバル**の設定ファイルを編集したから．

[このサイト](https://raspberrypi.stackexchange.com/questions/42633/raspberry-pi-autostart-of-lxde-does-not-work)によると，

| ファイル | 有効範囲 | 優先順位 |
|:-:|:-:|:-:|
| ~/.config/lxsession/LXDE-pi/autostart  | ユーザ別 | 1 |
| /etc/xdg/lxsession/LXDE-pi/autostart | 全ユーザ | 2 |
　こんな感じでユーザ別の設定ファイルが無い場合のみグローバルの設定が適用されるようだ．そして，Jessieはインストール時に自動でユーザの設定ファイルを作るらしい．つまり**グローバルの設定ファイルは機能しない**．

#最後に
キオスク端末を作ったのに表示するものがないし，何か作ってみたい．

#参考
[Raspberry Pi3でキオスク端末(自動ログイン＋ブラウザ起動)を作る。](https://qiita.com/yyano/items/c08705994363b9526d07)
[Raspberry Pi, Raspbian Jessie (based on Debian Jessie) disable AutoLogin GUI & Console](http://www.jbmurphy.com/2015/11/12/raspberry-pi-raspbian-jessie-based-on-debian-jessie-disable-autologin-gui-console/)
[Raspberry pi autostart of LXDE does not work](https://raspberrypi.stackexchange.com/questions/42633/raspberry-pi-autostart-of-lxde-does-not-work)
はじめてのC++【24日目】

#はじめに
始める時間が遅くなってしまったので、blackjackは皆様のコメントをもとに改良しただけです。
明日は午後から暇なので、関数とかクラスとかしていく。

##BlackJack【2日目】
皆様アドバイスありがとうございます。
動的配列の挿入方法の`emplace_back`/`push_back`(push_backは状況によって使うが基本emplace_backとのこと)を使うとstd::accumlateを使うことができました。昨日使えなかった理由は、普通の代入方法だと、配列の皿が伸びなくてバッファオーバーランをしていたからです。
ハートやクローバの格納方法ですけど、` constexpr const char* heart = "♥";`でできると教えてくださいました。ネットで調べてみると`std::string = "♥"`でもできるみたいです。

g++のコンパイルコマンドは、

```
$ g++ -o　オブジェクト名 -std=c++11 -Wall -Wextra -pedantic-errors ファイル名.cpp 
```
これで、警告もエラーもでてきて安心できる！



```blackjack.cpp
#include <iostream>
#include <array>
#include <vector>
#include <numeric>
#include <random>
int main(){
  constexpr const char* heart = "♥";
  constexpr const char* spade = "♠";
  constexpr const char* clover = "♣";
  constexpr const char* dia = "◆";
  char choose = 'd';//dで初期化
  int count = 0;//動的配列の要素数
  int card = 0;//自分で引いた数を格納する場所
  int sum = 0;//引いたカードの合計値を格納する
  std::vector<int> dealer = {0};//ディーラーの持ち札を入れる
  std::vector<int> myself = {0};//自分の持ち札を入れる
  std::uniform_int_distribution<int> dist(1,10);//i~10のランダム生成
  std::mt19937 mt{ std::random_device{}() };//ランダム作るときに必要

  std::cout << "BrackJackを始めます" << std::endl;

  while(1) {


  card = dist(mt);//引いたカードの数を決定
  myself.emplace_back(card);//動的配列の前から順番に引いたカードの値を代入
  sum = std::accumulate(myself.begin(), myself.end(), 0);//引いたカードの数字を合計値に足す
  std::cout << "添字チェック"<<myself.at(count) << std::endl;//要素数と中身があっているか確認
  std::cout << "カードを一枚引きました。" << std::endl;
  //switch文でmarkを決めてもいいかも.
  std::cout << "数字は" << card<< "です" <<std::endl
            << "合計値は" << sum <<"です" << std::endl;
  if(sum > 21){//合計値が21より大きくなると負け
    std::cout << "21より大きくなりました。あなたの負けです。" << std::endl;
    break;
  }
  else if(sum == 21)break;//合計値が21丁度になると強制的に終了
  std::cout << "引き続きカードを引きますか？(y/n)" << std::endl;//カードを引くかどうかの意思決定
  std::cin >> choose;//y/nをchoooseに代入させる
  if(choose == 'n') break;//もしnならカードを引くことを終了
  count++;//配列の要素数を1つ上げる。
  }

}
```
<img width="488" alt="スクリーンショット 2019-03-23 1.00.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/298612/e4171d65-bb73-07c0-8e2c-de8a2bbdd758.png">
添字チェックも正常に動いていて安全なコードだとわかります。

ポインタについて、いまだよくわかっていないことがわかったので、ポインタの専門書も読みたいと思いました。

明日は、まずは関数を作ってそこからクラスを作ろうと思います。

##ロベールのC++
###継承とコンストラクタ
派生クラスのコンストラクタを呼ぶと、それより先に基底クラスのコンストラクタが自動的に呼ばれる。
このように段階的に初期化しているので、基底クラスによる初期化は基底クラスに、派生クラスに関する初期化は派生クラスのみに書けばいい。

デストラクタは逆で、派→基の順番でデストラクタが呼ばれる。
コンストラクタは、ピラミッドを作るように下(基)から積み上げていって
デストラクタは、ピラミッドを解体するように上（派）から取り除く
（この表現めっちゃわかりやすい）
###07-08 継承とコンストラクタ2
引数のあるコンストラクタはどうするのか？

```cpp
InputStream::InputStream(double n) :
  Stream(n)
{
}
```
一般化すると

```
コンストラクタ名(仮引数リスト) :
  基底クラス名（実引数リスト）
{
}
```
この構文はメンバ変数のコンストラクタを呼ぶときにも使える。

```cpp
class Test :
  public InputStream
{
public:
  Test();

private:
  InputStream m_stream1;
  InputStream m_stream2;
};
```
というクラスがあった場合は

```cpp
Test::Test() :
  InputStream(-1),//複数ある場合はコンマで区切る
  m_stream1(-1),m_stream2(-1)
{
}
```
と書くことができる。
メンバ変数の初期化の順番はメンバ変数が宣言された順にされる。

###07-09　仮想関数とコンストラクタ3
仮想関数をコンストラクタやデストラクタで呼ぶと正しく動かない。

#終わりに
明日はスコープ解決演算子
std::とかでよく使うやつですね。
おやすみなさい。
GoogleアカウントじゃないメアドをGCPのIAMに登録しようとしたらエラーになる

# GoogleアカウントじゃないメアドをGCPのIAMに登録しようとしたらエラーになる

## はじめに
Terraformでgoogleアカウント以外のアカウントをIAMに登録しようとしたら、すごく分かりづらいエラーになってハマったため、メモしておく

## terraformでのエラー内容

`terraform plan`時はエラーにならなくて、`terraform apply`時に以下のエラーが出る。

```shell
Error: Error applying plan:

1 error(s) occurred:

* google_project_iam_policy.projects: 1 error(s) occurred:

* google_project_iam_policy.projects: Error setting project IAM policy: Error applying IAM policy for project "project-name". \
Policy is &cloudresourcemanager.Policy{AuditConfigs:[]*cloudresourcemanager.AuditConfig(nil), \
Bindings:[]*cloudresourcemanager.Binding{(*cloudresourcemanager.Binding)(0xc00026aba0), \
 (*cloudresourcemanager.Binding)(0xc00026ac60), (*cloudresourcemanager.Binding)(0xc00026acc0),\
 (*cloudresourcemanager.Binding)(0xc00026ad20), (*cloudresourcemanager.Binding)(0xc00026ad80), \
 (*cloudresourcemanager.Binding)(0xc00026ae40), (*cloudresourcemanager.Binding)(0xc00026af00),\
 (*cloudresourcemanager.Binding)(0xc00026b140), (*cloudresourcemanager.Binding)(0xc00026b1a0),\
 (*cloudresourcemanager.Binding)(0xc00026b200), (*cloudresourcemanager.Binding)(0xc00026b2c0),\
 (*cloudresourcemanager.Binding)(0xc00026b380), (*cloudresourcemanager.Binding)(0xc00026b440),\
 (*cloudresourcemanager.Binding)(0xc00026b680), (*cloudresourcemanager.Binding)(0xc00026b6e0),\
 (*cloudresourcemanager.Binding)(0xc00026b740), (*cloudresourcemanager.Binding)(0xc00026b800),\
 (*cloudresourcemanager.Binding)(0xc00026b8c0), (*cloudresourcemanager.Binding)(0xc00026b920),\
 (*cloudresourcemanager.Binding)(0xc00026b980)}, Etag:"", Version:0,\
 ServerResponse:googleapi.ServerResponse{HTTPStatusCode:0, Header:http.Header(nil)}, \
ForceSendFields:[]string(nil), NullFields:[]string(nil)}, error is googleapi: Error 400: \
User test@example.com does not exist., badRequest
```

## developer consoleで確認
コレ見たら一発で分かるやつやん
![スクリーンショット 2019-03-22 17.01.27_moza.png](https://qiita-image-store.s3.amazonaws.com/0/33101/3693ee73-9a6b-1caf-c79d-969dfafc4d55.png)
【デザインパターン】Strategy

## はじめに
おそばせながら、Pythonで開発するにあたって、デザインパターンってどうやって導入するか疑問になったので試しにstrategyを使ったサンプルを作成してみた。

## サンプル
あるべき姿としては、１クラス１ファイルの形でまとめるべきと考えていますが、
ここでは、省略して１つのファイルで記述します。

概略だけメモ程度に残しておくと、、、
処理を管理者ユーザーと一般ユーザーで分けたいなぁと考えて調べてみました。

```python:strategySample.py
#coding: utf-8
from abc import ABCMeta, abstractmethod

def main():
    manager = Person(ManagerStrategy())
    manager.execute()

    normal = Person(NormalStrategy())
    normal.execute()
    
class Person:

    def __init__(self, strategy):
        self.strategy = strategy

    def execute(self):
        return self.strategy.execute()


class Strategy(metaclass=ABCMeta):
    @abstractmethod
    def execute(self):
        pass

class ManagerStrategy(Strategy):
    def __init__(self):
        pass
    def execute(self):
        print("ManageStrategy")

class NormalStrategy(Strategy):
    def __init__(self):
        pass
    def execute(self):
        print("NormalStrategy")

if __name__=="__main__":
    main()
```

実行結果は以下のようになりました。

```
ManageStrategy
NormalStrategy
```

管理者と一般でどちらも`execute()`ロジックを実行しているが、
管理者(manager)では`ManageStrategy`が出力され、
一般(normal)では`NormalStrategy`が出力されている。
想定通りの挙動が確認できたのでとりあえずはよかった。
勝手にCode for SDGs / 指標のローカライズ

#SDGsとは

持続可能な開発目標(Sustainable Development Goals)を略してSDGsと呼ぶらしいです。
SDGsで検索するとたくさん情報が出てきます。

https://www.mofa.go.jp/mofaj/gaiko/oda/sdgs/about/index.html

#エンジニアができること

色々ありそうですが、難しそう。
ひとまずエンジニアらしくやれるところからやってみよう。
というのが、今回の趣旨です。

#SDGs達成の指標

17の目標はかなり抽象的ですが、それぞれにターゲット(具体的な目標)が決められており、その指標も決められています。さすが国連ですね。

https://unstats.un.org/sdgs/indicators/indicators-list/
[日本語訳(仮)](http://www.soumu.go.jp/main_content/000562264.pdf)

各国の指標達成度合いを見るためのダッシュボードまであります。
https://dashboards.sdgindex.org/#/JPN

ダッシュボードの指標としきい値も決まっているようです。(指標は一部上記とは異なるようです。)
http://www.sdgindex.org/assets/files/2018/Methodological%20Paper_v1_gst_jmm_Aug2018__FINAL_rev10_09.pdf

いまいち意味している内容が分からない指標もありますが、以下のメタデータが一番詳しそうです。
https://unstats.un.org/sdgs/metadata/

リファレンス的なものもありました。
https://unstats.un.org/wiki/display/SDGeHandbook/Home

色々揃っていて国連の本気度を感じます。

上記資料に記載されていた一文が個人的には好きです。(訳:私)
> 公式の指標はSDGの実施を包括的に監視するのに十分ではないと考えており、非公式のデータソースがこのギャップを埋めるのに役立つ可能性があると考えています。

#SDGsの指標をローカライズ

ただ、国単位だと、いまいち自分ゴトとして捉えづらいので、もう少し身近に感じられる単位に落とし込みたい。
できればITを使ってお手軽に。

次回は実際に指標のローカライズに取り組みます。
Node-RED 0.20の新機能　その６

3/12(日本時間だと3/13)にNode-REDの0.20がリリースされました。

せっかくなので[Node-REDのブログ](https://nodered.org/blog/)に投稿されている[Version 0.20 released](https://nodered.org/blog/2019/03/12/version-0-20-released)の内容を試してみようと思います。

[その１の記事はこちら](https://qiita.com/kazsharp/items/43878eabe57d9d752bdb)
[その２の記事はこちら](https://qiita.com/kazsharp/items/a4e6b55bf6dc2d89b7a6)
[その３の記事はこちら](https://qiita.com/kazsharp/items/c9e7303d3c2b15cde246)
[その４の記事はこちら](https://qiita.com/kazsharp/items/c2feb1bee54c044e534d)
[その５の記事はこちら](https://qiita.com/kazsharp/items/f69cbaf0767c130aa738)

##Wiring link nodes
今回はlinkノードの地味な機能アップです。
![WS000071.JPG](https://qiita-image-store.s3.amazonaws.com/0/100799/510bb174-93be-7e90-d5b9-44091ba3a0a9.jpeg)

今までlink outノードとlink inノードをリンクさせるには、linkノードをダブルクリックし編集ダイアログを開き、リンクさせたいリンクを選択する必要がありました。
![WS000072.JPG](https://qiita-image-store.s3.amazonaws.com/0/100799/1dd7cd78-0f91-b636-94c5-c65663214cd0.jpeg)
それがNode-RED 0.20からは普通にノードをつなげるような操作でlink outノードとlink inノードをリンクさせることができるようになりました。
link outノードを選択すると出力ポートが表示されます。
![WS000073.JPG](https://qiita-image-store.s3.amazonaws.com/0/100799/83299ef7-a336-6747-87ef-c5a4911d89fd.jpeg)
（link inノードを選択した場合は入力ポートが表示されます）
この出力ポートを普通にノードをつなげるようにドラッグすると、フローエディタにあるlink inノードに入力ポートが表示されます。
![WS000074.JPG](https://qiita-image-store.s3.amazonaws.com/0/100799/b8ddf943-5ddb-208b-d0d7-d193b161bb75.jpeg)
そしてその表示された入力ポートまでドラッグ＆ドロップするとリンクノードがリンクされます。
![WS000075.JPG](https://qiita-image-store.s3.amazonaws.com/0/100799/9afff08e-054d-9f5a-b94e-7043d32a7fc9.jpeg)
リンクさせるlinkノードが近い場合はこの方法を使うことで編集ダイアログで選択するより素早くリンクさせることができると思います。

以上、ドラッグ＆ドロップによるリンクノードの接続でした。
CentOSにHTTPSサーバー（Apache）を構築

###### 必要なパッケージをインストール
```
yum install -y httpd mod_ssl
```
###### ファイアウォールの設定
```
# firewall-cmd --add-service=https --permanent
# firewall-cmd --reload
```
###### サービス起動
```
# systemctl start httpd
# systemctl enable httpd
```
###### アクセス
```
# curl -X GET https://ipaddress
```
ABC - 053 - A&B&C

#AtCoder ABC 053 A&B&C
[AtCoder - 053](https://atcoder.jp/contests/abc053)

##A問題
1200未満と1200以上で分ければいいらしいです。

```java

		int numN = nextInt();
		if (numN < 1200) {
			out.print("ABC");
		} else {
			out.print("ARC");
		}
```

##B問題
文字列Sの中から先頭が"A"で始まり、"Z"で終わる部分文字列を探す。
探した部分文字列が最長となるときの長さを知りたい。

 - "A"で始まり"Z"で終わる文字列
    - Sの中で"A" を先頭から数えて一番始めの位置
    - Sの中で"Z" を後方から数えて一番初めの位置

で探せば、A-----Zという文字列の内、最長の文字列となるであろう。
○A○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○Z○
という感じ。
AとZの間は何でもいいし。

```java

		String wk = next();

		int first = wk.indexOf("A");
		int last = wk.lastIndexOf("Z");

		String res = wk.substring(first, last + 1);

		out.println(res.length());

```

##C問題
サイコロの面を動かして、合計x点を得るための最小手数。
手数を最小にする（x点を獲得するための最速）には、サイコロの最大値をとり続ければよいけど6をとり続けるわけにはいかないよね。と。
5と6を繰り返せばその時に選択できる値の最大値をとり続けることが出来るのでこれがよさげ。
最初に5でも6でも選択したことにして、「5→6→5→6→5→6→5→6→5」としたい。
5と6を行き来するということは、、、

 1. xを11（=5+6）で割る
 2. [1]の余りが6より大きいなら+2（6の面と5の面を1回ずつ）、小さいなら+1（6の面で解消）

でいける。
結局、開始が5なのか6なのかは、[1]の余りが6未満なら5から始めたことにすれば良いし、6以上ならどちらから始めても良い。となる。

```java

		long numN = nextLong();

		long ope = 0;
		long opeNum = (numN / 11) * 2;
		int opeHasu = (numN % 11) == 0 ? 0 : (numN % 11) > 6 ? 2 : 1;
		ope = (opeNum + opeHasu);

		out.println(ope);
```
pulumiで他projectのoutputを参照する

pulumi関連。

terraformでやれてたremote stateパターンっぽいのをやってみる。

```
// project名：test-k8s(index.ts)
import * as pulumi from "@pulumi/pulumi";

import * as kubernetes from '@pulumi/kubernetes';

const ns = new kubernetes.core.v1.Namespace("hatano",{
  apiVersion: "v1",kind:"Namespace",metadata: {
    name: "hatano"
  }
})

const deploy = new kubernetes.apps.v1.Deployment("my-deploy", {
  apiVersion: "apps/v1",
  kind: "Deployment",
  metadata: {
    labels: {
      app: "nginx",
    },
    namespace: ns.metadata.name
  },
  spec: {
    selector: {
      matchLabels: {
        app: "nginx"
      }
    },
    template: {
      metadata: {
        labels: {
          app: "nginx"
        }
      },
      spec: {
        containers: [{
          image: "nginx",
          name: "nginx"
        }]
      }
    }
  }
})


export let deployLabels = deploy.metadata.labels;
```

exportしとけば、他プロジェクトから使いまわせるようだ。

```
// 別プロジェクト(index.ts)
new pulumi.StackReference("test-k8s",{name: "test/test-k8s/dev"}).outputs.apply(t=>console.log(t)
```
date_selectの最初にオプションを追加する

date_selectで実装してるセレクトボックスに
【Year】,【Month】のoptionを追加してくださいって言われたのでメモ

`:prompt`を使えば指定したオプションを先頭にいれられる。

```erb:sample.html.erb
<%= date_select :hoge, :fuga, use_month_numbers: true, start_year: 2018, end_year: Time.zone.now.year, discard_day: true, prompt: {year: "year", month: "month"} %>
```


こんなかんじで出る
<img width="205" alt="スクリーンショット 2019-03-22 12.37.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/20575/f55d7bd1-44dd-e5a8-5e47-177a73e48257.png">
素早くWeb インスペクターを開く方法3選【Chrome】

Web開発をしている人であれば、「Web インスペクターを開きたい！」という欲望が発生するタイミングがしょっちゅうあると思います。そこで素早くWebインスペクターを開く方法3選を紹介します。
## 素早くWeb インスペクターを開く方法3選
### F12を押す 
便利です。よく使います。
### option + command + i
InspectorのIでしょうね。覚えておきたいショートカットです。
### 右クリックでメニュー表示させて、「Inspect」を選択する。
要素を選択した状態で開くことが出来るのが最大のメリットです。
## 終わりに
私は現在、Web3のサービスの開発をしています。詳しくはこちらの記事をご覧下さい。
        [無料でイーサリアムが当たる、Web3時代の寄付サイトを作った話](https://note.com/kenroda/n/n814347fbdcd7)
【Python】10行未満のコードで一気に複数のアプリケーションを起動させる

# はじめに
毎回、同じ作業を繰り返すことって、めんどくさいですよね・・・

例えば、私はプログラミングの勉強で毎回、同じ作業を繰り返していました。
Pythonの勉強で[Python-izm](https://www.python-izm.com/)というサイトを利用していて、音楽を聴くためにYouTubeを開いています。
また、開発の環境として、秀丸というテキストエディタとコマンドプロンプトを立ち上げています。
ここまでの手順をまとめると以下のようになります。

```
1. YouTubeを開く
2. Python-izmを開く
3. 秀丸の起動
4. コマンドプロンプトの起動
```

この作業をプログラミングの勉強を始める時に毎回、繰り返し行っていました。

そこで！！！！
せっかくプログラミングを勉強しているので、プログラムで制御して、行ってもらおうということです！
すると以下のようになります。



![test.gif](https://qiita-image-store.s3.amazonaws.com/0/309633/e67428f8-96af-71c1-ce05-412ea5f8e9df.gif)


プログラムを実行することで、先ほどの4つの作業を一気にしてくれています。
めっちゃ効率化された！！！！


# 環境
- Windows 10 home
- Python 3.7.1


# ソースコード

```test.py
import subprocess as sp

webbrowser = r"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe"
sp.Popen([webbrowser,"https://www.youtube.com/"])
sp.Popen([webbrowser,"https://www.python-izm.com/"])
sp.Popen(r"C:\Program Files\Hidemaru\Hidemaru.exe")
sp.Popen(r"C:\Windows\system32\cmd.exe")

```
コードはたった7行です！
ブラウザはGoogle Chromeを使っています。
**subprocess**モジュールの**Popen関数**を使うと簡単にアプリケーションを起動することができます。

URLを変えるだけで、自分の好きなアプリケーションを起動することができるので、このコードを参考にして自分なりのプログラムを作って、どんどん利用してみてください！
Visual Studio Codeのショートカット習得記録

Windows版Visual Studio codeを英語キーボードで使用していますが、なかなかショートカットの習得が進みません。
こういったショートカットは、意識して覚えていかないと習得できないと思われるので習得の記録をつけていきます。


優先度: P0, P1, P2, P3, P4, P5
習得状況: M(aster), P(ractice)

# General
| Key | Command | Command id |優先度| 習得状況 |
|:----|:-:|:-:|:-:|:-:|
|`Ctrl`+`Shift`+`P`,<br>`F1`|コマンドパレットの表示|workbench.action.showCommands   |P0| P |
|   |   |   |   |   |
|   |   |   |   |   |
|   |   |   |   |   |
|   |   |   |   |   |
|   |   |   |   |   |
|   |   |   |   |   |
|   |   |   |   |   |
|   |   |   |   |   |
|   |   |   |   |   |



||
railsチュートリアル　第四章

##はじめに
railsチュートリアルで理解しにくいところや、詰まったところを書いていく記事になります。
なので、手順を示す記事とはなっていません。
##カスタムヘルパー
Railsのビューでは膨大な数の組み込み関数が使えるが、それだけでなく、新しく作成することもできる。
新しく作ったメソッドは**カスタムヘルパー** と呼ばれる。
例として、タイトル用のカスタムヘルパーを作成する。

```app/helpers/application_helper.rb
module ApplicationHelper

  # ページごとの完全なタイトルを返します。
  def full_title(page_title = '')
    base_title = "Ruby on Rails Tutorial Sample App"
    if page_title.empty?
      base_title
    else
      page_title + " | " + base_title
    end
  end
end
```

ビュー側ではこれを以下のように使う。

```app/views/layouts/application.html.erb
<title><%= full_title(yield(:title)) %></title>
```

これによりページタイトルがない場合とある場合で、きちんとタイトルの表示を分けることができる。

##ブロック

```
(1..5).each { |i| puts 2 * i }
```
というeachメソッドがあれば、{}の部分がブロックとなる。

**mapメソッド**などがある。

```
>> %w[A B C].map { |char| char.downcase }
=> ["a", "b", "c"]
>> %w[A B C].map(&:downcase)
=> ["a", "b", "c"]
```
mapメソッドは、渡されたブロックを配列や範囲オブジェクトの各要素に対して適用し、その結果を返す。

##終わり
四章に関してはあまり学ぶことがなかった、、、

次↓
https://qiita.com/jonnyjonnyj1397/items/c241f62eca6b8fd6e337
Macでgdbを使う方法

DockerのUbuntuコンテナ内に環境構築します。

```
docker run -it -v SRC-DIR:DST-DIR --cap-add=SYS_PTRACE --security-opt="seccomp=unconfined" ubuntu /bin/bash
docker exec -it CONTAINER /bin/bash
apt-get update
apt-get -y install emacs g++ gdb
cd DST-DIR
g++ -g3 main.cpp
gdb a.out
```
QRCodeEncoderDecoderLibraryを用いてQRコードをエンコードする（作成する）Csharpの単体アプリを作る

QRCodeEncoderDecoderLibraryを用いてQRコードをエンコードする（作成する）Csharpの単体アプリを作る

※ライブラリは以下参照
QR Code Encoder and Decoder .NET Class Library
https://www.codeproject.com/Articles/1250071/QR-Code-Encoder-and-Decoder-NET-Class-Library-Writ

QRCodeEncoderDecoderLibrary.dll
[QRCodeEncoderDecoderLibrary.dll](http://thomas.cranky.jp/qr/QRCodeEncoderDecoderLibrary.dll)



```C#:sample_qr_encode.cs

//c:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe /reference:QRCodeEncoderDecoderLibrary.dll /target:winexe sample_qr_encode.cs

using System;
using System.Windows.Forms;
using System.Drawing;
using QRCodeEncoderDecoderLibrary;

public class sample_qr_encode
{
 public static void Main(string[] args)
 {

    string str;
    str = @"" + args[0];

    QREncoder QRCodeEncoder;
    Bitmap    QRCodeImage;

    QRCodeEncoder = new QREncoder();

    byte [] bytesData = System.Text.Encoding.UTF8.GetBytes(str);
    string Data = System.Text.Encoding.UTF8.GetString(bytesData);

    QRCodeEncoder.Encode(ErrorCorrection.H, Data);
    QRCodeImage = QRCodeToBitmap.CreateBitmap(QRCodeEncoder, 4, 8);

    QRCodeImage.Save(@".\\outQR.png",System.Drawing.Imaging.ImageFormat.Png);

 }
}

```
code-server on WSL(VS Code) を起動し、Chrome アプリケーションモードで利用！

[WSL](https://ja.wikipedia.org/wiki/Windows_Subsystem_for_Linux) 上で [code-server](https://github.com/codercom/code-server) が起動できるようになったため手順を整理します。
code-server on WSL により Windows 上に Linux をベースとした VS Code 開発環境が構築できます。

# 2019-05-03 追記

もうこの記事の内容は、意味がないかもしれません。。
本家 VS Code の方が、WSL をベースとして開発をサポートしたためです。
以下のリンクを参照して頂けると良いと思います。

* https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-wsl
* https://code.visualstudio.com/blogs/2019/05/02/remote-development
* https://code.visualstudio.com/api/advanced-topics/remote-extensions

# モチベーション

本番では Linux で動かすアプリケーションを、ローカルでは Windows や macOS 上で開発している。
アプリケーションのランタイムが、OS の差分を上手く吸収してくれるため、多くの場合問題にならない。
でもたまに、 Linux 上ではビルドが通らなかったり、挙動が違うことがある。
そんな不安をなくすため、 与えられた Windows を使いながらも Linux をベースとした開発環境を構築できないかというのがモチベーションです。

# WSLに code-server をインストール & 起動

WSL の Ubuntu 等を起動後、以下のコマンドを実行します。
[リリースページ](https://github.com/codercom/code-server/releases)を確認し、最新のバージョンで読み替えてください。

```
$ cd
$ mkdir -p apps
$ cd $_
$ wget https://github.com/codercom/code-server/releases/download/1.939-vsc1.33.1/code-server1.939-vsc1.33.1-linux-x64.tar.gz
$ tar xvf code-server1.939-vsc1.33.1-linux-x64.tar.gz
$ cd code-server1.939-vsc1.33.1-linux-x64
$ ./code-server --allow-http --no-auth
```

# ショートカットアイコンの作成

ショートカットアイコンを作成し、クライアントを簡単に起動できるようにします。

1. デスクトップで右クリック -> 「新規作成(X)」 -> 「ショットカット(S)」  でダイアログを開く。
2. 「項目の場所を入力して下さい(T:)」 に `"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --app=http://localhost:8443/` を入力し「次へ」ボタンをクリックする（chrome.exe へのパスは適切なもの変更してください）。
3. 「このショートカットの名前を入力してください(T:)」に `code-client` と入力し「完了」ボタンをクリックする。
4. ショートカットアイコンの code-client をダブルクリックする。

アプリケーションモードで起動するため、ブラウザのショートカットが無効になりショートカットの競合を避けることができます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/22640/11239dbd-d539-8a04-7a96-b1da939e1e12.png)

最小化・最大化・閉じるのコントロールが二重に表示され変な感じではあります。

# PWA としてインストール(2019-04-19追記)

バージョンアップにより、PWAとしてインストールできるようになったみたいです。
Google Chrome の設定 -> 「Coder」をインストール...
でインストール可能です。
しかしながら、アドレスバーが表示されたり(localhostだからかな？) 逆に使いにくいかもしれません。

# フォントの設定

terminal のフォントが微妙なので変更します。

`ctrl + ,` で User Settings を開きます。

## Editor のフォント変更

「Text Editor」 -> 「Font」 -> 「Font Family」 と開き、 `Consolas, 'Courier New', monospace` を入力。

## Terminal のフォント変更

「Features」 -> 「Terminal」 -> 「Font Family」 と開き、 `Consolas, 'Courier New', monospace` を入力。

以下のような感じになります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/22640/2177e015-5dc3-281f-d738-8ac529b29c2c.png)

# WSL 上の code-server のアンインストール

```
$ rm -rf ~/apps/code-server1.868-vsc1.33.1-linux-x64 ~/.local/share/code-server
```
# その他メモ

* Webフロンエンドの開発は、この構成でいけそう。
* ~~Vim extension は動くがクリップボードの扱いに難がありそう。~~
* ~~markdown の preview は現状できないみたい。~~ (できるようになりました)
* 「Open Recent」に履歴が残らない。
* Java Extension Pack をインストールしてみたが、一括での複数 Extension のインストールが実行されない感じ。
* Java Language Server がクラッシュする。
* Marketplace の検索でヒットしない Extension もある。VS Code で利用できるものがすべて利用できるわけではない。
* キーボードショートカットの設定は、カスタマイズした方が良さそう（特に Vim extension を使う場合）。

# おわりに

未来を感じた。
RubyHackができる環境のつくりかた

# はじめに

以前、[Ruby Hack Challenge Holiday! #2](https://connpass.com/event/121894/)に参加してきましたー

Ruby自体を改造したり、最新のRubyのコードを試したりするイベントです！

その時のあれこれは[こちら](https://gamelinks007.hatenablog.com/)

参加時にRuby自体を開発する環境を構築する必要があり、Dockerで環境を構築しました

で、後々考えてみると「Dockerで開発環境作れるんだから、[Codenvy](https://codenvy.io)でも開発環境作れるんじゃないの？」と思って試してみた記事になります

# やったこと
## Codenvyにアカウント作成

まず、[Codenvy](https://codenvy.io)にアクセスしてアカウントを作成します


`GitHub`や`Google`アカウントでアカウントが作成できるのでお好みのほうで作成してください

メールでもアカウントが作成できますので、そちらでもいいかもしれませんね

## CodenvyにRuby Hack ChallengeのStackを作成

アカウントを作成出来たら、さっそく環境を作っていきましょう！

まず、「Create Workspace」をクリックします

「+ Add Stack」をクリックして「YES」を選択し、以下を貼り付けます

```dockerfile
FROM koichisasada/rhc
```

あとは、「Name」と「Description」のところに`rhc`と入力して、「SAVE」をクリックします

これでRuby開発環境のDockerイメージを使用できます！

# Ruby Hackできるワークスペースを作成

左のメニューから「Dachboard」をクリックし、「Create Workspace」を選択します

「SELECT STACK」の中に、先ほど作成した`rhc`があると思います

それを選択して、`CREATE`をクリックすればRubyの間髪環境が構築できます！

# Rubyのビルド＆インストール

では、実際にRubyをビルドしてみましょう!

まずは作業用のディレクトリを作成します

```shell
mkdir workdir
```

その後、`workdir`へと移動します

```shell
cd mkdir
```

`workdir`内にRubyのソースコードを`clone`します

```shell
git clone https://github.com/ruby/ruby.git
```

`clone`後、`ruby`ディレクトリへと移動して`autoconf`を実行します

```shell
cd ruby
autoconf
```

そして、`workdir`内に`build`ディレクトリを作成します

```shell
cd ..
mkdir build
```

`build`ディレクトリに移動し、Rubyをビルド＆インストールを行います

```shell
cd build
../ruby/configure --prefix=$PWD/../install --enable-shared
make -j
make install
```

これで、`workdir/install`以下に最新のRubyがインストールされました！

あとは、実際にRubyのバージョンを確認してみましょう!

```shell
../install/bin/ruby -v
```

バージョンが表示されていればOKです！

# やってみて

「意外と簡単にできてしまった……」という感じですね（Dockerイメージを作っていただいたことに感謝！）

この記事をもとに地域版RubyHackChallengeとかやれそうなので、ちょっとやってみたいなぁ……


# 参考

[One-Click Docker Environments](https://codenvy.com/docs/tutorials/one-click-docker-environments/index.html)

[ko1/rubyhackchallenge](https://github.com/ko1/rubyhackchallenge)