OmniAICreator/Qiita-1.07M huggingface dataset:
ビット演算 右シフトを使って列挙する方法

# ビット演算 右シフトを使って組み合わせを列挙する方法

## 目的
競技プログラミングでよく出てくる右シフト演算を使ってパターンを列挙するみたいな方法を自分用にメモっておく

## 例題
[AtCoder Beginner Contest 079](https://atcoder.jp/contests/abc079)の[C問題](https://atcoder.jp/contests/abc079/tasks/abc079_c)などがそう。
問題としては、A,B,C,Dの4つの変数が与えられて、`A op1 B op2 C op3 D = 7`となるような演算子(+か-)をop1,op2,op3に入れる。
例えば、A=1,B=2,C=2,D=2の場合、`A + B + C + D = 7`になるので、op1,op2,op3全て+となる。

## ビット演算の導入
この問題で出てくる組み合わせは以下

| op1 | op2 | op3 |
| :---: | :---: | :---: |
| - | - | - |
| + | - | - |
| - | + | - |
| + | + | - |
| - | - | + |
| + | - | + |
| - | + | + |
| + | + | + |

これを3bitだとみて、2進数を10進数にすると以下のようになる(逆でわかりずらくてすみません)

| 1ビット目 | 2ビット目 | 3ビット目 | 10進数 |
| :---: | :---: | :---: | :---: |
| 0 | 0 | 0 | 0 |
| 1 | 0 | 0 | 1 |
| 0 | 1 | 0 | 2 |
| 1 | 1 | 0 | 3 |
| 0 | 0 | 1 | 4 |
| 1 | 0 | 1 | 5 |
| 0 | 1 | 1 | 6 |
| 1 | 1 | 1 | 7 |

ではどうやって、この組み合わせを列挙できるのか。

## 実装
Pythonで書くとこんな感じかと。

```python
N = 3
for i in range(2**N): 
  ops = ""
  for j in range(N):
    if (i>>j) & 1:
      ops += "+"
    else:
      ops += "-"
  print(ops)
```

出力はこんな感じで、全部列挙できてる

```
---
+--
-+-
++-
--+
+-+
-++
+++
```

## 何をやってるのか
`(i>>j) & 1`だけ見ればいい。
`(i>>j)`はiをjビット右シフトする。右シフトに関しては[これ](https://www.javadrive.jp/python/num/index4.html)

iをjビットずらすとこんな感じ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175223/c369ca6b-18a2-e9c7-1e9a-fbb1849e0d2f.png)

`i>>j & 1`のようにiをjビットずらして、1とアンド取るとどうなるか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175223/a7520f07-63b3-8142-6160-1b422ee1516f.png)

このように列挙することができた。
初心者がdotfileを管理しようと調子に乗ったら詰まった話

## はじめに
当記事ではdotfile管理についてはほぼ触れません。
シンボリックリンクを貼ったのに読み込まなかった話をするのみとなります。なお、dotfile管理にて当方が参考にさせていただいた記事は下記となります。
@massy22様
[dotfilesを管理しよう](https://qiita.com/massy22/items/5bdb97f8d6e93517f916)

## 環境
OS : Ubuntu 20.04 LTS
シェル : fish version 3.1.0
git version 2.25.1

## いきさつ
最近、bashを使いつつfishをメインにしたvimやらgitやらを毎日つかうようになったくらいで「あれ？　これもうそろそろ初心者じゃなくね？」と調子の波にノリノリで乗っていたところ、もろもろのdotfile（"."で始まる隠しファイル群のことらしいです）をGithubで管理すれば何かと便利という情報を知ったため、さっそくやってやろうとしたら詰まりました。
シンボリックリンクを貼ったのにbashrcもvimrcも全く反応していなかったのです。

## 結論
dotfileを格納すべきディレクトリを`dotfiles`とすべきところ、何故かなんとなく`.dotfiles`としていたのが原因だったようです。

```
### NG ###

.dotfiles
  |  .bashrc
  │  .profile
  │  .vimrc
  └─.config
     └fish
        config.fish
```
```
### OK ###

dotfiles
  |  .bashrc
  │  .profile
  │  .vimrc
  └─.config
     └fish
        config.fish
```
`dotfiles`として隠し属性を失くすと読み込んでくれるようになりました。

リンク先の隠しファイルが隠しディレクトリにあるとNGなのでしょうか...
タスクの粒度に拘るわけ

皆さんはタスクの粒度（大きさ：時間）をどの程度を推奨していますか？
私は可能な限り小さく、できれば一時間程度を目標にしてくださいとアドバイスします。
##タスクの粒度を一時間程度にする効果（期待）
・製造設計と同じ効果を期待できる。（作り方の共有ができる）
・タスクチケットを取ってから考える行動が無く、直ぐに作業に入れる。（可動率（べきどうりつ）の向上）
・おのずとソースコードステップ数が少なくなるので、品質が良くなる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621379/21f3c1d5-39b3-08b6-76b8-92661e5d0bfa.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621379/902a820f-d2f6-0737-7600-3dd626ddfbbf.png)

・休息タイミングが取りやすくなる（集中とリラックスのリズムが作れる）
・他のペアと同期がとりやすくなる
・開発対象となるプロダクトバックログの内容把握のレベルが判る。（小さく分解できないのは、内容把握に問題がある。）
・日々のアウトプット意識が高まります。（チーム全員が在宅ワークしている時には、良い効果を与えます）

最後に、タスク分割はソフトウェア開発だけでなく、ホワイトカラー全般に適応可能ですし、強くレコメンドします。
Github：Windowsで複数のアカウント情報をキャッシュ（HTTPS経由）


# 前提条件

- Windows10での利用。
- Git for Windowsはインストール済み。([▶ 公式サイト](https://gitforwindows.org/))
- HTTPS経由での操作。（[▶ Githubの推奨](https://help.github.com/ja/github/using-git/which-remote-url-should-i-use#cloning-with-https-urls-recommended)）

# 1. アカウント情報のキャッシュ設定

- Windows Credential Manager（資格情報マネージャ）にアカウント情報を保存するように設定。

```sh
git config --global credential.helper wincred
```

- 同一ドメインで複数アカウントを保存できるように設定。

```sh
git config --global credential.useHttpPath true
```

# 2. リモートリポジトリの設定

GithubでHTTPSのリポジトリのURLをコピーして、以下のコマンドにてリモートリポジトリを設定する。

## 2-1. HTTPS経由でのclone（新規にリポジトリ取得）

```sh
git clone https://github.com/XXXX/YYYY
```

- ログインダイアログが表示されるのでログイン情報を入力。


## 2-2. 既存のローカルリポジトリにpush先リモートリポジトリ登録

```sh
git remote add [任意のリモート名] https://github.com/XXXX/YYYY
```

- リモートへのpushを実行すると、ログインダイアログが表示されるのでログイン情報を入力。


# 3. 保存したアカウント情報の確認

- 「コントロールパネル > ユーザーアカウント > 資格情報マネージャー」を開く。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15972/18719827-ca6c-492a-2e9e-e626e7887136.png)

- Githubドメインの該当アカウントを開く。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15972/4c16476d-dab1-1f44-b688-c0eeeca2daa0.png)
ドローン周りの通信簡易まとめ

# この記事は
ドローンを使ったり作ったりしていると、多種多様な通信方式の用語が出てきます。
色々有りすぎて混乱してきたので、簡単に整理してみました。

企業名、商品名とプロトコル名が同じようなコンテキストで出てくるのが混乱の原因になりがちですね。。

# 無線通信系

## FrSky
FrSkyという言葉自体は企業名
https://www.frsky-rc.com/
プロポや受信デバイスを数多く手掛けている。

ここのデバイスは主に、D8やD16と言ったプロトコルでの通信を行っている模様
[参考：初心者のためのマイクロドローン導入への道 〜第3回ドローンを操縦するプロポの選び方](https://videosalon.jp/serialization/microdrone-biginner03/)

### FrSky FCC, FrSky LBT
たまにFrSky製品で、FrSky FCC, FrSky LBTと書かれている物があるが、
- FCCはUSで言うところの技適みたいなもの
- LBTはListen Before Talkの略で、EUや日本で採用されている方式
[参考：日経XTECH LBT](https://xtech.nikkei.com/it/article/COLUMN/20060227/230965/)

※LBTだからといって日本でそのまま使える訳ではなさそう(要調査)。技適対応しているものを選ぼう。

### FrSky：D8,D16,R12,ACCST
FrSky社のデバイスが対応している通信プロトコルの模様。
(詳細は見つけられず。。)

- ACCSTが最新らしい？
- 送信機、受信機で対応プロトコルは合わせる必要がありそう

## Flysky
[メーカー](https://www.flysky-cn.com/)名であり、通信プロトコルでもあるよう
詳細不明。。。

## FUTABA
メーカー名：[双葉電子工業株式会社](https://www.rc.futaba.co.jp/)

### FASST/FASSTest,FHSS/S-FHSS/T-FHSS
双葉社の独自の通信プロトコル

[参考：UE村工房](http://uemurakoubou.xsrv.jp/kawarobowiki/index.php?%C1%F7%BF%AE%B5%A1#a4b81b8d)

## Spektrum
メーカー名
https://www.spektrumrc.com/

### DSM,DSM2,DSMX
Spektrum社が開発した通信プロトコル

DSM：Digital Spectrum Modulation

[参考：DSMX® TECHNOLOGY](https://www.spektrumrc.com/Technology/DSMX.aspx)
[参考：Spektrum DSM2/DSMX と JR DMSS](https://sunsetldg.exblog.jp/13460345/)

## MAVLink
Micro Air Vehicle Link
- 通信プロトコル
- 人が乗らないような小型機での通信が主な用途
- Dronecodeプロジェクトの一つになっている
- [こちらが詳しい：https://mavlink.io/en/](https://mavlink.io/en/)
- [その他参考：Wikipedia MAVLink](https://en.wikipedia.org/wiki/MAVLink)

## MAVROS
MAVLink on ROS
ROS通信上でMAVLink通信を行う方式

[参考：PX4 MAVROS](https://dev.px4.io/v1.9.0/en/ros/mavros_installation.html)

# 有線通信系
## PPM, CPPM, PPM-SUM
- PPM:Pulse Position Modulation
- CPPM:Chaotic pulse position modulation
- 通信方式の低レイヤーなプロトコルという感じ？

## UAVCAN
Uncomplicated Application-level Vehicular Communication and Networking

- 信頼性の高い車内通信用に設計された軽量プロトコル
    - 無線ではなく、有線の通信プロトコル
- もともとはCAN bus上での通信向けに作られていた
- [PX4 UAVCAN](https://dev.px4.io/v1.9.0/en/uavcan/index.html)

# その他参考

[RC TX RX PROTOCOLS EXPLAINED: PWM, PPM, SBUS, DSM2, DSMX, SUMD](https://oscarliang.com/pwm-ppm-sbus-dsm2-dsmx-sumd-difference/)
react-native run-ios で error Could not find "Podfile.lock" at のエラーが出た時の対処法

## 概要　

```
react-native init <project name>
```

をした後に、

```
react-native run-ios
```
を実行すると、

```
error Could not find "Podfile.lock" at .....
```

のエラーが出た時の対処法。



##解決コマンド

1 - cocoapods をインストールする

```
sudo gem install cocoapods
```
2 - 以下のコマンドを実行

```
cd ios && pod install && cd ../ && react-native run-ios
```

3 - もし上のコマンドで、pod install にエラーが出る場合、以下を実行

```
xcrun -k --sdk iphoneos --show-sdk-path
```

4 - この時にもし以下のエラーが出る場合

```
xcrun:_ error: SDK "iphoneos" cannot be located
xcrun: error: SDK "iphoneos" cannot be located
xcrun: error: unable to lookup item 'Path' in SDK 'iphoneos'

```

5 - この場合は以下のコマンドを実行し、2のpod install コマンドを再度実行する。

```
sudo xcode-select --switch /Applications/Xcode.app
```


以上で

```
react-native run-ios
```

で無事エミュレータを起動することができた。



おわり。
jQueryでページをめくる動作をつける方法（裏面なし）


# はじめに

今回は、jQueryを使ってページをクリックするとパラパラと本のようにめくることができるように実装してみました。
以下のgifでは、赤青黄の順番で1ページ目、２ページ目、３ページ目となっております。

![画面収録 2020-06-21 17.58.28.mov.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616088/81ddd01d-7733-8a6a-8851-6aca7b95a2f7.gif)

以下にソースコードを記載いたしますので、ご興味がある方は自分なりに編集していただいて使ってみてください！

```haml
.card
  .page
    ページ1
  .page#blue
    ページ2
  .page#yellow
    ページ3
```

```scss

.card {
  display: flex;
  position: relative;
}
.page {
  background-color: red;
  width : 50%;
  height : 100vh;
  transform:rotateY(0);
  transform-origin: right;
  transition: transform 1s;
  position: absolute;
}

.move {
  transform: rotateY(180deg);
  transform-origin: right;
  transition: transform 1s;
}
 
#blue {
  background-color: blue;
}

#yellow {
  background-color: yellow;
}
```

```javascript
$(function(){

  // クリックされるとページをめくる
  $(".page").on('click',function(){

    // 右から左へページをめくるときに実行
    if( $(this).hasClass("move") ){
      $(this).removeClass("move")
    }

    // 左から右へページをめくるときに実行
    else{
      var num = $(".page").length - $(this).index(".page");
      $(this).attr( "style", "z-index:" + num );
      $(this).addClass("move");
    }

  });
  
  // 右から左へページをめくるときにstyleを取り除く
  $(".page").on("transitionend",function(){
    if( !$(this).hasClass("move") ){
      $(this).removeAttr("style");
    }
  })

});

```
ffmpegを使って動画の最初にタイトルを追加する

色々と苦労したので，メモ代わりに．動画の上にタイトルの文字を入れるのではなく，動画の開始前にタイトルを数秒間表示させる方法です．

#1. タイトル作成
```
ffmpeg -y ^
 -f lavfi -i "color=c=black:s=1280x720:r=30000/1001:d=5.0" ^
 -f lavfi -i "aevalsrc=0|0:c=stereo:s=44100:d=5.0" ^
 -vf "drawtext=fontsize=60:fontfile=C\\://Windows/Fonts/arial.ttf:fontcolor=black:fontcolor=white:textfile='title.txt':x=(w-text_w)/2:y=(h-text_h)/2" ^
  word.mp4


ffmpeg -y ^
 -i word.mp4 ^
 -vf "fade=t=in:st=0:d=2,fade=t=out:st=4:d=1" ^
 word_f.mp4
```

5秒間の黒い動画を作成し，その上にテキストを表示させます．表示させる文字は別途テキストファイルを用意し，textfile='title.txt'にて指定．

2番目の処理では，文字をフェードイン，フェードアウトさせています．これで0～2秒でタイトルがフェードイン→2～4秒までタイトル表示→4～5秒でタイトルが消える動画が出来ました．

#2. 元の動画の前に空白を入れる

始めは上記の動画と元の動画をconcatで結合･･･としたが，エラーは出ないものの上手く結合されず．ffmpegのマニュアル等を調べていたらitsoffsetで動画に空白部分を追加出来るとの事で，これとoverlayを組み合わせる事にしました．

```
ffmpeg -y ^
 -itsoffset 5 -i "input.mp4" ^
 -af "adelay=5s|5s" ^
 "input_of5.mp4"
```

adelayについて，PC上ではitsoffsetのみで5秒間の空白/無音が追加されたのですが，別端末(Androidタブレット)では動画と音が5秒間ずれると言う，環境によって再生のされ方が違う動画が出来てしまいました．

ここで，adelayにより，明示的に5秒間の無音を入れ，この問題は解決．

#3. 動画の結合

```
ffmpeg -y ^
 -i "input_of5.mp4" ^
 -i "word_f.mp4" ^
 -filter_complex "overlay=x=0:y=0:enable='between(t,0,5)'" ^
 -filter_complex "amix=inputs=2:duration=longest:dropout_transition=2" ^
 "out.mp4"
```

overlayにて2つの動画を重ね，意図した音が消えないようにamixにて2つの音も重ねます．ポイントはoverlayでの時間指定で，enable='between(t,0,5)'により，t(時間[s])が0～5秒の間だけoverlayをenable状態にする事が出来ます．

#4. 終わりに

この手法，需要があまり無いのか，調べてみても，そのものの方法が出て来ませんでした．高価なツールを使えばきっと簡単に出来るし，ffmpegでやろうとする人は少ないのかも知れません．自分はかなり試行錯誤を繰り返したので，この記事がffmpegユーザーに役立てば幸いです．
基本的なLINUXコマンド

#基本的なLinuxのコマンド

こんなコマンドあったなーって思い出すのにちょうどいい内容です。
オプションとかは書いていないので詳しく知りたい方は別のサイトで調べたほうがよいです。


####コマンドラインでの編集

| コマンド       | 内容       |
|:---------------|:-----------|
|ctrl + b　|1文字戻る|
|ctrl + f　|1文字進む|
|ctrl + a　|行頭に移動する|
|ctrl + e　|行末に移動する|
|ctrl + p,↑|1つ前(Previous)のコマンドを表示|


####ファイルとディレクトリの確認

| コマンド        | 内容       |
|:---------------|:-----------|
| pwd            | カレントディレクトリを表示           |
| cd       	 | カレントディレクトリを変更する           |
| ls             | カレントディレクトリ内のファイルを表示する |


####ファイル操作

| コマンド        | 内容                                                 |
|:---------------|:-----------------------------------------------------|
|mkdir [オプション] <作成するディレクトリ名>|ディレクトリを作成する
|touch <新しいファイル名1> <新しいファイル名2>...|ファイルを作成する
|rm [オプション] <削除するファイル名1> <削除するファイル名2>...|ファイルを削除する
|cat [オプション] <ファイル名>|ファイルを表示する
|cp [オプション] <コピー元>... <コピー先>|ファイルやディレクトリのコピー
|mv [オプション] <移動元>... <移動先>|ファイルやディレクトリを移動する


####ファイルを探す

| コマンド        | 内容                                   |
|:---------------|:---------------------------------------|
|find <検索開始ディレクトリ> <検索条件> <アクション>|ファイルを検索


####コマンドの内容を調べたいとき

| コマンド        | 内容                                   |
|:---------------|:---------------------------------------|
|man <調べたいコマンド名>|きっと教えてくれる



がんばりましょー!


#参考(Thanks)

[新しいLinuxの教科書](https://www.amazon.co.jp/dp/B072K1NH76)
AWS PuTTYでのSSHファイル転送ではまったところ

# windows上からAWSで起動しているLinux2のインスタンスのディレクトリへファイルを転送したい
[参考]
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/putty.html#Transfer_WinSCP

初心者のokkumanでございます。
まあ案内にも書いている通りやればいいのですが
一応はまったので備忘録的に残していこうかと思います。

自身のPCよりAWSのインスタンスマシンにファイル転送をする際

```windows
pscp -i C:\Users\user-name\(keyの名前).ppk C:\Users\user_name\requirements.txt ec2-user@DNSサーバーネイム:/home/ec2-user/requirements.txt
```
pscp -i [ ppkファイルが格納されている場所のファイルFullパス ] 　半角スペース 　[ 転送したいファイルのファイルFullパス]　半角スペース　[ linuxユーザーネーム ] @ [ AWSのDNSのFullパス ] : [linuxの配置したいパス]


↓実行結果

```
requirements.txt          | 0 kB |   0.3 kB/s | ETA: 00:00:00 | 100%
```
正常な動作は上記となりますが
サーバーネイムの後に「:」がないとpscpがリモート環境と判別せず、
「Local to Local copy not supported」と表示されてエラーとなるようです。


かなり前の情報ですが参考にさせていただきました。
[ 参考 ]
https://stackoverflow.com/questions/34037484/putty-pscp-error-local-to-local-copy-not-supported-when-username-contains-a-sl
権限設定の確認

## Policy Simulatorによる確認

マネジメントコンソールログイン後、以下にアクセス。

 https://policysim.aws.amazon.com/

User/Group/Roleを選択し確認。
例えばRoleなら確認したいRoleを選択し、チェック対象のPolicyを選択。
右側のPolicy Simulatorでチェックしたい対象を選択し、[Run Simulation]で
権限(allowed/denied)を確認することができる。

## dry-runオプションによる実行例

### 権限がない場合
```console
% aws ec2 run-instances --dry-run --image-id　XXXXXXXXXXXX　--instance-type t2.micro

An error occurred (UnauthorizedOperation) when calling the RunInstances operation: You are not authorized to perform this operation. Encoded authorization failure message: ...
```

### 権限がある場合
```
% aws ec2 run-instances --dry-run --image-id XXXXXXXXXXXX --instance-type t2.micro

An error occurred (DryRunOperation) when calling the RunInstances operation: Request would have succeeded, but DryRun flag is set.
```
### 認証メッセージのデコード
stsのdecode-authorization-messageを使用してデコードが可能。

```
% aws sts decode-authorization-message --encoded-message
```

デコード結果はjson形式となる（VSCodeとか使って適宜フォーマットして確認）
Windows でGitHubのパスワード毎回聞かれないようにする

まず、Microsoft買収前から変わっていませんが、GitHub公式的にはhttpsが推奨されていたので、httpsを使います。

[GitHub.com > Git を使用する > リモートリポジトリを管理する > どのリモート URL を使うべきですか？](https://help.github.com/ja/github/using-git/which-remote-url-should-i-use)

とはいえ毎回パスワードを入力するのは煩わしいです。

[GitHub.com > Git を使用する > Git および GitHub を使ってみる > Git に GitHub のパスワードをキャッシュする](https://help.github.com/ja/github/using-git/caching-your-github-password-in-git) 

のページにはMac, Windows, Linuxともに説明されています。

Windowsでは

```
git config --global credential.helper wincred
```

の一行設定すればよいみたい…と思いきや

```
git: 'credential-wincred' is not a git command. See 'git --help'.
```

というエラーが出てしまいました。

現在は
[microsoft/Git-Credential-Manager-for-Windows](https://github.com/microsoft/Git-Credential-Manager-for-Windows) をインストールする必要があるみたいです。

これをインストールすると自動で(？) `credential.helper=manager` に切り替わるみたいです。

`~/.gitconfig` を見てみると

```
 [credential]
      helper = manager
```

となっていました。

これでエラーも出ず、パスワード入力も求められず扱えるようになりました。
WSL2 で DirectML(Direct Machine Learning) を見え据えて, DirectML を llvm-mingw(clang) でビルドする

# 背景

* Linux and Windows で Vulkan で機械学習をしたい
* WSL2 で Linux から DirectX/DirectML/Vulkan/OpenCL/CUDA が使えるようになる(声明だけ)
  * https://devblogs.microsoft.com/directx/directx-heart-linux/
* Vulkan 自体には(まだ)機械学習関連は無いので, とりあえず DirectML でしのぐ
  * WINE or Mesa チームが, DirectML の Vulkan 実装を作ってくれるかも?という期待もある.
  * ちなみに WINE or Mesa チームは, D3D12 を Vulkan で動かせるようにしてくれています. 


現状, WSL2 環境で DirectML/Vulkan/OpenCL を Linux C/C++ アプリ側からどう使うのかは不明です.
(clang(-cl) で Windows 関連ヘッダを直接扱えるようにするのか, なにかしら stub ファイルを用意するのですかね)

とりあえず llvm-mingw(clang) で `DirectML.h` を使うビルド環境を整えておいて, あとで Linux に移行しやすいようにしておきたいです.
directml.h のコンパイルが通るのは確認しました.

## セットアップ

d3d12.h と directml.h あたりのヘッダが必要なので, Windows SDK を取得しておきます.

https://developer.microsoft.com/en-us/windows/downloads/windows-10-sdk/

DirectML を使うには 10.0.18362.0 or later(MSVC version 16.2 or later) が必要になります.


DirectML.h は Timestamp は 2018 年と以外と前から存在しています.

llvm-mingw(clang)で, 

* 他の windows 関連のシステムヘッダは mingw のほうを見るようにする
  * e.g. d3d12.h, directml.h だけ別フォルダで管理など 
* C++ モードでコンパイルする(directml.h がクラス継承など使っているため)
  * C モードだとそもそもだめっぽい 
* http://tsubaki.hatenablog.com/entry/20110115/1295080728 を参考にちょこっと修正
 
で, 一応ビルドができるのは確認しました.

ただ, 実際にはここから Microsoft 独自の COM(?) コードを書いての API 呼び出しなどがあるため, 道は遠いです.
 
WSL2 で正式に GPU 使えるのも来年のようですし,  1 ~ 2 年くらいかけてゆっくり開発環境対応ですかね.


## その他参考

* https://github.com/subatomicglue/cross-compile-macosx-clang-windows-msvc
  * Windows cross compile Makefile 例
githubのメンションをslackのメンションに変更する

こんなのができます。
![コメント 2020-06-21 171627.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253014/9f64813a-efc0-b45a-1987-fbfb296d8207.png)

### コード
Google App Scriptに作成してください。
https://script.google.com/home

```javascript
function doPost(e) {
  const params = JSON.parse(e.postData.getDataAsString())

  const paramsBody = params.comment.body
  const githubMessageSender = params.sender.login
  const githubHookAction = params.action
  const githubHookIssueTitle = params.issue.title
  const githubHookIssueNumber = params.issue.number
  const githubMessageUrl = params.comment.html_url
  const slackMessageReceivers = getSlackMessageReceivers(accountsList, paramsBody)
  const githubMessageSenderSlackAccount = getGithubMessageSenderSlackAccount(accountsList, githubMessageSender)
  
  const payloadData = {
    attachments: [
      {
        fallback: "hogehoge-text",
        color: "#FF66AD",
        pretext: slackMessageReceivers,
        author_name: ':octocat: github to mention',
        title: `${githubHookAction} issue ${githubHookIssueTitle} #${githubHookIssueNumber}`,
        title_link: githubMessageUrl,
        text: `📩 ${paramsBody}`,
        footer: `Sender: @${githubMessageSenderSlackAccount}`,
      }
    ]
  }

  var options = {
    'method': 'post',
    'contentType': 'application/json',
    'payload': JSON.stringify(payloadData)
  };
  UrlFetchApp.fetch('https://hooks.slack.com/services/slack-web-hook-url', options);
}
```

```javascript
// アカウントのリストです
const accountsList = [
  {
    github: 'satou-tarou-hoge',
    slack: 'satou-tarou-hoge',
  },
  {
    github: 'yamada-hanako-hoge',
    slack: 'yamada-hanako-hoge',
  }
]
```

```javascript
// githubから送信したメッセージの中からメンションを探して返します
function getSlackMessageReceivers(list, paramsBody) {
  let result = ''
  list.forEach((account, i) => {
    const found = paramsBody.indexOf('@' + account.github + ' ') !== -1
    if (found) {
      result += `<@${accountsList[i].slack}> `
    }
  })
  return result
}
```

```javascript
// githubからメッセージを送信したアカウントに紐づくslackアカウントを返します
function getGithubMessageSenderSlackAccount(list, githubMessageSender) {
  const found = list.find(account => {
    const result = account.slack === githubMessageSender
    return result
  })
  
  return found.slack
}
```

上記が完成したら、publishからDeploy as web appを選択して、publishしてください。

publish後に表示されるエンドポイントをgithubから叩いてください。

上記コード中の`https://hooks.slack.com/services/slack-web-hook-url`を自分のslackのIncoming webhookに設定してください。
https://api.slack.com/apps ボットを作って、Incoming webhookを設定してください。そのurlです。

Google App Scriptはインポートしなくても他のファイルが呼び出せて、ちょっと気持ち悪かった。
githubが買収した?pull pandaが早く使いたい。
slackのgithub notifyがmentionを相互に変換してくれればいいのに。
Apache Spark Streamingをローカルでサクっと動かす

# はじめに
- Apache Spark StreamingをMacのローカル環境でサクっと動かしたい。 

# sparkのインストール
`$ brew install apache-spark`

# ソースコード
## build.sbt
```scala
name := "spark-sample"
scalaVersion := "2.11.12"
resolvers += "Typesafe Releases" at "https://repo.typesafe.com/typesafe/releases/"
javacOptions ++= Seq("-source", "1.8", "-target", "1.8", "-Xlint")
libraryDependencies ++= Seq("org.apache.spark" %% "spark-streaming" % "2.4.6")
```

## Mainクラス
localhostの9999番ポートから5秒ごとに文字列を取得してカウント結果を出力するコード。

```scala
import org.apache.spark.streaming._
import org.apache.spark._

object StreamingSample {
  def main(args: Array[String]) {
    // SparkStreamingコンテキストを作成
    val conf = new SparkConf().setAppName("Streaming Sample")
    val sc = new SparkContext(conf)
    val ssc = new StreamingContext(sc, Seconds(5))

    // ストリームからデータを読み込み処理をする
    val lines = ssc.socketTextStream("localhost", 9999)
    val words = lines.flatMap(_.split(" "))
    val pairs = words.map(word => (word, 1))
    val wordCounts = pairs.reduceByKey(_ + _)

    // 結果を出力する
    wordCounts.print()

    // コンテキストの起動と維持
    ssc.start()
    ssc.awaitTermination()
  }
}
```

# 実行
## ローカルにncコマンドで疑似ストリームを作り文字を入れる。
```bash
$ nc -lk 9999
aaa
aaa
bbb
bbb
ccc
```

## jar作成
`$ sbt clean package`

## 作成したjar実行
`$ /usr/local/Cellar/apache-spark/2.4.6/libexec/bin/spark-submit --class StreamingSample target/scala-2.11/spark-sample_2.11-0.1.0-SNAPSHOT.jar`

## 出力結果
ちゃんと5秒ごとにカウント結果が出力される。

```
-------------------------------------------
Time: 1592726930000 ms
-------------------------------------------
(aaa,2)
(bbb,2)
(ccc,1)
```

# まとめ
- Sparkは難しいイメージがあったが、Sparkのインストールからローカル実行まであっという間にできた。
- Scala12やJava11を使うとエラーなどでうまくいかなかったので今回はScala11・Java8で実行した。Spark2.4系はScala12用のライブラリも提供されていて動かないことはないと思うので調べて動くところまではやってみたい。

# 参考文献
- [詳解 Apache Spark](https://www.amazon.co.jp/dp/4774181242)
PHP 切り上げ(ceil)、切り捨て(floor)に小数点の桁数を指定できるようにする

PHPには似通った組み込み関数として以下のようなものがあるのだが、

`round()`  : 四捨五入（modeで多少いじれる） 
`ceil()` : 切り上げ
`floor()` : 切り捨て

桁数を指定でいるのは `round()` だけで、
`ceil()`, `floor()`の二つの関数に関しては、桁指定できる宣言部がない。

そこで、切り上げ、切り捨て処理ができる関数を作ってみた。

##切り上げ、切り捨て処理

### 切り上げ処理(ceil_round_up)

`ceil_round_up ( float $value [, int $precision = 1 ] )`

第一引数 : 切り上げしたい数字
第二引数 : 切り上げしたい小数点桁数(初期値1)

```
function ceil_round_up($value, $precision = 1) {
  return round($value + 0.5 * pow(0.1, $precision), $precision, PHP_ROUND_HALF_DOWN);
}
```

### 切り捨て処理(ceil_round_down)
`floor_round_down ( float $value [, int $precision = 1 ] )`

第一引数 : 切り捨てしたい数字
第二引数 : 切り捨てしたい小数点桁数(初期値1)

```
function floor_round_down($value, $precision = 1) {
  return round($value - 0.5 * pow(0.1, $precision), $precision, PHP_ROUND_HALF_UP);
}
```

おそらく正常に回るはず。。
じゃんけん　

script.py
import utils
# randomモジュールを読み込んでください
import random

print('じゃんけんをはじめます')
player_name = input('名前を入力してください：')
print('何を出しますか？（0: グー, 1: チョキ, 2: パー）')
player_hand = int(input('数字で入力してください：'))

if utils.validate(player_hand):
    # randintを用いて0から2までの数値を取得し、変数computer_handに代入してください
    computer_hand = random.randint(0,2)
    
    if player_name == '':
        utils.print_hand(player_hand)
    else:
        utils.print_hand(player_hand, player_name)

    utils.print_hand(computer_hand, 'コンピューター')
    
    result = utils.judge(player_hand, computer_hand)
    print('結果は' + result + 'でした')
else:
    print('正しい数値を入力してください')

---------------------------------------------
utils.py
def validate(hand):
    if hand < 0 or hand > 2:
        return False
    return True

def print_hand(hand, name='ゲスト'):
    hands = ['グー', 'チョキ', 'パー']
    print(name + 'は' + hands[hand] + 'を出しました')

def judge(player, computer):
    if player == computer:
        return '引き分け'
    elif player == 0 and computer == 1:
        return '勝ち'
    elif player == 1 and computer == 2:
        return '勝ち'
    elif player == 2 and computer == 0:
        return '勝ち'
    else:
        return '負け'
3分プログラミング～mbed体温計～

体温計が手に入りづらいので
![img.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/561682/feb435d4-e0b2-2534-6e33-f15a3b42b1dc.jpeg)
作業時間180分　熱量 0.67W　塩分 0.0g

**材料**（1台分）
[mbed LPC1768](https://os.mbed.com/platforms/mbed-LPC1768/)　1台
[mbed application board](https://os.mbed.com/components/mbed-Application-Board/)　1台
[THERMO K click (MCP9600)](https://www.mikroe.com/thermo-k-click)　1台
K熱電対　1つ
mini USBケーブル　1本

**作り方**
1) 開発用PCを起動し、[開発環境](https://os.mbed.com/docs/mbed-os/v5.15/quick-start/index.html)を整えておく。
2) プロジェクトを作成する。プロジェクト内に移動してLCD用ライブラリをインポートする。

```bash
mbed new ondokei
cd ondokei
mbed add http://os.mbed.com/users/chris/code/C12832/
```

3) main.cppを作成して、以下のコードを保存する。

<details><summary>main.cpp</summary><div>

```cpp
#include "mbed.h"
#include "C12832.h"

// LCD
C12832 lcd(p5, p7, p6, p8, p11);

// MCP9600
I2C i2c(p9, p10);
int addr8bit = 0xC0;

int main()
{
    char cmd[2];

    // Initialize the MCP9600
    i2c.frequency(50);

    cmd[0] = 0x05;	// Sensor configuration.
    cmd[1] = 0x07;	// K, Filter max
    i2c.write(addr8bit, cmd, 2);

    cmd[0] = 0x06;	// Device configuration.
    cmd[1] = 0x00;	// 0.0625 degree C, 18 bit resolution, 1 sample, Normal op.
    i2c.write(addr8bit, cmd, 2);

    float temperature;

    while (true) {
        ThisThread::sleep_for(1000);

        cmd[0] = 0x00;
        i2c.write(addr8bit, cmd, 1);
        i2c.read(addr8bit, cmd, 2);

        if ((cmd[0] & 0x80) == 0x80) {
            temperature = (cmd[0] * 16.0 + cmd[1] / 16.0) - 4096.0;
        }
        else {
            temperature = (cmd[0] * 16.0 + cmd[1] / 16.0);
        }

        lcd.cls();
        lcd.locate(0, 3);
        lcd.printf("%.1f degree C", temperature);
    }
}
```
</div></details>

4) ビルドする。

```
mbed compile -t GCC_ARM -m LPC1768
```

5) binファイルが出来上がる間に、材料をすべてつなげてPCと接続する。
6) binファイルが出来上がったらストレージへドラッグ＆ドロップしてLPC1768へフラッシュする。
7) リセットボタンを押す。
8) 液晶画面に温度が表示されることを確認する。

**アドバイス**

- 精度が±0.5℃と低いので、あくまで目安として使用する。
画像.jpgのバイナリに文字を隠して友人に送ってみた

#環境
- Ubuntu 20.04 LTS
- Ghex 3.18.4
- Pinta 1.6

#はじめに
いわゆるステガノグラフィー。

# 大まかな流れ
1. 画像を用意する
2. 隠したい文字をASCIIに従って16進数にする
3. 変換した文字をバイナリエディタで画像に埋め込む

# jpegの構造について簡単に
1. SOI 16進数で`FFD8`
2. セグメント
3. 実データ
4. EOI 16進数で`FFD9`

# やってみる
今回は、実データの部分に文字を隠します。
今回使う文字
`steganography{hogehoge strhng}`
ミスって`string`が`strhng`になってしまいました。
これをASCIIに従って16進数で表示すると
`73 74 65 67 61 6e 6f 67 72 61 70 68 79 7b 68 6f 67 65 68 6f 67 65 20 73 74 72 68 6e 67 7d`
用意した画像ファイルをバイナリエディタで開きます。
![Screenshot from 2020-06-21 16-27-04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246294/3985bb52-5960-163f-f0a0-d4cde1b2f20d.png)
そしてたとえばこの部分を
![Screenshot from 2020-06-21 16-27-21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246294/82211357-b0c3-0173-fb85-af1e78fb8abe.png)
こうします。

この後友人に送り、無事読んでもらえました。
# おわりに
今後は色々なメディアファイルのデータ構造を勉強してみようかなと思ったり思ってなかったりしてます。
PHP、MySQLで、Wordpressのような記事サイト制作。絞り込み、ページャー機能について

初めまして。
phpを独学で勉強中です。

phpの投稿フォームからMySQLへ保存し、一覧で書き出したり絞り込み検索ができるシステムを構築しています。
（Wordpressのブログのイメージです。ページャー機能も付けています）

絞り込み検索とページャーの機能はとりあえず動くようになったのですが、下記問題があります。
　・複数項目の絞り込みに対応できない。
　　　→現状、キーワード検索のみ
　・ページャーが、絞り込みをかけてもテーブル内すべてのデータを含んでしまう。
　　2ページ目に移動すると絞り込みが解除されてしまう。


こちらどの様に改善するかお分かりになる方いらっしゃれば、ご教授いただけますと幸いです。
お手数おかけしますが、よろしくお願いいたします。


▼MySQL
テーブル名：　shop
カラム１：　ID（連番）
カラム２：　s_name（テキスト）

▼HTML（検索フォーム）

    <form action="search.php" method="post">
        <dl><dt>キーワード検索</dt>
            <dd><input type="text" name="sea_name"></dd></dl>
        <dl><dd><input id="send" type="submit" value="送信する"></dd></dl>
    </form>


▼php（一覧表示）

    <?php
    $sea_name = $_POST['sea_name'];

    $user = 'user';
    $pass = 'pass';
    $dsn = 'mysql:host=localhost;dbname=db';
    $shop = new PDO($dsn, $user, $pass);

    if (isset($_GET['page'])) {
    $page = (int)$_GET['page'];
    } else {
    $page = 1;
    }

    if ($page > 1) {
    // 例：２ページ目の場合は、『(2 × 10) - 10 = 10』
    $start = ($page * 3) - 3;
    } else {
    $start = 0;
    }

    if(!empty($sea_name)) {
    $sea_name = addslashes($sea_name);
    $where = "s_name REGEXP '$sea_name' &";
    }

    if(!empty($where)) {
    $where = substr($where, 0, -1);
    $where = "WHERE " . $where;
    }

    $posts = $shop->prepare("
    SELECT  *
    FROM shop 
    {$where}
    ORDER BY id DESC
    LIMIT {$start}, 3
    ");

    $posts->execute();
    $posts = $posts->fetchAll(PDO::FETCH_ASSOC);
    ?>

        <p>検索条件</p>
        <p>フリーワード：<?php echo $sea_name; ?></p>
                <p>検索結果</p>
        <?php 
        foreach ($posts as $post) {
            echo "
        <li>
        <h3>{$post['s_name']}</h3>
        </li>
        "
        ;}
        ?>
        </ul>
    <?php 
    $page_num = $shop->prepare("
        SELECT COUNT(*) id
        FROM shop
    ");
    $page_num->execute();
    $page_num = $page_num->fetchColumn();

    $pagination = ceil($page_num / 3);

    for ($x=1; $x <= $pagination ; $x++) { ?>
    <a href="?page=<?php echo $x ?>"><?php echo $x; ?></a>
    <?php } // End of for ?>
fluorite-7　日本語チュートリアル


# fluorite-7とは？

fluorite-7は、コードの短さと見やすさを主軸にした創作プログラミング言語です。

<a href="https://qiita.com/MirrgieRiana/items/7af015bf186b31c6f7a6"><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280627/802417e5-9bbe-b76a-26cc-f550b6975dfb.png"></a>

- [創作プログラミング言語　fluorite-7](https://qiita.com/MirrgieRiana/items/7af015bf186b31c6f7a6)

# チュートリアル

このチュートリアルは、次の環境で検証されています。

- Windows Subsystem on Linux
  - Microsoft Windows 10.0.18362.778
  - bash 4.4.19(1)-release
  - Ubuntu 18.04 LTS (Bionic Beaver)
  - node v8.10.0
  - npm 3.5.2

----

このチュートリアルは、Linuxおよびスクリプト言語でのプログラミングを経験している方向けに作られています。

- [Part 1　fl7の基礎](https://qiita.com/MirrgieRiana/items/3cbbdbb9f125e31e9fbb)
- [Part 2　算術の基礎](https://qiita.com/MirrgieRiana/items/27cd5c4f73b9c65eb168)
- [Part 3　ストリーマと配列](https://qiita.com/MirrgieRiana/items/3aed3a6a03da28c48dae)
- [Part 4　変数と関数](https://qiita.com/MirrgieRiana/items/0010a9a0b68b6033d0d1)
- [Part 5　パイプ](https://qiita.com/MirrgieRiana/items/eefa56f20c77339c12f1)
- [Part 6　文字列リテラルの基礎](https://qiita.com/MirrgieRiana/items/ac7d866e71c61fb9b004)
- [Part 7　標準入力と文字列操作](https://qiita.com/MirrgieRiana/items/fbe470dd913cbe0f501d)
- [Part 8　スクリプトファイル](https://qiita.com/MirrgieRiana/items/d4af50233a37e5d84646)
- [Part 9　オブジェクト](https://qiita.com/MirrgieRiana/items/e35826c75c3d77fe9146)
- [Part 10　クラスとメソッド](https://qiita.com/MirrgieRiana/items/e69d38f6a1f1213f7760)
- [Part 11　文と副作用](https://qiita.com/MirrgieRiana/items/ac24970bc8e2a384ebc0)
- [Part 12　論理値と比較](https://qiita.com/MirrgieRiana/items/e914a4c15aaba3ae5402)
- [Part 13　制御構文](https://qiita.com/MirrgieRiana/items/cc9e041d8e42c6b0480a)

# トピック別リファレンス

- [関数](https://qiita.com/MirrgieRiana/items/bd41a1604c60b85e2d1e)
- [動的名前解決](https://qiita.com/MirrgieRiana/items/e608e72a2ff011e99bdf)
- [オブジェクト指向](https://qiita.com/MirrgieRiana/items/f503fb6787ef357e00e3)
- [日付](https://qiita.com/MirrgieRiana/items/ab24f0fdeb061a235fda)
- [文字列](https://qiita.com/MirrgieRiana/items/f7f36218ed3378a27aed)

# リンク集

リポジトリ

- https://github.com/MirrgieRiana/fluorite-7

Twitter

- https://twitter.com/script_fl7

## コンソール版

その場にインストール

```bash:
curl https://raw.githubusercontent.com/MirrgieRiana/fluorite-7/master/install.bash | bash
```

環境にインストール

```bash:
(cd /usr/local/bin; curl https://raw.githubusercontent.com/MirrgieRiana/fluorite-7/master/install.bash | bash)
```

## オンラインエディタ

オンラインエディタ

- https://mirrgieriana.github.io/fluorite-7/editor/

## Google Colaboratory

インストールマジック

```
!(cd /usr/local/bin; curl https://raw.githubusercontent.com/MirrgieRiana/fluorite-7/master/install.bash | bash)
```

fl7を実行するためのセルマジック

- `%%bash -c 'fl7 "$(cat)"'`

fl7でHTML出力するサンプルコード

```perl:
import IPython; IPython.display.HTML("\n".join(get_ipython().getoutput(r'''fl7 -e '
  <ul>
    <%= y: 1 .. 9 | %>
      <li><%= y %></li>
    <% %>
  </ul>
' ''')))
```
Raspberry PIのコンソール接続し、ローカルIP及びSD情報表示

#概要
RaspberryPIでSSHターミナルを起動した際に現在DHCPから配布されているIPアドレスを表示します。
そしてSDカードの容量も表示します。

#修正ファイル 「.bashrc」
下記のコマンドでファイルを修正します。
VIを使っていますが、他の編集ツールでも大丈夫です。

```bash
vi ~/.bashrc
```

上記のファイルに以下の内容を追記し、保存します。

```bash
echo "==IP Address=="
ip addr | grep "inet " | grep brd | awk '{print $2}' | awk -F/ '{print $1}'
echo ""
echo "==Disk Space=="
df -h
```


#SSHターミナルを起動
ターミナルを起動すると以下の画面のように表示されます。

```bash
Linux raspberrypi 4.19.118-v7l+ #1311 SMP Mon Apr 27 14:26:42 BST 2020 armv7l

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Sun Jun 21 08:19:14 2020 from 192.168.1.2

SSH is enabled and the default password for the 'pi' user has not been changed.
This is a security risk - please login as the 'pi' user and type 'passwd' to set a new password.

==IP Address==
192.168.1.13

==Disk Space==
Filesystem      Size  Used Avail Use% Mounted on
/dev/root        15G  5.8G  7.9G  43% /
devtmpfs        841M     0  841M   0% /dev
tmpfs           970M     0  970M   0% /dev/shm
tmpfs           970M  8.6M  962M   1% /run
tmpfs           5.0M  4.0K  5.0M   1% /run/lock
tmpfs           970M     0  970M   0% /sys/fs/cgroup
/dev/mmcblk0p1  253M   51M  202M  21% /boot

tmpfs           194M     0  194M   0% /run/user/1000
```

#その他
グローバルのIPも表示したい場合は、下記のコマンドを利用してください。

```bash
pi@raspberrypi:~ $ curl globalip.me
219.107.XXX.XXX
```

#終わりに
今日はSSHで接続した場合、「.bashrc」が実行される内容にコマンドを追記してみました。
何より現在使っているディスクの容量が確認できてよかったと思います。
皆さんも表示したい情報がありましたらこのファイルに追記してみてください。
Google Apps Script (GAS) で、GoogleDrive上の指定フォルダからファイル一覧を取得する

# 概要
Google Apps Script（以下GAS）でGoogleDriveの特定フォルダのファイル一覧を取得します。
フォルダの指定には、　`フォルダID` と `フォルダ名` でアクセスする方法があります。

# フォルダIDでファイル一覧を取得

## フォルダIDとは

フォルダIDとは、GoogleDriveで該当フォルダを表示した際にURL部分に表示されるIDのことです。
※ `https://drive.google.com/drive/u/0/folders/` 以下の部分

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142886/583ee4b3-68a7-f8d4-dcb0-fa834ff34984.png)



## コード
`DriveApp.getFolderById` にフォルダIDを指定して、folderを取得します。
取得したフォルダの `getFiles()` メソッドでファイル一覧を取得します。

```javascript
DriveApp.getFolderById(folderID);
```


ファイル情報はイテレーターで取得する形となるので、 `hasNext()` でファイルの存在を確認しながら `next()` でファイルの実態を取得します。

ファイル名は `getName()` で取得できます。
ファイルIDを取得したい場合は `getId()` メソッドを利用します。


```javascript
function myFunccton() {
  
  let folderID = "XXXXXXXXXX"
  let folder = DriveApp.getFolderById(folderID);
  let files = folder.getFiles();
  
  while(files.hasNext()) {
    file = files.next();
    console.log(`[${file.getName()}]${file.getId()}`);
  }
  
}
```

ちなみに文字列部分をバッククォートで囲んでおくと、 `${}` を利用して、変数や関数の戻り値を文字出力することができます。

## 結果

ログに以下のような一覧が表示されます。
（ID部分隠してます）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142886/64ecd1e6-5181-122d-9450-c9d1d7bbebec.png)


# フォルダ名でファイル一覧を取得

`DriveApp.getFoldersByName` を使うと、フォルダ名を指定してフォルダを取得することもできます。
GoogleDrive上にある全ての同じフォルダ名を取得する形となるので、戻り値はフォルダイテレータとなります。
今回は、指定したフォルダ名がGoogleDriveに一つしかないと決め打ちした前提で、イテレータの最初のフォルダを取得してします。

```javascript
DriveApp.getFoldersByName(folderName);
```

## コード

コードは以下のとおりです。
結果はフォルダID指定の場合と同じなので省略します。

```javascript
function myFunction() {
  
  let folderName = "SubFolder"
  
  // イテレータで取れるので1つ目を決め打ちで取得
  let folder = DriveApp.getFoldersByName(folderName).next();
  let files = folder.getFiles(); 
  
  while(files.hasNext()) {
    file = files.next();
    console.log(`[${file.getName()}]${file.getId()}`);
  }
  
}
```

# 注意点
GoogleDriveへのアクセスとなる為、初回実行時はアクセス承認を行う必要があります。
ちょっと手数が多いので、手続きのスクショを貼っておきます。

## アクセス許可確認
![2020-06-21 (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142886/b1b98449-6e1b-2d4d-0572-3d2ace303708.png)

## 該当Googleアカウントの選択
![2020-06-21 (6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142886/30dcd0ba-8078-97e0-f111-35ad288537cb.png)
## 警告ダイアログ
詳細をクリック
![2020-06-21 (7).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142886/67124c93-45f0-07ed-379e-d0ec9fc34efc.png)

詳細が表示されるので、 `（安全ではないページ）に移動` をクリック
![2020-06-21 (8).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142886/663216db-a8e1-212a-e8bd-687b525246f4.png)

## アクセスリクエストダイアログ
許可を押す
![2020-06-21 (9).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142886/8fb4a9d4-4a47-d9d1-2ce7-89d9a07d5c84.png)

以上の手続きを済ませたあともう一度実行すると、普通に実行できるようになります。

# 参考情報
**■ Google公式の `DriveApp Api` リファレンス**
https://developers.google.com/apps-script/reference/drive/drive-app

**■ Google Apps ScriptでGoogleドライブを操作する最も簡単なスクリプト**
https://tonari-it.com/gas-google-drive-app/
docker terraform実行環境を作って、仲間のterraform実行環境を尊重する


## 紹介する内容
- terraformの`環境別HOMEパス/.aws/credentials`からaws profileを取得する設定を利用します
  - gitignoreとdockerのvolumesを利用してterraform実行環境を作ります
     - 参考：https://www.terraform.io/docs/providers/aws/index.html#shared-credentials-file
     - 主にMACにterraformインストールした仲間とdockerでterraform使いたい人（筆者）状況を想定しました


## 結論
- **同じaws profile名を設定するルール**だけ守ると、MACでterraformインストールした人、dockerでterraformインストールした人はお互いの環境を気にせずにterraform運用できると思います
- dockerコンテナの中で生成したaws profileの情報を**dockerのvolumes**でマウントしました。
  - マウントしたディレクトリを消さない限りaws profileをずっと使用できます
  - **gitignore**したから、aws profile情報はgit pushされません


## 紹介始めます
### ディレクトリ構成
全体ソースコードは https://github.com/cheekykorkind/qiita-example/tree/master/terraform/aws-account-management で確認できます

- 全体図
![allD.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247584/8356af2d-bfa2-6955-f469-d53bbc936546.png)


- aws profileの情報をマウントするディレクトリ
dockerコンテナの中で生成したaws profileの情報をマウントするところです。
![awsprofileD.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247584/df896a38-dca8-6d12-3f91-3e711d0ccfc3.png)


- terraformファイルがあるディレクトリ
aws profile名`my-demo`を参照して、cloudwatch logs groupを一つ作る内容が書かれてます
![terraformD.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247584/2d2011a3-b419-ceab-0d74-2e833712a135.png)




### 試し順番です
1. docker composeがあるデレクトリー移動に移動します 
  - `cd qitta-example/terraform/aws-account-management`
2. dockerコンテナをバックグラウンドで起動します
  - `DOCKER_UID=$(id -u $USER) DOCKER_GID=$(id -g $USER) docker-compose up -d`
3. dockerコンテナに入ります
  - `docker exec -it aws-account-management /bin/sh`
4. aws profile設定します
  - 一回で十分です、HOSTマシンに影響与えません
  - profile名は `my-demo`にしました。terraformで参照してます
  - `aws configure --profile my-demo` の実行前のイメージ
![beforeAfterSetAwsProfile.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247584/90bfee60-eb7a-310d-7768-bf3e51570ff1.png)
  - `aws configure --profile my-demo` の実行中のイメージ
![setAwsProfile.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247584/79736cd9-34ce-97a6-5974-c1cfff85e9a1.png)
  - `aws configure --profile my-demo` の実行後のイメージ
![afterSetAwsProfile.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247584/2c6ae411-206d-6656-78a7-0250cede63e3.png)



5. terraformデレクトリーに移動します
  - `cd ~/terraform/demo`

6. terraform initします
  - `terraform init`

7. terraformを実行します
  - `terraform apply`

8. terraformのprofile参照名を変えてエラーになるか確認します
  - main.tfを一時的に修正します
  - `terraform apply`

![awsprofile.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247584/148d1e7c-c66b-7fa8-37cf-2a566fbd835a.gif)
Hamachiを使って、外出先から自宅への接続環境（リモートなど）を簡単に作ってみる

#Hamachiってなに
P2P技術を利用し、VPNを簡単に構築することができるソフトウェア。
無料利用の場合は1つのVPNに5つのコンピュータを所属させられる。
Win、Mac、Linuxに対応していてつよい。

※P2P（Peer To Peer）
ネットワークに接続されたコンピュータ同士が対等に通信する方式。
クライアントサーバ方式におけるクライアントとサーバのような立場が無く、皆平等で仲良し。

※VPN（Virtual Private Network）
離れた場所同士のコンピュータを、物理的な専用線で接続しているかのように見せかける技術。
ここで言う離れた場所というのは、インターネットを介していることを指す。


#どうやるの
*※OSによって表記が日本語だったり英語だったりしてます。*
*Macを使用しているためここでは英語ですが、設定項目は同じはずです。*

###Hamachiのインストール、起動
リモート元、リモート先全てのコンピュータにHamachiをインストールし、VPNを構築・参加できる状態にする。

（１）コンピュータにHamachiを[ダウンロード](https://www.vpn.net/)、インストールする。
初回起動時にログインを促されるので、必要に応じてログイン/登録する。

（２）Hamachiのメインウインドウ上にある電源マーク？のようなボタンを押すと、VPNへの接続が開始される。

###VPNの作成
この作業はVPNに参加させるコンピュータのうち、任意の1台で行う。
僕はわかりやすいようにリモート先のPCで作成しています。

（１）上部の「Network」をクリックし、「Create a new network...」を選択する。

（２）下記項目を入力する。
・「Network ID」に、作成するVPNの名前を入力（後でVPNに参加する際に使用します）
・「Password」に、VPNへの参加時に要求するパスワードを入力
・「Confirm Password」で、入力したパスワードの確認
入力が終わったら「Create」をクリックする。するとVPNが作成される。

###VPNへの参加
この作業はVPNに参加させるコンピュータのうち、VPNを作成したコンピュータ以外の全てで行う。

（１）上部の「Network」をクリックし、「Join an existing network...」を選択する。

（２）「Network ID」と「Password」に、VPN作成時に入力したものと同じものを入力し、「Join」をクリックする。すると作成したVPNへの参加ができる。

###VPNへの新規参加を制限する
この作業はVPNを作成したコンピュータで行う。

（１）作成したVPNのNetwork ID上で右クリックし、「Set Access...」をクリックする。

（２）「Do not accept new network members」にチェックを入れ、「OK」をクリック。

###リモート接続してみる
（１）任意のリモートデスクトップソフトを起動する。
僕はリモート先（Windows10 Home）にUltraVNC Server、リモート元（Mac）はMac標準の画面共有を使用しています。

（２）Hamachiのウインドウ上で、リモート接続したいコンピュータのIPアドレスを確認し、そのアドレスへ接続する。

*※ソフトによってはポート開放等が必要になるかも知れないです*

#ひとりごと
特に何か目的があってリモートできるようにしたわけじゃない
~~強いて言うなら、カフェとかでMac開いて自宅のWinに接続とかなんかかっこいいって思った~~
Cloud9をデスクトップアプリ化する(macOS 2020年版+おまけのWindows)

# 概要

[AWS Cloud9](https://aws.amazon.com/jp/cloud9/)をブラウザ(Chrome)から利用すると、Chromeにバインドされているキーボードショートカットが優先されてCloud9のキーバインドが正しく動作しません。これを回避するためにChromeをデスクトップアプリとして起動する方法です。

# 用意するもの

* Mac (macOS Big Sur) or Windows10
* Google Chrome
* AWSアカウント(Cloud9設定済み)

# Cloud9をデスクトップアプリ化する手順

1. ChromeでCloud9を開く
2. Chromeの設定メニュー(右上の３つの点）> その他のツール > ショートカットを作成 > ウィンドウとして開くをチェックして作成
3. Chromeで新規タブ/ウィンドウを開く
4. ブックマークバーのアプリボタンを押すと、Cloud9のアプリアイコンがあるので選択する
5. Cloud9がアプリとして開く

以上です。
AWS CLIの設定(mac)

**注意! アクセスキーとシークレットアクセスキーは絶対他人と共有しないこと**
**注意! ここではローカルPC上での設定。EC2上でAWS CLIを使うときはIAM Roleをインスタンスにアタッチすること(アクセスキー/シークレットアクセスキーはセキュリティ上絶対設定しない)**

## CLIのインストール
1.AWS公式よりCli(version2)のpkgファイルをダウンロード 
https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/install-cliv2-mac.html

2.pkgファイルをインストール（基本デフォルトのままでOK)

3.ターミナルで以下コマンドを叩き、正常にインストールされていることを確認

```terminal
% aws --version
aws-cli/2.0.24 Python/3.7.4 Darwin/19.5.0 botocore/2.0.0dev28
```

## アカウントの紐付け
1.AWSのマネジメントコンソールで利用ユーザのアクセスキーとシークレットアクセスキーを取得

2.以下コマンドで接続設定を行う。
regionとoutputはそれぞれコマンド実行時に--region、--outputを指定することで変更可能。また--profileオプション指定で登録済の別プロファイルを使用可能(後述)

```terminal
% aws configure
AWS Access Key ID [None]: [アクセスキー]
AWS Secret Access Key [None]: [シークレットアクセスキー]
Default region name [None]: [デフォルトのリージョン名(e.g. ap-northeast-1)]
Default output format [None]:[デフォルトの出力フォーマット(e.g. json)]
```

3.設定が正常に完了すれば、~/.awsフォルダ配下にconfigとcredentialsファイルができる

```
% ls ~/.aws
config      credentials
% cat ~/.aws/config
[default]
region = ap-northeast-1
output = json
% cat ~/.aws/credentials
[default]
aws_access_key_id = [設定したアクセスキー]
aws_secret_access_key = [設定したシークレットアクセスキー]
```

## コマンド動作確認

```
% aws s3 ls
2020-MM-DD HH:MM:SS xxxxxxxxxxxxxxxxxxxxxxx
2020-MM-DD HH:MM:SS xxxxxxxxxxxxxxxxxx
```

## 複数アカウントを紐付けたい場合
profileオプションを指定する

```
% aws configure --profile [プロファイル名]
```

configとcredentialsに設定が追加される。

```console:config
[default]
region = ap-northeast-1
output = json
[profile hoge]
region = ap-northeast-1
output = yaml
```

```console:credentials
[default]
aws_access_key_id = XXXX
aws_secret_access_key = XXXX
[hoge]
aws_access_key_id = XXXX
aws_secret_access_key = XXXX
```

プロファイルを切り替えたい場合はコマンド実行時にprofileオプションを指定するか、環境変数AWS_PROFILEにプロファイル名を指定しておく。

```
aws ec2 describe-instances --profile hoge
```

```
export AWS_PROFILE=hoge
```
Robo 3Tを使ってmonogoDBを確認する

##Robo 3Tとは
MongoDBのためのGUI（Graphical User Interface）
Robo 3TをmongoDBに連動させることで、作成しているデータベースの中身を見て確認することができるようになる。


##インストール方法
「Robo 3T」公式サイトよりダウンロード
https://robomongo.org/

「Download Robo 3T Only」ボタンをクリックしてダウンロードする。

##設定
<h6>・mongoDBを設定する</h6>

<img width="1056" alt="スクリーンショット 2020-06-21 15.59.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595580/87b16f26-8a7d-8d30-e068-da5ad7f0305e.png">

「localhost : 27017」をAddressに設定する。
「27017」はデフォルトでのMongoDBのポート。


<h6>・Robo 3Tの中でシェルスクリプトを打つ</h6>

<img width="1073" alt="スクリーンショット 2020-06-21 16.02.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595580/e19d4cb2-d986-edce-d4b8-2df87cf74b3e.png">

「local MongoDB Database」のところで右クリック。
「Shell」 でシェルスクリプトを打てるようになる。
「Open shell」でシェルスクリプト入力欄を開くことができる。

入力したシェルスクリプトは、左上の緑の三角形を押すと実行できる。

##使ってみる

プログラムからMongoDBのデータベースを作成する。
「local MongoDB Database」のところで右クリック→「refresh」を選択すると、データが更新されて、作成したデータベースが表示される。

表示方法は３種類ある。
テーブル形式、表形式、JSON形式でデータベースを確認できる。

<img width="1078" alt="スクリーンショット 2020-06-21 10.50.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595580/a98a0e9b-2b97-b76e-58d8-2c380edb0e7b.png">


<img width="824" alt="スクリーンショット 2020-06-21 10.50.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595580/780f6a7f-207d-2366-adf4-a7eaf67f0672.png">


<img width="823" alt="スクリーンショット 2020-06-21 10.50.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595580/f1baf6cc-16d8-6dcb-b82c-b05ef646057e.png">

##作成したデータベースを削除する

<img width="1062" alt="スクリーンショット 2020-06-24 16.12.45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595580/12f70265-4b08-ae1e-7c3f-83674376605e.png">

データベース名の上で右クリック→「Drop Database」

これでデータベースそのものを削除できる。
Prometheusでinstance名をホスト名にしたい

Prometheus.yamlでtargetにIPアドレスを指定すると、メトリクスのinstanceラベルにもIPアドレスで記録されてしまいます。

解決方法は3つあります。

- 方法①：DNSサーバで名前解決できるようにして、prometheus.yamlにホスト名を書く
- 方法②：Prometheusサーバの/etc/hostsにホスト名とIPアドレスの対応を書き、prometheus.yamlにホスト名を書く
- 方法③：relabel_configsを使う

この記事では、簡単に試せる方法③を紹介します。

結論だけ。

```yaml:prometheus.yaml
global:
  scrape_interval:     15s
  evaluation_interval: 15s
  external_labels:
      monitor: 'codelab-monitor'

scrape_configs:
  - job_name: 'linux'
    static_configs:
      - targets:
        - 192.168.1.101:9100:server1   #<IP>:<PORT>:<HOSTNAME>
        - 192.168.1.102:9100:server2
    relabel_configs:
      - source_labels: [__address__]  # targetsエントリを分解してinstanceラベルの値を生成する
        regex: '([^:]+):(\d+):(.*)'
        target_label: instance
        replacement: '${3}:${2}'      # instance=<HOSTNAME>:<PORT>
      - source_labels: [__address__]  # targetsエントリを分解して、実際のアクセス先を生成する
        regex: '([^:]+):(\d+):(.*)'
        target_label: __address__
        replacement: '${1}:${2}'      # __address__=<IP>:<PORT> 
```
script.py お買い物条件分岐

money = 1000
items = {'apple': 100, 'banana': 200, 'orange': 400}
for item_name in items:
    print('--------------------------------------------------')
    print('財布には' + str(money) + '円入っています')
    print(item_name + 'は1個' + str(items[item_name]) + '円です')
    
    input_count = input('購入する' + item_name + 'の個数を入力してください：')
    print('購入する' + item_name + 'の個数は' + input_count + '個です')
    
    count = int(input_count)
    total_price = items[item_name] * count
    print('支払い金額は' + str(total_price) + '円です')
    
    if money >= total_price:
        print(item_name + 'を' + input_count + '個買いました')
        money -= total_price
        # if文を用いて、moneyの値が0のときの条件を分岐してください
        if money == 0:
            print('財布が空になりました')
            break
        
        
    else:
        print('お金が足りません')
        print(item_name + 'を買えませんでした')
# 変数moneyと型変換を用いて、「残金は◯◯円です」となるように出力してください
    print('残金は'+str(money)+'円です')
EXCELをアイコンエディタにするツール

# 外観

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411106/56939e83-c86c-7198-b4d2-595fbf48c4f1.png)

# 動作環境

WINDOWS上の EXCEL2010以降 **<font color="RED">32bit 64bit</font>** いずれのバージョンのEXCELでも動作します。

# 特徴

### (1) ImageMso

ImageMsoを指定して、Officeに標準で登録されているアイコンを読込むことが出来ます。
透明色や半透明色は反映されます。



### (2) ファイル形式

PNG, BMP, ICO, JPG, GIFファイルを読込むことが出来ます。	
透明色や半透明色は反映されます。

PNG, BMP, ICOファイルで保存することが出来ます。
PNGファイルで保存すれば、透明色や半透明色は保存されます。



### (3) アイコンサイズ

アイコンのサイズに制約を設けていません。(16x16,24x20,32x32,64x64等々)
すべてのシートのすべてのセルに対して、自由なサイズでアイコンを描画することが出来ます。

読込める画像のサイズにも制約を設けていません。(ただし、大きすぎると予期せぬ不具合の原因になります)
書式（このツールではセルの色）をあまりにも多用しすぎると、不具合を起こすようです。


### (4) 透明色・半透明色

透明色・半透明色(アルファチャンネル)に対応しています。



### (5) UNDO

直前のコマンドのUNDOが可能です。



### (6) 図形(オートシェイプ)

図形(オートシェイプ)からアイコンを作成することが出来ます。



### (7) クリップボード

クリップボードの画像からアイコンを作成することが出来ます。
例えばWEB上のアルファチャンネルが設定された画像をコピーした場合は、透明色・半透明色も反映されます。

作成中のアイコンをクリップボードにコピーすることが出来ます。
ビットマップ形式だけでなく、PNG形式でもコピーされるため、透明色・半透明色も反映されます。



### (8) サンプル表示

編集中のアイコンをリボンに表示することが出来ます。



### (9) 一括読込・一括保存

複数のアイコンを一括で読込むことも、保存することも出来ます。



### (10) 色を値で指定

アイコンの色を数値や演算で指定することも可能です。

そのための便利なセル関数も用意してあります。





# ダウンロード

 [Github](https://github.com/takanaweb5/IconEditor/releases) のサイトから[IconEditor_v105.zip]をダウンロードください。






# ソースコードについて

興味のある方は [Github](https://github.com/takanaweb5/IconEditor) でソースを公開しています。

当ツールを作成するにあたり、いろいろ調べて実現した機能がありますので、以下のようなサンプルを探している方は、ソースの中に参考になるロジックがあると思います。

- EXCELでコピー中のセル範囲(Range)を取得する
- VBAでBMPファイルを保存する
- VBAでICOファイルを保存する
- ImageMsoから透明色を反映した画像を取得する
- VBAでPNG形式のクリップボードデータの読込み および 書込み を行う
- VBAでGDI+ のAPI(64bit)を実行する
- VBAでGDI+ を使ってアルファチャネルの画像を取り扱う
- リボンのボタンのアイコンを外部ファイルを使用せずに動的に変更する

  
# ご意見

バグや要望は下記まで
[https://github.com/takanaweb5/IconEditor](https://github.com/takanaweb5/IconEditor#%E3%81%94%E6%84%8F%E8%A6%8B)

# 紹介記事

https://forest.watch.impress.co.jp/docs/serial/yajiuma/1262538.html

※記事では64bit版の「Microsoft Excel」では動作しないとありますが、<font color=RED>64bit版でも動作します</font>
P5.js 日本語リファレンス(textFont)

このページでは[「P5.js 日本語リファレンス」] (https://qiita.com/bit0101/items/91818244dc26c767a0fe) の textFont関数を説明します。

## textFont() 

### 説明文

text() で描画される現在のフォントを設定します。

WEBGLモードのとき：loadFont() を介して読み込まれたフォントのみがサポートされます。

### 構文

textFont() 

textFont(font, [size])

### パラメタ

- font
Object | String：loadFont() を介して読み込まれたフォント、またはWebセーフフォント(すべてのシステムで一般的に利用可能なフォント)を表す文字列

- size
Number：使用するフォントサイズ(オプション、デフォルト：12)

### 戻り値

Object：現在のフォント

### 例1

```javascript
let fontRegular,  fontBold;

function preload() {
  fontRegular = loadFont('assets/Inconsolata-Regular.ttf');
  fontBold = loadFont('assets/Inconsolata-Bold.ttf');
}

function setup()  {
  createCanvas(300, 300);
  background(210);
  fill(0)
   .strokeWeight(0)
   .textSize(24);
  textFont(fontRegular);
  text('Font Style Normal', 10, 30);
  textFont(fontBold);
  text('Font Style Bold', 10, 70);
}
```

### 実行結果
https://editor.p5js.org/bit0101/sketches/t1EsW2OD_


### 著作権

p5.js was created by Lauren McCarthy and is developed by a community of collaborators, with support from the Processing Foundation and NYU ITP. Identity and graphic design by Jerel Johnson.

### ライセンス

Creative Commons(CC BY-NC-SA 4.0) に従います。