OmniAICreator/Qiita-1.07M huggingface dataset:
AWS lambda を使ってTwitterに定期投稿しよう！

# 概要
AWSのLambdaを使ってTwitterに定期投稿できればいろいろ応用できそうで便利だなと思ったのでまとめてみました。
![スクリーンショット 2020-10-16 23.34.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/432257/4de65f42-0a02-5685-7f27-741202278446.png)

# 作成手順
## 作成の流れ
1. Dockerで環境構築
2. PythonからTwitter投稿

## 詳細
### 1.DockerでLambdaの環境構築
lambadaで標準以外のライブラリーを使うためにDocker を使いました。
lambdaでdockerを使うには[lambci/docker-lambda](https://github.com/lambci/docker-lambda)使うと便利です。
こちらの記事が参考になりました。
[AWS Lambda x Pythonでのローカル開発環境の再現について](https://qiita.com/i35_267/items/15b981acae8cf7c763ae#-docker-lambda%E3%82%92%E8%A7%A6%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8B)

```bash:Dockerfile
FROM lambci/lambda:build-python3.8
ENV AWS_DEFAULT_REGION ap-northeast-1

ADD . .

CMD pip3 install -r requirements.txt -t /var/task && \
  zip -9 deploy_package.zip lambda_function.py && \
  zip -r9 deploy_package.zip *
```

`zip -9 `のオプションはよくわからないです。

```requirements.txt
twitter
```


### 2.Twitter投稿
こちら[sixohsix/twitter](https://github.com/sixohsix/twitter)のライブラリを使えば簡単にツイートできます。
参考にさせていただいた記事
・[Python3で簡単にtwitterに投稿する](https://qiita.com/shtnkgm/items/cc55be0e09b484ce8e43)

```lambda_funcyion.py
import twitter

def lambda_handler(event, context):
    
    auth = twitter.OAuth(
      token="トークン", 
      token_secret="トークンシークレット", 
      consumer_key="キー", 
      consumer_secret="シークレット"
    )
    context = '今日も頑張った！'
    t = twitter.Twitter(auth=auth)
    t.statuses.update(status=context)
   
    
```

### 3.ローカルでのデバック
いちいちlambdaにあげて確認するとめんどくさいので、ローカルで確認します。

```
$ docker run -v "$PWD":/var/task lambci/lambda:python3.8 lambda_function.lambda_handler [event]
```
これで投稿させているはずです。

### 4.デプロイ
まずはzipファイルにまとめます。

```
$ docker build -t mylambda .
$ docker run -v "$PWD":/var/task mylambda
```

次にAWSのコンソールからlambda関数を作成。

zipファイルをアップロード

環境変数を登録

定期実行の時間を登録できればOK！

参考
・[Amazon CloudWatch Events で cron 式を使う場合は時差に気をつける](https://qiita.com/niwasawa/items/6e0b191d6aa21213c7ec)
・[公式ドキュメント　ルールのスケジュール式](https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/events/ScheduledEvents.html)

# 感想・今後・・・
・　他の流れに取り込みたい。
【ボツ】Twitter API：フォローしているがフォローバックされてないアカウント一覧の取得

#【ボツ】Twitter API：フォローしているがフォローバックされてないアカウント一覧の取得

# [新記事](https://qiita.com/atomyah/items/1e241d9e9ee7c8245a52)のように作り直しました

フォロワーが多くなると手作業でこの作業をするのは厳しくなってくる。時間も無駄だし…。ということで半自動化することにする。なお、まだフォロワー数1万までは達していない状態なので、アンフォローする作業は実際に対象アカウントを視認しながら手作業で行いたい。アカウント一覧取得までをスクリプト化する。

※ ネット上にそういうことができるWebアプリ／Webサイトが転がっているが、使うのはちょっと怖いので自作することにする。

###pythonとPIPをインストール

割愛

###tweepyをインストール

```bash

$ pip install tweepy 
```

###Twitter APIのキーをお手元に準備

https://developer.twitter.com/en/portal/dashboard より。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307441/003e3483-6f1d-e9a1-8de7-9daa4ead393c.png)

###コード

```python
#unfollow_list.py
import tweepy
 
keys = dict(
    screen_name =         '[ツイッターアカウント名（screen_name)]',
    consumer_key =        '[コンシューマーキー]',
    consumer_secret =     '[コンシューマーシークレット]',
    access_token =        '[アクセストークン]',
    access_token_secret = '[アクセストークンシークレット]',
)
 
SCREEN_NAME = keys['screen_name']
CONSUMER_KEY = keys['consumer_key']
CONSUMER_SECRET = keys['consumer_secret']
ACCESS_TOKEN = keys['access_token']
ACCESS_TOKEN_SECRET = keys['access_token_secret']
 
auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
auth.set_access_token(ACCESS_TOKEN, ACCESS_TOKEN_SECRET)
api = tweepy.API(auth)
    
followers = api.followers_ids(SCREEN_NAME)
friends = api.friends_ids(SCREEN_NAME)


for f in friends:
    if f not in followers:
        print(api.get_user(f).screen_name)

```


###実行

```bash

$ python unfollow_list.py
```

###結果
![名称未設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307441/8299ae42-81dd-b389-e690-4c6b55be3986.png)

ファイルに落としたかったらコピペ。


###補足
自動でプログラムにリムらせたかったら、`print(api.get_user(f).screen_name)`の後に`api.destroy_friendship(f)`文を追記。
※ しかし最初のうちはひとつひとつ手動でチェックしてみた方が良い。けっこうリストアップエラーがある（ちゃんとフォロバされているのに対象リストに入ってくる）

<br />
[Laravel]DBより抽出したデータをクエリビルダでとれなかったときの話

# エラー文
```terminal
Property [id] does not exist on this collection instance.
```
このコレクションインスタンスにはidプロパティはありませんとのこと。
# 該当ソース
```php
$data = DB::table('users')->where('id',1)->get();
```
これをview側で$data->idとしたときに上記エラーが起こった。
->get()の返り値はCollectionクラス。
Collectionの中身はModelの各データで構成されている。data->idで取るデータはModelの中のプロパティ変数を取るものなので、データが1件しかなくとも、各Modelの集合体の配列であるCollectionからは$data->idという取り方ではエラーが出た。
#解決方法
```php5
$data = DB::table('students')->where('id',1)->first();
```
->first()の返り値はmodelオブジェクト

#まとめ
view側で$data->idというように単純に一件だけデータを取りたいときは、->first()や->find()などで、Modelのオブジェクトを返すようにする必要がある。

# 参考文献
[【Laravel】Property [id] does not exist on this collection instance.](https://harublog.org/programming/laravel/laravel-error-property/)
C# / WPFで数字入力欄の値をEnter押下時に指定桁数でゼロ埋めする

# 前説

'0001' のような入力を行うTextBoxで、1を入力すると先頭部分をゼロ埋めするようにしたかった。

[こちらの記事](http://blog.livedoor.jp/akiyam_0613/archives/2722512.html)を参考に、WPFな業務アプリでキー操作によるフォーカス移動などのビヘイビアを使っていた。
とりえあず↑を参考に動作できたので、忘れないうちにメモ。

## ビヘイビアの定義

上記サイトのようにBehaviorsフォルダに以下のようなファイルを追加(元サイトのBehaviorBase.csを継承)。
呼び出すxamlファイルのTextboxに入れる。

```csharp:TextBoxZeroPadding.cs
using System.Diagnostics;
using System.Windows.Controls;
using System.Windows.Input;

/*
 * XAML内で使うビヘイビア
 *
 * Enter押下時、TextBox内の数字をゼロ埋めする
 *
 */

namespace GyomuApp.Behaviors
{
    /// <summary>
    /// TextBox用ビヘイビア
    /// MaxLengthに沿ってゼロ埋めする
    /// </summary>
    public class TextBoxZeroPadding : BehaviorBase<TextBox>
    {
        /// <summary>
        /// イベント登録
        /// </summary>
        protected override void OnAttached()
        {
            base.OnAttached();

            // TextBoxのキーダウンイベントにOnKeyDownを登録
            AssociatedObject.PreviewKeyDown += OnPreviewKeyDown;
        }

        /// <summary>
        /// イベント解除
        /// </summary>
        protected override void OnDetaching()
        {
            base.OnDetaching();
        }

        /// <summary>
        /// キー押下イベント
        /// </summary>
        /// <param name="sender">TextBox</param>
        /// <param name="e">キーイベントデータ</param>
        private void OnPreviewKeyDown(object sender, KeyEventArgs e)
        {
            if (sender is TextBox textBox)
            {
                switch (e.Key)
                {

                    case Key.Enter:
                        if (textBox.Text == "") break;

                        var zeroForm = new string('0', textBox.MaxLength);
                        var format = "{0:" + zeroForm + "}";

                        textBox.Text = string.Format(format, short.Parse(textBox.Text));

                        break;
                }

            }
        }
    }
}
```

XAMLファイルは抜粋で書くと↓

```xml
                    <!-- 個数 000 -->
                    <TextBox  Grid.Row="4" Grid.Column="1" Grid.ColumnSpan="2"
                         HorizontalAlignment="Right" TextWrapping="Wrap" 
                         TextAlignment="Center"
                         FontSize="14"
                         VerticalAlignment="Center" Margin="0,0 0 0" Width="290" 
                         MaxLength="3"
                         Text="{Binding EntryQty, Mode=TwoWay}"
                     >
                        <behaviors:Interaction.Behaviors>
                            <b:TextBoxIntegerOnly />
                            <b:TextBoxMoveFocus />
                            <b:TextBoxZeroPadding /><!-- ← これ -->
                        </behaviors:Interaction.Behaviors>
                    </TextBox>

```

これで、指定TextBox内で数字を入れてEnterキーをおすと、ゼロ埋めされる。 
フォーカス移動のEnterキービヘイビアTextBoxMoveFocusも同時に指定しているが、問題なく動くようだ。

逆に[数値入力のみのビヘイビア](http://blog.livedoor.jp/akiyam_0613/archives/2722514.html)と同時指定する前提なので、こちらがない場合はエラーが出ると思われる。
[Flutter] [Navigator] 次画面へ複数の値を渡す方法

Navigatorによる画面遷移時に次画面へ値を渡す方法です。
SQLiteやSharedPreferencesで保持する必要はなく、ライトに値を渡したいときにご参考になればと思います。

<h2>渡したい値が1つの場合</h2>
変数 hogeを次画面に渡す例

第3引数のargumentsに変数 hoge をセットします。

遷移元 

```dart

String hoge = 'hoge';
Navigator.pushReplacementNamed(
  context,
  '/next_path',
  arguments: hoge
);
```

遷移先

```dart

final String hoge = ModalRoute.of(context).settings.arguments;
```

<h2>渡したい値が複数ある場合</h2>
変数 hogeId, fuga を次画面に渡す例

渡したい値をまとめたクラスを作成し、そのオブジェクトを渡します。
名前はなんでも良いので、ViewAToBArguments というクラス名で以下のように作成するとします。

```dart:ViewAToBArguments.dart

class ViewAToBArguments {
  final int hogeId;
  final String fuga;

  ViewAToBArguments(this.hogeId, this.fuga);
}
```

第3引数のargumentsに ViewAToBArguments オブジェクトをセットします。

遷移元 

```dart

int hogeId = 1;
String fuga = 'fuga';
Navigator.pushReplacementNamed(
  context,
  '/next_path',
  arguments: ViewAToBArguments(hogeId, fuga)
);
```

遷移先

```dart

final ViewAToBArguments viewAToBArguments = ModalRoute.of(context).settings.arguments;
int hogeId = viewAToBArguments.hogeId;
String fuga = viewAToBArguments.fuga;
```
HTML/CSSのclass命名基本事項

ポートフォリオを作成していますが、classの命名が杜撰だったため統一性が薄れ、メンテナンス性が低くなってしまいました。
命名における基本ルールについて、改めて勉強したことを自身と同じ初学者向けにまとめました。

##一目で理解できる名前を英語で命名する
要素の性質が理解しにくい名前は、メンテナンス性が低くなります。
例えば、class名「１」「２」「３」・・・などと全て番号で命名してしまうと、把握するのに時間がかかり編集作業に無駄が増えます。
「title」「menu」「btn」・・・などの方が、可読性が高く後々編集しやすいです。

## 極力短い名前で命名する
気をつけなければ、クラス名は長ったらしく読みにくいものになってしまいます。
使用する単語は、極力簡単で短いものにすると読みやすくなります。
例えば、「顧客」という言葉を英語で表現すると「customer」になりますが、似た意味で良いなら「user」の方が短く済みます。

## レイアウト上の意味ではなく、機能上の意味を表した命名をする
例えば、赤字で強調したいテキストがあるため、class名を「txt-red」と命名しました。
しかし、後々青字に変更したり、太字や下線にするなど、レイアウトは後々変更する可能性があります。
そうなるとclass名も変更する必要が生まれますし、放置すると可読性は低くなります。
この場合のclass名は、「txt-attention」などと機能面を表す命名をすることで、破綻するリスクを回避できます。

## 命名規則パターンを遵守する
上記を守っても、パターンに統一性がなければ可読性は薄れていきます。
個人開発なら自分ルールを作成しても良いですが、ほとんどの場合はチームで通用する命名規則を習得する必要があります。
代表的な命名規則は3つあり、「OOCSS」「BEM」「SMACSS」とあります。

## どれを選べば良い？
機会があればまとめたいと思いますが、既に様々なサイトで分かりやすくまとめられているので、詳細は調べてみてください。
それぞれメリットデメリットありますが、最もメジャーで使用しやすいのはBEMです。迷ったらBEMが良いと思います。
OOCSSの考え方の方が個人的には好きですが、まずはBEMを使いこなしてからかなと思いました。
SMACSSは、OOCSSとBEMの発展版なので、いきなり手を出すのはハードルが高いかなと感じました。

## 最後に
様々な考え方があるので、決まった正解はないようです。
命名規則の学びの導入として、参考になれば幸いです。
Databricks E2リリースで新しく追加された機能について

#はじめに
2020年9月、AWS上で利用可能なdatabricksのプランに新しく E2 が追加されました。
この記事では、E2の機能について紹介していきます。
 
#プランの概要
E2のプランにすることで、以下の機能が使えるようになります。

- マルチワークスペースアカウント
- 顧客管理VPC
- 安全なクラスター接続
- ノートブックの顧客管理キー

それぞれの機能について、見ていきます。

##1. Multi-workspace accounts

アカウントAPIを使用し、**単一のDatabricksアカウントで、複数の新しいDatabricksワークスペースをプログラムで作成**することが可能です。作成する各ワークスペースには 異なる構成を設定できます。

##2. Customer-managed VPCs

デフォルトでは、Databricksは各ワークスペースのAWSアカウントにVPCを作成しますが、E2の場合、この顧客管理VPC機能により**独自のVPCにDatabricksワークスペースを作成**することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655635/8e57e74a-8e1f-a04a-b147-a962d7726a73.png)

##3. Secure cluster connectivity

すべてのノードがプライベートIPアドレスのみを持つクラスターを起動し、VPCに開いているポートがなくなることで、**安全なクラスター接続**が実現できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655635/6083931c-c38a-1f65-5ef1-24c7c3199980.png)

##4. Customer-managed keys for notebooks

ワークスペースの作成中に、**CMK（顧客管理キー）**と呼ばれる取り消し可能な秘密鍵を追加することができます。CMKとDMK（データ暗号キー）を結合し、ワークスペースにDEK（派生暗号キー）を作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655635/bacd09d9-601f-edc5-696c-8467c501db01.png)

 
#価格について
11月4日現在では、公式ページでは価格オプションについて確認できませんでした。もしかすると現行のEnterpriseプランに含まれているかもしれませんので、今後確認でき次第追記していきます。
 
#まとめ
これらの機能によって、より安全でスケーラブルに、AWS上でdatabricksプラットフォームを利用することができそうですね。

#公式ドキュメント
- https://docs.databricks.com/getting-started/overview.html#e2-architecture
- https://docs.databricks.com/administration-guide/account-api/new-workspace.html
- https://docs.databricks.com/administration-guide/cloud-configurations/aws/customer-managed-vpc.html
- https://docs.databricks.com/security/secure-cluster-connectivity.html
- https://docs.databricks.com/security/keys/customer-managed-keys-notebook-aws.html
- https://docs.databricks.com/release-notes/product/2020/september.html#e2-architecture---now-ga---provides-better-security-scalability-and-management-tools
new 演算子で生成したインスタンスのオブジェクト名取得


`インスタンス.constructor.name`でオブジェクト名を参照できる。


```javascript
function Foo() {};
let foo = new Foo();

console.log(foo.constructor.name);
//=> 'Foo'
````

参考
[Function.name - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Function/name)
[new 演算子 - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/new)
Bootstrapのフッター mt-autoの設定

JSPを開発していますが、デザインにはBootstrapを使用しています。

今回はヘッダーとフッターを付けよう！っていうテーマでBootstrapを調べていました。

やりたいイメージとしてはこれ
https://getbootstrap.com/docs/4.5/examples/sticky-footer-navbar/
![2020-11-04_140833.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/818309/324b91a4-7b8d-4d9a-5bc6-fe6aa73f1b9c.png)


このヘッダーとフッターの配置にしたい。

でもこうかな？と思って抜粋して色々試してみてもフッターが上手く画面下部に張り付きません。

で、サンプルダウンロードして不要そうな所消してフッターの位置だけ保持できたのがコチラ。

```HTML
<!doctype html>
<html class="h-100">
  <head>
    <meta charset="utf-8">
    <title>Sticky Footer Navbar Template · Bootstrap</title>
    <!-- Bootstrap core CSS -->
<link href="../assets/dist/css/bootstrap.min.css" rel="stylesheet">

  </head>
  <body class="d-flex h-100">
<!-- Begin page content -->
<footer class="footer mt-auto py-3">
  <div class="container">
    <span class="text-muted">Place sticky footer content here.</span>
  </div>
</footer>
</body>
</html>
```

HTMLとBODYにもクラスを設定しなきゃいけなくて、これによって「mt-auto」が上手く動くようになっているようです。

やっぱりコレかな？と思いながら追記していくより、不必要そうなものを消して結果を確認していく方が早く回答が得られますね。

Bootstrap便利だけど、色々ありすぎてもはやJqueryを使っている気分になりますね。
lighting box（ポップアップで画像拡大）

2020年11月3日。

データ消失。

200個程あったメモ用デモファイルが全て消失。

自作パソコンが壊れ、デスクトップにあったデータがすべて消えたのでQiitaをメモ代わりに。


＃１
lighting box（ポップアップで画像拡大）

下記のサイトからzipファイルをダウンロード。
https://lokeshdhakar.com/projects/lightbox2/

ダウンロード出来たら同じ階層に
js
css
img
それぞれのファイルを置く。

とりあえず完成コード

```
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>

  <link rel="stylesheet" href="css/lightbox.css">
	<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
  <script src="js/lightbox.min.js"></script>
  
</head>
<body>
  
  <a href="new-battery01.jpg" data-lightbox="demo-group"><img class="box" style="" src="new-battery01.jpg" alt="詳細画像"></a>
  <a href="new-battery01.jpg" data-lightbox="demo-group"><img class="box" style="" src="new-battery01.jpg" alt="詳細画像"></a>
  <a href="new-battery01.jpg" data-lightbox="demo-group"><img class="box" style="" src="new-battery01.jpg" alt="詳細画像"></a>
  <a href="new-battery01.jpg" data-lightbox="demo-group"><img src="new-battery01.jpg" /></a>
  </body>
</html>

```

参考：http://webnonotes.com/javascript-2/jquerypopup/
【メモ】Vue.jsのThree.jsでObjectのTextureを切り替える

# はじめに

HTML＋JavaScript版：[【メモ】Three.jsでObjectのTextureを切り替える](https://qiita.com/yunayunanaka/items/3beea9c2180f69792868)

↑をVue.jsでやってみた。

# プロジェクトセットアップ

```
$vue create change_texture_vue
$cd change_texture_vue
$npm install three
$npm run serve
```

今回はコントローラは使わない。
App.vueからHelloWorld部分を削除して、新しく `TextureChange.vue` コンポーネントをインポートする。

# ソースコード

基本的にはHTML＋JavaScript版と同じ。ちょっとVue仕様に変更しただけ。
Sceneはbodyのchildとしてぶち込んでるけど、レイアウト綺麗にしたいならdivタグとかのchildにしたらいいのかも。

```vuejs:TextureChange.vue
<template>
  <div>
    <select @change="changeImage">
      <option :value="logoURL" selected>Vue logo</option>
      <option :value="goriURL">Gori</option>
    </select>
  </div>
</template>

<script>
import * as THREE from 'three'
export default {
  name: 'textureChange',
  data() {
    const width = 600;
    const height = 400;
    const scene = new THREE.Scene();
    const camera = new THREE.PerspectiveCamera(75, width / height, 1, 1000);
    const cubeGeometry = new THREE.BoxGeometry(5, 5, 5);
    const cubeMaterial = new THREE.MeshBasicMaterial({ color: 0xff0000 });
    const cube = new THREE.Mesh(cubeGeometry, cubeMaterial);
    const logoURL = require('@/assets/logo.png'); // need require when local image
    const goriURL = require('@/assets/gori128.png');
    const renderer = new THREE.WebGLRenderer({ antialias: true, alpha: true });
    return {
      width,
      height,
      scene,
      camera,
      cubeGeometry,
      cube,
      logoURL,
      goriURL,
      renderer,
    }
  },
  mounted() {
    this.initialize()
  },
  methods: {
    initialize() {
      // camera
      this.camera.position.set(0, 0, 10)
      // renderer
      this.renderer.setSize(this.width, this.height);
      this.renderer.setClearColor({ color: 0x000000 });
      // cube
      const cubeMaterial = new THREE.MeshBasicMaterial({
        map: new THREE.TextureLoader().load(this.logoURL),
      })
      cubeMaterial.needsUpdate = true;
      this.cube = new THREE.Mesh(this.cubeGeometry, cubeMaterial);
      this.cube.name = 'cube'; // need name to find object afterwards
      this.scene.add(this.cube);
      this.renderer.render(this.scene, this.camera);
      document.body.appendChild(this.renderer.domElement);
      this.render();
    },
    render() {
      this.cube.rotation.x += 0.1;
      this.cube.rotation.y += 0.1;
      requestAnimationFrame(this.render);
      this.renderer.render(this.scene, this.camera);
    },
    changeImage(e) {
      const image = e.target.value;
      const object = this.scene.getObjectByName('cube'); // find obj by name
      object.material.map = new THREE.TextureLoader().load(image);
      object.material.needsUpdate = true;
    },
  },
}
</script>

```

# 結果

1. Vueのロゴが表示される

背景黒いな…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431932/bd47006f-82e6-e30e-4671-28d87aa5f908.png)

2. テクスチャ切り替え
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431932/e83a46bb-ec2c-ae37-f7ea-29ac022bdea9.png)

3. Goriちゃんに切り替わった
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431932/d9edcbef-37fa-a923-24fe-29284a52b5e8.png)
dotnet test で --no-build を指定するとテストが実行されない現象の解決方法

テストカバレッジが出力されない現象の解決方法については[こちら](https://qiita.com/RYO-4947123/items/4e01a6853d19881e5cab)

## 概要

コマンドラインから普通に`dotnet test --no-build`したらテストが実行されるのに、CIで自動テストをしようとするとなぜかテストが動かない現象の解決方法です。

## 再現方法

以下のファイルを用意します。

```.gitlab-ci.yml
image: mcr.microsoft.com/dotnet/core/sdk:latest

stages:
  - build
  - test

build:
  stage: build
  script:
    - "dotnet build"
  artifacts:
    expire_in: 10 min
    paths:
      - "*/bin/"
      - "*/obj/"
  only:
    - branches
  except:
    - master

Web_test:
  stage: test
  script:
    - dotnet test Web.Test --no-build
  dependencies:
    - build
  only:
    - branches
  except:
    - master
```

`Web.Test`というテストプロジェクトがあるとします。
これをGitLabのmasterブランチ以外にPushすればbuidとtestが実行されます。

### 説明

buildステージでビルドが完了しているのでtestステージではビルドの必要がありませんね。
なので、`--no-build`でビルドせずに実行したいと思いました。実際にはこのtestステージは複数のジョブに別れているので、ジョブ毎にビルドしなくて良くなるので高速化するはずでした。
しかし、この`--no-build`無しならテストが実行されるのに、付けるとテストせず（常にパス）ジョブが終了してしまいます。

## 解決方法

テストプロジェクトのプロジェクトファイル`~.csproj`に以下を追加します。

```Web.Test.csproj
<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>netcoreapp3.1</TargetFramework>

    <IsPackable>false</IsPackable>
    <IsPublishable>false</IsPublishable>
    <IsTestProject>true</IsTestProject>  ←これを追加!
  </PropertyGroup>
~
```

`IsTestProject `を`true`で追加するだけで解決します。

そもそも論ですが、`dotnet new xunit`でテストプロジェクト作ってるんだから、
＿人人人人人人人人人人人＿
＞　初めから入れといて　＜
￣Y^Y^Y^Y^Y^Y^Y^Y^Y^Y￣
解決に半日掛かりました・・・
（もしかしたらMicrosoftの偉い人がテンプレート直してくれるかもと期待してます）

## 余談１

問題を見つけるキッカケは`-v d`で詳細ログを出した時に、
`Task "Microsoft.TestPlatform.Build.Tasks.VSTestTask" skipped, due to false condition; ('$(IsTestProject)' == 'true')`
という一文を見つけた事でした。
ログを見るって大事ですね。

## 余談２

`IsPublishable`もテンプレートでは付いていませんでした。
これが無いと、`dotonet publish`した時にテストプロジェクトも出力に含まれてしまいます。
厄介なのは、それをAzure app serviceに展開すると動かなくなるという事です。
これもサーバのログに
`.runtimeconfig.json　が複数見つかったよ`
という様な警告が出ている事で気がつきました。
ログを見るって大事ですね。
１８０秒で分かるJava（超初心者編）

# はじめに
パソコンを買ったばかりでJavaを１ミリも知らない人に向けて、高校、専門学校で習うかもしれない９０分の授業を１８０秒で伝える記事です。
詳しい記事はほかの偉い人達が書いてるのでそれを読んで下さい。

この記事はあと１７０秒で読めます。

# 1. Javaとは
私の身の回りで呟かれているJavaという単語をざっくり３つに分類しました。

![java1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172479/1b04d17e-57db-e684-fbed-48cf6b2a3e5c.png)

- プログラミング言語
　色々なアプリケーション（パソコンなどの中で動いてるソフト）を開発するための言葉です。「Java言語」というと誤解なく伝わります。開発するためには「JDK：Java Development Kit」と呼ばれる開発者向けのツール群が必要です。一応無償でも手に入ります。アプリケーションを使うだけならJDKは不要です。

- アプリケーションそのもの
　Java言語で作られたアプリケーションのことです。「Javaアプリ」というと誤解なく伝わります。マイクラであればマイクラのゲーム本体の事です。マイクラJava版とかPC版とか言われてるアレです。因みに私はPC版という表現は曖昧なのでJava版と呼んでいます。

- アプリケーションを動かす場所
　Java言語で作られたアプリを動かすための専用の場所です。「Java実行環境」「Javaランタイム」や「JRE」などというと誤解なく伝わります。実はマイクラJava版には下記画像の通りJREが付属しているので、JREの事を何も気にせずに遊べます。他のアプリケーションの場合には、そもそも「JREを準備してください。」などと言われることがあります。
 
![javapath1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172479/04205c61-0a86-306a-8e7e-81f8d9f6247f.png)　

# 2. Java仮想マシン
通常、Mac 用のアプリケーションを Windows の上に乗せても動きません。Windows と Mac では頭の形が違いますし会話する言葉も違うからです。

![dora0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172479/fc825169-3c21-54ed-4453-65e935763c9d.png)

ですが30年以上前に、ある天才が「会話できないなら翻訳機を作れば良いじゃないの。」と呟き、その数年後に JVM（Java仮想マシン、Java Virtual Machine）と呼ばれる革命的なソフトウェアが誕生しました。

JVM というのは JRE の本体と思っておけばよいです。JVM はみんなの頭の形に合わせて良い感じにフィットしてくれる緩衝材のようなものです。アプリケーションからすると Windows や Mac のような複雑な頭の形を意識する必要がなくなり、自分を乗せている緩衝材がいつも平で座り心地が良いなぁくらいに見えています。JVM が尖った頭の形を全て吸収してくれており、アプリケーションは JVM が自分を動かしてくれているマシン（VM：仮想的なパソコン）なんだなと思って動いています。

![dora2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172479/a32d1042-b517-c890-fb6b-2d3685996c0c.png)

JVM によってプログラマー達はスネオの頭の形を意識することなく、常に同じ形のアプリケーションを作ることができるようになったので、Windows でも Mac でも気にせずアプリケーションを開発して配布できるようになりました。

![java2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172479/e64c65c1-10f3-dbb5-7c7a-b8fa865302c2.png)

マイクラJava版を起動すると上記の画像のように、Javaの中でマイクラが動いていることが分かります。Google ChromeはそのままGoogle Chromeとして動いていますね。

この翻訳機、仮想マシンというアイデアは今ではとても一般的な IT 用語になり、色々なところで仮想化という単語を聞くようになっています。パソコンの中だけに限らず、DVD ドライブの仮想化、サーバーの仮想化、ネットワークの仮想化、データセンターの仮想化など。利用者から見てあたかもそこに 〇〇 があるかのように使う（ハードウェアの種類や形や住所を意識せずに使える）というのがこのアイデアの根幹です。

# 3. 悪いところと良いところ
Java には悪いところと良いところがあります。

![dora3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172479/3b571cc8-6b20-6ba4-8c7a-5982663b3790.png)

- 悪いところ
　JVM という翻訳機を間に通しているため、その機械専用に作られたアプリケーション（ネイティブアプリケーション）よりも少しだけ遅いです。遅いとは言っても最近は JVM の速度も改善されてきています。

- 良いところ
　上で書いた通り、色々な環境で同じアプリケーションを動かすことができます。また、JVM 自身もソフトウェアなので複数の JVM①② を入れて動かしたいアプリケーションによって使い分けることができます。例えば Java 版のマイクラであればマイクラに元々付属しているものを使っても良いですし、自分で入れた最新バージョンの Java を使うこともできます。Java は後方互換性が高いので、最新版の Java を入れても問題は発生しにくいですが、問題が発生する場合には、その柔軟性の高さからいつでも古い Java に入れ替えることができます。
 
![mine.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172479/69f8de10-d559-df07-b517-caf6f9aa1e01.png)

　また、Windows や Mac のバージョンが変わったとしても、Java アプリを動かしている JVM のバージョンさえ変わらなければ、50年後でも今のマインクラフトを変わらずに遊ぶことができます（できるはずです）。アプリケーションを動かす JVM 自体がアプリケーションなので、それを保存して持ち運ぶことで、何十年経っても別の場所でアプリケーションを動かすことができます。アプリケーションを作る人にとっても必ず動く環境が１つ保証されるというのはとてもありがたいです。

# まとめ
私はこの記事を読むのに２１０秒かかりました。
WordPressのトップページの作り方

#WordPress
![スクリーンショット 2020-11-04 13.42.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/633943/74dd896f-b114-f069-1afa-01a96dc3960c.png)

```php
<div class="post">
  <!-- 記事のタイトルを表示する -->
  <h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
  <p class="post-meta">
    <!-- 記事の時間を表示する -->
    <span class="post-date"><?php the_time(); ?></span>
  </p>
</div>
【GAS】毎日実行するトリガーに終了期限を設定したい

##概要
一定期間は毎日実行したいけど、ある期日を過ぎたら実行したくない。

けど、トリガーの設定には終了期限がない・・・。

なのでスクリプト側に記述して解決してみた。

##方法
if文で終了期限の前かを判定して実行するのがシンプルかと思ったけど、そうすると期限以降もトリガーが残ってしまい、見えないところで実行され続けるのが気持ち悪い^^;

期限以降のどこかのタイミングでトリガーを削除してやれば良いとは言え、せっかく便利に自動化したんだから最後までほったらかしにしたい！

と言うわけで、終了期日が来たらトリガーを削除するようなスクリプトを作る。

##コード

```javascript
function delTrigger() {

  const today = new Date(); 
  const limit = new Date('2039/12/31');
  
  if(today>limit){
    
    const triggers = ScriptApp.getProjectTriggers();
    for(const trigger of triggers){
    
      if(trigger.getHandlerFunction() == '関数名'){
  
        ScriptApp.deleteTrigger(trigger);
      
      }
    }
  }
}
```

本日が期日を超えていたなら、`triggers`に全てのトリガーを格納して、for文で総ざらい。目当ての関数名がセットされたトリガーがあれば削除！

`today`には実行時の日時が入り、`limit`には指定日の０時０分が入るので、実行したいスクリプトの最後に`delTrigger();`を差し込んであげればＯＫ^^)b

`limit`日程の実行を最後にトリガーが消滅する。

###おしまい
【AWS】OpsWorksでsetup_failedになったインスタンスにRun Commandさせる裏技

# setup_failedで起こる問題

AWSのOpsWorksでは、正常に起動できたEC2インスタンスについては、
下記の画像のようにボタンをクリックすれば専用の画面に遷移し、
Run Commandが実行できる。
![スクリーンショット 2020-11-04 13.22.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251648/348b395a-a2ef-3b85-ecb9-31368b13475c.png)

しかし、起動が失敗（setup_failed）のインスタンスについては、
下記の画像のように画面遷移のボタンが表示されず、Run Commandが実行出来ない。
※ SSHとEditのボタンしか表示されない。

![スクリーンショット 2020-11-04 13.21.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251648/39d5ad34-12b1-864c-bafd-a468014c4998.png)


# 解決の裏技
正常に起動できたインスタンス（今回でいえばaether）からRun Commandボタンをクリックし、専用画面に遷移する。
すると、Commandを選択する項目の他に、「実行するインスタンスを選択」する項目が下の方にある。
実はsetup_failedしたインスタンス（今回でいえばchaos）についても選択出来てしまうので、
chaosをチェックしaetherのチェックを外してあげれば、chaosにRun Command実行可能となる。


![スクリーンショット 2020-11-04 13.23.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251648/77077df3-6dca-22b5-4d9d-b704b809d892.png)
JavaScript 特定桁の0と1で表すことができる全ての組み合わせを求める関数

# やりたいこと
**例:** 引数1に`3`を渡すと3ビットで表せれるすべての組み合わせを出力する。
たまに使用するので、個人的なメモ(誰かの役に立つと嬉しい)

出力例

```
[
  [ '0', '0', '0' ],
  [ '0', '0', '1' ],
  [ '0', '1', '0' ],
  [ '0', '1', '1' ],
  [ '1', '0', '0' ],
  [ '1', '0', '1' ],
  [ '1', '1', '0' ],
  [ '1', '1', '1' ]
]
```

# コード

```js: 
const getAllBit = (len) => {
  //すべての組み合わせの個数
  const end = Math.pow(2, len) - 1

  let result = []
  for (let i = 0; i <= end; i++) {
    //toStringの引数に2を渡すことで2進数表記にする
    //len分だけ0うめ
    const bit = i.toString(2).padStart(len, '0')
    result.push(bit.split(''))
  }

  return result
}

console.log(getAllBit(5))
```
**追記:** コメント欄でご指摘があった、再利用しない関数をなくし一つの関数でまとめました。

# 実行例
引数に5を渡した場合（上記のコードと同じ）

```
[
  [ '0', '0', '0', '0', '0' ],
  [ '0', '0', '0', '0', '1' ],
  [ '0', '0', '0', '1', '0' ],
  [ '0', '0', '0', '1', '1' ],
  [ '0', '0', '1', '0', '0' ],
  [ '0', '0', '1', '0', '1' ],
  [ '0', '0', '1', '1', '0' ],
  [ '0', '0', '1', '1', '1' ],
  [ '0', '1', '0', '0', '0' ],
  [ '0', '1', '0', '0', '1' ],
  [ '0', '1', '0', '1', '0' ],
  [ '0', '1', '0', '1', '1' ],
  [ '0', '1', '1', '0', '0' ],
  [ '0', '1', '1', '0', '1' ],
  [ '0', '1', '1', '1', '0' ],
  [ '0', '1', '1', '1', '1' ],
  [ '1', '0', '0', '0', '0' ],
  [ '1', '0', '0', '0', '1' ],
  [ '1', '0', '0', '1', '0' ],
  [ '1', '0', '0', '1', '1' ],
  [ '1', '0', '1', '0', '0' ],
  [ '1', '0', '1', '0', '1' ],
  [ '1', '0', '1', '1', '0' ],
  [ '1', '0', '1', '1', '1' ],
  [ '1', '1', '0', '0', '0' ],
  [ '1', '1', '0', '0', '1' ],
  [ '1', '1', '0', '1', '0' ],
  [ '1', '1', '0', '1', '1' ],
  [ '1', '1', '1', '0', '0' ],
  [ '1', '1', '1', '0', '1' ],
  [ '1', '1', '1', '1', '0' ],
  [ '1', '1', '1', '1', '1' ]
]

```

5ビットで表すことができるすべての組み合わせが出力できてます。

# 参考にした記事

> 
 [js 与えられた整数を二進数で返す](https://qiita.com/may88seiji/items/e4d017a8663070c8c94e
)
Railsでアプリを新規作成する

#備忘録としてRailsでアプリを新規作成する手順をまとめる。

まずアプリケーション作成するのに Rails new コマンドを使用する。

データベースはMySQL使用。コマンドオプションに　-d mysql を末尾に書く
_6.0.0_はバージョン

```
ターミナル
% rails _6.0.0_ new アプリ名 -d mysql
```

これで新規アプリができる。

```
config/database.yml 

# encoding: utf8mb4を

encoding: utf8  に変更
これは保存形式の変更をする為
```


データベース作成
アプリと紐ずくデータベースを作るために以下を実行

```
ターミナル
% rails db:create
```

rails s で作動すればOK
Swaggerについて1時間で調べたことの個人的メモ

# Swagger入門


## Swagger specification (Open API Specification)

[OpenAPIのWiki](https://en.wikipedia.org/wiki/OpenAPI_Specification)によると、ほぼ`Swagger仕様＝Open API仕様`と考えて良さそう。

> The OpenAPI Specification, originally known as the Swagger Specification, is a specification for machine-readable interface files for describing, producing, consuming, and visualizing RESTful web services.[1] Originally part of the Swagger framework, it became a separate project in 2016, overseen by the OpenAPI Initiative, an open-source collaboration project of the Linux Foundation.[2] Swagger and some other tools can generate code, documentation and test cases given an interface file.



## swagger.yml

スキーマ情報をチマチマかいたyamlファイル(名前はswagger.ymlじゃなくてもいい)。肝である。
- [Swagger Editor](https://editor.swagger.io) でUIを見ながら編集できる。
- VS CodeでもExtensionを入れたらUIを見ながら編集できるらしい？

## Swagger UI

がんばって書いたswagger.yml をUIで見ることができる。以下がコンテナを使ったUIの起動方法(他にもやり方色々ありそう)。

- `swaggerapi/swagger-ui`というコンテナイメージをpullし、(1)swagger.ymlをマウント、かつ(2)うまくポートをバインド、した上でコンテナ起動する。ローカルで`localhost:8080`とかにアクセスすることで、Swagger UIを確認できる。


## Swagger codegen

swagger.ymlで定義したAPIを持つモックサーバを立てるために使われる？？？(要調査)

パラメータに対応するレスポンスがどれなのかのマッピングはswagger.ymlでしているするのだろうか？？？

## スキーマ駆動開発

まずswagger.ymlを書いてしまう。これに準じたモックサーバを立てることで、フロントがバックエンドのAPI開発完了を待たずに開発をスタートできる。

# Rails x Swagger

## committee(gem)

controllerのspec内で`assert_response_schema_confirm`という一行を忍ばせることで、swagger.ymlで指定された仕様を満たすをレスポンスを返しているかがテストできる。

参考: [committee×OpenAPI×RailsでスキーマファーストなAPI開発](https://gift-tech.co.jp/articles/schema-first-api-development/)
【Java】プログラミングにおける基本用語

#プログラミング勉強日記
2020年11月4日
復習もかねてJavaを0から勉強しなおそうと思う。そこでまずは基本的な用語をおさらいする。

#クラスとメソッド
　クラスとメソッドは以下のように記述する。(詳しくは下記で説明する)

```java
class クラス名{
  メソッド名 (引数){
    // 実行処理
    メソッド本体
  }
}
```

##クラス
　簡単に言うと、クラスはプログラムを実行するときに必要な処理をまとめた設計図のようなもので、メソッドと変数によって構成される。
　Javaのようなオブジェクト指向言語ではプログラミングの対象をオブジェクト(もの)としてとらえる。なので、クラスはオブジェクトの設計図ではあるが、オブジェクトそのものではない。そのため、クラスを使用するときにはオブジェクトを生成(=インスタンス化)する必要がある。

　クラスを使えるようにするためには、クラスを定義しなくてはならない。フィールドはクラス内部の定義された変数で、クラスの持つ情報が格納されている。オブジェクトにはフィールドとメソッドが1つにまとめられている。

```java:クラスの定義
class クラス名 {
  // フィールドやメソッドなどを記述
}
```
　
##メソッド
　簡単に言うと、メソッドはクラスが持つ機能を記述したもので、メソッド名と引数、メソッド本体によって構成される。
　上記で述べたようにクラスを利用するために生成されたオブジェクトは属性とメソッドという要素から構成される。メソッドは自分で作ることもできるが、多くのメソッドがあらかじめ用意されている。メソッドは1つのクラスに複数記述することもできる。


#オブジェクトとオブジェクト指向
　クラスは設計図で、オブジェクトはその設計図に基づいて作られる部品のようなものである。オブジェクトはクラスを実体化(=インスタンス化)したもので、オブジェクトを使用するためには下記のような記述をしないといけない。

```java:オブジェクトを利用する
クラス名 変数名 = new クラス名(引数);
```
　オブジェクトは「モノ」という意味があり、オブジェクトを部品のように組み合わせてシステムを構築する考え方のことをオブジェクト指向という。
　
#継承
　特定のクラスのフィールドやメソッドを引き継いで新しいクラスを定義することを継承という。継承を行うときに元のクラスをスーパークラス、新しく作るクラスをサブクラスという。

```java:クラスの継承
class サブクラスの名前 extends スーパークラスの名前{
  // 処理内容、メソッド
}
```


#オーバーライド
　スーパークラスのメソッドをサブクラスで再定義することをオーバーライドという。オーバーライドしたメソッドを呼び出すときは下記のように記述する。(finalやstaticといった修飾子がついてるメソッドはオーバーライドできない)

```java:オーバーライド
super.メソッド名;
```

#オーバーロード
　同じクラス内で同じメソッド名を定義することはできないが、引数の型や並び替えすることで同じ名前のメソッドを複数定義することができる仕組みをオーバーロードという。
　

#参考文献
[Java入門：プログラミングの必須知識！まず押さえたい基本用語集](https://www.internetacademy.jp/it/programming/java/basic-glossary-of-java.html)
[【Java入門】コンパイル、クラス、メソッド...押さえたい基本用語まとめ](https://www.internetacademy.jp/it/programming/java/basic-term-java-compile-classmethod.html)
Ruby 標準入力

# はじめに
今回はプログラミング問題で標準入力を使うことが多いので、メモを残しておこうと思います。
使用言語はRubyで行います。

#文字列の場合
## １行１要素だけしか存在しない場合
```
標準入力
Tokyo
```
```
line = gets
p line
```
```
出力結果
"Tokyo"
```

## １行に複数要素存在する場合

```
標準入力
Tokyo Osaka Kyoto
```
```
line = gets.split(' ')
p line
```
```
出力結果
["Tokyo", "Osaka", "Kyoto"]
```
splitメソッドを使用することで３つの要素をそれぞれ別のものとして配列に格納しています

## 複数行1つずつ要素が存在する場合
```
標準入力
Tokyo
Osaka
Kyoto
```
```
line = readlines
len = line.length
i = 0

while i < len
    line[i] = line[i].chomp
    i += 1
end

p line 
```
```
出力結果
["Tokyo", "Osaka", "Kyoto"]
```
上記のものの簡潔な書き方として、mapメソッドを使用したものがあります

```
標準入力
Tokyo
Osaka
Kyoto
```
```
line = readlines.map(&:chomp)
p line 
```
```
出力結果
["Tokyo", "Osaka", "Kyoto"]
```

## 複数行に複数要素が存在する場合
```
標準入力
Tokyo Osaka Kyoto
Japan USA China
```
```
line = readlines
len = line.length
i = 0

while i < len
    line[i] = line[i].chomp.split(' ')
    i += 1
end

p line
```
```
出力結果
[["Tokyo", "Osaka", "Kyoto"], ["Japan", "USA", "China"]]
```
上記のものの簡潔な書き方として以下のものもあります

```
標準入力
Tokyo Osaka Kyoto
Japan USA China
```
```
lines = []
while line = gets
    lines << line.chomp.split(' ')
end
p lines
```
```
出力結果
[["Tokyo", "Osaka", "Kyoto"], ["Japan", "USA", "China"]]
```
while line = getsとすることで、標準入力の値を全て取得するまで繰り返されます

```
標準入力
Tokyo Osaka Kyoto
Japan USA China
```
```
lines = readlines(chomp: true).map{|line| line.split(' ')}
p lines
```
```
出力結果
[["Tokyo", "Osaka", "Kyoto"], ["Japan", "USA", "China"]]
```
出力結果を見ると、受け取った値は文字列なので数値を受け取りたい場合は次のようにします

# 数値で受け取りたい場合
## １行に１要素だけしか存在しない
```
標準入力
123
```
```
line = gets.to_i
p line
```
```
出力結果
123
```

##１行に複数要素存在する場合
```
標準入力
1 2 3
```
```
line = gets.split(' ')
p line
```
```
出力結果
["1", "2", "3"]
```
このままだと文字列として扱われるので、mapを使用して数値型の配列に変換します

```
標準入力
1 2 3
```
```
line = gets.split(' ').map(&:to_i)
p line
```
```
出力結果
[1, 2, 3]
```
##複数行に1つずつ要素が存在する場合
```
標準入力
1
2
3
```
```
line = readlines.map(&:to_i)
p line 
```
```

出力結果
[1, 2, 3]
```

##複数行に複数要素が存在する場合
```
標準入力
1 2 3
4 5 6
```
```
lines = []
while line = gets
    lines << line.chomp.split(' ').map(&:to_i)
end
p lines
```
```
出力結果
[[1, 2, 3], [4, 5, 6]]
```

より簡潔に書く方法は下記

```
標準入力
1 2 3
4 5 6
```
```
lines = readlines(chomp: true).map{|line| line.split(' ').map(&:to_i)}
p lines
```
```
出力結果
[[1, 2, 3], [4, 5, 6]]
```

#最後に
この他にもいろんな方法があると思うので随時更新していこうと思います。
[maya, motionbuilder, nuke, etc] Qt アプリでパネルをドラッグ中に意図せずドッキングされないようにする方法

```
※記事に関しましてご注意下さい
こちらでは「対処法そのもの」よりも「そもそも何故その問題がおこるのか」を探るべく調査した内容になります。
実際の現場では具体的な解決策として様々な手段がとられますが、その根源は実は同じであることも多く、
仕組みを知ることで利点・欠点をつかみ、未来に起こるトラブルを防ぐ・拡張した使用方法に発展させるなどを考えています。
あくまでも個人調査のメモです。間違い・勘違いが含まれている可能性もありますので予めご了承ください。
```

## 調査のきっかけ
元々は、

```
motionbuilder で追加したウィンドウ・掴んだウィンドウが
色んなパネルの合間に勝手にドッキングして配置されるのを防ぎたい、
かつ、できればドッキングするかしないかを選択したい（ドッキングしたい場合もある）
```
という相談から調査を始めました。
`※ motionbuilder 限定であれば .ini でドッキングを全オフにすることは可能です`

これについてはネット上には多くの意見・案・スクリプトがあり、その多くがアプリケーション内の PyQt/PySide ウィンドウの設定を変更してドッキングできなくする、というものです。
ですが `ドッキングさせたい場面もあるはず` で、その場合との共存の面で今一しっくりくるものがなく調査しました。

## 調べた結果

```
ウィンドウ・パネルを移動する際に「Ctrl を押しながら」を移動するとドッキングせず、
通常通り移動するとドッキングモードが復活します。
```

以上です。至ってシンプル。設定変更もスクリプトも必要なし。

実際に maya, motionbuilder, nuke, python + pyside などでその挙動を確認済みです。
※ 3dsmax も qt 挙動合わせなのか同様の挙動でした。

## 何故その動作になるのか
今は多くのアプリケーションがパネルの表示の仕組みとして Qt を採用しています。
maya, motionbuilder, nuke などなど PyQt/PySide ベースのアプリもそれにあたります。
そして、PyQt/PySide も Qt も広く普及し、大分古くから利用されている仕組みです。

それなら、、、

```
元々そういう動作を準備しているのでは・・・
```
と考えました。

Qt 内部コードは以下で参照できますが、
https://code.qt.io/cgit/
そこから QDockWidget に関しての部分を調べると以下になります。

```
https://code.qt.io/cgit/qt/qtbase.git/tree/src/widgets/widgets/qdockwidget.cpp
```
この中で `state->ctrlDrag` で分岐処理している箇所を辿ると、
`Ctrl キーを押した状態の場合には通常のウィンドウ移動の動作になる`
という記述になっています。

なんと、準備されていました。。。

## Python のサンプルコード
アプリケーション内の動作はスクリプト無しで確認できます。

もし自分で作成したウィンドウ内で Ctrl キーの組み合わせの違いを確認したい場合、例えば以下のコードで確認できます。

※from, import の仕方や変数名等はここでは重要でないためテキトウに書いています。

```Python:dockTest.py
# -*- coding: utf-8 -*-
try:
    from PySide2 import QtCore, QtWidgets
except:
    from PySide import QtCore, QtGui as QtWidgets

if __name__ == '__main__':
    app = QtWidgets.QApplication.instance()

    standalone = app is None
    if standalone:
        import sys
        app = QtWidgets.QApplication(sys.argv)

    msg = u'''
    左のパネルをドラッグし移動して下さい。
    (Ctrl を押しながらの場合はドッキングされません)
    '''

    win = QtWidgets.QMainWindow()
    win.setWindowTitle(u'Dock demo')
    win._w1 = QtWidgets.QPlainTextEdit(msg, win)
    win._w2 = QtWidgets.QDockWidget(u'QDockWidget', win)
    win.setCentralWidget(win._w1)
    win.addDockWidget(QtCore.Qt.LeftDockWidgetArea, win._w2)
    win.show()

    if standalone:
        sys.exit(app.exec_())
```
SQLでNullの値が取れなかった時の原因と対策

SQLでNLLLの値を持つデータが取れなかった時の原因と対策.md

## やりたかったこと
`Null`の値を持つデータをSQLを使って取得する

## できなかった原因
`WHERE 'カラム名' = NULL`のような指定の仕方をしていた

## できた方法
`WHERE 'カラム名' IS NULL`

NULLを指定する場合、イコールで指定するのはできないようです。

### 参考記事
- [逆引きSQL構文集](http://www.sql-reference.com/select/is_null.html)
- [SELECT 文の活用（NULL 検索）](https://www.shift-the-oracle.com/sql/is-null.html)
【データ分析】Google Charts便利機能まとめ

# 対象者
- グラフを使ってデータ分析したい
- グラフのカスタマイズ機能やフィルター機能など目一杯使いたい
- javascript 応用者

# グーグルチャートについて
グーグルチャートについては、[こちら](https://qiita.com/narumiyam/items/d6aab8aa85ab0f80fa75) の記事にまとめておりますのでご覧ください。
今回は、グーグルチャートには実はこういった便利機能がある！という紹介なので、
使い方について、こちらの記事では言及していません。
気になったものがあれば公式ドキュメントをご覧ください。

## グーグルスプレッドシートを活用したグーグルチャートの使用方法
[Google Spreadsheets](https://developers.google.com/chart/interactive/docs/spreadsheets)

>日本語訳
>
GoogleChartsとGoogleSpreadsheetsは緊密に統合されています。
GoogleチャートをGoogleスプレッドシート内に配置すると、GoogleチャートはGoogleスプレッドシートからデータを抽出できます。
このドキュメントは、両方を行う方法を示しています。
どちらの方法を選択しても、基になるスプレッドシートが変更されるたびにグラフが変更されます。

## グーグルチャートの印刷方法

[Printing PNG Charts](https://developers.google.com/chart/interactive/docs/printing)

>Google Chartsは、ブラウザから直接印刷することも、JavaScriptからprint()関数を介して印刷することもできます。チャートのPNG画像へのアクセスを提供する場合は、このgetImageURI()方法を使用できます 。

## グラフの色や3Dグラフなどのグラフカスタマイズ方法

[How to Customize Charts](https://developers.google.com/chart/interactive/docs/customizing_charts)

>チャートは通常、その視覚化に適したカスタムオプションをサポートしています。
たとえば、表グラフはsortColumnデフォルトの並べ替え列を指定するオプションをサポートし、円グラフの視覚化はcolorsスライスの色を指定できるオプションをサポートします。
各チャートのドキュメントには、サポートするオプションが記載されている必要があります。

## y軸x軸のカスタマイズ方法について

[Customizing Axes](https://developers.google.com/chart/interactive/docs/customizing_axes)

>軸を使用してグラフを作成する場合、それらのプロパティの一部をカスタマイズできます。

## グラフの線をカスタマイズする方法

[Customizing Lines](https://developers.google.com/chart/interactive/docs/lines)

>面積グラフ、線グラフ、コンボグラフなど、一部のGoogleグラフには、データポイントを結ぶ線があります。このページの手法を使用して、線の色、太さ、および破線をカスタマイズできます。

## グラフの上に要素をつける方法(オーバーレイ)

[Overlays](https://developers.google.com/chart/interactive/docs/overlays)

>オーバーレイは、Googleのチャートの上に置かれた領域です。これは通常、特定の統計を呼び出すために使用されますが、HTMLとCSSだけなので、好きなものにすることができます。
簡単な使用法には、CSSクラスを作成し、それをHTMLで参照することが含まれます。JavaScriptは必要ありません。より高度な使用法には、GoogleChartsを使用してオーバーレイの位置とコンテンツをカスタマイズすることが含まれます。

## グラフのポイントを変更する方法

[Customizing Points](https://developers.google.com/chart/interactive/docs/points)

>多くのGoogleグラフでは、データ値は正確なポイントに表示されます。折れ線グラフは、線で接続されたこれらのポイントのセットであり、散布図はポイントにすぎません。
散布図を除くすべてのグラフで、これらのポイントはデフォルトでゼロサイズになっています。pointSize オプションでサイズを制御でき、pointShape オプションで形状を制御できます。

## ツールチップのカスタマイズ方法

[Tooltips](https://developers.google.com/chart/interactive/docs/customizing_tooltip_content)

>ツールチップは、何かにカーソルを合わせるとポップアップする小さなボックスです。（ホバーカードはより一般的で、画面のどこにでも表示できます。ツールチップは、散布図のドットや棒グラフの棒など、常に何かに添付されます。）
このドキュメントでは、GoogleChartsでツールチップを作成およびカスタマイズする方法を学習します。


## フィルター機能や他のグラフと連携させて動的にする方法

[Controls and Dashboards](https://developers.google.com/chart/interactive/docs/gallery/controls)

>このページでは、複数のグラフをダッシュ​​ボードに組み合わせて、表示するデータを操作するためのコントロールをユーザーに提供する方法を説明します。

>ダッシュボードは、同じ基になるデータを共有する複数のグラフをまとめて管理するための簡単な方法です。このページで説明されているAPIを使用することで、ダッシュボードの一部であるすべてのグラフを相互に接続して調整する負担から解放されます。

## その他 ツールバー

[Toolbar](https://developers.google.com/chart/interactive/docs/gallery/toolbar)

>ツールバー要素を任意のビジュアライゼーションに追加して、ユーザーが基になるデータをCSVファイルまたはHTMLテーブルにエクスポートできるようにしたり、ビジュアライゼーションを任意のWebページまたはガジェットに埋め込むためのコードを提供したりできます。

# まとめ

グーグルチャートには、豊富なオプションと便利な機能がついていますね…。
使い方が難しいものもありますが、一度使いこなせるとデータ分析もしやすくなると思いますのでぜひ。
ログ解析者がAkkaの "!" (fire-and-forget) を使う

「！」とは、Akkaのメソッドのことで、非同期メッセージを送る。つまり、送信のみして受信をしない。

「！」は、別名  (fire-and-forget) 　という。

    25  // Sending Messages
    26  ref ! "Sender"

今回はこれを使ってみる。

Akka用のプロジェクトを作る。。
https://qiita.com/Ruo_Ando/items/d0edd76fc11153b8c41c

<pre>
$ ls
ActorHandlingSample.scala  ActorHandlingSample.scala~  build.sbt  project  target
</pre>

コードをみてみる。。。

<pre>
     1import akka.actor._
     2
     3/**
     4 * Intercepting Start/Stop of Actor
     5 */
     6class HandlingActor extends Actor {
     7  // Hooking start
     8  override def preStart() =
     9    println("pre - Start")
    10
    11  // Hooking stop
    12  override def postStop() =
    13    println("post - Stop")
    14
    15  def receive = {
    16    case s: String => println("Received! Hello " + s + " !")
    17    case _ => throw new IllegalArgumentException
    18  }
    19}
    20
    21object ActorHandlingSample extends App {
    22  val system = ActorSystem()
    23  val ref = system.actorOf(Props[HandlingActor], name = "mainActor")
    24
    25  // Sending Messages
    26  ref ! "Sender"
    27
    28  system.terminate()
    29}
</pre>

https://github.com/RuoAndo/qiita/blob/master/akka/ActorHandlingSample/ActorHandlingSample.scala

受信部

    15  def receive = {
    16    case s: String => println("Received! Hello " + s + " !")
    17    case _ => throw new IllegalArgumentException
    18  }

送信部

    22  val system = ActorSystem()
    23  val ref = system.actorOf(Props[HandlingActor], name = "mainActor")
    24
    25  // Sending Messages
    26  ref ! "Sender"

実行してみる。。。

<pre>
$ sbt run
[info] welcome to sbt 1.4.1 (Private Build Java 1.8.0_272)
[info] loading project definition from /root/qiita/akka/ActorHandlingSample/project
[info] loading settings for project actorhandlingsample from build.sbt ...
[info] set current project to actorhandlingsample (in build file:/root/qiita/akka/ActorHandlingSample/)
[info] compiling 1 Scala source to /home/root/akka/ActorHandlingSample/target/scala-2.12/classes ...
[info] running ActorHandlingSample 
pre - Start
Received! Hello Sender !
post - Stop
[success] Total time: 5 s, completed Nov 4, 2020 12:57:19 PM
</pre>
スクリーンセーバーみたいなページ作ってみた

windowsとかでよくみるスクリーンセーバーをHTMLとCSSで作ってみました。

常にブラウザの中央に回転する「Windows 10」を配置。

![sample.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661092/0ab450bb-17c6-099e-0c6e-26a4b353b7ae.gif)


## ソース

```index.html
<p>Windows 10</p>
```

```style.css
body {
  background: #000;
  position: relative;
  width: 100vw;
  height: 100vh;
  margin: 0;
  padding: 0;
}

p {
  color: #fff;
  font-size: 50px;
  display: inline-block;
  animation: spin 5s infinite linear;
  position :absolute;
  top: 50%;
  left: 50%;
}

@keyframes spin {
  from {
    transform: translate(-50%,-50%) rotateY(0deg);
    
  }

  to {
    transform: translate(-50%,-50%) rotateY(360deg);
    
  }
}
```


## 解説

htmlのテキストは好きな文字や画像などを入れてください。

CSSですが、本物のスクリーンセーバー同様、背景は黒、文字は白に設定。文字サイズなども適当な大きさに指定。
その後、position指定を使い、上下中央に文字を配置。この時、body要素をウィンドウサイズいっぱいと同等になるようwidthやheightを指定。

通常上下中央であればp要素に`transform: translate(-50%,-50%);`を指定することでピッタリど真ん中なのですが、回転するアニメーションでtransformを使うので一時保留。

最後にアニメーションの処理をするため`@keyframes`を上の通り記述。このとき上下中央にさせるために必要な`translate(-50%,-50%)`も一緒に書く。

## まとめ

予想していたよりも簡単に作成することができました。
普段アニメーションはあまり使わないので、もっといろいろ作成してみたいですね。

#### おそまつ！
~ Qiitaで毎日投稿中!! ~
[【初心者向け】HTML・CSSのちょいテク詰め合わせ](https://qiita.com/7note)
ラズパイ4(Raspberry pi OS 32bit)にpyrealsenseを入れる

メモ書きです。

#結論
これでやるのがベスト!!!
途中いろんなエラーが発生すると思うのですが、その都度修正して、書かれていることは必ず実行しましょう。
途中のtest的な物は飛ばしてもうまくいけました。
https://github.com/IntelRealSense/librealsense/blob/master/doc/installation_raspbian.md

**install protobuf**が途中でうまくいかなくて一旦無視して進んだが、~~特に問題なし。~~
下のようにバージョンを変更しましょう。
https://github.com/IntelRealSense/librealsense/issues/7341

```
git clone --depth=1 -b v3.13.0 https://github.com/google/protobuf.git
```
その後先に以下をinstall

```
sudo apt-get install autoconf autogen
sudo apt-get install libtool
```

python環境が2,3両方入っている場合には、pyrealsenseのビルド時にpathを指定するのが必須となります。

#参考




###pyrealsenseのビルド
以下のurlでラズパイ4(Raspberry pi OS 32bit)もうまくいけましたが、公式の方をお勧めします。
https://qiita.com/karaage0703/items/39040f23cbb0611c0a0e


###AttributeError: module 'pyrealsense2' has no attribute 'align'


####解決策
pathが違った。環境によってどこにパッケージが入るかはそれぞれだから、**ビルドのログを確認**する。
自分の場合は以下の通り。他の環境でもpyrealsense2ディレクトリのpathを探せばok。

```
export PYTHONPATH=:/home/pi/berryconda3/lib/python3.6/site-packages/pyrealsense2
```


###RuntimeError: No device connected

####解決策

lsusbでrealsenseが認識されていることを確認。

```
lsusb
```

ここに書いていることを試していたら、気付いたらエラーが解消されていました。
初めからこれ一本でやったほうがいいかもです。やり直してみてください。
https://github.com/IntelRealSense/librealsense/blob/master/doc/installation_raspbian.md

###その他の可能性
https://github.com/intel-isl/Open3D/issues/1990
https://github.com/IntelRealSense/librealsense/issues/5987
https://github.com/IntelRealSense/librealsense/issues/7312
https://github.com/IntelRealSense/librealsense/issues/962

###AttributeError: module 'open3d' has no attribute 'camera'
pipでopen3dがあっさり入ったと思っていたが、エラーが発生。
open3dもドキュメントにUbuntu、mac、windowsのみ対応と書かれていたから、ビルドする必要がありそう。

```
pip install open3d
```
じゃなく

```
pip install open3d-python
```

とし直したところエラーが変わった。

```
ImportError: /home/pi/berryconda3/lib/python3.6/site-packages/open3d/linux/open3d.so: wrong ELF class: ELFCLASS64
```

**You're gonna need a 64 bits OS to solve it, I solved the same issue this way a few days ago.**
ってイシューに書かれてました。え。32bit無理なの。
一文字変数(関数)の意味まとめ

競プロなどでは一文字の変数というのはあまり珍しくないものです。
ここでは、一文字変数・関数の意味を独断と偏見でまとめていきます。
全員がこれと同じルールで名前を付けているわけではないことに注意してください。
また、ここでは小文字のアルファベットのみに留めておきます。

**基本的に一文字の名前は使うべきではありません
この記事の内容は参考程度に留めておいてください**

+ ○○1、○○2のように説明している時は、数字は優先順位を表します。基本的には1を使用し、1をすでに使用していたら2を。2をすでに使用していたら3を使用します。
+ , で区切っていた場合、複数の意味があります。配列1, 整数1 などと書いてあったら配列1か整数1として使われるという意味です。



| アルファベット | 意味                            |
| -------------- | ------------------------------- |
| a              | 配列1, 整数3                    |
| b              | 配列2, 整数4                    |
| c              | 文字, 整数5                     |
| d              | 整数6                           |
| e              | エラー                          |
| f              | 関数1                           |
| g              | 関数2                           |
| h              | 高さ, 二次元配列の行の数        |
| i              | カウンタ変数1                   |
| j              | カウンタ変数2                   |
| k              | カウンタ変数3                   |
| l              | カウンタ変数4                   |
| m              | 整数2, 配列の要素数2             |
| n              | 整数1, 配列の要素数1             |
| o              |                                 |
| p              | ポインタ1                       |
| q              | ポインタ2                       |
| r              | 円の半径, ポインタ3             |
| s              | 文字列1                         |
| t              | 文字列2                         |
| u              | 文字列3                         |
| v              | vector1                         |
| w              | vector2, 幅, 二次元配列の列の数 |
| x              | x座標                           |
| y              | y座標                           |
| z              | z座標                           |

競プロでは、問題文にあわせて名前をつけることも多いです。
何か別の意味などがありましたらコメントお願いします。
Pointerでスタックを作成

#スタックの作成
連結リスト勉強の続きでスタックの作成を挑戦してみました。

```createstack.c
#include <stdio.h>
#include <stdlib.h>

//node declaration
struct node{
  int data;
  struct node *link;
};

//function declaration
void push(struct node **, int);
int pop(struct node **);
int count(struct node *);
void stack_display(struct node *);

void main(){
  //declare pointer to point to top of stack
  struct node *top;
  //declare variable to store data of node in stack
  int item;
  
  //point to empty stack
  top = NULL;
  
  //push node to stack
  push(&top,11);
  push(&top,12);
  push(&top,13);
  push(&top,14);
  push(&top,15);
  push(&top,16);
  push(&top,17);
  
  printf("Items in stack\n");

  //display stack
  stack_display(top);
  //count number of node in stack
  printf("No. of items in stack = %d\n",count(top));
  
  printf("Items extracted from stack:\n");
  //extract node from beginning of stack
  item = pop(&top);
  //display data in node
  printf("%d\n",item);
  
  //extract node from beginning of stack
  item = pop(&top);
  //display data in node
  printf("%d\n",item);
  
  //extract node from beginning of stack
  item = pop(&top);
  //display data in node
  printf("%d\n",item);
  
  printf("Items in stack\n");
  
  //display stack
  stack_display(top);
  //count number of node in stack
  printf("No. of items in stack = %d\n",count(top));
}

//append new node at the beginning of stack
void push(struct node **q, int num){
  struct node *r;

  //create new node
  r = malloc(sizeof(struct node));
  //set data of new node
  r->data = num;
  //set link of new node to point to first node pointed by top
  r->link = *q;
  //set p to point to new node
  *q = r;
}

//remove node from the beginning of stack
int pop(struct node **q){
  int num;
  struct node *temp;
  
  //initialize locator pointer
  temp = *q;
  
  //if stack is empty
  if(temp==NULL){
    printf("The stack is empty.\n");
    return;
  }else{
    //point p to next node
    *q = temp->link;
    //get data in node
    num = temp->data;
    //delete node
    free(temp);
  }
  
  return num;
  
}

//count number of nodes in stack
int count(struct node *q){
  int c=0;
  
  while(q!=NULL){
    c++;
    //go to next node
    q = q->link;
  }
  
  return c;
}

//display nodes in stack
void stack_display(struct node *q){

  while(q!=NULL){
    printf("%d\n",q->data);
    //go to next node
    q = q->link;
  }
}
```
PythonでJSONをPOSTし、PHPで受け取る

#PythonでJSONをPOSTする
```Python
import requests
json_data = {'data':'いちご'}
requests.post(url='***********************', json=json_data)
```

#JSON値をPHPで受け取るサーバ側のコード
```PHP
<?php
  $post_data = json_decode(file_get_contents('php://input'), true); //JSONを受け取る
  $data = $post_data["data"];
  define("TESTFILE","./all_data.txt");//受け取った値をtxtファイルに書き込む
  $fh = fopen(TESTFILE, "w");
  fwrite($fh,$data);
  fclose($fh);
 ?>
```

#Pythonでtxtファイルの値を受け取る
```Python
data = requests.get('***********************/all_data.txt')
print(data.text)
```