OmniAICreator/Qiita-1.07M huggingface dataset:
C言語でよく定義するマクロまとめ

#この記事について

C言語でよく定義するマクロを記載します。

# 真偽値
C99で_Bool型が定義されましたが、C99が使えない場合や、何らかの理由で真偽値を定義するときは、FALSEを0、TRUEを非0で定義します。

```c
#define FALSE (0)
#define TRUE  (!FALSE)
```

# 固定配列の長さを取得

よく使います。配列長を個別にマクロ化するより柔軟に対応できます。

```c
#define ARRAY_LENGTH(array) (sizeof(array)/sizeof(array[0]))
```

```c:使用例
int a[10];
int i;
for(i=0; i<ARRAY_LENGTH(a); i++){
    a[i] = i;
}
```

# 固定配列の境界アドレス値の取得
```c
#define ARRAY_BEGIN(array) (array)
#define ARRAY_END(array)   (array + ARRAY_LENGTH(array))
```

# 配列インデックスが範囲内であることのチェック

```c
#define IS_VAILD_RANGE(array, i)  ( (ARRAY_BEGIN(array) <= (array) + (i)) && ((array)+(i) < ARRAY_END(array)) )
```

# ポインタが非NULLであることのチェック

非NULLチェックはよく使うのでマクロ化しておくと便利です。

```c
#define IS_NOT_NULL(ptr) ( (ptr) != NULL )
```

# 組み込みAssertマクロのリネーム

組み込みマクロはそのままコールせず、リネームして呼び出すことで、異なるアサーション関数の呼び出しに変更するなど、柔軟に対応できるようになります。

```c
#define ASSERT(cond)   assert( (cond) )
```

# DbC (Design by Contract)用のマクロ

契約プログラミング(DbC:Design by Contract)を実施するためのマクロです。assertを直接コールしても実現できますが、Assertマクロのリネームと同様、事前条件、事後条件、不変条件を別々にマクロ化しておくことで、機能変更や有効/無効などを柔軟に対応できるようになります。

```c
/* 事前条件 */
#define REQUIRE(cond)       ASSERT(cond)

/* 事後条件 */
#define ENSURE(cond)        ASSERT(cond)

/* 不変条件 */
#define INVARIANT(objname)  objname##_invariant(void)
```

```c:使用例
void function(int* array, int len){
    REQUIRE(array != NULL);
    REQUIRE(len > 8);

    // ・・・処理
}
```

# 静的アサート

コンパイル時に静的にチェックしておきたいアサート条件を定義します。アサート条件に引っかかった場合、コンパイルエラーとなります。

```c
#define STATIC_ASSERT(COND) { char static_assertion_failed[(COND)?1:-1]; }
```

```c:使用例
STATIC_ASSERT( sizeof(int) == 4 );
```

失敗すると以下のようなコンパイルエラーがでます。アサート条件に引っかかると「長さが負数の配列を定義しようとする」ことを利用してコンパイルエラーを引き起こしているため、そのようなエラーがでます。

```
XXXX.c:行数: error: 'static_assertion_failed' declared as an array with a negative size
    STATIC_ASSERT(sizeof(int) == 3);
```

注：この定義の場合、「unused variable」の警告が出る場合があるため、それが許容できる場合のみの使用となります。



# 構造体のメンバー変数の先頭からのアドレスオフセットを取得する

マニアックですが、構造体メンバの先頭からのアドレスオフセットを取得します。Linux kernel.hに同様のものが定義されています。

```c
#define offsetof(type, member) ((size_t) &((type*)0)->member)
```

```c:使用例
struct Sample{
    int a;
    float b;
    double c;
};

int main(void){
    printf("%d\n", offsetof(struct Sample, a) );  // 0
    printf("%d\n", offsetof(struct Sample, b) );  // 4
    printf("%d\n", offsetof(struct Sample, c) );  // 8
}
```

# 構造体メンバへのポインタから、そのメンバを含む親元の構造体変数のポインタを取得

```c
#define container_of(ptr, type, member) ((type*)((char*)(ptr) - offsetof(type,member)))
```

```c:使用例
struct Sample s;
float* p = &s.b;
printf( "%p\n", container_of(p, struct Sample, b) ); // &sのアドレス値
```
【Rails】renderメソッドの引数のカッコの有無について

#renderメソッドの引数にはカッコはつける？つけない？

結論から言うと、**どちらでもOK**です。
Rubyにおけるメソッドの呼び出しではカッコを省略することができます。

なので以下の２つはどちらの書き方でも問題ありません。

```ruby:posts_controller.rb
render("posts/new")
```


```ruby:posts_controller.rb
render "posts/new"
```

#####※ただし、複雑なコードを書く場合は、区切りの位置をわかりやすくする為にカッコをつけたほうがいいです。
CSS(Flexbox)だけでフッターを最下部に固定する方法

コンテンツ量が少ない時でもフッターを最下部に固定する方法です。
以下がHTML・CSSの内容です。

```html:index.html
<body>
    <header>
        ヘッダー
    </header>

    <main>
        コンテンツ
    </main>

    <footer>
        フッター
    </footer>
</body>
```
```css:style.css
body {
    display: flex;
    flex-direction: column;
    min-height: 100vh;
}
main {
    flex: 1;
}
```
"min-height: 100vh;"とすることで、bodyの表示領域が確保されます。
そして"flex: 1;"により、bodyタグ内のheaderタグとfooterタグの高さを除いた部分が、mainタグで埋まるようになります。
これだけでフッターを最下部に固定できます。
# 補足 - IE11対策
上記の方法だと、IE11環境でコンテンツ内の画像をレスポンシブ対応した場合、フッターの上部に高さが残り余白が生まれてしまいます。
以下のように、mainタグに"min-height: 1px"を指定すると解消されます。

```css:style.css
main {
    flex: 1;
    min-height: 1px;
}
```
**参考記事**
https://503dg.jp/blog/design/sticky-footer.html
Kepler.gl を使ってジオデータを簡単に可視化する

PostgreSQL のジオデータ、つまり地理情報システムを取り扱うための拡張モジュールである PostGis を扱う機会が多いのですが、その際サクッとデータを地図にマッピングしたいことがあります。

[Kepler.gl](https://kepler.gl/) というオープンソースの地理空間情報分析に使えるツールで、簡単にこれが実現できるので紹介します。

## ステップ
1. CSV でジオデータを出力する
2. CSV を Kepler.gl にアップロードする

以上です！超簡単！

## CSV でジオデータを出力する
ジオデータをテキスト形式で出力するには PostGIS の `ST_AsText` を、そして PostgreSQL のデータを CSV として吐き出すために `psql` の `\COPY` を使います。

以下のテーブルのデータをマッピングしたいとします。

```sql
CREATE TABLE geographical_boundary (
    label TEXT DEFAULT NULL,
    boundary GEOGRAPHY NOT NULL
);
```

CSV にするには以下のコマンドを `psql` 内で実行するだけで良いです。

```sql
\COPY (SELECT label, ST_AsText(boundary) AS boundary FROM geographical_boundary) TO 'output.csv' with csv HEADER
```

これで `output.csv` がカレントディレクトリに生成されます。ヘッダーは必須なので `HEADER` をコマンドにつけておきましょう。

## CSV を Kepler.gl にアップロードする

[Kepler](https://kepler.gl/) にアクセスし、GET STARTED をクリックします。

![Screenshot 2020-07-21 at 15.25.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64733/f2068e72-8ec5-8d42-4974-147c74ff4333.png)

そして CSV ファイルをここにドラッグアンドドロップしてアップロード！

![Screenshot 2020-07-21 at 15.36.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64733/5531a273-3135-2b38-ffaa-e845ca4b2182.png)

終了です！

## データの保存
画像で出力したり、[Mapbox](https://www.mapbox.com/) のアカウントに保存したりすることができるようです。
おそらくデータ分析などをしっかりして、その結果を共有する際には Mapbox に保存する必要があると思います。

## まとめ
CSV で出力して、ドラッグアンドドロップするだけです。
超簡単にマッピングができるので、データの検証などで可視化が必要な際に重宝します。
React Nativeのrun-androidはデバイスIDの有無で実行されるタスクが違う

# はじめに

React Nativeのrun-androidコマンドはPCに接続したAndroid端末すべてにapkをインストールします。
一方で`--deviceId`でデバイスIDを指定すると特定のAndroid端末だけにapkをインストールできます。
ですがデバイスID指定ありとなしでは実行されるGradleタスクに違いがあったので調べた結果をまとめました。

# バージョン

- @react-native-community/cli-platform-android: 4.9.0

# 実行されるタスクの調査方法

`react-native` コマンドの `--verbose` オプションを指定すると実行されるコマンドが分かるのでこれで確認します。

## デバイスIDを指定しない場合

```
$ react-native run-android --verbose
info Running jetifier to migrate libraries to AndroidX. You can disable it using "--no-jetifier" flag.
Jetifier found 1041 file(s) to forward-jetify. Using 8 workers...
info JS server already running.
info Installing the app...
debug Running command "cd android && gradlew.bat app:installDebug -PreactNativeDevServerPort=8081"

```

`app:installDebug`タスクが実行されています。これはアプリをビルドして全Android端末にapkをインストールします。

## デバイスIDを指定する場合

```
$ react-native run-android --verbose --deviceId xxxxx
info Running jetifier to migrate libraries to AndroidX. You can disable it using "--no-jetifier" flag.
Jetifier found 1391 file(s) to forward-jetify. Using 8 workers...
info JS server already running.
info Building the app...
debug Running command "gradlew.bat build -x lint"

```

`build`タスクが実行されています。これはアプリのビルド、テスト、Javadocのビルドなどが実行されます。
更に`--tasks`オプションでタスクを指定しても反映されないのでビルド以外のタスクを除外できません。

## apkビルドだけで特定の端末にインストールしたい

現状はオプションなどで変更できないので以下のどちらかしかなさそうです。

* インストールしたくないAndroid端末の電源を切るかUSBケーブルを抜く
* `node_modules/@react-native-community/cli-platform-android/build/commands/runAndroid/index.js`の`buildApk`内の`"build"`を`"assembleDebug"`に書き換える

以下のPull Requestが取り込まれるとビルドコマンドが統一されて`assembleDebug`タスクに置き換わるので将来的には解消しそうです。

- [refactor: unify APK building and installing process #1055](https://github.com/react-native-community/cli/pull/1055)
TextなどのWidgetに変数が埋め込めない時の対処法【Flutter】

はじめまして、ますみです！

[![自己紹介.png](https://www.umi-mori.jp/wp-content/uploads/2023/02/introduction_banner_2-2048x533.png)](https://bit.ly/banner_intro_masumi_creator_qiita)


以下のようにコードを実行すると、`Evaluation of this constant expression throws an exception.`というエラーが出てきます。
本記事では、このエラーの対処法を紹介します。

```dart:sample.dart
const ListTile(
  title: Padding(
    child: Text(
      widget.title,
      style: TextStyle(
          fontSize: 23.0, fontWeight: FontWeight.bold
      ),
    ),
    padding: EdgeInsets.all(5.0),
  ),
),
```

<img width="500" alt="Text_Bug.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240280/1e94511d-b9d9-7086-e3c0-1ebe739034ae.png">

# 対処法
はじめは、`Text()`のwidgetには変数の埋め込みができないのか？RichTextじゃないとできないのか？などと色々と試しましたが、とても簡単な話でした。理由は、「**親Widgetに`const`が入っていたから**」でした。

```dart:smaple.dart
ListTile(
  title: Padding(
    child: Text(
      widget.title,
      style: TextStyle(
          fontSize: 23.0, fontWeight: FontWeight.bold
      ),
    ),
    padding: EdgeInsets.all(5.0),
  ),
),
```

こんな簡単なバグにかれこれ30分ほど時間を取られてしまいました。
いくら検索しても出てこなかったことは、納得ですね。

# 最後に
最後まで読んでくださり、ありがとうございました！
いかがだったでしょうか？

この記事を通して、少しでもあなたの学びに役立てば幸いです！

:::note info
【仕事の相談はこちら】
お仕事の相談のある方は、下記のフォームよりお気軽にご相談ください。

[問い合わせフォームはこちら](https://forms.gle/G5g1SJ7BBZw7oXYA7)

もしもメールでの問い合わせの方がよろしければ、下記のメールアドレスへご連絡ください。

info*galirage.com（*を@に変えてご送付ください）

🎁 「生成AI活用の無料相談券」もしくは「生成AIの社内ガイドライン（無料PDF）」を『公式LINE』で配布中 🎁
『生成AIを業務に活用したいけど、どうしたらいいかわからない』といった声を多くいただきます。

Galirageでは公式LINEにて、チャットやオンライン会議で「完全個別の生成AI活用無料相談会」を実施しております！
（期間限定で実施しているため、ご興味ある方はお早めに以下のLINE公式アカウントをご登録ください^^）
https://lin.ee/rvz6lMN

※ 予告なく、キャンペーンを終了する可能性がございますが、ご了承ください。

【業務内容】
具体的には、以下のお仕事を中心に受け付けております！（[詳しくはこちら](https://galirage.notion.site/Galirage-AI-c2f3945fafb0433d8d2fd03e56927fd8)）
1. 受託開発（例：生成AIを使った社内システムの開発）
2. コンサルティング（例：技術戦略のアドバイス）
3. 講演（例：社内研修、イベント登壇）

※ 特に「生成AIを使ったシステム開発のご依頼」が多く、ご好評いただいております。

【これまでの相談事例】
以下のようなご相談が多くあります。

🔑 機密情報を漏洩させないための、生成AIのシステム構築をお願いしたい。
🤖 自社データを用いたFAQチャットボットの作り方を知りたい。
💡 ChatGPTを、自分たちの事業にどのように活かせるか、アドバイスやアイデアが欲しい。
:::
# おまけ
エンジニアの仲間（データサイエンティストも含む）を増やしたいため、公式LINEを始めました🎉

「**一緒に仕事をしてくれる方**」「**友だちとして仲良くしてくれる方**」は、友だち追加をしていただけますと嬉しいです！（仲良くなった人たちを集めて、「ボードゲーム会」や「ハッカソン」や「もくもく会」もやりたいなと考えています😆）

とはいえ、みなさんにもメリットがないと申し訳ないので、特典を用意しました！

友だち追加後に、アンケートに回答してくれた方へ「**エンジニア図鑑（職種20選）**」のPDFをお送りします◎

https://lin.ee/hFUN4TL

[![](https://www.umi-mori.jp/wp-content/uploads/2023/10/line_banner_v2.png)](https://lin.ee/hFUN4TL)
Laravel7でFontAwesomeの利用

# LaravelでfontAwesomeを使う

##バージョン

- laravel: 7.20.0
- npm: 6.4.1
- fontawesome-free: 5.14.0


## FontAwesomeの導入
```
$ npm install @fortawesome/fontawesome-free
```

####Font Awesomeのscssファイルをインポートする

```
@import "~@fortawesome/fontawesome-free/scss/fontawesome.scss";
@import "~@fortawesome/fontawesome-free/scss/regular.scss";
@import "~@fortawesome/fontawesome-free/scss/solid.scss";
@import "~@fortawesome/fontawesome-free/scss/brands.scss";
```
####コンパイル

```
$ npm run dev
```

下記のサイトから必要なものを検索して使用する
https://fontawesome.com/icons?d=gallery
LaravelでCSSやJSを動的に生成してHTMLにリンクで読ませる

#はじめに

CMSなどで、背景色や文字の色、さらにはJavascriptの変数など、サーバやデータベースに保管したパラメーターを使って、CSSやJavaScriptを使う時に、Viewがすっきりするスマートな方法を紹介します。


#CSSファイルを生成しよう
データベースにマスターとして、背景やカテゴリごとのボタン色を指定できるようになっているとします。

CSSファイルをＤＢ保存した時に書き出しますか？
いいえ、いつものHTML表示と同じようにBladeで作りたい。
やってみましょう。

まず、dbをコントローラで読み込んで、ビューに渡します。

ポイントは、レスポンスでビューとヘッダーをつなげるところです。
そして、MIMEタイプを指定する部分にあります。

普通にVIEWで渡すとうまく来ません。
リターン、レスポンスから書いていきましょう。

```php
    /**
     * CSS
     *
     * @return
     */
    protected function css()
    {
        $MtbBackground = MtbBackground::all();
        $MtbCategory = MtbCategory::all();
        return response()
            ->view('front.component.colors',[
                'cssbackgrands'=>$MtbBackground,
                'csscategories'=>$MtbCategory
            ],200)
            ->header('Content-Type','text/css')
            ->header('Content-Disposition','inline');
    }
```

つづいて、VIEWファイル


```
@charset "utf-8";

@foreach($csscategories as $csscategory)
.btn.category-{{$csscategory->id}} {
background-color: {{$csscategory->color}};
}
@endforeach
@foreach($cssbackgrands as $cssbackgrand)
.bg-{{$cssbackgrand->id}} {
    background-color: {{$cssbackgrand->color}} !important;
}
@endforeach
```


ルーティングを設定します。
普通にファイル名のようにcolor.cssって名前を付けちゃって下さい。

```php
Route::get( '/color.css','Frontend\HomeController@css');
```

HTMLにCSSをセット

```html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <link rel="stylesheet" href="{{url('color.css')}}">
```

これで、ルーティングに作ったCSSのURLを開いてみます。



CSSファイルがあたかもあるかのように、
狙い通りCSS出力されています。
普通の人がこのリンク先を開いたら、
単なるCSSファイルだと思いますよ。
うふふ。偽装している感じがいい。

あとは、本文中でCSSクラスをを適用していけば、うまくデザインもはまります。

データベースのマスターを変更すれば、反映もすぐです。
JSも同じようやってやれなくないでしょう。




#なぜこれを作ったか
ボタンの色や文字の色、運用で追加されるデザインの色要素を、ViewのHTMLのヘッダーにロジックと共にベタ書きしてましたが。
公開されるHTMLのソースコードがダサイ。
Viewがコードが長くなって見ずらい。
CSSファイルとして読み込ませる方法、無いの？って。
JSも同じく、フッターに直でソースコードまるだし。
なーんか、いい方法無いの？


#どうして思いついたか
メール機能を作る時、メール送信テンプレートをbladeで、HTMLメールとプレーンのを作ります。
メールって送信しないと、デザインが確認できない。不便すぎる。
という事で、HTMLメールにダミーデータを入れて、プレビューで確認できるように作りました。

こんどは、プレーンはどうなの？見れなくていいのか？という事で、
テキストメールもブラウザに表示すると、普通に改行されずに、表示します。

おやおや。

ブラウザにテキストを表示するには。を調べれば、レスポンスヘッダーを変えればいい事に気がつきます。

```php
// アカウント登録認証メールの例（抜粋）

        switch ($type){
            case 'html':
                return response()
                    ->view('emails.RegisterMail',[
                        'title' => $this->title,
                        'header' => $this->header,
                        'token' => 'dummy',
                        'footer' => $this->footer,
                    ],200);
            case 'text':
                return response()
                    ->view('emails.plain.PlainRegisterMail',[
                        'title' => $this->title,
                        'header' => $this->header,
                        'token' => 'dummy',
                        'footer' => $this->footer,
                    ],200)
                    ->header('Content-Type','text/plain')
                    ->header('Content-Disposition','inline');
        }
```

テキストメールプレビュー機能で、こんな感じでレスポンスヘッダーを付足してみますと、
テキストメールもちゃんとブラウザで確認できます。
OK〜！メール送信しなくても、メールのデザインを調整できる。



勉強になりました。ありがとうございます。
[Node.js] 一時的ファイル(temp file)を使ってFirebase Storageへファイルをアップロードする


# 環境・バージョン

* node version v14.4.0
* "firebase-admin": "^8.7.0"
* "tmp": "^0.2.1"

# 実装

### Firebase Admin SDKの初期化

```js:firebase-admin.js
var admin = require('firebase-admin')

// Retrieve environment variables
const ServiceAccountFilePath = process.env.FIREBASE_SERVICEACCOUNT_FILEPATH
const StorageURL = process.env.FIREBASE_STORAGE_URL // xxxxx.appspot.com

const serviceAccount = require(ServiceAccountFilePath)

admin.initializeApp({
  credential: admin.credential.cert(serviceAccount),
  storageBucket: StorageURL,
})

module.exports = admin
```

### temp fileを使ってアップロード

Firebase Storageに対してファイルをアップロードするために、GCP Node.jsライブラリの[Bucket.uploadメソッド](https://googleapis.dev/nodejs/storage/latest/Bucket.html#upload)を利用しました。

一時的ファイル作成と削除には[tmp](https://www.npmjs.com/package/tmp)というサードパッケージを利用しました。

```js:firebase-storage.js
const fs = require('fs')
const tmp = require('tmp')
const admin = require('./firebase-admin') // 上記の初期化コードをインポート

const requestToStorageService = (cloudFilePath, fileContent) => {
  var promise

  tmp.file(function _tempFileCreated(err, path, fd, cleanupCallback) {
    if (err) throw err

    try {
      const bucket = admin.storage().bucket()

      fs.writeFile(path, JSON.stringify(fileContent), err => { // 一時ファイルに書き込み
        if (err) throw err
      })

      promise = bucket.upload(path, { // ファイルをFirebase Storageへアップロード
        destination: cloudFilePath,
        metadata: { contentType: 'application/json' },
      })
    } finally {
      cleanupCallback() // ファイル削除
    }
  })

  return promise
}
```

`tmp.file(function _tempFileCreated(err, path, fd, cleanupCallback)`によって一時的ファイルのパス(`path`)とファイルディスクリプタ(`fd`)が渡されます。

そのファイルに書き込みし、Firebase Storageへアップロードします。

また、`bucket.upload`はPromiseを返します。
AWS Cloud9 でダークフラットテーマを使用する方法

## サンプルコード
* user.settings のサンプルをGitHub で晒しているのでタイトルでピンとくる方は適当にコピーして利用してください
* https://github.com/k-yone/aws-cloud9-dark-flat-theme
* 以下詳細

## Cloud9 のフラットテーマはlight しかない？
* Cloud9 のsetting GUI 上からはフラットテーマの選択肢が一つしか表示されていません
![thems.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678515/cb31857d-1c28-f627-95ce-db639672a460.png)
* 旧UI ではダークフラットテーマが選択できたため，そちらに慣れているユーザや，  
VS Code を代表としたモダンなエディタに目が慣れているユーザにとってはちょっと気分が悪いです

## user.settings で直接指定するとdark flat テーマが指定できる
* USER SETTINGS タブから，設定ファイルを直接編集するモードに移ります
![settings.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678515/120478dd-3be4-77ad-cbd8-693d0c0099f7.png)
* 以下のようにgeneral.@skin フィールドに`"flat-dark"` を指定すると隠れたダークフラットテーマが指定できます
* 隠しコマンドみたいでちょっとわくわくしますね

```user.settings
{
    "general": {
        "@skin": "flat-dark"
    }
}
```

## console もダークテーマに
* 再掲ですが私が設定しているuser.settings をGitHub にさらしているので真似たい部分だけコピーして活用してください
* https://github.com/k-yone/aws-cloud9-dark-flat-theme
在宅作業でVPNを利用している時でも、ローカルの仮想環境に繋げるための設定。

# 前書き

在宅勤務が増えていますが、私が勤めている会社も、在宅勤務を順次、導入しつつあります。私も許可を得て、自宅で作業を進めるようになったのですが、会社のネットワークにSSL-VPNで接続すると、ローカルに立てていた仮想環境に繋がらなくなるという現象に見舞われました。

解決方法は、考えてみれば簡単な対処だったのですが、この不具合に見舞われたときは、さっさとバグをリリースしなければならない時だったため、あれこれと設定に悩んで、時間がかかってしまいました。今後のために、備忘録がわりに残しておきます。

## 環境

* ホストOS：Windows 10 pro
* ゲストOS：CentOS 7
* 仮想環境構築：Virtulbox, およびvagrant

システムの検証サーバ自体は、別途ありますが、いちいちデプロイしての動作確認が面倒だったので、仮想環境を立てて、そこでPostgreSQLやらnginxやらを稼働させて、個人用の環境を作っていました。

そして、ホストからゲストのCentOSに繋げる時には、`Vagrantfile`に記載していた`private_network`のIPに繋げる形で、接続していました。

```config:Vagrantfile
config.vm.network "private_network", ip: "192.168.33.21"
```

例えば、ホストの`pgAdmin`から、ゲストOSで起動しているPostgreSQLに繋げる時は、以下のようにIPアドレスを直接、指定していたわけです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31051/b4f2e6a5-b42f-a4ff-f24f-bc29cba006fc.png)
会社で開発をしていた時は、これで問題なく動いていました。

## 発生した事象

在宅勤務のため、SSL-VPNを有効にして、会社のネットワークに繋げた場合、このローカルに繋がらなくなりました。今までVPNを利用した事があまり無かったので知らなかったのですが、VPNではプライベートIPアドレスが使えなくなるらしいです。

VPNの製品や設定方法によっては、繋がるようにもできるようですが、うちの会社の設定では、許可されていませんでした。

## 対処法

最初はインフラ運用をしている部署に連絡して、VPNの設定を変更してもらおうかとも思いましたが、冷静になって良く考えるとpgAdminにはアクセスできていることに気づきました。pgAdminは、起動後に`http://127.0.0.1:[ポート番号]/browser/`でアクセスするわけですが、そのURLは機能していました。あと、社内チャットで相談すると、ローカルでdockerを入れて、WEBサーバをローカルに立ててる人が「`localhost:8000`などは繋がってます」とも情報を貰いました。

つまり、`127.0.0.1`(`localhost`)なら、SSL-VPNを稼働した後でも繋がっている訳です。となると「仮想環境にも`localhost`で繋げるようにすれば、この現象は解消するのでは」と考えました。

ということで、さくっと`forwarded_port`の設定をしました。Vagrantは、こうやって`Vagrantfile`に追記するだけで、簡単にネットワーク設定が変更できて便利ですね。仮想環境中のPostgreSQLのポート番号`5432`に、ホスト側の`15432`ポートで繋げられるように設定しました。

```config:Vagrantfile
config.vm.network "forwarded_port", guest: 5432, host: 15432
```
設定を変更したら、一度、`vagrant reload`を実行して、Vagrantを再起動します。

こうして再起動後、pgAdminの「ホスト名/アドレス」を`localhost`にして、「ポート番号」を`15432`に設定してやると、正常に繋げられるようになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31051/6b0d1a16-4148-d265-5270-3692aacd9469.png)

## 解決

上に載せたのはPostgreSQLのケースですが、WEBサーバなどでもポートフォワードの設定をすれば、繋がりました。

正直、仮想環境のポートフォワードは、ゲストとホストのポートの繋がりを把握する必要があるので、あまり好きではないのですが、一旦はこれで運用してみます。

## 参考

* [ポートフォワードにより仮想マシン内のサーバにアクセスする](https://maku77.github.io/vagrant/port-forward.html)
GCPでkaggleのための環境構築をする

# 初めに
kaggleの画像コンペで、GPU環境を使うためにGCPを使いました。環境構築方法をまとめようと思います。

GCPを使う理由やインスタンスの作成に関しては以下の記事がとても参考になります。
https://qiita.com/lain21/items/a33a39d465cd08b662f1

# GCEインスタンスの作成

私は以下のような環境を作りました。
- リージョン： us-west1-b
- マシンタイプ: n1-highmem-8（vCPU x 8、メモリ 52 GB）
- GPU: 1 x NVIDIA Tesla P100

インスタンスが作成できたら、実際に環境に入ってみます。

# gcloudの使い方
macで使う場合は、SDKをインストールします

```
curl https://sdk.cloud.google.com | bash
```

その後`.zshrc(bashrc)`に以下を追記します。

```
source '/Users/ユーザー名/google-cloud-sdk/path.zsh.inc'

source '/Users/ユーザー名/google-cloud-sdk/completion.zsh.inc'
```

よく使うコマンドは以下になります。

```
# インスタンスの一覧を確認
gcloud compute instances list

# インスタンスを起動
gcloud compute instances start <your-instance-name>
 
# インスタンスを停止
gcloud compute instances stop <your-instance-name>
```

※インスタンスが起動している限りは料金が発生してしまうので、使わなくなっったらすぐ停止しましょう！！！

GPU環境への接続は、VMインスタンス管理画面上の、以下のgcloudコマンドを表示するに記載されているコマンドを打てばできます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519296/d77d73ae-81c5-bd89-9606-870508986b1f.png", width=600>

以下のようなコマンドです。

```
gcloud beta compute ssh --zone <リージョン名> <インスタンス名> --project <プロジェクト名>
```

ただ、毎回このコマンドを打つのも面倒なので、`.ssh/config`に記載して簡単に接続できるようにします。

生成済みのSSH keyを使用する方法もありますが、今回はgcloud用に新しく生成します。ただ、キーの生成もconfigへの記載も以下のコマンドを打つだけなのでとても便利です。

```
gcloud compute config-ssh

You should now be able to use ssh/scp with your instances.
For example, try running:

  $ ssh hogehoge
```

これで簡単にssh接続で環境に入れるようになります。

ここでssh接続を簡略化したことによって、VScodeの接続が可能になります。

# VScodeでssh接続する

これに関しては以下の記事が参考になります。
https://qiita.com/nlog2n2/items/1d1358f6913249f3e186

まず、VScodeにRemote-sshのプラグインを導入します。

![スクリーンショット 2020-07-21 22.46.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519296/d163d789-9d9c-4eeb-8bda-002ede497f34.png)

そうしたら左下に緑色のボタンができるので、そこを押すと以下の画面が表示されます（コマンドパレットからも操作できます）。

![スクリーンショット 2020-07-21 22.47.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519296/adaa1c92-722e-e922-5c44-2ee1497d14cd.png)

ここで、`Remote-SSH: Connect to Host`を選択するとGCPの環境名が表示されるので、それをクリックすれば完了です。


# 画像コンペのためのデータセットを配置する

データセットはインスタンスに配置しました。

> （注）画像（コンペで配布されるzipファイルやそれを解凍したjpgファイル等）をストレージに置いてしまうと、解凍さえできないくらい遅いです。
画像は、インスタンス側におくか、pickleなどに固めてストレージにおくなどします

以下のカレーちゃんさんの記事を参考にしました。
https://currypurin.qrunch.io/entries/T9iGWHdsiI6o2wke

localからのファイルのコピーは以下のコマンドで実行できます。

```
# ファイルをコピー
gcloud compute copy-files <local-path> <your-instance-name>:~
```

# tmuxの設定
画像系の学習にはかなりの時間を必要とする場合が多いです。その時にssh接続が切れてしまっても学習を継続できるように、学習時にはtmuxを使いましょう。

```
# 以下でセッションを開始
tmux new -s <セッション名>

# 再接続する時は以下
tmux a -t <セッション名>
```

コマンドは以下の記事にわかりやすくまとまっています。
https://qiita.com/nmrmsys/items/03f97f5eabec18a3a18b

# 終わりに
ここまでできたらあとは思い思いに学習を回すだけ...

GCPを使うからには、自分も良い結果を残せるように頑張ろうと思います。

何かアドバイスや間違いがありましたら是非コメントをください！！
Goのカバレッジ解析結果をHTML出力するツールを自作してみた

Goは標準でカバレッジ解析するためのツールが用意されています！
テストを書いてカバレッジ確認する時にいつもお世話になっております。

```sh
# プロファイルを取得
$ go test -coverprofile=coverage.out ./...

# HTMLを出力
$ go tool cover -html=coverage.out

# 関数ごとのカバレッジ率を出力
$ go tool cover -func=coverage.out
github.com/name/repos/path/to/file.go:24:   Func1           100.0%
github.com/name/repos/path/to/file.go:70:   Func2           75.0%
...
...
total:                                      (statements)    83.8%
```

標準搭載のツールで十分なんのですが、個人的に

- ファイル選択がプルダウン → ファイル増えると探しにくい
- 関数ごとにカバレッジ率出せる → ファイル増えると探しにくい
- HTML出力時に関数ごとのカバレッジ率も一緒に見たい
- 黒背景が嫌だ・・・

みたいな気持ちがあったので、試しに自作してみました。

# やったこと
- [標準ツールさん](https://github.com/golang/go/tree/master/src/cmd/cover)のコードを読む＆写経してみる
    - `ast`パッケージとかは触ったことがなかったので楽しかった
    - `go tool cover`コマンド完全に理解した
- せっかくツール化したのでGitHub ActionsでCI/CD
    - `golangci-lint`で静的解析
    - `go test`を回す
        - 作成したツールのサンプルにも使える
    - GitHub Pagesにツールで出力したHTMLを公開

# できたもの
リポジトリ → [gover-html](https://github.com/masakurapa/gover-html) 
（ネーミングはかなり適当）

成果物はGitHub Pagesに公開するようにしたので [サンプルはこちら](https://masakurapa.github.io/gover-html/gover-html.html)
比較用に標準ツール版も出力しているので [標準ツール版はこちら](https://masakurapa.github.io/gover-html/go-tool-cover.html)

## 画面イメージ
- 左側にディレクトリツリーを固定で表示するようしてみた
- 右側は`go tool cover -func`で確認していた関数ごとのカバレッジ率を表示
- 行数がなかったので行数を表示

<img width="1280" alt="スクリーンショット 2020-07-21 22.45.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206915/9e137f4d-ac94-8bb2-0552-be72b72bfa59.png">

通過した・していないは標準ツールと同様に緑・赤で色分けする

<img width="959" alt="スクリーンショット 2020-07-21 22.46.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206915/bc333f89-ecf5-f179-c7cd-b27e31c2629b.png">

# 今後やりたいこと
- ツリーのディレクトリを折り畳めるようにしたい
    - やはりファイルが増えると縦長になってスクロールするの面倒くさい
- 標準ツールにある解析モードの`set`にしか対応していない
    - `count`, `atomic`への対応を考える
- テストを書ききれてないので書く
- css/js力が低いので頑張る😇

# まとめ
~~そもそもディレクトリツリー形式で見やすくなったのかはさておき~~
自分が使いにくいなーと感じた点を多少改善することができた・・・ような気がしました。

ツール作るのは楽しい！
`go tool cover`**完全に理解した**😎
ワイルドカードドメインの挙動について

#ワイルドカードドメインとは
特殊なラベル「*」 で始まる名前を持つリソースレコード。
ワイルドカード部分は任意の文字列がマッチし、指定された応答を返す。
ワイルドカードは以下のレコードに限り利用できる。

- Aレコード
- AAAAレコード
- MXレコード
- CNAMEレコード
- TXTレコード
- CAAレコード

最も左側のドメイン名ラベルとしてのみ利用ができ、下記のような半角英数字やハイフンと混在するような設定できない。
例）「abc*」、「*abc」、「abc*abc」、「abc-*abc」など

# 動作検証
まずは基本的な動作の確認から。それぞれのレコードタイプでレスポンスを確認する。

```
@   IN  SOA sample.com. postmaster.sample.com. (
...

*.a.wildcard        IN  A   1.2.3.4
*.aaaa.wildcard     IN  AAAA   ::1
*.mx.wildcard       IN  MX  10	sample.com.
*.cname.wildcard    IN  CNAME   google.com.
*.txt.wildcard      IN  TXT "text record."
*.caa.wildcard      IN  CAA 0 issue sample.com
```

**Aレコード**

```
-bash-4.2$ dig @localhost +short hoge.a.wildcard.sample.com
1.2.3.4
```

**AAAAレコード**

```
-bash-4.2$ dig @localhost +short hoge.aaaa.wildcard.sample.com aaaa
::1
```

**MXレコード**

```
-bash-4.2$ dig @localhost +short moge.mx.wildcard.sample.com mx
10 sample.com.
```

**CNAMEレコード**

```
-bash-4.2$ dig @localhost +short moge.cname.wildcard.sample.com
google.com.
127.0.0.1
```

**TXTレコード**

```
-bash-4.2$ dig @localhost +short moge.txt.wildcard.sample.com txt
"text record."
```

**CAAレコード**

```
-bash-4.2$ dig @localhost +short fuga.caa.wildcard.sample.com caa
0 issue "sample.com"
```

基本的には「*」部分にはどんな文字列を入れてもマッチする。

# ワイルドカードの効果範囲

複数のラベルと一致するため、ラベルを分けることで何階層でも適応される。

```
-bash-4.2$ dig @localhost +short fuga.moge.hoge.a.wildcard.sample.com
1.2.3.4
```

ラベルの上限を超えるものはNG。

```
-bash-4.2$ dig @localhost +short 1234567890123456789012345678901234567890123456789012345678901234.a.wildcard.sample.com
dig: '1234567890123456789012345678901234567890123456789012345678901234.a.wildcard.sample.com' is not a legal name (unexpected end of input)
```

ラベルを分ければ、長いドメイン名も可能。

```
-bash-4.2$ dig @localhost +short 123456789012345678901234567890123456789012345678901234567890123.fuga.hoge.a.wildcard.sample.com
1.1.1.1
```

# ワイルドカードの優先順位

下記のように、ゾーンの領域が重なっている場合の動作を確認する。

```
*.a.wildcard        IN  A   1.1.1.1
b.a.wildcard        IN  A   2.2.2.2
```

*.a.wildcardに該当するドメインは、1.1.1.1が返される。

```
-bash-4.2$ dig @localhost +short hoge.a.wildcard.sample.com
1.1.1.1
-bash-4.2$ dig @localhost +short fuga.a.wildcard.sample.com
1.1.1.1
-bash-4.2$ dig @localhost +short fuga.hoge.a.wildcard.sample.com
1.1.1.1
```

b.a.wildcardについてはワイルドカードより優先されるため、2.2.2.2が返される。

```
-bash-4.2$ dig @localhost +short b.a.wildcard.sample.com
2.2.2.2
```

下記のような、b.a.wildcardのサブドメインはワイルドカードには該当しない。

```
-bash-4.2$ dig @localhost +short hoge.b.a.wildcard.sample.com
-bash-4.2$
```
spf=failの解消

gmailに送信したメールのソースを見ると、spf=failとなっていた

```
       dkim=pass header.i=@[ドメイン名] header.s=200720 header.b="PkRt7Z/P";
       spf=fail (google.com: domain of [アカウント]@[ドメイン名] does not designate xxxx:xxxx:xxxx:xxx:xxx:xx:xx:xxx as permitted sender) smtp.mailfrom=[アカウント]@[ドメイン名];
       dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=[ドメイン名]
```

spfをip4だけ書いていたけど、ip6が書いていないからfailになっている雰囲気
ip6の記述も追加しました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274034/47b18192-d4b9-95c3-7da9-d758cb0a2b9d.png)

以下の記事を参考にさせていただきました
https://www.nalabo.net/blog/2013/06/18/148
JSFのタグがHTMLにならないときの対応方法

- 環境
    - CentOS Linux release 7.8.2003 (Core)
    - Payara Server  5.194
    - Eclipse IDE for Enterprise Java Developers.Version: 2020-03 (4.15.0)
    - openjdk version "11.0.7" 2020-04-14 LTS

# 事象 : JSFのタグがHTMLにならないでそのまま表示される
JSFのプロジェクトをつくって早速XHTMLを書いたけど・・・JSFのタグがそのまま出力されている
![スクリーンショット 2020-07-21 22.53.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159761/fa8cd781-8633-c6f6-b0d1-8037f2b1554e.png)

```xml:index.xhtml
<?xml version='1.0' encoding='UTF-8' ?>
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
    xmlns:h="http://xmlns.jcp.org/jsf/html"
    xmlns:f="http://xmlns.jcp.org/jsf/core">
<head>
    <title>JSFのタグがHTMLにならないときの対応方法</title>
</head>
<body>
  <h3>JSFのタグがHTMLにならないときの対応方法</h3>
  h:selectBooleanCheckboxでチェックボックスを書いてみた
  <div>
    <h:selectBooleanCheckbox id="checkBox" value="false" />
    <h:outputLabel for="checkBox" value="チェックボックス"/>
  </div>
</body>
</html>
```

# 原因 : web.xmlでのURL定義と使っているURLがあっていないから
> servlet-mappingは、ウェブアプリケーションにアクセスするURLの指定方法を定めます。
> [わかりやすいJava EE ウェブシステム入門 川場隆 著](https://www.shuwasystem.co.jp/book/9784798042169.html)

```xml:WEB-INF/web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
  <display-name>tryJsf</display-name>
...省略...
  <servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>/faces/*</url-pattern>
  </servlet-mapping>
</web-app>
```

web.xmlの定義だと`http://xxxxxx/{display-name}/faces/index.xhtml`で表示する
が、今回の事象は`http://xxxxxx/{display-name}/index.xhtml`で表示したので失敗した。

## 対応1 : 使うURLをweb.xmlに合わせる
`http://xxxxxx/{display-name}/index.xhtml`を使うとちゃんと表示される
![スクリーンショット 2020-07-21 22.49.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159761/f4b08210-f23c-419b-9c72-e836c2fb105d.png)

## 対応2 : web.xmlを使うURLに合わせる
web.xmlを修正して再ビルドして再実行する

```xml:WEB-INF/web.xml
...省略...
  <servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>*.jsf</url-pattern>
    <url-pattern>*.xhtml</url-pattern>
  </servlet-mapping>
</web-app>
```

![スクリーンショット 2020-07-21 22.59.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159761/aa3a6667-d66e-1259-b4ea-337db86de404.png)
サーバサイド Swift フレームワーク Vapor の開発環境セットアップ方法


## はじめに

私は普段iOSフロントをSwiftで書いているため、XcodeやSwift等の環境がある程度ありましたので、
Xcodeの導入部分等は省略しております。

## 環境

- macOS Catalina 10.15.5
- Xcode 11.5
- Swift 5.2.4

## Vapor インストール

なにはともあれVaporを導入
[homebrew](https://brew.sh/index_ja)の導入をお願いします。

```
brew tap vapor/tap
brew install vapor/tap/vapor
```

## Vapor プロジェクトを作成

私の場合はAPI開発がしたかったのでテンプレートオプションでAPIモードとしてプロジェクト作成しました。

```
vapor new Hello --template=api
```
いくつかイニシャライズ時の質問がありますので設定してきます。

`Would you like to use Fluent?`

Fluent とはモデルの作成、削除、読み取り、更新やクエリの発行などを行ってくれるDB周りの便利パッケージのようです。

`y` を入力して回答していきます。

`Which database would you like to use?`

どのDB使うか聞かれるので `1` の Postgres を選択します。(2020/07/21 現在 MySQL、MONGO DB 等はbeta版のようでした)



作成されたプロジェクトのディレクトリに移動します。

```
cd Hello
```

Xcodeプロジェクトを作成します

```
vapor xcode
```

上記でXcodeが自動的に立ち上がるのでSwiftPMのインストールが終わりましたら、
`Sheme` を `My Mac` に設定して(おそらく自動的に設定されている) `Cmd + R` or `▶︎ボタン` で実行します。
http://localhost:8080 にアクセスすると下記が表示されると思います。

![スクリーンショット 2020-07-21 22.43.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127713/2c8c4c15-dfbe-52dd-cc0e-4566548cd3e5.png)

以上で初期の開発環境セットアップ完了です。

## 参考

https://docs.vapor.codes/2.0/getting-started/install-on-macos/
https://docs.vapor.codes/3.0/getting-started/hello-world/
VBScriptで全角・半角変換を行う関数

# はじめに
VBAにはStrConvという全角と半角の変換が行える関数が存在するのですが、VBScriptにはないようなので、作成しました。

VBScriptで英数字の半角を全角に、または全角を半角に変換する関数です。
~~記号や~~カナには対応していません。
2020.7.27 改良
記号にも対応

参考元：

http://dumbo001.hatenablog.com/entry/2017/04/26/053526


# ソースコード

```vb
Option Explicit

Const HAN = " !#$%&?\()[]{}<>=-+*^/,._;:|@`･"      ' ~"'を除く
Const ZEN = "　！＃＄％＆？\（）［］｛｝＜＞＝－＋＊＾／，．＿；：｜＠｀・"

'*****************************************************************************
'[概要] 半角英数字を全角に変換する
'[引数] 変換対象文字列
'[戻値] 変換後文字列
'*****************************************************************************
Function StrConvWide(ByVal strWord)
    Dim i, j, strChar, lngChar
    For i = 1 To Len(strWord)
        strChar = Mid(strWord, i, 1)
        lngChar = Asc(strChar)
        If Asc("A") <= lngChar And lngChar <= Asc("Z") Then
            strChar = Chr(lngChar + Asc("Ａ") - Asc("A"))
        ElseIf Asc("a") <= lngChar And lngChar <= Asc("z") Then
            strChar = Chr(lngChar + Asc("ａ") - Asc("a"))
        ElseIf Asc("0") <= lngChar And lngChar <= Asc("9") Then
            strChar = Chr(lngChar + Asc("０") - Asc("0"))
        Else
            j = InStr(1, HAN, strChar)
            If j > 0 Then
                strChar = Mid(ZEN, j, 1)
            End If
        End If
        StrConvWide = StrConvWide & strChar
    Next
End Function

'*****************************************************************************
'[概要] 全角英数字を半角に変換する
'[引数] 変換対象文字列
'[戻値] 変換後文字列
'*****************************************************************************
Function StrConvNarrow(ByVal strWord)
    Dim i, j, strChar, lngChar
    For i = 1 To Len(strWord)
        strChar = Mid(strWord, i, 1)
        lngChar = Asc(strChar)
        If Asc("Ａ") <= lngChar And lngChar <= Asc("Ｚ") Then
            strChar = Chr(lngChar - Asc("Ａ") + Asc("A"))
        ElseIf Asc("ａ") <= lngChar And lngChar <= Asc("ｚ") Then
            strChar = Chr(lngChar - Asc("ａ") + Asc("a"))
        ElseIf Asc("０") <= lngChar And lngChar <= Asc("９") Then
            strChar = Chr(lngChar - Asc("０") + Asc("0"))
        Else
            j = InStr(1, ZEN, strChar)
            If j > 0 Then
                strChar = Mid(HAN, j, 1)
            End If
        End If
        StrConvNarrow = StrConvNarrow & strChar
    Next
End Function
```

#余談
VBAでは使える、select case の範囲指定がvbsでは使えないことを初めて知りました。

```vb
    Select Case 判定値
    Case 値1 To 値2  'Toを使った範囲指定は出来ない
```

# 関連記事
※この記事

https://qiita.com/takahasinaoki/items/4ff08f0b733ddc6c6927

https://qiita.com/takahasinaoki/items/8e57b58e634a11c1a080

https://qiita.com/takahasinaoki/items/51746404092ce741ceda
A server is already running. Check /[WORKDIR]/tmp/pids/server.pid.の解決方法

####状態

docker-compose upしたら、

```
A server is already running. Check /[WORKDIR]/tmp/pids/server.pid.
　Exiting
```
と出てきてしまいサーバーが立ち上がらないことがありました。

####原因
サービスを起動したままコンテナを無理やり消してしまうとpidファイルが残ってしまうことが原因です。

####解決方法
指示通り

```
tmp/pids/server.pid.
```
をみに行くと、ここに数字が書かれています。
server.pid.ファイルを消して、docker-compose upすれば解決します。
Python からの C/C++ コード呼び出し on OSX

Boost.Python を使って、Python から C/C++ の関数を呼び出しを、OSX でトライしたときの記録です。Python3 前提です。

OSX で Boost.Python を使う方法がうまく見つけられなかったので、記録として残しておきます。どれくらい需要があるかはナゾですが、、

情報はすべて 2020/07 現在のものです。（Python3.8）

# 手順

## 1. Boost.Python のインストール

Python3 版は `boost-python3` という Formula になります。

```bash
brew install boost-python3
```

## 2. C/C++ コードのコンパイル

例えば、C++ ライブラリとして以下のようなコードを用意します。

```my_sample.cpp
#include <string>
#include <boost/python.hpp>
using namespace std;

string add_hello( const string s )
{
    return "Hello, " + s;
}

// モジュールの初期化ルーチン:モジュール名=my_sample
BOOST_PYTHON_MODULE( my_sample )
{
    // C++のadd_hello関数を、greetという名前でpython用に公開
    boost::python::def( "greet", add_hello );
}
```

コンパイルのためのコマンドは下記になります。

```bash
g++ -shared -fPIC -I/usr/local/include -L/usr/local/lib \
    $(python3-config --includes --ldflags --embed) -lboost_python38 \
    my_sample.cpp -o my_sample.so
```

これで、Python からは `my_sample.so` を `import my_sample` として呼び出すことができるようになります。

## 3. Python からの呼び出し

```python
import my_sample

print(my_sample.greet("hoge"))  # "Hello, hoge"
```

# 補足

私がトライしたときは、コンパイラは brew で入る `g++-10` ではうまく行かず、XCode 付属の `g++` でうまくいきました。C++ 標準が違う、みたいな警告が出てたので、`boost_phthon38` が `g++` でコンパイルされているから、ということでしょうか。

# 参考資料

- [`boost-python3` Formula のテストコード](https://github.com/Homebrew/homebrew-core/blob/3d816854039bf6585ca8a1c0539666116c9d553e/Formula/boost-python3.rb#L92-L97)。ここの処理内容をみてようやく、OSX でのコンパイル方法がわかりました。
[C#]System.UriのベースURIと相対URIが思っていたのと違っていた話

#URIの作成について
WebApiでURIにidを埋め込みたい場合に、id部分を+で連結するのを避ける方法を検討していた。
System.UriのベースURIと相対URIを設定すれば簡単にできると勘違いしていた。
例えば、"http\://localhost:9999/api/5"とかの場合、以下の実装で問題ないはずだった。

```csharp

            var uri = new Uri(new Uri(@"http://localhost:9999/api"), "/5");
            Debug.Print(uri.AbsoluteUri);
```

結果:"http://localhost:9999/5"
"/api"の部分が抜けている．．．

#仕様の確認
[MSのドキュメント](https://docs.microsoft.com/ja-jp/dotnet/api/system.uri.-ctor?view=netframework-4.7.2#System_Uri__ctor_System_Uri_System_String_) を読むと、ベースURIの末尾の"/"と相対URIの先頭に"/"があるかで動作が変わるとのこと。

>このコンストラクターは、baseUri と relativeUriを組み合わせることによって、Uri インスタンスを作成します。 relativeUri が絶対 URI (スキーム、ホスト名、および必要に応じてポート番号を含む) の場合、Uri インスタンスは relativeUriのみを使用して作成されます。
baseUri に相対部分 (/apiなど) がある場合、baseUri の相対部分が構築された Uriに保持される場合は、相対部分をスラッシュ (/api/など) で終了する必要があります。
さらに、relativeUri がスラッシュで始まる場合は、baseUri の任意の相対部分に置き換えられます。

#動作確認
いくつかのパターンを試してみた。

```csharp
            // 1. http://localhost:9999/api/5
            Debug.Print(new Uri(new Uri(@"http://localhost:9999/api/"), "5").AbsoluteUri);

            // 2. http://localhost:9999/5
            Debug.Print(new Uri(new Uri(@"http://localhost:9999/api"), "5").AbsoluteUri);

            // 3. http://localhost:9999/5
            Debug.Print(new Uri(new Uri(@"http://localhost:9999/api/"), "/5").AbsoluteUri);

            // 4. http://localhost:9999/api/5
            Debug.Print(new Uri(new Uri(@"http://localhost:9999/"), "/api/5").AbsoluteUri);
```

ベースURIと相対URIの定義次第だけど、4のようにすると、ベースURIの末尾"/"、相対URIの先頭"/"の有無は気にしなくて良くなる。

```csharp
            // 5. http://localhost:9999/api/5
            Debug.Print(new Uri(new Uri(@"http://localhost:9999/"), "api/5").AbsoluteUri);

            // 6. http://localhost:9999/api/5
            Debug.Print(new Uri(new Uri(@"http://localhost:9999"), "/api/5").AbsoluteUri);
```

#まとめ

ベースURIの末尾に"/"がない場合、ベースURIに含まれる相対部分が相対URIに置き換わる。
ベースURIの先頭に"/"がある場合、ベースURIに含まれる相対部分が相対URIに置き換わる。

#補足
私のプロジェクトの場合、ベースURIと相対URIは詳細な形式は不明であり、末尾"/"、先頭"/"の不明はわからない状態だった。
結局、ベースURIの末尾"/"がなければ"/"を追加し、相対URIの先頭に"/"があれば削除してSystem.Uriクラスを使用したが、正直+連結で十分だった。

[目次](https://qiita.com/csharpisthebest/items/57f27a33085f01211166)
rails c で急にエラーが出た時

以前FactoryBotの確認でコンソールをいじっている時にそれは起こった。

```
irb(main):001:0> FactoryBot.create(:user)
Traceback (most recent call last):
        1: from (irb):1
KeyError (Factory not registered: "user")
```

FactoryBotの中身を確認してみる。。

```ruby
FactoryBot.define do
  factory :user do
    name {Faker::Name.last_name}
    email {Faker::Internet.free_email}
    password = Faker::Internet.password(min_length: 8)
    password {password}
    password_confirmation {password}
  end
end
```
FavtoryBotのエラーについて調べたが()で閉じることでエラーが出ることが多いみたい。でも{}で中身入れてるし問題ない。

調べていくうちにrailsコマンドが正常に作動しない時はspringを止めたら動き始めるとのことが発覚。

**springはrailsが持っている機能で入力したrailsコマンドの起動を早くしてくれるらしいがたまに固まってしまうらしい。**

```
spring stop
```
これで無事動き始めました。

安心してください、、、またrailsコマンドを使うと自動的にspringは起き上がります！
ROS勉強#2ROSでHello World

#環境
ubuntu20.04LTS
ｒos-noetic

#hello_world.pyをつくる
```
$ code hello_world.py
```
hello_world.pyの中身は

```python
import rospy
rospy.init_node('hello_world_node')
rospy.loginfo('Hello world')
rospy.spin()
```

#roscoreして実行

```
$ roscore
```
ターミナル変えて、

```
$ python3 hello_world.py
```
noeticは`python`のコマンドを打つと、`rospkg`がないと言われるので、`python3`とするとうまくいった。

#おまけ
以前melodicを入れていたので、

```
bash: /opt/ros/melodic/setup.bash: No such file or directory
```
という文言がずっと出ていた。そこで、

```
$ code ~/.bashrc
```
で開くと`.bashrc`に過去の産物があるわあるわ。。いろいろいじって保存し、

```
$ source /opt/ros/noetic/setup.bash
$ echo "source /opt/ros/noetic/setup.bash" >> ~/.bashrc
$ source ~/.bashrc
```
とすると、今まででていた文言を消すことができた。
Firebase storage security rules 400 error issue ... Please enable Firebase Storage for ... というエラーに出会ったときの解決方法


# はじめに

Firebase StorageへのアップロードしたファイルをGUIのコンソール上から開こうとしたところ下記のエラーに出会いました。

> Firebase storage security rules 400 error issue “Permission denied. Could not access bucket xxxxx-****.appspot.com”
> Please enable Firebase Storage for your bucket by visiting the Storage tab in the Firebase Console and ensure that you have sufficient permission to properly provision resources.

このエラーの解決方法は下記のStackoverflowのページに記載されていました。

https://stackoverflow.com/questions/50292353/firebase-storage-security-rules-400-error-issue-permission-denied-could-not-ac

このページではテキストベースで少々分かりづらかったので、本記事ではスクショを付けて日本語の記事を書きます。

# 解決ステップ

やること: 対象のバケットに対して `firebase-storage@system.gserviceaccount.com` というメンバーを"Storage Admin"のロールで作成する必要があります。

Step1: [GCP Cloud Console](https://console.cloud.google.com/home/dashboard)へアクセスします。

Step2: 左パネルからStorageのBrowserを選択し、下記スクショのように対象のバケットを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/91562/6cd7df8c-7c03-6f0c-caf4-beef23b0489d.png)

Step3: 下記スクショのように"Permission"タブを選択、"Add members"ボタンを選択、`firebase-storage@system.gserviceaccount.com`を入力し、Roleには"Storage Admin"を選択したら"Save"します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/91562/4805e665-78db-e1eb-93a2-55f095a44456.png)

その後、対象のファイルを再度開いたところ無事ファイルを閲覧することができました。
VBScriptへ複数の引数を渡す with Automation Anywhere Automation 360

走り書きですが、困っている人にはこれだけで分かると思うので・・・。

ドキュメンテーションの[VBScript パッケージ](https://docs.automationanywhere.com/bundle/enterprise-v2019/page/enterprise-cloud/topics/aae-client/bot-creator/commands/cloud-vb-script.html)に以下の記述がありますが、
本日現在のドキュメンテーションでは詳細の説明がないのでどうやったらいいのか分かりません。
なので、この記事を書きました。

>Note: 関数の引数として、リスト変数のみを渡すことができます。リスト変数を使用すると、Boolean、日時、番号、文字列など、データ型が異なる複数の引数を渡すことができます。

#手順
こんな感じでリスト変数を作ります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490870/8f61e3b4-4be7-429e-0de5-50471d0dbc2c.png)

こんな感じでアクションを配置します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490870/08a18da2-3e06-e794-3f1e-8fd199c456f9.png)

それぞれの中身はこんな感じです。

---
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490870/313cf5f0-6e66-aec9-3b61-ccc2f3b72374.png)
---
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490870/71c4172b-b7dd-b3ac-640a-ec06127f5b84.png)
---
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490870/9dc8cb31-36f2-0026-3a54-7b9cbefda76c.png)
---

サンプルとして作ったVBScriptは以下の通りです。
WScript.Arguments.Item(#)で、引数で渡した値を呼び出せます。
（#）の中身は呼び出したいリスト変数のインデックス番号を入れます。

最後の行は特に意味はありませんが、出力をBot側で受け取りたいときにこのように書きます。

```VBScript:example.vbs
vResult = MsgBox (WScript.Arguments.Item(0), 00, "VBScriptにより生成されたメッセージボックス")
vMsgOne = WScript.Arguments.Item(1)
vResultOne = MsgBox (vMsgOne, 00, "VBScriptにより生成されたメッセージボックス")

Wscript.Stdout.Writeline(vResult)
```
M5StickCにFactoryTestが書き込めなかったときの備忘録

先日、MacにArduino IDEをインストールし、M5StickCに動作確認用のスケッチ「FactoryTest」を書き込もうとしたところ、ちょっとつまずいたので書き込み成功までの経緯をメモします。
##環境
Mac : MacBook Pro (13-inch, 2017) macOS Mojave、
Arduino IDE : 1.8.12
##ライブラリの追加
M5StickCの「[クイックスタート](https://docs.m5stack.com/#/ja/quick_start/m5stickc/m5stickc_quick_start_with_arduino_Windows)」に沿って、Arduino IDEのインストールと環境設定はできました。最後にスケッチ「FactoryTest」の書き込みを試します。
ソースの先頭のコメントに「ライブラリ管理からFastLEDライブラリを追加してね」とあります。
![IMG_0779.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677344/a93537ec-2108-924c-debf-5b1da99b3967.jpeg)

ツールメニューの「ライブラリを管理…」でFastLEDを検索すると候補が大量に出てきます。More infoでソース記載のGitHubのページに飛ぶので、Daniel GarciaさんのFastLEDをインストールします。
![IMG_0780.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677344/e096001f-ad8e-cd54-b176-a5a3a8d9a017.jpeg)

##パーティション形式の変更
続いてMacからM5StickCに書き込もうとすると「サイズが大きすぎて入らないの…」と言われます。ソースの二つ目のコメントを見ると「パーティション形式をデフォルトからNoOTAかMinimalSPIFFSに変えてね」とあります。
![IMG_0779 2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677344/e92aaf04-0694-d147-61c3-1f2dc0c9754b.jpeg)

で、NoOTAに変えると…
![IMG_0781.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677344/6f44cc9f-1826-a38a-3cb9-786d932a8fc5.jpeg)
うまく書き込みできました！
デフォルトだと無線での書き込み（OTA）に対応した形式になっていて、結果的にスケッチが使えるメモリが小さくなるそうです。NoOTAを選択する（OTAを諦める？）ことで広いメモリを使えるようになり、書き込むことができました。

最初からソースのコメント通り対応していれば、何事もなく書き込めたのだと思いますが、結果的にArduino IDEのライブラリ追加方法やパーティション形式の勉強になりました。
[CSS単位系] vh, vw に潜む甘い罠[widthとheightに使うときの注意]

cssの大きさを示す単位、いくつ知っていますか？
px, %, rem, em, pt...
%以外は要素そのものの値を基準に決まりますね。

その中でも vh, vw の２つは画面（Viewport）の大きさでサイズが変わるという特異な性質を持っています。
これは便利！ `width: 100vw;` とかしたくなりませんか？

ところがこの vh と vw 、気をつけて使わないと罠があります。

## vh, vw とは

Viewportに対する100分率で指定できます。
vhは画面の高さ、vwは画面の幅を基準にします。


100vhなら高さ画面いっぱい、100vwなら幅画面いっぱい、ですね。

## 甘い罠
さて、使いたくなるところを考えてみましょう。
親のBoxに左右されず100%っぽく指定できるので、 `width: 100vw` とかしたくなりますね！
あとは１画面分のファーストビュー前面に出すための `height: 100vh` とかでしょうか？

ところがですよ、主にPCでの vw, SPでの vh には罠があります。

## vh, vw が認識とずれやすいもの

|端末|（おそらく）開発者が意図しないもの|
|----|----|
|PC|スクロールバー|
|SP|アドレスバー|

### PCのvw
QiitaのHeaderを開発者ツールで開いて、`div.st-HeaderContainer`を選択しましょう。
<img width="970" alt="スクリーンショット_2020-07-21_21_56_31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122390/574b1bd6-3178-2772-7852-3a1a5bd42e5a.png">

横スクロールバーが出てしまいました。
実はこれ、100vwには縦スクロールバー分の横幅を含めた範囲なのでレンダリングの範囲より大きいのです。
証拠に、画面の要素をどんどん消していって、スクロールバーを消せばピッタリ収まります。
中に要素が増えていったら発覚するので性質が悪いと言えるでしょう。

### SPのvh
SPのvhはもっとひどいです。vhはデバイスの高さによってきまります。
しかしレンダリングされる高さは **アドレスバーを除きます。**

**PCのレスポンシブビューを使ってSPサイトを開発していると気づかないことがあるので注意してください。**

この記事の解説図がめちゃくちゃわかりやすいので是非見てください。
[【CSS】100vhは「一画面」ではないという罠 \| JavaScriptに関するお知らせ](https://jsnotice.com/posts/2019-03-30/#%E3%82%AD%E3%83%BC%E3%83%9C%E3%83%BC%E3%83%89%E3%81%8C%E5%87%BA%E3%82%8B%E3%81%A8%E5%9C%A7%E7%B8%AE%E3%81%95%E3%82%8C%E3%82%8B)

## 本当の使い所

- 親要素に左右されず高さと幅が決定したい
- （スクロールバーが現れないように） 90vw とかの指定にできる

上記を考えると、SP向けモーダルウィンドウ（ポップアップウィンドウ）の実装なんかには便利なのではないでしょうか。
PC向けを考えると max-width や max-height に固定値pxを指定するといった運用も考えられます。

# まとめ
vhやvwはあとになって問題が発覚することがあります。
vh, vw のいずれも使わずに済むようにコーディングできるならそれに越したことはないでしょう。
（ `position: absolute` を うまく使えば親boxに左右されず、`100% = 画面幅` のboxを作れると思います）


## おまけ：それでも100vh的なことがしたいとき
[スマホサイトのコーディングでハマりがちな３つのポイント \| Web制作の株式会社クライマークス](https://www.climarks.com/column/20190528.html)
この記事によると、このようにすると良いんだそうです。

 ```.css
/* style設定例（body直下にメインビジュアルの要素がある場合） */
html,body {
  height: 100%;
}
/* メインビジュアルスタイルのスタイル */
.hoge {
  height: 100%;
}
```


## コーディングのテクニック
- [\[HTML/CSS高速コーディング\]ギリギリまでコードを書かないChrome DevToolsのリアルタイムレイアウト編集テクニック \- Qiita](https://qiita.com/fruitriin/items/1e01f57ecb750f3612d0)
- [\[サーバーサイドAPIデバッグ術\]ブラウザのリクエストを簡単にリトライしてサーバーの挙動を見る方法 \- Qiita](https://qiita.com/fruitriin/items/72d66cf88b8319512620)
- [\[JavaScriptデバッグテクニック\]メソッド実行中の変数の中とか見たくない？ \- Qiita](https://qiita.com/fruitriin/items/d0a1cd943233cd22ef30)
マークダウン記法でDB設計【残り55日】

使用したマークダウン記法
[#]
見出しとして使用
数を増やすとfont-sizeが小さくなっていく
HTMLでいうh1~h6タグ

[|文字列|]
表の作成として使用
コロンを文字列の左、左右、右につけることで左寄せ、中央揃え、右寄せにできる

[-]
箇条書きとして使用
ハイフンの後に半角スペースを入れること

<img width="361" alt="マークダウン記法でDB設計.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678246/bba28cd0-bb2f-6eee-fe80-7018b541cb4e.png">

# テーブル設計

## users テーブル

| Column   | Type   | Option      |
| -------- | ------ | ----------- |
| name     | string | null: false |
| email    | string | null: false |
| password | string | null: false |

### Association
- has_many :room_users
- has_many :rooms, through :room_users
- has_many :messages


カラム、アソシエーションが一目瞭然なのでアプリケーション開発には必須の作業。
【GAS】Gmailからデータ取得し、スプレッドシートに書き込むポイント


前回投稿した、
[【GAS】検索したメール本文の特定部分をスプレッドシートに書き込む](https://qiita.com/Shin/items/428b2f62a2dba7d83406)
の振り返り、整理回です。

# ポイント
1. メールの処理
2. 正規表現
3. スプレッドシートに登録

以下、各々の説明です。

## 1. メールの処理
#### 1. メール検索
Gmail使っていて、メールを検索するのと同じ。
返却値がスレッドの塊というのが肝。

```javascript
  // メール検索条件。処理済みのメールは除外。
  let query = 'subject:(検索したい件名 -label:済み';
```

#### 2. メール検索結果（スレッド単位）から、メッセージの処理
「スレッドの塊 > スレッド > メッセージ」のイメージが大事。
以下のように、１つずつ分解して処理します。

##### GmailApp.search()で、スレッドの塊を取得
```javascript
  // メール検索
  let threads = GmailApp.search(query);
```

##### スレッドの塊から、１スレッドずつ処理
```javascript
  // 1スレッドずつ処理 
  threads.forEach(function (thread) {
```

##### １スレッドから、１メッセージずつ処理
```javascript
    // １メッセージずつ処理
    thread.getMessages().forEach(function (message) {
      let subject = message.getSubject();
      let body = message.getBody();
```



## 2. 正規表現
#### 1. 設定の仕方
まずは、プレーン形式でメール本文取得。
その中から、取得したい部分を取得。

```javascript
      // 正規表現で処理するためHTML形式ではないプレーンな型の本文を取得
      var plainBody = message.getPlainBody();

      // 正規表現で取得したい箇所を取得
      let ringiAppNo = plainBody.match(/申請番号： (.*)/);
      let ringiSubject = plainBody.match(/件名：(.*)/);
```

#### 2. 戻り値
正規表現の戻り値から取得したい部分をチョイス。

* 戻り値
 * 0 : マッチした文字列全体が入る
 * 1~ : それぞれのキャプチャ
 * index : マッチした場所 (bite値 じゃなくて 0から数えて何番目の文字か？)
 * input : 検索される側の文字列


```javascript
      // 結果を入れる配列に格納
      items.push([
        ringiAppNo[1],
        ringiSubject[1]
      ]);
```



## 3. スプレッドシートに登録
#### 1. itemsに格納
配列の型にして、itemsに登録

```javascript
      // 結果を入れる配列に格納
      items.push([
        ringiAppNo[1],
        ringiSubject[1]
      ]);
```

#### 2. setValuesで値登録
書き込む範囲のセルを取得し、setValuesで値登録。

```javascript
    let sheet = SpreadsheetApp.getActive().getSheetByName('書き込みしたいシート名');
    let row = 2;
    let column = 1;
    let numRows = items.length; // 配列数 = 行数
    let numColumns = items[0].length; // 配列の要素数 = カラム数
    sheet.getRange(row, column, numRows, numColumns).setValues(items);  
```
ログイン画面作成（備忘録）　section73（完）

今のままだと、 .png　などの写真ファイル以外の物までアップロードできてしまうため、
セキュリティの面から危険なので画像のみアップロードできるように作り込んでいく。

これはエラーチェックの項目を増やせば良い事になる。
記入欄のエラーチェックを行っている付近に画像ファイルチェックのコードを記述していく。

```

	$fileName = $_FILES['join']['name'];
	if(!empty($fileName)){
		if($ext != 'jpg' && $ext !='gif' && $ext !='png'){
			$error['image'] = 'type';
                }
	}
	if(empty($error)) {
```
`$fileName = $_FILES['join']['name'];`　（$_FILESはグローバル変数）
↑　
こちらは`<input type="file" name="image" size="35" value="test"  />`の
imageというname属性が付いたファイルアップロードのコントロールからアップロードされたファイルのファイル名を検査していくにあたって、
よく使うファイル名なので変数`$fileName`に一旦保管しておく。

--------------------------------------------------------------

```
if(!empty($fileName)){
		
	}
```
→ファイルがアップロードされていれば、、、となる。
ファイルがアップロードされていなければ、問題ないので
そのまま通過させる。

アップロードされていて、画像ではないファイルの時に
今回はエラーチェックを走らせる。

--------------------------------------------------------------
```
＄ext = substr($fileName, -3);
```
アップロードされたファイル名の語尾３つを切り取って、`$ext`に保管しておく。
こうすることで拡張子を得ることができるので`$ext`のデータで検査をしていく。

--------------------------------------------------------------

```
if($ext != 'jpg' && $ext !='gif' && $ext !='png'){
	$error['image'] = 'type';
}
```

`$ext != 'jpg' && $ext !='gif' && $ext !='png`は拡張子がjpg,gif,png以外の場合だったら、
というif条件にする。

`$error['image'] = 'type';` 上記以外の場合だったら、imageの$error配列にtypeというエラーを格納する。

--------------------------------------------------------------

```
<input type="file" name="image" size="35" value="test"  />
<?php if ($error['image'] === 'type'): ?>
	<p class=error>※写真ファイルは「.jpg」、「.gif」、「.png」を指定してください</p>
<?php endif; ?>
```

最後に`$error['image'] = 'type';`が入ったらエラーを表示させたいので
表示させたい箇所にエラーコードを記述していく。