OmniAICreator/Qiita-1.07M huggingface dataset:
Logitech G29 SteeringWheel PCでUnityできるまで

#Logitech G29 SteeringWheel PCでUnityできるまで

ハンドルコントローラの動作環境とUnityでサンプル動作のメモ

###たぶんドライバーインストール(Win 64bit)

ダウンロード先
https://support.logi.com/hc/ja/articles/360025298053-Logitech-Gaming-Software

対象exe
LGS_9.02.65_x64_Logicool.exe

![NoName_2019-10-24_10-36-38_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48015/77f083bc-2b22-13db-31ef-d8abdf8b2f6d.png)


###SDKダウンロード

Logitech Gaming SDK
https://assetstore.unity.com/packages/tools/integration/logitech-gaming-sdk-6630
![NoName_2019-10-24_15-18-7_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48015/f751f765-ef0f-5434-16cb-8abc1cfc211e.png)





###UnityでSample起動でエラー
どうやらdllが壊れているらしいかもなので
https://gaming.logicool.co.jp/ja-jp/partnerdeveloperlab/sdk-resource-list/steering-wheel-sdk.html
からダウンロードしたdllで上書きしたら動作した。

```
正常なdll
LogitechSteeringWheelSDK_8.75.30\Lib\GameEnginesWrapper\x64
LogitechSteeringWheelEnginesWrapper.dll

上書き対象
Assets\Logitech SDK
LogitechSteeringWheelEnginesWrapper.dll
```

###UnityでC#でのハンドル接続

キーボードでハンドルの重さ？など変えたりできるみたいです。
オフロード設定でガタガタなりました。

![NoName_2019-10-24_10-55-31_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48015/85cbb151-2355-3903-aae1-ebb699f5f834.png)


###新しいPCで動作しなかったを解消

VisualStudio 2019　Communityをインストールで解消したメモ




##参考サイト

ステアリングホイールSDK
https://gaming.logicool.co.jp/ja-jp/partnerdeveloperlab/sdk-resource-list/steering-wheel-sdk.html

Logitech Gaming SDK
https://assetstore.unity.com/packages/tools/integration/logitech-gaming-sdk-6630

Logitech Gaming Software
https://support.logi.com/hc/ja/articles/360025298053-Logitech-Gaming-Software

LogicoolSDKを使ったハンドル入力
https://shin-go.hatenablog.com/entry/logitech

unityでLogicoolSDKを使ってLogitech G29 Steering Wheel（ハンコン）を取得したかった話
https://qiita.com/shi_k_7/items/8b2d2e99b4c6d9bc77d4
UTCとJST

UTC 協定世界時　　UTC + 00:00  
JST 日本標準時   UTC + 09:00

例えば


https://www.jisakeisan.com/?t1=utc&t2=jst! 


[スクリーンショット 2019-10-24 15.08.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278640/1864f1e7-bcb6-b863-7dcf-d68215f2265b.png)



SQL小技集
https://qiita.com/ool/items/75da830e7373138c8125


----------------------------------------------------------
SQL小技集
https://qiita.com/ool/items/75da830e7373138c8125
UTCとJST
https://qiita.com/ool/items/6be9cc290c8ad9e0f5bc
今流行りの量子コンピューター
[量子コンピューター]Qisikitでアダマールゲートを実装する
https://qiita.com/ool/items/1a5041edddc11b14efc0
[Qiskitのアカウント認証の仕方]Qiskit IBMQ プロバイダー
https://qiita.com/ool/items/e80c1266cda68984a103
Qiskitの使い方
https://qiita.com/ool/items/2227d2d515caa5087752
[量子コンピューター]Qiskit Tutorials
https://qiita.com/ool/items/2a5038df1471635d442c
BitriseのOrganaizationでAppleとの連携が表示されてなくて超絶ハマった話

## やりたいこと
BitriseではApple Developer Accountと連携することで、iOSのProvisioning Profileの管理を簡単にできる！
https://devcenter.bitrise.io/jp/getting-started/connecting-apple-dev-account/

年に1回更新が発生して面倒な作業ですが、Bitriseの神対応によって楽に実施ができる！
すごい！これはやるしかない！さぁやるぞ！

## 早速つまづいた...。
あれ...？Organaizationのページだと連携のパネルが表示されていないぞ？
![スクリーンショット 2019-10-24 14.41.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144029/e2e26eed-9d94-29d6-cde6-eed97acdc543.png)

個人のページだと表示されているぞ...？
![スクリーンショット 2019-10-24 14.41.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144029/f6a1d931-b67b-399b-6aa0-759b0a5755c5.png)

## 解決策？
そもそも仕様で、Organaizationに所属しているいずれかの人の認証情報を使用するようです。
個人のアカウントがApple Developer Accountと連携していれば、プロジェクトのTeamタブから選択できるようです！

![スクリーンショット 2019-10-24 14.55.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144029/c58db6cd-eaee-a3ee-88ae-5fb589490d28.png)

確かに表示されて選択できるようになってる！
![名称未設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144029/28fca563-48d8-23b9-cb45-82ec62286c3e.png)

Organaizationはチームに所属しているユーザの情報を利用できるんですね！
個人開発している人とかは迂闊にアカウント登録すると、Organaizationに入った時にややこしくなりそうです！
みなさん気をつけましょう！
[Swift 5] スクロールに応じてページング対応APIから1ページずつコンテンツを取得する方法

Requestパラメータでpageを指定すれば指定したページの情報を取得できるようなAPIがあるとして、
そのAPIから取得したコンテンツをアプリでページングして表示する実装の備忘録です。

## 読み込み状態を定義
```swift
/// APIの読み込み状況
enum APILoadingStatus {
    case initial
    case fetching
    case loadMore
    case full
    case error
}
```

### Viewでの実装

```swift
final class ViewController: UIViewController {

    /// APIの最終取得Page
    private var pageOfLastFetched = 1
    /// APIの読み込み状況
    private var loadStatus: APILoadingStatus = .initial

}
```
インクリメントして使うPage数と、読み込み状態を保持するプロパティを宣言します。

```swift
    // APIを使用してコンテンツを取得する
    func fetchContents() {
        // 読み込み中またはもう次に記事がない場合にはapiを叩かない
        if loadStatus == .fetching || loadStatus == .full {
            return
        }
        // loadStatusを読み込み中に変更
        loadStatus = .fetching
      
        // 記事一覧を取得するAPIを叩く
        repository.getContents(page: pageOfLastFetched) { [weak self] result in
                                 
            guard let self = self else {
                return
            }
                                                                
            switch result {
            case .success(let contents):
                if contents.isEmpty {
                    // 結果が空だった＝もう続きの記事がないのでloadStatusをfullにする
                    self.loadStatus = .full
                    return
                }
                self.pageOfLastFetched.increment()  // +1
                // 記事取得が終わった段階でloadStatusをloadMoreにする
                self.loadStatus = .loadMore
              
            case .failure(let error):
                // loadStatusをエラーにする
                self.loadStatus = .error
                // TODO: Error handling.
                print(error)
            }
        }
    }
```
APIをコールするメソッドを定義します。
成功したらPage数をインクリメントして、最後までFetchしたら読み込み状態を `.full` にして以後APIをコールしないようにします。

```swift
    // MARK: - UIScrollViewDelegate
    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        // 一定割合スクロールすると次のPageを読み込む
        let currentOffsetY = scrollView.contentOffset.y
        let maximumOffset = scrollView.contentSize.height - scrollView.frame.height
        let distanceToBottom = maximumOffset - currentOffsetY
        
        // 最下部まで500pxを切ったら次のページを取得する
        if distanceToBottom < 500 {
            fetchContents()
        }
    }
```
ページングするタイミングですが、今回は画面最下部500pxを切るところまでスクロールされたらAPIでFecthするようにしました。
G-SuiteまたはCloud Ideneityにサブドメインを追加する

##はじめに
GCPの利用を開始する際、Gmailアカウントを使って利用開始することもできますが、Enterprise利用では、G-SuiteかCloud Identityを使ってユーザアカウントの作成などを管理することが推奨されます。
G-SuiteかCloud Identityを使うとユーザー、アクセス、アプリ、デバイス ポリシーの管理が集中的に行うことができ、よりセキュアにガバナンスを効かせた運用が可能となります。

G-SuiteかCloud Identityは、ドメインの準備が必須ですが自社ユーザと協力会社の方のユーザで使用するドメインを分けたいケースもあるかと思います。

分け方としては、組織にサブドメインや別のドメインを追加する構成やそもそも組織を分けた構成が可能です。

今回は、サブドメインを追加する構成を試してみます。

##前提

DNSは、GCPのCloud DNSを使用します。
お名前.comなどでドメインを取得しており、G-Suite、CloudIdentityがセットアップされていること。
ドメインを取得したサービスでネームサーバをGoogleに変更する。

```
ns-cloud-e1.googledomains.com.
ns-cloud-e2.googledomains.com.
ns-cloud-e3.googledomains.com.
ns-cloud-e4.googledomains.com.
```

TXTレコードにverificationコードが登録されているおり、Verifyさられていること。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78184/abfaaf30-6327-a200-7586-0632ebb9b979.png)



##手順
Admin ConsoleでDomainsをクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78184/a253e0fc-19c7-e179-fe24-c06772ec5204.png)

Managed Domainをクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78184/76387097-a7aa-3cd3-9b47-0f70d836e363.png)

ADD A DOMAIN OR A DOMAIN ALIASをクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78184/23db6ef1-feff-6867-8c69-909b004dd9e5.png)

Add another domainをクリックし、サブドメインを入力する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78184/829c4a73-3d67-69a6-64b6-dded4834ecb9.png)

Cloud DNSにサブドメインをCNAMEレコードとして定義する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78184/737d24c3-2391-0704-d9c7-9d0a7da082ce.png)

digでサブドメインのTXTレコードが引けること

```
$ dig vender.uimoz.com TXT 

; <<>> DiG 9.10.6 <<>> vender.<domain>.com TXT
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 19310
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;vender.uimoz.com.		IN	TXT

;; ANSWER SECTION:
vender.<domain>.com.	299	IN	CNAME	<doimain>.com.
uimoz.com.		299	IN	TXT	"google-site-verification=********"

;; Query time: 46 msec
;; SERVER: 2001:4860:4860::8844#53(2001:4860:4860::8844)
;; WHEN: Thu Oct 24 13:31:47 JST 2019
;; MSG SIZE  rcvd: 140
```

Verifyをクリックすると、サブドメインが登録できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78184/ef57e2f8-2b67-7d14-5352-2ed28c108442.png)

ユーザアカウントを作成時にサブドメインが選択できることを確認する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78184/7c3c6bf1-c43d-b608-5294-33cf07db2c3a.png)

##投稿内容は私個人の意見であり、所属企業・部門見解を代表するものではありません。
島田大祭

[島田大祭　始める経緯](#島田大祭始める経緯)
[島田大祭　作業内容](#島田大祭作業内容)
[島田大祭　感想](#島田大祭感想)
[今回作成したコード](#今回作成したコード)
#島田大祭　始める経緯
島田市から島田大祭の位置情報アプリの制作の手伝いを依頼され、<b>BaaS班</b>を結成しました。

<b>メンバー：村山　櫻井　青島</b>

#島田大祭　作業内容
###位置情報アプリの内容
<b>Google App Engine</b>を使用し、マップに屋台の位置情報を表示するアプリの制作を手伝いました。
###当日の仕事内容
位置情報アプリで起こった不具合への対応。
#島田大祭　感想
###大変だったこと
位置情報アプリが停止してしまう不具合が発生した際、屋台に装備してあるスマホの確認に行くのですが、屋台の位置がわからなく、屋台を見つけても誰がスマホを所持しているのかわからなかったため、不具合の対応に時間がかかってしまいました。
###良かったこと
今回の島田大祭ではお祭りの出演者ではなく、お祭りを円滑に進めるための裏方の仕事に携わらせいていただきました。ふつうでは経験することのできないことが地域に貢献する形で実現したので、島田大祭のお手伝いができよかったです。
#今回作成したコード
https://github.com/shimada-shimasho/shimadataisaiApps/tree/master/tourist
今回この位置情報サービスを提供するうえで作成したコードです。GitHubにあるので、参考にしてみてください。
【Java 】サーブレット（tomcat）＆MySQL＆Java  でコネクションプールを使用して接続してみた

# 関連記事
・[【Java】JDBCをインストールして、servlet + MySQL で接続してみた。( DAO / Bean を使用バージョンあり)](https://qiita.com/namari/items/f1dfeb2c3b8bcca5ebc5)

# 参考サイト
※ めちゃくちゃ参考になった！！！
・[Java で MySQL に 接続する 方法](https://garafu.blogspot.com/2016/05/how-to-connect-mysql.html#con-svlt1)

# JDBC ドライバ導入

1. 公式サイトから``mysql-connector-java-8.0.18.zip``を[ダウンロード](https://dev.mysql.com/downloads/connector/j/)
2. 解凍するして``mysql-connector-java-5.1.48-bin.jar``を取り出す
3. ``/WebContent/WEB-INF/lib/mysql-connector-java-5.1.48-bin.jar``に入れる

# context.xml を作成する
``/WebContent/META-INF/context.xml``に作成する

```ruby:context.xml
<?xml version="1.0" encoding="UTF-8" ?>
<Context>
	<Resource name = "jdbc/book"
              auth = "Container"
              type = "javax.sql.DataSource"
              driverClassName = "com.mysql.jdbc.Driver"
              url      = "jdbc:mysql://localhost/book"
              username = "namari"
              password = "password">
	</Resource>
</Context>
```
# サーブレット
``/Sample/webapps/book/WEB-INF/src/chapter14/All.java``に作成する

```ruby:All.java
package chapter14;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.*;

import javax.naming.InitialContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.sql.*;

/**
 * Servlet implementation class All
 */
@WebServlet("/All")
public class All extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @see HttpServlet#HttpServlet()
	 */
	public All() {
		super();
		// TODO Auto-generated constructor stub
	}

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		PrintWriter out = response.getWriter();

		try {
			// コネクション取得
			InitialContext ic = new InitialContext();
			DataSource ds = (DataSource) ic.lookup("java:/comp/env/jdbc/book");
			Connection con = ds.getConnection();

			// SQL文送信
			PreparedStatement st = con.prepareStatement("select * from product");
			// 実行＆結果受け取り
			ResultSet rs = st.executeQuery();

			// データの表示
			while (rs.next()) {
				out.println(rs.getInt("id") + ":" + rs.getString("name") + ":" + rs.getInt("price"));
			}

			// データベース切断
			st.close();
			con.close();

		} catch (Exception e) {
			// 接続・SQL文エラー
			e.printStackTrace(out);

		} // try
	}

}
```
Jython でモジュールのインストールの方法 (SikuliX 使う)

# まず pip インストール
```java -jar (Join-Path $Env:APPDATA Sikulix\Extensions\jython-standalone-2.7.1.jar) -m ensurepip```
すると、
```(Join-Path $Env:APPDATA Sikulix\Extensions\bin)```
にものが置かれる。

# somemodule をインストールしたいとき。
もし、behind proxyの場合、proxyの環境変数を実行しておく。
```
$Env:http_proxy=...
$Env:https_proxy=...
```

そして目的のモジュール
```java -jar (Join-Path $Env:APPDATA Sikulix\Extensions\jython-standalone-2.7.1.jar) -m pip install somemodule```

# 例: WebSocket-Client インストール
WebSocket-Client 使いたかったので、その入れ方。

pip install だと、python3用しか対応してないと https://github.com/websocket-client/websocket-client に書いてあったので、
```python setup.py install``` 相当のことを行う。

```
git clone https://github.com/websocket-client/websocket-client
cd websocket-client\websocket
java -jar (Join-Path $ENV:APPDATA Sikulix\Extensions\jython-standalone-2.7.1.jar) setup.py install
```
Sikulix 2.0.0 動かすのに手間どったのでメモ

http://sikulix.com/ にアクセスしたら2.0.0になっていた。
Download に行って、 sikulix.jar とjython-standalone-2.7.1.jar を取得して同じディレクトリに置いておく。
そこで
```java -jar sikulix.jar```  
を実行すると、SikulixIDEが立ち上がる。javaはあらかじめ入れておく。
以前のと違ってツールボックスがないように感じる。htmlは生成されなくなった。あとの使い心地は大体同じ。
new feature は https://sikulix-2014.readthedocs.io/en/latest/index.html 見る。

同じ所に置いてあった jython-standalone-2.7.1.jar は
```%APPDATA%\Sikulix\Extensions\jython-standalone-2.7.1.jar```
に移動されている。

あと、以前のバージョン使っていたならば、
```%APPDATA%\Sikulix\Lib を消しておく。```
モジュール使うときに古いの読んで痛い目に合う。
スペルミスを防ぎたい！

##この記事を書くきっかけ
研修でサイト模写をしているときにスペルミスに気付かず、タイムロスしてしまったため。

###実例
模写したサイト→らくらくメルカリ便[https://www.mercari.com/jp/rakuraku-mercari/]
![20191024_Qiita01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/509471/049ce5d5-2661-ba27-187c-4c9c7f8fd3b9.jpeg)

```index.html
      <nav class="blead-crumbs">
        <ul>
          <li itemscope itemtype="http://data-vocabulary.org/Breadcrumb">
            <a href="https://www.mercari.com/jp/" itemprop="url">
              <span itemprop="title">
                メルカリ
              </span>
            </a>
            <i class="fas fa-chevron-right" style="color: darkgray"></i>
          </li>

          <li itemscope itemtype="http://data-vocabulary.org/Breadcrumb">
            <span itemprop="title">
              らくらくメルカリ便
            </span>
          </li>
        </ul>
      </nav>
```

```styles.css
bread-crumbs {
  border-top: 1px solid #eeeeee;
  background: #ffffff;
}
.bread-crumbs ul {
  padding: 16px 0;
  font-size: 0;
  width: 700px;
  overflow: visible;
  margin: 0 auto;
}
nav ul {
  list-style: none;
}
.bread-crumbs li {
  display: inline-block;
  font-size: 14px;
  text-align: center;
}
.bread-crumbs ul li i {
  margin: 0 8px;
  font-size: 9px;
}
.fas fa-chevron-right {
  content: \f054;
  font-family:'Font Awesome 5 Free';
  font-weight:900;
}
.bread-crumbs li:last-child {
  font-weight: 600;
}
```
どこが間違っているかわかりました？

###間違っているところは…

```index.html
      <nav class="blead-crumbs">
        <ul>
          <li itemscope itemtype="http://data-vocabulary.org/Breadcrumb">
```
navのclass名が間違っています。
正しくは**bread-crumbs**です！
css側は正しい綴りなのにhtml側が間違っていたせいで、見た目が変わらなかったわけです。
ちなみにbleadは「刀」です。

##スペルミスを防ぐには？
- 単語を覚える

これが一番の予防策が気がします。完璧にとはいかなくても「こんな綴りだったような」程度でいいと思います。英語ができれば訳ないんですけどね。

- 検索してみる

今回スペルミスに気づけたのはVisual Studio Code内で検索したからです(早めに「検索しよう」と思えば、無駄な時間を減らせた)。
それから綴りが「これで合ってたっけ？」と少しでも思ったら**即ググる**こと！
意味も一緒に覚えてしまえばいいんです。

- 日本語入力して変換する

求めている単語が出てくるとも限らないけど割と変換してくれる。


他に「こんな方法でスペルミスを防いでいるよ」という意見があれば教えてください。
ZapierでSlackからBOCCOに喋らせてみた

BOCCO可愛いですよね！
ただアプリから喋らせるだけというのも宝の持ち腐れな気がしたので、
Slackの特定のChannelに投稿した内容をZapier経由でBOCCOに喋らせてみました。
同じ様な記事がないので、備忘の意味も込めて投稿してみます。
技術力の高くない人（つまり私）向けの記事です。

まずはZapierにアカウント登録をして、「Make a Zap!」アイコンをクリック。
「1.When this happens …」で
「Slack」→「New Message Posted to Channel in Slack」を選択後、
「Continue」で次に進みます。
![001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519144/012fa68f-1939-54fa-3774-f8bcab88c0c8.png)

「Choose Account」で、
BOCCOに喋らせる用のChannelにアクセスできるアカウントを選択し「Contune」で次へ。
「Customize Massage Posted」の「Channel」でChannelを選びます。
その下のoptionalは空欄でOKです。「Contune」で次へ。
![002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519144/58853a4b-9c2e-2af7-7806-db7ba25165bc.png)

「Find Data」で、当該Channelに投稿済みメッセージがあればテストデータとして表示されます。
まだ投稿が一つもない状態だとこの後の設定で困るので、
とりあえず「あ」でも「う」でも「ん」でもいいので投稿しておいてください。
「Message Posted A」等で表示されている投稿メッセージを適当に選んだらSlack側の設定は終了です。
![004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519144/a579b409-5c61-e1e4-2ac8-d6783e0dd79b.png)

「2.Do this …」に移動します。
「Choose App」で「Webhooks by Zapier」を選択、
「Choose Action Event」で「Post」を選択します。
![005.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519144/ecbcc456-bd07-c31a-7146-02edebf09649.png)

Zapierのフリープランでもう１個WebhookでPostを投げるZapを作ろうとしたところ
Webhookアイコンの横に「Premium」表示が。お一人様１個までなのかしらん…。

「Customize Post」に進みます。各項目は下記の通り入力します。
なお、チャットルームのURLとアクセストークンはBOCCO APIを申請した後で自力で調べる必要があります。
ユカイ工学さんの<a href="http://api-docs.bocco.me/index.html">BOCCO APIページ</a>を参考にしてください。

URL:https\://api.bocco.me/alpha/rooms/<b>BOCCOのチャットルームのuuid</b>/messages
Payload Type:Form
Data:
　　access_token:<b>アクセストークンの番号</b>
　　media:text
　　text:Raw text（Slack設定「Find data」の時に投稿した適当なメッセージが表示される）

BOCCO APIリファレンスに「unique_id」必須と書いてあったのでDataに入れてみたら
この後のデータ送信テストでエラーになっちゃいました。
入れないで動かしてみたらエラーなく通ったので、Zapier側でユニークIDを振ってくれてるのかな。
ここのDataの入れ方が分からなくて３時間くらい悩みました。つくづく技術力が高くない。
![006.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519144/29231238-9b67-f4cd-63bf-6e4f6e317e6e.png)

〜省略（既定値のままでOK）〜

Headers：
　　Accept-Language:ja
![007.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519144/68ad5df6-ba9f-a3e1-6d9b-eb21b139fc17.png)

全て入力し終わったら、「Send Data」で「TEST & CONTINUE」を選択します。
テストデータがちゃんと送信されれば、画面上部に「Test was successful!」と表示され、
送信したテストデータをBOCCOが喋ってくれるはずです。
![008.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519144/85cc7972-16a3-63b5-1067-1f2d016c28a5.png)

これでSlackに投稿した内容をBOCCOが喋ってくれるのですが、
BOCCOアプリ側では、全ての投稿をアプリ登録者が喋ってることになっています。気にしない。
【Django】テキストファイルを基にメーラー起動リンク作成

[mailto](http://www.shurey.com/js/mailto.html)を使えば、a href～で簡単にリンク作れるんですけども、
リンクにカーソルを合わせたとき左下に～の部分が全部出てしまうんですよね。
メールアドレスだけならまだしも、本文がずらーっと出るのはダサいので嫌です！

よって、考えた手段がこちら
①txtから文章を読み込んで（python）
②読み込んだ文章とmailto使ってメーラー起動リンクを作成（javascript）

Djangoでこれを実現するには画面側からpython側にイベントを送らないといけないと思ったので、
javascriptやAjaxを調べつつチャレンジ。

#javascript
[こちら](https://qiita.com/takkyun/items/c6e2f2cf25327299cf03)を参考に、クリックした箇所に対してメーラー起動リンクを作成するようなjsを書きます。
javascriptとはコンソールログで遊んだ程度の付き合いしかありません。

Django側からデータ受け取るためにAjax使ってますが、
こちらからは特に何も送ってないので変な使い方してる気はします。

```javascript

function sendmail() {
    var is = this;
    
    $.ajax({
        url: "read_mail_text/",//Djangoのurlsに書いてあるパス
        type : 'POST',
        dataType: 'json',
        data : {app: null},//空っぽのjsonを送信
        cache: false,
        // 成功
        success: function(data) {
            //中身確認
            console.log(data["ac"]);
            //受け取った値からmailtoでメーラー起動用のリンク作成
            is.location.href = "mailto:" + data["ac"] + "?subject=" + data["sub"] + "&body=" + data["text"];
            
        },
        // エラー処理
        error: function(XMLHttpRequest, textStatus, errorThrown) {
            alert("Error : " + errorThrown);
       }
   });
    
}
```


# Django
やることは
①Ajaxから呼び出されて
②txtから文章を読み込んで
③jsonを返す
……かと

##①Ajaxにお呼ばれするために（Django）
```
path("read_mail_text/",[アプリ名].read_mail_text,name="read_mail_text")
```

こんな感じでパスを書いておきます。
敢えて書く必要もない気もしますが、一応メモ。

##②txtの中身

最終的にmailtoに組み込むのでそれを準拠に、一行ずつ変数指定しました。
txtの中身は以下のような感じです

```
ac = "V3 <damidami@v3.mask>"; //送り先のアドレス
sub = "年賀状";//件名
text = "新年おめでとう。%0D%0A%0D%0A今年こそ、裏切り者は殺す。%0D%0AADKデストロンを代表して、ヨロイ元帥。";//本文
```
エスケープシーケンスのタグでも改行が出来なかった気がするので、改行コードがギエピーしてます。

##③javascriptにjsonを返す（Django）
Ajaxのリクエストを受け取ってるので（たぶん）、引数にrequestを入れます。
現在地が分からなかったので、相対パス使ってます。

```python
      def read_mail_text(self,request):
          #txt読込→変数に入れる
          path =os.path.dirname(__file__)+"\\mail_text.txt"
          
          myfile =File(open(path,  'rb'))
          txt=[]
          for t in myfile:
              txt.append(t.decode('utf-8'))
          
          #json形式で返す
          return JsonResponse({'ac':txt[0],'sub':txt[1],'text':txt[2]})
```

# 完成
自分の環境で動きましたのでひとまず、タイトルの内容はクリア。
汎用性が低いのがネックですね。
Cognos AnalyticsでJConsoleを使う手順

#Cognos AnalyticsでJConsoleを使う手順
Cognos AnalyticsでJConsoleを使う手順をメモ変わりに投稿しておきます。
CognosのJavaプロセスで使用しているメモリー量、CPU、GCの発生状況、スレッド数などを見るのに役に立ちます。

マニュアル上の情報はこちらです。
**Using logging to diagnose a problem for a specific user**
https://www.ibm.com/support/knowledgecenter/SSEP7J_11.1.0/com.ibm.swg.ba.cognos.ug_cra.doc/t_disableipfuser.html#DisableIPFUser

基本的にリモートのPCからでも出来る説明なのですが、実際にやってみると一部情報しか見えなかったので、Cognosサーバー上で以下の手順で行いました。
環境は、Cognos Analytics 11.1.3 @ Redhat 7 です。

**Cognos Configurationの設定**
Cognos Configurationを起動し、赤枠の「外部JMXポート」を任意の値に、「外部JMX資格情報」でユーザーIDとパスワードを任意のものに指定し、保存後Cognosを再起動します。
<img width="675" alt="012.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/2fb77ef2-b729-95b2-d53c-30ea82b210bb.png">

**IBM Java SDK 8の導入**
こちらからJDK 8 をダウンロードして、Cognosサーバーノードにインストールします。
https://developer.ibm.com/javasdk/downloads/sdk8/

※Oracle Javaでも大丈夫という事です。試してはいないです。

**JConsoleの起動**
以下のコマンドで、JConsoleを起動します。
<img width="253" alt="008.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/14694c0d-96c7-5ee9-3a33-2fac75445845.png">

**プロセスに接続**
リモート・プロセスで接続すると、後述のイメージで「Mbeans」のタブの情報しか見えなかったので、「ローカル・プロセス」を指定し、プロセスとして赤枠のどちらかを選択します。
dataset-service = Query Serviceのプロセス
cognosserver = CognosのWebSphere Liberty本体
<img width="678" alt="009.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/bc2f1b1d-66f8-a6ba-90c8-93a05dcf09a4.png">

※リモート・プロセス接続の場合は、以下の指定。monitoring_serverはモニターしたいJavaプロセスが動作しているノード
service:jmx:rmi://Content_Manager_server/jndi/rmi://monitoring_server:8181/proxyserver

「不安定な接続」で。
<img width="676" alt="011.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/7cc96af4-1b99-f887-0170-246866b6a59e.png">


**各タブの紹介**
「概説」タブ
<img width="682" alt="001.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/0e1671bb-ed10-5728-31e6-fb112106d4f8.png">

「メモリー」タブ
<img width="679" alt="002.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/8c4ce7fb-61a4-29da-fe52-5e3ac8c0f759.png">

「スレッド数」タブ
<img width="680" alt="003.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/0863d209-b7b1-4b40-258c-69369873117f.png">

「クラス」タブ
<img width="680" alt="004.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/450a309a-66b4-dd02-f7eb-8150ba263c51.png">

「VMの要約」タブ
<img width="679" alt="005.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/50d1767c-0d2f-3ea6-b38e-7b5dc5a3e875.png">

「MBeans」タブ
<img width="680" alt="006.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/a0891268-6366-df00-fa59-9e1d3501c079.png">

どこかで役に立つ事もあると思うので、覚えておいて頂ければと。
hasManyThroughを使わずに、〜経由で多数へ紐づくモデルをCollectionで取得

# タイトルが微妙。。。
ひと言でどう表現したものか分からず、伝わりにくいかと思いますが。
忘備録としておいておきます。

### やりたいこと

companyのidをもとにpassengersをcollectionで取得したい。
航空会社(company)は多数のフライト(flights)を持ち、各フライトは多数の乗客(passengers)をもつ。

```
companies
    id - integer
    name - string

flights
    id - integer
    company_id - integer
    destination - string

passengers
    id - integer
    flight_id - integer
    name - string
```

hasManyThrough使うといいんですが、今回は使わずにやりたい。
モデル同士はhasManyとbelongsToで定義されているものとします。

```PassengerController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Models\Company;

class PassengerController extends Controller
{
    public function getPasserngers($id)
    {
        $company = Company::find($id);
        // $companyに関連するflightsを取得
        $flights = Flight::where('company_id', $company->id)->get();
        // コレクションのインスタンスをつくる
        $passengers = new Collection;
        // foreachで回しながら、各flightに紐づくpassengersをcollectionで取得
        foreach ($flights as $flight) {
            $data = $flight->passengers;
            $passengers = collect($passengers)->merge($data);
        }
        // ついでにソートしておく
        $passengers = $passengers->sortByDesc('created_at');
        dd($passengers);  // collectionで取得できる
    }
```

## ちなみに。

ちなみにhasManyThrough使うとすればこういう書き方かと思います。かんたん。。。

https://readouble.com/laravel/5.8/ja/eloquent-relationships.html#has-many-through

```Company.php

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Company extends Model
{
    /**
     * ある会社の全乗客を取得
     */
    public function passengers()
    {
        //第一引数＝最終的にアクセスするモデル、第二引数＝仲介するモデル
        return $this->hasManyThrough('App\Passenger', 'App\Flight');
    }
}

```

```PassengerController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Company;

class PassengerController extends Controller
{
    public function getPassengers($id)
    {
        $company = Company::find($id);
        $passengers = $company->passengers;
        // companyにひもづく全てのpassengersがcollectionで取得できる
        dd($passengers);
    }

}
```
ラズパイにUbuntu19.10をセットアップしてみた話

# 初めに
Ubuntu の新バージョン 19.10 が公開されました。
今回はLTSではないので、そういう意味では比較的注目度は低いのかもしれません。
が、ダウンロード対象にIoTというものがありまして、ラズパイ向けにカスタマイズされている様子。
で、試してみた話です。
ちなみに準備作業はWindowsで行っています。

# 起動まで
まずはパッケージのダウンロード

[こちらのサイト](https://ubuntu.com/download/iot/raspberry-pi)からパッケージをダウンロードします。
こちらのページでセットアップまでのステップが解説されていますので、それを順次こなしていくだけです。
![ub00001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248779/ee4ab577-5063-7d81-a95e-d00cd91a3a2d.png)
今回は32bitバージョンを試しました。
![ub00002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248779/d340ac39-09c0-b346-b622-7aa79e15c644.png)

ダウンロードしたファイルは「ubuntu-19.10-preinstalled-server-armhf+raspi3.img.xz」でxzで圧縮されています。
[7-zip](https://sevenzip.osdn.jp/)で解凍します。
解凍したファイルは「ubuntu-19.10-preinstalled-server-armhf+raspi3.img」となります。
解凍したファイルをmicroSDにコピーするのですが、単純にコピーしてもラズパイで起動できません。
先ほどのUbuntuの公式にある説明の

> ２　Flash the microSD card

の[リンク先](https://ubuntu.com/download/iot/installation-media)を見ると、「dd」コマンドによるコピーを行っています。
[ddコマンド](https://www.atmarkit.co.jp/ait/articles/1711/30/news027.html)は、ファイルのブロック単位のデータをそのまま転送先にコピーするコマンド。
これをWindowsで実行してくれるツールがありましたので、併せて紹介いたします。

## DD for Windows
[DD for Windows](https://www.si-linux.co.jp/techinfo/index.php?DD%20for%20Windows#s74c46f6)は、シリコンリナックス社さんが公開されているWindowsでddコマンドを実行するツール。
今回はバージョン0.9.9.8を使用しました。
ダウンロードしたファイルを解凍してできたフォルダに「DDWin.exe」がありますので、これを開きます。
Windows10では、管理者として実行する必要がありました。
「DDWin.exe」を右クリックして「管理者として実行」をクリックします。

![00001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248779/7676d159-e0d0-0682-f754-88e23458e9a3.png)
この時に、「管理者として実行」ではなく通常の実行をした場合「対象ディスク」が選択できませんでした。
左の「ディスク選択」でmicroSDのドライブを選択。（書き込むSDカードはセットしておいてください）
右の「ファイル選択」で先ほど解凍した「ubuntu-19.10-preinstalled-server-armhf+raspi3.img」を選択します。
「<< 書込 <<」を押して書き込み実行します。
以下、幾つかの確認が出ましたがすべて「はい」を選びました。
![00002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248779/6a8ebe5c-3378-a69d-80c5-8de86846fb98.png)
![00003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248779/f5d5ccb7-80b1-1a72-e022-e96ce2fa3c52.png)
![00004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248779/7a4462e0-ef9a-8656-4917-cd3b2e05173b.png)
![00006.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248779/1f4a26ab-a4a6-f8bd-2c45-19ddcfbd08cf.png)

# ラズベリーパイ起動
出来たmicroSDをラズパイにセットし起動します。
起動シーケンスが流れてログインプロンプトが出ます。
初期のアカウント名とパスワードは
ubuntu/ubuntu
ログイン後即座にパスワードの修正を求められます。
新しいパスワードを登録すると、通常のプロンプトになります。

# 終わりに
本格運用するつもりはないので今回はここで終わりにしたいと思いますが、ついでなのでもう少し。
今回使用したディストリビューションはUbuntu Serverという事で、GUIがありませんでした。

WiFiの設定をしていないのでまずは有線でLANに接続。

```
$ sudo apt update
$ sudo apt install xinit
```

再起動すると、無事GUIでのログインが出来ました。


# リンク
[Ubuntu](https://ubuntu.com/download/iot/raspberry-pi)
[DD for Windows](https://www.si-linux.co.jp/techinfo/index.php?DD%20for%20Windows#s74c46f6)
[]()
[]()
swift入門の為のメモ

実際には運用するアプリの制作入門としてのメモを随時記載

１、まずはメニュー有りき

    // SubViewController へ遷移するために Segue を呼び出す
            
        performSegueWithIdentifier("showDetailView",sender: nil)

    // Segueで遷移時の処理
    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {
        if (segue.identifier == "showDetailView") {
            let secondVC: ViewController4 = (segue.destinationViewController as? ViewController4)!
            
            // showDetailViewのtextに選択した文字列を設定する
            print("segue")
            print(view.frame.height)
            //secondVC.itemid = selectedText
            
            
        }
    }


２、アプリ内記憶処理


３、sqlite3の利用


４、サーバーサイドのシステムとの連動


５、サーバーサイドデーター利用
Ubuntuでsumoの「Tutorials/quick start」を実行してみる

#Tutorials/quick startを実行する
[続き](https://qiita.com/Mskmemory/items/1c63e3b1765ca523ae5a)です
まだ見てなかったら先に見てください。

[sumo公式-Tutorials/quick start](https://sumo.dlr.de/docs/Tutorials/quick_start.html)を実行してみる

## 環境確認
公式サイトには**<SUMO_HOME>/docs/tutorial/quickstart**のディレクトリにあるよと書いてある。
実際にみてみる

```bash
cd $SUMO_HOME
ls
bin data tools
```
これしか表示されなかった。
インストール時に**sumo-doc**をインストールしたどこにあるのか探す。

```bash
dpkg -L sumo-doc |grep sumo-doc
#以下のものがでる
/usr/share/doc/sumo-doc　←見つけた
/usr/share/doc/sumo-doc/changelog.Debian.gz
/usr/share/doc/sumo-doc/examples
```

移動してみる

```bash
#移動してみる
cd　/usr/share/doc/sumo-doc
#ファイル確認
ls
changelog.Debian.gz  copyright  doxygen  examples  pydoc  tutorial
```
**tutorial**発見

```bash
cd tutorial/quickstart/data
ls
quickstart.con.xml  quickstart.edg.xml  quickstart.netccfg  quickstart.net.xml.gz  quickstart.nod.xml  quickstart.rou.xml.gz  quickstart.sumocfg  quickstart.typ.xml
```
これでアプリケーションが動きそう。ここで**quickstart.net.xml.gz**と**quickstart.rou.xml.gz**が圧縮(gz)されていたので解凍する

```bash:解凍
gzip -d　quickstart.net.xml.gz
gzip -d quickstart.rou.xml.gz
```

##実行
準備おっけい

```bash:実行
sumo-gui quickstart.sumocfg 
```
![Screenshot from 2019-10-24 18-39-09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191643/5d40303f-f62b-4c1b-ef49-5300a82b4d81.png)
【Laravel】プロジェクトのバージョンを確認する

# 手順
`artisan.php` が存在するディレクトリへ移動して、
`php artisan -V` または `php artisan --version` を実行する。

# 実行サンプル： `php artisan -V`

```
[UserName: pojects]$ cd laravel_app/
[UserName: laravel_app]$ php artisan -V
Laravel Framework 6.3.0
[UserName: laravel_app]$ 
```

# 実行サンプル： `php artisan --version`

```
[UserName: pojects]$ cd laravel_app/
[UserName: laravel_app]$ php artisan --version
Laravel Framework 6.3.0
[UserName: laravel_app]$ 
```
Ubuntuでsumoをインストールし「Tutorials/OSMWebWizard」を実行

#sumoとは
車の動作をシミュレーションするためのツール
本記事はインストールとTutorials/OSMWebWizardを実行することが目的です。
間違っていたら教えてください。

#sumoのインストール
今回のインストール環境は**Ubuntu16.4**でいきます。
[sumo公式サイト-インストール](https://sumo.dlr.de/docs/Installing.html)参照

```bash
sudo apt-get install sumo sumo-tools sumo-doc
```

SUMO_HOMEを環境変数に設定しろと言われるので設定
どこにインストールされたのか確認する

```bash
#ファイルがどこにあるのか検索
dpkg -L sumo |grep sumo
#多分こんなのが出る
/usr/share/applications/sumo.desktop
/usr/share/doc/sumo
/usr/share/doc/sumo/changelog.Debian.gz
/usr/share/doc/sumo/copyright
/usr/share/pixmaps/sumo.png
/usr/share/mime/application/sumo.xml
/usr/share/man/man1/sumo-gui.1.gz
/usr/share/man/man1/sumo.1.gz
/usr/share/sumo ←これ
```
見つけたので環境変数に登録

```bash
export SUMO_HOME=/usr/share/sumo
```
bashrc等に書き込むことをお勧めします。

#Tutorials/OSMWebWizardを試す
[Tutorials/OSMWebWizard](https://sumo.dlr.de/docs/Tutorials/OSMWebWizard.html)
ここには、toolsディレクトリの下にあるosmWebWizard.pyを実行しろと書いてある。
なのでtoolsディレクトリに移動

```bash
#上記で、環境変数の設定を行ったので移動
cd　$SUMO_HOME
cd　tools
#実行
python osmWebWizard.py
```

webブラウザが開いて画面が表示される
![Screenshot from 2019-10-24 18-32-22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191643/2dd81dc7-e2f7-e33b-86d7-956951c3f838.png)


[続き](https://qiita.com/Mskmemory/items/0ea4002da6ceff65bd13)
[C#]PDF ファイル表示方法

[D&DしたPDFファイルをSQL Serverに登録＋プレビューする方法](https://qiita.com/ANNEX_IBS/items/52319d3cbb8678e68eea)の記事の一部になります。

#3. C#:Adobe&reg; Readerのコンポーネントの取り込み、その表示
C# でPDF ファイルをフォーム上に表示する方法になります。
リンク先を参考にしています。

##1) Acrobat&reg; SDK をダウンロードする ( 事前準備 )
下記のサイトから Adobe&reg; SDK を取得します。
**Arobat&reg; DC SDK ではPDFを表示できない** ( [c# WindowsフォームAppでPDF表示ができない。(AxAcroPDFLib)](https://teratail.com/questions/13068) ) ので、**Acrobat&reg; XI SDK** を使用します。

[Adobe&reg;のページ](https://www.adobe.com/devnet/acrobat/sdk/eula.html)から、 [Agree and download Acrobat XI SDK for Windows] を選択してダウンロードします。

##2) DLL ファイルの取得 ( 事前準備 )
上記で取得した SDK 内のサンプルプロジェクト AcrobatActiveXVB をコンパイルして、以下の２つの dll ファイルが作成します。(VB.NET でのコンパイル)

* AxInterop.AcroPDFLib.dll
* Interop.AcroPDFLib.dll

プロジェクトの参照設定で追加すれば、 PDF ブラウザコントロールが使用できるようになります。

##3) PDF ファイルをフォーム上に表示
下記のサンプルコードを参考に表示処理を作成しています。

```C#
// ブラウザコントロールの作成
AxAcroPDFLib.AxAcroPDF pdfOcx = new AxAcroPDFLib.AxAcroPDF();
 
pdfOcx.Dock = DockStyle.Fill; // フォーム全体に表示する
this.Controls.Add(pdfOcx);    // フォームにコントロールを追加
 
// PDF ブラウザコントロールに指定したPDFファイルを表示する
pdfOcx.LoadFile(@"E:\test.pdf");
```

自作したプログラムでの実行結果画面:
![図5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/303209/e2f0f859-fae6-2b01-3e42-e3b27a8cd739.png)

表示に用いたデータは、[Adobe&reg;公式ページのサンプルPDFデータ] です。
(https://www.adobe.com/content/dam/acom/jp/information/acrobat/taggedpdf/EXR-55_Product_Overview.pdf)

下記機能があります。

* 保存
* 印刷
* **ページ遷移**
* **拡大縮小**
* etc

##4) 使用許諾
「Acrobat&reg; SDK によって開発されたプラグインやアプリケーションの再配布には、一切の費用は発生いたしません。」と記載されています。
[Acrobat&reg; SDK を使用してできることや、SDK に含まれているものについて](https://helpx.adobe.com/jp/acrobat/kb/2558.html)

ただし、「詳しくは、下記の文書をご覧ください。」のリンクは切れているようです・・・

##参考
[[ VB.NET / C# ] PDF ファイルをフォーム上に表示して印刷する](http://hensa40.cutegirl.jp/archives/1189)
[AcroPDFLib.AxAcroPDF 一覧](http://pdf-file.nnn2.com/?p=240)
年末まで毎日webサイトを作り続ける大学生 〜6日目 ajax & Youtube APIを触ってみる〜

##はじめに
初めまして。
年末まで毎日webサイトを作っている者です。
今日はajaxとYoutube APIを触ってみました。
結論をいうとほんとうに触りだけです。
扱う技術レベルは低いですが、同じように悩んでる初心者の方を勇気付けられれば幸いです。
今日は6日目。(2019/10/24)
よろしくお願いします。

##サイトURL
https://sin2cos21.github.io/day6.html

##やったこと
ボタンを押せば・・・
![スクリーンショット 2019-10-24 13.41.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/516248/904e0a26-1ae6-3407-2adc-25ce8614f498.png)

youtubeの日本人気動画の情報を取得できます。
が、この配列のようなもの↓を展開できず意味のない文字の羅列に・・・
（連想配列・多次元配列・hashやら理解できていない）
![スクリーンショット 2019-10-24 13.40.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/516248/22f69e7d-6987-5b5f-e60e-4b83ce482da7.png)


##こだわったところ
ajaxとapiという巨頭に果敢に挑みました。
が、彼らはとても強大でこだわるにも前提知識が不足しすぎておりこだわりきれませんでした。

```javascript

 <script>
        test7 = document.querySelector("#test5");
        test8 = document.querySelector("#test6");
        test7.onclick = function () {
            var x = new XMLHttpRequest();
            x.onreadystatechange = function () {
                if (x.readyState == 4) {
                    var test = x.responseText;
                    test2 = JSON.parse(test);
                    Object.keys(test2).forEach(key => test8.innerHTML = ('key:' + key + ' value:' + test2[key]));
                }
            }
            x.open('GET', 'https://www.googleapis.com/youtube/v3/videos?part=snippet&chart=mostPopular&regionCode=jp&key=[キー]');
            x.send();
        }
    </script>
```

onreadystatechangeメソッドはリソースの入手状況が変化したときに自動で動いてくれる優れものです。
いつ動くかは
> if (x.readyState == 4) 

で指定しています。4はリソースの取得が完了したという意味です。


##感想
今日はてんで歯が立ちませんでした。
githubでソースを公開しているので、apiキーにhttpリファラーの制限をかけたらエラーになったり、せっかくデータを取得してきても表示させたい部分の表示方法がわからなかったり。
ただ、ajaxとAPIを扱えるようになればできることの幅がぐんと広がることは分かりました。
年末になる頃には必ずこの2大巨頭を倒してみせます！
今日はアレ、物語の序盤で強敵にコテンパンにされるみたいな日。最終回では見事にリベンジを果たすというフラグを立てただけ。というわけでへこたれずに頑張ります。

##参考
- 簡単なAjaxを書いて使ってみよう (http://html2php.starrypages.net/javascript/ajax)
- YouTube APIの仕組みとブラウザだけでデータ取得する方法 | DIYプログラミング (https://diy-programming.site/tools/movie-matome-site-3/)

上記2つのサイトはとても参考になりました。ありがとうございます。
[C#]ドラッグ＆ドロップの使い方

[D&DしたPDFファイルをSQL Serverに登録＋プレビューする方法](https://qiita.com/ANNEX_IBS/items/52319d3cbb8678e68eea)の記事の一部になります。

#1. C#:ドラッグ＆ドロップの使い方
ファイルのドラッグ＆ドロップを受け入れる方法。
(内容は、参考に書いたリンクとほぼ同じです)

##1) UI(デザイン)
* D&D を許可するコントロールの [AllowDrop] プロパティを "True" に設定します。
![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/303209/9555d5d8-1eb6-09ad-138e-d11a6b880f99.png)

##2) コード
* [DragDrop] と [DragEnter] イベントハンドラを実装します。

```c#
/// <summary>
/// DragDropのイベントハンドラー
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void pnlDragAndDrop_DragDrop(object sender, DragEventArgs e)
{
  // DataFormats.FileDropを与えて、GetDataPresent()メソッドを呼び出す。
  var files = (string[])e.Data.GetData(DataFormats.FileDrop, false);

  // GetDataの戻り値はstring型の配列であり、
  // 複数のファイルがドロップされた場合には
  // ドロップされた複数のファイル名が取得できる。
  
  for (int i = 0; i < files.Length; i++) {
    // GetDataにより取得したString型の配列から要素を取り出す。
    var fileName = files[i];
    Console.Write(fileName);
  }
}

/// <summary>
/// DragEnterのイベントハンドラー
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void pnlDragAndDrop_DragEnter(object sender, DragEventArgs e)
{
  // マウスポインター形状変更
  //
  // DragDropEffects
  //  Copy  :データがドロップ先にコピーされようとしている状態
  //  Move  :データがドロップ先に移動されようとしている状態
  //  Scroll:データによってドロップ先でスクロールが開始されようとしている状態、あるいは現在スクロール中である状態
  //  All   :上の3つを組み合わせたもの
  //  Link  :データのリンクがドロップ先に作成されようとしている状態
  //  None  :いかなるデータもドロップ先が受け付けようとしない状態

  if (e.Data.GetDataPresent(DataFormats.FileDrop))
  {
    e.Effect = DragDropEffects.Copy;
  }
  else
  {
    e.Effect = DragDropEffects.None;
  }
}
```
##参考
[エクスプローラからファイルのドラッグ&ドロップを受け入れる (C#プログラミング)](https://www.ipentec.com/document/csharp-accept-drag-and-drop-from-explorer)
[Node] 標準入力を扱うコードをテストする

ユーザからの入力を受け付けるCUIのようなコードのテストサンプル。

# テスト対象コード

```prompt.js
const readline = require('readline');

const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});

module.exports = function prompt(question) {
  return new Promise((resolve, reject) => {
    rl.question(question, answer => {
      rl.close();
      resolve(answer);
    });
  })
};
```

使う側はこんな感じ。

```main.js
const prompt = require('./prompt');

prompt('Enter something: ').then(answer => {
  console.log(answer);
});
```

実行結果

```
% node ./main.js
Enter something: abc
abc
```

# テストコード

```spec/prompt-spec.js
const prompt = require('../prompt');

describe('prompt function', () => {
  it('returns answer', done => {
    prompt('question: ').then(answer => {
      expect(answer).toEqual('abc');
      done();
    });
    process.stdin.emit('data', 'abc\n');
  });
});
```
ts-node-devで起動されたかを調べる方法

プロセスがts-node-devで起動されたかを調べる方法です。

```typescript
const isTsNodeDev = Object.keys(require.cache).some(path => /\/ts-node-dev\//.test(path))
```

ts-node-devで起動すると、nodeの`-r`オプションにts-node-devが渡されるため、ロード済みのモジュールに`'ts-node-dev'`の文字列があるかを調べれば良いわけです。
MySQLでパーティションの確認をする場合


## MySQLでテーブルのパーティション設定を取得・確認するクエリ

```sql
SELECT TABLE_NAME, PARTITION_NAME, PARTITION_ORDINAL_POSITION, TABLE_ROWS
FROM INFORMATION_SCHEMA.PARTITIONS
WHERE 
TABLE_SCHEMA = '{スキーマ名}' AND
TABLE_NAME =  '{テーブル名}';
```

### パーティションの実行計画をとる場合はこちら
https://qiita.com/a-nishimura/items/d27c8ee31ffec73b12e6
GitHub Actionsを定期実行して結果をSlackに通知する

## やりたいこと
- E2Eテストなど定期的に実行したいやつをGitHub Actionsでやりたい
- 実行結果をSlackに通知したい

## GitHub Actions
- 毎日11時にEchoするActions
- ブランチの指定がない場合、デフォルトブランチのコードで実行される
- Slackと連携する際のWebhookはGitHubのSecretsに設定する

``` yaml:cron.yml
name: CRON
on:
  schedule:
  # UTC
  - cron: '0 2 * * *'

jobs:
  hi:
    name: Hi
    runs-on: ubuntu-latest
    steps:
    - name: Check out code
      uses: actions/checkout@v1
      # デフォルトブランチ以外を実行したい場合はブランチを指定する
#      with:
#        ref: other
    - name: Echo
      run: echo "I've checked out"
    - name: Slack Notification
      # 前Stepの実行結果を判定
      # success() or failure() or always()
      if: always()
      uses: rtCamp/action-slack-notify@master
      env:
        SLACK_CHANNEL: channel_name
        SLACK_ICON: https://github.com/rtCamp.png?size=48
        SLACK_MESSAGE: 'Post Content :rocket:'
        SLACK_TITLE: Post Title
        SLACK_USERNAME: rtCamp
        SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }}
```

## 所感
- 定期的に実行する系のやつはGitHub Actionsで事足りそう

## GitHub
- [今回のコード](https://github.com/DotaKobayashi/go-api-gae)
Django の BooleanField に 0,1 を指定してチェックを付けたい

真偽値を 0,1 で管理してる環境で引っかかりやすい

## 環境

- Django 2.2
- Python 3.6.8

## 事象

python は 0 = False と判断してくれるので
BooleanField の初期値に 0 or 1 を指定すれば正しく動作する事を期待してしまう

```forms.py
class SampleForm(forms.Form):
    check_1 = forms.BooleanField(initial=1)
    check_0 = forms.BooleanField(initial=0)
```

実際は 0 の場合にもチェックが付いてしまう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259465/8622ac8c-e7ea-f6e5-6e84-73eff57f947f.png)

## 原因

チェックボックスの判定は↓の **boolean_check** メソッドで判定される。

```widgets.py
def boolean_check(v):
    return not (v is False or v is None or v == '')
```

数値は考慮されていないので、0 だろうが 1 だろうが v is None の部分で必ず True と判定される

## 対応

check_test は引数で変更が可能なので、 数値を考慮した判定メソッドを指定すると

```forms.py
# このメソッドを自作する
def wrap_boolean_check(v):
    return not (v is False or v is None or v == '' or v == 0)


class SampleForm(forms.Form):
    check_1 = forms.BooleanField(
        initial=1,
        widget=forms.CheckboxInput(check_test=wrap_boolean_check)
    )
    check_0 = forms.BooleanField(
        initial=0,
        widget=forms.CheckboxInput(check_test=wrap_boolean_check)
    )
```

想定通りに動作してくれる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259465/fe9c43c2-c1b4-5b17-6d44-725a1f1c5e26.png)
デプロイと言われても何か分からなかったので調べてみます

　こんにちは。
　まーこです。

　10月から塾で学ぶプログラミングを始めました。（今までは個人勉強で学習していましたが、成長がないので塾に通うことになりました。）
　そこで、基礎を学ぶなかで、新しい概念や用語に出会うのですが、教室で先生に聞くには時間もないので、インターネットから調べたことをメモします。
　元々、ファインアーティストとして活動していたため、文章に感覚的な部分があります。プログラマーのように、ロジカルに書くことができないのですが、努力いたしますのでよろしくお願いします。

<h2>そもそもデプロイとは何なのか</h2>
塾で学ぶなかで、githubをまともに初めてやっています。
先生：「github内でデプロイしてみましょう」
私：「???」
といったことがおきました。


<h2>github内でデプロイとは何をやったのか</h2>
githubのデプロイしたいリポジトリにまず移動、settingsボタンをクリック、settings内のGitHub Pagesの選択のSourceをmaster branchに変更しました。そして、settings内のGitHub Pagesの選択のCustom domainを自身の所有しているドメインを入力しました。


<h2>ここで改めてデプロイとは何か概念をググる</h2>
こちらのサイトが私のやっていることの作業とぴったりなので、こちらにリンクを貼っておきます。

> [デプロイとはとは何？Weblio辞書](https://www.weblio.jp/content/%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4)
>>引用
デプロイに該当する作業としては、たとえば、ウェブアプリケーションの開発において、作製したプログラムをサーバーにアップロードし、当該のサーバー環境で利用可能にする、という手続きが挙げられます。ただし、必ずしも公開（リリース）作業を指すとは限らず、開発環境からテスト用の環境へアップロードしてテストに使える状態にすることもデプロイといいます。

今後このように分からなくなって頭を整理したい際はこのようにメモして行きたいと思いますので、間違い等ありましたら、ご指摘ください。

まーこ
[github:okamotomaakoo](https://github.com/okamotomaakoo)
覚えていて損はないwindowsショートカット

# はじめに
一応初心者向けです。
とりあえずこれ覚えておけば作業効率が比べ物にならないくらい上がるんじゃないかな？
あと若干変なテンションで書いてるので注意

# エディタで使えるショートカット
**大正義ctrlキー**
ctrl使えるかどうかで作業効率に天と地ほどの差が生まれます
使いこなせるとすっごい楽
## ctrl + s
ファイルを上書き保存するときに使います。
たぶん使用頻度トップクラスこれかcrtl+Zはパソコン触るなら一生お世話になるレベルに使います。
上書き保存意外だと例えばブラウザでページを名前を付けて保存するときに使えます。(こちらは上書き保存ほど使う場面はありませんが)

## ctrl + z
一度やった作業を巻き戻すことができる
これも滅茶苦茶使うしこれ使えなくなるくらいなら死んだほうがましレベルに重宝することになります。
ctrl+zで巻き戻した作業を元に戻す方法はアプリによって変わってくる場合があるので注意よく見るのはctrl+yかctrl+shif+z巻き戻したいときは先にどっちを使うかを確認しておこう

## ctrl + c & ctrl + v
いわるるコピーアンドペースト　cでコピーしてvで張り付ける
これを知ってるかどうかで作業効率はだーーーいぶ変わってくるはず。

## ctrl + x 
切り取りctrl＋cと同じくらい使う
間違えた場所にコード書いたときとかに便利

## ctrl + f
検索機能

こんな感じの検索ボックスが出るはず(これはVsCodeのやつ)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206739/a68f92d7-d189-337f-de6d-bdfd094ec53e.png)
Chromeとかのブラウザでも使える
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206739/bb077bf7-8262-1f23-a21d-a3de71b43bea.png)
使いかたは簡単出てきたボックスに探したい文字列を打ち込むだけでその文字列に一致した個所を色付けで表示してくれる。
特にVsCodeの検索は大文字小文字の判別等々いろいろと多機能なので便利

#ブラウザ(Chrome)でよく使うショートカット
自分がchromeしかブラウザ使わないんでほとんどchrome基準でしゃべります。
他のブラウザでショートカットが違ったりしてたらごめんね！

## ctrl + t & ctrl + w
ctrl + tで新しいタブ生成
ctrl + wで今開いてるタブを閉じる
ctrl + shift + tで直前に閉じたタブを開きなおすこともできる

## ctrl + tab 
タブの切り替え
今開いているタブの右隣のタブを表示できる。
左側を表示したいときは ctrl + shift + tab

## F5 or ctrl + r
ページのリロード
私はほとんどF5しか使わないんだけど逆にctrl+rしか使わない人もいるのかな？
(なんならctrl+rの存在をこの記事を書いている途中に知った)

#デスクトップとかでよく使うキー
## ctrl + windows + 方向キー(左右)
これで仮想デスクトップの切り替えができます。
###仮想デスクトップ系

- ctrl + windows + d
    - 新しい仮想デスクトップを生成
- ctrl + windows + F4
    - 今開いている仮想デスクトップを閉じる

## windows + d
デスクトップを表示
タスクバーの右端のやたらちっちゃいボタン押さなくてもできる
そこまで使用頻度は高くないので頑張って覚える必要はあんまない
追記　crtlとwindowsキーを間違えて紹介してました
指摘してくださった方ありがとうございました

## Alt + tab
各ウィンドウの切り替えができます。
ブラウザ開いてるときにマウス使わないで開いてるエディターとかを前面に出せるのでマウスがない時とかはよく使ってる。

あと完全に蛇足なんですけどAltキーってオルトとアルト呼び方の正式な名称は決まってないらしい
Alternate(オルタネイト:代わりの,代替の)から来てるらしいのでオルトって呼ぶほうが一応正解なのかな

## まとめ
~~crtlは神~~
ここに書いてあるショートカット以外にもショートカットは膨大にあります。(多分私も知ってるショートカットよりも知らないショートカットの方が多い)気になったら調べてみるといいかも。

モチベーションの維持につながるんでよかったらいいね押していってください
一応よく使うコマンド等を抜粋して紹介したのですがctrl+zレベルで使用頻度高くて書き忘れているコマンド等あったら教えてください。m(__)m
オレオレtmux

# 完全に誰得
## これをコピペして使え、将来のオレ

```tmux.conf
# setting tmux
#  prefix Ctrl+t
unbind C-b
set-option -g prefix C-t
bind C-t send-prefix

set-option -g history-limit 2000
set-window-option -g mode-keys vi
set-option -g mouse on
set-option -g terminal-overrides 'xterm*:smcup@:rmcup@'

# move pane by vim like 
bind -r k select-pane -U
bind -r j select-pane -D
bind -r h select-pane -L
bind -r l select-pane -R
# resize
bind -r C-k  resize-pane -U 1
bind -r C-j  resize-pane -D 1
bind -r C-h  resize-pane -L 1
bind -r C-l  resize-pane -R 1

bind | split-window -h 
bind - split-window -v

bind-key -T copy-mode-vi 'y' send-keys -X copy-pipe-and-cancel "pbcopy"
bind-key -T copy-mode-vi Enter send-keys -X copy-pipe-and-cancel "pbcopy"
bind-key -T copy-mode-vi MouseDragEnd1Pane send-keys -X copy-pipe-and-cancel "pbcopy"
```
bashrc->

```bashrc
alias tm='/usr/local/bin/tmux'

function proj() {
	tmux split-window -v -p 40
	if [ $# -eq 1 ]; then
		WNUM=$1
		if [ $WNUM -lt 2 ]; then
			return
		fi
		tmux split-window -h -p 50
		if [ $WNUM -lt 3 ]; then
			return
		fi
		tmux split-window -h -p 50
	fi
}
```
# tmuxプラグイン
[プラグインマネージャー](https://github.com/tmux-plugins/tpm)を利用する
使用時の状態を保存してくれるだけでもサイコー٩(ˊᗜˋ*)و

```更新版.tmux.conf
# setting tmux

# List of plugins
set -g @plugin 'tmux-plugins/tpm'
set -g @plugin 'tmux-plugins/tmux-resurrect'
set -g @plugin 'tmux-plugins/tmux-continuum'
set -g @continuum-restore 'on'

#  prefix Ctrl+t
unbind C-b
set-option -g prefix C-t
bind C-t send-prefix

set-option -g history-limit 2000
set-window-option -g mode-keys vi
#set-option -g mode mouse
set-option -g mouse on
#set-option -g mouse-select-window on
#set-option -g mouse-select-pane on
#set-option -g mouse-resize-pane on
set-option -g terminal-overrides 'xterm*:smcup@:rmcup@'

# move pane by vim like 
bind -r k select-pane -U
bind -r j select-pane -D
bind -r h select-pane -L
bind -r l select-pane -R
# resize
bind -r C-k  resize-pane -U 1
bind -r C-j  resize-pane -D 1
bind -r C-h  resize-pane -L 1
bind -r C-l  resize-pane -R 1

bind | split-window -h 
bind - split-window -v

bind-key -T copy-mode-vi 'y' send-keys -X copy-pipe-and-cancel "pbcopy"
bind-key -T copy-mode-vi Enter send-keys -X copy-pipe-and-cancel "pbcopy"
bind-key -T copy-mode-vi MouseDragEnd1Pane send-keys -X copy-pipe-and-cancel "pbcopy"

if "test ! -d ~/.tmux/plugins/tpm" \
   "run 'git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm && ~/.tmux/plugins/tpm/bin/install_plugins'"

# Initialize TMUX plugin manager (keep this line at the very bottom of tmux.conf)
run -b "~/.tmux/plugins/tpm/tpm"

```