OmniAICreator/Qiita-1.07M huggingface dataset:
ArchLinuxを仮想環境で動かす時のエラーメモ

virtualbox(仮想環境)でarch linux(OS)を動かす
参考文献
virtual Boxにインストール
https://qiita.com/tomi_sheep/items/ddd9c7b0f0f7c774a222
arch linuxにGUIを導入
https://qiita.com/okash1n/items/8929a67a3cd7223fb90c
#環境
windows10 64bit



#環境構築手順
①vertitual boxのインストール
http://www.oracle.com/technetwork/server-storage/virtualbox/downloads/index.html?ssSourceSiteId=otnjp

※保存しないでシャットダウンするとデータ消える
①仮想マシンの状態を保存
⇒シャットダウンしなければ状態を保存できる
②スナップショットを保存
⇒シャットダウンした時にデータが消えるので、新しい更新を保存できる

②VMでarch linux 64bit版が選択出来ない
BIOSがConfiguration Intel Virtual IntefaceがDisableに
起動時にF2を連打⇒Configuration⇒Configuration Intel Virtual Intefaceをenableにする


③キーボードの英語表記
$ localectl set-keymap --no-convert jp106
https://qiita.com/eup42/items/ea927f83e52f8d504427

⑤vimとgitのインストール
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/b59bcbf9-5c10-6faa-0450-f88b91e0b635.png)

https://qiita.com/ryo-or/items/b1cd2c49f8f89084180e

⑤mirrorlistの更新
手動で更新
https://turtlechan.hatenablog.com/entry/2019/08/25/194849
vimで更新
/Japan(japanを検索)
2dd(2行の切り取り)
gg(先頭へ)
p(コピペ)
https://qiita.com/rytmrt/items/527e3599f019a3f2aeaf



④yaourtのインストールエラー
$pacman -S yaourt
target not found
下記のリンクを参照しyaourtをダウンロードして解凍し実行
https://qiita.com/katabame/items/6d94745e8724fd1003f4

⑥yayをインストールする時のerror
makepkg -si
rootではできないと言われた

userを変更して再度挑戦
$git clone https://aur.archlinux.org/yay.git
$cd yay
$makepkg -si
ここでerror

[~/aur/package-query]$ makepkg -si
 ERROR: Cannot find the strip binary required for object file stripping.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/487956a7-8d47-1ffe-175c-5ee4b0f4f449.png)

https://haiju.hatenablog.com/entry/2018/12/14/131830


④コピペが出来ない
https://qiita.com/morinco/items/ab264632cca07607ed99
SQLServerのSQL備忘録

SQLServerのSQLの備忘録を記載していく。

## DDL
#### INDEXの作成、削除
```sql
create index INDEX_NAME on TABLE_NAME (COLUMN1, COLUMN2)
drop index INDEX_NAME on TABLE_NAME
```

#### スキーマ作成
```sql
create schema SCHEMA_NAME
```

#### 指定テーブルのINDEX取得
```sql
select
  o.name as table_name
  , i.name as index_name
  , c.name as index_column
  , k.keyno as index_order 
from
  sysindexes i
  , sysindexkeys k
  , syscolumns c
  , sysobjects o 
where
  o.id = c.id 
  and k.id = i.id 
  and c.id = k.id 
  and k.indid = i.indid 
  and k.colid = c.colid 
  and o.name = 'TABLE_NAME' 
  and o.xtype = 'U' 
order by
  o.name
  , i.name
  , k.keyno
```

## ローカルDB
#### インスタンス名の特定
```:cmd
sqllocaldb info
```

#### SSMSで指定するサーバ名
`(local)\インスタンス名`

## T-SQL
```sql
-- 変数定義
declare @NUM decimal

-- 変数に値を設定
set @NUM = @NUM + 1

-- 変数にSelectの結果を設定
select @NUM = max(COLUMN_NAME) from TABLE_NAME

-- ループ
while @num < 100
begin
  -- 処理
end
```

#### 大量の複数条件の検索を高速化
このSQLを1回で実行する（カンマで区切らないこと）

```sql
declare @temp table (c1 varchar(1), c2 int)
insert into @temp (c1, c2) values ('1', 10), ('3', 12), ('4', 11), ('1', 17), ('5', 10)
select a.* from Test a, @temp b where a.c1 = b.c1 and a.c2 = b.c2
```

## BCP
```:cmd
# リモートDBにインポート
bcp TABLE_NAME in TSV_FILE_NAME -s HOST_NAME -d DATABASE_NAME -U USER_NAME -q -c

# ローカルDBにインポート
bcp TABLE_NAME in TSV_FILE_NAME -S "(localdb)\INSTANCE_NAME" -d DATABASE_NAME -T -q -c 

# BCPの書式ファイル生成
bcp TABLE_NAME format nul -S "(localdb)\INSTANCE_NAME" -d DATABASE_NAME -T –n -f FORMAT_FILE_NAME 

# CSVのインポート
# 書式ファイルを修正してCSVフォーマットをインポートできるようにする。
bcp TABLE_NAME in CSV_FILE_NAME -S "(localdb)\INSTANCE_NAME" -d DATABASE_NAME -T –f FORMAT_FILE_NAME
```

## その他
#### identity型カラムに値を指定してInsertする場合
```sql
set identity_insert TABLE_NAME on
```

#### 行番号の取得
```sql
select row_number() over(order by COLUMN_NAME asc) from TABLE_NAME
```

#### ランダム値の取得
```sql
-- 6桁のランダム整数 ※999999が6桁
select convert(int, (1 + (rand(convert(int, convert(varbinary(4), newid()))) * (999999 - 1 + 1))))
```

#### 実行計画の取得
```sql
SET SHOWPLAN_ALL ON
select * from test -- 任意のSelect文
```

#### 日付フォーマット
```sql
FORMAT(日付カラム, 'yyyy/MM/dd HH:mm:ss')
```
[CircleCI] ローカルディレクトリをコンテナ上にマウントして実行

```bash
$ circleci build -v ローカルディレクトリのパス:コンテナ上のディレクトリのパス
$ # 例 => circleci build -v ~/.ssh:/root/ssh
```

ローカル環境でCircleCIを実行する際、コンテナ上でgitアクセスがあるときに鍵がないよ〜と怒られたので。
（CircleCIサーバでは設定項目として鍵ファイルを指定することができる）

### 注意①
コンテナ上のディレクトリのパスは絶対パスで指定する。
相対パスを指定すると怒られる。

### 注意②
上記例のようにローカルの `~/.ssh` をまるごとマウントすると、不要な他のファイルがマウントされて悪さしたりとかあるので、専用のディレクトリを作ってマウントしたほうがいいと思います。
LinuxでJDBCを使う

JDBCはMySQLをJAvA経由で操作するためのライブラリです。
実務では使わないとかなんとか聞いたのですが、せっかく導入したので記しておきます。

#動作環境

CentOS 7
JDK 1.8.0_171
MySQL 5.7



#JDBCの導入
サイトからJDBCドライバーを取ってきます。

```
wget http://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-5.1.30.tar.gz -O mysql-connector.tar.gz 
```
解凍

```
tar -xvzf mysql-connector.tar.gz
```

ドライバーのあるjarファイルをプログラムと同階層に持ってきます。(classpathの指定が面倒くさいので)

```
cp mysql-connector-java-5.1.30/mysql-connector-java-5.1.30-bin.jar mysql-connector.jar
```

指定するクラスパスを記載の上、プログラムをコンパイルすればおっけーです。
ここで、test.javaはJDBCを利用するプログラムです.
```
javac -classpath mysql-connector.jar test.java
java -classpath mysql-connector.jar: test
```
※Windowsでは、javaコマンド実行時のクラスパスを指定する際、jarファイルの後にセミコロン ;をつけますが、Linuxではコロン :をつけることに注意
RDS スナップショットからDBを復元する

## スナップショットからDBを復元する

### 1. RDSにアクセスし、復元したいバージョンのスナップショットを選択する
<img width="1608" alt="RDS_·_AWS_Console.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168550/3a593ad2-99e7-db63-e0f3-18518cca7ba6.png">

復元ボタンをクリック
<img width="1308" alt="スクリーンショット_2019_08_26_15_47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168550/cef8f2d1-33d8-56e0-a270-ee6d1d1bd77c.png">

### 2. 復元するスナップショットのインスタンスを設定する
<img width="914" alt="RDS_·_AWS_Console.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168550/e5a0e65e-2e64-16c2-30e0-bc6161450c46.png">

<img width="827" alt="RDS_·_AWS_Console.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168550/39871da3-d47e-d3cb-6c42-4e22b3232841.png">

インスタンスの復元をクリックすれば、スナップショットからDBを復元することができる。
JavaScriptでカリー化(currying)するとちょっとうれしい例


（「カリー化」については → https://ja.wikipedia.org/wiki/%E3%82%AB%E3%83%AA%E3%83%BC%E5%8C%96）

---

JSは関数型言語というわけではないので、カリー化により可読性が落ちる場合もありやりすぎは禁物ですが、もちろんうれしいときもあります。

たとえば、 配列の `map` を使って

```ts
const array = [1, 2, 3, 4, 5];

const squaredArray = array.map(x => Math.pow(x, 2));  // [1, 4, 9, 16, 25]
const pow3Array = array.map(x => Math.pow(x, 3));  // [1, 8, 27, 64, 125]
const pow4Array = array.map(x => Math.pow(x, 4));  // [1, 16, 81, 256, 625]
...
```

のような要素ごとにn乗する処理を書くとき、

```ts
const powTo = (exponents: number) => (base: number) =>
    Math.pow(base, exponents);
```

という `Math.pow` をカリー化した関数を書いておけば、同じ処理を

```ts
const array = [1, 2, 3, 4, 5];

const squaredArray = array.map(powTo(2));  // [1, 4, 9, 16, 25]
const pow3Array = array.map(powTo(3));  // [1, 8, 27, 64, 125]
const pow4Array = array.map(powTo(4));  // [1, 16, 81, 256, 625]
...
```

のように簡潔に書くことができます。
 `array.map(powTo(2))` は `array.map(x => powTo(2)(x))` と同じ意味です。（一般に `x => f(x)` は `f` に置き換えることができます）

---

カリー化の主なうれしいポイントは

* 短く書けてミスを減らせること
* 部分適用した関数を作りやすくなる（複数引数関数の一部の引数をあらかじめ適用することで同じ計算の繰り返しを省ける場合もある）

だと思います。

---

# 2019/8/30 追記

他にもカリー化するとちょっと嬉しい例があったのを思い出したので追記します。

ある数 `x` が与えられたときに、それを `min` 以上 `max` 以下の範囲に収める（`x` が `min` より小さいならば `min` に切り上げし、 `x` が `max` より大きいならば `max` に切り下げる） `clamp` という関数を作るとします。
通常の実装だと以下のようになります。

```ts
const clamp = (x: number, min: number, max: number) =>
  x < min ? min : max < x ? max : x

const clamped = clamp(-10, -5, 5)  // -5
```

この関数は呼び出し側の `clamp(-10, -5, 5)` の部分だけ見てもどれが `x`，`min`，`max` なのかは見た目では分かりません（たとえば `(min, max, x)` の順番かもしれない）。

しかし、以下のカリー化した関数ならば意味もより分かりやすくなります。

```ts
const clamp = (min: number, max: number) => (x: number) =>
  x < min ? min : max < x ? max : x

const clamped = clamp(-5, 5)(-10)  // -5
```

先に `clamp(-5, 5)` である数`x`を受け取りそれを`[-5, 5]`の範囲に収める関数を作り、それに `-10` を渡しています。
この書き方ならばどれが `min` と `max` なのか一目瞭然です。

この例は引数の数の違いに頼っていたり特殊な例ですが、こういう使い方もあるかなと思ったので紹介しました。
【これさえ読めばOK】MacでPythonを使って開発するための準備

## tl;dr

MacでPythonを使って開発するための準備をしたのでまとめました。

## 用意するもの・環境

- macOS Mojave 10.14.6
- Python 3.7(ANACONDA3)
- PyCharm 2019.2

## エディタ・IDE

Pythonの開発エディタ(というかIDE)にはPyCharmが一番便利です。
https://www.jetbrains.com/pycharm/

有料バージョンもありますが、無料バージョンで特に問題なく使えます。

こちらの記事が参考になります。

最強のPython統合開発環境PyCharm
https://qiita.com/yamionp/items/f88d50da8d6b548fc44c

PyCharmで開発する手順メモ(Git, Virtualenv)
https://nwpct1.hatenablog.com/entry/pycharm-development


## Python

Pythonのメジャーバージョンには2と3があります。
ですが、これからプログラムを作るのであれば、バージョン3をインストールしましょう。


## Anaconda

Python単体をインストールしてもいいのですが、Pythonに加えていろいろなパッケージ(ライブラリ)を同梱したAnacondaというディストリビューションを使うのが便利です。

Anaconda Distribution
https://www.anaconda.com/distribution/

こちらの記事が参考になります。

Anaconda で Python 環境をインストールする
https://qiita.com/t2y/items/2a3eb58103e85d8064b6

## PyCharmのプロジェクト作成

PyCharmには詳しいヘルプが用意されていて、図解入りで開設されています。

ステップ 1. 最初のPythonプロジェクトの作成と実行
https://pleiades.io/help/pycharm/creating-and-running-your-first-python-project.html

![Create Project 2019-08-26 15-15-32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/389719/20679b85-4d64-028a-9122-97eda0ae5e3d.png)

こちらに書かれている通りPythonではvirtualenv(仮想環境)を作るのが良いとされています。
仮想環境を作るとPythonやパッケージのバージョンを固定することができます。


### 仮想環境を作らない場合

仮想環境を作らない場合、Existing interpreterでanacondaを選ぶのが一番簡単です。

![Create Project 2019-08-26 14-54-36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/389719/7cfe79d4-821e-ed6a-006b-c50ecb0ab4c9.png)

個人的には仮想環境を作らなくても問題を感じたことはありません。

## 役に立った本

独学プログラマー Python言語の基本から仕事のやり方まで
https://amzn.to/2zpICwA

めっちゃ売れているプログラム学習本。
就職のアドバイスとか載っていておもしろかったです。


### 本はメルカリで買うと安くで手に入る

本を買うときはメルカリを使うと安くで手に入ります。

わたし自身、メルカリをよく使っていますが新品みたいな本が届いてびっくりすることがよくあります。

どうしても新品でないといやだ、という方以外はメルカリをうまく使ってください。

メルカリを始めるときは招待コードは　UFJZQE　を入力すると、1ポイント=1円で使えるポイントが300ポイントもらえますのでお得です。

メルカリ
https://www.mercari.com/jp/


## 役に立ったオンライン講座

Udemyの講座は役に立ちます。
普段はいいお値段しますがよくセールをやっているのでセール中に買うのが良いかと。

世界最大級のオンライン学習プラットフォーム <a href='https://px.a8.net/svt/ejp?a8mat=356L0S+MMHRM+3L4M+5YZ77' target='_blank'>Udemy</a> 


<a href="https://px.a8.net/svt/ejp?a8mat=356L0S+MMHRM+3L4M+BW8O2&a8ejpredirect=https%3A%2F%2Fwww.udemy.com%2Fcourse%2Fpython-beginner%2F" target="_blank" rel="nofollow">現役シリコンバレーエンジニアが教えるPython 3 入門 + 応用 +アメリカのシリコンバレー流コードスタイル</a>
<img border="0" width="1" height="1" src="https://www17.a8.net/0.gif?a8mat=356L0S+MMHRM+3L4M+BW8O2" alt="">

## 参考サイト

Udemyの上記講座をどうやって勉強したらいいのかをまとめてあります。

Udemyのシリコンバレー発講座でPythonを学び、月10万円を稼げるようになるまで
https://gadgeterkun.hatenablog.com/entry/udemy-python/1


Pythonの書き方全般をまとめてあります。

Pythonプログラムをしっかりと書く虎の巻
https://qiita.com/FukuharaYohei/items/6f8a30aef22c1f78a384


最強のPython統合開発環境PyCharm
https://qiita.com/yamionp/items/f88d50da8d6b548fc44c
datetimepipckerでminDateを設定しているとdefaultDateが効かない

掲題の通りで
datetimepickerを使っていて、`minDate`を使っていると`defaultDate`を設定してもなぜか`minDate`の値が表示される
(どうでもいいけどdatetimepickerの情報を探してるのにdatepickerの情報がやたらと出てきたりして混乱しますね…笑）

## 対応
`useCurrent: false`を設定する

たぶんこれかなと思いました
https://github.com/Eonasdan/bootstrap-datetimepicker/blob/master/src/js/bootstrap-datetimepicker.js#L1749
自分の場合、minDateが現在時刻の30分後とかだったので、デフォルトの`useCurrent: true`の状態では`minDate`が上書きをしにくるようです
それが`defaultDate`より優先度高そうですね
というわけで`useCurrent: false`にしたら無事`defaultDate`が反映されました

めでたしめでたし
plunkerでlua その2

#概要

plunkerでluaやってみた。

#参考にしたページ

https://qiita.com/peg/items/844149fa832d0b67c3b0

#サンプルコード

```
<!DOCTYPE html>
<html>
  <head>
    <link rel="stylesheet" href="style.css">
    <script src="script.js"></script>
    <script src="https://fengari.io/static/js/fengari-web.js?v=1" type="text/javascript"></script>
  </head>
  <body>
    <h1>Hello Plunker!</h1>
    <script type="application/lua" async>
      local js = require "js"
      local window = js.global
      function CreateRandStr(length)
        local length = length or 0
        if length <= 0 then
          return nil
        end
        local random_strs = {}
        if length > 0 then
          math.randomseed(os.time())
          for i= 1, length do 
            local a = math.random(97, 122) 
            local c = math.random(65, 90)  
            local i = math.random(48, 57) 
            local w = math.random(1, 3)    
            if w == 1 then table.insert(random_strs, string.char(a)) end
            if w == 2 then table.insert(random_strs, string.char(c)) end
            if w == 3 then table.insert(random_strs, string.char(i)) end
          end
        end
        return table.concat(random_strs, "")
      end
      window:alert(CreateRandStr(10))
    </script>
  </body>
</html>

```

#成果物

https://embed.plnkr.co/JsRXVKKnnEqf99yN1Tv0/

以上。
【情報求む】VScodeで特定プロジェクトを開くと拡張機能が死ぬ

# VScodeで特定のプロジェクトを開くと拡張機能が死ぬ

##### 死んだ機能
・全て
例） Git, ブックマーク, ジャンプ系, 後入れ拡張全て, デバッグ系

##### 解決方法
branchを変えて再起動

## 原因
この原因がわからないののが問題
「VScode 拡張機能 効かない」などの文言で検索しても何も出ない
設定ファイルのワークスペースも特に固有の設定をしているわけでもない。

#### gitが関係している？？
今回はgitのbranchを変更したことで問題が解決した。
もしかするとGitの何かが関係しているのかもしれない。

情報求む！！
x86とか32bitCPUとかISAとかAMD64とかx86_64とかについて調べてみた

# はじめに
CPUの用語についてのメモ

# x86CPU
* **Intel 8086、およびその後方互換性を持つマイクロプロセッサの命令セットアーキテクチャの総称**。16ビットの8086で登場し、32ビット拡張の80386（後にIA-32と命名）、64ビット拡張のx64、広義には更にAMDなどの互換プロセッサを含む。
* 8086を動かすための命令の集合を元に、後継製品に実装された命令群を足し合わせたものをx86命令セットという。

# 32ビットCPU
* 32ビットサイズのレジスタ、アドレスバス、データバスを持つCPUのこと
* 64ビットサイズの場合64ビットCPU
* 32ビットOSとは32ビットCPUの命令セットを用いたOS

# インストラクションセット(ISA)とは
* 386のCore2も同じ機械語の命令を実行できるように複数のCPUが同じように解釈できる機械語体系
* IA-32など

# IA-32
* **32ビットCPUが実装**しているISAアーキテクチャ、
* **IA-32に属する古いCPUの命令がIA-32に属する新しいCPUでも動かせるということ**、逆はできるとは限らない

# AMD
* CPUのメーカーは大きく分けてAMDとIntelの2メーカー、エーエムディーが正しい発音
* はじめはIntelのセカンドソース、1985年以降はセカンドソース契約を行われず独自にCPUを開発

## AMD64(IA-32の64ビット拡張)
* AMDが**x86系の64ビット拡張をIntelよりも先に販売**。AMDが策定したx86系の64ビットISAアーキテクチャのこと、Athlon64やPhenomやOpteronなど
* IntelはAMD64とほぼ同じアーキテクチャを**Intel64**としてCPUに取り込み

# x86-64
* AMD64とIntel64をまとめて呼ぶとき
* WindowsではAMD64対応アーキテクチャのことを**x64**と呼ぶ

# IA-64
IntelとHPが開発したIA-64ISAアーキテクチャ。IA-32との互換性は全くない。ItaniumというCPUだけが実装


# 参考
[ふつうのコンパイラをつくろう](https://www.amazon.co.jp/%E3%81%B5%E3%81%A4%E3%81%86%E3%81%AE%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%A9%E3%82%92%E3%81%A4%E3%81%8F%E3%82%8D%E3%81%86-%E9%9D%92%E6%9C%A8-%E5%B3%B0%E9%83%8E/dp/4797337958)

[AMDの成り立ち](https://www.dospara.co.jp/5info/cts_str_parts_amd)
漢字埋めパズル　の困りごとと対策案

漢字埋めパズル
https://play.google.com/store/apps/details?id=jp.blogspot.vettel4renpa.kanjiumepuzzle&hl=ja

620問ある。

全部達成すると、意見を求められ、上級モードができるようになる。

上級モードは難易度によって、低、中、高の３段階がある。



# 困りごと１

文字が、広告などの下に潜り込んで、ゆびでとりだそうとしても取り出せない。

### 対策案
いちどアプリを終了してその画面を最初からやり直す。

# 困りごと２

全部文字を入れたのに、判定に進まない。

間違いの表示にならない。

いれかえても、間違いの表示がでない。

類似な事象で、間違いが１箇所だけの表示が出た。

放棄裁量　地下
　約　金相学
中型車　常　交
　企　有効落差
卒業式　果　点
　年　意　企
少金型企業年金

「少」だけ赤、他は黒。
「少」と「有」を入れ替えると両方赤。
入れ替えると「少」だけ赤。

### 対策案
いちどアプリを終了してその画面を最初からやり直す。

# 不具合３

>クリア！！
おめでとう
ホームに戻る　次の問題へ

「次の問題へ」を選ぶと

>再挑戦しますか？
OK
キャンセル
上級モード

「上級モード」を選ぶと

>難易度
低
中
高

「低」を選ぶと「クリア！！　おめでとう」の画面に戻る。
「ホームに戻る」を押しても画面が切り替わらない。

###対策案
いちどアプリを終了してその画面を最初からやり直す。


#考察

困りごとの原因のうち、１については、ペンを利用すれば解消するかもしれない。

困りごとの２と３は、ゲームに限らずアプリにありがちな課題。

### 配列データの書き間違い

### データ領域外への書き込み

### 飛び先の間違い

### 困りごとの再現性が確認できない

困りごと２、困りごと３は700回実行したうちのそれぞれ１回出現しただけ。
再現するかどうかを確かめれていない。

# 対策

発行元に問い合わせる。

androidの模擬環境(simulator)上で実施してみて、エラー、警告を確認する。

# 文書履歴(document hisotry)
ver. 0.01 初稿 20190826 昼
ver. 0.02 １箇所だけ赤事例追記 20190826 午後
ver. 0.03 URL追記　20230228

### 最後までおよみいただきありがとうございました。

いいね　💚、フォローをお願いします。

####  Thank you very much for reading to the last sentence.

Please press the like icon 💚　and follow me for your happy life.
windows10でmacと同じ英数変換設定

#目次#
- mac⇔windows　いずれでもプログラミングする必要性がある方へ

- 英数入力の切り替え
  - スペース横の「無変換」「変換」キー
- MicrosoftIMEの場合

- 基本的に・・・


##mac⇔windows　いずれでもプログラミングする必要性がある方へ##


MacのPCはあの薄さと軽さでありながら、高い性能を持っています。
様々なショートカット、
わかりやすいGUIなどから、プログラミングやデザインには非常に向いている選択肢です。


ただWebデザイナー系の方でもなければ、まだまだ企業でMacを指定している日本企業は少ないです。

自宅はMacのPC、職場はWindowsPCというパターンは非常に多いのではないでしょうか？

##英数入力の切り替え
 スペース横の「無変換」「変換」キー

ちなみに私がWindows10とMacのPCを行き来するときに一番、困るのは**キータイプ****です。

Mac　→　スペースキーの右隣に英数、左隣に日本語入力

両指の親指を利用

Windows　→　Escキーのすぐ下に半角/全角/漢字切替キー

右手の小指を利用


この違いがあるだけで日本語入力が手間に感じてしまいます。

そこで、Macの変換キーにWindowsの設定を合わせてしまいましょう。


##MicrosoftIMEの場合

1.　まずは設定画面へ
タスクバーのIMEを右クリックし、プロパティを選択。
<img width="228" alt="IME設定画面‗プロパティ.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452550/12274c90-aa59-7ddb-a958-209b5324e013.png">

2. 詳細設定をクリック
<img width="323" alt="IME_プロパティ_詳細設定.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452550/3a821c45-27fd-bf8b-d585-cd8f0ef0933d.png">

3. 編集操作の変更をクリック
<img width="359" alt="IME_プロパティ_詳細設定_編集操作.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452550/870d61fc-0564-aaf3-0a21-3e7b1d0d46b7.png">

4. 定義を変更
→自分の持っているPCのスペースキーの両隣のキーを画像のように設定します。
IME-オフ：Macの「英数」キー
IME-オン：Macの「かな」キー

<img width="377" alt="IME_プロパティ_詳細設定_編集操作_定義.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452550/bfba92fc-3a42-2bfb-d3f6-b6b3427f2a7d.png">

5. あとは適用をクリックして、ユーザー定義を作成すればOK！


##基本的に
IMEが異なる場合でも、基本的には「IMEの詳細設定」→「キーの定義」→「スペース横のキーにIMEのオンオフを割り当て」で可能です。
Githubコマンドメモ

```git stash list``` 
スタッシュした一覧をみれる
```git stash apply stash@{0}``` 
stash@{0}を元に戻せる。
```git add  backend/docs/swagger.yml```
 backend/docs/swagger.ymlだけをADDしたい
```git reset HEAD```
addを全て取り消せる
```git log```
Git　のCommitの履歴一覧をみれる
```git revert```
Git Commit を取り消せる
webarenaでubuntu その34

#概要

webarenaでubuntu18.04やってみた。
apache2.4,php7.2やってみた。
rss2jsonやってみた。

#インストール

```
sudo apt-get install php7.2-xml
```

#php.iniの修正。

```
extension=sinplexml
```

#サンプルコード

```
<?php
	header("Access-Control-Allow-Origin: *");
	header("Content-Type:  application/json");
	$url = "http:///georss.php";
	$rss = new SimpleXMLElement($url, 0, true);
	$json = json_encode($rss);
	echo $json;
?>
```

#サンプルコード

```
d3.json('http:///rss2json.php', function(json) {
  var th = ['title', 'desc', 'link'];
  var table = d3.select("body").append("table").attr("border", "1")
table.append("thead").append("tr").selectAll("th").data(th).enter().append("th").text(function(d) {
    return d;
  });
  var w = json.item;
	for (var i = 0; i < w.length; i++)
	{
		var title = w[i].title;
		var desc = w[i].description;
		var link = w[i].link;
		var item = [title, desc, link];
    table.append("tbody").append("tr").selectAll("td").data(item).enter().append("td").text(function(d) {
      return d;
    });
	}
});
```

#成果物

http://embed.plnkr.co/gFwMs7nQXsvwCqBo9Ycr/

以上。
WordpressをAWSで格安実装

なんとなくAWSでWordpressを実装したい方へ。
→https://qiita.com/fao/items/de26b293be4a6795f0bf
タイトルは自分の一番困った部分にフォーカスして書いてあります。
しかし、内容はAWSでのWordpress実装です。
kubernetesでprivateなdocker hubからpullできるようにする

事前に`docker login`を実行して、`$HOME/.docker/config.json` にauthesが書き込まれていることを確認する。なければ、[macOSで~/.docker/config.jsonのauthesに認証文字列がない場合の対処](https://qiita.com/reoring/items/a1c229fd895f3c1b43bb)などを参考にしてみる。

```
kubectl create secret generic regcred \
    --from-file=.dockerconfigjson=$HOME/.docker/config.json \
    --type=kubernetes.io/dockerconfigjson
```

コマンド実行後、`secret/regcred created` が表示されればよい。

登録したら、下記のようなymlでsecretを指定できる。

```yml
pods/private-reg-pod.yaml 

apiVersion: v1
kind: Pod
metadata:
  name: private-reg
spec:
  containers:
  - name: private-reg-container
    image: <your-private-image>
  imagePullSecrets:
  - name: regcred
```

## 参考

* [Pull an Image from a Private Registry - Kubernetes](https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/)
Pythonでスピアマンの順位相関分析をする

#スピアマンの順位相関係数とは
2変数間に、どの程度、順位づけの直線関係があるかを調べる際に使う分析手段がスピアマンの順位相関です。
データが**順位尺度のとき（順位しか付けられないとき）に使用すべき手法**です。
式は以下の通りです。

$ \large \rho = 1 - \frac{6 \sum_{i=1}^{N} D^2}{N(N^2 -1)}$   
N : データの数

例として10人の学生の数学と英語の順位を次の表に表します([スピアマンの順位相関係数](http://www.tamagaki.com/math/Statistics609.html))。

| 学生 | 数学の順位 | 英語の順位 |
|---  |---|---|
| 1 | 6 | 10|
| 2 | 4 | 1 |
| 3 | 5 | 4 |
| 4 | 10| 9 |
| 5 | 2 | 3 |
| 6 | 8 | 8 |
| 7 | 3 | 6 |
| 8 | 9 | 5 |
| 9 | 1 | 2 |
| 10| 7 | 7 |

こちらのスピアマン順位相関係数は0.672となり、強い相関関係があると言えます。
つまり、数学ができる人は英語もできる、という結果になったわけですね。

このスピアマン順位相関をPythonで書くと以下のようなコードになります。

```Spearman1.py

import numpy as np

math    = [6, 4, 5, 10, 2, 8, 3, 9, 1, 7]
english = [10, 1, 4, 9, 3, 8, 6, 5, 2, 7]

def spearman(math, english):
    math = np.array(math)
    english = np.array(english)
    N = len(math)

    return 1 - (6*sum((math -english)**2) / (N*(N**2 - 1)))
    
spearman(math ,english) #0.6727272727272727
```

scipy.stats.spearmanrを使う方が無難のようです。
やり方は以下の通りです。

```Spearman2.py

from scipy.stats import spearmanr

math    = [6, 4, 5, 10, 2, 8, 3, 9, 1, 7]
english = [10, 1, 4, 9, 3, 8, 6, 5, 2, 7]

correlation, pvalue = spearmanr(math, english)
print(correlation) #0.6727272727272726
```
Python楽でいいですね。

#参考
[スピアマンの順位相関係数](http://www.tamagaki.com/math/Statistics609.html)
[相関分析2](https://www.koka.ac.jp/morigiwa/sjs/les10802.htm)
[numpy.corrcoef](https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.corrcoef.html)
Centosにpython3.6+tesseractを入れて画像識別用の環境を作る

## Install python3.6
```sh
# install python36
yum -y install python36
cd /usr/bin/
ls -al python*

# 使いやすくリンクを作る
# ※既存の/usr/bin/pythonは触らないでください。
#   yumが使うのでpython3に差し替えたらエラーになったりします。
ln -s python3.6 py
```

## Install pip
```sh
# install pip
mkdir -p ~/work/install-python
cd ~/work/install-python
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
py get-pip.py
```

## Install tesseract
```sh
yum -y install epel-release
yum -y install tesseract

# install pytesseract
pip install pytesseract

pip install requests
pip install demjson
```
今日のまとめ　8/26(月)

①ビンゴゲーム(ドットインストール、オブジェクト指向組み換え無し)

感想
range関数やshuffle関数の概念は分かった。HTMLにPHP構文を組み込む際に記述したコロン構文も以前に勉強してたのですんなり理解出来た。
懸念点としては2つ

１つ目は自分の悪い癖である全てを理解しようとしたところ、あくまでも暗記より道具として関数やfor文などを使っていきたいので、概念を覚えて使える様にしておきたい、構文を忘れてもググれば出てくるので

２つ目は一つの動画に視聴時間を掛けすぎている件、理解を深めるにはある程度早めに形を作っておいて、そこから自分なりに色々とアレンジしていった方が効率が良いと思うので明日からは早めに形を作る→自分でアレンジする。これを徹底しておく事

ググった事
・range関数..数字やアルファベットを生成する
・array_slice..指定した配列から要素を取り出すことが出来る





$nums[][]
B: $nums[0] 1-15
I: $nums[1] 16-30
..
O: $nums[4]
上記の配列を以下の様に処理していく。

$nums[$i] $i * 15 + 1 〜 $i * 15 + 15

````
for($i = 0; $i< 5; $i ++){
````
B~Oまでの列をfor文で記述


```
col =range($i *15 + 1, $i *15 +15);
```
range関数で1から75まで数字を生成する。

全体像

```
<?php

$nums = []; //nums変数の初期化

for($i = 0; $i< 5; $i ++){
  $col =range($i *15+1, $i * 15+15);
  shuffle($col);
  $nums[$i] =array_slice($col,0,5);

}
$nums[2][2] ="FREE";
function h($s){
  return htmlspecialchars($s, ENT_QUOTES, 'UTF-8');
}
 ?>

<!DOCTYPE html>
  <html lang ="ja">
  <head>
    <meta charset="utf-8">
    <title>ビンゴシート</title>
    <link rel ="stylesheet" href ="styles.css">
  </head>
  <body>
    <div id="container">
      <table>
        <tr>
          <th>B</th><th>I</th><th>N</th><th>G</th><th>O</th>
        </tr>
        <?php for ($i =0; $i< 5; $i++): ?>
        <tr>
        <?php for ($j =0; $j< 5; $j++): ?>
          <td><?= h($nums[$j][$i]);?></td>
          <?php endfor; ?>
        </tr>
          <?php endfor; ?>
      </table>
    </div>
</body>
</html>


````


明日の課題
①オブジェクト指向を交えたビンゴゲームを作成
②懸念点の解消に努める
macOSで~/.docker/config.jsonのauthesに認証文字列がない場合の対処

```json
{
	"auths": {
		"https://index.docker.io/v1/": {}
	},
	"HttpHeaders": {
		"User-Agent": "Docker-Client/19.03.1 (darwin)"
	},
	"credsStore": "desktop",
	"experimental": "disabled",
	"stackOrchestrator": "swarm"
}
```

`~/.docker/config.json`がこんな内容になっていて、authesにauthがない時にkubernetesでprivateなDocker hubからイメージを取得しようとすると設定が作れなくて困りますね。これはおそらくDocker for Macを使っているときに発生します。

Docker for Macの設定画面を開きます。

<img width="338" alt="Screen Shot 2019-08-26 at 14.38.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7565/42937b4f-615d-cd6b-fd74-1086d326665e.png">

開いたら、 `Securely store Docker login in macOS keychain` のチェックを外します。

<img width="612" alt="Screen Shot 2019-08-26 at 14.39.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7565/22d8c724-f736-cf23-5e5b-c572b75a721d.png">

その後、`~/.docker/config.json` から、`credsStore`のキーを消して、

```json
{
	"auths": {
		"https://index.docker.io/v1/": {}
	},
	"HttpHeaders": {
		"User-Agent": "Docker-Client/19.03.1 (darwin)"
	},
	"experimental": "disabled",
	"stackOrchestrator": "swarm"
}
```

このようにしたら、 `docker login` コマンドでログインすると、

```json
{
	"auths": {
		"https://index.docker.io/v1/": {
			"auth": "ここにはいる"
		}
	},
	"HttpHeaders": {
		"User-Agent": "Docker-Client/19.03.1 (darwin)"
	},
	"experimental": "disabled",
	"stackOrchestrator": "swarm"
}
```

この様になります。これでおっけー。
SSHのパスワード認証を無効化しみ機密キーでログイン

## やりたい事
レンタルサーバーを使っていると、攻撃されることがよくあり
SSHパスワード認証を無効化して機密キーだけでログインできるようにしたい。

## 注意点
何かあって接続設定がうまくいかない場合があるかも知れないため
セッションを１つぐらい残しておくこと

## 手順
1. rsaキーを生成する
2. 生成した公開キー、機密キーを取って置く
3. 生成した公開キーを認証済みキーファイルに書き込む
4. sshd_configファイルを編集し、キー認証を有効化・パスワード認証を無効化する
5. private key指定でログインできることを確認する
6. パスワードで接続できないことを確認する

### rsaキーを生成する
※既に生成されている場合はスキップしてOK
Githubの説明を参照
https://help.github.com/en/articles/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent

```sh
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
# github 認証などに使えるので取って置く
cat ~/.ssh/id_rsa.pub
# ssh接続の認証に使うのはこちら!!!
cat ~/.ssh/id_rsa
```

### public key => authorized_keysに書き込み
```sh
cd ~/.ssh
ls -la
cat id_rsa.pub > authorized_keys
```

### sshd_config設定
場所
/etc/ssh/sshd_config

```sh:/etc/ssh/sshd_config
# rootのログインは個人のニーズによって設定していただく
PermitRootLogin yes

### 認証済みファイル
AuthorizedKeysFile .ssh/authorized_keys
# 認証方式設定
PasswordAuthentication no
PubkeyAuthentication yes
```
#### サービス再起動して設定を適用
```sh
# centos
systemctl restart sshd
```

## 確認
```sh
# パスワードでログインしようとすると、エラーになる
Disconnected: No supported authentication methods available (server sent: publickey,gssapi-keyex,gssapi-with-mic)
# private key指定でログイン成功する
```
以上。
[.NET][C#] 日付のJSONデシリアライズ

# 前書き

.NET Framework界隈では、[Newtonsoft.Json](https://www.nuget.org/packages/Newtonsoft.Json/)がデファクトスタンダードでしょうか。

Newtonsoft.Jsonを使って`System.DateTime`型を変換するときには、タイムゾーンの扱いに応じて[4つのオプション](https://www.newtonsoft.com/json/help/html/SerializeDateTimeZoneHandling.htm) `Local` `Utc` `Unspecified` `RoundtripKind` があります。

ドキュメントを読んでもいまいちわからなかったので実際に動かしてみました。

# 実験結果

## デシリアライズ

`2019-12-31T15:00:00.000Z` という日付をデシリアライズすると、、、

| オプション | `DateTime`の値 | `DateTime.Kind`の値 |
|:--|:--|:--|
| `Local`  | 2020-01-01 00:00:00  | Local  |
| `Utc`  | 2019-12-31 15:00:00  | Utc  |
| `Unspecified`  | 2019-12-31 15:00:00  | Unspecified  |
| `RoundtripKind`  | 2019-12-31 15:00:00  | Utc  |


## シリアライズ

シリアライズは、ドキュメントにある通りです。まとめてみます。

<table>
<tr><th></th><th colspan="3">DateTime.Kindの値</th></tr>
<tr><th>オプション</th><th>Unspecified</th><th>Utc</th><th>Local</th>
<tr><td> Local </td><td>2013-01-21T00:00:00+09:00</td><td>2013-01-21T00:00:00+09:00</td><td>2013-01-21T00:00:00+09:00</td></tr>
<tr><td> Utc </td><td>2013-01-21T00:00:00Z</td><td>2013-01-21T00:00:00Z</td><td>2013-01-20T15:00:00Z</td></tr>
<tr><td> Unspecified </td><td>2013-01-21T00:00:00</td><td>2013-01-21T00:00:00</td><td>2013-01-21T00:00:00</td></tr>
<tr><td> RoundtripKind </td><td>2013-01-21T00:00:00</td><td>2013-01-21T00:00:00Z</td><td>2013-01-21T00:00:00+09:00</td></tr>
</table>

# 実験ソース

ソースコードはこちらに置きました。
https://github.com/sengokyu/ex-DateTimeZoneHandling

`dotnet run`コマンドで実行できます。


# 考察

自分の要件では`UTC`がよさげです。

JSON UTC文字列 -> UTCな`System.DateTime`へ
Kind=Localな`System.DateTime` -> JSON UTC文字列

`System.DateTime`を`new`するときは、Kindを忘れずにLocalにセットしないとです。

# ASP.Net Coreにおける設定

`starup.cs`の中で、`.AddJsonFormatters()`を呼び出すときにオプションを渡します。

```c#
services.AddJsonFormatters(options =>
{
    options.DateTimeZoneHandling = DateTimeZoneHandling.Utc;
})
```
Google App Scriptの強みと弱み

# はじめに
学びを文章化してアウトプットする練習として初Qiitaを書いてみました
読みにくかったりすると思いますがよろしくお願いします
最近GASを使ってよく自動化だったり、通知を一元化することにハマってるマロです
いろんな人が既に書いていると思いますが自分のアウトプットがてら記事にします

## GASってなんやねん？

まず、GASについてですが業務改善とかの話題になったときに聞いたことはあるけど
使ったことないって人も多いと思います

なので簡単に概要からお話いたします

##  突然ですがRPAって知ってますか？

- Robotic Process Automationの略になります
- ロボットによる業務自動化
- 定性的なパソコン操作をソフトウェアのロボットにより自動化するもの

**まぁようするにBotですね**

よく勘違いされるんですがAIではないです

AIの略は**Artificial Intelligence**です

つまりGASはRPAの一種になります。

有名なのだとエクセルのマクロ(VBA)とかが似たようなものになります
(仕組みは全然違ったりできる範囲は違うけど・・・)

# GASとは

そういえばさっきからさんざんGASGASいってきたんですが説明してませんでした

GASとは
　**GAS = Google App Script** 　の略になります

そんな名前なんてどうでもいいからはよなにができるか言えやって人向けに説明すると

- Googleのサービス(スプシ・Gmail・カレンダーとか)を簡単にクラウド上で実行できる
- 様々なサービスのAPIなどを使ってGoogleのサービス上で操作できる

まぁこんなところです

私が自身まだ理解してない部分も多いですが、かなり便利です

言語環境はJava Scriptベースになりますがちょっと普通のJava Scriptと違います
違いはデメリットのところで少し書きます

まとめると主にGoogleのサービスを通してデータだったりアプリケーションを操作をするサービスです

# GASのメリットとデメリット

## メリット
1. GoogleのアプリをAPIで簡単に呼び出せる
2. 無料
3. 公開が簡単
4. デプロイが簡単(Claspによる)

## デメリット
1. 実行時間やAPIの呼び出し回数に制限がある
2. DOMが使えない
3. Node.jsのCoreAPIが使えない
4. npmモジュールが使えない

こんなところになります

# まとめ

今回はGASとはなにかということに着目して何ができるか何がつくれるかということ、メリット、デメリットについて書きましたが次回はGASの導入から実際にGASを使ってみるところまで書いてみようと思います
[aws]IAM Roleで権限設定している場合のcredentialの渡し方

# IAM Roleで権限設定している場合のcredentialの渡し方

アプリケーションからAWSのリソースにアクセスする場合、何かしらのIAMユーザを作って、 `AWS_ACCESS_KEY_ID` `AWS_SECRET_ACCESS_KEY` を発行して、環境変数などにセットして

```rb
Aws::S3::Client.new(
  region: 'ap-northeast-1',
  access_key_id: ENV['AWS_ACCESS_KEY_ID'],
  secret_access_key: ENV['AWS_SECRET_ACCESS_KEY']
)
=> #<Aws::S3::Client>
```

でアクセスすること、多いですよね。

でも、EC2インスタンスや、ECSのタスクに Roleを設定してそちらで権限管理すると、credentialをアプリケーション側で管理しなくてもよくてより管理しやすくなってよいのですが、その場合のアプリケーションからのクレデンシャルの渡し方があまり分からなかったので調べました。

## carrierwaveの場合 

carrierwaveの場合は、gem側で用意されていて、通常のAWS_ACCESS_KEY_IDなどを渡す代わりに、

```config/initializer/carrierwave.rb
CarrierWave.configure do |config|
  config.fog_credentials = {
      provider: 'AWS',
      region: 'ap-northeast-1',
      use_iam_profile: true
  }
end
```

と、 `use_iam_profile:true` を渡せば、carrirwaveの中（から呼ばれている `aws-fog` というgem)でよしなに[やってくれます](https://github.com/fog/fog-aws/blob/7d88051eb66ea2deef2a687a4c24c93f756a6a40/lib/fog/aws/credential_fetcher.rb#L12)。

## Shrineの場合
carrierwaveと似たような画像アップロードのgemでShrineというのがありますが、こちらの場合は、S3を使う場合、

https://github.com/shrinerb/shrine/blob/master/lib/shrine/storage/s3.rb#L60

```s3.rb

class Shrine
  module Storage
    class S3
      # ... 略 ...
      def initialize(bucket:, client: nil, prefix: nil, upload_options: {}, multipart_threshold: {}, signer: nil, public: nil, **s3_options)
        raise ArgumentError, "the :bucket option is nil" unless bucket

        @client = client || Aws::S3::Client.new(**s3_options) # <= これ
```

と、aws-sdkに、直接アプリからの設定を渡していました。

この場合どうするんだろう？というのが分からずに色々調べた結果になります。

## 結果

最終的にはすごく単純で、 ec2や、ecsコンテナに、iam roleが設定された場合、特定のurlにリクエストを送るとクレデンシャルが取得できるAPIがつかえるようになるので、そこから持ってきた内容を設定するだけということでした。

[インスタンスメタデータとユーザーデータ](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-instance-metadata.html)

これを実装しているのが、 carrierwaveでみた、 `aws-fog` の

> と、 `use_iam_profile:true` を渡せば、carrirwaveの中（から呼ばれている `aws-fog` というgem)でよしなに[やってくれます](https://github.com/fog/fog-aws/blob/7d88051eb66ea2deef2a687a4c24c93f756a6a40/lib/fog/aws/credential_fetcher.rb#L12)。

の部分です。

で、Shrineで、この処理実装しないといけないのかーとおもっていたら、aws-sdkにこれらの処理をやってくれる処理があってそれを使うとすごく楽です。

最終的には下記のようにしました。
ECSの場合、 `Aws::ECSCredentials`
EC2の場合、 `Aws::InstanceProfileCredential`
が使えます。これらを `credentials` というkeyでsdkにわたすと、いろいろ取得してくれてよしなにcredentialを作ってくれます。

```config/initializer/shrine.rb
require 'shrine'
require 'shrine/storage/s3'

s3_options = {
  region: 'ap-northeast-1',
  bucket: 'some_bucket_name'
}

# AWS_CONTAINER_CREDENTIALS_RELATIVE_URI が定義されている場合
# Role設定されたECSで動いているので、ECSの方、そうでなければ、EC2用のInstanceProfileの方を使う。
if ENV["AWS_CONTAINER_CREDENTIALS_RELATIVE_URI"]
  s3_options = s3_options.merge(credentials: Aws::ECSCredentials.new)
else
  s3_options = s3_options.merge(credentials: Aws::InstanceProfileCredentials.new)
end

Shrine.storages = {
  cache: Shrine::Storage::S3.new(prefix: 'prefix', **s3_options),
  ... 略 ...
}
```

結果的には非常に簡単だったのですが、これらに気づくまで結構時間がかかったので、メモとして残しておきます。
開発用ローカルサーバのPythonコマンドを統一するスクリプトの書き方

Macのローカルで簡易にWebサーバを建てたい時は、
Pythonのワンライナーでサクッと建てられるので便利です。
でも、バージョンが2系と3系ではコマンドが微妙に違うので使い分ける必要があり、
pyenv等を使用してローカルのバージョンを切り替えて使っている場合などではちょっとだけ不便でした。

### Python 2系のコマンド
ポート8000番で建てたい場合

```console
$ python -m SimpleHTTPServer 8000
```

### Python 3系のコマンド
ポート8000番で建てたい場合

```console
$ python -m http.server 8000
```

そこで、バージョンに関わらず実行できるスクリプトを作り、それにエイリアスを貼ることで同一コマンドで実行できるようにします。

## Pythonバージョンに関わらず実行できる簡易サーバースクリプト
以下のようなスクリプトを `~/.bash_profile` に追記すると、バージョンに関わらず `py-server` コマンドで実行できるようになります。
なお、実行時のデフォルトポート番号は8000にしています。

```~/.bash_profile
# pythonのバージョンに関わらず簡易サーバーを建てるコマンド
python-local-server() {
  local PORT=8000
  if [ $# -gt 0 ] ; then
    PORT="$@"
  fi
  local PV=$(python -V 2>&1 | cut -d ' ' -f 2 | cut -c 1)
  if [ $PV -eq "3" ] ; then
    python -m http.server ${PORT}
  else
    python -m SimpleHTTPServer ${PORT}
  fi
}
alias py-server=python-local-server
```

追記したあとは `~/.bash_profile` を読み込み直します。

```console
$ source ~/.bash_profile
```

実行時、以下のようにコマンド入力すれば、任意のポート番号でも実行できるようにしています。

```console
$ py-server 3333
Serving HTTP on 0.0.0.0 port 3333 (http://0.0.0.0:3333/) ...
```

## 参考記事
Python2系のバージョン抽出が素直には動かず苦労したため、以下の記事に助けられました。
[CentOS7のシェル上でPythonのバージョン\(2\.7\.5など\)だけを取得する \- Qiita](https://qiita.com/toshiya-i/items/4a0ba3b0924a5aec6585)
Nuxt.js で他の端末から確認する時にローカルの API サーバの IP アドレスに自動でアクセスする方法

ローカルで API のモックサーバやプロキシサーバを立ち上げることがあります。
そのうえで、Nuxt.js の dev サーバを他の端末で確認したいこともあります。
その場合、API URL を dev サーバを起動しているプライベート IP アドレスにする必要がありますが、それを手動で切り替えのは面倒なので、自動で切り替える設定になります。

```js:nuxt.config.js
import internalIp from 'internal-ip'

export default async () => {
  let apiBaseUrl = 'http://localhost:8000/api/v1'

  if (process.env.NODE_ENV === 'develop') {
    const ip = await internalIp.v4()
    apiBaseUrl.replace(/localhost|127\.0\.0\.1|0\.0\.0\.0/, ip)
  }

  const nuxtConfig = {
    axios: {
      baseURL: apiBaseUrl
    }
  }

  return nuxtConfig
}
```

ちなみに、僕は環境設定ファイルに API のベース URL を記載しているので、それを上書きする形で使っています。
db2 備忘録

## LOB File のimport
db2 "import from \<importファイル\> of del lobs from .\<lobをexportしたディレクトリ\> modified by lobsinfile insert into \<DATAをインポートするテーブル名\>"

## db2 CLIに設定されているオプションの表示
db2 list command options

## db2 CLIでオートコミットをON
db2set DB2OPTIONS=-c

## db2 CLIでオートコミットをOFF
db2set DB2OPTIONS=+c
【JavaScript】('b'+'a'+ + 'a' + 'a').toLowerCase() が「banana」と表示される

スタックオーバーフローのこちらの質問がネタ元です。 
面白いと思いましたので投稿させていただきました :bow:

- [Why is the result of ('b'+'a'+ + 'a' + 'a').toLowerCase() 'banana'? - Stack Overflow](https://stackoverflow.com/questions/57456188/why-is-the-result-of-ba-a-a-tolowercase-banana)

`('b'+'a'+ + 'a' + 'a').toLowerCase()`これを実際にJavaScriptで実行してみると、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142910/a0c2a4b1-e9cf-e73a-fe25-facf2c7bfa88.png)

このように「banana」と表示されました　:grin:

---

回答の要約

1. `+"a"` とすると、`"a"` は数値ではないので `NaN` となる
1. `'ba' + NaN` とすると、`NaN`が文字列の`"NaN"`となる
1. 最後に`'a'`を連結してるので`"baNaNa"`になる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142910/04bc2056-2ced-0a15-9191-6e6763564404.png)


`toLowerCase()` とすると「banana」と表示される


以上です。失礼しました。m(_ _)m
jsonファイルを環境変数に展開する

## 概要
jsonファイルに記載した内容を環境変数にも展開したい場合があったので調べた内容をメモする

## ファイル構成

```:ファイル構成
├ config.json
└ json.sh
```

## JSONファイル作成
下記の内容で作ってみる。

```json:config.json
{
  "hoge": "hello_world",
  "fuga": "example_value"
}
```

## シェルを作成する
下記の内容で作ってみました。

```bash:json.sh
#!/bin/bash

JSON=`cat config.json`

KEYS=$(echo $JSON | jq -r 'keys[] as $k | "\($k)=\(.[$k])"')
i=0
for e in ${KEYS[@]}; do
    # キーと値を分割する
    arr=(`echo "${e}" | tr -s '=' ' '`)
    # キーを大文字に変換して変数定義する 
    export ${arr[0]^^}="${arr[1]}"
    let i++
done

echo "HOGE: ${HOGE}"
echo "FUGA: ${FUGA}"
```

## テスト
実行してみる

```bash:ターミナル
$ ./json.sh
HOGE: hello
FUGA: example
```

このままだと

```bash:ターミナル
$ echo ${HOGE}

$ echo ${FUGA}

```

となり、シェルの中だけ有効となる。

## 環境変数として定義する
sourceコマンドを使う。

```bash:ターミナル
$ source json.sh
HOGE: hello_world
FUGA: example_value
```

動作確認してみる。

```bash:ターミナル
$ echo $HOGE
hello_world

$ echo $FUGA
example_value
```

## まとめ

jsonファイルに定義する値に半角スペースがあるとそこで切れてしまうなどの問題もあり、
あまりいいやり方ではない感じです。

jqコマンドについては、もう少し勉強が必要そうです。

以上
webarenaでubuntu その33

#概要

webarenaでubuntu18.04やってみた。
apache2.4,php7.2やってみた。
rssリーダーやってみた。

#サンプルコード

```
d3.xml('http:///georss.php', function(rss) {
  var th = ['title', 'desc', 'link'];
  var table = d3.select("body").append("table").attr("border", "1")
  table.append("thead").append("tr").selectAll("th").data(th).enter().append("th").text(function(d) {
    return d;
  });
  var w = rss.documentElement.getElementsByTagName("item");
	for (var i = 0; i < w.length; i++)
	{
		var title = w[i].getElementsByTagName("title");
    title = title[0].childNodes[0].nodeValue;
		var desc = w[i].getElementsByTagName("description");
		desc = desc[0].childNodes[0].nodeValue;
		var link = w[i].getElementsByTagName("link");
		link = link[0].childNodes[0].nodeValue;
		var item = [title, desc, link];
    table.append("tbody").append("tr").selectAll("td").data(item).enter().append("td").text(function(d) {
      return d;
    });
	}
});
```

#成果物

http://embed.plnkr.co/fxibSSWyfp8Poy1NsMZi/

以上。
NodeJS v12 で AWS Amplify コマンドのインストール時、エラーが出る現象をどうにかする

NodeJS v12 で `@aws-amplify/cli` をインストールすると、依存パッケージの `fs-ext` のビルドがコケるけど、なぜかインストールは成功する、という気持ち悪い現象が起きています。

これを対症療法的にどうにかしましたので、記事にまとめてみました。

---

## tl;dr

```sh
npm install -g --no-optional @aws-amplify/cli
```

---

## 現象

AWS Amplify を使うために、amplify コマンドをインストールします。

通常、以下のようなコマンドでインストールしますが、途中でエラーが大量発生します。😰

---

```sh
$ npm install -g @aws-amplify/cli
    :
  (中略)
    :
../fs-ext.cc:281:40: error: too few arguments to function call, single argument 'context' was not specified
  flock_data->fd = info[0]->Int32Value();
                   ~~~~~~~~~~~~~~~~~~~ ^
```

---

その一方で **インストールそのものは成功する** という、気持ちの悪い現象が起きます。

(macOS のみ、Windows では何の問題もなくインストールできました)

---

## 調査

`fs-ext` というパッケージが何か悪さをしているように見受けられるので、依存関係を確かめてみましょう。

---

```sh
$ npm ls -g fs-ext
/Users/kurone-kito/.anyenv/envs/nodenv/versions/12.7.0/lib
└─┬ @aws-amplify/cli@1.12.0
  └─┬ amplify-util-mock@0.3.0
    └─┬ amplify-appsync-simulator@0.3.0
      └─┬ @conduitvc/mosca@2.8.3
        └─┬ ascoltatori@3.2.0
          └─┬ qlobber-fsq@3.2.4
            └── UNMET OPTIONAL DEPENDENCY fs-ext@~0.5.0
```

---

ということで、`fs-ext` をインストールしてみると、何事もなくうまくいきました。
最新版との間に何があったか探ってみると、[以前は NodeJS 11 以降では動かなかったようです](https://github.com/baudehlo/node-fs-ext/issues/83)。

---

## どうにか解決してみる

早速 NodeJS をバージョンダウンしてインストールしてみます。
筆者の環境だと、v10 でも別のエラーが出て、v8 でようやくちゃんとインストールできました。

---

とはいえ、v12 の機能が使えないのは辛いので、別の手を考えてみます。
先ほどのツリーをみると、`UNMET OPTIONAL DEPENDENCY` という表示が気になります。つまり、**このパッケージは必須ではない** ということです。

---

つまり、上記コマンドで解決です 😌

```sh
npm install -g --no-optional @aws-amplify/cli
```

---

## 考察

`qlobber-fsq` や `ascoltatori` あたりは最新でも死ぬので、この辺の古い依存関係に根本的な原因がありそうです。
また **Optional をインストールしないと、特定機能が使えなくなる** というリスクは捨てきれません。。

---

おしまい。
ポートをkillする

ローカルサーバーを建てた場合にポート番号が被ってしまった場合に、エラーが出てしまうことがあると思います。

```
// ポート番号8080の場合
Error: listen EADDRINUSE: address already in use :::8080
```

これを一回落とす(killする)方法をメモとして残しておきます。

1. プロセスID(PID)を取得: ポートをkillするにはPIDが必要となるため、下記のコマンドで被っている対応したPIDを表示します。この場合は`8080`を例にしています。

```
lsof -i -P | grep 8080
```

すると、下記のような出力がされます。
![Screen-Shot-2019-08-26-at-1.16.34-PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230009/aaae4a41-20cd-892b-09ff-741fe8190d79.png)
2. killする: 上のスクリーンショットを見ると、左から２番目の行がPIDになるので、下記のコマンドを叩きます。`-9`も必要です。

```
kill -9 9384
```

これで同じポートで環境を立ち上げられます。
GitHub関連コマンド

#はじめに
qiitaの練習もかねてgithub周りのコマンドを一覧で見れるようにまとめた。
ある程度githubを使ったことがある人はこの一言でわかるはず

#基本コマンド
`git init`；リポジトリを初期化これによって.gitディレクトリが作られリポジトリデータを格納
`git status`；リポジトリの状態を確認
`git add`；ステージ領域へファイルを追加
`git commit`；リポジトリにコミット、-mで一行メッセージ何もつけなければ文でコメント
`git diff`；ワークツリーとステージ領域の差分（addするまで）
`git diff HEAD`；ワークツリーと最新コミットの差分（addしてからcommitするまで）
`git log`；コミットのログを確認
`git log -p *`；＊のファイルの差分確認

#ブランチ
`git branch`；branch一覧の確認、後ろに任意のブランチ名を書けばブランチ作成コマンドになる
`git checkout *`；＊のブランチへ切り替え
上の二つをまとめて行う場合`git checkout -b *`；*はブランチ名である
`git branch -`；一つ前のブランチへ
`git merge --no-ff *`；現在のブランチに＊のブランチをmergeする--no-ffを書くと詳細なコメントができる
`git log --graph`；ブランチを視覚的に確認できる

#過去改変
`git reflog`；現在のリポジトリで行われた作業のログを確認できる（logだとその状態からの過去のログしか確認できない）
`git reset --hard *`；＊のコミットした状態に復元（＊はreflogもしくわlogで確認できるコミットのハッシュである、通常４桁書けばtab予測変換できる）
`git commit --amend`；直前のコミットメッセージの修正
`git rebace -i HEAD~*`；＊には数字が入る。過去＊個までの歴史を対象としてエディタ起動。pickをfixupにするとそのコミットがなかったことになる
MySQL Workbench over SSHでAccess denied for 'none' エラーの対応

# この記事は？

MySQL Workbenchを使って，MySQL over SSH接続をしたいのだけれど下記のエラーが出て意味わから無い人向けの対応です。
どう見ても設定はあっているのに！

```
Access denied for 'none'. Authentication that can continue: publickey
```

![スクリーンショット 2019-08-26 12.47.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120396/3a05652a-1932-11e2-f3d9-bad2aa03fa8c.png)

## ひょっとして

**その公開鍵はMacで作りませんでしたか？**
Macで作ると新フォーマット（？）で作るらしく，Workbenchが対応していないらしい。
Macで作った公開鍵をテキストで開くと，下記のようになっています。

```
-----BEGIN OPENSSH PRIVATE KEY---
なんかいろいろ
かいてある
-----END OPENSSH PRIVATE KEY---
```

これをWindowsのPuttyを使ってExportしてみよう。ExportするときにOpenSSHに2種類あることがわかります。New file formatではなく，旧フォーマットにしましょう。
Puttyで作ったファイルをテキストで開くと，下記のようになっています。

```
-----BEGIN RSA PRIVATE KEY---
Proc-Type: なんか
DEK-Info:なんか

なんかいろいろ
かいてある
-----END RSA PRIVATE KEY---
```

これを使いましょう。
Macでもputtygenコマンドがあるらしい。
MongoDB 4.2 updateコマンドで3種類のAggregate Pipeline Stageが使え、フィールド間の演算ができるようになった

# 概要

MongoDB 4.2 のUpdate機能で以下のAggregate Pipeline Stageが使えるようになった。

- $set
    - $addFieldsのエリアス
- $unset 
    - $projectのエリアス
- $replaceWith
    - $replaceRootのエリアス

これらはMongoDB4.2で追加されたもので、MongoDB4.0までの`$set`等はUpdate演算子であるが、上記はAggregate Pipeline Stageである。

# 環境

- Windows10
- MongoDB 4.2.0

# 書式

これまでの書式

```javascript
db.collection.update({query},{upadte},{option})
```

MongoDB4.2で追加されたAggregate Pipeline Stageを使うときの書式

```javascript
db.collection.update({update},[pipeline],{option})
```

# 実行例

## 実行例1

サンプルデータの登録

```javascript
db.collection.insert({key:1,a:1})
```

`key:1`のドキュメントで`フィールドb`に`a+10`をセットする。

```javascript
db.collection.update({key:1}, [{$set:{b:{$sum:["$a",10]}}}])
```

```javascript
db.collection.find({key:1})

{ "_id" : ObjectId("5d6331f494b7acefeeba2d7b"), "key" : 1, "a" : 1, "b" : 11 }
```

## 実行例2

サンプルデータの登録

```javascript
db.collection.insert({key:2, a:1, b1:1, b2:"bbb", c:100})
```

`key:2`のドキュメントで`b1,b2`をサブドキュメントとにして、新たに`b`とする。

```javascript
db.collection.update({key:2},
  [{$set:{b:{b1:"$b1",b2:"$b2"}}},
   {$unset:["b1","b2"]}
  ])
```

```javascript
db.collection.find({key:2})

{ "_id" : ObjectId("5d6334d81a1cb0219588b62c"), "key" : 2, "a" : 1, "c" : 100, "b" : { "b1" : 1, "b2" : "bbb" } }
```

`$set`で`b`のサブドキュメントを作ってから`$unset`で元の`b1,b2`を消します。
注意としては`$unset`ではフィールド名に`$`を付けないことです。

##　実行例3

実行例１より複雑な例で、条件付きで演算対象フィールドを分けます。

サンプルデータの登録

```javascript
db.collection.insert({key:3,a:1, b:10, c:"1", d:20})
```

`c`が"1"なら`d`に`a`を加える、それ以外は`d`に`b`を加えるとします。

```javascript
db.collection.update({key:3},
  [{$set:{d:{$cond:{
       if: {$eq:["$c","1"]},
       then: {$sum:["$d","$a"]}, 
       else: {$sum:["$d","$b"]}
   }}}}
  ])
```

`d`が20から21に更新されたことが確認できます。

```javascript
>  db.collection.find({key:3})

{ "_id" : ObjectId("5d6337d61a1cb0219588b62d"), "key" : 3, "a" : 1, "b" : 10, "c" : "1", "d" : 21 }
```

# まとめ

これまでアプリケーションでやっていた処理がUpdate演算子で出来るようになって非常にうれしいです。
今後、`$lookup`的なStageも使えるようになったら良いと思います。

# 参照

- https://docs.mongodb.com/manual/reference/method/db.collection.update/
Windows 10でiFunBoxからデバイスに接続できない場合の対応策

## 原因
Microsoft StoreからiTunesをインストールした場合に発生することがある模様。

## 対応策
「アプリと機能」から一旦アンインストールを行った上で[Appleのダウンロードページ](https://www.apple.com/jp/itunes/download/)から下記のリンクをクリックしてインストーラーをダウンロード、インストールを行う事でiFunBoxからデバイスに接続が確認できた。
![Windows10_iTunes_Download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475113/c26dc0d6-046e-ac9a-c3f4-cc51352ea2a2.png)
iOS 13時代のModal表示仕様と対応

## 概要

iOS 13からは`UIViewController`の`modalPresentationStyle`のデフォルト値が`UIModalPresentationAutomatic`となりました。
これによってModal表示した際に以下のような表示に変化。
![modal_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475113/b9e0e277-fe28-dd31-c544-8e19a0adbce3.png)

iOSの標準アプリではiOS 12でもたまに使われていたUIですね。
この仕様は画面上部を下方向にドラッグすることで…
![modal_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475113/7dba9c80-d480-1cc6-90b9-f0f942dbd27d.png)

このように引き下げて表示元の画面に戻れるようになりました。
これによりModalを閉じるコントロールを配置しないことで操作をブロックするような目的でModalを使用していた場合に意図しない形で閉じられてしまうケースが出る可能性が出てきました。

ドラッグ中の操作感はiOS 7から`UINavigationController`が画面端のドラッグでナビゲーションを戻せるようになった動きと同じで一定以上ドラッグすれば戻り、しきい値に満たずに離した場合は元いた画面に戻ります。

## 仕様の適用について

iOS SDK 12以前でビルドされたアプリをiOS 13で動作させる場合には上記の新仕様は適用されず、従来通りの動きをします。
iOS SDFK 13以降でビルドした場合に新仕様が適用されます。

## 対応

画面数の多いアプリやデザインの観点、対応工数など様々な理由から上記の新仕様を適用したくない場合もあると思います。
この場合には下記のように対応を行います。

方法は単純でiOS 12までデフォルト値になっていた`UIModalPresentationFullScreen`を`modalPresentationStyle`にセットします。
IBM Cloud Kubernetes Service リンク集

皆さん、こんにちは。戸倉彩です。

今回はIBM Cloud Kubernetes Service (IKS) に関する情報収集源や学習ソースのリンク集を用意いたしました。 これから始められる方も、踏み出せなかった方も、IBM Cloudの技術情報をプラスして実際にKubernetesを触ってみましょう。 ※本リンク集は随時更新していきます。リクエストがありましたらお気軽に編集リクエストまたは個別にお知らせください。

# IBM Cloud 公式サイト
https://www.ibm.com/jp-ja/cloud

# 事前準備
IKSを利用するための準備が必要です。

## IBM Cloud アカウント (PayGまたはサブスクリプション)
下記のいづれかのアカウントを取得してください。有償アカウントとなりますが、IBM Cloud Kubernetes Serviceを無料範囲でご利用いただくことは可能です。

* **PayGカウント**  
ライトアカウントからクレジットカードを登録してアップグレードされた従量課金モデルのアカウント  

[参考解説動画]
1) [IBM Cloud のライトアカウントを作成しよう - IBM Developer](https://youtu.be/Krn1jQ4iy_s)
2) [従量課金アカウントへのアップグレード - IBM Developer](https://youtu.be/uFCSvAKapr0)

* **サブスクリプションアカウント**  
法人にて個別契約

## IKSを利用するためのCLI
IBM CloudとIKSクラスタの操作に必要なCLIツールのセットアップ

macOSおよびLinux環境

```
curl -sL https://ibm.biz/idt-installer | bash
```

Windows10 Pro 環境

```
Set-ExecutionPolicy Unrestricted; iex(New-Object Net.WebClient).DownloadString('http://ibm.biz/idt-win-installer')
```
※Windows PowerShell アイコンを右クリックして、 管理者として実行 を選択します。

# 初めてKubernetes学ぶ方にオススメ！ Kubernetesハンズオン (初級から上級まで)
https://github.com/ibm-cloud-labs/iks-handson

## ハンズオン構成
こちらのハンズオンは、GitHub上に公開されLab0-6の7つのコンテンツで構成されています。

* Lab0ではIKSを利用するために必要なセットアップ手順について知ることができます。  
* Lab1-6は基本的には独立した内容となっていますので、好きな順番で試してみることができますが、基本的にはLab1から実施頂くことをオススメします。
* Lab4-5は続けて実施する内容になっています。

|                                                                                  | 初級  | 中級  | 上級  | 先生  |
| :------------------------------------------------------------------------------- | :---: | :---: | :---: | :---: |
| [Lab 0](https://github.com/ibm-cloud-labs/iks-handson/tree/master/Lab0): セットアップ (IKSクラスター接続確認)                                   |   ○   |   ○   |   ○   |   ○   |
| [Lab 1](https://github.com/ibm-cloud-labs/iks-handson/tree/master/Lab1): K8sクラスターへのアプリケーションデプロイ (kubectl CLI の基本操作)        |   ○   |   ○   |   ○   |   ○   |
| [Lab 2](https://github.com/ibm-cloud-labs/iks-handson/tree/master/Lab2): スケーリング，アップデート&ロールバック (K8s基本機能)                     |   ○   |   ○   |   ○   |   ○   |
| [Lab 3](https://github.com/ibm-cloud-labs/iks-handson/tree/master/Lab3): マニフェストファイルの使用とDB連携 (yaml操作とDBコンテナ連携)             |   ○   |   ○   |   ○   |   ○   |
| [Lab 4](https://github.com/ibm-cloud-labs/iks-handson/tree/master/Lab4): Helmチャートを使用したアプリケーションデプロイ (K8sパッケージング技術の使用) |       |   ○   |   ○   |   ○   |
| [Lab 5](https://github.com/ibm-cloud-labs/iks-handson/tree/master/Lab5): コンテナアプリケーションとWatson APIとの連携 (クラウドサービスとの連携)     |       |   ○   |   ○   |   ○   |
| [Lab 6](https://github.com/ibm-cloud-labs/iks-handson/tree/master/Lab6): Helm Chart基礎の体験 (サンプルチャートの作成・操作)                     |       |       |   ○   |   ○   |
| [Lab X](https://github.com/ibm-cloud-labs/iks-handson/tree/master/LabX): まだまだあるよ。Kubernetesの追加学習コンテンツの一覧                     |       |       |       |   ○   |




Have a nice Geek Life♪　　
※Twitterで最新情報配信中 [@ayatokura](https://twitter.com/ayatokura)