OmniAICreator/Qiita-1.07M huggingface dataset:
MeCab の結果を Pandas DataFrame として得る

近年の自然言語処理といえば SentencePiece でバラして BERT にドーン！らしいが (？)、品詞情報を用いた素朴な自然言語処理ではいまだに MeCab などの従来の形態素解析器は便利なものである。

その MeCab について、形態素解析した結果を Pandas の DataFrame として得たいと思ったものの意外と面倒臭かったので、ここにメモしておく。

前提として、MeCab と mecab-python は入っているものとする。
また、辞書は ipadic 形式のものを用いる前提。(この例では mecab-ipadic-NEologd を利用している)

``` python
import MeCab
import pandas as pd

class CustomMeCabTagger(MeCab.Tagger):

    COLUMNS = ['表層形', '品詞', '品詞細分類1', '品詞細分類2', '品詞細分類3', '活用型', '活用形', '原形', '読み', '発音']

    def parseToDataFrame(self, text: str) -> pd.DataFrame:
        """テキストを parse した結果を Pandas DataFrame として返す"""
        results = []
        for line in self.parse(text).split('\n'):
            if line == 'EOS':
                break
            surface, feature = line.split('\t')
            feature = [None if f == '*' else f for f in feature.split(',')]
            results.append([surface, *feature])
        return pd.DataFrame(results, columns=type(self).COLUMNS)
```

まずこういう `MeCab.Tagger` を継承したクラスを作っておいて、使うときはこうじゃ。

``` python
tagger = CustomMeCabTagger()
tagger.parseToDataFrame('メロスは激怒した。')
```

|  | 表層形 | 品詞 | 品詞細分類1 | 品詞細分類2 | 品詞細分類3 | 活用型 | 活用形 | 原形 | 読み | 発音 |
|--:|:--|:--|:--|:--|:--|:--|:--|:--|:--|:--|
| 0 | メロス | 名詞 | 一般 | None | None | None | None | None | None | None |
| 1 | は | 助詞 | 係助詞 | None | None | None | None | は | ハ | ワ |
| 2 | 激怒 | 名詞 | サ変接続 | None | None | None | None | 激怒 | ゲキド | ゲキド |
| 3 | し | 動詞 | 自立 | None | None | サ変・スル | 連用形 | する | シ | シ |
| 4 | た | 助動詞 | None | None | None | 特殊・タ | 基本形 | た | タ | タ |
| 5 | 。 | 記号 | 句点 | None | None | None | None | 。 | 。 | 。 |

めでたしめでたし。

注意点としては、あらゆる環境でこれが動くことは確認していない。
もし「こういうケースでバグる」などあったらコメントに書いて欲しい。

## 参考
- [MeCab辞書について \| Yuta Hayashibe](https://hayashibe.jp/tr/mecab/dictionary/)
    - カラム名の参考にした
- [PythonでのMeCabを速くするtips \- Qiita](https://qiita.com/yukinoi/items/81a707c1317c97f5fdf9)
    - `parseToNode` は遅いらしいので `parse` を使うことにした
    - この記事のように並列処理を実装してみてもいいかもしれない
PaloaltoとFotiGateのログ分析における注意点

UTM市場で市場展開が盛んな2つのベンダーのUTM製品においてログ分析を行う際、注意するべきことがあるため記載します。
ログ分析の観点から結構インパクトがある内容であるため気をつけたほうがいいかもです。

# FortiGate
6.0.4以降及び6.2.0以降から記載される内容の考え方が大きく変わります。
以下は説明する上で出てくる単語と意味、key=value形式のkeyフィールド名

> - 送信元情報
>    - 送信元IP[srcip]
>    - 送信元インターフェース[srcintf]
>    - 送信元インターフェースロール[srcinfrole]
> - 宛先情報
>    - 宛先IP[dstip]
>    - 宛先インターフェース[dstintf]
>    - 宛先インターフェースロール[dstintfrole]
> - 方向情報
>    - 方向[Direction]
> - 悪意あるサーバー情報
>    - IP：a.a.a.a
>    - インターフェース：port1
>    - インターフェースロール:WAN
> - 攻撃を受ける端末の情報
>    - IP:b.b.b.b
>    - インターフェース:port2
>    - インターフェースロール:LAN
> - 検知情報
>    - ブラウザの脆弱性を狙う攻撃

## 〜6.0.4未満 or 6.0.0 〜 6.2.0未満
送信元情報及び宛先情報が【検知したパケットの流れた方向】となっていました。
また、方向情報はポリシーの書いている向きに対してどちらの方向で検知したか、となっていました。

```text:サンプルログ
... srcip="a.a.a.a" srcintf="port1" srcintfrole="wan" dstip="b.b.b.b" dstintf="port2" dstintfrole="lan" direction="incoming" ...
```

## 6.0.5〜 or 6.2.0〜
送信元情報及び宛先情報は【セッション情報に基づいた】記述となります。いわゆるトラフィックログと同じ記述のされ方になります。
また、方向情報は相変わらず同じでポリシーの書いている向きに対して・・・・となります。
(むしろポリシーの向きとトラフィックの向きがアンマッチって基本ない気がします。)

```text:サンプルログ
... srcip="b.b.b.b" srcintf="port2" srcintfrole="lan" dstip="a.a.a.a" dstintf="port1" dstintfrole="wan" direction="incoming" ...
```
### 参考情報
**Fortinet Document Library**
**New Features / Logging - Session versus Attack Direction**
> https://docs.fortinet.com/document/fortigate/6.2.0/new-features/199570/logging-session-versus-attack-direction

**Reddit**
**Log message reference - direction=**
> https://www.reddit.com/r/fortinet/comments/ay93d9/log_message_reference_direction/

## Paloalto

## PAN-OS 〜v8.0
送信元情報及び宛先情報が【検知したパケットの流れた方向】となっていました。

## PAN-OS v8.1〜
送信元情報及び宛先情報は【セッション情報に基づいた】記述となります。いわゆるトラフィックログと同じ記述のされ方になります。
また、方向情報は相変わらず同じでポリシーの書いている向きに対して・・・・となります。

### 参考情報
**Paloalto Customer Support**
**THREAT LOGS SHOW INVERTED/REVERSED DIRECTION FOR SOURCE AND DESTINATION IP ADDRESSES**
> https://knowledgebase.paloaltonetworks.com/KCSArticleDetail?id=kA10g000000Cm1UCAS&lang=en_US
【備忘録】PHPのforeachについて考えてみる

#目的
・foreachについて理解を深める
・foreachについての間違った知識をただす

#foreachを使用したコードの比較

```ruby:例１
<?php
$arr = array(1, 2, 3, 4);
foreach ($arr as &$value) {
    $value = $value * 2;
}
var_dump($arr);
?>
```

```ruby:例１の出力
array(4) { [0]=> int(2) [1]=> int(4) [2]=> int(6) [3]=> &int(8) }
```

foreachしたら、配列の要素を１個ずつ取り出すことができるっていうイメージしかなかったから、***$arrの値が更新される概念が全然なかった。なんなら$arrは空と思ってた***


```ruby:例２
<?php
$arr = array(1, 2, 3, 4);
foreach ($arr as &$value) {
    $value = $value * 2;
}

var_dump($arr);
var_dump($value);
?>
```

```ruby:例２の出力
array(4) { [0]=> int(2) [1]=> int(4) [2]=> int(6) [3]=> &int(8) } int(8)
```
foreachのループ処理で使用した$valueを出力すると、$arr[3]を出力している。***ループ終了後は、最後の要素を参照している見たい***

```ruby:例3
<?php
$arr = array(1, 2, 3, 4);
foreach ($arr as &$value) {
    $value = $value * 2;
}

unset($value);
var_dump($arr);
var_dump($value);
?>
```

```ruby:例３の出力
array(4) { [0]=> int(2) [1]=> int(4) [2]=> int(6) [3]=> int(8) } NULL
```

***foreachループ終了後に、最後の要素を参照していた$valueをunset関数で囲むと、NULLになる***


#まとめ
***・foreachは、要素の数の分だけループ処理する***
***・foreachは、要素を１個ずつ取り出すイメージではなく、要素を１個ずつ参照しているイメージ***
***・foreach内でループ処理の受け皿になっていた変数は、最後の要素を参照する***
AWS Resource Access Manager でリソース作成時に「The resource you are attempting to share ~ 」というエラーが出た場合の対処法

AWS RAMでリソースを作成する時に次のようなエラーが出た場合は、``組織内での共有を有効にする``という設定をONにすれば解消されるみたいです。


>The resource you are attempting to share can only be shared within your AWS Organization. This error may also occur if you have not enabled sharing with your AWS organization, or that onboarding process is still in progress.

設定方法は以下のドキュメントによると2つあるそうです。

[Sharing Your Resources - AWS Resource Access Manager](https://docs.aws.amazon.com/ja_jp/ram/latest/userguide/getting-started-sharing.html)

#### 1.　コンソールで設定

以下のページで``組織内での共有を有効にする``をONにできるそうです。
https://console.aws.amazon.com/ram/home#Settings

#### 2.　コマンドラインで設定

以下の AWS CLI コマンドで設定できるそうです。

```terminal:terminal
aws ram enable-sharing-with-aws-organization
```
ページネーションを爆速で実装する！！[5分]

#はじめに
今回はgem'kaminari'を使ってページネーションを爆速実装していきます:hotdog::hotdog:

#ページネーション
ページネーションとは長い文章を複数のページに分割して、各ページへのリンクを並べアクセスしやすくすることです。
![001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501638/b33691f8-2bb2-54f6-f1a9-321303a238c1.png)
これですね。データの数が多くなるとよそうされる時に使用しましょう！！

#'kaminari'の導入

```ruby:Gemfile
gem 'kaminari'
```
```ruby:ターミナル
bundle install
```

#インスタンス変数の定義

```ruby:Users_controller.rb
  def index
    @users = User.order("created_at DESC").page(params[:page]).per(5)
  end
```
ページネーションを表示したいコントローラーのアクションで定義する。

per(5)にすれば５つで１ページ、per(10)にすれば10つで１ページになります。

#Viewページ

```ruby:Users/index.html.erb
<%= paginate(@users) %>
```

表示したいところにこの記述を挿入するだけ。
めちゃめちゃかんたんですね、、、

<img width="1431" alt="スクリーンショット 2019-10-15 21.12.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501638/156385f5-dadd-050d-bbf8-1aeabebb5b40.png">
こんな感じ。bootstrapを使えば簡単に装飾もできます。

#備考

インスタンス変数の値が配列なるときは上記の書き方だとエラーが起こってしまいます。
そんなときは.paginate_arrayメソッドを使いましょう。

```ruby:Users_controller.rb
  def index
    @users = Kaminari.paginate_array(@users).page(params[:page]).per(5)
  end
```
こうすれば大丈夫です。

#おわりに
なんで雷なんだろう、、、
newgrpでパスワードを聞かれる

`newgrp`でパスワードを聞かれできないことがある。

```bash
$ newgrp $group
パスワード: #わからない
```

# 解決策

このパスワードは一時的に入ろうとしているグループのパスワードを聞いている。`gpasswd`でグループのパスワードを変更したり、削除することができる（root権限が必要）。

```bash 
# パスワードを変更
$ sudo gpasswd $group

# パスワードを削除
$ sudo gpasswd -r $group
```
admob+Unity2017 4.30f1で bannerView.Destroy()でビルドできない不思議な事象



Unityのadmobでバナー広告を非表示にできなく、なぜか```bannerView.Destroy()```メソッドのところでエラーになってしまったので、色々検証したところ無事ビルドできるようになった摩訶不思議な挙動があったのでメモ。



```csharp:AdSingleTon.cs
using UnityEngine;
using System.Collections;
using System.Collections.Generic;

using GoogleMobileAds.Api;

//〜〜省略〜〜

    private BannerView bannerView;

    // バナー非表示
    public void BannerHide()
    {
        
        if (bannerView != null)
        {
            bannerView.Hide();
            bannerView.Destroy();
//〜〜省略〜〜
```

上記の

```
private BannerView bannerView;
```

を一度

```
public  BannerView bannerView;
```

にし、Unity上実行できるか試し、
再度

```
private BannerView bannerView;
```
privateに戻すと、なぜかエラーがでなくなった。
master を綺麗に最新化する方法

# 事の発端
現場でコードレビューの方に、
「無駄にcommitsがめちゃくちゃ付随しててなんとかしてください。」
という指摘をいただいた。確かにそうだ・・・。見て見ぬフリしてました。
# なんでそうなってるのか
どうやら最新化する度、マージコミットが作成され、それがゴミコミット化していっている模様
# どうしよう
`git pull origin master` だとマージコミットが作成されてしまう
マージコミットされずに最新化する方法はないものか・・・。
# こうすればいける

```
$ git pull --rebase origin master
```
【自然言語処理のためのWikipediaデータの扱い方(#2) 】カテゴリーDBの作成


# 目的

自然言語処理のコーパス用データを効率よく作成するための事前処理として、カテゴリーDBの作成を行います。このDBを使うと特定のカテゴリーに所属するサブカテゴリーの一覧作成などが可能になります。

次の記事などを参考にさせていただいています。
（MySQLからSQLiteへの変換とSQLの修正は行っていますが、ほとんどそのままです）
https://qiita.com/tekunikaruza/items/93d3267a444acef470d9

# 方法

カテゴリー関連のDumpデータを使用してSQLiteのDBを作成し、SQLを使用して子カテゴリー一覧を取得します。

# 手順

## mysql2sqlieteをダウンロードする
wikipediaのdumpページからダウンロードできるファイルはMySQLのSQLファイルなので、SQLiteのSQLに変換するために使用変換ツールです。

```sh
git clone git@github.com:dumblob/mysql2sqlite.git
```

## sqlite3をインストールする
インストールされていない場合は次のコマンドでインストールします。

```sh
sudo apt install sqlite3
```

## カテゴリー構造データをダウンロードして解凍

```sh
# Wikipediaのdumpページからダウンロード
wget https://dumps.wikimedia.org/jawiki/20191001/jawiki-20191001-categorylinks.sql.gz

# 解凍
gunzip jawiki-20191001-categorylinks.sql.gz
```

## 記事情報データをダウンロードして解凍

カテゴリーIDからカテゴリー名を検索する際に使用します。

```sh
# Wikipediaのdumpページからダウンロード
wget https://dumps.wikimedia.org/jawiki/20191001/jawiki-20191001-page.sql.gz

# 解凍
gunzip jawiki-20191001-page.sql.gz
```

## カテゴリー構造データをsqliteのDBへ投入

```sh
./mysql2sqlite/mysql2sqlite jawiki-20191001-categorylinks.sql | sqlite3 wikicategory.db
```

## 記事情報データをsqliteのDBへ投入

MySQLからSQLiteへ返還してINSERTする際、UNIQUEキー制約の部分でエラーが出たためこの制約を削除してから投入しています。Wikipediaを運用するわけではないので、この制約は無くても問題ありません。

```sh
# 対象のキー制約を削除したSQLを新たに作成。
# （"UNIQUE KEY `name_title`"という文字列を検索し、ヒットした行を削除しています）
sed '/UNIQUE\sKEY\s`name_title`/d' jawiki-20191001-page.sql > jawiki-20191001-page_nouniqkey.sql

# 作成したSQLを使用して記事情報データをDBに投入
./mysql2sqlite/mysql2sqlite jawiki-20191001-page_nouniqkey.sql | sqlite3 wikicategory.db
```

以上でDBの作成自体は終了です。

# カテゴリーデータの抽出

テストとして特定のカテゴリーに属するサブカテゴリ―の一覧を表示します。
冒頭で紹介したページにあるSQLを参考に、次のSQLを使用したワンライナーで実行してみます。

```sql
SELECT
	p.page_title
FROM
	page AS p JOIN categorylinks AS c ON c.cl_from = p.page_id
WHERE
	c.cl_type = "subcat" AND c.cl_to = "人工知能";
```

作業ディレクトリで次のコマンドを入力すると、サブカテゴリ―一覧が表示されます。

```sh
> sqlite3 wikicategory.db 'SELECT p.page_title FROM page AS p JOIN categorylinks AS c ON c.cl_from=p.page_id WHERE c.cl_type="subcat" AND c.cl_to="人工知能";'
音声合成
音声認識
人工知能学者
機械学習
コンピュータ囲碁
コンピュータ将棋
コンピュータチェス
コンピュータビジョン
人工知能を題材とした作品
自然言語処理
進化的計算
人工知能の哲学
心身問題
人工知能の組織
知識表現
チャットボット
データマイニング
認知アーキテクチャ
ファジー論理
論理プログラミング
```

#バックナンバー

この記事は【自然言語処理のためのWikipediaデータの扱い方】というシリーズ2回目です。
以前の記事は次のリンクから参照可能です。

[【自然言語処理のためのWikipediaデータの扱い方(#1) 】Wikipedia記事DBの作成](https://qiita.com/YuukiMiyoshi/items/aee751a1055144adb18c)
初心者によるプログラミング学習ログ 126日目

# 100日チャレンジの126日目

twitterの100日チャレンジ#タグ、#100DaysOfCode実施中です。
すでに100日超えましたが、継続。

100日チャレンジは、ぱぺまぺの中ではプログラミングに限らず継続学習のために使っています。

126日目は、

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">おはようございます<br>126日目<br><br>メンターさんのjavascriptの課題<br>久々にwordpressのテーマ作成チュートリアルやろうとして、テンプレートファイルつくったら安定の寝落ち<a href="https://twitter.com/hashtag/100DaysOfCode?src=hash&amp;ref_src=twsrc%5Etfw">#100DaysOfCode</a> <a href="https://twitter.com/hashtag/%E6%97%A9%E8%B5%B7%E3%81%8D%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8?src=hash&amp;ref_src=twsrc%5Etfw">#早起きチャレンジ</a><a href="https://twitter.com/hashtag/%E9%A7%86%E3%81%91%E5%87%BA%E3%81%97%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%A8%E7%B9%8B%E3%81%8C%E3%82%8A%E3%81%9F%E3%81%84?src=hash&amp;ref_src=twsrc%5Etfw">#駆け出しエンジニアと繋がりたい</a></p>&mdash; ぱぺまぺ@webエンジニアを目指したい社畜 (@yudapinokio) <a href="https://twitter.com/yudapinokio/status/1182405272314081280?ref_src=twsrc%5Etfw">October 10, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
SSDの消去の際、frozenを溶くためにやったこと

もはや場所を食うだけの重い箱となったフルタワーを廃棄する予定なのだけど、SSDを完全消去するのに手こずったのでメモ。

Linuxのライブディストロ（USBメモリから起動）を使う場合は[ArchWiki](https://wiki.archlinux.jp/index.php/%E3%82%BD%E3%83%AA%E3%83%83%E3%83%89%E3%82%B9%E3%83%86%E3%83%BC%E3%83%88%E3%83%89%E3%83%A9%E3%82%A4%E3%83%96/%E3%83%A1%E3%83%A2%E3%83%AA%E3%82%BB%E3%83%AB%E3%81%AE%E6%B6%88%E5%8E%BB)あたりを読めば分かります。（※Linuxが使える方なら）

SSDにSecure Eraseコマンドを送れば良いのですが、このコマンドは通常BIOSに凍結（frozen）されてしまっていて実行できません。これを溶くよく知られている方法が2つあります。

- 一度電源をサスペンド状態にして復帰させる
- 起動中にSSDの電源ケーブルをすばやく抜き差しする

しかし、どちらを試してもfrozenのままなのでした。。

## 原因
BIOSの省電力設定でした。スリープ時S1（CPUのみ停止） / BIOS主導になっていました。
S3 / OS主導にしたあと再度サスペンド / 復帰で問題なくnot frozenに移行。Secure Eraseして終了でした。
【小ネタ】javaのArrayListをちょっとだけ便利にしてみた

# 0.(記事を自分でレビュー)

つまらない記事だが、短いコードの中で型パラメータを利用したり、superやthisの使い分けが活きてきたり、していて初心者の勉強に最適であるほか、オブジェクト指向プログラミング特有の継承という機能のありがたさを肌で体感できる内容となっている。

# 1.課題
javaの`ArrayList<T>`では、`set(int index, T element)`というメソッドを用いて`index`番目の要素として`element`を格納することができる。
でもこれ、要素数が`index`以下のときにやると、`java.lang.IndexOutOfBoundsException`が発生してしまう。
地味に面倒くさい。

# 2.解決
`ArrayList<T>`の子クラス`AL<T>`を書いた。
あらかじめ「要素数が足りないときには何を埋めるか」を決めておき、
実際に要素数が足りないときにそれを埋めさせる。

次のようなコードだ。

```java:AL.java
	class AL<T> extends java.util.ArrayList<T>
	{
		private T filler = null;//※

		void fillBy(T filler){this.filler = filler;}

		//存在しない場所にセットさせられそうになったらfillerで埋める
		public T set(int index, T element)
		{
			if(filler!=null) while(this.size() <= index) this.add(filler);
			return super.set(index, element);
		}
		//ゲットの場合も同様
		public T get(int index)
		{
			if(filler!=null) while(this.size() <= index) this.add(filler);
			return super.get(index);
		}
	}
```
※さらに子クラスを作り、デフォルトで`filler`を指定したい場合、子クラスのイニシャライザを
`{this.filler = (デフォルトのfiller);}`
とする必要がある。この場合はアクセス修飾子はprivateではなくprotectedとする必要がある。

サンプル。

```java:Main.java
class Main
{
    public static void main(String...args)
    {
        AL<String> al = new AL<>();
        al.add("indigenous");
        //al.fillBy("I filled.");
        al.set(3, "immigration");
        for(String s : al)
            System.out.println(s);
    }
}
```

このままだと今まで通り例外が発生して動かない。
が、コメントアウトした`fillby`メソッドを有効にすると、例外は発生せず、次のように表示される。

```
indigenous
I filled.
I filled.
immigration
```
JavaScript・jQueryを使用して特定の位置にスライドしたら発火させる【初心者向け】

サイトの無限スクロールを自作しようとしたときに実装したものです。
忘れたときのメモ用でもあります。

```test.html
<body>
    <div class="body"></div>
    <span class="point">ここが表示されると発火！</span>
</body>
```

```test.css
.body {
    display: block;
    height: 2000px;
}
```

```test.js
$(function(){
    $(window).on('scroll', function() {
        if($(this).scrollTop() + $(window).height() > $('.point').offset().top){
            alert('発火!');
        }
    });
});
```
一応jsのif文の中身をサクッと解説すると、

##### $(this).scrollTop()
→ スクロールをしたheightの数値

##### $(window).height()
→ ブラウザのウィンドウのheightの数値

##### $('.point').offset().top
→ 画面トップから指定した要素（上記の場合はpointクラス）までのheight

図で表すとこんな感じです。
![sample_image_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423449/56ca27f0-d23a-69d3-5a6b-22fee43220aa.png)

発火するときはこんな感じです。
![sample_image_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423449/4f3005d4-87dd-e67d-7436-115fa3927e99.png)

多分間違えていないはず！
Djangoのnamespace


url.py内に以下にapp_nameという変数を定義すると、namespaceが定義できる。

```py:urls.py
from django.conf.urls import url
from django.urls import path

# app_name is reserved word of Django. This define a namespace in URL
app_name = "testspace"

urlpatterns = [
    url(r'^$', views.home, name='home'),
    url(r'faq', views.faq, name='faq')
    ]
```

namespaceを使うと、HTML内のurlから以下のように呼び出すことができる。

```html:other.html
<a href="{% url 'testspace:home' %}">Home</a>
```

逆に、app_nameを途中から付けた場合、これまで`{% url 'faq' %}`で呼び出せていたものすべてに`test:`を付けないと、以下のようなエラーで表示されなくなる。

```shell-session
NoReverseMatchat /
Reverse for 'faq' not found. 'faq' is not a valid view function or pattern name.
```
気温・湿度・気圧センサー(BME280)を使って室内環境を測定

# きっかけ
・CO2に引き続き何か測定してみたいと思った
　どっかのサイト「BME280あるで」
　僕「温度・気圧・湿度全部測れるのお得やん」

# 使ったもの
・Raspberry Pi 3 model B+
・BME280 (スイッチサイエンスで売ってるもの)
・ブレットボード
・ジャンパワイヤ(オス-メス)

BME280はこんな感じ(背景に余計なものが写ってることに関してはあしからず)
↓これも千石電商で買ったけどここに詳細が載っている
https://www.switch-science.com/catalog/2236/


<img width="600" alt="IMG_3097.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513034/3ea2c6e4-4a3c-56df-3710-ea274da91d2f.jpeg">

結構小さい
小指の第一関節ぐらいの大きさ
BME280をやるのはn番煎じだと思いますがやっていきます


#手順

##はんだ付け

ピンソケットと基板ははんだ付けされていない状態で売られていたのではんだ付けをする
<img width="400" alt="IMG_3097_handa.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513034/296195e0-6c9d-f27f-dfbe-fd2707b05cbd.jpeg">
赤線の部分をはんだ付けする

##接続

接続は以下の通り
BME280はI2Cと呼ばれる通信方式らしい

| BME側 | ラズパイ側 | ジャンパワイヤ色 |
|:-:|:-:|:-:|
| Vin | 3.3v(1 or 17) | 赤 |
| GND | GND | 黒 |
| SDO | GND | 黒 |
| SCK | I2C/SDA(3) | 緑 |
| SDI | I2C/SCL(5) | 青 |

<img width="400" alt="bme280.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513034/26116dfd-49ac-0809-96c8-3aae613a917c.png">



##諸々のセットアップ

`raspi-config`でI2Cを有効化する

```
root@raspberrypi:/home/pi# raspi-config

5 Interfacing Options  Configure connections to peripherals ←これを選択
↓
P5 I2C         Enable/Disable automatic loading of I2C kernel module ←これを選択
　　　　　　・
          ・
          ・
"Would you like the ARM I2C interface to be enabled?"と表示されるので<yes>を選択
```
<br/>
コマンドラインからI2Cにアクセスするための`i2c-tools`をインストール

```
root@raspberrypi:/home/pi# apt update
root@raspberrypi:/home/pi# apt install -y i2c-tools
```
<br/>
コマンドライン上でセンサーと通信できているか確認(BME280の場合はSDO端子をGNDにつなぐとアドレスは`0x76`)

```
root@raspberrypi:/home/pi# i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- 76 --                         
```
<br/>
必要なPythonライブラリをインストールする

```
root@raspberrypi:/home/pi# apt install -y python-smbus
root@raspberrypi:/home/pi#　pip install smbus2
```



##プログラムの実行

スイッチサイエンスのサンプルプログラムを落とす

```
root@raspberrypi:/home/pi#　git clone https://github.com/SWITCHSCIENCE/BME280.git
```
<br/>
`BME280/Python27/`に移動し、サンプルプログラムを実行する

```
root@raspberrypi:/home/pi# cd BME280/Python27/
root@raspberrypi:/home/pi/BME280/Python27/# python bme280_sample.py
temp : 24.87  ℃
pressure : 1008.77 hPa
hum :  49.74 ％
```

気温・湿度・気圧を取得することができた
ここから先のプログラムの改良はよしなに


#参考にしたサイト
・BME280関係
https://qiita.com/hawk777/items/2b910a81df480268e07e

・I2C関係
https://qiita.com/kamujun/items/51f85339bfd582b27752


有用な情報ありがとうございました
nuxtで作ったプロジェクトを手元の実機スマホで確認する方法


## nuxtプロジェクトをスマホやVMで確認したい

https://ja.nuxtjs.org/faq/host-port/
↑公式にありました。

上記サイトの中で紹介されている方法はいくつかありますが、サッと確認できるのは

```package.json
"scripts": {
  "dev": "NUXT_HOST=0.0.0.0(任意のIPに書き換え) NUXT_PORT=3333(任意のポート番号に書き換え) nuxt"
}
```
上記に書き換えて

```
npm run dev
```
のコマンドを打ち直し、


```
0.0.0.0:3333
```
スマホに`IP:PORT`を入力して検索することです。

ちなみに、自分のIPを調べる方法はMacであれば[こちら](https://pc-karuma.net/mac-ip-address/)。
Windowsであれば、[こちら](https://asahi-net.jp/support/guide/os/0007.html)を参考にしてみてください。

### おまけ

また、[公式](https://ja.nuxtjs.org/faq/host-port/)では
> より良いクロスプラットフォーム開発サポートのために cross-env を使うことができます。

ということで

```
npm install --save-dev cross-env
```

`cross-env`をインストールして

```package.json
"scripts": {
  "dev": "cross-env NUXT_HOST=0.0.0.0 NUXT_PORT=3333 nuxt"
}
```

こちらに書き換える方法も紹介されています。
【Salesforce】ApexエラーMIXED_DML_OPERATIONの解決法３選

MIXED_DML_OPERATION, 非設定オブジェクトを更新した後の設定オブジェクト上のDML操作（またはその逆）は、許可されていませんという、Salesforce特有のエラーに対し、どのように対処していけばいいか、今回は３つの対処法を紹介していきたいと思います。

# そもそもこのエラーの原因は？
https://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/apex_dml_non_mix_sobjects.htm
上記ページに詳細は記してありますが、同じトランザクション内でDML操作を実行する場合、設定オブジェクトと非設定オブジェクトの両方を含めることができません。

例えば下記のsObjectは他のsObjectと一緒のトランザクション内で使用できません。
FieldPermissions
Group

以下のsObjectは他のsObjectを含む1つのトランザクションでは、グループの挿入と更新のみを行うことができます。その他のDML操作は使用できません。
GroupMember
API
ObjectPermissions
PermissionSet
PermissionSetAssignment
QueueSObject
ObjectTerritory2AssignmentRule
ObjectTerritory2AssignmentRuleItem
RuleTerritory2Association
SetupEntityAccess
Territory2
Territory2Model
UserTerritory2Association
User

それではこのエラーの３つの解決方法を紹介いたします。
# 解決方法① トランザクションを分ける
これができてしまえば一番簡単なのですが、可能であれば設定オブジェクトと日設定王ジェクトはどうしても同じトランザクションで処理をしなければいけないという場合を除いて、別々のものにわけて処理をするというのが一番簡単な解決法になります。

# 解決方法② プロセスビルダーを使用する
個人的にはこの方法が一番おすすめかもしれません。
プロセスビルダーとは、Salesforceに標準搭載されている、様々なプロセスを設定して自動的に実行できるアプリケーションになります。詳しくは下記の公式HPを参照ください。

https://help.salesforce.com/articleView?id=process_overview.htm&type=5

これを利用することで、あるオブジェクトの項目を更新することをトリガとして、他の項目を変更することができます。これを用いることで、同時に行おうとしていた日設定オブジェクトと設定オブジェクトの操作を、一方はApexのコード上で、もう一方はプロセスビルダー上でという風に切り分けることが可能になります。


プロセスビルダーはGUI上で設定を行えるため、直感的に使えるため、色々なコード上の処理を書き換えることも可能です。

これを使えばトランザクションを分けることができるので、MIXED_DML_OPERATIONエラーは解消されます。

# 解決方法③ futureをつけて非同期処理を行う
@futureをつけることでDMLを実行することができます。
しかし、返り値を返すことや、同じ@futureのついたfunctionから呼び出せないことなど、Apexの非同期処理は制約が多いのも現実です。

例えば下記のように行います。

```java
    public static void sampleFunc(){
         updateFormOwner(aid, bid);
 
    }

    @future
    private static void updateFormOwner(Id formId, Id groupId){
        Form__c form = [SELECT OwnerId FROM Form__c WHERE Id = :formId];
        system.debug(form);
        form.OwnerId = groupId;
        update form;
    }

```

以上がApexでMIXED_DML_OPERATIONエラーに出会った際の解決法になります。
もし他にもより良いものがありましたら、コメントなどで教えてください。
Swagger 2.0のAPI仕様をOpenAPI 3.0に変換する

# swagger2openapi とは

[swagger2openapi](https://github.com/Mermade/oas-kit/tree/master/packages/swagger2openapi) とは、Swagger 2.0形式のAPI仕様のYAML(またはJSON)を、OpenAPI 3.0形式に変換するツールです。

swagger2openapi
https://github.com/Mermade/oas-kit/tree/master/packages/swagger2openapi

# swagger2openapi を使ってみた

とりあえず使ってみました。
事前にnpm 6.1+を用意する必要があります。

まず swagger2openapi をインストールします。

```bash
$ npm install -g swagger2openapi
```

次に swagger2openapi コマンドで、Swagger 2.0形式の swagger.yaml をOpenAPI 3.0形式の openapi.yaml に変換します。

```bash
$ swagger2openapi --outfile openapi.yaml swagger.yaml
```

これで変換できました。簡単ですね。
Ruby on Rails のアンイストール方法

## Ruby on Rails を アンインストールしてみた

【目的】
Railsのバージョンを確認すると、古くなっていたので、新しいバージョンをインストールするために、まずは現バージョンのアンインストールを行った。

```ruby:terminal
$ rails -v
Rails 4.1.4

$ gem uninstall railties -v '4.1.4'

You have requested to uninstall the gem:
        railties-4.1.4

(省略）

Continue with Uninsrtall? [yN]


```
と表示された。

[yN]って何だろうと思ってググると、『 Yes or No 』の略らしい。
『y』と入力すると、

```ruby:terminal


Continue with Uninsrtall? [yN] y
Successfully uninstalled railties-4.1.4


```
と表示されたので、上手くアンインストールできた！！
【環境構築から】Python でファイル名の一括変更


## 環境構築

venv を使用するのが一番軽くて簡単そう。

Terninal で仮装環境を作るディレクトリに移動
↓

### 仮装環境の新規作成

```python
python3 -m venv [new_env_name]   
```

### 仮装環境起動
```python
. [new_env_name]/bin/activate
```

起動できてたら　`$`の左に`([new_env_name])`が表示される


## Pythonファイル

先ほどの`new_env_name`直下に 以下のPythonファイルを作成

```python
import glob
import os

path =  '/Users/~~~/'   # 変更したいファイルが存在するディレクトリ
baseName = ''      #変更後の名前 （この後ろに連番+拡張子がつく）
pre_extension = ''       #存在するファイルの拡張子
post_extension = '.png'  #変更後の拡張子
counter = 1         #連番スタート値

joinedPath = path + '*' + pre_extension
flist = glob.glob(joinedPath)




for f in flist:
    newName = baseName + str(counter).zfill(2) + post_extension
    os.rename(f, path + newName)
    counter += 1
```

<br><br>

今回は 01~~99 になるように`zfill(2)`と設定したがそこは臨機応変に。
[ゼロから作るDeep Learning]多層パーセプトロンとニューラルネットワークの違いについて分かりやすく説明してみた

# はじめに
この記事は**ゼロから作るディープラーニング 4章ニューラルネットワーク**を自分なりに理解して分かりやすくアウトプットしたものです。
文系の自分でも理解することが出来たので、気持ちを楽にして読んでいただけたら幸いです。
また、本書を学習する際に参考にしていただけたらもっと嬉しいです。

# 多層パーセプトロンとニューラルネットワークの違い
前回の記事で多層パーセプトロンはニューラルネットワークの進化一歩手前と言う話をしましたが、一体どこが違ってどうすれば進化させることができるのでしょう。

ではまず、多層パーセプトロンが改良されてニューラルネットワークが開発された経緯を話したいと思います。
多層パーセプトロンは前回も話した通り、層を深くすることでコンピュータの処理を再現することができるほど可能性を秘めています。ですが、層を深くすると言うことはその分だけ重みやバイアスなどのパラメータを設定しないといけないと言うことです。
コンピュータの処理のような複雑な処理を再現するには何千・何万層の多層パーセプトロンを使用しないといけません。しかし、人力では何千・何万層ものパラメータを設定することは到底出来ません。つまり多層パーセプトロンは理論上コンピュータの処理を再現できるが、実質それは不可能なのです。

そこでこの問題を解決するために作られたのが**ニューラルネットワーク**です。
ニューラルネットワークはデータを学習することで、最適なパラメータを自動で設定することができます。これにより実質不可能だった複雑な処理が再現可能となったのです。

遅くなりましたが、多層パーセプトロンとニューラルネットワークの違いを簡単にあげると**学習機能**と**活性化関数**です。
学習機能は第５章の内容なので、今回は**活性化関数**について解説したいと思います。

#活性化関数とは
活性化関数とは入力信号の総和を出力信号に変換する関数のことを言います。
パーセプトロンには**step関数**、ニューラルネットワークには**シグモイド関数・ReLU関数**が使われており、入力信号の総和を出力信号に変換しています。
実はパーセプトロンのニューロンに活性化関数が使われていたんです！！
<img width="599" alt="スクリーンショット 2019-10-15 19.00.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510602/40511f27-f2da-9d05-b95e-6a72ec02e135.png">

次回に各活性化関数の説明と実装を行いたいと思います。
jsのDate＋firestore.Timestampの組み合わせの場合、タイムゾーンはそんなに気にしなくていい

# TL;DR
* jsのDateもfirestore.Timestampもエポックミリ秒を持っているだけ
* よってDate <==> Timestampの相互変換は可逆的
* jsのDateはブラウザが勝手にタイムゾーンを決める
* ただ、ゾーン切替のテストをしたい場合や、別ゾーン表示は面倒

## jsのDateもfirestore.Timestampもエポックミリ秒を持っているだけ
consoleの出力やfirestoreの標準DBツールを見ると、TimeZoneまで表示される場合がありますが、
これはブラウザやDBツールが勝手にタイムゾーンを判断して出しているだけで、
どちらも内部的にはエポックミリ秒として管理されています。

Dateの``getHoursやgetDate``で出る値も、Dateが裏でよろしくやってくれています。

よって、別タイムゾーンでDateをfirestore.Timestamp形式でfirestoreに格納し、
別タイムゾーンのクライアントから呼び出して``toDate``して表示すると、
いい具合にクライアントのタイムゾーンに切り替えて表示してくれます。

## が、あえて変えたい場合は面倒
但し、このよろしくやってくれるタイムゾーン判定、
逆に手動で切り替えるAPIが標準で用意されていません。
別タイムゾーンでの挙動テストや、別タイムゾーンの時間で表示したい場合は
手計算をしたりとか、ライブラリの導入等が必要になります。
【脱初心者】Linuxの基本操作ができるようになったら覚えておくと便利なコマンドラインの操作集

## はじめに
Linuxでコマンドラインを使うことは昔からあったが、今まで最低限のコマンドとオプションを使ってきた。最近になって資格（LPIC）の勉強でコマンドラインの操作やコマンドオプションを総ざらいした時に「これもっと早く知ってたら作業スピード上げられたな」と思ったものを厳選してここに紹介します！

## コマンドラインの操作
| 操作              | 説明 | 使い所 |
|:-----------------|:------------------|:---|
| Ctrl+A           | カーソルを先頭に移動 | 左矢印キー長押しで戻らなくても一瞬で戻れます！ |
| Ctrl+E           | カーソルを末尾に移動 | ↑の逆操作です |
| Ctrl+F           | カーソルを1文字進める | |
| Ctrl+B           | カーソルを1文字戻す | |
| Ctrl+L           | 画面をクリア | コマンドラインの表示が汚くなってきてきれいにしたい時に！ |
| Ctrl+D           | カーソル位置の1文字を削除 | |
| Ctrl+K           | カーソル位置から行の末尾までを削除 | |

## 複数コマンドの実行
|コマンド       | 説明 | 使い所 |
|:-----------------|:------------------|:---|
| cmd1 && cmd2 | cmd1が正常終了した場合のみ、cmd2を実行 | cmd2の操作がcmd1の成功を前提にしている時に使います！ |
| cmd1 ll cmd2 | cmd1が正常終了しなかった場合のみ、cmd2を実行 | ↑の逆パターンです |

## ファイル操作コマンド
| コマンド  | オプション | 説明| 使い所 |
|:-------|:------------------|:---|:---|
| cp     | -p | コピー元ファイルの属性もコピー | アクセス権やタイムスタンプを残したい時に！ |
|      | -d | シンボリックリンクをシンボリックリンクとしてコピー | 普通にコピーすると実体もコピーされてしまう問題を解決できます！ |

## リダイレクト
|コマンド       | 説明 | 使い所 |
|:-----------------|:------------------|:---|
| cmd > filename | cmdの実行結果をfilenameというファイル名で**保存** | スクリプトの結果等を特定のログに出力したい時などに！ |
| cmd >> filename | cmdの実行結果をfilenameというファイル名のファイルに**追記**。ファイルが無ければ新規作成して保存 | 特定の複数コマンド実行結果のログを1つファイルとしてまとめたい時に！ |

## おわりに
その他「これもあった方が良いよ！」等ありましたらコメントお願いします！m(_ _)m
[準備編] 格安Linux板G-clusterで遊んでみた(画面出力はしないよ)

いきなりですけど、ラズパイって高くないすか？
ラズパイZEROを買おうとしても3000円近くするし、だからといってArduinoでは非力だったりする。
ってか、USBシールドとかWi-fiモジュールとか買うとかえって高いかもww

じゃあ、別に安いLinux板買えばええやん。しかもこのLinux、定格が0.5Aだから電源供給も安心！
ってわけで、250円で投げ売りされていたG-clusterをまともに使える状態にしていきます！！

#環境構築

##シリアルポートの準備
CP2102等でG-clusterのシリアルポートとパソコンを接続して下さい。

接続できたら、``minicom -s``を実行してください。
メニューからSerial Port Setupを選択し、
Serial Deviceを``/dev/ttyUSB0``
Hardware Flow Controlを``no``
設定をデフォルトとして保存します。

それでは、準備が整ったので``minicom``を実行していきましょう！

##組み込みLinuxと御対面
準備ができたら、何かキーを押しながらG-clusterに電源を供給します！
コンソールに、一瞬文字化けした何かが表示されたあと、

```
dlink_U-Boot 2011.06 (Jan 16 2013 - 15:22:32)

I2C:   ready
DRAM:  256 MiB
SPI Speed at [R:23MHz/W:47MHz] Flash Size: 128KB
NAND:  128 MiB
MMC:   
initializing secure environment
Bad block table found at page 65472, version 0x01
Bad block table found at page 65408, version 0x01
In:    serial
Out:   serial
Err:   serial                                                                   
MAC:   00:1a:cc:00:00:01                                                        
Hit any key to stop autoboot:  0
```
こんな感じでU-Bootが起動してくれたら成功です！
ストレージよりメモリの方が多いんですねー

では、そのまま``boots``を実行して普通に起動してみます。
Linuxが起動している間、``stty cread``を入力し続けてください。
HDMIポートに何か挿さってないと、起動しないっぽいぽいです。

##インターネットに接続

ラズパイと同じ様に設定してください。
参考：https://qiita.com/R-STYLE/items/8d37fb59e4872faee2bc

```
iwconfig wlan0 | grep ESSID
```
## クロスコンパイル環境を手に入れよう！

まずはdockerで、開発環境を入手しましょう。
コンパイラはPQI Cardと同じなので、今回はこちらを使わせてもらいます。

https://github.com/Sakaki/PQICC/blob/master/curl/Dockerfile

# 次回予告

今回までで、ひと通り準備はできました！
次回はpython3をコンパイルして、いろいろ遊んでいきます！(いつ書くんだろう)


[追記　2020/06/12]
Pythonの話はまだですが、テレビにシェル表示する話書きました！ぜひ合わせてご覧ください。
https://qiita.com/gpioblink/items/afa5b810c398e545908a
【WordPress】多言語テーマ 翻訳されない【KUSANAGI】

#はじめに
久しぶりの投稿！！
KUSANAGI環境のWordPressで多言語テーマの翻訳ファイルが適応されない状態だったのを解決した。

#結論
余計な説明を省いて結論！

WordPressの管理画面で、[KUSANAGI] > [翻訳アクセラレーター] の [サイトに表示される翻訳された文章] が
[翻訳を停止] になっているところを [通常翻訳] に変更。

以上！

#デフォルトが停止？
デフォルトなのかもしれないし、
もしかしたら何かしらの設定でそうなっていたのかも？
もう一度入れ直したらわかるんだろうけど、検証はしていない！！

#キャッシュ問題
KUSANAGIの売りのキャッシュを利用する際に、翻訳ファイルを読み込まないようになっているようだ。

```
function load_textdomain で キャッシュを優先に読み込むためのところでreturnがかかっていた。

    $plugin_override = apply_filters( 'override_load_textdomain', false, $domain, $mofile );

    if ( true == $plugin_override ) {
        unset( $l10n_unloaded[ $domain ] );

        return true;
    }
```

オーバーライド！！
KUSANAGIのコアファイルを検索すると…

```
# find . -name "*.php" | xargs grep override_load_textdomain
./DocumentRoot/wp-content/mu-plugins/kusanagi-core/modules/translate-accelerator.php:           add_filter( 'override_load_textdomain', array( $this, 'load_textdomain' ), 10, 3 );
```

ビンゴ！
これがどこを読み込んでいるかというと、上記の結論のとおりの設定だったとさ。
nuxtでjestするとbabel-coreを見つけてくれない

# 御託はいいから解決してくれ

`babel-core@bridge`というパッケージを入れればOK

```shell-session
yarn add -D babel-core@bridge
```
# 何が起こっていたか

test時に `vue-jest` というパッケージが `@babel/core` ではなく、 `babel-core` を参照し続けている状態みたい。
下記のように、`cannot find module 'babel-core'` というエラーを吐き出してしまいます。

```
 FAIL  test/index.test.js
  ● Test suite failed to run

    Cannot find module 'babel-core'
      
      at _load_babelCore (node_modules/babel-jest/build/index.js:17:49)

Test Suites: 1 failed, 1 total
Tests:       0 total
Snapshots:   0 total
Time:        2.134s
Ran all test suites.
npm ERR! Test failed.  See above for more details.

Process finished with exit code 1
```

## babel-core@bridgeって何
[babel-bridge公式](https://github.com/babel/babel-bridge)にはこのように書いていました。
>babel-bridge
This repo holds what we're calling a "bridge" package that is meant to ease the transition for libraries that use "babel-core" as a peer dependency for Babel 6.

>The issue with Babel 7's transition to scopes is that if a package depends on Babel 6, they may want to add support for Babel 7 alongside. Because Babel 7 will be released as @babel/core instead of babel-core, maintainers have no way to do that transition without making a breaking change. e.g.

`babel`は7系から`@babel/core`という名前でリリースされたので、`babel 6`系に依存したパッケージたちは破壊的な変更を余儀なくされたらしい。で、`babel 6`系の`peerDependency`である`babel-core`を使うライブラリの移行を楽にすべくこのパッケージが存在する、ということらしいですね。

## 解決にあたって
[ここ](https://github.com/facebook/jest/issues/4891)と[ここ](https://github.com/vuejs/vue-jest/issues/160)を参照しました。

以下は`vue-test-utils`にコントリビュートされているらしい`eddyerburgh`さんのコメントです。
> eddyerburgh commented on 17 Feb • 
We have babel-core as a peerDependency, it's up to you to use either @bridge or 6 (for vue-jest <4).

ふむふむ、vue-jestが4系に上がるまではbabelの6系を使うか、`@bridge`パッケージを使えってことですね。
ちなみに2019年10月の段階ではvue-jestはまだ3系が最新みたいですね。

## vue-jestのgithubのreadmeには
以下のように書かれていました。

* [vue-jest公式](https://github.com/vuejs/vue-jest)

> Usage with Babel 7
If you use jest > 24.0.0 and babel-jest make sure to install babel-core@bridge

>```
npm install --save-dev babel-core@bridge
```

`jest`のバージョンも関係してるみたいですね。
`jest`が`24.0.0`より上のバージョンで、`babel-jest`を使っている場合は`babel-core@bridge`をおとなしく入れましょう。
Golangでファイル操作の時のbyte型とioパッケージについて調べたリンクメモ

Golangでファイル操作すると `byte` 型が出てくる。RubyやJSでファイルを操作するのときにはそんなに見かけなかった。ここでは、byteが何者で、なんのために使うのか、なにがうれしいのかなど調べたメモ。

# そもそもbyte型とは
 - byteはuint8型の別名
 - uint8は1byte(8bit)の整数(0 ~ 255)
 
**[GO言語仕様](http://golang.jp/tag/go%E8%A8%80%E8%AA%9E%E4%BB%95%E6%A7%98/page/3)**


# byteとstringの関係
- 基本的はアルファベット文字は1byteで表現できる
  - 例: 2進数`110 0001` は 文字列`'a'`

**[1バイト文字とは](https://wa3.i-3-i.info/word16699.html)**

- byte型のスライス `[]byte` はstringに変換できるし、逆も可能

**[Go で UTF-8 の文字列を扱う](https://qiita.com/masakielastic/items/01a4fb691c572dd71a19)**

# なぜファイル操作でbyteを使うのか

- Golangで入出力を扱う場合は `[]byte` を使う場合が多い
- 例えば、ファイルの入出力でよく使われる [IO package](https://golang.org/pkg/io/) の場合もReadやWriteで `[]byte` が使われる

**[ファイル入出力](http://cuto.unirita.co.jp/gostudy/post/standard-library-file-io/)**

- stringではなく `[]byte` を使う理由は `[]byte` のほうが使いやすいから
- `[]byte` は stringよりもprimitiveなデータ型で、mutableだからsubsetの置換など取り扱いがしやすいから(あってる？)

> Go の string は byte array の subset + わずかな便利機能を持つ別の型, というものです.
違いはいくつかあると思いますが, 大きいところでは:

> * 1. slice や要素の address をとれない
> * 2. 要素単位の書き換えができない, immutable: x[i] = 1 とか NG.

>  string は byte array を持った struct で, 色々小細工をするために array よりは限られた API を持っているもの, という理解でいい

**[Go の []byte がわからない](https://blog.kyanny.me/entry/2015/06/30/014820)**

# string <-> []byte ではメモリ使用に気をつける

**[golang で string を []byte にキャストするとメモリコピーが走ります]
(https://qiita.com/ikawaha/items/3c3994559dfeffb9f8c9)**

`[]byte` からstringへは `*(*string)(unsafe.Pointer(&[]byte))`が早いようです
 
**[忘れがちなGoでbyteをstringに変換する方法をベンチマークしてみた。]( http://chidakiyo.hatenablog.com/entry/2017/12/12/%E5%BF%98%E3%82%8C%E3%81%8C%E3%81%A1%E3%81%AAGo%E3%81%A7byte%E3%82%92string%E3%81%AB%E5%A4%89%E6%8F%9B%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95%E3%82%92%E3%83%99%E3%83%B3%E3%83%81%E3%83%9E%E3%83%BC)**

# IO周りのレシピやTips
**[Effective streaming in Golang](https://speakerdeck.com/avvmoto/effective-streaming-in-golang)**
ionicをDockerから始めるときの設定

タダのメモ。下書きにが満杯になったのでとりあえず投稿しました。
多分追記はしない。

```sh
docker run --rm -v /etc/group:/etc/group:ro -v /home/gpioblink:/home/gpioblink -v /etc/passwd:/etc/passwd:ro -v /etc/shadow:/etc/shadow:ro -v /etc/sudoers.d:/etc/sudoers.d:ro -u=1000:1000 -p 8100:8100 -w /home/gpioblink/1_uoa/2_zli/3_ionic -it beevelop/ionic
```
numpyとpandasの使用方法のメモ

#行列について
行列式をpythonで取り扱っていると、勘違いが起きそうだなと思ったのでメモとして一応残しておく。例えばnp.array([1, 2, 3])は1行3列なのか、3行1列なのか。これをcsv形式で保存した場合どのように表示されるのかを見てみるのが今回の目的。またto_csv関数のindexとheaderについて、デフォルトでは両方ともTrueとされているが、Falseとしてみるとどうなるのかの確認。

```py
import numpy as np
import pandas as pd
a = np.array([1, 2, 3])
b = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
c = np.array([[1], [2], [3]])
df = pd.DataFrame(a)
df.to_csv("a.csv")
df = pd.DataFrame(b)
df.to_csv("b.csv", header=False)
df = pd.DataFrame(c)
df.to_csv("c.csv", index=False, header=False)
```

csvファイルの中身をスクショで添付しておく。

![a.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401291/202a7db1-622c-e61d-9727-18e146fab125.png)

![b.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401291/59332d99-c0ab-336a-7184-3408ff925c76.png)

![c.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401291/413586dc-d5d1-4920-e09c-847491dc3750.png)

Excelを使うことを考えると、基本的にはheader及びindexはともにFalseの方が都合がよい。それにしてもaとcの形状が同じになってしまったため、少し付け足しをする。

```py
d = np.array([[1, 2, 3]])
df = pd.DataFrame(d)
df.to_csv("d.csv", index=False, header=False)
```

![d.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401291/3b767331-38e0-c390-79b4-c0973a70c24e.png)

欲しい結果が出たが,調べてみるとnp.shapeで何行何列なのかを確認することができる。またaのみ行列ではないものとして扱われていることが確認できる。
プログラミングを始めて半年、思うことあれこれ


※※この記事に役立つ内容はありません※※
※※100%自分語りでお届けします※※

# はじめに
大学では文学部だった私ですが、今年の4月に新卒で就職、プログラミングを始めました。
プログラミングの世界に入って半年経つので、今までのことや現在悩んでいることを書き綴ろうと思います。

### で、誰向け？
メインは何年後かの自分が見返して笑い飛ばすためですが、ベテランエンジニアの方にとっては初心者理解のヒントになる、かもしれません。
何にせよ、自己満足が前提ですので、恥ずかしくなったら消します。

### 仕事を始める前の自分
- 文学部
- パソコンはofficeが使える程度。
- HTMLすらわからない

### 4月以降学んだ言語
- HTML
- CSS
- Java Script
- PHP(メイン)
- (SQL)
- (Bootstrap)

# つまずいてきたこと

### 1.配列
まず概念がわからない。
「値を詰めておく箱」とは？？？
(今思えばすごくわかりやすい説明ですが…)

Qiitaの色々な記事を読んで、やっと理解できたように思います。実際に使うのも大事ですね。
果物の例や家族の例がわかりやすかったです。
家族は特に連想配列の理解に役立ちました。
また余裕があればお世話になった記事を貼ります。

### 2.関数・引数・返り値
これも概念の理解に手間取った。
しばらくは「いんすう」って読んでた。
returnの存在も混乱の原因。必須かと思ったけど違うの？？

例えばですが、

```return.php
function gobaisuruyo($num){
    echo $num * 5;
}

gobaisuruyo(7); //35
```

これで満足していたためreturnの存在意義がわからなかったわけです。

ではどうやって理解できたかというと、
phpの組み込み関数を色々使うことです。

関数を呼び出すときに、
$value = (関数名)(引数あったりなかったり)
するのと
(関数名) (引数あったりなかったり)
の違いがなんとなく掴めてきました。
引数も、「関数を扱うときにどうしても必要になる値」と解釈できるとわりとスムーズに理解できました。

このあたりからやっとPHP公式マニュアルが読めるようになります…公式難しいんです…

# 今つまずいていること
### オブジェクト指向！
データベース接続のためにPDOを少しかじったくらいなのでさっぱりです。

難しいポイントとしては、
- 今まで書いてきたソースとは構造が全然違う
- カタカナ多すぎてイメージがわかない(メソッドはまだわからんでもない。クラス？？インスタンス？？)

という感じ。どうしても上から下に処理が進んでいく書き方が一番わかりやすいので、そういうのに頼りがちです(後述)。

# 今悩んでいることとか
### 1. ソースが冗長的。
上で述べたことですが、ソースが無駄に長くなりがちです。関数で処理をまとめるべきなのはわかるのですが、どの処理をまとめたらいいのか、どの処理はまとめんでいいのか、そもそも関数使ったら上から下に処理が流れるわけじゃないしわかりにくいし…と、だらだら書いてしまいがちです。
特に家で自由に書くプログラムは、なかなか無法地帯(変数名とかも！)。

### 2.ソースレビューしてほしい
というわけで、家では好きなプログラムを書けるのは良いのですが、どの書き方が良くて悪いのかがわかりません。この書き方はまずいのではと思っても、代わりの書き方がわからなかったり。
というわけで、初心者のソースコードをメタメタに斬るのが好きな方がいたら教えてください。

### 3.仲間がほしい
会社に同期はもちろんいるのですが、ほかにも刺激し合える初心者仲間はほしいですね。
自分から探せやって話ですが。

### 4.今何を勉強すれば？？
今はphpだけ色々書いているところですが、他の言語も触っておくべき？
それとも基本情報技術者資格の勉強をすべきなのか。
…悩みながら時間だけが過ぎていきます…


# 終わりに
こんな自分語りしかない記事を最後まで読んでいただきありがとうございます。
一旦この半年の整理がついたかなとは思うので、あと半年も頑張ります。
【Vue.js】 vue-lazyloadをSSR後だけ無効にしたい

※細かい挙動に関しては現在確認中です
※なので動作やこれが正しい方法かどうかは保証しません

# きっかけ
レンダリング速度向上のために`vue-lazyload`を導入し画像の遅延ロードを目指した
しかし、画像がブラウザにキャッシュされている場合lazyloadの処理よりもキャッシュで直接imgタグを返したほうが早く表示される

特にSSR時が顕著に現れ、SSRでimgタグをレンダリングしたあとにクライアント側のレンダリング時にlazyloadに切り替わり真っ白になってしまう


# 対策
※コンポーネント単位でlazyloadを使ってる場合
※page単位の場合はasyncDataなどでおそらく抜け道があると思われる（未確認）

```.vue
<template>
  <div>
    <img v-if="lazyLoadable()" v-lazy="src" />
    <img v-else :src="src" />
  </div>
</template>

<script>
export default{
  props: {
    src: {
      type: String,
      required: true
    },
    lazy: {
      type: Boolean,
      default: false,
      required: false
    }
  },
  data: function() {
    return {
      ssred: false
    }
  },
  created () {
    this.ssred = !!this.$vnode.elm
  },
  methods: {
    lazyLoadable() {
      if (process.server || this.ssred) {
        return false
      }
      return this.lazy
    }
  }
}
</script>
```

SSR直後は`$vnode.elm`がnullではないことを利用している
なのでsrcが変化する場合は使えないものと思われる

# …本来は
`window.caches`でキャッシュの存在をチェックしてlazyloadするかどうか判断したい
Vue.js + moment.jsで開始時刻と終了時刻から合計時間を算出する

より良い書き方手法ありましたら、ご教授いただけますと幸いです

開始時刻と終了時刻を入力時間がでる、勤怠のようなイメージです

#動作

<p class="codepen" data-height="265" data-theme-id="dark" data-default-tab="js,result" data-user="natsume0718" data-slug-hash="rNNerWm" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="開始時刻と終了時刻から合計時間算出">
  <span>See the Pen <a href="https://codepen.io/natsume0718/pen/rNNerWm">
  開始時刻と終了時刻から合計時間算出</a> by natusme (<a href="https://codepen.io/natsume0718">@natsume0718</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

#解説

```js:JS

import moment from "moment";

export default {
  data() {
    return {
        start_time: "",
        ending_time: "",
    };
  },
  computed: {
    totalTime: function() {
      const start = moment.duration(this.start_time, "HH:mm");
      const end = moment.duration(this.ending_time, "HH:mm");
      const diff = end.subtract(start);
      if (diff.hours() < 0 || diff.minutes() < 0) {
        return "00:00";
      }
      const hours = diff.hours() < 10 ? "0" + diff.hours() : diff.hours();
      const minutes = diff.minutes() < 10 ? "0" + diff.minutes() : diff.minutes();
      return hours + ":" + minutes;
    }
  },
}

```

流れとしては
開始時刻と終了時刻をそれぞれバインディングして、どちらかが変更されたら`computed`プロパティで計算します

期間を作成するにはmoment.duration()を用います。[公式](https://momentjs.com/docs/#/durations/)
期間は時間の長さとして定義されます。
例えば、`12:00`だったら、00:00からの長さとして、`hours`であれば12が得られます。

開始と終了をdurationオブジェクトで作成後、終了時刻から減算(`subtract`)して合計を求めています

差分がマイナスにしたくないので、マイナスの時は`00:00`返しています

また、時間、分ともに一桁の場合、頭に`0`を付与し

最後に時間と分を連結して返却しています。

#参考にさせていただいたサイト
https://stackoverflow.com/questions/29745873/hour-difference-between-two-timeshhmmss-ain-momentjs

https://momentjs.com/docs/#/durations/
Jupyter でインタラクティブなアニメーション

## なにがしたいか
JupyterでGUIを書くために、ユーザの入力に応じて出力するようにしなければならない。入力を受け取る方法として、Widgetが使えるということなので調べてみた。

## データの生成
描画データとしては、サインカーブを生成する。その際の、周波数と振幅をwidgetで調整できるようにする。`next`メソッドを呼ぶと次のデータを返す。

``` Python
import math
class Oscillator(object):
    def __init__(self):
        self.amp = 1.0
        self.freq = 1.0
        self.angle = 0
    def next(self):
        self.angle += self.freq / 100.0 
        return math.sin(self.angle * 2 * np.pi) * self.amp  
```

## 周波数と振幅のコントロール
コントロールにはWidgetの`FloatSlider`を用いる。スライダをいじったら、その値が`Oscillator`に反映されるようにするためにコールバック関数を登録する。

``` Python
import ipywidgets as widgets

class OscillatorController(object):
    def __init__(self, o):
        self.o = o
        self.fw = widgets.FloatSlider(description='Freq:', min=1.0, max=5.0, value=o.freq)
        self.aw = widgets.FloatSlider(description='Ampl:', min=0.0, max=2.5, value=o.amp)
        self.fw.observe(self._assign_freq, names='value')
        self.aw.observe(self._assign_amp, names='value')

    def _assign_freq(self, change):
        self.o.freq = change['new']
        
    def _assign_amp(self, change):
        self.o.amp = change['new']

    def display(self):
        display(self.fw)
        display(self.aw)  
```

## アニメーション
アニメーションは`matplotlib.animation`を使う。インターバルごとに指定した関数がよびだされるので、そこから`Oscillator`の`next`を呼び出して、データを作る。

``` Python
%matplotlib nbagg
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation

class AnimationPlot(object):
    def __init__(self, o):
        self.fig, self.ax = plt.subplots()
        self.ax.set_xlim((0,100))
        self.ax.set_ylim((-2, 2))
        self.x = np.linspace(0, 100, 100)
        self.y = np.zeros(100)
        self.line, = self.ax.plot(self.x, self.y, lw=2)
        self.yl = list(self.y)

    def animate(self, i):
        self.yl.append(o.next())
        self.yl = self.yl[1:]
        y = np.array(self.yl)
        self.line.set_data(self.x, y)
        return (self.line,)

    def display(self):
        self.anim = animation.FuncAnimation(self.fig, self.animate, frames=100, 
                            interval=200, blit=True)
```


## 実行
``` Python
o = Oscillator()
oc = OscillatorController(o)
aplot = AnimationPlot(o)
aplot.display()
oc.display()
```

こんなかんじになる。

![ezgif-6-56efb62c7cb7.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412142/f5e9afe9-01ef-ef69-bb67-c5df118c4575.gif)

## 所感
まあいいんだけど、CPUの負荷が結構たかくなる。バックエンドでimagemagik使っているっぽいので
そのへんが重いのだろうか。
AndroidX を適用した Flutter プロジェクトで  'androidx.core:core' has different version for the compile (1.0.0) and runtime (1.0.2) classpath エラーが出た場合の対応

# 環境

```shell
$ flutter doctor
Doctor summary (to see all details, run flutter doctor -v):
[✓] Flutter (Channel stable, v1.9.1+hotfix.2, on Mac OS X 10.14.5 18F203, locale ja-JP)
```

# 本文

AndroidX にマイグレーションした Flutter プロジェクトで、 Firebase プラグインを入れてリリースビルドしたら以下のようなエラーが発生しました。

```shell

$ flutter build appbundle

（省略）

FAILURE: Build failed with an exception.                                
                                                                        
* What went wrong:                                                      
Execution failed for task ':app:preReleaseBuild'.                       
> Android dependency 'androidx.core:core' has different version for the compile (1.0.0) and runtime (1.0.2) classpath. You should manually set the same version via DependencyResolution
```

どうやら Firebase プラグインの依存する `androidx.core:core` のバージョンが違うことが理由のようで、エラーを最後まで読むと「手動で依存関係の解決方法を設定しろ」とのこと。

で、ググったところドンピシャでこの問題にぶち当たってる情報が見つからなかったですが、素直に Gradle のドキュメントを見ながらいろいろ試したところ、 `app/build.gradle` ファイルに以下を追記して `androidx.core` グループのバージョンを全て `1.0.0` に揃えることでビルドできるようになりました。

```gradle:app/build.gradle

configurations.all {
    resolutionStrategy.eachDependency { DependencyResolveDetails details ->
        print(details.requested.group)
        if (details.requested.group == 'androidx.core') {
            details.useVersion '1.0.0'
            details.because 'API needs higher versions'
        }
    }
}
```

おそらく Flutter で Firebase 関連のプラグインを使おうとするとだいたい引っかかる（の割にはあまり情報がない）問題だと思うので、ご参考になれば。

なお、参考にした Gradle のドキュメントは以下です。

[Customizing Dependency Resolution Behavior - Gradle](https://docs.gradle.org/current/userguide/customizing_dependency_resolution_behavior.html#sec:custom_versioning_scheme)
（気象庁XML）10月12日台風19号に伴う通数増加

情報システムの設計には、とうぜんのことながら、時間当たり処理件数というのがきわめて重要です。フィードを追って HTTP ゲットしてファイルに書き出すだけのプログラムでさえ、スループットの限度というものがあります。

令和元年10月12日から台風第19号が日本を通過しました（[11日報道発表](http://www.jma.go.jp/jma/press/1910/11b/201910111100.html)；特別警報発表[12日7都県](http://www.jma.go.jp/jma/press/1910/12a/201910121630.html)、[12日5県](http://www.jma.go.jp/jma/press/1910/12b/201910122050.html)、[13日岩手県](http://www.jma.go.jp/jma/press/1910/13a/201910130140.html)；[直近実況](http://www.jma.go.jp/jma/menu/R1T19.html)）。このさい大量の電文の通数をメモしておきます。

|日付|通数|EAGAIN発生数|
|---:|---:|---:|
|2019-10-06|2780|>6*|
|2019-10-07|2796|11|
|2019-10-08|3354|15|
|2019-10-09|3120|8|
|2019-10-10|3130|14|
|2019-10-11|4246|12|
|2019-10-12|7540|49|
|2019-10-13|4352|23|
|2019-10-14|3548|13|

通数はダウンロードしたXML電文の数。EAGAIN発生数は、毎分起動している取得プログラムが1分以内にダウンロードを終えることができず、次回起動がキャンセルされた数です。2019-10-06の途中でEAGAIN発生数を記録しはじめたので「>6*」は参考値です。

さしあたり読み取れること

* 荒天時は電文通数が急増し、ざっくり3倍くらいになる
* EAGAIN（1分間に現れた4つのフィードの指示する電文をダウンロードする処理に1分以上かかってしまうこと）は、一番荒れた12日は49回も発生してしまったが、立て続けに発生して受信漏れが起こるというほどではない
* サンプルが少ないが、通数と EAGAIN 発生数にはリニアな関係があるという仮定に大きく矛盾するデータは見出されていない

EAGAIN が2分連続で発生すると、つまり1回のダウンロード処理に足掛け3分かけていてとっても長いわけですが、ログを読んだんですけど12日16:02、16:03が連続EAGAIN爆死した回しか発生していないようです。ここではいくつかの警報と48時間予想天気図（ファイルサイズがでかい）が一気に出ています。まあ今のロジックにこだわらず、regular.xml より extra.xml を優先したら話もかわるでしょう。
PyCharmテストファースト

# Test first for Python on PyCharm

## set up for test runner
* テストフレームワークは既定で[unittest](https://docs.python.org/ja/3/library/unittest.html?highlight=unittest#module-unittest)が選択される。
* unittestはPython標準ライブラリに含まれるJunitライクなテストフレームワークです。
* ![setup_testing1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282300/53b750c5-fa1d-8394-531d-0adfb1a94f4c.png)
 

## create test
1. テスト対象スクリプト(例：class CommonHeader) のエディタ画面で右クリックし、「Go To/Test」を選択
![setup_testing2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282300/4efad91e-00e0-fb53-768e-1006f27771a5.png)

1. 「Create New Test...」を実行
![setup_testing3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282300/2d1d9925-de6b-35aa-2e29-e6453203f7ce.png)

1.  テストスクリプト、テストメソッドを設定する。
![setup_testing4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282300/c1b7afbd-6096-010b-e187-b508150fda76.png)


1.  テストスクリプト(test_commonHeader.py)にテストスケルトンが生成される。
![test_template.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282300/524f26af-b0d1-b3a4-f738-94ba81c48198.png)

    
## create test code
* [参考:unittest](https://docs.python.org/ja/3/library/unittest.html?highlight=unittest#organizing-test-code)
* テストコードのポイント
    * PyCharmの「Create New Test...」による自動生成では対象メソッド、対象クラスにつき１テストファイルが生成される。
    * 文末に添付するように、１スクリプトについて１テストファイルに纏めたほうが都合がいい。
    * junitでできることは大抵可能。
LeetCode ::: 268 /// Missing Number

:sparkles::tea: `思考回路`
> 合計して相殺する

- インプットの長さを変数 len に入れて（私が文字数を短くしたいので :relaxed:
- で、変数 suppose はもし数字が紛失しなかったら、本来あるべき合計値。等差数列の和の公式を使います。ゼロは足す必要がないので項数はちょうど len と等しいです。
- 今インプットの配列も合計し、変数 sum に入れます。
- suppose と sum を相殺させて、その結果が紛失した数字です。

---
<p class="codepen" data-height="735" data-theme-id="0" data-default-tab="result" data-user="jujuriri" data-slug-hash="KKKdOEY" style="height: 735px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="LeetCode ::: 268 /// Missing Number">
  <span>See the Pen <a href="https://codepen.io/jujuriri/pen/KKKdOEY">
  LeetCode ::: 268 /// Missing Number</a> by jujuriri (<a href="https://codepen.io/jujuriri">@jujuriri</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>
---
:sob::pray_tone1: 自力で解決法を考え出すことが出来る優しい問題ですね。