OmniAICreator/Qiita-1.07M huggingface dataset:
Vim patchダイジェスト [2021/09]

[Vim](http://www.vim.org/)のリリースされた[patch](https://github.com/vim/vim/commits/master)の説明です。
([8.2.3392](https://github.com/vim/vim/commit/b4d82e2a8d610c00139a74970df772eece2daf1c) ～ [8.2.3459](https://github.com/vim/vim/commit/51491adfa86fd66a857cd7ec50d0b57dbdf3da59))
**新機能、大幅な仕様変更には、:four_leaf_clover:が付いています。**
Vim9 scriptの実装/仕様変更/不具合修正も頻繁におこなわれています。

* [runtimeファイル更新](https://github.com/vim/vim/commit/34cc7d8c034f2bc5b57455577051db8d72e2b87c): [Todo](https://github.com/vim/vim/commit/34cc7d8c034f2bc5b57455577051db8d72e2b87c#diff-fb7eed53e3f2993f9d82c748206eaca82fd1d054a417c6de477bb54373d85643)更新。helpファイル更新。他。
* [8.2.3438](https://github.com/vim/vim/commit/5dfe467432638fac2e0156a2f9cd0d9eb569fb39): :four_leaf_clover:`blob2list()`と`list2blob()`を追加しました。
* [8.2.3433](https://github.com/vim/vim/commit/bdcba24d8597abd5af509c2fb9206e64e713c711): :four_leaf_clover:`:delcommand`に`-buffer`オプションを追加しました。カレントバッファに定義されたユーザ定義コマンドを削除します。
* [8.2.3430](https://github.com/vim/vim/commit/f1e8876fa2359b572d262772747405d3616db670): :four_leaf_clover:`ModeChanged`イベントを追加しました。モード変更後にトリガーされます。
* [8.2.3424](https://github.com/vim/vim/commit/f14b8ba1373f569705cb80419248054100b02360): :four_leaf_clover:`'listchars'`に`multispace`オプションを追加しました。連続するスペースを表示するために周期的に使用する1文字以上の値が指定できます。`space`が`' '`以外の場合は設定を上書きします。
* [runtimeファイル更新](https://github.com/vim/vim/commit/6c391a74fe90190796ca0b0c010112948a6e75d7): [Todo](https://github.com/vim/vim/commit/6c391a74fe90190796ca0b0c010112948a6e75d7#diff-fb7eed53e3f2993f9d82c748206eaca82fd1d054a417c6de477bb54373d85643)更新。helpファイル更新。他。
* [8.2.3418](https://github.com/vim/vim/commit/070ac3433b0ebefd6dc6cd49707fcfa1421b9e67): :four_leaf_clover:式の評価中はガベージコレクトをおこなわないようにしました。
* [8.2.3410](https://github.com/vim/vim/commit/89a54b413a8c96206ce7e038dde81a6eff6cd6b8): `'linebreak'`と`'listchars'`を設定時に`'tabstop'`に大きい値を設定するとクラッシュする件を修正しました。
* [8.2.3405](https://github.com/vim/vim/commit/ec1b0968aa90d408a79b5b5dca465f65e69753a1): ユーザ定義コマンド(`:command`)の`{}`ブロック内でコメントが使用できない件を修正しました。
* [8.2.3400](https://github.com/vim/vim/commit/7f2dd1e90c1d4a30c791fae20014594641769a1e): :four_leaf_clover:`:z!`を追加しました。`:z`と似ていますが、[count] が省略された場合は表示行数がカレントウィンドウの行数ではなく、Vimのウィンドウの行数 - 1 を使います。
* [8.2.3394](https://github.com/vim/vim/commit/04626c243c47af91c2580eaf23e12286180e0e81): diffモードでバッファを編集したときに不自然なスクロールが発生することがある件を修正しました。

---
#### 凡例

|表記|意味|
|:------|:------|
|:four_leaf_clover:|新機能、大幅な仕様変更|
|:alien:|Vim開発者向けの追加、変更|
|`'hoge'`|オプション (`:h options`参照)|
|`:hoge`|Exコマンド (`:h :index`参照)|
|`hoge()`|組み込み関数 (`:h functions`参照)|
|`v:hoge`|Vim定義済変数 (`:h v:`参照)|
|`+hoge`|feature (`:h +feature-list`参照)|

---
#### 方針
[こちら](http://qiita.com/h_east/items/23cd0d10932505072e6b#%E6%96%B9%E9%87%9D)を参照。
高速にpandasのDataFrameにobjectが含まれているかどうか確認する方法

# 目的
渡されたDataFrameタイプのデータに対して，columnにobjectが含まれているかどうかをなるべく早く確認したい．

# 実験コード
結論，3つ目の実装が最速です．

```python
import pandas as pd
import numpy as np


def test(n_rows, n_cols):
    X_only_num = pd.DataFrame(np.ones((n_rows, n_cols)))
    X_only_cat = pd.DataFrame([['a' for c in range(n_cols)] for r in range(n_rows)])
    

    def has_object_columns1(X) -> bool:
        return not X.select_dtypes(include='object').empty


    def has_object_columns2(X) -> bool:
        feature_types = X.dtypes
        for feat_type in feature_types:
            if pd.api.types.is_object_dtype(feat_type):
                return True
        return False


    def has_object_columns3(X) -> bool:
        return np.dtype('O') in X.dtypes.values


    %timeit has_object_columns1(X_only_num)
    %timeit has_object_columns1(X_only_cat)

    %timeit has_object_columns2(X_only_num)
    %timeit has_object_columns2(X_only_cat)

    %timeit has_object_columns3(X_only_num)
    %timeit has_object_columns3(X_only_cat)
```

# 結果
**n_rows=100, n_cols=1000**

| Method |Only numerical (ms) | Only categorical (ms) |
|:--: | :--: | :--: |
| method 1  | 0.5 | 1.1 |
| method 2  | 0.6 | 0.6 |
| method 3 | 0.1 | 0.09 |

**n_rows=100, n_cols=100000**

| Method |Only numerical (ms) | Only categorical (ms) |
|:--: | :--: | :--: |
| method 1  | 4.1 | 69.1 |
| method 2  | 52 | 50 |
| method 3 | 3.8 | 1.54 |

# Method 3が最速になる理由
他の方法は確認のために新たなデータを作成し，そのメモリを確保していますが，Method 3はすでに定義されている変数のみを利用しているのでループの回数が少なく済みます．
また `in` を利用することで `for` の利用を回避できていることも高速化に繋がっています．
Rails annotateについて

#annotateとは
***annotate***とはmodelやテストのファイルに
```schemaなどにあるデータベースの情報などをコメントとして出力させるためのgem```です。
schemaを確認する手間が省けるメリットがあります。

#導入方法
まず初めにGemfileの中に以下のように追記します。

```Gemfile
group :development do
  gem 'annotate'
end
```

その後にbundle installで導入完了です。

#annotateの実行
migrationを実行した時に、schema(データベース)の情報を
ファイルにコメントを出力させたい時には以下のコマンドを実行します。

```
$ bundle exec rails g annotate:install
```

```app/model/memos.rb

# == Schema Information
#
# Table name: articles
#
#  id         :integer           not null, primary key
#  body       :text
#  title      :string
#  created_at :datetime         not null
#  updated_at :datetime         not null


#省略


class Memo < ApplicationRecord
 
end



```


```factories/memo.rb

# == Schema Information
#
# Table name: memos

#  id         :integer           not null, primary key
#  body       :text
#  title      :string
#  created_at :datetime         not null
#  updated_at :datetime         not null

FactoryBot.define do
  factory :memo do

    #省略
    
  end
end

```
のようにコメントを出してくれます。


こちらの都合でもっと詳細に書くことはできませんが、
他のもルーティング情報を書き出したり、手動で　実行したり、コメントを消したりできる
コマンドがあるので下の資料から調べてみてください。

●参考資料
https://tech.mof-mof.co.jp/blog/rails-annotate/#annotate%E3%81%A8%E3%81%AF
https://qiita.com/kou_pg_0131/items/ae6b5f41c18b2872d527
GPU最速ソート! Radix Sort その②

第二回です。今回はGPUでRadix sortをやる上で重要な処理である、累積和についてだけ説明します。

# 累積和とは

概要は前回時期を参照してもらいたいのですが、配列要素を$a_n$とした時の累積和を$S_n$は

$$S_n = a_0 + a_1 +\cdots + a_{n-1}$$

とします。$a_n$を和に含める定義もありますが今回はRadix sortをするので上の定義でいきます。

# GPUの仕組み

GPUの並列処理ではgrid, block, threadの概念を理解しなければいけません。簡単に言うとthreadは並列化の単位で、各スレッドで処理が回ります。そしてblockはスレッドの集合体で、gridはblockの集合体です。カーネルを実行する際は、配列のサイズによってgridとblockをいくつ使うかを指定するわけです。こんな感じで

```cuda
int block = 512;
// int の割り算ではあまりを切り捨てるので、配列サイズによってはgrid = 0になってしまいます。
// それを防ぐために以下のような式にしています。
int grid = (/*array_size*/ + block - 1) / block;
myKernel<<<grid, block>>>(/*variables*/);
```

ややこしいのは、gridはいくつのblockを使うか、blockは各blockでいくつのthreadを使うかを指定しているところです。gridとblockと書いていますが、意味的にはblockとthreadの数ですね。なんでこんなややこしいんだ。。。

GPUにカーネル実行の命令を投げたとき、設定したgrid, blockに応じてスレッドを割り振ります。このとき、各スレッドは完全に並行処理されるわけではなく、自動でスケジューリングされて時間差で実行されます。

![スクリーンショット 2021-10-03 19.50.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530192/90c0fc30-0a2b-b42e-164b-99bccda72b29.png)

ですので、他のスレッドの処理結果を自分のスレッドで使おうとすると、相手のスレッドがまだ処理完了していないと言う事態が発生します。

ここで同期が重要になってきます。他のスレッドの結果を利用する前に、全員の処理が終わるまで待機します。CUDAの場合、同期の種類は主に3つあります。

| 種類 | 関数 | 呼び出す場所 |
|:-:|:-:|:-:|
|block内だけの同期| __syncthreads() | カーネル関数内 |
|block間の同期|特にない。カーネルを抜けることで同期する。| - |
|CPUとGPU間の同期|　cudaDeviceSyncronize()　| CPU側のホストコード内 |

素人考えだとblock間の同期とCPUとの同期があれば十分に思えますが、block間の同期は全blockを待機するのに対し、syncthreads()はblock内でだけ待機すればいいので、待機時間が短く高速です。cudaの高速化にはsyncthreads()をいかに上手く使うかが肝になります。

# GPUで累積和をとる。

やっと累積和の話に移ります。配列数がNの時、cpuなら$O(N)$の計算量です。ところがどっこいGPUならこんな形で$O(\log(N))$にすることができます。(GPUの方がクロックが遅いことには留意しましょう。)

![](https://developer.nvidia.com/sites/all/modules/custom/gpugems/books/GPUGems3/elementLinks/39fig02.jpg)

しかしこれはあまり効率的ではありません。たとえば$x_0$から$x_3$をblock0で、$x_4$から$x_7$をblock1で、実行するとき、d=2の時にいきなりblock間の同期が必要になります。$\log(8) = 3$ステップで処理ができるのはいいのですが、block間同期のせいで遅くなります。できるだけblock内の同期で済ませるため、和をとる処理を次のように分けます。

**upsweep**
![](https://developer.nvidia.com/sites/all/modules/custom/gpugems/books/GPUGems3/elementLinks/39fig03.jpg)

**downsweep**
![](https://developer.nvidia.com/sites/all/modules/custom/gpugems/books/GPUGems3/elementLinks/39fig04.jpg)

よくもまあこんなフローを思い付いたもんだと感心します。upsweepを見ると、d=2を実行する時まではblockを跨いだ配列のやりとりがないので、block内の同期で事足ります。downsweepもblock間の同期が削減できます。

# つぶやき
2日連続で雑多な記事を書いたので追記することがあればまた書こうと思います。とりあえずRadix sortのGPU実装は以上です。
[python3 / numpy] np.full_like で初期値としてnp.nanを指定すると、異常な値が出現する

# Phenomenon (症状)

```python
>>> import numpy as np
>>> np.full_like([1,2,3], np.nan)
array([-9223372036854775808, -9223372036854775808, -9223372036854775808])
```

げげっ(｡ŏ﹏ŏ)

# Resolution (解決策)

## 1. `dtype`も指定してあげる

たとえば`np.float64`を指定してあげる

```python
>>> import numpy as np
>>> np.full_like([1,2,3], np.nan, dtype=np.float64)
array([nan, nan, nan])
```

## 2. `array_like`に、dtypeがfloatになっている`np.ndarray`を渡す

```python
>>> import numpy as np
>>> np.full_like(np.array([1.0,2.0,3.0]), np.nan)
array([nan, nan, nan])
```

# References (参考資料)

https://numpy.org/doc/stable/reference/generated/numpy.full_like.html#numpy-full-like

公式ドキュメントにも、`dtype`指定してねって書いてある。
けど、なんで？o(｡＞∆＜)o
【Unity2020】iPadPro12.9でGoogle Cardboard XR Plugin for Unityのサンプルを動かしてみた

# はじめに
需要は極めて少ないと思いますが、Google Cardboard XR Plugin for Unityネタです。

もしかするとサイズの大きいiPadProではVR機能を使用することができないのでは？と思ってをiPadPro12.9でサンプルを動かしてみました。

# 結果

どうやらちゃんと表示されるようです。
更に、鼻がディスプレイに当たらないように画面の端にシーンが表示される親切設計です。

<iframe width="560" height="400" src="https://www.youtube.com/embed/l1ZHA8K9h4E" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>


SDKの入手はこちら⇨https://github.com/googlevr/cardboard-xr-plugin