OmniAICreator/Qiita-1.07M huggingface dataset:
Salome-Meca 2020のインストール方法と新機能

Salome-Meca 2020がLGPLライセンスで[ダウンロード](https://www.code-aster.org/spip.php?article303)できます。
この2020年版では、以下の製品が統合されています：

* SALOME 9.4.0 .
* code_aster stable (バージョン14.6) .
* code_asterテスト版 (バージョン15.2) .
* AsterStudy .
* MEDConverter .
* EUROPLEXUSモジュール .
* Salome-Meca プラグイン : CABRI .
* code_aster トランスレータ .
* astk.

このバージョンは、Debian9のようなOSと互換性があり、すでにいくつかの前提条件がインストールされていることが当然のことと考えています。Ubuntu 18.04 LS を使用している場合は、[ベータ状態の自動インストール手順](https://www.code-aster.org/spip.php?article1112)を提案します。

# インストール

* システムの前提条件（管理者権限が必要）

ターミナルで以下のコマンドを入力します。

```bash
sudo -E apt install -y --no-install-recommends \
                 wget net-tools python python3 libbsd0 libbz2-1.0 libc6 libdbus-1-3 \
                 libexpat1 libffi6 libfontconfig1 libfreeimage3 libfreetype6 \
                 libgcc1 libgfortran3 libglib2.0-0 libglu1-mesa libgomp1 libharfbuzz0b \
                 libice6 libicu60 libilmbase12 libjbig0 libjpeg62 liblcms2-2 liblzma5 \
                 libmng2 libmuparser2v5 libnlopt0 libnss-sss libopenblas-base \
                 libopenexr22 libpcre3 libpng16-16 libquadmath0 libraw16 libreadline7 \
                 libsm6 libssl1.0.0 libstdc++6 libtbb2 libtiff5 libtinfo5 libuuid1 \
                 libx11-6 libx11-xcb1 libxau6 libxcb-glx0 libxcb1 libxcursor1 \
                 libxdmcp6 libxext6 libxfixes3 libxi6 libxml2 libxmu6 libxrender1 \
                 libxss1 libxt6 xterm x11-xkb-utils xkb-data zlib1g
```

* ダウンロードしたファイルを解凍してインストーラーを起動します。

```bash
tar xvf salome_meca-2020.0.0.1-1-universal.tgz && ./salome_meca-2020.0.0.1-1-universal.run`
```

このインストーラーは、任意のディレクトリにsalome_mecaをインストールし（ディレクトリパスにアクセントを含まないように注意してください）、デスクトップ上に自動的にショートカットを作成し、そこからsalome_mecaを起動することができます。

* グラフィカルライブラリのパッチ

仮想システム（VirtualBox、VMWareなど）の場合、Ubuntu 18.04 LTSを構成し、Salome-Mecaのインストール後にグラフィカルライブラリのパッチを適用します。

パッチを[https://www.code-aster.org/FICHIERS/sm2019VM/sm19_ubuntu18_xtlibs.tgz](https://www.code-aster.org/FICHIERS/sm2019VM/sm19_ubuntu18_xtlibs.tgz)よりダウンロードします。

パッチを適用するディレクトリに移動します。

```bash
cd $HOME/salome_meca/appli_V2020_universal_universal/
```

ダウンロードしたファイルを解凍してパッチを適用します。

```bash
tar xvf sm19_ubuntu18_xtlibs.tgz && rm -f sm19_ubuntu18_xtlibs.tgz
```

```bash
mv salome salome_gpu
wget https://www.code-aster.org/FICHIERS/sm2019VM/salome --no-check-certificate -O salome_mesa && chmod ugo+x salome_mesa
ln -s salome_mesa salome 
```

* salome_meca 2020を起動します。

```bash
cd appli_V2020_universal_universal
./salome
```

# 新機能

このバージョンの注目すべき点は、SystusまたはAbaqusフォーマットからMEDフォーマットにメッシュを変換するための新しいツールであるMEDConverterです。

* Meshモジュールのメニューバーより、Tools>Plugins>salome_meca>Mesh Convverterで起動

![MEDConverter.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201403/58e9bb05-22e6-58fa-7244-86951cf61743.png)

このバージョンでは、**AsterStudy 2020.0.1**が統合されています。この新バージョンのモジュールは大きな進化を遂げており、主な新機能は以下の通りです。

* Code_Aster計算を起動する際の人間工学的な操作性を向上させるため、実行機能と対応するAsterstudyの「履歴表示」パネルの再設計。
* パラメータキャリブレーションの実行を目的としたスタディのエクスポート（ベータ版）。

# サポートされているLinuxディストリビューション

このバージョンは以下の64bitsのLinuxディストリビューションで動作確認済みです。

* Debian 9.

古いバージョンは GLIBC_2.23 を更新することでサポートされるかもしれませんが、開発チームはテストしていません。
Go言語に入門する -MacOS * VSCode で開発環境を構築して”Hello World"を出力する-

# 目標

本記事の目標は下記です。

- MacOSにGo言語の開発環境を構築する。
- "Hello World" を出力する。

# 環境情報

```
$ sw_vers
ProductName:	macOS
ProductVersion:	11.2.2
BuildVersion:	20D80
```

# 開発環境構築

# 1. GOをインストールする

```
$ brew install go
```

## 1.1. インストールできたことを確認する

```
$ go version
go version go1.16 darwin/amd64
``` 

# 2 VSCodeに拡張機能をいれる

## 2.1 MarketPlaceでgoと検索して、一番上に出てくる拡張機をインストールする

![スクリーンショット 2021-02-27 17.49.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487075/dd984e92-c980-aa56-1607-ae748c4b1d02.png)

## 2.2 インストールした拡張機能を動かすのに必要なパッケージをインストールする

### 2.2.1 コマンドパレットで Go: Install/Update Tools　と入力する
![スクリーンショット 2021-02-27 18.10.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487075/b334375f-ac94-1d26-5cb7-4f9dc5486ecd.png)

### 2.2.2 インストールしたいパッケージにチェックを入れてOK押下
![スクリーンショット 2021-02-27 18.11.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487075/24e53e9c-4924-daae-41d8-351b0f80ed62.png)

全部入れなくてもいいっぽいんだけど、とりあえず全部いれておけば動くでしょう。

![スクリーンショット 2021-02-27 18.17.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487075/011ec9b2-d8c0-ec8b-c41e-553fac5196e0.png)

インストールできました。


# 3. "Hello World" する

## 3.1 適当なディレクトリにhelloworld.go を作成して、VSCodeで実行する。

```go:helloworld.go

package main

import "fmt"

func main() {
	fmt.Printf("Hello world")
}

```
![スクリーンショット 2021-02-27 19.15.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487075/40029ef4-71f3-0c4b-3a28-cd98372f410a.png)


無事動きました！！

# 参考

- [vscode-go(インストールした拡張機能）のreadme](https://github.com/golang/vscode-go/blob/master/README.md)
- [macOSにGoの開発環境をインストール（備忘録） - Qiita](https://qiita.com/kizitorashiro/items/be6e86bdbbccc6d8a0d3)
Next.jsとtailwindを使ってダークモードをサクッと実装する

## 初めに
最近、`Next.js`に`Tailwind CSS`で作成した個人ブログにダークモード機能を追加したので、その備忘録として。

## Tailwindのダークモードを有効化する

[TailwindのV-2](https://blog.tailwindcss.com/tailwindcss-v2)からダークモードが組み込まれており、ダークモード時に指定の色に切り替えてくれるようになりました。

ダークモードを有効化するのは簡単で、`tailwind.config.js`の`darkMode`に`class`か`media`を指定するだけです。`media`を指定した場合は、OSの設定に基づいて、自動でdarkモードに切り替えてくれますが、今回はユーザーがページ上でON/OFFの切り替えが出来るようにしたいので、`class`を指定して、ダークモードを有効化させます。

詳細は[Tailwindのドキュメント](https://tailwindcss.com/docs/dark-mode)に記載されてます。

```js:tailwind.config.js
module.exports = {
  purge: [],
  darkMode: 'class', //ダークモードを有効化する
  theme: {
    extend: {
      colors: {
        darkgrey: '#222831', //darkModeで使用したい色を拡張定義
      },
    },
  },
  variants: {
    extend: {
},
  },
  plugins: [],
};
```



## next-themesをインストールする

次にボタンを押下した際に、htmlタグのclassに対して`dark`をアクティブ/非アクティブにするための実装が必要になります。

```html:htmlタグのclassにdarkを付与できるようにする必要がある
<html class="dark">
```

Tailwindのダークモードは、htmlタグのclassに`dark`が付与されてる場合、以下のような記述で、ダークモード時の色を指定する事が出来ます。

```html:dark:{class}でダークモード時の色を指定できる
<div className="dark:bg-darkgrey dark:text-white">
```

ドキュメントには現在のモードをlocalStorageに保存する方法が紹介されていますが、ここでは、`next-themes`というライブラリを使って実装を進めます。

[next-themes](https://github.com/pacocoursey/next-themes)

```terminal:next-themesをインストール
$ npm install next-themes
# or
$ yarn add next-themes
```
ライブラリをインストールしたら、`_app.js`に`ThemeProvider`をimportします。
attributeには`class`を指定しましょう。（※Tailwindのダークモードを使用するには、この記述が必要です）

```react:_app.tsx
import '../../styles/globals.css';
import '../../styles/common.css';
import { AppProps } from 'next/app';
import { ThemeProvider } from 'next-themes';

function MyApp({ Component, pageProps }: AppProps) {
  return (
    <ThemeProvider attribute="class">
      <Component {...pageProps} />
    </ThemeProvider>
  );
}

export default MyApp;
```
## ダークモードを切り替えるボタンを作成する

切り替えるボタンは以下のようにしました。
`useTheme()`フックを利用して、テーマの切り替えを制御します。

```react
import { useTheme } from 'next-themes';

const { theme, setTheme } = useTheme();

// レンダー後かを判定
const [mounted, setMounted] = useState(false);
useEffect(() => setMounted(true), []);

<button
  aria-label="DarkModeToggle"
  type="button"
  className="p-3 h-12 w-12 order-2 md:order-3 absolute left-2/4 transform -translate-x-2/4 md:relative md:left-0"
  onClick={() => setTheme(theme === 'dark' ? 'light' : 'dark')}
>
  {mounted && (
    <>
      {theme === 'dark' ? (
        <Moon height={'25'} width={'25'} />
      ) : (
        <Sun height={'25'} width={'25'} />
      )}
    </>
  )}
</button>
```

後は、Tailwindのいつもの書き方でダークモード時の色を指定してあげるだけです。

```html:dark:{class名}を指定
<div className="relative mb-10 dark:bg-darkgrey">
...
</div>
```

以上、これでお手軽にダークモードを実装することが出来ます。
C# - Buttonのサンプル　コードべた書き（Visual Studio不使用）

目次： [C# - Windows Formsでよく使うコントロールたち （Visual Studioなし環境向け） - Qiita](https://qiita.com/kob58im/items/a6cff48ce6bfbcf41c39)

# 画面キャプチャ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438183/5ac76e59-91df-dbe1-acdc-95fc3754fed4.png)


# テンプレ


```csharp

using System;
using System.Drawing;
using System.Windows.Forms;

class ButtonSample:Form
{
    ButtonSample()
    {
        var button = new Button(){
            Location = new Point(10, 10),
            Size = new Size(150, 25),
            Text = "push",
        };
        Controls.Add(button);

        button.Click += ButtonClick;
        // button.Click += (sender,e)=>{MessageBox.Show("clicked!");};
    }

    void ButtonClick(object sender, EventArgs e)
    {
        MessageBox.Show("clicked!");
    }

    [STAThread]
    static void Main()
    {
        Application.Run(new ButtonSample());
    }
}
```


# 参考サイト

 - [Button Class (System.Windows.Forms) | Microsoft Docs](https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.button?view=netframework-4.8)
 - [Button - C#プチリファレンス](https://csharp-ref.com/form_button.html)
VSCode内のターミナルをカレントディレクトリから起動する

# VSCode内のターミナルをカレントディレクトリから起動する
## 環境
Ubuntu 18.04

## すること 
VSCodeのSettings(Ctrl+,)に入ってterminal currentとかで検索し${fileDirname}と入れる。

![Settings.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/359163/7961dd66-f50c-2521-c2ea-a730c9c1a693.png)

setting.jsonからしたい人はこれを追加

```javascript:setting.json

"terminal.integrated.cwd": "${fileDirname}",

```
C# - ステータスバー(StatusStrip)のサンプル　コードべた書き（Visual Studio不使用）

目次： [C# - Windows Formsでよく使うコントロールたち （Visual Studioなし環境向け） - Qiita](https://qiita.com/kob58im/items/a6cff48ce6bfbcf41c39)

# 画面キャプチャ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438183/b696bcf6-1d56-fe69-925f-e52d49254388.png)


# テンプレ


```csharp

using System;
using System.Drawing;
using System.Windows.Forms;

class StatusStripSample:Form
{
    ToolStripStatusLabel statusLabel;

    StatusStripSample()
    {
        var statusStrip = new StatusStrip();
        Controls.Add(statusStrip);
        
        statusStrip.Items.Add(statusLabel = new ToolStripStatusLabel(){
            Text = "This is a sample.",
        });
    }

    [STAThread]
    static void Main()
    {
        Application.Run(new StatusStripSample());
    }
}
```


# 参考サイト

 - [StatusStrip Class (System.Windows.Forms) | Microsoft Docs](https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.statusstrip?view=netframework-4.8)
 - [ステータスバーに文字列を表示する - .NET Tips (VB.NET,C#...)](https://dobon.net/vb/dotnet/control/sbtext.html)
GMOペパボの社名で学ぶRubyの順列の使い方(ネタ記事)

# GMO「ペパボ」って覚えにくくね？

「[Suzuri]()」、「[minne]()」、「[ロリポップ!]()」などでおなじみGMOペパボ株式会社ですが、ことその独特な社名に至ってはユニークである一方で、Webに関わりがある人たちからも社名の言い間違いを耳にすることがあります。


「ペ」と「パ」と「ボ」で作れる単語を順列を用いて表すと、

```ruby:Ruby
puts ["ペ","パ","ボ"].permutation(3).to_a.map(&:join)

```

```:出力
ペパボ
ペボパ
パペボ
パボペ
ボペパ
ボパペ

```

となります。
おお、確かにややこしい...。

さらに重複を許すような音の選び方であれば

```ruby:Ruby
puts ["ペ","パ","ボ"].repeated_permutation(3).to_a.map(&:join)

```

```:出力
ペペペ
ペペパ
ペペボ
ペパペ
ペパパ
ペパボ
ペボペ
ペボパ
ペボボ
パペペ
パペパ
パペボ
パパペ
パパパ
パパボ
パボペ
パボパ
パボボ
ボペペ
ボペパ
ボペボ
ボパペ
ボパパ
ボパボ
ボボペ
ボボパ
ボボボ

```

となります。


[パペポ](鶴瓶上岡パペポTV)、[バベポ](https://www.mcd-holdings.co.jp/news/2015/promotion/promo1015a.html)、[ぺこぱ](https://www.sunmusic-gp.co.jp/talent/pekopa/)等似ている固有名詞が存在していることも我々を混乱させる要因なのかもしれませんね。

じゃあどうやって覚えればいいかというと、そもそもの[沿革](https://pepabo.com/company/history/)としてペパボ社は2003年に「paperboy&co.」という名称になったことから名前が取られてるそうです。

ペーパーボーイ -> **ペパボ** 、なるほど！これなら忘れませんね！


# 終わりに

東証一部上場記念キャンペーンに応募したら手ぬぐいをいただいたので何かお礼がしたいと思い、また[こちら(ヌジョレーボーボー)](https://qiita.com/mattn/items/ae764601862b0073071e)にインスピレーションを受け、この怪文書を書きました。

一人でもペパボ社の名称を間違えることが減ることとますますの繁栄を祈っています。

おわり。
【JavaScript】 海外Teck系YouTuberを真似てみた！(part 3) Task Tracker App | React JS

#１，はじめに
この記事は、海外Teck系YouTuberの動画を参考に、同じプロジェクトを作成してみたものになります！

簡単にですが、動画を通して学べた技術や知識をまとめました！

今回の完成品は、下記に載せています:bangbang:

#２，学んだこと
今回はさらに発展して、Reactのモジュール（**Route**や**Link**）なども使ってページ遷移も行いました！
**async** **await** の技術も使っているので、内容が盛り沢山でした:star:

今回は、

①　async await の使い方
②　JSONサーバーをローカルの5000portに立ち上げて、そこにデータを保存する方法
③　フォーム画面から値を受け取る方法
④　**onClick**、 **onToggle**、 **onDelete**、 **onDoubleClick**、 **onChange**

async await の考え方を理解していないと、終盤についていくのが大変でした:joy:

#３，参考動画
[![IMAGE ALT TEXT HERE](http://img.youtube.com/vi/w7ejDZ8SWv8/0.jpg)](http://www.youtube.com/watch?v=w7ejDZ8SWv8)

https://youtu.be/w7ejDZ8SWv8

#４，完成品です:tada:
左がJSONサーバーの様子で、右がブラウザ表示になります！

![2021-02-28_04h28_37.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654025/10799e42-7338-449d-be97-4202da05b906.gif)

#５、最後に
今回は、かなり手ごたえがありました！
特に**async** **await** の考え方をもう一度振り返る必要があると感じました！
次回も、Reactを使ったプロジェクトにトライしてみます。
AWS初期設定メモ（2021/02/28時点）

### IAMで作業用ユーザーを作成
省略。

### 二要素認証の設定
省略。

### CloudWatchで料金アラートを設定

1. 右上のユーザー名からトグルを開き、「マイ請求ダッシュボード」を選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403060/c4804f59-7fb7-27e0-13a8-4e27962b09e4.png)

1. サイドメニューの「Billingの設定」を選択し、画像の通りに設定する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403060/dee39ebb-c61f-a05f-f45c-f0203d2b1bb4.png)

1. 上記画像の「請求アラートを管理する」リンクを選択。

1. CloudWatchの画面が表示されるので、サイドメニューから「請求」を選択。

1. 「アラームの作成」ボタンをクリック。

1. 条件を設定する画面になるので、閾値を設定し、アラームを作成する。
（ここでは50 USDを超えた場合に設定し、それ以外はデフォルトで登録）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403060/d661c22d-8b00-d81c-32bb-a7b8f9cb1493.png)

### CloudTrailで操作ログをS3に保存する
1.メニューから CloudTrailの画面に遷移し、「証跡の作成」を選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403060/381d5d8f-1078-46ad-aa18-eacf6ec313f5.png)

1. 「証跡名」を設定して作成
  1. マルチリージョンの証跡が有効になっていることを確認する。
  2. S3バケット上に保存される設定になっていることを確認する。
一定時間で自動で生成されて勝手に消えてしまうファイルをBashコマンド1行でモニタリングし続ける

#一定時間で自動で生成されて勝手に消えてしまうファイルをBashコマンド1行（ワンライナー）でモニタリングし続ける

うまくタイトルつけれないですが、自分のメモ+誰かの役に立てば幸いです。

この記事は下記のケースで役に立ちます。
 
- Linux環境で、あるディレクトリに一時ファイルが生成される。
- その一時ファイルの生成されるタイミング、消えるタイミングが追えない
- しかし、アプリ側でその一時ファイルを生成している設定を変更できない（したくない）
- ファイルが再度生成されても連続でずっとファイルの中身を監視したい

## 御託はいいから、方法だけ教えろという人のために ↓

```
filename=hoge.txt; while true; do tailf $filename 2>/dev/null; done
```


## 本当にそんなコマンド必要？

実際大きいシステムを共通の環境で動かしている場合、勝手に設定をいじれたなかったりします。
そんな時にも、tmpファイルを追いたいケースが存在します。

###具体的なexampleケース
あるバッチシステム内で一時生成されるファイル **hoge.txt**があり、この**hoge.txt**はバッチシステムの終了と同時に消えてしまう。
さて、この**hoge.txt**の中身を確認したいのだが、バッチシステムの設定をいじれないので、ファイルに対する出力をモニタリングする。

##↑こんなケースを実際に作ってみよう

##### 実行時にファイルを生成し、実行終了時にファイルを削除するシェルスクリプト
まず、ターミナルAで下記のコマンド発行

```
$ filename=hoge.txt; while true; do tailf $filename; done
tailf: stat failed hoge.txt: そのようなファイルやディレクトリはありません
tailf: stat failed hoge.txt: そのようなファイルやディレクトリはありません
......
```

おっと、すごい勢いでエラーが出てしまった。
ファイルがない時のエラーは捨てます。（**標準エラー出力2**への出力を**/dev/null**にリダイレクト）
※当たり前ですが、tailfはファイルの末を出すコマンドであり、ファイルの中身のstdout,stderrは関係なくでるので安心してください。

```
$ filename=hoge.txt; while true; do tailf $filename 2>/dev/null; done
```


一方、ターミナルBで下記ファイルを生成

```
$ cat test.sh
#! /bin/bash

function end  () {
  rm hoge.txt
  exit
}


trap end 1 2 3 15
while true;
do
  echo "hogehoge" >> hoge.txt
  sleep 0.5
done
```
以下、簡単に解説

- hogehoge　と、1行ずつhoge.txtに出力し続け、Ctrl-Cで終了時にファイルを削除する。
- Bashのtrapコマンドにより、このシェルスクリプトが1 2 3 15のシグナルを受け付けた際に、
- end関数を呼び出す。このend関数でファイルを削除している。
 
参考:linuxのシグナルとtrapコマンドについて
https://shellscript.sunone.me/signal_and_trap.html

####ターミナルBでこのシェルを実行

```
$ chmod 755 test.sh
$ ./test.sh
※止まった状態
```

####一方その頃、ターミナルAは。。

```
hogehoge
hogehoge
...
hogehoge
hogehoge
hogehoge
```

hogehogeが出続けます。


####ここでターミナルBで

```
Ctrl-C　押下
$ ls hoge.txt
ls: hoge.txt にアクセスできません: そのようなファイルやディレクトリはありません
```
シェルスクリプトが強制終了され、hoge.txtが同時に消えました。


####そのころターミナルAは


```
hogehoge
hogehoge
...
hogehoge
hogehoge
hogehoge
止まっている
```


###ターミナルBでシェルを再実行すると
####ターミナルAは

```
hogehoge
hogehoge
...
hogehoge
hogehoge
hogehoge
hogehoge
hogehoge

```
また動き出した！

##結果
tailfコマンドは、ファイルが消えると終了してしまう。
ファイルがないとエラーになるので、/dev/nullに捨てる。
ただそれだけでしたね。（苦笑）

##コメント（独り言）
記事って難しいね。ニッチな方行こうとすると、うまくどんなケースで使えるのか説明しづらい。。
見にくいし、簡単だと思った方すみませんでした。
Bash芸人目指して力上げていきます。
PythonでTOTP(Time-based One-Time Password)を実行する

# TOTP(Time-based One-Time Password)について
最近、会社へのVPNへのログインでも銀行でもオンラインショッピングでも多要素の一つであるTOTPを使う機会が非常に増えました。仕組みをイマイチ理解しないまま使用しており、少々の不安とそのロバスト性に確信が持てていなかったので調べました。  

結果として、盗み見等にも強いロバストであることを確信できましたが、Authyのようなサービスを気軽に利用する怖さを実感いたしました。（secretを他人に渡してしまうということなので、google authenticatorがクラウド同期をサポートしない気持ちがわかりました）  

## 仕組み

完結に記すと以下の式になります

$$
password = hash(sercretkey, unixtime)
$$

これだけなのだがRFCという規格にても定義されており挙動が正確に記述されています  

ハッシュアルゴリズムは何らかのデータを一方通行で非常に強い非可逆性の強い変換を行い数値化でき、bitcoinや各種さまざまなセキュリティはこれに依存しています。  


Google AuthenticatorのいうところのTOTPはpythonで記すと以下のようなコードになります。  

***コード***

```python
import hmac, base64, struct, hashlib, time

def get_hotp_token(secret: str, intervals_no: int) -> str:
    # まずシークレットキーをデコード
    key = base64.b32decode(secret, True)
    # PythonのデータをCの構造体に変換
    msg = struct.pack(">Q", intervals_no)
    # ハッシュ値を計算
    h = hmac.new(key, msg, hashlib.sha1).digest()
    o = h[19] & 15
    h = (struct.unpack(">I", h[o:o+4])[0] & 0x7fffffff) % 1000000
    return str(h)

def get_totp_token(secret):
    # unix時間を30で割った整数をいれている
    x = get_hotp_token(secret=secret, intervals_no=int(time.time())//30)
    # 6桁に満たない場合は6桁になるまでパディング
    while len(x)!=6:
        x+='0'
    return x
```

***実行***

```python
# QRコード等で共有されたキー
secret = 'SOMETHINGSEC===='
print(get_totp_token(secret))

>> 829034
```

## 実際に自分で実行してみよう
Googleアカウントを持っている人ならばcolabでかんたんに再現できます。  

 - [Google Colab](https://colab.research.google.com/drive/1udvedDvjN_cVC5dc4YQiTuvQGjBcE-10?usp=sharing)

## 説明用のプレゼン資料

子供に説明するために作成しました（ふんわりしています）

<iframe src="https://docs.google.com/presentation/d/e/2PACX-1vSAE1QquRHNCDIU3FkM1eOI--NHdC5jnE14OgRrjbuVOxg-zQPMW8CDkrReuY6Gksm1PAPwZ0CaRUZs/embed?start=false&loop=false&delayms=3000" frameborder="0"  width="100%" height="569" allowfullscreen="true" mozallowfullscreen="true" webkitallowfullscreen="true"></iframe>

## 参考
 - [Understanding TOTP : In Python](https://medium.com/analytics-vidhya/understanding-totp-in-python-bbe994606087)
 - [Google Authenticator implementation in Python](https://stackoverflow.com/questions/8529265/google-authenticator-implementation-in-python)
Node.js版CCXTでbitFlyerのPrivate APIを使う

# はじめに
ccxt.js経由でbitFlyerの現在のポジション(建玉)を知りたかったのだが、ちょっと調べてもなかった。
詰まったので同様の問題に遭遇した人のためにも解決方法残しておこうと思う。

## コード

```javascript

const ccxt = require('ccxt')
const bitflyer = new ccxt.bitflyer({
    apiKey: env.apiKey, // APIキーを入れる
    secret: env.secret // シークレットをいれる
})
bitflyer.privateGetGetpositions({ product_code: 'FX_BTC_JPY' }).then(data => console.log(data))
```

## ちょっと解説
ccxtでPrivate APIを使うには、メソッドの命名に独自の法則を使っている

```
private + {メソッドがgetならGet、postならPost} + {private APIの名前}
```

上の例ではGetメソッドで`getpositions`APIを使いたいがために、`privateGetGetpositions`となる。
またクエリパラメータが必須なので、それはメソッドの引数としてオブジェクトを渡す。

## 参考
Python版だが以下の説明がわかりやすかった。
[Bitflyerや各取引所の個別APIをCCXTライブラリ経由で直接利用する方法](https://ryota-trade.com/?p=629)

使いたいbitFlyerのPrivate APIは以下を参照
[API Documentation](https://lightning.bitflyer.com/docs?lang=ja)
oc debugコマンドでOpenShiftノード上のファイルを直接操作する

# 目的

oc debugコマンドでOpenShiftのノード上のファイルを操作します。ただしファイルを変更するとノードが正しく実行できなくなる可能性があるのでご注意ください。

# 手順

## ノードの確認

```
$ oc get nodes
NAME          STATUS   ROLES           AGE    VERSION
10.244.0.4    Ready    master,worker   3d4h   v1.19.0+e49167a
10.244.0.5    Ready    master,worker   3d3h   v1.19.0+e49167a
```

## oc debugコマンドの実行

```
$ oc debug node/10.244.0.4
Starting pod/1024447-debug ...
To use host binaries, run `chroot /host`
Pod IP: 10.244.0.4
If you don't see a command prompt, try pressing enter.
sh-4.4# chroot /host
sh-4.2# ls -l
total 68
lrwxrwxrwx.   1 root root     7 Oct 14  2019 bin -> usr/bin
dr-xr-xr-x.   5 root root  4096 Feb 24 08:04 boot
drwxr-xr-x.  17 root root  2960 Feb 24 08:13 dev
drwxr-xr-x.  99 root root 12288 Feb 24 08:10 etc
drwxr-xr-x.   2 root root  4096 Dec 14  2017 home
lrwxrwxrwx.   1 root root     7 Oct 14  2019 lib -> usr/lib
lrwxrwxrwx.   1 root root     9 Oct 14  2019 lib64 -> usr/lib64
drwx------.   2 root root 16384 Oct 14  2019 lost+found
drwxr-xr-x.   2 root root  4096 Dec 14  2017 media
drwxr-xr-x.   2 root root  4096 Dec 14  2017 mnt
drwxr-xr-x.   8 root root  4096 Feb 24 08:10 opt
dr-xr-xr-x. 365 root root     0 Feb 24 08:03 proc
dr-xr-x---.   8 root root  4096 Feb 24 08:06 root
drwxr-xr-x.  34 root root  1000 Feb 24 08:12 run
lrwxrwxrwx.   1 root root     8 Oct 14  2019 sbin -> usr/sbin
drwxr-xr-x.   2 root root  4096 Dec 14  2017 srv
dr-xr-xr-x.  13 root root     0 Feb 24 08:03 sys
drwxrwxrwt.  10 root root  4096 Feb 27 12:20 tmp
drwxr-xr-x.  13 root root  4096 Oct 14  2019 usr
drwxr-xr-x.  20 root root  4096 Feb 24 08:07 var

sh-4.2# exit
exit
sh-4.4# exit
exit

Removing debug pod ...
```
Laravel8のdatetime型をjson出力するとYYYY-MM-DDT00:00:00.000000Z(ISO8601)で出力される

#はじめに
モデルからdatetime型のカラムを取得し、jsonで出力すると
日付がYYYY-MM-DDT00:00:00.000000Z(ISO8601)で出力される。
調べてみるとlaravel７から変更された仕様とのこと。
■参考URL
https://laravel.com/docs/8.x/eloquent-serialization#date-serialization

楽観排他チェックに更新日を使っているため、ISO8601では困る。
共通で日付を変換できるように修正する。

#対応方針
```\vendor\laravel\framework\src\Illuminate\Database\Eloquent\Concerns\HasAttributes.php
    /**
     * Prepare a date for array / JSON serialization.
     *
     * @param  \DateTimeInterface  $date
     * @return string
     */
    protected function serializeDate(DateTimeInterface $date)
    {
        // return Carbon::instance($date)->toJSON();
        return $date->format('Y-m-d H:i:s');
    }
```
よくはないがフレームワーク内を修正。

#終わり
参考サイトではserializeDateをオーバーライドすると書いてあるが、
どうすればいいかわからず。
とりあえずの対処方法を残します。
[Kotlin] 基本文法(1) 記録


## &nbsp;&nbsp;[はじめに] 

普段Javaを使ってAndroidの開発をしていく中で
Kotlinの言語も身に付けたいと思っていました。
Kotlinの基本文法からJavaの言語との違い、また簡単な機能の実装まで
自分のために文字で残したいと思い記述を始めさせていだだきます。
日本人ではないので日本語の間違いや誤字があるかもしれないですが、
優しい指摘やアドバイスはいつでも大歓迎です。



## [1. 関数(メソッド) ]

 
 基本的な関数の書き方

```diff_kotlin


 fun helloWorld() : Unit {
     //Unitはreturnの型でJavaのVoidと同じ(Unitなら省略可能)
     println("Hello World!") 
     //JavaのSystem.out.println(); 
     //最後につける ; は要らない
 }


 fun add(a : Int , b : Int) : Int { 
     //Javaは public Int add(Int a , Int b){ <- Typeが前ですがKotlinでは後ろにくる 
     //    return a+b 
     //}  

     return a+b  //returnの型がIntなのでInt型を返す 
 }

```

## [２. val vs var ]

Kotlinで使われている　valとvarは？

```diff_kotlin
 
   val a: Int = 10  // Javaでは final int a = 10; 

   // valはimmutable referenceで valueを略したもの
   // 再代入できない参照を保つ変数
   // a = 20 a に 20を代入しようとしたら NG!
   
   var b:Int = 9   // Javaでは int b = 9; 
   //varはmutable referenceでvariableを略したもの
   //再代入できる関数
   //例 b = 10   

   //最初に値を代入すると自動で型を認識する
   val a = 10
   var b = 9 
   var c = "String"

   val a  //宣言の時、値を代入しない場合は型を書かないとNG
 
```

## [3. String Template ]

String方の書き方 

```diff_kotlin

  val firstName = "Hiyoko"  // val firstName:String = "Hiyoko"
  val lastName = "Nakamura" // val firstName:String = "Nakamura"

  print("my name is $firstName ") 
  //出力 - > my name is Hiyoko

  //宣言したnameを $を 使ってかく
  //JavaではSystem.out.print("my name is" + name);
 
  print("my name is ${firstName +" "+ lastName}, 29 years old ") 
  //出力 - > my name is Hiyoko Nakamura, 29 years old
  // ＄{変数名} で　変数って言うことを認識する

```


## [4. 条件式 ]

　Javaでの条件式の例①

```diff_java

  public Int maxBy(Int a,Int b){
      if(a>b){
        return a
      }else{
        return b
      } 
  }
```

　Kotlinでの条件式の例①

```diff_kotlin
 //Javaでの条件式の例① と同じ結果が出る
 fun maxBy(a:Int , b:Int): Int {
   if(a>b){
    return a
   }else{
    return b
   }
 }
```

　Javaでの条件式の例②

```diff_java

  public Int maxBy(Int a,Int b){
      return (a>b) ? a : b
  }
```
　Kotlinでの条件式の例②

```diff_kotlin
 
 fun maxBy(a : Int,b:Int ) = if(a>b) a else b
 //Javaでの条件式の例② と同じ結果が出る
```
マルチステージビルドしたらStreamlitが動かなくなった

Streamlitはpythonのアプリケーションフレームワークで、簡単にデータの可視化や機械学習モデルのアプリを作成できるて便利。

今回はStreamlitをDocker上で構築して動かしていたのですが、機械学習のDockerイメージはどうしてもイメージサイズがデカくなってしまうのでマルチステージビルドで軽くしちゃおうと思ったら動かなくなりました。というお話。

# 修正前

```requirements.txt
streamlit
plotly
pandas
scikit-learn
```


```dockerfile
FROM python:3.7
USER root

EXPOSE 8501

WORKDIR /streamlit-docker

COPY requirements.txt /streamlit-docker

RUN pip install -r requirements.txt

CMD streamlit run app.py

ENV LC_ALL=C.UTF-8
ENV LANG=C.UTF-8

RUN mkdir -p /root/.streamlit
RUN bash -c 'echo -e "\
            [general]\n\
            email = \"\"\n\
            " > /root/.streamlit/credentials.toml'

RUN bash -c 'echo -e "\
            [server]\n\
            enableCORS = false\n\
            " > /root/.streamlit/config.toml'
```


この状態でもしっかり動くのですが、今回はdockerイメージサイズを減らすために変更しました。

# マルチステージビルド

```Dockerfile
FROM python:3.7-buster as builder

COPY requirements.txt /streamlit-docker

RUN pip install -r requirements.txt

FROM python:3.7-slim-buster as runner

COPY --from=builder /usr/local/lib/python3.7/site-packages /usr/local/lib/python3.7/site-packages
COPY --from=builder /usr/local/bin/streamlit /usr/local/bin/streamlit

WORKDIR /streamlit-docker

USER root

EXPOSE 8501

CMD streamlit run app.py

ENV LC_ALL=C.UTF-8
ENV LANG=C.UTF-8

RUN mkdir -p /root/.streamlit
RUN bash -c 'echo -e "\
            [general]\n\
            email = \"\"\n\
            " > /root/.streamlit/credentials.toml'

RUN bash -c 'echo -e "\
            [server]\n\
            enableCORS = false\n\
            " > /root/.streamlit/config.toml'
```

pythonのマルチステージビルドは以下の記事を参考にしました。
・[Pythonの機械学習用Docker imageのサイズ削減方法の紹介](https://www.m3tech.blog/entry/reduce-python-docker-image-size)
・[仕事でPythonコンテナをデプロイする人向けのDockerfile (1): オールマイティ編](https://future-architect.github.io/articles/20200513/)

この状態でコンテナを立ち上げるとエラーが出ます。

```cmd
/bin/sh: 1: streamlit: not found
```

どこで引っかかってるかというと、Dockerfileのこの部分です。

```
CMD streamlit run app.py
```

要するにpathを通せてないよって言われてます。

# 解決法
streamlitの通すパスを見つけるためにマルチステージビルド前の動くコンテナを使って調べます。
whichコマンドでコマンドのフルパスを表示させます。

```
>> which streamlit
/usr/local/bin/streamlit
```

通すパスがわかったので、dockerfileを修正します。
1. ビルドステージから/usr/local/bin/streamlitをコピー
2. ENVコマンドでPATHを通す
これで動きました。

```dockerfile
FROM python:3.7-buster as builder

WORKDIR /streamlit-docker

COPY requirements.txt /streamlit-docker

RUN pip install -r requirements.txt

FROM python:3.7-slim-buster as runner

COPY --from=builder /usr/local/lib/python3.7/site-packages /usr/local/lib/python3.7/site-packages
# 追加
COPY --from=builder /usr/local/bin/streamlit /usr/local/bin/streamlit
ENV PATH $PATH:/usr/local/bin/streamlit

WORKDIR /streamlit-docker

USER root

EXPOSE 8501

CMD streamlit run app.py

ENV LC_ALL=C.UTF-8
ENV LANG=C.UTF-8

RUN mkdir -p /root/.streamlit
RUN bash -c 'echo -e "\
            [general]\n\
            email = \"\"\n\
            " > /root/.streamlit/credentials.toml'

RUN bash -c 'echo -e "\
            [server]\n\
            enableCORS = false\n\
            " > /root/.streamlit/config.toml'

```
初心者のためのマークダウン記法

#はじめに
これからQiitaへ自分の知識のアウトプットや備忘録を書くぞ！と決意したが、
そもそも**マークダウン記法**の書き方すら知らなかった・・・。

そのため、マークダウン記法の自主練習も兼ねてマークダウン記法ついてアウトプットしていきたいと思う。

#1.はじめに
下記のように、実際の表示例→マークダウンでの記入方法の順で紹介していく。

　【表示】
　　↓
　【記入法】


私が自分のために書き示す備忘録のようなもののため、本当に使用する記法だけを抜粋しています。

【参考サイト】
[Markdown記法 チートシート](https://qiita.com/Qiita/items/c686397e4a0f4f11683d "Markdown記法 チートシート")

#1.コードの挿入
【表示】

```ruby:sample.rb
  puts "Hello World"
```
　　↓
【記入法】

\`\`\`ruby:sample.rb
  puts "Hello World"
```

バッククォートを3つ前後につけるとコードが表示される。前後に空行を入れる必要あり。
最初の行に「ruby:sample.rb」などとつけるとコードが言語に応じてカラーリングされ、左上にファイル名が表示される。
※Macの場合は、shiftキー＋@のキーでバッククォートは表示される。

#2.コードのインライン表示
【表示】
コード`puts "Hello World"`をインラインでも表示できる。

【記入法】
コード\`puts "Hello World"`をインラインでも表示できる。

インラインしたい部分に''シングルクォーテーションをつける

#3.テキストの装飾
ここは見ればわかるので羅列していきます。
【表示例】
#H１見出し
##H2見出し
###H3見出し
####H4見出し

これは *イタリック体* です。

これは **太文字** です

これは　~~打ち消し線~~　です.

【記入例】
\#H１見出し
\##H2見出し
\###H3見出し
\####H4見出し

これは \*イタリック体* です。

これは \*\*太文字\*\* です

これは　\~\~打ち消し線\~\~　です.

#4.テキストの折り畳み
【表示例】


<details><summary>これはテキストを折り畳みます。</summary><div>

```rb:details.rb
puts "Hello World"
```

</div></details>


【記入例】
\<details>\<summary>これはテキストを折り畳みます。\</summary>\<div>

\`\`\`rb:details.rb
puts "Hello World"
\`\`\`

\</div>\</details>

#5.箇条書き・数字付き箇条書き・チェックボックス
【表示】

* Disc型リスト１
* Disc型リスト２
* Disc型リスト３

【記入例】

\* Disc型リスト１
\* Disc型リスト２
\* Disc型リスト３

****


【表示】

1. Disc型リスト１
2. Disc型リスト２
3. Disc型リスト３

【記入例】

\1. Disc型リスト１
\2. Disc型リスト２
\3. Disc型リスト３

****


【表示】

* [ ] Disc型リスト１
* [x] Disc型リスト２
* [x] Disc型リスト３

【記入例】

\* [ ] Disc型リスト１
\* [x] Disc型リスト２
\* [x] Disc型リスト３

#6.引用
【表示】
>これは引用文です
>>これはネストした引用文です

【記入例】
\>これは引用文です
\>>これはネストした引用文です

#7.リンク
【表示】

[こちらはリンクです](https://qiita.com/Qiita/items/c686397e4a0f4f11683d#gist%E9%80%A3%E6%90%BA%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6--2019%E5%B9%B41%E6%9C%888%E6%97%A5%E6%8F%90%E4%BE%9B%E7%B5%82%E4%BA%86　"qiitaのトップページ")

【記入例】
\[こちらはリンクです](https://qiita.com/Qiita/items/c686397e4a0f4f11683d#gist%E9%80%A3%E6%90%BA%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6--2019%E5%B9%B41%E6%9C%888%E6%97%A5%E6%8F%90%E4%BE%9B%E7%B5%82%E4%BA%86　"qiitaのトップページ")

#8.画像の埋め込み
【表示】

![画像を埋め込みます](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/765745/0892f57f-08ae-0247-ef2a-e95565a52bb2.png
 "画像タイトル")

【記入例】

\![画像を埋め込みます]\(https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/765745/0892f57f-08ae-0247-ef2a-e95565a52bb2.png
 "画像タイトル")


#おまけ
バックスラッシュ[\]をMarkdownの前に挿入することで、Markdownをエスケープ(無効化)することができます。
変数展開に失敗しCircleCIからHerokuへのpushに失敗した話

# 目的
- GitHubのmain(デフォルトブランチ)へpushしたらCircleCIが検知してHerokuへデプロイしてくれるようにする。

# 前提条件
- GitHub,Herokuは登録済み
- ローカル環境からGitHubへの`git push`は成功しCircleCIが検知してくれる環境は作成済み
- HerokuのAPI_KEYやAPP_NAMEなどの環境変数はCircleCIに登録済み

# 事象
- GitHubからCircleCIへのcheckoutは成功するがそこからHerokuへのpushが一向に成功しない。


**失敗例1**
![CircleCI_to_Heroku_push_miss.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1159336/eb54e74b-c7d7-6b04-4bed-e32314ff3910.png)

**失敗例2(変数展開は成功、別の要因でpushに失敗しているがそれは別記事で)**
![CircleCI_to_Heroku_push_miss2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1159336/93b6356e-7982-ddd3-49dd-cec000123dae.png)

両者とも失敗しているが違いは以下である。
**失敗例1**
`fatal: Authentication failed for 'https://heroku:@git.heroku.com/.git/'`
**失敗例2**
`fatal: Authentication failed for 
'https://heroku:************************************@git.heroku.com/*********************.git/'`

# 原因
- CircleCIの`config.yml`、contextの記述を忘れ変数展開に失敗し正しいURLでpush出来ていなかった。

[Contextについて詳細はこちら](https://circleci.com/docs/2.0/contexts/)

**失敗例**

```..circleci/config.yml
workflows:
  heroku_deploy:
    jobs:
      - deploy
jobs:
  deploy:
    executor: heroku/default
    steps:
      - checkout
      - heroku/install
      - run: echo $HEROKU_API_KEY       # 変数展開に失敗し空白が出力される
```


# 解決策

**成功例**

```..circleci/config.yml
workflows:
  heroku_deploy:
    jobs:
      - deploy:
          context: {コンテキスト名} # ここでコンテキストに紐づいた環境変数を明示しなければいけない。
jobs:
  deploy:
    executor: heroku/default
    steps:
      - checkout
      - heroku/install
      - run: echo $HEROKU_API_KEY      # 変数展開に成功しCircleCI上に設定された環境変数が出力される。
```

無事展開されpush出来た。(本当はもう少し別のとこでハマっているがそれはまた別の記事にする)
![CircleCI_to_Heroku_push_success.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1159336/d658f8f5-2fac-aa03-aee2-bda296f10969.png)

# 所感
地獄、エラーメッセージに`Run heroku login to`とあるので認証が失敗しているのかと思いそっち方面で調査してしまい、異常なハマり方をしてしまった。
後、CircleCI + Heroku連携で「CircleCIでは変数を展開するためにContextを利用する」ということに言及している記事が見当たらずハマってしまった。
昔は別にContextを明示しなくてもそのまま展開できてた気がするのだがいつぞやから明示しないといけなくなった？
そのため当時の記事では特に言及していない？というところまで考えたが真相は謎。
ConoHaでDNSの設定をするときはwwwのないAも指定する

こちらの記事 （https://hombre-nuevo.com/vps/vps0009/） を見て設定をしていたら、Let's Encryptで証明書を取得する時に以下のようなエラーが出てしまったので、メモ

```
IMPORTANT NOTES:
 - The following errors were reported by the server:

   Domain: www.yugawa.la
   Type:   dns
   Detail: DNS problem: SERVFAIL looking up CAA for www.yugawa.la -
   the domain's nameservers may be malfunctioning
```

リンク先の記事ではAタイプのIPアドレス設定をwwwに対してのみしてましたが、デフォルトに対してもしたほうがよさそうです。（設定するときは空欄で）
そのようにしたら証明書が無事発行できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545780/6aba1ebf-db7e-5886-9532-ed693e28705c.png)
Splunkでループ処理ってどうやるの？ 邪道な方法だが実行してみた


# はじめに

Splunkの SPLってめちゃくちゃ便利なんですが、唯一困るのがループ処理になんですよね〜。一部の streamingコマンド (eval, regex, rename など）は foreach コマンドで実装可能なのですが、それ以外のコマンド (stats,timechartなど） だと、このforeachコマンドが使えません。 

例えば、複数の型番をリストして、その型番ごとに色々と計算した結果を表示したい。などの場合には以下のようなプロセスが必要です。
1. 型番をリスト化
2. 型番を一つごとに計算処理を実行
3. 同じことを全部の型番に対してループで実行　

最近は機械学習などと組み合わせる機会も多く、このようなループ処理は避けては通れなくなってきております。

そこで、今回は邪道かもしれませんが、 RestAPIを利用してリモートからループ処理を実行するパワープレイをご紹介します。 (Splunkだけでシンプルにできる方法知っていたら是非教えてください)

# 構成概要イメージ

今回はこんな感じでループ実行させます。 pythonで実行させるので、運用の中で定期実行が必要な場合は lambda などと連携するといいと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/e2eb5b52-deed-19af-ab7c-452081559339.png)


# Splunk側での準備

Splunk側では RestAPIが利用できるようにデフォルト管理ポートの8089ポートへのアクセス許可。そして、実行したいループ処理をマクロ設定しておきます。（こうしておくとコードがシンプルになります。短いSPLなら不要です）

今回は以下のような マクロ(make_price_feature)を作成しました。引数でループさせる値が入るようにしておきます。以下の場合、引数で入れた値(code)が "Local Code" に入るようにしております。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/0f20c918-d21c-9dc9-eac0-701da8ede607.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/38d6d2fb-7b0c-a58b-e646-1a430a87342e.png)


上記にあるとおり、コード毎に streamstats や、 autoregress を使っているため、foreachでは実行できませんでした。

# python実装

コードをこちらにご紹介します。変数指定箇所と、最初のList取得のためのSPLを変更すれば流用できます。


```
# 変数指定
SERVER = 'https://<hostname>'   # Splunk Server URL (do not include port)
USER =  '<user-name>'
PASSWD = '<passwd>'
MACRO = 'make_price_feature'  # Splunkのマクロ名
OUTPUT = 'test.csv'   # 最後に結果を書き込む lookup file名

# List 取得のための SPL 
search_list_query = """
search index=hoge source=*stock_price.csv | table "Local Code" | dedup "Local Code"
"""
```

以下のコードはそのままコピーで使えます。

```
##  リストデータの取得
import requests

data = {
  'search': search_list_query,
  'exec_mode': 'oneshot',
  'output_mode': 'json',
  'count': '0'   # default だと 100個しかリターンされない
}

response = requests.post(SERVER + ':8089/services/search/jobs' , data=data, verify=False, auth=(USER, PASSWD))

## 出力結果のうち、値だけを抜き出す
lists = list()
result=response.json()['results']
for i in result:
  lists.append(list(i.values()))

# 抜き出した値ごとに、特定のマクロを実行させて、最後はファイルに保存
for j in lists:

  data1 = {
    'search': '| `' + MACRO + '(' + j[0] + ')` | outputlookup ' + OUTPUT + ' append=t',
    'exec_mode': 'oneshot',
    'output_mode': 'json'
  }
  response = requests.post(SERVER + ':8089/services/search/jobs' , data=data1, verify=False, auth=(USER, PASSWD))

```

# さいごに

この仕組みを使えばループに限らず、複雑な処理をプログラミングを組むことができますね。

[こちら](https://github.com/maroon-spec/qiita/blob/master/splunk_loop_sample.py)にも上記のコードを置いておきますので、ご自由にご利用ください。
macでpip install psycopg2が通らない時

macにposgreをインストールして、djangoと連携させたいだけだったんです。


```
    ld: library not found for -lssl
    clang: error: linker command failed with exit code 1 (use -v to see invocation)
    error: command '/usr/bin/clang' failed with exit code 1
```

こんなメッセージがでてきて悲しいとき。


## 結論

```
export LDFLAGS="-L/opt/homebrew/opt/openssl@1.1/lib"
export PKG_CONFIG_PATH="/opt/homebrew/opt/openssl@1.1/lib/pkgconfig"
export CPPFLAGS="-I/opt/homebrew/opt/openssl@1.1/include"
```

を叩いたらいけた。

もともとPostgreSQLをインストールしたときに、

```
==> openssl@1.1
A CA file has been bootstrapped using certificates from the system
keychain. To add additional certificates, place .pem files in
  /opt/homebrew/etc/openssl@1.1/certs

and run
  /opt/homebrew/opt/openssl@1.1/bin/c_rehash

openssl@1.1 is keg-only, which means it was not symlinked into /opt/homebrew,
because macOS provides LibreSSL.

If you need to have openssl@1.1 first in your PATH, run:
  echo 'export PATH="/opt/homebrew/opt/openssl@1.1/bin:$PATH"' >> ~/.zshrc

For compilers to find openssl@1.1 you may need to set:
  export LDFLAGS="-L/opt/homebrew/opt/openssl@1.1/lib"
  export CPPFLAGS="-I/opt/homebrew/opt/openssl@1.1/include"

For pkg-config to find openssl@1.1 you may need to set:
  export PKG_CONFIG_PATH="/opt/homebrew/opt/openssl@1.1/lib/pkgconfig"

```


というメッセージがでてたはずなのでそれを叩いた上で `pip install` したらいけたというオチ。
[Firebase] Cloud Functions For Firebaseで deployコマンドだけで向き先を指定する

#はじめに

Cloud Functions For Firebaseを使ってアプリケーションを構築していると、デプロイの際に、ステージング環境と本番環境を指定すると思いますが、自分はその度に

```
firebase use "プロジェクトId"
npm run deploy
```
するのが非常に億劫でした。
ときにはプロジェクトIDを覚えてなくて、`firebase projects:list`でプロジェクトを一覧表示してIDをコピーするなんてこともしていました。

ですが、実はこちら、`firebase use `でプロジェクトを切り替えなくても、deployコマンドにオプションをつけるだけでいけちゃうことがわかったので紹介します。

# やり方

これだけです！

```
firebase deploy --project "プロジェクトID" --only functions
```

ただ、自動生成されたプロジェクトIDはわかりづらいことが多いので、.firebasercファイルに以下のように書くことでエイリアスを指定できます。

```json
{
  "projects": {
    "stg": "ステージング環境のプロジェクトID",
    "prod": "本番環境のプロジェクトID"
  }
}
```

上記のように定義した場合、デプロイコマンドは以下のようにかけます

```
firebase deploy --project "エイリアス" --only functions
```

あとはこれを以下のようにnpm scriptsに設定してあげればOKです

```json
"scripts": {
    ...
    "deploy": "npm run build && firebase deploy --project stg --only functions ",
    "deploy:prod": "npm run build && firebase deploy --project prod --only functions",
  }
```

# おわりに
Firebase便利ですね！
自分は最近仕事の都合でFirebaseのAWSバージョンのようなAmplifyを使うことが多いので、そちらに関する記事なんかもいずれかければと思います！
マルチステージビルドした時のMeCabエラーを回避する

# 概要
MeCabを使ったマルチステージビルドで詰まったのでメモを残します。
今回はasariというパッケージを使いたかったためmecab-python3のバージョンが低いです。
今度時間があればバージョン上げても動くか検証してみます。

# 環境
python 3.7
mecab-python3 0.7

# 修正前

```dockerfile:Dockerfile
FROM python:3.7-buster as builder

WORKDIR /work

RUN apt-get update \
    && apt-get install -y mecab mecab-utils libmecab-dev \
    && pip install -U pip

COPY requirements.txt /work

RUN pip install -r requirements.txt

FROM python:3.7-slim-buster as runner

COPY --from=builder /usr/local/lib/python3.7/site-packages /usr/local/lib/python3.7/site-packages

WORKDIR /work

CMD python sample.py
```

sample.pyの中身はmecabを使用したファイルとします

```python:sample.py
import MeCab
```

実行するとimportの際にエラーが出ます。

```error
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python3.7/site-packages/MeCab.py", line 26, in <module>
    _MeCab = swig_import_helper()
  File "/usr/local/lib/python3.7/site-packages/MeCab.py", line 22, in swig_import_helper
    _mod = imp.load_module('_MeCab', fp, pathname, description)
  File "/usr/local/lib/python3.7/imp.py", line 242, in load_module
    return load_dynamic(name, filename, file)
  File "/usr/local/lib/python3.7/imp.py", line 342, in load_dynamic
    return _load(spec)
ImportError: libmecab.so.2: cannot open shared object file: No such file or directory
```

# 原因
エラー文にある通りlibmecab.so.2がないのが原因っぽいです。
一度マルチステージビルドしていない正しく動いたコンテナでどこにlibmecab.so.2があるのか調べてみます

```
>> find / | grep libmecab
/usr/share/doc/mecab/libmecab.html
/usr/share/doc/libmecab-dev
/usr/share/doc/libmecab-dev/changelog.Debian.gz
/usr/share/doc/libmecab-dev/copyright
/usr/share/doc/libmecab2
/usr/share/doc/libmecab2/changelog.Debian.gz
/usr/share/doc/libmecab2/copyright
/usr/lib/x86_64-linux-gnu/libmecab.so.2.0.0
/usr/lib/x86_64-linux-gnu/libmecab.a
/usr/lib/x86_64-linux-gnu/libmecab.so.2
/usr/lib/x86_64-linux-gnu/libmecab.so
/var/lib/dpkg/info/libmecab-dev.md5sums
/var/lib/dpkg/info/libmecab-dev.list
/var/lib/dpkg/info/libmecab2:amd64.triggers
/var/lib/dpkg/info/libmecab2:amd64.conffiles
/var/lib/dpkg/info/libmecab2:amd64.md5sums
/var/lib/dpkg/info/libmecab2:amd64.list
/var/lib/dpkg/info/libmecab2:amd64.shlibs
```
色々出てきましたが、とりあえずlibmecab.so.2は/usr/lib/x86_64-linux-gnu/libmecab.so.2にあることがわかったので、これをbuild用のコンテナからコピーすれば行けそうです

# 修正後


```docker:Dockerfile
FROM python:3.7-buster as builder

WORKDIR /work

RUN apt-get update \
    && apt-get install -y mecab mecab-utils libmecab-dev \
    && pip install -U pip

COPY requirements.txt /work

RUN pip install -r requirements.txt

FROM python:3.7-slim-buster as runner

COPY --from=builder /usr/local/lib/python3.7/site-packages /usr/local/lib/python3.7/site-packages
# 追加部分
COPY --from=builder /usr/lib/x86_64-linux-gnu /usr/lib/x86_64-linux-gnu

WORKDIR /work

CMD python sample.py
```

これで動きました。
Arduino UNOの液晶,AQM0802Aで「A」を表示


stm32g031,stm32l010用に最軽量化したもの

1.SCLとSDAを接続、プルアップも忘れずに
2.電源の接続
3.下記のソースコードを書き込む
4.コンパイル実行で表示されたら終了
5.おわり


```c++

#include <Wire.h> //I2C library

#define I2Cadr  0x3e  // 固定

int     ii;           //ループカウンター
char    data_read[2]; //i2cバッファー

//初期レジスター
char INIT_com[]={0x0,0x38,
0x0,0x39,
0x0,0x4,
0x0,0x14,
0x0,0x70,
0x0,0x56,
0x0,0x6C,
0x0,0x38,
0x0,0xC,
0x0,0x1,
0x40,0x41};

//i2c書き込みルーチン
void i2c_led_w(char *buff1){
  Wire.beginTransmission(I2Cadr);
  Wire.write(buff1[0]);
  Wire.write(buff1[1]);
  Wire.endTransmission();
  delay(2);
}//i2c_led_w

void setup()
{  
  delay(3000); //not delete

  Wire.begin(); //uno

  //液晶の初期化
  for(ii=0;ii<11;ii++){
    i2c_led_w(&INIT_com[ii*2]);
  } //for

} //end setup

void loop()
{

}//loop



```

![uno_i2c_led_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/633d2a23-f631-f5ee-737b-bd73a835e7c3.jpeg)
gitでコミットの前にprefixがない時にエラーを返すようにしてみた。

# はじめに

最近あるプロジェクトに入っていた時にコミットの前によくprefixが入っているのをよく見るようになりました。
自分も真似てprefixをつけるのですが、たまに付けるのを忘れてしまう。。。

どうにかならないものか、、、

少し友人に聞いてみるとこちらの記事を教えてもらった！
まさにやりたいことはこれだった。

[Git の commit-msg hook でコミットメッセージにチケット番号が含まれるかチェックする](https://qiita.com/tbpgr/items/222030af9cc266f9781e)


# 早速参考にして書いてみた

```:commit-msg

#!/usr/bin/env ruby

regex = /fix: |feat: |bug: |add: |update: |change: |refactor: |disable: |delete: |rename: |upgrade: |style: |Merge /

message = File.read(ARGV[0]) 
if !regex.match(message)
  puts "\n//// HEY HEY HEY!!! ////\n\n"
  puts "//// please check prefix for the message (　´･‿･｀) ////\n\n\n"
  exit 1
end

```

# 結果 
![スクリーンショット 2021-02-28 0.19.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305148/3948cf35-f552-c5da-a430-0d122f83dc6c.png)


出来た！！！！！

今回はRubyで書いたんですができればNode.jsで書きたかった。

[この記事](https://qiita.com/hnw/items/0eb94e804a674c75a825)を参考にNode.jsでかけるようにでは出来たけど、コミットの引数をどうやってNode.jsで取得するかが分からなかったので出来ませんでした。。
この辺りわかる方がいましたらコメントくださいませ。。

# オシマイ(　´･‿･｀)
Laravel で Webp対応・非対応ブラウザを判定する方法

## これはなに？
webp という画像規格を最近知りました。
こいつがとんでもなく軽くてパフォーマンスにかなり寄与できるのですが、
いつもおなじみ「IE」と「バージョンの古いSafari」に対応しておらず、
そのまま使用すると画像が表示されなくなってしまうため、
ブラウザが対応しているかどうかを判定して対応している場合のみ webp を表示
そうでない場合に png や jpeg を出すようにする方法を備忘録で残します。
ちなみにこちらは div タグなどの background-image を切り替える方法になります。

## 対応内容
サーバーサイドでリクエストヘッダ内の Accept に `image/webp` が存在するかをみて、
実際にブラウザが webp に対応しているかどうかの判定をします。
その判定結果を view の共通処理で変数として保持しておき、その変数を元に blade に class を割り当てて
scss に class が割り当てられた時に表示する webp 画像を指定する・・・といった流れになります。

#### ViewServiceProvider への登録
まずは、ViewServiceProvider 的なやつを作ってboot メソッドに以下の様な内容を登録します。
配列で渡している `blade.path` はブレードの具体的なパスを記述してあげます。
できれば共通ヘッダなどのブレードを指定しましょう。

```php:ViewServiceProvider.php
public function boot()
{
    View::composer(['blade.path'], function ($view) {
        // WebP画像に対応しているブラウザ？
        $view->with('_acceptWebP', strpos(request()->header('Accept'), 'image/webp') !== false ? 'accept-webp' : '');
    });
}
```

上記を解説をすると、リクエストヘッダの中に `image/webp` があるかを strpos メソッドに投げます。
strpos メソッドは文字列がない場合に false を返すので false でない場合、つまり webp に対応している場合は `accept-webp` という文字列を返します。
逆に false の（webp に対応していない）場合には空文字を返します。
そして、それを `_acceptWebP` という変数名で view の変数に追加します。

#### blade に変数を設定
body タグの class に先程の変数を指定しておきます。

```php:共通化blade
<body class="taichou kumichou hanchou {{ $_acceptWebP }}">
```

実際に background-image を切り替える div タグを用意します。

```php:子blade
<div class="hoge"></div>
```

#### scss への適用
そして scss に以下の様に記述をすると対応ブラウザでは webp が、
非対応ブラウザでは png が表示されます。
ミソは `#{&}` の部分でインターポーレーションに sass の & を指定することでビルド時に
`body.accept-webp .hoge` のクラスが生成されてスタイルが当たるようになっています。

```scss
.hoge {
  background-image('hoge.png');
  @at-root body.accept-webp #{&} {
    background-image : url("hoge.web");
  }
}
```
[Node.js][LINE] 毎日 LINE に花粉情報を通知する

# 概要

- [自分の LINE に Ruby で通知を送る](https://qiita.com/QUANON/items/94f8835e923c76188f66)
- [[Ruby][LINE] ごみ出し日に LINE で通知する](https://qiita.com/QUANON/items/ccfe650a30bd6068a5f4)

に引き続き、[LINE Notify](https://notify-bot.line.me/ja/) を使って LINE に通知するシリーズです！

<ruby>花粉 <rp>(</rp><rt>デス・パウダー</rt><rp>)</rp></ruby>が辛い季節ですね :disappointed_relieved: 花粉情報が非常に気になる毎日なので、当日の花粉情報を LINE に通知するようにしました。

# 方法

## バージョン情報

- Node.js 14.15.5
- Playwright 1.9.1
- axios 0.21.1

## コード

まず [Playwright](https://github.com/microsoft/playwright) を使ってヘッドレス Chrome を操作し、Yahoo! JAPAN の花粉情報のスクリーンショットを撮影します。花粉情報のページの URL は任意の地域のものに書き換えてください。なお、本当は [日本気象協会 tenki.jp](https://tenki.jp/) の花粉情報を通知したかったのですが、Playwright でのアクセスがタイムアウトになってしまうので諦めました。スクレイピング対策されているのかもしれませんね。

そして [axios](https://github.com/axios/axios) を使って LINE Notify の API を叩き、LINE に通知します。LINE Notify はメッセージを送信できるだけでなく、画像を送信することもできます。

```~/workspace/death_powder_forcast/main.js
const { chromium } = require('playwright');
const fs = require('fs');
const axios = require('axios');
const FormData = require('form-data');

// Yahoo! JAPAN の福岡市中央区の花粉情報。
const POLLEN_FORCAST_URL = 'https://weather.yahoo.co.jp/weather/pollen/10/40/40133/'; 
const SCREENSHOT_FILEPATH = './today.png';
const LINE_NOTIFY_TOKEN = 'ここに LINE Notify のトークンを入力する。';

// 指定した要素のスクリーンショットを撮影する。
const takeScreenshot = async ({ url, selector, filepath }) => {
  // Raspberry Pi では ARM 用の Chromium を使用する必要があるので executablePath を指定する。
  const browser = await chromium.launch({ executablePath: '/usr/bin/chromium-browser' });
  const context = await browser.newContext();
  const page = await context.newPage();
  await page.goto(url);
  const element = await page.$(selector);
  await element.screenshot({ path: filepath });
  await browser.close();
};

// LINE Notify に通知する。
const notifyLINE = async ({ token, message, imageFilepath = null }) => {
  const LINE_NOTIFY_API_URL = 'https://notify-api.line.me/api/notify';

  const formData = new FormData();
  formData.append('message', message);
  if (imageFilepath) {
    formData.append('imageFile', fs.createReadStream(imageFilepath));
  }

  const headers = {
    'Authorization': `Bearer ${token}`,
    ...formData.getHeaders()
  };

  await axios.post(LINE_NOTIFY_API_URL, formData, { headers });
};

(async () => {
  await takeScreenshot({
    url: POLLEN_FORCAST_URL,
    selector: '.pollenFlying_city_day:first-child',
    filepath: SCREENSHOT_FILEPATH
  });

  if (!fs.existsSync(SCREENSHOT_FILEPATH)) {
    process.exit(1);
  }

  await notifyLINE({
    token: LINE_NOTIFY_TOKEN,
    message: '今日の花粉情報です。',
    imageFilepath: SCREENSHOT_FILEPATH
  });

  fs.unlinkSync(SCREENSHOT_FILEPATH);
})();
```

上記の Node.js ファイルを cron で定期実行します。通知してほしい時刻を指定してください。

```sh:crontab
# 設定例
0 7 * * * /bin/bash -c 'export PATH=$HOME/.nodenv/bin:$PATH; eval "$(nodenv init -)"; cd $HOME/workspace/death_powder_forcast; node main.js'
```

これで通知が届きました 💖

<img width=400 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6697/4bfa77e1-589f-d920-b044-7b44010600dd.jpeg">
Unable to write file '/Users/user/projects/SampleProject_server/database/my_conf/aaa' (NoPermissions (FileSystemError): Error: EACCES: permission denied, open '/Users/user/projects/SampleProject_server/database/my_conf/aaa') の解決方法

## いつ起きた？
ダウンロードフォルダに新しくvscodeを使ってファイルを追加しようとしたら出ました

## 原因は？
フォルダ内の編集にはrootだけしかできなくなっていたためでした（そうなった理由は不明です;）

## 解決方法
下記のコマンドを打ったことでvscodeで編集が可能になりました

```
% chmod -R 775 SampleProject_server
```


###### このコマンドの詳細は下記のような内容になっています
- chmod: 権限を与える
- -R: フォルダ名（ここではSampleProject_server）以下のフォルダ、ファイルに同じコマンドを反映させる
- 775:  ①所有者が全ての権限（７）　②グループ（vscodeはこれ）が全ての権限（７）　③その他のユーザーが実行・読み取り可能（５）

## 参考にさせてもらったサイト
パーミッションに関する詳しい解説が記載されているサイト：
https://linuxfan.info/chmod
【Javaについてまとめてみたオブジェクト編】インターフェースについて

#はじめに
今回はJavaのインターフェースについて書いていきたいと思います。
抽象クラスとの違いなど理解するのが難しい印象です。
少しでも理解につながれば幸いです。
抽象クラスについては下記の記事で書いているのでぜひご覧ください。
[【Javaについてまとめてみたオブジェクト編】抽象クラスについて](https://qiita.com/ken_0321/items/73967fd036bddfd2d648 "抽象クラス")

##インターフェースとは
まず、インターフェースは抽象クラスと似ていますが、クラスではありません。
javaの参照型の一つであり、**抽象クラスを親クラスで使いた時は「継承」と言いますが、インターフェースは「実装」**と言います。
特徴としては、

- クラス宣言時にinterfaceを付ける
- newをしてインスタンスを作成することが出来ない。
- メソッドは抽象メソッドしか作成できない。
- アクセス修飾子はpublicかpackageしか使えない。
- 抽象クラスは一つしか継承できないが、インターフェースは複数実装できる。

といったものがあげられます。

###インターフェースの宣言
```java:インターフェースの宣言
public interface インターフェース名{};
```
宣言する時はこのようにinterfaceを付けます。
###インターフェースの実装
```java:インターフェースの実装
//1つ実装
public Class クラス名 implements インターフェース名{};
//2つ実装
public Class クラス名 implements インターフェース名,インターフェース名2{};
//継承と併用
public Class 親クラス名 extends 子クラス名 implements インターフェース名,インターフェース名2{};
```
実装するときはこのようにimplementsを付けます。
複数インターフェースを実装したい場合はカンマ区切りで記述してあげます。
継承と併用することも可能です！
##抽象クラスとの違いを考えてみた
ここまで見た感じ抽象メソッドしか書けない点や複数の実装が出来る点など抽象クラスとの違いがいくつかありましたが、正直使い方のニュアンスが今いち分からんと思われる方もいるかと思います。
色々調べて他の方のQiitaも見たところ、このような違いが書かれていました。
>クラス仕様としての型定義をしたいならインタフェース
>継承関係にあり、処理の再利用をしたいなら抽象クラス

引用元：[【詳解】抽象クラスとインタフェースを使いこなそう！！](https://qiita.com/yoshinori_hisakawa/items/cc094bef1caa011cb739 "抽象クラス")

一旦、人間で例えましょう。
人間には日本人、アメリカ人など様々な人種がいます。
これらの人種はみんなしゃべることが出来ますが、言語が違います。
仮に親クラス「人間」を作るとしたら抽象メソッドで「言語」みたいなのを作れば、それぞれサブクラスで話し方の違いを表現できます。
これが抽象クラスの役割で、必ずあるような機能を再利用してますね。

では、特技について考えてみます。
必ずしも人間みんなが特技があるという訳ではないと思うので、抽象メソッドで必ず実装するような設計にはできないかと思います。
ですが、特技を実装したくなった時に特技のインターフェースを作っておけば、いつでも個別の人間ごとにプラスで処理が書けるイメージになります。これがインターフェースです。


##さいごに
インターフェースどうだったでしょうか。
正直、私も完全に理解できてるか怪しいので指摘があれば教えてください！
途中で引用させていただいた記事は理解しやすいように思えたのでおススメします。

ご覧いただきありがとうございました。