OmniAICreator/Qiita-1.07M huggingface dataset:
slickでスライドショーをお洒落に実装したかった。

##スライドショーを実装するためにslickを導入
詰まりまくったことを解決したので投稿

##環境
rails : 6.0.3.2
ruby : 2.6.6
Docker, docker-compose


##参考URL
http://kenwheeler.github.io/slick/


##先にできていること
jQueryの導入



##slick導入編


###slick本体をインストール

```ruby:qiita.rb
$ docker-compose run --rm web npm i slick-carousel

なんやかんや


40 packages are looking for funding
  run `npm fund` for details

found 0 vulnerabilities
```


##applocation.html.erbのhead要素に追記

```ruby:qiita.rb
<link rel="stylesheet" type="text/css" href="//cdn.jsdelivr.net/npm/slick-carousel@1.8.1/slick/slick.css"/>
<link rel="stylesheet" type="text/css" href="//cdn.jsdelivr.net/npm/slick-carousel@1.8.1/slick/slick-theme.css"/>
<script type="text/javascript" src="//cdn.jsdelivr.net/npm/slick-carousel@1.8.1/slick/slick.min.js"></script>
```





##jsファイル

slideの表示方法の設定については公式に書かれているので、一部だけ紹介。
slickの読み込みがどうもうまくいかなかったので、多分他の人とは違う書き方だと思う。

```ruby:slideshow.js
const jQuery = require('jquery');
require('slick-carousel');
(function($) {
    $(function() {
        $('.theTarget').slick({
            dots: true,
            autoplay: true,
            fade: true,
            autoplaySpeed: 3000
        });
    })
})(jQuery);
```



##viewにスライドショーで表示させたい画像の記述

```ruby:show.html.erb
<div class = "theTarget">
	<%= image_tag 'abc.png' %>
	<%= image_tag 'def.png' %>
	<%= image_tag 'ghi.png' %>
	<%= image_tag 'jkl.png' %>
	<%= image_tag 'mno.png' %>
</div>

<%= javascript_pack_tag 'slideshow.js' %>  #jsファイルの読み込み
```



##jsの読み込みのエラーが出た場合。
今回であれば、bin/webpackを実行してコンパイルすればエラーを解決できた。
webpackを理解できてないから、わざわざなんでこれをしないといけないのかが分からない

```ruby:qiita.rb
 % docker-compose run --rm  web bin/webpack 

Version: webpack 4.43.0
Time: 15190ms
Built at: 07/24/2020 11:18:43 PM
```
TypeScriptでstyled-componentsを使う時propsでstyleの制御ができなくて困った時の解決法

## 概要

TypeScriptでstyled-componentsを使いたくて[公式ドキュメント](https://styled-components.com/docs/basics)のコードを写経していたら、
"Adapting based on props"の節の以下のコードが通らなくて困った。

```tsx
const Button = styled.button`
  /* Adapt the colors based on primary prop */
  background: ${props => props.primary ? "palevioletred" : "white"};
  color: ${props => props.primary ? "white" : "palevioletred"};

  font-size: 1em;
  margin: 1em;
  padding: 0.25em 1em;
  border: 2px solid palevioletred;
  border-radius: 3px;
`;
```

## 原因

原因はpropsの部分に以下のエラーが出ていた。

```
> any
> プロパティ 'primary' は型 'ThemedStyledProps<Pick<DetailedHTMLProps<ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>,
 "form" | ... 264 more ... | "value"> & { ...; }, any>' に存在しません。ts(2339)
```

## 解決法

interfaceを以下の様に定義してあげるとコンパイルが通った。

```tsx
import styled, { StyledComponent } from 'styled-components';

interface ButtonProps {
  primary: boolean;
}

export const Button = styled.button<ButtonProps>`
  /* Adapt the colors based on primary prop */
  background: ${({primary}) => (primary ? 'palevioletred' : 'white')};
  color: ${({primary}) => (primary ? 'white' : 'palevioletred')};

  font-size: 1em;
  margin: 1em;
  padding: 0.25em 1em;
  border: 2px solid palevioletred;
  border-radius: 3px;
`;
```

ちなみにこの`Button`コンポーネントを使う側のコードは以下の様になる。

```tsx
import React from 'react';
import Button from '../../atoms/Button';

export const App: React.FC = () => {
  return (
    <>
      <Button primary={false}> Button </Button>
    </>
  );
};

```
Microsoft SQL: スナップショット分離環境でデッドロックを検証する

Microsoft Azure SQL を含め、多くの環境でスナップショット分離が有効になっています。更新と読み取りが競合する環境下において最適な設定ですが、古来のデッドロック検証ができなくなりました。

# これまでのクエリ

まず 1 つ目のセッションで更新処理を行います。

```sql
-- 1 つ目のセッション
BEGIN TRANSACTION
UPDATE [dbo].[Table1] SET Value = '111' WHERE ID = 1
```
次に 2 つ目のセッションで別の列に対して更新処理を行いつつ、1 つ目のセッションで更新している行を読み取ります。

```sql
-- 2 つ目のセッション
BEGIN TRANSACTION
UPDATE [dbo].[Table1] SET Value = '222' WHERE ID = 2
SELECT * FROM Table1 WHERE ID = 1
```

Read Committed 分離レベルであればここで読み取りがブロックされ、1 つ目の処理でさらに別セッションで更新中の列を読むとデッドロックになりましたが、スナップショット分離が有効なため、読み取りはブロックされず、更新前のデータが読み取れます。

# READCOMMITTEDLOCK ヒント

T-SQL のクエリでは、テーブルに対してヒントを設定できます。有名なのは NOLOCK ヒントですが、Read Committed の挙動を強制する READCOMMITTEDLOCK ヒントが存在します。よって以下手順でデッドロックを起こせます。

```sql
-- 1 つ目のセッション
BEGIN TRANSACTION
UPDATE [dbo].[Table1] SET Value = '111' WHERE ID = 1
```
次に 2 つ目のセッションで別の列に対して更新処理を行いつつ、1 つ目のセッションで更新している行を READCOMMITTEDLOCK ヒントを付けて読み取ります。

```sql
-- 2 つ目のセッション
BEGIN TRANSACTION
UPDATE [dbo].[Table1] SET Value = '222' WHERE ID = 2
SELECT * FROM Table1 (READCOMMITTEDLOCK) WHERE ID = 1
```
最後の 1 つ目のセッションで更新中の列を読み取ります。

```sql
-- 1 つ目のセッション
SELECT * FROM Table1 (READCOMMITTEDLOCK) WHERE ID = 2
```
以上。

# 参照

[SET TRANSACTION ISOLATION LEVEL (Transact-SQL)](https://docs.microsoft.com/ja-jp/sql/t-sql/statements/set-transaction-isolation-level-transact-sql?view=sql-server-ver15)
[ヒント (Transact-SQL) - Table](https://docs.microsoft.com/ja-jp/sql/t-sql/queries/hints-transact-sql-table?view=sql-server-ver15)
[SQL Server でのスナップショット分離](https://docs.microsoft.com/ja-jp/sql/connect/ado-net/sql/snapshot-isolation-sql-server?view=sql-server-ver15)
LaradockでWordPressを動かしてMailHogを使う

Laradockはオールインワンで便利なので、PHP絡みでちょっとした開発のときは、マルチプロジェクト環境のLaradockから必要なコンテナを起ち上げて、ちょこちょこっと作っちゃうとかできて重宝しています。
そんなわけで非常にマニアックかと思いますがLaradockにて

- nginx
- MySQL
- MailHog

を起ち上げてWordPressを動かしたときの、MailHog設定について、ちょっと躓いたのでメモ。

# mhsendmailのインストール

WordPressはメール送信に、php.iniに設定してあるsendmailを使うみたいで、Laradockのデフォルトの設定だとメール送信をMailHogがキャッチしてくれません。（エラーになる）

sendimailをMailHogにしてくれる `mailhog/mhsendmail` をインストールします。

```Dockerfile:laradock/php-fpm/Dockerfile

###########################################################################
# mhsendmail:
###########################################################################
RUN curl -sSLO https://github.com/mailhog/mhsendmail/releases/download/v0.2.0/mhsendmail_linux_amd64 \
    && chmod +x mhsendmail_linux_amd64 \
    && mv mhsendmail_linux_amd64 /usr/local/bin/mhsendmail

```
Final Touch の上辺りに追加するとよいかも。


```ini:laradock/php-fpm/php***.ini
; sendmail_path = 
sendmail_path = "/usr/local/bin/mhsendmail --smtp-addr=mailhog:1025"
```

php***.ini は使うバージョンに合わせて適宜修正


# Docker再構築
すでに起動済みの場合は再構築

```
$ docker-compose build --no-cache php-fpm 
```

以上で、PHPのsendmailからMailHogに接続できます。
これで、WordPressから送信されたメールをMailHogでキャッチすることができるようになります。

# WordPressでメール文字化け設定

WordPressからのメールをMailHogで受けられるようになりましたが、そのままだと文字化けしてしまうので、WP Multibyte Patchの設定をする。

```php:wp-content/wpmp-config.php
<?php
$wpmp_conf['mail_mode'] = 'UTF-8';
```
ファイルがない場合は作成する。

---

以上、Laradock環境でWordPressを動かしてMailHogでメールをキャッチする方法です。
そんな状況あまりないと思うけど備忘録として。

# 参考
https://laradock.io/
https://github.com/mailhog/mhsendmail
https://www.tecking.org/archives/5868
https://ja.wordpress.org/plugins/wp-multibyte-patch/
https://qiita.com/Taichi-yzrh/items/4b281bc9934c6c2dcd90
AtCoder / C#でPopCount

#PopCountとは
数値を2進数に変換したときに、立っているbitの数を数えることを言います。
例: `popcount(12) = 2`
`12`を2進数で表すと`1100`になりますから、1の数は2つありますので、popcount(12)=2です

最近でいうと、[エイシング プログラミング コンテスト 2020](https://atcoder.jp/contests/aising2020/)のD問題で出てきました。


# C＃ではどうやるのか
ちょっと前までは、愚直に、bitにしてstringにして1の数を数えたり、bit演算子を駆使したりしてできました。
参考:[ビットカウントする高速アルゴリズムをPythonで実装しながら詳しく解説してみる](https://qiita.com/zawawahoge/items/8bbd4c2319e7f7746266)

しかし、.Net Core3.0には、ハードウェア命令を直接操作できる関数が導入され、またそれのラッパーとしてBitOperationsというクラスが追加されています。
ただし、これは、CLS準拠ではないので他のコンパイラには含まれていません。

AtCoderのC#(.NET Core 3.1.201)を使うと、.Net Core 3.0で実装された関数を使うことができます。

参考:
[System.Runtime.Intrinsics.X86 Namespace](https://docs.microsoft.com/ja-jp/dotnet/api/system.runtime.intrinsics.x86?view=netcore-3.0)
[BitOperations クラス](https://docs.microsoft.com/ja-jp/dotnet/api/system.numerics.bitoperations?view=netcore-3.1)

## 実行例
```C#
using System.Numerics;   // ←これが必要です
using System;
public class MainClass
{
	public static void Main()
	{
		// 引数はuint、もしくはulongになるのでint やlongで扱ってるときはキャストする
		Console.WriteLine(BitOperations.PopCount(12));  // 2
		Console.WriteLine(BitOperations.PopCount(100000000));  // 12
		Console.WriteLine(BitOperations.PopCount(2049));  //2
	}
}
```

AtCoderに提出するときは、コンパイラに『C#(.NET Core 3.1.201)』を選ぶのをわすれないようにしましょう。


## 他の便利操作
`BitOperations.LeadingZeroCount(UInt64) `
先頭から0bitの数を数える

`BitOperations.TrailingZeroCount(Int64) `
末尾から0bitの数を数える
Rails アプリケーション作成手順 

##概要
Dockerを使ってRails開発を始めれるように自分用のメモとして作成しました。
使用するDBはmysqlです。


##1.アプリケーション用のbuild contextを作成

フォルダの名前：アプリケーション名
build context内：Dockerfile, docker-compose.yml, Gemfile Gemfile.lock
を作成します。


##2.rails new を実行する
```:コマンド
$docker-compose run web rails new . --force --database=mysql --skip-bundle
```

##3.database.ymlを編集する
```yml:database.yml
default: &default
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password: password # docker-compose.ymlのMYSQL_ROOT_PASSWORD
  host: db # docker-compose.ymlのservice名
```

##4.docker buildしてGEMを読み込む

```:コマンド
# コンテナをビルド
$ docker-compose build 

# コンテナを起動
$ docker-compose up -d
```
##DBを作成

```:コマンド
$ docker-compose run web rails db:create
```

##ブラウザでlocalhost:XXXXにアクセスしてサーバ起動を確認する。
![スクリーンショット 2020-08-09 16.18.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/451281/f11935b5-b91d-dc1d-0faf-dcb8a5939698.png)
【Flutter】StatelessWidgetとStatefulWidgetにデータを渡す

FlutterでStatefulWidgetにデータを渡すのにつまづいたので、
メモがてらに記事に残しておきたいと思います。

ついでに、StatelessWidgetにデータを渡す方法も残しておきます。


# StatelessWidget（ステートレスウィジェット）でデータを受け取る

```dart

class Stateless extends StatelessWidget {
  @override
  
  final String arguments;
  Stateless(this.arguments); // コンストラクタで引数を受け取る
  Widget build(BuildContext context) {
   return Scaffold(
      appBar: Header(),
      body: Text(arguments); // 変数名をテキストに出力する
    );
  }
}
```

僕がよくやるミスは `Stateless(arguments);` という風に`this`のつけ忘れです。

エラーも出ないので、なぜかうまくいかない場合は確認してみてください。


# StatefulWidget（ステートフルウィジェット）でデータを受け取る

```dart

class Stateful extends StatefulWidget {
  String argument;
  Stateful(this.argument);

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

class StatefulState extends State<Stateful> {

  Widget build(BuildContext context) {
   return Scaffold(
      appBar: Header(),
      body: Text(widget.argument); // 引数をテキストに表示する
    );
  }
}
```

重要ポイントは`argument`っていうデータを引数としてもらいたい場合、
ここのコードでいう`Statefulウィジェット`で引数を受け取ります。

実際の画面をコーディングしている`StatefulStateウィジェット`では`widget.引数名`で出力することができます。


# StatefulWidget（ステートフルウィジェット）で、引数の値を変数に格納したい！

```dart
class Stateful extends StatefulWidget {
  String argument;
  Stateful(this.argument);

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

class StatefulState extends State<Stateful> {

  TextEditingController _textController = new TextEditingController();

  // 引数の値があれば、_textController.textに代入する
  void initState() {
    super.initState();
    if (widget.argument != null) {
      this._textController.text =  widget.argument;
    }
  }

  Widget build(BuildContext context) {
   return Scaffold(
      appBar: Header(),
      body: TextFormField(
        controller: _textController, // TextFormFieldで_textControllerを指定する
        decoration: InputDecoration(
          border: const OutlineInputBorder(
            borderRadius: const BorderRadius.all(
              const Radius.circular(10.0),
            ),
          ),
        contentPadding: EdgeInsets.symmetric(vertical: 15.0, horizontal: 10.0),
        ),
      ),
    );
  }
}
```

# 別ウィジェットにデータを渡す

ルート名(現在「/test」となっている部分)は適宜変更してください。

```dart

Navigator.push(
  context,
  MaterialPageRoute(
    settings: const RouteSettings(name: "/test"),
    builder: (BuildContext contect) =>
      State("testtesttesttesttesttest");
    ),
);
```

# 終わりに

以上です。

記事としてはあんまり、まとまってなくて申し訳ないですが、
個人的につまづいたところをまとめてみました。

参考になれば幸いです。
Saleforce　メール送信

SaleforceメールテンプレートにContact項目の差し込み項目がある場合のメール送信実装例。
-------------------
```Apex
// EmailTemplate取得
String DeveloperName = 'testName';
EmailTemplate mailTemplate = 'SELECT Id, Name, Subject, Body, TemplateType ' + 
                             'FROM EmailTemplate ' + 
                             'WHERE DeveloperName = :DeveloperName';

// Contactオブジェクトに関連する差し込み項目の置換
Messaging.SingleEmailMessage message = Messaging.renderStoredEmailTemplate(mailTemplate.Id, contact.Id, null);

// メール内容の埋込文字の置換
String mailBody = String.format(message.getPlainTextBody(), replaceValue);

// メール送信
Messaging.SendEmailResult[] results = sendMail(mailList, mailTemplate.Subject, mailBody);

// 送信結果処理
if (results[0].success) {
    // 送信成功
}
```
FizzBuzzを、やってみた。

### 概要
Rubyで,、FizzBuzz
1から100の変数を表示、その中の
3で割り切れる値には、文字列"Fizz"を
5で割り切れる値には、文字列”Buzz”を
表示し
3でも5でも割り切れる値には"FizzBuzz"を表示する。





```fizz_buzz.rb
(1..100).each{|n|
  if n % 15 == 0
    puts "FizzBuzz"
  elsif n % 3 == 0
    puts "Fizz"
  elsif n % 5 == 0
    puts "Buzz"
  else
    puts n
  end
}
```
### コマンドで実行した結果

```

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
Buzz
```

### githubのリンク
https://github.com/mitsugu3/FizzBuzz/blob/master/fizz_buzz.rb


### 感想
FizzBuzzを、やってみて
each文とelse if文とまとめてコードを書くことを学べたので
これからの作業を手早くできることと
知見が広がった。
NVIDIA CUDA toolkit on Ubuntu20.04

システム構成
===

- PC：[DELL XPS15 2017](https://www.dell.com/ja-jp/shop/cty/pdp/spd/xps-15-9550-laptop)（GeForce GTX 1050）
- OS：Ubuntu Linux 20.04 LTS Desktop 日本語版

CUDA Toolkitインストール
===

このインストール方法は Anaconda の Python を利用しないと使えないかもしれないです。
conda install でAnaconda で用意されている CUDA と cuDNN をインストールしているように見えます。

1. Ubuntu のログインメニューから「ソフトウェアのアップデート」を開く
2. 「追加のドライバー」タブで「NVIDIA driver metapackageをnvidia-driver-440から使用します（プロプラエタリ）」を選択して、「変更の適用」ボタンを押下

    ![ubuntu2004_additional_driver.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117636/242a3e56-2fb5-8046-f95c-4df772e70163.png)


3. CUDA Toolkit のインストール

    ```bash
    $ sudo apt install nvidia-cuda-toolkit
    ```


Anacondaのインストール
===

```bash
$ sh ./Anaconda3-2020.02-Linux-x86_64.sh
```


Tensorflow、Pytorch、CuPyのインストールと動作確認  
===

Tensorflow1系と2系は同居できないので、両方を使いたい場合は仮想環境を作る必要があります。
あと、よくわかりませんが、python3.8 に tensorflow1.14 はインストールできないようです。

- Tensorflow1系

  ```bash
  $ conda create --name=tf1 python=3.7 jupyter cudatoolkit==10.1.243
  $ conda activate tf1
  $ conda install tensorflow-gpu==1.14.0
  $ conda install pytorch torchvision cudatoolkit=10.1 -c pytorch
  $ pip install cupy-cuda101 chainer chainercv
  ```

- Tensorflow2系

  ```bash
  $ conda create --name=tf2 jupyter cudatoolkit==10.1.243
  $ conda activate tf2
  $ conda install tensorflow-gpu
  $ conda install pytorch torchvision cudatoolkit=10.1 -c pytorch
  $ pip install cupy-cuda101 chainer chainercv
  ```


## GPUの動作確認

- Tensorflow

  ```bash
  $ python -c 'from tensorflow.python.client import device_lib; device_lib.list_local_devices()'
  ```

- Pytorch

  ```bash
  $ python -c 'import torch; print(torch.cuda.is_available())'
  ```

- CuPy

  ```bash
  $ python -c 'import chainer; chainer.print_runtime_info()'
  ```


その他
===

1. Ubuntu がGPUを認識しているかの確認

    ```bash
    $ sudo ubuntu-drivers devices
    ```

2. GPUドライバが正しくインストールされているかの確認

    ```bash
    $ nvidia-smi
    ```
直観でわかる、Pandas → Scikit-learnへの渡し方

何があったか
============
手元に *Pandas* の *DataFrame* がある条件で、ひさしぶりに *Scikit-learn* を使おうとしたら、どういう形で渡すんだっけ？と少し迷いました。同じ境遇のとき、直観的に思い出せるように書き出します。

前提
============
手元に*DataFrame* がある前提です( 今回はダミーデータで *DataFrame* を自作します )。
直観的理解を目指して、サンプルでは説明変数３つ *( X1, X2, X3 )* だけの、超簡易なものを使います。
目的変数 *( Y )* はバイナリラベル ( 1, 0 ) とします。

```rb
import pandas as pd
data = [[1,1,0,0], [0,0,0,1], [0,0,1,1]]
index = ["a", "b", "c"]
columns = ["Y","X1","X2","X3"] 
df = pd.DataFrame(data, index=index, columns=columns)
```

|    |   Y |   X1 |   X2 |   X3 |
|:---|----:|-----:|-----:|-----:|
| a  |   1 |    1 |    0 |    0 |
| b  |   0 |    0 |    0 |    1 |
| c  |   0 |    0 |    1 |    1 |


DF→Sklearn
============
この *DataFrame* から、学習データ *( X_train )* とラベルデータ *( y_train )* を *Numpy Array* として作成し、sklearnに渡して学習させます。
モデルはここでは、決定木分類にしておきましょう。
ちなみに、決定木やランダムフォレストは、そのアルゴリズム性質上、データを正規化しなくてよいので、とりあえずモデルを作ってみるというような時にはおすすめです。

```rb
from sklearn.tree import DecisionTreeClassifier
y_train = df["Y"].values
X_train = df.drop("Y", axis=1).values
model = DecisionTreeClassifier().fit(X_train, y_train)
```

ちゃんと学習できたのか、以下の新しいデータをテストデータとして、モデルに予測させてみます ( 予測というか暗記ですが… )。3つのインスタンスの *Y* を予測しますが、仮に *d, e, f* とすると、*d=0, e=1, f=0*になると想像できます。


```rb
new_data = [[0,0,1], [1,0,0], [0,1,1]]
model.predict(new_data)
# 出力は array([0, 1, 0], dtype=int64)
```

ちゃんと学習できているようです。
docker runでエラーが出る時の対処法（docker: you are not authorized to perform this operation: server returned 401.）

| 環境 | バージョン |
|:-:|:-:|
| macOS Catalina  | 10.15.6  |
| Docker  | 19.03.8  |


Macのターミナルから`docker run`コマンドで起動しようとした時に
以下のようなエラーが発生したので、その対処法を備忘録としてまとめます。

```
docker: you are not authorized to perform this operation: server returned 401.
See 'docker run --help'.
```

###原因

どうやらDockerの**「Docker Content Trust(DCT)」**という検証機能が影響しているようでした。
これは、イメージが改ざんされていないか等を検証する機能なのですが、イメージに特に問題がないことが
わかっている場合は、以下のコマンドで環境変数を設定して、DCTを無効化します。

```
$ export DOCKER_CONTENT_TRUST=0
```

これで、docker runコマンドが実行できるようになりました。
ローカルのDockerにLAMP環境を構築

#はじめに
ローカルのDockerにLAMP環境を構築する方法です。
以下の環境を構築します。
Windows１０Proに構築します。

+ CentOS7.4.1708
+ PHP7.2
+ Laravel5.5
+ Apache
+ MySQL5.7
+ phpMyAdmin]

※予め出来ているDockerファイルを利用するため、Dockerファイルの作成方法などを記載するわけではありません。

#Docker Desktopのインストール
以下のサイトからDocker Desktopをインストールします。
https://www.docker.com/get-started

#Dockerファイル群の配置
以下から、ApaLara.zipをDLし、任意の場所に配置します。
https://github.com/shinjinakatamari/LAMP

#配置フォルダの追加
DockerDeskTopを開き、のsetting＞Resources>FILE SHARINGで設定フォルダを追加し、Apply&Restartをクリックする

#コマンドの実施
コマンドプロンプトを起動し、以下のコマンドで、配置フォルダに移動する。

```cmd
cd c:¥・・・
```

以下のコマンドを実行し、Dockerの作成と立ち上げを行う。

```cmd
docker-compose build
docker-compose up -d
```

#起動確認
http://localhost/
上記にアクセスすると、Laravelのページが表示される。

http://localhost:8080/
上記にアクセスすると、PHPMYAdminのページが表示される。
zshrc　カスタマイズ　メモ

# zshrcのカスタマイズ方法

自身の端末を変更したときのメモ用

## 手順

```terminal
vi ~/.zshrc
source ~/.zshrc
```

## ソース例

```terminal
export LANG=ja_JP.UTF-8
HISTFILE=$HOME/.zsh-history
HISTSIZE=100000
SAVEHIST=100000
autoload -U compinit #補完機能の強化
compinit
autoload colors　## プロンプトの設定
colors
case ${UID} in
0)
  PROMPT="[%{${fg[blue]}%}%n@%m%{${reset_color}%}] %{${fg[blue]}%}#%{${reset_color}%} "
  PROMPT2="%B%{${fg[blue]}%}%_#%{${reset_color}%}%b "
  SPROMPT="%B%{${fg[blue]}%}%r is correct? [n,y,a,e]:%{${reset_color}%}%b "
  RPROMPT="%{${fg[blue]}%}[%/]%{${reset_color}%}"
  ;;
*)
  PROMPT="[%n@%m] %{${fg[blue]}%}#%{${reset_color}%} "
  PROMPT2="%B%{${fg[blue]}%}%_#%{${reset_color}%}%b "
  SPROMPT="%B%{${fg[blue]}%}%r is correct? [n,y,a,e]:%{${reset_color}%}%b "
  RPROMPT="%{${fg[blue]}%}[%/]%{${reset_color}%}"
  ;;
esac
limit coredumpsize 102400

```

# カスタマイズ例

*[カスタマイズ例１](https://j7400157.hatenadiary.org/entry/20080723/1216827182)
*[カスタマイズ例2](https://gist.github.com/mollifier/4979906)
*[カスタマイズ例３](https://qiita.com/cielo1985/items/6d32e2ec7c74ee60dca7)
Saleforce　Siteクラスの使用例

プロジェクトにSiteクラスの使用例を整理する
コミュニティユーザを利用時、Siteクラスを利用しログイン関連の各種処理が簡単に実現できる。
--------------

- Site.login

```login.cls
PageReference homePage;// 遷移先画面を格納
String mypageUrl = '/testpath';// mypageUrl相対パスを指定
homePage = Site.login(userId, password, mypageUrl);
```

- Site.validatePassword

```validatePassword(Visualforce).cls
User user = new User();
user.UserName  = 'testUserName';// UserName設定必須
Site.validatePassword(user, password, rePassword);
// 検証エラーの場合
// メソッドが Lightning コントローラで実行されたときに検証が失敗すると、失敗した検証を説明する Apex 例外が発生します。
// メソッドが Visualforce コントローラで実行されたときに検証が失敗すると、Visualforce エラーメッセージが提供されます。
// 以下の実装例はVisualforceの例です。
if (ApexPages.getMessages().size() > 0) {
    // エラー処理
}
```

- Site.createExternalUser

```createExternalUser.cls
User u = new User();
u.Username = userName;
u.Email = email;
u.FirstName = firstName;
u.LastName = lastName;
u.CommunityNickname = communityNickname;
u.ProfileId = profileId;

String accountId = '';
String userId;
try {
    userId = Site.createExternalUser(u, accountId, password);
} catch(Site.ExternalUserCreateException ex) {
    List<String> errors = ex.getDisplayMessages();
    for (String error : errors)  {
        ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.ERROR, error));
    }
    // This message is used for debugging. Do not display this in the UI to the end user.
    // It has the information around why the user creation failed.
    System.debug(ex.getMessage());
}
```

- Site.changePassword

```changePassword.cls
Site.changePassword(newPassword, verifyNewPassword, oldpassword); 
```

- Site.forgotPassword

```forgotPassword.cls
boolean success = Site.forgotPassword(username);
PageReference pr = yourForgotPasswordConfirmPage;
pr.setRedirect(true);
if (success) return pr;
```

- Site.isValidUsername

```isValidUsername.cls
Site.forgotPassword(username);
ApexPages.PageReference checkEmailRef = new PageReference(checkEmailUrl);
if(!Site.isValidUsername(username)) {
    return Label.Site.invalid_email;
}
aura.redirect(checkEmailRef);
return null;
```

-----------
※ ボーナス

```isGuestUser.cls
// ユーザであるかどうかの判定
Auth.CommunitiesUtil.isGuestUser();
```
スマホもPCの一員としてファイル同期したいじゃない？


[前回の続きです。](https://qiita.com/ykato/items/0939cbae9ce338a26914)

前回はGo言語のお力を借りてWindows、Linuxが載ってるデバイス間は同期できたねー
でも僕らはたいてい他のコンピューターも抱えているハズ。

### そう、スマホ！

こいつも前回のエコシステムに乗っけられればもっと家庭内ネットワークはいいものになるハズ。
PC達とスマホを同期する機会なんて無いって？そうでしょうか？？僕は

- NASに溜め込んだMP3をランダムで引っこ抜く
- PC側でゲインとか音質とかバッチ処理で変換処理して標準化
- スマホに転送する

って事をよくやるので必要で、**こんな使い方が今回のツールを作る出発点だったりします**。

# でけた！

![andoukie.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189193/921623b7-591c-a207-42ad-d28caf0d0302.gif)

<a href="https://github.com/yasutakatou/andoukie"><img src="https://github-link-card.s3.ap-northeast-1.amazonaws.com/yasutakatou/andoukie.png" width="460px"></a>

このアプリはこんな機能があります。

 - **アクセス先IPアドレスをQRコードで読みます**。なので手入力の手間が要りません
 - ゲージとかスイッチで直感的に同期をコントロールできます
 - PC版みたく、クライアントしかないファイルを消して完全同期する機能があります

詳しくはリポジトリ見てくださいな。releaseの.apkをもってくればインスコできます。

# つかいたい！

 - PC版を起動したら、EnterかSpaceを押すとQRコードが表示されます

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189193/bcaa143f-281b-b05f-f0c4-0dbeaef0ca15.png)

 - それをスマホ版アプリで読み取れば同期が開始されます

# UIわからん！

# ![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189193/bf56a784-9c4b-35ed-3c75-a109ec7b2fc2.png)

①は同期した時にサーバーに無いのに、クライアントにあるファイルを消すモードです。完全同期しておきたい時に使います。

②は同期ゲージです。この数字が何秒毎に同期するかになります。同期間隔が狭いとデカいファイルが転送しきれないのでその点はご注意を

③は同期状況とか動作ステータスが色々でます

# あとがき

アプリの開発にApache cordovaを使いましたが、

・プラグインが継続保守されてなくて大量に開発停止してて動かないものが多い
・エラーを教えてくれない、のは良いがあってもスルーして動く(無い関数があっても平気で動く)
・デバッグしてデプロイしてもアプリを再インスコしないと修正できない

という僕的にうーんな点があって苦労した・・
これ流石に修正してコミットするレベル越えすぎなので逃げてすいませんが。。

# 追伸

### Syncthing知らないで作ってしまったので参考に持ってよくできないか考え中っす！
Fusion 360 を Pythonで動かそう その７　点を通過するスプライン作成

#はじめに
Fusion360 のAPIの理解を深めるために公式ドキュメント内のサンプルコード [**Sketch spline through points creation API Sample (点を通過するスプライン作成 APIサンプル)**](http://help.autodesk.com/view/fusion360/ENU/?guid=GUID-c3d4a306-fade-11e4-8e56-3417ebd3d5be) の内容からドキュメントを読み込んでみたメモ書きです
新しいスケッチを作成し、スケッチ内にスプライン曲線を作成します。

#スクリプトの内容を確認する

##最初と最後のおまじないとスケッチの作成まで
最初と最後のこの辺りはFusion360 APIのお決まりのパターンです。[**その５**](https://qiita.com/reisyu/items/c5544f877238b70730ce)で触れたので説明を省略します。

```Python
import adsk.core, adsk.fusion, traceback

def run(context):
    ui = None
    try: 
        app = adsk.core.Application.get()
        ui = app.userInterface

        doc = app.documents.add(adsk.core.DocumentTypes.FusionDesignDocumentType)
        design = app.activeProduct

        # Get the root component of the active design.
        rootComp = design.rootComponent

        # Create a new sketch on the xy plane.
        sketch = rootComp.sketches.add(rootComp.xYConstructionPlane)

        #
        # ここにコードを追加していく
        #

    except:
        if ui:
            ui.messageBox('Failed:\n{}'.format(traceback.format_exc()))

```
##ObjectCollection オブジェクトを作成

```python
        # Create an object collection for the points.
        points = adsk.core.ObjectCollection.create()
```
[**ObjectCollection.create メソッド**](https://help.autodesk.com/view/fusion360/ENU/?guid=GUID-127cbb7f-1c16-4853-a67f-de774f0be0cc)で`points`という名前の ObjectCollection オブジェクトを作成。
[**ObjectCollection オブジェクト**](https://help.autodesk.com/view/fusion360/ENU/?guid=GUID-ded8aff3-e42d-4354-9778-aa60172f788e) ：任意のオブジェクト型のリストを扱うために使用される汎用コレクションです。

##ObjectCollection オブジェクトに Point3D オブジェクトを追加
```Python
        # Define the points the spline with fit through.
        points.add(adsk.core.Point3D.create(0, 0, 0))
        points.add(adsk.core.Point3D.create(5, 1, 0))
        points.add(adsk.core.Point3D.create(6, 4, 3))
        points.add(adsk.core.Point3D.create(7, 6, 6))
        points.add(adsk.core.Point3D.create(2, 3, 0))
        points.add(adsk.core.Point3D.create(0, 1, 0))
```
[**ObjectCollection.add Method メソッド**](https://help.autodesk.com/view/fusion360/ENU/?guid=GUID-925b7794-9ab3-4fc3-b180-1d6c5e85d385)で6個の[**Point3D オブジェクト**](https://help.autodesk.com/view/fusion360/ENU/?guid=GUID-c49e1ed5-7221-49a4-abc9-81e7beb2e51d)を追加

##スケッチにスプラインを追加
```Python
        # Create the spline.
        sketch.sketchCurves.sketchFittedSplines.add(points)
```
[**SketchFittedSplines.add メソッド**](https://help.autodesk.com/view/fusion360/ENU/?guid=GUID-97e2168d-7556-40ca-a1f2-580cc9ff3831)で点を通過するスプラインを作成。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/02382add-7d37-cac4-8023-5232ad840478.png)

#まとめ
複数のポイントをリストとして扱うために ObjectCollection オブジェクトが初登場しました。こいつの使いこなしをうまくできるようにならないといけなさそう

前の記事　[Fusion 360 を Pythonで動かそう その６　スケッチポイントを描く](https://qiita.com/reisyu/items/a1df42510f0498ca6252)
次の記事　[Fusion 360 を Pythonで動かそう その８　スケッチのフィレットとオフセット](https://qiita.com/reisyu/items/5e7f21d55193b9dc9894)

# 参考
[Fusion 360 API Reference Manual](http://help.autodesk.com/view/fusion360/ENU/?guid=GUID-7B5A90C8-E94C-48DA-B16B-430729B734DC)
Itertools

###Itertoolsの使い方をまとめ###

#### 1. itertools.product ####
itertools.product(ARR, repeat=2)
ボールを戻し、順番あり

```python

ARR = ["A", "B", "C"]
for item in itertools.product(ARR, repeat=2):
    print(item)
```

```sh

('A', 'A')
('A', 'B')
('A', 'C')
('B', 'A')
('B', 'B')
('B', 'C')
('C', 'A')
('C', 'B')
('C', 'C')
```


#### 2. itertools.combinations_with_replacement####
ボールを戻し、順番なし

```python

ARR = ["A", "B", "C"]
for item in itertools.combinations_with_replacement(ARR,2):
    print(item)
```

```sh

('A', 'A')
('A', 'B')
('A', 'C')
('B', 'B')
('B', 'C')
('C', 'C')
```


#### 3. itertools.permutations ####
ボールを戻さない、順番あり

```python

ARR = ["A", "B", "C"]
for item in itertools.permutations(ARR,2):
    print(item)
```

```sh

('A', 'B')
('A', 'C')
('B', 'A')
('B', 'C')
('C', 'A')
('C', 'B')
```

#### 4. itertools.combinations ####
ボールを戻さない、順番なし

```python

ARR = ["A", "B", "C"]
for item in itertools.combinations(ARR, 2):
    print(item)
```

```sh

('A', 'B')
('A', 'C')
('B', 'C')
```


#### 5. itertools.product(*categories)####
それぞれのカテゴリから一個取得して、すべての組み合わせを取得する場合。
もちろんdfsもできます。
itertoolsの使い方は以下になります。

```python

categories = [["noddle", "rice", "bread"], ["chinese cabbage", "carrot", "tomato"],["apple", "orange", "peach"]]
for item in itertools.product(*categories):
    print(item)
```

```sh

('apple', 'noddle', 'chinese cabbage')
('apple', 'noddle', 'carrot')
('apple', 'noddle', 'tomato')
('apple', 'rice', 'chinese cabbage')
('apple', 'rice', 'carrot')
('apple', 'rice', 'tomato')
('apple', 'bread', 'chinese cabbage')
('apple', 'bread', 'carrot')
('apple', 'bread', 'tomato')
('orange', 'noddle', 'chinese cabbage')
('orange', 'noddle', 'carrot')
('orange', 'noddle', 'tomato')
('orange', 'rice', 'chinese cabbage')
('orange', 'rice', 'carrot')
('orange', 'rice', 'tomato')
('orange', 'bread', 'chinese cabbage')
('orange', 'bread', 'carrot')
('orange', 'bread', 'tomato')
('peach', 'noddle', 'chinese cabbage')
('peach', 'noddle', 'carrot')
('peach', 'noddle', 'tomato')
('peach', 'rice', 'chinese cabbage')
('peach', 'rice', 'carrot')
('peach', 'rice', 'tomato')
('peach', 'bread', 'chinese cabbage')
('peach', 'bread', 'carrot')
('peach', 'bread', 'tomato')
```


###まとめ###
更新続き
さくらドメインとGCPの静的アドレスをつなぐ

### やりたいこと

さくらインターネットでドメインを購入していて、
そのドメインをGCPのロードバランサのIPと結びつけたい

### まずは静的なアドレスを作成する

静的アドレスはプロジェクト用に予約される外部 IP アドレスであり、解放するまで予約されたままになる
作成方法は[こちらから](https://cloud.google.com/compute/docs/ip-addresses/reserve-static-external-ip-address?hl=ja)



### 次に、Cloud DNSを作成

そもそもCloud DNSとは、、、、というのは[こちらから](https://cloud.google.com/dns?hl=ja)

こちらの画面のゾーン作成から作成できる

![スクリーンショット 2020-07-25 11.53.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214984/ee74e1d5-67aa-f791-4838-4c2f333a9424.png)

作成すると、SOAレコードとNSレコードが自動で作成される

![スクリーンショット 2020-07-25 11.56.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214984/9ce6f3f1-7a32-3581-ad9f-faf87bcd34e6.png)



SOAレコードは権威DNSサーバーが参照する情報で、シリアル番号や更新期間の情報である
[詳しくはこちら](https://wa3.i-3-i.info/word12285.html)

NSレコードはそのままで、ドメインネームサーバーのレコード

SOAレコードをNSレコードは自動で作成されるが、Aレコードは自分で追加する
先程作成した静的IPアドレスをAレコードとして追加する

これで、NSレコードに記載されたネームサーバーでドメイン名とIPアドレスを結びつけることができた

ではhostコマンドで確認してみるが、まだ変わってない
仮に、変更前のさくらドメインのIPアドレスが xx.xxx.xxx.xx
先程作成した静的アドレスが oo.ooo.ooo.oo だったとすると、
下記のように、まだ、さくらドメインのIPアドレスになっている

```
host example.com
example.com has address xx.xxx.xxx.xx
```

参照しているネームサーバを見るとよくわかる
ネームサーバが「ns○.dns.ne.jp」で、さくらドメインで設定してあるネームサーバを参照してしまっている、、、
ということで、ドメインに紐づくネームサーバを変更しないといけないというわけだ

```
dig -t NS example.com
(省略）
;; ANSWER SECTION:
example.com.	21600	IN	NS	ns1.dns.ne.jp.
example.com.	21600	IN	NS	ns2.dns.ne.jp.
```

### 最後に、さくらドメインのネームサーバ変更

ここで気をつけたいのが、さくらドメイン一覧を開くと、ゾーン編集とWHOIS情報があるが、
ここではWHOIS情報からネームサーバを変更する
WHOIS情報のリンク先に、ネームサーバ1~4を登録できるので、
そこに、ns-cloud-b1.googledomains.com から ns-cloud-b4.googledomains.comを登録する


![スクリーンショット 2020-07-25 12.35.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214984/cefaf5f5-e747-cca1-5f1f-944028d45f3f.png)

時間を少し開けて、再びhostコマンドとdigコマンドで確認すると、
hostコマンドでは最初に作成した静的アドレスが結びついていることが確認でき、
digコマンドでは参照しているネームサーバがns-cloud-b○.googledomains.comであることが確認できる

```
host example.com
example.com has address oo.ooo.ooo.oo
```

```
dig -t NS example.com
(省略）
;; ANSWER SECTION:
example.com.	21600	IN	NS	ns-cloud-b○.googledomains.com.
```
Go言語はじめた勉強メモ１ フォーマッターとコメントとセミコロン

## この記事について

Cでプログラミングが苦手になりJavaで仕事をしJavaScriptでフリーランスになった私がGoエンジニアを目指すためにがんばっている様子の勉強メモです。半年以内にGo言語で開発プロジェクトに参加することが目標。

実は以前にGoとMangoDBで画像アップローダ＆Photoギャラリーを５日集中で作ったのですが、フレームワークを使ったことと時間をかけられなかったこともあってほぼGoの基本的なところが抑えれらていないと感じたため０から再度学び直すことにしました。


### 学習プラン
- Effective Goをチラ見して雰囲気をつかむ（Done）
- A Tour of Goをやってみる（Done）
- UdemyのWeb developmentのコースをやってみる（Now）
- 何か作ってみる

## Effective Goの最初をかいつまんでみる

### フォーマット
formatterが標準搭載だそうです。好みの戦争が起きない（はず）
意外と開発時にあとで整えようとするとGitのDiffの関係でなかなかやりにくかったりするフォーマットの統一がすでにあるのは嬉しい。

* インデントはTab（スペース派閥涙目）
* 行の長さの制約なし
* CやJavaと比較して少ないかっこ（）を目指した文法


### コメントの書き方
見慣れた感じのやつ。

```golang
/* こんな感じ
　複数行OK */ 
```
もしくは

```golang
// こんな感じ
```


### セミコロンについて

CやJavaのように行末セミコロンは不要だが、コンパイル時に挿入される。使うのは、IF文の条件式中が複数行にわたる時、典型的なFor文とかとか。

```golang
if err := file.Chmod(0664); err != nil {
    log.Print(err)
    return err
}

for i := 0; i < 10; i++ {
    sum += i
}
```

ルールとしては、「Statementを終了させる可能性のあるTokenの後ろに改行があれば、セミコロンを挿入する」とのことです。[Effective Go](https://golang.org/doc/effective_go.html)より

> “if the newline comes after a token that could end a statement, insert a semicolon”.

とりあえずよくわかんないですね。Tokenは意味のあるかたまりで、ここではコンパイラから見た意味合いのTokenなのだと思います。例えばver, importなどの予約語もToken、自分でつけた変数名は識別子というToken、=, >, - などの演算子、{, }, ; などの記号もTokenなどなど。

何はともあれ、改行は多少気をつけないといけない事はわかりました。なので・・・

```golang
if i < f() {
    g()
}
```
これはOKだけど


```golang
if i < f()  // wrong!
{           // wrong!
    g()
}
```

こうは書けない。（ちなみにこの記述がOKの言語でもこう書かれると私はちょっとイラッとします）


```golang
if i < f();
{          
    g();
}
```
なぜならこう解釈されてしまうためです。（多分）

## 参考文献
[Effective Go](https://golang.org/doc/effective_go.html)
Jetson NanoでJupyter labを外部からアクセスできるようにインストールする

まず、はじめに更新が必要な場合は、

```
$sudo apt-get update
$sudo apt-get upgrade
```

JetsonNanoのSDKをインストールしたら、ターミナルを立ち上げ

```
$sudo apt install nodejs npm
$sudo apt install python3-pip
$sudo pip3 install jupyter jupyterlab
```

参考リンク　Jupter lab拡張機能
https://jupyterlab.readthedocs.io/en/stable/user/extensions.html


jupyter labのインストールでエラーが出た場合は、次を実行

```
$sudo apt-get install build-essential libssl-dev libffi-dev python-dev
```

python setup.py.egg_info failed with error code 1のエラーが出た場合は、Pipのバージョンを確認します。

```
$pip3 list
```

pipのバージョンが古い場合は、最新のpipにアップデートします。

```
$pip3 install --upgrade pip
```

JupyterNotebookの設定ファイルを生成する

```
$jupyter notebook --generate-config
```

設定ファイルの編集をする

```
$sudo vi /home/takeo/.jupyter/jupyter_notebook_config.py

Writing default config to: /home/takeo/.jupyter/jupyter_notebook_config.py
```

/を押して

```
/c.NotebookApp.allow_origin
```

として検索します。

自己サーバーにアクセス許可設定します。


```
######c.NotebookApp.allow_origin = ''
```

コメントアウト(#)は削除し

```
c.NotebookApp.allow_origin = '*'
```

に変更し、同じ様にc.NotebookApp.ipを検索します。

```
#####c.NotebookApp.ip = 'localhost'
```

コメントアウト#をはずしすべてのIPをリッスン

```
c.NotebookApp.ip = '0.0.0.0'
```

に変更します。

ローカルでブラウザを立ち上げないようにします。TrueからFalseに変更。

```
c.NotebookApp.open_browser = False
```

:xを実行しviを終了します。

jupyterのパスワードを設定いたします。設定ファイルにハッシュが入ります。

```
$ jupyter notebook password

[NotebookPasswordApp] Wrote hashed password to /home/takeo/.jupyter/jupyter_notebook_config.json
```

jupyterを起動します。

```
$jupyter lab
```

外部デバイスからブラウザの検索バーにipアドレス:8888でアクセス可能に

```
#jupyterのバージョン(raspberrypi)
$jupyter --version
jupyter core     : 4.6.3
jupyter-notebook : 6.0.3
qtconsole        : 4.3.1
ipython          : not installed
ipykernel        : 4.9.0
jupyter client   : 6.1.6
jupyter lab      : 2.2.0
nbconvert        : 5.6.1
ipywidgets       : not installed
nbformat         : 5.0.7
traitlets        : 4.3.2
```

ipythonがインストールされていない場合は、
ipythonをインストールする。

```
sudo pip3 install ipython==7.9.0
```

※インストールするときは権限に注意しよう。

```
$chromium-browser --no-sandbox
```

jupyter labのバージョンによっては、パスワードトークンを設定してください。

参考

```
https://jupyter-notebook.readthedocs.io/en/latest/config.html
https://jupyter-server.readthedocs.io/en/latest/operators/public-server.html
```
tclkitでtclの実行ファイルを作る

Tclkitというのを作れば、Tcltkのruntimeごとまとめた実行ファイルを作れる。
Tcl/tkで作ったアプリを人に渡す時に便利。

複数の.tclファイルをまとめることも可能らしい。

# 必要なもの
## tclkit 
http://www.tcl3d.org/html/appTclkits.html
からビルドされた物がダウンロードできる。

## sdx
https://chiselapp.com/user/aspect/repository/sdx/index
sdx-20110317.kitという、9年前のビルドが落ちている。

## runtime
配布する環境に合わせて、取得してくる。
http://www.tcl3d.org/html/appTclkits.html

# ラップの仕方

hello/main.tclに下記を用意。

```hello/main.tcl
package require Tk
tk_messageBox -message "Hello World"
```

以下でラップする。
例えば、OSX用は、

```
tclkit sdx.kit wrap hello -runtime tclkit-tk-Darwin-8.6
```

./helloができていると思うので、ダブルクリックで実行できる。

windows用は

```
tclkit sdx.kit wrap hello.exe -runtime tclkit-tk-win64-86.exe 
```
で、hello.exeができる。


hello/にテキストを置いて、まとめてラップすることもできる。



#参考
http://nyaocat.hatenablog.jp/entry/2013/11/26/211218
http://reddog.s35.xrea.com/wiki/Starkit%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9%E3%83%A1%E3%83%A2.html
高専キャリアとマイクロソフトがコラボしたクラウドAI開発講座進捗報告[4]

# クラウドAI開発講座進捗報告- 4週目

[これ](https://qiita.com/teruto725/items/222b011a8dd63bf76158)の続き
前回までpythonで作業を進めていたが、なんとデプロイができない。何回トライしてもメンターさんに助けてもらってもできない．．．なのであきらめてC#で一から始める。
## やったこと
### 1. C#の環境構築
まずC#の環境を作っていく。
とりあえずローカル環境構築からサーバへのデプロイまで無事完了！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573723/71eecdff-62ee-d697-164a-d666bc76ea0b.png)

C#のコードを見ているとやはりHandlerを継承してメソッドをオーバーロードする形で実装がされている。基本がJavaに似てるので全然かけそう。

### 2. Cognitive Serviceを動かす。
実際に作りたいbotはもう大体固まっているので、それに必要な環境をどんどん整えていく。
#### 2.1 TextAnalyseを使ってみる。
C#でCognitive Serviceを使えるようにする。とりあえずTextAnalyseのサンプルコード実行。
問題なく成功した。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573723/58fc19f4-fbb1-f126-19ee-011d4f6f0294.png)

#### 2.2 Computer Visionを動かす。
次にComputerVisionのサンプルコード実行。
文字起こしが正しくできていることがわかる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573723/586f1ee3-9cb7-bb7b-c6b4-a0ce10315041.png)

#### 2.3 Translatorを動かす。
次にTranslatorのサンプルコード実行。
うまく動いていることがわかる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573723/5da6fff2-41ac-dbb0-9c65-b964a3273f86.png)


### 3. 組み合わせる
とりあえずCVをボットに組み込む。
画像を受け取ったときに文字を読み取って返信するようにする。
画像の取得方法がわからなくてメンターさんに助けてもらった。本当にありがたい。
以下のように動作が確認できた。
ただ、日本語と英語同時は無理っぽいが作りたいbotに影響はないので大丈夫。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573723/293ce2f4-12eb-c0f0-3379-c1f370a43002.png)

### 4. 中間発表に参加した。
いろんな人の話を聞けて面白かった！
自分は自分のプログラムの構成について話した。
下の感じ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573723/da858f9a-77ba-9906-e73a-b65661b98bc8.png)




## 感想
　困ったときに聞ける人がいるってすごいいい環境だなと思った。
　これだけでも今回参加した価値があると思う。
　今回作りたいbotに必要な要素はとりあえずすべて確認できた。
　ここからはプログラムをひたすら書くだけ。
  
## 来週の予定
ひたすらコーディング。
Teamsにアップできるかどうかだけチェックしとく
レビュー技法

応用情報技術者令和元年秋期 午前問48

作業成果物の作成者以外の参加者がモデレータとして主導すること，及び公式な記録，分析を行うことが特徴のレビュー技法はどれか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/851c0062-03bf-ee14-70eb-87ea92ff02d8.png)


**インスペクション**(Inspection)は、事前に役割を決められた参加者が責任のある第三者(モデレータ)の下で成果物を確認する、最も公式なレビュー技法です。通常3人から6人が参加して実施します。他のレビュー法との違いは、参加者の役割が明確になっていること、チェックリストなど形式的な文書に基づいて実施すること、正式な記録を強調することです。

**パスアラウンド**  【 pass around 】  回覧レビューとは、成果物を他者が精査・講評するレビューの手法の一つで、成果物を評価者（レビューア）に個別に送って回答してもらう方式。



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/290fb78b-8fe7-d4b6-efeb-90b7ca8ab39a.png)


From　https://www.ap-siken.com/kakomon/24_haru/q47.html
https://www.ap-siken.com/kakomon/28_haru/q49.html
python3でGTFS Realtimeを読み込む

# python3 GTFS Realtime を読み込む

Googleのpython用の[サンプルコード](https://developers.google.cn/transit/gtfs-realtime/examples/python-sample?hl=ja)が手元のpython3の環境で動かなかったので、urllibの部分をアップデートしたものです。

## 環境構築
GTFS Realtimeはプロトコルバッファ形式でデシリアライズされたバイナリデータです。
プロトコルバッファを何も知らずにデータを展開できるライブラリがあります。
コマンドプロンプトでご自身の環境に合わせて導入してください。
（anacondaにcondaコマンドで入れる方法があれば知りたいです。）

```shell
# Using easy_install
easy_install --upgrade gtfs-realtime-bindings

# Using pip
pip install --upgrade gtfs-realtime-bindings
```

## ソースコード

```python3:read_gtfs_rt.py3
from google.transit import gtfs_realtime_pb2
import urllib.request, urllib.error
feed = gtfs_realtime_pb2.FeedMessage()
with urllib.request.urlopen('URL OF YOUR GTFS-REALTIME SOURCE GOES HERE') as res:
    feed.ParseFromString(res.read())
    print(feed) #デバッグ用出力
    #以下大幅略
```

## おまけ
宇野バスさんのデータを部分的にCSV風の出力をする
公開元： http://www3.unobus.co.jp/opendata/
 > 注意：Google乗換案内に使われているものと同じデータです。過剰な頻度のアクセスはしないでね。

```python3:read_gtfs_rt_uno_bus.py3
from google.transit import gtfs_realtime_pb2
import urllib.request, urllib.error
url ='http://www3.unobus.co.jp/GTFS/GTFS_RT-VP.bin'
feed = gtfs_realtime_pb2.FeedMessage()
with urllib.request.urlopen(url) as res:
    feed.ParseFromString(res.read())
    #print(feed)
    for entity in feed.entity:
        print(
              entity.id,                         #車両ID
              entity.vehicle.vehicle.id,         #車両ナンバー
              entity.vehicle.trip.trip_id,       #路線番号？
              entity.vehicle.timestamp,          #車両時刻
              entity.vehicle.position.longitude, #車両緯度
              entity.vehicle.position.latitude,  #車両経度
              entity.vehicle.occupancy_status,   #混雑度
              sep=',')
```
Pythonのunittest.Mockでスタブを作って単体テストする

# 概要
- 自作クラスに対して、`unittest.mock.MagicMock`を使ってモックを作成してテストする。

# サンプルコード(挨拶を返すプログラムとテストコード)

## (テストしたいファイル。ランダムで挨拶の語を選んで、挨拶文を返す)

```python

# greeting.py
import random

class Greeting():
    def greeting_phrase(self, name):
        grt = self.greeting_word()
        result = f'{grt}! {name}.'
        print(result)
        return result

    def greeting_word(self):
        grt = ['Hello', 'Bonjour', 'Konnichiwa']
        i = random.randint(0, len(grt) - 1)
        return grt[i]


if __name__ == '__main__':
    g = Greeting()
    g.greeting_phrase('tanaka')
    # 「Hello! tanaka.」 「Bonjour! tanaka.」 「Konnichiwa! tanaka.」 のどれかが返る
```

## (テストコード。unittest.mock.MagicMockを使ってモックを作成してテストする)

```python

# test_greeting.py

from unittest import TestCase
from unittest.mock import patch, MagicMock
from greeting import Greeting

class TestGreeting(TestCase):
    def test_greeting_phrase(self):
        grt_mock = MagicMock()
        grt_mock.return_value = 'Hi'    # 挨拶の語を「Hi」に置き換える
        
        with patch('greeting.Greeting.greeting_word', grt_mock):
            g = Greeting()
            actual = 'Hi! yamada.'
            self.assertEqual(g.greeting_phrase('yamada'), actual)
```


# 補足

- 自作クラスのメソッドを置き換える場合、単にメソッド名だけでなく、長い名前でフルで指定する。
    - 別フォルダ内にある.pyファイルに書かれているクラスをテストする場合に注意が必要。
- クラス名など命名規則は`PEP8`をよく読む。

# 参考
- 公式ドキュメントの[unittest.mock.MagicMock](https://docs.python.org/ja/3/library/unittest.mock.html#unittest.mock.MagicMock)
- [PEP8](https://pep8-ja.readthedocs.io/ja/latest/)
システム及びソフトウェア製品の品質特性の一つである"機能適合性"の説明

応用情報技術者令和元年秋期 午前問47


JIS X 25010:2013(システム及びソフトウェア製品の品質要求及び評価(SQuaRE)－システム及びソフトウェア品質モデル)で規定されたシステム及びソフトウェア製品の品質特性の一つである"機能適合性"の説明はどれか。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/3417b419-8f2b-428d-c098-c89355357de9.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/f54bd4b4-a65a-0011-7f64-859c4c0291e8.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/79b23192-b302-1a50-8e31-ff37323c61ed.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/2ba658ee-fd84-5155-6b63-de9b963e9b91.png)


From　https://www.ap-siken.com/kakomon/01_aki/q47.html
circle ci 導入(CLIコマンドで楽しよう)

自分用メモとして

#いちいちgithubへpushして、circle ci　のブラウザをチェックしてって面倒

#circle ci CLI コマンドをインストールすると、pushしなくて良いよって話

[CLIインストール方法リンク](https://circleci.com/docs/ja/2.0/local-cli/)

```text:circleci-CLIをインストール[macかlinuxの場合]
curl -fLSs https://circle.ci/cli | bash
```

```text:[Homebrewの場合]
brew install circleci
```

[APIトークン設定する](https://app.circleci.com/settings/user/tokens)

```text:config設定を開いて、APIトークンコードを入力してエンター
circleci setup
```

```text:ローカルで.circleciディレクトリがある所に移動。
cd develop/port/sss/app
```

```text:config.ymlに記述間違いがないか確認
circleci config validate
```

```text:config.ymlをローカルでビルド。無料ビルド時間を消費しない
circleci build
```

[参考になったQiita](https://qiita.com/manabusakai/items/fc872cb3cce0fc3f39bf)

[参考になったサイト](https://snowsystem.net/cloud/circleci/circleci-error-1/)
JavaでJsonをPOSTする〜HttpURLConnection〜


# 概要
JavaでJSONをHTTP POSTする方法をまとめた記事です

必要最低限の書き方のみまとめています。

#前提

簡略化のため、JSON形式の文字列をあらかじめ用意しました。
JSONをjavaに変換する方法などは他の記事を参考にして下さい。

呼び出し元がこのクラスをインスタンス化し、execute()メソッドを呼び出すことを想定しています。

# 手順
手順は以下の通りです
1.HttpURLConnectionで接続するための設定をする
2.接続を確立する
3.リクエストボディに書き込みを行う
4.レスポンスを受け取る
5.Input/OutputStreamを閉じる

# JavaでHTTP通信する方法
```java:Sample.java

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.HttpURLConnection;
import java.net.URL;


public class Sample {

    //URL例
	String  apiURL ="https://XXX.YY-ZZZZ.com/WWW/";

	//JSON文字列例
	String json =
		"{" +
			" \"searchCondition\": {" +
				" \"conditions\": [" +
					"{" +
						" \"conditionType\": \"Name\","+
						" \"Value\": 200," +
					" }"+
				"]" +
			"}," +
			"\"outputMethod\": \"split\","+
			"\"zipFileName\": \"DDD.zip\"" +
		"}";

	public String execute() throws IOException{

		//1.接続するための設定をする

		// URL に対して openConnection メソッドを呼び出すし、接続オブジェクトを生成
		URL url = new URL(apiURL);
		HttpURLConnection conn = (HttpURLConnection) url.openConnection();

		// HttpURLConnectionの各種設定
		//HTTPのメソッドをPOSTに設定
		conn.setRequestMethod("POST");
		//リクエストボディへの書き込みを許可
		conn.setDoInput(true);
		//レスポンスボディの取得を許可
		conn.setDoOutput(true);
		//リクエスト形式をJsonに指定
		conn.setRequestProperty("Content-Type", "application/json; charset=utf-8");

		// 2.接続を確立する
		conn.connect();

		// 3.リクエスとボディに書き込みを行う
		//HttpURLConnectionからOutputStreamを取得し、json文字列を書き込む
		PrintStream ps = new PrintStream(conn.getOutputStream());
		ps.print(json);
		ps.close();


		// 4.レスポンスを受け取る
		//正常終了時はHttpStatusCode 200が返ってくる
		if (conn.getResponseCode() != 200) {
			//エラー処理
		}

		//HttpURLConnectionからInputStreamを取得し、読み出す
		BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));

		StringBuilder sb = new StringBuilder();
		String line;

		while ((line = br.readLine()) != null) {
			sb.append(line);
		}
		
		// 5.InputStreamを閉じる
		br.close();

		//結果は呼び出し元に返しておく
		return sb.toString();
	}
}
```
# 参考

HtppURLConnectionの設定には以下のようなメソッドを使用します。詳しくは公式リファレンスなどを参考にして下さい
セットアップパラメータを修正するには次のメソッドを使用します。
・setAllowUserInteraction
・setDoInput
・setDoOutput
・setIfModifiedSince
・setUseCaches
一般要求プロパティーを修正するには次のメソッドを使用します。
・setRequestProperty
図解で、AWS新サービスでローコード・アプリ開発を理解する。Honeycode

# 図解で、AWS新サービスでのアプリ開発を理解する（簡易アンケート回答＆集計アプリ）AWS Honeycode
パソコンもしくはスマホでアンケートに回答し、AWS Workbook（表データ）を経由して、アンケート結果を集計して表示するアプリのテンプレートが提供しているので、日本語版へと改造しながらアプリ制作過程を理解しようと思う。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189936/2418cefc-a583-6e02-a414-d5db8fa5bdc7.png)

## AWSが提供するテンプレート
AWS Honeycode で新しいアプリを作るときは、最初に[Create workbook]を実行し、(1) CSVファイルから作成する、(2) テンプレートから作成する、(3) イチから自分で作成する、の３つから開発方法を選ぶ。ここではテンプレート[Simple Survey]から作成してみた。

## 画面レイアウトの設計（モバイル用）を日本語版に改造したもの
画面(Screen)が３つ用意されている。プログラム上での画面の名前は [Home] [Survey] [Thanks] としている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189936/31f510b5-c064-b470-2b5e-ba5f757d8ef0.png)

## 画面レイアウトの設計（パソコン用）を日本語版に改造したもの
レイアウトが横に間延びするものの、モバイル用を作るとパソコン用も同時に作成される（というか兼ねている）。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189936/3c5122d9-9f64-1da0-7fc9-987f5c625338.png)

## データベースとなるワークシート（workbook）の確認
テーブルは全部で４個用意されていた。下図の通り (1) アンケート選択肢の表　(2) 回答されたアンケートの一覧　(3) アンケート結果を集計する計算表　(4) 使ってないけどREADME の４つ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189936/f1411117-a7fa-e080-ea4e-8e6924164301.png)


## ワークシートのテーブルとテーブルのリレーショナル設定
Excelでいうところの「セルに入力する選択肢をリストで表示する」設定。アンケートの質問「アプリを推奨しますか？」に対して「★」「★★」「★★★」から選べるようにする。画面のプロパティで設定するので下図に手順を記載する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189936/9f57199b-aa33-97cd-feb6-f208837dc58d.png)

## 画面に表示される部品を使ってプログラミング（automation）その１
［回答する］ボタンが押されたときの自動処理を追加する。ワークシートに新しいレコードを追加して、アンケート回答する人の名前をカラム名「名前」にセットし、アンケート入力画面に遷移する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189936/51877b1b-7460-6663-2501-353098c4ab39.png)

## 編集画面を設定する（Screenのレイアウト）

### レイアウト
アンケート入力画面で表示される質問と回答欄を設定する。Screenには大きく３つのブロックがある [Header] [List] [Global Navigation] 。[Header]部分がアプリ名称や現在の操作タイトル（見出し）などに使えて、[Global Navigation] がアプリ内で操作できる（遷移できる）メニューに便利、[List]部分がワークシートのデータを操作する場所になる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189936/4e773f23-6805-0bbe-d405-615a846d2fec.png)

### ワークシートとのデータ連動
データ入力フィールド[Input field]などの入力UIコントロールにあるプロパティを操作して、その入力フィールドがワークシートのどこに連動するのかを設定する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189936/d3cb5094-feed-5dfa-86c1-62ac6a1f1630.png)

## 画面に表示される部品を使ってプログラミング（automation）その２
アンケート入力が終わったら［アンケートを提出する］ボタンの自動処理を追加する。現在、編集しているレコードの日付カラムに最新の日付時刻を登録して、次の[Thanks]画面へ遷移する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189936/81d9aabe-8984-97fb-8ac5-20ea848a16c3.png)

## まとめ
完成したアプリの動作確認。モバイル（iPhone）でアンケートを回答できる。アンケート集計結果を表示できる。AWS Honeycode は2020年7月時点でプレビュー提供（オレゴンリージョンのみ）されています。AWS Honeycode コミュニティではSSOによるログインなど積極的に意見収集しており、今後、UIパーツや自動処理Automationによる接続先コネクタなどがどんどん発表されていき、やがて MS PowerApps や Google App Maker のような強力なサービスに育っていくものと予想されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189936/218dbc9a-a539-2091-5d70-e68f13842661.png)
ペトリネット(Petri Net)の説明

応用情報技術者令和元年秋期 午前問46

ソフトウェアの要求分析や設計に利用されるモデルに関する記述のうち，ペトリネットの説明として，適切なものはどれか。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/d686007e-6a40-d0e7-fc06-e49a118e6774.png)


**ペトリネット(Petri Net)**は、プレース、トランジション、トークンの3つの要素を使用した有効グラフでシステムの動作を記述する図法です。並行する処理同士の制御の流れや同期のタイミングを分析・設計するために用いられます。トランジションは入力プレースと出力プレースに連結され、プレースがトークンをもつとき条件を満たしていることを表します。入力プレースのトークンが所定数に達するとトランジションが発火し、トークンは入力プレースから出力プレースに移動します。このようにペトリネットでは、トークンの流れや処理の連鎖によってシステムの動作を分析します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/8c17f608-6b9a-95b6-5266-87bec0a4c68f.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/57e68e67-a8d9-5544-7513-316813a409ae.png)


From：https://www.ap-siken.com/kakomon/01_aki/q46.html
＜スプレ＞指定チャンネルの投稿動画一覧を取得する(GAS)

あるチャンネルが投稿した動画を全て取得する方法を残します。

     'https://www.googleapis.com/youtube/v3/search?part=snippet&channelId=' + channel_ID + '&key=' + API_KEY;

コードの解説
--------------------

分解すると以下のようになります。

https://www.googleapis.com/youtube/v3/
→Youtube Data APIを使って取得する

search
→サーチという方法で取得

*Youtubeの公式リファレンスはこちら
https://developers.google.com/youtube/v3/docs/search?hl=ja

?part=snippet
→snippetというオブジェクトで取得

*Youtubeの公式リファレンスより抜粋
| snippet | 
| snippet オブジェクトには、検索結果の基本的な情報（タイトル、説明など）が格納されます。 |

&channelId=' + channel_ID
→検索したいチャンネルのチャンネルIDを挿入

'&key=' + API_KEY
→自分のAPIKEYを挿入