OmniAICreator/Qiita-1.07M huggingface dataset:
pythonでpickleをJSONに保存する

# python でpickleをJSONに保存する
pickle.dump で得たバイナリを１６進数文字列に変換してその文字列を保存します
データベースのテキストフィールドにクラスオブジェクトを保存したかったというのが本記事の動機です

## 出力処理
対象オブジェクトを pickle.dump し、そのバイナリを１６進数文字列に変換します

```python3
def ObjectToJSON(obj):
    out = io.BytesIO()
    pickle.dump(obj, out)
    buf = out.getbuffer()
    hexBin = codecs.encode(buf, 'hex')
    hexStr = hexBin.decode("utf-8")
    return json.dumps(hexStr)
```

## 入力処理
出力処理で作成した１６進数文字列をバイナリに変換しそれを pickle.load に与えます

```python3
def JSONToObject(jsonStr):
    hexStr = json.loads(jsonStr)
    bin = bytes.fromhex(hexStr)
    input = io.BytesIO(bin)
    obj = pickle.load(input)
    return obj
```

## 実験ソースコード

```python3
import codecs
import copy
import io
import json
import numpy as np
import pickle

class Hoge:
    def __init__(self):
        self.a = 0
        self.b = 0.0
        self.c = ""
        self.d = np.zeros(10)
    def DumpVars(self):
        for k in vars(self):
            print(k, self.__dict__[k])

def ObjectToJSON(obj):
    out = io.BytesIO()
    pickle.dump(obj, out)
    buf = out.getbuffer()
    hexBin = codecs.encode(buf, 'hex')
    hexStr = hexBin.decode("utf-8")
    return json.dumps(hexStr)

def JSONToObject(jsonStr):
    hexStr = json.loads(jsonStr)
    bin = bytes.fromhex(hexStr)
    input = io.BytesIO(bin)
    obj = pickle.load(input)
    return obj

def Test1():
    print("# Test1")
    x = Hoge()
    x.a = 1
    x.b = 1.2345
    x.c = "ほげ"
    x.d = np.repeat(np.arange(3), 4).reshape(3, 4)
    x.DumpVars()
    
    jsonStr = ObjectToJSON(x)
    print(jsonStr)

def Test2():
    print("# Test2")
    jsonStr = '"8003635f5f6d61696e5f5f0a486f67650a7100298171017d71022858010000006171034b015801000000627104473ff3c083126e978d58010000006371055806000000e381bbe3819271065801000000647107636e756d70792e636f72652e6d756c746961727261790a5f7265636f6e7374727563740a7108636e756d70790a6e6461727261790a71094b0085710a430162710b87710c52710d284b014b034b0486710e636e756d70790a64747970650a710f5802000000693871108988877111527112284b0358010000003c71134e4e4e4affffffff4affffffff4b007471146289436000000000000000000000000000000000000000000000000000000000000000000100000000000000010000000000000001000000000000000100000000000000020000000000000002000000000000000200000000000000020000000000000071157471166275622e"'
    x = JSONToObject(jsonStr)
    x.DumpVars()

def main():
    Test1()
    Test2()
    

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


以上です
S3に5GBを超えるファイルをアップロードする際は名前が半角英数字のみになっているかチェックすべし

ブラウザ上のS3コンソールに「セミナー動画1.mp4」という名前の13GBの動画ファイルをアップロードしようとしたところ、アップロードエラーが発生しました。
 
ライフストリームサイクルを設定してという表示がされるが、 設定後再試行するも変化なし。

試行錯誤したところ、原因は名前にマルチバイト文字を使用していたからでした。 
「movie_1.mq4」に変更して再試行したところアップロードできました。
Django O/Rマッパー 不等号表し方


DjangoのO/Rマッパー備忘録

```py
#より大きい：＞　(greater than)
Sample.objects.filter(field__gt='条件')

#以上：≧　(greater than or equal)
Sample.objects.filter(field__gte='条件')

#より小さい：＜　(less than)
Sample.objects.filter(field__lt='条件')

#以下：≦　(less than or equal)
Sample.objects.filter(field__lte='条件')

#BETWEEN句検索
Sample.objects.filter(field__range=(start, end))
```

日付の厳密一致

```python
#年
Sample.objects.filter(field__year=sample_year)
#月
Sample.objects.filter(field__month=sample_month)
#日
Sample.objects.filter(field__day=sample_day)
```
Power Appsの印刷機能まとめ

#Power Appsの印刷機能について調べました。

「新しい画面」に印刷画面が追加されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140547/a1129e3c-ce09-2f5e-7721-e95b63bf659b.png)


##サンプルのプログラム
OneDriveにエクセルファイルを設置して、簡単に検索アプリを作成して、選択した内容をNavigate関数で、印刷用画面に表示します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140547/79a65dfb-5004-b8de-37a6-dcc6f4b83247.png)

##画像を印刷するには
「背景のグラフィック」にチェックボックスを入れるようにしましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140547/fd776320-3d64-ddce-1ebf-fc4bdae692df.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140547/55a3bb36-f80d-45ee-9f7b-8553b7915ffb.png)

##印刷用紙サイズの変更
印刷の用紙サイズは、Screenのサイズで変更可能です。
初期設定はA4サイズで、Width：794pix Height：1123pixです。
ピクセル数はWindowsの画面表示が96dpiなので、このサイズ指定になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140547/a8030f01-aebb-3717-5ac0-eea85fa53757.png)

他の用紙サイズは下記表を参照してください。
##
<table>
<tr>
<th rowspan=2>サイズ</th>
<th colspan=2>センチ</th>
<th colspan=2>ピクセル</th>
</tr>
<tr>
<td>横</td>
<td>縦</td>
<td>横</td>
<td>縦</td>
</tr>
<tr>
<td>A3</td>
<td>29.7</td>
<td>42.0</td>
<td>1123</td>
<td>1587</td>
</tr>
<tr>
<td>A4</td>
<td>21.0</td>
<td>29.7</td>
<td>794</td>
<td>1123</td>
</tr>
<tr>
<td>A5</td>
<td>14.8</td>
<td>21.0</td>
<td>559</td>
<td>794</td>
</tr>
<tr>
<td>A6</td>
<td>10.5</td>
<td>14.8</td>
<td>397</td>
<td>559</td>
</tr>
</table>

##印刷ボタンの表示コントロール
作成した印刷用画面に、初期に入っている印刷ボタンですが、このボタンは印刷されないように、Visibleプロパティに「Not(Parent.Printing)」という記述がされています。
自分でボタンを作成する際には注意しましょう。
印刷自体は簡単でOnSelectプロパティに、「Print()」と記載するだけです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140547/0706a583-4eb0-a0bc-cf46-307eab0fa5b2.png)

印刷が可能になれば、飲食店でのオーダー受付、売上管理、レシート印刷なども、Power Appsで完結出来ますので、幅が広がりそうですね！
【GTM】onchangeイベントをトリガーに、GA4にデータを送信する方法

# 今回実装した内容
GTMの設定のみで、onchangeイベントをトリガーに、GA4へイベントデータとしてid属性の値を送信する方法を記載しています。

# 全体像
![スクリーンショット 2021-04-17 18.28.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311026/3b1f8c56-74b9-fa45-878a-c425c6b1c5ba.png)



# トリガー：gtm.js

- トリガータイプ：カスタムイベント
- イベント名：gtm.js
- このトリガーの発生場所：すべてのカスタムイベント
- このトリガーへの参照：onchange listener

### 補足

イベント名によって発火タイミングが変わる

| イベント名 | 発火タイミング |
| :-- | :-- |
| gtm.js | ページビュー(Container Loaded) |
| gtm.dom | DOM Ready(DOM Ready) |
| gtm.load | ウィンドウの読み込み(Window Loaded) |

# タグ：onchange listener

- タグの種類：カスタムHTML
- HTML

``` html
<script>
  if (document.addEventListener) {
    document.addEventListener('change', {{generic event handler}}, false);
    document.addEventListener('change', {{get id handler}}, false);
    document.addEventListener('change', {{selected form value}}, false);
  } else if (document.attachEvent) {
    document.attachEvent('onchange', {{generic event handler}});
    document.attachEvent('onchange', {{get id handler}});
    document.attachEvent('onchange', {{selected form value}});
  }
</script>
```

- 配信トリガー：gtm.js

### 補足

GTMには、onchangeをトリガーにできるトリガータイプがありません。
ページビューのタイミングで上記処理を書き込むことで、onchangeイベントを拾えるようにしています。

# 変数：get id handler

- 変数のタイプ：カスタムJavaScript
- カスタムJavaScript

``` javascript
function(e) {
    return event.target.id;
}
```

- この変数への参照：onchange listener、form select tag

### 補足

特になし。
単純に、id属性の値を取得しているだけ。

# 変数：selected form value

- 変数のタイプ：カスタムJavaScript
- カスタムJavaScript

``` javascript
function(e) {
  var tag = event.target.tagName;
  if (tag == 'INPUT' || tag == 'TEXTAREA') {
    return 'input_done';
  } else {
    return event.target.value; 
  }
}
```

この変数への参照：onchange listener、form select tag

### 補足

- `<input>`、`<textarea>`の場合は、個人情報を含む可能性もあるため、一律で"input_done"という文字列を飛ばすように設定しています。

# 変数：generic event handler

- 変数のタイプ：カスタムJavaScript
- カスタムJavaScript

``` javascript
function() {
  return function(e) {
    window.dataLayer.push({
      'event': 'form_select',
      eventModel: {value: e.target.id, send_to: '{{ 計測ID }}'},
    });
  }
}
```

- この変数への参照：onchange lister

### 補足

- "form_select"というイベント名で設定しているトリガーを起動させています。

# トリガー：form select trigger

- トリガーのタイプ：カスタムイベント
- イベント名：form_select
- このトリガーの発生場所：すべてのカスタムイベント
- このトリガーへの参照：form select tag

### 補足

- 特になし。

# タグ：form select tag

- タグの種類：Googleアナリティクス:GA4イベント
- 設定タグ：GoogleAnalytics
- イベント名：form_select
- イベントパラメータ：
  - パラメータ名：{{get id handler}}
  - 値：{{selected form value}}
- 配信トリガー：form select trigger

### 補足

- 今までの処理で取得した値をもとに、このタグでGA4へイベントデータを送信しています。
【Rails】graphql-rubyでのオフセットベースのページネーションの実装方法【Graphql】

要件からカーソルベースではなくオフセットベースのページネーションを作らないといけなかったがスムーズにいかなかったので当時のメモ。先輩にも助けて頂いた。

使用技術は
フロントエンド
- nuxt + vuetify
バックエンド
- rails + Graphql
という組み合わせ

実現方法としては
- カーソルベースで一度頭から該当ページのカーソルIDを取ってそれを元に1ページの個数をとるという２度APIを取る方法
- graphql-rubyにコードを追加してoffsetやtotal countを返す方法
の二つ考えられるが今回は後者を書く。


``` app/graphql/offset_extension.rb
class OffsetExtension < GraphQL::Schema::Field::ConnectionExtension
  def apply
    super
    field.argument :offset, 'Int', 'Offset value.', required: false
  end

  def after_resolve(args)
    offset = args[:memo][:offset]
    new_args = offset ? args.merge(value: args[:value].offset(offset)) : args

    super(new_args)
  end
end
```




``` app/graphql/types/base_field.rb

module Types
  class BaseField < GraphQL::Schema::Field
    argument_class Types::BaseArgument
    connection_extension(::OffsetExtension)
  end
end
```



``` app/graphql/types/pagination_connection.rb 
module Types
  class PaginationConnection < GraphQL::Types::Relay::BaseConnection
    field :total_count, Int, null: false

    def total_count
      object.items.size
      object.items.unscope(:offset).unscope(:limit).count
    end
  end
end
```


参考
GraphQL RubyのPaginationについて｜Daiki Tanaka｜note

https://note.com/tana_d/n/n39e2b8dcd4ee

GraphQLでのPaginationの実装方法について(for ruby) - Qiita

https://qiita.com/nobuo_hirai/items/f9e34d8572a82283538b

graphql-rubyでページネーションがサクッと実装できたのでGemが何をやっているのか覗いてみた - Qiita

https://qiita.com/ham0215/items/1c309ea6ca5e6b52487c

RailsでGraphQL APIを作る時に悩んだ5つのこと  |  スペースマーケットブログ

https://blog.spacemarket.com/code/graphql-ruby-concerns/

Offset based pagination in GraphQL-ruby - Blog by Abhay Nikam

https://www.abhaynikam.me/posts/offset-based-pagination-in-graphql-ruby/

Introduction to pagination in GraphQL

https://graphql-ruby.org/guides#pagination-guides
「エンジニア」だとQiitaでしか通じないのでは…

エンジニアって野が根本的に多義語で、自動車のエンジンとか船舶とか航空宇宙とか含めて本来幅広くい言葉になるんですけど、いったいどういう了見で

> 「変更の内容」でも述べたとおり、Qiita上ではエンジニアの定義を以下のように定めます。
> ・プログラミングの知識と経験を活用している人

というのと

> Qiitaで投稿するべきではない記事
> ・自分だけしか理解できない表現などを用いたメモ

というのを両方ガイドラインに書いてるんでしょうね。やれやれ。

https://blog.qiita.com/notice-community-guideline-update/
勤怠管理SPAサイトをリリースしてみた【個人開発】

##サービスについて
https://kintai-kantan.com?params=introduction が紹介ページとなります。
まだ、試作段階で、何かと不具合があるかと思いますが、使っていただければ幸いです。

##作ろうと思ったきっかけ
業務で React と Ruby on Railsを扱うことになりました。
しかし、これらに知見がないので、勉強がてら、なにかのサービスを作成し、リリースしてみようと思い、行動にいたりました。

そして、まず思いついたのが勤怠入力サービスでした。
なぜなら、普段使っているものが、遅いし、入力する項目が多くて使い辛いし、なんとかならないものかと不満が溜まっていたから。

###サービスの思想
- スマホアプリライクに
- とにかく、処理をシンプルにする!
- はやい!!


##使用技術
ざっくりとになりますが、

- バックエンド
  - Ruby on Rails
  - graphql-ruby
  - device
- データベース
  - PostgreSQL

- フロントエンド
  - React
  - TypeScript
  - Apollo Client 

- サーバーサイド
  - さくらVPS
  - docker-compose
  - nginx
  - https-portal

##感想
はじめて、Qiitaに投稿してみました。
また、投稿したいと思います。
みていただき、ありがとうございます。
pandas データフレームの集約・抽出・集計・並び替えのコマンド集


pandasでデータフレームを扱う際に、よく使うコマンドを整理しました。

## 基礎統計量の確認
```
 <データフレーム名>.describe()
```

## カラム内のデータ数を数える
```
<データフレーム名>["<カラム名>"].value_counts()
```

## 列データのユニークな要素数を数える
```
<データフレーム名>["<カラム名>"].nunique()
```

## groupby関数による集約
```
<データフレーム名>.groupby("<カラム名1">)["<カラム名2>"].value_counts()
```

## 特定の要素ごとの平均値、合計値、中央値を出す
```
<データフレーム名>.groupby("<カラム名">).mean()
<データフレーム名>.groupby("<カラム名">).sum()
<データフレーム名>.groupby("<カラム名">).median()
```

## groupby関数で集約に用いたカラムをインデックスにしない場合
```
groupby("<カラム名>", as_index=False)
```

## groupby関数で2以上の列を指定する場合
```
groupby(["<カラム名1>","<カラム名2>"])
```

## 件数を集計する場合（クロス集計）
```
 pd.crosstab(<データフレーム名>["<カラム名１>"], <データフレーム名>["<カラム名2>"])
```

## 件数を集計する場合（クロス集計、行方向の合計値が全体で１になるように正規化したい場合）
```
 pd.crosstab(<データフレーム名>["<カラム名１>"], <データフレーム名>["<カラム名2>"], normalize = "index")
```

## 条件に該当したデータ抽出
```
<データフレーム名>[<データフレーム名>["<カラム名>"] == "値"]
または
<データフレーム名>.query("<カラム名> == '値'")
```

## データ並び替え
```
# 昇順（デフォルト）
<データフレーム名>.sort_values("<カラム名>")
# 降順
<データフレーム名>.sort_values("<カラム名>", ascending=False)
```

## カラム名変更
```
<データフレーム名>.rename(columns={"<カラム名>":"<変更後カラム名>"})
```
【Python】VSCodeで保存時のフォーマットでimportのソートをさせないようにする

## 概要
Pythonでライブラリの読み込み対象のパスを追加する際、[Python Tips：ライブラリ読み込み対象ディレクトリを追加したい](https://www.lifewithpython.com/2014/01/python-add-directories-to-path-to-import-libraries-from.html)の記事にあるように、`sys.path.append("/Users/username/Desktop")`のような感じで、importの前に探索パスを追加したいことがあります。この時にVSCodeのPython拡張機能で保存時のフォーマットを設定していると、importが自動でソートされてしまい、意図した順番にならないことがあります。
もちろん保存時のフォーマットをしなければ良いのですが、保存時のフォーマットを有効にしたままimportのソートを無効にするにはどうすれば良いのかというのをメモ書きしておきます。

## 対応
[Disable python import sorting in VSCode](https://stackoverflow.com/a/54016555)のstackoverflowの記事にある通り、保存時の`E402`のチェックを無効にすれば自動でのimportのソートが行われません。`E402`とは[Module level import not at top of file (E402)](https://www.flake8rules.com/rules/E402.html)の記事にある通り、importをファイルの上側に書かなければいけないというルールです。
上記のstackoverflowの記事にもありますが、VSCode`のsettings.json`に以下の設定を追加します。

```json:settings.json
"python.formatting.autopep8Args": ["--ignore", "E402"]
```
modal view に navigation bar を表示する方法

# はじめに
segueで遷移したmodal viewにnavigation barを表示させる方法をメモしました．

# 方法
遷移前のviewをA, 遷移後のmodal viewをBとします．

Bでnavigation barを表示したい場合，
Aのroot view controllerがnavigation controllerだとしても，
新たにAとBの間にnavigation controllerを挟んであげる必要があります．

segueの関係（ex）
A -> navigation controller : Present Modally
navigation controller -> B : Relationship "root view controller"

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397136/32dabf5a-21b7-53f2-985d-8cc893530da4.png)


# まとめ
他にもコードベースのやり方があるようですが，今回は最も簡単なstoryboardを用いたやり方を行いました．

# 参考
* [Swift: Force show Navigation Bar in Modal
](https://stackoverflow.com/questions/28401210/swift-force-show-navigation-bar-in-modal)
* [【Swift】モーダル遷移でNavigationBarを表示する](https://note.com/shion_consul/n/n310cb13aa513)
* [[初心者向け]swiftにおける値渡しの方法の一部をご紹介](https://qiita.com/ARATAYOKOYAMA/items/9938cf8acfddf5c5424e)
.NET Core Serverless WebAppをMacからAWSへデプロイ

#概要
タイトル通りですが、.NET Core Serverless WebAppをMacからAWSへデプロイします。
WindowsでしたらAWS ToolKit for VisualStudioがあるのでGUIでポチポチできますが、
AWS ToolKit for VisualStudio(Mac ver)が無いので、
Macからデプロイするためにはコマンドでなんとかかんとかがんばる必要があります。

#必要ツールインストール
それではまず事前準備で必要なツールをインストールします。

●AWS CLI
AWSへデプロイするのでもちろん必要になってきます。

```
brew install awscli
```

●.NETアプリケーションを操作するために必要です。

```
brew install dotnet-sdk
```

●Amazon.Lambda.Templates
テンプレートからプロジェクトを作成することができます。
便利なので入れておきます。

```
dotnet new -i Amazon.Lambda.Templates
```

●Amazon.Lambda.Tools .NET Core Global Tool 
.NETアプリケーションをAWS Lambdaへデプロイするために必要です。

```
dotnet tool install -g Amazon.Lambda.Tools
```

#AWS CLIプロファイル設定
続いてAWS CLIのプロファイル設定を行います。
ターミナルからAWSへデプロイする際に使用するAWS Accesskey等の設定です。
あらかじめAWSでIAMを作成しておきます。

●プロファイル作成

```
aws configure --profile {プロファイル名}
# 例: aws configure --profile user1

AWS Access Key ID: {設定したIAMから払い出されたキーをコピー}
AWS Secret Access Key: {同上}
Default region name: {東京の場合は ap-northeast-1 を指定}
Default output format: JSON
```

#プロジェクト作成
それでは準備が整ったので、プロジェクトを作成します。
Amazon.Lambda.Templatesをインストールしたので、テンプレートから作成します。
プロジェクトを作成したい任意の場所で以下コマンドを実行します。
※WindowsのVisualStudioだとあらかじめ組み込まれています。

```
dotnet new serverless.AspNetCoreWebApp --name {Lambda関数名} --region {リージョン名} --profile {プロファイル名}
# 例: dotnet new serverless.AspNetCoreWebApp --name MyWebApp --region ap-northeast-1 --profile user1
```

少し待つと、プロジェクトフォルダが作成されます。
VisualStudio for Macで.csprojを開いてそのままデバッグするとサンプルページが表示されます。

#デプロイ
ではプロジェクトの作成ができたのでいよいいよAWSへデプロイします。
ただ、その前に自動生成されたプロジェクト内の「aws-lambda-tools-defaults.json」ファイルにアップロード先S3バケット名とCloudFormationのスタック名を追記しておきます。

```json
{
  "Information": [
    "This file provides default values for the deployment wizard inside Visual Studio and the AWS Lambda commands added to the .NET Core CLI.",
    "To learn more about the Lambda commands with the .NET Core CLI execute the following command at the command line in the project root directory.",
    "dotnet lambda help",
    "All the command line options for the Lambda command can be specified in this file."
  ],
  "profile": "user1",
  "region": "ap-northeast-1",
  "configuration": "Release",
  "framework": "netcoreapp3.1",
  "s3-prefix": "MyAspNetApp/",
  "template": "serverless.template",
  "template-parameters": "",
  "s3-bucket": {あらかじめAWSにS3を作成しておく必要があります。},
  "stack-name": {AWS CloudFormationのスタック名を指定します。S3と違い自動作成してくれます。}
}
```

それでは、準備万端なのでデプロイコマンドを実行します。
※以下コマンドは.csprojと同階層で実行して下さい。

```
dotnet lambda deploy-serverless
```

無事デプロイが完了すると、こんな感じでデプロイ先URLが表示されます。

```
ApiURL  https://xxxxxxx.execute-api.ap-northeast-1.amazonaws.com/Prod/
```

やった！お疲れ様でした！
laravel dockerでnpmを使う時

phpのDockerfileに

```
# nodejs install
RUN curl -sL https://deb.nodesource.com/setup_12.x | bash -
RUN apt-get install -y nodejs
```
こちらの記述を書くこと
12.xはバージョン


## 参考
#### [nodeのバージョン](https://nodejs.org/ja/download/releases/)
セレクトボックスで選んだ数だけ要素を追加する

セレクトボックスで数字を選び、選んだ数字の数だけ要素を追加する方法。
liタグの数を変える。


```html:html
<select name='addNumber'>
  <option value="1">1</option>
  <option value="2">2</option>
  <option value="3">3</option>
  <option value="4">4</option>
  <option value="5">5</option>
  <option value="6">6</option>
</select>

<ul id="addTarget">
  <li>最初の要素</li>
</ul>
```




```javascript:jquery
$('[name=addNumber]').on('change', function(){
  //追加要素をいったん全部消す
  $(".addContent").remove()
  //セレクトボックスから数字を取ってくる
  let num = $('[name=addNumber]').val()
  //セレクトボックスの文字を数字にする
  num = Number(num)
  //追加するコンテンツ
  let add_content = '<li class="addContent">追加</li>'
  //要素数が2個以上は追加
  if(num > 1){
    for (let i=1; i<num; i++) {
      $('#addTarget').append(add_content)
    }
  }
});
```
RSpec２回目商品出品機能テスト

itemモデルのバリデーションを書こうと思います。

１）bundle install(済）
２）rails g rspec:install（済）
３）.rspec・rspecフォルダ・spec/spec_helper.rb・rails_helper.rbの各フォルダあり。（済）

４）itemモデルのテストファイル作成（ここから）

ここでエラー発生
-

```rb:terminal
maedatakuo@maedatakudainoMacBook-Air furima-32844 % rails g rspec:model item
Running via Spring preloader in process 16513
   identical  spec/models/item_spec.rb
      invoke  factory_bot
   identical    spec/factories/items.rb
```


に怒られました。

解答
-

RspecとFactoryBotがインストールされるとモデルを作るたびにファイルが自動生成されているようでした。


Userの時のデータを活用しながらテスト作り再開

疑問１　ActiveHashの１〜６までのデータで登録するんだけどFakerで数字限定で乱数出せる？
-

確認できました

参考

>https://www.rubydoc.info/github/stympy/faker/Faker%2FNumber.between

```rb:ruby
Faker::Number.between(from: 1, to: 10) #=> 7
```

疑問２　ActiveImageを使いながらFakerやFactoryBotで画像をアップロードできるのか？
-

@maca12velさん　ありがとうございます。参考にさせていただきました。
>https://qiita.com/maca12vel/items/ee4d16827f24f69080ae

＊私の場合は「image」だったので@Katyaさん（@katya_swaさん）の使用している「picture」は「image」に変更しています。

####①fixturesディレクトリの作成
![20210417-163241.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960935/d8119e95-9510-92d4-de20-18307b08a166.png)


1-1.spec内にfixturesディレクトリがない場合は、作成する。

1-2.使いたい画像ファイルをfixturesディレクトリの中に入れる。

1-3.spec/fixturesの中に20210327-085606.pngという画像ファイルを入れています。

1-4.以下を記述

```rb:spec/models/item.rb
require 'rails_helper'

RSpec.describe Item, type: :model do
    describe '#create' do
      before do
        @item = FactoryBot.build(:item)
        @item.image = fixture_file_upload("/20210327-085606.png")
      end
```


疑問３　imageのテストが通らない
-

```rb
Item
  #create
    image,item_name,description,category_id,status_id,prefecture_id,delivery_fee_payment_id,delivery_prepare_id,priceの値が存在すれば登録できること
    imageが空では登録できないこと (FAILED - 1)
    item_nnameが空では登録できないこと
    descriptionが空では登録できないこと
    catego_idが空では登録できないこと
    status_idが空では登録できないこと
    delivery_fee_payment_idが空では登録できないこと
    delivery_prepare_idが空では登録できないこと
    prefecture_idが空では登録できないこと
    prefecture_idが空では登録できないこと
    priceは全角カナでは登録できないこと

Failures:

  1) Item#create imageが空では登録できないこと
     Failure/Error: @item.valid?
     
     ActiveSupport::MessageVerifier::InvalidSignature:
       ActiveSupport::MessageVerifier::InvalidSignature
     # ./spec/models/item_spec.rb:16:in `block (3 levels) in <top (required)>'

Finished in 0.24549 seconds (files took 1.21 seconds to load)
11 examples, 1 failure

Failed examples:

rspec ./spec/models/item_spec.rb:14 # Item#create imageが空では登録できないこと
```


ただいま調査中

結論からいうとActive Strageの使用でからという表現を””ではなくnilとしないといけないらしい

(誤)

```ruby:spec/models/item.rb
      it 'imageが空では登録できないこと' do
        @item.image = ""
        @item.valid?
        expect(@item.errors.full_messages).to include("Image can't be blank")
      end
```

(正)

```ruby:spec/models/item.rb
      it 'imageが空では登録できないこと' do
        @item.image = nil
        @item.valid?
        expect(@item.errors.full_messages).to include("Image can't be blank")
      end
```


参考：@a1b2c3d4e5f1111さんありがとうございます。参考にします。

>https://qiita.com/a1b2c3d4e5f1111/items/85817cdb8ca8544b88ea
Gradle plugins.idとbuildscript.dependencies.classpathの関連性

定期的に気になるのですが、まとめないと毎回調べることになるので、まとめておきます。

https://twitter.com/new_runnable/status/1324523084678795264


```gradle
plugins { 
  id("org.jetbrains.compose") version "0.1.0-m1-build62" 
}
```

がmavenの`buildscript.dependencies.classpath org.jetbrains.compose:compose-gradle-plugin:0.1.0-m1-build62`になぜ紐づくのか？ということです。


教えていただけたのがこちらですね。
https://docs.gradle.org/current/userguide/plugins.html#sec:plugin_markers


`${plugin.id}:${plugin.id}.gradle.plugin:${plugin.version}`
という規則で変換するようです。

org.jetbrains.composeは

`org.jetbrains.compose:org.jetbrains.compose.gradle.plugin:0.1.0-m1-build62`
になって
URLのパスとしては


group: org/jetbrains/compose
name: org.jetbrains.compose.gradle.plugin
version: 0.1.0-m1-build62
なので以下のようになるようです。
https://maven.pkg.jetbrains.space/public/p/compose/dev/org/jetbrains/compose/org.jetbrains.compose.gradle.plugin/0.1.0-m1-build62/org.jetbrains.compose.gradle.plugin-0.1.0-m1-build62.pom

でこのアーティファクトが `org.jetbrains.compose:compose-gradle-plugin:0.1.0-m1-build62` に依存しているという感じで動くみたいです。
ansibleでdry runを考慮してshellモジュールを使う方法

### shellモジュールを使うときは必ず
* `check_mode: no`をつける

### システムに変更を伴わないコマンドの場合は
* `changed_when: no`をつける
* `failed_when`は実行するコマンドによって適切に設定する

### システムに変更を伴うコマンドの場合は
* 実行したいコマンドの前に`test {{ansible_check_mode}} = False &&` をつける
* `register: result`をつけて`failed_when: ansible_check_mode==False and result.rc!=0`とする


### サンプル
以下は/tmp/tmpディレクトリがなかったら作成するというplaybookをshellモジュールだけで記述した例

```yaml
- hosts: all
  become: yes
  tasks:
    - name: check directory
      shell: test -d /tmp/tmp
      register: directory_exist
      check_mode: no
      failed_when: no
      changed_when: no

    - name: create directory
      shell: "test {{ansible_check_mode}} = False && mkdir /tmp/tmp"
      check_mode: no
      register: result
      failed_when: ansible_check_mode==False and result.rc!=0
      when: directory_exist.rc == 1
```

### 解説
ansibleのshellモジュールは--checkをつけてdry runを実行するとskippedになってしまい、そのタスクが実行されるかどうかが判定できない。この`shellモジュールで--checkだからskipped`は`whenの条件`より前に判定されるためwhenの条件が満たされているのかどうかも分からない。

この`shellモジュールで--checkだからskipped`という事象を回避するには`check_mode:no`をつけるしかない。なのでまず`check_mode:no`は必須。

そしてshellモジュールで`chech_mode:no`の時の結果だが、これは必ず`chenged`になる。`cheanged`になってほしいのはシステムに変更が伴うコマンドを実行するときなので、システムに変更が伴わないコマンドの場合は`changed_when: no`をつけて結果を`ok`にする。

しかし、`check_mode:no`にしてしまうと--checkの場合でもコマンドが実行されてしまいシステムに変更が加えらる可能性がある。これではdry runにならない。なのでシステムに変更を伴うコマンドを実行したい場合はコマンドを実行するかどうかをshellモジュールのコマンドの中で判定する。それが`test {{ansible_check_mode}} = False &&`をコマンドの最初につけることだ。`check_mode:no`としても`--check`で実行した場合は`ansible_check_mode`は`True`になるのでdry runの時は以降のコマンドは実行されない。

ただし、このままだと--checkの時はコマンド結果が必ず失敗になるのでfiled_whenで--checkの時は失敗判定しないようにする。
[Rails]大変便利なFormオブジェクトはご存知でしょうか？

# はじめに
突然ですが、「Formオブジェクト」というものを知っていますでしょうか？
便利なものなのですが、意外と使われていない人もいるかと思います。
これを知ってることで、開発がよりスムーズに進無こと間違いなしです！！

# Formオブジェクトとは？
`モデルとフォームの責務を切り分けられる`事で、単体のモデルに依存しない場合や、フォーム専用の特別な処理をモデルに書きたくない場合に用いたりします。

Railsのフォームは基本的にモデルに依存しています。例えば`1つのフォーム送信で複数のモデルの更新をしたい場合バリデーションの責務が曖昧なものとなり、可読性も低下`するため、責務を明確にするということで使います。
1つのフォームで複数モデルの操作をしたいときにForm Objectを使うと、処理がすっきりかける。またログインに関する処理など、`特定のフォームでしか行わない処理もForm Objectに書く`と良い。

## メリット
- modelとformで入力値の検証かビジネスロジックの検証かを分別することができる。
- 一度のフォーム送信時に複数の ActiveRecordモデルを更新しやすくできる。
- 同じ処理をmodelに対して行う際にForm層の再利用が可能になる。
- ActiveRecordと同じバリデーションを使うことができる。
- Formオブジェクトにパラメーターを渡すことができるためエラーメッセージを戻す処理が書きやすい。
- ビジネスロジックをcontroller/viewから切り離せる(単一責務の状態)。


## ユースケース
- ユーザからの問い合わせフォームの実装
- 1つの記事に複数の画像を保存する処理（has_manyな関係）
- ユーザーのログイン処理
- APIのパラメーターに対するバリデーション

### 使い方
1.appディレクトリにformsディレクトリを作成

```ruby
$ mkdir app/forms
```

2.利用したいフォームのFormオブジェクトを作成

```ruby
$ touch app/forms/sample_form.rb
```

3.作成したファイルに、バリデーションや使用するメソッドを記述していく。

```app/forms/sample_form.rb
class SampleForm
  include ActiveModel::Model # 通常のモデルのようにvalidationなどを使えるようにする
  include ActiveModel::Attributes # ActiveRecordのカラムのような属性を加えられるようにする

  attribute :first_name, :string
  attribute :last_name, :string
  attribute :email, :string
  attribute :body, :string

  validates :first_name, presence: true
  validates :last_name, presence: true
  validates :email, presence: true
  validates :body, presence: true

  def save
    処理
  end
end
```

コントローラーにも記述する。

```ruby
class SamplesController < ApplicationController
...

  def new
    @sample = SampleForm.new
  end

  def create
    @sample = SampleForm.new(sample_params)
    if @sample.save
      redirect_to :samples, notice: 'サンプル情報を作成しました。'
    else
      render :new
    end
  end

  private

  def sample_params
    params.require(:sample).permit(:first_name, :last_name, :email, :body)
  end
end
```


# 終わりに
開発の規模が大きくなるほどに、コントローラーやモデルは膨大になり、ごちゃごちゃしてきます。
そういう時に、処理ごとに切り分けてまとめることは可読性も上がってとても重要なことです。
状況を見て利用してみても良いかなと思います！

# 参考
[【Rails】FormObjectを使ってほしい]
(https://qiita.com/9ro/items/10e3676741e09ffb98bb)

[RailsのForm Objectについて]
(https://zenn.dev/d0ne1s/scraps/303a255d892ab0)

[【Rails】Form Objectを使ってModelに依存しないFormを作成する]
(https://tech.mof-mof.co.jp/blog/rails-form-object/)

[【Ruby on Rails】フォームオブジェクトを使って検索キーワードをcontrollerに送る]
(https://qiita.com/kumackey/items/4f8f0cd39d02299d74ed)
rails indexページでeach文書いたら、変な表示になった

#railsでindex表示に失敗した話

__以下のようなブラウザ表示になった__
---
![スクリーンショット 2021-04-17 16.52.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1326281/ec4b728a-e03f-c70a-625c-c15f67600a7b.png)

---

本当は、こうしたい
![スクリーンショット 2021-04-17 16.57.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1326281/e490817b-3e9a-7807-1cae-66e2f074824b.png)
---


###解決法

```index.html.erb
<table>
    <thead>
      <tr>
        <td>Title</td>
        <td>Opinion</td>
      </tr>
    </thead>
    <tbody>
      <% @books.each do |b| %>
        <tr>
          <td><%= link_to b.title, book_path(b) %></td>
          <td><%= b.body %></td>
        </tr>
      <% end %>
    </tbody>
  </table>
```

`<% @books.each do |b| %>`でなく`<%= @books.each do |b| %>`のように`=`をつけていたため変な表示になっていた

---
間違いあれば教えてください。
[Linux]mkdirコマンド

コマンドの個人復習メモ

#mkdirとは
make directoryの略でフォルダを作成するコマンドです。

```
$ mkdir フォルダ名
```

#特徴

###1つのフォルダしか作れない
【OKパターン】
カレントディレクトリに fruits/ フォルダ１つだけを作成は出来ます。

```
mkdir fruits
```

【NGパターン】
例えば、tomatoフォルダを作るために
<strong>vegetable/tomato/の２階層分をまとめて作成は出来ません。</strong>

mkdir目線だとvegetable/tomato/の指定は

コマンド君
「僕は現在存在していない１つのディレクトリを作る役割なので、最初に指定されているvegetable/はただのパスで、最後に指定されたtomato/フォルを作れってことね！」
「あれ？vegetable/の道がそもそもないので工事車両を向かわせることできないです。。。」

```
mkdir vegetable/tomato
*エラー*
mkdir: vegetable: No such file or directory
```

#オプション
| オプション | 利便性 |説明 |
|:-:|:-:|:-:|
| <strong>-p (--parents)</strong>| ◎| <strong>最後に指定したフォルダだけでなく、指定さえたパスのフォルダを全て作成してくれる</strong> |
| -m (--mode)| ○| 作成と同時に最後に指定したフォルダのパーミッションを同時に設定できる |
| -ｖ (--verbose)| | フォルダ作成の経過を表示する |


##サンプル
###-p (--parents)
例1

先ほどNGパターンのvegetable/tomato/に-pをつけてみるとtomato/だけでなく
<strong>パスで指定されている親ディレクトリのvegetable/も一緒に作成してくれます。</strong>

```
mkdir -p vegetable/tomato
```
ちゃんと２つのフォルダが作成されているか確かめてみます。

```
tree vegetable
*結果*
vegetable
└── tomato
```

例2

すでにvegetable/は存在し、中身もあります。その状態でvegetable/carrot/redのように指定してみます。
<strong>vegetable/は中身ごと上書きされることはありません。(tomatoフォルダはそのままです)
そして、存在していないcarrot/とcarrot/の中身のredの合計２フォルダだけを追加で作成してくれます。</strong>

```
mkdir -p vegetable/carrot/red
```
ちゃんと追加で２つのフォルダが作成されているか確かめてみます。

```
tree vegetable
*結果*
├── carrot
│   └── red
└── tomato
```

###-m (--mode)
後日記述
###-v (--verbose)
AWSのlambdaを使って、翻訳機能を実装してみた

#はじめに
最近本格的にAWSの勉強を始めたので、そのoutputのために書きました。
同じようにAWSの初学者の方の助けになると幸いです。
#前提として
* python を基本コードとして使います
* AWS マネジメントコンソールを登録している前提で始めます

#関数の作成
まずAWS マネジメントコンソールを開き、上の検索バーのところで「lambda」検索します。
下の画面に行くと、オレンジ色の<font color="DarkOrange">「関数の作成」</font>を選びます。![lamda作成.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1299864/0f058901-eec2-7091-3624-cec56a7c4327.png)
その後の設定は、以下のようにします。![lambda作成2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1299864/7ca6b088-055d-7615-4c8f-df9ae88dfd10.png)
関数が、作成されると次にコードの部分に以下の内容をペーストしてください。
これでソースコードは完成です！

```
import json
import boto3

translate = boto3.client('translate')

    
def lambda_handler(event, context):
    
    input_text = "おはよう"
    response = translate.translate_text(
        Text= input_text ,

        SourceLanguageCode='ja',
        TargetLanguageCode='en'
    )
    output_text = response.get('TranslatedText')    
    
    return {
        'statusCode': 200,
        'body3': json.dumps({
            'output_text' : output_text
        })
    }
```
次に<font color="DarkOrange">「TEST」</font>クリックして、出力してみます。![エラーメッセージ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1299864/348e2c9f-c99e-6392-8486-940de6de3f63.png)
すると、TranslateText operation の権限がない状態でその関数を使ったためエラーが出ていることが分かります。なので、次に権限の付与を行います。
#権限を与える
設定からアクセス権限を選択し、実行ロール中の付与を与えたい関数を選択します。
![設定権限.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1299864/5d2d12c9-1462-244d-2cef-860aa95db6a5.png)
そして、アクセス権限の、<font color="Blue">「ポリシーをアタッチします」</font>を押してください。そこの検索バーから「Translate Full Acess」を選択します。すると付与成功です！
ちなみに先ほどのこの部分で確認できます。![付与確認.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1299864/580d4617-14d8-24a5-f47d-ac04a66d4c82.png)
以下が完成結果です。![完成翻訳.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1299864/dcde44bf-9894-0dc0-072a-f99b4a57ed80.png)
#今回の概要
![翻訳.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1299864/9944d692-bdb6-f04a-f7de-7e99877839f3.png)
[Java] インターフェースとはなんぞや？


# 【Java】 interfaceとはなんぞや？

よくわからないのでアウトプット．
**これがあってるのかはわからない**．．気をつけろ．．．

# interfaceとは?
見つけた限りでは

- **メソッド名，引数，返り値のみを定義したもの**
- **「このクラスは，〇〇というメソッドを持ちます」という「約束」**
- **設計に一定の基準を設け，その基準を強制させるもの**

こんな奴らしい．．．

# いつ使うの？
- 今後沢山，仕様変更がありそうな時
- 大人数での開発
- 大型プロジェクト

こんな時に使うそうだ．

# interfaceの目的

- クラス間の依存度を下げたい
- 疎結合の実現
- 変更に強くしたい

観測した中で多かった意見．
仕様が生えてきたときにいっぱい変更したくない！！！
先に対策を打っておこうという感じだと思う．

# どういうこと？
具体？例で説明を試みる．

## 前提
- チーム開発
- interfaceを使わずに作った
- 誰かが作ったクラスAがクラスBからあるデータを受け取っていた

## ストーリー
1. 仕様変更により，クラスCからデータを受け取るように変更しなければならなくなった．
2. クラスCを作ったが，**クラスAはクラスBからデータを受け取る前提**だった，修正が必要に．
3. **クラスCの内容を知った上で，誰かが作ったクラスAを修正**することになった．

## 何がまずいのか？
問題は**クラスCの内容を知った上で，誰かが作ったクラスAを修正**しなければならないことです．
**クラスAがクラスBに対する依存度が高い**ため，このようなことになってしまいました．

しかも今度は，**クラスCに対する依存度が高くなっています**．

今後クラスDやE生えてきたら．．．大変ですね．．

## どうしたらよかったのか？

**クラスAとクラスBの間にinterfaceを設けておく**

クラスAはinterfaceに従って流れてきたデータを受け取ります．
interfaceに従ってクラスCを実装すれば，クラスAを変更する必要がなくなります．

将来，クラスCをDやEに変更したとしてもinterfaceに従っている限り，クラスAはクラスEやDを知る必要がありません．

今後もクラスAはinterfaceに従って流れてきたデータを受け取るだけです．

たぶん．．．

## 結局何が言いたい？
**依存度を下げるために外側に規約を作っておけば，中身を知る必要はないぜ．**
**しかも規約に従っとけば何してもおk**

って，事だと思う．みんな規約に従えば，ヨシ！！！
その規約がinterface．

#ごめん，やっぱりよくわからなかったわ．．．
言葉だらけでお察しの通りよくわかってないです．．
もう疲れたのでこのまま投げます．

#参考文献

各所で引用されている神
https://www.gixo.jp/blog/5159/

teratail
https://teratail.com/questions/70213

もうちょっと具体的な話が多い記事
https://engineer-club.jp/java-implements#implements3
C言語で線形代数を復習してみる

## C言語で簡単な行列を作る

目的１：行列の概念を知ること。
目的２：コマンドライン入力で行列を指定してそのまま行列を出力する。

プログラミングのフロー
手順１：行列の行と列の数を指定する。
手順２：行列の各値を指定する
手順３：行列を出力する

先に行列の概念を説明してからプログラミングに入ります。

###行列の概念

####Q１：まず行列とはなんですか？
これは学生時代に行列について聞かれた時に詰まった質問です。
一般的に行列と呼ばれるものは次のようなものです（行が２つ、列が２つあるので２次正方行列といいます）。

```math
\begin{bmatrix}
a & b \\
c & d
\end{bmatrix}
```
最初はなんか数字がかっこの中に並んでるなぁぐらいの認識であんまり考えず計算とかしていました。
大学ではめちゃくちゃ小難しい言葉で全然理解できなかった記憶があります。
行列を簡単に説明すると「次元の拡張」という言葉で表現できます。

####Q２：具体例
たとえばあなたがなにかジュースを作りたいとします。
ジュースをつくるには材料、分量などを考えて作る必要がありますね。

水と言う１×１行列があるとします。

```math
\begin{bmatrix}
水  \\
\end{bmatrix}
```

これだと水以外の情報がないので水＝水ですね。
これだとジュースは作れそうにないです。
なので次元を拡張してジュースを作れるようにしてあげます。

```math
\begin{bmatrix}
水 & りんご \\
500mL & 果汁100%
\end{bmatrix}
```

これを見るとなんとなく５００mLのリンゴジュースを作れたなと理解できますね。

なので次元を拡張する→扱うデータを増やすと言えそうです。
これが何がいいかと言うと、ビッグデータを扱うときに、データの特徴を捉えたり、分析するのが可能になるわけです。

実際にはそのように簡単に理解することが難しいです。なのでデータサイエンティストとか統計、分析でご飯を食べている人がいるんですね。

###C言語で行列を作ってみる

####行列を作るのに必要な変数を用意する。

行列を作るのに必要な情報は
＞行数（横にいくつ数字を並べるか）
＞列数（行にいくつ数字を並べるか）
＞出力する行列の初期化

コマンドラインから行数と列数を柔軟に変更できるようにrowとcolumn変数を用意しておきます。

変数宣言

```c:matrix.c
int row;
int column;
//行列の出力を10次正方行列までに限定する
int matrix[10][10];
```

行列を生成する関数

```c:matrix.c
void generate_matrix()
{

    /* 入力した行列の表示 */
    printf("\nA = \n");
    for (int i = 0; i < row; ++i)
    {
        for (int j = 0; j < column; ++j)
        {
            printf("%d  ", matrix[i][j]);
            if (j == column - 1)
                printf("\n");
        }
    }
}
```



main処理
コマンドラインから行と列、各値を入力します。

```c:matrix.c
int main(void)
{
 
    printf("行数 = ");
    scanf("%d", &row);
    printf("列数 = ");
    scanf("%d", &column);

    /* 行列の入力 */
    printf("\n行列を入力してください\n");
    for (int i = 0; i < row; ++i)
    {
        for (int j = 0; j < column; ++j)
        {
            printf("行列の要素 A[%d][%d] = ", i + 1, j + 1);
            scanf("%d", &matrix[i][j]);
        }
    }

//行列を生成して表示
    generate_matrix();

    return 0;
}
```

ソースコードは次のGitHubにあります。
https://github.com/YUJIjs/matrix
jQueryが動かなかった原因について（初歩的なミス)

現在bootstrapで作成中のWebサイトにjQueryを使用して動きをつけようとした時に
jQueryが動かず、四苦八苦したので備忘録のために記録を残して起きます。
（高度な内容ではありません。初心者が陥った初歩的なミスの記載です。過度な期待はしないでください。）

○今作っているサイト
![スクリーンショット 2021-04-17 15.57.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/633008/9d0e1b8f-aacd-a3fa-f9bb-2d253ff54656.png)

福祉のマッチングサービスになります。（詳細は割愛）
こちらのサイトにjQeryを入れたいと思いました。
○テスト用のjQeryを入れてみる
![スクリーンショット 2021-04-17 15.54.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/633008/1f019e88-323d-c737-e30b-b6900e821535.png)

```index.html
  <p class="title">jqueryのテスト</p>
  <button type="button" id="btn1">jQueryで表示</button>
  <button type="button" id="btn2">表示をかくす</button>
  <div id="TextArea">
    <p>こんにちは！</p>
    <p>jQueryを使って表示しています。</p>
  </div>
```

```application.js
$(function () {
  // 初期表示で隠しておく
  $("#TextArea").hide();
  $("#btn1").on("click", function () {
    $("#TextArea").show();
  });
  $("#btn2").on("click", function () {
    $("#TextArea").hide();
  });
});
```
表示ボタンを押したらテキストが表示して、隠すボタンを押したら消えるという簡単な内容のものです。

○今回起こったこと○
各ボタンを押しても何も動かない

試したこと①　bootstrapの初期状態のスリム版jQueryをフル版にしてみる
bootstrapを使用する時に初期状態で書かれているjQueryはスリム版の一部の必要な機能だけを使えるようにしたものである。これを公式ホームページからフル版を持ってきて貼り付けてみました。
https://code.jquery.com/の uncompressedというところにあります

```index.html
○変更前
<script src="https://code.jquery.com/jquery-3.5.1.slim.min.js" integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj" crossorigin="anonymous"></script>
○変更後
<script src="https://code.jquery.com/jquery-3.6.0.js" integrity="sha256-H+K7U5CnXl1h5ywQfKtSj8PCmoN9aaq30gDh27Xc0jk=" crossorigin="anonymous"></script>
```

結果：変わらず

試したこと②　別のJSファイルを作成してみる
現在apllication.jsには通常使用しているjsの命令も記載されています。
それがいけないかと思い「jquery.js」とう別のファイルを作成して分けて記載してみました。
結果：動いた

試したこと③　jQeryの命令文をファイルの頭にのってくる
②でjQueryの命令文が問題がないことがわかったので、もしかしたら他のJSの命令文が
悪さをしているんじゃないかと思いapllication.jsの1番上にjQuerの命令文を持ってきました。
結果：動いた

○最終的な原因○
コンソールでみたらJSのエラーが出ており、処理が途中で止まっていました。
![スクリーンショット 2021-04-17 16.27.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/633008/a9a7da64-9b20-7e1e-8b91-7ad65794cc65.png)


エラーが出ているところはindex.htmlでは使用しない利用者の生年月日をプルダウンで選ぶための処理でした。
その下以降にJqueryの分を入れると動かなくなります。
index.htmlでは使わないからエラーが出てしまってもいいんだhahahaha
と思っていましたが、大きな間違いでした。

○解決方法○
エラーが出ている生年月日の処理を使用するページのみで読み込むようにする
今回の件で一部のページにしか使わない処理は、まとめたファイルに書かないで個別に書くということを学びました。
Google スプレッドシートで日付形式に条件付き書式設定ルールを付けたいとき

```
=A1=datevalue(year(today())&"/"&month(today())&"/1")
```

A1の部分は条件付き書式の場合、必ず一つずつズレて判定してくれるので、
縦に数値が並んでいる場合、**$A1** と、記述しておくのも一つの手。

今回は　2021/04/17 などの、
yyyy/mm/dd 形式で記述してある場合に有効な方法。

***DATEVALUE*** は日付形式に記述している内容を日付としてスプレッドシートに認識させる関数。
なので、***TODAY()*** 関数を使って、まず本日の日付を取得、
___YEAR()___ と ___MONTH()___ 関数を使い、***年の数値と月の数値***を取得。

最後に　"***&***" を付けて文字列　"/1" を付ければ、
"yyyy/mm/1" という表記になる。


多くの月表示を作る場合は、
yyyy/mm と入力して、スプレッドシートが自動でyyyy/mm/01と、
変換してしまうはずなので、
この方法なら条件付き書式で当月を判定させることが可能になる。

お困りの方がいたらぜひ。
Dockerをpushしようとしたらdeniedとエラーが出た

# 課題

`docker push`
を実行すると

```
denied: requested access to the resource is denied
```

と表示されpushを行うことができなかった。


# 解決策
イメージをローカルで作成後、プッシュをするにはtagを作成する必要がある。
(githubのcommitと同じような感じだな）


```bash:
% docker tag イメージID DockerHubのユーザ名/任意の名前
```
その後、任意でつけたイメージ名を指定してpushすればいい

例
イメージID:123456789012
DockerHubのユーザ名:hogehoge

```bash:
% docker tag 123456789012 hogehoge/mogemoge
```
を実行後、push

```bash:
% docker push 123456789012 hogehoge/mogemoge
```
ffmpeg で NVEnc を使って複数ファイルを出力しようとしたら "No NVENC capable devices found" と怒られる件（賢い対応策は今のところなし）

#やりたいこと
シングルビットレートの MP4 ファイルを、5 つの異なるビットレートにトランスコードしたい。

#環境
* Windows 10 Version 20H2
* ffmpeg version 4.2
* NVIDIA GeForce RTX 2060
    * Driver Version : 27.21.14.5774

#愚直にやるなら
各ビットレート毎に、コマンドライン引数のビットレートの設定を変えて ffmpeg を実行すればよい。

##CPU エンコード版

```shell
ffmpeg -i 入力ファイル.mp4 -vb ターゲットのビットレート 出力ファイル.mp4
```

## NVEnc 利用版

```shell
ffmpeg -i 入力ファイル.mp4 -vcodec h264_nvenc -vb ターゲットのビットレート 出力ファイル.mp4
```

# 一回のコマンド実行で複数の出力を得る方法
ffmpeg のコマンドの書式は以下のようになっており、入力と出力は基本的には好きなだけ追加できる（はず）。

```shell
ffmpeg （グローバルオプション) (入力Aオプション) (入力A) (出力1のオプション) (出力1) ....
```

なので、こんな感じで出力を連結して入力してみた。

```shell
ffmpeg -i 入力ファイル.mp4 -vcodec h264_nvenc -vb 2000k 出力ファイル1.mp4 -vcodec h264_nvenc -vb 1500k 出力ファイル2.mp4 -vcodec h264_nvenc -vb 1000k 出力ファイル3.mp4 -vcodec h264_nvenc -vb 750k 出力ファイル4.mp4 -vcodec h264_nvenc -vb 500k 出力ファイル5.mp4
```

これで上手くいくかと思いきや、出力ファイルが 4 つ以上になると怒られる。

```shell
[h264_nvenc @ 000001f885d9c380] OpenEncodeSessionEx failed: out of memory (10)
[h264_nvenc @ 000001f885d9c380] No NVENC capable devices found
Error initializing output stream 3:0 -- Error while opening encoder for output stream #3:0 - maybe incorrect parameters such as bit_rate, rate, width or height
Conversion failed!
```

#原因調査
色々調べてみたところ、NVENC に同時に張れるセッション数に制限があるようだ、ということは分かった。

[Nvidia Nvenc Video Conversion from mxf to mp4 getting error for multiple streams inside](https://stackoverflow.com/questions/55103406/nvidia-nvenc-video-conversion-from-mxf-to-mp4-getting-error-for-multiple-streams)

とりうる手段としては、エンコードするストリームを明示的に指定するか、パッチを当ててセッション数のリミットを上書きしなければいけないらしい。

#結果
今回どちらの対応策も取れなかったため、ビットレート毎に別々にコマンドを発行する形で結局落ち着いた。
（もっといい方法があるよ！という方いらっしゃったら教えてください…。）
Mac の OS を上げたら Flutter web が動作しない問題が解決した

```zsh
$ flutter run -d Chrome
Running “flutter pub get” in hello_world...             3.5s
Launching lib/main.dart on Chrome in debug mode...
Waiting for connection from debug service on Chrome...       11.7s
```
ここで止まってしまう状態で唸り続けていたのだが、やっと解決。

なんと **Mac の OS が古い** のが原因だった。Big Sur に更新したら普通に起動した。なんということでしょう...
Excelで複数行の値を統合するVBAマクロ

Excelで、改行のあるテキストを貼り付けた時、PPTなどからコピペした時、複数行に値が分かれてしまって困ることはありませんか。
![Qiita Excel Image2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103793/1726dfa1-98ec-a144-f09d-441089b9a5c3.png)
F2を押して数式バーに貼り付ければ手順的には良いのですが、数が多いとイラッとしますよね。
以下は、7行のセルを1つ目のセルに統合するサンプルです。

```
Sub IntegCell()
    Dim FromCell As String
    Dim ToRange As Range
    FromCell = ActiveCell.Text
    ' 2行目から7行目を選択し、1行目に統合　行数を調整したい場合はここを変更
    For Each ToRange In ActiveCell.Range("A2:A7")
        If ToRange.Text <> "" Then
            FromCell = FromCell & vbLf & ToRange.Text
            ToRange.Clear
        End If
    Next ToRange
    ActiveCell.Range("A1").Value = FromCell
End Sub
```
LabVIEWでMNISTデータを表示する方法

#はじめに
有名な手書き数字のデータセットであるMNISTを、LabVIEWのピクチャ表示器に表示する方法を紹介します。
本サンプルで実現している処理は画像表示のみですが、LabVIEW標準関数のWrite JPEG File.viなどを追加することによって、MNISTデータの画像保存も実現可能です。
本viは、下記配布元よりダウンロードした、t10k-images-idx3-ubyteおよびtrain-images-idx3-ubyteの読込みが可能です。

MNISTデータセットの配布元
http://yann.lecun.com/exdb/mnist/

#作成したvi
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674241/044a22b1-dc83-7013-f880-fac6f9749dc1.png)

![Read_MNIST.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674241/277e839f-dd6c-d92d-de00-f88ea3c2aa79.png)

#画像保存処理を追加する場合
下図のように、Flatten Pixmap.viの出力"image data"を、Write JPEG File.viなどに渡すことによって画像保存が可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674241/1cd1a3a3-b013-187c-a759-9fc75998852a.png)
ユーザレベルで systemd のユニットファイルを書くときの注意点

# はじめに
systemd はシステムワイドでの起動とユーザレベルでの起動の 2 種類ある。

```shell:Shell
(sudo) systemctl <SUB_COMMAND> <SERVICE_NAME> # system-wide
systemctl --user <SUB_COMMAND> <SERVICE_NAME> # user-level
```

ユニットファイル (`*.service`) を書くとき、システムワイドでは問題ないがユーザレベルだと使えなかったり正しく起動できないものがあるのでまとめておく。



# `User` / `Group` は使えない
システムワイドでは、どのユーザでデーモンを起動するかを指定するために、`User` や `Group` というのを使うことがあるが、ユーザレベルでは使えない。

```config
[Service]
User=ubuntu
Group=ubuntu
```

## 発生する問題
ユーザレベルで上記の項目を書くと、以下のようなエラーが発生する。

```log:Log
foo.service: Failed to determine supplementary groups: Operation not permitted
foo.service: Failed at step GROUP spawning /usr/bin/env: Operation not permitted
```

## 解決策
単に `User` や `Group` を削除すれば良い。

削除後はデーモンのリロードを忘れずに。

```shell:Shell
systemctl --user daemon-reload
```

https://unix.stackexchange.com/questions/438064/failed-to-determine-supplementary-groups-operation-not-permitted



# `multi-user.target` は使えない
システムワイドでは `WantedBy` に `multi-user.target` を指定することがあるが、これもユーザレベルでは使えない。

```config
[Install]
WantedBy=multi-user.target
```

## 発生する問題
これが書かれていてもデーモンの起動自体はできるが、自動起動を有効にしていてもシステム起動時のデーモンの自動起動が効かなくなる。

## 解決策
代わりに、`default.target` が使える。

```config
[Install]
WantedBy=default.target
```

ちなみに、上記の間違いを修正する際、すでに自動起動を有効にしている場合は、いったん無効にしてもう一度有効にする必要がある。もちろんデーモンのリロードも必要。

```shell:Shell
systemctl --user daemon-reload
systemctl --user disable <SERVICE_NAME>
systemctl --user enable <SERVICE_NAME>
```

正しく追加されているか確認するには、以下のコマンドを実行する。

```shell:Shell
systemctl --user list-dependencies default.target
```

https://github.com/systemd/systemd/issues/2690#issuecomment-186973730
ActiveHash を使って記事に紐付けた都道府県データを元に、地方別の投稿一覧を作る

# 前提
自作のアプリケーションで文化施設の情報を投稿できるものを作っていて、
投稿時に入力した都道府県のデータを元に、地方ごとで一覧表示できるようにしました。

そもそも投稿の時に地方の情報も一緒に登録するとか、
地方ごとに同じようなコードを書いているのであまりよろしくないとか改善の余地はたくさんあるとは思いますが、
とりあえず動かすことはできたという記録のために記事を作成します。

# 都道府県データ
```prefecture.rb
class Prefecture < ActiveHash::Base
  self.data = [
    { id: 1, name: '---' }, { id: 2, name: '北海道' }, { id: 3, name: '青森県' },
    { id: 4, name: '岩手県' }, { id: 5, name: '宮城県' }, { id: 6, name: '秋田県' },
    { id: 7, name: '山形県' }, { id: 8, name: '福島県' }, { id: 9, name: '茨城県' },
    { id: 10, name: '栃木県' }, { id: 11, name: '群馬県' }, { id: 12, name: '埼玉県' },
    { id: 13, name: '千葉県' }, { id: 14, name: '東京都' }, { id: 15, name: '神奈川県' },
    { id: 16, name: '新潟県' }, { id: 17, name: '富山県' }, { id: 18, name: '石川県' },
    { id: 19, name: '福井県' }, { id: 20, name: '山梨県' }, { id: 21, name: '長野県' },
    { id: 22, name: '岐阜県' }, { id: 23, name: '静岡県' }, { id: 24, name: '愛知県' },
    { id: 25, name: '三重県' }, { id: 26, name: '滋賀県' }, { id: 27, name: '京都府' },
    { id: 28, name: '大阪府' }, { id: 29, name: '兵庫県' }, { id: 30, name: '奈良県' },
    { id: 31, name: '和歌山県' }, { id: 32, name: '鳥取県' }, { id: 33, name: '島根県' },
    { id: 34, name: '岡山県' }, { id: 35, name: '広島県' }, { id: 36, name: '山口県' },
    { id: 37, name: '徳島県' }, { id: 38, name: '香川県' }, { id: 39, name: '愛媛県' },
    { id: 40, name: '高知県' }, { id: 41, name: '福岡県' }, { id: 42, name: '佐賀県' },
    { id: 43, name: '長崎県' }, { id: 44, name: '熊本県' }, { id: 45, name: '大分県' },
    { id: 46, name: '宮崎県' }, { id: 47, name: '鹿児島県' }, { id: 48, name: '沖縄県' }
  ]

  include ActiveHash::Associations
  has_many :posts
end
```

ActiveHash については割愛しますが、上のように都道府県ごとにid で投稿に紐付けられるようにしています。

# ルーティング
```routes.rb
Rails.application.routes.draw do
  devise_for :users
  root to: "posts#index"
  resources :posts do
    collection do
      get 'search'
      get 'search_kanto'
    end
  end
end
```

# モデル
```post.rb
class Post < ApplicationRecord
  belongs_to :user
  has_one_attached :image
  has_many :favorites, dependent: :destroy
  extend ActiveHash::Associations::ActiveRecordExtensions
  belongs_to :prefecture

  # 〜省略〜

  def self.search_kanto
    Post.where(prefecture_id: 9..15)
  end
end
```

where句で指定の都道府県が登録されている投稿を取得しています。
# コントローラー
```posts_controller.rb
class PostsController < ApplicationController

  # 〜省略〜

  def search_kanto
    @posts_kanto = Post.search_kanto.order('created_at DESC')
  end
end
```

@posts_kantoに取得した投稿を代入して、ビューファイルで表示できるようにしています。
# 学んだこと
where句を使って検索条件を指定する部分が自分でやってみて多少は理解できたかなというところです。
最初にも書いたように地方ごとにほぼ同様のコードを書いているので、そこは何とかシンプルにできるようにしたいです。
拙い内容とは思いますが読んでいただいてありがとうございます。
インストールされているnpmパッケージのバージョンをJSONで取得するワンライナー

# モチベーション

npmでインストールしているパッケージの、実際のバージョンを把握したいときがあります。

`package.json` の `dependencies` や `devDependencies` にバージョンが記載されていますが、このバージョンは実際にインストールされているバージョンと異なります。

もちろん `package-lock.json` を見れば正確なバージョンが分かりますが、、、
ここはサクッとシェルからバージョンを取得できたら嬉しいですね。

# ワンライナー

JSON形式で `npm ls --depth=0` から返ってくる値を、 `jq` コマンドを使って整形しています。

```shell
npm ls --depth=0 --json 2>/dev/null | jq '.dependencies | to_entries | map(select(.value.extraneous != true)) | map( { key: .key, value: .value.version } ) | from_entries'
```
※ `jq` がないと動きません。

## 表示される結果例

```json
{
  "npm": "7.10.0"
}
```
githubのssh設定

#鍵生成

```
$ ssh-keygen -t rsa -b 4096 -f ~/.ssh/github -N "pass" -C "sample@mail"
```
オプションについて
`-t` 暗号化形式を指定する`rsa`,`dsa`,`ecdsa`,`ed25519`
`-b`作成する鍵のビット数を指定
`-f`ファイルを指定する
`-N`新しく設定するパスフレーズを指定
`-C`コメントを指定
公開鍵設定
~/.ssh/configに以下を設定

```
Host github.com
    IdentityFile ~/.ssh/github
    User git
```

cloneやり方

```
短縮じゃないやつ
$ git clone ssh://git@github.com/pugsatoshi/start

短縮の場合
$ git clone git@github.com:pugsatoshi/start
```
Bulk APIを使って添付ファイルをアップロードする

普段はBulk API　をCURLコマンドで使っています。

添付ファイルをアップする設定です。


ここのポイントはcontentTypeです。　ZIP_CSVとします。
job_xml

```
<?xml version="1.0" encoding="UTF-8"?>
<jobInfo xmlns="http://www.force.com/2009/06/asyncapi/dataload">
    <operation>insert</operation>
    <object>ContentVersion</object>
    <contentType>ZIP_CSV</contentType>
</jobInfo>
```


アップロードするファイルと設定ファイルをZIP化します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/abc34290-154b-99c6-152a-75264fdd2dda.png)


設定ファイルはrequest.txtです。

ここのポイントはVersionData,PathOnClientの２つの項目。

```
Title,Description,VersionData,PathOnClient,OwnerId,FirstPublishLocationId,TagCsv
Book5,ContentVersion,#Book5.pdf,#Book5.pdf,,,Book5
```

この質問への回答のために設定してみまた。
[ContentNote Bulk API Error](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000A9Av5SAF)

追記
質問は拡張メモへのデータのロードでした。私はやったことがなかったのですが添付ファイルと同じではと思っていました。
（私はやってないけど...）
質問者さんがやってくれて、やり方が分かりました。

request.txtは次のようになります... 

```
Title、Content
Test Note One、＃testfile1.txt
Test Note Two、＃testfile2.txt
```


レコードの添付ファイル（ContentVersion）または本文（ContentNote）であるのは、バイナリ要求本文（zipファイル）内のファイルの名前です。


+ [フォルダ内のファイルをまとめてアップロード可能か](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007Rd46H)

:::note
データローダを使用してドキュメントを一括インポートできるのですが、同じような階層構造にはならないと思います。

Salesforce へドキュメントを一括インポートする
https://help.salesforce.com/s/articleView?id=000384978&type=1
:::
【C#】「さっ！」とデータを保存しよう!

#初めに
プログラムでデータを保存したいことがありませんか？
ただ、あまり簡単にする方法が見つかりにくい気がします
なのでまとめます。あくまで、簡単に「さっ」と実装する方法です

#本編
初めから保存するプログラムを行きましょう
##プログラム
```csharp:XMLClass
public static class XMLClass
{
    public static string SaveToString<T>(T control)
    {
        var writer = new StringWriter(); // 出力先のWriterを定義
        var serializer = new XmlSerializer(typeof(T));
        serializer.Serialize(writer, control);
        var xml = writer.ToString();
        Console.WriteLine(xml);
        return xml;
    }

    public static T LoadFromString<T>(string xml)
    {
        var serializer = new XmlSerializer(typeof(T));
        var deserializedBook = (T)serializer.Deserialize(new StringReader(xml));
        return deserializedBook;
    }
}
```
これがプログラムとなります。
**これはファイルへの保存は含まれていません**、
なのでファイルへの読み書きは自分で実装する必要がありますが
文字列化してしまえば、ファイルへの読み書きが簡単にでき、文字列であればいろいろな場面で使えるためこのようにしました
ジェネリックで型を指定するため基本的に**ほとんどの型**に対応しています

##使い方
これはstaticのクラスなので、インスタンスなしに実行できます
サンプルプログラムを以下に示します

```csharp:Sample
using System;
using System.IO;
using System.Xml.Serialization;

class Sapmle
{
    void Main()
    {
        //セーブするデータを作成
        SaveData save = new SaveData();
        save.data ="hogehoge";
        save.number = 100;

        //データをXML化
        string xml=XMLClass.SaveToString<SaveData>(save);

        //データをxmlから復元
        SaveData sdata =XMLClass.LoadFromString<T>(string s);
        
        //データの確認
        Console.WriteLine(sdata.data);
        Console.WriteLine(sdata.number);
    }
    
}
class SaveData
{
   public string data;
   public int number;
}
```

このように使うことができます
ファイルへはstring型のxmlの変数内に入った文字列をファイルに出力することで保存することが可能です

##注意点
WPFやForm,Refrectionなど一部例外が発生し保存できないものがあるのでご注意ください
また保存させたくない場合は

```csharp
[System.Xml.Serialization.XmlIgnore]
```

の属性を付けることで保存させないことが可能です

#終わりに
かなり雑にですがC#での簡単なデータ保存の方法をまとめました、
何かご不明な点などがございましたらコメントまでお願いします。
最後までご覧いただきありがとうございました。