OmniAICreator/Qiita-1.07M huggingface dataset:
WinSCPで特定ユーザーでもroot権限でファイル閲覧編集を可能にする方法

運用のセキュリティ上、SSHのrootログイン禁止としましたが
いざという時に、WinSCPでも、root権限が必要なシステムファイルや
ログファイル等の閲覧編集を行いたくなり、特定ユーザーのみ、
root権限でファイルの閲覧編集を可能にする事にしました。

##■設定内容


sudo権限で、sftp-serverコマンドを実行できる様にします。

####・CentOS7 の場合

~~~
sudo /usr/libexec/openssh/sftp-server
~~~


####・Ubunts20.04 の場合
~~~
sudo /usr/lib/sftp-server
~~~

 　のコマンドを、WinSCPから特定のユーザーで実行できるようにします。

https://winscp.net/eng/docs/faq_su

----

####①sudoの設定

~~~
$ sudo visudo　　## 以下の内容を追記します。

対象ユーザー名 ALL=NOPASSWD: /usr/lib/sftp-server  ## Ubunts20.04

対象ユーザー名 ALL=NOPASSWD: /usr/libexec/openssh/sftp-server  ## CentOS7
~~~

----

####②WinSCP の高度なサイトの設定

　環境 - SFTP - プロトコルオプションのSFTPサーバーにコマンドを入力します。
![2021-05-13_17h34_41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166558/885d0453-bb56-5809-3802-b6aade23826c.png)

######参考にさせていただいたページ
https://winscp.net/eng/docs/faq_su
https://www.monoreview.com/archives/398
【SAP】SAPUI5 Fioriで処理中にインジケータアイコンを表示する

# はじめに
SAPUI5 Fioriにて、インジケータアイコンの実装を行う機会があり、その際に調査した内容と実装方法について、備忘録として記載します。

本記事で扱うインジケータは、「**Busy Indicator**」です。
![GlobalBusyIndicator.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1255237/ca89a797-9585-9464-4937-4651025fb1e4.png)

実装環境
　・Neo環境
　・SAPUI5（1.87.0）

# 目次
[1. Busy Indicatorの種類](https://qiita.com/drafts/ae4d33743cd99f0f7087/edit#1-busy-indicator%E3%81%AE%E7%A8%AE%E9%A1%9E)
[2. 実装方法](https://qiita.com/drafts/ae4d33743cd99f0f7087/edit#2-%E5%AE%9F%E8%A3%85%E6%96%B9%E6%B3%95)
[参考](https://qiita.com/drafts/ae4d33743cd99f0f7087/edit#%E5%8F%82%E8%80%83)

# 1. Busy Indicatorの種類
Busy Indicatorの種類には、「Global Busy Indicator」と「Control Busy Indicator」があります。

### ・Global Busy Indicator
インジケータアイコン表示時に、画面全体を操作不可状態とする方法です。
画面上のボタンやテーブルの全ての要素について操作が不可となります。
保存処理実行時など、画面遷移や保存ボタンの連続クリック対策に適しています。
![GlobalBusyIndicator.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1255237/ca89a797-9585-9464-4937-4651025fb1e4.png)

### ・Control Busy Indicator
インジケータアイコン表示時に、特定の要素を操作不可状態とする方法です。
画面上のボタンやテーブルの指定箇所について操作が不可となります。
テーブルデータ取得時など、処理を行なっている箇所を示すことに適しています。
![ControlBusyIndicator.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1255237/19b48450-c81b-e82d-b657-0faddbe8c5ae.png)


# 2. 実装方法
[1. Busy Indicatorの種類](https://qiita.com/drafts/ae4d33743cd99f0f7087/edit#1-busy-indicator%E3%81%AE%E7%A8%AE%E9%A1%9E) にて記載した「Global Busy Indicator」と「Control Busy Indicator」について、それぞれの実装方法を紹介します。

### ・Global Busy Indicator
インジケータを表示する。

```javascript:GlobalBusyIndicator.controller.js
onSaveBtn: function(oEvent) {
  sap.ui.core.BusyIndicator.show(); // インジケータを表示
  // 保存処理など
}
```

インジケータを非表示にする。
保存処理完了後などに非表示としたい場合は、エラー発生時にも非表示とする必要がある。

```javascript:GlobalBusyIndicator.controller.js
saveCallAjax: function (saveData) {
  new common()._setCSRFToken();
  jQuery.ajax({
    url: "/****.xsjs",
    method: "POST",
    async: false,
    data: saveData,
    success: function (response) {
      // 保存完了時の処理
      sap.ui.core.BusyIndicator.hide(); // インジケータを非表示
    },
    error: function (e) {
      // エラー時の処理
      sap.ui.core.BusyIndicator.hide(); // インジケータを非表示
    }
  });
}
```

### ・Control Busy Indicator
インジケータを表示する。

```javascript:ControlBusyIndicator.controller.js
onSearchBtn: function(oEvent) {
  var _this = this;
  _this.getView().byId("TableId").setBusy(true); // インジケータを表示
  // データ取得処理など
}
```

インジケータを非表示にする。

```javascript:ControlBusyIndicator.controller.js
getTableData: function () {
  var _this = this;
  oModel.read(
    "/vTableData", {
      "success": function (oData, oResponse) {	
        // データ取得時の処理		 						 
        _this.getView().setModel(new JSONModel(oData), "tableData");
        _this.getView().byId("TableId").setBusy(false); // インジケータを非表示
      }
    }
  );
}
```

# 参考
[sap.ui.core.BusyIndicator - Samples - Demo Kit - SAPUI5 SDK](https://sapui5.hana.ondemand.com/#/entity/sap.ui.core.BusyIndicator)
[sap.ui.core.Control - Samples - Demo Kit - SAPUI5 SDK](https://sapui5.hana.ondemand.com/#/entity/sap.ui.core.Control)
Laravel 8.40にEloquentリリーションwithOnly関数到着

## 概念

モデルを取得するときに、常にいくつかのリレーションをロードしたい場合は、モデルの`$with`プロパティで定義出来ますが、[このPR](https://github.com/laravel/framework/pull/37144)でデフォルトのEagerロードをオーバーライドして、`$with`プロパティ内のすべてのアイテムを取得せず、`withOnly`で定義されているリレーションのみ取得することができるようになりました。

## セットアップ

ジュースの管理システムを例にして、ジュース、ジュースのメーカー（作っている会社）と種類（トマト、アップルなどなど）のモデルでそれぞれの適切な情報を管理する。その上この例のサービスの仕組みではジュースのモデルのデータを取得するとき、ほぼ全ての場合においてメーカーの情報も必要となります。（たとえばメーカーの名前を表示することなど）。そのためジュースのモデルの`$with`で定義することになって、デフォルトでloadすることにします。

このようなジュースのモデルは下記のようになります。


```php

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

/**
 *ジュースモデル
 * 
*/
class Juice extends Model
{
    /**
     * 常にデフォルトとしていつも取得するリレーション定義
     *
     * @var array
     */
    protected $with = ['maker'];

    /**
     * このJUICEを作っている会社
     */
    public function maker()
    {
        return $this->belongsTo(Maker::class);
    }

    /**
     * JUICEの種類
     */
    public function type()
    {
        return $this->belongsTo(Type::class);
    }
}
```

デフォルトで`maker`がていぎされていますので、取得する時メーカーの情報が自動的にジュースモデルと一緒に取得されます

```php
$juice = App\Models\Juice::first();

// メーカーのリレーションも取得される

App\Models\Juice {
     id: 1,
     name: 'めっちゃおいしいジュース',
     maker_id: 1,
     type_id: 1,
    ...
     maker: App\Models\Maker {
       id: 1,
       name: 'いい会社なまえ',
       ....
     },
   }
```

## withOnlyの使い方

`type`を引数として`withOnly`の関数にわたして、メーカー（デフォルトでロードされるリレーション）の情報が取得されなくなります。

```php
$juice = App\Models\Juice::withOnly('type')->first();

// メーカーのリレーション取得しない
// 種類のリレーションがロードされる

App\Models\Juice {
     id: 1,
     name: 'めっちゃおいしいジュース',
     maker_id: 1,
     type_id: 1,
    ...
     type: App\Models\Type {
       id: 1,
       type_name: 'オレンジ',
       ....
     },
   }
```

複数のリレーションを取得したいときには`withOnly`にリレーションの名前の配列を渡すことができます（デフォルトのEagerロードで定義されているリレーションでも可能）。空の配列の場合、すべてのリレーションが取得しないようになります。

```php

$juice = App\Models\Juice::withOnly(['type', 'maker'])->first();

// メーカーと種類のリレーションどっちも取得

App\Models\Juice {
     id: 1,
     name: 'めっちゃおいしいジュース',
     maker_id: 1,
     type_id: 1,
    ...
     type: App\Models\Type {
       id: 1,
       type_name: 'オレンジ',
       ....
     },
    maker: App\Models\Maker {
       id: 1,
       name: 'いい会社なまえ',
       ....
     },
   }
```

### まとめ

`$with`プロパティ内のリレーションを除外でき、`withOnly`の関数の引数にわたされているリレーションのみ取得することが簡単にできます。

### 参照

https://github.com/laravel/framework/pull/37144
https://laravel.com/docs/8.x/eloquent-relationships#eager-loading-by-default
vue routerを使ったプロジェクトをgithub pagesで公開するためのbuild方法は誰も教えてくれない

作成し終わってbuildはできたはいいけど、そのまま公開したら真っ白なページが表示される。
相対パス指定でbuildしてもローカルでは表示されるのに、github pagesで真っ白になる。
そんなお悩みを抱えたあなたに送る忘備録。
#環境
Vue Cli 3
vue-router 4
すでに公開用のリポジトリは作成している

#step 1 vue.config.jsを作成

プロジェクトフォルダに`vue.config.js`を作成。

```javascript:vue.config.js

module.exports = {
  publicPath: '/', //Default
  outputDir: 'dist' //Default
}
```

#step 2 publicPathとoutputDirを変更

publicPathは`/リポジトリ名`に、outputDirは`docs`に変更する。

```javascript:vue.config.js

module.exports = {
  publicPath: '/sample-name', //リポジトリ名
  outputDir: 'docs' //docs
}
```

#step 3 buildする

変更が済んだらyarn or npmでbuildする。
buildが済めばプロジェクトフォルダ配下に`docs`のディレクトリが作成される。
これでgithub pages用のdeployファイルが完成。

#step 4 docsのディレクトリをmasterにpushして公開

pushの形はお好きに。
`docs`のディレクトリを外に持ち出して別のgitでpushするもよし。プロジェクトの中でpushするもよし。
pushができたら、github pages側で設定して公開をする。
公開方法は[この記事](https://qiita.com/shimajiri/items/6b536f6ea4d68e920600)が簡単でわかりやすかった。

約3時間格闘して公開されたページはこちら
[https://nekogakuruga.github.io/vue-samplesite/](https://nekogakuruga.github.io/vue-samplesite/)
centos8: /bin/ld: -lc が見つかりません

centos8 で chkrootkit を make したら以下のエラー

[root@msrv chkrootkit-0.53]# make sense
cc -DHAVE_LASTLOG_H -o chklastlog chklastlog.c
cc -DHAVE_LASTLOG_H -o chkwtmp chkwtmp.c
cc -DHAVE_LASTLOG_H   -D_FILE_OFFSET_BITS=64 -o ifpromisc ifpromisc.c
cc  -o chkproc chkproc.c
cc  -o chkdirs chkdirs.c
cc  -o check_wtmpx check_wtmpx.c
cc -static  -o strings-static strings.c
/bin/ld: -lc が見つかりません
collect2: エラー: ld はステータス 1 で終了しました
make: *** [Makefile:72: strings-static] エラー 1


静的ライブラリーがないのでインストールしたが見つからず。

centos 8.2 では以下でインストールできたが
 dnf --enablerepo=PowerTools install glibc-static
 
centos 8.3 ではリポジトリが変わり以下でインストールします。
 dnf --enablerepo=powertools install glibc-static
while true do の使い方


whileの使い方

ex1.条件によって繰り返し処理を行う場合

```ruby
while 条件式 do
  処理するアクション
end
```

ex2.プログラムを終了させず同じ処理を繰り返すループ処理を行う場合

```ruby
while true do
  処理するアクション
end
```


問題.1
以下の仕様を満たすアプリケーションを作成してください。
仕様
プログラムの実行を行うと、
①「[0]:体重を表示する、[1]:終了する」という選択肢が表示され、数字を入力することができる
② 0を入力すると「80kg」と表示され、上記条件①が繰り返し実行される。
③ 1を入力するとアプリケーションが終了する

```ruby
while true do
  puts "[0]:体重を表示する"
  puts "[1]:終了する"
  input = gets.to_i
  if input == 0
    puts "80kg"
  elsif input == 1
    exit
  end
end

```
【GitHub】GitHubをTortoiseGitで使いたい

現職で初めてGitHubを使うことになり、
慣れたGUIで操作したいのでTortoiseGitを入れてみました。
今回はクローンの仕方まで書いていきます。

#１．前提
[GitHub](https://github.co.jp/)のアカウントがあり、リポジトリにアクセスできること。

#２．Gitのダウンロード
[Git](https://gitforwindows.org/)をダウンロードします。
Setupはすべてデフォルトで問題ありません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461666/f8e81b50-0846-8e82-85a9-759a3957fed0.png)


#３．TortoiseGitのダウンロード
[TortoiseGit](https://tortoisegit.org/download/)をダウンロードします。
Setupはすべてデフォルトで問題ありません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461666/f910816d-a25a-f1b5-1eb3-79a9579dcb4e.png)

日本語パッケージもダウンロードして実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461666/cb4f6183-12f9-b0cf-d2e8-9277f8c357e7.png)

ここまで完了したら、エクスプローラー上で右クリックし、
TortoiseGitのSettingで言語設定を日本語にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461666/c43bba16-7265-ae99-5efa-24ed82d1a86c.png)
↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461666/9d17de8c-8d50-f8c9-1a3f-e14290ca75a9.png)


#４．TortoiseGitでクローンする
まずGitHubにログインし、クローンしたいリポジトリのページを開きます。
Codeボタンで表示されるダイアログからURLをコピーします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461666/26360691-8fe4-6769-313d-fc6616d235a3.png)

エクスプローラーを開き、ローカルリポジトリを作成したいフォルダ下で右クリックし、
Gitクローン(複製)…を選択します。
コピーしたURLを張り付けてOKを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461666/a3d57034-4c45-e5b9-3361-88b9cbba251e.png)

GitHubとGitの連携があれば設定します。（GitHubへのログインが要求されます。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461666/6ee3e8d3-6bbf-22a7-9171-83caebc73f20.png)

問題なければクローンが成功します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461666/45935fd7-83d8-556b-e833-76b9a485ad2a.png)

以上で、完了です。お疲れ様でした！

#参考
[「Tortoise Git」のクローン（チェックアウト）でGithubプロジェクトの作業フォルダを作成する方法](http://peloproject.com/%E3%83%84%E3%83%BC%E3%83%AB/%E3%80%8Ctortoise-git%E3%80%8D%E3%81%AE%E3%82%AF%E3%83%AD%E3%83%BC%E3%83%B3%EF%BC%88%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF%E3%82%A2%E3%82%A6%E3%83%88%EF%BC%89%E3%81%A7github%E3%83%97%E3%83%AD%E3%82%B8/)
【rails】衝撃！form_with では、value が要らない。 

# 初期値の設定にvalue を書かなくて良い！

rails の form_withにて、value を書かなくて良いことをさっき知ったので、記録を残しておこうと思います。

# 記述例

```
  <%= form_with(model: @user, local: true) do |form| %>
    <h2 class="text-center mt-5">ユーザ情報修正</h2>

    <table width="60%" style="margin: auto;">
      <tr height="40">
        <td align="center">氏名</td>
        <td>
          <%= form.label :last_name, "姓" %>
          <%= form.text_field :last_name %>
          <%= form.label :first_name, "名" %>
          <%= form.text_field :first_name %>
        </td>
      </tr>
　 <% end %>
```

これで画面表示すると、初期値が表示されました。

form_with 内の、`model: @user`属性。
ここで、@user に中身が入っていると、form_value は空気を読んで、初期値を入れ込んでくれます。

便利！

情報更新画面とか作るときに、もうvalue を設定する必要ありません。
swiftでAPIを実装

#APIを実装するには以下の手順を行います

変数urlにURLデータを入れる　→ そこからデータを取得する　→ そのデータをJSON解析して欲しいデータを返す

具体的にコードで見て行きましょう。
以下はBitcoinのデータを受け取り1Bitcoinが何円、何ドル、、、なのかを返す関数です。
ここでは具体的なapiの取得は割愛します。

#具体的なコード

```swift

func getCoinPrice(for currency: String){
        let urlString = "\(baseURL)/\(currency)?apikey=\(apiKey)"
        
        if let url = URL(string: urlString){
            let session = URLSession(configuration: .default)
            let task = session.dataTask(with: url){ (data, response, error) in
                if error != nil{
                    print(error!)
                    return
                }
                
                if let safeData = data{
                    
                    if let bitcoinPrice = self.parseJSON(safeData){
                        
                        let priceString = String(format: "%.2f", bitcoinPrice)
                        self.delegate?.didUpdatePrice(price: priceString, currency: currency)
                    }
                }
            }
            task.resume()
        }
```

上のコードはurlに取得したURLを入れ、URLSession関数を使用しデータ処理群をまとめ、dataTaskを用いてURLを使用したtask変数を作ります。その時クロージャーを用いてデータを取得する処理を書いています。データが存在するかどうかで場合分けをしており、存在していた場合parseJSON関数に入れJSONデータを解析します。以下がparseJSON関数です。
<br>

```swift
 func parseJSON(_ data: Data) -> Double? {
        let decoder = JSONDecoder()
        do{
            let decodedData = try decoder.decode(CoinData.self, from: data)
            let lastPrice = decodedData.rate
            return lastPrice
            
        } catch {
            delegate?.didFailWithError(error: error)
            return nil
        }
    }
```
data型のdataを受け取りJSONDecoderを使用することで解析しています。尚、「let decodedData = try decoder.decode(CoinData.self, from: data)」のように解析する際の第一引数として構造体を別ファイルで作っておりそこに当てはめています。
MacOSX Big Sur で PyOpenGL が使えなくなった時の解決策

## 現象
macOS Catalina までは問題なく動いていた PyOpenGLがimport できなくなった。

```
from OpenGL.GL import *
from OpenGL.GLUT import *
```

以下のようなエラーが出る

```
  File "/Users/******/lib/python2.7/site-packages/OpenGL/platform/darwin.py", line 41, in GL
    raise ImportError("Unable to load OpenGL library", *err.args)
ImportError: ('Unable to load OpenGL library', 'dlopen(OpenGL, 10): image not found', 'OpenGL', None)
```

## 理由

Big Sur 以降、OpenGL が deprecated されているため。

## 解決策

エラーが出ているファイルの近くにある
****/lib/python2.7/site-packages/OpenGL/platform/ctypesloader.py

を修正する。


```
        fullName = util.find_library( name )
```

↓

```
        fullName = "/System/Library/Frameworks/{}.framework/{}".format(name,name)
```

いつかは使えなくなるのかな...残して欲しい。
Kotlin学習記②

<!-- タイトル：Kotlin学習記② -->
# はじめに
### 今回はKotlinのデータ型についてJavaとの比較を交えながらまとめたいと思います。
<br>

# 記事投稿の経緯
### Kotlinのデータ型はIntなどが存在するが、Javaにはint,Integerの2パターンが存在する。(プリミティブ型と参照型)
### そこで、Kotlinのデータ型がJavaのデータ型とどのように対応しているのかについて疑問を持ち、調査することにした。
<br>

# 実装
### IntelliJ IDEAを用いてKotlinコードからJavaコードにDecompileして確認してみる。
### Tools > Kotlin > Show Kotlin Bytecode > 「Decompile」ボタンクリック
<br>

```Kotlin
import kotlin.jvm.JvmStatic

class KotlinDecompile {
    fun foo(): Int { return 1 }

    fun foo2(): Double { return 1.0 }

    fun foo3(): Boolean { return true }

    fun foo4(): Char { return 'a' }

    fun foo5(): Int? { return 1 }

    fun foo6(): Double? { return 1.0 }

    fun foo7(): Boolean? { return true }

    fun foo8(): Char? { return 'a' }

    fun foo9(): Array<String> { return arrayOf("a") }

    fun foo10(): List<String> { return listOf("a") }

    fun foo11(): String { return "a" }

    companion object {
        @JvmStatic
        fun main(args: Array<String>) {
        }
    }
}
```

```Java
import java.util.List;
import kotlin.Metadata;
import kotlin.collections.CollectionsKt;
import kotlin.jvm.JvmStatic;
import kotlin.jvm.internal.DefaultConstructorMarker;
import kotlin.jvm.internal.Intrinsics;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

public final class KotlinDecompile {
   @NotNull
   public static final KotlinDecompile.Companion Companion = new KotlinDecompile.Companion((DefaultConstructorMarker)null);

   public final int foo() {
      return 1;
   }

   public final double foo2() {
      return 1.0D;
   }

   public final boolean foo3() {
      return true;
   }

   public final char foo4() {
      return 'a';
   }

   @Nullable
   public final Integer foo5() {
      return 1;
   }

   @Nullable
   public final Double foo6() {
      return 1.0D;
   }

   @Nullable
   public final Boolean foo7() {
      return true;
   }

   @Nullable
   public final Character foo8() {
      return 'a';
   }

   @NotNull
   public final String[] foo9() {
      return new String[]{"a"};
   }

   @NotNull
   public final List foo10() {
      return CollectionsKt.listOf(new String[]{"a"});
   }

   @NotNull
   public final String foo11() {
      return "a";
   }

   @JvmStatic
   public static final void main(@NotNull String[] args) {
      Companion.main(args);
   }
}
```
### ※今回はデータ型の比較のみを行いたいため、一部コードを省略しています。
<br>

# まとめ
### 以下のような関係性になると考えられる。
| Kotlin   | Java      |
| ----     | ----      |
| Int      | int       |
| Double   | double    |
| Boolean  | boolean   |
| Char     | char      |
| Int?     | Integer   |
| Double?  | Double    |
| Boolean? | Boolean   |
| Char?    | Character |
| Array    | []        |
| List     | List      |
<br>

### 参考記事
https://dogwood008.github.io/kotlin-web-site-ja/docs/reference/basic-types.html

https://bsblog.casareal.co.jp/archives/3174
Varnish6.4.x にGeoIP2ベースのアクセス制限を掛ける

日本国内向けのWebサイトの場合、しばしば日本国外からのアクセスが迷惑になるケースがあります。
もちろん、GoogleBotやBingBotのような有益なクローラーはきちんとサイトにアクセスしてもらわなければいけないわけですが、サイトによっては特定の国や地域、あるいは妙なUserAgentによるアクセスが頻発することがあります。
ファイアウオール等でIPから国を割り出して遮断できるサービスが利用できる場合は、もちろんそちらを使うほうが簡単かつ無難ではありますが、そういった機能・サービスが利用できないケースの場合に、アプリケーションサーバーの前に設置していたVarnishで対処してみました。
というわけで自分用の作業メモです。

# 用意するもの

とりあえず必要なものを整理しておきます。

- Ubuntu 18.04 LTS(20.04LTSでも基本同じ）
- Varnish6.4.x （6.0/6.5/6.6でも良いらしい）が動く環境。 [packagecloud](https://packagecloud.io/varnishcache/varnish64/)からインストール前提
- [libvmod-geoip2](https://github.com/fgsch/libvmod-geoip2)
- [Maxmind](https://www.maxmind.com/)のアカウント
- geoipupdate

# 事前準備

当然のことながら、Varnishが動いていないとだめです。VCLの書き方などは省略します。他の記事を適当に調べてセットアップしましょう。
[Maxmind](https://www.maxmind.com/) のサイトでアカウントを作成し、ライセンスキーを発行しておきます。
ライセンスキーをなくさないようにDLしておくとよいでしょう。

#インストール手順
## libvmod-geoip2のソースを入手

[Githubリポジトリ](https://github.com/fgsch/libvmod-geoip2) からソースを入手します。
アーカイブで取ってきてもいいですし、リポジトリをクローンしてきても可です。お好みで。

## libvmod-geoip2をビルドする

Installationに書いてある手順に沿ってビルドを行えば基本はOKです。
ただし、[packagecloud](https://packagecloud.io/varnishcache/varnish64/)からVarnishをインストールしている場合は、

```shell
sudo apt install varnish-dev libmaxminddb-dev
```
をしておかないと、autogen.shやconfigureがコケます。
make && make installできたら次に進みます。

## geoipupdateのインストール

Ubuntuなので、

```shell
add-apt-repository ppa:maxmind/ppa
apt update
apt install geoipupdate
```

でリポジトリの追加と、geoipupdateのインストールを行います。

## GeoIP.confの作成

geoipupdateのインストールができたら、適当なディレクトリにGeoIP.confを作成します。
サンプルは、[Github](https://github.com/maxmind/geoipupdate/blob/main/conf/GeoIP.conf.default) にあるので、これをベースに

- AccountID
- LicenseKey

を設定します。どちらも事前準備で取得したMaxmindのライセンスキーで得られます。

## geoipupdateの実行

```shell
geoipupdate -d GeoIPのDBを保存したいパス -f /path/to/GeoIP.conf
```

を実行し、GeoIPのデータベースが作成されることを確認します。
この処理は毎週やることを推奨されているので、あとでCronに登録しておくと良いでしょう。

#Varnishの設定調整

仕上げにVarnishのVCLを調整します。
libvmod-geoip2のインストール手順にもあるように、VCLに以下の内容を追記します。

```shell
import geoip2;

sub vcl_init {
	new country = geoip2.geoip2("/path/to/GeoLite2-Country.mmdb");
}

sub vcl_recv {
	if (country.lookup("country/names/en", client.ip) != "Japan") {
		追加で書きたいVCLの処理を色々
                return (synth(403, "Forbidden"));
	}
}
```

あとはVarnishにVCLを読ませます。落ちても良い環境の場合はVarnishの再起動でも良いですが、キャッシュをたくさん抱えている場合は、

```bash
sudo varnishadm -T localhost:6082 -S /etc/varnish/secret vcl.load 適当なVCL名 /etc/varnish/default.vcl
sudo varnishadm -T localhost:6082 -S /etc/varnish/secret vcl.use 適当なVCL名
```
でVCLの差し替えができます。
もちろん、テスト用の環境でVCLの内容が正しいことをテストしてから行いましょう。

あとはアクセスログを見て、日本国外のアクセスが遮断されていることが確認できればOKです。
より細かい条件式はVarnishの公式ドキュメントなどを読んで、調整すればよいでしょう。
統計検定準1級　2019年6月　問1

## 問題

・[統計検定準1級 2019年6月](https://www.toukei-kentei.jp/wp-content/uploads/201906grade1semi.pdf)

## (1)

ポアソン分布において、期待値と分散は以下のようになる。

$E[X] = \lambda_1 = 3$
$V[X] = \lambda_1 = 3$

$E[Y] = \lambda_2 = 2$
$V[Y] = \lambda_2 = 2$

$E[X+Y] = E[X] + E[Y]= 3 + 2 = 5$

確率変数 $X$, $Y$ は独立であるので

$Cov[X, Y] = 0$

よって

$V[X+Y] = V[X] + V[Y] + 2Cov[X, Y] = 3 + 2 + 0 = 5$

と求まる。

## (2)

以下に対する、条件付き確率 $P(A|B) = \frac{P(A\cap B)}{P(B)}$ を求める。

$A$：$X + Y = 4$ となる
$B$ : $X$ は $x$ 回、$Y$ は $y$ 回起こる

よって

$A \cap B$：$X$ は $x$ 回、$Y$ は $4-x$ 回起こる

となる。

ポアソン分布の公式は、以下の通りである。

$P_p(x) = e^{-\lambda}\frac{\lambda ^{x}}{x!}$

また、ポアソン分布の再生性より、以下が成り立つ。

$P(B) = P_p(X + Y) = e^{-(\lambda_1 + \lambda_2)}\frac{(\lambda_1 + \lambda_2)^{(X+Y)}}{(X+Y)!} = e^{-(3 + 2)}\frac{(3 + 2)^{(4)}}{(4)!} = e^{-5}\frac{5^4}{4!}$

そして

$P(A \cap B) = e^{-\lambda_1}\frac{\lambda_1 ^{X}}{X!} \cdot e^{-\lambda_2}\frac{\lambda_2 ^{Y}}{Y!} = e^{-\lambda_1}\frac{\lambda_1 ^{x}}{x!} \cdot e^{-\lambda_2}\frac{\lambda_2 ^{(4-x)}}{(4-x)!} = e^{-3}\frac{3 ^{x}}{x!} \cdot e^{-2}\frac{2 ^{(4-x)}}{(4-x)!}$

上記より

$P(A|B) = \frac{P(A\cap B)}{P(B)} = \frac{e^{-3}\frac{3 ^{x}}{x!} \cdot e^{-2}\frac{2 ^{(4-x)}}{(4-x)!}}{e^{-5}\frac{5^4}{4!}} = \frac{4!}{x!(4-x)!} \cdot \frac{3^x \cdot 2^{(4-x)}}{5^4}$
$= {}_4 C_x \cdot \frac{3^x}{5^4} \cdot \frac{2^{(4-x)}}{5^4} = {}_4 C_x \cdot \frac{3^x}{5^x} \cdot \frac{2^{(4-x)}}{5^{(4-x)}} = {}_4 C_x \cdot {(\frac{3}{5})}^x \cdot {(\frac{2}{5})}^{(4-x)} = {}_4 C_x  (0.6)^x (0.4)^{(4-x)}$

このとき、確率変数 $X$ は $B(4, 0.6)$ に従うので

$E[X] = np = 4 \cdot 0.6 = 2.4$

よって

平均が $2.4$ の二項分布に従う。
PostgreSQLでリストアの時間がかかるときに見るべきところ

PostgreSQLでリストアかけようとしたのですが、妙に時間がかかってました。
`fsync`をoffにすると早くなると記事を見たので試してみました。[（参考）](http://ubuntuexpert.blogspot.com/2010/02/postgresql-fsyncoff.html)


# fsyncとは

[公式ドキュメント](https://www.postgresql.jp/document/9.1/html/runtime-config-wal.html)によると、fsyncはこんな効果があるみたいです。
以下は[公式ドキュメント](https://www.postgresql.jp/document/9.1/html/runtime-config-wal.html)の引用です。

> このパラメータがオンの場合、PostgreSQLサーバはfsync()システム・コールを発行したり、もしくはこれに相当する方法で（wal_sync_methodを参照）更新が物理的にディスクに書き込まれたかの確証を得ようと試みます。 これは、オペレーティングシステムもしくはハードウェアがクラッシュした後、確実にデータベースクラスタを一貫した状態に復旧させることを保証します。
>fsyncを停止することはしばしば性能上の利益になるとは言っても、予期せぬシステム停止やクラッシュの際に回復不可能なデータ破壊になることがあります。 従って外部データから全てのデータベースを簡単に再構築できる場合のみfsyncを停止してください。 

つまり性能が遅くなるものの、データベースの復旧ができるようになるようです。
リストアの場合はクラッシュした場合も復旧が容易であるので、fsyncは切っておいてもかまわなさそうです。

# fsyncを切る
というわけでfsyncを一旦切ってからリストアするようにしました。
postgresql.confファイルを探して'fsync=off'と書き換えて保存。
そこまでやったらいつも通りリストアします。２時間かかっても終わらなかったリストアが３０分程度で終わるようになりました。
リストア終わったら'fsync=on'に戻して作業終了です。

設定ファイル切り替える手間を考えても一旦切ってからリストアしたほうが圧倒的に早いですね。
C++で文字列を左から順番に読み込む方法

C++で文字列を左から順番に読み込む方法をブログに書きます



```C++
#include <bits/stdc++.h>
using namespace std;
 
int main() {
  string S;
  cin >> S;
 
  // 計算結果を保持する変数
  int sum = 1;
 
  for (int i = 0; i < S.size(); i++) {
 
    if (S.at(i) == '+') {
      sum++;
    }
    if (S.at(i) == '-') {
      sum--;
    }
 
  }
 
  cout << sum << endl;
  return 0;
}
```

S.siza()・・・文字列の長さ
S.at(i)・・・左から何番目の文字を切り取る処理
このプログラムは1+1+1-1-1-1+1+1-1のような1を足したり引いたりするプログラムです。
【PHP】【個人開発】SNSぽいサービス

PHPでSNSに近いサービスを開発しました。
投稿、フォロー、メッセージ等の基本的な機能を実装しています。

![play.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597913/ade58098-b653-f8d1-1b9f-e7d25561f4a4.gif)

##URL

https://karirin3948.herokuapp.com/user_login/user_top.php?type=main&page_id=current_user


##使用技術
・フロントエンド
 - HTML
 - CSS
 - Javascript
・バックエンド
 - PHP
 - FWなし
・インフラ/開発環境
 - heroku
 - Mysql
 - VScode
 - Git/GitHub

##実装機能
###メッセージ機能
ユーザー同士のやり取りはもちろん、新規メッセージがあるときはログイン時にフラッシュメッセージで通知するようになっています。

![message.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597913/a10721d7-22e1-24e4-d53f-d3cd98df286e.gif)

https://qiita.com/ryouya3948/items/3d471b24b9ff62c3ad0d

https://qiita.com/ryouya3948/items/13b9ee9fd7d436355d40

###モーダルウィンドウ
投稿、コメント等を送信する際に出力され、UIを高めるため実装しました。

![anime3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597913/d52f4a4e-4429-f180-ed51-5b06b63fb8fb.gif)

https://qiita.com/ryouya3948/items/bd1bccef883148f1b281

###ページネーション
投稿、ユーザー一覧画面にて複数のページで分割できるよう実装しました。

![pagenation02-min.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597913/349eadd6-81b1-69a9-487d-0e288220559a.gif)

https://qiita.com/ryouya3948/items/33f09f34616bb930a642

###メディアクエリ
ウィンドウサイズに合わせて、レイアウトが崩れないようメディアクエリを実装しました。

![media_screen_4(100) (1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597913/1e048c71-1850-5754-cf36-c7ae4a231908.gif)

https://qiita.com/ryouya3948/items/dabdd9e16d38ff39122c

###その他機能
その他、さまざまな機能が実装されています。

・いいね

https://qiita.com/ryouya3948/items/7b3899e8d2cc8c80dcc6

・フォロー

https://qiita.com/ryouya3948/items/b4091980432cc138d718

・コメント

https://qiita.com/ryouya3948/items/6928c89607cf4eaa72a0

・投稿
・検索
・ユーザー新規登録
・ユーザーログイン
・テストログイン
・一覧表示（ユーザー/投稿）
・詳細表示（ユーザー/投稿）
・更新（ユーザー/投稿）
・削除（ユーザー/投稿/コメント/メッセージリスト）

###終わりに
実務でPHPを使用しているため、学習も兼ねてFWなしで個人開発しました。
生のPHPで開発することで、内部の処理まで確認することができたのでとても勉強になりました。
これからもいくつか個人開発を続けたいと思います。
【TypeScript】TypeScript の オーバーロード


#関数オーバーロード ( Function Overloads )とは
* 引数や戻り値が異なる、同じ名前の関数を宣言できます
    * つまり、関数の引数と、その引数を受け取った時の関数の戻り値を指定できます
* 指定したいシグネチャの関数の宣言をして、最後に全てのシグネチャを受け取る関数を定義します

```ts
// 関数オーバーロード
function 関数名(シグネチャ1)
function 関数名(シグネチャ2)
function 関数名(シグネチャ3)
function 関数名(全シグネチャに対応できるシグネチャ) {
   //全シグネチャを受け取る関数
}
```

```ts
// 関数オーバーロード無しの場合
type Combinable = string | number;
type Numeric = number | boolean;
type Universal = Combinable & Numeric;

function add(a: Combinable, b: Combinable) {
  if (typeof a === 'string' || typeof b === 'string') {
    return a.toString() + b.toString();
  }
  return a + b;
}

// resultはCombinable型で、数値か文字列か不明
//Stringの処理を実行できない
const result = add( 'Hi',  'There' ) ;
//result.split(' '); //NG

//型キャストでstrngにすることはできる
const result = add( 'Hi',  'There' ) as string;
```

##関数オーバーロードの使い方
* add関数を両方numberで呼べば、numberで返すように指定できます
    * 下に定義されている関数にマージされ、指定した呼び出し方法で呼べるようになります

```ts
// 関数オーバーロード
function add(a: number, b: number): number;  //2引数両方numberならnumber
function add(a: string, b: string): string;  //2引数両方stringなら戻り値string
function add(a: string, b: number): string;
function add(a: number, b: string): string;

function add(a: Combinable, b: Combinable) {
  if (typeof a === 'string' || typeof b === 'string') {
    return a.toString() + b.toString();
  }
  return a + b;
}

const result = add('Hello', ' TypeScript');
result.split(' '); //stringであると認識されているんので、errにならない！

```
【TypeScript】TypeScript の インデックス型

#TypeScript の インデックス型

* インデックス型は、オブジェクトのプロパティを柔軟に作成できます
* `[ 名前 : 型 ] : プロパティ値の型;`
    * 名前は、インデックス型の名前で、型のみ指定することができます
    * プロパティ値の型は、型のみ指定することができ、具体的な名前、個数は指定しません

##例：様々なフォームに、エラーメッセージを出せるようにしたい
* 以下のように、1個1個のプロパティを定義するのは大変です…

```ts
interface ErrorContainer {
   { email: '正しいメールアドレスではありません', 
     username: 'ユーザ名に記号を含めることはできません' 
   }
}
```

#インデックス型の使い方
* プロパティの正確な名前、個数は指定したくないとき、 インデックス型を使います
    * `[prop: string]: string;` //プロパティにstringを格納
* 名前がわかっているプロパティがある場合、名前を指定して同時に定義することもできる
    * `id :  string;` //idのプロパティが存在すると分かっているプロパティがある場合

```ts
interface ErrorContainer {
  [prop: string]: string;
}

//stringと認識できるプロパティは自由に追加可能
const errorBag: ErrorContainer = {
  email: '正しいメールアドレスではありません',
  //email: 1,  // NG
  1: 'エラー' , // OK 文字列と解釈されるため
  username: 'ユーザ名に記号を含めることはできません', //自由に追加可能
};
```
【Css】background-clipを試してみた

# 初めに
Cssだけで背景が透けてみえるお洒落な文字が出来る方法を探したら、background-clipというcssのプロパティがあったのでそれについて学習した内容を記事にします。

※内容に間違いなどがある場合はご指摘をよろしくお願いします。

#background-clipとは
cssのプロパティ。背景画像の表示領域を指定する際に使います。

#早速使ってみる
まずはテスト用の背景画像を用意しました。
![text.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/966135/404c2b16-2ee2-0a5d-edc3-5961d1287935.jpeg)
指定できる値が４種類あったのでhtmlで原本の画像が入るものを含め合計5つの箱を用意します。

```html
<!DOCTYPE html>
<html lang="ja">

<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <meta http-equiv="X-UA-Compatible" content="ie=edge" />
  <link rel="stylesheet" href="style.css" />
  <title>background-clip</title>
</head>

<body>

  <div class="none"></div>
  <div class="border-box"></div>
  <div class="padding-box"></div>
  <div class="content-box"></div>
  <div class="text">
    <h1>TestTestTest</h1>
  </div>

</body>

</html>
```

①border-box
ボーダボックスまでbackgound画像の表示領域を広げます。

```css
/* ①border-box */
.border-box {
  width: 150px;
  height: 150px;
  margin: 100px 10px;
  padding: 10px;
  border: 10px dashed #0000ff;
  background-size: cover;
  background-image: url("test.jpg");
  background-clip: border-box;
}
```

②padding-box
パディングボックスまでbackgound画像の表示領域を広げます。

```css
/* ②padding-box */
.padding-box {
  width: 150px;
  height: 150px;
  margin: 100px 10px;
  padding: 10px;
  border: 10px dashed #0000ff;
  background-size: cover;
  background-image: url("test.jpg");
  background-clip: padding-box;
}
```

③content-box
コンテントボックスまでbackgound画像の表示領域を広げます。

```css
/* ③content-box */
.content-box {
  width: 150px;
  height: 150px;
  margin: 100px 10px;
  padding: 10px;
  border: 10px dashed #0000ff;
  background-size: cover;
  background-image: url("test.jpg");
  background-clip: content-box;
}
```

④text
文字列の領域までbackgound画像の表示領域を広げます。

```css
/* ④text-box */
.text {
  width: 150px;
  height: 150px;
  margin: 100px 10px;
  border: solid 30px;
  background-size: cover;
  background-image: url("test.jpg");
  background-clip: text;
  -webkit-background-clip: text;
  color: transparent;
}
```
文字列の場合、親要素にstyleを適用します。また、文字の色はtransparentにして透明にし、まだ全てのブラウザーで使えるわけではないので、-webkit-background-clip: text;と書く必要があります。

#結果
background-clipを適用しない場合、デフォルトはborder-boxになるみたいです。（一番左側の画像）
![スクリーンショット 2021-05-14 7.54.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/966135/0cb2dbcd-a7c6-433e-9d67-2c5cdd0fbb26.png)
文字列もが透けて背景が見えるのでお洒落です。（一番右側の画像）

#参考サイト
https://developer.mozilla.org/ja/docs/Web/CSS/background-clip
https://qiita.com/NoxGit/items/20b39e0051ce94720421
import thisコマンドでPythonの禅(The Zen of Python)

pythonのインタラクティブシェル上で、"import this"コマンドを実行すると、
"The Zen of Python"（Pythonの禅）というPythonプログラムを書く上での19の指導原則が表示される事を知りました。

こんな感じです。

```
 $ python
Python 3.9.0 (default, Jan  9 2021, 22:05:52) 
[Clang 12.0.0 (clang-1200.0.32.28)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!
```

この和訳は、[こちらのページ](https://qiita.com/IshitaTakeshi/items/e4145921c8dbf7ba57ef)が参考になります。
Dexieで部分一致で検索する方法

Dexieで部分一致で検索する方法。

```javascript
// 記述例
async function search_todo(word) {
  // Dexieの標準検索には前方一致しかないため、filterを使用して絞り込みをかける。
  const todos = await db.table.filter(function (todo) {
    // javascriptの部分一致検索方法で判定してやる。 
    return todo.title.indexOf(word) > -1;
  }).toArray();
  return await todos;
}
```

参照元:
https://github.com/dfahlander/Dexie.js/issues/146

以上
M5StackでつくるCPUメーター（LovyanGFXで高速描画）

M5StackのLCDの操作を調べていく過程でCPUメーターを作りました
arduinoもCで作るのも初めてでしたが、画面描画ライブラリLovyanGFXのおかげであっさり作れました。

---
#動作イメージ

https://twitter.com/panda728/status/1392242683423326208?s=20

---
#内部動作
LovyanGFXが高速で高機能だったのでサンプルで動作確認していたところ期待した動作のものがありましたのでこちらをベースに作成

ベースはLovyanGFXのRadgialGaugeサンプルです。

https://github.com/lovyan03/LovyanGFX/blob/master/examples/Sprite/RadgialGauge/RadgialGauge.ino

最初はMeterSampleをベースに作ろうとしてましたが、メーターが4つだとスプライト4枚に増やすなど手間がかかりすぎでした。

RadgialGaugeならスプライトも１つで幅3ドットだけなので、コード全体が見通しよく実装できました。

---
#経緯

@nori-dev-akgさんの記事で、CPUメーターがかっこよかったのですが
USB直結デバイスの電子工作の敷居が高そうだったので、手持ちのM5Stackでまずは試してみようというのがきっかけで作り始めました

https://qiita.com/nori-dev-akg/items/b313599665977f305ed8

M5Stackが画面が大きいので、数字だけでなくゲージも表示できそうなので追加しました

---
#コード

M5Stackプログラム　ソースコード

https://github.com/panda728/M5CpuGauge

PC用プログラム（Windows）

https://github.com/panda728/M5CpuMetrics

---
#プログラム補足説明
PCで収集したパフォーマンスカウンターのデータを
M5StackにUSBのシリアル通信でデータを送って表示します。
(ArduinoIDEと一緒にインストールされるUSBドライバが必要)

データ形式は以下

「001002003K004;」

| DATA| TITLE | RANGE |
|:-----------|:------------|:------------:|
| 001 | cpu usage | 0-100 |
| 002 | memory usage | 0-100 |
|003|network total bytes|0-999|
|K | bytes unit | K,M,G |
|004 | hdd usage(%) | 0-100|

PC用プログラムは.NET Framework4.8 C#です。
起動時引数でCOMボート番号とレートを指定します。

※パフォーマンスカウンターが.net6待ちなのでWindows専用です。
SMTPサーバについて

# メールの知識

予備知識として下記が必要だが、調べれば文献はたくさんあるため、割愛しながらまとめています。



## SMTPサーバ

みなさんが書いたメールを相手に届ける仕事をするサーバです。

SMTPサーバにメールを渡し、そのサーバが相手にメールを配達する。

また、メールサーバから別のメールサーバに対してもメールを送信することもできます。

**プロトコル上は両方とも全く一緒です。 というのも、SMTPでデータを受け取る方のサーバは相手がメールクライアントかメールサーバかはあまり関係ないからです**


## メール転送エージェント(MTA)

SMTPサーバの中にいるメール仕分け用のプログラムです。

メール[送信](https://wa3.i-3-i.info/word1916.html)の話でよく出てくる用語には

**[メールユーザエージェント（MUA）](https://wa3.i-3-i.info/word11122.html)：[メールソフト](https://wa3.i-3-i.info/word1951.html)**

**メール転送エージェント（MTA）：メール仕分け用のプログラム**

**[メール配信エージェント（MDA）](https://wa3.i-3-i.info/word11121.html)：メール配信用のプログラム**

の3つが、あります。

なので、パソコン上でメールユーザエージェント（MUA）を使って作られたメールはSMTPサーバに送られます。

SMTPサーバに送られたメールは、メール転送エージェント（MTA）の手によって仕分けられ、メール配信エージェント（MDA）の手によって相手先に送られます。

# 代表的SMTPサーバ

- meildev
- MockSMTP
- FakeSMTP(Java環境で起動)
- MailCatcher(Ruby製)
- MailDev(Node.js製)
- Mailhog

電子メールでは**下記3つの技術**が確立されていることでメール送信ができるようになる。

- メールを送信する技術
- メールを配送する技術
- メールを受信する技術

## その他の技術について

### POP

POP（Post Office Protocol）は、メール受信に用いるプロトコルです。

メールソフト上でPOPを設定した場合は、メールサーバーに届いたメールをメールソフトがパソコンにダウンロードするようになります。
また、メールソフト側の設定にもよりますが、メールソフトがメールをダウンロードした後はメールサーバーのデータは削除されます。

**POPのメリット**は、メールサーバーにデータを残さない設定なので**、メールサーバーの容量削減**になることです。
また、メールデータは端末に残りますので、過去に受信した**メールはインターネットに接続していない状態でも閲覧**できます。

**デメリット**は、POPは受信した端末にデータが保存される形式なので、**複数台でメールを閲覧する場合には向かない**ことです。

### IMAP

IMAP（Internet Message Access Protocol）は、メール受信に用いるプロトコルです。
よくPOPと比較されるプロトコルでもあります。IMAPでは「143」番ポートを使用します。

IMAPを設定した場合、メールサーバーに届いたメールを「インターネット」を介してメールソフトが読みにいきます。
POPでは端末にメールデータを自動的にダウンロードしていましたが、IMAPでは端末にデータは残しません。

スマートフォンとPC両方でメールをチェックしたいなど、**複数端末で同じメールを読めるのはIMAPのメリット**と言えるでしょう。
また、新しいパソコンに買い替えた時なども、**面倒なデータ移行なしでスムーズに切り替え**ができます。

IMAPの**デメリット**としては、メールサーバーにデータが残り続けるため、**サーバー側の容量次第では、すぐにメールボックスが満杯になってしまう**ことです。
もしIMAPの設定を検討する場合には、ご利用のメールサーバーの容量上限を確認されることをおすすめします。

## SMTPによる通信内容

通常は、対話式でメールを送る。

```jsx
220 MailServer ESMTP  
HELO myhostname.hogehoge.or.jp
250 myhostname.hogehoge.or.jp
MAIL FROM: username@hogehoge.or.jp
250 OK 
RCPT TO: abcedf@hogehoge.or.jp
250 OK  
DATA
354 End data with .  
To: abcdef@hogehoge.or.jp
Subject: test
From: username@hogehoge.or.jp

test mail

.
250 OK
QUIT
221 BYE
```
サクラエディタのマクロ Visual Studio unsafe対応 by VinceHeart

サクラエディタのマクロ Visual Studio unsafe対応

addDot.js
// クリップボードのテキストを取得
var ClipboardText = GetClipboard();
// 選択範囲のテキストを取得
var text = Editor.GetSelectedString(0);
// 変換後のテキストを出力
if ( text !== '' ) {
	text = text + ', sizeof( ' + text + ' )';
    Editor.InsText(text);
}

replace.js
// 選択範囲のテキストを取得
var text = Editor.GetSelectedString(0);
// 変換後のテキストを出力
if ( text !== '' ) {
	if ( ( text === 'strtok' ) ||
		 ( text === 'swprint' ) ||
		 ( text === 'wsprint' ) ) {
		text = text + '_s';
	} else {
		text = 'sizeof( ' + text + ' )';
	}
    Editor.InsText(text);
}
SQLでテーブルの定義を更新する

運用中のデータベースで、1レコードを複数のレコードに分割するようなテーブル定義をする必要があったので、備忘録的にメモします。

# やりたいこと
例としてこんなテーブル定義（Score）があったとします。
もとは1レコードに国語と算数の得点が入っていましたが、各科目ごとにレコードを作るように変更する要求がありました。
なので前のデータを保ったまま、新定義（NewScore）に移行することを目的にします。
![人工キー(1)-ページ2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420954/d23468db-e6fc-e185-6773-d018cf4adc34.png)

# 方針
全体的な方針としては、一度別のテーブルを作成＆レコードの移行した後、名前をもとのテーブル名に付け替えます。
以下の順に行います。

1. 新定義のテーブルを作成
2. 旧テーブルのレコードを新テーブルに移行
3. 旧定義のテーブルを削除
4. 新定義のテーブル名を変更

2.のレコードの移行ですが、INSERTは別のテーブルのデータを挿入することもできるので、それで行います。[（参考）](https://www.dbonline.jp/mysql/insert/index6.html)

以下サンプルです。
旧定義のテーブルの作成などは省略。

~~~ SQL
-- 新定義のテーブルを作成  ここのテーブル名はあとで付け替えるので適当でもOK
CREATE TABLE NewScore(
    StudentId int,
    Subject varchar(20),
    Score smallint,
    primary key(joiny, id));

-- 旧テーブルのレコードを新テーブルに移行
-- まずは国語のデータ移行
INSERT INTO NewScore(
    StudentId,
    'Japanese',
    JapaneseScore)
SELECT StudentId, JapaneseScore FROM Score;

-- 次は算数のデータ移行
INSERT INTO NewScore(
    StudentId,
    'Mathmatic',
    MathmaticScore)
SELECT StudentId, MathmaticScore FROM Score;

-- 旧定義のテーブル削除
DROP TABLE Score;

-- 新定義のテーブル名をもともとのテーブル名に付け替え
ALTER TABLE NewScore RENAME TO Score;
~~~

これでテーブル定義を更新し、レコードを新定義に合わせて登録できます。
C言語でも call/cc したい

# はじめに
ド深夜に目が覚めて、ストゼロ飲みながら書きました。
GNU 拡張の statement expression を使っているので、gcc でコンパイルしてください。
たぶん30分くらいでバーって書いたので、バグがあったら教えてください (気が向いたら直します)

# このヘッダを include すれば call/cc できます。
書きました。
（最初は __ret を volatile にするのを忘れていて、コメントでバグの指摘を頂いて修正しました）

```c:callCC.h
#ifndef CALLCC_H
#define CALLCC_H
#include <setjmp.h>

typedef struct {
    jmp_buf *buf;
    volatile void *p_ret;
} continuation;

/* Evaluate given expression with current continuation          */
/* __cont : name of current continuation                        */
/* __typ  : type of callCC expression                           */
/* __expr : expression to evaluate with current continuation    */
#define callCC(__cont, __typ, __expr) ({    \
        volatile __typ __ret;               \
        jmp_buf __buf;                      \
                                            \
        continuation __cont;                \
        __cont.p_ret = &__ret;              \
        __cont.buf = &__buf;                \
        if(setjmp(__buf) == 0){             \
            __ret = __expr;                 \
        }                                   \
        __ret;                              \
    })

/* Ignore current continuation and use given continuation   */
/* __cont  : continuation                                   */
/* __typ   : type of associated call/cc                     */
/* __dummy : just a dummy to deceive type checker           */
/*           that never get evaluated                       */
/* __val   : value passed to given continuation             */
#define useCont(__cont, __typ, __dummy, __val) ({   \
        *((volatile __typ *) __cont.p_ret) = (__val);        \
        longjmp(*(__cont.buf), 1);                  \
        __dummy;                                    \
    })
#endif /* CALLCC_H */

```

# テスト

```c:main.c
#include <stdio.h>
#include "callCC.h"
#define dummy 0

int func(continuation cont, int x){
    int a;
    a = 5 + useCont(cont, int, dummy,
            x + 25
        );
    return 100000;
}

int main(int argc,char **argv){
    int a;
    /* test1 */
    a = 5 + callCC(cont, int,
                10*10
            );
    printf("%d\n", a);

    /* test2 */
    a = 5 + callCC(cont, int,
                10 * 10 * useCont(cont, int, dummy, 20)
            );
    printf("%d\n", a);

    /* test3 */
    a = 5 + callCC(cont0, int,
            3 + callCC(cont1, int,
                10 + useCont(cont0, int, dummy, 7 + 9)
            )
        );
    printf("%d\n", a);

    /* test4 */
    printf("%d\n", 7 + callCC(cont, int, 100 + func(cont, 10)));
}
```

```:実行、
$ gcc main.c
$ ./a.out
105
25
21
42
```

# おわりに
いいんじゃないっすかね

# 追記
scheme とかの call/cc で取り出した継続って、大域変数にバインドして、call/ccの外側からも呼び出せるんですね。

知らんかった、そこまで出来とらんかった。
ぴえん。
冪乗（Exponentiation）

**冪乗（exponentiation）** は数学演算の一種です。

```math
b^n
```
として表記され、

- **b** = `底（base）` 
- **n** = `指数（exponent）`

を意味し、`b の n 乗` と呼ばれます。

```c++:例
#include <math.h>
#include <stdio.h>

int main(void) {
  double b, n, r;

  b = 2.0;
  n = 3.0;
  p = pow(b, n);

  printf("%lf to the power of %lf is %lf\n", b, n, p);
}
```
```bash:出力
2.000000 to the power of 3.000000 is 8.000000
```
ER図をGit管理する方法

## はじめに
PhpStormはPHPのコードを書くためのIDEですが、プラグインを入れることでUMLも書くことができます。
UMLを書けるということは言い換えるとER図を書くことができ、同時にファイルをGitでバージョン管理することもできます。
普段使い慣れているエディタでER図を書くことができるので作業効率はぐんとアップすること間違いなしです！
※PhpStorm以外にもVisualCodeなどでも類似のことが可能ですが内容は省略いたします

## インストール
PhpStormでUMLをグラフィカルに表示するためには[【graphviz】](https://www.graphviz.org/)というツールが事前に必要です。
サイトからダウンロード、インストールしておきましょう。

## PhpStormのプラグインのインストール
![Untitled.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1490767/8ce6fc08-fb3d-f814-ea9c-763b7d766c99.png)
プラグインの検索枠にumlと入力し、一覧に表示された上記プラグインをインストールします。
※プラグインの反映にはPhpStormの再起動が必要です

## PlantUMLの機能について
PlantUMLをインストールするとPhpStormでファイルを新規作成（Ctrl+N）する際の選択一覧に「PlantUML」が追加されるようになります。
これを選択するとUMLを記述するためのファイルを新規作成することができます。
また、ウィンドウ右端にPlantUMLタブが追加され、編集結果をリアルタイムで確認することができるようになります。

## 使用例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1490767/baf38f66-c526-5271-ab5f-261e4ad12c7a.png)

## ER図のサンプル
```jsx
@startuml

'区分罫線を非表示
hide empty members

'マークと背景色の定義
!define master_data_db #E2EFDA-C6E0B4
!define user_db #FCE4D6-F8CBAD
!define MASTER_DATA AAFFAA
!define User FFAA00

'設定色を定義
skinparam class {
    BorderColor Black
    ArrowColor Black
}

package "ユーザー管理" as user {
    entity "accounts [アカウント]" as accounts <<U, User>> user_db {
        + id : bigInteger [ID]
        # user_id  :  bigInteger  [ユーザID]
    }

    entity "users [ユーザー]" as users <<U, User>> user_db {
        + id : bigInteger [ID]
        name : string [名前]
    }

    entity "prefectures [都道府県]" as prefectures <<M, MASTER_DATA>> master_data_db {
        + id : integer [ID]
        name : string [県名]
    }
}

'関係図を定義
users        ||-up-||     accounts

'テーブルメモ
note right of prefectures : メモです
@enduml
```

## 参考
- [ER図の文法と機能](https://plantuml.com/ja/ie-diagram)
LaravelでPHP Fatal error: Allowed memory size of 1610612736 bytes exhausted...エラー

Laravelでデバックバーをインストールしようとしたらエラー出ました。
原因は別件でphpのバージョンを変えたのでその影響でした。
忘れないように忘備録。。

***

```console:コンソール
composer require barryvdh/laravel-debugbar
```

(*ﾟ▽ﾟ)ﾉ ﾀｰﾝ
いつものようにデバックバーをインストールだっ


```console:コンソール
PHP Fatal error:  Allowed memory size of 1610612736 bytes exhausted ...
```


(；´Д｀)
あれなんか急にエラー出た。。。

***


調べたらComposerのメモリ不足エラーみたいでした。。
php.iniの設定変更で治るみたいなので場所を調べたら

```console:コンソール
$ php --ini | grep "php.ini"
```

↓

```console:コンソール
Loaded Configuration File:/usr/local/etc/php/7.4/php.ini
```


( ﾉД`) 
そういや別件でphpのバージョン変えてた・・

```console:php.ini
memory_limit = -1
```
この変更で治りました。

***
参考にしました。

https://qiita.com/miriwo/items/a5fa25c1d36d00f40ec9
https://qiita.com/miriwo/items/acb49b0a97b5d5fa47fd
坂道グループの歌詞を解析して、頻出名詞を抜き出してみた。

# 趣旨
Pythonを勉強してたらmecabに興味を惹かれたので、試してみました。
mecabを利用して乃木坂、欅坂、日向坂(櫻坂は曲数が極端に少ないので除く)の全ての曲の歌詞を解析しました。(内訳：乃木坂 207曲, 欅坂60曲, 日向坂34曲, けやき31曲の計332曲)。
留意すべき点として、これらの楽曲は全て[秋元康先生](https://ja.wikipedia.org/wiki/%E7%A7%8B%E5%85%83%E5%BA%B7)が作詞していることが挙げられます。

## 利用した歌詞
https://j-lyric.net/ に掲載されている歌詞を手動でテキスト化しました。
別のサイトで、APIを利用して歌詞を取得する方法もあるようなのですが、有料APIだったのと、歌詞の表記揺れが気になったので、歌詞を目視で確認しつつ手動でテキスト化しました。
案の定、同じ歌詞サイトにも関わらず歌詞の中に表記揺れが散見されました。
例1：難しい漢字にカッコでルビが振ってある場合と無い場合がある(辿々(だとだと)しい)
例2：サビの部分の繰り返しを「※サビ1をもう一回」的な省略
歌詞の精度を上げることに労力を割きたくなったので、今回は許容しています。

## 結果(乃木坂+欅坂+日向坂+けやき坂 頻出名詞Top20)
1. こと : 651
2. WOW : 354
3. 今 : 302
4. 自分 : 276
5. 愛 : 242
6. 恋 : 240
7. もの : 235
8. 人 : 211
9. 夢 : 196
10. 心 : 179
11. 日 : 173
12. まま : 170
13. Oh : 166
14. 一 : 163
15. 度 : 150
16. 空 : 142
17. 世界 : 137
18. 風 : 136
19. 時 : 136
20 前 : 130

坂道グループはウォウウォウ言ってるイメージだったのですが、どうやらその通りのようです。
他の名詞は、アイドルっぽい名詞が並びました。特に、愛や恋、夢などが目立ちました。
[夢見るシャンソン人形](https://www.youtube.com/watch?v=hs22Smspn9w)ではないですが、恋をすることが出来ないアイドルが恋について歌っているのは、idol(偶像)の運命なのかなと思ったり。。。
※各グループ別の頻出名詞については[僕のブログ](https://arkey22.com/?p=1649)に記載してます。

## コード
```python:lyrics_counter.py
import MeCab
import collections
import sys

def mecab_list(text):
    tagger = MeCab.Tagger("-Owakati")
    tagger.parse('')
    node = tagger.parseToNode(text)
    word_class = []
    while node:
        word = node.surface
        wclass = node.feature.split(',')
        if wclass[0] != u'BOS/EOS' and node.feature.split(',')[0] == u"名詞":
            word_class.append((word))
        node = node.next
    return word_class

# 対象ファイルを開く
file_path = sys.argv
with open(file_path[1], 'r') as ly:
    lyrics_string = ly.read()

# 改行を削除し、全角スペースを半角スペースに変更する
lyrics_string = lyrics_string.replace('\n', '').replace('　',' ')
result = mecab_list(lyrics_string)

# counterで出現数を数え、多い順に出力する。
cnt = collections.Counter(result).most_common()
for k, v in cnt:
    print(f"{k} : {v}")
```

歌詞側のファイルは著作権の都合上、ここには記載しませんが、各グループの歌詞を一つのテキストファイルにまとめたものとなっています。
結構ザルな感じがあるコードのわりには、それっぽい名詞を抜き出せたかなと思います。


## 今後について＆思ったこと
- 秋元康先生は「川の流れのように」(1989)のような名曲も作詞されています。坂道やAKB以外で作詞された曲の歌詞を集めて頻出名詞を抜き出すと、また違った雰囲気になりそうなので試してみたいです。
- 今回対象となった歌詞は、日本語の文章とは少しかけ離れた文法なので、フォークソングのような、語りかけるような曲だと精度が上がるかもしれません。
- コードもまだまだ未熟な部分が多いので、修正していきたいです。
【React-Rails】Railsのコントローラーで深すぎるパラメータの値の取得方法【params】

<h2>axiosから値を取得したい！</h2>

フロントがreactでバックエンドにRailsAPIで、フロントからaxiosのputで値をバックエンド側に値を渡そうとしたとき、paramsのデータ構造がが深くなってしまいました。
これを受け取るのに、苦労したので備忘録的に残しておきます。

```react:axiosで渡す値を設定
export const updateHumanApi = (food) => {
    return axios.put(URL),{
        params:{
            human:human,
            human_name:human.name
        }
    })
    .then((res)=>{
        return res.data
    })
```

<h2>コントローラー側</h2>
axiosで渡された値をlogger.debugで値を確認するとこのようになりました。深すぎる。。。。

```terminal:paramsの値
Parameters: {"params"=>{"human"=>{"id"=>1, "user_id"=>1, "name"=>"名前1", "point"=>500, "description"=>"説明文です。", "image"=>nil, "count"=>0, "station"=>"0駅", "deleted"=>false, "created_at"=>"2021-05-11T13:55:09.604Z", "updated_at"=>"2021-05-11T13:55:09.604Z"}, "human_name"=>"名前_0"}, "id"=>"1", "human"=>{}}
```

名前の値を取得しようとするときの構造を分かりやすく抜き出すと、このようになります。

```terminal:name
Parameters: {"params"=>{"human"=>{"name"=>"名前1"}}
```

上記の値を取得しようとすると、このようになります。

```ruby:RailsController
params[:params][:food][:name]
```

<h2>参考</h2>
Railsガイド
https://railsguides.jp/active_record_basics.html#update
ファイルアップロード時のRailsにおけるmultipart指定について

# この記事について
ユーザーのアバター画像を設定するためにCarrierwaveを使って画像のアップロード機能を実装していたところ、なぜか画像がアップロードされないエラーが発生した。Railsにおけるmultipart指定について理解が曖昧だったのが原因だったこともあり、その時の対応策を備忘録として残しておきます。

# 環境
Rails6 (6.1.3)
Carrierwave(2.2.1)

# エラー内容

画像ファイルを選択した上でsubmitしても画像が登録されなかった。
パラメータを確認したところ以下のようにavatarのパラメータ値がファイル名になっている。

```
Parameters: {"authenticity_token"=>"[FILTERED]",
 "user_profile"=>{
  "name"=>”~~~~~~”, 
  "avatar"=> “avatar-img.jpg"
}, "commit"=>"更新", "id"=>"1"}
```

本来は以下のように`ActionDispatch::Http::UploadedFile`によってファイル名や画像の形式などが 渡されなければならないはず。

```
Parameters: {"authenticity_token"=>"[FILTERED]",
"user_profile"=>{
 "name"=>”~~~~~~”, 
 "avatar"=>#<ActionDispatch::Http::UploadedFile:0x00007f66d8e0cae0 
 @tempfile=# <Tempfile:/tmp/RackMultipart20210420-9-18sadv85o.jpg>,
 @original_filename=“avatar-img.jpg",
 @content_type="image/jpeg",
 @headers="Content-Disposition: form-data; name=\"user_profile[avatar]\"; filename=\"avatar-img.jpg\"\r\nContent-Type: image/jpeg\r\n">
},
"commit"=>"更新", "id"=>"1"}
```

設定ファイル関連で何かエラーがあるのかと,`carrierwave.rb`や`uploader.rb`などを確認したが問題はなさそう。
ファイル名がそのまま渡されていたのをヒントにmultipartの指定が怪しいと思い`:multipart => true` をformタグに追加してみると無事にファイルアップロードできた！

```ruby
= form_with model: @user_profile, url: user_profile_path(@user_profile), html: { method: :patch, multipart: true } do |f|
```

# multipartとは
`multipart`は複数の種類のデータを一度に扱える形式で、trueを指定することでフォームで文字列だけでなくcsvファイルや画像データなどを扱うことができる。今回はこの指定がされていなかったのでファイルを読み込んでもファイル名が文字列と認識されてしまい、 画像ファイルをアップロードする事が出来ていなかった。

# :multipart => trueは必ず指定しないといけない？

しかし、Railsで過去にファイルのアップロードを含むフォームを実装した際には`:multipart => true`を指定しなくてもうまく機能していた。

何故なのか不思議だったが、その答えはRailsガイドに記載されていた。

[Action View Form Helpers 6 Uploading Files](https://guides.rubyonrails.org/form_helpers.html#uploading-files)

どうやら `form_with`メソッドでモデルを指定したフォーム内に`file_field`使用すると、自動的に`:multipart => true`が適用されるらしい。

```
<%= form_with model: @person do |f| %>
  <%= f.file_field :picture %>
<% end %>
```

モデルを指定しない場合は`:multipart => true`を指定しないといけない

```
<%= form_with url: "/uploads", multipart: true do |f| %>
  <%= f.file_field :picture %>
<% end %>
```

今回は`form_with`メソッドでモデルを指定したフォームを使用していたが、アップロード画像のプレビュー表示をReactを使って実装していたため、file_fieldを使用していなかった。

```
.field
  = f.label :avatar
  = react_component("UserAvatarPreview")
```

そのため、ファイルアップロードのためには`:multipart => true`を指定しないといけなかったらしい。

# まとめ
-  `form_with`メソッドでモデルを指定したフォーム内に`file_field`使用すると、自動的に`:multipart => true`が適用される
-  モデルを指定していなかったり`file_field`使用していない場合は`:multipart => true`を指定しなければならない