OmniAICreator/Qiita-1.07M huggingface dataset:
Flutter、いくつかある写真保存先の整理

# 動機
[camera plugin](https://pub.dev/packages/camera)やいくつかのサイトで、写真の保存先を指定するのにpath_providerを使用しているのを見かけるけれど、path_providerが提供するパスが当初わからず、からの、DCIMやPicturesに保存するときはどうすればいいのかと思っていじってみたものの整理。

||得られるパス(例)|保存先の確認方法|アプリ削除時|android,ios|
|---|---|---|---|---|
|getApplicationDocumentsDirectory|/data/user/0/com.example.package_name/app_flutter|`run-as package_name`で見に行ける。|消える|両対応|
|getExternalStorageDirectory|/storage/emulated/0/Android/data/com.example.package_name/files|`adb shell cd`で見に行ける。|消える|[androidのみ](https://pub.dev/documentation/path_provider/latest/path_provider/getExternalStorageDirectory.html)|

## 保存先の確認方法メモ

```shell:getApplicationDocumentsDirectoryでの方法
adb shell
run-as package_name
```

```shell:getExternalStorageDirectoryでの方法
adb shell
cd 保存先パス
```

path_providerで得られる領域はアプリ専有部の領域で、設定などに寄るのだろうけれど、エクスプローラー的なのだと見えないぽい。

# DCIMやPicturesへの保存方法

[permission_handler](https://pub.dev/packages/permission_handler)と保存先を直接指定をして出来た。

```Dart:
//事前に初期化などはしておく。
//controller = CameraController(cameras[0], ResolutionPreset.low);

// 保存先を直接指定
final String dirPath = '/storage/emulated/0/DCIM';
//final String dirPath = '/storage/emulated/0/Pictures';

//permission_handlerでDCIM、Picturesなどの共有部のパーミッションを得る(確認をとる)
Map<PermissionGroup, PermissionStatus> permissions = await PermissionHandler().requestPermissions([PermissionGroup.storage]);

String timestamp() => DateTime.now().millisecondsSinceEpoch.toString();
final String filePath = '$dirPath/${timestamp()}.jpg';

await controller.takePicture(filePath);

```

参考:http://blog.lciel.jp/blog/2014/02/08/android-about-storage/

# その他

## パッケージのリスト取得方法

```shell:
adb shell pm list packages
```

## permission_handlerをinstallしたらビルドし直す。
hot reloadだけだったのでpermission_handlerが動かなくてハマった。
Vue-cli3、Webpack4、babel7で、IE11向けの「@babel/preset-env」を使いたい

Vue.jsで作っていて、IE11が真っ白になる時。

```
SCRIPT1003 Expected ':'
```

このエラーが何か分からなくて、困る時がありますよね？
おそらく`babel`の設定が、うまくできてないだけだと思います。

###IE11は...
{ value }というようなshort-handが使えず、
{ key: value }にしていないと駄目だったり、

hoge(){}というような関数の省略した書き方は使えず、
hoge: function(){}という書き方にしたり、

data:() => {}というようなアロー演算子は使えないので、
data: function(){ return }に直してみたり...

そもそもコレ`babel`で解決するべき事ですよね。。

`babel.config.js`って、難しいですよね。
`babel-polyfill`は非推奨ですって言うけど、じゃあどうしろとか説明ないし。

`babel7`以降で、IE11向けに`@babel/preset-env`を使いたい時。

# とりあえずインストール
今回参考にした記事が`vue2-dropzone`の`issue`なので、ほぼ関係ないと思いますが、
`vue2-dropzone`以外でも使える書き方みたいです。
まあとりあえず、参考記事の通り入れます。

```sh
$ npm install -D vue2-dropzone
```
#vue.config.js

```javascript
module.exports = {
  //（※通常の設定は省略しています）
  //↓webpack.config.jsの内容を変更する時の書き方
  configureWebpack: {
    module: {
      rules: [
        {
          test: /\.js$/,
          exclude: (file) => (
            /node_modules/.test(file) &&
            !/vue2-dropzone/.test(file)
          ),
          use: [
            { loader: "babel-loader" },
          ],
        }
      ],
    },
  }
};
```

#babel.config.js

```javascript
module.exports = {
  presets: ["@babel/preset-env"],
  overrides: [
    {
      test: ["./node_modules/vue2-dropzone"],
      presets: [
        ["@babel/preset-env", {	targets: { ie: "11" } 
        }],
      ],
      plugins: [
        '@babel/plugin-transform-arrow-functions',
        '@babel/plugin-transform-shorthand-properties',
      ]
    }
  ],
}
```

`'@babel/plugin-transform-arrow-functions',`
`'@babel/plugin-transform-shorthand-properties',`
これがうまく動いていれば、IE11で見えるはずです。

以上です。

## 参考記事
https://github.com/rowanwins/vue-dropzone/issues/439
DXRuby：「当たり判定」を自分で作ってみよう

# 概要
この記事は中学高校生向けプログラミング教室の教材として作ったものを一部改変したものです。

ゲームで大変よく使う「当たり判定」（衝突判定）について、DXRubyでは`===`や`check`などの便利な機能が付いています。しかし、いつもこのような機能が使えるとは限りません。

では、自分で作るとしたらどうしたらよいでしょうか？実は、いろいろな判定方法が考えられます。

<img width="50%" alt="atari_7b.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26536/06f006d8-2f81-d2a0-ef68-fec23bb845a7.png">

<img width="50%" alt="atari_en7b.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26536/5499c4f7-f956-7ddb-946e-1bd6d6ec98c5.png">

前の記事
・[プログラミング初心者向け：DXRubyで 1ステップずつ作っていく「ブロック崩し」 - Qiita](https://qiita.com/noanoa07/items/9ebc059550c620ab223c)

次の記事
・[DXRuby：「当たり判定」を自分で作ってみよう　A. 四角形の四隅の座標で判定する - Qiita](https://qiita.com/noanoa07/items/0d62604c769b9810c905)



# 当たり（衝突）判定の方法
いろいろなやり方が考えられるでしょうが、まずは以下の3通りのやり方が思いつきます。

[A. 四角形の四隅の座標で判定する](https://qiita.com/noanoa07/items/0d62604c769b9810c905)
[B. 円の中心からの距離で判定する](https://qiita.com/noanoa07/items/093989a7cc9c2853c11b)
[C. 色で判定する](https://qiita.com/noanoa07/items/52eda04c7150dd3c1ea8)

それぞれ、別記事になっています。

# 技術解説
## ソースコード
https://github.com/noanoa07/dxruby_blocks


## 使用ライブラリ
Windows向けRuby用2Dゲームライブラリ`DXRuby`を使用します。
バージョン`1.4.2`以上を想定しています。

### `1.4.2`より前のバージョンとの主な相違点

- `Window.loop`が複数置ける

- マウス位置を取得する`Input.mouse_pos_x`、`Input.mouse_pos_y`の新しい書き方として、`Input.mouse_x`、`Input.mouse_y`が追加

→ DXRuby 1.4.6：更新履歴

http://mirichi.github.io/dxruby-doc/CHANGELOG.html

### DXRubyインストールの注意点
→ DXRuby 1.4.6 をWindows10で使う時の注意点とインストール方法 - noanoa07 - Qiita
https://qiita.com/noanoa07/items/0ce14c2404df38de94b7


## 参考サイト
- DXRuby のホームページ
http://dxruby.osdn.jp

- DXRuby 1.4.6 リファレンスマニュアル
http://mirichi.github.io/dxruby-doc/index.html

困ったときは、このページの「チュートリアル」と「マニュアル」にだいたい書いてあります。

- DXRuby 1.4.1 リファレンスマニュアル
http://dxruby.osdn.jp/DXRubyReference/20095313382446.htm

古いバージョンのリファレンスも役に立つときがあります。

- 「ブロック崩し」追加課題1；衝突判定を自作してみよう - noanoa 日々の日記
http://blog.livedoor.jp/noanoa07/archives/2046177.html

このテキストのブログ記事での解説です。


## ライセンス
ソースコード、本解説ともにパブリックドメイン
MySQLコマンド（テーブル作成関連）

##はじめに
前回[MySQLコマンド（基本）](https://qiita.com/yukachin0414/items/4fd837f29e653c5a06ad)について紹介しました。
今回は実際にテーブル作成に必要なコマンドを紹介していきます。

##テーブル作成関連のMySQLコマンド

・テーブルの作成

```:
mysql > CREATE TABLE [テーブル名] (
  [カラム名] [データ型] [オプション]
); 

//例
mysql > CREATE TABLE `users` (
          `id` int NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT "ID",
          `name` VARCHAR(50) NOT NULL COMMENT "名前",
          `mail` VARCHAR(100) NOT NULL COMMENT "メールアドレス",
          `created_at` datetime DEFAULT NULL COMMENT "登録日",
); 
```

・テーブル一覧の表示

```:
mysql > show tables;
```

・テーブル名の変更

```:
mysql > ALTER TABLE [旧テーブル名] RENAME [新テーブル名];
```

・テーブルの削除

```:
mysql > DROP TABLE [テーブル名];
```

・テーブルにカラムの追加作成

```:
mysql > ALTER TABLE [テーブル名] ADD [カラム名] [型] [必要であればオプション];
```

・テーブル設計の確認

```:
mysql > show columns from [テーブル名];

//もしくは
mysql > desc [テーブル名]；
```

・カラムの変更

```:
mysql > ALTER TABLE テーブル名 ALTER COLUMN [カラム名] [型]；
```

・カラムの削除

```:
mysql > ALTER TABLE テーブル名 DROP COLUMN [カラム名];
```

・レコードの追加作成

```:
mysql > INSERT INTO [テーブル名] [カラム名] VALUES [値];

//例
mysql > INSERT INTO users (name, mail, created_at,)
          VALUES ("Yamada Takumi", "takumi@hoge.com", now());
```

・レコードの更新

```:
mysql > UPDATE [テーブル名] SET [カラム名]=[値] [条件式];
```

・レコードの削除

```:
//全レコード削除

mysql > DELETE FROM [テーブル名];

//一部レコード削除
mysql > DELETE FROM [テーブル名] WHERE [条件式];
```

##おわりに
ここまで使えれば一通りのMySQLコマンドは困らないと思います。
グーグルマップの左上の枠を”簡単に”消す

## 基本の状態
<p class="codepen" data-height="265" data-theme-id="dark" data-default-tab="html,result" data-user="sphenisc" data-slug-hash="RwPaKbL" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="RwPaKbL">
  <span>See the Pen <a href="https://codepen.io/sphenisc/pen/RwPaKbL">
  RwPaKbL</a> by sphenisc (<a href="https://codepen.io/sphenisc">@sphenisc</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

Webサイトでグーグルマップを表示すると左上にその店舗や建物の情報と評価が出てくるのですがかなりの頻度で「消してくれ」と頼まれます。
グーグルに問い合わせるのも面倒だしなにかいい方法はないかとやってみたのですがCSSで消すのが一番楽でした。

## 修正版
<p class="codepen" data-height="265" data-theme-id="dark" data-default-tab="html,result" data-user="sphenisc" data-slug-hash="ZEGWLYz" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="ZEGWLYz">
  <span>See the Pen <a href="https://codepen.io/sphenisc/pen/ZEGWLYz">
  ZEGWLYz</a> by sphenisc (<a href="https://codepen.io/sphenisc">@sphenisc</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

```css
top: -150px;
height: calc(100% + 150px + 150px);
```
グーグルマップの高さを上下に150pxずつ拡張して上に150px移動させることで左上の枠を画面外に出しています。
スマートフォンなどで画面が小さくなると150pxでは消しきれなくなるので数値を調整してください。
NW.jsを使ってWEBアプリをデスクトップアプリに移植する

# 概要
NW.jsはJavaScriptを使ってデスクトップアプリを作ることができるフレームワーク。 類似のフレームワークにelectronなどがある。  

はじめはelectronを検証していたが、NW.jsの方がソースの隠蔽が可能とのことで、こちらも検証してみることにした。ただしNW.jsもただパッケージ化しただけだと、簡単に解析されてしまう旨の記述をよく見るため、こちらは後日調査。


# ディレクトリ作成
以下の構成でディレクトリを作成 。package.jsonが２つあることに注意 
 
```
nw.js-example/
├── src/
│   ├── app/
│   │  └── main.js
│   ├── assets/
│   │  └── icon.png
│   ├── styles/
│   │  └── common.css
│   ├── views/
│   │  └── main.html
│   └── package.json
└── package.json
```

# マニュフェストファイル作成
マニュフェストファイルこと、src/package.jsonを作成する  
これは作成するアプリの設定を記述する  

```
{
  "name":"nw.js-example",
  "version":"1.0.0",
  "main":"views/main.html",
  "window":{
    "min_width":400,
    "min_height":400,
    "icon":"assets/icon.png"
  }
}
```

# HTMLファイル作成
マニュフェストファイルのmainに記載されたhtmlファイルが最初に実行される  
そのためview.html/main.htmlを作成

#  ビルド設定
ルートのpackage.jsonを編集するビルド時の設定をする
name,versionともに両package.jsonファイルに同じものを記載しておかないと  
パッケージが作成できないので要注意。  

```
{
  "name":"nw.js-example",
  "version":"1.0.0",
  "devDependencies":{
    "nw":"^0.18.2",
    "nw-builder":"^3.1.2"
  },
  "scripts":{
    "dev":"nw src/",
    "prod":"nwbuild --platforms win32,win64,osx64,linux32,linux64 --buildDir dist/ src/"
  }
}
```

# 必要なパッケージのインストール  
以下コマンドを実行し、上述のdevDependenciesに記載されるパッケージをインストール  

```
$ npm install
```

# デバッグ実行  
```
$ npm run dev  
```

# パッケージ作成
```
$ npm run prod
```
package.jsonのscripts:prodに指定した分だけパッケージが作成される  

![nw1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573779/6df3dac9-28fe-7f03-7628-86e7ccb36d73.png)



win64は以下のようになっており、  64bitWindows環境でnw.js-example.exeを実行できる

![nw2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573779/a3d0375d-af56-cbeb-5fee-5e91a6651a40.png)


一方linux64は以下のような感じになっており、コマンドラインからnw.js-exampleを実行できる。 GUI経由でダブルクリックでは実行できないが、これはubuntuの設定の問題の様子。  
nexeファイルというものについても後日調査。

```
$ ./nw.js-example
```

![nw3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573779/00ea185f-acd3-ef3f-4d0a-5ec3b0008944.png)


# 結果
![nw4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573779/9d56c792-6edd-803c-78b6-2c8ca0b3983c.png)

デスクトップアプリとしてアプリケーションを実行することができた。

# 所感
工数の観点からwebアプリをデスクトップアプリ、ネイティブアプリに変換・流用することを検討しており、Erectron,NW.jsと調査をしたものの、いずれも制約があったり、性能面で不都合があったりと、思ったように簡単に変換・移植ができるわけではない。数年先のマルチプラットフォームフレームワークはどうなるかはわからないものの、直近はWEBアプリ、ネイティブアプリ別々の技術を習得していく必要があるかと思われる。
AWS技術簿 その2 - EBS -

#EBSとは
AWSで提供されているサービスの一つ、正式名称は`Elastic Block Store`
EC2と共に使用するために設計されている。
簡単に言ったらオンプレミスで言う所のHDDやSSDのようなもの。

#どのような利点があるか
・簡単に容量の拡張/縮小や、ストレージタイプをデータを保持したまま変更することが可能。
・AZ内で自動的に複製がされているため、もしもの際にすぐ復元できるという信頼性が高い。
・手動で定期的なバックアップを取ることも可能(S3を利用してスナップショットと呼ばれるバックアップを作成する)

#どのような種類があるのか
EBSボリュームを作成する際に、ボリュームタイプと容量を指定することができる。
ボリュームタイプは以下4種類から選択を行うことが可能なため、必要に応じて使い分ける。

###SSDタイプ
`プロビジョンドIOPS SSD`
4種類の中で一番最高速度とパフォーマンスを発揮するEBSストレージ。
1秒間の読み込み・書き込みををどれほど行えるかを示すIOPSが最大64000もあるため、
低レイテンシーを必要とする場面や読み書きを多用する場面に最適。
但し、使用料金も4種類の中で一番高い。
容量は4GB 〜 16TBまで選択が可能

`汎用SSD`
無料枠で使用できるEBSストレージのため、名前はよく聞くと思う。
先程のプロビジョンドIOPSよりは低速ではあるがSSDタイプのストレージなので、IOPSはかなり高く、最大16000を叩き出している。
価格も抑えつつ程々の性能で使いたい時にはオススメのストレージではある。
また、無料枠という強みもあるため、値段はかけたくないが少しだけ触りたいという場面、例えば開発やテスト環境を構築したい時にも便利。
容量は4GB 〜 16TBまで選択が可能

###HDDタイプ

`スループット最適化 HDD`
ビックデータやログの処理など、大きな容量を読み書きする状況に特化したHDD
また、データ等の処理も非常に高く設定されており、スループットパフォーマンスを利用時間の99%で発揮するように設計されている。
なお、HDDタイプのため起動ボリュームとしては使用できない。
容量は500GB 〜 16TBまで選択が可能

`Cold HDD`
IOPSなどが一番低速ではあるが、その代わりに値段も抑えられるHDD
アクセス頻度が低いデータを格納する際に便利。
なお、HDDタイプのため起動ボリュームとしては使用できない。
容量は500GB 〜 16TBまで選択が可能
コンテナからイメージを作成してdocker hubにpushする

## 目的
dockerコンテナにriscvのクロスコンパイラ環境を構築する際にriscv-toolchainのbuildに想像以上に時間が掛かり、また同じように環境作成を行うのはしんどいと思ったので環境作成中に一旦commitしてイメージを作成しようと考えた。ついでにdocker hubへのpushも行っておく。
## 参考記事
https://qiita.com/tubone/items/a3bad04abf4c700cae3d
https://www.memotansu.jp/docker/626/
http://docs.docker.jp/engine/reference/commandline/commit.html
## 作業環境
- Windows10 Home Insider Preview
  - バージョン:2004
  - OSビルドバージョン:19564
- WSL2 Ubuntu18.04
  - Remote-WSL(VSCode)

## 手順
### 稼働中のコンテナの停止
まずは稼働中のコンテナを停止するので、停止するコンテナを調べる。

```
$ sudo docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
e21a09577ff9        rust-env            "/bin/bash"         10 hours ago        Up 10 minutes                           rust-env
```
調べて停止したいコンテナがあったら停止する。
（commitする際にコンテナが一時停止するようなのでこの手順はなくていいかも）

```
$ sudo docker stop
```

### dockerコンテナのイメージ作成
docker commitで以下のように作成する。
`docker commit [コンテナ名] [リポジトリ名]:[tag名]`

```
$ sudo docker commit rust-env chilchil/rust-env:latest
sha256:1cd5668d157123abe7b3422623c21f96766df0df7e9c2a850e1d28aa488dd1fe
```
イメージが作成されたかどうか確認する。

```
$ sudo docker images
REPOSITORY             TAG                 IMAGE ID            CREATED             SIZE
chilchil/rust-env      latest              1cd5668d1571        53 seconds ago      14.3GB
```
### docker hubにpush
作成したイメージをdocker hubにpushする。docker hubへのリポジトリの作成とかは以下を参照。
https://qiita.com/umi/items/d4b5a68263ad0444693b

```
$ sudo docker login
Authenticating with existing credentials...
～省略～
Login Succeeded
$ sudo docker push chilchil/rust-env
The push refers to repository [docker.io/chilchil/rust-env]
～省略～
latest: digest: sha256:175c3dadc63c15f5a3c369078999722553b9200158028cf97685baa911d0e168 size: 2624
```
pushしたdockerイメージを確認する。（publicである場合）

```
$ sudo docker search chilchil
NAME                   DESCRIPTION         STARS               OFFICIAL            AUTOMATED
chilchil/rust-env                          0               
```

以上になります。
Unity入門：アニメーションコントローラーをプログラムでつけたい場合どうしたらいいのか？

##1 . はじめに。(飛ばしてください)
最近Unityを本格的に触りだしたUnity初心者の「HARUK」です。今回は「プログラム側でアニメーションコントローラーをつけるコード」についてメモを書き残そうと思っています。Unityのプログラムを勉強するために簡単な横スクロール3Dゲームを作ろうと思っています。その中でプレイヤーが操作するキャラクターをプログラム側で生成し、そのキャラクターのモデルにアニメーションコントローラーを設定したいと思いました。画面の端に待機させておく。や初めからプレイヤーに見えないようにしておく。などヒエラルキーであらかじめ設定しておくという手段もあるのですが、後々のことも考えて今回はプログラムで制御する方法を学ぼうと思いました。

「勉強しているぞ！」ということを第三者にアピールするために日記としてつけていますが、もし同じところで困っている人がいたら見ていただければ幸いで


##2 .  プログラム
早速プログラムについて
実装方法について調べてみたところ、
こちらのページにソースコードが書かれていましたので参考にされていただきました。とてもわかりやすい。

https://gametukurikata.com/basic/addcomponent

ソースコード

```

Animator m_animator;
//ここでコンポーネント取得
m_animator = model.GetComponent<Animator>();
   if (m_animator == null) {
      //モデルにアニメーターのコンポーネントを追加 
      m_animator = model.AddComponent<Animator>();
   }
//アニメーションコントローラーを関連づける。
m_animator.runtimeAnimatorController = Resources.Load<RuntimeAnimatorController>("PlayerController");

```

これをプレイヤーのソースコードに付け加えるとうまく動きました。

次は背景をスクロールさせるクラスを作ろうと考えています。


##3 . 最後に
趣味で3Dモデリングをやっています。
もしよければみてくれれば幸いです。
そして、できればお気に入りをつけてほしいな。
以上！
Rust環境構築 for Windows10-64bit

# はじめに
- [Rust](https://www.rust-lang.org/)に入門すべく、環境構築したので備忘録。
 - [GitHub](https://github.com/rust-lang/rust)

# 入門前のイメージ
- C++言語の後継でモダンな感じ。
- 初心者の壁は、またポインタかな。
- 次世代のプログラミング言語の主役になるのかな。

# では入門します

- GitHubでの[ファーストコミット](https://github.com/rust-lang/rust/commit/c01efc669f09508b55eced32d3c88702578a7c3e)は、2010/6/17でした。 

- QiitaでRustの記事を検索してみました。
 - [一番古い記事](https://qiita.com/koko1000ban/items/0391922e1849cd8684e8)は、@koko1000ban さんの2012/4/5投稿でした。
 - [一番ストック数＆いいね数が多かった記事](https://qiita.com/elipmoc101/items/3c8b6d8332a9019e578c)は、@elipmoc101 さんの**プログラミング言語Rustのススメ**でした。(2020/2/16時点)

# 環境構築
- 必要なものは、3つあります。
 - [Rust](https://www.rust-lang.org/tools/install)のインストーラ
 - [Build Tools for Visual Studio 2019](https://visualstudio.microsoft.com/ja/downloads/?rr=https%3A%2F%2Fgithub.com%2Frust-lang%2Frust)
 - お好きなエディタ(Visual Studio Codeなど)

![download-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89366/33e61d05-5e6a-aaeb-dc21-d761fd31a012.png)


※ Visual Studio 2019 Communityをインストールすると、Build Toolsは含まれる気がする。(未検証)
※ VirtualBox上のWindows10で稼働確認しました。

## インストール

- とりあえず初心者の特権!?で、何も考えずインストールしてみました。

### Rust
- ダウンロードしたインストーラを起動して、Enterキーを3回押すと完了。 
![install-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89366/54fb9227-4855-0a14-4d6b-04ba87b4191e.png)
![install-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89366/215c11dc-6a95-e229-adc1-a211672db7c9.png)
![install-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89366/c833fd15-b882-acab-b981-40f64366c2a6.png)

#### 当初はこれで、Rust動くぞ!だったが…
- なんか怒られました。
![error-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89366/1e91cd9b-191b-bb18-ffe1-e50efa3e2c28.png)

#### ここで、VS Codeを入れてみたけど、同じく怒られました。

### Build Tools
![bt-0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89366/b455cf85-d7eb-2830-b6b5-072e01fe534c.png)

- C++ Build Toolsを選択して入れます。 
 - 個別のコンポーネントから、**Windows10SDK** と **language pack**を個別に入れると動くのかもしれません。(未検証)
![bt-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89366/33f47166-b573-96c2-6dbc-3066521f4c4f.png)

## Hello Rust!

```sh
> cargo new hello
```
![pj-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89366/ab8fe6b4-5423-b787-0ed9-66c30a5420c1.png)


```sh
> cd hello
> cargo run
```
![run-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89366/773e9223-797e-7862-910b-fc6fb013222d.png)

### なんかHello Rust!した気になれませんでした…
### Hello Rust!

```sh
> mkdir hello_rust
> cd hello_rust
```

```rust:main.rs
fn main() {
    println!("Hello Rust!");
}
```

## コンパイルの仕方

```sh
> rustc -o hello.exe main.rs
```

## 実行

```sh
> hello
Hello Rust!
```

![hello.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89366/e9cdc26e-fc7f-354d-27da-2f70e6ab94ed.png)


## おまけ
```sh
> mkdir test
> cd test
> echo fn main() {println!("Hello Rust");} > hello.rs
> rustc hello.rs
> hello
Hello Rust!
```


# おわりに
- プログラミング言語の学習は、Rust(ラスト)にしたい。
Windows10についてくるsftp.exeの使い方メモ

# はじめに
sftp関連のシステム間連携が増えてきて気軽に試せるクライアントを探していましたが、
それがWindows10に最初から備わっていることを最近知りました。
その際にわかったことををメモします。

# sftp.exeの場所
C:\Windows\System32\OpenSSH

# 使い方
- 鍵ファイルを使ったやり方
sftp -i [鍵ファイルパス] [ユーザ名]@[ホスト名]

- パスワードを使ったやり方
sftp [ユーザ名]@[ホスト名]

# はまったところ
鍵ファイルのアクセス権に自分以外がアクセス可能になっていると下記のようなエラーがでる。

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions for '[ファイル名]' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key "[ファイル名]":bad permissions
・・・


ファイルのプロパティのセキュリティで自分以外のユーザやグループを削除することでエラーが解消した。
#Vue の初心者向けチュートリアルが面倒なので、1個のHTMLファイルにまとめて動作確認する ( はじめに - Vue.js )

# チュートリアル

[はじめに — Vue.js](https://jp.vuejs.org/v2/guide/index.html)

# 手順


```html
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>

<body style="font-size: 150%;">
  <div id="app"></div>

  <hr>

  <div id="app-2">
    <span v-bind:title="message">
      Hover your mouse over me for a few seconds
      to see my dynamically bound title!
    </span>
  </div>

  <hr>

  <div id="app-3">
    <span v-if="seen">Now you see me</span>
  </div>

  <hr>

  <div id="app-4">
    <ol>
      <li v-for="todo in todos">
        {{ todo.text }}
      </li>
    </ol>
  </div>

  <hr>

  <div id="app-5">
    <p>{{ message }}</p>
    <button v-on:click="reverseMessage">Reverse Message</button>
  </div>

  <hr>

  <div id="app-6">
    <p>{{ message }}</p>
    <input v-model="message">
  </div>
</body>

<script>
new Vue({
  template: '<p></p>',
  data:{ msg:'hello world!' }
}).$mount('#app')

var app2 = new Vue({
  el: '#app-2',
  data: {
    message: 'You loaded this page on ' + new Date().toLocaleString()
  }
})

var app3 = new Vue({
  el: '#app-3',
  data: {
    seen: true
  }
})

var app4 = new Vue({
  el: '#app-4',
  data: {
    todos: [
      { text: 'Learn JavaScript' },
      { text: 'Learn Vue' },
      { text: 'Build something awesome' }
    ]
  }
})

var app5 = new Vue({
  el: '#app-5',
  data: {
    message: 'Hello Vue.js!'
  },
  methods: {
    reverseMessage: function () {
      this.message = this.message.split('').reverse().join('')
    }
  }
})


var app6 = new Vue({
  el: '#app-6',
  data: {
    message: 'Hello Vue!'
  }
})

</script>


```


これをてきとうなパスに保存して開くこと。

Macならテキストをコピーした後に

```
pbpaste > ~/vue-start.html && open ~/vue-start.html
```


とか。

# 動作例

![image](https://user-images.githubusercontent.com/13635059/74581728-fab57800-4ff5-11ea-9f57-eae5bcaeb020.png)


# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Vuex:mapState,mapGetters,mapActions,mapMutationsの使い方

「これ何に使うの？」と思ったら予想外に便利なので書く。

#store.js
例えばこんな`store`があるとします。

```javascript
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
  state:{
    hoge:'',
  },
  getters:{
    hogetters: (state) => state.hoge,    
  },
  mutations:{
    updateHoge(state,payload){
      const self = this
      self.state.hoge = payload
    },
  },
  actions:{
    getHoge(value){
      const self = this
      self.dispatch('updateHoge',value)
    }
  },
});
```

#Sample.vue
Componentsの最初に読み込んでおきます。

```vuejs
<script>
import { mapState, mapGetters, mapActions, mapMutations } from "vuex";
export default {
  name: 'HogeVue',
  computed:{
    ...mapState({
      hoge:'hoge',
    })
    ...mapGetters({
      hogetters:'hogetters',
    }),
  },
  methods:{
    ...mapActions({
      getHoge:'getHoge',
    }),
    ...mapMutations({
      updateHoge:'updateHoge',
    }),
  },
}
</script>
```

すると、こんな風にラクに書けます。

```vue
<template lang="pug">
  .sample
    h1 {{hogetters}}
    p(@click="getHoge('fuga')") {{hoge}}
</template>
<script>
  //（上記map...は省略します）
  methods:{
    sample(){
      const self = this
      self.updateHoge('fuga')
    },
  },
</script>
```

storeの値を呼び出す時に
`this.$store.state.hoge`
`this.$store.getters.hogetters`
と毎回書いていくと、数が多くなるにつれてダルくなってきますので、
使うものは最初に`map...`に書いてあげたほうがあとあとラクになります。

`mapGetters`と`mapActions`は特に沢山呼び出す時は使えると思います。
以上です。
Spreeで使われているfactorybot

spreeで使われているfactorybot。
勉強のために切り抜きました。参考までに。

```product_factory.rb
FactoryBot.define do
  factory :base_product, class: Spree::Product do
    sequence(:name)   { |n| "Product ##{n} - #{Kernel.rand(9999)}" }
    description       { generate(:random_description) }
    price             { 19.99 }
    cost_price        { 17.00 }
    sku               { generate(:sku) }
    available_on      { 1.year.ago }
    deleted_at        { nil }
    shipping_category { |r| Spree::ShippingCategory.first || r.association(:shipping_category) }

    # ensure stock item will be created for this products master
    before(:create) { create(:stock_location) unless Spree::StockLocation.any? }

    factory :custom_product do
      name  { 'Custom Product' }
      price { 17.99 }

      tax_category { |r| Spree::TaxCategory.first || r.association(:tax_category) }
    end

    factory :product do
      tax_category { |r| Spree::TaxCategory.first || r.association(:tax_category) }

      factory :product_in_stock do
        after :create do |product|
          product.master.stock_items.first.adjust_count_on_hand(10)
        end
      end

      factory :product_with_option_types do
        after(:create) { |product| create(:product_option_type, product: product) }
      end
    end
  end
end

```


```taxon_factory.rb
FactoryBot.define do
  factory :taxon, class: Spree::Taxon do
    sequence(:name) { |n| "taxon_#{n}" }
    association(:taxonomy, strategy: :create)
    parent_id { taxonomy.root.id }
  end
end
```

```taxonomy_factory.rb
FactoryBot.define do
  factory :taxonomy, class: Spree::Taxonomy do
    sequence(:name) { |n| "taxonomy_#{n}" }
  end
end
```



詳細は本家githubのファイルで。
[https://github.com/spree/spree/tree/master/core/lib/spree/testing_support/factories](https://github.com/spree/spree/tree/master/core/lib/spree/testing_support/factories)
Tera Termでホスト、ユーザ名、パスワードの入力を省略する

#概要
TeraTermを起動するたびに、ホスト選んで、ユーザ名とパスワードを入力がめんどくさい。
ファイルに書いてそれを実行するだけで、すぐ使えるようにしたい。

#ログイン用ttlファイルを作成
teratermのインストールフォルダにsshlogin.ttlというのが入っています。

```sshlogin.ttl
; sample macro of Tera Term
;
; File: ssh2login.ttl
; Description: auto login with SSH2 protocol
; Environment: generic
; Update: 2004/12/4
; Author: Yutaka Hirata

username = 'nike'
hostname = '192.168.1.3'

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

msg = 'Enter password for user '
strconcat msg username
passwordbox msg 'Get password'

msg = hostname
strconcat msg ':22 /ssh /auth=password /user='
strconcat msg username
strconcat msg ' /passwd='
strconcat msg inputstr

connect msg
```

これを参考に以下のように修正。

```login.ttl
username = 'nike'
password = 'nike'
hostname = '192.168.1.3'
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

msg = hostname
strconcat msg ':22 /ssh /auth=password /user='
strconcat msg username
strconcat msg ' /passwd='
strconcat msg password

connect msg
```

#実行
TeraTermのインストールフォルダにある「ttpmacro.exe」に関連付けて実行
#Vue js を環境構築なし、サーバーなし、HTMLファイル1個だけで一瞬で始める、動かす。 (初心者向けチュートリアルを始めたい)

# local に html ファイルを作る

自分のPCでファイルを作成、編集してアクセスする


`~/start.html`

```html
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>

<div id="app"></div>

<script>
new Vue({
  template: '<p></p>',
  data:{ msg:'hello world!' }
}).$mount('#app')

</script>
```

`open ~/start.html`

これだけで動くみたいだ。

![image](https://user-images.githubusercontent.com/13635059/74581495-53374600-4ff3-11ea-8202-fed5ce98634c.png)


npm とか 色々用意しないと動かせないのかと思いこんでいたが、なんと

# チュートリアルの二個目

ちゃんと動いている。

テキストにマウスを乗せるとポップアップが出てくるぜ。


```html
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>

<div id="app-2">
  <span v-bind:title="message">
    Hover your mouse over me for a few seconds
    to see my dynamically bound title!
  </span>
</div>

<script>
var app2 = new Vue({
  el: '#app-2',
  data: {
    message: 'You loaded this page on ' + new Date().toLocaleString()
  }
})
</script> 
```

![image](https://user-images.githubusercontent.com/13635059/74581659-14a28b00-4ff5-11ea-946b-771fcdb30c76.png)

# オンラインサイトを使う場合

公式でもおすすめされているサイト

https://jsfiddle.net/chrisvfritz/50wL7mdz/

にアクセスすると既にHTML / Javascriptが入力されており、 Run を実行するだけで動作させられるようだ！


![image](https://user-images.githubusercontent.com/13635059/74581545-0acc5800-4ff4-11ea-87f5-dcecdf4f0f17.png)

# 参考

「Vue js はじめに」にこのことが書いてあるのだが、そもそも、膨大なドキュメントのどれが「はじめのはじめ」なのかが、初学者には分からないのですよ。

https://jp.vuejs.org/v2/guide/index.html

この「はじめに」にインストールボタンがあって、そこから npm の話とか出てくるじゃないですか…。

![image](https://user-images.githubusercontent.com/13635059/74581583-744c6680-4ff4-11ea-8dd0-88a04c172b4e.png)



# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
RubymineでDB接続するための方法

Rubymine上でDBを見れるようにする方法を紹介します。
似たような記事は多いですが、備忘録のためメモ。

## 環境

・Rails
・MySQL


## ゴール
RubymineでDB接続

こんな感じに中身を見れるようします。可視化出来ると見やすく、ちゃんと保存されたか、更新されたかなどが分かるのでいいですよね！

<img width="1432" alt="Proteindex____workspace_runteq_original_runteq_Proteindex__-_Proteindex_development_reviews__Proteindex_development_localhost_.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342078/3f6a443b-2c2c-05ab-e0f0-e8c56f8df396.png">


## ViewからToolwindowを開き、Databaseを選択
画像のとおりに `View → Toolwindows → Database `と選択します。
(もし仮にここでDatabaseが追加されない場合は、ググってみてください)

<img width="489" alt="スクリーンショット 2020-02-16 13.45.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342078/da565afc-3bed-8122-3c93-993be9f5d57c.png">

## Import from Sourcesを押す

これだけでRubyMineがあとは自動設定してくれます。
<img width="461" alt="スクリーンショット 2020-02-16 13.59.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342078/58135fe5-a749-3e64-0c0f-dab089732cc8.png">


## Test Connectionして OKを押す

databaseにつなぐ設定をテストします。
Railsなら。 `database.yml` に記載されてますよね。パスワードが空欄の場合はそのままでOKです。

<img width="392" alt="スクリーンショット 2020-02-16 14.02.03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342078/1cf45464-bf8b-c756-fd57-a4a30e2e34e0.png">

そしたら成功し、OKを押せば完了です！

## おまけ DBのDiagramを見る

``右クリック →  Diagrams → Show Visualisation`` でDB図を見れます。

<img width="817" alt="スクリーンショット 2020-02-16 14.09.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342078/102b665f-ccc3-8ea5-9a87-a65b01661c05.png">

こんな感じです。便利ですね。

<img width="609" alt="スクリーンショット 2020-02-16 14.10.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342078/18267836-21a8-b913-06a9-6867e32af188.png">

他にもDB関係で便利な機能があるはずですが、まだ発掘中です。
これ便利だよってのがあれば教えてください！
私も分かり次第追加します。
OpenSiv3D で 使える絵文字を探す(OpenSiv3d C++)


ちょいメモ

タグ検索は、<B>O</B>pen<B>S</B>iv3<B>D</B>        
OSDは大文字でタグ検索するといいみたいです。

試行錯誤の過程があるので、手っ取り早く行いたい人は、ずっと下にスクロールして「まとめ」に行った方がいいです。



OpenSiv3D公式サイトで絵文字リストがありました。
https://github.com/Siv3D/OpenSiv3D/wiki/Emoji-list

noto color font で検索してもいいようです。

で見つけたサイト、ここに行く
https://www.google.com/get/noto/help/emoji/

前回失敗したライオンの絵文字に再度挑戦

サイトへ飛び、下へスクロールして動物のところへスクロール
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76087/1ad062fc-48d2-1ae7-bcc6-1087cc6bb8c9.png)

##ライオンを発見！##
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76087/fbbc0164-dc0f-1854-d99c-d78bd735f43c.png)

サイトのはグラフィックでコード貼り付け不可能、仕方なく前回のまま、
OpenSiv3Dでグラフィックは用意されていると予測して変更

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76087/852423e6-9f22-6d29-4267-e3160d494b37.png)

文字は仕方ないとして、グラフィックはサイトの表示と同じになる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76087/ec75ed4d-93cc-bb19-54fd-03e0c6a11304.png)

・・・・とりあえず原点回帰、困ったら公式サイト
https://github.com/Siv3D/OpenSiv3D/wiki/Emoji-list

こちらで、探す・・・が普通に探すと面倒。

CTRL+F で **lion**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76087/8721d826-04bd-33f6-62f5-4771ec263662.png)

絵文字は公式サイトからもコピーできる。


##絵文字を使う、まとめ##

noto color font で検索して見つけた NOTO FONT公式サイト、ここに行く

notofontの公式サイトでいい文字を探し、フォント名をコピー
https://www.google.com/get/noto/help/emoji/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76087/0a5d1102-fbbd-b20a-4c40-e80bb78e78f8.png)

見つけたら
OpenSiv3D公式サイトで絵文字リストから

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76087/2b9c65d2-a103-c859-b22d-e952d2a98226.png)

CTRL+F でコピーした文字列で探す、もしくはスクロールしてカテゴリで選ぶとか

希望の絵文字を見つけたら、絵文字をコピーしてソースコードに貼り付ける

絵文字のグラフィックは表示されるようだが、**文字列としては表示されないものもある**、これは仕方ないと割り切る

参考動画：
https://www.youtube.com/watch?reload=9&v=q0tf_Mb3H1M

## もっと手っ取り早く！ 直感的にすぐに使えるTODO情報が欲しいんだ

<font color="red">忙しい人向け</font>

ここで
https://note.com/siv3d/n/n9498c21e25ba
好きな絵文字を選んでコピー。
自分のソースコードに張り付け・・・以上

分かりやすくて詳しい絵文字表示コード説明（OpenSiv3Dのいつのバージョンか不明・・・だが大まか使えそう）
https://scrapbox.io/Siv3D/%E7%B5%B5%E6%96%87%E5%AD%97%E3%82%92%E6%8F%8F%E3%81%8F

## memo
Siv3Dはいろいろなバージョンの説明サイトがあり、動かないとかある・・・
ライブラリ開発者は、OpenSiv3Dも　Openの文字が付く前のSiv3D  　どちらも インクルードは Siv3D.hpp になっている

簡単な見極め方法として、文字列表記が　

**U**”～”    << OpenSiv3Dバージョン   キーワードが部分的に違う場合もあるが大方いけるイメージ
**L**"～”    << Siv3Dバージョン   動かないリスク高い（特に３D系）
ReactとVueとAngularの戦い。

日本ではReactとVueが競い合っているように思えますが、実際はどうなのかを調べてみました。
## [npm trends](https://www.npmtrends.com/)
[npm trends](https://www.npmtrends.com/)という場所がありまして、そこではnpmパッケージのダウンロード数をグラフに表示してくれます。

使い方は簡単、パッケージ名を一つづつ入力していくだけです。

### 調査結果
[react vs @angular/core vs vue vs jquery vs typescript | npm trends](https://www.npmtrends.com/react-vs-@angular/core-vs-vue-vs-jquery-vs-typescript)


reactとvueと@angular/coreとjqueryとtypescriptの図
![npmtrends.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44761/9d2a5872-3cc9-84c1-e1dc-7aca30231cdd.png)

Reactの圧勝ですね。Vueは日本だと記事を色々見かけて人気なのはなぜなのでしょうか？

## [The State of JavaScript 2019](https://2019.stateofjs.com/)
ついでにこちらでも調べてみます。
[The State of JavaScript 2019](https://2019.stateofjs.com/)でフレームワークを見てみます。
### [Front End Frameworksカテゴリ](https://2019.stateofjs.com/front-end-frameworks/)
React
https://2019.stateofjs.com/front-end-frameworks/
Vue
https://2019.stateofjs.com/front-end-frameworks/
Angular
https://2019.stateofjs.com/front-end-frameworks/angular/

濃いピンクが、以前使用したことがあり、また利用したい。
薄いピンクが、以前使用したことがあり、もう使わない。
濃い緑が、聞いたことがあり学びたいと思っている。
薄い緑が、聞いたことはあるが興味はない。

満足度（＝濃いピンク/（濃いピンク＋薄いピンク））はReactとVueは同じくらいのようです。

SvelteがVueを抜き第二位に入っていますね。
[The State of JavaScript 2019: Front End Frameworks]
(https://2019.stateofjs.com/front-end-frameworks/)
Windows 10のスタートアップフォルダ

#フォルダの場所
```
C:\Users\[ログインユーザ]\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
```

#ファイル名を指定して実行からフォルダを開く
Windowsキー + R で「ファイル名を指定して実行」を起動し、以下を入力しOKをクリック。

```
shell:startup
```
文字列と数値と真理値のリテラルに親を殺されたPythonプログラミング

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/375554/fe0b6d2a-62d7-65e9-9b67-9171d705bacd.png)

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">ここ10年で最高に醜いPythonによるFizzBuzz <a href="https://t.co/s61asSaSyt">pic.twitter.com/s61asSaSyt</a></p>&mdash; フライドサラダチキン南蛮 (@raclett3) <a href="https://twitter.com/raclett3/status/1228727328722710529?ref_src=twsrc%5Etfw">February 15, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

Python3(以下Python)は平易で読みやすい文法を特徴とします。(本当にそうなのかは議論の余地があると思いますが、少なくとも上記ツイートのソースよりは読みやすいと思われます。)

しかしながら、Pythonには重大な欠点があります。さまざまな値を表現するのにリテラルを使用するため、もしあなたが**文字列と数値と真理値のリテラルアレルギー**になってしまったときにPythonが使用できなくなってしまうのです。

しかしご安心ください。以下のテクニックを駆使することで、それらのリテラルが使用できなくなっても値を表現することが出来ます。

## 真理値

`True`と`False`を表現する方法は比較的簡単です。

```python
not()  # True
not[()]  # False
```

`not`演算子はFalsyな値を`True`に、Truthyな値を`False`にします。何がFalsyであるかは[公式ドキュメント](https://docs.python.org/3/library/stdtypes.html#truth-value-testing)にあります。

空タプルはFalsyであるため、`not`で否定することで`True`を得られます。対して、空タプルのリストはTruthyであるため、否定することで`False`を得られます。

## 小さな数値

比較的小さな数値は、`str()`, `int()`と各種組み込みクラスで作った文字列やタプル等の長さを`len()`で取得することで作ることが出来ます。

```python
int()  # 0
len([()])  # 1
len(((),())) # 2
len(hex(not()))  # 3
len(str(not()))  # 4
len(str(not[()]))  # 5
len(str(complex(not(),int()))) # 6
len(str(bytes(len(((),)))))  # 7
len(str(((),())))  # 8
len(str(([int()],[])))  # 9
```

`int()`は[こちら](https://docs.python.org/3/library/functions.html#int)、`str()`は[こちら](https://docs.python.org/3/library/stdtypes.html#str)で詳しい仕様を知ることが出来ます。

さらに、これらを文字列として結合したあと`int()`で数値に変換したり、算術したりすることであらゆる数値を作成できます。

## 文字

数値があれば、文字列リテラルがなくともすでにある文字列から添字で値を借りることが出来ます。スライスで目当ての文字列をそのまま引っ張ってくることも出来ます。

```python
str(not[()])[not()]  # a
str(bool)[len(str(((),())))]  # b
str(complex)[len(str(((),())))]  # c
...
```

全ての文字について書くと長くなりすぎるのでやめておきます。君だけの文字の生成法を見つけてくれよな！

## 番外編: ifアレルギーを発症してしまったときに

人によっては**ifアレルギー**を発症してしまうことがあるかもしれません。そんなときには、以下の回避法があります。

### andとorによる回避法

`and`と`or`は、短絡評価という、**結果が確定したらそれ以上評価を行わない**(左辺が、`and`なら`False`、`or`なら`True`であれば右辺を評価しない)という特徴があります。([公式ドキュメント](https://docs.python.org/3/reference/expressions.html#not))

これを利用することで、

```python
condition and truthy or falsy  # or以降は省略可能

#  condition = 条件, truthy = Trueの場合, falsy = Falseの場合
```

と記述することが出来ます。

### whileによる回避法

上記の方法ではtryやwhileといった構文を含めることが出来ません。そこで、whileを使った回避法もご紹介します。

```python
while condition:
    ...
    break
```

## まとめ

これらのテクニックを用いることで、文字列と数値と真理値のリテラルを使用せずにPythonのコードを書くことが出来ます。最初のツイートもおおよそこれらのテクニックで記述されているため、だいたい何を書いているかもわかるようになったことかと思います。

もしあなたがそれらのアレルギーであれば、この記事が助けになれば幸いです。あなたがそれらのアレルギーを発症した日には、またこの記事を見て、対策への第一歩となれば嬉しいです。

## 追記(2020/02/20)

[こちらの記事](https://qiita.com/ikanamazu/items/fe71bc8600869130da52)で@ikanamazuさんに解説して頂きました。本当にありがとうございます！

ところで2020/02/20ってめっちゃ並び綺麗っすね。
windows10のロック画面の画像を壁紙にも自動で反映させる

windows10を利用していて、ロック画面に自動で現れる画像が毎回かっこいいので、壁紙にもシャッフルしてどれかを自動で設定するようにしました。
microsoftが自動で配信しているこんなやつです。
![09ce27f81fe10e69dab84b9dcbe3596017470790c99959bb293a9683a9559f12.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538462/2c1de68d-b89c-708b-476c-0f994c88b470.jpeg)

コードはwindows10の標準で利用できるようにpowershellで実現しています。
あまり、powershellに慣れてないので、コードの美しさについてはご愛嬌でお願いします。
とりあえず、動くものができました。
自動でmicrosoftから配信されているファイルをローカルにコピーしているので、ローカルの好きなフォルダを指定してください。
コマンドの実行は、手間はかからないのでログイン時に手動でポチポチやっても良いし、自動で実行したい場合は、タスクスケジューラに組み込むか、スタートアップのフォルダにでも入れて実行用のbatを実行してください。
あと、反映されないことが結構ありますが、それはwindowsの仕様です。
再起動すると確実に反映されるので、結局次回利用時には反映されています。
ちなみに、壁紙の変更にあたりレジストリ値を変更していますので、実行の際は自己責任でお願いします。

```
$sh = New-Object -ComObject Shell.Application

#ローカルフォルダ格納先
$localPath = 'C:\Users\xxx\Desktop\Assets'

#前日更新されたファイルを取得する
$localappdata = $env:LOCALAPPDATA
$assetsFileList = Get-ChildItem($localappdata + '\Packages\Microsoft.Windows.ContentDeliveryManager_cw5n1h2txyewy\LocalState\Assets') | Where-Object{$_.LastWriteTime.Date -eq (Get-Date).AddDays(-1).Date}

#コピーしながら拡張子を.jpgに変更する
foreach($file in $assetsFileList){
    #もし同名のファイルがあればスキップする
    if (!(Test-Path ($localPath + '\' + $file + '.jpg'))){

        Copy-Item ($localappdata + '\Packages\Microsoft.Windows.ContentDeliveryManager_cw5n1h2txyewy\LocalState\Assets' + '\' + $file) $localPath

        #拡張子の変更
        Rename-Item ($localPath + '\' + $file) ([System.IO.Path]::ChangeExtension(($localPath + '\' + $file), ".jpg"))
    }
}

#フォルダ取得
$f = $sh.Namespace($localPath)

#ファイル名の一覧を取得
$fileList = Get-ChildItem($localPath) -Name

[string[]]$array = @()

#ファイルサイズ(横縦)
#（1920×1080）の場合がPCの壁紙
foreach($file in $fileList){
    if ($f.GetDetailsOf($f.ParseName($file), 31) -eq "1920 x 1080"){
        $array += $file;
    }
}

#index値をシャッフルする
$randomNumber = Get-Random -Minimum 0 -Maximum ($array.Count - 1)

$filePath = $localPath + '\' + $array[$randomNumber]

Set-ItemProperty -Path 'HKCU:\Control Panel\Desktop'  -Name 'Wallpaper' -Value "$filePath"

#繰り返さないとデスクトップの変更が反映されないらしい
rundll32.exe user32.dll,UpdatePerUserSystemParameters 1, True
rundll32.exe user32.dll,UpdatePerUserSystemParameters 1, True
rundll32.exe user32.dll,UpdatePerUserSystemParameters 1, True
rundll32.exe user32.dll,UpdatePerUserSystemParameters 1, True
rundll32.exe user32.dll,UpdatePerUserSystemParameters 1, True
rundll32.exe user32.dll,UpdatePerUserSystemParameters 1, True
rundll32.exe user32.dll,UpdatePerUserSystemParameters 1, True
rundll32.exe user32.dll,UpdatePerUserSystemParameters 1, True
rundll32.exe user32.dll,UpdatePerUserSystemParameters 1, True
rundll32.exe user32.dll,UpdatePerUserSystemParameters 1, True
```
DNA変換をC言語で実装

- @am10
- https://qiita.com/am10/items/3ecac20451c82133e900

いつものことながらcompat.hはmini7zとか7bgzfとかから拾ってきてください

```c:dnaize.c
#include "../compat.h"
#include <stdio.h>
#include <string.h>

static const char *t="ATCG";

static int dnaize_encode(FILE *fin,FILE *fout,bool imm){
	int i=0,j=0,b=0,c;
	u32 x=0;
	for(;~(c=fgetc(fin));){
		x=(x<<8)+c;
		i++;
		b+=8;
		b-=2,fputc(t[(x>>b)&0x3],fout),j++,imm&&fflush(fout);
		b-=2,fputc(t[(x>>b)&0x3],fout),j++,imm&&fflush(fout);
		b-=2,fputc(t[(x>>b)&0x3],fout),j++,imm&&fflush(fout);
		b-=2,fputc(t[(x>>b)&0x3],fout),j++,imm&&fflush(fout);
		if(j==76){fputc('\n',fout);j=0;imm&&fflush(fout);}
	}
	//if(b)fputc(t[(x<<(2-b))&0xf],fout),j++; //shouldn't happen :p
	if(j)fputc('\n',fout),imm&&fflush(fout);
	return 0;
}

static int dnaize_decode(FILE *fin,FILE *fout,bool imm){
	int b=0,c;
	u32 x=0;
	char *p;
	for(;~(c=fgetc(fin));){
		//if(c=='='){
		//	break;
		//}
		if(between('a',c,'z'))c-=0x20;
		if(p=strchr(t,c)){
			x=(x<<2)+(p-t);
			b+=2;
			if(b>=8)b-=8,fputc((x>>b)&0xff,fout),imm&&fflush(fout);
		}
	}
	while(b>=8)b-=8,fputc((x>>b)&0xff,fout),imm&&fflush(fout);
	return 0;
}

#ifdef STANDALONE
int main(const int argc, const char **argv){
	initstdio();
#else
int dnaize(const int argc, const char **argv){
#endif
	int l=strlen(argv[0]);
	bool imm=false;
	if(argc>1)return dnaize_decode(stdin,stdout,imm);
	else return dnaize_encode(stdin,stdout,imm);
	//return 0;
}
```

(動く物自体は先月末時点でできてたんだけど、整形するのが面倒で記事が今になってしまった)
Windowsで管理共有（隠し共有）

#概要
頻繁にやりないけど、たまに必要になるのでそのためのメモ。
同じLAN上のPCとファイルを共有したいときに、共有の設定とかせずにアクセスする方法。

#共有マシンのCドライブにアクセスする方法
エクスプローラのアドレスバーに以下を入力

```
\\共有マシン名\c$
```

#参考
[管理共有を無効にしたい - ITmedia](https://www.itmedia.co.jp/help/tips/windows/w0661.html)
micro:bitで2軸カメラマウントのコントロール

#micro:bitで2軸カメラマウントのコントロール
micro:bitにサーボモータを2つ使った2軸カメラマウントを繋いでコントロールしてみた。
![cam_mount.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576327/9683d2d4-99a3-15ec-1cd1-50910ffb250c.jpeg)

##2軸カメラマウント
[SG90というサーボモータを使ってコントロール出来るカメラマウント](https://www.amazon.co.jp/SG90%E3%82%B5%E3%83%BC%E3%83%9C%E7%94%A8-%E3%82%AB%E3%83%A1%E3%83%A9%E3%83%9E%E3%82%A6%E3%83%B3%E3%83%88-2%E8%BB%B8%E3%82%A2%E3%83%B3%E3%82%B0%E3%83%AB-%E7%A9%BA%E6%92%AE%E3%81%AB%E3%82%82-%E3%82%B5%E3%83%BC%E3%83%9C2%E5%80%8B/dp/B01LAHF5AQ/ref)
を使ってみた。

マウントキットとしての出来はいまいちな感じ。
- 見本通りに組み立てると、モーター2つがぶつかり雲台が平行にならない
　->下のモーターはケースの外側にはみ出すように配置するといい(固定してない)
- サーボモータのアームは細くするなど加工が必須
　->カッターで細く削ったり短く切る必要がある
- モーターを固定するためにネジをきっちり締めるとモーターが雲台にぶつかって歪む
　->ネジを途中までしか閉めない。スペーサーをかませればいいんだけど・・・
と問題はあるが、一応組み上がった。
[組み立てはここを参考に](https://www.amazon.co.jp/gp/customer-reviews/R3A5QTHEITUU5F/ref=cm_cr_dp_d_rvw_ttl?ie=UTF8&ASIN=B07GPLMKTZ)
モーターのセンター位置がわからなかったので、一度組み立ててmicro:bitのプログラムでセンター出しをしてから、再度水平になるように組み直した。
組む前にmicro:bitと繋いでセンター出しすれば良かった。

##モータードライバと電池ボックス
kitronikのServo:Liteを使った。
[製品情報と仕様はこちら](https://www.kitronik.co.uk/blog/getting-started-servolite-board-microbit/)
- 単4電池3本でモーターの電源とmicro:bitの電源をまかなえる。
- P1端子とP2端子にサーボモータを繋げられるようになっている。
- P0端子には色を変えられるLEDが5つ。
- micro:bitとはネジで5つの端子を直結できる。
- On/Offのスライドスイッチ付き。
しかし、買ってみると本体と接続ネジだけが入っていてマニュアルが一切ついていない。
使い方はホームページを見ないといけない・・・

##micro:bitのプログラム
micro:bitの加速度センサーを利用して、
- 左右に傾ける(role)とその角度に応じて雲台を左右に向ける。
- 上下に傾ける(pitch)とその角度に応じて雲台を上向き下向けに傾ける。
というプログラムを作った。
![2020-02-16-000228_1082x456_scrot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576327/0f11ca5b-ec16-954f-8173-0df3d99f92cb.png)
サーボモータは0〜180度まで任意の角度に保持できるので、電源を入れたときに中心(=90度)にする。
この位置で水平に近くなるように雲台を組み上げておく。
あとはmicro:bitのセンサー値をモーターに与えるだけ。

##実行
実行するとこんな感じで、micro:bitの傾きに応じて雲台が動くようになった。
![cam_ctrl.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576327/967dc4dc-ac8d-abaf-df65-c57e88d0daaf.gif)
ThingSpeakの積み上げグラフ

以前書いた気温のグラフがバグってたので直してみました。二値の積み上げグラフで、片方を白にして消して、高気最低最温の表示を行います。

[以前作ったもの](https://qiita.com/yamori813/items/c2cb30fb48b216ab89e9)は0度以下に対応していませんでした。

```matlab
% Last week max and min temputure

readChannelID = ;
readAPIKey = "";

last = 7 * 4;

day = datetime('now') - last;
disp(day);

% startdaystr = "Sep 22, 2019 00:00:00";
% enddaystr = "Sep 23, 2019 00:00:00";

for c = 1:last
    
    startdaystr = datestr(day,'mmm dd, yyyy 00:00:00');
    enddaystr = datestr(day + 1,'mmm dd, yyyy 00:00:00');
    [a,b] = thingSpeakRead(readChannelID, 'ReadKey', readAPIKey, 'Fields',2,'DateRange', [datetime(startdaystr),datetime(enddaystr)]);

    a = filloutliers(a,'linear');
    [m, n] = max(a);
    [x, y] = min(a);

    t(c) = day;
    if x > 0
      vmax(c) = m - x
      vmin(c) = x
    elseif m > 0
      vmax(c) = m
      vmin(c) = x
    else
      vmax(c) = x - m
      vmin(c) = m
    end
    day = day + 1
end

C = vertcat(vmin, vmax);

H = bar(t, C, 'stacked');

ba = H(1);
bb = H(2);
disp(ba);

ba.FaceColor = 'flat';
bb.FaceColor = 'flat';

set(H(1),{'EdgeColor'},{[1 1 1]});
set(H(2),{'EdgeColor'},{[1 1 1]});
for c = 1:last
    if vmin(c) > 0 
      ba.CData(c,:) = [1 1 1];
      bb.CData(c,:) = [1 0 1];
    elseif vmax(c) < 0
      ba.CData(c,:) = [1 1 1];
      bb.CData(c,:) = [1 0 1];
    else
      ba.CData(c,:) = [1 0 1];
      bb.CData(c,:) = [1 0 1];
    end
end
```

![スクリーンショット 2020-02-16 13.39.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/558c1a35-c528-62f2-93af-bad698f7c7d1.png)

テストケース：最高気温10度最低気温2度

![スクリーンショット 2020-02-16 13.35.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/6ad7c810-23ce-480b-d937-6868b8b688df.png)

テストケース：最高気温2度最低気温-10度

![スクリーンショット 2020-02-16 13.34.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/eacfeeef-715b-2970-2ea6-a6cf1ceb24e3.png)

テストケース：最高気温-2度最低気温-10度

![スクリーンショット 2020-02-16 13.33.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/4fe78ade-fdf4-8c5c-2ec6-6c0952b751f9.png)

季節外れの雪が降った日のグラフがおかしくなっていました。

![MATLAB_BUG.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/604d625d-79bc-d526-3380-e625de3462f8.png)

調べてみたところfilloutliers(a,'linear');がエラー値としてデータを省いたことが原因でした。季節外れの雪にMATLABも迷ってしまったようです。

![スクリーンショット 2020-04-09 12.29.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/4d18af06-c469-7b99-5af9-6ca21110196a.png)
【Docker】docker runがエラー（Error starting userland proxy: listen tcp 0.0.0.0:80: bind: address already in use）


#エラー問題点
docker runを行うと下記エラーとなる。

```
#docker run -p 80:80 -p 443:443 -d --privileged centos:latest /sbin/init

docker: Error response from daemon: driver failed programming external
 connectivity on endpoint amazing_proskuriakova 
(65b0d6d847914cee8f6129bd36fed4d0a1c67843be6413d238f0c376af150950): Error 
starting userland proxy: listen tcp 0.0.0.0:80: bind: address already in use
```

#結論
80番ポートであるapacheが起動していたから起こったエラーでした。


#解決策

##1.ポート番号をずらしてコマンドを実行してみる。
`(sudo)docker run -p 88:88 -p 443:443 -d --privileged centos:latest /sbin/init`

このようにポート番号を80ではなく88にずらして実行

##2.すでに80番ポートで起動しているプロセスを終了する


```
[root@ip-172-31-28-29 ~]# lsof -i -P | grep "LISTEN"
rpcbind   2677      rpc    8u  IPv4  16507      0t0  TCP *:111 (LISTEN)
rpcbind   2677      rpc   11u  IPv6  16510      0t0  TCP *:111 (LISTEN)
httpd     3057     root    4u  IPv6  18359      0t0  TCP *:80 (LISTEN)
httpd     3093   apache    4u  IPv6  18359      0t0  TCP *:80 (LISTEN)
httpd     3094   apache    4u  IPv6  18359      0t0  TCP *:80 (LISTEN)
httpd     3095   apache    4u  IPv6  18359      0t0  TCP *:80 (LISTEN)
httpd     3096   apache    4u  IPv6  18359      0t0  TCP *:80 (LISTEN)
httpd     3097   apache    4u  IPv6  18359      0t0  TCP *:80 (LISTEN)
master    3200     root   13u  IPv4  18805      0t0  TCP localhost:25 (LISTEN)
sshd      3364     root    3u  IPv4  20172      0t0  TCP *:22 (LISTEN)
sshd      3364     root    4u  IPv6  20174      0t0  TCP *:22 (LISTEN)
container 3502     root    7u  IPv4  21589      0t0  TCP localhost:34781 (LISTE )
```

apacheが起動していました。



さっそく終了させます。

```
sudo apachectl stop
```

今思えば、以前にシステムがブートするたびに Apache ウェブサーバーが起動するように下記コマンドで設定していました。

```
sudo chkconfig httpd on
```
RailsでJavaScriptでの遷移時にフラッシュを表示させる

# やりたいこと
RailsでJavaScriptで遷移させるときに、フラッシュを表示させたい。
調べるとフラッシュに相当する文言を隠して( display: none とか？) おいて、JavaScriptで表示させる( display: block とか)の方法しかなかった。
GETパラメータで送るのヤダなぁと思ったので別の方法を考えた。

# やったこと
**アクションを作ってフラッシュ付きでリダイレクトさせる**

具体的にはこう。

```items.js
location.href = '/items/redirect_with_flash_message';
```

```items_controller.rb
class ItemsController < WebController
  def redirect_with_flash_message
    flash[:alert] = 'ログインが必要です'

    redirect_to new_user_session_path
  end
end
```

どうでもいいけどRailsのタグ、スペル間違ってない？
python-opencvでQt plugin "cocoa"が見つからないというエラー

結構悩んだので、忘備録

## 環境
Mac OS 10.15.3
Python 3.7.3 (by homebrew)
opencv-contrib-python 4.2.0.32 (by pip)
opencv-python         4.2.0.32 (by pip)

## 解決策

`python-opencv`を入れて貰い物のコードを試していたら、
下記のようなエラーが。

```
qt.qpa.plugin: Could not find the Qt platform plugin "cocoa" in ""
This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.
```

調べると、環境変数`QT_QPA_PLATFORM_PLUGIN_PATH`なるものを設定しろ、という人が多かったが、自前の環境ではうまくいかず。

結局、opencv-python 4.1系にダウングレードしたら解決した。

```
pip3 install opencv-python==4.1.2.30
pip3 install opencv-contrib-python==4.1.2.30
```

## 参考
https://stackoverflow.com/questions/60032540/opencv-cv2-imshow-is-not-working-because-of-the-qt