OmniAICreator/Qiita-1.07M huggingface dataset:
MacにKarabiner-Elementsを入れてEmacsとの親和性を高める

# Karabiner-Elements
[Karabiner-Elements](https://karabiner-elements.pqrs.org)
キーマップを変更できるソフト．誰かが用意してくれたセッティングなどもWEBから簡単にインポートできる．

Emacsを使うときは，左右両方にCtrlキーとAltキーが無いと困るタイプなので，Karabiner-Elementsを使ってキーマップを変更する．

使っているキーボードは日本語（JIS)．

インストールするKarabiner-Eelementsのバージョンは13.1.0．
## インストール
上記公式サイトからインストーラーをダウンロードして，後はそれを実行していけば良い．

## 初回起動
初回起動時に指示が出るのでその通りに行えば良いが，`karabiner_grabber`と`karabiner_observer`にキーボードの入力監視を行う許可を与える設定をする必要がある．
自動的に出てくるウィンドウをクリックすると
`セキュリティとプライバシー` --> `入力監視` --> `プライバシー`の設定画面に移るので，この二つのアプリケーションにチェックを入れる．変更するには右下の鍵を一時的に開ける必要がある．

キーボードの認識が始まるので指示通り行う．


## 設定

### Simple modifications
- Caps Lockは使わないし，間違って押すと困るので`left_control`に変更．
- Macの日本語キーボードには右コントロールが無いので右コマンドキーを右コントロールキーに変更．

| From key | To key |
|:--------:|:------:|
| caps_lock | left_control |
| right_command | right_control |


### Complex modifications

#### バックスラッシュ

デフォルトではバックスラッシュはOptionキーを押さないと打てないが面倒なので`\`と`¥`を入れ替える．

1. 左下の`+Add rule`をクリック．
2. `Import more rules from the Internet (open a web browser)`をクリック．
3. 検索して`Swap ¥ and \ always on JIS Keyboads`をインポート．
4. 2つともEnableにする


#### 右側にもoptionキーを作り出す

1. 左下の`+Add rule`をクリック．
2. `Import more rules from the Internet (open a web browser)`をクリック．
3. 検索して`For Japanese （日本語環境向けの設定） (rev 6)`をインポート．
4. `英数・かなキーを他のキーと同時に押したときに、Optionキーを送信する (rev 3)`を有効にする．

これがめちゃくちゃ便利で，かなキーを普通に単体で押したときは元の動作で，かなキーを押しながら何かキーを押すとoptionキーの役割をしてくれる．

Emacsでは下記のように，optionキーをMetaキーに設定することで，右側にもMetaキーができる．

``` lisp
(sets mac-option-modifier 'meta)
```
#### Emacsキーバインド

Macはデフォルトである程度Emacsキーバインドが使えるが，一部だけで使えないものもあるので，ここで設定をインポートしてさらにEmacsとの親和性を高める．
同様にWEBから`Emacs key binding (rev12)`をインポートする．

色んな設定があるが，以下のものだけ有効にした．

- `Emacs key bindings [C-x key strokes] (rev 2)`
- `Emacs key bindings [control+keys] (rev 10)`
- `Emacs key bindings [option+keys] (rev 5)`

下記のキーバインドが有効になる．（https://ke-complex-modifications.pqrs.org/ から引用）

##### Key Bindings (C-x key strokes)
|key | 説明 |
|:--:|:---:|
|C-x C-c | Quit application (post command-q) |
|C-x C-f | Open file (post command-o) |
|C-x C-s |Save file (post command-s) |

##### Key Bindings (control+keys)
|key | 説明 |
|:--:|:---:|
|control+d | forward delete |
|control+h | delete |
|control+i | tab |
|control+[ | escape |
|control+m | return |
|control+bfnp |	arrow keys |
|control+v | page down |
|control+a | (Microsoft Office)	home |
|control+e | (Microsoft Office)	end |

##### Key Bindings (option+keys)
|key | 説明 |
|:--:|:---:|
| option+v | page up |
| option+bf | option+arrow keys |
| option+d | option+forward delete |
[PHP]多次元配列から要素をフィルタリングする

PHPには、[array_filter](https://www.php.net/manual/ja/function.array-filter.php)関数というものがあります。
配列に入っている要素を特定の条件でフィルタリングするための関数で、空の要素を排除したい時や偶数を取り出したい時などに使ったりします。

例えば以下のコードを実行した場合、２番目(空文字)、４番目(null)、６番目(false)の要素が削除され、値が入っているものだけを取り出すことができます。

```php
$array = [
    'aaa',
    '',
    'bbb',
    null,
    'ccc',
    false,
];

var_dump(array_filter($array));

/* 実行結果
array(3) {
  [0]=>
  string(3) "aaa" 
  [2]=>
  string(3) "bbb" 
  [4]=>
  string(3) "ccc" 
}
*/
```
しかし、array_filter関数は多次元配列には対応していないので、
多次元配列に対応した関数を作りました。

```php
/**
 * コールバック関数を使用して、配列の要素をフィルタリングする(多次元配列対応)
 *
 * @param array $array 処理する配列
 * @param callable $callback 使用するコールバック関数
 * @param bool $unset_empty_array 空の配列を削除するか否か
 * @return array $array フィルタリングされた配列
 */
function array_filter_recursive($array, $callback=null, $unset_empty_array=false)
{
    if (is_array($array)) {
        // コールバック関数が未指定の場合
        if (!$callback) {
            // コールバック関数を指定する
            $callback = function($value) {
                return !empty($value); 
            };
        }
        foreach (array_keys($array) as $key) {
            if (is_array($array[$key])) {
                // 多次元配列の場合は再帰処理を行う
                $array[$key] = array_filter_recursive($array[$key], $callback, $unset_empty_array);
                // $unset_empty_arrayがtrueかつ配列が空なら削除
                if ($unset_empty_array && empty($array[$key])) {
                    unset($array[$key]);
                }
            // 指定したコールバック関数をコールし、戻り値がfalseなら削除
            } else if (!call_user_func($callback, $array[$key])) {
                unset($array[$key]);
            }
        }
    }
    return $array;
}
```

ではさっそく、先ほど作った関数を使ってみたいと思います。

実行結果は以下の通りで、ちょっと歪な多次元配列でも空の要素が全て削除されることが確認できました。

```php
$array = [
    [],
    [
        'aaa',
        '',
        'bbb',
    ],
    [
        [
            null,
            'ccc',
            'ddd',
        ],
        [],
        [
            [],
            [
                'eee',
                'fff',
                false,
            ],
        ],
    ],
];

var_dump(array_filter_recursive($array, 'strlen', true));

/* 実行結果
array(2) {
  [1]=>
  array(2) {
    [0]=>
    string(3) "aaa"
    [2]=>
    string(3) "bbb"
  }
  [2]=>
  array(2) {
    [0]=>
    array(2) {
      [1]=>
      string(3) "ccc"
      [2]=>
      string(3) "ddd"
    }
    [2]=>
    array(1) {
      [1]=>
      array(2) {
        [0]=>
        string(3) "eee"
        [1]=>
        string(3) "fff"
      }
    }
  }
}
*/
```
簡単にDockerでreact環境を速攻で作る

こんにちは、IT技術者の田中です。
簡単にDockerでreact環境を速攻で作る

## 背景
Dockerでreact環境を速攻で作る最新(2020年12月12日)情報がなく困ったので、記事を書きました！ 
(色々惜しい記事はありましたが、ちょこちょこミスがあり困りました)

前提としてはmacbook proで構築しました！

## フォルダ構成

下記のフォルダ構成で作ります。

react
├ Dockerfile
├ docker-compose.yml
└ react-sample/

## Dockerfile

Dockerfileの内容

```
FROM node:15.3.0-alpine
WORKDIR /usr/src/app
```

## docker-compose.yml

docker-compose.ymlの内容

```
version: '3'
services:
  node:
    build: 
      context: .
      dockerfile: Dockerfile
    volumes:
      - ./:/usr/src/app
    command: sh -c "cd react-sample && yarn start"
    ports:
      - "3000:3000"
```

## dockerビルドを実行する

docker-compose.ymlのフォルダに移動します。

```
docker-compose build
```

上記が完了するまで待ちます。

## docker-composeでreactをプロジェクト作成

下記のコマンドで、reactのプロジェクトを作成する。

```
docker-compose run --rm node sh -c "npm install -g create-react-app && create-react-app react-sample"
```

## dockerのコンテナを起動する

下記のコマンドでdockerコンテナを起動する。

```
docker-compose up
```

## reactの起動を確認する

ブラウザーで下記のURLにアクセスする
http://localhost:3000

下記の画面が表示されたら無事成功
![スクリーンショット 2020-12-12 午後5.16.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282387/bfcb9286-30d7-43f6-e5cc-14c977e59b43.png)

終わり！
java ブラウザ自動テスト selenide chromedriverのバージョンエラー解消

Selenide動かしたとき、こんなエラーが出たので対応してみた。

```
org.openqa.selenium.SessionNotCreatedException: session not created: This version of ChromeDriver only supports Chrome version 88
Current browser version is 87.0.4280.88 with binary path C:\Program Files (x86)\Google\Chrome\Application\chrome.exe
Build info: version: '3.141.59', revision: 'e82be7d358', time: '2018-11-14T08:17:03'
System info: host: 'DESKT*****', ip: '192.168.1.60', os.name: 'Windows 10', os.arch: 'amd64', os.version: '10.0', java.version: '11.0.8'
Driver info: driver.version: SelenideDriver
```

# 状況

* chromedriverは88.*バージョンが動いている。
* Chromeは87.*バージョン

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224453/c2e9c777-4740-b2c2-f3e1-337c5c7016d4.png)

あれ？最新版だと言うてますが・・・

# chromedriverを入れ替え

**chromedriverどこや？**

gradleを使ってselenideの構成を作ったので勝手にchromedriver入ってる。
gradleなので例のところにいるはず。

> C:\Users\ユーザ名\.m2\repository\webdriver\chromedriver\win32\88.0.4324.27\chromedriver.exe

やっぱりいた。

### 別のバージョンのchromedriverを取得

https://chromedriver.chromium.org/downloads

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224453/0fcbc997-00c0-73ae-e8b2-cceb58b5582a.png)

> C:\Users\ユーザ名\.m2\repository\webdriver\chromedriver\win32\87.0.4280.88\chromedriver.exe

ここに入れて動かしてみたけどダメだった。
ブラウザのバージョンに合わせて自動的にドライバーを呼び分けてはくれない模様。
※ちなみに元からあったバージョンをフォルダごと削除してもダメだった。

# chromedriverの場所を指定

> D:\tools\chromedriver_win32\87.0.4280.88\chromedriver.exe

サイトで入手したchromedriverをここに場所移動して
WebDriverの場所をコードで指定すると成功した。

```java:SelenideTest.java
import static com.codeborne.selenide.Condition.*;
import static com.codeborne.selenide.Selenide.*;

import org.junit.jupiter.api.Test;
import org.openqa.selenium.By;

public class SelenideTest {

	@Test
	void testtest() {
		// ここでWebDriverの場所を指定した
		System.setProperty("webdriver.chrome.driver", "D:\\tools\\chromedriver_win32\\87.0.4280.88\\chromedriver.exe");
		open("http://google.com");
		$(By.name("q")).setValue("バナナ 大好き").pressEnter();

		$("#result-stats").shouldHave(text("約 18,600,000 件"));
	}
}
```

```gradle:build.gradle
(省略)
dependencies {
(省略)
	testCompile 'com.codeborne:selenide:5.16.2'
}
```

# 成功イメージ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224453/b1353a9f-a280-43ff-e2ae-7da8a35e87ac.png)

# 参考

* [Selenide公式サイト - QUICK START](https://selenide.org/quick-start.html)
* [ChromeDriver - downloads](https://chromedriver.chromium.org/downloads)
partial関数で部分適用した関数を実行した際に、"TypeError: add() got multiple values for argument 'xxx'"が発生した

# 環境
* python 3.8

# 問題
[functools.partial](https://docs.python.org/ja/3/library/functools.html#functools.partial)を使って、関数を部分適用したいです。

以下のようなコードを書いたら、"TypeError: add() got multiple values for argument 'a'"というエラーが発生しました。


```python
from functools import partial

def add(a:int, b:int) -> int:
    return a + b

# 引数`a`をキーワード引数として指定する
add_a1 = partial(add, a=1)

# a=1,b=2,result=3 を期待していた
result = add_a1(2)

# TypeError: add() got multiple values for argument 'a'
```


# いろんなパターンを試す
以下のようなコードの場合、エラーは発生しませんでした。

```python
# 引数`a`を位置引数として指定する
foo = partial(add, 1)
result = foo(2)
print(result)
# => 3

add_a1 = partial(add, a=1)
# 引数`b`をキーワード引数として指定する
result = add_a1(b=2)
print(result)
# => 3
```

# partial関数の中身を見る
[functools.partial](https://docs.python.org/ja/3/library/functools.html#functools.partial)関数のドキュメントによると、partial関数の中身は以下のコードと等価です。

```python
def partial(func, /, *args, **keywords):
    def newfunc(*fargs, **fkeywords):
        newkeywords = {**keywords, **fkeywords}
        return func(*args, *fargs, **newkeywords)
    newfunc.func = func
    newfunc.args = args
    newfunc.keywords = keywords
    return newfunc
```

エラーが起きたときのコードは `add(2, a=1)`を実行していたので、"TypeError: add() got multiple values for argument 'a'" というエラーが発生していたようです。


# まとめ

部分適用した後の関数が、位置引数で指定できないのは少し不便です。

```python
# NG -> 不便
add_a1(2)

# OK
add_a1(b=2)
```


部分適用した後に残る引数（上記だと引数`b`）より前の引数は、`partial`関数で部分適用した関数を作る際、位置引数として指定するのがよいと思います。

```python
def add(a,b,c):
    return a+b+c

# 引数aを残す
foo1 = partial(add, b=2, c=3)
foo1(1)
# => 6

# 引数bを残す
foo2 = partial(add, 1, c=3)
foo2(2)
# => 6

# 引数cを残す
foo3 = partial(add, 1, 2)
foo3(3)
# => 6

```
Xamarin.FormsでAndroidのデバイスの設定の影響でアプリのフォントサイズが変わらないようにする方法

# はじめに

Androidは、下図のような画面で、デバイスのフォントサイズを変更できます。
これは、アプリのフォントサイズに影響するため、普通にXamarin.Formsでアプリを開発すると、フォントサイズがこの設定の影響で変わってしまいます。それを変わらないようにする方法の紹介です。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403606/be385418-2218-a568-7d85-9cee0b004084.jpeg" width="50%">

# 実装方法
Androidプロジェクトにある MainActivity.cs に以下のコードブロックを追加することで、デバイスのフォントサイズに影響しなくなります。

```c#
MainActivity.cs

public override Android.Content.Res.Resources Resources
{
	get
	{
		Android.Content.Res.Resources res = base.Resources;
		Configuration config = new Configuration();
		config.SetToDefaults();
		res?.UpdateConfiguration(config, res.DisplayMetrics);
		return res;
	}
}

```

ただし、上記で利用している Resources.UpdateConfigurationメソッドは、Android API 25(Android7.1)以上では、非推奨となっています。
詳しくは、以下に書いてあります。
[Resources | Android Developers](https://developer.android.com/reference/android/content/res/Resources.html#updateConfiguration(android.content.res.Configuration,%20android.util.DisplayMetrics))

従って、Android API 25(Android7.1)以降と、それより前で分岐して、別々の方法で実装する必要があります(自分で確認した限り、新しい方式の実装は、Android API 24(Android7.0)では、正しく動作しませんでした)。

```c#
public override Android.Content.Res.Resources Resources
{
	get
	{
		if (DeviceInfo.Version.Major < 7 ||
		    (DeviceInfo.Version.Major == 7 && DeviceInfo.Version.Minor == 0))
		{
			// Android API 24(Android7.0)以前は古い方式で実装
			Android.Content.Res.Resources res = base.Resources;
			Configuration config = new Configuration();
			config.SetToDefaults();
			res?.UpdateConfiguration(config, res.DisplayMetrics);
			return res;
		}
		else
		{
			// Android API 25(Android7.1)以降は新しい方式で実装
			var config = new Configuration();
			config.SetToDefaults();
			return CreateConfigurationContext(config)?.Resources;
		}
	}
}
```

古い方式と新しい方式のそれぞれの実装方法は、以下の stack overflow の記事を参考にしています。
[How to Prevent Device font size effect of Xamarin android app?](https://stackoverflow.com/questions/49649874/how-to-prevent-device-font-size-effect-of-xamarin-android-app)

# まとめ
Xamarin.FormsはC#でWindowsとAndroidとiOSのアプリがまとめて開発できて便利です。

ちなみに私は、普段はエンジニアリングマネージャーとして、チームの皆で楽しく開発する施策を色々実施しています。詳しくは以下を参照ください。
[1年以上かけて生産性倍増＋成長し続けるチームになった施策を全部公開](https://qiita.com/kojimadev/items/4b28f801863cf4e8f0da)

Twitterでも開発に役立つ情報を発信しています → [@kojimadev](https://twitter.com/kojimadev)
reinterpret命令

# はじめに
 - この記事は[ひとりNEONアドベントカレンダー2020](https://qiita.com/advent-calendar/2020/neon-only) 16日目の記事です
 - [昨日は`dup`命令という、単一の値を全レーンに設定する命令を紹介](https://qiita.com/tomoaki_teshima/items/6ef058adbdea8969480a)した
 - 今日の記事では、当初は`popcount`を紹介するつもりだったのですが、`reinterpret`命令を紹介しないと話が複雑そうだったので、今日は`reinterpret`命令を。

![reinterpret.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12162/dd7ec2d8-5ac6-ad2b-0ab2-ecb80e5e9367.png)

- いつも挿入している命令をグルーピングした図ですが、今回は特段芸術的な仕上がりになりました。[^1][^2]
- 例えば、`vreinterpretq_f32_s32`は`int32x4_t`を引数として、`float32x4_t`型を返す
- 前述の図をよーく見ると、芸術的な網目の中に、水平に引かれている線は一本も無いことが分かる
    - 同じ型を同じ位置に並べており、同じ型への変換命令は存在しないため、水平線が存在しない

# `reinterpret`命令
 - 大前提として、この命令はアセンブラ上には現れない命令である。
    - 事実[公式の命令リファレンスページ](https://developer.arm.com/architectures/instruction-sets/simd-isas/neon/intrinsics?search=reinterpretq)を見ても、`A64 Instruction`の項目は空欄である
 - CPUはレジスタにデータを読み書きする訳ですが、C/C++は「float」「int」みたいに気をつけてはいるもの、レジスタ上には「int用のレジスタ」「short用のレジスタ」と区別はしていません
 - そのため、CPUがデータを読み出す際に「この命令はfloatとして扱う」というふうに、レジスタのデータをちゃんと解釈(interpret)する必要があります[^3]
 - C/C++のcastが近いですが、castは値の変換を含みます。
 
```cpp
float f = 1.0f;
int a = (int)f;
```
 - 前述のコードで、変数`f`には、16進数表記で`0x3F800000`が含まれているが、変数`a`には`0x1`が代入される。
    - これは、浮動小数点数の$1.0$を整数型の1に変換している
 - 一方で、本日紹介している`reinterpret`命令は以下の処理を行っている[^a]

[^a]: 最近、C++ではこれがお行儀の宜しくない書き方だと知ったが、それはそれ

```cpp
float f = 1.0f;
int a = *(int*)&f;
```

 - ベクトル型は、前述のような変換を伴うcastは認めて無く、明示的に`reinterpret`命令で再解釈してやる必要がある 
 - また、ベクトルの型の暗黙の型変換も認めておらず、明示的にエラーが上がります。[^4] 


```
 note: use -flax-vector-conversions to permit conversions between vectors with differing element types or numbers of subparts
```
 - 以上はGCC 7.5.0でのwarningメッセージ
    - warningメッセージだが、エラーも出る
 - オプションに`-flax-vector-conversions`があれば、コンパイラが暗黙の型変換を認めてくれるが、手間を考えると、逐一`reinterpret`命令を挟んだほうがいいと思う。
 - 実際にアセンブラには現れず、その代わり、レジスタを読む次の命令が、レジスタを整数なり浮動小数点数なり、再解釈した値で読んでくれる。

# 「変換」ではない
 - `reinterpret`命令のポイントは「変換」ではないということです。
 - 何でこんなのが必要になるかと言うと、明日の`popcount`命令への布石です。


# おわりに
 - 今日は`reinterpret`命令を紹介しました
 - 明日も手島の予定で`popcount`命令を紹介します。

[^1]: 実はこの図は厳密には正しくありません。図を愚直にたどると、`vreinterpret_xxx_p128`という命令が存在しうる形になっていますが、`q`が付かない`reinterpret`命令は64bit幅のレジスタを扱います。しかし、`p128`が末尾に付くということは引数として`poly128_t`型を取るということなので、レジスタbit幅の辻褄が合いません。しかし、そこを省いて描くと、ただのカオスな樹形図になってしまうので、そこは敢えて目をつぶって今回の図を描きました。
[^2]: っていうか、`poly128_t`型なんてあるんですね。筆者もこの記事を書いてて初めて知りました。まあ、SI **M** D型ではないので、省いてもよかったかも？
[^3]: 予防線を張っておくと、FPU専用レジスタが用意されてる場合は「`float`を保存する専用のレジスタ」が存在するわけですけれど、本記事の主題とは外れるのでそこは割愛します
[^4]: GCCで確認。でも多分MSVCやClangでも同じだと思う。
pythonで素因数分解

# pythonで素因数分解

素因数分解に使った数をlistで返す。

#### 80の素因数分解で試作
```python
n = 80
lis=[]

for i in range(2,n+1):
    while True:
        if n%i == 0:
            lis.append(i) # 余り0なら素因数分解リストにappendする
            n = n//i # nの更新
            print(lis)
            print("n={}".format(n)) # nの更新状況をみてみる
        else:
            break
```

![スクリーンショット 2020-12-12 17.16.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698282/1089c812-0b08-847e-e678-6010f89b0493.png)



*考え方は中学生と同じ*
$n = 80$  でスタート  
*〜2の素因数分解にTry する〜*
$80÷2=40$
余り:0→素因数分解リストに2をappend 
$n = 40$ に更新

$40÷2=20$
余り:0→素因数分解リストに2をappend
$n = 20$ に更新

$20÷2=10$
余り:0→素因数分解リストに2をappend
$n = 10$  に更新

$10÷2=5$
余り:0→素因数分解リストに2をappend
$n = 5$に更新

$5÷2=2$
余り:1→appendせず
$n$ 更新せず
*〜2の素因数分解は終了〜*

*〜3の素因数分解にTryする〜*
$n = 5$ から再開
$5÷3=1$
余り:2→appendせず
$n$ 更新せず
*〜3の素因数分解は終了〜*

*〜4の素因数分解にTryする〜*
$n = 5$ から再開
$5÷4=1$
余り:1→appendせず
$n$ 更新せず
*〜4の素因数分解は終了〜*

*〜5の素因数分解にTryする〜*
$n = 5$ から再開
$5÷5=1$
余り:0→素因数分解リストに5をappend
$n = 1 $に更新
*〜5の素因数分解は終了〜*
<br>
6以降進んでいっても、素因数分解リストが更新されることはない。
なぜなら、更新された $n= 1$ を割り切れるものは以降に存在しないため。
**ただ、以降の繰り返しを大きな数で実行すると時間がかかりすぎるので、rangeのゴールは調整する必要がある。**

素因数分解は平方根より以下の全ての素数を確認で十分という性質を**中途半端に**使う。
割り算をTryさせる数を2から、調べたい数の平方根以下までに設定する。  

nがnの平方根より大きなポイントでbreakしていたらそれをリストにappend
**素数の時もこの挙動になる**
この処理を最後に加筆  

以上を踏まえて関数にする。


```python
def prime_factorization(n):
    """
    task:prime factorization
    return:prime
    type:list
    """
    lis=[]
    for i in range(2,int(n**0.5)+1): # 割り算のTryは2から、平方根以下まで
        while True:
            if n%i == 0:
                lis.append(i) # 余り0なら素因数分解リストにappendする
                n = n//i # nの更新
                
            else:
                break
                
    if n > int(n**0.5): # nが　int(n**0.5) より大きなポイントでbreakしていたらそれをリストにappend 素数の時もこれ
        lis.append(n)

    return lis

n = int(input("nは?>"))
print(prime_factorization(n))
```  

注）絞り込みについて

```python
for i in range(2,int(n**0.5)+1)
```

rangeの絞り込みが緩い（4とか6とか素数でない数でも割り算のTryをしている）ので、処理時間を考えると有能ではないと思われる。
とりあえず課題はクリアできる。  
13606292703345なので10兆までは対応していた。
どこかで限界を迎えるはず。
dos形式→unix形式ファイル検索/変換コマンド

外注から送られてきたファイルにWindows形式の改行コードCRLF(以下dos形式)があるためにエラーが生じていたことが最近2度もありましたので、dos形式のファイルを検索/変換するコマンドを調べました。


# dos形式ファイルを検索するコマンド

下記を実行することによって、カレントディレクトリ上のdos形式を使っているファイル名を列挙してくれます。


```
$ file * | grep CRLF | sed 's/:.*//g'
try_except.py
try_except.txt
try_except_else.py
viewfile.py
...省略
```

fileコマンドはファイル形式を調べてくれるコマンドです。grepによりCRLFを含む行だけフィルタしています。

既にシステムにコピーなどしている場合、
`find /`と組み合わせるとファイルシステムの中全てを検索してくれます。
> ルート`/`から調べると時間がかかりますので、`/`を`/usr`や`/etc`に変えるなど、心当たりのあるディレクトリに絞った方が良いかもしれません。
> root権限が必要かもしれません。

```
$ find / | xargs file | grep CRLF | sed 's/:.*//g'
```

`find ... | xargs` は`find`で見つけ出したファイルに対して`xargs`以下のコマンドを実行する、よく使う構文です。

参考: [How to find dos format files in a linux file system]( https://stackoverflow.com/questions/4719750/how-to-find-dos-format-files-in-a-linux-file-system )


なお、最後のsedはファイル名以降に出てくるfileコマンドの出力をカットして見やすくしているだけですので、なくても動きますが、ない場合の表示が多少ごちゃつきます。

```
$ file * | grep CRLF
impoter.py               Python script, UTF-8 Unicode text executable, with CRLF line terminators
...省略
# Python script...の部分が各行に対して追加されます。
```


# dos形式をunix形式に変換するコマンド

トラブルの原因発覚当時はとりあえずの対処でVim上でdos形式 => unix形式を行いましたが、コマンドラインから一発で同じことができます。
> 一応手順を書いておくと、

```
$ vim temp.txt   # temp.txtを開く
:se ff=unix      " fileformat(略してffで通る)をunix形式にsetする(setも略してseで通る)
:wq              " 保存して(w)終了(q)
```


> `dos2unix`, `unix2dos`という外部コマンドもありますが、ディストロによって標準で入っていないこともある(=別途インストール必要)ので、ここではあえて使いません。

(本題ここから)
下記コマンドでは`tempdos.txt`というdos形式ファイルを`tempunix.txt`というunix形式のファイルに変換しています。

```
$ tr -d '\r' < tempdos.txt > tempunix.txt
```

`tr`の`-d` オプションはdeleteのdで、ファイル内の改行コード`\r` ( <-CRLFのこと ) を削除します。
そのため、元ファイルがなくならないように一応別名のファイルにリダイレクトしておきます。
(`> tempunix.txt` の部分。)
> 動作の確認後、dos形式ファイルは害悪なので削除します。


sedコマンドでも同じことができます。

```
$ sed -i -e 's/\r$//g' tempdos.txt
```

sedコマンドの-i オプションはin-placeですから、ファイルの中身が置き換わります。
安全を見るなら、下記のようにして別ファイルにリダイレクトしましょう。

```
$ sed -e 's/\r$//g' tempdos.txt > tempunix.txt
```


参考 [How to convert DOS/Windows newline (CRLF) to Unix newline (LF) in a Bash script?]( https://stackoverflow.com/questions/2613800/how-to-convert-dos-windows-newline-crlf-to-unix-newline-lf-in-a-bash-script )


# 全てのdos形式ファイルをunix形式に変換する

上記①②を組み合わせればカレントディレクトリ上の全てのdos形式ファイルをunix形式に変換できます。

```
$ sed -i -e 's/\r$//g' $(file * | grep CRLF | sed 's/:.*//g')
```

`$()`でコマンドを囲むとサブシェル上での実行結果を`sed -i -e...` に渡してくれます。

> 一気にやりすぎて危険かもしれないので、あまりにも変換ファイル数が多いときだけに使ってください。
> 必ずバックアップを取ってください。
SQLのORDER BY句を、pandas(python)のsort_valuesメソッドを使って表現してみた

#はじめに
　最近、プライベートでデータ分析のツールを作成している関係でpandasというpython外部ライブラリを活用している。が、いざ使って見ると、「pandas?なにそれかわいいの？」と動物のパンダ🐼を連想させるヤバい思考に行きつつある状況になる。
　これはまずいと感じ、投稿者はpandasを探し求める旅に出る。
　この記事は、pandasを飼いならすために<b>pandasをSQLっぽく考えるというデータサイエンス初学者に向けた記事となります。</b>

#そもそもpandasとは何か
　pandasとは、構造化された（表形式、多次元、潜在的に不均質）データと時系列データを簡単かつ直感的に操作できるように設計された高速で柔軟な表現力のあるデータ構造を提供するPythonパッケージで、実際的な実世界のデータ分析を行うための基本的な高レベルのビルドを行う事が可能なツールです。
　<b>要は、表データをpythonを使っていい感じに処理して目的のデータ抽出するツールです。</b>

#実践
###準備
今回は下記の表データ【customer】を用いてpandas攻略を行います。（表データはCSV形式）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681742/5527fe74-5636-8a8e-a741-6f9cdeb61cf9.png)



※データは長いので冒頭部分のみ表示

参考データ：データサイエンス100本ノック
https://github.com/The-Japan-DataScientist-Society/100knocks-preprocess

また、今回はpandasを使用するため、コードは下記のように予め準備しておきます。

```python:python
import pandas as pd
df_customer = pd.read_sql('customerのCSVファイルのパス', sep=',')
```

###本題
タイトルにある通り、今回は<b>SQLのORDER BY句を</b>pandasを使って再現します
<br>
問題：<b> 顧客データフレーム（df_customer）を生年月日（birth_day）で高齢順にソートし、先頭10件を全項目表示せよ。</b>
<br>

目的：<b>sort_valuesメソッドを活用して、レコード（行）を降順（昇順）に整理する</b>

###解答

解答を記述するとこんな感じになります。

```python:pandas(python)
df_customer.sort_values('birth_day',ascending=False).head(10)
```


###解説

* pandasのsort_valuesメソッドを活用する<br>

pandasのsort_valuesメソッドを用いて、<b>SQLに当たるORDER BY句</b>を定義を行います。

形式を表現するとこんな感じです。

```python:pandas(python)
df_customer.sort_values('column',ascending=False)
```
sort_valuesメソッドは、まず第一引数（'column'）にソート対称であるカラムの指定を行います。次に、第二引数にソートを「昇べき」にするか、「降べき」にするかの是非を、ascending（昇べき）の論理値を基に決定します。（上記のコードは論理値をFalseにしているため「降べき」となっております）

* SQLで表現
<br>上記を参考に、今回の設問をSQLで考えるとこのようになります

```SQL:SQL
select * from customer ORDER BY birth_day desc LIMIT 10;
```

FROM句：データベース内の指定する表を選択する<
SELECT文：指定した表から抽出すべき列を選択する
LIMIT句：抽出する行数を指定する
<br>
ORDER BY句に、ソート対象のカラムを指定し（今回の場合birth_day）、その後asc(昇べき)もしくはdesc(降べき)を指定しソート条件を設定します。

また、図を表すとこんな感じになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681742/8922b0f8-8e2b-25ce-0aa3-cb8212e287d4.png)

* 全体図<br>
全体をまとめると、こんな感じになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681742/b5861093-1b4e-7628-b473-88db5a2c0d2f.png)


#まとめ
今回はpandasを使って、SQLの正規表現をまとめてみました。pandasはデータベース及びSQLを意識したpythonライブラリなため、普段からSQLを意識するとかなり使いやすいツールだと改めて感じます。また、特定の命令文を指示する時、SQLがいくつものパターンがあるように、pandasにも多様なパターンが存在すると、pandasを活用して日々実感を持ちます。

#終わりに
　今回、利活用したデータはデータサイエンス協会（DS協会）の「データサイエンス100本ノック」を参考にしております。こちらはJupyter notebookを使用しているので、より見やすいデータが抽出されます。
　この記事を読んで、「実際に実装してみたい！！」という方がおりましたら、下記にその実装に関する記事を上げているので、良かったそちらの記事を参考に是非実装してみて下さい。

データサイエンス初学者にむけた、データサイエンス100本ノックを実装する方法：
https://qiita.com/syuki-read/items/714fe66bf5c16b8a7407
【Flutter】遭遇したエラー&&解決策まとめ

## 次回
 - [【Flutter】遭遇したエラー&&解決策まとめ②](https://qiita.com/umaibou1126/items/0ccc1502a98f358f0ccb)
 - [【Flutter】遭遇したエラー&&解決策まとめ③](https://qiita.com/umaibou1126/items/9e06bd55dae86631b0f3)
 - [【Flutter】AWS Amplify / Firebaseエラーまとめ](https://qiita.com/umaibou1126/items/24693e753f0e194a92db)

## 参考文献
 - [Xcode12にアップデートしたらPodライブラリで大量に警告が発生したので対処した件](https://www.yururiwork.net/xcode12%E3%81%AB%E3%82%A2%E3%83%83%E3%83%97%E3%83%87%E3%83%BC%E3%83%88%E3%81%97%E3%81%9F%E3%82%89pod%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%81%A7%E5%A4%A7%E9%87%8F%E3%81%AB%E8%AD%A6%E5%91%8A/)
 - [FlutterでGoogleDataTransportにエラーが出た時の対処](https://qiita.com/shoukitsuda0310/items/a7377bae8075de7f95be)
 - [【Flutter】エラー「firebase_core_web not found.」の対策](https://algorithm.joho.info/flutter/firebase_core_web-not-found/)
 - [【Flutter】No Firebase App '[DEFAULT]' has been created - call Firebase.initializeApp()の対処法](https://qiita.com/mamoru_takami/items/87a20d861806a70db29d)



##Podライブラリの警告

####◆ エラー内容
```
The iOS Simulator deployment target ‘IPHONEOS_DEPLOYMENT_TARGET’ is set to 8.0, but the range of supported deployment target versions is 9.0 to 14.0.99.
```
####◆ 解決策
```:Podfile
post_install do |installer|
  installer.pods_project.targets.each do |target|
    target.build_configurations.each do |config|
      config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '9.0'
    end
  end
end
```

```
$ pod update
```


## GoogleDataTransportエラー

####◆ エラー内容
```
error: umbrella header for module 'GoogleDataTransport' does not include header 'GDTCORDataFuture.h'
```
####◆ 解決策
```
$ rm -rf Pods
$ flutter clean
$ flutter run //pod installが自動実行される
```

##「firebase_core_web not found」エラー

####◆ エラー内容
```
Plugin project :firebase_core_web not found. 
Please update settings.gradle.
```

####◆ 解決策
```setting.gradle
def flutterProjectRoot = rootProject.projectDir.parentFile.toPath()

def plugins = new Properties()
def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins')
if (pluginsFile.exists()) {
    pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) }
}

plugins.each { name, path ->
    def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile()
    include ":$name"
    project(":$name").projectDir = pluginDirectory
}
```

## 「Firebase.initializeApp」エラー

####◆ エラー内容
```
No Firebase App '[DEFAULT]' has been created - call Firebase.initializeApp()
```

####◆ 解決策
```
Widget _buildBody(BuildContext context) {
    Firebase.initializeApp(); // new
```
【AtCoder】ビット全探索〜問題まとめましたっ！〜

C問題でちらほら出てきてたbit全探索とかいうのをやっつけようと思って、解いたついでにまとめてみたよ！

# お勉強

## 先走って備忘録
一応、自分が何回も確認したものを載せておくよ！「わかってるけど忘れた」時に参考にしてね！

```python:sample.py
# i が、スイッチのオンオフや、ものを買うかどうか、を管理するよ。
# (1 << n) まで、つまり、 0 から 2^n -1 まで動くよ。
for i in range(1 << n):
    # 適当な操作


    # i を利用して、x番目のスイッチがオンかどうかチェックするよ！
    # & 1 の部分は、i >> x の１の位だけを見たいから。
    if ((i >> x) & 1):


```

## 基礎の確認
もしビット演算に不安があれば、先にこれを見て確認した方が良き！
[Python ビット演算 超入門](https://qiita.com/7shi/items/41d262ca11ea16d85abc)

C++の人は、AtCoder公式がいいのかな？
[AC - 3.05.ビット演算](https://atcoder.jp/contests/apg4b/tasks/APG4b_ac?lang=ja)


## 本番
[ビット演算 (bit 演算) の使い方を総特集！ 〜 マスクビットから bit DP まで 〜](https://qiita.com/drken/items/7c6ff2aa4d8fce1c9361)
↑のページの、次の箇所↓だけは 理解しないと or 使えないと、どうしようもないから、要チェック！日本語との対応がめちゃめちゃわかりやすい！何やっているか分からなくて、それが嫌だったら基本を確認し直しだぁ🔥🔥
[5. ビット演算は集合演算](https://qiita.com/drken/items/7c6ff2aa4d8fce1c9361#5-%E3%83%93%E3%83%83%E3%83%88%E6%BC%94%E7%AE%97%E3%81%AF%E9%9B%86%E5%90%88%E6%BC%94%E7%AE%97)


## 基礎演習
[ABC014 B - 価格の合計](https://atcoder.jp/contests/abc014/tasks/abc014_2)
全探索の前に、一つだけでできるか確認するのにちょうどいい問題があったよ！！

# 問題演習
Bit全探索って、ABCだと毎回C問題なのね！これらを解かずしてここまで来れたの、運が良かったとしか言えないかも🤣

### [ABC128 C - Switches](https://atcoder.jp/contests/abc128/tasks/abc128_c)
私はABC147の問題を最初に解いちゃったけど、これが一番簡単らしい！！
そんな簡単じゃないけどね？？🤔

### [ABC147 C - HonestOrUnkind2](https://atcoder.jp/contests/abc147/tasks/abc147_c)
一行ずつ、YouTubeでsnuke先生と辿りたければこちら！
[AtCoder Beginner Contest 147](https://www.youtube.com/watch?v=tNyPYIhy9Ms&t=3832s)
``1 << n``ってするところを、``2^n``を意識しすぎたせいで``2 << n``にして、かなり時間溶かしてしんどかった〜笑
snuke先生、問題の入力に合わせてるのか！なるほど、確かに分かりやすい。

### [ABC045 C - たくさんの数式](https://atcoder.jp/contests/abc045/tasks/arc061_a)
これ結構沼っちゃって、チェック用に次の出力もしてみたよ！
[動作確認用 : サンプルコード](https://atcoder.jp/contests/abc045/submissions/18695496)
毎回足してるものと、一周するたびに今の答えを出力して確認するみたいなの、デバッグにいいよね😎✨
きょ...共有のために、わざとこのまま提出したんだからっ！！

### [ABC167 C - Skill Up](https://atcoder.jp/contests/abc167/tasks/abc167_c)

サンプルで気づいたけど、初期値を``2*(10**6)``にして、条件満たすのがなかったときに``-1``にし忘れちゃってた🤣
でも、上のをクリアしてたら、すんなり解けるようになってた！嬉しい！！

### [C - Shopping Street](https://atcoder.jp/contests/abc080/tasks/abc080_c)

問題文読むのが非常〜〜〜に大変！！！Cにしてはちょっと嫌だなぁって問題だと思う😭
もう水色に上がる3週間前のつもりの時期でも、30分くらいかかった😭


### おしまい

ここまで解いた皆さん、お疲れ様でした〜〜〜🎉🎉
【導入まで】Laravel x Vue.js(laravel/ui)

# Laravel x Vue.js (laravel/ui)

##はじめに
Laravelの導入については、DockerやXAMPPなどを利用するなど様々な方法がありますが、ここではLaravelの導入が完了しているという体で話をします。
<Laravel導入までの記事>

本記事で使用する主要なcomposerのパッケージは、laravel/uiでありサポート状況は以下の様になっています。

laravel/uiサポートバージョン(2020/12/11時点 *1参照)

|laravel/uiのバージョン|Laravelのバージョン|
|:---|:---|
|1.x|5.8,6.x|
|2.x|7.x|
|3.x|8.x|

##動作環境
・OS: Mac OS Catalina
・PHP: 7.4.13
・Laravel: 8.18.1
・composer
・npm

#導入手順
### laravel/uiパッケージをインストール

```
composer require laravel/ui
```
上記コマンドを実行し、laravel/uiをインストールします。

### 基本的なvueの構成を生成する

```
php artisan　ui vue
```

*おまけ:この時に php artisan ui laravel/ui --authと打ち込むとログイン/レジスター機能を盛り込むことが出来ます

### npmパッケージ

```
npm install
```
上記コマンドを実行する。

### アセットをコンパイル

```
npm run dev
```


##参考

1: https://github.com/laravel/ui
docker composeで指定する要素メモ

・要素
1--version:docker-composeのバージョン
2--立ち上げるコンテナの名前
3--image:立ち上げるコンテナのイメージ
4--ports:ポート番号
5--networks:どのネットワークに接続させるか
6--volumes:どこのvolumeにつないでデータを保存するか
7--environment:環境変数

・具体例
version:'3.7'
services:
 nginx:
  image:nginx:'バージョン数'
  ports:
  -8080:80
  environment:

・contextで、docker-compose.ymlからみてdockerfileがどこにあるのかを指定して

・build
docker fileがおいてあディレクトリや、docker fileの名称を指定していると思っておけば良い？
PostgreSQLの実行計画のプランタイプについて

# 実行計画とは
実行計画はSQL文が参照するテーブルをスキャンする方法や、テーブルを結合するアルゴリズム等を示します。
また、実行計画はその時点の統計情報や各種パラメータを参照してプランナが生成します。
発行するSQL文の文頭に`EXPLAIN`を付与することで内容を確認できます。

# プランタイプ
本稿では実行計画におけるプランタイプにについて記載します。
プランタイプとはエグゼキュータが実際にデータ処理するための具体的な手順のことを指します。
テーブルスキャンやテーブルの結合等、以下のような複数の種類があります。
- Seq Scan
- Index Scan
- Bitmap Scan
- Sort
- Nested Loop
- Merge Join

プランタイプは種類により初期コストの有無が異なります。


## Seq Scan
* テーブルを全行チェックして必要行を走査する
* インデックスを利用していない場合に選択される
* 利用できるインデックスが存在していてもオプティマイザのコス計算結果によって、シーケンシャルスキャンが選択される場合もある

対象テーブルのレコード数に比例してコストが増加するため、レコード数が多いテーブルに対しては別のアクセス方式が選択されるようなチューニングが必要です。

本来はインデックススキャンの利用が想定されている場面で、利用されず性能上の問題が発生する場合は以下のようなことが考えられます。

- LIKE演算子で部分一致検索
- 条件式に関数を利用しているに関数インデックス未作成
- 条件式に複数列インデックスの一部の列しか利用していない 等


## Index Scan
- インデックスとテーブルを交互にアクセスして必要行を走査
- 大量のテーブルから少ない行を取得するときに優位性が高い

事前に作成されたインデックスに対して部分的にアクセスを行い、特定行を高速に取得します。
大量行のテーブルから大量行を取得する場合、インデックススキャンではインデックスとテーブルに対して
交互にアクセスするため低効率となります。

## Bitmap Scan
- 検索条件からインデックスのビットマップを生成して走査に利用
- ビットマップ生成の初期コストがかかる
- 同一ページ内に取得対象行が多くあるとまとめて取得できる分I/Oコストが有利
- 複数のインデックスを結合した検索の場合に優位性が高い

BitmapScanではまずインデックスに対しアクセスを行い、取得対象となるデータの格納位置と対応するビットマップが作成されます。
次に作成されたBitmapを利用してテーブルに対してシーケンシャルアクセスを実行します。

大量行を取得する場合、取得行数がある程度多くても効率的にデータを取得することができます。
ただし、Bitmapを生成するための初期コストがかかります。

## Sort 
- データが`work_mem`上に収まればクイックソート
- `log_tmp_files`に0を設定することでソートが`work_mem`に収まりきらなかった場合に作成される
- ORDER BY以外にもGROUP BY、DISTINCT、UNION等で行われる

テーブルスキャン後、ORDER BY等のデータの並び替え処理で採用されます。  
データが`work_mem`上に収まれば並び替え処理を全てメモリ上で実施するクイックソートが選択されますが、
`work_mem`に収まらない場合は、ディスク併用したマージソートが採用されます。

## Nested Loop
- 最も単純な結合方式
- 外側テーブルを1行ずつ取得し、内側テーブルの全レコードと比較
- 初期コスト0
- 結合キーにインデックスがあると効率が良い

テーブル結合した時のプランタイプの一つ。
結合する互いのテーブルの行数が多いとそれだけ膨大な処理量になってしまいます。


## Merge Join
- 両方のテーブルの結合キーを結合する前にソート
- ソートのための初期コストがかかる
- 結合キーにインデックスがある場合はIndex Scanが採用されるためソートが不要になる

並び替えの初期コストが発生してしまうが、テーブルスキャンする回数が一度で済むので
行数の多いテーブル同士を結合する際に効率化となります。
また、結合条件となる列に対して事前にB-treeインデックスが作成されている場合は
並び替え処理の代わりにインデックスを利用するので、初期コストも発生しなくなります。

## Hash Join 
- 内側テーブルの結合キーのハッシュ表を結合前に作成
- `log_tmp_files`に0を設定することでハッシュ表が`work_mem`に収まりきらない場合に作成される一時ファイルの状況をログに出力可能

初期コストは発生するが、結合条件にインデックスがされていない場合でも比較的高速な結合が期待できます。
ハッシュテーブルは`work_mem`上に作成されます。ハッシュテーブルが`work_mem`のサイズに収まりきらない場合は一時ファイルが作成・利用されます。


# 参考
- [PostgreSQL 12.4文書](https://www.postgresql.jp/document/12/html/sql-explain.html)
- [LPI-Japan OSS-DB Gold 認定教材 PostgreSQL 高度技術者育成テキスト](https://www.amazon.co.jp/LPI-Japan-OSS-DB-Gold-PostgreSQL-%E9%AB%98%E5%BA%A6%E6%8A%80%E8%A1%93%E8%80%85%E8%82%B2%E6%88%90%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88/dp/B00P4WD4QG/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=2DNZ3L0MXCFG1&dchild=1&keywords=oss-db+gold&qid=1607741375&sprefix=OSS-DB+%2Caps%2C240&sr=8-1)
Pythonでmapオブジェクトのforループは一度しかできない

こういう事になります。

```python
str_list = ["1", "2", "3"]

int_map = map(lambda i: int(i), str_list)

for i in int_map:
  print("map1回目", i)

for i in int_map:
  print("map2回目", i) #=> ここだけ出力されない

int_list = list(map(lambda i: int(i), str_list))

for i in int_list:
  print("list1回目", i)

for i in int_list:
  print("list2回目", i)
```

出力

```
map1回目 1
map1回目 2
map1回目 3
list1回目 1
list1回目 2
list1回目 3
list2回目 1
list2回目 2
list2回目 3
```

## 環境
- python 3.6.9
- Google Colaboratory

## 解説
Listオブジェクトは何度でも`for`でループできます。

```python
int_list = [1,2,3]

for i in int_list:
  print("list1回目", i)

for i in int_list:
  print("list2回目", i)
```

出力

```
list1回目 1
list1回目 2
list1回目 3
list2回目 1
list2回目 2
list2回目 3
```

これを、`map()`関数のイテレータオブジェクトで行うと、

```python
str_list = ["1", "2", "3"]

int_map = map(lambda i: int(i), str_list)

for i in int_map:
  print("map1回目", i)

for i in int_map:
  print("map2回目", i) #=> ここだけ出力されない
```

一度めの`for`しか通りません。

```
map1回目 1
map1回目 2
map1回目 3
```

[Python公式ドキュメント](https://docs.python.org/ja/3/glossary.html#term-iterable)によると

> (list のような) コンテナオブジェクトは、自身を iter() 関数にオブジェクトに渡したり for ループ内で使うたびに、新たな未使用のイテレータを生成します。これをイテレータで行おうとすると、前回のイテレーションで使用済みの同じイテレータオブジェクトを単純に返すため、空のコンテナのようになってしまします。

とのことです。イテレータとしてみると、list等のコンテナオブジェクトの方が特殊な挙動なんですね。

実際に中身を確認してみると

```python
str_list = ["1", "2", "3"]
int_map = map(lambda i: int(i), str_list)

for i in int_map:
  print("map1回目", i)

print(list(int_map))
```

```
map1回目 1
map1回目 2
map1回目 3
[]
```

`for`を通った後の中身は空になっていました。

ちなみに、`for`だけでなく`list()`を一度でも呼ぶと空になります。

```python
str_list = ["1", "2", "3"]
int_map = map(lambda i: int(i), str_list)

print(list(int_map))

for i in int_map:
  print("map1回目", i) #=> ここは出力されない
```

```
[1, 2, 3]
```
【Swift】型の構成要素〜型の基本〜

私たちが当たり前のように使っているInt型やString型ですが、
もちろんどこかで事前に定義されています。

プロジェクトを作成する際に、その定義ファイルを読み込んでいるので
当たり前のようにいろいろな型を使うことができるようになっているのです。

様々な型が存在するわけですが、
**その型はどのように定義されているの？**って話になってきます。

型の定義方法は、
**・クラス
・構造体
・列挙型**
のどれかで定義されています。

そして、クラス・構造体・列挙型の３つには、
**メソッドやプロパティなどの共通の要素が用意されています。**

今回は、型に共通する構成要素について説明していきます。
クラス、構造体、列挙型については後日別の記事で説明する予定です。

#型に共通するもの

Int型やString型などの、代表的な型を構成する要素は、
型が持つ値を保存する**プロパティ**と、型の振る舞いを表す**メソッド**の２つです。

プロパティは、型に紐付いた定数や変数と言い換えることができ、
メソッドは、型に紐付いた関数と言い換えることができます。

この２つに加えて、型を構成する要素には、
初期化を行う**イニシャライザ**、コレクションの要素を取得する**サブスクリプト**、
型内に型を定義する**ネスト型**などが存在します。

#型の基本
型についての基本知識として、定義方法とインスタンス化方法について説明します。

インスタンスとは、型を実体化したものであり、
**型に定義されているプロパティやメソッドを持ちます。**

つまり、String型の値"aaa"を定義した際、
**aaaはString型のインスタンスであり、countプロパティやappend( )メソッドを持ちます。**

関数と言ったりメソッドと言ったり、
ごちゃごちゃになるかもしれませんが、**関数≒メソッド**です。

呼び方が違うだけで構成しているものは同じです。

Int型に定義されている関数を、
Int型が持つメソッドと言ったりします。

##定義方法

**構造体はstructキーワード
クラスはclassキーワード
列挙型はenumキーワード**　を使って型を定義します。

```swift

struct 構造体名 {
   構造体の定義
}

class クラス名 {
   クラスの定義
}

enum 列挙型名 {
   列挙型の定義
}
```

型を構成する要素であるプロパティやメソッドは、
全て{ }内に記述していきます。

##インスタンス化の方法

型をインスタンス化するには、型名に( )をつけてイニシャライザを呼びます。
必要に応じて( )内に引数を渡します。

型の定義とインスタンス化を合わせて行います。

```swift

// 構造体の定義
struct sample{ }

// 構造体sampleのインスタンス化
let instance = sample()
```

最低限の定義方法については以上になります！

この他にも、型を定義するにあたり様々な要素が必要になるので
それらについても記事にしましたので、是非ご覧ください。

・[【Swift】型の構成要素〜プロパティ前編〜](https://qiita.com/onishiApp/items/db19c212ce6eeb42ef9e)
・[【Swift】型の構成要素〜メソッド〜](https://qiita.com/onishiApp/items/dfe5be6ed494ceae1da0)
・[【Swift】型の構成要素〜イニシャライザ〜](https://qiita.com/onishiApp/items/78a0bd93708384b5e487)
・[【Swift】型の構成要素〜サブスクリプト〜](https://qiita.com/onishiApp/items/281daff3d84c13bdd586)
・[【Swift】型の構成要素〜エクステンション〜](https://qiita.com/onishiApp/items/c7e407fc6aa6e922a7da)
・[【Swift】型の構成要素〜型のネスト〜](https://qiita.com/onishiApp/items/040019f1a00826b5c9e5)

最後までご覧いただきありがとうございました。
仮想継承は遅いのか

# はじめに

C++には菱形継承への解決方法として仮想継承というものがある
これまでの人生で使う場面がなかったので知らなかったのだが、どうもこいつは遅いみたいだ
要因としては、vtableが複雑になってオーバーヘッドが増すからっぽい

ここでは、深く調べるつもりはなかったのでアセンブリを読んだりはしてないが、
参考程度に、いくつかのパターンでとったベンチマークを紹介する

# ベンチマーク

使用したサイトは
https://quick-bench.com
最適化はO2を使った

計測には以下のようなclassを使用した

```cpp
struct Super{virtual ~Super()=default;};

struct Sub : Super{};
struct Sub2 : Super{};
struct VSub : virtual Super{};
struct VSub2 : virtual Super{};

```

今回は上記のように、継承したか、仮想継承したかで比較しているだけなので
菱形継承とか複雑化していくにつれて、結果が大きく変わってくることはあるかもしれない。

## 生成 ~ 破棄

以下のように生成し、基底クラスにアップキャストして破棄されるだけのコードで計測してみた

```cpp
    Super* ptr = new Sub{};
    delete ptr;
------------- vs --------------
    Super* ptr = new VSub{};
    delete ptr;
```

https://quick-bench.com/q/6I_ywqhvePAgtLOvrP1DmjRc_vg

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104703/73e18f0a-376f-57aa-f6f2-2bea7a0da8fd.png)


これはあまり変わらなかった。

vtableが複雑になるぶん、初期化コストがかかったりしないのかな？

https://godbolt.org/z/f3hbcY

一応確認してみて、仮想継承してるほうが遅そうなものの
僅かな差すぎてベンチマークでは大きな差がでてこなかったっぽそう

## dynamic_cast

いろいろな組あわせでdynamic_castによる型チェックの計測をしてみた
こちらも基底クラスにアップキャストしたものから行う

```c++
    Super* ptr = new Sub{};
    bool result = dynamic_cast<Sub*>(ptr) != nullptr;
------------- vs --------------
    Super* ptr = new VSub{};
    bool result = dynamic_cast<VSub*>(ptr) != nullptr;
```

https://quick-bench.com/q/lnApnNVNEYX_VFo0iDOH7lPMdpQ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104703/f109498e-5599-b2de-cdf7-3ed7573afde2.png)

仮想継承した派生クラスから他の派生クラスへdynamic_castする際は重たそうだ

## 仮想関数呼び出し

仮想関数を追加して速度比較

```c++
    Super* ptr = new Sub{};
    ptr->func();
------------- vs --------------
    Super* ptr = new VSub{};
    ptr->func();
```

https://quick-bench.com/q/k6oLiSv5lcGnfzt2SZgZv46GhQs

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104703/a30726cf-da55-dc54-bad5-3df0e8452e34.png)

これはあまり変わらない。
vtableの仕組み的には自然に思う。

## typeid

いろいろな組あわせでtypeidによる型チェックの計測をしてみた
こちらも基底クラスにアップキャストしたものから行う

```c++
    Super* ptr = new Sub{};
    bool result = typeid(*ptr) == typeid(Sub);
------------- vs --------------
    Super* ptr = new VSub{};
    bool result = typeid(*ptr) == typeid(VSub);
```
https://quick-bench.com/q/1WRauHIDzkORX79NIpx8zq4qgKA

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104703/b2959af5-769e-96e3-2609-232d0b7075d8.png)

これも大きな違いはなさそうだった

## アップキャスト

今度は関数引数に渡す際のアップキャストで計測してみた

```c++
    bool Func(Super*);

    Sub* ptr = new Sub{};
    bool result = Func(ptr);
------------- vs --------------
    VSub* ptr = new VSub{};
    bool result = Func(ptr);
```
https://quick-bench.com/q/wblPPEDBA7cOFUE6kyhKrZT2nds

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104703/38527c02-6a9b-d99f-0c7b-0654dc13f3cb.png)

これもそんな大きな差はなさそう

# まとめ

- 仮想継承してるほうが、わずかに遅そう
- dynamic_castを使う際は速度に大きな差が見えたが、それ以外のところでは大きな差はでなかった
    - ひし形継承など複雑になれば、大きなボトルネックになってくる可能性はあるのかも？
    

$\huge{仮想継承も菱形継承もしないに越したことはない}$
行番号の初期値を変更するnlコマンドのvオプション

nlコマンドはvオプションを指定することで、行番号の初期値を変更することができます。

# vオプションの使い方

論理ページごとに初期値を変更します。デフォルトは`1`です。あまり特筆することはありませんが、マニュアルを参照してみましょう。

## info nl (GNU coreutils)

```console
‘-v NUMBER’
‘--starting-line-number=NUMBER’
     Set the initial line number on each logical page to NUMBER (default
     1).
```

## busybox nl --help

```console
	-v N		Start from N
```

## man nl (BSD)
```console
     -v startnum  Specify the initial value used to number logical page lines; see
                  also the description of the -p option.  The default startnum
                  value is 1.
```

BSD系のマニュアルではpオプション（未解説）について補足があります。


## POSIX

>-v  startnum
Specify the initial value used to number logical page lines. The default shall be 1.

# vオプションを試す

それでは実際に試してみましょう。

```console
$ yes | head | nl -v 5
     5	y
     6	y
     7	y
     8	y
     9	y
    10	y
    11	y
    12	y
    13	y
    14	y
```


## 負の値

`-v`には負の値も設定することができます。

```console
$ yes | head | nl -v -5
    -5	y
    -4	y
    -3	y
    -2	y
    -1	y
     0	y
     1	y
     2	y
     3	y
     4	y
```


## 改ページ

論理ページが複数ある場合は、ページごとにリセットされます。

```console:coreutils
$ echo -e 'a\nb\n\:\:\nc\nd' 
a
b
\:\:
c
d
$ echo -e 'a\nb\n\:\:\nc\nd' | nl -v 5
     5	a
     6	b

     5	c
     6	d
```

```console:bsd
$ echo -e 'a\nb\n\:\:\nc\nd' | nl -v 5
     5	a
     6	b
     5	c
     6	d
```


## 駅ナンバリング表示の駅番号を出力する（相互直通）

[前の記事](https://qiita.com/Carol_815/items/fa16e4875ba7bc19de86#%E9%A7%85%E3%83%8A%E3%83%B3%E3%83%90%E3%83%AA%E3%83%B3%E3%82%B0%E8%A1%A8%E7%A4%BA%E3%81%AE%E9%A7%85%E7%95%AA%E5%8F%B7%E3%82%92%E5%87%BA%E5%8A%9B%E3%81%99%E3%82%8B)では、宇都宮線・高崎線の駅ナンバリング表示を出力しました。今回は`-v`を使って横浜線の駅ナンバリング表示を出力してみます。
横浜線は多くの列車が東神奈川駅を始発終着とし横浜駅まで直通しないことで有名ですが、一部列車は東神奈川駅から先、京浜東北線・根岸線大船駅まで直通します。そのため京浜東北線・根岸線と駅番号を合わせる都合から、横浜線のプリフィックス「JH」の駅番号は東神奈川駅`13`からスタートします。

```console
$ cat yokohamaline
東神奈川
大口
菊名
新横浜
小机
鴨居
中山
十日市場
長津田
成瀬
町田
古淵
淵野辺
矢部
相模原
橋本
相原
八王子みなみ野
片倉
八王子
$ nl -n rz -w 2 -v 13 yokohamaline | sed 's/^/JH/'
JH13	東神奈川
JH14	大口
JH15	菊名
JH16	新横浜
JH17	小机
JH18	鴨居
JH19	中山
JH20	十日市場
JH21	長津田
JH22	成瀬
JH23	町田
JH24	古淵
JH25	淵野辺
JH26	矢部
JH27	相模原
JH28	橋本
JH29	相原
JH30	八王子みなみ野
JH31	片倉
JH32	八王子
```
---
[Docker] Unsupported config option for services service: ‘app’ エラー

##はじめに
docker-compose.yml を書き換えた時にエラーが発生したので解決方法を備忘録として残す。

##エラー
```
Unsupported config option for services service: ‘app’
```

##解決方法
docker-compose が古いらしい
 
最新のバージョンに変更する
最新のバージョンを見るには [こちらから](https://docs.docker.com/compose/release-notes/ "こちらから")

```
curl -L “https://github.com/docker/compose/releases/download/バージョン指定/docker-compose-$(uname -s)-$(uname -m)” -o /usr/local/bin/docker-compose
```

完了
 
##参考記事
https://qiita.com/takepan/items/172302ecb1ead91c0cab
SCPコマンドで、EC2インスタンスにあるファイルのダウンロード/アップロードを秒で対応するために

## はじめに
EC2サーバーのファイルをローカルへダウンロードする時に、実行コマンドなんだったっけ....?となったので、今後秒で対応できるように備忘録として残しておきます。

## ダウンロード(EC2インスタンス → ローカル)

EC2サーバーにあるファイルをローカルのデスクトップへダウンロードする場合、以下コマンドを実行します。

>scp -i  [秘密鍵のパス]  [ユーザー名]@[パブリックIP]:[EC2のダウンロード元のパス] [ローカルのダウンロード先のパス]

例えば、EC2インスタンスのApacheのログをデスクトップへダウンロードする場合は、以下のコマンドとなります。

```ターミナル.
$ scp -i ~/.ssh/hoge-hoge.pem ec2-user@1.234.567.89:/home/ec2-user/access_log-2020xxxx ~/Desktop
access_log-2020xxxx      100% 4820KB   1.5MB/s   00:03     
```

以下のようにエラーではじかれることもあります。これはダウンロード（アップロード）先とダウンロード（アップロード）元のディレクトリの権限が影響しているようです。

>scp: /var/log/httpd/access_log-2020xxxx: Permission denied

ディレクトリの権限を777に変更するなどして対応できるようですが、私は以下の方法で実行します。ダウンロードしたいファイルを一旦EC2サーバーのHomeへ移動させてからローカルへダウンロードします。

```ターミナル.
$ ssh -i hoge-hoge.pem ec2-user@1.234.567.89
$ sudo -i
$ cp /var/log/httpd/access_log-2020xxxx /home/ec2-user/access_log-2020xxxx
$ ll
-rw-r--r-- 1 root     root      4936035 12月 11 14:38 access_log-2020xxxx
$ exit
$ exit
$ scp -i ~/.ssh/hoge-hoge.pem ec2-user@1.234.567.89:/home/ec2-user/access_log-2020xxxx ~/Desktop
access_log-2020xxxx                   100% 4820KB   1.5MB/s   00:03 
```

## アップロード(ローカル → EC2インスタンス)
以下コマンドでEC2サーバーにファイルをアップロードできます。

>scp -i [秘密鍵のパス] [ローカルのアップロード元のパス] [ユーザー名]@[パブリックIP]

```ターミナル.
scp -i ~/.ssh/hoge-hoge.pem /Desktop/access_log-2020xxxx ec2-user@1.234.567.89:/home/ec2-user/
```
ディレクトリをアップロードする場合は以下コマンドになります。

>scp -r -i [秘密鍵のパス] [ローカルのアップロード元のパス] [ユーザー名]@[パブリック

```ターミナル.
scp -r -i ~/.ssh/hoge-hoge.pem /Desktop/access_log-2020xxxx ec2-user@1.234.567.89:/home
```

## 終わりに
とりあえずこの対応が一番簡単かなと思うのですが、もしもっと効率の良い方法があればどなたかご教示お願いします。
dup命令

# はじめに
 - この記事は[ひとりNEONアドベントカレンダー2020](https://qiita.com/advent-calendar/2020/neon-only) 15日目の記事です
 - [昨日はbit wise演算子命令を紹介](https://qiita.com/tomoaki_teshima/items/4d9227ecb9cc41c1ce73)した
 - 今日は`dup`命令を紹介する(多分duplicateの意味)


![dup.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12162/b614be8c-8d68-73d5-e2ca-3b5cbc9533f7.png)



```
$ grep ^vdup /usr/lib/gcc/aarch64-linux-gnu/7.5.0/include/arm_neon.h  | cut -f -2 -d _ | sort | uniq -c
     14 vdup_lane
     14 vdup_laneq
     14 vdup_n
      3 vdupb_lane
      3 vdupb_laneq
      3 vdupd_lane
      3 vdupd_laneq
      4 vduph_lane
      4 vduph_laneq
     14 vdupq_lane
     14 vdupq_laneq
     14 vdupq_n
      3 vdups_lane
      3 vdups_laneq
```

# `dup`命令
 - 何度も書いているが、末尾に`q`が付く命令は128bit命令幅、ついてないやつは64bit幅
 - 単純に同じデータを全レーンに設定する命令なので、基本的には難しくない

## `dup_n`命令
 - 引数に取るのは単体のデータ(`int8_t`とか`float`とか)
 - それをベクトルレジスタ全体に同じ値をセットする
 - `dupq_n`命令だと128bit幅レジスタ全レーンに同じデータを設定する

## `dup_lane`
 - 第1引数にベクトルレジスタ、第2引数にコンパイル時定数のインデックスを取る
 - なかなかに誤解を招きそうなのだが、`q`が付く場所次第で、以下の4通りの命令が存在する
    - `vdup_lane` : 64bit幅レジスタを返し、64bit幅レジスタを引数に取る
    - `vdup_laneq` : 64bit幅レジスタを返し、128bit幅レジスタを引数に取る
    - `vudpq_lane` : 128bit幅レジスタを返し、64bit幅レジスタを引数に取る
    - `vdupq_laneq` : 128bit幅レジスタを返し、128bit幅レジスタを引数に取る

| 命令 | 戻り値のbit幅 | 第1引数のbit幅 |
|:-:|:-:|:-:|
|`vdup_lane`  |64   |64   |
|`vdup_laneq` |64   |128  |
|`vdupq_lane` |128  |64   |
|`vdupq_laneq`|128  |128  |

 - 引数が64bit幅で、戻り値が128bitってどういうことだよ、って感じだけれど、全レーン（全要素）に同じ値を設定するので、そういう命令もあり得る

# 使い方
 - 色変換フィルタみたいに同じ値を全画素に適用したい、という状況で、わざわざメモリ上に配置しなくても所望のベクトルを用意できるので便利
 - ちなみに単体の値を返す命令もあるが、要は`vget`命令のエイリアスなので、ここでは割愛

# 終わりに
 - 単一のデータを全レーンに設定する`dup`命令を紹介しました
 - 明日も手島の執筆予定で、何を書こう。。。。
【FileMaker】FileMaker Go内にチャットルームを作ってインラインで外部に接続しよう

FileMaker GoのみのスクリプトステップにAVPlayer関連があるわけですが、これが割と面白く使えます。
今回は、[AVPlayer 再生](https://help.claris.com/ja/pro-help/content/avplayer-play.html)で実現する、インライン外部接続です。
難しく聞こえますが、要は、SNSでリンクをクリックすると、SNS内で再生されるアレです。

# FileMaker バージョン
AV関連のスクリプトステップはバージョン14からの提供です。
14以降で実装してみてください。

そして、これはFileMaker Goのみで動きます。
AVPlayer関連スクリプトステップはFileMaker ProやWeb Directでは動きませんので、ぜひiPhoneやiPadで動かしてみてください。

# 単純なテストで動きを見てみる
まずは、こちらをスッと。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">こんなサンプルや。。。<a href="https://twitter.com/hashtag/FileMaker?src=hash&amp;ref_src=twsrc%5Etfw">#FileMaker</a> <a href="https://twitter.com/hashtag/FileMakerGo?src=hash&amp;ref_src=twsrc%5Etfw">#FileMakerGo</a> <a href="https://t.co/1H257V8YL6">pic.twitter.com/1H257V8YL6</a></p>&mdash; Guppy Web Service (@GuppyWebService) <a href="https://twitter.com/GuppyWebService/status/1337657408257048577?ref_src=twsrc%5Etfw">December 12, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
何が起こっているかというと、ボタンを押すと、指示されたリンク先のURLをFileMaker Go内で表示（再生）しています。
![スクリーンショット 2020-12-12 15.58.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/54963c9f-860a-836d-98da-b656a9c67a6b.png)
たったこれだけです。
AVPlayer再生ステップは、オブジェクトフィールドに入れた動画を再生するのに使ったりしますが、URLを指定することでFileMakerに保存したオブジェクト（動画や画像）以外も再生できます。

この動きを応用することで、簡易的にFileMaker Go内のチャットルームでリンク先を外部のアプリを立ち上げることなく表示（再生）できます。

# FileMaker Goにチャットルームを作る
では、早速チャットルームを作ってみましょう。
ここではチャットの内容として投稿者の情報とメッセージ、URLを表示するように設計しています。
![スクリーンショット 2020-12-12 16.05.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/d232df0a-3e9f-0cfd-06a0-dc249730cfa8.png)

チャットしている感じになりますね。
![IMG_3418.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/0fd06521-e134-512e-088f-850da5f7485c.png)

この動きは、こんな感じです。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">こんなサンプル作ってました。<a href="https://twitter.com/hashtag/FileMaker?src=hash&amp;ref_src=twsrc%5Etfw">#FileMaker</a> <a href="https://twitter.com/hashtag/FileMakerGo?src=hash&amp;ref_src=twsrc%5Etfw">#FileMakerGo</a> <a href="https://t.co/3kJiWnVxkU">pic.twitter.com/3kJiWnVxkU</a></p>&mdash; Guppy Web Service (@GuppyWebService) <a href="https://twitter.com/GuppyWebService/status/1337657521012502528?ref_src=twsrc%5Etfw">December 12, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

なんとなく、SNSっぽくなってきましたね。
ログインしている投稿者を右側にアイコン表示すれば、もっとそれぽくなりますね。

# 注意点
このAVPlayer関連は先に書いたようにFileMaker Goでしか動きません。
もし、チャットルームなど動きをPCなどでも再現したい場合は、スクリプトの中で稼働しているシステムを判定してスイッチする必要があります。
先ほどのスクリプトにスイッチを加えると、以下のようになります。
FileMaker GoはiOSで動くので、システムプラットフォームは、3(iOS)の場合はAVPlayerを、それ以外の場合はURLをブラウザで開くようにします。
この辺もTwitterなどのSNSと同じ動きですね。
![スクリーンショット 2020-12-12 16.06.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/3e7abb9d-a92a-7706-e578-ebd2bdc8467b.png)

ということで、社内チャットルームや社内取扱説明アプリなどに使えるTipsでした。
消費税を納税しようと、毎回e-Taxにアクセスして、ログインがとかリーダーがとかはまってしまう自分が、次回からe-Taxに行ってもすぐに気づくように語りかける Stylus用 css レシピ。

![スクリーンショット 2020-12-12 16.17.29.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166553/757989a6-7b2b-71a4-ec22-4b844834abb0.jpeg)
#消費税を納税しようと、毎回e-Taxにアクセスして、ログインがとかリーダーがとかはまってしまう自分が、次回からe-Taxに行ってもすぐに気づくように語りかける Stylus用 css レシピ。

Stylusをインストールしたブラウザで
https://www.e-tax.nta.go.jp/
にアクセスして「次のスタイルを書く: wwwe-taxntago.jpこのURL」をクリックして、以下のcssをペースト。

```css
.l_contents_item,.l_main{
 
    display:none;
}
header:after {
content: "あなたの心に語りかけています…納税したいだけなら…ここではありません…国税クレジットカードお支払サイトに行くのです。https://kokuzei.noufu.jp/";
    font-size:36px;
    margin:36px;
}
```
作業効率を高めるWindowsショートカットキー一覧【メモ】

#なぜこの記事を書いたのか
作業効率改善のため。
これまでは**何気なく覚えているショートカットキー+マウス操作**で事なきを得てきたが、そろそろショートカットキー全般を駆使して作業効率向上を図っていきたい。

#Windowsショートカットキー一覧
一通り網羅しているつもりだが、一部「これは使わないな…」と思うものは未記載。
##Win +
|キー|操作|
|---|---|
| |スタートメニュー表示／非表示|
|A|アクションセンター表示／非表示|
|D|デスクトップ表示／非表示|
|E|エクスプローラーを開く|
|G|ゲームバー表示|
|I|Windowsの設定を開く|
|K|ディスプレイ・オーディオ接続|
|L|画面ロック|
|M|全ウィンドウを最小化
|Shift + M|最小化したウィンドウを表示|M
|P|外部ディスプレイ出力|
|R|ファイル名を指定して実行|
|S|Web・Windowsを検索|
|T|タスクバーでアプリを切り替え
|U|設定内『簡単操作』を開く|
|V|クリップボードの履歴を表示|
|W|Windows lnk ワークスペース|
|X|クイックアクセスメニューを表示|
|数字|タスクバーのアプリを起動|
|,|全ウィンドウを一時透明化|
|.|キーボードから絵文字・顔文字を追加|
|;|拡大鏡の起動（拡大）|
|-|拡大鏡の縮小|
|Tab|タスクビューを表示|
|Home|最前面のウィンドウ以外を最小化|
|↑|アクティブウィンドウを最大化|
|↓|アクティブウィンドウを元のサイズに戻す（2度押しで最小化）|
|→ / ←|アクティブウィンドウを右or左に配置|
|Shift + ↑|アクティブウィンドウを上下フルサイズ表示|
|shift + S|スクリーンショットの撮影|
|PrintScreen|スクリーンショット撮影して保存|
|Ctrl + D|仮想デスクトップ生成|
|Ctrl + → / ←|仮想デスクトップの切り替え|
|Alt + D|日付・時刻を表示|

##Ctrl +
|キー|操作|
|---|---|
|A|すべてを選択|
|C|選択項目をコピー|
|N|新規ウィンドウを開く／作成|
|O|ファイルを開く|
|P|印刷画面を表示|
|S|ファイルを保存|
|V|切り取り・コピーした項目を貼り付け|
|W|表示中のアプリを閉じる|
|X|選択項目を切り取り|
|Y|元に戻した操作をやり直す|
|Z|操作を元に戻す|
|Shift + ESC|タスクマネージャーの起動|
|Shift + F10|IMEのプライベートモードをON/OFF|
|クリック|複数ファイルを選択|
|ドラッグ|ファイルをコピー|
|マウスホイール|デスクトップアイコンのサイズを変更|

##Alt +
|キー|操作|
|---|---|
|P|ファイルのプレビューを表示|
|Enter|プロパティを表示|
|Tab|開いているアプリ・ウィンドウの表示／切り替え|
|F4|アクティブなアプリを終了|
|Ctrl + Del|ロック画面を表示|
|ひらがな|ひらがな入力のON/OFF切り替え|
|PrintScreen|アクティブウィンドウのみ画像キャプチャ|

#まずは意識してショートカットを使おう
ショートカットキーも、改めて見ると結構な数が存在する。
いきなりすべてを覚えるのは難しいだろうから、まずは意識して使用するところから。
そうすれば、徐々に身体が覚えていき、自然とショートカットキーが使用できるようになるだろう。
結果、様々な作業の効率が劇的に向上する！・・・はずだ。