OmniAICreator/Qiita-1.07M huggingface dataset:
Rustエディタ

# Rustのための開発環境（エディタ周り）

## 実行環境

```shell-session:実行環境
$ uname -rs
Darwin 19.3.0
$ atom --version
Atom    : 1.45.0
Electron: 4.2.7
Chrome  : 69.0.3497.128
Node    : 10.11.0
$ emacs --version
GNU Emacs 26.3
Copyright (C) 2019 Free Software Foundation, Inc.
GNU Emacs comes with ABSOLUTELY NO WARRANTY.
You may redistribute copies of GNU Emacs
under the terms of the GNU General Public License.
For more information about these matters, see the file named COPYING.
```

## Atom
### Atomのインストール
普段はemacsでコードを書いていますが、GitHubを使うときに楽だったり、MarkDownを書いたりするときもPreviewができたりして何かと便利なのでお勧めです。ただ、ずっと、ターミナル上のemacsで生活してきたので少し重い気がしますがそこは多めにみましょう。

インストール自体は簡単で、[ここから]()ダウンロードしてください。

### パッケージのインストール
ブラウザで検索してから、ダウンロード、インストールでもいいですが、ターミナルで
`$ apm install atom-ide-ui ide-rust`
を実行してもらえばいいです。ide-rustがメインで、atom-ide-uiはdependencyになるので前もってインストールが済んでいれば不要です。

以上がAtom上での設定です。

## Emacs
### Emacsのインストール
Emacsの利点はとにかく動作が軽量でカスタマイズが自由と言うことです。macの人とかはEmacsのキーバインドが一部有効になっているので個人的にはお勧めです。これもAtomと同じでいろいろなパッケージをインストールすればかなり多機能になるのですが、それだと動作が軽いという利点を失ってしまうので個人的にはあまりお勧めではないです。

インストールは[ここから](https://www.gnu.org/software/emacs/)ダウンロードしてインストールしてください。[ここに](https://ftp.gnu.org/gnu/emacs/)ソースコードもあるので、ソースからビルドしたい人はどうぞ。

### racerのインストールとemacsの設定
```shell-session
$ rustup toolchain add nightly
$ rustup component add rust-src
$ cargo +nightly install racer
```
を実行してください。実行し終わったら、emacsを立ち上げて、
`C-x C-f RET ~/.emacs.d/init.el RET` (Cはコントロールキーです)
を実行して

```emacs-lisp:init.el
(require 'package)
(add-to-list 'package-archives
             '("melpa" . "https://melpa.org/packages/") t)
(package-initialize)
(add-hook 'rust-mode-hook #'racer-mode)
(add-hook 'racer-mode-hook #'eldoc-mode)

(add-hook 'racer-mode-hook #'company-mode)

(require 'rust-mode)
(define-key rust-mode-map (kbd "TAB") #'company-indent-or-complete-common)
(setq company-tooltip-align-annotations t)
```

これを入力してください。<br/>
その後、</br>
`C-x C-s`
`M-x RET package-install RET rust-mode RET`
`M-x RET package-install RET racer RET`
`M-x RET package-install RET company RET`
を実行してください。MはメタキーでwindowsならAlt、Macなら、Optionだと思います。RETはenterまたはreturnです。

設定は以上です。

## 参考
https://github.com/rust-lang/rust-mode
https://github.com/racer-rust/emacs-racer
https://www.rust-lang.org/learn/get-started
https://github.com/rust-lang/atom-ide-rust

## 2020-8-6追記
ATOMとかEMACSをここではお勧めしていますが、最近Discordで知ったのですが一般的にはVS Codeで描くのが主流みたいです。あと、Racerをつかって補完を実行するように案内をしていますが、最近ではrust-analyzerを使うのが一般的です（Emacs lspの導入だったり色々壁がありますが...）いずれにせよ、VS Codeを使うとrust-analyzerの導入もパッケージの導入だけで済んで楽なので、プログラミング自体が初めてという方VS Codeの方がお勧めです...
機械学習の基礎を一から学んでアウトプットしたい #1

#初めに
Qiita初投稿。平凡な一大学院生です。毎日だらだらとしたこんな日々を少しでも価値創造できないかと、自身の研究に関連する機械学習について一から学んでみようと思い立ち、リサーチを始めました。その中で@junichiroさんのQiita記事に目が留まり、読み進めていく中でCourseraといったスタンフォード大学のNg教授による機械学習に関するオンライン授業の存在を知りました。

[機械学習をゼロから1ヵ月間勉強し続けた結果](https://qiita.com/junichiro/items/3457e33e502086a200f1)

大学の授業もすべてオンライン授業にもなり、その一つとして受けてみようと思い、さっそくアカウント登録してみました。この外出自粛期間を利用し、一から機械学習の基礎を学んでいきたいと思います。そして、この記事は一番は自分の理解を深めるために、また記事を書くという経験を積むために、学んだことをアウトプットしていこうと思います。

#講義の概要
[Machine Learning - Coursera](https://www.coursera.org/learn/machine-learning/)

登録自体は無料です。ただ全講義が終了しいた段階で、修了書が欲しい場合はいくらかお金がかかります。
機械学習の講義は全部で11週にわたり各自進めていくといった内容です。1週分は動画とその復習教材が何回かにわたって繰り返されていき、最後にテストや練習問題が行われます。一つの動画はだいたい10分程度で、全体としては3時間ぐらいはかかる見込みとなっています。講義は基本英語で進められていきますが、翻訳機能もあり日本語のスクリプトを見ながら受講することができます。


#受講1週目
さっそく一周目の授業を受講しました。一周目は約3日かけて受講することができました。
内容はざっくりと

- イントロダクション
    - Machine Learningとは？
    - 教師あり学習と教師なし学習
- 単一変数による線形回帰
    - 線形回帰に関するモデルと目的関数
    - 勾配降下法
- 線形代数の基礎
    - 行列とベクトル

といった内容でした。個人的には少し英語に慣れない部分もありますが、基本的には日本語訳のスクリプトを読みながら進めて、特につまずくところはなくスムーズに受講できました。

自身の理解を深めるために、講義内容を軽くまとめたいと思います。詳細に関しては実際に受講して頂きたいです。

##イントロダクション
Machine Learningは様々な状況で活用可能。
データベースマイニング（検索データの集約）
手でプログラミングが不可能なもの（ヘリコプターの自動操縦）
自然言語処理（手書き文字認識）

Machine Learningの定義は様々。
・コンピュータに明示的にプログラムすることなく学習する能力を与える研究。
・課題Tを評価基準Pをもとに経験Eから学習すること。

機械学習の種類
・教師あり学習－コンピュータに正解を教える
・教師なし学習－コンピュータ自身が学習する
・強化学習
・レコメンダ―システム

教師あり学習とは？
アルゴリズムに与えられたデータセットに正しい答えが付与している学習方法。
・回帰問題－価格の算出など、一種の連続的な属性の値を予測する
・分類問題－がんの陰陽判断など、複数の属性が用いられた離散的な値を特徴ごとに分類する

教師なし学習とは？
ラベル付けされていないデータセットから何かしらの構造を見つける学習。
・クラスタリング－データの関係性を類似性から算出する

##線形回帰
入力値に基づいて実数地の出力を予測

トレーニングセット数mから学習アルゴリズムを通して関数hを定める。hをもとに入力値xから予測する出力値yを算出する。

変数が一つのものを単回帰という。yをxの何らかの直線の関数として予測する式が以下のようなものになる。

```math
h θ\left( x \right)=θ_0+θ_1 x
```

θはパラメータであり、θ_0とθ_1の値を選ぶ際に、トレーニングセットxの値を与えて、適度な正確さでyの値に近い予測を出力する。
データに対してどのような最適な直線を当てはめるかを目的関数として定式化する。

```math
J\left( θ_0, θ_1 \right)=1/(2m) \sum_{i=1}^m \left( h_θ \left(x^{\left(i\right)}\right)-y^\left(i\right) \right)^2
```

全トレーニングデータにおいて、実際のデータと回帰によって予測された関数との2乗誤差の総和を最小化する。

```math
minimize J\left( θ_0, θ_1 \right)
```

線形回帰アルゴリズムの一つに勾配降下法がある。
θ_0とθ_1を少しずつ変え、Jを減少できないかを考え、いずれ局所的な最小値に到達する。

```math
θ_j ≔ θ_j-α(δ/δθ_j)J\left( θ_0, θ_1 \right)
```

j=0とj=1においてこの式を計算し、局所的な最小値になるまで繰り返す。
最後に、勾配降下法と目的関数を合わせて線形回帰アルゴリズムを作成する。

##線形代数の概要
・行列の表し方
・ベクトルの表し方
・行列の加法、乗法
・行列の不可換性、結合法則
・単行列、逆行列、転置

これに関しては、習ったことがあるので簡単な復習って感じ。

#最後に
理解したつもりでも式やアルゴリズムにおいて、まだ理解の浅いところも多かったので、投稿を利用して今後も学んだことをアウトプットしていきたいと思います。（記事書くのがとても大変でした汗。慣れれるように頑張っていきたいです。）
MAMPを使ったWordpressでのWEB制作方法8　初心者向け

#MAMPを使ったWordpressでのWEB制作方法8　初心者向け

前回の記事はこちら
[#MAMPを使ったWordpressでのWEB制作方法7　初心者向け](https://qiita.com/fumiya0414/items/5b035482bed053d845e4)

今回は固定ページの中身を作っていきます。


##固定ページの中身作成

固定ページはpage.phpのファイル内に作成します。

まずはhtmlで作成してあるservice.htmlの中身をpage.phpにコピーします。
header/footer/sidebarなどの共通部分はwordpressタグで読み込んでおきましょう
[共通部分の読み込みはこちら](https://qiita.com/fumiya0414/items/6ba9d0617bfd5a032fbd)

page.phpのファイルにコピーができたらリンクを確認すると
貼り付けた内容が反映されています。

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

しかしヘッダーのどのリンクからもpage.phpのファイルを
参照してしまうため各ページの表示になるように書き換えをします。

まずタイトルを以下のように書き換えます。

```php:page.php
<!--書き換え前-->
      <h2>サービス内容</h2>
      <p>貴社ますますご盛栄のこととお喜び申し上げます。<br>
        平素はひとかたならぬご厚情にあずかり、厚くお礼申し上げます。<br>・・・</p>

<!--書き換え後-->
      <h2><?php the_title(); ?></h2>
      <p>貴社ますますご盛栄のこととお喜び申し上げます。<br>
        平素はひとかたならぬご厚情にあずかり、厚くお礼申し上げます。<br>・・・</p>
```

タイトルが変わるようになりました。
中身は各ファイルtestとしてあるものが反映されています。

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

次にwordpressの管理画面から各ページを開いて編集していきます。
まずは会社概要を作成してみましょう。
このとき設定からエディターをコードエディターにしておいてください。
※ビジュアルエディターはブログなど文章を打つエディターです。

[![Image from Gyazo](https://i.gyazo.com/f8c98a3c2510b6eb90b41fe10f340a7b.png)](https://gyazo.com/f8c98a3c2510b6eb90b41fe10f340a7b)

ここにcompany.htmlで記述されている本文のコードを貼り付けて更新します。
※タイトル/ヘッダー/フッター/サイドバー/お問い合わせボタンなど
　共通部分は貼り付けないようにしましょう。以下は参考です。

[![Image from Gyazo](https://i.gyazo.com/8653bd588e1f79fed6b2b452a37ab513.png)](https://gyazo.com/8653bd588e1f79fed6b2b452a37ab513)

ブラウザを再読込すると以下のように更新した内容が反映されています。

[![Image from Gyazo](https://i.gyazo.com/5d6b23124327d5d5d3abcae7afe8b8cf.png)](https://gyazo.com/5d6b23124327d5d5d3abcae7afe8b8cf)

同じように事業内容をservice.htmlの内容で
お問い合わせをcontact.htmlの内容で
貼り付けて更新します。

事業内容ページ
[![Image from Gyazo](https://i.gyazo.com/63b500e91efd78a083bce01b02186e7c.png)](https://gyazo.com/63b500e91efd78a083bce01b02186e7c)

お問い合わせページ
お問い合わせページへのリンクボタンは不要なので後ほど削除します。
今はこのまま進めましょう。
[![Image from Gyazo](https://i.gyazo.com/2ae2dbf2f8cefa261ed682f4dd86a457.png)](https://gyazo.com/2ae2dbf2f8cefa261ed682f4dd86a457)

固定ページの作成は以上になります。
次は投稿ページの作成です。

[MAMPを使ったWordpressでのWEB制作方法9　初心者向け](https://qiita.com/fumiya0414/items/c6644e5a527a46521bf5)
基礎からのRedux

Reduxの基礎を理解するためのメモ．
参照：[Redux入門【ダイジェスト版】10分で理解するReduxの基礎]('https://qiita.com/kitagawamac/items/49a1f03445b19cf407b7')

Reduxの概念とデータフローについて学ぶ

#Reduxとは
アプリケーションを作成する際，DB上のデータをpropsでバケツリレーのように受け渡しするのは非効率．加えて，親コンポーネントのstateに子コンポーネントが影響する構造は，全体のstateを把握するのが困難となり，不具合の原因となる．

この問題を解決するのが，ReactJSが扱うUIのstate管理のためのフレームワークであるReduxである．Reduxを用いることでアプリケーション全体（App.js)の状態を管理し，更新，描画することが容易になる．

#Reduxの要素
1. ActionCreatorメソッド
2. Actionオブジェクト
3. Store
4. State
5. Reducerメソッド

これらの要素が機能することでアプリケーション全体のデータを操作することが可能となる．

##Reduxのフロー
ToDoアプリを例に説明する．
ユーザがtodoのテキストを入力して追加ボタンを押した場合を考える．

###```ActionCreator```メソッド
このとき入力されたテキストが```ActionCreator```メソッドに渡される．

```js:todo.js
function addTodo(text) {
  return {
    type: ADD_TODO,
    text: `${text}`
  }
}
```

###```Action```オブジェクト
Actionオブジェクトは，「何をする」という情報をtypeプロパティに持つ．このActionオブジェクトが，ActionCreatorメソッドにより作成される．

```js:todo.js
{
  type: 'ADD_TODO',
  text: 'Build my first Redux app'
}
```

###```dispatch```文
dispatch文によって，**ActionCreatorメソッドによって作成されたActionオブジェクト**がStoreに渡される．

```js:todo.js
dispatch(addTodo(text))
```
###```Store```
Storeは，アプリケーションの状態（state）を保持している場所．
index.jsに作成され，そこでreducerが適応される．

Storeは，dispatchされると，**引数のactionと現在保持するState**を，Reducerへと渡し，新しいStateを作成する．

```js:index.js
import { createStore } from 'redux'
import reducer from './reducer'

//Storeの作成とreducerの適応
const composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose
const thunkWithClient = thunk.withExtraArgument(client)
const store = createStore(reducer, composeEnhancers(applyMiddleware(thunkWithClient)))
```
```js:reducer.js
import { combineReducers } from 'redux'
import todoApp from './reducers'
```

###```State```
アプリケーションでの状態．
下記の例では，「現在表示されている表示/非表示」，「todoリスト」をstateとして保持．


```js:
{
  visibilityFilter: 'SHOW_ALL',
  todos: [
    {
      text: 'Consider using Redux',
      completed: true,
    },
    {
      text: 'Keep all state in a single tree',
      completed: false
    }
  ]
}
```

###```reducer```メソッド
reducerメソッドは，actionとstateから**新しいstate**を作成して返すメソッド．

reducerの実装は，actionのtypeに応じて処理を書く．

```js:todo.js
function todos(state = [], action) {
  switch (action.type) {
    case ADD_TODO:
      return [
        ...state,
        {
          text: action.text,
          completed: false
        }
      ]
    case COMPLETE_TODO:
      return [
        ...state.slice(0, action.index),
        Object.assign({}, state[action.index], {
          completed: true
        }),
        ...state.slice(action.index + 1)
      ]
    default:
      return state
  }
}

function visibilityFilter(state = SHOW_ALL, action) {
  switch (action.type) {
    case SET_VISIBILITY_FILTER:
      return action.filter
    default:
      return state
  }
}

function todoApp(state = {}, action) {
  return {
    visibilityFilter: visibilityFilter(state.visibilityFilter, action),
    todos: todos(state.todos, action)
  }
}
```

##アプリケーション全体で見てみると．．．
App.js/render()
↓
初回はinitialStateを用いてレンダリング
↓
App.js/componentDidMount()
↓
/ActionCreator()呼び出し
↓
todo.js/ActionCreator()
↓
/dispatch
↓
reducers.js
↓
todo.js/reducer
↓
App.jsのstate更新
↓
App.js/render()
Backlogで課題の一括登録

#はじめに
定期的なタスクや10件、20件の課題を投稿するのは労力を要するため
一括して登録する手段を備忘録として記載
#手段
以下の3つが挙げられる
1. Googleスプレッドシート
2. Backlog課題一括投稿マクロ（フリー）
3. 自作

#まずはじめにやっておくこと
- Backlogのプロジェクト設定から
「種別」「カテゴリ」「マイルストーン」などを定義しておく。入力時に困る

- BacklogのAPIキー登録
個人設定から「API」を選択し、登録する。

<img width="960" alt="1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474873/1681ee65-d579-1df0-8008-410fc4436f62.png">

<img width="960" alt="2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474873/a5bf554d-95d4-b3b3-041e-14f2e5a297ba.png">


## 方法1：Googleスプレッドシート
公式が推奨
###### 前提条件
- Googleサービスを利用できるアカウントがあること
- 該当プロジェクトへのログイン可（IP制限などネットワーク的障壁がない）

###### 実施方法
[Googleスプレッドシートを使って登録](https://github.com/nulab/backlog-bulk-issue-registration-gas/blob/master/README.md)


## 方法2：Backlog課題一括投稿マクロ
Googleサービスが利用できない場合はこれ

###### 前提条件
- 該当プロジェクトへのログイン可（IP制限などネットワーク的障壁がない）

###### 制限事項
- 件名に文字数制限あり（20文字以上不可）

###### 実施方法
######(1) Excelマクロをダウンロード
[Backlog 課題一括追加マクロ](https://www.vector.co.jp/soft/winnt/business/se515827.html)
######(2) Backlogからプロジェクト設定情報取得
①プロジェクトURL、APIキーを入力する
②認証ボタンを押下
<img width="568" alt="3.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474873/051f9d6d-2772-cb25-6d7a-6537147a7fed.png">
取得したプロジェクト設定情報は、非表示のシートにあり、
カテゴリ、マイルストーンなどのマスタ情報を腹持ちしている。
######(3) 入力シート記入
記入方法はGoogleスプレッドシートと同じ
<img width="861" alt="4.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474873/4a32dfec-2579-70aa-f8aa-a396f554441c.png">

######(4) 一括登録処理を実行
<img width="549" alt="5.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474873/4f879acd-0e9d-a9b5-2fd3-1aa7c64d7e54.png">
<img width="564" alt="6.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474873/1980cd46-d1c7-c469-1f65-df82c5cf4951.png">
<img width="307" alt="7.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474873/a3fdfda0-9620-4846-f409-a3d09a390dc8.png">
<img width="949" alt="8.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474873/782827bd-8c83-0f15-5771-4e06a2280fcc.png">

## 方法3：自作
Backlog以外の何かと組み合わせて管理化に置きたい場合など
単純に登録する場合は、方法1か方法2で事足りる。

Backlogには多様なAPIが公開されている（[BacklogAPIとは](https://developer.nulab.com/ja/docs/backlog/#backlog-api-%E3%81%A7%E4%BD%95%E3%81%8C%E5%87%BA%E6%9D%A5%E3%81%BE%E3%81%99%E3%81%8B)）
APIの要求事項を満たす、GET/POSTするプログラムを自作する

「課題の一括登録」であれば、[課題追加API](https://developer.nulab.com/ja/docs/backlog/api/2/add-issue/#%E8%AA%B2%E9%A1%8C%E3%81%AE%E8%BF%BD%E5%8A%A0)にPostするプログラムを自作する

######参考
- [Backlog APIを使ってBacklogに課題を登録する]
(https://dev.classmethod.jp/articles/add_issue_using_backlog_api/)

- [Backlog APIを使ってみた]
(https://qiita.com/mako2kano/items/fd4c6c397b2d8db4f862)
【Favorite】Rails　いいね機能　実装

![画面収録 2020-04-30 0.34.38.mov.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620689/1a76630c-5733-87a0-7e95-1cb7e3a96974.gif)

#【ゴール】
ユーザーに投稿に対していいね機能を実装する
いいねを押すとハートが赤くなる

参考：https://qiita.com/nojinoji/items/2c66499848d882c31ffa

#【メリット】
UI、UXの向上
アソシエーションの理解度向上

#【開発環境】
■ Mac OS catalina
■ Ruby on Rails (5.2.4.2)
■ Virtual Box:6.1
■ Vagrant: 2.2.7


#【実装】　"user" "post"機能実装は割愛

1. favorite model作成

```mac.terminal
$ rails g model Favorite
```

2. アソシエーション 追記

※ user : favorite = 1 : 多　
※ post : favorite = 1 : 多

```models/post.rb
has_many :favorites
def favorited_by?(user)
    favorites.where(user_id: user.id).exists?
end
```

```models/user.rb
has_many :favorites
```

```models/favorite.rb
belongs_to :user
belongs_to :post
```

route 追記
※　"favorite" は "post" に関連しているのでルートをネスト（親子）させる

```config/routes.rb
resources :posts do
    resources :favorites , only: [:create , :destroy]
end
```


favorite controller作成
※　"create" , "destroy"も一緒に作成

```mac.terminal
$ rails g controller Favorites create destroy
```


favorite controller記述
① , ②で user_id post_id をparameterに渡す

```favorites_controller.rb
class FavoritesController < ApplicationController
  def create
  	@post = Post.find(params[:post_id])　①
    favorite = @post.favorites.new(user_id: current_user.id)　②
    favorite.save
    flash[:success] = "Liked post"
  	redirect_to request.referer
  end

  def destroy
  	@post = Post.find(params[:post_id])　①
    favorite = current_user.favorites.find_by(post_id: @post.id)　②
    favorite.destroy
  	redirect_to request.referer
  end
end

```

view記述
※ modelで記述　”@post.favorited_by?”　を使用

```post/show.html/erb
<% if @post.favorited_by?(current_user) %>
   <%= link_to post_favorite_path(@post), method: :DELETE do %>
   <i class="fa fa-heart" aria-hidden="true" style="color: red;"></i>
   <%= @post.favorites.count %>like
   <% end %>
<% else %>
  <%= link_to post_favorites_path(@post) , method: :POST do %>
  <i class="fa fa-heart-o" aria-hidden="true"></i>
  <%= @post.favorites.count %>like
  <% end %>
<% end %>
```


以上
ITパスポート復習

### ストラテジ系
**戦略マネジメント**
オープンイノベーション：組織外の知識や技術を取り込んで技術革新
ロードマップ：技術開発戦略のために作成する表、縦軸に時間、横軸に技術
RFID：ビジネスシステムの具体例、定期券、電子マネー、社員証、学生証
NFC：交通系ICカード
AI関連用語
ニューラルネットワーク：人間の神経回路を模したモデル
ディープラーニング：ニュートラルネットワークを多層的にした機械学習
コンカレントエンジニアリング：同時並行で開発期間を短縮
JIT生産方式(かんばん方式)：必要な物、時、量だけ生産する方式
CGM：一般消費者が情報を発信する。ブログ、口コミサイト、SNS
Society 5.0：サイバー空間(仮想空間)とフィジカル空間(現実空間)を融合させるシステム

**システム戦略**
情報システム戦略：あるべき姿を明確にし、全体最適を考え、経営戦略に基づいて計画を立てる
DFD(データフロー図)：業務プロセスの「データの流れ」を表す表
BPR：抜本的に再設計
BPM：継続的に改善
クラウドコンピューティング：他社の敷地内、所有しているサーバーを利用するサービス(契約しているサーバーの所在が不明確)
SaaS：ソフトウェアを提供するサービス
データウェアハウス：意思決定に役立てる為のデータの集まり
データマイニング：有用な情報を抽出する
情報リテラシー：情報を活用する能力
ソフトウェアライフサイクルプロセス(SLCP)：企画、要件定義、開発、運用、保守までの一連の活動。国際規格
システム化構想：経営上のニーズや課題を確認
システム化計画：費用とシステム投資効果を予測
要件定義プロセス：ユーザーのニーズを知ること
RFI：情報提供依頼書
RFP：提案依頼書

### マネジメント系
**開発技術**
システム要件定義：システムに必要な機能、性能を決める工程
単体テスト：プログラムに誤りがないことを検証
結合テスト：プログラム同士のインターフェースが合うか検証
ホワイトボックステスト：内部構造を分析して行うテスト
ブラックボックステスト：システム要件定義書通りに動作するか確認するテスト
ファンクションポイント法：システムの機能に点数をつけて、開発費用を見積もる方法
DevOps：開発担当、運用担当が連携してシステム開発

**プロジェクトマネジメント**
プロジェクト制約：①スコープ(作業範囲)　②スケジュール(期限)　③コスト(費用)
WBS：プロジェクト作業を階層的に要素分解した図
ステークホルダ：プロジェクトから利益や損害を受ける可能性のある全ての人
アローダイヤグラム：作業の流れを矢印で表した図
クリティカルパス：アローダイヤグラムで最も時間のかかる経路
人的資源マネジメント：役割、責任、必要なスキルを決定し効率的に機能するように管理
作業量の計算問題
伝達経路の計算問題
リスクマネジメント：リスク回避、転嫁、軽減、受容
Golang TempDir,TempFile作成

Golang TempDir,TempFile作成する


```main.go
package main

import (
	"fmt"
	"io/ioutil"
	"os"
)

func main() {
	dir, _ := ioutil.TempDir("", "aaa")
	fmt.Println(dir)

	fp, _ := ioutil.TempFile(dir, "xxx")
	fpath := fp.Name()
	fmt.Println(fpath)

	fp2, _ := ioutil.TempFile(dir, "yyy")
	fpath2 := fp2.Name()
	fmt.Println(fpath2)

	fp.Close()
	fp2.Close()
	os.RemoveAll(dir)
}


//C:\Users\####\AppData\Local\Temp\aaa661041139
//C:\Users\####\AppData\Local\Temp\aaa661041139\xxx642705078
//C:\Users\####\AppData\Local\Temp\aaa661041139\yyy013873821


```
互いに素な整数a,bに対しax+by=1を満たす整数x,yの組。

第58回数学オリンピックの問６では、伝統とも言うべき初等整数論の問題が出題されました。

その問題では「互いに素な整数a,bに対しax+by=1を満たす整数x,yが存在する」という事実が常識中の常識として使われます。
ここではその常識中の常識をpythonで実装してみた結果を報告します。

```python:
print("互いに素な正の整数を２つ入力して下さい。")
a, b= map(int, input().split())
n = 1
r = a**n % b
#print(r)
while r > 1:
    n = n + 1
    r = a**n % b
    #print(r)
m = a**n // b
print(str(a)+"x+"+str(b)+"y=1を満たす整数xとyは"+str(a**(n-1))+"と"+str(-m)+"です。")
```

理屈自体は、以前紹介したオイラーの定理です。
https://qiita.com/naoya_suzuki/items/5490a1099dee8ad7065e

試しにa=6,b=11としてみると「6x+11y=1を満たす整数xとyは10077696と-5496925です。」と出てくるはずです。意外と大きな数ですので全く方針を立てずに探しても見つからないですね。(;^_^A


追記：
と思ったらx=2,y=-1は直感で分かりますね。
【初心者向け】10行以内のスクリプト(1.folium)

### 【初心者向け】10行以内のスクリプト(1.foliumで地図のプロット)
pythonで色々なライブラリを使えば、「少ないコードでもちょっとした事が出来て、少なければ5行程でもちょっとしたスクリプトが作れ、便利だな。」と思ったので、pythonやその他、コマンドを羅列しただけのものも出てくるかも知れませんが、10行程のスクリプトを不定期で投稿してみようと思います。

**第1回**として、「folium (pythonからleafletを利用して地図をプロットするpythonのライブラリ)を使用して、銀座周辺の地図をマーカー付きで3ヶ所プロットするスクリプトを投稿したいと思います。 
このスクリプトでは、以下3ヶ所をプロットしました。

- 有楽町駅: 位置情報【35.6749187,139.7606366】
- 銀座コリドー街: 位置情報【35.6703699,139.7573871】
- Ginza-SIX: 位置情報【35.6695908,139.7618857】

【環境】
LinuxMint19.3
python: 3.6.9
pip3: 9.0.1
pandas: 1.0.3
jupyter-lab: 2.1.0
folium: 0.10.1
***
**1.位置情報を準備**
・プロットする場所の位置情報はgoogleのマップで呼び出し、urlの文字列をマウスでコピーしました。
地理的にプロットするそれぞれの場所が近いので、googleマップの「この場所について」で確認するよりも簡単でした。
**・因みに緯度は、「latitude」、経度は「longtude」**で、検索するとこの順番で表示されると思います。
例として、コリドー街の場合「緯度: 35.6749187・経度: 139.7573871」となっていました。
各場所のこの値を、データフレームに格納していきます。

**foliumの最低限の構文は、以下の様なものです。**
<font color=blue>map = folium.Map(location=[基準地点の緯度,経度], zoom_start = 初期の倍率)
map</font>

**2.コーディング**
コードはjupyterで実行、地図はjupyterにプロットされます。

```python:jupyter

# 銀座周辺をプロットするコードの例
# 1.ライブラリのインポート

import folium
import pandas as pd

# 2.データフレームへの位置情報の格納とマーカー表示の処理
plot_location = pd.DataFrame({
    'ginza':['Yurakucho_station','GinzaCorridorSteet','GinzaSix'],
    'latitude':[35.6749187 ,35.6703699 ,35.66695908],
    'longtude':[139.7606366 ,139.7573871 ,139.7618857],})

map = folium.Map(location=[35.6749187,139.7606366], zoom_start = 15)
for i, r in plot_location.iterrows():
    folium.Marker(location=[r['latitude'], r['longtude']], popup=r["ginza"]).add_to(map)

# 3.地図のプロット
map
```
これで、銀座界隈の地図がプロットされました。
下の画像は、画面キャプチャーですが、jupyterのノートブックにプロットされます。
コリドー街をクリックした状態です。
環境によるのだと思いますが、日本語では表示出来ませんでした。

このポップアップの文字はマーカーを設置する場所ですが、<font color=blue>「2.データフレームへの位置情報の格納とマーカー表示の処理」で、各地点を記述する部分が該当します。
'ginza':['Yurakucho_station','GinzaCorridorSteet','GinzaSix'],</font>

位置情報は「データフレーム」に格納していますが、foliumに直接渡すと3行のスクリプトにする事も出来るかと思います。
しかし、「データフレーム」を使うと、データ・セットを準備して拠点を増やす等の発展が出来ると思います。
参考にした先人達は、「csv」等に格納している例もある様です。

![ginza_map.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624077/e070ed19-5934-7839-752a-b672dec0603d.png)


プロットしたマップを保存する場合は、以下の様に追加で**「save」を実行すれば、「html」に出力が出来ます。**

```python:save
# プロットした地図をhtmlで書き込み
map.save("map_giza.html")
```

***
### 3.【補足】環境

この「folium」ですが、かなり便利なライブラリだと思うのですが、環境によって想定通りに動作しなかった事もありました。
参考までに、以下はこのスクリプトを実行した環境の情報です。
開発環境の情報だけですが、webブラウザを使う関係上、ブラウザの環境にもよりそうです。
実際、他ではプロットされない端末もありました。
恐らく、ブラウザの問題かと考えています。

・出力の一部は、削除してます。

```terminal:環境
less /etc/lsb-release

DISTRIB_ID=LinuxMint
DISTRIB_RELEASE=19.3
DISTRIB_DESCRIPTION="Linux Mint 19.3 Tricia"

(py3_env) $ pip3 --version
pip 9.0.1 from /home/xxx/py3_env/lib/python3.6/site-packages (python 3.6)
(py3_env)$ python -V
Python 3.6.9

$ pip3 show pandas
Name: pandas
Version: 1.0.3
Home-page: https://pandas.pydata.org
Requires: python-dateutil, pytz, numpy
 
(py3_env)$ pip3 show jupyterlab
Name: jupyterlab
Version: 2.1.0
Home-page: http://jupyter.org
Requires: notebook, tornado, jinja2, jupyterlab-server

(py3_env)$ pip3 show folium
Name: folium
Version: 0.10.1
Home-page: https://github.com/python-visualization/folium
Requires: numpy, jinja2, requests, branca
```
**以上、foliumを利用した地図のプロットでした。**
Windowsユーザから管理者権限をはく奪してしまった時の対処（備忘録）

コマンドプロンプトで
> &gt;whoami

を打つと、ユーザ名が表示されると思います。

> &gt;whoami
home-pc&#92;<ユーザ名>

ここに表示されるユーザ名を変更したく、いろいろと
設定を変更していました。
（もちろん、OSをインストールした時にちゃんと正しい
ユーザ名を設定すれば何のことはないのですが...）

いろいろと調査をした結果、「netplwiz」というコマンドで
修正できることを知り、試してみました。
https://www.pasoble.jp/windows/10/user-name-henkoudekinai.html

ユーザ名変更後、とあるアプリをインストールしたく、
インストールを試みましたが、うまくいきません。
管理者権限が必要です、という画面が表示されてしまいます。
（私が使っているWindowsは、Windows10 1909です。
やたらと指紋認証を聞かれましたが、普段Windowsのサインインに
使用している指紋を使っても、通りませんでした。）

不思議に思い、
コントロールパネル > ユーザアカウント > ユーザアカウントの変更
を確認すると、普段使っているアカウントのロールが
「Administrator」ではなく、「Guest」となっていました。
（当然、管理者権限が発動しません。）

また、いろいろと調べていると、以下のサイトに辿り着きました。
https://answers.microsoft.com/ja-jp/windows/forum/all/%e7%ae%a1%e7%90%86%e8%80%85%e3%82%a2%e3%82%ab/7aed3138-a046-4064-9cf3-6e56a50c75d2

ここのサイトを参考に、ローカルの管理者アカウントを作成し、
再び「netplwiz」を打つと、普段使っているアカウントが
「Administrator」グループではなく、別の何かのグループ（何の
グループに所属していたか、ド忘れしてしましました）に
入っていることを確認しました。

このアカウントの所属グループを、再び、「Administrator」グループ
に設定変更してあげると、無事に管理者権限が再付与されており、
目的のアプリをインストールすることができました。

普段、Windowsでユーザ管理をすることがないので、ヒヤッとしました。
参考にさせていただいたURL先の投稿者の皆さん、大変助かりました。
ありがとうございます。
PythonでGoogleスプレッドシートを操作

このQiita記事は、YouTube動画で使ったコードのメモです。
▼詳細は動画を確認ください（YouTube動画に「いいね」を押してくれるとめちゃめちゃ嬉しいです）
https://youtu.be/TpkL5hQDPWo

[![pythonGsheet.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216701/3b53e497-2aa8-5fbf-b196-01f4a8453840.gif)](https://youtu.be/TpkL5hQDPWo)

## 下準備
まず、[http://console.developers.google.com/](http://console.developers.google.com/) のページで新しいプロジェクトを作って、以下の二つのAPIを有効にします。

1. Google Drive APIを有効にして、JSONファイルを取得（creds.jsonに名前を変更）
2. Google Sheet APIを有効にする

それから、ターミナルで2つコマンドを打ちます。

```terminal
$ pip install gspread
$ pip install oauth2client
```

## コード（コメント部分に解説を追記してます。）

```sample.py
import gspread 
from oauth2client.service_account import ServiceAccountCredentials
from pprint import pprint 

scope = ["https://spreadsheets.google.com/feeds",'https://www.googleapis.com/auth/spreadsheets',"https://www.googleapis.com/auth/drive.file","https://www.googleapis.com/auth/drive"]

creds = ServiceAccountCredentials.from_json_keyfile_name("creds.json", scope)

client = gspread.authorize(creds)

# pythonというタイトルの最初のシートを取得しています。
sheet = client.open("python").sheet1

# 全ての値を、dataという変数に代入しています。
data = sheet.get_all_records()

# それぞれ、縦横のデータは以下の方法で取得ができます。
row = sheet.row_values(3)
col = sheet.col_values(3)

# 特定のセルだけを取得する場合は、下記で取得できます。
cell = sheet.cell(3,2).value

# スプレッドシートの値を変更したり、追加する場合は、下記のようなやり方で可能です。
sheet.update_cell(3,2, "nakajo")
insertRow = [3, "nakajo", "みかんジュース"]
sheet.insert_row(insertRow, 3)

pprint(data)
```

## ローカルで打つコマンド
```
$ python sample.py
```

## チャンネル登録も是非
http://youtube.com/user/NJTVnetwork?sub_confirmation=1
チャンネル登録者数**1,000人**目指しています！
Vim移動系脱初級者用コマンド一覧

## 単語移動
`w` - 次の単語の先頭に移動
`b` - 現在の単語もしくは次の単語の先頭に後退
`e` - 現在の単語もしくは次の単語の末尾に前進
`ge` - 前の単語の末尾に後退
## 行内検索
`f{char}` - 次にある{char}までカーソルを末尾方向に移動
`F{char}` - 前にある{char}までカーソルを先頭方向に移動
`t{char}` - 次にある{char}の直前の文字までカーソルを末尾方向に移動
`T{char}` - 前にある{char}の直前の文字までカーソルを先頭方向に移動
`;` - 直前の文字検索コマンドを繰り返す
`,` - 直前の文字検索コマンドを逆方向に繰り返す
##テキストオブジェクトを使った移動
`i`（inside）と`a`（around）の二種類。
ヴィジュアルモードとオペレータ待機モード（d, c, y, など）で使える。
## マーク移動
`‘{char}` - マークされた場所にジャンプ
`‘‘` - 現在のファイルで直前に行われたジャンプ以前にいた場所
## 画面遷移
`<C-w>h` - 左分割画面へ
`<C-w>l` - 右分割画面へ
##その他
`%` - カッコにカーソルがある時、対になるカッコへジャンプ
ssh接続時の Permission denied (publickey).エラーについて~capistrano自動デプロイ、ローカル・サーバーからのssh接続~

##概要
こんにちは。今回はcapistrano × unicornを用いた自動デプロイを行う時にGit Hubへのssh接続ができず、長時間エラーにはまってしまったので解決方法を書きました。

環境
Rails 5.0.7
AWS EC2
unicorn
capistrano

## エラー内容

```
#bundle exec cap production deployコマンドを実行

Permission denied (publickey).
```

こちらはcapistranoで自動デプロイコマンドを実行した時に、EC2へのアクセスは上手くいくが、EC2にアプリをクローンする時に、EC2→Git Hubへのssh接続ができずに起きたエラーです。

このエラーはCapistranoを使用していない場合でも,手動でサーバーやGit Hubにssh接続を試みた時にも起こりうるエラーです。

## 解決策

解決策はズバリssh-agentでした。

このエラー内容で検索するとssh-agentを使用するという方法はかなりたくさん出てくるのですが、初心者の私には結局何をしたらいいのか理解するまでにかなり時間がかかってしまいました。

その時の私の設定としては

ローカルにEC2へ接続する鍵を置き、EC2サーバーにGitに接続する鍵を置くというものでした。

EC2への鍵→ローカル
Git Hubへの鍵→サーバー

このようにデプロイ時に必要なssh接続する為のkeyparは2セットです。

ssh接続とは手元に秘密鍵、接続先に公開鍵をセットしておくことでコマンドを実行するとアクセス可能になるという方法です。（私はこの時点でssh接続さえあまり理解できてませんでした。)

しかし検索したところサーバー上に秘密鍵を置いておくという環境はセキュリティ的によろしくないそうです。

スクールのカリキュラムや初学者用のデプロイ記事ではサーバー上に鍵を置く方法が書いてあることが多いように思えました。

では、どうするかというと

ローカル上に鍵を二つとも置いておきます。

EC2への鍵→ローカル
Git Hubへの鍵→ローカル

これではサーバーからGit Hubへ接続できないのでは、と思いますが
それを可能にするのがssh-agentです。

具体的には以下コマンドで実行します。(※ローカルにEC2,Git Hubそれぞれへの鍵を設置している前提です。）

```
#まずはローカル上で秘密鍵のディレクトリまで移動します。

$ cd .ssh

#続いてEC2,Git Hubそれぞれへの鍵があるかを確認

.ssh $ ls
github_rsa #GitHubの鍵
aws_rsa    #EC2の鍵

#確認した鍵をssh-agentに登録します。

.ssh $ ssh-add github_rsa

.ssh $ ssh-add aws_rsa

#↑での登録が上手くできているか確認します。

.ssh $ shh-add -l

#文字列が二つでるはずです。(※他の記事では鍵名が末尾に表示されるとありましたが私のターミナルではありませんでした。）
xxxxxxxxxxxxxxxxxxxxxxxxxxxxx(RSA)
yyyyyyyyyyyyyyyyyyyyyyyyyyyyy(RSA)

#ダウンロードした鍵であれば.pemの可能性もあります。
```
以上が、
ローカルにあるEC2、Git Hubへの二つの鍵をssh-agentに登録する。
という作業になります。

それではこの鍵を用いて、
1.ローカルからEC2へ接続
2.EC2からGit Hubへ接続
を行ってみます。

```
#末尾の　-A に注目！
$ ssh -i ~/.ssh/aws_rsa username@IP -A


       __|  __|_  )
       _|  (     /   Amazon Linux AMI
      ___|\___|___|
末尾の-Aというのがssh-agentを使用するというオプションになります。
これがないとssh-agentに登録しているGit Hubの鍵をEC２に持っていくことができません。

次にEC2からGit Hubにアクセスしてみます。

[username@ip ~] $ssh -T github
Hi "Git Hubのユーザー名"! You've successfully authenticated, but GitHub does not provide shell access.
```
このようにサーバーでコマンド一つでGit Hubと接続できれば成功です。

※もしこのコマンドでパスワードを聞かれた場合はssh-agentの使用に失敗しています。

以上がssh-agentを使用して　ローカル→サーバー→Git Hubへと接続する方法となります。

それでも自動デプロイできないという方は↓

##補足
その他の理由で接続エラーが起きる事があります。

capistranoを用いて自動デプロイを行う際はサーバーへの接続鍵を指定しているコードにforward_agent: trueのオプションを追記する必要があります。

```
set :ssh_options, auth_methods: ['publickey'],
                  keys: ['~/.ssh/first_aws_rsa'],
                  forward_agent: true
```
ssh-agentは一度ターミナルを閉じるとリセットされます。
一度は上手く接続されたのに、急に接続されなくなったという方はssh-add -lで正常に登録されているかどうかを確認してください。

さらに毎回デプロイコマンドを実行する前に一度手動で接続をしなければなりません。

```
#一度は成功したのにしばらくするとエラーになるという場合はこのフローを行う。

#ローカル
$ ssh-add 鍵名

$ ssh -i ~/.ssh/aws_rsa username@IP -A

#サーバー
$ ssh -T github
```
ターミナルを落としてもssh-agentを持続させるオプションもあるようなのですが、私は今の所それを実行することはできませんでした。

以上です！
ソートを勉強してみる by Go ②

[ソートを勉強してみる by Go ①](https://qiita.com/dtmu/items/1372a32762cfad494801) の続き。
クイックソートしてみました。意外とすんなりいきました。

```go
package main

import (
	"fmt"
	"math/rand"
)

func main() {
	length := 20
	list := make([]int, length)
	for i := 0; i < len(list); i++ {
		list[i] = (rand.Int() >> 56)
	}

	sort(list, 0, len(list)-1)

	for i := 0; i < len(list); i++ {
		fmt.Println(list[i])
	}
}

func sort(list []int, start int, end int) {
	if start >= end {
		return
	}
	var stack int

	left := start
	right := end - 1
	marker := end
	for {
		for ; left <= marker; left++ {
			if list[left] > list[marker] {
				break
			}
			if left == marker {
				sort(list, start, end-1)
				return
			}
		}

		for ; right >= left; right-- {
			if right == left {
				stack = list[right]
				list[right] = list[marker]
				list[marker] = stack
				sort(list, start, right-1)
				sort(list, right+1, end)
				return
			}
			if list[right] < list[marker] {
				stack = list[right]
				list[right] = list[left]
				list[left] = stack
				break
			}
		}
	}
}
```
GoogleMapGeocodingAPIをReactで使用する

## やりたいこと
GoogleMapをアプリで使用する際に、場所の検索ができると思いますが、その機能をAPIでも実現したいです。
GoogleMapには`GeocodingAPI`が用意されていて、場所の名前から緯度・経度を返してくれます。これをReactで使用するときのサンプルを紹介します。

## 前提等
* GeocodingAPIを、有効化していることを前提としてます。有効化の手順は[Google Geolocation APIキーを取得する方法](https://programmingnavi.com/1341/)を参照してください。
* 地図用のライブラリとして、[google-maps-react](https://github.com/fullstackreact/google-maps-react)を使います。
* ライブラリの使い方やReactの実装方式やstateの管理は、[【React】GoogleMapで地図をドラッグして移動した後にMarkerを更新する](https://qiita.com/someone7140/items/66c6b9afd9d397d9fb58)と同様とします。
* Geocodingの実装については[Adding multiple markers to react google maps while using geocoder](https://stackoverflow.com/questions/57236729/adding-multiple-markers-to-react-google-maps-while-using-geocoder)を参考にしています。

## サンプル
``` GoogleMapComponent.js
import React, { useContext } from "react";
import { GoogleApiWrapper, Map } from "google-maps-react";
import { MapStore } from "../../store/MapStore";

export const GoogleMapComponent = ({ google }) => {
  const { state, dispatch } = useContext(MapStore);
  const location = state.currentLocation;
  const [place, setPlace] = useState("");
  function handleChangePlace(e) {
    setPlace(e.target.value);
  }
  // 地名での検索
  function handleSearch() {
    if (place !== "") {
      const geocoder = new google.maps.Geocoder();
      // Geocodingの呼び出し
      geocoder.geocode(
        {
          address: place,
          region: "jp",
        },
        function (results, status) {
          if (status === "OK") {
            const geometryLoc = results[0].geometry.location;
            dispatch({
              type: "CHANGE_LOCATION",
              currentLocation: {
                latitude: geometryLoc.lat(),
                longitude: geometryLoc.lng(),
              },
            });
          }
        }
      );
    }
  }
  return (
    <input
      type="text"
      name="place"
      value={place}
      onChange={handleChangePlace}
    />
    <input type="button" value="検索する" onClick={handleSearch} />
    <Map
      google={google}
      zoom={15}
      center={{ lat: location.latitude, lng: location.longitude }}
      initialCenter={{ lat: location.latitude, lng: location.longitude }}
    />
  );
};

export default GoogleApiWrapper({
  apiKey: process.env.REACT_APP_GOOGLE_MAP_API_KEY,
})(GoogleMapComponent);

```
docker-composeでアプリサーバーコンテナからMySQLサーバーコンテナに接続する。

#実行環境
Docker for Mac
Docker version 19.03.8

簡単な事だけどかなり手こずったのでまとめ。

**Dockerfile**

```
FROM ruby:2.7.1-buster

RUN gem install rails

# node.jsをインストール
RUN apt-get update && \
    apt-get install -y node.js

# yarnをインストール
RUN apt-get update && apt-get install -y curl apt-transport-https wget && \
    curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \
    echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list && \
    apt-get update && apt-get install -y yarn
RUN rails webpacker:install
RUN yarn install --check-files

COPY Gemfile /Gemfile
COPY Gemfile.lock /Gemfile.lock

RUN bundle install

＊開発環境には node.js、 yarn、 webpackerのインストールが必要なので先にインストールしておく。
```

**docker-compose.yml**

```
version: "3"
services:
  mysql:
    image: mysql:8.0.20
    command: --default-authentication-plugin=mysql_native_password
    environment:
      MYSQL_ROOT_PASSWORD: root
  app:
    build: .
    volumes:
      - ".:/app"
    ports:
      - "3000:3000"
    tty: true
    depends_on:
      - mysql
    working_dir: "/app"
```

これらを元にdocker-composeでコンテナを立ち上げていきます。

```
$ docker-compose up
```
立ち上がったらコンテナ内にアクセス。

```
$ docker exec -it (立ち上げたコンテナのNAMES) /bin/bash
```

mariadb-clientをインストール

```
$ apt install mariadb-client
```
 mysqlにアクセス

```
$ mysql -u root -proot -h mysql

* docker-compose.yml参照
-u = ユーザーを指定
-p = 指定したユーザーのパスワード
-h = ホスト、mysqlコンテナの名前?
```

```
MySQL [(none)]>

*アクセス成功
```

一度ログアウトしconfig/database.ymlを編集します。
具体的にはdatabaseがsqliteになっていたのでmysql2に変更します。

```
# SQLite. Versions 3.8.0 and up are supported.
#   gem install sqlite3
#
#   Ensure the SQLite 3 gem is defined in your Gemfile
#   gem 'sqlite3'
#
default: &default
  adapter: mysql2
  encording: utf8
  username: root
  password: root
  host: mysql
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  timeout: 5000

development:
  <<: *default
  database: rails_development

# Warning: The database defined as "test" will be erased and
# re-generated from your development database when you run "rake".
# Do not set this db to the same as development or production.
test:
  <<: *default
  database: rails_test

production:
  <<: *default
  database: rails_production
```

Gemfileもsqliteからmysqlに変更

```
source 'https://rubygems.org'
git_source(:github) { |repo| "https://github.com/#{repo}.git" }

ruby '2.7.1'

gem 'rails', '~> 6.0.2', '>= 6.0.2.2'
# sqliteからmysql2へ
gem 'mysql2'
gem 'puma', '~> 4.1'
gem 'sass-rails', '>= 6'
gem 'webpacker', '~> 4.0'
gem 'turbolinks', '~> 5'
gem 'jbuilder', '~> 2.7'

~省略~
```

```
$ rake db:create
$ mysql -u root -proot -h mysql * もう一度mysqlに接続
$ show databases; * rake db:createが出来ているか確認
```

```
MySQL [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| rails_development  |
| rails_test         |
| sys                |
+--------------------+
6 rows in set (0.011 sec)
```

一応ここまでやっとけば開発できると思う。完全に自分用で参考にならないかもしれません。
参考: [Docker超入門 Part03 - 複数コンテナを動作させる](https://www.youtube.com/watch?v=hynbpprZsAA&t=353s)
ViewModelProviders is deprecated になっているので、ViewModelProviderを使う

# ViewModelProviders が非推奨になっている

公[Android Developer 公式: ViewModel](https://developer.android.com/reference/android/arch/lifecycle/ViewModel?hl=ja)に書いてある
``ViewModelProviders.of(this).get(UserModel.class)``
をつかうと deprecated(非推奨) と表示されてしまう。
[公式のViewModelProviders](https://developer.android.com/reference/android/arch/lifecycle/ViewModelProviders)の説明によるともうメンテナンスがされないらしい。  
今後は ``ViewModelProvider`` を使わないといけないらしいので今回はその使い方を紹介する。

#用意するファイル

## Activity
プロジェクト開始時に通常通り生成されるもの
解説は省く

## ViewModel
MVVM アーキテクチャで View と Model をつなぐもの。メリットとしては下記の２つが考えられる。
・画面回転時に View に持たせていたデータが消えるのを防ぐ
・疎結合にしてくれるので Activity が太るのを防ぐ

## Factory
ViewModel を Activity で呼ぶ際に使うクラス。
Factory クラスでインスタンスの作り方を管理して、Activity でクラスを呼び出す際にで具体的な処理を行っている。

# 使い方
以下のコードの通りに使うことができます。
ViewModelに設定した文字が  Activity から呼び出されるだけのコードです。

```` kotlin:MainActivity

package com.example.viewmodel_fragment

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProvider

class MainActivity : AppCompatActivity() {

    lateinit var factory: MainViewModelFactory
    lateinit var viewModel: MainViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        factory =  MainViewModelFactory()
        viewModel = ViewModelProvider(this, factory).get(MainViewModel::class.java)

        viewModel.loadData()

        viewModel.user.observe(this, Observer {
            println(it)
        })

    }
}

````


```` kotlin:MainViewModel
package com.example.viewmodel_fragment

import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel

class MainViewModel : ViewModel(){

    val user: MutableLiveData<String> = MutableLiveData()

    fun loadData(){
        user.postValue("higu")
    }
}

````


```` kotlin:MainViewModelFactory
package com.example.viewmodel_fragment

import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider

class MainViewModelFactory : ViewModelProvider.NewInstanceFactory(){
        override fun <T : ViewModel?> create(modelClass: Class<T>):T {
            return MainViewModel() as T
        }
}
````

Factory に関して補足をすると T というのはジェネリクスといい、メソッドやクラスに型を
つけることができる機能です。
AtCoderで水色になるまで

# 自己紹介
こんにちは。先日水色コーダーになった大学三年生です。言語はpython,始めたのは去年(2019年)の6月です。あまり文章を書くのが得意ではないのですが、最後まで見ていただければ幸いです。
# 競技プログラミングを始めた経緯
大学に入って情報系の勉強を始め、同年10月に基本情報、翌年の4月に応用情報を取り、次に何勉強しようかな～と考えていたところ、情報系でない友人がpythonで機械学習を独学で行っていたのを発見し、とんでもないな。と思いpythonの勉強を始めました。
当時はpythonという言語のことは知っていたのですが、具体的な文法は何も知らず、学校ではProcessingというあまり有名でない言語を学ばされていたため、すごく焦りを感じたのを覚えています。情報系でない学部の学生がプログラミングやりだしたら、自分たちの市場価値落ちるじゃん！となり、大急ぎで環境構築をし、文法の勉強を始めました。
ところが、inputは適当にできるがoutputする場面が全くなく、Progateなど、その他プログラミング勉強サイトを探してみましたが、しっくりくるものがなくどうしたものかなーと足踏みしていた時に、Twitterで友達が（上記の友達とは別）「競技プログラミングやらんの？」とリプライを飛ばしてきました。「なにそれ？」と冷静を装って返信をしました。
が、確実におもしろいだろ、僕はプログラミング大好きだし人と競うのも大好きなのに。速攻で検索をかけ、AtCoderを発見しました。
そこから競技プログラミングの沼にはまるまで時間は必要なかったです。問題を解く機械になりました。
#持っている知識
BFS、DFS、セグメントツリー、DP、二分探索、逆元、UnionFind、ダイクストラ、ワーシャルフロイドなどです。数学は受験で使ったので、最低限の知識はある状態です。ただ、正直なところ、水色になるために必要な知識としては、二分探索、BFS,DFSぐらいだと思います。あとは早く正確に解くことを意識すればたぶん行けます。この方法で青は無理です。
#水色になるまでにやったこと
結論としては、問題を解きまくりました。ただ、努力というものはいつでも向ける方向を間違えてはいけないと思っています。飽きるのが先か、結果を出すのが先かです。あなたが競技プログラミングに情熱を注いでいればいるほど、努力の仕方は考えなければいけません。問題を解きまくるにしても、意識しなければいけないことはいくつかあります。以下では、自分が意識していたことを言葉にしていきます。
## 知らないアルゴリズムはその場その場で覚える
人間は、今必要ないことはあまり覚えられません。逆に、今必要なことはすんなり入ってくることが多いです。つまり、今必要なアルゴリズムをその時に学ぶのが効率がいいと思っています。問題を解き、わからないアルゴリズムがあったときに、その問題を解くために、アルゴリズムを勉強しましょう。
蟻本などを読んでアルゴリズムをすべて覚えてから競技プログラミングをやるぞ！とかは多分辞めたほうがいいです。
## 絶対に実装する
問題を解いた後に、頭の中で出来たからと言って実装せずに次の問題へ進む方がいます。これも絶対にやめましょう。理由の一つ目としては、多分、実装できないからです。実装せずに飛ばす問題には実装が重い問題が多く、おそらく最後までバグなしで実装することは難しいでしょう。
二つ目に、効率の悪さです。問題を解くフェーズには二つあり、一つ目が考察。どのようなアルゴリズム、データ構造を使えばこの問題が解けるのかを考えるフェーズ、二つ目が実際にそれをコードへ落とし込むフェーズがあります。体感ですが、僕の周りには一つ目のフェーズはできても、二つ目のフェーズができない人が多いです。つまり、その部分の練習が足りていない人が多いということです。ぜひ実装しましょう。我々がやっているのは競技考察コンテストではありません。

## 類題を解く
何においてもそうですが、BFSができないのであればBFS、DPができないならDPの問題を解かないと出来るようになりません。当たり前ですね。
幸い問題に解説があるため、その問題を解くために必要な知識が記載されているはずです。自分ができなかった問題の類題をぜひ解きましょう。

## 逃げるの大事
解説読んでもわからない問題があれば一旦逃げましょう。先ほども書きましたが、飽きるのが先か、結果を出すのが先か、です。解説を読んでも理解できない問題が仮に理解できたとして、コンテスト中に解けるようになるのは早くて一ヶ月先、三ヶ月先の場合もあると思います。だったら、自分が読んで、理解できて、実装できる問題を確実にとる方が結果が出るのは絶対に早いです。自分の中で大切にしている言葉があり、プロゲーマー、梅原大吾さんの言葉で「ゲームに飽きたんじゃない、成長しないことに飽きたんです」という言葉があります。まず、自分で成長を実感できるのを最優先にしましょう。

## コンテストにでよう
みなさん、今から100分集中して勉強できますか？と言われたときにYESと答えれる方はかなり少数だと思います。しかし、どうでしょう。コンテストに出た際、かなり神経が研ぎ澄まされてると思います。ありえないぐらい集中しているのではないでしょうか？毎週この密度の勉強をしてて、レートが上がらないはずが無いです。
また、コンテスト中に自分が解けなかった問題はかなり悔しさが残ります。普通に問題を解いているときとはまた違うモチベーションで問題が解けるため、かなりおすすめです。

## 身近に競える人を作ろう
僕の場合は先輩と教授でしたが、友達などでも後輩に負けたくないでもOKです。誰かと一緒にする競技プログラミングはとても楽しいですし、負けたときの悔しい感情は是非大切にしてください。

## 最後に
長くなりましたが、読んでいただきありがとうございました。新しい言語をやる際など、ぜひAtCoderを使うといいと思います。（AtCoderからお金は貰ってません）
Javascriptのスプレッド構文（...）について


### スプレッド構文とは
もっかReactを勉強中ですが、Reactではよくピリオドが3つ並ぶやつ（...）が使われているのを見ます。
これはスプレッド構文と呼ばれるものです。
私自身、今まであまり理解せず使っていましたが、自分用に少しまとめました。

### 1.基本事項確認
[MDNのドキュメント](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Spread_syntax)で書いてあったものを要約すると


> 配列式や文字列などの反復可能オブジェクトを展開する


雰囲気はforループみたいなもので、展開して値を渡しているという感じですね。

### 2.使ってみる

[MDNのドキュメント](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Spread_syntax)に載っていたものは

```
function sum(x, y, z) {
  return x + y + z;
}

const numbers = [1, 2, 3];

console.log(sum(...numbers));
> 6
```

ここでは配列を展開して、関数の引数として渡しています。

展開したものがどういうものか見てみますと、

```
const numbers = [1, 2, 3];

console.log(numbers);
> Array [1, 2, 3]

console.log(...numbers);
> 1 2 3
```

展開した場合は、リストではなく、別のものになっていました。

オブジェクトの場合、

```
const numbers = { x: 1, y: 2 };

console.log(numbers);
> Object { x: 1, y: 2 }

console.log(...numbers);
> Error: Found non-callable @@iterator

console.log({...numbers});
> Object { x: 1, y: 2 }

console.log([...numbers]);
>Error: numbers is not iterable

```

オブジェクトを展開してそのまま表示しようとするとエラーになります。
オブジェクトを展開して配列にしようとしてもエラーになります。
また、オブジェクトを展開して再度オブジェクト化すると、元のオブジェクトと同じものができます。
オブジェクトの展開について、[MDNのドキュメント](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Spread_syntax)を見ますと、

>オブジェクト自体は反復可能ではありませんが、配列の中で使用したり、 map(), reduce(), assign() などの反復関数と共に使用したりすることで反復可能になります。
スプレッド演算子で結合する場合は、結合時に別の反復処理関数を使用することを前提としています。

どうやらオブジェクトは反復可能な状態にして使うようです。

エラー文を見ると配列に変換できないのは、iteratorを持たないかららしいです。この結果からオブジェクトを展開したものは配列を展開したものとデータの型が違うことがわかります。

その他、連結について、

```
let arr1 = [0, 1, 2];
let arr2 = [3, 4, 5];

arr1 = [...arr2, ...arr1];
console.log(arr1);
> Array [3, 4, 5, 0, 1, 2]
```

連結も可能です。


また、調べたところ、※1.ある方がオブジェクトのネストのことも書かれてました。

```
const nest = {
  x: {"a1":1, "a2":2, "a3":3},
  y: [4, 5, 6]
};

console.log(...nest);
>Error: Found non-callable @@iterator

console.log(...nest.y);
> 4 5 6
```

なるほど。なるほど。

### 3.参考
※1.ネストのこと
https://qiita.com/akisx/items/682a4283c13fe336c547
Nuxt.js + FirebaseでWEBアプリを作ってみました＠TechTrainハッカソン

みなさん、はじめまして。LeadHACKといいます。

[LeadHACK](https://leadhack.pro/)は創価大学を拠点として、大学内のプログラミング力向上を目的に活動してます。

今回はアンバサダー提携を結んでいる[TechBowl](https://techbowl.co.jp/#supporter)さんのハッカソンに参加してWEBアプリを作ったので、その紹介をしたいと思います。

# TechTrainオンラインハッカソン　〜10万円をかっさらえ〜
### テーマ
朝弱いエンジニアのための「何か」を創れ。

### 概要
* 朝早く起きれる企画であり、何を作ってもOK
* 開発期間：3/19(木)-3/29(日) 10:00
* プレゼンテーション日時：3/29(日) 13:00
* 優勝賞金：10万円
* TechBowlさんの報告記事は[こちら](https://note.com/techbowl/n/n91351f0be130)

### 参加メンバー
今回はM1の2名とB3の2名の計4名で参加しました。


# 今回開発したもの
## 背景
### 早く起きるために
朝起きるために何が大事か。それは**早く寝ること**である。
しかし、「早く寝れないんだよー」という方もいるかと思いますが、それは早く起きれば解消します。

「鶏が先か、卵が先か…」

つまり、課題に対するアプローチとしては**「習慣を作ること」**が重要と考えました。
そこで、今回開発するアプリケーションの目的は**「いつも早く起きるモチベーションを作る！」**ということになります。

### 工夫点
今回はあえてユーザにリスクを与えて心理的に追い込むようなことはしませんでした。
それは、リスクはストレスになる可能性が高いからです。
そうなると、

- アプリが使われなくなる原因となる
- ストレスに慣れると効果がなくなる

といったことに繋がるからです。

なので、あくまで

- 朝起きる**楽しさ**を提供する！
- 朝起きたい**欲を強化**する！

といったことに重点を置きました。

## 機能紹介
今回、対象となるユーザはエンジニア。
エンジニアは収集欲が強いのでは？ということで、今回はガチャをベースにしました。

アプリ名は「集めろ、早起きの民」、略して「あつたみ」！

某ゲームを連想させますが、今回はガチャでカードを集めるアプリとなっています。

### ユースケース
ユーザのサイクルを次のように想定しました。
結果をSNSへ投稿し自慢することで、エンジニアの欲望を満たすという仕様になっています。

1. 寝る
2. 起きる
3. アプリでガチャを引く
4. SNSへ結果を投稿
※以後サイクル

### ガチャ
ガチャで得られるのは「有名人」のカード。
Twitterのフォロワー数が多いほど、朝早い時間に確率UP！

しかも、複数枚集めることで、カードと自分のレベルアップが上がっていきます。

## システム構成
今回は、起きてすぐ使えるということでスマートフォンを利用することを想定し、Webアプリとして開発しました。

フロントエンドには Vue.jsとNuxt.jsを採用し、PWA化することでネイティブアプリのような見た目になりました！

> PWA（Progressive Web Apps）はグーグルがモバイルユーザーのユーザー体験向上を目的とし、今までのWebアプリ（サービス）にWebとアプリの両方の利点を兼ね備えた仕組みのことです

[Googleが取り組むWebのアプリ化プロジェクト「PWA」とは？- WPJ](https://www.webprofessional.jp/what-is-the-attention-project-pwa-by-google/)

認証やデータの格納などバックエンドの処理はGoogleのFirebaseを利用しました。

今回はGoogleアカウントでログインができるようになっています。
その他、Firebase関連の機能として

- Firestore(データベース): データの保管
- Hosting(デプロイサーバ): Webアプリを置く場所

を利用したため、今回はSPAかつサーバレスで動作しています。

構成イメージは以下のようになっています。


## 成果物デモ
![demo_image_edit.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620375/8c3f581f-aaec-c6f8-7e13-33d2fa185a4b.png)


1. ログイン後に表示されるマイページ（ガチャ取得履歴）
  - 複数枚集めるとレベルアップ（AtCoderの色で変化）
2. ユーザメニュー
  - ログイン・ログアウト
  - 時刻設定
3. 起床時刻の設定
4. 起床時の画面
5. 問題を解く
6. ブルースクリーンで覚醒
7. ガチャ結果


## 今後の展望
- 有名人をグループ分けしてユーザに合ったカードを排出
- SNSへの投稿機能（API申請の都合上、実装できず）
- 有名人の起床時刻をSNSから参照して動的に
- ランキング機能の搭載（最強の朝活エンジニア決定戦！）
- カードを編成してカードゲームのような対戦機能

## スライド共有
当日はこういった資料で発表しました。
[![thumbnail](https://image.slidesharecdn.com/techtrainhackathon-200419073655/95/20200329techtrain-1-638.jpg)](https://www.slideshare.net/LeadHACK/20200329techtrain-232250221)


## 所感
### 気づき・学び
- Vue.js/Nuxt.jsに触れることができた
- グループ開発におけるGitHubの使い方を経験できた
    - issueやプルリクのワークフロー
- Tech系イベントの雰囲気を知ることができた
    - みなさんが注目している技術ワードも知ることができた
    - Nuxt.jsとFirebaseを使ったアプリが多かった印象    
- Googleハングアウトを使いオンラインで開発したが、比較的密な連携が取れた
- メンターを積極的に活用すべきだった

## まとめ
今回は、オンラインハッカソンとして「朝に弱いエンジニアのために」Nuxt.jsとFirebaseを用いて、ガチャ機能を搭載したWebアプリを開発しました。
入賞こそできませんでしたが、オンラインにも関わらず刺激を多く受けることができました！
次回もメンバーを巻き込んで、積極的に参加し、自らのスキルアップに繋げていければと思います！
【jQuery】マウスが乗った時にメッセージを表示させる

学習用に作ったチャットアプリにて。
写真左上のチャットグループの「編集ボタン」にアイコンを使用しており、
ぱっと見、何のボタンか分かりづらい。
<img width="1426" alt="スクリーンショット 2020-04-29 0.33.20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/601520/ad7987bc-be05-89f4-fff4-236f1174a855.png">

今回は何をするアイコンか分かりやすくする方法を
ざくっとご紹介。

# 【完成形】 
ホバー状態においては
何のボタンなのか分かるようにする。
[![Image from Gyazo](https://i.gyazo.com/3719b75695445514484b9aa00c4cbcd7.gif)](https://gyazo.com/3719b75695445514484b9aa00c4cbcd7)

## 1. 表示するメッセージの要素を追加

```haml:sample.haml
.main-header__edit-message  【ホバーで出てくるメッセージ】
  グループを編集する
%a
  = link_to edit_group_path(@group.id) do
    %i.far.fa-edit    【使っているアイコン】 
```
## ２. ホバー時以外は出てこないようにする
続いて今のメッセージにcssを当てます。
非表示状態にしているのは、【opacity】のところ。

```sass:sample.scss
  
~省略~

&__main-header {
    background-color: #fafafa;
    height: 70px;
    padding: 0 40px;
    display: flex;
    justify-content: space-between;
    &__edit-message {
      height: 30px;
      width: 180px;
      line-height: 30px;
      text-align: center;
      border-radius: 15px;
      background-color: black;
      color: #ffffff;
      opacity: 0;    ⬅️ここ
    }

~省略~
```

**❗️**「opacity」は要素の透明度を指定するプロパティ。
  （ 0にすると完全に透明になる ） 
&nbsp;&nbsp;( 1 だと表示される)

## ３. ホバー時に表示させる
ここからjsファイルへいきます。

```javascript:sample.js
$(function(){

  $(".fa-edit").on( 'mouseover', function(){  //カーソルが乗った時
    $(".main-header__edit-message").css( 'opacity', '1')   
    $(".main-header__edit-message").css('transition', '0.3s')
  });
  $(".fa-edit").on( 'mouseout', function(){   //カーソルが外れた時
    $(".main-header__edit-message").css( 'opacity', '0')
    $(".main-header__edit-message").css('transition', '0.1s')
  });

~省略~

```
これでカーソルが乗った時と、外れた時にopacity【0 ・ 1】が入れ替わるようになります。
【transition】で動きの時間を指定しています。

____________________________________
ついでなので、
同じ要領で他のアイコンにも入れておきます。
[![Image from Gyazo](https://i.gyazo.com/17fe0cd704cac231c9cc890c3e51220b.gif)](https://gyazo.com/17fe0cd704cac231c9cc890c3e51220b)

_________
今回の作業はこれで終了です。
ご覧いただきありがとうございました。
スマートフォンをwebカメラの代用にする方法

# 概要
カメラがなければ、スマホを使えばいいじゃない。
・・・アントワネット的な書き出しになりましたが、非常事態宣言で、急にテレワークとなり、webカメラやマイクのニーズが非常に高くなっています。
おかげで、手ごろな金額のwebカメラはAmazonですら品薄です。
じゃあ、手持ちのスマートフォンで代用すればいいじゃない、というのがこの記事の趣旨です。

具体的には、iVCamというアプリをスマートフォンとパソコンにインストールして、USBケーブルやWifiでつなぐだけです。
遅延を考えるなら、有線の方が安全だと思います。

# 環境
今回はiphoneをwebカメラとして、パソコンにつなぎます。
カメラ側は別にiPhoneでも、Androidでも、何でも構いません。
あまり古いと無理かもですが・・・
パソコンも、今回はWindowsですが、Macでも可能です。

# やり方
## スマートフォン側
### (1) スマートフォン版
<img width="320" alt="20200429_094035000_iOS.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/400941/ae0ecea0-0234-4688-3b47-05fd7f0c38db.png">
### (2) パソコンとUSBケーブルで接続
手持ちのケーブルで接続してください。
### (3) アプリを起動し、通知を許可
許可します。
<img width="320" alt="20200429_094639000_iOS.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/400941/69c0e16e-e5f3-129d-e94b-f2f1805267cd.png">
### (4) 待ち受け状態に移行
以下のような待ち受け状態になれば準備完了です。
<img width="320" alt="20200429_094711000_iOS.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/400941/ac4fcc7d-164d-ddce-1e10-304e9d7e0a08.png">
## パソコン側
### (1) パソコン版のアプリをダウンロード
以下のサイトからダウンロードします。
https://www.e2esoft.com/ivcam/
![2020-04-29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/400941/d34f50b2-657f-71e5-b88b-0da449e68d22.png)
### (2) パソコンにインストール
![2020-04-29 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/400941/f3f2c2bb-dca3-012d-2fec-29b76c68ea3d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/400941/9640b718-1117-82cc-5dc2-a8fe17568ffa.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/400941/9a35a640-141b-f586-3ef4-c3c8728feb07.png)
### (3) パソコン版を起動
インストールした、iVcamを起動します。
以下のように、iphoneのカメラの画面が映れば成功です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/400941/8984605b-c187-2eb9-4dac-739016763201.png)
言語処理100本ノック　第4章: 形態素解析　30. 形態素解析結果の読み込み

実行環境
・MacOS
・AnacondaからのJupyter Notebook
・Python 3.7

# 30. 形態素解析結果の読み込み
> 形態素解析結果（neko.txt.mecab）を読み込むプログラムを実装せよ．ただし，各形態素は表層形（surface），基本形（base），品詞（pos），品詞細分類1（pos1）をキーとするマッピング型に格納し，1文を形態素（マッピング型）のリストとして表現せよ．第4章の残りの問題では，ここで作ったプログラムを活用せよ．

前回、以下の前処理したデータを使って続きの処理をする。

前回の処理

``` python
# ファイル読み込み
path = '/Users/shin/Documents/NLP/neko.txt'
with open(path) as f:
    l = f.readlines()
    print(l)

# Pythonで文字列のリスト（配列）の条件を満たす要素を抽出、置換
table = str.maketrans({
    '\n': '',
    '\u3000': '',
    ' ':'　'
})
l_replace = [s.translate(table) for s in l]

# 空のlist削除
l_replace = [s for s in l_replace if s != '']
```

ここからが今回の処理

``` python
# 言語処理100本ノック2020:　第四章(形態素解析)
# https://qiita.com/TsumaR/items/40ebf328deeb66e3ba86

from pyknp import Juman
jumanpp = Juman()
result_list = []
for s in l_replace:
    morpheme_list = []
    result = jumanpp.analysis(s)
    for mrph in result.mrph_list(): # 各形態素にアクセス
        component_dict = {
            "surface":mrph.midasi,
            "base":mrph.genkei,
            "pos":mrph.hinsi,
            "pos1":mrph.bunrui
        }
        morpheme_list.append(component_dict)
    result_list.append(morpheme_list)
```

結果

```
[[{'surface': '一', 'base': '一', 'pos': '名詞', 'pos1': '数詞'}],
 [{'surface': '吾輩', 'base': '吾輩', 'pos': '名詞', 'pos1': '普通名詞'},
  {'surface': 'は', 'base': 'は', 'pos': '助詞', 'pos1': '副助詞'},
  {'surface': '猫', 'base': '猫', 'pos': '名詞', 'pos1': '普通名詞'},
  {'surface': 'である', 'base': 'だ', 'pos': '判定詞', 'pos1': '*'},
  {'surface': '。', 'base': '。', 'pos': '特殊', 'pos1': '句点'}],
~
```

ひとまず良さそう。