OmniAICreator/Qiita-1.07M huggingface dataset:
EclipseでGitlabとSSH通信の設定

## Step1. EclipseにSSHの設定を行う
クライアント端末にあるEclipseにて下記操作を行います。
Windows -> Preferences -> General

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399736/61e409db-b084-7f4b-e251-9d549275a715.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399736/f3e0b7e9-b2e9-4fc8-4928-c15550db4bfc.png)

Step2. Gitlabに公開鍵を登録します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399736/c2b16dc2-3dae-763d-8bcb-d55d77fc5c74.png)

メモ帳でid_rsa.pubを開き、公開鍵のテキストをコピーします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399736/70288009-3cb4-9094-b7c3-bcb429dd957b.png)

Gitlabへアクセスし、Add SSH keyをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399736/2464f920-48d2-c7d0-e962-4aaf3b2dac52.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399736/09377420-5f69-a4e2-09b4-9a97bd40ab8f.png)

プロジェクトへ移動し、Clone -> Clone with SSHをコピーします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399736/6f7e8d37-7348-530b-961f-263f73a97214.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399736/47675fa4-e64f-9fc0-5516-cfa403444e1d.png)

Clone URI
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399736/4ae11599-c57a-aac6-3cc0-dfe0a1c41fe5.png)

GitlabでコピーしたSSHをURIへペストします。User：git, Password:blankのままでOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399736/79ca57f5-eb69-0657-b37d-1140572f8413.png)

## 参考リンク
https://itsakura.com/eclipse-github-clone-push
https://stackoverflow.com/questions/38920146/git-clone-through-nginx-proxy-for-gitlab-server-is-not-working
https://tektips.xyz/2019/09/fixed-how-to-enable-ssh-for-gitlab-docker-nginx-reverse-proxy/
https://help.directadmin.com/item.php?id=691
CentOS7・CentOS8のDockerコンテナの日本語化および日本時間設定

## 結論
以下のDockerfileをビルドすれば、言語が日本語でタイムゾーンが日本時間のコンテナができます。

〇 CentOS7

```Dockerfile
FROM centos:7
RUN rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 && \
    yum -y update && \
    yum clean all && \
    localedef -f UTF-8 -i ja_JP ja_JP.UTF-8 && \
    ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
ENV LANG="ja_JP UTF-8" \
    LANGUAGE="ja_JP:ja" \
    LC_ALL="ja_JP.UTF-8" \
    TZ="Asia/Tokyo"
```

〇 CentOS8

```Dockerfile
FROM centos:8
RUN rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial && \
    dnf -y upgrade && \
    dnf -y install glibc-locale-source && \
    dnf clean all && \
    localedef -f UTF-8 -i ja_JP ja_JP.UTF-8 && \
    ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
ENV LANG="ja_JP UTF-8" \
    LANGUAGE="ja_JP:ja" \
    LC_ALL="ja_JP.UTF-8" \
    TZ="Asia/Tokyo"
```
## 環境
* Alpne Linux 3.12.0
* Docker version 19.03.11
* [centos:7](https://hub.docker.com/_/centos)
* [centos:8](https://hub.docker.com/_/centos)



## 使い方・確認
上記Dockerファイルがあるディレクトリでコンテナイメージをビルドします。 
その後コンテナを立てて、`date` で日本語化とタイムゾーン設定が反映されていることを確認します。

〇CentOS7

```
$ docker build -t centos:7-ja .
$ docker run -dit --name centos7-ja centos:7-ja
$ docker exec centos7-ja date
2020年  9月 26日 土曜日 19:37:24 JST
```


〇CentOS8

```
$ docker build -t centos:8-ja .
$ docker run -dit --name centos8-ja centos:8-ja
$ docker exec centos8-ja date
2020年  9月 26日 土曜日 19:42:03 JST
```


## 余談
日本語化に必要な設定を把握したくて作りました。 
以下は作業してるうちに知ったことのメモです。

* `rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7` の意味  
rpmパッケージの署名です。rpmパッケージの完全性を確認するために必要です。これを実施していないと、`yum update` で以下のようなwarningが出る可能性があります。  
とはいえエラーが出たところで勝手に上記と同様の操作をしてくれるので、必ず書かなければいけない訳ではありません。不必要なエラーでびっくりしないために実施しています。

```
warning: /var/cache/yum/x86_64/7/updates/packages/bind-license-9.11.4-16.P2.el7_8.6.noarch.rpm: Header V3 RSA/SHA256 Signature, key ID f4a80eb5: NOKEY
```

* `yum clean all` の意味  
`yum update` で生成されたキャッシュをクリアします。以下に示す通り、`yum clean all` をやるかやらないかでイメージサイズが全然違います。両者の違いは `yum clean all` を行ったか否かのみです。  
今回の記事では `yum update` にくっつけましたが、最後の `yum update` および `yum install` 
 より後にないと意味がないので、`RUN` コマンドの最後の方に置いておくとメンテが必要になりにくくて良いかと思います。

```
$ docker images
REPOSITORY          TAG                  IMAGE ID            CREATED             SIZE
centos              7-ja-without-clean   3f6ba3d02f45        5 minutes ago       352MB
centos              7-ja-with-clean      fa93ef373ec3        6 minutes ago       284MB
```

## 参考
* [Window10に日本語対応CentOS7のdockerコンテナを作ってみた](https://qiita.com/0ashina0/items/f8b960e822a40a6a2eed)  
`man` の日本語化についても解説されています。
日本語表示におけるUILabelのbyCharWrappingとbyWordWrappingの違い

#はじめに
Swift の UILabel には折り返しや省略表示を指定するための lineBreakMode というプロパティが用意されています。指定できるモードの中に折り返し位置を単語区切りにする byWordWrapping と、文字区切りにする byCharWrapping があるのですが、byWordWrapping を指定しても日本語の文章は単語区切りで表示されません。それではbyCharWrapping を指定しても byWordWrapping を指定しても違いはないのか、気になったので調べてみました。

#環境
Xcode Version 12.0 
Swift 5.3

#byCharWrapping
lineBreakMode に byCharWrapping を指定して表示したところ画像のようになりました。
わかりやすいようにUILabel の背景を黄色にしています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265215/fd6b3ce1-221e-9f05-8018-0c33426ae437.png)

#byWordWrapping
次に byWordWrapping を指定して同じ文章を表示してみました。
byWordWrapping を指定すると行頭に句読点や括弧の終わり、小文字、伸ばし棒などがこないように調整されるようです。こちらのほうが読みやすいですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265215/2b766cbe-78c6-e013-b5f0-3b714139a2d9.png)

#まとめ
byCharWrapping と byWordWrapping のどちらを指定しても良いという場合は禁則処理が考慮されている byWordWrapping を使用するのが良いようです。

■参考サイト
https://developer.apple.com/documentation/uikit/nslinebreakmode
golangでPre-Signed URL（署名付きURL)を生成する

GolangでPreSignedUrlを発行するコードを書いたので残しておきます。

```golang
package main

import (
	"context"
	"fmt"
	"time"
    "os"


	"github.com/aws/aws-sdk-go/aws"
	"github.com/aws/aws-sdk-go/aws/credentials"
	"github.com/aws/aws-sdk-go/aws/session"
	"github.com/aws/aws-sdk-go/service/s3"
)

	// S3の接続情報
	accessKey := os.Getenv("AWS_ACCSESS_KEY")
	secretKey := os.Getenv("AWS_SECRET_KEY")
	region := aws.String(os.Getenv("CUEE_DB_REGION"))

	creds := credentials.NewStaticCredentials(accsessKey, secretKey, "")
	session := session.Must(session.NewSession(&aws.Config{
		Credentials: creds,
		Region:      region,
	}))
	svc := s3.New(session)
	c, _ := svc.PutObjectRequest(&s3.PutObjectInput{
		Bucket: aws.String("バケット名"),
		Key:    aws.String("/diectory/filename"),
	})

	url, err := c.Presign(15 * time.Minute)
	if err != nil {
		fmt.Println("error presigning request", err)
		return nil, err
	}

	fmt.Println(url)
}
```

ここで有効期限を設定できます

```
url, err := c.Presign(15 * time.Minute)
```


公式
https://docs.aws.amazon.com/sdk-for-go/v1/developer-guide/s3-example-presigned-urls.html

Bodyにファイルを含め、発行されたURLにアクセスすればアップロードできます
【React Native】positionが'absolute'のViewを含むTouchableOpacityをタッチしても反応がない

ハマったので、備忘録として書いておきます。

位置が固定されたボタンを作りたくて、positionが'absolute'のViewを含むTouchableOpacityを作ろうとしましたが、andoridの実機で動作を確認した結果、タッチしても反応しませんでした。
		
	<TouchableOpacity onPress={() => Alert.alert('add')}>
		<View style={styles.localButtom}></View>
	</TouchableOpacity>

	const styles = StyleSheet.create({
	localButtom: {
		alignItems: 'center',
		justifyContent: 'center',
		position: 'absolute',
		zIndex:9999,
		bottom: 16,
		right: 16,
		width: 56,
		height: 56,
		borderRadius: 28,
		elevation: 3,
		backgroundColor: '#FFF',
	}});


githubにissueは挙げられているが、まだ解決されていない様子。
https://github.com/facebook/react-native/issues/27232

TouchableWithoutFeedbackを使ったら実機で反応したので、そちらを使うことにしました。
Scala 2.13.3 で複数引数の中置記法がコンパイルエラーになる

個人というか、プライベートなチーム開発をしていて、折角だからできるだけ新しめのバージョンで実装してみようと思い、Scala2.13.3で実装していて、いつも通りSlickを書いていたら一瞬ハマった話。

# 環境

* Scala 2.13.3
* play-slick 5.0.0

# エラー

```
[info] Compiling 24 Scala sources and 1 Java source to /Users/chibatoshinori/Projects/NewApp/NewAppApi/target/scala-2.13/classes ...
[error] /Users/chibatoshinori/Projects/NewApp/NewApp/app/gateways/abilities/AbilityDetailEntity.scala:33:110: multiarg infix syntax looks like a tuple and will be deprecated
[error]     override def * : ProvenShape[AbilityDetailEntity] = (ability, langCode, abilityName, abilityDescription) <> (AbilityDetailEntity.tupled, AbilityDetailEntity.unapply)
[error]                                                                                                              ^
```

multiarg infix syntax looks like a tuple and will be deprecated

タプルのような複数引数をとる中置記法が非推奨になった模様。

下記のPRが関連というか原因というか。

[Discourage multi-argument infix syntax: lint applications (`x op (a, b)`), also lint operator-name definitions #8951](https://github.com/scala/scala/pull/8951)

PRを見る限りだと、2.13.3からみたい。同じ2.13系でも2.13.2までなら問題なく動くのかも。（確認はしていない）

# 対応

中置記法がだめとのことなので、`.` でつなげる書き方に切り替えて対応。

```scala
override def * : ProvenShape[JobMasterEntity] = (key, calcMethodId, creditMin, creditMax).<>(JobMasterEntity.tupled, JobMasterEntity.unapply)
```
配列内の任意の文字を探す判定するメソッドの作り方

【概要】
----------------------------------------
<b>1.結論</b>

<b>2.includeメソッドとは何か</b>

<b>3.どのようにプログラムしたか</b>




1.結論
----------------------------------------
<b>include?メソッド</b>を使う！

<br>
2.include?メソッドとは何か
----------------------------------------
include?は配列の中に指定した要素が、あるかを判定するメソッドです！

<br>
3.どのようにプログラムしたか
----------------------------------------

```ruby
def array_hello(strs)
  if strs.include?(hello)
    puts "True"
  else
    puts "False"
  end
end
```
"strs"の引数から"hello"という文字を探したいので、
strs.include?(hello)という書き方にしています！
引数.include?(探したい配列内の文字)で適用できます！
<br>
（ECサイト）注文情報入力時におけるバリデーション

#前提条件
ECサイトで注文情報入力　＝＝＞　注文確認画面の間に注文情報入力でバリデーションをかけたい

#1.よく使うバリデーション

```rails:app/models/book.rb
validates :title, presence: true
```
などの普段よく使うバリデーションは
booksテーブルにtitleというカラムがあり
データベースに保存される時、つまり @book.save(book_params)の時にtitleカラムが空白だとバリデーションがかかる。
しかし、ECサイトで注文情報入力　＝＝＞　注文確認画面
　＝＝＞　注文確定（ここで`.save`が行われる）というフローで実装する際、注文情報入力　＝＝＞　注文確認画面の間に`.save`が発生しない為、モデルにかけるバリデーションをrenderで呼び出すことができない為if文で条件分岐を書いて`flash[:notice]`を使う必要がある。

#2.if文の実装
``` rails:app/controllers/order_controllers.rb
when 3
        if    params[:order][:new_add][:postal_code] == "" && params[:order][:new_add][:address] == "" && params[:order][:new_add][:name] == ""
              flash[:notice] = "新しいお届け先が全て入力されていません"
              redirect_to new_order_path
        elsif params[:order][:new_add][:postal_code] == ""
              flash[:notice] = "郵便番号が入力されていません"
              redirect_to new_order_path

        elsif params[:order][:new_add][:address] == ""
              flash[:notice] = "住所が入力されていません"
              redirect_to new_order_path
        elsif params[:order][:new_add][:name] == ""
              flash[:notice] = "宛名が入力されていません"
              redirect_to new_order_path
        else
            @order.postal_code = params[:order][:new_add][:postal_code]
            @order.address = params[:order][:new_add][:address]
            @order.name = params[:order][:new_add][:name]
        end
 end

```
#3.コードの説明
まず、case文を使い、ラジオボタンを３個order/new.html.erbに書きwhenで３パターン分岐させている。
そして、3個目のラジオボタンを選ぶと注文情報入力時に新しいお届け先を入力できるように実装している。
[:new_add]　は注文情報入力時に新しいお届け先を入力する際のパラメータ。


``` rails:app/controllers/order_controllers.rb
params[:フォームで送られてくる値] == ""
flash[:notice] = ”ホニャホニャ"
```
と書くことで空欄の時にフラッシュメッセージを出せる。
#4.今回の実装を終えて
当初　＝＝　nil　にしており値が返ってきていなかったがターミナルを見ると""になっていたので条件文を変えるとうまくいった。
&&で条件文を繋ぐ時に最後に一個だけイコールを入れるのではなく毎回イコールが必要である。
#5.リファクタリング
if文をelsifで繋いで条件文を書きまくるのはあまり良くないらしいので他にいい方法があれば教えてください。
[Flutter] Windows Alphaの発表

Flutter DesktopのWindowsバージョンがAlphaになりました。

https://medium.com/flutter/announcing-flutter-windows-alpha-33982cd0f433


今の時点で、https://blogs.windows.com/windowsexperience/2020/03/16/windows-10-powering-the-world-with-1-billion-monthly-active-devices/　
Windows１０を使っているユーザーは one billion(1,000,000,000)いるらしい。

## Windows用のPlugin Packages
- url_launcher: launch URLs in the browser from your app
- path_provider: find the path to special directions on the user’s machine like Documents or temp
- shared_preferences: keep user preferences serialized on disk between sessions of your app
- biometric_storage: storage encrypted by biometrics
- flutter_audio_desktop: play audio from your desktop apps
2020年現在のコスパのいい画像サイズ（持論）

コスパいい = 最小限の画像サイズで現在普及しているデバイスになるべく対応する。という意味。

# 結論：下記の4サイズ
画像の使用シーンがウィンドウいっぱいまで広げるものの前提。
アイコンなどの場合は適宜小さいサイズにする（mediaQueryの条件は流用できると思う）

- 750px
- 1440px
- 2048px
- 4096px

# SCSS （PC/SPで画像の画角共通、AutoPrefix前提）

```scss
// ベーシックなスマフォ用
// eg:iPhoneX 375@2x = 750
.image {
  background-image: url(750.jpg);
}

// ノートPCと高解像度スマフォ用
// eg:iPhoneXProMax 414@3x = 1242
@media (min-width: 768px),
       (min-resolution: 3dppx) {
  .image {
    background-image: url(1440.jpg);
  }
}

// デスクトップPCとタブレット用
// eg:iPad 768@2x = 1536
// eg:iPadPro 1024@2x = 2048
@media (min-width: 1441px),
       (min-width: 768px) and (min-resolution: 2dppx) {
  .image {
    background-image: url(2048.jpg);
  }
}

// 高解像度外部モニター用
@media (min-width: 1025px) and (min-resolution: 2dppx) {
  .image {
    background-image: url(4096.jpg);
  }
}
```

# img（PC/SPで画像の画角共通）
- cssのmediaは最後に条件のあった設定が適応されるが、sourceのmediaは最初に条件のあった設定が適応されるので定義の順番に注意
- imgのsrcにはsourceタグに対応していないのは旧デスクトップPCと仮定し、通常デスクトップPCの最大サイズである1920pxを想定して `2048.jpg` を指定しておく

```html

<picture>
  <source media="(min-width: 1025px) and (-webkit-min-device-pixel-ratio: 2), (min-width: 1025px) and (min-resolution: 2dppx)" srcset="4096.jpg" />
  <source media="(min-width: 1441px), (min-width: 768px) and (-webkit-min-device-pixel-ratio: 2), (min-width: 768px) and (min-resolution: 2dppx)" srcset="2048.jpg" />
  <source media="(min-width: 768px), (-webkit-min-device-pixel-ratio: 3), (min-resolution: 3dppx)" srcset="1440.jpg" />
  <source media="(max-width: 767px)" srcset="750.jpg" />
  <img src="2048.jpg" />
</picture>
```


# SCSS （PC/SPで画像の画角別々、AutoPrefix前提）
まだ調整中

```scss
// ベーシックなスマフォ用
.image {
  background-image: url(750@mobile.jpg);
}

@media (max-resolution: 1dppx) {
  // ノートPC
  @media (min-width: 768px) {
    .image {
      background-image: url(1440@desktop.jpg);
    }
  }

  // デスクトップPC
  @media (min-width: 1441px) {
    .image {
      background-image: url(2048@desktop.jpg);
    }
  }
}

// 高解像度外部モニター用
// max-resolutionをサポートしていない古いデスクトップはどうする？ -> IEは dpi のみサポート
//@media (min-width: 1025px) and (min-resolution: 2dppx) {
//  .image {
//    background-image: url(4096.jpg);
//  }
//}

@media (min-resolution: 2dppx) {
  // タブレット用
  @media (min-width: 768px) {
    .image {
      background-image: url(2048@mobile.jpg);
    }
  }
}

// 高解像度スマフォ用
@media (min-resolution: 3dppx) {
  @media (max-width: 767px) {
    .image {
      background-image: url(1440@mobile.jpg);
    }
  }
}
```
Railsにフォントを導入するまで

#はじめに
ネット上には素晴らしいフリーフォントがたくさんあります。
デザインの表現の幅を広げるために是非、活用していきたいところ。
そこで、フリーフォントをRailsに導入していきます。

##フォントファイルの導入
ここでは導入したいフォントファイルを`smog.otf`とします。
`public`フォルダに`fonts`フォルダを作り、そこにフォントファイルを配置。

```
- public
    - fonts
        - smog.otf

```

使用するcssファイル(ここでは`sample.css`)に以下のコードを追加します。
`font-family`の名前は自由に設定できます、今回は`'Smog'`としましょう。
また`format`はファイルのフォーマットに合わせます。

| フォーマット  | 拡張子 |
|:-:|:-:|
| format('woff') | .woff |
| format('truetype') | .ttf |
| format('opentype') | .otf または .ttf |
| format('embedded-opentype') | .eot |
| format('svg') | .svg または .svgz |

```css:sample.css
@font-face {
  font-family: "Smog";
  src: asset-url('/fonts/smog.otf') format('opentype');
  font-weight: normal;
  font-style: normal;
}
```

あとはいつも通りcssでフォントを指定すれば使えます。
以下は例です。

```css:sample.css
.foo h1 {
  font-family: 'Smog';
}
```

```erb:index.html.erb
<div class="foo">
  <h1>hello!</h1>
</div>
```

以上です、お疲れ様でした！
[Rails] レイアウト下揃え

##[bootstrap]レイアウト下揃え

**環境**
Rails 5.2.4.4
bootstrap3


**やりたいこと**
col-lg-8のテーブルの下に合わせて、col-lg-3のテーブルを配置


```RubyonRails:show.html.erb
	<div class="col-lg-8" style="position: relative;">
       <table class="table">
	   ...
       </table>
	</div>
		<div class="col-lg-3">
			<div class="absolute" style="position: absolute; bottom: 0;">
			  <table class="table">
			  ...
              </table>
		    </div>
		</div>

```

col-lg-8のテーブルの横にcol-lg-3のテーブルが来て下揃えになると勘違いしていた。
col-lg-3を```"position:relative;"```に変更して
col-lg-3の中で下揃えにしたら解決した。



```RubyonRails:show.html.erb
	<div class="col-lg-8">
       <table class="table">
	   ...
       </table>
	</div>
		<div class="col-lg-3" style="position: relative;">
			<div class="absolute" style="position: absolute; bottom: 0;">
			  <table class="table">
			  ...
              </table>
		    </div>
		</div>

```



ただの色々知識不足です。
勉強していきます。
Xcodeでショートカットを自作し 煩雑な pod install 作業をなくそう

## はじめに
 業務で同時に複数のプロジェクトを見ることがあり、平均すると１日１回ぐらいterminalを開いてpod-installのコマンドを叩いています。本記事はiOSアプリ開発者が良く使うCocoaPodsのコマンドpod-installの作業を楽にするtipsです。XcodeにはBehaviorsと言う機能があり、様々な動作やイベントを設定・追加できます。 その機能を利用して、自動でterminalを開き所定のdirectoryに移動してpod-installコマンドを叩いてくれるショートカットキーを作成します。

## 開発環境
Xcode12 (Xcode11でも動くと思いますが未検証)
Cocoapods 

## セットアップ
#### 1. Scriptを用意
[Script](https://gist.github.com/abhishekbedi1432/c52abef187b376239b8ef3a38a70f77e) をダウンロード

```sh
#!/bin/sh
osascript <<END
tell application "Terminal"
if not (exists window 1) then reopen
activate
do script "cd `pwd`; pod install" in window 1
end tell
END
```

#### 2. 実行権限の付与 
権限の確認

```sh
$ ls -l Pod-Install.sh 
-rw-rw-r--@ 1 yasuradodo  staff  158 Sep 19 19:40 Pod-Install.sh
```

もし実行権限がなければ、実行権限`x`の付与

```sh
$ chmod u+x Pod-Install.sh  
```
再度権限の確認

```sh
$ ls -l Pod-Install.sh 
-rwxrw-r--@ 1 yasuradodo  staff  158 Sep 19 19:40 Pod-Install.sh
```

#### 3. XcodeのBehaviorsでCustom commandを作成
XcodeのPreferencesからBehaviorsを選択し、左下にある＋をタップしてCustom commandを作成します。
ショートカットには好きなキーを登録しましょう。筆者は `shift + command + p`にしました。
![Screen_Shot_2020-09-26_at_18_30_48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/71420/af4ec2dc-4707-d655-1276-a6ba154f0bdb.png)
これで、Xcode上で登録したショートカットでいつでも自動的にpod-installが実行できます。

## 終わりに
今回はpod-installだけでしたが、Carthage, SourceTree, SwiftLintなど様々な物に対応でき作業効率を向上できます。
他にも便利なBehaviorsの使い方などあれば、教えていただきたいです :pray: 

## 参考文献
https://medium.com/@abhishekbedi/never-type-pod-install-again-ever-eb55386eef59
https://github.com/JeaSungLEE/Awesome-Xcode-Behaviors
内部統制を構成する6つの基本的要素の一つ：ITへの対応

応用情報技術者平成29年春期 午前60

金融庁の"財務報告に係る内部統制の評価及び監査に関する実施基準"における"ITへの対応"に関する記述のうち，適切なものはどれか。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/8e8dd698-41e3-1506-7797-1ee04c526919.png)


１、"ITへの対応"は
内部統制を構成する6つの基本的要素の1つで、組織目標を達成するために予め適切な方針及び手続を定め、それを踏まえて、業務の実施において組織の内外のITに対し適切に対応することをいいます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/0ab1c606-67c2-5f31-225d-7411bc798048.png)


２、
・IT環境とは，企業内部に限られた範囲でのITの利用状況である。
⇒×。IT環境とは、組織が活動する上で必然的に関わる内外のITの利用状況のことで、社会及び市場におけるITの浸透度、組織が行う取引等におけるITの利用状況、及び組織が選択的に拠り所にしている一連の情報システムの状況等をいいます。

IT環境は、組織に係る、一連の情報システムの状況などを指す。


・ITの統制は，ITに係る全般統制及びITに係る業務処理統制から成る。
⇒○。ITの統制は、ITを取り入れた情報システムに関する統制活動で、全般統制と業務処理統制の二つからなります。


・ITの利用によって統制活動を自動化している場合，当該統制活動は有効であると評価される。
⇒×。ITを活用した統制活動では手作業に比べて迅速な情報処理が期待できるほか、人為的なミスの防止が可能になります。しかし不正等の発見が困難になるといった問題点もあるため、プログラムの改ざんや不正使用の防止を目的としたアクセス管理策などが講じられている必要があります。

IT利用は、改ざん、不正使用などの防止を目的としたアクセス管理策。

・ITを利用せず手作業だけで内部統制を運用している場合，直ちに内部統制の不備となる。
⇒×。手作業のミスを防止するための管理策が講じられている必要はありますが、ITを利用していないことが直ちに内部統制の不備となるわけではありません。


参照：
https://www.ap-siken.com/kakomon/28_aki/q60.html

財務報告に係る内部統制の評価及び監査に関する実施基準(31頁～)
http://www.fsa.go.jp/singi/singi_kigyou/tosin/20070215.pdf
英語力を鍛え直してリーダブルコードを原著で読めるようになった話

Webエンジニアになってもうすぐ1年です。
英語の苦手意識を克服すべく英単語から学び直し、リーダブルコードの原著を英語で読めるまでに成長したので、やったことをまとめます。

おおよそ、リーダブルコードを読むまでの英語学習に45時間、リーダブルコードを読むのに15時間くらいかかりました。

## 英語学習のきっかけ
僕は30歳間近でエンジニアになりましたが、英語に触れるのは大学受験ぶり、つまり10年以上ぶりでした。
文系のため、大学では英語の論文を読む機会もなく過ごしました。

しかし、エンジニアになると、ソースコードやログ、ドキュメントなど多くの情報が英語で書かれています。
英語がわからないため、日々触れる英語にストレスを感じていました。

とはいえ、ドキュメントを読みこなせないと業務に支障をきたしてしまいます。
重い腰を上げて、英語学習を始めることにしました。

## ITエンジニアに必要な最低限の英語を学ぶ(5時間)
まずは、エンジニアが触れる英文を中心に解説した書籍を読みました。

『プログラミング英語教本』

エンジニア特有の英単語(例えば、annotation => 注釈、bump => バージョンを上げる、campatibility => 互換性 など)や
ドキュメントの記法を学んだことで、英語への理解がだいぶ高まりました。

この時点で、APIドキュメント程度をなんとか読めるレベルの英語力がつきました。

苦手だった英語ですが、ちょっとした努力でこんなに簡単に苦手意識を克服できて嬉しかったです。
このタイミングで僕は英語へのモチベーションが爆増したので、ここからは英語でブログや技術書を読めることを目標に、さらなるレベルアップを目指しました。

## 英単語(10時間)
英文を読む際に、わからない英単語を調べながら非効率的なので、英単語帳を読みました。
学生時代から利用していた、単語帳を5回程度読み直しました。

『DUO 3.0』

単語帳をひととおり終えておくと、知らない単語に出くわす確率が減り、英文を読むハードルがぐっと減りました。

## 英文読解(10時間)
英文を読む際に、「主語はどれ?」とか「この比較級は何だろう?」といった疑問がわき、読みこなせないことがあるので、英文読解の本を読みました。

学生時代に利用していた思い入れのある書籍をざっと一通り目を通しました。

『英文読解の透視図』

この時点で、何度も読み返せば英文の意味を把握できるようになってきました。

## 英文法(10時間)
英文読解の学習中に、わからない文法用語を都度調べていました。
Kindleのリフロー版で購入できる書籍を利用しました。

『表現のための実践ロイヤル英文法』

5文型の把握から始め、苦手な「分詞」や「関係代名詞」をを中心に、一通り目を通しました。

## 長文読解(10時間)
英語の長文の大意をざっくりと把握し、速読力を上げるために、長文読解の学習をしました。

『ロジカル・リーディング ~三角ロジックで英語がすんなり読める~』

信号語(ButやTherefore)に注意しながら読むことで、英文の意味を取り違えることがぐっと減ったように感じます。

## リーダブルコードを読む(15時間)
これまでのステップで、リーダブルコードを読む下地が整ったので、いざ読み始めます。

『The Art of Readable Code』

わからない文法は都度調べながら、知らない単語はWeblioで調べ単語登録(だいたい200語くらい登録)しながらすすめました。

リーダブルコードは技術的な難易度が高くないことに加え、日本語版を読んだことがあったので、原著を読むには最適と判断しました。

英語を読んでいて、どうしても意味がわからなければ、日本語版を読めば意味がわかりますからね。

特に、Part1は読みやすく英語に慣れるのによかったです。Part2以降は徐々に難易度が高くなってきましたが、そんなに苦戦せず読むことができました。

## まとめ
英語の技術書を1冊読み切ったことは大きな自信に繋がりました。

英語で取得するほうが有益な情報(新しい技術や少しマイナーな技術)を英語で取得してレベルアップしていきたいと思います。

そのうち、TOEICを受けてみるのも面白そうだなと感じています。
みなさまの英語力アップにお役に立てれば幸いです。
NanoSTL(a portable and small subset of C++ STL) が CUDA で使えるようになってきました

## 背景

* CUDA(device 側)でもおてがるぱぱっと時短で `std::vector` とか使いたい
 * 特に性能は気にしない(データのセットアップだったりと, パフォーマンスに影響しないところで使う) 
 * CPU 実行のコードと統一したい(CUDA 用に書き換えるのめんどかったり, CUDA でうまく動かないときに CPU でデバッグしすくするためとか)
* Thrust とかあるが, でかすぎだったりコンパイル設定しんどい
 * `std::vector` とか `std::string` とかがぱぱっと使えるくらいでよい 
* `libcu++`(libc++ ベース) https://github.com/NVIDIA/libcudacxx の動きがあるが, 現状 atomic とかだけで vector などコンテナ系は無い
 * 2,3 年後くらいには vector とかコンテナ系対応しているかも 

NanoSTL をいくつか CUDA 対応してみました
現状 `master` に取り込んでいます.

https://github.com/lighttransport/nanostl

## 移植手順

基本 `__CUDACC__` が定義されていたら, 関数に `__device__`, `__host__` 追加するだけでした.

NanoSTL はヘッダだけでライブラリ部分はありませんので, CUDA プログラム側では include するだけで使えます.

## サンプル

```c++
#include <nanovector.h>

extern "C" {
__global__ void myfunction() {
  nanostl::vector<float> ab;
  ab.push_back(1.0f);
}
```

という感じに普通に使えます. CUDA(NVCC)自体は, C++ 構文自体は C++17 まで対応していますので, 必要なら `using` で `std` namespace にマッピングしてあげて.

C++ モード(pycuda の場合は `no_extern_c=1`)でコンパイルする必要あります.

## 制約

host と device でメモリをよろしくやり取りするのは考慮していません.
(e.g. CPU 側で定義した `vector` を GPU 側から透過的に見えるようにするなど)

明示的にメモリ転送のロジックを記述していただく必要があります.

## Note

CUDA では, `new/delete`, `malloc()/free()` が device 側から呼べます(正確には SM 2.x(Fermi) 以降で対応であるが, Fermi サポートは打ち切られ現状は Kepler 以上という状況なので, 実質対応していると考えてよい)

OpenCL for C++(OpenCL 3.0)でも, 同様に kernel 側で `new/delete` or `malloc()/free()` 相当を呼ぶことができるのであれば比較的簡単に NanoSTL を OpenCL に移植できるでしょう.
この行がマージされたプルリクを見たい

最近よくコードリーディングをしているので、GitLensを重宝しています。
https://marketplace.visualstudio.com/items?itemName=eamodio.gitlens

コミットIDやコミットメッセージを簡単に見られるので、
「なぜこの変更が行われたのか」を確認することができます。神。

ただ、この情報だけでは足りず
「このコミットがマージされたプルリクを見たい」となることがあります。
こうなると、

1. GitHubで該当のCommitを開く<br>
   https://github.com/[user|org]/[repo]/commit/[commit_id]
2. プルリクへのリンクがあるのでクリック

と確認することになりますが、繰り返していくと面倒になってきます。
そこで、シェルを作りました。

```bash:git-open-pr
#!/bin/bash -eu

DEFAULT_BRANCH=$(git remote show origin | grep "HEAD branch" | sed "s/.*: //")

COMMIT_ID=$(grep -Fxf \
  <(git log --first-parent --merges --pretty=format:%H $DEFAULT_BRANCH; echo) \
  <(git log --ancestry-path --merges --pretty=format:%H $1..$DEFAULT_BRANCH; echo) \
| tail -n 1)

COMMIT_MSG=$(git log $COMMIT_ID -n1 --pretty=format:%s)
PR_NO=$(echo $COMMIT_MSG | egrep --only-matching '#\d+')

GIT_URL=$(git remote get-url origin)
REPO_PATH=${GIT_URL#git@github.com:}
REPO_SIGN=${REPO_PATH%.git}

open "https://github.com/$REPO_SIGN/pull/${PR_NO#\#}"

```

# 使い方
1. 上記のシェルを `git-open-pr` とか名付けて
2. `chmod 744 git-open-pr`（実行権限を付与）
3. PATHが通っている場所においてください<br>
   （私は自作シェル置き場(`$HOME/bin`など)を作って、<br>
   `.bash_profile`や`.zshrc`に`export PATH=PATH:$HOME/bin`と書いてあります）
4. 該当のレポジトリでCommit IDを指定して実行

  ```bash
  $ git-open-pr xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
  ```

GitHubのプルリクページが一発で開きます

# 前提
- 多分Macでしか動作しません
- GitHubで「Create a Merge Commit」でマージされたプルリクでないと開けません
- マージコミットのsubjectが `Merge pull request #100 from branch_name` の形式になっていることを利用しています

### 動作確認環境
```bash
% sw_vers -productVersion
10.15.6   # Catalina

% xcode-select --version
xcode-select version 2373.

% git --version
git version 2.28.0
```

# きもち
vscode拡張とか作ってvscode上で完結したいな...

# 参考
https://ja.stackoverflow.com/questions/12852/特定のコミットに対して-それが対象のブランチへ-どのマージコミットでマージされたかを判定するには
https://git-scm.com/docs/pretty-formats
Pythonで、ファイルの書き出しと出力

### Pythonで、ファイルの操作をする。
簡単ですが、ファイルの操作のコードです。
ディレクトリーファイルを作って、フロントエンドとバックエンドのファイルを管理する認識だと思います。
合ってますでしょうか？
実行環境は、Pycharm
Macbook pro 13 2020を使用しています。

### 実行したソースコード
```python

import string

with open('directly_folder/sample.html') as f: #sample.txtでも可能
    t = string.Template(f.read())
contents = t.substitute(name='your nickname',contents='favorite phase?')
print(contents)
```


以下のコードがファイルの場所と内容を示すコードです。

```python
py -m pip openpyxl //windowsの場合 コマンドプロンプト
pip openpyxl //　ターミナルで、インストールされているか確認する
pip openpyxl--upgrade pip//　アップデートする

import os
import sys
import openpyxl
wb = openpyxl.load_workbook(path)
ws = wb["Sheet1"]
ws["A1"].value = "X"
wb.save(path)

```
### エラーへの対処がすこしわかりました。
ファイルは、エクセルシートへの出力でしょうか。
Jupyternotebookでしたら、可能です。
https://gammasoft.jp/support/pip-install-error/
参考リンクです。
ServiceNow - KnowledgeBase記事の添付ファイルをダウンロードするPythonスクリプト

#概要
ServiceNowのAPIを利用して指定したKnowledeBase記事のすべての添付ファイルをダウンロードするPython3.7スクリプトです。

```
import requests

from servicenowapis.constants import ATTACHMENT_API, DOWNLOAD_DIR, REQUEST_HEADER,\
    SERVICENOW_PWD, SERVICENOW_URL,SERVICENOW_USER, TABLE_API


def get_table_data(table_name, param):
    url = SERVICENOW_URL + '/' + TABLE_API + '/' + table_name + '?' + param
    response = requests.get(url, auth=(SERVICENOW_USER, SERVICENOW_PWD), headers=REQUEST_HEADER.get('json'))
    if response.status_code != 200: # if error, then exit
        print('Status:', response.status_code, 'Headers:', response.headers, 'Error Response:', response.json())
        exit()
    return response.json()


def get_attachment_info(sys_id):
    url = SERVICENOW_URL + ATTACHMENT_API + '/' + sys_id
    response = requests.get(url, auth=(SERVICENOW_USER, SERVICENOW_PWD), headers=REQUEST_HEADER.get('json'))
    if response.status_code != 200:  # if error, then exit
        print(f'Status:  {response.status_code}, Headers:{response.headers}')
        exit()
    return response.json()


def get_attachment(att_sys_id, file_type, download_dir):
    url = SERVICENOW_URL + '/' + ATTACHMENT_API + '/' + att_sys_id + '/file'
    response = requests.get(url, auth=(SERVICENOW_USER, SERVICENOW_PWD), headers=REQUEST_HEADER.get(file_type))
    if response.status_code != 200:  # if error, then exit
        print('Status:', response.status_code, 'Headers:', response.headers, 'Error Response:', response.json())
        exit()
    with open(download_dir, 'wb') as f:
        for chunk in response:
            f.write(chunk)


def get_kb_attachment(kb_number):
    param = 'sysparm_query=number=' + kb_number + '&sysparam_limit=1'
    kb_info = get_table_data('kb_knowledge', param)
    kb_sys_id = kb_info.get('result')[0].get('sys_id')

    param = 'sysparm_query=table_sys_id=' + kb_sys_id + '&sysparam_limit=1'
    kb_attachments = get_table_data('sys_attachment', param)
    result = kb_attachments.get('result')
    for attach_file in result:
        attach_sys_id = attach_file.get('sys_id')
        content_type = attach_file.get('content_type').split('/')
        file_ext = content_type[1]
        file_name = attach_file.get('file_name')
        get_attachment(attach_sys_id, file_ext, DOWNLOAD_DIR + file_name)


if __name__ == '__main__':
    get_kb_attachment('<kb article number>')  # knowledge base number e.g.KB0010062
```
Constants.py

```
SERVICENOW_URL = 'https://<instance>.service-now.com'
SERVICENOW_USER = 'username'
SERVICENOW_PWD = 'password'

DOWNLOAD_DIR = 'C:/Users/hozawa/downloads/'

REQUEST_HEADER = {"json": {"Content-Type": "application/xml", "Accept": "application/json"},
                  "png": {"Content-Type": "application/xml", "Accept": "application/png"},
                  "xml": {"Content-Type": "application/xml", "Accept": "application/xml"},
                  }

ATTACHMENT_API = '/api/now/attachment'
TABLE_API = '/api/now/table'
```
mysqlとLaravelの接続


#データベースの設定

```.env
DB_CONNECTION=mysql
DB_HOST=localhost
DB_PORT=8889
DB_DATABASE=recommendMovie_db
DB_USERNAME=root
DB_PASSWORD=root
```



![Screen Shot 2020-09-26 at 18.21.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/736153/f10b6223-4fd8-d28b-fe51-5118bfb233a0.png)
サーバー上の未知のディレクトリを転送するならrsync -avが無難。

サーバー上の未知のディレクトリをローカルに転送する場合、下記のコマンドをローカルで実行すると無難だと思いました。

```zsh
rsync -av username@server_ip:/(絶対パス)/ local_dir
```

未知のディレクトリ配下にシンボリックリンクがあっても良い感じに転送してくれるのが`rsync -av`でした。
例えば`scp -r`などで転送するとシンボリックリンクの中身も全部コピーされてしまい、転送に時間がかかります。


__補足__

rsyncのオプションです。
* `-a`:	-rlptgoDと同じ意味
* `-r`:	指定ディレクトリ配下をすべて対象とする
* `-l`:	シンボリックリンクは、そのままシンボリックリンクとしてコピーする
* `-p`:	パーミッションをそのままコピーする
* `-t`:	タイムスタンプをそのままコピーする
* `-g`:	グループをそのままコピーする
* `-o`:	ファイル所有者をそのままコピーする
* `-D`:	デバイスファイルや特殊ファイルを保持する(--devices --specialと同じ)
* `-v`:	verboseモードで動作状況を表示する

`-av`はこれら全部を指定しているのと同じです。

(追記)
* `-u`:	追加・変更されたファイルのみコピー
* `--delete`:	同期元にないファイルを同期先から削除
* `--exclude`:	除外したいファイルを指定

__参考__
https://qiita.com/crarrry/items/21fec46888e8b744346a
C言語で０から10000まで計算せずに2進数を求めて一覧表示してみた

C言語で10進数を2進数で表示するときに10進数を2進数に変換するために計算を行っていると思いますが、少しの計算でも量が多くなると、時間がかかるようになる？かと思います。しかし**共用体**を使って、変数に格納された10進数の内部データをビット単位で表示していけば、2進数への変換の計算の時間を省く事が出来るのではないかと思います。間違ってたらすみません。


```C
#include <stdio.h>
#include <conio.h>

struct sample
{
	unsigned a : 1;
	unsigned b : 1;
	unsigned c : 1;
	unsigned d : 1;
	unsigned e : 1;
	unsigned f : 1;
	unsigned g : 1;
	unsigned h : 1;

	unsigned i : 1;
	unsigned j : 1;
	unsigned k : 1;
	unsigned l : 1;
	unsigned m : 1;
	unsigned n : 1;
	unsigned o : 1;
	unsigned p : 1;
};

union key_type {
	short sh;
	struct sample bits;
} key;

int main(void)
{

	for (int i = 0; i <= 10000; i++) {
		key.sh = i;
		printf("\n%dのバイナリコード: ",i);

		if (key.bits.p) printf("1");
		else printf("0");
		if (key.bits.o) printf("1");
		else printf("0");
		if (key.bits.n) printf("1");
		else printf("0");
		if (key.bits.m) printf("1");
		else printf("0");
		printf(" ");

		if (key.bits.l) printf("1");
		else printf("0");
		if (key.bits.k) printf("1");
		else printf("0");
		if (key.bits.j) printf("1");
		else printf("0");
		if (key.bits.i) printf("1");
		else printf("0");
		printf(" ");

		if (key.bits.h) printf("1");
		else printf("0");
		if (key.bits.g) printf("1");
		else printf("0");
		if (key.bits.f) printf("1");
		else printf("0");
		if (key.bits.e) printf("1");
		else printf("0");
		printf(" ");

		if (key.bits.d) printf("1");
		else printf("0");
		if (key.bits.c) printf("1");
		else printf("0");
		if (key.bits.b) printf("1");
		else printf("0");
		if (key.bits.a) printf("1");
		else printf("0");

		printf("\n");
	}
	return 0;
}
```

実行結果

```
0のバイナリコード: 0000 0000 0000 0000

1のバイナリコード: 0000 0000 0000 0001

2のバイナリコード: 0000 0000 0000 0010

           ～～～～～～～～～～

9997のバイナリコード: 0010 0111 0000 1101

9998のバイナリコード: 0010 0111 0000 1110

9999のバイナリコード: 0010 0111 0000 1111

10000のバイナリコード: 0010 0111 0001 0000
```
Windows10 に　WSL2をインストールできなかった場合の対処事例

# 発生した現象
 **WSL2で「WSL2を実行するには、カーネルコンポーネントの更新が必要です」**と出るが、すでに2004にアップデートしている。今回はこの対応について記述する。
# 対策方法
　簡単にいうとwsl_update_x64.msiをインストールするのであるが、それが大変であった。そのためにここに記しておく。
## wsl_update_x64.msiの入手
　いろいろな記事で、wsl_update_x64.msiをインストールすると書いてある。しかし、https://aka.ms/wsl2 を参照してもそれが、なかった。そこでさらに調べてみると[WSL2 に必要な msi が見つからない人へ](https://qiita.com/selpo/items/ee0b9c75526b4094e786)に書いてあるように、[英語版](https://docs.microsoft.com/en-US/windows/wsl/install-win10#step-4---download-the-linux-kernel-update-package)にアクセスすると手にいれることができました。
## それでも、エラーが発生する
　上記wsl_update_x64.msiをインストールしても同様のエラーが継続しました。そこで**Windows Subsystem for Linux Update**を**アプリと機能**から削除し再インストールするとエラーがでなくなりました。
　また、これらの一連の作業においてはできるだけ再起動していました。以上です。
【Python3】標準入力【チートシート】

## 前提
NumPyの配列で表現したい場合については、np.array()で変換できることから省略する。

```python:NumPyの配列化
l = [[1, 2, 3], [4, 5, 6]]
l = np.array(l)
# l = [[1 2 3][4 5 6]]
```

<br>

| 入力　　　　　 | コード　　　　　　　　　　　　　　　　　　　　　 | 備考 |
|:-----------|:------------|:------------|
| a | s = input() |  |
| 1 | s = int(input()) |  |
| a b c | s = list(input().split()) <br> x, y, z = input().split() |  |
| 1 2 3 | n = list(map(int, input().split())) <br> x, y, z = input().split() |  |
| 3 <br> a <br> b <br> c | n = int(input()) <br> l = [input() for i in range(n)] |  |
| 3 <br> 1 <br> 2 <br> 3 | n = int(input()) <br> l = [int(input()) for i in range(n)] |  |
| 2 3 <br> a b c <br> d e f | n, m = map(int, input().split()) <br> l = [list(input().split()) for i in range(n)] <br>---<br>n, m = map(int, input().split()) <br> l = sum([list(input().split()) for i in range(n)], [])| ネスト形式と平坦な形式 |
| 2 3 <br> 1 2 3 <br> 4 5 6 | n, m = map(int, input().split()) <br> l = [list(map(int, input().split())) for i in range(n)] <br>---<br>n, m = map(int, input().split()) <br>l = sum([list(map(int, input().split())) for i in range(n)], [])|  |
| 3 2<br>1 a<br>2 b<br>3 c | n, m = map(int, input().split())<br>l = []<br>for i in range(n):<br>　　x, y = input().split()<br>　　l.append([int(x), y]) |  |
| 3<br>1 2 3 4<br>5 6 7 8<br>9 10 11 12 | n = int(input())<br>l = [list(map(int, input().split())) for i in range(n)]<br>graph = {}<br>for i in range(n):<br>　　graph.setdefault(str(l[i][0]), []).append(l[i][1:])<br>print(graph) | グラフ形式で取得 |
Node.jsのインストール

#インストール方法
変なところでつまづいたので、記録のために記載します。

###ディレクトリの作成

```
$ mkdir -p ~/.nodebrew/src
```
###Nodebrewのインストール


```
$ brew install nodebrew
```


###Node.jsのインストール
nodebrew ls-remoteでダウンロードできるバージョンを確認できます。
今回はstable = 安定版を選択
バージョンを指定する場合は　{version}

```
$ nodebrew install-binary stable
```

###Node.jsの有効化　※忘れがち
インストールしただけでは有効化していません。

```
$ nodebrew use vインストールしたバージョンのいずれかを指定
```


###環境パス
nodeが使えるように環境パスを通します。

```
$ echo 'export PATH=$HOME/.nodebrew/current/bin:$PATH' >> ~/.zprofile
```


###無事使用できるかの確認
実行後、バージョンが表示されればOK

```
$ node -v
```
IBMグローバル主催のカンファレンス、バッジを６個も取れました。

先週の９月２２日開催の[IBM Digital Developer Conference](https://developer.ibm.com/conferences/digital-developer-conference-hybrid-cloud-apac/)に参加してバッジを取得しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59741/f5cf4091-c545-d0a6-101e-5120f68f0dfe.png)
　簡単に取得方法を書いておきます。

今回のイベントは以下の３つのトラックに別れており、バッジを取得するためにはトラック３のハンズオンラボをメインに受ける必要がありました。
トラック１：　Application Development
トラック２：　DevOps
トラック３：　ハンズオンラボ

　トラック３の手順はこちらにもあるのでどんなことをやっているかはみることができます。
＊実際にこの内容を行うためにはOpenShiftのクラスターを作成しなければいけません。
*しかしこのハンズオンを全部やらなくてもどんなことをやっているかを理解すればクイズを受けてバッジを取得できます。
https://ibm-developer.gitbook.io/digital-developer-conference-hybrid-cloud/threat-modeling-and-identity-management/some-section/threat-modeling

上記の手順をざっと見て以下のサイトに行きクイズに答えるとバッジが取得できます。
https://cognitiveclass.ai/learn/hybrid-cloud-conf-app-developer
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59741/a16ab063-c143-2c20-3fcf-aea017c9f878.png)

この画面にもある様に５つのコースのクイズに答えそれぞれ８０％以上の回答率でバッジをもらえます。
５つ全部合格したら全部終了したということでもう一つバッジがもらえるので合計６個のバッジになります。
## 注意事項
クイズは２回しか受けられません。また１回目と２回目は２４時間開けないと受けられません。
とはいえクイズは２択か４択です。ちゃんとやっていれば難しくはないです。
しかも一回あたり一つ間違えても大丈夫（サブミットボタン押して間違っていたら答えを変えられる）
内容的にはOpenShiftを使うためには知っておきたい基本的なことなのでOpenShiftをこれから使っていく方はやってみるといいと思います。
Windows Server 2019 Essentials をHyper-V運用（ファイルサーバ化）③

小規模事業所のファイルサーバーを、Hyper-V上のWindowsServer2019Essentialsで組んでいます。

[Windows Server 2019 Essentials をHyper-V運用（ファイルサーバ化）②](https://qiita.com/sasaan/items/b05a5a4d48bf0decad70)

さて、かなり時間が空いてしまいましたが。。

各クライアントコンピュータとユーザーの設定をしたので備忘録的に。②からの経過で多少サーバーのストレージ設定やバックアップ設定はいじってしまいました。Bitlockerはシステムをいれている

##端末の追加

- クライアントPCのIPv4の優先DNSをサーバーのIP(192.168.1.203)へ変更。安定性が心配なので代替IPへFortiのDNS(208.91.112.52)を残す。そうすればサーバーが切れてもインターネットはできるはず。ゆる設定ですがまずは。
- 端末のコントロールパネル→システム→設定の変更からドメインの設定へ。とりあえず(shandomain.local)を指定してAdministratorで設定。本来は端末をサーバー側に設定してAdministrator以外でログインしないとなのかな…。。よく分かってないです。
- サーバー側で予め各職員のユーザーアカウントを作っておいたので、共有フォルダにユーザーでのアクセス権を「変更」で付与
- 初回のアクセス時に「資格情報を記憶する」にチェックを忘れないこと！
- デスクトップ上やエクスプローラーのクイックアクセスにリンクを貼っておく
AndroidStudioで（ほぼ）無限にUndoする

## Android Studio 唯一の問題点
AndroidStudio大好きです。年々改善が施されてきて史上最強のAndroid開発環境となりつつあります。Android開発者なら「必ず」入れているであろうこのAndroidStudioですが、とてもとても残念極まりない問題点があります。それが......

「**Undoが全然できない問題**」

です。開発者なら「**あぁぁ！やり直しだくそやろう！！**」なんて場面は嫌ほどあったでしょうが、そのたびに直面するこの問題。Gitにコミットしているなら別に問題はないですが、コミットから編集し初めて結構経った後のあの場面に戻りたい！！なんてことはよくあります。イライラしながら必死にCtrl＋Zを押すわけですが、戻る戻る......と思った次の瞬間、Undoが停止します。そうです。AndroidStudioのUndoは100件までが上限なのです。「**あぁぁぁぁぁぁ...**」と絶望し、直前のコミットから再編集をし始めるのでした......

なんて悲劇を二度と繰り返さないよう、そしてAndroidStudioを完璧なエディタに仕上げるために、Undoを（ほぼ）無限にできるようにしたいと思います。

## （ほぼ）無限にUndoする
### STEP 1
まずAndroidStudioを開き「アクションの検索」ダイアログを出します。ショートカットの場合はCtrl+Shift+Aです。マウスで操作する場合はヘルプ->アクションの検索をクリックすると出ます。
![STEP1](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420833/e489d01c-fa65-ccd5-f7d1-95d1d1ffd395.png)

### STEP 2
検索バーに「レジストリー」と入力します。私は日本語化しているので日本語で入力していますが、英語版の方は英語でregistryと入力します。そして出てきた検索結果をクリックしてください。
![STEP2](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420833/79a353dd-15ca-1739-80ad-c148502e25c7.png)

### STEP 3
スクロールして「undo.documentUndoLimit」という項目を探します。右がその値で、Undoの上限数です。デフォルトでは100回が上限となっています。この値はint値ですので、上限の2147483647をぶち込みます。無限にUndoできたらいいなと思っていたのですが、-1や0を入力してもエラーになるだけでうまくいきませんでした。Googleさん。無限にUndoできるようにしてください。
![STEP3](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420833/c0d97468-5b7e-52a8-6d8d-0557ce9074e5.png)

## Undoライフを楽しんで
これで操作は以上です。一つ注意として、この値を変更したからと言ってこの値を変更する以前までUndoできるわけではありません。変更を行って初めてDoの記録を始めるので、2147483647回戻れるようになるには2147483647回何かをDoしなければなりません。それでは、良いUndoライフを！
AhaSlide: オンラインプレゼンテーション　インタラクティブツール

AhaSlideが面白そうなので、少し使ってみた。

# AhaSlide

- [Aha Slide] (https://ahaslides.com/ja/?source=blog&medium=landing_site&campaign=landing_site&content=what_is_interactive_presentation_softwareAha Slide] )

## つくってみた
見られないですが ... [AhaSlide Try#1](https://presenter.ahaslides.com/presentation/408178)

### カテゴリー

- Question Type: 通常のアンケート方式
- Quiz game: 明示的に参加をして、時間を切って答えを求める形式
- Content Slide: 静的なスライド
 - PPTやGoogle SlideをImportすると、Contet Slideとして展開される
 - QR CODE: スライドとして挿入もできるが、メニューからも表示可能


## プレゼンテーション時のメニュー
画面にマウスオーバーすると左下にメニューが出る

- Stopping presentation: プレゼンのストップ
- Switch to window view / full screen: フルスクリーンとウィンドウの切り替え
- Show QR code: QRコードの表示
- Hide instruction Bar: 参加するには:xxxxxの表示\非表示
- Switch to private: 未確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529969/737a31f2-4f3f-bc3d-e38d-6997e677789b.png)

## 解説記事など
- [インタラクティブプレゼンテーションソフトウェアとは何ですか？](https://ahaslides.com/ja/blog/what-is-interactive-presentation-software-and-how-should-you-use-it/)
- [プレゼンテーションを始める7つの優れた方法（ネタバレ：インタラクティブに！）](https://ahaslides.com/ja/blog/great-ways-to-start-off-your-presentation-make-it-interactive/)


# ツール紹介
- [苦手を克服しよう！資料作成から公開まで使えるプレゼンのためのツール10選](https://techacademy.jp/magazine/15076)
- [LTに使えるオンラインプレゼンツール 7例](https://qiita.com/ikegam1/items/655a63ab6bf1d87b5d43)
【C#】Reflectionでジェネリックを扱う方法

#はじめに
C#でReflectionを使ったことがありますか？
Reflectionを使うことで今まではできなかったような処理を書くことができます
その一つとしてgenericのクラスの呼び出し方法を今回はご紹介します。

#Typeを取得する
##普通に取得する方法

```csharp
呼び出したいインスタンス.GetType();
```
```csharp
Type.GetType("genericの型`引数の型の数[[型],[型].....]"):
```
```csharp
typeof(genericの型<型>);
```

**注意点としては文字列で<>ではなく[]にする必要があり、ジェネリックの数が`の後に必要です**

通常ライブラリを使うだけならなにも問題はありません
しかし、**動的コード生成する場合や動的にDLLを読み込む**ときに使用する場合は問題が発生します。

##動的な読み込みの際に取得する方法
動的にDLL等を読み込むときは上記の方法ではできません
なので別な方法でする必要があります。
これは他のクラスを取得する方法と同じだと**思っていました**
しかしそれではダメだったのでご紹介します

###ダメだった方法
```csharp
呼び出したいアセンブリ型のインスタンス.GetType("genericの型`引数の型の数[[型],[型].....]"):
```
この方法では他の型を読み込んでくれないためだめでした。
###つまずいた方法
調べているとMakeGenericTypeメソッドでgenericの型の引数を任意に決めれると書いてあったのでやってみました。

```csharp
Type t = 呼び出したいアセンブリ型のインスタンス.GetType("genericの型`引数の型の数"):
//ジェネリック自体の型を取得
t.MakeGenericType(指定したい型のType);
```
しかし問題がこれを書いてブレークポイントで確認してみましたが
tの中は変わっていませんでした。

実はMakeGenericTypeは適応したgeneric型のtypeを**新しく作るメソッドでした**

つまり...
###正しい方法
```csharp
Type t1 = 呼び出したいアセンブリ型のインスタンス.GetType("genericの型`引数の型の数"):
//ジェネリック自体の型を取得
Type t2 = t.MakeGenericType(指定したい型のType);
```

このようにすることで動的に読み込んだgeneric型のTypeを取得することができます。
MakeGenericTypeメソッドは新しく作ったType型を戻り値として出すメソッドですので
ちゃんと代入しないとだめですよね

#まとめ
まとめとしてはちゃんとメソッドの仕様を調べて使うことにしましょう。
でないと、私みたいに痛い目を見ます。
皆様お気を付けて

この辺りで失礼します。
Ae　レイヤーに特定のエフェクトが適用されているか調べる

#今リリックビデオ作成中でそこで使ったものをここに記す

###レイヤーにエフェクトが適用されてるか調べて、適用されている場合は値の変更のみ。そうじゃない場合はエフェクトを適用

```jsx

app.beginUndoGroup("3Dメガネ");
var myComp = app.project.activeItem;
var selLay = myComp.selectedLayers;
for (var i = 0 ;  i <selLay.length; i++ ){
    var myLay = selLay[i];
    var numProp = myLay.property("ADBE Effect Parade");
    var flag;
    var effectsIndex = 1;
    //$.writeln(numProp.numProperties)
    if (numProp.numProperties > 0){
        var n = 1;
        while ( n <= numProp.numProperties){
            var mn = numProp.property(n).matchName;//マッチネーム
            $.writeln("▼"+mn);
            if (　mn　== "ADBE 3D Glasses2" ){
                flag = true;
                effectsIndex = n;
                break;
            }else{
                flag = false;
            }
            n++;
        }
    }
    if (flag == true){
        change3Dglass(numProp.property(effectsIndex),myLay.index);
    }else{
        add3Dglass(myLay,myLay.index)
    }
}

app.endUndoGroup();


function add3Dglass(layer,index){
       var myEffects = layer.Effects.addProperty("ADBE 3D Glasses2");
       myEffects.property("ADBE 3D Glasses2-0001").setValue(index);
       myEffects.property("ADBE 3D Glasses2-0002").setValue(index);
       myEffects.property("ADBE 3D Glasses2-0003").setValue(1);
       myEffects.property("ADBE 3D Glasses2-0007").setValue(2);
       myEffects.property("ADBE 3D Glasses2-0005").setValue(12);
}

function change3Dglass(prop,index){
       prop.property("ADBE 3D Glasses2-0001").setValue(index);
       prop.property("ADBE 3D Glasses2-0002").setValue(index);
       prop.property("ADBE 3D Glasses2-0003").setValue(1);
       prop.property("ADBE 3D Glasses2-0007").setValue(2);
       prop.property("ADBE 3D Glasses2-0005").setValue(12);
}
```
UbuntuでOutlookしたい！

# はじめに
私はデスクトップのOSは主にUbuntuを使っている。

メールは、基本的にOutlookとGmailを利用している。

Gmailはブラウザでの動作が便利なのでそのままでよいのだが、Outlookはどうもブラウザ上で使うイメージがない。

そんな時、サードパーティのOutlookクライアントを見つけた。
<font color="Red">サードパーティなので自己責任でよろしくお願いいたします。</font>


# 導入方法

```sh
sudo apt update
sudo apt install snapd
sudo snap install prospect-mail
```

以上のコマンドを実行したら、`prospect-mail`を起動し、ログインする。

# バグ？
Officeプロファイル・マイアカウントあたりを開こうとすると、
アプリがクラッシュ・起動を繰り返すようになってしまうので、
注意が必要。

もし、押してしまった人は、以下の方法で抜け出すことが可能。
・PCの再起動
・`System Monitor`からプロセスをkill
[Linux便利コマンド] batを入れてみる

## 環境

![](https://img.shields.io/badge/centos-7.7.1908-<COLOR>)

## 概要

https://qiita.com/navitime_tech/items/c249269a3b47666c784b

を見て便利なものをどんどん入れてみようということで、前回に続いてbat。

## batインストール

https://github.com/sharkdp/bat

```shell
$ cargo install bat
```

## batの確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/219776/61e0e2a0-1b71-7723-45f5-ba58089c9453.png)

```shell
        --style <components>
            Configure which elements (line numbers, file headers, grid borders, Git modifications,
            ..) to display in addition to the file contents. The argument is a comma-separated list
            of components to display (e.g. 'numbers,changes,grid') or a pre-defined style ('full').
            To set a default style, add the '--style=".."' option to the configuration file or
            export the BAT_STYLE environment variable (e.g.: export BAT_STYLE=".."). Possible
            values: *auto*, full, plain, changes, header, grid, numbers, snip.
```

見た目をいろいろ変えれるみたい。
デフォルトではfullなのかな・・？たぶん。

叩くときにファイル名は分かっているので、個人的には無くて良いかなと。
あとgitの差分はgitコマンドで見るしbatにはなくてよいので（無駄に遅くなってもですし）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/219776/b68b3bc5-48db-d55a-7e17-32dceca49720.png)

これで縦幅もすこし縮めることができた。

## エイリアス

```shell
alias bat='bat --style="numbers,grid"'
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/219776/29fc3eb6-5e5c-dd60-5375-46dba1327f19.png)

これでスタイルは指定なしでよくなった！めでたしめでたし。
【Rails】【bootstrap】レスポンシブに文字の大きさを変更したい

#前提
gem bootstrapを使用
#やりたいこと
Railsを使ってレスポンシブな画面を作る。
その際に文字の大きさをいい感じに大きくしたり小さくしたりしたい。
##結論

```scss:app/assets/stylesheets/application.scss
body, html { font-size: 30px; }
@media screen and (min-width: 576px) and (max-width: 768px) { body, html { font-size: 30px; } }
@media screen and (min-width: 769px) and (max-width: 992px) { body, html { font-size: 30px; } }
@media screen and (min-width: 993px) and (max-width: 1200px) { body, html { font-size: 16px; } }
@media screen and (min-width: 1201px) { body, html { font-size: 20px; } }
```

上記のサイズを変更すればOK
色々見ているとpxで設定しない方がよいというのもあるので、他の方法も検討中
今回はRailsというよりはscssの書き方になる
複数のXcodeバージョンを共存させている時に切り替えを楽にするための小さな工夫

Mac内に複数バージョンのXcodeを共存させる方法に関してはWeb上に記事がいくつもありますが、なかなか長いコマンドですし、頻繁にバージョンを切り替える必要があると、面倒臭く感じます。

以下の方法で、**エイリアスによってコマンドがごく短くなりますし、いちいちパスワードを入力する手間も省けます。**

私はzshを使っていますので`.zshrc`にエイリアスを記述しています。
bashを使っている方は`.bashrc`と読み替えてください。

環境としては、最新バージョンであるXcode 12と、Xcode 11.3が入っている状態です。

永続的に設定したい場合：
（セキュリティに要注意）

```zsh:.zshrc
alias xcnew='echo {Macのパスワード} | sudo -S xcode-select --switch /Applications/Xcode.app'
alias xc113='echo {Macのパスワード} | sudo -S xcode-select --switch /Applications/Xcode11.3.app'
alias xcver='xcodebuild -version'
```

シェルを閉じるまで一時的に設定したい場合：

```zsh:.zshrc
alias xcnew='export DEVELOPER_DIR=/Applications/Xcode.app/Contents/Developer'
alias xc113='export DEVELOPER_DIR=/Applications/Xcode11.3.app/Contents/Developer' 
```

- `xcnew`をたたくと最新バージョンに一発で切り替わります。
- `xc113`をたたくと11.3に以下同文です。
- `xcver`をたたくと現在のバージョンが表示されます。

皆様の生産性の向上に少しでも寄与できたら幸いです。

（2021.04.08 更新）
@manicmaniac さん、貴重な情報をありがとうございました。
iOS14でデフォルトブラウザ／メーラー変更時にcanOpenURLがfalseになる問題の整理と横展開調査結果

# 前提環境

- Xcode 11.3.1
- Swift 5.1.3
- iOS 14.0 / 14.0.1

# 問題事象

サンプルコード：

```swift
let url = URL(string: "https://qiita.com")!
guard UIApplication.shared.canOpenURL(url) else {
    return
}
UIApplication.shared.open(url, options: [:], completionHandler: nil)
```

- **iOS 14.0 / 14.0.1でデフォルトブラウザをSafari以外（Chromeなど）に設定し上のコードを実行すると、ブラウザが起動しない。**
- **Xcode 11 (iOS 13 SDK) でビルドしてもiOS 14の端末では発生する。**
- 14.0から発生しているが14.0.1で解消していないということは、すなわちiOSのバグではなく仕様変更？

＜デフォルトブラウザをChromeに変更する手順＞
1. iOS 14の端末で、Chromeをインストールする。
2. 設定＞Chromeを選択する。
3. ブラウザの一覧が表示されるので、Chromeを選択する

# 原因

iOS 14.0以降でデフォルトブラウザをSafari以外（Chromeなど）に設定すると、**`UIApplication.shared.canOpenURL()`がfalseを返却するため。**

# 回避策

**Info.plistのLSApplicationQueriesSchemesに"https"および"http"を設定すると回避できます。**

# 関連事象

iOS 14においてはデフォルトメーラーについても変更できるようになりました。
**"mailto"についても同様**に、LSApplicationQueriesSchemesに追加しないと、デフォルトメーラーが変更されている場合には`UIApplication.shared.canOpenURL()`がfalseを返却します。

# 横展開調査

以上の事項は、文末の「参考リンク」の記事で得られた有益な情報です。
執筆者の方には深く感謝を申し上げたいです。

一方以下は、私が独自に追加調査をした結果になります。

## 電話アプリの"tel"および"telprompt"スキーム

"tel"は[Apple URL Schemes](https://developer.apple.com/library/archive/featuredarticles/iPhoneURLScheme_Reference/Introduction/Introduction.html#//apple_ref/doc/uid/TP40007899)にてドキュメント化されているスキームです。
"telprompt"はドキュメント化されていないスキームです。

いずれも、LSApplicationQueriesSchemesに追加しなくても、iOS 14でも電話アプリが起動します。

ちなみに、「将来、電話アプリのデフォルトが変更できるようになったら？」という疑問があったので、LSApplicationQueriesSchemesに"tel"を追加してみたところ、追加してもちゃんと動作します（当たり前？）。

## Walletアプリの"shoebox"スキーム

ドキュメント化されていないスキームです。
LSApplicationQueriesSchemesに追加しなくても、iOS 14でもWalletアプリが起動します。

## 設定アプリ

こちらのスキームは文字列ではなく`UIApplication.openSettingsURLString`となりますが、（当然ながら）LSApplicationQueriesSchemesに追加しなくても、iOS 14でも設定アプリが起動します。

# 検証結果の整理

- iOS 14では、カスタムスキームに加えて、**デフォルトを変更できるアプリのスキームもInfo.plistに定義しないとダメです。**
- ドキュメント化されているスキーム、ドキュメント化されていないけど動くスキーム、いずれも、**現時点でブラウザとメーラー以外は影響を受けていない模様です。**

# 参考リンク

[【iOS14】デフォルトブラウザを変更した時にcanOpenURLがfalseになる問題](https://qiita.com/toto_kit/items/757dfe0a9fddb28eeff5)
[iOS 14対応で気をつけるべきこと](https://zenn.dev/tattn/articles/40d1e53cc63d381a3ac5)