OmniAICreator/Qiita-1.07M huggingface dataset:
Autodesk Inventor API Hacking (BrowserNodeの複数選択)

# 0. はじめに
DrawingDocumentのBrowserNodeには、難があります。
これらNodeをmouseで選択した時、SelectSetに入るObjectの型はunknownなのです。
突然で「何を言っているんだ・・・」と思うかもしれませんが、DrawingView内の要素(線)をいじろうとすると、すぐにわかります。
手作業ではBrowserNode単位で選択 → 線種変更できるのですが、現状のAPIで自動化しようとすると、全DrawingCurveについて1つずつ処理しないといけないので、ものすごく遅くなります。

「線種変更は手作業で`右クリック`→`プロパティー`するから、せめて条件に当てはまる項目を自動選択出来れば・・・」というのが、発端です。

# 1. BrowserNode.DoSelect()
普通に考えれば、

```C#
InventorApplication.ActiveDocument.SelectSet.SelectMultiple(collection);
```

すれば良いだけの話です。でも、このcollectionに入れる要素の型が公開されていないので、この方法では選択できません。

SelectSetに頼らない、もう1つの選択方法があります。それは、DoSelect()です。
BrowserNodesを辿り、目的のBrowserNodeを見つけてnode.DoSelect()すれば、選択できます。
しかし、この方法では、前回選択した内容がクリアされる == 常に最後の1つしか選択されないという欠点があります。

# 2. Control key
しかし、私は発見しました。keyboard(そう、物理キーボードです)のControl keyを押しっぱなしにしながら、DoSelect()を複数回呼び出すと、全てのObjectが選択されるのです。
これは、DoSelect()がまさにmouseの左クリックをエミュレートしているからです。(というか、実際は逆で、OnMouseClickがDoSelect()を呼んでいるのでしょう)

ここまで来れば、やることは1つです。あたかもControl keyが押されているかのごとく、振舞えば良いのです。

# 3. GetKeyboardState / SetKeyboardState
SendMessage, PostMessage, WH_KEYBOARD_LLなどと遠回りをしましたが、最終的にはGetKeyboardStateとSetKeyboardStateを使って、Control keyを押している振りをさせることに成功しました。

```C#
internal class NativeMethods
{
    [System.Runtime.InteropServices.DllImport("user32.dll")]
    public static extern bool GetKeyboardState(byte[] lpKeyState);
    [System.Runtime.InteropServices.DllImport("user32.dll")]
    public static extern bool SetKeyboardState(byte[] lpKeyState);
}
const int VK_CONTROL = 0x11;

void foo()
{
    byte[] keys = new byte[256];
    byte savedControlKey;

    // Controlキーを押しっぱなしにする
    NativeMethods.GetKeyboardState(keys);
    savedControlKey = keys[VK_CONTROL];
    keys[VK_CONTROL] = 0x80;
    NativeMethods.SetKeyboardState(keys);

    try
    {
        //
        //  ループか何かで、複数回BrowserNode.DoSelect()する
        //
    }
    finally
    {
        // Controlキーを復元する
        keys[VK_CONTROL] = savedControlKey;
        NativeMethods.SetKeyboardState(keys);
    }
}
```

実行時にユーザーがControl Keyを押している可能性も考慮して、変更前の状態を保管しておいて、作業終了後に元に戻しています。
まずはこの実装で問題ないと思いますが、

* 処理時間が長い
* 実行頻度が非常に高い (例えば、キーを1文字入力ごとに実行)

などの場合は、書き戻す前にもう一度GetkeyboardState()した方が良いかもしれません。
その場合、物理Control keyの状態が変化した場合はどうするんだ、と言われるとその通りで、厳密にはGetAsyncKeyState(VK_CONTROL)で状態を確認した方が良いのでしょう。
(GetAsyncKeyState()は、SetKeyboardState()の影響を受けないようです)

また別の問題として、DoSelect()するループ中に、物理Control keyをdown→upされると、状態が解除されてしまいます。

これらの問題を避けるには、DoSelect()の直前/直後で、Control keyを設定/解除すれば良いと思いますが、そこまでするかどうかは皆様の判断にお任せします。

# 4. DoSelect()を確実に実行するための補足 (19.06.01)
DrawingDocumentを開きたての状態で下層のnodeをDoSelect()しても、選択されないことがあります。遅延バインディングをしているのか、nodeを開かないと選択できないようです。一旦開けば、後は閉じても選択できます。
とりあえず、以下のような回避方法を考えました。

```C#
if (node.Parent is BrowserNode parentNode)
{
    // BrowserNodeを開く
    parentNode.Expanded = true;
}
node.DoSelect();
```

選択した後にnodeが(厳密には親nodeが)開きっぱなしになるのですが、私は自分用AddInなので、別に良しとしています。

`parentNode.Expanded = false`しても、 __親の親__ は閉じません。
なので、厳密に実行前の状況を保管したいのなら、親を再帰的に辿りながら、`node`がkeyで`node.Expanded`がvalueのDictionaryを作り、最後にforeachで復帰すると良いでしょう。

# 99. 親の記事に戻る
[Autodesk Inventor API Hacking (概略)](https://qiita.com/yamarah/items/cee08eb8f2b7aecbda83)
Node.jsで文字列を暗号化・復号する 【string encryption in node.js】

どれだけニーズがあるのかわからないが、データベースに入ってるidとかを必要な時に難読化したかった。

例えば、```example.com/1/profile```みたいなURLだと、「1のところを2に変えたら他の人のプロフィール見えるんじゃないの」みたいなのをトライできないようにしたい。

で、とりあえずstringを入力したらそいつをencryptした文字列を返却するモジュールを作ってみよう。
加えて、Adminの立場的にはencryptされた文字列を見るのはめんどくさいのでdecryptもできるようにしよう。

nodeにはcryptoという暗号化周りの組み込みモジュールが存在するので、そいつを利用する。

ドキュメント: https://nodejs.org/api/crypto.html

```javascript
const crypto = require('crypto');

const ENCRYPTION_KEY = "HH95XH7sYAbznRBJSUE9W8RQxzQIGSpy" // 32Byte. このまま利用しないこと！
const BUFFER_KEY = "RfHBdAR5RJHqp5wm" // 16Byte. このまま利用しないこと！
const ENCRYPT_METHOD = "aes-256-cbc" // 暗号化方式
const ENCODING = "hex" // 暗号化時のencoding

const raw = JSON.stringify({userId: 1}) // 暗号化する対象。stringなら何でも。

function getEncryptedString(raw) {
  let iv = Buffer.from(BUFFER_KEY)
  let cipher = crypto.createCipheriv(ENCRYPT_METHOD, Buffer.from(ENCRYPTION_KEY), iv)
  let encrypted = cipher.update(raw)

  encrypted = Buffer.concat([encrypted, cipher.final()])

  return encrypted.toString(ENCODING)
}

function getDecryptedString(encrypted) {
  let iv = Buffer.from(BUFFER_KEY)
  let encryptedText = Buffer.from(encrypted, ENCODING)
  let decipher = crypto.createDecipheriv(ENCRYPT_METHOD, Buffer.from(ENCRYPTION_KEY), iv)
  let decrypted = decipher.update(encryptedText)

  decrypted = Buffer.concat([decrypted, decipher.final()])

  return decrypted.toString()
}

// 以下は試してみてるだけ

console.log(`raw: ${raw}`)

const encrypted = getEncryptedString(raw)

console.log(`encrypted: ${encrypted}`)

const decrypted = getDecryptedString(encrypted)

console.log(`decrypted: ${decrypted}`)
```

上記をコピペして適当なファイル名(encryption-sample.js とか)をつけて、```node encryption-sample.js```を叩くと下記のようなアウトプットになるはず

```shell-session
raw: {"userId":1}
encrypted: e3629d8ff7295f693569359d06fd4da2
decrypted: {"userId":1}
```

今回は、getEncryptedString()に対してあるstring: Aを渡した場合に、どんな場合でも同じ結果string: A'が返ってきてほしかったので、```let iv = Buffer.from(BUFFER_KEY)```の部分で必ず同じiv (= initialization vector)が生成されるようにしています。

ただし、用途によっては毎回異なるivを生成し、encryption結果が毎回変わることが正な場合もある(というか本来の目的ではそちらのほうが正？)ので気をつけて下さい。

https://gist.github.com/vlucas/2bd40f62d20c1d49237a109d491974eb

それについては上記のコードが参考になると思います。
というか僕が参考にしました。
[jQuery/Rails] Uncaught TypeError: t.modal is not a function

前提
-
Rails5.2

エラー内容
-
SummernoteのWYSIWYGエディターを使って、写真投稿をする機能を実装しようとしたら、エディターのImageタブをクリックしても、画像挿入のウィンドウが表示されない（エディター）、という問題。

Google Chromeのデベロッパーツール(Shift+Command+c)でエラー内容を確認すると、以下のエラーが発生する。

```
Uncaught TypeError: t.modal is not a function
at Object.showDialog.........
at Object.<anonymous>........
```
色々ネットで調べると、このエラーメッセージは、　
Uncaught TypeError: $(...).modal is not a function
直訳：「$(...).modalはfunctionではありません」
意訳：「.modal()なんて関数は存在しない」
っていう意味らしい。このエラーは、JavaScriptのエラーなので、railsとかrubyではなく、一番疑わしいのは、「自身のコード内に該当するJavaScriptの記述が存在するかどうか」らしい。

よくわからんけど、要は、**JavaScript**が怪しいらしい！！！

とりあえず、自分のjsが記述されている、javascripts/application.jsを見に行く。

よ〜く見ると、jqueryが３つも記述されている。これが怪しいかも。。。
//= require jquery2
//= require jquery
//= require jquery_ujs

```assets/javascripts/application.js
//= require jquery2　← この子
//= require rails-ujs
//= require popper
//= require bootstrap
//= require bootstrap-sprockets
//= require jquery　← この子
//= require jquery_ujs　← この子
//= require_tree .
//= require toastr
//= require jquery-ui
//= require tag-it
//= require summernote/summernote-bs4.min
//= require summernote/lang/summernote-ja-JP
//= require summernote-init
//= require activestorage
// = require turbolinks
```


解決策
-
railsでのjqueryの記述の仕方について、原点に戻る。
【リンク】[rails/jquery-rails](https://github.com/rails/jquery-rails)

すると、記述方法に以下の通り記載されている。

**Installation**
If you are running Rails 5.1 and up, and if you have included //= require rails-ujs, then jquery_ujs is not needed anymore. You can just add:
```//= require jquery```
If you want to use jQuery 2, you can require jquery2 instead:
```//= require jquery2
//= require jquery_ujs```

と記載されている。

つまり、次の２点によって、エラーが発生していた。
1. **Rails5.1以降は、rails-ujsがあれば、```//= require jquery_ujs```は不要**
2. **```//= require jquery2```使ってるなら、```//= require jquery```は不要**

よって、次の２つを削除して、
~~//= require jquery~~
~~//= require jquery_ujs~~

次の２つだけを残せばOKでした！！！

```assets/javascripts/application.js
//= require jquery2　← キープ
//= require rails-ujs　← キープ
```

以上。

関連リンク
-
[rails/jquery-rails](https://github.com/rails/jquery-rails)
Desktop : OpenCV Java Repository

![images.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276243/65f24a55-a45e-3fd8-849d-da47729d9457.jpeg)


[OpenCV Java Repository](https://gitlab.com/kangyueLuo/opencv_desktop_samples)

![opencv_texture_flattening.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276243/6599cc60-61c3-81b8-72ed-20b7ef7fe156.jpeg)

![opencv_flood_fill_for_fun.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276243/35df027c-89af-344f-82c4-07bbd44937b6.jpeg)
OpenCVで dyld: Library not loaded というエラーが出る解決策(OpenBLAS)

Xcodeで久々にOpenCVを使ったら動かなくなってしまいました。
(追記: Xcodeだけでなく、GCCでも起こるようです。)

```:エラー内容
dyld: Library not loaded: /usr/local/opt/gcc/lib/gcc/8/libgfortran.5.dylib
  Referenced from: /usr/local/opt/openblas/lib/libopenblasp-r0.3.5.dylib
  Reason: image not found
```

`libopenblasp-r0.3.5.dylib`が`libgfortran.5.dylib`を参照しようとしているけれど、見つからないよ！という意味のようです。

OpenBLASの依存関係にGCCがあり、GCCのバージョンアップにより使えなくなってしまったようです。

# 動作環境

macOS Mojave (10.14.4)
Xcode (10.2.1)
GCC (9.1.0)
OpenBLAS (0.3.5)
OpenCV (4.0.1)

# 確認すべき項目
以下の記事を参考にライブラリのリンクに間違いがないかを確認します。
[Library not loaded エラー？ここを見直そう](https://qiita.com/kakipo/items/3cd87e00bc96bc3888b2)

今回は、以前動いていたことがあるのに動かなくなったため、バージョンの問題がありそうです。

# その場しのぎの解決策
ターミナルで `open /usr/local/opt/gcc/lib/gcc/`としてそのフォルダを開いてみると、`9`というフォルダしか存在しません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404817/1a1bd607-21ff-2403-5ff3-5db30deca20f.png)

この`9`というフォルダを複製して`8`とすれば、`/usr/local/opt/gcc/lib/gcc/8/libgfortran.5.dylib`が参照できるようになりとりあえず動作しますが、根本的な解決にはなっていません。

# 根本的な解決策

## 1. OpenBLASのアップグレード
openblasをアップグレードして0.3.5->0.3.6とすると、新たなエラーが出るようになります。

```bash
brew upgrade openblas
```

```:エラー内容
dyld: Library not loaded: /usr/local/opt/openblas/lib/libopenblasp-r0.3.5.dylib
  Referenced from: /usr/local/opt/opencv/lib/libopencv_core.4.0.dylib
  Reason: image not found
```

今度は`libopencv_core.4.0.dylib`が旧バージョンの`libopenblasp-r0.3.5.dylib`を参照してしまい、見つからないよ！って言われています。どうして古いのを参照しようとするんだよ！！！！

## 2. OpenCVのアップグレード
OpenCVをアップグレードします。

```bash
brew upgrade opencv
```

お手数ですが、XcodeでOpenCVを使えるようにするための設定を再びする必要があります。

1. Build Phases の Link Binary With Libraries に`/usr/local/Cellar/opencv/4.1.0_2/lib/` (このパスはbrew info opencv等で確認)にあるdylibファイル44個くらいを全てドラッグ&ドロップする
2. Build Settings の Header Search Paths に `/usr/local/Cellar/opencv/4.1.0_2/include` (recursive)とする

これで正しく動作しました。
[Vue.js]filterをコンポーネントのscript内で使えるようにするメモ

## やりたいこと


filterをコンポーネントのscript内で使えるようにしたい

### ダメな例

```html
<script>
export default {
  name: 'ThePieGraph',
  methods: {
    fillData() {
      this.datacollection = {
        datasets: [
          {
            data: [ 変数 | filter ],　
            // ↑★ここにfiletrを置きたいが、こういう書き方だとダメ
          },
        ],
      }
    },
  },
}
```

## やったこと

### いい例

src直下にpluginsディレクトリを切って、その中にfilter.jsを置く

**prototype**を用いると、コンポーネントのscript内でも、関数としてfilterを呼び出すことができる


```javascript

/**
 * 配列をオブジェクトから名前抽出
 * @param {String} key
 * @param {{}} obj
 * @returns {String}
 */
const objToName = (key, obj) => {
  if (obj[key] !== undefined) {
    return obj[key]
  }
  return key
}

export default {
  install(vue) {
    // 数値を小数点に変換する
    const decimalPointShaping = value => {
      // console.log('decimalPointShaping',value)
      if (!Number(value)) {
        return value
      }
      return Math.round(value)
    }
    vue.filter('decimalPointShaping', decimalPointShaping)

    // 全体から平均的なパーセントを割り出す
    const percentageCalculation = (value, sum) => {
      console.log('percentageCalculation', value, sum)
      return (value / sum) * 100
    }
    vue.filter('percentageCalculation', percentageCalculation)

    // APIの結果から人柄の結果を変換する
    const personalityConversion = value => objToName(value, big4)
    vue.filter('personalityConversion', personalityConversion)

    // APIの結果からbig5の結果を変換する
    const big5Conversion = value => objToName(value, big5)
    vue.filter('big5Conversion', big5Conversion)

    // 全体から平均的なパーセントを割り出し、かつ数値を整数に整形する
    const percentAndDecimal = (value, sum) =>
      decimalPointShaping(percentageCalculation(value,sum))


/********************** 対象の記述↓ **********************/
    // フィルターをコンポーネントスクリプト内で使えるようにする
    vue.prototype.$customFilter = {
      decimalPointShaping,
      personalityConversion,
      big5Conversion,
      percentageCalculation,
      percentAndDecimal,
    }
/********************** 対象の記述↑ **********************/

  },
}

```


### 使い方

```html
<script>
export default {
  name: 'ThePieGraph',
  methods: {
    fillData() {
      this.datacollection = {
        datasets: [
          {
            data: [
              this.$customFilter.percentAndDecimal(this.big4_average,this.big4_sum),
              this.$customFilter.percentAndDecimal(this.big4_reserved,this.big4_sum),
              this.$customFilter.percentAndDecimal(this.big4_role_models,this.big4_sum),
              this.$customFilter.percentAndDecimal(this.big4_self_centered,this.big4_sum),
            ], //★↑ここ
          },
        ],
      }
    },
  },
}

```
HTLM二日目

今日はCSSに手を出しているはずだったのだが。。。

#リスト
```
		<ul>
			<li>りんご</li>　・りんご
			<li>みかん</li>　・みかん
			<li>ぶどう</li>　・ぶどう
		</ul>
		<ol>
			<li>りんご</li>　1. りんご
			<li>みかん</li>　2. みかん
			<li>ぶどう</li>　3. ぶどう
		</ol>

```

#divとspan
- 任意の範囲をグループ化
- CSSでスタイルを当てるときに使う
- タグ自身は意味を持たない

##違い
###CSSのプロパティ値の違い
- div: display: block
- spa: display: inline 

###幅と高さを指定できる？
- div:　できる
- span: できない

###前後に改行が入るか
- div: 入る
- span: 入らない

#属性(attribute)
- タグになにかしらの設定をできる。

`<tag name="value"></tag>`

#img
- 相対パス　`<img src="dog.jpg">`同じディレクトリ
- 絶対パス　`<img src="http://~~/dog.jpg">`

#リンク
## aタグ
- リンクを貼るときに使う
- `<a href="https:/???">Google</a>`
  - 別サーバー

`<a href="https://google.com" target="blank">Google</a>`
別タブで開く
Rails  OAuth::Unauthorized というエラー出たら

##OAuth::Unauthorized エラー

Railsで現在サービスを開発している[ホリカワ](https://twitter.com/jonnyjonnyj1397) です。

本番環境でツイッター経由ログインしようとすると、上記のエラーが出ました。
<img width="1082" alt="スクリーンショット 2019-05-28 21_0.14.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365406/60f33967-2121-23a2-3a91-81dd876d8419.png">

原因としては
>①CallbackURLの設定ミス
②Twitter API key関連の設定ミス

が多いかとは思います。（これ以外にもたくさんありそう）

##解決方法

僕の場合は①でした。

結論からいうと、config/initializers/devise.rbに設定を加えると解決しました。

```config/initializers/devise.rb
config.omniauth :twitter, "twiiter api key", "twitter secret key"
```
 scope: 'email', callback_url: 'example.com/auth/twitter/callback'
↑を追加

```config/initializers/devise.rb
config.omniauth :twitter, "twiiter api key", "twitter secret key", scope: 'email', callback_url: 'example.com/auth/twitter/callback'
```

##わかったこと
このほかのエラーの原因として、本番環境の場合は```https://```でないとダメみたいです。

また、twitter dev のアプリの設定で、callback_urlが間違っていないかは```rails routes```で確認してみましょう。

```
user_twitter_omniauth_callback GET|POST /users/auth/twitter/callback(.:format
```

##終わりに


OAuth::Unauthorized は調べてみた感じだといくつかの要因が考えられそうです。
こちらの記事が解決のお手伝いになればと思います。
SAMでSQSをイベントソースとするLambdaを構築

しようとしたら失敗したので備忘録的に解決策を残しておこうと思いました。

# AWS曰く

このクールなコードでビルドできるよ！
とのこと。

```YAML
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: Example of processing messages on an SQS queue with Lambda
Resources:
  MySQSQueueFunction:
    Type: AWS::Serverless::Function
    Properties:
      Handler: handler
      Runtime: runtime
      Events:
        MySQSEvent:
          Type: SQS
          Properties:
            Queue: !GetAtt MySqsQueue.Arn
            BatchSize: 10
  MySqsQueue:
    Type: AWS::SQS::Queue
```
出典：[AWS SAM Template for an Amazon SQS Application](https://docs.aws.amazon.com/lambda/latest/dg/with-sqs-example-use-app-spec.html)

# そして失敗

## エラー１：LambdaがSQSを呼ぶ権限がない

謎のエラーを吐いてCloudFormationが失敗に終わる。

```
The provided execution role does not have permissions to call ReceiveMessage on SQS (Service: AWSLambda; Status Code: 400; Error Code: InvalidParameterValueException
```

Lambdaに設定したロールには **AWSLambdaSQSQueueExecutionRole** が付いている。
つまりIAMロールには（おそらく）問題がない。

なぜ失敗する？

## 解決１：SQSにも権限の設定をする

冷静に考えたら、コンソールからキューを作る時も権限をいじった気がする。
というわけで、下記を追加する事で上述のエラーは出なくなった。

```YAML
  MySqsQueuePolicy: 
    Type: AWS::SQS::QueuePolicy
    Properties: 
      PolicyDocument: 
        Id: !Ref MySqsQueue
        Statement: 
          - Sid: QueuePolicy-MySqsQueue
            Effect: Allow
            Principal: "*"
            Action: "SQS:*"
            Resource: 
              Fn::GetAtt:
              - MySqsQueue
              - Arn
      Queues:
        - !Ref MySqsQueue
```


## エラー２：キューの可視性タイムアウトがLambdaのタイムアウトより短い

エラー１が解決したら、今度はこれが出るようになった。
コンソールから設定する時はあなたそんな事言わなかったじゃない。

```
Queue visibility timeout: 30 seconds is less than Function timeout: 60 seconds
```

## 解決２：可視性タイムアウトを伸ばす

明示的に指定しないとdefaultで30秒になるらしいので、キューのPropertiesにVisibilityTimeoutを設定する。
※Lambdaのタイムアウトを明示的に60秒にしていたので、もしかしたらその設定の影響かもしれない。

```YAML
  MySqsQueue: 
    Type: AWS::SQS::Queue
    Properties: 
      VisibilityTimeout: 60
```

# 結論

SQSキューポリシーと、可視性タイムアウトの設定をするとうまくいきました。

```YAML
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: Example of processing messages on an SQS queue with Lambda
Resources:
  MySQSQueueFunction:
    Type: AWS::Serverless::Function
    Properties:
      Handler: handler
      Runtime: runtime
      Timeout: 60
      Events:
        MySQSEvent:
          Type: SQS
          Properties:
            Queue: !GetAtt MySqsQueue.Arn
            BatchSize: 10
  MySqsQueue:
    Type: AWS::SQS::Queue
    Properties: 
      VisibilityTimeout: 60
  MySqsQueuePolicy: 
    Type: AWS::SQS::QueuePolicy
    Properties: 
      PolicyDocument: 
        Id: !Ref MySqsQueue
        Statement: 
          - Sid: QueuePolicy-MySqsQueue
            Effect: Allow
            Principal: "*"
            Action: "SQS:*"
            Resource: 
              Fn::GetAtt:
              - MySqsQueue
              - Arn
      Queues:
        - !Ref MySqsQueue
```



# 蛇足

実はこの前段階でCloudFormationの実行ロールにSQSの権限が無かった事により一度失敗している。
CodeStarを使っているため、自動で作成されるロールに何の疑問も持たなかった事が原因ですね。私は悲しい。
Vuetify2.0のBeta版を使ってみる

Vuetify2.0を試してみたところVuetify1.5系のコードを持って行ったら全然動かなかったのでVuetify2.0を使う上で書き換えなければいけない部分を現時点で調査ができてる範囲でレポート

####[公式ドキュメント](https://next.vuetifyjs.com/ja/getting-started/quick-start)
まずこれが全然参考にならないのが大きな関門。サイトドメインはnext.vuetifyjs.comとなっているけれどもどうやらその内容の大半は1.x系の内容のコピーからアップデートされていない様子

####[githubのリリースノート](https://github.com/vuetifyjs/vuetify/releases)
どうやらこれが正規の以降ガイドな模様

```diff
const opts = { ... }
-Vue.use(Vuetify, opts)
+Vue.use(Vuetify)
-new Vue(...).$mount('#app')
+new Vue({
+  vuetify: new Vuetify(opts)
+}).$mount('#app')
```
こんな風にオプション情報の指定方法を変えろとの事

またテーマについても

```diff
const opts = {
-  dark: true,
  theme: {
-    primary: '...',
+    dark: true,
+    themes: {
+      light: {
+        primary: '...',
+        ...
+      },
+      dark: {
+        primary: '...',
+        ...
+      }
+    }
  }
}
```

の様にprimaryなどの定義はthemes > light,darkの中に定義しろとの事

ただしこれでも上手くいかない
ブラウザコンソールでエラーを確認したところv-appが定義されてないみたいなエラー

githubのリリースノートにたどり着く以前に試した

```
  components: {
    VApp,
  },
```
をoptsに追記してみるがこれもダメ

というか実はこの書式はVue.use(Vuetify...に以下の様に配置した場合themeカラーは使えなかったものの
ボタン表示まではできていたので再度componentsだけこっちに移動

```
Vue.use(Vuetify, {
  components: {
    VApp,
  },
}
```


全体としては以下の様に書けば動作した

```js:main.js
import Vue from 'vue'
import App from './App.vue'
import colors from 'vuetify/es5/util/colors'
import 'vuetify/dist/vuetify.min.css'

import Vuetify, {VApp,VBtn} from 'vuetify/lib'
const VuetifyComponents = {
  components: {
    VApp, VBtn,
  },
}

Vue.use(Vuetify, VuetifyComponents)

const opts = {
  theme: {
    dark: false,
    themes: {
      light: {
      },
      dark: {
      }
    }
  }
}

new Vue({
  vuetify: new Vuetify(opts),
  render: h => h(App),
}).$mount('#app')
```
```vue:App.vue
<template>
  <v-app>
    <div class="text-xs-center">
      <v-btn color="primary">Primary</v-btn>
      <v-btn color="secondary">Secondary</v-btn>
      <v-btn color="accent">Accent</v-btn>
    </div>
  </v-app>
</template>
```
opts.theme.dark===falseの場合
![img_20190530_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314532/de36043d-0e61-0f99-2269-c786d13a2d64.png)

opts.theme.dark===trueの場合
![img_20190530_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314532/d1e3eee9-b9bd-9c5c-31d8-98f122ee6ae5.png)

opts.theme.dark===falseでthemesを以下の様に変えてみた場合

```js
    themes: {
      light: {
        primary: colors.green.base,
        secondary: colors.green.darken4,
        accent: colors.purple.base,
      },
...
```
![img_20190530_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314532/5831583a-49f5-1ff3-a00b-cfb50c646265.png)

最初の触りとしてこれまでできれば移行は視野に入れられるのかなという感じ
Realmでenumを使うときメモ

# 結論
privateプロパティのときは@objcMembersを書いていても@objcを書かないとだめ

これでいけそうだけどだめで

```swift
@objcMembers
class Phone: Object {
    
    dynamic var name = ""
    private dynamic var osTypeRawValue = "" // privateの場合は@objcMembersを書いてあってもこれじゃだめ
    var type: OSType {
        get { return OSType(rawValue: osTypeRawValue) ?? .undefind }
        set { osTypeRawValue = newValue.rawValue }
    }
    
    enum OSType: String {
        case ios
        case android
        case undefind
    }
}
```

こうするとOK

```swift
@objcMembers
class Phone: Object {
    
    dynamic var name = ""
    @objc private dynamic var osTypeRawValue = "" // @objcを明示的につける
    var type: OSType {
        get { return OSType(rawValue: osTypeRawValue) ?? .undefind }
        set { osTypeRawValue = newValue.rawValue }
    }
    
    enum OSType: String {
        case ios
        case android
        case undefind
    }
}
```

こんな感じでenumが使える

```swift
let phone = Phone()
phone.type = .ios
```
ProtegeからOracleデータベースへ接続する手順

# はじめに
Oracle社ではProtege(OSSのオントロジー編集ツール)に対してプラグインを提供しています。
このプラグインを利用することでProtegeからOracle Databaseへ接続し、RDF形式のファイルをロードしたり、SPARQLでの問い合わせの実行など様々な操作が行えます。

# 手順
###環境情報
Protege 5.2.0
Windows 10
Oracle Database 18c

###WindowsPCにProtegeをインストール
Protegeを以下のサイトからダウンロードします。
https://protege.stanford.edu/
*Oracleプラグインが対応しているVersionが5.2.0までのため、
 今回はOlder Versionsから5.2.0をダウンロードします。

ダウンロードしたzipファイルをunzipしておきます。

###Oracleプラグインのダウンロード
プラグインを以下のサイトからダウンロードします。
https://www.oracle.com/technetwork/database/options/spatialandgraph/downloads/index-156999.html
今回は最新のプラグインを使用するため
「Download Oracle Database 19c Support for Apache Jena 3.1.0, Apache Jena Fuseki 2.4, and Protégé Desktop 5.2」 をクリックします。

ダウンロードしたフォルダ内の「protege_plugin」へ移動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217525/19e515e7-5a4a-503d-b2c4-af3ac17a4e9e.png)

「OraclePlugin-19c.jar」をコピーします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217525/03e5d95b-33ec-b7b6-e4f6-73fc64bc073a.png)
先ほどunzipしたprotegeフォルダ内の「plugins」へ移動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217525/33951174-6a2f-8b32-4f42-46c18345568e.png)
フォルダ内へコピーしたプラグインを入れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217525/46e54efc-4a6e-bcfd-2626-74e1baf0f09e.png)

###Protegeの起動
Protege.exeを押し、Protegeを起動します。
上部のタブに「Oracle」が追加されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217525/97d911b4-4a24-63e2-89d9-7223d74b7507.png)

「Switch Database」を選択し、Oracle Databaseへの接続情報を入力します。
接続完了すると「Successfully connected to the Database」と表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217525/b2aef969-08c3-3675-5cfe-c3b5ec8cf6d0.png)

注：Oracle DatabaseにRDF形式のデータを格納するためには
Spatial and Graphオプション機能を有効化する必要があります。
詳細はOracle社のマニュアルをご参考ください。
https://docs.oracle.com/cd/E96517_01/rdfrm/enabling-downgrading-removing-rdf.html#GUID-D2F1EC6E-09A6-4845-A9E2-5EA2633F318E
Javaの配列の初期化方法

いろいろな宣言&初期化方法があるので、コンパイルエラーになるものならないものを洗い出したものです。

```java:
public class A {

	public static void main(String[] args) {
		/* 一次元配列 */
		int[] ary = new int[3];
		int ary2[] = new int[3];
		int []ary3 = new int[3];
		
		int ary4[];
		ary4 = new int[3];
		
//		int ary4[];
//		ary4 = {1, 2, 3};  #=> コンパイルエラー
		
		int ary5[] = {1, 2, 3};
		int ary6[] = new int[] {1, 2, 3};  // 型を明示して初期化
//		int ary7[] = new int[3] {1, 2, 3};  #=> コンパイルエラー
		
		/* 二次元配列 */
		int[][] ary8 = new int[3][3];
		int ary9[][] = new int[3][3];
		int []ary10[] = new int[3][3];
		int[] ary11[] = new int[3][3];
		int [][]ary12 = new int[3][3];
		
		int ary13[][] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
	}
}
```
Goでhtmlメール自動送信

# 1. はじめに
誰かにhtmlメールを送信するサービスはたくさんありますが、SMTPやhtmlメールの
テンプレートなど、参考になるサイトがいくつかあり、意外に自分で作れるかもと思い、作ってみました。

# 2. コード
完成したコードはgithubに置いてます。
https://github.com/koki-iwaizumi/html_email

※GoのDB周りはxormを使っています。

# 3. 処理の流れ
①MySQLに保存してあるユーザ情報を取得（const EMAIL_TARGET_STATUSとjintoカラムが一致するユーザーを取得）
②メールテンプレート作成
③ユーザー毎にメールの文言修正後、SMTPでメール送信
④全員にメール送信したら、コンソール上で'PRESS Y'と表示されるので、'Y'を押しエンターを押すと終了

# 3. 使い方

1. MySQLに下記を登録します。

```SQL:person.sql
CREATE TABLE IF NOT EXISTS `person` (
	`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
	`company` varchar(255) NOT NULL DEFAULT '',
	`email` varchar(255) NOT NULL DEFAULT '',
	`name` varchar(255) NOT NULL DEFAULT '',
	`honorific` varchar(255) NOT NULL DEFAULT '',
	`post_h` varchar(3) NOT NULL DEFAULT '',
	`post_l` varchar(4) NOT NULL DEFAULT '',
	`prefecture` varchar(255) NOT NULL DEFAULT '',
	`address_h` varchar(25) NOT NULL DEFAULT '',
	`address_l` varchar(25) NOT NULL DEFAULT '',
	`jinto` varchar(10) NOT NULL DEFAULT '',
	`saibaru` varchar(10) NOT NULL DEFAULT '',
	`created` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
	PRIMARY KEY (`id`),
	UNIQUE KEY `company` (`company`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `person` (`id`, `company`, `email`, `name`, `honorific`, `post_h`, `post_l`, `prefecture`, `address_h`, `address_l`, `jinto`, `saibaru`, `created`) VALUES
(1, 'test_company', 'info@test.test', 'testname', '様', '111', '1111', 'prefecture', 'address_h', 'address_l', '未送信', '未送信', '2019-05-14 23:21:54');
```

2. email設定の変更 main.go

```Go:main.go
const (
	EMAIL_HOST                = "*"
	EMAIL_PORT                = "*"
	EMAIL_USER                = "*"
	EMAIL_PASSWORD            = "*"
	EMAIL_FROMNAME            = "*"
	EMAIL_FROMADDRESS         = "*"
	EMAIL_SUBJECT             = "IoTデータロガーのご紹介！"
	EMAIL_PATH                = "view/email.html"
	EMAIL_TARGET_STATUS       = "未送信"
	EMAIL_TARGET_STATUS_AFTER = "メール送信済み"
)
```

3. db設定の変更 model/base.go

```Go:model/base.go
const (
	MODEL_DRIVER   = "mysql"
	MODEL_USER     = "*"
	MODEL_PASSWORD = "*"
	MODEL_NAME     = "*"
)
```

4. 実行！

`$ go run main.go`

# 5. 参考にしたサイト

htmlメールは下記のサイトを参考にさせていだきました。
https://blog.kannart.co.jp/coding/1093/

SMTPに関しては下記を参考にさせていだきました。
https://qiita.com/cyabane/items/b0cbc9bc7526c56f5724
react nativeで日本語が見切れてしまう

react nativeを0.59.8に、android SDKを28にあげたら文字が見切れるようになってしまいました。


``` App.js
<View>
    <View style={{ borderWidth: 1 }}>
        <Text>aaaaaaaaaa{"\n"}aaaaaaaaaa{"\n"}aaaaaaaaaa{"\n"}aaaaaaaaaa</Text>
    </View>
    <View style={{ margin: 10 }} />
    <View style={{ borderWidth: 1 }}>
      <Text>ああああああああああ{"\n"}ああああああああああ{"\n"}ああああああああああ{"\n"}ああああああああああ</Text>
    </View>
</View>
```

![before.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328388/04eddd37-135e-10f1-80a3-20d645d66ff3.png)
英語も日本語も4行表示してますが日本語の方は4行目が切れてしまってます。
バージョンを上げる前は問題なかったのに…
ちなみにiOSはちゃんと4行表示されてました。


早速react nativeのissueを漁ると……ありました。
https://github.com/facebook/react-native/issues/24465

どうやらマルチバイト文字のlineHeightがおかしいらしい。
コメント通りに`lineHeight: fontSize*1.5`を設定してみると…
![after.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328388/e89e994c-8e05-562a-4087-b37c95ab7aed.png)
ちゃんと4行表示されました。
iOSでも確認しましたが表示に変化はありませんでした。

バグとして認識してもらってるので後々修正されると思いますが、それまではこれで回避することにします。
最適化オプションをつけて、autoでハマった例 

# まとめ
自作のプログラム中にこんなバグを作っていたという記録です。発生条件は、

 - auto で変数を定義して、その後にコンストラクタの足し算をしている。
 - -O3 オプションをつけた

便利だからといってauto, autoとつけてはいけないと反省。



## コード
```cpp:eigen.cpp
#include <Eigen/Dense>
#include <iostream>
int main ( int argc, char** argv ) {
  Eigen::Vector3i p0 (-5, -3, -2);
  Eigen::Vector3i p1 (1, 1, 1);
  Eigen::Vector3i p2 = p0 - p1;
  std::cerr<<p2.transpose()<<std::endl;
  auto p3 = Eigen::Vector3i(-5, -3, -2) - Eigen::Vector3i(1, 1, 1); // ここ
  std::cerr<<p3.transpose()<<std::endl;

  auto p4 = p0 - p1;
  std::cerr<<p4.transpose()<<std::endl;

  return 0;
}
```
## 実行結果
実行環境は、Mac (Mojave) + Apple LLVM (10.0.1)
### 最適化なしだと
```console: 
$ g++ -I/usr/local/include/eigen3 -std=c++1z  eigen.cpp
$ ./a.out 
-6 -4 -3
-6 -4 -3
-6 -4 -3
$
```
### -O3つけると
```console: 
$ g++ -I/usr/local/include/eigen3 -std=c++1z -O3 eigen.cpp
$ ./a.out 
-6 -4 -3
      -24         0 188736771
-6 -4 -3
$
````
Rails Missing host to link to! のエラーが出た時　

##Missing host to link to! Please provide the :host parameter, set default_url_options[:host]

Railsでサービスを開発している[ホリカワ](https://twitter.com/jonnyjonnyj1397) です。

ついに開発環境で一通り終え、本番環境にデプロイしたら上記のようなエラーが出ました。

ようは確認URLを渡すメールが送れない、というエラーです。

##解決方法

https://easyramble.com/missing-host-to-link-to.html
↑こちら参考にさせていただきました、ありがとうございます。

上記のエラーは
「hostが見つからないので、default_url_options[:host]を指定してくれ」
ということなので、以下のようにすれば解決します。

```config/production.rb
...
config.action_mailer.default_url_options = { host: 'example.com'}
...
```
文字かっこいいやつ

#バグってたらごめんなさい


##メモ帳に張り付けて.htmlでみれる


```
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<style>
body{
    background: #2561c1;
}
p{
    margin: 0px;
}
.rogo{
    width: 400px;
    height: 200px;
    text-align: -webkit-center;

    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
    margin: auto;
}
@keyframes typing { from { width: 0; } }
@keyframes caret { 50% { border-color: transparent; } }

.rogo_text {
    color: #fff;
    margin-top: 10px;

    font-family: monospace;
    width: 13ch;
    border-right: .08em solid;
    overflow: hidden;
    font-size: 4em;
    white-space: nowrap;
    animation: typing 5s steps(13, end), caret .5s step-end infinite;
}
</style>
<body>

    <div class="rogo">
        <p class="rogo_text">Quantum Group</p>
        <p class="rogo_text">QUANTUM GROUP</p>
    </div>
    
</body>
</html>

```
【PowerApps】コレクションをそのままデータソースにコピーする。

皆さんご存知の通り、PowerAppsのアプリでデータソースにデータを書込み編集する時に数秒時間が掛かります。

何度も続けて書込む場合はアプリの使い勝手が悪いです。

そこでアプリのOnStart属性でそのデータソースを丸ごとコレクションに入れて端末内で編集をして、後でまとめてデータソースを更新すると良いです。数式はこんな感じになります。

```ruby:App.OnStart
 Collect(ProductMasterCol,Tbl_ProductMaster)
```
ちなみにこの例ではTbl_ProductMasterがデータソースで、そのデータをそのままProductMasterColと言うコレクションに入れています。

これで列名は全く同じになり、オフラインでも使えてとても便利です。しかし、その間他の人はそのデータソースにアクセスしないのが前提です。

しかし、Collect関数はその逆は出来ません。つまり、作業が終了し、コレクションをそのままデータソースにコピーしたい時にそれが出来ないのです。

そこで試行錯誤の末、下の式で実現出来ました。出来た時はかなり嬉しかったです。

```ruby:OnSelect

    ForAll(
        RenameColumns(
            ProductMasterCol,
            "Product_ID",
            "Product_ID2"
        ),
        Patch(
            Tbl_ProductMaster,
            If(
                CountIf(
                    Tbl_ProductMaster,
                    Product_ID = Product_ID2
                ) = 0,
                {Product_ID: Blank()},
                LookUp(
                    Tbl_ProductMaster,
                    Product_ID = Product_ID2
                )
            ),
            LookUp(
                ProductMasterCol,
                Product_ID = Product_ID2
            )
        )
    )
```

ポイントは二つあります。最初のRenameColumns関数と真ん中辺でCountIf関数のあるIf文の部分です。

最初、RenameColumns関数を使わずにその後の行で

```
Product_ID = Product_ID
```
とやってたのですが、PowerAppsが違いを把握出来ないのか上手くいきませんでした。RenameColumns関数で列名を変えた事で上手くいったのです。

次のポイントのIf分はコレクションでレコードを追加した時にこのIf分で、ソースデータ内にProduct_IDが存在してたらそのレコードを探してPatchをし、存在しなければ新しいレコードを作成しています。

このIf分が無いとそのコレクション内で追加されたレコードはソースデータに追加されません。
CodeBuildの中でブランチ名を利用する。

# きっかけ
CodeBuildの中でブランチ名を取得し、
Dockerレジストリにプッシュしようとしたらうまくできなかった。

```
[Container] 2019/05/30 03:11:39 Running command IMAGE_TAG=$(git branch | grep \* | cut -d ' ' -f2) 
 
[Container] 2019/05/30 03:11:39 Running command git branch 
* (no branch) 
  develop 
  master 
```
oh...
no branch...

# 取得方法
githubのwebhookからブランチ名が取れるので、それを活用した。

参考：
https://docs.aws.amazon.com/ja_jp/codebuild/latest/userguide/build-env-ref-env-vars.html

環境変数[CODEBUILD_WEBHOOK_TRIGGER]は、ブランチにコミットをプッシュした場合、
[branch/branch-name]といった形で設定が入るらしい。

以下の通り変数を参照すると、ブランチ名だけ取り出せる。

```
${CODEBUILD_WEBHOOK_TRIGGER#branch/}
```
※[#branch/]は環境変数から、文字列[branch/]を取り除くために書いています。

この通り

```
[Container] 2019/05/30 04:34:54 Running command IMAGE_TAG=${CODEBUILD_WEBHOOK_TRIGGER#branch/} 
 
[Container] 2019/05/30 04:34:54 Running command echo ${CODEBUILD_WEBHOOK_TRIGGER#branch/} 
develop 
```
【解説付き】IntelliJ IDEAでpropertiesファイルの文字化け表示を直す方法(Mac)

## propertiesファイルを開いたら、日本語が文字化けしていた。
IntelliJ IDEAで開くと
<img width="514" alt="スクリーンショット 2019-05-30 11.06.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78136/a45e618f-e315-fca0-ee8a-e5958bf73953.png">
のように、propertiesファイルが文字化けていた。

## 手順
### メニューバーでInteliJ IDEAタブから、Preferencesをクリック
<img width="189" alt="スクリーンショット 2019-05-30 11.06.45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78136/1b902a9f-ed37-519e-d88d-c7e23beee007.png">
### File encodingsで Transparent native-to-ascii conversionのチェックボックスをクリック
<img width="600" alt="スクリーンショット 2019-05-30 11.06.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78136/60956aaa-a545-5cdb-8075-181395a0696d.png">
OKを押すと、エディタ上でも文字化けが解消されている

# 解説
## propertiesファイルがなぜ文字化けするのか
**文字コードが[ASCIIコード](http://e-words.jp/w/ASCII.html)に変換されて保存されている**ため。
ASCIIコードは日本語は含まれないので、UTF-8等で入力したものを[
native2ascii](https://docs.oracle.com/javase/jp/8/docs/technotes/tools/windows/native2ascii.html)というツールを使ってASCIIコードに変換して保存されている。
**文字コードが違うのではなく、変換された文字列**なので、**どの文字コードに設定しようが日本語で正しく表示することは出来ない**。
**表示するためにはnative2asciiで再変換する必要がある**。(下の図を参照)

### ASCIIとは
文字コードの一つ。
アルファベット、数字、記号、空白文字、制御文字が登録されている。
日本語は含まれていない。英語圏で生まれたことが一番の理由。

### ASCIIは日本語含まれていないから文字化けしているの？
勘違いされがちだが、違う。
propertiesファイルに日本語を登録する際(UTF-8などで入力した場合)、[
native2ascii](https://docs.oracle.com/javase/jp/8/docs/technotes/tools/windows/native2ascii.html)というJavaのツールでASCIIに変換して保存している。

### native2asciiなんてコマンド普段叩いていないけど？
大抵はIDE(統合開発環境)が自動でやってくれている。
日本語で入力すると、ASCIIに変換されて保存されている。

## 設定を変えるとなぜ正しく表示できるようになるのか
### native2asciiによる透過的な変換がされるようになるため
「Transparent native-to-ascii conversion」を有効にすると、Intelijがpropertiesファイルの操作時にnative2asciiを走らせ、UTF-8⇆ASCIIの変換を自動で行ってくれる。
![intelji.ASCII.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78136/b218fd49-354d-964a-1f60-56f84adb9e2e.jpeg)
### propertiesファイルを入力、保存する場合
エディタ上では、デフォルトではUTF-8で表示、入力ができるようになっている。
このファイルを保存する場合、Intelijが自動的にnative2asciiを走らせ、ASCIIコードに変換して保存してくれる。

### propertiesファイルを表示する場合
propertiesファイルをそのまま読み込むとASCIIコードのままのため文字化けしてしまうが、
Intelijが自動的にnative2asciiを走らせることでUTF-8に変換され表示される。

# そもそもUTF-8でpropertiesファイルを管理したい
ASCIIコードで保存しなくてはならないのは、**propertiesファイルを読み込むJava側の処理がASCIIコードであることを前提にしているから**である。
読み込む側の処理を変更し、UTF-8で書かれたpropertiesファイルを読み込むようにすることもできる。
参考:[Java のプロパティファイルは UTF-8 エンコーディングで記述したい](http://blog.k11i.biz/2014/09/java-utf-8.html)
【エディタ拡張】各コンポーネントが持っているシリアライズされたフィールド名を表示する画面を作ってみた

#概要

Editor拡張でシリアライズされたフィールドにアクセスして変更するには、以下のような処理の手順を踏む必要があります。

```c#

//エディタ拡張で編集しやすいデータ形式にする
var serializedObject = new SerializedObject(GameObjectやComponentなどのインスタンス);

//データの内容が古いままのこともあるので一旦最新の状態にする
serializedObject.Update();

//変更したいシリアライズフィールドの値を取ってくる
serializedObject.FindProperty("探したいシリアライズされたフィールド名");

//シリアライズフィールド値の変更
//---何かしらの変更処理

//変更内容の更新
serializedObject.ApplyModifiedProperties();

```

シリアライズされたデータを変更するにはそのインスタンスが持っているシリアライズされたフィールド名が何かを調べないと変更が出来ないので、今回はコンポーネントを例に一括でフィールド名を表示出来るようにしてみました。

#実装

処理の流れは以下のようになっています。

1.メニューから専用の画面を開く。
2.D&Dで確認したいコンポーネントのインスタンスを入れる。
3.一覧画面に変更できるフィールド名が表示される。

処理の中身はコメントで補足しております。

```c#
using UnityEditor;
using UnityEngine;

public class SerializedPropertyNamePreviewWindow : EditorWindow
{
    private Component _previewComponent;
    private Vector2 _scrollPos;

    [MenuItem("Window/SerializedPropertyNamePreviewWindow")]
    private static void Open()
    {
        GetWindow<SerializedPropertyNamePreviewWindow>();
    }

    private void OnGUI()
    {
        _previewComponent =
            EditorGUILayout.ObjectField("確認したいコンポーネント", _previewComponent, typeof(Component), true) as Component;

        if (_previewComponent != null)
        {
            EditorGUILayout.LabelField("プロパティ一覧");

            //所持しているプロパティ名の一覧表示
            using (var scrollScope = new EditorGUILayout.ScrollViewScope(_scrollPos, GUI.skin.box))
            {
                var serializedObject = new SerializedObject(_previewComponent);
                var iterator = serializedObject.GetIterator();
                while (iterator.NextVisible(true))
                {
                    EditorGUILayout.LabelField(iterator.propertyPath);
                }

                _scrollPos = scrollScope.scrollPosition;
            }
        }
    }
}
```

#改善したい所

現状だと確認したいコンポーネントのインスタンスを生成する必要があって、そこが少しめんどくさいかなーと感じました。
どうにかインスタンスを使わずにType型でやり取りできたらなーいいなーとぼんやり考えていたりしますが、調べた限りできなさそう…。
お詳しい方がいればご教授いただけると幸いです。

#参考

[第5章　SerializedObject について]("https://anchan828.github.io/editor-manual/web/serializedobject.html")
[【Unity】【エディタ拡張】エディタからシリアライズされたフィールドの値を更新する方法まとめ]("http://light11.hatenadiary.com/entry/2018/07/26/001612")
Unity2018へのアップデートでTextMeshProのエラー

発生し得るエラーは複数あります。
まずは公式が推奨する手順でアップデート作業をしましょう。

## アップデート手順
[ここ](https://forum.unity.com/threads/migrating-from-legacy-asset-store-to-package-manager-releases.511748/)を参照してアップデート作業をします。

#### アップデート前の準備
最も重要な注意点としては、**アップデートを始める前に全てのSceneを閉じてPrefabやTextMeshProがSceneから読み込まれないようにしておく** ことです。

空のSceneを開いて他のSceneを閉じ、プロジェクトを保存しましょう。

そしてプロジェクトのバックアップも忘れずに。

#### アップデート
自分は 2017.4.17f1 → 2018.4.0f1 とアップデートしました。

#### TextMeshProが重複してるエラー

```
Multiple plugins with the same name 'tmpro_plugin' (found at 'Packages/com.unity.textmeshpro/Plugins/64 Bit Plugins/TMPro_Plugin.bundle' and 'Assets/TextMesh Pro/Plugins/64 Bit Plugins/TMPro_Plugin.bundle'). That means one or more plugins are set to be compatible with Editor. Only one plugin at the time can be used by Editor. UnityEditor.EditorApplication:Internal_CallGlobalEventHandler()
```


2018.4で開くとTextMeshProが競合しているエラーが表示されます。
そこで、古いAsset配下のTextMeshProを削除します。

ここでの注意点は、**フォントアセットやSpriteなどの自分で作ったリソースは退避** しておきましょう。

正しくエラーが解消されればそのまま使えます。

#### TMproが参照されないエラー

本来ならば Windowタブに TextMeshPro > Window - TextMeshPro - Project Files GUID Remapping Tool が表示をされ、このツールを使えば古いTextMeshProの参照が新しいものに入れ替えられるのですが、そもそもWindowタブにTextMeshProがなく、Consoleには次のエラーが表示されました。

```
The type or namespace name 'tmpro' could not be found
```

自分は[ここ](https://forum.unity.com/threads/migrating-from-legacy-asset-store-to-package-manager-releases.511748/page-4#post-3528465#157)を見て、エディタをVS Codeに変更したら解消しました。

エディタの切り替えはPreferrences>External Script Editorから。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237014/8b0b5079-b7d5-eb90-b01b-fe8ee806743c.png)

原因は完全には分かってませんが、VisualStudioがパッケージを上手く参照できずに発生してたエラーのようです。

改めてTextMeshPro > Window - TextMeshPro - Project Files GUID Remapping Tool を使ってTextMeshProの参照を直します。

その後、自分は再び使うエディタをVisualStudioに戻しました。
エラーは発生しませんでした。

VisualStudioのバージョンが異なったり、MacではなくWindowsだと発生しないか、復旧手順が異なるかもしれません。


## 自分の環境

MacOS10.14.4
Visual Studio 2019 for Mac
Unity2017.4
→Unity2018.4
EC2上でCannot create cache directory

私の場合はEC2上で`composer i`を実行すると発生。
権限がなさそう。



```
Cannot create cache directory /home/ec2-user/.cache/composer/repo/https---repo.packagist.org/, or directory is not writable. Proceeding without cache
Cannot create cache directory /home/ec2-user/.cache/composer/files/, or directory is not writable. Proceeding without cache
```
※`/home/ec2-user/.cache/composer/composer`は環境によるので注意

同じ現象と答え
[Cannot create cache directory .. or directory is not writable. Proceeding without cache in Laravel Ask Question](https://stackoverflow.com/questions/35874482/cannot-create-cache-directory-or-directory-is-not-writable-proceeding-withou/37200737#37200737)
[Cannot create cache directory in Laravel](https://stackoverflow.com/questions/39191257/cannot-create-cache-directory-in-laravel?rq=1)

## 解決

ディレクトリの所有権を変更。
※環境による

```shell
sudo chown -R ec2-user /home/ec2-user/.cache/
```
プログラミングが上達しないと感じた時に実施した対策

#この記事を読んでほしい対象者

- プログラミング初学者
- プログラミングがなかなか身につかない
- 勉強方法がわからない
- 作りたいものが特にない

そう思っている人向けです。

(自分は最近まで上記全て当てはまっていた。)


プログラミングバリバリ組めるよ！
ちゃんと上達してるよ！
という方はからしたら当たり前のことが書いてあると思います。
もし気になったら読んでいただければ嬉しいです。

##きっかけ
約1ヵ月、ほぼ初学者のような状態でプログラミングの勉強を本格的に始めた。
勉強方法はというと、

- サンプルコードを写す・読むだけの書籍学習
- ドットインストールを見よう見まねで同じもの作る
- paizaで問題を解く(せいぜいCランクまで...)

正直、全然身につかなかった。

##対策(前編)
この状況をなんとかせねば！と思いました。
「プログラミング　できない」とまぁシンプルな調べ方をすると、ヒットしたとある記事。

[プログラミング出来ない奴ちょっと来い](https://anond.hatelabo.jp/20130322031333)
この記事を見て、自分がいかに効率の悪い勉強をしていたか反省。
とてもいい記事だからぜひ読んでほしい。

主に書いてある内容
> 1.エラーをたくさん出す
> 2.デバックの仕方を覚える
> 3.小さく動かして確かめる
> 4.Google を使い倒す

これ、実は書籍学習や動画を見て勉強しているだけではやらない内容。

##目的と手段
話がそれるようだが、プログラミングを勉強したい理由を今一度考えてほしい。

「作りたいものがある！！」という人はとてもいいと思う。
その場合、こうなる↓
目的：XXを作る(プログラミングで作れる何か)
手段：なんらかしらの言語

自分の場合そうではなかった。

- プログラミングが出来るようになりたい
- IT業界で働きたい
- XXの言語を習得したい

割とこの３つがメインだった。
そういう人は他にもいるのではないかと勝手に思っている。

ただ、これ実は成長が遠回りになりがちなのではないかと思う。
そう思う理由は、目的が具体的でないから。

**プログラミングが出来るようになりたい！**
**だから勉強しよう**

**IT業界で働こう！**
**そのために勉強しよう**

**XXの言語を習得したい！**
**その言語の勉強をしよう！**

こうなりがち。。
(自分がそうだった)

これを作りたい！というものがある場合は目的と手段がわかりやすいが、
上に書いた３つのような理由の人は目的と手段がごっちゃになりやすい。

##対策(後編)
話はそれた？が、ここからがタイトルに書いてある「プログラミングが上達しないと感じた時に実施した対策」の話になる。

早速、まず何をしたかというと、
**「作りたいか作りたくないかは置いておいて作るものを決める」**
これ一択。

作るものさえ決めれば、あとは一瞬。

今まで本を読み切ることを目的にしていた書籍学習が、作りたいものを作るための書籍学習に変わった。
今までなんとなく見ていたプログラミングに関する動画が、作りたいものを作るために参考になる内容かどうかという視点で見るようになった。
今までなんとなく続けていた勉強が、作りたいものを作るために試行錯誤する楽しい時間になった。

勉強する目的が決まってないと、本当にダラダラ勉強するしかなくなってくる。
そうするとモチベーションが下がり、身に付かず、「こんなにたくさん勉強しているのになんで？」という不満に繋がる。

###作りたいものを決めよう

- ECサイト
- ブログサイト
- 日記ツール
- TODOリスト
- SNS

（あくまでWebの場合の例）

なんでもいいから作りたいものを決めよう！
もし、作りたいものがなくて決まらない！！！なら、作りたいものを決めるためのツールを作ったっていい。
ランダムに数字が決まる関数を使って、「１ならECサイト」「２ならブログサイト」...という風に表示できる機能を備えたもの。
そんな簡単なものでも自分で考えて１から作ったなら立派な作品だ。
徐々にクォリティを上げていけばいい。

大事なのは、

- 自分で考える力
- 困った時に調べて解決する力
- 作りたいものを作るにはどうすればいいかと問題に向き合う力

それができると自然に、
どうやったらもっと簡単に作れるだろう？
他にもこんなの作りたい！
これを実現するためには何が必要？
とどんどん考えるようになる。

きっとその考えが、エンジニア・プログラマーには必要なんだと思う。

##そして実際に作ったもの

一人で何も作れない。
コードがかけない。
手順がわからない。
と思っていた自分でもこんなのを作ることができた！

<img width="752" alt="スクリーンショット 2019-05-30 13.01.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264408/16f38a6a-ccdd-5502-79cd-ccea45d7a7f3.png">

内容を追加、編集、削除
するだけの超超超簡単な考えてることを呟こうというアプリ！

ダラダラなんとなく勉強しているだけの自分には作れるとも思っていなかった。


##最後に
自分は本や動画に頼りっきりで、「自分ひとりで何か作る」ってなったらどうしていいのかわからなかった。
本に書いてある内容、動画で行われている処理が何をしているのかはわかる。
でも自分では何も作れない。
本当にそういう状態だった。

特に作りたいものもなかった。
ただプログラミングができるようになりたい。
エンジニアになりたい。
そう思っていた。

エラーを見るのが怖かったし、１から何も見ずに作ることが本当に不安だった。
でも、作りたいものさえ決めればそれを作るために頑張るだけだから目的が明確になってそのための勉強がすごく捗った。

自分のように目的が具体的ではない人は特に作るものをまず決めて欲しいと思う。



まずは簡単なものを作って徐々に今はまだ難しいものをいずれ作れるようになればいい。
もしくは初めに最低限の機能を持ったものを作って、後から機能をどんどん追加しても楽しいと思う。

物作りは楽しいから、なんとなくの勉強ではなく目標を持って作りたいもののための勉強をして欲しいと思う。
成長スピードが全然違うから。
一緒に頑張ろう！

Qiitaでのはじめての投稿でした。
Twitterでなんとなくこんな内容書いたけど、こっちでしっかり書いて備忘録としても残しておこうと思った。

拙い文章だけど最後まで読んでいただきありがとうございました。
jQuery : a self Implemetation 

```html:jquery.html
<html>
<header>
<script>
var $ = function(selector, context) {
    return new $.fn.init(selector, context);
};

$.fn = $.prototype;

$.fn.init = function(selector, context) {
    var nodeList = (context || document).querySelectorAll(selector);
    this.length = nodeList.length;
    for (var i = 0; i <
        this.length; i += 1) {
        this[i] = nodeList[i];
    }
    return this;
};

$.fn.init.prototype = $.fn;

$.fn.each = function(fn) {
    var i = 0,
        length = this.length;
    for (; i <
        length; i += 1) {
        fn.call(this[i], i, this[i]);
    }
    return this;
};

$.fn.hide = function() {
    this.each(function() {
        this.style.display = "none";
    });
};

$.fn.show = function() {
    this.each(function() {
        this.style.display = "block";
    });

};

$.fn.toogle = function() {
    that = this;
    var cnt = 0;

    function run() {
        if (cnt > 10) {
            clearInterval(myInterval);
            return;
        }
        cnt++;

        that.each(function() {

            if (this.style.display == "block") {
                this.style.display = "none";
            } else {
                this.style.display = "block";
                this.value = cnt;
            }

        });
    }
    myInterval = setInterval(run, 1000);
};

window.onload = function() {
    $("input").toogle();
}
</script>
</header>
<body>
<input id="111" />
<input id="222" />
</body>
</html>
```
https://www.zhangxinxu.com/wordpress/2013/07/jquery-%E5%8E%9F%E7%90%86-%E6%9C%BA%E5%88%B6/
C++ Builder 10.2 Tokyo > TTreeView > マウスオーバーした時のバルーンヘルプのような機能をオフにする

```txt:動作環境
RAD Studio 10.2 Tokyo Update 3
```

### 概要

TTreeView では特定の条件が成立した時にバルーンヘルプのようなものが表示される。

下記の画像で5行目の表示が該当するもの。
![2019-05-30_13h06_14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32870/6777926a-b6ad-deae-ea69-84092499328a.png)
 
ある文字数を超えるとこの機能が発現する。
よくわからないUIだ。

### 関連コード

下記で動作させている。

```Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
	for(int loop=0; loop<20; loop++) {
		TreeView1->Items->Add(NULL, L"0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789");
	}
}
//---------------------------------------------------------------------------
```

### 機能のオフ

- オブジェクトインスペクタ
    - プロパティの「ToolTips」をfalseにする

### 機能オフ後

![2019-05-30_13h05_46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32870/e6e5bd6f-3d05-743c-b073-7a0a379e994d.png)

中途半端な表示がされなくなった。

### ToolTipsプロパティ

下記はドキュメントが古いが参考にはなるだろう。

- http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/ComCtrls_TTreeView_ToolTips.html


### 検索用キーワード

- Balloon Help
Promiseを使ってループで直列実行する

## 直列動作のサンプル
```js
function PromiseMaker(i) {
    return function() {
      return new Promise(function(resolve, reject) {
        setTimeout(function(){ 
            console.log("i:" + i);
            resolve();
         }, 100);
      });
    }
};


var p = Promise.resolve();
for(var i=0; i < 15; i++) {
    p = p.then(PromiseMaker(i));
}
```

## 動作しないパターン
```js
var p = Promise.resolve();
for(var i=0; i < 15; i++) {
    p.then(PromiseMaker(i));
}
```

### 後者が動作しない理由
p.thenが返すPromiseに対してthenを繋げなければいけないのに、
最初のPromiseに対してすべて繋がってしまっているので、
並列で実行されてしまうということでした。

参考: http://p-baleine.hatenablog.com/entry/2014/03/14/085536

こういった形が必要なければ、素直にawait/asyncやPromise.allを使う方が良いかもしれません…。
probit model (gibbs sampling)

```{r}

#probit model (Gibbs sampling)

library(dplyr)

n=100;m=3

X1=array(0,dim=c(n,m))

for(j in 1:m){
  
X1[,j]=rpois(n,sample(1:2,1))  
  
}

X2=array(0,dim=c(n,m))

for(j in 1:m){
  
X2[,j]=rpois(n,sample(20:30,1))  
  
}

y=c(rep(1,n),rep(0,n))

X=rbind(X1,X2)

data=cbind(X,y)

n=2*n


z=rpois(n,7)

library(mvtnorm)

ite=10000

precision=0.1

precision_vec=c()

for(i in 1:ite){
  
  
if(precision<0.98){  

beta=rmvnorm(1,solve(t(X)%*%X)%*%t(X)%*%z,solve(t(X)%*%X))

pi_z=exp(-(z-X%*%t(beta))^2/2)*ifelse((y>0 & z>=0)|(y==0 & z<0),1,0)

mat=X%*%t(beta)

z_past=c();

for(j in 1:n){
  
z_past=c(z_past,rnorm(1,mat[j],1)*ifelse(mat[j]>=0,1,0)*ifelse(y[j]==1,1,0)+rnorm(1,mat[j],1)*ifelse(mat[j]<0,1,0)*ifelse(y[j]==0,1,0))  
  
}


z=z_past

#print(beta)

precision=sum(ifelse((y==1 & z>=0)|(y==0 & z<0),1,0)
)/n

print(sum(ifelse((y==1 & z>=0)|(y==0 & z<0),1,0)
)/n)

precision_vec=c(precision_vec,precision)  

}else{
  
print("stop")  
  
}
  

}


precision_data=data.frame(times=1:length(precision_vec),precision=precision_vec)

plot(precision_data$times,precision_data$precision,type="p",col=2)



```
EC2上でNo space left on device

私の場合はEC2上で`composer i`を実行すると`No space left on device`がでた。
空容量がないらしい。

## 解決
ディスクの容量を確認

```shell
$ df -h

ファイルシス   サイズ  使用  残り 使用% マウント位置
devtmpfs         476M     0  476M    0% /dev
tmpfs            493M     0  493M    0% /dev/shm
tmpfs            493M  784K  493M    1% /run
tmpfs            493M     0  493M    0% /sys/fs/cgroup
/dev/xvda1       8.0G  7.9G    0G   99% /
tmpfs             99M     0   99M    0% /run/user/0
tmpfs             99M     0   99M    0% /run/user/1000
```

確かにダメそう

```
/dev/xvda1       8.0G  7.9G    0G   99% /
```

`/tmp`内の不要ファイルを削除したら`30%`になり、エラーは解決できた。
(rubyのインストールを何度も失敗してゴミが大量にあった)

自分の環境だといらないファイルを削除したら解決したが、インスタンス再起動で解決するらしいです。
[EC2 instance on Amazon and I am greeted with “No space left on the disk](https://stackoverflow.com/questions/6151695/ec2-instance-on-amazon-and-i-am-greeted-with-no-space-left-on-the-disk)