OmniAICreator/Qiita-1.07M huggingface dataset:
カスタムB2BアプリをVPPで配信する方法について　ざっくりなメモ

# カスタムB2Bアプリとは
- 取引先や、社内など配信先を限定したい場合の配信方法  
- 例えばアプリを契約したお客様だけに配信したい時が主な使用シチュエーションかと思います。

# 事前準備(アプリ使用側)
- 必要なもの
    - **D-U-N-S Number**  
    企業に一意に割り振られる企業コードのようなものです。  
    この番号は東京商工リサーチのホームページから確認することが可能です。     

    - **Apple Business Manager**  
    企業用のApple IDのようなものです。  
    以前まではApple Deployment Programsというサービスでしたが、2018年からこのサービスに切り替わっています。

## Apple Business Manager登録に必要なもの
   - **D-U-N-S Number**
   - **Apple ID未登録のメールアドレス**   
     企業で利用するのであれば、関係者をまとめてグループアドレスを事前に作成しておくのが良いかと思います。
   - **携帯電話**  
     Apple Business Managerを登録する際に、2段階認証が必須となるため。
   - **クレジットカード**   
   - **企業名**
   - **自社の電話番号**
   - **自社WebサイトのURL**
   - **担当者情報(氏名、勤務先メールアドレス、役職名)**
   - **確認用の連絡先(氏名、勤務先メールアドレス、役職名)**
   
Apple Business Managerに登録すると、Apple Business Managerに登録した名義人に確認の電話が来ます。  
それに答えることでアカウント登録が完了します。  
  
# カスタムB2Bアプリを入手する方法
方法は2種類あります。

  - **引き換えコードによる入手方法**  
  - **管理配布方法**

私は今回前者の方法で配信を行いましたので、前者でのカスタムB2Bアプリの入手方法のみ記載していきます。
また、**2. Apple Business Managerから引き換えコードの購入数を決定する**以降の手順は、アプリケーション提供側の準備が整ってから行うことが可能です。  

**1. Apple IDを取得する**

 - 使用する端末につき1個Apple IDが必要です。
   これは、App Storeでアプリをダウンロードする時にApple IDがないとダウンロードできないのと同じ仕組みです。

**2. Apple Business Managerから引き換えコードの購入数を決定する**  

 - Apple Business Managerにサインインし、引き換えコードをダウンロードします。
 - CSV形式でコードがダウンロードされます。

**3. 引き換えコードをダウンロードする**

 - Volume Purchase Programにサインインする(Apple Business Managerで発行したアカウントでサインインが可能です。)
 - 購入履歴からCSV形式で引き換えコードをダウンロードします。
 
**4. 引き換えコードにアクセスし、アプリをダウンロードする**

 - 引き換えコード(URL)をメールやチャットで使用者に送信します。
 - 使用者はそのURLにアクセスし、アプリをダウンロードします。
   アプリはダウンロード後すぐに使うことが可能です。

# アプリケーション提供側の準備
**1. Apple Developer Programの登録**
アプリを配信するために、必要な開発者用アカウントです。

**2. App Store Connectからアプリを配信する**

 - カスタムB2Bアプリとして配信するための設定があります。
 - 配信したい企業の組織名とお客様DEP IDをApp Store Connectに登録することでそのアカウントのみにアプリを配信することが可能です。
 - Apple Business Managerのサービス開始前に取得したアカウント(Apple Deployment Program)も登録することが可能です。

# 最後に
iOSアプリの開発を始めた2018年後半～これまででアプリの配布方法や管理方法、アカウントやサービスなど色々な変更に悩まされながら開発をしていました。  
変化が激しいため、追記する余裕があればしていきたいと思います。
Emacs でゲームボーイをやりたい時にするたった一つの方法

たまに Emacs でゲームしますよね。 `M-x tetris` とか定番ですが、ゲームボーイで懐しのゲームしたくなる時もありますよね。

https://github.com/vreeze/eboy

**ご利用は自己責任で**

## セットアップ

```shell
git clone https://github.com/vreeze/eboy.git
cd eboy
## byte compile
emacs -q -l eboy-macros.el -l eboy-cpu.el -l eboy.el -batch -f batch-byte-compile *.el
```

## ROM をとってくる

**gameboy rom tetris** とかでぐぐってください

## 遊び方

```shell
emacs -q -l eboy-macros.elc -l eboy-cpu.elc -l eboy.elc
```

`M-x eboy-load-rom` で、 ダウンロードしてきた ROM のファイルを指定すると遊べます

| Gameboy     | Eboy     |
|------------:|---------:|
| Start       | Enter    |
| Select      | Space    |
| B           | D        |
| A           | S        |
| down        | k        |
| up          | i        |
| left        | j        |
| right       | l        |

<img width="1368" alt="スクリーンショット 2019-04-02 12.12.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/40662/193423fa-5dde-5f0f-1f2c-3de0de82667a.png">
Django簡単なアプリケーションが出来るまで⑥

#おさらい
前回までは管理者ページに投稿したpostをブラウザで表示させるところまでをやりました。

#index.htmlに改行コードを追加
前回はpostの題名だけがブラウザに表示されていましたが、今回は画像と、本文も表示させていきたいと思います。
ページがわかりやすくなる様に投稿をもう1つ増やしておきます。
<img width="1105" alt="スクリーンショット 2019-04-02 11.24.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/376889/0811096f-ce03-9652-56a9-49728a0375c6.png">
Second postという題名で追加してきました。
このままだと題名が横並びでわかりにくいでの改行を入れておきましょう。

```html:index.html
<body>
<h1>Welcome to my page.</h1>

<h2>NEW POSTS.</h2>

{% for post in post.all %}
    {{ post.title }}
    <br /><br />
{% endfor %}

</body>
```
body句だけ抜き出しました。{{ post.title }}の下にbr /が追加されていると思います。htmlの改行コードです。

ブラウザページを更新すると、
<img width="1044" alt="スクリーンショット 2019-04-02 11.27.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/376889/44fb04cb-20c6-f6d7-4bea-e998fd1f8f54.png">
この様に題名が分かれて表示され、わかりやすくなりましたね。
以後改行は以上の様に行なっていきます。

#postの本文、時間をブラウザに表示
本文、時間の表示も行なっていきたいと思います。
題名を出した時と同じ様にindex.htmlを編集していきます。

```html:index.html
<body>
<h1>Welcome to my page.</h1>

<h2>NEW POSTS.</h2>

{% for post in post.all %}
    {{ post.title }}
    <br /><br />
    {{ post.published }}
    <br /><br />
    {{ post.body }}
    <br /><br />
{% endfor %}

</body>
```
今回もbody句だけ抜き出しました。models.pyに定義したPost classから各情報を引っ張ってきています。

ブラウザページを更新すると、
<img width="1114" alt="スクリーンショット 2019-04-02 11.52.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/376889/a2d94056-84b2-9a43-6a5a-7d14bb606c19.png">
それぞれの題名、時間、本文が表示されているかと思います。

#画像を表示
最後に画像を表示させたいと思います。
画像の表示はhtmlのimgタグを使うのですが、それだけでは画像は表示されません。
そもそも画像の情報は別のフォルダに保存しています。今回のプロジェクトの例で言いますと、/mediaというフォルダに保存されているかと思います。
なので、画像をどういうurlでどのフォルダから呼び出すかという設定をしてあげないといけないのです。

```Python:プロジェクトフォルダ/urls.py
from django.contrib import admin
from django.urls import include, path
from django.conf.urls.static import static
from django.conf import settings

urlpatterns = [
    path('posts/', include('posts.urls')),
    path('admin/', admin.site.urls),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
```
urls.pyを以上の様に更新してあげましょう。staticに扱うためのimport句、のちにsettingsをいじってurl等適応しますのでそのためのsettingsをimportし、urlpatternsには今までで定義したpathに加えて画像のpathを表示したいので、+のstatic、引数には、のちに定義します、settings.pyから画像url,rootを渡してあげます。

settings.pyを編集していきましょう。
settings.pyファイルの一番下に

```Python:settings.py
MEDIA_URL = '/media/'
MEDIA_ROOT = BASE_DIR
```
を追加します。MEDIA_URLにはmediaというフォルダ名に画像データを保存してありますので、/media/を代入し、MEDIA_ROOTには

```Python:settings.py
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
```
settings.pyの上にあるBASE_DIRを代入してあげます。

ここまで書けたらブラウザページを更新してあげます。
<img width="1224" alt="スクリーンショット 2019-04-02 12.19.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/376889/44c17c48-5618-11eb-45b2-3dd0918604be.png">
(中途半端な画像ですいません😭)
うまく画像も表示されていますね。

この記事はここまで
Twitter APIを爆速で取得したい人へ

# はじめに
この記事も爆速で終わります。なお、確実に爆速取得出来るとは限りませんので、出来なくても文句は言わないでください。

# 例
私の場合です。
・4/1 22:53 Twitter API登録申請
->申請方法などは[この記事](https://www.torikun.com/entry/twitter-developer-api)とか[この記事](https://qiita.com/kngsym2018/items/2524d21455aac111cdee)とかを参照
・4/2 2:14 Twitterさんに「君のuse caseがポリシーに違反してるよ！」と言われる。
・4/2 7:31 起床後に朝から英語で新しいuse caseを返信
・4/2 7:54 無事に承認

ちなみに、違反していたのは、"いいねの自動化"でした。

# 申請する上でのポイント
**深夜~早朝にやろう。**
Twitterさんはサンフランシスコにいるので、サンフランシスコでの勤務時間に合わせましょう。時差はおよそ16, 17時間(時期によって変わる)ので、日本の時間から16, 17時間を引き算してあげると良いです。

今回の例だと、4月の時差は16時間なので、
22:53(日本) = 6:53(サンフランシスコ)
2:14(日本) = 10:14(サンフランシスコ)
7:31(日本) = 15:31(サンフランシスコ)
7:54(日本) = 15:54(サンフランシスコ)

申請時は少し朝早いですが、Twitterさんからメールを受け取った際の時刻は明らかにサンフランシスコの勤務時間中です。しかも、その時間帯にメールを送った際のレスポンスにかかっている時間はわずか23分。**爆速**ですね。

ちなみに申請時にいくつか英作文をすることになるので、英語嫌いな人にとっては苦痛だと思います。Google翻訳を使って頑張りましょう。一応、私がTwitterさんに返信したuse caseを載せておきます。よわよわいんぐりっしゅです。(実際はあまりuse caseが拒否されることはないらしいので、気軽に書きましょう。)

>
Thank you for informing me.
>
Is my violation related to automated likes?  If so,  I change my use case.  I will use Twitter's APIs for gathering information about topics I'm interested in, such as machine learnings and programmings.  I would like to gather the latest tweets and analyze it for myself.
>
Does this use case also violate the policy?

# 最後に
他の方の記事を見ると、たいてい1週間程度かかるのが普通なようです。私が運よく取得出来ただけというのもあり得ますが、まあ、Twitterさんが対応できる時間に申請を送っておくのがベストでしょう。
Laravel5.8でCarbonのImmutable版が使えるようになっていた

これまでQiita上ではあまり触れられてないようですが、Laravel5.8であの忌まわしきCarbonのmutableな挙動に悩まされることから脱却できるようになったみたいです（悩んでたのは俺だけか… 何かしらwrapして使ってるだろうし）。

Carbon Updates Coming to Laravel 5.8
https://laravel-news.com/carbon-2-laravel

ほえー、Carbon2ですか。

一時期は**「Chronosに乗り換えよう！」**みたいな話もよく出てましたが、やっぱり標準で使われているものを使える安心感ってのはありますよね。

とりあえず簡単な動作確認をLaravel5.8上にて行いました。
以下のソースコードは必要なところのみで適当に端折ってます。

```php:test.php
//CarbonImmutableという名前になっていますが馴染みのあるCarbonに変えとく
use Carbon\CarbonImmutable as Carbon;

//テストのために日付をセット
Carbon::setTestNow('2019-04-01 10:00:00');

//まずはImmutableのテスト
$now = Carbon::now();
$tomorrow = $now->addDay();

echo($now->format('Y-m-d h:i:s'));//2019-04-01 10:004:00（←変わってなくてなんとなく直感的だ！）
echo($tomorrow->format('Y-m-d h:i:s'));//2019-04-02 10:00:00

//toMutable()メソッドで途中からMutableにも変更できる
$now = $now->toMutable();//代入せずに$now->toMutable()だけだと意味がないようだ（当たり前？）
$tomorrow = $now->addDay();

echo($now->format('Y-m-d h:i:s'));//2019-04-02 10:00:00（←今まで通りのMutableの挙動）
echo($tomorrow->format('Y-m-d h:i:s'));//2019-04-02 10:00:00

//toImmutable()メソッドで途中からImmutableにも変更できる
$now = $now->toImmutable();//これも代入せずに$now->toMutable()だけだと意味がないようだ（Mutableな挙動の対象って時間だけだったのか？）
$tomorrow = $now->addDay();

echo($now->format('Y-m-d h:i:s'));//2019-04-02 10:00:00（←変わってない）
echo($tomorrow->format('Y-m-d h:i:s'));//2019-04-03 10:00:00
```

ということでした。途中でMutableに変えたりとかあまりしないでしょうけど…

Carbon2への移行にともない細かいところででもろもろ挙動が変わっているところもあるようで、既存のプロジェクトを変更する場合は要注意の模様です。詳しくは以下をご覧になるといいと思います。

Migrate to Carbon 2
https://carbon.nesbot.com/docs/#api-carbon-2
↑
下の方に```In Carbon 1, dayOfYear started from 0. Now it starts from 1.```みたいな意外とはまりそうなことも小さく書いてあります。

[Laravel5.8] CarbonのImmutable版が使えると何が嬉しいのか
https://nextat.co.jp/staff/archives/217
↑
私の記事よりももっと事細かに丁寧な説明で書かれています。

---

とりあえずcopy()メソッドのつけ忘れでしょぼいミスばかりしていた自分みたいなヘボプログラマには、この仕様はすごくうれしいです。
nodejs で firestore を利用した際にプロセス終了できなくなった時の対応

（2019/4/4 追記: そもそも nodejs で実行する環境 (Cloud Functions など)であれば `firebase-admin` を利用する方が何かと都合がよく、`app.delete()` せずともプロセス終了可能だった、というか delete メソッドがそもそもない。）

標題の件。

どうにもプロセスが終了しないので、`process.exit()` してみたが行儀がよくなさそうなのでもう少し調べたら `app.delete()` で終了できるという情報があった。

node process doesn't exit after firebase once
https://stackoverflow.com/questions/18046639/node-process-doesnt-exit-after-firebase-once

> use firebase.delete() instead. firebase.google.com/docs/reference/node/firebase.app.App#delete – pantos27 Jun 13 '17 at 20:58

## コード例

自分のケースだと firestore を利用していたので、`db.app.delete()` することでプロセスを終了することができた。

```js
const db = firebase.firestore()
const usersRef = db.collection('users')

usersRef
  .get()
  .then((snapshot) => {
    // 処理 ...

    // app インスタンスを消す（閉じる）ことによりプロセス終了できるようになる
    db.app.delete()
  })
```
Windows10で、Import-StartLayoutでデフォルトに設定したレイアウトを現在のアカウントでも適用させる

#### はじめに
Windows 10では、Powershellを使って、スタートメニューのレイアウトをエクスポート/インポートすることが出来ます。 しかしMicrosoftの[公式ドキュメント](https://docs.microsoft.com/en-us/powershell/module/startlayout/import-startlayout)によると、`Import-StartLayout`を使って任意のレイアウトをデフォルトに設定しても、それ以降に新しく作られるユーザーアカウントに適用されるのみで、現在すでに仕様されているアカウントのスタートメニューレイアウトは変更されません。
これをどうにか適用させて、変更させてしまいたい。
Windows 10 October 2018 Update (version 1809)で確認しました。
### やる
3ステップです。`.ps1`ファイルにすると楽です([`Set-ExecutionPolicy`](https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.security/set-executionpolicy)を忘れずに)。

```PowerShell:Powershell
Import-StartLayout -LayoutPath 'C:\Temp\Layout.xml' -MountPath 'C:\'
```
```PowerShell:Powershell
Remove-Item 'HKCU:\Software\Microsoft\Windows\CurrentVersion\CloudStore\Store\Cache\DefaultAccount\*$start.tilegrid$windows.data.curatedtilecollection.tilecollection' -Force -Recurse
```
```PowerShell:Powershell
Get-Process Explorer | Stop-Process
```

### なにをしているか
[RegistryChangesView](https://www.nirsoft.net/utils/registry_changes_view.html)などのツールを使って調べてみると、スタートメニューに変更を加えると(タイルの移動、グループ名の変更など)、`HKEY_CURRENT_USER`以下のあるレジストリキーが変更されていることが分かります。キーにはPCごとに固有と思われるIDが含まれているので、上記のように`*(ワイルドカード)`でPowerShellに見つけてもらっています。
そして一度このキーを削除した後に、Windowsの`Explorer`プロセスを再起動すると、インポートしたレイアウトが、現在ログインしているアカウントのスタートメニューに適用されます。

### わからないこと、やりたいこと
* 上記レジストリのData値(`REG_BINARY`)の中身の意味。
    * 海外のフォーラムも調べてみたんですが、Decode出来た人はまだいないみたいです。
    * やってることがバッドノウハウの域なので、系統立てて調べたい。
* 現状のスタートメニューのタイルのグループ名をスマートに調べる方法。
    * たぶん上記がわからないと無理...。
NestJS: ソースコードを書き換えたとき、サーバが自動再起動するようにする

NestJSで、開発中にソースコードが書き換わったとき、サーバが自動的に再起動するようにするには次のコマンドでサーバを起動する:


```
yarn start:dev
```

NestJSにはnodemon(ソースを監視して、自動でサーバーを再起動してくれるツール)が組み込まれており、なおかつ、npm scriptに`"start:dev": "nodemon"`が定義されているので、たったこれだけでOKです。
【GAS】クラスの書き方

## クラスの書き方

### 記述方法
```javascript:test.ga
(function (global) {

  /**
   * コンストラクタ
   * @constructor
   */
  var Test = function () {
  };

  /**
   * メッソド
   * @returns {boolean}
   */
  Test.prototype.main = function () {
    return true;
  };

  global.Test = Test;

})(this);
```

---
### サンプル
```javascript:test.ga
function _runTest() {
  // Testクラスのインスタンス化
  var test = new Test();
  // Testクラスのmainメソッドを実行
  test.main();
  // Testクラス内のメンバ変数に設定する
  test.setAaa('あああ');
  // Testクラスン内のメンバー変数を出力する
  test.output();
}

(function (global) {

  /**
   * @constructor
   */
  var Test = function () {
    /**
     * コンストラクタ
     *
     * 「var test = new Test();」のタイミングで実行（インスタンス生成時に実行）
     */
  };

  /**
   * @returns {boolean}
   */
  Test.prototype.main = function () {
    /**
     * メソッド
     *
     * 「test.main();」のタイミングで実行
     */
    Logger.log('mainが実行されました');
    return true;
  };

  /**
   * @returns {boolean}
   */
  Test.prototype.setAaa = function (value) {
    Logger.log('setAAAが実行されました');
    /**
     * メンバー変数設定
     *  引数「value」をメンバー変数に設定する
     */
    this.aaa = value;
    return true;
  };

  /**
   * @returns {boolean}
   */
  Test.prototype.output = function () {
    Logger.log('outputが実行されました');
    /**
     * メンバー変数をログに出力する
     */
    Logger.log(this.aaa);
    return true;
  };

  global.Test = Test;

})(this);
```
Anacondaで32bitのPython環境を作る

# 背景

ラベルプリンタをPythonからCOM経由で印刷するために32bit版のPython環境が必要だった
[参考](https://qiita.com/flowphantom/items/8a15c191940ffbce78d1)
# 環境

+ windows10(64bit)
+ Anaconda(64bit)

この上にPython3.6(32bit)を構築します

# 環境構築手順

**CONDA_FORCE_32BITを設定するやり方は古くなっています [参考](https://github.com/conda/conda/issues/1744#issuecomment-281804830)**


1. 環境変数CONDA_SUBDIRをwin-32に設定
2. conda infoコマンドでplatform : win-32になっていることを確認
2. AnacondaでPythonの仮想環境を作成
3. 作った仮想環境をActivateして確認

Pythonを起動してMSC v.1900 32 bit (Intel)が見えたらインストールできている

```
$ set CONDA_SUBDIR=win-32
$ conda create -n py36_32bit python=3.6.5
$ conda activate py36_32bit
$ python
Python 3.6.8 |Anaconda, Inc.| 
(default, Feb 21 2019, 18:28:22) [MSC v.1916 32 bit (Intel)] on win32

```
TeamSpirit勤怠入力自動化bookmarklet

https://gist.github.com/darai0512/925591b7d7bac378fbad497d1ae5ed68

# 概要

TeamSpiritの勤怠入力自動化bookmarklet作ったら労務に怒られました。

よって私はもう使いませんが、使えそうな人はどうぞご自由に。

出勤退勤時間は変えてね。[`<dialog>`要素](https://developer.mozilla.org/ja/docs/Web/HTML/Element/dialog)で最初だけ対話させて設定できるようにしようとか考えてたよ。

# 特徴

- 出勤日のみ入力
  - `.day_time0`で実現
- 入力済の欄は上書きしない

# コードについて

- 入力決定ボタンの`'click'`イベント内でXHRが飛ぶため非同期に
- 次のモーダルを開くのが早いとエラーで止まる
- timerで入力フォームのモーダルが消えたかを定期ポーリング
  - 妥協案。他に検討した案を下記に残す

## Event追加で検知

- `'click'`イベントの非同期処理後に何かイベントが発火していたら、addEventListenerで連続的に処理できそう
- [`monitorEvents(document)`](https://developers.google.com/web/tools/chrome-devtools/console/command-line-reference?hl=ja#monitoreventsobject-events)で調べたが利用できそうなものはなかった

## [MutationObserver](https://developer.mozilla.org/ja/docs/Web/API/MutationObserver)

```js
const observer = new MutationObserver((mutations) => {
  mutations.forEach(console.log);
});

observer.observe(document.body, {
  attributes: true,
  childList: true,
  subtree: true,
  attributeOldValue: true
});
```

debug後はリロードか監視中止を忘れずに

```js
observer.disconnect();
```

DOMの要素削除に限れば`document.body.addEventListner('DOMNodeRemoved', cb)`でもdebugできそう

- モーダルが閉じた後の特徴的なDOMの変更があれば検知時に次の処理に移行すれば良い
- モーダル内の要素（`#dlgInpTimeOk`など）の削除を検知でできると思ったがうまくいかなかった

## XHRのレスポンスをHook

- 試してないけど筋は良さそう
  - `document.body.addEventListner('loadend', cb)`とか？

# 中身

https://gist.github.com/darai0512/925591b7d7bac378fbad497d1ae5ed68 にbookmarklet形式とか置いてます

```js
(() => {
  const targets = document.querySelectorAll('td.dval.vst.day_time0');
  const len = targets.length;
  if (len === 0) return;
  let i = 0;
  const id = setInterval(() => {
    if (document.querySelector('#dlgInpTimeOk') !== null) return;
    targets[i++].click();
    const st = document.querySelector('#startTime');
    if (st.value === '') st.value = '12:00';
    const en = document.querySelector('#endTime');
    if (en.value === '') en.value = '20:00';
    document.querySelector('#dlgInpTimeOk').click();
    if (i === len) clearInterval(id);
  }, 1000);
})()
```
TypeScript製のWebアプリケーションフレームワーク「Nest」でHello Worldする

本稿では、TypeScript製のWebアプリケーションフレームワーク「Nest」でHello Worldする方法を解説する。

## 本稿から得られるもの

* `yarn`を使った`nest`コマンドのインストール方法
* `nest`コマンドを使った新規プロジェクトの生成方法
* アプリケーションサーバの起動方法

## nestコマンドのインストール方法

```
yarn global add @nestjs/cli
```

```
$ nest -V
6.2.1
```

## 新規プロジェクトの生成

`nest new プロジェクト名`で新規プロジェクトを生成する。下の例では、`hello-world`というディレクトリが新規作成され、そこにファイル群が生成される。

```
nest new hello-world
```

パッケージマネージャを`npm`にするか`yarn`にするか聞かれる。これは好みになる。僕は`yarn`を使っているので`yarn`を選択した。

<img width="556" alt="_Volumes_dev_finsafe2_hello-world__zsh_.png" src="https://qiita-image-store.s3.amazonaws.com/0/889/977c5186-229b-c211-21cd-6ab02e9e9796.png">


生成されたファイル:

```
./hello-world
├── README.md
├── nest-cli.json
├── node_modules
├── nodemon-debug.json
├── nodemon.json
├── package.json
├── src
│   ├── app.controller.spec.ts
│   ├── app.controller.ts
│   ├── app.module.ts
│   ├── app.service.ts
│   └── main.ts
├── test
│   ├── app.e2e-spec.ts
│   └── jest-e2e.json
├── tsconfig.build.json
├── tsconfig.json
├── tslint.json
└── yarn.lock
```

## アプリケーションサーバの起動方法

アプリケーションサーバを起動するには、プロジェクトのディレクトリに移動して、`yarn run start`を実行する:

```
cd hello-world
yarn run start
```

<img width="721" alt="hello-world__yarn_run_start__node_.png" src="https://qiita-image-store.s3.amazonaws.com/0/889/9946a99d-50c9-5d93-e5c6-232508bfe042.png">


サーバが起動したら、 http://localhost:3000/ にアクセスする。Hello Worldが表示される。

> <img width="582" alt="Screen Shot 2019-04-02 at 11.42.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/889/506f0dc5-80ed-050d-77a6-01e7999fc79f.png">
【メモ】textareaの改行数でrow数を増減する

行の折返しで行数が増えた場合におかしなことになるのでボツｗｗｗ
改行数だけで調整できればいいぱてぃーんのみｗ

```javascript
function addLinesAutomatic(targetNode, defaultLineCount){
  document.addEventListener('DOMContentLoaded', function(){
    if(document.getElementById(targetNode) != null){
      var target = document.getElementById(targetNode);
      function lineCount(){
        var lineBreaks = target.value.match(/\r\n|\n/g);
        if(lineBreaks != null){
          return lineBreaks.length + 1;
        }else{
          return defaultLineCount;
        }
      };
      function changeAttRows(){
        target.setAttribute('rows', lineCount());
      };
      changeAttRows();
      target.addEventListener('keyup', changeAttRows);
    }
  }, false);
};
addLinesAutomatic('notice_content', 5);
```

そして改良型（不完全）
改行数ではなく要素の高さをコントロールしちゃおうってバージョン。
増やすのは正常に動作するけど、減らしたときの動きが未実装です。

```javascript
function automaticHeight(targetNode){
  document.addEventListener('DOMContentLoaded', function(){
    if(document.getElementById(targetNode) != null){
      var target = document.getElementById(targetNode);
      function getScrollHeight(){
        return target.scrollHeight;
      }
      function changeHeight(){
        target.style.height = getScrollHeight() +'px';
      }
      changeHeight();
      target.addEventListener('keyup', changeHeight, false);
    }
  }, false);
};
automaticHeight('notice_content');
```
ターミナル操作の知識[メモ]

#はじめに

勉強を始めたばかりのころを思い出し、コマンド操作でどうやるんだっけ？と詰まる事が多かった。
初学者からすれば、ターミナルを使うのが結構ネックだったりする。
そんな昔の自分に向け、初心者の方にこれはよく使うから押さえておいて欲しい部分をピックして記事にまとめました。

# 前提条件

(1)progateのターミナルを終了している。
(2)Ruby On Railsをフレームワークでアプリを作っている

# コントローラー作成編


###コントローラー作成

```
rails g controller hoges aaa #aaaはアクション名　コントローラは複数形とする
```

###コントローラー削除

```
rails destroy controller #dでも省略可能
```

#その他


###gemファイル更新

```
bundle install
```



###コンフリクトしないように
gemファイルのバージョンが違っても、コンフリクトしないようにするためにある
基本的につける認識


```
bundle exec 
```

# データーベース編

###データーベースの作成

```
bundle exec rake db:create
```
###データーベースの削除

```
bundle exec rake db:drop
```

#モデル編

###モデルの作成

```
rails g model user name:string age:integer
```

###モデルの削除
マイグレーションファイルをロールバックして戻す！

```
rails destroy model user
```

###マイグレーションファイルの反映状況確認

```
bundle exec rake db:migrate:status
```

###マイグレーションファイルの更新

データベースに反映する時はこれを使用。
しないとエラーになるから気をつけて。

```:ターミナル
bundle exec rake db:migrate
 ```



###指定してdown状態にする

```:ターミナル

rails db:migrate:down VERSION=20181019135434

```

###マイグレーションファイルの戻し
```:ターミナル
rake db:rollback

3つ前に戻す
rake db:rollback STEP=3 
 ```

###マイグレーションファイルにテーブルやカラムの追加、削除

```ruby:ファイルはdb-migrateにある
def change

add_column :テーブル名, :カラム名, :データ型　　
remove_column :テーブル名, :カラム名, :データー型

end
```
CentOS7でProxyを設定する

ちょいとおもいたってALMiniumの環境を作っています。
できれば新しいOSで立ち上げたいと思い、CentOS7で環境構築中。。
手順は一工夫いるようで、備忘録的にメモを残します。

初歩的なところで
#CentOS Proxy設定
Yum
/etc/yum.confに以下を追加
`proxy=(proxy host)
proxy_username=(proxy user)
proxy_password=(proxy password)`

※認証付きプロキシならこのような設定になります。

`export HTTP_PROXY=(proxy host)
export HTTP_PROXY=http://(proxy user):(proxy password)@(proxy host)`
※わたしパスワードに@マークが含まれてて、設定の時にバタバタしましたが、@マークは%40でURLエンコードするとうまくいきます。
Terraformでremote stateを別のremote stateに移動する方法

Terraformでremote stateを別のremote stateに移動する方法
## 課題
- Terraformであるremote stateにあるresourceやmoduleを別のremote stateに移動する時ってあると思います。`tarraform state rm` した後に、`terraform import` をしても良いけれども、`terraform import` はすべてのresourceに対応しているわけじゃないのでそんな時に使えたりします。

## 手順

### 1. 対象のstateをlocalに移動する

```bash
terraform state mv --state-out=local.tfstate \ 
                   module.sample module.sample
```
   - `--state-out` オプションで指定したpathにstateを出力する。

### 2. 移動先のstateのdirに移動して、remote stateを取得する。
```bash
terraform state pull > remote.tfstate
```
   - `terraform state pull` でremote stateをcopyすることが出来るのでファイルに出力する

### 3. localに出力したstateに移動させたいmoduleのstateを出力する
```bash
 terraform state mv -state=local.tfstate \
                   --state-out=remote.tfstate \
                   module.sample module.sample 
```
- `-state` オプションは指定したstateを元に読み込む、`--state-out` オプションはmvしたstateを出力して、既存のstate fileを指定すると差分をmergeして出力してくれる。

### 4. 修正したstateをremote stateにpushする
```bash
terraform state push remote.tfstate
```
- `terraform state push FILENAME` は指定したファイルをremote stateに反映させることが出来る。

## おわりに
- あれー？出来たような気がするんだけどなーと思いながらも、意外とやり方書いてあるのが見当たらなかった。
git pull と git push ができなくなった。備忘録

# fatal: The current branch feature/your_branch has no upstream branch. と出てきた。
現在のブランチが upstream (リモートのgit)　にないよ。と言われた。
そんなはずはない。何回かgit pushもしたことあるし, pullもしたことあるのに！

リモートブランチの追跡が無かったようです。
参考リンク：[git pushとブランチの追跡](https://qiita.com/takaaki4cards/items/2397f7329aed998b28a3
)

```
$ git push -u origin <branch>
```
> カレントブランチの変更をリモートにpushしつつ、そのブランチを追跡できるようになる。

これを記述したら　pull も push もできるようになりました。
データ分析業務を始めました。

今年２月にコンサルティング会社に転職しました。
これまで研究開発の業務をしてきましたが、もっとビジネスのコアで活動したく、転職を決めました。

そして、新しい会社では、データ分析を主業務として行うことになりました。
主に、お客さんの会社の工場やマーケティングのデータを分析し、経営課題を解決する指針を経営陣に伝えることが仕事です。


データ分析とは何か？という問いに対し、戦略的思考を取り入れ、短期間でデータ分析ができるようにする道順を書いてみたいと思います。

崔
Herokuでzipファイルをrails db:seedしたらエラーで怒られた話・

タイトルのままなのですが、理由がわかなかったため、
備忘録と、アドバイス頂きたく、投稿します。

・やりたかった事。
都道府県を初期データとして投入したい。

下記の記事を参考にして、都道府県を事前投入しました。
https://qiita.com/ultrasevenstar/items/bcf1601e2269e46e1e9b


>郵便番号データを郵便局のサイトからダウンロード
ダウンロードしたZIPファイルを解凍し保存
保存したCSVファイルを読み込みMySQLに保存

ローカル環境では問題なくデータを投入できてハッピーだったのですが、
herokuにUPしようとしたら問題が、、、

```
$ heroku run rake db:seed
Running rake db:seed on ⬢ withsports... up, run.1236 (Free)
D, [2019-03-19T12:42:33.522370 #4] DEBUG -- :    (1.9ms)  SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
rake aborted!
LoadError: cannot load such file -- zip
/app/vendor/bundle/ruby/2.5.0/gems/bootsnap-1.3.2/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:32:in `require'
:
:
/app/bin/bundle:3:in `load'
/app/bin/bundle:3:in `<main>'
Tasks: TOP => db:seed
(See full trace by running task with --trace)
```

seedが走らない。。。！
zipが読み込めないだと、、、、！

一旦,直接、seed.rbに
Area.create(id: 1, name: "北海道")
を書き込んで解決。

大量のデータを読み込むときはスマートじゃないなと思うので、
次はCSVの作成&読み込みにしようと思います。

 Herokuではzipファイルを読み込目無いことに対して
良い情報を見つけられなかったのでなにかアドバイスいただければ幸いです。
【Markdown】markdownの書き方メモ

マークダウンメモ

## 見出し 
### 記述例
```
# 見出し1
## 見出し2
### 見出し3
#### 見出し4
##### 見出し5
```

### 表示例
![image.png](https://qiita-image-store.s3.amazonaws.com/0/363906/041bf5d0-7187-0e16-16bb-cf27c3ed8b21.png)

---
## コード
### 記述例
```
```php5:test.php
function test() {
    echo 'test';
}
```@
```
※最後の@は削って記述する

### 表示例
```php5:test.php
function test() {
    echo 'test';
}
```

---	
## 追加用テンプレート（）
### 記述例
```
マークダウン
```

### 表示例
【PHP】新元号も発表されたし2019年の祝日に対応した祝日取得ライブラリ「Yasumi」を更新しませんか

# 2019年の日本の祝日に対応

祝日を簡単に取得できるライブラリ[azuyalabs/yasumi](https://github.com/azuyalabs/yasumi)が
2019年の日本の祝日に対応した[2.1.0](https://github.com/azuyalabs/yasumi/releases/tag/2.1.0)をリリース🎉しましたので確認してみましょう

Yasumiについては以下を参照
つ [【PHP】日本の祝日を扱うときは「Yasumi」を使ってみてはどうですか - Qiita](https://qiita.com/sola-msr/items/7901835b3bfe145de033)

# インストール（アップデート）

composerからインストール
既に1.8系を入れてる人もこのタイミングで上げておきましょう

```
composer require azuyalabs/yasumi 2.1.0
```

# 2019年の祝日を取得してみる

```php
use \Yasumi\Yasumi;

$holidays = Yasumi::create('Japan', '2019', 'ja_JP');

foreach($holidays as $holiday) {
    echo $holiday . ':' . $holiday->getName() . PHP_EOL;
}
```

以下、[tinker](https://github.com/laravel/tinker)(laravel用REPL)で実行した結果

```
$ php artisan tinker
Psy Shell v0.9.6 (PHP 7.2.5-1+ubuntu18.04.1+deb.sury.org+1 — cli) by Justin Hileman
>>> use \Yasumi\Yasumi
>>> $holidays = Yasumi::create('Japan', '2019', 'ja_JP');
=> Yasumi\Provider\Japan {#2898}
>>> foreach($holidays as $holiday){ echo $holiday . ':' . $holiday->getName() . PHP_EOL; }
2019-01-01:元日
2019-01-14:成人の日
2019-02-11:建国記念の日
2019-03-21:春分の日
2019-04-29:昭和の日
2019-04-30:国民の休日
2019-05-01:即位の日
2019-05-02:国民の休日
2019-05-03:憲法記念日
2019-05-04:みどりの日
2019-05-05:こどもの日
2019-05-06:振替休日 (こどもの日)
2019-07-15:海の日
2019-08-11:山の日
2019-08-12:振替休日 (山の日)
2019-09-16:敬老の日
2019-09-23:秋分の日
2019-10-14:体育の日
2019-10-22:即位礼正殿の儀
2019-11-03:文化の日
2019-11-04:振替休日 (文化の日)
2019-11-23:勤労感謝の日
>>>
```

ちゃんと4月5月の10連休にも対応してるみたいです

つ [2019年（平成31年・令和元年）カレンダー(祝日・六曜・月齢)｜便利コム](http://www.benri.com/calendar/)

# おわり
- 令和かっこいい
- 10連休ばんざい

# 参考URL
- [azuyalabs/yasumi](https://github.com/azuyalabs/yasumi)
- [2019年（平成31年・令和元年）カレンダー(祝日・六曜・月齢)｜便利コム](http://www.benri.com/calendar/)
- [[Composer]composer updateで特定パッケージのみ更新する - akamist blog](https://akamist.com/blog/archives/1320)
メモ用「正12角形」

```
# https://python.atelierkobato.com/polygon/
# matplotlib.pyplotをインポート
import matplotlib.pyplot as plt

# matplotlib.patchesをインポート
import matplotlib.patches as pat

# Figureを作成
fig = plt.figure(figsize=(5, 5))

# FigureにAxes(サブプロット)を追加
ax = fig.add_subplot(111)

# 正六角形の描画
# 中心座標(0.5, 0.5), 半径0.4
# 塗り潰しはブルー、縁の色はブラック
cp = pat.CirclePolygon(xy = (0.5, 0.5), radius = 0.4,
resolution = 12, fc = "blue", ec = "black")

# Axesに正多角形を追加
ax.add_patch(cp)
```
Excelファイルをまとめてcsvに変換したい！

#Excelシートをcsvファイルに出力する。
・大量のシートを含むExcelファイルを大量にcsvにしなければならない！
　
...となったときに自動で処理できるVBAのコードを書いてみました。:relaxed:

**使用したのは*Excel2016*です。*Office365のExcel*でも動作確認済です。**

実現する要件は以下のように。

1.　フォルダ内のすべての.xlsxファイルについて処理を行う。
2.　.xlsxファイル内の全てのシート（非表示シートを含む）を　**"シート名".csv**　という名前で出力する。
3.　csvの文字コードはUTF-8。

書いてみると以下のようになりました。


```vb
Sub exceltoCSVutf8()

	Dim myfilepath As String
	Dim myfilename As String

	myfilepath = ActiveWorkbook.Path

	myfilename = Dir(myfilepath & "\" & "*.xlsx")
	Do Until myfilename = ""           'フォルダ内のExcelファイルについて処理

		Workbooks.Open myfilepath & "\" & myfilename

		Dim k As Long

		For k = 1 To ActiveWorkbook.Worksheets.Count

			Dim ws As Worksheet
			Set ws = ActiveWorkbook.Worksheets(k)

			Dim csvfile As String
			csvfile = ActiveWorkbook.Path & "\" & ActiveWorkbook.Worksheets(k).Name & ".csv"  'csvファイル名を定義


			Dim adoSt As Object                          'ADODB.Streamオブジェクトを生成
			Set adoSt = CreateObject("ADODB.Stream")

			Dim obob As String
			Dim i As Long, j As Long
			i = 1

			With adoSt
				.Charset = "UTF-8"
				.LineSeparator = adCRLF
				.Open

				Do While ws.Cells(i, 1).Value <> ""

					obob = ""

					j = 1
					Do While ws.Cells(i, j + 1).Value <> ""

						obob = obob & ws.Cells(i, j).Value & ","
						j = j + 1

					Loop

					obob = obob & ws.Cells(i, j).Value

					.WriteText obob, adWriteLine

					i = i + 1    'ExcelのセルA1から順番に取得、1行目が終わったら2行目へ...

				Loop

				.SaveToFile csvfile, adSaveCreateOverWrite
				.Close

			End With

		Next

		ActiveWorkbook.Close
		myfilename = Dir()

	Loop

	MsgBox "究極のCSVを堪能した"

End Sub
```


標準の出力機能で出力すると、文字コードがShift-JISで固定となってしまいました。
.Charsetで"UTF-8"を指定すればヨユー！！

...とか思っていたのですが、思わぬ壁にぶち当たりました。（エラーが出て動きません）



この問題は、”ADODB.stream"というオブジェクト使用することで解決しました。
まずADODBオブジェクトにデータを流し込んで、そのあとCSVに出力するという流れです。


##必要な設定##

ADODB.streamを使うためには、Visual Basicの参照設定を調整する必要があります！

Visual basic　→　ツール　→　参照設定　と進み、
　　　　
Microsoft Active X Data Objects 6.1 Library

をオンにします。この設定をしないと実行できません。

 

##参考##

この記事を書いている人間はITに疎い初心者です。
同じような境遇の方に共有できることは共有したい！という思いを込めて以下に役に立つ（であろう）ことを書いておきます。

・フォルダ内のExcelファイルすべてに同様の処理をしたいとき

```vb
Dim myfilepath As String
Dim myfilename As String

myfilepath = ActiveWorkbook.Path

myfilename = Dir(myfilepath & "\" & "*.xlsx")
Do Until myfilename = ""                        'フォルダ内のExcelファイルについて処理

	Workbooks.Open myfilepath & "\" & myfilename

	'（ここに処理を記述）

Loop
```

このように書けば、次々とフォルダ内のExcelファイルを取得し、アクティブなブックとして扱ってくれます。

（ほかにも追記予定）



長文になってしまいましたが、何かのご参考になれば幸いです。




ADODB.streamに使用できる機能等は以下のようなページを参照しました。

https://k-sugi.sakura.ne.jp/it_synthesis/windows/vb/3650/
Serverless Framework + Cognitoユーザプールの連携


# 概要
## API Gateway + LambdaでAPIを作って、congnitoユーザプールでログインさせる。
+ Cognitoユーザプールを作る
+ API Gatewayに、Cognitoユーザプールを登録して関連づける
+ Congnito Endpointでログインさせて、id_tokenを受け取る
+ id_tokenを検証する
+ id_tokenをAPI Gatewayに渡して、APIを呼び出す

## Cognitoユーザプールを作る

### アプリクライアント作成 

- コールバックURL localhost:8080
- フロー implict grant
- スコープ openid

### ドメイン名を設定しておく

## ServerlessFramework apiに認証かける

``` serveress.ym

functions:
  hello:
    handler: handler.hello
    events:
      - http:
          method: get
          path: hello
          authorizer:
            arn: arn:aws:cognito-idp:ap-northeast-1:xxxxxx:userpool/ap-northeast-1_xxxxxxxx

```

## Congnito Endpointでログインさせて、id_tokenを受けとる
このURLでログイン、コールバックURLへid_tokenが渡ってくるので、ゲットする
https://{Cognitoに設定したドメイン}/login?response_type=token&client_id={cognitoログインID}&redirect_uri={リダイレクトURL}

## id_tokenを検証
id_tokenは.(ドット)区切り。
各パートをbase64で復元すると、ログインIDとかメアドがgetできる。

- 検証方法:未記載

## id_tokenをAPI Gatewayに渡して、APIを呼び出す

``` hoge.ts
# id_tokenを渡す
const headers = {
      'content-type': 'application/json',
      Authorization: id_token
    };
const res = await Axios.get(`${ホスト名}/hello`, { headers: headers })
```
数値添え字配列の結合はarray_mergeで


毎回ぐぐってる気がするので書いときます^^;

- キーはキープされません。
- キーは0から振り直されます。


```php
<?php
$base = ['a', 'b', 'c'];
$add = ['d', 'e', 'f'];

$merge = array_merge($base, $add);
var_dump($merge); // ['a', 'b', 'c', 'd', 'e', 'f']

// 数値添え字が同じでも別々でも
$base = [0 => 'a', 1 => 'b', 2 => 'c'];
$add = [0 =>'d', 3=>'e', 4=>'f'];
$merge = array_merge($base, $add);
var_dump($merge); // ['a', 'b', 'c', 'd', 'e', 'f']

?>
```

paiza IOでの実行例[数値添え字の配列結合(PHP)](https://paiza.io/projects/yHf9y4fRyGvsZUfHdsXs1A)
初めての３Dプリンタ

ここはソフトエンジニアのためのコミュニティです。自分もソフトの技術者をやってきました。
最近３Dプリンタを使い始めたのですが、最初の造形で、ミスをいくつかしました。最初に分かったことを書きます。ハードウェアの畑のコミュニティだったら、恥ずかしくて、誰もこんな初歩的なことを書いたりしないと思いますけど。

まず、条件：
・プリンタは、3、４万で、AnyCubic I3 Megaという機種を購入しました。
・３D設計は、Fusion360という無料ソフトを使用しました。入門ビデオ等みましたが、いろいろ機能があってとてつもなく難しそうです。ですが、やってみたら、基本、（１）平面を決めて「スケッチ」と呼ばれる2次元形状を作成し、（２）それを奥ないし手前方向に「押し出し」操作をする、というステップを組み合わせ繰り返すことで、イメージした立体が大体作れます。「スケッチ＋押し出し」を組み合わせる手順は、順番によってはうまくいかず、手順を考えるのはまるでプログラミングです。
・３Dプリンタで、熱を持つ電子パーツを収める筐体（要するにプロトタイプのパーツ収納ケースです）を作るため、熱に強いABS樹脂フィラメントというのを別途買いました。

最初の造形で分かったこと。

-　壁や支持板などは、最低２ｍｍの厚さがないと、ペラペラになる。最初はフィラメントをケチったのと、厚さに関し参考になる情報が得られなかったので、1ｍｍにしたらペラペラでした。２ｍｍだと壊れそうもない感が出ます。

-　下に支えのない天井、梁状のものは、長さ３ｃｍくらいにとどめる。このクラスの３Dプリンタは、フィラメント材料を溶かしてヘッドから少しづつ吐き出しながら、そのヘッドの位置をXYZ方向に移動させて（水平XY位置はモデルから最適なヘッド軌跡を計算し、垂直Z位置は少しづつ上へ）、溶き出た材料が自然冷却しながら固まっていく、方式をとっています。そのため、下に支えがないものは、ヘッドノズルの直下にすでに焼き付けたパーツが存在せず、空中に焼きつける状態になります。その場合、ドロッと出して急いでヘッドノズルを動かしてひもを作って、次に急いで先のひもと隣接するひもを吐き出して、...みたいなかわいらしい動きをします。その結果、下に支えがない形状が長いと、垂れさがってしまいます。長い梁は３ｃｍくらいの間隔の柱を設けるとか、箱状のものは上部と下部を別にして、上部の蓋は上下逆さにしてプリントし、できあがってから、組み立てる、などしないとだめです。-> [2020.04.19追加] Curaという、造形モデルファイルstlを、プリンタを直接駆動するGcode（機械語みたいなもん）に変換するSlicingソフトに、ある角度以上傾斜がある場合にはそこに薄い線上の足をつける、という印刷Optionがあります。印刷後に手ではぎ取れる程度の支えです。それが便利です。

-　２～３ｍｍ程度の細かい造形を複数組み合わせるのは無理。底面のねじの出っ張りを隠すため、底面の上面に直径３ｍｍの山を作って、底面の下面に直径２ｍｍの谷を
掘って、などとやろうとしましたが、無理でした。このクラスの廉価な３Ｄプリンタではそこまでの精度は出ないようです。

-　複数パーツを後で組み合わせる場合、Fusion360で、それぞれのオブジェクトを別々にデザインにするのではなく、1つのデザイン内で複数オブジェクトを設計したほうがよい。パーツ同士の寸法を注意深く合わせたつもりでも、実際にプリントした後で組み合わせたら寸法が合わなかった、ことがありました。結局やすりやカッターのお世話になった。1つのデザインの中に複数オブジェクトを描くようにすれば、寸法合わせ検証が楽です。プリントする際は、それぞれのオブジェクトを選んで1個ずつプリントできます。また、噛み合わせは１ｍｍくらいの誤差が出るという前提で設計したほうがいいです。
rex0220 計算式プラグイン 和暦変換

令和が発表されましたので、kintone アプリの和暦変換ネタです。
[計算式プラグイン](https://qiita.com/rex0220/items/ae83c6d5ce50ff7a9a73)を使って、和暦変換してみます。

# 和暦変換アプリ例

日付項目と元号、和暦年を配置します。
元号は、文字列項目またはドロップダウン項目が使えます。
テーブルにすると、元号の変わり目のチェックも簡単です。
※LET関数を使った計算式を追加しました。(2024/12/10)


<img width="293" alt="2019-04-02_10h44_15.png" src="https://qiita-image-store.s3.amazonaws.com/0/100572/6af3197b-f33c-0d60-39dc-a32969f76af2.png">

# 計算式プラグイン設定
テーブル内項目もフィールドコードを変えるだけでOKです。

<img width="1128" alt="2019-04-02_10h48_47.png" src="https://qiita-image-store.s3.amazonaws.com/0/100572/fa0ef96d-458c-4335-d107-318921b041c0.png">


# 元号
元号の始まる日付で、元号を切り替えます。

```.js
IF(日付,
IFS(DATE_FORMAT(日付)>="2019-05-01","令和",
DATE_FORMAT(日付)>="1989-01-08","平成",
DATE_FORMAT(日付)>="1926-12-25","昭和",
DATE_FORMAT(日付)>="1912-07-30","大正",
DATE_FORMAT(日付)>="1868-01-25","明治"))
```

# 和暦の年
元号の始まる日付で、和暦の年を計算します。
計算の基準日は、元号の始まる年の1月1日にします。

```.js
IF(日付,
DATE_DIFF(
IFS(DATE_FORMAT(日付)>="2019-05-01","2019-01-01",
DATE_FORMAT(日付)>="1989-01-08","1989-01-01",
DATE_FORMAT(日付)>="1926-12-25","1926-01-01",
DATE_FORMAT(日付)>="1912-07-30","1912-01-01",
DATE_FORMAT(日付)>="1868-01-25","1868-01-01"),
日付,"years")+1)
```

# LET 関数を使った和暦変換

LET関数を使うとわかりやすく記述できます。

```.js
// 元号 DROP_DOWN
LET(
  fDate, DATE_FORMAT(日付), // 日付取得
  IFS(
    fDate >= "2019-05-01", "令和",
    fDate >= "1989-01-08", "平成",
    fDate >= "1926-12-25", "昭和",
    fDate >= "1912-07-30", "大正",
    fDate >= "1868-01-25", "明治",
    "" // 無効日
  ),
)

// 年 NUMBER
LET(
  fDate, DATE_FORMAT(日付), // 日付取得
  eDate, IFS(
    fDate >= "2019-05-01", "2019-01-01", // 令和
    fDate >= "1989-01-08", "1989-01-01", // 平成
    fDate >= "1926-12-25", "1926-01-01", // 昭和
    fDate >= "1912-07-30", "1912-01-01", // 大正
    fDate >= "1868-01-25", "1868-01-01", // 明治
    "" // 無効日
  ),
  IF(eDate, DATE_DIFF(eDate, fDate, "year")+1) // 年差分
)

// Table.元号T DROP_DOWN
LET(
  fDate, DATE_FORMAT(日付T), // 日付取得
  IFS(
    fDate >= "2019-05-01", "令和",
    fDate >= "1989-01-08", "平成",
    fDate >= "1926-12-25", "昭和",
    fDate >= "1912-07-30", "大正",
    fDate >= "1868-01-25", "明治",
    "" // 無効日
  ),
)

// Table.年T NUMBER
LET(
  fDate, DATE_FORMAT(日付T), // 日付取得
  eDate, IFS(
    fDate >= "2019-05-01", "2019-01-01", // 令和
    fDate >= "1989-01-08", "1989-01-01", // 平成
    fDate >= "1926-12-25", "1926-01-01", // 昭和
    fDate >= "1912-07-30", "1912-01-01", // 大正
    fDate >= "1868-01-25", "1868-01-01", // 明治
    "" // 無効日
  ),
  IF(eDate, DATE_DIFF(eDate, fDate, "year")+1) // 年差分
)
```

# 注意事項
明治以降の元号に対応しています。
RailsでRedisに保存されたセッションを確認する

業務の中でセッションIDを受け取ってRedisに保存されている値を読み出す際に、調査に少し時間がかかったのでメモ。


# 実装

```
# 接続するRedisの設定。REDIS_URLは環境変数で指定している
redis = Redis.new(url: "redis://#{ENV.fetch('REDIS_URL', 'localhost')}:6379/0")

# Marshalをつけないとハッシュとして取り扱えない
Marshal.load(redis.get "123")
# => { "id"=> "aaaaaa", "name"=> "bbbb" }
```

## 補足
MarshalはRailsのオブジェクトと文字列の変換を行うモジュール。
Redisに保存されているのがMarshalで変換された文字列だということに気づくまでに時間がかかった。


# 参考
[Railsのセッション管理には何が最適か
](https://qiita.com/shota_matsukawa_ga/items/a21c5cf49a1de6c9561a)
Vue の v-bind:class に複数の条件付き class を入れる簡単な方法（オブジェクト（ハッシュ）、配列）

なぜ私は文字列連結なんてやってたのか。

## オブジェクト（ハッシュ）

```vue
<div v-bind:class="{ active: true }"></div>
<!-- <div class="active"> -->
```

```vue
<div
  class="static"
  :class="{ active: true, 'text-danger': false }"
></div>
<!-- <div class="static active"> -->
```

インラインである必要はない。

```vue
<div v-bind:class="classObject"></div>

<script>
data: {
  classObject: {
    active: true,
    'text-danger': false
  }
}
</script>

<!-- <div class="active"></div> -->
```

## 配列

```vue
<div v-bind:class="[activeClass, errorClass]"></div>

<script>
data: {
  activeClass: 'active',
  errorClass: 'text-danger'
}
</script>

<!-- <div class="active text-danger"></div> -->
```

三項演算子で条件を指定することもできる。

```vue
<div v-bind:class="[isActive ? activeClass : '', errorClass]"></div>
```

なんと配列の内部でオブジェクト構文も使える。

```vue
<div v-bind:class="[{ active: isActive }, errorClass]"></div>
```

[公式ドキュメント](https://jp.vuejs.org/v2/guide/class-and-style.html)
fortigateでGCPとVPNを最初からカスタムでやると失敗するときの対処法

#カスタムモードのVPN作成をGUIからやると認証に失敗することがあるようです。

VPNウィザードを起動して、カスタムで設定を続けます。
![forticus01.jpg](https://qiita-image-store.s3.amazonaws.com/0/220924/b2be75d8-f6c6-f383-ab19-eb3e038589c1.jpeg)

最後まで設定をしても
![forti04.jpg](https://qiita-image-store.s3.amazonaws.com/0/220924/e40a4235-8844-f1ac-bc0a-48a52d3c4fab.jpeg)
peer SA proposal not match local policy
このエラーで接続できないのではまりました。

これをカスタムではなく、Site to Siteでやってから、カスタムに変えるとうまくいきました。
![forti01.jpg](https://qiita-image-store.s3.amazonaws.com/0/220924/b1c4a86c-9e68-0693-282b-790e06131567.jpeg)

![forti02.jpg](https://qiita-image-store.s3.amazonaws.com/0/220924/aac9567c-0519-bc28-2f7e-f7eddf552054.jpeg)
相手先のIPアドレスを間違えないように、事前認証鍵も正確に。

![forti03.jpg](https://qiita-image-store.s3.amazonaws.com/0/220924/48b90604-2d1b-e2d4-5d83-f70cfac37520.jpeg)
ローカルサブネット、リモートサブネットの入力

![forti05.jpg](https://qiita-image-store.s3.amazonaws.com/0/220924/29a1c06c-572f-581b-1a57-0a08b1ce7258.jpeg)

VPN設定を編集します。
![forti06.jpg](https://qiita-image-store.s3.amazonaws.com/0/220924/04ee2a39-476b-0fdb-e508-1b8a5f2fd38b.jpeg)

![forti07.jpg](https://qiita-image-store.s3.amazonaws.com/0/220924/d9e38258-bdb1-2efb-a8dd-976b2a0cb96a.jpeg)
カスタムテンプレートに変更してパラメータを入れていくと接続できました。
最初からカスタムで作るとどんなにポリシーとかを設定しても
接続できなかったので、手順を保存しておきます。
CLIからconfigをダウンロードしてもipsecのphase1-interfaceのパラメータを
色々試してもまったく効果がありませんでした。

#メモ　fortigateでterminal length 0は次のコマンド
config system console
set output standard
Contentful料金無料枠メモ

## CMS

[Contentful](https://www.contentful.com/)


## デプロイ環境

[circleci](<https://circleci.jp/pricing/>)



## ホスティング

[netlify](<https://www.netlify.com/>)



## 料金

#### Contentful

無料プラン機能

- 24個のコンテンツタイプ
- 5000個のレコード
- 10人のユーザー
- 1つのロール（ユーザー権限）
- 2つの環境（master/stagingとか）
- 2つのロケール（多言語対応）



> レコード数は、エントリーとアセットを合わせた数になるようで、たとえばブログエントリーが10件あって、5つの画像を使用している場合は、15レコードになります。



1記事に5画像を添付するとしたら6レコードになり

5000/6 = 833記事投稿できることになる

それ以上投稿したいならMICRO SPACEプランで`$39/月`支払わなければならない

基本的に無料プランで行ける想定



[Fair Use Policy](https://www.contentful.com/r/knowledgebase/fair-use/)でAPIの呼び出し数や、アセットの帯域の制限が決められています。画像などの数が多く、かなりのアクセスが見込まれる場合は、アセットの帯域が上限に達するかもしれません。



> APIの呼び出し - 200万/月
> アセットの帯域 - 0.75TB/月



Extra API calls will be billed at $5/1,000,000 API calls/month. Extra asset bandwidth consumption will be billed at $65/1 TB/month.



> 追加のAPI呼び出しは、月額$ 5 / 1,000,000 API呼び出しで請求されます。追加の資産帯域幅の消費は、65/1 TB /月で請求されます。



これもかなりアクセスされないと引っかからないと思います。



参考URL

https://www.contentful.com/pricing/

https://www.contentful.com/r/knowledgebase/fair-use/



### netlify



無料枠

- 無料SSL
- 通常のCDNよりすごいADN（[Application Delivery Network](https://www.netlify.com/features/adn/)）
- 転送量: 100GB/月
- ストレージ: 100GB
- リクエスト制限: 500 requests/分



無料枠で十分使えると思われる。

これ以上使用したいなら`$45 /month`支払う必要がある。



参考URL

<https://www.netlify.com/pricing/>



### Circleci

無料枠

- リポジトリ数 :無制限
- ユーザー数 :無制限
- 月間ビルド時間 :1,000 分まで
- コンテナ数 ：1
- 同時処理数 :1

無料枠で十分なので気にしなくていいです。



## Contentful?netlify?Circleci? そんなん知らん！

ワードプレス使いましょ
cgi_runnerエラー対処法

WEBrickサーバを建てて、cgi使用したら下記エラーが発生しました。
Ruby/Webrick/CGI: cgi_runner.rb:47:in `exec': Permission denied ... (Errno::EACCES)

解決方法は下記のようになる

```ruby:sample.rb
require 'webrick'
include WEBrick 

s = HTTPServer.new(
	:Port => 8000,
	:DocumentRoot => './',
	:CGIInterpreter => "C:/Ruby25/bin/ruby.exe" #これを追加する必要ある
)

s.mount('/Verify', WEBrick::HTTPServlet::CGIHandler, './verify.rb')
s.mount('/CreateModel', WEBrick::HTTPServlet::CGIHandler, './CreateModel.rb')

trap("INT") {s.shutdown}
s.start
[Javascript] 正規表現(最少量指定子)

# 最小量指定子とは

最小量指定子とは読んだままの意味ですが、正規表現を用いて任意の文字列にマッチさせるときにヒットした**最短の文字列**にマッチするという意味です。
よくわからないので定義を説明した後、コードで説明していきたいと思います。

## 定義

| *?       |      直前の部分式が0回以上の繰り返し    |
|:-----------------|------------------:|:------------------:|
| +?       |              直前の部分式が１回以上の繰り返し
| ??      |              直前の部分式が０回か１回の繰り返し
| {n}?     |                直前の部分式がn回の繰り返し   
| {n,}?      |             直前の部分式がn回以上の繰り返し         |
| {,m}?    |           直前の部分式がm回以下の繰り返し         |
| {n,m}?   |       直前の部分式がn回以上、m回以下の繰り返し          |

以上になります。
定義の仕方については前回やった繰り返しのメタ文字列に対して?をつけるだけなので簡単ですね。


前回やった普通の繰り返しは最大量指定子と呼ばれ、**最長の文字列**にヒットしようとします。

それではその違いをコードを使って説明していきます。

```js
var name = "yuichiyuichiyuichi"
    name.match(/y.+i/) //yで始まり任意の文字列が１回以上繰り返しiで終わる。
    =>"yuichiyuichiyuichi"
```

普通の繰り返しは最長の文字列にヒットするので最初のyで始まり一番最後のiまでがヒットし上記の返り値となります。
それでは最小量指定子を見ていきます。

```js
var name = "yuichiyuichiyuichi"
    name.match(/y.+?i/) //yで始まり任意の文字列が１回以上繰り返しiで終わる。
    =>"yui"
```

上記の返り値となります。
繰り返しは同じですが?を加えることによりyからはじまり任意の文字列を１回以上繰り返し、iで終わる**最短**の文字列を検索しているので返り値は**yui**となります。

## 最後に
今回は最小量指定子について説明していきました。
文字列をマッチさせたいときはどの部分をマッチさせたいのか、不要な部分もマッチしてしまわないか、などを考えながらコードを書いていきましょう。

最後まで読んでいただきありがとうございました。
「メモ用」正六角形の描画

※matplotlibで正六角形を描画するコードです。


```
# https://python.atelierkobato.com/polygon/
# matplotlib.pyplotをインポート
import matplotlib.pyplot as plt

# matplotlib.patchesをインポート
import matplotlib.patches as pat

# Figureを作成
fig = plt.figure(figsize=(5, 5))

# FigureにAxes(サブプロット)を追加
ax = fig.add_subplot(111)

# 正六角形の描画
# 中心座標(0.5, 0.5), 半径0.4
# 塗り潰しはブルー、縁の色はブラック
cp = pat.CirclePolygon(xy = (0.5, 0.5), radius = 0.4,
resolution = 6, fc = "blue", ec = "black")

# Axesに正多角形を追加
ax.add_patch(cp)
```
AWS Sytems Manager Sericesからコマンド実行のトラブルシューティング(原因不明)

# AWS Sytems Manager Sericesからコマンド実行のトラブルシューティング

[Amazon Web Services パターン別構築・運用ガイド](https://www.amazon.co.jp/dp/4797392576/)の「5-2 システムを監視する」を参考に、AWSでログ監視をなるべくansibleから設定するという課題(そのうち公開予定)を実施しつつ、つまづいたことを書きます。

## ansibleから作ったIAMでコマンドが実行できなかった。

[Amazon Web Services パターン別構築・運用ガイド](https://www.amazon.co.jp/dp/4797392576/)の手順にてP.409のCloudWatch Agentを利用するための準備としてロールを作成した。

過去に手動で作ったインスタンスは表示される。

[Systems Manager Run Command のトラブルシューティング](https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/troubleshooting-remote-commands.html)
*Linux インスタンスのステータス情報の取得*を参考に次を実行。

以下はansibleで構成しようとしているec2インスタンスとは別のインスタンスが表示されている。

```
$ aws ssm describe-instance-information --instance-information-filter-list key=PingStatus,valueSet=Online                                                                                                                    
{
    "InstanceInformationList": [
        {
            "IsLatestVersion": false, 
            "ComputerName": "ip-x-x-x-x.us-west-2.compute.internal", 
            "PingStatus": "Online", 
            "InstanceId": "i-xxxx7cb53516b635e", 
            "IPAddress": "x.x.x.x", 
            "ResourceType": "EC2Instance", 
            "AgentVersion": "2.3.372.0", 
            "PlatformVersion": "2", 
            "PlatformName": "Amazon Linux", 
            "PlatformType": "Linux", 
            "LastPingDateTime": 1554108523.909
        }
    ]
}
```

新しく作ったIAMロールと何が違うのかわからずしばらく経って、接続確認できているIAMロールに入れ替えて実行。
出てきたのでIAMロールが悪いのかと思って、接続できなかったIAMロールにして実行しても同じ結果に。

```
satokaoru:cloudwatch/ (topic_#11CloudWatch✗) $ aws ssm describe-instance-information --instance-information-filter-list key=PingStatus,valueSet=Online                                                                                                                    
{
    "InstanceInformationList": [
        {
            "IsLatestVersion": false, 
            "ComputerName": "ip-x-x-x-x.us-west-2.compute.internal", 
            "PingStatus": "Online", 
            "InstanceId": "i-xxxx7cb53516b635e", 
            "IPAddress": "x.x.x.x", 
            "ResourceType": "EC2Instance", 
            "AgentVersion": "2.3.372.0", 
            "PlatformVersion": "2", 
            "PlatformName": "Amazon Linux", 
            "PlatformType": "Linux", 
            "LastPingDateTime": 1554168223.963
        }, 
        {
            "IsLatestVersion": true, 
            "ComputerName": "ip-x-x-x-x.us-west-2.compute.internal", 
            "PingStatus": "Online", 
            "InstanceId": "i-xxxx9b7d2a4671971", 
            "IPAddress": "x.x.x.x", 
            "ResourceType": "EC2Instance", 
            "AgentVersion": "2.3.479.0", 
            "PlatformVersion": "2", 
            "PlatformName": "Amazon Linux", 
            "PlatformType": "Linux", 
            "LastPingDateTime": 1554168177.525
        }
    ]
}
```

IAMロールが悪かったのではないのか。
振り出しに戻った感じ。

理由がわかったら本記事更新していきます。
初心者がProgate初級編でつまづいたところ

#はじめに 
はじめまして。
[未来電子テクノロジー](https://www.miraidenshi-tech.jp/intern-content/program/)でインターンをしているtomokiyo_hiromuです。
プログラミングの勉強を始めて約5時間が経過しました。
今回は、Progate初級編を終えてつまづいたところを発信しようと思います。

#記号の打ち忘れ
演習中にエラーが出る一番の原因が記号の打ち忘れです。
終了タグに「/」を付け忘れたり、
複数のセレクタに同じCSSを指定する作業中、コンマを打ち忘れていたり。
初歩的なところですが、初心者は特に意識して慎重に進めるとうまくいきます。

#スぺルミス
これは3時間ほど経過してから顕著になってきました。
ある程度流れを掴んできたら、次第にキーボードを打つ手も早くなります。
だからこそ一つ一つのコードを確実に入力することを忘れないことが大事。
運転免許を取りたての初心者が、半年辺りで事故を起こしやすいのと似たような感じです。

#まとめ
作業中、ミスしがちなところが次第に分かるようになってきます。
少しでもスムーズに進められるようにメモを取ると便利でしょう。
プログラミング初心者であるため、内容に誤りがあるかもしれません。
もし、誤りがあれば修正するのでどんどん指摘してください。
最後まで読んでいただき、ありがとうございました。
DashboardにQiitaの新着リスト（tag:emacs）を表示させてみた


![Alt Text](https://live.staticflickr.com/7874/32576377777_6a8b349d0b_b.jpg)

下記のTipsを参考にしてEmacsのDashboard画面にQiitaの新着一覧を表示させる事ができました。

  * [Dashboardで起動画面を素敵にしよう](https://qiita.com/hyakt/items/f4468facec0478e06f7a)


## 設定 ##

この設定例では、emacsタグで絞り込んだ一覧を表示するようにカスタマイズしています。

``` emacs-lisp
;; Use request.el for API call
(use-package request)

;; Item display function
(defun dashboard-qiita-insert-list (list-display-name list)
  "Render LIST-DISPLAY-NAME and items of LIST."
  (dashboard-insert-heading list-display-name)
  (mapc (lambda (el)
          (insert "\n    ")
          (widget-create 'push-button
                         :action `(lambda (&rest ignore)
                                    (browse-url ,(cdr (assoc 'url el))))
                         :mouse-face 'highlight
                         :follow-link "\C-m"
                         :button-prefix ""
                         :button-suffix ""
                         :format "%[%t%]"
                         (decode-coding-string (cdr (assoc 'title el)) 'utf-8))) list))

;; Function to get and display articles
(defun dashboard-qiita-insert (list-size)
  "Add the list of LIST-SIZE items from qiita."
  (request
   ;; (format "https://qiita.com/api/v2/items?page=1&per_page=%s" list-size)
   (format "https://qiita.com/api/v2/tags/emacs/items?page=1&per_page=%s" list-size)
   :sync t
   :parser 'json-read
   :success (cl-function
             (lambda (&key data &allow-other-keys)
               (dashboard-qiita-insert-list "Qiita(emacs-tag):" data)))))

;; add an article to the dashboard
(add-to-list 'dashboard-item-generators '(qiita . dashboard-qiita-insert))
(setq dashboard-items '((qiita . 15)))

```

## 参考 ##

Emacs:Dashboardの詳細設定はGithubに公開しています。

* [github/minoruGH](https://github.com/minorugh/emacs.d/blob/master/inits/01_dashboard.el)
WSUSでクライアント適用済が100%にならない！クライアント側では「最新の状態です」なのに

#はじめに
社内で管理しているWindows クライアントPC へ WindowsUpdate を綺麗に適用させたいのですが、コンピューターの一覧では警告マークがついたままの状態。「インストール済みまたは該当しない割合」は一向に100%になってくれません。確認のため、"100%"となっていないクライアントPCのいくつかで WindowsUpdate の更新プログラムのチェックをかけると「最新の状態です」と表示されます。いったいどうなっているのだ...

※いわゆる「プログラミング」以外の技術内容も[投稿可能](https://help.qiita.com/ja/articles/qiita-community-guideline)なようです。"WSUS"や"WindowsUpdate"のタグも用意されていることですし...

#確認事項
## BITS (Background Intelligent Transfer Service) の関連で失敗？
- WSUSコンソールから「すべての更新プログラム」一覧で、フィルタを「承認済み」「必要」として表示させてみます。赤いバツ印がついている場合は、インストールを承認したものの、MSの配布サーバーからダウンロードに失敗しています。
- C:\Program Files\Update Services\LogFiles フォルダにある "SoftwareDistribution.log" ファイルを確認します。もし<br>"YYYY-MM-DD HH:MM:SS.FFF UTC	Error	WsusService.26	ContentSyncAgent.JobError	Download error: http://wsus.ds.download.windowsupdate.com/c/msdownload/update/software/secu/????????.cab failed in download: (-2145386477) 必要な HTTP プロトコルがサーバーでサポートされていません。バックグラウンド インテリジェント転送サービス (BITS) では、サーバーが Range プロトコル ヘッダーをサポートしている必要があります。"<br>といったエラーエントリが頻発している場合は、メッセージのとおりの原因で、ダウンロードに失敗しています（ファイアウォールアプライアンスやプロキシサーバーが対応していない場合に発生することが多そう）。WSUS が使用している DB に BITSを「Foregroundモード」で使用するように設定すると（要再起動）、このエラーを回避できます。赤バツ印だらけのWSUS一覧画面に戻って「ダウンロードの再試行」操作をお忘れなく。

```cmd
sqlcmd -E -S \\.\pipe\MSSQL$MICROSOFT##SSEE\sql\query -- <- (2008R2まで) Windows Internal Database を使用している場合
sqlcmd -E -S \\.\pipe\microsoft##WID\tsql\query -- <- (2012以降) Windows Internal Database を使用している場合
-- SQL SERVER (EXPRESS) の場合は、それぞれのログインで接続

use SUSDB
go
update tbConfigurationC set BitsDownloadPriorityForeground=1
go
```