OmniAICreator/Qiita-1.07M huggingface dataset:
iOS13のPageSheetでdismissを呼んだ時にもpresentationControllerDidDismissを呼ぶ話

# はじめに
こんにちは、fummicc1です。今回は、iOS13から変更された`modalPresentationStyle`に`.pageSheet`を設定した場合の挙動を説明した後に、実際にどういうコードを書くのがいいのかを紹介します。

# iOS13のページシート
iOS13からiPhoneでページシートの挙動が大きく変わりました。そして、**デフォルトでページシートで遷移される**ようになりました。
今まで（iOS13以前）は`.fullScreen`と同じ挙動だったのですが、今回から被さるようなUIになりました。（画像参照)
![Simulator Screen Shot - iPhone 11 Pro Max - 2019-09-29 at 17.01.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300444/e77ea448-9255-c302-8500-222c3b5536e5.png)


まず、これによって以下のようなAPIが呼ばれなくなりました。

- viewWillAppear
- viewWillDisappear

これは既存のアプリケーションを破壊する可能性があるので至急対応しているところが多いと思います。
例えば、model遷移先の画面で何か日記やToDoを作成し、saveボタンを押して保存処理をし画面をdismissします。
その場合、従来は`viewWillAppear`で`collectionView`や`tableView`などのUIの更新処理をかけている場合多いです。

しかし、pageSheetによる遷移では**dismissしても`viewWillAppear`は呼ばれない**ので、日記やToDoを保存した後の状態がUIに反映されません。今回は、これに対応する方法を紹介します。

# 対応策
## 1. `.fullScreen`にする。
`modalPresentationStyle`に`.pageSheet`ではなく、`.fullScreen`を指定します。そうすれば既存の手法で話を進められます。

## 2. `.pageSheet`のままで実装する。
[presentationControllerDidDismiss](https://developer.apple.com/documentation/uikit/uiadaptivepresentationcontrollerdelegate/3229889-presentationcontrollerdiddismiss)というメソッドがiOS13から追加されているので、それを使用します。

このメソッドは遷移先の画面のインスタンスで`presentationController?.delegate = self`を実装します。このとき、`self(遷移元の画面)`は`UIAdaptivePresentationControllerDelegate`に準拠している必要があります。

また、この`UIAdaptivePresentationControllerDelegate`は`presentationControllerDidDismiss`を所持しているので以下のように実装します。

```RootViewController.swift
func transitionToModalViewController() {
    let modalViewController = storyboard?.instantiateViewController(identifier: "ModalViewController") as! ModalViewController
    modalViewController.presentationController?.delegate = self // ここがポイント
    present(modalViewController, animated: true, completion: nil)
}
```

```RootViewController.swift
extension RootViewController: UIAdaptivePresentationControllerDelegate {
    // このメソッドを実装
    func presentationControllerDidDismiss(_ presentationController: UIPresentationController) {
        // Modal画面から戻った際の画面の更新処理を行う。 (collectionView.reloadDataなど。)
    }
}
```


これで、ユーザーがModal画面で下からスワイプをしたときにも更新処理ができます。

### dismissでModalを閉じると`presentationControllerDidDismiss`が呼ばれない。
これの対処法は、ベストプラクティスではないような気もしますが、遷移作の画面で`dismiss`をオーバーライドし、その中で`presentationController.delegate?.presentationControllerDidDismiss?(presentationController)`を呼びます。


```ModalViewController.swift
extension ModalViewController {   
    override func dismiss(animated flag: Bool, completion: (() -> Void)? = nil) {
        super.dismiss(animated: flag, completion: completion)
        guard let presentationController = presentationController else {
            return
        }
        presentationController.delegate?.presentationControllerDidDismiss?(presentationController)
    }
}
```

これでdismissで画面を戻ってもUIの更新処理が呼ばれます。

# 最後に
iOS13の変化として、ダークモード対応やSign in with Apple対応などでも大変なのですが、Modalも結構変化して対応するのにコストがかかるなと感じていて、今回の記事も少ないリソースの中での解決策で個人的には満足した実装ではないので、今後APIを改善するなり、もっといい方法があるといいなと思いっています。
修正・意見があればコメントお待ちしています。参考になれば幸いです！
Rails 6 に Bootstrap3 導入

## 1. yarn で Bootstrap と jquery を導入する

```sh
$ yarn add bootstrap-sass jquery
```

## 2. app/config/webpack/environment.js に jquery が使えるように設定追加

```ruby:app/config/webpack/environment.js
const { environment } = require('@rails/webpacker')

const webpack = require('webpack')
environment.plugins.append('Provide',
  new webpack.ProvidePlugin({
    $: 'jquery',
    jQuery: 'jquery'
  })
)

module.exports = environment
```

### 3. app/javascript/packs/application.js に 以下追記

```js:app/javascript/packs/application.js
import '../javascripts/application.js'
import '../stylesheets/application.scss'
```

### 4. app/javascript/stylesheets/application.scss に以下追記

```scss:app/javascript/stylesheets/application.scss
// bootstrap-sass 内部で 相対パスを解決できないため、パス変数を差し替え
$icon-font-path: "~bootstrap-sass/assets/fonts/bootstrap/";

@import "~bootstrap-sass/assets/stylesheets/_bootstrap.scss"
```

### 5. app/javascript/javascripts/application.js に以下追記

```js:app/javascript/javascripts/application.js
import 'bootstrap-sass';
```
Haskell IDE Engineのインストールに苦労した (Windows 10)

Haskell IDE EngineをWindows 10にインストールする際に、エラーメッセージも出さずにコンパイルが止まる事象が起きてドハマリしたので日本語文献を残しておきます。
HIEに限らず、`terminateProcess: permission denied (Permission denied)`が出て困っている人のお役に立てると思います。

# 環境
- Windows 10 + cmd.exe (PowerShellでも出るとのこと）
- ghc-8.6.5
- stack-2.1.3
- hie-0.12.0.0

# 起きたこと

```powershell
> git clone https://github.com/haskell/haskell-ide-engine --recurse-submodules
> cd haskell-ide-engine
> stack ./install.hs hie-8.6.5
(中略)
[4 of 9] Compiling Network.Socket
(中略)
Network\Socket.hsc:1844:1: warning: [-Wunsupported-calling-conventions]
(ここでフリーズして先に進まない)
```
後述するように、実はここで`terminateProcess: permission denied (Permission denied)`が出て停止している。

# 根本原因
cmd.exeが使っている文字コードがUTF-8ではない。

# 対策
```powershell
> chcp 65001
``` 
を実行して文字コードをUTF-8に変更してから`stack ./install.hs hie-8.6.5`を実行する。

# 付帯情報
ちなみに、`Registering library for ...`に恐ろしく時間がかかって現実的な時間で終わらない事象も起きていたが、`chcp 65001`後には起きなくなった。

# 続き
https://qiita.com/yutasth/items/03e2cc6148f2406d0d8a

# 原因詳細
最も詳しくは、[苦闘の跡](https://github.com/haskell/haskell-ide-engine/issues/1393)を参照。
原因となっているnetwork-2.8.0.1のみのインストールを試みると、

```powershell
> stack install network-2.8.0.1
(中略)
[4 of 9] Compiling Network.Socket
(中略)
Network\Socket.hsc:1844:1: warning: [-Wunsupported-calling-conventions]
terminateProcess: permission denied (Permission denied)
```
と出る。`invalid argument (invalid character)`が出てくれれば文字コードが原因であることにすぐたどり着いて`chcp 65001`を実行して解決できたのだが、そうはならなかったんだ、ロック。

`invalid argument (invalid character)`ではなく`permission denied (Permission denied)`が出た理由は、stack-2.1.3はprocess-1.6.3.0に依存しているが、process-1.6.3.0には[Windowsの特定のエラーを無視するバグがある](https://github.com/haskell/process/issues/110)ためのようだ。process-1.6.5.0で修正されたようなので、stackのバージョンが上がっていけばこの記事の必要性はなくなるだろう。stackのissueにも本事象とその対策を書き込んでおいた。

# 先行文献
https://qiita.com/oze/items/6313604c37844c1f2dcd
【論文紹介】Mask-Predict: Parallel Decoding of Conditional Masked Language Models

Mask-Predict: Parallel Decoding of Conditional Masked Language Models
Facebook AI Research
https://arxiv.org/pdf/1904.09324.pdf
EMNLP2019
（実装）: https://github.com/facebookresearch/Mask-Predict

##概要
多くの機械翻訳モデルは時系列に沿って，単語を生成するautoregressiveなモデルである．
例，Transformer， RNN(lstm)ベースのencoder-decoderモデルなど．
提案手法では， non-autoregressiveに単語を生成するモデルを提案．　
つまり，時系列順に単語をデコードするのではない．
ターゲット文の一部をMASKすることで，デコード時，MASK単語を予測するタスクとして， 確率スコアが低いn個の単語をイテレーション数（T）だけ，予測する（デコードする）モデル


##問題点
文の時系列順に単語を生成しないので，繰り返し(“completed completed”のような)などの非文法的な文が生成されてしまう．

これはnon-autoregressiveな生成モデルでは，典型的な
multi-modalityの問題である[Gu et al.,2018]．


##デコード時の単語のMASK方法
MASKする単語の個数は，
n = N * T-t/T
で決定され，

例のように， N=12,T=3とすると，(論文にこうは書いていないが，恐らく解釈としてはこのようなはず)
t=1(1回目のイテレーション時)は
12*0.66 = 7.92 ≒ 8
t=2(2回目のイテレーション時)は
12*0.33 = 3.96 ≒ 4
個の単語がMASKされる，（その後，その単語がPREDICTされる）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239544/12f9e3e9-3737-0fcf-b75a-1084b137c483.png)

MASKされる単語は確率スコアが低い順に選択される．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239544/5fd30443-9ae1-644d-b907-c76b9342406c.png)

確率値Piが低い下からn個の単語がMASKされる．

#モデル
ベースはTransformer
Transformerのデコーダから，self-attention機構を除いた．
言い換えると，つまり，デコーダーは双方向である．（bi-directional）
左からの情報も右からの情報も単語の予測に使うことができるので．


##比較実験
Baseline: Transformer
SMALL/BASE CMLM with Mask-Predict(提案手法)
NAT w/ Fertility (Gu et al., 2018)
CTC Loss (Libovicky and Helcl ´ , 2018)
Iterative Refinement (Lee et al., 2018)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239544/80b29815-b227-0205-f782-08e06673c20d.png)



##結論
他のnonautoregressiveのモデルよりも高精度に，
autoregressiveのモデルより，ずっと短い時間で，デコードが完了できた

その他問題点

- ターゲット文の長さの問題
- 知識の蒸留に対する依存を考慮できていない
などが挙げられる．．

その他貢献としては，

- 広い意味で， マスク言語モデルが， テキストの意味獲得だけでなく， テキスト生成タスクにおいても有用であることを示すことができた．

##次読む論文
Jiatao Gu, James Bradbury, Caiming Xiong, Victor OK
Li, and Richard Socher. 2018. Non-autoregressive
neural machine translation. In ICLR.

multi-modality problem とはなにか
【Vuetify】<v-app-bar>を<v-content>にかぶらないようにする

## はじめに
\<v-app-bar>において特に属性を指定せずに\<v-content>を用いると以下のようにページをロードした初期画面において\<v-content>領域が\<v-app-bar>領域を隠してしまうので、解決方法を紹介する。
<img width="358" alt="スクリーンショット 2019-09-29 17.04.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431401/49fab09b-c65d-ad35-fb17-0b2c1486927f.png">

## 解決方法
app属性を指定する。

```vue:
<template>
  <v-app>
    <v-app-bar app>
      ...
    </v-app-bar>
...
</template>
```


## おわりに
[こちら](https://vuetifyjs.com/ja/components/app-bars)（公式）を参考。
最近Vuetifyを触り始めたのだが、公式サイトの情報のわかりやすさに感心した。ただ各コンポーネントの属性値などの日本語紹介は公式サイトではまだ一部しか書かれておらず本題の方法が未記入だったため、こちらに投稿する。
FlameGraphでRustプログラムの性能解析を行う

[ferrous-systems/flamegraph](https://github.com/ferrous-systems/flamegraph)を使ってRustプログラムの性能評価を行っていきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30426/ea8b3bee-4d06-f13d-fa0d-be7cdfad188e.png)
（[eom/example/bench](https://github.com/termoshtt/eom/blob/master/examples/bench.rs)のベンチマーク結果です）

[FlamgeGraph](https://github.com/brendangregg/FlameGraph)と呼ばれる関数の呼び出しと個々の関数での実行時間を一度に表示したものです。

FlameGraphに関する説明は以下が詳しいです

- [Flame Graphs](http://www.brendangregg.com/flamegraphs.html)
    - [SlideShare](https://www.slideshare.net/brendangregg/blazing-performance-with-flame-graphs)
- [perf + Flame Graphs で Linux カーネル内のボトルネックを特定する](https://yohei-a.hatenablog.jp/entry/20150706/1436208007)

Install
--------

```
cargo install flamegraph
```

これで`flamegraph`, `cargo-flamegraph`がインストールされます。flamegraphは背後でperfを外部プロセスとして実行するのでperfを入れておく必要があります。

### ubuntu/debian

`linux-tools`をインストールします。これはカーネルによって適切なものが変わるので注意してください。

```
sudo apt install linux-tools
```

とすると候補が出るのでその中から適切なものを選んでください。私の場合はGCP上の仮想マシンだったので`linux-tools-gcp`をインストールしました。

### RedHat/CentOS/Fedora

```
sudo yum install perf
```

### Windows
未調査です…

Usage
-------

```
cargo flamegraph
```

で`cargo run --release`の結果をプロファイルしてくれて結果を `flamegraph.svg` を生成してくれます。`-o another_name.svg` のようにすると別名で保存してくれます。また背後でperfを実行するので`perf.data`も作られますが、自分で触る必要はありません。

```toml:Cargo.toml
[profile.release]
debug = true
```

のようにすると関数の情報をある程度残したまま最適化するので結果が見やすくなります。

How to Read
------------

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30426/c8567a54-d91c-f48b-3289-4afbc1f73a4f.png)
[Blazing Performance with Flame Graphs](https://www.slideshare.net/brendangregg/blazing-performance-with-flame-graphs)より引用

- 関数の呼び出しのスタックに応じて関数を縦に積み上げて、関数での消費時間に応じて横幅を定めます
- `a()`の実行の中で、実際にどの関数で時間を消費しているかは一番上の端を見ればいい（上図の太い部分）。上図では`f()`, `d()`, `e()`, `h()`の順に時間を消費している。
Travis CI（bionic）でGitHubに公開鍵認証でプッシュする

# はじめに

[Travis-CI でコミットして GitHub にプッシュする - 公開鍵認証を利用してみる](https://blog.eiel.info/blog/2014/02/18/github-push-from-travis/)は大変すばらしい記事であり、これを利用して筆者も長くTravis CIで自動生成したPDFを`gh-pages`ブランチへプッシュするといったスクリプトを運用してきた。ところが筆者がTravis CIのLinuxディストリビューションをUbuntu 18.04 LTS（bionic）へアップデートしたところ、この方法が動かなくなってしまった。これは18.04からOpenSSLのバージョンが1.1系となり、オプションが変ってしまったからである。
この記事では、OpenSSL 1.1系で利用できるように元記事の内容を（雑に）翻訳する。

# OpenSSL 1.1系のインストール

macOSを利用している場合は次のコマンドで入手できる。

```console
$ brew install openssl@1.1
```

環境変数`PATH`を次のように設定する。

```console
$ echo 'export PATH="/usr/local/opt/openssl/bin:$PATH"' >> ~/.zshrc
```

このような結果が得られれば成功である。

```console
$ openssl version
OpenSSL 1.1.1d  10 Sep 2019
```

# 秘密鍵の暗号化

次のような手順で行う。

1. 秘密鍵の生成

    ```console
$ ssh-keygen -f deploy_key
    ```
2. 秘密鍵を暗号化用のパスワード[^pass]を生成

    ```console
$ password=`cat /dev/urandom | head -c 10000 | openssl sha1 | cut -d' ' -f 2`
    ```
    - ここも`openssl sha1`の挙動が変っているため若干のコマンド修正が必要であることに注意せよ
3. 秘密鍵の暗号化

    ```console
$ openssl aes-256-cbc -pass "pass:$password" -pbkdf2 -in deploy_key -out deploy_key.enc -a
    ```
    - まず`-k`オプションではなく`-pass`オプションとした。これは`pbkdf2`というのがパスワードベース暗号化（PBE）であり、ストレッチングやソルト付与などいろいろなことをやったうえで共通鍵を内部で生成して暗号化する
    - ストレッチング回数などは規格があり、今回は`pbkdf2`を採用した


[^pass]: 元記事では文章において共通鍵としているが環境変数名は`password`であり、パスワードと共通鍵を区別してはいないと思われる。この記事ではパスワードを元に共通鍵を作成する方法を新たに採用するため、利用者は意識する必要はないが一応この2つの言葉を区別して利用する。

このようにして、あとは元記事にあるようにGitに追加したりGitHubに設定すればよい。

# 暗号化された秘密鍵の復号

次のコマンドを利用すればよい。

```console
$ openssl aes-256-cbc -pass "pass:$secret" -pbkdf2 -in .travis/deploy_key.enc -d -a -out deploy.key
```

# まとめ

このようにすることでOpenSSL 1.1系でも利用できる。
洋書多読コミュニティサイト「多読マラソン」をリリースしました！

![tadoku.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311529/1fcfb123-6449-b5ad-a650-729dfe3dc73e.gif)

## はじめに

以前、こういうWebサイトをリリースしました。（リンクは外しています）
[多読マラソン](https://www.tadoku.site/)

サイト名は、**多読マラソン**です。ネーミングセンスとかは突っ込まないでいただけると嬉しいですね！

## 制作経緯

僕は大学受験時代に洋書を読むことにハマり、そこから受験勉強そっちのけで英語の本を読みまくってきました。いわゆる多読というやつですね。洋書をとにかくたくさん読むと。

一時期、TOEICの勉強をやっていたこともあるんですが、あまりにつまらなすぎて１ヶ月立たずに挫折してしまいました。そんな僕ですが、この**洋書多読**にはハマりました。これがとにかく楽しい。

**ちなみに、洋書多読にハマったおかげで、ぶっつけ本番で受けたTOEICでも9００点突破できたので、本当、多読のおかげで人生変わったと言っても過言ではないです。僕の場合は。**

で、この多読界隈では、読んだ洋書の量を「語数」で表すんですね。１００万語突破とか、５００万語突破とか。２００〜３００ページの洋書がだいたい50000語なので、１００万語突破だと、普通の洋書を２０冊読んだ計算になります。

多読実践者の間では、**１００万語読むことがベンチマーク**とされていまして、皆この数字を目標にがんばります。そして、この語数を記録するために、いろいろなサービスがあるわけなのですが、僕も例に漏れず、あるwebサイトを使用していました。

ところがこのサイト、ところどころ使いづらいんですね。あまりメンテナンスもされてなさそうで、正直なんだかなーという思いを感じていました。これが受験生の頃ですね。

それから数年が経ち、プログラミングを初めて１年半にもなりまして、あるときこう思ったわけなんですね。**「ぶっちゃけ今の俺なら、もっと良いサイト作れるんじゃねーの？」**と。

## 制作風景

制作期間は約3週間。2019年9月10日から制作を開始して、この記事を書いているのが9月29日。サイトの規模的に、１０日ぐらいで完成させたかったんですが、インターンをしていたので思うように時間が取れなかったことと、サービスが完成に近づくにつれて、ここ直したい！、という箇所が増えて、**３歩進んで３歩下がる的な状況に陥ってしまい、なかなか遠かったです。**

ですが！
ひとまずMVP的なものにはなったので、一旦リリースしてみようか、って感じです。

## 仕様

**Amazon Product Advertising API**
を使ったサービスとなっています。これがなきゃ成立しません。

## 使用技術

- Amazon Product Advertising API
- Ruby on Rails
- HTML(Slim), CSS(Sass)
- DB
    - Postgresql
- CircleCI
- Docker
- Heroku（独自ドメイン）

## 感想
ちょっとRailsに飽きてきた感がありましたw

中小規模のサービスをちゃちゃっと開発するのにはRails最強だと思うんですが、あまりに便利すぎて、なんか堕落してるような気分になるのが玉に瑕ですかねw
## 参考文献・サイト・ライブラリ
- 参考文献・サイト
    - [Amazon Product Advertising API](https://docs.aws.amazon.com/AWSECommerceService/latest/DG/Welcome.html)
Linux基礎(ディスククォータの管理)

#ハードリミットとソフトリミット
Linuxでは、<strong>ディスククォータ</strong>の機能により、ユーザーまたはグループごとに使用可能なディスク容量を制限できる。この制限はディスク容量の<strong>サイズ</strong>だけでなく、<strong>inode</strong>数でも指定することできる。ディスククォータでは以下の5つのパラメータを使用して、使用できるディスク容量の制限を設定する。

|設定項目|説明|
|---|---|
|ハードリミット(ユーザーごと)|1ユーザが利用できる最大のディスク容量<br>ハードリミットを越えるとそれ以上は書き込みができない。|
|ソフトリミット(ユーザーごと)|容量制限の警告が発声されるタイミング。<br>ソフトリミットを越えると警告が発せられるが、ディスクへの書き込みができなくなる。但しソフトリミットを超えたまま猶予期間をすぎると、書き込みができなくなる|
|ハードリミット(グループごと)|グループが利用できる最大のディスク容量<br>ハードリミットを越えると、そのグループに属する全てのユーザは、それ以上書き込みできない。|
|ソフトリミット(グループごと)|容量制限の警告が発生されるタイミング。ソフトリミットを越えると警告が発せられるが、ディスクへの書き込みは可能。但しソフトリミットを超えたまま猶予期間を過ぎると、書き込みができなくなる。|
|猶予期間|ソフトリミットを越えると猶予期間(デフォルトで7日間)に入る。猶予期間が過ぎるまでにソフトリミット以下にファイルなどを削除しなければ、現在のソフトリミットのステータスが、ハードリミットとしてみなされてしまう。|

#ディスククォータの設定内容確認
quota [-u] [オプション] ユーザ名

|オプション|説明|
|---|---|
|-u|指定したユーザーに設定されたディスククォータの状況を表示(デフォルト)|
|-g|指定したグループに設定されたディスククォータの状況を表示|
|-v|詳細情報の表示|

```shell
# ユーザー"student1"のディスククォータ状況の表示
$ quota sudent1
```

#ディスククォータの管理-設定手順
①/etc/fstab ファイルにマウントオプション設定
②マウントオプションの変更の適用のため、ファイルシステムのアンマウントとマウントを実行
③ユーザごとのクォータ情報が記憶されるaquota.userを作成し、rootが読み書き可能なアクセス権限を設定
④データベースの初期化
⑤クォータの有効化
⑥ユーザごとのクォータの設定

##/etc/fstab ファイルにマウントオプション設定

```shell
# /etc/fstabに /dev/sda5の/homeに、ユーザごとのディスククォータを設定
/dev/sda5    /home    ext3    defaults.usrquota 1 2
```
##マウントオプションの変更の適用のため、ファイルシステムのアンマウントとマウントを実行

```shell
$ unmount /home

$ mount /home
```

##ユーザごとのクォータ情報が記憶されるaquota.userを作成し、rootが読み書き可能なアクセス権限を設定

```shell
$ touch /home/aquota.user
$ chmod 600 /home/aquota.user
```

##データベースの初期化
quotacheck [オプション] ファイルシステム名

|オプション|説明|
|---|---|
|-a|/etc/fatabファイルに従い、クォータをチェック|
|-u ユーザ名|指定したユーザの情報のみ編集|
|-g グループ名|指定したグループの情報のみ編集|

```shell
$ qutacheck /home
```

##クォータの有効化

quotaon [オプション] ファイルシステム名

|オプション|説明|
|---|---|
|-a|/etc/fatabファイルに従い、クォータを有効化|
|-u ユーザ名|ユーザごとのディスククォータの有効化|
|-g グループ名|グループごとのディスククォータの有効化|

```shell
$ qutacheck /home
```

##ユーザごとのクォータの設定

edquota [オプション] ユーザ名

|オプション|説明|
|---|---|
|-t|ファイルシステムごとのソフトリミットの猶予期間を設定|
|-u ユーザ名|ユーザの設定(デフォルト)|
|-g グループ名|グループごとのディスククォータの有効化|

```shell
$ edquota student1
```
[Android] ダークテーマの対応方法

## はじめに
Android 10から本格サポートされたダークテーマ（ダークモード）のアプリ側の対応方法について説明します。

## Resource作成

### res/values/styles.xml
まず初めに、通常のテーマカスタマイズでも利用するstyles.xmlを更新し、ダークモードON/OFF時に切り替えたいカラーを定義しておきます。

```
<resources>
    <style name="AppTheme" parent="Theme.MaterialComponents.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
        <item name="android:colorBackground">@color/colorBackground</item>
        <item name="android:textColor">@color/textColor</item>
        <item name="android:textColorPrimary">@color/textColorPrimary</item>
        <item name="android:textColorSecondary">@color/textColorSecondary</item>
    </style>
</resources>
```

### colors.xmlの作成
システム設定でダークモード有効時に参照されるカラー定義をres/values-night/colors.xmlに、通常時のカラーをres/values/colors.xmlにそれぞれ記載しておきます。

#### 例) res/values-night/colors.xml

```
<resources>
    <color name="colorPrimary">#212121</color>
    <color name="colorPrimaryDark">#212121</color>
    <color name="colorAccent">#80cbc4</color>
    <color name="colorTransparent">#00000000</color>
    <color name="textColor">#FFFFFF</color>
    <color name="textColorPrimary">#FFFFFF</color>
    <color name="textColorSecondary">#808080</color>
    <color name="colorBackground">#313131</color>
    <color name="colorCardBackground">@color/colorPrimary</color>
    <color name="colorBackgroundBottomAppBar">#353535</color>
</resources>
```

ここまで対応すれば、システム設定に連動して、コードは一切書かなくても表示が切り替わります。

## アプリ内の設定で動的に切り替えたい場合
アプリ全体に適用するにはAppCompatDelegate.setDefaultNightModeを利用します。


#### 常にダークテーマで表示
```
AppCompatDelegate.setDefaultNightMode(MODE_NIGHT_YES); // アプリ全体に適用
AppCompatDelegate.setLocalNightMode(MODE_NIGHT_YES);   // 特定のAcitivityのみ適用
```

#### 常にダークテーマOFF（通常表示）
```
AppCompatDelegate.setDefaultNightMode(MODE_NIGHT_NO); // アプリ全体に適用
AppCompatDelegate.setLocalNightMode(MODE_NIGHT_NO);  // 特定のAcitivityのみ適用
```

#### システム設定に連動する（特に指定しない場合はこちらがデフォルトです）
```
AppCompatDelegate.setDefaultNightMode(MODE_NIGHT_FOLLOW_SYSTEM); // アプリ全体に適用
AppCompatDelegate.setLocalNightMode(MODE_NIGHT_FOLLOW_SYSTEM);   // 特定のAcitivityのみ適用
```
AWS ロードバランサー運用のポイント

#はじめに
AWSのロードバランサーはマネージドサービスですが、AWSに任せっきりでいいの？という方向けに
運用する際に注意すべきこと、監視すべき項目をまとめました。

#目次
1.cloudwatchで監視すべき項目
2.スパイクトラフィックがある場合の対応
3.トラブルシューティング


#1.cloudwatchで監視すべき項目
特に見るべき項目をピックアップしています。

|項目|説明|
|:--|:--|
|HTTPCode_ELB_5XX|LBが生成したHTTPステータスが5XXの数。インスタンスまで転送されずにエラーとなっているため、発生しているエラーを調査する必要があります。|
|SurgeQueueLength|healthyなインスタンスへの転送がPending中のリクエスト数。キューの最大長は1024|
|SpillOverCount|前述のSurgeQueueがフルのためリクエスト転送に失敗したリクエスト数|


#2.スパイクトラフィックがある場合の対応
AWSのLBはトラフィック量に合わせて徐々にスケールします。
そのため、スパイク的なトラフィックが発生した場合(目安10倍のトラフィック)エラーとなります。
対策としてAWS-Supportへ暖気申請(Pre-warming)を行います。

#3.トラブルシューティング

## HTTP 503 Unavailableが発生する場合
healthyなインスタンスがあるか調査します。

## HTTP 504 Gateway Timeoutが発生する場合
EC2のweb(Apache/Nginx等)でkeep-aliveを設定している場合は
LBのidle timeout > keep-aliveになっているかを確認します。


###終わりに
間違い等ありましたらご指摘のほどよろしくお願い致します。:bow:
python開発環境のファイル構造

## リモートで開発する際にどのようなファイル構造が一番良いのか？

今回試したのは

`/home/username/src`
をホームディレクトリとして、
その下に各プロジェクトを作り、そこにソースコードをすべて入れていくスタイル。
Githubのレポジトリもそこに入れてしまう。
そして、開発はDockerを用いて行い、docker-compose.ymlでマウントを以下のように指定する。
docker-composeはgitレポジトリのものをコピーして`/home/username/src/projectA/src`下に置く。

```
volumes:
  - /home/username/src/projectA:/root
```

こうすると、リモートサーバーの構造もすっきりするし、一つのコンテナ内ではそのプロジェクトに関わるもののみが見えて綺麗。

#### 完成イメージ

```python:リモートサーバー
home
 └─ username
    └─ src
       ├─ projectA
       │  ├─ git_repository
       │  └─ src
       │     ├─ docker-compose.yml
       │     └─ other source codes  
       └─ projectB
          ├─ git_repository
          └─ src
```

```python:Dockerコンテナ
root
 ├─ git_repository
 └─ src
```

### srcディレクトリを整備
srcディレクトリ下に`notebook`ディレクトリと`pythonfile`ディレクトリを作成し、そこに入れる。
keras model表示で活性化関数名を表示する

pythonのkerasで、model.summary()によりモデルを表示できるが、
活性化関数名（Activation）が、
　'activation_1 (Activation)'
のように表示された。
'ReLU'など、どの活性化関数を用いたのか表示したい。

## 修正前

以下が、修正前のコード（モデル定義部分）。
活性化関数の定義を
　'model.add(Activation('relu'))' とした。.......(A)

```
model = Sequential()
model.add(Dense(4, input_shape=(784, 1)))
model.add(Activation('relu'))               # A:活性化関数定義
model.add(Dense(10, activation='softmax'))

model.summary()
```

モデル表示結果。

```
Layer (type)                 Output Shape              Param #   
=================================================================
dense_1 (Dense)              (None, 784, 4)            8         
_________________________________________________________________
activation_1 (Activation)    (None, 784, 4)            0         
_________________________________________________________________
dense_2 (Dense)              (None, 784, 10)           50        
=================================================================
Total params: 58
Trainable params: 58
Non-trainable params: 0
_________________________________________________________________
```

活性化関数名が、
　'activation_1 (Activation)'
と表示され、どの活性化関数を用いたのかわからない状態。


## 修正後

kerasのAdvanced activationsを用いる。
[Keras Documentation : Advanced Activationsレイヤー] (https://keras.io/ja/layers/advanced-activations/)

Advanced activationsのReLU関数をインポート。

```
from keras.layers import ReLU
```

活性化関数の定義を
　'model.add(ReLU())' とする。......(B)

```
model = Sequential()
model.add(Dense(4, input_shape=(784, 1)))
model.add(ReLU())                           # B:活性化関数定義
model.add(Dense(10, activation='softmax'))

model.summary()
```

モデル表示結果。

```
Layer (type)                 Output Shape              Param #   
=================================================================
dense_1 (Dense)              (None, 784, 4)            8         
_________________________________________________________________
re_lu_1 (ReLU)               (None, 784, 4)            0         
_________________________________________________________________
dense_2 (Dense)              (None, 784, 10)           50        
=================================================================
Total params: 58
Trainable params: 58
Non-trainable params: 0
_________________________________________________________________
```

活性化関数名が、
　're_lu_1 (ReLU)'
と表示され、ReLU関数を用いたことがわかる。


他の活性化関数についても、同様に可能。

## 補足
Advanced activationsを用いることにしたとき、
最初は、活性化関数の定義を以下のようにしていた。

```
model.add(Activation(ReLU()))
```

これだと、うまくいかない上に、以下の警告も表示されるので注意。
どうやら、'ReLU()'をActivationの引数として与えるのではなく、直接model.add()に渡すべきらしい。

>UserWarning: Do not pass a layer instance (such as ReLU) as the activation argument of another layer. Instead, advanced activation layers should be used just like any other layer in a model.
Vscode x ssh

## ベストな開発環境を目指す

今回は、VSCODEを使って`remote-ssh`機能を使用してローカルのVSCODEからリモートのファイルを編集する。

VSCODEのインストール
[これ](https://webrandum.net/visual-studio-code/)を参考にしてインストール。
openssl のアップデートがされていないとうまく動かないのでとりあえず`ssh -V`を打って、バージョンが８以下だったら

```
brew update
brew upgrade openssl
```

を行う。
PythonでOpenWeatherのJSONファイルをテキスト化する

#はじめに
OpenWeatherのAPIが天気の情報量に長けていたので登録して無料版を使ってみました。
天気APIを叩く方法は
・都市ID
・都市名
・郵便番号
・地図座標
の4パターンです
詳しくはこちらの[記事](https://qiita.com/nownabe/items/aeac1ce0977be963a740)がわかりやすいです

この記事ではOpenWeatherの[世界の都市リスト](http://bulk.openweathermap.org/sample/)のJSONファイルを
Pythonで都市を日本にフィルタリングしてテキスト化した内容を共有したいと思います♪


#[世界の都市リスト](http://bulk.openweathermap.org/sample/)のファイルをダウンロードする

私はWindows環境です
__gzファイル__ は __Lhaplus__で解凍しました

Macの解凍方法はわからないのでググってくださいw

#PythonでJSONファイルをテキスト化する

```python
import json

Jplist = []#JSONを読み取る
listrows = []#出力用リスト

f = open('任意の.jsonファイル', 'r' ,encoding='utf-8')
jsn = json.load(f)#JSONファイルを開く

for key in jsn:#JSONファイルを読み取る
    if key['country'] == 'JP':#日本のみに絞る
        for value in key:#日本の内容を行ごとに読み取る
            Jplist.append(str(value) + ':' + str(key[value]))#行毎に読み取る
        listrows.extend(Jlist)#リストを二次元配列として追記
        Jplist.clear()#Jplistの配列を初期化する

with open("任意の.txtファイル", 'w', encoding='utf-8') as tx:
    for values in listrows:#行ごとにテキスト出力する
        tx.write(str(values) + '\n')#テキストファイルに書き込む
print('完了')
```

ポイント

+ JSONファイルをなぜか辞書で読込めなかったのでリストで読込んだ
 
　※JSONファイルがリストで作られてるのかな?
　※辞書できれいに処理したかったがやむなくリストで処理
　※いや、楽勝で辞書で読み込めたよって方いたら教えてくださいw）

+ リスト＋リストで二次元配列化しテキスト出力した

　※__extend__メソッドでリストにリストを追加してテキストへ追記

こんな感じでテキスト化できました。

#おわりに
日本のみにフィルタリングしたので、マスター化すれば日本全国の拠点を抑えられるかと思います
今後は天気のAPIを活用した記事を書いていきたいと思います♪
さくらサーバーに画像を転送できない(解決後追記)

#git pull origin master で画像が転送できない
php artisan serveで起動した開発環境では読み込めていた画像が、さくらにGitで転送しようとしたら読めなかった。
そもそもgithubに転送されていない。

gitignoreを見てそれらしい箇所を外してみたがうまくいかない。

よく考えたらgithubはソースコード保管するところだし、画像は無理とか？
もしくは容量制限とかコマンドが別？

#フォルダが作れない
ファイル転送ソフトのFileZilaならどうかと思い、これでpublicフォルダに転送してみたら読み込めるようになった。
が、さすがにフォルダで分けたいと思い、サブディレクトリを作ろうとすると作ってフォルダを再読み込みすると消えてしまう。
FileZilaからパーミッションを確認するも755だったから読めるはず。
試しに777にしてもやっぱりダメだった。

#ターミナルからはフォルダを作れる。
ターミナルでpublicフォルダに入ってmkdirしたら普通に作れた。
一度、作成したディレクトリにはFTPソフトからでも転送できた。

とりあえず解決はしたものの理由は分からないまま。

#補足
今回は関係なかったが、　.htaccessをどうにかすると治るパターンもあるらしいのでこれでうまくいかなかった人はそれでググってください。

#追記
改めて見ると、.gitignoreの編集もれでした。
ファイルがいくつかあり、一番深いディレクトリが優先されるようです。cssみたいな感じですね。
で、イメージファイルを置いてあったstorageディレクトリの.gitignoreに

```text:.gitignore
*
.gitignore
```
と初期設定で書かれているので。両方の行頭に ! をつけて打ち消せば出来ました。
XMLをpandas.DataFrameにする

データ分析の過程でAPIを利用することは多いと思います。

APIの結果がXMLで返ってくるとき、扱いにちょっとこまって時間がかかったのでやり方をメモしておきます。


# input

例として、こんな感じのXMLっぽいデータがあったとします。

```python
# 例
response = """
<INFO>
    <RESULT>
        <STATUS>0</STATUS>
        <ERROR_MSG>SUCCESS</ERROR_MSG>
        <DATE>2019/09/29T06:21:15+9:00</DATE>
    </RESULT>
    <PARAMETER>
        <lang>ja</lang>
        <code>01</code>
    </PARAMETER>
</INFO>
"""
```

# code

以下のコードでpd.DataFrameに変換できます。

```python
# parse xml
from lxml import etree
root = etree.fromstring(response)

# convert xml to dict
import xmljson
data_dict = xmljson.yahoo.data(root)

# convert dict to pd.DataFrame
import pandas as pd
pd.io.json.json_normalize(data_dict)
```

# output 

結果はこんな感じになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201348/7176ed5f-8e6c-ce80-a878-b673f48de8f1.png)

`pd.io.json.json_normalize()`の引数等は元のXMLのネスト具合に応じて調整する必要があります。
競プロのローカル環境の作り方  -Windows版-

## Mac版

https://qiita.com/Kaas59/items/34fe0374bb9da103895b

# 開発環境でインストールするもの
  - Cygwin(gcc,g++)

    Windows上で動くC言語、C++言語用のコンパイラ用OSです。
  - Atom

    既にVSCodeやSublimeTextなどのテキストエディタが入っている場合そちらでも構いません。

## Cygwinのインストール方法

   1. [Cygwin](http://cygwin.com)のサイトからソフトをダウンロードする

       サイトにアクセスして**Installing Cygwin**の**Install Cygwin by running**のあとにある **setup-x86_64.exe** か**setup-x86.exe**をダウンロードしてください。

       ※パソコンが32bitの場合は**setup-x86.exe**をダウンロードしてください。

   2. Cドライブの直下にCygwinフォルダを作成する

       作成出来たらそのフォルダにsetup-x86_64.exeファイルを移動させてください。

       ※フォルダを作らずにインストールした場合ファイルが飛び散る恐れがあるので必ず作成しておくようにしてください。

   3. インストーラーを起動させてインストールする
 
       1. **Install from Internet** を選択して次へ進む
       2. C:￥cygwinに保存になっているか、**All Users**を選択して次へ進む
       3. なにも、変更せず次へ進む
       4. Direct Connectionを選択し次へ進む
       5. **.jp**で終わっているところのものを適当に選んで次へ進む
       6. Setup Alertが出ても気にせず次へ進む
       7. 左上の検索バーに**gcc-core**と入力する、出た項目の中で好きなバージョンを選択する
       8. 同様に**g++-core**もバージョンを選択し次へ進む
       8. そうするとインストールが開始され終了するとgccが使えるようになります

## Atomをインストールする方法

   1. [Atom](https://atom.io/)のサイトからソフトをダウンロードする

       サイトにアクセスして**Download**を選択ダウンロードしてください。

       ※パソコンが32bitの場合は**32bit**版をダウンロードしてください。

   2. インストーラーを起動させてインストールする

       インストールしても便利に

   3. Atomを日本語化する

      1. 画面左上のメニューから「File」→「Settings」を選択する
      2. ｢Settings｣タブの「+Install」を選択する
      3. 入力欄に「**Japanese-menu**」と入力
      4. Installを押す

   4. Atomエディタでコマンドプロンプトを実行する

      1. 画面左上のメニューから「File」→「Settings」を選択する
      2. ｢Settings｣タブの「+Install」を選択する
      3. 入力欄に「**platformio-ide-terminal**」と入力
      4. Installを押す
      5. [Cntl+`]で開く

## おわりに

これで満を持して[AtCoder](https://atcoder.jp)や[TopCoder](https://www.topcoder.com/)、Paizaなどの競技プログラミングを頑張っていってください！
目標は毎秒1万リクエスト

ピクシブの広告配信サーバーへのリクエスト数はDailyで 4〜6億req もあり、これは毎秒平均に直すと約 5,000RPS(Request Per Second) になります。さらに、ピークタイムである休日の深夜帯には 12,000RPS にも達します。つまり新しい広告配信サーバーにも、毎秒12,000のリクエストを捌く性能が必要ということです。
OCI NWに関するメモ

## VCN
- サイズ: /16 ~ /30で作成可能
-  VCN作成と使用には料金はかからない。
- VCN内の通信にはデータ転送料はかからない
- OCIはインバウンド無料、アウトバウンドは10TBまで無料とNWのコストは安い
- 169.254.0.0/16はOCI内部でiSCSI用に予約されている。
- 各サブネットを作成した際には、下記3アドレスは使用不可
       - CIDRの最初(ネットワークアドレス)
       - CIDRの2つ目(サブネットのデフォルトゲートウェイ)
       - CIDRの最後(ブロードキャストアドレス)



## 可用性ドメイン(AD)

- リージョンは可用性のために複数の可用性ドメイン(データセンター)を持つ場合がある。
  - 残念ながら東京リージョンでは、現時点では1つしかない。

- OCIのリソースはグローバル、リージョン、可用性ドメインレベルで存在している。
https://docs.oracle.com/cd/E97706_01/Content/General/Concepts/regions.htm#resouce#one

- サブネットを切るときなどはリージョンか、可用性ドメインレベルで作成するか選択できる。
    - Oracleはリージョンを推奨。特に理由がなければリージョンでいいと思う。


## フォルトドメイン(FD)
- 可用性ドメイン内のハードウェアとインフラストラクチャのグループ。
- 各可用性ドメインには3つのフォルトドメインがある。
- コンピュートやDBインスタンスを起動する際には、オプションで選択可能

## VNIC

- VMインスタンスを起動すると、物理NICに関連付けられたVNICを使用する。
- BMインスタンスだと2つの物理NICを持つ。それぞれ25Gbps
- インスタンスにアタッチ出来るVNICの数はシェイプによって異なる。
- インスタンスの帯域幅はアタッチされているVNICの数に関係なく固定されている。
    - インスタンス上の特定のVNICの帯域幅制限を指定することはできない。
- セカンダリVNICは起動後にインスタンスにアタッチできる。プライマリVNICと同じVCN内であれば、サブネットは異なってもアタッチできる。~~VCNは同じである必要がある~~ ADが同じであれば、異なるVCNでも作成できる
- インスタンス帯域幅はアタッチするVNIC数に関係なく固定されている。

### PublicIP

下記の２タイプが存在

- エフェメラル(一時的)
    - インスタンス停止しても変わらない
- 予約済み
    - リージョン内で５０まで
詳細はhttps://docs.oracle.com/cd/E97706_01/Content/Network/Tasks/managingpublicIPs.htm

予約済みの方はAWSのEIPのように使い方によって課金されるのかな？と思ったが無料っぽい
https://blogs.oracle.com/cloud-infrastructure/release-announcement-reserved-public-ips-are-now-available-on-oracle-cloud-infrastructure

> There is no charge to use this feature.
GitHub Actions v2 で mapping values are not allowed in this context エラー

# はじめに
[`jobs.<job_id>.steps.run`](https://help.github.com/ja/articles/workflow-syntax-for-github-actions#jobsjob_idsteps) で環境変数を使おうとしたときに下記の `Invalid Workflow File` エラーに遭遇したので回避方法について。

```
yaml: line XX: mapping values are not allowed in this context
```

# エラーになる書き方
```yml
steps:
  - run: curl -X POST -H "Authorization: Bearer ${{ secrets.LINE_TOKEN }}" -F "message=test" https://notify-api.line.me/api/notify
```

# エラーにならない書き方
```yml
steps:
  - run: 'curl -X POST -H "Authorization: Bearer ${{ secrets.LINE_TOKEN }}" -F "message=test" https://notify-api.line.me/api/notify'
```
```yml
steps:
  - run: |
      curl -X POST -H "Authorization: Bearer ${{ secrets.LINE_TOKEN }}" -F "message=test" https://notify-api.line.me/api/notify
```

# おわりに
YAML は `:` などの記号を含んでいるときにクオテーションで囲ってあげないといけないようです。
（コメントいただいて修正しました、ありがとうございます。）
ESLint v6.5.0

前 [v6.4.0](https://qiita.com/mysticatea/items/4164b162fb37dcc443a1) | 次 [v6.6.0](https://qiita.com/mysticatea/items/0a77713cff42d84d85c7)

<blockquote class="twitter-tweet"><p lang="en" dir="ltr">ESLint 6.5.0 has been released: <a href="https://t.co/D7WheS5wmc">https://t.co/D7WheS5wmc</a></p>&mdash; ESLint (@geteslint) <a href="https://twitter.com/geteslint/status/1178184658972037120?ref_src=twsrc%5Etfw">September 29, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

ESLint `6.5.0` がリリースされました。
小さな機能追加とバグ修正が行われています。

質問やバグ報告等ありましたら、お気軽にこちらまでお寄せください。

> 🏢 [日本語 Issue 管理リポジトリ](https://github.com/eslint/eslint-jp)
> 👫 [日本語サポート チャット](https://gitter.im/eslint/eslint-jp)
> 🏢 [本家リポジトリ](https://github.com/eslint/eslint)
> 👫 [本家サポート チャット](https://gitter.im/eslint/eslint)

# 🚀 本体への機能追加

## [`--env-info` CLI option](https://eslint.org/docs/user-guide/command-line-interface#--env-info)

🔖 [#12270](https://github.com/eslint/eslint/issues/12270)

ESLint の実行環境を表示する CLI オプションが追加されました。

バグ報告の際にご利用ください。

```bash
$ eslint --env-info
Environment Info:

Node version: v12.11.0
npm version: v6.11.3
Local ESLint version: v6.5.0
Global ESLint version: Not found
```

# 💡 新しいルール

特になし。

# 🔧 オプションが追加されたルール

## [use-isnan](https://eslint.org/docs/rules/use-isnan) `enforceForSwitchCase`

🔖 [#12192](https://github.com/eslint/eslint/issues/12106), [#12207](https://github.com/eslint/eslint/issues/12207)

浮動小数点数の仕様により、`NaN`との比較は常に`false`になります。これを報告する`use-isnan`ルールに、`switch`文も報告するオプションが追加されました。

```js
/*eslint use-isnan: [error, { enforceForSwitchCase: true }]*/

//✘BAD
switch (foo) {
    case NaN:
        bar();
        break;
}
```

**[Online demo](https://eslint.org/demo#eyJ0ZXh0IjoiLyplc2xpbnQgdXNlLWlzbmFuOiBbXCJlcnJvclwiLCB7IGVuZm9yY2VGb3JTd2l0Y2hDYXNlOiB0cnVlIH1dKi9cblxuLy/inJhCQURcbnN3aXRjaCAoZm9vKSB7XG4gICAgY2FzZSBOYU46XG4gICAgICAgIGJhcigpO1xuICAgICAgICBicmVhaztcbn1cbiIsIm9wdGlvbnMiOnsicGFyc2VyT3B0aW9ucyI6eyJlY21hVmVyc2lvbiI6MTEsInNvdXJjZVR5cGUiOiJtb2R1bGUiLCJlY21hRmVhdHVyZXMiOnt9fSwicnVsZXMiOnt9LCJlbnYiOnt9fX0=)**

# ✒️ `eslint --fix` をサポートしたルール

特になし。

# ⚠️ 非推奨になったルール

特になし。
Elixir本体ビルド②：Elixir本体のバージョンをいじってmake、iexバージョン変更

[fukuoka.ex](https://fukuokaex.connpass.com/)のpiacereです
ご覧いただいて、ありがとうございます :bow:

[tokyo.exと合同で開催している「Elixir本体ソースコード読み込み会」](https://fukuokaex.connpass.com/event/148581/)にて、Elixir本体を改造していますが、その手順を解説するコラムです

[前回のコラムでは、Windowsユーザ向けにcygwinをインストール](https://qiita.com/piacerex/items/9ce28162d8fe1b72cf56)するところまでまとめています

ちなみに会の様子は、こんな感じで、tokyo.exが東京会場でのオフライン参加、fukuoka.exがZoomでのリモート参加です（冒頭、tokyo.ex会場の様子も映し出されました）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155423/1a1a964a-c650-91f5-16ef-dd8e7e62e71d.png)

# 本コラムの検証環境、事前構築のコマンド

本コラムは、以下環境で検証しています（Windowsで実施していますが、Linuxやmacでも動作する想定です）

- Windows 10
- Elixir 1.9.1　　　　 ※<b>[最新版のインストール手順はコチラ](https://qiita.com/piacere_ex/items/6714e1440e3f25fb46a1#%E4%BA%8B%E5%89%8D%E6%BA%96%E5%82%99elixir%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)</b>
- cygwin 　　　　　 ※<b>[最新版のインストール手順はコチラ](https://qiita.com/piacerex/items/9ce28162d8fe1b72cf56)

cygwinは、makeが動くよう、インストールしてください（devutilとかを除外すると動かない可能性あり）

ちなみにビルド用のElixirは、1.9.1を使いますが、ビルド対象のElixirは、1.10.0-devというリリース前の最新バージョンを使ってみました

# CygwinコンソールでのWindowsドライブ移動

cygwinコンソールを起動し、Elixir本体ソースコードをcloneするフォルダまでcdします

Windowsのフォルダ移動については、以下のように、ドライブ指定が「/cygdrive」配下にドライブレターで可能です

```
$ cd /cygdrive/c
```

任意のフォルダ移動やフォルダ作成をして、その配下にElixir本体ソースコードをこの後、持ってきてビルドします

# Elixir本体ソースコードのgit cloneとビルド

Elixir本体ソースコードをcloneします

```
$ git clone https://github.com/elixir-lang/elixir
```

続けて、Elixir本体ソースコードをcloneしたフォルダに移動します

```
$ cd elixir
```

Elixir本体ソースコードフォルダ配下で、makeを実行すると、ビルドがスタートします

```
$ make clean test
```

下記のように、src/elixir*がRecompileされる画面が出てくれば、make開始は成功です
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155423/08fec153-5d28-0c02-fbf9-965b512020a5.png)

# iexのバージョンを変更してみる

上記makeでエラーが出ていないことを確認したら、Elixir本体ソースコードフォルダ直下にある、下記ファイルを変更します

```:VERSION
1.10.0-piacere
```

ビルドしますが、cleanしないと、変更したビルドが通らないので、まずcleanしてから、makeします

```
$ make clean
$ make
```

30秒～1分ほどでビルドが終わります（マシンスペックによって前後します）が、その後、Elixir本体ソースコードフォルダ直下のbinフォルダに移動し、そこにあるiexが、上記ビルドで変更されているので、それを起動します

```
$ cd bin
$ ./iex
```

上記で書き換えたバージョンが動くようになりました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155423/5fe091f9-ec0e-671d-64bb-507fdfe3478b.png)

# 終わり

いかがでしたでしょうか？

思った以上にカンタンに、Elixir本体が改造できることが、お分かりかと思います

# p.s.「いいね」よろしくお願いします

ページ左上の ![image.png](https://qiita-image-store.s3.amazonaws.com/0/155423/4d515047-cc48-382e-c2b1-3ad0cc50dbbf.png) や ![image.png](https://qiita-image-store.s3.amazonaws.com/0/155423/a4e3da58-70a3-4197-95a2-6a6906650d01.png) のクリックを、どうぞよろしくお願いします:bow:
ここの数字が増えると、書き手としては「ウケている」という感覚が得られ、連載を更に進化させていくモチベーションになりますので、もっとElixirネタを見たいというあなた、私達と一緒に盛り上げてください！:tada:
[MeCab]Python3で使ってみる 

文字学習をするにはMeCabがよいとの噂があったので利用してみた
【手順】
1.下記のMeCab本体のインストール
https://drive.google.com/uc?export=download&id=0B4y35FiV1wh7WElGUGt6ejlpVXc
2.パスを通す
set PATH=%PATH%;C:\Program Files (x86)\MeCab\bin
3.pipでインストール
py -m pip install mecab-python-windows

後はコードで検証!

```python
#coding: UTF-8
import MeCab


# オプション
# 1. -Ochasen
# 2. -Owakati
# 3. -Oyomi
# 4.mecabrc
text = '男だろ、負けてもいいから戦うくらいの勇気をもて'
tagger = MeCab.Tagger("-Ochasen")
str_output = tagger.parse(text)
print(str_output)
```

実行結果

```
男      オトコ  男      名詞-一般
だろ    ダロ    だ      助動詞  特殊・ダ        未然形
、      、      、      記号-読点
負け    マケ    負ける  動詞-自立       一段    連用形
て      テ      て      助詞-接続助詞
も      モ      も      助詞-係助詞
いい    イイ    いい    形容詞-非自立   形容詞・イイ    基本形
から    カラ    から    助詞-接続助詞
戦う    タタカウ        戦う    動詞-自立       五段・ワ行促音便        基本形
くらい  クライ  くらい  助詞-副助詞
の      ノ      の      助詞-連体化
勇気    ユウキ  勇気    名詞-一般
を      ヲ      を      助詞-格助詞-一般
もて    モテ    もてる  動詞-自立       一段    連用形
EOS
```
ドラえもんの名言から使っています
githubは<a href="https://github.com/s053066/mecab">こちら</a>

次は言葉の判定処理の予定。。。
Elixir 標準modulesの追加

# はじめに
- 2019/9/29(日)
- [tokyo.ex#13 elixir本体ソースコードもくもくリード会](https://beam-lang.connpass.com/event/148476/) に参加
    - [fukuoka.ex#30:tokyo.exとコラボ、Elixir本体コード読込会（リモートのみ）](https://fukuokaex.connpass.com/event/148581/)
    - こちらに参加
- はじめにすごく丁寧な説明がありました!
- ありがとうございます!
    - Elixirのソースコードとの向き合い方
    - Makeの解説

# 資料
- ありがとうございます :bow: :bow: :bow: 
- https://twitter.com/hayabusa333/status/1178172246591885312
  - [@hayabusa333](https://twitter.com/hayabusa333) さま
- https://twitter.com/ohrdev/status/1178150005544144897
  - [@ohrdev](https://twitter.com/ohrdev) さま

# 作業
- MacBook Pro (13-inch, 2017, Two Thunderbolt 3 ports)を使用
- [Homebrew](https://brew.sh/index_ja)でelixir 1.9.1がインストールされていた
- その他にもXCodeとかがインストールされていたのでコンパイルに必要なものはあらかじめ揃っていたようにおもう

```
$ git clone https://github.com/elixir-lang/elixir.git
$ git checkout -b feature/awesome v1.9.1
```

# 変更したソースコード
```txt:VERSION
1.9.1-awesome
```
- ↑↑↑ ルートディレクトリに `VERSION` というファイルがあるので書き換え

```Elixir:lib/elixir/lib/awesome.ex
defmodule Awesome do
  def greet() do
    "Although I am not not not the most important, My name is Awesome.\nYou call me Osamu.\n@torifukukaiou is my Twitter account.\nYes, I was born to love Elixir!!!\nHow wonderful life is while Elixir is in the world!!!"
  end
end
```
- ↑↑↑ ファイルを追加
- 追加しただけ！

# ビルド
```
$ make
```
- 私は事前に `make test` していたせいか？　なんかエラーがでたので `make clean` しました

# 実行

<img width="919" alt="スクリーンショット 2019-09-29 15.09.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131808/5c035eb1-4748-0eaf-28d4-f1f271c676c0.png">

- バージョンかわったし、Awesomeというmoduleを追加できました！
指定の要素を取得する方法

# まえがき
引き続き発掘作業中に見つけたメモ書き。
素のJavaScriptでどうにかしなきゃ行けない時にいろいろメモしていたらしい。
以下、jQueryが使えるなら、そっち導入してやる方が良いと思う。

# id指定で取得
```js
var test = document.getElementById("idName");
var url = test.getAttribute("href");
url += url + "いじる。加えたり";
test.href = url;  // aタグの位置に戻す
```

※idはhtml一つのファイルにつき一意となっている。

# class指定で取得
* ちょっと調べるのめんどかった。下の方に記述したやり方の方がスマート

```js
var test = document.getElementsByClassName("className");
test = Array.prototype.filter.call(test, function(test){
		return test.nodeName === "A"; // aタグの意。DIVとかもある。この場合は、classNameに一致するaタグという意。
});

for (var i =0; i < test.length; i++) {
    var url = test[i].getAttribute("href");
    url += url + "いじる。加えたり";
    test[i].href = url;  // aタグの位置に戻す
}
```

* `getElementsByClassName()`は、 Array.prototypeメソッドに与えて利用することができる
     * https://developer.mozilla.org/ja/docs/Web/API/Element/getElementsByClassName 
* ` test.nodeName === "A" `
     * nodeNameでclass内部の要素を指定できる。くわしくはその都度ググるか、コンソール上で名前確認する。
* classは複数指定可能なので、配列で返ってくる。そのためfor文でまわす。

 **↑よりも、まずタグ指定で要素を配列にまとめて、指定のclassが存在するか確認する方がシンプル** 

         ① var t = document.getElementTagname('a').... ※うろ覚え
         ② t.getAttribute('class') && t.getAttribute('class').indexOf('クラス名')

# タグ指定で取得
```js
var test = document.getElementsByTagName("a");

for (var i =0; i < test.length; i++) {
    var url = test[i].getAttribute("href");
    url += url + "いじる。加えたり";
    test[i].href = url;  // aタグの位置に戻す
}

```

# 自分へ
見直しが必要です。暇ができたらやってください。
AtCoder Beginner Contest 142 参戦記

# AtCoder Beginner Contest 142 参戦記

## [ABC142A - Odds of Oddness](https://atcoder.jp/contests/abc142/tasks/abc142_a)

2分半で突破. A問題なのにあってるのかなと考える時点でいつものA問題より難しい. これは書くだけとは言えない.

```python
N = int(input())
print(int(N / 2 + 0.5) / N)
```

## [ABC142B - Roller Coaster](https://atcoder.jp/contests/abc142/tasks/abc142_b)

3分で突破. 書くだけ. 今回はある意味A問題よりB問題のほうが簡単だった.

```python
N, K = map(int, input().split())
h = list(map(int, input().split()))
print(sum(1 if t >= K else 0 for t in h))
```

## [ABC142C - Go to School](https://atcoder.jp/contests/abc142/tasks/abc142_c)

7分半で突破. 問題そのものは簡単なんだけど、タプルの第二要素でソートするのどうやるんだっけみたいな部分を調べるのに時間を使った.

```python
from operator import itemgetter

N = int(input())
A = list(map(int, input().split()))

print(*[t[0] + 1 for t in sorted(enumerate(A), key=itemgetter(1))])
```

## [ABC142D - Disjoint Set of Common Divisors](https://atcoder.jp/contests/abc142/tasks/abc142_d)

WA が消せず. 最大公約数を取り、その約数のうち素数のものを数え上げるという方針は合っていたのだけど、TLE 対策で `sqrt(gcd(A, B))` までしかループを回さないようにした時に、`sqrt(gcd(A, B))` より大きい素数が1つだけ存在しうることを見落としたせいで、すべてがパーに. この問題を飛ばして、次の問題をやったら解けた可能性が高かったので、今回の ABC は完全に事故った感じに.

```python
from fractions import gcd
from math import sqrt


def prime_factorize(n):
    result = []
    for i in range(2, int(sqrt(n)) + 1):
        if n % i != 0:
            continue
        t = 0
        while n % i == 0:
            n //= i
            t += 1
        result.append((i, t))
        if n == 1:
            break
    if n != 1:
        result.append((n, 1))
    return result


A, B = map(int, input().split())
print(len(prime_factorize(gcd(A, B))) + 1)
```

## [ABC142E - Get Everything](https://atcoder.jp/contests/abc142/tasks/abc142_e)

手を付けれず. ナップサック問題が解ける人なら大体解けるのではないか.

```python
def read_key():
    a, b = map(int, input().split())
    m = 0
    for c in map(int, input().split()):
        m |= 1 << (c - 1)
    return (a, m)


INF = float('inf')

N, M = map(int, input().split())
keys = [read_key() for _ in range(M)]

dp = [INF] * (1 << N)

dp[0] = 0
for i in range(M):
    a, m = keys[i]
    for j in range((1 << N) - 1, -1, -1):
        if dp[j] == INF:
            continue
        if dp[j] + a < dp[j | m]:
            dp[j | m] = dp[j] + a

if dp[(1 << N) - 1] == INF:
    print(-1)
else:
    print(dp[(1 << N) - 1])
```
...(三点リーダー的な奴)の使い方

# スプレットオペレーター
ES6の記法

http://analogic.jp/spread-operator/
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Spread_syntax

配列を連結したり、連結して関数に投げたりできる。

```js
function getTest(x,y,z) {
    return x + y + z;
};
var test = [1,2,3];
console.log(getTest(...test));
// output : 6
```
【Swift】定数と変数の宣言に関する基本的な挙動

# この投稿は何？
Swiftにおける__変数と定数の宣言・定義の挙動__について、調べたことを忘備録として残しておきました。

## 環境
macOS10.15 Catalina beta9
Xcode11

# ハンズオン
まず最初に、宣言と定義について自分なりには次のように解釈しています。

- 宣言: 値を割り当てるオブジェクトの名前とそのデータ型を決定すること。
- 定義: 宣言に加えて、具体的な値またはnilを割り当てること。

上記を踏まえて、Playground環境で実行したコードは下記の通りです。

## Variables 変数の挙動
変数として宣言されたオブジェクトには、__何度でも新しい値を割り当てる__ことができます。
ただし、具体的な値を割り当てる前にアクセスすると、エラーになります。
これは、__未初期化__状態であることが原因です。

````Swift:変数オブジェクトを宣言して、値を更新する
var number: Int // declared Integer type variable.
number          // ERROR: variable 'number' used before being initialized number
number = 123    // number is assigned value.
number = 321    // number is assigned value agein.
````

変数オブジェクトをオプショナルとして宣言します。
すると、宣言された時点で `nil` が__自動的に既定値として割り当てられる__ことが確認できます。

````Swift:オプショナルの場合
var optionalNumber: Int? // declared Optional Integer type variable.
optionalNumber           // nil is assigned as default value.
optionalNumber = 456     // assigned new value.
````

## Constants 定数の挙動
定数オブジェクトの挙動です。
オブジェクトを宣言した後は、__1度だけ値を割り当てる__ことができます。
やはり、既定値を割り当てる前にアクセスすると、エラーになります。

````Swift:定数オブジェクトを宣言して、値を割り当てる
let message: String     // declared String type constant.
message                 // ERROR: constant 'message' used before being initialized message
message = "Hello"       // Constant, but can be assigned a value only once.
````

以下のコードでは、宣言と同時に既定値を割り当てて、定数オブジェクト`alphabet`を定義しています。
既定値として値を一度、割り当てたので、この定数`alphabet`の値は変更できません。

````Swift:定数オブジェクトを定義する
let alphabet = "abc"    // define a String type constant.
alphabet = "defg"    // ERROR: Cannot assign to value
````

今度は、オプショナルの場合です。
オプショナルの定数オブジェクト`optionalAlphabet`を宣言します。
__変数のオプショナル__オブジェクトでは、既定値として`nil`が自動的に割り当てられていました。
ところが、定数のオプショナルでは既定値が割り当てられていません。
`optionalAlphabet`にアクセスすると、__未初期化状態__のエラーが警告されます。

````Swift:オプショナル定数の場合
let optionalAlphabet: String?   // declared Optional String type Constant.
optionalAlphabet                // ERROR: constant 'optionalAlphabet' used before being initialized
optionalAlphabet = "ABC"        // assigned default value.
````

定数オブジェクトに対して自動的に`nil`を割り当ててしまうと、__1度目の値を割り当てた__ことになり任意の値を割り当てられなくなってしまいます。
そのため、このような挙動になっていると考えられます。

# 考察
安全を謳うSwiftプログラミングでは「まずは定数で」というコンセプトがあります。
その後、値を変更する必要が発生したら、変数オブジェクトに修正するのが常套手段です。
変数オブジェクトはオプショナルとして宣言すると、自動的に`nil`が既定値になります。
しかし、定数オブジェクトがオプショナルな場合、__意図的に既定値を割り当てないとエラー__になります。
呼び出すだけでエラーになるので、`nil`と比較することすらできません。
ビルド前の静的エラーとして検出されるので、それほど危険なわけではありませんが覚えておきたい挙動です。
【OCI】oracle cloud -仮想マシン(Compute)作成編-【初心者向け】

# Compute
AWSでいうEC2はOracle Cloudではcomputeと呼ぶ
CPUの単位がoracleでは特別で
OCPUという
1OCPUは、1物理CPUコア = Hyper-Threading後で2論理CPUコアとなっています。
そのため最小でも2CPUあることになります。

IOPSは 60IOPS/GB となっています。
AWSはバースト機能でIOPSが上昇しますが、基本は3IOPS/GBとなっています。

## 前回の記事でルート表を作成しました。
ルート表の作成を見たい方はこちらから
[ルート表編](https://qiita.com/manaki079/items/c2177c8198d2d4f8d654)

## Computeの作成
左のメニューからコンピュート→インスタンスをクリック
![machine_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111276/ec7612b1-64c2-dcea-78e4-86688a06b450.png)

コンパートメントの確認
インスタンスを作成したいコンパートメントになっていればOK
![machine_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111276/7f3a82f7-dfa3-b704-94f8-4964fb4ec363.png)

インスタンスの作成をクリック
![machine_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111276/787800aa-6e6a-e6dc-0377-eea82d169bf8.png)

### シェイプの変更

| 項目       | 概要|
|:-----------------|:-----------------|
| インスタンスの命名             | インスタンス一覧に表示される名前です |
| オペレーティングシステム～～           | お好きなイメージを選択してください|

シェイプなどの変更を行うため、
シェイプ、ネットワークおよびストレージ・オプションの表示をクリック
![machine_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111276/67e91877-b6e1-f8aa-3228-849460f91362.png)

シェイプの変更をクリック
![machine_5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111276/b9f96713-826f-47be-55c6-53e5580aa977.png)
シェイプはインスタンスサイズのこと
お好きなシェイプを選んでシェイプの選択をクリック
![machine_6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111276/8a589991-de5f-560a-a0d7-af47445e94c7.png)

### ネットワークの設定

| 項目       | 概要|
|:-----------------|:-----------------|
| サブネット             | 割り当てるサブネットを選択してください |
| ネットワーク・セキュリティグループ           | 割り当てるセキュリティグループを選択してください|

※セキュリティグループはネットワーク・セキュリティグループを使用してトラフィックを制御にチェックを入れると現れます

![machine_7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111276/ebb20521-ae42-4a26-d037-51ca22443df8.png)

### ボリュームの変更

ブート・ボリュームはご自由に変更してください。
カスタム・ブート・ボリューム・サイズで割り当てたいボリュームを変更できます。
ボリュームを大きくするほどIOPSは高くなります。
ボリュームを変更した際は割り当てを後々行わないといけません。
方法は別の記事に書きたいと思います。

### SSHキーの追加

SSHキーの追加
ファイルの選択をクリックしてご自身で作成された公開鍵を選択してください。

![machine_8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111276/8b4664b4-174c-98b0-d7ba-3ff9eaa54409.png)

### 拡張オプション

#### フォルトドメイン
oracleではリージョン、アベイラビリティドメイン、フォルトドメインを利用して冗長構成を組むことができます。
東京リージョンではアベイラビリティドメインが１つしかないため、
フォルトドメインで冗長化を行えます。

フォルトドメインとはアベイラビリティドメイン(データセンター)内で棚違いの区分けとなっています。

冗長化しない場合は選択なしで問題ありません。
![machine_9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111276/5a5b5004-8c5b-01e1-948b-b76813c8ed77.png)

#### ネットワーキング

内部IPとホスト名を任意で設定してください。
![machine_10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111276/efc0c29a-83e4-f3e6-7674-ebdbe67c4c32.png)

設定に問題がなければ作成をクリック
![machine_11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111276/b2db9ad4-0033-a689-e2f3-a842eb0699d8.png)

インスタンス生成が終わるとパブリックIPアドレスが出力されます。
![machine_12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111276/9b01c6af-9241-ad44-407d-56b12368e1ac.png)


ターミナルで接続します
ユーザはopcユーザになります。

```bash
$ ssh -i 秘密鍵 opc@パブリックIPアドレス
[opc@mline-admin ~]$
```

あとは楽しく遊びましょう！

## 備考

2020/01/31
常時無料のVM.Standard.E2.1.Microを作成しようとした結果
キャパシティエラーを確認しました。
UnityでProjectSettingsと共にunitypackageをExportする

雑記

レイヤー設定と共にパッケージを作成したい機会があったので。
問題ないかは不明。

http://myoujing.wpblog.jp/2014/03/274/
こちらを参考にしましたが、余計なdll等も含まれてしまったため
以下のようにしてみました。

```C#
#if UNITY_EDITOR

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;

public class ExportSetting : MonoBehaviour
{
    [MenuItem("Assets/ExportWithSettings")]
    static void Export()
    {
        string[] assetPaths = {
            "Assets/含めたいフォルダー",
            "ProjectSettings/AudioManager.asset",
            "ProjectSettings/ClusterInputManager.asset",
            "ProjectSettings/DynamicsManager.asset",
            "ProjectSettings/EditorBuildSettings.asset",
            "ProjectSettings/GraphicsSettings.asset",
            "ProjectSettings/InputManager.asset",
            "ProjectSettings/NavMeshAreas.asset",
            "ProjectSettings/NetworkManager.asset",
            "ProjectSettings/Physics2DSettings.asset",
            "ProjectSettings/ProjectSettings.asset",
            "ProjectSettings/QualitySettings.asset",
            "ProjectSettings/TagManager.asset",
            "ProjectSettings/TimeManager.asset",
            "ProjectSettings/UnityConnectSettings.asset"
        };

        string exportPath = "test.unitypackage";

        AssetDatabase.ExportPackage(assetPaths, exportPath, ExportPackageOptions.Interactive | ExportPackageOptions.Recurse);
        
    }
}

#endif

```
ProjectSettingsは再帰で読まれなかった。

#環境
Unity 2017 4.2.8f1