OmniAICreator/Qiita-1.07M huggingface dataset:
サーベイについて

作りたいものがあったりするときに行うサーベイ．自分もまだまだひよっこだが，研究やミルプラトーでの業務，論文解説バイト等で得た知見を共有してみる．

# なぜサーベイするのか
初手から一番良い手法を採用するため．やり始めてから，「あ，やっぱりもっといい方法あるじゃん」とかは無駄なので．コード書くよりもサーベイする方が大事だと思っている．

# 手順
## 0. 言語について
まずは日本語でいい派．一般的な情報であれば既に日本語の情報もあるので．
次に物足りなくなってきたら，英語に移る．論文等を調べるときも英語．本当の最新の情報は日本語には落ちていない．必ず英語．意識が高いとかではなく，当たり前のものとして英語です．

## 1. キーワード選定
自分が何をしたいのか言語化しよう．Speech RecoginitionなのかSpeech DiarizationなのかSpeech Verificationなのかなど．こうした主要なキーワードを中心に調べていく．

## 2. 論文を調べる
仕事ではあまりしないかもしれないが，研究だったり自分の勉強で行う．基本的に最も最新かつ注目されているものを選ぶ．それにあたって使うサービスは以下．
- **Google Scholar**
キーワードで検索して，引用数上位かつ最新のものを読む．
- **Paperwithcode**
コード付きの論文を紹介しているサイト．Githubのスター数なども参考にしつつ選ぶ．
- **arxiv**
ほとんどのアクセス可能な論文はこのサイトから．趣味でこのサイトあさる人もいるくらい．

## 3. コードを調べる
実装したいテーマのフレームワーク等を調べる．
- **Github Topics**
Githubのトピック検索
- **Paperwithcode**
- **キーワード + awesome listと検索**
主要キーワードであれば，誰かが必ず良い論文やライブラリ集のようなものをGithubのREADME.mdでまとめている．けっこう参考になる．

## 4. 実装
実装にあたってのヒント．
- **キーワード + tutorialと検索**
誰かが簡単に実装する手順を教えてくれてたりする．日本語でも同じ．
- **stackoverflow / github**
エラーが起きたらとりあえずコピペでググる．大抵stackoverflowかgithubでヒットする．自分はstackoverflowをまず見て，それでもなければgithubを見るようにしている．エラーは英語でググると早く解決策を見つけられる．
機械学習本おすすめ

年間300冊ほど乱読したり，推薦図書アプリを作ったりするくらいには本好きな自分が，AI関連で良いと思った本を挙げておく．自分は文系出身なので，初学者でも理解しやすいのではないかと思う．もちろん，自分も学んでいる途中のものもあるので，一緒に頑張ろう的なニュアンス．業務に直接役に立たないかもだけどやると良いものも入れている．

# 機械学習
- **[第3版]Python機械学習プログラミング 達人データサイエンティストによる理論と実践**
全ての本の中で圧倒的におすすめ．理論も実践も学べる網羅的な書籍．これ一冊でよいのではというレベル．

- **Pythonで動かして学ぶ！あたらしい深層学習の教科書 機械学習の基本から深層学習まで**
深層学習だけでなく，Pythonや機械学習の基本を学べる．チュートリアルとしてよくまとまっており，最初にやると良い．

# AIアプリ
やはり開発のだいご味は，アプリを作って「やべー楽しい」とハイになることだと思っているので（変態），簡単にアプリを作れる本を紹介する．

- **すぐに使える!業務で実践できる! PythonによるAI・機械学習・深層学習アプリのつくり方 TensorFlow2対応**
- **増補改訂Pythonによるスクレイピング&機械学習 開発テクニック**
どちらもクジラ飛行机が出版．この会社の本はやってて楽しい．機械学習の楽しさを知りたいならやってみると良い．

# データ分析
- **Python実践データ分析100本ノック**
実戦形式でPandas等を用いてデータ分析できる．

# 画像認識
- **OpenCVとPythonによる機械学習プログラミング**
あまり画像認識特化の本はないのだが，まぁこれかなと．
- **[画像処理100本ノック](https://github.com/yoyoyo-yo/Gasyori100knock/blob/master/README.md)**

# 自然言語処理
自然言語処理は全く詳しくないので，パス．


# PyTorch
　最近よく見かけるPyTorch.最近公開のフレームワークはほとんどPyTorchで実装されている．
- **つくりながら学ぶ! PyTorchによる発展ディープラーニング**
GANまで実戦形式で学べる．PyTorch書籍ではこれが圧倒的におすすめ．

# 数学
機械学習の背景には当然，数学的知識が求められる．
- **マセマシリーズ（微分積分・線形代数・統計学）**
数学をちゃんと理解したいならまずはこれ．
- **人工知能プログラミングのための数学がわかる本**
機械学習関連の数学を理解したいならこれは分かりやすい．
- **身につく　ベイズ統計学**
機械学習においては特にベイズ統計が大事だが，この本が最も分かりやすかった．

# アルゴリズムとデータ構造
- **新・明解Pythonで学ぶアルゴリズムとデータ構造 (新・明解シリーズ)**
Pythonでアルゴリズムやるならこれがいいかと．

# DockerやGithubなどツール
とにかくググる．ググれば大抵解決する．

# IT基本知識
自分は授業で学べなかったので，ITパスポート・基本情報技術者試験・応用情報技術者試験の対策で代替した．
- **(PDF・スマホ単語帳付)かんたん合格 ITパスポート教科書 令和2年度**
- **(PDF・スマホ単語帳付)かんたん合格 基本情報技術者教科書 令和2年度**
- **すぐ理解できるオールカラー ニュースペックテキスト 応用情報技術者 2020年度版 (TAC出版)**

いうて自分も応用情報技術者試験の勉強中です．一緒に頑張りましょう．

# Kaggle
何かと話題になるKaggle. 就活でもアピールできる．これは本よりも記事＆動画がおすすめ．
- [Kaggleに登録したら次にやること ～ これだけやれば十分闘える！Titanicの先へ行く入門 10 Kernel ～ \- Qiita](https://qiita.com/upura/items/3c10ff6fed4e7c3d70f0)
- [Kaggle 入門 Porto Seguro - Youtube](https://www.youtube.com/watch?v=NHQTw-ORcSQ)

以上の2つで入門できる．
Markdownについて

　自分がMarkdownを使う中で，溜まった知見を共有してみたい．学生目線でまとめる．

# なぜ使うか
- めちゃ簡単に書けるから．ワードより早い．簡単．太字にしたり見出しにしたりという手間が省ける．
- GithubのREADMEやkibelaの記事，Qiitaなどのエンジニア向けサービスの多くがMarkdownを採用しているから．一日何度も使うものは覚えた方が良い．健康的に仕事できる．

# Markdown 基本
　よく使うものは限られている．難しくない．よく使うものを挙げておく．

```
・見出し
# 見出し1
## 見出し2
### 見出し3

・コード
「```」で上下囲む

・太字
「**」で文字を挟む

箇条書き
- 箇条書き1
- 箇条書き2

リンク挿入 -> [名前](url)
[Qiita マークダウン記法 一覧表・チートシート \- Qiita](https://qiita.com/kamorits/items/6f342da395ad57468ae3)
```

たったこれだけ．自分は時々レポートなどもMarkdownで書くこともあるくらい，ラクに編集できる．

ちなみに，リンク挿入であるが，自分は下記のChrome拡張を利用することが多い．自分で打つよりも早くMarkdown形式にできるので．[Create Link \- Chrome Web Store](https://chrome.google.com/webstore/detail/create-link/gcmghdmnkfdbncmnmlkkglmnnhagajbm?hl=en)
【Unity】ゲームの実績システムを実装してみた。

ゲームの実績システムを実装してみた。【Unity】

UnityでスマホアプリのStgを作っているのですが、実績システムを実装するにあたって、自分がどうやって作ったかを
備忘録的に書いていきたいと思います。

##そもそも実績システムとは...
自分がプレイ中にした行動に対して一定の規定をクリアしたら報酬がもらえるシステム。
どうすれば実績システムが作れるかを考えていきます。

まず、実績システムを作るために、２つの要素が必要と考えました。
#####１　プレイした時に実績としてデータが保存される機構。
#####２　保存されたデータを取得し、一定の規定をクリアしたら報酬を与える機構。
この二つの要素をクリアすれば実績システムが作れたといえると思います。
まず、１番目のプレイした時に実績としてデータが保存される機構を作っていきました。


```C#:実績保存クラス.C#
public class SaveAchievement : MonoBehaviour
{
    public static SaveAchievement saveAchievement;
    public int enemyKillCount,gameoverCount,clearCount;
}
```
ここでは、実績を保存するためのスクリプトを作りました。
public staticで宣言することによって他のスクリプトから取得することを容易にし、
敵を倒したときの変数、ゲームオーバーになった時の変数、クリアした時の変数を
用意したので準備はばっちりです。ここに他のスクリプトから値を足していくことで
実績システムを作れると思います（敵を倒したときにSaveAchievementのenemyKillCountに
＋１するというようなコードを書く）

2番目の保存されたデータを取得し、一定の規定をクリアしたら報酬を与える機構も作りました。

```C#:実績報酬クラス.C#
public class RewardAchievement : MonoBehaviour
{
    int enemyKillJudgment = 10;//実績規定
    if(enemykillCount <=enemyKillJudgment //{
    //もしもタスクオブジェクトの（実績条件の）達成量が達成規定よりも上回ったら    
        //報酬を与える
    }
}
```
これで、実績システムは完成となります。
##おわりに
実績システムの大枠は作れたのですが、やはり中身がどれだけ充実できているかという所だと思うので、中身を書くときに見やすいコードを意識してい書いていきたいものです。
Githubについて

# なぜ使うか

　なぜわざわざわGithubなんてものを使うかというと，自分は以下のモチベ―ションで使っている．

- ファイルが突然消えてしまうのを防ぐため．ローカルのファイルはいつでも消え得る．PCに水をこぼして壊してしまったり，まちがえて削除してしまったりなど．自分も個人開発していたときに悲劇に見舞われてから，Githubを使うようになった．何十時間，何百時間もかけてかいたコードが一度でも消えてしまった経験があれば，Githubからは離れられなくなる．
- 他の人と一緒に開発できる．sandbox内だけではあまり恩恵を感じないかもしれないが，それでも他の人の進捗状況を把握したりできる．コードに誤りがあれば指摘できる．もちろん，同時に開発できるのが強み．
- 何かと就活で求められる．応募条件にGithubが使えることが必須という場合が多々．というか，Github自体は正直まったく難しくないので，「え？できないの？ヤバくね？」という感覚でもある．
- 他人に自分の成果を見せびらかせる．個人開発したプロダクトのコードを披露する場でもあるし，就活でもよく見せる．大学院入試でも使った．もちろん，sandboxだって，上司に自分がどれだけ仕事をしているのか具体的にアピールする場だと思う．1週間一度も更新されてなかったら，「この人仕事してなくね？」って思われても仕方がない．だってコード書いていないのと同じなのだもの．

　割と下心多めだが，個人的にはこんな感じ．

# Github 基本編
　さて，Githubを使いたくなったら，次は実践である．とにかく使おう．Github上にファイルをアップロードするだけなら，まったく難しくない．たった５ステップ．以下がコードだ．

```
# gitを初期化する -> このフォルダでgitを利用しますよ，という宣言．
$ git init

# レポジトリを登録する -> レポジトリとはGithub上のフォルダ．レポジトリを作成したら，レポジトリのurlを登録しよう．アップロード先を登録する感覚．
$ git remote add origin https://github.com/...

# コミットするファイルを指定．「.」とは全てのファイルという意味．.gitignoreやdockerなど様々な場面で使うから覚えておこう．ここはあまり気にせずgit add .しておけばいいと思っている．
$ git add .

# コミット．ローカルの中で保存するイメージ．アップロードする準備でもある．コミットメッセージは何でもいいが，「update ファイル名」とか変更点をメモする感じ．コミットメッセージの意義は後述．
$ git commit -m "コミットメッセージ"

# Githubにファイルをアップロードする．originとはレポジトリのurl（git remote add で指定したでしょ）．masterとはブランチの名前（後述）．
$ git push origin master

```
　以上これだけ．本当に簡単．だって，たったの5ステップ．

　ここで注意点だが， 直接アップロードは厳禁．これらはすべてコマンドラインで完結させる．でないと手間がかかって仕方がない．（ちなみにコマンドラインはVSCodeの下にくっついているターミナルのこと．）

# Github 発展編
　以上で述べた内容は，自分が個人で使ってたときの理解．これでとくに困ったことはなかったが，ミルプラトーで一応チームでやる中で，発展的な内容も学んだので，ここに記しておく．sandbox内で作業するだけであれば，とくに使う場面もないとは思う．が，やっぱり理解しておくと役立つ．

```
# 既存のレポジトリを引っ張ってくる．チーム外であればgit clone, チーム内であればgit pullという理解．git pullは変更点のみ引っ張ってくるため軽い．
$ git clone ... / git pull ...

# ログを確認する．元に戻したくなったときなどに使う．
$ git log
$ q (ログから抜ける)

# ブランチを作成する．複数人のときに使う．ブランチ切って開発進めたり，プルリクしたり．
$ git branch branch_name

# ブランチを切り替える
$ git checkout branch_name

# プルリクエスト -> pushして，Github上でCompare & pull request. 大元のコードと統合するとき．ちなみにプルリクエストはGithubの機能．
$ git push origin branch_name

# コミットを取り消す. revert は基本的に直前のコミットの取り消しのみに使う．
$ git revert commit_id
$ git revert HEAD
$ git revert --no-edit coomit_id

# git reset -> HEADの位置を大きく移動できるが，以前のコミットの復元に手間

# 直前のコミットを取り消したい
$ git reset --hard HEAD^

# n個前のコミットまで戻したい
$ git reset --hard HEAD~n

# 誤ってresetをしてしまった場合
$ git reset --hard ORIG_HEAD
```

# Github 趣味編

　コミットはできるだけ細かく．コードを元に戻したくなったとき，他の人がコードをチェックするときに役立つ．余裕があるときは自分は以下の記法を採用している． 

1行目: コミットの内容を表す絵文字 + 変更内容を簡潔に英語の命令形で記述
2行目: 空行
3行目以降: なぜ変更したのか詳細な説明を日本語で記述

```
$ git commit -m ":bug: fixed bug"
```
こうすると， 🐛 fixed bugみたいに表示されて分かりやすい．そして楽しい．導入は .commit_templateを追加するだけ．[vad\-sandbox/\.commit\_template at master · milplateaux/vad\-sandbox](https://github.com/milplateaux/vad-sandbox/blob/master/.commit_template)
クラウド資格の難易度をまとめてみた

アソシエイト関連のまとめ

comptia cloud essentials
 クラウドの知識ではなく、ビジネスよりな知識も問われる。
　この資格独特な知識は必要。しかし、難易度は低め。
↓
Microsoft Azure 基礎AZ-900　
　機能の名前を覚えておくレベルでもいけそう。
AWS 認定ソリューションアーキテクト
　情報多めなので、対策をちゃんとすれば、そんなに難しくない。むしろProfessionalがかなり難しい。
↓
Google Associate Cloud Engineer
　この中だと、一番とっつきづらい。コンテナ、データ分析、Iaas、ネットワークと一通り知識は必要。
Kotlin/JS よくある質問

## ホットリロードは出来ますか?
出来ます。 実行時に`-t`オプションをつけると、ソースコードが変更された時に自動的にリロードします。

```
./gradlew run -t
```

https://kotlinlang.org/docs/reference/js-project-setup.html#configuring-run-task

## ブラウザでデバッグ出来ますか？
出来ます。
[Debugging Kotlin in the browser](https://kotlinlang.org/docs/tutorials/javascript/debugging-kotlin-in-browser.html)

## npmは使えますか?

使えます。
[Using packages from NPM](https://play.kotlinlang.org/hands-on/Building%20Web%20Applications%20with%20React%20and%20Kotlin%20JS/07_Using_Packages_From_NPM)

## Reactは使えますか？

使えます。

チュートリアル: [Building Web Applications with React and Kotlin/JS](https://play.kotlinlang.org/hands-on/Building%20Web%20Applications%20with%20React%20and%20Kotlin%20JS/01_Introduction)

## 環境変数を使う方法はありますか？

わかりません。以下に質問が上がっていますが、明確な回答がありません。

[Kotlin JS React accessing/configuring environment variables](https://discuss.kotlinlang.org/t/kotlin-js-react-accessing-configuring-environment-variables/16906)

## フルスタックWebアプリケーションは作れますか？
バックエンドで`Kotlin/JVM`、フロントエンドで`Kotlin/JS`を使うことにより、フルスタックWebアプリケーションを作ることが出来ます。

- チュートリアル: [Building a Full Stack Web App with Kotlin Multiplatform](https://play.kotlinlang.org/hands-on/Full%20Stack%20Web%20App%20with%20Kotlin%20Multiplatform/01_Introduction)
- [KotlinでフルスタックWebアプリケーションを作ってデプロイするまで](https://qiita.com/k-yamada-github/items/771f2c4b4516e61d7233)
マルチスケール特論 第7回

![ruby-2.7.1p83](<https://img.shields.io/badge/ruby-2.7.1p83-brightgreen>) 

# ruby

## rubocop

ruby の linter.`rubocop -A hoge.rb` で自動的に良い感じに修正してくれる

### emacs

以下を.emacs とかに書いとけば、save時に rubocop が走って、自動で修正してくれる。便利。

```elisp
(defun rubocop ()
  (when (eq major-mode 'ruby-mode)
    (shell-command-to-string (format "rubocop -A %s" buffer-file-name))))
(add-hook 'after-save-hook 'rubocop)
```

## .zero?

`year % 4 == 0` と `(year % 4).zero?` は同値らしい？前者の書き方だと rubocop に怒られる

## frozen\_string\_literal: true

rubocop で **Missing frozen string literal comment** って怒られた。ファイル先頭に `# frozen_string_literal: true` というコメントを挿入すると warning は消える。Ruby 3.0 から文字列リテラルが default で immutable になるかららしい。でも文字列リテラルを破壊的変更しても無意味じゃない？

## leap\_year

[うるう年判定](https://qiita.com/daddygongon/items/a550bde1ed6bff5217d8)をする。

```ruby
# frozen_string_literal: true

def leap?(year)
  if (year % 400).zero?
    true
  elsif (year % 100).zero?
    false
  elsif (year % 4).zero?
    true
  else
    false
  end
end

def leap2?(year)
  (year % 400).zero? || !(year % 100).zero? && (year % 4).zero?
end
```

### 条件式がない case は if にされる

```ruby
def leap?(year)
  case
  when (year % 400).zero? then true
  when (year % 100).zero? then false
  when (year % 4).zero? then true
  else; false
  end
end
```

上のコードも rubocop を通すと以下に修正される(case の条件式がないので)。

```ruby
def leap?(year)
  if (year % 400).zero? then true
  elsif (year % 100).zero? then false
  elsif (year % 4).zero? then true
  else; false
  end
end
```

### nonzero?

`Numeric#zero?` の否定っぽい `Numeric#nonzero?` が存在するが、これは罠で、返り値が `nil` だったり `self` だったりする。大人しく `zero?` の否定をとる。

### test code

minitest を使う。

```ruby
# frozen_string_literal: true

require 'minitest/autorun'
require_relative 'check_leap_year'

class SampleTest < Minitest::Test
  def test_leap
    assert_equal true, leap?(2000)
    assert_equal false, leap?(1900)
    assert_equal true, leap?(2004)
  end

  def test_leap2
    assert_equal true, leap2?(2000)
    assert_equal false, leap2?(1900)
    assert_equal true, leap2?(2004)
  end
end
```

```
Run options: --seed 54297

# Running:

..

Finished in 0.000727s, 2750.6571 runs/s, 8251.9712 assertions/s.

2 runs, 6 assertions, 0 failures, 0 errors, 0 skips
```

test 成功。

### leap と leap2 が同値かをテスト

```ruby
tests = [1900, 2000, 2004, 1999]
p tests.map { |t| leap?(t) }.zip(tests.map { |t| leap2?(t) }).all? { |years| years[0] == years[1] }
```

tests の要素 t に対して(map)、leap?(t) と leap2?(t) の結果を(zip)years に格納(years って名前、ナンセンスだった)して、それら2つが同じ値か比較していって、一つでも false があれば false、全て true なら true が返る(all?)。

## FILE

python でいう、

```python
if __name__ == "__main__":
    main()
```

をやりたくて以下のように書いたんだけど、

```ruby
if __FILE__ == $0
  main
end
```

rubocop が言うには

```ruby
main if __FILE__ == $PROGRAM_NAME
```

が良いらしい。

------
 - **source** ~/ghq/github.com/TeamNishitani/grad_members_20f/members/syasin-5d/7th.org
[Rails]パンくず機能

# はじめに
画面遷移をわかりやすくするために、gretelというgemを使用してパンくず機能を実装しました。
![パンくずリスト](https://i.gyazo.com/f6f90cf552c23036ec153766fe8c5a57.png)

# 目次
- 1. gretelのインストール
- 2. パンくずの設定
- 3. ビュー

# 1. gretelのインストール
gretelというgemを用いることで、リンクを設置したリストを画面に表示させるパンくずを実装することができます。

```ruby:gemfile
gem "gretel"
```

##### ターミナル
```
bundle install
```

# 2. パンくずの設定
パンくずの親子関係を設定するファイルを作成します。

##### ターミナル
```
rails g gretel:install
```

##### 例
```ruby:config/breadcrumbs.rb
crumb "現在のページ名（表示させるビューにもページ名記述）" do
  link "パンくずリストでの表示名", "アクセスしたいページのパス"
  parent :親要素のページ名（前のページ）
end
```

```ruby:config/breadcrumbs.rb
crumb :root do
  link "ホーム", root_path
end
crumb :posts do
  link "クチコミ一覧", posts_path
  parent :root
end

crumb :post_show do |post|
  link post.name, post_path(post)
  parent :posts
end

crumb :user do |user| 
  link user.nickname, user_path(user)
  parent :root
end

# 親カテゴリーのパンくず
crumb :parent_category do |category|
  category = Category.find(params[:id]).root
  link "#{category.name}", search_post_path(category)
  parent :root
end

# 子カテゴリーのパンくず
crumb :child_category do |category|
  category = Category.find(params[:id])
  # 表示しているページが子カテゴリーの一覧ページの場合
  if category.has_children?
    link "#{category.name}", search_post_path(category)
    parent :parent_category

  # 表示しているページが孫カテゴリーの一覧ページの場合
  else
    link "#{category.parent.name}", search_post_path(category.parent)
    parent :parent_category
  end
end

# 孫カテゴリーのパンくず
crumb :grandchild_category do |category|
  category = Category.find(params[:id])
  link "#{category.name}", search_post_path(category)
  parent :child_category
end

crumb :post_new do
  link "新しいクチコミ投稿", new_post_path
  parent :root
end

crumb :name_search do |search|
  if search == ""
    link "クチコミ検索結果", name_search_posts_path
  else
    link "「#{search}」のクチコミ検索結果", name_search_posts_path
  end
  parent :posts
end
```

カテゴリーのパンくずリストは、親カテゴリー > 子カテゴリー > 孫カテゴリーになるように設定しています。
子カテゴリーの処理については、孫カテゴリーのページから呼び出した場合（孫カテゴリーを選択した時）と、子カテゴリーのページから呼び出した場合（子カテゴリーを選択した時）の2つの条件で処理を変えるようにします。

# 3. ビュー
今回はパンくずを表示させたいところだけに適応したかったので、部分テンプレートを作成しました。

```ruby:app/views/shared/_breadcrumbs.html.erb
<div>
  <%= breadcrumbs separator: " &rsaquo; " %>
</div>
```

**separator: " \&rsaquo; “**はパンくずの区切りである「＞」を示します。

投稿一覧のindexファイルだけ載せておきます。

```ruby:app/views/posts/index.html.erb
~略~
<% breadcrumb :posts %>
<%= render "shared/breadcrumbs" %>
~略~
```

**breadcrumb :posts**はbreadcrumbs.rbで設定したページ名を記述しています。

# 参考リンク
https://qiita.com/Iwa_tech/items/61d1681687739faffab0
配列とif文を使って文字列をleet文字に変換

# 概要

1. 結論
1. 前提条件
1. どのようにコーディングするか
1. 開発環境

##結論
文字列とそれに対応するleet文字列をそれぞれ配列にすることで、変換プログラムを作ることができる。

##前提条件
Rubyで文字列「A、I、U、E、O」をleet文字列「4、1、(_)、3、0」に変換する。

##どのようにコーディングするか


```ruby:leet.rb
input = gets.split("")    #入力された文字列を配列化する

input.each {|s|
    string = ["A", "I", "U", "E", "O"]    #変換元の文字列を配列にする
    leet = ["4", "1", "(_)", "3", "0"]    #変換後の文字列も配列にする
    a = string.index(s)    #配列inputの値が配列stringの何番目にあるか探す
  
    if a == nil
        print s    #該当がなければそのまま出力
    else
        print leet[a]    #該当があれば配列leetの同じインデックス番号の値を出力
    end
}
```

if文やcase文のみで変換を行っていく方法もありますが、上記のやり方で行数を少なくすることができました（処理スピードはあまり変わらないようですが）。

##開発環境
Mac catalina 10.15.7
Vscode
Ruby 2.6.5
SPAの詳細ページ実装を簡単にまとめる

##概要
vue.jsでアプリを作る際、詳細画面をどのように実装するのか少しわからなったので、自分が理解した範囲でひとつの方法をまとめていきたいと思います。

今回は、vue.jsのrouterを使用します。

#####routerを定義
```vuejs:index.ts
const routes = [
  {
    path: '/',           //パスの設定
    component: Index,    //表示するコンポーネント
    name: 'index',       //ルートの名前を指定
  },
  {
    path: '/search',            
    component: Search,
    name: 'Search',
  },
  {
    path: '/:id',            
    component: Detail,
    name: 'Detail',
  },
]

```


#####検索(Search)ページ
```vuejs:Child.vue
<template>
</template>

<script lang="ts">
import {Vue} from 'vue'

class Child extend Vue {
    /** 下記の方法でパラメータとして渡されたIDを読み取ることが可能 */
    private id = this.route.params.id
    /** 詳細ページへ遷移 */
    private router(){
        this.$router.push(`/ ${this.id}`)
}  
</script>

```

↓　idは、routerのpathに指定しているものと同様にする必要がある。
```this.route.params.id
```
もしも、pathを```'/:name'```としていた場合、```this.route.params.name```になる。

他にも実装方法はあるとは思いますが、こちらの方法が簡単な方法ではないかなと思います。
どこでもスマホでプログラミング！（C言語 / Pythonにオススメ）


# いつでもどこでもプログラミングしたい
そんな時もありますよね？
今回はスマホでプログラミングができるアプリを紹介したいと思います。

## アプリの紹介（※随時更新していきます）

### ・【モバイルC】（[iOS](url) / [Android](https://play.google.com/store/apps/details?id=com.dztall.ccr.android.admob&hl=ja&gl=US)両対応）
![Screenshot_20201118-080743.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/289055/cb1ca6f7-7ff3-baeb-da45-63892c27f957.png)
※スクリーンショットはAndroidで進めていきます

<<無料版>>
[Android](https://play.google.com/store/apps/details?id=com.dztall.ccr.android.admob&hl=ja&gl=US)
[iOS](https://apps.apple.com/jp/app/%E3%83%A2%E3%83%90%E3%82%A4%E3%83%AB-c-c-c-%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%A9/id1090924591)

<<有料版>>
[Android]
(https://play.google.com/store/apps/details?id=com.dztall.ccr.android&hl=ja)
[iOS](https://apps.apple.com/jp/app/%E3%83%A2%E3%83%90%E3%82%A4%E3%83%AB-c-c-c-%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%A9/id467393915)

**※無料版は広告あり、有料版は広告なし**
![Screenshot_20201118-081013.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/289055/53bbae02-4ff0-8618-32d2-358c5d2100a5.png)
日本語がとてもチャーミングですね！


#### 対応言語(公式サイトより)
> • C
• C++ 11
• Python 3
• Javascript ( Duktape )
• Lua
• LLVM Assembly
• OpenGL ES 2 GLSL

モバイルCとはありますが、Pythonなんかも使えます！



#### 操作方法(iOS / Androidほぼ同じ)

![Screenshot_20201113-082818.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/289055/9f7999d0-5f27-5bad-d5f7-03e7df1eca2a.png)
画面上部のアイコンで各フォルダ、ファイルを作成できます。


![Screenshot_20201113-083033.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/289055/87a4dd27-dd13-2f9d-4135-f2d6eb78c2a6.png)
今回はC言語とPythonで試してみます。


![Screenshot_20201113-082748.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/289055/1118486a-cbca-8621-6d87-da36adba58a8.png)
C言語でHello world!してみます。
キーボード上部のショートカットの ▶︎ を押すと実行できます。

![Screenshot_20201113-082759.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/289055/a1d4f034-b373-027b-4287-250ca618b8e1.png)
無事出力できました！

![Screenshot_20201118-075716(1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/289055/cecc4091-d4f9-27dd-2bd3-8bb548c8c1fc.png)
今度はPythonで標準入力を試してみましょう。


![Screenshot_20201118-075741.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/289055/a0994287-e2d5-642f-0252-2a87db8acd03.png)
実行すると真っ白な画面になるので、キーボードで適当な言葉（ここではPython）と入力し、Enterを押します。


![Screenshot_20201118-075747.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/289055/b9e97817-5459-5a99-34a8-a0149838e1c9.png)
無事うまく実行できました！

## まとめ
これで電車の中でも公園でも気軽にプログラミングができちゃいますね！
ぜひ皆さんも使ってみてはいかがでしょうか（このアプリの回し者でないです笑）
R tips データの集計でよく使う関数 apply と tapply

# <font color="DarkSlateBlue">記事の目的</font>
この記事では、データの集計でよく使用する関数であるapplyとtapplyについて紹介します。
sapplyやlapplyなどもありますが、使用したことがないのでこの2つについて解説します。

# <font color="DarkSlateBlue">目次</font>

<table>
<tr><td>No.<td>目次<td>説明
<tr><td>1<td><a href="#1-使用するデータ">使用するデータ</a><td>オリジナルデータ
<tr><td>2<td><a href="#2-apply-行や列ごとに関数を適応">apply</a><td>行や列ごとに関数を適応
<tr><td>3<td><a href="#3-tapply-1次元でグループごとに関数を適応">tapply</a><td>1次元でグループごとに関数を適応
<tr><td>4<td><a href="#4-apply--tapply-多次元でグループごとに関数を適応">apply + tapply</a><td>多次元でグループごとに関数を適応
</table>

# <font color="LimeGreen">1.</font> <font color="DarkSlateBlue">使用するデータ</font>
生徒5人の数学と英語の点数を作成しました。

```R:
Math <- c(50, 30, 20, 80, 50)
English <- c(60, 70, 80, 60, 70)
Data <- data.frame(Math, English)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/775500/b9666753-cef1-745b-b0bd-5b7d49d37649.png)



# <font color="LimeGreen">2.</font> <font color="DarkSlateBlue">apply (行や列ごとに関数を適応)</font>
```R:
#行ごとの合計
A1 <- apply(Data, 1, sum)
#列ごとの平均
A2 <- apply(Data, 2, mean)
#列ごとの平均との差
A3 <- apply(Data, 2, function(x) x-mean(x))
```
|Data|A1(行ごとの合計)|A2(列ごとの平均)|A3(列ごとの平均との差)|
|---|---|---|---|
|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/775500/7fabf3fa-7864-ad94-6faa-ee1ae2decd8b.png)|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/775500/70eafb38-be56-9be7-2343-edb2aa203fb0.png)|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/775500/4ee9a5a1-5fb5-1fcb-1349-219d9fa82729.png)|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/775500/83b991ae-e298-3cfb-5771-b28cfc75c9df.png)|

# <font color="LimeGreen">3.</font> <font color="DarkSlateBlue">tapply (1次元でグループごとに関数を適応)</font>
クラスデータを与え、クラスごとに関数を適応します。

```R:
Class <- c(1,1,2,2,1)
#数学の平均点
B1 <- tapply(Data$Math, Class, mean)
#英語の平均点
B2 <- tapply(Data$English, Class, mean)
#数学の偏差平方和
B3 <- tapply(Data$Math, Class, function(x) sum((x-mean(x))^2))
```

|Data|B1(数学の平均点)|B2(英語の平均点)|B3(数学の偏差平方和)|
|---|---|---|---|
|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/775500/b6e1efc9-684e-3a04-040d-e34ff1873bdf.png)|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/775500/ae7789c0-f9cd-2560-bcab-8f32f3f86633.png)|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/775500/e89dd54c-2a7e-b2a1-f24e-a9b09dfba442.png)|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/775500/1fa39f2a-3918-6cc3-71d0-0417ae6fa4cd.png)|

# <font color="LimeGreen">4.</font> <font color="DarkSlateBlue">apply + tapply (多次元でグループごとに関数を適応)</font>
```R:
apply(Data, 2, function(x) tapply(x, Class, mean))
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/775500/bc047458-bf43-bcc7-35d1-a401d71481be.png)

◯SNS
・youtube
https://youtube.com/channel/UCFDyXEywtNhdtwqC3GAkYuA

・Twitter
https://twitter.com/Dken_ta
ssh先のUbuntuにNVIDIAドライバをインストールする方法

# はじめに
研究室のssh先のパソコンでnvidiaが使えなくなるトラブルが発生したので、備忘録代わりに書いてます。
実行するときは自己責任でお願いします。

<a id="#Chapter1"></a>
# 開発環境
実行する環境は以下の通りになります。

```:カーネル
$ uname -a
Linux s38 4.4.0-179-generic #209-Ubuntu SMP Fri Apr 24 17:48:44 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
```

```:OS
$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04.6 LTS"
```

```:GPU
$ lspci | grep -i nvidia
01:00.0 VGA compatible controller: NVIDIA Corporation GK107GL [Quadro K420] (rev a1)
01:00.1 Audio device: NVIDIA Corporation GK107 HDMI Audio Controller (rev a1)
02:00.0 VGA compatible controller: NVIDIA Corporation GP104 [GeForce GTX 1080] (rev a1)
02:00.1 Audio device: NVIDIA Corporation GP104 High Definition Audio Controller (rev a1)
03:00.0 VGA compatible controller: NVIDIA Corporation GP104 [GeForce GTX 1080] (rev a1)
03:00.1 Audio device: NVIDIA Corporation GP104 High Definition Audio Controller (rev a1)
```

# NVIDIAドライバのインストール
##手順
1.公式からドライバをダウンロード
2.ファイルをscpで送信
3.nouveauを無効化
4.インストール

##インストールの詳細
[nvidia-driverをubuntu18.04にインストールする](https://qiita.com/ohta6/items/684b9ecd4d67a52e5a7f)で公式からドライバをインストールしていたので同じ様にローカルでダウンロードしてみた。バージョンはNVIDIA-Linux-x86_64-430.09.run。

次にこのファイルをscpで研究室のパソコンに送信した。

```:local
scp ~/Downloads/NVIDIA-Linux-x86_64-430.09.run ssh先
```

次にubuntuで動いているnouveauを無効化した。なんで無効化するのかはよく分からないけど以前やった時も無効化した瞬間動いた記憶があるので無効化している。

```:ssh
$ sudo bash -c "echo blacklist nouveau > /etc/modprobe.d/blacklist-nvidia-nouveau.conf"
$ sudo bash -c "echo options nouveau modeset=0 >> /etc/modprobe.d/blacklist-nvidia-nouveau.conf"
$ sudo update-initramfs -u
$ sudo reboot
```

再起動したのを確認した後にドライバをインストールする。この際に色々聞かれるので適当に答える。
 
```:ssh
$ sudo bash NVIDIA-Linux-x86_64-430.09.run
```

`nvidia-smi`を実行して情報が色々出てくれば成功！

<a id="#reference"></a>
# 参考文献
- [nvidia-driverをubuntu18.04にインストールする](https://qiita.com/ohta6/items/684b9ecd4d67a52e5a7f)
-
Gatsby + prism.js で「言語名（language）」を右上に表示する

元記事：[genkitech.net](https://genkitech.net/gatsby-prismjs-show-language)

右上のこういうのを表示する方法です。タイトルと別で埋め込む方法が日本語で見つからなかったので貼っておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/834797/a7c72d1f-e7ef-8e29-1a7c-38b8fcf9ac08.png)

markdownはこんな感じ

```:markdown
```js:title=filename.js
じゃヴぁすくりぷと
```　

```ps
ぽうぇｒしぇる
```　
```

## やり方

左上のタイトル部分は、プラグイン「gatsby-remark-prismjs-title」で入れられるみたいですが、言語名を別で表示したい場合、以下の様に言語に対応するcssを書いてあげる必要があるようです。

```css:css

.gatsby-highlight {
  position: relative;
}

.gatsby-highlight pre[class*="language-"]::before {
  background: lightgray;
  border-radius: 0 0 0.25rem 0.25rem;
  color: black;
  font-size: 12px;
  letter-spacing: 0.025rem;
  padding: 0.1rem 0.5rem;
  position: absolute;
  right: 1rem;
  text-align: right;
  top: 0;
}

.gatsby-highlight pre[class="language-js"]::before {
  content: "JavaScript";
  background: lightgreen;
  color: black;
}
.gatsby-highlight pre[class="language-ps"]::before {
  content: "PowerShell";
}

```

最後の2つのところで言語ごとに色を変えたりしています。必要に応じて自由に追加してください。

言語名を出したいだけであれば「gatsby-remark-prismjs-title」は必要ないですが、ファイル名情報が埋め込まれているコードの言語名を表示したい場合、「gatsby-remark-prismjs-title」を入れておかないとうまく行かない様です。
C++11 thread を使うコードを pybind11 で wrap するメモ

## 背景

* C++ 側で thread 使うコード(e.g. OpenGL window を表示する)を書いていて, それを pybind11 で wrap したい.

普通にやるとクラッシュして何が原因なの? と半営業日くらい原因不明で悩んでしまいます :cry:
GIL の管理が必要です.


## 構成

以下のように, loop のある関数を C++11 thread で書いているとします
(実際は thread 化してなくても同様と思われる. また pthread など他のスレッド関数使っても同様)

```c++
void renderThread(std::atomic<bool> *quit) {

  while (...) {
    if (quit && ((*quit) == true)) {
      break;
    }

    draw();
  }
}

...

void start_opengl() {
  _quit = false;
  _th = std::thread(renderThread, &quit);
}

void end_opengl() {
  _quit = false;
  _th.join();
}

```

ここで `start_opengl()` や `end_opengl()` をそのまま pybind11 で wrap して呼び出すとクラッシュします.

GIL が原因でした.

https://github.com/pybind/pybind11/issues/1723

にあるように, 実行が長くなるコード(or thread を起動するコード)には GIL release

```
py::gil_scoped_release guard;
```

を, thread が終了する(`join()` を呼ぶところ)には GIL acquire

```
py::gil_scoped_acquire guard;
```

をはさみます. C++ コードに記入だと pybind11 ヘッダのインクルードが発生して面倒なので, pybind11 binding のところで定義するのがよいでしょう.


```c++
m.def("start_opengl", []() {
  py::gil_scoped_release guard;
  start_opengl();
});

m.def("end_opengl", []() {
  py::gil_scoped_aquire guard;
  end_opengl();
});

```

のように.

ただ, C++ からさらに python を呼んだりと複雑な場合はこれではうまくいかなそうです!

上記 github issue にあるように, pybind11 GIL aquire/release は諦め, python multiprocessing で python 世界でスレッド管理するようにするのがよさそうです.


## TODO

* Python -> C++ thread へ中断やデータを渡すうまい方法を考える
  * とりあえず中断とかは `std::atomic<bool>` でフラグでいけるが... JSON-RPC あたりで http メッセージ通信とかにしたほうがいいかも(C++ 側で JSON パースが面倒であるのと, そこまでやるなら C++ と python でプロセス切り分けたほうが良さそうであるが...)
公式Dockerとvscodeを使ったKaggleの環境構築

#記事の内容
この記事はkaggleをローカル環境で行うための環境構築についての備忘録です。
ネットではgcpの記事が多いため、とりあえずローカルで試してみたい方に向けたものになります。

#この記事が参考になる方
- kaggleをローカル環境で行いたい方
- vscodeを用いて快適な環境を作りたい方

なおこの記事ではvscodeのremote containerを利用します。
gcpで行いたい方は他の記事を参考にしてください。

なお自身の環境はUbuntuの20.4です。
他環境でうまく動作するかは保証できませんが、マウントのやり方さえ気をつければ問題なくできるはずです。
windowsの場合はwslを入れておいてください。
参考:(https://qiita.com/matarillo/items/61a9ead4bfe2868a0b86)

#手順
1. まずはvscodeをダウンロード
2. [この記事](https://vasteelab.com/2020/06/08/kaggle%E3%81%AE%E7%92%B0%E5%A2%83%E3%82%92docker%E3%81%A7%E5%86%8D%E7%8F%BE/)を参考にgit cloneし、buildします。
3. vscodeのextentionからremote containerをインストールします。
4. remote containerからopen folder in containerを選択し、Dockerを選択します。
5. kaggle.jsonを`~/.kaggle/`に置きます。
6.  .devcontainer/devcontainer.jsonのマウント先を編集します。必要であればextentionsも編集します。

これで快適な環境が出来上がります。順に解説します。

###1. まずはvscodeをダウンロード
[公式](https://code.visualstudio.com/download)から各々のOSにあったものをダウンロードしてください。

###2. [この記事](https://vasteelab.com/2020/06/08/kaggle%E3%81%AE%E7%92%B0%E5%A2%83%E3%82%92docker%E3%81%A7%E5%86%8D%E7%8F%BE/)を参考にgit cloneし、buildします。
記事の通りにbuildします。
1時間以上かかるので気長に待ってください。
gpuを使用しない場合は--gpuを変更してください。


###3. vscodeのextentionからremote containerをインストールします。
以下の画像のものをインストールしてください。
![Screenshot from 2020-11-19 15-38-05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545911/f187b922-d869-1a4b-7485-4dcbf3058bbd.png)

###4. remote containerからopen folder in containerを選択し、Dockerを選択します。
Remote Explorer(左のディスプレイのようなマーク)を選択し、CONTAINERの横にカーソルを持っていくと+マークが出ます。new containerをクリックするとopen folder in containerが選択でき、先程git cloneしたdockerフォルダーを選び、Dockerファイルを選択します。
![Screenshot from 2020-11-19 15-41-41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545911/f42deb3c-de4a-4274-5d8c-994573945ed7.png)
左下の緑色のマークを選択しても同じように開くことができます。

###5. kaggle.jsonを`~/.kaggle/`に置きます。
kaggle公式のprofileからedit profileを選択し、create New API Tokenを選択してkaggle.jsonをダウンロードします。
terminalからkaggleコマンドを使用している場合は~/.kaggleが作成されているため、cpコマンドなどを使用して~/.kaggleにkaggle.jsonを起きます。もし実行していない場合は自分でディレクトリを作っても問題ないです。

このままkaggleコマンドを打つとwarningが出ます。
kaggle.jsonの権限を変更する必要があります。
以下のコマンドを入力してください。
```chmod 600 ~/.kaggle/kaggle.json```

###6.  .devcontainer/devcontainer.jsonのマウント先を編集します。必要であればextentionsも編集します。
この時点ではdockerを動かすことはできますが、docker-python下以外のローカルディレクトリにアクセスすることができません。
docker-pythonの中を作業ディレクトリにする方はいいですが、僕はkaggle用の作業ディレクトリを用意しているため、そこにアクセスできるようにします。

.devcontainer/devcontainer.jsonに以下のコードを各々の作業ディレクトリにあった場所に変更して記述してください。

```
"mounts": [ "source=/home/artela/works/kaggle,target=/root/kaggle/,type=bind" ,
				"source=/home/artela/.kaggle/,target=/root/.kaggle/,type=bind"],
```

sourceがローカルディレクトリを指し、targetにはアクセス方法を記述します。
例えば下記のようにコマンドを叩くと`/home/artela/works/kaggle`にアクセスできます。lsの結果が空なのは環境構築をやり直す際にすべて消えてしまったためであり、なにかおいてある場合はlsで表示されるはずです。
![Screenshot from 2020-11-19 16-01-46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545911/f0e22081-1a3c-f852-f491-01b535255469.png)

おすすめはしませんが`source=/home/user/,target=/root/`を追加しておけば、すべてのディレクトリにアクセスできるようになります。

#最後に
自身ができただけであるため、動作を保証するものではありません。なにかわかりにくい点や、間違えている点などがありましたらご指摘いただけると助かります。

最後にtwitterアカウントを貼っておきます。
よければフォローお願いします。
https://twitter.com/Artela_ML
Power Automateで一定期間だけ動作するフローを作成する

##概要
Power Automateで処理をする場合、毎月xx日からxx日迄(毎日xx時からxx時迄)動作をするフローを作成したいことがあります。
フローの中でxx日なら処理をしないという分岐を書くことも出来ますが、無駄にフローを起動しないために一定期間はフローを停止するような処理を実現する方法です。

##実現方法
Power Automateのフローは画面上でオンにする/オフにする事が出来ます。
<img width="300" alt="2020-11-19_15h24_12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176502/f4bae814-138a-045d-3d05-86a12b97f656.png">

今回はこのオン(有効化)/オフ(無効化)を自動的に行うフローを書くことで実現します。
オンと言うのはフローを直ぐに起動するのではなく、オンにした以降フローのトリガー(ファイルが作成されたとかメールが来たとか)にしたがって動くと言う事です。

![2020-11-19_15h26_19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176502/c61ed9bb-951a-b075-b8f0-588146c581c2.png)

##Power Automate 管理コネクタ
ここで使われるのが"Power Automate管理コネクタです。アクションの選択画面でAutomateと検索すると2つほど似ているコネクタが見つかります。
ここで迷いました。今回使うのは右のPower Automate 管理です。(左のはPower Automate for Adminsです。紛らわしい)
<img width="300" alt="2020-11-19_15h34_27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176502/eccab9fd-9ea3-d876-0309-b33815ebcd47.png">

アクションの「フローを有効にする」「フローを無効にする」を使います。
<img width="300" alt="2020-11-19_15h42_51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176502/53052d01-ea0d-4617-06c7-85cbf495970a.png">

##実際のフロー
例として毎月20日午前9時に特定のフローをオンにするフローは以下のように書きます。
繰り返しの時間のタイムゾーンを含めた書き方が分かり難いのですが以下の記事を参考にしました。
[[PowerAutomate]スケジュール実行が指定時間通りに起動しない場合（タイムゾーンが機能しない場合）](https://qiita.com/RYO-4947123/items/da2f30617e585ab312b0)

Flowで実際に有効化(オンに)したいフローを指定します。無効化（オフ）も同様なのでフローは2つ作ることになります。(20日に有効化、月末に無効化など)

<img width="300" alt="2020-11-19_15h42_15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176502/ed6f00aa-aeae-1a1e-f5cc-d72e5ae1eab6.png">

##フローの有効化/無効化の結果を通知する
フローの有効化/無効化の書き方はここまでなのですが、実際にフローが有効化された事や有効化に失敗した事を通知したい事があります。
今回は社内の経理担当が特定のOneDriveフォルダに請求書が書き込まれた場合通知が欲しいとの要望から始まったのですがフローの有効化に失敗して、請求書の処理が行われなかったとかの問題が発生すると行けないので結果はTeamsに通知する事にしました。

成功したときと失敗したときのメッセージを変えるため条件分岐を考えたのですが簡単な方法が思いつかなかった為以下のように実現しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176502/70c8b61d-6467-240e-c9f1-bd438d20fcdf.png)

左は成功した場合、右は失敗の場合で並行分岐としてアクションを追加しています。
条件分岐なしにどのように成功、失敗を分けているかはアクションの...メニューにある実行条件の構成に秘密があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176502/b0a13b68-5b6c-5464-9b29-7b378114ec7b.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176502/d284582c-4c86-5a8c-f908-18a9696fe9ab.png)

成功の場合の左のTeams投稿は
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176502/cb58e665-f225-e126-8401-9b0b9e1de578.png)

失敗の場合は以下のように設定しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176502/9fce86dc-ae4f-0559-e35a-d759723a6f92.png)


このようにすることで簡単に有効化の状態を通知出来ました。
macOSにおけるシュナイダーマンの8つの黄金律について




macOSはシュナイダーマンの対話設計における8つの黄金律をどのように達成しているのかについてを考えてみました。

###環境
OS：macOS Catalina バージョン10.15.7

---

###(1)一貫性
・メニューバーはバージョンが変わっても表現方法については変わっていない。
・ボタンやコントロールなどの各種シンボルマークにも形やデザインは一貫性と識別性を持たせている。
・MacOSに関してはiphone、Ipad、AppleWatchのapple製品との間でデザインが統一感を表現されている。

---

###(2)	ショートカットの用意
・MacOSのショットカットはcomandキー、controlキー、optionキー、capslockキー、fnキーが中心に作成されている。
・トラックパッドでの指の本数や動かし方にもショートカットが用意されており、直感的な操作を実現している。

---
###(3)	有益なフィードバックの提供
頻繁でマイナーなアクションの場合、応答は控えめですがメジャーなアクションの場合は実質的に表現されています。
例)デスクトップでファイル操作をする場合には「ハイライト」が表現されます。

---
###(4)	対話感の実現
ソフトウェアのインストールではインストールの過程がわかるようになっている。また、開始、過程、終了の表現がはっきりしているもの特徴である。

---
###(5)	簡単なエラーの処理
そもそも、エラーができる限りエラーの起こらない設計なっている。
エラーが発生した場合にはわかりやすい適切な言葉と口調を十分に配慮されたエラ―メッセージが表示される。ただ単に処理でのエラーコードをそのまま表示はほとんどない。


---
###(6)	逆操作・取り消し処理
最初からやり直すのではなく、ひとつ前のステップに戻れる操作をショートカットにより実現している。Comand + z で一つ前の操作を取り消したり、またその逆のcomand + Shift + zで取り消した操作を取り消すことができる。これにより、ユーザーの失敗することに対する不安を低減している。


---
###(7)	制御権の提供
・ユーザーがプログラムを開始するか続行するか終了するかを選択できるようになっている。
・アクティビティモニタでは、CPUやアプリ使用時間、プロセス、ネットワークの使用状況を可視化している。

---
###(8)	短期記憶の負担の減少
アプリ一覧画面やメニューバーは必要な時以外は表示されず、
仮想デスクトップという複数の操作スペースを用意する機能があり、
表示を単純に保つことができる。

---

参考文献
Shneiderman's "Eight Golden Rules of Interface Design" :
http://faculty.washington.edu/jtenenbg/courses/360/f04/sessions/schneidermanGoldenRules.html
Vuexのstateをお手軽に扱えるようにするTips

個人開発中に、Vuexのstateをお手軽に扱えるようにできたので参考までに共有します。
この方法を使うと、computedにいちいちgetterとsetterを記述しなくても、
`this.xxx`でstateへアクセスして、値を代入できるようになります！

### 1. mutationsにsetState関数を作る。
setState関数 … 任意のstateに任意の値をセットする処理。

```javascript:store.js

export default new Vuex.Store({
  state: {
    xxx: null, // 例として「xxx」という名のstateを定義します。
  },
  mutations: {
    setState(state,nameValue){
      const stateName = nameValue[0];
      const stateValue = nameValue[1];
      state[stateName] = stateValue;
    }
  }
})
```

### 2. getとsetをreturnしてくれるstate関数を作る。

```javascript:state.js

export const state = (stateName)=>({ // 注: アロー関数じゃないと正しく動きません。
  get(){
    return this.$store.state[stateName]
  },
  set(stateValue){
    this.$store.commit( 'setState', [ stateName, stateValue ] )
  }
})
```

### 3. computedにstate関数をセットする。
（正確には、state関数の返り値をセットする。）

```javascript:component.vue

import {state} from 'state.js';
export default {
  computed: {
    xxx: state('xxx'),
  }
}
```

### 4. this.xxxでstateにアクセスできる。

```javascript:component.vue

export default {
  computed: /*略*/,
  methods: {
    stateTest(){
      const getTest = this.xxx; // → this.$store.state.xxx の値が取得できる。
      this.xxx = 'setTest'; // → this.$store.commit( 'setState', [ 'xxx', 'setTest' ] ); が実行される。
    }
  }
}
```

### 補足. mapState関数もつくる。
Vuex公式のmapState関数のように、
配列やオブジェクトで一括定義したいと思うなら、mapState関数もつくります。

```javascript:state.js

export const mapState = (stateNameList)=>{ // 注: アロー関数じゃないと正しく動きません。
  const argumentIsArray = Object.prototype.toString.call(stateNameList) === '[object Array]';
  const mapState = {};
  for(let i in stateNameList){
    const computedStateName = argumentIsArray ? stateNameList[i]: i;
    const storeStateName = stateNameList[i];
    mapState[computedStateName] = {
      get(){return this.$store.state[storeStateName]},
      set(v){this.$store.commit('setState',{[storeStateName]:v})}
    };
  }
  return mapState;
}
```
Docker で Rails プロジェクトを作成

# 5系

コマンド一発。

```sh
docker run --rm -it --workdir /app/ --volume $PWD:/app/ ruby:2.6.3 bash -c "gem install rails -v 5.2.4 && rails new sample_project"
```
# 6系

6系から webpack に依存するので node, yarn を含んだイメージを自分で作る必要があります。

### Dockerfile

ruby の image に node, yarn を突っ込みます。

```dockerfile:Dockerfile
FROM ruby:2.7

RUN mkdir /app
WORKDIR /app

RUN curl https://deb.nodesource.com/setup_12.x | bash
RUN curl https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -
RUN echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list

RUN apt-get update -qq && \
    apt-get install -y nodejs yarn

RUN gem install rails -v 6.0.3
```

docker build, run を実行してプロジェクトを作成します。

```bash
docker build -t rails-gen . && \
    docker run --rm -it --volume $PWD:/app/ rails-gen:latest \
    bash -c "rails new sample"
```

以上です。
ZBrush　マウスホイールでズームイン・ズームアウトするには

#ZBrush　マウスホイールでズームイン・ズームアウトするには

##ズームインの登録
メニューバーのDocument→Inというボタンの上でctrl+alt+クリック、その後実際にマウスホイールで手前方向にホイール(mouse wheel down)すると、mouse wheel downの操作がズームインのホットキーとして登録される。

##ズームアウトの登録
メニューバーのDocument→Inというボタンの上でctrl+alt+クリック、その後実際にマウスホイールで奥方向にホイール(mouse wheel up)すると、mouse wheel upの操作がズームインのホットキーとして登録される。

以上です。

操作方法がMayaなどのDCCツールと結構異なるのでズームイン・ズームアウトだけでも同じにしたく、調べました。
もっと簡単にプリファレンスなどから変更できたりするのでしょうか？どなたかご存じでしたら何卒！

参考：https://www.youtube.com/watch?v=lBnpqnfG9n0&feature=emb_title&ab_channel=PixologicZBrush
【HTML】OGPってなに？～実装方法までかんたんに説明

Webページの概要を、SNS上で効果的に表示するためのHTML要素"OGP"について
OGPってなに？から実装方法まで簡単に説明

# OGPってなに？
「Open Graph Protocol」のこと
WebページがFacebookやTwitter、InstagramなどのSNSでシェアされた時に表示される
サイト名や画像、記事タイトル、説明文などを指定し、表示させるHTML要素

OGPを設定しないと、画像やタイトルなどが表示されなかったり、意図しない画像・タイトルが表示されてしまう

ページの概要を正しく伝え、ユーザーの興味を引くためにとても重要な要素です

# 実装方法（Facebook）
headタグ内に設置します

```html
<head prefix="og: http://ogp.me/ns# fb: http://ogp.me/ns/fb# {{prefix属性}}: http://ogp.me/ns/{{prefix属性}}#">
<title>ページタイトル</title>
<meta property="og:title" content="{{タイトル}}" />
<meta property="og:type" content="{{種類}}" />
<meta property="og:url" content="{{URL}}" />
<meta property="og:image" content="{{サムネイル画像のURL}}" />
```

### head prefix～
OGPの宣言タグ
prefix属性にはトップページは「website」、その他のページには「article」を指定

### og:title
ページ単体のタイトルを20文字ほどで指定

### og:type
OGPを設定するWebページの種類を指定
website／blog／video／articleなどが指定できます。

### og:url
OGPを設定するWebページのURLです。相対パスではなく絶対パスを指定

### og:image
サムネイル画像を指定します。URLと同様、絶対パスで指定
Facebookでは縦630px×横1200px以上（1：1.91）推奨

# その他
音楽、動画ファイルなど各種設定することができます
facebook/twitter/LINE/Instagram/YouTube など多くのSNSで適用可能

##### 正しく概要を伝え、多くのユーザの関心を惹くためにWebページには必ずOGPを設定しましょう
【GitHub】upstream masterを自分のブランチに取り込む方法

#●＜GitHub　upstream masterを取り込む方法＞
http://kik.xii.jp/archives/179
remote:upstream
remote: master、origin
local: master、origin

①upstreamのmaster → localのmaster
②localのmaster → remoteのoriginにpush
③remoteのmaster → localのブランチ

```
git checkout master
git pull upstream master ①
git push origin master ②
git checkout ブランチ名
git pull origin master ③
```
【GCP】Googleアナリティクス360で、他ドメインのPJのBQをリンクできるか試した

Googleアナリティクス360はまったく触ったことないんですが、
BQと連携できるかを確認したいと思い、初めて使いました。
放送業界、web関連のアプリを使っている会社はよく使ってるのかんと思いました。

オススメの解説サイトは以下。
https://moltsinc.co.jp/access-analysis/6311

ここからログイン
https://marketingplatform.google.com/intl/ja/about/analytics-360/

で、利用開始して、いろいろいじってみると
「BigQuery へのリンクを作成する」という項目がある。

ここをどう使うのかとか、よくわかりませんが、
ここに他ドメインのPJが表示されるようになれば、
基本的には連携を図れるのではないかと思い、
できるか試してみた。

会社情報もあるんですが、自分が見返したときにわかりやすくするため、ドメイン部分少し記載。
以下の流れで作業しました。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

・***.coドメインでGoogleアナリティクス360のアカウント作成
・****.comドメインでtestPJ作り、そこのオーナーとして***.coドメインをIAMに登録
※そもそも必要なのは、以下の権限らしい。オーナーをとってチェック付けるとエラーが出る。
serviceusage.services.enable
resourcemanager.projects.setIamPolicy
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

「BigQuery へのリンクを作成する」にオーナーにしたPJが表示されました！
試しに、リンク作成までやったら、作成できた。

詳細はわかりませんが、連携はできそう。
あとは、仕様に変更とかなければいけるでしょう。
CollectionGroupのFirebaseError: Missing or insufficient permissionsで躓いたときの対処法

FirebaseのFirestoreのCollectionGroupは`stores/{storeId}/items/{itemId}`のように`StoreCollection`を跨いだ`ItemCollection`を一括で指定できる便利な機能です。

ただ、今回、セキュリティルールを設定している際に下記エラーに直面し、少し詰まったので対処方をまとめます。

```
FirebaseError: Missing or insufficient permissions
```

このエラーはセキュリティールールが`false`を返しているときに吐かれるもので、もともと設定していた下記のセキュリティルールに問題があったことになります。

```firestore.rules
rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if false;
    }

    match /stores/{storeId}/items/{itemId} {
      // Itemのオーナーのみがを読み込みを可能
      allow read: if resource.data.ownerId == request.auth.uid;
    }
  }
}
```

どうやらSubCollectionのフルパスではCollectionGroupで読み取る際のセキュリティルールとして引っかからないようです。そこで、下記のように対処しました。

```firestore.rules
rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if false;
    }

    match /{path=**}/items/{itemId} {
      allow read: if resource.data.ownerId == request.auth.uid;
    }
  }
}
```

CollectionGroupは使用上、ルートに別の`ItemsCollection`があればそれもグループとして扱うため、上記のように`ItemsCollection`までのパスを再帰的に書いてあげる必要があるようです。


## 参考
- https://stackoverflow.com/questions/56313459/collection-group-permissions-for-firestore
position:stickyを使うときに気を付けること

１．top:0を忘れがち

```a.css
position: -webkit-sticky;
position: sticky;
top: 0;
```
２．background-colorを指定しないことでcontentが上を通っているように見えるので
background-colorを指定することを忘れない。

```a.css
background-color: red
```

3. たまにそれでもstickeyの上を通る時があるのでそういう時はz-index

```a.css
z-index: 99
```
hibernate-core SQLインジェクション対策によるアップデート JVN90729322

Hibernate ORM における SQL インジェクションの脆弱性
https://jvn.jp/jp/JVN90729322/  

spring-boot-starter-data-jpaを利用している場合、hibernateに依存している

### hibernateの5.4.17～5.4.24までのアップデート内容
https://hibernate.atlassian.net/browse/HHH-14316?jql=project%20%3D%20HHH%20AND%20fixVersion%20in%20(5.4.18%2C%205.4.19%2C%205.4.2%2C%205.4.20%2C%205.4.21%2C%205.4.22%2C%205.4.23%2C%205.4.24)%20ORDER%20BY%20updated

hibernate単体アップデートするにはbuild.gradleに下記記載

````
implementation 'org.hibernate:hibernate-core:5.4.24.Final'
````
【Visual Studio Code】コーディングに全集中できるショートカットキー

#VScodeショートカットキー紹介

VScodeでコーディングに全集中できるショートカットキーを紹介します！！




#Zenモード

`command + K` を押して、間を開けてから`Z`を押すとコードの画面のみにできます！

通常の画面に戻すときも上記と同じです。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">💥VScodeショートカットキー紹介<br><br>✨Zenモード<br><br>コーディングに全集中したい時は、<br><br>『cmd + K』 を押してから 、間を空けて、『Z』を押すとコードの画面のみで作業できます😌戻す時も同じです。<br><br>参考：<a href="https://t.co/hvd5jWFQsJ">https://t.co/hvd5jWFQsJ</a><a href="https://twitter.com/hashtag/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E5%88%9D%E5%BF%83%E8%80%85?src=hash&amp;ref_src=twsrc%5Etfw">#プログラミング初心者</a> <a href="https://t.co/9ZAF68n3Qg">pic.twitter.com/9ZAF68n3Qg</a></p>&mdash; ミキ🐹@プログラミング (@mikiprogram) <a href="https://twitter.com/mikiprogram/status/1329030589001854978?ref_src=twsrc%5Etfw">November 18, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


#参考
* [ムーザルチャンネル：VSCode 便利テクニックの紹介 作業効率100倍?を目指す](https://youtu.be/z8ppylVwjHE)
＃3 【python3】様々な演算子

#はじめに
この記事はプログラミングを勉強し始めて２ヶ月ほどの駆け出しエンジニアがアウトプット目的に書いている記事です。
ruby、jsをかじったのちトレンドであるpythonに興味を持ったので学習を始めました。
今回は様々な演算子についての記事を書いていこうと思います。
拙い記事になりますが、気になる点があればご指摘いただけるとありがたいです！
なお本記事は、macOSにpython3およびanacondaの導入をしていることが前提となっております。

#1 数値演算子
代表的な演算子です。

|演算子|例|説明|
|:---|:---|:--|
|\+|a + b|足し算|
|-|a - b|引き算|
|*|a * b|掛け算|
|/|a / b|割り算|
|//|a // b|割り算（小数点以下切り捨て）|
|%|a % b|割り算（aをbで割った際の余り）|
|**|a ** b|累乗|

#2 文字列演算子
文字列の演算子は以下のようなものがあります。

|演算子|例|説明|
|:---|:---|:--|
|\+|"a" + "b"|文字列"ab"になる|
|*|"ab" * c|文字列"ab"をc回繰り返す|

#3 比較演算子
代表的な比較演算子です。

|演算子|例|説明|
|:---|:---|:--|
|==|a == b|aとbが等しいときtrue|
|!=|a != b|aとbが異なるときtrue|
|>|a > b|aがbより大きいときtrue|
|>=|a >= b|aがb以上のときtrue|
|<|a < b|aがbより小さいときtrue|
|<=|a <= b|aがb以下のときtrue|

#4 論理演算子
論理演算子は以下のようなものがあります。

|演算子|例|説明|
|:---|:---|:--|
|and|a and b|aかつbのときtrue|
|or|a or b|aまたはbのときtrue|
|not|not a|aがtrueならばfalse|

#5 複合代入演算子
代表的な複合代入演算子です。

|演算子|例|説明|
|:---|:---|:--|
|\+=|a += b|a = a + b|
|-=|a -= b|a = a - b|
|*=|a *= b|a = a*b|
|/=|a /= b|a = a / b|
|//=|a //= b|a = a / b|
|%=|a %= b|a = a % b|
|**=|a **= b|a = a ** b|

#おわりに
今回の記事はこれで終了です。
これらの演算子は以前学習していたrubyと変わらないので、簡単に理解することができました。
これらの演算子はおそらく開発では必須の知識だと思うので、完璧に理解しておきたいものです。

前の記事→https://qiita.com/shin12032123/items/543a25bd5777d6e18128
次の記事→https://qiita.com/shin12032123/items/a8cc0d7612259683562e
Gatsby + TyporaでMarkdownファイルを保存する時にエラー落ちするのを防ぐ

元記事：[genkitech.net](https://genkitech.net/gatsby-typora-develop-break-ignore)

## 現象

gatsby develop でホットリロード動作中に、TyporaでMarkdownファイルを編集して保存すると、以下の様なエラーが出て落ちる場合がありました。

```powershell
info added file at C:\Users\〇〇〇\.~index.md
Failed to validate error Error [ValidationError]: "errno" is not allowed. "syscall" is not allowed. "path" is not allowed
```

## 原因と解決

ぱっと見原因はTyporaが「.~」を頭に付けた変なファイルを生成している事のようなので、以下の様に「gatsby-source-filesystem」の「ignore」オプションを設定してあげることで落ちなくなりました。

```javascript{3}:gatsby-config.js
    {
      resolve: `gatsby-source-filesystem`,
      options: {
        path: `${__dirname}/src/contents`,
        name: `contents`,
        ignore: [`**/\.*`],
      },
    },
```

以上。
Error: Entrypoint isn't within the current project

Android Studioにて下記のメッセージが出ます。

「Error: Entrypoint isn't within the current project」

解決方法：
Android Studioのメニューバーにて
File-> Project Structure -> Modules
プロジェクトのルートフォルダを追加して、
then it will detect its a flutter app and then build and work
AddEventListenerでイベントをキャンセルする機能を実装したい

## やりたいこと
ページの入力フォームから情報を入力して送信する際、入力によってはアラートを出して情報を送信させないようにする機能を`AddEventListener`を使って実装したい。
今回は下記のような入力フォームがあって、2つのセレクトボックスからそれぞれ入力する情報を選択する。
![Screenshot from 2020-11-19 12-54-58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636023/9250cd3c-db8e-939f-80a9-c6c8edac7eec.png)
もし各セレクトボックスから同じ選択肢を選んで「合体」ボタン（submitボタン）を押した場合、
![Screenshot from 2020-11-19 12-56-20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636023/d350a94e-794f-1401-07f6-64fa83633d24.png)
アラートが出て入力情報が送信されるのを防ぎたい。（違う入力であれば出さない）
![Screenshot from 2020-11-19 13-01-16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636023/7c9fb031-71e8-f465-254a-51a2c31f0dc5.png)

## 実装
formのidは`select_form`、各セレクトボックスのidはそれぞれ`first_persona`、`second_persona`となっている。
`addEventListener`で送信ボタンが押された時に入力情報を判定する関数が動作するようにしている。

```html
<script>
  function checkPersonaId(event){
    const first_persona_id = document.getElementById('first_persona').value;
    const second_persona_id = document.getElementById('second_persona').value;
    if(first_persona_id == second_persona_id){
      alert('同じペルソナは選べません');
      event.stopPropagation();
      event.preventDefault();
    }
  }
  const form = document.getElementById('select_form');
  form.addEventListener('submit', checkPersonaId);
</script>
```
ポイントはifブロック内の`stopPropagation()`と`preventDefault()`。`AddEventListener`でイベントをキャンセルしたいときには、これら2つのメソッドをどちらも記述する必要がある。

## return falseではイベントをキャンセルできない
イベントハンドラの`onSubmit`や、jQueryでは`return false`でイベントのキャンセルができるが、`AddEventListener`を使っている場合には`return false`と記述してもイベントのキャンセルができない。

## stopPropagationとpreventDefaultは何をしているのか
`stopPropagation`は親要素へのイベント伝搬をキャンセルし、`preventDefault`はその要素のイベント自体をキャンセルしている。
要素のイベントをキャンセルすれば良いと思って`preventDefault`だけ記述すると、イベント伝搬だけが行われて意図しない挙動となるので注意。
jQueryでの`return false`はこのあたりのキャンセルをきちんと行ってくれるらしい。

- 参考
  - https://linkers.hatenablog.com/entry/2019/10/25/154301
  - http://igrc.hatenablog.com/entry/2018/07/27/145655
#2 【python3】区切りとコメントアウト

#はじめに
この記事はプログラミングを勉強し始めて２ヶ月ほどの駆け出しエンジニアがアウトプット目的に書いている記事です。
ruby、jsをかじったのちトレンドであるpythonに興味を持ったので学習を始めました。
今回の記事では区切りとコメントアウトについて書いていこうと思います。
短い記事になるりますが、気になる点があればご指摘いただけるとありがたいです！
なお本記事は、macOSにpython3およびanacondaの導入をしていることが前提となっております。

#1 ステートメント（命令文）の区切り
プログラムコードも、日本語の句点「。」や英語のピリオド「.」のようにごとに区切りが必要になっていきます。
日本語や英語の場合、文に区切りを入れない場合も一応読むことは可能ですが、プログラムコードの場合、正しく区切りを入れなければエラーが起こってしまいます。

**正しく区切らなかった場合のエラー**

```python:test.py
hige = 1 * 5 hoge = 2 * 2 print(hige) print(hoge)
```
↑をターミナルで実行

```
$ python test.py
  File "test.py", line 1
    hige = 1 * 5 hoge = 2 * 2 print(hige) print(hoge)
                 ^
SyntaxError: invalid syntax

```
SyntaxError: invalid syntaxは日本語で構文エラーと言う意味です。
このエラーは簡単に解決することができます。
大きく分けて2つの方法があるので紹介していきます。

**①；で区切る方法**
一つ目はセミコロンで区切る方法です。
実際にやってみます。

```python:test.py
hige = 1 * 5 ; hoge = 2 * 2 ; print(hige) ; print(hoge)
```
↑をターミナルで実行

```
$ python test.py
5
4
```
このようにステートメント間を;で区切ることでエラーを解決することができました。

**②改行で区切る方法**
二つ目は改行で区切る方法です。
こちらも実際にやってみます。

```python:test.py
hige = 1 * 5
hoge = 2 * 2 
print(hige)
print(hoge)
```
↑をターミナルで実行

```
$ python test.py
5
4
```
こちらもエラーを起こすことなく実行できました。
じゃあ、どっちで区切ればいいの？と思う方もいると思いますが、個人で開発を行う場合は完全に好みで決めていいと思います。所属する会社やチームによってルールが決まっている場合はそれに従うことになると思います。

#2 コメントアウト
コメントアウト機能はコードに注釈を入れる際や動作チェックの際に必須ですので、是非とも覚えておきたいところです。今回は二つ紹介します。

**①#を使う方法**
文の先頭に#をつけることでコメントアウトが可能になります。
実際にコードに注釈を入れてみましょう。

```python:test.py
hige = 1 * 5 #これはhigeに1*5を代入しています

print(hige)
```
コードに注釈を入れることができました。#の後の文はコードの実行に影響を及ぼすことはありません。

**②"を使う方法**
"３つで文を囲むことでまとめてコメントアウトすることができます。

```python:test.py
hige = 1 * 5 
"""
↑はhigeに1*5を代入しています。
ダブルクォーテーション内はコードの実行に影響を及ぼしません。
複数行に渡ってコメントアウトしたい場合に便利です。
"""
print(hige)
```

#終わりに
今回の記事は以上で終了です。
区切りやコメントアウトをうまく利用して、読みやすいコードをかけるよう心がけていきたいです！
次の記事→https://qiita.com/shin12032123/items/89ecbff9257833eceff3