OmniAICreator/Qiita-1.07M huggingface dataset:
JSで時計を作成

# はじめに
本記事の内容は学習の備忘録になります。


## 実装概要
-  JSで日付+時間+曜日をリアルタイムで表示

## demo
![画面収録 2020-12-19 14.43.21.mov.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526620/af543f3b-a31e-f531-800c-54fef784ef57.gif)



## 実装内容
表示用のdivタグを作成。

```html

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <link rel="stylesheet" href="style.css">
</head>
<body>
  <!-- 時計 -->
  <div id="time_text"></div>

  <script src="main.js"></script>
</body>
</html>
```

JS側

```javascript

function showClock() {
  let nowTime = new Date();
  let nowYear = nowTime.getFullYear();
  let nowMonth = nowTime.getMonth() + 1;
  let nowDate = nowTime.getDate();
  let nowDay = nowTime.getDay();
  let dayOfWeekStr = [ "(日)", "(月)", "(火)", "(水)", "(木)", "(金)", "(土)" ][nowDay] ; 
  let nowHour = ("0"+nowTime.getHours()).slice(-2);
  let nowMin  = ("0"+nowTime.getMinutes()).slice(-2);
  let nowSec  = nowTime.getSeconds();
  let msg = nowYear+"/"+nowMonth+"/"+nowDate+" "+dayOfWeekStr+" "+nowHour + ":" + nowMin + ":" + nowSec;
  day_tims=nowYear+"/"+nowMonth+"/"+nowDate+" "+nowHour + ":" + nowMin + ":" + nowSec;
  document.getElementById("time_text").innerHTML = msg;
  console.log(nowDay);

  return day_tims;
}
setInterval('showClock1()',1000);
```
git pullしたら、git checkoutできなくなった。(error: you need to resolve your current index first)

##git checkoutできなくなった。　conflict解消したのになんで？？
チーム作業で、他のメンバーの編集したブランチをpullしたら、自分の作業ブランチに戻れなくなった。

#原因
```bash:
vocstartsoft:~/environment/app (develop|MERGING) $ git checkout [戻りたいブランチ]

error: you need to resolve your current index first
```

git pullして、conflictを解決したのに、checkoutできない！
ブランチの状態がMERGINGになっているのが原因。（解消したconflictがリポジトリに反映されていない。）


#解決策

```bash:
vocstartsoft:~/environment/app (develop|MERGING) $
```

Conflictを解消した後に、

```bash:
vocstartsoft:~/environment/app (develop|MERGING) $ git add .
vocstartsoft:~/environment/app (develop|MERGING) $ git commit -m "コメント"
```

conflictが解消されているなら、commitすることで、正常にmerge出来たことになる。
「|MERGING」の記述も消えているはず。

```bash:
vocstartsoft:~/environment/app (develop) $
```
【初心者】PHPでアルファベットを出力する

# アルファベットを配列で出力したい
PHPでアルファベットを配列で出力したい時は…

```php
range("A","Z");
```
このように range関数を使うとアルファベットのAからZまでの配列が作成できる。
出力結果が長くなるので、短めに出力してみる。

```php
$a = range("A","E");
print_r($a);
// 以下出力結果です。
Array
(
    [0] => A
    [1] => B
    [2] => C
    [3] => D
    [4] => E
)
```
この部分は、アルファベットだけでなく、数字や50音でも出力できる。
range関数。覚えておく！
本番環境で背景画像を表示させる

##前書き
なぜそもそもこんな記事を書こうと思ったのかというとrailsを使ってポートフォリオを作成しているのですが画像がうまく表示されなかったからです。試行錯誤を繰り返してローカルで表示できたのに本番で表示できなかったときは心が折れました。

やってみたことの部分は僕の試行錯誤なので興味ない方は結論に飛んでください笑

##前提
rails6.0.0
ruby2.6.5

フォルダ階層
assets
　images→karaokeray.jpg
  　stylesheets→songs→index.css


##やってみたこと1
画像が表示されない原因はパスにあることが多いのでまずはそれを疑いました。

index.cssの記述を確認します。

```index.css
background-image: url("../../images/karaokeray.jpg");
```

確認してもパスはこれであっています。実はこれが落とし穴です。通常の静的HTMLならこの記述で正しいのですがRailsではassetsの中身をそのまんま表示しているわけではなく、主にWebページの表示速度向上などのためにちょっとしたお節介をしているためうまく表示されないそうなのです。要するにassetsが関わっているのでこの書き方では実装できないそうなのです。

そこで

```index.css
background-image: image-url("karaokeray.jpg");
```
に変更してみます。これで表示されるかと思いきやここでも表示されませんでした。。。

##やってみたこと2
割とショックを受けつつもなんとか他に実装する方法はないものかと調べていると新たな記事が見つかりました。
public/assets/images配下に画像を設置して表示する方法です。
というわけでpublic配下に新たにassetsフォルダ（このassetsは先ほどのassetsとは別物で新規作成します。）その中に画像を入れていきます。つまり画像を入れるファイルを変更するのです。
そして

```index.css
background-image: url('/assets/images/karaokeray.jpg');
```
ローカルで確認すると表示されています！！
ようやく解決したと意気揚々に本番にデプロイすると、、なんと表示されませんでした。。
どうやったら表示できるんだ、、と頭を抱えていると優しい人が教えてくれました。

##結論
cssファイルをscssに変更する。これだけです。
今までindex.cssとしていたファイル名をindex.scssに変えることで実装できます。（画像ファイルは最初のやってみたこと1の段階に戻してください。）

```index.scss
background-image: image-url("karaokeray.jpg");
```
これでローカルでは問題なく表示できたので本番で確認していきます。すると、、しっかり表示できていました！！！！

　　　　　　　　　　　　　↓こんな感じにできました。↓
![readme-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927542/24319ccc-9717-c9e6-519e-ad54bc58d9cb.jpeg)



##終わりに
なぜこれで実装できるのか自分の頭で整理しているところでまだちゃんと理解できていないのでもう少し勉強しようと思います。アセットパイプラインは奥が深そうです。ただのHTMLとCSSの問題だと思っていたので想像以上に苦戦しました。未経験からの転職を目指して頑張っていきます！！
プログラミング学習中に個人で案件を受注する方法

皆さんこんにちは。ゆんたです。
この記事では私がプログラミングを学習してる最中に案件を受注した方法について記述したいと思います。

当時の自分の状況としては
ゆーやさん (https://twitter.com/yu_nocode?s=20) の個別指導を受講してせきさん (https://twitter.com/YukihiroLaravel?s=20) にもご指導いただいておりました。当時は3か月の個別指導で成長させて頂き、共同開発の経験も少しさせて頂いたくらいのレベルです。

###どうやって案件を頂いたか
私に開発を任せてくださった方は私が普段通っている整骨院様です。施術をしていただいているなかで色々とお話させて頂き、何回目かのときに自分がエンジニアになることを話しました。その時に「予約を電話じゃなくてラインとかスマホからできるようにしたい」とおっしゃっていたので「私でよければ作りましょうか？」と提案したのがきっかけです。

後々なぜお願いしたのか聞いてみたら、
信頼できる人のほうがいいからとのことでした。
身近なところの信頼がとても大事なんだと再確認させられました。

###当時の自分の状況と気持ち
正直なところ自分にできるか迷った部分もありました。そこまでスキルも知識もあるわけではないので、実際に使われるサービスとしてリリースするとなると自分にとって難しい点が多そうだと感じていました。ですが、意外と簡単かもしれないし、最悪コミュニティ内で誰かに聞けば解決するだろう(もちろんお金はお支払いして)という根拠のない楽観視があったのと、相手の方がとても優しく、勉強しながらでも作ってくれればいいよとお願いしてくれたので引き受けさせて頂きました！
(今思うとかなり適当だな...と思います。すみません！)

###実際に開発をして
現在開発を続けておりますが、メンバーのおかげもあり特に大きな問題はなく順調に進んでおります。(メンバーには本当に感謝しております！！)若干難しそうな機能もありますが、調べれば何とかなるかなと相変わらず楽観視してます。実際にリリースする際の知識が全くないのでその時だけ誰かに聞きながらやるのがいいかなと思っております。セキュリティ的にもそのほうが安心なので。

###最後に

実際に案件を頂いた話をしましたが、まとめると
・身近なところや、つながりからお願いされることは多い
・相手はスキルがどのくらいかの判別は難しいので、人となりや信頼での判断が大きい。だから初心者でも案件を受けることは可能！
・自分にできる環境があるかは注意が必要(どうやるか全くわからない状態はダメですが、人に聞いて何とかなりそうなレベルの内容であれば全然OK！)

いつまでも初心者だからと縮こまらずに、自信をもって「できます！」ということも大事だなと思います
また、経験積みたいけど...って方はこんな方法で案件を受注できたりするので、意識してみると意外と簡単にお願いされたりするかもしれません
sudoなし、OpenSSLなしの環境でCMakeを入れる

某スパコンの話です。RHELらしい。
__※追加2022/3/27__: CMakeにはOpenSSLなしでコンパイルするオプションがあるそうです[^1]。つまりこの記事の内容はほとんど意味がない。まあ同じ罠を踏む人が出ないことを祈って記事は残しておきます……

# CMake入ってないんだ、ふーん……

いつもの

```console
cd $HOME/ulocal/src
git clone -b release https://github.com/kitware/cmake
cd cmake
./bootstrap --prefix=$HOME/ulocal/install/cmake
```

なんかエラー

```console
(中略)
-- Could NOT find OpenSSL, try to set the path to OpenSSL root folder in the system variable OPENSSL_ROOT_DIR (missing: OPENSSL_CRYPTO_LIBRARY OPENSSL_INCLUDE_DIR) 
CMake Error at Utilities/cmcurl/CMakeLists.txt:505 (message):
  Could not find OpenSSL.  Install an OpenSSL development package or
  configure CMake with -DCMAKE_USE_OPENSSL=OFF to build without OpenSSL.
```

oh\.\.\.

# OpenSSLをソースビルドで入れる

sudo権限あれば`apt`/`yum`で一発なんですけどね。スパコンなので。苦しい。

OpenSSLはgithubから取れるらしいのでそれを入れます。
`configure`のオプションはREADME読みつつ。

```console
cd $HOME/ulocal/src
git clone -b OpenSSL_1_1_0-stable https://github.com/openssl/openssl
cd openssl
./Configure --prefix=$HOME/ulocal/install/openssl --openssldir=$HOME/ulocal/install/openssl '-Wl,-rpath,$(LIBRPATH)' linux-x86_64
make && make install
```

こんなもの入れたことすら明日には忘れそうなのでmodulefilesに突っ込んでおく

```modules[~/ulocal/modulefiles/openssl/local]
#%Module

set base <ホームディレクトリ>/ulocal/install/openssl

setenv OPENSSL_ROOT_DIR $base
prepend-path PATH               $base/bin
prepend-path LIBRARY_PATH       $base/lib
prepend-path LD_LIBRARY_PATH    $base/lib
prepend-path LD_RUN_PATH        $base/lib
prepend-path C_INCLUDE_PATH     $base/include
prepend-path CPLUS_INCLUDE_PATH $base/include
prepend-path MAN_PATH           $base/share/man
```

** 2021/4/12追記: `MAN_PATH`は`$base/share/man`ですね。。修正しました。

CMake的には`setenv OPENSSL_ROOT_DIR`が重要らしい。

# CMake再挑戦
前項のmoduleを読んだ上で再度。

```console
module load $HOME/
cd $HOME/ulocal/src
cd cmake
./bootstrap --prefix=$HOME/ulocal/install/cmake
make && make install
```

これもmoduleに入れておきましょう

```modules[$HOME/ulocal/modulefiles/cmake/local]
#%Module
#

# dependency
module load openssl/local

# 
set base <ホームディレクトリ>/ulocal/install/cmake

setenv CMAKE_INSTALL_DIR $base
prepend-path PATH               $base/bin
prepend-path LIBRARY_PATH       $base/lib
prepend-path LD_LIBRARY_PATH    $base/lib
prepend-path LD_RUN_PATH        $base/lib
prepend-path C_INCLUDE_PATH     $base/include
prepend-path CPLUS_INCLUDE_PATH $base/include
prepend-path MAN_PATH           $base/share
```

最後に確認

```
$ module load cmake && cmake --version
cmake version 3.19.2

CMake suite maintained and supported by Kitware (kitware.com/cmake).
```

よかったですね。
（肝心のhorovodが入っていないので何もよくない……）

### 追記

spack使ったら一発でした。うーん……

(さらに追記) spack使うとログイン直後の.bash_profileが遅くなってストレスフルだったのでconfigureに戻りました。。。

[^1]: https://discourse.cmake.org/t/how-to-compile-dcmake-use-openssl-off/1271
Ruby と Crystal で解く AtCoder ABC 129 D

# はじめに
*[AtCoder Problems](https://kenkoooo.com/atcoder/#/)* の Recommendation を利用して、過去の問題を解いています。
AtCoder さん、AtCoder Problems さん、ありがとうございます。

# 今回のお題
*[AtCoder Beginner Contest D - Lamp](https://atcoder.jp/contests/abc129/tasks/abc129_d)*
<font color="green">Difficulty: 1103</font>

今回のテーマ、トランスパイラ

この問題は、以前に [Ruby と Java で解く AtCoder ABC129 D 2次元配列](https://qiita.com/superrino130/items/2dc7bc639c8e46e08ab1) で解いております。Rubyにとって、速度的にきびしい問題です。

今回、Ruby のコードを Crystal のコードに手動トランスパイラしたところ、`1281 ms`->`227 ms`に改善しました。将来、自動でトランスパイラされるとうれしいです。

# Ruby -> JavaScript
Rubyでトランスパイラといえば`Opal`
Ruby関連書籍の発刊がさびしいなか、2020年5月に [『実践Opal』](https://nextpublishing.jp/book/11812.html) が出ています。
しかしながら競技プロでは、速度の改善は少ない（スクリプト言語->スクリプト言語のため）ものと考えられます。~~何かの間違いでRuby -> Javaになるとうれしい~~
# Ruby -> C
Rubyを開発されている方は、`Ruby`と`C`のマイスターなので、簡単にできる？
# Ruby -> Go
Googleが密かに開発してそう
# Ruby -> Crystal
## Crystal
```Crysta.cr
h, w = read_line.split.map { |c| c.to_i }
s = [] of Array(UInt8)
h.times do
  s << read_line.chomp.bytes
end
hs = [] of Array(Int32)
h.times do |y|
  cnt = 0
  v = [] of Int32
  w.times do |x|
    if s[y][x] == 46
      cnt += 1
    else
      cnt.times do
        v << cnt
      end
      cnt = 0
      v << 0
    end
  end
  cnt.times do
    v << cnt
  end
  hs << v
end
vs = [] of Array(Int32)
w.times do |x|
  cnt = 0
  v = [] of Int32
  h.times do |y|
    if s[y][x] == 46
      cnt += 1
    else
      cnt.times do
        v << cnt
      end
      cnt = 0
      v << 0
    end
  end
  cnt.times do
    v << cnt
  end
  vs << v
end
max = 0
h.times do |i|
  w.times do |j|
    max = hs[i][j] + vs[j][i] if max < hs[i][j] + vs[j][i]
  end
end
puts max - 1
```
```Array.cr
h, w = read_line.split.map { |c| c.to_i }
s = [] of Array(UInt8)
```
標準入力と配列の初期化が変わっているだけで、違和感ないです。
## Ruby
```Ruby.rb
h, w = gets.split.map(&:to_i)
s = h.times.map { gets.chomp.bytes }
hs = []
s.each do |t|
  cnt = 0
  v = []
  t.each do |x|
    if x == 46
      cnt += 1
    else
      cnt.times do
        v << cnt
      end
      cnt = 0
      v << 0
    end
  end
  cnt.times do
    v << cnt
  end
  hs << v
end
vs = []
s.transpose.each do |t|
  cnt = 0
  v = []
  t.each do |x|
    if x == 46
      cnt += 1
    else
      cnt.times do
        v << cnt
      end
      cnt = 0
      v << 0
    end
  end
  cnt.times do
    v << cnt
  end
  vs << v
end
max = 0
h.times do |i|
  w.times do |j|
    max = hs[i][j] + vs[j][i] if max < hs[i][j] + vs[j][i]
  end
end
puts max - 1
```
元となったコードです。

||Ruby 2.7.1|Crystal 0.33.0|
|:--:|:--:|:--:|:--:|
|コード長 (Byte)|710|811|
|実行時間 (ms)|1281|227|
|メモリ (KB)|158448|58176|
約5倍速くなっています。
# まとめ
+ ABC 129 D を解いた
+ Crystal に詳しくなった
pandas読込

# 読込〜格納確認

```python
# Pandasの読み込み
import pandas as pd

# ファイルの読み込み
df = pd.read_csv('bank.csv')

# .tsv形式 sepの指定が必要
# df = pd.read_csv('data.tsv', sep = "\t")

# 格納の確認
df.head() # 上から
# df.tail() # 下から
```

# 中身の確認

```python
# 中身の確認
print(df.info()) # 全体
print(df.shape) # 行数と列数
print(df.dtypes) # データタイプ
print(df.columns) # 説明変数
```
統計量の確認

```python
# 数値型の統計量
# count mean std min Quartile
df.describe()

# object型の統計量
# count unique top freq
df.describe(include=[object])
```

# 欠損確認

```python
# 欠損値

# 行(axis=1)に欠損値が含まれるか
print(df.isnull().any(axis=1))
# 欠損値個数
print(df.isnull().sum(axis=1))
# 多いもの順にソート
print(df.isnull().sum(axis=1).sort_values(ascending=False))


print("===========================================")

# 列(axis=0)に欠損値が含まれるか
print(df.isnull().any(axis=0))
# 欠損値個数
print(df.isnull().sum(axis=0))
# 多いもの順にソート
print(df.isnull().sum(axis=0).sort_values(ascending=False))
```
画像クリック時にフォームを増やす

# はじめに
本記事の内容は学習の備忘録になります。

## 実装概要
- 画像をクリックしてフォームのinputタグを増やす。
- inputタグのid,placeholderの番号を連番にする。
- cssは省略

## demo
![form_add.mov.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526620/5eca394e-35f4-a0b3-feed-068112ba7318.gif)





## 内容

まずはHTMLでフォームを作成

```html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <link rel="stylesheet" href="style.css">
</head>
<body>
  <form action="" method="POST">
    <div>
      <input type="text" id="text" placeholder="フォーム-0">
    </div>
    <!-- ボタンで増やす場合　-->
    <!-- <input type="button" value="フォーム追加" onclick="addForm()"> -->
  </form>
  <script src="main.js"></script>
</body>
</html>
```

肝心なJS部分。

```javascript

function addForm() {
  let i = 1 ;
  let input_data = document.createElement('input');
  input_data.type = 'text';
  input_data.id = 'inputform_' + i;
  input_data.placeholder = 'フォーム-' + i;
  let parent = document.getElementById('form_area');
  parent.appendChild(input_data);
  i++ ;
}
```
【Swift】プロトコルエクステンションについて

型に機能を追加する際にextension(エクステンション)を使用しますが、
エクステンションはプロトコルにも定義でき、これを**プロトコルエクステンション**と言います。

プロトコルエクステンションは、
プロトコルが要求するインターフェースを追加するのではなく、
**プロトコルに実装を追加するものになります。**

##定義方法
プロトコルエクステンションを定義するには、`extensionキーワード`を使用します。

```swift

extension プロトコル名 {
    対象のプロトコルに実装する要素
}
```
次のサンプルコードでは、
Protocolプロトコルでnameプロパティとvalueプロパティを要求しています。
そこにエクステンションで実装を追加します。

エクステンションで追加した機能は準拠している型で実装する必要がありません。

```swift

protocol Protocol {
    var name: String { get }
    var value: Int { get }
}

extension Protocol {
    var product: String {
        return "\(name)は\(value)円です。"
    }
}

struct Sample: Protocol {
    var name: String
    var value: Int
}

let sample = Sample(name: "圧力鍋", value: 7000)
print(sample.product)

実行結果
圧力鍋は7000円です。
```

##デフォルト実装による実装の任意化
プロトコルに定義されているインターフェースに対して
プロトコルエクステンションで実装を追加すると、
**プロトコルに準拠する型での実装は任意となります。**

準拠する型が実装を再定義しなかった場合は
プロトコルエクステンションの実装が使用されるため、これを**デフォルト実装**と言います。

次のサンプルコードでは、
Protocolプロトコルにプロパティを３つ用意しています。

**そのうちnoteプロパティはOptional\<String>型にし、
このプロパティ内に値が入っているかどうかで出力結果を変えます。**

Protocolプロトコルに対しエクステンションで実装の追加をしています。
今回の場合は、２つデフォルト実装を追加しています。

**① noteプロパティのゲッタでnilを返すようにしています。
② productプロパティを追加しnoteプロパティがnilでない時のみ出力を変えてます。**

その後、Book型とKitchenware型を定義し
Kitchenware型のみnoteプロパティに対して値を入れました。

なので２つの型の出力が変わってきます。

```swift

protocol Protocol {
    var name: String { get }
    var value: Int { get }
    var note: String? { get }
}

extension Protocol {
    var note: String? {
        return nil
    }
    
    var product: String {
        var messages = "商品名:\(name)\n価格:\(value)"
        if let note = note {
            // noteがnilじゃなかった時に実行される
            messages += "\n注意事項:\(note)"
        }
        return messages
    }
}

struct Book: Protocol {
    var name: String
    var value: Int
    // noteはnilのまま
}

struct Kitchenware: Protocol {
    var name: String
    var value: Int
    // noteに値が入った状態
    var note: String? {
        return "取り扱いにご注意ください。"
    }
}

let naruto = Book(name: "NARUTO", value: 600)
let knife = Kitchenware(name: "包丁", value: 3000)

print(naruto.product)
print("----")
print(knife.product)

実行結果
商品名:NARUTO
価格:600
----
商品名:包丁
価格:3000
注意事項:取り扱いにご注意ください。
```

このようにデフォルト実装を与えて実装を任意にすることにより、
**標準的な機能を提供しつつもカスタマイズの余地を与えることができます。**

以上でプロトコルエクステンションの説明を終了します。

プロトコルは異なる型どうしに共通のプロパティやメソッドを定義し、
さらに連想型などによってそれらの型の関係性を記述します。

プトロコルを活用することで、複数の型を共通のインターフェースで扱え、
**より簡潔で拡張性の高いプログラムを記述できます。**

なので、プロトコルを使いこなすことができれば、
**コードのメンテナンス性や可読性が高くなります。**

ぜひ使えるようになりましょう！

・[【Swift】プロトコルの概念と定義方法](https://qiita.com/onishiApp/items/b23a0fcb00cb9b1527c5)
・[【Swift】プロトコルを構成する要素](https://qiita.com/onishiApp/items/b913f47436ff02dacb8f)

最後までご覧いただきありがとうございました。

他にもプロトコルについての記事がありますのでぜひご覧ください。
モジュールがPythonでインストールされているのに、Jupyter notebookではエラーになるときの解決法

# Jupyter notebook
公式サイト：https://jupyter.org/
Anacondaを使わずにインストールするときは、以下のコマンドを実行します。

```
$ pip install jupyter
```

# 発生した問題
`jupyter notebook`を使おうとしたところ、モジュールエラーが発生しました。
> ModuleNotFoundError: No module named 'numpy'

![スクリーンショット 2020-12-19 12.23.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583212/04d3cc3f-dd57-21fa-3cbf-e0c377217fe3.png)

ターミナルに`pyenv`を用いてPythonバージョンを指定して構築しましたが、
その環境と`jupyter`が一致していないのではないことが原因で発生したようでした。

# 検証
`jupyter notebook`で以下を実行すると、`site-packages`のパスを確認できます。

```
import sys
print(sys.version)
print(sys.path)
```
>3.9.1 (default, Dec 10 2020, 10:36:35) 
[Clang 12.0.0 (clang-1200.0.32.27)]
['/Users/.../Documents/GitHub/.../', 
'/usr/local/Cellar/python@3.9/3.9.1/Frameworks/Python.framework/Versions/3.9/lib/python39.zip', 
'/usr/local/Cellar/python@3.9/3.9.1/Frameworks/Python.framework/Versions/3.9/lib/python3.9', 
'/usr/local/Cellar/python@3.9/3.9.1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/lib-dynload', '', 
'/usr/local/Cellar/jupyterlab/2.2.9_1/libexec/lib/python3.9/site-packages', 
'/usr/local/Cellar/jupyterlab/2.2.9_1/libexec/lib/python3.9/site-packages/IPython/extensions', 
'/Users/.../.ipython']

ターミナルにて以下のコマンドを実行し、`Location`を確認します。

```
$ pip show numpy
Name: numpy
Version: 1.19.4
Summary: NumPy is the fundamental package for array computing with Python.
Home-page: https://www.numpy.org
Author: Travis E. Oliphant et al.
Author-email: None
License: BSD
Location: /Users/.../.pyenv/versions/3.7.7/lib/python3.7/site-packages
Requires:
```

`jupyter`では`python3.9`、ターミナルでは`3.7.7`と**異なっている**ことがわかります。
`jupyter`をターミナルに揃えたいと思います。

# 解決
ターミナルにて、以下のコマンドを実行します。

```
$ python -m ipykernel install --user --name=python3.7.7 --display-name=python3.7.7
Installed kernelspec python3.7.7 in /Users/.../Library/Jupyter/kernels/python3.7.7
```
`--name`や`--display-name`は適宜設定します。指定したいバージョンに合わせてネーミングすると良いと思います。

* `name`は`kernel`の情報が入るディレクトリの名前
* `display-name`は`jupyter`上での表示名

コマンドを実行し、以下のようなエラーが発生した場合には`ipykernel`をインストールしてください。

```
$ python -m ipykernel install --user --name=python3.7.7 --display-name=python3.7.7  
/Users/.../.pyenv/versions/3.7.7/bin/python: No module named ipykernel

$ pip install ipykernel
Collecting ipykernel...
Successfully installed ... ipykernel-5.4.2
```

以下のコマンドを使うと、`jupyter`で現在登録されている`kernel`を確認できます。

```
$ jupyter kernelspec list
Available kernels:
  python3        /usr/local/Cellar/jupyterlab/2.2.9_1/libexec/lib/python3.9/site-packages/ipykernel/resources
  python3.7.7    /Users/.../Library/Jupyter/kernels/python3.7.7
```

`jupyter notebook`にて、ターミナルと同じバージョンを使えるようになりました。
![スクリーンショット 2020-12-19 13.48.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583212/e3f00c27-7123-8a1a-10e2-2cea661c5351.png)

既に作成しているファイルのカーネルを変更するときは、「カーネル」>「カーネルの変更」から変更できます。
![スクリーンショット 2020-12-19 14.12.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583212/3fbf02b3-76db-6e7a-a0f5-343c891e6d3c.png)


### 参考
* [Jupyter の kernel に pyenv 環境を追加する](https://qiita.com/yuki-shark/items/fba874a109f04004158b)
* [pythonでインストールされているのにインポートできません。](https://teratail.com/questions/131959)
やりたいことから逆引き！Cognitive Services を使った仕組みを作れる Microsoft Learn コレクション by Cogbot コミュニティ

Azure (& マイクロソフト製品) の公式ハンズオンである [Microsoft Learn](https://docs.microsoft.com/ja-jp/learn/) には **コレクション** と呼ばれるハンズオンのモジュールやラーニングパスのブックマーク機能があります。(作成したコレクションは他の人にもシェア可能)

本日オンラインで開催されている [Azure Rock Star](https://azurerockstar.connpass.com/) イベントで、さまざまな コミュニティ推しのコレクションが発表されています。

[Connpass > Azure Rock Star Community Day #2 - 年末年始はスキルアップ](https://azurerockstar.connpass.com/event/195321/)

こちらでは [Cogbot コミュニティ](https://cogbot.connpass.com/) のコレクションをいくつか紹介します。
テーマは **やりたいことから逆引き**、〇〇を自動で実行するような仕組みを作りたいなーと思ったときに Cognitive Services のどのサービスと、Azure の他のサービスを組み合わせればよいのか逆引きできるようなコレクションを作りました。

# Challenge 1: 請求書を自動で読みとって構造化データとして活用する

[Collection Challenge #1 (Cogbot)](https://docs.microsoft.com/en-us/learn/challenges?id=ae42cf7b-501d-47a9-bf24-3e26499c0f51)

請求書など決まったフォームのデータを [Form Recognizer](https://azure.microsoft.com/ja-jp/services/cognitive-services/form-recognizer/) で読み取り(v2.1 (preview) で日本語対応OK)、[Cosmos DB](https://azure.microsoft.com/ja-jp/services/cosmos-db/) に格納します。請求書の元データ(JPG,PNG,PDFなど) は [Blob Storage](https://docs.microsoft.com/ja-jp/azure/storage/blobs/storage-blobs-introduction) にアップロード、Blob Trigger で [Azure Logic App](https://azure.microsoft.com/ja-jp/services/logic-apps/) ([Azure Function](https://azure.microsoft.com/ja-jp/services/functions/) でもいいと思います) を稼働させ、Form Recognizer での読み取り → Cosmos DB に保存します。
![cogbot_MSLearnCollection_202012_01.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/fdf69f98-8845-6871-4a6f-0bfd33d0fc23.png)

# Challenge 2: 問い合わせメールをDBに保存、緊急性の高いものは優先対応

[Collection Challenge #2 (Cogbot)](https://docs.microsoft.com/en-us/learn/challenges?id=52b29ad3-7958-4655-b0a8-6342b49adb41)

お客様からのメールの内容を DB に自動保存するという自動化プロセスに、内容の分析を追加するシナリオです。メール本文 (Body) を [Text Analytics](https://azure.microsoft.com/ja-jp/services/cognitive-services/text-analytics/) でセンチメント分析(ネガポジ)、[Language Understanding](https://azure.microsoft.com/ja-jp/services/cognitive-services/language-understanding-intelligent-service/) でキーワード抽出(Entity)や文意のクラス分け(Intent) を行い、ネガティブ and|or 特定キーワードがあれば担当者にメールを転送します。これらは [Azure Logic App](https://azure.microsoft.com/ja-jp/services/logic-apps/) のコネクターで自動化ができます。

![cogbot_MSLearnCollection_202012_02.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/d7fd6bb4-2aa4-da5e-ee23-427c040fef76.png)

# Challenge 3: 写真を整理＆タグ付けして検索可能にする

[Collection Challenge #3 (Cogbot)](https://docs.microsoft.com/en-us/learn/challenges?id=4ed91deb-11fb-403b-8c2e-ca198ae5b4bf)

写真の整理を自動化するシナリオです。写真からオブジェクト検出、タグ抽出など、テキスト情報を追加しながら [Cognitive Search](https://azure.microsoft.com/ja-jp/services/search/) に取り込んで縦横無尽に(?)検索できるようにします。(Cognitive Search の データ読み込み＆Index作成時に Cognitive Services や Web API などを追加できます) 

![cogbot_MSLearnCollection_202012_03.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/7bc5fe85-cc27-b902-8e1a-2f4213ccc2c7.png)
配列、vectorの定義をアドレス、参照を用いて行う

# 目的
配列、vectorの定義をアドレス、参照を用いて行う。
# 言語
C++, GCC
# 例
```cpp

#include <bits/stdc++.h>
#include <fstream>
using namespace std;

int main(){
    int *a;
    int b[5]={1,2,3,4,5};
    a = b;
    // 3が出力される
    cout << a[2] << endl;
}
```
VScode![スクリーンショット 2020-12-19 125746.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/898251/6c14593b-d792-6f34-e7c3-a04977909293.png)

*aは1となっており、a=bとなったのでbと同じアドレスがaに代入されて、aも配列のように扱うことができました。

```cpp
b[5] = {1,2,3,4,5}
// (アドレス)[予約するアドレス領域(何個分)] = {初期化}
```
上のイメージで解釈しています。

以下に参照渡しのコードを示します。

```cpp

#include <bits/stdc++.h>
#include <fstream>
using namespace std;

int main(){
    int b[5]={1,2,3,4,5};
    const auto& a = b;
    // 3が出力される
    cout << a[2] << endl;
}
```
注意点は以下になります。

以下のコードはエラーとなる。

```cpp

#include <bits/stdc++.h>
#include <fstream>
using namespace std;

int main(){
    const auto& a;
    int b[5]={1,2,3,4,5};
    // 3が出力される
    cout << a[2] << endl;
}

```
参照渡しの場合、あらかじめ用意されたアドレスを定義段階で代入しないとだめです。
また、参照渡しの場合はconst auto& という書き方が一般的なようです。(constはより安全、autoはコンパイラに型を自動判断してもらえるため。)

また余談ですが、アドレスや参照の定義の仕方は以下の覚え方がおすすめです。(どなたか聡明な方が書いていました)

![Inkedスクリーンショット 2020-12-19 135121c_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/898251/18aec8de-0335-4ed0-e8a8-bf11de30534b.jpeg)

アンパサンドやアスタリスクはその直前までの言葉がすべてかかってくる。

## 参照渡しとアドレス渡しの違い

参照渡しとアドレス渡しの違いですが、デバッグしてみるとわかります。

- アドレス渡しの時

![Inkedスクリーンショット 2020-12-19 125746_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/898251/cd0ecf98-ca07-9119-532c-3d29bf1d2662.jpeg)
- 参照渡しの時

![Inkedスクリーンショット 2020-12-19 134223_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/898251/af21dcb4-3804-be8f-4a31-87997d44226b.jpeg)

アドレス渡しではアドレスを渡された変数aはアドレスを保持している変数でしたが、参照渡しでは配列ごとコピーしていることがわかります。

また、vectorでも同じことができます。これはvectorが動的配列であることを考えれば当たり前かもしれません。

- 参照渡し

![スクリーンショット 2020-12-19 135121.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/898251/7f4d39b9-fbad-1ebc-2f0d-a94835dd4a18.png)

# まとめ
配列とアドレスは定義している実体は変わらない。
ここまで読んでいただきありがとうございました。
atcoderのテスト自動化ツールの使用方法(oj)

ojの使い方メモ

参考：
https://github.com/online-judge-tools/oj/blob/master/docs/getting-started.ja.md

###1.インストールと確認

```
pip3 install --user online-judge-tools
oj --version
```

###2.テストケースのダウンロード

```
oj d [atcoderの問題URL]

<例>
oj d https://atcoder.jp/contests/abc132/tasks/abc132_b
```

###3.テスト

```
oj t -c "python3 [ファイル名]" -d [ダウンロードしたテストファイルのフォルダ]

<例>
oj t -c "python3 ./132B_Ordinary_Number.py" -d ./test

※./a.out 以外のコマンドは-cオプションが必要。
```
要求と仕様

　タスクとして技術ドキュメントの作成や文書体系の検討をしているところで、特に要求書について伝わるドキュメントの書き方についてあらためて考えている。そこで、前職で取り組んだ「変更要求仕様書」の記述法であるUSDM（Universal Specification Describing Manner）の解説から、ポイントをまとめてみる。

##「要求」と「仕様」
　要求サイドのドキュメントを見ていると要求と仕様がごちゃまぜになっていることがある。両者には違いがあり、そこを意識してドキュメントを書きたい。
### 要求[^1]
* システムに求められる機能や性能、作り方に対する品質など、実現したいことを「要求」として抽象的に表現したもの
* 機能については、振る舞いとして要求を記述する

　私は、設計したりや作ってほしいことなので、語尾に「してほしい」を加えて意味が通るように書くようにしている。

### 仕様[^1]
* 要求に含まれる “具体的”な処理や振る舞いを表現したもの
* 「仕様」は要求の中の「動詞」にある
  * “仕様”は、要求の中の「動詞」および「目的語」に存在する
  * 要求の中にある個々の「する(動詞)」に対して 具体的にどのような処理を(する) べきかを記述する

## USDM
 USDMは、要求を仕様をセットとして構造化した記述法である。
### USDMの特徴[^2]
* 要求を振る舞いとして表現し、仕様はその振る舞いが及ぶ範囲の中で導き出す
* 要求と一緒に理由（要求の存在理由）を記述し、要求の意図や背景、動機を補足する
* 要求と仕様を階層で表形式で表現する

　取り組みをした当時は変更要求仕様書をExcelで作成したのだが、図をはめこみにくい、要求や仕様の追加・削除の編集が面倒くさい、USDMの記述の変更履歴を残しにくい（シートをコピーして古いシートを残したりした）というデメリットがあった。

　社内で、文書の変更履歴をトレースできるようにしたいという課題が提起され、ドキュメントはWordでなくてもいいという意見まででてきた。XMLやMarkdownで記述できればいいのかもしれない（XMLはマニュアルでは書けないけれど）


[^1]: 清水吉男（派生開発推進協議会 ）:[要求仕様記述手法「USDM」ってどんなの? ~明日から使えるUSDMのエッセンス~](https://swquality.jp/temp/nagasakiqdg15_usdm.pdf), 派生開発推進協議会(AFFORDD) USDM勉強会資料
[^2]: SRA 粟生木徹:[USDMを用いた上流での品質作り込み](https://www3.sra.co.jp/public/sra/event_seminar/seminar2014/140905-h/SRA_Seminar_140905-2.pdf), (2014)
pacmanでパッケージ名のみを完全一致で検索する

pacmanでパッケージ名のみを完全一致で検索したい。
`-Ss`などは説明まで含んでしまうので適切ではない。
そのため`-Fq`や`grep`を使用して無理やり検索します。

```bash
function searchpkg(){
    if pacman -Ssq "${1}" 2>/dev/null | grep -o "^${1}*\$" 1>/dev/null; then
        return 0
    else
        return 1
    fi
}
```
環境構築で最も役に立ったlocateコマンドを紹介する

#前書き

**環境構築をしていた中で最も活躍したと思われるlocateコマンド**のインストール方法とその使い方について紹介します。

#locateコマンドとは

lcoateコマンドとは検索用のデータベースを構築することでfindコマンドより**高速にファイルやディレクトリを検索することのできるコマンド**です。

#locateコマンドの使い方

使い方は簡単です。以下のようにすると.zprofileファイルを検索することができます。[^1]

```zsh
% locate .zprofile
```

他にもオプションがあるので、詳しくはmanコマンドで調べてください。

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

##Ubuntuの場合

Ubuntu 18.04.5 LTSで動作確認しました。以下のaptコマンドによりインストールすることができます。

```bash
$ sudo apt install mlocate
```

インストールした後にデータベースを作成する必要があります。以下のコマンドを打てばデータベースを作成できます[^2]$^{,}$[^3]。

```bash
$ sudo updatedb
```


また、データベースの更新頻度の設定ファイルは`/etc/cron.daily/mlocate`です。デフォルトでは`/etc/cron.daily`にあるファイルで設定されている場合は毎日実行されますが、その更新頻度や時間は`/etc/anacrontab`を確認してください。

さらに、ファイルやディレクトリの変更をした後に探す場合は**データベースを自分でアップデートする必要**があるので、`sudo updatedb`でアップデートしてください[^3]。

##Macの場合



Mac 11.0.1で動作確認しました。Ubuntuよりも多少インストールが面倒かもしれません。

まず、`locate (適当なファイル名)`を実行しようすると、以下のようなWarinigが出るので、書かれている通りのコマンドをコピペします。


```zsh
% locate (適当なファイル名)
WARNING: The locate database (/var/db/locate.database) does not exist.
To create the database, run the following command:
 
  sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.locate.plist
 
Please be aware that the database can take some time to generate; once
the database has been created, this message will no longer appear.

% sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.locate.plist
```

上記のコマンドを打つことでデータベースが作成されます。**ターミナル上ではすぐに終わっているように見えますが裏でデータベースが作成されてい**るので、数分後にlocateコマンドでの検索が有効になります。

また、データベースの更新頻度の設定ファイルは`/System/Library/LaunchDaemons/com.apple.locate.plist`です[^4]。デフォルトでは週に一回更新されています。

さらに、ファイルやディレクトリの変更をした後に探す場合は**データベースを自分でアップデートする必要**があるので、以下のコマンドでアップデートしてください[^3]。

```zsh
% sudo /usr/libexec/locate.updatedb
```

コマンドが長くて面倒な場合は以下のように`.zprofile`にaliasを設定しておけば`updatedb`のみ打てばアップデートできるようになります。

```zsh:.zprofile
#updatedb settings
alias updatedb="sudo /usr/libexec/locate.updatedb"
```


[^1]: 正確には.zprofileを含む絶対パス(文字列)を探してきます。


[^2]: locateコマンドもupdatedbコマンドも自分の環境では`/usr/bin`にあるので、`sudo updatedb`ができない場合は`/usr/bin`へのパスが通っていないと思われます。

<!--
また、`/usr/bin/locate`,`/usr/bin/updatedb`はそれぞれ`/etc/alternatives/locate`,`/etc/alternatives/updatedb`へのシンボリックリンク
-->

#参考

[Is there a way to use update command to locate files on OS X without having to run updatedb manually?](https://apple.stackexchange.com/questions/228164/is-there-a-way-to-use-update-command-to-locate-files-on-os-x-without-having-to-r)


[^3]: 数分かかります。

[^4]: `man locate.updatedb`で確認できます。
Pythonをexe化した話

#Pythonをexe化した話
##はじめに
　以前製作した[Pythonでシンセサイザーを作って演奏する。](https://qiita.com/menow2525/items/7f743a68792c05189d78)で紹介したシンセサイザーをexe化してwindowsで使えるようにした話です。興味ある方はぜひ読んでみてください。
　記事を投稿して、それ以降も少しずつ更新して自分が使いやすいソフトに仕上げました。
　それでもまだ使うときにはPythonのコマンドを叩くかIDEからデバッグするしかなかったのが面倒だったのでexe化してみました。

##ダウンロード
　コマンドプロンプトから音楽スコアからの音源作成や、ギターのフレットから音階を求めるプログラムです。
　使い方等は過去の記事を読んでみてください。

　また、このexeファイル等を置くフォルダは読み込みと書き込みが両方できる状態にしておいてください。

　[ダウンロード](https://drive.google.com/drive/folders/1lEzP9rI6MzK4DO086wE2s9aKQ5TdE7Ll?usp=sharing)

##実行環境
　windows10
　python 3.9
　pyinstaller 4.1

##readme的な
###スコアファイル
　これは以前の記事や同梱のsample.txtを読んでもらえればわかると思いますので、割愛。

###ギターのフレットから音階を求める
　`Enter file name.(Enter "q", quit program, "c", check chord.)`で`c`を入力することで利用できます。
　最初の`How many strings on the guiter.(ex. 6, 12, etc...)`で弦の本数を、次の`Please enter the tuning of the 6th string with KEY and number.(ex. E1, Gs2, etc...)`でそれぞれの弦のチューニングを設定します。
　そして、`Please enter the number of the fret on the 6th string.(ex. 3, 5, etc...)`でそれぞれの弦の抑えているフレットの番号を入力することで最終的に利用されている音階とその音源が出力されます。音源はsin波の合成なので響きが汚いですが。
　なお、ミュートしている弦は`-`等の数字以外の文字で入力します。

###終了
　`Enter file name.(Enter "q", quit program, "c", check chord.)`で`q`を入力することでプログラムを終了します。

##あとがき
　exe化にpyinstallerを使ったのですが、クロスコンパイルは不可とのことだったのでUbuntuでコンパイルして使うつもりがwindowsにもPythonやそのモジュールを入れることになりました。
　一応Pythonにもコンパイラがあるようでpycというコンパイルされたファイルも存在するようです。おそらくこれを用いてexe化しているんじゃないかなと思ってますが、まだ調べてません。以降機会と時間があったら調べてみようかなと思います。
Kaggle notebookでmake_envが作れない、importできない件について

つい先日からKaggleに本格的に取り組むことになりまして、Kaggle notebookがとても便利だなと利用していました。
行っているのは「Jane Street Market Prediction」というコンペなのですが、

```
import janestreet
env = janestreet.make_env()
```

とすると、

```
ModuleNotFoundError: No module named 'janestreet'
```

このようなエラーが発生しました。
Discussionに初参加して教えてもらいましたので共有させていただきます。

# 問題

Kaggle notebookをトップページから新規作成して、Add DataでJanestreetのデータを追加した。
しかし、`import janestreet`ができず、先に進めない。

janstreetディレクトリには、`competition.cpython-37m-x86_64-linux-gnu.so`というファイルがあり、
これを呼び出すのかとも考えたがわけがわからず。

# 解決策
コンペのページから

`Notebooks`⇒`New notebook`

を選択して、始めることで、データも追加されており`import`も無事できた。
(Discussion ありがとう！)

# 最後に
Kaggleを始めようとしてもやはり環境構築でつまずくことが多く、なかなか上手くいきません。
Discussionを初めて利用しましたが、とてもよかったので今後も利用したいです。

では、Jane Street Market Predictionがんばります！
[Git]コミットしたくないけどブランチ切り替えたい時

プログラミング学習をしていて、ブランチを切り替えたいけど今いるブランチに変更履歴が残っていて、ブランチ変更できない！！そんな時はどうするのがいいのかを解決します！

# git stashとは
`git stash`とはGitで作業を一時的に退避させておくことができる機能です。  
stashで変更を退避させて、今すぐやりたい作業をして、退避させていた変更を戻して作業を再開することができます
# git stashの使い方
```git
$ git stash 
```
ワーキングツリー(addしてない状態)、インデックス(addしてる状態)にある変更履歴を退避する。

## 作業の内容を記載して保存する

```java:terminal
$ git stash save "comment"
```
## git stashした作業のリストを見る

```java:terminal
$ git stash list
```

過去によけた作業の一覧は`git stash list`で取得できます。  
git stashは複数保存もできるのでそのstashしたリストをターミナルに表示されます。

```java:terminal
stash@{0}: On master: マスターブランチにてbookの投稿の作業中
stash@{1}: On develop: デベロップブランチにてmap機能作業中
```

`stash@{1}`の部分はstashした順に引数が割りあてられます。
これによってあとでどのstashした内容を戻すのかを指定することができます。

## stashしておいた変更履歴を戻す

```java:terminal
git stash pop stash@{引数}
```

作業は`git stash pop`を用いて戻すことができます。
作業を止めておいた**ブランチ**に戻り、`pop`の後に一覧で見られる戻したい作業の引数を用いて`stash@{引数}`と記述し、実行します。
ここでその作業ブランチに戻らないと、コンフリクトなど面倒なことが怒るので注意が必要です。！
stashした内容を一気に戻したい時や一つしかstashしてない場合は、`git stash pop`のみで大丈夫です。

例えば、マスターブランチにてbookの投稿の作業中という内容の作業に戻りたい場合は、`git stash pop stash@{0}`とします。

## stashしておいた作業を消す

```git
$ git stash drop stash@{引数}
```

## stash内容を全て消す

```git
git stash clear
```

一覧にある全ての作業を消したいときは、`git stash clear`を使用します。  

何か間違っていること等あればよろしくお願いいたします。
[100%] FrogRiverOne (codility lessons)

> _Painless_
> ### [FrogRiverOne](https://app.codility.com/programmers/lessons/4-counting_elements/frog_river_one/)
> Find the earliest time when a frog can jump to the other side of a river.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196344/6784e873-d032-37f7-cb6e-f5a5090a645d.png)

#### タスク説明
小さなカエルが川の向こう側に行きたがっています。カエルは最初は川の一方の土手（位置0）にあり、反対側の土手（位置X + 1）に行きたいと思っています。葉が木から川の水面に落ちます。

落ち葉を表すN個の整数で構成される配列Aが与えられます。 A [K]は、時間Kで1枚の葉が落ちる位置を秒単位で表します。

目標は、カエルが川の反対側にジャンプできる最も早い時間を見つけることです。カエルは、川の1からXまでのすべての位置に葉が現れる場合にのみ交差できます（つまり、1からXまでのすべての位置が葉で覆われている最も早い瞬間を見つけたい）。川の流れの速度は無視できるほど小さいと考えることができます。つまり、葉が川に落ちると、葉の位置は変わりません。

たとえば、次のような整数X = 5と配列Aが与えられます。

```
  A [0] = 1
  A [1] = 3
  A [2] = 1
  A [3] = 4
  A [4] = 2
  A [5] = 3
  A [6] = 5
  A [7] = 4
```

2番目の6では、葉が位置5に落ちます。これは、川の向こう側のすべての位置に葉が現れる最も早い時間です。

関数を書く：

`class solution {public int solution（int X、int [] A）; }`

これは、N個の整数と整数Xで構成される空でない配列Aが与えられた場合、カエルが川の反対側にジャンプできる最も早い時間を返します。

カエルが川の反対側にジャンプできない場合、関数は-1を返す必要があります。

たとえば、X = 5で、配列Aが次のようになっているとします。

```
  A [0] = 1
  A [1] = 3
  A [2] = 1
  A [3] = 4
  A [4] = 2
  A [5] = 3
  A [6] = 5
  A [7] = 4
```

上で説明したように、関数は6を返す必要があります。

次の仮定のための効率的なアルゴリズムを記述します。

* NとXは、[1..100,000]の範囲内の整数です。
* 配列Aの各要素は、[1..X]の範囲内の整数です。

#### 解く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196344/db44ec34-6d8d-78b0-c8ca-6929e27a123c.png)

#### Program
[FrogRiverOneSolution.java](https://github.com/yp2211/algorithm/blob/main/src/codility/lessons/Lesson4_CountingElements/FrogRiverOneSolution.java)

```java:FrogRiverOneSolution.java
    public int solution(int X, int[] A) {
        int goal = -1;
        int B[] = new int[X + 1];
        java.util.Arrays.fill(B, -1);
        for (int i = 0; i < A.length; i++) {
            if (B[A[i]] < 0 || B[A[i]] > i) {
                B[A[i]] = i;
            }
        }

        for (int j = 1; j < B.length; j ++) {
            int anB = B[j];
            if (anB < 0) {
                goal = -1;
                break;
            } else {
                goal = goal < anB ? anB : goal;
            }
        }

        return goal;
    }
```

Detected time complexity:  
`O(N)`

#### jUnit
[FrogRiverOneSolutionTest.java](https://github.com/yp2211/algorithm/blob/main/test/codility/lessons/Lesson4_CountingElements/FrogRiverOneSolutionTest.java)

#### Report
[Candidate Report: training933GQH-AM9](https://app.codility.com/demo/results/training933GQH-AM9/)
***
### See also: [CodilityのLessonsをすべて解く（更新中）](https://qiita.com/yp2211/items/537f733060bb0f2aba8f)
gitブランチを使って管理しよう【初学者用】

どうも、[うったむ](https://twitter.com/pwuttam "うったむ")です。今日は開発現場でよく使われる__gitブランチ__についてまとめてみました。現場によってgitをどのように利用しているかが異なるので、確認をしてからチーム開発をしましょうね。

##主に使われているGitブランチ方法【二つ】

* GitHub Flow
* Git Flow

##GitHub Flowとは

mainと一つのブランチがあるだけの「__シンプル__」な構造です。

使い方として、以下の順番で使います。

* mainからfeatureというブランチを切って開発
* 機能の実装ができたらプルリクエストを送る
* okが出たらmainにマージ

2020年12月現在、僕は個人開発でも__GitHub Flow__を使ってます。

容易に管理できるのでおすすめ☺️

##Git Flowとは

大規模で複雑な構成でコードを管理します。大きな会社で使われることが多く、ソフトウェアの開発に適していると言われています。

サクサクとmainに新しい機能を実装できない場合、こちらを使います。

構成としては以下の5つがあります。

* main（リリース済みの本番コード）
* hotfix（mainのバグをすぐに処理したい時に）
* release（リリース用のブランチ。後にmainとdevelopに反映させる）
* develop（主に開発するために利用する）
* feature（developからブランチを切って機能の実装をする）

##まとめ

初学者、未経験者は絶対にGitとGitHubが使えると便利です。ぜひ習得しましょう。ひたすら使うことによって身につくと思います！
ミニッツリピーターを作る part.1

# ミニッツリピーターとはなにか

超スーパー高額腕時計に搭載されている機能である（元々は懐中時計に搭載されていた歴史がある）。
内部に仕込まれたゴングの音の回数で現在時刻を知らせてくれる。

>（1）時単位の数（アワー）：低音の単音で、1回＝1時から12回＝12時。
>
>（2）60分を15分単位に分割した数（クォーター）：高音と低音を交互に組み合わせて鳴らし、高音→低音の1セット＝15分、2セット繰り返し＝30分、3セット繰り返し＝45分。
>
>（3）15分に満たない残り分数（ミニッツ）：高音の単音で、1回＝1分から14回＝14分まで。
>
>　ストライク音の回数が最も多くなり、よくデモンストレーションにも使われる12時59分の例ではこうなる。
>●まず低音が12回鳴って12時。
>●続いて59分を15分単位で割ると（15分×3回）＋14分だから、高音と低音との組み合わせによるクォーターを3セット打って45分。
>●最後に残った14分を高音で14回打つ。

[ミニッツリピーターとは？ その歴史と代表的モデル](https://www.webchronos.net/mechanism/22267/)

これを実装していく。

## アルゴリズムを組む

ボタンを押したら発動する想定。
時間を数値で取得する方法は[前回の記事](https://qiita.com/antk/items/48314ed9e4d53182727f)で書いた。

```swift
  @IBAction func actionButton(_ sender: UIButton) {
    
    // 時間を数値で取得する
    let now = Date()
    let time = Calendar.current.dateComponents([.hour, .minute], from: now)

    // 時単位の数
    var hour = time.hour!

    // 24時間で取得するため、13時以降の場合は -12 する
    if hour > 12 {
      hour -= 12
    }
    
    // 60分を15分単位に分割した数
    let quarter = time.minute! / 15

    // 15分に満たない残り分数
    let minute = time.minute! % 15
    
    // whileで使うための変数
    var hourCount = 0
    var quarterCount = 0
    var minuteCount = 0

    // 第一ゴング
    while hourCount < hour {
      print("dong")
      hourCount += 1
    }
    
    // 第二ゴング
    while quarterCount < quarter {
      print("ding-dong")
      quarterCount += 1
    }
    
    // 第三ゴング
    while minuteCount < minute {
      print("ding")
      minuteCount += 1
    }
  }
```

どんくさいアルゴリズムかもしれないです。
次回は `print` をサウンドの再生に換装していきます。
GitlabとDockerでTOPPERSカーネルのデイリービルドを作ろう

# もともと
　以前の職場ではデイリービルドの環境が整っていたのですが、いざそうじゃないところに放り込まれると、環境構築ってどうやるのかから始まり、ツールチェーンの組合せをどうするかとか、いろいろ悩みます。
またローカルPCでビルドや動作確認しても、他に展開すると、「○○ Not Foundって言ってきます～」とか言われてしまいます。そんなわけで、環境構築としてのDockerコンテナが魅力を感じシフトしていったわけなのですが、CI・CDの環境としても使えるよねってことで始めました。
　コンテナー環境へシフトする前からJenkinsを使っていたのですが、Jenkins環境もコンテナ化したかったのと、いまの職場にGitlabを導入したのでJenkinsからGitlab runnerに移行しました。

# CI/CDの良いところ
OK,NGがはっきりしていて、その結果が通知されることです。
Slackに投げるように設定していますが、さぼってここ数か月Failedで放置していました…
エラーが出たらすぐに直すようにしないと段々腰が重くなります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26274/aa2f6d6e-55c5-356b-8b68-97072d51a5e4.png)

# デイリービルドの対象
TOPPERSの第3世代カーネル(ASP3,FMP3,HRP3,HRMP3)のビルドを行います。
すべてがビルドできるターゲット環境はZynq-7000になります。
Gitlab runnerの構築については書きませんので、別途調べてください。Gitlab使わなくてもDocker環境をローカルPCでインストールしても使えます。

# Dockerイメージ
ビルド環境のDockerイメージは[toppersjp/armgcc-ubuntu](https://hub.docker.com/repository/docker/toppersjp/armgcc-ubuntu)を使います。
すべてを確認していませんが、TOPPERS第3世代のARM系ターゲットの開発環境に対応できていると思います。
QEMUも入れています。（athrillは開発スピードが速いので別パッケージにしています）
Dockerファイルは[Github](https://github.com/mitsut/docker-toppers-arm-qemu)にありますので、カスタマイズしたい方はこちらかForkして使ってください。

# .gitlab-ci.yml
こんな感じで書きます。（実際に使用しているファイルから一部変更しています）
gitlab-ciのコマンドはシェルスクリプトとかなり近いので比較的楽に取り掛かれると思います。

```
image: toppersjp/armgcc-ubuntu:7-2018-q2

stages:
    - build

daily build_asp3:
    stage: build
    tags:
        - ci-asp
    script:
        - wget https://www.toppers.jp/download.cgi/asp3_zybo_z7_gcc-20191009.zip
        - unzip asp3_zybo_z7_gcc-20191009.zip
        - mv asp3_3.5 asp3
        - wget https://www.toppers.jp/download.cgi/tecsgen-1.7.0.tgz
        - tar xfz tecsgen-1.7.0.tgz
        - cp -rf tecsgen-1.7.0/tecsgen/ asp3/.
        - cp -rf cfg asp3/.
        - mkdir -p /home/asp3/obj; cd /home/asp3/obj
        - ../configure.rb -T zybo_z7_gcc
        - make
```
これで実行するとビルドの確認ができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26274/6084d8d5-a7c6-37c8-337f-b7cad03d1b07.png)

パイプラインのパスのバッジをREADME.mdにつけてゲットしましょう！

gitlab-ciの場合はmdファイルにこんな感じで記述します。

```
[![build status](https://(gitlabリポジトリ)/badges/master/pipeline.svg)](https://(gitlabリポジトリ)/commits/master)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26274/7d049259-81be-711c-887b-cbf440a305e0.png)
[100%] TapeEquilibrium (codility lessons)

> _Painless_
> ### [TapeEquilibrium](https://app.codility.com/programmers/lessons/3-time_complexity/tape_equilibrium/)
> Minimize the value |(A[0] + ... + A[P-1]) - (A[P] + ... + A[N-1])|.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196344/1cec2a6a-f4b3-574c-c8ec-189e429c9240.png)

#### タスク説明
N個の整数で構成される空でない配列Aが与えられます。配列Aは、テープ上の数字を表します。

0 <P <Nのような任意の整数Pは、このテープを2つの空でない部分に分割します：A [0]、A [1]、...、A [P −1]およびA [P]、A [ P + 1]、...、A [N −1]。

2つの部分の違いは、次の値です。|（A [0] + A [1] + ... + A [P − 1]）−（A [P] + A [P + 1] +.。 。+ A [N − 1]）|

言い換えれば、それは最初の部分の合計と2番目の部分の合計の間の絶対差です。

たとえば、次のような配列Aについて考えてみます。

```
  A [0] = 3
  A [1] = 1
  A [2] = 2
  A [3] = 4
  A [4] = 3
```

このテープは4つの場所に分割できます。

```
P = 1、差= | 3 − 10 | = 7
P = 2、差= | 4 − 9 | = 5
P = 3、差= | 6 − 7 | = 1
P = 4、差= | 10 − 3 | = 7
```

関数を書く：

`class solution {public int solution（int [] A）; }`

これは、N個の整数の空でない配列Aが与えられた場合、達成できる最小の差を返します。

たとえば、次のようになります。

```
  A [0] = 3
  A [1] = 1
  A [2] = 2
  A [3] = 4
  A [4] = 3
```

上で説明したように、関数は1を返す必要があります。

次の仮定のための効率的なアルゴリズムを記述します。

* Nは[2..100,000]の範囲内の整数です。
* 配列Aの各要素は、[-1,000..1,000]の範囲内の整数です。

---
#### 解く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196344/f02faaf8-7a59-6aa4-b627-3f00d697180b.png)

#### Program 
[TapeEquilibriumSolution.java](https://github.com/yp2211/algorithm/blob/main/src/codility/lessons/Lesson3_TimeComplexity/TapeEquilibriumSolution.java)

```java:TapeEquilibriumSolution.java
    public int solution(int[] A) {
        int difference = 0;
        int sumPart1 = 0;
        int sumPart2 = 0;
        int sum = 0;

        for (int i = 0; i < A.length; i++) {
            sum += A[i];
        }

        sumPart1 = A[0];
        sumPart2 = sum - sumPart1;
        difference = Math.abs(sumPart1 - sumPart2);
        for (int p = 2; p < A.length; p++) {
            sumPart1 += A[p - 1];
            sumPart2 -= A[p - 1];
            int temp = Math.abs(sumPart1 - sumPart2);
            if (temp < difference) {
                difference = temp;
            }
        }

        return difference;
    }
```

Detected time complexity:  
`O(N)`

#### jUnit
[PermCheckSolutionTest.java](https://github.com/yp2211/algorithm/blob/main/test/codility/lessons/Lesson4_CountingElements/PermCheckSolutionTest.java)

#### Report
[Candidate Report: trainingAVSN2R-5SF](https://app.codility.com/demo/results/trainingAVSN2R-5SF/)
***

### See also: [CodilityのLessonsをすべて解く（更新中）](https://qiita.com/yp2211/items/537f733060bb0f2aba8f)
[100%] PermMissingElem (codility lessons)

> _Painless_
> ### [PermMissingElem](https://app.codility.com/programmers/lessons/3-time_complexity/perm_missing_elem/)
> 指定された順列で欠落している要素を見つけます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196344/acbbf995-cecb-5cc7-04f2-7f0a27879b98.png)

#### タスク説明
N個の異なる整数で構成される配列Aが与えられます。 配列には[1 ..（N + 1）]の範囲の整数が含まれています。これは、1つの要素が欠落していることを意味します。

あなたの目標は、その欠けている要素を見つけることです。

関数を書く：

class solution {public int solution（int [] A）; }

配列Aが与えられると、欠落している要素の値を返します。

たとえば、次のような配列Aが与えられます。

```
   A [0] = 2
   A [1] = 3
   A [2] = 1
   A [3] = 5
```

欠落している要素であるため、関数は4を返す必要があります。

次の仮定のための効率的なアルゴリズムを記述します。

* Nは[0..100,000]の範囲内の整数です。
* Aの要素はすべて別個のものです。
* 配列Aの各要素は、[1 ..（N + 1）]の範囲内の整数です。

---

#### 解く

#### Program【案１：Arrays.sort】
[PermMissingElemSolutionSort.java](https://github.com/yp2211/algorithm/blob/main/src/codility/lessons/Lesson3_TimeComplexity/PermMissingElemSolutionSort.java)

```java:PermMissingElemSolutionSort.java
    public int solution(int[] A) {
        if (A.length == 0) return 1;

        java.util.Arrays.sort(A);
        for (int i = 0; i < A.length; i++) {
            if ((i + 1) != A[i]) return i + 1;
        }
        return A.length + 1;
    }
```
Detected time complexity:  
`O(N) or O(N * log(N))`

#### jUnit
[PermMissingElemSolutionSortTest.java](https://github.com/yp2211/algorithm/blob/main/test/codility/lessons/Lesson3_TimeComplexity/PermMissingElemSolutionSortTest.java)

---
#### Program【案２: data bucket】
[PermMissingElemSolutionBucket.java](https://github.com/yp2211/algorithm/blob/main/src/codility/lessons/Lesson3_TimeComplexity/PermMissingElemSolutionBucket.java)

```java:PermMissingElemSolutionBucket.java
    public int solution(int[] A) {
        boolean[] bucket = new boolean[100000 + 2];
        java.util.Arrays.fill(bucket, false);
        for (int anA : A) {
            bucket[anA] = true;
        }
        for (int i = 1; i < bucket.length; i++) {
            if (!bucket[i]) {
                return i;
            }
        }

        return 1;
    }
```

Detected time complexity:  
`O(N) or O(N * log(N))`

#### jUnit
[PermMissingElemSolutionBucketTest.java](https://github.com/yp2211/algorithm/blob/main/test/codility/lessons/Lesson3_TimeComplexity/PermMissingElemSolutionBucketTest.java)

***
### See also: [CodilityのLessonsをすべて解く（更新中）](https://qiita.com/yp2211/items/537f733060bb0f2aba8f)
kotlinメモ > kotlin exposed 生のSQLを実行する



[support for native sql? · Issue #118 · JetBrains/Exposed](https://github.com/JetBrains/Exposed/issues/118)

```
TransactionManager.current().exec("select u.name, c.name from user u inner join city c where blah blah") { rs ->
     val result = arrayListOf<Pair<String, String>>()
     while (rs.next()) {
          result += rs.getString("u.name") to rs.getString("c.name") 
     }
     result
}.forEeach { ... }
or more generic

```

or more generic

```

fun <T:Any> String.execAndMap(transform : (ResultSet) -> T) : List<T> {
     val result = arrayListOf<T>()
     TransactionManager.current().exec("") { rs ->
          while (rs.next()) {
               result += transform(rs)
          }
     }
     return result
}

"select u.name, c.name from user u inner join city c where blah blah".execAndMap { rs ->
    rs.getString("u.name") to rs.getString("c.name") 
}
[100%] FrogJmp (codility lessons)

> _Painless_
> ### [FrogJmp](https://app.codility.com/programmers/lessons/3-time_complexity/frog_jmp/)
> 位置XからYへのジャンプの最小数を数えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196344/8cc4a7df-456c-3af6-4ef3-df8e33ff41b0.png)

#### タスクの説明
小さなカエルが道の反対側に行きたがっています。 カエルは現在位置Xにあり、Y以上の位置に到達したいと考えています。小さなカエルは常に一定の距離Dをジャンプします。

小さなカエルが目標に到達するために実行しなければならないジャンプの最小数を数えます。

関数を書く：

`class Solution {public int solution（int X、int Y、int D）; }`

これは、3つの整数X、Y、およびDが与えられた場合、位置XからY以上の位置へのジャンプの最小数を返します。

たとえば、次のようになります。

```
   X = 10
   Y = 85
   D = 30
```
カエルは次のように配置されるため、関数は3を返す必要があります。

* 最初のジャンプの後、位置10 + 30 = 40
* 2回目のジャンプの後、位置10 + 30 + 30 = 70
* 3回目のジャンプの後、位置10 + 30 + 30 + 30 = 100

次の仮定のための**効率的**なアルゴリズムを記述します。

* X、Y、およびDは、[1..1,000,000,000]の範囲内の整数です。
* X≤Y。

---
#### 解く


#### Program
[FrogJmpSolution.java](https://github.com/yp2211/algorithm/blob/main/src/codility/lessons/Lesson3_TimeComplexity/FrogJmpSolution.java)

```java:FrogJmpSolution.java
    public int solution(int X, int Y, int D) {
        return (int) Math.ceil ((double) (Y - X) / D);
    }
```

Detected time complexity:  
`O(1)`

#### jUnit
[FrogJmpSolutionTest.java](https://github.com/yp2211/algorithm/blob/main/test/codility/lessons/Lesson3_TimeComplexity/FrogJmpSolutionTest.java)

#### Report
[Candidate Report: trainingBFBAZF-EXF](https://app.codility.com/demo/results/trainingBFBAZF-EXF/)

---
### See also: [CodilityのLessonsをすべて解く（更新中）](https://qiita.com/yp2211/items/537f733060bb0f2aba8f)
【教材】JavaScriptの教材を作ってみました3　〜クラス構文〜

※当方駆け出しエンジニアのため、間違っていることも多々あると思いますので、ご了承ください。また、間違いに気付いた方はご一報いただけると幸いです。

半人前のくせに、偉そうに教材を作ってみました。

####学べる技術
- クラス構文
- 継承
- コンストラクタ
- インスタンス化

##問題１
Humanクラスをインスタンス化してhumanインスタンスを作成し、
コンソールにTaroと出力するようメソッドを呼び出してください。

```js
class Human {
  constructor(name) {
    this.name = name;
  }
  sayName() {
    console.log(this.name);
  }
}
```
<details><summary>回答例</summary><div>

```js
let human = new Human("Taro"); 
//インスタンス作成時に引数で渡した値がコンストラクタの引数となります。
human.sayName();

//Taro

```
</div></details>




##問題２
```js
{
  let name = "Taro";
  console.log(`Mr.${name}`);
}

{
  let name = "Ken";
  console.log(`Mr.${name}`);
}
//Taro
//Ken
```
類似する二つの処理をクラスにまとめて下さい。
同じ結果になるように、作成したクラスをインスタンス化してください。

<details><summary>回答例</summary><div>

```js
class CallName {
  constructor(name) {
    console.log(`Mr.${name}`);
  }
}

let callName1 = new CallName("Taro");
let callName2 = new CallName("Ken");

//コンストラクター関数に定義された処理は、インスタンス化されたと同時に実行されます。

```
</div></details>

##問題3
```js
class Human {
  constructor(name) {
    this.name = name;
  }
  sayName() {
    console.log(this.name);
  }
}
```
Humanクラスを継承するBabyを作成し、Babyクラスからインスタンを作成しsayNameメソッドを呼び出した場合

//Ken
//Ongya

とコンソールに出力されるプログラムを作成してください。(kenの部分は親メソッドを利用してください）


<details><summary>回答例</summary><div>

```js
class Baby extends Human {
//コンストラクタ関数を定義しない場合、スコープチェーンにより親のコンストラクタ関数が呼び出される。
  sayName() {
    super.sayName();
    console.log("Ongya");
  }
}

let baby = new Baby("Ken");
baby.sayName();
```
</div></details>

※回答例はあくまで一例です。あまり鵜呑みにしないでください。

参考:

[【JavaScript】クラス構文について １]
(https://qiita.com/sho_U/items/aaf31fad5394edb70861)
[【JavaScript】クラス構文について 2 〜継承〜](https://qiita.com/drafts/a7bd8d1eaff67ddb250d/edit)