OmniAICreator/Qiita-1.07M huggingface dataset:
MACで擬似的にIE使用 (Chromeブラウザ互換)

MACで開発している時にブラウザ互換を簡易で実施したい時がある。
Chrome のデベロッパーツールに設定があったのでメモ

1. デベロッパーツールを表示（F12、メニュー>その他ツール>デベロッパーツール etc...）
2. 表示された デベロッパーツールの メニュー>More tools>Network conditions を選択
3. 表示された Network conditions の User agent の Select automatically のチェックを外す
4. Custom 表示された選択欄のプルダウンよりブラウザを選択してページを更新
[Rust] Lagrange 補間

データ点が与えられたとき, そこから Lagrange 補間多項式をクロージャとして返すサブルーチン. データはクロージャが所有権を持つようにムーブする.

パターン 1: `std::iter::Sum` を要求する.

```rust
use std::iter::Sum;
use std::ops::{Sub, Mul, Div};

fn lagrange_interpolation<T>(xs: Vec<T>, fs: Vec<T>) -> impl Fn(T) -> T
    where T: Copy + PartialEq + Sum + Sub<Output=T> + Mul<Output=T> + Div<Output=T>
{
    move | x: T | -> T {
        xs.iter().zip(fs.iter())
            .map(|(xi, &fi)|
                 xs.iter()
                     .filter(|&xk| xk != xi)
                     .fold(fi, |acc, &xk| acc * (x-xk)/(*xi-xk)))
            .sum::<T>()
    }
}
```


パターン 2: `std::default::Default` を要求して和を自前で実装. (意味的には `num` クレートの `num::Zero` トレイトを用いるべきだけど `std` だけで完結させたかったので)

```rust
use std::default::Default;
use std::ops::{AddAssign, Sub, Mul, Div};

fn lagrange_interpolation<T>(xs: Vec<T>, fs: Vec<T>) -> impl Fn(T) -> T
    where T: Copy + PartialEq + Default + AddAssign + Sub<Output=T> + Mul<Output=T> + Div<Output=T>
{
    move | x: T | -> T {
        let mut f = T::default();

        for (xi, &fi) in xs.iter().zip(fs.iter()) {
            f += xs.iter()
                .filter(|&xk| xk != xi)
                .fold(fi, |acc, &xk| acc * (x-xk)/(*xi-xk));
        }

        f
    }
}
```
メモ: 2038年問題

## cookie

※ 64bit版のブラウザであれば問題ないと思われるが、デスクトップPCでは32bit版のブラウザをまだ見る。

* [2038年問題でクッキーの有効期限がブラウザを閉じるまでになっていた | Sun Limited Mt.](http://blog.syuhari.jp/archives/220)


## phpのタイムスタンプ

32bitOSの場合は困ってしまう様子。

* [【php】タイムスタンプは2038年まで？64bit環境でも？ at softelメモ](https://www.softel.co.jp/blogs/tech/archives/2272)


## C言語

> 時刻を取得する際に多く使っている「time_t」変数の整数型の定義を変更しなければならない、もしくは別に時刻を取得するプログラムを作る必要がある。ANSI（米国規格協会）規格のtime_t変数は実装する際に、32ビットの符号付き整数になっていることが一般的だからだ。

* [「西暦2038年問題」でトラブル相次ぐ | 日経 xTECH（クロステック）](https://tech.nikkeibp.co.jp/it/members/NC/ITARTICLE/20040325/1/)
* [Big Sky :: 何もソースコードを変更せずに2038年問題を解決する。](https://mattn.kaoriya.net/software/year_2038_problem.htm)
FrontISTR v5.0 を macOSでMUMPS/Metis込みで最速でコンパイルする手順

細かいことは抜きにして、最も手っ取り早い方法です。
動けばいいという人向け。

# ビルド環境及び並列計算の構築 (パッケージ)

```bash
brew install gcc cmake open-mpi 
brew tap dpo/openblas
brew tap-pin dpo/openblas
brew install metis openblas scalapack
brew install mumps

git clone https://github.com/FrontISTR/FrontISTR.git
cd FrontISTR
mkdir build; cd build
cmake  ..
make -j
make install
```
[Windows]OpenProcessを使用するときに難読化する理由

OBSの内部に以下のソースコードがあります。

https://github.com/obsproject/obs-studio/blob/c938ea712bce0e9d8e0cf348fd8f77725122b9a5/plugins/win-capture/game-capture.c#L270-L287

```c++
static inline HMODULE kernel32(void)
{
	static HMODULE kernel32_handle = NULL;
	if (!kernel32_handle)
		kernel32_handle = GetModuleHandleW(L"kernel32");
	return kernel32_handle;
}

static inline HANDLE open_process(DWORD desired_access, bool inherit_handle,
				  DWORD process_id)
{
	static HANDLE(WINAPI * open_process_proc)(DWORD, BOOL, DWORD) = NULL;
	if (!open_process_proc)
		open_process_proc = get_obfuscated_func(
			kernel32(), "NuagUykjcxr", 0x1B694B59451ULL);

	return open_process_proc(desired_access, inherit_handle, process_id);
}
```

わかりづらくされていますが内容としては単純に`OpenProcess`を呼んでいるだけです。
なぜこんなことをする必要があるのでしょうか。

宣言をみれば説明が書いてありますが`A/Vs`というのがなんなのかよくわかりませんでした。

```c++
/* this is a workaround to A/Vs going crazy whenever certain functions (such as
 * OpenProcess) are used */
extern void *get_obfuscated_func(HMODULE module, const char *str, uint64_t val);
```

ググってみるとズバリそのままの回答を見つけました。

[Question / Help - win-capture: What&#039;s the benifit of using obfuscation when calling openprocess | OBS Forums](https://obsproject.com/forum/threads/win-capture-whats-the-benifit-of-using-obfuscation-when-calling-openprocess.101748/)

> Because some braindead antivirus / antimalware software considers programs that use OpenProcess / CreateRemoteThread to be malware.

草
備忘録ーCentOSでの日本語入力設定ー

CentOS(主に7)でのibusインストール後の設定。

```bash:~/.bash_profile
export GTK_IM_MODULE=ibus
export XMODIFIERS=@im=ibus
export QT_IM_MODULE=ibus
ibus-daemon -dx &
```

以上!!
IntelliJ IDEA + Ruby pluginでデバッガがエラーで起動しない時のワークアラウンド

私はIntelliJ IDEAにRuby pluginを入れてRailsアプリ開発を行っている。
ある日、IntelliJ IDEAを2019.2.3にアップデートしたらデバッガがまともに起動しなくなった。

その時のエラーメッセージはこんなの。

```
Uncaught exception: /Users/n/.rbenv/versions/2.5.5/gemsets/hogehoge/gems/activesupport-5.2.3/lib/active_support/inflector/methods.rb:176: invalid multibyte char (US-ASCII)
（中略）
/Users/n/.rbenv/versions/2.5.5/lib/ruby/gems/2.5.0/gems/debase-0.3.0.beta3/lib/debase.rb:22:in `compile_file'
```

この現象に困っている人は結構いて、[JetBrainsのYouTrack](https://youtrack.jetbrains.com/issue/RUBY-24278)にワークアラウンドが紹介されていた。
その方法は`debase.rb`の先頭に以下の2行を書き込むこと。

```
Encoding.default_internal = Encoding::UTF_8
Encoding.default_external = Encoding::UTF_8
```

肝心の`debase.rb`の在り処はデバッグ実行を行おうとした時のログ（上記）に出ている。
【日本語変数名で学ぶ】axiosのqueryパターンを実装で利用する

新しいFEのメンバーをむかえる日が並行した仕事のリリース日だったGENYAです。

## tl;dr
axiosのqueryパターンを使いたい場合は axios/lib/helpers/buildURLを読み込み、使う。

```javascript
import buildURL from "axios/lib/helpers/buildURL";
const axiosの生成Query = buildURL(現在のURL, { a: "", b: 1, c: [1, 2, 3] });
// out => https://6bth3.csb.app/?a=&b=1&c[]=1&c[]=2&c[]=3
```

https://codesandbox.io/s/query-axios-pattern-6bth3


## 課題感

[Ruby on Rails](https://rubyonrails.org/)の[RANSACK](https://github.com/activerecord-hackery/ransack)が受け取れるqueryのパターンがbracketなquery情報だった。

どうせならaxiosのquery生成のパターンと**全く同じ実装**を使えた方がミスがなくてよいねという話しになりました。

※ [query-string](https://github.com/sindresorhus/query-string#arrayformat-1)も `arrayFormat: bracket`を指定することで同じことが実現できます。


```javascript
import buildURL from "axios/lib/helpers/buildURL";
const 現在のURL = `${global.location.href}`;
const axiosの生成Query = buildURL(現在のURL, {
  a: "",
  b: 1,
  c: -1,
  d: null,
  e: false,
  f: true,
  g: [1, 2, 3],
  h: { いろはに: "ほへと" }
});

export function App() {
  return (
    <p>{axiosの生成Query}</p>
  );
}

// => https://6bth3.csb.app/?a=&b=1&c=-1&e=false&f=true&g[]=1&g[]=2&g[]=3&h=%7B%22%E3%81%84%E3%82%8D%E3%81%AF%E3%81%AB%22:%22%E3%81%BB%E3%81%B8%E3%81%A8%22%7D
```
https://codesandbox.io/s/query-axios-pattern-6bth3

## まとめ
複数の実装を持ってくるのではなく、同一の実装にまとめることで複雑度を１つ取り除くことができました。
こういった実装を積み重ねしていくことで抽象度を下げていければ良いですね。
「日別訪問者数の最大平均区間(large) Python3編」でやったこと

#対象
これは paizaランク A 相当の練習問題として[ここ](https://paiza.jp/works/mondai/skillcheck_archive/max_range_large?language_uid=python3)にあった問題の解答の解説となる。
内容は極めて初心者向けです。

#概要
この問題は計算を軽量化することがいかに重要かを体感するものであった。

#コード

```py
#入力
days, span = map(int, input().split())
visitors = list(map(float, input().split()))

#初期化・第１区間の計算
earliest_day = 0
num_of_candidate = 1
sum_visitor = sum(visitors[0:span])
largest_ave_visitor = sum_visitor / span

#第２区間以降の計算と判定
for i in range(1, days-span+1):
    sum_visitor = sum_visitor - visitors[i-1] + visitors[i+span-1] #前区間の計算結果を用いた今区間の計算
    ave_visitor = sum_visitor / span
    if ave_visitor == largest_ave_visitor: #今区間平均値が、現在の最大平均値と同じであれば
        num_of_candidate += 1 #候補数をカウント
    elif ave_visitor > largest_ave_visitor:  #今区間平均値が、現在の最大平均値より大きければ、
        earliest_day = i #インデックス番号を更新
        largest_ave_visitor = ave_visitor #最大平均値の更新
        num_of_candidate = 1 #候補数のリセット

#出力
print(num_of_candidate, earliest_day+1) #earliest_dayはインデックス番号なので１を加えて日付に直す
```

#感想
わかりやすく変数名を定義するのを心掛けた。

始めは愚直に逐一平均値を求めたが、８回目のテストでタイムアウトをもらったので、
前区間の結果から今区間を計算する手法をとった。

また、sum_visitorという変数を使わずにsum_visitorを求める際、largest_ave_visitorをspan倍する方法を取ろうとしたが、
小数点の下の方で変なことになりそうだったので、無難にsum_visitorを定義し、整数で取り扱うこととした。
Debian 10にPHP 7.3をインストール（OS標準）

# はじめに

Debian10にPHPを標準インストール
親記事：[PHP, PHP-FPMの各種インストール方法とEOLまとめ](https://qiita.com/witchcraze/items/dfe3823554b7caba6f6a)

## LOG

### インストール

```shell-session
# cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 10 (buster)"
NAME="Debian GNU/Linux"
VERSION_ID="10"
VERSION="10 (buster)"
VERSION_CODENAME=buster
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"

# apt update;apt install -y php
... 略
```

### 各種確認

```shell-session
# which php
/usr/bin/php

# php -v
PHP 7.3.9-1~deb10u1 (cli) (built: Sep 18 2019 10:33:23) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.9, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache v7.3.9-1~deb10u1, Copyright (c) 1999-2018, by Zend Technologies

# php -i | grep php.ini
Configuration File (php.ini) Path => /etc/php/7.3/cli
Loaded Configuration File => /etc/php/7.3/cli/php.ini

# apt show php
Package: php
Version: 2:7.3+69
Priority: optional
Section: php
Source: php-defaults (69)
Maintainer: Debian PHP Maintainers <team+pkg-php@tracker.debian.org>
Installed-Size: 12.3 kB
Depends: php7.3
Download-Size: 5964 B
APT-Manual-Installed: yes
APT-Sources: http://deb.debian.org/debian buster/main amd64 Packages
Description: server-side, HTML-embedded scripting language (default)
```
herokuへのデプロイ時に「The page you were looking for doesn't exist」と出た時の対処法

最近よくHerokuを使う機会があるのですが、その時に出てくるこれ
<img width="534" alt="スクリーンショット 2019-09-25 1.31.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/443678/9c1cec69-dc91-cee1-6fea-641f234241b5.png">

どうしたら解決するか調べてたんですが、やっとわかるようになって来たので忘れないよう記録も兼ねて書き記してみます。
##解決策
heroku上にpushをする前にコンソール上で、

><b>rake assets:precompile</b>

を叩けば終わり。
でもrake assets:precompileを叩いた時に、yarmが入ってないよ！
という警告が出るときがあるので、その時は

>brew install yarn

を叩いてから実行するといいと思います。
Debian 9にPHP 7.0をインストール（OS標準）

# はじめに

Debian9にPHPを標準インストール
親記事：[PHP, PHP-FPMの各種インストール方法とEOLまとめ](https://qiita.com/witchcraze/items/dfe3823554b7caba6f6a)

## LOG

### インストール

```shell-session
# cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 9 (stretch)"
NAME="Debian GNU/Linux"
VERSION_ID="9"
VERSION="9 (stretch)"
VERSION_CODENAME=stretch
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"

# apt update;apt install -y php
... 略
```

### 各種確認

```shell-session
# which php
/usr/bin/php

# php -v
PHP 7.0.33-0+deb9u5 (cli) (built: Sep 18 2019 09:55:34) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2017 Zend Technologies
    with Zend OPcache v7.0.33-0+deb9u5, Copyright (c) 1999-2017, by Zend Technologies

# php -i | grep php.ini
Configuration File (php.ini) Path => /etc/php/7.0/cli
Loaded Configuration File => /etc/php/7.0/cli/php.ini

# apt show php
Package: php
Version: 1:7.0+49
Priority: optional
Section: php
Source: php-defaults (49)
Maintainer: Debian PHP Maintainers <pkg-php-maint@lists.alioth.debian.org>
Installed-Size: 12.3 kB
Depends: php7.0
Download-Size: 5016 B
APT-Manual-Installed: yes
APT-Sources: http://deb.debian.org/debian stretch/main amd64 Packages
Description: server-side, HTML-embedded scripting language (default)
```
Gitについて勉強する。第一弾  (Gitは内部で何をやっているのか？編)

# はじめに

Gitを使用していますが、コンクリフトやマージが怖くて使いこなせていない。VSCodeやXCodeでコミットをしているが、中で何が起こっているかわかっていない。
周りに有識者もおらず、流石にまずいだろと思って、Gitの基礎から学ぶことにしました。

# Gitってなんですか？

分散型バージョン管理システム。
Linuxの開発を行っている際に、使用していたバージョン管理システムが、イケてないからCoolなのを作っちまおうぜってことで、
リーナス・トーバルズさんが作ったのが始まりだそうです。

# GitHubとは何が違うの？

GitHubは、Gitのホスティングサービスの一つです。
(GitHub以外には、Bitbucketなどもあります。)
ざっくりいうと「Gitを利用した、開発者のためのWebサービス」のことです。
オープンソースの開発をもっと手軽にやりたいという目的で誕生したのがきっかけだそうです。

<details><summary>豆知識(GitHubの貢献)</summary>
GitHubがないときはオープンソースに関わるのがとてもハードルが高かったそうです。
オープンソースの集会？に顔を出して、開発者たちとコンタクトを取って、俺も仲間に入れてくれ〜ってしなくちゃいけなかったんですね。ネットがほとんど普及してないときのゲームサークルに入るみたいなもんか？(ほとんど想像で言ってます)    
でもGitHubが出てからは、一般人でも簡単にオープンソースに関われるようになり、今のオープンソース時代がやってきたわけですね。</details>

# Gitの仕組み

Gitは、ファイルそのものをまるっとコピー(スナップショット)し、リポジトリに存在する、一つ前の状態と比較することで、バージョン管理を行っている。

これを実現するために、Gitには下記の３つの領域を持っています。
1. ワーキングディレクトリ (作業ディレクトリ)
2. ステージングエリア (一時変更履歴)
3. ローカルリポジトリ (Gitディレクトリ)

上記の領域はすべてローカル環境なので、実はGitの作業は殆どローカルで完結していることになります。(私はこのことを理解しておらず、知ったときにびっくりしました。)

# コマンドの裏で何が起きてるの？

基礎的なコマンドで一体何が起きているのかをまとめます。

## git init

対象のディレクトリをGit管理下にするための初期設定をします。
このコマンドで「.gitディレクトリ」が作成されます。
ls -aコマンドとかで作成されているのが確認できると思います。
この「.gitディレクトリ」内でGitで行われている操作がすべて保持されています。

## git add "ファイル名"

対象のファイルを「ステージングエリア」に追加します。
ざっくりというとステージングエリアは、変更予備軍です。(認識あってるか不安ですが...)

開発中は、変更内容すべてを反映させたいってことばかりではないはずです。作成途中で不要になる箇所とかって出ますよね？
そのため変更内容をステージングエリアで変更を一時的に保持しておき、後述の「git commit」で必要なものだけを「Gitディレクトリ」に格納します。

ちなみに「git add .」を実行するとカレントディレクトリ以下すべてが「ステージングエリア」に追加されます。

## git commit

ステージングエリアにあるファイルを取得し、スナップショットを取ります。このスナップショットを「Gitディレクトリ」にバージョンとして保管します。

## まとめ

Gitには、ワーキングディレクトリ、ステージングエリア、ローカルリポジトリの3つの領域がある。

変更をリポジトリに格納するには以下の流れになる。
1. ワーキングディレクトリでの作業を行う
2. addすることで変更内容をステージングエリアに追加
3. commitでステージングエリア内のファイルを、バージョンとしてローカルリポジトリに格納

## あとがき

今はとりあえずここまでですが、これからコンクリフトが起きたときの対処や、私が恐怖しているマージについても学んでいきたいと思っています。

Git勉強編はこれからも記事を作成していきます。
私がGitをかっこよく使いこなせるその時まで...

[次・第二弾](https://qiita.com/hajime_manul/items/369d337f500d30cd336d)


# 参考
[Git - Gitの基本](https://git-scm.com/book/ja/v1/%E4%BD%BF%E3%81%84%E5%A7%8B%E3%82%81%E3%82%8B-Git%E3%81%AE%E5%9F%BA%E6%9C%AC)
[いまさら聞けないGitとGitHubの違いって何？ \| in-Pocket インポケット](https://www.i3design.jp/in-pocket/3111)
[Gitのコミットの裏側で起こっていること - LIVESENSE ENGINEER BLOG](https://made.livesense.co.jp/entry/2017/08/22/080000)
ルパン三世のカシャカシャってなるタイトルコールのやつを全画面にしたかった

# はじめに

元ネタは以下の記事。

[ルパン三世のカシャカシャってなるタイトルコールを好きな文字列で生成する](https://qiita.com/Sirloin/items/3db49c97763042e95eb5)

コレを軽量化してSVG化した方が現れた。

[ルパン三世のカシャカシャってなるタイトルコールのやつをsvgにしたかった](https://qiita.com/misohagi/items/1c89bce8a3bffe973b92)

また、スライダーにより自由にサイズは可変可能。

なら俺は・・・

**全画面で表示したいんだ！！！！**（ホントはPWA化もしたかったけど、気が向いたら・・・）

# どんなものができたのよ。

※音が出ます。

https://shinoharata.github.io/rupinthethirdtitlecall/

# 変更箇所

そんなに難しいことはしていないのですが、かんたんなツールとか作るときによく使う小技があるのでご紹介。

```HTML
    <style>
        body {
            margin: 0;
            width: 100%;
            height: 100vh;
        }
        
        .title_call {
            width: 100%;
            height: 100vh;
        }
        /* 中略 */
    </style>
```

スタイルのbodyに`margin: 0;`を指定するのは鉄板。全画面にするとき、Chromeの仕様で最初から8pxほどのマージンが発生します。

その他、`width: 100%;`を指定するのは**下部のスクロールバーを隠すため**

あとは、入力欄のAbsoluteなどを設定して完了。

# まとめ

多分、かんたんなフレームワークで入力画面と表示画面を分けてあげるといい感じになるのかなと思います。（録画したりとか）

久々にこんな感じで見つけてForkして手直しするの、楽しいですよね

# 追記

まだなんか、折り返しの表示がうまくいってないなー・・・
XCUITestをDark Modeで実行する方法

fastlane snapshot などを用いているときにXCUITestをダークモードの状態で起動し、スクリーンショットを撮影したい場面があると思います。

LaunchArgumentsの指定による方法などでシミュレータを強制的にダークモードにして起動できると良いのですが、今の所そのような方法が見つかっていません。


ワークアラウンドとして以下のような手法を使うとうまくいっているため紹介します。


## 手順1: launchArguments に何らかのフラグを付与


```swift
func testDarkmode() {
    let app = XCUIApplication()
    app.launchArguments.append("darkmode")
    app.launch()
    ...
}
```

アプリ側で分岐ができれば方法は何でも良いです。


## 手順2: UIWindow.overrideUserInterfaceStyleを書き換え

```SceneDelegate.swift
let window = UIWindow(windowScene: windowScene)

...

if ProcessInfo.processInfo.arguments.contains("darkmode") {
    window.overrideUserInterfaceStyle = .dark
}
```

コードで強制的にダークモードを使う方法として、 `overrideUserInterfaceStyle` を使う方法がすぐに見つかると思います。

- [UIViewController.overrideUserInterfaceStyle](https://developer.apple.com/documentation/uikit/uiviewcontroller/3238087-overrideuserinterfacestyle)

ここで rootViewControllerの `overrideUserInterfaceStyle` を書き換えようとしてしまいがちなのですが、その場合presentなどで画面遷移が起こった先でダークモードを維持することができません。
しばらく悩んだのですが、UIViewにも同じ `overrideUserInterfaceStyle` が生えておりそちらのドキュメントに答えが書いてありました。

- [UIView.overrideUserInterfaceStyle](https://developer.apple.com/documentation/uikit/uiview/3238086-overrideuserinterfacestyle)

UIWindowのそれにセットすればそのウィンドウ下をすべてダークモードにすることができるようです。
晴れて画面遷移した先でもダークモードを維持することができました。
Nuxt.jsで外部scssを読み込む

#やりたいこと
・外部scssを使いたい
・vueファイルで変数、mixinを使いたい
実際の運用ではVueファイルで変数を使うことも出てくることもあるので、両方設定するのがほとんどかと思います

#前提条件
create-nuxt-appで環境が構築されていること
参考：<a href="https://ja.nuxtjs.org/guide/installation" target="_blank">https://ja.nuxtjs.org/guide/installation</a>

#外部scssを使いたい
###必要なパッケージをインストールする
これでscss記法を使えるようになります。

```
npm install --save-dev sass-loader node-sass
```

###nuxt.config.jsのGlobal CSSの箇所を編集
これで外部scssを読み込むようになります。
※scssファイル名はご自分の環境に合わせて変更してください

```javascript:nuxt.config.js
  /*
  ** Global CSS
  */
  css: [
    '~/assets/scss/style.scss'
  ],
```

#vueファイルで変数、mixinを使いたい
###必要なパッケージをインストールする

```
npm install --save-dev @nuxtjs/style-resources
```

###nuxt.config.jsのNuxt.js modulesの箇所を編集
これでvueファイルで変数、mixinを使えるようになります。
※scssファイル名はご自分の環境に合わせて変更してください

```javascript:nuxt.config.js
  /*
  ** Nuxt.js modules
  */
  modules: [
    '@nuxtjs/style-resources',
  ],
  styleResources: {
    scss: [
      '~/assets/scss/core/_variables.scss',
      '~/assets/scss/core/_mixins.scss',
    ]
  },
```

参考：<a href="https://github.com/nuxt-community/style-resources-module/" target="_blank">https://github.com/nuxt-community/style-resources-module/</a>
Rails - LIKE句を使った文字のあいまい検索（特定の文字を含む語句を曖昧検索したい場合）

#特定の文字を含む語句を特定のカラムに持ったレコードを検索したい時。
仕事でRailsで文字列検索をする必要があったので、忘備録的にシェアします。

## LIKE句の基本（完全一致検索）
まず文字検索をしたい時はLIKE句を使います。

```ruby

モデル名.where('カラム名 like ?','検索したい文字列')
```

これで検索したい文字列列に完全一致するカラムを抽出します。

## 前方一致
検索したい文字列が前方一致するカラムを持ったレコードを探したい時は
**ワイルドカードである「%」あるいは「_」を使います。**

それぞれの意味は
- %   任意の0文字以上の文字列
- _   任意の1文字


```ruby

モデル名.where('カラム名 like ?','検索したい文字列%')前方一致
モデル名.where('カラム名 like ?','検索したい文字列_')後ろに一文字だけ付いている前方一致
```

##後方一致
検索したい文字列が後方一致するカラムを持ったレコードを探したい時は

```ruby

モデル名.where('カラム名 like ?','%検索したい文字列')後方一致
モデル名.where('カラム名 like ?','_検索したい文字列')先頭に一文字だけ付いている後方一致
```

##特定の文字を含む語句を曖昧検索したい場合（部分一致）
検索したい文字列が文字列の一部で使われているカラムを持ったレコードを探したい時は

```ruby

モデル名.where('カラム名 like ?','%検索したい文字列%')文字列のどの部分にでも検索したい文字列が含まれていればOK
モデル名.where('カラム名 like ?','_検索したい文字列_')先頭と後方に一文字だけ何か文字が付いていて、検索したい文字列が中間にある場合。
```

例えば上の部分一致を使った例を出すと
```
モデル名.where('content like ?','%こんにちは%')
```
この書き方だと、あるモデルのcontentカラムの文字列データのどこかの部分に「こんにちは」と含まれているレコードを抽出できる。
Debian 8にPHP 5.6をインストール（OS標準）

# はじめに

Debian8にPHPを標準インストール
親記事：[PHP, PHP-FPMの各種インストール方法とEOLまとめ](https://qiita.com/witchcraze/items/dfe3823554b7caba6f6a)

## LOG

### インストール

```shell-session
# cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 8 (jessie)"
NAME="Debian GNU/Linux"
VERSION_ID="8"
VERSION="8 (jessie)"
ID=debian
HOME_URL="http://www.debian.org/"
SUPPORT_URL="http://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"

# apt update;apt install -y php5
... 略
```

### 各種確認

```shell-session
# which php
/usr/bin/php

# php -v
PHP 5.6.40-0+deb8u6 (cli) (built: Sep 15 2019 11:18:30)
Copyright (c) 1997-2016 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies
    with Zend OPcache v7.0.6-dev, Copyright (c) 1999-2016, by Zend Technologies

# php -i | grep php.ini
Configuration File (php.ini) Path => /etc/php5/cli
Loaded Configuration File => /etc/php5/cli/php.ini

# apt show php5
Package: php5
Version: 5.6.40+dfsg-0+deb8u6
Installed-Size: 29.7 kB
Maintainer: Debian PHP Maintainers <pkg-php-maint@lists.alioth.debian.org>
Depends: libapache2-mod-php5 (>= 5.6.40+dfsg-0+deb8u6~) | libapache2-mod-php5filter (>= 5.6.40+dfsg-0+deb8u6~) | php5-cgi (>= 5.6.40+dfsg-0+deb8u6~) | php5-fpm (>= 5.6.40+dfsg-0+deb8u6~), php5-common (>= 5.6.40+dfsg-0+deb8u6~)
Homepage: https://secure.php.net/
Section: php
Priority: optional
Download-Size: 1304 B
APT-Manual-Installed: yes
APT-Sources: http://security.debian.org/debian-security/ jessie/updates/main amd64 Packages
Description: server-side, HTML-embedded scripting language (metapackage)

N: There is 1 additional record. Please use the '-a' switch to see it

# apt show php5 -a
Package: php5
Version: 5.6.40+dfsg-0+deb8u6
Installed-Size: 29.7 kB
Maintainer: Debian PHP Maintainers <pkg-php-maint@lists.alioth.debian.org>
Depends: libapache2-mod-php5 (>= 5.6.40+dfsg-0+deb8u6~) | libapache2-mod-php5filter (>= 5.6.40+dfsg-0+deb8u6~) | php5-cgi (>= 5.6.40+dfsg-0+deb8u6~) | php5-fpm (>= 5.6.40+dfsg-0+deb8u6~), php5-common (>= 5.6.40+dfsg-0+deb8u6~)
Homepage: https://secure.php.net/
Section: php
Priority: optional
Download-Size: 1304 B
APT-Manual-Installed: yes
APT-Sources: http://security.debian.org/debian-security/ jessie/updates/main amd64 Packages
Description: server-side, HTML-embedded scripting language (metapackage)

Package: php5
Version: 5.6.33+dfsg-0+deb8u1
Installed-Size: 29.7 kB
Maintainer: Debian PHP Maintainers <pkg-php-maint@lists.alioth.debian.org>
Depends: libapache2-mod-php5 (>= 5.6.33+dfsg-0+deb8u1~) | libapache2-mod-php5filter (>= 5.6.33+dfsg-0+deb8u1~) | php5-cgi (>= 5.6.33+dfsg-0+deb8u1~) | php5-fpm (>= 5.6.33+dfsg-0+deb8u1~), php5-common (>= 5.6.33+dfsg-0+deb8u1~)
Homepage: https://secure.php.net/
Tag: devel::lang:php, devel::runtime, implemented-in::c, protocol::http,
 role::metapackage, secteam::squeeze-limited-support,
 secteam::wheezy-limited-support, web::scripting
Section: php
Priority: optional
Download-Size: 1314 B
APT-Sources: http://deb.debian.org/debian/ jessie/main amd64 Packages
Description: server-side, HTML-embedded scripting language (metapackage)
```
こんなのがあったのか!? Python用VCR（vcrpy）

## はじめに
Webサイトからスクレイピングする際、テストのために多くのリクエストを飛ばしてしまい、相手に迷惑をかけてしまう恐れがあります。:worried:

Rubyでは、VCRというgemがあり、1度投げたリクエスト結果をローカルのファイルに保存しておいて、再度同じリクエストが投げれられた場合に保存したファイルを参照しにいくという便利なものがあると噂に聞きました。

ちょうどPythonでスクレイピングのコードを書いていた私は、これのPython版がないか探したところ、見つけた＆使ってみて感動したので記事を書くことにしました。

## Python版VCR - vcrpy

https://vcrpy.readthedocs.io/en/latest/index.html

公式ドキュメントに```This is a Python version of Ruby’s VCR library.```と書いてあるあたりが、まさに求めていたものですね。

### VCRとは？

https://www.weblio.jp/content/VCR

> VCR 【Video Cassette Recorder】
> 主にアメリカで使われる言葉で日本でのVTRと同じ。 家庭に普及しているVHS等のカセットに入ったテープを使用するVTRのこと。

なるほど。公式ドキュメントのイメージ画像がVHSのカセットテープなのもなっとくです。

## 使い方
メソッドの上に``` @vcr.use_cassette() ```と書くだけです。
これだけで、対象のメソッドから呼ばれるrequestsの結果をファイルに保存してくれます。

デフォルトだと、実行ファイルと同ディレクトリ上にrequestsの結果のyamlファイルを保存します。
保存先のディレクトリを変更したい場合やyamlではなくjsonでファイルを保存したい場合、保存方法やVCR対象のrequestsを選びたい場合は、以下のように設定を変更できます。

```python:vcr_sample.py
my_vcr = vcr.VCR(
    serializer           = 'yaml',
    cassette_library_dir = 'vcr',
    record_mode          = 'once',
    match_on             = ['uri', 'method'],
)

@my_vcr.use_cassette()
def hoge():
    requests.get('https://qiita.com')

```

## テストで使ってみる
qiita.comのrequests結果が一致することを確認するテストを書いてみます。

```python:hoge.py
import requests

class Hoge():
    def __init__(self):
        pass

    def getQiita(self):
        r = requests.get('https://qiita.com')
        return r
```

```python:test_hoge.py
import pytest
import requests
import vcr

import hoge

# 保存先をvcrフォルダに変更
my_vcr = vcr.VCR(
    serializer           = 'yaml',
    cassette_library_dir = 'vcr',
    record_mode          = 'once',
    match_on             = ['uri', 'method'],
)

@my_vcr.use_cassette()
def test_hoge(mocker):
    r = requests.get('https://qiita.com')

    # requestsの結果をMockを使って埋め込む
    responseMock      = mocker.Mock()
    responseMock.text = r.text
    mocker.patch('requests.get', return_value=responseMock)

    h      = hoge.Hoge()
    hoge_r = h.getQiita()
    assert r.text == hoge_r.text

```

テストコードでqiita.comのrequests結果をVCR化して取得します。
その結果を``` requests.get ```に対して、Mockでpatchを当てます。

これで``` test_hoge.py ```はVCR化が完了。``` hoge.py ```は``` test_hoge.py ```から取得したrequests結果を参照しているので、多くのリクエストを飛ばして相手に迷惑をかけることが無くなります。:smile:

いやぁ、便利だっ:clap::clap::clap:
UE4でのVATの小ネタ、区間指定ループ

# 区間指定ループ
[前回の記事](https://qiita.com/t-okugawa/items/7bd11792149d4ebe3210)で、ISMでインスタンシング表示をしても法線が正しく出力される方法を書きました。
今回はさらにISMで現実的なインスタンシングができるようになるようアニメーションのループ区間を指定できるようにします。

## なぜ必要なのか
標準のVATマテリアルそのままだとインスタンシングしても、すべて同じテイク、タイミングになってしまいます。かといってアニメーションごとにISMを分けてしまってはインスタンシングのうま味が薄らいでしまいます。そこで、複数のテイクを一つにまとめたアニメーションを区間指定ループによってランダムに再生することによって、単一ISM内でムラを出します。

また、ISMを使わない場合でも、同一VAT内で再生範囲が選べるとゲームの実装時も何かと便利です。

## アニメーションの準備
まず、↓のように歩きと走りのテイクが一つのアニメーションにまとまったVATを作ります。
これから、次の工程でこれを走りと歩きに分けてループ再生できるようにしていきます。
![vat.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502600/d149d7a2-d23d-e9e2-ee40-d94da34790e0.gif)
## マテリアルの改造、(第一段階)
実装は簡単で、VATマテリアルのフレーム計算部分に↓のように4~5個のノードを追加し、繋ぎ変えるだけです。※赤丸の部分が区間指定のパラメータです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502600/0aba8a36-2145-13e4-81e2-b7fee8984fee.png)
これにより、歩きと走りそれぞれのループを抽出できるようになりました。
歩きループを抽出
![walk.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502600/dd3d8fb9-7186-345d-5e00-6baeef6388ad.gif)
走りループを抽出
![run.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502600/5ffa66c2-ca05-c7e8-e0e6-d68c8f35c560.gif)

## マテリアルの改造、ランダム対応
次に、インスタンス毎に再生するループをランダムに選択できるようにしてみました。
今回はデモ的な実装なので適当に2つだけをPerInstanceRandomで切り替えています。
赤丸部分で2種類のループの指定をしています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502600/2a05b22e-6908-ddea-d99c-eea737dc14b0.png)
※インスタンス数が少なすぎると、PerInstanceRandomの偏りが目立つ場合があります。
## 結果
↓のように同一ISM内で複数のアニメーションを再生する事ができました。
![result.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502600/f15b7f9c-7aa0-4b72-5979-c7b2941df539.gif)
本番で実装するにはもう少し洗練する必要があると思いますが、何かの足しになれば幸いです。
## 使用上の注意
区間指定ループを使う場合、VATの補完スイッチを入れると正しくループできないので注意してください。
変更ファイルのみをrubocopするgit rubocopコマンドを作ってみた

# 概要
gitで管理されているプロジェクトで、変更したファイルのみをrubocopでチェックする `git rubocop` コマンドを作成したので、その作業手順を記載します。

# やること
1. 変更ファイルのみをrubocopするスクリプトを作成する。
2. gitのサブコマンドでスクリプトを呼ぶ。

# 作業
## rubocopのスクリプトを用意
```shell
{ git diff --name-only --diff-filter=AMRC
  git diff --name-only --diff-filter=AMRC --cached
} | sort -u \
  | grep ".*\.rb$" \
  | xargs rubocop
```
実際gitのサブコマンドにしなくてもこちらを直接実行すれば解決します。
ただそれだけではつまらないので、もうワンメイク！

## スクリプトをgitのサブコマンドで呼べるようにする
### その前にgitのサブコマンドを軽く説明
パスが通っているディレクトリに`git-hoge`というファイルを作成し、その中にスクリプトを記述すると、`git hoge`でスクリプトを実行できるようになります。

なので、今回はパスを通した`~/my_bin`ディレクトリ配下に`git-rubocop`というファイルを作成していきます。

### git-rubocopを作成

```shell:~/my_bin/git-rubocop
#!/bin/bash

{ git diff --name-only --diff-filter=AMRC
  git diff --name-only --diff-filter=AMRC --cached
} | sort -u \
  | grep ".*\.rb$" \
  | xargs rubocop
```

### git-rubocopに実行権限を付与
ファイルに権限を付与する必要があるので、下記を実行します。

```shell
$ chmod 755 ~/my_bin/git-rubocop
```

### my_binディレクトリにパスを通す
my_binディレクトリにパスを通します。お使いのshellの設定ファイル(~/.bashrc, ~/.zshrc)に下記を追加して下さい。

```shell
export PATH=$PATH:$HOME/my_bin
```

追加後は`source`コマンドを忘れずに。（下記は.zshrcの場合）

```shell
$ source ~/.zshrc
```

### テスト
以上で作業は終了です。実際に動作するか確認してみましょう。

```shell
$ git rubocop
```

# おまけ
rspecも同じような流れで作成できます。

```shell:~/my_bin/git-rspec
#!/bin/bash

{ git diff --name-only --diff-filter=AMRC
  git diff --name-only --diff-filter=AMRC --cached
} | sort -u \
  | grep ".*_spec\.rb$" \
  | xargs rspec
```

# 最後に
エディタでlintの設定をしていても見逃してしまうことがあるし、だからと言ってプロジェクト内すべてをチェックするのも時間が勿体無いので意外と便利なコマンドかと思います。

もしコミット時にチェックしたい場合はpre-commitのgemを利用した方法もあるみたいです。
[pre-commit gemでgit commitに連動してRubocopを実施する](https://dev.classmethod.jp/server-side/pre-commit-rubocop/)

# 参考
ありがとうございます！
- [便利な「git-サブコマンド」を作成する](https://qiita.com/b4b4r07/items/6b76a5f969231e5e9748)
- [Gitで変更のあったファイルだけRuboCop, Rspec, etcする](https://qiita.com/kei-p/items/774e1c89bc644fa968f9)
競技プログラミングお役立ちライブラリ① ~エラトステネスの篩~

# 前書き
初投稿です。

AtCoderの問題を解いていて__「こんなことをいちいち1から書いてられるかー！！」__という場面がちらほら出てきたのでライブラリを作成することにしました。覚書の意味もかねてライブラリのソースコードを紹介します。

目的はライブラリ紹介なので、アルゴリズムの解説は最低限にとどめる予定です。こここうしたほうがいいよみたいなのがあればおしえていただけるとありがたいです。


# 概要
__エラトステネスの篩__は、$N$以下の全ての非負整数に対して素数判定を行ってくれるアルゴリズムです。何をやっているかは[Wikipediaのgif](https://ja.wikipedia.org/wiki/%E3%82%A8%E3%83%A9%E3%83%88%E3%82%B9%E3%83%86%E3%83%8D%E3%82%B9%E3%81%AE%E7%AF%A9)がわかりやすいです。

計算量は__$O(N)$より少し大きいくらい__です。(正確には($N$以下の素数の逆数の和)*_$O(N)$_で、素数の逆数は発散するのですが、発散のスピードが[こんな感じ](http://integers.hatenablog.com/entry/2017/08/29/232219)なので競プロで使う範囲内なら実質$O(N)$として問題なさそうです)

# 使用例
- [ABC 084 D - 2017-like Number](https://atcoder.jp/contests/abc084/tasks/abc084_d) 10^5以下の素数を列挙するのに使用します。
- [ABC 052 C - Factors of Factorial](https://atcoder.jp/contests/abc052/tasks/arc067_a)
$N!$の素因数が全て$N$以下であることを利用します。

# 実装
```c++
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;

const int N = pow(10,5);

vector<bool> isp(N+1, true);

void sieve() {
  isp[0] = false;
  isp[1] = false;
  for (int i=2; pow(i,2)<=N; i++) {
    if (isp[i]) for(int j=2; i*j<=N; j++) isp[i*j] = false;
  }
}

int main() {
  // N以下の整数に対して素数判定をしてくれます。
  // nが素数ならば isp(n)=true、そうでなければ isp(n)=false
  sieve();
  // ex. 51から80までの素数を出力
  for (int i=51; i<=80; i++) if (isp[i]) cout << i << endl;
  return 0;
}

```

# 実行結果
```
53
59
61
67
71
73
79
```
parent::と$this->の違いとは（個人的見解）

# TL;DR（個人的見解）

基本`$this->`を使う。
使わないとどうしようもない(独自処理を挟みつつ親メソッドを呼ぶ)時だけ`parent::`を使う
（個人差有り）（そんなことねーよ！って方いたらコメントでご教授ください🙇‍♀️）

# 調べるに至った経緯

会社のコードで同じメソッドが`$this->`で呼ばれてたり、`parent::`で呼ばれてたりしてた（なんで）

# parent::も$this->もイけちゃう

```PHP
class A {
    public function hoge() {
        var_dump('ほげだよ');
    }
}

class B {
    public function callHogeByParent(){
        parent::hoge(); // イけちゃう
    }
    public function callHogeByThis(){
        $this->hoge(); // イけちゃう
    }
}
```

# 両者の違いはなんなのか（個人的見解）

[スコープ定義演算子 (::) - PHP.net](https://www.php.net/manual/ja/language.oop5.paamayim-nekudotayim.php)

 > static, 定数 およびオーバーライドされたクラスのプロパティやメソッドにアクセスすることができます。

アロー演算子とは、クラスのメソッドを呼び出すときに使用するもの(PHP.netのいい感じのページが見つけられなかった)

**$this->はクラス(親でも子でも可)のメソッドを呼び出すもので、parent::はクラス(親のみ可)のメソッドを呼び出すもの**

# 私の中の結論

どっちも親クラスアクセスできる、かつ、::は静的メソッドってイメージがあったので、なんか混乱した。
そして会社のコードが表記揺れしてた（なんで）。

`parent::`を使えば、明示的に親クラスのメソッドですよ、と言える。
しかし親クラスのメソッドを呼び出すときに、何でもかんでも`parent::`使ってたらそれはダルすぎる。

ただ、**parent::を使わなきゃコーディングできないタイミング**がある。
それは、**独自処理を挟みつつ親メソッドを呼びたいとき**だ。

```PHP
class A {
    public function hoge(){
        var_dump('hoge');
    }
}

class B {
    public function hoge(){
        var_dump('Bの');
        parent::hoge(); // 独自処理を挟みつつ、親のhogeも使いたい。
    }
}
```

もっとわかりやすい例だと、constructor。

```PHP
class A {
    public function constructor(){
        // 初期化処理
    }
}

class B {
    public function constructor(){
        // Bの初期化処理
        parent::constructor(); // Aの初期化処理
    }
}
```

こういう時は、`parent::`使わないと実現できない。
逆にこの時以外使っちゃうとなんか揺れてる気がして嫌なので、「**使わないとどうしようもない時**」だけ、`parent::`を使う、と結論づけた。
（結論がわかったら途端に「そりゃそうじゃ」となったが、渦中は意外と気づけないものだなぁ。）
てかその前に表記揺れさせないこと。（そりゃそうじゃ）
Python: seabornを使ったグラフ描画

## はじめに

seabornについてメモします。
pandasのdfを引数に持ちseabornでグラフ作成するシンプルな関数を以下に示します。
今回示すのは、seabornの中のpairplotとheatmapの２種類です。


## 準備データ

sns.csvファイルを用意します。

```
x1,x2,x3,x4,x5
11,13,15,17,19
21,23,25,27,29
38,37,35,33,32
41,43,45,47,49
51,53,55,57,59
```

## ソースコード

```
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd


def read_sns():
    df = pd.read_csv("input/sns.csv")
    return df


def sns_pairplot(df):
    df.head()
    cols = ['x1', 'x2', 'x3', 'x4', 'x5'] # 自分で指定したい時
    sns.pairplot(df[cols], height=2.5)
    plt.tight_layout()
    plt.savefig('sns_pairplot.png', dpi=300) # 画像に保存したい時
    plt.show()


def sns_heatmap(df):
    cols1 = df.columns # dfのカラムをそのまま使用したい時
    cols2 = ['y1', 'y2', 'y3', 'y4', 'y5']
    hm = sns.heatmap(df,
                     cbar=True,
                     annot=True,
                     square=True,
                     fmt='.2f',
                     annot_kws={'size': 15},
                     yticklabels=cols2,
                     xticklabels=cols1)
    plt.tight_layout()
    plt.savefig('sns_heatmap.png', dpi=300) # 画像に保存したい時
    plt.show()


def main():
    df_sns = read_sns()
    sns_pairplot(df_sns)
    sns_heatmap(df_sns)


if __name__ == '__main__':
    main()
```


## 結果
- sns_pairplot.png
列ごとの相関を見える化
![sns_pairplot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356471/797e104e-ad4f-7552-94f9-261688cb9980.png)


- sns_heatmap.png
データ全体の大小関係を見える化
![sns_heatmap.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356471/487097cc-f819-a2be-7468-0927b4b27f4a.png)
迷った時に本当に頼りになるオススメ日本語フォントまとめ

#はじめに

ウェブサイトを作るとき、英語だとカッコいいのに、日本語にしたとたんにダサい...

そんなとき、とりあえず選んどいたらオシャレ、カッコいい、カワイイ感じにまとまる日本語フォントをまとめました。

#オススメ日本語フォントまとめ

![IMG_1189D0F378CA-1.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452235/4f97e135-d009-bb33-61f6-4883b1e54fde.jpeg)


##自由の翼フォント

ネタフォントかと思いきや、漢字の硬さが取れて、カタカナとの組み合わせのバランスも好き。


##はんなり明朝

美しい日本語感。高級感もありながら固すぎない雰囲気で汎用性が抜群。


##青柳衝山フォント

和風ならコレ。ひらがなが少々クセ強めだけど、それもイイかんじ。


##切絵字

不安定な印象がオシャレ。


##出島明朝

かっちり感を出したい時に。


##じゃっきーふぉんと

ゲームのとき。


##ふい字

手書き。女子高生。女子大生。かわいい。


##たぬき油性マジック

ドンキのPOPみたい。おっきい文字、アクセントに。


#まとめ

日本語のフォント、かっちりハマるのを探すの大変だけど、この中から選ぶと楽です。
【Minecraft】world.setBlockの使い方

###パラメーター
world.setBlock(x, y, z, block, metadata, direction?)
六番目のパラメーターは、確証がありません。
詳しくはこちらのページを見てください。
####注意点
worldは、変数なので、何らかの方法で取得する必要があります。
blockの取得はgetBlockByIdが便利です。
例

```
@Override
public void onNeighborBlockChange(World world, int x, int y, int z, Block block) {
  world.setBlock(x,  y,  z, getBlockById(0), 0, 2);
}
```

隣のブロックが更新されると、自信を削除するプログラムです。
Rubyのシンタックス勉強用（reject, delete_if, remove_all, clear）の挙動 [RUBY技術者認定試験...問題24, 31]

# 基本説明

HashやArray（配列）クラスのオブジェクトのメソッドを複数学べる良問があったので共有します。

| メソッッド名 | 説明 | 戻り値 | 対応オブジェクト |破壊的？ |
|---|---|---|---|---|
| reject | 要素の数だけ繰り返しブロックを実行、ブロックの戻り値が真の要素を除き、新しい配列（かハッシュ）を返す | 偽になった新しい配列（かハッシュ） | Array, Hash | FALSE |
| delete_if | 要素の数だけ繰り返しブロックを実行、ブロックの戻り値が真になった要素を削除 | レシーバ自身  | Array, Hash | TRUE |
| delete | 配列：引数と同じ要素を探して、すべて削除 / ハッシュ：引数（key）と同じkeyを探して、keyとvalueを削除 | レシーバ自身, 要素見つからない場合はnil | Array, Hash, String | TRUE |
| remove | HashやArray（配列）クラスにそんなメソッドは無い | - |  | - |
| remove_all | HashやArray（配列）クラスにそんなメソッドは無い | - |  | - |
| clear | 要素を全て削除する | レシーバ自身 | Array, Hash, String | TRUE |

オブジェクト自身（レシーバ）の内容を変えてしまうものを破壊的メソッドと呼ぶ。

# 例題1

出力結果が

```
{}
```

になる、過程は？（1〜5の中から、2つ選んでください）

```rb
h = {:foo => 1, :bar => 2}
# 1 : h.reject {|k,v| true} # NG
# 2 : h.delete_if {|k,v| true} # OK
# 3 : h.delete(:all) # NG
# 4 : h.remove_all # NG ERROR
# 5 : h.clear # OK
p h
```

- rejectは非破壊メソッドなのでNG
- delete(:all)と指定できないのでNG
- remove_allなんてメソッドは無いのでNG
    - ActiveRecordでは削除系インスタンスメソッドとして存在します

RUBY技術者認定試験 公式ガイド (ITpro BOOKs)　157p 問題24より抜粋

# 例題2

出力結果が

```
[1, 3, 1, 3, 1, 3]
```

になる、過程は？（1〜5の中から、2つ選んでください）

```rb
ary = [1,2,3,1,2,3,1,2,3]

# 1：正解（破壊的メソッド）
# ary.delete(2)

# 2：正解（破壊的メソッド）
# ary.delete_if {|x| x == 2}

# 3 破壊的メソッドなら変わってた
# ary.reject {|x| x == 2}

# 4 エラー 存在しない
# ary.remove(2)

# 5 エラー 引数取らない ブロック処理するメソッド wrong number of arguments (given 1, expected 0) (ArgumentError)
# ary.reject(2)

p ary
```

# 実行結果は以下でサクッと試せます

[Online Ruby Editor and IDE \- Fast, Powerful, Free \- Repl\.it](https://repl.it/languages/ruby)

# 参考

- [reject \(Hash\) \- Rubyリファレンス](https://ref.xaio.jp/ruby/classes/hash/reject)
- [delete\_if \(Array\) \- Rubyリファレンス](https://ref.xaio.jp/ruby/classes/array/delete_if)
- [delete, delete\_all, destroy, destroy\_allについて \- Qiita](https://qiita.com/kamelo151515/items/0fa7fb15a1d2c1e44db2)
- [clear \(Array\) \- Rubyリファレンス](https://ref.xaio.jp/ruby/classes/array/clear)
AIZU ONLINE JUDGE 7高等的配列

#5_B(マージソート)

```c++
#include <iostream>
#define MAX 500000
#define SENTINEL 2000000000
#define rep(i,n) for (int i=0; i<(n); i++)
using namespace std;

int L[MAX/2+2],R[MAX/2+2];
int cnt;

//統治作業
void merge(int A[], int n,int left,int mid,int right){
    int n1=mid-left;
    int n2=right-mid;
    rep(i,n1) L[i]=A[left+i];//左側に分けられた数値を配列L[0],L[1]...と入れていく
    rep(i,n2) R[i]=A[mid+i];//右側に分けられた数値を配列R[0],L[1]...と入れていく
    L[n1]=R[n2]=SENTINEL;//n1,n2はmidに当たる部分なので、同じ値になるはず！
    int i=0,j=0;
    
    for (int k=left; k<right; k++){//右側ブロックvs左側ブロック
        cnt++;//比較回数を数える
        if(L[i]<=R[j]){
            A[k]=L[i++];
        }else{
            A[k]=R[j++];
        }
    }
}

//分割作業
void mergeSort(int A[], int n, int left, int right){
    if(left+1<right){//部分配列の要素数が１になるまで分割する！
        int mid=(left+right)/2;
        mergeSort(A,n,left,mid);
        mergeSort(A,n,mid,right);
        merge(A,n,left,mid,right);
    }
}

int main(){
    int A[MAX],n,i;
    cnt=0;
    
    cin >> n;
    rep(i,n) cin >> A[i];
    mergeSort(A,n,0,n);
    rep(i,n){
        if(i) cout << " ";
        cout << A[i];
    }
    cout << endl;
    cout << cnt << endl;
    return 0;
}
```
UE4でのVATの小ネタ、インスタンシング対応法線

# 初めに
初Qiitaです。練習がてら書きます。
出力してUE4まで持ってくる記事は世にたくさんあると思うので、今回はHoudiniから出力されたUE4用VATマテリアルのかゆい所を少しましにする小ネタを紹介しようと思います。

長かったので2つに記事を分けています。今回の法線周りで、次回は[区間ループ再生](https://qiita.com/t-okugawa/items/dad578a26cf43dbed8b6)があります。
## VATとは
Vertex Animation Textureの略で、頂点や法線のアニメーション情報を焼きこんだテクスチャをマテリアル(シェーダー)で参照し、頂点および法線を変形させます。主にHoudiniのGameDevelopmentToolsから出力します。毎フレーム頂点数やポリゴン数が変わるものや、骨の数が多すぎてリアルタイムでは表現が難しい事を実現するために使う事が多く、機能が近いものにAlembicなどのジオメトリキャッシュがあります。

## ジオメトリキャッシュとの違い
- 処理がほぼGPUで完結している

マテリアル内でテクスチャを参照してるだけなので、実行時にCPU-GPU間の転送コストがほぼかかりません。(細かいパラメータのコンスタントバッファの転送コストやFPテクスチャのフェッチコストはかかります)
したがって、ジオメトリキャッシュより軽量に描画することができます。

- メモリは増加しがち

現状ではジオメトリキャッシュと違い、位置テクスチャのストリームなどが完全にはできない為、アニメーションの全尺をメモリに乗せる必要があり、メモリを食ってしまう傾向があります。

- ~~レイトレ非対応~~

~~VATの肝であるWPOがレイトレ対応していないので正しくレンダリングされません。※4.23でスキンメッシュに関してはレイトレ対応されたので、スタティックメッシュもそのうち対応されることを待っています。~~
※4.24より、アクター単位でレイトレ時にWPOを使用するかどうか選択できるようになりました。(ISM,HISMはまだ)

## 本題、インスタンシング対応法線
VATを作ると、UE4ではスタティックメッシュ扱いになるので、ISMでインスタンシングしたくなります。しかしながら、Houdiniから吐かれたUE4マテリアルを使うと以下のようにローカルスペースの法線になってしまい、正しくライティングされません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502600/46fb55df-817f-b9b2-a22c-c15240082d07.png)
これは、法線をトランスフォームしていないだけなので、VectorTransformを一発かければOKという風にみえますが、ISMの場合はコツがいります。
元は↓のように、トランスフォームされていない、テクスチャから参照された生の法線がそのまま出力されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502600/3e307ae2-ffb7-233f-9edf-8d9fe47dd7b1.png)

これを↓のようにします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502600/817853ad-46a2-c05f-f714-ecab6cb17714.png)

かなりシンプルになりました。まず、カスタムUVを用いたVS－PS間の法線の受け渡しをやめ、VertexInterpolatorを使うようになっています。
そして、トランスフォーム先をタンジェント空間へ設定しているのでTangentSpaceNormalのチェックを外す必要もなくなりました。
### ここがキモ
VertexInterpolatorを使った理由はもう一つあります。前途したISMの場合必要なコツとは、必ずトランスフォームを明示的にVS内でやらなければならないとうことです。VSトランスフォームする場合、法線×インスタンスマトリクス×アクタートランスフォームが行われ、意図した結果になりますが、これをPS内でやると、インスタンスのマトリクスが飛ばされてしまうのです。ですから、明示的にVS内で処理をしていると言う事がわかりやすいVertexInterpolatorを使いました。
## 結果
VATをISMで使用しても正しい法線が得られるようになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502600/55fc4bf8-ec8f-1d09-a13b-3b5da5ede8ea.png)
webpack導入に伴うnode.jsとyarnのインストール(MacOS)

#nodeって？
JavaScriptの環境。サーバーサイドでJavaScriptを動かしたいときに必要。
公式サイト https://nodejs.org/ja/

#nodeのインストール
homebrewはインストールされてるか？Y/N?  
NOならhttps://brew.sh/index_ja

YESなら　```$ brew install node```
#nodeのバージョン管理ツール nのインストール
プロジェクトごとにnodeのバージョンが異なることがあるので、バージョンの切り替えが簡単に
できるツールをインストール。

```$ npm install -g n```

#今回はバージョン8.12.0を指定してインストール
```$ n 8.12.0```

#下記のようなエラーが表示されたら
```
  mkdir: /usr/local/n/versions/node: Permission denied
  mkdir: /usr/local/n/versions/io: Permission denied

     install : node-v8.12.0
       mkdir : /usr/local/n/versions/node/8.12.0
  mkdir: /usr/local/n/versions/node/8.12.0: Permission denied

  Error: sudo required
```
####sudo権限で操作してねということなので
ディレクトリを作って、root権限を与える。
```$ sudo mkdir /usr/local/n```
passwordを聞かれるのでmacアカウントのpasswordを入力。
＊見えないけど値は入力されてる。

ディレクトリができたのでroot権限を与える。
```$ sudo chown -R $(whoami) /usr/local/n```

#再度nodeのインストールを試みる
```$ n 8.12.0```
で、バージョンを確認。
```$ node -v```
v8.12.0 と表示されれば成功!

###nの詳しい使い方は公式リポジトリへ
https://github.com/tj/n

#パッケージマネージャyarnのインストール
###yarnって？
JavaScriptのパッケージマネージャの1つで、ライブラリをpackage.jsonという1つのファイルで管理するツールのこと。

#yarnのインストール
```$ brew install yarn --without-node```
無事インストールされたか
```$ yarn --vesion```
で確認。
1.10.1とか数字が帰って来ればOK!

####これでwebpackを使う準備は完了。
Debian 7にPHP 5.4をインストール（OS標準）

# はじめに

Debian7にPHPを標準インストール
OS自体がEOLなので/etc/apt/sources.listを書き換えています。
親記事：[PHP, PHP-FPMの各種インストール方法とEOLまとめ](https://qiita.com/witchcraze/items/dfe3823554b7caba6f6a)

## LOG

### インストール

```shell-session
# cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 7 (wheezy)"
NAME="Debian GNU/Linux"
VERSION_ID="7"
VERSION="7 (wheezy)"
ID=debian
ANSI_COLOR="1;31"
HOME_URL="http://www.debian.org/"
SUPPORT_URL="http://www.debian.org/support/"
BUG_REPORT_URL="http://bugs.debian.org/"

# echo deb http://archive.debian.org/debian wheezy main > /etc/apt/sources.list
# echo deb http://archive.debian.org/debian-security wheezy/updates main >> /etc/apt/sources.list
# apt-get -o Acquire::Check-Valid-Until=false update
# apt-get update;apt-get install php5
... 略
```

### 各種確認

```shell-session
# which php
/usr/bin/php

# php -v
PHP 5.4.45-0+deb7u14 (cli) (built: May  9 2018 16:47:00)
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2014 Zend Technologies

# php -i | grep php.ini
Configuration File (php.ini) Path => /etc/php5/cli
Loaded Configuration File => /etc/php5/cli/php.ini

# dpkg -p php5
Package: php5
Priority: optional
Section: php
Installed-Size: 21
Maintainer: Debian PHP Maintainers <pkg-php-maint@lists.alioth.debian.org>
Architecture: all
Version: 5.4.45-0+deb7u14
Depends: libapache2-mod-php5 (>= 5.4.45-0+deb7u14) | libapache2-mod-php5filter (>= 5.4.45-0+deb7u14) | php5-cgi (>= 5.4.45-0+deb7u14) | php5-fpm (>= 5.4.45-0+deb7u14), php5-common (>= 5.4.45-0+deb7u14)
Size: 1028
Description: server-side, HTML-embedded scripting language (metapackage)
 This package is a metapackage that, when installed, guarantees that you
 have at least one of the four server-side versions of the PHP5 interpreter
 installed. Removing this package won't remove PHP5 from your system, however
 it may remove other packages that depend on this one.
 .
 PHP (recursive acronym for PHP: Hypertext Preprocessor) is a widely-used
 open source general-purpose scripting language that is especially suited
 for web development and can be embedded into HTML.
Homepage: http://www.php.net/
```
Java基礎学習内容3（演算子・三項演算子）

# この記事は？
Javaを基礎から学習し直した際に、今まで理解不足だった点が多いと感じたため、後から見返せるよう学習内容をまとめたものです。

# 演算子
単項演算子・算術演算子など。計算や比較に用いる。

## 注意の必要な演算子
### &と&& (|と||)
どちらもAND(OR)を示すが、&及び|は左辺がfalseの場合にも右辺が評価される。

### instanceof
以下の形で用いる。(演算子だと知らなかったため念のため記載)

```java:instanceof
str instanceof String;
```

### ==とequals()
基本データ型は==で比較可能だが、参照型の値を比較する場合はequals()を用いる。
(==で比較した場合、参照先が同一かどうかを比較することとなる。)

# 三項演算子
以下のように用いる。
?の前の条件式がtrueのときは左の式を、falseのときは右の式を実行する。
```java:三項演算子
   String str = "a" == null ? "is null" : "is not null";
```
【Kotlin】a == 1 && a == 2 && a == 3 を true にする方法２つ

今更だけど、Kotlin でやった人が見つからなかったので。

## 方法１：`==` 演算子をオーバーロードする

```Kotlin
fun main() {
    println(a == 1 && a == 2 && a == 3) // > true
}

val a = object {
    override fun equals(other: Any?): Boolean = true
}
```

`1 == a` のように左右の項を入れ替えられると期待通りには動かない。

## 方法２：プロパティを使う

```Kotlin
fun main() {
    println(a == 1 && a == 2 && a == 3) // > true
}

var a = 0
    get() = ++field
```

`a == 3 && a == 2 && a == 1` のように順番を変えられたり数値を変えられたりすると期待通りには動かない。

／以上
MacのVirtualbBoxでホストアダプターが作成できない問題

OracleMaster(DBA)の勉強のためMac上にVirtualBox+CentOSの環境を構築しようとした時にハマり、結局解決せずに放置していたところ、OracleMaster(DBA)も合格した今になって思い出したように事象が解消したので、備忘のため記載します。

# 環境
- macOS Mojave バージョン10.14.6
- VirtualBox バージョン6.0.12

※どうもホストOSはHigh Sierra以降に該当するみたいです
※ゲストOSはCentOSですが、今回は関係ないので割愛

# 発生事象
【事象】
ホストオンリーアダプターを作成しようとすると、アダプター作成に失敗する。

【手順】
(1) VirtualBoxの「ファイル」＞「ホストネットワークマネージャー」を開く
(2) 「作成」ボタンを押下

【結果】
ポップアップが表示され、下記のエラーが出力される。
（ポップアップ画面は取り忘れたので、テキストのみ）

    ホストネットワークインターフェースの作成に失敗しました。

    VBoxNetAdpCtl: Error while adding new interface: failed to open  /dev/vboxnetctl: No such file or directory.

    終了コード : NS_ERROR_FAILURE (0x80004005)
    コンポーネント: HostNetworkInterfaceWrap
    インターフェース: IHostNetworkInterface {455f8c45-44a0-a470-ba20-27890b96dba9}

# 原因
英語ですが、下記ページの手順を実施したら解消しました。
https://stackoverflow.com/questions/18149546/vagrant-up-failed-dev-vboxnetctl-no-such-file-or-directory

平たく言うと、VirtualBoxがmacOSに対して設定変更を行う許可が無かったせいでエラーとなっており、その許可をしてあげれば解消する（と理解しました）

# 対応手順
【手順】
(1) VirtualBoxの「Virtualbox」＞「サービス」＞「"サービス"環境設定」を開く
(2)「セキュリティとプライバシー」画面になるため、「一般」タブを選択
(3)「ダウンロードしたアプリケーションの実行許可:」欄にVirtualBoxに対して許可を与えるかどうかのメッセージが出力されているため、「許可」を押下
(4)ターミナルを起動し、下記コマンドを実行

    sudo /Library/Application\ Support/VirtualBox/LaunchDaemons/VirtualBoxStartup.sh restart

（「Application」と「Support」の間が怪しいので、コピペでうまくいかない場合は上からパスを辿ってみて下さい）

（実行例）

    $ sudo /Library/Application\ Support/VirtualBox/LaunchDaemons/VirtualBoxStartup.sh restart
    Loading VBoxDrv.kext
    Loading VBoxUSB.kext
    Loading VBoxNetFlt.kext
    Loading VBoxNetAdp.kext
    $

実行後はホストオンリーアダプターが作成できるようになっているはずです。
AWSサービス、マネジメントとガバナンス

# データベース

AWSマネジメントとガバナンスサービスについての備忘録
サービスの概要・特徴・料金などを簡潔（できれば）に記載します。

## Amazon CloudWatch

### 概要
AWSリソース、アプリケーション、オンプレミスのモニタリングサービス

### 特徴
* AWS Management Toolsのひとつ
* CloudWatch Logsで収集、CloudWatch Logs Insights にて可視化
* CloudWatchメトリクスに数式を利用し、新しいメトリクスを作成できる
* カスタムメトリクスは、1分未満のアクティブを把握できる




## AWS Auto Scaling
## AWS Chatbot
## AWS CloudFormation
## AWS CloudTrail
## AWS コマンドラインインターフェイス
## AWS Config
## AWS Control Tower
## AWS コンソールモバイルアプリケーション
## AWS License Manager
## AWS マネジメントコンソール
## AWS マネージドサービス
## AWS OpsWorks
## AWS Organizations
## AWS Personal Health Dashboard
## AWS Service Catalog
## AWS Systems Manager
## AWS Trusted Advisor
## AWS Well-Architected Tool
Java基礎学習内容2（配列・ArrayList）

# この記事は？
Javaを基礎から学習し直した際に、今まで理解不足だった点が多いと感じたため、後から見返せるよう学習内容をまとめたものです。

# 配列
同じデータ型の値をまとめて扱うもの。
以下のように用いる。

```java:配列
// 変数宣言
int[] nums;
// インスタンス化
nums = new int[10];
// 代入
nums[0] = 10;
```

※上記の場合、インスタンス化の時点で各要素が初期化される。(intの場合は0で初期化される)

また、複数同時に初期化することも可能。

```java:配列(同時初期化)
// 変数宣言
int[] nums = {10, 20, 30};
```

配列の要素数は以下のように取得可能。

```java:配列(サイズ)
int length = nums.length;
```

javaは多次元配列もサポートしている。
初期化は以下の通り。

```java:多次元配列
// 変数宣言
int[][] nums;
// 領域確保
nums = new int[2][3];
// 代入
nums[0][1] = 10;
// 長さ
// nums.length == 2; -> true
// nums.[0].length == 3; -> true

// サイズの異なる多次元配列も可能
int nums2;
nums2 = {
          {1,2},
          {1,2,3},
          {1}
        };
```

# ArrayList
サイズ変更が可能な配列のようなもの。

```java:ArrayList
import java.util.ArrayList;
/* 中略 */
// 変数宣言
ArrayList<String> strList;
// インスタンス化(下記の場合、初期状態の要素数は3。サイズ指定は無くてもいい)
strList = new ArrayList<String>(3);
// 追加
strList.add("ABC");
// 取得
strList.get(0);
// 長さ 格納した要素数は一つなため、1が返ってくる。
strList.size();

// ジェネリクスを用いた初期化
ArrayList strList2 = new ArrayList();
// コンパイルは通るが、型が異なったときエラーとなる
strList2.add("ABC");
strList2.add(1);// ←エラー

// ダイヤモンド演算子を用いた場合
ArrayList<String> strList3 = new ArrayList<>();

// Listを用いる場合
List<String> strList4 = new ArrayList<>();

```

※インスタンス化・追加の際に型が異なる場合はコンパイルエラーとなる。
Kotlinと図で学んでみるデザインパターン -5章 Singletonパターン-

# Singletonパターン
一度しか生成されないインスタンスを保証する
(今回は図無し)

```kotlin
class Singleton private constructor() {

    init {
        println("インスタンスを作成しました")
    }

    companion object {

        private var instance: Singleton? = null

        fun getInstance(): Singleton = synchronized(this){
            instance ?: Singleton().apply {
                instance = this
            }
        }
    }
}
```

```kotlin:
class TicketMaker private constructor() {
    private var ticket = 1000

    companion object {
        private var instance: TicketMaker? = null

        fun getInstance(): TicketMaker = synchronized(this) {
            instance ?: TicketMaker().apply {
                instance = this
            }
        }
    }
    
    fun getNextTicketNumber(): Int = synchronized(this) { ticket++ }
}
```

```kotlin
fun main() {
    println("Start.")

    val obj1 = Singleton.getInstance()
    val obj2 = Singleton.getInstance()

    if (obj1 == obj2) {
        println("obj1とobj2は同じインスタンスです")
    } else {
        println("obj1とobj2は違うインスタンスです")
    }

    println("End.")

    repeat(10) {
        println(TicketMaker.getInstance().getNextTicketNumber())
    }

}
```