OmniAICreator/Qiita-1.07M huggingface dataset:
【メモ】Twitter 2020年7月

my first Qiita!
事件概要のメモ
#Twitterのアカウント乗っ取り事件（Twitter社)
01 Twitter: [An update on our security incident](https://blog.twitter.com/en_us/topics/company/2020/an-update-on-our-security-incident.html)
02 [Official Tweet] (https://twitter.com/TwitterSupport/status/1283518038445223936)

> We are aware of a security incident impacting accounts on Twitter. We are investigating and taking steps to fix it. We will update everyone shortly.
  
# 関連記事
11  日本経済新聞： [ツイッター、言論基盤に傷 著名人アカウント乗っ取り　米大統領選前に不正な侵入許す](
https://www.nikkei.com/article/DGKKZO61615850W0A710C2EA1000/?fbclid=IwAR1t7gVNbp4SqWtxMYRNm8YmWhJtlaRq0H3xb3xTK4DO9rwdctzOBPbLh5o "日経")
12 ITmedia： [AppleやマスクCEOなど多数のセレブTwitterアカウントが乗っ取られ、暗号通貨詐欺に悪用される](https://www.itmedia.co.jp/news/articles/2007/16/news054.html)
13 ITmedia： [Twitterの大規模乗っ取り、犯人は21歳のSIMスワッパーか──Krebs on Security報道](https://www.itmedia.co.jp/news/articles/2007/18/news023.html)
14 ITmedia：[Twitter大規模乗っ取り、ターゲットは130人、偽ツイートは45人、「Twitterデータ」をダウンロードされたのは8人──公式発表](https://www.itmedia.co.jp/news/articles/2007/18/news039.html) 
15 engadget: [ハッカーがアップル・ゲイツ・マスク・バイデンらのTwitterアカウントを一斉乗っ取り。仮想通貨詐欺を投稿](https://japanese.engadget.com/btc-scammer-220222774.html)
16 the Verge:  [Twitter’s massive attack: What we know after Apple, Biden, Obama, Musk, and others tweeted a bitcoin scam](https://www.theverge.com/2020/7/15/21326200/elon-musk-bill-gates-twitter-hack-bitcoin-scam-compromised)

# 攻撃を受けたアカウント
(#15) engadgetで、スクリーンショットが掲載されている
(#11) 日経新聞では一覧が掲載されている
出典：日経新聞
![日経新聞](https://article-image-ix.nikkei.com/https%3A%2F%2Fimgix-proxy.n8s.jp%2FDSKKZO6159165016072020EA1000-PN1-3.jpg?auto=format%2Ccompress&ch=Width%2CDPR&fit=max&ixlib=java-1.2.0&s=ae260444467fc66c776ee91e4a479e2f)



#事件の概要
Twitter社がBlogで公開している内容の要約
Twitter(#01): [An update on our security incident](https://blog.twitter.com/en_us/topics/company/2020/an-update-on-our-security-incident.html)


## 攻撃の概要
* 太平洋時間7月17日8時35分現在の状況
* ソーシャルエンジニアリングを使って、Twitter社の従業員を標的にした
* 取得した従業員の認証情報（二要素認証を含む）を悪用して内部システムにアクセス
* 130のアカウントに社内サポート専用のツールでアクセス内
* 内45アカウントに対し、パスワードをリセットし、パスワードを変更しTweetを投稿
* 内8アカウントから"Your Twitter Data"ツールを使ってアカウント情報をダウンロード（該当ユーザーには直接連絡、いずれも検証済みアカウントではなかった）

## Twitters社の対応
* 7/15水曜に攻撃を認識
* 内部システムのアクセスを無効化
* アカウントに関する機能制限を実施（パスワード変更の停止など）
* 攻撃者のアカウントへの対応
* 直近でパスワードが変更されたアカウントを確認の上ロック
* 7/15 水曜深夜に多くのアカウントでツイート機能を復活
* 7/16早朝にはほとんどのアカウントを復活

## 攻撃者がアクセスしたもの
攻撃を受けた130のアカウントについて
* パスワードは見れていない
* メールアドレスや電話番号などの個人情報を閲覧できた
* 攻撃者がパスワードの変更を行った45アカウントでは、すべての情報が閲覧できた

# 関連情報
(#16)The VERGE (この記事が詳しい）

* 米国東部時間の午後4時過ぎから始まり、2時間以上続いていました
* Twitterは、1時間以上の沈黙の後に状況を認め、5:45PM（東部標準時）にサポートアカウントに「Twitter上のアカウントに影響を与えるセキュリティインシデントが発生したことを認識しています。
* Twitterは午後7時18分（米国東部時間）にツイートの制限に関する姿勢を更新し、「我々はこの件を調査している間、ツイートの制限、パスワードのリセット、その他いくつかのアカウント機能の制限を継続しています。
* 4時17分のテスラCEOのイーロン・マスクのTwitterアカウントが、ビットコイン詐欺の投稿がはじまり。（5時56分までハッカーの統制下）
* イーロン・マスクは、ビットコイン詐欺のターゲットとなっている。

# SIM Swap
(#13)ITmediaでSIM Swapが取り上げられている。
Twitter従業員の二要素認証を破ったことに関連したものと考えられる。
（個々のユーザーの2FAを破るのは、なかなか大変なので）
【JQuery】$関数の重複


[参考](http://semooh.jp/jquery/api/core/jQuery.noConflict/_/)

scriptタグとcssタグのsrcの参考先が、静的コードと動的コードが混在しまくって、
いわゆるスパゲッティコード化して「$関数が未定義（undefined）」が発生した状態に行った対処法。
おそらく、Jquery.jsの定義が数か所あった為に発生したと思われる。

本来であれば根本から修正すべきだが、
工数が膨大に膨れ上がりそうだったのと、リスクが大きそうだったので、以下の苦肉の策。

「jQuery.noConflict();」を定義して、「(function($) {」～「})(jQuery);」で囲う。
これで最初に読み込みされた「Jquery.js」が採用される模様。

    jQuery.noConflict(); 
    (function($) {
        //ボタン押下イベント
        $('#btnExec').click(function(){
            window.hrer = '../menu.html':
        });
    })(jQuery);

今後は、これを使用せずに済ませたい。
データサイエンス100本ノックをDockerなしSQLなしで動かす（Python, R）


## はじめに

先月データサイエンス100本ノック（構造化データ加工編）が出てデータ分析の教材がまた一つ充実したという感じがありますが、この問題集はDockerなどのツールにある程度慣れていないと取り組めない設計になっているようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229718/bbb02205-2efb-a638-619a-61d7be8c2bf6.png)

出典：https://github.com/The-Japan-DataScientist-Society/100knocks-preprocess/blob/master/docker/doc/100knocks_guide.pdf

確かにDockerはデータ分析分野でも重要な技術になってきているので、エンジニアでなくても覚える価値は十分ありますし、SQLなどDBまわりの知識ももちろん大事です。ただ、PythonやRを使った分析をちょっと試してみたいだけ、という場合にはDockerやSQLにも同時に取り組もうとすると負荷が重すぎるかもしれません。

この記事では、「ひとまず手元でCSVのデータハンドリングができればOK」くらいのスタンスの方向けに、DockerもDBもSQLも使わずに100本ノックを解くための環境の整え方についてまとめてみます。

## 前提

- pipやAnacondaで入れたJupyterLabが使える

    JupyterLabはJupyter Notebookなどで代用できますが、ここではJupyterLabをおすすめします。

## 方法

1. [GitHubリポジトリ](https://github.com/The-Japan-DataScientist-Society/100knocks-preprocess)からzipファイルをダウンロード・解凍（またはgit clone） 

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229718/98425767-0548-1c9f-7f63-bc4cc6c7b4cf.png)

1. JupyterLabで、解凍されたフォルダ内をdocker > workと進み、preprocess_knock_Python.ipynbまたはpreprocess_knock_R.ipynbを開く

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229718/6cb7d2f1-a912-071d-8882-132ede3e4aff.png)

1. 最初のセルのコードを以下のように書き換えて実行

```py:Pythonの場合
import pandas as pd

df_customer = pd.read_csv('data/customer.csv')
df_category = pd.read_csv('data/category.csv')
df_product = pd.read_csv('data/product.csv')
df_receipt = pd.read_csv('data/receipt.csv')
df_store = pd.read_csv('data/store.csv')
df_geocode = pd.read_csv('data/geocode.csv')
```

```r:Rの場合（追加でRの環境整備が必要）
df_customer <- read.csv("data/customer.csv")
df_category <- read.csv("data/category.csv")
df_product <- read.csv("data/product.csv")
df_receipt <- read.csv("data/receipt.csv")
df_store <- read.csv("data/store.csv")
df_geocode <- read.csv("data/geocode.csv")
```

以上で、100本ノックを解き始めることができます。

## おわりに

Dockerは重要な技術ですが、学ぶためにそれなりに時間がかかるほかPC上で動かすにもある程度のメモリ等が必要になります。データサイエンス100本ノックのケースでは、DockerがDBとどう関わるのか知る必要も出てきます。

そのあたりで挫折しそうな方の参考になれば、と思っての投稿でした。

## 補足

JupyterLabではなくColabを使う方法もあるようです。

[データサイエンス100本ノックをColaboratoryでやりたい - Qiita](https://qiita.com/HiroyukiTachikawa/items/53d4cf8bf033734f316c)
「flutter build ios --release」時のエラーの対処法【Flutter】

はじめまして、ますみです！

[![自己紹介.png](https://www.umi-mori.jp/wp-content/uploads/2023/02/introduction_banner_2-2048x533.png)](https://bit.ly/banner_intro_masumi_creator_qiita)


# バグ内容
`flutter build ios --release`とすると、以下のようなエラーが出ることがあります。

```dart:error.txt
Xcode's output:
↳
    note: Using new build system
    note: Planning build
    note: Constructing build description
    error: This request is forbidden for security reasons: You currently don't have access to this membership resource. To resolve this issue, agree to the latest Program License Agreement in your
    developer account. (in target 'Runner' from project 'Runner')
    error: No profiles for 'com.umi-mori.sample' were found: Xcode couldn't find any iOS App Development provisioning profiles matching 'com.umi-mori.sample'. (in
    target 'Runner' from project 'Runner')

Encountered error while building for device.
```

# 対処法
以下のようなAppleのDeveloperのページに行くと、`ライセンスに関する同意が求められる`と思います。
その内容に同意をしてから、再びビルドすると、成功します。

<img width="1200" alt="スクリーンショット 2020-07-23 9.34.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240280/9f7e260a-8610-d488-bef5-419518320663.png">

# 最後に
最後まで読んでくださり、ありがとうございました！
いかがだったでしょうか？

この記事を通して、少しでもあなたの学びに役立てば幸いです！

:::note info
【仕事の相談はこちら】
お仕事の相談のある方は、下記のフォームよりお気軽にご相談ください。

[問い合わせフォームはこちら](https://forms.gle/G5g1SJ7BBZw7oXYA7)

もしもメールでの問い合わせの方がよろしければ、下記のメールアドレスへご連絡ください。

info*galirage.com（*を@に変えてご送付ください）

🎁 「生成AI活用の無料相談券」もしくは「生成AIの社内ガイドライン（無料PDF）」を『公式LINE』で配布中 🎁
『生成AIを業務に活用したいけど、どうしたらいいかわからない』といった声を多くいただきます。

Galirageでは公式LINEにて、チャットやオンライン会議で「完全個別の生成AI活用無料相談会」を実施しております！
（期間限定で実施しているため、ご興味ある方はお早めに以下のLINE公式アカウントをご登録ください^^）
https://lin.ee/rvz6lMN

※ 予告なく、キャンペーンを終了する可能性がございますが、ご了承ください。

【業務内容】
具体的には、以下のお仕事を中心に受け付けております！（[詳しくはこちら](https://galirage.notion.site/Galirage-AI-c2f3945fafb0433d8d2fd03e56927fd8)）
1. 受託開発（例：生成AIを使った社内システムの開発）
2. コンサルティング（例：技術戦略のアドバイス）
3. 講演（例：社内研修、イベント登壇）

※ 特に「生成AIを使ったシステム開発のご依頼」が多く、ご好評いただいております。

【これまでの相談事例】
以下のようなご相談が多くあります。

🔑 機密情報を漏洩させないための、生成AIのシステム構築をお願いしたい。
🤖 自社データを用いたFAQチャットボットの作り方を知りたい。
💡 ChatGPTを、自分たちの事業にどのように活かせるか、アドバイスやアイデアが欲しい。
:::
# おまけ
エンジニアの仲間（データサイエンティストも含む）を増やしたいため、公式LINEを始めました🎉

「**一緒に仕事をしてくれる方**」「**友だちとして仲良くしてくれる方**」は、友だち追加をしていただけますと嬉しいです！（仲良くなった人たちを集めて、「ボードゲーム会」や「ハッカソン」や「もくもく会」もやりたいなと考えています😆）

とはいえ、みなさんにもメリットがないと申し訳ないので、特典を用意しました！

友だち追加後に、アンケートに回答してくれた方へ「**エンジニア図鑑（職種20選）**」のPDFをお送りします◎

https://lin.ee/hFUN4TL

[![](https://www.umi-mori.jp/wp-content/uploads/2023/10/line_banner_v2.png)](https://lin.ee/hFUN4TL)
WordPressのテーマエディタでハマった話

#経緯

WordPressでテーマエディタを使ってるとこんなエラーが出る事があると思う。
<img width="304" alt="ng.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563735/28bf948b-9a08-854b-97e6-c42570410489.png">
>「致命的なエラーをチェックするためにサイトと通信できないため、PHP の変更は取り消されました。SFTP を使うなど、他の手段で PHP ファイルの変更をアップロードする必要があります。」

エラーは/wp-admin/includes/file.phpで発生していて、プラグインが悪い説や、テーマが悪い説などある。しかしプラグインを全部外しても、テーマを公式にしても解決しない。file.phpのエラーが出ている部分を**コメントアウトすると直る**という解決法が多いけど、何か違う気がする。httpだとエラーは出ないけど、httpsだとエラーが出る気がするから、ssl証明書が関係してる？
#原因
file.phpを読むとwp_remote_get()辺りでエラーが出ているように見える、と思って検索したらそれらしい原因が出てきた。

[テーマエディタ保存で致命的なエラー](https://ja.wordpress.org/support/topic/%E3%83%86%E3%83%BC%E3%83%9E%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BF%E4%BF%9D%E5%AD%98%E3%81%A7%E8%87%B4%E5%91%BD%E7%9A%84%E3%81%AA%E3%82%A8%E3%83%A9%E3%83%BC/)

```php:~/wp-admin/includes/file.php
//これを↓
$r = wp_remote_get( $url, compact( ‘cookies’, ‘headers’, ‘timeout’ ) );
//こうすると直る↓
$r = wp_remote_get( $url, compact( ‘cookies’, ‘headers’, ‘timeout’ ,’sslverify’) );
```

#結果
<img width="166" alt="ok.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563735/38a59370-7457-a12c-3e15-064a877224f2.png">

直った。めでたしめでたし😇
<table> タグを使いながら、テーブルの列の幅をcssで指定する。

# テーブルの幅を指定したい
ページ作るときにテーブルは`<div>`ではなく`<table>`, `<tr>`, `<td>`で書きたいのですが、列の幅を指定したくなることがありますよね。ありますよね。
![table_sample.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/602379/e906b700-e717-8a31-06b9-469616129609.png)

テーブルの幅はデフォルトだと自動設定されてしまいますので、中身に応じて複数のテーブルで列がそろわなくなります。
`<td>` にちまちま widthプロパティを指定してもいいのですが面倒です。


# ソースコード
```html:html
<html>

<head>
  <meta http-equiv="Content-Type" content="text/html; charset=x-sjis">
  <link rel="stylesheet" type="text/css" href="../css/style.css" />
  <link rel="stylesheet" type="text/css" href="../css/style_category_item_list.css" /> 
  <title>電車</title>
</head>

<body>
	<div id="wrapper">
		<div id="header">
			<h1 class="page_title">電車</h1>
		</div>
		<div id="category_item_list">
			<table border="0">
				<tr>
					<td>
......
```

```css:style_category_item_list.css
#category_item_list table {
	max-width: 800px;
	margin-left: auto;
	margin-right: auto;
    border-spacing : 4px 10px;
    width: 100%
}

#category_item_list  table tr td:nth-child(1) {
    vertical-align: top;
    width:150px;
}

#category_item_list  table tr td:nth-child(2) {
    vertical-align: top;
    padding-left: 20px;
    width:auto;
}

```

スタイルシートでテーブルの列の幅を指定できました。
リンクホバーで背景色を変えると余計な線がでる(Safari)

リスト形式のリンクで、ホバーすると背景色などを変えるCSSを組んでSafariで見てみると、

ホバーしたあとに余計な線がでてくるバグっぽい現象がでたのでその対策をメモです。

## HTML

* flexboxでliを横並びにする
* 背景色や文字色の切り替え設定はaタグで行うようにする

```html
<nav class="nav">
<ul class="nav__lists">
<li class="nav__list"><a href="" class="nav__link">リストホバー</a></li>
<li class="nav__list"><a href="" class="nav__link">リストホバー</a></li>
<li class="nav__list"><a href="" class="nav__link">リストホバー</a></li>
</ul>
</nav>
```

## Sass

```Sass

.nav {
  &__lists {
    border-radius: 8px;
    display: flex;
    justify-content: space-between;
    align-items: flex-start;
  }
  &__list {
    display: block;
    flex-grow: 0;
    flex-shrink: 1;
    flex-basis: auto;
    text-align: center;
    margin: 0;
    padding: 0;
    width: 100%;

    &:first-child {
      .nav__link {
        border-top-left-radius: 8px;
        border-bottom-left-radius:  8px;
      }
    }
    &:last-child {
      .nav__link {
        border-top-right-radius: 8px;
        border-bottom-right-radius: 8px;
      }
    }
  }
  &__link {
    background-color: #000;
    color: #fff;
    display: inline-block;
    padding: 14px 0;
    width: 100%;

    &:hover,
    &.is-current {
      background-color: #ff0;
      color: #fff;
    }
  }
}
```

## 現象

### Chrome

![chrome.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170830/3d638fce-4413-1f39-9917-03e20384a53f.gif)

### Safari

ホバーした後に線がでてくる

![safari-bug.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170830/fe3d4a5f-b8aa-a4e4-3eab-bf6ee351c102.gif)

## 対応

* aタグに `position: relative` と `z-index: 1` を入れる

## 修正後のSass

```Sass

.nav {
  &__lists {
    border-radius: 8px;
    display: flex;
    justify-content: space-between;
    align-items: flex-start;
  }
  &__list {
    display: block;
    flex-grow: 0;
    flex-shrink: 1;
    flex-basis: auto;
    text-align: center;
    margin: 0;
    padding: 0;
    width: 100%;

    &:first-child {
      .nav__link {
        border-top-left-radius: 8px;
        border-bottom-left-radius:  8px;
      }
    }
    &:last-child {
      .nav__link {
        border-top-right-radius: 8px;
        border-bottom-right-radius: 8px;
      }
    }
  }
  &__link {
    background-color: #000;
    color: #fff;
    display: inline-block;
    padding: 14px 0;
    width: 100%;
    position: relative; /* for safari bug */
    z-index: 1; /* for safari bug */

    &:hover,
    &.is-current {
      background-color: #ff0;
      color: #fff;
    }
  }
}
```

## 修正後の現象

![fixed.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170830/43561168-e7b9-d280-b81d-98e30baefc59.gif)


以上
WebブラウザのレンダリングとAngularのchange detectionについて

# WebブラウザのレンダリングとAngular の change detection
WebフレームワークとHTML 描画の仕組みの関係を研究する。

## react.js と仮想DOM
### 仮想DOM
- [仮想DOMは本当に“速い”のか？ DOM操作の新しい考え方を、フレームワークを実装して理解しよう](https://employment.en-japan.com/engineerhub/entry/2020/02/18/103000)
- [ブラウザの仕組み: 最新ウェブブラウザの内部構造](https://www.html5rocks.com/ja/tutorials/internals/howbrowserswork/)
- [リアルな DOM はなぜ遅いのか](https://blog.dodgson.org/b/2014/12/11/why-is-real-dom-slow/)
    - 仮想DOMは単なるjavascript のオブジェクト。
      realDOMとの間の相互作用を起こさないので、更新が速い。
      そこから前後の状態を比較して realDOM に反映させている。
    - 用語
        - (ツリーの)トラバース： 走査のこと。
        - Mutation Observer API: javascript が、リアルDOMツリーの変化を知るためのAPI。
    
- [React.jsのVirtualDOMについて](https://qiita.com/koba04/items/de79f158cd1f59ba5d20)
    - react.js
        - DOMの更新検出を高速にする仕組みが、いろいろありそう。
          更新検出のメカニズムを知っておくとよい。

## Angular
- Angular は仮想DOMを使ってない。
- Zone
    - Angularチームが開発している非同期処理のユーティリティライブラリです。
    - [AngularとZone.jsとテストの話](https://qiita.com/Quramy/items/83f4fbc6755309f78ad2)
    - [Understanding Zones](https://blog.thoughtram.io/angular/2016/01/22/understanding-zones.html)

### change detection
- [Angular Change Detection Explained](https://blog.thoughtram.io/angular/2016/02/22/angular-2-change-detection-explained.html)
- [日本語訳：Angular 2 Change Detection Explained](https://qiita.com/lacolaco/items/523d96ddbfe55c4e6949)
- [Angular 2 Change Detection Explained のスライド](http://pascalprecht.github.io/slides/angular-2-change-detection-explained/#/91)
    - Angular の Change Detection は、非同期イベントのたびに行われる。
        - 非同期イベント = イベント・XHR・タイマー
    - ChangeDetectionStrategyをいじる。
- [Everything you need to know about change detection in Angular](https://indepth.dev/everything-you-need-to-know-about-change-detection-in-angular/#change-detection-operations)

- [Angularでイベントから無駄にChange Detectionを走らせないためにすべきこと](https://qiita.com/ukyo/items/1775f5f09bbd9b5c2978) <br>
`NgZone#onMicrotaskEmpty` で Change Detection が無駄にやられてるか確認できる。 <br>
`NgZone#runOutsideAngular` をつける。

### DOM更新
- [The mechanics of DOM updates in Angular](https://indepth.dev/the-mechanics-of-dom-updates-in-angular/)


## フレームワーク一般
### change detection 概論
- [Change And Its Detection In JavaScript Frameworks](https://teropa.info/blog/2015/03/02/change-and-its-detection-in-javascript-frameworks.html)

## ツール
- [Tracing](http://www.chromium.org/developers/how-tos/trace-event-profiling-tool) 
    - Cromium のプロファイリングツール
git に登録済みのファイルの改行コードを正規化する

# git に登録済みのファイルの改行コードを正規化する

## 背景

Windows や Linux で各自改行コードに関して特に意識することなく登録した場合に改行コードがばらばらになってしまう場合があります。

`core.autocrlf` を正しく行っていたとしても、例えば Linux 向けのファイルを Windows のエディタで編集してそれを samba 経由で Linux にコピーしてコミットした場合など、改行コードが意図しないものになってしまうことがあります。

これを防ぐための仕組みとして `.gitattributes` というファイルにバイナリ/テキストファイルの指定および改行コードの種類を拡張子ごとに指定するものがあります。

これを使えば、 `.gitattributes` ファイル登録後に、追加したファイルに関しては改行コードを正規化することができます。

 `.gitattributes` ファイル登録前に登録したファイルに関しては変更されないので、それを正規化するコマンドを紹介します。

## `.gitattributes` のコミット

準備として `.gitattributes` を作成してコミットします。

git リポジトリのトップに `.gitattributes` というファイル名で例えば以下のような内容で作成して `git add` して `git commit` します。

```
*.txt text eol=lf
```

これは txt の拡張子を持つファイルはテキストファイルで、改行コードは常に LF と指定するものです。


## 改行コードの正規化するコマンド

### Git 2.16 以降を使っている場合

以下コマンドを実行すると、カレントディレクトリ以下のファイルに対して、`.gitattributes` ファイルに基づいて改行コードの正規化を行い、index に登録した状態になります。

```
git add --renormalize .
```

この後、`git status` で変更されたファイルを確認後 `git commit` すれば改行コードの正規化を行うことができます。

### Git 2.16 以前を使っている場合

[Git: how to renormalize line endings in all files in all revisions?](https://stackoverflow.com/questions/7156694/git-how-to-renormalize-line-endings-in-all-files-in-all-revisions) によると以下のようにやるみたいです。

```
git read-tree --empty
git add .
```


## 参考サイト


* [.gitattributesで改行コードの扱いを制御する](https://qiita.com/nacam403/items/23511637335fc221bba2)
* [行終端を処理するようGitを設定する](https://docs.github.com/ja/github/using-git/configuring-git-to-handle-line-endings)
* [git-add - Add file contents to the index](https://git-scm.com/docs/git-add)
* [Git: how to renormalize line endings in all files in all revisions?](https://stackoverflow.com/questions/7156694/git-how-to-renormalize-line-endings-in-all-files-in-all-revisions)
ジェネレーターに頼らずVSCodeの拡張作ってみる

2020/07/23更新[^1]

## 初めに
Node.jsがDL出来ない特殊環境でもVSCodeの拡張を作りたいというニッチ(というか私だけ)のためにまずは自宅環境でジェネレーターで作ったhelloworldをもとに手動で作ってみる。



~~まだ本番環境では試せてない かつ~~
一応この手順で本番環境でもインストールできた。
ただ、中身は理解しないまま進んでいるため、試してみようって方は自己責任で

## 構成

```
root
├extension
│├src
││└extension.js
│└package.json
└extension.vsixmanifest
```

この構成でzipに圧縮。拡張子vsixに変更して、[VSIXからのインストール]でインストール

### package.json

```json
{
    "name": "helloworld",
    "version": "0.0.1",
    "engines": {
        "vscode": "^1.22.0"
    },
    "activationEvents": [
        "onCommand:helloworld.helloWorld"
    ],
    "main": "./src/extension.js",
    "contributes": {
        "commands": [
            {
                "command": "helloworld.helloWorld",
                "title": "Hello World"
            }
        ]
    },
    "publisher": "test"
}
```

### extension.js

```js
const vscode = require('vscode');

/**
    @param {vscode.ExtensionContext} context
*/
function activate(context) {
    let disposable = vscode.commands.registerCommand('helloworld.helloWorld',
        function () {
            vscode.window.showInformationMessage('Hello!!!');
        }
    );

    context.subscriptions.push(disposable);
}

exports.activate = activate;
```

### extension.vsixmanifest

```xml
<?xml version="1.0" encoding="utf-8"?>
<PackageManifest Version="2.0.0" xmlns="http://schemas.microsoft.com/developer/vsx-schema/2011" xmlns:d="http://schemas.microsoft.com/developer/vsx-schema-design/2011">
  <Metadata>
    <Identity Language="JP" Id="helloworld" Version="0.0.1" Publisher="testtest"/>
    <DisplayName>helloworld</DisplayName>
  </Metadata>
  <Installation>
    <InstallationTarget Id="Microsoft.VisualStudio.Code"/>
  </Installation>
  <Dependencies/>
  <Assets>
    <Asset Type="Microsoft.VisualStudio.Code.Manifest" Path="extension/package.json" Addressable="true" />
  </Assets>
</PackageManifest>
```

## まとめ
これで、Node.jsがDL出来ない特殊環境でもVSCodeの拡張を作れるようになったので、車輪の再開発を辞さなければ特殊環境でも拡張の恩恵を得られるようになった。

[^1]: 3回目
初心者が機械学習をやってみたら（その５）


今回は、先にダウンロードした各種ボートレースデータファイルから、
必要項目を取得し、データベース（今回はMongoDB）に登録します。

データベースのコレクションは、各データファイル毎に
・番組表
・競走成績
・レーサー期別成績
の３コレクションを作成します。

#1.各種データの取得から登録します。

各種データファイルから必要項目を取得するためのポイントを何点か記録します。
説明は番組表で記述しています。

##1.1.バイナリモードで読み込む

番組表の文字コードはSJISですので、Jetsonにて解析するため、
バイナリモードにてファイルを解析します。

```ソースコード（抜粋）.
# filePath：番組表ファイルパス
# 'br'：バイナリモード読み込み
with open(filePath, 'br') as raceData:
```

##1.2.日本語はUTF-8で取得

バイナリモードで解析しているため、日本語部分は取得したデータをUTF-8に変換する必要がある。

```ソースコード（抜粋）.
# 選手名
# line[6:14]：選手名を表す部分バイト位置
# decode('cp932')：SJISからデコードしUTF-8に変換（あってる？）
# cp9321がSJISを意味している。
playerName = line[6:14].decode('cp932')
```

##1.3.級別など数字でない項目は数値化

級別（A1、A2など）はボートレーサーのランクを表します。
しかし、機械学習させるためには数値化が必須となります。

```ソースコード（抜粋）.
# 級別
grade = line[22:24].decode('cp932')
# 級別が'A1'である場合
if 'A1' in grade:
    # 数値化し1とする
    numGrade = 1
# 級別が'A2'である場合
elif 'A2' in grade:
    # 数値化し2とする
    numGrade = 2
# 級別が'B1'である場合
elif 'B1' in grade:
    # 数値化し3とする
    numGrade = 3
# 級別がその他である場合
else:
    # 数値化し4とする
    numGrade = 4
```


##1.4.MongoDBに登録

MongoDBへは、Pythonの辞書型（Dictionary型）で登録します。
辞書にデータを詰め込み、登録すると言う流れです。

```ソースコード（抜粋）.
# mongo DB
from pymongo import MongoClient

# mongoDB
client = MongoClient()
# データベース
# DBNAME：データベース名称
db = client[DBNAME]
# プログラムコレクション
# P_COLL：番組表格納コレクション名
pgCol = db[P_COLL]

# 番組表情報辞書
pgDic = {}
# 開催場所格納
# LOCATION：MongoDBに対する開催場のキー名称
# ちなみに私は、「LOCATION = 'location'」で定義しました。
pgDic[LOCATION] = int(location)
# レース番号取得
raceNo = int(line[0:4].decode('cp932'))
# RACENO：MongoDBに対する開催場のキー名称
# ちなみに私は、「RACENO = 'raceno'」で定義しました。
pgDic[RACENO] = raceNo
（以降、必要項目を辞書に登録）

try:
    # 番組表情報辞書を登録
    # insert_oneは、１件挿入メソッド
    result = pgCol.insert_one(pgDic)
# キーが重複する場合
# 番組表コレクションは、「日付、開催場、レース番号」をキーとする。
except pymongo.errors.DuplicateKeyError:
    # キー重複例外は無視
    pass
```

#2.MongoDBに関して


##2.1.MongoDBの各種名称を忘れないように。

MongoDBとRDBの名称の比較

|MongoDB|RDB|MongoDBの特徴|
|:------|:--|:-----------|
|データベース|データベース|「CREATE DATABASE」は無く、「USE」でデータベース作成|
|コレクション|テーブル|スキーマ定義が無い|
|ドキュメント|レコード|ドキュメントは、JSON形式（キー・バリュー）|



##2.2.MongoDBでユニークインデックスを設定します。

重複データが蓄積させないため、
MongoDBの各コレクションにユニークインデックスを設定

番組表を例に説明します。
番組表は日付、開催場、レース番号で一意に決まるため、ユニークインデックスを作成する。
ちなみに、競走成績も同じキーでユニークインデックスを作成しました。

|項目|MongoDB内での名称|
|:------------|:------------------|
|データベース名 | boatRace |
|コレクション名   | program |
|日付キー      | date　　 |
|開催場キー    | location |
|レース番号キー | raceno   |




```端末.
$ mongo
MongoDB shell version: 3.2.11
connecting to: test
Welcome to the MongoDB shell.
For interactive help, type "help".
For more comprehensive documentation, see
	http://docs.mongodb.org/
Questions? Try the support group
	http://groups.google.com/group/mongodb-user
> use boatRace
switched to db boatRace
> boatRace.program.createIndex( { date: 1, location: 1, raceno: 1 }, { unique: true } )
```

##2.3.MongoDBをビジュアル的に見たい場合

Jetsonはヘッドレスで運用しているため、MongoDBのデータをビジュアル的に見たい場合は、
**[MongoDB Compass](https://www.mongodb.com/products/compass)**を使用することにより、データを確認できます。

https://www.mongodb.com/products/compass

#関連（連載）

[初心者が機械学習をやってみたら（その０）](https://qiita.com/tosikazu-s/items/db2b37c46b104633d79a)
[初心者が機械学習をやってみたら（その６）]
Vue(Nuxt.js)コンポーネントプロパティを記載する順番メモ

Vue(Nuxt.js)のコンポーネントプロパティのまとめになります。

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

export default Vue.extend({
  name: '',
  components: {},
  asyncData() {}, //pagesのみで使用できる または、fetch(){}
  props: {}, 
  data() {
    return {}
  },
  computed: {},
  watch: {},
  created() {}, //(beforeCreate)
  mounted() {}, //(beforeMount)
  updated(){}, //(beforeUpdate)
  activated(){},
  deactivated(){},
  destroyed() {}, //(beforeDestroy)
  methods: {}
})

</script>
```
Teams会議を複数使って円滑なコミュニケーションを


初投稿です。Markdownとかは興味ある人が多ければ後々学びます。

Teamsの魔改造（というか仕様範囲を知らない人ができることを増やす）が今回のテーマです。
※Office365 business前提です。無料版は無理よ

1.　Teams会議で複数の会議に同じ内容を送る
2.　複数のTeams会議に聖徳太子モードで出る
3.　Teams会議同士を相互接続する


1.　Teams会議で複数の会議に同じ内容を送る
大規模イベントをTeamsライブイベントでやろうとしてインターナルで不評だったので、こちらにしました。技術的には比較的容易です。最大3つ（2020.07.23時点では750人まで）に送れます。リアルタイム配信最高。
アプリのTeams + Chrome等のブラウザのTeams（デフォルトだとIE11で開く会社の多いことよ）で2つまで、1端末から会議に参加可能です。ここで同じ画面と同じマイクを**全Teams会議で**共有しておくと、3会議まで同じ内容を送信できます。
（Windowsだとマイクが排他モードでダメかもしれないので、排他制御を無効にしてください。詳しくは「Windows　排他制御　音声　無効」あたりでぐぐって）

弊社では供出するはずの共有PCで「Teamsとブラウザを両方とも最新版にアップしないとうまくいかない」というトラブルが多発しました。


2.　複数のTeams会議に聖徳太子モードで出る
アニメでもニュースでもいいですけど、どうでもいいのって並列再生して要点（もしくはもめた点）だけつかみたいときありますよね。
1.同様にして、自分が出るTeams会議もアプリ1つ+ブラウザ2つまで同時視聴が可能です。私はどうでもいいアニメを倍速4並列で消化して「刺さるところはここだったな」がわかればいい程度の雑人間なので、人による相性はあるでしょう。


3.　Teams会議同士を相互接続する
Teamsライブイベント、弊社では大変不評です。理由は簡単で「1分も(環境により)遅延するとは何事だ」です。
プロデューサ間では最小限の遅延になるよう工夫されているようですが、見る人が置き去りにされている感がすごいのが問題のようです。
この対策として、「ある人が参加しているTeams会議の音声と画面をほかのTeams会議にリダイレクトする」という手法を提案しました。実際問題としては「それやるよりHDMIスプリッタ使えよ」となり没でした。

解決策として、
3-1.Teams会議のメイン会場にいる人が再配送用Teams会議で画面と音声を共有(音声はリダイレクト、Windowsだと「このデバイスを聞く」の設定でできるはずだが未実験)
と、
3-2.Teams会議の音声をノイズキャンセル効果の高いスピーカーフォン等でうまく近くに置き、共有する(質疑の際は複数会議をモデレータがコントロール。実験したがモデレータがしんどい)
という2つが取れます。これを繰り返せば事実上無制限。

私は3-2を使い最大5Teams会議（うち一つは取締役直結）のモデレートを5台のPCでやるという地獄を見ました……

結論
技術的な部分を理解していて、なおかつ同時コントロールができる限界までにしましょう。
私はCXOの某氏が「マイクを常にON」で接続していたけれど、強制ミュートができませんでした……
htmlのoptionを否定先読みで加工

今までなんとなく使ってた否定先読みが理解できた気がしたので整理

最近何故か、htmlのoptionを特定のvalue以外除去、という処理を依頼される
既にoptionがハードコードされた状態からの処理になるのでpreg_replaceで検討

例えば、以下のようなoptionについて、いくつかのパターンを見ていく

```
$subject = <<<OPTION
<option value="111">111</option>
<option value="222">222</option>
<option value="333">333</option>
<option value="444">444</option>
<option value="555">555</option>
<option value="11111">11111</option>
<option value="22222">22222</option>
<option value="33333">33333</option>
<option value="44444">44444</option>
<option value="55555">55555</option>

OPTION;

```

#### 555だけを残すパターン

```
$pattern = '/<option (?!value="555")value="\d*">.*<\/option>\n/';
preg_replace($pattern ,'',$subject);
↓↓↓
<option value="555">555</option>
```

`<option (?!value="555")`の部分は
`(?!value="555")`が`<option `の直後の位置であり、
`<option `の後に`value="555"`が後に続かない
ものとなる

#### 5を含むものだけを残すパターン

```
$pattern = '/<option (?!value="\d*5\d*")value="\d*">.*<\/option>\n/';
preg_replace($pattern ,'',$subject);
↓↓↓
<option value="555">555</option>
<option value="55555">55555</option>
```

#### 1,3,5を含むものだけを残すパターン
```
$pattern = '/<option (?!value="\d*[135]\d*")value="\d*">.*<\/option>\n/';
preg_replace($pattern ,'',$subject);
↓↓↓
<option value="111">111</option>
<option value="333">333</option>
<option value="555">555</option>
<option value="11111">11111</option>
<option value="33333">33333</option>
<option value="55555">55555</option>
```
#### 5桁の数字だけを残すパターン

```
$pattern = '/<option (?!value="\d{5,5}")value="\d*">.*<\/option>\n/';
preg_replace($pattern ,'',$subject);
↓↓↓
<option value="11111">11111</option>
<option value="22222">22222</option>
<option value="33333">33333</option>
<option value="44444">44444</option>
<option value="55555">55555</option>
```
Railsでアカウントがなくてもチャットができるサービス作ってみた。

<h1>Railsでアカウントがなくてもチャットができるサービス作ってみた。</h1>
<br>
<h3>作成開始までの経緯</h3>

<p>コロナウイルスにより、家で待機することが多くなり、友達に会えないなどという方が多く出てきています。</p>
<p>そんなときに流行ったのがZOOMというアプリでした。</p>
<p>ZOOMのアカウントがなくても気軽に友達と繋がれるというのにあこがれました。</p>
<p>とにかく流行らなくてもいいので、作ってみようと感じ、チャットサイト作成を開始しました。</p>

<h3>ウェブサービス(GoodChat)の紹介</h3>
<a href="https://good-chat.herokuapp.com">https://good-chat.herokuapp.com</a>

![コメント 2020-07-04 141429.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565846/d74ea77c-8201-854d-1265-fac4543a4bcc.png)
![コメント 2020-07-02 182932.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565846/6b6108a3-c43e-d4a1-61bc-11b36763505f.png)

<h3>チャットサイトを作ってみて</h3>
<p>チャットサイトを作ってみて、いままで痛感ことのないようなたくさんの修羅場が襲ってきました。
</p>
<p>RailsのActionCableの記事はそこまで多いわけではないので、
なかなか躓いたところが多かったです。</p>
<p>特に、ActionCableのcurrent_user関係　ActionJobのcurrent_user関係でかなりつまづきました...</p>
<p>このチャットサイトに今までで作るのに一番苦労したサイトだと思います。</p>

<h3>最後に</h3>
<p>いろいろ修羅場があって正直挫折という１文字目がでてくるほどでしたが、なんとか乗り越えることができました。</p>
<p>やはりあきらめないという心は偉大だと実感しました。</p>
<p>もしよかったらGoodChat使ってみてください。</p>
<p>まだ中学生でAWS使えないのがつらいです。</p>

twitter ↡
https://twitter.com/Kuro_on_Rails
JavaScriptでリンクを制御！同一画面や新しいウインドウで開く方法　byウェブカツ

**・inputタグのボタンにリンクを指定したい**
**・a要素のクリック操作以外でページを遷移させたい**

という時に、JavaScriptでリンクを制御する方法を紹介する。

HTMLでリンクを開く
-----------
HTMLでリンクを開きたい場合、a要素に<span class="keiko_yellow">**href**</span>属性を指定する。

例えば以下のように記述すると

```html:html
<a href="https://www.webukatu.com/">ウェブカツTOP</a>
```

[ウェブカツTOP](https://www.webukatu.com/)

このようにhref属性に指定したURLへジャンプする。

JavaScriptでリンクを開く
-----------------
続いて、JavaScriptでリンクを開きたい場合はどのように指定するのか紹介する。

### 同一画面でリンクを開く
同じ画面でリンクを開きたい場合は、<span class="keiko_yellow">**location.href**</span>のプロパティにURLを指定する。

```javascript:javascript
location.href='URL';
```

リンクを開くボタンを設置したい場合、以下のように**onClickイベント**にリンクを開く処理を指定。

```html:html
<input type="button" value="ウェブカツTOP" onClick="location.href='https://www.webukatu.com'">
```

### 新しいウインドウやタブでリンクを開く
新しいウインドウやタブでリンクを開きたい場合は、<span class="keiko_yellow">**window.open**</span>を指定する。

```javascript:javascript
window.open('URL', '_blank');
```

新しいウインドウでリンクを開くボタンを設置したい場合は、同じようにonClickイベントにリンクを開く処理を指定。

```html:html
<input type="button" value="ウェブカツTOP" onClick="window.open('https://www.webukatu.com', '_blank')">
```

### location.hrefは現在のURLも取得できる
location.hrefはプロパティを指定するとそのURLへ画面が遷移するが、現在のWEBページのURLを取得することも可能。

読み取った場合 | 書き込んだ場合
------- | ----------------
現在のWEBページのURLを取得 | 新しいURLにページが遷移   

```javascript:javascript
//現在のURLを取得
console.log(location.href);

//指定したURLへ遷移
location.href = 'index.html';
```

相対パスを指定した場合、<span class="keiko_yellow">**現在のURLが基点**</span>となる。

まとめ
---
以上、JavaScriptでリンクを開く方法について

**・同一画面でリンクを開く方法**
**・新しいウインドウでリンクを開く方法**
 **・location.hrefについて**

から紹介した。

JavaScriptでリンクを制御したい場合はぜひ参考にしてほしい。

---
#### かずきち
プログラミング学習サイト「ウェブカツ!!」の顧問。
不動産、保険の営業マンから、エンジニアへ転身。
「HTMLって何？」という状態から3ヶ月の独学のみでエンジニアへ転職し、１年で年収１千万を稼ぐエンジニアへ。
独学時代のプログラミング学習の分かりにくさや、「技術しか出来ずに稼げていないエンジニア」の現状を変えるため「ウェブカツ」を立ち上げ運営している。

【ウェブカツ公式WEBサイト】
[https://webukatu.com/](https://webukatu.com/)
MAMPのPHPで環境変数を利用する

【背景】公開するサーバー環境で.htaccessを利用するため、ローカル開発環境として利用しているMAMPでも使えるようにする。
【やること】公開する環境ではSETENVを使用したいのでMAMPでもこれを.htaccessに設定し、PHPで正しく値を取得できる環境を構築する

.htaccessを有効にする方法は下記を参照
[MAMP環境で.htaccessファイルを有効にする方法](https://qiita.com/musica_gatto/items/5dc8d8c8a57b261488c2)


【具体的に】
（１）.htaccessを下記のように記述/MAMP/htdocs/に保存
     設置場所は[MAMP環境で最低限必要な設定（Apache・PHP周り）](https://marycore.jp/prog/mamp/configuration-for-mamp/)を参考にしました

```
SetEnv DB_USERNAME 'testtest'
SetEnv DB_PASSWORD 'cccccccc'
```
（２）.htaccessを有効にする
[MAMP環境で.htaccessファイルを有効にする方法](https://qiita.com/musica_gatto/items/5dc8d8c8a57b261488c2)を参考に

/Applications/MAMP/conf/apache/httpd.confのAllowOverride NoneをAllに変更


```
<Directory />
    Options FollowSymLinks ExecCGI
    AllowOverride All
    Order deny,allow
    Allow from all
</Directory>
```

（３）下記のようなテスト用PHPを作成し表示を確認

```php
    <?php
        $username = getenv('DB_USERNAME');
        $password = getenv('DB_PASSWORD');
        print $username;
        print "<br>";
        print $password;
    ?>
````

【結果】
下記のように正しく出力されました

```
testtest
cccccccc
```
node.js はじめ方

node.jsのはじめる時にやったことを簡単にまとめてみる。
<h1>コマンドラインでの準備</h1><ol><li>mkdir,touchでそれぞれ新しいディレクトリとファイルを作る。
</li>
<li>npm init　コマンドで、package.json ファイルを作成する。
※package.json・・・依存関係を記載するファイル。
コマンド入力後、基本エンターキー連打でOK
</li>
<li>npm install　〜でnpmをインストールし、プロジェクト開始する。
※--saveはいらない
このコマンドを入力することによって、package.jsonに依存関係の記載を行うことができる。
</li>
<li>node ファイル名.js
node.jsのファイルを実行させる方法
</li>
<li>nodemon ファイル名.js
こちらも実行させる方法であるが、実行させたまま、ファイルを更新しても、自動的にサーバが再起動が可能になる。
※nodemonを事前にインストールしておく必要あり。
</li></ol><h1>ブラウザ側での準備</h1>node.jsを実行させる場合、サーバーとの通信が必要となる。そのため、自分のパソコン(locallhost:3000を指定して実行させる。)<ol><li>node.jsのファイルにlocallhost:3000で実行すると書く。</ol></li>

```javascript:
app.listen(3000,function(){
console.log("Server is running on port 3000.");
})
```

<li>おまじない形を書く

```javascript:
const a = require("インストールしたnpm名");
```

</li>
Business Object in the real world

　2020-07-22にon airされた『モーニングCROSS』に於いて田中 ウルヴェ 京 氏がpresentationを履行．氏は「Why-What-How」というframeworkを用いて，自家中毒気味のathleteが陥っている循環参照について言及した．
　氏によると，正しい{why, what, how}は，{why: "健康を期して", what: "減量する 5 kg", how: "例えば走る"}．自家中毒気味のathleteは{why: null, what: "獲得する medal", how: "例えば走る"}と設定しているきらいがあるとのこと．
　後者は{why, what, how}とits filler or its contentsが齟齬をきたしている．氏は，frameworkが適切に用いられたcaseとframeworkが誤用されたcaseの比較論を展開なさっていた．
　namespace Pgに於いて，後者は存在しえない．constructorを起動してもvalidatorによって弾かれる．つまり，氏が展開したような比較論は成り立たない．氏の比較論はvalidatorに吸収される．
　Business Object in the real worldにそういった機構は実装されていない．あるいは詭弁を弄するという行為が過失犯であることの方が確信犯よりも多いかもしれない．
学習法

### 何をするか
- インプット
 - ３０代以降〜ぐらいになるとすでに世の中の色々なことを経験済みであり、単純にインプットするだけだと学習効率が悪くなってくる。 
- アウトプット
 - アウトプットだと新たな刺激となり、インプットだけよりも格段に身につきやすい。
 - 新しい(自然)言語を覚えるのであれば、実際に会話に使ってみる。会話が無理であれば、実際にその言葉を使う状況を想像しながら口に出してみるなど。
 - 手書きで書いてみることも効果がある。何故か、パソコンなどに入力するより手書きの方が効果が大きいらしい。　https://note.com/suzuki_shinsuke/n/n8b39d12bf658
 - また人に教えることも効果が大きい。　人に教えるためには、覚えたことを要約する必要がある。そのように要約すれば自分にとっても覚えやすくなるため。
    - 人に教えることを前提としていると、インプットする時に浅い理解でなく深く理解しようという態度にもなる。

### どのようにするか

楽しみのための学習ではなくて仕事などに役立てるための実学をやりたい場合は、効率を上げるため、もっとも効果的なことのみをやる。
 - 具体的には、本や記事を読む際、ただ上から下へ読むのではなく、お手本コードがあるようなものであればその写経や実際に書いて動かしてみるなど。お手本コードがないようなものの場合は、その文章のエッセンスを要約し自分で後で参照した時にごく短時間で思い出せるチートシート的な形にしてまとめておくなど。

Google検索、Youtubeなどで有用な情報が無料で一瞬で得られる時代であるので、何か分からないことがある時に勝手に思い込んだりする前にささっと検索してわかるようにすると、比較的短い時間で博識になれると考えられる。
Plugin version is not the same as library version

# 概要
kotlin-gradle-plugin を利用していると、プラグインとライブラリのバージョンが異なるという内容の警告が出ることがあります。

Gradle プラグインとライブラリのバージョンが同一である必要はありませんので、これは、誤検知です。

以下に、現象と対処法を示します。

# 現象
## ◆ 警告内容
`Plugin version (プラグインのバージョン) is not the same as library version (ライブラリのバージョン) ` という内容の警告が表示されます。

**例：**
*Plugin version (1.3.72) is not the same as library version (jdk8-1.3.72)*
![kotlin-warning.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/219474/a74e11c3-1ec9-0b97-8a64-91a6377c99a1.png)

## ◆ 事例
以下は、実際に遭遇した事例です。

### ☆ Root project の build.gradle

```groovy
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
    ext.kotlin_version = "1.3.72"
    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath "com.android.tools.build:gradle:4.0.1"
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        google()
        jcenter()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}
```

### ☆ Sub project の build.gradle

```groovy
apply plugin: 'java-library'
apply plugin: 'kotlin'

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
}

sourceCompatibility = "1.8"
targetCompatibility = "1.8"
```

### ☆ 警告表示
*Plugin version (1.3.72) is not the same as library version (jdk8-1.3.72)*
![kotlin.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/219474/7ead6edd-5f90-ed32-4f9e-33530edd186a.png)

# 対処方法
誤検知なので、対処する必要はありません。

警告の抑制は以下のように行うことができます。[^1]

```groovy
// https://youtrack.jetbrains.com/issue/KT-33248
// noinspection DifferentStdlibGradleVersion
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
```

# 参考
https://youtrack.jetbrains.com/issue/KT-23744
https://youtrack.jetbrains.com/issue/KT-33248

[^1]: リンクのコメントは不要ですが、意図を残しておいたほうが保守者は幸せになれると思います。
Intel RealSenseのViewerが起動しない問題の解決方法

ちょっと前に「Intel RealSense D435i」に触れたくなったのですが，PCが変わったので環境構築を行ったのですが問題が．

SDKと一緒にinstallされる「Intel RealSense Viewer」と「Depth Quality tool for Intel RealSense Cameras」が起動しません．アイコンはあるのに，ダブルクリックしても，管理者権限で実行してもなにも起こりません...

古いPCや研究室のPCでは普通に動いていたのに，おかしい．

この問題を解決するために結構な時間がかかったので，記録したいと思います．
（[ブログのほう](https://ume-boshi.hatenablog.jp/)に書いていたのですが，問題解決系の内容だったのでQiitaにも投稿しようかと．）

# 状況
### 動作環境：
OS：Windows10
GPU1：Intel(R) UHD Graphics
GPU2：nVidia GeForce MX230  

補助記憶装置の用途：

* Cドライブ → ソフトアプリケーションのインストール
* Dドライブ → 雑多なファイルの保存
<b>（DownloadsやDocumentsなどのフォルダもこちら）</b>

### 問題
SDKのinstall時に入るアプリケーションが起動しない．


# 解決方法
下記のフォルダに，「Documents」フォルダを新規作成するだけです．
`C:/Users/ユーザ名/`

### 原因：
アプリケーションの起動時に，一時的にlogを出力するらしく，その出力場所が ↓ のPathが設定されているようです．
`C:/Users/ユーザ名/Documents`

私は，SSDのパーティションをCとDの2つに分けていたため，↑ のPathが存在していませんでした．  

そのため，起動時にlogを書き出す際にディレクトリが存在せず，エラーを吐き出すこともせずにアプリが落ちていたのだと推測されます．

![20200418052420.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311590/0b1daed2-4de7-00a7-7b4f-7df75ee99cbd.png)

<br>
### その他，疑った内容や試した方法
私は上記の修正方法で解決しましたが， ↓ 以降のことで動作が解決する人がいるかもしれないので，一応共有しておきます（全部検討したけど，私の場合は関係なかった）．

* 管理者権限として実行  
* SDKを再インストール，バージョンの変更
* IntelのHD Graphics Driverを再インストールする  
* firewallを一時停止する 
* グラフィックカードが複数内蔵されており不具合が生じている?

# おわりに
「フォルダを追加するだけで解決するのかよ...」っていうことがよくあるので，なんとか減らしていきたいものです．それにしても，githubのissueを追っていくのってなかなか難しいですね．

## 参考
[issue](https://github.com/IntelRealSense/librealsense/issues/5707)
ゼロから始めるLeetCode Day100「108. Convert Sorted Array to Binary Search Tree」

# 概要

海外ではエンジニアの面接においてコーディングテストというものが行われるらしく、多くの場合、特定の関数やクラスをお題に沿って実装するという物がメインである。

どうやら多くのエンジニアはその対策としてLeetCodeなるサイトで対策を行うようだ。

早い話が本場でも行われているようなコーディングテストに耐えうるようなアルゴリズム力を鍛えるサイトであり、海外のテックカンパニーでのキャリアを積みたい方にとっては避けては通れない道である。

と、仰々しく書いてみましたが、私は今のところそういった面接を受ける予定はありません。

ただ、ITエンジニアとして人並みのアルゴリズム力くらいは持っておいた方がいいだろうということで不定期に問題を解いてその時に考えたやり方をメモ的に書いていこうかと思います。

[Leetcode](https://leetcode.com/)

Python3で解いています。

[ゼロから始めるLeetCode 目次](https://qiita.com/KueharX/items/6ee2502c3b620c795b70)

前回
[ゼロから始めるLeetCode Day99 「112. Path Sum」](https://qiita.com/KueharX/items/32eb0395b068a59d9722)

[Twitter](https://twitter.com/kueharx)やってます。

**[技術ブログ](https://kueharx.blogspot.com/)始めました！！**
技術はLeetCode、Django、Nuxt、あたりについて書くと思います。**こちらの方が更新は早いので**、よければブクマよろしくお願いいたします！


## お知らせ
Day 100でQiitaでの投稿はひとまず区切りを付けようかと思います。
タグの記事が僕の記事ばかりになってしまうのもいかがなものかと思いましたし、他に有益な情報を提供している方の邪魔になってしまうこともあると考えたので、こうすることにしました。
至らない部分は多々ありましたが、今までお付き合い頂きありがとうございました。

問題を解いて記事を書く、というのは上記の個人ブログで続けるつもりですし、興味ある方はたまにそちらを覗いていただけると嬉しいです。
Twitterの方のアカウントはほとんど更新通知用と化しているので、Leetcodeを解く記事について気になる方はそちらも合わせてフォローいただくと良いかもしれません。

# 問題
[108. Convert Sorted Array to Binary Search Tree](https://leetcode.com/problems/convert-sorted-array-to-binary-search-tree/)
難易度はEasy。
[コーディング面接対策のために解きたいLeetCode 60問](https://1kohei1.com/leetcode/)からの抜粋です。

問題としては、要素が昇順にソートされた配列が与えられた場合，それを高さバランスのとれた二分探索木に変換してください、というものです。
この問題では、二分探索木とは，各ノードの2つの部分木の深さが1以上異なることがない二分木と定義されます。


```

Example:

Given the sorted array: [-10,-3,0,5,9],

One possible answer is: [0,-3,9,-10,null,5], which represents the following height balanced BST:

      0
     / \
   -3   9
   /   /
 -10  5
```

# 解法

```python
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def sortedArrayToBST(self, nums: List[int]) -> TreeNode:
        if not nums:
            return None
        mid = len(nums)//2
        root = TreeNode(nums[mid])
        root.left = self.sortedArrayToBST(nums[:mid])
        if mid < len(nums)-1:
            root.right = self.sortedArrayToBST(nums[mid+1:])
        return root
```

再帰の典型的なような問題だったので、それぞれの右側と左側にソートされた配列の中間の値で区切ったものを次々と代入していく、というようにしました。

最終的には配列の要素を全て追加し終わった後に`root`を返し、終了です。


ではこのシリーズはここまで。今までお付き合い頂き、ありがとうございました。
ゼロから始めるLeetCode Day99 「112. Path Sum」

# 概要

海外ではエンジニアの面接においてコーディングテストというものが行われるらしく、多くの場合、特定の関数やクラスをお題に沿って実装するという物がメインである。

どうやら多くのエンジニアはその対策としてLeetCodeなるサイトで対策を行うようだ。

早い話が本場でも行われているようなコーディングテストに耐えうるようなアルゴリズム力を鍛えるサイトであり、海外のテックカンパニーでのキャリアを積みたい方にとっては避けては通れない道である。

と、仰々しく書いてみましたが、私は今のところそういった面接を受ける予定はありません。

ただ、ITエンジニアとして人並みのアルゴリズム力くらいは持っておいた方がいいだろうということで不定期に問題を解いてその時に考えたやり方をメモ的に書いていこうかと思います。

[Leetcode](https://leetcode.com/)

Python3で解いています。

[ゼロから始めるLeetCode 目次](https://qiita.com/KueharX/items/6ee2502c3b620c795b70)

前回
[ゼロから始めるLeetCode Day98「39. Combination Sum」](https://qiita.com/KueharX/items/b8bce594f4663af18f0e)

[Twitter](https://twitter.com/kueharx)やってます。

**[技術ブログ](https://kueharx.blogspot.com/)始めました！！**
技術はLeetCode、Django、Nuxt、あたりについて書くと思います。**こちらの方が更新は早いので**、よければブクマよろしくお願いいたします！


## お知らせ
Day 100でQiitaでの投稿はひとまず区切りを付けようかと思います。
タグの記事が僕の記事ばかりになってしまうのもいかがなものかと思いましたし、他に有益な情報を提供している方の邪魔になってしまうこともあると考えたので、こうすることにしました。
至らない部分は多々ありましたが、今までお付き合い頂きありがとうございました。

問題を解いて記事を書く、というのは上記の個人ブログで続けるつもりですし、興味ある方はたまにそちらを覗いていただけると嬉しいです。
Twitterの方のアカウントはほとんど更新通知用と化しているので、Leetcodeを解く記事について気になる方はそちらも合わせてフォローいただくと良いかもしれません。


# 問題
[112. Path Sum](https://leetcode.com/problems/path-sum/)
難易度はEasy。
[コーディング面接対策のために解きたいLeetCode 60問](https://1kohei1.com/leetcode/)からの抜粋です。

問題としては、二分木と和が与えられたとき、その木がルートから葉へのパスを持ち、パスに沿ってすべての値を加算すると、与えられた和に等しくなるかどうかを判断してください、というものです。

```

Example:

Given the below binary tree and sum = 22,

      5
     / \
    4   8
   /   / \
  11  13  4
 /  \      \
7    2      1
return true, as there exist a root-to-leaf path 5->4->11->2 which sum is 22.
```

# 解法

スタックを使って解きました。

```python
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def hasPathSum(self, root: TreeNode, sum: int) -> bool:
        if not root:
            return False
        stack = []
        stack.append((root,sum-root.val))
        while stack:
            node,sum = stack.pop()
            if not node.left and not node.right and sum == 0:
                return True
            if node.left:
                stack.append((node.left,sum-node.left.val))
            if node.right:
                stack.append((node.right,sum-node.right.val))       
        return False
# Runtime: 48 ms, faster than 55.07% of Python3 online submissions for Path Sum.
# Memory Usage: 15.6 MB, less than 52.21% of Python3 online submissions for Path Sum.
```

と言っても、結局dfsで網羅しながら`sum`から各`val`を引いてそれが0になれば`True`を、そうじゃないなら`False`を返すというだけの実装です。
別にstackを使わなければならない要素はそこまでありません。
値の管理がしやすいかな？と思って使ってみました。

それで通ったのでまあ良いのかなと。
Easyですし問題も複雑ではないのでこういうところで気づいたことはどんどん試していきたいですね。

では今回はここまで。お疲れ様でした。
ゼロから始めるLeetCode Day98「39. Combination Sum」

# 概要

海外ではエンジニアの面接においてコーディングテストというものが行われるらしく、多くの場合、特定の関数やクラスをお題に沿って実装するという物がメインである。

どうやら多くのエンジニアはその対策としてLeetCodeなるサイトで対策を行うようだ。

早い話が本場でも行われているようなコーディングテストに耐えうるようなアルゴリズム力を鍛えるサイトであり、海外のテックカンパニーでのキャリアを積みたい方にとっては避けては通れない道である。

と、仰々しく書いてみましたが、私は今のところそういった面接を受ける予定はありません。

ただ、ITエンジニアとして人並みのアルゴリズム力くらいは持っておいた方がいいだろうということで不定期に問題を解いてその時に考えたやり方をメモ的に書いていこうかと思います。

[Leetcode](https://leetcode.com/)

Python3で解いています。

[ゼロから始めるLeetCode 目次](https://qiita.com/KueharX/items/6ee2502c3b620c795b70)

前回
[ゼロから始めるLeetCode Day97 「349. Intersection of Two Arrays」](https://qiita.com/KueharX/items/a8cc7831fc430e9340ca)

[Twitter](https://twitter.com/kueharx)やってます。

**[技術ブログ](https://kueharx.blogspot.com/)始めました！！**
技術はLeetCode、Django、Nuxt、あたりについて書くと思います。**こちらの方が更新は早いので**、よければブクマよろしくお願いいたします！


## お知らせ
Day 100でQiitaでの投稿はひとまず区切りを付けようかと思います。
タグの記事が僕の記事ばかりになってしまうのもいかがなものかと思いましたし、他に有益な情報を提供している方の邪魔になってしまうこともあると考えたので、こうすることにしました。
至らない部分は多々ありましたが、今までお付き合い頂きありがとうございました。

問題を解いて記事を書く、というのは上記の個人ブログで続けるつもりですし、興味ある方はたまにそちらを覗いていただけると嬉しいです。
Twitterの方のアカウントはほとんど更新通知用と化しているので、Leetcodeを解く記事について気になる方はそちらも合わせてフォローいただくと良いかもしれません。

# 問題
[39. Combination Sum](https://leetcode.com/problems/combination-sum/)
難易度はMedium。
[コーディング面接対策のために解きたいLeetCode 60問](https://1kohei1.com/leetcode/)からの抜粋です。

問題としては、候補番号（候補）（重複なし）と目標番号（目標）の集合が与えられたとき、候補番号の和が目標になるような、候補の中のすべてのユニークな組み合わせを求めなさい、というものです。
なお、同じ繰り返し数は何度でもいいとします。

>Example 1:

>Input: candidates = [2,3,6,7], target = 7,
A solution set is:
[
  [7],
  [2,2,3]
]

>Example 2:

>Input: candidates = [2,3,5], target = 8,
A solution set is:
[
  [2,2,2,2],
  [2,3,3],
  [3,5]
]

# 解法
```python
class Solution:
    def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]:
        ans = []
        def dfs(cur,left,num):
            if left == 0:
                ans.append(cur+[])
                return
            for i in range(num,len(candidates)):
                if left-candidates[i] >= 0:
                    cur.append(candidates[i])
                    dfs(cur,left-candidates[i],i)
                    cur.pop()
        dfs([],target,0)
        return ans
# Runtime: 84 ms, faster than 63.61% of Python3 online submissions for Combination Sum.
# Memory Usage: 14.1 MB, less than 11.55% of Python3 online submissions for Combination Sum.
```

[ゼロから始めるLeetCode Day96 「78. Subsets」](https://qiita.com/KueharX/items/59c73080910983893a46)と似た内容になっています。
`dfs`を実装し、長さ分リストを回す、というものです。

こちらも再帰的な書き方ではなくdfsを実装し、それを呼び出すだけで`ans`に値が代入されるようになっています。

では今回はここまで。お疲れ様でした。
ゼロから始めるLeetCode Day97 「349. Intersection of Two Arrays」

# 概要

海外ではエンジニアの面接においてコーディングテストというものが行われるらしく、多くの場合、特定の関数やクラスをお題に沿って実装するという物がメインである。

どうやら多くのエンジニアはその対策としてLeetCodeなるサイトで対策を行うようだ。

早い話が本場でも行われているようなコーディングテストに耐えうるようなアルゴリズム力を鍛えるサイトであり、海外のテックカンパニーでのキャリアを積みたい方にとっては避けては通れない道である。

と、仰々しく書いてみましたが、私は今のところそういった面接を受ける予定はありません。

ただ、ITエンジニアとして人並みのアルゴリズム力くらいは持っておいた方がいいだろうということで不定期に問題を解いてその時に考えたやり方をメモ的に書いていこうかと思います。

[Leetcode](https://leetcode.com/)

Python3で解いています。

[ゼロから始めるLeetCode 目次](https://qiita.com/KueharX/items/6ee2502c3b620c795b70)

前回
[ゼロから始めるLeetCode Day96 「78. Subsets」](https://qiita.com/KueharX/items/59c73080910983893a46)

[Twitter](https://twitter.com/kueharx)やってます。

**[技術ブログ](https://kueharx.blogspot.com/)始めました！！**
技術はLeetCode、Django、Nuxt、あたりについて書くと思います。**こちらの方が更新は早いので**、よければブクマよろしくお願いいたします！


## お知らせ
Day 100でQiitaでの投稿はひとまず区切りを付けようかと思います。
タグの記事が僕の記事ばかりになってしまうのもいかがなものかと思いましたし、他に有益な情報を提供している方の邪魔になってしまうこともあると考えたので、こうすることにしました。
至らない部分は多々ありましたが、今までお付き合い頂きありがとうございました。

問題を解いて記事を書く、というのは上記の個人ブログで続けるつもりですし、興味ある方はたまにそちらを覗いていただけると嬉しいです。
Twitterの方のアカウントはほとんど更新通知用と化しているので、Leetcodeを解く記事について気になる方はそちらも合わせてフォローいただくと良いかもしれません。

# 問題
[349. Intersection of Two Arrays](https://leetcode.com/problems/intersection-of-two-arrays/)
難易度はEasy。
[コーディング面接対策のために解きたいLeetCode 60問](https://1kohei1.com/leetcode/)からの抜粋です。

問題としては、2つの配列が与えられたとき，その交点を計算する関数を書いてくださいというものです。

>Example 1:
Input: nums1 = [1,2,2,1], nums2 = [2,2]
Output: [2]

>Example 2:
Input: nums1 = [4,9,5], nums2 = [9,4,9,8,4]
Output: [9,4]


# 解法

```python
class Solution:
    def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:
        set1,set2 = set(nums1),set(nums2)
        return list(set1&set2)
# Runtime: 56 ms, faster than 44.78% of Python3 online submissions for Intersection of Two Arrays.
# Memory Usage: 13.8 MB, less than 87.75% of Python3 online submissions for Intersection of Two Arrays.
```

`set`を使って与えられたリストの中から一意な値を取り出し、組み込み関数の`list`で返すだけです。
思ったより簡単にかけて拍子抜けしましたが、最初の方はこういった問題でも手間取っていた気がするので組み込み関数などについての知識がついたのかなと思います。

では今回ここまで。お疲れ様でした。
ゼロから始めるLeetCode Day96 「78. Subsets」

# 概要

海外ではエンジニアの面接においてコーディングテストというものが行われるらしく、多くの場合、特定の関数やクラスをお題に沿って実装するという物がメインである。

どうやら多くのエンジニアはその対策としてLeetCodeなるサイトで対策を行うようだ。

早い話が本場でも行われているようなコーディングテストに耐えうるようなアルゴリズム力を鍛えるサイトであり、海外のテックカンパニーでのキャリアを積みたい方にとっては避けては通れない道である。

と、仰々しく書いてみましたが、私は今のところそういった面接を受ける予定はありません。

ただ、ITエンジニアとして人並みのアルゴリズム力くらいは持っておいた方がいいだろうということで不定期に問題を解いてその時に考えたやり方をメモ的に書いていこうかと思います。

[Leetcode](https://leetcode.com/)

Python3で解いています。

[ゼロから始めるLeetCode 目次](https://qiita.com/KueharX/items/6ee2502c3b620c795b70)

前回
[ゼロから始めるLeetCode Day95「82. Remove Duplicates from Sorted List II」](https://qiita.com/KueharX/items/860d1c227ddb8cba0a61)

[Twitter](https://twitter.com/kueharx)やってます。

**[技術ブログ](https://kueharx.blogspot.com/)始めました！！**
技術はLeetCode、Django、Nuxt、あたりについて書くと思います。**こちらの方が更新は早いので**、よければブクマよろしくお願いいたします！


## お知らせ
Day 100でQiitaでの投稿はひとまず区切りを付けようかと思います。
タグの記事が僕の記事ばかりになってしまうのもいかがなものかと思いましたし、他に有益な情報を提供している方の邪魔になってしまうこともあると考えたので、こうすることにしました。
至らない部分は多々ありましたが、今までお付き合い頂きありがとうございました。

問題を解いて記事を書く、というのは上記の個人ブログで続けるつもりですし、興味ある方はたまにそちらを覗いていただけると嬉しいです。
Twitterの方のアカウントはほとんど更新通知用と化しているので、Leetcodeを解く記事について気になる方はそちらも合わせてフォローいただくと良いかもしれません。

# 問題
[78. Subsets](https://leetcode.com/problems/subsets/)
難易度はMedium。
[コーディング面接対策のために解きたいLeetCode 60問](https://1kohei1.com/leetcode/)からの抜粋です。

問題としては、異なる整数の集合`nums`が与えられます。
その中の可能なすべての部分集合を返します。
なお、解の集合には重複した部分集合を含んではいけません。

>Example:

>Input: nums = [1,2,3]
Output:
[
  [3],
  [1],
  [2],
  [1,2,3],
  [1,3],
  [2,3],
  [1,2],
  []
]

# 解法
```python
class Solution:
    def subsets(self, nums: List[int]) -> List[List[int]]:
        ans = []
        def dfs(temp,end):
            ans.append(temp+[])
            if len(nums) == len(temp):
                return
            for i in nums:
                if i > end:
                    temp.append(i)
                    dfs(temp,i)
                    temp.pop()
        dfs([],float(-inf))
        return ans
# Runtime: 32 ms, faster than 86.56% of Python3 online submissions for Subsets.
# Memory Usage: 13.8 MB, less than 90.09% of Python3 online submissions for Subsets.
```

`dfs`を実装して解くという方法を取りました。
再帰で解くか迷いましたが個人的にこちらの方が書きやすそうだったのでこちらの方法で書きました。

集合、と効くと前々回のsetなども考えられると思いましたが、こうした全てを列挙する場合はこちらの方が読みやすいかと思います。

比較的目新しいこともないのでこの辺りにしておこうかと思います。
では今回はここまで。お疲れ様でした。