OmniAICreator/Qiita-1.07M huggingface dataset:
WordpressのメールをYahoo!メールで受信する設定

いまだにYahoo!メールを使っている私ですが、外部メール（Wordpressで設定したメール）を受信するときにちょっとだけハマったのでメモする

##Yahoo!メールで受信するためには「外部メール設定」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346533/5f531d85-d39b-9db7-c9ae-9e26583a6f8d.png)


##設定画面
設定はこのような感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346533/19f0d6bb-b91c-d4a9-37b9-5318ff381689.png)

ハマったポイント
１．アカウントはメールアドレス
設定画面に「メールアドレスとは違います」と書いてありますが、私の場合はメールアドレスそのままでした。

２．新着メールのみ受信のチェックをはずす
LASTコマンドエラーが出てうまくいかなかったのですが、新着メールのみ受信のチェックをはずすことでエラーが回避されました。
ヘルプの見たら乗っていました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346533/189bda73-9491-717d-bbaa-34e8176f6412.png)

##結論
申し訳ないですが正直Yahoo!メールの設定が画面はわざと混乱を招くような仕様になっててダメダメですね。
Yahoo!メールからは早く脱却しないと思った次第です。
ちなみにGamilでは簡単に設定できますよ。
VirtualBox で AndroidStudio の Emulator を実行したい

# VirtualBox で AndroidStudio の Emulator を実行したい
したいよね。 VirtualBox 6.0 以降ならできるんです。

今年になって、VagrantとVirtualBoxを弄ってから気づいたんだけど、

[ここの記事](https://blog.amedama.jp/entry/virtualbox-nested-virtualization) の通り、
- VirtualBox 6.0 ... AMD の CPU 
- VirtualBox 6.1 ... Intel の CPU

で、Nested Virtualization 機能がサポートされたらしい。
実際に手元のVirtualBox6.1を見たら項目が存在してた。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/194966/719d056e-9dbd-fc06-1ff6-deb2d6add63c.png)

もちろん、処理が軽いわけではないのだが。

Vagrantfileとしては、vb.customizeの欄が追加になる。
--nested-hw-virt を on にすればいいだけ。

```Vagrantfile
  config.vm.provider :virtualbox do |vb|
    vb.customize [
      "modifyvm", :id,
      "--nested-hw-virt", "on", # VT-x のNested/AMD-Vを有効にする
    ]
```

これで仮想環境でビルドしてそのまま確認できるぜ！
備忘録 CentOS7 mySQL構築


##リポジトリの確認
```
yum repolist all | grep mysql
```

##MySQLインストール
```
yum install mysql-community-server
```

##起動、起動確認
```
systemctl start mysqld.service
systemctl status mysqld.service
```

##永続化、永続化確認
```
systemctl enable mysqld.service
systemctl is-enabled mysqld.service
```

##インストール時にrootのパスワードがlogに吐かれているのでgrep
```

grep password /var/log/mysqld.log

---------------------------------------------------------
出力されるログ:
---------------------------------------------------------
2019-07-11T05:15:43.436113Z 5 [Note] [MY-010454] [Server]
 A temporary password is generated for
 root@localhost: G2Y%RSazYr1t
---------------------------------------------------------
パスワード = G2Y%RSazYr1t
---------------------------------------------------------
```

##各種設定
```
(パスワードの更新等)
mysql_secure_installation

★ポリシー違反しないパスワードの例
passwordPASSWORD@999
```

##ログイン
```
mysql -u root -p

##パスワードの仕様詳細表示
SHOW VARIABLES LIKE 'validate_password%';
##パスワードを弱くする
SET GLOBAL validate_password.policy=LOW;
SET GLOBAL validate_password.length=4;
```


##ユーザ権限確認
```
use mysql
select user,host from mysql.user;
```
##権限を変更
```
rename user root@localhost to root@'%';

quit
************************************************************
bye
```

##CentOS7 ファイアウォール設定
```
firewall-cmd --add-service=ssh --zone=public --permanent
firewall-cmd --add-service=http --zone=public --permanent
firewall-cmd --add-service=https --zone=public --permanent
```

##ポート開放
```
firewall-cmd --add-port=3306/tcp --zone=public --permanent
```

##許可するサービスの追加と削除
```
firewall-cmd --add-service=mysql --zone=public --permanent
//firewall-cmd --remove-service=mysql --zone=public --permanent
```

##firewalldのリロード
```
firewall-cmd --reload
```

##許可されているサービスやポートの一覧を表示
```
firewall-cmd --list-all --zone=public
firewall-cmd --list-services --zone=public
firewall-cmd --list-ports --zone=public
```

##ip addr
```
192.168.227.130
```
【Flutter】ページの初期化時に一度だけBlocの処理をコールしたい

# やりたかったこと

FlutterでBlocパターンでの実装において、StatefulWidgetの初期化時に一度だけ、Blocの処理をコールしたい、！

具体的には、トップページの初期化時に一度だけ新着ポップアップ通知の確認や、初回チュートリアルの表示確認をしたいケースでした。

TopPage,Blocは以下のような実装になります。

```top_page.dart
class TopPage extends StatefulWidget {
  @override
  State<StatefulWidget> createState() => TopPageState();
}

class TopPageState extends State<TopPage> {
  TopBloc _bloc;
  
  @override 
  void didChangeDependencies() {
    super.didChangeDependencies();
    _bloc = Provider.of<TopBloc>(context);
  }

  // _bloc.checklaunchAction.add()をどこで呼ぶ？

  @override 
  Widget build() {
    ...
  }
}

class TopBloc {
  
  final PublishSubject<void> _checkLaunchActionController = PublishSubject();

  Sink<void> get checkLaunchAction => _checkLaunchActionController.sink;

  TopBloc() {
    _checkLaunchActionController.listen((_) {
      // ポップアップの確認処理など
    });
  }

  dispose() {
    // controllerのdispose処理
  }
}
```

`TopBloc`,`TopPage`は以下のようにProviderを経由して、生成されます。これをすることで、TopPage内で`Provider.of<TopBloc>(context)`でBlocを参照することができます。

```hoge.dart
Provider<TopBloc>(
  child: TopPage(),
  builder: (context) => TopBloc(),
  dispose: (_, bloc) {
    bloc.dispose();
  },
);
```

## 案1: initState()で呼ぶ

Providerを使って、Blocを初期化し、その子ウィジェットとしてStatefulWidgetを生成するため、initStateの段階では、Provider.of(context)で必要なContextが取得できないため却下。

## 案2: didChangeDependencies()で呼ぶ

このコールバックでは、contextが取得できるため、Blocの参照をState側のプロパティで保持することをよくやりますが、画面遷移をしたりすると、何度も呼ばれる可能性があるため、却下。

## 案3: Blocのコンストラクタで呼ぶ

Blocのコンストラクタで、先に確認処理を実行しておき、その処理結果をBlobで保持しておくという方法もありますが、これだとBlocに結果を問い合わせるタイミングが難しいことや、処理が追いづらくなるという点で却下になりました。

# 結論

StateのinitStateにて、`WidgetsBinding.instance.addPostFrameCallback()`内に一度だけ呼び出したいものを記述する。

これをすることで、Widgetの最初にビルドが完了した後に呼ばれることが保証されるため、必然的にBlocが取得でき、一度だけ呼ばれるということも保証されます。

```top_page.dart
class TopPage extends StatefulWidget {
  @override
  State<StatefulWidget> createState() => TopPageState();
}

class TopPageState extends State<TopPage> {
  ...

  @override
  void initState() {
    super.initState();
    WidgetsBinding.instance.addPostFrameCallback((_) {
      // ここで処理を呼び出す
      _bloc.checkLaunchAction.add(null);
    });
  }

  ...
}
```

また、以下のようにmixinを定義して、あたかも新しいライフサイクルコールバックかのように書くこともできます

```initial_runnable_state.dart
mixin InitialRunnableState<T extends StatefulWidget> on State<T> {
  void runOnInitialBuild();

  @override
  void initState() {
    super.initState();
    WidgetsBinding.instance.addPostFrameCallback((_) {
      runOnInitialBuild();
    });
  }
}
```

```top_page.dart
class TopPageState extends State<TopPage> with InitialRunnableState<TopPage> {
  
  ...

  @override
  void runOnInitialBuild() {
    // ここで処理を呼び出す
    _bloc.checkLaunchAction.add(null);
  }

  ...
}
```

こちらのmixinについては、以下のリポジトリに公開しています。
https://github.com/youmitsu/InitialRunnableState

pub.devにも公開しました
https://pub.dev/packages/initial_runnable_state


間違いあれば指摘いただけると助かります！最後までご覧いただきありがとうございました。
Pythonのリスト内包表記でいつも混乱するので覚え書き

# はじめに
仕事で Python を使っていて、
「あー、ここのリスト作る処理、リスト内包表記にしたら簡潔に書けるのになー。」
と思うことがあります。
でも、私がリスト内包表記を書きたいと思う場面が意外と少ないため、いざ書こうと思ったときに、
「あれ、リスト内包表記って、どうやって書くんだっけ？うーん、時間もないし、いつも通りループにするか。」
と、残念な感じになるので、私自身のための覚え書きの意味も含めて。

# リスト内包表記とは？
初めてこの言葉を聞いたときは、頭の中が？マークだらけに。。。
すごーく簡単に言うと、リスト内包表記とは、
**リストデータを１行で作る方法**
です。

ただし、何でも1行で書けるわけではなく、（若干語弊がありますが、）ループでリストを作成する処理を1行で書けるものです。
私自身、「仕事で書くコードは複雑なんだよ！」と思っていたのですが、意外と使えます。

# 書き方

## 通常のループ
これはリスト内包表記ではありません。
```python
data = []
for i in range(10):
    data.append(i)

print(data)
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

```

## リスト内包表記
```python
print([i for i in range(10)])
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
```

### 解説
通常のループと、リスト内包表記の結果は同じです。
しかし、リスト内包表記の方が、記述量が少なくてすみます。
そして、コードが簡潔で読みやすくなります。（慣れないと読みにくいですが。）

リスト内包表記のコードを見ていきます。

`[...]`
ご存知の通り、これでリストができるため、通常のループの `data = []` が不要になります。

`for i in range(10)`
これは通常のループでも、リスト内包表記でも同じです。
ただし、リスト内包表記の方には、 `:` は不要です。

`i for i in range(10)`
最初にでてくる `i` は、ループで取り出した `i` （2つめの `i` ）の値が格納されます。
ループのたびに最初にでてくる `i` の値が書き換わります。
その `i` が、ループの回数分、リストに追記（append）されます。

# もう少し具体的に
もう少し具体的な方が理解しやすいと思うので、次のケースで説明します。

## ケース1
リスト内のデータを加工したい場合。
例えば、 `['aa', 'b', 'ccc']` というリストの各データに、 `@` を付加したい場合。

```python
items = ['aa', 'b', 'ccc']
print([item + '@' for item in items])
# ['aa@', 'b@', 'ccc@']
```

`items` のデータに `@` をつけて、別のリストを作成しています。
リストデータから、別の**リストデータを１行で作った**というわけです。

## ケース2
データ加工処理など、決まったルールで文字列の途中に、別の文字を付加したい場合。
例えば、`abcdefgh` というデータに1文字ごとに、 `-` を付加したい場合。

```python
items = 'abcdefgh'
print('-'.join([item for item in items]))
# a-b-c-d-e-f-g-h
```

こちらは、文字列から**リストデータを１行で作っています。**
そのリストのデータを `-` で `join` して文字列に戻しています。

[追記]
コメントをいただいたので、追記します。
リスト内包表記を使わなくても実現できました。無駄がなくていいです。

```python
items = 'abcdefgh'
print('-'.join(items))
# a-b-c-d-e-f-g-h
```


ちなみに、２文字ごとに、 `-` を付加したい場合。

```python
items = 'abcdefgh'
print('-'.join([items[i*2: i*2+2] for i in range(int(len(items)/2))]))
# ab-cd-ef-gh
```

ちょっと詰め込みすぎな感じがするので、こんな感じでしょうか。

```python
items = 'abcdefgh'
loop_count = int(len(items)/2)
print('-'.join([items[i*2: i*2+2] for i in range(loop_count)]))
# ab-cd-ef-gh
```

[追記]
こちらもコメントをいただいたので、追記します。
上の場合は、`i` というカウンタを使うため、範囲外アクセスが起こる可能性があります。
それを回避した書き方です。

```python
items = 'abcdefgh'
print('-'.join(ch1+ch2 for ch1, ch2 in zip(items[::2], items[1::2])))
# ab-cd-ef-gh
```

カウンタを使う場合、使わない場合でも、文字が奇数個の場合、最後の1文字が出力されないことがわかりました。
カウンタを使うことになりますが、回避できました。

```python
import math
items = 'abcdefghi'
loop_count = math.ceil(len(items) / 2)
print('-'.join([items[i*2: i*2+2] for i in range(loop_count)]))
# ab-cd-ef-gh-i
```

# 最後に
ケース1では、リストのデータを加工して、別のリストを作る、
ケース2では、文字列を加工して、リストを作る、というサンプルです。

どちらのケースも、ループを使って実現できますが、
リスト内包表記を使えば、シンプルかつ簡潔にコードが書けます。
Vueデビューしてみた。

久しぶりの投稿です。
Vueを使い始めたので今回は前半はVueの環境構築・後半は私が思ったVueを使用して思った事を書きます。
長々書くのは嫌いなので早速環境を作成していきます。

### 環境構築

まずはCliをインストールします。

```
$ npm install -g @vue/cli
```

インストールが完了したら早速プロジェクトを作成しましょう。

```
$ vue create {{任意のプロジェクト名}}
```

作成したら、作成したファイル全てを一階層上のフォルダに移動します。
次に以下のコマンドで起動しましょう。

```
$ npm run serve
```

ブラウザで http://localhost:8080/ を開くと作成した画面に遷移できます。
これで基本の環境構築は完了しました。

### +Vuetify 



次にVueのマテリアルデザインライブラリVuetifyの加えた環境構築を書きます。
といっても上記とほとんど変わらず、プロジェクト作成後

```
$ vue add vuetify
```

このコマンドを打つとマテリアルデザインが適応されたページが作成出来てます。


### VueとAngular
上記で環境構築は完了しました。
ここからは私が感じたVueとAngularについてつらつら書いていきます。

#####1.　構成
　　初見で違いを感じたのは
　　Angularはjs(ts)・html・cssが全て `別ファイル` で管理されているのに対して
　　VueはVueファイル内にjs・hrml・css全てが `同ファイル内` で管理されます。
　　※勿論Vueも別ファイルで管理できます。但しhtml→Vueファイルになります。

　　実装していく上では対して影響はないですが、考え方の違いを感じました。
#####2. 　html記述方法
　　htmlの記述方法はあまりAngularと違和感を感じませんでした。
　　デフォルトの属性がng-xxxからv-xxxになった程度で直ぐに適応できます。
　　バインディング方法も変わらず、js側の受け取りが多少違うだけで直ぐに適応できます。

#####3. 　TypeScript
　　個人的には静的型付けが好きなのでVueでもTypeScriptで書きたいです。(anyは絶対許しません。)
　　Angularは公式にTypeScript推奨なのでTypeScriptの書き方さえ覚えてしまえば問題ありません。
　　対してVueはJavaScript推奨なのでAngularと比べるとTypeScriptで書きにくいと感じてしまいます。

#####4. 　マテリアルデザイン
　　私はマテリアルデザインを好んで使っています。
　　AngularはAngular Materialという王がいます。VueはVuetifyというマテリアルデザインが人気です。
　　どちらも完成度が高く素晴らしいのですが、Vuetifyの方が様々なインターフェースを用意しており
　　UIデザインに幅がでます。ただ、コピペしてすぐ確認できる最小構成のサンプルコードが無く、そこが残念に思います。
　　Angular Materialはその逆です。

以上が私が数ヶ月Vueを使った感想です。
Angular系を半年以上使用していた人は３日もあればVueに適応出来ると思います。
評判通りVueは使いやすく、良いフレームワークです。新規製品を作る場合は大規模製品でも私はVueを押します。
中国語形態素解析エンジンのjiebaを使ってみる

# 中国語形態素解析エンジンjieba
[jieba](https://github.com/fxsjy/jieba)のPython版で使ってみました。
[他のプログラミング言語のバージョンもあります](https://github.com/fxsjy/jieba#%E5%85%B6%E4%BB%96%E8%AF%AD%E8%A8%80%E5%AE%9E%E7%8E%B0)。
## インストール
```
$ pip install jieba
```

## テキストセグメンテーション
```python
>>> import jieba
>>> text = "我明天去东京大学上课。早上十点开始。"
#"私は明日東京大学の授業に出ます。朝の十時から。"
```

`jieba.cut`の戻り値はジェネレータ
`jieba.lcut`の戻り値はリスト
`jieba.cut_for_search`の戻り値はジェネレータ
`jieba.lcut_for_search`の戻り値はリスト

### Accurate Mode

```python
>>> segments = jieba.cut(text)
>>> list(segments)
['我', '明天', '去', '东京大学', '上课', '。', '早上', '十点', '开始', '。']
```
```python
>>> segments = jieba.lcut(text)
>>> segments
['我', '明天', '去', '东京大学', '上课', '。', '早上', '十点', '开始', '。']
```
**东京大学**がひと単語になっています、いいですね！
### Full Mode
`cut_all=True`にする。

```python
>>> segments = jieba.cut(text, cut_all=True)
>>> list(segments)
['我', '明天', '去', '东京', '东京大学', '大学', '学上', '上课', '。', '早上', '十点', '开始', '。']
```
```python
>>> segments = jieba.lcut(text, cut_all=True)
>>> segments
['我', '明天', '去', '东京', '东京大学', '大学', '学上', '上课', '。', '早上', '十点', '开始', '。']
```
### Search Engine Mode

```python
>>> segments = jieba.cut_for_search(text)
>>> list(segments)
['我', '明天', '去', '东京', '大学', '东京大学', '上课', '。', '早上', '十点', '开始', '。']
```

```python
>>> segments = jieba.lcut_for_search(text)
>>> segments
['我', '明天', '去', '东京', '大学', '东京大学', '上课', '。', '早上', '十点', '开始', '。']
```

## キーワード抽出
```python
>>> import jieba.analyse
>>> text = '''
... 伴随全球化进程不断加速，人类正面临着日益严峻的挑战，能源危机、环境污染、金融环境不稳定以及贫穷等各种问题不断显现在我们面前。应对这些挑战，各类人才需要通力协作，献力献策，共同攻克这些全球化难题。在这种背景下，作为领导型人才的摇篮，东京大学肩负着义不容辞的责任。我们将会以无限的勇气、智慧与责任感迎面直对这些挑战。
... 学贵精专，攀登学术巅峰毋庸置疑成为治学的原动力。对于在治学道路上苦苦求索的年轻学者和广大学生而言，他们不断前进、不断成长的动力源自于获取最精尖知识的一种兴奋感与喜悦感。东京大学不负国民所托，为这些学生、学者提供了成长的乐土，使其更好地造福社会。
... 东京大学创立至今，一直保持着东西方文化相结合的学术观点，不断发展，放眼世界，形成一面独特的旗帜。秉承传统，展望未来，东京大学吸引了各式人才汇聚于此，探索求知，灵变创新，将逐步成为“全球性知识创新与协作的据点”。在东大，国界、文化、年龄的壁垒通通被打破，新领域学术研究超越文理界限，产官学合作在此通力展开。为实现这一目标，首先需要创立卓越性与国际性二者兼备的研究生院，并积极开展跨学科的新学术领域拓展。... 东京大学宪章中规定，东京大学致力于为世界和平与人类福祉作出不朽的贡献。而现代社会正飞速发展，我们需要顺应时代发展的要求，将学术研究赋予新时代的意义。在坚守传统的同时，体制改革亦不可或缺。在深化本科生教育改革的同时，不断推进研究生院的根本变革，使其创造知识价值主体的意义显现出来。此外，亟需推进人事制度的改革创新，大力倡导男女平等，多给年轻人创造学以致用的机会， 并实现兼顾人力资源的流动性与稳定性。 不可忽视的一个问题是，推进上述改革的前提是提升整个社会对科研学术的信赖感，而这种信赖感建立在强化科研道德水准，推动科研成果转化的基础之上。
... 通过不断推陈出新，我们致力于将东京大学发展成为为日本民众所爱戴，乃至为整个世界所爱戴的东京大学。
... '''
```
テキストは[東京大学総長談論中国語版](https://www.u-tokyo.ac.jp/zh/about/president.html)になります。

### tf-idf値による抽出
```python
>>> keywords = jieba.analyse.extract_tags(text, topK=20, withWeight=False, allowPOS=())
>>> keywords
['东京大学', '不断', '信赖感', '学术', '挑战', '人才', '治学', '知识', '研究生院', '爱戴', '学术研究', '创新', '推进', '全球化', '改革', '科研', '这些', '致力于', '喜悦感', '创立']
```
良さそうですね。日本の漢字と少し違いますが、だいたい読めます。

### TextRankに基づく抽出
```python
>>> keywords = jieba.analyse.textrank(text, topK=20, withWeight=False, allowPOS=('ns', 'n', 'vn', 'v'))
>>> keywords
['成为', '知识', '创新', '学术', '发展', '需要', '改革', '人才', '推进', '科研', '挑战', '实现', '领域', '意义', '社会', '学术研究', '人类', '文化', '治学', '勇气']
```
## その他
他にもたくさんの機能を持っていて、
辞書をいじったり、品詞タグ付けしたり、などの事ができるので、詳しくは[公式](https://github.com/fxsjy/jieba)をみた方が良さそうです。README.mdの前半は中国語ですが、[後半](https://github.com/fxsjy/jieba#jieba-1)は英語訳になっています。

筆者は東京大学と全く関係ありあません。
IntelliJ x Kotlin x SpringBoot Could not autowire. No beans of 'xxx' type found.

# 事象

IntelliJ x SpringBoot x Kotolin　で、autowiredを使用とすると以下エラーがでた。


```
Could not autowire. No beans of 'xxx' type found.
```


画面キャプチャ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52335/868203e3-4986-049a-c98e-142b67b6cdb8.png)


# 対応
- IntelliJを最新にしてみたけど変わらなかった
- エラーは出ているが問題なく起動できるので放置でも良さそう
- エラーが気になる場合は、以下でエラーではなくWarning表示するように切り替える。

Preference > Inspections > Spring > Spring Core > Code > Autowiring for Bean Class
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52335/29084383-2194-630b-fe02-98e6c8727986.png)

# まとめ
IDEは便利だけど、ライブラリに対応できてないこともある。
コードだけに着目するのではなく、IDEを使っている場合はそこも考慮して落ち着いて対応する。
Docker-based deployments to heroku of Rails App(postgres) 2020.02

# Overview

ここに書くこと

- Dockerコンテナ上で動作するRailsアプリケーションに関する話です
- Railsアプリケーションをherokuにデプロイする話です
- dbはpostgreSQLを使います

# Prerequisite

- 以下の開発環境が出来上がっている
    - railsサーバー, dbサーバー用のdockerコンテナ（postgreSQL）のみ
    - docker-composeでコンテナ同士が協調している
- ローカルでrailsアプリが正常動作している
    - `rails s` + ブラウザにてWebページの確認ができる

# System

- <font color=blue>Docker</font>
    - ver: `19.03.5, build 633a0ea`
- <font color=blue>Docker-compose</font>
    - ver: `1.25.2, build 698e2846`
- <font color=blue>heroku CLI</font>
    - ver: `7.36.3 darwin-x64 node-v12.13.0`

# Table of Contents

1. Conclusion
2. `-a`オプションが必要
3. dbコンテナはherokuのアドオンを使う
4. 参考にさせていただいたページ


# Main

## 1. Conclusion

まず、結論です。以下の順にコマンドを打てば良いです。

```bash:docker-based-deployments-to-heroku(rails-app)
# webサービスイメージをherokuにpush
heroku container:push web -a myapp
# postgresql用add-onを作成する(大事)
heroku addons:create heroku-postgresql -a myapp
# webサービスコンテナをリリース（heroku上でコンテナを実行する？）
heroku container:release web -a myapp
# heroku上でdbのマイグレーション
heroku run rails db:migrate -a myapp
# デプロイしたWebページを開く
heroku open -a myapp
```

基本的には、参考にさせていただいたサイト通りなのですが、
いくつかそのままでは実行できない箇所があったので以下記述します。

## 2. `-a`オプションが必要

おおよそ全てのコマンドにおいて、
デプロイ対象のインスタンス（herokuではdynoと呼ばれる）の名称を指定する必要があります。
名称は、herokuのマイページでも確認できますし、CLIで`heroku apps`と入力しても確認できます。

```shell:ダメな例
heroku container:push web
```

と入力すると

```shell:エラーメッセージ
 ›   Error: Missing required flag:
 ›     -a, --app APP  app to run command against
 ›   See more help with --help
```

というエラーメッセージが出るので、`-a` オプションで指定します。

```shell:良い例
heroku container:push web -a myapp
```

## 3. dbコンテナはherokuのアドオンを使う

herokuではvolumeが使えません。
したがって、PostgreSQLは[herokuのアドオン](https://elements.heroku.com/addons/heroku-postgresql)を利用して、
webコンテナと接続させます。その設定が `heroku addons:create heroku-postgresql -a myapp` です。

## 4. 参考にさせていただいたページ

本記事は必要最小限の内容しか記述していません。
以下に有用な情報があります。

- [HerokuにRailsアプリのDockerコンテナをプッシュするまで(PostgreSQL) | Qiita](https://qiita.com/take18k_tech/items/616eba7979d5c74179ff)
- [Rails on DockerをHerokuでDeployするまで | Qiita](https://qiita.com/at-946/items/6958b1d35330c87b8e50)
- [Deploying with Docker | Heroku Dev Center](https://devcenter.heroku.com/categories/deploying-with-docker)
AtCoder のレートが上がらなすぎてキレたのでCLIツールをつくった

去年の 7 月からぼちぼちと AtCoder のコンテストに参加してはいるのですが、
茶と緑の間を行ったり来たりしていてキレたので、僕が考えた最強の AtCoder の CLI ツールを作成しました。

https://github.com/sachaos/ac-deck

これを利用することで以下のデモのようにシュッとコードを書いて、シュッとテストして、シュッと提出することが可能です。

まだ、あまり実践でテストされていないし、サポートしている言語も多くないので、使ってみてなにか問題があった場合は GitHub で Issue や Pull Request をいただけると嬉しいです。

## デモ

![demo.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40562/6a4d4c58-8e1e-2d29-98da-3b2c9bfe356c.gif)


## 特徴

* インストールが簡単
* Docker を利用することにより簡単にテスト実行環境が整う
* テンプレート機能
* サンプルデータのダウンロード
* サンプルデータを利用したテスト機能 (Docker 上もしくはローカルで)
* コード提出機能

## インストール方法

Mac ユーザーは Homebrew でインストールできます。

```
$ brew install sachaos/tap/ac-deck
```

Linux, Windows は GitHub にバイナリを置いているのでそちらを利用してください。

## 使い方

### セットアップ

```
$ acd config
```

認証情報を入力してください。

**注: 現状、 ~/.ac-deck.toml にパスワードなどをそのまま格納します。この挙動を理解して注意して使ってください。この挙動を修正することに興味がある場合は、ぜひコントリビュートしてください！**

### コンテスト参加の準備

```
$ acd abc150 prepare
Using template of python3
Generating testdata & source on abc150/abc150_a
Generating testdata & source on abc150/abc150_b
Generating testdata & source on abc150/abc150_c
Generating testdata & source on abc150/abc150_d
Generating testdata & source on abc150/abc150_e
Generating testdata & source on abc150/abc150_f
```

abc150 の問題それぞれのディレクトリを作成します。
それぞれのディレクトリの中には以下のファイルが生成されています。

* `main.py`: テンプレートから生成されたソースファイル
* `testdata.yaml`: サンプルの入力、出力のデータ
* `.task.yaml`: ac-deck 用の設定ファイル

### 問題をブラウザで開く

```
$ acd ./abc150/abc150_a browse
```

### ソースを編集する

```
$ acd ./abc150/abc150_a edit
```

`$EDITOR` 環境変数で指定されたエディタを使用してソースファイルを開きます。

### テストを実行する

テストを Docker もしくはローカル上で実行することが可能です。
Docker は必須ではありませんが、強く推奨しています。
Docker がインストールされていない場合はローカルでのテスト実行を試みます。

```
$ acd ./abc150/abc150_a test
Running test on Container mode

Case 1: AC

Case 2: AC

Case 3: AC
```

予め、テストの実行環境 (Docker image) を以下のようにしてインストールすることが可能です。

```
$ acd install python3
```

もしテストケースを足したい場合は `testdata.yaml` を編集することで追加することができます。

### コードを提出する

```
$ acd ./abc150/abc150_a submit
```

テストをスキップしたい場合は `--skip-test` オプションを指定してください

```
$ acd ./abc150/abc150_a submit --skip-test
```

## 対応できていないこと

- C++ の boost や Python の scipy, numpy のライブラリ
- ユーザー独自のテンプレートを利用する機能
- いろんな言語の対応

## まとめ

僕が考えた最強の AtCoder のツールを紹介しました。
もしよかったら使っていただけると嬉しいです。
Makefileの基礎

#基本ルール
```:Makefile書式
(ターゲット):(依存ファイル)
    コマンド
```
※コマンドの前のインデントはSPACEではなくTABじゃないとダメ。

例) main.cppをコンパイルしてtestという実行ファイルを作りたい場合

```makefile:Makefile
test:
    g++ -o test main.cpp
```

コンパイルするときは`make ターゲット`で実行する。

```
$ make test
```

なお、ターゲットのファイルが生成済みの場合はコマンドは実行されない。

```
$ make test
make: 'test' は更新済みです.
```

####複数ターゲット
Makefile内に複数のターゲットを記載可能である。

```makefile:Makefile
test:
    g++ -o test main.cpp

test2:
    g++ -o test2 main2.cpp
```
`make test`と打てば`g++ -o test main.cpp`が実行されて、`make test2`と打てば`g++ -o test2 main2.cpp`が実行される。

ただ単に`make`だけ打った場合、最初のターゲットのコマンド(この場合`g++ -o test main.cpp`)が実行される。

####依存ファイル
依存ファイルが指定してあると、`ターゲットのファイルがない`もしくは`ターゲットの更新日時が依存ファイルの更新日時より古かった場合`にコマンドを実行する。

```:ファイル情報
-rw-rw-r-- 1 root root   77  2月 22 12:30 Makefile
-rw-rw-r-- 1 root root   93  2月 22 13:00 main.cpp
-rwxrwxr-x 1 root root 8920  2月 22 13:05 test
```
```makefile:Makefile
test:main.cpp
    g++ -o test main.cpp
```
上記の例だと`testの更新日時 > main.cppの更新日時`なのでこの状態で`make`を実行すると

```
$ make test
make: 'test' は更新済みです.
```
のようになってコマンドは実行されない。
main.cppファイルを更新するか、testファイルを削除すればコマンドが実行される。

####依存ファイルに他のターゲットを指定できる

```makefile:Makefile
test: main.o
	g++ -o test main.o

main.o: main.cpp
	g++ -c main.cpp
```
`make test`を打つと、先に`g++ -c main.cpp`で.oを生成してから`g++ -o test main.o`が実行される。

```
$ make test
g++ -c main.cpp
g++ -o test main.o
```

####疑似ターゲット

```makefile:Makefile
test: main.cpp
    g++ -o test main.cpp

clean:
    rm -f test
```
上記Makefileの場合、cleanというファイルもしくはディレクトリが存在していた場合`make`コマンドを打っても更新済みになってコマンドが実行されなくなってしまう。
それを防ぐために擬似ターゲットというものがある。
ターゲットを擬似ターゲットにするには**.PHONY**で宣言する必要がある。

```makefile:Makefile
test: main.cpp
    g++ -o test main.cpp

.PHONY: clean
clean:
    rm -f test
```
これだと名前がcleanのファイル(ディレクトリ)が存在していても`make clean`のコマンドが実行される。

####コマンドなしターゲット
コマンドなしのターゲットも書くことができる。
複数のターゲットをまとめて行いたい場合に使用する。

```makefile:Makefile
test: main.cpp
    g++ -o test main.cpp

.PHONY: clean
clean:
    rm -f test

rebuild: clean test
```
awsのインフラコストを削減する方法をまとめてみた。

コストを削減する時にどのような手段があるのか？ということをまとめました。

※webサービスの種類により色々コスト削減の方法も変わってくると思います。
ここでは一般的なwebサービスを想定してコスト削減方法を書いています。

## RI(リザーブド・インスタンス)の使用
RIは1年か3年間分のインスタンス使用量を予約して、その分割引料金を受けられるサービスです。
ec2, rds, elsasticacheなど色々なサービスで使えます。

例えば、月に100$かかるインスタンスがあるとして、3年間分のRI(60%割引)を購入すると、このインスタンスを月40$で利用できるという感じです。
https://aws.amazon.com/jp/ec2/pricing/reserved-instances/

使うタイミングとしては、リソースを最適化(Ec2のインスタンスタイプを適切なものにするとか)した後がいいと思います。


## Savings Plans
RIの代わりにSavings Planというのもあります。
こちらはRIと違ってFargateにも適用できるのが重要なポイントだと思います。

RIと同じく1年間か3年間でリソースの使用料を予約することにより、予約分のリソースについて割引を受けられるサービスです。
予約分のリソースを超える分の料金は割引ではなく、オンデマンド料金になります。
https://aws.amazon.com/jp/savingsplans/pricing/

## スポットインスタンス
awsクラウド内の使用されていないEc2インスタンスを使えるサービスです。
使われていないインスタンスはオークション形式で価格を設定することができ、変動する価格より入札した価格が高い場合にインスタンスを使うことができます。

逆に入札した価格が低い場合にはインスタンスが終了、停止、休止状態になってしまいます。
こちらは途中で停止してしまう可能性があるため扱いが難しいですが、割引率がRIやSavings Plansより大きく最大90%の割引になります。
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/using-spot-instances.html

途中でインスタンスが止まってしまう可能性があるので、オートスケール、バッチ処理あたりに使ってやるといいです。

## オートスケール
BtoB向けのwebサービスなら土日に負荷が下がることもあるかと思います。
そのような時はec2、ecs、fargateでオートスケールをすることでコストの削減ができる場合があります。

## Data Transfer
意外と見落としがち。気づくとここら辺の請求が増えてることがあります。

Data Transfer(データ転送)についてはここの記事が詳しいです。
要はインスタンスがインターネットや他のインスタンスにデータを送る際にかかる料金のことですね。
https://www.scutum.jp/information/waf_tech_blog/2011/08/waf-blog-004.html

コストの削減ですが、インスタンス同士でデータの通信が走る場合はできるだけ近いリージョン、AZにインスタンスを配置しましょう。
また、CloudFrontを使用して、Internet Data Transferを減らしていくのがいいのでしょう。

気付きにくいですが、下記の記事の一番下の方にCloudFrontも10TB以上はRIのように使用容量を予約することがで割引を受けられると書いてあります。
CloudFrontが10TB超えてる場合はこちらも検討した方がいいです。
https://aws.amazon.com/jp/blogs/news/aws-data-transfer-price-reductions-up-to-34-japan-and-28-australia/

## その他
直接コストを削減できるわけではないですが、役に立つツールを挙げていきます。

## TrustedAdvisor、Cost Explorerの活用
TrustedAdvisor、Cost Explorerではコストを削減できそうなリソースを教えてくれます。
TrustedAdvisorのコスト最適化はビジネスプラン(100$)にしないと使えないですが、コスト削減をしたいなら有効にした方がいいでしょう。
https://aws.amazon.com/jp/about-aws/whats-new/2019/07/introducing-amazon-ec2-resource-optimization-recommendations/
https://dev.classmethod.jp/cloud/aws/cm-advent-calendar-2015-getting-started-again-aws-td/#service-detail1

### AWS Cost Explorer API
APIを使うことで、slackにbotとして日々の請求を投稿できます。
急に請求が高くなったりとか、ユーザーが少ない日のインフラコスト確認にも使えるので、是非入れてみてはどうでしょうか。
https://dev.classmethod.jp/cloud/aws/notify-slack-aws-billing/

### Billing アラート
請求アラートを作成することで、請求が予算を超えた場合にアラートを鳴らすことができます。
https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/monitor_estimated_charges_with_cloudwatch.html


## 最後に
思いつくままに、コスト削減方法を書いてみましたが、他にもこんなの知っているという方がいたら是非教えていただきたいです。
Laravel 多対多関係で使っている中間テーブルの created_at, updated_at などのカラムで並べ替える

## 前提
`users`と`posts`が`favorites`を中間テーブルとして多対多の関係になっています。

## TL;DR
``` php
public function favorite_posts()
{
    return $this
        ->belongsToMany(Post::class, 'favorites', 'user_id', 'post_id')
        ->withPivot(['created_at', 'updated_at', 'id'])
        ->orderBy('pivot_updated_at', 'desc')
        ->orderBy('pivot_created_at', 'desc')
        ->orderBy('pivot_id', 'desc');
}
```

## 簡単に説明

`withPivot()`を使用することで中間テーブルのカラムを参照できます。
`withPivot()`の引数に`orderby()`に使用したいカラムを配列形式で指定します。
`orderBy()`の第1引数には'pivot_' + カラム名の形式で指定します。

## 確認
favorite_posts()の呼び出し元の前後に以下を追記し、実際に流れているSQLを確認します。

``` php
DB::enableQueryLog();
$user->favorite_posts;
dd(DB::getQueryLog());
```

```
array:1 [
  0 => array:3 [
    "query" => "select `posts`.*, `favorites`.`user_id` as `pivot_user_id`, `favorites`.`post_id` as `pivot_post_id`, `favorites`.`created_at` as `pivot_created_at`, `favorites`.`updated_at` as `pivot_updated_at`, `favorites`.`id` as `pivot_id` from `posts` inner join `favorites` on `posts`.`id` = `favorites`.`post_id` where `favorites`.`user_id` = ? order by `pivot_updated_at` desc, `pivot_created_at` desc, `pivot_id` desc"
    "bindings" => array:1 [
      0 => 1
    ]
    "time" => 0.37
  ]
]
```

中間テーブル`favorites`の`updated_at`、`created_at`、`id`でorderbyされているのが確認できました:clap:

## 参考
https://readouble.com/laravel/5.8/ja/eloquent-relationships.html
https://stackoverflow.com/questions/26551078/how-to-order-by-pivot-table-data-in-laravels-eloquent-orm/50767168
<input type="file">をControlled的に使う

`<input type="file">`はReactから直接Controlledにはできませんが、用途によってはそれに近い使い方ができます。

## フォーム要素の役割

[以前にも書きました](https://qiita.com/jkr_2255/items/c994b4ceebdd127bd710#%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0%E8%A6%81%E7%B4%A0%E3%81%AE4%E3%81%A4%E3%81%AE%E5%BD%B9%E5%89%B2)が、HTMLのフォーム要素にはいくつかの役割があります。

0. ユーザーからの値の入力
0. ~~設定した状態の保存~~（Controlledにする場合は無効化される）
0. 状態の表示
0. フォーム送信時に値を伝える

このうち、「フォーム送信時に値を伝える」機能は、フォーム送信に頼らずAjaxを投げるような場面では不要となります[^1]。

### `<input type="file">`の場合

そして、ファイル入力の場合は「状態の表示」も不要となることが多いです。デフォルトの`<input type="file">`のデザインは、ボタンとファイル名だけのそっけないものでカスタマイズも効かず、「デフォルトの要素を完全に殺す or 透明化させるなどして、自前で描画する」ということもよく行われるような代物です。

そして、ふつうの`type="text"`のような場合であれば、すでに入力された値から再編集させるためにも元の値の表示は必要ですが、`type="file"`では「すでにセットされたファイルから編集する」ような機能は通常存在せず、ファイルがあろうがなかろうが既存のファイルを選択してアップロードさせるだけですので、この意味合いでももとの値をセットさせる意味は薄いです。

ということで、`<input type="file">`の場合は「新規登録の機能さえあればそれでいい」という場面もじゅうぶん考えられます。

## 新規登録専用のものを作ってみる

新規登録以外の機能性が不要な場合、`onChange`のタイミングでフォームをリセットすれば可能そうですが、1つ注意点があります。

```jsx
function FileAppendInput({onChange, ...rest}) {
  // リセット用のカウンター
  const [counter, setCounter] = React.useState(0);
  const handleChange = React.useCallback((e) => {
    onChange(e);
    // キーを変えて表示をリセット
    setCounter(current => current + 1);
  }, []);

  return <input {...rest} type="file" key={counter} onChange={handleChange} />
  
}
```

バグか仕様かは不明なのですが、`value = ''`でリセットすると、Chromeで「`onChange`のタイミングで回収した`FileList`の中身が書き換わる」という現象が発生してしまったので、それを避けるために`key`の書き換えでフォームをリセットしています。

## `files`を書き戻したい場合

フォーム要素へのファイルの再セットが必要な用途の場合、`useEffect`でファイルの変化を監視して、変わったときに`ref`経由で`files`へセットすれば問題なく実行できそうですが、ここにもまた問題点があります。`files`へのセットに必要な`FileList`をどう用意するかです。

[前の投稿にまとめました](https://qiita.com/jkr_2255/items/1c30f7afefe6959506d2)が、`File`から`FileList`を作成することが、iOSなど一部の環境では実現不可能なのです。このような環境で`<input type="file">`への書き戻しが必要な場合、最初にセットされた`FileList`そのものを引き回すより他に手段がなくなってしまいます。

[^1]: ファイルについても、`FormData`に`File`を追加して送信するという形で対応可能です。
::-webkit-scrollbarでデザインされたスクロールバーを実装するのは注意が必要です

# 要はIEやFirefoxでは非対応であり、iPhone Safariでも表示されないですよ、という話です。 

cssのみでデザインされたスクロールバーを実装する際は注意が必要です。
実際のものをブラウザごとに見ていただくのが早いかと思います。

今回実装したスクロールバー
デモページ：https://hojihoji.net/scrollBar/


## ::-webkit-scrollbar で実装

スクロールバーの実装には::-webkit-scrollbarというcssを用いています。
cssのみでデザインされたスクロールバーを実装することができる便利なものです。

参考サイト：https://qiita.com/hibikikudo/items/ee1b913479bceddb654c


## 問題点

JavaScriptいらずで実装できるため、とても便利なものですが、
使用には慎重になった方が良いです。
なぜならIEやFirefoxでは非対応のため、
標準のスクロールバーが表示されてしまうからです。
せっかくデザインにこだわった実装なのに、意味がなくなります。


## ios13で表示されない？

またiPhone Safariで表示されない(標準のものが表示されます)という問題もあります。
::-webkit-scrollbarは、webkit系のブラウザには対応しています。

参考サイト：https://developer.mozilla.org/en-US/docs/Web/CSS/::-webkit-scrollbar#Browser_compatibility

ですのでiPhone Safariでも表示されるはずなのですが、
iOS13から表示されなくなったようです。

参考サイト：
https://qiita.com/kakuta_yu/items/626d7feecf54e39f7127
https://am-yu.net/2019/09/27/ios13-webkit-scrollbar/



## まとめ

デザインされたスクロールバーを実装する場合は、
IEやFirefox、iPhone Safariなどでは標準のものが表示されるという認識で実装する。
SQL 集計関数＋α

#四則演算

＋　足し算

ー　引き算

＊　掛け算

/  割り算

計算の優先順位

[* , /]> [+ , -]

```
SELECT カラム名　+ - * /

FROM テーブル名；
```
#DISTINCT 重複したデータを省く
DISTINCT 区別すると言う意味

DISTINCTを使用すれば重複したデータをのぞいて検索することができる

```
SELECT DISTINCT カラム名

FROM テーブル名；
```

#集計関数

* SUM(カラム名)でそのカラムの合計を求めることができる。

* AVG(カラム名)でそのカラムの平均を求めることができる。

* MAX(カラム名)でそのカラムでの最大値を求めることができる。

* MIN(カラム)でそのカラムでの最小値を求めることができる。

```
SELECT SUM(カラム名)

FROM テーブル名；

条件指定
SELECT SUM(カラム名)

FROM テーブル名

WHERE カラム名　条件；
```
#集計関数　COUNT
COUNT(カラム名)でデータの数を検索するNULLは含まない

COUNT(*)でNULLを含んだ全てのデータの数を習得する

COUNT(DISTINCT カラム名)で重複したデータを除いたデータ数を求めることができる。
Gradleメモ

# この記事の概要

- gradle周りのあれこれを忘れないようにメモ！

# ライブラリの依存関係を確認する

```bash
gradle dependencies
```

# ライブラリの最新バージョンを確認する

```gradle:build.gradle
plugins {
    id 'com.github.ben-manes.versions' version '0.28.0'
}
```

```bash
# 最新バージョンが表示されるだけでbuild.gradleは更新されない
gradle dependencyUpdates
```

# deprecatedを見つける

```bash
# ログに出すだけ
gradle clean build --warning-mode=all

# warningがあったらFAILED
gradle clean build --warning-mode=fail
```

# 注意:詳細は、-Xlint:uncheckedオプションを指定して再コンパイルしてください。

```groovy:build.gradle
tasks.withType(JavaCompile) {
    options.compilerArgs << '-Xlint:unchecked'
}
```

# 注意:詳細は、-Xlint:deprecationオプションを指定して再コンパイルしてください。

※上記と合わせて

```groovy:build.gradle
tasks.withType(JavaCompile) {
    options.compilerArgs << '-Xlint:deprecation'
    options.compilerArgs << '-Xlint:unchecked'
}
```
rails:ページ移行で、（navbarなど）リンク表示を変更する

#いらないリンクを消したい時
ログインページにいるのにログインリンク。新規登録ページにいるのにsignup（新規登録）のリンクはいらないですよね。
僕も今回、学習段階で実装する場面が来たので簡単にご紹介します。

###・新規登録ページ
navbarのリンクはlogin表示のみ。signup（新規登録）リンクは隠す
![スクリーンショット 2020-02-22 19.25.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536974/69d4fa9e-959a-e0c1-8a14-825ceb809642.png)

###・ログインページ
navbarのリンクはsignup（新規登録）表示のみ。loginリンクは隠す
![スクリーンショット 2020-02-22 19.04.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536974/13e2daf6-1958-38a9-d8ca-9fc53ef9d31d.png)


#該当コード
request:ユーザのヘッダー情報や環境変数を取得

```
#新規登録画面におけるnavbarのコード

<% unless request.path.include?("login") %> #"login"とのurlを含まなければtrue
	<li class="nav-item"><%= link_to 'Log in', login_path, class:'nav-link' %></li>
<% end %>


#ログイン画面におけるnavbarのコード

<% unless request.path.include?("users/new") %> #"users/new"とのurlを含まなければtrue
	<li class="nav-item"><%= link_to 'Sign up', new_user_path, class:'nav-link'%></li>
<% end %>
```

```
#"signup"または"users/new"とのurlを含まなければtrue

<% unless request.path.include?("signup") || request.path.include?("users/new")%>
	<li class="nav-item"><%= link_to 'Sign up', new_user_path, class:'nav-link'%></li>
<% end %>
```

#補足
足りない部分や、間違っている箇所、もっときれいにコードを書ける部分があればご指摘いただきたいです。
Rustのfor式と、ベクタとイテレータ

Rustでベクタをforで回しているコードを見ると、iter()を使っているパターンと使っていないパターンの両方を目にする。

```rust
fn main() {
    let v = vec![1, 3, 5];
    for i in v.iter() {
        println!("{:?} ", i);
    }
}
```

```rust
fn main() {
    let v = vec![1, 3, 5];
    for i in &v {
        println!("{:?} ", i);
    }
}
```

これらは両方とも同じように動作する。

# 何か違うの？

結論から言うと、どっちの書き方でも結果は変わらない。

# forって何してるの？

よくあるforの内部動作の理解としては、inに指定されているものにnext()を適用して、Noneになるまでループを継続する、というものだと思う。なので、for式のinに指定できるものはイテレータだと思っていた。
イテレータとは何か？それは、Iteratorトレイトを実装している型である。
しかし、[**ベクタのドキュメント**](https://doc.rust-lang.org/std/vec/struct.Vec.html)を見てみると、ベクタにIteratorは実装されていないことが分かる。その証拠に、ベクタでnext()を使おうとするとコンパイルエラーになる。

```rust
n main() {
    let v = vec![1, 3, 5];
    println!("{:?} ", v.next()); // Error!
}
```

ではなぜforで直接ベクタをループできるのか？
今度は[**forのドキュメント**](https://doc.rust-lang.org/std/keyword.for.html)を見てみよう。ドキュメントによると、inに指定されているものでnext()を直接呼ぶのではなく、実はIntoIteratorトレイトで実装されているinto_iter()により変換してから、next()を呼んでいることが分かる。inに指定できるのは、IteratorではなくIntoIteratorを実装している型、つまりイテレータそのものではなくイテレータに変換可能な型なのである。
ベクタにもIntoIteratorが実装されているため、そのものがイテレータでなくともforでループすることができるというカラクリだ。

よって、forでv.iter()と&vを使った時の違いは、イテレータへの変換をプログラマが明示的に行うか、forが内部的に行うかの違いであり、結果は変わらないということが分かった。めでたしめでたし。

# イテレータと所有権

v.iter()と&vが変わらないということは分かったが、単純にvをそのままinに指定した場合はどうなるだろうか？

```rust
fn main() {
    let v = vec![1, 3, 5];
    for i in v {
        println!("{:?} ", i);
    }
}
```

これも冒頭の2つのコードと全く同じ出力結果になるわけだが、内部的には異なっている。それは、所有権の問題だ。
もう一度vを使おうとするとコンパイルエラーになるので分かる。

```rust
fn main() {
    let v = vec![1, 3, 5];
    for i in v {
        println!("{:?} ", i);
    }
    for i in v { // Error! (value used here after move)
        println!("{:?} ", i);
    }
}
```

1回目のループでvの所有権が移動してしまっているため、2回目のループでは使うことができない。回避するには、値を参照すればいいので、1回目のループか両方のvを&vに変更することで2回目のループも問題なくコンパイルできる。
今回のサンプルでは、println!()が自動的に参照外しをするので出力として違いが分かりにくいが、ループ内の処理が少し複雑になる場合は意識する必要があるだろう。

ここまでの流れで分かるように、v.iter()を使うとイテレータは参照として使われる。では所有して使うようにイテレータを生成するにはどうするか？そういった場合はinto_iter()を使えばいい。つまり、forにvとv.into_iter()を使った時の結果は同じになる。

```rust
fn main() {
    let v = vec![1, 3, 5];
    for i in v {
        println!("{:?} ", i);
    }
}
```
```rust
fn main() {
    let v = vec![1, 3, 5];
    for i in v.into_iter() {
        println!("{:?} ", i);
    }
}
```

所有権の話とは関係ないが、他にはイテレータをミュータブルに使うためのiter_mut()とかもある。


# まとめ

ベクタをforで回すときには、ベクタをそのまま渡しても、iter()とかでイテレータ化して渡しても、結果は変わらないことがわかった。
可読性とかを考慮して好みで使えばいいんじゃないでしょうか。
Android Mali GPU の Vulkan 制約のメモ

https://vulkan.gpuinfo.org/

詳細は Sascha 先生謹製の Vulkan Caps Viewer でわかります.

## Mali GPU(G-72)

* maxVertexInputAttributeOffset : 2047
* maxVertexInputBindingStride: 2048
* maxVertexInputAttributes: 16
* maxVertexInputBindings: 16

=> 頂点あたり, float で 512 個まで. Vertex input に頂点モーフ情報を入れる場合は, 50 個くらい(vertex, normal, tangent で 9 floats/target を想定)が限界.

* maxUniformBufferRange: 65536

Uniform buffer にデータを格納する場合は, 64KB まで. それ以上は SSBO や image buffer を使う.
趣味で使う！Gitのブランチ運用（複数人対応）

# ブランチ運用って、どうすればいいか悩むよね？悩むよね？

趣味で作ったソースコードを、Gitで管理したいなと思った。
（リモート管理便利だなー、バージョニング大事だなーって最近思えるようになってきたから）
しかし、いきなり詰まった。

え、ブランチどうしよ。

業務で使ってるようなガチガチな感じだと趣味で利用するには複雑すぎるし、
シンプルすぎると全然メリットが感じられないし、、
そんな感じで悩みながら、こんな感じがいいかなと個人的に落ち着いたブランチ運用を紹介します。

# 対象

どんな人向けか？ どんな人向けじゃないか？ を簡単に。

* Gitについてある程度知っている方向け
  * （Gitとは、ブランチとは等の説明はありません）
* **趣味**で作ったソースコードをGitで管理したいけど、ブランチの運用方法で迷っている方向け
  * （紹介する運用方法が業務に適用できるレベルかは分かりません）

# 環境

* git version 2.21.0.windows.1

# 作成するブランチ

今回紹介する運用では、以下の3種類のブランチを使用する。

|ブランチ名|用途|
|---|---|---|
|master|完成品用。<br>直接編集・コミットしてはいけない。|
|develop|開発用。<br>featはここから派生する。<br>完成したらmasterにマージする。|
|feat/[編集内容等]|使い捨て用。<br>基本的にはここで編集する。<br>編集が完了したらdevelopにマージする。<br>developにマージしたらfeatは削除する。|

# 運用の流れ

ローカルのfeatブランチでソースコードを編集し、その内容をリモートの
developブランチへマージするまでの流れをコマンドベースでまとめます。
※ 以下、ローカルの資材には（L）を、リモートの資材には（R）を付けて表します。

準備

```
// 1. developブランチ（L）に移動
git checkout develop

// 2. developブランチ（R）の資材をdevelopブランチ（L）に反映
git pull origin develop

// 3. developブランチ（L）から派生してfeatブランチ（L）を作成
git branch feat/sample

// 4. 作成したfeatブランチ（L）に移動
git checkout feat/sample
```

編集～コミット～プッシュ

```
// 5. featブランチ（L）でソースコードを編集し、編集内容をステージング
git add [編集したファイル]

// 6. ステージングした内容をコミット
git commit -m "[コミットメッセージ]"

// 7. featブランチ（L）の資材をリモートへプッシュ（これで自動的にfeatブランチ（R）が作成される）
git push origin feat/sample
```

developブランチ（R）へマージ

```
// 8. ブラウザ上で、featブランチ（R）→ developブランチ（R）のマージリクエスト（とか、プリクエストとか）をする

// 9. ブラウザ上で、マージリクエスト（とか、プリクエストとか）をメンバーに承認してもらう（1人の場合は自分で承認する）
```

後片付け

```
// 10. ブラウザ上で、featブランチ（R）を削除

// 11. developブランチ（L）に移動
git checkout develop

// 12. developブランチ（L）を最新化し、編集内容が反映されているかを確認
git pull origin develop

// 13. featブランチ（L）を削除
git branch --delete feat/sample
```

終わり！

# 感想

個人的にとても満足
開発がはかどる

Gitには他にも便利なコマンドがたくさん（log、diff、stash、、、）
もっとGitを使いこなせるようになりたいなー
eclipseを使わずにTomcatのローカルサーバを立ち上げるには

#目的
・ちょっとしたJavaの学習用に軽量な環境を構築する。
・Tomcatの仕組みを深く理解する。
普段はeclipseからサーバを起動ボタン（トム猫マーク)を押下して起動しているが、Tomcatだけをコマンドから動かすにはどうしたらいいかやってみた。

#本体はTomcatフォルダ内のbinディレクトリにある。

apacheのサイトからダウンロードしたtomcatのファイルを解凍したなかにbinディレクトリがあるので、その中のシェルを実行するだけ。
なのでtomcatフォルダごと動かす分にはどこへ置いても動く。
サーバを起動するスクリプトはstartup.shなので、これを起動すればいい。
ただし、これらのシェルには初め実行権限がないので、
例えばtomcatフォルダのルートをホーム直下の　~/tomcat8とつけたとすると、

```terminal:terminal
chmod -R 755 ~/tomcat8
```

のようにしてオーナーに実行権限を与えておく。
数字は必要に応じて740とか厳しくしてください。

その後

```terminal:terminal
cd ~/tomcat8/bin/
sh startup.sh
```

とするとサーバが起動するので
ブラウザで
http://localhost:8080
して、
![スクリーンショット 2020-02-22 18.57.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201982/ae43043b-a93a-658a-fa17-b0863609d4b2.png)
このページが開いたら成功です。

あとは
~/tomcat8/webapps/examples/index.jsp が
http://localhost:8080/examples/index.jsp のように対応するので
自分のプロジェクトを配置して使用します。

また
~/tomcat8/logs/catalina.out にログが
出力されているので

```terminal:terminal
tail -f ~/tomcat8/logs/catlina.out
```

でeclipseのログ画面のようなものが見えます。
Django httpステータスコードを指定してreturnさせる。

# 解決したいこと
・DjangoでHttpステータスコードを指定してreturnさせる。
・jQueryでAjax通信を行なっており、特定条件で強制的にfailを実行させたい。

# 環境
・Windows10 premium
・VScode
・jQuery

# 結果
Ajaxのコードは省略
仮に適当な文字列が送信され、送信された文字列内に`テスト`という文字が含まれていない場合の処理とする。

```test.py
import HttpResponse

get_post = request.POST["testData"]

if not "テスト" in get_post:
    response = HttpResponse(status=500) # ステータスコードに500を指定
    return response
```

# 参考
[HTTPステータスコード一覧](https://developer.mozilla.org/ja/docs/Web/HTTP/Status)
AirDropは使えるのにContinuityが使えない時の解決策

# 問題

`AirDrop`は使えるのに、`Continuity`が使えない。

`Continuity`とは、iOSとmacOSの連携機能のこと。
詳しくはこちら。
https://support.apple.com/ja-jp/HT204681

AppleIDのログインし直し、再起動、何度試しても解決しない。
ハードウェア的に対応していないわけではない。

……ということがあったので、自分の場合の解決策を載せます。

# 解決策

<font color='red'>Wi-FiとEthernetの接続を**片方ずつにしてみる**。</font>

据置PCだったのでWi-FiとEthernet両方に繋いでいたのですが、Ethernetの方に問題があった模様。
一旦Ethernetを無効にしてWi-Fiのみにしたら、見事Continuityが使えるようになりました。

一度アクティベートされると、繋ぎ直しても問題なさそうで、自分は優先順位をWi-Fi > Ethernetにしていますが、今のところ問題ないです。

<img width="780" alt="スクリーンショット 2020-02-22 18.36.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265811/b52d7258-ada0-8f34-77ac-32bbc3fb21e5.png">

# というだけのお話

実はこれ、Appleサポートの方に教えていただきました。
Continuityは２段階認証やら無線モジュールやらの制約が厳しいので原因が分かりづらいのですが、まさかネットワークの問題だったとは。
どこのサイトにも載っていなかったので、忘備録として記事にしました。

……にしても最近、技術的な記事書いてないなぁ。。。
[Apple] 写経 Start Developing iOS Apps (Swift)

Apple公式ドキュメント [Start Developing iOS Apps (Swift)](https://developer.apple.com/library/archive/referencelibrary/GettingStarted/DevelopiOSAppsSwift/BuildABasicUI.html#//apple_ref/doc/uid/TP40015214-CH5-SW1) の一部を写経します。


# appデリゲートソースファイル

`AppDelegate.swift`には、2つの主要な関数があります。

* `AppDelegate`クラスを定義します。**appデリゲート**は、コンテンツが描画されるウィンドウを作成し、アプリケーション内の状態遷移を受け付けるための場所を提供します。
* アプリケーションの**エントリポイント**と、入力イベントをアプリケーションへ渡す**実行ループ**を作成します。これはファイル先頭にある`UIApplicationMain`属性(`@UIApplicationMain`)によって行われます。
  `UIApplicationMain`属性は、デリゲートクラスとして`AppDelegate`クラスを`UIApplicationMain`へ渡すことと同義です。戻り値の中で、システムは**アプリケーションオブジェクト**を作成します。アプリケーションオブジェクトはアプリケーションのライフサイクルを管理する責任を負います。システムは`AppDelegate`クラスのインスタンスもまた作成しアプリケーションオブジェクトへ割り当てます。最終的にシステムはアプリケーションを起動します。

> わかったこと:
> アプリケーションの実行時に、アプリケーションオブジェクトとappデリゲートが作成される。
> `UIApplicationMain`属性をつけることで、アプリケーションのエントリポイントとappデリゲートであることをシステムに認識させる。

`AppDelegate`クラスはプロパティを一つ含みます。

```swift
var window: UIWindow?
```

このプロパティはアプリケーションのウィンドウへの参照を格納しています。ウィンドウはアプリケーションのビュー階層の根元です。コンテンツはこの中に描画されます。このwindowプロパティはオプショナルであることに注意が必要です。ある時点では値が入っていません(nilです)。

`AppDelegate`クラスは以下のメソッドのスタブ実装も含んでいます。

```swift
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool
func applicationWillResignActive(_ application: UIApplication)
func applicationDidEnterBackground(_ application: UIApplication)
func applicationWillEnterForeground(_ application: UIApplication)
func applicationDidBecomeActive(_ application: UIApplication)
func applicationWillTerminate(_ application: UIApplication)
```

これらのメソッドは、アプリケーションオブジェクトにappデリゲートとやりとりさせるためのものです。

いずれのデリゲートメソッドも既定の振る舞いを持っています。メソッドが空か存在しないと、既定の振る舞いをします。

> わかったこと:
> `AppDelegate`プロトコルを実装することでアプリケーションオブジェクトとやりとりする。
> `AppDelegate`プロトコルの中身を実装しないと、既定の振る舞いをする。
KANAZAWA Civic Tech Contest 2019 参加レポート

#KANAZAWA Civic Tech Contest2019とは
金沢市主催の [コンテスト](https://www4.city.kanazawa.lg.jp/11010/appcontest/) になります。アプリコンテストとかオープンデータコンテストとか、微妙に名前が変わりながらですが、毎年開催されていてだいたい10年ぐらいになるそうです。
![thumb_700_68256_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21408/06b2c180-1879-6eb5-59e0-d2ea38cd1dd6.jpeg)

#応募から最終審査会までの流れ
ざっくりとした流れを個人的な状況もまじえて書いておきます。
ちなみにアプリケーション部門へのエントリーとなります。

1. アイデアを考える
1. 実際に作品を作る
1. 募集期間中に簡単に資料を纏めて応募する
1. 最終選考に選ばれた連絡を受ける
1. 完成度の確認の為に作品の動画やURLなどを金沢市に提供する
1. プレゼン資料を作成する
1. 最終選考でプレゼンする
1. 結果が出る
1. 後日、受賞者コメントをメールで提出



#応募した作品：5374ガジェット
作品の簡単な説明は以下になります。
詳しくは [5374ガジェットを作ってみた](https://qiita.com/yukima77/items/934ce21b5ece4ffdfaee) というタイトルでQiitaに記事を書いてます。

* ゴミの日に光ってお知らせしてくれます
* 光の色でゴミの種類が分かります
* 玄関に設置すれば、出掛けるギリギリに思い出せます
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">ごみを捨てる日を光でお知らせしてくれるデバイスを作ってみました（5374ガジェット） <a href="https://t.co/VDnEb50lZo">pic.twitter.com/VDnEb50lZo</a></p>&mdash; yukima77@NT加賀 (@ykmtd77) <a href="https://twitter.com/ykmtd77/status/1206906606018908161?ref_src=twsrc%5Etfw">December 17, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

#最終審査会の当日
審査会場の入り口。
今年は [金沢21世紀美術館](https://www.kanazawa21.jp/) のレクチャーホールでした（チケットカウンターの後ろ）。
11:30からプレゼンの事前説明があったのですが、10分ぐらいで説明が終わって、あとは開始までに集まって下さいって感じだったので、１時間以上の空き時間。ぶらぶらしながら近くでご飯を食べてきました。
![2020-02-15 11.29.38.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21408/06e498d6-5396-6f4e-4e6a-21846cc0ec01.jpeg)

レクチャーホールの中の様子です。開始時間が近くなってきたので、人がちらほら集まってきてます。プレゼンする人は最前列なのですが、椅子の間隔はちょっと狭かったです。
![2020-02-15 12.52.45.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21408/c3720e9a-4f10-5af1-c1fa-0ee435bfaedd.jpeg)

**アプリケーション部門 金沢市長奨励賞**を頂きました。
![2020-02-15 17.00.29.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21408/5bd4ea35-6c3b-23b2-9770-ffba5108c28a.jpeg)

懇親会は21世紀美術館近くの[茶房山徳](https://shop-kanazawa.jp/shop.php?shp=868&cald=&calm=w&mll=19)。他にもおでんやおにぎりなどたくさん食事を頂きました。
![2020-02-15 17.14.15.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21408/62a12371-b939-4d99-93da-0f1fb48f780b.jpeg)

#最終選考会の動画
公開プレゼンなので、当日の様子もYouTubeにアップされているそうです。来年以降にチャレンジする人がいれば参考まで。
※開始位置は自分のプレゼンの最初にしてあります
https://www.youtube.com/watch?v=so_7CYPLJXo&t=2525s

#感想
　懇親会で審査員や他のファイナリストの方々と話をしてたのですが、アプリケーション部門の最終選考６チームのうち、金沢在住の人は２チームのみ。他は石川県外からのエントリーでした。いろいろ話を聞くと、 [登竜門](https://compe.japandesign.ne.jp/) ってサイトで見つけましたってチームが何チームかありました。僕もこのサイトたまに見たりするのですが、どういった形であれ金沢がどんどん盛り上がっていくのはいいなって思いました。
　個人的には金沢市民として県外の人に負けたくない（自分たちでもちゃんと盛り上げたい！）って思うので、来年このコンテストに出すかどうかはともかくこれからも頑張っていこうと思います。まぁ、今年はグランプリを大阪から参加の高校生に奪われましたが(笑)でも、若い人が頑張って表彰されてって環境があるのは本当にいいと思いました。
　あとは、びっくりしたのが、最終選考会でプレゼンしたほとんどのチームがほぼ実装も終わっていたこと。一応、グランプリに選ばれたら、翌年の６月までには公開することと決まり上なっているのですが、ほぼ完成しているチームがほとんどでした。審査員も今年は特にレベルが高かったと話してましたが、こういったところもあったのかと思います。
nodebrewでnodeをインストール

# homebrewを使ってnodeをインストールする

`brew install nodebrew`

ちゃんと入ったか確認
`nodebrew -v`
セットアップ
`nodebrew setup`
pathを設定しろと言われるのでbash_profileに追加
`export PATH=$HOME/.nodebrew/current/bin:$PATH`

再読み込み
`. ~/.bash_profile`

#nodeをインストール
利用可能な一覧
`ls-remote`
使用可能なバージョンがリストされるので好きなものをインストール(記載時点の最新）
`nodebrew install-binary v13.9.0`
ちゃんとあるか確認
`nodebrew ls`
v13.9.0が表示されればOK

`nodebrew use v13.9.0`
use v13.9.0 が表示される

`node --version`
v13.9.0が表示されればOK
【VS Code】EditorとTerminalのフォーカスをショートカットキー1つで交互に切り替える

## 目的
VS Code で `Editor` と `Terminal` をショートカット1つで交互に切り替えたい！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9814/f634389b-674e-7346-9a2e-19873acf3e12.png)

現状だとクリックで切り替えるか、クイックオープン（`Ctrl/Cmd` + `P`）で `view hoge` と打つなど、`Editor` と `Terminal` にそれぞれ別のコマンドで移動せねばならず、少々ストレスを感じていました。

## 結論
結論としては、下記コードの `"ctrl+j"` の部分を適宜好みのショートカットに変更して `keybindings.json` に追加すれば実現できます！

```json:keybindings.json
[
    {
        "key": "ctrl+j",
        "command": "workbench.action.terminal.focus",
        "when": "!terminalFocus"
    },
    {
        "key": "ctrl+j",
        "command": "workbench.action.focusActiveEditorGroup",
        "when": "terminalFocus"
    }
]
```

## 詳細な方法[^1]
1. コマンドパレットから `Preferences: Open Keyboard Shortcuts (JSON)` を開く
    2. `Ctrl/Cmd` + `Shift` + `P`
    3. `oksj` と入力し、`Preferences: Open Keyboard Shortcuts (JSON)` を選択
4. 上記コードをコピペ（もしMacなら）

これで設定したショートカットキー（上の例だと `Ctrl` + `J`）で `Editor` と `Terminal` が切替可能になりました:tada:

## 解説

以下の2つの設定を同じショートカットキーに割り当てることで1つのショートカットキーによるフォーカスの切り替えを実現しています。

- フォーカスが `Terminal` にあるときは `Editor` にフォーカス
- フォーカスが `Terminal` に無いときは `Terminal` にフォーカス

そのため、フォーカスが`Editor`でも`Terminal`でもない場所にあるとき、例えばサイドパネルにあるときとかもこのショートカットで `Terminal` に飛ぶようになります。

（VS Codeのショートカットキー編集機能が優秀すぎる...）

## 補足

ショートカットキーを`Ctrl` + `J`に割り当てる場合、元の `Toggle Panel` のショートカットがなくなります。
そのためこのショートカットを使う場合は以下のように設定を追加しておくと `Ctrl` + `Shift` + `J` で使えるようになるため、便利かもしれません。

```json:keybindings.json
[
    {
        "key": "ctrl+j",
        "command": "workbench.action.terminal.focus",
        "when": "!terminalFocus"
    },
    {
        "key": "ctrl+j",
        "command": "workbench.action.focusActiveEditorGroup",
        "when": "terminalFocus"
    },
    {
        "key": "ctrl+shift+j",
        "command": "workbench.action.togglePanel"
    },
    {
        "key": "ctrl+j",
        "command": "-workbench.action.togglePanel"
    }
]
```

一番下の設定は元のコマンドを無効化するものです。
なくても問題なく動きますが、わかりやすさのために追加しています。

---
以上になります。
皆さんぜひ快適なVS Codeライフを:balloon:

[^1]: コマンドパレットから`Preferences: Open Keyboard Shortcuts`（JSONと付いていない方）を開く（`Ctrl/Cmd` + `K` → `Ctrl/Cmd` + `S`）ことで、GUI操作で設定することも可能
Automation Anywhere A2019クラウド版の死活監視

Automation Anywhere A2019 はクラウドバージョンが利用できますが、クラウドを使うときに不安になるのが、きちんと常に動いてくれているかどうかです。そこで出てくるのがステータスダッシュボードという概念で、[Amazon Web Services](https://status.aws.amazon.com/)、[Microsoft Azure](https://status.azure.com/ja-jp/status)、[Google Cloud Platform](https://status.cloud.google.com/)などのメジャーな一流クラウドサービスは死活状態が一目でわかるダッシュボードをパブリックに提供しています。

Automation Anywhereでも以下のウェブサイトでクラウドサービスの死活状態をパブリックに公開しているようです。

https://status.automationanywhere.digital/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/4094ce9d-3d42-0675-14f4-baf62b267cec.png)

ここを見ると、いろいろなコンポーネントの状態が個別に公開されていますね。

* Community Edition
* Enterprise Cloud Edition (APAC)
* Enterprise Cloud Edition (EU)
* Enterprise Cloud Edition (LATAM)
* Enterprise Cloud Edition (US)
* Free Trial
* License Server
* RPA Bots for Excel Frontend Server
* RPA Bots for Excel Integration Server

なにやら見慣れない名前のサーバーもありますが...

過去の履歴も公開されています。2019/11/17まで遡れるようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/243688d5-f478-af39-fb89-bf7117d17a1a.png)

今後のメンテナンス情報や過去のインシデント情報も出ています。メールやRSSフィードでの購読ボタンもあるようなので、トラブルが疑われる場合はここを見るのが便利です！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/e324f6b2-9f53-8018-68c9-c014d8218b09.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/2d646b2f-3273-20a7-f193-6c327d09d952.png)
Django アップロードファイル読み込み時の権限エラー

# 解決したいこと
・Djangoでアップロードしたファイルの読み込みを行い、何らかの操作を行うという処理をcronで回そうとした際、ファイルが読めないとパーミッションエラーが発生。
・ファイルアップロード時の権限は「600」

# 試したこと
前提としてchmodを行う際、管理者権限が必要な環境です。

```os.py
import os
os.system('sudo shmod 644 path')
```

`python os.py` -> 権限切り替わる。
cronで実行 -> 権限切り替わらず。

```subprocess.py
import subprocess
subprocess.call('sudo shmod 644 path')
```

`python subprocess.py` -> 権限切り替わる。
cronで実行 -> 権限切り替わらず。

# 解決策
settings.pyに「FILE_UPLOAD_PERMISSIONS = 0o644」と記載しておくことでアップロードしたファイルの権限が「644」になった。
セキュリティ考慮してデフォルト「600」にしているっぽいですが、時間かかった。。

cron回したときにsubprocessやos.systemで切り替わらなかった理由は分かってないです。
simd sortで、bubble sort と quadsort で比較してみると？

# bubble sortと比較してみる。

基本的に今回比較したいのは「条件分岐を使わずに、simd でソートできること」なので、quick sortとかのアルゴリズムは適応対象外にしかならない（仕方がない）。

ということで、バブルソートベースとも比較してみる。

バブルソートの場合、交換回数は28回。
１回の交換が、MAXとMINで処理する必要があるので、
56 instructionが必要になる。

quadsortを使えば、ちょっとだけ命令数を少なくできるかも？

あと、バブルソートの場合、「直前に入れ替えた要素を対象」にすると、スループットとレイテンシーで性能が十分にでないかもしれない。

#追記
違う違う。2要素交換に必要なのは、3インストラクションですね……

だから、28回✕3 = 84 instruction ……

quadsortっぽい何かで組んだ方が早い？


``` original
        #define SWAP2(valA,valB) \
        { \
                tmp0 = valA \
                valA = _mm256_min_epi32 ( valA, valB ); \
                valB = _mm256_max_epi32 ( tmp0, valB ); \
        }

SWAP2(val0,val1); // step.1-1
SWAP2(val1,val2); // step.1-2
SWAP2(val2,val3); // step.1-3
SWAP2(val3,val4); // step.1-4
SWAP2(val4,val5); // step.1-5
SWAP2(val5,val6); // step.1-6
SWAP2(val6,val7); // step.1-7 val7 is fixed.

SWAP2(val0,val1); // step.2-1
SWAP2(val1,val2); // step.2-2
SWAP2(val2,val3); // step.2-3
SWAP2(val3,val4); // step.2-4
SWAP2(val4,val5); // step.2-5
SWAP2(val5,val6); // step.2-6 val6 is fixed.

SWAP2(val0,val1); // step.3-1
SWAP2(val1,val2); // step.3-2
SWAP2(val2,val3); // step.3-3
SWAP2(val3,val4); // step.3-4
SWAP2(val4,val5); // step.3-5 val5 is fixed.

SWAP2(val0,val1); // step.4-1
SWAP2(val1,val2); // step.4-2
SWAP2(val2,val3); // step.4-3
SWAP2(val3,val4); // step.4-4 val4 is fixed.

SWAP2(val0,val1); // step.5-1
SWAP2(val1,val2); // step.5-2
SWAP2(val2,val3); // step.5-3 val3 is fixed.

SWAP2(val0,val1); // step.6-1
SWAP2(val1,val2); // step.6-2 val2 is fixed.

SWAP2(val0,val1); // step.7-1 val0 and val1 are fixed.

```