OmniAICreator/Qiita-1.07M huggingface dataset:
Janssonの使い方

# Janssonとは
janssonとはc言語で使えるJSONパーサのことで，
JSONテキストをC言語で読み込むことができます．

# JSONテキストを読み込む
例えば、以下のようJSONテキスト、

``` sample.json
{
    "Name" : "okura",
    "age" : 10 
}
```

を読み込みたいときは、

``` 
json_t json_object;
json_error_t jerror;

json_object = json_load_file(/path/to/sample.json,0,&jerror);
```
とすると ``json_object`` に ``sample.json`` の内容が読み込まれます．

- ``json_t`` という型は，JSONの任意の値を表現するために使います．
- ``json_object`` はJSONを格納するための変数です．
- ``json_error_t jerror`` は，エラーが起こったときに内容を返してくれる構造体です． ``jerror.text`` にエラーメッセージが格納されます．

``json_t *json_load_file(const char *path, size_t flags, json_error_t *error)``
は，JSONテキストファイルを読み込みます．
第2引数の ``flag`` はデータをエンコードする方法を制御する変数らしいですが，よくわかりません．デフォルト値は0．

# JSONテキストの要素を取り出す

例えば，``NAME``要素を，char型で取り出すには，

```
char name[256];
strcpy(name, json_string_value(json_object_get(json_object, "NAME");
```

とします．

``json_t *json_object_get(const json_t *object, const char *key)``
は，JSONオブジェクト（ここでは，``json_object``)のの中で ``key`` の要素を取り出します．


``const char *json_string_value(const json_t *string)``
は，JSONオブジェクトの文字列要素の値を返します．

# まとめ
Janssonの簡単な使い方を紹介しました．
主に自分用で，Janssonの機能を網羅しているわけではありません．
これ以外にも豊富な機能を提供しています．
詳しくは公式の[APIリファレンス](https://jansson.readthedocs.io/en/2.11/index.html)を参照してください．

また，間違っている点などがあればご指摘ください．
iOSのbeta版をダウンロードするときはSafariを使いましょうという話

# 開発で何かと使うbeta版
最近仕事でiOS13のbeta版での挙動をテストしてくれとのことで
始めてbeta版を入れたのですが、なんとなくchromeでやったらつまづいたのでメモ

# ダウンロードはSafariで
beta版導入の流れとしては
1.iPhoneやiPadなどのiOSデバイスで**[Apple Beta Software Program](https://beta.apple.com/sp/betaprogram/redemption?locale=ja)**
に飛んで`プロファイルをインストールする`の`Install Profile`をタップします

2.`設定`アプリを起動すると、名前の下に`プロファイルがダウンロードされました`と出るのですが
**インストールをchromeでやってしまうとこれが出ないので詰みます**
**ブラウザもAppleさんのものを使いましょう**

3.指示に従いプロファイルのインストールが終わると**再起動を促されるので再起動します**
4.再起動したら**もう一度`設定`アプリを開き**
`一般`＞`ソフトウェア・アップデート`でアップデートできたら終了です(所要６０分ぐらい)

# 参考記事
**・[「iOS 13」ベータ版をインストールする方法](https://mobilelaby.net/images/2019/06/how-to-install-ios-13-beta-6.jpg)**
GoogleのE-A-Tとは

E-A-Tとは必ずしも専門家ではなくても良いようです。むしろ本物の専門家がGoogleのE-A-Tから外れるという事例もあります。あくまでGoogleの考える専門性や信頼性で、世間一般の考える専門家とは違うのです。

SEOというのもプログラミングの一つとして認識されつつあります。独特の記法が必要であり、法人向けのWEBサイトでは以前よりも高度なインデックス知識とマークアップの記法が必要になります。

E-A-TはSEOとも絡む分野です。Google検索というアルゴリズムが生み出す産物で、さまざまな表記上の問題があります。そもそもGoogle検索というプログラムの中で、E-A-Tはそのうちの一つに過ぎないのです。例えば<a href="https://stamp-purchase-value.net/memorial-stamps-special-postage-purchase-price-list/" >記念特殊スタンプの査定額</a>というのはどのようなアルゴリズムで判定するのか。

プログラムは複雑でブラック・ボックス。しかも複数のエンジニアの手に渡っていてゲシュタルト崩壊している。昨今の検索結果が好ましいものではないという意見が聞かれても、Googleの考える検索結果を推し進めています。
Nuxt モジュールモードでStore階層化できるやんけ!!!(全ギレ)

## 何?
Nuxt で、Vuex Store をディレクトリ構造で階層化したかった。

けどできないと思ってた。

でも実はできたので自分にキレてる。

## 試した
### 環境
- nuxt: v2.8.1

### ディレクトリ構造
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319527/c94dfd6b-4b0d-8ee4-bbbf-a70e8297237f.png)


### コード
#### ~/store/a/b/c/c-child.js
```js
export const state = () => ({
  test: 'c-child',
  hoge: 'piyo'
})

export const actions = {
  testAction({ commit }) {
    commit('setTest', 'actionしたよ')
  }
}

export const mutations = {
  setTest(state, payload) {
    state.test = payload
  }
}
```

#### ~/pages/index.vue
```vue
<template>
 <div />
</template>

<script>
export default {
  async fetch({ store: { dispatch } }) {
    await dispatch('a/b/c/c-child/testAction')
  }
}
</script>

```

### 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319527/200eedca-ab44-3f81-7f84-9901c1feb17f.png)


## できると何が良い?

- 肥大化したstateの分割
- ドメイン別のディレクトリ構成による管理

## 気を付けたいこと
ディレクトリ名とstate名が被らないようにしないといけない


## なぜできないと思っていたのか
わかりません......
でもやっているのを見たことがなかったので......
信じてください......

## 責任逃れ
https://ja.nuxtjs.org/guide/vuex-store/
書いてないから私は悪くない、悪くないんだ
Ruby on Rails 　良くあるエラー(随時追記）

## gemに追記した後、```bundle install```をしないと発生する
対処方法:
railsのサーバを再起動すれば良い。
![スクリーンショット 2019-07-31 14.14.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417196/b86204f6-755d-8855-fcb9-7cd9d4eb38cb.png)

##  Routing Errorが起こった時
対処方法:
要はマッチするルーティングがないと言っているのでroutes.rbを確認する。
次にviewに記述したルートが正しく記述されているか確認する。
![スクリーンショット 2019-07-31 15.00.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417196/6571be86-5be7-8ef8-d9a0-11a7d74b763b.png)

## 　SassC::SyntaxError in List#new　　４章−１ Trello風ToDoタスク管理アプリを作成しよう！【Rails】で出現したエラー
application.scssに```@imoprot "list/new"```を追加して、/list/newにアクセスすると以下のようなエラーが出現。railsのサーバを再起動しても、ダメだった。よくよく見るとListフォルダの中にnew.scssをいれていないだけだった^^;
![スクリーンショット 2019-08-01 15.33.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417196/2864d6f6-c2ea-4aaa-8bb5-bc679004e024.png)

## 引数の数が間違っている時におこるエラー 
今回の場合 `users_controller.rb` で```def update(user_params)```という引数がおかしかったため発生した。
![スクリーンショット 2019-08-12 19.33.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417196/d80ee204-1784-5f1a-a580-284cc07430e8.png)

## controllerの最初の記述が間違っていたので発生したエラー
`class ItemController < ApplicationController`と書いてしまい発生した。正しいのは `class ItemsController < ApplicationController`
![スクリーンショット 2019-08-15 18.07.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417196/9b205631-3103-8b2d-8456-829a6f8c6eec.png)

## controller.rbのclassの定義のところで末尾に全角のスペースが入っていた。
参考にした記事 [uninitialized constant ~~Controllerについて](https://teratail.com/questions/136606)
![スクリーンショット 2019-08-15 18.54.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417196/e96986bf-4b3c-3625-7df1-e9feefabc67e.png)

## rake db:migrateができていない時に発生する
自分の場合はmigrationファイルにカラムを追加したが、そこに誤字があったためうまくmigrateできていなかった。

![スクリーンショット 2019-08-16 16.43.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417196/e94002d6-e23f-fcb3-51ba-cbef04d24414.png)

## activeadmin　のgemをインストールして `rails generate active_admin:install` を実行したところ起こったエラー。エラーとしては `The asset "active_admin.css" is not present in the asset pipeline.`となっており、アセットパイプラインにactive_admin.cssがないですよという状態になっている。
解決方法はactive_adminの公式サイト参考に `rails generate active_admin:asset` を実行。[active_admin公式サイト](https://activeadmin.info/0-installation.html)
![スクリーンショット 2019-08-16 16.55.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417196/f9acff26-6f15-6e28-7cd5-140e70934842.png)
Trello風ToDoタスク管理アプリを作成しよう！【Rails】キーワードを備忘録として

## bundlerとは
bundlerとはgemどうしの互換性を保ちながらパッケージの種類やバージョンを管理してくれる仕組みのこと.
つまり開発していくとたくさんのgem（ざっくりいうとRubyのライブラリ用パッケージ管理ツール）を入れることがあるが、それらをコンフリクト起こさないように管理してくれるツール。

## gemとは

## homebrewとは

## bundle installとは

## ストロングパラメータとは
指定していないパラメータを受け取るのを禁じる。外部に公開する必要のない情報を誤って公開してしまうのを防ぐために行う。
deviseではデフォルトでメールアドレスとパスワードはストロングパラメータが設定されている。

## なんでストロングパラメータはcontrollersディレクトリの中のapplication_controller.rbに書くのだろう？

## ```<p class="acountPage_link"><%= link_to "アカウントにサインイン", new_session_path(resource_name) %></p>```の```new_session_path(resource_name)```とは

## config/locales/ja.ymlについて　ja.ymlにlocalの言語環境設定を日本語で記述するように設定

## foregin_keyとは
初学者がpositionについて調べてみた

#はじめに
[未来電子テクノロジー](https://www.miraidenshi-tech.jp/intern-content/program/)でインターンをしている大嵜です。
前回は、ProgateのHTML初級編を学習して感じた点をまとめました。
今回は、同じくProgateのHTML中級編を学習して疑問に感じた点をまとめます。
プログラミング初心者であるため、内容に誤りがあるかもしれません。
もし、誤りがあれば修正するのでどんどん指摘してください。

#positionについて
positionとは、要素の位置を決めるためのCSSプロパティです。

```
position: absolute;
```
のように書きます。
`absolute`のところには、`relative`や`fix`が入ることもあります。

##位置の決め方
`position`と一緒に`top`、`bottom`、`left`、`right`のうちの2つを用いることが多いです。
これらを用いて、基準からどれだけ移動させるかの指示を出します。

```
.box{
  top: 20px;
  right: 15px;
}
```
つまり、このような場合は、基準点から下に20px、右に15px移動させるということになります。

##relativeとabsolute
`position: relative;`は現在の位置から相対的に移動させるときに使います。
`position: absolute;`は親要素に基準に絶対的な位置に移動させるときに使います。
`absolute`は絶対的な位置であるため、親要素との間に他の要素が入っていても、表示は変わりません。
また、`absolute`を用いるときは、セットで親要素に`relative`を用いることを覚えておきましょう。

##fixed
`fixed`は画面の決まった位置に固定させるときに使います。
スクロールしても位置が変わらないメニューバーなどによく使われます。
`absolute`と似ていますが、`fixed`は画面全体が親要素の役割を果たしています。

#まとめ
実際に1からプログラムを書いていくと、どの要素に`relative`をつければいいのか、基準がどこにあるのかわからなくなることがあります。
その度に、基礎を思い出して理解を定着させることが重要だと考えました。
また、メモとして先にpositionだけ決めておくのも良いと思います。
Mint LinuxでBaffalo LinkStationのマウント

#結論

オプションにvers=2.0を追加する。

```
mount -t cifs //192.168.xxx.xxx/XXXX /mnt/XXXX -o username=XXXX,password=XXXX,dir_mode=0777,file_mode=0777,vers=2.0,iocharset=utf8
```
/etc/fstab 記載例
domain=XXXXも動作した。

```
//192.168.xxx.xxx/XXXX /mnt/XXXX cifs username=XXXX,password=XXXX,domain=XXXX,iocharset=utf8,vers=2.0,defaults 0 0
```

#使用したLinkStation
**LS210D (LS210D3FF) Version 1.70-0.01**

古い機種のためvers=2.0が必要で、新しい機種は不要なのかもしれない。
mrubyでambient

mruby on YABMは4種類あるので、せっかくなのでambientも試してみました。

https://github.com/yamori813/admbm-mruby/blob/master/samples/ambient.rb

![スクリーンショット 2019-07-31 13.56.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/8f5472c0-f5e8-05de-ff0b-2c911187c763.png)

[mruby-yabmのdummy](https://qiita.com/yamori813/items/81b4094fa414168d1a20)でも実行できます。

現在

[bcmbm-mrubyがThingSpeak](https://qiita.com/yamori813/items/7ef6e2af5a33251d2ced)
[rtlbm-mrubyがMachinist](https://qiita.com/yamori813/items/94907d187ce0c00cc6f1)
[ksbm-mrubyがM2X](https://qiita.com/yamori813/items/60629604498f6b69b9f2)
admbm-mrubyがAmbient

にデーター放り込んでいます。
Xcodeで実機ビルド時に出る「A valid provisioning profile for this executable was not found.」の特殊解決策パターン

## あらすじ
久しぶりにアプリを修正しますか・・・といった時にそれは突然訪れる。
**`A valid provisioning profile for this executable was not found.`**
チッ、出やがったな！Provisioning profile...
秒で解決して魅せるッッ！！！！

## まずやったこと
という茶番は置いておいて。
とりあえず調べて出てきた内容を一通り試してみます。

- Automatically manage signingのチェックOFF->ON
 - 結果：失敗
- Clean Build -> Xcode再起動
 - 結果：失敗
- 実機に入っている同じアプリを一度削除して実行
 - 結果：失敗
- MacとXcodeとiPhoneの再起動して実行
 - 結果：失敗
- File -> Workspace Settings... からBuild Systemを Legacy Build System にしてみる
 - 結果：失敗
- Provisioning profileの確認と ~/Library/MobileDevice/Provisioning Profiles/ から全てのプロファイルを削除して再ダウンロード
 - 結果：失敗
- 最終奥義、上記のやつ全部やり直してみる
 - 結果：失敗

~~全滅お手上げもうどうにでもな〜れ！~~

試してる間に何度か別のエラーである
**`Could not write to the device.`**
に変わったりしましたが結局インストール出来ず。

他端末ならどうだろう？
と思いインストールしてみると...
**インストール成功！**

ということは何か端末に問題があるのか？
と思い少し端末を弄っているとあることに気づきました...

日付が「2020/08/11」になっていたんです。
~~お前...未来から来たのか・・・？~~

そういえば！
とあるアプリの検証で日付を未来に設定していたのを忘れていました。
**それを戻すとうまくインストールすることが出来ました！**

恐らくProvisioning Profileの有効期限外の日付が端末に設定されているとインストールに失敗するようです。

まるでProvisioning profileが悪いかのようなエラーだったのでなかなか気付かず。
1時間無駄にしました！
~~Appleと~~日付を戻し忘れた自分許さぬ。

## 結論
日付は変えたら戻す。
gitでブランチ名にyyyymmddhhssを含めたい

# ブランチ名にyyyymmddhhssを含めたい

```bash
eval "git checkout -b refactor_$(date '+%Y%m%d%H%M%S') origin/master"
```

eval コマンド便利ですね。

他にもっと良い方法ご存知でしたら教えていただけますと幸いです。
転職(5) 各国別、日本で働く時の面接での回答案

面接で聞かれたこと(未経験からエンジニアを目指す方へ)
https://qiita.com/tomokichi_ruby/items/a2ddd60a9eaec433749f

のコメント欄で、
@Hyman1993　さんが面接で聞かれたことに、

>１．何故日本に行きたいですか
２．日本に来て、一番好きなことは何ですか

と書かれていました。

自分の知っている範囲での各国別解答案を作ってみます。

1. の質問への回答は、いろいろな方からこれまで意見をもらったことがあったので想像ですが、書かせていただきました。少なくとも、１人の日本人はそれを聞いて納得したという例。他の人が納得するかどうかは未保証。

2. の質問は、自分で聞いたことがなく、料理以外のことはかけませんでした。ごめんなさい。

在留外国人統計（旧登録外国人統計）2018年12月(2019-07-25公開）
https://www.e-stat.go.jp/stat-search/file-download?statInfId=000031832809&fileKind=0
に基づいて、多い順です。

上位１２カ国・地域の方とは面談させていただいたことがあります。

１２カ国以外では、マレーシア、シンガポール、アルゼンチン、メキシコ、カナダ、フランス、スペイン、イタリア、スイス、オーストリア、ドイツ、イギリス、アイルランド、アイスランド、ルクセンブルグ、オランダ、デンマーク、フィンランド、スウェーデン、ロシア、オーストラリア、ニュージーランド、南アフリカと仕事のお話をしたことがあります。

なお、IT業界と飲食店、人材派遣関係の仕事以外での情報交換はしたことがなく、かなり偏っています。
そんな人もいるんだくらいの参考にしていただけると幸いです。

記載していることは、半世紀前からの経験で、現在有効な事実とは関係ないかもしれません。
現時点での情報ではなく、歴史的記録としてお読みください。

# 1. 中国

1. アメリカに行く資金がない
　　アメリカの情報が氾濫していてアメリカのことも一緒に学べる
　　漢字で理解できる

2. 中華料理屋がいっぱいある
　　同胞がいっぱいいる

# 2.韓国

1. NHK衛星放送を見ていて日本の文化をよく知っている
　アニメ、ゲームは日本製のもので遊んでいた

2. 韓国料理屋がいっぱいある
　同胞がたくさんいる

# 3.ベトナム

1. 日本はベトナムに親切だから
　　アメリカとの戦争の時、支援してくれた

2.　米の料理がいっぱいある

# 4. フィリピン

1. 一番近い先進国。
   日本の会社がフィリピンに進出していて知っていた。

# 5. ブラジル
1. 日系人だから
　　同胞がいっぱいいる

2. 食べ物が美味しい。
　　陽気に暮らしても咎められない。

# 6. ネパール
1.文化的に近く、親しみが持てる。

# 7. 台湾
1. 日本と文化の交流が深く、生活になじみやすい
　　漢字で理解できる

# 8.米国
1. アメリカが占領している。
　　義務教育から英語を勉強しているらしい。
　　英語の表記がいっぱいあるらしい。

2. 日本文化に生で触れられる

# 9. インドネシア

1. いろいろな文化を許容する

# 10.タイ

1. 仏教寺院がいっぱいある
　 タイと同じように礼儀を重んじてくれる
　　日本に仏様のお骨をさしあげたことがある。

2. タイに進出している企業で直接仕事ができた。

# 11. ペルー

1. スペイン語と同じ発音の言語でしゃべれる
　日系人だから
　
2. カラオケで 歌える

# 12.インド

1. アメリカ、中国以外で手ごろに学べる

2. インド・ネパール料理屋が多い。
### 最後までおよみいただきありがとうございました。

いいね　💚、フォローをお願いします。

#### Thank you very much for reading to the last sentence.

Please press the like icon 💚　and follow me for your happy life.
第4回 ドワンゴからの挑戦状 予選 C - Kill/Death

#第4回 ドワンゴからの挑戦状 予選 C - Kill/Death


https://dwacon2018-prelims.contest.atcoder.jp/tasks/dwacon2018_prelims_c

分割数やそのほかの場合の数を事前に作ってから行った。

```python

from collections import Counter
from itertools import combinations
from math import factorial


a, b = list(map(int, input().split()))
a_score = list(map(int, input().split()))
b_score = list(map(int, input().split()))


def n_same_k_different(n, k):
    ans = []
    if k == 1:
        return [[n]]
    for i in range(n+1):
# n個の玉は区別せず、k個の箱だけ区別する関数。
        for j in n_same_k_different(n-i, k-1):
            ans.append([i]+j)
    return ans


def divide_combination(n, k):
    dp = [1] * (n + 1)
    for i in range(1, k):
        for j in range(i+1, n+1):
            dp[j] += dp[j - i -1]
    return dp[-1]


def combi(score_list, n):
    cnt = Counter(score_list)
    box_divide_list = n_same_k_different(n, len(cnt))
    combi_list = [
        np.prod([divide_combination(inner[i], list(cnt.values())[i]) for i in range(len(inner))]) for inner in box_divide_list]
    return sum(combi_list)



print(combi(a_score, sum(b_score)) * combi(b_score, sum(a_score)))
```
Dockerでcomposerのinstallが弾かれる

## やりたかったこと
docker-composeでLaravelの環境を作りたかった。

## 起きたこと
DockerFileやdocker-compose.ymlになんの変更も加えていないのに急にビルドが通らなくなった

### エラーメッセージ

```bash
Step 6/13 : RUN php composer-setup.php
 ---> Running in 67d016a43b56
Could not open input file: composer-setup.php
ERROR: Service 'php' failed to build: The command '/bin/sh -c php composer-setup.php' returned a non-zero code: 1
```

どうやらcomposerのインストール周りでなにか問題が発生しているらしい。

## 解決策
[Composerのサイト](https://getcomposer.org/download/) を見に行くと、インストール時のハッシュ値がいつの間にか変わっていた（バージョンアップによると考えられる）ので、Dockerfileのcomposerをインストールする部分を変更した。

```diff
- RUN php -r "if (hash_file('sha384', 'composer-setup.php') === '48e3236262b34d30969dca3c37281b3b4bbe3221bda826ac6a9a62d6444cdb0dcd0615698a5cbe587c3f0fe57a54d8f5') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('    composer-setup.php'); } echo PHP_EOL;"
+ RUN php -r "if (hash_file('sha384', 'composer-setup.php') === 'a5c698ffe4b8e849a443b120cd5ba38043260d5c4023dbf93e1558871f1f07f58274fc6f4c93bcfd858c6bd0775cd8d1') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('    composer-setup.php'); } echo PHP_EOL;"
```

この方法だとComposerのバージョンが変わるたびにDockerfileをいじらないといけないので、なにか良い方法があればコメントなどで教えて下さい。
Androidスマホの内部ストレージをSDカードで拡張する

プログラミングじゃないけどいいのかな・・・

## 用意
Androidスマホ（自分のはSH-M08）
- microSDカード（フォーマットしておく。入っているデータは全部消える）
Mac
- Android Studio（PCにインストール）
- ターミナル（自分はiTerm2）
USBケーブル（スマホとPCをつなぐもの）

## ざっくり説明
1. MacにAndroid Studioをインストールする
2. Android Studioでスマホに対応したSDKを使えるように設定する
3. スマホの開発者オプションを有効にする
4. 開発者オプションでUSBデバッグを有効にする
5. Macとスマホをケーブルで繋ぐ
6. ターミナルでadbを使えるようにする
7. ターミナルでコマンド実行

### 1. MacにAndroid Studioをインストールする
[公式サイト](https://developer.android.com/studio/index.html)からダウンロードしてインストール

### 2. Android Studioでスマホに対応したSDKを使えるように設定する
Android Studioを起動し、"Configure"から"SDK Manager"を選択
<img width="390" alt="スクリーンショット 2019-07-31 13.15.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70195/7f816665-68c6-0450-dff4-096781e53d30.png">
スマホのAndroidのVersionに対応したSDKをチェックしてOKする
<img width="1124" alt="スクリーンショット 2019-07-31 13.18.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70195/664a3fab-2b76-ad5f-0cb5-61331509d23b.png">

### 3. スマホの開発者オプションを有効にする
[参考サイト](https://usedoor.jp/howto/digital/android-smartphone/kaihatsusha-developer-option-hyouji-mukouka/)
スマホの"設定"から"システム - 端末情報"を開き、"ビルド番号"を７回連続でタップして"開発者オプション"を有効にする

### 4. 開発者オプションでUSBデバッグを有効にする
スマホの"設定"から"システム - 開発者向けオプション（詳細設定を開くとある）"からUSBデバッグをONにする

### 5. Macとスマホをケーブルで繋ぐ
充電専用ではなくデータ転送できるタイプのものじゃないとダメ

### 6. ターミナルでadbを使えるようにする
Macでターミナルを立ち上げて以下のコマンドを打つ

```
$ vi ~/.bash_profile
```

開かれたファイル内を以下のように編集して保存
（2に添付されているSDK Managerの"Android SDK Location"に「記載されている箇所/platform-tools」を追記する）

```
export PATH=($PATHなど何か書かれていると思うので、それに追加する):/Users/ユーザー名/Library/Android/sdk/platform-tools
```

コマンドでadbが使えるか確認
（"adb: command not found"だったら上記のexportの内容が間違っている可能性大）

```
$ adb
```

### 7. ターミナルでコマンド実行
以下のコマンドを打つ

```
$ adb shell
```

shellの入力待ちになるので続けて打つ

```
sm list-disks
```

「disk:179,64」のような文字が出力されるので、それを利用して

```
sm partition disk:179,64 private
```

のように打つ（「disk:179,64」の部分は自分のものに変更する）
以上で完了！

## 確認
スマホの設定からストレージを確認
外部ストレージではなく"端末のストレージ"として認識される
![スクリーンショット 2019-07-31 13.41.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70195/2c2506b7-51b7-8a1a-20b6-6aeae9765cf8.png)

## 参考にしたサイト
[【Android】『開発者向けオプション』を表示/無効化する方法 – 利用できる項目まとめ](https://usedoor.jp/howto/digital/android-smartphone/kaihatsusha-developer-option-hyouji-mukouka/)
[Macでadbコマンドを使う方法! Android Studioを入れてmacOSのターミナルから操作しよう](https://sp7pc.com/google/android/17843)
[AndroidでSDカードを内部ストレージ化してアプリを移動する方法! adbですべての機種の容量不足を解消しよう](https://sp7pc.com/google/android/24933)


2019/09/30 追記

アプリを移動してしばらく使ってみたけど起動は遅いし、端末の再起動が突然起こったりする
最終的にはアプリの起動中に再起動が起きて、そのままSDカード認識しなくなって、
アプリ全滅・・・

こりゃダメじゃ
[Android]ボタン選択時に背景画像とテキスト色を同時に変更する方法

つまり以下の様なことがやりたい

[![Image from Gyazo](https://i.gyazo.com/695478caf8de5c099dc932de1bcb26e6.gif)](https://gyazo.com/695478caf8de5c099dc932de1bcb26e6)

ボタン選択時の背景画像を変更し、同時に文字の色を白にする。

```xml
<Button
    android:id="@+id/r_time_5"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="5分以内"
    android:textColor="@drawable/refine_button_selector"
    android:background="@drawable/refine_button_selector"/>
```
上記のように、textColorとbackgroundにselectorを記載したファイル名を指定しておく

---

refine_button_selector.xmlにて、「state_selected」を設定し、選択中かそれ以外かを判定できるように。drawableに画像、colorに文字色をそれぞれ設定する


```xml:refine_button_selector.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/select_btn_off" android:color="@color/black" android:state_selected="false" />
    <item android:drawable="@drawable/select_btn_on" android:color="@color/white" android:state_selected="true" />
</selector>

```
---
あとはonClickで処理してやるだけ

```java
rTime5 = findViewById(R.id.r_time_5);
rTime5.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        v.setSelected(!v.isSelected());
        if(v.isSelected()){
            //・・・選択時に行いたい処理・・・
        }
    }
});
```

たまに実装しようとした際に迷うので備忘としてあげておきます
場合の数(1)〜箱を区別する場合、しない場合

n個の要素をk個にグループ分けする組み合わせの問題は、全てn個の玉をk個の箱に入れる組み合わせの問題と本質的に同じとみなすことができる。そのため、以下ではこうした場合の数を全てn個の玉とk個の箱の問題として考える。

n個の玉をk個の箱に入れる場合の数は、状況によって12パターンの問題設定が考えられる。
これらの12パターンのそれぞれの場合の数の求め方については、以下のサイトが詳しい。
[写像の個数（写像12相）](https://mathtrain.jp/twelveway)

>n 個の玉を区別するのかしないのか，k 個の箱を区別するのかしないのかで4通りの問題設定が考えられます。さらに，条件として，
1：何も条件がない場合
2：全ての箱の中身が一つ以下
3：全ての箱の中身が一つ以上

>という3つの条件が考えられ，全部で12通りの問題設定が与えられています。

僕が勤しんでいる競技プログラミングでもこれらの12通りの問題に帰着できる場面は多い。
その際、全組み合わせを列挙できる関数があれば便利だと思ったので、これらのパターンのいくつかについて関数を作成した。

# n個の区別しない玉をk個の区別する箱に入れる組み合わせ

n+1のしきいを入れるスペースからk-1個を選ぶ問題に帰着できる（1枚しきいを入れるたびにスペースは1増える）ので、数式としては$_{n+k-1}\mathrm{C} _{k-1}$として表せる。
全組み合わせを列挙する関数は以下の通り。

```python
def n_same_k_different(n, k):
    ans = []
    if k == 1:
        return [[n]]
    for i in range(n+1):
# n個の玉は区別せず、k個の箱だけ区別する関数。
        for j in n_same_k_different(n-i, k-1):
            ans.append([i]+j)
    return ans

n_same_k_different(3, 2)
```
```python
[[0, 3], [1, 2], [2, 1], [3, 0]]
```

# n個の区別しない玉をk個の区別しない箱に入れる組み合わせ

n個の区別しない玉をk個の区別しない箱に入れる場合の数は分割数といい、これを簡単に数式で表現する方法はない。
漸化式としては、nをkで分割する組み合わせ総数をを$P(n, k)$とすると、

1. 0が含まれる場合、0を除いた組み合わせ総数なので、$P(n, k-1)$と等しい。
2. 0が含まれない場合、それぞれから1を引いた組み合わせ総数なので$P(n-k, k)$と等しい。

よって、$P(n, k)=P(n, k-1)+P(n-k, k)$

これも再帰関数で表現できる。

```python
def divide_number(n, k):
    if k == 1:
        return [[n]]
    ans = []
    for i in divide_number(n, k-1):
        ans.append([0] + i)
    if n >= k:
        for j in divide_number(n-k, k):
            ans.append([l+1 for l in j])
    return ans

divide_number(5, 3)
```


```python
def divide_combination(n, k):
    dp = [1] * (n + 1)
    for i in range(1, k):
        for j in range(i+1, n+1):
            dp[j] += dp[j - i -1]
    return dp[-1]
```
組み合わせ数だけ出力。


```python
[[0, 0, 5], [0, 1, 4], [0, 2, 3], [1, 1, 3], [1, 2, 2]]
```

ちなみに。r以上の数が含まれない組み合わせ。

```python
import math
d = 0
def divide_number(n, k, d, r):
    print(d)
    if k == 1:
        return [[n]]
    ans = []
    if math.ceil(n // (k-1)) < r - d:
        for i in divide_number(n, k-1, d):
            ans.append([0] + i)
    if n >= k:
        if math.ceil(n // k) < r - d:
            d += 1
            for j in divide_number(n-k, k, d):
                ans.append([l+1 for l in j])
    return ans
```
```python
def divide_combination(n, k, r):
    dp = [1] * (n + 1)
    for i in range(1, k):
        for j in range(i+1, n+1):
            if i >1:
                if math.ceil(j // (i-1)) > r:
                    dp[j] = dp[j - i -1]
                    continue
            dp[j] += dp[j - i -1]
    return dp[-1]
```
数だけ出力。全てr未満の制約付き。
D3.js TailwindCSS Q&A

Q&Aを作成しましたので、間違っていたり追加して欲しい点などがあれば指摘して欲しいです。

#D3.jsのQ&A

####Q:以下は何を表すか
　`ease("linear")`

####A:一定の速度で動きが変化する

####Q:これは何を表すか
　`ease("quad")`

####A:やや加速度的な動きをする

####Q:これは何を表すか
　`ease("cubic")`

####A:動きが加速していく

####Q:これは何を表すか
　`ease("elastic")`

####A:弾力的な動きをする(ターゲットを一時的にオーバーする)

####Q:これは何を表すか
　`ease("back")`

####A:動きが後半に急速に変化する

####Q:これは何を表すか
  `ease("bounce")`

####A:弾力的な動きをする (ターゲットをオーバーしない)

####Q:これは何を表すか
　`ease("exp")`

####A:指数関数的な動きをする

####Q:これは何を表すか
　`duration()`

####A:プロパティの変更を瞬時に実行するのではなく、指定した期間にわたってスムーズに実行する。
例:`duration（5000）`
これだと5秒かけて指定したことを実行する

####Q:これは何を表すか
　`delay()`

####A:これを使うと、動作を起動するまでに待つ時間が決められる。
例:`delay(2000)`　2秒待つ

####Q:これは何を表すか

```javascript

 var w = 500; // 幅
 var h = 500; // 高さ
 var svg = d3.select("body")
              .append("svg")
              .attr("width", w)
              .attr("height", h);
```
####A:SVG領域の設定

####Q:これは何を表しているか

`<rect/>`

####A:四角形を描画する要素。
主にx,y座標や幅、高さを設定できる。
例

```javascript

<rect x="0" y="0" width="500" height="50"/>
```

####Q:bodyタグにある全てのpタグに、データの数だけd3オブジェクトを作成するにはどう書けばいいか

####A:

```javascript
d3.select('body')
  .selectAll('p')
  .data(a)
  .enter()
```

####Q:円を描画するにはどう書けば良いか?

####A:
`<circle cx="(左からの距離)" cy="(上からの距離)" r="半径"/>`


例

```javascript
<circle cx="250" cy="25" r="25"/>
```

#Tailwind CSS

####Q:Tailwind CSSがBootstrapやFoundationと違う点は?

####A:
**Bootstrap、Foundation**:カードやアラートなどの要素を提供している(UIキット)
**Tailwind CSS**:自分で決めた色をカスタマイズできるように設計できる

####Q:Tailwind CSSでレスポンシブに対応させるには、HTMLにはどうすればいいか?

####A:特別手を加える必要はない。
ただし、機種によって見える様を変えたければ「**sm:justify-start**」というように「**sm:**」や「**lg:**」と記入する

####Q:Tailwindがデフォルトで含んでいない任意の擬似クラスを作成するにはどうすればいい?

####A:「tailwind.config.js」の中の

```
module.exports = { plugins: [] }
```
で[]の中に独自のバリアントプラグインを作る

####Q:「ホバー」や「フォーカス」などの機能は、HTMLではどのように書けば良いか?

####A:機能を書く際に、後ろに「hover:」などと画面サイズによってどうさせたいか書く

例

```html

<button class="bg-transparent hover:bg-blue-500 text-blue-700 hover:text-white"> 
```
ユーティリティに対してバリアントを有効にするかを制御する
tailwind.config.jsの
variants: {  }の中身を確認する

####Q:画面サイズによって異なる動きをさせるには、HTMLにはどう書けばいいか?

####A:機能を書く際に、後ろに「sm:」などと画面サイズによってどうさせたいか書く

例

```html

<div class="bg-red-500 sm:bg-green-500 md:bg-blue-500 lg:bg-pink-500 xl:bg-teal-500"></div>
```
文系学生のプログラミング学習10日目ーPython List Complehensionー


前回に続き、Pythonのリストについて学習しました。
今回は、ListComplehensionというforループなどを使わずにリストを作るものです。

#あるリストから条件にあうものだけのリストを作成

例えば、
```
list = [1,2,3,4,5,6,7]
```
といのがあり、３以上の数字だけのリストを作りたい場合、

```
>>>list = [1,2,3,4,5,6,7]

>>>def function(lst):

...    return([x for x in lst if x >= 3])

>>>function(list)

[3,4,5,6,7]

```


xはリストの中のitemを表し、if文の条件を満たしたxだけ表示されるようになります。
forループを使って書くことも出来ますが、この方法だとコードが短く済みます。
リストに関してはなるべくこの方法を使っていきたいです。
【論文読み】ガウス過程で自動運転

今回、ご紹介する論文は「モデル予測制御 X ガウス過程 X 自動運転」の
事例です。まずは、以下の動画をご覧ください。

<blockquote class="twitter-tweet"><p lang="en" dir="ltr">Gaussian process MPC.... :Learning-based Model Predictive Control for Autonomous Racing <a href="https://t.co/K0h9wTA4Xo">https://t.co/K0h9wTA4Xo</a> <a href="https://twitter.com/YouTube?ref_src=twsrc%5Etfw">@YouTube</a>より</p>&mdash; Atsushi Sakai (@Atsushi_twi) <a href="https://twitter.com/Atsushi_twi/status/1149625046270242817?ref_src=twsrc%5Etfw">July 12, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

とてもうまく自動運転できています。

この研究では、ガウス過程が使われており、「ガウス過程は、試行回数が
少ないという意味で**強化学習より使えそう**」などと考えてしまいましたが、
全く違う分野の研究でした。

結論としては、「サーキットなどの閉じられた環境であれば、強化学習より
使えるかも？」というレベルのお話しでした。

※本稿の図は論文（[Learning-based Model Predictive Control for Autonomous Racing](https://www.research-collection.ethz.ch/bitstream/handle/20.500.11850/351561/08754713.pdf?sequence=1&isAllowed=y)）から引用しています。

#概要
+ モデル予測制御を使った自動運転は、レースカーに**軌道などの目標値を与えてそれに追従させる研究**（モデル予測制御は、[こちら](https://qiita.com/taka_horibe/items/47f86e02e2db83b0c570)を参考にしてください。とても分かりやすい解説です。）
+ しかし、モデル（制御対象の運動方程式）に「誤差」があると、性能が落ちる
+ 「モデルの誤差」をガウス過程で逐一推定することで、常にモデル誤差を更新し、精度良く制御することができる

恐らく、「エンジンの調子」や「タイヤの摩耗状態」など刻一刻と変わるモデル誤差を推定できていると思われます。

#理論
論文では数式が山のように出てきますが、肝となるのは以下の式です。

```math
x_{k+1}=f(x_k,u_k)+B_d(d(z_k)+w_k)
```

+ x:状態量（レースカーの位置や角度など）
+ u:入力
+ $B_d$:~~ムーアーペンローズの疑似逆行列~~
+ d:モデル誤差
+ w:ノイズ

上の式は、時刻kにおける状態($x_k$）や入力（$u_k$）などが分かれば
時刻k+1の状態量($x_{k+1}$）が推定できるというものです。

式を変形します。

```math
x_{k+1}-f(x_k,u_k)=B_d(d(z_k)+w_k)
```

上の式より、実際に時刻k+1の状態量($x_{k+1}$）を得たとして、推定値との差をとる
ことで、モデル誤差に関わる値d+wを取得することができます。ただ、この
モデル誤差は一定ではなく、レースカーの速度や角度によって変動します。

論文では、このd+wをガウス過程で推定しています。

なお、レースカーは自分の位置や角度などを各種センサーから取得しています。

#結果
+ トラック上の速度

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264781/81bb6f34-2030-115c-9f48-91b891a2aae8.png)

上の図は、トラック上のレースカーの速度を表しています。
黄色が強いほど速度が出ており、直線部で速度が出ていることが分かります。

+ モデル誤差

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264781/f10b4e09-94ad-1edd-900b-dd92e65b80b2.png)

上の図はモデル誤差を表しています。黒い点は実際のモデル誤差、青い線は
ガウス過程で推定したモデル誤差です。モデル誤差を高精度に推定できて
います。

+ 通常のモデル予測制御との比較

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264781/9f966b73-17ed-a3aa-11cc-70b765a0bfe8.png)

上の図はガウス過程を使った場合と、使わない場合（通常のモデル予測制御）との比較です。
横軸はスタートラインからの距離、縦軸は速度です。ガウス過程を使う（赤い線）と
速度の向上が認められます。


#感想
+ 少ない試行から回帰式を構築できる「ガウス過程」を応用したうまい研究
+ 個人的には、**リアルタイムでガウス過程を活用する**発想はなかったので、目からウロコだった
+ ロボットやドローンの制御に応用できそう（例えば、ドローンの重さや風の強さが変わっても、精度良く制御できる）
+ あくまでも、モデル誤差を推定して性能を向上させる研究なので、PID制御やモデル予測制御で「ある程度」うまくいって事例であれば、適用しても効果は少ないと思われる。
ソートに対する理想と現実(スターリンやAbeから)

※ [メインのブログにてエントリを作成しました](https://blog.fuga.jp/?p=4440)、よかったらご覧くださいませ。

最近「[スターリンソート](https://qiita.com/search?q=%E3%82%B9%E3%82%BF%E3%83%BC%E3%83%AA%E3%83%B3%E3%82%BD%E3%83%BC%E3%83%88)」とか「[Abeソート](https://qiita.com/search?q=Abe%E3%82%BD%E3%83%BC%E3%83%88)」とか流行ってる(?)ので、うろ覚えでアレだが「コミューンソート」というものを設計してみました。ちゃんとソートされてるのでアルゴリズムとしては成立してるはずです(ぉぃ)

O(n)記法だとどうなるのか? そんなのは国(どこ)に聞いてください。粛清はしてません、ソートの素材がなくなりますから。

※ なお、なにが「コミューン」なのかについては、詳しくはよくわかってません、ふんわりすぎます。そのあたりはご留意ください。


```ruby
def ideal(list)
  [list.sum.fdiv(list.size)] * list.size
end

def real(list)
  [0] * (list.size - 1) + [list.sum]
end

list = [3, 5, 2, 7, 9, 10, 50, 1, 5, 20]
p list, ideal(list), real(list)                               
```

※ [scivola](https://qiita.com/scivola)さんありがとうございました、sumなんてあったんですね… 私のRuby知識…古すぎ?

`real()`は一番金持ちのところに集約されるかということも考えられるのですが、ソートにならないので最後にしてます。それとも降順ソートにすべき?
Rails6 のちょい足しな新機能を試す60（word_wrap編）

# はじめに

Rails 6 に追加されそうな新機能を試す第60段。 今回は、 `word_wrap` 編です。
Rails 6 では、 `word_wrap` 時に元のテキストのインデントが適切に保持されるようになりました。

Ruby 2.6.3, Rails 6.0.0.rc1, Rails 5.2.3 で確認しました。Rails 6.0.0.rc1 は `gem install rails --prerelease` でインストールできます。

```shell
$ rails --version
Rails 6.0.0.rc1
```

適当な文章を `word_wrap` で整形して表示してみます。

# Controller を作る

Controller と View を作ります。

```shell
$ bin/rails g contorller home index
```

# HomeHelper を修正する

`HomeHelper` module に `word_wrap_message` を追加します。
`word_wrap_message` の中で、 `word_wrap` を使ってメッセージを整形します。

```ruby:app/helpers/home_helper.rb
module HomeHelper
  def word_wrap_message
    msg = <<~MSG
        This is a multiline message.
        This is a second line of second paragraph. This is a second line part 2
      of second paragraph.
        This is a third paragraph. This line is a part 2 of third paragraph.
    MSG
    word_wrap(msg, line_width: 40)
  end
end
```

# View を修正する

View に word_wrap_messag

```erb:app/views/home/index.html.erb
<h1>Home#index</h1>

<pre>
<%= word_wrap_message %>
</pre>
```

# rails server を実行する

```shell
$ bin/rails s
```

# ブラウザで確認する

http://localhost:3000/home/index を表示します。

期待通りのインデントで表示されています。
![rails6wrap.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209941/292c582c-f509-7c94-b726-146545bd90ef.png)

# Rails5 では

以下のように表示されてしまいます。
![rails5wrap.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209941/a920dbbb-d696-6714-026d-7335a64cc4dd.png)

# 試したソース

試したソースは以下にあります。
https://github.com/suketa/rails6_0_0rc1/tree/try060_word_wrap

# その他

文章がおかしいとか間違っているとかそういうところは、優しく見逃してやってください :bow:

# 参考情報

* [What is new in Rails 6.0](https://bogdanvlviv.com/posts/ruby/rails/what-is-new-in-rails-6_0.html)
* [Prevent TextHelper#word_wrap from stripping white space on the left side of long lines; Fixes #34487](https://github.com/rails/rails/pull/34488)
文系学生のプログラミング学習9日目ーPythonのリストー



今日はPythonでリストの学習をしました。リストについてはscratchで学習していたので、とっつきやすかったです。違いはindexだけですかね。Scratchではリストのはじめが１なのですが、Pythonは0が最初です。

#リストの最初の奇数をリストの最後尾に移す

タイトルのとおりです。すべての奇数ではなく、１番最初だけです。

```
def push_first_odd_back(lst):
    for i in range(0, len(lst)):
        if lst[i] % 2 == 0:
            pass
        else:
            item = lst[i]
            lst.pop(i)
            lst.append(item)
            break
```


.pop()は()内にindexを入れるのに対し、.append()はitemを入れるので、item = lst[I] としてから、.pop(),.append()としました。
何もしないとループしてしまい、すべての奇数に対してfunctionしてしまうのでbreakでスクリプトを終了させました

#リスト内のリストを１つのリストに結合する

例えば、
list = [[1,2,3], [4,5], [6,7]]というようにリストのなかにあるリストを１つに結合して、
new_list = [1,2,3,4,5,6,7] とするコードを書きます。

```
def flatten(lst):
    x = []
    for item in lst:
        x.extend(item)
    return(x)
```
.extend()を使って新たなリストxにitemを追加します。

データを扱う上でリストを扱えるかは重要になると思うので、さらに勉強します。

終わり
slackcatのインストールと使い方

isuconに向けてチームでの情報共有
isucon8の予選の環境を想定

# slackcatの使い方

## インストール
### linux
```
sudo yum install -y wget
wget https://github.com/vektorlab/slackcat/releases/download/v1.6/slackcat-1.6-linux-amd64 -O slackcat
sudo mv slackcat /usr/local/bin/
sudo chmod +x /usr/local/bin/slackcat
echo export PATH='/usr/local/bin:$PATH' >> ~/.bash_profile
source ~/.bash_profile
```
### macos
```
brew install slackcat
```

## 設定
```
slackcat --configure
```
まずはチーム名を聞かれる

```
nickname for team:
```
適当に入力し、enterを押すと下記のような内容が出力される

```
slackcat Creating token request for Slackcat
slackcat Use the below URL to authorize slackcat if browser fails to launch
slackcat http://slackcat.chat/configure
token issued:
```
最後の行のurlにアクセスすると、アプリケーションの連携確認画面が出て、認証するとトークンが表示される
そのトークンを `token issued:` に貼り付ける

以上で設定は完了

## 実行
### 基本構文
```
出力したいデータ | slackcat --channel [チャンネル名]
```
### 例
```
sudo pt-query-digest /var/lib/mysql/ubuntu-xenial-slow.log | slackcat --channel 進撃のかわつ
```

### オプション
使いそうなやつだけ解説

| オプション    |  説明   |  引数   |
| --- | --- | --- |
|  --tee, -t   | slackに投稿する前にコマンドラインに内容を出力    | ×    |
|  --stream, -s   | ストリームモードで送信する    |  ×   |
|  --channel, -c   | チャンネル指定    |   チャンネル名  |
|  --filename, -n   | ファイル名指定    |   ファイル名  |
|  --plain -p    | プレーンテキストで出力 -sとの同時使用でしか使えない    |  ×   |
|  --noop   |  テスト投稿　エラーが出なかったら成功的な   |  ×   |


`~/.slackcat` でデフォルトチャンネルを指定することもできる
```~/.slackcat
default_channel = develop
```
【Cloud9】ローカル環境はSQLite、本番はPostgreSQLにする設定

開発環境をCloud9で本番環境をHerokuにする場合に、ローカル環境はSQLite、本番はPostgreSQLにする設定方法です。

##Gemfileの設定

###sqlite3をコメントアウト

```Gemfile.
#gem 'sqlite3', '~> 1.3.6'
```

###group :development, :test doに1行追記する

```Gemfile.
group :development, :test do
  # Call 'byebug' anywhere in the code to stop execution and get a debugger console
  gem 'byebug', platform: :mri
  gem 'sqlite3', '~> 1.3.6'  #←追記する1行
end
```

###group :production doを丸ごと追加

```Gemfile.
group :production do
  gem 'pg'
end
```

###bundle installを実行
without puroductionはPosgreSQL がローカルにないために付ける
アプリケーションルートから実行した

```ターミナル. 
$bundle install --without production
```

##database.ymlの設定変更


```config/database.yml-変更後
production:
#半角スペース２個分の空白を開ける
  <<: *default
  adapter: postgresql
  encoding: unicode
  pool: 5
```

##config/environments/production.rbの設定

```config/environments/production.rb 
#デフォルトでfalseとなっている以下の箇所をtrueに変更
  config.assets.compile = true
```
なにも分からないなりにVPNとSSHとTeraTermを調べて、使えるようになりたかった。

##経緯と参考リンク
###経緯
職場でVPNの課題が与えられました。
そもそも、VPNってなあに？から始まり、最終的なゴールは指定のサーバーへVPN接続をする、です。

しかしVPNやその周辺調べるうちに、頭がとっ散らかり、重要な箇所がよく分からなくなってしまいました。
整理するため、こちらに残します。

初歩的な情報しかないです（´・ω・｀）…。
接続方法やもっと具体的な説明は他の記事へお願いします。
もろもろ、ご指摘くださると嬉しいです。
###参考サイト
以下参考にしたサイトです。
[5分で絶対に分かるVPN](https://www.atmarkit.co.jp/ait/articles/0204/27/news003.html)
[VPNとは](https://www.arteria-net.com/business/about_vpn/)
[VPNの意味や目的とは？VPNの基礎を知ろう！](https://www.gate02.ne.jp/column/30/)
[VPN覚書](https://qiita.com/kojocho/items/fcffbc6fad42001731f8)
[VPNの導入で必要となる機器とは](https://www.ntt.com/business/services/network/internet-connect/ocn-business/bocn/knowledge/archive_22.html)
[IP-VPNとは](https://www.otsuka-shokai.co.jp/words/ip-vpn.html)
[インフラエンジニアじゃなくても押さえておきたいSSHの基礎知識](https://qiita.com/tag1216/items/5d06bad7468f731f590e)

##VPNとは

Virtual Private Networkの略
安全な通信を可能にする仮想の専用線をつなぐような技術のこと。
パブリックネットワーク上で、盗まれず、改ざんなどされずに情報をお届けできる。メリットは、1対多の接続が可能なこと。安価にセキュリティーを高くできること。デメリットは、まだ見当たらない。

####VPNは大きく分けて二種類ある。
①インターネットVPN
インターネットのアクセス回線を利用する。
安いがセキュリティ面ではIP-VPNに劣る。
主に暗号化の技術で情報を守る。

②IP-VPN
Internet Protocol　-　Virtual Private Networkの略。
通信事業者が独自に保有する閉じたネットワーク（閉域網）を利用する。閉域VPNともいう。高いがセキュリティ面はばっちり！
主にユーザーごとに分離されたVPN網を構築する技術で情報を守る。（MPLSと呼ばれる技術だそうです、）

####VPSではない。
VPNを調べていると、はて？違和感を覚えました。サイトのタイトルをよく見たら、あ！VPSだ！VPNではなく！VPなSだ！こりゃ違う！
となりましたのでメモです。
>VPSとは団地方式でレンタルされているコンピュータ（レンタルサーバ）のこと。もう少し具体的に書くと1台のサーバを複数の人で使うけど利用者同士が（あまり）影響しあわない形態になっているレンタルサーバのことです。なんちゃって専用サーバと呼んでも良いかもしれません。
[「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典](https://wa3.i-3-i.info/word1113.html)

調べているのは、安全に機密文書などを指定したサーバーにつなげたい方法、としてのVPNです。
VPSはサーバーそのもののようなので、違います。
##TeraTermとは
>telnetやSSHで接続をするときによく使うソフト
[「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典](https://wa3.i-3-i.info/word12679.html)

なるほど。ルーターやその他機械の工程を吹っ飛ばしてソフトウェアでVPN接続ができるのか。既にデフォルトでwindowsにVPNの何かが入っているらしい？
いやちょっと待って！その前にtelnetとSSHが分からない！
###telnetとSSHとは
telnetはネットワークを経由して他のコンピュータに接続し、遠隔操作するための仕組み。(わわわIT用語辞典[telnet](https://wa3.i-3-i.info/word11719.html))
SSHはtelnetのセキュリティを高くした版らしい。(わわわIT用語辞典[SSH](https://wa3.i-3-i.info/word11722.html))
SSHについてはもう少し分かっておく必要があります。
なぜならば課題の副題がネットワーク接続についての知識強化、にあたりますので。

###SSHについて詳しくなろう
[インフラエンジニアじゃなくても押さえておきたいSSHの基礎知識](https://qiita.com/tag1216/items/5d06bad7468f731f590e)の自分なりの解釈を以下まとめます。
まずSSHは安全に遠隔操作をするためのプロトコルを指す。
ソフトウェアを使ってコマンドを打って使えるようにする。

安全に、の部分のメカニズムは暗号と認証が重要。
遠くのドア（入りたいサーバー）を入る際（認証）には鍵、もしくはA「山…？」B「…川！！」A「よし入れ」のような秘密の合言葉が必要。

前者の鍵は「公開鍵認証方式」のことで、
後者の合言葉は「パスワード認証方式」を指します。

公開鍵認証方式は、公開鍵だけではなく秘密鍵の２つを使用します。この２つはペアになっています。アクセスする方(クライアント)が秘密鍵を所有し、アクセスされるほう(サーバー)は公開鍵をもっています。
接続するためのコードやその他具体的方法は割愛します。

##SSHのVPN接続とは
調べていくうちに、タイトルの三つの要素が出てきて混乱しました。
この課題の主旨は、SSHのVPN接続をやってみよう！という意味だったのかな、と。今更ですが・・・

ではSSHのVPN接続とは？
リモートでサーバー内の情報をあれこれしたいから、SSHを使いたい。且つデータは重要なので接続する際には、セキュリティを万全を期すためVPNという技術も使おう！の接続のこと。
私の中での認識は以上となります。

（関係ないけれど、IT業界に入って一番使う言葉が「認識」だと感じているのは私だけでしょうか？）
##最後に
具体的に接続するのは少し先になりますので、今回は概念と概要をまとめました。
自分の底辺ぶりに驚く毎日きょうこのごろです。
いままでは、インプットのみの勉強だったのですが、
今回のように自分の言葉でまとめて記事にすると、
曖昧に分からなかった点が浮き彫りになり、且つ緊張感（人の目に触れる場所へ投稿する怖さ）をもって勉強できるので有意義だったと思います。

VPNやSSHなども完全には理解しているとは言えないので今後も加筆修正していく予定です。
Notification.objectを型安全に



みなさん`NotificationCenter`って使ってますか？
全く繋がりのないオブジェクト同士で、メッセージを送れるので何かと重宝すると思います。

ただ、標準の`NotificationCenter`には型に関して問題があります。


## `NotificationCenter`の問題

`NotificationCenter`は通知を投げる時に
`object`というプロパティをセットできますが、
このプロパティは`Any`なので、型情報が失われてしまいます。


```swift
let center = NotificationCenter.default

center.addObserver(.name, ..., object: 1000) 

center.addObserver(for: .name, ...) { notice in
    notice.object // Any型になってしまう！
}
```

## どう解決するか

通知登録時にどちらも`Notification.Name`を使用するので、
そこに型情報を持たせられないかと考えました。

### 型情報を持たせてみる

```swift

struct Notification<Object> { 
    let object:Object
    let name:Name

    struct Name {
        let rawValue:String
    }
}
```

ジェネリックで`Notification`を定義することで、`Notification`に
型情報を持たせることができました。

これを使ってみます。

### NotificationCenterを作る

```swift

class NotificationCenter {

    var handlers = [String: [() -> Void]]()
    var objects = [String: Any]()
   
    public func addObserver<T>(
        forName name: Notification<T>.Name,
        using handler: @escaping Notification<T> -> Void
    ){
        let rawName = name.rawValue
        
        // 通知時に呼び出されるClosure
        let block = {[weak self] in
            
            let _object = self.objects[rawName] as! T
            let _notification = Notification(name: name, object: _object)
            
            handler(_notification)
        }
        
        // ハンドラの配列がなければ作成
        if handlers[rawName] == nil { 
            handlers[rawName] = [] 
        }
        
        // ハンドラに登録
        self.handlers[rawName]!.append(block)
    }
    
    func post<T>(name: Notification<T>.Name, object: T) {
        let rawName = name.rawValue

        // 一瞬だけobjectを登録
        self.objects[rawName] = object
        
        // ハンドラを呼び出し
        handlers[rawName]?.forEach{$0()}

        // 即削除
        self.objects.removeValue(forKey: rawName)
    }
}
```

関数の呼び出し時のジェネリックは
その中で宣言された`Closure`でも使えることを利用しています。


内部的には一瞬だけ`Object`が`Any`になっていますが、
外部呼び出しからは完全に型安全に使用できます。

（`self.objects`を辞書型で作成しているのはスレッドセーフにするためです。）




## 使い方
`Notification.Name`の拡張の仕方が変わります。

#### 通知の作成
```swift
//String型を送る通知の場合
extension Notification.Name where Object == String {
    static let sample = Notification.Name("__sample__")
}
```

こうすることで、`String`のみを送れる`Notification`ができます。

#### 通知の登録
```swift
let center = NotificationCenter()

center.addObserver(for .sample){ notice in
   print(notice.object) // この時点で objectはString型である。
}
```

登録時にすでに`notice.object`が`String`型なので型安全に使用できます。


#### 通知の送信

```swift
center.post(.sample, object: "Hello World") // OK!

center.post(.sample, object: 100_000_000) // Error!
```

送信時も`object`がStringであるかのチェックが行われます。


このように、送信・受信時は型情報について一切記述せずに
型チェックが行われるようになります。





### まとめ

せっかくSwiftは美しく型を使える言語なので、どんどん活用していこうと思います。
実は`UserDefault`も同じ手法で拡張できるので、やってみると幸せになれます。


今回のコードは
[https://github.com/ObuchiYuki/RMNotificationCenter/blob/master/RMNitificationCenter.swift](https://github.com/ObuchiYuki/RMNotificationCenter/blob/master/RMNitificationCenter.swift)
に置いてあります。よければご参照ください。
[Unity]Incremental GC を試してみた

## 歴史

### 2018.3.0 以前

GCとはガベージコレクション(Garbage Collection)の略で、不要になったメモリ領域を確保する機能です。
従来のUnityではGCの際にかなり大きなスパイクが発生してしまうことが問題となっていました。
例えばフレーム単位の操作精度を要求されるアクションゲームなどではスパイクの発生が絶対に許されません。
そのため、ヒープメモリをできる限り使わないようにとても気を使いながらプログラミングする必要がありました。

たとえば

* ラムダ式を使わない
* LINQを使わない
* とことんnewを避ける(プールして使い回す)
* ヒープメモリを確保する標準APIを呼ばない(Input.touchesの代わりにInput.GetTouchを使う)
* 文字列を連結しない
* foreachを使わない(Unity 5.5以前のバグによりヒープメモリを確保してしまう)

など…

### 2018.3.0

2018.3.0 において GarbageCollector なる API が登場しました。
```GarbageCollector.GCMode = GarbageCollector.Mode.Disabled;```
とすることにより、GCを強制的に発生させないようにすることができるようになりました。

とはいえ、GCを止めている間は当然メモリ使用量が減らないため、
システムメモリ不足によってアプリケーションが強制終了する可能性があります。
そのため使用できる場面は限定的でした。

## Incremental GC

### 概要

2019.1.0 において Incremental GC が試験的に導入されました。
従来のGCが1フレーム内で処理されていたのに対して
Incremental GC では処理が複数フレームに渡ってちょっとずつ実行されます。
そのため大きなスパイクは発生しないというわけですね。

有効にするには Player Settings の Use incremental GC (Experimental) にチェックを入れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368570/d6e333d1-1dd6-32bc-7c89-2e97964c264c.png)

### 実験

早速挙動を確認してみます。なお、Editorでは動かないのでビルドして試しましょう。
[UnityEngine.Scripting.GarbageCollector](https://docs.unity3d.com/ScriptReference/Scripting.GarbageCollector.html) に何やらAPIが追加されています。

API|内容
---|---
isIncremental|Incremental GC が有効か(read only)
incrementalTimeSliceNanoseconds|1フレームあたりにGCに割く時間(ナノ秒)
CollectIncremental|Incremental GCを手動実行する

今回はこんな感じのスクリプトを用意します。

```csharp
using System.Linq;
using UnityEngine;
using UnityEngine.Scripting;
using UnityEngine.UI;

public class Test : MonoBehaviour
{
    [SerializeField] private Text _text;
    [SerializeField] private Slider _slider;

    void Start()
    {
        void UpdateText() => _text.text = string.Format(
            "Enabled = {0}\nTime = {1}[ms]",
            GarbageCollector.isIncremental,
            GarbageCollector.incrementalTimeSliceNanoseconds / 1000 / 1000
        );

        // スライダーでミリ秒を設定する
        _slider.onValueChanged.AddListener(value =>
        {
            GarbageCollector.incrementalTimeSliceNanoseconds = (ulong)value * 1000 * 1000;
            UpdateText();
        });
        UpdateText();
    }

    void Update()
    {
        // 適当にヒープメモリを確保する
        new int[100000].Select(i => i.ToString()).ToArray();
    }
}

```

まずは Incremental GC = OFF の状態で試してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368570/64059a0d-d197-fe3f-5c6e-5a7468400396.png)

ちゃんとオフになっています。ここで Profiler を見ると

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368570/2f3b4b8f-35f2-6fec-0599-69b40e120b6e.png)

毎フレーム GC 走ってるやん！
なんで！？

　　終
制作・著作
━━━━━
ⓊⓃⒾⓉⓎ
Pixel cherry-picking: 潜在変数と離散なマスク画像の組で画像を表現するAutoencoderモデル

## Pixel cherry-picking
潜在変数Zと離散なマスク画像Mの組(Z, M)で画像を表現するAutoencoderモデル。

CIFAR-10上のVAEベースでの実装(chainer v6)
https://github.com/tmagara/pixel-cherry-picking

### 概要
1. N枚分の出力を行うAutoencoderを用意する。
2. 出力をピクセルごとにcherry-pickする。
 - 各ピクセル(例.32x32)についてN個の出力の中から最も損失が低くなる(入力に近い)ものを選ぶ。
3. cherry-pickされた出力について損失を求める。

「2で各ピクセルにおいてどの値が選ばれたか?」の情報はN値のマスク画像として表現できる。

### 疑似コード
```
# normal autoencoder
y = self.decoder(self.encoder(x))
loss = (x - y) ** 2
loss = chainer.functions.mean(loss)
```

```
# autoencoder with pixel cherry-picking
y = self.decoder(self.encoder(x))
B, _, H, W = y.shape
y = chainer.functions.reshape(y, (B, x.shape[1], -1, H, W))
loss = (x[:, :, None] - y) ** 2
loss = chainer.functions.mean(loss, (1,))
loss = chainer.functions.min(loss, (2,))
loss = chainer.functions.mean(loss)
```

### 出力
いずれも左から入力画像、マスク画像で合成された出力画像、デコーダーからの直接の出力画像x4、マスク画像x4。
潜在変数Zが4次元:
![z4mask4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152511/1facd653-6494-45d1-dd47-92fc18ee5178.png)

潜在変数Zが16次元:
![z16mask4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152511/969cf21f-6ffa-f312-9542-d9fcd8b5043c.png)

潜在変数Zが64次元:
![z64mask4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152511/1e5cf8ab-4dfc-223b-a664-787c3e0a05a7.png)
見やすくするために出力値を輝度の総和でソートしたもの:
![z64mask4sorted.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152511/bae60e3f-ac39-4e3c-e3d1-a662dee80593.png)
画像の一部成分（高周波数成分？）が離散なマスク画像に分離されている様子がわかる。

### 問題

- 画像を生成するために潜在変数Zだけではなくマスク画像Mが必要。
- 画像の特徴量が潜在変数Zだけに抽出されるわけではない。

⇒ このモデルに意味はあるか？

### 考察

画像xを記述するモデルとしてのデコーダーDについて考える。
$$ x = \sum_{j=1}^{N}M_j D_\theta(z) + \Delta $$
オッカムの剃刀に従えば、「よりシンプルに（=より少ない情報量で）データを記述できるモデル」が良いモデル。

- MSEによって誤差$ \Delta $ ($ \sim \mathcal{N} $)の情報量が測られる。
- VAEのKLダイバージェンス項で潜在変数Zの情報量が(間接的に)測られる。
- マスク画像Mの情報量は(最悪で)ピクセル当たりlog2(N)ビット。
 - 課題: どうすればこの情報量を下げることができるのか？

###次回
GANの枠組みで潜在変数Zからマスク画像Mを生成する試みについて。
MapのkeySet , valuesを使うべきではない

# 

↓のようにkeyしか使用しないコードでもfindbugsで`entrySet()`を使えと警告がでた。

```
for(var key : map.keySet()){
    // map.get(key)などやらず、純粋にkeyしか使用しない処理
}
```

keyとvalue **両方**使用するなら`entrySet()`のほうが効率が良いのと解釈していたので、片方のみ使用する場合は効率に関係ないのでは？
むしろ、`Entry<K,V>`はkeyとvalue両方持つので不要な片方のリソースが無駄ではないのかと思い、裏取りのため内部実装を見てみる。


``` AbstractMap.java
public Set<K> keySet() {
        Set<K> ks = keySet;
        if (ks == null) {
            ks = new AbstractSet<K>() {
                public Iterator<K> iterator() {
                    return new Iterator<K>() {
                        private Iterator<Entry<K,V>> i = entrySet().iterator();
                        
                        // 略

                    };
                }
            };
            keySet = ks;
        }
        return ks;
    }

```
keySetが無ければ作り出してフィールドに保持するようになっているが、`Iterator<K>`の初期化に`entrySet().iterator()`を呼び出していることがわかる。
結局のところ`keySet()`や`values()`では`entrySet()`を通してごにょる様子。

つまり、keyまたはvalueの片方のみであっても思考停止で`entrySet()`を使用したほうがいいという警告は**正しかった**のである。
Docomo/AU/Softbank 3キャリアのサービス終了時期

# Docomo

### 2026年3月末

> NTTドコモは3G携帯電話サービス「FOMA」と3G向けのネットサービス「iモード」を2026年3月31日をもって終了すると発表しました。

### 正式発表あり。

ドコモ、2020年代半ばに3Gサービスを終了する方針
https://k-tai.watch.impress.co.jp/docs/news/1150883.html

「iモード」新規受付が終了、2019年9月30日で
https://k-tai.watch.impress.co.jp/docs/news/1180203.html

ドコモ、3G携帯「FOMA」と「iモード」を2026年3月末でサービス終了
https://japanese.engadget.com/2019/10/29/3g-foma-i-2026-3/



# KDDI

### 2022年3月末

「CDMA 1X WIN」サービスの終了について
https://news.kddi.com/kddi/corporate/newsrelease/2018/11/16/3428.html

AUはここでガラケー終了のお知らせ。（確定）


# Softbank

### 正式発表なし。DocomoがやめてSoftbankだけ残るとは考えずらいので、Docomoに合わせて来るような気がする。

> 2019年11月末日をもって、音声通話サービス、ショートメッセージサービス（SMS）以外の一部機能についてもご利用いただけなくなります

https://www.softbank.jp/mobile/special/sha1-01/
【git】gitのインストール

##ことの顛末##
そもそもこんなこと書く必要ないじゃん！？って思われる方は多いと思います。
ええ、多分自分も何も知らずに見たらそう思うでしょう。

この記事は、自分が他の記事に対してオブジェクト指向で記事を作成するための記事です。
つまり、どんな環境でも本番のように使おうと思うとgitの利用は今後欠かせないと思うのですが、記事を書くたびに同じこと書くのは絶対的に非効率です。
しかしそこを抜かしてしまうと初学者は「何をどうするの」となり、IT学習に対するモチベーションの低下を招くでしょう。
そんなことでモチベ下がるならやるな、というのは簡単ですが人を育てるというのはそうではなく「相手の目線にどれだけ寄り添って教えられるか」だと自分は考えています。

ということで、そのオブジェクトの一つとしてこの記事を残します。


gitはソースからインストールするのがいいようです。
yumだとバージョン1系が入ってしまいます。



```
[root@localhost ~]# yum -y install curl-devel expat-devel gettext-devel openssl-devel zlib-devel perl-ExtUtils-MakeMaker
```

https://www.kernel.org/pub/software/scm/git/
こちらでgitのバージョンを確認できますので、
最新のtar.gzの数字の部分を確認しましょう。

この記事を書いている時点では2.9.5が最新のようでした。

```
[root@localhost ~]# wget https://www.kernel.org/pub/software/scm/git/git-2.9.5.tar.gz
[root@localhost ~]# tar zxvf git-2.9.5.tar.gz
```

tar.gzが解凍されますので、ディレクトリ移動します。

```
[root@localhost ~]# cd git-2.9.5
```


コンパイルします。

```
[root@localhost ~]# make prefix=/usr/local all
[root@localhost ~]# make prefix=/usr/local install
[root@localhost git-2.9.5]# git --version
-bash: /usr/bin/git: そのようなファイルやディレクトリはありません
```

んっ？

と思ったら、パスが通ってないんでしょうね。

```
[root@localhost git-2.9.5]# ./git --version
git version 2.9.5
```

見てみると、/usr/local/binの中にgitがあったのですが、gitを実行する場所は/usr/binのようでした。
なので、/usr/local/bin/gitを、/usr/bin/gitにしたいと思います。

```
[root@localhost ~]# cp /usr/local/bin/git /usr/bin/git
[root@localhost ~]# git --version
[root@localhost ~]# git version 2.9.5
```

パスのところがむりっくりなのかも知れませんが・・・とりあえずできました。


～～2020-03-19追記～～
ついでに、あまりgithub触らなくて忘れてしまうので(｀・ω・´)ゞ

秘密鍵・公開鍵の作成

```
[root@localhost ~]# ssh-keygen -t rsa -b 4096 -C "your_email@hogefuga.com"
```
作成されたid_rsa.pub

githubに対してcloneしたい時に秘密鍵の場所を予め指定します。

```
[root@localhost ~]# vi ~/.ssh/config
```

公開鍵に対して秘密鍵を設定します。

```
Host github
  Hostname github.com
  User git
  IdentityFile ~/.ssh/id_rsa
```
このやり方はあくまで秘密鍵で認証する自分のgithubリポジトリのクローン方法です。
ではcloneしましょう！