OmniAICreator/Qiita-1.07M huggingface dataset:
JavaScript:中味をあんまり気にしないでディープコピーできる関数

[前記事](https://qiita.com/ttatsf/items/68de3795ae3bf35c0228)の続きです。
引数の中味をあんまり気にしないでディープコピーできる関数cloneです。
前記事ではこう書きました。

```js:
const mapForMap = f => a => 
  new Map( [...a].map( ([key, value]) =>[key, f(value)] ) );  
const mapForSet = f => a => new Set( [...a].map( f ) );
const entriesMapIntoObj = f => xs => 
  xs.reduce(
    (acc, [key, value]) => ({ ...acc, [key]:f(value) })
    , {} 
  );
const mapForObj = f => a =>
  entriesMapIntoObj( f )( Object.entries( a ) );
const getType = a => Object.prototype.toString.call(a);

const clone = a => {
  const type = getType( a );
  return (type === "[object Array]")?  a.map( clone )
        :(type === "[object Map]")?    mapForMap( clone )( a )
        :(type === "[object Set]")?    mapForSet( clone )( a )
        :(type === "[object Object]")? mapForObj( clone )( a )
        :(type === "[object Date]")?   new Date( a )
        : a;
}
```
基本的にはこれで動くのですが、込み入ったオブジェクトに使うと動作が鈍いときがあります。
mapForMap,mapForSetで新しい配列を作っては捨てているところがあるので、そこをちょっと節約してみました。

```js:
const mapForMap = f => a => 
  [...a].reduce( (acc,[key, value])=>acc.set(key, f(value)), new Map()); 
const mapForSet = f => a => 
  [...a].reduce((acc, e)=>acc.add(f(e)), new Set());
```
だいぶ動作が速くなった感があります。

さらにforEachで新たに配列を作らない方法にしてみました。
mapForObjでは直接forEachできませんが、なるべく小さい(entries()でなくkeys())配列を作って回すようにしてみました。

```js:
const mapForMap = f => a => {
  const b = new Map();
  a.forEach((key, value)=>b.set(key,f(value)));
  return b;
}
const mapForSet = f => a =>{
  const b = new Set();
  a.forEach(e=>b.add(f(e)));
  return b;
}
const mapForObj = f => a =>{
  const b = {};
  Object.keys(a).forEach( e => b[e] = f(a[e]) );
  return b;
}
const getType = a => Object.prototype.toString.call(a);

const clone = a => {
  const type = getType( a );
  return (type === "[object Array]")?  a.map( clone )
        :(type === "[object Map]")?    mapForMap( clone )( a )
        :(type === "[object Set]")?    mapForSet( clone )( a )
        :(type === "[object Object]")? mapForObj( clone )( a )
        :(type === "[object Date]")?   new Date( a )
        : a;
}
```
実用上はこれで十分かな。
超初心者がコマンドライン記法について。



こんにちは。今日はコマンドライン上でよく使うコマンドライン記法についてまとめてみたいと思います。

# touch ファイル名
ファイルの新規作成ができる

# cat ファイル名
ファイルの中身の表示ができる。
catコマンドを実行したときに存在しないファイルを指定するとエラーが出力される


# mkdir ディレクトリ名
ディレクトリを作成する


# cd ディレクトリ名
指定のディレクトリに移動することができる。
## cd ..
一つ親のディレクトリへ移動
## cd
cdのみを記載するとホームディレクトリへ移動される。(ホームディレクトリとはユーザーが作業をするときに起点にするディレクトリのこと)

# pwdコマンド
カレントディレクトリの確認ができる。ルートディレクトリからカレントディレクトリまでの階層が全て表示される

# lsコマンド
ディレクトリの中身を表示する
表示されるのは１つの子階層まで

# mvコマンド
ファイルを移動させる
>例.mv beginner.txt html   <br> ⇒   beginner.txtはhtmlフォルダへ移動  

>mv ディレクトリ名 ディレクトリ名 <br>⇒    ディレクトリごと移動する

## mvコマンドはファイル名の変更にも使える
>mv beginner.txt dojo.txt   <br>⇒   beginner.txtはdojo.txtにファイル名が変わる

# cpコマンド
ファイルのコピーができる
>cp コピーするファイル名 新しいファイル名<br>
⇒中身は同じファイルが新しいファイル名で作成される。

## cp -r 
ディレクトリのコピーができる

>cp -r コピーするディレクトリ名 新しいディレクトリ名<br>
⇒同じ中身のディレクトリを新しいディレクトリ名で作成

# rm
ファイルの削除ができる
>rm 削除するファイル名<br>ファイルの削除

> rm -r 削除するディレクトリ名 <br> ディレクトリの削除


# その他用語など

## カレントディレクトリ
自分が今いるディレクトリのこと

## ルートディレクトリ
１番親のディレクトリ
「/」で表示

## コマンドの履歴
コマンドラインでは過去に実行したコマンドを↑入力することができる
Linuxのファイル名の後ろに^Mがついている場合の対処法

# 事象
以下のコマンドを書いたシェルを実行した際にファイル名の後ろに「^M」がついてしまう

```export.sh
cat aaa.log > bbb.txt
```

- 作成されたファイル名
   - bbb.txt^M

# 原因
改行コードであるCRLFが化けてしまうため

# 対応
改行コードであるLFにしてシェルを作成する
vue.js/vue-cliがIE11で動かない

# IE11でのエラー
chromeでは正常に動くvue.jsやvue-cliで作ったプロジェクトがIE11では表示されません。画面が真っ白になります。
コンソールで見てみると、'Symbol'が定義されていませんという風に表示されています。

# 原因
IE11がES2015+に対応していないことが原因です。

# 巷であがる解決策

https://babeljs.io/docs/en/babel-polyfill

によると、@babel/polifillをnpmでインストールし、適切な場所にimport '@babel/polyfill' をすればいいと書いてあります。

# それでも動かない……
上記の事柄を試してもやっぱりエラーが出続けます。npm installで入ったpolyfillを一度消して、index.htmlのhead部分に以下のscriptタグを埋め込みました。（邪道ではあるのですが）

```html
  <script src="https://cdnjs.cloudflare.com/ajax/libs/babel-standalone/6.26.0/babel.min.js"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/babel-polyfill/6.26.0/polyfill.min.js"></script>
```

動きました～:v:
クローリングした後にPHPのXPathで文字列だけを指定して取得する

# PHPのXPathで文字列だけ指定して取得する

まずはじめに、
pathを自分で追いかけるのが面倒な方はこちらをどうぞ。

[GoogleChromeでXPathをコピーする方法の参考](https://webbibouroku.com/Blog/Article/xpath)


## 実践 ～ 0番目とキャスト ～

```php
// $xmlはどこかで用意

// はてなブックマークのタグを勝手に拝借
$tag_obj = $xml->xpath('//*[@id="container"]/div[4]/div/div[1]/section/ul/li[2]/div/div[2]/div[2]/ul[2]/li[3]/a');

// 0番目の要素を文字列にキャストする
$tag_text = (string)$tag_obj[0];

echo $tag_text; // エンジニア
```

## 躓いたところ

####０番目の取得

0番目に入ってくると知らなくて「obj空っぽやん！！」
って叫んでました。

#### 文字列にキャスト

キャストしてなかったので？htmlタグがそのまま付いてきた。

## 他にいい方法が有れば教えてください！！

もしかするとXPathのとり方次第では無駄な工程を無くせるのでは？
と考えているのですが…
Ruby と Rails をいつアップデートすればいいか、雑に調べた

Ruby・Railsに限らず、ライブラリの古いバージョンを使い続けるのは、セキュリティ的にも開発効率的にも良くありません。

しかし、アップデートは**アプリケーションの機能を向上させるものではありません**から、機能開発や不具合修正の方が優先されがちです。そのため、古いバージョンが放置されないようにするには、**あらかじめ年間計画の中にアップグレード作業を織り込んでおく**のが１つの方法です。

ところで、RubyもRailsも、マイナーバージョンも含めれば２・３ヶ月に１回リリースされます。**アップデートはいつ行えばいいのでしょうか？**

# RubyとRailsのリリース周期

アップデート計画を考える上では、機能の追加変更がある X.Y.0 （マイナーバージョンアップ）と、大きな不具合が見つかることが多いとされる X.Y.1 のリリースが重要です。以下で **X.Y.0, X.Y.1 のリリース日**を調べました。

**Ruby** のX.Y.0 は毎年12月25日にリリースされ、早ければ翌2月にX.Y.1 がリリースされるようです。

**Rails** のX.Y.0 は決まったルールがあるわけではないようですが、毎年4月ごろにリリースされるようです。X.Y.1 は、最も早いv5.1.1では半月後にリリースされています。

また、Ruby・Railsともにある時点で**過去のマイナーバージョンがサポート対象から除外されます。**

**Ruby**では、不具合修正は最新 + 前世代のみ、セキュリティ問題は最新 + 前世代 + 前々世代世代が対象です。

**Rails**では、不具合修正は最新世代のみ、セキュリティ問題は最新 + 前世代が修正対象です（[ドキュメント](https://railsguides.jp/maintenance_policy.html)）。また、重大なセキュリティ問題は（今のところ）3世代前まで修正対象です。

**Ruby**:

| バージョン | リリース日 | 間の日数 |
|:--:|:--:|:--:|
| v2_1_0 | 2013-12-25 |  |
| v2_1_1 | 2014-02-24 | 61 |
| v2_2_0 | 2014-12-25 |  |
| v2_2_1 | 2015-02-27 | 64 |
| v2_3_0 | 2015-12-24 |  |
| v2_3_1 | 2016-04-25 | 123 |
| v2_4_0 | 2016-12-23 |  |
| v2_4_1 | 2017-03-22 | 89 |
| v2_5_0 | 2017-12-25 |  |
| v2_5_1 | 2018-03-28 | 93 |

**Rails**:

| バージョン | リリース日 | 間の日数 |
|:--:|:--:|:--:|
| v4.1.0 | 2014-04-08 |  |
| v4.1.1 | 2014-05-05 | 27日 |
| v4.2.0 | 2014-12-19 |  |
| v4.2.1 | 2015-03-19 | 90日 |
| v5.0.0 | 2016-06-30 |  |
| v5.0.1 | 2016-12-21 | 174日 |
| v5.1.0 | 2017-04-27 |  |
| v5.1.1 | 2017-05-12 | 15日 |
| v5.2.0 | 2018-04-09 |  |
| v5.2.1 | 2018-08-07 | 120日 |

なお、「リリース日」は以下のようにGitのコミット日時をとったものなので実際のリリース日とは異なります。

```bash
git clone httos://github.com/ruby/ruby ~/Documents/ruby
cd ~/Documents/ruby
$ for v in v2_1_0 v2_1_1 v2_2_0 v2_2_1 v2_3_0 v2_3_1 v2_4_0 v2_4_1 v2_5_0 v2_5_1; do  echo -n $v' '; git log -n 1 --pretty=%aI $v | cut -f 1 -d T; done

git clone httos://github.com/rails/rails ~/Documents/rails
cd ~/Documents/rails
for v in v4.1.0 v4.1.1 v4.2.0 v4.2.1 v5.0.0 v5.0.1 v5.1.0 v5.1.1 v5.2.0 v5.2.1; do
  echo -n $v' '
  git log -n 1 --pretty=%aI $v | cut -f 1 -d T
done
```

# アップデートプランを考える

アプリケーションの違いによって、アップデートの戦略がいくつか考えられます。

**2年周期のアップデート**
あまり開発が活発ではないアプリケーション向けの戦略です。Railsのマイナーバージョンのサポート切れに合わせてアップデートし、最低限、重大なセキュリティ問題の修正対象から漏れないようにします。

なお、Railsのリリース日が一定しないので、年間計画を建てる場合は「２年おきの●月に決まった期間にその時点の最新版にアップデート」のような計画の立て方にせざるを得ないでしょう。具体的にはRuby・Railsの最初の不具合修正が（もしあれば）出ている**６月ごろ**に行うのが良さそうです。

**1年周期でアップデート**
Railsのマイナーバージョンは最新に保つ戦略です。たいていのアプリケーションはこの戦略が良さそうです。

X.Y.0 と X.Y.1 のどちらにアップデートするかは好みが分かれるかもしれません。昔は「初期リリースには不具合が多いので避ける」というのが常識でしたが、最近のRubyやRailsを見ると初期リリースに重大な不具合があるのは少ない気も・・・。メジャーバージョンアップはまた別ですが。

しかし、どちらにせよ**Railsのリリース日が不定期**なので**毎年6月にアップデート**といった計画の立て方になりそうです。

**ローリングアップデート**
Ruby・Railsのバグフィックスリリースを含めた全てのリリースがあるたびに即座にアップデートする戦略。ある意味理想的です。しかし、アップデートをしたときは普通はアプリケーションのテストが必要になるはずで、テストの自動化が必須になるでしょう。
CircleCI 2.0 の Manual Approval のハマりどころ

よく見ると[ドキュメントの例](https://circleci.com/docs/2.0/workflows/#holding-a-workflow-for-a-manual-approval)に書いてあるのですがハマったので備忘録です。

### 誤

```yaml
jobs:
  build:
  deploy_to_staging_with_approval: # 手動でデプロイするジョブ

workflows:
  build_accept_deploy:
    jobs:
      - build:
          # 略
      - deploy_to_staging_with_approval:
          type: approval
          requires:
            - build
          filters:
            branches:
              only:
                - /特定の命名規則にマッチする正規表現/
```

### 正

```yaml
jobs:
  build:
  deploy_to_staging_with_approval:

workflows:
  build_accept_deploy:
    jobs:
      - build:
          # 略
      - approve_deploy_to_staging: # Manual Approval 用のジョブをはさむ！
          type: approval
          requires:
            - build
          filters:
            branches:
              only:
                - /特定の命名規則にマッチする正規表現/
      - deploy_to_staging_with_approval: # こっちが実際にデプロイするジョブ
          requires:
            - approve_deploy_to_staging
```

Manual Approva は UI 上は成功したようにみえるんですが、ログみれなくてどこまでうまくいっててどこから失敗しているのかわからない(Approval だけの機能なので当たり前...)ので調べるのがめっちゃ大変でした。

というわけで Manual Approval のジョブとデプロイのジョブはわけましょうというお話でした。

以上です。
XAMPPについて（メモ用）

※以下はMacでの設定方法になります。

#XAMPP

Webアプリケーションの実行に必要なフリーソフトウェアをパッケージとしてまとめたもの。

##それぞれのイニシャルについて：
- X → クロスプラットフォーム対応（Windows,Linux,Mac）
- A → Apache (Webサーバソフトウェア、アパッチと読む)
- M → MySQL/MariaDB
- P → PHP
- P → Perl


###Apacheの設定

/Application/XAMPP/xamppfiles/etc/httpd.conf

「http.conf」ファイル内の記述を変更して設定する。

- ServerRoot　→　設定ファイルやログファイルの起点となるディレクトリ(31行目)
- Listen　　　→　Apacheが通信するときの窓口(52行目)
- LoadModule　→　Apacheに組み込むモジュールをここで設定する(66行目)
- ServerAdmin　→　サーバー管理者のメールアドレスを設定する(194行目)
- ServerName　→　サーバーの名前を設定する(205行目)
- DocumentRoot  →　公開コンテンツを設置するディレクトリ名を設定する場所htmlやphpファイルをここに置くことでブラウザで確認ができる。画像やスタイルシートもここに配置。
- AllowOverride　→ 「.htaccess」ファイルの有効・無効を設定することにより、ApacheやPHPの設定をディレクトリごとに変更できる。
- DirectoryIndex →　「index.php」が表示されるように設定するところ（269行目


一連の設定終了後にApacheを再起動して変更を反映させる。
vscodeのRails Run Specsでrspecを早く実行する設定

## まずspringでrspecを高速化する
https://qiita.com/saicologic/items/09eb6ddc0c9c92da393f

## Rails Run Specsをinstallする
https://marketplace.visualstudio.com/items?itemName=noku.rails-run-spec-vscode

## projectのフォルダの.vscode/settings.jsonファイルに以下の設定を追加する
```
{
  "ruby.specCommand": "bundle exec bin/rspec"
}
```
Swift 型の構成要素

随時更新していきます
#型の構成要素
Swiftの型は、構造体、クラス、列挙型がある
それぞれ以下の要素が定義されている

- プロパティ
型が持つ値を保存する
**型に紐付いた変数や定数**
https://qiita.com/KunioTerada/items/074020a63f563b613dae

- メソッド
型の振る舞いを表す
**型に紐付いた関数**
https://qiita.com/KunioTerada/items/358f727b09d3a2235bb1

- イニシャライザ
初期化を行う
**型のインスタンス化を初期化する。**
https://qiita.com/KunioTerada/items/1a7611924b8e97668c6f

- サブスクリプト
コレクションの要素を取得

- ネスト型
型内に型を定義する

#### 定義方法

- 構造体
```
struct SomeStruct{}
```

https://qiita.com/KunioTerada/items/61d89ecf288018621963

- クラス
```
class SomeClass{}
```
- 列挙型
```
enum SomeEnum{}
```

## インスタンス自身へのアクセス

```swift

struct SomeStruct {
    let value = 123

    func printValue() {
        print(self.value)
    }
}
```
- インスタンスそのものでなく、インスタンスのプロパティやメソッドにアクセスする場合selfキーワードを省略可能
- インスタンスのプロパティと同名の変数や定数がスコープ内に存在する場合selfキーワードの明記が必要

```swift

struct SomeStruct {
    let value: Int
    
    init(value: Int) {
        self.value = value
    }
}
```
「ハンズオン準備」インデックス

これは、2018年12月に実施される [OSGeo.JP Workshop for UN Vector Tile Toolkit - Let’s make sustainable web maps](http://www.foss4g-asia.org/2018/w11/) の準備をする中で作成した、日本語によるメモの一覧です。

1. [ベクトルタイル内で OSM と相互参照なしに混ぜるデータに Share-Alike が適用されないと考えることの整理](https://qiita.com/hfu/items/9dfc0ec57c98dffe6f23)
2. [planet.osm.pbf を4096分割する](https://qiita.com/hfu/items/f94392bc05d190dc057d)
3. [モジュール化した osm.pbf を GeoJSON に変換する](https://qiita.com/hfu/items/da3ff2c1884c4bd4d600)
4. [地球地図スリランカを GeoJSON Text Sequence に変換する](https://qiita.com/hfu/items/f1f5cd813f79ef37eeb0)
5. [ハンズオンのために作成するレポジトリ群の構想](https://qiita.com/hfu/items/c13f373b74b9a9f56d51)
6. [インポートプログラム spinel-produce の概成](https://qiita.com/hfu/items/2620f3c99b2fffa6f3fe)
7. [OSM ベースのベクトルタイルスキーマ two-eleven の設計](https://qiita.com/hfu/items/1e44a7d25d249ced76b3)
8. [two-eleven の modify.js への実装](https://qiita.com/hfu/items/f630d30f2d5cfd91de90)
9. Natural Earth　ベースの 0-0-0.mbtiles の実装
10. spinel の初期実装
Laravel/LumenでOracle10gに繋ぐとORA-02248が出る

## 経緯

以下を参考にしてドライバ導入
https://qiita.com/ono-soic/items/8ede45e9ce0d902da0c1

エラーでる

> (2/2) QueryException
> Error Code : 2248
> Error Message : ORA-02248: ALTER SESSIONのオプションが無効です。
> Position : 231
> Statement : ALTER SESSION SET NLS_TIME_FORMAT = 'HH24:MI:SS' NLS_DATE_FORMAT = > 'YYYY-MM-DD HH24:MI:SS' NLS_TIMESTAMP_FORMAT = 'YYYY-MM-DD HH24:MI:SS' > NLS_TIMESTAMP_TZ_FORMAT = 'YYYY-MM-DD HH24:MI:SS TZH:TZM' NLS_NUMERIC_CHARACTERS = '.,' EDITION = ora$base
> Bindings : []
> (SQL: ALTER SESSION SET NLS_TIME_FORMAT = 'HH24:MI:SS' NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS' NLS_TIMESTAMP_FORMAT = 'YYYY-MM-DD HH24:MI:SS' > NLS_TIMESTAMP_TZ_FORMAT = 'YYYY-MM-DD HH24:MI:SS TZH:TZM' NLS_NUMERIC_CHARACTERS = '.,' EDITION = ora$base)

これかな？　と思ったけど
https://ameblo.jp/archive-redo-blog/entry-10035717316.html

違った

これでした
https://qiita.com/sowd/items/f7849afb5fc1c30cd2f9

```php:vender/yajra/laravel-oci8/src/config/oracle.php
return [
    'oracle' => [
        'driver'         => 'oracle',
        'tns'            => env('DB_TNS', ''),
        'host'           => env('DB_HOST', '192.168.0.0'),
        'port'           => env('DB_PORT', '1521'),
        'database'       => env('DB_DATABASE', 'hoge'),
        'username'       => env('DB_USERNAME', 'fuga'),
        'password'       => env('DB_PASSWORD', 'poyo'),
        'charset'        => env('DB_CHARSET', 'AL32UTF8'),
        'prefix'         => env('DB_PREFIX', ''),
        'prefix_schema'  => env('DB_SCHEMA_PREFIX', ''),
        //'edition'        => env('DB_EDITION', 'ora$base'),
        'server_version' => env('DB_SERVER_VERSION', '10g'),
    ],
];
```

## まとめ

EDITION は Oracle11g からの機能なので Oracle10g にはありません
ゲーム実況ソフトをつくりたい

# 1. ゲームの楽しみ方
ある程度ゲームを楽しめる段階に達すると **ルール以外の概念**でゲームを把握するようになる

例えば将棋:

- **駒の働き**が先手の方が勝っているので指しやすいと思う
- 先手は角交換を**嫌がって**いるようです
- これは**焦点の歩**ですね (などの手筋 = 部分的なパターン認識)
- 後手の王様が遠く **速度で勝てる**と踏んでいるのでしょう

ポーカーでは

- この形は **インプライドオッズ** を考慮すればベットできる
- 今は**ルースにプレイする**にはブラインドが小さすぎる
- セットが入ったので、**ポッドを育てる**ための振る舞いが必要だ

数独では:

- **双子の数字**に注目して候補を減らすことは基本戦略
- あと少しなので**バックトラックが成功しやすそう**なマスを見つけよう

# 2. 実況・解説の有用性
野球中継やポーカー中継などTVショーで実況者・解説者が言語化するのは、前述したような ある程度大局的な観点で、（正解かは置いておいて）論理的な思考力を使えば理解できるようなサマリだ。

こういったものを自動生成するような枠組みがあるのかなあ？機械学習でニュース記事の自動生成をやってたり、強いAI を作ることができるので、技術的には可能なのだろうけど、あまり世に広く普及はしていないようにみえる。将棋なんか完全に 機械学習が商用ベースに乗っているのに実況ソフトは見かけない（その分野にあまり詳しくないだけかもしれない）

# 3. 実況の種別
少しの考察。学術的にあるんだろうけど、まあ素人考えで。

実況には大きく N種類あると思う。1. 要約の実況 2. 予想の実況 3. 思考の実況 4. データベース探索

「要約の実況」は、ゲームの現況を上手く要約するものだ。パターン認識が得意とする領域:

- 先手は四間飛車を選択しました
- 角換わり腰掛銀の形になりそうです
- 先手は詰めろをかけました

「予想の実況」は、次の一手を当てるものだ。これはまあ普通の機械学習。DQNとか:

- 最善手は△３二飛。評価値 +120。後続手は・・・・
- 事前手は△９五歩。評価値 -20。後続手は・・・・

「思考の実況」は人間の思考をトレースするような実況。感触や部分的な最適解を積み上げてどのような推論が可能なのかを提示:

- 銀冠が完成する前に後手は仕掛けたいです
- 金をうわずらせて 将来銀の割打ちの筋が生じさせるようにしたのでしょう
- 駒得よりも速度を優先させた攻めになります

「データベース探索」は、ゲームの現況に合致した過去のデータを提示するもの。長考中の時間の穴埋めや、対局者固有の情報を提示:

- この局面では先手の攻めが成功した事例がありました
- 先手は現在５連勝中で勢いに乗っています
- この局面のような角換わり６八金型が流行しています

# 4. 社会的背景と照らして
意思決定を受け入れるためには、何らかの形で人間がその決定を理解しないといけない。興味があるのは過程であり、結果ではないから（少なくともゲームを見る側にとっては）。

実際、ゲームの実況だけでなく 株価の推移、SNS での炎上過程、野生動物観察、などなど情報を消化しやすいように加工するニーズはいくらでもありそうで、それらの基盤技術はこれから伸びていきそう。関連する会社の株があれば買いたい、まじで。
Amazon Athenaで作成するデータベース名、テーブル名、列名に日本語を使ってみた

Athenaでは事前にデータベースおよびテーブルを定義しておく必要がありますが、その際に指定する名前に日本語が使えるのか気になったので、試してみました。

Athenaについては、以下のページにて簡単にまとめましたので、ご確認ください。

[Amazon Athenaにおける文字コードの考え方　-Athenaとは？-](https://qiita.com/taichimachima/items/74f11ec97f27f6d289e5#athena%E3%81%A8%E3%81%AF)

# Athenaの仕様
Athenaにおける各要素の命名について、[公式ドキュメント](https://docs.aws.amazon.com/ja_jp/athena/latest/ug/tables-databases-columns-names.html)を確認したところ、以下の記載がありました。

>**Athena のテーブル名とテーブルの列名は小文字にする必要があります。**
>>Apache Spark を使用する場合は、テーブル名とテーブルの列名を小文字にする必要があります。
Athena では大文字と小文字を区別せず、テーブル名と列名を小文字に変換しますが、Spark には最初から小文字のテーブル名と列名が必要です。
>>大小文字が混在する列名 (profileURI) や大文字の列名が含まれているクエリは無効です。

>**Athena のテーブル、データベース、および列の名前に使用できる特殊文字はアンダースコアのみです。**
>>Athena のテーブル、データベース、および列の名前にアンダースコア (_) 以外の特殊文字を含めることはできません。

ふむ、つまりはこういうことだと理解しました。

- テーブル、データベース、および列名には以下の制約がある
    - 小文字はOK
    - 大文字は小文字に変換される
    - 特殊文字はアンダースコア( _ )のみOK
- **言い換えると、日本語は使用できない**


# 日本語を指定する方法
上記のとおり、公式では日本語は使えないと読める記述がありましたが、ちょっとした工夫で日本語を指定することができました。

## データベース、テーブル作成DDL
結論から言えば、**データベース、テーブル、列名をバッククォート( ` )で囲んだDDLであれば日本語で作成できちゃいます**。
※日本語のほか、アンダースコア( _ )以外の特殊文字も指定できることを一部確認しました
※ダブルクォートやシングルクォートで囲んだり、囲み無しの場合はエラーとなりました

```createdatabaseddl.sql
CREATE DATABASE `テストデータベース`;
```



```createtableddl.sql
CREATE EXTERNAL TABLE IF NOT EXISTS `テストデータベース`.`テストテーブル` (
  `名前` string,
  `メールアドレス` string,
  `性別` string,
  `年齢` int
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe'
WITH SERDEPROPERTIES (
  'serialization.format' = ',',
  'field.delim' = ','
)
STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat' 
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.IgnoreKeyTextOutputFormat' 
LOCATION 's3://<スキャン対象のデータがあるS3の場所>/'
TBLPROPERTIES (
  'has_encrypted_data'='false',
  'skip.header.line.count'='1'　←スキャンデータにヘッダーが含まれている場合は必要
)
```
上記のクエリを実行した結果がこちら。
![DDLResult.png](https://qiita-image-store.s3.amazonaws.com/0/307226/abde7382-5b78-b7d7-4414-7a1aab3fb2fb.png)
ご覧の通り、ちゃんと日本語名のデータベース、テーブルが作成されています。

## 日本語名テーブルへのクエリ
上記で作成したテーブルへクエリを投げる際も、少しだけ工夫が必要です。

`SELECT * FROM テストデータベース.テストテーブル;`だとエラーになります。
かと言って``SELECT * FROM `テストデータベース`.`テストテーブル`;``とすると、エラーにはなりませんが、レコードがうまく返ってきません。

結論としては、`SELECT * FROM "テストデータベース"."テストテーブル";`のように、**データベース、テーブル名をダブルクォート( " )で囲んであげると、以下のようにレコードが返ってきます**。
![SQLResult.png](https://qiita-image-store.s3.amazonaws.com/0/307226/68d32cf2-3549-f6fc-e12d-362dd6afec42.png)
※そういえば、列名もちゃんと日本語になってますね

# 日本語名のテーブルを使うことによる不都合
テーブル名を指定する以下のDDLでエラーが発生しました。

- `` DESCRIBE `<日本語テーブル名>` ``
- `` ALTER TABLE `<日本語テーブル名>` ADD PARTITION (<パーティション句>)``

`` DROP TABLE `<日本語テーブル名>` ``は使えたので、日本語名のテーブルを作成できるけど削除できない、なんてカオスな事態にはならないようで安心しました。
が、パーティション切れないのは正直イタいですね。。。

# まとめ
- Athenaでは、テーブル、データベース、および列名に日本語やアンダースコア( _ )以外の特殊文字を使用することはサポートされていない
- 定義時にデータベース、テーブル、列名をバッククォート( ` )で囲むことで、日本語や特殊文字の指定が可能
- 日本語名のテーブルに対して、ADD PARTITIONは使えない

　
所詮はサポートされていない非公式な定義方法なので、

**「どうしても日本語で定義したい、かつパーティション切るほどでもない」**

といったニーズがある場合（そんなニーズあるのかは置いといて）は、今回お伝えした方法を試してもらえればと思います。
AWS CodeBuildのビルド環境でアカウントIDを取得する

#目的
ビルド環境内でAWSのアカウントIDを動的に取得したい。

※なんで、公式の環境変数に無いのだろうか・・・。
https://docs.aws.amazon.com/ja_jp/codebuild/latest/userguide/build-env-ref-env-vars.html

#やり方
buildspec.yml内で以下のコマンドを記載
`ACCOUNT_ID=${CODEBUILD_BUILD_ARN} && IFS=':' && set -- $ACCOUNT_ID && ACCOUNT_ID=$5`

以降は、`${ACCOUNT_ID}`で使いまわせる。

##説明
`ACCOUNT_ID=${CODEBUILD_BUILD_ARN}`
「ACCOUNT_ID」にビルドの Amazon リソースネーム (ARN) (例:arn:aws:codebuild:region-ID:account-ID:build/codebuild-demo-project:b1e6661e-e4f2-4156-9ab9-82a19EXAMPLE)をセット。

`IFS=':' && set -- $ACCOUNT_ID`
上記の値を区切り文字「：」で分解して配列化して「ACCOUNT_ID」にセット。

`ACCOUNT_ID=$5`
配列の5つ目にあるアカウントIDを「ACCOUNT_ID」にセット。
iOS9でReloadSectionsを実行するとcontentOffsetがゼロになる？

現在 iOS9以上で動くアプリを作成していて、詰まりました。
reloadSectionsを実行した際に
iOS10以上は現在の位置そのまま表示されるのですが、
iOS9だと、シミュレータ、実機共に
TableViewのいちばん上まで戻ってしまいます。

`if #available(iOS 10.0, *) {
　　debugLog("iOS10以上")
　　self.mainTableView.reloadSections(self.SectionIndex, with: UITableViewRowAnimation.automatic)
} else {
　　debugLog("iOS9以下")
　　self.mainTableView.beginUpdates()
　　let nowOffset = self.mainTableView.contentOffset
　　self.mainTableView.reloadSections(self.SectionIndex, with: UITableViewRowAnimation.automatic) 
　　self.mainTableView.endUpdates()
　　self.mainTableView.setContentOffset(nowOffset, animated: true)
}`

現在は上記のような形です。

更新後に上に行ってしまうのは、Xcode,iOSのバグなのか、仕様なのか
また、トップに行かせずに位置の固定ができるかを教えて下さい。
macOSをアップデートしたらg++でwchar.hが見つからなくなった

#あらすじ
MacのOSをMojaveにアップデートしたら、g++でビルド出来なくなった。


```c++:これはビルド出来る
int main(){}
```

```c++:これはビルド出来ない
#include <iostream>
int main(){}
```

エラーは以下の通り

```
In file included from /usr/local/Cellar/gcc/8.2.0/include/c++/8.2.0/bits/postypes.h:40,
                 from /usr/local/Cellar/gcc/8.2.0/include/c++/8.2.0/iosfwd:40,
                 from /usr/local/Cellar/gcc/8.2.0/include/c++/8.2.0/ios:38,
                 from /usr/local/Cellar/gcc/8.2.0/include/c++/8.2.0/ostream:38,
                 from /usr/local/Cellar/gcc/8.2.0/include/c++/8.2.0/iostream:39,
                 from Main.cpp:8:
/usr/local/Cellar/gcc/8.2.0/include/c++/8.2.0/cwchar:44:10: fatal error: wchar.h: No such file or directory
 #include <wchar.h>
          ^~~~~~~~~
compilation terminated.
```
#解決方法

* xcodeを再インストールした。
* gccを再インストールした。

gccの再インストールは、homebrewのreinstallを使用した。

```
brew reinstall gcc
```
log4jsのインストールに失敗する(2018/11/6時点)

# 問題
あるプロジェクトのDockerコンテナ環境で使用しているモックサーバーのコンテナが立ち上がらない。
調べてみるとログ出力に使っているパッケージのインストールに失敗している模様。

# 問題のパッケージ
log4js
javascript用のログ出力パッケージ

# 原因
log4jsが依存している別のパッケージである**circular-json**がdeprecatedになっている。
https://www.npmjs.com/package/circular-json
このせいで依存パッケージを解決できず、log4jsがインストールできない。

# 解決方法
circular-jsonの後継はflattedだそうなので、log4jsのバージョンアップを待つしかなさそう。
出力したいログは結局さほど使っていないものだったので、私はログ出力を止めた。
log4jsのアップデートに期待したい。
How to explode a column in pandas


```python
 def explode(self, df, explode_column, delimiter=","):
        assert explode_column[-1] is "s"
        df["id"] = df.index
        wdf = pd.DataFrame(df[explode_column].str.split(delimiter).tolist()).stack().reset_index()
        exploded_column = explode_column[:-1]
        wdf.columns = ["id", "depth", exploded_column] ## plural form to singular form
        wdf[exploded_column] = wdf[exploded_column].apply(lambda x: x.strip())  # trim
        wdf.drop("depth", axis=1, inplace=True)

        return pd.merge(df, wdf, on='id').drop(columns=["id", explode_column])
```
Mavenプロジェクトのビルド方法

すぐ忘れるのでメモ。

1.プロジェクトを右クリック→実行→Maven Clean
2.プロジェクトを右クリック→実行→Maven install
3.D:\pleiades-4.7.1\workspace\プロジェクト名\targetにあるwarファイルをコピー
　※ワークスペースのディレクトリは読み替える
4.D:\pleiades-4.7.1\tomcat\apache-tomcat-8.5.11\webappsにwarファイルを貼り付け
　※tomcatホームは読み替える
5.D:\pleiades-4.7.1\tomcat\apache-tomcat-8.5.11\webapps\プロジェクト名をフォルダごと削除
【sqlite C/C++ API】sqlite3_errmsg()に渡す引数のNULLチェックは不要

# `sqlite3_errmsg()`について

関数`sqlite3_errmsg()`はデータベースハンドラ`salite3*`を引数にとり、そのデータベースハンドラで直前に発生したエラーに関するメッセージを返す。
例えば、存在しないファイルに対して読み込み専用オプションをつけて`sqlite3_open_v2()`を呼び出すと、以下のようにエラーが発生する。

```C
    const char *not_exist_file = "notexist.sqlite";
    sqlite3 *db = NULL;
    int rc = sqlite3_open_v2(not_exist_file, &db, SQLITE_OPEN_READONLY, NULL);
    if (rc != SQLITE_OK)
    {
        printf("[%s]\n", sqlite3_errmsg(db));   // [unable to open database file]
    }
    sqlite3_close(db);
```

エラーが発生していない場合は、以下の例のように、`"not an error"`を返す。

```C
    sqlite3 *db = NULL;
    int rc = sqlite3_open("filePath.sqlite", &db);
    if (rc == SQLITE_OK)
    {
        printf("[%s]\n", sqlite3_errmsg(db));    // [not an error]
    }
    sqlite3_close(db);
```

# `sqlite3_errmsg()`に`NULL`を渡してみる

[公式リファレンス](https://www.sqlite.org/c3ref/open.html)によると、関数`sqlite3_open()`および`sqlite3_open_v2()`は、DB接続のオープンに失敗した場合も、引数として渡されたデータベースハンドラに非`NULL`の値を書き込む。ただし、メモリ領域の確保に失敗した場合は、データベースハンドラに`NULL`が書き込まれる。
そこで、メモリ領域確保に失敗したことを想定して、`sqlite3_errmsg()`に`NULL`を渡してみる。

```C
int main(int argc, char **argv)
{
    printf("[%s]\n", sqlite3_errmsg(NULL));     // [out of memory]
}
```

`"out of memory"`という文字列が返された。
上記のコードでは、実際にはメモリ領域の確保を試行していない。`sqlite3_errmsg()`に`NULL`が渡される状況とは、メモリ領域の確保に失敗した、すなわちメモリ枯渇状況である、と判断してこのメッセージを返す仕様としているのだろう。

# 以上を踏まえて

以上の実験から、`sqlite3_open()`または`sqlite3_open_v2()`が返す値が`SQLITE_OK`でなかった場合のエラーメッセージ取得は、データベースハンドラが`NULL`か非`NULL`かにかかわらず、以下のように記述すれば良いことになる。

```C
    sqlite3 *db = NULL;
    const char *errMsg;
    int rc = sqlite3_open("filePath.sqlite", &db);  /* もしくはsqlite3_open_v2関数の呼び出し */
    if (rc != SQLITE_OK)
    {
        errMsg = sqlite3_errmsg(db);
        // errMsgをログや標準エラーなどに出力
        // その他、必要なエラーハンドリング
    }
    sqlite3_close(db);
```

# まとめ

* `sqlite3_open()`および`sqlite3_open_v2()`はエラー発生時に以下の挙動をする。
  * メモリ領域確保エラーの場合：引数として渡したデータベースハンドラに`NULL`を書き込む
  * それ以外のエラーの場合：引数として渡したデータベースハンドラに非`NULL`値を書き込む。
* `sqlite3_errmsg()`には`NULL`を渡しても安全なので、エラー発生時には引数の`NULL`チェックを行わずに`sqlite3_errmsg()`にデータベースハンドラを渡して良い。

# 参考

* 公式リファレンス
  * [Opening A New Database Connection](https://www.sqlite.org/c3ref/open.html): `sqlite3_open()`, `sqlite3_open_v2()`について。
  * [Error Codes And Messages](https://www.sqlite.org/c3ref/errcode.html): `sqlite3_errmsg()`について。
純正JavaScriptでのクエリパラメータ取得

# 概要
純正のJavaScript(pure js)でクエリパラメータを取得する方法を記載。
**ブラウザURLから指定したパラメータ名に紐づくパラメータ値を取得**
を実現するために必要最低限な内容となっている想定。
ハッシュ値取得やパラメータ存在確認を目的とした利用は対象外となっている。

# TL;DR

```js

function getQueryParam(key) {
  // 1.URLから (指定したパラメータ名~&|$|#) で終わる箇所を抜き出し
  const value = window.location.href.match(new RegExp("[?&]" + key + "=(.*?)(&|$|#)"));
  // 2.パラメータ名に一致する値が存在しない場合は空返却
  if (value == null) return '';
  // 3.パラメータ名に一致する値が存在した場合はURLデコードして返却
  return decodeURIComponent(value[1]);
}
```

# 注意点
##### 1.パラメータ値に& # $が含まれている場合
パラメータを取得する範囲の区切り値として`& # $`を利用しているため、
パラメータ値に`& # $`が含まれると想定外の範囲を取得してしまう可能性あり。
パラメータ値は事前にURIエンコードをする等で`& # $`がそのまま入る事を避ける必要がある。

##### 2.パラメータ名にメタ文字を含む場合
パラメータ名にメタ文字を含む場合、事前にエスケープをする必要がある。
具体的には、`. * + ^ | [ ] ( ) ? $ { }`を含むパラメータ名である場合。
keyの値をmatchで検索する前に必要なメタ文字のエスケープ処理を挟めばOK
例) []をエスケープ : `key.replace(/[\[\]]/g, "\\$&")`

# Reference
Javascript でURLのパラメータを取得する方法
http://www-creators.com/archives/4463
Javascript での 正規表現 の エスケープ について
https://qiita.com/ue5963/items/bd8e32ac9e6b12aa7fab
WindowsUpdateを一時的に抑止する方法について

#WindowsUpdateを一時的に抑止する方法について


#####以前業務で使用しているアプリでwindowsupdateが掛かると挙動しなかった際に一時的に対応した際のマニュアルを備忘として残します。ただしWindowsUpdate抑止に関してはよく仕様が変わりますので都度見直しを実施する必要がありますのでご注意ください。	

##Pwershell設定
###１、下記のPowerShellのスクリプトを任意のフォルダに保存する。
・スプリクトに関してはメモ帳にコードを貼り付けて拡張子を.ps1で保存。
・今回は例として C:\Scripts 以下に「disable-winupdate.ps1」で作成する。 

	【コード】
	set-service wuauserv -startuptype disabled 
	stop-service wuauserv 
	stop-service usosvc 
	Get-ScheduledTask -taskpath "\Microsoft\Windows\WindowsUpdate\" | Disable-ScheduledTas


##タスクスケジュール設定
###２、タスクスケジューラで次の設定を行う。 
　　便宜上、作成したタスク名は「Disable Windows Update」とする。


■全般 
　下記の通り設定する。 
　実行ユーザはAdministrator権限のユーザを設定する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/278947/9dbc10d1-2269-e8a5-66ca-922d858d177a.png)

■トリガー 
![image.png](https://qiita-image-store.s3.amazonaws.com/0/278947/d1f3707d-55b4-5f96-dd23-8f4f9b6baf17.png)

■操作 
![image.png](https://qiita-image-store.s3.amazonaws.com/0/278947/c6c0cc58-4f63-1cb9-9e5b-550284a3cc97.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/278947/1d04c560-6f19-25e3-460b-699b003a6f3f.png)


###◆タスクスケジュールのログ有効化
なおタスクスケジュールのログはデフォルトで無効になっていますので必要に応じて
　有効にしてください。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/278947/fb72ffa5-573f-b9e9-259a-d29480d13518.png)

イベントビューアを起動
[Windows] + [R]を押下して「eventvwr.msc」と入力。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/278947/08a5b49d-d42c-21bb-ff25-f330ef7c13e2.png)

[アプリケーションとサービスログ] – [Microsoft] – [Windows] – [TaskScheduler]と展開し、「Operational」を選択して右クリック「プロパティ」を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/278947/6a89c43d-d76a-0eda-bf3d-4528df72dfe7.png)

「ログを有効化にする」にチェックを入れて「適用」して「OK」と押下します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/278947/8c73f396-ec57-1216-92a6-b0428ade955d.png)



##正常確認
「前回の実行時刻」が想定している時刻（5分ごと）、および「前回の実行結果」が”この操作を正しく終了しました。となっていることを確認する。 
![image.png](https://qiita-image-store.s3.amazonaws.com/0/278947/8720410a-3d69-dc3d-922a-aaf9577c0f54.png)
Laravel インストール

# Laravel のインストール

https://readouble.com/laravel/5.7/ja/installation.html

Composer を利用したインストールする方法です。
PROJECT の名前はインストール先に合わせて変更します。

```bash
composer create-project --prefer-dist laravel/laravel PROJECT
```

上記では、最新バージョンがインストールされますが
過去のバージョンをインストールする場合は、バージョンを指定します。

```bash
composer create-project --prefer-dist laravel/laravel=5.6.* PROJECT
```

インストールが終わったら、PHPのビルトインウェブサーバで立ち上げることができます。

```bash
php artisan serve
```

ポート8000で立ち上がります。

```bash
Laravel development server started: <http://127.0.0.1:8000>
```

ホスト、ポート番号を変えることもできます。

```bash
php artisan serve --host=localhost --port=8888
```
実行ファイルを解析

## `C#`

* [dnSpy](https://github.com/0xd4d/dnSpy/releases)
    * ソースコードがすぐに解析できる。

## `C++`

* [Boomerang Decompiler](http://boomerang.sourceforge.net/)

ソース内の平文のみ見えるっぽい。
dnSpy で `PE`と表示されたexeはこちらを使うと少し情報がわかる。


## `ActiveX (.ocx)`

### 参考

* http://sandsprite.com/iDef/COMRaider/
* https://github.com/dzzie/COMRaider

### 使い方

* windows 10 や 7 では動かなかった。
* windows xp では動作した。

```
git clone https://github.com/dzzie/COMRaider
```

* COMRaider_Setup.exe を実行
* インストールされた先の COMRaider.exe を実行
* 右上の[Start] - [Choose ActiveX dll or ocx file directly]
    * c:\windows\system32\ 以下の、確認したい .ocx ファイルを選択

![loadfile.jpg](https://qiita-image-store.s3.amazonaws.com/0/25728/ce109117-fee3-3b1d-a1e3-a89d6e92b71f.jpeg)
nuxt.js入門メモ

nuxt.jsの自分用入門メモ

# nuxt.jsとは？

SPAを気軽に作れるvue.jsのフレームワークでSSRが使いやすいのが特徴。

# インストール方法

## ハマったところ

「Nuxt.jsプロジェクトをv2(nuxt-edge)にアップグレードした際にハマったところ」
https://qiita.com/sho_yamane/items/ce0d40450d373152eb18

installしたら

```
Module build failed: TypeError: Cannot read property 'eslint' of undefined
```

とでたので上記の記事の対応を

# 各fileで`export default`を多用

nuxtはcomponentで管理するので基本的にはfileごとに分けてexport,importを多用します。基本的にはexport defaultでscriptを書いて命名しなくてもimportしやすくする場合が多いです。

# ディレクトリ構造

https://ja.nuxtjs.org/guide/directory-structure/

ここに各ディレクトリの役割が

# viewを作成したいとき

## pagesに.vueファイルを置く

pagesに置かれた.vueファイルがvuerouterにより自動的にルーティングされる。部品はcomponents、レイアウトはlayoutsで管理する。

## layouts管理

基本的には`default.vue`を読み込むがlayoutsフォルダに他vuファイルを作成し、下記で指定。

```javascript
<script>
export default{
 layout: 'single'
}
</script>
```

# componentの呼び出し方

```javascript:layouts/default.vue
<template>
 <logo/>
</template>

<script>
import Logo from '~/components/Logo.vue'

export default {
  components: {
    Logo
  }
}
</script>
```

## dataの書く場所

viewをレンダリングするにあたり使うdataはviewを書いているcomponentごとに定義する必要がある。defaultの中に書いてあるからその中でレンダリングしているcomponentに書かなくていいというわけではない。

# headタグ内の設定

nuxt.config.jsで行う

```javascript:nuxt.config.js
module.exports = {
  head: {
    meta: [
      { charset: 'utf-8' },
      { name: 'viewport', content: 'width=device-width, initial-scale=1' }
    ],
    link: [
      { rel: 'stylesheet', href: 'https://fonts.googleapis.com/css?family=Roboto' }
    ]
  },
  build: {
    /* before
    extend(config, { isClient, isDev }) {
      if (isDev && isClient) {
        config.module.rules.push({
          enforce: 'pre',
          test: /\.(js|vue)$/,
          loader: 'eslint-loader',
          exclude: /(node_modules)/
        })
      }
    } */
    /* after */
    extend(config) {
      if (process.server && process.browser) {
        config.module.rules.push({
          enforce: 'pre',
          test: /\.(js|vue)$/,
          loader: 'eslint-loader',
          exclude: /(node_modules)/
        })
      }
    }
  }
}
```
# ルーティング

## <nuxt-link>でリンクを張りたいとき

```vue.js
<template>
  <nuxt-link :to="mypageUrl">マイページ</nuxt-link>
</template>

<script>
import { mapState } from 'vuex'

export default {
  name: 'sampleComponent',
  computed: {
    ...mapState({
      mypageUrl: (state) => `/mypage/${state.userId}`
    })
  }
}
</script>
```

## 動的なページ作成

例

* `_id`など`_`で動的なルーティングを指定
* 各pagesのscriptでthis.$route.params.idなどで受け取る
* 受け取ったparamsなどをもとにapiで情報取得
* `{}`などで情報を<template>内に出す

# CSSフレームワークを導入したい時

## bootstrap_vue

http://blog.64p.org/entry/2018/03/27/024707
Amazon Linux 2でのJava 11のLTS提供が発表されました

[Amazon Web Services ブログ](https://aws.amazon.com/jp/blogs/news)にてAmazon Linux2及びAmazon Linux AMIでのJavaのLTS (Long-Term Support) の提供が発表されました。
[Amazon LinuxでのJavaのLTS (Long-Term Support)提供について _ Amazon Web Services ブログ](https://aws.amazon.com/jp/blogs/news/re-affirming-long-term-support-for-java-in-amazon-linux/)

詳細は上記ブログをご覧頂くのが良いですが、簡単な要約は以下の通りです。

- Amazon Linux2上でのOpenJDK 8及びOpenJDK 11の無料のLTSが最短でも**2023年6月30日まで**Amazonより提供される
- Amazon Linux AMI 2018.03でのOpenJDK 8のサポートは**2020年6月30日まで**AWSより提供される

こういう所がAWSは本当に素晴らしいと思います。これで安心してJava 11への移行が進められますね。
CentOS7の業務に役に立つ基本コマンド

# ホスト名を変更する
```
# vi /etc/hostname
```

# サーバのIPアドレスを変更する
```
# nmtui
```

# パッケージを追加する
基本的にyumコマンドでパッケージを追加します。

# パッケージを全て最新状態にする
```
# yum update
```

# 時刻同期する

CentOS7.3よりntpdに代わりchronydがデフォルトで採用されています。<br>
自動的にchronydが起動しているためにntpdを起動しても失敗します(ポートを既にchronydに取られているため)

どうしてもntpdを使いたい場合はchronydを停止、自動起動をoffにしてntpdを起動します。

## chronyd同期確認
```
# chronyc sources
# chronyc tracking
```

# サービスの開始、停止
例としてApacheの起動と停止

```
systemctl start httpd
systemctl stop httpd
systemctl status httpd
```

# サービスの自動起動、自動起動停止

```
systemctl enable httpd
systemctl disable httpd
```

# topコマンド
サーバの負荷状況を確認する

# uptimeコマンド
サーバの稼働時間を調査する

# ssコマンド
ポートの開放状況を確認する
Windowsでいうnetstatコマンド
CentOS6以前にも使われている

# who
ユーザのログイン状況を確認する

# whoamiコマンド
自分のユーザを確認する

# historyコマンド
コマンドの履歴を確認する

# dfコマンド
ディスクの使用量を確認
GKE上でサービス運用するにあたっての最低限のファイル改ざん検知・対策

GKE(Goolge Kubernetes Engine) 環境における、ファイル改ざん検知に対する必要最低限の対応方針についてまとめました。

# 結論

- Linuxサーバー(GKEのnode)に対する改ざん検知対策は基本的には実施しない。
 - GKEのnodeはAuto-updateを有効化して常に最新のセキュリティパッチが適用された状態にする。
 - GKEのSecurity Updateに関する情報はチャットツール等でメッセージを受け取る。

- コンテナに対する改ざん検知対策は、以下を実施します。
 - Docker Content Trust を有効化する
 - Pod Security Policies を有効化する

# Linuxサーバーに対する改ざん検知・対策

GKEで使用されているnode(Linuxサーバー)は、基本的にはサーバーにsshできるようになっていない。また、Kubernetes上で稼働しているDocker Containerはディスクマウントを実施しないため、Linuxサーバー内のファイルに変更を加えることはできない。

また、GKEのnodeはセキュリティアップデートに対するAuto-Update機能を有効化しているため、深刻な脆弱性が報告されたとしても直ちにGoogleによって対応される。また、セキュリティアップデートの情報はRSSで配信されており、チャットで受信できるので購読設定をしておく。

# コンテナに対する改ざん検知・対策
## Docker Content Trust の有効化
Docker Imageのビルドに使用されるimageを署名付きで扱い検証することを必須とするDocker Engineの機能です。Defaultでは無効化されていますが、環境変数に DOCKER_CONTENT_TRUST=1 を定義してビルドを行うことで有効化されます。

これによって、Docker imageの偽造を防ぎ、安全なイメージの取得が保証されます。

## Pod Security Policies の有効化
Docker Container をKubernetes上で動作させるにあたって、Container自身の権限をPolicyによって制限をかけることができます。Containerのプロセスの実行ユーザーの強制や、Privillege Mode(コンテナからホストノードへのアクセス権限)の無効化等、コンテナを安全に稼働させる設定が有効化できます。

Defaultでは Pod Security Policies は無効化されていますが、有効化されることが強く推奨されています。

# 参考
- GCP のセキュリティ : “信頼の基点” としての Titan
 - https://cloudplatform-jp.googleblog.com/2017/09/Titan-in-depth-security-in-plaintext.html
- Pod Security Policies	
 - https://kubernetes.io/docs/concepts/policy/pod-security-policy/
- Best Practices for Securing Containerized Applications in Kubernetes Engine
 - https://github.com/GoogleCloudPlatform/gke-application-security-demo
- 【参考訳】 Docker Content Trust 入門
 - http://pocketstudio.jp/log3/2015/08/14/content-trust-docker-1-8-ja/
php-master-changes 2018-11-05

今日は ext/soap のぬるぽの修正、ext/fileinfo で昨日 libmagic の修正の 7.2 へのバックポート、ビルドシステムでの PCRE2 JIT サポート検知のクロスコンパイル対応、phpinfo() の HTML 出力の固定ヘッダテーブル化の修正があった！

# 2018-11-05
## cmb69: Fix [#76348](https://bugs.php.net/bug.php?id=76348): WSDL_CACHE_MEMORY causes Segmentation fault
- https://github.com/php/php-src/commit/625f614cb13536d805985a2008840452c6c86a26
- [7.1~]
- ext/soap で、WSDL_CACHE_MEMORY 使用時に SEGV になる問題の修正
- コメントは [C プログラマ十戒](https://www.lysator.liu.se/c/ten-commandments.html)からの引用かな
- ぬるぽ → ガッ みたいな奴な気がする

## weltling: Backport [7f5f4601](https://github.com/php/php-src/commit/7f5f46013b8a37bab6b378903aace5da9ce8dc5e) for 7.2
- https://github.com/php/php-src/commit/c621182c42a36975970586cfc294bc5a80ba08cb
- [7.2~]
- ext/fileinfo で、[昨日の libmagic の修正](https://qiita.com/sj-i/items/a4dc7faf53c94024309e#weltling-rework-places-in-libmagic-regarding-previous-cve-2014-3538-fixes)の 7.2 へのバックポート

## weltling: Implement handling for JIT recognition when cross compiling
- https://github.com/php/php-src/commit/68ad401b34dd52f7d72c3161a6cb87b96af5da2a
- [7.3~]
- ext/pcre で、ビルドシステムでの PCRE2 の JIT サポート検知をクロスコンパイルに対応
- [昨日修正したあたり](https://qiita.com/sj-i/items/a4dc7faf53c94024309e#weltling-change-the-way-jit-availability-is-checked)の続き

## fredden: Fix [#77105](https://bugs.php.net/bug.php?id=77105): Use position:sticky for \<th> in \`phpinfo()\`
- https://github.com/php/php-src/commit/eb1233533eb8946e9f400ec016fb5eab861150f3
- [phpinfo()](http://php.net/manual/ja/function.phpinfo.php) の出力で、`<th>` へ [`position:sticky`](https://www.w3.org/TR/css-position-3/#valdef-position-sticky) のスタイルを付与
- [対応してるブラウザ](https://caniuse.com/#feat=css-sticky)では~~無駄に~~固定ヘッダテーブルになるよ！
【Rails】wheneverでcronが実行されない問題【No MTA installed, discarding output】

# 概要
新しく導入したwheneverが、ステージング及び本番環境で実行されていなかったので原因・調査結果をまとめました。

# 状況
syslogを見ると、cron自体は実行されようとしているが`No MTA installed, discarding output`の文字が・・・。

```bash
$ grep CRON /var/log/syslog
Nov  1 XX:XX:XX XXXXXXXXXXXXXXXXXXXXX CRON[XXXXX]: (ubuntu) CMD (/bin/bash -l -c 'cd /srv/api/releases/XXXXXXXXXX && RAILS_ENV=staging bundle exec rake XXXX:XXXX --silent')
Nov  1 XX:XX:XX XXXXXXXXXXXXXXXXXXXXX CRON[XXXXX]: (CRON) info (No MTA installed, discarding output)
```

しかしshell上で同様のコマンドを打つと正常に動作します。

```bash
$ /bin/bash -l -c 'cd /srv/api/releases/XXXXXXXXXX && RAILS_ENV=staging bundle exec rake XXXX:XXXX --silent'
```

outputも出力されていないので、詳細がこれ以上わからないという状況でした。

```config/schedule.rb
set :output, "/path/to/my/cron_log.log"
```

# 原因
結論から書くと、cron実行時にPATH上にbundleが存在しないことが原因でした。

## なぜこうなるの？
`.profile`ではなく`.bashrc`で設定されたパス上にbundleが存在するのが根本要因になります。

```bash
$ which bundle
$HOME/.rbenv/shims/bundle

$ grep PATH= ~/.profile
PATH="$HOME/bin:$HOME/.local/bin:$PATH"

$ grep PATH= ~/.bashrc
export PATH="$HOME/.rbenv/bin:$PATH"
```

まずcronは最初`/usr/bin`と`/bin`しか参照できない状態です。
そのためwheneverで設定されたcronは`/bin/bash -l -c`上で実行されます。
`-l`はログインした状態で実行されるため、`.bash_profile|.bash_login|.profile`が呼び出されます。
しかし`.bashrc`は呼び出されないため、環境変数が無いわけですね。

```bash
$ man bash
-l        Make bash act as if it had been invoked as a login shell (see INVOCATION below).
```

つまり、何かしらの方法でcron実行時にbundleにPATHが通るようにする必要があるわけです。

# 対応方法
## 1. `.bash_profile|.bash_login|.profile`上で環境変数の定義をする
一番ダイレクトな対応方針です。
一般的にも環境変数の定義はこちらですることが推奨されているように見えます。

## 2. cron実行時に環境変数を定義する
crontabが実行されてるときにPATHをセットしてしまおうってことですね。

```bash
$ grep PATH /etc/crontab
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
```

wheneverでは`shedule.rb`に下記コードを足すことでPATHを通すことができます。

```config/schedule.rb
env :PATH, ENV['PATH']
```

こちらについては下記スレッドに出てきている内容を参考にしました。

ref) [Whenever gem (cron job) not executing rake task, Rails 4](https://github.com/javan/whenever/issues/665#issuecomment-319259093)

## 3. jobを対話モードで実行する。
`bash`を`-i`で対話モードとして実行することで`.bashrc`が読み込まれるようになります。
そのため`.bashrc`に定義されたPATHが通るというわけですね。

```config/schedule.rb
set :job_template, "/bin/bash -l -i -c ':job'"
```

こちらについては下記スレッドに出てきている内容を参考にしました。

ref) [Cron commands doesn't work in Ubuntu with 0.6.2 with rails3](https://github.com/javan/whenever/issues/106)

# おわりに
調べると英語圏で困ってる人がたくさんいるようだったものの、日本語記事があまりなさそうだったのでまとめてみました。
こういう問題は、わかるとシンプルでも、わかるまでは本当に意味不明なんですよね・・・。
Vuetify v1.3で追加されたvuetify-loaderが便利だった

先月Vuetify v1.3がリリースされましたが、新しいコンポーネントが追加されたこと以外に、vuetify-loader というloaderが追加されています。
これがなかなかの優れものだったので、その内容をまとめます。

# Vuetify は不要なコンポーネントを外すことができる
Vuetify が提供するコンポーネントの数が増えれば、ライブラリのサイズも大きくなってしまいます。
しかし、Vuetify の全コンポーネントを使うといったことはあまりなく、一部だけを利用することがほとんどです。

Vuetify v1.3 では Webpack による Tree Shaking に対応しており、必要なコンポーネントのみをバンドルさせることができます。
それ以前は、babel-plugin-transform-importsを利用していたようです。

そしてそのために、今までは以下のように利用するコンポーネントを明示的にインポートするように実装する必要がありました。

```js:main.js
import Vue from 'vue'
import App from './App.vue'
import Vuetify, {
  VApp,
  VNavigationDrawer,
  VFooter,
  VToolbar
} from 'vuetify/lib'

Vue.use(Vuetify, {
  components: {
    VApp,
    VNavigationDrawer,
    VFooter,
    VToolbar
  }
})
```
以下のように、`.vue`ファイルでインポートすることもできます。

```vue:App.vue
import { VCard, VCardText, VCardMedia } from 'vuetify/lib'

export default {
  components: {
    VCard,
    VCardText,
    VCardMedia
  }
}
```

どちらの方法にしても、利用するコンポーネントを明示的にインポートしなければならず、非常に面倒です。

# vuetify-loader を利用するとどうなるか
vuetify-loaderを利用すると、アプリで利用しているコンポーネントを自動的に調査し、インポートしてくれます。
そのため、上述のような面倒な実装が不要となり、以下だけでOKです。

```js:main.js
import Vue from 'vue'
import App from './App.vue'
import Vuetify from 'vuetify/lib'

Vue.use(Vuetify)
```

ただし、`v-data-iterator`の`content-tag`に指定したコンポーネントや`<component is:="button ? 'v-btn' : 'v-chip' ">`のようにコンポーネントを利用する場合は自動でインポートできないなどの制約があるようです。

詳細は以下で述べられています。
https://vuetifyjs.com/ja/guides/a-la-carte#limitations

# vuetify-loader の使い方
Vue CLI3 を 利用して Vuetify を追加すれば、何も設定せずとも有効になっています。
設定はすべてデフォルトでOKです。

```sh
$ npm -g install @vue/cli
$ vue create my-app
$ cd my-app
$ vue add vuetify
```

作成したプロジェクトでは特に何も意識する必要はなく、普通に Vuetify のコンポーネントを利用するだけでOKです。
webpack を production mode でビルドすれば、Tree Shaking によって、不要なコンポーネントが除去された状態でバンドルすることができます。

---
今までは、少しでもファイルサイズを減らしたいので頑張ってインポートしていたのが、何も意識することなくできるようになっているのは非常に素晴らしい進化だと思います。

あと関係ないですが、Vue CLI3 が便利でビックリしました。特に `vue ui`コマンド。
Webpack の設定ファイルがなかったり、色々気になる部分はありますが、これがスタンダードになっていくのであれば、慣れていくしかないですね。
MacBookAir でCUDA

#忘備録
##CUDAのインストール
- [ダウンロードサイト](https://developer.nvidia.com/cuda-downloads)
    - ダウンロードにはnvidiaアカウントの作成が必要
  - MacOSXを選択
  - ダウンロード完了後 ダブルクリックして　デフォルトでインストール
  - Xcode command linetool （ver10はNGだったのでver9.4.1で対応）が必要 [参考にしたサイト](https://qiita.com/iwaseasahi/items/eb820762600c815ab100)
  - ~/.bach_profileにcommand line tool のPATHの追加 

```~/.bash_profile 
/Library/Developer/CommandLineTools/usr/bin
```
  - ~/.bach_profileにCUDAのパスの追加

```~/.bash_profile
export PATH=/Developer/NVIDIA/CUDA-10.0/bin${PATH:+:${PATH}}
export DYLD_LIBRARY_PATH=/Developer/NVIDIA/CUDA-10.0/lib\
                         ${DYLD_LIBRARY_PATH:+:${DYLD_LIBRARY_PATH}}
```
 
- [インストールガイド](https://docs.nvidia.com/cuda/cuda-installation-guide-mac-os-x/index.html)

## cuDNNのインストール
- [ダウンロードサイト](https://developer.nvidia.com/cudnn)
    - CUDA１０ を選んで cuDNN v7.3.1 for Mac OSXをダウンロードフォルダにDL
    - ダウンロードしたら解凍 ~/Downloads/cuda ができる。
    - ターミナル起動してDownloadフォルダーに移動　``` cd ~/Downloads```
    - ターミナルで以下を実行

``` command.
$ sudo cp cuda/include/cudnn.h /usr/local/cuda/include
$ sudo cp cuda/lib/libcudnn* /usr/local/cuda/lib
$ sudo chmod a+r /usr/local/cuda/include/cudnn.h /usr/local/cuda/lib/libcudnn*
```

- ~/.bash_profileに以下を追加

```  export  DYLD_LIBRARY_PATH=/usr/local/cuda/lib:$DYLD_LIBRARY_PATH
 ```

- 動作確認
- ```echo -e '#include"cudnn.h"\n void main(){}' | nvcc -x c - -o /dev/null -I/usr/local/cuda/include -L/usr/local/cuda/lib -lcudnn ```
- WARNINGがあるが，動作している模様

```echo.txt
MacBook-Air:~ txxr$ echo -e '#include"cudnn.h"\n void main(){}' | nvcc -x c - -o /dev/null -I/usr/local/cuda/include -L/usr/local/cuda/lib -lcudnn
/var/folders/jh/8nk3p3dn2vx6b_db0ggc4b3r0000gn/T//tmpxft_0000107d_00000000-0_stdin:2:2: warning: 
      return type of 'main' is not 'int' [-Wmain-return-type]
 void main(){}
 ^
/var/folders/jh/8nk3p3dn2vx6b_db0ggc4b3r0000gn/T//tmpxft_0000107d_00000000-0_stdin:2:2: note: 
      change return type to 'int'
 void main(){}
 ^~~~
 int
1 warning generated.
ld: warning: URGENT: building for OSX, but linking against dylib (/System/Library/Frameworks//CoreFoundation.framework/CoreFoundation) built for (unknown). Note: This will be an error in the future.
ld: warning: URGENT: building for OSX, but linking against dylib (/usr/lib/libc++.dylib) built for (unknown). Note: This will be an error in the future.
ld: warning: URGENT: building for OSX, but linking against dylib (/usr/lib/libSystem.dylib) built for (unknown). Note: This will be an error in the future.
MacBook-Air:~ txxr$ 

```

- [インストールガイド](https://docs.nvidia.com/deeplearning/sdk/cudnn-install/index.html)
Pythonで株価を機械学習モデルに投入して、グラフに表示してみる

# はじめに
最近の個人的なブームはブロックチェーン・仮想通貨です。
それに伴って（？）仮想通貨など考えるならば、株価を、機械学習で予測することのほうが良いのではないかと思い立った次第です。

とりあえず、データを集めて、それを機械学習のライブラリ（scikit-learnのSVM）に投入してモデルごとの結果を図示化を行いました。

厳密にいえば、今回のものは将来予測ではなく最適収斂モデルなので微妙に違うところもありますが。。

しかしこれは第一弾で、投入データを増やす、モデルをKeras,Tensorflow,chainerなどのやつにする、海外の文献をあさるなど今後に取りうる方針はいろいろありますが、まずはメモ書き残し用途です。
# 結果
![SVM.png](https://qiita-image-store.s3.amazonaws.com/0/190712/979ae13e-9614-dead-af81-f92a780517b7.png)

# ソースコード
```python:ML_SVM.py
import csv
import numpy as np
from sklearn.svm import SVR
import matplotlib.pyplot as plt

dates = []
prices = []

def get_data(filename):
    with open(filename, 'r') as csvfile:
        csvFileReader = csv.reader(csvfile)
        next(csvFileReader)
        next(csvFileReader)
        for row in csvFileReader:
            dates.append(int(row[0].split('-')[2]))
            prices.append(float(row[1]))
    return

def predict_price(dates, prices, x):
    dates = np.reshape(dates, (len(dates), 1))

    svr_lin = SVR(kernel='linear', C=1e3)
    svr_poly = SVR(kernel='poly', C=1e3, degree=2)
    svr_rbf = SVR(kernel='rbf', C=1e3, gamma=0.1)
    svr_lin.fit(dates, prices)
    svr_poly.fit(dates, prices)
    svr_rbf.fit(dates, prices)

    plt.scatter(dates, prices, color='black', label='Data')
    plt.plot(dates, svr_rbf.predict(dates), color='red', label='RBF model')
    plt.plot(dates, svr_lin.predict(dates), color='green',
             label='Linear model')
    plt.plot(dates, svr_poly.predict(dates), color='blue',
             label='Polynomial model')
    plt.xlabel('Date')
    plt.ylabel('Price')
    plt.title('Support Vector Regression')
    plt.legend()
    plt.show()

    return svr_rbf.predict(x)[0], svr_lin.predict(x)[0], svr_poly.predict(x)[0]


get_data('2181_2018_10.csv')
predicted_price = predict_price(dates, prices, 29)
```
# 元データの取得サイト
データは以下のサイトよりCSV形式で配布されています
１CSV＝１銘柄、１年間分。にて取得可。
[株式投資メモ](https://kabuoji3.com/stock/)
![stock_investment_site.png](https://qiita-image-store.s3.amazonaws.com/0/190712/724baaae-fdbb-f353-70ab-ba40f6ca820c.png)

# 処理の流れ

- 株価のCSVファイルを用意
- csvファイルの月初から月末までの29日間の株価を取得、
- モデルにfitさせる
- 結果をmatplotlibにて表示する

# ライブラリ
scikit-learnを使用。
Pythonにてメジャーな機械学習ライブラリ。
今回はscilit-learnの中でもSVMを使用。
SVMの中でも

- Polynomial
- Liner
- RBF
という3つの手法を選定。違いは[以下サイト](https://stats.stackexchange.com/questions/90736/the-difference-of-kernels-in-svm)ご参照のこと
結果によって、他のライブラリの使用も検討する。

## SVMってなによ。。
サポートベクターマシーン
概要は[以下サイト](http://www.sist.ac.jp/~kanakubo/research/neuro/supportvectormachine.html)様の記述を参考として。。。
サポートベクターマシン（SVM）は、1995年頃にAT&TのV.Vapnikが発表したパターン識別用の教師あり機械学習方法であり、局所解収束の問題が無い長所がある。
「マージン最大化」というアイデア等で汎化能力も高め、現在知られている方法としては、**最も優秀なパターン識別能力**を持つとされている。
...
**データを2つのグループに分類する問題には優れている**が、多クラスの分類にそのまま適用出来ず、計算量が多い、カーネル関数の選択の基準も無い等の課題
...
学習データによる識別線によって、多くの未学習データの判別が可能になる事を「汎化能力」という。**最大マージンの真ん中に引いた線が、最も汎化能力が高い事が期待**出来る。

# 感想
Liner,Polynomialは実用不可だな。
次はChart.jsやDjangoでwebアプリ化するもよし、
モデルor投入データを検討して、予測性能を向上させるもよし。
結構楽しみ。
２～３年目エンジニアがハッと気づいたこと(転職系)

#はじめに
私はタイトル通りの2~3年目のJavaエンジニアです。独自のフレームワークを2年以上使ってやってきました。今回、２～３年目の社会人で発作的に起こる「このままでよいんだろうか」病が起きて行った、
1. 転職活動
2. 自己分析
3. 転職相談（自社・他会社・勉強会メンバ）
4. 最後に
の流れをお話ししていければと思います。1.2順番間違っているようですが自分はこの流れでしてました。。。
これはただの雑記です。日記みたいなものです。

#突発的に訪れた危機感
社会人3年目ともなれば与えられたタスクは難なくこなし、非常に仕事ができる気になっているでしょう。
**俺はできるぞ！**それならば転職して給料増やしてもっと仕事楽しむぞと息巻いていました。そもそも今の仕事がつまらない。約2年同じ技術で同じ案件。もうマスターした。いざ技術がついたかと振り返ると**「あれ？私の技術力低すぎ」**状態です。目の前の簡単な仕事をこなすだけの機械になっていました。いざ周りを見てみると
* ある同期は役職の階級が私より1つ上。
* ある同期は技術力が私の2歩3歩（感覚で）上。
###この現場にいたらこのまま自分はエンジニアとしてはしんでしまう。
そう思ったら行動せざるを得ませんでした。

#転職活動開始
転職サイトのビズ〇ーチ、キャリ〇レ等に登録すると勝手にオファーメールなるものがやってきます。そのオファーメールに返事をするとカジュアル面談が行えます。カジュアル面談に行くとベンチャーベンチャーしている（意味不明）企業からは即内定を出していただけたり、就職活動を行った時のような工程を経て内定をいただくことができます。いくつか面接をし、落ちた会社もありましたが、内定を数社いただくことができました。
基本的に内定までの道のりは就職活動と同じととらえてよいでしょう。
自分の場合は、転職の動機として
1. 現状の技術に市場価値がなくもっとスキルを磨きたい
2. SESのためロールモデルがおらずモチベーションが上がらなかった

というのがあり、アウトプットが全くありませんでしたがポテンシャル採用という形で現年収の100万Upを提示していただくことができました。(もともとそんなにもらっていなかったのでやっと平均？くらいです。)
###自己分析
この業界今がバブルですよね。2020年に向けていろいろ動いています。求人倍率1.6倍ですって。ほぼ受かるんです。これを好機とみるか否かは人それぞれでしょうが。
私は実力で内定されたとは思えませんでした。SESで外に出てるのが常の私ですが、**ずっと同じところで2年同じ案件**で仕事をしていると技術の伸びはなくなってしまっていました。そもそもモチベーションが初めの半年で下がりきっていました。SESでよくある経歴書を書くと何とも薄っぺらいものです。そしてスキルを書くと業務内容とその周辺技術しか得られていませんでした。他の所へ行けば力をつけられるのか、色々考えましたが、一人の頭で考えてもわかりませんでした。


##転職相談
わからなければ他人に聞けばいい。先人の知恵を借りようと。同じ会社の主任・課長。他会社の方々。からお話し聞いて得たのが
1. 現状での不満点を挙げられないならどこへ行っても一緒(次の会社でも同じようにすぐ辞めてしまう)
2. 現状の会社で変えられないかを考える。(部署移動等)
3. 今、年収100万上がるという言葉に踊らされている
ということでした。
1があって2があるのですが、会社はただ変えればよいというわけではありません。わかってはいましたが、内定がポンポン出る現状に自分は酔っていたのでしょう。自分は価値ある人間だどこへ行ってもやっていける。そう思ってしまっていました。いざ内定いただいた会社さんたちを見ると今の会社とかわらないかむしろ不安が残る会社さんでした。（内定承諾書すぐ出さなくてよかった）
結果として、自分は残留し今の案件からもっと厳しいところへ行けることになりました。
最高です。成長のチャンスです。（M）

#最後に
私と同じ2~3年目エンジニアさんに送りたいのですが、
不満を持つのはいいことです。
行動するのもいいことです。
行動をより良いものにするためには行動の原因を解決すべきです。

私は、今回の件で不満の解消のための行動が転職活動だけでないとわかりました。
人間関係うまくいっている。（職場環境）
自己成長できる。(成長環境)
上記二つがあれば自分は満足なんだとわかりました。
もちろんお給金は多いに越したことはありませんが！

転職活動の前に、自分の不満を言語化し、現職で何とかできないかを考えるのもありだと思います。
力があってコミュニケーションとれるならガンガン次の会社行って成果出して次へ！を繰り返すのもいいと思います。お給料は確実に上がります。
私の場合はまず力、技術をもっと伸ばすことに集中しようと決断しました。力つけてお給金上がらないなら次へ行くしかありませんが。。。

転職系のイベント（LTとか）に行くと非常に良い話が聞けますよ。
皆様のエンジニアライフがより良いことを願っております。
RubyXLで日付をchange_contentsしても適用されない問題

# 概要
RubyXLでCellをchange_contentsする際に、日付を入れても日付として認識されず、フォーマットが適用されない問題にぶち当たった。

```ruby
cell.change_contents(Time.zone.now) # これだとダメ
```

# 原因
Time.zone.nowだとダメな理由はものすごいシンプルで、change_contentsの挙動がDateかDateTimeだと変わっているからだった。

```lib/rubyXL/cell.rb
# File 'lib/rubyXL/cell.rb', line 231

def change_contents(data, formula=nil)
  validate_worksheet
  @datatype='str'
  if data.is_a?(Date) || data.is_a?(DateTime)
    data = @workbook.date_to_num(data)
  end
  if (data.is_a?Integer) || (data.is_a?Float)
    @datatype = ''
  end
  @value=data
  @formula=formula
end
```

ref) [Method: RubyXL::Cell#change_contents](https://www.rubydoc.info/gems/rubyXL/1.1.12/RubyXL%2FCell:change_contents)

# 解決方法
Date.currentを使えば解決！

```ruby
cell.change_contents(Time.zone.now) # これだとダメ
cell.change_contents(Date.current)  # これだと大丈夫
```