OmniAICreator/Qiita-1.07M huggingface dataset:
Windows11（ダークモード）のエクスプローラーで白い線が表示される

#はじめに
Windows10でも同様の事象が報告されていますが、Windows11はレジストリを変更する必要があります。
※レジストリの変更は自己責任でお願い致します。

#現象画像
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591423/0d35fe62-8d21-694c-3fbe-c61881c3b9ae.png)

#レジストリ変更場所
```
コンピューター\HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Toolbar
```
Lockedを「1」に変更する。![3-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591423/623afea0-fe21-96f6-0eda-662fa9781456.png)

#確認
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591423/4e3d06ed-860d-842f-df6d-da2c172de67a.png)
これで煩わしい白い線が消えました。

#まとめ
Windows10ではIEから変更できます。
しかし、Windows11にはIEの起動が出来ませんので、レジストリを変更する必要があります。
#参考
[エクスプローラー利用時ツールバーに白い線が出る場合の対処方法（windows10ダークモード設定時）](https://kadoyan.net/?p=1107)
SpringのDIとLombokってとても相性良くないですか・・・？

SpringのDIとLombokはとても相性がいいなぁと今更になって思いました。

Lombokがある時とない時でどう違うの？というのはこれから説明していきたいと思います！

##　この記事でわかること
- SpringのDIとLombokはなぜ相性が良いのか
- Lombokがある時とない時のソースコード

:::note warn
この記事はDIの詳細説明はしませんのでご了承下さい🙇‍♂️
:::

## ちなみにLombokとは・・・
こちらの記事でまとめているので、まだLombokを知らないJavaエンジニアは是非覚えましょう！

https://qiita.com/toranoko92114/items/05cf2dfeab3f2a46ae56

## 気づきを得た経緯
タイトルのような気づきを得たキッカケなのですが、以前Springのハンズオン研修があり、そこで曖昧な理解になっていたDIについて復習できました。

ハンズオンのなかで、DIコンテナに登録されたインスタンスをインジェクションする方法は３つあると伺いました。
- コンストラクタインジェクション
- フィールドインジェクション
- セッターインジェクション

このなかで、推奨されている方法がコンストラクタインジェクションなんですね。（final化できるためフィールドのライフサイクル中に値が変更されない）

例えば、以下のようなサービス実装クラスがあった場合

```java
@Service
public class ServiceImpl implements Service {

  // 名前を返却するメソッド
  public String name() {
    return "hoge";
  }
}
```

:::note info
サービスクラスに@Serviceを付与することでコンポーネントスキャン（DIコンテナに自動登録する機能）され、他のクラスでインスタンスをインジェクション（注入）できるようになります。
:::

このサービスクラスをDemoControllerで利用する場合、コンストラクタインジェクションだと以下のようなコードになります。

```java
@Controller
@RequestMapping("/")
public class Controller {

  // フィールド
  private final Service service; 
  
  // コンストラクタ
  public Controller(Service service) {
    this.service = service;
  }
}
```

コンストラクタインジェクションは、コンストラクタに@Autowiredを付与する必要がありますが、コンストラクタが一つの場合は@Autowiredを省略可能です！

なるほどね、コンストラクタ必要なのね。という理解でいました。

しかし、実務に戻ってコンストラクタインジェクションしているソースコード（例は以下）を確認してみたら、コンストラクタがないじゃありませんか！？

```java
@Controller
@RequestMapping("/")
@RequiredArgsConstructor
public class Controller {

  private final Service service;

}
```

これは一体どういうことだ、コンストラクタが必要なんじゃないのか・・と混乱しました。

ですが、よくよく考えたら何のことはない、「@RequiredArgsConstructor」というアノテーションがコンストラクタ生成を請け負ってくれていたんですね~

「@RequiredArgsConstructor」はSpringの機能ではなく、Lombokというライブラリの機能になります。

SpringのDIでクラス間の結びつきを密にするのを防げますが、必ず記述しなければならないコード（ボイラープレートコード）が発生してしまいます。そこをLombokと融合することで、ボイラープレートコードも書かずに済みます。

とても相性バッチリな組み合わせということに気がつきました！！

探せば、他にもLombokと相性が良いJava／Springの機能ありそうだなぁ・・・

何かご存知の方いらっしゃったら是非教えてください！
Dynamics 365 Intelligent Order Management ~ 概要・設定① ~

2021年3月に Ignite で突如発表された、Dynamics 365 Intelligent Order Management (IOM) を今更ながら触ってみたいと思い、[試用版](https://dynamics.microsoft.com/ja-jp/intelligent-order-management/overview/)で使ってみました。
結論から先に言っておきますと、設定で挫折しました。また次回デモっぽい感じで仕上げたいです。
# D365 IOM が登場した背景
・近年の[デジタルコマース](https://www.nttdata.com/jp/ja/data-insight/2019/0924/)の台頭 → しかし、多くの企業のサプライチェーンは脆弱であり、対応できていない。
理由①：コロナ
理由②：テクノロジーの欠如

理由②へのアンサーとして、

解決策①：色んなニーズへの対応力強化
解決策②：応答性の向上
解決策③：新しいビジネスモデル創出
解決策④：コスト効率の良い[フルフィルメント](https://ecnomikata.com/ecnews/19461/)
解決策⑤：プロセスの自動化

が挙げられます。
そんなわけで D365 IOM というイカした製品が作られました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375815/7b893a74-9a78-ea23-5e7f-2b5d7854ff86.png)

# 全体観のイメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375815/007af626-2d93-c1e5-3cbc-13b8d355c6ee.png)
・フロントに注文チャネルとしてD365 Commerce（BtoC）やSales（BtoB）
・バックに製品・在庫・倉庫データとしてD365 FO（SCM）
・D365 OIM は、Power Platform 上に構築

# 接続の設定
まずは、Microsoft Dataverse、Power Autoamte 管理、IOM Data Transformer、という3つのコネクタを作成・利用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375815/305639a8-5826-f4cb-afb5-b6ddcf475aa4.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375815/a961b6a1-8535-5d62-e4ce-28071e8786d3.png)
また、D365 FO 含む外部サービスプロバイダーを追加することができます。CEと違って、FO は Dataverse じゃなくて Azure SQL に構築されているから、外部サービス扱いなのか...笑
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375815/2e3f033f-c926-5da3-e49f-726824feb579.png)

# フルフィルメント最適化の設定
フルフィルメントの最適化は、戦略（ルール名）→制約（場所、プロバイダー数、注文数、優先順位）→ソースリスト（店舗リスト）→ソース（店舗プロフィール）、という階層でルールを決めることができます。

・戦略
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375815/ddd54456-379f-cf6f-0f7e-36283528ecdc.png)
・制約
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375815/f6ac1203-64b8-3459-4bcd-f59a9975cc50.png)
・ソース
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375815/c5eda6b3-4a91-ab17-159f-c5f4fc7cfea4.png)

# 在庫可視化の設定
以前紹介した[在庫可視化](https://qiita.com/TaichiKayama/items/5f06391aaec7261e9a8b)を設定することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375815/c1c20f38-6b90-10ef-aeef-d4c5db11bb28.png)

# 関連情報
マイクロソフトの Keita Nomura さんのブログにもまとめられておりますので、ご参考ください。
・[概要・できること①](https://community.dynamics.com/365/b/dynamicsblog-ja-jp/posts/dynamics-365-intelligent-order-management)
・[概要・できること②](https://community.dynamics.com/365/b/dynamicsblog-ja-jp/posts/microsoft-dynamics-365-intelligent-order-management)
・[概要・できること③](https://community.dynamics.com/365/b/dynamicsblog-ja-jp/posts/dynamics-365-intelligent-order-management-1108466552)
・[概要・できること④](https://community.dynamics.com/365/b/dynamicsblog-ja-jp/posts/dynamics-365-intelligent-order-management-1933708598)
【2022年最新】SEO内部対策のチェックリスト 〜

## SEO内部対策項目一覧


### 検索エンジンに情報を正しく伝える
 - 見出しタグ（h1～6）
 - タイトルタグ
 - メタディスクリプション
 - メタキーワード
 - 画像のalt属性
 - 引用タグ
 - URLの正規化
 - ノーインデックス(noindex)
 - ノーフォロー(nofollow)
 - リダイレクト
 - サイト構造

### 検索エンジン(クローラー)の巡回を促す
 - XMLサイトマップ
 - 内部リンク
 - robots.txt
 - 構造化マークアップ
 - 複数ページに渡るコンテンツ(next、prev)
 
### ユーザビリティ(ユーザー体験)の最大化
 - モバイルファーストインデックス
 - 404エラーページ
 - 文字サイズ
 - 表示速度
 - SSL化
 - ページの表示速度
 - パンくずリストを設置する
 - 不要なパラメータを正規化する




**↓より具体的な解説を見る↓**

https://towhy.jp/posts/inside-seo
非公開のSolidityをリバースエンジニアリングするJEB Smart Contract Decompilerの使い方

## JEB Smart Contract Decompiler

今回の記事では、こちらのJEB Smart Contract Decompilerの無料版デモを使って、非公開のSolidityのコードをリバースエンジニアリングしていきます。NFTや、マーケットプレイスのコードが公開されていない場合、こういったツールを活用して分析していくと便利ですので、試してみてください！

## JEB Smart Contract Decompilerの起動

https://www.pnfsoftware.com/blog/ethereum-smart-contract-decompiler/

[こちらのダウンロードページ](https://www.pnfsoftware.com/jeb/demo)からダウンロードしていきます。

僕はMacbook Airを使っているので、こちらの[startupガイド](https://www.pnfsoftware.com/jeb/manual/#startup)に記載されているように、ダウンロードして解凍したフォルダの中に入っている下記プログラムを立ち上げます。

```
jeb_macos.sh
```

今回はデモ版を使用しているので、デモ版の制限の紹介と、ライセンス作成ののち、下記画面が立ち上がれば起動成功です。

![Screen Shot 2022-02-03 at 15.56.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258956/cb5f9187-7b60-2e40-1117-e48cbdaf8d49.png)

## Decompile手順

File -> Open smart contractを選択

![Screen Shot 2022-02-03 at 19.53.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258956/0a0ef58d-8d33-5a65-791a-6fa2e51383a9.png)

コントラクトアドレスを入力し、Downloadをクリックし保存場所を決めたらOKを押します。

![Screen Shot 2022-02-03 at 19.54.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258956/2d99662a-7456-6b80-c124-e902bb8a2633.png)

こちらの細かい設定は、今回はあまり詳細に確認していません。OKを押して次に行きます。

![Screen Shot 2022-02-03 at 19.55.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258956/1eb8adde-c467-276b-060e-3a5296a6285b.png)

次にこちらからDecompileをクリックすると

![Screen Shot 2022-02-03 at 19.58.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258956/4d0a6d23-5d81-9652-0a33-dc5e0ddb9948.png)

このようにDecompileした結果が表示されました！

![Screen Shot 2022-02-03 at 19.59.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258956/c00200cb-2461-a8de-88a6-5c4687b98734.png)

こちらのツールはsolidityのversionも確認できました。

![Screen Shot 2022-02-03 at 20.18.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258956/c148b215-8fab-6297-abfd-2b50bf792652.png)

今回使用しているのはデモ版なので、コピーができなかったり、一部Decompileされない等の制限がありましたが、分析結果の精度は高そうです！下記で紹介しているブラウザで動作するツールと比べて、セットアップに少し手間がかかりますが、よければ試してみてください！

## 関連ツール

こちらの記事でも紹介しているツールはブラウザ上で処理が完結するのでよりお手軽に試すことができます。こちらもぜひ試してみてください！

https://qiita.com/taijusanagi/items/8747fc650918f03a95ca

https://qiita.com/taijusanagi/items/b586837e37a1fce213cd

ありがとうございました！
【Rails】楽天APIの導入




















# 概要
備忘録として楽天APIの用いて検索する機能の実装方法をまとめます

# 参照
以下の記事を参考にしました。
ほとんど同じですが、上手く行かなかったところを自分なりに修正しました。
https://qiita.com/nabenomoto/items/6453c4577647cb8995d3

# 完成図
![rakuten.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2287171/12ff2948-de2a-6170-6dc3-578b0302d1cc.gif)

# API取得方法
こちらの記事で取得方法を詳しく解説してくださっているので、参考にしてみてください。
https://freesworder.net/rakuten-api-rails/

# アプリの作成
```ruby:ターミナル
$cd desktop
$rails new rakuten_sample
$cd rakuten_sample
```
# Gemをインストール
```ruby:Gemfile
gem 'rakuten_web_service'
```
忘れずにこれも！

```ruby:ターミナル
bundle install
```

# アプリケーションIDを設定

取得したアプリケーションIDを設定します。
config/initializersフォルダの中にファイルを作成。


```ruby:rakuten.rb
RakutenWebService.configure do |c|
  # (必須) アプリケーションID
  c.application_id = 'RWS_APPLICATION_ID'

  # (任意) 楽天アフィリエイトID
  c.affiliate_id = 'RWS_AFFILIATION_ID'

end
```

# コントローラーの作成
```ruby:ターミナル
$ rails g controller books
```

# コントローラーの編集
```ruby:app/controller/books_controller
class BooksController < ApplicationController
  def search
    if params[:keyword]
      @books = RakutenWebService::Books::Book.search(title: params[:keyword])
    end
  end
end
```
# ビューの作成
まずはapp/view/booksに
・search.html.erb
・_book.html.erb
を作成！

## ビューの編集
```ruby:view/books/search.html.erb
<div class = "search-box" >
    <%= form_with url: books_search_path, method: :get, local: true do |f| %> 
        <div class = "form-group" >
            <%= f.text_field :keyword, class: "form-control" %>
            <%= f.submit '本の題名を検索', class: "form-control btn btn-success" %>
        </div>
    <% end %>
    <% if @books.present? %> 
        <%= render 'books/book' %>
    <% end %>
</div>
```



```ruby:view/books/_book.html.erb
<% @books.each do |book| %>
    <%= link_to (image_tag(book.medium_image_url)), book.item_url %><br>
    <%= book.title %><br>
    <%= book.author %><br>
    <%= book.item_caption %><br>
<% end %>
```

# ルーティングの設定
```ruby:config/routes
Rails.application.routes.draw do
  get 'books/search' => "books#search"
  root"books#search"
end

```

完成！
お疲れ様でした！
DevToysが便利だと思ったら一緒に「PowerToys」も使ってみよう！

先日エンジニアの十徳ナイフこと「DevToys」がQiitaで話題になってましたが、DevToysと一緒に「PowerToys」も使ってみて！というお話です。機能をざっと紹介します。
まぁ結構有名(GitHubのStar 67k)なので初めて聞いた人だけ見ていただければ。
**どちらかと言うと、エンジニアに便利というより全Windowsユーザーに便利**なツール群です。
ソフトウェアのダウンロードは以下のReleaseから行えます。

https://github.com/microsoft/PowerToys/releases

※DevToysの詳細は↓

https://qiita.com/danishi/items/2de6a4ab028d27a8f4ab

## 開発者・クリエーターにとって便利な機能
先程も説明しましたがエンジニアに便利というより全Winユーザーに便利なアプリなので開発者特化なものは2つくらい。
### OSレベルのカラーピッカー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513165/079b1a2d-6c8d-94b3-744f-1513b32b7179.png)
Win+Shift+「C」同時押しでOSレベルで動作するカラーピッカーが起動。Photoshop等にもカラーピッカーはありますが他ウィンドウへの参照ができないが、PowerToysならできる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513165/b1388cc5-56a5-8c3c-ab25-81c3f5af49cd.png)
しかも、**HEX・CMYKなどの様々な規格中から絞って表示・コピーもできる**優秀さ。
Webページ見てて「この色綺麗ー」的な時にどうぞ
### SVG・MD・PDFプレビュー
エクスプローラー上でSVG・Markdown・PDFをプレビューしてくれる機能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513165/763bcb9f-1e70-fcaa-3a74-055767b75aac.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513165/a158d677-17a0-19db-751e-704f27d3ced8.png)
## 全Windowsユーザーに便利な機能
### MacのSpotlight検索
MacでCommand＋スペースで起動する**ファイル・アプリ・Web履歴などから全体検索ができるSpotlightがWindowsでも使えます**。
Alt＋スペースで起動する事ができ、パフォーマンスを損なわずに検索できるとのこと。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513165/fbfa8c40-262a-b84a-ca53-970b222e9e26.png)
### 一括リネーム
これまでファイル・フォルダの一括リネームをするには窓の杜とかからソフトをDLして…的な方法が一般でしたが、**PowerRename**という機能を使えば右クリックメニューから利用可能。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513165/099e32f4-5518-4f90-e8dc-6194500817cb.png)
### 右クリックで一発画像縮小
画像の再フォーマット・縮小も右クリックメニューから行えます。「縮小専用。」や「縮小革命」要らずに素早く行えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513165/694c4848-de96-1f80-0cd2-a24f013450e3.png)
### OSレベルでカメラ・マイクミュート
マイクとカメラのミュートをショートカット一発で行え、Zoom誤爆などを低減することが出来ます。
**Win＋Shift＋「Q」でカメラをミュート**といった操作が行えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513165/819b282e-56cd-2581-f5d7-98d8a73d8aa9.png)
### その他たくさんあるよ
その他にも

- 最前面配置非対応のアプリでも無理やり最前面にできる**Always On Top**
- キーを再マップできる**Keyboard Manager**
- ウィンドウレイアウト構成ツール**Fancy Zones**

使ってみて非常に便利な機能だと思うのでまだ使ったことがない人はぜひ使ってみて下さい。
**[Twitter @ichii731](https://twitter.com/ichii731)**
[Rust] Lifetime of associated types パターンについて

# これは何？

Rustを使っていると、参照を取得し参照を返す関数を生やしたくなることは多いです。このような目的で存在する[`AsRef`]() traitの定義は以下のようになっています。

```rust
pub trait AsRef<T> 
where
    T: ?Sized, 
{
    fn as_ref(&self) -> &T;
}
```

ここで、`as_ref()`関数は`&'a Self`をとり`&'a T`を返す関数です。

ここで、戻り値の型を一般化し`&'a T`ではなく`S<'a, T>`を返したいことがよくあります。例えば[`Option::as_ref`](https://doc.rust-lang.org/stable/std/option/enum.Option.html#method.as_ref)は以下のようになっています。

```rust
pub const fn as_ref(&self) -> Option<&T> {
    match *self {
        Some(ref x) => Some(x),
        None => None,
    }
}
```

この`as_ref()`関数は`Option`型に直接実装された関数です。すなわち**`Option`型は`AsRef` trait を実装していません。**なぜならば、シグニチャが明らかに異なるからです。

- `AsRef::as_ref` の場合、`&'a Self` から `&'a T`
- `Option::as_ref`の場合、`&'a Option<T>` から `Option<&'a T>`

では、`Option::as_ref`のような、ライフタイムパラメータ`'a`を持つような任意の型を返す関数を含むtraitを定義する方法はあるのでしょうか。

# Generic Associated Types を使う方法

このような問題を扱う方法として、generic associated types(GAT)を使う方法があります。

```rust
#![feature(generic_associated_types)]

trait GetItemRef {
	type Item<'a>
	where
		Self: 'a;

	fn get_item_ref<'a>(&'a self) -> Self::Item<'a>;
}

struct S<T>(T);
struct S2<'a, T>(&'a T);

impl<T> GetItemRef for S<T> {
	type Item<'a>
	where
		Self: 'a,
	= S2<'a, T>;
	fn get_item_ref<'a>(&'a self) -> Self::Item<'a> {
		S2(&self.0)
	}
}
```

しかし、unstable featureを使うためnightly版のコンパイルでしかコンパイルできないという問題があります。

# HKT traitを用いる方法

Rustのtrait機能を使うことにより、高階型を(制限はあるが)使えることが知られています。これを用いると実装は以下のようになります。

```rust
trait HKT<A> {
	type MA;
}
impl<'a, B, T: 'a> HKT<T> for &'a B {
	type MA = S2<'a, T>;
}

trait GetItemRef<Item>: HKT<Item> {
	fn get_item_ref(self) -> Self::MA;
}

struct S<T>(T);
struct S2<'a, T>(&'a T);

impl<'a, T> GetItemRef<T> for &'a S<T> {
	fn get_item_ref(self) -> Self::MA {
		S2(&self.0)
	}
}
```
100日でSQLの達人になる@LeetCode! Day2 <having count(var) 条件式>

##182. Duplicate Emails （問題レベル: Easy）
今日の問題はこれ。
重複しているe-mailアドレスをリストアップするという問題。

```group by```と```count()```を使うことはすぐに分かったのだが、```count()```をどこで使うのかに悩んでしまった。

ポイントは```having```句で```count()```を使うだった。
常識的な問題だとは思いますが、SQL初心者には勉強になる問題ばかりで、この学習をはじめて良かったと既に実感しています。
問題はちゃんと続くかですね〜。

* [LeetCode](https://leetcode.com/)の問題は、MS SQL Serverで解いています。
ModuleNotFoundError: No module named 'モジュール名'のエラーが出た時の対処法

# 前提
モジュールを使おうとしてimportを行ったところ、ModuleNotFoundError: No module named 'モジュール名'のエラーが出てしまい、先に進めなくなったので、その対処法の備忘録です。

## 実行環境
Python 3.9.5
pip 22.0.2
jupyter notebook 6.4.3
macOS

こちらに記載するコードはjupyter notebookに書き込む場合を記載しています。
jupyter notebookでは、先頭に！がついているときは、ターミナル操作になるので、jupyter notebookをお使いにならずターミナルやテキストエディタを使う場合、各自ターミナルでの操作になると読み替えてください。


# やったこと
パスがつながっていないのでは、と考えたので、以下の方法でパスの設定をしました。

```
!pip show モジュール名
```

すると以下の様な出力結果が出ます。

```
Name: モジュール名
Version: バージョン番号
Summary: モジュールの説明
Home-page: URL
Author: 作った人の名前
Author-email: 作った人のメアド
License: ライセンス
Location: ここが大事！インストール先
Requires: configparser, crayons, requests
Required-by: 
```

次に、パスの設定に必要なモジュールを入れます。

```
import sys
```

sysモジュールを使って、パスの設定を行なっていきます。
`pip show`コマンドで出てきた出力結果のうち、`Location:`の部分に記載されていたパスを入れて以下を実行してください。

```
sys.path.append('Location:~の部分に記載されていたパス')
```

これで、importを実行するとエラーが出ていたモジュールが使える様になったはずです。
エラーが出たimport処理をもう一度実行してみてください。
Dev-Toysっぽい機能をvimやシェルでやる方法と、それがある意味「不要」であることについて

# Dev-Toysというものが流行っているらしい
なんか、色々なツールを十徳ナイフ[^jittoku]的に集めた物らしい。
https://devtoys.app/
https://qiita.com/danishi/items/2de6a4ab028d27a8f4ab
https://qiita.com/ObuchiYuki/items/fa4cdebab2399a24d57d
プラットホームはWindowsな上にGUIです…＼(^o^)／
クローンも作られているようですが、こちらはMacかつGUI＼(^o^)／

つまり**「vimmerとかそんな人は自分で書きなさい👹」**ってことです。
でも、内容的には単に色々かき集めただけの物。
こういう物はCUIならなんてことはない。

# 言語の選定と実装
依存先を増やしたくなかったので、Rubyに絞って実装してみました。
内容は、標準入力から入力して、標準出力から出力するだけ。
例えばこんなファイル名に統一して、補完で辿る。拡張子が無いのはshebangのおかげ。

- toys-number-base
- toys-convert-json2yaml
- toys-convert-yaml2json

実際はもう一寸たくさんあります。
実装は…結構ひどい。例えばこんな風。実質一行。

```ruby:toys-convert-json2yaml
require "yaml"
require "json"
begin
  puts(YAML.dump(JSON.load(STDIN)))
rescue
  puts('Invalid JSON! Abort!')
end
```

**まさに他力本願！**

# 使い方
シェルからならこんな感じ。**補完が効くから迷いはしない。(重要)**

```sh
echo '{"hoge": "fuga"}' | toys-convert-json2yaml
```

vimからなら、visualモードで選択した上で、こんな感じ。

```vim
'<,'>!toys-convert-json2yaml
```

vimならコピペの必要すら無く、その場で即変換になる。
ただし、行単位の変換になるのが玉に瑕。
どうにかしたいならvimscriptを書けばいい。僕はしないけど。

# で、これ必要なの？
便利だしバグる要素極限に少ないかも知れないけど、根本的に不要と思います。
ほとんどコマンドの名前を付け替えてるだけで、プログラミングとすら言えない。
Dev-Toysは「『Visual Studio』の開発に携わっているメンバー」が
作ったから意味があるし支持されるし信頼できるんだと思います。

なお、僕は便利だからという理由で、
僕の欲しいものだけ実装して使う…かもしれない。

[^jittoku]: まぁ、その…UNIX哲学的にはありえない思想ではあるけど、気持ちはよく分かる。
Scipyでビニング処理

# Scipyを使って簡単なビニング処理

データf(x)が得られたとする。生データの点xが均等でなくて、かつ補間とかはしたくないなあ、という場合にはxをいい感じに区切ってビニングしたい。

「python ビニング」ってググるとpandasを使ったものしか出てこない。しかし私はpandas好きじゃないのでscipyを使う方法をメモ。

```python
import numpy as np
from scipy.stats import binned_statistics
```

`scipy.stats.binned_statistics`というのを使う。

## 参考文献
公式リファレンス
https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.binned_statistic.html
Laravel フォームリクエストでバリデーション(メモ)

https://kaiblo.com/laravel-%e3%83%95%e3%82%a9%e3%83%bc%e3%83%a0%e3%83%aa%e3%82%af%e3%82%a8%e3%82%b9%e3%83%88%e3%81%a7%e3%83%90%e3%83%aa%e3%83%87%e3%83%bc%e3%82%b7%e3%83%a7%e3%83%b3%e3%83%a1%e3%83%a2/

こちらに移動しました。
PHPのエラーメッセージ有効化はphp.iniを使った方が良い

ini_set('display_errors', "On");
だと、セミコロンが無い時。真っ白の画面になります。
どこでエラーが出ているか分かりません。

まずはphp.iniを探します。
[info.php]を作って中身を
<?php phpinfo(); ?>
にします。

ブラウザから /info.php を見れば出ています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483166/9950f709-9089-be5f-9383-9e6b777aa021.png)
「Loaded Configuration File」で検索してください。

ちなみに。
php -info|grep php.ini
を実行してもphp.iniファイルが見つかりますが、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483166/d2698fb6-bc19-c2e0-2716-6d718fad596c.png)
[cli]と入っているので、多分クライアント用ですね。違うファイルです。

sudo vi /etc/php/7.4/apache2/php.ini
とかで編集します。

display_errors
を検索してください。(/display_errors)
display_errors = Off
を
display_errors = On
に書き換えて(i...うにゃうにゃ...esc)
保存(:wq)

デーモン再起動
sudo systemctl restart apache2

再度ブラウザから /info.php を見て確認。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483166/49a608d4-9a12-332b-bb01-7ee06a40b4d0.png)

以上
Linuxでテキストファイルの重複行を抽出・削除する方法（uniqコマンド）

Linuxでは`uniq`コマンドと`sort`コマンドを使用して、テキストファイルの重複行を抽出・削除することができます。
ここではそのやり方を紹介します。

# 環境
+ OS：CentOS Linux release 8.1.1911

```
[root@centos8 work]# cat /etc/redhat-release
CentOS Linux release 8.1.1911 (Core)
[root@centos8 work]#
```

# 1. uniqコマンド
`uniq`コマンドの書式は以下の通りです。

```
uniq [オプション]... [入力ファイル [出力ファイル]]
```

uniqコマンドの主なオプションは以下の通りです。

|オプション|長いオプション|内容|
|:---:|:---:|:---|
|-c|--count|各行の前に重複回数を出力する|
|-u|--unique|重複していない行だけを出力する|
|-d|--repeated|重複した行だけを出力する|
|-D|--all-repeated|重複した行を全て出力する|
|-i|--ignore-case|比較時に大文字と小文字の違いを無視する|
|-w N|--check-chars=N|行の比較を最初のN文字で行う|
|-s N|--skip-chars=N|最初のN文字を比較しない|
|-f N|--skip-fields=N|最初のN個のフィールドを比較しない|
|-z|--zero-terminated|最後にNULL文字を出力する|

# 2. 重複行を抽出

重複行を抽出する場合、以下のコマンドを使用します。
`uniq -d <ファイル名>`

以下、試してみます。

以下のファイルがあるとします。

```text:sample01.txt
Java
HTML
HTML
JavaScript
JavaScript
Tomcat
Apache
```

2, 3行目の「HTML」、4, 5行目の「JavaScript」が重複しています。

ここで、以下のコマンドを実行すると、重複行だけ表示されます。

`uniq -d sample01.txt`

```:実行結果
[root@centos8 work]# uniq -d sample01.txt
HTML
JavaScript
[root@centos8 work]#
```

ファイルに出力する場合、以下のコマンドを実行します。

`uniq -d sample01.txt <出力ファイル>`

```:実行結果
[root@centos8 work]# uniq -d sample01.txt result01.txt
[root@centos8 work]# cat result01.txt
HTML
JavaScript
[root@centos8 work]#
```

# 3. 重複行を削除

重複行を削除する場合、以下のコマンドを使用します。
`uniq <ファイル名>`

以下、試してみます。

同じく、以下のファイルがあるとします。

```text:sample01.txt
Java
HTML
HTML
JavaScript
JavaScript
Tomcat
Apache
```

2, 3行目の「HTML」、4, 5行目の「JavaScript」が重複しています。

ここで、以下のコマンドを実行すると、重複行が削除されて表示されます。

`uniq sample01.txt`

```:実行結果
[root@centos8 work]# uniq sample01.txt
Java
HTML
JavaScript
Tomcat
Apache
[root@centos8 work]#
```

ファイルに出力する場合、以下のコマンドを実行します。

`uniq sample01.txt <出力ファイル>`

```:実行結果
[root@centos8 work]# uniq sample01.txt result02.txt
[root@centos8 work]# cat result02.txt
Java
HTML
JavaScript
Tomcat
Apache
[root@centos8 work]#
```

次に以下のファイルがあるとします。

```text:sample02.txt
Java
HTML
HTML
JavaScript
JavaScript
HTML
Tomcat
Apache
```

2, 3, 6行目の「HTML」、4, 5行目の「JavaScript」が重複しています。

ここで
`uniq sample02.txt`
を実行すると以下となります。

```:実行結果
[root@centos8 work]# uniq sample02.txt
Java
HTML
JavaScript
HTML
Tomcat
Apache
[root@centos8 work]#
```

「HTML」の文字が2回表示されます。
連続している重複（2,3行目の「HTML」）は取り除かれますが、離れている重複行（6行目の「HTML」）は削除されません。
この場合、`sort`コマンドでソートしてあと、`uniq`コマンドで重複行を削除します。

`sort sample02.txt | uniq`

```:実行結果
[root@centos8 work]# sort sample02.txt | uniq
Apache
HTML
Java
JavaScript
Tomcat
[root@centos8 work]#
```

順番は変わってしますが、重複行は削除されました。

ファイルに出力する場合、以下のコマンドを実行します。

`sort sample02.txt | uniq > <出力ファイル>`

```:実行結果
[root@centos8 work]# sort sample02.txt | uniq > result03.txt
[root@centos8 work]# cat result03.txt
Apache
HTML
Java
JavaScript
Tomcat
[root@centos8 work]#
```

# 参考
+ [【 uniq 】コマンド――重複している行を削除する：Linux基本コマンドTips（64） - ＠IT](https://atmarkit.itmedia.co.jp/ait/articles/1611/14/news021.html "【 uniq 】コマンド――重複している行を削除する：Linux基本コマンドTips（64） - ＠IT")
+ [【uniq】Linuxで重複した行を抽出・削除するコマンド](https://uxmilk.jp/53546 "【uniq】Linuxで重複した行を抽出・削除するコマンド")
OCIでデータベースへの接続がタイムアウトする場合の回避方法

OCI（Oracle Clud Infrastructure）のDBCS（Database Cloud Service）などのデータベースを利用する際に、通信経路の何らかの機器のタイムアウト設定などの影響を受けて、接続がORA-3113でタイムアウトすることがあります。（クラウド環境に限らない話ですが....）

対応方法としては、該当機器のタイムアウト設定を見直す方法がありますが、Oracle Client側の設定で対処できるか確認してみました。

### 1.Windows10のTCP/IP Keep Alive Time変更

まずは、Oracle ClientとなるWindows10のKeep Alive Timeを設定してみます。

マイクロソフト社のTechNetにある[「TCP 関連でレジストリにより設定可能なパラメーターについて」の記事](https://social.technet.microsoft.com/Forums/ja-JP/30897df3-dc52-4c92-808b-ac01cc6936ee/tcp?forum=Wcsupportja)を参考にしました。

TCP/IPのKeep Alive Timeとして、以下のレジストリーキーを追加します。

パス：HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
名前：KeepAliveTime
種類：REG_DWORD（32ビット）
値：設定したいKeep Alive Time（ミリ秒）

今回は 60秒（60000ミリ秒）に設定しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694576/068c53ab-ed7c-42c1-7254-c64604f1ce57.png)

### 2.tnsnames.oraの変更

Oracle Net ServiceのEnableパラメータをOracle Clientのtnsnames.oraに設定することで、TCP転送のキープアライブ機能をネット・サービス・クライアントに対して有効にできます。

tnsnames.oraのDESCRIPTIONセクションに「(ENABLE=BROKEN)」を追加します。

```
privatedb =
  (DESCRIPTION =
    (ENABLE=BROKEN)
    (ADDRESS = (PROTOCOL = TCP)(HOST = xxx.xxx.xxx.xxx)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = xxxxxxxx.subxxxxxxxx.vcnxxxxxxxx.oraclevcn.com)
    )
  )
```

[こちらの記事](https://qiita.com/ayamakkk/items/5d69a92aac854634bafd)にある、ネットワーク・ロード・バランサを経由したデータース接続環境でテストしたところ、本来6分でタイムアウトする事象を回避できることを確認できました。
初心者Laravel開発のまとめ

#概要

去年からWeb開発(Laravel)参入、
その前にC,C++はメインです。
まったく別の世界ですが、面白かったです。

転職により技術スタッフが若干変わる予定なので（Web開発は変わらない）
いままで使っていたLaravel開発に関して、問題点などまとめたいと思います。

###1.開発環境
一番最初、もちろんQiitaの記事を参考
[【超入門】20分でLaravel開発環境を爆速構築するDockerハンズオン](https://qiita.com/ucan-lab/items/56c9dc3cf2e6762672f4)
その時点で、PHPの経験もないし、MySQLの経験んもほぼない状態です。
とりあえず、うまく開発始まりました。

Dockerの環境を弄って、だんだんPHPとMySQLのやり方が分かったので、
その後（一か月以降）、WampServerやMySQL Workbenchなどいろいろ良いツール
の存在が知っていて、ローカル環境に移行しました。

デプロイの部分は
会社Azureを使っているので、VSCodeのAzure拡張機能を使って簡単にデプロイできます。

###2.認証
開発環境と同じように、最初何もわかってなかったので、
Fortifyというモジュールをそのまま使っています。
中身の訳わからないままに、ドキュメントを参考して動かしました。
下のMultitenancy開発の時、Fortifyなしですべて書き直しましたが、それは半年以降の話です。

###3.PDF
PDF生成に関して、Qiitaでいろいろ情報を読んで、
最初Laravelのバックエンドで直接にPDFでJavascriptのグラフを生成したいんですが、難しそうです。
結局tcpdfを決めました。
しかし、composerのバージョンはどうしても古そうなので、
Githubで最新のファイルを入れ替えならければいけません。
グラフの部分は結局JavascriptのjsPDFとhtml2canvasを使ってフロントエンドでやりました。

###4.多言語
多言語に関して、大体ドキュメントに記載されています。
他に助かった参考は下記
[Localization Implementation in Laravel with Language Switcher](https://5balloons.info/localization-laravel-multi-language-language-switcher/)

###5.Multitenancy
これは私に対して、一番難しかった対応だと思います。
でも、これをきっかけにLaravelのフレームワーク自体を大体理解できています。
Providers,Middlewareの仕組みなど
これに関して、大変助かったリンクは下記
[Multitenancy in Laravel: Migrations, Testing, and switching tenants](https://www.youtube.com/watch?v=592EgykFOz4&ab_channel=MohamedSaid)
[Multitenancy in Laravel: Configuring sessions](https://www.youtube.com/watch?v=cjWEZ5SKvIY&ab_channel=MohamedSaid)
さらに、上記のビデオにはdomainのMultitenancyを紹介しましたが、
他の状況、subdomainやpathなど
[Laravel multi-tenancy, avoiding over engineering](https://ollieread.com/articles/laravel-multi-tenancy-avoiding-over-engineering#bonus-subdomain-or-domain-identification)
の記事ですごく分かりやすく紹介されています。

###6.Heatmap
基本的にHeatmap.jsは使いやすいです。
[Heatmap.js](https://www.patrick-wied.at/static/heatmapjs/)

#所感
以上はLaravelに関する出った課題です。
しかし、これらの課題は開発全般に対してそんなに時間がかからなかったんです。
開発の時、もっとも時間がかかったのは、
#####1.要求の検討（お客様とのやり取り、開発案の決めなど）
#####2.言語の使い方、初心者なので、PHPやJavaScript,HTML,CSSなどそれぞれの勉強は一番時間かかりました。
#####3.データベースの設計（お客様の要求はずっと変わっているので、データベース設計の見直しは3回ぐらいやりました）
振り返ると、Laravel自体はそんなに詰まったことはないんです。
つまり、すごく良いフレームワークだと思います。
ibm_watson_studio_libでCP4DのProjectのファイル・データ資産の読込、登録を行う

CP4DのWatson StudioのJupyterからProjectのファイル・データ資産の読込、登録を行います。
以前はproject_libというAPIを使っていましたが、今はibm_watson_studio_libに置き換わっています。

- テスト環境
    - CP4D 4.0.5
    - python　3.8.11
    - pandas 1.2.4
    - ibm-watson-studio-lib 3.0.6

#1. Projectのファイル・データ資産のDataFrame読込１コードの自動生成
Projectに登録したファイル・データ資産を読み込む一番簡単な方法はコードの自動生成になります。
以下のようにデータのファイルを選んで「pandas DataFrame」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/5b797573-0cae-b05a-5f70-4c08e25b68ec.png)

そうすると自動的に以下のようなコードが生成され、data_df_1というpandas DataFrameに読み込まれます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/c2a07928-be77-b780-fa3a-3c7c121bf27e.png)

#2. Projectのファイル・データ資産のDataFrame読込２ibm-watson-studio-libのload_data
ibm-watson-studio-libのload_dataをつかってDataFrameに読み込むこともできます。

ibm-watson-studio-lib for Python - IBM Documentation 

https://www.ibm.com/docs/ja/cloud-paks/cp-data/4.0?topic=lib-watson-studio-python#fetch-data

まず、Projectに登録されているファイル・データ資産をlist_stored_dataでリストしてみます。

```python
import ibm_watson_studio_lib
wslib = ibm_watson_studio_lib.access_project_or_space()
data_assets=wslib.list_stored_data()
wslib.show(data_assets)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/442dd3fb-18e4-9ab1-1f74-0b2d562f8225.png)

load_dataでBytes bufferが返るので、pd.read_csvでDataFrameに読み込みます。

```python：ProjectFile->DataFrame
my_file = wslib.load_data("Cond4n_e104.csv")
import pandas as pd
df=pd.read_csv(my_file)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/9ebd82aa-2664-108c-b948-56a5a091647d.png)

#3. DataFrameをProjectのファイル・データ資産として書き込む
Bytes bufferに変換するために.encode('utf-8')でdf.to_csvを変換してsave_dataで保存します。

```python:DataFrame->ProjectFile
wslib.save_data("Cond4n_e104FromPandas.csv", df.to_csv(index=False).encode('utf-8'),overwrite=True)
```
以下のように保存されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/bd96a007-1b72-4600-9689-6be3e63564f5.png)

#4. Projectのファイル・データ資産を一時ファイルとしてダウンロード
download_fileでファイルとしてダウンロードすることもできます。


```python:ProjectFile->TempLocalFile
wslib.download_file("Cond4n_e104.csv")
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/3368970a-bc2c-780f-3515-674a8ed41f69.png)

#5. 一時ファイルをProjectのファイル・データ資産としてアップロード

ファイルは一時的なファイルになります。Watson StudioのJupyterはpodとして起動しますので、podが落ちた場合にはファイルはなくなります。
プロジェクト内で永続的に利用したい場合にはProjectのファイル・データ資産としてupload_fileで登録します。
ここでは#2でDataFrameに読み込んでいたデータをto_csvで一時ファイルをつくってからアップロードします。

```python:TempLocalFile->ProjectFile
df.to_csv("Cond4n_e104FromTemp.csv",index=False)
wslib.upload_file("Cond4n_e104FromTemp.csv",overwrite=True)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/cf40bdbd-aa61-67c0-bbed-7ca229df0827.png)

以下のようにプロジェクトのファイル・データ資産として登録されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/f15c73a3-4cdd-7dcc-fc11-e85e616f09a8.png)

# サンプルコード

https://github.com/hkwd/220201watsonstudio/blob/master/220203wslibtest/wslibtest.ipynb
【AWS・Linux】「No space left on device 」と出たの対処法

## 問題
ファイルの操作、ファイル名の補完などをしようとすると以下のようなエラーで操作ができなくなってしまう。

 - No space left on device
 - ヒアドキュメント用一時ファイルを作成できません: デバイスに空き領域がありません

## 対応


1.ディスク容量を確認し、容量を使っているファイルを以下のコマンドで探して削除。(今回はログファイルが容量を使っていた。)


```
sudo du -x / | sort -n | tail -40
```

2.1で改善されなかったのでさらに調査。inode(作れるファイル数の上限)がいっぱいになっている可能性があるため以下のコマンドで確認

```
df -i
```

3.inodeがいっぱいになっていることがわかったので、以下のコマンドでカレントディレクトリに存在するファイル数を計算して不要なファイルを削除していく。

```
sudo find . -xdev -type f | cut -d "/" -f 2 | sort | uniq -c | sort -n
```


## まとめ

 - 「No space left on device」など、容量不足のエラーが出た場合は容量だけでなくファイル数が原因の可能性がある。
 - 今回はそこまで多くのファイルを削除していないが、急に解消された。容量の多いファイルを削除->ファイル数の削減の順番で行ったため急に再計算された？
 - インスタンスを再起動したら解消されるという記事も散見されるため試す価値はあり。


## 参考

 - [AWSで「No space left on device」が出たときの対応](https://qiita.com/shizuma/items/64545f2e2037011647ae)
 - [No space left on device とエラーが出るときの対処法](https://qiita.com/0x50/items/ecc6cfdbb8a3f0c0855f)
MSGファイル 開けないクエリは解決されました

<p><b>注：</b>このブログでは、クエリMSG送信際ないを解決します。</p>

<p>ここにいます。つまり、Windows 10バージョンを使用していて、MSGファイルを開くことができません。 Windows 10でMSGファイルを開くことができない人にとって最も簡単なトリックがあります。このブログでは、Outlookを使用せずにWindows10でMSGファイルを開く方法について説明します。それでは、始めましょう。</p>

<p>拡張子が.msgのファイルには、添付ファイルを含むメッセージが含まれています。 MS Outlook＆Exchangeを使用して、添付ファイル付きのMSGファイルを開くことができます。しかし、MS Outlook＆Exchangeがない状態でWindowsで.msgファイルを開きたい場合はどうなりますか？それはMSGファイルビューアユーティリティで可能です。このソリューションは、Windowsプラットフォーム用の無料のアプリケーションです。この製品を使用すると、Windows 10を含むすべての利用可能なバージョンのWindowsオペレーティングシステムでMSGファイルを開くことができます。これは、Windowsで.msgファイルを表示するための一貫したインターフェイスを備えたシンプルなソリューションです。</p>

<p><b>それでは、ソフトウェアが解決できるクエリを見てみましょう。</b></p>
<p><b>1.</b>MSGファイル簡単な</p>
<p><b>2.</b> Windowsで添付ファイル付きのMSGファイルの大部分を開くことはできますか？</p>
<p><b>3.</b> Windows 10で.msgファイルを表示するにはどうすればよいですか？</p>
<p><b>4.</b> Windows 10でMSGファイルを読み取るための最良の方法は何ですか？</p>

<p><b>エキスパートソリューション：</b><a href="https://www.mailsware.com/jp/msg-converter.html"><b>MSGコンバータソフトウェア</b></a>は、MSGファイルを制限なく読み取るための世界的に有名なアプリケーションです。 すべての属性を使用してWindows10でMSGファイルを開くのは、高速、簡単、正確です。</p>

<p>先に進んで、Windowsで.msgファイルを表示するためのMSGオープナーの動作を見てみましょう。</p>

<h2>OutlookなしでWindows10でMSGファイルを開く手順は？</h2>
<p>所定の手順に従って、Windows10でバルクMSGファイルを開くだけです。</p>
<p>1.WindowsマシンでポータブルMSGファイルビューアユーティリティを開きます。</p>
<p>2. [ファイル]メニューに移動し、[開く]を選択して.msgファイルをロードします。</p>
<p>3.必要な.msgファイルを含むメールボックスを確認します。</p>
<p>4. MSGファイルをクリックして、複数のモードでプレビューを表示します。</p>
<p>5.プレビューモードを選択し、添付ファイル付きのMSGファイルを開きます。</p>

<p>この簡単な方法で、外部インストールなしでWindows10でバルクMSGファイルを開くことができます。このソリューションは、Windows 10でOutlookMSGファイルを開いている間、信頼性が高く、努力し、精度を維持します。</p>

<h2>いつでもどこでもMSGファイルを読むための手間のかからないソリューション</h2>
<p>常にWindows10の可用性で.msgファイルを開くための無料ソリューションの最高品質の1つ。複数のMSGファイルを追加して、すべてのコンポーネントのプレビューを表示できます。ファイルサイズの制限はありません。また、MSGファイルビューアユーティリティは、これまでで最高のユーザーエクスペリエンスを提供します。 2019、2016、2013、2010、2007などのすべてのOutlookエディションのMSGファイルをサポートします。添付ファイルと一緒にメッセージを見ることができます。これは、WindowsプラットフォームでMSGファイルを失うことなく開くのに最適なユーティリティです。</p>

<h3>MSGファイルビューアツールの注目すべき機能を読む</h3>
<p>1.添付ファイルやその他の属性を持つMSGファイルを開くためのフリーウェアプログラム。</p>
<p>2. to、from、subjectなどのコンポーネントを含むバルクMSGファイルを読み取ることができます。</p>
<p>3. MSGファイルを、標準、プロパティ、16進数、ヘッダー、MIMEなどのプレビューモードで開きます。</p>
<p>4.それぞれの添付ファイル、要素、およびその他の情報を含むMSGファイルを簡単に表示します。</p>
<p>5.データの損失やメッセージの変更なしに、すべての.msgファイルを個別に参照およびスキャンします。</p>
<p>6.アドバンス検索モードを使用して、MSGファイル内の情報を検索できます。</p>
<p>7.データの整合性、フォルダー階層、およびメタデータのプロパティを全体にわたって維持します。</p>
<p>8.大きなサイズのMSGファイルを開き、.msgファイルからコンテンツを制限なく読み取ることができます。</p>
<p>9.プログラムは、100％正確で、ユーザーフレンドリーで、高速で、最小限の技術で設計されています。</p>
<p>10.msgファイルを解決するための驚くべき信頼できるツール</p>

<h3>すべてをまとめる</h3>
<p>前回のブログでは、Windows 10で複数のMSGファイルを開く方法を説明しました。ソリューションは高速で、簡単で、正確です。 MSGファイルビューアは、4つ以上のプレビューモードでOutlookメッセージをプレビューできるスタンドアロンアプリケーションです。プログラムは本質的に移植可能であり、100％の結果が得られるため、プログラムをインストールする必要はありません。</p>
【React】配列stateにpushした時に出るエラー

# エラー内容
```
Uncaught TypeError: Cannot add property 0, object is not extensible
    at Array.push (<anonymous>)
```

配列stateに対してpush（破壊的メソッド）した時にコンソールに出力されます。

```
const cardsState = atom<string[]>({
  key: AtomKeys.CARDS_STATE,
  default: []
});
const [cards, setCards] = useRecoilState(cardsState);
cards.push['aaa.png']; ← ここでエラー
setCards(cards);
```
配列stateはミュータブルで破壊的なメソッド（push、spliceなど)を持っています。
しかし、stateを破壊的メソッドで変更すると、元のstateの変更が検知されず再描画されなくなってしまうためエラーになります。
破壊的なメソッドについてや具体的な理由は参考にさせていただいた[参考文献](https://qiita.com/ogaru-sh/items/716e0610b8c256518783#%E5%8F%82%E8%80%83%E6%96%87%E7%8C%AE)をご覧ください。


## 修正内容
```
const cardsState = atom<string[]>({
  key: AtomKeys.CARDS_STATE,
  default: []
});
const [cards, setCards] = useRecoilState(cardsState);
setPlayersCards([...cards, 'aaa.png']);
```
スプレッド演算子で新しい配列としてsetする。
(配列を別配列にコピーしてpushするのもOK)

# 参考文献
- [破壊的メソッドとミュータブル・イミュータブル[React,Javascript]](https://qiita.com/takeiin/items/448d76ba1cd65dbc585a)
【Laravel】「web.php のルート情報が多くなった…」ときに便利な ルート情報のファイル分割

## はじめに

Laravel で `routes/web.php` にルーティング情報を記述していくと、いつの間にか `web.php` 内が多くのルート情報で埋め尽くされてしまうことがあります。

そんなときは、ルート情報を `別のファイルに分割する` 方法をとると、`web.php` がすっきりして、尚且つ、目的に応じたルート情報ファイルを作成することで、メンテナンス向上にも繋がるかと思います。

## 目的別にルート情報を分割する

目的別に情報を分割する方法として、`web.php` に `require` を使用して、ルート情報が記述されたファイルを取り込む方法があります。以下の様な感じです。

```php
require __DIR__ . '/sample.php';
```

例えば、Laravel Breeze をインストールした後は、`web.php` が以下の様になっています。

```web.php
Route::get('/', function () {
    return view('welcome');
});

Route::get('/dashboard', function () {
    return view('dashboard');
})->middleware(['auth'])->name('dashboard');

require __DIR__ . '/auth.php';
```

`require __DIR__ . '/auth.php';` の部分を見て分かるように、認証関連のルート情報は、`routes/auth.php` のファイルを取り込んで処理しています。

この様に、ルート情報を目的別に分けてファイル管理することによって、`web.php` 内が見やすくなり、メンテナンス性も向上します。
powerautoamte 行の一覧を取得フィルターの書き方

_cr324_test_id_value eq guid

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368087/e672d136-1974-81f3-b45d-3bfe8e0ba862.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368087/0587872f-5c76-7691-310d-f15fa6c10ff2.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368087/5a857dbc-4729-e5fc-3e84-315897460ed7.png)

参照：https://tech-blog.cloud-config.jp/2021-12-17-power-automate-dataverse-filter-query/
【Jest】randomやDateのモック化

# はじめに
TypeScriptで開発を行う際、テストツールとしてJestを利用しました。
その時のモック化したコードを備忘録としてまとめてみました。
Math.randomとDate.getMonthのモック化を例に紹介します。

# 環境
node: 16.4.2
ts-node: 10.4.0
typescript: 4.5.5
@types/jest: 27.4.0
jest: 26.6.3
ts-jest: 26.5.6

# サンプルコード
```sampleMethod.ts
export default class sampleMethod {
    public getRandomNumber(): number {
        return Math.random()
    }
    public getMonth(): number {
        return new Date().getMonth()
    }
}
```

以下はモックを使う前のテストコード

```sampleMethod.test.ts
import sampleMethod from './sampleMethod';

describe('spyOn', () => {
    const SampleMethod = new sampleMethod;
    // ランダム関数が偶然0を返してくれないとテストに通らない
    test(`Math.random`, function () {
        const resultNumber = SampleMethod.getRandomNumber();
        expect(resultNumber).toBe(0);
    });
    // １月にテストした時にしかテストを通らない
    test(`Date.getMonth`, function () {
        const resultMonth = SampleMethod.getMonth();
        expect(resultMonth).toBe(0);
    });
})
```
# モック化する
## Math.random

- Math.randomが、必ず0を返すモック

初期化してあげないと、意図しないテストに影響することも

```TypeScript
jest.spyOn(global.Math, 'random').mockReturnValue(0);
```

```TypeScript
global.Math.random = jest.fn(() => 0);
```

```TypeScript
global.Math.random = jest.fn().mockReturnValue(0);
```

- Math.randomが、一度だけ、必ず0を返すモック

2回目の呼び出し時は、ランダムに0以上1未満の数字が返ってくる

```TypeScript
jest.spyOn(global.Math, 'random').mockReturnValueOnce(0);
```

```TypeScript
global.Math.random = jest.fn().mockReturnValueOnce(0);
```

## Date.getMonth

- Dateオブジェクト全体のモック化

getMonth以外にも、getDayやgetHoursなどのメソッドもモック化された値を返す

```TypeScript
const mockDate = new Date('2022-01-01T01:00:00');
jest.spyOn(global, 'Date').mockImplementation(() => mockDate as unknown as string);
```

- getMonthメソッドのみのモック化

~~探してみましたが、わかりませんでした。~~
~~もし、わかる方がいらっしゃれば教えてください。~~

```TypeScript
jest.spyOn(global.Date.prototype, 'getMonth').mockReturnValue(0);
```

Math.random同様に、他の記法でもモック化できる。
VSCodeとGitHub連携で"git add" returning "fatal: outside repository" error が出たときの対処方法

##問題
VSCodeとGitHub連携をした後、
VSCodeからステージングをしようとすると、スクショの通り、
**"git add" returning "fatal: outside repository"**
とエラーがでました！![スクリーンショット 2022-02-02 22.49.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616900/0d0cd368-b7e2-db4d-dea6-e8d33afd88e4.png)

##対処方法
こちらのサイトに掲載されていた内容で解決。
> 1. フォルダ名が日本語になっている
> 2. Gitのバージョンが低い（更新されてない）

> https://crestadesign.org/sd-vscode-github1/

ですが、**「フォルダ名が日本語になっている」**について見落としをしていたため、何時間も潰してしまいました...
以下、反省のメモ書きです...

### フォルダ名はPATHも確認すべし！
（スクショでは諸事情でパス名を隠しているのですが、）
パス名が、以下のように日本語になっていたのが原因でした！
めっちゃケアレスミス！

```
/Dropbox/_案件ファイル/ガイドライン/test
```

####日本語がダメな理由
（UTF-8のファイルが多くなっているので、日本語名のファイル名を気にしていなかったのが盲点でしたね... ）

MacとWindowsでは、
Macは「が」→「か゛」として保存するのに対し、
Windowsは普通に「が」なので、
Zipファイルなどに込めたファイルを開くと名前が表示されないなどの問題があるようです。

##フォルダ名は、極力「半角英数字」にする
MACとWindowsとLinuxでファイルパスに使える記号も違うそうなので、
**フォルダ名は、極力「半角英数字」**にするのが無難ですね。
勉強になりました！！！
【Vue.js】ディレクティブ（v-on、v-show）について

ディレクティブの```v-on```、```v-show```についてメモしておく。

##ディレクティブ
##v-on
イベント発生時の処理など、イベントを設定することができる。
下記はボタンが押されると```onClick()```が呼ばれて、数字が増えるようなサンプル。

```html
<div id="app">
	<button v-on:click="onClick">ボタン</button>
	{{counter}}
</div>
```

```javascript
const Sample = {
	data() {
		return {
			counter: 0,
		};
	},
	methods: {
		onClick() {
			this.counter = this.counter + 1;
		},
	},
};

Vue.createApp(Sample).mount("#app");
```
##v-show
真偽値で画面の表示・非表示を切り替えることができる。
これは切り替えを行う要素はそのままで、```false```の場合にcssに自動的に```display:none```が付与される仕組みになっている。
先ほどの```v-on```と組み合わせて、ボタンで表示・非表示を操作できる簡単なサンプルを作ってみた。

```html
<div id="app">
	<button v-on:click="on">表示</button>
	<button v-on:click="off">非表示</button>
	<p v-show="viewFlag">Hello!</p>
</div>
```

```javascript
const Sample = {
	data() {
		return {
			viewFlag: true,
		};
	},
	methods: {
		on() {
			this.viewFlag = true;
		},
		off() {
			this.viewFlag = false;
		},
	},
};

Vue.createApp(Sample).mount("#app");
```
IBMCloud SSL証明書オーダおよび更新

##目的
IBMCloudでSSL証明書をオーダする方法を記載する。
IBMCloudDocsでは、Certificate Manager以外のオーダ方法のドキュメントが見当たらなかった。
また証明書をオーダする際に、<font color=red>認証するメールアドレスが必要だがメールが利用できない場合どうするか</font>を記載

Certificate Managerを利用する場合は[こちらのページ](https://cloud.ibm.com/docs/certificate-manager?topic=certificate-manager-ordering-certificates&locale=ja#ordering-certificate "証明書の注文")を参考


##SSL証明書のオーダ
まずは普通にオーダしてみる
**Classic Infrastructure** -> **Secyrity** -> **SSL** -> **Orders** -> **Order New SSL**をクリック
![スクリーンショット_2022-02-03_15_57_59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/6a5e97cb-70c1-be80-4ce4-338e1fed38f7.png)

1. **Years** -> 利用期間を選択
2. **Select SSL Option** ->　利用したい認証局のブランドを選択
3. **Enter Certificate Signing Request** -> SSL証明書を発行するためのCSRを入力
4. **Select Server Platform** -> SSL証明書を利用するアプリケーションを選択  

![スクリーンショット_2022-02-03_15_16_08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/35ddcf6e-9f11-8013-727a-7d9540c2feee.png)

1. **Server Count** -> 証明書を利用するサーバ台数
2. **Approver Email** -> 証明書の発行にあたって認証メールが飛ぶ為、利用できるアドレスを指定する必要がある
<font color=red>**もしこのリストから利用できるアドレスがない場合は、サポートケースを開く必要がある**</font> 
3. **Organization Information** -> 会社情報を入力する。CSRの情報を利用する場合は、チェックを入れるだけ
4. **Contacts** -> 連絡先担当者の情報を入力する
![スクリーンショット_2022-02-03_15_19_32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/8f217f78-d48c-4cc9-3c40-b94594b1e6ad.png)

![スクリーンショット_2022-02-03_15_30_38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/3a427c1d-4185-d590-8056-2aee917fe982.png)

記載されている費用で問題なければ、**同意のチェックボックスを選択**し、**Place Orderをクリック**

![スクリーンショット_2022-02-03_15_32_28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/706c086a-1a4d-a506-d862-c72941d57c29.png)

###メールアドレスが使えない場合に代替する方法
メールアドレスで認証する場合は、下記のアドレスにのみメールが送信される
・admin@ドメイン名
・administrator@ドメイン名
・hostmaster@ドメイン名
・webmaster@ドメイン名
・postmaster@ドメイン名

この場合、利用できないユーザも多いと思われる。
その場合は、サポートケースを開くことで、<font color=red>**DNS TXTレコードによる認証が利用可能**</font>

###証明書の代替入手方法
メールが利用できない場合は、サポートケースを開くことで任意のメールアドレスに送信してもらう事ができる。
QiitaのMarkdownパーサー変更にともなう、強調と打ち消しについてのいろいろな書き方と注意点

## 記事投稿シリーズについて

QiitaでGitHub Flavored Markdown (以下GFM) に準拠したMarkdownパーサーが[ベータ版として公開されました！](https://blog.qiita.com/replace-markdown-parser-beta/)

[Qiitaアカウントによる説明記事](https://qiita.com/Qiita/items/e87ebe3138f62b0e8b58)にも書いてあるのですが、今までと記法が変わっている箇所があるので注意が必要です。
せっかく書いた記事の表示が崩れてしまうのは困るので、可能な限り防ぎたいと考えています！

そこで、記事を書く時に注意すべき記法などについて、Qiita運営から5日間に分けて10記事のシリーズで投稿することになりました！
少しでも皆様が執筆する際の助けになればと思います。

詳しくはQiitaアカウントによる説明記事に、投稿シリーズの説明や、他の記事一覧が載っていますのでぜひ他の記事も読んでみてください！

https://qiita.com/Qiita/items/e87ebe3138f62b0e8b58

## 強調

### 基本の書き方

`*` か、`_` を扱います

#### 斜体で表示する

文字を斜体にして強調するときの基本形は以下の形になります。

```
*Hello*, world!

または

_Hello_, world!
```

結果は下記のように表示されます。

*Hello*, world!

*Hello*, world!

#### 太字で表示する

文字を太字にして強く強調するときの基本形は以下の形になります。

```
**Hello**, world!

または

__Hello__, world!
```

結果は下記のように表示されます。

**Hello**, world!

**Hello**, world!

### :pencil: Tips

#### 斜体と太字を併用する

斜体と太字は併用して利用することが可能です。

```
**He*ll*o**, world!
```

**He*ll*o**, world!

特に強くここは強調したい!などの場合に使えそうですね。

#### 利用する上での注意

- `*` などで囲んだ時に、空白から始まる、終了する場合、そちらは強調で表示されません

**Hello**, world!

**Hello**, world!

- 単語の間を強調する際、`_` では正しく表示されません。

H_ell_o, World!

- 単語の間を一部強調する場合、`*` を利用する必要があります。

H*ell*o, World!

- 日本語を強調する際の注意

```
平文**ここが(強調)**平文平文**強調**平文
```

こちらは下記のように出力されます。区切りがうまく判別されず、パースされた結果が意図しない表記になってしまい、表示の崩れなどが起きやすそうです。

平文**ここが(強調)**平文平文**強調**平文

強調する文章の両端にスペースなどを入れる、などで解決ができそうです。

```
平文 **ここが(強調)** 平文平文 **強調** 平文
```

平文 **ここが(強調)** 平文平文 **強調** 平文

## 打ち消し

### 基本の書き方

文字を打ち消しするときは、2つのチルダ(`~`) で文字を囲みます。
基本形は以下の形になります。

```
~~Hello~~, world!
```

結果は下記のように表示されます。

~~Hello~~, world!

また、連続する複数の行に打ち消し線を適用したい場合は、下記のような記述が可能です。

```
~~Hello,
world!~~
```

~~Hello,
world!~~

### :pencil: Tips

#### 他の記法との併用

打ち消し線は他の記法と併せて利用することができます。

#### ~~見出し~~にも打ち消しが使えます。

**~~強調~~**との合わせ技

> ~~引用~~記法

:::note
今回のパーサーの変更により、**ノート記法内で一部のMarkdown記法が使える**ようになります！
~~打ち消し~~もこの通りです。
:::

## 最後に

今回はMarkdownパーサー変更にともなう、強調と打ち消しについてのいろいろな書き方と注意点でした。

他の記法についてもまた別の記事でまとめていますので、合わせて読んでみてください！
詳しくは[Qiitaアカウントによる説明記事](https://qiita.com/Qiita/items/e87ebe3138f62b0e8b58)をご覧ください！

---

- 記事投稿シリーズまとめ :qiitan:

https://qiita.com/Qiita/items/e87ebe3138f62b0e8b58

- 前の記事

https://qiita.com/kato-hiroaki/items/b8bcc1e3eb28facf7467

- 次の記事 :

https://qiita.com/phigasui/items/010f4c79ff47bbaaebdd
Laravel バリデーション パスワードでは半角英数字記号・・・

Lravel に限った事ではないのですが、パスワードの入力チェックで
1. 必須
2. 8文字以上
3. 半角英数字記号を1文字以上含むこと
4. 確認入力のものと一致すること
なんてものがあります（4はもう古いチェックかもしれませんが）。

以下で解決します。

```
'rules' = [
'password'                  => 'required|confirmed|between:8,128|regex:/\A(?=.*?[a-z])(?=.*?\d)(?=.*?[!-\/:-@[-`{-~])[!-~]+\z/i',
];

'attr' = [
'password'                  => 'ログインパスワード',
];

'msg' = [
'password.regex'            => ':attributeは半角英数字記号それぞれ一文字以上使用してください',
そのほかメッセージ
]
```

間違ってましたらご指摘お願いします。
【Jetpack Compose】SwipeRefresh のプログレス表示を制御する際の注意点

Jetpack Compose にて`SwipeRefreshLayout`を実現したい場合、Accompanist の`SwipeRefresh`を使用するのが一般的です。

[Guide - Accompanist](https://google.github.io/accompanist/swiperefresh/)

以下は上記サイトに掲載されている例です。

```kotlin
val viewModel: MyViewModel = viewModel()
val isRefreshing by viewModel.isRefreshing.collectAsState()

SwipeRefresh(
    state = rememberSwipeRefreshState(isRefreshing),
    onRefresh = { viewModel.refresh() },
) {
    LazyColumn {
        items(30) { index ->
            // TODO: list items
        }
    }
}
```

基本的にはこの例の通りに使えば問題ないですが、`SwipeRefreshLayout`と 1 点異なる点がありました。

それは、「**Pull-to-Refresh 時、プログレス表示を明示的に行わなければすぐに表示が消えてしまう**」ことです。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93963/b0fa4bf7-0802-8429-70f3-3ee4a77d4810.gif" width="400" />

# Pull-to-Refresh時、プログレス表示を明示的に行わなければすぐに表示が消えてしまう

`SwipeRefresh`を定義する際、以下のように定義します。

```kotlin
SwipeRefresh(
    state = rememberSwipeRefreshState(isRefreshing),
    onRefresh = { viewModel.refresh() },
) {
    ...
}
```

これにより、`isRefreshing`が`true`の場合はプログレスが表示され、`false`の場合はプログレスが表示されなくなります。

`SwipeRefresh`で Pull-to-Refresh 時、`isRefreshing`は自動的に`true`になりません。

そのため、`viewModel.refresh()`の中などで`isRefreshing`を`true`にしないとすぐに表示が消えてしまいます。

`SwipeRefreshLayout`で Pull-to-Refresh を行った際はすぐに表示が消えず、何もしなければプログレスが表示されっぱなしになるため、盲点でした。

[更新リクエストに応答する  |  Android デベロッパー  |  Android Developers](https://developer.android.com/training/swipe/respond-refresh-request?hl=ja#RespondRefresh)

# まとめ

Jetpack Compose にて`SwipeRefreshLayout`を実現したい場合、Accompanist の`SwipeRefresh`を使用するのが一般的です。

その際の注意点として、プログレス非表示はもちろん、プログレス表示の制御を明示的に行うようにしてください。
Rのdplyrやggplot2で列の名前を変数で指定する方法（specify dynamic column name by variable in dplyr and ggplot2）

# dplyrで列名を変数で与える
Rのdplyrでデータを加工する際、```summarise,filter,mutate```などの関数の中で、
加工の対象となる列名を変数で与えたいときがあります。
例えば以下のように加工する列を変数で指定して、```summarise```で合計を計算する場合は、

```R
df <- data.table(col_a = c(1,2,3),col_b=c(4,5,6))
# 加工する列の名前を変数で指定
column_name = "col_a"
# 【エラーになります】column_nameで指定した列を合計する
df %>% summarise(col_sum = sum(column_name))
```

と書きたくなりますが、これはエラーになります。データに"column_name"という列はありません！という。

エラーにならないためには、```!!as.name( )``` か、 ```!!sym( )``` のどちらかを使って、

```R
df <- data.table(col_a = c(1,2,3,1,2,3),col_b=c(4,5,6,4,5,6))
column_name = "col_a"
df %>% summarise(col_sum = sum(!!as.name(column_name)))
df %>% summarise(col_sum = sum(!!sym(column_name)))
```

と書きます。
この方法であれば、dplyrの関数の中で文字列の結合で列名を作ったりもできます。

```R
df <- data.table(col_a = c(1,2,3,1,2,3),col_b=c(4,5,6,4,5,6))
column_name_1 = "a"
df %>% summarise(col_sum = sum(!!as.name(paste0("col_",column_name_1))))
```

# 例外：mutateで新しい列名を変数で与える
mutateで新しく作りたい列の名前を変数で与える場合は、下記のように書く
```R
fuga = "aaaa"
iris %>% mutate(!!fuga := 100) %>% head
iris %>% mutate("{fuga}" := 100) %>% head
```

# ggplot2で列名を変数で与える
グラフを```ggplot2```で描く際も同様に、```!!as.name( )``` か、 ```!!sym( )```で列名を変数で指定できます。

```R
df <- data.table(col_a = c(1,2,3,1,2,3),col_b=c(4,5,6,4,5,6))
column_name = "col_a"
column_name_1 = "b"
# これと
ggplot(df) + geom_point(aes(x=col_a,y=col_b))
# これは同じグラフになります
ggplot(df) + geom_point(aes(x=!!as.name(column_name),y=!!as.name(paste0("col_",column_name_1))))
```

なお、```select,inner_join```などの一部の関数では変数に格納した列名をそのまま使えます。
そのあたりがややこしいですね。

```R
df <- data.table(col_a = c(1,2,3,1,2,3),col_b=c(4,5,6,4,5,6))
#エラーにならない
column_name = "col_a"
select(df,column_name)
inner_join(df,df,by=column_name)
#エラーにならない
column_name_1 = "b"
select(df,paste0("col_",column_name_1))
inner_join(df,df,by=paste0("col_",column_name_1))
```
# おわり
おわりです。
QiitaのMarkdownパーサー変更にともなう、リストについての注意点

## 記事投稿シリーズについて

QiitaでGitHub Flavored Markdown (以下GFM) に準拠したMarkdownパーサーが[ベータ版として公開されました！](https://blog.qiita.com/replace-markdown-parser-beta/)

[Qiitaアカウントによる説明記事](https://qiita.com/Qiita/items/e87ebe3138f62b0e8b58)にも書いてあるのですが、今までと記法が変わっている箇所があるので注意が必要です。
せっかく書いた記事の表示が崩れてしまうのは困るので、可能な限り防ぎたいと考えています！

そこで、記事を書く時に注意すべき記法などについて、Qiita運営から5日間に分けて10記事のシリーズで投稿することになりました！
少しでも皆様が執筆する際の助けになればと思います。

詳しくはQiitaアカウントによる説明記事に、投稿シリーズの説明や、他の記事一覧が載っていますのでぜひ他の記事も読んでみてください！

https://qiita.com/Qiita/items/e87ebe3138f62b0e8b58

この記事では[GFMの記法](https://github.github.com/gfm/)のうち、「リスト」について説明します。

## 基本の書き方

リストには複数の型があり状況に合わせて使い分けることができます。

### Disc型

```
- foo
- bar
- baz
```

見え方は以下のようになります。
- foo
- bar
- baz

`-` 以外にも `*`, `+` が使えます。

### Decimal型

```
1. foo
1. bar
1. baz
```

見え方は以下のようになります。
1. foo
1. bar
1. baz

数字から始まれば問題ないため、後から項目を追加・移動できるように全て`1`から始めることもできます。

### Checkbox型

```
- [ ] タスク1
- [x] タスク2
```

見え方は以下のようになります。
- [ ] タスク1
- [x] タスク2


基本的な書き方は変わっていませんが、書き方によってはリストが崩れてしまう箇所もあるので、変更点を見ていきます。

## 変更点

### :white_check_mark: リストのアイテム内に任意のブロックを含めることができるようになる

リストのアイテム内での改行が反映されることや、引用などのブロックも反映することができます。

```
- foo
  bar
  > baz
```

- foo
  bar
  > baz

### :white_check_mark: リストの上に改行がない場合でもリストとして解釈されるようになる

```
この行の下に改行がなくてもOK
1. foo
2. bar
```

この下に改行がなくてもOK
1. foo
2. bar

### :warning: ネストする時には段落と同じ数のスペースが必要

以下の場合は`foo`と同じ位置になるよう2つのスペースがないとネストされません。

```
- foo
 - bar
```

- foo
 - bar


同様に、以下の場合は`foo`と同じ位置になるよう3つのスペースがないとネストされません。

```
1. foo
  1. bar
```

1. foo
  1. bar

`tab`キーで4つのスペースを空けれるので活用しましょう。

### :warning: 区切り文字を変更すると新しいリストが開始されます

このような書き方はしないと思いますが、区切り文字は統一しておきましょう。

```
- foo
+ bar
1. baz
- ban
```

- foo
+ bar
1. baz
* ban

### :warning: Disc型の中でDecimal型の記述をするとDecimal型も展開される

展開されないように`.`の後ろのスペースを無くすか、Decimal型のみで利用しましょう。

```
- 1. foo
- 2. bar
```

- 1. foo
- 2. bar

## 最後に

今回はQiitaのMarkdownパーサー変更に伴う、リストについての注意点を説明しました。

他の記法についてもまた別の記事でまとめていますので、合わせて読んでみてください！
詳しくは[Qiitaアカウントによる説明記事](https://qiita.com/Qiita/items/e87ebe3138f62b0e8b58)をご覧ください！

---

↓記事投稿シリーズまとめ

https://qiita.com/Qiita/items/e87ebe3138f62b0e8b58

↓次の記事

https://qiita.com/fussy113/items/b40f60f6803aa2d5cfbc