OmniAICreator/Qiita-1.07M huggingface dataset:
エクセルVBAでデータ検索・出力をできるだけ高速化

各所で行っているのに毎回忘れて調べる羽目になるのが面倒になったのでメモ代わりに。
よりよい方法があれば修正を加えていきたい(願望)。

# 修正履歴

  2018/08/30 - 2次元配列を利用

# 経緯

  大量のデータを取りまとめる表エクセルの修正を行おうとして調査した結果、表の中身が全てエクセル関数であった。
  毎回の変更に対応するファイルとしてはあまりにも人力による修正箇所が多量であり、
  それによって多発していたヒューマンエラーを減らそうとVBAの利用を検討。
  ~~エクセルでまとめるのやめたらって思うでしょうけど指定を受けているから……~~

# 結論(2018/08/30時点)

  `Application.ScreenUpdating` ももちろん操作した上で。
  Rangeを2次元配列に落としこんで検索、また出力したいデータを2次元配列で作成してから出力するほうが速い。

```vb:example.bas

    Dim dataSheet As Worksheet: Set dataSheet = Worksheets("dataSheet")    'データが存在するシート

    Dim i, j               As Long
    Dim startRow, startCol As Long
    Dim endRow, endCol     As Long
    Dim rng                As Range
    Dim arr                As Variant

    With dataSheet
        startRow = 1
        startCol = 1
        '指定した列の最終行番号を取得(Endから数えて最初にある行)
        endRow = .Cells(Rows.Count, 1).End(xlUp).Row
        '指定した行の最終列番号を取得(Endから数えて最初にある列)
        endCol = .Cells(1, Columns.Count).End(xlToLeft).Column
        '配列化したい任意の範囲を設定
        Set rng = .Range(.Cells(startRow, startCol), .Cells(endRow, endCol))
        '配列にする
        arr = rng

        '配列は普通に使えばいい
        'ex)回してイミディエイトウィンドウに表示
        ''配列の最小インデックスから最大インデックスまでを回す
        For i = LBound(arr) To UBound(arr)
        ' ↓ でも可    ∵Rangeは必ず(1, 1)からはじまるから
        'For i = 1 To UBound(arr, 1)
            For j = LBound(arr, 2) To UBound(arr, 2)
                Debug.Print arr(i, j)
            Next j
        Next i

    End With

```

# 思考の動き

## Rangeは遅い

   はじめRangeを利用して作成してみた。
   修正箇所はたしかに減ったものの1枚あたりの出力時間が遅い！遅すぎる！
   これならまだエクセル関数を使うほうがマシじゃないか！？

   というわけで考え方が悪いわけではないのでいい方法を模索する。

## `ScreenUpdating` プロパティを操作する

   そもそもまずこれをやってなかった。
   入れるだけで劇的に速くなったものの、もっと速くはならないかと探求を続ける。

## `Worksheet` を変数にセットする

   毎度 `Worksheet("example")` を指定するのはとにかく視認性が低い。
   変数にセットしたほうが速くなる……らしいがあまりわからなかった。しかし見やすいので良。

   `With` を使用すると直接指定したよりも少し遅くなるとの話を聞いたが、視認性には変えられなかった。

## Rangeを2次元配列に

   多少ggればすぐわかることだろうと言われてしまえばそれまでなのだが、ワークシートに値を求めに行くのは大変に遅い。
   出力するセルが少数であればともかく、何万も存在するとわかっている場合は2次元配列でデータを作成し、
   最後にRangeで貼り付けるほうが圧倒的に速い。(いらんデータを省いてるから)

   たぶんもっと速い方法はいくらでもあるのだろうが今回求めていた速さには到達したので一旦ここで考察終了。
【rails5.2】active storageにてｓ3へダイレクトアップロードする際にバケット直下ではなくフォルダを指定したい

## やりたいこと
active storage のデフォルト機能でｓ3へダイレクトアップロードする際にバケット直下ではなくフォルダを指定したい


https://railsguides.jp/active_storage_overview.html#has-many-attached
公式ドキュメントを参考に S3へダイレクトアップロードをする。
非常に便利！

```storage.yml

amazon:
  service: S3
  access_key_id: <%= Rails.application.credentials.dig(:aws, :access_key_id) %>
  secret_access_key: <%= Rails.application.credentials.dig(:aws, :secret_access_key) %>
  region: us-east-1
  bucket: バケット名
```

ただし指定したバケット直下にimageが展開されてしまうので、
バケット/images/画像ファイルたち

のようにフォルダを指定したいなと思って調べていたら
意外と方法がでてこない。簡単そうなのに。


## 結論

現状サポートされていないそうな。
よほどその構成にこだわるなら別の方法を探すことになるだろうが、
そうでなければ、image専用のバケットとして扱えばよいかなと。

https://stackoverflow.com/questions/50893435/rails-active-storage-set-folder-to-store-files
DNSサーバーの設定についてわかったこと

最近、会社のドメインで障害を起こし（-_-;）、その解決によってわかったことを書き留めます。
ドメインやDNSの設定って、クライアント側は情報が豊富なものの、サーバー側は意外に情報が少なく、体系的に理解するのが難しかったです。

### やりたかったこと
とあるWebサービスの使用に際して、ドメイン所有権の確認が必要で、DNSサーバーにレコードを追加する必要がありました。しかし、追加しても所有権の確認ができず、試行錯誤しつつ、障害を引き起こしました。

### 構成
会社のサーバーは、ドメインと別々の会社で運用しています。
これが別の場合、少し話がややこしくなることを、先のWebサービスのコールセンターの人から聞きました。 
A社のレンタルサーバーと、B社で管理するドメインを組み合わせて使います。

B社のドメイン管理サイトにDNSの設定があり、レコードが並んでいます。
- ルートドメインのWebアクセスは、B社のDNSで解決する（NSレコード）
- wwwサブドメインのWebアクセスは、A社のDNSに移譲（NSレコード）
- www以外のサブドメインのWebアクセスは、A社のサーバーに向ける（CNAMEレコード）
- ルートドメインのメールサーバーは、B社指定のサーバーに向ける（MXレコード）
- ドメイン所有権の確認用レコード（TXTレコード）

A社のサーバー管理サイトから、ドメインとゾーンの一覧を見ることができます。しかし、DNSサーバーの設定は必要最低限で、追加することはできません（A社管理のドメイン以外では、DNSの設定不可）。
- ルートドメインのWebアクセスは、A社でレンタル中のサーバーに向ける（Aレコード）
- ルートドメインのメールサーバーは、A社でレンタル中のサーバーに向ける(MXレコード)
- ルートドメインのFTPサーバーは、A社でレンタル中のサーバーに向ける（Aレコード）

今回も、B社の管理サイトからDNSレコードを追加しましたが、いくら待ってもドメイン所有権が確認できません。

そこで、DNSサーバーの設定を見直すことにしました。

### ポイント

上記で、A社とB社のDNSサーバー設定で、競合するレコードがありました。
- ルートドメインのWebアクセス（A社:特に設定なし　B社：B社のレンタルサーバーに向ける）
- ルートドメインのメールサーバー（A社：A社のサーバーに向ける　B社：B社のレンタルサーバーに向ける）

この状態で、どちらが優先的に処理されるのか？という事について、これまで知りませんでした。
その鍵は、SOAレコードにあるようです。

SOAレコードは、Start Of Authorityレコードの略で、『このドメインに対して、最も権威のあるDNSサーバーは私です』という意味のレコードのようです。
SOAレコード保持サーバーのDNSレコードは『権威のある名前解決』、それ以外のサーバーが主張するDNSレコードは、『権威のない名前解決』と分けられます。

今回は、A社のドメイン管理画面で、『DNSサーバーを、A社のサーバーで設定する』という操作を行いました。  
これにより、SOAを持つサーバーは、A社のDNSサーバーとなったわけです。

### 不具合発生
変更してみたところ、会社のWebサイトに接続できなくなり、メールも送受信できなくなりました。

これまでB社のDNSサーバーが権威者だったのだと思います。
それをA社のサーバーにSOAを付与したので、B社のDNSサーバーにしかなかったレコードが上書きされ、名前解決できなくなったようです。

### 解決のポイント
解決法はシンプルでした。
1. ひとまず、DNSの権威者をB社に戻す
2. B社のDNSサーバーにのみ設定されていたレコードを、A社のDNSサーバーにコピーする
3. A社のDNSサーバーをテストする
4. 本番のDNSサーバーを、B社→A社に再変更

#### 1. ひとまず、DNSの権威者をB社に戻す

A社のドメイン管理画面上で、B社のDNSサーバーを権威者に変更する操作を行いました。

#### 2. B社のDNSサーバーにのみ設定されていたレコードを、A社のDNSサーバーにコピーする

画面をふたつ開いて、コピーしました。
レコードが重複した場合には、意味を考えて削除→上書きで対応しました。

#### 3. A社のDNSサーバーをテストする

今回大活躍のnslookupコマンドを使いました。
引数にDNSサーバーを設定すると、サーバー単体で名前解決のテストができるので、本番切り替えの前にステージングのようなことができます。
ただし、NSレコードで移譲する部分は再現されず、エラーが表示されます。

#### 4. 本番のDNSサーバーを、B社→A社に再変更
テストしてみて問題なさそうだったので、DNSの権威者をA社に再変更しました。

しかし、再びメールの送受信に不具合が出ました。
MXレコードの設定がよく分かっておらず、メールサーバーの名前解決ができなくなっていました。
MXレコードを再びコピーしたところ、ほどなくメール送受信が再開しました。

### まとめ

不具合を出してしまい、残念でしたが、おかげでDNSの基本や設定方法を学ぶことができました。

今回最大の気付きは、『SOAレコードで、権威者としてのDNSサーバーを指定するのが非常に大事』だということでした。
RDS メニューを前の表示に戻す

誰得の記事。

RDS のメニューがいつの頃からか、下のように変わりましたね。
![screen_capture_08-31(0).png](https://qiita-image-store.s3.amazonaws.com/0/269938/face1282-a122-1747-b029-814cb88a47a0.png)

けど、前のに戻したい人がいるかもしれない。
![screen_capture_08-31.png](https://qiita-image-store.s3.amazonaws.com/0/269938/d60e4273-989b-54f6-dce3-9b822a422309.png)

そんな時は URL に **&skin=classic** を付与すると、前のバージョンのメニューが表示されるよ。
![screen_capture_08-31(1).png](https://qiita-image-store.s3.amazonaws.com/0/269938/cf77fcb0-8582-984c-e3d3-b89b4f99dc7b.png)

ただ、前のバージョンにすると、例えば Aurora-Mysql5.7互換の DB インスタンスが作れない等の問題もあるから注意。
下図を見てもらえれば分かるとおり、DB エンジンのバージョンが 1 つしか選択できない。。。
![screen_capture_08-31(3).png](https://qiita-image-store.s3.amazonaws.com/0/269938/d0142b27-ac4f-97d1-4d86-3fdb11bc5895.png)

それと、いつまでこれが使えるかも知らないので、急に使えなくなっても怒らないように。
今のやつに戻すには、**&skin=new** を付与すればいいよ。


## 仲間募集中
[弊社](https://www.nittsu-infosys.com/)ではエンジニアを募集中です。インフラからアプリ、ユーザサポートまで幅広く業務を行ってます。
https://www.nittsu-infosys.com/recruit/2019/index.html
半透明の要素を描いたFBOを描画する際のハマりポイント

# TL;DR
不透明ピクセルに半透明ピクセルをアルファブレンディングした結果は半透明だから気をつけような！

# 現象

1. FBOを背景色（不透明）でクリアする
1. FBOに半透明の要素を描画する
1. FBOをウィンドウに描画する
1. ウィンドウ背景色が透過して見える

例：黒でクリアしたFBOに白い半透明の矩形を描き、赤背景のウィンドウに描画した結果
<img width="400" alt="スクリーンショット 2018-08-31 11.49.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/16556/c54ec64d-56ff-75e3-c008-8ce1aaeac48a.png">

# 何が問題なのか・どうなってほしいのか

FBOの背景色が不透明なのに、ウィンドウ背景色が見えているのが問題
ウィンドウ背景が透けてほしくない

例：こうなってほしい
<img width="400" alt="スクリーンショット 2018-08-31 14.18.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/16556/61265794-fe06-2ec0-5368-547e38a07680.png">

# 原因

__不透明要素の上に半透明要素をアルファブレンディングした結果が半透明__であること。
つまり__FBO内の半透明要素を描画した領域のアルファ値は1より小さくなる__こと。

アルファブレンディングの計算式（`glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)`の場合）

```math
out = src\cdot src_a+dst\cdot (1-src_a)\\
(src: 描画色, dst: 背景色, out: 結果)
```

アルファ値のみに着目すると

```math
out_a = src_a\cdot src_a+dst_a\cdot (1-src_a)\\
```

つまり$dst_a$が1（背景が不透明）の場合、

```math
out_a = src_a^2-src_a+1 \qquad (dst_a=1)\\
\therefore \left\{
\begin{array}{ll}
out_a \lt1 & (0\lt src_a\lt 1) \\
out_a = 1 & (src_a=\{0,1\})
\end{array}
\right.
```

となり、半透明要素を描画するとその結果が半透明となることがわかる。

ちなみに以下は背景色と描画色とから結果のアルファ値がわかるグラフ
https://www.desmos.com/calculator/azbx3o4tn9

# 対処

## 対処1 : アルファ値の計算に別の式を使う（OpenGL）

FBOに半透明要素を書き込む際に以下のどちらかを指定しておく。
不透明背景に描く場合はどちらでも結果は1になるので変わらない。


```
glEnable(GL_BLEND);
glBlendFuncSeparate(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA,GL_SRC_ALPHA,GL_ONE);
```

https://www.desmos.com/calculator/gntpr6mkw9

```
glEnable(GL_BLEND);
glBlendFuncSeparate(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA,GL_ONE,GL_ONE);
```

https://www.desmos.com/calculator/i3gk37bb4k

参考:
[ofFbo上でのアルファブレンディング - ofxTips-JP](http://ofxtips.hateblo.jp/entry/2013/09/01/181839)
[Alpha Blending の2種類の算出方法と使い分け – NEAREAL](http://neareal.com/2428/)

## 対処2 : FBOをブレンディングなしで描画する

FBOの背面に何も描画しない場合はこちらがシンプル。

```
glDisable(GL_BLEND);
fbo.draw();
```
[ruby] nil状態でメソッドの呼び出しを行わない　 tryメソッド

## tryメソッド
tryメソッドを使うためにはActive Supportをインストールする

```
gem install activesupport
```


違いは以下。
シンプルにかけていいね

```ruby
user ? user.address : '住所不定'
user.try(:address) || '住所不定'
```

## tryとtry!の違い
>１．userがnilの時、何もしない
>２．userにaddressが実装されてない時、何もしない
>
>1,2両方の効用を持つのがtryであり、1つ目の効用しか持たないのが try!です。
>tryを使う目的としては、1が多いと思いますので、積極的にtry!を使うほうがよいでしょう。

なるほどとりあえずtry!を使えばいいのね
vueで設定した内容を見る方法

# 結論
`this.$options`以下に設定内容の全てがオブジェクトで入っているので、それにアクセスするだけです。

```vue
<script>
export default {
  // カスタムオプションを入れる
  customOptions: ['a', 'b'],
  beforeCreate() {
    // 以下で見ることができる
    console.log(this.$option.customOptions);
  }
};
</script>
```

# つまづくところ
確かにこれで見ることができますが、console.logで`this.$option`を見ようとすると設定した内容がなくて困ってしまいます。
![スクリーンショット 2018-08-31 14.28.51.png](https://qiita-image-store.s3.amazonaws.com/0/187768/0050131c-deef-ac73-39d4-166851a1077a.png)

一見なさそうに見えますが、実は`__proto__`以下に入っていました。key名がマッチしない時は自動で`__proto__`以下も検索するため、ここのものが呼ばれていると思います。普段設定している内容もここで見ることができます。
![スクリーンショット 2018-08-31 14.27.11.png](https://qiita-image-store.s3.amazonaws.com/0/187768/b47f84f4-d3ea-cd78-3770-207a60cad48d.png)
AWS CLI EC2 instance roleを使っているときに、assume role する方法

# AWS CLI EC2 instance roleを使っているときに、assume role する方法

 
## 問題

AWS CLIは https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-roles.html で簡単にassume role で引き受けたroleが使用できるが、元の権限が EC2 instance role を使っているとこのページの通りだと `The source_profile "default" must specify either static credentials or an assume role configuration` と言われてしまい動作しない



```ini:./aws/config
[profile test]
role_arn = arn:aws:iam::xxxxxxxx:role/TestRole
source_profile = default

[default]
output = json
region = ap-northeast-1
```

```bash
-> % aws --profile test  ec2 describe-instances

The source_profile "default" must specify either static credentials or an assume role configuration
```


## 解決方法

https://docs.aws.amazon.com/cli/latest/topic/config-vars.html#using-aws-iam-roles にある

`credential_source = Ec2InstanceMetadata` を指定すれば、できるようになる


```ini:./aws/config
[profile test]
role_arn = arn:aws:iam::xxxxxxxx:role/TestRole
credential_source = Ec2InstanceMetadata
region = ap-northeast-1

[default]
output = json
region = ap-northeast-1
```

```bash
-> % aws --profile test  ec2 describe-instances | head -8
{
    "Reservations": [
        {
            "Instances": [
                {
                    "Monitoring": {
                        "State": "disabled"
                    },
```
Google ColaboratoryでGPUを使うための第一歩

# はじめに
Google Colaboratoryが便利ということで遊んでいます．
自分がアホだったせいでGPU使おうとして苦労したので，憂さ晴らしにまとめておきます．
たまたま読んだこの[記事](https://qiita.com/Naritoshi/items/20277141a39ff32cd6ae)のまんなか辺りに答えがありました．
#やること
超単純
##その1
上のツールバー->ランタイム->ランタイムのタイプを変更
![runtime_option.png](https://qiita-image-store.s3.amazonaws.com/0/165289/d955deca-c4f6-893c-3776-48eb023224f9.png)

##その2
ノートブックの設定→ハードウェアアクセラレータ→GPU→保存
![notebook_option.png](https://qiita-image-store.s3.amazonaws.com/0/165289/b230f00e-d142-9e39-d003-dd9a4fd529bf.png)

これだけです．
以上！！

#おわりに
意外と単純なとこで躓きますよね．
めげずに楽しんでいきましょう．
vueでファイルアップロードでプレビュー

```input file="file"```で取得した画像をサーバーアップ前にプレビューさせたり、canvasに追加して加工したりする

```vue:index.vue
<template lang="pug">
  .container
    input(
      type="file"
      multipule
      accept="image/*"
      @change="selectFiles"
      )
    .preview(v-if="imageData")
      img(
        v-for="(file,index) in imageData"
        :key="file[index]"
        :src="file.src"
        )
</template>
<script>
export default {
  data(){
    return{
      imageData:[]
    }
  },
  methods:{
    selectFiles(e){
      const files = e.target.files
      let length = files.length , i = 0 , file
      for(; i < length; i++){
        let file = files[i]
        let url = URL.createObjectURL(file)
        this.imageData.push({ src: url })
      }
    }
  }
}
</script>
```
見開き中央綴じ資料をスキャンしたPDFをページ毎に分割する

# 何がしたいのか
会議等資料で、A4見開き(紙自体はA3)で中央で綴じられている資料のホッチキスを外して、A3でスキャンして電子化(PDF化)してもそのままじゃページがばらばらで読めないのを何とかしたい。
真ん中で切断してスキャンしてもページがばらばらだし、PDF編集ソフトとかでページを並び替えたり回転したりするのも面倒。
そこでPyPDF2を使ってこの問題を解決してみました(これができるPDF編集ソフトが見つからなかったので…)。

# やっていること
* A3ページを縦に2分割する
* ページを並び替えて読めるPDFにする
* ページを回転させて正面から見れるようにする

# 前提
* 想定しているのは、A4横の資料がA3に冊子形式で割り付けて印刷・中央綴じされているものです
* スキャンするときは、見開いた状態で、最初のページがA3右側の一番下の裏になるようにして両面スキャンしたものを想定しています(この辺は並び替えとかをいじればどの方向でスキャンしてもできるはずです)
* PDFファイルを標準入力から得て標準出力に書き出す

# 実装
## 準備
```python
import copy, sys
from PyPDF2 import PdfFileWriter, PdfFileReader

input = PdfFileReader(open('/dev/stdin', 'rb'))
output = PdfFileWriter()

numPages = input.getNumPages()
spreadPages = [0] * (numPages*2)
sortedPages = [0] * (numPages*2)
```
* PyPDF2を使います
* PdfFileReaderで標準出力から読み込みます
* spreadPagesには2分割ページを格納
* sortedPagesには並び替えた結果を格納

## A3ページを縦に2分割
```python
j = 0
for p in [input.getPage(i) for i in range(0, numPages)]:
    q = copy.copy(p)
    (w, h) = p.mediaBox.upperRight
    p.mediaBox.upperRight = (w/2, h)
    q.mediaBox.upperLeft = (w/2, h)
    spreadPages[j*2] = p
    spreadPages[j*2 + 1] = q
    j = j + 1
```

## ページを並び替え
```python
    sortedPages[numPages - 1 - i*2] = spreadPages[i*4]
    sortedPages[numPages     + i*2] = spreadPages[i*4 + 1]
    sortedPages[numPages + 1 + i*2] = spreadPages[i*4 + 2]
    sortedPages[numPages - 2 - i*2] = spreadPages[i*4 + 3]
```
だいたい以下のイメージで、あとは1枚ずつ表と裏で4ページ分のページが本来どのページ番号になっていくかを考えてみた感じです。
* (4行目)iが最大のときに分割後の最後のページ(```i*4 + 3```)が最初のページ(```numPages - 2 - i*2 = 0```)になる
* (3行目)iが最大のときに分割後の最後から1つ前のページ(```i*4 + 2```)が最後のページ(```numPages + 1 + i*2 = numPages*2 - 1```)になる
* (1,2行目)```i = 0```のときに分割後の最初のページ(```i*4 = 0```)とその次のページが真ん中の2つのページになる

## ページを回転
```python
for i in range(0, numPages*2):
    output.addPage(sortedPages[i].rotateClockwise(90))
```
* ```rotateClockwise(90)```で時計回りに90°回転してます

## 出力
```python
output.write(open('/dev/stdout', 'wb'))
```

# 全コード
```python
#!/usr/bin/env python
import copy, sys
from PyPDF2 import PdfFileWriter, PdfFileReader

input = PdfFileReader(open('/dev/stdin', 'rb'))
output = PdfFileWriter()

numPages = input.getNumPages()
spreadPages = [0] * (numPages*2)
sortedPages = [0] * (numPages*2)

j = 0
for p in [input.getPage(i) for i in range(0, numPages)]:
    q = copy.copy(p)
    (w, h) = p.mediaBox.upperRight
    p.mediaBox.upperRight = (w/2, h)
    q.mediaBox.upperLeft = (w/2, h)
    spreadPages[j*2] = p
    spreadPages[j*2 + 1] = q
    j = j + 1

for i in range(0, numPages//2):
    sortedPages[numPages - 1 - i*2] = spreadPages[i*4]
    sortedPages[numPages     + i*2] = spreadPages[i*4 + 1]
    sortedPages[numPages + 1 + i*2] = spreadPages[i*4 + 2]
    sortedPages[numPages - 2 - i*2] = spreadPages[i*4 + 3]

for i in range(0, numPages*2):
    output.addPage(sortedPages[i].rotateClockwise(90))

output.write(open('/dev/stdout', 'wb'))
```

# 使いかた
```
$ python un2up.py < input.pdf > output.pdf
```


# 参考
* ページ分割は
    https://unix.stackexchange.com/questions/12482/split-pages-in-pdf/12483#12483
    を使って、ここから並び替えと回転をやっているイメージです。
【THETA V プラグイン】の仕組みをささえるQualcomm Snapdragonプロセッサ

こんにちは、リコーのMichaelです。　

THETA VのAndroid OS上でプログラミングする際には、メインプロセッサの機能・性能を把握することで、より効果的にPlug-inを作ることができるのではないでしょうか？　そこで、Qualcomm社のSnapdragon 625プロセッサについて解説します。
・興味を持たれた方は[twitter](https://twitter.com/thetaplugin)のフォローと[THETAプラグイン開発コミュニティ(slack)](https://join.slack.com/t/thetadeveloper/shared_invite/enQtNDU5Nzg4MTg4NzA2LTYyOGQ1YjRkMTllY2RhNGE2ZTNhNjIxZDY4MzgyZjYyOWYxYmM4OWE5MjZlM2QwZGQ4ZTIyZDc1MjQ0ODcwZjM)への参加もよろしくおねがいします｡

##はじめに
THETA Vでは、メインプロセッサとしてQualcomm社のSnapdragon 625 [(APQ8053)] (https://www.qualcomm.com/products/apq8053-processor)を採用しています。昨今のスマートフォン進化は目覚ましいものがあり、それらを支えるプロセッサとしてSnapdragon 625は低消費電力、パワフルなGPUまた、Androidが使えるという点でTHETA Vの機能拡大とコンパクトボディの実現に貢献しています。そこでSnapdragon 625とAndroidベースのOS上で、Plug-in開発するために役立つ情報を記述します。

##1. Snapdragon 625の基本性能
性能面では、64-bit, Arm-based, octa-core CPU and [Adreno™ GPU](https://developer.qualcomm.com/software/adreno-gpu-sdk/gpu), と14nmプロセスによる低消費電力性が主なポイントです。
GPU性能を活かして、THETA Vではリコーのオリジナル画像ステッチアルゴリズムが使われています。つまり、汎用プロセッサとはいえ、差異化することが可能です。また、THETA Sでは2k/30fps動画処理でしたが、THETA Vでは、4k/30fpsの動画処理、しかもカメラ内部でのリアルタイムステッチを同等フォームファクターで実現しています。
![snapdragon.jpg](https://qiita-image-store.s3.amazonaws.com/0/263023/e9d8580d-9a01-9e40-176c-0686ec747b98.jpeg)

##2．AndroidベースOS上にて、プログラミング領域を解放
THETA Vはカメラでありますが、IoTデバイスの一種として多様なニーズや用途に応じた使い方を提供することがPlug-inの目的です。膨大なるAndroidソフトウェアの資産を活かせることもメリットと見られます。Plug-inの開発環境では、ルート権限など一部を除いて、Androidプログラミング領域を解放しています。
![THETA V.jpg](https://qiita-image-store.s3.amazonaws.com/0/263023/272f62b0-9b51-47d3-d470-4f81aa5074ce.jpeg)


##3．開発者モードに設定して、Vysorソフトウェアで中身を覗いてみましょう。
カメラだと思っていたTHETA Vの中身は、まさにSnapdragon 625上で動作するAndroid端末です。[Vysorソフトウェア](https://www.vysor.io/)で確認してみてください。THETA VにおけるVysorの使い方は[こちら](https://qiita.com/KA-2/items/9dce1a165fcf0203b1cb)

THETA VはAndroid端末なので、電卓アプリで1+1=2の計算も可能です。APKを放り込むことで制御可能なことが実感されます。THETA Vには、2つの魚眼カメラ、Wi-Fi、BLE、マイクロフォン、スピーカ、加速度センサ、ジャイロ、電子コンパス, LEDなどハードウェアが内蔵されていますので、それらを制御またはハードウェアから情報の獲得を可能とします。提供されたAPI、SDKを使うことでプログラミングを容易にしますが、Snapdragon 625のアーキテクチャを理解すれば、より高度な制御を可能にします！

詳細は下記リンクをご覧ください。
https://developer.qualcomm.com/get-started/start-here

##まとめ
Snapdragon 625 アーキテクチャの理解を深め、最大限にTHETA Vの機能を活かしたプラグイン開発をしてみませんか？

THETAプラグイン開発に興味を持たれた方はぜひパートナープログラムにご登録ください！
なお、登録時に申請したシリアルナンバーのTHETAについてはメーカーサポート対象外になりますので、ご注意ください。

・パートナープログラムの詳細は[こちら](https://api.ricoh/products/theta-plugin/)
・登録フォームは[こちら](https://www8.webcas.net/db/pub/ricoh/thetaplugin/create/input)
・THETAプラグイン開発に関するQiita記事は[こちら](https://qiita.com/organizations/theta-plugin/activities)
インストール時に見る先頭のグルグルを作ってみた

先頭の回転している点を作ってみた。パッケージのインストールなどで見かけるやつ。

![demo](https://qiita-image-store.s3.amazonaws.com/0/279498/18a1077c-555d-01de-30cc-da4203463c7e.gif)

# ソースコード

中身は工夫した形跡の見えない直書きコードでできています...

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

while :
do
    printf "\e[32m\r\u2807\e[0m loading.."
    sleep 0.2
    printf "\e[32m\r\u280b\e[0m loading.."
    sleep 0.2
    printf "\e[32m\r\u2819\e[0m loading.."
    sleep 0.2
    printf "\e[32m\r\u2838\e[0m loading.."
    sleep 0.2
    printf "\e[32m\r\u2834\e[0m loading.."
    sleep 0.2
    printf "\e[32m\r\u2826\e[0m loading.."
    sleep 0.2
done
```


回転しているところは点字でできていて、`\u2800`~`\u283f`で表示することができる。
`\e[32m`,`\e[0m`は色の指定を行っている。

# 参考

点字のUnicodeについて、以下を参考にした。

[Unicodeの点字でお絵かき](https://qiita.com/zakuroishikuro/items/15d1a69178895edf9a21)
C++ Stringの変換(cast) チートリスト

## char[]からStringに変換
文字列リテラルなどのアドレスをそのまま渡す。

```c++:test.cpp
char c_str[] = {"hello world!"};
std::string s_str = c_str;
```

## Stringからchar*に変換
c_str()を使う

```c++:test.cpp
std::string str = "hello world!"
const char* cstr = str.c_str();
```

## intからStringに変換
```c++:test.cpp
int num = 4321;
str = std::to_string(num);
```

## Stringからintに変換
```c++:test.cpp
std::string numStr = "1234";
int num = std::stoi(numStr);
```
VSCodeでファイルを開いた後に別のファイルを開くと、同じタブで開かれるのをやめる

# 概要
VSCodeファイルツリーで次々にファイルをクリックしていくと、新しいタブが開かずに同じタブで開かれる。
これを必ず新しいタブで開くようにする。

# 設定方法
VSCodeの設定に以下を必要に応じて追記する。
不要なものは追記しなくてもOK

```json
{
  // どんな時も必ず新しいタブを開きたい時
  "workbench.editor.enablePreview": false,
　　　　// QuickOpenの時だけは新しいタブを開きたい時　（この場合、上の設定がtrueなら、そちらが優先される）
  "workbench.editor.enablePreviewFromQuickOpen": false,
}
```

# 総括
好みによるけど、たまに困るよね 😆
【Swift】WebViewのCookieを永続的に保持しておきたい

2回目の投稿です。以前記事書いたときは正直これっきりかなと思っていたのですが、ちゃんとアウトプットしていくことによる学習効率の素晴らしさと、ひとからフィードバックをいただける喜びを切に感じ、もっと色々積極的に発信していくべきだな〜と思ったので、また記事を投稿させていただきました次第です。
少しでも気になる所がございましたら、ご指摘いただけると非常に嬉しいです。
# 本題です
例えば、ユーザログインが必要なウェブページでは、クッキーを利用することでログイン状態を保持しておくことができるようにしている場合が多いと思います。
しかし、アプリ内で用意したUIWebViewからログインページに飛んでログインを行った場合、アプリが終了されるまではクッキー情報は消えないためログイン状態を保持できますが、アプリがkillされてしまうなどするとクッキー情報が破棄されてしまうため、再度アプリを立ち上げた時には改めてログインし直さなければならなくなってしまいます。
ので、このような場合には永続的にクッキーを保存しておく方法が必要になってくるのですが、具体的にどのようにするのが一番良さそうかな...
っていうお話です。
#こんな解決法を提案します
お手軽にデータを永続化する方法といえば、UserDefaultsという機能があります。
今回は素直にそれを利用します。
ただUserDefaultsは保存できるデータ型が決まっており、クッキーをそのまま保存することはできないのでその辺の工夫が必要です。
AppDelegateに以下のメソッドを用意してください。

```swift:AppDelegate.swift
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    // UserDefaultにクッキーを保存するメソッド
    private func storeCookies() {
　　　　　// 現在保持されているクッキーを取り出します
        guard let cookies = HTTPCookieStorage.shared.cookies else { return }
　　　　　// UserDefaultsに保存できるデータ型に変換していきます
        var cookieDictionary = [String : AnyObject]()
        for cookie in cookies {
            cookieDictionary[cookie.name] = cookie.properties as AnyObject?
        }
　　　　　// UserDefaultsに保存します
        UserDefaults.standard.set(cookieDictionary, forKey: "cookie")
    }
    
    // UserDefaultからクッキーを取得するメソッド
    private func retrieveCookies() {
　　　　　// UserDefaultsに保存してあるクッキー情報を取り出します。（この時はまだ[String : AnyObject]型）
        guard let cookieDictionary = UserDefaults.standard.dictionary(forKey: "cookie") else { return }
　　　　　// HTTPCookie型に変換していきます
        for (_, cookieProperties) in cookieDictionary {
            if let cookieProperties = cookieProperties as? [HTTPCookiePropertyKey : Any] {
                if let cookie = HTTPCookie(properties: cookieProperties ) {
　　　　　　　　　　　　// クッキーをメモリ内にセットします
                    HTTPCookieStorage.shared.setCookie(cookie)
                }
            }
        }
    }

// ~以下省略~

}
```

これで、クッキーを永続的に保存&取得する準備が整いました。（もう本題終わった感ある。）
次に、上記メソッドを適切なタイミングで呼び出していきます。
AppDelegate内にある以下のメソッド内に、先ほど用意したメソッドを以下のように記述します。

```swift:AppDelegate.swift
// 起動時
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
　　　// クッキー取得
     retrieveCookies()
     return true
}

// バックグラウンドに入った時
func applicationDidEnterBackground(_ application: UIApplication) {
     // クッキー保存
     storeCookies()
}

// アプリがkillされた時
func applicationWillTerminate(_ application: UIApplication) {
　　　// クッキー保存
     storeCookies()
}
```

これだけ。
applicationWillTerminateメソッドだけでなく、
applicationDidEnterBackgroundメソッド内でもstoreCookies()を呼んでいるのは、applicationWillTerminateはkillされた時に**必ず呼ばれる訳ではない**っぽいから。（applicationDidEnterBackgroundだけ記述しとけばいいかもしれない。。）
この辺はどういうことなのかあまりよくわかっていないので、詳しい方コメントで教えていただけると嬉しいです。
# 結
以上となります。今回の記事も幼稚な感じが否めませんが、だれかの役に立てれば幸いに思います。
どんな些細なことでもよろしいので、気になるところございましたらコメントよろしくお願いします。
LINUX KERNEL DEVELOPMENTを読んでいく（4）

以下の書籍を読んで行きます。

https://www.amazon.co.jp/dp/B003V4ATI0/

結構いい本みたいですねこれ（ステマ）。
なんかいろんな人がマサカリを投げてくれるので勉強になります。
というか、Linuxカーネル本は、ひたすら読んで行ってもわけがわからないし、読書会開いてもわけがわからないし、カーネルについては隠蔽されている部分が多いので、Ubuntu Linux使っててもわからないし、Linux Cross Reference読んでても巨大すぎて意味がわからないし、このようにひたすら舐めるようにして翻訳してコメント付け加えていくしか勉強法がないんですよね。

では今日も始めます。

>これらのコンテキストは、広い範囲のカーネルの活動を表す。

前の記事で、「文脈」ではなく、「コンテキスト」だとの指摘を受けたので、今後はコンテキストを使用します。これらのコンテキストとは、プロセスのコンテキストと、割り込みのコンテキストのことだと思います。

>事実、Linuxにおいては、任意の瞬間において、それぞれのプロセッサが、３つのうちの一つのことを実行していると一般化できる。
>１、ユーザースペースにおいては、プロセスにおいて、ユーザーコードを実行する
>2、カーネルスペースにおいては、プロセスのコンテキストにおいて、特定のプロセスを代表して実行する
>3、カーネルスペースにおいては、割り込みのコンテキストにおいて、プロセスに関連せず、割り込みを操作する。

ええとつまり、ここで重要なのは、ある瞬間においては、一つのプロセッサにおいては、上に並べている３つのうちのただ一つが実行されていて、一つのプロセッサにおいては同時には２つ以上のことは実行されていないということだと思います。プロセスのコンテキストと、割り込みのコンテキストが同時に成り立つことはないと思います。ただ、同時になることはあるようには思います。なぜなら、マルチコアだった場合などがあるからです。
割り込みのコンテキストにおいては、プロセスには関連しないんですね。

>このリストは包括的である。たとえ、例外的なケースにおいても３つのうちの一つに当てはまります。例えば、アイドリング状態の時、カーネルにおいてのプロセスのコンテキストにおいての、Idle processが実行しています。

僕自身のイメージとしては、アイドリング状態の時は、CPUが動作を止めているイメージです。
次の章に続きます。

##Linux Versus Classic Unix Kernels

>共通の先祖と同じAPIを持つため、モダンなUnixカーネルは、たくさんの設計においての性質を共有している。

Mac OSもUnixだと思いますが、Mac OSのカーネルの性質をあんまり知らないため、ここら辺のことはよくわからないです。コマンドなどについては、LinuxもMac OSも同じことは知ってますが、コマンドはもしかしたら、カーネルとはあんまり関係ないかもしれないです。

>  いくつかの例外はあるが、Unixカーネルはモノリシックの静的なバイナリである。

モノリシック出てきましたね。他の言葉に、マイクロカーネルという言葉があるようです。モノリシックとは、システム全体が一枚岩で動いていることを表現しているようです。

> それは、システムが一つのアドレススペースにおいて、一つの、大きな、実行可能なイメージとして存在することである。

まさに一枚岩の記述ですね。対して、マイクロカーネルにおいては、複数の部分に動的に分割できるようです。

>  Unixのシステムは典型的にはページングメモリ管理ユニット（paged memory-management unit)を必要とします。このハードウェアはシステムに、メモリ保護とそれぞれのプロセスにユニークな仮想アドレス空間を提供します。

メモリ管理ユニットというハードウェアが存在するんですね。メモリ保護はセキュリティ上は重要な機能かもしれません。それぞれのプロセスに特有の仮想アドレス空間ということは、プロセスごとにアドレス空間は分けられているということでしょうか。

> Linuxは歴史的には、MMU(メモリ管理ユニット）を必要としていました。しかし、特別なバージョンにおいては、それなしで、実行できる。それは、きちんとした機能で、Linuxが、MMUがないとても小さい組み込みシステムで実行することを可能にする。しかし、そうでなければ、実用的というより学術的なものである。今日においては、シンプルな組み込みシステムでさえ、MMUのような進んだ機能を持っている。この本では、我々はMMUに基づいたシステムについて語る。

メモリ保護機能は、セキュリティ上は重要な機能だと思うので、小さいIoT機器でも付いてて欲しいですね。最近はIoT機器に関するセキュリティも叫ばれてますから。学術では、MMUなしとか研究されていると書いてますね。

では、また次回
Webpack 4：babel-loader のアップデートで起きたエラーを解決


babel-loader を 7.1.5  →  8.0.0 のアップデートで、以下のエラーが発生。

```
error  Module build failed (from ./node_modules/babel-loader/lib/index.js):
 Error: Couldn't find preset "@babel/preset-env" relative to directory
```

解決ついでにパッケージや設定を整理したので、メモしておく。


## 1. 関連パッケージの入れ直し

以前 Babel を 6→7 にアップデートした際、不要になったパッケージを削除したかの記憶がなかったので、関連したものは一応全部入れ直した。webpack は入れ直す必要はないだろうが一応入れ直した。

Babel 6 で使うパッケージ群と Webpack をアンインストール
`npm uninstall --save-dev babel-core babel-preset-env babel-loader webpack @babel/polyfill`

Babel 7 で使うパッケージ群を Webpack インストール
`npm install --save-dev @babel/core @babel/preset-env babel-loader webpack`

脆弱性の自動修正（完全ではない）
`npm audit fix`


## 2. .babelrc、.browserslistrc の修正

### 変更前

```.balelrc
{
  "presets": [
    ["env", {
      "targets": {
        "browsers": [
          '> 0.5% in JP',
          'Firefox ESR'
        ]
      }
    }]
  ]
}
```

### 変更後

対応ブラウザの設定は、.browserslistrc で行う。
` "useBuiltIns": "usage"` で、指定したブラウザに必要な polyfill を import してくれる。
でも、場合によっては別途 polyfill が必要な場合もあるらしいので留意しておく。
（@babel/polyfill は不要になったのでこの記事冒頭のコマンドでアンインストールした）

```.babelrc
{
  "presets": [
    [
      "@babel/preset-env",
      {
        "useBuiltIns": "usage"
      }
    ]
  ]
}
```

合わせて .browserslistrc の編集（なければ作成）。
autoprefixer 等を使っていれば、すでにあるはず。
記述に対する対象ブラウザは [browserl.ist](http://browserl.ist/) でチェックできる

```.browserslistrc
> 0.5% in JP
Firefox ESR
```

## 3. webpack.config.js の編集

presets を 'env' から '@babel/preset-env' に変更

```webpack.config.js
module: {
  rules: [
    {
      test: /\.js$/,
      exclude: /node_modules/,
      use: {
        loader: 'babel-loader',
        options: {
          presets: ['@babel/preset-env'] // 変更前は 'env'
        }
      }
    }
  ]
}
```


## 4. gulp に発生したエラーに対処

gulp (v4) のタスクを走らせようとすると、以下のエラーが。  

```
[14:06:41] Failed to load external module @babel/register
[14:06:41] Failed to load external module babel-register
[14:06:41] Failed to load external module babel-core/register
[14:06:41] Failed to load external module babel/register
```

１番上の @babel/register をインストールすれば良い（他は旧いやつ）。
`npm install --save-dev @babel/register`

- - -

## 参考記事

* [とりあえず webpack 4 で Babel 6 か 7 を導入する - Qiita](https://qiita.com/kerupani129/items/60282ed958d9fb0cd3f5)
* [@babel/preset-envのuseBuiltInsを使ってpolyfillする - Qiita](https://qiita.com/shisama/items/88080011bbc69e3e620b)
* [babel-loader - npm](https://www.npmjs.com/package/babel-loader)
* [babel-preset-env - npm](https://www.npmjs.com/package/babel-preset-env)
* [@babel/preset-env · Babel](https://babeljs.io/docs/en/next/babel-preset-env)
* [javascript - Couldn't find preset "@babel/env" - reactjs - Stack Overflow](https://stackoverflow.com/questions/51168491/couldnt-find-preset-babel-env-reactjs)
ブラウザのコンソールで画像を表示させたりして遊ぶ🐈

# 結論

コンソールで画像を表示できたりする。


# 背景

つみきブログを見ていて、何気なくDeveloper Consoleを開いたら、

![image.png](https://qiita-image-store.s3.amazonaws.com/0/91558/2fd3d389-6207-2f19-35ad-e35519ddeea2.png)

**コンソールに画像表示される~!!**ってなった。

結構いろいろなサイトでこんなことをやっているらしい↓
[JavaScript Consoleに面白い出力をしているサービス - Qiita](https://qiita.com/oohira/items/6c30bdf3636a134cf119)

コンソールでリクルーティングしてるところもあって面白いですね。

# どうやってやってんの

以下のサイトで詳しく説明されている

[console.log() - ログを出力する | Consoleリファレンス](https://lab.syncer.jp/Web/API_Interface/Reference/IDL/console/log/)

簡単に説明すると'%c'の置換キーワードにスタイルが適用できるらしい

```javascript
console.log( "これは、%cメッセージ%cです。", "color:red;", "" );
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/91558/f771eb84-0fa0-1d67-7cc3-05f94732d94c.png)

# 遊んでみた

簡単なスタイルの適用。

```javascript
for (let i=1; i<5; i++) console.log("%cこっちを見て", 'color: #c1b8b9; background: #c1031d; font-size: ' + i + 'em;');
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/91558/8d7eb062-285a-517f-5e05-8f269bb6fe90.png)
~~怖い~~


次は画像の表示。たぶん以下がシンプルだと思う。スタイルで背景画像として画像を表示している。また表示域がデフォルトで1文字なのでpaddingで画像の大きさを記述する必要がある。

```javascript
console.log("%c ", 'background: url(https://www.pakutaso.com/shared/img/thumb/neko1869IMG_9113_TP_V.jpg); background-size: 100% 100%; padding: 128px 200px');
```

出力結果

![image.png](https://qiita-image-store.s3.amazonaws.com/0/91558/5f898a7a-7669-50b3-f1fa-16f071893c24.png)

# まとめ
わりとconsole.log()はいろいろできる。
swift4　超初心者向け！"UserDefaults"の使い方とか　忘備録

# UserDefaultsってナンデスカ？
UserDefaultsとは、iosアプリ内にデータを保存する方法の一つです。


「これってDBに保存しなくても良いんじゃね？手元に置いていた方が便利じゃね？」
といった、なんか「ちょっとした」データや情報を取り扱う際に利用するらしいです。


今回、アプリを開発しているときに以下のような仕様で機能を実装したかったのですが、

```
UITextFieldに文字入力  →  アプリ再起動  →  UITextFieldにデータを表示
```
javascriptならlocalstorageでチョイチョイって出来ちゃうけど、swiftはどうなのよ？

って事で取りかかったら意外とハマりまくったので、
誰でも使えるような説明を心掛けてアプトプットを兼ねて書き記します。

**注)ちなみに保存したのは文字列だから他の型を保存したい場合は適宜変更が必要かと！！**

# まずはこの2つを理解しよう。
UserDefaultsを使用してデータのやり取りする際には、
もちろん以下の手順を踏むことになる。


**①データを保存する**

userDefaults.set(ほにゃらら)

**②保存したデータを読み込む**

userDefaults.object(ほにゃらら)

そして上記を踏まえて,

```
UITextFieldに文字入力  →  アプリ再起動  →  UITextFieldにデータを表示
```
こいつを実装します。


```swift:ViewController.swift

import UIKit
                                      //UITextFieldDelegate も付けてあげよう。
class ViewController: UIViewController, UITextFieldDelegate  {

   //(主人公)こいつに入力した値をアプリ再起動しても、こいつに出力される
    @IBOutlet var workPlaces:UITextField!

   //①なんでも良いから初期値として設定しておく。
    var testText:String = "default" 


    //②UserDefaults のインスタンス
    let userDefaults = UserDefaults.standard

   //ページが開かれた時に一番最初に動作するのがこいつ。
    override func viewDidLoad() {
        super.viewDidLoad()

        // textFiel の情報を受け取るための delegate を設定
        //今回こいつを書いてなくて時間を費やした。
        workPlaces.delegate = self

        // デフォルト値
        userDefaults.register(defaults: ["DataStore": "default"])

        workPlaces.text = readData()

    }

    //この関数がviewdidload時に読み込まれて保存したデータの読み込み作業をしている。
    func readData() -> String {
        // Keyを指定して読み込み
        let str: String = userDefaults.object(forKey: "DataStore") as! String

        return str
    }

    //viewDidLoad()内でworkPlaces.delegateをきちんと書いていないと、この関数が動作しない。
    //ここはシュミレーターのreturnキーを押した時に動く。
    func textFieldShouldReturn(_ textField: UITextField) -> Bool{

        //(主人公)の内容を①へ代入。
        testText = workPlaces.text!

        workPlaces.text = testText

        // 特定のUITextFieldやUITextViewの状態を変更することができる
        workPlaces.resignFirstResponder()
        
        //(保存したいデータ)を引数として以下の関数へ
        saveData(str: testText)

        return true
    }

     //ここの関数内のuserDefaults.setで保存している。
    func saveData(str: String){

        // Keyを指定して保存
        userDefaults.set(str, forKey: "DataStore")

    }


    //memory warningが発生したときに呼び出されるファンクション
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

}

```

# まとめ
自分としてはclassにUITextFieldDelegateを追記する必要性や、
override func viewDidLoad()の中に追記したこいつを →　workPlaces.delegate(デリゲート)
なぜ必要なのか体感出来た良い機会でした。
LINQPadでグラフを表示する

皆様こんにちは。
[第1回目のUnity入学式](https://okinawa-unity.connpass.com/event/97071/)が無事に終わってほっとしている山田です。
次は9月末の第2回目の準備しなきゃ。。

## 動機

平面の円周上にオブジェクトを等間隔で配置したい時に、ポジション（X座標とY座標）を自動で計算したい時があります。
そんな時にパラメータを変えてどんな感じになるか試したいのですが、ポジションを数値で見てもよくわからないので2次元グラフにプロットしてほしいと思いました。

ポジションを計算するコード

``` csharp
var angleDiff = 180f / 9;
var startAngle = 0f;
var radius = 4;
var distance = 0;

 var positions = Enumerable.Range(0, 10).Select(x =>
 {
 	var angle = (startAngle + angleDiff * x) * UnityEngine.Mathf.Deg2Rad;
 	return new 
	{
		XPos = radius * UnityEngine.Mathf.Cos(angle),
		ZPos = radius * UnityEngine.Mathf.Sin(angle) + distance
	};
 });
```

数値で見てもよくわからない例

| Index      | X Position |    Y Position    |
|:-----------------:|:------------------:|:------------------:|
| 1 | 4 | 0 |
| 2 | 3.76 | 1.37 |
| 3 | 3.06 | 2.57 |
| 4 | 2 | 3.46 |
| 5 | 0.69 | 3.94 |
| 6 | -0.69 | 3.94 |
| 7 | -2 | 3.46 |
| 8 | -3.06 | 2.57 |
| 9 | -3.76 | 1.37 |
| 10 | -4 | 0 |

2次元グラフにプロットするとよく分かる例
![SnapCrab_NoName_2018-8-31_12-28-31_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/275821/cecbaef0-8ac1-8f41-ea4f-be944cf80bd8.png)

## LINQPad

LINQPadは無償で提供されているアプリケーションで、Linqや.NETのコードをインタプリタ的に実行できるツールです。
出力もグラフ表示などで出力することができます。
詳しくは以下の記事などを見てください。
[LINQPadを使ってみよう](https://qiita.com/kazuhisam3/items/293103991a9f0bb8dcb7)
[今日からはじめる LINQPad](https://takeshik.org/blog/2014/12/06/try-linqpad/)

DBに接続することもできるので、DBからSelectしてLinqでいい感じに集計してグラフ表示することもできます。
僕も以前Redisに接続してデータ表示や更新、追加するスクリプトをLINQPadで作ったことがあります。

## LINQPadでグラフ表示
以下の様に書くだけでグラフ表示できます。

``` csharp
var angleDiff = 180f / 9;
var startAngle = 0f;
var radius = 4;
var distance = 0;

 Enumerable.Range(0, 10).Select(x =>
 {
 	var angle = (startAngle + angleDiff * x) * UnityEngine.Mathf.Deg2Rad;
 	return new 
	{
		XPos = radius * UnityEngine.Mathf.Cos(angle),
		ZPos = radius * UnityEngine.Mathf.Sin(angle) + distance
	};
 })
 .Chart(x => x.XPos, x => x.ZPos, LINQPad.Util.SeriesType.Point)
 .Dump();
```
![SnapCrab_LINQPad 5_2018-8-31_12-41-36_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/275821/46c7e886-56d1-822d-1884-393b271b16af.png)

なお、上記のコードを実行するためにはUnityEndine.dllのimportが必要になります。
QueryPropertiesでUnityEndine.dllの場所を追加します。
（UnityEndine.dllはUnityをインストールするとPCに追加されます。）

![SnapCrab_Query Properties_2018-8-31_12-43-2_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/275821/6d0490eb-d1a7-0a9b-e58e-5bb49c697dc2.png)

ChartのオプションをPointからLineに変更すると点ではなく線で表示してくれたりします。
便利ですね！

![SnapCrab_LINQPad 5_2018-8-31_12-44-44_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/275821/81049b40-8ed5-90e9-ebef-20a580b537e1.png)

棒グラフも表示できます。
[【.NET】LINQPadでお手軽にオブジェクトを可視化する](https://blog.jhashimoto.net/entry/2018/07/02/170151)

ちょっと情報が少なくてオプションなど探すのが困るのが残念です。
公式サイトにもうちょっと説明が欲しいですね。

では皆様良いLINQPadライフを！
Instant apps化をする時のbuild.gradleの注意点

## ハマったポイント

https://codelabs.developers.google.com/codelabs/android-instant-apps/index.html#0 を参考にinstant apps化を進めていて、最後に `instant` モジュールをビルドしようとした時、生成物のpackage名が `<appのpackage>.base` となってしまって、Google playにuploadする際に怒られた (install用のapkとpackage名が違う！と)

## 解決方法

- `base` と `installed` の関連付けの方法が、codelabのやり方だと上手くいかないので、 `googlesample` の方に合わせる

### codelabsの方

- `:installed` -> `:base` で依存を解決している

![image.png](https://qiita-image-store.s3.amazonaws.com/0/32424/018491af-d499-c40f-9536-3f586f463f5b.png)

- おそらくこれだと、 `:instant` をビルドする時に `:installed` の情報が全く分からなくなり、仕方なく `:base` の情報を元にビルドが走る -> package名が base のものを使う、になってしまうのだと思う

### googlesampleの方

- `:base` -> `:installed` で依存を解決している
  - https://github.com/googlesamples/android-instant-apps/blob/master/hello-feature-module/features/base/build.gradle#L49
- 逆に `:installed` -> `:base` は何も張ってない
  - https://github.com/googlesamples/android-instant-apps/blob/master/hello-feature-module/installed/build.gradle
【随時更新】公式ドキュメントを読む時にわかると便利な英単語

# 概要

公式ドキュメント(php.netとかMySQLとか)を読む時に自分がわからない単語などを調べていく。

# 単語一覧

※ 一般的な意味とは限らない。技術のドキュメントによく使われる意味を意味の欄には載せている。

|英単語|意味|
|:---:|:---:|
|candidate|検索候補|
|||



# 熟語一覧

|英熟語|技術的な意味|使う状況|
|:---:|:---:|:---:|
|be glad to announce the release of ~|~のお知らせができることを嬉しく思う|リリースノート|
|the new features and other changes|新しい特徴とそのほかの変更|新しいバージョンにおける変更点のお知らせ|
|be encouraged to upgrade to ~|~にアップグレードすることをオススメする|新しいバージョンにあげることが推奨される時など|
|||
create_queue_function


```php
function create_queue_function(...$values): callable
{
    return function () use (&$values) {
        return array_shift($values);
    };
}

$numbers = create_queue_function(1, 2, 3);

assert($numbers() === 1);
assert($numbers() === 2);
assert($numbers() === 3);
assert($numbers() === null);
```
脱jQueryのためのメモ

jQueryに頼らないために、頼るもののメモ。
（IE11対応のためのポリフィル等も含む）

随時更新。

## DOM操作
Vanilla JS

## カルーセル
Swiper
http://idangero.us/swiper/

## スムーススクロール
Smooth Scroll
https://github.com/cferdinandi/smooth-scroll

## ajax
axios
https://github.com/axios/axios

## ES2018 Polyfill
@babel/polyfill
https://babeljs.io/docs/en/babel-polyfill

## Promiseのみのポリフィル
Promise Polyfill
https://github.com/taylorhakes/promise-polyfill

## 画像遅延読み込み
lazysizes
https://github.com/aFarkas/lazysizes

## SVGスプライト
svgxuse
https://github.com/Keyamoon/svgxuse

## URLクエリパラメーター操作
URLSearchParams
https://github.com/jerrybendy/url-search-params-polyfill

## CSS非同期読み込み
loadCSS
https://github.com/filamentgroup/loadCSS
[Solidity]Truffle Test Event JavaScript


```
    it("Test", function () {
     let price = '';
     return Contract.deployed().then(async function (instance) {
       await instance.hoge(
         a,
         b,
         { value: xxxxxxx,
           from: accounts[0] })
         .then(function(result){
             price = web3.fromWei(result.logs[0].args.Price.toNumber(), 'ether');
       console.log(price);
       assert.equal(price, targetPrice, "Wrong Price");
     });
    });
```
【自分用メモ】便利ツール

※リンク切れになってる可能性もあるので注意しておくんなまし。
# 画像
|  | URL  |
|:-----------|:------------|
| ダミー画像生成| https://placehold.jp/|
| 画像base64エンコード| https://lab.syncer.jp/Tool/Base64-encode/|

# テキスト
|  | URL  |
|:-----------|:------------|
| 数値参照| http://www9.plala.or.jp/oyoyon/html/script/change_char.html|
| 連番テキスト| https://hogehoge.tk/serial/|
| 半角変換| http://zerothree.sub.jp/php/mbckana/|
| 特殊文字変換| http://tech-unlimited.com/escape.html|

# CSS
|  | URL  |
|:-----------|:------------|
| CSSグラデーション| http://www.colorzilla.com/gradient-editor/|
| CSS三角形| http://apps.eky.hk/css-triangle-generator/|
| CSSフィルター| https://www.cssfilters.co/|
/etc/apt/source.listについて

deb http://~/ubuntu/ bionic main
や
deb-src http://~/ubuntu/ bionic main

といった書式の意味を調べてみました。

# debとかdeb-srcとは
- アーカイブの種類

## debとは
- debパッケージのリストの取得に使われる
    - .debファイルの事
- バイナリパッケージの取得に使われる

# URL部分は何
- debパッケージやバイナリパッケージを取ってくるためのアドレス

# bionic とは
- ubuntuのディストリビューションです
    - ubuntu18.04のディストリビューションはbionicとなります

# main とは
- コンポーネントの種類
    - main contrib non-free non-US restrictedなどがあります
- コンポーネントを増やすと利用出来るパッケージが増えます
- コンポーネントの種類によって利用規約が異なる点は注意 

お世話になった所
> [source.listの書式](https://blog.goo.ne.jp/j_adversaria/e/4c024665dc61a79510d72cdf5444467a)
Rails generateとは

この記事では、railsコマンドである`$ rails generate model 名前 [カラム名:型] [オプション]`
について説明を行う。

##$ rails generate modelによって何が起きるのか

rails generate migration によって、マイグレーションファイルを作成することができます。

マイグレーションは、テーブルを作成するだけでなく、データベースの管理全般を担っているので、
テーブルのカラム追加のときにも使用します。

## マイグレーションファイルとはなんなのか

マイグレーションファイルとは、Rails からデータベースのテーブルを管理するためのファイルです。

今までデータベースのテーブルを CREATE TABLE ... のように SQL を書いて実行していましたが、 
Rails ではマイグレーションファイルというテーブル管理ファイルによって管理・実行することになります。

主に、テーブルを作成・削除したり、カラムを追加・削除に関することがファイル内に記述されます。
Rails でテーブルの設定を変更したいときには、マイグレーションファイルを作成し、Rails からマイグレーションを実行します。

レッスン後半で、マイグレーションのみを作成する方法も扱います。
ここでは、Model を作成するときに同時に生成されるマイグレーションファイルを扱います。

今回 rails g model Message content:string コマンドによって、
 db/migrate/20170201092919_create_messages.rb が作成されました。
これが、 Message モデルのマイグレーションファイルとなります。
このマイグレーションファイルを開いてください。
今更a == 1 && a == 2 && a == 3の話

# はじめに
`if(a == 1 && a == 2 && a == 3)`を常に`true`にしたい、という話が結構前にありました。
[Can (a== 1 && a ==2 && a==3) ever evaluate to true?] (https://stackoverflow.com/questions/48270127/can-a-1-a-2-a-3-ever-evaluate-to-true)

これをC#で~~推奨されない方法で~~解決してみたいと思います。
## 問題の整理
さて、この問題ですべきことを見てみましょう。

* `if(a == 1 && a == 2 && a == 3)`を常に`true`にしたい

まあ単純な話で、副作用を持つプロパティを使用すればいいのでは……と思いきや、単純にその方法で実装してしまっては、次のようなコードにおいて、問題文の条件を達成できません。

```
if(a == 1 && a == 2 && a == 3)
{
    //何らかの処理
}
if(a == 1 && a == 2 && a == 3)
{
    //ここを通らない
}
```

問題で与えられているのは、`if(a == 1 && a == 2 && a == 3)`を**常に**`true`にすることです。

# 問題解決への道筋

ということで今回は、以下のようなコードで条件を達成することを考えます。

```csharp:code.cs
using System;
namespace MyNamespace
{
    class MyClass
    {
        static void Main()
        {
            var a = 1;

            if(a == 1 && a == 2 && a == 3)
            {
                Console.WriteLine("Hello, world!");
            }
            if (a == 1 && a == 2 && a == 3)
            {
                Console.WriteLine("Hello, myself!");
            }
        }
    }
}
```

## 演算子オーバーロードと文脈キーワード
### 文脈キーワード
文脈キーワードとは、特定の文脈でのみキーワードとなるキーワードのことです(正確には、contextual keywordといいます)。
たとえば、C#において`yield`は単独ではキーワードではありません。
ですが、後ろに`break`や`return`がつくと、`yield break`や`yield return`という一つのキーワードとして動作するようになります。

さて、ご存知の通り、C#において`var`は文脈キーワードです。
以下のコードがコンパイル可能なことからもわかるでしょう。

```csharp:VarVariable.cs
namespace MyNamespace
{
    class VarVariable
    {
        object var;
    }
}
```

これは`var`という名前のフィールドを宣言しています。
そして、以下のコードもコンパイル可能です。

```csharp:VarClass.cs
namespace MyNamespace
{
    class VarClass
    {
        class var
        {
        }

        static void Main()
        {
            var var;
        }
    }
}
```

わかりにくいのですが、Main()にある`var`の型は型推論を行うための`var`ではなく、VarClassで定義された型としてのclassの`var`です。

### 暗黙の型変換
さて、見かけ上何もしていない風に見せかけたいので、`var`型の変数`var`に`1`を代入したいのですが、当然`1`はそのままでは数値なので代入できません。
そのため、暗黙の型変換を定義します。

```csharp:VarClass-2.cs
namespace MyNamespace
{
    class VarClass
    {
        class var
        {
            public static implicit operator var(int i) => new var();
        }

        static void Main()
        {
            var a = 1;
        }
    }
}
```

これで`var`型の変数`a`に、`1`が型変換されて入るようになります。

### 等価のオーバーロード
次に、`a`と`数値`の==での比較を`true`にする方法を考えましょう。
これは単純で、==演算子をオーバーロードするだけでOKです。が、!=演算子もオーバーロードする必要があります。

```(抜粋)VarClass-3.cs
class var
{
    public static implicit operator var(int i) => new var();

    public static bool operator ==(var v, int i) => true;

    public static bool operator !=(var v, int i) => false;
}
```

これで左辺にvar型、右辺にint型が来たときの==の動作を定義することができました。
最後にvar.classを隠蔽するためにvar.classを別ファイルに分けてあげれば完成です。

### 注釈

* [小文字で始まるクラスを作るのはやめよう](https://docs.microsoft.com/ja-jp/previous-versions/dotnet/netframework-4.0/ms229043(v=vs.100))
* ==と!=をオーバーロードしたときはちゃんとEquals()とかGetHashCode()とかToString()もオーバーロードしよう
Python2.7で文字列日付に1日加算

# きっかけ
ありがちな機能だけど、今回Python2.7でやったときはいくつかページを行き来して作ることになったためログる。

```python
from datetime import datetime, timedelta
converted_date_string = _convert_date(u"2018/08/01")
converted_date = datetime.strptime(converted_date_string, '%Y/%m/%d')
converted_date += timedelta(days=1)
converted_date.strftime("%Y/%m/%d").decode()
```

既存ロジックがユニコード指定を細かくやっているので最後はdecode()。
（ほんとは文字コードも指定するか迷ったけど、デフォルトに従う方がいいかなと思い無指定）

一筋縄でいかなかったのは、timedeltaの扱い。
以下のロジックでは動かなかった。

```python
from datetime import datetime
converted_date += datetime.timedelta(days=1) # ERROR timedeltaがないって
```
Alexaスキル開発で「スキルからの応答に問題があります」が発生したときのトラブルシューティング


Alexaスキル開発していますか？
自分の実装したとおりにAlexa様が話してくれるのはとても楽しいのですが、Webやモバイルアプリとはまた異なるインターフェイスなこともあり、開発環境にはやや面倒臭さを感じる今日このごろです。

# 「スキルからの応答に問題があります」

スキルをLambdaへデプロイ後、動作確認のために[alexa developer console](https://developer.amazon.com/alexa/console/ask)から「テスト」を実行していることと思います。
ウェイクワードを発話していざ実装したインテントリクエストを起動すると、


**「スキルからの応答に問題があります」**

![Alexa_Skills_Kit_Developer_Console.png](https://qiita-image-store.s3.amazonaws.com/0/8607/d614a594-fdeb-560d-32c4-641732bdb445.png "Alexa_Skills_Kit_Developer_Console.png")


無慈悲なこの文言が帰ってきます。
皆さんはこんなときどうしていますか？ むしろ教えてほしいくらいなのですが、自分なりの調査方法を載せておきます。


# 1. Cloud9でデバッグする

これが一番です。
利用料が多少かかりますが、些末なものです。

[AWS Cloud9 料金](https://aws.amazon.com/jp/cloud9/pricing/)

（ちなみにAWS Cloud9は東京リージョンでは利用できません。なので、Lambdaが東京リージョンへデプロイされている場合はこの方法は使えません。ここは多言語対応を見込んでバージニア北部リージョンあたりへデプロイするのはどうでしょうか）

右ペインの「AWS Resources」内の「Remote Functions」ツリーにcloud9と同じリージョンにデプロイされたLambdaファンクションの一覧が表示されているので、右クリック=>Importを選択します。
すると左ペインのEnvironmentツリー内にLambdaファンクションが表示されます。

![cloud9_-_AWS_Cloud9_2.png](https://qiita-image-store.s3.amazonaws.com/0/8607/a509cff0-4e45-e231-bc86-07036545be8b.png "cloud9_-_AWS_Cloud9_2.png")

![cloud9_-_AWS_Cloud9_1.png](https://qiita-image-store.s3.amazonaws.com/0/8607/8c5b0671-f170-9664-2c6e-5fe2059dc06b.png "cloud9_-_AWS_Cloud9_1.png")


まずはここでもエラーが再現するかやってみます。
上の「Run」ボタンをクリックすると画面が分割され、デバッグ用のウィンドウが表示されます。

"payload"と表示されているエリアにalexa developer consoleに出力された、こちらが発話した際にAlexaが読み取ってLambdaに投げたJSONをコピペし、「Run」ボタンを押します。
すると、"Response"エリアにLambdaの実行結果が出力されます。

![cloud9_-_AWS_Cloud9.png](https://qiita-image-store.s3.amazonaws.com/0/8607/fef2d3c9-a9a4-d1bf-264b-2e79a606e42a.png "cloud9_-_AWS_Cloud9.png")


ここで何某かのエラーが出力されていればあとはブレークポイントを張ってデバッグすれば良いです。
cloud9でのデバッグ機能の使い方についてはここでは触れません。


# 2. Lambda Management Consoleでデバッグする

まれに、alexa developper consoleではエラーになるのにcloud9では正常なレスポンスが返される、ということがあります。
大抵の場合は権限ですが、まずは調べてみましょう。

[AWS Management Console](https://aws.amazon.com/jp/console/)からデプロイしたLambdaの編集ページを開きます。
右上のセレクトボックスから「テストイベントの設定」を選択します。

![Lambda_Management_Console_1.png](https://qiita-image-store.s3.amazonaws.com/0/8607/af969b3f-5c28-b746-c45d-4b7b870d59b6.png "Lambda_Management_Console_1.png")


ダイアログが開くので、ここに先ほどと同じJSONをコピペし、適当な名前をつけて保存します。
あとは「テスト」ボタンを押すだけです。
cloud9では再現しなかったエラーがこちらでは再現するかもしれません。
エラーログまで出力されるので、原因究明まで一瞬ですね。

![Lambda_Management_Console.png](https://qiita-image-store.s3.amazonaws.com/0/8607/787bcda6-a2c5-4f46-d489-1fd0b25cd104.png "Lambda_Management_Console.png")


# 「AskSdk.DynamoDbPersistenceAdapter Error」

自分の場合は、DynamoDBへのアクセス権限がなかったことが原因でした。
cloud9はAWSの各種サービスへのアクセス権を持ったユーザーで実行していたため、DynamoDBを参照した際にもエラーにならなかったのだと思います。
上記2ではLambdaに付与されているロールで実行されるため、アクセス権エラーが再現するのでしょうね。


#### 2019.6.1 追記
2019年4月にCloud9が東京リージョンに対応したとのニュースがありましたね。
[AWS Cloud9 が東京リージョンに対応しました](https://aws.amazon.com/jp/blogs/news/aws-cloud9-tokyo/)
Hyperでemojiを表示する(Ubuntu)

Hyperというターミナルがあります。

[Hyper™](https://hyper.is/)

最近気に入って使っていて、emoji表示をしたいなと思ったのでその手順をメモ。

# 環境:computer:

- Hyper 2.0.0(stable)
- Ubuntu 18.04 LTS

です。他のOSでは異なる気がするので、適宜調べつつやってみていただけると良いかと思います。

# 手順
手順というほど大したことは無いのですが…。

## `.hyper.js`を開く
お好みのエディタで`~/.hyper.js`を開くか、Hyperを開いている状態で`Ctrl + ,`を押すと開きます。

## `font-family`を書き換える:pencil:
Ubuntu 18.04には最初から[Noto Color Emoji](https://www.google.com/get/noto/help/emoji/)という絵文字用のフォントがインストールされているので、そちらを追加で指定してあげることで絵文字を表示できるようになります。

```diff
module.exports = {
  config: {
    // choose either `'stable'` for receiving highly polished,
    // or `'canary'` for less polished but more frequent updates
    updateChannel: 'stable',

    // default font size in pixels for all tabs
    fontSize: 14,

    // font family with optional fallbacks
-    fontFamily: 'Menlo, "DejaVu Sans Mono", Consolas, "Lucida Console", monospace',
+    fontFamily: '"Noto Color Emoji", Menlo, "DejaVu Sans Mono", Consolas, "Lucida Console", monospace',

    // default font weight: 'normal' or 'bold'
    fontWeight: 'normal',
(以下略)
```

# 結果
yarnを実行しているときのスクリーンショット:camera:

![image.png](https://qiita-image-store.s3.amazonaws.com/0/20371/dd37ef33-5652-9519-3be0-18c909941231.png)

こんな感じでかわいく表示されるようになりました:sparkles:

(絵文字の話なので絵文字をたくさん使って書いてみましたが単純にうざい感じになってしまいました。)
Instagramのアイコンの背景色をSwiftで書いてみる

アプリにInstagramでシェアボタンをつけたいときに使うメモ。

### 流れ
* 骨組み素材を以下公式サイトからダウンロードし、UIImageViewに指定する
https://en.instagram-brand.com/assets/glyph-icon

* UIImageViewにレイヤーを指定する

### 実装サンプル

```Example.swift
let layer = CAGradientLayer()
layer.frame = imageView.bounds

//角度を45度に指定
layer.startPoint = CGPoint(x: 1.0, y: 0.0)
layer.endPoint = CGPoint(x: 0, y: 1.0)
layer.position = imageView.center
layer.colors = [
    #colorLiteral(red: 0.07843137254902, green: 0.0, blue: 0.784313725490196, alpha: 1),
    #colorLiteral(red: 0.725490196078431, green: 0.0, blue: 0.705882352941176, alpha: 1),
    #colorLiteral(red: 0.96078431372549, green: 0.0, blue: 0.0, alpha: 1),
    #colorLiteral(red: 1.0, green: 1.0, blue: 0.0, alpha: 1)
    ].map { $0.cgColor }

layer.drawsAsynchronously = true

imageView.layer.insertSublayer(layer, at: 0)
```

### 生成したアイコン
<img width="47" alt="Icon.png" src="https://qiita-image-store.s3.amazonaws.com/0/90301/ff2c0e54-8067-6db1-614c-44a6cf79b98d.png">


### 補足
Instagramは規制が厳しく、間違ったアイコンは使っちゃダメとのこと。
骨組みを表現する背景画像自体は公式サイトからダウンロードするといいらしい。