OmniAICreator/Qiita-1.07M huggingface dataset:
【Project Euler】Problem 22: 名前のスコア

* 本記事は[ProjectEuler](https://projecteuler.net/about)の「100番以下の問題の説明は記載可能」という規定に基づいて回答のヒントが書かれていますので、自分である程度考えてみてから読まれることをお勧めします。

### 問題 22. 名前のスコア

原文 [Problem 22: Names scores](https://projecteuler.net/problem=22)

**問題の要約：文字の値をアルファベットの順番、単語の値を文字の値の和としたときに添付のnames.txtの5000個の名前の値の合計を求めよ**

Google Colabでちょっと厄介なのがファイルの読み込み。Windowsでは以下の手順で行います。

1.ファイルをダウンロードして適当なフォルダに置く（例えば、￥ダウンロード）
2. 以下のプログラムを実行して「ファイル選択」ボタンを押すと、ダイアログボックスが出てくるのでダウンロードしたファイルを選択
3. 同じ名前でファイルがアップロードされる 

```python
# show upload dialog
from google.colab import files
#[ファイル選択]
#uploaded = files.upload()p022_names.txt
#p022_names.txt(text/plain) - 46447 bytes, last modified: 2020/4/2 - 100% done
#Saving p022_names.txt to p022_names (1).txt
```

ここからファイルを読み、リストに入れて、ソートします。

```python
f = open("p022_names.txt")
string = f.read()
f.close()
names = string.replace('"','').split(',')
names.sort()
print(len(names), names[:10])
print(names[938-1])
#5163 ['AARON', 'ABBEY', 'ABBIE', 'ABBY', 'ABDUL', 'ABE', 'ABEL', 'ABIGAIL', 'ABRAHAM', 'ABRAM']
#COLIN
```

名前が5163個、最初の10個の名前と、938番目が"COLIN"であることを確認しました。

さて問題に戻っての文字と単語の値を返す関数**charcost**, **wordcost**を作って、**wordcost**("COLIN")が53になっていることを確認します。

```python
def charcost(c):
  return ord(c)-ord('A')+1   # return A->1, B->2,,,

def wordcost(s):
  return sum(map(charcost,s))
print( wordcost("COLIN"))
#53
```
後は読み込んだ名前すべてのwordcostと位置(enumerateで取得)を掛け合わせて、合計を取れば完成です。

```python
print(f"Answer: {sum([wordcost(n)*i for i, n in enumerate(names,1)])}")
```

（開発環境：Google Colab）
【Project Euler】Problem 21: 友愛数

* 本記事は[ProjectEuler](https://projecteuler.net/about)の「100番以下の問題の説明は記載可能」という規定に基づいて回答のヒントが書かれていますので、自分である程度考えてみてから読まれることをお勧めします。

### 問題 21. 友愛数

原文 [Problem 21: Amicable numbers](https://projecteuler.net/problem=21)

**問題の要約：10000未満の友愛数の合計を求めよ**

[友愛数(Wikipedia)](https://ja.wikipedia.org/wiki/%E5%8F%8B%E6%84%9B%E6%95%B0)に詳しい説明がありますが、「自分自身を除いた約数の和が、互いに他方と等しくなるような数をいう」とのこと。まず「自分自身を除いた約数（proper divisors）の和」を求める関数**sumpdiv**を作ります。220と284が友愛数になっていることを確認。

```python
from sympy import divisors
# sum of the proper divisors
def sumpdiv(n):
  return sum(sympy.divisors(n))-n

print(sumpdiv(220),sumpdiv(284))
#284 220
```

これをもとに10000未満の友愛数を探します。

```python
spdlist = [0]    # store sum of the proper divisors of n
ans = 0
for n in range(1,10000):
  spd = sumpdiv(n)
  spdlist.append(spd)
  if spd < n and spdlist[spd] == n:    # check if amicable number
    print(n, spd)
    ans += n+spd
print(f"Answer: {ans}")
```
FPCでコンパイルできないのがおかしい！！

# はじめに
以下のエラーメッセージのように、標準のユニットなのに見つからないと言われることがあります。

```
Can't find unit Variants
```

# 解決策
Free Pascal Compilerのインストールに失敗している可能性があるのでインストールしなおしましょう。

# 環境
Windows10
Free Pascal Compiler version 3.2.2 [2021/05/15] for i386
【Project Euler】Problem 20: 階乗の数字和

* 本記事は[ProjectEuler](https://projecteuler.net/about)の「100番以下の問題の説明は記載可能」という規定に基づいて回答のヒントが書かれていますので、自分である程度考えてみてから読まれることをお勧めします。

### 問題 20. 階乗の数字和

原文 [Problem 20: Factorial digit sum](https://projecteuler.net/problem=20)

**問題の要約：100!の数字和を求めよ**

これも簡単で数字和は「[Problem 16: 2のべき乗の数字和](https://qiita.com/masa0599/items/9ffe4d027df4b51ed906)」で作った関数**digitsum**を使います。

```python
import math
print(f"Answer : {digitsum(math.factorial(100))}")
```

（開発環境：Google Colab）
[Emotion] cssプロパティでエラーが出た場合の対処法

## 初めに

emotionのバージョンは`11`です。
11から破壊的な変更が入っているので、それ以前のバージョンを使用してる人は要注意。

https://emotion.sh/docs/emotion-11

以下に簡単なコンポーネントサンプルを示しますが、pタグに渡しているcssプロパティの箇所で「そんなプロパティないよ」とエラーが表示されるケースがあります。

```react:Sample.tsx
import { css } from "@emotion/react";

const Text = css({
  color: "red",
});

export const Emotion = () => {
  return (
    <Container>
      <p css={{ Text }}>Emotion</p>
      <button>Click</button>
    </Container>
  );
};
```

## 対処方法

`tsconfig.json`に以下追記する。

```json:tsconfing.json
{
  "compilerOptions": {
    .
    .
    .   
    "jsx": "react-jsx",
    "types": ["@emotion/react/types/css-prop"], // 追記
  },
  "include": ["src"]
}
```

もしくは、`**.d.ts`を定義する

```ts:src/types/emotion.d.ts
/// <reference types="@emotion/react/types/css-prop" />
```

以上。

https://emotion.sh/docs/emotion-11#css-prop-types
Rust製の設定管理ライブラリconfyを試す

## confyとはどんなライブラリか

READMEの最初の文が一番分かりやすいかもしれない。


> Zero-boilerplate configuration management.

面倒くさい処理を書かなくても簡単に設定ファイルを読み込んだり書き換えたりできるので、ちょっとしたツールを作るのに最適。設定ファイルはTOMLとYAMLに対応しており、どちらで記述するかはCargo.tomlに設定する。デフォルトはTOML。



## 実行環境

OS: Ubuntu 20.04.3 LTS
rustc: 1.56.1 (59eed8a2a 2021-11-01)
cargo: 1.56.0 (4ed5d137b 2021-10-04)
confy: 0.4.0



## 参考にしたページ

### confyのリポジトリ

confyはごく小さなライブラリなので、何か分からないことがあればソースコードを読んだ方が早かった。
[https://github.com/rust-cli/confy](https://github.com/rust-cli/confy)

### docs.rsのページ

docs.rsはRustのdoc commentを乗せているページ。大抵の調べものはここを参照すれば解決するのだが、間違えてひとつ古いバージョンのドキュメントを参照してしまっていたのでハマってしまった・・・。Google検索が出すページがひとつ古かったのが原因だったのだが、ひと通り作業を追えるまで気づかなかった。
[https://docs.rs/confy/0.4.0/confy/index.html](https://docs.rs/confy/0.4.0/confy/index.html)



## 最小記述

最小の記述はたったこれだけ。

```Cargo.toml
[package]
name = "your-app"
version = "0.1.0"
edition = "2021"

[dependencies]
serde = "^1.0"
serde_derive = "^1.0"
confy = "^0.4"
```

```main.rs
use confy;
use confy::ConfyError;
use serde_derive::{Deserialize, Serialize};

#[derive(Default, Serialize, Deserialize, Debug)]
struct AppConfig { version: i32, }

fn main() -> Result<(), ConfyError> {
    let mut cfg = confy::load::<AppConfig>("config-file-name")?;  // 設定ファイルの読込み
    cfg.version += 1;
    confy::store("config-file-name", cfg)?;  // 設定ファイルの書込み
    Ok(())
}
```

## 初回生成されるファイルの値を変更したい場合

初回実行時は設定ファイルが作成されていないので、loadメソッドを実行した際に各設定項目にデフォルト値を適用した設定ファイルが作成される。(※ファイルを出力するディレクトリは後述する)設定のデフォルト値を定義したい場合は以下の通り、`Default`トレイトの実装を変更すればよい。

```diff:main.rs
- #[derive(Default, Serialize, Deserialize, Debug)]
+ #[derive(         Serialize, Deserialize, Debug)]
  struct AppConfig { version: i32, }
+
+ impl Default for AppConfig {
+   fn default() -> Self {
+     Self { version: 1 }
+   }
+ }
```



## 設定ファイルが生成される場所

上記の`load()`および`store()`の関数には`app_name`しか渡していない。この時設定ファイルが生成されるディレクトリは`directories::ProjectDirs::from("rs", "", app_name)`で決定される。この実行結果はOSによって異なり、以下の通りとなる。

- Linux: ~/.config/{app_name}
- Windows: {FOLDERID_RoamingAppData}\\{app_name}
- Mac OS: ~/Library/Preferences/rs.{app_name}

出力されるファイルの名前はデフォルトでは`app_name`と同じ。これを変更したい場合は第二引数に指定すればよい。

上記に関するドキュメントが読みたい方は[こちら](https://docs.rs/directories/4.0.1/directories/struct.ProjectDirs.html)を参照してください。



## TOML形式の代わりにYAML形式を使いたい場合

Cargo.tomlに以下の記述を以下の通り変更する。

```diff:Cargo.toml
- confy = "^0.4"
+ confy = { version = "^0.4", features = ["yaml_conf"], default-features = false }
サーバーサイドタグマネージャーのサーバーサイドタグのカスタムテンプレートでsetCookieしたい場合にハマったこと

# 背景
- サーバーサイドタグのカスタムテンプレートでsetCookiしたかった
- レファレンスコピペすると動かないので注意

# ダメな例

https://developers.google.com/tag-manager/serverside/api?hl=ja#setcookie

```
setCookie('cookieName', 'cookieValue', {'max-age': 3600, httpOnly: true});
```

# 動く例

```
  setCookie(USER_ID_COOKIE, makeString(userId), {
    'max-age': 3600 * 24 * 365 * 2,
    domain: 'auto',
    path: '/',
    httpOnly: true,
    secure: true,
  });
```

https://developers.google.com/tag-platform/tag-manager/server-side/how-to-build-a-server-tag#tag_implementation

`max-age` とか `domain` とか `path` とか指定しないと動かないかも。ご注意を。
何故Micro-segmentationが必要なのか再度考えてみた

私がMicro-segmentationという言葉を初めて聞いたのはVMware社がNicira社を買収してNSXとして販売し始めた頃だったと記憶しています。Micro-segmentationとはLayer7レベルの粒度で細かくApplicationを分割することですが、何故これが必要なのか再度考えてみました。

# トレンド
先ず<font color="DarkOrange">Applicationの多様化</font>があると思います。一昔前までは、特に社員が利用するEnterprise Applicationは自社専用のDatacenterだけで稼働するケースが多く見られましたが、現在はCloudファーストの時代です。自社内のDatacenterにインフラストラクチャやプラットフォームを1から構築して、自社内で開発している、または買ってきたAppliationを配備して運用するのは稀で、既にあるSaaSを利用する、もしくはPaaS/IaaSにAppliationを配備してセキュリティ対策を含む運用負荷をCloud Providerにオフロードすることが常識になりました。
<br>

更にもう1段階層を上げて考えてみると、<font color="DarkOrange">Softwareの内製化</font>もあると思います。あり物のSaaSを使いこなしながら同時に痒い所に手が届くApplicationは自社で内製する必要もあるかと思います。開発の手法も1昔前の統制を重視したWaterfall型から強調を重視したAgile型にシフトして、体制も開発・セキュリティ・運用チームが一体となったDevSecOps型が主流になり、新しい機能や変更が本番環境に配備される頻度と速度は格段に上がりました。Appliationに求められるセキュリティ要件も日々変化します。

# ギャップ
トレンドを踏まえてこれまでに従来型のSegmentationとのギャップを考えてみます。先ず<font color="DarkOrange">可視化の不備と粒度</font>があると思います。従来のSegmentationはApplicationやDataのコンテキスト(例/DataにどんなRegulationが影響するか、ApplicationでどんなProcessが稼働しているのか）を無視してVLANやFirewallで静的な区画を作ってApplication群を分割していました。Firewallに多数のRuleが実装されていて、数ヶ月前に実装したRuleを読んでも意味がわからず何となくRuleが積み上がっていて本来の意味を成しているかどうかは誰も判断できません。また粒度もLayer4のレベルで分割しているため、Appliationのコンテキストとは無関係です。
<br>
次に<font color="DarkOrange">マルチプラットフォーム非対応</font>があるかと思います。トレンドで触れたように、AppliationやDataは様々な場所に存在します。仮にApplicationやDataが自社内のDatacenterにだけしか存在しない場合、従来型のSegmentationでも何とかなるかもしれません。しかしながらそれらがあらゆる場所に存在するとなるとVLANやFirewallをプラットフォームの数だけ配備して区画を実装して運用し続けなければなりません。これはムダですね。
<br>

# おわりに
昨今バズワード化しつつあるZero Trust Network Accessは、UserとApplicationの間で発生するトラフィックを安全に保つSolutionですが、他の数多あるSolutionと同じくこれも万能な神器ではありません。Accountの乗っ取りやPolicy破壊によりAppliationに不正にアクセスされてRansomewareに侵される驚異は残ります。従来型のSegmentationではRansomewareに侵されたApplicationから他のApplicationにも簡単に伝染してしまします。Micro-segmentationであればRansomewareの被害を最小限に抑えることができますね。
私の備忘録

# 私の備忘録をまとめています。
## 目的
今後記事を掲載していく中で自分ですぐに見返せることを目的として作成します。

## ターミナル

[ターミナル操作まとめ](https://qiita.com/seiji1997/items/4e2c59ad10a0fe51c73c)


## 環境構築

[MacBook pro intelからMacBook pro M1に乗り換えたのでゼロからDeep Learning実行環境構築してみた！](https://qiita.com/seiji1997/items/4bcd6e8a8862de0185f2)

## API

### Twitter API

[Twitter APIの申請が通らない！！！！](https://qiita.com/seiji1997/items/9b901351f741cf49e579)

[Twitter APIを利用してデータを取得する！](https://qiita.com/seiji1997/items/0846111483e9ac6694ad)

## Git & Github

[GitとGithubの使い方を忘れないために](https://qiita.com/seiji1997/items/c2d9ee9e8e85d8493243)


## Docker

[MacBook Pro M1でDockerの環境構築](https://qiita.com/seiji1997/items/6347f29c8ae089c69a2f)

## matplotlib 

[matplotlib color for tasteful drafting](https://qiita.com/seiji1997/items/e674ceb10b271d1fe8ce)
GCPサービスアカウントの借用でterraformを実行する

# はじめに
以前書いた記事、[サービスアカウントを借用で使う](https://qiita.com/ryoeguchi/items/d24e5d91f85973720d01)では、gcloudコマンドを実行する際にサービスアカウントの借用を実施して、ローカルにサービスアカウントキーを持つことなくサービスアカウントの権限でコマンド実行できるようにしました。
そこからの派生版で、terraformの実行でもサービスアカウントの借用を使ってみましょう、というのが今回の話です。

# よくあるサービスアカウントの使い方
terraformでサービスアカウントキーを用いるときも、キーファイル(json)へのパスを指定するというので、基本はgcloudコマンドの時と大差ありません。(サービスアカウントキーの発行方法は以前の記事に記述しているので割愛)

### 方法1. terraformソースコートで指定
適当なtfファイルに以下の記述を追加します。
provider.tf

```
provider "google" {
  credentials = file("/path/to/serviceaccount-key.json")

  project = "YOUR-GCP-PROJECT"
  region  = "YOUR-GCP-REGION"
}
```

### 方法2. 環境変数で指定
terraformコマンドを実行するターミナルで、環境変数として設定します。

> $ export GOOGLE_APPLICATION_CREDENTIALS="/path/to/serviceaccount-key.json"

# サービスアカウント取扱注意
前述の以前書いた記事の通り、サービスアカウントキーをダウンロードして用いることはリスクがあります。今回のようにterraformを用いたインフラ管理をするとなると、なおのことキーファイルをterraformソースのディレクトリに置いていて、ソースはgit管理で、となるでしょうから、ファイルをgitに上げてしてしまう事故の可能性はさらに高まるかと思われます。

# サービスアカウントの借用
借用のメリットについては、以前の記事に書いている通りなので割愛します。
terraformでの借用実施は、実際のterraformソースコードにて行います。

```
variable "impersonate_serviceaccount" {
  type = string
  default = "sa-terraform-executor@PROJECT_ID.iam.gserviceaccount.com"
}

provider "google" {
  alias = "tokengen"
}
# get config of the client that runs
data "google_client_config" "default" {
  provider = google.tokengen

}
data "google_service_account_access_token" "sa" {
  provider               = google.tokengen
  target_service_account = var.impersonate_serviceaccount
  lifetime               = "1800s"
  scopes = ["userinfo-email", "cloud-platform"]
}

/******************************************
  GA Provider configuration
 *****************************************/
provider "google" {
  access_token = data.google_service_account_access_token.sa.access_token
  project      = var.project
}

provider "google-beta" {
  access_token = data.google_service_account_access_token.sa.access_token
  project      = var.project
}
```
`google_service_account_access_token` を用いてトークンを取得し、それプロバイダのアクセストークンとして用いる、というのが大まかな仕組みです。
ここで指定される `lifetime` は生成したトークンの生存時間です。3600s(3600秒 = 60分)を最大に設定可能です。terraform実行途中で有効期限が切れてしまわないよう、構築の規模感に応じて設定するのが良いでしょう。

# まとめ
これで、GoogleCloud単体で使う際にサービスアカウントキーを発行する必要性はさらに低くなりました。
こうやって、情報漏洩リスクにおびえることなく開発に集中できる状況を作っていきましょう。



# 参考
- [Terraform で GKE を構築する | Qiita](https://qiita.com/takasp/items/8104c175232e74217cc3)
- [Using Google Cloud Service Account impersonation in your Terraform code | Google Cloud](https://cloud.google.com/blog/topics/developers-practitioners/using-google-cloud-service-account-impersonation-your-terraform-code)
- [google_service_account_access_token | Terraform](https://registry.terraform.io/providers/hashicorp/google/latest/docs/data-sources/service_account_access_token)
ログインしていない人がアクセスできるページを制限する

authenticate_user!で書くアレと、move_to_index（じゃなくてもいいけどこの名前でよく作ってる）アレの使い途がごっちゃになっていたので整理してみたくなり。
まずは、authenticate_user!について書いてみる。

##authenticate_user!
deviseを導入していると使えるメソッド。
処理が呼ばれた段階で、そのユーザーがログインしていなければ、ログイン画面に強制的に飛ばせます(っ'-')╮=͟͟͞͞ﾎﾟｲｯ

書く場所はApplicationController。
どのコントローラーで処理するにも共通した処理を書ける場所。
便利だなと思う反面、影響力強い×触る頻度少ないのでいつもどきどきしながら書く。

```ruby:application_controller.rb
class ApplicationController < ActionController::Base
  before_action :basic_auth
  before_action :configure_permitted_parameters, if: :devise_controller?
  before_action :authenticate_user!, only:[:show, :new]    #　←ココ

  private

  def basic_auth
    xxxxx
  end

  def configure_permitted_parameters
    xxxxx
  end
end
```

onlyとはこの``before_action :authenticate_user!``が発動する機会を限定するもの。
この書き方だと、showアクション、newアクションの時のみauthenticate_user!が動きます。
onlyで指定するのが１つだけのときは``only: :show``と書く。:と:の間スペース空けるの忘れないように。

**except**で限定することもできる。
``before_action :authenticate_user!, except: :index``
 こんな感じ。
exceptは「コレには適用しない」というonlyと逆の使い方。
↑の場合はindexアクション**以外の時**はauthenticate_user!が動きます。
最初↑↑のonlyの書き方をしていたけど、今回私の作っているのはindex以外はログインしないと見れない、で良かったのでこの記事書きながら変更しましたっ。

##まとめ
・authenticate_user!でログインしていないユーザーを、ログイン画面に強制的に飛ばせる（＊deviseを導入してること）
・書く場所はApplicationController
・onlyまたはexceptを使うと発動する機会を限定できる

こんな感じでしょうか！

間違ってること、もっとこうしたらいいよというアドバイスなどありましたら、コメントいただけると嬉しいです！

では、また次の投稿で。
Dockerで仮想環境構築

新しくMac miniを導入したところ、HomebrewからVirtualBoxのインストールでこけるので、Dockerに移行しました。N予備校での講座を参考にしています。以下備忘録。

<h2>インストール</h2>
Docker Desktopのインストール

https://www.docker.com/products/docker-desktop

<h3>Windowsの場合</h3>
WSL2 Linux カーネル更新プログラムのインストール

https://docs.microsoft.com/ja-jp/windows/wsl/install-manual#step-4---download-the-linux-kernel-update-package

<h2>Dockerイメージの作成</h2>

<h3>Dockerfile</h3>

```Dockerfile
FROM --platform=linux/x86_64 ubuntu:18.04

RUN yes | unminimize
RUN apt-get update
RUN apt-get install -y vim curl tmux tcpdump
RUN locale-gen ja_JP.UTF-8
ENV LANG ja_JP.UTF-8
ENV TZ Asia/Tokyo
WORKDIR /linux-study
```

:::note
FROM : 構築する Docker イメージの元となる Docker イメージの指定
RUN : Docker イメージの構築で実行するコマンド
ENV : Docker イメージの構築で環境変数の値を設定する
WORKDIR : 作業ディレクトリの指定
:::

<h3>docker-compose.yml</h3>

```yml
version: '3'
services:
  app:
    build: .
    tty: true
    volumes:
      - .:/linux-study
```

:::note
version : DockerCompose ツールのバージョン
services : 全体を構成する要素(サービス)をこれより下の階層で記述
app : サービスの名前。
build : 指定したディレクトリにあるDockerfileからDockerイメージを構築する
tty : コンテナを起動させ続ける
volumes : ファイル共有の設定
:::

<h2>コマンド</h2>
起動
`docker-compose up -d `
Dockerfile編集後の起動
`docker-compose up -d --build`
稼働中のコンテナ確認
`docker-compose ps -a`
コンテナの中に入る
`docker-compose exec サービス名 bash`
終了・破棄
`docker-compose down`
US Keyboard の Mac で （Amazon Workspaces や RDPの）WindowsのIME切替を楽にする。


1. 後述の4remotewindows.jsonを、`~/.config/karabiner/assets/complex_modifications`に配置する。
2. Karabiner-Elementsの[Complex modifications]-[Add rule]より、1の設定を「Enable」する。
3. Windowsの[Microsoft IME の設定]-[詳細設定]-[キー設定]-[変更]から、「Ctrl+SPACE」の「入力/変換済み文字なし」を「IME-オン/オフ」に変更する。

```4remotewindows.json
{
  "title": "For Remote Windows",
  "rules": [
    {
      "description": "Switch IME Mode with Command+SPACE",
      "manipulators": [
        {
          "type": "basic",
          "from": {
            "key_code": "spacebar",
            "modifiers": {
              "mandatory":["left_command"]
            }
          },
          "to": [
            {
              "key_code": "spacebar",
              "modifiers": "left_control"
            }
          ],
          "conditions":[
            {
              "type": "frontmost_application_if",
              "bundle_identifiers":[
                "^com\\.amazon\\.workspaces$",
                "^com\\.microsoft\\.rdc\\.macos$"
              ],
              "description": "対象アプリを追加する場合は、bundelidentifierを追記"
            }
          ]
        }
      ]
    }
  ]
}
```
Raspberry Pi4 で USBから起動する方法

***はじめに***
Raspberry pi4 を USBから起動する方法のメモ書き

きっかけは、SDカードの抜き差しを繰り返すと Raspberry Pi4 が
起動しない / 起動をしても 読み取りが遅い / ハングアップする / Low Power と表示されるなど不都合があった
ために 調べてみました。(USB の方が高速で耐久性が優れていると思ったので)
※これは、SDカードの問題(接点が不調?) であり SDカードを変えると問題なく、Raspberry Pi4 は正常でした。 

USBで起動するイメージ作成は、下記を参照
[https://qiita.com/ytetsuo/items/7f0e682785280888fc1d](https://qiita.com/ytetsuo/items/7f0e682785280888fc1d)

---
***実際に行った手順***

Step1:Raspberry pi4 を更新

~~~
pi@raspberrypi:~$ sudo apt update
pi@raspberrypi:~$ sudo apt upgrade
~~~

Step1.1：現在のバージョンを確認
~~~
pi@raspberrypi:~$ sudo rpi-eeprom-update
~~~

Step2:更新可能なブートローダーを確認

~~~
pi@raspberrypi:~$ ls /lib/firmware/raspberrypi/bootloader/stable/
pieeprom-2020-04-16.bin  pieeprom-2021-01-11.bin  pieeprom-2021-11-22.bin
pieeprom-2020-06-15.bin  pieeprom-2021-01-16.bin  pieeprom-2021-12-02.bin
pieeprom-2020-07-16.bin  pieeprom-2021-02-16.bin  recovery.bin
pieeprom-2020-07-31.bin  pieeprom-2021-03-18.bin  vl805-000137ad.bin
pieeprom-2020-09-03.bin  pieeprom-2021-04-29.bin  vl805-000138a1.bin
pieeprom-2020-12-11.bin  pieeprom-2021-07-06.bin
~~~

Step3:最新のブートローダー(pieeprom-2021-12-02.bin)を更新

~~~
pi@raspberrypi:~$ sudo rpi-eeprom-update -d -f /lib/firmware/raspberrypi/bootloader/stable/pieeprom-2021-12-02.bin
~~~

Step4:Raspberry pi4 を再起動 

Step5:設定画面を起動する(最新のブートローダーにする) 

~~~
pi@raspberrypi:~$ sudo raspi-config
~~~

Step6: 設定画面で以下の順に行う
６． Advanced Option  Configure advanced settings に入り
A7. Bootloader Version Select latest or default boot ROM Software を選択(入る)
E1. Latest Use the latest version boot ROM software を選択・実行

Step7: Configの先頭画面に戻るので Bootを行うDeviceを選択
６．Advanced Option  Configure advanced settings に入り
A6. Boot Order  Choose network or USB device boot に入り
B2. USB Boot  Boot from USB if available, otherwise boot from SD Card を選択 

---
☆2022年 1月11日(火) 午後 3時00分 初版(Ver1.00) 作成
☆2022年 9月09日(金) 午前11時20分 Ver1.01 (Step 1.1: を追加)
Power BI や Power Query でのエラー対応

#Power BIや Power Query  は思わぬエラーが出ます
エラーがなかなか解決できないことが多いので、ケーススタディとしてメモを残しておきます。
#Power BI
## To be updated

#Power Query
##ゲートウェイ
2022/01/04
Web Contents を読み込むQuery を使用して、Power BI サービスを使用すると、自動更新の際に 個人用ゲートウェイが必要になります。
これだと、ローカルPC を起動しておく必要があるので非常に面倒です。
回避方法を以下の記事にまとめました。

https://qiita.com/ks4050kt/items/436a62f878093703585d

##クエリのマージ
###選択内容から返される一致の件数を特定できません
2022/01/11 
"選択内容から返される一致の件数を特定できません" と言うエラーが出ました。
"we were unable to determine how many matches the selection with return" appeared on **Marge Queries** function

原因はおそらく "クエリの元エクセルファイルが Teams の Private Channelの中においてあったこと"。
Private Channel の中の Share Point Online Folder ではアクセスに難があるといういうよりは、アクセス権の問題で データの流出を防いでいるということだと思います。

Probably the cause was "Source excel file for query was stored in Private channel of Teams".

ですので、**データのマージを行う際は ソースデータのアクセス権を確認しましょう。**
##Share Point Online からの読み込み
###Path に特殊文字が入っていると読み込めない
2022/01/11
SPO のフォルダ名に # を入れたフォルダ名を作ってしまっていたため、SPO Folder を Query した時に読み込むことが出来ませんでした。
なにはともあれ、**Folder Pathに特殊文字は使用しないようにしましょう**。

※ Alteryx を使うことなどを考えても、スペースすら 使用しない方が良いと思われます。
windowsでgforth その5

#概要

windowsでgforthやってみた。
再帰、やってみた。

#実行結果

```
: fib ( n -- n' )   dup 1 > if  1- dup RECURSE swap 1- RECURSE + then  ;  ok
4 fib . 3  ok
5 fib . 5  ok
6 fib . 8  ok
7 fib . 13  ok

```


以上。
windowsでgforth その4

#概要

windowsでgforthやってみた。
zundoko、やってみた。

#実行結果

```
require random.fs  ok
: zundoko 0 begin 2 random if ." zun " 1 + else ." doko " drop 0 then dup 4 = until ." doko kiyoshi!" ;  ok
zundoko doko doko zun doko doko zun zun zun zun doko kiyoshi! ok

```

以上。
windowsでgforth その3

#概要

windowsでgforthやってみた。
fizzbuzz、やってみた。

#実行結果

```
: fizzbuzz 100 1 do i 3 mod 0 = i 5 mod 0 = or if i 3 mod 0 = if ." fizz" then i 5 mod 0 = if ." buzz" then else i . then space loop ;

fizzbuzz 1  2  fizz 4  buzz fizz 7  8  fizz buzz 11  fizz 13  14  fizzbuzz 16  17  fizz 19  buzz fizz 22  23  fizz buzz 26  fizz 28  29  fizzbuzz 31  32  fizz 34  buzz fizz 37  38  fizz buzz 41  fizz 43  44  fizzbuzz 46  47  fizz 49  buzz fizz 52  53  fizz buzz 56  fizz 58  59  fizzbuzz 61  62  fizz 64  buzz fizz 67  68  fizz buzz 71  fizz 73  74  fizzbuzz 76  77  fizz 79  buzz fizz 82  83  fizz buzz 86  fizz 88  89  fizzbuzz 91  92  fizz 94  buzz fizz 97  98  fizz  ok


```

以上。
windowsでgforth その2

#概要

windowsでgforthやってみた。
helloworld、やってみた。
関数やってみた。

#hello

```
." Hello world!" Hello world! ok

```

#if

```
: test0 -1 if ." true" else ." false" then ;  ok
test0 true ok
```

#do

```
: test1 10 1 do i . loop ;  ok
test1 1 2 3 4 5 6 7 8 9  ok

```

#begin

```
: test2 -1 begin ." ok" until ;  ok
test2 ok ok

```

#フィボナッチ数列

```
: fib 7 0 1 rot 0 do swap over + dup . loop ;  ok
fib 1 2 3 5 8 13 21  ok

```

#九九

```
: kuku 10 1 do 10 1 do i j * . loop cr loop ;  ok
kuku 1 2 3 4 5 6 7 8 9
2 4 6 8 10 12 14 16 18
3 6 9 12 15 18 21 24 27
4 8 12 16 20 24 28 32 36
5 10 15 20 25 30 35 40 45
6 12 18 24 30 36 42 48 54
7 14 21 28 35 42 49 56 63
8 16 24 32 40 48 56 64 72
9 18 27 36 45 54 63 72 81

```

以上。
Windows 「 No files matching the pattern were found」 エラーを解決する。

#　結論
 ***パスを記述している部分を、「\"」もしくは「&yen;"」で囲む！***
例↓

```
format:prettier --write --ignore-path .gitignore \"./**/*.{js,jsx,ts,tsx,json,css}\"
```
## 成り行き
windowsでNext.js×TypeScript×Eslint×Prettierで環境構築をしている際、prettierのフォーマットを試しに実行するとエラーになりました。解決方法があまり出回っていなかったので投稿します。

当時の記述法はダブルクォーテーションでスクリプトを囲み、パスの部分をシングルクォーテーションで囲んでいました。
当時のpackage.jsonから該当箇所抜粋↓

```
"format": "prettier --write --ignore-path .gitignore './**/*.{js,jsx,ts,tsx,json,css}'"
```

実行結果↓

```
$ prettier --write --ignore-path .gitignore './**/*.{js,jsx,ts,tsx,json,css}'
[error] No files matching the pattern were found: "'./**/*.{js,jsx,ts,tsx,json,css}'".
```
エラーが出ちゃいます。
##解決策

よく環境構築の方法を書いてくれている記事はこの書き方なのですが、これはMACの書き方のようです。
--no-error-on-unmatched-patternをパス前に記述するなど対策を試みましたが、そもそも根本的な解決ではなく変わらずエラーでした。
windowsの場合、シングルクォーテーションではなく、「\"」もしくは「&yen;"」で囲む必要があるみたいです。↓

```
format:prettier --write --ignore-path .gitignore \"./**/*.{js,jsx,ts,tsx,json,css}\"
```

実行結果↓

```
$ prettier --write --ignore-path .gitignore "./**/*.{js,jsx,ts,tsx,json,css}"
src\components\atoms\index.ts 8ms
・
・
・
Done in 1.07s.
```

解決しました！
Djangoで郵便番号の入力から住所を反映させる

# 郵便番号の入力から住所を自動で反映させる
フォームから住所を書く際に郵便番号を入力するだけで自動で住所が入力されたら楽なのでその流れをDjangoのコードで書けるようにメモ。
※既にアプリは出来てるものとして、その部分は割愛します。

## ルーティング設定(urls.py)
```python:urls.py
from django.urls import path,include
from .import views
from django.views.generic import TemplateView

app_name = 'アプリ名'
urlpatterns = [
    path('', views.IndexView.as_view(),name="index"),
    path('inquiry/', views.InquiryView.as_view(),name="inquiry"),
]
```
後にInquiry classを作る予定でこのpath設定。

## ビューの編集（views.py）

```python:views.py
from .forms import InquiryForm #forms.pyをインポート
from django.urls import reverse_lazy #処理が終わった後に画面に飛ばす処理

class InquiryView(generic.FormView):
    template_name = "inquiry.html"
    form_class = InquiryForm
    success_url = reverse_lazy('アプリ名:inquiry')
```

## フォームの設定(forms.py)

```python:forms.py
import os
from django import forms
from django.db.models import fields
#(省略)

Zipcode = {
    'zip_code':
        forms.TextInput(
            attrs={'class': 'p-postal-code','placeholder': '記入例：1060022'}, 
            ),
}

class InquiryForm(forms.Form):#クラス名は必要に応じて変える
# 郵便番号からcityまでを自動入力
    zipcode = forms.RegexField(label='郵便番号(ハイフンなし)',
        regex=r'^[0-9]+$',
        max_length=7,
        widget=forms.TextInput(attrs={'onKeyUp' : "AjaxZip3.zip2addr(this,'','state','city')"}),
    )
    state = forms.CharField(label='都道府県',max_length=6)
    city = forms.CharField(label='市区町村',max_length=10)
    address_1 = forms.CharField(label='番地',max_length=10)
    address_2 = forms.CharField(label='建物名・部屋番号',max_length=10)


    def __init__(self,*args,**kwargs):#入力フォーム表示用
        self.fields['zipcode'].widget.attrs['class']='form-control col-11'
        self.fields['zipcode'].widget.attrs['placeholder']='例：1600022 '

        self.fields['state'].widget.attrs['class']='form-control col-11'
        self.fields['state'].widget.attrs['placeholder']='都道府県をここに入力してください'

        self.fields['city'].widget.attrs['class']='form-control col-11'
        self.fields['city'].widget.attrs['placeholder']='市区町村をここに入力してください'

        self.fields['address_1'].widget.attrs['class']='form-control col-11'
        self.fields['address_1'].widget.attrs['placeholder']='番地をここに入力してください'

        self.fields['address_2'].widget.attrs['class']='form-control col-11'
        self.fields['address_2'].widget.attrs['placeholder']='建物名・部屋番号をここに入力してください'
```



## いい感じに動いてもらうためのJavaScript
今回はAjaxzip3を使ってるので、そこから引用してます。


https://github.com/ajaxzip3/ajaxzip3.github.io

※今回はbase.htmlにべた書きしましたが、他におすすめがあれば教えてください。

```javascript:base.html
    <script src="https://ajaxzip3.github.io/ajaxzip3.js" charset="UTF-8"></script>
```
郵便番号の入力から住所を自動で反映させる【Django】

#郵便番号の入力から住所を自動で反映させる
フォームから住所を書く際に郵便番号を入力するだけで自動で住所が入力されたら楽なのでその流れをDjangoのコードで書けるようにメモ。
※既にアプリは出来てるものとして、その部分は割愛します。

##ルーティング設定(urls.py)
```python:urls.py
from django.urls import path,include
from .import views
from django.views.generic import TemplateView

app_name = 'アプリ名'
urlpatterns = [
    path('', views.IndexView.as_view(),name="index"),
    path('inquiry/', views.InquiryView.as_view(),name="inquiry"),
]
```
後にInquiry classを作る予定でこのpath設定。

##ビューの編集（views.py）

```python:views.py
from .forms import InquiryForm #forms.pyをインポート
from django.urls import reverse_lazy #処理が終わった後に画面に飛ばす処理

class InquiryView(generic.FormView):
    template_name = "inquiry.html"
    form_class = InquiryForm
    success_url = reverse_lazy('アプリ名:inquiry')
```

##フォームの設定(forms.py)

```python:forms.py
import os
from django import forms
from django.db.models import fields
#(省略)

Zipcode = {
    'zip_code':
        forms.TextInput(
            attrs={'class': 'p-postal-code','placeholder': '記入例：1060022'}, 
            ),
}

class InquiryForm(forms.Form):#クラス名は必要に応じて変える
# 郵便番号からcityまでを自動入力
    zipcode = forms.RegexField(label='郵便番号(ハイフンなし)',
        regex=r'^[0-9]+$',
        max_length=7,
        widget=forms.TextInput(attrs={'onKeyUp' : "AjaxZip3.zip2addr(this,'','state','city')"}),
    )
    state = forms.CharField(label='都道府県',max_length=6)
    city = forms.CharField(label='市区町村',max_length=10)
    address_1 = forms.CharField(label='番地',max_length=10)
    address_2 = forms.CharField(label='建物名・部屋番号',max_length=10)


    def __init__(self,*args,**kwargs):#入力フォーム表示用
        self.fields['zipcode'].widget.attrs['class']='form-control col-11'
        self.fields['zipcode'].widget.attrs['placeholder']='例：1600022 '

        self.fields['state'].widget.attrs['class']='form-control col-11'
        self.fields['state'].widget.attrs['placeholder']='都道府県をここに入力してください'

        self.fields['city'].widget.attrs['class']='form-control col-11'
        self.fields['city'].widget.attrs['placeholder']='市区町村をここに入力してください'

        self.fields['address_1'].widget.attrs['class']='form-control col-11'
        self.fields['address_1'].widget.attrs['placeholder']='番地をここに入力してください'

        self.fields['address_2'].widget.attrs['class']='form-control col-11'
        self.fields['address_2'].widget.attrs['placeholder']='建物名・部屋番号をここに入力してください'
```



##いい感じに動いてもらうためのJavaScript
今回はAjaxzip3を使ってるので、そこから引用してます。
※今回はbase.htmlにべた書きしましたが、他におすすめがあれば教えてください。

```javascript:base.html
    <script src="https://ajaxzip3.github.io/ajaxzip3.js" charset="UTF-8"></script>
```
AjaxzipのGitHubはこちら

https://github.com/ajaxzip3/ajaxzip3.github.io
intee プログラミングゼミを経ての感想

2022.01.11

2021年12月2日〜12月24日まで参加したゼミについての感想、今後の展望について
[感想]
・とにかく学びが多い！
今回はRuby/Githubを使って開発したが、前回はPHP/htmlを使ってパスワード付きの掲示板を作った。
同じようなサービスを作る過程でも違う箇所が多く勉強になった
特に今回はRubyを立ち上げるところからのスタートだったので、より実践的に感じた
command+Sでセーブなどショートカットも覚えた！
ただカリキュラムに甘え、分からない専門用語が多いのでそこは勉強が必須

・自走力がついた
初回の授業でパソコンが動かず、大きな遅れを取ったのでゼミ外で自主開発をしていた
カリキュラムに記載されていない予想外のエラーが出ることが多かった
最初は絶望し先生方に相談するしかなかった
→次第にエラー内容の見方も分かり、自分で解決を試みるようになった
ありがちなエラー：if/end/{}の書き忘れなど
また時間を見つけて一人でも取り組むようになった

・まだ完走出来ていない
最後でエラーが続き、あともう少しのところで止まっている
今週は時間があるので完走＋UI/UXのところまで手を伸ばしたい

[今後の展望]
・今週中にカリキュラム完走
・UI/UXも手を付ける
・カルーセルも作りたい
・専門用語の勉強
macOSにminikubeをインストールする

```
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-darwin-amd64
sudo install minikube-darwin-amd64 /usr/local/bin/minikube

minikube start
```

```
kubectl get po -A
minikube kubectl -- get po -A
alias kubectl="minikube kubectl --"
minikube dashboard
```
超解像をとりあえず使ってみるなら、画像ドロップで使えるCoreMLモデルで

#画像を鮮明に大きくしてくれる超解像を手軽につかう方法です
<img src=https://user-images.githubusercontent.com/23278992/148810656-4c5faa33-1be9-45f6-b31a-defd931cb1f8.jpg width=400> <img src=https://user-images.githubusercontent.com/23278992/148811822-56844bc7-b197-44d5-8454-757890c890b5.jpg width=400>
オリジナル（左）と超解像結果（右）

#鮮明なコンテンツ提供に使える超解像モデル、使うのは難しい？

超解像を使えれば、より鮮明に、リッチなサイズで、
ユーザーに提供するコンテンツのクオリティをあげられる可能性がある。

しかし、超解像技術はどうやって使えばいいのだろうか？
複雑な計算が必要なんじゃないの？

#CoreMLなら画像ドロップでとりあえず使える

CoreMLモデルなら、画像ドロップでとりあえず超解像モデルが試せる。



#アプリへの組み込みもかんたん

アプリへの組み込みも、Xcodeにファイルを入れて、短いコードで呼び出すだけである。

#手順

[CoreML-Models](https://github.com/john-rocky/CoreML-Models)からBSRGANをダウンロードする。

https://github.com/john-rocky/CoreML-Models

ファイルを開き、Previewタブで画像をドロップする。

<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/eac89d12-c004-032e-01a3-2eb01fd4ccad.jpeg width=300>
↓
画像をモデルファイルにドロップ
↓
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/d82a34fe-b028-7efe-a8ce-ae2cfde6a921.png width=600>




プロジェクトに組み込む場合は、Visionで実行する。

```swift
guard let model = try? VNCoreMLModel(for: bsrgan(configuration: MLModelConfiguration()).model) else { fatalError("model initialization failed") }
let coreMLRequest = VNCoreMLRequest(model: model)
let handler = VNImageRequestHandler(cvPixelBuffer: pixelBuffer, options: [:])
try? handler.perform([coreMLRequest])
guard let result:CVPixelBuffer = coreMLRequest.results?.first as? VNPixelBufferObservation else { return }
```

🐣
****
フリーランスエンジニアです。
お仕事のご相談こちらまで
rockyshikoku@gmail.com

Core MLやARKitを使ったアプリを作っています。
機械学習／AR関連の情報を発信しています。

[Twitter](https://twitter.com/JackdeS11)
[Medium](https://medium.com/@rockyshikoku)
【bind】messagesにRFC 1918 response from Internet for xxx.xxx.xxx.xxx.in-addr.arpaのログが出力される件

### ログの意味
```
RFC 1918 response from Internet for xxx.xxx.xxx.xxx.in-addr.arpa
```
xxx.xxx.xxx.xxx.in-addr.areaに対応するDNSゾーンが定義されていない場合にログが出力されている模様。
ログを一見すると、InternetにプライベートIPアドレスが漏れているよって見えるけど、
必ずしもそういう意味ではない？

### 解決方法
/etc/named.confに対応するDNSゾーンファイルを作成してあげましょう。

```/etc/named.conf
zone "xxx.xxx.in-addr.arpa." {
                type master;
                file "xxx.xxx.rev";
        };
```
これをnamedに反映してあげれば、ログが出力されなくなります。
SPIRE: v1.1.3 変更内容

_この記事は [Z Lab](https://qiita.com/organizations/zlab) の業務の一環として作成したものです。_

## はじめに

SPIRE v1.1.3 の変更内容を紹介します。 
https://github.com/spiffe/spire/releases/tag/v1.1.3

:pencil: がついた文章は、CHANGELOG の公式内容ではなく筆者の補足です。
前バージョン v1.1.2 の変更内容は[こちら](https://qiita.com/ryysud/items/c90e310833f096c6dd50)を参照してください。

## Security

- [CVE-2021-44716](https://github.com/advisories/GHSA-vc3p-29h2-gpcp) の対応が実施されました。
    - :pencil: Go の net/http パッケージで脆弱性が見つかり Go がバージョンアップ（[差分](https://github.com/spiffe/spire/compare/v1.1.2...v1.1.3)）されました。詳細は [Unbounded memory usage on exposed HTTP/2 (non-gRPC) endpoints](https://github.com/spiffe/spire/security/advisories/GHSA-m7vp-hqwv-7m5x) をご参照ください。
【macOS】VSCodeのエディタ、ターミナルに関するショートカットキー

# はじめに
VSCode上でエディタ、ターミナル間を移動する度にキーボードから手を離すのが嫌になり、ショートカットキーをいろいろ調べました。そのメモとして本記事を作成しました。
なお、VSCodeバージョン1.63.2を使用していることが前提となります。

# ターミナル関連
`control` + `` ` ``　：エディタからターミナルへ移動する（このコマンドでエディタ、ターミナルを行き来できる）

`control` + `shift` + `` ` ``　：新規にターミナルを作成する（複数のターミナルを使いたい時）

`Command` + `Shift` + `[` or `]`　：ターミナルを切り替える（複数のターミナル使用時）

```:terminal
exit
```
上記コマンドをターミナル上で実行すると、現在使用しているターミナルを閉じる

```:terminal
code <ファイルのフルパス>
```
上記コマンドをターミナル上で実行すると、指定したファイルを新規に開く

# エディタ関連
`control` + `` ` ``　：ターミナルからエディタへ移動する（このコマンドでエディタ、ターミナルを行き来できる）

`control` + `1`　：ターミナルからエディタへ移動する（上記はターミナルを閉じるが、このコマンドは閉じずにエディタへ移動する）

`command` + `p`　：ファイル名を入力して開く

`command` + `w`　：現在開いているファイルを閉じる

`command` + `b`　：サイドパネルを表示/非表示にする

# 参考記事
以下の記事を参考にさせていただきました。

- [VS Code の便利なショートカットキー](https://qiita.com/12345/items/64f4372fbca041e949d0)
Digital HQ Slackathon に参加しませんか？

Happy New Year! あけましておめでとうございます！
今週、各地から積雪の写真が SNS に上げられているのを見て、すっかり冬本番だなぁと感じています。Slack で Developer Relations を担当している Jason と申します。

Slack は、先日の [Frontiers という年次カンファレンス](https://slack.com/intl/ja-jp/blog/transformation/dont-miss-slack-frontiers-2021)で[新しい Slack プラットフォーム](https://slack.com/intl/ja-jp/help/articles/4409281126035)を発表しました。この新しい仕組みを活用すれば、誰でも簡単にコミュニケーションの効率化やタスクの自動化を実現できるようになります。また、この基盤はアプリやデータのホスティングも提供しているので、運用も Slack に任せることができます。

この新しい基盤は現自在クローズベータ中ですが、ありがたいことに多くの方に申し込みをいただいており、現在は新規のご利用は順番をお待ちいただいている状況です。

しかし、実は 11 月から開催中の [Digital HQ スラッカソン (Slack + Hack-a-thon)](https://slack.devpost.com/)というオンラインでのハッカソンに参加すれば、そのハッカソンのワークスペース内限定とはなりますが、いち早くこのベータ版の新機能を試すことができるのです！もちろん、この新しいプラットフォームを使わないでアプリをつくりたいという方も大歓迎です。

ハッカソンはすでに佳境に入っており、アプリの提出期限は **2 月 2 日**に迫っていますが、今ならまだ間に合います！

## どんなのアプリを作ればよいでしょうか？

とても良い質問です！今回のハッカソンでは以下の 7 つのカテゴリのいずれかに関連するワークフローやアプリを提出していただくことになっています。自分の組織の部署・チームの人たちにヒアリングをして、実際の業務でも役立つアプリを企画してみてください。

1. デジタル HQ の全体 (Across your Digital HQ)
2. 営業 (Sales)
3. サービス・接客業務 (Service & Frontline)
4. プロダクト開発 (Engineering & Product)
5. IT システムの運用 (IT & Operations)
6. マーケティングやクリエイティブ作成 (Marketing & Design)
7. 人事、経理、法務、バックオフィス (HR, Finance, Legal, & Corporate functions)

## 参加すれば何かもらえますか？

もちろんです！賞金の合計はなんと 47,000 米ドルとなります！賞金の詳細は以下の通りです。


|   順位   |   賞金 (米ドル)   |
|:-------:|:----------------:|
| **1 位** |    **15,000**    |
|   2 位   |      10,000      |
|   3 位   |      5,500       |

これに加えて、1~3 位のチームの方々は Slack のリーダー陣とのディスカッションの場を持つことや、実用化に向けて、実装やアプリを展開するためのノウハウの共有など、さまざまな支援も受けられます。

1、2、3 位の他に、上記の各カテゴリーの選外佳作賞もあります。賞金は 1,500 米ドルです。また、新しいプラットフォームに関して最も素晴らしいフィードバックをしてくださった 6 名の方に 1,000 米ドルの賞金をお贈りすることになっています。

## 提出するものは何ですか？

今回のハッカソンは Devpost との共同運営で開催しています。詳細は [Devpost がホストしているイベントサイト](https://slack.devpost.com/) をご参照ください。アプリの提出には、大まかにいうと以下のような情報が必要になります。できれば英語がベストですが、日本語で書いても大丈夫です（私が英語にしておきます）！ただし、アプリやワークフロー内の表記はできるだけ英語表記にしていただく方がアプリの審査はしやすくなるかと思います。

- 自分のプロジェクトを説明する 3 分間のビデオ
- プロジェクトの概要、どのように開発したか
- 取り組みの概要、どうこの問題にたどり着いたか、またどのように解決したか
- プロジェクトが上記のどれのカテゴリーに当てはまるか
- コードリポジトリのアクセス、可能なら testing@devpost.com に共有
- （必要に応じて）ライブデモ

## 判定条件とは？

### インパクト (Impact)
アプリがどのぐらいの利点があるか自分のチームに意義があるかを判断します。適切に社内の他のチームにヒアリングをして、そのチームの課題を理解した上でアプリを開発しましょう

### 独創性 (Originality)
アプリの創造性とユニークさを判断します。何かしらの新規性があるアプローチで Slack プラットフォームを活用してみてください。

### クオリティと完成度 (Quality and Completeness)
Slack プラットフォームに関してのソフトウエア品質が高いかを判断します。完全に実装されたアプリの方がより審査員の注目を集めるでしょう。

---

どうでしょう、興味がわいてきましたか？参加したいと思った方は、ぜひ [Devpost のサイト](https://slack.devpost.com/) をご覧ください！ 

参加・アプリ申請の方法、アプリのアイデアなど、何か困ったことがあれば、ぜひ気軽にコメント欄で質問してください。私が頑張って全力で答えます！

それでは、皆さんのご参加をお待ちしております :wave:
WordPressでテーマを編集する場合に必須の子テーマ作成

WordPressでテーマを活用しているときに、「ここの表示を少し変えたいのに」って思う時があります。

設定でなんとかなるならそれでいいのですが、最終的にテーマファイル自体をいじらないとどうしようもない時ってありますよね。
でもテーマファイルを直接いじると、テーマがアップデートしたときにせっかく修正した内容が全て消えてしまうことに。。。

そうならないようにする方法として子テーマを作る方法があります。

# 大まかな手順
1. /wp-content/themes/に新規フォルダを作る
1. style.cssとfunctions.phpを作成する
1. WordPress管理画面で子テーマを有効化する
1. 編集したいファイルを親テーマからコピーして修正する

# style.cssの内容
例えば、theme-aを親テーマにして子テーマtheme-a-childを作成する場合で記載します。

style.cssは以下のように記載します。（それ以外の項目は任意）

```:style.css
Theme Name: theme-a-child
Template: theme-a
```

# functions.phpの内容
functions.phpは以下のように記載します。

```:functions.php
<?php
add_action( 'wp_enqueue_scripts', 'theme_enqueue_styles' );
function theme_enqueue_styles() {
  wp_enqueue_style( 'theme-a', get_template_directory_uri() . '/style.css' );
  wp_enqueue_style( 'theme-a-child', get_stylesheet_directory_uri() . '/style.css', array('parent-style')
);
}
?>
```

# まとめ
子テーマを活用することで、サイトデザインの自由度が上がるので私はよく活用しています。

子テーマってなに？っていう方は以下が参考になります。

https://www.webcreatorbox.com/tech/wordpress-child-theme

もう一つ注意しないといけないのが孫テーマは作れないということです。

https://note.com/wacw/n/nb27e991c5b44
[Rails]gem「pry-rails」の導入

# 経緯
対話的にrubyプログラムを実行できるツールirb。
rails consoleはデフォルトでirbが使われている。

・・・実務ではpryが使われてて、まぁそんなに変わらへんやろ、と個人開発ではデフォルトのままでいっていたのだが、
まーーーーーーーー使いづらかった・・・

特に

- **rails consoleを再起動すると、前に実行していたコードの履歴がすべて削除される(自分で設定すればいけるっぽいが面倒)**
- **データの型を考慮しての表示をしてくれない(配列だったら、要素ごとに改行してほしいが1行表示)**


というところ。

で、rails consoleでpryを使うためには、「pry-rails」というgemが必要。


# 導入手順

公式の手順より

```
# 1. Gemfileに以下を追加(これはpryを使いたい環境によって変えたほうがよさそう)
gem 'pry-rails', :group => :development

# 2. gemのインストール実行
bundle install

# 3. rails console起動
bundle exec rails c
=>
[1] pry(main)> と表示されればOK
```


# 参考

https://github.com/pry/pry-rails
NCMBのFlutter SDKを使って地図検索アプリを作る（その1：画面の仕様とSDKの初期化）

NCMBでは公式SDKとしてSwift/Objective-C/Kotlin/Java/Unity/JavaScript SDKを用意しています。また、それ以外にもコミュニティSDKとして、非公式ながらFlutter/React Native/Google Apps Script/C#/Ruby/Python/PHPなど幅広い言語向けにSDKが開発されています。

今回はコミュニティSDKの一つ、Flutter SDKを使って地図検索アプリを作ってみます。まず画面の仕様とSDKの初期化について解説します。

## 完成版のコード

作成したデモアプリのコードは[NCMBMania/flutter_map_app](https://github.com/NCMBMania/flutter_map_app)にアップロードしてあります。

## ベースを作成する

`flutter create` コマンドでベースを生成します。

```
flutter create news_app
```

## lib/main.dartについて

今回のコードはすべて main.dart に記述しています。クラスは次の7つです。

- class MyApp extends StatelessWidget
- class MainPage extends StatefulWidget
- class _MainPageState extends State<MainPage>
- class MapPage extends StatefulWidget
- class _MapPageState extends State<MapPage>
- class SettingPage extends StatefulWidget
- class _SettingPageState extends State<SettingPage>

### MyApp

アプリ全体の設定を行っています。

### MainPage

メイン画面用のStatefulWidgetです。

### _MainPageState

タブバーを表示して、地図画面と設定画面を読み込みます。

![localhost_53739_のコピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/934a4f8e-ea8a-a4a6-d96a-b194e7492054.png)


### MapPage

地図画面用のStatefulWidgetです。

### _MapPageState

地図画面です。タップに合わせて付近の山手線の駅データを取得、表示します。

![localhost_53739_ (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/7b6dd3e2-efd0-d5a4-65eb-85a4c6d438bd.png)


### SettingPage

設定画面用のStatefulWidgetです。

### _SettingPageState

設定画面です。JSONファイルを読み込んで、山手線の駅データとしてデータストアにインポートします。

![localhost_53739_ (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/d930af1b-e57a-037d-76dd-0bc863c66468.png)


## NCMB SDKのインストール

NCMB SDKは `flutter pub add ncmb` でインストールできます。

```
flutter pub add ncmb
```

記事執筆時点での最新版は `2.3.0` です。

## NCMB SDKの初期化

まず main.dart にてNCMB SDKをインポートします。

```dart
import 'package:ncmb/ncmb.dart';
```

main関数にて初期化します。アプリケーションキーとクライアントキーは `assets/.env` 内に記述しています。今回はdotenvライブラリ `flutter_dotenv` を使っています。

`.env` の内容は以下の通りです。各キーはニフクラ mobile backendやMapboxで取得してください。

```
APPLICATION_KEY=YOUR_APPLICATION_KEY
CLIENT_KEY=YOUR_CLIENT_KEY
MAPBOX_ACCESS_TOKEN=YOUR_MAPBOX_ACCESS_TOKEN
```

main.dart のmain関数でNCMBの初期化をします。

```dart
Future main() async {
  await dotenv.load(fileName: '.env');
  var applicationKey =
      dotenv.get('APPLICATION_KEY', fallback: 'No application key found.');
  var clientKey = dotenv.get('CLIENT_KEY', fallback: 'No client key found.');
  NCMB(applicationKey, clientKey);
  runApp(const MyApp());
}
```

これでNCMB SDKの利用準備が整います。


## まとめ

今回は各画面の説明とNCMB SDKの初期化までを行いました。[次回は位置情報データのインポートを実装します](https://qiita.com/goofmint/items/95dd22c6e0d65d4a5896)。
Vagrant上のPosgreSQLに接続する

Vagrantで5432ポートをlocalhostの5432にマッピングしているにも関わらず、Vagrantホストから直接接続できませんでした。

なのでvagrantへssh tunnelして、接続することにしました。

以下のコマンドでVagrantへのssh接続情報を確認できます。

```
$ vagrant ssh-config
Host default
  HostName 127.0.0.1
  User vagrant
  Port 2222
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile /PATH_TO/private_key
  IdentitiesOnly yes
  LogLevel FATAL
  ForwardAgent yes
```

tunnelに必要な情報は、HostName,User,Port, private_keyへのパスでした。

参考
https://stackoverflow.com/questions/30823844/connect-to-mysql-database-on-vagrant-machine-in-phpstorm/43546183
NCMBのFlutter SDKで位置情報検索に対応しました

FlutterはDartで書かれたフレームワークになります。元々iOSやAndroidといったスマートフォン向けでしたが、今ではWebやWindows、macOSといったマルチプラットフォームで動作します。Flutter/Dartを覚えることで、多くの環境に対してアプリケーション開発が可能になります。

NCMBでは公式SDKを提供していませんが、非公式に開発を進めているFlutter SDKがあります。元々ベータとして0.1系でしたが、大幅な機能変更に合わせて v2 になりました。v2.3以降にて位置情報検索に対応しましたので、使い方を解説します。

[ncmb | Dart Package](https://pub.dev/packages/ncmb)

## インストール

`flutter pub get ncmb` でインストールできます。

## 使い方

任意のファイル上でライブラリを読み込みます。

```dart
import 'package:ncmb/ncmb.dart';
```

そしてNCMBオブジェクトを初期化します。

```dart
NCMB('APPLICATION_KEY', 'CLIENT_KEY');
```

## 位置情報検索の種類

NCMBでサポートしている位置情報検索は以下の3つになります。

- あるポイントを中心として、付近にあるデータから検索
- あるポイントを中心として、一定距離内にあるデータを検索
- ある2つのポイントを右上、左下（または右下、左上）として、その範囲内にあるデータを検索

### 位置情報はNCMBGeoPointで作成

位置情報検索を行う際には位置情報オブジェクトであるNCMBGeoPointを使います。オブジェクト作成時に緯度経度を指定してください。

```dart
var geo = NCMBGeoPoint(35.6585805, 139.7454329);
```

検索結果は `List<dynamic>` になります。これはNCMBObject（データストア）の場合もあれば、NCMBUser（会員検索）やNCMBInstallation（デバイストークン）などの場合もあるからです。必要に応じてキャストしてください。

### あるポイントを中心として、付近にあるデータから検索

付近にあるデータを検索する際には `near` メソッドを使います。`limit` を使って取得件数を指定してください。

```dart
var geo = NCMBGeoPoint(35.6585805, 139.7454329);
var query = NCMBQuery('Station');
query
	..near('geo', geo)
	..limit(5);
var results = await query.fetchAll();
```

### あるポイントを中心として、一定距離内にあるデータを検索

`near` に似ていますが、半径を指定する場合には次の3つのメソッドが用意されています。それぞれキロメートル、マイル、ラジアンという点が異なるだけです。

- void withinKilometers(String key, NCMBGeoPoint geo, double maxDistance)
- void withinMiles(String key, NCMBGeoPoint geo, double maxDistance)
- void withinRadians(String key, NCMBGeoPoint geo, double maxDistance)

以下は東京タワーを中心に1.5kmにあるデータを検索する例です。

```dart
var geo = NCMBGeoPoint(35.6585805, 139.7454329);
var query = NCMBQuery('Station');
query..withinKilometers('geo', geo, 1.5);
var results = await query.fetchAll();
```

### ある2つのポイントを右上、左下（または右下、左上）として、その範囲内にあるデータを検索

いわゆる矩形検索です。右上、右下などは意識せず利用できます。

```dart
var geo1 = NCMBGeoPoint(35.6500719, 139.7437146);
var geo2 = NCMBGeoPoint(35.6695908, 139.761875);
var query = NCMBQuery('Station');
query..withinSquare('geo', geo1, geo2);
var results = await query.fetchAll();
```

## コード

コードはオープンソースで、GitHub上で公開しています。ライセンスはMIT Licenseになります。

[NCMBMania/ncmb-dart: NCMB library for Dart and Flutter.](https://github.com/NCMBMania/ncmb-dart)

iOSやAndroidなどスマホネイティブに依存していないので、Flutter for Webでも利用可能です。

## まとめ

Flutterを覚えればiOS、Androidアプリともに一つのコードで書けるようになります。DartはJavaScriptライクな言語で、JavaScriptをマスターしている人であれば、それほど苦労せずにDartを書けるようになるでしょう。ぜひFlutterを使ったアプリ開発にNCMBをご利用ください！

[ncmb | Dart Package](https://pub.dev/packages/ncmb)
【flutter】ボタンの配置【超初心者向け】

#Flutterがやりたい

androidが気になりつつも、まずは一つの言語をある程度理解するべし！と思ってSwiftばかり触っていました。
まだお世辞にもswift開発ができるようになったとは言えませんが、アプリをいくつか作ったことによって作り方はわかるようになりました。
ここでの作り方とは、ボタンを設置する、考えた通りのUIデザインにする、希望通りの動作をするといったところです。

そうなると、さらに欲が出てきました。
そう、androidの開発です。

前々からkotlinかflutterを触りたかった（ちょっと触っては逃げていた）のですが、ぐっと気合を入れて、今swiftで作ったものくらい作りたいなぁと思います。

ということで、備忘録替わりに初心者中の初心者っぽいことから書いていきます。

##とにかく配置
そもそも、flutterはプロジェクトを始めたときからいろいろ書いてある。
これが僕には悩みどころでした。
「どこに書いたら追加されるん？」
適当に書いてはエラーの嵐、ボタンの配置とか初歩すぎるのか、技術ブログにすら詳しく書いてない。

あれこれ試して、やっと表示されました。

![Screenshot_1641863468.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241333/5c658af1-7737-97b9-e7d0-b06e7e994d67.jpeg)

```main.dart
import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;

  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }

  @override
  Widget build(BuildContext context) {

    return Scaffold(
      appBar: AppBar(

        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'You have pushed the button this many times:',
            ),
            Text(
              '$_counter',
              style: Theme.of(context).textTheme.headline4,
            ),
            ElevatedButton(
                onPressed: (){/*タップされた時の処理*/},
                child: Text('追加したボタン１'),
            )
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ),
    );
  }
}
```

新しいプロジェクトを立ち上げて、Emptyを選んだ状態から

```
ElevatedButton(
                onPressed: (){/*タップされた時の処理*/},
                child: Text('追加したボタン１'),
            )
```
の部分だけを追加しました。

なるほど、bodyの中のchildの中のchildrenに入力するのか・・・。

##次の疑問点
「childの前にも後ろにも違うchildが置けない」

今回設置できたボタンの場所は、ラベルの下だったので同じchildrenに入力するのはわかったのですが、ちょっと違う場所に配置するにはどうすればいいのか・・・

まだまだ旅は始まったばかりです。

まとまりのない文章になってしまい、申し訳ないです。
任意の文字列から特定の連続する文字列を探し、その直前の値により「True」または「False」を出力するプログラムを実装

任意の文字列から特定の連続する文字列を探し、その直前の値により「True」または「False」を出力するプログラムを実装します。


以下の要件を満たすxyz_thereメソッドを実装します。
------

- 任意の文字列から連続する文字列"xyz"を探し、その直前にピリオド（.）がない場合はTrueを出力する
- 任意の文字列から連続する文字列"xyz"を探し、その直前にピリオド（.）がある場合はFalseを出力する
- 上記2つの条件に当てはまらない場合はFalseを出力する


出力例
----

xyz_there('abcxyz') → True
xyz_there('abc.xyz') → False
xyz_there('xyz.abc') → True
xyz_there('azbycx') → False
xyz_there('a.zbycx') → False


include?メソッドを使いましょう。
------------
include?メソッドは、指定した要素が配列または文字列に含まれているかを判定するメソッドです。

```Ruby
str = "foobar"
puts str.include?("bar")
#=> true
puts str.include?("hoge")
#=> false
```

出力例
----------
```
def xyz_there(str) 
  if str.include?(".xyz")
    puts "False"
  elsif str.include?("xyz")
    puts "True"
  else
    puts "False"
  end
end

xyz_there('abcxyz')
```


ここ重要↓
----------------
include?を用いて、対象となる文字列が含まれているかどうかを、各条件式で判別しています。
ポイントとしては、str.include?(".xyz")の条件式をstr.include?("xyz")より前に設置することです。
例えば"abc.xyz"という文字列の場合は、str.include?("xyz")においてもtrueとなってしまうため、先に".xyz"を含むかどうかを判別する必要があります。


どうしても初心者だと puts "True"を先に書きたくなるところですが、そんなに甘くはないですね。
もっと勉強が必要だと改めて感じました。
Windows Terminalをセットアップする

# はじめに
Windows上では、プリセットのコマンドプロンプトやPowerShell、場合によってはLinux ディストリビューションなど様々なコマンドラインインターフェース(CLI)があり、それぞれに役割や特徴があります。

どれか一つのターミナルだけを使用するのならそこまで苦はないのですが、複数使用する場合などは、まとめて開いたり見れたりするといいなと思うものです。そんな時に便利なのがWindows Terminalなのです。

# Windows Terminalとは
Microsoftが中心となって開発しているOSSです。

様々なコマンドラインツールを同一のウィンドウで、タブごとに分けて表示したり、画面分割して複数起動したりできる優れもの。


# セットアップ
## インストール
Microsoft Storeから「Windows Terminal」をインストールします。

https://aka.ms/terminal

## オプション
### その1. 既定のプロファイル
`∨`>`設定`>`スタートアップ`>`既定のプロファイル`において、スタートアップ時に最初に開くCLIを選択します。

自分は`Ubuntu`を選択しました。


### その2. プロファイルの非表示
使用しないCLIに関しては、`∨`>`設定`>`プロファイル`>各CLI>`全般`において、「ドロップダウンからプロファイルを非表示にする」をONにしておきます。

### その3. Ubuntuの開始ディレクトリの変更
#### 確認
初期設定だと、Windows側のディレクトリ`/mnt/c/Users/<ユーザー名>`に設定されています。

実際に`Ctrl+,`>`プロファイル`>`Ubuntu`>`全般`において、「開始ディレクトリ」を見ると`%USERPROFILE%`という表記で指定されています。

#### 変更
一度Ubuntuのターミナル画面に戻り、`cd`コマンドを実行すると、カレントディレクトリが今回開始ディレクトリに指定したいhomeディレクトリに移動していることがわかります。

その状態で`explorer.exe .`を実行するとエクスプローラーが表示されるので、アドレスバーのパスをコピーしておきます。

ターミナルに戻り、`Ctrl+,`>`プロファイル`>`Ubuntu`>`全般`において、「開始ディレクトリ」を先ほどコピーしたパスに変更し、保存し、ターミナルを再起動して終了です。


# おわりに
これで快適にCLIを使用することできるようになりました。
今回はオプションの変更はそこまでしませんでしたが、使っていく中で文字が見づらいとかあればカラーテーマの変更もしてみようと思います。

# 引用・参考文献

1. Microsoft. "Windows ターミナルとは". https://docs.microsoft.com/ja-jp/windows/terminal/, (参照 2021-01-10)
【Rails】routesのエラー「``': No such file or directory 」の対処法

<h2>症状</h2>
railsで新たにアクションを追加しようと、routeファイルにルートを追加してサーバーを起動したところ下記のエラーが発生しました。
翻訳すると、「そのようなファイル、又はディレクトリはありません」でした

```ruby:error
 rails s
=> Booting Puma
=> Rails 6.0.4.1 application starting in development
=> Run `rails server --help` for more startup options
Exiting
D:/app/config/routes.rb:28:in ``': No such file or directory - checkout (Errno::ENOENT)
        from C:/appu/config/routes.rb:28:in `block (3 levels) in <main>'
        from C:/Ruby30-x64/lib/ruby/gems/3.0.0/gems/actionpack-6.0.4.1/lib/action_dispatch/routing/mapper.rb:956:in
```

routesファイルの該当の箇所は以下です。

```ruby:routes.rb
      post `checkout`, to: `stripes#checkout`
```

<h2>解決方法</h2>
ルーティングしている``を''に変更することで解決しました。
ファイルがないというより、指定の仕方が悪かったからファイルがないと怒られていたようです。

```ruby:routes.rb
      post 'checkout', to: 'stripes#checkout'
```

<h2>参考</h2>

https://railsguides.jp/routing.html