OmniAICreator/Qiita-1.07M huggingface dataset:
Javaを通してPDFタイル画像の背景（透かし）を設定する方法

##概要と環境への準備
この記事では、PDFライブラリの無料バージョン（Java用のFree Spire.PDFを使用して画像をロードし、タイル画像の透かしとしても使用できるPDFタイル画像の背景を設定する）を紹介します。コードを編集する前に、jarファイルをインポートする必要があります。2つのタイプがあります。メソッドはオプションでインポートされます。

1.手動でのダウンロードとインポート：公式Webサイトにアクセスしてjarパッケージを**[ダウンロード](https://www.e-iceblue.com/Download/pdf-for-java-free.html)**し、解凍して、libフォルダー内のSpire.Pdf.jarファイルをJavaプログラムにインポートできます。

2. Mavenリポジトリーのインポート：Mavenプロジェクトを作成することにより、pom.xmlファイルでMavenリポジトリー・パスを構成し、次のようにFree Spire.PDF for JavaのMaven依存関係を指定します。
<repositories>
        <repository>
            <id>com.e-iceblue</id>
            <url>http://repo.e-iceblue.com/repository/maven-public/</url>
        </repository>
    </repositories> 
<dependencies>
    <dependency>
        <groupId> e-iceblue </groupId>
        <artifactId>spire.pdf.free</artifactId>
        <version>4.4.1</version>
    </dependency>
</dependencies>
構成が完了したら、「変更のインポート」をクリックしてJarファイルをインポートします。

**Jarのインポート結果は次のとおりです。**
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/e13466c6-3d70-06d8-add8-c0163f80b647.png)

##Javaコード一覧
```
import com.spire.pdf.*;
import com.spire.pdf.graphics.PdfImage;
import com.spire.pdf.graphics.PdfTilingBrush;

import java.awt.*;
import java.awt.geom.Dimension2D;
import java.awt.geom.Rectangle2D;

public class AddBackground {
    public static void main(String[] args) {
        //PdfDocumentオブジェクトを作成し、PDFテストドキュメントをロードする
        PdfDocument pdf = new PdfDocument();
        pdf.loadFromFile("C:\\Users\\Administrator\\Desktop\\test.pdf");

        //ドキュメントの各ページをトラバースし、画像をロードして、タイル状の背景（透かし）として設定する
        for (int i = 0; i < pdf.getPages().getCount();i++)
        {
            PdfPageBase page = pdf.getPages().get(i);

            Dimension2D dimension2D = new Dimension();
            dimension2D.setSize(page.getCanvas().getSize().getWidth()/4, page.getCanvas().getSize().getHeight()/3);

            PdfTilingBrush brush = new PdfTilingBrush(dimension2D);
            brush.getGraphics().setTransparency(0.2f);
            brush.getGraphics().translateTransform(brush.getSize().getWidth()/10,brush.getSize().getHeight()/10);
            brush.getGraphics().rotateTransform(30);

            PdfImage image = PdfImage.fromImage("C:\\Users\\Administrator\\Desktop\\logo.png");
            brush.getGraphics().drawImage(image,brush.getSize().getWidth()-image.getWidth()/2,(brush.getSize().getHeight())/2);

            Rectangle2D rectangle2D = new Rectangle2D.Float();
            rectangle2D.setFrame(new Point(0,0),page.getCanvas().getClientSize());

            page.getCanvas().drawRectangle(brush,rectangle2D);
        }
        //ドキュメントを保存する
        pdf.saveToFile("SetTiledBackground.pdf");
        pdf.dispose();
    }
}
```
タイル画像の背景（透かし）を設定した結果はこのように：
![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/9c8030db-65a8-8256-3070-e70ad19e28d1.png)

以上です、今回のPDFタイル画像の設定方法はここまで、最後まで読んでいただきありがとうございます！
C言語で出力される文字の色や背景を変える。

#はじめに
授業で使った出力される文字や背景の色を変えるエスケープシーケンス、便利だなと思ったので覚えるためにも記事を書いてみる。

##エスケープシーケンスを使って色を変える。


|背景色|記述|前景色|記述|
|-----|----|------|----|
|黒      |¥x1b[40m|黒      |¥x1b[30m|
|赤      |¥x1b[41m|赤      |¥x1b[31m|
|緑      |¥x1b[42m|緑      |¥x1b[32m|
|黄色    |¥x1b[43m|黄色    |¥x1b[33m|
|青      |¥x1b[44m|青      |¥x1b[34m|
|マゼンタ|¥x1b[45m|マゼンタ|¥x1b[35m|
|シアン  |¥x1b[46m|シアン  |¥x1b[36m|
|灰色    |¥x1b[47m|灰色    |¥x1b[37m|
|リセット|¥x1b[49m|リセット|¥x1b[39m|

##サンプルコード

```
#include <stdio.h>

int main()
{
	//背景色を黒に
	printf("\x1b[40m黒\n");
	//背景色を赤に
	printf("\x1b[41m赤\n");
	//背景色を緑に
	printf("\x1b[42m緑\n");
	//背景色を黄色に
	printf("\x1b[43m黄色\n");
	//背景色を青に
	printf("\x1b[44m青\n");
	//背景色をマゼンタに
	printf("\x1b[45mマゼンタ\n");
	//背景色をシアンに
	printf("\x1b[46mシアン\n");
	//背景色を灰色に
	printf("\x1b[47m灰色\n");
	//背景色をデフォルトに戻す
	printf("\x1b[49mリセット\n");

	//前景色を黒に
	printf("\x1b[30m黒\n");
	//前景色を赤に
	printf("\x1b[31m赤\n");
	//前景色を緑に
	printf("\x1b[32m緑\n");
	//前景色を黄色に
	printf("\x1b[33m黄色\n");
	//前景色を青に
	printf("\x1b[34m青\n");
	//前景色をマゼンタに
	printf("\x1b[35mマゼンタ\n");
	//前景色をシアンに
	printf("\x1b[36mシアン\n");
	//前景色を灰色に
	printf("\x1b[37m灰色\n");
	//前景色をデフォルトに戻す
	printf("\x1b[39mリセット\n");
}
```
###上記のコードの出力結果

![カラフル.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2506154/f3bc58a6-f5fd-92f2-2592-2f5c7f6442e8.png)
ちゃんと色が変わりました！！

##最後に
今回のエスケープシーケンス以外にも便利なエスケープシーケンスが一杯あるので覚えて使いこなせるようになりたいと思いました！
pydocの使い方

**pydoc**を使ってドキュメント生成をしてみたので簡単にメモしておく。

# pydocの使い方
**pydoc**は、Pythonに標準で入っており、**docstring**で書かれたコメントからドキュメントを作成することができる。
JavaのJavadocのようなもので、HTML形式で出力することもできる。
ドキュメントを出力するには以下のコマンドを実行する。

```
// 画面表示する場合
$ pydoc <ファイル名>

// HTML形式で出力する場合
$ pydoc -w <ファイル名>
```
HTML形式の場合は、実行すると「wrote <ファイル名>.html」と表示され、HTML形式のファイルが出力される。
ここで、ファイル名を指定する際には拡張子「```.py```」は不要である。

また、windowsではPythonをインストールしただけでは```pydoc```コマンドが使えないらしい。
windowsで```pydoc```コマンドを使うには```python.exe```と同じディレクトリにバッチファイルを作成する必要がある。
バッチファイルの内容は以下となる。

```
@python %~dp0\Lib\pydoc.py %*
```
1つのカスタム投稿に複数のタクソノミーを設定する

![タクソノミ複数.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552308/20841d2d-1874-5e7d-4dc0-a97a3ff3963b.png)
●スラッグ
「レッスン」 →　lesson
「ギター」　→　lesson_guitar
「ベース」　→　lesson_bass
「ドラム」　→　lesson_drum

```php:functions.php
//カスタム投稿タイプ追加
register_post_type(
'lesson', //カスタム投稿のスラッグ
array(
'label' => 'レッスン検索', //管理画面に表示される名前
'hierarchical' => true,
'has_archive' => true,
'public' => true,
'menu_position' => 5,
'supports' => array('title','editor'),
'exclude_from_search' => false,
));
//カスタムタクソノミー追加
add_action( 'init', 'add_custom_taxonomy_event', 0 );
function add_custom_taxonomy_event() {
register_taxonomy(
'lesson_guitar', //カスタムタクソノミーのスラッグ
'lesson', //上のカスタム投稿タイプ追加で指定したスラッグ
array(
'hierarchical' => true,
'update_count_callback' => '_update_post_term_count',
'label' => 'ギター', //管理画面に表示される名前
'public' => true,
'show_ui' => true,
));
}
add_action( 'init', 'add_custom_taxonomy_event02', 0 );
function add_custom_taxonomy_event02() {
register_taxonomy(
'lesson_bass', //カスタムタクソノミーのスラッグ
'lesson', //上のカスタム投稿タイプ追加で指定したスラッグ
array(
'hierarchical' => true,
'update_count_callback' => '_update_post_term_count',
'label' => 'ベース', //管理画面に表示される名前
'public' => true,
'show_ui' => true,
));
}
add_action( 'init', 'add_custom_taxonomy_event03', 0 );
function add_custom_taxonomy_event03() {
register_taxonomy(
'lesson_drum', //カスタムタクソノミーのスラッグ
'lesson', //上のカスタム投稿タイプ追加で指定したスラッグ
array(
'hierarchical' => true,
'update_count_callback' => '_update_post_term_count',
'label' => 'ドラム', //管理画面に表示される名前
'public' => true,
'show_ui' => true,
));
}
```
●管理画面の表示
![複数タクソノミ表示.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552308/fec3ceef-7140-6c2a-3762-cf347ebe6ee1.png)
何やらスマートな書き方じゃない気がしますが…
とりあえず機能はしてます。
collectionGroupで親のドキュメントデータを取得する

##collectionGroupとは
違うコレクションでも同じ名前のサブコレクションを持つドキュメントを一括でデータを取得出来る。
例えば構図が、

```
user(コレクション)
　 docId
　  items(サブコレクション)
　　   item_name:"item1"
　  name:"hoge"
　  age:20

admin(コレクション)
　 docId
　  items(サブコレクション)
　　   item_name:"item2"
　  name:"hogehoge"
　  age:30
```
だった時、collectionGroupを用いることで、userコレクションのitemサブコレクションも、adminコレクションのitemサブコレクションも同時に取得できる。

```javascript:[sample.vue]
await this.$fire.firestore
  .collectionGroup("items")
  .get()
  .then((docs)=>{
    docs.forEach((doc)=>{
      console.log(doc.get("item_name")); //item1とitem2が出力される
    })
})
```
.where()や.orderBy()を使った複合クエリも可能。

##親のドキュメントデータを取得
取得したdocを
`doc.ref.parent.parent`
で参照することで親のdocを取得できる。

```javascript:[sample.vue]
await this.$fire.firestore
  .collectionGroup("items")
  .get()
  .then((docs) => {
     docs.forEach((doc) => {
       const parentRef = doc.ref.parent.parent; //親のdocを参照
       parentRef.get().then((parentDoc) => {
         console.log(doc.id); //itemサブコレクションのdocId
         console.log(parentRef.id); //親のdocId
         console.log(doc.get("item_name")); //itemサブコレクションのitem_nameフィールド
         console.log(parentDoc.get("name")); //親のdocのnameフィールド、
       });
     });
   });
```
Anacondaを削除したあとにPowershellでエラーが出た

よく考えると大変間抜けな話なのですが、私同様悩んでいる方もいる（？）かと思いますので共有します。

##対象になる（可能性がある）人

* Anaconda入れて見たけどあんまり合わなくて消しちゃった人
* Windows PowerShellでAnaconda Navigatorが開けるようにした人
* ↑の時に .ps1 ファイルを使ったりした人
* ↑の時によくわからないまま調べたままに設定した人


##問題

Anacondaを削除してからTerminal（Windows PowerShell）を開くと以下のような警告が出る。

```markdown
用語 'C:\Anaconda3\Scripts\conda.exe' は、コマンドレット、関数、スクリプト ファイル、
または操作可能なプログラムの名前として認識されません。
名前が正しく記述されていることを確認し、パスが含まれている場合はそのパスが正しいことを確認してから、
再試行してください。
発生場所 C:\Users\**各自**\Documents\WindowsPowerShell\profile.ps1:4 文字:4 
+ (& "C:\Anaconda3\Scripts\conda.exe" "shell.powershell" "hook") | Out- ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo: ObjectNotFound: (C:\Anaconda3\Scripts\conda.exe:String) [], 
+ CommandNotFoundException 
+ FullyQualifiedErrorId : CommandNotFoundException 
```

##対処法

もともと.ps1ファイルでPowerShellからAnaconda Promptを起動できるようにしていたのですが（詳細は以下のページなどに詳しいです）、Anacondaを削除したことでエラーが発生していたようです。

https://helve-blog.com/posts/python/powershell-anaconda-python/

エラーを見直すと、ps1ファイルの場所があります。

```
発生場所 C:\Users\**各自**\Documents\WindowsPowerShell\profile.ps1:4 文字:4 
```
ここに存在する.ps1ファイルを削除して完了。

##おわりに

Anacondaちゃんがみんなとなかわるくてつらい
転職ドラフトで転職が決まりました。


転職ドラフトを通して正社員転職が決まったので体験談を書きます。
新しく登録される方はぜひ私の紹介コード「BMPY」を使ってください。
＊こちらの記事は[転職ドラフト体験談投稿キャンペーン](https://job-draft.jp/articles/251)に参加しています


## スペック
非情報系の専門学校を卒業後、1年半ほどフリーターをし、22歳の時にSESと受託を半々くらいでやっている20名ほどのIT企業に受託部門のエンジニアとして就職。そこから1年ほど開発業務に従事。

主な使用技術は
* PHP
    * Laravel
* JavaScript
    * React
    * Vue.js

 
## 転職の動機
##### 様々な技術に触れたい
現職ではバックエンドはLaravelで固定、インフラ系は元請けがやるのでほぼ触れないという感じでした。自分としてはエンジニアとして3~5年くらいの間は特定の技術に閉じ籠ることなく幅広い技術に触れて知見を広げたいと思っていたので、会社の方針を知ってからちょっと転職を考え始めました。

##### 給料を上げたい
会社からはかなりいい評価を頂けていて昇給も順調ではあったものの、日本人の平均年収に到達するのには今のペースでもあと3年くらいかかりそうな感じでした。生活が苦しいわけではありませんでしたが、結婚したので将来に備えたいということもあり、手っ取り早く年収上げるなら転職だよねとなりました。


## 転職ドラフトに登録したきっかけ
登録する前に2ヶ月ほど別の媒体を使って転職活動していたものの納得のいくような条件での内定は獲得できず、一旦転職活動自体を中断しようとしていました。そんな時にこのサービスを知り、最後に今の市場価値だけでも知りたいと思って登録しました。

## 転職ドラフトでの指名状況
2回参加し、初回は2社から指名を頂きました。
1社はマネジメント層のイメージで指名したが思ったより経験が浅かったとのことでカジュアル面談で落選してしまいましたが、もう1社の方でカジュアル面談→一次面接→技術課題→二次面接→最終面接→リファレンスチェックを突破して正社員として採用が決まりました。

初回は「まあ指名なんか来ないだろう」と思っていたのですが、最終的に採用して頂いた企業からはかなり早い段階で指名を頂き、しかも思っていた以上の年収での指名だったのでかなりびっくりしました。

2回目は初回で指名を受けた企業の採用プロセスが進んでいる最中に参加したのですが、指名は0件でした。

## 面接で感じたこと
他の媒体を使った時よりも企業の方に自分のことをよく知ってもらえた状態で採用プロセスがスタートするので、面接はスムーズに進むし、自分の強みもアピールしやすかったと思います。

あとはやっぱり最初に金額が提示されてから進んでいくので、金額の交渉をしなくて良いというのはすごく楽でした。結果として現職と比べ2倍の月収で採用が決まりましたが、自分でこの金額を提示するのはかなりハードルが高いです。


## 転職ドラフトを使ったことがない方へのメッセージ
転職が決まっても給与は経験年数と前職の給与で足元を見られてしまうことが多いと思いますが、そこのハードルは転職ドラフトの仕組みが取っ払ってくれます。
そのため経験年数の浅い方や現職の給与が相場より低い方が開発者としてより高い給与を求めて転職する際にはとてもいいサービスだと思いました。
私の場合は給与以外に仕事環境も自分の希望とぴったりな企業とのご縁が頂けたので大満足でした。

開発経験が1年未満とかの場合は流石に厳しいかもしれませんが、ちゃんとレジュメに書ける事があれば経験1年でも指名を頂き、実際に内定までこぎつける事ができました。

もちろん指名がもらえないこともありますが、迷ったら参加してみて損はないと思います。
新しく登録される方はぜひ私の紹介コード「BMPY」を使ってください。
Julia プログラムを速くするための定石

Julia プログラムを速くするための定石が纏められていました。

https://blog.goo.ne.jp/r-de-r/e/2e21bccd94b2f24cdbc2b54030b13a1a
https://blog.goo.ne.jp/r-de-r/e/4a815e35e7364368ed963e75a966b595
https://blog.goo.ne.jp/r-de-r/e/bb84137b4936fb4ab5e76a3cbd7ce9e5
https://blog.goo.ne.jp/r-de-r/e/6b538afd6188153bf5e7db614b67f5e5
https://blog.goo.ne.jp/r-de-r/e/2aad94a1df626356ffab159eb16f00f4
Intellijで@slf4jでログ出力しようとするとcannot find symbol logのエラーが出る

## 概要
IntellijでSpring Bootで@slf4jを使って `log.debug("Sample")` のようにログを出力しようとすると、 `cannot find symbol log` というエラーが発生し、Compileが失敗する。その対処方法。

## Versions
- Intellij Ultimate 2021.3.1
- Spring Boot 2.5.6

## Enable annotaion processing
Preference > Build, Excecution, Deployment > Compiler > Annotation Processors
「Enable annotation processing」にチェックを入れる。
![Screen Shot 2022-01-14 at 13.32.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105936/87183f1b-3d8c-1e56-e7e7-f52f9d7697b3.png)

## Plugin
Lombockをインストールする。
![Screen Shot 2022-01-14 at 13.31.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105936/82fa4196-42a2-cc9e-4f01-fa4c9d6e93f4.png)

## build.gradle
以下を追記してインストール。

```
compileOnly 'org.projectlombok:lombok:1.18.20'
annotationProcessor 'org.projectlombok:lombok:1.18.20'
```

以上

## 参考
https://developervisits.wordpress.com/2020/09/16/building-with-lomboks-slf4j-and-intellij-cannot-find-symbol-log/
[Ruby]配列のアレコレ

基礎的だから難しくはないけど、使ってないと何気忘れそうなので記事に。

## 配列に値を追加する場合
`<<`の演算子を使用する

```zsh:例
irb(main):001:0> pencil_case = ["ペン", "消しゴム", "定規"]
=> ["ペン", "消しゴム", "定規"]
irb(main):002:0> pencil_case << "えんぴつ"
=> ["ペン", "消しゴム", "定規", "えんぴつ"] #配列に"えんぴつ"が追加される
```

## 配列の値を指定して取得する場合
`添字`を使用する

```zsh
#配列の要素を取得
配列[添字]

#配列の要素を取得し変数に代入
変数 = 配列[添字]
```

## 配列の値を変更する場合
変更したい要素を取り出して、新しい要素を代入する

```zsh
#配列の要素を変更
配列[添字] = 値
```

　
以上。
Rubyのinitializeの可視性の変更

# 最初に

タイトル通りですが、`initialize`という特別なメソッドの可視性について書いてます。
断りのない限り、Ruby3.1.2で2022年10月に再検証してます。

(ところで、可視性って言葉があまりしっくりこないです。気が向いたら、他によい言葉がないか調べます。)

# 特別なinitialize


`initialize`は特別なメソッドとして扱われるので、
何も指定しなくても、
`public`や`protecd`の配下に置いても
`initialize`はprivateメソッドのままになる。

```ruby
class Public 
  public
    def initialize
    end
end

p Public.new.private_methods.include?(:initialize)   #=> true
p Public.new.public_methods.include?(:initialize)    #=> false
p Public.new.protected_methods.include?(:initialize) #=> false
p Public.new.methods.include?(:initialize)           #=> false
```

```ruby
class Protected
  protected
    def initialize
    end
end

p Protected.new.private_methods.include?(:initialize)   #=> true
p Protected.new.protected_methods.include?(:initialize) #=> false
p Protected.new.public_methods.include?(:initialize)    #=> false
p Protected.new.methods.include?(:initialize)           #=> false
```

ただし、Ruby技術者認定試験Goldの勉強をしてる人は、
`protected`について注意が必要である。
2.1の頃は、バグか何かで、`protecd`の配下にあるとprotectedメソッドになってしまう。
RExの練習問題はまだ2.1で出題されてると思うので、気をつけた方がいい。
2.3の頃には、privateのままで、protectedに変更できなくなっていた。

# 引数の形で取ると

余談

また、`public`も`protected`もメソッドであり、
あえてシンボルの`:initialize`を引数にとると、
ちゃんと`initialize`メソッドが変更される。

```ruby
class Public
  public :initialize
end

p Public.new.private_methods.include?(:initialize)   #=> false
p Public.new.public_methods.include?(:initialize)    #=> true
p Public.new.protected_methods.include?(:initialize) #=> false
p Public.new.methods.include?(:initialize)           #=> true

p Public.new.initialize #=> nil
```

```ruby
class Protected
  protected :initialize
end

p Protected.new.private_methods.include?(:initialize)   #=> false
p Protected.new.public_methods.include?(:initialize)    #=> false
p Protected.new.protected_methods.include?(:initialize) #=> true
p Protected.new.methods.include?(:initialize)           #=> true
```
Rubyのprependによる定数探索バグ(3.1で修正済)

# 最初に

Ruby技術者認定試験の対象バージョンは、いまだに2.1である。[^1]

[^1]: 2022年10月3日より、試験バージョンはRuby3.xになりました。

2.1にバグがあり、
Ruby技術者認定試験の有名なRExという練習問題で、
そのバグが混在されたまま出題され、
勉強中の受験生を悩ませている定数探索の問題がある。
実際、ruby-jpというSlackで、同じ質問が3回されているのを見た。

そのバグは3.1で修正されたのだが、そのバグについて解説する。
Ruby技術者認定試験Goldなので、けっこう難しめだと思う。

# 予備知識： 定数探索の順番

定数探索の順番

1. レキシカルスコープ(`Module.nesting`)に則り、内側から外側のスコープへと探していく。
2. 継承順(`Module#ancestors`)で、親クラスを順に探していく。
3. トップレベル

ここの2番目でバグがありました。

# 本題: prependによる定数探索バグ(3.1で修正済)

下記の`Child`クラス内で定義されたメソッドで参照される`CONST`定数がある。
まず、レキシカルスコープで、`Child`内の`CONST`定数を探すが、`Child`に`CONST`定数は定義されていない。
また、他のレキシカルスコープも存在しないので、継承順に`CONST`定数を探索していくことになる。

```ruby
module PrependedModule
  CONST = "PrependedModule"
end

class Parent
  CONST = "Parent"
  prepend PrependedModule
end

class Child < Parent
  p Module.nesting #=> [Child]
  # レキシカルスコープは、Childのみ。

  def self.const
    CONST
  end
end

p Child.ancestors #=> [Child, PrependedModule, Parent, Object, Kernel, BasicObject]

p Child.const
#=> "Parent" (誤: Ruby 3.0)
#=> "PrependedModule" (正: Ruby 3.1)
```

レキシカルスコープ上に定数がないので、継承順に定数を探索していくことになる。

`prepend`で継承したモジュールは、そのクラスよりも優先度が高い。
実際、`ancestors`メソッドで確かめると、`Parent`クラスよりも`PrependedMoudle`モジュールの方が優先順位が高くなっている。
そのため、`PrependedModule`内にある定数を探索すべきだが、3.0までは`Parent`クラスにある`CONST`定数を先に見つけてしまっていた。これが3.1で修正され`PrependedModule`の方が先に見つかるようになっている。

なお、これは(マニアックな)バグの修正という扱いで、Ruby 3.1の公式の変更のまとめ等でとりわけ紹介はされてない。
SPSS Modeler ノードリファレンス 5-2 １次

# 5-2 １次ノード[モデル作成タブ]

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855260/789bc40f-3287-499e-63b6-d1668046cb9c.png)

# 1.ノードの目的
連続(スケール)型データを予測する線形回帰モデルを作成します。

# 2.解説動画(60秒)
<iframe width="560" height="315" src="https://www.youtube.com/embed/Twt59G8XQZg" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

# 3.クイックスタート
製品に同梱されているサンプルストリームのgoodslearn.strを開きます。
このストリームのシナリオは、収益増加率を商品の種別、価格、販促、販促前の収益から影響力のある要因を使って予測することです。なお、商品の種類は名義型の文字列で、それ以外はすべて連続型の数値データです。
データ型ノードに、［モデル作成］パレットの１次ノードを接続します。
１次ノードは、予測フィールドが文字列のデータもダミーコード(ワンホットベクトル)化などの前処理なしでそのままモデル作成に使うことができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855260/6ecf8269-0762-4da8-a6f5-d736ea1e90c0.png)


デフォルト設定のまま、ストリームを実行します。
生成されたモデルナゲットを参照します。
モデルの要約では、予測の対象フィールド、自動データ準備の実行の有無、モデル(予測フィールド)の選択方法、情報量基準、そして精度としてR2乗(決定係数)値が示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855260/a012e44b-8841-c563-c03f-d3a55ba971a4.png)

自動データ準備がオンの場合、どのフィールドにどのように対処したかを確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855260/138b9593-f847-5c25-ceb0-a4043e463128.png)

このモデルナゲットをデータ型ノードに接続します。さらに［出力］パレットのテーブルノードを接続します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855260/baabde4d-e3e3-fe97-b135-e7c294951b4f.png)


テーブルノードを実行して、予測値を算出（スコアリング）をします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855260/3b8bbfca-50d6-9e3d-9bdd-e14fb4a687c2.png)


$L-収益増加率のフィールドに予測した結果が出力されます。

# 4.Tips
１次ノード編集ダイアログの［作成オプション］タブにある項目の選択：［目的］では、新規モデルの作成を行うか、既存のモデルの学習を継続するかの作業を選択できます。
既存のモデルの学習を継続では、新規に追加されたレコードや更新されたレコードのみを適用してモデルの更新を行うことができるので、継続的なモデル作成の際にパフォーマンス向上に役立ちます。
また、モデルの精度を強化するためのブースティング、モデルの安定性を図るためのバギングなどアンサンブルモデルの作成の選択も可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855260/45d6e035-2127-ba45-0b72-63c9f6995115.png)

項目の選択：［基本］では、モデルの予測精度の向上を目的としたデータ加工を自動で行うことができます。たとえば、連続型データの平均値±３標準偏差の外側のレコードは外れ値として除外したり、欠損値は名義型データでは最頻値に、順序型データでは中央値に、連続型データでは平均値への置き換えをモデル作成時に行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855260/1f265016-0b32-7b72-2afc-6c83f1e5fabf.png)

項目の選択：［モデル選択］では、予測フィールドの取捨選択をステップワイズ法やベストセットから選択できます。ベストセットでは、多くの予測フィールドの組み合わせを検討します。そのためテップワイズ法より処理時間がかかる可能性がありますが、よりよい予測フィールドの組み合わせを発見する可能性もあります。
変数の選択、除去の基準は、赤池情報基準値やF値、調整済みR2乗値、平方平均誤差など複数の中から選ぶことができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855260/31ed6d5c-c89a-7510-b056-c79e6581fb65.png)



# 5.参考情報
### 利用データ
SPSS Modeler 同梱のGOODS1n.csv
### ノードのヘルプ
https://www.ibm.com/docs/ja/spss-modeler/18.3.0?topic=node-linear-models
### SPSS Modeler ノードリファレンス目次
https://qiita.com/416nishimaki/private/503037195081d3323eee
【Rails】メソッド名を付けるときに気をつけること

最近、1つのメソッドで色々なことをしてしまってるメソッドのリファクタリングをしていて、
その過程で処理ごとにメソッドに切り出すことが多く、
メソッド名の付け方で迷うことがあったのでまとめてみる。

###オブジェクトを別の形に変換するメソッド名はto_hogeにする

```ruby
# hashにして返すメソッド
# 悪くはない例
def convert_to_hash
end

# より良い例
def to_hash
end
```

###否定形のメソッド名はなるべく作らない
判定が複雑になると可読性が下がってしまうこともある。
否定形のメソッドを作りたくなったときは、逆の意味（肯定）のメソッドを作って```!hoge```の形にして使う。

```ruby
# 良くない例
book.not_published?

# 良い例
!book.published?
```

###判定形のメソッドの末尾には疑問符?をつける
trueかfalseを返すメソッドの末尾にだけ「？」をつける。それ以外にはつけない。

```ruby
shop.open?
```

メソッド名に疑問符をつけられるのはRubyだけらしい。

##参考

https://qiita.com/qpSHiNqp/items/7bcb0492c777a488ceba

https://techracho.bpsinc.jp/hachi8833/2017_02_13/35364
WSLでGUIを使用

WindowsでWSLを利用してUbuntuのGUIを使う方法。

https://astherier.com/blog/2020/08/run-gui-apps-on-wsl2/

上記サイトに詳細が書かれていて、これに従って進めればできるはずだが、今回はエラーが出たのでそのメモ。

エラーはUbuntu側にGUIアプリをインストールする際の次のコマンド

```
sudo apt install libgl1-mesa-dev xorg-dev
```

エラーメッセージは次の通り。

```
Reading package lists... Done
Building dependency tree
Reading state information... Done
Some packages could not be installed. This may mean that you have
requested an impossible situation or if you are using the unstable
distribution that some required packages have not yet been created
or been moved out of Incoming.
The following information may help to resolve the situation:

The following packages have unmet dependencies:
 libgl1-mesa-dev : Depends: libgl-dev but it is not going to be installed
                   Depends: libglvnd-dev but it is not going to be installed
 xorg-dev : Depends: libfontenc-dev but it is not going to be installed
            Depends: libxfont-dev but it is not going to be installed
            Depends: libxft-dev but it is not going to be installed
            Depends: xserver-xorg-dev but it is not going to be installed
E: Unable to correct problems, you have held broken packages.
```

依存関係のエラーで、解決方針は下記のサイトの通り。
http://blog.livedoor.jp/hiroto_o/archives/39125675.html

エラーに表示されるライブラリをバージョンも指定してインストールしていく。
例えば、次の様なコマンドを実行することになる。

```
sudo apt install libdrm-amdgpu1=2.4.101-2
```

最終的にすべてのライブラリをインストールすれば、エラーが出なくなり、GUIを使えるようになる。
{Rails}ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)が出た場合の対処法

①やりたいこと
MySQLにログインしたい。
Modelを作成し、rails db:migrateを実行した後の出来事でした。（この2つは問題なく実行できました）


②エラー内容

```
% sudo mysql -u root
Password:
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
```

ちなみにsudo mysql -u rootと打つとEnter password:と出てくるので、パスワードを打った後に出てきたのがこのエラー文です。


③原因
<br>

④解決策
下記の記事を参考にしました。
https://ja.getdocs.org/mysql-error-1-45-28-access-denied-for-user-rootlocalhost-using-password-no/

引用すると　>ユーザ ‘root’は、MySQLサーバにログインするためのパスワードが必要です。 ** これを解決するには、MySQLサーバーに接続する際にパスワードに `-p`フラグを付けてください。

とのことなのでmysql -u root -pでもう一度実行したら、無事ログインできました。（sudo mysql -u root -pでもできますが、パスワードを2回打つことになるのでsudoはなくてもいいです。)

<br>
あとがき：-p（password?)を付けるのと付けないのでは何が違うのか、わかる方いればご教授いただきたいです。

開発環境
mac OS バージョン11.6

Rails 6.1.4.4
Ruby 3.0.3
MYSQL 0.5

エディタ
VScode
HomebrewでM1 MacにFFmpegを入れる

# 概要
> FFmpeg（エフエフエムペグ）は動画と音声を記録・変換・再生するためのフリーソフトウェアである。

(引用:[Wikipedia](https://ja.wikipedia.org/wiki/FFmpeg))

このソフトは、動画扱う際にめちゃくちゃ便利なのですが、ハードウェアのチップに依存する場面もあります。
M1 Macに入れる際に若干苦労したので、自分はこうしたら入ったよ。というのを記録に残しておきます。

# 環境

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1424230/5a529a46-a003-6a5a-81c1-de86602613c6.png" width=70%>

```
$ sw_vers
ProductName:	macOS
ProductVersion:	11.2.3
BuildVersion:	20D91
```

# コマンド
```sh
brew postinstall libtasn1
brew install ffmpeg
```

FFmpegを動かすためのパッケージとして、インストールのタイミングで依存関係にある「libtasn1」がインストールされておらず、
`$ brew install ffmpeg`のみでは、インストール時にコケました。
※エラー文に`brew postinstall libtasn1`しろと言われました。
※コケた時のエラーログ残しておけばよかった。。。。

なので、事前に「libtasn1」をポストインストールしておいてあげてください。
※既にインストールされている場合は不要です

念のため、brewでインストール有無を確認する方法も載せておきます。

```
brew list
```
# 「libtasn1」とは

「GnuTLS」や「p11-kit」などで使われるASN.1構文ライブラリだそうです(原文は[こちら](https://www.gnu.org/software/libtasn1/))。

## 「ASN.1」とは

> Abstract Syntax Notation One（ASN.1）とは、電気通信やコンピュータネットワークでのデータ構造の表現・エンコード・転送・デコードを記述する標準的かつ柔軟な記法である。マシン固有の技法などに依存せず、曖昧さのない記述を可能とする形式規則を提供する。

(引用元: [Wikipedia](https://ja.wikipedia.org/wiki/Abstract_Syntax_Notation_One))

## 「GnuTLS」とは

> GnuTLS（GNU Transport Layer Security; グヌーティーエルエス）はSSL/TLSとDTLSプロトコルのフリーなライブラリー実装のひとつである。アプリケーションがネットワーク通信層を越えて安全な通信プロトコルを利用できるようAPIを提供することを目的とする。

(引用元: [Wikipedia](https://ja.wikipedia.org/wiki/GnuTLS))

## 「p11-kit」とは

> p11-kit ライブラリは、公開鍵暗号標準 (Public-Key Cryptography Standard, PKCS) #11 モジュールのロードと列挙の方法を提供するほか、PKCS#11 モジュールを 発見できるようにインストールするための標準的な設定を提供します。 同じプロセス内の別々のコンポーネントもしくはライブラリが PKCS#11 を使用する際の問題を調停し、解決することもできます。

(引用元: [debian](https://packages.debian.org/ja/sid/p11-kit))

## libtasn1のまとめ
難しいこと色々書いてあって正直よくわかってませんが、libtasn1は、FFmpegが使う暗号系のライブラリ群がさらに使っているライブラリという感じでしょうか。

# 所感
別に暗号通信するつもりもない人も入れないといけないのは正直腑に落ちませんが、
インストールでコケる以上どうしようもないって感じなんでしょうね。

とはいえ、ありがたく使わせていただきます！！製作者には頭が上がりません...！！！
[Google Sheets]IDがリストに含まれていればそのIDに紐づく情報をコピーする

## やりたいこと
こんな感じの表があったとする
![スクリーンショット 2022-01-14 12.25.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253501/536c4914-b921-d190-9cb6-6c3fce521478.png)


参加者の名前だけを取得したい
![スクリーンショット 2022-01-14 12.25.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253501/e2eb62a2-95b9-7f7a-46e9-7ea57fd149e4.png)

## やり方
参加者の名前のカラムの先頭に以下の式をコピペする

```
=filter(B:B, countif(D:D, A:A))
```
![スクリーンショット 2022-01-14 17.14.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253501/066687b5-6f4a-049b-9977-544ff7fa9ac7.png)
Android Studioのinspect codeで特定のディレクトリやファイルを分析対象外にしたい

# 概要

Android Studioのinspect codeはAndroid Lintの実行を含めコードの分析をしてくれるので便利な機能です。現在関わっているプロジェクトでgenerateしたコードをこのinspect codeの対象から外したかったのでやり方を調べました。

# 設定方法

モジュールレベルのbuild.gradleに以下の設定を追加します。

```
plugins {
  id 'idea'
}
// buidScript block等が既にある場合 apply plugin: 'idea'

idea {
    module {
        excludeDirs = [file('hoge'), file('fuga/foo.md')]
    }
}
```

`excludeDirs`　に除外したいディレクトリやファイルを記述します。

# 参考

- https://stackoverflow.com/questions/18642096/android-studio-inspect-code-exclude-generated-files?rq=1
- https://docs.gradle.org/current/userguide/idea_plugin.html
テストの進捗報告には「意見」を添えてみよう

テスト期間中は、開発チーム向けに進捗を報告していると思います。
このとき、テストケース消化率、本日の不具合報告数、未クローズのチケット数、などを機械的に報告してるだけになっていませんか？
こんな感じで。

>本日のテスト進捗です
テストケース進捗：63％
本日作成したバグチケット数：10件
未クローズチケット数：55件


この報告だと、受け取った側は情報を読み取る必要が出てきます。というか、忙しいテストフェーズ時に、開発チーム側はそんな面倒なことはしないので、この情報は流れていくだけになってしまいます。

[こちら](https://qiita.com/syo-ryu-kennn/items/4ab5d9d99446a20cb2c2)の記事でも書きましたが、報告というものは、読み手に何かしら影響を与える必要があります。そのためには、数値を報告するだけでなく、「QAとしての意見」を添えるようにしましょう。

「数値」と「意見」を分けて伝えることの重要性を、例を2つほど挙げて説明してみます。

## 天気予報の例
テレビの天気予報を見ると、たいてい、下記のような流れになっています

>
1.気圧配置図と雲の動き
2.降水確率
3.気象予報士の意見


もし仮に1の情報だけを与えられたら、気象の専門教育を受けていない多くの視聴者はどう感じるでしょうか？
おそらく「それで？」と思って、おしまいです。
テレビ側もそれはわかっているので、降水確率を発表し、気象予報士の意見を伝えます。
気象予報士の意見とは、たとえば、

>
・今日は洗濯日和でしょう
・折りたたみ傘を持っていきましょう
・雪が降るので、交通機関が乱れるかもしれません

と言ったようなものです。
どうでしょうか、この意見を聞いた視聴者は、今日、何をすべきか(or しないべきか)の参考になりますね。1の情報を与えただけのときとは、行動が大きく異るはずです。


## 健康診断の例
健康診断の結果をみると、見慣れない数値がたくさんあります。手元の私の健康診断結果を見てみると、
BMI、眼圧、白血球数、赤血球数、HDLコレステロール、AST、ALT、LDH(旧)、γ-GTPなどなど。
医療の専門教育を受けていない人に、これらの数値のみを共有されたとしても、なんの参考にもなりません。

健康診断で我々が求めているのは、数値ではなく、「数値を元にした医療プロフェッショナルからの意見」です。食生活を見直しましょう、運動しましょう、通院して薬を飲みましょう、といった意見が欲しくて、健康診断を受けています。決して、数値が欲しいわけでは無いはずです。


## テストに話を戻す
テストに話を戻すと、進捗率とか未クローズチケット数などの各種数値はQA以外のスタッフには、意味を見いだせない数値であることが多いです(無意味というわけではなく、意味を見つけきれない)。したがって、数値の意味をQAのプロが翻訳して、誰にでもわかる言葉で説明してあげる必要があるのです。
「順調です」とか「Aという機能で多くの不具合が見つかっており、検証の速度が上がらない。スケジュールに懸念」とか「Bという機能で多くの不具合がみつかっているが、他の機能と影響しない箇所なので、進捗には影響しない」とか。


情報をどう解釈するかにプロフェッショナルのスキルが介在すると思ってます。
日々の進捗方向ひとつ取っても、QA担当者次第で、プロジェクトに良い影響を与えられるはず！

それでは！
Nuxt.jsにてplugins/localStorageにVuexStoterを保存する方法

##はじめに
Vue.js 2系でしか使用したことがなく、
Nuxt.jsでは今まで書いていた書き方だとエラーになり・・・
かつ、TypeScriptでの記述例があまりなかったので忘備録として。
**見られてまずい個人情報などは、この方法で保存しないように！**


##Nuxt.jsでVuexStoreのstateを保存する手順
###① vuex-persistedstateのインストール
```
npm install --save vuex-persistedstate
```

###②　~/plugins/localStorage.ts に記述


```typescript:~/plugins/localStorage.ts
import createPersistedState from "vuex-persistedstate";

export default ({ store }: any) => {
  createPersistedState({
    key: "vuex",
    //pathsの中身は、保存したいstateを記述
    paths: ["todo.todoList"],
    //保存先
    storage: window.localStorage,
  })(store);
};
```

####paths:
保存したいstateを指定するところ

`"storeモジュール名.保存するstate変数名"` の形式で記載。
複数ある場合は、
`"storeモジュール名.保存するstate変数名","storeモジュール名.保存するstate変数名"` でOK

####storage:
保存先を指定するとことろ
今回は、`localStorage`を使用。※下記表参照
下記以外にもCookieにも保存ができるそう？だけど私は使わないで省略。

| ストレージ | storageの値 | 保存期間 |
|:-:|:-:|:-:|
|  ローカル<br>ストレージ | **window.localStorage**  |  意図的に消さない限り<br>保存され続ける |
|  セッション<br>ストレージ | **window.sessionStorage**  |  ブラウザを閉じたり<br>セッションが切れたた消える |


###③ nuxt.config.js に追記

```typescript:~/nuxt.config.js
plugins: [{ src: "~plugins/localStorage", ssr: false }],
```

##おわりに
Nuxt.jsの練習でTODO LISTを作成していることがバレましたが。
データベースが作れない私でも取り急ぎローカルに保存してTODOリストが作れた:clap_tone4:
tailwindcss で odd:, even: が効かない


```
<tbody>
 <tr>
  <td class="odd:bg-gray200 even:bg-white">...</td> 
  <td class="odd:bg-gray200 even:bg-white">...</td> 
  <td class="odd:bg-gray200 even:bg-white">...</td> 
  <td class="odd:bg-gray200 even:bg-white">...</td> 
 </tr>
</tbody>
```
こんな感じで書いてテーブルの色を交互にしたいが、スタイルが効かない

## 解決策
tailwind.config.js の　variants.inset を下記のようにすればOK

```tailwind.config.js
module.exports = {
  content: [
    './resources/**/*.blade.php',
    './resources/**/*.js',
    './resources/**/*.vue',
  ],
  theme: {
    extend: {},
  },
  variants: {
    extend: {},
    inset: ['even', 'odd'],
  },
  plugins: [require('@themesberg/flowbite/plugin')],
};
```

### 参考
https://github.com/tailwindlabs/tailwindcss/issues/2412
rex0220 計算式プラグイン ボタンクリックで計算

計算式プラグインで、ボタンを表示して、ボタンクリックで計算ができるようになりました。
追加・編集画面で、ヘッダー部・スペースエリアにボタン表示します。
※計算式プラグイン Ver.49以降でサポート

# 概要

[計算式プラグイン](https://qiita.com/rex0220/items/ae83c6d5ce50ff7a9a73)でヘッダー部・スペースエリアに計算式を指定して、ボタン表示できます。

![2022-01-14_12h26_09.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/3dd880b2-3a3e-ae4c-8177-1d851cc03237.gif)


- BUTTON 関数：　ヘッダー部、スペースエリアにボタン表示と、ボタンクリック時の項目設定が出来ます。
- DIALOG 関数：　ヘッダー部、スペースエリアにボタン表示と、ボタンクリック時にダイアログ表示を行い、「OK」、「Cancel」で項目設定の実行を制御できます。
- FSET 関数：　BUTTON 関数、DIALOG 関数で、クリック時に項目に計算値を指定

![2022-01-14_09h03_57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/e86f1ed9-e9e8-4760-120c-ad31f44422ec.png)


![2022-01-14_12h13_57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/89ae2cd7-dc3b-1bf5-c1bc-f8b4e0ab19ba.png)


# ボタン表示

計算式例：　ボタンクリック時に、文字列とチェックボックスに値を設定します。

BUTTON(
　"文字列セット２",
　FSET(文字列,"YYYY"),
　FSET(チェックボックス,ARRAY("sample2")),
)

- "文字列セット２"： ボタン表示
- FSET(文字列,"YYYY")：　「文字列」項目に"YYYY" をセット
- FSET(チェックボックス,ARRAY("sample2"))：　チェックボックスに sample2 をセット

# ダイアログ表示

![2022-01-14_11h43_05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/7fd5555a-3e98-3546-dec0-880270e67204.png)

DIALOG(
　ARRAY("ダイアログ表示","文字列をセットします"),
　FSET(文字列,"ZZZZ")
)

- ARRAY("ダイアログ表示","文字列をセットします")
    - "ダイアログ表示"： ボタン表示とダイアログのタイトル表示
    - "文字列をセットします"：　ダイアログに表示
- FSET(文字列,"ZZZZ")：　「文字列」項目に"ZZZZ" をセット


# ダイアログ表示　スタイル指定

![2022-01-14_11h47_46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/3d39d429-f9f9-3dd1-948e-9525529a53fc.png)

DIALOG(
　ARRAY("ダイアログ表示２",
　"\<div style='font-weight:600;color:red;'>文字列をセットします\</div>
　\<div>注意してね！:"&DATE_FORMAT(日付)&"\</div>",
　"",0)
　FSET(文字列,"YYYY")
)

- "ダイアログ表示２"
- "\<div style='font-weight:600;color:red;'>文字列をセットします\</div>\<div>注意してね！:"&DATE_FORMAT(日付)&"\</div>"
- ""：　ICON 非表示
- 0 ：　Cancel ボタン非表示
- FSET(文字列,"ZZZZ")：　「文字列」項目に"ZZZZ" をセット
Microsoft App Innovation チームアカウントのご紹介

みなさんごきげんよう。Microsoft App Innovation チームです。 

開発者の皆さんにいち早く最新技術情報をお届けするべく、Microsoft App Innovation チーム の Qiita アカウントをご用意しました。 


月に一度、開発者/IT 技術者の皆さんに向けて配信しているニュースレター「 Microsoft Tech Flash 」に加えて、Microsoft Developer Blogs の意訳のような何かやWebinar サマリー、コミュニティレポートなどを定期的にお届けしたいと思いますのでどうぞお楽しみに。

またニュースレターをまだ購読されていない方はぜひこの機会にこちらからご登録くださいませ。 

https://www.microsoft.com/ja-jp/mscorp/communications.aspx?Dev_QT=PET3035062
うわさで聞いた話


噂で聞いた話なのですが最近のプログラマーにはただ指示されたプログラムを書く能力だけでなく
顧客の話をその場で聞いたときにその場でとっさにこういう設計をすればいいんだなという能力が必要だということがわかりました
そのため最近ではいかに早くプログラムの設計をできるようになれるかを練習しています
練習方法としては基本情報の問題を解いています
僕はこの方法しか知らないのでこのやり方で練習していますがもっといい練習問題などがあったらぜひ教えてくださいm(_ _m)
Observable.intervalみたいに一定間隔実行をKotlin Flowで書きたい

# この記事で紹介すること
Observable.intervalみたいな一定間隔での処理実行をKotlin Flowで書きたい。
`flow.interval`みたいなオペレータがなかったので、どうしようかなと。

```kotlin
// これをKotlin Flowで書きたい
val disposable = Observable.interval(100, TimeUnit. MICROSECONDS).startWith(0L)
      .subscribeOn(Shedulers.computation())
      .subscribe { 
            // 定期実行したい処理
            getHogeHogeData()
      }
```

# やり方と解説
### Flowの中でdelay関数を使う
解説と言いつつすごい単純で申し訳ないんですが、ループするflowを作って、flowの中にdelay関数を呼んであげれば似たような動作になりました。

```kotlin
// 0.1sec間隔で処理実行
private fun intervalFlow() = flow<hogeHogeData>{
        while(true){
            // 定期実行したい処理
            emit(getHogeHogeData())
            delay(100)
        }
    }
```

### onEach()でdelay関数を使う
呼び出し側で指定したい場合はonEachでdelay関数をセットしてあげてもOKです。

```kotlin
private fun roopFlow() = flow<hogeHogeData>{
        while(true){
            // 定期実行したい処理
            emit(getHogeHogeData())
        }
    }

var data: hogeHogeData? = null
val job = roopFlow()
      .onEach { 
            data = it
            delay(100)
      }
      .launchIn(coroutineScope)
```

### Kotlin Flowに拘らなくてもOK
なお、呼び出し先が特にないなら単なるCoroutineで良いと思います。

```kotlin
coroutineScope.launch(Dispatchers.Default){
        while(true){
            // 定期実行したい処理
            getHogeHogeData()
            delay(100)
        }
}
```

# 参考文献
https://stackoverflow.com/questions/62058805/how-can-rxjava-interval-infinite-counter-be-implemented-with-kotlin-flow-in-reac
【2022年最新】Rails6にBootstrap5を導入する方法

※ 本記事はRails6でBootstrap5を導入したい方向けの記事です！
※ Rails5やBootstrap４など、バージョン違いのものを導入する場合とは手順が異なります！

## 開発環境＆前提条件
Ruby 3.0.2
Rails 6.1.4.4
導入したBootstrap 5.1.3
Rails6でrails newしてある状態

<br>

## Bootstrap5のインストール
```terminal:terminal
% yarn add bootstrap
```
上記コマンドでBootstrapの最新バージョンがインストールされます！
バージョンを指定する場合👇

```terminal:terminal
% yarn add bootstrap@バージョン番号
```

ドロップダウンなどのポップアップ要素をいい感じにしてくれるpopper.jsもインストールします！

```terminal:terminal
% yarn add @popperjs/core
```
<br>

## application.html.erbに追記
```erb:app/views/layouts/application.html.erb
<!DOCTYPE html>
<html>
  <head>
    <title>Title</title>
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <%= csrf_meta_tags %>
    <%= csp_meta_tag %>

    <% stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %>
    <%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' %>
    <%# ここを追加👇 %>
    <%= stylesheet_pack_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %>
　　　　　　　　<%# ここを追加👆 %>
  </head>

  <body>
    <%= yield %>
  </body>
</html>

```

上記の通り、stylesheet_pack_tagの一文を追加します！

<br>

## application.scssの作成・追記
Bootstrapを読み込むためのファイルを作成します！
app/javascript配下に、`stylesheetsフォルダ`を作成、そのフォルダの中に`application.scssファイル`を作成します！

```terminal:terminal
% mkdir ./app/javascript/stylesheets
% touch ./app/javascript/stylesheets/application.scss
```

作成したapplication.scssに以下を追記します！

```sass:app/javascript/stylesheets/application.scss
@import "~bootstrap/scss/bootstrap.scss";
````
<br>

## application.jsに追記
上記application.scssを読み込む記述をapplication.jsに追記します！

```javascript:app/javascript/packs/application.js
import Rails from "@rails/ujs"
import Turbolinks from "turbolinks"
import * as ActiveStorage from "@rails/activestorage"
import "channels"
// ここを追加👇
import "bootstrap";
import "../stylesheets/application.scss";
// ここを追加👆

Rails.start()
Turbolinks.start()
ActiveStorage.start()
```

これでBootstrap5の導入は完了です！
あとはいつも通りBootstrapクラスの指定をしてあげれば適応されます🌱

<br>

## 追記
上記まで追記して、もし適用されなかったら下記のコマンドを実行してみてください！

```terminal:terminal
% bin/webpack-dev-server 
```

<br>

## 最後に
Rails6にBootstrap5を導入する記事が少なかったので本記事を作成しました。
本記事がBootstrapの導入で悩んでいる方に届けば幸いです🙇‍♂️
iPhoneのカメラでリアルタイム物体検出 CoreMLモデルをつかえばかんたん

#iPhoneのカメラで機械学習モデルによる物体検出をします

![Jan-14-2022 11-20-28.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/b394c085-e990-7db4-686d-3baed4acce06.gif)


#スマホで物体検出できれば、色々つかえそう。でも、難しいそう
機械学習ってむずかしいのでは？

#手軽に使えるCoreMLモデルで今すぐやってみれる

アップルはiPhoneでかんたんに使えるCoreMLという形式を用意してくれています。

#手順

[アップルの公式モデルズー](https://developer.apple.com/jp/machine-learning/models/)や[CoreML-Models](https://github.com/john-rocky/CoreML-Models)などから物体検出モデルをダウンロード。

https://developer.apple.com/jp/machine-learning/models/

https://github.com/john-rocky/CoreML-Models


モデル実行リクエストを初期化。

```swift
guard let vnModel = try? VNCoreMLModel(for: yolov5().model) else { fatalError("Model initialization failed.") }
self.request = VNCoreMLRequest(model: vnModel)
```

カメラのフレームを食わせるだけ。

```swift
func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {        
    guard let pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) else { return }

    let handler = VNImageRequestHandler(cvPixelBuffer:buffer, orientation: .right, options: [:])
    do {
        try handler.perform([self.coreMLRequest])
        guard let results = self.coreMLRequest.results as? [VNRecognizedObjectObservation] else { return }
        for result in results {
            let label = observation.identifier
            let confidence = observation.confidence
            let boundingBox = observation.boundingBox
            print(label,confidence,boundingBox)
        }
    } catch let error {
        print(error)
        return nil
    }
}
```
フレーム毎に画像内で検出した物体のラベルと画像内座標を出力してくれます。

>Optional("laptop") //　検出ラベル
 0.6810466 // 信頼度
 (0.002242632210254669, 0.002170730382204056, 0.21633444726467133, 0.09707524627447128) // 座標

視覚化は[MLModelCamera](https://github.com/shu223/MLModelCamera/tree/master/MLModelCamera)といライブラリが便利です。

https://github.com/shu223/MLModelCamera/tree/master/MLModelCamera


🐣
****
フリーランスエンジニアです。
お仕事のご相談こちらまで
rockyshikoku@gmail.com

Core MLやARKitを使ったアプリを作っています。
機械学習／AR関連の情報を発信しています。

[Twitter](https://twitter.com/JackdeS11)
[Medium](https://medium.com/@rockyshikoku)
RealmSwift の deprecated warning に対応した

## 事象

先日、久しぶりに RealmSwift のバージョンアップをしたところ、下記のような警告が出るようになってしまいました。

```swift
‘RealmOptional’ is deprecated: RealmOptional<T> has been deprecated, use RealmProperty<T?> instead.
Use ‘RealmProperty’ instead
```

上記の警告を見て、`RealmProperty` の使い方を覚える必要があるかと思いましたが、実際はもっと良い解決方法が実装されていました。

## 解決方法

次のようなクラスがあったとした場合、

```swift
class Sample {
  let index = RealmOptional<Int>() // ここで警告が出る
}
```

下記のように直します。

```swift
class Sample {
  @Persisted var index: Int?
}
```

また、主キーにしたい場合や インデックスをつけたい場合は下記のように宣言できます。

```swift
class Sample {
  @Persisted(primaryKey: true) var primaryKey: Int?
  @Persisted(indexed: true) var indexedProperty: Int?
}
```

## 説明

[リリースノート](https://github.com/realm/realm-swift/releases/tag/v10.10.0)を見ると、RealmSwift のバージョン 10.10.0 から `@Persisted` プロパティラッパーが使えるようになり、これによって（Objective-C でサポートされていない型では）`RealmProperty` や `RealmOptional` は不要になった、というような記載があります。
また、`@objc dynamic var` で宣言していたプロパティも `@Persisted var` に置き換えられるようです。主キーやインデックスの設定も簡単になっています。

- リリースノートより抜粋

```
Add a new property wrapper-based declaration syntax for properties on Realm Swift object classes. Rather than using @objc dynamic or the RealmProperty wrapper type, properties can now be declared with @Persisted var property: T, where T is any of the supported property types, including optional numbers and collections. This has a few benefits:

- All property types are now declared in the same way. No more remembering that this type requires @objc dynamic var while this other type requires let, and the RealmProperty or RealmOptional helper is no longer needed for types not supported by Objective-C.
- No more overriding class methods like primaryKey(), indexedProperties() or ignoredProperties(). The primary key and indexed flags are set directly in the property declaration with @Persisted(primaryKey: true) var _id: ObjectId or @Persisted(indexed: true) var indexedProperty: Int. If any @Persisted properties are present, all other properties are implicitly ignored.
```

- [DeepL](https://www.deepl.com/translator) による日本語訳

```
Realm Swiftオブジェクトクラスのプロパティに、新しいプロパティラッパーベースの宣言構文を追加しました。objc dynamic や RealmProperty ラッパー型を使う代わりに、プロパティは @Persisted var property で宣言することができるようになりました。ここで T はサポートされている任意のプロパティタイプで、オプションの数値やコレクションを含みます。これにはいくつかの利点があります。

- すべてのプロパティタイプが同じ方法で宣言されるようになりました。この型には @objc dynamic var が必要で、他の型には let が必要だと覚える必要はありませんし、Objective-C でサポートされていない型には RealmProperty や RealmOptional ヘルパーは不要になりました。
- primaryKey()、indexedProperties()、ignoredProperties()などのクラスメソッドをオーバーライドする必要はもうないのです。主キーやインデックス付きのフラグは、プロパティ宣言の中で @Persisted(primaryKey: true) var _id と直接設定されます。ObjectId または @Persisted(indexed: true) var indexedProperty: Int. いずれかの @Persisted プロパティが存在する場合、他のすべてのプロパティは暗黙のうちに無視されます。
```
C++,C#のコメントアウトテクニック

# 概要
下記のような記載が出来る言語で使えるコメントアウトのTips

[使える言語の参照](https://qiita.com/power3812/items/d8fc76f551970085e189)

```main.cpp
// 1行コメント
/*
複数行コメント
複数行コメント
*/
```

# 内容
複数行コメントを1文字で切り替える
先頭の**スラッシュ(/)**を消すと切り替えれる

```main.cpp
//*
現在の
複数行コメントは
コメントアウトされない
//*/

/*
現在の
複数行コメントは
コメントアウトされる
//*/
```

機能の切り替えを1文字で切り替える
上記のIF版で
先頭の**スラッシュ(/)**を消すと切り替えれる

```main.cpp
//*
Active Block
/*/
Disable Block
//*/

/*
Disable Block
/*/
Active Block
//*/
```

# まとめ
C++er には多少有名なのでN番煎じではあるもののいろいろな言語で使えるので書いてみました。

C++では#if #endifで切り替えたりしますが、プリプロセッサで簡単に切り替える機能がない言語だと使いみちはありそうです。
後1文字切り替えなので楽ですが、可読性が良いとは言えないので過度な利用は控えたほうが良さそうです。
Javascript 「~ is read-only」エラー解決法

## 目的
「~ is read-only」エラーが出たので、解決法を調査する。

## 現状
show.jsのcreatePhraseListTableNodeからlib.jsの関数を呼び出して、
trNodeという変数で「trNode is read-only」というエラーが出ている。

```js:show.js
const PhrasesTable = createPhraseListTableNode(phraseList);
```

```js:lib.js
const createPhraseListTableNode = (phraseList) => {
  const tableNode = document.createElement('table');
  tableNode.setAttribute('id', 'phrase-list');
  const theadNode = document.createElement('thead');
  const tbodyNode = document.createElement('tbody');
  const trNode = document.createElement('tr');

  let thVals = ['単語', '意味', ''];
  for (let i = 0; i < thVals.length; i++) {
    const thNode = document.createElement('th');
    thNode.innerText = thVals[i];
    trNode.appendChild(thNode);
  }

  for (let phrase in phraseList) {
    trNode = createPhraseTrNode(phrase);
    tbodyNode.appendChild(trNode);
  }
  tableNode.appendChild(theadNode);
  tableNode.appendChild(tbodyNode);

  return tableNode;
}

const createPhraseTrNode = (phrase) => {
  const trNode = document.createElement('tr');
  const contentTdNode1 = document.createElement('td');
  contentTdNode1.innerText = phrase.content;
  const meaningTdNode = document.createElement('td');
  meaningTdNode.innerText = phrase.meaning;
  const btnTdNode = document.createElement('td');
  const btnNode = document.createElement('button')
  btnNode.value = "削除"
  btnTdNode.appendChild(btnNode);

  return trNode;
}
```

# エラー内容
実際に調べてみるとこのエラーはJavascriptの厳密モードにおいて、割り当てられたグローバル変数やオブジェクトプロパティが読み取り専用であることを表している。

## 推測
- 読取専用の変数に対して代入しようとしている。
    - つまり今回は「trNode」という読取専用の変数に対して代入している場所が怪しい


「trNode」という変数に代入している場所を探すと、以下のような記述がある。

```js:lib.js
const createPhraseListTableNode = (phraseList) => {
 ...
    trNode = createPhraseTrNode(phrase);
 ...
}
```

先頭で作成しているtrNodeという変数はthead作成の際に使用されている。その後tbodyを作成のループに入った際に代入しようとして先程のエラーが出たのではないかと考える。

```js
// phraseListを tableにして返す
const createPhraseListTableNode = (phraseList) => {
  const trNode = document.createElement('tr');

  // theadの作成
  for (let i = 0; i < thVals.length; i++) {
    const thNode = document.createElement('th');
    trNode.appendChild(thNode);
  }
　//tbodyの作成
  for (let phrase in phraseList) {
    let bodyTrNode = createPhraseTrNode(phrase);
    tbodyNode.appendChild(bodyTrNode);
  }
  tableNode.appendChild(theadNode);
  tableNode.appendChild(tbodyNode);

  return tableNode;
}
```

# 解決
- thead作成とtbody作成の際に同じtrNodeという変数を使用していることが問題
- thead用とtbody用の変数に明確に分ける。
- 
```js:lib.js
const createPhraseListTableNode = (phraseList) => {
  ...
  let thVals = ['単語', '意味', ''];
  // thead用のtrNode変数
  const headTrNode = document.createElement('tr');
  for (let i = 0; i < thVals.length; i++) {
    const thNode = document.createElement('th');
    thNode.innerText = thVals[i];
    headTrNode.appendChild(thNode);
  }

  for (let phrase in phraseList) {
    // tbody用のtrNode変数
    let bodyTrNode = createPhraseTrNode(phrase);
    tbodyNode.appendChild(bodyTrNode);
  }
  tableNode.appendChild(theadNode);
  tableNode.appendChild(tbodyNode);

  return tableNode;
}
```

# 参考
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors/Read-only
オレオレutilを紹介する(TypeScript)

## はじめに
オレオレutil関数の中で便利と思ったものを紹介していきたい。

## iife
```typescript
const iife = <T>(f: () => T) => f()
```

### 使い方
before

```typescript
const random = Math.random()
let result: number
if (random < 0.3) {
  result = 3
} else if (random < 0.6) {
  result = 6
} else if (random < 0.9) {
  result = 9
} else {
  result = 10
}
// 以降はrandomを利用しないユースケースを想定
```

after

```typescript
const result = iife(() => {
  const random = Math.random()
  if (random < 0.3) return 3
  if (random < 0.6) return 6
  if (random < 0.9) return 9
  return 10
})
// result: 3 | 6 | 9 | 10
```

### 説明
名前は[Immediately Invoked Function Expression](https://developer.mozilla.org/en-US/docs/Glossary/IIFE)が由来。
（これを紹介するためにこのqiita記事を書いている。)

#### メリット
* ローカル変数をその返り値を計算するためだけに利用している場合、ローカル変数のスコープを小さくできる。
* この例だとrandomが他の場所で使われているかを考える必要がない。
* asyncにも対応している
* 元々欲しかったが、purescriptやhaskellのwhereを見てやはり間違ってなかったと感じた。
* lodashのapplyなどでもおそらく同じようなことができるが、意図としてiifeだと「その場で」「ただ変数のスコープを小さくしたいだけ」という意図を伝えられると思う。
* 上の例の場合、if分岐が1つまでならまだ三項演算子で対応できるがそれ以外だとiifeの方がreturnが使えて便利。三項演算子に長い処理があると読みにくいがこれなら読みやすい。
* わざわざ別関数を用意しなくても済む（逆に、たいていの場合はiifeを使わずに別関数に切り出して同じ効果を得ることもできるはず）
* 本来のiifeでも良いが、関数の最後まで見ないと実際にすぐに定義した関数が呼ばれているのか（iifeが行われているのか）別のことをしているのか分からない。

#### デメリット
* 使っている人を見たことがなく、初めて読む人はiifeだらけで読みづらい

## getNow
```typescript
const getNow = () => new Date()
```

### 使い方
before

```typescript
const user = new User({
  name,
  gender,
  createdAt: new Date(),
  updatedAt: new Date(),
})
User.save(user)
```

after

```typescript
const user = new User({
  name,
  gender,
  createdAt: getNow(),
  updatedAt: getNow(),
})
User.save(user)
```

### 説明
全てのnew DateをgetNow()に置き換えて使う。

#### メリット
* jestなどでmockするとき、getNow関数だけmockして、例えば2100/2/3を返すように変更すれば、システム全体がまるで2100/2/3にタイムスリップしたかのように振る舞う。
* たとえばお年玉企画のため、毎日動いているバッチ処理の中でも現在時刻が1/1,1/3,1/5それぞれだった場合には特別なバッチ処理をしたい場合などにおいて、ただしくこれらの日時になったときに動くかをgetNow関数をmockすることで簡単にテストできる。

#### デメリット
* new Dateしていた方が可読性が高い。
* 毎回のimportが面倒

## その他

```typescript
const noop = () => {} // 何もしない処理。callback引数のデフォルト引数にするなど。
const mapAsyncAll // mapの引数関数がasyncでもawaitできるなど。
const mapAsyncSeqAll // mapの引数関数がasyncでもawaitできるなど。前から順番に実行。
const forEachAsyncAll // forEachの引数関数がasyncでもawaitできるなど。
const forEachAsyncSeqAll // forEachの引数関数がasyncでもawaitできるなど。前から順番に実行。
```
NestJS入門 導入〜Hello World

## はじめに

業務でサーバーサイドを実装することになり、NestJSを使うことになったので入門がてら後から見返しやすいように記事にしました。
これからNestJSに入門するよって方の一助になれば幸いです。

## この記事のゴール

以下の理解を得ることをゴールとします。

- NestJSプロジェクトを作成できること
- 各ファイルの役割が理解できること
- `Hello World!`が出力できること

## NestJSの導入

実行時の筆者の環境は以下になります。

### 1. Nest CLIのインストール

まずは各種インストールからやっていきます

以下の手順は[公式のドキュメント](https://docs.nestjs.com/)を参考にしています。

```bash
$ npm i -g @nestjs/cli
```

### 2. プロジェクトの作成

```bash
$ nest new project-name
```

## 各ファイルの役割

| controller |  |
| --- | --- |
| module | ルーティングモジュール |
| service | シングルメソッドの簡易的なサービス |
| *.sepc | ユニットテストファイル |

## Hello Worldの出力

### 1. 実行

```bash
$ npm run start
```

### ブラウザ上で確認

localhost:3000にアクセスします

ポートはデフォルトで3000ですが自分で変えている場合はそれに合わせてアクセスしてください。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316760/972471ff-fd48-c96c-70e7-2b6eca3bada2.png" width=700 />

無事Hello Worldが表示されました！

## 余談

Nest CLIを入れるとより簡単に作成できます。

また、自動的にルートのコントーラに記載してくれるので筆者は新しいモジュール等を作成する際は以下を使用しています。

### moduleの作成

```bash
$ nest g mo file-name
```

### serviceの作成

```bash
nest g se file-name
```

### controllerの作成

```bash
nest g c file-name
```

## 参考記事

↓公式ドキュメント

https://docs.nestjs.com/

↓日本語訳ドキュメント

https://zenn.dev/kisihara_c/books/nest-officialdoc-jp
{VScode} 「Implicit keys needs to be on a single line」と出た場合

VScodeでdatabase.ymlをいじっていると、下の「問題」となっているところに「Implicit keys needs to be on a single line」と出ました。
何やら問題が発生しているらしく、その対象の文が赤線で引かれています。（画像）
https://gyazo.com/e934bd8d247577458c145c7bf9b64fb1

よくわからなかったので、この状態のままrails sコマンドでページを開こうとしました。すると、、
https://gyazo.com/b6efd3ee3abadd7aa9435a93c209e2a9

何やらエラーが出て、ページが表示されません。
Please note that YAML must be consistently indented using spaces. Tabs are not allowed. 
↑
Google先生に和訳してもらうと、「YAMLはスペースを使用して一貫してインデントする必要があることに注意してください。 タブは許可されていません。」とのこと。
非常に単純な問題でしたが、単純ゆえにハマるとなかなかわからなかったりするんですよね〜。
https://gyazo.com/409e56275d445c48216d8630e4183d89

言われたとおりインデントして、再度試したらちゃんと開けました！

![11f95d9fb09b670df3c3227245a5af38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1962714/f8bcaa9c-c111-a0d8-0ec4-e4c0d03621c1.png)


開発環境
mac OS バージョン11.6
(仮)Laravel Snappyにて、cssサイズが想定通りにする。(wkhtmltopdf側の設定をする。)

※私的備忘録のため、乱雑に記載しています。

###【問題点】
- Laravel Snappy にて、cssが想定通りに出力されない

###【原因】
- wkhtmltopdf にて、自動調整がdefaultでonになっている。

###【解決方法】
- snappyのsetOptionにて、以下のように設定すれば良い。<br>
```->setOption('disable-smart-shrinking', true);```

※wkhtmlでは、```--disable-smart-shrinking true```　を追加してあげれば良い。