OmniAICreator/Qiita-1.07M huggingface dataset:
BeautifulSoup のエラー "Couldn't find a tree builder" の原因と対処法

# 問題
Python 3 で BeautifulSoup 4 を呼び出すとき

```python
soup = BeautifulSoup(html, "lxml")
```

以下のエラーが発生することがあります。

```
Couldn't find a tree builder with the features you requested: lxml. Do you need to install a parser library?
```


# 原因 1: パーサーをインストールしていない
参照 : [Installing a parser - Beautiful Soup 4.4.0 Documentation](https://www.crummy.com/software/BeautifulSoup/bs4/doc/#installing-a-parser)

BeautifulSoup はパーサーとして `html.parser`, `lxml`, `html5lib` などをサポートしていますが、そのうち `html.parser` だけが標準で含まれています。 `lxml` などは BeautifulSoup の依存パッケージに含まれないので、別途インストールが必要です。


## 対処法
`lxml` パッケージをインストールする。

```shell
$ pip install lxml
```


# 原因 2: BeautifulSoup のバグ
```
<プロジェクトルート>
└───foo.py
└───lib
    └───bs4
    └───lxml
```

上記のようなディレクトリ構成で `foo.py` から BeautifulSoup を呼び出そうとすると、同様のエラーが発生します。これはデフォルトの `html.parser` を選択しても解決しないので、前述のケースとは異なります。

```python:foo.py
from lib.bs4 import BeautifulSoup

html = ...
soup = BeautifulSoup(html, "html.parser")
```



問題の元凶は [BeautifulSoup のソースコードのこの部分](https://github.com/waylan/beautifulsoup/blob/master/bs4/builder/__init__.py#L293-L294)です。

```python
def register_treebuilders_from(module):
    """Copy TreeBuilders from the given module into this module."""
    # I'm fairly sure this is not the best way to do this.
    this_module = sys.modules['bs4.builder']

    for name in module.__all__:
        obj = getattr(module, name) 

        if issubclass(obj, TreeBuilder):
            setattr(this_module, name, obj)
            this_module.__all__.append(name)
            # Register the builder while we're at it.
            this_module.builder_registry.register(obj)
```

`module` が持つパーサーを `this_module` へコピーしようとしているわけですが、モジュール名 `bs4.builder` をハードコードしているので、 `bs4` が `PYTHONPATH` に含まれない場合 `this_module` が空になります。

そのため、 [BeautifulSoup のコンストラクタで指定されたパーサーを探すとき](https://github.com/waylan/beautifulsoup/blob/master/bs4/__init__.py#L151)に、何も辞書に登録されておらずエラーが生じます。


## 対処法 1 (推奨)
`sys.path` に `bs4` を追加する。

```python:foo.py
import sys
sys.path.append("lib.bs4")
from bs4 import BeautifulSoup

html = ...
soup = BeautifulSoup(html, "html.parser")
```


## 対処法 2
プロジェクトルート直下に `bs4` と `lxml` を配置する。

```
<プロジェクトルート>
└───foo.py
└───bs4
└───lxml
```


## ダメな方法
`BeautifulSoup` コンストラクタの引数 `builder` にパーサーを直接渡す。

```python:foo.py
from lib.bs4 import BeautifulSoup
from lib.bs4.builder._lxml import LXMLTreeBuilder

html = ...
soup = BeautifulSoup(html, builder=LXMLTreeBuilder)
```

この方法を使うと、[パーサーの名前で辞書を検索する処理](https://github.com/waylan/beautifulsoup/blob/master/bs4/__init__.py#L145-L166)がスキップされるので、無事 `BeautifulSoup` のインスタンスが作成されます。

しかし、実際にこれを `soup.css("...")` などで使おうとするとまた別のエラーが発生します。

```
TypeError: Expected a BeautifulSoup 'Tag', but instead recieved type <class 'lib.bs4.BeautifulSoup'>
```

`bs4.BeautifulSoup` は `bs4.Tag` のサブクラスなので問題は無さそうに見えますが、このケースでは `lib.bs4.BeautifulSoup` という名前でインポートされているため別物と判断されてしまいます。
[React Native]iOSアプリ作りに苦労した話

## 気ままに書くだけで中身がないかも

仕事の関係で短期間でiOSアプリを作ろう！となりました。

その時点での私の経験スキルは以下のような具合

・C#,.Net framework,SQL Server,MVC(社会人3.5年目)

若干端折ったけど、サーバー寄りの人間でありクライアントサイドはほとんどできないです。(htmlをちょこっと直したり、jQueryはなんとなくで触れる程度)

## 技術選定時の話

？？？「モバイルアプリを作りたい！iOS,Android両方に向けて！」

→swiftとJavaとかそれぞれで作るか、React Nativeで一つにまとめて作るかということになりどうするか、となりました。ただでさえ「人が少ない」＆「その少ないメンバーはswiftもJavaもReact Nativeも経験がない」&「時間がない」という状態だったのでまだ学習コストが低そうなReact Nativeの方に決定しました。

### 実際に作り始める段階になって

結局期間足りなすぎるから一旦はiOSだけに向けて作ろうぜ、ってなったのでiOS向けのアプリを作り始めます。

クライアント実装者が二人(私＋もう一人)だけど私のスキルが足りなさすぎて色々と厳しい。今になっては割となんとかなってきた気がするけど改めて反省した点は以下

・研修でもやるんだった。
・知見者に対してもっと積極的に聞くべき。
・なんだかんだReactNative漬け状態で400時間くらいやったらなんとかなる。

### みんなに伝えたいこと

技術的なことをドヤ顏で(?)書けるほどは理解できていないので3〜4年目くらい(大卒で25歳前後)の社会人に向けて改めて私が感じたことでも。あくまで**個人の見解**ですが。

**※こういう学習の仕方もオススメだよというのがあれば教えてください。**

・くだらないプライドなんか捨てろ。
　1、2年目のプログラマーに比べると当然何かしら書けるようになってくる。(私の場合は上述の通りC#)
  けど当然やったことがない言語だと苦労する。私は変なプライドが働いてなかなか人に聞かずに独力で頑張ろうとしてとても辛い思いをした。
　「聞くは1時の恥、聞かぬは一生の恥」とはよく言ったもので。そもそもこれくらいの年次で技術的にわからないことを聞くのはなんも恥でもない。

・英語を読め。
 ReactNativeのような比較的新しい(※個人の感想)技術だと日本語の記事などはまだまだ少ないです。
 中国語の記事とかはさすがにスルーするにしても英語の記事はどんどん読もう。みんな大好きstack overflowとかね。
 そして英語の記事を読むためにも検索ワードを英語にしていこう。英文作成力が身に付く(気がする。)

・検索でヒットしたサイトの中身のレベルを早めに読み解け。
 ReactNativeは現行でver0.59であり、高頻度で更新が行われます。また、xcodeにしてもUI等含めて定期的に更新が行われます。
 検索してヒットした内容が古いものだと記載内容と現行verで内容が異なることが多々あります。
 記事の投稿日付で確認できると割と楽ですが、そうでない場合には流し読みをして信頼度がどの程度なのか判断できないと時間がいくらあっても足りなくなります。特に職業プログラマーの場合時間は無限じゃないので。(私の今回の重大な反省点)

## 最後に

全然技術内容を伝えてないけど結構苦労して、けども実力がついたなと自信を持って言える案件だった(まだ終わってないけど)から何かしら書きたかった。自己満足です。終わり。
Chromeで日本語と英語原文を切り替えるショートカットキー

Chromeで日本語と原文を切り替えるショートカットキーを作りました。
※ [Keyboard Maestro](https://www.keyboardmaestro.com/main/)を使います。 (有料ですが30日で無料で試せます。)

こんなかんじでサクサク切り替えできます。
![190629.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11520/cc401c38-b558-39f5-6dd1-960b358914fb.gif)


# 作った経緯
- 英語のドキュメントを読むときにchromeの「日本語に翻訳」でページ全体を翻訳して読むことが多い。
- 翻訳が微妙な場合は原文も読まないと意味がわからないので、アイコンをクリックして「原文のページを表示」をクリックして切り替えていたが、すごくめんどくさかった。(作ったショートカットキーでは、この作業をMacro使って自動化している）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11520/99015955-a960-e8c3-6c4f-17b1c7d0f8f8.png)
- サクッと切り替えたいが、いいショートカットキーやChromeの拡張などが見つからなかった。

# ショートカットキーの作り方

## 1. システム環境設定 > キーボード > すべてのコントロール に設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11520/22aa5986-bd20-4130-2132-db264fcae10a.png)

Catalinaの場合は 「コントロール間のフォーカス移動をキーボードで操作」

## 2. [Keyboard Maestro](https://www.keyboardmaestro.com/main/) を インストールしてMacroを設定する

Chromeでのみ有効になるようにグループを作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11520/1f432324-0483-dafc-d4a8-51f5557c67fa.png)

Macro作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11520/588f9692-1813-79c1-377a-63367a6454de.png)


※ Chrome バージョン: 118.0.5993.117（Official Build） （arm64） で確認済み

上記の設定では「ctrl+ j」 を切り替えのショートカットとして登録しています。
お好みで別のものを設定してください。

Keyboard Maestro はデフォルトでMacroがいくつか設定されています。使わないやつは 「✓」をクリックしてOFFにしておいてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11520/45049f06-b423-fc05-23e0-596523cd7b24.png)




## 3. 動作確認

英語で書かれたページにアクセスしてChromeの「日本語に翻訳」を実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11520/2707e0c6-2c12-d69c-598a-1257a7e118d9.png)

URLの右のところにこのアイコンが出ていることを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11520/a0ed4cb9-973c-5b69-65a9-a63cabd7f1a2.png)

「ctrl+ j」のショートカットキーを実行
![190629.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11520/cc401c38-b558-39f5-6dd1-960b358914fb.gif)


# おまけ
 [BetterTouchTool](https://folivora.ai/) で「3本指でタップ」したときに「crtl+j」が実行されるようにすると、スクロールして原文と日本語を切り替えながら読んでいくことがトラックパッドだけで出来るので、片手でサクサク読めてとても楽です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11520/7c08bae0-8bee-66e5-06a7-8a2c2303ed5c.png)
Apple標準リマインダーアプリで、期限の項目が増えたタスクができてしまったとき

##概略
通常タスクは以下のように表示されますが、    
<img width="335" alt="スクリーンショット 2019-06-29 15.00.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314588/8ac66f1d-5a09-aa59-f8df-0adf561ade0d.png">

このように期限の項目が増える場合があります。
<img width="333" alt="スクリーンショット 2019-06-29 14.26.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314588/98dc5346-8920-ba17-3a69-34a8243519e2.png">

iOSでも同様な表現で同期されます。
通常`通知設定の日付`のときに通知とともに赤く表示されるようになりますが、この異常の場合`通知設定の日付`、`期限`のときに通知され、表示される時間、赤く表示されるタイミングは`期限`の値が使われます。
これは仕様ではなくバグで、正当な方法で期限を設定することはできません。  

[ここ](https://apple.stackexchange.com/questions/225130/disable-reminders-due-date?newreg=6a5973764b9a4ba5b40dcee0665333d7)の記事が詳しいです。

##再現方法
macOSにて、ネットワークアクティビティインジケータが処理中のときにタスクを操作する。

##原因
旧来のiCloudで使われていた期限(Due)の項目が削除されたにも関わらず、バグで復活している。

##対処方法
`通知設定の日付`の値を、`期限`の値と一致させる。
【Python】タグを含むXML文書からテキストだけ抽出する

## 概要
下のようなXML文書の場合，単純にテキストを抽出することはできない．

```python:ダメな例
node = etree.fromstring("""
<content>
    Text outside tag <div>Text <em>inside</em> tag</div>
</content>
""")

print(node.text)

>> Text outside tag  # content直下のテキストしか取得できない．
```

あらかじめXMLの構造が決まってたら普通に要素ごとに`find()`すればいいけど，文書内にランダムにタグが出現する場合は困る．

## 解決策
これ．

> https://stackoverflow.com/questions/4624062/get-all-text-inside-a-tag-in-lxml

ただし，リンク先の一番上の`stringify_children()`は正確ではないので，`node.itertext()`を使いましょう．

```python:OKな例
node = etree.fromstring("""
<content>
    Text outside tag <div>Text <em>inside</em> tag</div>
</content>
""")

print(''.join(node.itertext()))

>>      Text outside tag Text inside tag 
```

### おまけ

両端にスペースが入ってる場合を考慮して，

```python:OKな例2
print(''.join(node.itertext()).strip())

>> Text outside tag Text inside tag  
```
とする方が安全．
Google Tag Managerに関する備忘メモ

# Google Tag Manager
- Googleが提供してるツールの1つで、HTMLやコンバージョンタグの管理をする事ができる
- 同じタグを管理するツールとして、**Yahoo!タグマネージャー**などがある
    - 違いは、主に対応してるタグテンプレート数

## タグ
- 何を計測するのか、を設定する
- 「何を」
    - **HTMLタグ**や、**コンバージョンタグ**など

## トリガー
- どの画面（URL）にどんな条件で計測するのか、を設定する
- 「どの画面」
    - URLで **hoge.com/aaa** など
- 「どんな条件」
    - hoge.comと **部分一致** するURLの場合や、hoge.com/aaaと **完全一致** するURLの場合など

#### タグは「モノ」トリガーは「時」を設定するイメージ

## 参考
- [Googleタグマネージャとは？初心者でも分かる利用方法と導入手順](https://ferret-plus.com/1745)
- [タグとは? HTMLタグ・コンバージョンタグ・ツール用タグの違いを解説!](https://wacul-ai.com/blog/access-analysis/access-analysis-basic/what-is-tag/)
- [Googleタグマネージャー（GTM）｜設置・設定方法と使い方](https://service.plan-b.co.jp/blog/ad/6336/)
Railsのログ出力と設定

# アプリケーションログの出力先

開発時にターミナルでRailsサーバを起動していると、ターミナルにアプリケーションログが出力されます。このアプリケーションはlog/development.rbにも出力されています。これはdevelopment環境でサーバを動かしているからです。production環境で動かしていればlog/production.logに、test環境で動かしていればlog/test.logに出力されます。

# 自分でログを出力する

Railsが自動的に出力するログ以外にも、自分でコントローラやモデルなどからログを出力することができます。ログ出力は、Railsが用意指定るloggerオブジェクトを通じて行います。

例えば、デバックようにタスク作成時に、保存したタスクの情報をログ出力させたい場合、以下のようにします。

```ruby:tasks_controller.rb
def create
  if @task.save
    logger.debug "task: #{@task.attributes.inspect}"
  end
end
```

これで、loggerオブジェクトのdebugメソッドを呼び、ログにタスクの情報をdebugレベルで出力するという指定をしています。
ターミナルとlog/development.logに`task: ~`のログが出力されています。

# ログレベル

|ログレベル(数字)|ログレベル|意味|
|---           |---     |---|
|5             |unknown |原因不明のエラー|
|4             |fatal   |エラーハンドリング不可能な致命的エラー|
|3             |error   |エラーハンドリング不可能なエラー|
|2             |warn    |警告|
|1             |info    |通知|
|0             |debug   |開発者向けデバッグ用詳細情報|

各メソッド呼び出し例

```
logger.unknown '不明なエラー'
logger.fatal '致命的なエラー'
logger.error 'エラー'
logger.warn '警告'
logger.info 'お知らせ'
logger.debug 'デバック
```

# ログレベルの設定

ログレベルの設定は、（development環境の場合）config/environments/development.rbに`config.log_level = :warn`（設定したログレベルをシンボルで）を追記します。
こうするとwarn以上のログのみを出力することができます。config/environments配下の各環境に合わせて設定しましょう。

# アプリケーションログの特定のパラメータ値をマスクする

アプリケーションログには、コントローラで渡ってきたパラメータなども出力されます。パラメータにパスワードやカード番号など、セキュアな情報が含まれる場合、意図せずに出力されてしまう可能性があります。ログに出力したくないパラメータをconfig/initializers/filter_parameter_logging.rbの`Rails.application.config.filter_parameters`に設定すると、特定のパラメータの値を隠してログ出力することができます。この設定にはデフォルトでpasswordが設定されています。

```ruby:config/initializers/filter_parameter_logging.rb
Rails.application.config.filter_parameters += [:password]
```

ここで指定されたパラメータの値は、ログ上では[FILTERD]と出力されるようになります。

# アプリケーション内共通で使いたいログの設定

ロガーの設定は、config/developments配下の環境ごとに設定します。development環境のログを設定するには、config/environments/development.rbに以下のように追記します。

```rb:config/environments/development.rb
  config.logger = Logger.new('log/development.log', 'daily')
```

これで、log/development.rbに、１日ごとにログを取ることができます（過去のログは、log/development.log.yyyymmddというファイル名になります）dailyをweeklyにすると週ごと、monthlyにすると月ごとにログローテーションすることができます。用途に合わせてログファイルを分けたい場合など、さらにロガーの設定を追記します。

```rb:config/environments/development.rb
  config.logger = Logger.new('log/development.log', 'daily')
  config.custom_logger = Logger.new('log/custom.log', 'weekly')
```
CentOS 7 ネットワーク設定の自分用まとめ 

VirtualBox上のCentOS 7で設定を参照・変更する機会が多くなったので自分用メモ。

## 確認
##### デバイスの状況確認
nmcli d
```
DEVICE  TYPE      STATE     CONNECTION
enp0s3  ethernet  接続済み  enp0s3
lo      loopback  管理無し  --
```

##### インターフェースの状況確認
nmcli d show enp0s3
```
GENERAL.DEVICE:                         enp0s3
GENERAL.TYPE:                           ethernet
...
```

## 接続
##### デバイス追加
nmcli c add type ethernet ifname enp0s3 con-name enp0s3
##### 自動接続を有効にする
nmcli c m enp0s3 connection.autoconnect yes
##### インターフェースダウン
nmcli connection down enp0s3
##### インターフェースアップ
nmcli connection up enp0s3
##### インターフェースダウンアップ（設定反映
nmcli connection down enp0s3; nmcli connection up enp0s3

## 設定
##### DHCP
nmcli c modify eth0 ipv4.method auto
##### 手動設定
nmcli c modify eth0 ipv4.method manual
##### IPアドレス
nmcli c mod enp0s3 ipv4.addresses 10.0.2.1/24
第3オクテッドは最初に作ったVMから、2、3、4・・・となる模様。
##### デフォルトゲートウェイ
nmcli c mod enp0s3 ipv4.gateway 10.0.2.2
第4オクテッドは2っぽい。
##### DNS
nmcli c mod enp0s3 ipv4.dns 8.8.8.8
SQLのエイリアスの付け方って迷う。

SQL書くとき、テーブル名に別名（エイリアス）を付けます。
付けると、ツール次第ですが、カラム名を自動保管してくれます。

だ、け、ど、別名って人によってつけかたが、まちまち。。

# SQLの別名（エイリアス）
## T＋連番
ある現場で、書いている人を見かけてから、個人的に好きで使っています。
賛否両論あるので、自分だけ使うSQLの時だけ使います。

```
SELECT 
  t1.test_col1
 ,t2.test_col2
FROM 
 example_trn1 t1
 INNER JOIN example_trn2 t2
 ON t1.test_id = t2.test_id
```
良いな～って思った所が、迷わないこと。
エイリアスどうしよう～って迷う必要が無い。

あとは、エイリアスの自動保管も使えるので、SQLを書くスピードは上がります。
難点として、エイリアスが連番なので、どのテーブルのカラムなのか、分かりづらい。

## テーブル名の略称
現場でよく見かける書き方です。
賛否両論の否が少ない書き方かな。

```
SELECT 
  ex1.test_col1
 ,ex2.test_col2
FROM 
 example_trn1 ex1
 INNER JOIN example_trn2 ex2
 ON ex1.test_id = ex2.test_id
```
良いところが、無難。
どのテーブルのカラムか、多少は理解しやすい。
で、エイリアスの恩恵もある。

## アルファベット一文字 の 順番
最近、現場で書いている人を見ていて、
あ～そういう書き方もあるのか～って思いました。

```
SELECT 
  a.test_col1
 ,b.test_col2
FROM 
 example_trn1 a
 INNER JOIN example_trn2 b
 ON a.test_id = b.test_id
```
本質的には、T + 連番と同じ考えかと。
T + 連番より一文字で表せるから、ちょっと惹かれます。

# 結論
私の最近の流行りは、「T + 連番」 だったけど、「アルファベット一文字の順番」のほうが
より簡略的で惹かれています。

やはり、シンプルイズベスト。でも、可読性も忘れちゃいけない。
アプリをApp Store Connectにアップロードしようとしたら『ITMS-90783』というエラーが出た

#はじめに
バージョンアップのためアプリをリリースしようと思い、アプリをApp Store Connectにアップロードしようとしたところ  

***ERROR ITMS-90783: "Missing bundle display name. The Info.plist key CFBundleDisplayName is missing or has an empty value in the bundle with bundle identifier '○○○○○○'."*** 
というエラーが発生しました。
原因はエラー文そのまんまですが、先日までは特に問題が無かった上に調べてもあまり検索で引っかからないエラーコードだったので記事に残そうかと思い立ちました。


# 結論
エラー分そのまんまの意味で**"Bundle display name"が無いか空になっているよ！**と怒られているだけなので
info.plistに "Bundle display name" を追加するだけで解決しました。

# "Bundle display name"の追加方法
1. info.plistの適当な項目にカーソルを当てたら出てくる+ボタンを押す
<img width="870" alt="スクリーンショット 2019-06-29 16.12.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246750/d2c788f2-f0a4-bc2e-862e-ba6386fb8195.png">

2. Bundle display nameを選択する ("B"を打った時点で出てくるはず)
<img width="870" alt="スクリーンショット 2019-06-29 16.11.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246750/380d41fd-0ed6-a191-47f1-8f17211822dc.png">

3. Valueに任意の文字列を入れる
プロジェクト名と同様で構わない場合は`$(PRODUCT_NAME)`を入れます
<img width="868" alt="スクリーンショット 2019-06-29 16.14.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246750/f3e06b45-d454-ecad-3c77-e4c888ca2657.png">


以上で対応完了でアップロードが可能になっているはずです:smile:

# まとめ
前まで特に問題が無かったアプリで発生した事とエラーコードをggってみると、
redditとStack Overflowでつい最近同様の問題が発生している方がいたので投稿させてもらいました！  
しかしなぜ今回突然発生したのかまでの理由が分からずじまいに。:frowning2:
原因がはっきりと判明次第追記しようかなとも思っています〜
【Git】.vsファイルが原因でVisualStudioでCommitなどができない時の対処法

#なぜかGitにファイルがアップできない
何気なくVisualStudio2019でCommitしようとしたらできませんでした。
![e5fcd8b69cf972b239317e79b7931f3d.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/361263/fb3b949a-b59c-9875-6f38-8d9d9c5a7ee9.png)

:thinking:

.vs以下のdb.lockというファイルが悪さをしている様子。
調べてみると.vsフォルダ自体がvisualStudioで操作した時の情報が含まれているだけらしいので、
別にGitに投げる必要はなさそうです。
ということで**このファイルを.vsフォルダごとCommitなどする際に除外する**ことにしました。

#.gitignoreを作成して除外する
やり方はgitの機能である.gitignoreを使用します。
ここで指定したフォルダやファイルはgitのアップ対象外となります。
.gitignoreの詳細は @anqooqieさんの [こちら](https://qiita.com/anqooqie/items/110957797b3d5280c44f)を参照

#テキストでファイルを作成してリネームする

##リネームするファイルの準備
何かのツールを使わない限りWindowsでは拡張子だけのファイルを作成することはできません。
今回は「テキストファイルで適当に作成→コマンドプロントを作ってリネーム」します。

* プロジェクトを作成し、.slnがあるところに適当なテキストファイルを作成する
* 中に「**.vs/**」と記述

これで.vsファイルを排除する準備が整いました。

##コマンドプロントでリネーム
私はコマンドプロントを触らず育ってきた人間なので、若干忌避感がありますがサクッとファイルをリネームします。

* コマンドプロントを開く
* ren ***（テキストファイルのパス）*** .ignore

と入力すれば作業終了です。
テキストファイルのパスは「テキストファイルをShift+右クリック」→「パスのコピー」で簡単にできます。
Ctrl+Vはできず、「ren 」→パスのコピーをした状態で右クリック（貼り付けできる）→「 .gitignore」
という流れになります。※スペースをお忘れなく

#コマンドプロントめんどくさいよね
https://github.com/ameoji/UtilityFiles
にファイル上げてあるので、ダウンロードして突っ込んでください

#後記
コマンドプロント使いこなしている人まじでかっこいいと思います。
[Java] コンパイルエラーと実行時エラーの分類メモ

コンパイルエラーになるケースと実行時エラーになるケースの分類。


# コンパイルエラーになるケース

## ラムダ式の型の不一致

```java
BiFunction<Integer, Double, Integer> function = (x, y) -> x + y;
function.apply(1, 2.5);
```
``` (int)(x + y) ``` もしくは、 ``` BiFunction<Integer, Double, Double> ``` に修正する必要がある。


# 実行時になるケース

## FileInputStreamでreset()を呼び出し

FileInputStreamはreset()を呼び出せるがサポートはしていない。子クラスのBufferedInputStreamでサポートされる。

```java

new FileInputStream("src/a/a.txt").reset();
//=> java.io.IOException: mark/reset not supported
```

親クラスのInputStreamのreset()

```java
public synchronized void reset() throws IOException {
        throw new IOException("mark/reset not supported");
    }
```

子クラスのBufferedInputStreamのreset()

```java
public synchronized void reset() throws IOException {
        getBufIfOpen(); // Cause exception if closed
        if (markpos < 0)
            throw new IOException("Resetting to invalid mark");
        pos = markpos;
    }
```
Dropbox上の画像ファイルをimgタグに指定する

## Dropbox上に画像ファイルを置いてWEBページ上で表示するには？
以前書いたDropbox APIで共有リンクを発行する記事（[PHP編](https://qiita.com/tksnino/items/c39b509494cc7f05954a)・[Python編](https://qiita.com/tksnino/items/ee624221d3da00c89005)）の続編というか小ネタです。

共有リンクを発行したとき、以下のようなURLが生成されます。
`https://www.dropbox.com/s/********?dl=0`

このパラメータを`dl=0`から`raw=1`に変えてやると直接表示モードになり、画像ファイルであればimgタグのsrcに指定することができるようになります。

## 共有リンクパラメータまとめ
##### ・デフォルト
`https://www.dropbox.com/s/********?dl=0` …ファイル
`https://www.dropbox.com/sh/********?dl=0` … フォルダ
アクセスすると、Dropboxのプレビューページに遷移します。

##### ・直接ダウンロード
**dl=1**にする
`https://www.dropbox.com/s/********?dl=1` …ファイル
`https://www.dropbox.com/sh/********?dl=1` … フォルダ
アクセスすると、ダウンロードが開始されます。（フォルダの場合、zipダウンロード）

##### ・直接表示
**raw=1**にする
`https://www.dropbox.com/s/********?raw=1` …ファイル
※フォルダの場合は、zipダウンロードになります。
kelpnetの作法 その3

# 概要

kelpnetの作法を調べてみた。
unityで、やってみた。
sinやってみた。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/be4dc3b6-c4de-7a53-26eb-57074ff5c519.png)



# サンプルコード

```
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using KelpNet;
using System;
using System.Linq;

public class hello : MonoBehaviour
{
    private int theta;
    private int count;
    private LineRenderer lr;
    void Start()
    {

        theta = 0;
        count = 0;
        lr = gameObject.GetComponent<LineRenderer>();
        lr.SetWidth(0.1f, 0.1f);
        lr.SetVertexCount(2);
        lr.SetPosition(0, Vector3.zero);
        lr.SetPosition(1, new Vector3(1f, 1f, 0f));

        const int EPOCH = 1000;
        const int N = 50;
        Real[][] trainData = new Real[N][];
        Real[][] trainLabel = new Real[N][];
        for (int i = 0; i < N; i++)
        {
            Real radian = -Math.PI + Math.PI * 2.0 * i / (N - 1);
            trainData[i] = new[] { radian };
            trainLabel[i] = new Real[] { Math.Sin(radian) };
        }
        FunctionStack nn = new FunctionStack(new Linear(1, 4, name: "l1 Linear"), new TanhActivation(name: "l1 Tanh"), new Linear(4, 1, name: "l2 Linear"));
        nn.SetOptimizer(new SGD(0.1));
        for (int i = 0; i < EPOCH; i++)
        {
            Real loss = 0;
            for (int j = 0; j < N; j++)
            {
                loss += Trainer.Train(nn, trainData[j], trainLabel[j], new MeanSquaredError());
            }
            if (i % (EPOCH / 10) == 0)
            {
                Debug.Log("loss:" + loss / N);
            }
        }
        for (count = 1; count < N; count++)
        {
            Console.WriteLine(trainData[count] + ":" + nn.Predict(trainData[count])[0].Data[0]);
            lr.SetVertexCount(count);
            lr.SetPosition(count - 1, new Vector3(-25 + count, 20 * nn.Predict(trainData[count])[0].Data[0], 0));
        }
    }
    void Update()
    {
    }
}

```

# 環境

windows7
unity　2019.3.0a7
kelpnet 1.0.0.0

以上
array_filterのコールバック関数を使用する

# array_filter

>コールバック関数を使用して、配列の要素をフィルタリングする
引用元：https://www.php.net/manual/ja/function.array-filter.php

- 第三引数の**flag**を指定しない場合、第一引数に指定された配列の**value**をコールバック関数で使用する

## コールバック関数
- 関数を引数として受け取れる関数を呼ぶ
- 参考
    - https://www.php.net/manual/ja/language.types.callable.php
    - https://www.atmarkit.co.jp/ait/articles/1710/11/news012_2.html

### サンプルコード1

- **flg**を指定しない場合

```php
// 金額情報をもつ連想配列を定義する
$prices = [
    'priceA' => 100,
    'priceB' => 200,
    'priceC' => 300,
    'priceD' => 400,
    'priceE' => 500,
];

// 300円以上の値を取得する
$result = array_filter($prices, function($price) {
    return $price >= 300;
});
```

### 出力結果

```
[
	'priceC' => (int) 300,
	'priceD' => (int) 400,
	'priceE' => (int) 500
]
```

### サンプルコード2

- **flg**に**ARRAY_FILTER_USE_KEY**を指定した場合

```php
// 金額情報をもつ連想配列を定義する
$prices = [
    'priceA' => 100,
    'priceB' => 200,
    'priceC' => 300,
    'priceD' => 400,
    'priceE' => 500,
];

// $pricesのkeyと"priceC"という文字列が一致する値を取得する
$result = array_filter(
    $prices,
    function($price) {
        return $price == 'priceC';
    },
    ARRAY_FILTER_USE_KEY
);
```

### 出力結果

```
[
	'priceC' => (int) 300
]
```

### サンプルコード3

- **flg**に**ARRAY_FILTER_USE_BOTH**を指定した場合
    - array_filterの第二引数に指定するコールバック関数の第一引数は、array_filterの第一引数（$prices）の値を参照する
    - そのため、第二引数のコールバック関数に指定している引数の名前は、第一引数を**$value**とし、第二引数を**$key**とした

```php
// 金額情報をもつ連想配列を定義する
$prices = [
    'priceA' => 100,
    'priceB' => 200,
    'priceC' => 300,
    'priceD' => 400,
    'priceE' => 500,
];

// $pricesのkeyと"priceD"という文字列が一致し、かつ、valueの値が400の値を取得する
$result = array_filter(
    $prices,
    function($value, $key) {
        return $key == 'priceD' && $value == 400;
    },
    ARRAY_FILTER_USE_BOTH
);
```

### 出力結果

```
[
	'priceD' => (int) 400
]
```
Alembicとは？

# Alembicとは？

[SQLAlchemy](https://www.sqlalchemy.org)の製作者によって作成されたデータベースマイグレーションツール

## 基本的な機能
* データベースにALTER命令を出してテーブルの構造を変更することができる
* マイグレーションスクリプトを提供する
    * マイグレーションスクリプトによって、データベースをで新しいバージョンにアップグレードできる
    * アップグレードの操作を逆に行うことで、ダウングレードすることもできる

## 参考
[公式github](https://github.com/sqlalchemy/alembic)
mysqlパスワード変更時のphpmyadminへパスワード反映

# 事象
mysqlのrootパスワード変えたらphpmyadminにアクセスできなくなりました。
(当然なんですが。。。)

# エラーメッセージ
```
MySQL のメッセージ: 
接続できません。設定が無効です。  

 mysqli_real_connect(): (HY000/1045): Access denied for user 'root'@'localhost' (using password: NO)  

 MySQL サーバに接続しようとしましたが拒否されました。config.inc.php のホスト、ユーザ名、パスワードが MySQL サーバの管理者から与えられた情報と一致するか確認してください。
```

# 対処法
記載あるようにconfig.inc.phpに変更したパスワードを記載します。

```php:phpmyadmin/config.inc.php
/* Authentication type and info */
$cfg['Servers'][$i]['auth_type'] = 'config';
$cfg['Servers'][$i]['user'] = 'root';
$cfg['Servers'][$i]['password'] = 'NewPassword'; // ここに新しいパスワードを記載
$cfg['Servers'][$i]['extension'] = 'mysqli';
$cfg['Servers'][$i]['AllowNoPassword'] = true;
```
Google Cloud Platformで、特定の国をブロックするルールを追加するスクリプトを作りました

タイトルオンリーですが。

ことの発端は、下記の情報です。
https://qiita.com/riku-shiru/items/a870edd9dc0b132e092c#comment-766ec1b2f29f358320a6

GCPをなるべく無料に近い料金で運用するには、特定の国からのアクセスをブロックする必要があります。
これをやる方法を検索すると、一個一個ちまちまと設定を行っている方が多く見受けられました。

> 「そんな時間は無ぁい！！（紙をまき散らしながら叫ぶ）」

というわけで、作りました。

https://github.com/kazto/google-cloud-create-firewall

使い方は、リポジトリをクローンなりダウンロードなりして、スクリプトを実行するだけです。
何かしらのお役に立てば幸いです。
XAMPP/mysqlのroot password忘れたときにしたこと

# 概要
記載の通りです。
よくパスワード忘れるんですよね。。。

# 環境
|ソフト |バージョン |
|---|---|
|OS|Windows 10|
|XAMPP  |3.2.2  |
|mysql  |15.1  |

# やり方
## 1. mysqldをセーフモードで起動  
`mysqld --skip-grant-tables
`
--skip-grant-tablesオプションにより、設定したプラグイン情報をロードしないで呼び出すことができるとのこと。  
ちなみに、mysqldはmysqlのデーモンです。

## 2.mysqlにログイン
`mysql -u root mysql`

## 3.パスワードの更新
```mysql> update user set password=password("変更するパスワード") where user='root'; 
mysql> commit; 
```

## 4.mysqlの再起動
`mysqld restart`
あるいは、XAMPPのコントロールパネルより再起動する。

# おわり
以上です。パスワードはできるだけ忘れないようにしたいものです。。

参考文献
https://dev.mysql.com/doc/refman/5.6/ja/server-options.html
家計簿管理システム midas を作ってみた


# システムを作ろうとした理由

一番の理由は、今までエクセルで管理していたので記帳できる端末が限られていたことである。エクセルが入っている PC でないと記帳できない。
二番目は、自分で何かしらのシステムを作ってみたかったからである。今回の家計簿管理システムは、サーバーサイドからフロントサイドまで必要となる。これらを一人で構築してみたかった。

# 使用した技術やもの

- サーバー機材: RaspberryPi3
- API: Go
- フロント: Elm
- DB: MySQL 5.5

# 家計簿で管理したいこと

一文でいうと下記の通り。
「どういう種別のものをいくらでどの予算でいつどこから出したのか」

例1)
昼食という種別の900円ラーメンを、食費の予算で 2019/6/28 に財布からだした。

例2)
水道代という種別の3000円の水道代を、光熱費の予算で 2019/5/24 に〇〇銀行から引き落とされた

# テーブルの説明

balance テーブルだけ説明する(他はマスタテーブルなので特に説明するほどでもない)。

balance
- balance_id: 主キー(auto_increment)
- amount: 使用した金額(もちろん支出がマイナスである)
- item: 使った項目の名前
- kind_id: 項目の種別
- purpose_id: 予算の場所
- place_id: お金を出した場所

上の例だと下記の通り入る。
例1
- amount: -900
- item: ラーメン
- kind_id: 2(昼食)
- purpose_id: 5(食費)
- place_id: 1(財布)

例2
- amount: -3000
- item: 水道代
- kind_id: 9(水道代)
- purpose_id: 9(光熱費)
- place_id: 8(〇〇銀行)

balance テーブルやその他テーブルの DDL は下記に置いてある。
https://github.com/firedial/midas/tree/master/db

# 移動処理

予算や場所の移動も balance テーブルを2レコード使うことで実現できる。

例3) 〇〇銀行から5000兆円を引き落として財布にいれる

1レコード目
- amount: -5000000000000000
- item: 場所移動元
- kind_id: 14(移動)
- purpose_id: 12(移動)
- place_id: 8(〇〇銀行)

2レコード目
- amount: 5000000000000000
- item: 場所移動先
- kind_id: 14(移動)
- purpose_id: 12(移動)
- place_id: 1(財布)

※ amount は 32bit なので実際に入れるとオーバーフローとなります(正確にいうと signed なので 31 bit)
※ なので5000兆円を僕に渡さないでください。管理できなくなります

# API サーバー

触ってみたかったので Go 言語を使うことにした。
今回実装したのは下記の機能
- balance テーブルの情報を取得
- balance テーブルに登録
- kind, purpose, place テーブルの情報を取得
- 予算と場所移動の処理
- 集計機能(気が向いたら記事にします)

ソース: https://github.com/firedial/midas-go

# フロント

こっちも使ってみたかった Elm を採用。関数型言語である。
最低限の機能だけ装備。

ソース: https://github.com/firedial/midas-elm

# 最後に

家計簿管理システム化の計画は2018年からあって、ようやく2019年4月1日に運用にのせることができた。その1年間で採用予定だった Haskell と Rails の勉強もしていた。なぜ採用されなかったのかはまた別記事にしようと思う。
あと、まだまだ開発中の部分があるので、今後の開発も楽しみである。

以上拙い文章でしたが、今後ともよろしくお願いします。
[PHP] Dropbox API でファイルアップロード

# ファイルアップロード編
以前、[PHP curlでDropboxからファイル情報を取得する記事](https://qiita.com/tksnino/items/c39b509494cc7f05954a)を書きましたが、今度はアップロード編です。

例によって[Dropbox API Explorer](https://dropbox.github.io/dropbox-api-v2-explorer/)でパラメータなどを確認していきます。
ファイル情報取得とは異なり、ヘッダに`Dropbox-API-Arg`をもたせる必要があると。

使うのは以下です。

- [files/upload](https://www.dropbox.com/developers/documentation/http/documentation#files-upload)

ファイルデータを渡す書き方に迷いましたが、以下を参考にさせてもらいました。
[PHPのcURLを使用してDropboxを活用する方法](https://reffect.co.jp/php/handle_dropbox_by_curl#DropBox)
`fread`でPOSTしてやる形です。

【追記】アクセストークン取得・ネームスペースID取得については、[前回の記事](https://qiita.com/tksnino/items/c39b509494cc7f05954a)をご覧ください。

```php:ファイルアップロード.php
/**
 * $filepath アップロードするファイルのパス
 * $folder Dropbox上のアップロード先フォルダ名
 */
function uploadFile($filepath, $folder)
{
	$url = "https://content.dropboxapi.com/2/files/upload";

	$ch = curl_init();

	$basename = basename($filepath);
	$headers = array(
		'Authorization: Bearer ' . $this->access_token, //取得したアクセストークン
		'Dropbox-API-Path-Root: {".tag": "root", "root": "' . $this->root_namespace_id . '"}', //チームフォルダへアクセスする場合
		'Content-Type: application/octet-stream',
		'Dropbox-API-Arg: {"path":"/' . $folder . '/' . $basename . '", "mode":{".tag":"overwrite"}}', //上書きモード
	);

	$fp = fopen($filepath, "rb");
	$size = filesize($filepath);

	$options = array(
		CURLOPT_URL => $url,
		CURLOPT_HTTPHEADER => $headers,
		CURLOPT_POST => true,
		CURLOPT_POSTFIELDS => fread($fp, $size),
		CURLOPT_RETURNTRANSFER => true,
	);

	curl_setopt_array($ch, $options);

	$res = curl_exec($ch);
	$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);

	if (!curl_errno($ch) && $http_code == "200") {
		print_r("SUCCESS: File Uploaded." . PHP_EOL);
	} else {
		print_r("ERROR: Failed to access DropBox via API" . PHP_EOL);
		print_r(curl_error($ch) . PHP_EOL);
	}

	fclose($fp);
	curl_close($ch);
}
```
matplotlibで散布図 のアニメーションを作る

前回の投稿[Pythonで実数値遺伝的アルゴリズムの性能を評価してみる](https://qiita.com/SwitchBlade/items/8f07b78f3922607a7ca3)の副産物で、matplotlibで散布図のアニメーションを作るときの情報があまりなかったのでまとめてみました。

#実装
``` scatter.py
import numpy as np
from matplotlib import pyplot as plt
import matplotlib.animation as animation

#軸の最小値、最大値
dRange = [0.0 , 1.0]

if __name__ == "__main__":
    #グラフ 散布図
    fig_scatter = plt.figure()
    plt_scatter = []

    # 実行
    for count  in  range(30):
        #グラフ 散布図
        x_1 = []
        x_2 = []
        for n in range(50):
            x_1.append(np.random.rand())
            x_2.append(np.random.rand())
            
        x_scatter = plt.scatter(x_1, x_2 , c="blue")
        
        x_scatter_red  = plt.scatter(np.random.rand(), 
                                     np.random.rand(),
                                     c="red",
                                     marker="*",
                                     s=200)
        # タイトルテキスト
        title = plt.text((dRange[0]+dRange[1]) /2 , dRange[1], 
                         'Count={:d}'.format(count),
                         ha='center', va='bottom',fontsize='large')

        plt_scatter.append([x_scatter,x_scatter_red,title])

    
    #散布図
    # アニメーション作成
    plt.xlim(dRange[0],dRange[1])
    plt.ylim(dRange[0],dRange[1])
    plt.grid(True)
    
    ani = animation.ArtistAnimation(fig_scatter, plt_scatter, interval=500)
    
    # 保存
    ani.save('sample.gif', writer="imagemagick")
    
    #表示
    #plt.show()
```

#出力結果
![sample.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438288/9e747d77-6bec-55f0-2f01-8c8711afacf4.gif)


#説明
`plt.scatter()`で散布図のプロットを指定します。複数プロット表示する場合は、x軸とy軸それぞれの配列を渡します。

```.py
        for n in range(50):
            x_1.append(np.random.rand())
            x_2.append(np.random.rand())
            
        x_scatter = plt.scatter(x_1, x_2 , c="blue")
```

特定のプロットだけ、色・形・大きさを変えたい場合は、別途散布図のプロットを作成します。cで色を、markerで形を、sで大きさを指定できます。

```
        x_scatter_red  = plt.scatter(np.random.rand(), 
                                     np.random.rand(),
                                     c="red",
                                     marker="*",
                                     s=200)
```

動的なタイトルを付けたい場合は、`plt.text()`を使います。第1、第2引数で座標を指定しますが、画像の左上からの絶対座標ではなく、プロットの軸上の座標になります。よって、各軸の最小値・最大値動的に変わる場合は、あらかじめ最小値、最大値を決めておいて、後で`plt.xlim()`と`plt.ylim()`で指定する必要があります。そうしないと、タイトルの位置がいろんなとこに飛びます。

```.py
        title = plt.text((dRange[0]+dRange[1]) /2 , dRange[1], 
                         'Count={:d}'.format(count),
                         ha='center', va='bottom',fontsize='large')
```

`plt_scatter.append()`で、表示させたい内容を、配列形式で追加します。

```.py
        plt_scatter.append([x_scatter,x_scatter_red,title])
```

アニメーションGIFを保存したい場合は、以下のようにします。
表示したい場合は、'ani.save()'の部分を`plt.show()`に変更すれば、いいはずですが、現状ColaboratoryやSpyderではうまく表示できませんでした。

```.py
    ani = animation.ArtistAnimation(fig_scatter, plt_scatter, interval=500)
    
    # 保存
    ani.save('sample.gif', writer="imagemagick")
```



#参考
[matplotlib でアニメーションを作る](https://qiita.com/yubais/items/c95ba9ff1b23dd33fde2)
【Rails】基本操作

###railsアプリの作成

```
rails new heroku_app 
#アプリ名はなんでも良いです
```

###Gemfileでsqliteの記述を変更
sqliteはバージョンを指定しないとエラーになる

```
gem 'sqlite3', '~> 1.3.6'
```

###controllerの作成


```
$ rails generate controller user
```
*userは任意

```作成物.
      create  app/controllers/top_controller.rb
      invoke  erb
      create    app/views/top
      invoke  test_unit
      create    test/controllers/top_controller_test.rb
      invoke  helper
      create    app/helpers/top_helper.rb
      invoke    test_unit
      invoke  assets
      invoke    coffee
      create      app/assets/javascripts/top.coffee
      invoke    scss
      create      app/assets/stylesheets/top.scss
```


###scaffold (コントローラ、モデル、ビュー、テーブル、等をまとめて生成）

####--1.コマンド実行

```
rails generate scaffold review name:string email:string twitter:string shop_url:string point:integer comment:string biko:string
```


####--2.マイグレーション

```
rake db:migrate
```

####---3.実行する
```
rails server
```


#####外部リンク

▼scaffoldの仕組みを丁寧に解説▼
http://mugenup-tech.hatenadiary.com/entry/2014/09/02/102859

▼form_forの仕組みを解説▼
https://qiita.com/Momozono/items/319bc503e6a5f0963ab9

▼【Rails】入力されたデータをポストする
https://qiita.com/Hal_mai/items/18fcf239d715ab6790b0
Githubが先か？フレームワークが先か？

# あらすじ

CLI は大抵の場合、プロジェクトフォルダごと作ってしまいます。
しかしプロジェクトフォルダを作ってからフォルダ指定で CLI を動かすこともできるのです。

自分がいろんなフレームワークのチュートリアルをやったときの話です。
Git単体やフレームワーク単体での取り扱いはウェブサイトや書籍でよく見かけます。
ところが、両方連携してどう扱うのかという話ってなかなか見かけません。

コマンドでプロジェクト生成終わった後に Git 使う場合どうするんだ？
ってとても大変だったので、まだ気が付いてない人はぜひ早めに気が付いて欲しいです。

# どっちが先がいいのか？

- CLI でフォルダ作成＆各種ファイル生成→`git init`で Github アドレス指定
- Github でプロジェクト作成→`git clone`→CLIで各種ファイル生成

状況に応じて好きなほうを選べたらいいと思います。

# フレームワークごとに比較

フレームワークによっては、先にフォルダがあると作成できずエラーメッセージが帰ってきます。
`mysite`が既に存在すると怒るのに、`.`は常に存在するのに怒られません。謎です。

| フレームワーク名 | カレントフォルダにフォルダ作成＆構築 | カレントフォルダに構築
|:--:|:--:|:--:
|Django|django-admin startproject mysite |django-admin startproject .
|Angular|ng new my-app|ng new .
|React|npx create-react-app my-app|npx create-react-app .
|Vue|vue create my-project|vue create .


# 『.』に気が付けるか？

この`.`が結構厄介で、これが使えることに触れているドキュメントが少ないです。
そのうえ書籍を参考にしてたりすると印刷ミスか汚れと勘違いしたりします。
自分はこれに気が付かず、遠回りをしてしまいました。

最後には [Sails.js](https://sailsjs.com/) のチュートリアルに書かれていて気が付くことができて、
「お？これは他のフレームワークでも利用できるのでは？」と得意げでした。

中には`.`がカレントディレクトリだと常に意識している人がいたりして、
ぱっと閃くのかもしれません。普段からCUIに慣れているとお手の物なのでしょうか。

# オススメの手順

個人的にはgithubのサイト上でプロジェクト作成してから、
緑のボタン「clone or download」で「Open in Desktop」するのがお気に入りです。
以下のツールを持ってると連携が楽なのでお勧めです。

- [github desktop](https://desktop.github.com/)
- [vscode](https://code.visualstudio.com/)

githubサイト上で「Open in Desktop」すると、
自動で「github desktop」が起動します。
その画面上でcloneボタンを押すと、
次の瞬間には「open in VS code」と書かれたボタンが出現します。
そして、Vscode内のターミナルでフレームワークのCLIコマンドを実行します。

**Excelsior!**
機械学習の回帰問題を分類問題に変えて解く

最近初めて知った機械学習に関する手法をお伝えいたします。
それは回帰問題を分類問題として解くというものです。

通常、連続値を予測したい場合は回帰問題として扱います。
しかしビニング処理を行うことにより、分類問題として解くこともできるようになります。

ビニング処理とは、連続値を境界値によって幅を持った離散値に変換することです。
例えば様々な年齢を10代、20代、30代といったように幅を持たせて分割することができます。

ピンポイントで年齢を予測したいのではなく、大まかな年代を予測したい場合などに便利です。

今回は具体例を有名なボストン住宅価格データセットで試しに実行してみました。

住宅価格の値をピンポイントに予測するのではなく、価格帯を予測しています。

プログラムと実行結果はjupyter notebook形式でgithubでも公開しています。

https://github.com/lystahi/qiita/blob/master/boston_regression_classification.ipynb

```python

import numpy as np
import pandas as pd
from sklearn.datasets import load_boston
from sklearn.ensemble import RandomForestRegressor, RandomForestClassifier
from sklearn.svm import SVR, SVC
from sklearn.model_selection import train_test_split
%matplotlib inline

boston_dataset = load_boston()
df = pd.DataFrame(boston_dataset.data, columns=boston_dataset.feature_names)
df.head()

df['MEDV'] = boston_dataset.target
df.info()

df.isnull().sum().sum()

df.describe()

X = df.drop(columns='MEDV')
y = df['MEDV']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42)
rfr = RandomForestRegressor()
rfr.fit(X_train, y_train)
rfr.score(X_train, y_train)

svr = SVR()
svr.fit(X_train, y_train)
svr.score(X_train, y_train)

df['MEDV'].describe()

df['MEDV'].plot.hist()

bins = np.arange(0, 70, 10)
bins
labels = np.arange(10, 61, 10)
labels
df['MEDV_CAP'] = pd.cut(df['MEDV'], bins=bins, labels=labels)
df[['MEDV','MEDV_CAP']]
X = df.drop(columns=['MEDV', 'MEDV_CAP'])
y = df['MEDV_CAP']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42)
rfc = RandomForestClassifier()
rfc.fit(X_train, y_train)
rfc.score(X_train, y_train)

svc = SVC()
svc.fit(X_train, y_train)
svc.score(X_train, y_train)
```

予測する値を変えているので、回帰と分類を純粋に比較することはできませんが、今回、RandomForestClassifierでは0.988、SVCでは0.994という高い精度を出すことができました。

何かおかしな点やアドバイス等がございましたらコメントいただけますと幸いです。
Binary Searchを用いた整数探索の実例

# Binary Searchとは
ある範囲の中にある、ある数を、中間値で範囲を限定しながら探索するアルゴリズムです。
今回はその実例をお見せしますのでご覧ください:relaxed:

# 実例
1から8まで整数があります。
その中から今回は7を探索します。($T=7$とします。)
`1, 2, 3, 4, 5, 6, 7(T), 8`
ステップ数を$i$(0始まり)
最初の数をS, 最後の数をE、その中間値（切り下げ)を$g_i$とすると
**$i = 0: $**
$\ S = 1$
$\ E = 8$
$\ g_0 = floor(\frac{S+E}{2}) = 4$

つまり、
**$i=0$の結果**
`1(S), 2, 3, 4(g), 5, 6, 7(T), 8 (E)`
$g_i$とTを比較し、**もし一致していればそこで終了。今回は一致していないので続行します。**

**$i=1: $**
$g_i < TならS = g_i$
$g_i > TならE = g_i$
と新しくおきます。
今回は$g_0 = 4 < T$ = 7なので
新しく$S = 4$になります。
新しい$g_1$は
$g_1 = floor(\frac{S+E}{2}) = floor(\frac{4+8}{2}) = 6$
よって
**$i=1$の結果**
`4(S), 5, 6(g), 7(T), 8 (E)`
$g_1 = 6 \neq T = 7$なので続行。

**$i=2: $**
$g_0 = 6 < T$ = 7なので$S = g_1 = 6$
$g_2 = floor(\frac{S+E}{2}) = 7$
**$i = 2$の結果**
`6(S), 7(g, T), 8 (E)`
$g_2 = T = 7$より、無事探索終了です！

# まとめ
今回は3回で探索が終わりました。

私は、これは8個の整数の中からbinary searchを使って探索する際の最大ステップ数になると考えております。
ざっくりと説明すると、探索数の最大値は$O(log_2N)$なるからだと思っております。
なぜならば、一回探索するたびに、探索範囲が大体半分ずつ削れていくからです。（各ステップのグレーの部分をご覧ください。)

厳密な説明は他所にお譲りします。
引数の存在意義

## 引数（ひきすう）とは
メソッド（def〜end）の外で定義している変数を、メソッド内で使えるようにする為の解決策


```ruby:メソッド内
def test(name)
puts name
end
```
```ruby:メソッド外
name= "uchizumi"
test(name)
```

今回の場合、 「uchizumi」 がメソッド内 「name」 に代入される
PHPエラー種類と原因

### 表題の通り、エラーの種類とその発生原因についてのまとめ。

# <font color="Red">Fatal error（致命的なエラー）</font>
重大なエラーを指す。
以下にもあるように、スクリプトも停止するので早急な対応を要する。

### スクリプトの処理実行状態

エラーを吐いて、処理を中断する。

## 考えられる原因

- 関数の二重定義
- 未定義関数の呼び出し

# <font color="Red">Parse error（構文エラー）</font>
大半はスペルミスが原因。
指摘されている行数が必ずしも直接の原因とは限らない。

### スクリプトの処理実行状態

エラーを吐いて、処理を中断する。

## 考えられる原因

- セミコロン忘れ
- 括弧の閉じ忘れ


# <font color="Red">Warning（警告）</font>
エラーではないのでエラーのように処理を停止するほど致命的ではない。
但し、おそらくコードの修正が必要ではなかろうかぐらいの警告。

### スクリプトの処理実行状態

処理は中断することなく最後まで実行される。

## 考えられる原因

- ファイル名の間違い
- ファイルが存在しない

# <font color="Red">Notice（注意）</font>
未定義の変数を表示しようとすると発生。
対策としてはisset等で中身を確認してからその変数を使用する等。

### スクリプトの処理実行状態

処理は中断することなく最後まで実行される。

## 考えられる原因

- 未定義変数の呼び出し
[Java]配列をListにする際のシャローコピーとディープコピー

既存の配列からListのオブジェクトを作る際には以下の２つの方法がある。
1. ```Arrays.asList(配列)``` を使う
2. ```ArrayList``` などのList実装クラスのコンストラクタを使う


``` Arrays.asList(配列) ```　を使う場合は、シャローコピーとなり参照を渡すだけ。
```ArrayList``` などのList実装クラスのコンストラクタを使う場合は、新規複製となる。


### Arrays.asList(配列)
シャローコピーとなり参照を渡すだけ。

```java
        // Arrays.asList()は参照を渡すだけ
        String[] ary = {"a", "b", "c"};
        List<String> list = Arrays.asList(ary);
        //  list.add("d"); // => java.lang.UnsupportedOperationException
        list.set(0, "e");
        System.out.println(Arrays.toString(ary)); //=> [e, b, c] オリジナルの配列も変更されている。
        System.out.println(list);                 //=> [e, b, c]
```

setでの要素の変更は可能だが、addなど既存の配列の構造を変更する場合はエラーになるので注意。

### List実装クラスのコンストラクタ
新規複製となる。

```java

        // ArrayListなどのListの実装クラスでインスタンス化すれば新規作成
        String[] ary2 = {"a", "b", "c"};
        List<String> list2 = new ArrayList<>(Arrays.asList(ary2));
        list2.add("d");
        list2.set(0, "e");
        System.out.println(Arrays.toString(ary2)); //=> [a, b, c]  オリジナルの配列は変更されない。
        System.out.println(list2);                 //=> [e, b, c, d]
```

new ArrayList<>(配列)はできないので、一度Listオブジェクトに変換する必要がある。
bitly APIを叩くshellscript

## bitlyとは
URLを圧縮してくれるサービスです。


## 手順

- bitlyアカウント作成

- token作成

- shellscript作成
- 実行



### bitlyアカウント作成



下記よりアカウント作成。

https://bitly.com/



### token作成

アカウント作成しログインを完了したら
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115687/a5915754-fc22-0091-a791-fd033fe8d7e1.png)


赤枠で囲った箇所を選択
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115687/2d8a3622-98e7-8866-b7c5-852af936cc51.png)


ユーザー情報が表示されている箇所を選択

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115687/e3fd32ac-f942-b7b4-3273-58caf4fcb158.png)


`Generic Access Token`を選択

![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115687/09a3893a-2b04-5d52-03e9-55513c3706de.png)


パスワードを入力し`GENERATE TOKEN`を選択します
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115687/fb4fb17d-a831-1a11-71a6-99de6b717595.png)


tokenが生成されるのでメモしておいてください



### shellscript作成

```
#test_shフォルダ作成
mkdir test_sh
#test_sh/に移動
cd test_sh/
#bit.sh作成
touch bit.sh
#パーミッション変更
chmod 755 bit.sh
```

エディターは何でもいいの `bit.sh` 編集します

```
vim bit.sh
```

bit.shのソース下記です。

```
#!/bin/sh
BASEURL="https://api-ssl.bitly.com/v3/shorten?access_token="
access_token="作成したtoken"
curl -i -X GET  $BASEURL$access_token"&longUrl="$1
```
 

### 実行

```
sh bit.sh https://codeworks.site/
```



### 実行結果

```
{"status_code":200,"status_txt":"OK","data":{"url":"http://bit.ly/2Yj4PHC","hash":"2Yj4PHC","global_hash":"2Yj4PY8","long_url":"https://codeworks.site/","new_hash":1}}
```

urlが圧縮されたものが生成されています。
Python仮想環境

仮想環境を作成するモジュールには Virtualenv と、venv があります。ここでは、Python3 の標準ライブラリである venv を取り上げます。

#仮想環境の作成
では、最初の仮想環境を作成しましょう。適当なディレクトリで、次のコマンドを実行します。

$ python3 -m venv ./py3env
このコマンドは、指定したディレクトリ ./py3env に仮想環境を作成します。

#仮想環境の切り替え
作成した仮想環境の bin/activate を実行します

$ . ./py3env/bin/activate
(py3env) $
コマンド プロンプトの先頭に (py3env) と表示され、仮想環境で実行中であることをを示します。

仮想環境に切り替えると、環境変数 PATH が設定され、python コマンドや python3 コマンドで仮想環境の bin ディレクトリから実行されるようになります。

通常の環境では、python コマンドを実行するとPython2.xが実行されますが、仮想環境中では、python コマンドでも python3 コマンドでも仮想環境を作成した Python を起動します。

(py3env) $ python
Python 3.6.1 (default, Apr  4 2017, 09:40:21)
[GCC 4.2.1 Compatible Apple LLVM 8.1.0 (clang-802.0.38)] on darwin
Type "help", "copyright", "credits" or "license" for more information

bin ディレクトリには pip などのコマンドもインストールされており、コマンドラインから実行できます。

#パッケージのインストール
仮想環境を利用中も、通常通り pip コマンドを使ってパッケージをインストールできます。

(py3env) $ pip install tse
Collecting tse
  Downloading tse-0.0.15.tar.gz
Collecting argparse (from tse)
  Downloading argparse-1.4.0-py2.py3-none-any.whl
Collecting six (from tse)
  Using cached six-1.10.0-py2.py3-none-any.whl
  …
インストールしたパッケージは、仮想環境内にのみ書き込まれ、元の Python や他の仮想環境からは利用できません。

#仮想環境の終了
仮想環境の使用を終え、通常の状態に復帰するときは、deactivate コマンドを実行します。

(py3env) $ deactivate
$

#バージョン別の仮想環境
複数のバージョンの Python をインストールしている環境では、使用する Python を指定して仮想環境を作成できます。

Python 3.6とPython 3.7がインストールされた環境で、Python 3.7の仮想環境を作成する場合は、次のように指定します。

$ python3.7 -m venv py37env
ここで作成した py37env を使用すると、python3.7 環境に切り替わります。

$ . py37env/bin/activate
(py37env) $ python
Python 3.7.2 (v3.7.2:9a3ffc0492, Dec 24 2018, 02:44:43)
[Clang 6.0 (clang-600.0.57)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
Angular Animationでrouterにはabsoluteをつける

<h3>
Angularのrouterに対してanimationをつけるときには、position: absluteを指定しないと
<h2>
translateなどが機能しない場合がある。
</h2>
</h3>
```
trigger('animation', [
        transition('documents => document', [
            query(':enter, :leave', [
                style({
                    position: 'absolute'
                })
            ]),
            query(':enter', [
                style({
                    opacity: '0'
                })
            ]),
            query(':leave', [
                style({
                    transform: 'translateX(-)',
                    transformOrigin: 'center'
                })
            ]),
            group([
                query(':leave', [
                    animate('500ms ease-out', style({
                        transform: 'scale(0, 0)',
                        transformOrigin: 'center'
                    }))
                ]),
                query(':enter', [
                    animate('500ms ease-out', style({
                        opacity: '1'
                    }))
                ])
            ]),
        ]),
        transition('document => documents', [
            query(':enter, :leave', [
                style({
                    position: 'absolute'
                })
            ]),
            query(':enter', [
                style({
                    opacity: '0'
                })
            ]),
            query(':leave', [
                style({
                    transform: 'scale(1, 1)',
                    transformOrigin: 'center'
                })
            ]),
            group([
                query(':leave', [
                    animate('500ms ease-out', style({
                        transform: 'scale(0, 0)',
                        transformOrigin: 'center'
                    }))
                ]),
                query(':enter', [
                    animate('500ms ease-out', style({
                        opacity: '1'
                    }))
                ])
            ]),
        ])
    ]);
```
HISソースコードメトリクス

**編集中**

# HISソースコードメトリクスとは

ソフトウェアの品質を測るための指標となる仕様。
日本語訳を載せたいが、Synopsys社の下記ページにも記載があるように、仕様としての定義内容が雑に感じる。具体的には、どのような理由で各メトリックを測定するべきなのかの記載が無い。

[How is VOCF metric calculated](https://community.synopsys.com/s/article/How-is-VOCF-metric-calculated)
※「SOLUTION」を参照。

HISの仕様書には、各メトリックがQA-Cのどの項目に該当するか記載されている。QA-Cのマニュアルには各項目の測定方法の情報が記載されているので、そちらの方が参考になる。ただし、QA-Cの購入が必要となる。

もしくは、MathWorks社の以下のページでも、HISの各メトリックの情報が記載されている。こちらは無料でアカウントを作成することで、各メトリックの詳細のページを参照できる。

[メトリクスとソフトウェア品質目標との比較](https://jp.mathworks.com/help/bugfinder/ug/compare-metrics-against-software-quality-objectives.html)
※「HIS メトリクス」を参照。
kelpnetの作法 その２

# 概要

kelpnetの作法を調べてみた。
fizzbuzzやってみた。

# サンプルコード

```
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using KelpNet;

namespace ConsoleApp3
{
    class Program
    {
        const int EPOCH = 1000;
        const int N = 100;
        static void Main(string[] args)
        {
            Real[][] trainData = new Real[N][];
            Real[][] trainLabel = new Real[N][];
            for (int i = 0; i < N; i++)
            {
                int a = (i >> 6) % 2;
                int b = (i >> 5) % 2;
                int c = (i >> 4) % 2;
                int d = (i >> 3) % 2;
                int e = (i >> 2) % 2;
                int f = (i >> 1) % 2;
                int g = i % 2;
                trainData[i] = new[] { (Real)a, (Real)b, (Real)c, (Real)d, (Real)e, (Real)f, (Real)g  };
            }
            for (int i = 0; i < N; i++)
            {
                if (i % 15 == 0)
                {
                    trainLabel[i] = new Real[] { 3 };
                }
                else if (i % 5 == 0)
                {
                    trainLabel[i] = new Real[] { 2 };
                }
                else if (i % 3 == 0)
                {
                    trainLabel[i] = new Real[] { 1 };
                }
                else
                {
                    trainLabel[i] = new Real[] { 0 };
                }

            }
            FunctionStack nn = new FunctionStack(new Linear(7, 40, name: "l1 Linear"), new Sigmoid(name: "l1 Tanh"), new Linear(40, 4, name: "l2 Linear"));
            nn.SetOptimizer(new MomentumSGD());
            Console.WriteLine("Train Start...");
            for (int i = 0; i < EPOCH; i++)
            {
                Real loss = 0;
                for (int j = 0; j < N; j++)
                {
                    loss += Trainer.Train(nn, trainData[j], trainLabel[j], new SoftmaxCrossEntropy());
                }
                if (i % 100 == 0)
                {
                    Console.WriteLine("loss:" + loss / N);
                }
            }
            Console.WriteLine("Test Start...");
            for (int j = 0; j < N; j++)
            {
                NdArray result = nn.Predict(trainData[j])[0];
                int resultIndex = Array.IndexOf(result.Data, result.Data.Max());
                if (resultIndex == 3)
                {
                    Console.Write("fizzbuzz");
                }
                else if (resultIndex == 2)
                {
                    Console.Write("buzz");
                }
                else if (resultIndex == 1)
                {
                    Console.Write("fizz");
                }
                else
                {
                    Console.Write(j);
                }
                Console.Write(" ");
            }
            Console.WriteLine("Press any key to exit.");
            Console.ReadKey();
        }
    }
}



```

# 結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/c151ccf6-68a9-77c4-d29c-288a5a10c153.png)



以上。
【PyCharm】Python 3系を使っているのにPython version 2.7 doesn't have module pathlibと怒られる

## 原因
インスペクションのコード互換性の指定にPython2.7を指定しているため。

## 解決方法
環境設定>エディター>インスペクション>コード互換性インスペクション（英語版の場合はPreference>Editor>Inspections>Python>Code Compatibility inspection）のオプションにあるバージョン指定から2.7のチェックを外す。あるいはコード互換性インスペクション自体のチェックを外す。
3.7系のコード互換性チェックを残したいなら前者。そもそもコード互換性チェックは不要であれば後者。

![Pycharm コード互換性.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431401/bbbc30bd-432b-8860-cbdd-f2f44abecf85.png)

## 参考
https://intellij-support.jetbrains.com/hc/en-us/community/posts/360000027564-pyCharm-writes-python-version-2-7-doesn-t-have-module-pathlib-while-project-interpreter-is-set-to-3-5-2-mac-os-high-sierra-