OmniAICreator/Qiita-1.07M huggingface dataset:
[TypeScript] 指定年月のカレンダー二次元配列を出力するプログラムサンプル

# これはなに？

年、月を渡すと、以下のような配列を返します。

```
/* 2000年2月の場合 */
[
      [null, null, 1, 2, 3, 4, 5],
      [6, 7, 8, 9, 10, 11, 12],
      [13, 14, 15, 16, 17, 18, 19],
      [20, 21, 22, 23, 24, 25, 26],
      [27, 28, 29, null, null, null, null]
]
/* 数値の部分は、実際にはDateオブジェクトです。*/
```


# プログラム

```ts:full-calendar.ts
export class FullCalendarService {
  // 通常年の日数/月
  private daysOfMonth = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
  // うるう年の日数/月
  private daysOfMonthOfLeap = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];

  /**
   * 二次元配列を返します。
   * 
   * @param year 年
   * @param month 月1〜12
   */
  public generateWeeksArray(year: number, month: number): Date[][] {
    const monthIndex = month - 1;

    const maxDay = (this.isLeapYear(year)
      ? this.daysOfMonthOfLeap
      : this.daysOfMonth)[monthIndex];
    // 1日の曜日
    const firstDayOfMonth = new Date(Date.UTC(year, monthIndex, 1, 0)).getUTCDay();
    const weeksArray = new Array<Array<Date>>();

    for (let i = 1; i <= maxDay; i++) {
      const row = Math.floor((i - 1 + firstDayOfMonth) / 7);
      const col = (i - 1 + firstDayOfMonth) % 7;

      if (!weeksArray[row]) {
        weeksArray[row] = [null, null, null, null, null, null, null];
      }

      weeksArray[row][col] = new Date(Date.UTC(year, monthIndex, i, 0));
    }

    return weeksArray;
  }

  private isLeapYear(year: number): boolean {
    // 4で割り切れて、100で割り切れなければうるう年
    // ただし400で割り切れればうるう年
    return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;
  }
}
```

# 使い方

```ts:
const cal200002 = new FullCalendarService().generateWeeksArray(2000, 2);
```
文章をコピーできない英語の電子技術書籍を、無料でOCR&Google自動翻訳＆読むツール＆DeepL翻訳紹介。

2020/06/14 追記
Kindle Cloud Readerで洋書を読む時にDeepL翻訳を使う | せかいらぼ
https://sekailab.com/wp/2020/03/25/deepl-translation-with-kindle-cloud-reader/

これはKindle Cloud ReaderをDeepL翻訳に対応させるブックマークレットです。
PCで読むとき非常に便利です。
ブックマークレットに登録したらすぐ利用できます。
使い方はブラウザで開いて翻訳したい箇所をドラッグしてDeepLを選ぶだけです。

追記終

## Capture2Text
PDFとかコピーできない文章がありますね、
それをOCRにかけて無料で自動的に翻訳してくれるツールです。

環境 Windows10

OCR(Optical Character Reader)
OCRとは画像内などにある文章（要はテキスト化されてない文章）をテキスト化してくれる機能。

Capture2Text
https://sourceforge.net/projects/capture2text/files/Capture2Text/

## 使い方
（ツールをバックグラウンドで立ち上げておく）
始動キーを押す。
Start OCR Capture（デフォルトはWin+Q）
マウスで範囲指定する。
終了キーを押す。
Start OCR Capture（デフォルトはWin+Q or マウス左クリック）

ウィンドウが立ち上がり範囲をキャプチャ＆自動翻訳＆オプションで発音も可能です。

同じ場所を再度キャプチャーする場合は、
Re-Capture Last（デフォルトはWin+R）

テキストだとわかっている場合は
Text Line Capture（デフォルトはWin+E）

## 設定
### (アイコンを右クリック)
Save to Clipboard
クリップボードにコピーします。

Show Popup Window
キャプチャー結果をウィンドウで表示します。

Text Orientation
キャプチャーしたいテキストの向き
Auto 自動解析
Horizontal 横書き
Vertical 縦書き

Autoよりも指定したほうが読み取り精度は少し上がるようです。


### (アイコンを右クリック＞Setting)
設定画面から
#### Hotkeys
Start OCR Capture (Alt Q) キャプチャー開始
マウスで場所を指定してHotkeyを押して範囲指定スタート。

Re-Capture Last (Alt W) 最近キャプチャーした範囲場所を再試行。

Text Line Capture (Alt X) テキスト行だとわかっている場所をキャプチャー。


#### OCR
Whitelist
記号を登録しておくと認識しやすくなる。
設定しなくても認識率は高いです。

#### Output
>Keep lines breaksのチェックを外す。
改行が文章の終わりと判断されてしまうので外しておく。

#### Translate
Show translation in popup windowにチェックを入れる。
翻訳をウインドウにポップアップしてくれるようになります。

OCR LnaguageのEnglish
Translate To (using Google Translate)をJapaneseに変更。

OCR LnaguageのJapanese
Translate To (using Google Translate)を<Do Not Translate>に変更。
日本語を翻訳しなくなります。


#### Speech
Enable Text-to-speechにチェックを入れる。
音読してくれるようになります。
Previewボタンを押すと発声のテストをしてくれます。

OKボタンを押し設定を完了させる。

## 終わりに
これで技術書の読むスピードがアップしますね。
テキストもテキスト化してくれます。（要はウィンドウズ10上の文章すべてを自動翻訳＆読み上げてくれます。）

洋ゲーにも使えます。
デュアルディスプレイ最高！
ディレクトリにある最新のファイルをtail -fしたい

```bash
$ ls -t | head -n 1 | xargs tail -f
```

コマンド | 説明
---|---
ls -tr | ファイル一覧を日付昇順（新しいものから順に）取得
head -n 1 | 先頭行を1つだけ（最新のファイル名を取得）
xargs tail -f | そのファイルをtail -fする

# 何がしたいか
ログの種類によってはファイル名に日付が付くことがあり、そこから最新のファイル名を確認して`tail -f`するのが大変だったりします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/47327/2e0227ab-0023-5b91-2105-a549276ac234.png)

特に運用が始まってファイルが増えてくると大変です。

このコマンドをエイリアス掛けておくと便利です。

```bash
$ alias lt='ls -t | head -n 1 | xargs tail -f'
```

# でも
`head`したときにディレクトリがヒットしてしまう可能性や、`xargs`に変なものが渡ったりしそうなので、`find`などでアレンジしたほうが良いかも。
railsのタスクの書式

## 概要

railsのタスクですが、引数が必要な時とか、他のtaskを事前に実行したい時に、`task`メソッドに渡す引数の書き方がいつもわからなくなって毎回検索するのでまとめておきます。

## 引数無し・別のタスク実行無し

素のタスクです。引数はtaskの名前のみ。

```rb
  desc '引数無し・別のタスク実行無し'
  task :some_task do |task, args|
    puts 'some_task'
  end
```

## 引数あり・別のタスク実行無し

引数だけあるパターン。二番目の引数に配列で列挙可能。

```rb
  desc '引数あり・別のタスク実行無し'
  task :some_task, [:arg1, :arg2] do |task, args|
    p args
  end
```

呼び出す時は`rails some_task[foo,bar]`。task内では`args.arg1`、`args.arg2`で参照できます。

ちなみに一つの時は配列にしなくてもOK。

```rb
  desc '引数あり・別のタスク実行無し'
  task :some_task, :arg1 do |task, args|
    p args
  end
```

## 引数無し・別のタスク実行あり

taskに渡す最初の引数がhashになります。キーが名前で値が実行したいタスク。この辺から？？？って感じです。

```rb
  desc '引数無し・別のタスク実行あり'
  task some_task: [:environment, 'another_task'] do |task, args|
    p User.class
  end
```

こちらも同じく一つの時は配列にしなくてもOK。


```rb
  desc '引数無し・別のタスク実行あり'
  task some_task: :environment do |task, args|
    p User.class
  end
```

## 引数あり・別のタスク実行あり

引数が二つになり、二番目の引数に引数の配列をキーにしたハッシュを渡します（もう何を言ってるかわかりません）。

```rb
  desc '引数あり・別のタスク実行あり'
  task :some_task, [:foo, :bar] => [:environment] do |task, args|
    p User
    p args
  end
```

実行したいタスクが一つの時は配列じゃなくてもOKですが、引数は配列じゃないとダメです。

```rb
  desc '引数あり・別のタスク実行あり'
  task :some_task, [:foo] => :environment do |task, args|
    p User
    p args
  end
```

ふむ・・・改めてまとめてみると結構わかりづらいですね。覚えられないわけだ。

下記のような引数ならわかりやすいのに。

```rb
  # このコードは動きません！
  task :some_task, args: [:foo], before: [:environment] do |task, args|
    p User
    p args
  end
```
[Ruby on Rails]インスタンス変数.カラム名でデータを参照できるのは何故か？

rails初心者です。
railsの基本的すぎる部分なのですが、つまづいてrailsすげーってなったので書き残します。


[疑問]
rails上で例えばusersテーブルを作った際に、何故user.idでidを引けるのか？
[疑問の流れ]
・rubyでは、user.idなどはインスタンスメソッドを定義しないと利用できない。
・railsでは息をするように何も定義せずにやっている。
・なんでだ？
[結論]
railsは普通に作るとmodelがActiveRecord::Baseを継承しているため、自動的にカラム名のメソッドを生成してくれているため。


 ```ruby:book.rb
class book

  # attr_reader :title, :price
  def title
    @title
  end
  def price
    @price
  end

  def initialize(title, price)
    @title = title
    @price = price
  end
end

book = Book.new("Programing Ruby", 1980)
puts book.title
puts book.price

```

上記のclassを生成する問題を行なっている際に、titleとpriceメソッドを作成しないと外部でインスタンス変数を引き出せない。しかし、よく考えたら、rails上でtitleとpriceメソッドを生成した事がない。どうやってインスタンス変数.カラム名でインスタンス変数を引き出しているのか？

[調べた]

そして、気づいた。railsのモデルやコントロールには色々なclassが継承されていた事に。
（rails使っているならば知ってろよ！って話だけど）

[Active Record の基礎](https://railsguides.jp/active_record_basics.html)
上のリンクに、ApplicationRecordを継承したclassを生成すると以下のようなコードをいきなり書くことができる事が書かれている。

 ```ruby:
p = Product.new 
p.name = "Some Book" 
puts p.name # "Some Book" 
```



[ActiveRecord::Base](https://api.rubyonrails.org/classes/ActiveRecord/Base.html)
公式ドキュメントでは、ActiveRecord::Baseの一番上のcreationの部分に、該当のメソッドが生成される事が書かれている。

 ```ruby:
user = User.new(name: "David", occupation: "Code Artist")
user.name # => "David"
```


つまり、なんとなくできるから使っていたけど。自動で作成されるモデルに継承されているActiveRecordに事前にメソッド化の仕掛けがあったということでした。

よく考えるとMVCのMとCについてはrubyでクラスを定義するファイルという大枠は同じもので、そこに対してコントローラーやモデルというrailsに沿った役割を振り分けているということなのだ。


railisすごい。フレームワーク考える人すごい。
[C]配列の一番最初の要素を削除する

「配列の一番最初の値がいらないからそれを除いた配列を新たに作ってくれ」と言われたので実装したときのメモです。
Cには配列要素のdeleteなんぞ無いのでポインタを使ってわちゃわちゃするしかありません。

```c
#include <stdio.h>
#include <string.h>

int main(void) {
    int a[5] = {114, 11, 14, 19, 1};
    int b[4];

    memcpy(b, a + 1, 4 * sizeof(int));

    for(int i = 0; i < 4; i++)
        printf("%d ", b[i]);

    return 0;
}
```
配列aのポインタを1個すすめて、そこから要素4個分コピーをするというやり方なんですが、もっといい方法がありそう。
もっといい書き方を知ってるという人を募集してます。
私的なmacOS環境構築手順

## 前提条件

macOS をクリーン インストールした状態からスタート

## Xcode Command Line Tools

```sh
xcode-select --install
```

後は流れでクリック

## Homebrew

[公式サイト](https://brew.sh) にしたがってインストール。

```sh
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```

よく使うパッケージをインストール。

```sh
brew install coreutils
brew install dos2unix
brew install gnu-sed
brew install nkf
brew install shellcheck
brew install tmux
brew install tree
brew install zsh

brew install --cask alfred
brew install --cask google-chrome
brew install --cask krisp
brew install --cask visual-studio-code
brew install --cask zoom
brew install --cask font-fira-code-nerd-font
```

## Terminal.app

カラースキーマは [Iceberg](https://cocopon.github.io/iceberg.vim/) を使用。
その他のプロファイルは不要なので削除。

Iceberg インストール後、フォントを [Nerd Fonts](https://www.nerdfonts.com/) に変更。

## ターミナル

個人の [dotfiles](https://github.com/m5d215/dotfiles) を復元。

```sh
curl -fsSL https://github.com/m5d215/dotfiles/raw/master/install.sh | bash -
```

## VSCode

個人の [設定](https://github.com/m5d215/vscode) を復元。

```sh
curl -fsSL https://github.com/m5d215/vscode/raw/master/install.sh | bash -
```

## Alfred

基本は Alfred の同期機能を使用する。

以下は手動でコピーしてくる。

- `~/Library/Application Support/Alfred/Databases/clipboard.alfdb`
Kotlinのログ出力方法

以下のおまじない（２行）を入れて、`logger.info("ログ出力")`で出力。

`import org.slf4j.LoggerFactory`
`private val logger = LoggerFactory.getLogger(javaClass)`

- 例：

```
import org.slf4j.LoggerFactory

@Component
class YourClass {
    private val logger = LoggerFactory.getLogger(javaClass)
    public fun yourFunction(): Any? {
        logger.info("ログ出力")
        return null
    }
}
```

- 出力結果：

```
2019-01-09 11:31:14.400  INFO 21313 --- [xxx] xxx.YourClass : ログ出力
```
AWS cloud9でjekyll開発

# 目的
- github.ioの編集をすべてクラウドサービスで賄いたい
- cloud9が昔使って良い感じだったのでもう一度使いたい
- リハビリ

# 手順
すでに会員登録などは済ませている状態から。

[参考][高機能のクラウドIDE，AWS Cloud9の登録方法を丁寧に解説！ | ロボット・IT雑食日記](https://www.yukisako.xyz/entry/aws-cloud9)

### githubリポジトリからクローン
さすがにgitはインストール済みだった。
> git clone git@github.com:user/user.github.io.git

### jekyll インストール
>cd user.github.io
gem install jekyll

#### ※色々足りない物をインストール
> gem install bundler
gem install concurrent-ruby

### RUN してみる

- [参考][Running Jekyll on Cloud9](https://www.jflh.ca/2016-01-18-running-jekyll-on-cloud9)

>
1. Open the “Run” menu.
2. Open the “Run Configurations” submenu.
3. Click the “New Run Configuration” menu item. A new tab will open.
4. Type “Jekyll” in the “Run Config Name” field.
5. Type jekyll serve --host \$IP --port $PORT --config _config.yml,_local_config.yml in the “Command” field. The “Runner” should change to “Shell command” automatically.
6. Click the “CWD” button and choose the root folder of the Jekyll blog.
7. Click the “Run” button to build and serve the blog.

![2019-01-09 11 18 03.png](https://qiita-image-store.s3.amazonaws.com/0/43608/8a95a225-cae0-725e-aa45-0637100fbd25.png)

こんな感じ

正常に動いていればプレビュー画面が開いて
レイアウト確認ができます。

# あとがき
これで出先で見やすい画面でGithub pagesの編集が出来るようになりました。
自宅以外でも作業が出来るのは大きいアドバンテージだと思ってます。
Golang - How to Go Get Private Repository?

You need add ssh key first.

```
git config --global url."git@1.2.3.4:".insteadOf "https://1.2.3.4/"
```

https://stackoverflow.com/questions/29707689/how-to-use-golang-with-a-private-gitlab-repo
https://stackoverflow.com/questions/27500861/whats-the-proper-way-to-go-get-a-private-repository
編集中

import java.util.*;
import java.util.ArrayList;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        
        Scanner sc = new Scanner(System.in);
        String n = sc.nextLine(); //マス目
        int num = Integer.parseInt(n); //数値に変換
        
        //System.out.println(n);
        
        int[][] mf = new int[num][]; // num * num の魔法陣の用意
        
        for(int i = 0; i < num; i++) {
            
            String[] line = sc.nextLine().split(" "); // 一行入力を取得
            int[] number = new int[num]; // 取得した入力格納する配列を宣言
            
            // 取得した値をint型に変換して配列に格納
            for(int j = 0; j < num; j++) {
                number[j] = Integer.parseInt(line[j]);
                //System.out.print(number[j]);
            }
            
            mf[i] = number; // 配列を二次元配列に格納
            
        }
        
        ArrayList<Integer> allNumbers = new ArrayList<Integer>(); // 全ての数字を格納する配列
        
        for(int[] mfnumber : mf) {
            for(int mn : mfnumber) {
                allNumbers.add(mn);
            }
        }
        
        // 足りない数字を検索
        ArrayList<Integer> missingNum = new ArrayList<Integer>(); // 足りない数字を格納する
        
        //System.out.println(missingNum.size());
        
        // 検索
        for(int i = 1; i <= allNumbers.size(); i++) {
            if(allNumbers.contains(i)) {
                continue;
            } else {
                missingNum.add(i);
                //System.out.println(i);
            }
            
            if(missingNum.size() == 2) {
                break;
            }
        }
        
        // 各列の和を計算して１列の合計値を算出
        int sum = 0;
        
        for(int i = 0; i < num; i++) {
            
            int oneTimeSum = 0;
            for(int j = 0; j < num; j++) {
                oneTimeSum += mf[i][j];
            }
            
            if(oneTimeSum > sum) {
                sum = oneTimeSum;
            }
        }
        
        //System.out.println(sum);
        
        // 0部分を検索
        
        int[] msLine = {0, 0};
        int[] msPoint = {0, 0};
        
        for(int k = 0; k <= 2; k++) {
            
            for(int i = 0; i < num; i++) {
                System.out.println("検索ライン：" + i);
                System.out.println(Arrays.toString(mf[i]));
                List<Object> test = Arrays.asList(mf[i][0],mf[i][1],mf[i][2]);
                // System.out.println(test.get(0));
                int index = test.indexOf(0);
                //int index = Arrays.asList(mf[i]).indexOf(0);
                System.out.println(index);
                if(index >= 0) {
                    msLine[k] = i;
                    msPoint[k] = index;
                    System.out.println("発見");
                }
            }
        
        }
        
        System.out.println(Arrays.toString(msLine));
        System.out.println(Arrays.toString(msPoint));
        
        /*for(int[] mm : mf) {
            System.out.println("");
            for(int m : mm) {
                System.out.print(m);
            }
        }*/
    }
}
Zapier がすごいらしい。SlackファボをGoogleDocsにアップロードしてみる。

Zapier がすごいらしい。SlackファボをGoogleDocsにアップロードしてみる。

# Ref

[“社内で行われた俊逸なやりとりを自分用に保存する”ズボラ管理法｜anboo｜note](https://note.mu/anboo/n/n75ddfb260010)

# 優秀な人は、優秀な人の言動をメモって真似てる！

>「うちは優秀な人がたくさんいるから、日々の業務の中で学べることがたくさんある。一番怖いのは、一緒に働いている人たちの良いところに気づかずにスルーしちゃうこと。せっかくの成長の機会なのにもったいない。俺はSlackの投稿で、これいいな、と思ったものは全部メモしてるよ。」

# めんどくさいことは、システム化しちゃおう☆

>Slackで「いいな！」と思った投稿に、リアクションをつけただけで、勝手にスプレッドシートにまとめられたら楽じゃない？

# これ、全部Zapierでできるんです

らしい。

# Zapier使ってみる

https://zapier.com/

IFTTT みたいなイメージ？

# Slackをトリガーに選ぶ

![image](https://user-images.githubusercontent.com/13635059/50871090-de600880-13fd-11e9-86e4-39e49b637ade.png)

# Starした時をトリガーにしてみる

![image](https://user-images.githubusercontent.com/13635059/50871120-f6378c80-13fd-11e9-8c66-ab3ab1f7e09d.png)


# Google Docs に ドキュメントをアップロードさせてみる

![image](https://user-images.githubusercontent.com/13635059/50871178-2ed76600-13fe-11e9-978f-c38602e6d2da.png)

# なんかいろいろ設定する

わーーー

# Zap1個が出来上がる

![image](https://user-images.githubusercontent.com/13635059/50871274-84ac0e00-13fe-11e9-9cb6-bca0d2a2372d.png)

# 早速

Google Docsになんかできてる！

![image](https://user-images.githubusercontent.com/13635059/50871360-a907ea80-13fe-11e9-8cb6-1a3d1ca03104.png)

---

https://twitter.com/YumaInaura

https://github.com/YumaInaura/YumaInaura/issues

https://github.com/YumaInaura/YumaInaura/issues/310








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Safariのお気に入りをChromeに移行する方法

私の環境は以下の通り。

macOS: Mojave バージョン10.14.2
Safari: バージョン12.0.2
Chrome: バージョン71.0.3578.98

なぜか、デフォルトのSafariからのインポート機能が動きませんでした。一度Safariから書き出す必要があったことを忘れないためのメモ。

# 方法
Safariのファイルメニューから、ブックマークを書き出す　を選択します。デフォルトだとダウンロードに、Safariのブックマーク.htmlが作成されます。
<img width="540" alt="スクリーンショット 2019-01-09 10.37.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/335400/688ca6c2-786d-70a3-ebbc-3ec8ed7bff14.png">
Chromeの右上にある･･･を縦にしたボタン(3点リーダ)をクリックしてメニューを表示します。
![スクリーンショット 2019-01-09 10.52.52.png](https://qiita-image-store.s3.amazonaws.com/0/335400/79a711ef-82ca-1722-5ef0-3e4058fd624d.png)
ブックマーク>ブックマークと設定をインポート　をクリックします。
以下のようなウィンドウが出てくるので、HTMLファイルをブックマークに登録　を選択し、ファイルを選択ボタンを押します。
![スクリーンショット 2019-01-09 11.05.29.png](https://qiita-image-store.s3.amazonaws.com/0/335400/69da1c4a-711a-f6df-f3ae-1a52e3d76493.png)
先ほど書き出したSafariのブックマーク.htmlを開きます。
（昔の）JavascriptからES6への最初の一歩

頭の整理ついでに書き残し。

## やること

ES6でこんなことできるようになったんだよ、をさらさらっと。  


## 環境構築

環境が無くても最新のChromeであればJSFiddle等で動かして確認できるかと思います。  
https://jsfiddle.net/

## ブロックスコープ

見たままそのままですが、varの代わりにletを使って定義します。

```js
if (true) {
    let hoge = 'hoge';
}
console.log(hoge); // error
```
ES6でもvarは使えますが基本的にletとこの後に出てくるconstを利用しましょう。

## 定数

Javascriptで悩みのタネのひとつだった定数宣言がES6でできるようになりました。ただし1点注意が必要で「再代入が禁止」されているだけで「変更は可能」という点です。

```js
const hoge = 'hoge';
hoge = 'piyo'; // error

const hoge = [1, 2, 3];
hoge[1] = 999; // OK
```
絶妙にキモいですね。

## テンプレート文字列

ヒアドキュメントというとわかりやすいかもしれないですね。

```js
const hoge = [1, 2, 3];
console.log(`${hoge[0]}！${hoge[1]}！${hoge[2]}！ダァーッ！`); // 1！2！3！ダァーッ！
```
ちなみに改行もそのまま含めることができます。

## 分割代入

PHPとかでできるやつです。

```js
let [l1, l2, l3] = [1, 2, 3, 4];
const [c1, c2, c3] = [5, 6];
console.log(`${l1}${l2}${l3}`); // 123
console.log(`${c1}${c2}${c3}`); // 56undefined
```
余剰分は切り捨てられて不足分はundefinedになります。

## デフォルト引数

デフォルト引数が使えます。そう、ES6ならね。

```js
function func(v = 'default') {
    console.log(v);
}
func('str'); // str
func(); // default
```

## 可変長引数

これまた便利です。argumentsオブジェクトを利用せずに自分で名前を付与して利用することができます。

```js
function func(...hoge) {
    for (let v in hoge) {
        console.log(hoge[v]);
    }
}
func(1, 2, 3); // 123
func(1, 2, 3, 4, 5, 6, 7); //1234567
```

## for - of

for - inはオブジェクトのプロパティ名（keyと言うとしっくりくるかも）を返すため、微妙に使い勝手がよろしくありませんでした。for - ofでは値を列挙してくれるので使い勝手が向上します。forEach的なやつですね。

```js
function func(...hoge) {
    for (let v of hoge) {
        console.log(v);
    }
}
func(1, 2, 3); // 123
```
先に書いたfor - inと比べると理解しやすいと思います。

## アロー関数

無名関数定義を簡潔に書けますよ、というやつです。

```js
let func1 = function (v) {
    console.log(v);
};
let func2 = (v) => {
    console.log(v);
};
func1(1); // 1
func2(1); // 1
```
かんけつ〜（どんだけ〜的な感じで）。ただ簡潔に書けるだけじゃなくて引数が1つの時は()を省略できたり、1行でreturnする場合は{}がいらなかったりと削れるところはとことん削れます。

```js
let func1 = function (i) {
    return i + 1;
};
let func2 = (i) => {
    return i + 2;
};
let func3 = i => {
    return i + 3;
};
let func4 = (i) => i + 4;
let func5 = i => i + 5;
console.log(func1(0)); // 1
console.log(func2(0)); // 2
console.log(func3(0)); // 3
console.log(func4(0)); // 4
console.log(func5(0)); // 5
```

## クラス

ES6で一番重要とも言えるのがクラスの実装です。ES5の頃には四苦八苦していたクラスがついにサクッと簡単に使えるようになりました！早速コードを見てみましょう。

```js
class sampleClass1 {
    constructor(v) {
        this._v = v;
    }
    get v() {
        return this._v;
    }
    set v(v) {
        this._v = v;
    }
}
let c1 = new sampleClass1('value');
console.log(c1.v); // value
c1.v = 'hoge';
console.log(c1.v); // hoge
```
非常に直感的でわかりやすいですね！
メンバは`_`を付けて定義して`_`を外したGetter/Setterを用意するのが慣例のようです。


## 最後に

大きなところはこんなもん、多分。
Djangoで開発と本番を分けれるように環境変数をdjango-environで管理する

表題の通り、開発と本番を分けれるように環境変数の管理をする。

# パッケージをインストール

```
$ pip install django-environ
```

# 環境変数を設定

.envファイルを作成して、中に環境変数を設定します。

```:.env
DEBUG=True
ALLOWED_HOSTS=[aaa,bbb,ccc]
SECRET_KEY=xxxxxxxxxxxxx
DATABASE_URL=mysql://user:password@host:port/detabasename
```

DATABASE_URLはこんな感じで記述します。

```
DATABASE_URL=mysql://{ユーザー名}:{パスワード}@｛ホスト｝:｛ポート｝/｛データベース名｝
```

あとはdjangoの記述を変更

```settings.py
import os
import environ

env = environ.Env(DEBUG=(bool, False),)
environ.Env.read_env('.env')

SECRET_KEY = env('SECRET_KEY')
DEBUG = env('DEBUG')
ALLOWED_HOSTS = env.list('ALLOWED_HOSTS')

DATABASES = {
    'default': env.db()
}
```

DATABASE_URLという環境変数で一行書くことでDBの定義ができるっぽいです。
自分用メモ: V8の基本的なAPI

## 参考
https://qiita.com/komukomo/items/316afadd04f95808f338
https://laogen.site/v8/expose-cpp-func-params/
https://v8.dev/docs/embed

## API
Isolateは実行環境。多分同じIsolateを使うと同じ環境でスクリプトを実行できる。

contextにビルトインクラスや関数等を登録できる。これらはC++で書く。
また、contextコンストラクタはisolateを要求する。
プロキシーの後ろで chocolatey をインストールする



## 最初に

自分は認証無しproxyで実行してしまったので下記を試していないので、試してみてください...


## パワーシェルで実行する方法：

1. インストーラーをダウンロード ⇒ [install.ps1](https://chocolatey.org/install.ps1)
1. `PowerShell` を管理者として実行
1. `Set-ExecutionPolicy RemoteSigned` を実行
1.  

    `$env:chocolateyProxyLocation = "http://...../"` proxyのアドレスとポートを指定 
    `$env:chocolateyProxyUser = "user"` proxy のユーザーを指定 
    `$env:chocolateyProxyPassword = ""` proxy のパスワードを指定 
1. `.\install.ps1` を実行


## 環境設定

chocolatey 自体に proxy の設定をして終了

`choco config set proxy "proxyhost:port"` proxy サーバーの指定
`choco config set proxy-user "user"` proxy のユーザーを指定
`choco config set proxy-password ""` proxy のパスワードを指定
`choco config set proxy-bypass-list "192\.168.*,10.*,.*\.local"` NO PROXY の設定を、正規表現をカンマ区切りで指定する
`choco config set proxy-bypass-on-local True` 

あと、インストールするパッケージによっては、環境変数 `http_proxy` や `https_proxy` `no_proxy` を使うようなので、これも設定しておくと良いと思います。

`set http_proxy=http://<proxy-user>:<proxy-password>@<proxy-host>:<proxy-port>`

ユーザー名に `@` を含む人は `%40` に置き換えて指定。

このフォーマットからproxyのユーザー名／パスワードを拾ってくれるかは、各パッケージに依るのであとは、それぞれのパッケージの設定を探します。
Golang - go mod

Good answer from stackoverflow ***Mad Wombat***

```
- projects
  - go.mod
  - go.sum
  - project1
    - main.go
  - project2
    - main.go
  - package1
    - lib.go
  - package2
    - lib.go
```

```golang
import (
    "projects/package1"
    "projects/package2"
)
```
https://golang.org/doc/code.html
https://stackoverflow.com/questions/17539407/golang-how-to-import-local-packages-without-gopath
Railsでマイグレーションファイルを複数追加

# はじめに

　これは備忘録を兼ねたtipsです。RubyとRailを熟知している方には当たり前でしょうが、私のような使い慣れていない方や忘れてしまった方のために残したものです。

# マイグレーションファイルの追加で衝突

　Railsは幾つものマイグレーションファイルを追加していけますが、同じ命名法で同じテーブルに対するマイグレーションファイルを追加しようとすると次の実行例のように名前が衝突した（同じだ）として、強制的に置き換えることを勧められます。さて、どうすれば良いのでしょうか？

```bash:
matthew@app$ rails g migration AddColumnToRobot memo:string
Running via Spring preloader in process 29931
      invoke  active_record
    conflict    db/migrate/20190108233655_add_column_to_robot.rb
Another migration is already named add_column_to_robot: /home/matthew/app/db/db/migrate/20190108023819_add_column_to_robot.rb. Use --force to replace this migration or --skip to ignore conflicted file.
$
```

# 衝突回避策

　マイグレーション機能の実装ソースを見て挙動を予測してからのほうが良いかもしれませんが、直ぐにテストができるなら、試した方が早いということで、マイグレーションファイルを生成するときに命名方法を工夫してみました。二つめのマイグレーションファイルを追加したいということで、末尾に2をつける命名法でマイグレーションファイルを生成させてみました。

```
matthew@app$ rails g migration AddColumnToRobot2 memo:string
Running via Spring preloader in process 29970
      invoke  active_record
      create    db/migrate/20190108234849_add_column_to_robot2.rb
vagrant@robocon:kosen-robocon-db$
```

# 編集

マイグレーション・ファイルは問題なく生成されました。ファイル中のクラス名は何でもよいとして、add_column関数の最初の引数に指名しているテーブル名がrobot2sと生成されてしまいました。実在しているテーブルはrobotsですので、これをエディタでrobotsに変更します。

```ruby:20190108234849_add_column_to_robot2.rb
class AddColumnToRobot2 < ActiveRecord::Migration[5.2]
  def change
    add_column :robot2s, :memo, :string
  end
end
```

# マイグレーション実行

マイグレーションを実行した後、db/schema.rbとデータベースで指定のテーブルに指定のカラムが増えたのを確認しました。また、ロールバックも実行してみたところ、元に戻ることを確認できました。

```
matthew@app$ rails db:migrate
== 20190108234849 AddColumnToRobot2: migrating ================================
-- add_column(:robots, :memo, :string)
   -> 0.0153s
== 20190108234849 AddColumnToRobot2: migrated (0.0170s) =======================
vagrant@robocon:kosen-robocon-db$ rails db:rollback
== 20190108234849 AddColumnToRobot2: reverting ================================
-- remove_column(:robots, :memo, :string)
   -> 0.2186s
== 20190108234849 AddColumnToRobot2: reverted (0.2519s) =======================

vagrant@robocon:kosen-robocon-db$
```
Enum逆引きマップ Java

Enumの値からEnum自身を逆引きしたい用途があったので備忘録として残します。

String値を値にもつEnumでの実装例

```java
public enum Mode {
   MODEA("a"),
   MODEB("b");

   private String mode;

   private Mode(String mode) {
       this.mode = mode;
   }

   /** 逆引きマップをあらかじめ作成してフィールドで持っとく */
   private static final Map<String, Mode> modeMap = new HashMap<String, Mode>() {
      private static final long serialVersionUID = 1L;
      {
           for (Mode mode : Mode.values()) {
               put(mode.mode, mode);
           }
       }
   };

   /** 値からEnumを取得 */
   public static Mode getMode(String mode) {
       return modeMap.get(mode);
   }
} 
```

利用側

```java
Mode modeA = Mode.getMode("a");
```
逆引きマップをあらかじめ作っておいてStringをキーにEnumを取得できる。
マップなのでダイレクトアクセスできて処理効率が良さげ。
ddコマンド ダミーデータ生成

## ダミーデータ生成

### ホームディレクトリ配下に1GBのデータファイルを1GB.dummyの名前で生成
```
$ dd if=/dev/zero of=~/1GB.dummy bs=1G count=1
```


### ホームディレクトリ配下に10GBのデータファイルを10GB.dummyの名前で生成
```
$ dd if=/dev/zero of=~/10GB.dummy bs=1G count=10
```
Windows server を使用して webテスト環境構築　メモ

当方Windows Serverの勉強中で
IISの最低限の使い方が分かったような気がするので
メモしておきます。

流れ

## IISのインストール

役割の追加
↓
機能の追加
↓
IISのwebserverを追加する

![wiwyy-8kf3j.gif](https://qiita-image-store.s3.amazonaws.com/0/310991/99836b4a-ff9b-13f5-4927-ec7f01c6b2db.gif)

https://youtu.be/5bvnCkkaFzE

## 動作確認

ブラウザからlocalhost(若しくはローカルIP)へアクセスし、デフォルトページが表示されればインストール成功

```
http://localhost

http://1.2.3.4
```

## webroot

既定の Web サイトのrootは以下

```
C:\inetpub\wwwroot
```

※サイトの編集>基本設定より指定した物理パスがそのサイトのwebrootとなる。
名詞と動詞のみ抽出するpythonコード

※mecab-python3-0.996.2で動作確認済み。
(mecab-python3の0.996ではnode.surfaceのバグがあって思わぬ挙動になります。)

```get_meishi_or_doushi.py
import MeCab
mecab = MeCab.Tagger ('-d /usr/local/lib/mecab/dic/mecab-ipadic-neologd')

def get_meishi_and_doushi(document, stopwords):
    meishi = []
    mecab.parse("")
    node = mecab.parseToNode(document).next
    stopwords = stopwords
    while node:
        nodeFeature = node.feature.split(",")
        if nodeFeature[0] == "名詞" or nodeFeature[0] == "動詞":
            node_surface = node.surface 
            flag = False
            for stop in stop_words:
                if stop == node_surface:
                    flag = True
            if flag != True:
                meishi.append(node_surface)
        node = node.next
    return meishi

stop_words = ["で", "？", "も", "は", "か", "た", "て", "の", "し", "だ", "よ","０","ん","な","！","…","ー","に","お","ぜ","ここ","こと","は","ーーー"]
```


```do.py
# textは任意の一次元配列
get_meishi_and_doushi(text, stop_words)
```
「アプリケーションを操作する時に消費するワーキングメモリーの量」を「認知ロード時間」的な言葉で表現するらしい

「アプリケーションを操作する時に消費するワーキングメモリーの量」を「認知ロード時間」的な言葉で表現するらしい

[Webフロントエンドでアニメーションを実装する時になにを考えるか - Qiita](https://qiita.com/seya/items/8ffe954a6342c930b430)

# しみじみ実感する、なにかアクションして、画面が遷移するときの脳の認知コスト

>ユーザがアプリケーションを使っていると"状態"が変化します。それはページが変わったり、モーダルが開いたり、ログイン状態が切れたり、様々な変化が起こります。この時一切アニメーションがないとユーザは「なにが変わったのかを自分で見つけて考える」必要が出てきます。これはユーザの体験としては負荷となります。

# 「何が起こったか分からない」は最悪のUI

アニメーションがあることによって「自分の起こしたアクションがどんな変化を起こしたのか」を画面を見ているだけで把握することができます。

# アニメーション嫌いなユーザーはどんなユーザー？

- 既にアクションが何を起こすかを理解しているユーザーだと思う。
- そういえば自分も昔、Windowsを使い慣れてからは、数々のOSアニメーションをオフにしていたな。

「アプリケーションを操作する時に消費するワーキングメモリーの量」を「認知ロード時間」的な言葉で表現するらしい

[Webフロントエンドでアニメーションを実装する時になにを考えるか - Qiita](https://qiita.com/seya/items/8ffe954a6342c930b430)

# しみじみ実感する、なにかアクションして、画面が遷移するときの脳の認知コスト

>ユーザがアプリケーションを使っていると"状態"が変化します。それはページが変わったり、モーダルが開いたり、ログイン状態が切れたり、様々な変化が起こります。この時一切アニメーションがないとユーザは「なにが変わったのかを自分で見つけて考える」必要が出てきます。これはユーザの体験としては負荷となります。

# 「何が起こったか分からない」は最悪のUI

>アニメーションがあることによって「自分の起こしたアクションがどんな変化を起こしたのか」を画面を見ているだけで把握することができます。

# アニメーション嫌いなユーザーはどんなユーザー？

- 既にアクションが何を起こすかを理解しているユーザーだと思う。
- そういえば自分も昔、Windowsを使い慣れてからは、数々のOSアニメーションをオフにしていたな。


https://github.com/YumaInaura/YumaInaura/issues/307








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
tmuxのstatusに自分のIPを表示しておく

ぱっと自分のIPが確認できると良いよね

## 環境
```shell_session
$ sw_vers
ProductName:    Mac OS X
ProductVersion: 10.14.2
BuildVersion:   18C54
```

## tmux.confだけで完結させるver
```:.tmux.conf
set -g status-right '🌏#(touch -a /var/tmp/ipv4; command find /var/tmp -name ipv4 -and \( -mmin +5 -or -size 0 \) -exec curl -s -4 ifconfig.co -o {} \;; cat /var/tmp/ipv4) 🏠#(ipconfig getifaddr en0)'
```

グローバルIPは[ifconfig.co](https://ifconfig.co)を利用して取ります．
tmuxのstatus line更新(自分の設定では5秒になっている)のたびに`curl`するのは微妙だったので5分キャッシュするようにしました．

## 廃案：IPはcronで取っておく
```:crontab
*/5 * * * * curl -s -4 ifconfig.co > /var/tmp/ipv4
```

```:.tmux.conf
set -g status-right '🌏#(cat /var/tmp/ipv4) 🏠#(ipconfig getifaddr en0)'
```

cronとの合わせ技．こちらのほうがtmux.confは簡潔．
PC移行したときにcronの設定忘れててうまくいかないとかなんか悩んでしまったので没にした．
Python学習1.00 ~普通の情報系学生がPythonを学ぶ~

#はじめに
その辺にいる情報系学生が機械学習を勉強したいと思い立ち始めたPython学習日記です。(紅白のPerfumeを見た)

記事を書く目的は主に以下の3点です。
　・アウトプットする機会を増やすため
　・論理的思考が基本的に苦手なので書くことでマシになるかも？
　・他の同じような学習者との関わりを持つため

触れたことのある他のプログラミング言語はC, Java, PHP, Rubyですが、、、
CとJavaくらいしかまともには書けません。(中では)
なので、間違いなどを見つけられましたらご指摘いただけると幸いです。

##開発環境
Windows10 64bit
Python 3.7.1
PyCharm 2018.3.2


##参考資料
学習に用いているものとして、以下の２つがメインです。
・[詳細! Python 3 入門ノート](https://www.amazon.co.jp/%E8%A9%B3%E7%B4%B0-Python-%E5%85%A5%E9%96%80%E3%83%8E%E3%83%BC%E3%83%88-%E5%A4%A7%E9%87%8D-%E7%BE%8E%E5%B9%B8/dp/4800711673/ref=sr_1_1?ie=UTF8&qid=1546995770&sr=8-1&keywords=%E8%A9%B3%E7%B4%B0%21Python3%E5%85%A5%E9%96%80%E3%83%8E%E3%83%BC%E3%83%88)
・[Python公式ドキュメント](https://docs.python.jp/3/tutorial/index.html)


##次回から
基本文法からになると思うが、個人的に詰まったところをメインに書き残していきたいと思う。
PythonのGUIライブラリ「Kivy」を使ってアプリを作ってみる。

## Kivyとは？
PythonでGUIアプリが作れるオープンソースのライブラリです。
動作環境はWindows, mac, Linuxの他、Android, iOSにも対応しています。

https://kivy.org/#home

## 開発環境
### 共通
- Python 3.6.4

### Windows10 64bit

https://www.lfd.uci.edu/~gohlke/pythonlibs/#kivy にアクセスして、**Kivy‑1.10.1‑cp36‑cp36m‑win_amd64.whl**をダウンロードします。
ダウンロードしたディレクトリでコマンドプロンプトを開き、下記コマンドを実行します。

```
python -m pip install Kivy‑1.10.1‑cp36‑cp36m‑win_amd64.whl
```

これで環境構築完了です。

### macOS 10.14.2(mojave)

homebrewで必要なパッケージをインストールします。https://brew.sh/

```
$ brew install pkg-config sdl2 sdl2_image sdl2_ttf sdl2_mixer gstreamer
```

pipを使ってCythonとKivyをインストールします。

```
$ pip install Cython==0.26.1
$ pip install kivy
```

これで環境構築完了です。

## サンプルアプリの実行

エディターを起動し、下記をコピーして名前をmain.pyにして保存します。

```python
from kivy.app import App
from kivy.uix.label import Label

class IntroKivy(App):
    def build(self):
        return Label(text="Hello, World!")

if __name__ == "__main__":
    IntroKivy().run()
```

下記コマンドで実行します。

```
python main.py
```

Hello, World!と書かれた1枚のウインドウが出れば成功です。

#### Windows
![win.png](https://qiita-image-store.s3.amazonaws.com/0/212587/d69a0017-8836-b7f1-1b46-53dbd0b565b5.png)

#### macOS
<img width="801" alt="mac.png" src="https://qiita-image-store.s3.amazonaws.com/0/212587/1b099fb8-a6c7-145b-f74d-7f04b1bf5741.png">

## まとめ
全く同じコードで異なるOSのデスクトップアプリが作れ、慣れているPythonで書けるのですごく便利そうです。
これからいろいろ触っていこうと思います。
Amazon Linux WorkSpaces 環境で使っているアプリ一覧 (自分用)

Amazon WorkSpaces (Amazon Linux 2) 環境で私が使っているアプリを備忘録としてまとめていきます。

## 使っているアプリ一覧

| 名前 | カテゴリ | インストール情報 | 備考 |
| --- | --- | --- | --- |
| CopyQ | クリップボード管理 | 自前でビルド (https://github.com/albuild/copyq) | Flathub 版はトレイアイコンが表示されない
| Figma | UI デザイン | デスクトップアプリがないので Chrome の --app=https://figma.com オプションで起動 |
| Firefox | Web ブラウザ | プリインストール |
| Flatpak | パッケージ管理 | 自前でビルド (https://github.com/albuild/flatpak) |
| Mozo | メニュー管理 | yum install -y mozo | epel エクストラリポジトリにある
| Google Chrome | Web ブラウザ | https://qiita.com/shadowhat/items/af6b973df43d75abfe8e |
| google-drive-ocamlfuse | Google Drive ユーティリティ | 自前でビルド (https://github.com/albuild/google-drive-ocamlfuse) |
| MATE Tweak | デスクトップユーティリティ | 自前でビルド (https://github.com/albuild/mate-tweak) |
| Microsoft Teams | チャット | デスクトップアプリがないので Chrome の --app=https://teams.microsoft.com オプションで起動 |
| Mozc | 日本語IM | 自前でビルド (https://github.com/albuild/mozc) |
| RealtimeBoard | ホワイトボード | デスクトップアプリがないので Chrome の --app=https://realtimeboard.com オプションで起動 |
| Slack | チャット | Slack 公式の RPM パッケージあり | Snap 版は ibus-mozc で日本語入力できない
| Snappy (Snaps) | パッケージ管理 | 自前でビルド (https://github.com/albuild/snap) |
| Typora | Markdown エディタ | Debian 用のパッケージを自前で RPM に変換 (https://github.com/albuild/typora) |
| Visual Studio Code | IDE | Microsoft 公式 yum リポジトリあり (https://code.visualstudio.com/docs/setup/linux#_rhel-fedora-and-centos-based-distributions) |

## 使わなくなったアプリ一覧

| 名前 | カテゴリ | インストール情報 | 備考 | 使わなくなった理由 |
| --- | --- | --- | --- | --- |
| Alacarte | ランチャー管理 | sudo yum -y install alacarte | | 代わりに Mozo を使うようになった
| AppEditor | ランチャー管理 | 自前でビルド (https://github.com/albuild/appeditor) | | 代わりに Mozo を使うようになった
| Evolution | メールクライアント | flatpak install flathub org.gnome.Evolution | Amazon 標準パッケージ版はバージョンが古い | いまいち使いづらかったので。サーバは Office 365 の Outlook なのでブラウザ版に切り替え
php-master-changes 2019-01-08

今日は幾つかの拡張の微妙なコード整理、mysqlnd のリファクタリング、FastZPP のマクロ内変数定義へのアンダースコア追加、opcache の修正、mb_ereg_replace() の 7.2 以前からの非互換修正があった！

# 2019-01-08
## nikic: Remove unnecessary uses of object_and_properties_init
- https://github.com/php/php-src/commit/ba5cb2eb325ffb933e4120c173c44e2e674e1506
- 不要に object_and_properties_init() を使ってる箇所を object_init_ex() へ置き換えるコード整理
- object_and_properties_init() は 第 3 引数でハッシュテーブルをとり、プロパティの初期化に利用する
- object_init_ex() は 第 3 引数 に 0 を渡して object_and_properties_init() を呼ぶラッパーなので、やってることは変わらず、単にプロパティ指定ここではしないんだよというのの明示かな

## Andrey Hristov: Simplify the command factory
- https://github.com/php/php-src/commit/8975e4dcd7d6ff5758cd97a9125eedf7b5aa6e77
- ext/mysqlnd で、コマンド実行の単純化
- 以前は動的にコマンドを組み立てるような使い方を想定してたけどいらなくなったみたいな感じかな

## Andrey Hristov: Const changes
- https://github.com/php/php-src/commit/d12443efc7b5381f4eae80ef576039e71ca31c76
- ext/mysqlnd で、より const を追加

## twose: Prefix error_code with underscore in FastZPP implementation
- https://github.com/php/php-src/commit/6305119a5193d4318add01190ca4afbb49ded102
- [7.2~]
- [FastZPP](https://wiki.php.net/rfc/fast_zpp) の実装で、マクロ内の変数定義 error_code を _error_code に修正
- これだけアンダースコア付いてなくて拡張内での利用名と被る可能性があった
- [PR:3237](https://github.com/php/php-src/pull/3737)

## remicollet: cleanup merge
- https://github.com/php/php-src/commit/0d9935739c3a035f74b54aa518f2497975402864
- [7.2~]
- マージの際に入ってたゴミの除去かな

## nikic: Don't swap operands of ZEND_MUL
- https://github.com/php/php-src/commit/1165a9068cbf3c3c24a78b47e0effcf9b90ec5bc
- [7.2~]
- ext/opcache で、`$i=expr+$i` を `$i=$i+expr` に変換して `$i+=expr` にするような最適化処理の際、ZEND_MUL を対象から除外、かな
- 行列操作みたいなの用に演算子オーバーロードが行われる際は積が常に可換ではなくなるから、ということらしい
- 実際そんなのやる拡張とかあんのかな

## nikic: Fixed bug [#77428](https://bugs.php.net/bug.php?id=77428)
- https://github.com/php/php-src/commit/76c687feaf86d305f8ba510a7319ccc1b66a8901
- [7.3~]
- ext/mbstring で、mb_ereg_replace() の動作に 7.2 以前との互換性がなくなっていた部分を修正
- [shin1x1 の人](https://twitter.com/shin1x1)が昨日くらい話してて報告された奴
- [見たら早い](https://3v4l.org/OjhAe)
- 修正箇所見ると [PR:2044](https://github.com/php/php-src/pull/2044) で入った非互換なのかな
- nikic の人いわく今のも前のもおかしいけどとりあえず前の挙動にあわしとく、みたいな感じ

## laruence: Fixed bug [#77266]((https://bugs.php.net/bug.php?id=77266)) (Assertion failed in dce_live_ranges)
- https://github.com/php/php-src/commit/cd49db9d47fa979c308ef25b43123b08be0a5ab0
- [7.3~]
- ext/opcache で、dce_live_ranges のアサーションこけを修正
- SSA 使ったデータフロー解析の最適化導入時に入ったコードあたりなのまで追ったものの時間が足りず（出社時間が来てしまい）追えてない
C++ Builder XE4 > メモリ領域 > Error: プロジェクトProject1.exeは例外クラス $C00000FD (メッセージ 'stack overflow at 0xXXXXX')を送出しました > 対処: スタック領域から静的領域に変更

```txt:動作環境
C++ Builder XE4
```

### 症状

- 200,000個の要素を持つdouble型配列を定義
- 実行時にエラーが発生

> プロジェクトProject1.exeは例外クラス $C00000FD (メッセージ 'stack overflow at 0xXXXXX')を送出しました

### 問題のコード

```Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------

static const int kNum = 200000;

void __fastcall TForm1::FormCreate(TObject *Sender)
{
	double vals[kNum] = { 0.0 };
}
//---------------------------------------------------------------------------
```

### 対応案1

vals[]の定義にstaticを付けて静的領域の定義にする。



```cpp
void __fastcall TForm1::FormCreate(TObject *Sender)
{
	static double vals[kNum] = { 0.0 };
}
```

### 静的領域

- [組込み | C > link > 変数の値の自動0初期化? | 初期化用関数を使ったRAM変数の初期化](https://qiita.com/7of9/items/eb064c8c4847420c5e52)
    - [メモリの4領域](https://brain.cc.kogakuin.ac.jp/~kanamaru/lecture/MP/final/part06/node8.html) @ Takashi Kanamaru's Web Page
- [第10回目 4大メモリその２ Static領域 と 分割コンパイル](https://theolizer.com/cpp-school1/cpp-school1-10/) @ Theoride Technology様
    - ３．staticな記憶領域（静的変数用メモリ）について

関数内の配列定義は通常スタック領域になる。
スタック領域を超えた要素数で定義されたときに'stack overflow at 0xXXXXX'になる。

組込みでも行う対処であるが、staticをつけることで、スタック領域でなく、静的領域に変更している。

### 備考

関数内で200,000個の配列を定義する必要があるか、は別の検討事項でもある。

該当コードについてはnew/deleteでの実装に変更した。
プログラマが知っているとよい設計指針（１）共用品設計(universal design)



プログラミングする際に、自分が使う開発の道具類であれば、自分が最大の利用者だから、
自分の使いやすさだけを追求してもよい。

例：Vz editor の cmos.def(著者専用の設定)

既存のプログラムの利用者には、類似の操作が可能な機能を提供するとよい。

例：Vz editorの mi.def(当時売れ筋のエディタと類似の設定)

また、その商品の固有の機能提供があってもより。

例：Vz editorのvz.def(前のEz editorの頃からの継承)

多くの人に利用してもらおうと思おう場合には、何かの設計指針か、市場調査をして設計をしていくとよい。

代表例として、共用品設計を取り上げる。

共用品・共用サービスとは？
http://www.kyoyohin.org/ja/kyoyohin/index.php


![共用品.png](https://qiita-image-store.s3.amazonaws.com/0/51423/35a8107b-b3b4-73a7-e554-c57f83f54452.png)

類似の概念として、

universal design(ユニバーサルデザイン:万能設計）
design for all(デザインフォオール:万人向設計）
inclusive design(インクルーシブデザイン:包含設計）
accessible design(アクセッシブルデザイン:到達可能設計）
barrier-free design)(バリアフリーデザイン(無障壁設計）
normalization(ノーマライゼーション:汎用化）

がある。（漢字表現はいろいろ存在する）

```:原則
多様な人々の身体・知覚特性に対応しやすい。
視覚・聴覚・触覚など複数の方法により、わかりやすくコミュニケーションできる。
直感的でわかりやすく、心理負担が少なく操作・利用ができる。
弱い力で扱える、移動・接近が楽など、身体的負担が少なく、利用しやすい。
素材・構造・機能・手順・環境などが配慮され、安全に利用できる。
```


# 視覚・聴覚・触覚など複数の方法により、わかりやすくコミュニケーションできる。


入力としては、携帯・スマフォ・Padの画面操作、音声入力、キーボード操作、マウス操作など、多様な入力方法で同じ処理ができることもこの一つかもしれない。

出力としては、画面、音声、振動、無線、ファイルなど多様な出力方法で、同じ内容が提示できるとよい。

# 多様な人々の身体・知覚特性に対応しやすい。

文字表示では、文字の大きさが三種類以上あるなど、近く特性に対応しているとよい。

# 直感的でわかりやすく、心理負担が少なく操作・利用ができる。

安全色など、危険を回避するための方法がわかりやすくなっているとよい。

プログラマが知っているとよい色使い(安全色)
https://qiita.com/kaizen_nagoya/items/cb7eb3199b0b98904a35

# 弱い力で扱える、移動・接近が楽など、身体的負担が少なく、利用しやすい。

OSの再起動ように、簡単にはできない方がよい操作が CTL+ ALT + DELのような３つの鍵を同時に押すような複雑になっていることは意味がある。片手で３つの鍵を同時に押せるような道具を作ることにも意味はある。その道具を使うときは再起動したいのだから。

# 素材・構造・機能・手順・環境などが配慮され、安全に利用できる。

それぞれの時点で、次に操作可能な一覧を提示するとよい。

元へ戻る、保存する、終了するなど常時選択可能な事項は、同じ位置に配置している。


# Advent Calendar 2022

今年企画した４つのAdvent Calendarと、それぞれの記事一つをご紹介します。

AUTOSAR Advent Calendar 2022

https://qiita.com/advent-calendar/2022/autosar

AUTOSAR References to ISO, IEC, ITU, IEEE, RFC and SEA etc.

https://qiita.com/kaizen_nagoya/items/d7d252211e10a79516df

Automotive Handbook Advent Calendar 2022

https://qiita.com/advent-calendar/2022/automotivehandbook

Basic principles, ボッシュ自動車handbook(英語)11版まとめ<2>

https://qiita.com/kaizen_nagoya/items/24a1ba5da3d09b2a95d1


2022 いいねをいただいた記事ランキング(O.K.版) Advent Calendar 2022

https://qiita.com/advent-calendar/2022/goods

2022年１月下旬　いいねをいただいた記事　16

https://qiita.com/kaizen_nagoya/items/0ee589a8edaeab24fd2a

AdCale(O.K.) Advent Calendar 2022

https://qiita.com/advent-calendar/2022/adventcalendar2022

「会議は15分未満」に。小耳にはさんだ話。

https://qiita.com/kaizen_nagoya/items/510c47c5d1e8d03145db

AdvencCalendar2022 報告

https://qiita.com/kaizen_nagoya/items/5b4b99cb9ad571f4094b


誤差の評価が苦手（専門分野以外）

https://qiita.com/kaizen_nagoya/items/cc3a50827b24ab80985f




 ＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞


# 文書履歴(document history)
ver. 0.01 初稿 20221225
ubuntu18.04にROS2 crystalをインストールしたがcolconが使えない

せしまるです。

2018年最後にROS2の新しいバージョンがリリースされていたのでインストールしてみました。

試してみたのはubuntu16.04と18.04です。

# ubuntu16.04
debianパッケージからインストールはできないのでソースからビルドします。
これについては以前書いた記事[ubuntu16.04にROS2 Bouncyをインストールする](https://qiita.com/seshimaru/items/79d86ad2fbd4f27250fc)とほとんど同じです。

異なる点は依存関係のインストール部分です。

```console:console
$ sudo rosdep init
$ rosdep update
# --rosdistroの後がcrystalになる.
$ rosdep install --from-paths src --ignore-src --rosdistro crystal -y --skip-keys "console_bridge fastcdr fastrtps libopensplice67 libopensplice69 python3-lark-parser rti-connext-dds-5.3.1 urdfdom_headers"
```

その他の部分はあまり変更はありません。


# ubuntu18.04
こちらはdebianパッケージからインストールできます。
インストール方法は[公式サイト](https://index.ros.org/doc/ros2/Installation/Linux-Install-Debians/)をご覧ください。

さて本題ですが、インストール後に動作テストとしてdemoノードを動かしてみましたが、こちらは問題なく動きます。

```console:console
# publish側
$ ros2 run demo_nodes_cpp talker

# subscribe側
$ ros2 run demo_nodes_py listener
```

じゃあcolconビルドも動くだろうと思って[ROS 2のワークスペース：colconとパッケージ](https://gbiggs.github.io/rosjp_ros2_intro/workspaces_and_colcon.html)に書いてある手順で、サンプルを取得しいざビルド！

```console:console
$ colcon build
colcon: コマンドが見つかりません
```

なんでじゃーと思いつついろいろ調べてみるも、リリースされたばっかりなのか情報がない('ω')
とりあえず現状はcolconが使えない状態です。
気になるのはソースからビルドしたときとディレクトリ構成が異なることですかね…。

調査はしていくつもりですが、この記事を読んで「これについての情報知ってるよ！」っていう方がおりましたらコメントいただけると幸いですm(_)m

何かわかり次第追記していきます。


2019/01/09追記
この記事書いてからすぐに発見した悲しい事実。
colconなどはros2とは別にインストールする必要があるみたいです。
~~ソースからビルドするときにインストールしてたじゃねぇか~~

```console:console
$ sudo apt install python3-colcon-common-extensions
```
これでインストールできます('_')
コマンドたたいても見つかりませんなんて言われません。
アロー関数の引数にjsdocで型を指定する

WebStormでアロー関数の引数に型を指定して、入力補完を効かせる方法です。

以下のように引数の前に`/** type */` を指定すれば入力補完を有効にできます。

```javascript
[].forEach(/**Number*/num1 => {
    return num1 * num1;
});
```

参考
https://stackoverflow.com/questions/35112415/jsdoc-arrow-function-params
AWS EC2 でグローバルIPアドレスを取得

EC2 でグローバルアドレスを取得する方法です。

A) Curl

```bash:get_ip.sh
#
curl http://169.254.169.254/latest/meta-data/public-ipv4
echo
curl http://169.254.169.254/latest/meta-data/public-hostname
echo
#
```

B) Python3

```py:get_ip.py
#! /usr/bin/python3
# -*- coding: utf-8 -*-
#
#	get_ip.py
#
#						Jan/09/2019
# ------------------------------------------------------------------
import sys
import requests
# ------------------------------------------------------------------
sys.stderr.write("*** 開始 ***\n")

url="http://169.254.169.254/latest/meta-data/public-ipv4"
args={}

rr=requests.get(url,args)
print(rr.text)
#
url="http://169.254.169.254/latest/meta-data/public-hostname"
rr=requests.get(url,args)
print(rr.text)
#
sys.stderr.write("*** 終了 ***\n")
# ------------------------------------------------------------------
```

参考情報
[インスタンスメタデータの取得](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-instance-metadata.html#instancedata-data-retrieval)
vue-routerのHistory モード+webpack-dev-serverでサブディレクトリにアクセスする方法

久しぶりにQiitaに帰ってキタ（Qiitaaa）ーーー！！！
どうも、岩元です。

webpack-dev-serverの開発環境の設定でハマったのでメモ。
下記のように`history`モードで、`children` オプションを利用してネストした構成にしたとき、`/users`にはアクセスできるが`/users/fuga`にアクセスしようとすると404errorが返ってくる現象が発生した。

```js:router.js
import Vue from 'vue'
import VueRouter from 'vue-router'
Vue.use(VueRouter)

export default new VueRouter({
  mode: "history",
  routes: [
    {
      path: '/',
      name: 'home',
      component: () => import("@/pages/Home")
    },
    {
      path: '/users',
      component: () => import("@/pages/Users"),
      children: [
        {
          path: '',
          component: () => import("@/pages/users/Index")
        },
        {
          path: 'fuga',
          component: () => import("@/pages/users/fuga")
        },
}
```

`publicPath` が設定されていなかったのが原因だった。

```diff:webpack.conf.js
module.exports = {
  mode: 'development',
  devtool: 'source-map',
  entry: {
    app: './src/app.coffee'
  },
  output: {
    path: path.resolve(__dirname, './dist'),
    filename: '[name]-[hash].bundle.js',
+    publicPath: '/'
  },
...

  devServer: {
    open: true,
    writeToDisk: true,
    contentBase: path.join(__dirname, '/'),
    watchContentBase: true,
    port: 8080,
    historyApiFallback: {
      historyApiFallback: true
    }
  },
```


参考: [WebpackDevServer breaks on complex nested routes #113]
 (https://github.com/react-boilerplate/react-boilerplate/issues/113)




余談: 最近BiSHにハマっている
ステートフルRNN

#ステートフルRNNとは？
<b>ステートレス（デフォルト）</b>
・各バッチ後に状態をリセットする
<b>ステートフル</b>
・バッチ間で状態を維持する
・1バッチに対して計算された隠れ状態を次のバッチの初期隠れ状態として使う

コードの違い
①モデル
②学習


#①モデル
##モデル（ステートレス）
```python
model = Sequential()
model.add(LSTM(HIDDEN_SIZE, input_shape=(NUM_TIMESTEPS, 1), return_sequences=False))
model.add(Dense(1))
```

##モデル（ステートフル）

```python
model = Sequential()
model.add(LSTM(HIDDEN_SIZE, stateful=True,
          #バッチサイズもあらかじめ指定しておく
          batch_input_shape=(BATCH_SIZE, NUM_TIMESTEPS, 1),
          return_sequences=False))
model.add(Dense(1))
```
#②学習
##学習（ステートレス）
```python
model.fit(Xtrain, Ytrain, epochs=NUM_EPOCHS, batch_size=BATCH_SIZE,
          validation_data=(Xtest, Ytest),
          shuffle=False)
```

##学習（ステートフル）

```python
# 訓練データ・テストデータのサイズをバッチサイズの倍数にする
train_size = (Xtrain.shape[0] // BATCH_SIZE) * BATCH_SIZE
test_size = (Xtest.shape[0] // BATCH_SIZE) * BATCH_SIZE
Xtrain, Ytrain = Xtrain[0:train_size], Ytrain[0:train_size]
Xtest, Ytest = Xtest[0:test_size], Ytest[0:test_size]
print(Xtrain.shape, Xtest.shape, Ytrain.shape, Ytest.shape)
for i in range(NUM_EPOCHS):
    print("Epoch {:d}/{:d}".format(i+1, NUM_EPOCHS))
    model.fit(Xtrain, Ytrain, batch_size=BATCH_SIZE, epochs=1,
              validation_data=(Xtest, Ytest),
              # ステートフルで効果的に学習をするためにシャッフルをしない
              shuffle=False)
    # 1エポックごとに状態をリセット
    model.reset_states()
```
スマホから自宅PCのVirtualBoxにリモートでJupyterNotebook使ってみた


#やりたいこと、概要
【スマホ→自宅PC→Virtualboxのubuntu→JupyterNotebook→データ処理】
**流れは**
- 自宅PCにVirtualbox入れて、ubuntu入れる
- ubuntu にAnaconda入れてJupyterできるようにする
- ubuntuに外部からsshでアクセスできるようにする
- スマホからsshでJupyter起動、ブラウザで操作できたら完成！！＼(^o^)／

#環境
- スマホ：Android
- 自宅PCOS:Windows10
- VirtualboxのOS:ubuntu

#手順
##Step1.
まず**自宅のWindows**に**Viurtualbox**入れて、ubuntuをインストールします。

✔細かい設定は好みに合わせて、適当に**メモリ**や**CPU**を割り当てたらOKです！
✔ホストOSと**ファイル共有機能**があるので、設定しておくと結構便利ですｂ
##Step2.
次にubuntuに**Anaconda**をインストールして**Jupyter**を動かせる状態にします。

##Step3.
ubuntuに**ssh**をインストールし、接続できるようにします。

✔　ホストOS側で**IP固定**、**ポートフォワード**などのネットワーク設定が必要です。
✔　ssh用とJupyterNotebook用のポートを**別々**に設定します
✔　ubuntuの**ファイアウォール**設定も行います。両方のポートをAllowにしておきます。


##Step4.
最後に外部からJupyterNotebook開けるように設定

```ruby:
$ jupyter notebook --generate-config
```
**configファイル**を作って中身を少し替えればOKです

次にスマホ側でsshのアプリ入れます。
僕はJuiceSSHを使用しています、**広告がない**のでいらいらせずに操作できると思います。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/272825/06e92167-30c6-e2d3-a71c-a52a024db1f8.png)

**これで完成です＼(^o^)／**
あとはフォントなどの設定をいつも使ってるのと同じように設定すればOK
![图片1.png](https://qiita-image-store.s3.amazonaws.com/0/272825/d1af5c21-e2e1-1f39-1b04-4b98fa05213a.png)


これ使えるかも！と思った方是非試してみてください(*^^*)
プログラムと美しさ：第七章　デザインパターン　―標準と模倣、魔法ではなく―

～ プログラミングって面白そうと思った方に向けた連載エッセイ ～

　プログラミングの世界に、デザインパターンと呼ばれるものがある。

　類型化されたプログラム上の問題に対し、解決策としてあるパターンが提示され、名前をつけられる。その効果が広く認められれば、汎用的なツールとして世界的に流通するようになる。「○○パターンで」と言えば、技術者間では「はいはい」となるくらい常識化しているパターンもいくつかある。

　もともとは建築のデザインパターンになぞらえて命名された。実用に資するという共通点から、概念的に参考にできる点が多くあったのだろう。建築家クリストファー・アレグザンダーの提唱した「パタン・ランゲージ」から多くの影響を受けているという。

　パターンとは模倣であり、省力化である。それは、あちらこちらで起こる問題の解決にかかる労力の省力化であるとともに、伝える労力の省力化でもある。プログラムがあるパターンに基づいて実装されていれば、どのような問題に対して何を意図してどのような構造で実装されたのか、おおよその見当がつき、理解の助けになる。

　デザインパターンは一般に美しいものと認識されている。美しくないパターンはそもそも流通しないので、よく目にするパターンが秀逸だということもあるだろう。が、それだけではない。パターンを使う、標準に倣うことがプログラミングの世界では美しいとされている。拠るべき標準は、できるだけ広く、多くの人に浸透しているものが望ましい。ローカルな標準は、いつグローバルな標準に駆逐されるかわからない、想定ケースが甘くなりがち、という二つの意味で脆い。その維持にはコストもかかる。

　標準は規格化されていることもあれば、デファクトスタンダード（事実上の業界標準）やベストプラクティス（最善の慣行）として広く認知されていることもある。デザインパターンに関しては、"GoF"("The Gang Of Four") （エーリヒ・ガンマ、リチャード・ヘルム、ラルフ・ジョンソン、ジョン・ブリシディースからなる「４人の奴ら」[^1]）によって定義されたものが圧倒的に有名で、実際に使用される機会も多い。

　建築や美術、音楽の世界では、ある種の作品が「様式美」と評されることがある。形式的に限定された、ルールを与えられた中での表現とその鑑賞に、特有の趣があるのだろう。プログラミングのデザインパターンは様式美とは少し異なる。むしろ対照的なものかもしれない。○○風の流れに乗る、といった趣味的要素はそこにはない。デザインパターンを支えるのは必然性である。優秀な技術者が考え抜けばいつか辿り着くであろう共通の解決策を整理したもの、という見方もできる。そこには根拠があり、目的がある。パターン自体は手段にすぎない。様式美は意図的な形式的模倣と考えられるが、デザインパターンの活用で重視されるのは形式ではなく、問題の実質的解決である。

　パターンを使うことで、達人たちが試行の末にたどり着いた知恵に労せずしてあやかることができる。適切に利用される限り、パターンをなぞることが「パクリ」と非難されることはない。プログラムは「言語」である。言語は模倣を前提に成り立っている。プログラミングにおいて、模倣それ自体は悪ではなく、むしろポジティブに評価されることが多い。

　ただし、デザインパターンを言い訳や盾に使ってはならない。パターンは、それを使うだけでいいコードになるという魔法ではない。無条件に品質を保証したり、レビューアから守ってくれるわけではないし、知っているパターンの数がプログラマの質に直結するわけでもない。

　コードの置かれた状況は似ているようでも個々に異なる。それを見極め、ここぞというときに活用してこその知恵である。流通しているパターンにそれなりの信頼性と効用があるのは間違いないが、神格化するのでなく、ここで使うとどんなありがたさが待っているのか、トレードオフも踏まえて意識できるとよいだろう。

　とは言うものの、パターンを覚えたての時期はつい濫用しがちになる。それは一つの「アンチパターン」ではあるが、覚えたら使いたくなるのがプログラマの性、向上心の証とも言えるだろう。多少はご愛敬、ただし効果の検証は怠らず、違ったなと思ったらリファクタリングを検討しよう。

---

[序章](https://qiita.com/CodeOne/items/01b4e49a7d5a84d48c71)
[第一章　その美の特徴](https://qiita.com/CodeOne/items/1969ec81d04529fbdb34)
[第二章　見た目と冗長性](https://qiita.com/CodeOne/items/96df6d1140301347156a)
[第三章　ロジック](https://qiita.com/CodeOne/items/3009027a2f8b892e2b6b)
[第四章　命名](https://qiita.com/CodeOne/items/dfc3ace22c46273dc22c)
[第五章　アーキテクチャ](https://qiita.com/CodeOne/items/469b9f421e5d914f1ffb)
[第六章　リファクタリング](https://qiita.com/CodeOne/items/df50fad6bb0bd2f0096f)
第七章　デザインパターン
[第八章　正規化](https://qiita.com/CodeOne/items/5df2a5e38cc4c1c90a7a)
[終章](https://qiita.com/CodeOne/items/12ad8d54329bc946b85c)

[^1]: 私訳。「四人組」「４人のギャングたち」と訳されることが多いが、英語圏の方に確認したところ、冗談っぽい使い方ということだったので。